ZGlmZiAtLWdpdCBhL2FwcGxpY2F0aW9ucy9jb250ZW50L2NvbmZpZy9mb3J1bS5wcm9wZXJ0aWVzIGIvYXBwbGljYXRpb25zL2NvbnRlbnQvY29uZmlnL2ZvcnVtLnByb3BlcnRpZXMKaW5kZXggOGIwOTAzZC4uNjMwMTFhZSAxMDA2NDQKLS0tIGEvYXBwbGljYXRpb25zL2NvbnRlbnQvY29uZmlnL2ZvcnVtLnByb3BlcnRpZXMKKysrIGIvYXBwbGljYXRpb25zL2NvbnRlbnQvY29uZmlnL2ZvcnVtLnByb3BlcnRpZXMKQEAgLTEsMTkgKzEsMTkgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1kZXNjcmlwdExlbj04MA0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkZXNjcmlwdExlbj04MApkaWZmIC0tZ2l0IGEvYXBwbGljYXRpb25zL3BhcnR5L3dlYmFwcC9wYXJ0eW1nci9zdGF0aWMvcGFydHltZ3IuY3NzIGIvYXBwbGljYXRpb25zL3BhcnR5L3dlYmFwcC9wYXJ0eW1nci9zdGF0aWMvcGFydHltZ3IuY3NzCmluZGV4IGY1YjczOGQuLmRhZGQ0YWMgMTAwNjQ0Ci0tLSBhL2FwcGxpY2F0aW9ucy9wYXJ0eS93ZWJhcHAvcGFydHltZ3Ivc3RhdGljL3BhcnR5bWdyLmNzcworKysgYi9hcHBsaWNhdGlvbnMvcGFydHkvd2ViYXBwL3BhcnR5bWdyL3N0YXRpYy9wYXJ0eW1nci5jc3MKQEAgLTEsNDAgKzEsNDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyogVGhpcyBDU1MgZmlsZSBpcyB1c2VkIGZvciB0aGUgUGFydHkgTWFuYWdlciBjb21wb25lbnQuICovDQotDQotI21lY2gtcHVycG9zZS10eXBlcyAuYmFzaWMtdGFibGUgew0KLXdpZHRoOiBhdXRvOw0KLW1hcmdpbi1ib3R0b206IDFlbTsNCi19DQotDQotLnByb2ZpbGUtbGVmdCB7DQotZmxvYXQ6IGxlZnQ7DQotd2lkdGg6IDQ3JTsNCi19DQotDQotLnByb2ZpbGUtcmlnaHQgew0KLWZsb2F0OiByaWdodDsNCi13aWR0aDogNDclOw0KLX0NCi0NCi0ucHJvZmlsZS1ib3R0b20gew0KLWZsb2F0OiBsZWZ0Ow0KLXdpZHRoOiAxMDAlOw0KLX0NCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogVGhpcyBDU1MgZmlsZSBpcyB1c2VkIGZvciB0aGUgUGFydHkgTWFuYWdlciBjb21wb25lbnQuICovCisKKyNtZWNoLXB1cnBvc2UtdHlwZXMgLmJhc2ljLXRhYmxlIHsKK3dpZHRoOiBhdXRvOworbWFyZ2luLWJvdHRvbTogMWVtOworfQorCisucHJvZmlsZS1sZWZ0IHsKK2Zsb2F0OiBsZWZ0Oword2lkdGg6IDQ3JTsKK30KKworLnByb2ZpbGUtcmlnaHQgeworZmxvYXQ6IHJpZ2h0Oword2lkdGg6IDQ3JTsKK30KKworLnByb2ZpbGUtYm90dG9tIHsKK2Zsb2F0OiBsZWZ0Oword2lkdGg6IDEwMCU7Cit9CmRpZmYgLS1naXQgYS9hcHBsaWNhdGlvbnMvcHJvZHVjdC90ZW1wbGF0ZS9pbWFnZW1hbmFnZW1lbnQvU2hvd1Blb3BsZUFwcHJvdmUuZnRsIGIvYXBwbGljYXRpb25zL3Byb2R1Y3QvdGVtcGxhdGUvaW1hZ2VtYW5hZ2VtZW50L1Nob3dQZW9wbGVBcHByb3ZlLmZ0bAppbmRleCA1YmRhN2YyLi5lYzQ4YTVjIDEwMDY0NAotLS0gYS9hcHBsaWNhdGlvbnMvcHJvZHVjdC90ZW1wbGF0ZS9pbWFnZW1hbmFnZW1lbnQvU2hvd1Blb3BsZUFwcHJvdmUuZnRsCisrKyBiL2FwcGxpY2F0aW9ucy9wcm9kdWN0L3RlbXBsYXRlL2ltYWdlbWFuYWdlbWVudC9TaG93UGVvcGxlQXBwcm92ZS5mdGwKQEAgLTEsOTEgKzEsOTEgQEAKLTwjLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSI8QG9mYml6Q29udGVudFVybD4vaW1hZ2VzL2ltYWdlbWFuYWdlbWVudC9zaXp6bGUubWluLmpzPC9Ab2ZiaXpDb250ZW50VXJsPiI+PC9zY3JpcHQ+DQotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KLWpRdWVyeS5ub0NvbmZsaWN0KCk7DQotalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpew0KLSAgICBqUXVlcnkoJ2lucHV0OnJhZGlvJykuY2xpY2soZnVuY3Rpb24oKXsNCi0gICAgICAgIHZhciBlbGVtZW50VmFsID0galF1ZXJ5KHRoaXMpLnZhbCgpOw0KLSAgICAgICAgdmFyIGVsZW1lbnRMaXN0ID0gZWxlbWVudFZhbC5zcGxpdCgnX18nKTsNCi0gICAgICAgIHZhciByZXN1bHQgPSBlbGVtZW50TGlzdFswXSArICIvIiArIGVsZW1lbnRMaXN0WzFdOw0KLSAgICAgICAgalF1ZXJ5KCdpbnB1dDpyYWRpb1t2YWx1ZT0nICsgcmVzdWx0ICsgJ10nKS5hdHRyKCdjaGVja2VkJyx0cnVlKTsNCi0gICAgfSk7DQotICAgIGpRdWVyeSgnaW5wdXQ6cmFkaW9bdmFsdWVePSJJTV9BUFBST1ZFRCJdJykuZWFjaCggZnVuY3Rpb24oKSB7DQotICAgICAgICB0aGlzLmNoZWNrZWQgPSB0cnVlOw0KLSAgICB9KTsNCi19KTsNCi08L3NjcmlwdD4NCi0gICAgICAgIA0KLTx0YWJsZT4NCi0gICAgPCNpZiBwYXJ0eVJvbGVzP2hhc19jb250ZW50Pg0KLSAgICAgICAgPCNhc3NpZ24gYWx0X3JvdyA9IGZhbHNlPg0KLSAgICAgICAgPCNsaXN0IHBhcnR5Um9sZXMgYXMgcGFydHlSb2xlPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgPHRhYmxlPg0KLSAgICAgICAgICAgICAgICAgICAgPCNhc3NpZ24gdXNlckxvZ2luQXBwcm92ZXJzICA9IGRlbGVnYXRvci5maW5kQnlBbmQoIlVzZXJMb2dpbiIsU3RhdGljWyJvcmcuYXBhY2hlLm9mYml6LmJhc2UudXRpbC5VdGlsTWlzYyJdLnRvTWFwKCJwYXJ0eUlkIiwgcGFydHlSb2xlLnBhcnR5SWQpLCBudWxsLCBmYWxzZSkvPg0KLSAgICAgICAgICAgICAgICAgICAgPCNhc3NpZ24gdXNlckxvZ2luQXBwcm92ZXIgPSB1c2VyTG9naW5BcHByb3ZlcnNbMF0+DQotICAgICAgICAgICAgICAgICAgICA8I2Fzc2lnbiB1c2VyTG9naW5BbmRQYXJ0eURldGFpbHMgPSBkZWxlZ2F0b3IuZmluZE9uZSgiVXNlckxvZ2luQW5kUGFydHlEZXRhaWxzIiwgU3RhdGljWyJvcmcuYXBhY2hlLm9mYml6LmJhc2UudXRpbC5VdGlsTWlzYyJdLnRvTWFwKCJwYXJ0eUlkIiwgdXNlckxvZ2luQXBwcm92ZXIucGFydHlJZCwgInVzZXJMb2dpbklkIiwgdXNlckxvZ2luQXBwcm92ZXIudXNlckxvZ2luSWQpLCBmYWxzZSkhPg0KLSAgICAgICAgICAgICAgICAgICAgPCNpZiB1c2VyTG9naW5BbmRQYXJ0eURldGFpbHM/aGFzX2NvbnRlbnQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCNhc3NpZ24gcGFydHlDb250ZW50RGV0YWlsICA9IGRlbGVnYXRvci5maW5kQnlBbmQoIkNvbnRlbnRBcHByb3ZhbCIsU3RhdGljWyJvcmcuYXBhY2hlLm9mYml6LmJhc2UudXRpbC5VdGlsTWlzYyJdLnRvTWFwKCJyb2xlVHlwZUlkIiwgIklNQUdFQVBQUk9WRVIiLCAiYXBwcm92YWxTdGF0dXNJZCIsICJJTV9QRU5ESU5HIiwgInBhcnR5SWQiLCB1c2VyTG9naW5BbmRQYXJ0eURldGFpbHMucGFydHlJZCksIG51bGwsIGZhbHNlKS8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCNhc3NpZ24gaW1hZ2VBcHByb3ZlU2l6ZSA9IHBhcnR5Q29udGVudERldGFpbC5zaXplKCk+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCNpZiB1c2VyTG9naW5BbmRQYXJ0eURldGFpbHMudXNlckxvZ2luSWQgPT0gdXNlckxvZ2luLnVzZXJMb2dpbklkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8I2lmIHVzZXJNYXAuY2hlY2tVc2VyID09IHVzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy51c2VyTG9naW5JZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj4ke3VzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy5maXJzdE5hbWUhfSAke3VzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy5taWRkbGVOYW1lIX0gJHt1c2VyTG9naW5BbmRQYXJ0eURldGFpbHMubGFzdE5hbWUhfSAoJHtpbWFnZUFwcHJvdmVTaXplfSk8L2I+Jm5ic3A7Jm5ic3A7fCZuYnNwOyZuYnNwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCNlbHNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPjxhIGhyZWY9IjxAb2ZiaXpVcmw+SW1hZ2VBcHByb3ZlPC9Ab2ZiaXpVcmw+IiBjbGFzcz0idGV4dCI+JHt1c2VyTG9naW5BbmRQYXJ0eURldGFpbHMuZmlyc3ROYW1lIX0gJHt1c2VyTG9naW5BbmRQYXJ0eURldGFpbHMubWlkZGxlTmFtZSF9ICR7dXNlckxvZ2luQW5kUGFydHlEZXRhaWxzLmxhc3ROYW1lIX0gKCR7aW1hZ2VBcHByb3ZlU2l6ZX0pPC9hPjwvYj4mbmJzcDsmbmJzcDt8Jm5ic3A7Jm5ic3A7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LyNpZj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8I2Vsc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwjaWYgdXNlck1hcC5jaGVja1VzZXIgPT0gdXNlckxvZ2luQW5kUGFydHlEZXRhaWxzLnVzZXJMb2dpbklkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPiR7dXNlckxvZ2luQW5kUGFydHlEZXRhaWxzLmZpcnN0TmFtZSF9ICR7dXNlckxvZ2luQW5kUGFydHlEZXRhaWxzLm1pZGRsZU5hbWUhfSAke3VzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy5sYXN0TmFtZSF9ICgke2ltYWdlQXBwcm92ZVNpemV9KTwvYj4mbmJzcDsmbmJzcDt8Jm5ic3A7Jm5ic3A7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8I2Vsc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+PGEgaHJlZj0iPEBvZmJpelVybD5MaXN0UGVvcGxlQXBwcm92ZWQ/Y3JlYXRlZEJ5VXNlckxvZ2luPSR7dXNlckxvZ2luQW5kUGFydHlEZXRhaWxzLnVzZXJMb2dpbklkfTwvQG9mYml6VXJsPiIgY2xhc3M9InRleHQiPiR7dXNlckxvZ2luQW5kUGFydHlEZXRhaWxzLmZpcnN0TmFtZSF9ICR7dXNlckxvZ2luQW5kUGFydHlEZXRhaWxzLm1pZGRsZU5hbWUhfSAke3VzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy5sYXN0TmFtZSF9ICgke2ltYWdlQXBwcm92ZVNpemV9KTwvYT48L2I+Jm5ic3A7Jm5ic3A7fCZuYnNwOyZuYnNwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8jaWY+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC8jaWY+DQotICAgICAgICAgICAgICAgICAgICA8LyNpZj4NCi0gICAgICAgICAgICAgICAgPC90YWJsZT4NCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgPC8jbGlzdD4NCi0gICAgICAgIDwjaWYgdXNlck1hcC5jaGVja1VzZXIgPT0gIlJFSkVDVEVEIj4NCi0gICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgIDxkaXY+PGI+UmVqZWN0ZWQ8L2I+PC9kaXY+DQotICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgIDwjZWxzZT4NCi0gICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgIDxkaXY+PGI+PGEgaHJlZj0iPEBvZmJpelVybD5MaXN0UGVvcGxlUmVqZWN0ZWQ8L0BvZmJpelVybD4iIGNsYXNzPSJ0ZXh0Ij5SZWplY3RlZDwvYT48L2I+PC9kaXY+DQotICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgIDwvI2lmPg0KLSAgICA8LyNpZj4NCi08L3RhYmxlPg0KLTxici8+DQorPCMtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IjxAb2ZiaXpDb250ZW50VXJsPi9pbWFnZXMvaW1hZ2VtYW5hZ2VtZW50L3NpenpsZS5taW4uanM8L0BvZmJpekNvbnRlbnRVcmw+Ij48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KK2pRdWVyeS5ub0NvbmZsaWN0KCk7CitqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CisgICAgalF1ZXJ5KCdpbnB1dDpyYWRpbycpLmNsaWNrKGZ1bmN0aW9uKCl7CisgICAgICAgIHZhciBlbGVtZW50VmFsID0galF1ZXJ5KHRoaXMpLnZhbCgpOworICAgICAgICB2YXIgZWxlbWVudExpc3QgPSBlbGVtZW50VmFsLnNwbGl0KCdfXycpOworICAgICAgICB2YXIgcmVzdWx0ID0gZWxlbWVudExpc3RbMF0gKyAiLyIgKyBlbGVtZW50TGlzdFsxXTsKKyAgICAgICAgalF1ZXJ5KCdpbnB1dDpyYWRpb1t2YWx1ZT0nICsgcmVzdWx0ICsgJ10nKS5hdHRyKCdjaGVja2VkJyx0cnVlKTsKKyAgICB9KTsKKyAgICBqUXVlcnkoJ2lucHV0OnJhZGlvW3ZhbHVlXj0iSU1fQVBQUk9WRUQiXScpLmVhY2goIGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLmNoZWNrZWQgPSB0cnVlOworICAgIH0pOworfSk7Cis8L3NjcmlwdD4KKyAgICAgICAgCis8dGFibGU+CisgICAgPCNpZiBwYXJ0eVJvbGVzP2hhc19jb250ZW50PgorICAgICAgICA8I2Fzc2lnbiBhbHRfcm93ID0gZmFsc2U+CisgICAgICAgIDwjbGlzdCBwYXJ0eVJvbGVzIGFzIHBhcnR5Um9sZT4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICA8dGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwjYXNzaWduIHVzZXJMb2dpbkFwcHJvdmVycyAgPSBkZWxlZ2F0b3IuZmluZEJ5QW5kKCJVc2VyTG9naW4iLFN0YXRpY1sib3JnLmFwYWNoZS5vZmJpei5iYXNlLnV0aWwuVXRpbE1pc2MiXS50b01hcCgicGFydHlJZCIsIHBhcnR5Um9sZS5wYXJ0eUlkKSwgbnVsbCwgZmFsc2UpLz4KKyAgICAgICAgICAgICAgICAgICAgPCNhc3NpZ24gdXNlckxvZ2luQXBwcm92ZXIgPSB1c2VyTG9naW5BcHByb3ZlcnNbMF0+CisgICAgICAgICAgICAgICAgICAgIDwjYXNzaWduIHVzZXJMb2dpbkFuZFBhcnR5RGV0YWlscyA9IGRlbGVnYXRvci5maW5kT25lKCJVc2VyTG9naW5BbmRQYXJ0eURldGFpbHMiLCBTdGF0aWNbIm9yZy5hcGFjaGUub2ZiaXouYmFzZS51dGlsLlV0aWxNaXNjIl0udG9NYXAoInBhcnR5SWQiLCB1c2VyTG9naW5BcHByb3Zlci5wYXJ0eUlkLCAidXNlckxvZ2luSWQiLCB1c2VyTG9naW5BcHByb3Zlci51c2VyTG9naW5JZCksIGZhbHNlKSE+CisgICAgICAgICAgICAgICAgICAgIDwjaWYgdXNlckxvZ2luQW5kUGFydHlEZXRhaWxzP2hhc19jb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgPCNhc3NpZ24gcGFydHlDb250ZW50RGV0YWlsICA9IGRlbGVnYXRvci5maW5kQnlBbmQoIkNvbnRlbnRBcHByb3ZhbCIsU3RhdGljWyJvcmcuYXBhY2hlLm9mYml6LmJhc2UudXRpbC5VdGlsTWlzYyJdLnRvTWFwKCJyb2xlVHlwZUlkIiwgIklNQUdFQVBQUk9WRVIiLCAiYXBwcm92YWxTdGF0dXNJZCIsICJJTV9QRU5ESU5HIiwgInBhcnR5SWQiLCB1c2VyTG9naW5BbmRQYXJ0eURldGFpbHMucGFydHlJZCksIG51bGwsIGZhbHNlKS8+CisgICAgICAgICAgICAgICAgICAgICAgICA8I2Fzc2lnbiBpbWFnZUFwcHJvdmVTaXplID0gcGFydHlDb250ZW50RGV0YWlsLnNpemUoKT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwjaWYgdXNlckxvZ2luQW5kUGFydHlEZXRhaWxzLnVzZXJMb2dpbklkID09IHVzZXJMb2dpbi51c2VyTG9naW5JZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8I2lmIHVzZXJNYXAuY2hlY2tVc2VyID09IHVzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy51c2VyTG9naW5JZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj4ke3VzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy5maXJzdE5hbWUhfSAke3VzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy5taWRkbGVOYW1lIX0gJHt1c2VyTG9naW5BbmRQYXJ0eURldGFpbHMubGFzdE5hbWUhfSAoJHtpbWFnZUFwcHJvdmVTaXplfSk8L2I+Jm5ic3A7Jm5ic3A7fCZuYnNwOyZuYnNwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCNlbHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPjxhIGhyZWY9IjxAb2ZiaXpVcmw+SW1hZ2VBcHByb3ZlPC9Ab2ZiaXpVcmw+IiBjbGFzcz0idGV4dCI+JHt1c2VyTG9naW5BbmRQYXJ0eURldGFpbHMuZmlyc3ROYW1lIX0gJHt1c2VyTG9naW5BbmRQYXJ0eURldGFpbHMubWlkZGxlTmFtZSF9ICR7dXNlckxvZ2luQW5kUGFydHlEZXRhaWxzLmxhc3ROYW1lIX0gKCR7aW1hZ2VBcHByb3ZlU2l6ZX0pPC9hPjwvYj4mbmJzcDsmbmJzcDt8Jm5ic3A7Jm5ic3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LyNpZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwjZWxzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8I2lmIHVzZXJNYXAuY2hlY2tVc2VyID09IHVzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy51c2VyTG9naW5JZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj4ke3VzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy5maXJzdE5hbWUhfSAke3VzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy5taWRkbGVOYW1lIX0gJHt1c2VyTG9naW5BbmRQYXJ0eURldGFpbHMubGFzdE5hbWUhfSAoJHtpbWFnZUFwcHJvdmVTaXplfSk8L2I+Jm5ic3A7Jm5ic3A7fCZuYnNwOyZuYnNwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCNlbHNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPjxhIGhyZWY9IjxAb2ZiaXpVcmw+TGlzdFBlb3BsZUFwcHJvdmVkP2NyZWF0ZWRCeVVzZXJMb2dpbj0ke3VzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy51c2VyTG9naW5JZH08L0BvZmJpelVybD4iIGNsYXNzPSJ0ZXh0Ij4ke3VzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy5maXJzdE5hbWUhfSAke3VzZXJMb2dpbkFuZFBhcnR5RGV0YWlscy5taWRkbGVOYW1lIX0gJHt1c2VyTG9naW5BbmRQYXJ0eURldGFpbHMubGFzdE5hbWUhfSAoJHtpbWFnZUFwcHJvdmVTaXplfSk8L2E+PC9iPiZuYnNwOyZuYnNwO3wmbmJzcDsmbmJzcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvI2lmPgorICAgICAgICAgICAgICAgICAgICAgICAgPC8jaWY+CisgICAgICAgICAgICAgICAgICAgIDwvI2lmPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8LyNsaXN0PgorICAgICAgICA8I2lmIHVzZXJNYXAuY2hlY2tVc2VyID09ICJSRUpFQ1RFRCI+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgPGRpdj48Yj5SZWplY3RlZDwvYj48L2Rpdj4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwjZWxzZT4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICA8ZGl2PjxiPjxhIGhyZWY9IjxAb2ZiaXpVcmw+TGlzdFBlb3BsZVJlamVjdGVkPC9Ab2ZiaXpVcmw+IiBjbGFzcz0idGV4dCI+UmVqZWN0ZWQ8L2E+PC9iPjwvZGl2PgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC8jaWY+CisgICAgPC8jaWY+Cis8L3RhYmxlPgorPGJyLz4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9iYXNlL2NvbmZpZy9mcmVlbWFya2VySW1wb3J0cy5wcm9wZXJ0aWVzIGIvZnJhbWV3b3JrL2Jhc2UvY29uZmlnL2ZyZWVtYXJrZXJJbXBvcnRzLnByb3BlcnRpZXMKaW5kZXggZmZiNzkxMi4uZjcxM2RjOCAxMDA2NDQKLS0tIGEvZnJhbWV3b3JrL2Jhc2UvY29uZmlnL2ZyZWVtYXJrZXJJbXBvcnRzLnByb3BlcnRpZXMKKysrIGIvZnJhbWV3b3JrL2Jhc2UvY29uZmlnL2ZyZWVtYXJrZXJJbXBvcnRzLnByb3BlcnRpZXMKQEAgLTEsMjAgKzEsMjAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1odG1sVGVtcGxhdGU9b2ZiaXpob21lOi8vZnJhbWV3b3JrL2Jhc2UvY29uZmlnL0F1dG9JbXBvcnRUZW1wbGF0ZS5mdGwNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitodG1sVGVtcGxhdGU9b2ZiaXpob21lOi8vZnJhbWV3b3JrL2Jhc2UvY29uZmlnL0F1dG9JbXBvcnRUZW1wbGF0ZS5mdGwKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9iYXNlL2R0ZC9vZmJpei1wcm9wZXJ0aWVzLnhzZCBiL2ZyYW1ld29yay9iYXNlL2R0ZC9vZmJpei1wcm9wZXJ0aWVzLnhzZAppbmRleCAwMzM2M2QyLi44YzMzNDBiIDEwMDY0NAotLS0gYS9mcmFtZXdvcmsvYmFzZS9kdGQvb2ZiaXotcHJvcGVydGllcy54c2QKKysrIGIvZnJhbWV3b3JrL2Jhc2UvZHRkL29mYml6LXByb3BlcnRpZXMueHNkCkBAIC0xLDQ4ICsxLDQ4IEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotICAgIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiIC8+DQotDQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZVR5cGUiPg0KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+DQotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPg0KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6c3BhY2UiIC8+DQotICAgICAgICAgICAgPC94czpleHRlbnNpb24+DQotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotDQotICAgIDx4czplbGVtZW50IG5hbWU9InJlc291cmNlIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0icHJvcGVydHkiIC8+DQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiIHR5cGU9InZhbHVlVHlwZSIgLz4NCi0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJrZXkiIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotPC94czpzY2hlbWE+DQorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisgICAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIgLz4KKworICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZVR5cGUiPgorICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIgLz4KKyAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgorICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+CisgICAgPC94czpjb21wbGV4VHlwZT4KKworICAgIDx4czplbGVtZW50IG5hbWU9InJlc291cmNlIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0icHJvcGVydHkiIC8+CisgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKworICAgIDx4czplbGVtZW50IG5hbWU9InByb3BlcnR5Ij4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIiB0eXBlPSJ2YWx1ZVR5cGUiIC8+CisgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImtleSIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+Cis8L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9jb21tb24vdGVtcGxhdGUvSnNMYW5ndWFnZUZpbGVzTWFwcGluZy5mdGwgYi9mcmFtZXdvcmsvY29tbW9uL3RlbXBsYXRlL0pzTGFuZ3VhZ2VGaWxlc01hcHBpbmcuZnRsCmluZGV4IDcwN2Q4MDUuLmEyNTAxNDQgMTAwNjQ0Ci0tLSBhL2ZyYW1ld29yay9jb21tb24vdGVtcGxhdGUvSnNMYW5ndWFnZUZpbGVzTWFwcGluZy5mdGwKKysrIGIvZnJhbWV3b3JrL2NvbW1vbi90ZW1wbGF0ZS9Kc0xhbmd1YWdlRmlsZXNNYXBwaW5nLmZ0bApAQCAtMSwxMTIgKzEsMTEyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLTwjLS0gVXNlIHRoZSBjcmVhdGVKc0xhbmd1YWdlRmlsZU1hcHBpbmcgc2VydmljZSB0byBjcmVhdGUgb3IgdXBkYXRlIHRoZSBKc0xhbmd1YWdlRmlsZXNNYXBwaW5nLmphdmEuIFlvdSB3aWxsIHN0aWxsIG5lZWQgdG8gY29tcGlsZSB0aGVyZWFmdGVyIC0tPg0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5vZmJpei5jb21tb247DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLSAgICA8Iy0tIFRoZSBjb21tZW50IGluIFVQUEVSQ0FTRSBiZWxvdyBpcyBkeW5hbWljYWxseSBwdXQgaW4gdGhlIEpzTGFuZ3VhZ2VGaWxlc01hcHBpbmcuamF2YSBnZW5lcmF0ZWQgZmlsZSwgc28gcGxlYXNlIGtlZXAgaXQuLi4gLS0+DQotDQotcHVibGljIGZpbmFsIGNsYXNzIEpzTGFuZ3VhZ2VGaWxlc01hcHBpbmcgew0KLQ0KLSAgICAvLyBETyBOT1QgRURJVCBUSElTIEZJTEUhICBUSElTIElTIEFVVE8gR0VORVJBVEVEIEFORCBXSUxMIEdFVCBXUklUVEVOIE9WRVIgUEVSSU9ESUNBTExZIFdIRU4gVEhFIERBVEEgQ0hBTkdFDQotICAgIC8vIFJhdGhlciB1c2UgdGhlIGNyZWF0ZUpzTGFuZ3VhZ2VGaWxlTWFwcGluZyBzZXJ2aWNlIHRvIGNyZWF0ZSBvciB1cGRhdGUgaXQuIFlvdSB3aWxsIHN0aWxsIG5lZWQgdG8gY29tcGlsZSB0aGVyZWFmdGVyDQotDQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgZGF0ZWpzIHsNCi0NCi0gICAgICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9jYWxlRmlsZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0RGF0ZUpzID0gIi9pbWFnZXMvanF1ZXJ5L3BsdWdpbnMvZGF0ZWpzL2RhdGUtZW4tVVMuanMiOw0KLQ0KLSAgICAgICAgc3RhdGljIHsNCi0gICAgICAgICAgICA8I2xpc3QgZGF0ZWpzLmtleVNldCgpIGFzIGRhdGVKc0ZpbGVzPg0KLSAgICAgICAgICAgIDwjYXNzaWduIGZpbGVQYXRoID0gZGF0ZWpzLmdldChkYXRlSnNGaWxlcykgLz4NCi0gICAgICAgICAgICBsb2NhbGVGaWxlcy5wdXQoIiR7ZGF0ZUpzRmlsZXN9IiwgIiR7ZmlsZVBhdGh9Iik7DQotICAgICAgICAgICAgPC8jbGlzdD4NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVQYXRoKFN0cmluZyBsb2NhbGUpIHsNCi0gICAgICAgICAgICBpZiAoZGF0ZWpzLmxvY2FsZUZpbGVzLmNvbnRhaW5zS2V5KGxvY2FsZSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGVqcy5sb2NhbGVGaWxlcy5nZXQobG9jYWxlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGRhdGVqcy5kZWZhdWx0RGF0ZUpzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MganF1ZXJ5IHsNCi0gICAgICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9jYWxlRmlsZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0RGF0ZUpzID0gIi9pbWFnZXMvanF1ZXJ5L3VpL2kxOG4vanF1ZXJ5LnVpLmRhdGVwaWNrZXItZW4uanMiOw0KLQ0KLSAgICAgICAgc3RhdGljIHsNCi0gICAgICAgICAgICA8I2xpc3QganF1ZXJ5LmtleVNldCgpIGFzIGpxdWVyeUZpbGVzPg0KLSAgICAgICAgICAgIDwjYXNzaWduIGZpbGVQYXRoID0ganF1ZXJ5LmdldChqcXVlcnlGaWxlcykgLz4NCi0gICAgICAgICAgICBsb2NhbGVGaWxlcy5wdXQoIiR7anF1ZXJ5RmlsZXN9IiwgIiR7ZmlsZVBhdGh9Iik7DQotICAgICAgICAgICAgPC8jbGlzdD4NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVQYXRoKFN0cmluZyBsb2NhbGUpIHsNCi0gICAgICAgICAgICBpZiAoZGF0ZWpzLmxvY2FsZUZpbGVzLmNvbnRhaW5zS2V5KGxvY2FsZSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGpxdWVyeS5sb2NhbGVGaWxlcy5nZXQobG9jYWxlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGpxdWVyeS5kZWZhdWx0RGF0ZUpzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgdmFsaWRhdGlvbiB7DQotICAgICAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvY2FsZUZpbGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFZhbGlkYXRpb24gPSAiL2ltYWdlcy93ZWJhcHAvaW1hZ2VzL2pxdWVyeS9wbHVnaW5zL3ZhbGlkYXRlL2xvY2FsaXphdGlvbi9tZXNzYWdlc19lbi5qcyI7DQotDQotICAgICAgICBzdGF0aWMgew0KLSAgICAgICAgICAgIDwjbGlzdCB2YWxpZGF0aW9uLmtleVNldCgpIGFzIHZhbGlkYXRpb25GaWxlcz4NCi0gICAgICAgICAgICA8I2Fzc2lnbiBmaWxlUGF0aCA9IHZhbGlkYXRpb24uZ2V0KHZhbGlkYXRpb25GaWxlcykgLz4NCi0gICAgICAgICAgICBsb2NhbGVGaWxlcy5wdXQoIiR7dmFsaWRhdGlvbkZpbGVzfSIsICIke2ZpbGVQYXRofSIpOw0KLSAgICAgICAgICAgIDwvI2xpc3Q+DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlUGF0aChTdHJpbmcgbG9jYWxlKSB7DQotICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24ubG9jYWxlRmlsZXMuY29udGFpbnNLZXkobG9jYWxlKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvbi5sb2NhbGVGaWxlcy5nZXQobG9jYWxlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb24uZGVmYXVsdFZhbGlkYXRpb247DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBkYXRlVGltZSB7DQotICAgICAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvY2FsZUZpbGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdERhdGVUaW1lID0gIi9pbWFnZXMvd2ViYXBwL2ltYWdlcy9qcXVlcnkvdWkvaTE4bi9qcXVlcnkudWkuZGF0ZXBpY2tlci1lbi5qcyI7DQotDQotICAgICAgICBzdGF0aWMgew0KLSAgICAgICAgICAgIDwjbGlzdCBkYXRlVGltZS5rZXlTZXQoKSBhcyBkYXRlVGltZUZpbGVzPg0KLSAgICAgICAgICAgIDwjYXNzaWduIGZpbGVQYXRoID0gZGF0ZVRpbWUuZ2V0KGRhdGVUaW1lRmlsZXMpISAvPg0KLSAgICAgICAgICAgIGxvY2FsZUZpbGVzLnB1dCgiJHtkYXRlVGltZUZpbGVzfSIsICIke2ZpbGVQYXRofSIpOw0KLSAgICAgICAgICAgIDwvI2xpc3Q+DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlUGF0aChTdHJpbmcgbG9jYWxlKSB7DQotICAgICAgICAgICAgaWYgKGRhdGVUaW1lLmxvY2FsZUZpbGVzLmNvbnRhaW5zS2V5KGxvY2FsZSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGVUaW1lLmxvY2FsZUZpbGVzLmdldChsb2NhbGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZGF0ZVRpbWUuZGVmYXVsdERhdGVUaW1lOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCis8Iy0tIFVzZSB0aGUgY3JlYXRlSnNMYW5ndWFnZUZpbGVNYXBwaW5nIHNlcnZpY2UgdG8gY3JlYXRlIG9yIHVwZGF0ZSB0aGUgSnNMYW5ndWFnZUZpbGVzTWFwcGluZy5qYXZhLiBZb3Ugd2lsbCBzdGlsbCBuZWVkIHRvIGNvbXBpbGUgdGhlcmVhZnRlciAtLT4KKworcGFja2FnZSBvcmcuYXBhY2hlLm9mYml6LmNvbW1vbjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKyAgICA8Iy0tIFRoZSBjb21tZW50IGluIFVQUEVSQ0FTRSBiZWxvdyBpcyBkeW5hbWljYWxseSBwdXQgaW4gdGhlIEpzTGFuZ3VhZ2VGaWxlc01hcHBpbmcuamF2YSBnZW5lcmF0ZWQgZmlsZSwgc28gcGxlYXNlIGtlZXAgaXQuLi4gLS0+CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBKc0xhbmd1YWdlRmlsZXNNYXBwaW5nIHsKKworICAgIC8vIERPIE5PVCBFRElUIFRISVMgRklMRSEgIFRISVMgSVMgQVVUTyBHRU5FUkFURUQgQU5EIFdJTEwgR0VUIFdSSVRURU4gT1ZFUiBQRVJJT0RJQ0FMTFkgV0hFTiBUSEUgREFUQSBDSEFOR0UKKyAgICAvLyBSYXRoZXIgdXNlIHRoZSBjcmVhdGVKc0xhbmd1YWdlRmlsZU1hcHBpbmcgc2VydmljZSB0byBjcmVhdGUgb3IgdXBkYXRlIGl0LiBZb3Ugd2lsbCBzdGlsbCBuZWVkIHRvIGNvbXBpbGUgdGhlcmVhZnRlcgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBkYXRlanMgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9jYWxlRmlsZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHREYXRlSnMgPSAiL2ltYWdlcy9qcXVlcnkvcGx1Z2lucy9kYXRlanMvZGF0ZS1lbi1VUy5qcyI7CisKKyAgICAgICAgc3RhdGljIHsKKyAgICAgICAgICAgIDwjbGlzdCBkYXRlanMua2V5U2V0KCkgYXMgZGF0ZUpzRmlsZXM+CisgICAgICAgICAgICA8I2Fzc2lnbiBmaWxlUGF0aCA9IGRhdGVqcy5nZXQoZGF0ZUpzRmlsZXMpIC8+CisgICAgICAgICAgICBsb2NhbGVGaWxlcy5wdXQoIiR7ZGF0ZUpzRmlsZXN9IiwgIiR7ZmlsZVBhdGh9Iik7CisgICAgICAgICAgICA8LyNsaXN0PgorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoU3RyaW5nIGxvY2FsZSkgeworICAgICAgICAgICAgaWYgKGRhdGVqcy5sb2NhbGVGaWxlcy5jb250YWluc0tleShsb2NhbGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGVqcy5sb2NhbGVGaWxlcy5nZXQobG9jYWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkYXRlanMuZGVmYXVsdERhdGVKczsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBqcXVlcnkgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvY2FsZUZpbGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0RGF0ZUpzID0gIi9pbWFnZXMvanF1ZXJ5L3VpL2kxOG4vanF1ZXJ5LnVpLmRhdGVwaWNrZXItZW4uanMiOworCisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICA8I2xpc3QganF1ZXJ5LmtleVNldCgpIGFzIGpxdWVyeUZpbGVzPgorICAgICAgICAgICAgPCNhc3NpZ24gZmlsZVBhdGggPSBqcXVlcnkuZ2V0KGpxdWVyeUZpbGVzKSAvPgorICAgICAgICAgICAgbG9jYWxlRmlsZXMucHV0KCIke2pxdWVyeUZpbGVzfSIsICIke2ZpbGVQYXRofSIpOworICAgICAgICAgICAgPC8jbGlzdD4KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVQYXRoKFN0cmluZyBsb2NhbGUpIHsKKyAgICAgICAgICAgIGlmIChkYXRlanMubG9jYWxlRmlsZXMuY29udGFpbnNLZXkobG9jYWxlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBqcXVlcnkubG9jYWxlRmlsZXMuZ2V0KGxvY2FsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4ganF1ZXJ5LmRlZmF1bHREYXRlSnM7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgdmFsaWRhdGlvbiB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9jYWxlRmlsZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRWYWxpZGF0aW9uID0gIi9pbWFnZXMvd2ViYXBwL2ltYWdlcy9qcXVlcnkvcGx1Z2lucy92YWxpZGF0ZS9sb2NhbGl6YXRpb24vbWVzc2FnZXNfZW4uanMiOworCisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICA8I2xpc3QgdmFsaWRhdGlvbi5rZXlTZXQoKSBhcyB2YWxpZGF0aW9uRmlsZXM+CisgICAgICAgICAgICA8I2Fzc2lnbiBmaWxlUGF0aCA9IHZhbGlkYXRpb24uZ2V0KHZhbGlkYXRpb25GaWxlcykgLz4KKyAgICAgICAgICAgIGxvY2FsZUZpbGVzLnB1dCgiJHt2YWxpZGF0aW9uRmlsZXN9IiwgIiR7ZmlsZVBhdGh9Iik7CisgICAgICAgICAgICA8LyNsaXN0PgorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoU3RyaW5nIGxvY2FsZSkgeworICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24ubG9jYWxlRmlsZXMuY29udGFpbnNLZXkobG9jYWxlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uLmxvY2FsZUZpbGVzLmdldChsb2NhbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRpb24uZGVmYXVsdFZhbGlkYXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGRhdGVUaW1lIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBsb2NhbGVGaWxlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdERhdGVUaW1lID0gIi9pbWFnZXMvd2ViYXBwL2ltYWdlcy9qcXVlcnkvdWkvaTE4bi9qcXVlcnkudWkuZGF0ZXBpY2tlci1lbi5qcyI7CisKKyAgICAgICAgc3RhdGljIHsKKyAgICAgICAgICAgIDwjbGlzdCBkYXRlVGltZS5rZXlTZXQoKSBhcyBkYXRlVGltZUZpbGVzPgorICAgICAgICAgICAgPCNhc3NpZ24gZmlsZVBhdGggPSBkYXRlVGltZS5nZXQoZGF0ZVRpbWVGaWxlcykhIC8+CisgICAgICAgICAgICBsb2NhbGVGaWxlcy5wdXQoIiR7ZGF0ZVRpbWVGaWxlc30iLCAiJHtmaWxlUGF0aH0iKTsKKyAgICAgICAgICAgIDwvI2xpc3Q+CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlUGF0aChTdHJpbmcgbG9jYWxlKSB7CisgICAgICAgICAgICBpZiAoZGF0ZVRpbWUubG9jYWxlRmlsZXMuY29udGFpbnNLZXkobG9jYWxlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBkYXRlVGltZS5sb2NhbGVGaWxlcy5nZXQobG9jYWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkYXRlVGltZS5kZWZhdWx0RGF0ZVRpbWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvaW1hZ2VzL3dlYmFwcC9pbWFnZXMvanF1ZXJ5L3BsdWdpbnMvUmVhZG1vcmUuanMtbWFzdGVyL1JFQURNRS5tZCBiL2ZyYW1ld29yay9pbWFnZXMvd2ViYXBwL2ltYWdlcy9qcXVlcnkvcGx1Z2lucy9SZWFkbW9yZS5qcy1tYXN0ZXIvUkVBRE1FLm1kCmluZGV4IDY2ODMxMGQuLjEzM2M4M2QgMTAwNjQ0Ci0tLSBhL2ZyYW1ld29yay9pbWFnZXMvd2ViYXBwL2ltYWdlcy9qcXVlcnkvcGx1Z2lucy9SZWFkbW9yZS5qcy1tYXN0ZXIvUkVBRE1FLm1kCisrKyBiL2ZyYW1ld29yay9pbWFnZXMvd2ViYXBwL2ltYWdlcy9qcXVlcnkvcGx1Z2lucy9SZWFkbW9yZS5qcy1tYXN0ZXIvUkVBRE1FLm1kCkBAIC0xLDEwMCArMSwxMDAgQEAKLVJlYWRtb3JlLmpzDQotPT09PT09PT0NCi0NCi1BIHNtb290aCwgbGlnaHR3ZWlnaHQgalF1ZXJ5IHBsdWdpbiBmb3IgY29sbGFwc2luZyBhbmQgZXhwYW5kaW5nIGxvbmcgYmxvY2tzIG9mIHRleHQgd2l0aCAiUmVhZCBtb3JlIiBhbmQgIkNsb3NlIiBsaW5rcy4gDQotDQotVGhlIHJlcXVpcmVkIG1hcmt1cCBmb3IgUmVhZG1vcmUuanMgaXMgYWxzbyBleHRyZW1lbHkgbGlnaHR3ZWlnaHQgYW5kIHZlcnkgc2ltcGxlLiBObyBuZWVkIGZvciBjb21wbGljYXRlZCBzZXRzIG9mIGBkaXZgcyBvciBoYXJkY29kZWQgY2xhc3MgbmFtZXMsIGp1c3QgY2FsbCBgYC5yZWFkbW9yZSgpYGAgb24gdGhlIGVsZW1lbnQgY29udGFpbmluZyB5b3VyIGJsb2NrIG9mIHRleHQgYW5kIFJlYWRtb3JlLmpzIHRha2VzIGNhcmUgb2YgdGhlIHJlc3QuDQotDQotUmVhZG1vcmUuanMgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBqUXVlcnkgZ3JlYXRlciB0aGFuIDEuNy4wLg0KLQ0KLSMjIEV4YW1wbGUgIyMNCi0NCi0gICAgJCgnYXJ0aWNsZScpLnJlYWRtb3JlKCk7DQotICANCi1ZZXMsIGl0J3MgdGhhdCBzaW1wbGUuIFlvdSBjYW4gY2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgYW5pbWF0aW9uLCB0aGUgaGVpZ2h0IG9mIHRoZSBjb2xsYXBzZWQgYmxvY2ssIGFuZCB0aGUgb3BlbiBhbmQgY2xvc2UgZWxlbWVudHMuDQotDQotICAgICQoJ2FydGljbGUnKS5yZWFkbW9yZSh7DQotICAgICAgc3BlZWQ6IDc1LA0KLSAgICAgIG1heEhlaWdodDogNTAwDQotICAgIH0pOw0KLQ0KLSMjIFRoZSBvcHRpb25zOiAjIw0KLQ0KLSogYHNwZWVkOiAxMDBgIChpbiBtaWxsaXNlY29uZHMpDQotKiBgbWF4SGVpZ2h0OiAyMDBgICAoaW4gcGl4ZWxzKQ0KLSogYGhlaWdodE1hcmdpbjogMTZgIChpbiBwaXhlbHMsIGF2b2lkcyBjb2xsYXBzaW5nIGJsb2NrcyB0aGF0IGFyZSBvbmx5IHNsaWdodGx5IGxhcmdlciB0aGFuIGBtYXhIZWlnaHRgKQ0KLSogYG1vcmVMaW5rOiAnPGEgaHJlZj0iIyI+UmVhZCBtb3JlPC9hPidgDQotKiBgbGVzc0xpbms6ICc8YSBocmVmPSIjIj5DbG9zZTwvYT4nYA0KLSogYGVtYmVkQ1NTOiB0cnVlYCAoaW5zZXJ0IHJlcXVpcmVkIENTUyBkeW5hbWljYWxseSwgc2V0IHRoaXMgdG8gYGZhbHNlYCBpZiB5b3UgaW5jbHVkZSB0aGUgbmVjZXNzYXJ5IENTUyBpbiBhIHN0eWxlc2hlZXQpDQotKiBgc2VjdGlvbkNTUzogJ2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJTsnYCAoc2V0cyB0aGUgc3R5bGluZyBvZiB0aGUgYmxvY2tzLCBpZ25vcmVkIGlmIGBlbWJlZENTU2AgaXMgYGZhbHNlYCkNCi0qIGBzdGFydE9wZW46IGZhbHNlYCAoZG8gbm90IGltbWVkaWF0ZWx5IHRydW5jYXRlLCBzdGFydCBpbiB0aGUgZnVsbHkgb3BlbmVkIHBvc2l0aW9uKQ0KLSogYGV4cGFuZGVkQ2xhc3M6ICdyZWFkbW9yZS1qcy1leHBhbmRlZCdgIChjbGFzcyBhZGRlZCB0byBleHBhbmRlZCBibG9ja3MpDQotKiBgY29sbGFwc2VkQ2xhc3M6ICdyZWFkbW9yZS1qcy1jb2xsYXBzZWQnYCAoY2xhc3MgYWRkZWQgdG8gY29sbGFwc2VkIGJsb2NrcykNCi0qIGBiZWZvcmVUb2dnbGU6IGZ1bmN0aW9uKCkge31gIChjYWxsZWQgYWZ0ZXIgYSBtb3JlIG9yIGxlc3MgbGluayBpcyBjbGlja2VkLCBidXQgKmJlZm9yZSogdGhlIGJsb2NrIGlzIGNvbGxhcHNlZCBvciBleHBhbmRlZCkNCi0qIGBhZnRlclRvZ2dsZTogZnVuY3Rpb24oKSB7fWAgKGNhbGxlZCAqYWZ0ZXIqIHRoZSBibG9jayBpcyBjb2xsYXBzZWQgb3IgZXhwYW5kZWQpDQotDQotSWYgdGhlIGVsZW1lbnQgaGFzIGEgYG1heC1oZWlnaHRgIENTUyBwcm9wZXJ0eSwgUmVhZG1vcmUuanMgd2lsbCB1c2UgdGhhdCB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGBtYXhIZWlnaHRgIG9wdGlvbi4NCi0NCi0jIyMgVGhlIGNhbGxiYWNrczoNCi0NCi1UaGUgY2FsbGJhY2sgZnVuY3Rpb25zLCBgYmVmb3JlVG9nZ2xlKClgIGFuZCBgYWZ0ZXJUb2dnbGVgLCBib3RoIHJlY2VpdmUgdGhlIHNhbWUgYXJndW1lbnRzOiBgdHJpZ2dlcmAsIGBlbGVtZW50YCwgYW5kIGBleHBhbmRlZGAuDQotDQotKiBgdHJpZ2dlcmA6IHRoZSAiUmVhZCBtb3JlIiBvciAiQ2xvc2UiIGVsZW1lbnQgdGhhdCB3YXMgY2xpY2tlZA0KLSogYGVsZW1lbnRgOiB0aGUgYmxvY2sgdGhhdCBpcyBiZWluZyBjb2xsYXBzZWQgb3IgZXhwYW5kZWQNCi0qIGBleHBhbmRlZGA6IEJvb2xlYW47IGB0cnVlYCBtZWFucyB0aGUgYmxvY2sgaXMgZXhwYW5kZWQNCi0NCi0jIyMjIENhbGxiYWNrIGV4YW1wbGU6DQotDQotSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHlvdSBjb3VsZCB1c2UgdGhlIGBhZnRlclRvZ2dsZWAgY2FsbGJhY2sgdG8gc2Nyb2xsIGJhY2sgdG8gdGhlIHRvcCBvZiBhIGJsb2NrIHdoZW4gdGhlICJDbG9zZSIgbGluayBpcyBjbGlja2VkLg0KLQ0KLWBgYGphdmFzY3JpcHQNCi0kKCdhcnRpY2xlJykucmVhZG1vcmUoew0KLSAgYWZ0ZXJUb2dnbGU6IGZ1bmN0aW9uKHRyaWdnZXIsIGVsZW1lbnQsIGV4cGFuZGVkKSB7DQotICAgIGlmKCEgZXhwYW5kZWQpIHsgLy8gVGhlICJDbG9zZSIgbGluayB3YXMgY2xpY2tlZA0KLSAgICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKCB7IHNjcm9sbFRvcDogZWxlbWVudC5vZmZzZXQoKS50b3AgfSwge2R1cmF0aW9uOiAxMDAgfSApOw0KLSAgICB9DQotICB9DQotfSk7DQotYGBgDQotDQotIyMjIFJlY29tbWVuZGVkIENTUzoNCi0NCi1UaGUgaW50ZW50aW9uIGJlaGluZCBSZWFkbW9yZS5qcyBpcyB0byB1c2UgQ1NTIGZvciBhcyBtdWNoIGZ1bmN0aW9uYWxpdHkgYXMgcG9zc2libGUuIEluIHBhcnRpY3VsYXIsICJjb2xsYXBzaW5nIiBpcyBhY2hpZXZlZCBieSBzZXR0aW5nIGBvdmVyZmxvdzogaGlkZGVuYCBvbiB0aGUgY29udGFpbmluZyBibG9jayBhbmQgY2hhbmdpbmcgdGhlIGBoZWlnaHRgIHByb3BlcnR5Lg0KLQ0KLUJ5IGRlZmF1bHQsIFJlYWRtb3JlLmpzIGluc2VydHMgdGhlIGZvbGxvd2luZyBDU1M6DQotDQotYGBgY3NzDQotLnJlYWRtb3JlLWpzLXRvZ2dsZSwgLnJlYWRtb3JlLWpzLXNlY3Rpb24gew0KLSAgZGlzcGxheTogYmxvY2s7DQotICB3aWR0aDogMTAwJTsNCi19DQotLnJlYWRtb3JlLWpzLXNlY3Rpb24gew0KLSAgb3ZlcmZsb3c6IGhpZGRlbjsNCi19DQotYGBgDQotDQotWW91IGNhbiBvdmVycmlkZSB0aGUgdGhlIGZpcnN0IHNldCBvZiBydWxlcyB3aGVuIHlvdSBzZXQgdXAgUmVhZG1vcmUuanMgbGlrZSBzbzoNCi0NCi1gYGBqYXZhc2NyaXB0DQotJCgnYXJ0aWNsZScpLnJlYWRtb3JlKHtzZWN0aW9uQ1NTOiAnZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogNTAlOyd9KTsNCi1gYGANCi0NCi1JZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBuZWNlc3Nhcnkgc3R5bGluZyBpbiB5b3VyIHNpdGUncyBzdHlsZXNoZWV0LCB5b3UgY2FuIGRpc2FibGUgdGhlIGR5bmFtaWMgZW1iZWRkaW5nIGJ5IHBhc3NpbmcgYGVtYmVkQ1NTOiBmYWxzZWAgaW4gdGhlIG9wdGlvbnMgaGFzaC4NCi0NCi1gYGBqYXZhc2NyaXB0DQotJCgnYXJ0aWNsZScpLnJlYWRtb3JlKHtlbWJlZENTUzogZmFsc2V9KTsNCi1gYGANCi0NCi0jIyBSZW1vdmluZyBSZWFkbW9yZQ0KLQ0KLVlvdSBjYW4gcmVtb3ZlIHRoZSBSZWFkbW9yZSBmdW5jdGlvbmFsaXR5IGxpa2Ugc286DQotDQotYGBgamF2YXNjcmlwdA0KLSQoJ2FydGljbGUnKS5yZWFkbW9yZSgnZGVzdHJveScpOw0KLWBgYA0KLQ0KLU9yLCB5b3UgY2FuIGJlIG1vcmUgc3VyZ2ljYWwgYnkgc3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgZWxlbWVudDoNCi0NCi1gYGBqYXZhc2NyaXB0DQotJCgnYXJ0aWNsZTpmaXJzdCcpLnJlYWRtb3JlKCdkZXN0cm95Jyk7DQotYGBgDQorUmVhZG1vcmUuanMKKz09PT09PT09CisKK0Egc21vb3RoLCBsaWdodHdlaWdodCBqUXVlcnkgcGx1Z2luIGZvciBjb2xsYXBzaW5nIGFuZCBleHBhbmRpbmcgbG9uZyBibG9ja3Mgb2YgdGV4dCB3aXRoICJSZWFkIG1vcmUiIGFuZCAiQ2xvc2UiIGxpbmtzLiAKKworVGhlIHJlcXVpcmVkIG1hcmt1cCBmb3IgUmVhZG1vcmUuanMgaXMgYWxzbyBleHRyZW1lbHkgbGlnaHR3ZWlnaHQgYW5kIHZlcnkgc2ltcGxlLiBObyBuZWVkIGZvciBjb21wbGljYXRlZCBzZXRzIG9mIGBkaXZgcyBvciBoYXJkY29kZWQgY2xhc3MgbmFtZXMsIGp1c3QgY2FsbCBgYC5yZWFkbW9yZSgpYGAgb24gdGhlIGVsZW1lbnQgY29udGFpbmluZyB5b3VyIGJsb2NrIG9mIHRleHQgYW5kIFJlYWRtb3JlLmpzIHRha2VzIGNhcmUgb2YgdGhlIHJlc3QuCisKK1JlYWRtb3JlLmpzIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgdmVyc2lvbnMgb2YgalF1ZXJ5IGdyZWF0ZXIgdGhhbiAxLjcuMC4KKworIyMgRXhhbXBsZSAjIworCisgICAgJCgnYXJ0aWNsZScpLnJlYWRtb3JlKCk7CisgIAorWWVzLCBpdCdzIHRoYXQgc2ltcGxlLiBZb3UgY2FuIGNoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIGFuaW1hdGlvbiwgdGhlIGhlaWdodCBvZiB0aGUgY29sbGFwc2VkIGJsb2NrLCBhbmQgdGhlIG9wZW4gYW5kIGNsb3NlIGVsZW1lbnRzLgorCisgICAgJCgnYXJ0aWNsZScpLnJlYWRtb3JlKHsKKyAgICAgIHNwZWVkOiA3NSwKKyAgICAgIG1heEhlaWdodDogNTAwCisgICAgfSk7CisKKyMjIFRoZSBvcHRpb25zOiAjIworCisqIGBzcGVlZDogMTAwYCAoaW4gbWlsbGlzZWNvbmRzKQorKiBgbWF4SGVpZ2h0OiAyMDBgICAoaW4gcGl4ZWxzKQorKiBgaGVpZ2h0TWFyZ2luOiAxNmAgKGluIHBpeGVscywgYXZvaWRzIGNvbGxhcHNpbmcgYmxvY2tzIHRoYXQgYXJlIG9ubHkgc2xpZ2h0bHkgbGFyZ2VyIHRoYW4gYG1heEhlaWdodGApCisqIGBtb3JlTGluazogJzxhIGhyZWY9IiMiPlJlYWQgbW9yZTwvYT4nYAorKiBgbGVzc0xpbms6ICc8YSBocmVmPSIjIj5DbG9zZTwvYT4nYAorKiBgZW1iZWRDU1M6IHRydWVgIChpbnNlcnQgcmVxdWlyZWQgQ1NTIGR5bmFtaWNhbGx5LCBzZXQgdGhpcyB0byBgZmFsc2VgIGlmIHlvdSBpbmNsdWRlIHRoZSBuZWNlc3NhcnkgQ1NTIGluIGEgc3R5bGVzaGVldCkKKyogYHNlY3Rpb25DU1M6ICdkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7J2AgKHNldHMgdGhlIHN0eWxpbmcgb2YgdGhlIGJsb2NrcywgaWdub3JlZCBpZiBgZW1iZWRDU1NgIGlzIGBmYWxzZWApCisqIGBzdGFydE9wZW46IGZhbHNlYCAoZG8gbm90IGltbWVkaWF0ZWx5IHRydW5jYXRlLCBzdGFydCBpbiB0aGUgZnVsbHkgb3BlbmVkIHBvc2l0aW9uKQorKiBgZXhwYW5kZWRDbGFzczogJ3JlYWRtb3JlLWpzLWV4cGFuZGVkJ2AgKGNsYXNzIGFkZGVkIHRvIGV4cGFuZGVkIGJsb2NrcykKKyogYGNvbGxhcHNlZENsYXNzOiAncmVhZG1vcmUtanMtY29sbGFwc2VkJ2AgKGNsYXNzIGFkZGVkIHRvIGNvbGxhcHNlZCBibG9ja3MpCisqIGBiZWZvcmVUb2dnbGU6IGZ1bmN0aW9uKCkge31gIChjYWxsZWQgYWZ0ZXIgYSBtb3JlIG9yIGxlc3MgbGluayBpcyBjbGlja2VkLCBidXQgKmJlZm9yZSogdGhlIGJsb2NrIGlzIGNvbGxhcHNlZCBvciBleHBhbmRlZCkKKyogYGFmdGVyVG9nZ2xlOiBmdW5jdGlvbigpIHt9YCAoY2FsbGVkICphZnRlciogdGhlIGJsb2NrIGlzIGNvbGxhcHNlZCBvciBleHBhbmRlZCkKKworSWYgdGhlIGVsZW1lbnQgaGFzIGEgYG1heC1oZWlnaHRgIENTUyBwcm9wZXJ0eSwgUmVhZG1vcmUuanMgd2lsbCB1c2UgdGhhdCB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGBtYXhIZWlnaHRgIG9wdGlvbi4KKworIyMjIFRoZSBjYWxsYmFja3M6CisKK1RoZSBjYWxsYmFjayBmdW5jdGlvbnMsIGBiZWZvcmVUb2dnbGUoKWAgYW5kIGBhZnRlclRvZ2dsZWAsIGJvdGggcmVjZWl2ZSB0aGUgc2FtZSBhcmd1bWVudHM6IGB0cmlnZ2VyYCwgYGVsZW1lbnRgLCBhbmQgYGV4cGFuZGVkYC4KKworKiBgdHJpZ2dlcmA6IHRoZSAiUmVhZCBtb3JlIiBvciAiQ2xvc2UiIGVsZW1lbnQgdGhhdCB3YXMgY2xpY2tlZAorKiBgZWxlbWVudGA6IHRoZSBibG9jayB0aGF0IGlzIGJlaW5nIGNvbGxhcHNlZCBvciBleHBhbmRlZAorKiBgZXhwYW5kZWRgOiBCb29sZWFuOyBgdHJ1ZWAgbWVhbnMgdGhlIGJsb2NrIGlzIGV4cGFuZGVkCisKKyMjIyMgQ2FsbGJhY2sgZXhhbXBsZToKKworSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHlvdSBjb3VsZCB1c2UgdGhlIGBhZnRlclRvZ2dsZWAgY2FsbGJhY2sgdG8gc2Nyb2xsIGJhY2sgdG8gdGhlIHRvcCBvZiBhIGJsb2NrIHdoZW4gdGhlICJDbG9zZSIgbGluayBpcyBjbGlja2VkLgorCitgYGBqYXZhc2NyaXB0CiskKCdhcnRpY2xlJykucmVhZG1vcmUoeworICBhZnRlclRvZ2dsZTogZnVuY3Rpb24odHJpZ2dlciwgZWxlbWVudCwgZXhwYW5kZWQpIHsKKyAgICBpZighIGV4cGFuZGVkKSB7IC8vIFRoZSAiQ2xvc2UiIGxpbmsgd2FzIGNsaWNrZWQKKyAgICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKCB7IHNjcm9sbFRvcDogZWxlbWVudC5vZmZzZXQoKS50b3AgfSwge2R1cmF0aW9uOiAxMDAgfSApOworICAgIH0KKyAgfQorfSk7CitgYGAKKworIyMjIFJlY29tbWVuZGVkIENTUzoKKworVGhlIGludGVudGlvbiBiZWhpbmQgUmVhZG1vcmUuanMgaXMgdG8gdXNlIENTUyBmb3IgYXMgbXVjaCBmdW5jdGlvbmFsaXR5IGFzIHBvc3NpYmxlLiBJbiBwYXJ0aWN1bGFyLCAiY29sbGFwc2luZyIgaXMgYWNoaWV2ZWQgYnkgc2V0dGluZyBgb3ZlcmZsb3c6IGhpZGRlbmAgb24gdGhlIGNvbnRhaW5pbmcgYmxvY2sgYW5kIGNoYW5naW5nIHRoZSBgaGVpZ2h0YCBwcm9wZXJ0eS4KKworQnkgZGVmYXVsdCwgUmVhZG1vcmUuanMgaW5zZXJ0cyB0aGUgZm9sbG93aW5nIENTUzoKKworYGBgY3NzCisucmVhZG1vcmUtanMtdG9nZ2xlLCAucmVhZG1vcmUtanMtc2VjdGlvbiB7CisgIGRpc3BsYXk6IGJsb2NrOworICB3aWR0aDogMTAwJTsKK30KKy5yZWFkbW9yZS1qcy1zZWN0aW9uIHsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKK30KK2BgYAorCitZb3UgY2FuIG92ZXJyaWRlIHRoZSB0aGUgZmlyc3Qgc2V0IG9mIHJ1bGVzIHdoZW4geW91IHNldCB1cCBSZWFkbW9yZS5qcyBsaWtlIHNvOgorCitgYGBqYXZhc2NyaXB0CiskKCdhcnRpY2xlJykucmVhZG1vcmUoe3NlY3Rpb25DU1M6ICdkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiA1MCU7J30pOworYGBgCisKK0lmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIG5lY2Vzc2FyeSBzdHlsaW5nIGluIHlvdXIgc2l0ZSdzIHN0eWxlc2hlZXQsIHlvdSBjYW4gZGlzYWJsZSB0aGUgZHluYW1pYyBlbWJlZGRpbmcgYnkgcGFzc2luZyBgZW1iZWRDU1M6IGZhbHNlYCBpbiB0aGUgb3B0aW9ucyBoYXNoLgorCitgYGBqYXZhc2NyaXB0CiskKCdhcnRpY2xlJykucmVhZG1vcmUoe2VtYmVkQ1NTOiBmYWxzZX0pOworYGBgCisKKyMjIFJlbW92aW5nIFJlYWRtb3JlCisKK1lvdSBjYW4gcmVtb3ZlIHRoZSBSZWFkbW9yZSBmdW5jdGlvbmFsaXR5IGxpa2Ugc286CisKK2BgYGphdmFzY3JpcHQKKyQoJ2FydGljbGUnKS5yZWFkbW9yZSgnZGVzdHJveScpOworYGBgCisKK09yLCB5b3UgY2FuIGJlIG1vcmUgc3VyZ2ljYWwgYnkgc3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgZWxlbWVudDoKKworYGBgamF2YXNjcmlwdAorJCgnYXJ0aWNsZTpmaXJzdCcpLnJlYWRtb3JlKCdkZXN0cm95Jyk7CitgYGAKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9pbWFnZXMvd2ViYXBwL2ltYWdlcy9qcXVlcnkvcGx1Z2lucy92YWxpZGF0ZS9sb2NhbGl6YXRpb24vbWVzc2FnZXNfY2EuanMgYi9mcmFtZXdvcmsvaW1hZ2VzL3dlYmFwcC9pbWFnZXMvanF1ZXJ5L3BsdWdpbnMvdmFsaWRhdGUvbG9jYWxpemF0aW9uL21lc3NhZ2VzX2NhLmpzCmluZGV4IDljNjI0MTIuLjkwZTVmNzUgMTAwNjQ0Ci0tLSBhL2ZyYW1ld29yay9pbWFnZXMvd2ViYXBwL2ltYWdlcy9qcXVlcnkvcGx1Z2lucy92YWxpZGF0ZS9sb2NhbGl6YXRpb24vbWVzc2FnZXNfY2EuanMKKysrIGIvZnJhbWV3b3JrL2ltYWdlcy93ZWJhcHAvaW1hZ2VzL2pxdWVyeS9wbHVnaW5zL3ZhbGlkYXRlL2xvY2FsaXphdGlvbi9tZXNzYWdlc19jYS5qcwpAQCAtMSwyMyArMSwyMyBAQAotLyoNCi0gKiBUcmFuc2xhdGVkIGRlZmF1bHQgbWVzc2FnZXMgZm9yIHRoZSBqUXVlcnkgdmFsaWRhdGlvbiBwbHVnaW4uDQotICogTG9jYWxlOiBDQSAoQ2F0YWxhbjsgY2F0YWzDoCkNCi0gKi8NCi1qUXVlcnkuZXh0ZW5kKGpRdWVyeS52YWxpZGF0b3IubWVzc2FnZXMsIHsNCi0gIHJlcXVpcmVkOiAiQXF1ZXN0IGNhbXAgw6lzIG9ibGlnYXRvcmkuIiwNCi0gIHJlbW90ZTogIlNpIHVzIHBsYXUsIG9tcGxlIGFxdWVzdCBjYW1wLiIsDQotICBlbWFpbDogIlNpIHVzIHBsYXUsIGVzY3JpdSB1bmEgYWRyZcOnYSBkZSBjb3JyZXUtZSB2w6BsaWRhIiwNCi0gIHVybDogIlNpIHVzIHBsYXUsIGVzY3JpdSB1bmEgVVJMIHbDoGxpZGEuIiwNCi0gIGRhdGU6ICJTaSB1cyBwbGF1LCBlc2NyaXUgdW5hIGRhdGEgdsOgbGlkYS4iLA0KLSAgZGF0ZUlTTzogIlNpIHVzIHBsYXUsIGVzY3JpdSB1bmEgZGF0YSAoSVNPKSB2w6BsaWRhLiIsDQotICBudW1iZXI6ICJTaSB1cyBwbGF1LCBlc2NyaXUgdW4gbsO6bWVybyBlbnRlciB2w6BsaWQuIiwNCi0gIGRpZ2l0czogIlNpIHVzIHBsYXUsIGVzY3JpdSBub23DqXMgZMOtZ2l0cy4iLA0KLSAgY3JlZGl0Y2FyZDogIlNpIHVzIHBsYXUsIGVzY3JpdSB1biBuw7ptZXJvIGRlIHRhcmpldGEgdsOgbGlkLiIsDQotICBlcXVhbFRvOiAiU2kgdXMgcGxhdSwgZXNjcml1IGVsIG1hYXRlaXggdmFsb3IgZGUgbm91LiIsDQotICBhY2NlcHQ6ICJTaSB1cyBwbGF1LCBlc2NyaXUgdW4gdmFsb3IgYW1iIHVuYSBleHRlbnNpw7MgYWNjZXB0YWRhLiIsDQotICBtYXhsZW5ndGg6IGpRdWVyeS52YWxpZGF0b3IuZm9ybWF0KCJTaSB1cyBwbGF1LCBubyBlc2NyaWd1aXMgbcOpcyBkZSB7MH0gY2FyYWN0ZXJzLiIpLA0KLSAgbWlubGVuZ3RoOiBqUXVlcnkudmFsaWRhdG9yLmZvcm1hdCgiU2kgdXMgcGxhdSwgbm8gZXNjcmlndWlzIG1lbnlzIGRlIHswfSBjYXJhY3RlcnMuIiksDQotICByYW5nZWxlbmd0aDogalF1ZXJ5LnZhbGlkYXRvci5mb3JtYXQoIlNpIHVzIHBsYXUsIGVzY3JpdSB1biB2YWxvciBlbnRyZSB7MH0gaSB7MX0gY2FyYWN0ZXJzLiIpLA0KLSAgcmFuZ2U6IGpRdWVyeS52YWxpZGF0b3IuZm9ybWF0KCJTaSB1cyBwbGF1LCBlc2NyaXUgdW4gdmFsb3IgZW50cmUgezB9IGkgezF9LiIpLA0KLSAgbWF4OiBqUXVlcnkudmFsaWRhdG9yLmZvcm1hdCgiU2kgdXMgcGxhdSwgZXNjcml1IHVuIHZhbG9yIG1lbm9yIG8gaWd1YWwgYSB7MH0uIiksDQotICBtaW46IGpRdWVyeS52YWxpZGF0b3IuZm9ybWF0KCJTaSB1cyBwbGF1LCBlc2NyaXUgdW4gdmFsb3IgbWFqb3IgbyBpZ3VhbCBhIHswfS4iKQ0KKy8qCisgKiBUcmFuc2xhdGVkIGRlZmF1bHQgbWVzc2FnZXMgZm9yIHRoZSBqUXVlcnkgdmFsaWRhdGlvbiBwbHVnaW4uCisgKiBMb2NhbGU6IENBIChDYXRhbGFuOyBjYXRhbMOgKQorICovCitqUXVlcnkuZXh0ZW5kKGpRdWVyeS52YWxpZGF0b3IubWVzc2FnZXMsIHsKKyAgcmVxdWlyZWQ6ICJBcXVlc3QgY2FtcCDDqXMgb2JsaWdhdG9yaS4iLAorICByZW1vdGU6ICJTaSB1cyBwbGF1LCBvbXBsZSBhcXVlc3QgY2FtcC4iLAorICBlbWFpbDogIlNpIHVzIHBsYXUsIGVzY3JpdSB1bmEgYWRyZcOnYSBkZSBjb3JyZXUtZSB2w6BsaWRhIiwKKyAgdXJsOiAiU2kgdXMgcGxhdSwgZXNjcml1IHVuYSBVUkwgdsOgbGlkYS4iLAorICBkYXRlOiAiU2kgdXMgcGxhdSwgZXNjcml1IHVuYSBkYXRhIHbDoGxpZGEuIiwKKyAgZGF0ZUlTTzogIlNpIHVzIHBsYXUsIGVzY3JpdSB1bmEgZGF0YSAoSVNPKSB2w6BsaWRhLiIsCisgIG51bWJlcjogIlNpIHVzIHBsYXUsIGVzY3JpdSB1biBuw7ptZXJvIGVudGVyIHbDoGxpZC4iLAorICBkaWdpdHM6ICJTaSB1cyBwbGF1LCBlc2NyaXUgbm9tw6lzIGTDrWdpdHMuIiwKKyAgY3JlZGl0Y2FyZDogIlNpIHVzIHBsYXUsIGVzY3JpdSB1biBuw7ptZXJvIGRlIHRhcmpldGEgdsOgbGlkLiIsCisgIGVxdWFsVG86ICJTaSB1cyBwbGF1LCBlc2NyaXUgZWwgbWFhdGVpeCB2YWxvciBkZSBub3UuIiwKKyAgYWNjZXB0OiAiU2kgdXMgcGxhdSwgZXNjcml1IHVuIHZhbG9yIGFtYiB1bmEgZXh0ZW5zacOzIGFjY2VwdGFkYS4iLAorICBtYXhsZW5ndGg6IGpRdWVyeS52YWxpZGF0b3IuZm9ybWF0KCJTaSB1cyBwbGF1LCBubyBlc2NyaWd1aXMgbcOpcyBkZSB7MH0gY2FyYWN0ZXJzLiIpLAorICBtaW5sZW5ndGg6IGpRdWVyeS52YWxpZGF0b3IuZm9ybWF0KCJTaSB1cyBwbGF1LCBubyBlc2NyaWd1aXMgbWVueXMgZGUgezB9IGNhcmFjdGVycy4iKSwKKyAgcmFuZ2VsZW5ndGg6IGpRdWVyeS52YWxpZGF0b3IuZm9ybWF0KCJTaSB1cyBwbGF1LCBlc2NyaXUgdW4gdmFsb3IgZW50cmUgezB9IGkgezF9IGNhcmFjdGVycy4iKSwKKyAgcmFuZ2U6IGpRdWVyeS52YWxpZGF0b3IuZm9ybWF0KCJTaSB1cyBwbGF1LCBlc2NyaXUgdW4gdmFsb3IgZW50cmUgezB9IGkgezF9LiIpLAorICBtYXg6IGpRdWVyeS52YWxpZGF0b3IuZm9ybWF0KCJTaSB1cyBwbGF1LCBlc2NyaXUgdW4gdmFsb3IgbWVub3IgbyBpZ3VhbCBhIHswfS4iKSwKKyAgbWluOiBqUXVlcnkudmFsaWRhdG9yLmZvcm1hdCgiU2kgdXMgcGxhdSwgZXNjcml1IHVuIHZhbG9yIG1ham9yIG8gaWd1YWwgYSB7MH0uIikKIH0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9pbWFnZXMvd2ViYXBwL2ltYWdlcy9qcXVlcnkvcGx1Z2lucy92YWxpZGF0ZS9sb2NhbGl6YXRpb24vbWVzc2FnZXNfZW4uanMgYi9mcmFtZXdvcmsvaW1hZ2VzL3dlYmFwcC9pbWFnZXMvanF1ZXJ5L3BsdWdpbnMvdmFsaWRhdGUvbG9jYWxpemF0aW9uL21lc3NhZ2VzX2VuLmpzCmluZGV4IDIwNTM5MmEuLmQ3MGQxOGIgMTAwNjQ0Ci0tLSBhL2ZyYW1ld29yay9pbWFnZXMvd2ViYXBwL2ltYWdlcy9qcXVlcnkvcGx1Z2lucy92YWxpZGF0ZS9sb2NhbGl6YXRpb24vbWVzc2FnZXNfZW4uanMKKysrIGIvZnJhbWV3b3JrL2ltYWdlcy93ZWJhcHAvaW1hZ2VzL2pxdWVyeS9wbHVnaW5zL3ZhbGlkYXRlL2xvY2FsaXphdGlvbi9tZXNzYWdlc19lbi5qcwpAQCAtMSwyNCArMSwyNCBAQAotLyoNCi0gKiBUcmFuc2xhdGVkIGRlZmF1bHQgbWVzc2FnZXMgZm9yIHRoZSBqUXVlcnkgdmFsaWRhdGlvbiBwbHVnaW4uDQotICogTG9jYWxlOiBFTg0KLSAqLw0KLWpRdWVyeS5leHRlbmQoalF1ZXJ5LnZhbGlkYXRvci5tZXNzYWdlcywgew0KLSAgICByZXF1aXJlZDogIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIiwNCi0gICAgcmVtb3RlOiAiUGxlYXNlIGZpeCB0aGlzIGZpZWxkLiIsDQotICAgIGVtYWlsOiAiUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcy4iLA0KLSAgICB1cmw6ICJQbGVhc2UgZW50ZXIgYSB2YWxpZCBVUkwuIiwNCi0gICAgZGF0ZTogIlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGUuIiwNCi0gICAgZGF0ZUlTTzogIlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGUgKElTTykuIiwNCi0gICAgbnVtYmVyOiAiUGxlYXNlIGVudGVyIGEgdmFsaWQgbnVtYmVyLiIsDQotICAgIGRpZ2l0czogIlBsZWFzZSBlbnRlciBvbmx5IGRpZ2l0cy4iLA0KLSAgICBjcmVkaXRjYXJkOiAiUGxlYXNlIGVudGVyIGEgdmFsaWQgY3JlZGl0IGNhcmQgbnVtYmVyLiIsDQotICAgIGVxdWFsVG86ICJQbGVhc2UgZW50ZXIgdGhlIHNhbWUgdmFsdWUgYWdhaW4uIiwNCi0gICAgYWNjZXB0OiAiUGxlYXNlIGVudGVyIGEgdmFsdWUgd2l0aCBhIHZhbGlkIGV4dGVuc2lvbi4iLA0KLSAgICBtYXhsZW5ndGg6ICQudmFsaWRhdG9yLmZvcm1hdCgiUGxlYXNlIGVudGVyIG5vIG1vcmUgdGhhbiB7MH0gY2hhcmFjdGVycy4iKSwNCi0gICAgbWlubGVuZ3RoOiAkLnZhbGlkYXRvci5mb3JtYXQoIlBsZWFzZSBlbnRlciBhdCBsZWFzdCB7MH0gY2hhcmFjdGVycy4iKSwNCi0gICAgcmFuZ2VsZW5ndGg6ICQudmFsaWRhdG9yLmZvcm1hdCgiUGxlYXNlIGVudGVyIGEgdmFsdWUgYmV0d2VlbiB7MH0gYW5kIHsxfSBjaGFyYWN0ZXJzIGxvbmcuIiksDQotICAgIHJhbmdlOiAkLnZhbGlkYXRvci5mb3JtYXQoIlBsZWFzZSBlbnRlciBhIHZhbHVlIGJldHdlZW4gezB9IGFuZCB7MX0uIiksDQotICAgIG1heDogJC52YWxpZGF0b3IuZm9ybWF0KCJQbGVhc2UgZW50ZXIgYSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gezB9LiIpLA0KLSAgICBtaW46ICQudmFsaWRhdG9yLmZvcm1hdCgiUGxlYXNlIGVudGVyIGEgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHswfS4iKQ0KLX0pOw0KLQ0KKy8qCisgKiBUcmFuc2xhdGVkIGRlZmF1bHQgbWVzc2FnZXMgZm9yIHRoZSBqUXVlcnkgdmFsaWRhdGlvbiBwbHVnaW4uCisgKiBMb2NhbGU6IEVOCisgKi8KK2pRdWVyeS5leHRlbmQoalF1ZXJ5LnZhbGlkYXRvci5tZXNzYWdlcywgeworICAgIHJlcXVpcmVkOiAiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iLAorICAgIHJlbW90ZTogIlBsZWFzZSBmaXggdGhpcyBmaWVsZC4iLAorICAgIGVtYWlsOiAiUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcy4iLAorICAgIHVybDogIlBsZWFzZSBlbnRlciBhIHZhbGlkIFVSTC4iLAorICAgIGRhdGU6ICJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlLiIsCisgICAgZGF0ZUlTTzogIlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGUgKElTTykuIiwKKyAgICBudW1iZXI6ICJQbGVhc2UgZW50ZXIgYSB2YWxpZCBudW1iZXIuIiwKKyAgICBkaWdpdHM6ICJQbGVhc2UgZW50ZXIgb25seSBkaWdpdHMuIiwKKyAgICBjcmVkaXRjYXJkOiAiUGxlYXNlIGVudGVyIGEgdmFsaWQgY3JlZGl0IGNhcmQgbnVtYmVyLiIsCisgICAgZXF1YWxUbzogIlBsZWFzZSBlbnRlciB0aGUgc2FtZSB2YWx1ZSBhZ2Fpbi4iLAorICAgIGFjY2VwdDogIlBsZWFzZSBlbnRlciBhIHZhbHVlIHdpdGggYSB2YWxpZCBleHRlbnNpb24uIiwKKyAgICBtYXhsZW5ndGg6ICQudmFsaWRhdG9yLmZvcm1hdCgiUGxlYXNlIGVudGVyIG5vIG1vcmUgdGhhbiB7MH0gY2hhcmFjdGVycy4iKSwKKyAgICBtaW5sZW5ndGg6ICQudmFsaWRhdG9yLmZvcm1hdCgiUGxlYXNlIGVudGVyIGF0IGxlYXN0IHswfSBjaGFyYWN0ZXJzLiIpLAorICAgIHJhbmdlbGVuZ3RoOiAkLnZhbGlkYXRvci5mb3JtYXQoIlBsZWFzZSBlbnRlciBhIHZhbHVlIGJldHdlZW4gezB9IGFuZCB7MX0gY2hhcmFjdGVycyBsb25nLiIpLAorICAgIHJhbmdlOiAkLnZhbGlkYXRvci5mb3JtYXQoIlBsZWFzZSBlbnRlciBhIHZhbHVlIGJldHdlZW4gezB9IGFuZCB7MX0uIiksCisgICAgbWF4OiAkLnZhbGlkYXRvci5mb3JtYXQoIlBsZWFzZSBlbnRlciBhIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB7MH0uIiksCisgICAgbWluOiAkLnZhbGlkYXRvci5mb3JtYXQoIlBsZWFzZSBlbnRlciBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB7MH0uIikKK30pOworCmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvaW1hZ2VzL3dlYmFwcC9pbWFnZXMvanF1ZXJ5L3BsdWdpbnMvdmFsaWRhdGUvbG9jYWxpemF0aW9uL21lc3NhZ2VzX3NpLmpzIGIvZnJhbWV3b3JrL2ltYWdlcy93ZWJhcHAvaW1hZ2VzL2pxdWVyeS9wbHVnaW5zL3ZhbGlkYXRlL2xvY2FsaXphdGlvbi9tZXNzYWdlc19zaS5qcwppbmRleCBiOGQ4ZDdkLi4zMTcwMjJmIDEwMDY0NAotLS0gYS9mcmFtZXdvcmsvaW1hZ2VzL3dlYmFwcC9pbWFnZXMvanF1ZXJ5L3BsdWdpbnMvdmFsaWRhdGUvbG9jYWxpemF0aW9uL21lc3NhZ2VzX3NpLmpzCisrKyBiL2ZyYW1ld29yay9pbWFnZXMvd2ViYXBwL2ltYWdlcy9qcXVlcnkvcGx1Z2lucy92YWxpZGF0ZS9sb2NhbGl6YXRpb24vbWVzc2FnZXNfc2kuanMKQEAgLTEsMjMgKzEsMjMgQEAKLS8qDQotICogVHJhbnNsYXRlZCBkZWZhdWx0IG1lc3NhZ2VzIGZvciB0aGUgalF1ZXJ5IHZhbGlkYXRpb24gcGx1Z2luLg0KLSAqIExvY2FsZTogU0kgKFNsb3ZlbmlhbikNCi0gKi8NCi1qUXVlcnkuZXh0ZW5kKGpRdWVyeS52YWxpZGF0b3IubWVzc2FnZXMsIHsNCi0JcmVxdWlyZWQ6ICJUbyBwb2xqZSBqZSBvYnZlem5vLiIsDQotCXJlbW90ZTogIlZwaXMgdiB0ZW0gcG9sanUgbmkgdiBwcmF2aSBvYmxpa2kuIiwNCi0JZW1haWw6ICJQcm9zaW1vLCB2bmVzaXRlIHByYXZpIGVtYWlsIG5hc2xvdi4iLA0KLQl1cmw6ICJQcm9zaW1vLCB2bmVzaXRlIHByYXZpIFVSTC4iLA0KLQlkYXRlOiAiUHJvc2ltbywgdm5lc2l0ZSBwcmF2aSBkYXR1bS4iLA0KLQlkYXRlSVNPOiAiUHJvc2ltbywgdm5lc2l0ZSBwcmF2aSBkYXR1bSAoSVNPKS4iLA0KLQludW1iZXI6ICJQcm9zaW1vLCB2bmVzaXRlIHByYXZvIMWhdGV2aWxrby4iLA0KLQlkaWdpdHM6ICJQcm9zaW1vLCB2bmVzaXRlIHNhbW8gxaF0ZXZpbGtlLiIsDQotCWNyZWRpdGNhcmQ6ICJQcm9zaW1vLCB2bmVzaXRlIHByYXZvIMWhdGV2aWxrbyBrcmVkaXRuZSBrYXJ0aWNlLiIsDQotCWVxdWFsVG86ICJQcm9zaW1vLCBwb25vdm5vIHZuZXNpdGUgZW5ha28gdnNlYmluby4iLA0KLQlhY2NlcHQ6ICJQcm9zaW1vLCB2bmVzaXRlIHZzZWJpbm8geiBwcmF2byBrb27EjW5pY28uIiwNCi0JbWF4bGVuZ3RoOiAkLnZhbGlkYXRvci5mb3JtYXQoIlByb3NpbW8sIGRhIG5lIHZuYcWhYXRlIHZlxI0ga290IHswfSB6bmFrb3YuIiksDQotCW1pbmxlbmd0aDogJC52YWxpZGF0b3IuZm9ybWF0KCJQcm9zaW1vLCB2bmVzaXRlIHZzYWogezB9IHpuYWtvdi4iKSwNCi0JcmFuZ2VsZW5ndGg6ICQudmFsaWRhdG9yLmZvcm1hdCgiUHJvc2ltbywgdm5lc2l0ZSBvZCB7MH0gZG8gezF9IHpuYWtvdi4iKSwNCi0JcmFuZ2U6ICQudmFsaWRhdG9yLmZvcm1hdCgiUHJvc2ltbywgdm5lc2l0ZSB2cmVkbm9zdCBtZWQgezB9IGluIHsxfS4iKSwNCi0JbWF4OiAkLnZhbGlkYXRvci5mb3JtYXQoIlByb3NpbW8sIHZuZXNpdGUgdnJlZG5vc3QgbWFuasWhbyBhbGkgZW5ha28gezB9LiIpLA0KLQltaW46ICQudmFsaWRhdG9yLmZvcm1hdCgiUHJvc2ltbywgdm5lc2l0ZSB2cmVkbm9zdCB2ZcSNam8gYWxpIGVuYWtvIHswfS4iKQ0KLX0pOw0KKy8qCisgKiBUcmFuc2xhdGVkIGRlZmF1bHQgbWVzc2FnZXMgZm9yIHRoZSBqUXVlcnkgdmFsaWRhdGlvbiBwbHVnaW4uCisgKiBMb2NhbGU6IFNJIChTbG92ZW5pYW4pCisgKi8KK2pRdWVyeS5leHRlbmQoalF1ZXJ5LnZhbGlkYXRvci5tZXNzYWdlcywgeworCXJlcXVpcmVkOiAiVG8gcG9samUgamUgb2J2ZXpuby4iLAorCXJlbW90ZTogIlZwaXMgdiB0ZW0gcG9sanUgbmkgdiBwcmF2aSBvYmxpa2kuIiwKKwllbWFpbDogIlByb3NpbW8sIHZuZXNpdGUgcHJhdmkgZW1haWwgbmFzbG92LiIsCisJdXJsOiAiUHJvc2ltbywgdm5lc2l0ZSBwcmF2aSBVUkwuIiwKKwlkYXRlOiAiUHJvc2ltbywgdm5lc2l0ZSBwcmF2aSBkYXR1bS4iLAorCWRhdGVJU086ICJQcm9zaW1vLCB2bmVzaXRlIHByYXZpIGRhdHVtIChJU08pLiIsCisJbnVtYmVyOiAiUHJvc2ltbywgdm5lc2l0ZSBwcmF2byDFoXRldmlsa28uIiwKKwlkaWdpdHM6ICJQcm9zaW1vLCB2bmVzaXRlIHNhbW8gxaF0ZXZpbGtlLiIsCisJY3JlZGl0Y2FyZDogIlByb3NpbW8sIHZuZXNpdGUgcHJhdm8gxaF0ZXZpbGtvIGtyZWRpdG5lIGthcnRpY2UuIiwKKwllcXVhbFRvOiAiUHJvc2ltbywgcG9ub3ZubyB2bmVzaXRlIGVuYWtvIHZzZWJpbm8uIiwKKwlhY2NlcHQ6ICJQcm9zaW1vLCB2bmVzaXRlIHZzZWJpbm8geiBwcmF2byBrb27EjW5pY28uIiwKKwltYXhsZW5ndGg6ICQudmFsaWRhdG9yLmZvcm1hdCgiUHJvc2ltbywgZGEgbmUgdm5hxaFhdGUgdmXEjSBrb3QgezB9IHpuYWtvdi4iKSwKKwltaW5sZW5ndGg6ICQudmFsaWRhdG9yLmZvcm1hdCgiUHJvc2ltbywgdm5lc2l0ZSB2c2FqIHswfSB6bmFrb3YuIiksCisJcmFuZ2VsZW5ndGg6ICQudmFsaWRhdG9yLmZvcm1hdCgiUHJvc2ltbywgdm5lc2l0ZSBvZCB7MH0gZG8gezF9IHpuYWtvdi4iKSwKKwlyYW5nZTogJC52YWxpZGF0b3IuZm9ybWF0KCJQcm9zaW1vLCB2bmVzaXRlIHZyZWRub3N0IG1lZCB7MH0gaW4gezF9LiIpLAorCW1heDogJC52YWxpZGF0b3IuZm9ybWF0KCJQcm9zaW1vLCB2bmVzaXRlIHZyZWRub3N0IG1hbmrFoW8gYWxpIGVuYWtvIHswfS4iKSwKKwltaW46ICQudmFsaWRhdG9yLmZvcm1hdCgiUHJvc2ltbywgdm5lc2l0ZSB2cmVkbm9zdCB2ZcSNam8gYWxpIGVuYWtvIHswfS4iKQorfSk7CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvaW1hZ2VzL3dlYmFwcC9pbWFnZXMvbXlwb3J0YWwuY3NzIGIvZnJhbWV3b3JrL2ltYWdlcy93ZWJhcHAvaW1hZ2VzL215cG9ydGFsLmNzcwppbmRleCBmZjUxZDA0Li5iZDJkOTg2IDEwMDY0NAotLS0gYS9mcmFtZXdvcmsvaW1hZ2VzL3dlYmFwcC9pbWFnZXMvbXlwb3J0YWwuY3NzCisrKyBiL2ZyYW1ld29yay9pbWFnZXMvd2ViYXBwL2ltYWdlcy9teXBvcnRhbC5jc3MKQEAgLTEsNDAgKzEsNDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotaHRtbCxib2R5IHsNCi1oZWlnaHQ6MTAwJTsNCi1tYXJnaW46MDsNCi19DQotDQotI2xvYWRpbmcgew0KLWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40OTYwOTQpOw0KLXBvc2l0aW9uOiBhYnNvbHV0ZTsNCi10b3A6IDBweDsNCi1sZWZ0OiAwcHg7DQotd2lkdGg6IDEwMCU7DQotaGVpZ2h0OiAxMDAlOw0KLXotaW5kZXg6IDk5OTk7DQotfQ0KLQ0KLSNsb2FkZXJJbWcgew0KLXBvc2l0aW9uOiBhYnNvbHV0ZTsNCi10b3A6IDI1MHB4Ow0KLWxlZnQ6IDUwJTsNCi19DQotDQorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2h0bWwsYm9keSB7CitoZWlnaHQ6MTAwJTsKK21hcmdpbjowOworfQorCisjbG9hZGluZyB7CitiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDk2MDk0KTsKK3Bvc2l0aW9uOiBhYnNvbHV0ZTsKK3RvcDogMHB4OworbGVmdDogMHB4Oword2lkdGg6IDEwMCU7CitoZWlnaHQ6IDEwMCU7Cit6LWluZGV4OiA5OTk5OworfQorCisjbG9hZGVySW1nIHsKK3Bvc2l0aW9uOiBhYnNvbHV0ZTsKK3RvcDogMjUwcHg7CitsZWZ0OiA1MCU7Cit9CisKZGlmZiAtLWdpdCBhL2ZyYW1ld29yay9pbWFnZXMvd2ViYXBwL2ltYWdlcy9teXBvcnRhbC5qcyBiL2ZyYW1ld29yay9pbWFnZXMvd2ViYXBwL2ltYWdlcy9teXBvcnRhbC5qcwppbmRleCAwMTEyNjg4Li4zZDQyOGQwIDEwMDY0NAotLS0gYS9mcmFtZXdvcmsvaW1hZ2VzL3dlYmFwcC9pbWFnZXMvbXlwb3J0YWwuanMKKysrIGIvZnJhbWV3b3JrL2ltYWdlcy93ZWJhcHAvaW1hZ2VzL215cG9ydGFsLmpzCkBAIC0xLDE5MSArMSwxOTEgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLy9EcmFnICYgRHJvcCBGdW5jdGlvbnMgZm9yIG15UG9ydGFsDQotDQotLy9nbG9iYWwgVmFyIGZvciBjb250cm9sbGluZyBob3ZlciBCb3hlcw0KLSJ1c2Ugc3RyaWN0IjsNCi12YXIgU09SVEFCTEVfQ09MVU1OX0xJU1QgPSBudWxsOw0KLXZhciBJU19VUERBVEVEID0gZmFsc2U7DQotdmFyIERFU1RJTkFUSU9OX0NPTFVNTl9JRCA9IG51bGw7DQotDQotLy9pbml0IEtleUxpc3RlbmVyDQotalF1ZXJ5KGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7DQotICAgIC8vIGluaXRpYWxpeiB0aGUgZF9uX2QgalF1ZXJ5IGZ1bmN0aW9ucw0KLSAgICBqUXVlcnkoU09SVEFCTEVfQ09MVU1OX0xJU1QpLnNvcnRhYmxlKHsNCi0gICAgICAgIGNvbm5lY3RXaXRoOiAiLmNvbm5lY3RlZFNvcnRhYmxlIiwNCi0gICAgICAgIGhhbmRsZTogIi5wb3J0bGV0LWNvbmZpZywgLnNjcmVlbmxldC10aXRsZS1iYXIiLA0KLSAgICAgICAgdG9sZXJhbmNlOiAicG9pbnRlciIsDQotICAgICAgICBkcm9wT25FbXB0eTogdHJ1ZSwNCi0gICAgICAgIGN1cnNvcjogIm1vdmUiLA0KLSAgICAgICAgcmV2ZXJ0OiB0cnVlLA0KLSAgICAgICAgcGxhY2Vob2xkZXI6ICJ1aS1zdGF0ZS1oaWdobGlnaHQiLA0KLSAgICAgICAgZm9yY2VQbGFjZWhvbGRlclNpemU6IHRydWUsDQotICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgew0KLSAgICAgICAgICAgICAgICAgICAgSVNfVVBEQVRFRCA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICBERVNUSU5BVElPTl9DT0xVTU5fSUQgPSBqUXVlcnkodGhpcykuYXR0cigiaWQiKTsNCi0gICAgICAgICAgICAgICAgfSwNCi0gICAgICAgIHN0b3A6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgew0KLSAgICAgICAgICAgICAgICAgICAgcHJlcGFyZVBvcnRsZXRCYWNrZ3JvdW5kT3JkZXJDaGFuZ2UoalF1ZXJ5KFNPUlRBQkxFX0NPTFVNTl9MSVNUKS5zb3J0YWJsZSgidG9BcnJheSIsIHtjb25uZWN0ZWQ6IHRydWV9KSwgalF1ZXJ5KHVpLml0ZW0pLmF0dHIoImlkIiksIERFU1RJTkFUSU9OX0NPTFVNTl9JRCk7DQotICAgICAgICAgICAgICAgICAgICAvLyByZXNldCB0aGUgZmxhZ3MNCi0gICAgICAgICAgICAgICAgICAgIElTX1VQREFURUQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgIERFU1RJTkFUSU9OX0NPTFVNTl9JRCA9IG51bGw7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgfSk7DQotfSk7DQotDQotZnVuY3Rpb24gcHJlcGFyZVBvcnRsZXRCYWNrZ3JvdW5kT3JkZXJDaGFuZ2Uoc2VyaWFsaXplZERhdGUsIGRyYWdlZEl0ZW1JZCwgZGVzdGluYXRpb25Db2x1bW5JZCkgew0KLSAgICBpZiAoIUlTX1VQREFURUQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfSANCi0gICAgDQotICAgIC8vIHNwbGl0IHRoZSBwb3J0YWwgY29sdW1uIGlkDQotICAgIGRlc3RpbmF0aW9uQ29sdW1uSWQgPSBkZXN0aW5hdGlvbkNvbHVtbklkLnNwbGl0KCJfIilbMV07DQotICAgIA0KLSAgICAvLyBtYWtlIGNsZWFuIGFycmF5IGFuZCByZW1vdmUgYWxsIGZpZWxkcyB3aXRoIGVtcHR5IHZhbHVlcw0KLSAgICB2YXIgZGF0YUFycmF5ID0gW10NCi0gICAgalF1ZXJ5LmVhY2goc2VyaWFsaXplZERhdGUsIGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkgew0KLSAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCkgew0KLSAgICAgICAgICAgIGRhdGFBcnJheS5wdXNoKHZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgfSk7DQotDQotICAgIC8vIGZpbmQgdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgbW92ZWQgZWxlbWVudCBpbiB0aGUgYXJyYXkNCi0gICAgdmFyIGJlZm9yZUl0ZW0gPSBudWxsOw0KLSAgICB2YXIgYWZ0ZXJJdGVtID0gbnVsbDsNCi0gICAgdmFyIGN1cnJlbnRJdGVtID0gbnVsbDsNCi0gICAgDQotICAgIGpRdWVyeS5lYWNoKGRhdGFBcnJheSwgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7DQotICAgICAgICBpZiAoZHJhZ2VkSXRlbUlkID09IHZhbHVlKSB7DQotICAgICAgICAgICAgLy8gY3JlYXRlIG9iamVjdCBmb3IgdGhlIGl0ZW0gYmVmb3JlIHRoZSBjdXJyZW50IGRyb3BwZWQgb2JqZWN0IGlmIG5vdCB1bmRlZmluZWQNCi0gICAgICAgICAgICB2YXIgZGF0YUFycmF5VmFsdWUgPSBkYXRhQXJyYXlbaW5kZXgtMV07DQotICAgICAgICAgICAgaWYgKGRhdGFBcnJheVZhbHVlICE9IHVuZGVmaW5lZCkgew0KLSAgICAgICAgICAgICAgICBiZWZvcmVJdGVtID0galF1ZXJ5KCIjIiArIGRhdGFBcnJheVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gY3JlYXRlIG9iamVjdCBmb3IgdGhlIGl0ZW0gYWZ0ZXIgdGhlIGN1cnJlbnQgZHJvcHBlZCBvYmplY3QgaWYgbm90IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBkYXRhQXJyYXlWYWx1ZSA9IGRhdGFBcnJheVtpbmRleCsxXTsNCi0gICAgICAgICAgICBpZiAoZGF0YUFycmF5VmFsdWUgIT0gdW5kZWZpbmVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgYWZ0ZXJJdGVtID0galF1ZXJ5KCIjIiArIGRhdGFBcnJheVZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gY3JlYXRlIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgZHJvcHBlZCBvYmplY3QNCi0gICAgICAgICAgICBjdXJyZW50SXRlbSA9IGpRdWVyeSgiIyIgKyB2YWx1ZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gYnJlYWsgdGhlIGpRdWVyeS5lYWNoIGxvb3ANCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9IA0KLSAgICB9KTsNCi0gICAgDQotICAgIC8vIGNoZWNrIGlmIHRoZSBiZWZvcmUgb3IgYWZ0ZXIgSXRlbSBpcyBzdGlsbCBpbiB0aGUgbmV3IGNvbHVtbiB0byBnZXQgYSByZWZlcmVuY2UgT2JqZWN0IGluIHRoaXMgY29sdW1uDQotICAgIHZhciBuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbSA9IG51bGw7DQotICAgIA0KLSAgICAvLyBjaGVjayBpZiB0aGUgaXRlbSBpcyBtb3ZlZCB0byBhbm90aGVyIGNvbHVtbg0KLSAgICBpZiAoZGVzdGluYXRpb25Db2x1bW5JZCAhPSBudWxsICYmIGRlc3RpbmF0aW9uQ29sdW1uSWQgIT0gY3VycmVudEl0ZW0uYXR0cigiY29sdW1uc2VxaWQiKSApIHsNCi0gICAgICAgIC8vbW9kZSBjYW4gYmUgIkJFRk9SRSIgKGZvciBhZGRpbmcgdGhlIGl0ZW0gYmVmb3JlIHRoZSBuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbSksICJBRlRFUiIgKGZvciBhZGRpbmcgdGhlIGl0ZW0gYWZ0ZXIgdGhlIG5leHRPYmplY3RUb0Ryb3BwZWRJdGVtKSBvciAiTkVXIiAod2hlbiB0aGUgaXRlbSBpcyB0aGUgZmlyc3Qgb25lIGluIHRoZSBsaXN0IGFuZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHRvcCkNCi0gICAgICAgIHZhciBtb2RlID0gbnVsbDsNCi0gICAgICAgIGlmICgoYmVmb3JlSXRlbSA9PSBudWxsIHx8IGRlc3RpbmF0aW9uQ29sdW1uSWQgIT0gYmVmb3JlSXRlbS5hdHRyKCJjb2x1bW5zZXFpZCIpKSAmJiAoYWZ0ZXJJdGVtID09IG51bGwgfHwgZGVzdGluYXRpb25Db2x1bW5JZCAhPSBhZnRlckl0ZW0uYXR0cigiY29sdW1uc2VxaWQiKSkpIHsNCi0gICAgICAgICAgICAvLyB0aGUgbW92ZWQgb2JqZWN0IGVudGVyZWQgYW4gZW1wdHkgbGlzdA0KLSAgICAgICAgICAgIG1vZGUgPSAiTkVXIjsNCi0gICAgICAgIH0gZWxzZSBpZiAoYmVmb3JlSXRlbSAhPSBudWxsICYmIGRlc3RpbmF0aW9uQ29sdW1uSWQgPT0gYmVmb3JlSXRlbS5hdHRyKCJjb2x1bW5zZXFpZCIpKSB7DQotICAgICAgICAgICAgLy8gdGhlIG1vdmVkIG9iamVjdCBlbnRlcmVkIGluIGEgbmV3IGxpc3QgYW5kIHNob3VsZCBiZSBtb3ZlZCBhZnRlciB0aGlzIGJlZm9yZUl0ZW0NCi0gICAgICAgICAgICBuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbSA9IGJlZm9yZUl0ZW07DQotICAgICAgICAgICAgbW9kZSA9ICJBRlRFUiI7DQotICAgICAgICB9IGVsc2UgaWYgKGFmdGVySXRlbSAhPSBudWxsICYmIGRlc3RpbmF0aW9uQ29sdW1uSWQgPT0gYWZ0ZXJJdGVtLmF0dHIoImNvbHVtbnNlcWlkIikpIHsNCi0gICAgICAgICAgICAvLyB0aGUgbW92ZWQgb2JqZWN0IGVudGVyZWQgaW4gYSBuZXcgbGlzdCBhbmQgc2hvdWxkIGJlIG1vdmVkIGJlZm9yZSB0aGlzIGJlZm9yZUl0ZW0NCi0gICAgICAgICAgICBuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbSA9IGFmdGVySXRlbTsNCi0gICAgICAgICAgICBtb2RlID0gIkJFRk9SRSI7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIC8vIGlmIHRoZSBpdGVtIGlzIG1vdmVkIGluIHRoZSBzYW1lIGNvbHVtbiBnZXQgdGhlIGJlZm9yZSBhbmQvb3IgYWZ0ZXIgZWxlbWVudA0KLSAgICAgICAgaWYgKGJlZm9yZUl0ZW0uYXR0cigiaWQiKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgbW9kZSA9ICJBRlRFUiI7DQotICAgICAgICAgICAgbmV4dE9iamVjdFRvRHJvcHBlZEl0ZW0gPSBiZWZvcmVJdGVtOw0KLSAgICAgICAgfSBlbHNlIGlmIChhZnRlckl0ZW0uYXR0cigiaWQiKSAhPSBudWxsKXsNCi0gICAgICAgICAgICBtb2RlID0gIkJFRk9SRSI7DQotICAgICAgICAgICAgbmV4dE9iamVjdFRvRHJvcHBlZEl0ZW0gPSBhZnRlckl0ZW07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8vIGNhbGwgdGhlIHVwZGF0ZSBzZXJ2aWNlDQotICAgIHVwZGF0ZVBvcnRsZXRPcmRlcihjdXJyZW50SXRlbSwgbmV4dE9iamVjdFRvRHJvcHBlZEl0ZW0sIG1vZGUsIGRlc3RpbmF0aW9uQ29sdW1uSWQpOw0KLSAgICANCi0gICAgLy8gY2hhbmdlIHRoZSBodG1sIGF0dHJpYnV0ZXMgYWZ0ZXIgdGhlIG1vdmUNCi0gICAgY3VycmVudEl0ZW0uYXR0cih7ImNvbHVtbnNlcWlkIjogZGVzdGluYXRpb25Db2x1bW5JZH0pOw0KLSAgICANCi0NCi19DQotDQotZnVuY3Rpb24gdXBkYXRlUG9ydGxldE9yZGVyKGN1cnJlbnRJdGVtLCBuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbSwgbW9kZSwgZGVzdGluYXRpb25Db2x1bW4pIHsNCi0gICAgb25TdGFydFJlcXVlc3QoKTsNCi0gICAgLy8gY3JlYXRlIGEgSlNPTiByZXF1ZXN0IG9iamVjdCB3aXRoIHRoZSBuZWVkZWQgaW5mb3JtYXRpb24NCi0gICAgdmFyIHJlcXVlc3REYXRhID0gew0KLSAgICAgICAgICAgIG1vZGU6IG1vZGUsDQotICAgICAgICAgICAgZGVzdGluYXRpb25Db2x1bW46IGRlc3RpbmF0aW9uQ29sdW1uLA0KLSAgICAgICAgICAgIG9fcG9ydGFsUGFnZUlkOiBjdXJyZW50SXRlbS5hdHRyKCJwb3J0YWxwYWdlaWQiKSwNCi0gICAgICAgICAgICBvX3BvcnRhbFBvcnRsZXRJZDogY3VycmVudEl0ZW0uYXR0cigicG9ydGFscG9ydGxldGlkIiksDQotICAgICAgICAgICAgb19wb3J0bGV0U2VxSWQ6IGN1cnJlbnRJdGVtLmF0dHIoInBvcnRsZXRzZXFpZCIpLA0KLSAgICAgICAgICAgIGRfcG9ydGFsUGFnZUlkOiAobmV4dE9iamVjdFRvRHJvcHBlZEl0ZW0gIT0gbnVsbCkgPyBuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbS5hdHRyKCJwb3J0YWxwYWdlaWQiKSA6IG51bGwsDQotICAgICAgICAgICAgZF9wb3J0YWxQb3J0bGV0SWQ6IChuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbSAhPSBudWxsKSA/IG5leHRPYmplY3RUb0Ryb3BwZWRJdGVtLmF0dHIoInBvcnRhbHBvcnRsZXRpZCIpIDogbnVsbCwNCi0gICAgICAgICAgICBkX3BvcnRsZXRTZXFJZDogKG5leHRPYmplY3RUb0Ryb3BwZWRJdGVtICE9IG51bGwpID8gbmV4dE9iamVjdFRvRHJvcHBlZEl0ZW0uYXR0cigicG9ydGxldHNlcWlkIikgOiBudWxsDQotICAgIH07DQotICAgIA0KLSAgICBqUXVlcnkuYWpheCh7DQotICAgICAgICB1cmw6ICIvbXlwb3J0YWwvY29udHJvbC91cGRhdGVQb3J0YWxQYWdlUG9ydGxldFNlcUFqYXgiLA0KLSAgICAgICAgZGF0YTogcmVxdWVzdERhdGEsDQotICAgICAgICB0eXBlOiAiUE9TVCIsDQotICAgIH0pLnN1Y2Nlc3MoIGZ1bmN0aW9uKGRhdGEpeyBvbkNvbXBsZXRlUmVxdWVzdCgpOyB9KTsNCi0NCi19DQotDQotLy9yZW1vdmVzIHRoZSBsb2FkaW5nIGltYWdlDQotZnVuY3Rpb24gb25Db21wbGV0ZVJlcXVlc3QoKSB7DQotICAgIHZhciBsb2FkaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRpbmciKTsNCi0gICAgaWYobG9hZGluZyAhPSBudWxsKXsNCi0gICAgICAgIC8vSUUgRml4IChJRSB0cmVhdHMgRE9NIG9iamVjdHMgYW5kIEphdmFzY3JpcHQgb2JqZWN0cyBzZXBhcmF0ZWx5LCBhbmQgeW91IGNhbid0IGV4dGVuZCB0aGUgRE9NIG9iamVjdHMgdXNpbmcgT2JqZWN0LnByb3RvdHlwZSkNCi0gICAgICAgIGxvYWRpbmcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsb2FkaW5nKTsNCi0gICAgfQ0KLX0NCi0NCi0vL3NhZmVseSBnZXQgaGVpZ2h0IG9mIHdob2xlIGRvY3VtZW50DQotZnVuY3Rpb24gZ2V0RG9jSGVpZ2h0KCkgew0KLSAgICB2YXIgRCA9IGRvY3VtZW50Ow0KLSAgICByZXR1cm4gTWF0aC5tYXgoDQotICAgICAgICBNYXRoLm1heChELmJvZHkuc2Nyb2xsSGVpZ2h0LCBELmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQpLA0KLSAgICAgICAgTWF0aC5tYXgoRC5ib2R5Lm9mZnNldEhlaWdodCwgRC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0KSwNCi0gICAgICAgIE1hdGgubWF4KEQuYm9keS5jbGllbnRIZWlnaHQsIEQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkNCi0gICAgKTsNCi19DQotDQotLy9kaXNwbGF5cyB0aGUgbG9hZGluZyBpbWFnZQ0KLWZ1bmN0aW9uIG9uU3RhcnRSZXF1ZXN0KCkgeyAgICANCi0gICAgdmFyIHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCi0gICAgcC5zZXRBdHRyaWJ1dGUoImlkIiwgImxvYWRpbmciKTsgICAgDQotICAgIHAuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJoZWlnaHQ6ICIgKyBnZXREb2NIZWlnaHQoKSArICJweDsiICkNCi0gICAgDQotICAgIHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsNCi0gICAgaW1nLnNldEF0dHJpYnV0ZSgic3JjIiwgIi9pbWFnZXMvbG9hZGVyLmdpZiIpOw0KLSAgICBpbWcuc2V0QXR0cmlidXRlKCJpZCIsICJsb2FkZXJJbWciKTsNCi0NCi0gICAgcC5hcHBlbmRDaGlsZChpbWcpOw0KLSAgICANCi0gICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb250ZW50LW1haW4tc2VjdGlvbiIpOw0KLSAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocCk7DQotfQ0KKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL0RyYWcgJiBEcm9wIEZ1bmN0aW9ucyBmb3IgbXlQb3J0YWwKKworLy9nbG9iYWwgVmFyIGZvciBjb250cm9sbGluZyBob3ZlciBCb3hlcworInVzZSBzdHJpY3QiOwordmFyIFNPUlRBQkxFX0NPTFVNTl9MSVNUID0gbnVsbDsKK3ZhciBJU19VUERBVEVEID0gZmFsc2U7Cit2YXIgREVTVElOQVRJT05fQ09MVU1OX0lEID0gbnVsbDsKKworLy9pbml0IEtleUxpc3RlbmVyCitqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KCBmdW5jdGlvbigpIHsKKyAgICAvLyBpbml0aWFsaXogdGhlIGRfbl9kIGpRdWVyeSBmdW5jdGlvbnMKKyAgICBqUXVlcnkoU09SVEFCTEVfQ09MVU1OX0xJU1QpLnNvcnRhYmxlKHsKKyAgICAgICAgY29ubmVjdFdpdGg6ICIuY29ubmVjdGVkU29ydGFibGUiLAorICAgICAgICBoYW5kbGU6ICIucG9ydGxldC1jb25maWcsIC5zY3JlZW5sZXQtdGl0bGUtYmFyIiwKKyAgICAgICAgdG9sZXJhbmNlOiAicG9pbnRlciIsCisgICAgICAgIGRyb3BPbkVtcHR5OiB0cnVlLAorICAgICAgICBjdXJzb3I6ICJtb3ZlIiwKKyAgICAgICAgcmV2ZXJ0OiB0cnVlLAorICAgICAgICBwbGFjZWhvbGRlcjogInVpLXN0YXRlLWhpZ2hsaWdodCIsCisgICAgICAgIGZvcmNlUGxhY2Vob2xkZXJTaXplOiB0cnVlLAorICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgeworICAgICAgICAgICAgICAgICAgICBJU19VUERBVEVEID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgREVTVElOQVRJT05fQ09MVU1OX0lEID0galF1ZXJ5KHRoaXMpLmF0dHIoImlkIik7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgc3RvcDogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVQb3J0bGV0QmFja2dyb3VuZE9yZGVyQ2hhbmdlKGpRdWVyeShTT1JUQUJMRV9DT0xVTU5fTElTVCkuc29ydGFibGUoInRvQXJyYXkiLCB7Y29ubmVjdGVkOiB0cnVlfSksIGpRdWVyeSh1aS5pdGVtKS5hdHRyKCJpZCIpLCBERVNUSU5BVElPTl9DT0xVTU5fSUQpOworICAgICAgICAgICAgICAgICAgICAvLyByZXNldCB0aGUgZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgSVNfVVBEQVRFRCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBERVNUSU5BVElPTl9DT0xVTU5fSUQgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICB9KTsKK30pOworCitmdW5jdGlvbiBwcmVwYXJlUG9ydGxldEJhY2tncm91bmRPcmRlckNoYW5nZShzZXJpYWxpemVkRGF0ZSwgZHJhZ2VkSXRlbUlkLCBkZXN0aW5hdGlvbkNvbHVtbklkKSB7CisgICAgaWYgKCFJU19VUERBVEVEKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9IAorICAgIAorICAgIC8vIHNwbGl0IHRoZSBwb3J0YWwgY29sdW1uIGlkCisgICAgZGVzdGluYXRpb25Db2x1bW5JZCA9IGRlc3RpbmF0aW9uQ29sdW1uSWQuc3BsaXQoIl8iKVsxXTsKKyAgICAKKyAgICAvLyBtYWtlIGNsZWFuIGFycmF5IGFuZCByZW1vdmUgYWxsIGZpZWxkcyB3aXRoIGVtcHR5IHZhbHVlcworICAgIHZhciBkYXRhQXJyYXkgPSBbXQorICAgIGpRdWVyeS5lYWNoKHNlcmlhbGl6ZWREYXRlLCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCkgeworICAgICAgICAgICAgZGF0YUFycmF5LnB1c2godmFsdWUpOworICAgICAgICB9CisgICAgfSk7CisKKyAgICAvLyBmaW5kIHRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIG1vdmVkIGVsZW1lbnQgaW4gdGhlIGFycmF5CisgICAgdmFyIGJlZm9yZUl0ZW0gPSBudWxsOworICAgIHZhciBhZnRlckl0ZW0gPSBudWxsOworICAgIHZhciBjdXJyZW50SXRlbSA9IG51bGw7CisgICAgCisgICAgalF1ZXJ5LmVhY2goZGF0YUFycmF5LCBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHsKKyAgICAgICAgaWYgKGRyYWdlZEl0ZW1JZCA9PSB2YWx1ZSkgeworICAgICAgICAgICAgLy8gY3JlYXRlIG9iamVjdCBmb3IgdGhlIGl0ZW0gYmVmb3JlIHRoZSBjdXJyZW50IGRyb3BwZWQgb2JqZWN0IGlmIG5vdCB1bmRlZmluZWQKKyAgICAgICAgICAgIHZhciBkYXRhQXJyYXlWYWx1ZSA9IGRhdGFBcnJheVtpbmRleC0xXTsKKyAgICAgICAgICAgIGlmIChkYXRhQXJyYXlWYWx1ZSAhPSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgICAgICBiZWZvcmVJdGVtID0galF1ZXJ5KCIjIiArIGRhdGFBcnJheVZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gY3JlYXRlIG9iamVjdCBmb3IgdGhlIGl0ZW0gYWZ0ZXIgdGhlIGN1cnJlbnQgZHJvcHBlZCBvYmplY3QgaWYgbm90IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRhdGFBcnJheVZhbHVlID0gZGF0YUFycmF5W2luZGV4KzFdOworICAgICAgICAgICAgaWYgKGRhdGFBcnJheVZhbHVlICE9IHVuZGVmaW5lZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtID0galF1ZXJ5KCIjIiArIGRhdGFBcnJheVZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gY3JlYXRlIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgZHJvcHBlZCBvYmplY3QKKyAgICAgICAgICAgIGN1cnJlbnRJdGVtID0galF1ZXJ5KCIjIiArIHZhbHVlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gYnJlYWsgdGhlIGpRdWVyeS5lYWNoIGxvb3AKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSAKKyAgICB9KTsKKyAgICAKKyAgICAvLyBjaGVjayBpZiB0aGUgYmVmb3JlIG9yIGFmdGVyIEl0ZW0gaXMgc3RpbGwgaW4gdGhlIG5ldyBjb2x1bW4gdG8gZ2V0IGEgcmVmZXJlbmNlIE9iamVjdCBpbiB0aGlzIGNvbHVtbgorICAgIHZhciBuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbSA9IG51bGw7CisgICAgCisgICAgLy8gY2hlY2sgaWYgdGhlIGl0ZW0gaXMgbW92ZWQgdG8gYW5vdGhlciBjb2x1bW4KKyAgICBpZiAoZGVzdGluYXRpb25Db2x1bW5JZCAhPSBudWxsICYmIGRlc3RpbmF0aW9uQ29sdW1uSWQgIT0gY3VycmVudEl0ZW0uYXR0cigiY29sdW1uc2VxaWQiKSApIHsKKyAgICAgICAgLy9tb2RlIGNhbiBiZSAiQkVGT1JFIiAoZm9yIGFkZGluZyB0aGUgaXRlbSBiZWZvcmUgdGhlIG5leHRPYmplY3RUb0Ryb3BwZWRJdGVtKSwgIkFGVEVSIiAoZm9yIGFkZGluZyB0aGUgaXRlbSBhZnRlciB0aGUgbmV4dE9iamVjdFRvRHJvcHBlZEl0ZW0pIG9yICJORVciICh3aGVuIHRoZSBpdGVtIGlzIHRoZSBmaXJzdCBvbmUgaW4gdGhlIGxpc3QgYW5kIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgdG9wKQorICAgICAgICB2YXIgbW9kZSA9IG51bGw7CisgICAgICAgIGlmICgoYmVmb3JlSXRlbSA9PSBudWxsIHx8IGRlc3RpbmF0aW9uQ29sdW1uSWQgIT0gYmVmb3JlSXRlbS5hdHRyKCJjb2x1bW5zZXFpZCIpKSAmJiAoYWZ0ZXJJdGVtID09IG51bGwgfHwgZGVzdGluYXRpb25Db2x1bW5JZCAhPSBhZnRlckl0ZW0uYXR0cigiY29sdW1uc2VxaWQiKSkpIHsKKyAgICAgICAgICAgIC8vIHRoZSBtb3ZlZCBvYmplY3QgZW50ZXJlZCBhbiBlbXB0eSBsaXN0CisgICAgICAgICAgICBtb2RlID0gIk5FVyI7CisgICAgICAgIH0gZWxzZSBpZiAoYmVmb3JlSXRlbSAhPSBudWxsICYmIGRlc3RpbmF0aW9uQ29sdW1uSWQgPT0gYmVmb3JlSXRlbS5hdHRyKCJjb2x1bW5zZXFpZCIpKSB7CisgICAgICAgICAgICAvLyB0aGUgbW92ZWQgb2JqZWN0IGVudGVyZWQgaW4gYSBuZXcgbGlzdCBhbmQgc2hvdWxkIGJlIG1vdmVkIGFmdGVyIHRoaXMgYmVmb3JlSXRlbQorICAgICAgICAgICAgbmV4dE9iamVjdFRvRHJvcHBlZEl0ZW0gPSBiZWZvcmVJdGVtOworICAgICAgICAgICAgbW9kZSA9ICJBRlRFUiI7CisgICAgICAgIH0gZWxzZSBpZiAoYWZ0ZXJJdGVtICE9IG51bGwgJiYgZGVzdGluYXRpb25Db2x1bW5JZCA9PSBhZnRlckl0ZW0uYXR0cigiY29sdW1uc2VxaWQiKSkgeworICAgICAgICAgICAgLy8gdGhlIG1vdmVkIG9iamVjdCBlbnRlcmVkIGluIGEgbmV3IGxpc3QgYW5kIHNob3VsZCBiZSBtb3ZlZCBiZWZvcmUgdGhpcyBiZWZvcmVJdGVtCisgICAgICAgICAgICBuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbSA9IGFmdGVySXRlbTsKKyAgICAgICAgICAgIG1vZGUgPSAiQkVGT1JFIjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBpZiB0aGUgaXRlbSBpcyBtb3ZlZCBpbiB0aGUgc2FtZSBjb2x1bW4gZ2V0IHRoZSBiZWZvcmUgYW5kL29yIGFmdGVyIGVsZW1lbnQKKyAgICAgICAgaWYgKGJlZm9yZUl0ZW0uYXR0cigiaWQiKSAhPSBudWxsKSB7CisgICAgICAgICAgICBtb2RlID0gIkFGVEVSIjsKKyAgICAgICAgICAgIG5leHRPYmplY3RUb0Ryb3BwZWRJdGVtID0gYmVmb3JlSXRlbTsKKyAgICAgICAgfSBlbHNlIGlmIChhZnRlckl0ZW0uYXR0cigiaWQiKSAhPSBudWxsKXsKKyAgICAgICAgICAgIG1vZGUgPSAiQkVGT1JFIjsKKyAgICAgICAgICAgIG5leHRPYmplY3RUb0Ryb3BwZWRJdGVtID0gYWZ0ZXJJdGVtOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIGNhbGwgdGhlIHVwZGF0ZSBzZXJ2aWNlCisgICAgdXBkYXRlUG9ydGxldE9yZGVyKGN1cnJlbnRJdGVtLCBuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbSwgbW9kZSwgZGVzdGluYXRpb25Db2x1bW5JZCk7CisgICAgCisgICAgLy8gY2hhbmdlIHRoZSBodG1sIGF0dHJpYnV0ZXMgYWZ0ZXIgdGhlIG1vdmUKKyAgICBjdXJyZW50SXRlbS5hdHRyKHsiY29sdW1uc2VxaWQiOiBkZXN0aW5hdGlvbkNvbHVtbklkfSk7CisgICAgCisKK30KKworZnVuY3Rpb24gdXBkYXRlUG9ydGxldE9yZGVyKGN1cnJlbnRJdGVtLCBuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbSwgbW9kZSwgZGVzdGluYXRpb25Db2x1bW4pIHsKKyAgICBvblN0YXJ0UmVxdWVzdCgpOworICAgIC8vIGNyZWF0ZSBhIEpTT04gcmVxdWVzdCBvYmplY3Qgd2l0aCB0aGUgbmVlZGVkIGluZm9ybWF0aW9uCisgICAgdmFyIHJlcXVlc3REYXRhID0geworICAgICAgICAgICAgbW9kZTogbW9kZSwKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29sdW1uOiBkZXN0aW5hdGlvbkNvbHVtbiwKKyAgICAgICAgICAgIG9fcG9ydGFsUGFnZUlkOiBjdXJyZW50SXRlbS5hdHRyKCJwb3J0YWxwYWdlaWQiKSwKKyAgICAgICAgICAgIG9fcG9ydGFsUG9ydGxldElkOiBjdXJyZW50SXRlbS5hdHRyKCJwb3J0YWxwb3J0bGV0aWQiKSwKKyAgICAgICAgICAgIG9fcG9ydGxldFNlcUlkOiBjdXJyZW50SXRlbS5hdHRyKCJwb3J0bGV0c2VxaWQiKSwKKyAgICAgICAgICAgIGRfcG9ydGFsUGFnZUlkOiAobmV4dE9iamVjdFRvRHJvcHBlZEl0ZW0gIT0gbnVsbCkgPyBuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbS5hdHRyKCJwb3J0YWxwYWdlaWQiKSA6IG51bGwsCisgICAgICAgICAgICBkX3BvcnRhbFBvcnRsZXRJZDogKG5leHRPYmplY3RUb0Ryb3BwZWRJdGVtICE9IG51bGwpID8gbmV4dE9iamVjdFRvRHJvcHBlZEl0ZW0uYXR0cigicG9ydGFscG9ydGxldGlkIikgOiBudWxsLAorICAgICAgICAgICAgZF9wb3J0bGV0U2VxSWQ6IChuZXh0T2JqZWN0VG9Ecm9wcGVkSXRlbSAhPSBudWxsKSA/IG5leHRPYmplY3RUb0Ryb3BwZWRJdGVtLmF0dHIoInBvcnRsZXRzZXFpZCIpIDogbnVsbAorICAgIH07CisgICAgCisgICAgalF1ZXJ5LmFqYXgoeworICAgICAgICB1cmw6ICIvbXlwb3J0YWwvY29udHJvbC91cGRhdGVQb3J0YWxQYWdlUG9ydGxldFNlcUFqYXgiLAorICAgICAgICBkYXRhOiByZXF1ZXN0RGF0YSwKKyAgICAgICAgdHlwZTogIlBPU1QiLAorICAgIH0pLnN1Y2Nlc3MoIGZ1bmN0aW9uKGRhdGEpeyBvbkNvbXBsZXRlUmVxdWVzdCgpOyB9KTsKKworfQorCisvL3JlbW92ZXMgdGhlIGxvYWRpbmcgaW1hZ2UKK2Z1bmN0aW9uIG9uQ29tcGxldGVSZXF1ZXN0KCkgeworICAgIHZhciBsb2FkaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRpbmciKTsKKyAgICBpZihsb2FkaW5nICE9IG51bGwpeworICAgICAgICAvL0lFIEZpeCAoSUUgdHJlYXRzIERPTSBvYmplY3RzIGFuZCBKYXZhc2NyaXB0IG9iamVjdHMgc2VwYXJhdGVseSwgYW5kIHlvdSBjYW4ndCBleHRlbmQgdGhlIERPTSBvYmplY3RzIHVzaW5nIE9iamVjdC5wcm90b3R5cGUpCisgICAgICAgIGxvYWRpbmcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsb2FkaW5nKTsKKyAgICB9Cit9CisKKy8vc2FmZWx5IGdldCBoZWlnaHQgb2Ygd2hvbGUgZG9jdW1lbnQKK2Z1bmN0aW9uIGdldERvY0hlaWdodCgpIHsKKyAgICB2YXIgRCA9IGRvY3VtZW50OworICAgIHJldHVybiBNYXRoLm1heCgKKyAgICAgICAgTWF0aC5tYXgoRC5ib2R5LnNjcm9sbEhlaWdodCwgRC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KSwKKyAgICAgICAgTWF0aC5tYXgoRC5ib2R5Lm9mZnNldEhlaWdodCwgRC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0KSwKKyAgICAgICAgTWF0aC5tYXgoRC5ib2R5LmNsaWVudEhlaWdodCwgRC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KQorICAgICk7Cit9CisKKy8vZGlzcGxheXMgdGhlIGxvYWRpbmcgaW1hZ2UKK2Z1bmN0aW9uIG9uU3RhcnRSZXF1ZXN0KCkgeyAgICAKKyAgICB2YXIgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIHAuc2V0QXR0cmlidXRlKCJpZCIsICJsb2FkaW5nIik7ICAgIAorICAgIHAuc2V0QXR0cmlidXRlKCJzdHlsZSIsICJoZWlnaHQ6ICIgKyBnZXREb2NIZWlnaHQoKSArICJweDsiICkKKyAgICAKKyAgICB2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CisgICAgaW1nLnNldEF0dHJpYnV0ZSgic3JjIiwgIi9pbWFnZXMvbG9hZGVyLmdpZiIpOworICAgIGltZy5zZXRBdHRyaWJ1dGUoImlkIiwgImxvYWRlckltZyIpOworCisgICAgcC5hcHBlbmRDaGlsZChpbWcpOworICAgIAorICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29udGVudC1tYWluLXNlY3Rpb24iKTsKKyAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocCk7Cit9CmRpZmYgLS1naXQgYS9mcmFtZXdvcmsvd2lkZ2V0L2R0ZC93aWRnZXQtY29tbW9uLnhzZCBiL2ZyYW1ld29yay93aWRnZXQvZHRkL3dpZGdldC1jb21tb24ueHNkCmluZGV4IDgxYWY1MTAuLmYyMDI0NjMgMTAwNjQ0Ci0tLSBhL2ZyYW1ld29yay93aWRnZXQvZHRkL3dpZGdldC1jb21tb24ueHNkCisrKyBiL2ZyYW1ld29yay93aWRnZXQvZHRkL3dpZGdldC1jb21tb24ueHNkCkBAIC0xLDY5MiArMSw2OTIgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0NCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmRpdGlvblJvb3RUeXBlIj4NCi0gICAgICAgIDx4czpjaG9pY2U+DQotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJhbmQiIC8+DQotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJvciIgLz4NCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhvciIgLz4NCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im5vdCIgLz4NCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImlmLXNlcnZpY2UtcGVybWlzc2lvbiIgLz4NCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImlmLWhhcy1wZXJtaXNzaW9uIiAvPg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iaWYtZW50aXR5LXBlcm1pc3Npb24iIC8+DQotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJpZi12YWxpZGF0ZS1tZXRob2QiIC8+DQotICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJpZi1jb21wYXJlIiAvPg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iaWYtY29tcGFyZS1maWVsZCIgLz4NCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImlmLXJlZ2V4cCIgLz4NCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImlmLWVtcHR5IiAvPg0KLSAgICAgICAgPC94czpjaG9pY2U+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDx4czplbGVtZW50IG5hbWU9IkFsbENvbmRpdGlvbmFscyIgYWJzdHJhY3Q9InRydWUiIC8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImFuZCIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJBbGxDb25kaXRpb25hbHMiIC8+DQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG9yIiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQ29uZGl0aW9uYWxzIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkFsbENvbmRpdGlvbmFscyIgLz4NCi0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJvciIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJBbGxDb25kaXRpb25hbHMiIC8+DQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ibm90IiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQ29uZGl0aW9uYWxzIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iQWxsQ29uZGl0aW9uYWxzIiAvPg0KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImlmLXNlcnZpY2UtcGVybWlzc2lvbiIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InNlcnZpY2UtbmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0icmVzb3VyY2UtZGVzY3JpcHRpb24iIHVzZT0ib3B0aW9uYWwiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImNvbnRleHQtbWFwIiB1c2U9Im9wdGlvbmFsIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWFpbi1hY3Rpb24iIHVzZT0ib3B0aW9uYWwiPg0KLSAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDUkVBVEUiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVUERBVEUiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUxFVEUiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJWSUVXIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpZi1oYXMtcGVybWlzc2lvbiIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InBlcm1pc3Npb24iIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImFjdGlvbiIgLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaWYtZW50aXR5LXBlcm1pc3Npb24iIHN1YnN0aXR1dGlvbkdyb3VwPSJBbGxDb25kaXRpb25hbHMiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIHJlZj0icGVybWlzc2lvbi1jb25kaXRpb24tZ2V0dGVyIiAvPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgcmVmPSJyZWxhdGVkLXJvbGUtZ2V0dGVyIiAvPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgcmVmPSJhdXhpbGlhcnktdmFsdWUtZ2V0dGVyIiAvPg0KLSAgICAgICAgICAgIDwveHM6Y2hvaWNlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJlbnRpdHktbmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZW50aXR5LWlkIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgPHhzOmFubm90YXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5DYW4gaGF2ZSBtdWx0aXBsZSBwaXBlIHNlcGFyYXRlZCB2YWx1ZXMsIGJ1dCBkb24ndCB1c2Ugc3BhY2VzLjwveHM6ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ0YXJnZXQtb3BlcmF0aW9uIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgPHhzOmFubm90YXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5DYW4gaGF2ZSBtdWx0aXBsZSBwaXBlIHNlcGFyYXRlZCB2YWx1ZXMsIGJ1dCBkb24ndCB1c2Ugc3BhY2VzLjwveHM6ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGlzcGxheS1mYWlsLWNvbmQiIGRlZmF1bHQ9ImZhbHNlIj4NCi0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJwZXJtaXNzaW9uLWNvbmRpdGlvbi1nZXR0ZXIiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJlbnRpdHktbmFtZSIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ib3BlcmF0aW9uLWZpZWxkLW5hbWUiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InJvbGUtZmllbGQtbmFtZSIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iYXV4aWxpYXJ5LWZpZWxkLW5hbWUiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InN0YXR1cy1maWVsZC1uYW1lIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJwcml2aWxlZ2UtZmllbGQtbmFtZSIgLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0icmVsYXRlZC1yb2xlLWdldHRlciI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImVudGl0eS1uYW1lIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJyb2xlLWVudGl0eS1uYW1lIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJyb2xlLXR5cGUtZmllbGQtbmFtZSIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0icGFydHktZmllbGQtbmFtZSIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ib3duZXItZW50aXR5LWZpZWxkLW5hbWUiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImVudGl0eS1pZC1uYW1lIiAvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhdXhpbGlhcnktdmFsdWUtZ2V0dGVyIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZW50aXR5LW5hbWUiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImF1eGlsaWFyeS1maWVsZC1uYW1lIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJlbnRpdHktaWQtbmFtZSIgLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaWYtdmFsaWRhdGUtbWV0aG9kIiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQ29uZGl0aW9uYWxzIj4NCi0gICAgICAgIDx4czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkNhbGxzIGEgc3RhdGljIEphdmEgbWV0aG9kIHRoYXQgdGFrZXMgYSBTdHJpbmcgYW5kIHJldHVybnMgYSBib29sZWFuLjwveHM6ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZmllbGQiIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9Im1ldGhvZCIgdXNlPSJyZXF1aXJlZCIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iY2xhc3MiIGRlZmF1bHQ9Im9yZy5hcGFjaGUub2ZiaXouYmFzZS51dGlsLlV0aWxWYWxpZGF0ZSIgLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaWYtY29tcGFyZSIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaWVsZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsZXNzIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZ3JlYXRlciIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imxlc3MtZXF1YWxzIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZ3JlYXRlci1lcXVhbHMiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJlcXVhbHMiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub3QtZXF1YWxzIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY29udGFpbnMiIC8+DQotICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgZGVmYXVsdD0iU3RyaW5nIj4NCi0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhaW5TdHJpbmciIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJpbmciIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCaWdEZWNpbWFsIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvYXQiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMb25nIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdlciIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGUiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZXN0YW1wIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQm9vbGVhbiIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9iamVjdCIgLz4NCi0gICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZm9ybWF0IiAvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpZi1jb21wYXJlLWZpZWxkIiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQ29uZGl0aW9uYWxzIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpZWxkIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imxlc3MiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJncmVhdGVyIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGVzcy1lcXVhbHMiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJncmVhdGVyLWVxdWFscyIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImVxdWFscyIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vdC1lcXVhbHMiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjb250YWlucyIgLz4NCi0gICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRvLWZpZWxkIiB0eXBlPSJ4czpzdHJpbmciIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiBkZWZhdWx0PSJTdHJpbmciPg0KLSAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFpblN0cmluZyIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmluZyIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJpZ0RlY2ltYWwiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9hdCIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmciIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlZ2VyIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZSIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWUiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lc3RhbXAiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCb29sZWFuIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT2JqZWN0IiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJmb3JtYXQiIC8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImlmLXJlZ2V4cCIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImZpZWxkIiB1c2U9InJlcXVpcmVkIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJleHByIiB1c2U9InJlcXVpcmVkIiAvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpZi1lbXB0eSIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImZpZWxkIiB1c2U9InJlcXVpcmVkIiAvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLQ0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJBbGxBY3Rpb25zIiBhYnN0cmFjdD0idHJ1ZSIgLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2V0IiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQWN0aW9ucyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImZpZWxkIiB1c2U9InJlcXVpcmVkIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJmcm9tLWZpZWxkIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ2YWx1ZSIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZGVmYXVsdC12YWx1ZSIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Imdsb2JhbCIgZGVmYXVsdD0iZmFsc2UiPg0KLSAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiIC8+DQotICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIj4NCi0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhaW5TdHJpbmciIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJpbmciIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCaWdEZWNpbWFsIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvYXQiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0IiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZyIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkludGVnZXIiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZSIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVzdGFtcCIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2xlYW4iIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPYmplY3QiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdMaXN0IiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3TWFwIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idG8tc2NvcGUiIGRlZmF1bHQ9InNjcmVlbiI+DQotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNjcmVlbiIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVzZXIiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbiIgLz4NCi0gICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZyb20tc2NvcGUiIGRlZmF1bHQ9InNjcmVlbiI+DQotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNjcmVlbiIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVzZXIiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbiIgLz4NCi0gICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbWFwIiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQWN0aW9ucyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InJlc291cmNlIiB1c2U9InJlcXVpcmVkIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJtYXAtbmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Imdsb2JhbCIgZGVmYXVsdD0iZmFsc2UiPg0KLSAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiIC8+DQotICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9InByb3BlcnR5LXRvLWZpZWxkIiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQWN0aW9ucyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InJlc291cmNlIiB1c2U9InJlcXVpcmVkIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJwcm9wZXJ0eSIgdXNlPSJyZXF1aXJlZCIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZmllbGQiIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImRlZmF1bHQiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuby1sb2NhbGUiIGRlZmF1bHQ9ImZhbHNlIj4NCi0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJhcmctbGlzdC1uYW1lIiAvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzY3JpcHQiIHN1YnN0aXR1dGlvbkdyb3VwPSJBbGxBY3Rpb25zIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ibG9jYXRpb24iIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImVudGl0eS1vbmUiIHN1YnN0aXR1dGlvbkdyb3VwPSJBbGxBY3Rpb25zIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iZmllbGQtbWFwIiAvPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9InNlbGVjdC1maWVsZCIgLz4NCi0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LW5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlLWZpZWxkIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UtY2FjaGUiIGRlZmF1bHQ9ImZhbHNlIj4NCi0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXV0by1maWVsZC1tYXAiIGRlZmF1bHQ9InRydWUiPg0KLSAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiIC8+DQotICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImdldC1yZWxhdGVkLW9uZSIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbEFjdGlvbnMiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUtZmllbGQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlbGF0aW9uLW5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS1jYWNoZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJmYWxzZSIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRvLXZhbHVlLWZpZWxkIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImdldC1yZWxhdGVkIiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQWN0aW9ucyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InZhbHVlLWZpZWxkIiB1c2U9InJlcXVpcmVkIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJyZWxhdGlvbi1uYW1lIiB1c2U9InJlcXVpcmVkIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJtYXAiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9Im9yZGVyLWJ5LWxpc3QiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InVzZS1jYWNoZSIgZGVmYXVsdD0iZmFsc2UiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9Imxpc3QiIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImNvbmRpdGlvbi1saXN0Ij4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJjb25kaXRpb24tZXhwciIgLz4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJjb25kaXRpb24tbGlzdCIgLz4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJjb25kaXRpb24tb2JqZWN0IiAvPg0KLSAgICAgICAgICAgIDwveHM6Y2hvaWNlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29tYmluZSIgZGVmYXVsdD0iYW5kIj4NCi0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYW5kIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib3IiIC8+DQotICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImhhdmluZy1jb25kaXRpb24tbGlzdCI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iY29uZGl0aW9uLWV4cHIiIC8+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iY29uZGl0aW9uLWxpc3QiIC8+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iY29uZGl0aW9uLW9iamVjdCIgLz4NCi0gICAgICAgICAgICA8L3hzOmNob2ljZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbWJpbmUiIGRlZmF1bHQ9ImFuZCI+DQotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFuZCIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9yIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb25kaXRpb24tZXhwciI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImZpZWxkLW5hbWUiIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgZGVmYXVsdD0iZXF1YWxzIj4NCi0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGVzcyIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImdyZWF0ZXIiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsZXNzLWVxdWFscyIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImdyZWF0ZXItZXF1YWxzIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZXF1YWxzIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm90LWVxdWFscyIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImluIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm90LWluIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYmV0d2VlbiIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imxpa2UiIC8+DQotICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImZyb20tZmllbGQiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InZhbHVlIiAvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWdub3JlLWlmLW51bGwiIGRlZmF1bHQ9ImZhbHNlIj4NCi0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWdub3JlLWlmLWVtcHR5IiBkZWZhdWx0PSJmYWxzZSI+DQotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIgLz4NCi0gICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Imlnbm9yZS1jYXNlIiBkZWZhdWx0PSJmYWxzZSI+DQotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIgLz4NCi0gICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Imlnbm9yZSIgZGVmYXVsdD0iZmFsc2UiPg0KLSAgICAgICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZSB0aGUgY29uZGl0aW9uIGlmIGZsYWcgaXMgdHJ1ZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBmYWxzZS4NCi0gICAgICAgICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb25kaXRpb24tb2JqZWN0Ij4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZmllbGQiIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9InNlbGVjdC1maWVsZCI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImZpZWxkLW5hbWUiIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9Im9yZGVyLWJ5Ij4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZmllbGQtbmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ibGltaXQtcmFuZ2UiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3RhcnQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+U2hvdWxkIHJlc29sdmUgaW50byBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLjwveHM6ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2l6ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgPHhzOmFubm90YXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5TaG91bGQgcmVzb2x2ZSBpbnRvIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuPC94czpkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3hzOmFubm90YXRpb24+DQotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImxpbWl0LXZpZXciPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmlldy1pbmRleCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgPHhzOmFubm90YXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5TaG91bGQgcmVzb2x2ZSBpbnRvIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuPC94czpkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3hzOmFubm90YXRpb24+DQotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2aWV3LXNpemUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+U2hvdWxkIHJlc29sdmUgaW50byBhIHBvc2l0aXZlIGludGVnZXIuPC94czpkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3hzOmFubm90YXRpb24+DQotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9InVzZS1pdGVyYXRvciIgLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZmllbGQtbWFwIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZmllbGQtbmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZnJvbS1maWVsZCIgLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0idmFsdWUiIC8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtZXRlciI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InBhcmFtLW5hbWUiIHVzZT0icmVxdWlyZWQiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImZyb20tZmllbGQiIC8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InZhbHVlIiAvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhdXRvLXBhcmFtZXRlcnMtc2VydmljZSI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9ImV4Y2x1ZGUiIC8+DQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlcnZpY2UtbmFtZSIgdHlwZT0ieHM6c3RyaW5nIj4NCi0gICAgICAgICAgICAgICAgPHhzOmFubm90YXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGUgc2VydmljZSBuYW1lIHVzZWQgdG8gcmVzb2x2ZSBwYXJhbWV0ZXJzLiBJZiBlbXB0eSwgdXNlIGZvcm0gZGVmYXVsdFNlcnZpY2VOYW1lLiBGbGV4aWJsZSBzdHJpbmcgYWxsb3dlZC48L3hzOmRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbmQtaWYtZW1wdHkiIGRlZmF1bHQ9InRydWUiPg0KLSAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiIC8+DQotICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImF1dG8tcGFyYW1ldGVycy1lbnRpdHkiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJleGNsdWRlIiAvPg0KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbnRpdHktbmFtZSIgdHlwZT0ieHM6c3RyaW5nIj4NCi0gICAgICAgICAgICAgICAgPHhzOmFubm90YXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGUgZW50aXR5IG5hbWUgdXNlZCB0byByZXNvbHZlIHBhcmFtZXRlcnMuIElmIGVtcHR5IHVzZSBmb3JtIGRlZmF1bHRFbnRpdHlOYW1lIGF0dHJpYnV0ZS4gRmxleGlibGUgc3RyaW5nIGFsbG93ZWQuPC94czpkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3hzOmFubm90YXRpb24+DQotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlIiBkZWZhdWx0PSJwayI+DQotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InBrIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9ucGsiIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+DQotICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZW5kLWlmLWVtcHR5IiBkZWZhdWx0PSJ0cnVlIj4NCi0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJleGNsdWRlIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpZWxkLW5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImxpbmsiPg0KLSAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJhdXRvLXBhcmFtZXRlcnMtc2VydmljZSIvPg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJhdXRvLXBhcmFtZXRlcnMtZW50aXR5Ii8+DQotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJwYXJhbWV0ZXIiIC8+DQotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbWFnZSIgdHlwZT0iaW1hZ2UiIC8+DQotICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InRleHQiIC8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iaWQiPg0KLSAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIElmIHlvdSB1c2UgaWQgZm9yIGxpbmsgcHJlc2VudCBpbiBsaXN0IGZvcm0gb3IgbXVsdGkgZm9ybSwgeW91IGNhbiB1c2UgJHtpdGVtSW5kZXh9IHRvIGdlbmVyYXRlIGFuIHVuaXF1ZSBpZCBieSBsaW5lLg0KLSAgICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPg0KLSAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ic3R5bGUiIC8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ibmFtZSIgLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ0aXRsZSIgLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiBuYW1lPSJzaXplIiAvPjwhLS0gVGV4dCBzaXplIGxpbWl0IC0tPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InRhcmdldCIgLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ0YXJnZXQtd2luZG93IiAvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InByZWZpeCIgLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ3aWR0aCIgLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJoZWlnaHQiIC8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxpbmstdHlwZSIgZGVmYXVsdD0iYXV0byI+DQotICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImF1dG8iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNlbGVjdGVkIHRoZSBoaWRkZW4tZm9ybSB0eXBlIHdpbGwgYmUgdXNlZCBpZiB0aGUgdXJsLW1vZGUgaXMgaW50cmEtYXBwDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHJlcXVlc3Qgc3BlY2lmaWVkIGhhcyBhbiBldmVudCwgb3RoZXJ3aXNlIHRoZSBhbmNob3IgdHlwZSB3aWxsIGJlIHVzZWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgaWYgdGhlIGxheWVyZWQtbW9kYWwgbW9kZSBpcyBzcGVjaWZpZWQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmFubm90YXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L3hzOmVudW1lcmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbmNob3IiIC8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImhpZGRlbi1mb3JtIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsYXllcmVkLW1vZGFsIiAvPg0KLSAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4NCi0gICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1cmwtbW9kZSIgZGVmYXVsdD0iaW50cmEtYXBwIj4NCi0gICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaW50cmEtYXBwIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpbnRlci1hcHAiIC8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnRlbnQiIC8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InBsYWluIiAvPg0KLSAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4NCi0gICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmdWxsLXBhdGgiIGRlZmF1bHQ9ImZhbHNlIj4NCi0gICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIgLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiIC8+DQotICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+DQotICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPg0KLSAgICAgICAgPC94czphdHRyaWJ1dGU+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlY3VyZSIgZGVmYXVsdD0iZmFsc2UiPg0KLSAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIgLz4NCi0gICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5jb2RlIiBkZWZhdWx0PSJmYWxzZSI+DQotICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiIC8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIiAvPg0KLSAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4NCi0gICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1ZXN0LWNvbmZpcm1hdGlvbiIgZGVmYXVsdD0iZmFsc2UiPg0KLSAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5JZiB0cnVlIHRoZW4gdGhlIHVzZXIgaXMgcHJlc2VudGVkIHdpdGggYSBkaWFsb2cgYm94LCBpZiBjb25maXJtYXRpb24tbWVzc2FnZSBpcyBlbXB0eSwgdXNlIGRlZmF1bHQ8L3hzOmRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIiAvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIgLz4NCi0gICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29uZmlybWF0aW9uLW1lc3NhZ2UiIHR5cGU9InhzOnN0cmluZyI+DQotICAgICAgICAgICAgPHhzOmFubm90YXRpb24+DQotICAgICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSBtZXNzYWdlIGRpc3BsYXllZCBpbiBjb25maXJtYXRpb24gYm94PC94czpkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4NCi0gICAgICAgIDwveHM6YXR0cmlidXRlPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iaW1hZ2UiIG1peGVkPSJ0cnVlIj4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJzcmMiIC8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iaWQiIC8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ic3R5bGUiIC8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0id2lkdGgiIC8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iaGVpZ2h0IiAvPg0KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImJvcmRlciIgLz4NCi0gICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJhbHQiIC8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0idGl0bGUiIC8+DQotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVybC1tb2RlIiBkZWZhdWx0PSJjb250ZW50Ij4NCi0gICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib2ZiaXoiIC8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnRlbnQiIC8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJhdyIgLz4NCi0gICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgICAgICA8L3hzOmF0dHJpYnV0ZT4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi08L3hzOnNjaGVtYT4NCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKworICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJDb25kaXRpb25Sb290VHlwZSI+CisgICAgICAgIDx4czpjaG9pY2U+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImFuZCIgLz4KKyAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ib3IiIC8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhvciIgLz4KKyAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibm90IiAvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJpZi1zZXJ2aWNlLXBlcm1pc3Npb24iIC8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImlmLWhhcy1wZXJtaXNzaW9uIiAvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJpZi1lbnRpdHktcGVybWlzc2lvbiIgLz4KKyAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iaWYtdmFsaWRhdGUtbWV0aG9kIiAvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJpZi1jb21wYXJlIiAvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJpZi1jb21wYXJlLWZpZWxkIiAvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJpZi1yZWdleHAiIC8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImlmLWVtcHR5IiAvPgorICAgICAgICA8L3hzOmNob2ljZT4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czplbGVtZW50IG5hbWU9IkFsbENvbmRpdGlvbmFscyIgYWJzdHJhY3Q9InRydWUiIC8+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iYW5kIiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQ29uZGl0aW9uYWxzIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkFsbENvbmRpdGlvbmFscyIgLz4KKyAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPC94czplbGVtZW50PgorICAgIDx4czplbGVtZW50IG5hbWU9InhvciIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJBbGxDb25kaXRpb25hbHMiIC8+CisgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJvciIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJBbGxDb25kaXRpb25hbHMiIC8+CisgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJub3QiIHN1YnN0aXR1dGlvbkdyb3VwPSJBbGxDb25kaXRpb25hbHMiPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJBbGxDb25kaXRpb25hbHMiIC8+CisgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJpZi1zZXJ2aWNlLXBlcm1pc3Npb24iIHN1YnN0aXR1dGlvbkdyb3VwPSJBbGxDb25kaXRpb25hbHMiPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ic2VydmljZS1uYW1lIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InJlc291cmNlLWRlc2NyaXB0aW9uIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImNvbnRleHQtbWFwIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYWluLWFjdGlvbiIgdXNlPSJvcHRpb25hbCI+CisgICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNSRUFURSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVVBEQVRFIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUxFVEUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlZJRVciIC8+CisgICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPC94czplbGVtZW50PgorICAgIDx4czplbGVtZW50IG5hbWU9ImlmLWhhcy1wZXJtaXNzaW9uIiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQ29uZGl0aW9uYWxzIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InBlcm1pc3Npb24iIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iYWN0aW9uIiAvPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJpZi1lbnRpdHktcGVybWlzc2lvbiIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgcmVmPSJwZXJtaXNzaW9uLWNvbmRpdGlvbi1nZXR0ZXIiIC8+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIHJlZj0icmVsYXRlZC1yb2xlLWdldHRlciIgLz4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgcmVmPSJhdXhpbGlhcnktdmFsdWUtZ2V0dGVyIiAvPgorICAgICAgICAgICAgPC94czpjaG9pY2U+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZW50aXR5LW5hbWUiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZW50aXR5LWlkIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Q2FuIGhhdmUgbXVsdGlwbGUgcGlwZSBzZXBhcmF0ZWQgdmFsdWVzLCBidXQgZG9uJ3QgdXNlIHNwYWNlcy48L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0idGFyZ2V0LW9wZXJhdGlvbiIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICAgICAgPHhzOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkNhbiBoYXZlIG11bHRpcGxlIHBpcGUgc2VwYXJhdGVkIHZhbHVlcywgYnV0IGRvbid0IHVzZSBzcGFjZXMuPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaXNwbGF5LWZhaWwtY29uZCIgZGVmYXVsdD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0icGVybWlzc2lvbi1jb25kaXRpb24tZ2V0dGVyIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImVudGl0eS1uYW1lIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9Im9wZXJhdGlvbi1maWVsZC1uYW1lIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InJvbGUtZmllbGQtbmFtZSIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJhdXhpbGlhcnktZmllbGQtbmFtZSIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJzdGF0dXMtZmllbGQtbmFtZSIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJwcml2aWxlZ2UtZmllbGQtbmFtZSIgLz4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0icmVsYXRlZC1yb2xlLWdldHRlciI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJlbnRpdHktbmFtZSIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJyb2xlLWVudGl0eS1uYW1lIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InJvbGUtdHlwZS1maWVsZC1uYW1lIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InBhcnR5LWZpZWxkLW5hbWUiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ib3duZXItZW50aXR5LWZpZWxkLW5hbWUiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZW50aXR5LWlkLW5hbWUiIC8+CisgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPC94czplbGVtZW50PgorICAgIDx4czplbGVtZW50IG5hbWU9ImF1eGlsaWFyeS12YWx1ZS1nZXR0ZXIiPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZW50aXR5LW5hbWUiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iYXV4aWxpYXJ5LWZpZWxkLW5hbWUiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZW50aXR5LWlkLW5hbWUiIC8+CisgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPC94czplbGVtZW50PgorICAgIDx4czplbGVtZW50IG5hbWU9ImlmLXZhbGlkYXRlLW1ldGhvZCIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+CisgICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Q2FsbHMgYSBzdGF0aWMgSmF2YSBtZXRob2QgdGhhdCB0YWtlcyBhIFN0cmluZyBhbmQgcmV0dXJucyBhIGJvb2xlYW4uPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJmaWVsZCIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJtZXRob2QiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iY2xhc3MiIGRlZmF1bHQ9Im9yZy5hcGFjaGUub2ZiaXouYmFzZS51dGlsLlV0aWxWYWxpZGF0ZSIgLz4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iaWYtY29tcGFyZSIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmllbGQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsZXNzIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJncmVhdGVyIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsZXNzLWVxdWFscyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZ3JlYXRlci1lcXVhbHMiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImVxdWFscyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm90LWVxdWFscyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY29udGFpbnMiIC8+CisgICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIGRlZmF1bHQ9IlN0cmluZyI+CisgICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWluU3RyaW5nIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJpbmciIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJpZ0RlY2ltYWwiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvYXQiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmciIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkludGVnZXIiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVzdGFtcCIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQm9vbGVhbiIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT2JqZWN0IiAvPgorICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImZvcm1hdCIgLz4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iaWYtY29tcGFyZS1maWVsZCIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbENvbmRpdGlvbmFscyI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmllbGQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsZXNzIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJncmVhdGVyIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJsZXNzLWVxdWFscyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZ3JlYXRlci1lcXVhbHMiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImVxdWFscyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm90LWVxdWFscyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY29udGFpbnMiIC8+CisgICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRvLWZpZWxkIiB0eXBlPSJ4czpzdHJpbmciIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIGRlZmF1bHQ9IlN0cmluZyI+CisgICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWluU3RyaW5nIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJpbmciIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJpZ0RlY2ltYWwiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvYXQiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmciIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkludGVnZXIiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVzdGFtcCIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQm9vbGVhbiIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT2JqZWN0IiAvPgorICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImZvcm1hdCIgLz4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iaWYtcmVnZXhwIiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQ29uZGl0aW9uYWxzIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImZpZWxkIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImV4cHIiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPC94czplbGVtZW50PgorICAgIDx4czplbGVtZW50IG5hbWU9ImlmLWVtcHR5IiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQ29uZGl0aW9uYWxzIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImZpZWxkIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKworICAgIDx4czplbGVtZW50IG5hbWU9IkFsbEFjdGlvbnMiIGFic3RyYWN0PSJ0cnVlIiAvPgorICAgIDx4czplbGVtZW50IG5hbWU9InNldCIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbEFjdGlvbnMiPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZmllbGQiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZnJvbS1maWVsZCIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ2YWx1ZSIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJkZWZhdWx0LXZhbHVlIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJnbG9iYWwiIGRlZmF1bHQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiPgorICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFpblN0cmluZyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyaW5nIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCaWdEZWNpbWFsIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZsb2F0IiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0IiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMb25nIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlZ2VyIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lc3RhbXAiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2xlYW4iIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9iamVjdCIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3TGlzdCIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3TWFwIiAvPgorICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0by1zY29wZSIgZGVmYXVsdD0ic2NyZWVuIj4KKyAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2NyZWVuIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1c2VyIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbiIgLz4KKyAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZnJvbS1zY29wZSIgZGVmYXVsdD0ic2NyZWVuIj4KKyAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2NyZWVuIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1c2VyIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbiIgLz4KKyAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbWFwIiBzdWJzdGl0dXRpb25Hcm91cD0iQWxsQWN0aW9ucyI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJyZXNvdXJjZSIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJtYXAtbmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ2xvYmFsIiBkZWZhdWx0PSJmYWxzZSI+CisgICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS10by1maWVsZCIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbEFjdGlvbnMiPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0icmVzb3VyY2UiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0icHJvcGVydHkiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZmllbGQiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZGVmYXVsdCIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibm8tbG9jYWxlIiBkZWZhdWx0PSJmYWxzZSI+CisgICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImFyZy1saXN0LW5hbWUiIC8+CisgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPC94czplbGVtZW50PgorICAgIDx4czplbGVtZW50IG5hbWU9InNjcmlwdCIgc3Vic3RpdHV0aW9uR3JvdXA9IkFsbEFjdGlvbnMiPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ibG9jYXRpb24iIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPC94czplbGVtZW50PgorICAgIDx4czplbGVtZW50IG5hbWU9ImVudGl0eS1vbmUiIHN1YnN0aXR1dGlvbkdyb3VwPSJBbGxBY3Rpb25zIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iZmllbGQtbWFwIiAvPgorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0ic2VsZWN0LWZpZWxkIiAvPgorICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LW5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUtZmllbGQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlLWNhY2hlIiBkZWZhdWx0PSJmYWxzZSI+CisgICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdXRvLWZpZWxkLW1hcCIgZGVmYXVsdD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJnZXQtcmVsYXRlZC1vbmUiIHN1YnN0aXR1dGlvbkdyb3VwPSJBbGxBY3Rpb25zIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1maWVsZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWxhdGlvbi1uYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZS1jYWNoZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJmYWxzZSIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idG8tdmFsdWUtZmllbGQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iZ2V0LXJlbGF0ZWQiIHN1YnN0aXR1dGlvbkdyb3VwPSJBbGxBY3Rpb25zIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InZhbHVlLWZpZWxkIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InJlbGF0aW9uLW5hbWUiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ibWFwIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9Im9yZGVyLWJ5LWxpc3QiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0idXNlLWNhY2hlIiBkZWZhdWx0PSJmYWxzZSIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJsaXN0IiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb25kaXRpb24tbGlzdCI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iY29uZGl0aW9uLWV4cHIiIC8+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJjb25kaXRpb24tbGlzdCIgLz4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImNvbmRpdGlvbi1vYmplY3QiIC8+CisgICAgICAgICAgICA8L3hzOmNob2ljZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29tYmluZSIgZGVmYXVsdD0iYW5kIj4KKyAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYW5kIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvciIgLz4KKyAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iaGF2aW5nLWNvbmRpdGlvbi1saXN0Ij4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJjb25kaXRpb24tZXhwciIgLz4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImNvbmRpdGlvbi1saXN0IiAvPgorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iY29uZGl0aW9uLW9iamVjdCIgLz4KKyAgICAgICAgICAgIDwveHM6Y2hvaWNlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb21iaW5lIiBkZWZhdWx0PSJhbmQiPgorICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbmQiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9yIiAvPgorICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb25kaXRpb24tZXhwciI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJmaWVsZC1uYW1lIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgZGVmYXVsdD0iZXF1YWxzIj4KKyAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGVzcyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZ3JlYXRlciIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGVzcy1lcXVhbHMiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImdyZWF0ZXItZXF1YWxzIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJlcXVhbHMiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vdC1lcXVhbHMiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImluIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub3QtaW4iIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImJldHdlZW4iIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imxpa2UiIC8+CisgICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZnJvbS1maWVsZCIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ2YWx1ZSIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWdub3JlLWlmLW51bGwiIGRlZmF1bHQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Imlnbm9yZS1pZi1lbXB0eSIgZGVmYXVsdD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWdub3JlLWNhc2UiIGRlZmF1bHQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Imlnbm9yZSIgZGVmYXVsdD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZSB0aGUgY29uZGl0aW9uIGlmIGZsYWcgaXMgdHJ1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAgICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPC94czplbGVtZW50PgorICAgIDx4czplbGVtZW50IG5hbWU9ImNvbmRpdGlvbi1vYmplY3QiPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZmllbGQiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPC94czplbGVtZW50PgorICAgIDx4czplbGVtZW50IG5hbWU9InNlbGVjdC1maWVsZCI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJmaWVsZC1uYW1lIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJmaWVsZC1uYW1lIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJsaW1pdC1yYW5nZSI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3RhcnQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICAgICAgPHhzOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlNob3VsZCByZXNvbHZlIGludG8gYSBub24tbmVnYXRpdmUgaW50ZWdlci48L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICAgICAgPHhzOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlNob3VsZCByZXNvbHZlIGludG8gYSBub24tbmVnYXRpdmUgaW50ZWdlci48L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPC94czplbGVtZW50PgorICAgIDx4czplbGVtZW50IG5hbWU9ImxpbWl0LXZpZXciPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZpZXctaW5kZXgiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICAgICAgPHhzOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlNob3VsZCByZXNvbHZlIGludG8gYSBub24tbmVnYXRpdmUgaW50ZWdlci48L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZpZXctc2l6ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+U2hvdWxkIHJlc29sdmUgaW50byBhIHBvc2l0aXZlIGludGVnZXIuPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJ1c2UtaXRlcmF0b3IiIC8+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmllbGQtbWFwIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImZpZWxkLW5hbWUiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZnJvbS1maWVsZCIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ2YWx1ZSIgLz4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InBhcmFtLW5hbWUiIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0iZnJvbS1maWVsZCIgLz4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ2YWx1ZSIgLz4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iYXV0by1wYXJhbWV0ZXJzLXNlcnZpY2UiPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJleGNsdWRlIiAvPgorICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VydmljZS1uYW1lIiB0eXBlPSJ4czpzdHJpbmciPgorICAgICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGUgc2VydmljZSBuYW1lIHVzZWQgdG8gcmVzb2x2ZSBwYXJhbWV0ZXJzLiBJZiBlbXB0eSwgdXNlIGZvcm0gZGVmYXVsdFNlcnZpY2VOYW1lLiBGbGV4aWJsZSBzdHJpbmcgYWxsb3dlZC48L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNlbmQtaWYtZW1wdHkiIGRlZmF1bHQ9InRydWUiPgorICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iYXV0by1wYXJhbWV0ZXJzLWVudGl0eSI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9ImV4Y2x1ZGUiIC8+CisgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbnRpdHktbmFtZSIgdHlwZT0ieHM6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhlIGVudGl0eSBuYW1lIHVzZWQgdG8gcmVzb2x2ZSBwYXJhbWV0ZXJzLiBJZiBlbXB0eSB1c2UgZm9ybSBkZWZhdWx0RW50aXR5TmFtZSBhdHRyaWJ1dGUuIEZsZXhpYmxlIHN0cmluZyBhbGxvd2VkLjwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZSIgZGVmYXVsdD0icGsiPgorICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwayIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9ucGsiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2VuZC1pZi1lbXB0eSIgZGVmYXVsdD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJleGNsdWRlIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaWVsZC1uYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPC94czplbGVtZW50PgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsaW5rIj4KKyAgICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9ImF1dG8tcGFyYW1ldGVycy1zZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iYXV0by1wYXJhbWV0ZXJzLWVudGl0eSIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJwYXJhbWV0ZXIiIC8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImltYWdlIiB0eXBlPSJpbWFnZSIgLz4KKyAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InRleHQiIC8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJpZCI+CisgICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IHVzZSBpZCBmb3IgbGluayBwcmVzZW50IGluIGxpc3QgZm9ybSBvciBtdWx0aSBmb3JtLCB5b3UgY2FuIHVzZSAke2l0ZW1JbmRleH0gdG8gZ2VuZXJhdGUgYW4gdW5pcXVlIGlkIGJ5IGxpbmUuCisgICAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InN0eWxlIiAvPgorICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ibmFtZSIgLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InRpdGxlIiAvPgorICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgbmFtZT0ic2l6ZSIgLz48IS0tIFRleHQgc2l6ZSBsaW1pdCAtLT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InRhcmdldCIgLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InRhcmdldC13aW5kb3ciIC8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJwcmVmaXgiIC8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ3aWR0aCIgLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImhlaWdodCIgLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsaW5rLXR5cGUiIGRlZmF1bHQ9ImF1dG8iPgorICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhdXRvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZWxlY3RlZCB0aGUgaGlkZGVuLWZvcm0gdHlwZSB3aWxsIGJlIHVzZWQgaWYgdGhlIHVybC1tb2RlIGlzIGludHJhLWFwcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHJlcXVlc3Qgc3BlY2lmaWVkIGhhcyBhbiBldmVudCwgb3RoZXJ3aXNlIHRoZSBhbmNob3IgdHlwZSB3aWxsIGJlIHVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBpZiB0aGUgbGF5ZXJlZC1tb2RhbCBtb2RlIGlzIHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwveHM6ZW51bWVyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYW5jaG9yIiAvPgorICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImhpZGRlbi1mb3JtIiAvPgorICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImxheWVyZWQtbW9kYWwiIC8+CisgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXJsLW1vZGUiIGRlZmF1bHQ9ImludHJhLWFwcCI+CisgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImludHJhLWFwcCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpbnRlci1hcHAiIC8+CisgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY29udGVudCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwbGFpbiIgLz4KKyAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmdWxsLXBhdGgiIGRlZmF1bHQ9ImZhbHNlIj4KKyAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZWN1cmUiIGRlZmF1bHQ9ImZhbHNlIj4KKyAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmNvZGUiIGRlZmF1bHQ9ImZhbHNlIj4KKyAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1ZXN0LWNvbmZpcm1hdGlvbiIgZGVmYXVsdD0iZmFsc2UiPgorICAgICAgICAgICAgPHhzOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+SWYgdHJ1ZSB0aGVuIHRoZSB1c2VyIGlzIHByZXNlbnRlZCB3aXRoIGEgZGlhbG9nIGJveCwgaWYgY29uZmlybWF0aW9uLW1lc3NhZ2UgaXMgZW1wdHksIHVzZSBkZWZhdWx0PC94czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbmZpcm1hdGlvbi1tZXNzYWdlIiB0eXBlPSJ4czpzdHJpbmciPgorICAgICAgICAgICAgPHhzOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhlIG1lc3NhZ2UgZGlzcGxheWVkIGluIGNvbmZpcm1hdGlvbiBib3g8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImltYWdlIiBtaXhlZD0idHJ1ZSI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJzcmMiIC8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJpZCIgLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InN0eWxlIiAvPgorICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0id2lkdGgiIC8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJoZWlnaHQiIC8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJib3JkZXIiIC8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJhbHQiIC8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ0aXRsZSIgLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1cmwtbW9kZSIgZGVmYXVsdD0iY29udGVudCI+CisgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9mYml6IiAvPgorICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnRlbnQiIC8+CisgICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmF3IiAvPgorICAgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgIDwveHM6Y29tcGxleFR5cGU+Cis8L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2ZyYW1ld29yay93aWRnZXQvdGVtcGxhdGVzL0h0bWxNZW51TWFjcm9MaWJyYXJ5LmZ0bCBiL2ZyYW1ld29yay93aWRnZXQvdGVtcGxhdGVzL0h0bWxNZW51TWFjcm9MaWJyYXJ5LmZ0bAppbmRleCAwM2I5YTU2Li42Njk2MmFjIDEwMDY0NAotLS0gYS9mcmFtZXdvcmsvd2lkZ2V0L3RlbXBsYXRlcy9IdG1sTWVudU1hY3JvTGlicmFyeS5mdGwKKysrIGIvZnJhbWV3b3JrL3dpZGdldC90ZW1wbGF0ZXMvSHRtbE1lbnVNYWNyb0xpYnJhcnkuZnRsCkBAIC0xLDEwNyArMSwxMDcgQEAKLTwjLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwjbWFjcm8gcmVuZGVyTWVudUJlZ2luIGJvdW5kYXJ5Q29tbWVudD0iIiBpZD0iIiBzdHlsZT0iIiB0aXRsZT0iIj4NCi0gIDwjaWYgYm91bmRhcnlDb21tZW50P2hhc19jb250ZW50Pg0KLTwhLS0gJHtib3VuZGFyeUNvbW1lbnR9IC0tPg0KLSAgPC8jaWY+DQotICA8Iy0tIEZJWE1FOiBBIG1lbnUgY291bGQgaGF2ZSBhbiBJRCBhbmQgYSBzdHlsZSwgYnV0IHNvbWUgdmlzdWFsIHRoZW1lcyBicmVhayBpZiBib3RoIGFyZSB1c2VkLiAtLT4NCi0gIDxkaXY8I2lmIGlkP2hhc19jb250ZW50PiBpZD0iJHtpZH0iPCNlbHNlaWYgc3R5bGU/aGFzX2NvbnRlbnQ+IGNsYXNzPSIke3N0eWxlfSI8LyNpZj4+DQotICA8I2lmIHRpdGxlP2hhc19jb250ZW50Pg0KLSAgPGgyPiR7dGl0bGV9PC9oMj4NCi0gIDwvI2lmPg0KLSAgPHVsPg0KLSAgICA8bGk+DQotICAgICAgPHVsPg0KLTwvI21hY3JvPg0KLQ0KLTwjbWFjcm8gcmVuZGVyTWVudUVuZCBib3VuZGFyeUNvbW1lbnQ9IiI+DQotICAgICAgPC91bD4NCi0gICAgPC9saT4NCi0gIDwvdWw+DQotICA8YnIgY2xhc3M9ImNsZWFyIi8+DQotICA8L2Rpdj4NCi08I2lmIGJvdW5kYXJ5Q29tbWVudD9oYXNfY29udGVudD4NCi08IS0tICR7Ym91bmRhcnlDb21tZW50fSAtLT4NCi08LyNpZj4NCi08LyNtYWNybz4NCi0NCi08I21hY3JvIHJlbmRlckltYWdlIHNyYyBpZCBzdHlsZSB3aWR0aCBoZWlnaHQgYm9yZGVyPg0KLTxpbWcgc3JjPSIke3NyY30iPCNpZiBpZD9oYXNfY29udGVudD4gaWQ9IiR7aWR9IjwvI2lmPjwjaWYgc3R5bGU/aGFzX2NvbnRlbnQ+IGNsYXNzPSIke3N0eWxlfSI8LyNpZj48I2lmIHdpZHRoP2hhc19jb250ZW50PiB3aWR0aD0iJHt3aWR0aH0iPC8jaWY+PCNpZiBoZWlnaHQ/aGFzX2NvbnRlbnQ+IGhlaWdodD0iJHtoZWlnaHR9IjwvI2lmPjwjaWYgYm9yZGVyP2hhc19jb250ZW50PiBib3JkZXI9IiR7Ym9yZGVyfSI8LyNpZj4gLz4NCi08LyNtYWNybz4NCi0NCi08I21hY3JvIHJlbmRlckxpbmsgbGlua1VybCBwYXJhbWV0ZXJMaXN0IHRhcmdldFdpbmRvdyB1bmlxdWVJdGVtTmFtZSBhY3Rpb25VcmwgbGlua1R5cGU9IiIgaWQ9IiIgc3R5bGU9IiIgbmFtZT0iIiBoZWlnaHQ9IiIgd2lkdGg9IiIgdGV4dD0iIiBpbWdTdHI9IiI+DQotICA8I2lmIGxpbmtUeXBlP2hhc19jb250ZW50ICYmICJoaWRkZW4tZm9ybSIgPT0gbGlua1R5cGU+DQotPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiR7YWN0aW9uVXJsfSI8I2lmIHRhcmdldFdpbmRvdz9oYXNfY29udGVudD4gdGFyZ2V0PSIke3RhcmdldFdpbmRvd30iPC8jaWY+IG9uc3VibWl0PSJqYXZhc2NyaXB0OnN1Ym1pdEZvcm1EaXNhYmxlU3VibWl0cyh0aGlzKSIgbmFtZT0iJHt1bmlxdWVJdGVtTmFtZX0iPjwjcnQvPg0KLSAgICA8I2xpc3QgcGFyYW1ldGVyTGlzdCBhcyBwYXJhbWV0ZXI+DQotPGlucHV0IG5hbWU9IiR7cGFyYW1ldGVyLm5hbWV9IiB2YWx1ZT0iJHtwYXJhbWV0ZXIudmFsdWV9IiB0eXBlPSJoaWRkZW4iLz48I3J0Lz4NCi0gICAgPC8jbGlzdD4NCi08L2Zvcm0+PCNydC8+DQotICA8LyNpZj4NCi0gIDwjaWYgdW5pcXVlSXRlbU5hbWU/aGFzX2NvbnRlbnQgJiYgImxheWVyZWQtbW9kYWwiID09IGxpbmtUeXBlPg0KLTxkaXYgaWQ9IiR7dW5pcXVlSXRlbU5hbWV9Ij48L2Rpdj4NCi08YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBpZD0iJHt1bmlxdWVJdGVtTmFtZX1fbGluayIgDQotICAgIDwjaWYgc3R5bGU/aGFzX2NvbnRlbnQ+Y2xhc3M9IiR7c3R5bGV9IjwvI2lmPj4NCi0gICAgPCNpZiB0ZXh0P2hhc19jb250ZW50PiR7dGV4dH08LyNpZj48L2E+DQotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KLSAgICBmdW5jdGlvbiAke3VuaXF1ZUl0ZW1OYW1lfV9kYXRhKCkgew0KLSAgICAgICAgdmFyIGRhdGEgPSAgew0KLSAgICAgICAgICAgICAgICAgICA8I2xpc3QgcGFyYW1ldGVyTGlzdCBhcyBwYXJhbWV0ZXI+DQotICAgICAgICAgICAgICAgICAgICAiJHtwYXJhbWV0ZXIubmFtZX0iOiAiJHtwYXJhbWV0ZXIudmFsdWV9IiwNCi0gICAgICAgICAgICAgICAgICAgIDwvI2xpc3Q+DQotICAgICAgICAgICAgICAgICAgICAicHJlc2VudGF0aW9uIjogImxheWVyIg0KLSAgICAgICAgICAgICAgICB9Ow0KLSAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgalF1ZXJ5KCIjJHt1bmlxdWVJdGVtTmFtZX1fbGluayIpLmNsaWNrKGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICAgICAgalF1ZXJ5KCIjJHt1bmlxdWVJdGVtTmFtZX0iKS5kaWFsb2coIm9wZW4iKTsNCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICBqUXVlcnkoIiMke3VuaXF1ZUl0ZW1OYW1lfSIpLmRpYWxvZyh7DQotICAgICAgICAgICAgICAgICBhdXRvT3BlbjogZmFsc2UsDQotICAgICAgICAgICAgICAgICA8I2lmIHRleHQ/aGFzX2NvbnRlbnQ+dGl0bGU6ICIke3RleHR9Iiw8LyNpZj4NCi0gICAgICAgICAgICAgICAgIGhlaWdodDogPCNpZiBoZWlnaHQgPT0gIiI+NjAwPCNlbHNlPiR7aGVpZ2h0fTwvI2lmPiwNCi0gICAgICAgICAgICAgICAgIHdpZHRoOiA8I2lmIHdpZHRoID09ICIiPjgwMDwjZWxzZT4ke3dpZHRofTwvI2lmPiwNCi0gICAgICAgICAgICAgICAgIG1vZGFsOiB0cnVlLA0KLSAgICAgICAgICAgICAgICAgY2xvc2VPbkVzY2FwZTogdHJ1ZSwNCi0gICAgICAgICAgICAgICAgIG9wZW46IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuYWpheCh7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICIke2xpbmtVcmx9IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJQT1NUIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6ICR7dW5pcXVlSXRlbU5hbWV9X2RhdGEoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtqUXVlcnkoIiMke3VuaXF1ZUl0ZW1OYW1lfSIpLmh0bWwoZGF0YSk7fQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICA8L3NjcmlwdD4NCi0gIDwjZWxzZT4NCi08I2lmIChsaW5rVHlwZT9oYXNfY29udGVudCAmJiAiaGlkZGVuLWZvcm0iID09IGxpbmtUeXBlKSB8fCBsaW5rVXJsP2hhc19jb250ZW50Pg0KLTxhPCNpZiBpZD9oYXNfY29udGVudD4gaWQ9IiR7aWR9IjwvI2lmPjwjaWYgc3R5bGU/aGFzX2NvbnRlbnQ+IGNsYXNzPSIke3N0eWxlfSI8LyNpZj48I2lmIG5hbWU/aGFzX2NvbnRlbnQ+IG5hbWU9IiR7bmFtZX0iPC8jaWY+PCNpZiB0YXJnZXRXaW5kb3c/aGFzX2NvbnRlbnQ+IHRhcmdldD0iJHt0YXJnZXRXaW5kb3d9IjwvI2lmPiBocmVmPSI8I2lmICJoaWRkZW4tZm9ybSI9PWxpbmtUeXBlPmphdmFzY3JpcHQ6ZG9jdW1lbnQuJHt1bmlxdWVJdGVtTmFtZX0uc3VibWl0KCk8I2Vsc2U+JHtsaW5rVXJsfTwvI2lmPiI+PCNydC8+DQotPC8jaWY+DQotPCNpZiBpbWdTdHI/aGFzX2NvbnRlbnQ+JHtpbWdTdHJ9PC8jaWY+IDwjaWYgdGV4dD9oYXNfY29udGVudD4ke3RleHR9PC8jaWY+PCNydC8+DQotPCNpZiAobGlua1R5cGU/aGFzX2NvbnRlbnQgJiYgImhpZGRlbi1mb3JtIiA9PSBsaW5rVHlwZSkgfHwgbGlua1VybD9oYXNfY29udGVudD48L2E+PCNydC8+PC8jaWY+DQotICA8LyNpZj4NCi08LyNtYWNybz4NCi0NCi08I21hY3JvIHJlbmRlck1lbnVJdGVtQmVnaW4gc3R5bGUgdG9vbFRpcCBsaW5rU3RyIGNvbnRhaW5zTmVzdGVkTWVudXM+DQotICAgICAgICA8bGk8I2lmIHN0eWxlP2hhc19jb250ZW50PiBjbGFzcz0iJHtzdHlsZX0iPC8jaWY+PCNpZiB0b29sVGlwP2hhc19jb250ZW50PiB0aXRsZT0iJHt0b29sVGlwfSI8LyNpZj4+PCNpZiBsaW5rU3RyP2hhc19jb250ZW50PiR7bGlua1N0cn08LyNpZj48I2lmIGNvbnRhaW5zTmVzdGVkTWVudXM+PHVsPjwvI2lmPjwjcnQvPg0KLTwvI21hY3JvPg0KLQ0KLTwjbWFjcm8gcmVuZGVyTWVudUl0ZW1FbmQgY29udGFpbnNOZXN0ZWRNZW51cz4NCi08I2lmIGNvbnRhaW5zTmVzdGVkTWVudXM+PC91bD48LyNpZj48L2xpPg0KLTwvI21hY3JvPg0KKzwjLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCNtYWNybyByZW5kZXJNZW51QmVnaW4gYm91bmRhcnlDb21tZW50PSIiIGlkPSIiIHN0eWxlPSIiIHRpdGxlPSIiPgorICA8I2lmIGJvdW5kYXJ5Q29tbWVudD9oYXNfY29udGVudD4KKzwhLS0gJHtib3VuZGFyeUNvbW1lbnR9IC0tPgorICA8LyNpZj4KKyAgPCMtLSBGSVhNRTogQSBtZW51IGNvdWxkIGhhdmUgYW4gSUQgYW5kIGEgc3R5bGUsIGJ1dCBzb21lIHZpc3VhbCB0aGVtZXMgYnJlYWsgaWYgYm90aCBhcmUgdXNlZC4gLS0+CisgIDxkaXY8I2lmIGlkP2hhc19jb250ZW50PiBpZD0iJHtpZH0iPCNlbHNlaWYgc3R5bGU/aGFzX2NvbnRlbnQ+IGNsYXNzPSIke3N0eWxlfSI8LyNpZj4+CisgIDwjaWYgdGl0bGU/aGFzX2NvbnRlbnQ+CisgIDxoMj4ke3RpdGxlfTwvaDI+CisgIDwvI2lmPgorICA8dWw+CisgICAgPGxpPgorICAgICAgPHVsPgorPC8jbWFjcm8+CisKKzwjbWFjcm8gcmVuZGVyTWVudUVuZCBib3VuZGFyeUNvbW1lbnQ9IiI+CisgICAgICA8L3VsPgorICAgIDwvbGk+CisgIDwvdWw+CisgIDxiciBjbGFzcz0iY2xlYXIiLz4KKyAgPC9kaXY+Cis8I2lmIGJvdW5kYXJ5Q29tbWVudD9oYXNfY29udGVudD4KKzwhLS0gJHtib3VuZGFyeUNvbW1lbnR9IC0tPgorPC8jaWY+Cis8LyNtYWNybz4KKworPCNtYWNybyByZW5kZXJJbWFnZSBzcmMgaWQgc3R5bGUgd2lkdGggaGVpZ2h0IGJvcmRlcj4KKzxpbWcgc3JjPSIke3NyY30iPCNpZiBpZD9oYXNfY29udGVudD4gaWQ9IiR7aWR9IjwvI2lmPjwjaWYgc3R5bGU/aGFzX2NvbnRlbnQ+IGNsYXNzPSIke3N0eWxlfSI8LyNpZj48I2lmIHdpZHRoP2hhc19jb250ZW50PiB3aWR0aD0iJHt3aWR0aH0iPC8jaWY+PCNpZiBoZWlnaHQ/aGFzX2NvbnRlbnQ+IGhlaWdodD0iJHtoZWlnaHR9IjwvI2lmPjwjaWYgYm9yZGVyP2hhc19jb250ZW50PiBib3JkZXI9IiR7Ym9yZGVyfSI8LyNpZj4gLz4KKzwvI21hY3JvPgorCis8I21hY3JvIHJlbmRlckxpbmsgbGlua1VybCBwYXJhbWV0ZXJMaXN0IHRhcmdldFdpbmRvdyB1bmlxdWVJdGVtTmFtZSBhY3Rpb25VcmwgbGlua1R5cGU9IiIgaWQ9IiIgc3R5bGU9IiIgbmFtZT0iIiBoZWlnaHQ9IiIgd2lkdGg9IiIgdGV4dD0iIiBpbWdTdHI9IiI+CisgIDwjaWYgbGlua1R5cGU/aGFzX2NvbnRlbnQgJiYgImhpZGRlbi1mb3JtIiA9PSBsaW5rVHlwZT4KKzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIke2FjdGlvblVybH0iPCNpZiB0YXJnZXRXaW5kb3c/aGFzX2NvbnRlbnQ+IHRhcmdldD0iJHt0YXJnZXRXaW5kb3d9IjwvI2lmPiBvbnN1Ym1pdD0iamF2YXNjcmlwdDpzdWJtaXRGb3JtRGlzYWJsZVN1Ym1pdHModGhpcykiIG5hbWU9IiR7dW5pcXVlSXRlbU5hbWV9Ij48I3J0Lz4KKyAgICA8I2xpc3QgcGFyYW1ldGVyTGlzdCBhcyBwYXJhbWV0ZXI+Cis8aW5wdXQgbmFtZT0iJHtwYXJhbWV0ZXIubmFtZX0iIHZhbHVlPSIke3BhcmFtZXRlci52YWx1ZX0iIHR5cGU9ImhpZGRlbiIvPjwjcnQvPgorICAgIDwvI2xpc3Q+Cis8L2Zvcm0+PCNydC8+CisgIDwvI2lmPgorICA8I2lmIHVuaXF1ZUl0ZW1OYW1lP2hhc19jb250ZW50ICYmICJsYXllcmVkLW1vZGFsIiA9PSBsaW5rVHlwZT4KKzxkaXYgaWQ9IiR7dW5pcXVlSXRlbU5hbWV9Ij48L2Rpdj4KKzxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGlkPSIke3VuaXF1ZUl0ZW1OYW1lfV9saW5rIiAKKyAgICA8I2lmIHN0eWxlP2hhc19jb250ZW50PmNsYXNzPSIke3N0eWxlfSI8LyNpZj4+CisgICAgPCNpZiB0ZXh0P2hhc19jb250ZW50PiR7dGV4dH08LyNpZj48L2E+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgZnVuY3Rpb24gJHt1bmlxdWVJdGVtTmFtZX1fZGF0YSgpIHsKKyAgICAgICAgdmFyIGRhdGEgPSAgeworICAgICAgICAgICAgICAgICAgIDwjbGlzdCBwYXJhbWV0ZXJMaXN0IGFzIHBhcmFtZXRlcj4KKyAgICAgICAgICAgICAgICAgICAgIiR7cGFyYW1ldGVyLm5hbWV9IjogIiR7cGFyYW1ldGVyLnZhbHVlfSIsCisgICAgICAgICAgICAgICAgICAgIDwvI2xpc3Q+CisgICAgICAgICAgICAgICAgICAgICJwcmVzZW50YXRpb24iOiAibGF5ZXIiCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGpRdWVyeSgiIyR7dW5pcXVlSXRlbU5hbWV9X2xpbmsiKS5jbGljayhmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgalF1ZXJ5KCIjJHt1bmlxdWVJdGVtTmFtZX0iKS5kaWFsb2coIm9wZW4iKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgalF1ZXJ5KCIjJHt1bmlxdWVJdGVtTmFtZX0iKS5kaWFsb2coeworICAgICAgICAgICAgICAgICBhdXRvT3BlbjogZmFsc2UsCisgICAgICAgICAgICAgICAgIDwjaWYgdGV4dD9oYXNfY29udGVudD50aXRsZTogIiR7dGV4dH0iLDwvI2lmPgorICAgICAgICAgICAgICAgICBoZWlnaHQ6IDwjaWYgaGVpZ2h0ID09ICIiPjYwMDwjZWxzZT4ke2hlaWdodH08LyNpZj4sCisgICAgICAgICAgICAgICAgIHdpZHRoOiA8I2lmIHdpZHRoID09ICIiPjgwMDwjZWxzZT4ke3dpZHRofTwvI2lmPiwKKyAgICAgICAgICAgICAgICAgbW9kYWw6IHRydWUsCisgICAgICAgICAgICAgICAgIGNsb3NlT25Fc2NhcGU6IHRydWUsCisgICAgICAgICAgICAgICAgIG9wZW46IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5hamF4KHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAiJHtsaW5rVXJsfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJQT1NUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogJHt1bmlxdWVJdGVtTmFtZX1fZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7alF1ZXJ5KCIjJHt1bmlxdWVJdGVtTmFtZX0iKS5odG1sKGRhdGEpO30KKyAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICA8L3NjcmlwdD4KKyAgPCNlbHNlPgorPCNpZiAobGlua1R5cGU/aGFzX2NvbnRlbnQgJiYgImhpZGRlbi1mb3JtIiA9PSBsaW5rVHlwZSkgfHwgbGlua1VybD9oYXNfY29udGVudD4KKzxhPCNpZiBpZD9oYXNfY29udGVudD4gaWQ9IiR7aWR9IjwvI2lmPjwjaWYgc3R5bGU/aGFzX2NvbnRlbnQ+IGNsYXNzPSIke3N0eWxlfSI8LyNpZj48I2lmIG5hbWU/aGFzX2NvbnRlbnQ+IG5hbWU9IiR7bmFtZX0iPC8jaWY+PCNpZiB0YXJnZXRXaW5kb3c/aGFzX2NvbnRlbnQ+IHRhcmdldD0iJHt0YXJnZXRXaW5kb3d9IjwvI2lmPiBocmVmPSI8I2lmICJoaWRkZW4tZm9ybSI9PWxpbmtUeXBlPmphdmFzY3JpcHQ6ZG9jdW1lbnQuJHt1bmlxdWVJdGVtTmFtZX0uc3VibWl0KCk8I2Vsc2U+JHtsaW5rVXJsfTwvI2lmPiI+PCNydC8+Cis8LyNpZj4KKzwjaWYgaW1nU3RyP2hhc19jb250ZW50PiR7aW1nU3RyfTwvI2lmPiA8I2lmIHRleHQ/aGFzX2NvbnRlbnQ+JHt0ZXh0fTwvI2lmPjwjcnQvPgorPCNpZiAobGlua1R5cGU/aGFzX2NvbnRlbnQgJiYgImhpZGRlbi1mb3JtIiA9PSBsaW5rVHlwZSkgfHwgbGlua1VybD9oYXNfY29udGVudD48L2E+PCNydC8+PC8jaWY+CisgIDwvI2lmPgorPC8jbWFjcm8+CisKKzwjbWFjcm8gcmVuZGVyTWVudUl0ZW1CZWdpbiBzdHlsZSB0b29sVGlwIGxpbmtTdHIgY29udGFpbnNOZXN0ZWRNZW51cz4KKyAgICAgICAgPGxpPCNpZiBzdHlsZT9oYXNfY29udGVudD4gY2xhc3M9IiR7c3R5bGV9IjwvI2lmPjwjaWYgdG9vbFRpcD9oYXNfY29udGVudD4gdGl0bGU9IiR7dG9vbFRpcH0iPC8jaWY+PjwjaWYgbGlua1N0cj9oYXNfY29udGVudD4ke2xpbmtTdHJ9PC8jaWY+PCNpZiBjb250YWluc05lc3RlZE1lbnVzPjx1bD48LyNpZj48I3J0Lz4KKzwvI21hY3JvPgorCis8I21hY3JvIHJlbmRlck1lbnVJdGVtRW5kIGNvbnRhaW5zTmVzdGVkTWVudXM+Cis8I2lmIGNvbnRhaW5zTmVzdGVkTWVudXM+PC91bD48LyNpZj48L2xpPgorPC8jbWFjcm8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL2JpcnQvd2ViYXBwL2JpcnQvV0VCLUlORi9iaXJ0LnRsZCBiL3BsdWdpbnMvYmlydC93ZWJhcHAvYmlydC9XRUItSU5GL2JpcnQudGxkCmluZGV4IGYwMGQ3ZTguLjUxNGNjNTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvYmlydC93ZWJhcHAvYmlydC9XRUItSU5GL2JpcnQudGxkCisrKyBiL3BsdWdpbnMvYmlydC93ZWJhcHAvYmlydC9XRUItSU5GL2JpcnQudGxkCkBAIC0xLDExNzUgKzEsMTE3NSBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nSVNPLTg4NTktMScgPz4NCi08IURPQ1RZUEUgdGFnbGliDQotICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIg0KLSAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCI+DQotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHRhZ2xpYj4NCi0gICAgPHRsaWItdmVyc2lvbj4xLjA8L3RsaWItdmVyc2lvbj4NCi0gICAgPGpzcC12ZXJzaW9uPjEuMjwvanNwLXZlcnNpb24+DQotICAgIDxzaG9ydC1uYW1lPkJJUlQgVGFnIExpYnJhcnk8L3Nob3J0LW5hbWU+DQotICAgIDx1cmk+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9iaXJ0L3RhZ2xpYnMvYmlydC50bGQ8L3VyaT4NCi0gICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgVGhpcyBUYWcgTGlicmFyeSBtYWtlcyB1c2VyIGRldmVsb3BlIEpTUCB3aXRoIEJJUlQgVmlld2VyIGNvbXBvbmVudCBlYXNpbHkuDQotICAgIDwvZGVzY3JpcHRpb24+DQotICAgIA0KLSAgICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KLSAgICA8IS0tICAgICAgICAgICAgIFZpZXdlciBUYWcgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KLSAgICA8dGFnPg0KLSAgICAgICAgPG5hbWU+dmlld2VyPC9uYW1lPg0KLSAgICAgICAgPHRhZy1jbGFzcz5vcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC50YWdsaWIuVmlld2VyVGFnPC90YWctY2xhc3M+DQotICAgICAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50Pg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgIFRoZSB2aWV3ZXIgdGFnIGlzIHRvIHNwZWNpZnkgaG93IHRvIGltcG9ydCBhbmQgY29udHJvbCBCSVJUIFJlcG9ydCBWaWV3ZXIgaW50byBKU1AgcGFnZS4NCi0gICAgICAgICAgICBUaGlzIHRhZyB3aWxsIHVzZSBBamF4IGZyYW1ld29yayB0byByZXRyaWV2ZSByZXBvcnQgY29udGVudC4NCi0gICAgICAgIDwvZGVzY3JpcHRpb24+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmlkPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgdmlld2VyIGlkLiBJdCBzaG91bGQgYmUgdW5pcXVlLg0KLSAgICAgICAgICAgICAgICBJdCBjYW4gY29udGFpbiBudW1iZXIsbGV0dGVyIG9yIHVuZGVybGluZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+ICAgIA0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5wYXR0ZXJuPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoaWNoIHNlcnZsZXQgcGF0dGVybiB0byBiZSB1c2VkIHRvIHByZXZpZXcgcmVwb3J0Lg0KLSAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlIGlzIGZyYW1lc2V0Lg0KLSAgICAgICAgICAgICAgICAoIGZyYW1lc2V0IG9yIHJ1biApDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5iYXNlVVJMPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIGJhc2UgVVJMIG9mIEJJUlQgdmlld2VyLg0KLSAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIHRoZSBjdXJyZW50IGNvbnRleHQuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnRpdGxlPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZXBvcnQgdGl0bGUgZGlzcGxheWVkIGF0IHRoZSB0b3AuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5pc0hvc3RQYWdlPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHZpZXdlciBvY2N1cGllcyB0aGUgd2hvbGUgcGFnZS4NCi0gICAgICAgICAgICAgICAgRGVmYXVsdCB0byBmYWxzZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+c2Nyb2xsaW5nIDwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNldHMgdGhlIElGcmFtZSBzdHlsZSAic2Nyb2xsaW5nICIuDQotICAgICAgICAgICAgICAgIElmIGlzSG9zdFBhZ2UgaXMgdHJ1ZSwgaWdub3JlIHRoaXMgYXR0cmlidXRlLg0KLSAgICAgICAgICAgICAgICAoIGF1dG8gfCB5ZXMgfCBubyApDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnBvc2l0aW9uPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU2V0cyB0aGUgc3R5bGUgInBvc2l0aW9uIiBvZiByZXBvcnQgY29udGFpbmVyLg0KLSAgICAgICAgICAgICAgICBJZiBpc0hvc3RQYWdlIGlzIHRydWUsIGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4NCi0gICAgICAgICAgICAgICAgKCBzdGF0aWMgfCBhYnNvbHV0ZSB8IGZpeGVkIHwgcmVsYXRpdmUgKQ0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5zdHlsZTwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNldHMgdGhlIHN0eWxlIG9mIHJlcG9ydCBjb250YWluZXIuDQotICAgICAgICAgICAgICAgIElmIGlzSG9zdFBhZ2UgaXMgdHJ1ZSwgaWdub3JlIHRoaXMgYXR0cmlidXRlLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+aGVpZ2h0PC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU2V0cyB0aGUgaGVpZ2h0IG9mIHJlcG9ydCBjb250YWluZXIgaW4gcGl4ZWxzLg0KLSAgICAgICAgICAgICAgICBJZiBpc0hvc3RQYWdlIGlzIHRydWUsIGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPndpZHRoPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU2V0cyB0aGUgd2lkdGggb2YgcmVwb3J0IGNvbnRhaW5lciBpbiBwaXhlbHMuDQotICAgICAgICAgICAgICAgIElmIGlzSG9zdFBhZ2UgaXMgdHJ1ZSwgaWdub3JlIHRoaXMgYXR0cmlidXRlLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+dG9wPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU2V0cyB0aGUgdG9wIG9mIHJlcG9ydCBjb250YWluZXIgaW4gcGl4ZWxzLg0KLSAgICAgICAgICAgICAgICBJZiBpc0hvc3RQYWdlIGlzIHRydWUsIGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmxlZnQ8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICAgU2V0cyB0aGUgbGVmdCBvZiByZXBvcnQgY29udGFpbmVyIGluIHBpeGVscy4NCi0gICAgICAgICAgICAgICAgIElmIGlzSG9zdFBhZ2UgaXMgdHJ1ZSwgaWdub3JlIHRoaXMgYXR0cmlidXRlLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+ZnJhbWVib3JkZXI8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgZGlzcGxheXMgdGhlIGlmcmFtZSBib3JkZXIuDQotICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gbm8uIA0KLSAgICAgICAgICAgICAgICBJZiBpc0hvc3RQYWdlIGlzIHRydWUsIGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4NCi0gICAgICAgICAgICAgICAgKCBZZXMgfCBObyApDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5yZXBvcnREZXNpZ248L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlcG9ydCBkZXNpZ24gZmlsZSBuYW1lLg0KLSAgICAgICAgICAgICAgICAoIEFic29sdXRlIHBhdGgsIHJlbGF0aXZlIHBhdGggb3IgVVJMICkNCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPiAgICAgICAgDQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnJlcG9ydERvY3VtZW50PC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZXBvcnQgZG9jdW1lbnQgZmlsZSBuYW1lLiANCi0gICAgICAgICAgICAgICAgTm90ZWQ6IG9ubHkgc3VwcG9ydCAiZmlsZToiIFVSTCBmb3JtYXQuDQotICAgICAgICAgICAgICAgICggQWJzb2x1dGUgcGF0aCwgcmVsYXRpdmUgcGF0aCBvciBVUkwgKSANCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPiAgICAgICAgDQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnJlcG9ydGxldElkPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBpbnN0YW5jZSBpZCBvZiByZXBvcnRsZXQuDQotICAgICAgICAgICAgICAgIFRoZSAicmVwb3J0RG9jdW1lbnQiIGF0dHJpYnV0ZSBzaG91bGQgYmUgcmVxdWlyZWQuDQotICAgICAgICAgICAgICAgIE5vdGVkOiBmcmFtZXNldCBwYXR0ZXJuIGRvZXNuJ3Qgc3VwcG9ydCByZXBvcnRsZXQuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmJvb2ttYXJrPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSB0YXJnZXRlZCBib29rbWFyayBuYW1lLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgIA0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5sb2NhbGU8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIExvY2FsZSBpbmZvcm1hdGlvbi4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnRpbWVab25lPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIGEgdGltZSB6b25lIGlkLiBGb3IgZXhhbXBsZTogIkFtZXJpY2EvTG9zX0FuZ2VsZXMiIG9yICJHTVQrMSIgb3IgIkdNVCswMTowMCIuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5zdmc8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzdXBwb3J0cyB0aGUgU1ZHIG91dHB1dCBmb3JtYXQgb3Igbm90Lg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+Zm9ybWF0PC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBvdXRwdXQgZm9ybWF0IG9mIHJlcG9ydC4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmVtaXR0ZXJJZDwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZW1pdHRlciBpZCBmb3IgdGhlIHJlcG9ydCBvdXRwdXQuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnBhZ2VPdmVyZmxvdzwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcGFnZSBvdmVyZmxvdyBzZXR0aW5nIGZvciB0aGUgUERGIGZvcm1hdC4NCi0gICAgICAgICAgICAgICAgT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgICAgICAgICAgICAgICAwIGZvciAiYXV0byIsIDEgZm9yICJhY3R1YWwgc2l6ZSIsIDIgZm9yICJmaXQgdG8gcGFnZSIuIA0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgIA0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5ydGw8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzdXBwb3J0cyBydGwgcGFnZSBvciBub3QuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+cGFnZU51bTwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyBvdXRwdXQgcGFnZSBudW1iZXIgd2hlbiByZW5kZXIgZG9jdW1lbnQgZmlsZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnBhZ2VSYW5nZTwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyBwYWdlIHJhbmdlIHdoZW4gcmVuZGVyIGRvY3VtZW50IGZpbGUuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnJlc291cmNlRm9sZGVyPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZWZlcmVuY2VkIHJlc291cmNlIGZvbGRlci4NCi0gICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSBpcyBkZWZpbmVkIGluIHdlYi54bWwuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmZvcmNlT3ZlcndyaXRlRG9jdW1lbnQ8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBmb3JjZXMgdG8gb3ZlcndyaXRlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnQuDQotICAgICAgICAgICAgICAgIElmIGFsbG93UGFnZUJyZWFrIGlzIGZhbHNlLGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4NCi0gICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSBpcyBkZWZpbmVkIGluIHdlYi54bWwuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5zaG93VGl0bGU8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzaG93cyB0aGUgcmVwb3J0IHRpdGxlLg0KLSAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIHRydWUuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnNob3dUb29sQmFyPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc2hvd3MgdGhlIHRvb2xiYXIuDQotICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gdHJ1ZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnNob3dOYXZpZ2F0aW9uQmFyPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc2hvd3MgdGhlIE5hdmlnYXRpb24gQmFyLg0KLSAgICAgICAgICAgICAgICBJZiBhbGxvd1BhZ2VCcmVhayBpcyBmYWxzZSxpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuDQotICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gdHJ1ZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnNob3dQYXJhbWV0ZXJQYWdlPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc2hvdyB0aGUgcGFyYW1ldGVyIGRpYWxvZyBvciBub3QuDQotICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gdHJ1ZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmlzUmVwb3J0bGV0PC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgcmVuZGVyIHJlcG9ydGxldCBieSBib29rbWFyay4NCi0gICAgICAgICAgICAgICAgRGVmYXVsdCB0byBmYWxzZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICANCi0gICAgPC90YWc+DQotDQotICAgICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KLSAgICA8IS0tICAgICAgICAgICAgIFJlcG9ydCBUYWcgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KLSAgICA8dGFnPg0KLSAgICAgICAgPG5hbWU+cmVwb3J0PC9uYW1lPg0KLSAgICAgICAgPHRhZy1jbGFzcz5vcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC50YWdsaWIuUmVwb3J0VGFnPC90YWctY2xhc3M+DQotICAgICAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50Pg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgIFRoZSByZXBvcnQgdGFnIGNhbiBwcm92aWRlIGZhc3QgcmVwb3J0IHByZXZpZXcgd2l0aG91dCBBamF4IGZyYW1ld29yay4gDQotICAgICAgICAgICAgVGhlIHJlcG9ydCBjb250ZW50IGNhbiBiZSBvdXRwdXQgdG8gd2ViIGJyb3dzZXIgZGlyZWN0bHkuDQotICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5pZDwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBjdXJyZW50IHZpZXdlciBpZC4gSXQgc2hvdWxkIGJlIHVuaXF1ZS4NCi0gICAgICAgICAgICAgICAgSXQgY2FuIGNvbnRhaW4gbnVtYmVyLGxldHRlciBvciB1bmRlcmxpbmUuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPiAgICANCi0gICAgICAgICAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmJhc2VVUkw8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYmFzZSBVUkwgb2YgQklSVCB2aWV3ZXIuDQotICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gdGhlIGN1cnJlbnQgY29udGV4dC4NCi0gICAgICAgICAgICAgICAgSWYgcmVwb3J0IGNvbnRhaW5lciBpcyBESVYsIGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICANCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+aXNIb3N0UGFnZTwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSB2aWV3ZXIgb2NjdXBpZXMgdGhlIHdob2xlIHBhZ2UuDQotICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gZmFsc2UuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnNjcm9sbGluZyA8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTZXRzIHRoZSBESVYvSUZyYW1lIHN0eWxlICJzY3JvbGxpbmcgIi4NCi0gICAgICAgICAgICAgICAgSWYgaXNIb3N0UGFnZSBpcyB0cnVlLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuDQotICAgICAgICAgICAgICAgICggYXV0byB8IHllcyB8IG5vICkNCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+cG9zaXRpb248L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTZXRzIHRoZSBzdHlsZSAicG9zaXRpb24iIG9mIHJlcG9ydCBjb250YWluZXIuDQotICAgICAgICAgICAgICAgIElmIGlzSG9zdFBhZ2UgaXMgdHJ1ZSwgaWdub3JlIHRoaXMgYXR0cmlidXRlLg0KLSAgICAgICAgICAgICAgICAoIHN0YXRpYyB8IGFic29sdXRlIHwgZml4ZWQgfCByZWxhdGl2ZSApDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnN0eWxlPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU2V0cyB0aGUgc3R5bGUgb2YgcmVwb3J0IGNvbnRhaW5lci4NCi0gICAgICAgICAgICAgICAgSWYgaXNIb3N0UGFnZSBpcyB0cnVlLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5oZWlnaHQ8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTZXRzIHRoZSBoZWlnaHQgb2YgcmVwb3J0IGNvbnRhaW5lciBpbiBwaXhlbHMuDQotICAgICAgICAgICAgICAgIElmIGlzSG9zdFBhZ2UgaXMgdHJ1ZSwgaWdub3JlIHRoaXMgYXR0cmlidXRlLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+d2lkdGg8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTZXRzIHRoZSB3aWR0aCBvZiByZXBvcnQgY29udGFpbmVyIGluIHBpeGVscy4NCi0gICAgICAgICAgICAgICAgSWYgaXNIb3N0UGFnZSBpcyB0cnVlLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT50b3A8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTZXRzIHRoZSB0b3Agb2YgcmVwb3J0IGNvbnRhaW5lciBpbiBwaXhlbHMuDQotICAgICAgICAgICAgICAgIElmIGlzSG9zdFBhZ2UgaXMgdHJ1ZSwgaWdub3JlIHRoaXMgYXR0cmlidXRlLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+bGVmdDwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgICBTZXRzIHRoZSBsZWZ0IG9mIHJlcG9ydCBjb250YWluZXIgaW4gcGl4ZWxzLg0KLSAgICAgICAgICAgICAgICAgSWYgaXNIb3N0UGFnZSBpcyB0cnVlLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5mcmFtZWJvcmRlcjwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBkaXNwbGF5cyB0aGUgaWZyYW1lIGJvcmRlci4NCi0gICAgICAgICAgICAgICAgIEF2YWlsYWJsZSB3aGVuIHVzZXIgSUZyYW1lLg0KLSAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIG5vLg0KLSAgICAgICAgICAgICAgICAoIFllcyB8IE5vICkNCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnJlcG9ydERlc2lnbjwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IGRlc2lnbiBmaWxlIG5hbWUuDQotICAgICAgICAgICAgICAgICggQWJzb2x1dGUgcGF0aCwgcmVsYXRpdmUgcGF0aCBvciBVUkwgKQ0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+ICAgICAgICANCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+cmVwb3J0RG9jdW1lbnQ8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlcG9ydCBkb2N1bWVudCBmaWxlIG5hbWUuIA0KLSAgICAgICAgICAgICAgICBOb3RlZDogb25seSBzdXBwb3J0ICJmaWxlOiIgVVJMIGZvcm1hdC4NCi0gICAgICAgICAgICAgICAgKCBBYnNvbHV0ZSBwYXRoLCByZWxhdGl2ZSBwYXRoIG9yIFVSTCApIA0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnJlcG9ydGxldElkPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBpbnN0YW5jZSBpZCBvZiByZXBvcnRsZXQuDQotICAgICAgICAgICAgICAgIFRoZSAicmVwb3J0RG9jdW1lbnQiIGF0dHJpYnV0ZSBzaG91bGQgYmUgcmVxdWlyZWQuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmJvb2ttYXJrPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSB0YXJnZXRlZCBib29rbWFyayBuYW1lLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgIA0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5sb2NhbGU8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIExvY2FsZSBpbmZvcm1hdGlvbi4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnRpbWVab25lPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIGEgdGltZSB6b25lIGlkLiBGb3IgZXhhbXBsZTogIkFtZXJpY2EvTG9zX0FuZ2VsZXMiIG9yICJHTVQrMSIgb3IgIkdNVCswMTowMCIuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5zdmc8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzdXBwb3J0cyB0aGUgU1ZHIG91dHB1dCBmb3JtYXQgb3Igbm90Lg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+Zm9ybWF0PC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBvdXRwdXQgZm9ybWF0IG9mIHJlcG9ydC4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICANCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+ZW1pdHRlcklkPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBlbWl0dGVyIGlkIGZvciB0aGUgcmVwb3J0IG91dHB1dC4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnBhZ2VPdmVyZmxvdzwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcGFnZSBvdmVyZmxvdyBzZXR0aW5nIGZvciB0aGUgUERGIGZvcm1hdC4NCi0gICAgICAgICAgICAgICAgT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgICAgICAgICAgICAgICAwIGZvciAiYXV0byIsIDEgZm9yICJhY3R1YWwgc2l6ZSIsIDIgZm9yICJmaXQgdG8gcGFnZSIuIA0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgIA0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5ydGw8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzdXBwb3J0cyBydGwgcGFnZSBvciBub3QuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5zaG93UGFyYW1ldGVyUGFnZTwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNob3cgdGhlIHBhcmFtZXRlciBkaWFsb2cgb3Igbm90Lg0KLSAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIHRydWUuDQotICAgICAgICAgICAgICAgIElmIHJlcG9ydCBjb250YWluZXIgaXMgRElWLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5yZXNvdXJjZUZvbGRlcjwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZSBmb2xkZXIuDQotICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgZGVmaW5lZCBpbiB3ZWIueG1sLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4gICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+cmVwb3J0Q29udGFpbmVyPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmcmFtZSBvciBkaXYgYXMgcmVwb3J0IGNvbnRhaW5lci4NCi0gICAgICAgICAgICAgICAgRGVmYXVsdCB0byBpZnJhbWUuDQotICAgICAgICAgICAgICAgICggaWZyYW1lIHwgZGl2ICkNCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnBhZ2VOdW08L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgb3V0cHV0IHBhZ2UgbnVtYmVyIHdoZW4gcmVuZGVyIGRvY3VtZW50IGZpbGUuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5wYWdlUmFuZ2U8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgcGFnZSByYW5nZSB3aGVuIHJlbmRlciBkb2N1bWVudCBmaWxlLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+aXNSZXBvcnRsZXQ8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciByZW5kZXIgcmVwb3J0bGV0IGJ5IGJvb2ttYXJrLg0KLSAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIGZhbHNlLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgDQotICAgIDwvdGFnPiAgICANCi0gICAgDQotICAgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+DQotICAgIDwhLS0gICAgICAgICAgICAgUmVwb3J0IFBhcmFtZXRlciBUYWcgICAgICAgICAgICAgLS0+DQotICAgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+DQotICAgICA8dGFnPg0KLSAgICAgICAgPG5hbWU+cGFyYW08L25hbWU+DQotICAgICAgICA8dGFnLWNsYXNzPm9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LnRhZ2xpYi5QYXJhbVRhZzwvdGFnLWNsYXNzPg0KLSAgICAgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCi0gICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICBUaGUgcGFyYW0gdGFnIHNwZWNpZmllcyB0aGUgcGFyYW1ldGVycyBkZWZpbmVkIGluIHJlcG9ydCBkZXNpZ24gZmlsZS4NCi0gICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPm5hbWU8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IHBhcmFtZXRlciBuYW1lLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+cGF0dGVybjwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IHBhcmFtZXRlciBwYXR0ZXJuIGZvcm1hdC4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+ICAgICANCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+dmFsdWU8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlcG9ydCBwYXJhbWV0ZXIgdmFsdWUuIElmIGRvZXNuJ3Qgc2V0LCB2YWx1ZSBpcyBudWxsLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+ZGlzcGxheVRleHQ8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlcG9ydCBwYXJhbWV0ZXIgZGlzcGxheSB0ZXh0Lg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+ZGVsaW08L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGRlbGltaXRlciBmb3IgbXVsdGlwbGUgdmFsdWVzLg0KLSAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBwaXBlICJ8Ii4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmlzTG9jYWxlPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlcG9ydCBwYXJhbWV0ZXIgdmFsdWUgaXMgYSBsb2NhbGUvZm9ybWF0IHJlbGF0ZWQgc3RyaW5nLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgIDwvdGFnPiAgIA0KLQ0KLSAgICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KLSAgICA8IS0tICAgICAgICAgICAgIFJlcG9ydCBQYXJhbWV0ZXIgVmFsdWUgVGFnICAgICAgIC0tPg0KLSAgICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KLSAgICAgPHRhZz4NCi0gICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPg0KLSAgICAgICAgPHRhZy1jbGFzcz5vcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC50YWdsaWIuUGFyYW1WYWx1ZVRhZzwvdGFnLWNsYXNzPiAgICAgICAgDQotICAgICAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50Pg0KLSAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgIFRoZSBwYXJhbSB2YWx1ZSB0YWcgc3BlY2lmaWVzIG11bHRpcGxlIHZhbHVlcyBmb3IgYSBnaXZlbiBwYXJhbSB0YWcuDQotICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT52YWx1ZTwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IHBhcmFtZXRlciB2YWx1ZS4gSWYgZG9lc24ndCBzZXQsIHZhbHVlIGlzIG51bGwuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5kaXNwbGF5VGV4dDwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IHBhcmFtZXRlciBkaXNwbGF5IHRleHQuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgPC90YWc+ICAgDQotICAgICANCi0gICAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCi0gICAgPCEtLSAgICAgICAgICAgICBQYXJhbWV0ZXJQYWdlIFRhZyAgICAgICAgICAgICAgICAtLT4NCi0gICAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4NCi0gICAgPHRhZz4NCi0gICAgICAgIDxuYW1lPnBhcmFtZXRlclBhZ2U8L25hbWU+DQotICAgICAgICA8dGFnLWNsYXNzPm9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LnRhZ2xpYi5SZXF1ZXN0ZXJUYWc8L3RhZy1jbGFzcz4NCi0gICAgICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+DQotICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgVGhlIHBhcmFtZXRlclBhZ2UgdGFnIGNhbiBoZWxwIGRldmVsb3BlcnMgdG8gZGlzcGxheSBCSVJUIHBhcmFtZXRlciBwYWdlIG9yIGNyZWF0ZSBhIHVzZXItZGVmaW5lZCBwYXJhbWV0ZXIgcGFnZS4NCi0gICAgICAgICAgICBUaGlzIHRhZyBjYW4gY29sbGVjdCB0aGVzZSBwYXJhbWV0ZXJzIGFuZCBzdWJtaXQgdG8gQklSVCBzZXJ2bGV0IHRvIGhhbmRsZSByZXF1ZXN0Lg0KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIA0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5pZDwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwYXJhbWV0ZXIgcGFnZSBpZC5JdCBzaG91bGQgYmUgdW5pcXVlLg0KLSAgICAgICAgICAgICAgICBJdCBjYW4gY29udGFpbiBudW1iZXIsbGV0dGVyIG9yIHVuZGVybGluZS4gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPiAgICANCi0gICAgICAgIA0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5uYW1lPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwYXJhbWV0ZXIgcGFnZSBuYW1lLiANCi0gICAgICAgICAgICAgICAgSWYgYXR0cmlidXRlICdpc0N1c3RvbScgaXMgdHJ1ZSwgdGhpcyBuYW1lIHNob3VsZCBiZSByZXF1aXJlZCBhbmQgdW5pcXVlLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+aXNDdXN0b208L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB1c2VzIHRoZSB1c2VyLWRlZmluZWQgcGFyYW1ldGVyIHBhZ2UuDQotICAgICAgICAgICAgICAgIElmIGZhbHNlLCB1c2UgdGhlIEJJUlQgcGFyYW1ldGVyIGRpYWxvZy4NCi0gICAgICAgICAgICAgICAgRGVmYXVsdCB0byBmYWxzZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnRpdGxlPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZXBvcnQgdGl0bGUgZGlzcGxheWVkIGF0IHRoZSB0b3AuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmJhc2VVUkw8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYmFzZSBVUkwgb2YgQklSVCB2aWV3ZXIuIA0KLSAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIHRoZSBjdXJyZW50IGNvbnRleHQuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnNjcm9sbGluZyA8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTZXRzIHRoZSBESVYvSUZyYW1lIHN0eWxlICJzY3JvbGxpbmcgIi4NCi0gICAgICAgICAgICAgICAgKCBhdXRvIHwgeWVzIHwgbm8gKQ0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgIA0KLSAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnBvc2l0aW9uPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU2V0cyB0aGUgc3R5bGUgInBvc2l0aW9uIiBvZiBwYXJhbWV0ZXIgcGFnZS4NCi0gICAgICAgICAgICAgICAgKCBzdGF0aWMgfCBhYnNvbHV0ZSB8IGZpeGVkIHwgcmVsYXRpdmUgKQ0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5zdHlsZTwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNldHMgdGhlIHN0eWxlIG9mIHBhcmFtZXRlciBwYWdlLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+aGVpZ2h0PC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU2V0cyB0aGUgaGVpZ2h0IG9mIHBhcmFtZXRlciBwYWdlIGluIHBpeGVscy4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPndpZHRoPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU2V0cyB0aGUgd2lkdGggb2YgcGFyYW1ldGVyIHBhZ2UgaW4gcGl4ZWxzLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+dG9wPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU2V0cyB0aGUgdG9wIG9mIHBhcmFtZXRlciBwYWdlIGluIHBpeGVscy4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmxlZnQ8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICAgU2V0cyB0aGUgbGVmdCBvZiBwYXJhbWV0ZXIgcGFnZSBpbiBwaXhlbHMuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5mcmFtZWJvcmRlcjwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBkaXNwbGF5cyB0aGUgaWZyYW1lIGJvcmRlci4NCi0gICAgICAgICAgICAgICAgRGVmYXVsdCB0byBuby4NCi0gICAgICAgICAgICAgICAgSWYgc2V0ICJpc0N1c3RvbSIgdG8gdHJ1ZSwgaWdub3JlIHRoaXMgYXR0cmlidXRlLg0KLSAgICAgICAgICAgICAgICAoIFllcyB8IE5vICkNCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnJlcG9ydERlc2lnbjwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IGRlc2lnbiBmaWxlIG5hbWUuDQotICAgICAgICAgICAgICAgICggQWJzb2x1dGUgcGF0aCwgcmVsYXRpdmUgcGF0aCBvciBVUkwgKQ0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+ICAgICAgICANCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+cmVwb3J0RG9jdW1lbnQ8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlcG9ydCBkb2N1bWVudCBmaWxlIG5hbWUuIA0KLSAgICAgICAgICAgICAgICBOb3RlZDogb25seSBzdXBwb3J0ICJmaWxlOiIgVVJMIGZvcm1hdC4NCi0gICAgICAgICAgICAgICAgKCBBYnNvbHV0ZSBwYXRoLCByZWxhdGl2ZSBwYXRoIG9yIFVSTCApIA0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+ICAgICAgICANCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+cmVwb3J0bGV0SWQ8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGluc3RhbmNlIGlkIG9mIHJlcG9ydGxldC4NCi0gICAgICAgICAgICAgICAgVGhlICJyZXBvcnREb2N1bWVudCIgYXR0cmlidXRlIHNob3VsZCBiZSByZXF1aXJlZC4NCi0gICAgICAgICAgICAgICAgTm90ZWQ6IGZyYW1lc2V0IHBhdHRlcm4gZG9lc24ndCBzdXBwb3J0IHJlcG9ydGxldC4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5wYXR0ZXJuPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBzZXJ2bGV0IHBhdHRlcm4gZm9yIHJlcXVlc3Qgc3VibWl0LiANCi0gICAgICAgICAgICAgICAgQklSVCBzdXBwb3J0cyB0aHJlZSBwYXR0ZXJuczogZnJhbWVzZXQsIHJ1biBhbmQgcHJldmlldy4gDQotICAgICAgICAgICAgICAgIENhbiByZWZlciB0byB0aGUgdXNlci1kZWZpbmVkIHNlcnZsZXQgcGF0dGVybi4NCi0gICAgICAgICAgICAgICAgRGVmYXVsdCB0byBmcmFtZXNldC4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnRhcmdldDwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdGFyZ2V0IHdpbmRvdyBmb3IgcmVxdWVzdCBzdWJtaXQuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5ib29rbWFyazwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdGFyZ2V0ZWQgYm9va21hcmsgbmFtZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICANCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+bG9jYWxlPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBMb2NhbGUgaW5mb3JtYXRpb24uDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT50aW1lWm9uZTwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIHRpbWUgem9uZSBpZC4gRm9yIGV4YW1wbGU6ICJBbWVyaWNhL0xvc19BbmdlbGVzIiBvciAiR01UKzEiIG9yICJHTVQrMDE6MDAiLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+c3ZnPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc3VwcG9ydHMgdGhlIFNWRyBvdXRwdXQgZm9ybWF0IG9yIG5vdC4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmZvcm1hdDwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCBvZiByZXBvcnQuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmVtaXR0ZXJJZDwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZW1pdHRlciBpZCBmb3IgdGhlIHJlcG9ydCBvdXRwdXQuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnBhZ2VPdmVyZmxvdzwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcGFnZSBvdmVyZmxvdyBzZXR0aW5nIGZvciB0aGUgUERGIGZvcm1hdC4NCi0gICAgICAgICAgICAgICAgT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KLSAgICAgICAgICAgICAgICAwIGZvciAiYXV0byIsIDEgZm9yICJhY3R1YWwgc2l6ZSIsIDIgZm9yICJmaXQgdG8gcGFnZSIuIA0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+cnRsPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc3VwcG9ydHMgcnRsIHBhZ2Ugb3Igbm90Lg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgDQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnJlc291cmNlRm9sZGVyPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZWZlcmVuY2VkIHJlc291cmNlIGZvbGRlci4NCi0gICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSBpcyBkZWZpbmVkIGluIHdlYi54bWwuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPiAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmZvcmNlT3ZlcndyaXRlRG9jdW1lbnQ8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBmb3JjZXMgdG8gb3ZlcndyaXRlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnQuDQotICAgICAgICAgICAgICAgIElmIGFsbG93UGFnZUJyZWFrIGlzIGZhbHNlLGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4NCi0gICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSBpcyBkZWZpbmVkIGluIHdlYi54bWwuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLQ0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5zaG93VGl0bGU8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCi0gICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+DQotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzaG93cyB0aGUgcmVwb3J0IHRpdGxlLg0KLSAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIHRydWUuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICANCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnNob3dUb29sQmFyPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc2hvd3MgdGhlIHRvb2xiYXIuDQotICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gdHJ1ZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnNob3dOYXZpZ2F0aW9uQmFyPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc2hvd3MgdGhlIE5hdmlnYXRpb24gQmFyLg0KLSAgICAgICAgICAgICAgICBJZiBhbGxvd1BhZ2VCcmVhayBpcyBmYWxzZSxpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuDQotICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gdHJ1ZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPmlzUmVwb3J0bGV0PC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgcmVuZGVyIHJlcG9ydGxldCBieSBib29rbWFyay4NCi0gICAgICAgICAgICAgICAgRGVmYXVsdCB0byBmYWxzZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIDwvdGFnPg0KLQ0KLSAgICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KLSAgICA8IS0tICAgICAgUmVwb3J0IFBhcmFtZXRlciBEZWZpbml0aW9uIFRhZyAgICAgICAgIC0tPg0KLSAgICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KLSAgICAgPHRhZz4NCi0gICAgICAgIDxuYW1lPnBhcmFtRGVmPC9uYW1lPg0KLSAgICAgICAgPHRhZy1jbGFzcz5vcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC50YWdsaWIuUGFyYW1EZWZUYWc8L3RhZy1jbGFzcz4NCi0gICAgICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+DQotICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgVGhlIHBhcmFtIHRhZyBpcyB1c2VkIHRvIGdlbmVyYXRlIGh0bWwgY29kZSBmb3IgZGVmaW5lZCBwYXJhbWV0ZXIgaW4gUGFyYW1ldGVyUGFnZSB0YWcuDQotICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5pZDwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBpZCBvZiBwYXJhbWV0ZXIgY29udHJvbC5JdCBzaG91bGQgYmUgdW5pcXVlLg0KLSAgICAgICAgICAgICAgICBJdCBjYW4gY29udGFpbiBudW1iZXIsbGV0dGVyIG9yIHVuZGVybGluZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPm5hbWU8L25hbWU+DQotICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IHBhcmFtZXRlciBuYW1lLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG5hbWU+cGF0dGVybjwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IHBhcmFtZXRlciBwYXR0ZXJuIGZvcm1hdC4NCi0gICAgICAgICAgICAgICAgSXQgaXMgdXNlZCB0byBwYXJzZSBkZWZpbmVkIHBhcmFtZXRlciB2YWx1ZSBzdHJpbmcuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPiAgICAgDQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZXBvcnQgcGFyYW1ldGVyIHZhbHVlLiBJZiBkb2Vzbid0IHNldCwgdXNlIGRlZmF1bHQgdmFsdWUuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5kaXNwbGF5VGV4dDwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IHBhcmFtZXRlciBkaXNwbGF5IHRleHQuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5pc0xvY2FsZTwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXBvcnQgcGFyYW1ldGVyIHZhbHVlIGlzIGEgbG9jYWxlL2Zvcm1hdCByZWxhdGVkIHN0cmluZy4NCi0gICAgICAgICAgICAgICAgSXQgaXMgdXNlZCB0byBwYXJzZSBkZWZpbmVkIHBhcmFtZXRlciB2YWx1ZSBzdHJpbmcuDQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT50aXRsZTwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdGl0bGUgYXR0cmlidXRlIG9mIHBhcmFtZXRlciBjb250cm9sLg0KLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICA8L2F0dHJpYnV0ZT4gICAgICAgIA0KLSAgICAgICAgPGF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bmFtZT5jc3NDbGFzczwvbmFtZT4NCi0gICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KLSAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4NCi0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgY3NzIGNsYXNzIGF0dHJpYnV0ZSBvZiBwYXJhbWV0ZXIgY29udHJvbC4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDxuYW1lPnN0eWxlPC9uYW1lPg0KLSAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQotICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPg0KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwYXJhbWV0ZXIgY29udHJvbCBzdHlsZS4NCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPC9hdHRyaWJ1dGU+ICAgICAgICANCi0gICAgIDwvdGFnPiAgICAgICAgICAgICAgICANCis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdJU08tODg1OS0xJyA/PgorPCFET0NUWVBFIHRhZ2xpYgorICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIgorICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIj4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0YWdsaWI+CisgICAgPHRsaWItdmVyc2lvbj4xLjA8L3RsaWItdmVyc2lvbj4KKyAgICA8anNwLXZlcnNpb24+MS4yPC9qc3AtdmVyc2lvbj4KKyAgICA8c2hvcnQtbmFtZT5CSVJUIFRhZyBMaWJyYXJ5PC9zaG9ydC1uYW1lPgorICAgIDx1cmk+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9iaXJ0L3RhZ2xpYnMvYmlydC50bGQ8L3VyaT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoaXMgVGFnIExpYnJhcnkgbWFrZXMgdXNlciBkZXZlbG9wZSBKU1Agd2l0aCBCSVJUIFZpZXdlciBjb21wb25lbnQgZWFzaWx5LgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgCisgICAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKyAgICA8IS0tICAgICAgICAgICAgIFZpZXdlciBUYWcgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+CisgICAgPHRhZz4KKyAgICAgICAgPG5hbWU+dmlld2VyPC9uYW1lPgorICAgICAgICA8dGFnLWNsYXNzPm9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LnRhZ2xpYi5WaWV3ZXJUYWc8L3RhZy1jbGFzcz4KKyAgICAgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgVGhlIHZpZXdlciB0YWcgaXMgdG8gc3BlY2lmeSBob3cgdG8gaW1wb3J0IGFuZCBjb250cm9sIEJJUlQgUmVwb3J0IFZpZXdlciBpbnRvIEpTUCBwYWdlLgorICAgICAgICAgICAgVGhpcyB0YWcgd2lsbCB1c2UgQWpheCBmcmFtZXdvcmsgdG8gcmV0cmlldmUgcmVwb3J0IGNvbnRlbnQuCisgICAgICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmlkPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgY3VycmVudCB2aWV3ZXIgaWQuIEl0IHNob3VsZCBiZSB1bmlxdWUuCisgICAgICAgICAgICAgICAgSXQgY2FuIGNvbnRhaW4gbnVtYmVyLGxldHRlciBvciB1bmRlcmxpbmUuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4gICAgCisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnBhdHRlcm48L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGljaCBzZXJ2bGV0IHBhdHRlcm4gdG8gYmUgdXNlZCB0byBwcmV2aWV3IHJlcG9ydC4KKyAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlIGlzIGZyYW1lc2V0LgorICAgICAgICAgICAgICAgICggZnJhbWVzZXQgb3IgcnVuICkKKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5iYXNlVVJMPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYmFzZSBVUkwgb2YgQklSVCB2aWV3ZXIuCisgICAgICAgICAgICAgICAgRGVmYXVsdCB0byB0aGUgY3VycmVudCBjb250ZXh0LgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+dGl0bGU8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IHRpdGxlIGRpc3BsYXllZCBhdCB0aGUgdG9wLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmlzSG9zdFBhZ2U8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSB2aWV3ZXIgb2NjdXBpZXMgdGhlIHdob2xlIHBhZ2UuCisgICAgICAgICAgICAgICAgRGVmYXVsdCB0byBmYWxzZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnNjcm9sbGluZyA8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNldHMgdGhlIElGcmFtZSBzdHlsZSAic2Nyb2xsaW5nICIuCisgICAgICAgICAgICAgICAgSWYgaXNIb3N0UGFnZSBpcyB0cnVlLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuCisgICAgICAgICAgICAgICAgKCBhdXRvIHwgeWVzIHwgbm8gKQorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+cG9zaXRpb248L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNldHMgdGhlIHN0eWxlICJwb3NpdGlvbiIgb2YgcmVwb3J0IGNvbnRhaW5lci4KKyAgICAgICAgICAgICAgICBJZiBpc0hvc3RQYWdlIGlzIHRydWUsIGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAgICAoIHN0YXRpYyB8IGFic29sdXRlIHwgZml4ZWQgfCByZWxhdGl2ZSApCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5zdHlsZTwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU2V0cyB0aGUgc3R5bGUgb2YgcmVwb3J0IGNvbnRhaW5lci4KKyAgICAgICAgICAgICAgICBJZiBpc0hvc3RQYWdlIGlzIHRydWUsIGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5oZWlnaHQ8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNldHMgdGhlIGhlaWdodCBvZiByZXBvcnQgY29udGFpbmVyIGluIHBpeGVscy4KKyAgICAgICAgICAgICAgICBJZiBpc0hvc3RQYWdlIGlzIHRydWUsIGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT53aWR0aDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU2V0cyB0aGUgd2lkdGggb2YgcmVwb3J0IGNvbnRhaW5lciBpbiBwaXhlbHMuCisgICAgICAgICAgICAgICAgSWYgaXNIb3N0UGFnZSBpcyB0cnVlLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+dG9wPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTZXRzIHRoZSB0b3Agb2YgcmVwb3J0IGNvbnRhaW5lciBpbiBwaXhlbHMuCisgICAgICAgICAgICAgICAgSWYgaXNIb3N0UGFnZSBpcyB0cnVlLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+bGVmdDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgIFNldHMgdGhlIGxlZnQgb2YgcmVwb3J0IGNvbnRhaW5lciBpbiBwaXhlbHMuCisgICAgICAgICAgICAgICAgIElmIGlzSG9zdFBhZ2UgaXMgdHJ1ZSwgaWdub3JlIHRoaXMgYXR0cmlidXRlLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmZyYW1lYm9yZGVyPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgZGlzcGxheXMgdGhlIGlmcmFtZSBib3JkZXIuCisgICAgICAgICAgICAgICAgRGVmYXVsdCB0byBuby4gCisgICAgICAgICAgICAgICAgSWYgaXNIb3N0UGFnZSBpcyB0cnVlLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuCisgICAgICAgICAgICAgICAgKCBZZXMgfCBObyApCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+cmVwb3J0RGVzaWduPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlcG9ydCBkZXNpZ24gZmlsZSBuYW1lLgorICAgICAgICAgICAgICAgICggQWJzb2x1dGUgcGF0aCwgcmVsYXRpdmUgcGF0aCBvciBVUkwgKQorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgCisgICAgICAgIDwvYXR0cmlidXRlPiAgICAgICAgCisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnJlcG9ydERvY3VtZW50PC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlcG9ydCBkb2N1bWVudCBmaWxlIG5hbWUuIAorICAgICAgICAgICAgICAgIE5vdGVkOiBvbmx5IHN1cHBvcnQgImZpbGU6IiBVUkwgZm9ybWF0LgorICAgICAgICAgICAgICAgICggQWJzb2x1dGUgcGF0aCwgcmVsYXRpdmUgcGF0aCBvciBVUkwgKSAKKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4gICAgICAgIAorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5yZXBvcnRsZXRJZDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBpbnN0YW5jZSBpZCBvZiByZXBvcnRsZXQuCisgICAgICAgICAgICAgICAgVGhlICJyZXBvcnREb2N1bWVudCIgYXR0cmlidXRlIHNob3VsZCBiZSByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICBOb3RlZDogZnJhbWVzZXQgcGF0dGVybiBkb2Vzbid0IHN1cHBvcnQgcmVwb3J0bGV0LgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+Ym9va21hcms8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdGFyZ2V0ZWQgYm9va21hcmsgbmFtZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmxvY2FsZTwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBMb2NhbGUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+dGltZVpvbmU8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIHRpbWUgem9uZSBpZC4gRm9yIGV4YW1wbGU6ICJBbWVyaWNhL0xvc19BbmdlbGVzIiBvciAiR01UKzEiIG9yICJHTVQrMDE6MDAiLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnN2ZzwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc3VwcG9ydHMgdGhlIFNWRyBvdXRwdXQgZm9ybWF0IG9yIG5vdC4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5mb3JtYXQ8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCBvZiByZXBvcnQuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+ZW1pdHRlcklkPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGVtaXR0ZXIgaWQgZm9yIHRoZSByZXBvcnQgb3V0cHV0LgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+cGFnZU92ZXJmbG93PC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHBhZ2Ugb3ZlcmZsb3cgc2V0dGluZyBmb3IgdGhlIFBERiBmb3JtYXQuCisgICAgICAgICAgICAgICAgT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgICAgICAgICAgICAgIDAgZm9yICJhdXRvIiwgMSBmb3IgImFjdHVhbCBzaXplIiwgMiBmb3IgImZpdCB0byBwYWdlIi4gCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5ydGw8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHN1cHBvcnRzIHJ0bCBwYWdlIG9yIG5vdC4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+cGFnZU51bTwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIG91dHB1dCBwYWdlIG51bWJlciB3aGVuIHJlbmRlciBkb2N1bWVudCBmaWxlLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnBhZ2VSYW5nZTwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHBhZ2UgcmFuZ2Ugd2hlbiByZW5kZXIgZG9jdW1lbnQgZmlsZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnJlc291cmNlRm9sZGVyPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2UgZm9sZGVyLgorICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgZGVmaW5lZCBpbiB3ZWIueG1sLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+Zm9yY2VPdmVyd3JpdGVEb2N1bWVudDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgZm9yY2VzIHRvIG92ZXJ3cml0ZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50LgorICAgICAgICAgICAgICAgIElmIGFsbG93UGFnZUJyZWFrIGlzIGZhbHNlLGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlIGlzIGRlZmluZWQgaW4gd2ViLnhtbC4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5zaG93VGl0bGU8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNob3dzIHRoZSByZXBvcnQgdGl0bGUuCisgICAgICAgICAgICAgICAgRGVmYXVsdCB0byB0cnVlLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+c2hvd1Rvb2xCYXI8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNob3dzIHRoZSB0b29sYmFyLgorICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gdHJ1ZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5zaG93TmF2aWdhdGlvbkJhcjwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc2hvd3MgdGhlIE5hdmlnYXRpb24gQmFyLgorICAgICAgICAgICAgICAgIElmIGFsbG93UGFnZUJyZWFrIGlzIGZhbHNlLGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIHRydWUuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+c2hvd1BhcmFtZXRlclBhZ2U8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNob3cgdGhlIHBhcmFtZXRlciBkaWFsb2cgb3Igbm90LgorICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gdHJ1ZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5pc1JlcG9ydGxldDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgcmVuZGVyIHJlcG9ydGxldCBieSBib29rbWFyay4KKyAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIGZhbHNlLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIAorICAgIDwvdGFnPgorCisgICAgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+CisgICAgPCEtLSAgICAgICAgICAgICBSZXBvcnQgVGFnICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPgorICAgIDx0YWc+CisgICAgICAgIDxuYW1lPnJlcG9ydDwvbmFtZT4KKyAgICAgICAgPHRhZy1jbGFzcz5vcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC50YWdsaWIuUmVwb3J0VGFnPC90YWctY2xhc3M+CisgICAgICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgIFRoZSByZXBvcnQgdGFnIGNhbiBwcm92aWRlIGZhc3QgcmVwb3J0IHByZXZpZXcgd2l0aG91dCBBamF4IGZyYW1ld29yay4gCisgICAgICAgICAgICBUaGUgcmVwb3J0IGNvbnRlbnQgY2FuIGJlIG91dHB1dCB0byB3ZWIgYnJvd3NlciBkaXJlY3RseS4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+aWQ8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBjdXJyZW50IHZpZXdlciBpZC4gSXQgc2hvdWxkIGJlIHVuaXF1ZS4KKyAgICAgICAgICAgICAgICBJdCBjYW4gY29udGFpbiBudW1iZXIsbGV0dGVyIG9yIHVuZGVybGluZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPiAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmJhc2VVUkw8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyBiYXNlIFVSTCBvZiBCSVJUIHZpZXdlci4KKyAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIHRoZSBjdXJyZW50IGNvbnRleHQuCisgICAgICAgICAgICAgICAgSWYgcmVwb3J0IGNvbnRhaW5lciBpcyBESVYsIGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmlzSG9zdFBhZ2U8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSB2aWV3ZXIgb2NjdXBpZXMgdGhlIHdob2xlIHBhZ2UuCisgICAgICAgICAgICAgICAgRGVmYXVsdCB0byBmYWxzZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnNjcm9sbGluZyA8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNldHMgdGhlIERJVi9JRnJhbWUgc3R5bGUgInNjcm9sbGluZyAiLgorICAgICAgICAgICAgICAgIElmIGlzSG9zdFBhZ2UgaXMgdHJ1ZSwgaWdub3JlIHRoaXMgYXR0cmlidXRlLgorICAgICAgICAgICAgICAgICggYXV0byB8IHllcyB8IG5vICkKKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnBvc2l0aW9uPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTZXRzIHRoZSBzdHlsZSAicG9zaXRpb24iIG9mIHJlcG9ydCBjb250YWluZXIuCisgICAgICAgICAgICAgICAgSWYgaXNIb3N0UGFnZSBpcyB0cnVlLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuCisgICAgICAgICAgICAgICAgKCBzdGF0aWMgfCBhYnNvbHV0ZSB8IGZpeGVkIHwgcmVsYXRpdmUgKQorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+c3R5bGU8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNldHMgdGhlIHN0eWxlIG9mIHJlcG9ydCBjb250YWluZXIuCisgICAgICAgICAgICAgICAgSWYgaXNIb3N0UGFnZSBpcyB0cnVlLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+aGVpZ2h0PC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTZXRzIHRoZSBoZWlnaHQgb2YgcmVwb3J0IGNvbnRhaW5lciBpbiBwaXhlbHMuCisgICAgICAgICAgICAgICAgSWYgaXNIb3N0UGFnZSBpcyB0cnVlLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+d2lkdGg8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNldHMgdGhlIHdpZHRoIG9mIHJlcG9ydCBjb250YWluZXIgaW4gcGl4ZWxzLgorICAgICAgICAgICAgICAgIElmIGlzSG9zdFBhZ2UgaXMgdHJ1ZSwgaWdub3JlIHRoaXMgYXR0cmlidXRlLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnRvcDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU2V0cyB0aGUgdG9wIG9mIHJlcG9ydCBjb250YWluZXIgaW4gcGl4ZWxzLgorICAgICAgICAgICAgICAgIElmIGlzSG9zdFBhZ2UgaXMgdHJ1ZSwgaWdub3JlIHRoaXMgYXR0cmlidXRlLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmxlZnQ8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgICBTZXRzIHRoZSBsZWZ0IG9mIHJlcG9ydCBjb250YWluZXIgaW4gcGl4ZWxzLgorICAgICAgICAgICAgICAgICBJZiBpc0hvc3RQYWdlIGlzIHRydWUsIGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5mcmFtZWJvcmRlcjwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIGRpc3BsYXlzIHRoZSBpZnJhbWUgYm9yZGVyLgorICAgICAgICAgICAgICAgICBBdmFpbGFibGUgd2hlbiB1c2VyIElGcmFtZS4KKyAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIG5vLgorICAgICAgICAgICAgICAgICggWWVzIHwgTm8gKQorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnJlcG9ydERlc2lnbjwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZXBvcnQgZGVzaWduIGZpbGUgbmFtZS4KKyAgICAgICAgICAgICAgICAoIEFic29sdXRlIHBhdGgsIHJlbGF0aXZlIHBhdGggb3IgVVJMICkKKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4gICAgICAgIAorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5yZXBvcnREb2N1bWVudDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZXBvcnQgZG9jdW1lbnQgZmlsZSBuYW1lLiAKKyAgICAgICAgICAgICAgICBOb3RlZDogb25seSBzdXBwb3J0ICJmaWxlOiIgVVJMIGZvcm1hdC4KKyAgICAgICAgICAgICAgICAoIEFic29sdXRlIHBhdGgsIHJlbGF0aXZlIHBhdGggb3IgVVJMICkgCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnJlcG9ydGxldElkPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGluc3RhbmNlIGlkIG9mIHJlcG9ydGxldC4KKyAgICAgICAgICAgICAgICBUaGUgInJlcG9ydERvY3VtZW50IiBhdHRyaWJ1dGUgc2hvdWxkIGJlIHJlcXVpcmVkLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+Ym9va21hcms8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdGFyZ2V0ZWQgYm9va21hcmsgbmFtZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmxvY2FsZTwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBMb2NhbGUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+dGltZVpvbmU8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIHRpbWUgem9uZSBpZC4gRm9yIGV4YW1wbGU6ICJBbWVyaWNhL0xvc19BbmdlbGVzIiBvciAiR01UKzEiIG9yICJHTVQrMDE6MDAiLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnN2ZzwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc3VwcG9ydHMgdGhlIFNWRyBvdXRwdXQgZm9ybWF0IG9yIG5vdC4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5mb3JtYXQ8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCBvZiByZXBvcnQuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5lbWl0dGVySWQ8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZW1pdHRlciBpZCBmb3IgdGhlIHJlcG9ydCBvdXRwdXQuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+cGFnZU92ZXJmbG93PC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHBhZ2Ugb3ZlcmZsb3cgc2V0dGluZyBmb3IgdGhlIFBERiBmb3JtYXQuCisgICAgICAgICAgICAgICAgT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgICAgICAgICAgICAgIDAgZm9yICJhdXRvIiwgMSBmb3IgImFjdHVhbCBzaXplIiwgMiBmb3IgImZpdCB0byBwYWdlIi4gCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5ydGw8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHN1cHBvcnRzIHJ0bCBwYWdlIG9yIG5vdC4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5zaG93UGFyYW1ldGVyUGFnZTwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc2hvdyB0aGUgcGFyYW1ldGVyIGRpYWxvZyBvciBub3QuCisgICAgICAgICAgICAgICAgRGVmYXVsdCB0byB0cnVlLgorICAgICAgICAgICAgICAgIElmIHJlcG9ydCBjb250YWluZXIgaXMgRElWLCBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+cmVzb3VyY2VGb2xkZXI8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZSBmb2xkZXIuCisgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSBpcyBkZWZpbmVkIGluIHdlYi54bWwuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4gICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+cmVwb3J0Q29udGFpbmVyPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWZyYW1lIG9yIGRpdiBhcyByZXBvcnQgY29udGFpbmVyLgorICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gaWZyYW1lLgorICAgICAgICAgICAgICAgICggaWZyYW1lIHwgZGl2ICkKKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5wYWdlTnVtPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgb3V0cHV0IHBhZ2UgbnVtYmVyIHdoZW4gcmVuZGVyIGRvY3VtZW50IGZpbGUuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+cGFnZVJhbmdlPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgcGFnZSByYW5nZSB3aGVuIHJlbmRlciBkb2N1bWVudCBmaWxlLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmlzUmVwb3J0bGV0PC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciByZW5kZXIgcmVwb3J0bGV0IGJ5IGJvb2ttYXJrLgorICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gZmFsc2UuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAKKyAgICA8L3RhZz4gICAgCisgICAgCisgICAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKyAgICA8IS0tICAgICAgICAgICAgIFJlcG9ydCBQYXJhbWV0ZXIgVGFnICAgICAgICAgICAgIC0tPgorICAgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+CisgICAgIDx0YWc+CisgICAgICAgIDxuYW1lPnBhcmFtPC9uYW1lPgorICAgICAgICA8dGFnLWNsYXNzPm9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LnRhZ2xpYi5QYXJhbVRhZzwvdGFnLWNsYXNzPgorICAgICAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICBUaGUgcGFyYW0gdGFnIHNwZWNpZmllcyB0aGUgcGFyYW1ldGVycyBkZWZpbmVkIGluIHJlcG9ydCBkZXNpZ24gZmlsZS4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPm5hbWU8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZXBvcnQgcGFyYW1ldGVyIG5hbWUuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnBhdHRlcm48L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IHBhcmFtZXRlciBwYXR0ZXJuIGZvcm1hdC4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPiAgICAgCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT52YWx1ZTwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZXBvcnQgcGFyYW1ldGVyIHZhbHVlLiBJZiBkb2Vzbid0IHNldCwgdmFsdWUgaXMgbnVsbC4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+ZGlzcGxheVRleHQ8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IHBhcmFtZXRlciBkaXNwbGF5IHRleHQuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmRlbGltPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGRlbGltaXRlciBmb3IgbXVsdGlwbGUgdmFsdWVzLgorICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHBpcGUgInwiLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5pc0xvY2FsZTwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlcG9ydCBwYXJhbWV0ZXIgdmFsdWUgaXMgYSBsb2NhbGUvZm9ybWF0IHJlbGF0ZWQgc3RyaW5nLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgIDwvdGFnPiAgIAorCisgICAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKyAgICA8IS0tICAgICAgICAgICAgIFJlcG9ydCBQYXJhbWV0ZXIgVmFsdWUgVGFnICAgICAgIC0tPgorICAgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+CisgICAgIDx0YWc+CisgICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPgorICAgICAgICA8dGFnLWNsYXNzPm9yZy5lY2xpcHNlLmJpcnQucmVwb3J0LnRhZ2xpYi5QYXJhbVZhbHVlVGFnPC90YWctY2xhc3M+ICAgICAgICAKKyAgICAgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgVGhlIHBhcmFtIHZhbHVlIHRhZyBzcGVjaWZpZXMgbXVsdGlwbGUgdmFsdWVzIGZvciBhIGdpdmVuIHBhcmFtIHRhZy4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnZhbHVlPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlcG9ydCBwYXJhbWV0ZXIgdmFsdWUuIElmIGRvZXNuJ3Qgc2V0LCB2YWx1ZSBpcyBudWxsLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5kaXNwbGF5VGV4dDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZXBvcnQgcGFyYW1ldGVyIGRpc3BsYXkgdGV4dC4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICA8L3RhZz4gICAKKyAgICAgCisgICAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKyAgICA8IS0tICAgICAgICAgICAgIFBhcmFtZXRlclBhZ2UgVGFnICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+CisgICAgPHRhZz4KKyAgICAgICAgPG5hbWU+cGFyYW1ldGVyUGFnZTwvbmFtZT4KKyAgICAgICAgPHRhZy1jbGFzcz5vcmcuZWNsaXBzZS5iaXJ0LnJlcG9ydC50YWdsaWIuUmVxdWVzdGVyVGFnPC90YWctY2xhc3M+CisgICAgICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJQYWdlIHRhZyBjYW4gaGVscCBkZXZlbG9wZXJzIHRvIGRpc3BsYXkgQklSVCBwYXJhbWV0ZXIgcGFnZSBvciBjcmVhdGUgYSB1c2VyLWRlZmluZWQgcGFyYW1ldGVyIHBhZ2UuCisgICAgICAgICAgICBUaGlzIHRhZyBjYW4gY29sbGVjdCB0aGVzZSBwYXJhbWV0ZXJzIGFuZCBzdWJtaXQgdG8gQklSVCBzZXJ2bGV0IHRvIGhhbmRsZSByZXF1ZXN0LgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmlkPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcGFyYW1ldGVyIHBhZ2UgaWQuSXQgc2hvdWxkIGJlIHVuaXF1ZS4KKyAgICAgICAgICAgICAgICBJdCBjYW4gY29udGFpbiBudW1iZXIsbGV0dGVyIG9yIHVuZGVybGluZS4gICAgICAgICAgICAgICAgCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4gICAgCisgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwYXJhbWV0ZXIgcGFnZSBuYW1lLiAKKyAgICAgICAgICAgICAgICBJZiBhdHRyaWJ1dGUgJ2lzQ3VzdG9tJyBpcyB0cnVlLCB0aGlzIG5hbWUgc2hvdWxkIGJlIHJlcXVpcmVkIGFuZCB1bmlxdWUuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+aXNDdXN0b208L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHVzZXMgdGhlIHVzZXItZGVmaW5lZCBwYXJhbWV0ZXIgcGFnZS4KKyAgICAgICAgICAgICAgICBJZiBmYWxzZSwgdXNlIHRoZSBCSVJUIHBhcmFtZXRlciBkaWFsb2cuCisgICAgICAgICAgICAgICAgRGVmYXVsdCB0byBmYWxzZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT50aXRsZTwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZXBvcnQgdGl0bGUgZGlzcGxheWVkIGF0IHRoZSB0b3AuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5iYXNlVVJMPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYmFzZSBVUkwgb2YgQklSVCB2aWV3ZXIuIAorICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gdGhlIGN1cnJlbnQgY29udGV4dC4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnNjcm9sbGluZyA8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNldHMgdGhlIERJVi9JRnJhbWUgc3R5bGUgInNjcm9sbGluZyAiLgorICAgICAgICAgICAgICAgICggYXV0byB8IHllcyB8IG5vICkKKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAKKyAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+cG9zaXRpb248L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNldHMgdGhlIHN0eWxlICJwb3NpdGlvbiIgb2YgcGFyYW1ldGVyIHBhZ2UuCisgICAgICAgICAgICAgICAgKCBzdGF0aWMgfCBhYnNvbHV0ZSB8IGZpeGVkIHwgcmVsYXRpdmUgKQorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+c3R5bGU8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNldHMgdGhlIHN0eWxlIG9mIHBhcmFtZXRlciBwYWdlLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmhlaWdodDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU2V0cyB0aGUgaGVpZ2h0IG9mIHBhcmFtZXRlciBwYWdlIGluIHBpeGVscy4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT53aWR0aDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU2V0cyB0aGUgd2lkdGggb2YgcGFyYW1ldGVyIHBhZ2UgaW4gcGl4ZWxzLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnRvcDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU2V0cyB0aGUgdG9wIG9mIHBhcmFtZXRlciBwYWdlIGluIHBpeGVscy4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5sZWZ0PC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICAgU2V0cyB0aGUgbGVmdCBvZiBwYXJhbWV0ZXIgcGFnZSBpbiBwaXhlbHMuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+ZnJhbWVib3JkZXI8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBkaXNwbGF5cyB0aGUgaWZyYW1lIGJvcmRlci4KKyAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIG5vLgorICAgICAgICAgICAgICAgIElmIHNldCAiaXNDdXN0b20iIHRvIHRydWUsIGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAgICAoIFllcyB8IE5vICkKKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5yZXBvcnREZXNpZ248L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IGRlc2lnbiBmaWxlIG5hbWUuCisgICAgICAgICAgICAgICAgKCBBYnNvbHV0ZSBwYXRoLCByZWxhdGl2ZSBwYXRoIG9yIFVSTCApCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+ICAgICAgICAKKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+cmVwb3J0RG9jdW1lbnQ8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IGRvY3VtZW50IGZpbGUgbmFtZS4gCisgICAgICAgICAgICAgICAgTm90ZWQ6IG9ubHkgc3VwcG9ydCAiZmlsZToiIFVSTCBmb3JtYXQuCisgICAgICAgICAgICAgICAgKCBBYnNvbHV0ZSBwYXRoLCByZWxhdGl2ZSBwYXRoIG9yIFVSTCApIAorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgCisgICAgICAgIDwvYXR0cmlidXRlPiAgICAgICAgCisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnJlcG9ydGxldElkPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGluc3RhbmNlIGlkIG9mIHJlcG9ydGxldC4KKyAgICAgICAgICAgICAgICBUaGUgInJlcG9ydERvY3VtZW50IiBhdHRyaWJ1dGUgc2hvdWxkIGJlIHJlcXVpcmVkLgorICAgICAgICAgICAgICAgIE5vdGVkOiBmcmFtZXNldCBwYXR0ZXJuIGRvZXNuJ3Qgc3VwcG9ydCByZXBvcnRsZXQuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnBhdHRlcm48L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgc2VydmxldCBwYXR0ZXJuIGZvciByZXF1ZXN0IHN1Ym1pdC4gCisgICAgICAgICAgICAgICAgQklSVCBzdXBwb3J0cyB0aHJlZSBwYXR0ZXJuczogZnJhbWVzZXQsIHJ1biBhbmQgcHJldmlldy4gCisgICAgICAgICAgICAgICAgQ2FuIHJlZmVyIHRvIHRoZSB1c2VyLWRlZmluZWQgc2VydmxldCBwYXR0ZXJuLgorICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gZnJhbWVzZXQuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+dGFyZ2V0PC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHRhcmdldCB3aW5kb3cgZm9yIHJlcXVlc3Qgc3VibWl0LgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmJvb2ttYXJrPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHRhcmdldGVkIGJvb2ttYXJrIG5hbWUuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5sb2NhbGU8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgTG9jYWxlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnRpbWVab25lPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYSB0aW1lIHpvbmUgaWQuIEZvciBleGFtcGxlOiAiQW1lcmljYS9Mb3NfQW5nZWxlcyIgb3IgIkdNVCsxIiBvciAiR01UKzAxOjAwIi4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5zdmc8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHN1cHBvcnRzIHRoZSBTVkcgb3V0cHV0IGZvcm1hdCBvciBub3QuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+Zm9ybWF0PC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG91dHB1dCBmb3JtYXQgb2YgcmVwb3J0LgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+ZW1pdHRlcklkPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGVtaXR0ZXIgaWQgZm9yIHRoZSByZXBvcnQgb3V0cHV0LgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+cGFnZU92ZXJmbG93PC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHBhZ2Ugb3ZlcmZsb3cgc2V0dGluZyBmb3IgdGhlIFBERiBmb3JtYXQuCisgICAgICAgICAgICAgICAgT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgICAgICAgICAgICAgIDAgZm9yICJhdXRvIiwgMSBmb3IgImFjdHVhbCBzaXplIiwgMiBmb3IgImZpdCB0byBwYWdlIi4gCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+cnRsPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBzdXBwb3J0cyBydGwgcGFnZSBvciBub3QuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnJlc291cmNlRm9sZGVyPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2UgZm9sZGVyLgorICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgZGVmaW5lZCBpbiB3ZWIueG1sLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+Zm9yY2VPdmVyd3JpdGVEb2N1bWVudDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgZm9yY2VzIHRvIG92ZXJ3cml0ZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50LgorICAgICAgICAgICAgICAgIElmIGFsbG93UGFnZUJyZWFrIGlzIGZhbHNlLGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlIGlzIGRlZmluZWQgaW4gd2ViLnhtbC4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5zaG93VGl0bGU8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNob3dzIHRoZSByZXBvcnQgdGl0bGUuCisgICAgICAgICAgICAgICAgRGVmYXVsdCB0byB0cnVlLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4gICAgICAgICAgICAKKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+c2hvd1Rvb2xCYXI8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHNob3dzIHRoZSB0b29sYmFyLgorICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gdHJ1ZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5zaG93TmF2aWdhdGlvbkJhcjwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc2hvd3MgdGhlIE5hdmlnYXRpb24gQmFyLgorICAgICAgICAgICAgICAgIElmIGFsbG93UGFnZUJyZWFrIGlzIGZhbHNlLGlnbm9yZSB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIHRydWUuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAgICAgICAgICAgIAorICAgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+aXNSZXBvcnRsZXQ8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHJlbmRlciByZXBvcnRsZXQgYnkgYm9va21hcmsuCisgICAgICAgICAgICAgICAgRGVmYXVsdCB0byBmYWxzZS4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+ICAgICAgICAgICAgCisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgPC90YWc+CisKKyAgICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPgorICAgIDwhLS0gICAgICBSZXBvcnQgUGFyYW1ldGVyIERlZmluaXRpb24gVGFnICAgICAgICAgLS0+CisgICAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKyAgICAgPHRhZz4KKyAgICAgICAgPG5hbWU+cGFyYW1EZWY8L25hbWU+CisgICAgICAgIDx0YWctY2xhc3M+b3JnLmVjbGlwc2UuYmlydC5yZXBvcnQudGFnbGliLlBhcmFtRGVmVGFnPC90YWctY2xhc3M+CisgICAgICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgIFRoZSBwYXJhbSB0YWcgaXMgdXNlZCB0byBnZW5lcmF0ZSBodG1sIGNvZGUgZm9yIGRlZmluZWQgcGFyYW1ldGVyIGluIFBhcmFtZXRlclBhZ2UgdGFnLgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+aWQ8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBpZCBvZiBwYXJhbWV0ZXIgY29udHJvbC5JdCBzaG91bGQgYmUgdW5pcXVlLgorICAgICAgICAgICAgICAgIEl0IGNhbiBjb250YWluIG51bWJlcixsZXR0ZXIgb3IgdW5kZXJsaW5lLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5uYW1lPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IHBhcmFtZXRlciBuYW1lLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5wYXR0ZXJuPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlcG9ydCBwYXJhbWV0ZXIgcGF0dGVybiBmb3JtYXQuCisgICAgICAgICAgICAgICAgSXQgaXMgdXNlZCB0byBwYXJzZSBkZWZpbmVkIHBhcmFtZXRlciB2YWx1ZSBzdHJpbmcuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4gICAgIAorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+dmFsdWU8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVwb3J0IHBhcmFtZXRlciB2YWx1ZS4gSWYgZG9lc24ndCBzZXQsIHVzZSBkZWZhdWx0IHZhbHVlLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDxhdHRyaWJ1dGU+CisgICAgICAgICAgICA8bmFtZT5kaXNwbGF5VGV4dDwvbmFtZT4KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICAgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZXBvcnQgcGFyYW1ldGVyIGRpc3BsYXkgdGV4dC4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+aXNMb2NhbGU8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXBvcnQgcGFyYW1ldGVyIHZhbHVlIGlzIGEgbG9jYWxlL2Zvcm1hdCByZWxhdGVkIHN0cmluZy4KKyAgICAgICAgICAgICAgICBJdCBpcyB1c2VkIHRvIHBhcnNlIGRlZmluZWQgcGFyYW1ldGVyIHZhbHVlIHN0cmluZy4KKyAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+dGl0bGU8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgdGl0bGUgYXR0cmlidXRlIG9mIHBhcmFtZXRlciBjb250cm9sLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+ICAgICAgICAKKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmNzc0NsYXNzPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGNzcyBjbGFzcyBhdHRyaWJ1dGUgb2YgcGFyYW1ldGVyIGNvbnRyb2wuCisgICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnN0eWxlPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHBhcmFtZXRlciBjb250cm9sIHN0eWxlLgorICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9hdHRyaWJ1dGU+ICAgICAgICAKKyAgICAgPC90YWc+ICAgICAgICAgICAgICAgIAogPC90YWdsaWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9iaXJ0L3dlYmFwcC9iaXJ0L2Vycm9yL2Vycm9yLmpzcCBiL3BsdWdpbnMvYmlydC93ZWJhcHAvYmlydC9lcnJvci9lcnJvci5qc3AKaW5kZXggYWJiNDZkZC4uZDZhOTMzMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9iaXJ0L3dlYmFwcC9iaXJ0L2Vycm9yL2Vycm9yLmpzcAorKysgYi9wbHVnaW5zL2JpcnQvd2ViYXBwL2JpcnQvZXJyb3IvZXJyb3IuanNwCkBAIC0xLDUyICsxLDUyIEBACi08JS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLSU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLm9mYml6LmJhc2UudXRpbC4qIiAlPg0KLTxodG1sPg0KLTxoZWFkPg0KLTx0aXRsZT5PRkJpeiBNZXNzYWdlPC90aXRsZT4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08L2hlYWQ+DQotDQotPCUgU3RyaW5nIGVycm9yTXNnID0gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoIl9FUlJPUl9NRVNTQUdFXyIpOyAlPg0KLQ0KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiPg0KLTxkaXYgYWxpZ249ImNlbnRlciI+DQotICA8YnIvPg0KLSAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGhlaWdodD0iMjAwIj4NCi0gICAgPHRyPg0KLSAgICAgIDx0ZD4NCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBoZWlnaHQ9IjIwMCI+DQotICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjQ0M2NjY2Ij4gDQotICAgICAgICAgICAgPHRkIGhlaWdodD0iNDUiPiANCi0gICAgICAgICAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+PGZvbnQgZmFjZT0iVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgc2l6ZT0iNCIgY29sb3I9IiNGRkZGRkYiPjxiPjpFUlJPUiBNRVNTQUdFOjwvYj48L2ZvbnQ+PC9kaXY+DQotICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgPC90cj4NCi0gICAgICAgICAgPHRyPiANCi0gICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSIyIj48JT1VdGlsRm9ybWF0T3V0LnJlcGxhY2VTdHJpbmcoZXJyb3JNc2csICJcbiIsICI8YnIvPiIpJT48L2ZvbnQ+PC9kaXY+DQotICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgPC90cj4NCi0gICAgICAgIDwvdGFibGU+DQotICAgICAgPC90ZD4NCi0gICAgPC90cj4NCi0gIDwvdGFibGU+DQotPC9kaXY+DQotPGRpdiBhbGlnbj0iY2VudGVyIj48L2Rpdj4NCi08L2JvZHk+DQotPC9odG1sPg0KKzwlLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCistLSU+Cis8JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUub2ZiaXouYmFzZS51dGlsLioiICU+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPk9GQml6IE1lc3NhZ2U8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzwlIFN0cmluZyBlcnJvck1zZyA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJfRVJST1JfTUVTU0FHRV8iKTsgJT4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8ZGl2IGFsaWduPSJjZW50ZXIiPgorICA8YnIvPgorICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgaGVpZ2h0PSIyMDAiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGhlaWdodD0iMjAwIj4KKyAgICAgICAgICA8dHIgYmdjb2xvcj0iI0NDNjY2NiI+IAorICAgICAgICAgICAgPHRkIGhlaWdodD0iNDUiPiAKKyAgICAgICAgICAgICAgPGRpdiBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSI0IiBjb2xvcj0iI0ZGRkZGRiI+PGI+OkVSUk9SIE1FU1NBR0U6PC9iPjwvZm9udD48L2Rpdj4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+IAorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSIyIj48JT1VdGlsRm9ybWF0T3V0LnJlcGxhY2VTdHJpbmcoZXJyb3JNc2csICJcbiIsICI8YnIvPiIpJT48L2ZvbnQ+PC9kaXY+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+Cis8L2Rpdj4KKzxkaXYgYWxpZ249ImNlbnRlciI+PC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL2JpcnQvd2ViYXBwL2JpcnQvaW5kZXguanNwIGIvcGx1Z2lucy9iaXJ0L3dlYmFwcC9iaXJ0L2luZGV4LmpzcAppbmRleCA5ZDkxNmVhLi5lM2MzY2RmIDEwMDY0NAotLS0gYS9wbHVnaW5zL2JpcnQvd2ViYXBwL2JpcnQvaW5kZXguanNwCisrKyBiL3BsdWdpbnMvYmlydC93ZWJhcHAvYmlydC9pbmRleC5qc3AKQEAgLTEsMTkgKzEsMTkgQEAKLTwlLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tJT4NCi08JXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiY29udHJvbC9tYWluIik7JT4NCis8JS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorLS0lPgorPCVyZXNwb25zZS5zZW5kUmVkaXJlY3QoImNvbnRyb2wvbWFpbiIpOyU+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3ByaWNhdC9SRUFETUUubWQgYi9wbHVnaW5zL3ByaWNhdC9SRUFETUUubWQKaW5kZXggMzlhNjRjMi4uMzYwYzU0OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9wcmljYXQvUkVBRE1FLm1kCisrKyBiL3BsdWdpbnMvcHJpY2F0L1JFQURNRS5tZApAQCAtMSwxNCArMSwxNCBAQAotPGltZyBzcmM9Imh0dHA6Ly9vZmJpei5hcGFjaGUub3JnL2ltYWdlcy9sb2dvLnBuZyIgYWx0PSJBcGFjaGUgT0ZCaXoiIC8+DQotDQotIyBQcmlDYXQgY29tcG9uZW50DQotUHJpQ2F0IGlzIHRoZSBhYmJyZXZpYXRpb24gb2YgUHJpY2UgYW5kIENhdGFsb2cvQ2F0ZWdvcnkuIFRoZSBQcmlDYXQgY29tcG9uZW50IGlzIHRvIHN1cHBvcnQgaW1wb3J0aW5nL3BhcnNpbmcgZXhjZWwgZmlsZXMgd2l0aCBwcmljZSBhbmQgY2F0YWxvZy9jYXRlZ29yeSBkYXRhLiBUaGUgZXhjZWwgZmlsZXMgY2FuIGJlIGNoZWNrZWQgYnkgdmVyc2lvbiwgaGVhZGVyIGNvbHVtbiBuYW1lcywgY3VycmVuY3lJZC4gRWFjaCByb3cgY2FuIGJlIHZhbGlkYXRlZCBieSBmYWNpbGl0eShuYW1lLCBJZCBhbmQgb3duZXJzaGlwKSwgcmVxdWlyZWQgZmllbGRzLCBzdHJpbmcgb3IgbnVtYmVyIGFuZCBldGMuDQotDQotUHJpQ2F0IGNvbXBvbmVudCBjb250YWlucyB0d28gd2ViYXBwczogL3ByaWNhdC8gYW5kIC9wcmljYXRkZW1vLy4gSW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudCwgeW91IFNIT1VMRCByZW1vdmUgb3IgZGlzYWJsZSB0aGUgL3ByaWNhdGRlbW8vLg0KLQ0KLSMjIG1vcmUgaW5mb3JtYXRpb24NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1QcmlDYXQgRGVtb3MNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0vcHJpY2F0ZGVtby9jb250cm9sL1NhbXBsZVByaWNhdC86IHlvdSBjYW4gdXNlIHRoaXMgZGVtbyB0byBpbXBsZW1lbnQgeW91ciBvd24gZXhjZWwgdGVtcGxhdGVzLg0KLQ0KKzxpbWcgc3JjPSJodHRwOi8vb2ZiaXouYXBhY2hlLm9yZy9pbWFnZXMvbG9nby5wbmciIGFsdD0iQXBhY2hlIE9GQml6IiAvPgorCisjIFByaUNhdCBjb21wb25lbnQKK1ByaUNhdCBpcyB0aGUgYWJicmV2aWF0aW9uIG9mIFByaWNlIGFuZCBDYXRhbG9nL0NhdGVnb3J5LiBUaGUgUHJpQ2F0IGNvbXBvbmVudCBpcyB0byBzdXBwb3J0IGltcG9ydGluZy9wYXJzaW5nIGV4Y2VsIGZpbGVzIHdpdGggcHJpY2UgYW5kIGNhdGFsb2cvY2F0ZWdvcnkgZGF0YS4gVGhlIGV4Y2VsIGZpbGVzIGNhbiBiZSBjaGVja2VkIGJ5IHZlcnNpb24sIGhlYWRlciBjb2x1bW4gbmFtZXMsIGN1cnJlbmN5SWQuIEVhY2ggcm93IGNhbiBiZSB2YWxpZGF0ZWQgYnkgZmFjaWxpdHkobmFtZSwgSWQgYW5kIG93bmVyc2hpcCksIHJlcXVpcmVkIGZpZWxkcywgc3RyaW5nIG9yIG51bWJlciBhbmQgZXRjLgorCitQcmlDYXQgY29tcG9uZW50IGNvbnRhaW5zIHR3byB3ZWJhcHBzOiAvcHJpY2F0LyBhbmQgL3ByaWNhdGRlbW8vLiBJbiBwcm9kdWN0aW9uIGVudmlyb25tZW50LCB5b3UgU0hPVUxEIHJlbW92ZSBvciBkaXNhYmxlIHRoZSAvcHJpY2F0ZGVtby8uCisKKyMjIG1vcmUgaW5mb3JtYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUHJpQ2F0IERlbW9zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy9wcmljYXRkZW1vL2NvbnRyb2wvU2FtcGxlUHJpY2F0LzogeW91IGNhbiB1c2UgdGhpcyBkZW1vIHRvIGltcGxlbWVudCB5b3VyIG93biBleGNlbCB0ZW1wbGF0ZXMuCisKIC9wcmljYXRkZW1vL2NvbnRyb2wvY291bnRkb3ducmVwb3J0IGFuZCAvcHJpY2F0ZGVtby9jb250cm9sL2NvdW50dXByZXBvcnQ6IHRoZXNlIDIgZGVtb3MgYXJlIG9uIGh0bWwgcmVwb3J0LCB5b3UgY2FuIHRyeSB0aGlzIHdheSB0byBkaXNwbGF5IHRoZSBwcm9jZXNzaW5nIHJlcG9ydCBvZiByZWJ1aWxkaW5nIG9mIGx1Y2VuZSBpbmRleCBvciBtYXJjaGluZSBsZWFybmluZyBkYXRhLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvcHJpY2F0L2NvbmZpZy9wcmljYXQucHJvcGVydGllcyBiL3BsdWdpbnMvcHJpY2F0L2NvbmZpZy9wcmljYXQucHJvcGVydGllcwppbmRleCA2NWM3YjM0Li43YmRmZmM2IDEwMDY0NAotLS0gYS9wbHVnaW5zL3ByaWNhdC9jb25maWcvcHJpY2F0LnByb3BlcnRpZXMKKysrIGIvcGx1Z2lucy9wcmljYXQvY29uZmlnL3ByaWNhdC5wcm9wZXJ0aWVzCkBAIC0xLDI0ICsxLDI0IEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyB0aGUgbGF0ZXN0IHByaWNhdCB2ZXJzaW9uIHRvIHBhcnNlIGFuZCBkb3dubG9hZA0KLXByaWNhdC5sYXRlc3QudmVyc2lvbj1WMS4xDQotDQotIyB0aGUgbWF4IG51bWJlciBvZiBwcmljYXQgaGlzdG9yeSBmaWxlcyB0byBrZWVwDQotcHJpY2F0Lmhpc3RvcnkubWF4LmZpbGVudW1iZXI9MjANCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHRoZSBsYXRlc3QgcHJpY2F0IHZlcnNpb24gdG8gcGFyc2UgYW5kIGRvd25sb2FkCitwcmljYXQubGF0ZXN0LnZlcnNpb249VjEuMQorCisjIHRoZSBtYXggbnVtYmVyIG9mIHByaWNhdCBoaXN0b3J5IGZpbGVzIHRvIGtlZXAKK3ByaWNhdC5oaXN0b3J5Lm1heC5maWxlbnVtYmVyPTIwCmRpZmYgLS1naXQgYS9wbHVnaW5zL3ByaWNhdC93ZWJhcHAvcHJpY2F0L2Vycm9yL2Vycm9yLmpzcCBiL3BsdWdpbnMvcHJpY2F0L3dlYmFwcC9wcmljYXQvZXJyb3IvZXJyb3IuanNwCmluZGV4IDdmNGFmOGYuLjVmNGRlMDEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvcHJpY2F0L3dlYmFwcC9wcmljYXQvZXJyb3IvZXJyb3IuanNwCisrKyBiL3BsdWdpbnMvcHJpY2F0L3dlYmFwcC9wcmljYXQvZXJyb3IvZXJyb3IuanNwCkBAIC0xLDUyICsxLDUyIEBACi08JS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLSU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLm9mYml6LmJhc2UudXRpbC4qIiAlPg0KLTxodG1sPg0KLTxoZWFkPg0KLTx0aXRsZT5PRkJpeiBNZXNzYWdlPC90aXRsZT4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08L2hlYWQ+DQotDQotPCUgU3RyaW5nIGVycm9yTXNnID0gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoIl9FUlJPUl9NRVNTQUdFXyIpOyAlPg0KLQ0KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiPg0KLTxkaXYgYWxpZ249ImNlbnRlciI+DQotICA8YnIvPg0KLSAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGhlaWdodD0iMjAwIj4NCi0gICAgPHRyPg0KLSAgICAgIDx0ZD4NCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBoZWlnaHQ9IjIwMCI+DQotICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjQ0M2NjY2Ij4NCi0gICAgICAgICAgICA8dGQgaGVpZ2h0PSI0NSI+DQotICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJjZW50ZXIiPjxmb250IGZhY2U9IlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9IjQiIGNvbG9yPSIjRkZGRkZGIj48Yj46RVJST1IgTUVTU0FHRTo8L2I+PC9mb250PjwvZGl2Pg0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgIDwvdHI+DQotICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSIyIj48JT1VdGlsRm9ybWF0T3V0LnJlcGxhY2VTdHJpbmcoZXJyb3JNc2csICJcbiIsICI8YnIvPiIpJT48L2ZvbnQ+PC9kaXY+DQotICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgPC90cj4NCi0gICAgICAgIDwvdGFibGU+DQotICAgICAgPC90ZD4NCi0gICAgPC90cj4NCi0gIDwvdGFibGU+DQotPC9kaXY+DQotPGRpdiBhbGlnbj0iY2VudGVyIj48L2Rpdj4NCi08L2JvZHk+DQotPC9odG1sPg0KKzwlLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCistLSU+Cis8JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUub2ZiaXouYmFzZS51dGlsLioiICU+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPk9GQml6IE1lc3NhZ2U8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzwlIFN0cmluZyBlcnJvck1zZyA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJfRVJST1JfTUVTU0FHRV8iKTsgJT4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8ZGl2IGFsaWduPSJjZW50ZXIiPgorICA8YnIvPgorICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgaGVpZ2h0PSIyMDAiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGhlaWdodD0iMjAwIj4KKyAgICAgICAgICA8dHIgYmdjb2xvcj0iI0NDNjY2NiI+CisgICAgICAgICAgICA8dGQgaGVpZ2h0PSI0NSI+CisgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+PGZvbnQgZmFjZT0iVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgc2l6ZT0iNCIgY29sb3I9IiNGRkZGRkYiPjxiPjpFUlJPUiBNRVNTQUdFOjwvYj48L2ZvbnQ+PC9kaXY+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSIyIj48JT1VdGlsRm9ybWF0T3V0LnJlcGxhY2VTdHJpbmcoZXJyb3JNc2csICJcbiIsICI8YnIvPiIpJT48L2ZvbnQ+PC9kaXY+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+Cis8L2Rpdj4KKzxkaXYgYWxpZ249ImNlbnRlciI+PC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3ByaWNhdC93ZWJhcHAvcHJpY2F0L2Z0bC9FeGNlbEltcG9ydEhpc3RvcnlSZXBvcnQuZnRsIGIvcGx1Z2lucy9wcmljYXQvd2ViYXBwL3ByaWNhdC9mdGwvRXhjZWxJbXBvcnRIaXN0b3J5UmVwb3J0LmZ0bAppbmRleCA3NGViZjNjLi5hYjg2MjcwIDEwMDY0NAotLS0gYS9wbHVnaW5zL3ByaWNhdC93ZWJhcHAvcHJpY2F0L2Z0bC9FeGNlbEltcG9ydEhpc3RvcnlSZXBvcnQuZnRsCisrKyBiL3BsdWdpbnMvcHJpY2F0L3dlYmFwcC9wcmljYXQvZnRsL0V4Y2VsSW1wb3J0SGlzdG9yeVJlcG9ydC5mdGwKQEAgLTEsMTA5ICsxLDEwOSBAQAotPCMtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGRpdiBjbGFzcz0icm93Ij4NCi0gICAgPGRpdiBjbGFzcz0iY29sLXNtLTEyIG0tYi14cyB0ZXh0LWxlZnQgcC14cyI+DQotICAgICAgICA8bGFiZWwgPiR7dWlMYWJlbE1hcC5FeGNlbEltcG9ydEhpc3RvcnlMaXN0fTwvbGFiZWw+DQotICAgICAgICA8c3BhbiBjbGFzcz0idG9vbHRpcCBwYWQtbGVmdDMwIHRvcCI+JHt1aUxhYmVsTWFwLk9ubHlZb3VyT3duSW1wb3J0SGlzdG9yeURpc3BsYXllZH08L3NwYW4+DQotICAgIDwvZGl2PiANCi08L2Rpdj4NCi0NCi08ZGl2IGlkPSJsb2FkQm9keSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+DQotPC9kaXY+DQotPHRhYmxlIGlkPSJwcm9kdWN0bGlzdCIgbmFtZT0icHJvZHVjdGxpc3QiIGNsYXNzPSJ0YWJsZSB0YWJsZS1zdHJpcGVkIG1zLXRhYmxlLXByaW1hcnkiPg0KLSAgICA8dGhlYWQ+DQotICAgICAgICA8dGg+PC90aD4NCi0gICAgICAgIDx0aD4ke3VpTGFiZWxNYXAuU2VyaWFsTnVtYmVyfTwvdGg+DQotICAgICAgICA8dGg+JHt1aUxhYmVsTWFwLkZpbGVuYW1lfTwvdGg+DQotICAgICAgICA8dGg+JHt1aUxhYmVsTWFwLkZyb21EYXRlfTwvdGg+DQotICAgICAgICA8dGg+JHt1aUxhYmVsTWFwLlRocnVEYXRlfTwvdGg+DQotICAgICAgICA8dGg+JHt1aUxhYmVsTWFwLkltcG9ydFN0YXR1c308L3RoPg0KLSAgICAgICAgPHRoPiR7dWlMYWJlbE1hcC5UaHJ1UmVhc29uSWR9PC90aD4NCi0gICAgICAgIDx0aD4ke3VpTGFiZWxNYXAuQWN0aW9uc308L3RoPg0KLSAgICA8L3RoZWFkPg0KLSAgICA8dGJvZHk+DQotICAgICAgICA8I2lmIChkYXRhP2hhc19jb250ZW50KT4NCi0gICAgICAgICAgICA8I2xpc3QgZGF0YSBhcyBoaXN0b3J5RW50cnk+DQotICAgICAgICAgICAgICAgIDx0ciBuYW1lPSIke2hpc3RvcnlFbnRyeS5zZXF1ZW5jZU51bSF9Ij4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgIDwjaWYgaGlzdG9yeUVudHJ5LnN0YXR1c0lkP2V4aXN0cyAmJiBoaXN0b3J5RW50cnkuc3RhdHVzSWQgPT0gJ0VYQ0VMX0lNUE9SVElORyc+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9lcnB0aGVtZS9pbWFnZXMvYmx1ZV9hbmltZS5naWYiIGFsdD0iJHt1aUxhYmVsTWFwLkVYQ0VfSU1QT1JUSU5HfSIgdG9vbHRpcD0iJHt1aUxhYmVsTWFwLkVYQ0VfSU1QT1JUSU5HfSI+DQotICAgICAgICAgICAgICAgICAgICA8I2Vsc2VpZiBoaXN0b3J5RW50cnkuc3RhdHVzSWQ/ZXhpc3RzICYmIGhpc3RvcnlFbnRyeS5zdGF0dXNJZCA9PSAnRVhDRUxfSU1QT1JURUQnICYmIGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQ/ZXhpc3RzICYmIGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQ/aGFzX2NvbnRlbnQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCNpZiBoaXN0b3J5RW50cnkudGhydVJlYXNvbklkID09ICdFWENFTF9JTVBPUlRfU1VDQ0VTUyc+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZXhjZWwtaW1wb3J0LXN0YXR1cyIgZGF0YS10b29sdGlwPSIke3VpTGFiZWxNYXAuZ2V0KGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQpfSI+PGkgY2xhc3M9Imljb24tb2stc2lnbiBzdWNjZXNzLWNvbG9yIj4ke3VpTGFiZWxNYXAuUmVhc29uT0t9PC9pPjwvYnV0dG9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwjZWxzZWlmIGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQgPT0gJ0VYQ0VMX0lNUE9SVF9TVE9QUEVEJz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJleGNlbC1pbXBvcnQtc3RhdHVzIiBkYXRhLXRvb2x0aXA9IiR7dWlMYWJlbE1hcC5nZXQoaGlzdG9yeUVudHJ5LnRocnVSZWFzb25JZCl9Ij48aSBjbGFzcz0iaWNvbi1yZW1vdmUtc2lnbiBzdG9wcGVkLWNvbG9yIj4ke3VpTGFiZWxNYXAuUmVhc29uU3RvcHBlZH08L2k+PC9idXR0b24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCNlbHNlaWYgaGlzdG9yeUVudHJ5LnRocnVSZWFzb25JZCA9PSAnRVhDRUxfSU1QT1JUX0VSUk9SJz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJleGNlbC1pbXBvcnQtc3RhdHVzIiBkYXRhLXRvb2x0aXA9IiR7dWlMYWJlbE1hcC5nZXQoaGlzdG9yeUVudHJ5LnRocnVSZWFzb25JZCl9Ij48aSBjbGFzcz0iaWNvbi1leGNsYW1hdGlvbi1zaWduIGVycm9yLWNvbG9yIj48L2k+JHt1aUxhYmVsTWFwLlJlYXNvbkVycm9yfTwvYnV0dG9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwjZWxzZWlmIGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQgPT0gJ0VYQ0VMX0lNUE9SVF9RVUVTVCc+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZXhjZWwtaW1wb3J0LXN0YXR1cyIgZGF0YS10b29sdGlwPSIke3VpTGFiZWxNYXAuZ2V0KGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQpfSI+PGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBxdWVzdGlvbi1jb2xvciI+PC9pPiR7dWlMYWJlbE1hcC5SZWFzb25XYXJuaW5nfTwvYnV0dG9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvI2lmPg0KLSAgICAgICAgICAgICAgICAgICAgPC8jaWY+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPiR7aGlzdG9yeUVudHJ5LnNlcXVlbmNlTnVtIX08L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQ7Ij4ke2hpc3RvcnlFbnRyeS5maWxlTmFtZSF9PC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD48I2lmIGhpc3RvcnlFbnRyeS5mcm9tRGF0ZT9leGlzdHMgJiYgaGlzdG9yeUVudHJ5LmZyb21EYXRlP2hhc19jb250ZW50PiR7aGlzdG9yeUVudHJ5LmZyb21EYXRlP3N0cmluZygieXl5eS1NTS1kZCBISDptbTpzcyIpfTwvI2lmPjwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+PCNpZiBoaXN0b3J5RW50cnkudGhydURhdGU/ZXhpc3RzICYmIGhpc3RvcnlFbnRyeS50aHJ1RGF0ZT9oYXNfY29udGVudD4ke2hpc3RvcnlFbnRyeS50aHJ1RGF0ZT9zdHJpbmcoInl5eXktTU0tZGQgSEg6bW06c3MiKX08LyNpZj48L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPjwjaWYgaGlzdG9yeUVudHJ5LnN0YXR1c0lkP2V4aXN0cyAmJiBoaXN0b3J5RW50cnkuc3RhdHVzSWQ/aGFzX2NvbnRlbnQ+JHt1aUxhYmVsTWFwLmdldChoaXN0b3J5RW50cnkuc3RhdHVzSWQpfTwvI2lmPjwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+PCNpZiBoaXN0b3J5RW50cnkuc3RhdHVzSWQ/ZXhpc3RzICYmIGhpc3RvcnlFbnRyeS5zdGF0dXNJZCA9PSAiRVhDRUxfSU1QT1JURUQiICYmIGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQ/ZXhpc3RzICYmIGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQ/aGFzX2NvbnRlbnQ+JHt1aUxhYmVsTWFwLmdldChoaXN0b3J5RW50cnkudGhydVJlYXNvbklkKX08LyNpZj48L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwjYXNzaWduIGJ1dHRvbnMgPSAwIC8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCNpZiBoaXN0b3J5RW50cnkubG9nRmlsZU5hbWU/ZXhpc3RzICYmIGhpc3RvcnlFbnRyeS5sb2dGaWxlTmFtZT9oYXNfY29udGVudD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCNpZiBTdGF0aWNbIm9yZy5hcGFjaGUub2ZiaXouYmFzZS51dGlsLkZpbGVVdGlsIl0uZ2V0RmlsZShoaXN0b3J5RW50cnkubG9nRmlsZU5hbWUpLmV4aXN0cygpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJleGNlbC1pbXBvcnQtbG9nIiB0eXBlPSJidXR0b24iIG9uY2xpY2s9InZpZXdFeGNlbEltcG9ydExvZygke2hpc3RvcnlFbnRyeS5zZXF1ZW5jZU51bX0pOyIgZGF0YS10b29sdGlwPSIke3VpTGFiZWxNYXAuVmlld0V4Y2VsSW1wb3J0TG9nQ29udGVudH0iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tY29tbWVudHMgaWNvbi1ibHVlIj4ke3VpTGFiZWxNYXAuVmlld1ByaWNhdExvZ308L2k+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8I2Fzc2lnbiBidXR0b25zID0gYnV0dG9ucyArIDEgLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8jaWY+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC8jaWY+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCNpZiBidXR0b25zID09IDA+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwjLS0tIDxidXR0b24gaWQ9ImV4Y2VsLWltcG9ydC1lbXB0eSIgdHlwZT0iYnV0dG9uIj48L2J1dHRvbj4gLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwjYXNzaWduIGJ1dHRvbnMgPSBidXR0b25zICsgMSAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvI2lmPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwjaWYgaGlzdG9yeUVudHJ5LmxvZ0ZpbGVOYW1lP2V4aXN0cyAmJiBoaXN0b3J5RW50cnkubG9nRmlsZU5hbWU/aGFzX2NvbnRlbnQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwjaWYgU3RhdGljWyJvcmcuYXBhY2hlLm9mYml6LnByaWNhdC5BYnN0cmFjdFByaWNhdFBhcnNlciJdLmlzQ29tbWVudGVkRXhjZWxFeGlzdHMocmVxdWVzdCwgaGlzdG9yeUVudHJ5LnNlcXVlbmNlTnVtKT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZXhjZWwtaW1wb3J0LWRvd25sb2FkIiB0eXBlPSJidXR0b24iIG9uY2xpY2s9ImRvd25sb2FkQ29tbWVudGVkRXhjZWwoJHtoaXN0b3J5RW50cnkuc2VxdWVuY2VOdW19KTsiIGRhdGEtdG9vbHRpcD0iJHt1aUxhYmVsTWFwLkRvd25sb2FkQ29tbWVudGVkRXhjZWx9Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLWRvd25sb2FkIGljb24tYmx1ZSI+JHt1aUxhYmVsTWFwLkRvd25sb2FkQ29tbWVudGVkUHJpY2F0fTwvaT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwjYXNzaWduIGJ1dHRvbnMgPSBidXR0b25zICsgMSAvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LyNpZj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8LyNpZj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8I2lmIGJ1dHRvbnMgPT0gMT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCMtLS0gPGJ1dHRvbiBpZD0iZXhjZWwtaW1wb3J0LWVtcHR5IiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPiAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8LyNpZj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgPC8jbGlzdD4NCi0gICAgICAgIDwjZWxzZT4NCi0gICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxMCIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtoZWlnaHQ6NjBweDsiPg0KLSAgICAgICAgICAgICAgICAgICAgJHt1aUxhYmVsTWFwLkV4Y2VsSW1wb3J0VGlwTm9EYXRhfQ0KLSAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgIDwvdHI+DQotICAgICAgICA8LyNpZj4NCi0gICAgPC90Ym9keT4NCi08L3RhYmxlPg0KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+DQotICAgIGZ1bmN0aW9uIHZpZXdFeGNlbEltcG9ydExvZyhzZXF1ZW5jZU51bSkgew0KLSAgICAgICAgZG9jdW1lbnQubG9jYXRpb24gPSAiPEBvZmJpelVybD52aWV3RXhjZWxJbXBvcnRMb2c8L0BvZmJpelVybD4/c2VxdWVuY2VOdW09IiArIHNlcXVlbmNlTnVtOw0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGRvd25sb2FkQ29tbWVudGVkRXhjZWwoc2VxdWVuY2VOdW0pIHsNCi0gICAgICAgIGRvY3VtZW50LmxvY2F0aW9uID0gIjxAb2ZiaXpVcmw+ZG93bmxvYWRDb21tZW50ZWRFeGNlbDwvQG9mYml6VXJsPj9zZXF1ZW5jZU51bT0iICsgc2VxdWVuY2VOdW07DQotICAgIH0NCis8Iy0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZGl2IGNsYXNzPSJyb3ciPgorICAgIDxkaXYgY2xhc3M9ImNvbC1zbS0xMiBtLWIteHMgdGV4dC1sZWZ0IHAteHMiPgorICAgICAgICA8bGFiZWwgPiR7dWlMYWJlbE1hcC5FeGNlbEltcG9ydEhpc3RvcnlMaXN0fTwvbGFiZWw+CisgICAgICAgIDxzcGFuIGNsYXNzPSJ0b29sdGlwIHBhZC1sZWZ0MzAgdG9wIj4ke3VpTGFiZWxNYXAuT25seVlvdXJPd25JbXBvcnRIaXN0b3J5RGlzcGxheWVkfTwvc3Bhbj4KKyAgICA8L2Rpdj4gCis8L2Rpdj4KKworPGRpdiBpZD0ibG9hZEJvZHkiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgorPC9kaXY+Cis8dGFibGUgaWQ9InByb2R1Y3RsaXN0IiBuYW1lPSJwcm9kdWN0bGlzdCIgY2xhc3M9InRhYmxlIHRhYmxlLXN0cmlwZWQgbXMtdGFibGUtcHJpbWFyeSI+CisgICAgPHRoZWFkPgorICAgICAgICA8dGg+PC90aD4KKyAgICAgICAgPHRoPiR7dWlMYWJlbE1hcC5TZXJpYWxOdW1iZXJ9PC90aD4KKyAgICAgICAgPHRoPiR7dWlMYWJlbE1hcC5GaWxlbmFtZX08L3RoPgorICAgICAgICA8dGg+JHt1aUxhYmVsTWFwLkZyb21EYXRlfTwvdGg+CisgICAgICAgIDx0aD4ke3VpTGFiZWxNYXAuVGhydURhdGV9PC90aD4KKyAgICAgICAgPHRoPiR7dWlMYWJlbE1hcC5JbXBvcnRTdGF0dXN9PC90aD4KKyAgICAgICAgPHRoPiR7dWlMYWJlbE1hcC5UaHJ1UmVhc29uSWR9PC90aD4KKyAgICAgICAgPHRoPiR7dWlMYWJlbE1hcC5BY3Rpb25zfTwvdGg+CisgICAgPC90aGVhZD4KKyAgICA8dGJvZHk+CisgICAgICAgIDwjaWYgKGRhdGE/aGFzX2NvbnRlbnQpPgorICAgICAgICAgICAgPCNsaXN0IGRhdGEgYXMgaGlzdG9yeUVudHJ5PgorICAgICAgICAgICAgICAgIDx0ciBuYW1lPSIke2hpc3RvcnlFbnRyeS5zZXF1ZW5jZU51bSF9Ij4KKyAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICA8I2lmIGhpc3RvcnlFbnRyeS5zdGF0dXNJZD9leGlzdHMgJiYgaGlzdG9yeUVudHJ5LnN0YXR1c0lkID09ICdFWENFTF9JTVBPUlRJTkcnPgorICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9lcnB0aGVtZS9pbWFnZXMvYmx1ZV9hbmltZS5naWYiIGFsdD0iJHt1aUxhYmVsTWFwLkVYQ0VfSU1QT1JUSU5HfSIgdG9vbHRpcD0iJHt1aUxhYmVsTWFwLkVYQ0VfSU1QT1JUSU5HfSI+CisgICAgICAgICAgICAgICAgICAgIDwjZWxzZWlmIGhpc3RvcnlFbnRyeS5zdGF0dXNJZD9leGlzdHMgJiYgaGlzdG9yeUVudHJ5LnN0YXR1c0lkID09ICdFWENFTF9JTVBPUlRFRCcgJiYgaGlzdG9yeUVudHJ5LnRocnVSZWFzb25JZD9leGlzdHMgJiYgaGlzdG9yeUVudHJ5LnRocnVSZWFzb25JZD9oYXNfY29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwjaWYgaGlzdG9yeUVudHJ5LnRocnVSZWFzb25JZCA9PSAnRVhDRUxfSU1QT1JUX1NVQ0NFU1MnPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZXhjZWwtaW1wb3J0LXN0YXR1cyIgZGF0YS10b29sdGlwPSIke3VpTGFiZWxNYXAuZ2V0KGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQpfSI+PGkgY2xhc3M9Imljb24tb2stc2lnbiBzdWNjZXNzLWNvbG9yIj4ke3VpTGFiZWxNYXAuUmVhc29uT0t9PC9pPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPCNlbHNlaWYgaGlzdG9yeUVudHJ5LnRocnVSZWFzb25JZCA9PSAnRVhDRUxfSU1QT1JUX1NUT1BQRUQnPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZXhjZWwtaW1wb3J0LXN0YXR1cyIgZGF0YS10b29sdGlwPSIke3VpTGFiZWxNYXAuZ2V0KGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQpfSI+PGkgY2xhc3M9Imljb24tcmVtb3ZlLXNpZ24gc3RvcHBlZC1jb2xvciI+JHt1aUxhYmVsTWFwLlJlYXNvblN0b3BwZWR9PC9pPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPCNlbHNlaWYgaGlzdG9yeUVudHJ5LnRocnVSZWFzb25JZCA9PSAnRVhDRUxfSU1QT1JUX0VSUk9SJz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImV4Y2VsLWltcG9ydC1zdGF0dXMiIGRhdGEtdG9vbHRpcD0iJHt1aUxhYmVsTWFwLmdldChoaXN0b3J5RW50cnkudGhydVJlYXNvbklkKX0iPjxpIGNsYXNzPSJpY29uLWV4Y2xhbWF0aW9uLXNpZ24gZXJyb3ItY29sb3IiPjwvaT4ke3VpTGFiZWxNYXAuUmVhc29uRXJyb3J9PC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICA8I2Vsc2VpZiBoaXN0b3J5RW50cnkudGhydVJlYXNvbklkID09ICdFWENFTF9JTVBPUlRfUVVFU1QnPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZXhjZWwtaW1wb3J0LXN0YXR1cyIgZGF0YS10b29sdGlwPSIke3VpTGFiZWxNYXAuZ2V0KGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQpfSI+PGkgY2xhc3M9Imljb24tcXVlc3Rpb24tc2lnbiBxdWVzdGlvbi1jb2xvciI+PC9pPiR7dWlMYWJlbE1hcC5SZWFzb25XYXJuaW5nfTwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC8jaWY+CisgICAgICAgICAgICAgICAgICAgIDwvI2lmPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+JHtoaXN0b3J5RW50cnkuc2VxdWVuY2VOdW0hfTwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0OyI+JHtoaXN0b3J5RW50cnkuZmlsZU5hbWUhfTwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48I2lmIGhpc3RvcnlFbnRyeS5mcm9tRGF0ZT9leGlzdHMgJiYgaGlzdG9yeUVudHJ5LmZyb21EYXRlP2hhc19jb250ZW50PiR7aGlzdG9yeUVudHJ5LmZyb21EYXRlP3N0cmluZygieXl5eS1NTS1kZCBISDptbTpzcyIpfTwvI2lmPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48I2lmIGhpc3RvcnlFbnRyeS50aHJ1RGF0ZT9leGlzdHMgJiYgaGlzdG9yeUVudHJ5LnRocnVEYXRlP2hhc19jb250ZW50PiR7aGlzdG9yeUVudHJ5LnRocnVEYXRlP3N0cmluZygieXl5eS1NTS1kZCBISDptbTpzcyIpfTwvI2lmPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48I2lmIGhpc3RvcnlFbnRyeS5zdGF0dXNJZD9leGlzdHMgJiYgaGlzdG9yeUVudHJ5LnN0YXR1c0lkP2hhc19jb250ZW50PiR7dWlMYWJlbE1hcC5nZXQoaGlzdG9yeUVudHJ5LnN0YXR1c0lkKX08LyNpZj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PCNpZiBoaXN0b3J5RW50cnkuc3RhdHVzSWQ/ZXhpc3RzICYmIGhpc3RvcnlFbnRyeS5zdGF0dXNJZCA9PSAiRVhDRUxfSU1QT1JURUQiICYmIGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQ/ZXhpc3RzICYmIGhpc3RvcnlFbnRyeS50aHJ1UmVhc29uSWQ/aGFzX2NvbnRlbnQ+JHt1aUxhYmVsTWFwLmdldChoaXN0b3J5RW50cnkudGhydVJlYXNvbklkKX08LyNpZj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8I2Fzc2lnbiBidXR0b25zID0gMCAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPCNpZiBoaXN0b3J5RW50cnkubG9nRmlsZU5hbWU/ZXhpc3RzICYmIGhpc3RvcnlFbnRyeS5sb2dGaWxlTmFtZT9oYXNfY29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8I2lmIFN0YXRpY1sib3JnLmFwYWNoZS5vZmJpei5iYXNlLnV0aWwuRmlsZVV0aWwiXS5nZXRGaWxlKGhpc3RvcnlFbnRyeS5sb2dGaWxlTmFtZSkuZXhpc3RzKCk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZXhjZWwtaW1wb3J0LWxvZyIgdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJ2aWV3RXhjZWxJbXBvcnRMb2coJHtoaXN0b3J5RW50cnkuc2VxdWVuY2VOdW19KTsiIGRhdGEtdG9vbHRpcD0iJHt1aUxhYmVsTWFwLlZpZXdFeGNlbEltcG9ydExvZ0NvbnRlbnR9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Imljb24tY29tbWVudHMgaWNvbi1ibHVlIj4ke3VpTGFiZWxNYXAuVmlld1ByaWNhdExvZ308L2k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCNhc3NpZ24gYnV0dG9ucyA9IGJ1dHRvbnMgKyAxIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8jaWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8LyNpZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwjaWYgYnV0dG9ucyA9PSAwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwjLS0tIDxidXR0b24gaWQ9ImV4Y2VsLWltcG9ydC1lbXB0eSIgdHlwZT0iYnV0dG9uIj48L2J1dHRvbj4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCNhc3NpZ24gYnV0dG9ucyA9IGJ1dHRvbnMgKyAxIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8LyNpZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwjaWYgaGlzdG9yeUVudHJ5LmxvZ0ZpbGVOYW1lP2V4aXN0cyAmJiBoaXN0b3J5RW50cnkubG9nRmlsZU5hbWU/aGFzX2NvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCNpZiBTdGF0aWNbIm9yZy5hcGFjaGUub2ZiaXoucHJpY2F0LkFic3RyYWN0UHJpY2F0UGFyc2VyIl0uaXNDb21tZW50ZWRFeGNlbEV4aXN0cyhyZXF1ZXN0LCBoaXN0b3J5RW50cnkuc2VxdWVuY2VOdW0pPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImV4Y2VsLWltcG9ydC1kb3dubG9hZCIgdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJkb3dubG9hZENvbW1lbnRlZEV4Y2VsKCR7aGlzdG9yeUVudHJ5LnNlcXVlbmNlTnVtfSk7IiBkYXRhLXRvb2x0aXA9IiR7dWlMYWJlbE1hcC5Eb3dubG9hZENvbW1lbnRlZEV4Y2VsfSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJpY29uLWRvd25sb2FkIGljb24tYmx1ZSI+JHt1aUxhYmVsTWFwLkRvd25sb2FkQ29tbWVudGVkUHJpY2F0fTwvaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8I2Fzc2lnbiBidXR0b25zID0gYnV0dG9ucyArIDEgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LyNpZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvI2lmPgorICAgICAgICAgICAgICAgICAgICAgICAgPCNpZiBidXR0b25zID09IDE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCMtLS0gPGJ1dHRvbiBpZD0iZXhjZWwtaW1wb3J0LWVtcHR5IiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvI2lmPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8LyNsaXN0PgorICAgICAgICA8I2Vsc2U+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEwIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7dmVydGljYWwtYWxpZ246bWlkZGxlO2hlaWdodDo2MHB4OyI+CisgICAgICAgICAgICAgICAgICAgICR7dWlMYWJlbE1hcC5FeGNlbEltcG9ydFRpcE5vRGF0YX0KKyAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgPC8jaWY+CisgICAgPC90Ym9keT4KKzwvdGFibGU+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorICAgIGZ1bmN0aW9uIHZpZXdFeGNlbEltcG9ydExvZyhzZXF1ZW5jZU51bSkgeworICAgICAgICBkb2N1bWVudC5sb2NhdGlvbiA9ICI8QG9mYml6VXJsPnZpZXdFeGNlbEltcG9ydExvZzwvQG9mYml6VXJsPj9zZXF1ZW5jZU51bT0iICsgc2VxdWVuY2VOdW07CisgICAgfQorCisgICAgZnVuY3Rpb24gZG93bmxvYWRDb21tZW50ZWRFeGNlbChzZXF1ZW5jZU51bSkgeworICAgICAgICBkb2N1bWVudC5sb2NhdGlvbiA9ICI8QG9mYml6VXJsPmRvd25sb2FkQ29tbWVudGVkRXhjZWw8L0BvZmJpelVybD4/c2VxdWVuY2VOdW09IiArIHNlcXVlbmNlTnVtOworICAgIH0KIDwvc2NyaXB0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvcHJpY2F0L3dlYmFwcC9wcmljYXQvZnRsL3ZpZXdFeGNlbEltcG9ydEhpc3RvcnkuZnRsIGIvcGx1Z2lucy9wcmljYXQvd2ViYXBwL3ByaWNhdC9mdGwvdmlld0V4Y2VsSW1wb3J0SGlzdG9yeS5mdGwKaW5kZXggODM0ZmFjMS4uNGI5OTdkOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9wcmljYXQvd2ViYXBwL3ByaWNhdC9mdGwvdmlld0V4Y2VsSW1wb3J0SGlzdG9yeS5mdGwKKysrIGIvcGx1Z2lucy9wcmljYXQvd2ViYXBwL3ByaWNhdC9mdGwvdmlld0V4Y2VsSW1wb3J0SGlzdG9yeS5mdGwKQEAgLTEsMzEgKzEsMzEgQEAKLTwjLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxkaXYgaWQ9IndyYXBwZXIiPg0KLSAgICA8ZGl2IGlkPSJwYWdlLXdyYXBwZXIiIGNsYXNzPSJncmF5LWJnIj4NCi0gICAgICAgIDxkaXYgY2xhc3M9InJvdyI+DQotICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTEyIj4NCi0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaWJveCBmbG9hdC1lLW1hcmdpbnMiPg0KLSAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaWJveC1jb250ZW50IHRleHQtbGVmdCBwLW1kIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8I2luY2x1ZGUgImNvbXBvbmVudDovL3ByaWNhdC93ZWJhcHAvcHJpY2F0L2Z0bC9FeGNlbEltcG9ydEhpc3RvcnlSZXBvcnQuZnRsIi8+DQotICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICA8L2Rpdj4NCi0gICAgPC9kaXY+DQorPCMtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRpdiBpZD0id3JhcHBlciI+CisgICAgPGRpdiBpZD0icGFnZS13cmFwcGVyIiBjbGFzcz0iZ3JheS1iZyI+CisgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctMTIiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imlib3ggZmxvYXQtZS1tYXJnaW5zIj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaWJveC1jb250ZW50IHRleHQtbGVmdCBwLW1kIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwjaW5jbHVkZSAiY29tcG9uZW50Oi8vcHJpY2F0L3dlYmFwcC9wcmljYXQvZnRsL0V4Y2VsSW1wb3J0SGlzdG9yeVJlcG9ydC5mdGwiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CiA8L2Rpdj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3ByaWNhdC93ZWJhcHAvcHJpY2F0L2Z0bC92aWV3RXhjZWxJbXBvcnRMb2cuZnRsIGIvcGx1Z2lucy9wcmljYXQvd2ViYXBwL3ByaWNhdC9mdGwvdmlld0V4Y2VsSW1wb3J0TG9nLmZ0bAppbmRleCBkOThmZTcyLi5kNDAwYTgyIDEwMDY0NAotLS0gYS9wbHVnaW5zL3ByaWNhdC93ZWJhcHAvcHJpY2F0L2Z0bC92aWV3RXhjZWxJbXBvcnRMb2cuZnRsCisrKyBiL3BsdWdpbnMvcHJpY2F0L3dlYmFwcC9wcmljYXQvZnRsL3ZpZXdFeGNlbEltcG9ydExvZy5mdGwKQEAgLTEsMzkgKzEsMzkgQEAKLTwjLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxkaXYgaWQ9IndyYXBwZXIiPg0KLSAgICA8ZGl2IGlkPSJwYWdlLXdyYXBwZXIiIGNsYXNzPSJncmF5LWJnIj4NCi0gICAgICAgIDxkaXYgY2xhc3M9InJvdyI+DQotICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTEyIj4NCi0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaWJveCBmbG9hdC1lLW1hcmdpbnMiPg0KLSAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iaHRtbHJlcG9ydCIgY2xhc3M9Imlib3gtY29udGVudCB0ZXh0LWxlZnQgcC1tZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICA8L2Rpdj4NCi0gICAgPC9kaXY+DQotPC9kaXY+DQotDQotPHNjcmlwdCBsYW5ndWFnZT0nSmF2YVNjcmlwdCc+DQotPCEtLQ0KLWpRdWVyeShkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgew0KLSAgICBqUXVlcnkoIiNodG1scmVwb3J0IikuaHRtbCgiJHtTdHJpbmdVdGlsLndyYXBTdHJpbmcobG9nRmlsZUNvbnRlbnQhKX0iKTsNCi19KTsNCi0vLy0tPg0KLTwvc2NyaXB0Pg0KKzwjLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkaXYgaWQ9IndyYXBwZXIiPgorICAgIDxkaXYgaWQ9InBhZ2Utd3JhcHBlciIgY2xhc3M9ImdyYXktYmciPgorICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLTEyIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpYm94IGZsb2F0LWUtbWFyZ2lucyI+CisgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Imh0bWxyZXBvcnQiIGNsYXNzPSJpYm94LWNvbnRlbnQgdGV4dC1sZWZ0IHAtbWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CisKKzxzY3JpcHQgbGFuZ3VhZ2U9J0phdmFTY3JpcHQnPgorPCEtLQoralF1ZXJ5KGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CisgICAgalF1ZXJ5KCIjaHRtbHJlcG9ydCIpLmh0bWwoIiR7U3RyaW5nVXRpbC53cmFwU3RyaW5nKGxvZ0ZpbGVDb250ZW50ISl9Iik7Cit9KTsKKy8vLS0+Cis8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvcHJpY2F0L3dlYmFwcC9wcmljYXRkZW1vL2Vycm9yL2Vycm9yLmpzcCBiL3BsdWdpbnMvcHJpY2F0L3dlYmFwcC9wcmljYXRkZW1vL2Vycm9yL2Vycm9yLmpzcAppbmRleCA3ZjRhZjhmLi41ZjRkZTAxIDEwMDY0NAotLS0gYS9wbHVnaW5zL3ByaWNhdC93ZWJhcHAvcHJpY2F0ZGVtby9lcnJvci9lcnJvci5qc3AKKysrIGIvcGx1Z2lucy9wcmljYXQvd2ViYXBwL3ByaWNhdGRlbW8vZXJyb3IvZXJyb3IuanNwCkBAIC0xLDUyICsxLDUyIEBACi08JS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLSU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLm9mYml6LmJhc2UudXRpbC4qIiAlPg0KLTxodG1sPg0KLTxoZWFkPg0KLTx0aXRsZT5PRkJpeiBNZXNzYWdlPC90aXRsZT4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi08L2hlYWQ+DQotDQotPCUgU3RyaW5nIGVycm9yTXNnID0gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoIl9FUlJPUl9NRVNTQUdFXyIpOyAlPg0KLQ0KLTxib2R5IGJnY29sb3I9IiNGRkZGRkYiPg0KLTxkaXYgYWxpZ249ImNlbnRlciI+DQotICA8YnIvPg0KLSAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGhlaWdodD0iMjAwIj4NCi0gICAgPHRyPg0KLSAgICAgIDx0ZD4NCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBoZWlnaHQ9IjIwMCI+DQotICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjQ0M2NjY2Ij4NCi0gICAgICAgICAgICA8dGQgaGVpZ2h0PSI0NSI+DQotICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJjZW50ZXIiPjxmb250IGZhY2U9IlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9IjQiIGNvbG9yPSIjRkZGRkZGIj48Yj46RVJST1IgTUVTU0FHRTo8L2I+PC9mb250PjwvZGl2Pg0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgIDwvdHI+DQotICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSIyIj48JT1VdGlsRm9ybWF0T3V0LnJlcGxhY2VTdHJpbmcoZXJyb3JNc2csICJcbiIsICI8YnIvPiIpJT48L2ZvbnQ+PC9kaXY+DQotICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgPC90cj4NCi0gICAgICAgIDwvdGFibGU+DQotICAgICAgPC90ZD4NCi0gICAgPC90cj4NCi0gIDwvdGFibGU+DQotPC9kaXY+DQotPGRpdiBhbGlnbj0iY2VudGVyIj48L2Rpdj4NCi08L2JvZHk+DQotPC9odG1sPg0KKzwlLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCistLSU+Cis8JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUub2ZiaXouYmFzZS51dGlsLioiICU+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPk9GQml6IE1lc3NhZ2U8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzwlIFN0cmluZyBlcnJvck1zZyA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJfRVJST1JfTUVTU0FHRV8iKTsgJT4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8ZGl2IGFsaWduPSJjZW50ZXIiPgorICA8YnIvPgorICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgaGVpZ2h0PSIyMDAiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGhlaWdodD0iMjAwIj4KKyAgICAgICAgICA8dHIgYmdjb2xvcj0iI0NDNjY2NiI+CisgICAgICAgICAgICA8dGQgaGVpZ2h0PSI0NSI+CisgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+PGZvbnQgZmFjZT0iVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgc2l6ZT0iNCIgY29sb3I9IiNGRkZGRkYiPjxiPjpFUlJPUiBNRVNTQUdFOjwvYj48L2ZvbnQ+PC9kaXY+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSIyIj48JT1VdGlsRm9ybWF0T3V0LnJlcGxhY2VTdHJpbmcoZXJyb3JNc2csICJcbiIsICI8YnIvPiIpJT48L2ZvbnQ+PC9kaXY+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+Cis8L2Rpdj4KKzxkaXYgYWxpZ249ImNlbnRlciI+PC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3Byb2plY3RtZ3Ivd2ViYXBwL3Byb2plY3RtZ3IvZXJyb3IvZXJyb3IuanNwIGIvcGx1Z2lucy9wcm9qZWN0bWdyL3dlYmFwcC9wcm9qZWN0bWdyL2Vycm9yL2Vycm9yLmpzcAppbmRleCA3ZjRhZjhmLi41ZjRkZTAxIDEwMDY0NAotLS0gYS9wbHVnaW5zL3Byb2plY3RtZ3Ivd2ViYXBwL3Byb2plY3RtZ3IvZXJyb3IvZXJyb3IuanNwCisrKyBiL3BsdWdpbnMvcHJvamVjdG1nci93ZWJhcHAvcHJvamVjdG1nci9lcnJvci9lcnJvci5qc3AKQEAgLTEsNTIgKzEsNTIgQEAKLTwlLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUub2ZiaXouYmFzZS51dGlsLioiICU+DQotPGh0bWw+DQotPGhlYWQ+DQotPHRpdGxlPk9GQml6IE1lc3NhZ2U8L3RpdGxlPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLTwvaGVhZD4NCi0NCi08JSBTdHJpbmcgZXJyb3JNc2cgPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiX0VSUk9SX01FU1NBR0VfIik7ICU+DQotDQotPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+DQotPGRpdiBhbGlnbj0iY2VudGVyIj4NCi0gIDxici8+DQotICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgaGVpZ2h0PSIyMDAiPg0KLSAgICA8dHI+DQotICAgICAgPHRkPg0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGhlaWdodD0iMjAwIj4NCi0gICAgICAgICAgPHRyIGJnY29sb3I9IiNDQzY2NjYiPg0KLSAgICAgICAgICAgIDx0ZCBoZWlnaHQ9IjQ1Ij4NCi0gICAgICAgICAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+PGZvbnQgZmFjZT0iVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgc2l6ZT0iNCIgY29sb3I9IiNGRkZGRkYiPjxiPjpFUlJPUiBNRVNTQUdFOjwvYj48L2ZvbnQ+PC9kaXY+DQotICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgPC90cj4NCi0gICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPjxmb250IGZhY2U9IlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9IjIiPjwlPVV0aWxGb3JtYXRPdXQucmVwbGFjZVN0cmluZyhlcnJvck1zZywgIlxuIiwgIjxici8+IiklPjwvZm9udD48L2Rpdj4NCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICA8L3RyPg0KLSAgICAgICAgPC90YWJsZT4NCi0gICAgICA8L3RkPg0KLSAgICA8L3RyPg0KLSAgPC90YWJsZT4NCi08L2Rpdj4NCi08ZGl2IGFsaWduPSJjZW50ZXIiPjwvZGl2Pg0KLTwvYm9keT4NCi08L2h0bWw+DQorPCUtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKy0tJT4KKzwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5vZmJpei5iYXNlLnV0aWwuKiIgJT4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+T0ZCaXogTWVzc2FnZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPCUgU3RyaW5nIGVycm9yTXNnID0gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoIl9FUlJPUl9NRVNTQUdFXyIpOyAlPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxkaXYgYWxpZ249ImNlbnRlciI+CisgIDxici8+CisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBoZWlnaHQ9IjIwMCI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgaGVpZ2h0PSIyMDAiPgorICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjQ0M2NjY2Ij4KKyAgICAgICAgICAgIDx0ZCBoZWlnaHQ9IjQ1Ij4KKyAgICAgICAgICAgICAgPGRpdiBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSI0IiBjb2xvcj0iI0ZGRkZGRiI+PGI+OkVSUk9SIE1FU1NBR0U6PC9iPjwvZm9udD48L2Rpdj4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPjxmb250IGZhY2U9IlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9IjIiPjwlPVV0aWxGb3JtYXRPdXQucmVwbGFjZVN0cmluZyhlcnJvck1zZywgIlxuIiwgIjxici8+IiklPjwvZm9udD48L2Rpdj4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKzwvZGl2PgorPGRpdiBhbGlnbj0iY2VudGVyIj48L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvYWRtaW4tZXh0cmEuaHRtbCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvYWRtaW4tZXh0cmEuaHRtbAppbmRleCA4ZjJiMzJhLi5mZWNhYjIwIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2FkbWluLWV4dHJhLmh0bWwKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9hZG1pbi1leHRyYS5odG1sCkBAIC0xLDI0ICsxLDI0IEBACi08IS0tDQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPCEtLSBUaGUgY29udGVudCBvZiB0aGlzIHBhZ2Ugd2lsbCBiZSBzdGF0aWNhbGx5IGluY2x1ZGVkIGludG8gdGhlIHRvcC0NCi1yaWdodCBib3ggb2YgdGhlIGNvcmVzIG92ZXJ2aWV3IHBhZ2UuIFVuY29tbWVudCB0aGlzIGFzIGFuIGV4YW1wbGUgdG8gDQotc2VlIHRoZXJlIHRoZSBjb250ZW50IHdpbGwgc2hvdyB1cC4NCi0NCi08aW1nIHNyYz0iaW1nL2ljby9jb25zdHJ1Y3Rpb24ucG5nIj4gVGhpcyBsaW5lIHdpbGwgYXBwZWFyIGF0IHRoZSB0b3AtDQotcmlnaHQgYm94IG9uIGNvbGxlY3Rpb24xJ3MgT3ZlcnZpZXcNCi0tLT4NCis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhlIGNvbnRlbnQgb2YgdGhpcyBwYWdlIHdpbGwgYmUgc3RhdGljYWxseSBpbmNsdWRlZCBpbnRvIHRoZSB0b3AtCityaWdodCBib3ggb2YgdGhlIGNvcmVzIG92ZXJ2aWV3IHBhZ2UuIFVuY29tbWVudCB0aGlzIGFzIGFuIGV4YW1wbGUgdG8gCitzZWUgdGhlcmUgdGhlIGNvbnRlbnQgd2lsbCBzaG93IHVwLgorCis8aW1nIHNyYz0iaW1nL2ljby9jb25zdHJ1Y3Rpb24ucG5nIj4gVGhpcyBsaW5lIHdpbGwgYXBwZWFyIGF0IHRoZSB0b3AtCityaWdodCBib3ggb24gY29sbGVjdGlvbjEncyBPdmVydmlldworLS0+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2FkbWluLWV4dHJhLm1lbnUtYm90dG9tLmh0bWwgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2FkbWluLWV4dHJhLm1lbnUtYm90dG9tLmh0bWwKaW5kZXggNWY1ZWRkZC4uMzM1OWE0NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9hZG1pbi1leHRyYS5tZW51LWJvdHRvbS5odG1sCisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvYWRtaW4tZXh0cmEubWVudS1ib3R0b20uaHRtbApAQCAtMSwyNSArMSwyNSBAQAotPCEtLQ0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gYWRtaW4tZXh0cmEubWVudS1ib3R0b20uaHRtbCAtLT4NCi08IS0tDQotPGxpPg0KLSAgPGEgaHJlZj0iIyIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6IHVybChpbWcvaWNvL2NvbnN0cnVjdGlvbi5wbmcpOyI+DQotICAgIExBU1QgSVRFTQ0KLSAgPC9hPg0KLTwvbGk+DQotLS0+DQorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIGFkbWluLWV4dHJhLm1lbnUtYm90dG9tLmh0bWwgLS0+Cis8IS0tCis8bGk+CisgIDxhIGhyZWY9IiMiIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1nL2ljby9jb25zdHJ1Y3Rpb24ucG5nKTsiPgorICAgIExBU1QgSVRFTQorICA8L2E+Cis8L2xpPgorLS0+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2FkbWluLWV4dHJhLm1lbnUtdG9wLmh0bWwgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2FkbWluLWV4dHJhLm1lbnUtdG9wLmh0bWwKaW5kZXggNmM5ODBlYi4uMDg4NmNlZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9hZG1pbi1leHRyYS5tZW51LXRvcC5odG1sCisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvYWRtaW4tZXh0cmEubWVudS10b3AuaHRtbApAQCAtMSwyNSArMSwyNSBAQAotPCEtLQ0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTwhLS0gYWRtaW4tZXh0cmEubWVudS10b3AuaHRtbCAtLT4NCi08IS0tDQotPGxpPg0KLSAgPGEgaHJlZj0iIyIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6IHVybChpbWcvaWNvL2NvbnN0cnVjdGlvbi5wbmcpOyI+DQotICAgIEZJUlNUIElURU0NCi0gIDwvYT4NCi08L2xpPg0KLS0tPg0KKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBhZG1pbi1leHRyYS5tZW51LXRvcC5odG1sIC0tPgorPCEtLQorPGxpPgorICA8YSBocmVmPSIjIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTogdXJsKGltZy9pY28vY29uc3RydWN0aW9uLnBuZyk7Ij4KKyAgICBGSVJTVCBJVEVNCisgIDwvYT4KKzwvbGk+CistLT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9jb250cmFjdGlvbnNfY2EudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL2NvbnRyYWN0aW9uc19jYS50eHQKaW5kZXggMTE2NjQ0Zi4uMzA3YTg1ZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL2NvbnRyYWN0aW9uc19jYS50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL2NvbnRyYWN0aW9uc19jYS50eHQKQEAgLTEsOCArMSw4IEBACi0jIFNldCBvZiBDYXRhbGFuIGNvbnRyYWN0aW9ucyBmb3IgRWxpc2lvbkZpbHRlcg0KLSMgVE9ETzogbG9hZCB0aGlzIGFzIGEgcmVzb3VyY2UgZnJvbSB0aGUgYW5hbHl6ZXIgYW5kIHN5bmMgaXQgaW4gYnVpbGQueG1sDQotZA0KLWwNCi1tDQotbg0KLXMNCi10DQorIyBTZXQgb2YgQ2F0YWxhbiBjb250cmFjdGlvbnMgZm9yIEVsaXNpb25GaWx0ZXIKKyMgVE9ETzogbG9hZCB0aGlzIGFzIGEgcmVzb3VyY2UgZnJvbSB0aGUgYW5hbHl6ZXIgYW5kIHN5bmMgaXQgaW4gYnVpbGQueG1sCitkCitsCittCituCitzCit0CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvY29udHJhY3Rpb25zX2ZyLnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9jb250cmFjdGlvbnNfZnIudHh0CmluZGV4IDZkZTczYzIuLmYxYmJhNTEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9jb250cmFjdGlvbnNfZnIudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9jb250cmFjdGlvbnNfZnIudHh0CkBAIC0xLDE1ICsxLDE1IEBACi0jIFNldCBvZiBGcmVuY2ggY29udHJhY3Rpb25zIGZvciBFbGlzaW9uRmlsdGVyDQotIyBUT0RPOiBsb2FkIHRoaXMgYXMgYSByZXNvdXJjZSBmcm9tIHRoZSBhbmFseXplciBhbmQgc3luYyBpdCBpbiBidWlsZC54bWwNCi1sDQotbQ0KLXQNCi1xdQ0KLW4NCi1zDQotag0KLWQNCi1jDQotanVzcXUNCi1xdW9pcXUNCi1sb3JzcXUNCi1wdWlzcXUNCisjIFNldCBvZiBGcmVuY2ggY29udHJhY3Rpb25zIGZvciBFbGlzaW9uRmlsdGVyCisjIFRPRE86IGxvYWQgdGhpcyBhcyBhIHJlc291cmNlIGZyb20gdGhlIGFuYWx5emVyIGFuZCBzeW5jIGl0IGluIGJ1aWxkLnhtbAorbAorbQordAorcXUKK24KK3MKK2oKK2QKK2MKK2p1c3F1CitxdW9pcXUKK2xvcnNxdQorcHVpc3F1CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvY29udHJhY3Rpb25zX2dhLnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9jb250cmFjdGlvbnNfZ2EudHh0CmluZGV4IDg0OWIwYzYuLjllYmU3ZmEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9jb250cmFjdGlvbnNfZ2EudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9jb250cmFjdGlvbnNfZ2EudHh0CkBAIC0xLDUgKzEsNSBAQAotIyBTZXQgb2YgSXJpc2ggY29udHJhY3Rpb25zIGZvciBFbGlzaW9uRmlsdGVyDQotIyBUT0RPOiBsb2FkIHRoaXMgYXMgYSByZXNvdXJjZSBmcm9tIHRoZSBhbmFseXplciBhbmQgc3luYyBpdCBpbiBidWlsZC54bWwNCi1kDQotbQ0KLWINCisjIFNldCBvZiBJcmlzaCBjb250cmFjdGlvbnMgZm9yIEVsaXNpb25GaWx0ZXIKKyMgVE9ETzogbG9hZCB0aGlzIGFzIGEgcmVzb3VyY2UgZnJvbSB0aGUgYW5hbHl6ZXIgYW5kIHN5bmMgaXQgaW4gYnVpbGQueG1sCitkCittCitiCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvY29udHJhY3Rpb25zX2l0LnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9jb250cmFjdGlvbnNfaXQudHh0CmluZGV4IDc5MGI1YWYuLmNhYzA0MDkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9jb250cmFjdGlvbnNfaXQudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9jb250cmFjdGlvbnNfaXQudHh0CkBAIC0xLDIzICsxLDIzIEBACi0jIFNldCBvZiBJdGFsaWFuIGNvbnRyYWN0aW9ucyBmb3IgRWxpc2lvbkZpbHRlcg0KLSMgVE9ETzogbG9hZCB0aGlzIGFzIGEgcmVzb3VyY2UgZnJvbSB0aGUgYW5hbHl6ZXIgYW5kIHN5bmMgaXQgaW4gYnVpbGQueG1sDQotYw0KLWwgDQotYWxsIA0KLWRhbGwgDQotZGVsbCANCi1uZWxsIA0KLXN1bGwgDQotY29sbCANCi1wZWxsIA0KLWdsIA0KLWFnbCANCi1kYWdsIA0KLWRlZ2wgDQotbmVnbCANCi1zdWdsIA0KLXVuIA0KLW0gDQotdCANCi1zIA0KLXYgDQotZA0KKyMgU2V0IG9mIEl0YWxpYW4gY29udHJhY3Rpb25zIGZvciBFbGlzaW9uRmlsdGVyCisjIFRPRE86IGxvYWQgdGhpcyBhcyBhIHJlc291cmNlIGZyb20gdGhlIGFuYWx5emVyIGFuZCBzeW5jIGl0IGluIGJ1aWxkLnhtbAorYworbCAKK2FsbCAKK2RhbGwgCitkZWxsIAorbmVsbCAKK3N1bGwgCitjb2xsIAorcGVsbCAKK2dsIAorYWdsIAorZGFnbCAKK2RlZ2wgCituZWdsIAorc3VnbCAKK3VuIAorbSAKK3QgCitzIAordiAKK2QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9oeXBoZW5hdGlvbnNfZ2EudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL2h5cGhlbmF0aW9uc19nYS50eHQKaW5kZXggZmNlNDEwMC4uNGQyNjQyYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL2h5cGhlbmF0aW9uc19nYS50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL2h5cGhlbmF0aW9uc19nYS50eHQKQEAgLTEsNSArMSw1IEBACi0jIFNldCBvZiBJcmlzaCBoeXBoZW5hdGlvbnMgZm9yIFN0b3BGaWx0ZXINCi0jIFRPRE86IGxvYWQgdGhpcyBhcyBhIHJlc291cmNlIGZyb20gdGhlIGFuYWx5emVyIGFuZCBzeW5jIGl0IGluIGJ1aWxkLnhtbA0KLWgNCi1uDQotdA0KKyMgU2V0IG9mIElyaXNoIGh5cGhlbmF0aW9ucyBmb3IgU3RvcEZpbHRlcgorIyBUT0RPOiBsb2FkIHRoaXMgYXMgYSByZXNvdXJjZSBmcm9tIHRoZSBhbmFseXplciBhbmQgc3luYyBpdCBpbiBidWlsZC54bWwKK2gKK24KK3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdGVtZGljdF9ubC50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RlbWRpY3RfbmwudHh0CmluZGV4IDAxZGQzYmIuLjQ0MTA3MjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdGVtZGljdF9ubC50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0ZW1kaWN0X25sLnR4dApAQCAtMSw2ICsxLDYgQEAKLSMgU2V0IG9mIG92ZXJyaWRlcyBmb3IgdGhlIGR1dGNoIHN0ZW1tZXINCi0jIFRPRE86IGxvYWQgdGhpcyBhcyBhIHJlc291cmNlIGZyb20gdGhlIGFuYWx5emVyIGFuZCBzeW5jIGl0IGluIGJ1aWxkLnhtbA0KLWZpZXRzCWZpZXRzDQotYnJvbWZpZXRzCWJyb21maWV0cw0KLWVpCWVpZXINCi1raW5kCWtpbmRlcg0KKyMgU2V0IG9mIG92ZXJyaWRlcyBmb3IgdGhlIGR1dGNoIHN0ZW1tZXIKKyMgVE9ETzogbG9hZCB0aGlzIGFzIGEgcmVzb3VyY2UgZnJvbSB0aGUgYW5hbHl6ZXIgYW5kIHN5bmMgaXQgaW4gYnVpbGQueG1sCitmaWV0cwlmaWV0cworYnJvbWZpZXRzCWJyb21maWV0cworZWkJZWllcgora2luZAlraW5kZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wdGFnc19qYS50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHRhZ3NfamEudHh0CmluZGV4IDJmYWYyYTYuLjcxYjc1MDggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wdGFnc19qYS50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B0YWdzX2phLnR4dApAQCAtMSw0MjAgKzEsNDIwIEBACi0jDQotIyBUaGlzIGZpbGUgZGVmaW5lcyBhIEphcGFuZXNlIHN0b3B0YWcgc2V0IGZvciBKYXBhbmVzZVBhcnRPZlNwZWVjaFN0b3BGaWx0ZXIuDQotIw0KLSMgQW55IHRva2VuIHdpdGggYSBwYXJ0LW9mLXNwZWVjaCB0YWcgdGhhdCBleGFjdGx5IG1hdGNoZXMgdGhvc2UgZGVmaW5lZCBpbiB0aGlzDQotIyBmaWxlIGFyZSByZW1vdmVkIGZyb20gdGhlIHRva2VuIHN0cmVhbS4NCi0jDQotIyBTZXQgeW91ciBvd24gc3RvcHRhZ3MgYnkgdW5jb21tZW50aW5nIHRoZSBsaW5lcyBiZWxvdy4gIE5vdGUgdGhhdCBjb21tZW50cyBhcmUNCi0jIG5vdCBhbGxvd2VkIG9uIHRoZSBzYW1lIGxpbmUgYXMgYSBzdG9wdGFnLiAgU2VlIExVQ0VORS0zNzQ1IGZvciBmcmVxdWVuY3kgbGlzdHMsDQotIyBldGMuIHRoYXQgY2FuIGJlIHVzZWZ1bCBmb3IgYnVpbGRpbmcgeW91IG93biBzdG9wdGFnIHNldC4NCi0jDQotIyBUaGUgZW50aXJlIHBvc3NpYmxlIHRhZ3NldCBpcyBwcm92aWRlZCBiZWxvdyBmb3IgY29udmVuaWVuY2UuDQotIw0KLSMjIyMjDQotIyAgbm91bjogdW5jbGFzc2lmaWVkIG5vdW5zDQotI+WQjeipng0KLSMNCi0jICBub3VuLWNvbW1vbjogQ29tbW9uIG5vdW5zIG9yIG5vdW5zIHdoZXJlIHRoZSBzdWItY2xhc3NpZmljYXRpb24gaXMgdW5kZWZpbmVkDQotI+WQjeipni3kuIDoiKwNCi0jDQotIyAgbm91bi1wcm9wZXI6IFByb3BlciBub3VucyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZCANCi0j5ZCN6KmeLeWbuuacieWQjeipng0KLSMNCi0jICBub3VuLXByb3Blci1taXNjOiBtaXNjZWxsYW5lb3VzIHByb3BlciBub3Vucw0KLSPlkI3oqZ4t5Zu65pyJ5ZCN6KmeLeS4gOiIrA0KLSMNCi0jICBub3VuLXByb3Blci1wZXJzb246IFBlcnNvbmFsIG5hbWVzIHdoZXJlIHRoZSBzdWItY2xhc3NpZmljYXRpb24gaXMgdW5kZWZpbmVkDQotI+WQjeipni3lm7rmnInlkI3oqZ4t5Lq65ZCNDQotIw0KLSMgIG5vdW4tcHJvcGVyLXBlcnNvbi1taXNjOiBuYW1lcyB0aGF0IGNhbm5vdCBiZSBkaXZpZGVkIGludG8gc3VybmFtZSBhbmQgDQotIyAgZ2l2ZW4gbmFtZTsgZm9yZWlnbiBuYW1lczsgbmFtZXMgd2hlcmUgdGhlIHN1cm5hbWUgb3IgZ2l2ZW4gbmFtZSBpcyB1bmtub3duLg0KLSMgIGUuZy4g44GK5biC44Gu5pa5DQotI+WQjeipni3lm7rmnInlkI3oqZ4t5Lq65ZCNLeS4gOiIrA0KLSMNCi0jICBub3VuLXByb3Blci1wZXJzb24tc3VybmFtZTogTWFpbmx5IEphcGFuZXNlIHN1cm5hbWVzLg0KLSMgIGUuZy4g5bGx55SwDQotI+WQjeipni3lm7rmnInlkI3oqZ4t5Lq65ZCNLeWnkw0KLSMNCi0jICBub3VuLXByb3Blci1wZXJzb24tZ2l2ZW5fbmFtZTogTWFpbmx5IEphcGFuZXNlIGdpdmVuIG5hbWVzLg0KLSMgIGUuZy4g5aSq6YOODQotI+WQjeipni3lm7rmnInlkI3oqZ4t5Lq65ZCNLeWQjQ0KLSMNCi0jICBub3VuLXByb3Blci1vcmdhbml6YXRpb246IE5hbWVzIHJlcHJlc2VudGluZyBvcmdhbml6YXRpb25zLg0KLSMgIGUuZy4g6YCa55Sj55yBLCBOSEsNCi0j5ZCN6KmeLeWbuuacieWQjeipni3ntYTnuZQNCi0jDQotIyAgbm91bi1wcm9wZXItcGxhY2U6IFBsYWNlIG5hbWVzIHdoZXJlIHRoZSBzdWItY2xhc3NpZmljYXRpb24gaXMgdW5kZWZpbmVkDQotI+WQjeipni3lm7rmnInlkI3oqZ4t5Zyw5Z+fDQotIw0KLSMgIG5vdW4tcHJvcGVyLXBsYWNlLW1pc2M6IFBsYWNlIG5hbWVzIGV4Y2x1ZGluZyBjb3VudHJpZXMuDQotIyAgZS5nLiDjgqLjgrjjgqIsIOODkOODq+OCu+ODreODiiwg5Lqs6YO9DQotI+WQjeipni3lm7rmnInlkI3oqZ4t5Zyw5Z+fLeS4gOiIrA0KLSMNCi0jICBub3VuLXByb3Blci1wbGFjZS1jb3VudHJ5OiBDb3VudHJ5IG5hbWVzLiANCi0jICBlLmcuIOaXpeacrCwg44Kq44O844K544OI44Op44Oq44KiDQotI+WQjeipni3lm7rmnInlkI3oqZ4t5Zyw5Z+fLeWbvQ0KLSMNCi0jICBub3VuLXByb25vdW46IFByb25vdW5zIHdoZXJlIHRoZSBzdWItY2xhc3NpZmljYXRpb24gaXMgdW5kZWZpbmVkDQotI+WQjeipni3ku6PlkI3oqZ4NCi0jDQotIyAgbm91bi1wcm9ub3VuLW1pc2M6IG1pc2NlbGxhbmVvdXMgcHJvbm91bnM6IA0KLSMgIGUuZy4g44Gd44KMLCDjgZPjgZMsIOOBguOBhOOBpCwg44GC44Gq44GfLCDjgYLjgaHjgZPjgaEsIOOBhOOBj+OBpCwg44Gp44GT44GLLCDjgarjgassIOOBv+OBquOBleOCkywg44G/44KT44GqLCDjgo/jgZ/jgY/jgZcsIOOCj+OCjOOCj+OCjA0KLSPlkI3oqZ4t5Luj5ZCN6KmeLeS4gOiIrA0KLSMNCi0jICBub3VuLXByb25vdW4tY29udHJhY3Rpb246IFNwb2tlbiBsYW5ndWFnZSBjb250cmFjdGlvbiBtYWRlIGJ5IGNvbWJpbmluZyBhIA0KLSMgIHByb25vdW4gYW5kIHRoZSBwYXJ0aWNsZSAnd2EnLg0KLSMgIGUuZy4g44GC44KK44KDLCDjgZPjgorjgoMsIOOBk+OCiuOCg+OBgiwg44Gd44KK44KDLCDjgZ3jgorjgoPjgYIgDQotI+WQjeipni3ku6PlkI3oqZ4t57iu57SEDQotIw0KLSMgIG5vdW4tYWR2ZXJiaWFsOiBUZW1wb3JhbCBub3VucyBzdWNoIGFzIG5hbWVzIG9mIGRheXMgb3IgbW9udGhzIHRoYXQgYmVoYXZlIA0KLSMgIGxpa2UgYWR2ZXJicy4gTm91bnMgdGhhdCByZXByZXNlbnQgYW1vdW50IG9yIHJhdGlvcyBhbmQgY2FuIGJlIHVzZWQgYWR2ZXJiaWFsbHksDQotIyAgZS5nLiDph5Hmm5wsIOS4gOaciCwg5Y2I5b6MLCDlsJHph48NCi0j5ZCN6KmeLeWJr+ipnuWPr+iDvQ0KLSMNCi0jICBub3VuLXZlcmJhbDogTm91bnMgdGhhdCB0YWtlIGFyZ3VtZW50cyB3aXRoIGNhc2UgYW5kIGNhbiBhcHBlYXIgZm9sbG93ZWQgYnkgDQotIyAgJ3N1cnUnIGFuZCByZWxhdGVkIHZlcmJzICjjgZnjgossIOOBp+OBjeOCiywg44Gq44GV44KLLCDjgY/jgaDjgZXjgospDQotIyAgZS5nLiDjgqTjg7Pjg5fjg4Pjg4gsIOaEm+edgCwg5oKq5YyWLCDmgqrmiKboi6bpl5gsIOS4gOWuieW/gywg5LiL5Y+W44KKDQotI+WQjeipni3jgrXlpInmjqXntpoNCi0jDQotIyAgbm91bi1hZGplY3RpdmUtYmFzZTogVGhlIGJhc2UgZm9ybSBvZiBhZGplY3RpdmVzLCB3b3JkcyB0aGF0IGFwcGVhciBiZWZvcmUg44GqICgibmEiKQ0KLSMgIGUuZy4g5YGl5bq3LCDlronmmJMsIOmnhOebriwg44Gg44KBDQotI+WQjeipni3lvaLlrrnli5XoqZ7oqp7lubkNCi0jDQotIyAgbm91bi1udW1lcmljOiBBcmFiaWMgbnVtYmVycywgQ2hpbmVzZSBudW1lcmFscywgYW5kIGNvdW50ZXJzIGxpa2Ug5L2VICjlm54pLCDmlbAuDQotIyAgZS5nLiAwLCAxLCAyLCDkvZUsIOaVsCwg5bm+DQotI+WQjeipni3mlbANCi0jDQotIyAgbm91bi1hZmZpeDogbm91biBhZmZpeGVzIHdoZXJlIHRoZSBzdWItY2xhc3NpZmljYXRpb24gaXMgdW5kZWZpbmVkDQotI+WQjeipni3pnZ7oh6rnq4sNCi0jDQotIyAgbm91bi1hZmZpeC1taXNjOiBPZiBhZG5vbWluYWxpemVycywgdGhlIGNhc2UtbWFya2VyIOOBriAoIm5vIiksIGFuZCB3b3JkcyB0aGF0IA0KLSMgIGF0dGFjaCB0byB0aGUgYmFzZSBmb3JtIG9mIGluZmxlY3Rpb25hbCB3b3Jkcywgd29yZHMgdGhhdCBjYW5ub3QgYmUgY2xhc3NpZmllZCANCi0jICBpbnRvIGFueSBvZiB0aGUgb3RoZXIgY2F0ZWdvcmllcyBiZWxvdy4gVGhpcyBjYXRlZ29yeSBpbmNsdWRlcyBpbmRlZmluaXRlIG5vdW5zLg0KLSMgIGUuZy4g44GC44GL44Gk44GNLCDmmoEsIOOBi+OBhCwg55Sy5paQLCDmsJcsIOOBjeOCieOBhCwg5auM44GELCDjgY/jgZssIOeZliwg44GT44GoLCDkuossIOOBlOOBqCwg5q+OLCDjgZfjgaDjgYQsIOasoeesrCwgDQotIyAgICAgICDpoIYsIOOBm+OBhCwg5omA54K6LCDjgaTjgYTjgacsIOW6j+OBpywg44Gk44KC44KKLCDnqY3jgoLjgoosIOeCuSwg44Gp44GT44KNLCDjga4sIOOBr+OBmiwg562ILCDjga/jgZrjgb8sIOW8vuOBvywgDQotIyAgICAgICDmi43lrZAsIOOBteOBhiwg44G144KKLCDmjK/jgoosIOOBu+OBhiwg5pa5LCDml6gsIOOCguOBriwg54mpLCDogIUsIOOChuOBiCwg5pWFLCDjgobjgYjjgpMsIOaJgOS7pSwg44KP44GRLCDoqLMsDQotIyAgICAgICDjgo/jgoosIOWJsuOCiiwg5YmyLCDjgpMt5Y+j6KqeLywg44KC44KTLeWPo+iqni8NCi0j5ZCN6KmeLemdnuiHqueriy3kuIDoiKwNCi0jDQotIyAgbm91bi1hZmZpeC1hZHZlcmJpYWw6IG5vdW4gYWZmaXhlcyB0aGF0IHRoYXQgY2FuIGJlaGF2ZSBhcyBhZHZlcmJzLg0KLSMgIGUuZy4g44GC44GE44GgLCDplpMsIOOBguOBkuOBjywg5oyZ44GS5Y+lLCDjgYLjgagsIOW+jCwg5L2Z44KKLCDku6XlpJYsIOS7pemZjSwg5Lul5b6MLCDku6XkuIosIOS7peWJjSwg5LiA5pa5LCDjgYbjgYgsIA0KLSMgICAgICAg5LiKLCDjgYbjgaEsIOWGhSwg44GK44KKLCDmipjjgoosIOOBi+OBjuOCiiwg6ZmQ44KKLCDjgY3jgoosIOOBo+OBjeOCiiwg57WQ5p6cLCDjgZPjgo0sIOmggywg44GV44GELCDpmpssIOacgOS4rSwg44GV44Gq44GLLCANCi0jICAgICAgIOacgOS4rSwg44GY44Gf44GELCDoh6rkvZMsIOOBn+OBsywg5bqmLCDjgZ/jgoEsIOeCuiwg44Gk44GpLCDpg73luqYsIOOBqOOBiuOCiiwg6YCa44KKLCDjgajjgY0sIOaZgiwg44Go44GT44KNLCDmiYAsIA0KLSMgICAgICAg44Go44Gf44KTLCDpgJTnq68sIOOBquOBiywg5LitLCDjga7jgaEsIOW+jCwg44Gw44GC44GELCDloLTlkIgsIOaXpSwg44G244KTLCDliIYsIOOBu+OBiywg5LuWLCDjgb7jgYgsIOWJjSwg44G+44G+LCANCi0jICAgICAgIOWEmCwg5L6tLCDjgb/jgY7jgoosIOefouWFiA0KLSPlkI3oqZ4t6Z2e6Ieq56uLLeWJr+ipnuWPr+iDvQ0KLSMNCi0jICBub3VuLWFmZml4LWF1eDogbm91biBhZmZpeGVzIHRyZWF0ZWQgYXMg5Yqp5YuV6KmeICgiYXV4aWxpYXJ5IHZlcmIiKSBpbiBzY2hvb2wgZ3JhbW1hcnMgDQotIyAgd2l0aCB0aGUgc3RlbSDjgojjgYYo44GgKSAoInlvdShkYSkiKS4NCi0jICBlLmcuICDjgojjgYYsIOOChOOBhiwg5qeYICjjgojjgYYpDQotI+WQjeipni3pnZ7oh6rnq4st5Yqp5YuV6Kme6Kqe5bm5DQotIyAgDQotIyAgbm91bi1hZmZpeC1hZGplY3RpdmUtYmFzZTogbm91biBhZmZpeGVzIHRoYXQgY2FuIGNvbm5lY3QgdG8gdGhlIGluZGVjbGluYWJsZQ0KLSMgIGNvbm5lY3Rpb24gZm9ybSDjgaogKGF1eCAiZGEiKS4NCi0jICBlLmcuIOOBv+OBn+OBhCwg44G144GGDQotI+WQjeipni3pnZ7oh6rnq4st5b2i5a655YuV6Kme6Kqe5bm5DQotIw0KLSMgIG5vdW4tc3BlY2lhbDogc3BlY2lhbCBub3VucyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZC4NCi0j5ZCN6KmeLeeJueauig0KLSMNCi0jICBub3VuLXNwZWNpYWwtYXV4OiBUaGUg44Gd44GG44GgICgic291ZGEiKSBzdGVtIGZvcm0gdGhhdCBpcyB1c2VkIGZvciByZXBvcnRpbmcgbmV3cywgaXMgDQotIyAgdHJlYXRlZCBhcyDliqnli5XoqZ4gKCJhdXhpbGlhcnkgdmVyYiIpIGluIHNjaG9vbCBncmFtbWFycywgYW5kIGF0dGFjaCB0byB0aGUgYmFzZSANCi0jICBmb3JtIG9mIGluZmxlY3Rpb25hbCB3b3Jkcy4NCi0jICBlLmcuIOOBneOBhg0KLSPlkI3oqZ4t54m55q6KLeWKqeWLleipnuiqnuW5uQ0KLSMNCi0jICBub3VuLXN1ZmZpeDogbm91biBzdWZmaXhlcyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZC4NCi0j5ZCN6KmeLeaOpeWwvg0KLSMNCi0jICBub3VuLXN1ZmZpeC1taXNjOiBPZiB0aGUgbm91bnMgb3Igc3RlbSBmb3JtcyBvZiBvdGhlciBwYXJ0cyBvZiBzcGVlY2ggdGhhdCBjb25uZWN0IA0KLSMgIHRvIOOCrOODqyBvciDjgr/jgqQgYW5kIGNhbiBjb21iaW5lIGludG8gY29tcG91bmQgbm91bnMsIHdvcmRzIHRoYXQgY2Fubm90IGJlIGNsYXNzaWZpZWQgaW50bw0KLSMgIGFueSBvZiB0aGUgb3RoZXIgY2F0ZWdvcmllcyBiZWxvdy4gSW4gZ2VuZXJhbCwgdGhpcyBjYXRlZ29yeSBpcyBtb3JlIGluY2x1c2l2ZSB0aGFuIA0KLSMgIOaOpeWwvuiqniAoInN1ZmZpeCIpIGFuZCBpcyB1c3VhbGx5IHRoZSBsYXN0IGVsZW1lbnQgaW4gYSBjb21wb3VuZCBub3VuLg0KLSMgIGUuZy4g44GK44GNLCDjgYvjgZ8sIOaWuSwg55Sy5paQICjjgYzjgYQpLCDjgYzjgYvjgoosIOOBjuOBvywg5rCX5ZGzLCDjgZDjgovjgb8sICjvvZ7jgZfjgZ8pIOOBlSwg5qyh56ysLCDmuIggKOOBmikg44G/LA0KLSMgICAgICAg44KI44GGLCAo44Gn44GNKeOBo+OBkywg5oSfLCDoprMsIOaApywg5a2mLCDpoZ4sIOmdoiwg55SoDQotI+WQjeipni3mjqXlsL4t5LiA6IisDQotIw0KLSMgIG5vdW4tc3VmZml4LXBlcnNvbjogU3VmZml4ZXMgdGhhdCBmb3JtIG5vdW5zIGFuZCBhdHRhY2ggdG8gcGVyc29uIG5hbWVzIG1vcmUgb2Z0ZW4NCi0jICB0aGFuIG90aGVyIG5vdW5zLg0KLSMgIGUuZy4g5ZCbLCDmp5gsIOiRlw0KLSPlkI3oqZ4t5o6l5bC+LeS6uuWQjQ0KLSMNCi0jICBub3VuLXN1ZmZpeC1wbGFjZTogU3VmZml4ZXMgdGhhdCBmb3JtIG5vdW5zIGFuZCBhdHRhY2ggdG8gcGxhY2UgbmFtZXMgbW9yZSBvZnRlbiANCi0jICB0aGFuIG90aGVyIG5vdW5zLg0KLSMgIGUuZy4g55S6LCDluIIsIOecjA0KLSPlkI3oqZ4t5o6l5bC+LeWcsOWfnw0KLSMNCi0jICBub3VuLXN1ZmZpeC12ZXJiYWw6IE9mIHRoZSBzdWZmaXhlcyB0aGF0IGF0dGFjaCB0byBub3VucyBhbmQgZm9ybSBub3VucywgdGhvc2UgdGhhdCANCi0jICBjYW4gYXBwZWFyIGJlZm9yZSDjgrnjg6sgKCJzdXJ1IikuDQotIyAgZS5nLiDljJYsIOimliwg5YiG44GRLCDlhaXjgoosIOiQveOBoSwg6LK344GEDQotI+WQjeipni3mjqXlsL4t44K15aSJ5o6l57aaDQotIw0KLSMgIG5vdW4tc3VmZml4LWF1eDogVGhlIHN0ZW0gZm9ybSBvZiDjgZ3jgYbjgaAgKOanmOaFiykgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlIGNvbmRpdGlvbnMsIA0KLSMgIGlzIHRyZWF0ZWQgYXMg5Yqp5YuV6KmeICgiYXV4aWxpYXJ5IHZlcmIiKSBpbiBzY2hvb2wgZ3JhbW1hcnMsIGFuZCBhdHRhY2ggdG8gdGhlIA0KLSMgIGNvbmp1bmN0aXZlIGZvcm0gb2YgaW5mbGVjdGlvbmFsIHdvcmRzLg0KLSMgIGUuZy4g44Gd44GGDQotI+WQjeipni3mjqXlsL4t5Yqp5YuV6Kme6Kqe5bm5DQotIw0KLSMgIG5vdW4tc3VmZml4LWFkamVjdGl2ZS1iYXNlOiBTdWZmaXhlcyB0aGF0IGF0dGFjaCB0byBvdGhlciBub3VucyBvciB0aGUgY29uanVuY3RpdmUgDQotIyAgZm9ybSBvZiBpbmZsZWN0aW9uYWwgd29yZHMgYW5kIGFwcGVhciBiZWZvcmUgdGhlIGNvcHVsYSDjgaAgKCJkYSIpLg0KLSMgIGUuZy4g55qELCDjgZIsIOOBjOOBoQ0KLSPlkI3oqZ4t5o6l5bC+LeW9ouWuueWLleipnuiqnuW5uQ0KLSMNCi0jICBub3VuLXN1ZmZpeC1hZHZlcmJpYWw6IFN1ZmZpeGVzIHRoYXQgYXR0YWNoIHRvIG90aGVyIG5vdW5zIGFuZCBjYW4gYmVoYXZlIGFzIGFkdmVyYnMuDQotIyAgZS5nLiDlvowgKOOBlCksIOS7peW+jCwg5Lul6ZmNLCDku6XliY0sIOWJjeW+jCwg5LitLCDmnKssIOS4iiwg5pmCICjjgZgpDQotI+WQjeipni3mjqXlsL4t5Ymv6Kme5Y+v6IO9DQotIw0KLSMgIG5vdW4tc3VmZml4LWNsYXNzaWZpZXI6IFN1ZmZpeGVzIHRoYXQgYXR0YWNoIHRvIG51bWJlcnMgYW5kIGZvcm0gbm91bnMuIFRoaXMgY2F0ZWdvcnkgDQotIyAgaXMgbW9yZSBpbmNsdXNpdmUgdGhhbiDliqnmlbDoqZ4gKCJjbGFzc2lmaWVyIikgYW5kIGluY2x1ZGVzIGNvbW1vbiBub3VucyB0aGF0IGF0dGFjaCANCi0jICB0byBudW1iZXJzLg0KLSMgIGUuZy4g5YCLLCDjgaQsIOacrCwg5YaKLCDjg5Hjg7zjgrvjg7Pjg4gsIGNtLCBrZywg44Kr5pyILCDjgYvlm70sIOWMuueUuywg5pmC6ZaTLCDmmYLljYoNCi0j5ZCN6KmeLeaOpeWwvi3liqnmlbDoqZ4NCi0jDQotIyAgbm91bi1zdWZmaXgtc3BlY2lhbDogU3BlY2lhbCBzdWZmaXhlcyB0aGF0IG1haW5seSBhdHRhY2ggdG8gaW5mbGVjdGluZyB3b3Jkcy4NCi0jICBlLmcuICjmpb3jgZcpIOOBlSwgKOiAg+OBiCkg5pa5DQotI+WQjeipni3mjqXlsL4t54m55q6KDQotIw0KLSMgIG5vdW4tc3VmZml4LWNvbmp1bmN0aXZlOiBOb3VucyB0aGF0IGJlaGF2ZSBsaWtlIGNvbmp1bmN0aW9ucyBhbmQgam9pbiB0d28gd29yZHMgDQotIyAgdG9nZXRoZXIuDQotIyAgZS5nLiAo5pel5pysKSDlr74gKOOCouODoeODquOCqyksIOWvviAo44Ki44Oh44Oq44KrKSwgKDMpIOWvviAoNSksICjlpbPlhKopIOWFvCAo5Li75ammKQ0KLSPlkI3oqZ4t5o6l57aa6Kme55qEDQotIw0KLSMgIG5vdW4tdmVyYmFsX2F1eDogTm91bnMgdGhhdCBhdHRhY2ggdG8gdGhlIGNvbmp1bmN0aXZlIHBhcnRpY2xlIOOBpiAoInRlIikgYW5kIGFyZSANCi0jICBzZW1hbnRpY2FsbHkgdmVyYi1saWtlLg0KLSMgIGUuZy4g44GU44KJ44KTLCDjgZTopqcsIOW+oeimpywg6aCC5oi0DQotI+WQjeipni3li5XoqZ7pnZ7oh6rnq4vnmoQNCi0jDQotIyAgbm91bi1xdW90YXRpb246IHRleHQgdGhhdCBjYW5ub3QgYmUgc2VnbWVudGVkIGludG8gd29yZHMsIHByb3ZlcmJzLCBDaGluZXNlIHBvZXRyeSwgDQotIyAgZGlhbGVjdHMsIEVuZ2xpc2gsIGV0Yy4gQ3VycmVudGx5LCB0aGUgb25seSBlbnRyeSBmb3Ig5ZCN6KmeIOW8leeUqOaWh+Wtl+WIlyAoIm5vdW4gcXVvdGF0aW9uIikgDQotIyAgaXMg44GE44KP44GPICgiaXdha3UiKS4NCi0j5ZCN6KmeLeW8leeUqOaWh+Wtl+WIlw0KLSMNCi0jICBub3VuLW5haV9hZGplY3RpdmU6IFdvcmRzIHRoYXQgYXBwZWFyIGJlZm9yZSB0aGUgYXV4aWxpYXJ5IHZlcmIg44Gq44GEICgibmFpIikgYW5kDQotIyAgYmVoYXZlIGxpa2UgYW4gYWRqZWN0aXZlLg0KLSMgIGUuZy4g55Sz44GX6KizLCDku5XmlrksIOOBqOOCk+OBp+OCgiwg6YGV44GEDQotI+WQjeipni3jg4rjgqTlvaLlrrnoqZ7oqp7lubkNCi0jDQotIyMjIyMNCi0jICBwcmVmaXg6IHVuY2xhc3NpZmllZCBwcmVmaXhlcw0KLSPmjqXpoK3oqZ4NCi0jDQotIyAgcHJlZml4LW5vbWluYWw6IFByZWZpeGVzIHRoYXQgYXR0YWNoIHRvIG5vdW5zIChpbmNsdWRpbmcgYWRqZWN0aXZlIHN0ZW0gZm9ybXMpIA0KLSMgIGV4Y2x1ZGluZyBudW1lcmljYWwgZXhwcmVzc2lvbnMuDQotIyAgZS5nLiDjgYogKOawtCksIOafkCAo5rCPKSwg5ZCMICjnpL4pLCDmlYUgKO+9nuawjyksIOmrmCAo5ZOB6LOqKSwg44GKICjopovkuospLCDjgZQgKOeri+a0vikNCi0j5o6l6aCt6KmeLeWQjeipnuaOpee2mg0KLSMNCi0jICBwcmVmaXgtdmVyYmFsOiBQcmVmaXhlcyB0aGF0IGF0dGFjaCB0byB0aGUgaW1wZXJhdGl2ZSBmb3JtIG9mIGEgdmVyYiBvciBhIHZlcmINCi0jICBpbiBjb25qdW5jdGl2ZSBmb3JtIGZvbGxvd2VkIGJ5IOOBquOCiy/jgarjgZXjgosv44GP44Gg44GV44KLLg0KLSMgIGUuZy4g44GKICjoqq3jgb/jgarjgZXjgYQpLCDjgYogKOW6p+OCiikNCi0j5o6l6aCt6KmeLeWLleipnuaOpee2mg0KLSMNCi0jICBwcmVmaXgtYWRqZWN0aXZhbDogUHJlZml4ZXMgdGhhdCBhdHRhY2ggdG8gYWRqZWN0aXZlcy4NCi0jICBlLmcuIOOBiiAo5a+S44GE44Gn44GZ44Gt44GIKSwg44OQ44KrICjjgafjgYvjgYQpDQotI+aOpemgreipni3lvaLlrrnoqZ7mjqXntpoNCi0jDQotIyAgcHJlZml4LW51bWVyaWNhbDogUHJlZml4ZXMgdGhhdCBhdHRhY2ggdG8gbnVtZXJpY2FsIGV4cHJlc3Npb25zLg0KLSMgIGUuZy4g57SELCDjgYrjgojjgZ0sIOavjuaZgg0KLSPmjqXpoK3oqZ4t5pWw5o6l57aaDQotIw0KLSMjIyMjDQotIyAgdmVyYjogdW5jbGFzc2lmaWVkIHZlcmJzDQotI+WLleipng0KLSMNCi0jICB2ZXJiLW1haW46DQotI+WLleipni3oh6rnq4sNCi0jDQotIyAgdmVyYi1hdXhpbGlhcnk6DQotI+WLleipni3pnZ7oh6rnq4sNCi0jDQotIyAgdmVyYi1zdWZmaXg6DQotI+WLleipni3mjqXlsL4NCi0jDQotIyMjIyMNCi0jICBhZGplY3RpdmU6IHVuY2xhc3NpZmllZCBhZGplY3RpdmVzDQotI+W9ouWuueipng0KLSMNCi0jICBhZGplY3RpdmUtbWFpbjoNCi0j5b2i5a656KmeLeiHqueriw0KLSMNCi0jICBhZGplY3RpdmUtYXV4aWxpYXJ5Og0KLSPlvaLlrrnoqZ4t6Z2e6Ieq56uLDQotIw0KLSMgIGFkamVjdGl2ZS1zdWZmaXg6DQotI+W9ouWuueipni3mjqXlsL4NCi0jDQotIyMjIyMNCi0jICBhZHZlcmI6IHVuY2xhc3NpZmllZCBhZHZlcmJzDQotI+WJr+ipng0KLSMNCi0jICBhZHZlcmItbWlzYzogV29yZHMgdGhhdCBjYW4gYmUgc2VnbWVudGVkIGludG8gb25lIHVuaXQgYW5kIHdoZXJlIGFkbm9taW5hbCANCi0jICBtb2RpZmljYXRpb24gaXMgbm90IHBvc3NpYmxlLg0KLSMgIGUuZy4g44GC44GE44GL44KP44KJ44GaLCDlpJrliIYNCi0j5Ymv6KmeLeS4gOiIrA0KLSMNCi0jICBhZHZlcmItcGFydGljbGVfY29uanVuY3Rpb246IEFkdmVyYnMgdGhhdCBjYW4gYmUgZm9sbG93ZWQgYnkg44GuLCDjga8sIOOBqywgDQotIyAg44GqLCDjgZnjgossIOOBoCwgZXRjLg0KLSMgIGUuZy4g44GT44KT44Gq44GrLCDjgZ3jgpPjgarjgassIOOBguOCk+OBquOBqywg44Gq44Gr44GLLCDjgarjgpPjgafjgoINCi0j5Ymv6KmeLeWKqeipnumhnuaOpee2mg0KLSMNCi0jIyMjIw0KLSMgIGFkbm9taW5hbDogV29yZHMgdGhhdCBvbmx5IGhhdmUgbm91bi1tb2RpZnlpbmcgZm9ybXMuDQotIyAgZS5nLiDjgZPjga4sIOOBneOBriwg44GC44GuLCDjganjga4sIOOBhOOCj+OChuOCiywg44Gq44KT44KJ44GL44GuLCDkvZXjgonjgYvjga4sIOOBhOOCjeOCk+OBqiwg44GT44GG44GE44GGLCDjgZ3jgYbjgYTjgYYsIOOBguOBguOBhOOBhiwgDQotIyAgICAgICDjganjgYbjgYTjgYYsIOOBk+OCk+OBqiwg44Gd44KT44GqLCDjgYLjgpPjgaosIOOBqeOCk+OBqiwg5aSn44GN44GqLCDlsI/jgZXjgaosIOOBiuOBi+OBl+OBqiwg44G744KT44GuLCDjgZ/jgYTjgZfjgZ8sIA0KLSMgICAgICAg44CMKCwg44KCKSDjgZXjgosgKOOBk+OBqOOBquOBjOOCiSnjgI0sIOW+ruOAheOBn+OCiywg5aCC44CF44Gf44KLLCDljZjjgarjgossIOOBhOOBi+OBquOCiywg5oiR44GM44CN44CM5ZCM44GYLCDkuqHjgY0NCi0j6YCj5L2T6KmeDQotIw0KLSMjIyMjDQotIyAgY29uanVuY3Rpb246IENvbmp1bmN0aW9ucyB0aGF0IGNhbiBvY2N1ciBpbmRlcGVuZGVudGx5Lg0KLSMgIGUuZy4g44GMLCDjgZHjgozjganjgoIsIOOBneOBl+OBpiwg44GY44KD44GCLCDjgZ3jgozjganjgZPjgo3jgYsNCi3mjqXntproqZ4NCi0jDQotIyMjIyMNCi0jICBwYXJ0aWNsZTogdW5jbGFzc2lmaWVkIHBhcnRpY2xlcy4NCi3liqnoqZ4NCi0jDQotIyAgcGFydGljbGUtY2FzZTogY2FzZSBwYXJ0aWNsZXMgd2hlcmUgdGhlIHN1YmNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZC4NCi3liqnoqZ4t5qC85Yqp6KmeDQotIw0KLSMgIHBhcnRpY2xlLWNhc2UtbWlzYzogQ2FzZSBwYXJ0aWNsZXMuDQotIyAgZS5nLiDjgYvjgoksIOOBjCwg44GnLCDjgagsIOOBqywg44G4LCDjgojjgoosIOOCkiwg44GuLCDjgavjgaYNCi3liqnoqZ4t5qC85Yqp6KmeLeS4gOiIrA0KLSMNCi0jICBwYXJ0aWNsZS1jYXNlLXF1b3RlOiB0aGUgInRvIiB0aGF0IGFwcGVhcnMgYWZ0ZXIgbm91bnMsIGEgcGVyc29u4oCZcyBzcGVlY2gsIA0KLSMgIHF1b3RhdGlvbiBtYXJrcywgZXhwcmVzc2lvbnMgb2YgZGVjaXNpb25zIGZyb20gYSBtZWV0aW5nLCByZWFzb25zLCBqdWRnZW1lbnRzLA0KLSMgIGNvbmplY3R1cmVzLCBldGMuDQotIyAgZS5nLiAoIOOBoCkg44GoICjov7DjgbnjgZ8uKSwgKCDjgafjgYLjgospIOOBqCAo44GX44Gm5Z+36KGM54y25LqILi4uKQ0KLeWKqeipni3moLzliqnoqZ4t5byV55SoDQotIw0KLSMgIHBhcnRpY2xlLWNhc2UtY29tcG91bmQ6IENvbXBvdW5kcyBvZiBwYXJ0aWNsZXMgYW5kIHZlcmJzIHRoYXQgbWFpbmx5IGJlaGF2ZSANCi0jICBsaWtlIGNhc2UgcGFydGljbGVzLg0KLSMgIGUuZy4g44Go44GE44GGLCDjgajjgYTjgaPjgZ8sIOOBqOOBi+OBhOOBhiwg44Go44GX44GmLCDjgajjgajjgoLjgassIOOBqOWFseOBqywg44Gn44KC44Gj44GmLCDjgavjgYLjgZ/jgaPjgaYsIOOBq+W9k+OBn+OBo+OBpiwg44Gr5b2T44Gj44GmLA0KLSMgICAgICAg44Gr44GC44Gf44KKLCDjgavlvZPjgZ/jgoosIOOBq+W9k+OCiiwg44Gr5b2T44Gf44KLLCDjgavjgYLjgZ/jgossIOOBq+OBiuOBhOOBpiwg44Gr5pa844GE44GmLOOBq+aWvOOBpiwg44Gr44GK44GR44KLLCDjgavmlrzjgZHjgossIA0KLSMgICAgICAg44Gr44GL44GRLCDjgavjgYvjgZHjgaYsIOOBq+OBi+OCk+OBlywg44Gr6Zai44GXLCDjgavjgYvjgpPjgZfjgaYsIOOBq+mWouOBl+OBpiwg44Gr44GL44KT44GZ44KLLCDjgavplqLjgZnjgossIOOBq+mam+OBlywgDQotIyAgICAgICDjgavpmpvjgZfjgaYsIOOBq+OBl+OBn+OBjOOBhCwg44Gr5b6T44GELCDjgavlvpPjgYYsIOOBq+OBl+OBn+OBjOOBo+OBpiwg44Gr5b6T44Gj44GmLCDjgavjgZ/jgYTjgZcsIOOBq+WvvuOBlywg44Gr44Gf44GE44GX44GmLCANCi0jICAgICAgIOOBq+WvvuOBl+OBpiwg44Gr44Gf44GE44GZ44KLLCDjgavlr77jgZnjgossIOOBq+OBpOOBhOOBpiwg44Gr44Gk44GNLCDjgavjgaTjgZEsIOOBq+OBpOOBkeOBpiwg44Gr44Gk44KMLCDjgavjgaTjgozjgaYsIOOBq+OBqOOBo+OBpiwNCi0jICAgICAgIOOBq+OBqOOCiiwg44Gr44G+44Gk44KP44KLLCDjgavjgojjgaPjgaYsIOOBq+S+neOBo+OBpiwg44Gr5Zug44Gj44GmLCDjgavjgojjgoosIOOBq+S+neOCiiwg44Gr5Zug44KKLCDjgavjgojjgossIOOBq+S+neOCiywg44Gr5Zug44KLLCANCi0jICAgICAgIOOBq+OCj+OBn+OBo+OBpiwg44Gr44KP44Gf44KLLCDjgpLjgoLjgaPjgaYsIOOCkuS7peOBo+OBpiwg44KS6YCa44GYLCDjgpLpgJrjgZjjgaYsIOOCkumAmuOBl+OBpiwg44KS44KB44GQ44Gj44GmLCDjgpLjgoHjgZDjgoosIOOCkuOCgeOBkOOCiywNCi0jICAgICAgIOOBo+OBpi3lj6Poqp4vLCDjgaHjgoXjgYYt6Zai6KW/5byB44CM44Go44GE44GG44CNLywgKOS9lSkg44Gm44GE44GGICjkuropLeWPo+iqni8sIOOBo+OBpuOBhOOBhi3lj6Poqp4vLCDjgajjgYTjgbUsIOOBqOOBi+OBhOOBtQ0KLeWKqeipni3moLzliqnoqZ4t6YCj6KqeDQotIw0KLSMgIHBhcnRpY2xlLWNvbmp1bmN0aXZlOg0KLSMgIGUuZy4g44GL44KJLCDjgYvjgonjgavjga8sIOOBjCwg44GR44KM44GpLCDjgZHjgozjganjgoIsIOOBkeOBqSwg44GXLCDjgaTjgaQsIOOBpiwg44GnLCDjgagsIOOBqOOBk+OCjeOBjCwg44Gp44GT44KN44GLLCDjgajjgoIsIOOBqeOCgiwgDQotIyAgICAgICDjgarjgYzjgoksIOOBquOCiiwg44Gu44GnLCDjga7jgassIOOBsCwg44KC44Gu44GuLCDjgoQgKCDjgZfjgZ8pLCDjgoTjgYTjgarjgoQsICjjgZPjgo3jgpMpIOOBmOOCgyjjgYTjgZHjgarjgYQpLeWPo+iqni8sIA0KLSMgICAgICAgKOihjOOBoykg44Gh44KDKOOBhOOBkeOBquOBhCkt5Y+j6KqeLywgKOiogOOBoykg44Gf44Gj44GmICjjgZfjgYvjgZ/jgYzjgarjgYQpLeWPo+iqni8sICjjgZ3jgozjgYzjgarjgY8p44Gj44Gf44Gj44GmICjlubPmsJcpLeWPo+iqni8NCi3liqnoqZ4t5o6l57aa5Yqp6KmeDQotIw0KLSMgIHBhcnRpY2xlLWRlcGVuZGVuY3k6DQotIyAgZS5nLiDjgZPjgZ0sIOOBleOBiCwg44GX44GLLCDjgZnjgoksIOOBrywg44KCLCDjgZ4NCi3liqnoqZ4t5L+C5Yqp6KmeDQotIw0KLSMgIHBhcnRpY2xlLWFkdmVyYmlhbDoNCi0jICBlLmcuIOOBjOOBpuOCiSwg44GL44KCLCDjgY/jgonjgYQsIOS9jSwg44GQ44KJ44GELCDjgZfjgoIsICjlrabmoKEpIOOBmOOCgyjjgZPjgozjgYzmtYHooYzjgaPjgabjgYTjgospLeWPo+iqni8sIA0KLSMgICAgICAgKOOBneOCjCnjgZjjgoPjgYIgKOOCiOOBj+OBquOBhCkt5Y+j6KqeLywg44Ga44GkLCAo56eBKSDjgarjgZ4sIOOBquOBqSwgKOengSkg44Gq44KKICjjgaspLCAo5YWI55SfKSDjgarjgpPjgYsgKOWkp+WrjOOBhCkt5Y+j6KqeLywNCi0jICAgICAgICjnp4EpIOOBquOCk+OBniwgKOWFiOeUnykg44Gq44KT44GmICjlpKflq4zjgYQpLeWPo+iqni8sIOOBruOBvywg44Gg44GRLCAo56eBKSDjgaDjgaPjgaYt5Y+j6KqeLywg44Gg44GrLCANCi0jICAgICAgICjlvbwp44Gj44Gf44KJLeWPo+iqni8sICjjgYrojLYpIOOBp+OCgiAo44GE44GL44GMKSwg562JICjjgajjgYYpLCAo5LuK5b6MKSDjgajjgoIsIOOBsOOBi+OCiiwg44Gw44Gj44GLLeWPo+iqni8sIOOBsOOBo+OBi+OCii3lj6Poqp4vLA0KLSMgICAgICAg44G744GpLCDnqIssIOOBvuOBpywg6L+ELCAo6KqwKSDjgoIgKOOBjCkoW+WKqeipni3moLzliqnoqZ5dIOOBiuOCiOOBsyBb5Yqp6KmeLeS/guWKqeipnl0g44Gu5YmN44Gr5L2N572u44GZ44KL44CM44KC44CNKQ0KLeWKqeipni3lia/liqnoqZ4NCi0jDQotIyAgcGFydGljbGUtaW50ZXJqZWN0aXZlOiBwYXJ0aWNsZXMgd2l0aCBpbnRlcmplY3RpdmUgZ3JhbW1hdGljYWwgcm9sZXMuDQotIyAgZS5nLiAo5p2+5bO2KSDjgoQNCi3liqnoqZ4t6ZaT5oqV5Yqp6KmeDQotIw0KLSMgIHBhcnRpY2xlLWNvb3JkaW5hdGU6DQotIyAgZS5nLiDjgagsIOOBn+OCiiwg44Gg44GuLCDjgaDjgoosIOOBqOOBiywg44Gq44KKLCDjgoQsIOOChOOCiQ0KLeWKqeipni3kuKbnq4vliqnoqZ4NCi0jDQotIyAgcGFydGljbGUtZmluYWw6DQotIyAgZS5nLiDjgYvjgYQsIOOBi+OBl+OCiSwg44GVLCDjgZwsICjjgaAp44Gj44GRLeWPo+iqni8sICjjgajjgb7jgaPjgabjgospIOOBpy3mlrnoqIAvLCDjgaosIOODiiwg44Gq44GCLeWPo+iqni8sIOOBniwg44GtLCDjg40sIA0KLSMgICAgICAg44Gt44GHLeWPo+iqni8sIOOBreOBiC3lj6Poqp4vLCDjga3jgpMt5pa56KiALywg44GuLCDjga7jgYYt5Y+j6KqeLywg44KELCDjgogsIOODqCwg44KI44GJLeWPo+iqni8sIOOCjywg44KP44GELeWPo+iqni8NCi3liqnoqZ4t57WC5Yqp6KmeDQotIw0KLSMgIHBhcnRpY2xlLWFkdmVyYmlhbC9jb25qdW5jdGl2ZS9maW5hbDogVGhlIHBhcnRpY2xlICJrYSIgd2hlbiB1bmtub3duIHdoZXRoZXIgaXQgaXMgDQotIyAgYWR2ZXJiaWFsLCBjb25qdW5jdGl2ZSwgb3Igc2VudGVuY2UgZmluYWwuIEZvciBleGFtcGxlOg0KLSMgICAgICAgKGEpIOOAjEEg44GLIEIg44GL44CNLiBFeDrjgIwo5Zu95YaF44Gn6YGL55So44GZ44KLKSDjgYssKOa1t+WkluOBp+mBi+eUqOOBmeOCiykg44GLICguKeOAjQ0KLSMgICAgICAgKGIpIEluc2lkZSBhbiBhZHZlcmIgcGhyYXNlLiBFeDrjgIwo5bm444GE44Go44GE44GGKSDjgYsgKCwg5q276ICF44Gv44GE44Gq44GL44Gj44GfLinjgI0NCi0jICAgICAgICAgICDjgIwo56WI44KK44GM5bGK44GE44Gf44Gb44GEKSDjgYsgKCwg6Kmm6aiT44Gr5ZCI5qC844GX44GfLinjgI0NCi0jICAgICAgIChjKSDjgIzjgYvjga7jgojjgYbjgavjgI0uIEV4OuOAjCjkvZXjgoLjgarjgYvjgaPjgZ8pIOOBiyAo44Gu44KI44GG44Gr5oyv44KL6Iie44Gj44GfLinjgI0NCi0jICBlLmcuIOOBiw0KLeWKqeipni3lia/liqnoqZ7vvI/kuKbnq4vliqnoqZ7vvI/ntYLliqnoqZ4NCi0jDQotIyAgcGFydGljbGUtYWRub21pbmFsaXplcjogVGhlICJubyIgdGhhdCBhdHRhY2hlcyB0byBub3VucyBhbmQgbW9kaWZpZXMgDQotIyAgbm9uLWluZmxlY3Rpb25hbCB3b3Jkcy4NCi3liqnoqZ4t6YCj5L2T5YyWDQotIw0KLSMgIHBhcnRpY2xlLWFkbm9taW5hbGl6ZXI6IFRoZSAibmkiIGFuZCAidG8iIHRoYXQgYXBwZWFyIGZvbGxvd2luZyBub3VucyBhbmQgYWR2ZXJicyANCi0jICB0aGF0IGFyZSBnaW9uZ28sIGdpc2VpZ28sIG9yIGdpdGFpZ28uDQotIyAgZS5nLiDjgassIOOBqA0KLeWKqeipni3lia/oqZ7ljJYNCi0jDQotIyAgcGFydGljbGUtc3BlY2lhbDogQSBwYXJ0aWNsZSB0aGF0IGRvZXMgbm90IGZpdCBpbnRvIG9uZSBvZiB0aGUgYWJvdmUgY2xhc3NpZmljYXRpb25zLiANCi0jICBUaGlzIGluY2x1ZGVzIHBhcnRpY2xlcyB0aGF0IGFyZSB1c2VkIGluIFRhbmthLCBIYWlrdSwgYW5kIG90aGVyIHBvZXRyeS4NCi0jICBlLmcuIOOBi+OBqiwg44GR44KALCAoIOOBl+OBn+OBoOOCjeOBhikg44GrLCAo44GC44KT44GfKSDjgavjgoMo44KP44GL44KJ44KTKSwgKOS/uikg44KTICjlrrYpDQot5Yqp6KmeLeeJueauig0KLSMNCi0jIyMjIw0KLSMgIGF1eGlsaWFyeS12ZXJiOg0KLeWKqeWLleipng0KLSMNCi0jIyMjIw0KLSMgIGludGVyamVjdGlvbjogR3JlZXRpbmdzIGFuZCBvdGhlciBleGNsYW1hdGlvbnMuDQotIyAgZS5nLiDjgYrjga/jgojjgYYsIOOBiuOBr+OCiOOBhuOBlOOBluOBhOOBvuOBmSwg44GT44KT44Gr44Gh44GvLCDjgZPjgpPjgbDjgpPjga8sIOOBguOCiuOBjOOBqOOBhiwg44Gp44GG44KC44GC44KK44GM44Go44GGLCDjgYLjgorjgYzjgajjgYbjgZTjgZbjgYTjgb7jgZksIA0KLSMgICAgICAg44GE44Gf44Gg44GN44G+44GZLCDjgZTjgaHjgZ3jgYbjgZXjgb4sIOOBleOCiOOBquOCiSwg44GV44KI44GG44Gq44KJLCDjga/jgYQsIOOBhOOBhOOBiCwg44GU44KB44KTLCDjgZTjgoHjgpPjgarjgZXjgYQNCi0j5oSf5YuV6KmeDQotIw0KLSMjIyMjDQotIyAgc3ltYm9sOiB1bmNsYXNzaWZpZWQgU3ltYm9scy4NCi3oqJjlj7cNCi0jDQotIyAgc3ltYm9sLW1pc2M6IEEgZ2VuZXJhbCBzeW1ib2wgbm90IGluIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBiZWxvdy4NCi0jICBlLmcuIFvil4vil45AJOOAkuKGkitdDQot6KiY5Y+3LeS4gOiIrA0KLSMNCi0jICBzeW1ib2wtY29tbWE6IENvbW1hcw0KLSMgIGUuZy4gWyzjgIFdDQot6KiY5Y+3LeiqreeCuQ0KLSMNCi0jICBzeW1ib2wtcGVyaW9kOiBQZXJpb2RzIGFuZCBmdWxsIHN0b3BzLg0KLSMgIGUuZy4gWy7vvI7jgIJdDQot6KiY5Y+3LeWPpeeCuQ0KLSMNCi0jICBzeW1ib2wtc3BhY2U6IEZ1bGwtd2lkdGggd2hpdGVzcGFjZS4NCi3oqJjlj7ct56m655m9DQotIw0KLSMgIHN5bWJvbC1vcGVuX2JyYWNrZXQ6DQotIyAgZS5nLiBbKHvigJjigJzjgI7jgJBdDQot6KiY5Y+3LeaLrOW8p+mWiw0KLSMNCi0jICBzeW1ib2wtY2xvc2VfYnJhY2tldDoNCi0jICBlLmcuIFspfeKAmeKAneOAj+OAjeOAkV0NCi3oqJjlj7ct5ous5byn6ZaJDQotIw0KLSMgIHN5bWJvbC1hbHBoYWJldGljOg0KLSPoqJjlj7ct44Ki44Or44OV44Kh44OZ44OD44OIDQotIw0KLSMjIyMjDQotIyAgb3RoZXI6IHVuY2xhc3NpZmllZCBvdGhlcg0KLSPjgZ3jga7ku5YNCi0jDQotIyAgb3RoZXItaW50ZXJqZWN0aW9uOiBXb3JkcyB0aGF0IGFyZSBoYXJkIHRvIGNsYXNzaWZ5IGFzIG5vdW4tc3VmZml4ZXMgb3IgDQotIyAgc2VudGVuY2UtZmluYWwgcGFydGljbGVzLg0KLSMgIGUuZy4gKOOBoCnjgqENCi3jgZ3jga7ku5Yt6ZaT5oqVDQotIw0KLSMjIyMjDQotIyAgZmlsbGVyOiBBaXp1Y2hpIHRoYXQgb2NjdXJzIGR1cmluZyBhIGNvbnZlcnNhdGlvbiBvciBzb3VuZHMgaW5zZXJ0ZWQgYXMgZmlsbGVyLg0KLSMgIGUuZy4g44GC44GuLCDjgYbjgpPjgagsIOOBiOOBqA0KLeODleOCo+ODqeODvA0KLSMNCi0jIyMjIw0KLSMgIG5vbi12ZXJiYWw6IG5vbi12ZXJiYWwgc291bmQuDQot6Z2e6KiA6Kqe6Z+zDQotIw0KLSMjIyMjDQotIyAgZnJhZ21lbnQ6DQotI+iqnuaWreeJhw0KLSMNCi0jIyMjIw0KLSMgIHVua25vd246IHVua25vd24gcGFydCBvZiBzcGVlY2guDQotI+acquefpeiqng0KLSMNCi0jIyMjIyBFbmQgb2YgZmlsZQ0KKyMKKyMgVGhpcyBmaWxlIGRlZmluZXMgYSBKYXBhbmVzZSBzdG9wdGFnIHNldCBmb3IgSmFwYW5lc2VQYXJ0T2ZTcGVlY2hTdG9wRmlsdGVyLgorIworIyBBbnkgdG9rZW4gd2l0aCBhIHBhcnQtb2Ytc3BlZWNoIHRhZyB0aGF0IGV4YWN0bHkgbWF0Y2hlcyB0aG9zZSBkZWZpbmVkIGluIHRoaXMKKyMgZmlsZSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSB0b2tlbiBzdHJlYW0uCisjCisjIFNldCB5b3VyIG93biBzdG9wdGFncyBieSB1bmNvbW1lbnRpbmcgdGhlIGxpbmVzIGJlbG93LiAgTm90ZSB0aGF0IGNvbW1lbnRzIGFyZQorIyBub3QgYWxsb3dlZCBvbiB0aGUgc2FtZSBsaW5lIGFzIGEgc3RvcHRhZy4gIFNlZSBMVUNFTkUtMzc0NSBmb3IgZnJlcXVlbmN5IGxpc3RzLAorIyBldGMuIHRoYXQgY2FuIGJlIHVzZWZ1bCBmb3IgYnVpbGRpbmcgeW91IG93biBzdG9wdGFnIHNldC4KKyMKKyMgVGhlIGVudGlyZSBwb3NzaWJsZSB0YWdzZXQgaXMgcHJvdmlkZWQgYmVsb3cgZm9yIGNvbnZlbmllbmNlLgorIworIyMjIyMKKyMgIG5vdW46IHVuY2xhc3NpZmllZCBub3VucworI+WQjeipngorIworIyAgbm91bi1jb21tb246IENvbW1vbiBub3VucyBvciBub3VucyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZAorI+WQjeipni3kuIDoiKwKKyMKKyMgIG5vdW4tcHJvcGVyOiBQcm9wZXIgbm91bnMgd2hlcmUgdGhlIHN1Yi1jbGFzc2lmaWNhdGlvbiBpcyB1bmRlZmluZWQgCisj5ZCN6KmeLeWbuuacieWQjeipngorIworIyAgbm91bi1wcm9wZXItbWlzYzogbWlzY2VsbGFuZW91cyBwcm9wZXIgbm91bnMKKyPlkI3oqZ4t5Zu65pyJ5ZCN6KmeLeS4gOiIrAorIworIyAgbm91bi1wcm9wZXItcGVyc29uOiBQZXJzb25hbCBuYW1lcyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZAorI+WQjeipni3lm7rmnInlkI3oqZ4t5Lq65ZCNCisjCisjICBub3VuLXByb3Blci1wZXJzb24tbWlzYzogbmFtZXMgdGhhdCBjYW5ub3QgYmUgZGl2aWRlZCBpbnRvIHN1cm5hbWUgYW5kIAorIyAgZ2l2ZW4gbmFtZTsgZm9yZWlnbiBuYW1lczsgbmFtZXMgd2hlcmUgdGhlIHN1cm5hbWUgb3IgZ2l2ZW4gbmFtZSBpcyB1bmtub3duLgorIyAgZS5nLiDjgYrluILjga7mlrkKKyPlkI3oqZ4t5Zu65pyJ5ZCN6KmeLeS6uuWQjS3kuIDoiKwKKyMKKyMgIG5vdW4tcHJvcGVyLXBlcnNvbi1zdXJuYW1lOiBNYWlubHkgSmFwYW5lc2Ugc3VybmFtZXMuCisjICBlLmcuIOWxseeUsAorI+WQjeipni3lm7rmnInlkI3oqZ4t5Lq65ZCNLeWnkworIworIyAgbm91bi1wcm9wZXItcGVyc29uLWdpdmVuX25hbWU6IE1haW5seSBKYXBhbmVzZSBnaXZlbiBuYW1lcy4KKyMgIGUuZy4g5aSq6YOOCisj5ZCN6KmeLeWbuuacieWQjeipni3kurrlkI0t5ZCNCisjCisjICBub3VuLXByb3Blci1vcmdhbml6YXRpb246IE5hbWVzIHJlcHJlc2VudGluZyBvcmdhbml6YXRpb25zLgorIyAgZS5nLiDpgJrnlKPnnIEsIE5ISworI+WQjeipni3lm7rmnInlkI3oqZ4t57WE57mUCisjCisjICBub3VuLXByb3Blci1wbGFjZTogUGxhY2UgbmFtZXMgd2hlcmUgdGhlIHN1Yi1jbGFzc2lmaWNhdGlvbiBpcyB1bmRlZmluZWQKKyPlkI3oqZ4t5Zu65pyJ5ZCN6KmeLeWcsOWfnworIworIyAgbm91bi1wcm9wZXItcGxhY2UtbWlzYzogUGxhY2UgbmFtZXMgZXhjbHVkaW5nIGNvdW50cmllcy4KKyMgIGUuZy4g44Ki44K444KiLCDjg5Djg6vjgrvjg63jg4osIOS6rOmDvQorI+WQjeipni3lm7rmnInlkI3oqZ4t5Zyw5Z+fLeS4gOiIrAorIworIyAgbm91bi1wcm9wZXItcGxhY2UtY291bnRyeTogQ291bnRyeSBuYW1lcy4gCisjICBlLmcuIOaXpeacrCwg44Kq44O844K544OI44Op44Oq44KiCisj5ZCN6KmeLeWbuuacieWQjeipni3lnLDln58t5Zu9CisjCisjICBub3VuLXByb25vdW46IFByb25vdW5zIHdoZXJlIHRoZSBzdWItY2xhc3NpZmljYXRpb24gaXMgdW5kZWZpbmVkCisj5ZCN6KmeLeS7o+WQjeipngorIworIyAgbm91bi1wcm9ub3VuLW1pc2M6IG1pc2NlbGxhbmVvdXMgcHJvbm91bnM6IAorIyAgZS5nLiDjgZ3jgowsIOOBk+OBkywg44GC44GE44GkLCDjgYLjgarjgZ8sIOOBguOBoeOBk+OBoSwg44GE44GP44GkLCDjganjgZPjgYssIOOBquOBqywg44G/44Gq44GV44KTLCDjgb/jgpPjgaosIOOCj+OBn+OBj+OBlywg44KP44KM44KP44KMCisj5ZCN6KmeLeS7o+WQjeipni3kuIDoiKwKKyMKKyMgIG5vdW4tcHJvbm91bi1jb250cmFjdGlvbjogU3Bva2VuIGxhbmd1YWdlIGNvbnRyYWN0aW9uIG1hZGUgYnkgY29tYmluaW5nIGEgCisjICBwcm9ub3VuIGFuZCB0aGUgcGFydGljbGUgJ3dhJy4KKyMgIGUuZy4g44GC44KK44KDLCDjgZPjgorjgoMsIOOBk+OCiuOCg+OBgiwg44Gd44KK44KDLCDjgZ3jgorjgoPjgYIgCisj5ZCN6KmeLeS7o+WQjeipni3nuK7ntIQKKyMKKyMgIG5vdW4tYWR2ZXJiaWFsOiBUZW1wb3JhbCBub3VucyBzdWNoIGFzIG5hbWVzIG9mIGRheXMgb3IgbW9udGhzIHRoYXQgYmVoYXZlIAorIyAgbGlrZSBhZHZlcmJzLiBOb3VucyB0aGF0IHJlcHJlc2VudCBhbW91bnQgb3IgcmF0aW9zIGFuZCBjYW4gYmUgdXNlZCBhZHZlcmJpYWxseSwKKyMgIGUuZy4g6YeR5pucLCDkuIDmnIgsIOWNiOW+jCwg5bCR6YePCisj5ZCN6KmeLeWJr+ipnuWPr+iDvQorIworIyAgbm91bi12ZXJiYWw6IE5vdW5zIHRoYXQgdGFrZSBhcmd1bWVudHMgd2l0aCBjYXNlIGFuZCBjYW4gYXBwZWFyIGZvbGxvd2VkIGJ5IAorIyAgJ3N1cnUnIGFuZCByZWxhdGVkIHZlcmJzICjjgZnjgossIOOBp+OBjeOCiywg44Gq44GV44KLLCDjgY/jgaDjgZXjgospCisjICBlLmcuIOOCpOODs+ODl+ODg+ODiCwg5oSb552ALCDmgqrljJYsIOaCquaIpuiLpumXmCwg5LiA5a6J5b+DLCDkuIvlj5bjgooKKyPlkI3oqZ4t44K15aSJ5o6l57aaCisjCisjICBub3VuLWFkamVjdGl2ZS1iYXNlOiBUaGUgYmFzZSBmb3JtIG9mIGFkamVjdGl2ZXMsIHdvcmRzIHRoYXQgYXBwZWFyIGJlZm9yZSDjgaogKCJuYSIpCisjICBlLmcuIOWBpeW6tywg5a6J5piTLCDpp4Tnm64sIOOBoOOCgQorI+WQjeipni3lvaLlrrnli5XoqZ7oqp7lubkKKyMKKyMgIG5vdW4tbnVtZXJpYzogQXJhYmljIG51bWJlcnMsIENoaW5lc2UgbnVtZXJhbHMsIGFuZCBjb3VudGVycyBsaWtlIOS9lSAo5ZueKSwg5pWwLgorIyAgZS5nLiAwLCAxLCAyLCDkvZUsIOaVsCwg5bm+Cisj5ZCN6KmeLeaVsAorIworIyAgbm91bi1hZmZpeDogbm91biBhZmZpeGVzIHdoZXJlIHRoZSBzdWItY2xhc3NpZmljYXRpb24gaXMgdW5kZWZpbmVkCisj5ZCN6KmeLemdnuiHqueriworIworIyAgbm91bi1hZmZpeC1taXNjOiBPZiBhZG5vbWluYWxpemVycywgdGhlIGNhc2UtbWFya2VyIOOBriAoIm5vIiksIGFuZCB3b3JkcyB0aGF0IAorIyAgYXR0YWNoIHRvIHRoZSBiYXNlIGZvcm0gb2YgaW5mbGVjdGlvbmFsIHdvcmRzLCB3b3JkcyB0aGF0IGNhbm5vdCBiZSBjbGFzc2lmaWVkIAorIyAgaW50byBhbnkgb2YgdGhlIG90aGVyIGNhdGVnb3JpZXMgYmVsb3cuIFRoaXMgY2F0ZWdvcnkgaW5jbHVkZXMgaW5kZWZpbml0ZSBub3Vucy4KKyMgIGUuZy4g44GC44GL44Gk44GNLCDmmoEsIOOBi+OBhCwg55Sy5paQLCDmsJcsIOOBjeOCieOBhCwg5auM44GELCDjgY/jgZssIOeZliwg44GT44GoLCDkuossIOOBlOOBqCwg5q+OLCDjgZfjgaDjgYQsIOasoeesrCwgCisjICAgICAgIOmghiwg44Gb44GELCDmiYDngrosIOOBpOOBhOOBpywg5bqP44GnLCDjgaTjgoLjgoosIOepjeOCguOCiiwg54K5LCDjganjgZPjgo0sIOOBriwg44Gv44GaLCDnrYgsIOOBr+OBmuOBvywg5by+44G/LCAKKyMgICAgICAg5ouN5a2QLCDjgbXjgYYsIOOBteOCiiwg5oyv44KKLCDjgbvjgYYsIOaWuSwg5peoLCDjgoLjga4sIOeJqSwg6ICFLCDjgobjgYgsIOaVhSwg44KG44GI44KTLCDmiYDku6UsIOOCj+OBkSwg6KizLAorIyAgICAgICDjgo/jgoosIOWJsuOCiiwg5YmyLCDjgpMt5Y+j6KqeLywg44KC44KTLeWPo+iqni8KKyPlkI3oqZ4t6Z2e6Ieq56uLLeS4gOiIrAorIworIyAgbm91bi1hZmZpeC1hZHZlcmJpYWw6IG5vdW4gYWZmaXhlcyB0aGF0IHRoYXQgY2FuIGJlaGF2ZSBhcyBhZHZlcmJzLgorIyAgZS5nLiDjgYLjgYTjgaAsIOmWkywg44GC44GS44GPLCDmjJnjgZLlj6UsIOOBguOBqCwg5b6MLCDkvZnjgoosIOS7peWkliwg5Lul6ZmNLCDku6XlvowsIOS7peS4iiwg5Lul5YmNLCDkuIDmlrksIOOBhuOBiCwgCisjICAgICAgIOS4iiwg44GG44GhLCDlhoUsIOOBiuOCiiwg5oqY44KKLCDjgYvjgY7jgoosIOmZkOOCiiwg44GN44KKLCDjgaPjgY3jgoosIOe1kOaenCwg44GT44KNLCDpoIMsIOOBleOBhCwg6ZqbLCDmnIDkuK0sIOOBleOBquOBiywgCisjICAgICAgIOacgOS4rSwg44GY44Gf44GELCDoh6rkvZMsIOOBn+OBsywg5bqmLCDjgZ/jgoEsIOeCuiwg44Gk44GpLCDpg73luqYsIOOBqOOBiuOCiiwg6YCa44KKLCDjgajjgY0sIOaZgiwg44Go44GT44KNLCDmiYAsIAorIyAgICAgICDjgajjgZ/jgpMsIOmAlOerrywg44Gq44GLLCDkuK0sIOOBruOBoSwg5b6MLCDjgbDjgYLjgYQsIOWgtOWQiCwg5pelLCDjgbbjgpMsIOWIhiwg44G744GLLCDku5YsIOOBvuOBiCwg5YmNLCDjgb7jgb4sIAorIyAgICAgICDlhJgsIOS+rSwg44G/44GO44KKLCDnn6LlhYgKKyPlkI3oqZ4t6Z2e6Ieq56uLLeWJr+ipnuWPr+iDvQorIworIyAgbm91bi1hZmZpeC1hdXg6IG5vdW4gYWZmaXhlcyB0cmVhdGVkIGFzIOWKqeWLleipniAoImF1eGlsaWFyeSB2ZXJiIikgaW4gc2Nob29sIGdyYW1tYXJzIAorIyAgd2l0aCB0aGUgc3RlbSDjgojjgYYo44GgKSAoInlvdShkYSkiKS4KKyMgIGUuZy4gIOOCiOOBhiwg44KE44GGLCDmp5ggKOOCiOOBhikKKyPlkI3oqZ4t6Z2e6Ieq56uLLeWKqeWLleipnuiqnuW5uQorIyAgCisjICBub3VuLWFmZml4LWFkamVjdGl2ZS1iYXNlOiBub3VuIGFmZml4ZXMgdGhhdCBjYW4gY29ubmVjdCB0byB0aGUgaW5kZWNsaW5hYmxlCisjICBjb25uZWN0aW9uIGZvcm0g44GqIChhdXggImRhIikuCisjICBlLmcuIOOBv+OBn+OBhCwg44G144GGCisj5ZCN6KmeLemdnuiHqueriy3lvaLlrrnli5XoqZ7oqp7lubkKKyMKKyMgIG5vdW4tc3BlY2lhbDogc3BlY2lhbCBub3VucyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZC4KKyPlkI3oqZ4t54m55q6KCisjCisjICBub3VuLXNwZWNpYWwtYXV4OiBUaGUg44Gd44GG44GgICgic291ZGEiKSBzdGVtIGZvcm0gdGhhdCBpcyB1c2VkIGZvciByZXBvcnRpbmcgbmV3cywgaXMgCisjICB0cmVhdGVkIGFzIOWKqeWLleipniAoImF1eGlsaWFyeSB2ZXJiIikgaW4gc2Nob29sIGdyYW1tYXJzLCBhbmQgYXR0YWNoIHRvIHRoZSBiYXNlIAorIyAgZm9ybSBvZiBpbmZsZWN0aW9uYWwgd29yZHMuCisjICBlLmcuIOOBneOBhgorI+WQjeipni3nibnmroot5Yqp5YuV6Kme6Kqe5bm5CisjCisjICBub3VuLXN1ZmZpeDogbm91biBzdWZmaXhlcyB3aGVyZSB0aGUgc3ViLWNsYXNzaWZpY2F0aW9uIGlzIHVuZGVmaW5lZC4KKyPlkI3oqZ4t5o6l5bC+CisjCisjICBub3VuLXN1ZmZpeC1taXNjOiBPZiB0aGUgbm91bnMgb3Igc3RlbSBmb3JtcyBvZiBvdGhlciBwYXJ0cyBvZiBzcGVlY2ggdGhhdCBjb25uZWN0IAorIyAgdG8g44Ks44OrIG9yIOOCv+OCpCBhbmQgY2FuIGNvbWJpbmUgaW50byBjb21wb3VuZCBub3Vucywgd29yZHMgdGhhdCBjYW5ub3QgYmUgY2xhc3NpZmllZCBpbnRvCisjICBhbnkgb2YgdGhlIG90aGVyIGNhdGVnb3JpZXMgYmVsb3cuIEluIGdlbmVyYWwsIHRoaXMgY2F0ZWdvcnkgaXMgbW9yZSBpbmNsdXNpdmUgdGhhbiAKKyMgIOaOpeWwvuiqniAoInN1ZmZpeCIpIGFuZCBpcyB1c3VhbGx5IHRoZSBsYXN0IGVsZW1lbnQgaW4gYSBjb21wb3VuZCBub3VuLgorIyAgZS5nLiDjgYrjgY0sIOOBi+OBnywg5pa5LCDnlLLmlpAgKOOBjOOBhCksIOOBjOOBi+OCiiwg44GO44G/LCDmsJflkbMsIOOBkOOCi+OBvywgKO+9nuOBl+OBnykg44GVLCDmrKHnrKwsIOa4iCAo44GaKSDjgb8sCisjICAgICAgIOOCiOOBhiwgKOOBp+OBjSnjgaPjgZMsIOaEnywg6KazLCDmgKcsIOWtpiwg6aGeLCDpnaIsIOeUqAorI+WQjeipni3mjqXlsL4t5LiA6IisCisjCisjICBub3VuLXN1ZmZpeC1wZXJzb246IFN1ZmZpeGVzIHRoYXQgZm9ybSBub3VucyBhbmQgYXR0YWNoIHRvIHBlcnNvbiBuYW1lcyBtb3JlIG9mdGVuCisjICB0aGFuIG90aGVyIG5vdW5zLgorIyAgZS5nLiDlkJssIOanmCwg6JGXCisj5ZCN6KmeLeaOpeWwvi3kurrlkI0KKyMKKyMgIG5vdW4tc3VmZml4LXBsYWNlOiBTdWZmaXhlcyB0aGF0IGZvcm0gbm91bnMgYW5kIGF0dGFjaCB0byBwbGFjZSBuYW1lcyBtb3JlIG9mdGVuIAorIyAgdGhhbiBvdGhlciBub3Vucy4KKyMgIGUuZy4g55S6LCDluIIsIOecjAorI+WQjeipni3mjqXlsL4t5Zyw5Z+fCisjCisjICBub3VuLXN1ZmZpeC12ZXJiYWw6IE9mIHRoZSBzdWZmaXhlcyB0aGF0IGF0dGFjaCB0byBub3VucyBhbmQgZm9ybSBub3VucywgdGhvc2UgdGhhdCAKKyMgIGNhbiBhcHBlYXIgYmVmb3JlIOOCueODqyAoInN1cnUiKS4KKyMgIGUuZy4g5YyWLCDoppYsIOWIhuOBkSwg5YWl44KKLCDokL3jgaEsIOiyt+OBhAorI+WQjeipni3mjqXlsL4t44K15aSJ5o6l57aaCisjCisjICBub3VuLXN1ZmZpeC1hdXg6IFRoZSBzdGVtIGZvcm0gb2Yg44Gd44GG44GgICjmp5jmhYspIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSBjb25kaXRpb25zLCAKKyMgIGlzIHRyZWF0ZWQgYXMg5Yqp5YuV6KmeICgiYXV4aWxpYXJ5IHZlcmIiKSBpbiBzY2hvb2wgZ3JhbW1hcnMsIGFuZCBhdHRhY2ggdG8gdGhlIAorIyAgY29uanVuY3RpdmUgZm9ybSBvZiBpbmZsZWN0aW9uYWwgd29yZHMuCisjICBlLmcuIOOBneOBhgorI+WQjeipni3mjqXlsL4t5Yqp5YuV6Kme6Kqe5bm5CisjCisjICBub3VuLXN1ZmZpeC1hZGplY3RpdmUtYmFzZTogU3VmZml4ZXMgdGhhdCBhdHRhY2ggdG8gb3RoZXIgbm91bnMgb3IgdGhlIGNvbmp1bmN0aXZlIAorIyAgZm9ybSBvZiBpbmZsZWN0aW9uYWwgd29yZHMgYW5kIGFwcGVhciBiZWZvcmUgdGhlIGNvcHVsYSDjgaAgKCJkYSIpLgorIyAgZS5nLiDnmoQsIOOBkiwg44GM44GhCisj5ZCN6KmeLeaOpeWwvi3lvaLlrrnli5XoqZ7oqp7lubkKKyMKKyMgIG5vdW4tc3VmZml4LWFkdmVyYmlhbDogU3VmZml4ZXMgdGhhdCBhdHRhY2ggdG8gb3RoZXIgbm91bnMgYW5kIGNhbiBiZWhhdmUgYXMgYWR2ZXJicy4KKyMgIGUuZy4g5b6MICjjgZQpLCDku6XlvowsIOS7pemZjSwg5Lul5YmNLCDliY3lvowsIOS4rSwg5pyrLCDkuIosIOaZgiAo44GYKQorI+WQjeipni3mjqXlsL4t5Ymv6Kme5Y+v6IO9CisjCisjICBub3VuLXN1ZmZpeC1jbGFzc2lmaWVyOiBTdWZmaXhlcyB0aGF0IGF0dGFjaCB0byBudW1iZXJzIGFuZCBmb3JtIG5vdW5zLiBUaGlzIGNhdGVnb3J5IAorIyAgaXMgbW9yZSBpbmNsdXNpdmUgdGhhbiDliqnmlbDoqZ4gKCJjbGFzc2lmaWVyIikgYW5kIGluY2x1ZGVzIGNvbW1vbiBub3VucyB0aGF0IGF0dGFjaCAKKyMgIHRvIG51bWJlcnMuCisjICBlLmcuIOWAiywg44GkLCDmnKwsIOWGiiwg44OR44O844K744Oz44OILCBjbSwga2csIOOCq+aciCwg44GL5Zu9LCDljLrnlLssIOaZgumWkywg5pmC5Y2KCisj5ZCN6KmeLeaOpeWwvi3liqnmlbDoqZ4KKyMKKyMgIG5vdW4tc3VmZml4LXNwZWNpYWw6IFNwZWNpYWwgc3VmZml4ZXMgdGhhdCBtYWlubHkgYXR0YWNoIHRvIGluZmxlY3Rpbmcgd29yZHMuCisjICBlLmcuICjmpb3jgZcpIOOBlSwgKOiAg+OBiCkg5pa5Cisj5ZCN6KmeLeaOpeWwvi3nibnmrooKKyMKKyMgIG5vdW4tc3VmZml4LWNvbmp1bmN0aXZlOiBOb3VucyB0aGF0IGJlaGF2ZSBsaWtlIGNvbmp1bmN0aW9ucyBhbmQgam9pbiB0d28gd29yZHMgCisjICB0b2dldGhlci4KKyMgIGUuZy4gKOaXpeacrCkg5a++ICjjgqLjg6Hjg6rjgqspLCDlr74gKOOCouODoeODquOCqyksICgzKSDlr74gKDUpLCAo5aWz5YSqKSDlhbwgKOS4u+WppikKKyPlkI3oqZ4t5o6l57aa6Kme55qECisjCisjICBub3VuLXZlcmJhbF9hdXg6IE5vdW5zIHRoYXQgYXR0YWNoIHRvIHRoZSBjb25qdW5jdGl2ZSBwYXJ0aWNsZSDjgaYgKCJ0ZSIpIGFuZCBhcmUgCisjICBzZW1hbnRpY2FsbHkgdmVyYi1saWtlLgorIyAgZS5nLiDjgZTjgonjgpMsIOOBlOimpywg5b6h6KanLCDpoILmiLQKKyPlkI3oqZ4t5YuV6Kme6Z2e6Ieq56uL55qECisjCisjICBub3VuLXF1b3RhdGlvbjogdGV4dCB0aGF0IGNhbm5vdCBiZSBzZWdtZW50ZWQgaW50byB3b3JkcywgcHJvdmVyYnMsIENoaW5lc2UgcG9ldHJ5LCAKKyMgIGRpYWxlY3RzLCBFbmdsaXNoLCBldGMuIEN1cnJlbnRseSwgdGhlIG9ubHkgZW50cnkgZm9yIOWQjeipniDlvJXnlKjmloflrZfliJcgKCJub3VuIHF1b3RhdGlvbiIpIAorIyAgaXMg44GE44KP44GPICgiaXdha3UiKS4KKyPlkI3oqZ4t5byV55So5paH5a2X5YiXCisjCisjICBub3VuLW5haV9hZGplY3RpdmU6IFdvcmRzIHRoYXQgYXBwZWFyIGJlZm9yZSB0aGUgYXV4aWxpYXJ5IHZlcmIg44Gq44GEICgibmFpIikgYW5kCisjICBiZWhhdmUgbGlrZSBhbiBhZGplY3RpdmUuCisjICBlLmcuIOeUs+OBl+iosywg5LuV5pa5LCDjgajjgpPjgafjgoIsIOmBleOBhAorI+WQjeipni3jg4rjgqTlvaLlrrnoqZ7oqp7lubkKKyMKKyMjIyMjCisjICBwcmVmaXg6IHVuY2xhc3NpZmllZCBwcmVmaXhlcworI+aOpemgreipngorIworIyAgcHJlZml4LW5vbWluYWw6IFByZWZpeGVzIHRoYXQgYXR0YWNoIHRvIG5vdW5zIChpbmNsdWRpbmcgYWRqZWN0aXZlIHN0ZW0gZm9ybXMpIAorIyAgZXhjbHVkaW5nIG51bWVyaWNhbCBleHByZXNzaW9ucy4KKyMgIGUuZy4g44GKICjmsLQpLCDmn5AgKOawjyksIOWQjCAo56S+KSwg5pWFICjvvZ7msI8pLCDpq5ggKOWTgeizqiksIOOBiiAo6KaL5LqLKSwg44GUICjnq4vmtL4pCisj5o6l6aCt6KmeLeWQjeipnuaOpee2mgorIworIyAgcHJlZml4LXZlcmJhbDogUHJlZml4ZXMgdGhhdCBhdHRhY2ggdG8gdGhlIGltcGVyYXRpdmUgZm9ybSBvZiBhIHZlcmIgb3IgYSB2ZXJiCisjICBpbiBjb25qdW5jdGl2ZSBmb3JtIGZvbGxvd2VkIGJ5IOOBquOCiy/jgarjgZXjgosv44GP44Gg44GV44KLLgorIyAgZS5nLiDjgYogKOiqreOBv+OBquOBleOBhCksIOOBiiAo5bqn44KKKQorI+aOpemgreipni3li5XoqZ7mjqXntpoKKyMKKyMgIHByZWZpeC1hZGplY3RpdmFsOiBQcmVmaXhlcyB0aGF0IGF0dGFjaCB0byBhZGplY3RpdmVzLgorIyAgZS5nLiDjgYogKOWvkuOBhOOBp+OBmeOBreOBiCksIOODkOOCqyAo44Gn44GL44GEKQorI+aOpemgreipni3lvaLlrrnoqZ7mjqXntpoKKyMKKyMgIHByZWZpeC1udW1lcmljYWw6IFByZWZpeGVzIHRoYXQgYXR0YWNoIHRvIG51bWVyaWNhbCBleHByZXNzaW9ucy4KKyMgIGUuZy4g57SELCDjgYrjgojjgZ0sIOavjuaZggorI+aOpemgreipni3mlbDmjqXntpoKKyMKKyMjIyMjCisjICB2ZXJiOiB1bmNsYXNzaWZpZWQgdmVyYnMKKyPli5XoqZ4KKyMKKyMgIHZlcmItbWFpbjoKKyPli5XoqZ4t6Ieq56uLCisjCisjICB2ZXJiLWF1eGlsaWFyeToKKyPli5XoqZ4t6Z2e6Ieq56uLCisjCisjICB2ZXJiLXN1ZmZpeDoKKyPli5XoqZ4t5o6l5bC+CisjCisjIyMjIworIyAgYWRqZWN0aXZlOiB1bmNsYXNzaWZpZWQgYWRqZWN0aXZlcworI+W9ouWuueipngorIworIyAgYWRqZWN0aXZlLW1haW46Cisj5b2i5a656KmeLeiHqueriworIworIyAgYWRqZWN0aXZlLWF1eGlsaWFyeToKKyPlvaLlrrnoqZ4t6Z2e6Ieq56uLCisjCisjICBhZGplY3RpdmUtc3VmZml4OgorI+W9ouWuueipni3mjqXlsL4KKyMKKyMjIyMjCisjICBhZHZlcmI6IHVuY2xhc3NpZmllZCBhZHZlcmJzCisj5Ymv6KmeCisjCisjICBhZHZlcmItbWlzYzogV29yZHMgdGhhdCBjYW4gYmUgc2VnbWVudGVkIGludG8gb25lIHVuaXQgYW5kIHdoZXJlIGFkbm9taW5hbCAKKyMgIG1vZGlmaWNhdGlvbiBpcyBub3QgcG9zc2libGUuCisjICBlLmcuIOOBguOBhOOBi+OCj+OCieOBmiwg5aSa5YiGCisj5Ymv6KmeLeS4gOiIrAorIworIyAgYWR2ZXJiLXBhcnRpY2xlX2Nvbmp1bmN0aW9uOiBBZHZlcmJzIHRoYXQgY2FuIGJlIGZvbGxvd2VkIGJ5IOOBriwg44GvLCDjgassIAorIyAg44GqLCDjgZnjgossIOOBoCwgZXRjLgorIyAgZS5nLiDjgZPjgpPjgarjgassIOOBneOCk+OBquOBqywg44GC44KT44Gq44GrLCDjgarjgavjgYssIOOBquOCk+OBp+OCggorI+WJr+ipni3liqnoqZ7poZ7mjqXntpoKKyMKKyMjIyMjCisjICBhZG5vbWluYWw6IFdvcmRzIHRoYXQgb25seSBoYXZlIG5vdW4tbW9kaWZ5aW5nIGZvcm1zLgorIyAgZS5nLiDjgZPjga4sIOOBneOBriwg44GC44GuLCDjganjga4sIOOBhOOCj+OChuOCiywg44Gq44KT44KJ44GL44GuLCDkvZXjgonjgYvjga4sIOOBhOOCjeOCk+OBqiwg44GT44GG44GE44GGLCDjgZ3jgYbjgYTjgYYsIOOBguOBguOBhOOBhiwgCisjICAgICAgIOOBqeOBhuOBhOOBhiwg44GT44KT44GqLCDjgZ3jgpPjgaosIOOBguOCk+OBqiwg44Gp44KT44GqLCDlpKfjgY3jgaosIOWwj+OBleOBqiwg44GK44GL44GX44GqLCDjgbvjgpPjga4sIOOBn+OBhOOBl+OBnywgCisjICAgICAgIOOAjCgsIOOCgikg44GV44KLICjjgZPjgajjgarjgYzjgokp44CNLCDlvq7jgIXjgZ/jgossIOWgguOAheOBn+OCiywg5Y2Y44Gq44KLLCDjgYTjgYvjgarjgossIOaIkeOBjOOAjeOAjOWQjOOBmCwg5Lqh44GNCisj6YCj5L2T6KmeCisjCisjIyMjIworIyAgY29uanVuY3Rpb246IENvbmp1bmN0aW9ucyB0aGF0IGNhbiBvY2N1ciBpbmRlcGVuZGVudGx5LgorIyAgZS5nLiDjgYwsIOOBkeOCjOOBqeOCgiwg44Gd44GX44GmLCDjgZjjgoPjgYIsIOOBneOCjOOBqeOBk+OCjeOBiwor5o6l57aa6KmeCisjCisjIyMjIworIyAgcGFydGljbGU6IHVuY2xhc3NpZmllZCBwYXJ0aWNsZXMuCivliqnoqZ4KKyMKKyMgIHBhcnRpY2xlLWNhc2U6IGNhc2UgcGFydGljbGVzIHdoZXJlIHRoZSBzdWJjbGFzc2lmaWNhdGlvbiBpcyB1bmRlZmluZWQuCivliqnoqZ4t5qC85Yqp6KmeCisjCisjICBwYXJ0aWNsZS1jYXNlLW1pc2M6IENhc2UgcGFydGljbGVzLgorIyAgZS5nLiDjgYvjgoksIOOBjCwg44GnLCDjgagsIOOBqywg44G4LCDjgojjgoosIOOCkiwg44GuLCDjgavjgaYKK+WKqeipni3moLzliqnoqZ4t5LiA6IisCisjCisjICBwYXJ0aWNsZS1jYXNlLXF1b3RlOiB0aGUgInRvIiB0aGF0IGFwcGVhcnMgYWZ0ZXIgbm91bnMsIGEgcGVyc29u4oCZcyBzcGVlY2gsIAorIyAgcXVvdGF0aW9uIG1hcmtzLCBleHByZXNzaW9ucyBvZiBkZWNpc2lvbnMgZnJvbSBhIG1lZXRpbmcsIHJlYXNvbnMsIGp1ZGdlbWVudHMsCisjICBjb25qZWN0dXJlcywgZXRjLgorIyAgZS5nLiAoIOOBoCkg44GoICjov7DjgbnjgZ8uKSwgKCDjgafjgYLjgospIOOBqCAo44GX44Gm5Z+36KGM54y25LqILi4uKQor5Yqp6KmeLeagvOWKqeipni3lvJXnlKgKKyMKKyMgIHBhcnRpY2xlLWNhc2UtY29tcG91bmQ6IENvbXBvdW5kcyBvZiBwYXJ0aWNsZXMgYW5kIHZlcmJzIHRoYXQgbWFpbmx5IGJlaGF2ZSAKKyMgIGxpa2UgY2FzZSBwYXJ0aWNsZXMuCisjICBlLmcuIOOBqOOBhOOBhiwg44Go44GE44Gj44GfLCDjgajjgYvjgYTjgYYsIOOBqOOBl+OBpiwg44Go44Go44KC44GrLCDjgajlhbHjgassIOOBp+OCguOBo+OBpiwg44Gr44GC44Gf44Gj44GmLCDjgavlvZPjgZ/jgaPjgaYsIOOBq+W9k+OBo+OBpiwKKyMgICAgICAg44Gr44GC44Gf44KKLCDjgavlvZPjgZ/jgoosIOOBq+W9k+OCiiwg44Gr5b2T44Gf44KLLCDjgavjgYLjgZ/jgossIOOBq+OBiuOBhOOBpiwg44Gr5pa844GE44GmLOOBq+aWvOOBpiwg44Gr44GK44GR44KLLCDjgavmlrzjgZHjgossIAorIyAgICAgICDjgavjgYvjgZEsIOOBq+OBi+OBkeOBpiwg44Gr44GL44KT44GXLCDjgavplqLjgZcsIOOBq+OBi+OCk+OBl+OBpiwg44Gr6Zai44GX44GmLCDjgavjgYvjgpPjgZnjgossIOOBq+mWouOBmeOCiywg44Gr6Zqb44GXLCAKKyMgICAgICAg44Gr6Zqb44GX44GmLCDjgavjgZfjgZ/jgYzjgYQsIOOBq+W+k+OBhCwg44Gr5b6T44GGLCDjgavjgZfjgZ/jgYzjgaPjgaYsIOOBq+W+k+OBo+OBpiwg44Gr44Gf44GE44GXLCDjgavlr77jgZcsIOOBq+OBn+OBhOOBl+OBpiwgCisjICAgICAgIOOBq+WvvuOBl+OBpiwg44Gr44Gf44GE44GZ44KLLCDjgavlr77jgZnjgossIOOBq+OBpOOBhOOBpiwg44Gr44Gk44GNLCDjgavjgaTjgZEsIOOBq+OBpOOBkeOBpiwg44Gr44Gk44KMLCDjgavjgaTjgozjgaYsIOOBq+OBqOOBo+OBpiwKKyMgICAgICAg44Gr44Go44KKLCDjgavjgb7jgaTjgo/jgossIOOBq+OCiOOBo+OBpiwg44Gr5L6d44Gj44GmLCDjgavlm6DjgaPjgaYsIOOBq+OCiOOCiiwg44Gr5L6d44KKLCDjgavlm6DjgoosIOOBq+OCiOOCiywg44Gr5L6d44KLLCDjgavlm6DjgossIAorIyAgICAgICDjgavjgo/jgZ/jgaPjgaYsIOOBq+OCj+OBn+OCiywg44KS44KC44Gj44GmLCDjgpLku6XjgaPjgaYsIOOCkumAmuOBmCwg44KS6YCa44GY44GmLCDjgpLpgJrjgZfjgaYsIOOCkuOCgeOBkOOBo+OBpiwg44KS44KB44GQ44KKLCDjgpLjgoHjgZDjgossCisjICAgICAgIOOBo+OBpi3lj6Poqp4vLCDjgaHjgoXjgYYt6Zai6KW/5byB44CM44Go44GE44GG44CNLywgKOS9lSkg44Gm44GE44GGICjkuropLeWPo+iqni8sIOOBo+OBpuOBhOOBhi3lj6Poqp4vLCDjgajjgYTjgbUsIOOBqOOBi+OBhOOBtQor5Yqp6KmeLeagvOWKqeipni3pgKPoqp4KKyMKKyMgIHBhcnRpY2xlLWNvbmp1bmN0aXZlOgorIyAgZS5nLiDjgYvjgoksIOOBi+OCieOBq+OBrywg44GMLCDjgZHjgozjgaksIOOBkeOCjOOBqeOCgiwg44GR44GpLCDjgZcsIOOBpOOBpCwg44GmLCDjgacsIOOBqCwg44Go44GT44KN44GMLCDjganjgZPjgo3jgYssIOOBqOOCgiwg44Gp44KCLCAKKyMgICAgICAg44Gq44GM44KJLCDjgarjgoosIOOBruOBpywg44Gu44GrLCDjgbAsIOOCguOBruOBriwg44KEICgg44GX44GfKSwg44KE44GE44Gq44KELCAo44GT44KN44KTKSDjgZjjgoMo44GE44GR44Gq44GEKS3lj6Poqp4vLCAKKyMgICAgICAgKOihjOOBoykg44Gh44KDKOOBhOOBkeOBquOBhCkt5Y+j6KqeLywgKOiogOOBoykg44Gf44Gj44GmICjjgZfjgYvjgZ/jgYzjgarjgYQpLeWPo+iqni8sICjjgZ3jgozjgYzjgarjgY8p44Gj44Gf44Gj44GmICjlubPmsJcpLeWPo+iqni8KK+WKqeipni3mjqXntprliqnoqZ4KKyMKKyMgIHBhcnRpY2xlLWRlcGVuZGVuY3k6CisjICBlLmcuIOOBk+OBnSwg44GV44GILCDjgZfjgYssIOOBmeOCiSwg44GvLCDjgoIsIOOBngor5Yqp6KmeLeS/guWKqeipngorIworIyAgcGFydGljbGUtYWR2ZXJiaWFsOgorIyAgZS5nLiDjgYzjgabjgoksIOOBi+OCgiwg44GP44KJ44GELCDkvY0sIOOBkOOCieOBhCwg44GX44KCLCAo5a2m5qChKSDjgZjjgoMo44GT44KM44GM5rWB6KGM44Gj44Gm44GE44KLKS3lj6Poqp4vLCAKKyMgICAgICAgKOOBneOCjCnjgZjjgoPjgYIgKOOCiOOBj+OBquOBhCkt5Y+j6KqeLywg44Ga44GkLCAo56eBKSDjgarjgZ4sIOOBquOBqSwgKOengSkg44Gq44KKICjjgaspLCAo5YWI55SfKSDjgarjgpPjgYsgKOWkp+WrjOOBhCkt5Y+j6KqeLywKKyMgICAgICAgKOengSkg44Gq44KT44GeLCAo5YWI55SfKSDjgarjgpPjgaYgKOWkp+WrjOOBhCkt5Y+j6KqeLywg44Gu44G/LCDjgaDjgZEsICjnp4EpIOOBoOOBo+OBpi3lj6Poqp4vLCDjgaDjgassIAorIyAgICAgICAo5b28KeOBo+OBn+OCiS3lj6Poqp4vLCAo44GK6Iy2KSDjgafjgoIgKOOBhOOBi+OBjCksIOetiSAo44Go44GGKSwgKOS7iuW+jCkg44Go44KCLCDjgbDjgYvjgoosIOOBsOOBo+OBiy3lj6Poqp4vLCDjgbDjgaPjgYvjgoot5Y+j6KqeLywKKyMgICAgICAg44G744GpLCDnqIssIOOBvuOBpywg6L+ELCAo6KqwKSDjgoIgKOOBjCkoW+WKqeipni3moLzliqnoqZ5dIOOBiuOCiOOBsyBb5Yqp6KmeLeS/guWKqeipnl0g44Gu5YmN44Gr5L2N572u44GZ44KL44CM44KC44CNKQor5Yqp6KmeLeWJr+WKqeipngorIworIyAgcGFydGljbGUtaW50ZXJqZWN0aXZlOiBwYXJ0aWNsZXMgd2l0aCBpbnRlcmplY3RpdmUgZ3JhbW1hdGljYWwgcm9sZXMuCisjICBlLmcuICjmnb7ls7YpIOOChAor5Yqp6KmeLemWk+aKleWKqeipngorIworIyAgcGFydGljbGUtY29vcmRpbmF0ZToKKyMgIGUuZy4g44GoLCDjgZ/jgoosIOOBoOOBriwg44Gg44KKLCDjgajjgYssIOOBquOCiiwg44KELCDjgoTjgokKK+WKqeipni3kuKbnq4vliqnoqZ4KKyMKKyMgIHBhcnRpY2xlLWZpbmFsOgorIyAgZS5nLiDjgYvjgYQsIOOBi+OBl+OCiSwg44GVLCDjgZwsICjjgaAp44Gj44GRLeWPo+iqni8sICjjgajjgb7jgaPjgabjgospIOOBpy3mlrnoqIAvLCDjgaosIOODiiwg44Gq44GCLeWPo+iqni8sIOOBniwg44GtLCDjg40sIAorIyAgICAgICDjga3jgYct5Y+j6KqeLywg44Gt44GILeWPo+iqni8sIOOBreOCky3mlrnoqIAvLCDjga4sIOOBruOBhi3lj6Poqp4vLCDjgoQsIOOCiCwg44OoLCDjgojjgYkt5Y+j6KqeLywg44KPLCDjgo/jgYQt5Y+j6KqeLwor5Yqp6KmeLee1guWKqeipngorIworIyAgcGFydGljbGUtYWR2ZXJiaWFsL2Nvbmp1bmN0aXZlL2ZpbmFsOiBUaGUgcGFydGljbGUgImthIiB3aGVuIHVua25vd24gd2hldGhlciBpdCBpcyAKKyMgIGFkdmVyYmlhbCwgY29uanVuY3RpdmUsIG9yIHNlbnRlbmNlIGZpbmFsLiBGb3IgZXhhbXBsZToKKyMgICAgICAgKGEpIOOAjEEg44GLIEIg44GL44CNLiBFeDrjgIwo5Zu95YaF44Gn6YGL55So44GZ44KLKSDjgYssKOa1t+WkluOBp+mBi+eUqOOBmeOCiykg44GLICguKeOAjQorIyAgICAgICAoYikgSW5zaWRlIGFuIGFkdmVyYiBwaHJhc2UuIEV4OuOAjCjlubjjgYTjgajjgYTjgYYpIOOBiyAoLCDmrbvogIXjga/jgYTjgarjgYvjgaPjgZ8uKeOAjQorIyAgICAgICAgICAg44CMKOeliOOCiuOBjOWxiuOBhOOBn+OBm+OBhCkg44GLICgsIOippumok+OBq+WQiOagvOOBl+OBny4p44CNCisjICAgICAgIChjKSDjgIzjgYvjga7jgojjgYbjgavjgI0uIEV4OuOAjCjkvZXjgoLjgarjgYvjgaPjgZ8pIOOBiyAo44Gu44KI44GG44Gr5oyv44KL6Iie44Gj44GfLinjgI0KKyMgIGUuZy4g44GLCivliqnoqZ4t5Ymv5Yqp6Kme77yP5Lim56uL5Yqp6Kme77yP57WC5Yqp6KmeCisjCisjICBwYXJ0aWNsZS1hZG5vbWluYWxpemVyOiBUaGUgIm5vIiB0aGF0IGF0dGFjaGVzIHRvIG5vdW5zIGFuZCBtb2RpZmllcyAKKyMgIG5vbi1pbmZsZWN0aW9uYWwgd29yZHMuCivliqnoqZ4t6YCj5L2T5YyWCisjCisjICBwYXJ0aWNsZS1hZG5vbWluYWxpemVyOiBUaGUgIm5pIiBhbmQgInRvIiB0aGF0IGFwcGVhciBmb2xsb3dpbmcgbm91bnMgYW5kIGFkdmVyYnMgCisjICB0aGF0IGFyZSBnaW9uZ28sIGdpc2VpZ28sIG9yIGdpdGFpZ28uCisjICBlLmcuIOOBqywg44GoCivliqnoqZ4t5Ymv6Kme5YyWCisjCisjICBwYXJ0aWNsZS1zcGVjaWFsOiBBIHBhcnRpY2xlIHRoYXQgZG9lcyBub3QgZml0IGludG8gb25lIG9mIHRoZSBhYm92ZSBjbGFzc2lmaWNhdGlvbnMuIAorIyAgVGhpcyBpbmNsdWRlcyBwYXJ0aWNsZXMgdGhhdCBhcmUgdXNlZCBpbiBUYW5rYSwgSGFpa3UsIGFuZCBvdGhlciBwb2V0cnkuCisjICBlLmcuIOOBi+OBqiwg44GR44KALCAoIOOBl+OBn+OBoOOCjeOBhikg44GrLCAo44GC44KT44GfKSDjgavjgoMo44KP44GL44KJ44KTKSwgKOS/uikg44KTICjlrrYpCivliqnoqZ4t54m55q6KCisjCisjIyMjIworIyAgYXV4aWxpYXJ5LXZlcmI6Civliqnli5XoqZ4KKyMKKyMjIyMjCisjICBpbnRlcmplY3Rpb246IEdyZWV0aW5ncyBhbmQgb3RoZXIgZXhjbGFtYXRpb25zLgorIyAgZS5nLiDjgYrjga/jgojjgYYsIOOBiuOBr+OCiOOBhuOBlOOBluOBhOOBvuOBmSwg44GT44KT44Gr44Gh44GvLCDjgZPjgpPjgbDjgpPjga8sIOOBguOCiuOBjOOBqOOBhiwg44Gp44GG44KC44GC44KK44GM44Go44GGLCDjgYLjgorjgYzjgajjgYbjgZTjgZbjgYTjgb7jgZksIAorIyAgICAgICDjgYTjgZ/jgaDjgY3jgb7jgZksIOOBlOOBoeOBneOBhuOBleOBviwg44GV44KI44Gq44KJLCDjgZXjgojjgYbjgarjgoksIOOBr+OBhCwg44GE44GE44GILCDjgZTjgoHjgpMsIOOBlOOCgeOCk+OBquOBleOBhAorI+aEn+WLleipngorIworIyMjIyMKKyMgIHN5bWJvbDogdW5jbGFzc2lmaWVkIFN5bWJvbHMuCivoqJjlj7cKKyMKKyMgIHN5bWJvbC1taXNjOiBBIGdlbmVyYWwgc3ltYm9sIG5vdCBpbiBvbmUgb2YgdGhlIGNhdGVnb3JpZXMgYmVsb3cuCisjICBlLmcuIFvil4vil45AJOOAkuKGkitdCivoqJjlj7ct5LiA6IisCisjCisjICBzeW1ib2wtY29tbWE6IENvbW1hcworIyAgZS5nLiBbLOOAgV0KK+iomOWPty3oqq3ngrkKKyMKKyMgIHN5bWJvbC1wZXJpb2Q6IFBlcmlvZHMgYW5kIGZ1bGwgc3RvcHMuCisjICBlLmcuIFsu77yO44CCXQor6KiY5Y+3LeWPpeeCuQorIworIyAgc3ltYm9sLXNwYWNlOiBGdWxsLXdpZHRoIHdoaXRlc3BhY2UuCivoqJjlj7ct56m655m9CisjCisjICBzeW1ib2wtb3Blbl9icmFja2V0OgorIyAgZS5nLiBbKHvigJjigJzjgI7jgJBdCivoqJjlj7ct5ous5byn6ZaLCisjCisjICBzeW1ib2wtY2xvc2VfYnJhY2tldDoKKyMgIGUuZy4gWyl94oCZ4oCd44CP44CN44CRXQor6KiY5Y+3LeaLrOW8p+mWiQorIworIyAgc3ltYm9sLWFscGhhYmV0aWM6Cisj6KiY5Y+3LeOCouODq+ODleOCoeODmeODg+ODiAorIworIyMjIyMKKyMgIG90aGVyOiB1bmNsYXNzaWZpZWQgb3RoZXIKKyPjgZ3jga7ku5YKKyMKKyMgIG90aGVyLWludGVyamVjdGlvbjogV29yZHMgdGhhdCBhcmUgaGFyZCB0byBjbGFzc2lmeSBhcyBub3VuLXN1ZmZpeGVzIG9yIAorIyAgc2VudGVuY2UtZmluYWwgcGFydGljbGVzLgorIyAgZS5nLiAo44GgKeOCoQor44Gd44Gu5LuWLemWk+aKlQorIworIyMjIyMKKyMgIGZpbGxlcjogQWl6dWNoaSB0aGF0IG9jY3VycyBkdXJpbmcgYSBjb252ZXJzYXRpb24gb3Igc291bmRzIGluc2VydGVkIGFzIGZpbGxlci4KKyMgIGUuZy4g44GC44GuLCDjgYbjgpPjgagsIOOBiOOBqAor44OV44Kj44Op44O8CisjCisjIyMjIworIyAgbm9uLXZlcmJhbDogbm9uLXZlcmJhbCBzb3VuZC4KK+mdnuiogOiqnumfsworIworIyMjIyMKKyMgIGZyYWdtZW50OgorI+iqnuaWreeJhworIworIyMjIyMKKyMgIHVua25vd246IHVua25vd24gcGFydCBvZiBzcGVlY2guCisj5pyq55+l6KqeCisjCisjIyMjIyBFbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19hci50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2FyLnR4dAppbmRleCBhY2EyNDMwLi4wNDY4MjlkIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2FyLnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2FyLnR4dApAQCAtMSwxMjUgKzEsMTI1IEBACi0jIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSBKYWNxdWVzIFNhdm95IGFuZCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuDQotIyBTZWUgaHR0cDovL21lbWJlcnMudW5pbmUuY2gvamFjcXVlcy5zYXZveS9jbGVmL2luZGV4Lmh0bWwuDQotIyBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwNCi0jIENsZWFuZWQgb24gT2N0b2JlciAxMSwgMjAwOSAobm90IG5vcm1hbGl6ZWQsIHNvIHVzZSBiZWZvcmUgbm9ybWFsaXphdGlvbikNCi0jIFRoaXMgbWVhbnMgdGhhdCB3aGVuIG1vZGlmeWluZyB0aGlzIGxpc3QsIHlvdSBtaWdodCBuZWVkIHRvIGFkZCBzb21lIA0KLSMgcmVkdW5kYW50IGVudHJpZXMsIGZvciBleGFtcGxlIGNvbnRhaW5pbmcgZm9ybXMgd2l0aCBib3RoINijIGFuZCDYpw0KLdmF2YYNCi3ZiNmF2YYNCi3ZhdmG2YfYpw0KLdmF2YbZhw0KLdmB2YoNCi3ZiNmB2YoNCi3ZgdmK2YfYpw0KLdmB2YrZhw0KLdmIDQot2YENCi3Yq9mFDQot2KfZiA0KLdij2YgNCi3YqA0KLdio2YfYpw0KLdio2YcNCi3Ypw0KLdijDQot2KfZiQ0KLdin2YoNCi3Yo9mKDQot2KPZiQ0KLdmE2KcNCi3ZiNmE2KcNCi3Yp9mE2KcNCi3Yo9mE2KcNCi3YpdmE2KcNCi3ZhNmD2YYNCi3ZhdinDQot2YjZhdinDQot2YPZhdinDQot2YHZhdinDQot2LnZhg0KLdmF2LkNCi3Yp9iw2KcNCi3Ypdiw2KcNCi3Yp9mGDQot2KPZhg0KLdil2YYNCi3Yp9mG2YfYpw0KLdij2YbZh9inDQot2KXZhtmH2KcNCi3Yp9mG2YcNCi3Yo9mG2YcNCi3YpdmG2YcNCi3YqNin2YYNCi3YqNij2YYNCi3Zgdin2YYNCi3Zgdij2YYNCi3ZiNin2YYNCi3ZiNij2YYNCi3ZiNil2YYNCi3Yp9mE2KrZiQ0KLdin2YTYqtmKDQot2KfZhNiw2YkNCi3Yp9mE2LDZig0KLdin2YTYsNmK2YYNCi3Yp9mE2YkNCi3Yp9mE2YoNCi3YpdmE2YkNCi3YpdmE2YoNCi3YudmE2YkNCi3YudmE2YrZh9inDQot2LnZhNmK2YcNCi3Yp9mF2KcNCi3Yo9mF2KcNCi3YpdmF2KcNCi3Yp9mK2LbYpw0KLdij2YrYttinDQot2YPZhA0KLdmI2YPZhA0KLdmE2YUNCi3ZiNmE2YUNCi3ZhNmGDQot2YjZhNmGDQot2YfZiQ0KLdmH2YoNCi3Zh9mIDQot2YjZh9mJDQot2YjZh9mKDQot2YjZh9mIDQot2YHZh9mJDQot2YHZh9mKDQot2YHZh9mIDQot2KfZhtiqDQot2KPZhtiqDQot2YTZgw0KLdmE2YfYpw0KLdmE2YcNCi3Zh9iw2YcNCi3Zh9iw2KcNCi3YqtmE2YMNCi3YsNmE2YMNCi3Zh9mG2KfZgw0KLdmD2KfZhtiqDQot2YPYp9mGDQot2YrZg9mI2YYNCi3YqtmD2YjZhg0KLdmI2YPYp9mG2KoNCi3ZiNmD2KfZhg0KLdi62YrYsQ0KLdio2LnYtg0KLdmC2K8NCi3Zhtit2YgNCi3YqNmK2YYNCi3YqNmK2YbZhdinDQot2YXZhtiwDQot2LbZhdmGDQot2K3ZitirDQot2KfZhNin2YYNCi3Yp9mE2KLZhg0KLdiu2YTYp9mEDQot2KjYudivDQot2YLYqNmEDQot2K3YqtmJDQot2LnZhtivDQot2LnZhtiv2YXYpw0KLdmE2K/ZiQ0KLdis2YXZiti5DQorIyBUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgYnkgSmFjcXVlcyBTYXZveSBhbmQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBsaWNlbnNlLgorIyBTZWUgaHR0cDovL21lbWJlcnMudW5pbmUuY2gvamFjcXVlcy5zYXZveS9jbGVmL2luZGV4Lmh0bWwuCisjIEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIyBDbGVhbmVkIG9uIE9jdG9iZXIgMTEsIDIwMDkgKG5vdCBub3JtYWxpemVkLCBzbyB1c2UgYmVmb3JlIG5vcm1hbGl6YXRpb24pCisjIFRoaXMgbWVhbnMgdGhhdCB3aGVuIG1vZGlmeWluZyB0aGlzIGxpc3QsIHlvdSBtaWdodCBuZWVkIHRvIGFkZCBzb21lIAorIyByZWR1bmRhbnQgZW50cmllcywgZm9yIGV4YW1wbGUgY29udGFpbmluZyBmb3JtcyB3aXRoIGJvdGgg2KMgYW5kINinCivZhdmGCivZiNmF2YYKK9mF2YbZh9inCivZhdmG2YcKK9mB2YoKK9mI2YHZigor2YHZitmH2KcKK9mB2YrZhwor2YgKK9mBCivYq9mFCivYp9mICivYo9mICivYqAor2KjZh9inCivYqNmHCivYpwor2KMKK9in2YkKK9in2YoKK9ij2YoKK9ij2YkKK9mE2KcKK9mI2YTYpwor2KfZhNinCivYo9mE2KcKK9il2YTYpwor2YTZg9mGCivZhdinCivZiNmF2KcKK9mD2YXYpwor2YHZhdinCivYudmGCivZhdi5CivYp9iw2KcKK9il2LDYpwor2KfZhgor2KPZhgor2KXZhgor2KfZhtmH2KcKK9ij2YbZh9inCivYpdmG2YfYpwor2KfZhtmHCivYo9mG2YcKK9il2YbZhwor2KjYp9mGCivYqNij2YYKK9mB2KfZhgor2YHYo9mGCivZiNin2YYKK9mI2KPZhgor2YjYpdmGCivYp9mE2KrZiQor2KfZhNiq2YoKK9in2YTYsNmJCivYp9mE2LDZigor2KfZhNiw2YrZhgor2KfZhNmJCivYp9mE2YoKK9il2YTZiQor2KXZhNmKCivYudmE2YkKK9i52YTZitmH2KcKK9i52YTZitmHCivYp9mF2KcKK9ij2YXYpwor2KXZhdinCivYp9mK2LbYpwor2KPZiti22KcKK9mD2YQKK9mI2YPZhAor2YTZhQor2YjZhNmFCivZhNmGCivZiNmE2YYKK9mH2YkKK9mH2YoKK9mH2YgKK9mI2YfZiQor2YjZh9mKCivZiNmH2YgKK9mB2YfZiQor2YHZh9mKCivZgdmH2YgKK9in2YbYqgor2KPZhtiqCivZhNmDCivZhNmH2KcKK9mE2YcKK9mH2LDZhwor2YfYsNinCivYqtmE2YMKK9iw2YTZgwor2YfZhtin2YMKK9mD2KfZhtiqCivZg9in2YYKK9mK2YPZiNmGCivYqtmD2YjZhgor2YjZg9in2YbYqgor2YjZg9in2YYKK9i62YrYsQor2KjYudi2CivZgtivCivZhtit2YgKK9io2YrZhgor2KjZitmG2YXYpwor2YXZhtiwCivYttmF2YYKK9it2YrYqwor2KfZhNin2YYKK9in2YTYotmGCivYrtmE2KfZhAor2KjYudivCivZgtio2YQKK9it2KrZiQor2LnZhtivCivYudmG2K/ZhdinCivZhNiv2YkKK9is2YXZiti5CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2JnLnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfYmcudHh0CmluZGV4IDg0MmVlOGEuLjFhZTRiYTIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfYmcudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfYmcudHh0CkBAIC0xLDE5MyArMSwxOTMgQEAKLSMgVGhpcyBmaWxlIHdhcyBjcmVhdGVkIGJ5IEphY3F1ZXMgU2F2b3kgYW5kIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgbGljZW5zZS4NCi0jIFNlZSBodHRwOi8vbWVtYmVycy51bmluZS5jaC9qYWNxdWVzLnNhdm95L2NsZWYvaW5kZXguaHRtbC4NCi0jIEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbA0KLdCwDQot0LDQtw0KLdCw0LrQvg0KLdCw0LvQsA0KLdCx0LUNCi3QsdC10LcNCi3QsdC10YjQtQ0KLdCx0LgNCi3QsdC40LsNCi3QsdC40LvQsA0KLdCx0LjQu9C4DQot0LHQuNC70L4NCi3QsdC70LjQt9C+DQot0LHRitC00LDRgg0KLdCx0YrQtNC1DQot0LHRj9GF0LANCi3Qsg0KLdCy0LDRgQ0KLdCy0LDRiA0KLdCy0LDRiNCwDQot0LLQtdGA0L7Rj9GC0L3Qvg0KLdCy0LXRh9C1DQot0LLQt9C10LzQsA0KLdCy0LgNCi3QstC40LUNCi3QstC40L3QsNCz0LgNCi3QstGB0LUNCi3QstGB0LXQutC4DQot0LLRgdC40YfQutC4DQot0LLRgdC40YfQutC+DQot0LLRgdGP0LrQsA0KLdCy0YrQsg0KLdCy0YrQv9GA0LXQutC4DQot0LLRitGA0YXRgw0KLdCzDQot0LPQuA0KLdCz0LvQsNCy0L3Qvg0KLdCz0L4NCi3QtA0KLdC00LANCi3QtNCw0LvQuA0KLdC00L4NCi3QtNC+0LrQsNGC0L4NCi3QtNC+0LrQvtCz0LANCi3QtNC+0YDQuA0KLdC00L7RgdC10LPQsA0KLdC00L7RgdGC0LANCi3QtQ0KLdC10LTQstCwDQot0LXQtNC40L0NCi3QtdGC0L4NCi3Qt9CwDQot0LfQsNC0DQot0LfQsNC10LTQvdC+DQot0LfQsNGA0LDQtNC4DQot0LfQsNGB0LXQs9CwDQot0LfQsNGC0L7QstCwDQot0LfQsNGJ0L4NCi3Qt9Cw0YnQvtGC0L4NCi3QuA0KLdC40LcNCi3QuNC70LgNCi3QuNC8DQot0LjQvNCwDQot0LjQvNCw0YINCi3QuNGB0LrQsA0KLdC5DQot0LrQsNC30LANCi3QutCw0LoNCi3QutCw0LrQstCwDQot0LrQsNC60LLQvg0KLdC60LDQutGC0L4NCi3QutCw0LrRitCyDQot0LrQsNGC0L4NCi3QutC+0LPQsA0KLdC60L7Qs9Cw0YLQvg0KLdC60L7QtdGC0L4NCi3QutC+0LjRgtC+DQot0LrQvtC5DQot0LrQvtC50YLQvg0KLdC60L7Qu9C60L4NCi3QutC+0Y/RgtC+DQot0LrRitC00LUNCi3QutGK0LTQtdGC0L4NCi3QutGK0LwNCi3Qu9C4DQot0LwNCi3QvNC1DQot0LzQtdC20LTRgw0KLdC80LXQvQ0KLdC80LgNCi3QvNC90L7Qt9C40L3QsA0KLdC80L7Qs9CwDQot0LzQvtCz0LDRgg0KLdC80L7QttC1DQot0LzQvtC70Y8NCi3QvNC+0LzQtdC90YLQsA0KLdC80YMNCi3QvQ0KLdC90LANCi3QvdCw0LQNCi3QvdCw0LfQsNC0DQot0L3QsNC5DQot0L3QsNC/0YDQsNCy0LgNCi3QvdCw0L/RgNC10LQNCi3QvdCw0L/RgNC40LzQtdGADQot0L3QsNGBDQot0L3QtQ0KLdC90LXQs9C+DQot0L3QtdGPDQot0L3QuA0KLdC90LjQtQ0KLdC90LjQutC+0LkNCi3QvdC40YLQvg0KLdC90L4NCi3QvdGP0LrQvtC4DQot0L3Rj9C60L7QuQ0KLdC90Y/QvNCwDQot0L7QsdCw0YfQtQ0KLdC+0LrQvtC70L4NCi3QvtGB0LLQtdC9DQot0L7RgdC+0LHQtdC90L4NCi3QvtGCDQot0L7RgtCz0L7RgNC1DQot0L7RgtC90L7QstC+DQot0L7RidC1DQot0L/QsNC6DQot0L/Qvg0KLdC/0L7QstC10YfQtQ0KLdC/0L7QstC10YfQtdGC0L4NCi3Qv9C+0LQNCi3Qv9C+0L3QtQ0KLdC/0L7RgNCw0LTQuA0KLdC/0L7RgdC70LUNCi3Qv9C+0YfRgtC4DQot0L/RgNCw0LLQuA0KLdC/0YDQtdC0DQot0L/RgNC10LTQuA0KLdC/0YDQtdC3DQot0L/RgNC4DQot0L/RitC6DQot0L/RitGA0LLQvg0KLdGBDQot0YHQsA0KLdGB0LDQvNC+DQot0YHQtQ0KLdGB0LXQs9CwDQot0YHQuA0KLdGB0LrQvtGA0L4NCi3RgdC70LXQtA0KLdGB0LzQtQ0KLdGB0L/QvtGA0LXQtA0KLdGB0YDQtdC0DQot0YHRgNC10YnRgw0KLdGB0YLQtQ0KLdGB0YrQvA0KLdGB0YrRgQ0KLdGB0YrRidC+DQot0YINCi3RgtCw0LfQuA0KLdGC0LDQutCwDQot0YLQsNC60LjQstCwDQot0YLQsNC60YrQsg0KLdGC0LDQvA0KLdGC0LLQvtC5DQot0YLQtQ0KLdGC0LXQt9C4DQot0YLQuA0KLdGC0L0NCi3RgtC+DQot0YLQvtCy0LANCi3RgtC+0LPQsNCy0LANCi3RgtC+0LfQuA0KLdGC0L7QuQ0KLdGC0L7Qu9C60L7QstCwDQot0YLQvtGH0L3Qvg0KLdGC0YDRj9Cx0LLQsA0KLdGC0YPQug0KLdGC0YrQuQ0KLdGC0Y8NCi3RgtGP0YUNCi3Rgw0KLdGF0LDRgNC10YHQstCwDQot0YcNCi3Rh9C1DQot0YfQtdGB0YLQvg0KLdGH0YDQtdC3DQot0YnQtQ0KLdGJ0L7QvA0KLdGPDQorIyBUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgYnkgSmFjcXVlcyBTYXZveSBhbmQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBsaWNlbnNlLgorIyBTZWUgaHR0cDovL21lbWJlcnMudW5pbmUuY2gvamFjcXVlcy5zYXZveS9jbGVmL2luZGV4Lmh0bWwuCisjIEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAor0LAKK9Cw0LcKK9Cw0LrQvgor0LDQu9CwCivQsdC1CivQsdC10LcKK9Cx0LXRiNC1CivQsdC4CivQsdC40LsKK9Cx0LjQu9CwCivQsdC40LvQuAor0LHQuNC70L4KK9Cx0LvQuNC30L4KK9Cx0YrQtNCw0YIKK9Cx0YrQtNC1CivQsdGP0YXQsAor0LIKK9Cy0LDRgQor0LLQsNGICivQstCw0YjQsAor0LLQtdGA0L7Rj9GC0L3Qvgor0LLQtdGH0LUKK9Cy0LfQtdC80LAKK9Cy0LgKK9Cy0LjQtQor0LLQuNC90LDQs9C4CivQstGB0LUKK9Cy0YHQtdC60LgKK9Cy0YHQuNGH0LrQuAor0LLRgdC40YfQutC+CivQstGB0Y/QutCwCivQstGK0LIKK9Cy0YrQv9GA0LXQutC4CivQstGK0YDRhdGDCivQswor0LPQuAor0LPQu9Cw0LLQvdC+CivQs9C+CivQtAor0LTQsAor0LTQsNC70LgKK9C00L4KK9C00L7QutCw0YLQvgor0LTQvtC60L7Qs9CwCivQtNC+0YDQuAor0LTQvtGB0LXQs9CwCivQtNC+0YHRgtCwCivQtQor0LXQtNCy0LAKK9C10LTQuNC9CivQtdGC0L4KK9C30LAKK9C30LDQtAor0LfQsNC10LTQvdC+CivQt9Cw0YDQsNC00LgKK9C30LDRgdC10LPQsAor0LfQsNGC0L7QstCwCivQt9Cw0YnQvgor0LfQsNGJ0L7RgtC+CivQuAor0LjQtwor0LjQu9C4CivQuNC8CivQuNC80LAKK9C40LzQsNGCCivQuNGB0LrQsAor0LkKK9C60LDQt9CwCivQutCw0LoKK9C60LDQutCy0LAKK9C60LDQutCy0L4KK9C60LDQutGC0L4KK9C60LDQutGK0LIKK9C60LDRgtC+CivQutC+0LPQsAor0LrQvtCz0LDRgtC+CivQutC+0LXRgtC+CivQutC+0LjRgtC+CivQutC+0LkKK9C60L7QudGC0L4KK9C60L7Qu9C60L4KK9C60L7Rj9GC0L4KK9C60YrQtNC1CivQutGK0LTQtdGC0L4KK9C60YrQvAor0LvQuAor0LwKK9C80LUKK9C80LXQttC00YMKK9C80LXQvQor0LzQuAor0LzQvdC+0LfQuNC90LAKK9C80L7Qs9CwCivQvNC+0LPQsNGCCivQvNC+0LbQtQor0LzQvtC70Y8KK9C80L7QvNC10L3RgtCwCivQvNGDCivQvQor0L3QsAor0L3QsNC0CivQvdCw0LfQsNC0CivQvdCw0LkKK9C90LDQv9GA0LDQstC4CivQvdCw0L/RgNC10LQKK9C90LDQv9GA0LjQvNC10YAKK9C90LDRgQor0L3QtQor0L3QtdCz0L4KK9C90LXRjwor0L3QuAor0L3QuNC1CivQvdC40LrQvtC5CivQvdC40YLQvgor0L3Qvgor0L3Rj9C60L7QuAor0L3Rj9C60L7QuQor0L3Rj9C80LAKK9C+0LHQsNGH0LUKK9C+0LrQvtC70L4KK9C+0YHQstC10L0KK9C+0YHQvtCx0LXQvdC+CivQvtGCCivQvtGC0LPQvtGA0LUKK9C+0YLQvdC+0LLQvgor0L7RidC1CivQv9Cw0LoKK9C/0L4KK9C/0L7QstC10YfQtQor0L/QvtCy0LXRh9C10YLQvgor0L/QvtC0CivQv9C+0L3QtQor0L/QvtGA0LDQtNC4CivQv9C+0YHQu9C1CivQv9C+0YfRgtC4CivQv9GA0LDQstC4CivQv9GA0LXQtAor0L/RgNC10LTQuAor0L/RgNC10LcKK9C/0YDQuAor0L/RitC6CivQv9GK0YDQstC+CivRgQor0YHQsAor0YHQsNC80L4KK9GB0LUKK9GB0LXQs9CwCivRgdC4CivRgdC60L7RgNC+CivRgdC70LXQtAor0YHQvNC1CivRgdC/0L7RgNC10LQKK9GB0YDQtdC0CivRgdGA0LXRidGDCivRgdGC0LUKK9GB0YrQvAor0YHRitGBCivRgdGK0YnQvgor0YIKK9GC0LDQt9C4CivRgtCw0LrQsAor0YLQsNC60LjQstCwCivRgtCw0LrRitCyCivRgtCw0LwKK9GC0LLQvtC5CivRgtC1CivRgtC10LfQuAor0YLQuAor0YLQvQor0YLQvgor0YLQvtCy0LAKK9GC0L7Qs9Cw0LLQsAor0YLQvtC30LgKK9GC0L7QuQor0YLQvtC70LrQvtCy0LAKK9GC0L7Rh9C90L4KK9GC0YDRj9Cx0LLQsAor0YLRg9C6CivRgtGK0LkKK9GC0Y8KK9GC0Y/RhQor0YMKK9GF0LDRgNC10YHQstCwCivRhwor0YfQtQor0YfQtdGB0YLQvgor0YfRgNC10LcKK9GJ0LUKK9GJ0L7QvAor0Y8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfY2EudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19jYS50eHQKaW5kZXggZTYxOGFmNS4uM2RhNjVkZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19jYS50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19jYS50eHQKQEAgLTEsMjIwICsxLDIyMCBAQAotIyBDYXRhbGFuIHN0b3B3b3JkcyBmcm9tIGh0dHA6Ly9naXRodWIuY29tL3ZjbC9jdWUubGFuZ3VhZ2UgKEFwYWNoZSAyIExpY2Vuc2VkKQ0KLWENCi1hYmFucw0KLWFjw60NCi1haA0KLWFpeMOtDQotYWl4w7INCi1hbA0KLWFscw0KLWFsZXNob3Jlcw0KLWFsZ3VuDQotYWxndW5hDQotYWxndW5lcw0KLWFsZ3Vucw0KLWFsaG9yYQ0KLWFsbMOgDQotYWxsw60NCi1hbGzDsg0KLWFsdHJhDQotYWx0cmUNCi1hbHRyZXMNCi1hbWINCi1hbWJkw7NzDQotYW1iZHVlcw0KLWFwYQ0KLWFxdWVsbA0KLWFxdWVsbGENCi1hcXVlbGxlcw0KLWFxdWVsbHMNCi1hcXVlc3QNCi1hcXVlc3RhDQotYXF1ZXN0ZXMNCi1hcXVlc3RzDQotYXF1w60NCi1iYWl4DQotY2FkYQ0KLWNhZGFzY8O6DQotY2FkYXNjdW5hDQotY2FkYXNjdW5lcw0KLWNhZGFzY3Vucw0KLWNvbQ0KLWNvbnRyYQ0KLWQndW4NCi1kJ3VuYQ0KLWQndW5lcw0KLWQndW5zDQotZGFsdA0KLWRlDQotZGVsDQotZGVscw0KLWRlcw0KLWRlc3Byw6lzDQotZGlucw0KLWRpbnRyZQ0KLWRvbmF0DQotZG9uY3MNCi1kdXJhbnQNCi1lDQotZWgNCi1lbA0KLWVscw0KLWVtDQotZW4NCi1lbmNhcmENCi1lbnMNCi1lbnRyZQ0KLcOpcmVtDQotZXJlbg0KLcOpcmV1DQotZXMNCi3DqXMNCi1lc3RhDQotZXN0w6ANCi1lc3TDoHZlbQ0KLWVzdGF2ZW4NCi1lc3TDoHZldQ0KLWVzdGV1DQotZXQNCi1ldGMNCi1ldHMNCi1maW5zDQotZm9yYQ0KLWdhaXJlYsOpDQotaGENCi1oYW4NCi1oYXMNCi1oYXZpYQ0KLWhlDQotaGVtDQotaGV1DQotaGkgDQotaG8NCi1pDQotaWd1YWwNCi1pZ3VhbHMNCi1qYQ0KLWwnaGkNCi1sYQ0KLWxlcw0KLWxpDQotbGknbg0KLWxsYXZvcnMNCi1tJ2hlDQotbWENCi1tYWwNCi1tYWxncmF0DQotbWF0ZWl4DQotbWF0ZWl4YQ0KLW1hdGVpeGVzDQotbWF0ZWl4b3MNCi1tZQ0KLW1lbnRyZQ0KLW3DqXMNCi1tZXUNCi1tZXVzDQotbWV2YQ0KLW1ldmVzDQotbW9sdA0KLW1vbHRhDQotbW9sdGVzDQotbW9sdHMNCi1tb24NCi1tb25zDQotbidoZQ0KLW4naGkNCi1uZQ0KLW5pDQotbm8NCi1ub2dlbnNtZW55cw0KLW5vbcOpcw0KLW5vc2FsdHJlcw0KLW5vc3RyYQ0KLW5vc3RyZQ0KLW5vc3RyZXMNCi1vDQotb2gNCi1vaQ0KLW9uDQotcGFzDQotcGVsDQotcGVscw0KLXBlcg0KLXBlcsOyDQotcGVycXXDqA0KLXBvYyANCi1wb2NhDQotcG9jcw0KLXBvcXVlcw0KLXBvdHNlcg0KLXByb3BpDQotcXVhbA0KLXF1YWxzDQotcXVhbg0KLXF1YW50IA0KLXF1ZQ0KLXF1w6gNCi1xdWVsY29tDQotcXVpDQotcXVpbg0KLXF1aW5hDQotcXVpbmVzDQotcXVpbnMNCi1zJ2hhDQotcydoYW4NCi1zYQ0KLXNlbWJsYW50DQotc2VtYmxhbnRzDQotc2VzDQotc2V1IA0KLXNldXMNCi1zZXZhDQotc2V2YQ0KLXNldmVzDQotc2kNCi1zb2JyZQ0KLXNvYnJldG90DQotc8OzYw0KLXNvbGFtZW50DQotc29scw0KLXNvbiANCi1zw7NuDQotc29ucyANCi1zb3RhDQotc291DQotdCdoYQ0KLXQnaGFuDQotdCdoZQ0KLXRhDQotdGFsDQotdGFtYsOpDQotdGFtcG9jDQotdGFuDQotdGFudA0KLXRhbnRhDQotdGFudGVzDQotdGV1DQotdGV1cw0KLXRldmENCi10ZXZlcw0KLXRvbg0KLXRvbnMNCi10b3QNCi10b3RhDQotdG90ZXMNCi10b3RzDQotdW4NCi11bmENCi11bmVzDQotdW5zDQotdXMNCi12YQ0KLXZhaWcNCi12YW0NCi12YW4NCi12YXMNCi12ZXUNCi12b3NhbHRyZXMNCi12b3N0cmENCi12b3N0cmUNCi12b3N0cmVzDQorIyBDYXRhbGFuIHN0b3B3b3JkcyBmcm9tIGh0dHA6Ly9naXRodWIuY29tL3ZjbC9jdWUubGFuZ3VhZ2UgKEFwYWNoZSAyIExpY2Vuc2VkKQorYQorYWJhbnMKK2Fjw60KK2FoCithaXjDrQorYWl4w7IKK2FsCithbHMKK2FsZXNob3JlcworYWxndW4KK2FsZ3VuYQorYWxndW5lcworYWxndW5zCithbGhvcmEKK2FsbMOgCithbGzDrQorYWxsw7IKK2FsdHJhCithbHRyZQorYWx0cmVzCithbWIKK2FtYmTDs3MKK2FtYmR1ZXMKK2FwYQorYXF1ZWxsCithcXVlbGxhCithcXVlbGxlcworYXF1ZWxscworYXF1ZXN0CithcXVlc3RhCithcXVlc3RlcworYXF1ZXN0cworYXF1w60KK2JhaXgKK2NhZGEKK2NhZGFzY8O6CitjYWRhc2N1bmEKK2NhZGFzY3VuZXMKK2NhZGFzY3VucworY29tCitjb250cmEKK2QndW4KK2QndW5hCitkJ3VuZXMKK2QndW5zCitkYWx0CitkZQorZGVsCitkZWxzCitkZXMKK2Rlc3Byw6lzCitkaW5zCitkaW50cmUKK2RvbmF0Citkb25jcworZHVyYW50CitlCitlaAorZWwKK2VscworZW0KK2VuCitlbmNhcmEKK2VucworZW50cmUKK8OpcmVtCitlcmVuCivDqXJldQorZXMKK8OpcworZXN0YQorZXN0w6AKK2VzdMOgdmVtCitlc3RhdmVuCitlc3TDoHZldQorZXN0ZXUKK2V0CitldGMKK2V0cworZmlucworZm9yYQorZ2FpcmViw6kKK2hhCitoYW4KK2hhcworaGF2aWEKK2hlCitoZW0KK2hldQoraGkgCitobworaQoraWd1YWwKK2lndWFscworamEKK2wnaGkKK2xhCitsZXMKK2xpCitsaSduCitsbGF2b3JzCittJ2hlCittYQorbWFsCittYWxncmF0CittYXRlaXgKK21hdGVpeGEKK21hdGVpeGVzCittYXRlaXhvcworbWUKK21lbnRyZQorbcOpcworbWV1CittZXVzCittZXZhCittZXZlcworbW9sdAorbW9sdGEKK21vbHRlcworbW9sdHMKK21vbgorbW9ucworbidoZQorbidoaQorbmUKK25pCitubworbm9nZW5zbWVueXMKK25vbcOpcworbm9zYWx0cmVzCitub3N0cmEKK25vc3RyZQorbm9zdHJlcworbworb2gKK29pCitvbgorcGFzCitwZWwKK3BlbHMKK3BlcgorcGVyw7IKK3BlcnF1w6gKK3BvYyAKK3BvY2EKK3BvY3MKK3BvcXVlcworcG90c2VyCitwcm9waQorcXVhbAorcXVhbHMKK3F1YW4KK3F1YW50IAorcXVlCitxdcOoCitxdWVsY29tCitxdWkKK3F1aW4KK3F1aW5hCitxdWluZXMKK3F1aW5zCitzJ2hhCitzJ2hhbgorc2EKK3NlbWJsYW50CitzZW1ibGFudHMKK3Nlcworc2V1IAorc2V1cworc2V2YQorc2V2YQorc2V2ZXMKK3NpCitzb2JyZQorc29icmV0b3QKK3PDs2MKK3NvbGFtZW50Citzb2xzCitzb24gCitzw7NuCitzb25zIAorc290YQorc291Cit0J2hhCit0J2hhbgordCdoZQordGEKK3RhbAordGFtYsOpCit0YW1wb2MKK3RhbgordGFudAordGFudGEKK3RhbnRlcwordGV1Cit0ZXVzCit0ZXZhCit0ZXZlcwordG9uCit0b25zCit0b3QKK3RvdGEKK3RvdGVzCit0b3RzCit1bgordW5hCit1bmVzCit1bnMKK3VzCit2YQordmFpZwordmFtCit2YW4KK3ZhcwordmV1Cit2b3NhbHRyZXMKK3Zvc3RyYQordm9zdHJlCit2b3N0cmVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2NrYi50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2NrYi50eHQKaW5kZXggYzNlMWU1Zi4uODdhYmYxMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19ja2IudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfY2tiLnR4dApAQCAtMSwxMzYgKzEsMTM2IEBACi0jIHNldCBvZiBrdXJkaXNoIHN0b3B3b3Jkcw0KLSMgbm90ZSB0aGVzZSBoYXZlIGJlZW4gbm9ybWFsaXplZCB3aXRoIG91ciBzY2hlbWUgKGUgcmVwcmVzZW50ZWQgd2l0aCBVKzA2RDUsIGV0YykNCi0jIGNvbnN0cnVjdGVkIGZyb206DQotIyAqIEZpZyA1IG9mICJCdWlsZGluZyBBIFRlc3QgQ29sbGVjdGlvbiBGb3IgU29yYW5pIEt1cmRpc2giIChFc21haWxpIGV0IGFsKQ0KLSMgKiAiU29yYW5pIEt1cmRpc2g6IEEgUmVmZXJlbmNlIEdyYW1tYXIgd2l0aCBzZWxlY3RlZCByZWFkaW5ncyIgKFRoYWNrc3RvbikNCi0jICogQ29ycHVzLWJhc2VkIGFuYWx5c2lzIG9mIDc3TSB3b3JkIFNvcmFuaSBjb2xsZWN0aW9uOiB3aWtpcGVkaWEsIG5ld3MsIGJsb2dzLCBldGMNCi0NCi0jIGFuZA0KLdmIDQotIyB3aGljaA0KLdqp25UNCi0jIG9mDQot24wNCi0jIG1hZGUvZGlkDQot2qnYsdivDQotIyB0aGF0L3doaWNoDQot2KbbldmI25XbjA0KLSMgb24vaGVhZA0KLdiz25XYsQ0KLSMgdHdvDQot2K/ZiNmIDQotIyBhbHNvDQot2Yfbldix2YjbldmH2KcNCi0jIGZyb20vdGhhdA0KLdmE25XZiA0KLSMgbWFrZXMvZG9lcw0KLdiv25Xaqdin2KoNCi0jIHNvbWUNCi3ahtuV2YbYrw0KLSMgZXZlcnkNCi3Zh9uV2LENCi0NCi0jIGRlbW9uc3RyYXRpdmVzDQotIyB0aGF0DQot2KbbldmIDQotIyB0aGlzDQot2KbbldmFDQotDQotIyBwZXJzb25hbCBwcm9ub3Vucw0KLSMgSQ0KLdmF2YYNCi0jIHdlDQot2KbbjtmF25UNCi0jIHlvdQ0KLdiq24YNCi0jIHlvdQ0KLdim247ZiNuVDQotIyBoZS9zaGUvaXQNCi3YptuV2YgNCi0jIHRoZXkNCi3YptuV2YjYp9mGDQotDQotIyBwcmVwb3NpdGlvbnMNCi0jIHRvL3dpdGgvYnkNCi3YqNuVDQot2b7bjg0KLSMgd2l0aG91dA0KLdio25XYqNuODQotIyBhbG9uZyB3aXRoL3doaWxlL2R1cmluZw0KLdio25XYr9uV2YUNCi0jIGluIHRoZSBvcGluaW9uIG9mDQot2KjbldmE2KfbjA0KLSMgYWNjb3JkaW5nIHRvDQot2Kjbldm+247bjA0KLSMgYmVmb3JlDQot2Kjbldix2YTblQ0KLSMgaW4gdGhlIGRpcmVjdGlvbiBvZg0KLdio25XYsduV2YjbjA0KLSMgaW4gZnJvbnQgb2YvdG93YXJkDQot2Kjbldix25XZiNuVDQotIyBiZWZvcmUvaW4gdGhlIGZhY2Ugb2YNCi3YqNuV2LHYr9uV2YUNCi0jIHdpdGhvdXQNCi3YqNuODQotIyBleGNlcHQgZm9yDQot2Kjbjtis2q/blQ0KLSMgZm9yDQot2Kjbhg0KLSMgb24vaW4NCi3Yr9uVDQot2Krbjg0KLSMgd2l0aA0KLdiv25Xar9uV2rUNCi0jIGFmdGVyDQot2K/ZiNin24wNCi0jIGV4Y2VwdCBmb3IvYXNpZGUgZnJvbQ0KLdis2q/blQ0KLSMgaW4vZnJvbQ0KLdmE25UNCi3ZhNuODQotIyBpbiBmcm9udCBvZi9iZWZvcmUvYmVjYXVzZSBvZg0KLdmE25XYqNuV2LENCi0jIGJldHdlZW4vYW1vbmcNCi3ZhNuV2KjblduM2YbbjA0KLSMgY29uY2VybmluZy9hYm91dA0KLdmE25XYqNin2KjbldiqDQotIyBjb25jZXJuaW5nDQot2YTbldio2KfYsduV24wNCi0jIGluc3RlYWQgb2YNCi3ZhNuV2KjYp9iq24wNCi0jIGJlc2lkZQ0KLdmE25XYqNmGDQotIyBpbnN0ZWFkIG9mDQot2YTbldio2LHbjtiq24wNCi0jIGJlaGluZA0KLdmE25XYr9uV2YUNCi0jIHdpdGgvdG9nZXRoZXIgd2l0aA0KLdmE25Xar9uV2rUNCi0jIGJ5DQot2YTbldmE2KfbjNuV2YYNCi0jIHdpdGhpbg0KLdmE25XZhtin2YgNCi0jIGJldHdlZW4vYW1vbmcNCi3ZhNuV2YbbjtmIDQotIyBmb3IgdGhlIHNha2Ugb2YNCi3ZhNuV2b7bjtmG2KfZiNuMDQotIyB3aXRoIHJlc3BlY3QgdG8NCi3ZhNuV2LHbldmI24wNCi0jIGJ5IG1lYW5zIG9mL2Zvcg0KLdmE25XYsduODQotIyBmb3IgdGhlIHNha2Ugb2YNCi3ZhNuV2LHbjtqv2KcNCi0jIG9uL29uIHRvcCBvZi9hY2NvcmRpbmcgdG8NCi3ZhNuV2LPbldixDQotIyB1bmRlcg0KLdmE25XamNuO2LENCi0jIGJldHdlZW4vYW1vbmcNCi3Zhtin2YgNCi0jIGJldHdlZW4vYW1vbmcNCi3ZhtuO2YjYp9mGDQotIyBhZnRlcg0KLdm+2KfYtA0KLSMgYmVmb3JlDQot2b7bjti0DQotIyBsaWtlDQot2YjbldqpDQorIyBzZXQgb2Yga3VyZGlzaCBzdG9wd29yZHMKKyMgbm90ZSB0aGVzZSBoYXZlIGJlZW4gbm9ybWFsaXplZCB3aXRoIG91ciBzY2hlbWUgKGUgcmVwcmVzZW50ZWQgd2l0aCBVKzA2RDUsIGV0YykKKyMgY29uc3RydWN0ZWQgZnJvbToKKyMgKiBGaWcgNSBvZiAiQnVpbGRpbmcgQSBUZXN0IENvbGxlY3Rpb24gRm9yIFNvcmFuaSBLdXJkaXNoIiAoRXNtYWlsaSBldCBhbCkKKyMgKiAiU29yYW5pIEt1cmRpc2g6IEEgUmVmZXJlbmNlIEdyYW1tYXIgd2l0aCBzZWxlY3RlZCByZWFkaW5ncyIgKFRoYWNrc3RvbikKKyMgKiBDb3JwdXMtYmFzZWQgYW5hbHlzaXMgb2YgNzdNIHdvcmQgU29yYW5pIGNvbGxlY3Rpb246IHdpa2lwZWRpYSwgbmV3cywgYmxvZ3MsIGV0YworCisjIGFuZAor2YgKKyMgd2hpY2gKK9qp25UKKyMgb2YKK9uMCisjIG1hZGUvZGlkCivaqdix2K8KKyMgdGhhdC93aGljaAor2KbbldmI25XbjAorIyBvbi9oZWFkCivYs9uV2LEKKyMgdHdvCivYr9mI2YgKKyMgYWxzbwor2Yfbldix2YjbldmH2KcKKyMgZnJvbS90aGF0CivZhNuV2YgKKyMgbWFrZXMvZG9lcwor2K/bldqp2KfYqgorIyBzb21lCivahtuV2YbYrworIyBldmVyeQor2YfbldixCisKKyMgZGVtb25zdHJhdGl2ZXMKKyMgdGhhdAor2KbbldmICisjIHRoaXMKK9im25XZhQorCisjIHBlcnNvbmFsIHByb25vdW5zCisjIEkKK9mF2YYKKyMgd2UKK9im247ZhduVCisjIHlvdQor2KrbhgorIyB5b3UKK9im247ZiNuVCisjIGhlL3NoZS9pdAor2KbbldmICisjIHRoZXkKK9im25XZiNin2YYKKworIyBwcmVwb3NpdGlvbnMKKyMgdG8vd2l0aC9ieQor2KjblQor2b7bjgorIyB3aXRob3V0CivYqNuV2KjbjgorIyBhbG9uZyB3aXRoL3doaWxlL2R1cmluZwor2Kjbldiv25XZhQorIyBpbiB0aGUgb3BpbmlvbiBvZgor2KjbldmE2KfbjAorIyBhY2NvcmRpbmcgdG8KK9io25XZvtuO24wKKyMgYmVmb3JlCivYqNuV2LHZhNuVCisjIGluIHRoZSBkaXJlY3Rpb24gb2YKK9io25XYsduV2YjbjAorIyBpbiBmcm9udCBvZi90b3dhcmQKK9io25XYsduV2YjblQorIyBiZWZvcmUvaW4gdGhlIGZhY2Ugb2YKK9io25XYsdiv25XZhQorIyB3aXRob3V0CivYqNuOCisjIGV4Y2VwdCBmb3IKK9io247YrNqv25UKKyMgZm9yCivYqNuGCisjIG9uL2luCivYr9uVCivYqtuOCisjIHdpdGgKK9iv25Xar9uV2rUKKyMgYWZ0ZXIKK9iv2YjYp9uMCisjIGV4Y2VwdCBmb3IvYXNpZGUgZnJvbQor2Kzar9uVCisjIGluL2Zyb20KK9mE25UKK9mE244KKyMgaW4gZnJvbnQgb2YvYmVmb3JlL2JlY2F1c2Ugb2YKK9mE25XYqNuV2LEKKyMgYmV0d2Vlbi9hbW9uZwor2YTbldio25XbjNmG24wKKyMgY29uY2VybmluZy9hYm91dAor2YTbldio2KfYqNuV2KoKKyMgY29uY2VybmluZwor2YTbldio2KfYsduV24wKKyMgaW5zdGVhZCBvZgor2YTbldio2KfYqtuMCisjIGJlc2lkZQor2YTbldio2YYKKyMgaW5zdGVhZCBvZgor2YTbldio2LHbjtiq24wKKyMgYmVoaW5kCivZhNuV2K/bldmFCisjIHdpdGgvdG9nZXRoZXIgd2l0aAor2YTbldqv25XatQorIyBieQor2YTbldmE2KfbjNuV2YYKKyMgd2l0aGluCivZhNuV2YbYp9mICisjIGJldHdlZW4vYW1vbmcKK9mE25XZhtuO2YgKKyMgZm9yIHRoZSBzYWtlIG9mCivZhNuV2b7bjtmG2KfZiNuMCisjIHdpdGggcmVzcGVjdCB0bwor2YTbldix25XZiNuMCisjIGJ5IG1lYW5zIG9mL2Zvcgor2YTbldix244KKyMgZm9yIHRoZSBzYWtlIG9mCivZhNuV2LHbjtqv2KcKKyMgb24vb24gdG9wIG9mL2FjY29yZGluZyB0bwor2YTbldiz25XYsQorIyB1bmRlcgor2YTbldqY247YsQorIyBiZXR3ZWVuL2Ftb25nCivZhtin2YgKKyMgYmV0d2Vlbi9hbW9uZwor2YbbjtmI2KfZhgorIyBhZnRlcgor2b7Yp9i0CisjIGJlZm9yZQor2b7bjti0CisjIGxpa2UKK9mI25XaqQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19jei50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2N6LnR4dAppbmRleCBlOTI4ZGY5Li41M2M2MDk3IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2N6LnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2N6LnR4dApAQCAtMSwxNzIgKzEsMTcyIEBACi1hDQotcw0KLWsNCi1vDQotaQ0KLXUNCi12DQoteg0KLWRuZXMNCi1jeg0KLXTDrW10bw0KLWJ1ZGXFoQ0KLWJ1ZGVtDQotYnlsaQ0KLWpzZcWhDQotbcWvag0KLXN2w71tDQotdGENCi10b210bw0KLXRvaGxlDQotdHV0bw0KLXR5dG8NCi1qZWoNCi16ZGENCi1wcm/EjQ0KLW3DoXRlDQotdGF0bw0KLWthbQ0KLXRvaG90bw0KLWtkbw0KLWt0ZcWZw60NCi1taQ0KLW7DoW0NCi10b20NCi10b211dG8NCi1tw610DQotbmljDQotcHJvdG8NCi1rdGVyb3UNCi1ieWxhDQotdG9obw0KLXByb3Rvxb5lDQotYXNpDQotaG8NCi1uYcWhaQ0KLW5hcGnFoXRlDQotcmUNCi1jb8W+DQotdMOtbQ0KLXRha8W+ZQ0KLXN2w71jaA0KLWplasOtDQotc3bDvW1pDQotanN0ZQ0KLWFqDQotdHUNCi10ZWR5DQotdGV0bw0KLWJ5bG8NCi1rZGUNCi1rZQ0KLXByYXbDqQ0KLWppDQotbmFkDQotbmVqc291DQotxI1pDQotcG9kDQotdMOpbWENCi1tZXppDQotcMWZZXMNCi10eQ0KLXBhaw0KLXbDoW0NCi1hbmkNCi1rZHnFvg0KLXbFoWFrDQotbmVnDQotanNlbQ0KLXRlbnRvDQotxI1sw6Fua3UNCi3EjWzDoW5reQ0KLWFieQ0KLWpzbWUNCi1wxZllZA0KLXB0YQ0KLWplamljaA0KLWJ5bA0KLWplxaF0xJsNCi1hxb4NCi1iZXoNCi10YWvDqQ0KLXBvdXplDQotcHJ2bsOtDQotdmHFoWUNCi1rdGVyw6ENCi1uw6FzDQotbm92w70NCi10aXB5DQotcG9rdWQNCi1txa/FvmUNCi1zdHJhbmENCi1qZWhvDQotc3bDqQ0KLWppbsOpDQotenByw6F2eQ0KLW5vdsOpDQotbmVuw60NCi12w6FzDQotamVuDQotcG9kbGUNCi16ZGUNCi11xb4NCi1iw710DQotdsOtY2UNCi1idWRlDQotamnFvg0KLW5lxb4NCi1rdGVyw70NCi1ieQ0KLWt0ZXLDqQ0KLWNvDQotbmVibw0KLXRlbg0KLXRhaw0KLW3DoQ0KLXDFmWkNCi1vZA0KLXBvDQotanNvdQ0KLWphaw0KLWRhbMWhw60NCi1hbGUNCi1zaQ0KLXNlDQotdmUNCi10bw0KLWpha28NCi16YQ0KLXpwxJt0DQotemUNCi1kbw0KLXBybw0KLWplDQotbmENCi1hdGQNCi1hdHANCi1qYWttaWxlDQotcMWZacSNZW3Fvg0KLWrDoQ0KLW9uDQotb25hDQotb25vDQotb25pDQotb255DQotbXkNCi12eQ0KLWrDrQ0KLWppDQotbcSbDQotbW5lDQotamVtdQ0KLXRvbXUNCi10xJttDQotdMSbbXUNCi1uxJttdQ0KLW7Em211xb4NCi1qZWhvxb4NCi1qw63Fvg0KLWplbGlrb8W+DQotamXFvg0KLWpha2/Fvg0KLW5hxI1lxb4NCithCitzCitrCitvCitpCit1Cit2Cit6CitkbmVzCitjegordMOtbXRvCitidWRlxaEKK2J1ZGVtCitieWxpCitqc2XFoQorbcWvagorc3bDvW0KK3RhCit0b210bwordG9obGUKK3R1dG8KK3R5dG8KK2plagoremRhCitwcm/EjQorbcOhdGUKK3RhdG8KK2thbQordG9ob3RvCitrZG8KK2t0ZcWZw60KK21pCituw6FtCit0b20KK3RvbXV0bworbcOtdAorbmljCitwcm90bwora3Rlcm91CitieWxhCit0b2hvCitwcm90b8W+ZQorYXNpCitobworbmHFoWkKK25hcGnFoXRlCityZQorY2/FvgordMOtbQordGFrxb5lCitzdsO9Y2gKK2plasOtCitzdsO9bWkKK2pzdGUKK2FqCit0dQordGVkeQordGV0bworYnlsbwora2RlCitrZQorcHJhdsOpCitqaQorbmFkCituZWpzb3UKK8SNaQorcG9kCit0w6ltYQorbWV6aQorcMWZZXMKK3R5CitwYWsKK3bDoW0KK2FuaQora2R5xb4KK3bFoWFrCituZWcKK2pzZW0KK3RlbnRvCivEjWzDoW5rdQorxI1sw6Fua3kKK2FieQoranNtZQorcMWZZWQKK3B0YQoramVqaWNoCitieWwKK2plxaF0xJsKK2HFvgorYmV6Cit0YWvDqQorcG91emUKK3Bydm7DrQordmHFoWUKK2t0ZXLDoQorbsOhcworbm92w70KK3RpcHkKK3Bva3VkCittxa/FvmUKK3N0cmFuYQoramVobworc3bDqQoramluw6kKK3pwcsOhdnkKK25vdsOpCituZW7DrQordsOhcworamVuCitwb2RsZQoremRlCit1xb4KK2LDvXQKK3bDrWNlCitidWRlCitqacW+CituZcW+CitrdGVyw70KK2J5CitrdGVyw6kKK2NvCituZWJvCit0ZW4KK3RhaworbcOhCitwxZlpCitvZAorcG8KK2pzb3UKK2phaworZGFsxaHDrQorYWxlCitzaQorc2UKK3ZlCit0bworamFrbworemEKK3pwxJt0Cit6ZQorZG8KK3BybworamUKK25hCithdGQKK2F0cAoramFrbWlsZQorcMWZacSNZW3FvgorasOhCitvbgorb25hCitvbm8KK29uaQorb255CitteQordnkKK2rDrQoramkKK23EmworbW5lCitqZW11Cit0b211Cit0xJttCit0xJttdQorbsSbbXUKK27Em211xb4KK2plaG/FvgorasOtxb4KK2plbGlrb8W+CitqZcW+CitqYWtvxb4KK25hxI1lxb4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZGEudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19kYS50eHQKaW5kZXggZTI1ZDQ5Yy4uNDJlNjE0NSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19kYS50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19kYS50eHQKQEAgLTEsMTEwICsxLDExMCBAQAotIHwgRnJvbSBzdm4udGFydGFydXMub3JnL3Nub3diYWxsL3RydW5rL3dlYnNpdGUvYWxnb3JpdGhtcy9kYW5pc2gvc3RvcC50eHQNCi0gfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLg0KLSB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwDQotIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sDQotIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4NCi0gfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuDQotIHwNCi0gfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCINCi0NCi0gfCBBIERhbmlzaCBzdG9wIHdvcmQgbGlzdC4gQ29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIEVhY2ggc3RvcA0KLSB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4NCi0NCi0gfCBUaGlzIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3JkcyBkZXJpdmVkIGZyb20NCi0gfCBhIGxhcmdlIHRleHQgc2FtcGxlLg0KLQ0KLQ0KLW9nICAgICAgICAgICB8IGFuZA0KLWkgICAgICAgICAgICB8IGluDQotamVnICAgICAgICAgIHwgSQ0KLWRldCAgICAgICAgICB8IHRoYXQgKGRlbS4gcHJvbm91bikvaXQgKHBlcnMuIHByb25vdW4pDQotYXQgICAgICAgICAgIHwgdGhhdCAoaW4gZnJvbnQgb2YgYSBzZW50ZW5jZSkvdG8gKHdpdGggaW5maW5pdGl2ZSkNCi1lbiAgICAgICAgICAgfCBhL2FuDQotZGVuICAgICAgICAgIHwgaXQgKHBlcnMuIHByb25vdW4pL3RoYXQgKGRlbS4gcHJvbm91bikNCi10aWwgICAgICAgICAgfCB0by9hdC9mb3IvdW50aWwvYWdhaW5zdC9ieS9vZi9pbnRvLCBtb3JlDQotZXIgICAgICAgICAgIHwgcHJlc2VudCB0ZW5zZSBvZiAidG8gYmUiDQotc29tICAgICAgICAgIHwgd2hvLCBhcw0KLXDDpSAgICAgICAgICAgfCBvbi91cG9uL2luL29uL2F0L3RvL2FmdGVyL29mL3dpdGgvZm9yLCBvbg0KLWRlICAgICAgICAgICB8IHRoZXkNCi1tZWQgICAgICAgICAgfCB3aXRoL2J5L2luLCBhbG9uZw0KLWhhbiAgICAgICAgICB8IGhlDQotYWYgICAgICAgICAgIHwgb2YvYnkvZnJvbS9vZmYvZm9yL2luL3dpdGgvb24sIG9mZg0KLWZvciAgICAgICAgICB8IGF0L2Zvci90by9mcm9tL2J5L29mL2FnbywgaW4gZnJvbnQvYmVmb3JlLCBiZWNhdXNlDQotaWtrZSAgICAgICAgIHwgbm90DQotZGVyICAgICAgICAgIHwgd2hvL3doaWNoLCB0aGVyZS90aG9zZQ0KLXZhciAgICAgICAgICB8IHBhc3QgdGVuc2Ugb2YgInRvIGJlIg0KLW1pZyAgICAgICAgICB8IG1lL215c2VsZg0KLXNpZyAgICAgICAgICB8IG9uZXNlbGYvaGltc2VsZi9oZXJzZWxmL2l0c2VsZi90aGVtc2VsdmVzDQotbWVuICAgICAgICAgIHwgYnV0DQotZXQgICAgICAgICAgIHwgYS9hbi9vbmUsIG9uZSAobnVtYmVyKSwgc29tZW9uZS9zb21lYm9keS9vbmUNCi1oYXIgICAgICAgICAgfCBwcmVzZW50IHRlbnNlIG9mICJ0byBoYXZlIg0KLW9tICAgICAgICAgICB8IHJvdW5kL2Fib3V0L2Zvci9pbi9hLCBhYm91dC9hcm91bmQvZG93biwgaWYNCi12aSAgICAgICAgICAgfCB3ZQ0KLW1pbiAgICAgICAgICB8IG15DQotaGF2ZGUgICAgICAgIHwgcGFzdCB0ZW5zZSBvZiAidG8gaGF2ZSINCi1oYW0gICAgICAgICAgfCBoaW0NCi1odW4gICAgICAgICAgfCBzaGUNCi1udSAgICAgICAgICAgfCBub3cNCi1vdmVyICAgICAgICAgfCBvdmVyL2Fib3ZlL2Fjcm9zcy9ieS9iZXlvbmQvcGFzdC9vbi9hYm91dCwgb3Zlci9wYXN0DQotZGEgICAgICAgICAgIHwgdGhlbiwgd2hlbi9hcy9zaW5jZQ0KLWZyYSAgICAgICAgICB8IGZyb20vb2ZmL3NpbmNlLCBvZmYsIHNpbmNlDQotZHUgICAgICAgICAgIHwgeW91DQotdWQgICAgICAgICAgIHwgb3V0DQotc2luICAgICAgICAgIHwgaGlzL2hlci9pdHMvb25lJ3MNCi1kZW0gICAgICAgICAgfCB0aGVtDQotb3MgICAgICAgICAgIHwgdXMvb3Vyc2VsdmVzDQotb3AgICAgICAgICAgIHwgdXANCi1tYW4gICAgICAgICAgfCB5b3Uvb25lDQotaGFucyAgICAgICAgIHwgaGlzDQotaHZvciAgICAgICAgIHwgd2hlcmUNCi1lbGxlciAgICAgICAgfCBvcg0KLWh2YWQgICAgICAgICB8IHdoYXQNCi1za2FsICAgICAgICAgfCBtdXN0L3NoYWxsIGV0Yy4NCi1zZWx2ICAgICAgICAgfCBteXNlbGYveW91c2VsZi9oZXJzZWxmL291cnNlbHZlcyBldGMuLCBldmVuDQotaGVyICAgICAgICAgIHwgaGVyZQ0KLWFsbGUgICAgICAgICB8IGFsbC9ldmVyeW9uZS9ldmVyeWJvZHkgZXRjLg0KLXZpbCAgICAgICAgICB8IHdpbGwgKHZlcmIpDQotYmxldiAgICAgICAgIHwgcGFzdCB0ZW5zZSBvZiAidG8gc3RheS90byByZW1haW4vdG8gZ2V0L3RvIGJlY29tZSINCi1rdW5uZSAgICAgICAgfCBjb3VsZA0KLWluZCAgICAgICAgICB8IGluDQotbsOlciAgICAgICAgICB8IHdoZW4NCi12w6ZyZSAgICAgICAgIHwgcHJlc2VudCB0ZW5zZSBvZiAidG8gYmUiDQotZG9nICAgICAgICAgIHwgaG93ZXZlci95ZXQvYWZ0ZXIgYWxsDQotbm9nZXQgICAgICAgIHwgc29tZXRoaW5nDQotdmlsbGUgICAgICAgIHwgd291bGQNCi1qbyAgICAgICAgICAgfCB5b3Uga25vdy95b3Ugc2VlIChhZHYpLCB5ZXMNCi1kZXJlcyAgICAgICAgfCB0aGVpci90aGVpcnMNCi1lZnRlciAgICAgICAgfCBhZnRlci9iZWhpbmQvYWNjb3JkaW5nIHRvL2Zvci9ieS9mcm9tLCBsYXRlci9hZnRlcndhcmRzDQotbmVkICAgICAgICAgIHwgZG93bg0KLXNrdWxsZSAgICAgICB8IHNob3VsZA0KLWRlbm5lICAgICAgICB8IHRoaXMNCi1lbmQgICAgICAgICAgfCB0aGFuDQotZGV0dGUgICAgICAgIHwgdGhpcw0KLW1pdCAgICAgICAgICB8IG15L21pbmUNCi1vZ3PDpSAgICAgICAgIHwgYWxzbw0KLXVuZGVyICAgICAgICB8IHVuZGVyL2JlbmVhdGgvYmVsb3cvZHVyaW5nLCBiZWxvdy91bmRlcm5lYXRoDQotaGF2ZSAgICAgICAgIHwgaGF2ZQ0KLWRpZyAgICAgICAgICB8IHlvdQ0KLWFuZGVuICAgICAgICB8IG90aGVyDQotaGVuZGUgICAgICAgIHwgaGVyDQotbWluZSAgICAgICAgIHwgbXkNCi1hbHQgICAgICAgICAgfCBldmVyeXRoaW5nDQotbWVnZXQgICAgICAgIHwgbXVjaC92ZXJ5LCBwbGVudHkgb2YNCi1zaXQgICAgICAgICAgfCBoaXMsIGhlciwgaXRzLCBvbmUncw0KLXNpbmUgICAgICAgICB8IGhpcywgaGVyLCBpdHMsIG9uZSdzDQotdm9yICAgICAgICAgIHwgb3VyDQotbW9kICAgICAgICAgIHwgYWdhaW5zdA0KLWRpc3NlICAgICAgICB8IHRoZXNlDQotaHZpcyAgICAgICAgIHwgaWYNCi1kaW4gICAgICAgICAgfCB5b3VyL3lvdXJzDQotbm9nbGUgICAgICAgIHwgc29tZQ0KLWhvcyAgICAgICAgICB8IGJ5L2F0DQotYmxpdmUgICAgICAgIHwgYmUvYmVjb21lDQotbWFuZ2UgICAgICAgIHwgbWFueQ0KLWFkICAgICAgICAgICB8IGJ5L3Rocm91Z2gNCi1ibGl2ZXIgICAgICAgfCBwcmVzZW50IHRlbnNlIG9mICJ0byBiZS90byBiZWNvbWUiDQotaGVuZGVzICAgICAgIHwgaGVyL2hlcnMNCi12w6ZyZXQgICAgICAgIHwgYmUNCi10aGkgICAgICAgICAgfCBmb3IgKGNvbmopDQotamVyICAgICAgICAgIHwgeW91DQotc8OlZGFuICAgICAgICB8IHN1Y2gsIGxpa2UgdGhpcy9saWtlIHRoYXQNCisgfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL2RhbmlzaC9zdG9wLnR4dAorIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KKyB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwCisgfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKKyB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguCisgfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuCisgfAorIHwgTk9URTogVG8gdXNlIHRoaXMgZmlsZSB3aXRoIFN0b3BGaWx0ZXJGYWN0b3J5LCB5b3UgbXVzdCBzcGVjaWZ5IGZvcm1hdD0ic25vd2JhbGwiCisKKyB8IEEgRGFuaXNoIHN0b3Agd29yZCBsaXN0LiBDb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gRWFjaCBzdG9wCisgfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisKKyB8IFRoaXMgaXMgYSByYW5rZWQgbGlzdCAoY29tbW9uZXN0IHRvIHJhcmVzdCkgb2Ygc3RvcHdvcmRzIGRlcml2ZWQgZnJvbQorIHwgYSBsYXJnZSB0ZXh0IHNhbXBsZS4KKworCitvZyAgICAgICAgICAgfCBhbmQKK2kgICAgICAgICAgICB8IGluCitqZWcgICAgICAgICAgfCBJCitkZXQgICAgICAgICAgfCB0aGF0IChkZW0uIHByb25vdW4pL2l0IChwZXJzLiBwcm9ub3VuKQorYXQgICAgICAgICAgIHwgdGhhdCAoaW4gZnJvbnQgb2YgYSBzZW50ZW5jZSkvdG8gKHdpdGggaW5maW5pdGl2ZSkKK2VuICAgICAgICAgICB8IGEvYW4KK2RlbiAgICAgICAgICB8IGl0IChwZXJzLiBwcm9ub3VuKS90aGF0IChkZW0uIHByb25vdW4pCit0aWwgICAgICAgICAgfCB0by9hdC9mb3IvdW50aWwvYWdhaW5zdC9ieS9vZi9pbnRvLCBtb3JlCitlciAgICAgICAgICAgfCBwcmVzZW50IHRlbnNlIG9mICJ0byBiZSIKK3NvbSAgICAgICAgICB8IHdobywgYXMKK3DDpSAgICAgICAgICAgfCBvbi91cG9uL2luL29uL2F0L3RvL2FmdGVyL29mL3dpdGgvZm9yLCBvbgorZGUgICAgICAgICAgIHwgdGhleQorbWVkICAgICAgICAgIHwgd2l0aC9ieS9pbiwgYWxvbmcKK2hhbiAgICAgICAgICB8IGhlCithZiAgICAgICAgICAgfCBvZi9ieS9mcm9tL29mZi9mb3IvaW4vd2l0aC9vbiwgb2ZmCitmb3IgICAgICAgICAgfCBhdC9mb3IvdG8vZnJvbS9ieS9vZi9hZ28sIGluIGZyb250L2JlZm9yZSwgYmVjYXVzZQoraWtrZSAgICAgICAgIHwgbm90CitkZXIgICAgICAgICAgfCB3aG8vd2hpY2gsIHRoZXJlL3Rob3NlCit2YXIgICAgICAgICAgfCBwYXN0IHRlbnNlIG9mICJ0byBiZSIKK21pZyAgICAgICAgICB8IG1lL215c2VsZgorc2lnICAgICAgICAgIHwgb25lc2VsZi9oaW1zZWxmL2hlcnNlbGYvaXRzZWxmL3RoZW1zZWx2ZXMKK21lbiAgICAgICAgICB8IGJ1dAorZXQgICAgICAgICAgIHwgYS9hbi9vbmUsIG9uZSAobnVtYmVyKSwgc29tZW9uZS9zb21lYm9keS9vbmUKK2hhciAgICAgICAgICB8IHByZXNlbnQgdGVuc2Ugb2YgInRvIGhhdmUiCitvbSAgICAgICAgICAgfCByb3VuZC9hYm91dC9mb3IvaW4vYSwgYWJvdXQvYXJvdW5kL2Rvd24sIGlmCit2aSAgICAgICAgICAgfCB3ZQorbWluICAgICAgICAgIHwgbXkKK2hhdmRlICAgICAgICB8IHBhc3QgdGVuc2Ugb2YgInRvIGhhdmUiCitoYW0gICAgICAgICAgfCBoaW0KK2h1biAgICAgICAgICB8IHNoZQorbnUgICAgICAgICAgIHwgbm93CitvdmVyICAgICAgICAgfCBvdmVyL2Fib3ZlL2Fjcm9zcy9ieS9iZXlvbmQvcGFzdC9vbi9hYm91dCwgb3Zlci9wYXN0CitkYSAgICAgICAgICAgfCB0aGVuLCB3aGVuL2FzL3NpbmNlCitmcmEgICAgICAgICAgfCBmcm9tL29mZi9zaW5jZSwgb2ZmLCBzaW5jZQorZHUgICAgICAgICAgIHwgeW91Cit1ZCAgICAgICAgICAgfCBvdXQKK3NpbiAgICAgICAgICB8IGhpcy9oZXIvaXRzL29uZSdzCitkZW0gICAgICAgICAgfCB0aGVtCitvcyAgICAgICAgICAgfCB1cy9vdXJzZWx2ZXMKK29wICAgICAgICAgICB8IHVwCittYW4gICAgICAgICAgfCB5b3Uvb25lCitoYW5zICAgICAgICAgfCBoaXMKK2h2b3IgICAgICAgICB8IHdoZXJlCitlbGxlciAgICAgICAgfCBvcgoraHZhZCAgICAgICAgIHwgd2hhdAorc2thbCAgICAgICAgIHwgbXVzdC9zaGFsbCBldGMuCitzZWx2ICAgICAgICAgfCBteXNlbGYveW91c2VsZi9oZXJzZWxmL291cnNlbHZlcyBldGMuLCBldmVuCitoZXIgICAgICAgICAgfCBoZXJlCithbGxlICAgICAgICAgfCBhbGwvZXZlcnlvbmUvZXZlcnlib2R5IGV0Yy4KK3ZpbCAgICAgICAgICB8IHdpbGwgKHZlcmIpCitibGV2ICAgICAgICAgfCBwYXN0IHRlbnNlIG9mICJ0byBzdGF5L3RvIHJlbWFpbi90byBnZXQvdG8gYmVjb21lIgora3VubmUgICAgICAgIHwgY291bGQKK2luZCAgICAgICAgICB8IGluCituw6VyICAgICAgICAgIHwgd2hlbgordsOmcmUgICAgICAgICB8IHByZXNlbnQgdGVuc2Ugb2YgInRvIGJlIgorZG9nICAgICAgICAgIHwgaG93ZXZlci95ZXQvYWZ0ZXIgYWxsCitub2dldCAgICAgICAgfCBzb21ldGhpbmcKK3ZpbGxlICAgICAgICB8IHdvdWxkCitqbyAgICAgICAgICAgfCB5b3Uga25vdy95b3Ugc2VlIChhZHYpLCB5ZXMKK2RlcmVzICAgICAgICB8IHRoZWlyL3RoZWlycworZWZ0ZXIgICAgICAgIHwgYWZ0ZXIvYmVoaW5kL2FjY29yZGluZyB0by9mb3IvYnkvZnJvbSwgbGF0ZXIvYWZ0ZXJ3YXJkcworbmVkICAgICAgICAgIHwgZG93bgorc2t1bGxlICAgICAgIHwgc2hvdWxkCitkZW5uZSAgICAgICAgfCB0aGlzCitlbmQgICAgICAgICAgfCB0aGFuCitkZXR0ZSAgICAgICAgfCB0aGlzCittaXQgICAgICAgICAgfCBteS9taW5lCitvZ3PDpSAgICAgICAgIHwgYWxzbwordW5kZXIgICAgICAgIHwgdW5kZXIvYmVuZWF0aC9iZWxvdy9kdXJpbmcsIGJlbG93L3VuZGVybmVhdGgKK2hhdmUgICAgICAgICB8IGhhdmUKK2RpZyAgICAgICAgICB8IHlvdQorYW5kZW4gICAgICAgIHwgb3RoZXIKK2hlbmRlICAgICAgICB8IGhlcgorbWluZSAgICAgICAgIHwgbXkKK2FsdCAgICAgICAgICB8IGV2ZXJ5dGhpbmcKK21lZ2V0ICAgICAgICB8IG11Y2gvdmVyeSwgcGxlbnR5IG9mCitzaXQgICAgICAgICAgfCBoaXMsIGhlciwgaXRzLCBvbmUncworc2luZSAgICAgICAgIHwgaGlzLCBoZXIsIGl0cywgb25lJ3MKK3ZvciAgICAgICAgICB8IG91cgorbW9kICAgICAgICAgIHwgYWdhaW5zdAorZGlzc2UgICAgICAgIHwgdGhlc2UKK2h2aXMgICAgICAgICB8IGlmCitkaW4gICAgICAgICAgfCB5b3VyL3lvdXJzCitub2dsZSAgICAgICAgfCBzb21lCitob3MgICAgICAgICAgfCBieS9hdAorYmxpdmUgICAgICAgIHwgYmUvYmVjb21lCittYW5nZSAgICAgICAgfCBtYW55CithZCAgICAgICAgICAgfCBieS90aHJvdWdoCitibGl2ZXIgICAgICAgfCBwcmVzZW50IHRlbnNlIG9mICJ0byBiZS90byBiZWNvbWUiCitoZW5kZXMgICAgICAgfCBoZXIvaGVycwordsOmcmV0ICAgICAgICB8IGJlCit0aGkgICAgICAgICAgfCBmb3IgKGNvbmopCitqZXIgICAgICAgICAgfCB5b3UKK3PDpWRhbiAgICAgICAgfCBzdWNoLCBsaWtlIHRoaXMvbGlrZSB0aGF0CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2RlLnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZGUudHh0CmluZGV4IGJiOTkzM2UuLjg2NTI1ZTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZGUudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZGUudHh0CkBAIC0xLDI5NCArMSwyOTQgQEAKLSB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvZ2VybWFuL3N0b3AudHh0DQotIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4NCi0gfCBTZWUgaHR0cDovL3Nub3diYWxsLnRhcnRhcnVzLm9yZy9saWNlbnNlLnBocA0KLSB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbA0KLSB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguDQotIHwgIC0gVGhpcyBub3RpY2Ugd2FzIGFkZGVkLg0KLSB8DQotIHwgTk9URTogVG8gdXNlIHRoaXMgZmlsZSB3aXRoIFN0b3BGaWx0ZXJGYWN0b3J5LCB5b3UgbXVzdCBzcGVjaWZ5IGZvcm1hdD0ic25vd2JhbGwiDQotDQotIHwgQSBHZXJtYW4gc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3ANCi0gfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuDQotDQotIHwgVGhlIG51bWJlciBvZiBmb3JtcyBpbiB0aGlzIGxpc3QgaXMgcmVkdWNlZCBzaWduaWZpY2FudGx5IGJ5IHBhc3NpbmcgaXQNCi0gfCB0aHJvdWdoIHRoZSBHZXJtYW4gc3RlbW1lci4NCi0NCi0NCi1hYmVyICAgICAgICAgICB8ICBidXQNCi0NCi1hbGxlICAgICAgICAgICB8ICBhbGwNCi1hbGxlbQ0KLWFsbGVuDQotYWxsZXINCi1hbGxlcw0KLQ0KLWFscyAgICAgICAgICAgIHwgIHRoYW4sIGFzDQotYWxzbyAgICAgICAgICAgfCAgc28NCi1hbSAgICAgICAgICAgICB8ICBhbiArIGRlbQ0KLWFuICAgICAgICAgICAgIHwgIGF0DQotDQotYW5kZXIgICAgICAgICAgfCAgb3RoZXINCi1hbmRlcmUNCi1hbmRlcmVtDQotYW5kZXJlbg0KLWFuZGVyZXINCi1hbmRlcmVzDQotYW5kZXJtDQotYW5kZXJuDQotYW5kZXJyDQotYW5kZXJzDQotDQotYXVjaCAgICAgICAgICAgfCAgYWxzbw0KLWF1ZiAgICAgICAgICAgIHwgIG9uDQotYXVzICAgICAgICAgICAgfCAgb3V0IG9mDQotYmVpICAgICAgICAgICAgfCAgYnkNCi1iaW4gICAgICAgICAgICB8ICBhbQ0KLWJpcyAgICAgICAgICAgIHwgIHVudGlsDQotYmlzdCAgICAgICAgICAgfCAgYXJ0DQotZGEgICAgICAgICAgICAgfCAgdGhlcmUNCi1kYW1pdCAgICAgICAgICB8ICB3aXRoIGl0DQotZGFubiAgICAgICAgICAgfCAgdGhlbg0KLQ0KLWRlciAgICAgICAgICAgIHwgIHRoZQ0KLWRlbg0KLWRlcw0KLWRlbQ0KLWRpZQ0KLWRhcw0KLQ0KLWRhw58gICAgICAgICAgICB8ICB0aGF0DQotDQotZGVyc2VsYmUgICAgICAgfCAgdGhlIHNhbWUNCi1kZXJzZWxiZW4NCi1kZW5zZWxiZW4NCi1kZXNzZWxiZW4NCi1kZW1zZWxiZW4NCi1kaWVzZWxiZQ0KLWRpZXNlbGJlbg0KLWRhc3NlbGJlDQotDQotZGF6dSAgICAgICAgICAgfCAgdG8gdGhhdA0KLQ0KLWRlaW4gICAgICAgICAgIHwgIHRoeQ0KLWRlaW5lDQotZGVpbmVtDQotZGVpbmVuDQotZGVpbmVyDQotZGVpbmVzDQotDQotZGVubiAgICAgICAgICAgfCAgYmVjYXVzZQ0KLQ0KLWRlcmVyICAgICAgICAgIHwgIG9mIHRob3NlDQotZGVzc2VuICAgICAgICAgfCAgb2YgaGltDQotDQotZGljaCAgICAgICAgICAgfCAgdGhlZQ0KLWRpciAgICAgICAgICAgIHwgIHRvIHRoZWUNCi1kdSAgICAgICAgICAgICB8ICB0aG91DQotDQotZGllcyAgICAgICAgICAgfCAgdGhpcw0KLWRpZXNlDQotZGllc2VtDQotZGllc2VuDQotZGllc2VyDQotZGllc2VzDQotDQotDQotZG9jaCAgICAgICAgICAgfCAgKHNldmVyYWwgbWVhbmluZ3MpDQotZG9ydCAgICAgICAgICAgfCAgKG92ZXIpIHRoZXJlDQotDQotDQotZHVyY2ggICAgICAgICAgfCAgdGhyb3VnaA0KLQ0KLWVpbiAgICAgICAgICAgIHwgIGENCi1laW5lDQotZWluZW0NCi1laW5lbg0KLWVpbmVyDQotZWluZXMNCi0NCi1laW5pZyAgICAgICAgICB8ICBzb21lDQotZWluaWdlDQotZWluaWdlbQ0KLWVpbmlnZW4NCi1laW5pZ2VyDQotZWluaWdlcw0KLQ0KLWVpbm1hbCAgICAgICAgIHwgIG9uY2UNCi0NCi1lciAgICAgICAgICAgICB8ICBoZQ0KLWlobiAgICAgICAgICAgIHwgIGhpbQ0KLWlobSAgICAgICAgICAgIHwgIHRvIGhpbQ0KLQ0KLWVzICAgICAgICAgICAgIHwgIGl0DQotZXR3YXMgICAgICAgICAgfCAgc29tZXRoaW5nDQotDQotZXVlciAgICAgICAgICAgfCAgeW91cg0KLWV1cmUNCi1ldXJlbQ0KLWV1cmVuDQotZXVyZXINCi1ldXJlcw0KLQ0KLWbDvHIgICAgICAgICAgICB8ICBmb3INCi1nZWdlbiAgICAgICAgICB8ICB0b3dhcmRzDQotZ2V3ZXNlbiAgICAgICAgfCAgcC5wLiBvZiBzZWluDQotaGFiICAgICAgICAgICAgfCAgaGF2ZQ0KLWhhYmUgICAgICAgICAgIHwgIGhhdmUNCi1oYWJlbiAgICAgICAgICB8ICBoYXZlDQotaGF0ICAgICAgICAgICAgfCAgaGFzDQotaGF0dGUgICAgICAgICAgfCAgaGFkDQotaGF0dGVuICAgICAgICAgfCAgaGFkDQotaGllciAgICAgICAgICAgfCAgaGVyZQ0KLWhpbiAgICAgICAgICAgIHwgIHRoZXJlDQotaGludGVyICAgICAgICAgfCAgYmVoaW5kDQotDQotaWNoICAgICAgICAgICAgfCAgSQ0KLW1pY2ggICAgICAgICAgIHwgIG1lDQotbWlyICAgICAgICAgICAgfCAgdG8gbWUNCi0NCi0NCi1paHIgICAgICAgICAgICB8ICB5b3UsIHRvIGhlcg0KLWlocmUNCi1paHJlbQ0KLWlocmVuDQotaWhyZXINCi1paHJlcw0KLWV1Y2ggICAgICAgICAgIHwgIHRvIHlvdQ0KLQ0KLWltICAgICAgICAgICAgIHwgIGluICsgZGVtDQotaW4gICAgICAgICAgICAgfCAgaW4NCi1pbmRlbSAgICAgICAgICB8ICB3aGlsZQ0KLWlucyAgICAgICAgICAgIHwgIGluICsgZGFzDQotaXN0ICAgICAgICAgICAgfCAgaXMNCi0NCi1qZWRlICAgICAgICAgICB8ICBlYWNoLCBldmVyeQ0KLWplZGVtDQotamVkZW4NCi1qZWRlcg0KLWplZGVzDQotDQotamVuZSAgICAgICAgICAgfCAgdGhhdA0KLWplbmVtDQotamVuZW4NCi1qZW5lcg0KLWplbmVzDQotDQotamV0enQgICAgICAgICAgfCAgbm93DQota2FubiAgICAgICAgICAgfCAgY2FuDQotDQota2VpbiAgICAgICAgICAgfCAgbm8NCi1rZWluZQ0KLWtlaW5lbQ0KLWtlaW5lbg0KLWtlaW5lcg0KLWtlaW5lcw0KLQ0KLWvDtm5uZW4gICAgICAgICB8ICBjYW4NCi1rw7ZubnRlICAgICAgICAgfCAgY291bGQNCi1tYWNoZW4gICAgICAgICB8ICBkbw0KLW1hbiAgICAgICAgICAgIHwgIG9uZQ0KLQ0KLW1hbmNoZSAgICAgICAgIHwgIHNvbWUsIG1hbnkgYQ0KLW1hbmNoZW0NCi1tYW5jaGVuDQotbWFuY2hlcg0KLW1hbmNoZXMNCi0NCi1tZWluICAgICAgICAgICB8ICBteQ0KLW1laW5lDQotbWVpbmVtDQotbWVpbmVuDQotbWVpbmVyDQotbWVpbmVzDQotDQotbWl0ICAgICAgICAgICAgfCAgd2l0aA0KLW11c3MgICAgICAgICAgIHwgIG11c3QNCi1tdXNzdGUgICAgICAgICB8ICBoYWQgdG8NCi1uYWNoICAgICAgICAgICB8ICB0byh3YXJkcykNCi1uaWNodCAgICAgICAgICB8ICBub3QNCi1uaWNodHMgICAgICAgICB8ICBub3RoaW5nDQotbm9jaCAgICAgICAgICAgfCAgc3RpbGwsIHlldA0KLW51biAgICAgICAgICAgIHwgIG5vdw0KLW51ciAgICAgICAgICAgIHwgIG9ubHkNCi1vYiAgICAgICAgICAgICB8ICB3aGV0aGVyDQotb2RlciAgICAgICAgICAgfCAgb3INCi1vaG5lICAgICAgICAgICB8ICB3aXRob3V0DQotc2VociAgICAgICAgICAgfCAgdmVyeQ0KLQ0KLXNlaW4gICAgICAgICAgIHwgIGhpcw0KLXNlaW5lDQotc2VpbmVtDQotc2VpbmVuDQotc2VpbmVyDQotc2VpbmVzDQotDQotc2VsYnN0ICAgICAgICAgfCAgc2VsZg0KLXNpY2ggICAgICAgICAgIHwgIGhlcnNlbGYNCi0NCi1zaWUgICAgICAgICAgICB8ICB0aGV5LCBzaGUNCi1paG5lbiAgICAgICAgICB8ICB0byB0aGVtDQotDQotc2luZCAgICAgICAgICAgfCAgYXJlDQotc28gICAgICAgICAgICAgfCAgc28NCi0NCi1zb2xjaGUgICAgICAgICB8ICBzdWNoDQotc29sY2hlbQ0KLXNvbGNoZW4NCi1zb2xjaGVyDQotc29sY2hlcw0KLQ0KLXNvbGwgICAgICAgICAgIHwgIHNoYWxsDQotc29sbHRlICAgICAgICAgfCAgc2hvdWxkDQotc29uZGVybiAgICAgICAgfCAgYnV0DQotc29uc3QgICAgICAgICAgfCAgZWxzZQ0KLcO8YmVyICAgICAgICAgICB8ICBvdmVyDQotdW0gICAgICAgICAgICAgfCAgYWJvdXQsIGFyb3VuZA0KLXVuZCAgICAgICAgICAgIHwgIGFuZA0KLQ0KLXVucyAgICAgICAgICAgIHwgIHVzDQotdW5zZQ0KLXVuc2VtDQotdW5zZW4NCi11bnNlcg0KLXVuc2VzDQotDQotdW50ZXIgICAgICAgICAgfCAgdW5kZXINCi12aWVsICAgICAgICAgICB8ICBtdWNoDQotdm9tICAgICAgICAgICAgfCAgdm9uICsgZGVtDQotdm9uICAgICAgICAgICAgfCAgZnJvbQ0KLXZvciAgICAgICAgICAgIHwgIGJlZm9yZQ0KLXfDpGhyZW5kICAgICAgICB8ICB3aGlsZQ0KLXdhciAgICAgICAgICAgIHwgIHdhcw0KLXdhcmVuICAgICAgICAgIHwgIHdlcmUNCi13YXJzdCAgICAgICAgICB8ICB3YXN0DQotd2FzICAgICAgICAgICAgfCAgd2hhdA0KLXdlZyAgICAgICAgICAgIHwgIGF3YXksIG9mZg0KLXdlaWwgICAgICAgICAgIHwgIGJlY2F1c2UNCi13ZWl0ZXIgICAgICAgICB8ICBmdXJ0aGVyDQotDQotd2VsY2hlICAgICAgICAgfCAgd2hpY2gNCi13ZWxjaGVtDQotd2VsY2hlbg0KLXdlbGNoZXINCi13ZWxjaGVzDQotDQotd2VubiAgICAgICAgICAgfCAgd2hlbg0KLXdlcmRlICAgICAgICAgIHwgIHdpbGwNCi13ZXJkZW4gICAgICAgICB8ICB3aWxsDQotd2llICAgICAgICAgICAgfCAgaG93DQotd2llZGVyICAgICAgICAgfCAgYWdhaW4NCi13aWxsICAgICAgICAgICB8ICB3YW50DQotd2lyICAgICAgICAgICAgfCAgd2UNCi13aXJkICAgICAgICAgICB8ICB3aWxsDQotd2lyc3QgICAgICAgICAgfCAgd2lsbHN0DQotd28gICAgICAgICAgICAgfCAgd2hlcmUNCi13b2xsZW4gICAgICAgICB8ICB3YW50DQotd29sbHRlICAgICAgICAgfCAgd2FudGVkDQotd8O8cmRlICAgICAgICAgIHwgIHdvdWxkDQotd8O8cmRlbiAgICAgICAgIHwgIHdvdWxkDQotenUgICAgICAgICAgICAgfCAgdG8NCi16dW0gICAgICAgICAgICB8ICB6dSArIGRlbQ0KLXp1ciAgICAgICAgICAgIHwgIHp1ICsgZGVyDQotendhciAgICAgICAgICAgfCAgaW5kZWVkDQotendpc2NoZW4gICAgICAgfCAgYmV0d2Vlbg0KLQ0KKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvZ2VybWFuL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyB8CisgfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCIKKworIHwgQSBHZXJtYW4gc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3AKKyB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKworIHwgVGhlIG51bWJlciBvZiBmb3JtcyBpbiB0aGlzIGxpc3QgaXMgcmVkdWNlZCBzaWduaWZpY2FudGx5IGJ5IHBhc3NpbmcgaXQKKyB8IHRocm91Z2ggdGhlIEdlcm1hbiBzdGVtbWVyLgorCisKK2FiZXIgICAgICAgICAgIHwgIGJ1dAorCithbGxlICAgICAgICAgICB8ICBhbGwKK2FsbGVtCithbGxlbgorYWxsZXIKK2FsbGVzCisKK2FscyAgICAgICAgICAgIHwgIHRoYW4sIGFzCithbHNvICAgICAgICAgICB8ICBzbworYW0gICAgICAgICAgICAgfCAgYW4gKyBkZW0KK2FuICAgICAgICAgICAgIHwgIGF0CisKK2FuZGVyICAgICAgICAgIHwgIG90aGVyCithbmRlcmUKK2FuZGVyZW0KK2FuZGVyZW4KK2FuZGVyZXIKK2FuZGVyZXMKK2FuZGVybQorYW5kZXJuCithbmRlcnIKK2FuZGVycworCithdWNoICAgICAgICAgICB8ICBhbHNvCithdWYgICAgICAgICAgICB8ICBvbgorYXVzICAgICAgICAgICAgfCAgb3V0IG9mCitiZWkgICAgICAgICAgICB8ICBieQorYmluICAgICAgICAgICAgfCAgYW0KK2JpcyAgICAgICAgICAgIHwgIHVudGlsCitiaXN0ICAgICAgICAgICB8ICBhcnQKK2RhICAgICAgICAgICAgIHwgIHRoZXJlCitkYW1pdCAgICAgICAgICB8ICB3aXRoIGl0CitkYW5uICAgICAgICAgICB8ICB0aGVuCisKK2RlciAgICAgICAgICAgIHwgIHRoZQorZGVuCitkZXMKK2RlbQorZGllCitkYXMKKworZGHDnyAgICAgICAgICAgIHwgIHRoYXQKKworZGVyc2VsYmUgICAgICAgfCAgdGhlIHNhbWUKK2RlcnNlbGJlbgorZGVuc2VsYmVuCitkZXNzZWxiZW4KK2RlbXNlbGJlbgorZGllc2VsYmUKK2RpZXNlbGJlbgorZGFzc2VsYmUKKworZGF6dSAgICAgICAgICAgfCAgdG8gdGhhdAorCitkZWluICAgICAgICAgICB8ICB0aHkKK2RlaW5lCitkZWluZW0KK2RlaW5lbgorZGVpbmVyCitkZWluZXMKKworZGVubiAgICAgICAgICAgfCAgYmVjYXVzZQorCitkZXJlciAgICAgICAgICB8ICBvZiB0aG9zZQorZGVzc2VuICAgICAgICAgfCAgb2YgaGltCisKK2RpY2ggICAgICAgICAgIHwgIHRoZWUKK2RpciAgICAgICAgICAgIHwgIHRvIHRoZWUKK2R1ICAgICAgICAgICAgIHwgIHRob3UKKworZGllcyAgICAgICAgICAgfCAgdGhpcworZGllc2UKK2RpZXNlbQorZGllc2VuCitkaWVzZXIKK2RpZXNlcworCisKK2RvY2ggICAgICAgICAgIHwgIChzZXZlcmFsIG1lYW5pbmdzKQorZG9ydCAgICAgICAgICAgfCAgKG92ZXIpIHRoZXJlCisKKworZHVyY2ggICAgICAgICAgfCAgdGhyb3VnaAorCitlaW4gICAgICAgICAgICB8ICBhCitlaW5lCitlaW5lbQorZWluZW4KK2VpbmVyCitlaW5lcworCitlaW5pZyAgICAgICAgICB8ICBzb21lCitlaW5pZ2UKK2VpbmlnZW0KK2VpbmlnZW4KK2VpbmlnZXIKK2VpbmlnZXMKKworZWlubWFsICAgICAgICAgfCAgb25jZQorCitlciAgICAgICAgICAgICB8ICBoZQoraWhuICAgICAgICAgICAgfCAgaGltCitpaG0gICAgICAgICAgICB8ICB0byBoaW0KKworZXMgICAgICAgICAgICAgfCAgaXQKK2V0d2FzICAgICAgICAgIHwgIHNvbWV0aGluZworCitldWVyICAgICAgICAgICB8ICB5b3VyCitldXJlCitldXJlbQorZXVyZW4KK2V1cmVyCitldXJlcworCitmw7xyICAgICAgICAgICAgfCAgZm9yCitnZWdlbiAgICAgICAgICB8ICB0b3dhcmRzCitnZXdlc2VuICAgICAgICB8ICBwLnAuIG9mIHNlaW4KK2hhYiAgICAgICAgICAgIHwgIGhhdmUKK2hhYmUgICAgICAgICAgIHwgIGhhdmUKK2hhYmVuICAgICAgICAgIHwgIGhhdmUKK2hhdCAgICAgICAgICAgIHwgIGhhcworaGF0dGUgICAgICAgICAgfCAgaGFkCitoYXR0ZW4gICAgICAgICB8ICBoYWQKK2hpZXIgICAgICAgICAgIHwgIGhlcmUKK2hpbiAgICAgICAgICAgIHwgIHRoZXJlCitoaW50ZXIgICAgICAgICB8ICBiZWhpbmQKKworaWNoICAgICAgICAgICAgfCAgSQorbWljaCAgICAgICAgICAgfCAgbWUKK21pciAgICAgICAgICAgIHwgIHRvIG1lCisKKworaWhyICAgICAgICAgICAgfCAgeW91LCB0byBoZXIKK2locmUKK2locmVtCitpaHJlbgoraWhyZXIKK2locmVzCitldWNoICAgICAgICAgICB8ICB0byB5b3UKKworaW0gICAgICAgICAgICAgfCAgaW4gKyBkZW0KK2luICAgICAgICAgICAgIHwgIGluCitpbmRlbSAgICAgICAgICB8ICB3aGlsZQoraW5zICAgICAgICAgICAgfCAgaW4gKyBkYXMKK2lzdCAgICAgICAgICAgIHwgIGlzCisKK2plZGUgICAgICAgICAgIHwgIGVhY2gsIGV2ZXJ5CitqZWRlbQoramVkZW4KK2plZGVyCitqZWRlcworCitqZW5lICAgICAgICAgICB8ICB0aGF0CitqZW5lbQoramVuZW4KK2plbmVyCitqZW5lcworCitqZXR6dCAgICAgICAgICB8ICBub3cKK2thbm4gICAgICAgICAgIHwgIGNhbgorCitrZWluICAgICAgICAgICB8ICBubwora2VpbmUKK2tlaW5lbQora2VpbmVuCitrZWluZXIKK2tlaW5lcworCitrw7ZubmVuICAgICAgICAgfCAgY2FuCitrw7ZubnRlICAgICAgICAgfCAgY291bGQKK21hY2hlbiAgICAgICAgIHwgIGRvCittYW4gICAgICAgICAgICB8ICBvbmUKKworbWFuY2hlICAgICAgICAgfCAgc29tZSwgbWFueSBhCittYW5jaGVtCittYW5jaGVuCittYW5jaGVyCittYW5jaGVzCisKK21laW4gICAgICAgICAgIHwgIG15CittZWluZQorbWVpbmVtCittZWluZW4KK21laW5lcgorbWVpbmVzCisKK21pdCAgICAgICAgICAgIHwgIHdpdGgKK211c3MgICAgICAgICAgIHwgIG11c3QKK211c3N0ZSAgICAgICAgIHwgIGhhZCB0bworbmFjaCAgICAgICAgICAgfCAgdG8od2FyZHMpCituaWNodCAgICAgICAgICB8ICBub3QKK25pY2h0cyAgICAgICAgIHwgIG5vdGhpbmcKK25vY2ggICAgICAgICAgIHwgIHN0aWxsLCB5ZXQKK251biAgICAgICAgICAgIHwgIG5vdworbnVyICAgICAgICAgICAgfCAgb25seQorb2IgICAgICAgICAgICAgfCAgd2hldGhlcgorb2RlciAgICAgICAgICAgfCAgb3IKK29obmUgICAgICAgICAgIHwgIHdpdGhvdXQKK3NlaHIgICAgICAgICAgIHwgIHZlcnkKKworc2VpbiAgICAgICAgICAgfCAgaGlzCitzZWluZQorc2VpbmVtCitzZWluZW4KK3NlaW5lcgorc2VpbmVzCisKK3NlbGJzdCAgICAgICAgIHwgIHNlbGYKK3NpY2ggICAgICAgICAgIHwgIGhlcnNlbGYKKworc2llICAgICAgICAgICAgfCAgdGhleSwgc2hlCitpaG5lbiAgICAgICAgICB8ICB0byB0aGVtCisKK3NpbmQgICAgICAgICAgIHwgIGFyZQorc28gICAgICAgICAgICAgfCAgc28KKworc29sY2hlICAgICAgICAgfCAgc3VjaAorc29sY2hlbQorc29sY2hlbgorc29sY2hlcgorc29sY2hlcworCitzb2xsICAgICAgICAgICB8ICBzaGFsbAorc29sbHRlICAgICAgICAgfCAgc2hvdWxkCitzb25kZXJuICAgICAgICB8ICBidXQKK3NvbnN0ICAgICAgICAgIHwgIGVsc2UKK8O8YmVyICAgICAgICAgICB8ICBvdmVyCit1bSAgICAgICAgICAgICB8ICBhYm91dCwgYXJvdW5kCit1bmQgICAgICAgICAgICB8ICBhbmQKKwordW5zICAgICAgICAgICAgfCAgdXMKK3Vuc2UKK3Vuc2VtCit1bnNlbgordW5zZXIKK3Vuc2VzCisKK3VudGVyICAgICAgICAgIHwgIHVuZGVyCit2aWVsICAgICAgICAgICB8ICBtdWNoCit2b20gICAgICAgICAgICB8ICB2b24gKyBkZW0KK3ZvbiAgICAgICAgICAgIHwgIGZyb20KK3ZvciAgICAgICAgICAgIHwgIGJlZm9yZQord8OkaHJlbmQgICAgICAgIHwgIHdoaWxlCit3YXIgICAgICAgICAgICB8ICB3YXMKK3dhcmVuICAgICAgICAgIHwgIHdlcmUKK3dhcnN0ICAgICAgICAgIHwgIHdhc3QKK3dhcyAgICAgICAgICAgIHwgIHdoYXQKK3dlZyAgICAgICAgICAgIHwgIGF3YXksIG9mZgord2VpbCAgICAgICAgICAgfCAgYmVjYXVzZQord2VpdGVyICAgICAgICAgfCAgZnVydGhlcgorCit3ZWxjaGUgICAgICAgICB8ICB3aGljaAord2VsY2hlbQord2VsY2hlbgord2VsY2hlcgord2VsY2hlcworCit3ZW5uICAgICAgICAgICB8ICB3aGVuCit3ZXJkZSAgICAgICAgICB8ICB3aWxsCit3ZXJkZW4gICAgICAgICB8ICB3aWxsCit3aWUgICAgICAgICAgICB8ICBob3cKK3dpZWRlciAgICAgICAgIHwgIGFnYWluCit3aWxsICAgICAgICAgICB8ICB3YW50Cit3aXIgICAgICAgICAgICB8ICB3ZQord2lyZCAgICAgICAgICAgfCAgd2lsbAord2lyc3QgICAgICAgICAgfCAgd2lsbHN0Cit3byAgICAgICAgICAgICB8ICB3aGVyZQord29sbGVuICAgICAgICAgfCAgd2FudAord29sbHRlICAgICAgICAgfCAgd2FudGVkCit3w7xyZGUgICAgICAgICAgfCAgd291bGQKK3fDvHJkZW4gICAgICAgICB8ICB3b3VsZAorenUgICAgICAgICAgICAgfCAgdG8KK3p1bSAgICAgICAgICAgIHwgIHp1ICsgZGVtCit6dXIgICAgICAgICAgICB8ICB6dSArIGRlcgorendhciAgICAgICAgICAgfCAgaW5kZWVkCit6d2lzY2hlbiAgICAgICB8ICBiZXR3ZWVuCisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZWwudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19lbC50eHQKaW5kZXggYTVhYmZiZS4uMjMyNjgxZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19lbC50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19lbC50eHQKQEAgLTEsNzggKzEsNzggQEAKLSMgTHVjZW5lIEdyZWVrIFN0b3B3b3JkcyBsaXN0DQotIyBOb3RlOiBieSBkZWZhdWx0IHRoaXMgZmlsZSBpcyB1c2VkIGFmdGVyIEdyZWVrTG93ZXJDYXNlRmlsdGVyLA0KLSMgc28gd2hlbiBtb2RpZnlpbmcgdGhpcyBmaWxlIHVzZSAnz4MnIGluc3RlYWQgb2YgJ8+CJyANCi3Ovw0KLc63DQotz4TOvw0KLc6/zrkNCi3PhM6xDQotz4TOv8+FDQotz4TOt8+DDQotz4TPic69DQotz4TOv869DQotz4TOt869DQotzrrOsc65IA0KLc66zrkNCi3Oug0KLc61zrnOvM6xzrkNCi3Otc65z4POsc65DQotzrXOuc69zrHOuQ0KLc61zrnOvM6xz4PPhM61DQotzrXOuc+Dz4TOtQ0KLc+Dz4TOvw0KLc+Dz4TOv869DQotz4PPhM63DQotz4PPhM63zr0NCi3OvM6xDQotzrHOu867zrENCi3Osc+Azr8NCi3Os865zrENCi3PgM+Bzr/Pgw0KLc68zrUNCi3Pg861DQotz4nPgw0KLc+AzrHPgc6xDQotzrHOvc+EzrkNCi3Ous6xz4TOsQ0KLc68zrXPhM6xDQotzrjOsQ0KLc69zrENCi3OtM61DQotzrTOtc69DQotzrzOtw0KLc68zrfOvQ0KLc61z4DOuQ0KLc61zr3PiQ0KLc61zrHOvQ0KLc6xzr0NCi3PhM6/z4TOtQ0KLc+Azr/PhQ0KLc+Az4nPgw0KLc+Azr/Ouc6/z4MNCi3PgM6/zrnOsQ0KLc+Azr/Ouc6/DQotz4DOv865zr/OuQ0KLc+Azr/Ouc61z4MNCi3PgM6/zrnPic69DQotz4DOv865zr/Phc+DDQotzrHPhc+Ezr/Pgw0KLc6xz4XPhM63DQotzrHPhc+Ezr8NCi3Osc+Fz4TOv865DQotzrHPhc+Ez4nOvQ0KLc6xz4XPhM6/z4XPgw0KLc6xz4XPhM61z4MNCi3Osc+Fz4TOsQ0KLc61zrrOtc65zr3Ov8+DDQotzrXOus61zrnOvc63DQotzrXOus61zrnOvc6/DQotzrXOus61zrnOvc6/zrkNCi3Otc66zrXOuc69zrXPgw0KLc61zrrOtc65zr3OsQ0KLc61zrrOtc65zr3Pic69DQotzrXOus61zrnOvc6/z4XPgw0KLc6/z4DPic+DDQotzr/OvM+Jz4MNCi3Ouc+Dz4nPgw0KLc6/z4POvw0KLc6/z4TOuQ0KKyMgTHVjZW5lIEdyZWVrIFN0b3B3b3JkcyBsaXN0CisjIE5vdGU6IGJ5IGRlZmF1bHQgdGhpcyBmaWxlIGlzIHVzZWQgYWZ0ZXIgR3JlZWtMb3dlckNhc2VGaWx0ZXIsCisjIHNvIHdoZW4gbW9kaWZ5aW5nIHRoaXMgZmlsZSB1c2UgJ8+DJyBpbnN0ZWFkIG9mICfPgicgCivOvworzrcKK8+Ezr8KK86/zrkKK8+EzrEKK8+Ezr/PhQorz4TOt8+DCivPhM+Jzr0KK8+Ezr/OvQorz4TOt869CivOus6xzrkgCivOus65CivOugorzrXOuc68zrHOuQorzrXOuc+DzrHOuQorzrXOuc69zrHOuQorzrXOuc68zrHPg8+EzrUKK861zrnPg8+EzrUKK8+Dz4TOvworz4PPhM6/zr0KK8+Dz4TOtworz4PPhM63zr0KK868zrEKK86xzrvOu86xCivOsc+Azr8KK86zzrnOsQorz4DPgc6/z4MKK868zrUKK8+DzrUKK8+Jz4MKK8+AzrHPgc6xCivOsc69z4TOuQorzrrOsc+EzrEKK868zrXPhM6xCivOuM6xCivOvc6xCivOtM61CivOtM61zr0KK868zrcKK868zrfOvQorzrXPgM65CivOtc69z4kKK861zrHOvQorzrHOvQorz4TOv8+EzrUKK8+Azr/PhQorz4DPic+DCivPgM6/zrnOv8+DCivPgM6/zrnOsQorz4DOv865zr8KK8+Azr/Ouc6/zrkKK8+Azr/Ouc61z4MKK8+Azr/Ouc+Jzr0KK8+Azr/Ouc6/z4XPgworzrHPhc+Ezr/PgworzrHPhc+EzrcKK86xz4XPhM6/CivOsc+Fz4TOv865CivOsc+Fz4TPic69CivOsc+Fz4TOv8+Fz4MKK86xz4XPhM61z4MKK86xz4XPhM6xCivOtc66zrXOuc69zr/PgworzrXOus61zrnOvc63CivOtc66zrXOuc69zr8KK861zrrOtc65zr3Ov865CivOtc66zrXOuc69zrXPgworzrXOus61zrnOvc6xCivOtc66zrXOuc69z4nOvQorzrXOus61zrnOvc6/z4XPgworzr/PgM+Jz4MKK86/zrzPic+DCivOuc+Dz4nPgworzr/Pg86/CivOv8+EzrkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZW4udHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19lbi50eHQKaW5kZXggMjI0MjMwYy4uMmMxNjRjMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19lbi50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19lbi50eHQKQEAgLTEsNTQgKzEsNTQgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotIyBhIGNvdXBsZSBvZiB0ZXN0IHN0b3B3b3JkcyB0byB0ZXN0IHRoYXQgdGhlIHdvcmRzIGFyZSByZWFsbHkgYmVpbmcNCi0jIGNvbmZpZ3VyZWQgZnJvbSB0aGlzIGZpbGU6DQotc3RvcHdvcmRhDQotc3RvcHdvcmRiDQotDQotIyBTdGFuZGFyZCBlbmdsaXNoIHN0b3Agd29yZHMgdGFrZW4gZnJvbSBMdWNlbmUncyBTdG9wQW5hbHl6ZXINCi1hDQotYW4NCi1hbmQNCi1hcmUNCi1hcw0KLWF0DQotYmUNCi1idXQNCi1ieQ0KLWZvcg0KLWlmDQotaW4NCi1pbnRvDQotaXMNCi1pdA0KLW5vDQotbm90DQotb2YNCi1vbg0KLW9yDQotc3VjaA0KLXRoYXQNCi10aGUNCi10aGVpcg0KLXRoZW4NCi10aGVyZQ0KLXRoZXNlDQotdGhleQ0KLXRoaXMNCi10bw0KLXdhcw0KLXdpbGwNCi13aXRoDQorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIGEgY291cGxlIG9mIHRlc3Qgc3RvcHdvcmRzIHRvIHRlc3QgdGhhdCB0aGUgd29yZHMgYXJlIHJlYWxseSBiZWluZworIyBjb25maWd1cmVkIGZyb20gdGhpcyBmaWxlOgorc3RvcHdvcmRhCitzdG9wd29yZGIKKworIyBTdGFuZGFyZCBlbmdsaXNoIHN0b3Agd29yZHMgdGFrZW4gZnJvbSBMdWNlbmUncyBTdG9wQW5hbHl6ZXIKK2EKK2FuCithbmQKK2FyZQorYXMKK2F0CitiZQorYnV0CitieQorZm9yCitpZgoraW4KK2ludG8KK2lzCitpdAorbm8KK25vdAorb2YKK29uCitvcgorc3VjaAordGhhdAordGhlCit0aGVpcgordGhlbgordGhlcmUKK3RoZXNlCit0aGV5Cit0aGlzCit0bword2FzCit3aWxsCit3aXRoCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2VzLnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZXMudHh0CmluZGV4IDk5YWZkOTMuLjQ4N2Q3OGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZXMudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZXMudHh0CkBAIC0xLDM1NiArMSwzNTYgQEAKLSB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvc3BhbmlzaC9zdG9wLnR4dA0KLSB8IFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuDQotIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHANCi0gfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwNCi0gfCAgLSBFbmNvZGluZyB3YXMgY29udmVydGVkIHRvIFVURi04Lg0KLSB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4NCi0gfA0KLSB8IE5PVEU6IFRvIHVzZSB0aGlzIGZpbGUgd2l0aCBTdG9wRmlsdGVyRmFjdG9yeSwgeW91IG11c3Qgc3BlY2lmeSBmb3JtYXQ9InNub3diYWxsIg0KLQ0KLSB8IEEgU3BhbmlzaCBzdG9wIHdvcmQgbGlzdC4gQ29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIEVhY2ggc3RvcA0KLSB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4NCi0NCi0NCi0gfCBUaGUgZm9sbG93aW5nIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3Jkcw0KLSB8IGRlcml2aW5nIGZyb20gYSBsYXJnZSBzYW1wbGUgb2YgdGV4dC4NCi0NCi0gfCBFeHRyYSB3b3JkcyBoYXZlIGJlZW4gYWRkZWQgYXQgdGhlIGVuZC4NCi0NCi1kZSAgICAgICAgICAgICB8ICBmcm9tLCBvZg0KLWxhICAgICAgICAgICAgIHwgIHRoZSwgaGVyDQotcXVlICAgICAgICAgICAgfCAgd2hvLCB0aGF0DQotZWwgICAgICAgICAgICAgfCAgdGhlDQotZW4gICAgICAgICAgICAgfCAgaW4NCi15ICAgICAgICAgICAgICB8ICBhbmQNCi1hICAgICAgICAgICAgICB8ICB0bw0KLWxvcyAgICAgICAgICAgIHwgIHRoZSwgdGhlbQ0KLWRlbCAgICAgICAgICAgIHwgIGRlICsgZWwNCi1zZSAgICAgICAgICAgICB8ICBoaW1zZWxmLCBmcm9tIGhpbSBldGMNCi1sYXMgICAgICAgICAgICB8ICB0aGUsIHRoZW0NCi1wb3IgICAgICAgICAgICB8ICBmb3IsIGJ5LCBldGMNCi11biAgICAgICAgICAgICB8ICBhDQotcGFyYSAgICAgICAgICAgfCAgZm9yDQotY29uICAgICAgICAgICAgfCAgd2l0aA0KLW5vICAgICAgICAgICAgIHwgIG5vDQotdW5hICAgICAgICAgICAgfCAgYQ0KLXN1ICAgICAgICAgICAgIHwgIGhpcywgaGVyDQotYWwgICAgICAgICAgICAgfCAgYSArIGVsDQotICB8IGVzICAgICAgICAgZnJvbSBTRVINCi1sbyAgICAgICAgICAgICB8ICBoaW0NCi1jb21vICAgICAgICAgICB8ICBob3cNCi1tw6FzICAgICAgICAgICAgfCAgbW9yZQ0KLXBlcm8gICAgICAgICAgIHwgIHBlcm8NCi1zdXMgICAgICAgICAgICB8ICBzdSBwbHVyYWwNCi1sZSAgICAgICAgICAgICB8ICB0byBoaW0sIGhlcg0KLXlhICAgICAgICAgICAgIHwgIGFscmVhZHkNCi1vICAgICAgICAgICAgICB8ICBvcg0KLSAgfCBmdWUgICAgICAgIGZyb20gU0VSDQotZXN0ZSAgICAgICAgICAgfCAgdGhpcw0KLSAgfCBoYSAgICAgICAgIGZyb20gSEFCRVINCi1zw60gICAgICAgICAgICAgfCAgaGltc2VsZiBldGMNCi1wb3JxdWUgICAgICAgICB8ICBiZWNhdXNlDQotZXN0YSAgICAgICAgICAgfCAgdGhpcw0KLSAgfCBzb24gICAgICAgIGZyb20gU0VSDQotZW50cmUgICAgICAgICAgfCAgYmV0d2Vlbg0KLSAgfCBlc3TDoSAgICAgZnJvbSBFU1RBUg0KLWN1YW5kbyAgICAgICAgIHwgIHdoZW4NCi1tdXkgICAgICAgICAgICB8ICB2ZXJ5DQotc2luICAgICAgICAgICAgfCAgd2l0aG91dA0KLXNvYnJlICAgICAgICAgIHwgIG9uDQotICB8IHNlciAgICAgICAgZnJvbSBTRVINCi0gIHwgdGllbmUgICAgICBmcm9tIFRFTkVSDQotdGFtYmnDqW4gICAgICAgIHwgIGFsc28NCi1tZSAgICAgICAgICAgICB8ICBtZQ0KLWhhc3RhICAgICAgICAgIHwgIHVudGlsDQotaGF5ICAgICAgICAgICAgfCAgdGhlcmUgaXMvYXJlDQotZG9uZGUgICAgICAgICAgfCAgd2hlcmUNCi0gIHwgaGFuICAgICAgICBmcm9tIEhBQkVSDQotcXVpZW4gICAgICAgICAgfCAgd2hvbSwgdGhhdA0KLSAgfCBlc3TDoW4gICAgICBmcm9tIEVTVEFSDQotICB8IGVzdGFkbyAgICAgZnJvbSBFU1RBUg0KLWRlc2RlICAgICAgICAgIHwgIGZyb20NCi10b2RvICAgICAgICAgICB8ICBhbGwNCi1ub3MgICAgICAgICAgICB8ICB1cw0KLWR1cmFudGUgICAgICAgIHwgIGR1cmluZw0KLSAgfCBlc3RhZG9zICAgIGZyb20gRVNUQVINCi10b2RvcyAgICAgICAgICB8ICBhbGwNCi11bm8gICAgICAgICAgICB8ICBhDQotbGVzICAgICAgICAgICAgfCAgdG8gdGhlbQ0KLW5pICAgICAgICAgICAgIHwgIG5vcg0KLWNvbnRyYSAgICAgICAgIHwgIGFnYWluc3QNCi1vdHJvcyAgICAgICAgICB8ICBvdGhlcg0KLSAgfCBmdWVyb24gICAgIGZyb20gU0VSDQotZXNlICAgICAgICAgICAgfCAgdGhhdA0KLWVzbyAgICAgICAgICAgIHwgIHRoYXQNCi0gIHwgaGFiw61hICAgICAgZnJvbSBIQUJFUg0KLWFudGUgICAgICAgICAgIHwgIGJlZm9yZQ0KLWVsbG9zICAgICAgICAgIHwgIHRoZXkNCi1lICAgICAgICAgICAgICB8ICBhbmQgKHZhcmlhbnQgb2YgeSkNCi1lc3RvICAgICAgICAgICB8ICB0aGlzDQotbcOtICAgICAgICAgICAgIHwgIG1lDQotYW50ZXMgICAgICAgICAgfCAgYmVmb3JlDQotYWxndW5vcyAgICAgICAgfCAgc29tZQ0KLXF1w6kgICAgICAgICAgICB8ICB3aGF0Pw0KLXVub3MgICAgICAgICAgIHwgIGENCi15byAgICAgICAgICAgICB8ICBJDQotb3RybyAgICAgICAgICAgfCAgb3RoZXINCi1vdHJhcyAgICAgICAgICB8ICBvdGhlcg0KLW90cmEgICAgICAgICAgIHwgIG90aGVyDQotw6lsICAgICAgICAgICAgIHwgIGhlDQotdGFudG8gICAgICAgICAgfCAgc28gbXVjaCwgbWFueQ0KLWVzYSAgICAgICAgICAgIHwgIHRoYXQNCi1lc3RvcyAgICAgICAgICB8ICB0aGVzZQ0KLW11Y2hvICAgICAgICAgIHwgIG11Y2gsIG1hbnkNCi1xdWllbmVzICAgICAgICB8ICB3aG8NCi1uYWRhICAgICAgICAgICB8ICBub3RoaW5nDQotbXVjaG9zICAgICAgICAgfCAgbWFueQ0KLWN1YWwgICAgICAgICAgIHwgIHdobw0KLSAgfCBzZWEgICAgICAgIGZyb20gU0VSDQotcG9jbyAgICAgICAgICAgfCAgZmV3DQotZWxsYSAgICAgICAgICAgfCAgc2hlDQotZXN0YXIgICAgICAgICAgfCAgdG8gYmUNCi0gIHwgaGFiZXIgICAgICBmcm9tIEhBQkVSDQotZXN0YXMgICAgICAgICAgfCAgdGhlc2UNCi0gIHwgZXN0YWJhICAgICBmcm9tIEVTVEFSDQotICB8IGVzdGFtb3MgICAgZnJvbSBFU1RBUg0KLWFsZ3VuYXMgICAgICAgIHwgIHNvbWUNCi1hbGdvICAgICAgICAgICB8ICBzb21ldGhpbmcNCi1ub3NvdHJvcyAgICAgICB8ICB3ZQ0KLQ0KLSAgICAgIHwgb3RoZXIgZm9ybXMNCi0NCi1taSAgICAgICAgICAgICB8ICBtZQ0KLW1pcyAgICAgICAgICAgIHwgIG1pIHBsdXJhbA0KLXTDuiAgICAgICAgICAgICB8ICB0aG91DQotdGUgICAgICAgICAgICAgfCAgdGhlZQ0KLXRpICAgICAgICAgICAgIHwgIHRoZWUNCi10dSAgICAgICAgICAgICB8ICB0aHkNCi10dXMgICAgICAgICAgICB8ICB0dSBwbHVyYWwNCi1lbGxhcyAgICAgICAgICB8ICB0aGV5DQotbm9zb3RyYXMgICAgICAgfCAgd2UNCi12b3NvdHJvcyAgICAgICB8ICB5b3UNCi12b3NvdHJhcyAgICAgICB8ICB5b3UNCi1vcyAgICAgICAgICAgICB8ICB5b3UNCi1tw61vICAgICAgICAgICAgfCAgbWluZQ0KLW3DrWEgICAgICAgICAgICB8DQotbcOtb3MgICAgICAgICAgIHwNCi1tw61hcyAgICAgICAgICAgfA0KLXR1eW8gICAgICAgICAgIHwgIHRoaW5lDQotdHV5YSAgICAgICAgICAgfA0KLXR1eW9zICAgICAgICAgIHwNCi10dXlhcyAgICAgICAgICB8DQotc3V5byAgICAgICAgICAgfCAgaGlzLCBoZXJzLCB0aGVpcnMNCi1zdXlhICAgICAgICAgICB8DQotc3V5b3MgICAgICAgICAgfA0KLXN1eWFzICAgICAgICAgIHwNCi1udWVzdHJvICAgICAgICB8ICBvdXJzDQotbnVlc3RyYSAgICAgICAgfA0KLW51ZXN0cm9zICAgICAgIHwNCi1udWVzdHJhcyAgICAgICB8DQotdnVlc3RybyAgICAgICAgfCAgeW91cnMNCi12dWVzdHJhICAgICAgICB8DQotdnVlc3Ryb3MgICAgICAgfA0KLXZ1ZXN0cmFzICAgICAgIHwNCi1lc29zICAgICAgICAgICB8ICB0aG9zZQ0KLWVzYXMgICAgICAgICAgIHwgIHRob3NlDQotDQotICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBlc3RhciwgdG8gYmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOg0KLWVzdG95DQotZXN0w6FzDQotZXN0w6ENCi1lc3RhbW9zDQotZXN0w6Fpcw0KLWVzdMOhbg0KLWVzdMOpDQotZXN0w6lzDQotZXN0ZW1vcw0KLWVzdMOpaXMNCi1lc3TDqW4NCi1lc3RhcsOpDQotZXN0YXLDoXMNCi1lc3RhcsOhDQotZXN0YXJlbW9zDQotZXN0YXLDqWlzDQotZXN0YXLDoW4NCi1lc3RhcsOtYQ0KLWVzdGFyw61hcw0KLWVzdGFyw61hbW9zDQotZXN0YXLDrWFpcw0KLWVzdGFyw61hbg0KLWVzdGFiYQ0KLWVzdGFiYXMNCi1lc3TDoWJhbW9zDQotZXN0YWJhaXMNCi1lc3RhYmFuDQotZXN0dXZlDQotZXN0dXZpc3RlDQotZXN0dXZvDQotZXN0dXZpbW9zDQotZXN0dXZpc3RlaXMNCi1lc3R1dmllcm9uDQotZXN0dXZpZXJhDQotZXN0dXZpZXJhcw0KLWVzdHV2acOpcmFtb3MNCi1lc3R1dmllcmFpcw0KLWVzdHV2aWVyYW4NCi1lc3R1dmllc2UNCi1lc3R1dmllc2VzDQotZXN0dXZpw6lzZW1vcw0KLWVzdHV2aWVzZWlzDQotZXN0dXZpZXNlbg0KLWVzdGFuZG8NCi1lc3RhZG8NCi1lc3RhZGENCi1lc3RhZG9zDQotZXN0YWRhcw0KLWVzdGFkDQotDQotICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBoYWJlciwgdG8gaGF2ZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6DQotaGUNCi1oYXMNCi1oYQ0KLWhlbW9zDQotaGFiw6lpcw0KLWhhbg0KLWhheWENCi1oYXlhcw0KLWhheWFtb3MNCi1oYXnDoWlzDQotaGF5YW4NCi1oYWJyw6kNCi1oYWJyw6FzDQotaGFicsOhDQotaGFicmVtb3MNCi1oYWJyw6lpcw0KLWhhYnLDoW4NCi1oYWJyw61hDQotaGFicsOtYXMNCi1oYWJyw61hbW9zDQotaGFicsOtYWlzDQotaGFicsOtYW4NCi1oYWLDrWENCi1oYWLDrWFzDQotaGFiw61hbW9zDQotaGFiw61haXMNCi1oYWLDrWFuDQotaHViZQ0KLWh1YmlzdGUNCi1odWJvDQotaHViaW1vcw0KLWh1YmlzdGVpcw0KLWh1Ymllcm9uDQotaHViaWVyYQ0KLWh1YmllcmFzDQotaHViacOpcmFtb3MNCi1odWJpZXJhaXMNCi1odWJpZXJhbg0KLWh1Ymllc2UNCi1odWJpZXNlcw0KLWh1YmnDqXNlbW9zDQotaHViaWVzZWlzDQotaHViaWVzZW4NCi1oYWJpZW5kbw0KLWhhYmlkbw0KLWhhYmlkYQ0KLWhhYmlkb3MNCi1oYWJpZGFzDQotDQotICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBzZXIsIHRvIGJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToNCi1zb3kNCi1lcmVzDQotZXMNCi1zb21vcw0KLXNvaXMNCi1zb24NCi1zZWENCi1zZWFzDQotc2VhbW9zDQotc2XDoWlzDQotc2Vhbg0KLXNlcsOpDQotc2Vyw6FzDQotc2Vyw6ENCi1zZXJlbW9zDQotc2Vyw6lpcw0KLXNlcsOhbg0KLXNlcsOtYQ0KLXNlcsOtYXMNCi1zZXLDrWFtb3MNCi1zZXLDrWFpcw0KLXNlcsOtYW4NCi1lcmENCi1lcmFzDQotw6lyYW1vcw0KLWVyYWlzDQotZXJhbg0KLWZ1aQ0KLWZ1aXN0ZQ0KLWZ1ZQ0KLWZ1aW1vcw0KLWZ1aXN0ZWlzDQotZnVlcm9uDQotZnVlcmENCi1mdWVyYXMNCi1mdcOpcmFtb3MNCi1mdWVyYWlzDQotZnVlcmFuDQotZnVlc2UNCi1mdWVzZXMNCi1mdcOpc2Vtb3MNCi1mdWVzZWlzDQotZnVlc2VuDQotc2llbmRvDQotc2lkbw0KLSAgfCAgc2VkIGFsc28gbWVhbnMgJ3RoaXJzdCcNCi0NCi0gICAgICAgICAgICAgICB8IGZvcm1zIG9mIHRlbmVyLCB0byBoYXZlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToNCi10ZW5nbw0KLXRpZW5lcw0KLXRpZW5lDQotdGVuZW1vcw0KLXRlbsOpaXMNCi10aWVuZW4NCi10ZW5nYQ0KLXRlbmdhcw0KLXRlbmdhbW9zDQotdGVuZ8OhaXMNCi10ZW5nYW4NCi10ZW5kcsOpDQotdGVuZHLDoXMNCi10ZW5kcsOhDQotdGVuZHJlbW9zDQotdGVuZHLDqWlzDQotdGVuZHLDoW4NCi10ZW5kcsOtYQ0KLXRlbmRyw61hcw0KLXRlbmRyw61hbW9zDQotdGVuZHLDrWFpcw0KLXRlbmRyw61hbg0KLXRlbsOtYQ0KLXRlbsOtYXMNCi10ZW7DrWFtb3MNCi10ZW7DrWFpcw0KLXRlbsOtYW4NCi10dXZlDQotdHV2aXN0ZQ0KLXR1dm8NCi10dXZpbW9zDQotdHV2aXN0ZWlzDQotdHV2aWVyb24NCi10dXZpZXJhDQotdHV2aWVyYXMNCi10dXZpw6lyYW1vcw0KLXR1dmllcmFpcw0KLXR1dmllcmFuDQotdHV2aWVzZQ0KLXR1dmllc2VzDQotdHV2acOpc2Vtb3MNCi10dXZpZXNlaXMNCi10dXZpZXNlbg0KLXRlbmllbmRvDQotdGVuaWRvDQotdGVuaWRhDQotdGVuaWRvcw0KLXRlbmlkYXMNCi10ZW5lZA0KLQ0KKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvc3BhbmlzaC9zdG9wLnR4dAorIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KKyB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwCisgfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKKyB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguCisgfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuCisgfAorIHwgTk9URTogVG8gdXNlIHRoaXMgZmlsZSB3aXRoIFN0b3BGaWx0ZXJGYWN0b3J5LCB5b3UgbXVzdCBzcGVjaWZ5IGZvcm1hdD0ic25vd2JhbGwiCisKKyB8IEEgU3BhbmlzaCBzdG9wIHdvcmQgbGlzdC4gQ29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIEVhY2ggc3RvcAorIHwgd29yZCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorCisKKyB8IFRoZSBmb2xsb3dpbmcgaXMgYSByYW5rZWQgbGlzdCAoY29tbW9uZXN0IHRvIHJhcmVzdCkgb2Ygc3RvcHdvcmRzCisgfCBkZXJpdmluZyBmcm9tIGEgbGFyZ2Ugc2FtcGxlIG9mIHRleHQuCisKKyB8IEV4dHJhIHdvcmRzIGhhdmUgYmVlbiBhZGRlZCBhdCB0aGUgZW5kLgorCitkZSAgICAgICAgICAgICB8ICBmcm9tLCBvZgorbGEgICAgICAgICAgICAgfCAgdGhlLCBoZXIKK3F1ZSAgICAgICAgICAgIHwgIHdobywgdGhhdAorZWwgICAgICAgICAgICAgfCAgdGhlCitlbiAgICAgICAgICAgICB8ICBpbgoreSAgICAgICAgICAgICAgfCAgYW5kCithICAgICAgICAgICAgICB8ICB0bworbG9zICAgICAgICAgICAgfCAgdGhlLCB0aGVtCitkZWwgICAgICAgICAgICB8ICBkZSArIGVsCitzZSAgICAgICAgICAgICB8ICBoaW1zZWxmLCBmcm9tIGhpbSBldGMKK2xhcyAgICAgICAgICAgIHwgIHRoZSwgdGhlbQorcG9yICAgICAgICAgICAgfCAgZm9yLCBieSwgZXRjCit1biAgICAgICAgICAgICB8ICBhCitwYXJhICAgICAgICAgICB8ICBmb3IKK2NvbiAgICAgICAgICAgIHwgIHdpdGgKK25vICAgICAgICAgICAgIHwgIG5vCit1bmEgICAgICAgICAgICB8ICBhCitzdSAgICAgICAgICAgICB8ICBoaXMsIGhlcgorYWwgICAgICAgICAgICAgfCAgYSArIGVsCisgIHwgZXMgICAgICAgICBmcm9tIFNFUgorbG8gICAgICAgICAgICAgfCAgaGltCitjb21vICAgICAgICAgICB8ICBob3cKK23DoXMgICAgICAgICAgICB8ICBtb3JlCitwZXJvICAgICAgICAgICB8ICBwZXJvCitzdXMgICAgICAgICAgICB8ICBzdSBwbHVyYWwKK2xlICAgICAgICAgICAgIHwgIHRvIGhpbSwgaGVyCit5YSAgICAgICAgICAgICB8ICBhbHJlYWR5CitvICAgICAgICAgICAgICB8ICBvcgorICB8IGZ1ZSAgICAgICAgZnJvbSBTRVIKK2VzdGUgICAgICAgICAgIHwgIHRoaXMKKyAgfCBoYSAgICAgICAgIGZyb20gSEFCRVIKK3PDrSAgICAgICAgICAgICB8ICBoaW1zZWxmIGV0YworcG9ycXVlICAgICAgICAgfCAgYmVjYXVzZQorZXN0YSAgICAgICAgICAgfCAgdGhpcworICB8IHNvbiAgICAgICAgZnJvbSBTRVIKK2VudHJlICAgICAgICAgIHwgIGJldHdlZW4KKyAgfCBlc3TDoSAgICAgZnJvbSBFU1RBUgorY3VhbmRvICAgICAgICAgfCAgd2hlbgorbXV5ICAgICAgICAgICAgfCAgdmVyeQorc2luICAgICAgICAgICAgfCAgd2l0aG91dAorc29icmUgICAgICAgICAgfCAgb24KKyAgfCBzZXIgICAgICAgIGZyb20gU0VSCisgIHwgdGllbmUgICAgICBmcm9tIFRFTkVSCit0YW1iacOpbiAgICAgICAgfCAgYWxzbworbWUgICAgICAgICAgICAgfCAgbWUKK2hhc3RhICAgICAgICAgIHwgIHVudGlsCitoYXkgICAgICAgICAgICB8ICB0aGVyZSBpcy9hcmUKK2RvbmRlICAgICAgICAgIHwgIHdoZXJlCisgIHwgaGFuICAgICAgICBmcm9tIEhBQkVSCitxdWllbiAgICAgICAgICB8ICB3aG9tLCB0aGF0CisgIHwgZXN0w6FuICAgICAgZnJvbSBFU1RBUgorICB8IGVzdGFkbyAgICAgZnJvbSBFU1RBUgorZGVzZGUgICAgICAgICAgfCAgZnJvbQordG9kbyAgICAgICAgICAgfCAgYWxsCitub3MgICAgICAgICAgICB8ICB1cworZHVyYW50ZSAgICAgICAgfCAgZHVyaW5nCisgIHwgZXN0YWRvcyAgICBmcm9tIEVTVEFSCit0b2RvcyAgICAgICAgICB8ICBhbGwKK3VubyAgICAgICAgICAgIHwgIGEKK2xlcyAgICAgICAgICAgIHwgIHRvIHRoZW0KK25pICAgICAgICAgICAgIHwgIG5vcgorY29udHJhICAgICAgICAgfCAgYWdhaW5zdAorb3Ryb3MgICAgICAgICAgfCAgb3RoZXIKKyAgfCBmdWVyb24gICAgIGZyb20gU0VSCitlc2UgICAgICAgICAgICB8ICB0aGF0Citlc28gICAgICAgICAgICB8ICB0aGF0CisgIHwgaGFiw61hICAgICAgZnJvbSBIQUJFUgorYW50ZSAgICAgICAgICAgfCAgYmVmb3JlCitlbGxvcyAgICAgICAgICB8ICB0aGV5CitlICAgICAgICAgICAgICB8ICBhbmQgKHZhcmlhbnQgb2YgeSkKK2VzdG8gICAgICAgICAgIHwgIHRoaXMKK23DrSAgICAgICAgICAgICB8ICBtZQorYW50ZXMgICAgICAgICAgfCAgYmVmb3JlCithbGd1bm9zICAgICAgICB8ICBzb21lCitxdcOpICAgICAgICAgICAgfCAgd2hhdD8KK3Vub3MgICAgICAgICAgIHwgIGEKK3lvICAgICAgICAgICAgIHwgIEkKK290cm8gICAgICAgICAgIHwgIG90aGVyCitvdHJhcyAgICAgICAgICB8ICBvdGhlcgorb3RyYSAgICAgICAgICAgfCAgb3RoZXIKK8OpbCAgICAgICAgICAgICB8ICBoZQordGFudG8gICAgICAgICAgfCAgc28gbXVjaCwgbWFueQorZXNhICAgICAgICAgICAgfCAgdGhhdAorZXN0b3MgICAgICAgICAgfCAgdGhlc2UKK211Y2hvICAgICAgICAgIHwgIG11Y2gsIG1hbnkKK3F1aWVuZXMgICAgICAgIHwgIHdobworbmFkYSAgICAgICAgICAgfCAgbm90aGluZworbXVjaG9zICAgICAgICAgfCAgbWFueQorY3VhbCAgICAgICAgICAgfCAgd2hvCisgIHwgc2VhICAgICAgICBmcm9tIFNFUgorcG9jbyAgICAgICAgICAgfCAgZmV3CitlbGxhICAgICAgICAgICB8ICBzaGUKK2VzdGFyICAgICAgICAgIHwgIHRvIGJlCisgIHwgaGFiZXIgICAgICBmcm9tIEhBQkVSCitlc3RhcyAgICAgICAgICB8ICB0aGVzZQorICB8IGVzdGFiYSAgICAgZnJvbSBFU1RBUgorICB8IGVzdGFtb3MgICAgZnJvbSBFU1RBUgorYWxndW5hcyAgICAgICAgfCAgc29tZQorYWxnbyAgICAgICAgICAgfCAgc29tZXRoaW5nCitub3NvdHJvcyAgICAgICB8ICB3ZQorCisgICAgICB8IG90aGVyIGZvcm1zCisKK21pICAgICAgICAgICAgIHwgIG1lCittaXMgICAgICAgICAgICB8ICBtaSBwbHVyYWwKK3TDuiAgICAgICAgICAgICB8ICB0aG91Cit0ZSAgICAgICAgICAgICB8ICB0aGVlCit0aSAgICAgICAgICAgICB8ICB0aGVlCit0dSAgICAgICAgICAgICB8ICB0aHkKK3R1cyAgICAgICAgICAgIHwgIHR1IHBsdXJhbAorZWxsYXMgICAgICAgICAgfCAgdGhleQorbm9zb3RyYXMgICAgICAgfCAgd2UKK3Zvc290cm9zICAgICAgIHwgIHlvdQordm9zb3RyYXMgICAgICAgfCAgeW91CitvcyAgICAgICAgICAgICB8ICB5b3UKK23DrW8gICAgICAgICAgICB8ICBtaW5lCittw61hICAgICAgICAgICAgfAorbcOtb3MgICAgICAgICAgIHwKK23DrWFzICAgICAgICAgICB8Cit0dXlvICAgICAgICAgICB8ICB0aGluZQordHV5YSAgICAgICAgICAgfAordHV5b3MgICAgICAgICAgfAordHV5YXMgICAgICAgICAgfAorc3V5byAgICAgICAgICAgfCAgaGlzLCBoZXJzLCB0aGVpcnMKK3N1eWEgICAgICAgICAgIHwKK3N1eW9zICAgICAgICAgIHwKK3N1eWFzICAgICAgICAgIHwKK251ZXN0cm8gICAgICAgIHwgIG91cnMKK251ZXN0cmEgICAgICAgIHwKK251ZXN0cm9zICAgICAgIHwKK251ZXN0cmFzICAgICAgIHwKK3Z1ZXN0cm8gICAgICAgIHwgIHlvdXJzCit2dWVzdHJhICAgICAgICB8Cit2dWVzdHJvcyAgICAgICB8Cit2dWVzdHJhcyAgICAgICB8Citlc29zICAgICAgICAgICB8ICB0aG9zZQorZXNhcyAgICAgICAgICAgfCAgdGhvc2UKKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBlc3RhciwgdG8gYmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOgorZXN0b3kKK2VzdMOhcworZXN0w6EKK2VzdGFtb3MKK2VzdMOhaXMKK2VzdMOhbgorZXN0w6kKK2VzdMOpcworZXN0ZW1vcworZXN0w6lpcworZXN0w6luCitlc3RhcsOpCitlc3RhcsOhcworZXN0YXLDoQorZXN0YXJlbW9zCitlc3RhcsOpaXMKK2VzdGFyw6FuCitlc3RhcsOtYQorZXN0YXLDrWFzCitlc3RhcsOtYW1vcworZXN0YXLDrWFpcworZXN0YXLDrWFuCitlc3RhYmEKK2VzdGFiYXMKK2VzdMOhYmFtb3MKK2VzdGFiYWlzCitlc3RhYmFuCitlc3R1dmUKK2VzdHV2aXN0ZQorZXN0dXZvCitlc3R1dmltb3MKK2VzdHV2aXN0ZWlzCitlc3R1dmllcm9uCitlc3R1dmllcmEKK2VzdHV2aWVyYXMKK2VzdHV2acOpcmFtb3MKK2VzdHV2aWVyYWlzCitlc3R1dmllcmFuCitlc3R1dmllc2UKK2VzdHV2aWVzZXMKK2VzdHV2acOpc2Vtb3MKK2VzdHV2aWVzZWlzCitlc3R1dmllc2VuCitlc3RhbmRvCitlc3RhZG8KK2VzdGFkYQorZXN0YWRvcworZXN0YWRhcworZXN0YWQKKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBoYWJlciwgdG8gaGF2ZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6CitoZQoraGFzCitoYQoraGVtb3MKK2hhYsOpaXMKK2hhbgoraGF5YQoraGF5YXMKK2hheWFtb3MKK2hhecOhaXMKK2hheWFuCitoYWJyw6kKK2hhYnLDoXMKK2hhYnLDoQoraGFicmVtb3MKK2hhYnLDqWlzCitoYWJyw6FuCitoYWJyw61hCitoYWJyw61hcworaGFicsOtYW1vcworaGFicsOtYWlzCitoYWJyw61hbgoraGFiw61hCitoYWLDrWFzCitoYWLDrWFtb3MKK2hhYsOtYWlzCitoYWLDrWFuCitodWJlCitodWJpc3RlCitodWJvCitodWJpbW9zCitodWJpc3RlaXMKK2h1Ymllcm9uCitodWJpZXJhCitodWJpZXJhcworaHViacOpcmFtb3MKK2h1YmllcmFpcworaHViaWVyYW4KK2h1Ymllc2UKK2h1Ymllc2VzCitodWJpw6lzZW1vcworaHViaWVzZWlzCitodWJpZXNlbgoraGFiaWVuZG8KK2hhYmlkbworaGFiaWRhCitoYWJpZG9zCitoYWJpZGFzCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2Ygc2VyLCB0byBiZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6Citzb3kKK2VyZXMKK2VzCitzb21vcworc29pcworc29uCitzZWEKK3NlYXMKK3NlYW1vcworc2XDoWlzCitzZWFuCitzZXLDqQorc2Vyw6FzCitzZXLDoQorc2VyZW1vcworc2Vyw6lpcworc2Vyw6FuCitzZXLDrWEKK3NlcsOtYXMKK3NlcsOtYW1vcworc2Vyw61haXMKK3NlcsOtYW4KK2VyYQorZXJhcworw6lyYW1vcworZXJhaXMKK2VyYW4KK2Z1aQorZnVpc3RlCitmdWUKK2Z1aW1vcworZnVpc3RlaXMKK2Z1ZXJvbgorZnVlcmEKK2Z1ZXJhcworZnXDqXJhbW9zCitmdWVyYWlzCitmdWVyYW4KK2Z1ZXNlCitmdWVzZXMKK2Z1w6lzZW1vcworZnVlc2VpcworZnVlc2VuCitzaWVuZG8KK3NpZG8KKyAgfCAgc2VkIGFsc28gbWVhbnMgJ3RoaXJzdCcKKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiB0ZW5lciwgdG8gaGF2ZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6Cit0ZW5nbwordGllbmVzCit0aWVuZQordGVuZW1vcwordGVuw6lpcwordGllbmVuCit0ZW5nYQordGVuZ2FzCit0ZW5nYW1vcwordGVuZ8OhaXMKK3RlbmdhbgordGVuZHLDqQordGVuZHLDoXMKK3RlbmRyw6EKK3RlbmRyZW1vcwordGVuZHLDqWlzCit0ZW5kcsOhbgordGVuZHLDrWEKK3RlbmRyw61hcwordGVuZHLDrWFtb3MKK3RlbmRyw61haXMKK3RlbmRyw61hbgordGVuw61hCit0ZW7DrWFzCit0ZW7DrWFtb3MKK3RlbsOtYWlzCit0ZW7DrWFuCit0dXZlCit0dXZpc3RlCit0dXZvCit0dXZpbW9zCit0dXZpc3RlaXMKK3R1dmllcm9uCit0dXZpZXJhCit0dXZpZXJhcwordHV2acOpcmFtb3MKK3R1dmllcmFpcwordHV2aWVyYW4KK3R1dmllc2UKK3R1dmllc2VzCit0dXZpw6lzZW1vcwordHV2aWVzZWlzCit0dXZpZXNlbgordGVuaWVuZG8KK3RlbmlkbwordGVuaWRhCit0ZW5pZG9zCit0ZW5pZGFzCit0ZW5lZAorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2V1LnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZXUudHh0CmluZGV4IDdlNGU0YmIuLjI1ZjFkYjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZXUudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZXUudHh0CkBAIC0xLDk5ICsxLDk5IEBACi0jIGV4YW1wbGUgc2V0IG9mIGJhc3F1ZSBzdG9wd29yZHMNCi1hbA0KLWFuaXR6DQotYXJhYmVyYQ0KLWFza28NCi1iYWluYQ0KLWJhdA0KLWJhdGVhbg0KLWJhdGVrDQotYmF0aQ0KLWJhdHp1ZWkNCi1iYXR6dWVrDQotYmF0enVldGFuDQotYmF0enVrDQotYmVyYQ0KLWJlcmFpZWsNCi1iZXJhdQ0KLWJlcmF1ZWsNCi1iZXJlDQotYmVyb3JpDQotYmVyb3JpZWsNCi1iZXN0ZQ0KLWJlemFsYQ0KLWRhDQotZGFnbw0KLWRpcmENCi1kaXR1DQotZHUNCi1kdXRlDQotZWRvDQotZWdpbg0KLWVyZQ0KLWV0YQ0KLWV1cmFrDQotZXoNCi1nYWluZXJhDQotZ3UNCi1ndXR4aQ0KLWd1enRpDQotaGFpZWkNCi1oYWllaw0KLWhhaWV0YW4NCi1oYWluYmVzdGUNCi1oYWxhDQotaGFuDQotaGFuZGlrDQotaGFuZ28NCi1oYXJhDQotaGFyaQ0KLWhhcmsNCi1oYXJ0YW4NCi1oYXUNCi1oYXVlaQ0KLWhhdWVrDQotaGF1ZXRhbg0KLWhlbWVuDQotaGVtZW5kaWsNCi1oZW1lbmdvDQotaGkNCi1ob25hDQotaG9uZWsNCi1ob25lbGENCi1ob25ldGFuDQotaG9uaQ0KLWhvcg0KLWhvcmkNCi1ob3JpZWkNCi1ob3JpZWsNCi1ob3JpZXRhbg0KLWhvcmtvDQotaG9ycmENCi1ob3JyZWsNCi1ob3JyZWxhDQotaG9ycmV0YW4NCi1ob3JyaQ0KLWhvcnRpaw0KLWh1cmENCi1pemFuDQotbmkNCi1ub2l6DQotbm9sYQ0KLW5vbg0KLW5vbmRpaw0KLW5vbmdvDQotbm9yDQotbm9yYQ0KLXplDQotemVpbg0KLXplbg0KLXplbmJhaXQNCi16ZW5iYXQNCi16ZXINCi16ZXJnYXRpaw0KLXppcmVuDQoteml0dWVuDQotenUNCi16dWVrDQotenVlbg0KLXp1dGVuDQorIyBleGFtcGxlIHNldCBvZiBiYXNxdWUgc3RvcHdvcmRzCithbAorYW5pdHoKK2FyYWJlcmEKK2Fza28KK2JhaW5hCitiYXQKK2JhdGVhbgorYmF0ZWsKK2JhdGkKK2JhdHp1ZWkKK2JhdHp1ZWsKK2JhdHp1ZXRhbgorYmF0enVrCitiZXJhCitiZXJhaWVrCitiZXJhdQorYmVyYXVlaworYmVyZQorYmVyb3JpCitiZXJvcmllaworYmVzdGUKK2JlemFsYQorZGEKK2RhZ28KK2RpcmEKK2RpdHUKK2R1CitkdXRlCitlZG8KK2VnaW4KK2VyZQorZXRhCitldXJhaworZXoKK2dhaW5lcmEKK2d1CitndXR4aQorZ3V6dGkKK2hhaWVpCitoYWllaworaGFpZXRhbgoraGFpbmJlc3RlCitoYWxhCitoYW4KK2hhbmRpaworaGFuZ28KK2hhcmEKK2hhcmkKK2hhcmsKK2hhcnRhbgoraGF1CitoYXVlaQoraGF1ZWsKK2hhdWV0YW4KK2hlbWVuCitoZW1lbmRpaworaGVtZW5nbworaGkKK2hvbmEKK2hvbmVrCitob25lbGEKK2hvbmV0YW4KK2hvbmkKK2hvcgoraG9yaQoraG9yaWVpCitob3JpZWsKK2hvcmlldGFuCitob3JrbworaG9ycmEKK2hvcnJlaworaG9ycmVsYQoraG9ycmV0YW4KK2hvcnJpCitob3J0aWsKK2h1cmEKK2l6YW4KK25pCitub2l6Citub2xhCitub24KK25vbmRpaworbm9uZ28KK25vcgorbm9yYQoremUKK3plaW4KK3plbgoremVuYmFpdAoremVuYmF0Cit6ZXIKK3plcmdhdGlrCit6aXJlbgoreml0dWVuCit6dQorenVlaworenVlbgorenV0ZW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZmEudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19mYS50eHQKaW5kZXggNzZiYjYzNS4uNzIzNjQxYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19mYS50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19mYS50eHQKQEAgLTEsMzEzICsxLDMxMyBAQAotIyBUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgYnkgSmFjcXVlcyBTYXZveSBhbmQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBsaWNlbnNlLg0KLSMgU2VlIGh0dHA6Ly9tZW1iZXJzLnVuaW5lLmNoL2phY3F1ZXMuc2F2b3kvY2xlZi9pbmRleC5odG1sLg0KLSMgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sDQotIyBOb3RlOiBieSBkZWZhdWx0IHRoaXMgZmlsZSBpcyB1c2VkIGFmdGVyIG5vcm1hbGl6YXRpb24sIHNvIHdoZW4gYWRkaW5nIGVudHJpZXMNCi0jIHRvIHRoaXMgZmlsZSwgdXNlIHRoZSBhcmFiaWMgJ9mKJyBpbnN0ZWFkIG9mICfbjCcNCi3Yp9mG2KfZhg0KLdmG2K/Yp9i02KrZhw0KLdiz2LHYp9iz2LENCi3YrtmK2KfZhw0KLdin2YrYtNin2YYNCi3ZiNmKDQot2KrYp9mD2YbZiNmGDQot2KjZiti02KrYsdmKDQot2K/ZiNmFDQot2b7Ysw0KLdmG2KfYtNmKDQot2Yjar9mIDQot2YrYpw0KLdiv2KfYtNiq2YbYrw0KLdiz2b7Ysw0KLdmH2Ybar9in2YUNCi3Zh9ix2q/Ysg0KLdm+2YbYrA0KLdmG2LTYp9mGDQot2KfZhdiz2KfZhA0KLdiv2Yrar9ixDQot2q/YsdmI2YfZig0KLdi02K/ZhtivDQot2obYt9mI2LENCi3Yr9mHDQot2YgNCi3Yr9mIDQot2YbYrtiz2KrZitmGDQot2YjZhNmKDQot2obYsdinDQot2obZhw0KLdmI2LPYtw0KLdmHDQot2YPYr9in2YUNCi3Zgtin2KjZhA0KLdmK2YMNCi3YsdmB2KoNCi3Zh9mB2KoNCi3Zh9mF2obZhtmK2YYNCi3Yr9ixDQot2YfYstin2LENCi3YqNmE2YcNCi3YqNmE2YoNCi3YtNin2YrYrw0KLdin2YXYpw0KLdi02YbYp9iz2YoNCi3ar9ix2YHYqtmHDQot2K/Zh9ivDQot2K/Yp9i02KrZhw0KLdiv2KfZhtiz2KoNCi3Yr9in2LTYqtmGDQot2K7ZiNin2YfZitmFDQot2YXZitmE2YrYp9ix2K8NCi3ZiNmC2KrZitmD2YcNCi3Yp9mF2K8NCi3YrtmI2KfZh9ivDQot2KzYsg0KLdin2YjYsdiv2YcNCi3YtNiv2YcNCi3YqNmE2YPZhw0KLdiu2K/Zhdin2KoNCi3YtNiv2YYNCi3YqNix2K7Zig0KLdmG2KjZiNivDQot2KjYs9mK2KfYsdmKDQot2KzZhNmI2q/Zitix2YoNCi3YrdmCDQot2YPYsdiv2YbYrw0KLdmG2YjYudmKDQot2KjYudix2YoNCi3ZhtmD2LHYr9mHDQot2YbYuNmK2LENCi3Zhtio2KfZitivDQot2KjZiNiv2YcNCi3YqNmI2K/Zhg0KLdiv2KfYrw0KLdin2YjYsdivDQot2YfYs9iqDQot2KzYp9mK2YoNCi3YtNmI2K8NCi3Yr9mG2KjYp9mEDQot2K/Yp9iv2YcNCi3YqNin2YrYrw0KLdiz2KfYqNmCDQot2YfZitqGDQot2YfZhdin2YYNCi3Yp9mG2KzYpw0KLdmD2YXYqtixDQot2YPYrNin2LPYqg0KLdqv2LHYr9ivDQot2YPYs9mKDQot2KrYsQ0KLdmF2LHYr9mFDQot2KrYp9mGDQot2K/Yp9iv2YYNCi3YqNmI2K/ZhtivDQot2LPYsdmKDQot2KzYr9inDQot2YbYr9in2LHZhtivDQot2YXar9ixDQot2YrZg9iv2Yrar9ixDQot2K/Yp9ix2K8NCi3Yr9mH2YbYrw0KLdio2YbYp9io2LHYp9mK2YYNCi3Zh9mG2q/Yp9mF2YoNCi3Ys9mF2KoNCi3YrNinDQot2KfZhtqG2YcNCi3YrtmI2K8NCi3Yr9in2K/ZhtivDQot2LLZitin2K8NCi3Yr9in2LHZhtivDQot2KfYq9ixDQot2KjYr9mI2YYNCi3YqNmH2KrYsdmK2YYNCi3YqNmK2LTYqtixDQot2KfZhNio2KrZhw0KLdio2YcNCi3YqNix2KfYs9in2LMNCi3YqNmK2LHZiNmGDQot2YPYsdivDQot2KjYudi22YoNCi3ar9ix2YHYqg0KLdiq2YjZig0KLdin2YoNCi3ZhdmK2YTZitmI2YYNCi3Yp9mIDQot2KzYsdmK2KfZhg0KLdiq2YjZhA0KLdio2LENCi3Zhdin2YbZhtivDQot2KjYsdin2KjYsQ0KLdio2KfYtNmK2YUNCi3Zhdiv2KrZig0KLdqv2YjZitmG2K8NCi3Yp9mD2YbZiNmGDQot2KrYpw0KLdiq2YbZh9inDQot2KzYr9mK2K8NCi3ahtmG2K8NCi3YqNmKDQot2YbYtNiv2YcNCi3Zg9ix2K/Zhg0KLdmD2LHYr9mFDQot2q/ZiNmK2K8NCi3Zg9ix2K/Zhw0KLdmD2YbZitmFDQot2YbZhdmKDQot2YbYstivDQot2LHZiNmKDQot2YLYtdivDQot2YHZgti3DQot2KjYp9mE2KfZig0KLdiv2Yrar9ix2KfZhg0KLdin2YrZhg0KLdiv2YrYsdmI2LINCi3YqtmI2LPYtw0KLdiz2YjZhQ0KLdin2YrZhQ0KLdiv2KfZhtmG2K8NCi3Ys9mI2YoNCi3Yp9iz2KrZgdin2K/Zhw0KLdi02YXYpw0KLdmD2YbYp9ixDQot2K/Yp9ix2YrZhQ0KLdiz2KfYrtiq2YcNCi3Yt9mI2LENCi3Yp9mF2K/Zhw0KLdix2YHYqtmHDQot2YbYrtiz2KoNCi3YqNmK2LPYqg0KLdmG2LLYr9mK2YMNCi3Yt9mKDQot2YPZhtmK2K8NCi3Yp9iyDQot2KfZhtmH2KcNCi3YqtmF2KfZhdmKDQot2K/Yp9i02KoNCi3ZitmD2YoNCi3Yt9ix2YrZgg0KLdin2LQNCi3ahtmK2LPYqg0KLdix2YjYqA0KLdmG2YXYp9mK2K8NCi3ar9mB2KoNCi3ahtmG2K/ZitmGDQot2obZitiy2YoNCi3YqtmI2KfZhtivDQot2KfZhQ0KLdin2YrYpw0KLdio2KcNCi3Yp9mGDQot2KfZitivDQot2KrYsdmK2YYNCi3Yp9mK2YbZg9mHDQot2K/Zitqv2LHZig0KLdix2KfZhw0KLdmH2KfZitmKDQot2KjYsdmI2LINCi3Zh9mF2obZhtin2YYNCi3Zvtin2LnZitmGDQot2YPYsw0KLdit2K/ZiNivDQot2YXYrtiq2YTZgQ0KLdmF2YLYp9io2YQNCi3ahtmK2LINCi3ar9mK2LHYrw0KLdmG2K/Yp9ix2K8NCi3YttivDQot2YfZhdqG2YjZhg0KLdiz2KfYstmKDQot2LTYp9mGDQot2YXZiNix2K8NCi3YqNin2LHZhw0KLdmF2LHYs9mKDQot2K7ZiNmK2LQNCi3YqNix2K7ZiNix2K/Yp9ixDQot2obZiNmGDQot2K7Yp9ix2KwNCi3YtNi0DQot2YfZhtmI2LINCi3Yqtit2KoNCi3YttmF2YYNCi3Zh9iz2KrZitmFDQot2q/Zgdiq2YcNCi3ZgdmD2LENCi3YqNiz2YrYp9ixDQot2b7Ziti0DQot2KjYsdin2YoNCi3YsdmI2LLZh9in2YoNCi3Yp9mG2YPZhw0KLdmG2K7ZiNin2YfYrw0KLdio2KfZhNinDQot2YPZhA0KLdmI2YLYqtmKDQot2YPZig0KLdqG2YbZitmGDQot2YPZhw0KLdqv2YrYsdmKDQot2YbZitiz2KoNCi3Yp9iz2KoNCi3Zg9is2KcNCi3Zg9mG2K8NCi3ZhtmK2LINCi3Zitin2KjYrw0KLdio2YbYr9mKDQot2K3YqtmKDQot2KrZiNin2YbZhtivDQot2LnZgtioDQot2K7ZiNin2LPYqg0KLdmD2YbZhtivDQot2KjZitmGDQot2KrZhdin2YUNCi3Zh9mF2YcNCi3ZhdinDQot2KjYp9i02YbYrw0KLdmF2KvZhA0KLdi02K8NCi3Yp9ix2YoNCi3YqNin2LTYrw0KLdin2LHZhw0KLdi32KjZgg0KLdio2LnYrw0KLdin2q/YsQ0KLdi12YjYsdiqDQot2LrZitixDQot2KzYp9mKDQot2KjZiti0DQot2LHZitiy2YoNCi3Yp9mG2K8NCi3YstmK2LHYpw0KLdqG2q/ZiNmG2YcNCi3YqNin2LENCi3ZhNi32YHYpw0KLdmF2YoNCi3Yr9ix2KjYp9ix2YcNCi3ZhdmGDQot2K/Zitiv2YcNCi3Zh9mF2YrZhg0KLdqv2LDYp9ix2YoNCi3YqNix2K/Yp9ix2YoNCi3YudmE2KoNCi3ar9iw2KfYtNiq2YcNCi3Zh9mFDQot2YHZiNmCDQot2YbZhw0KLdmH2KcNCi3YtNmI2YbYrw0KLdin2KjYp9ivDQot2YfZhdmI2KfYsdmHDQot2YfYsQ0KLdin2YjZhA0KLdiu2YjYp9mH2YbYrw0KLdqG2YfYp9ixDQot2YbYp9mFDQot2KfZhdix2YjYsg0KLdmF2KfZhg0KLdmH2KfZig0KLdmC2KjZhA0KLdmD2YbZhQ0KLdiz2LnZig0KLdiq2KfYstmHDQot2LHYpw0KLdmH2LPYqtmG2K8NCi3YstmK2LENCi3YrNmE2YjZig0KLdi52YbZiNin2YYNCi3YqNmI2K8NCisjIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSBKYWNxdWVzIFNhdm95IGFuZCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuCisjIFNlZSBodHRwOi8vbWVtYmVycy51bmluZS5jaC9qYWNxdWVzLnNhdm95L2NsZWYvaW5kZXguaHRtbC4KKyMgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCisjIE5vdGU6IGJ5IGRlZmF1bHQgdGhpcyBmaWxlIGlzIHVzZWQgYWZ0ZXIgbm9ybWFsaXphdGlvbiwgc28gd2hlbiBhZGRpbmcgZW50cmllcworIyB0byB0aGlzIGZpbGUsIHVzZSB0aGUgYXJhYmljICfZiicgaW5zdGVhZCBvZiAn24wnCivYp9mG2KfZhgor2YbYr9in2LTYqtmHCivYs9ix2KfYs9ixCivYrtmK2KfZhwor2KfZiti02KfZhgor2YjZigor2KrYp9mD2YbZiNmGCivYqNmK2LTYqtix2YoKK9iv2YjZhQor2b7Yswor2YbYp9i02YoKK9mI2q/ZiAor2YrYpwor2K/Yp9i02KrZhtivCivYs9m+2LMKK9mH2Ybar9in2YUKK9mH2LHar9iyCivZvtmG2KwKK9mG2LTYp9mGCivYp9mF2LPYp9mECivYr9mK2q/YsQor2q/YsdmI2YfZigor2LTYr9mG2K8KK9qG2LfZiNixCivYr9mHCivZiAor2K/ZiAor2YbYrtiz2KrZitmGCivZiNmE2YoKK9qG2LHYpwor2obZhwor2YjYs9i3CivZhwor2YPYr9in2YUKK9mC2KfYqNmECivZitmDCivYsdmB2KoKK9mH2YHYqgor2YfZhdqG2YbZitmGCivYr9ixCivZh9iy2KfYsQor2KjZhNmHCivYqNmE2YoKK9i02KfZitivCivYp9mF2KcKK9i02YbYp9iz2YoKK9qv2LHZgdiq2YcKK9iv2YfYrwor2K/Yp9i02KrZhwor2K/Yp9mG2LPYqgor2K/Yp9i02KrZhgor2K7ZiNin2YfZitmFCivZhdmK2YTZitin2LHYrwor2YjZgtiq2YrZg9mHCivYp9mF2K8KK9iu2YjYp9mH2K8KK9is2LIKK9in2YjYsdiv2YcKK9i02K/Zhwor2KjZhNmD2YcKK9iu2K/Zhdin2KoKK9i02K/Zhgor2KjYsdiu2YoKK9mG2KjZiNivCivYqNiz2YrYp9ix2YoKK9is2YTZiNqv2YrYsdmKCivYrdmCCivZg9ix2K/ZhtivCivZhtmI2LnZigor2KjYudix2YoKK9mG2YPYsdiv2YcKK9mG2LjZitixCivZhtio2KfZitivCivYqNmI2K/Zhwor2KjZiNiv2YYKK9iv2KfYrwor2KfZiNix2K8KK9mH2LPYqgor2KzYp9mK2YoKK9i02YjYrwor2K/Zhtio2KfZhAor2K/Yp9iv2YcKK9io2KfZitivCivYs9in2KjZggor2YfZitqGCivZh9mF2KfZhgor2KfZhtis2KcKK9mD2YXYqtixCivZg9is2KfYs9iqCivar9ix2K/Yrwor2YPYs9mKCivYqtixCivZhdix2K/ZhQor2KrYp9mGCivYr9in2K/Zhgor2KjZiNiv2YbYrwor2LPYsdmKCivYrNiv2KcKK9mG2K/Yp9ix2YbYrwor2YXar9ixCivZitmD2K/Zitqv2LEKK9iv2KfYsdivCivYr9mH2YbYrwor2KjZhtin2KjYsdin2YrZhgor2YfZhtqv2KfZhdmKCivYs9mF2KoKK9is2KcKK9in2YbahtmHCivYrtmI2K8KK9iv2KfYr9mG2K8KK9iy2YrYp9ivCivYr9in2LHZhtivCivYp9ir2LEKK9io2K/ZiNmGCivYqNmH2KrYsdmK2YYKK9io2YrYtNiq2LEKK9in2YTYqNiq2YcKK9io2YcKK9io2LHYp9iz2KfYswor2KjZitix2YjZhgor2YPYsdivCivYqNi52LbZigor2q/YsdmB2KoKK9iq2YjZigor2KfZigor2YXZitmE2YrZiNmGCivYp9mICivYrNix2YrYp9mGCivYqtmI2YQKK9io2LEKK9mF2KfZhtmG2K8KK9io2LHYp9io2LEKK9io2KfYtNmK2YUKK9mF2K/YqtmKCivar9mI2YrZhtivCivYp9mD2YbZiNmGCivYqtinCivYqtmG2YfYpwor2KzYr9mK2K8KK9qG2YbYrwor2KjZigor2YbYtNiv2YcKK9mD2LHYr9mGCivZg9ix2K/ZhQor2q/ZiNmK2K8KK9mD2LHYr9mHCivZg9mG2YrZhQor2YbZhdmKCivZhtiy2K8KK9ix2YjZigor2YLYtdivCivZgdmC2LcKK9io2KfZhNin2YoKK9iv2Yrar9ix2KfZhgor2KfZitmGCivYr9mK2LHZiNiyCivYqtmI2LPYtwor2LPZiNmFCivYp9mK2YUKK9iv2KfZhtmG2K8KK9iz2YjZigor2KfYs9iq2YHYp9iv2YcKK9i02YXYpwor2YPZhtin2LEKK9iv2KfYsdmK2YUKK9iz2KfYrtiq2YcKK9i32YjYsQor2KfZhdiv2YcKK9ix2YHYqtmHCivZhtiu2LPYqgor2KjZitiz2KoKK9mG2LLYr9mK2YMKK9i32YoKK9mD2YbZitivCivYp9iyCivYp9mG2YfYpwor2KrZhdin2YXZigor2K/Yp9i02KoKK9mK2YPZigor2LfYsdmK2YIKK9in2LQKK9qG2YrYs9iqCivYsdmI2KgKK9mG2YXYp9mK2K8KK9qv2YHYqgor2obZhtiv2YrZhgor2obZitiy2YoKK9iq2YjYp9mG2K8KK9in2YUKK9in2YrYpwor2KjYpwor2KfZhgor2KfZitivCivYqtix2YrZhgor2KfZitmG2YPZhwor2K/Zitqv2LHZigor2LHYp9mHCivZh9in2YrZigor2KjYsdmI2LIKK9mH2YXahtmG2KfZhgor2b7Yp9i52YrZhgor2YPYswor2K3Yr9mI2K8KK9mF2K7YqtmE2YEKK9mF2YLYp9io2YQKK9qG2YrYsgor2q/Zitix2K8KK9mG2K/Yp9ix2K8KK9i22K8KK9mH2YXahtmI2YYKK9iz2KfYstmKCivYtNin2YYKK9mF2YjYsdivCivYqNin2LHZhwor2YXYsdiz2YoKK9iu2YjZiti0CivYqNix2K7ZiNix2K/Yp9ixCivahtmI2YYKK9iu2KfYsdisCivYtNi0CivZh9mG2YjYsgor2KrYrdiqCivYttmF2YYKK9mH2LPYqtmK2YUKK9qv2YHYqtmHCivZgdmD2LEKK9io2LPZitin2LEKK9m+2YrYtAor2KjYsdin2YoKK9ix2YjYstmH2KfZigor2KfZhtmD2YcKK9mG2K7ZiNin2YfYrwor2KjYp9mE2KcKK9mD2YQKK9mI2YLYqtmKCivZg9mKCivahtmG2YrZhgor2YPZhwor2q/Zitix2YoKK9mG2YrYs9iqCivYp9iz2KoKK9mD2KzYpwor2YPZhtivCivZhtmK2LIKK9mK2KfYqNivCivYqNmG2K/Zigor2K3YqtmKCivYqtmI2KfZhtmG2K8KK9i52YLYqAor2K7ZiNin2LPYqgor2YPZhtmG2K8KK9io2YrZhgor2KrZhdin2YUKK9mH2YXZhwor2YXYpwor2KjYp9i02YbYrwor2YXYq9mECivYtNivCivYp9ix2YoKK9io2KfYtNivCivYp9ix2YcKK9i32KjZggor2KjYudivCivYp9qv2LEKK9i12YjYsdiqCivYutmK2LEKK9is2KfZigor2KjZiti0CivYsdmK2LLZigor2KfZhtivCivYstmK2LHYpwor2obar9mI2YbZhwor2KjYp9ixCivZhNi32YHYpwor2YXZigor2K/Ysdio2KfYsdmHCivZhdmGCivYr9mK2K/Zhwor2YfZhdmK2YYKK9qv2LDYp9ix2YoKK9io2LHYr9in2LHZigor2LnZhNiqCivar9iw2KfYtNiq2YcKK9mH2YUKK9mB2YjZggor2YbZhwor2YfYpwor2LTZiNmG2K8KK9in2KjYp9ivCivZh9mF2YjYp9ix2YcKK9mH2LEKK9in2YjZhAor2K7ZiNin2YfZhtivCivahtmH2KfYsQor2YbYp9mFCivYp9mF2LHZiNiyCivZhdin2YYKK9mH2KfZigor2YLYqNmECivZg9mG2YUKK9iz2LnZigor2KrYp9iy2YcKK9ix2KcKK9mH2LPYqtmG2K8KK9iy2YrYsQor2KzZhNmI2YoKK9i52YbZiNin2YYKK9io2YjYrwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19maS50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2ZpLnR4dAppbmRleCA0ZDcwZGEzLi40MzcyYzlhIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2ZpLnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2ZpLnR4dApAQCAtMSw5NyArMSw5NyBAQAotIHwgRnJvbSBzdm4udGFydGFydXMub3JnL3Nub3diYWxsL3RydW5rL3dlYnNpdGUvYWxnb3JpdGhtcy9maW5uaXNoL3N0b3AudHh0DQotIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4NCi0gfCBTZWUgaHR0cDovL3Nub3diYWxsLnRhcnRhcnVzLm9yZy9saWNlbnNlLnBocA0KLSB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbA0KLSB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguDQotIHwgIC0gVGhpcyBub3RpY2Ugd2FzIGFkZGVkLg0KLSB8DQotIHwgTk9URTogVG8gdXNlIHRoaXMgZmlsZSB3aXRoIFN0b3BGaWx0ZXJGYWN0b3J5LCB5b3UgbXVzdCBzcGVjaWZ5IGZvcm1hdD0ic25vd2JhbGwiDQotIA0KLXwgZm9ybXMgb2YgQkUNCi0NCi1vbGxhDQotb2xlbg0KLW9sZXQNCi1vbg0KLW9sZW1tZQ0KLW9sZXR0ZQ0KLW92YXQNCi1vbGUgICAgICAgIHwgbmVnYXRpdmUgZm9ybQ0KLQ0KLW9saQ0KLW9saXNpDQotb2xpc2l0DQotb2xpc2luDQotb2xpc2ltbWUNCi1vbGlzaXR0ZQ0KLW9saXNpdmF0DQotb2xpdA0KLW9saW4NCi1vbGltbWUNCi1vbGl0dGUNCi1vbGl2YXQNCi1vbGx1dA0KLW9sbGVldA0KLQ0KLWVuICAgICAgICAgfCBuZWdhdGlvbg0KLWV0DQotZWkNCi1lbW1lDQotZXR0ZQ0KLWVpdsOkdA0KLQ0KLXxOb20gICBHZW4gICAgQWNjICAgIFBhcnQgICBJbmVzcyAgIEVsYXQgICAgSWxsYXQgIEFkZXNzICAgQWJsYXQgICBBbGxhdCAgIEVzcyAgICBUcmFucw0KLW1pbsOkICAgbWludW4gIG1pbnV0ICBtaW51YSAgbWludXNzYSBtaW51c3RhIG1pbnV1biBtaW51bGxhIG1pbnVsdGEgbWludWxsZSAgICAgICAgICAgICAgIHwgSQ0KLXNpbsOkICAgc2ludW4gIHNpbnV0ICBzaW51YSAgc2ludXNzYSBzaW51c3RhIHNpbnV1biBzaW51bGxhIHNpbnVsdGEgc2ludWxsZSAgICAgICAgICAgICAgIHwgeW91DQotaMOkbiAgICBow6RuZW4gIGjDpG5ldCAgaMOkbnTDpCAgaMOkbmVzc8OkIGjDpG5lc3TDpCBow6RuZWVuIGjDpG5lbGzDpCBow6RuZWx0w6QgaMOkbmVsbGUgICAgICAgICAgICAgICB8IGhlIHNoZQ0KLW1lICAgICBtZWlkw6RuIG1laWTDpHQgbWVpdMOkICBtZWlzc8OkICBtZWlzdMOkICBtZWloaW4gbWVpbGzDpCAgbWVpbHTDpCAgbWVpbGxlICAgICAgICAgICAgICAgIHwgd2UNCi10ZSAgICAgdGVpZMOkbiB0ZWlkw6R0IHRlaXTDpCAgdGVpc3PDpCAgdGVpc3TDpCAgdGVpaGluIHRlaWxsw6QgIHRlaWx0w6QgIHRlaWxsZSAgICAgICAgICAgICAgICB8IHlvdQ0KLWhlICAgICBoZWlkw6RuIGhlaWTDpHQgaGVpdMOkICBoZWlzc8OkICBoZWlzdMOkICBoZWloaW4gaGVpbGzDpCAgaGVpbHTDpCAgaGVpbGxlICAgICAgICAgICAgICAgIHwgdGhleQ0KLQ0KLXTDpG3DpCAgIHTDpG3DpG4gICAgICAgICB0w6R0w6QgICB0w6Rzc8OkICAgdMOkc3TDpCAgIHTDpGjDpG4gIHRhbGzDpCAgIHTDpGx0w6QgICB0w6RsbGUgICB0w6Ruw6QgICB0w6Rrc2kgIHwgdGhpcw0KLXR1byAgICB0dW9uICAgICAgICAgIHR1b3TDpCAgdHVvc3NhICB0dW9zdGEgIHR1b2hvbiB0dW9sbGEgIHR1b2x0YSAgdHVvbGxlICB0dW9uYSAgdHVva3NpIHwgdGhhdA0KLXNlICAgICBzZW4gICAgICAgICAgIHNpdMOkICAgc2lpbsOkICAgc2lpdMOkICAgc2lpaGVuIHNpbGzDpCAgIHNpbHTDpCAgIHNpbGxlICAgc2luw6QgICBzaWtzaSAgfCBpdA0KLW7DpG3DpCAgIG7DpGlkZW4gICAgICAgIG7DpGl0w6QgIG7DpGlzc8OkICBuw6Rpc3TDpCAgbsOkaWhpbiBuw6RpbGzDpCAgbsOkaWx0w6QgIG7DpGlsbGUgIG7DpGluw6QgIG7DpGlrc2kgfCB0aGVzZQ0KLW51byAgICBub2lkZW4gICAgICAgIG5vaXRhICBub2lzc2EgIG5vaXN0YSAgbm9paGluIG5vaWxsYSAgbm9pbHRhICBub2lsbGUgIG5vaW5hICBub2lrc2kgfCB0aG9zZQ0KLW5lICAgICBuaWlkZW4gICAgICAgIG5paXTDpCAgbmlpc3PDpCAgbmlpc3TDpCAgbmlpaGluIG5paWxsw6QgIG5paWx0w6QgIG5paWxsZSAgbmlpbsOkICBuaWlrc2kgfCB0aGV5DQotDQota3VrYSAgIGtlbmVuIGtlbmV0ICAga2V0w6QgICBrZW5lc3PDpCBrZW5lc3TDpCBrZW5lZW4ga2VuZWxsw6Qga2VuZWx0w6Qga2VuZWxsZSBrZW5lbsOkIGtlbmVrc2l8IHdobw0KLWtldGvDpCAga2VpZGVuIGtldGvDpCAga2VpdMOkICBrZWlzc8OkICBrZWlzdMOkICBrZWloaW4ga2VpbGzDpCAga2VpbHTDpCAga2VpbGxlICBrZWluw6QgIGtlaWtzaSB8IChwbCkNCi1taWvDpCAgIG1pbmvDpCBtaW5rw6QgICBtaXTDpCAgIG1pc3PDpCAgIG1pc3TDpCAgIG1paGluICBtaWxsw6QgICBtaWx0w6QgICBtaWxsZSAgIG1pbsOkICAgbWlrc2kgIHwgd2hpY2ggd2hhdA0KLW1pdGvDpCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHBsKQ0KLQ0KLWpva2EgICBqb25rYSAgICAgICAgIGpvdGEgICBqb3NzYSAgIGpvc3RhICAgam9ob24gIGpvbGxhICAgam9sdGEgICBqb2xsZSAgIGpvbmEgICBqb2tzaSAgfCB3aG8gd2hpY2gNCi1qb3RrYSAgam9pZGVuICAgICAgICBqb2l0YSAgam9pc3NhICBqb2lzdGEgIGpvaWhpbiBqb2lsbGEgIGpvaWx0YSAgam9pbGxlICBqb2luYSAgam9pa3NpIHwgKHBsKQ0KLQ0KLXwgY29uanVuY3Rpb25zDQotDQotZXR0w6QgICB8IHRoYXQNCi1qYSAgICAgfCBhbmQNCi1qb3MgICAgfCBpZg0KLWtvc2thICB8IGJlY2F1c2UNCi1rdWluICAgfCB0aGFuDQotbXV0dGEgIHwgYnV0DQotbmlpbiAgIHwgc28NCi1zZWvDpCAgIHwgYW5kDQotc2lsbMOkICB8IGZvcg0KLXRhaSAgICB8IG9yDQotdmFhbiAgIHwgYnV0DQotdmFpICAgIHwgb3INCi12YWlra2EgfCBhbHRob3VnaA0KLQ0KLQ0KLXwgcHJlcG9zaXRpb25zDQotDQota2Fuc3NhICB8IHdpdGgNCi1tdWthYW4gIHwgYWNjb3JkaW5nIHRvDQotbm9pbiAgICB8IGFib3V0DQotcG9pa2tpICB8IGFjcm9zcw0KLXlsaSAgICAgfCBvdmVyLCBhY3Jvc3MNCi0NCi18IG90aGVyDQotDQota3VuICAgIHwgd2hlbg0KLW5paW4gICB8IHNvDQotbnl0ICAgIHwgbm93DQotaXRzZSAgIHwgc2VsZg0KLQ0KKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvZmlubmlzaC9zdG9wLnR4dAorIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KKyB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwCisgfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKKyB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguCisgfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuCisgfAorIHwgTk9URTogVG8gdXNlIHRoaXMgZmlsZSB3aXRoIFN0b3BGaWx0ZXJGYWN0b3J5LCB5b3UgbXVzdCBzcGVjaWZ5IGZvcm1hdD0ic25vd2JhbGwiCisgCit8IGZvcm1zIG9mIEJFCisKK29sbGEKK29sZW4KK29sZXQKK29uCitvbGVtbWUKK29sZXR0ZQorb3ZhdAorb2xlICAgICAgICB8IG5lZ2F0aXZlIGZvcm0KKworb2xpCitvbGlzaQorb2xpc2l0CitvbGlzaW4KK29saXNpbW1lCitvbGlzaXR0ZQorb2xpc2l2YXQKK29saXQKK29saW4KK29saW1tZQorb2xpdHRlCitvbGl2YXQKK29sbHV0CitvbGxlZXQKKworZW4gICAgICAgICB8IG5lZ2F0aW9uCitldAorZWkKK2VtbWUKK2V0dGUKK2VpdsOkdAorCit8Tm9tICAgR2VuICAgIEFjYyAgICBQYXJ0ICAgSW5lc3MgICBFbGF0ICAgIElsbGF0ICBBZGVzcyAgIEFibGF0ICAgQWxsYXQgICBFc3MgICAgVHJhbnMKK21pbsOkICAgbWludW4gIG1pbnV0ICBtaW51YSAgbWludXNzYSBtaW51c3RhIG1pbnV1biBtaW51bGxhIG1pbnVsdGEgbWludWxsZSAgICAgICAgICAgICAgIHwgSQorc2luw6QgICBzaW51biAgc2ludXQgIHNpbnVhICBzaW51c3NhIHNpbnVzdGEgc2ludXVuIHNpbnVsbGEgc2ludWx0YSBzaW51bGxlICAgICAgICAgICAgICAgfCB5b3UKK2jDpG4gICAgaMOkbmVuICBow6RuZXQgIGjDpG50w6QgIGjDpG5lc3PDpCBow6RuZXN0w6QgaMOkbmVlbiBow6RuZWxsw6QgaMOkbmVsdMOkIGjDpG5lbGxlICAgICAgICAgICAgICAgfCBoZSBzaGUKK21lICAgICBtZWlkw6RuIG1laWTDpHQgbWVpdMOkICBtZWlzc8OkICBtZWlzdMOkICBtZWloaW4gbWVpbGzDpCAgbWVpbHTDpCAgbWVpbGxlICAgICAgICAgICAgICAgIHwgd2UKK3RlICAgICB0ZWlkw6RuIHRlaWTDpHQgdGVpdMOkICB0ZWlzc8OkICB0ZWlzdMOkICB0ZWloaW4gdGVpbGzDpCAgdGVpbHTDpCAgdGVpbGxlICAgICAgICAgICAgICAgIHwgeW91CitoZSAgICAgaGVpZMOkbiBoZWlkw6R0IGhlaXTDpCAgaGVpc3PDpCAgaGVpc3TDpCAgaGVpaGluIGhlaWxsw6QgIGhlaWx0w6QgIGhlaWxsZSAgICAgICAgICAgICAgICB8IHRoZXkKKwordMOkbcOkICAgdMOkbcOkbiAgICAgICAgIHTDpHTDpCAgIHTDpHNzw6QgICB0w6RzdMOkICAgdMOkaMOkbiAgdGFsbMOkICAgdMOkbHTDpCAgIHTDpGxsZSAgIHTDpG7DpCAgIHTDpGtzaSAgfCB0aGlzCit0dW8gICAgdHVvbiAgICAgICAgICB0dW90w6QgIHR1b3NzYSAgdHVvc3RhICB0dW9ob24gdHVvbGxhICB0dW9sdGEgIHR1b2xsZSAgdHVvbmEgIHR1b2tzaSB8IHRoYXQKK3NlICAgICBzZW4gICAgICAgICAgIHNpdMOkICAgc2lpbsOkICAgc2lpdMOkICAgc2lpaGVuIHNpbGzDpCAgIHNpbHTDpCAgIHNpbGxlICAgc2luw6QgICBzaWtzaSAgfCBpdAorbsOkbcOkICAgbsOkaWRlbiAgICAgICAgbsOkaXTDpCAgbsOkaXNzw6QgIG7DpGlzdMOkICBuw6RpaGluIG7DpGlsbMOkICBuw6RpbHTDpCAgbsOkaWxsZSAgbsOkaW7DpCAgbsOkaWtzaSB8IHRoZXNlCitudW8gICAgbm9pZGVuICAgICAgICBub2l0YSAgbm9pc3NhICBub2lzdGEgIG5vaWhpbiBub2lsbGEgIG5vaWx0YSAgbm9pbGxlICBub2luYSAgbm9pa3NpIHwgdGhvc2UKK25lICAgICBuaWlkZW4gICAgICAgIG5paXTDpCAgbmlpc3PDpCAgbmlpc3TDpCAgbmlpaGluIG5paWxsw6QgIG5paWx0w6QgIG5paWxsZSAgbmlpbsOkICBuaWlrc2kgfCB0aGV5CisKK2t1a2EgICBrZW5lbiBrZW5ldCAgIGtldMOkICAga2VuZXNzw6Qga2VuZXN0w6Qga2VuZWVuIGtlbmVsbMOkIGtlbmVsdMOkIGtlbmVsbGUga2VuZW7DpCBrZW5la3NpfCB3aG8KK2tldGvDpCAga2VpZGVuIGtldGvDpCAga2VpdMOkICBrZWlzc8OkICBrZWlzdMOkICBrZWloaW4ga2VpbGzDpCAga2VpbHTDpCAga2VpbGxlICBrZWluw6QgIGtlaWtzaSB8IChwbCkKK21pa8OkICAgbWlua8OkIG1pbmvDpCAgIG1pdMOkICAgbWlzc8OkICAgbWlzdMOkICAgbWloaW4gIG1pbGzDpCAgIG1pbHTDpCAgIG1pbGxlICAgbWluw6QgICBtaWtzaSAgfCB3aGljaCB3aGF0CittaXRrw6QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChwbCkKKworam9rYSAgIGpvbmthICAgICAgICAgam90YSAgIGpvc3NhICAgam9zdGEgICBqb2hvbiAgam9sbGEgICBqb2x0YSAgIGpvbGxlICAgam9uYSAgIGpva3NpICB8IHdobyB3aGljaAoram90a2EgIGpvaWRlbiAgICAgICAgam9pdGEgIGpvaXNzYSAgam9pc3RhICBqb2loaW4gam9pbGxhICBqb2lsdGEgIGpvaWxsZSAgam9pbmEgIGpvaWtzaSB8IChwbCkKKworfCBjb25qdW5jdGlvbnMKKworZXR0w6QgICB8IHRoYXQKK2phICAgICB8IGFuZAoram9zICAgIHwgaWYKK2tvc2thICB8IGJlY2F1c2UKK2t1aW4gICB8IHRoYW4KK211dHRhICB8IGJ1dAorbmlpbiAgIHwgc28KK3Nla8OkICAgfCBhbmQKK3NpbGzDpCAgfCBmb3IKK3RhaSAgICB8IG9yCit2YWFuICAgfCBidXQKK3ZhaSAgICB8IG9yCit2YWlra2EgfCBhbHRob3VnaAorCisKK3wgcHJlcG9zaXRpb25zCisKK2thbnNzYSAgfCB3aXRoCittdWthYW4gIHwgYWNjb3JkaW5nIHRvCitub2luICAgIHwgYWJvdXQKK3BvaWtraSAgfCBhY3Jvc3MKK3lsaSAgICAgfCBvdmVyLCBhY3Jvc3MKKworfCBvdGhlcgorCitrdW4gICAgfCB3aGVuCituaWluICAgfCBzbworbnl0ICAgIHwgbm93CitpdHNlICAgfCBzZWxmCisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZnIudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19mci50eHQKaW5kZXggZmVjMzM5NS4uNzQ5YWJhZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19mci50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19mci50eHQKQEAgLTEsMTg2ICsxLDE4NiBAQAotIHwgRnJvbSBzdm4udGFydGFydXMub3JnL3Nub3diYWxsL3RydW5rL3dlYnNpdGUvYWxnb3JpdGhtcy9mcmVuY2gvc3RvcC50eHQNCi0gfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLg0KLSB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwDQotIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sDQotIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4NCi0gfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuDQotIHwNCi0gfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCINCi0NCi0gfCBBIEZyZW5jaCBzdG9wIHdvcmQgbGlzdC4gQ29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIEVhY2ggc3RvcA0KLSB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4NCi0NCi1hdSAgICAgICAgICAgICB8ICBhICsgbGUNCi1hdXggICAgICAgICAgICB8ICBhICsgbGVzDQotYXZlYyAgICAgICAgICAgfCAgd2l0aA0KLWNlICAgICAgICAgICAgIHwgIHRoaXMNCi1jZXMgICAgICAgICAgICB8ICB0aGVzZQ0KLWRhbnMgICAgICAgICAgIHwgIHdpdGgNCi1kZSAgICAgICAgICAgICB8ICBvZg0KLWRlcyAgICAgICAgICAgIHwgIGRlICsgbGVzDQotZHUgICAgICAgICAgICAgfCAgZGUgKyBsZQ0KLWVsbGUgICAgICAgICAgIHwgIHNoZQ0KLWVuICAgICAgICAgICAgIHwgIGBvZiB0aGVtJyBldGMNCi1ldCAgICAgICAgICAgICB8ICBhbmQNCi1ldXggICAgICAgICAgICB8ICB0aGVtDQotaWwgICAgICAgICAgICAgfCAgaGUNCi1qZSAgICAgICAgICAgICB8ICBJDQotbGEgICAgICAgICAgICAgfCAgdGhlDQotbGUgICAgICAgICAgICAgfCAgdGhlDQotbGV1ciAgICAgICAgICAgfCAgdGhlaXINCi1sdWkgICAgICAgICAgICB8ICBoaW0NCi1tYSAgICAgICAgICAgICB8ICBteSAoZmVtKQ0KLW1haXMgICAgICAgICAgIHwgIGJ1dA0KLW1lICAgICAgICAgICAgIHwgIG1lDQotbcOqbWUgICAgICAgICAgIHwgIHNhbWU7IGFzIGluIG1vaS1tw6ptZSAobXlzZWxmKSBldGMNCi1tZXMgICAgICAgICAgICB8ICBtZSAocGwpDQotbW9pICAgICAgICAgICAgfCAgbWUNCi1tb24gICAgICAgICAgICB8ICBteSAobWFzYykNCi1uZSAgICAgICAgICAgICB8ICBub3QNCi1ub3MgICAgICAgICAgICB8ICBvdXIgKHBsKQ0KLW5vdHJlICAgICAgICAgIHwgIG91cg0KLW5vdXMgICAgICAgICAgIHwgIHdlDQotb24gICAgICAgICAgICAgfCAgb25lDQotb3UgICAgICAgICAgICAgfCAgd2hlcmUNCi1wYXIgICAgICAgICAgICB8ICBieQ0KLXBhcyAgICAgICAgICAgIHwgIG5vdA0KLXBvdXIgICAgICAgICAgIHwgIGZvcg0KLXF1ICAgICAgICAgICAgIHwgIHF1ZSBiZWZvcmUgdm93ZWwNCi1xdWUgICAgICAgICAgICB8ICB0aGF0DQotcXVpICAgICAgICAgICAgfCAgd2hvDQotc2EgICAgICAgICAgICAgfCAgaGlzLCBoZXIgKGZlbSkNCi1zZSAgICAgICAgICAgICB8ICBvbmVzZWxmDQotc2VzICAgICAgICAgICAgfCAgaGlzIChwbCkNCi1zb24gICAgICAgICAgICB8ICBoaXMsIGhlciAobWFzYykNCi1zdXIgICAgICAgICAgICB8ICBvbg0KLXRhICAgICAgICAgICAgIHwgIHRoeSAoZmVtKQ0KLXRlICAgICAgICAgICAgIHwgIHRoZWUNCi10ZXMgICAgICAgICAgICB8ICB0aHkgKHBsKQ0KLXRvaSAgICAgICAgICAgIHwgIHRoZWUNCi10b24gICAgICAgICAgICB8ICB0aHkgKG1hc2MpDQotdHUgICAgICAgICAgICAgfCAgdGhvdQ0KLXVuICAgICAgICAgICAgIHwgIGENCi11bmUgICAgICAgICAgICB8ICBhDQotdm9zICAgICAgICAgICAgfCAgeW91ciAocGwpDQotdm90cmUgICAgICAgICAgfCAgeW91cg0KLXZvdXMgICAgICAgICAgIHwgIHlvdQ0KLQ0KLSAgICAgICAgICAgICAgIHwgIHNpbmdsZSBsZXR0ZXIgZm9ybXMNCi0NCi1jICAgICAgICAgICAgICB8ICBjJw0KLWQgICAgICAgICAgICAgIHwgIGQnDQotaiAgICAgICAgICAgICAgfCAgaicNCi1sICAgICAgICAgICAgICB8ICBsJw0KLcOgICAgICAgICAgICAgICB8ICB0bywgYXQNCi1tICAgICAgICAgICAgICB8ICBtJw0KLW4gICAgICAgICAgICAgIHwgIG4nDQotcyAgICAgICAgICAgICAgfCAgcycNCi10ICAgICAgICAgICAgICB8ICB0Jw0KLXkgICAgICAgICAgICAgIHwgIHRoZXJlDQotDQotICAgICAgICAgICAgICAgfCBmb3JtcyBvZiDDqnRyZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6DQotw6l0w6kNCi3DqXTDqWUNCi3DqXTDqWVzDQotw6l0w6lzDQotw6l0YW50DQotc3Vpcw0KLWVzDQotZXN0DQotc29tbWVzDQotw6p0ZXMNCi1zb250DQotc2VyYWkNCi1zZXJhcw0KLXNlcmENCi1zZXJvbnMNCi1zZXJleg0KLXNlcm9udA0KLXNlcmFpcw0KLXNlcmFpdA0KLXNlcmlvbnMNCi1zZXJpZXoNCi1zZXJhaWVudA0KLcOpdGFpcw0KLcOpdGFpdA0KLcOpdGlvbnMNCi3DqXRpZXoNCi3DqXRhaWVudA0KLWZ1cw0KLWZ1dA0KLWbDu21lcw0KLWbDu3Rlcw0KLWZ1cmVudA0KLXNvaXMNCi1zb2l0DQotc295b25zDQotc295ZXoNCi1zb2llbnQNCi1mdXNzZQ0KLWZ1c3Nlcw0KLWbDu3QNCi1mdXNzaW9ucw0KLWZ1c3NpZXoNCi1mdXNzZW50DQotDQotICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBhdm9pciAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6DQotYXlhbnQNCi1ldQ0KLWV1ZQ0KLWV1ZXMNCi1ldXMNCi1haQ0KLWFzDQotYXZvbnMNCi1hdmV6DQotb250DQotYXVyYWkNCi1hdXJhcw0KLWF1cmENCi1hdXJvbnMNCi1hdXJleg0KLWF1cm9udA0KLWF1cmFpcw0KLWF1cmFpdA0KLWF1cmlvbnMNCi1hdXJpZXoNCi1hdXJhaWVudA0KLWF2YWlzDQotYXZhaXQNCi1hdmlvbnMNCi1hdmlleg0KLWF2YWllbnQNCi1ldXQNCi1lw7ttZXMNCi1lw7t0ZXMNCi1ldXJlbnQNCi1haWUNCi1haWVzDQotYWl0DQotYXlvbnMNCi1heWV6DQotYWllbnQNCi1ldXNzZQ0KLWV1c3Nlcw0KLWXDu3QNCi1ldXNzaW9ucw0KLWV1c3NpZXoNCi1ldXNzZW50DQotDQotICAgICAgICAgICAgICAgfCBMYXRlciBhZGRpdGlvbnMgKGZyb20gSmVhbi1DaHJpc3RvcGhlIERlc2NoYW1wcykNCi1jZWNpICAgICAgICAgICB8ICB0aGlzDQotY2VsYSAgICAgICAgICAgfCAgdGhhdA0KLWNlbMOgICAgICAgICAgICB8ICB0aGF0DQotY2V0ICAgICAgICAgICAgfCAgdGhpcw0KLWNldHRlICAgICAgICAgIHwgIHRoaXMNCi1pY2kgICAgICAgICAgICB8ICBoZXJlDQotaWxzICAgICAgICAgICAgfCAgdGhleQ0KLWxlcyAgICAgICAgICAgIHwgIHRoZSAocGwpDQotbGV1cnMgICAgICAgICAgfCAgdGhlaXIgKHBsKQ0KLXF1ZWwgICAgICAgICAgIHwgIHdoaWNoDQotcXVlbHMgICAgICAgICAgfCAgd2hpY2gNCi1xdWVsbGUgICAgICAgICB8ICB3aGljaA0KLXF1ZWxsZXMgICAgICAgIHwgIHdoaWNoDQotc2FucyAgICAgICAgICAgfCAgd2l0aG91dA0KLXNvaSAgICAgICAgICAgIHwgIG9uZXNlbGYNCi0NCisgfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL2ZyZW5jaC9zdG9wLnR4dAorIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KKyB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwCisgfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKKyB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguCisgfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuCisgfAorIHwgTk9URTogVG8gdXNlIHRoaXMgZmlsZSB3aXRoIFN0b3BGaWx0ZXJGYWN0b3J5LCB5b3UgbXVzdCBzcGVjaWZ5IGZvcm1hdD0ic25vd2JhbGwiCisKKyB8IEEgRnJlbmNoIHN0b3Agd29yZCBsaXN0LiBDb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gRWFjaCBzdG9wCisgfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisKK2F1ICAgICAgICAgICAgIHwgIGEgKyBsZQorYXV4ICAgICAgICAgICAgfCAgYSArIGxlcworYXZlYyAgICAgICAgICAgfCAgd2l0aAorY2UgICAgICAgICAgICAgfCAgdGhpcworY2VzICAgICAgICAgICAgfCAgdGhlc2UKK2RhbnMgICAgICAgICAgIHwgIHdpdGgKK2RlICAgICAgICAgICAgIHwgIG9mCitkZXMgICAgICAgICAgICB8ICBkZSArIGxlcworZHUgICAgICAgICAgICAgfCAgZGUgKyBsZQorZWxsZSAgICAgICAgICAgfCAgc2hlCitlbiAgICAgICAgICAgICB8ICBgb2YgdGhlbScgZXRjCitldCAgICAgICAgICAgICB8ICBhbmQKK2V1eCAgICAgICAgICAgIHwgIHRoZW0KK2lsICAgICAgICAgICAgIHwgIGhlCitqZSAgICAgICAgICAgICB8ICBJCitsYSAgICAgICAgICAgICB8ICB0aGUKK2xlICAgICAgICAgICAgIHwgIHRoZQorbGV1ciAgICAgICAgICAgfCAgdGhlaXIKK2x1aSAgICAgICAgICAgIHwgIGhpbQorbWEgICAgICAgICAgICAgfCAgbXkgKGZlbSkKK21haXMgICAgICAgICAgIHwgIGJ1dAorbWUgICAgICAgICAgICAgfCAgbWUKK23Dqm1lICAgICAgICAgICB8ICBzYW1lOyBhcyBpbiBtb2ktbcOqbWUgKG15c2VsZikgZXRjCittZXMgICAgICAgICAgICB8ICBtZSAocGwpCittb2kgICAgICAgICAgICB8ICBtZQorbW9uICAgICAgICAgICAgfCAgbXkgKG1hc2MpCituZSAgICAgICAgICAgICB8ICBub3QKK25vcyAgICAgICAgICAgIHwgIG91ciAocGwpCitub3RyZSAgICAgICAgICB8ICBvdXIKK25vdXMgICAgICAgICAgIHwgIHdlCitvbiAgICAgICAgICAgICB8ICBvbmUKK291ICAgICAgICAgICAgIHwgIHdoZXJlCitwYXIgICAgICAgICAgICB8ICBieQorcGFzICAgICAgICAgICAgfCAgbm90Citwb3VyICAgICAgICAgICB8ICBmb3IKK3F1ICAgICAgICAgICAgIHwgIHF1ZSBiZWZvcmUgdm93ZWwKK3F1ZSAgICAgICAgICAgIHwgIHRoYXQKK3F1aSAgICAgICAgICAgIHwgIHdobworc2EgICAgICAgICAgICAgfCAgaGlzLCBoZXIgKGZlbSkKK3NlICAgICAgICAgICAgIHwgIG9uZXNlbGYKK3NlcyAgICAgICAgICAgIHwgIGhpcyAocGwpCitzb24gICAgICAgICAgICB8ICBoaXMsIGhlciAobWFzYykKK3N1ciAgICAgICAgICAgIHwgIG9uCit0YSAgICAgICAgICAgICB8ICB0aHkgKGZlbSkKK3RlICAgICAgICAgICAgIHwgIHRoZWUKK3RlcyAgICAgICAgICAgIHwgIHRoeSAocGwpCit0b2kgICAgICAgICAgICB8ICB0aGVlCit0b24gICAgICAgICAgICB8ICB0aHkgKG1hc2MpCit0dSAgICAgICAgICAgICB8ICB0aG91Cit1biAgICAgICAgICAgICB8ICBhCit1bmUgICAgICAgICAgICB8ICBhCit2b3MgICAgICAgICAgICB8ICB5b3VyIChwbCkKK3ZvdHJlICAgICAgICAgIHwgIHlvdXIKK3ZvdXMgICAgICAgICAgIHwgIHlvdQorCisgICAgICAgICAgICAgICB8ICBzaW5nbGUgbGV0dGVyIGZvcm1zCisKK2MgICAgICAgICAgICAgIHwgIGMnCitkICAgICAgICAgICAgICB8ICBkJworaiAgICAgICAgICAgICAgfCAgaicKK2wgICAgICAgICAgICAgIHwgIGwnCivDoCAgICAgICAgICAgICAgfCAgdG8sIGF0CittICAgICAgICAgICAgICB8ICBtJworbiAgICAgICAgICAgICAgfCAgbicKK3MgICAgICAgICAgICAgIHwgIHMnCit0ICAgICAgICAgICAgICB8ICB0JworeSAgICAgICAgICAgICAgfCAgdGhlcmUKKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiDDqnRyZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6CivDqXTDqQorw6l0w6llCivDqXTDqWVzCivDqXTDqXMKK8OpdGFudAorc3VpcworZXMKK2VzdAorc29tbWVzCivDqnRlcworc29udAorc2VyYWkKK3NlcmFzCitzZXJhCitzZXJvbnMKK3NlcmV6CitzZXJvbnQKK3NlcmFpcworc2VyYWl0CitzZXJpb25zCitzZXJpZXoKK3NlcmFpZW50CivDqXRhaXMKK8OpdGFpdAorw6l0aW9ucworw6l0aWV6CivDqXRhaWVudAorZnVzCitmdXQKK2bDu21lcworZsO7dGVzCitmdXJlbnQKK3NvaXMKK3NvaXQKK3NveW9ucworc295ZXoKK3NvaWVudAorZnVzc2UKK2Z1c3NlcworZsO7dAorZnVzc2lvbnMKK2Z1c3NpZXoKK2Z1c3NlbnQKKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBhdm9pciAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6CitheWFudAorZXUKK2V1ZQorZXVlcworZXVzCithaQorYXMKK2F2b25zCithdmV6CitvbnQKK2F1cmFpCithdXJhcworYXVyYQorYXVyb25zCithdXJlegorYXVyb250CithdXJhaXMKK2F1cmFpdAorYXVyaW9ucworYXVyaWV6CithdXJhaWVudAorYXZhaXMKK2F2YWl0CithdmlvbnMKK2F2aWV6CithdmFpZW50CitldXQKK2XDu21lcworZcO7dGVzCitldXJlbnQKK2FpZQorYWllcworYWl0CitheW9ucworYXllegorYWllbnQKK2V1c3NlCitldXNzZXMKK2XDu3QKK2V1c3Npb25zCitldXNzaWV6CitldXNzZW50CisKKyAgICAgICAgICAgICAgIHwgTGF0ZXIgYWRkaXRpb25zIChmcm9tIEplYW4tQ2hyaXN0b3BoZSBEZXNjaGFtcHMpCitjZWNpICAgICAgICAgICB8ICB0aGlzCitjZWxhICAgICAgICAgICB8ICB0aGF0CitjZWzDoCAgICAgICAgICAgfCAgdGhhdAorY2V0ICAgICAgICAgICAgfCAgdGhpcworY2V0dGUgICAgICAgICAgfCAgdGhpcworaWNpICAgICAgICAgICAgfCAgaGVyZQoraWxzICAgICAgICAgICAgfCAgdGhleQorbGVzICAgICAgICAgICAgfCAgdGhlIChwbCkKK2xldXJzICAgICAgICAgIHwgIHRoZWlyIChwbCkKK3F1ZWwgICAgICAgICAgIHwgIHdoaWNoCitxdWVscyAgICAgICAgICB8ICB3aGljaAorcXVlbGxlICAgICAgICAgfCAgd2hpY2gKK3F1ZWxsZXMgICAgICAgIHwgIHdoaWNoCitzYW5zICAgICAgICAgICB8ICB3aXRob3V0Citzb2kgICAgICAgICAgICB8ICBvbmVzZWxmCisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZ2EudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19nYS50eHQKaW5kZXggZjAzZTEwYS4uOWZmODhkNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19nYS50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19nYS50eHQKQEAgLTEsMTEwICsxLDExMCBAQAotDQotYQ0KLWFjaA0KLWFnDQotYWd1cw0KLWFuDQotYW9uDQotYXINCi1hcm5hDQotYXMNCi1iJw0KLWJhDQotYmVpcnQNCi1iaMO6cg0KLWNhb2dhDQotY2VhdGhhaXINCi1jZWF0aHJhcg0KLWNob21oDQotY2h0w7MNCi1jaHVpZw0KLWNodW4NCi1jb2lzDQotY8OpYWQNCi1jw7ppZw0KLWPDumlnZWFyDQotZCcNCi1kYWljaGVhZA0KLWRhcg0KLWRlDQotZGVpY2gNCi1kZWljaG5pw7pyDQotZGVuDQotZGjDoQ0KLWRvDQotZG9uDQotZHTDrQ0KLWTDoQ0KLWTDoXINCi1kw7MNCi1mYW9pDQotZmFvaW4NCi1mYW9pbmENCi1mYW9pbsOhcg0KLWZhcmENCi1maWNoZQ0KLWdhY2gNCi1nYW4NCi1nbw0KLWd1cg0KLWhhb24NCi1ob2NodA0KLWkNCi1pYWQNCi1pZGlyDQotaW4NCi1pbmENCi1pbnMNCi1pbsOhcg0KLWlzDQotbGUNCi1sZWlzDQotbGVuYQ0KLWxlbsOhcg0KLW0nDQotbWFyDQotbW8NCi1tw6kNCi1uYQ0KLW5hY2gNCi1uYW9pDQotbmFvbsO6cg0KLW7DoQ0KLW7DrQ0KLW7DrW9yDQotbsOzDQotbsOzY2hhDQotb2NodA0KLW9jaHRhcg0KLW9zDQotcm9pbWgNCi1zYQ0KLXNlYWNodA0KLXNlYWNodGFyDQotc2VhY2h0w7MNCi1zZWFzY2ENCi1zZWlzZWFyDQotc2lhZA0KLXNpYmgNCi1zaW5uDQotc25hDQotc8OpDQotc8OtDQotdGFyDQotdGhhcg0KLXRow7oNCi10cmnDunINCi10csOtDQotdHLDrW5hDQotdHLDrW7DoXINCi10csOtb2NoYQ0KLXTDug0KLXVtDQotw6FyDQotw6kNCi3DqWlzDQotw60NCi3Dsw0KLcOzbg0KLcOzbmENCi3Ds27DoXINCisKK2EKK2FjaAorYWcKK2FndXMKK2FuCithb24KK2FyCithcm5hCithcworYicKK2JhCitiZWlydAorYmjDunIKK2Nhb2dhCitjZWF0aGFpcgorY2VhdGhyYXIKK2Nob21oCitjaHTDsworY2h1aWcKK2NodW4KK2NvaXMKK2PDqWFkCitjw7ppZworY8O6aWdlYXIKK2QnCitkYWljaGVhZAorZGFyCitkZQorZGVpY2gKK2RlaWNobmnDunIKK2RlbgorZGjDoQorZG8KK2RvbgorZHTDrQorZMOhCitkw6FyCitkw7MKK2Zhb2kKK2Zhb2luCitmYW9pbmEKK2Zhb2luw6FyCitmYXJhCitmaWNoZQorZ2FjaAorZ2FuCitnbworZ3VyCitoYW9uCitob2NodAoraQoraWFkCitpZGlyCitpbgoraW5hCitpbnMKK2luw6FyCitpcworbGUKK2xlaXMKK2xlbmEKK2xlbsOhcgorbScKK21hcgorbW8KK23DqQorbmEKK25hY2gKK25hb2kKK25hb27DunIKK27DoQorbsOtCituw61vcgorbsOzCituw7NjaGEKK29jaHQKK29jaHRhcgorb3MKK3JvaW1oCitzYQorc2VhY2h0CitzZWFjaHRhcgorc2VhY2h0w7MKK3NlYXNjYQorc2Vpc2Vhcgorc2lhZAorc2liaAorc2lubgorc25hCitzw6kKK3PDrQordGFyCit0aGFyCit0aMO6Cit0cmnDunIKK3Ryw60KK3Ryw61uYQordHLDrW7DoXIKK3Ryw61vY2hhCit0w7oKK3VtCivDoXIKK8OpCivDqWlzCivDrQorw7MKK8Ozbgorw7NuYQorw7Nuw6FyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2dsLnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZ2wudHh0CmluZGV4IDU3ODAzYjMuLmQ4NzYwYjEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZ2wudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfZ2wudHh0CkBAIC0xLDE2MSArMSwxNjEgQEAKLSMgZ2FsaWNhbiBzdG9wd29yZHMNCi1hDQotYcOtbmRhDQotYWzDrQ0KLWFxdWVsDQotYXF1ZWxhDQotYXF1ZWxhcw0KLWFxdWVsZXMNCi1hcXVpbG8NCi1hcXXDrQ0KLWFvDQotYW9zDQotYXMNCi1hc8OtDQotw6ENCi1iZW4NCi1jYW5kbw0KLWNoZQ0KLWNvDQotY29hDQotY29taWdvDQotY29uDQotY29ubm9zY28NCi1jb250aWdvDQotY29udm9zY28NCi1jb2FzDQotY29zDQotY3VuDQotY3Vucw0KLWN1bmhhDQotY3VuaGFzDQotZGENCi1kYWxndW5oYQ0KLWRhbGd1bmhhcw0KLWRhbGfDum4NCi1kYWxnw7pucw0KLWRhcw0KLWRlDQotZGVsDQotZGVsYQ0KLWRlbGFzDQotZGVsZXMNCi1kZXNkZQ0KLWRlc3RlDQotZG8NCi1kb3MNCi1kdW4NCi1kdW5zDQotZHVuaGENCi1kdW5oYXMNCi1lDQotZWwNCi1lbGENCi1lbGFzDQotZWxlcw0KLWVuDQotZXJhDQotZXJhbg0KLWVzYQ0KLWVzYXMNCi1lc2UNCi1lc2VzDQotZXN0YQ0KLWVzdGFyDQotZXN0YWJhDQotZXN0w6ENCi1lc3TDoW4NCi1lc3RlDQotZXN0ZXMNCi1lc3RpdmVuDQotZXN0b3UNCi1ldQ0KLcOpDQotZmFjZXINCi1mb2kNCi1mb3Jvbg0KLWZ1bg0KLWhhYsOtYQ0KLWhhaQ0KLWlzbw0KLWlzdG8NCi1sYQ0KLWxhcw0KLWxsZQ0KLWxsZXMNCi1sbw0KLWxvcw0KLW1haXMNCi1tZQ0KLW1ldQ0KLW1ldXMNCi1taW4NCi1tacOxYQ0KLW1pw7Fhcw0KLW1vaQ0KLW5hDQotbmFzDQotbmVzdGUNCi1uaW4NCi1ubw0KLW5vbg0KLW5vcw0KLW5vc2ENCi1ub3Nhcw0KLW5vc28NCi1ub3Nvcw0KLW7Ds3MNCi1udW4NCi1udW5oYQ0KLW51bnMNCi1udW5oYXMNCi1vDQotb3MNCi1vdQ0KLcOzDQotw7NzDQotcGFyYQ0KLXBlcm8NCi1wb2RlDQotcG9pcw0KLXBvbGENCi1wb2xhcw0KLXBvbG8NCi1wb2xvcw0KLXBvcg0KLXF1ZQ0KLXNlDQotc2Vuw7NuDQotc2VyDQotc2V1DQotc2V1cw0KLXNleGENCi1zaWRvDQotc29icmUNCi1zw7phDQotc8O6YXMNCi10YW3DqW4NCi10YW4NCi10ZQ0KLXRlbg0KLXRlw7Flbg0KLXRlw7FvDQotdGVyDQotdGV1DQotdGV1cw0KLXRpDQotdGlkbw0KLXRpw7FhDQotdGl2ZW4NCi10w7phDQotdMO6YXMNCi11bg0KLXVuaGENCi11bmhhcw0KLXVucw0KLXZvcw0KLXZvc2ENCi12b3Nhcw0KLXZvc28NCi12b3Nvcw0KLXbDs3MNCisjIGdhbGljYW4gc3RvcHdvcmRzCithCithw61uZGEKK2Fsw60KK2FxdWVsCithcXVlbGEKK2FxdWVsYXMKK2FxdWVsZXMKK2FxdWlsbworYXF1w60KK2FvCithb3MKK2FzCithc8OtCivDoQorYmVuCitjYW5kbworY2hlCitjbworY29hCitjb21pZ28KK2NvbgorY29ubm9zY28KK2NvbnRpZ28KK2NvbnZvc2NvCitjb2FzCitjb3MKK2N1bgorY3VucworY3VuaGEKK2N1bmhhcworZGEKK2RhbGd1bmhhCitkYWxndW5oYXMKK2RhbGfDum4KK2RhbGfDum5zCitkYXMKK2RlCitkZWwKK2RlbGEKK2RlbGFzCitkZWxlcworZGVzZGUKK2Rlc3RlCitkbworZG9zCitkdW4KK2R1bnMKK2R1bmhhCitkdW5oYXMKK2UKK2VsCitlbGEKK2VsYXMKK2VsZXMKK2VuCitlcmEKK2VyYW4KK2VzYQorZXNhcworZXNlCitlc2VzCitlc3RhCitlc3RhcgorZXN0YWJhCitlc3TDoQorZXN0w6FuCitlc3RlCitlc3RlcworZXN0aXZlbgorZXN0b3UKK2V1CivDqQorZmFjZXIKK2ZvaQorZm9yb24KK2Z1bgoraGFiw61hCitoYWkKK2lzbworaXN0bworbGEKK2xhcworbGxlCitsbGVzCitsbworbG9zCittYWlzCittZQorbWV1CittZXVzCittaW4KK21pw7FhCittacOxYXMKK21vaQorbmEKK25hcworbmVzdGUKK25pbgorbm8KK25vbgorbm9zCitub3NhCitub3Nhcworbm9zbworbm9zb3MKK27Ds3MKK251bgorbnVuaGEKK251bnMKK251bmhhcworbworb3MKK291CivDsworw7NzCitwYXJhCitwZXJvCitwb2RlCitwb2lzCitwb2xhCitwb2xhcworcG9sbworcG9sb3MKK3BvcgorcXVlCitzZQorc2Vuw7NuCitzZXIKK3NldQorc2V1cworc2V4YQorc2lkbworc29icmUKK3PDumEKK3PDumFzCit0YW3DqW4KK3RhbgordGUKK3RlbgordGXDsWVuCit0ZcOxbwordGVyCit0ZXUKK3RldXMKK3RpCit0aWRvCit0acOxYQordGl2ZW4KK3TDumEKK3TDumFzCit1bgordW5oYQordW5oYXMKK3Vucwordm9zCit2b3NhCit2b3Nhcwordm9zbwordm9zb3MKK3bDs3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfaGkudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19oaS50eHQKaW5kZXggMWYxOWZkMS4uODYyODZiYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19oaS50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19oaS50eHQKQEAgLTEsMjM1ICsxLDIzNSBAQAotIyBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwNCi0jIFNlZSBodHRwOi8vbWVtYmVycy51bmluZS5jaC9qYWNxdWVzLnNhdm95L2NsZWYvaW5kZXguaHRtbC4NCi0jIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSBKYWNxdWVzIFNhdm95IGFuZCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuDQotIyBOb3RlOiBieSBkZWZhdWx0IHRoaXMgZmlsZSBhbHNvIGNvbnRhaW5zIGZvcm1zIG5vcm1hbGl6ZWQgYnkgSGluZGlOb3JtYWxpemVyIA0KLSMgZm9yIHNwZWxsaW5nIHZhcmlhdGlvbiAoc2VlIHNlY3Rpb24gYmVsb3cpLCBzdWNoIHRoYXQgaXQgY2FuIGJlIHVzZWQgd2hldGhlciBvciANCi0jIG5vdCB5b3UgZW5hYmxlIHRoYXQgZmVhdHVyZS4gV2hlbiBhZGRpbmcgYWRkaXRpb25hbCBlbnRyaWVzIHRvIHRoaXMgbGlzdCwNCi0jIHBsZWFzZSBhZGQgdGhlIG5vcm1hbGl6ZWQgZm9ybSBhcyB3ZWxsLiANCi3gpIXgpILgpKbgpLANCi3gpIXgpKQNCi3gpIXgpKrgpKjgpL4NCi3gpIXgpKrgpKjgpYANCi3gpIXgpKrgpKjgpYcNCi3gpIXgpK3gpYANCi3gpIbgpKbgpL8NCi3gpIbgpKoNCi3gpIfgpKTgpY3gpK/gpL7gpKbgpL8NCi3gpIfgpKggDQot4KSH4KSo4KSV4KS+DQot4KSH4KSo4KWN4KS54KWA4KSCDQot4KSH4KSo4KWN4KS54KWH4KSCDQot4KSH4KSo4KWN4KS54KWL4KSCDQot4KSH4KS4DQot4KSH4KS44KSV4KS+DQot4KSH4KS44KSV4KWADQot4KSH4KS44KSV4KWHDQot4KSH4KS44KSu4KWH4KSCDQot4KSH4KS44KWADQot4KSH4KS44KWHDQot4KSJ4KSoDQot4KSJ4KSo4KSV4KS+DQot4KSJ4KSo4KSV4KWADQot4KSJ4KSo4KSV4KWHDQot4KSJ4KSo4KSV4KWLDQot4KSJ4KSo4KWN4KS54KWA4KSCDQot4KSJ4KSo4KWN4KS54KWH4KSCDQot4KSJ4KSo4KWN4KS54KWL4KSCDQot4KSJ4KS4DQot4KSJ4KS44KSV4KWHDQot4KSJ4KS44KWADQot4KSJ4KS44KWHDQot4KSP4KSVDQot4KSP4KS14KSCDQot4KSP4KS4DQot4KSQ4KS44KWHDQot4KSU4KSwDQot4KSV4KSIDQot4KSV4KSwDQot4KSV4KSw4KSk4KS+DQot4KSV4KSw4KSk4KWHDQot4KSV4KSw4KSo4KS+DQot4KSV4KSw4KSo4KWHDQot4KSV4KSw4KWH4KSCDQot4KSV4KS54KSk4KWHDQot4KSV4KS54KS+DQot4KSV4KS+DQot4KSV4KS+4KWe4KWADQot4KSV4KS/DQot4KSV4KS/4KSk4KSo4KS+DQot4KSV4KS/4KSo4KWN4KS54KWH4KSCDQot4KSV4KS/4KSo4KWN4KS54KWL4KSCDQot4KSV4KS/4KSv4KS+DQot4KSV4KS/4KSwDQot4KSV4KS/4KS4DQot4KSV4KS/4KS44KWADQot4KSV4KS/4KS44KWHDQot4KSV4KWADQot4KSV4KWB4KSbDQot4KSV4KWB4KSyDQot4KSV4KWHDQot4KSV4KWLDQot4KSV4KWL4KSIDQot4KSV4KWM4KSoDQot4KSV4KWM4KSo4KS44KS+DQot4KSX4KSv4KS+DQot4KSY4KSwDQot4KSc4KSsDQot4KSc4KS54KS+4KSBDQot4KSc4KS+DQot4KSc4KS/4KSk4KSo4KS+DQot4KSc4KS/4KSoDQot4KSc4KS/4KSo4KWN4KS54KWH4KSCDQot4KSc4KS/4KSo4KWN4KS54KWL4KSCDQot4KSc4KS/4KS4DQot4KSc4KS/4KS44KWHDQot4KSc4KWA4KSn4KSwDQot4KSc4KWI4KS44KS+DQot4KSc4KWI4KS44KWHDQot4KSc4KWLDQot4KSk4KSVDQot4KSk4KSsDQot4KSk4KSw4KS5DQot4KSk4KS/4KSoDQot4KSk4KS/4KSo4KWN4KS54KWH4KSCDQot4KSk4KS/4KSo4KWN4KS54KWL4KSCDQot4KSk4KS/4KS4DQot4KSk4KS/4KS44KWHDQot4KSk4KWLDQot4KSl4KS+DQot4KSl4KWADQot4KSl4KWHDQot4KSm4KSs4KS+4KSw4KS+DQot4KSm4KS/4KSv4KS+DQot4KSm4KWB4KS44KSw4KS+DQot4KSm4KWC4KS44KSw4KWHDQot4KSm4KWLDQot4KSm4KWN4KS14KS+4KSw4KS+DQot4KSoDQot4KSo4KS54KWA4KSCDQot4KSo4KS+DQot4KSo4KS/4KS54KS+4KSv4KSkDQot4KSo4KWA4KSa4KWHDQot4KSo4KWHDQot4KSq4KSwDQot4KSq4KSwICANCi3gpKrgpLngpLLgpYcNCi3gpKrgpYLgpLDgpL4NCi3gpKrgpYcNCi3gpKvgpL/gpLANCi3gpKzgpKjgpYANCi3gpKzgpLngpYANCi3gpKzgpLngpYHgpKQNCi3gpKzgpL7gpKYNCi3gpKzgpL7gpLLgpL4NCi3gpKzgpL/gpLLgpJXgpYHgpLINCi3gpK3gpYANCi3gpK3gpYDgpKTgpLANCi3gpK7gpJfgpLANCi3gpK7gpL7gpKjgpYsNCi3gpK7gpYcNCi3gpK7gpYfgpIINCi3gpK/gpKbgpL8NCi3gpK/gpLkNCi3gpK/gpLngpL7gpIENCi3gpK/gpLngpYANCi3gpK/gpL4NCi3gpK/gpL/gpLkgDQot4KSv4KWHDQot4KSw4KSW4KWH4KSCDQot4KSw4KS54KS+DQot4KSw4KS54KWHDQot4KSx4KWN4KS14KS+4KS44KS+DQot4KSy4KS/4KSPDQot4KSy4KS/4KSv4KWHDQot4KSy4KWH4KSV4KS/4KSoDQot4KS1DQot4KS14KSw4KWN4KSXDQot4KS14KS5DQot4KS14KS5IA0KLeCkteCkueCkvuCkgQ0KLeCkteCkueClgOCkgg0KLeCkteCkvuCksuClhw0KLeCkteClgeCkuSANCi3gpLXgpYcNCi3gpLXgpZrgpYjgpLDgpLkNCi3gpLjgpILgpJcNCi3gpLjgpJXgpKTgpL4NCi3gpLjgpJXgpKTgpYcNCi3gpLjgpKzgpLjgpYcNCi3gpLjgpK3gpYANCi3gpLjgpL7gpKUNCi3gpLjgpL7gpKzgpYHgpKQNCi3gpLjgpL7gpK0NCi3gpLjgpL7gpLDgpL4NCi3gpLjgpYcNCi3gpLjgpYsNCi3gpLngpYANCi3gpLngpYHgpIYNCi3gpLngpYHgpIgNCi3gpLngpYHgpI8NCi3gpLngpYgNCi3gpLngpYjgpIINCi3gpLngpYsNCi3gpLngpYvgpKTgpL4NCi3gpLngpYvgpKTgpYANCi3gpLngpYvgpKTgpYcNCi3gpLngpYvgpKjgpL4NCi3gpLngpYvgpKjgpYcNCi0jIGFkZGl0aW9uYWwgbm9ybWFsaXplZCBmb3JtcyBvZiB0aGUgYWJvdmUNCi3gpIXgpKrgpKjgpL8NCi3gpJzgpYfgpLjgpYcNCi3gpLngpYvgpKTgpL8NCi3gpLjgpK3gpL8NCi3gpKTgpL/gpILgpLngpYvgpIINCi3gpIfgpILgpLngpYvgpIINCi3gpKbgpLXgpL7gpLDgpL4NCi3gpIfgpLjgpL8NCi3gpJXgpL/gpILgpLngpYfgpIINCi3gpKXgpL8NCi3gpIngpILgpLngpYvgpIINCi3gpJPgpLANCi3gpJzgpL/gpILgpLngpYfgpIINCi3gpLXgpLngpL/gpIINCi3gpIXgpK3gpL8NCi3gpKzgpKjgpL8NCi3gpLngpL8NCi3gpIngpILgpLngpL/gpIINCi3gpIngpILgpLngpYfgpIINCi3gpLngpYfgpIINCi3gpLXgpJfgpYfgpLDgpLkNCi3gpI/gpLjgpYcNCi3gpLDgpLXgpL7gpLjgpL4NCi3gpJXgpYvgpKgNCi3gpKjgpL/gpJrgpYcNCi3gpJXgpL7gpKvgpL8NCi3gpIngpLjgpL8NCi3gpKrgpYHgpLDgpL4NCi3gpK3gpL/gpKTgpLANCi3gpLngpYcNCi3gpKzgpLngpL8NCi3gpLXgpLngpL7gpIINCi3gpJXgpYvgpIcNCi3gpK/gpLngpL7gpIINCi3gpJzgpL/gpILgpLngpYvgpIINCi3gpKTgpL/gpILgpLngpYfgpIINCi3gpJXgpL/gpLjgpL8NCi3gpJXgpIcNCi3gpK/gpLngpL8NCi3gpIfgpILgpLngpL/gpIINCi3gpJzgpL/gpKfgpLANCi3gpIfgpILgpLngpYfgpIINCi3gpIXgpKbgpL8NCi3gpIfgpKTgpK/gpL7gpKbgpL8NCi3gpLngpYHgpIcNCi3gpJXgpYvgpKjgpLjgpL4NCi3gpIfgpLjgpJXgpL8NCi3gpKbgpYHgpLjgpLDgpYcNCi3gpJzgpLngpL7gpIINCi3gpIXgpKoNCi3gpJXgpL/gpILgpLngpYvgpIINCi3gpIngpKjgpJXgpL8NCi3gpK3gpL8NCi3gpLXgpLDgpJcNCi3gpLngpYHgpIUNCi3gpJzgpYfgpLjgpL4NCi3gpKjgpLngpL/gpIINCisjIEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIyBTZWUgaHR0cDovL21lbWJlcnMudW5pbmUuY2gvamFjcXVlcy5zYXZveS9jbGVmL2luZGV4Lmh0bWwuCisjIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSBKYWNxdWVzIFNhdm95IGFuZCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuCisjIE5vdGU6IGJ5IGRlZmF1bHQgdGhpcyBmaWxlIGFsc28gY29udGFpbnMgZm9ybXMgbm9ybWFsaXplZCBieSBIaW5kaU5vcm1hbGl6ZXIgCisjIGZvciBzcGVsbGluZyB2YXJpYXRpb24gKHNlZSBzZWN0aW9uIGJlbG93KSwgc3VjaCB0aGF0IGl0IGNhbiBiZSB1c2VkIHdoZXRoZXIgb3IgCisjIG5vdCB5b3UgZW5hYmxlIHRoYXQgZmVhdHVyZS4gV2hlbiBhZGRpbmcgYWRkaXRpb25hbCBlbnRyaWVzIHRvIHRoaXMgbGlzdCwKKyMgcGxlYXNlIGFkZCB0aGUgbm9ybWFsaXplZCBmb3JtIGFzIHdlbGwuIAor4KSF4KSC4KSm4KSwCivgpIXgpKQKK+CkheCkquCkqOCkvgor4KSF4KSq4KSo4KWACivgpIXgpKrgpKjgpYcKK+CkheCkreClgAor4KSG4KSm4KS/CivgpIbgpKoKK+Ckh+CkpOCljeCkr+CkvuCkpuCkvwor4KSH4KSoIAor4KSH4KSo4KSV4KS+CivgpIfgpKjgpY3gpLngpYDgpIIKK+Ckh+CkqOCljeCkueClh+Ckggor4KSH4KSo4KWN4KS54KWL4KSCCivgpIfgpLgKK+Ckh+CkuOCkleCkvgor4KSH4KS44KSV4KWACivgpIfgpLjgpJXgpYcKK+Ckh+CkuOCkruClh+Ckggor4KSH4KS44KWACivgpIfgpLjgpYcKK+CkieCkqAor4KSJ4KSo4KSV4KS+CivgpIngpKjgpJXgpYAKK+CkieCkqOCkleClhwor4KSJ4KSo4KSV4KWLCivgpIngpKjgpY3gpLngpYDgpIIKK+CkieCkqOCljeCkueClh+Ckggor4KSJ4KSo4KWN4KS54KWL4KSCCivgpIngpLgKK+CkieCkuOCkleClhwor4KSJ4KS44KWACivgpIngpLjgpYcKK+Ckj+CklQor4KSP4KS14KSCCivgpI/gpLgKK+CkkOCkuOClhwor4KSU4KSwCivgpJXgpIgKK+CkleCksAor4KSV4KSw4KSk4KS+CivgpJXgpLDgpKTgpYcKK+CkleCksOCkqOCkvgor4KSV4KSw4KSo4KWHCivgpJXgpLDgpYfgpIIKK+CkleCkueCkpOClhwor4KSV4KS54KS+CivgpJXgpL4KK+CkleCkvuClnuClgAor4KSV4KS/CivgpJXgpL/gpKTgpKjgpL4KK+CkleCkv+CkqOCljeCkueClh+Ckggor4KSV4KS/4KSo4KWN4KS54KWL4KSCCivgpJXgpL/gpK/gpL4KK+CkleCkv+CksAor4KSV4KS/4KS4CivgpJXgpL/gpLjgpYAKK+CkleCkv+CkuOClhwor4KSV4KWACivgpJXgpYHgpJsKK+CkleClgeCksgor4KSV4KWHCivgpJXgpYsKK+CkleCli+CkiAor4KSV4KWM4KSoCivgpJXgpYzgpKjgpLjgpL4KK+Ckl+Ckr+Ckvgor4KSY4KSwCivgpJzgpKwKK+CknOCkueCkvuCkgQor4KSc4KS+CivgpJzgpL/gpKTgpKjgpL4KK+CknOCkv+CkqAor4KSc4KS/4KSo4KWN4KS54KWH4KSCCivgpJzgpL/gpKjgpY3gpLngpYvgpIIKK+CknOCkv+CkuAor4KSc4KS/4KS44KWHCivgpJzgpYDgpKfgpLAKK+CknOCliOCkuOCkvgor4KSc4KWI4KS44KWHCivgpJzgpYsKK+CkpOCklQor4KSk4KSsCivgpKTgpLDgpLkKK+CkpOCkv+CkqAor4KSk4KS/4KSo4KWN4KS54KWH4KSCCivgpKTgpL/gpKjgpY3gpLngpYvgpIIKK+CkpOCkv+CkuAor4KSk4KS/4KS44KWHCivgpKTgpYsKK+CkpeCkvgor4KSl4KWACivgpKXgpYcKK+CkpuCkrOCkvuCksOCkvgor4KSm4KS/4KSv4KS+CivgpKbgpYHgpLjgpLDgpL4KK+CkpuClguCkuOCksOClhwor4KSm4KWLCivgpKbgpY3gpLXgpL7gpLDgpL4KK+CkqAor4KSo4KS54KWA4KSCCivgpKjgpL4KK+CkqOCkv+CkueCkvuCkr+CkpAor4KSo4KWA4KSa4KWHCivgpKjgpYcKK+CkquCksAor4KSq4KSwICAKK+CkquCkueCksuClhwor4KSq4KWC4KSw4KS+CivgpKrgpYcKK+Ckq+Ckv+CksAor4KSs4KSo4KWACivgpKzgpLngpYAKK+CkrOCkueClgeCkpAor4KSs4KS+4KSmCivgpKzgpL7gpLLgpL4KK+CkrOCkv+CksuCkleClgeCksgor4KSt4KWACivgpK3gpYDgpKTgpLAKK+CkruCkl+CksAor4KSu4KS+4KSo4KWLCivgpK7gpYcKK+CkruClh+Ckggor4KSv4KSm4KS/CivgpK/gpLkKK+Ckr+CkueCkvuCkgQor4KSv4KS54KWACivgpK/gpL4KK+Ckr+Ckv+CkuSAKK+Ckr+Clhwor4KSw4KSW4KWH4KSCCivgpLDgpLngpL4KK+CksOCkueClhwor4KSx4KWN4KS14KS+4KS44KS+CivgpLLgpL/gpI8KK+CksuCkv+Ckr+Clhwor4KSy4KWH4KSV4KS/4KSoCivgpLUKK+CkteCksOCljeCklwor4KS14KS5CivgpLXgpLkgCivgpLXgpLngpL7gpIEKK+CkteCkueClgOCkggor4KS14KS+4KSy4KWHCivgpLXgpYHgpLkgCivgpLXgpYcKK+CkteClmuCliOCksOCkuQor4KS44KSC4KSXCivgpLjgpJXgpKTgpL4KK+CkuOCkleCkpOClhwor4KS44KSs4KS44KWHCivgpLjgpK3gpYAKK+CkuOCkvuCkpQor4KS44KS+4KSs4KWB4KSkCivgpLjgpL7gpK0KK+CkuOCkvuCksOCkvgor4KS44KWHCivgpLjgpYsKK+CkueClgAor4KS54KWB4KSGCivgpLngpYHgpIgKK+CkueClgeCkjwor4KS54KWICivgpLngpYjgpIIKK+CkueCliwor4KS54KWL4KSk4KS+CivgpLngpYvgpKTgpYAKK+CkueCli+CkpOClhwor4KS54KWL4KSo4KS+CivgpLngpYvgpKjgpYcKKyMgYWRkaXRpb25hbCBub3JtYWxpemVkIGZvcm1zIG9mIHRoZSBhYm92ZQor4KSF4KSq4KSo4KS/CivgpJzgpYfgpLjgpYcKK+CkueCli+CkpOCkvwor4KS44KSt4KS/CivgpKTgpL/gpILgpLngpYvgpIIKK+Ckh+CkguCkueCli+Ckggor4KSm4KS14KS+4KSw4KS+CivgpIfgpLjgpL8KK+CkleCkv+CkguCkueClh+Ckggor4KSl4KS/CivgpIngpILgpLngpYvgpIIKK+Ckk+CksAor4KSc4KS/4KSC4KS54KWH4KSCCivgpLXgpLngpL/gpIIKK+CkheCkreCkvwor4KSs4KSo4KS/CivgpLngpL8KK+CkieCkguCkueCkv+Ckggor4KSJ4KSC4KS54KWH4KSCCivgpLngpYfgpIIKK+CkteCkl+Clh+CksOCkuQor4KSP4KS44KWHCivgpLDgpLXgpL7gpLjgpL4KK+CkleCli+CkqAor4KSo4KS/4KSa4KWHCivgpJXgpL7gpKvgpL8KK+CkieCkuOCkvwor4KSq4KWB4KSw4KS+CivgpK3gpL/gpKTgpLAKK+CkueClhwor4KSs4KS54KS/CivgpLXgpLngpL7gpIIKK+CkleCli+Ckhwor4KSv4KS54KS+4KSCCivgpJzgpL/gpILgpLngpYvgpIIKK+CkpOCkv+CkguCkueClh+Ckggor4KSV4KS/4KS44KS/CivgpJXgpIcKK+Ckr+CkueCkvwor4KSH4KSC4KS54KS/4KSCCivgpJzgpL/gpKfgpLAKK+Ckh+CkguCkueClh+Ckggor4KSF4KSm4KS/CivgpIfgpKTgpK/gpL7gpKbgpL8KK+CkueClgeCkhwor4KSV4KWL4KSo4KS44KS+CivgpIfgpLjgpJXgpL8KK+CkpuClgeCkuOCksOClhwor4KSc4KS54KS+4KSCCivgpIXgpKoKK+CkleCkv+CkguCkueCli+Ckggor4KSJ4KSo4KSV4KS/CivgpK3gpL8KK+CkteCksOCklwor4KS54KWB4KSFCivgpJzgpYfgpLjgpL4KK+CkqOCkueCkv+CkggpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19odS50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2h1LnR4dAppbmRleCBmNWJmNzU1Li4zNzUyNmRhIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2h1LnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2h1LnR4dApAQCAtMSwyMTEgKzEsMjExIEBACi0gfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL2h1bmdhcmlhbi9zdG9wLnR4dA0KLSB8IFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuDQotIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHANCi0gfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwNCi0gfCAgLSBFbmNvZGluZyB3YXMgY29udmVydGVkIHRvIFVURi04Lg0KLSB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4NCi0gfA0KLSB8IE5PVEU6IFRvIHVzZSB0aGlzIGZpbGUgd2l0aCBTdG9wRmlsdGVyRmFjdG9yeSwgeW91IG11c3Qgc3BlY2lmeSBmb3JtYXQ9InNub3diYWxsIg0KLSANCi18IEh1bmdhcmlhbiBzdG9wIHdvcmQgbGlzdA0KLXwgcHJlcGFyZWQgYnkgQW5uYSBUb3JkYWkNCi0NCi1hDQotYWhvZ3kNCi1haG9sDQotYWtpDQotYWtpaw0KLWFra29yDQotYWxhdHQNCi3DoWx0YWwNCi3DoWx0YWzDoWJhbg0KLWFtZWx5DQotYW1lbHllaw0KLWFtZWx5ZWtiZW4NCi1hbWVseWVrZXQNCi1hbWVseWV0DQotYW1lbHluZWsNCi1hbWkNCi1hbWl0DQotYW1vbHlhbg0KLWFtw61nDQotYW1pa29yDQotw6F0DQotYWJiYW4NCi1haGhveg0KLWFubmFrDQotYXJyYQ0KLWFycsOzbA0KLWF6DQotYXpvaw0KLWF6b24NCi1henQNCi1henphbA0KLWF6w6lydA0KLWF6dMOhbg0KLWF6dXTDoW4NCi1hem9uYmFuDQotYsOhcg0KLWJlDQotYmVsw7xsDQotYmVubmUNCi1jaWtrDQotY2lra2VrDQotY2lra2VrZXQNCi1jc2FrDQotZGUNCi1lDQotZWRkaWcNCi1lZ8Opc3oNCi1lZ3kNCi1lZ3llcw0KLWVneWV0bGVuDQotZWd5w6liDQotZWd5aWsNCi1lZ3lyZQ0KLWVra29yDQotZWwNCi1lbMOpZw0KLWVsbGVuDQotZWzFkQ0KLWVsxZFzesO2cg0KLWVsxZF0dA0KLWVsc8WRDQotw6luDQotw6lwcGVuDQotZWJiZW4NCi1laGhleg0KLWVtaWx5ZW4NCi1lbm5law0KLWVycmUNCi1leg0KLWV6dA0KLWV6ZWsNCi1lemVuDQotZXp6ZWwNCi1lesOpcnQNCi3DqXMNCi1mZWwNCi1mZWzDqQ0KLWhhbmVtDQotaGlzemVuDQotaG9neQ0KLWhvZ3lhbg0KLWlnZW4NCi3DrWd5DQotaWxsZXR2ZQ0KLWlsbC4NCi1pbGwNCi1pbHllbg0KLWlseWVua29yDQotaXNvbg0KLWlzbcOpdA0KLWl0dA0KLWrDsw0KLWrDs2wNCi1qb2JiYW4NCi1rZWxsDQota2VsbGV0dA0KLWtlcmVzenTDvGwNCi1rZXJlc3PDvG5rDQota2kNCi1rw612w7xsDQota8O2esO2dHQNCi1rw7Z6w7xsDQotbGVnYWzDoWJiDQotbGVoZXQNCi1sZWhldGV0dA0KLWxlZ3llbg0KLWxlbm5lDQotbGVubmkNCi1sZXN6DQotbGV0dA0KLW1hZ2ENCi1tYWfDoXQNCi1tYWpkDQotbWFqZA0KLW3DoXINCi1tw6FzDQotbcOhc2lrDQotbWVnDQotbcOpZw0KLW1lbGxldHQNCi1tZXJ0DQotbWVseQ0KLW1lbHllaw0KLW1pDQotbWl0DQotbcOtZw0KLW1pw6lydA0KLW1pbHllbg0KLW1pa29yDQotbWluZGVuDQotbWluZGVudA0KLW1pbmRlbmtpDQotbWluZGlnDQotbWludA0KLW1pbnRoYQ0KLW1pdmVsDQotbW9zdA0KLW5hZ3kNCi1uYWd5b2JiDQotbmFneW9uDQotbmUNCi1uw6loYQ0KLW5la2VtDQotbmVraQ0KLW5lbQ0KLW7DqWjDoW55DQotbsOpbGvDvGwNCi1uaW5jcw0KLW9seWFuDQotb3R0DQotw7Zzc3plDQotxZENCi3FkWsNCi3FkWtldA0KLXBlZGlnDQotcGVyc3plDQotcsOhDQotcw0KLXNhasOhdA0KLXNlbQ0KLXNlbW1pDQotc29rDQotc29rYXQNCi1zb2trYWwNCi1zesOhbcOhcmENCi1zemVtYmVuDQotc3plcmludA0KLXN6aW50ZQ0KLXRhbMOhbg0KLXRlaMOhdA0KLXRlbGplcw0KLXRvdsOhYmINCi10b3bDoWJiw6ENCi10w7ZiYg0KLcO6Z3kNCi11Z3lhbmlzDQotw7pqDQotw7pqYWJiDQotw7pqcmENCi11dMOhbg0KLXV0w6FuYQ0KLXV0b2xzw7MNCi12YWd5DQotdmFneWlzDQotdmFsYWtpDQotdmFsYW1pDQotdmFsYW1pbnQNCi12YWzDsw0KLXZhZ3lvaw0KLXZhbg0KLXZhbm5haw0KLXZvbHQNCi12b2x0YW0NCi12b2x0YWsNCi12b2x0dW5rDQotdmlzc3phDQotdmVsZQ0KLXZpc3pvbnQNCi12b2xuYQ0KKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvaHVuZ2FyaWFuL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyB8CisgfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCIKKyAKK3wgSHVuZ2FyaWFuIHN0b3Agd29yZCBsaXN0Cit8IHByZXBhcmVkIGJ5IEFubmEgVG9yZGFpCisKK2EKK2Fob2d5CithaG9sCitha2kKK2FraWsKK2Fra29yCithbGF0dAorw6FsdGFsCivDoWx0YWzDoWJhbgorYW1lbHkKK2FtZWx5ZWsKK2FtZWx5ZWtiZW4KK2FtZWx5ZWtldAorYW1lbHlldAorYW1lbHluZWsKK2FtaQorYW1pdAorYW1vbHlhbgorYW3DrWcKK2FtaWtvcgorw6F0CithYmJhbgorYWhob3oKK2FubmFrCithcnJhCithcnLDs2wKK2F6Cithem9rCithem9uCithenQKK2F6emFsCithesOpcnQKK2F6dMOhbgorYXp1dMOhbgorYXpvbmJhbgorYsOhcgorYmUKK2JlbMO8bAorYmVubmUKK2Npa2sKK2Npa2tlaworY2lra2VrZXQKK2NzYWsKK2RlCitlCitlZGRpZworZWfDqXN6CitlZ3kKK2VneWVzCitlZ3lldGxlbgorZWd5w6liCitlZ3lpaworZWd5cmUKK2Vra29yCitlbAorZWzDqWcKK2VsbGVuCitlbMWRCitlbMWRc3rDtnIKK2VsxZF0dAorZWxzxZEKK8Opbgorw6lwcGVuCitlYmJlbgorZWhoZXoKK2VtaWx5ZW4KK2VubmVrCitlcnJlCitlegorZXp0CitlemVrCitlemVuCitlenplbAorZXrDqXJ0CivDqXMKK2ZlbAorZmVsw6kKK2hhbmVtCitoaXN6ZW4KK2hvZ3kKK2hvZ3lhbgoraWdlbgorw61neQoraWxsZXR2ZQoraWxsLgoraWxsCitpbHllbgoraWx5ZW5rb3IKK2lzb24KK2lzbcOpdAoraXR0Citqw7MKK2rDs2wKK2pvYmJhbgora2VsbAora2VsbGV0dAora2VyZXN6dMO8bAora2VyZXNzw7xuawora2kKK2vDrXbDvGwKK2vDtnrDtnR0Citrw7Z6w7xsCitsZWdhbMOhYmIKK2xlaGV0CitsZWhldGV0dAorbGVneWVuCitsZW5uZQorbGVubmkKK2xlc3oKK2xldHQKK21hZ2EKK21hZ8OhdAorbWFqZAorbWFqZAorbcOhcgorbcOhcworbcOhc2lrCittZWcKK23DqWcKK21lbGxldHQKK21lcnQKK21lbHkKK21lbHllaworbWkKK21pdAorbcOtZworbWnDqXJ0CittaWx5ZW4KK21pa29yCittaW5kZW4KK21pbmRlbnQKK21pbmRlbmtpCittaW5kaWcKK21pbnQKK21pbnRoYQorbWl2ZWwKK21vc3QKK25hZ3kKK25hZ3lvYmIKK25hZ3lvbgorbmUKK27DqWhhCituZWtlbQorbmVraQorbmVtCituw6low6FueQorbsOpbGvDvGwKK25pbmNzCitvbHlhbgorb3R0CivDtnNzemUKK8WRCivFkWsKK8WRa2V0CitwZWRpZworcGVyc3plCityw6EKK3MKK3NhasOhdAorc2VtCitzZW1taQorc29rCitzb2thdAorc29ra2FsCitzesOhbcOhcmEKK3N6ZW1iZW4KK3N6ZXJpbnQKK3N6aW50ZQordGFsw6FuCit0ZWjDoXQKK3RlbGplcwordG92w6FiYgordG92w6FiYsOhCit0w7ZiYgorw7pneQordWd5YW5pcworw7pqCivDumphYmIKK8O6anJhCit1dMOhbgordXTDoW5hCit1dG9sc8OzCit2YWd5Cit2YWd5aXMKK3ZhbGFraQordmFsYW1pCit2YWxhbWludAordmFsw7MKK3ZhZ3lvawordmFuCit2YW5uYWsKK3ZvbHQKK3ZvbHRhbQordm9sdGFrCit2b2x0dW5rCit2aXNzemEKK3ZlbGUKK3Zpc3pvbnQKK3ZvbG5hCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2h5LnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfaHkudHh0CmluZGV4IDk2OGE4ZjQuLjYwYzFjNTAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfaHkudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfaHkudHh0CkBAIC0xLDQ2ICsxLDQ2IEBACi0jIGV4YW1wbGUgc2V0IG9mIEFybWVuaWFuIHN0b3B3b3Jkcy4NCi3VodW11aQNCi3VodW11awNCi3VodW11bYNCi3VodW11b0NCi3VpNW41oINCi3VpNW41oLWhA0KLdWl1bQNCi3VpdW2DQot1aXVttaEDQot1aXVvQ0KLdWl1oQNCi3Vpw0KLdWn1asNCi3Vp9Wr1bYNCi3Vp9Wr1bbWhA0KLdWn1avWgA0KLdWn1avWhA0KLdWn1oANCi3VqNW91b8NCi3VqQ0KLdWrDQot1avVtg0KLdWr1b3Vrw0KLdWr1oANCi3Vr9Wh1bQNCi3VsNWh1bTVodaADQot1bDVpdW/DQot1bDVpdW/1bgNCi3VtNWl1bbWhA0KLdW01aXVuw0KLdW01asNCi3Vtg0KLdW21aENCi3VttWh1ocNCi3VttaA1aENCi3VttaA1aHVttaEDQot1bjWgA0KLdW41oDVqA0KLdW41oDVuNW21oQNCi3VuNaA1brVpdW9DQot1bjWgg0KLdW41oLVtA0KLdW61avVv9WrDQot1b7WgNWhDQot1ocNCisjIGV4YW1wbGUgc2V0IG9mIEFybWVuaWFuIHN0b3B3b3Jkcy4KK9Wh1bXVpAor1aHVtdWsCivVodW11bYKK9Wh1bXVvQor1aTVuNaCCivVpNW41oLWhAor1aXVtAor1aXVtgor1aXVttaECivVpdW9CivVpdaECivVpwor1afVqwor1afVq9W2CivVp9Wr1bbWhAor1afVq9aACivVp9Wr1oQKK9Wn1oAKK9Wo1b3Vvwor1akKK9WrCivVq9W2CivVq9W91a8KK9Wr1oAKK9Wv1aHVtAor1bDVodW01aHWgAor1bDVpdW/CivVsNWl1b/VuAor1bTVpdW21oQKK9W01aXVuwor1bTVqwor1bYKK9W21aEKK9W21aHWhwor1bbWgNWhCivVttaA1aHVttaECivVuNaACivVuNaA1agKK9W41oDVuNW21oQKK9W41oDVutWl1b0KK9W41oIKK9W41oLVtAor1brVq9W/1asKK9W+1oDVoQor1ocKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfaWQudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19pZC50eHQKaW5kZXggODBkZjM5YS4uNDYxN2Y4MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19pZC50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19pZC50eHQKQEAgLTEsMzU5ICsxLDM1OSBAQAotIyBmcm9tIGFwcGVuZGl4IEQgb2Y6IEEgU3R1ZHkgb2YgU3RlbW1pbmcgRWZmZWN0cyBvbiBJbmZvcm1hdGlvbg0KLSMgUmV0cmlldmFsIGluIEJhaGFzYSBJbmRvbmVzaWENCi1hZGENCi1hZGFueWENCi1hZGFsYWgNCi1hZGFwdW4NCi1hZ2FrDQotYWdha255YQ0KLWFnYXINCi1ha2FuDQotYWthbmthaA0KLWFraGlybnlhDQotYWt1DQotYWt1bGFoDQotYW1hdA0KLWFtYXRsYWgNCi1hbmRhDQotYW5kYWxhaA0KLWFudGFyDQotZGlhbnRhcmFueWENCi1hbnRhcmENCi1hbnRhcmFueWENCi1kaWFudGFyYQ0KLWFwYQ0KLWFwYWFuDQotbWVuZ2FwYQ0KLWFwYWJpbGENCi1hcGFrYWgNCi1hcGFsYWdpDQotYXBhdGFoDQotYXRhdQ0KLWF0YXVrYWgNCi1hdGF1cHVuDQotYmFnYWkNCi1iYWdhaWthbg0KLXNlYmFnYWkNCi1zZWJhZ2FpbnlhDQotYmFnYWltYW5hDQotYmFnYWltYW5hcHVuDQotc2ViYWdhaW1hbmENCi1iYWdhaW1hbmFrYWgNCi1iYWdpDQotYmFoa2FuDQotYmFod2ENCi1iYWh3YXNhbnlhDQotc2ViYWxpa255YQ0KLWJhbnlhaw0KLXNlYmFueWFrDQotYmViZXJhcGENCi1zZWJlcmFwYQ0KLWJlZ2luaQ0KLWJlZ2luaWFuDQotYmVnaW5pa2FoDQotYmVnaW5pbGFoDQotc2ViZWdpbmkNCi1iZWdpdHUNCi1iZWdpdHVrYWgNCi1iZWdpdHVsYWgNCi1iZWdpdHVwdW4NCi1zZWJlZ2l0dQ0KLWJlbHVtDQotYmVsdW1sYWgNCi1zZWJlbHVtDQotc2ViZWx1bW55YQ0KLXNlYmVuYXJueWENCi1iZXJhcGENCi1iZXJhcGFrYWgNCi1iZXJhcGFsYWgNCi1iZXJhcGFwdW4NCi1iZXR1bGthaA0KLXNlYmV0dWxueWENCi1iaWFzYQ0KLWJpYXNhbnlhDQotYmlsYQ0KLWJpbGFrYWgNCi1iaXNhDQotYmlzYWthaA0KLXNlYmlzYW55YQ0KLWJvbGVoDQotYm9sZWhrYWgNCi1ib2xlaGxhaA0KLWJ1YXQNCi1idWthbg0KLWJ1a2Fua2FoDQotYnVrYW5sYWgNCi1idWthbm55YQ0KLWN1bWENCi1wZXJjdW1hDQotZGFodWx1DQotZGFsYW0NCi1kYW4NCi1kYXBhdA0KLWRhcmkNCi1kYXJpcGFkYQ0KLWRla2F0DQotZGVtaQ0KLWRlbWlraWFuDQotZGVtaWtpYW5sYWgNCi1zZWRlbWlraWFuDQotZGVuZ2FuDQotZGVwYW4NCi1kaQ0KLWRpYQ0KLWRpYWxhaA0KLWRpbmkNCi1kaXJpDQotZGlyaW55YQ0KLXRlcmRpcmkNCi1kb25nDQotZHVsdQ0KLWVuZ2dhaw0KLWVuZ2dha255YQ0KLWVudGFoDQotZW50YWhsYWgNCi10ZXJoYWRhcA0KLXRlcmhhZGFwbnlhDQotaGFsDQotaGFtcGlyDQotaGFueWENCi1oYW55YWxhaA0KLWhhcnVzDQotaGFydXNsYWgNCi1oYXJ1c255YQ0KLXNlaGFydXNueWENCi1oZW5kYWsNCi1oZW5kYWtsYWgNCi1oZW5kYWtueWENCi1oaW5nZ2ENCi1zZWhpbmdnYQ0KLWlhDQotaWFsYWgNCi1pYmFyYXQNCi1pbmdpbg0KLWluZ2lua2FoDQotaW5naW5rYW4NCi1pbmkNCi1pbmlrYWgNCi1pbmlsYWgNCi1pdHUNCi1pdHVrYWgNCi1pdHVsYWgNCi1qYW5nYW4NCi1qYW5nYW5rYW4NCi1qYW5nYW5sYWgNCi1qaWthDQotamlrYWxhdQ0KLWp1Z2ENCi1qdXN0cnUNCi1rYWxhDQota2FsYXUNCi1rYWxhdWxhaA0KLWthbGF1cHVuDQota2FsaWFuDQota2FtaQ0KLWthbWlsYWgNCi1rYW11DQota2FtdWxhaA0KLWthbg0KLWthcGFuDQota2FwYW5rYWgNCi1rYXBhbnB1bg0KLWRpa2FyZW5ha2FuDQota2FyZW5hDQota2FyZW5hbnlhDQota2UNCi1rZWNpbA0KLWtlbXVkaWFuDQota2VuYXBhDQota2VwYWRhDQota2VwYWRhbnlhDQota2V0aWthDQotc2VrZXRpa2ENCi1raHVzdXNueWENCi1raW5pDQota2luaWxhaA0KLWtpcmFueWENCi1zZWtpcmFueWENCi1raXRhDQota2l0YWxhaA0KLWtvaw0KLWxhZ2kNCi1sYWdpYW4NCi1zZWxhZ2kNCi1sYWgNCi1sYWluDQotbGFpbm55YQ0KLW1lbGFpbmthbg0KLXNlbGFrdQ0KLWxhbHUNCi1tZWxhbHVpDQotdGVybGFsdQ0KLWxhbWENCi1sYW1hbnlhDQotc2VsYW1hDQotc2VsYW1hDQotc2VsYW1hbnlhDQotbGViaWgNCi10ZXJsZWJpaA0KLWJlcm1hY2FtDQotbWFjYW0NCi1zZW1hY2FtDQotbWFrYQ0KLW1ha2FueWENCi1tYWtpbg0KLW1hbGFoDQotbWFsYWhhbg0KLW1hbXB1DQotbWFtcHVrYWgNCi1tYW5hDQotbWFuYWthbGENCi1tYW5hbGFnaQ0KLW1hc2loDQotbWFzaWhrYWgNCi1zZW1hc2loDQotbWFzaW5nDQotbWF1DQotbWF1cHVuDQotc2VtYXVueWENCi1tZW1hbmcNCi1tZXJla2ENCi1tZXJla2FsYWgNCi1tZXNraQ0KLW1lc2tpcHVuDQotc2VtdWxhDQotbXVuZ2tpbg0KLW11bmdraW5rYWgNCi1uYWgNCi1uYW11bg0KLW5hbnRpDQotbmFudGlueWENCi1ueWFyaXMNCi1vbGVoDQotb2xlaG55YQ0KLXNlb3JhbmcNCi1zZXNlb3JhbmcNCi1wYWRhDQotcGFkYW55YQ0KLXBhZGFoYWwNCi1wYWxpbmcNCi1zZXBhbmphbmcNCi1wYW50YXMNCi1zZXBhbnRhc255YQ0KLXNlcGFudGFzbnlhbGFoDQotcGFyYQ0KLXBhc3RpDQotcGFzdGlsYWgNCi1wZXINCi1wZXJuYWgNCi1wdWxhDQotcHVuDQotbWVydXBha2FuDQotcnVwYW55YQ0KLXNlcnVwYQ0KLXNhYXQNCi1zYWF0bnlhDQotc2VzYWF0DQotc2FqYQ0KLXNhamFsYWgNCi1zYWxpbmcNCi1iZXJzYW1hDQotc2FtYQ0KLXNlc2FtYQ0KLXNhbWJpbA0KLXNhbXBhaQ0KLXNhbmENCi1zYW5nYXQNCi1zYW5nYXRsYWgNCi1zYXlhDQotc2F5YWxhaA0KLXNlDQotc2ViYWINCi1zZWJhYm55YQ0KLXNlYnVhaA0KLXRlcnNlYnV0DQotdGVyc2VidXRsYWgNCi1zZWRhbmcNCi1zZWRhbmdrYW4NCi1zZWRpa2l0DQotc2VkaWtpdG55YQ0KLXNlZ2FsYQ0KLXNlZ2FsYW55YQ0KLXNlZ2VyYQ0KLXNlc2VnZXJhDQotc2VqYWsNCi1zZWplbmFrDQotc2VrYWxpDQotc2VrYWxpYW4NCi1zZWthbGlwdW4NCi1zZXNla2FsaQ0KLXNla2FsaWd1cw0KLXNla2FyYW5nDQotc2VrYXJhbmcNCi1zZWtpdGFyDQotc2VraXRhcm55YQ0KLXNlbGENCi1zZWxhaW4NCi1zZWxhbHUNCi1zZWx1cnVoDQotc2VsdXJ1aG55YQ0KLXNlbWFraW4NCi1zZW1lbnRhcmENCi1zZW1wYXQNCi1zZW11YQ0KLXNlbXVhbnlhDQotc2VuZGlyaQ0KLXNlbmRpcmlueWENCi1zZW9sYWgNCi1zZXBlcnRpDQotc2VwZXJ0aW55YQ0KLXNlcmluZw0KLXNlcmluZ255YQ0KLXNlcnRhDQotc2lhcGENCi1zaWFwYWthaA0KLXNpYXBhcHVuDQotZGlzaW5pDQotZGlzaW5pbGFoDQotc2luaQ0KLXNpbmlsYWgNCi1zZXN1YXR1DQotc2VzdWF0dW55YQ0KLXN1YXR1DQotc2VzdWRhaA0KLXNlc3VkYWhueWENCi1zdWRhaA0KLXN1ZGFoa2FoDQotc3VkYWhsYWgNCi1zdXBheWENCi10YWRpDQotdGFkaW55YQ0KLXRhaw0KLXRhbnBhDQotc2V0ZWxhaA0KLXRlbGFoDQotdGVudGFuZw0KLXRlbnR1DQotdGVudHVsYWgNCi10ZW50dW55YQ0KLXRlcnRlbnR1DQotc2V0ZXJ1c255YQ0KLXRhcGkNCi10ZXRhcGkNCi1zZXRpYXANCi10aWFwDQotc2V0aWRha255YQ0KLXRpZGFrDQotdGlkYWtrYWgNCi10aWRha2xhaA0KLXRvaA0KLXdhZHVoDQotd2FoDQotd2FoYWkNCi1zZXdha3R1DQotd2FsYXUNCi13YWxhdXB1bg0KLXdvbmcNCi15YWl0dQ0KLXlha25pDQoteWFuZw0KKyMgZnJvbSBhcHBlbmRpeCBEIG9mOiBBIFN0dWR5IG9mIFN0ZW1taW5nIEVmZmVjdHMgb24gSW5mb3JtYXRpb24KKyMgUmV0cmlldmFsIGluIEJhaGFzYSBJbmRvbmVzaWEKK2FkYQorYWRhbnlhCithZGFsYWgKK2FkYXB1bgorYWdhaworYWdha255YQorYWdhcgorYWthbgorYWthbmthaAorYWtoaXJueWEKK2FrdQorYWt1bGFoCithbWF0CithbWF0bGFoCithbmRhCithbmRhbGFoCithbnRhcgorZGlhbnRhcmFueWEKK2FudGFyYQorYW50YXJhbnlhCitkaWFudGFyYQorYXBhCithcGFhbgorbWVuZ2FwYQorYXBhYmlsYQorYXBha2FoCithcGFsYWdpCithcGF0YWgKK2F0YXUKK2F0YXVrYWgKK2F0YXVwdW4KK2JhZ2FpCitiYWdhaWthbgorc2ViYWdhaQorc2ViYWdhaW55YQorYmFnYWltYW5hCitiYWdhaW1hbmFwdW4KK3NlYmFnYWltYW5hCitiYWdhaW1hbmFrYWgKK2JhZ2kKK2JhaGthbgorYmFod2EKK2JhaHdhc2FueWEKK3NlYmFsaWtueWEKK2Jhbnlhaworc2ViYW55YWsKK2JlYmVyYXBhCitzZWJlcmFwYQorYmVnaW5pCitiZWdpbmlhbgorYmVnaW5pa2FoCitiZWdpbmlsYWgKK3NlYmVnaW5pCitiZWdpdHUKK2JlZ2l0dWthaAorYmVnaXR1bGFoCitiZWdpdHVwdW4KK3NlYmVnaXR1CitiZWx1bQorYmVsdW1sYWgKK3NlYmVsdW0KK3NlYmVsdW1ueWEKK3NlYmVuYXJueWEKK2JlcmFwYQorYmVyYXBha2FoCitiZXJhcGFsYWgKK2JlcmFwYXB1bgorYmV0dWxrYWgKK3NlYmV0dWxueWEKK2JpYXNhCitiaWFzYW55YQorYmlsYQorYmlsYWthaAorYmlzYQorYmlzYWthaAorc2ViaXNhbnlhCitib2xlaAorYm9sZWhrYWgKK2JvbGVobGFoCitidWF0CitidWthbgorYnVrYW5rYWgKK2J1a2FubGFoCitidWthbm55YQorY3VtYQorcGVyY3VtYQorZGFodWx1CitkYWxhbQorZGFuCitkYXBhdAorZGFyaQorZGFyaXBhZGEKK2Rla2F0CitkZW1pCitkZW1pa2lhbgorZGVtaWtpYW5sYWgKK3NlZGVtaWtpYW4KK2RlbmdhbgorZGVwYW4KK2RpCitkaWEKK2RpYWxhaAorZGluaQorZGlyaQorZGlyaW55YQordGVyZGlyaQorZG9uZworZHVsdQorZW5nZ2FrCitlbmdnYWtueWEKK2VudGFoCitlbnRhaGxhaAordGVyaGFkYXAKK3RlcmhhZGFwbnlhCitoYWwKK2hhbXBpcgoraGFueWEKK2hhbnlhbGFoCitoYXJ1cworaGFydXNsYWgKK2hhcnVzbnlhCitzZWhhcnVzbnlhCitoZW5kYWsKK2hlbmRha2xhaAoraGVuZGFrbnlhCitoaW5nZ2EKK3NlaGluZ2dhCitpYQoraWFsYWgKK2liYXJhdAoraW5naW4KK2luZ2lua2FoCitpbmdpbmthbgoraW5pCitpbmlrYWgKK2luaWxhaAoraXR1CitpdHVrYWgKK2l0dWxhaAoramFuZ2FuCitqYW5nYW5rYW4KK2phbmdhbmxhaAoramlrYQoramlrYWxhdQoranVnYQoranVzdHJ1CitrYWxhCitrYWxhdQora2FsYXVsYWgKK2thbGF1cHVuCitrYWxpYW4KK2thbWkKK2thbWlsYWgKK2thbXUKK2thbXVsYWgKK2thbgora2FwYW4KK2thcGFua2FoCitrYXBhbnB1bgorZGlrYXJlbmFrYW4KK2thcmVuYQora2FyZW5hbnlhCitrZQora2VjaWwKK2tlbXVkaWFuCitrZW5hcGEKK2tlcGFkYQora2VwYWRhbnlhCitrZXRpa2EKK3Nla2V0aWthCitraHVzdXNueWEKK2tpbmkKK2tpbmlsYWgKK2tpcmFueWEKK3Nla2lyYW55YQora2l0YQora2l0YWxhaAora29rCitsYWdpCitsYWdpYW4KK3NlbGFnaQorbGFoCitsYWluCitsYWlubnlhCittZWxhaW5rYW4KK3NlbGFrdQorbGFsdQorbWVsYWx1aQordGVybGFsdQorbGFtYQorbGFtYW55YQorc2VsYW1hCitzZWxhbWEKK3NlbGFtYW55YQorbGViaWgKK3RlcmxlYmloCitiZXJtYWNhbQorbWFjYW0KK3NlbWFjYW0KK21ha2EKK21ha2FueWEKK21ha2luCittYWxhaAorbWFsYWhhbgorbWFtcHUKK21hbXB1a2FoCittYW5hCittYW5ha2FsYQorbWFuYWxhZ2kKK21hc2loCittYXNpaGthaAorc2VtYXNpaAorbWFzaW5nCittYXUKK21hdXB1bgorc2VtYXVueWEKK21lbWFuZworbWVyZWthCittZXJla2FsYWgKK21lc2tpCittZXNraXB1bgorc2VtdWxhCittdW5na2luCittdW5na2lua2FoCituYWgKK25hbXVuCituYW50aQorbmFudGlueWEKK255YXJpcworb2xlaAorb2xlaG55YQorc2VvcmFuZworc2VzZW9yYW5nCitwYWRhCitwYWRhbnlhCitwYWRhaGFsCitwYWxpbmcKK3NlcGFuamFuZworcGFudGFzCitzZXBhbnRhc255YQorc2VwYW50YXNueWFsYWgKK3BhcmEKK3Bhc3RpCitwYXN0aWxhaAorcGVyCitwZXJuYWgKK3B1bGEKK3B1bgorbWVydXBha2FuCitydXBhbnlhCitzZXJ1cGEKK3NhYXQKK3NhYXRueWEKK3Nlc2FhdAorc2FqYQorc2FqYWxhaAorc2FsaW5nCitiZXJzYW1hCitzYW1hCitzZXNhbWEKK3NhbWJpbAorc2FtcGFpCitzYW5hCitzYW5nYXQKK3NhbmdhdGxhaAorc2F5YQorc2F5YWxhaAorc2UKK3NlYmFiCitzZWJhYm55YQorc2VidWFoCit0ZXJzZWJ1dAordGVyc2VidXRsYWgKK3NlZGFuZworc2VkYW5na2FuCitzZWRpa2l0CitzZWRpa2l0bnlhCitzZWdhbGEKK3NlZ2FsYW55YQorc2VnZXJhCitzZXNlZ2VyYQorc2VqYWsKK3NlamVuYWsKK3Nla2FsaQorc2VrYWxpYW4KK3Nla2FsaXB1bgorc2VzZWthbGkKK3Nla2FsaWd1cworc2VrYXJhbmcKK3Nla2FyYW5nCitzZWtpdGFyCitzZWtpdGFybnlhCitzZWxhCitzZWxhaW4KK3NlbGFsdQorc2VsdXJ1aAorc2VsdXJ1aG55YQorc2VtYWtpbgorc2VtZW50YXJhCitzZW1wYXQKK3NlbXVhCitzZW11YW55YQorc2VuZGlyaQorc2VuZGlyaW55YQorc2VvbGFoCitzZXBlcnRpCitzZXBlcnRpbnlhCitzZXJpbmcKK3NlcmluZ255YQorc2VydGEKK3NpYXBhCitzaWFwYWthaAorc2lhcGFwdW4KK2Rpc2luaQorZGlzaW5pbGFoCitzaW5pCitzaW5pbGFoCitzZXN1YXR1CitzZXN1YXR1bnlhCitzdWF0dQorc2VzdWRhaAorc2VzdWRhaG55YQorc3VkYWgKK3N1ZGFoa2FoCitzdWRhaGxhaAorc3VwYXlhCit0YWRpCit0YWRpbnlhCit0YWsKK3RhbnBhCitzZXRlbGFoCit0ZWxhaAordGVudGFuZwordGVudHUKK3RlbnR1bGFoCit0ZW50dW55YQordGVydGVudHUKK3NldGVydXNueWEKK3RhcGkKK3RldGFwaQorc2V0aWFwCit0aWFwCitzZXRpZGFrbnlhCit0aWRhawordGlkYWtrYWgKK3RpZGFrbGFoCit0b2gKK3dhZHVoCit3YWgKK3dhaGFpCitzZXdha3R1Cit3YWxhdQord2FsYXVwdW4KK3dvbmcKK3lhaXR1Cit5YWtuaQoreWFuZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19pdC50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2l0LnR4dAppbmRleCAzYjIwYzBhLi4xMjE5Y2M3IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2l0LnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2l0LnR4dApAQCAtMSwzMDMgKzEsMzAzIEBACi0gfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL2l0YWxpYW4vc3RvcC50eHQNCi0gfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLg0KLSB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwDQotIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sDQotIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4NCi0gfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuDQotIHwNCi0gfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCINCi0NCi0gfCBBbiBJdGFsaWFuIHN0b3Agd29yZCBsaXN0LiBDb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gRWFjaCBzdG9wDQotIHwgd29yZCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLg0KLQ0KLWFkICAgICAgICAgICAgIHwgIGEgKHRvKSBiZWZvcmUgdm93ZWwNCi1hbCAgICAgICAgICAgICB8ICBhICsgaWwNCi1hbGxvICAgICAgICAgICB8ICBhICsgbG8NCi1haSAgICAgICAgICAgICB8ICBhICsgaQ0KLWFnbGkgICAgICAgICAgIHwgIGEgKyBnbGkNCi1hbGwgICAgICAgICAgICB8ICBhICsgbCcNCi1hZ2wgICAgICAgICAgICB8ICBhICsgZ2wnDQotYWxsYSAgICAgICAgICAgfCAgYSArIGxhDQotYWxsZSAgICAgICAgICAgfCAgYSArIGxlDQotY29uICAgICAgICAgICAgfCAgd2l0aA0KLWNvbCAgICAgICAgICAgIHwgIGNvbiArIGlsDQotY29pICAgICAgICAgICAgfCAgY29uICsgaSAoZm9ybXMgY29sbG8sIGNvZ2xpIGV0YyBhcmUgbm93IHZlcnkgcmFyZSkNCi1kYSAgICAgICAgICAgICB8ICBmcm9tDQotZGFsICAgICAgICAgICAgfCAgZGEgKyBpbA0KLWRhbGxvICAgICAgICAgIHwgIGRhICsgbG8NCi1kYWkgICAgICAgICAgICB8ICBkYSArIGkNCi1kYWdsaSAgICAgICAgICB8ICBkYSArIGdsaQ0KLWRhbGwgICAgICAgICAgIHwgIGRhICsgbCcNCi1kYWdsICAgICAgICAgICB8ICBkYSArIGdsbCcNCi1kYWxsYSAgICAgICAgICB8ICBkYSArIGxhDQotZGFsbGUgICAgICAgICAgfCAgZGEgKyBsZQ0KLWRpICAgICAgICAgICAgIHwgIG9mDQotZGVsICAgICAgICAgICAgfCAgZGkgKyBpbA0KLWRlbGxvICAgICAgICAgIHwgIGRpICsgbG8NCi1kZWkgICAgICAgICAgICB8ICBkaSArIGkNCi1kZWdsaSAgICAgICAgICB8ICBkaSArIGdsaQ0KLWRlbGwgICAgICAgICAgIHwgIGRpICsgbCcNCi1kZWdsICAgICAgICAgICB8ICBkaSArIGdsJw0KLWRlbGxhICAgICAgICAgIHwgIGRpICsgbGENCi1kZWxsZSAgICAgICAgICB8ICBkaSArIGxlDQotaW4gICAgICAgICAgICAgfCAgaW4NCi1uZWwgICAgICAgICAgICB8ICBpbiArIGVsDQotbmVsbG8gICAgICAgICAgfCAgaW4gKyBsbw0KLW5laSAgICAgICAgICAgIHwgIGluICsgaQ0KLW5lZ2xpICAgICAgICAgIHwgIGluICsgZ2xpDQotbmVsbCAgICAgICAgICAgfCAgaW4gKyBsJw0KLW5lZ2wgICAgICAgICAgIHwgIGluICsgZ2wnDQotbmVsbGEgICAgICAgICAgfCAgaW4gKyBsYQ0KLW5lbGxlICAgICAgICAgIHwgIGluICsgbGUNCi1zdSAgICAgICAgICAgICB8ICBvbg0KLXN1bCAgICAgICAgICAgIHwgIHN1ICsgaWwNCi1zdWxsbyAgICAgICAgICB8ICBzdSArIGxvDQotc3VpICAgICAgICAgICAgfCAgc3UgKyBpDQotc3VnbGkgICAgICAgICAgfCAgc3UgKyBnbGkNCi1zdWxsICAgICAgICAgICB8ICBzdSArIGwnDQotc3VnbCAgICAgICAgICAgfCAgc3UgKyBnbCcNCi1zdWxsYSAgICAgICAgICB8ICBzdSArIGxhDQotc3VsbGUgICAgICAgICAgfCAgc3UgKyBsZQ0KLXBlciAgICAgICAgICAgIHwgIHRocm91Z2gsIGJ5DQotdHJhICAgICAgICAgICAgfCAgYW1vbmcNCi1jb250cm8gICAgICAgICB8ICBhZ2FpbnN0DQotaW8gICAgICAgICAgICAgfCAgSQ0KLXR1ICAgICAgICAgICAgIHwgIHRob3UNCi1sdWkgICAgICAgICAgICB8ICBoZQ0KLWxlaSAgICAgICAgICAgIHwgIHNoZQ0KLW5vaSAgICAgICAgICAgIHwgIHdlDQotdm9pICAgICAgICAgICAgfCAgeW91DQotbG9ybyAgICAgICAgICAgfCAgdGhleQ0KLW1pbyAgICAgICAgICAgIHwgIG15DQotbWlhICAgICAgICAgICAgfA0KLW1pZWkgICAgICAgICAgIHwNCi1taWUgICAgICAgICAgICB8DQotdHVvICAgICAgICAgICAgfA0KLXR1YSAgICAgICAgICAgIHwNCi10dW9pICAgICAgICAgICB8ICB0aHkNCi10dWUgICAgICAgICAgICB8DQotc3VvICAgICAgICAgICAgfA0KLXN1YSAgICAgICAgICAgIHwNCi1zdW9pICAgICAgICAgICB8ICBoaXMsIGhlcg0KLXN1ZSAgICAgICAgICAgIHwNCi1ub3N0cm8gICAgICAgICB8ICBvdXINCi1ub3N0cmEgICAgICAgICB8DQotbm9zdHJpICAgICAgICAgfA0KLW5vc3RyZSAgICAgICAgIHwNCi12b3N0cm8gICAgICAgICB8ICB5b3VyDQotdm9zdHJhICAgICAgICAgfA0KLXZvc3RyaSAgICAgICAgIHwNCi12b3N0cmUgICAgICAgICB8DQotbWkgICAgICAgICAgICAgfCAgbWUNCi10aSAgICAgICAgICAgICB8ICB0aGVlDQotY2kgICAgICAgICAgICAgfCAgdXMsIHRoZXJlDQotdmkgICAgICAgICAgICAgfCAgeW91LCB0aGVyZQ0KLWxvICAgICAgICAgICAgIHwgIGhpbSwgdGhlDQotbGEgICAgICAgICAgICAgfCAgaGVyLCB0aGUNCi1saSAgICAgICAgICAgICB8ICB0aGVtDQotbGUgICAgICAgICAgICAgfCAgdGhlbSwgdGhlDQotZ2xpICAgICAgICAgICAgfCAgdG8gaGltLCB0aGUNCi1uZSAgICAgICAgICAgICB8ICBmcm9tIHRoZXJlIGV0Yw0KLWlsICAgICAgICAgICAgIHwgIHRoZQ0KLXVuICAgICAgICAgICAgIHwgIGENCi11bm8gICAgICAgICAgICB8ICBhDQotdW5hICAgICAgICAgICAgfCAgYQ0KLW1hICAgICAgICAgICAgIHwgIGJ1dA0KLWVkICAgICAgICAgICAgIHwgIGFuZA0KLXNlICAgICAgICAgICAgIHwgIGlmDQotcGVyY2jDqSAgICAgICAgIHwgIHdoeSwgYmVjYXVzZQ0KLWFuY2hlICAgICAgICAgIHwgIGFsc28NCi1jb21lICAgICAgICAgICB8ICBob3cNCi1kb3YgICAgICAgICAgICB8ICB3aGVyZSAoYXMgZG92JykNCi1kb3ZlICAgICAgICAgICB8ICB3aGVyZQ0KLWNoZSAgICAgICAgICAgIHwgIHdobywgdGhhdA0KLWNoaSAgICAgICAgICAgIHwgIHdobw0KLWN1aSAgICAgICAgICAgIHwgIHdob20NCi1ub24gICAgICAgICAgICB8ICBub3QNCi1wacO5ICAgICAgICAgICAgfCAgbW9yZQ0KLXF1YWxlICAgICAgICAgIHwgIHdobywgdGhhdA0KLXF1YW50byAgICAgICAgIHwgIGhvdyBtdWNoDQotcXVhbnRpICAgICAgICAgfA0KLXF1YW50YSAgICAgICAgIHwNCi1xdWFudGUgICAgICAgICB8DQotcXVlbGxvICAgICAgICAgfCAgdGhhdA0KLXF1ZWxsaSAgICAgICAgIHwNCi1xdWVsbGEgICAgICAgICB8DQotcXVlbGxlICAgICAgICAgfA0KLXF1ZXN0byAgICAgICAgIHwgIHRoaXMNCi1xdWVzdGkgICAgICAgICB8DQotcXVlc3RhICAgICAgICAgfA0KLXF1ZXN0ZSAgICAgICAgIHwNCi1zaSAgICAgICAgICAgICB8ICB5ZXMNCi10dXR0byAgICAgICAgICB8ICBhbGwNCi10dXR0aSAgICAgICAgICB8ICBhbGwNCi0NCi0gICAgICAgICAgICAgICB8ICBzaW5nbGUgbGV0dGVyIGZvcm1zOg0KLQ0KLWEgICAgICAgICAgICAgIHwgIGF0DQotYyAgICAgICAgICAgICAgfCAgYXMgYycgZm9yIGNlIG9yIGNpDQotZSAgICAgICAgICAgICAgfCAgYW5kDQotaSAgICAgICAgICAgICAgfCAgdGhlDQotbCAgICAgICAgICAgICAgfCAgYXMgbCcNCi1vICAgICAgICAgICAgICB8ICBvcg0KLQ0KLSAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgYXZlcmUsIHRvIGhhdmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOg0KLQ0KLWhvDQotaGFpDQotaGENCi1hYmJpYW1vDQotYXZldGUNCi1oYW5ubw0KLWFiYmlhDQotYWJiaWF0ZQ0KLWFiYmlhbm8NCi1hdnLDsg0KLWF2cmFpDQotYXZyw6ANCi1hdnJlbW8NCi1hdnJldGUNCi1hdnJhbm5vDQotYXZyZWkNCi1hdnJlc3RpDQotYXZyZWJiZQ0KLWF2cmVtbW8NCi1hdnJlc3RlDQotYXZyZWJiZXJvDQotYXZldm8NCi1hdmV2aQ0KLWF2ZXZhDQotYXZldmFtbw0KLWF2ZXZhdGUNCi1hdmV2YW5vDQotZWJiaQ0KLWF2ZXN0aQ0KLWViYmUNCi1hdmVtbW8NCi1hdmVzdGUNCi1lYmJlcm8NCi1hdmVzc2kNCi1hdmVzc2UNCi1hdmVzc2ltbw0KLWF2ZXNzZXJvDQotYXZlbmRvDQotYXZ1dG8NCi1hdnV0YQ0KLWF2dXRpDQotYXZ1dGUNCi0NCi0gICAgICAgICAgICAgICB8IGZvcm1zIG9mIGVzc2VyZSwgdG8gYmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOg0KLXNvbm8NCi1zZWkNCi3DqA0KLXNpYW1vDQotc2lldGUNCi1zaWENCi1zaWF0ZQ0KLXNpYW5vDQotc2Fyw7INCi1zYXJhaQ0KLXNhcsOgDQotc2FyZW1vDQotc2FyZXRlDQotc2FyYW5ubw0KLXNhcmVpDQotc2FyZXN0aQ0KLXNhcmViYmUNCi1zYXJlbW1vDQotc2FyZXN0ZQ0KLXNhcmViYmVybw0KLWVybw0KLWVyaQ0KLWVyYQ0KLWVyYXZhbW8NCi1lcmF2YXRlDQotZXJhbm8NCi1mdWkNCi1mb3N0aQ0KLWZ1DQotZnVtbW8NCi1mb3N0ZQ0KLWZ1cm9ubw0KLWZvc3NpDQotZm9zc2UNCi1mb3NzaW1vDQotZm9zc2Vybw0KLWVzc2VuZG8NCi0NCi0gICAgICAgICAgICAgICB8IGZvcm1zIG9mIGZhcmUsIHRvIGRvIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlLCBmYSwgZmF0LSk6DQotZmFjY2lvDQotZmFpDQotZmFjY2lhbW8NCi1mYW5ubw0KLWZhY2NpYQ0KLWZhY2NpYXRlDQotZmFjY2lhbm8NCi1mYXLDsg0KLWZhcmFpDQotZmFyw6ANCi1mYXJlbW8NCi1mYXJldGUNCi1mYXJhbm5vDQotZmFyZWkNCi1mYXJlc3RpDQotZmFyZWJiZQ0KLWZhcmVtbW8NCi1mYXJlc3RlDQotZmFyZWJiZXJvDQotZmFjZXZvDQotZmFjZXZpDQotZmFjZXZhDQotZmFjZXZhbW8NCi1mYWNldmF0ZQ0KLWZhY2V2YW5vDQotZmVjaQ0KLWZhY2VzdGkNCi1mZWNlDQotZmFjZW1tbw0KLWZhY2VzdGUNCi1mZWNlcm8NCi1mYWNlc3NpDQotZmFjZXNzZQ0KLWZhY2Vzc2ltbw0KLWZhY2Vzc2Vybw0KLWZhY2VuZG8NCi0NCi0gICAgICAgICAgICAgICB8IGZvcm1zIG9mIHN0YXJlLCB0byBiZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6DQotc3RvDQotc3RhaQ0KLXN0YQ0KLXN0aWFtbw0KLXN0YW5ubw0KLXN0aWENCi1zdGlhdGUNCi1zdGlhbm8NCi1zdGFyw7INCi1zdGFyYWkNCi1zdGFyw6ANCi1zdGFyZW1vDQotc3RhcmV0ZQ0KLXN0YXJhbm5vDQotc3RhcmVpDQotc3RhcmVzdGkNCi1zdGFyZWJiZQ0KLXN0YXJlbW1vDQotc3RhcmVzdGUNCi1zdGFyZWJiZXJvDQotc3Rhdm8NCi1zdGF2aQ0KLXN0YXZhDQotc3RhdmFtbw0KLXN0YXZhdGUNCi1zdGF2YW5vDQotc3RldHRpDQotc3Rlc3RpDQotc3RldHRlDQotc3RlbW1vDQotc3Rlc3RlDQotc3RldHRlcm8NCi1zdGVzc2kNCi1zdGVzc2UNCi1zdGVzc2ltbw0KLXN0ZXNzZXJvDQotc3RhbmRvDQorIHwgRnJvbSBzdm4udGFydGFydXMub3JnL3Nub3diYWxsL3RydW5rL3dlYnNpdGUvYWxnb3JpdGhtcy9pdGFsaWFuL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyB8CisgfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCIKKworIHwgQW4gSXRhbGlhbiBzdG9wIHdvcmQgbGlzdC4gQ29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIEVhY2ggc3RvcAorIHwgd29yZCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorCithZCAgICAgICAgICAgICB8ICBhICh0bykgYmVmb3JlIHZvd2VsCithbCAgICAgICAgICAgICB8ICBhICsgaWwKK2FsbG8gICAgICAgICAgIHwgIGEgKyBsbworYWkgICAgICAgICAgICAgfCAgYSArIGkKK2FnbGkgICAgICAgICAgIHwgIGEgKyBnbGkKK2FsbCAgICAgICAgICAgIHwgIGEgKyBsJworYWdsICAgICAgICAgICAgfCAgYSArIGdsJworYWxsYSAgICAgICAgICAgfCAgYSArIGxhCithbGxlICAgICAgICAgICB8ICBhICsgbGUKK2NvbiAgICAgICAgICAgIHwgIHdpdGgKK2NvbCAgICAgICAgICAgIHwgIGNvbiArIGlsCitjb2kgICAgICAgICAgICB8ICBjb24gKyBpIChmb3JtcyBjb2xsbywgY29nbGkgZXRjIGFyZSBub3cgdmVyeSByYXJlKQorZGEgICAgICAgICAgICAgfCAgZnJvbQorZGFsICAgICAgICAgICAgfCAgZGEgKyBpbAorZGFsbG8gICAgICAgICAgfCAgZGEgKyBsbworZGFpICAgICAgICAgICAgfCAgZGEgKyBpCitkYWdsaSAgICAgICAgICB8ICBkYSArIGdsaQorZGFsbCAgICAgICAgICAgfCAgZGEgKyBsJworZGFnbCAgICAgICAgICAgfCAgZGEgKyBnbGwnCitkYWxsYSAgICAgICAgICB8ICBkYSArIGxhCitkYWxsZSAgICAgICAgICB8ICBkYSArIGxlCitkaSAgICAgICAgICAgICB8ICBvZgorZGVsICAgICAgICAgICAgfCAgZGkgKyBpbAorZGVsbG8gICAgICAgICAgfCAgZGkgKyBsbworZGVpICAgICAgICAgICAgfCAgZGkgKyBpCitkZWdsaSAgICAgICAgICB8ICBkaSArIGdsaQorZGVsbCAgICAgICAgICAgfCAgZGkgKyBsJworZGVnbCAgICAgICAgICAgfCAgZGkgKyBnbCcKK2RlbGxhICAgICAgICAgIHwgIGRpICsgbGEKK2RlbGxlICAgICAgICAgIHwgIGRpICsgbGUKK2luICAgICAgICAgICAgIHwgIGluCituZWwgICAgICAgICAgICB8ICBpbiArIGVsCituZWxsbyAgICAgICAgICB8ICBpbiArIGxvCituZWkgICAgICAgICAgICB8ICBpbiArIGkKK25lZ2xpICAgICAgICAgIHwgIGluICsgZ2xpCituZWxsICAgICAgICAgICB8ICBpbiArIGwnCituZWdsICAgICAgICAgICB8ICBpbiArIGdsJworbmVsbGEgICAgICAgICAgfCAgaW4gKyBsYQorbmVsbGUgICAgICAgICAgfCAgaW4gKyBsZQorc3UgICAgICAgICAgICAgfCAgb24KK3N1bCAgICAgICAgICAgIHwgIHN1ICsgaWwKK3N1bGxvICAgICAgICAgIHwgIHN1ICsgbG8KK3N1aSAgICAgICAgICAgIHwgIHN1ICsgaQorc3VnbGkgICAgICAgICAgfCAgc3UgKyBnbGkKK3N1bGwgICAgICAgICAgIHwgIHN1ICsgbCcKK3N1Z2wgICAgICAgICAgIHwgIHN1ICsgZ2wnCitzdWxsYSAgICAgICAgICB8ICBzdSArIGxhCitzdWxsZSAgICAgICAgICB8ICBzdSArIGxlCitwZXIgICAgICAgICAgICB8ICB0aHJvdWdoLCBieQordHJhICAgICAgICAgICAgfCAgYW1vbmcKK2NvbnRybyAgICAgICAgIHwgIGFnYWluc3QKK2lvICAgICAgICAgICAgIHwgIEkKK3R1ICAgICAgICAgICAgIHwgIHRob3UKK2x1aSAgICAgICAgICAgIHwgIGhlCitsZWkgICAgICAgICAgICB8ICBzaGUKK25vaSAgICAgICAgICAgIHwgIHdlCit2b2kgICAgICAgICAgICB8ICB5b3UKK2xvcm8gICAgICAgICAgIHwgIHRoZXkKK21pbyAgICAgICAgICAgIHwgIG15CittaWEgICAgICAgICAgICB8CittaWVpICAgICAgICAgICB8CittaWUgICAgICAgICAgICB8Cit0dW8gICAgICAgICAgICB8Cit0dWEgICAgICAgICAgICB8Cit0dW9pICAgICAgICAgICB8ICB0aHkKK3R1ZSAgICAgICAgICAgIHwKK3N1byAgICAgICAgICAgIHwKK3N1YSAgICAgICAgICAgIHwKK3N1b2kgICAgICAgICAgIHwgIGhpcywgaGVyCitzdWUgICAgICAgICAgICB8Citub3N0cm8gICAgICAgICB8ICBvdXIKK25vc3RyYSAgICAgICAgIHwKK25vc3RyaSAgICAgICAgIHwKK25vc3RyZSAgICAgICAgIHwKK3Zvc3RybyAgICAgICAgIHwgIHlvdXIKK3Zvc3RyYSAgICAgICAgIHwKK3Zvc3RyaSAgICAgICAgIHwKK3Zvc3RyZSAgICAgICAgIHwKK21pICAgICAgICAgICAgIHwgIG1lCit0aSAgICAgICAgICAgICB8ICB0aGVlCitjaSAgICAgICAgICAgICB8ICB1cywgdGhlcmUKK3ZpICAgICAgICAgICAgIHwgIHlvdSwgdGhlcmUKK2xvICAgICAgICAgICAgIHwgIGhpbSwgdGhlCitsYSAgICAgICAgICAgICB8ICBoZXIsIHRoZQorbGkgICAgICAgICAgICAgfCAgdGhlbQorbGUgICAgICAgICAgICAgfCAgdGhlbSwgdGhlCitnbGkgICAgICAgICAgICB8ICB0byBoaW0sIHRoZQorbmUgICAgICAgICAgICAgfCAgZnJvbSB0aGVyZSBldGMKK2lsICAgICAgICAgICAgIHwgIHRoZQordW4gICAgICAgICAgICAgfCAgYQordW5vICAgICAgICAgICAgfCAgYQordW5hICAgICAgICAgICAgfCAgYQorbWEgICAgICAgICAgICAgfCAgYnV0CitlZCAgICAgICAgICAgICB8ICBhbmQKK3NlICAgICAgICAgICAgIHwgIGlmCitwZXJjaMOpICAgICAgICAgfCAgd2h5LCBiZWNhdXNlCithbmNoZSAgICAgICAgICB8ICBhbHNvCitjb21lICAgICAgICAgICB8ICBob3cKK2RvdiAgICAgICAgICAgIHwgIHdoZXJlIChhcyBkb3YnKQorZG92ZSAgICAgICAgICAgfCAgd2hlcmUKK2NoZSAgICAgICAgICAgIHwgIHdobywgdGhhdAorY2hpICAgICAgICAgICAgfCAgd2hvCitjdWkgICAgICAgICAgICB8ICB3aG9tCitub24gICAgICAgICAgICB8ICBub3QKK3Bpw7kgICAgICAgICAgICB8ICBtb3JlCitxdWFsZSAgICAgICAgICB8ICB3aG8sIHRoYXQKK3F1YW50byAgICAgICAgIHwgIGhvdyBtdWNoCitxdWFudGkgICAgICAgICB8CitxdWFudGEgICAgICAgICB8CitxdWFudGUgICAgICAgICB8CitxdWVsbG8gICAgICAgICB8ICB0aGF0CitxdWVsbGkgICAgICAgICB8CitxdWVsbGEgICAgICAgICB8CitxdWVsbGUgICAgICAgICB8CitxdWVzdG8gICAgICAgICB8ICB0aGlzCitxdWVzdGkgICAgICAgICB8CitxdWVzdGEgICAgICAgICB8CitxdWVzdGUgICAgICAgICB8CitzaSAgICAgICAgICAgICB8ICB5ZXMKK3R1dHRvICAgICAgICAgIHwgIGFsbAordHV0dGkgICAgICAgICAgfCAgYWxsCisKKyAgICAgICAgICAgICAgIHwgIHNpbmdsZSBsZXR0ZXIgZm9ybXM6CisKK2EgICAgICAgICAgICAgIHwgIGF0CitjICAgICAgICAgICAgICB8ICBhcyBjJyBmb3IgY2Ugb3IgY2kKK2UgICAgICAgICAgICAgIHwgIGFuZAoraSAgICAgICAgICAgICAgfCAgdGhlCitsICAgICAgICAgICAgICB8ICBhcyBsJworbyAgICAgICAgICAgICAgfCAgb3IKKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBhdmVyZSwgdG8gaGF2ZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6CisKK2hvCitoYWkKK2hhCithYmJpYW1vCithdmV0ZQoraGFubm8KK2FiYmlhCithYmJpYXRlCithYmJpYW5vCithdnLDsgorYXZyYWkKK2F2csOgCithdnJlbW8KK2F2cmV0ZQorYXZyYW5ubworYXZyZWkKK2F2cmVzdGkKK2F2cmViYmUKK2F2cmVtbW8KK2F2cmVzdGUKK2F2cmViYmVybworYXZldm8KK2F2ZXZpCithdmV2YQorYXZldmFtbworYXZldmF0ZQorYXZldmFubworZWJiaQorYXZlc3RpCitlYmJlCithdmVtbW8KK2F2ZXN0ZQorZWJiZXJvCithdmVzc2kKK2F2ZXNzZQorYXZlc3NpbW8KK2F2ZXNzZXJvCithdmVuZG8KK2F2dXRvCithdnV0YQorYXZ1dGkKK2F2dXRlCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgZXNzZXJlLCB0byBiZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6Citzb25vCitzZWkKK8OoCitzaWFtbworc2lldGUKK3NpYQorc2lhdGUKK3NpYW5vCitzYXLDsgorc2FyYWkKK3NhcsOgCitzYXJlbW8KK3NhcmV0ZQorc2FyYW5ubworc2FyZWkKK3NhcmVzdGkKK3NhcmViYmUKK3NhcmVtbW8KK3NhcmVzdGUKK3NhcmViYmVybworZXJvCitlcmkKK2VyYQorZXJhdmFtbworZXJhdmF0ZQorZXJhbm8KK2Z1aQorZm9zdGkKK2Z1CitmdW1tbworZm9zdGUKK2Z1cm9ubworZm9zc2kKK2Zvc3NlCitmb3NzaW1vCitmb3NzZXJvCitlc3NlbmRvCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgZmFyZSwgdG8gZG8gKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUsIGZhLCBmYXQtKToKK2ZhY2NpbworZmFpCitmYWNjaWFtbworZmFubm8KK2ZhY2NpYQorZmFjY2lhdGUKK2ZhY2NpYW5vCitmYXLDsgorZmFyYWkKK2ZhcsOgCitmYXJlbW8KK2ZhcmV0ZQorZmFyYW5ubworZmFyZWkKK2ZhcmVzdGkKK2ZhcmViYmUKK2ZhcmVtbW8KK2ZhcmVzdGUKK2ZhcmViYmVybworZmFjZXZvCitmYWNldmkKK2ZhY2V2YQorZmFjZXZhbW8KK2ZhY2V2YXRlCitmYWNldmFubworZmVjaQorZmFjZXN0aQorZmVjZQorZmFjZW1tbworZmFjZXN0ZQorZmVjZXJvCitmYWNlc3NpCitmYWNlc3NlCitmYWNlc3NpbW8KK2ZhY2Vzc2VybworZmFjZW5kbworCisgICAgICAgICAgICAgICB8IGZvcm1zIG9mIHN0YXJlLCB0byBiZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6CitzdG8KK3N0YWkKK3N0YQorc3RpYW1vCitzdGFubm8KK3N0aWEKK3N0aWF0ZQorc3RpYW5vCitzdGFyw7IKK3N0YXJhaQorc3RhcsOgCitzdGFyZW1vCitzdGFyZXRlCitzdGFyYW5ubworc3RhcmVpCitzdGFyZXN0aQorc3RhcmViYmUKK3N0YXJlbW1vCitzdGFyZXN0ZQorc3RhcmViYmVybworc3Rhdm8KK3N0YXZpCitzdGF2YQorc3RhdmFtbworc3RhdmF0ZQorc3RhdmFubworc3RldHRpCitzdGVzdGkKK3N0ZXR0ZQorc3RlbW1vCitzdGVzdGUKK3N0ZXR0ZXJvCitzdGVzc2kKK3N0ZXNzZQorc3Rlc3NpbW8KK3N0ZXNzZXJvCitzdGFuZG8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfamEudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19qYS50eHQKaW5kZXggYmMzMDc3ZS4uZDQzMjFiZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19qYS50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19qYS50eHQKQEAgLTEsMTI3ICsxLDEyNyBAQAotIw0KLSMgVGhpcyBmaWxlIGRlZmluZXMgYSBzdG9wd29yZCBzZXQgZm9yIEphcGFuZXNlLg0KLSMNCi0jIFRoaXMgc2V0IGlzIG1hZGUgdXAgb2YgaGFuZC1waWNrZWQgZnJlcXVlbnQgdGVybXMgZnJvbSBzZWdtZW50ZWQgSmFwYW5lc2UgV2lraXBlZGlhLg0KLSMgUHVuY3R1YXRpb24gY2hhcmFjdGVycyBhbmQgZnJlcXVlbnQga2FuamkgaGF2ZSBtb3N0bHkgYmVlbiBsZWZ0IG91dC4gIFNlZSBMVUNFTkUtMzc0NQ0KLSMgZm9yIGZyZXF1ZW5jeSBsaXN0cywgZXRjLiB0aGF0IGNhbiBiZSB1c2VmdWwgZm9yIG1ha2luZyB5b3VyIG93biBzZXQgKGlmIGRlc2lyZWQpDQotIw0KLSMgTm90ZSB0aGF0IHRoZXJlIGlzIGFuIG92ZXJsYXAgYmV0d2VlbiB0aGVzZSBzdG9wd29yZHMgYW5kIHRoZSB0ZXJtcyBzdG9wcGVkIHdoZW4gdXNlZA0KLSMgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgSmFwYW5lc2VQYXJ0T2ZTcGVlY2hTdG9wRmlsdGVyLiAgV2hlbiBlZGl0aW5nIHRoaXMgZmlsZSwgbm90ZQ0KLSMgdGhhdCBjb21tZW50cyBhcmUgbm90IGFsbG93ZWQgb24gdGhlIHNhbWUgbGluZSBhcyBzdG9wd29yZHMuDQotIw0KLSMgQWxzbyBub3RlIHRoYXQgc3RvcHBpbmcgaXMgZG9uZSBpbiBhIGNhc2UtaW5zZW5zaXRpdmUgbWFubmVyLiAgQ2hhbmdlIHlvdXIgU3RvcEZpbHRlcg0KLSMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCBjYXNlLXNlbnNpdGl2ZSBzdG9wcGluZy4gIExhc3RseSwgbm90ZSB0aGF0IHN0b3BwaW5nIGlzIGRvbmUNCi0jIHVzaW5nIHRoZSBzYW1lIGNoYXJhY3RlciB3aWR0aCBhcyB0aGUgZW50cmllcyBpbiB0aGlzIGZpbGUuICBTaW5jZSB0aGlzIFN0b3BGaWx0ZXIgaXMNCi0jIG5vcm1hbGx5IGRvbmUgYWZ0ZXIgYSBDSktXaWR0aEZpbHRlciBpbiB5b3VyIGNoYWluLCB5b3Ugd291bGQgdXN1YWxseSB3YW50IHlvdXIgcm9tYWppDQotIyBlbnRyaWVzIHRvIGJlIGluIGhhbGYtd2lkdGggYW5kIHlvdXIga2FuYSBlbnRyaWVzIHRvIGJlIGluIGZ1bGwtd2lkdGguDQotIw0KLeOBrg0KLeOBqw0KLeOBrw0KLeOCkg0KLeOBnw0KLeOBjA0KLeOBpw0KLeOBpg0KLeOBqA0KLeOBlw0KLeOCjA0KLeOBlQ0KLeOBguOCiw0KLeOBhOOCiw0KLeOCgg0KLeOBmeOCiw0KLeOBi+OCiQ0KLeOBqg0KLeOBk+OBqA0KLeOBqOOBl+OBpg0KLeOBhA0KLeOChA0KLeOCjOOCiw0KLeOBquOBqQ0KLeOBquOBow0KLeOBquOBhA0KLeOBk+OBrg0KLeOBn+OCgQ0KLeOBneOBrg0KLeOBguOBow0KLeOCiOOBhg0KLeOBvuOBnw0KLeOCguOBrg0KLeOBqOOBhOOBhg0KLeOBguOCig0KLeOBvuOBpw0KLeOCieOCjA0KLeOBquOCiw0KLeOBuA0KLeOBiw0KLeOBoA0KLeOBk+OCjA0KLeOBq+OCiOOBo+OBpg0KLeOBq+OCiOOCig0KLeOBiuOCig0KLeOCiOOCig0KLeOBq+OCiOOCiw0KLeOBmg0KLeOBquOCig0KLeOCieOCjOOCiw0KLeOBq+OBiuOBhOOBpg0KLeOBsA0KLeOBquOBi+OBow0KLeOBquOBjw0KLeOBl+OBi+OBlw0KLeOBq+OBpOOBhOOBpg0KLeOBmw0KLeOBoOOBow0KLeOBneOBruW+jA0KLeOBp+OBjeOCiw0KLeOBneOCjA0KLeOBhg0KLeOBruOBpw0KLeOBquOBig0KLeOBruOBvw0KLeOBp+OBjQ0KLeOBjQ0KLeOBpA0KLeOBq+OBiuOBkeOCiw0KLeOBiuOCiOOBsw0KLeOBhOOBhg0KLeOBleOCieOBqw0KLeOBp+OCgg0KLeOCiQ0KLeOBn+OCig0KLeOBneOBruS7lg0KLeOBq+mWouOBmeOCiw0KLeOBn+OBoQ0KLeOBvuOBmQ0KLeOCkw0KLeOBquOCiQ0KLeOBq+WvvuOBl+OBpg0KLeeJueOBqw0KLeOBm+OCiw0KLeWPiuOBsw0KLeOBk+OCjOOCiQ0KLeOBqOOBjQ0KLeOBp+OBrw0KLeOBq+OBpg0KLeOBu+OBiw0KLeOBquOBjOOCiQ0KLeOBhuOBoQ0KLeOBneOBl+OBpg0KLeOBqOOBqOOCguOBqw0KLeOBn+OBoOOBlw0KLeOBi+OBpOOBpg0KLeOBneOCjOOBnuOCjA0KLeOBvuOBn+OBrw0KLeOBig0KLeOBu+OBqQ0KLeOCguOBruOBrg0KLeOBq+WvvuOBmeOCiw0KLeOBu+OBqOOCk+OBqQ0KLeOBqOWFseOBqw0KLeOBqOOBhOOBo+OBnw0KLeOBp+OBmQ0KLeOBqOOCgg0KLeOBqOOBk+OCjQ0KLeOBk+OBkw0KLSMjIyMjIEVuZCBvZiBmaWxlDQorIworIyBUaGlzIGZpbGUgZGVmaW5lcyBhIHN0b3B3b3JkIHNldCBmb3IgSmFwYW5lc2UuCisjCisjIFRoaXMgc2V0IGlzIG1hZGUgdXAgb2YgaGFuZC1waWNrZWQgZnJlcXVlbnQgdGVybXMgZnJvbSBzZWdtZW50ZWQgSmFwYW5lc2UgV2lraXBlZGlhLgorIyBQdW5jdHVhdGlvbiBjaGFyYWN0ZXJzIGFuZCBmcmVxdWVudCBrYW5qaSBoYXZlIG1vc3RseSBiZWVuIGxlZnQgb3V0LiAgU2VlIExVQ0VORS0zNzQ1CisjIGZvciBmcmVxdWVuY3kgbGlzdHMsIGV0Yy4gdGhhdCBjYW4gYmUgdXNlZnVsIGZvciBtYWtpbmcgeW91ciBvd24gc2V0IChpZiBkZXNpcmVkKQorIworIyBOb3RlIHRoYXQgdGhlcmUgaXMgYW4gb3ZlcmxhcCBiZXR3ZWVuIHRoZXNlIHN0b3B3b3JkcyBhbmQgdGhlIHRlcm1zIHN0b3BwZWQgd2hlbiB1c2VkCisjIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIEphcGFuZXNlUGFydE9mU3BlZWNoU3RvcEZpbHRlci4gIFdoZW4gZWRpdGluZyB0aGlzIGZpbGUsIG5vdGUKKyMgdGhhdCBjb21tZW50cyBhcmUgbm90IGFsbG93ZWQgb24gdGhlIHNhbWUgbGluZSBhcyBzdG9wd29yZHMuCisjCisjIEFsc28gbm90ZSB0aGF0IHN0b3BwaW5nIGlzIGRvbmUgaW4gYSBjYXNlLWluc2Vuc2l0aXZlIG1hbm5lci4gIENoYW5nZSB5b3VyIFN0b3BGaWx0ZXIKKyMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCBjYXNlLXNlbnNpdGl2ZSBzdG9wcGluZy4gIExhc3RseSwgbm90ZSB0aGF0IHN0b3BwaW5nIGlzIGRvbmUKKyMgdXNpbmcgdGhlIHNhbWUgY2hhcmFjdGVyIHdpZHRoIGFzIHRoZSBlbnRyaWVzIGluIHRoaXMgZmlsZS4gIFNpbmNlIHRoaXMgU3RvcEZpbHRlciBpcworIyBub3JtYWxseSBkb25lIGFmdGVyIGEgQ0pLV2lkdGhGaWx0ZXIgaW4geW91ciBjaGFpbiwgeW91IHdvdWxkIHVzdWFsbHkgd2FudCB5b3VyIHJvbWFqaQorIyBlbnRyaWVzIHRvIGJlIGluIGhhbGYtd2lkdGggYW5kIHlvdXIga2FuYSBlbnRyaWVzIHRvIGJlIGluIGZ1bGwtd2lkdGguCisjCivjga4KK+OBqwor44GvCivjgpIKK+OBnwor44GMCivjgacKK+OBpgor44GoCivjgZcKK+OCjAor44GVCivjgYLjgosKK+OBhOOCiwor44KCCivjgZnjgosKK+OBi+OCiQor44GqCivjgZPjgagKK+OBqOOBl+OBpgor44GECivjgoQKK+OCjOOCiwor44Gq44GpCivjgarjgaMKK+OBquOBhAor44GT44GuCivjgZ/jgoEKK+OBneOBrgor44GC44GjCivjgojjgYYKK+OBvuOBnwor44KC44GuCivjgajjgYTjgYYKK+OBguOCigor44G+44GnCivjgonjgowKK+OBquOCiwor44G4CivjgYsKK+OBoAor44GT44KMCivjgavjgojjgaPjgaYKK+OBq+OCiOOCigor44GK44KKCivjgojjgooKK+OBq+OCiOOCiwor44GaCivjgarjgooKK+OCieOCjOOCiwor44Gr44GK44GE44GmCivjgbAKK+OBquOBi+OBowor44Gq44GPCivjgZfjgYvjgZcKK+OBq+OBpOOBhOOBpgor44GbCivjgaDjgaMKK+OBneOBruW+jAor44Gn44GN44KLCivjgZ3jgowKK+OBhgor44Gu44GnCivjgarjgYoKK+OBruOBvwor44Gn44GNCivjgY0KK+OBpAor44Gr44GK44GR44KLCivjgYrjgojjgbMKK+OBhOOBhgor44GV44KJ44GrCivjgafjgoIKK+OCiQor44Gf44KKCivjgZ3jga7ku5YKK+OBq+mWouOBmeOCiwor44Gf44GhCivjgb7jgZkKK+OCkwor44Gq44KJCivjgavlr77jgZfjgaYKK+eJueOBqwor44Gb44KLCivlj4rjgbMKK+OBk+OCjOOCiQor44Go44GNCivjgafjga8KK+OBq+OBpgor44G744GLCivjgarjgYzjgokKK+OBhuOBoQor44Gd44GX44GmCivjgajjgajjgoLjgasKK+OBn+OBoOOBlwor44GL44Gk44GmCivjgZ3jgozjgZ7jgowKK+OBvuOBn+OBrwor44GKCivjgbvjgakKK+OCguOBruOBrgor44Gr5a++44GZ44KLCivjgbvjgajjgpPjgakKK+OBqOWFseOBqwor44Go44GE44Gj44GfCivjgafjgZkKK+OBqOOCggor44Go44GT44KNCivjgZPjgZMKKyMjIyMjIEVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX2x2LnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfbHYudHh0CmluZGV4IGE0NzEwOTcuLmUyMWEyM2MgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfbHYudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfbHYudHh0CkBAIC0xLDE3MiArMSwxNzIgQEAKLSMgU2V0IG9mIExhdHZpYW4gc3RvcHdvcmRzIGZyb20gQSBTdGVtbWluZyBBbGdvcml0aG0gZm9yIExhdHZpYW4sIEthcmxpcyBLcmVzbGlucw0KLSMgdGhlIG9yaWdpbmFsIGxpc3Qgb2Ygb3ZlciA4MDAgZm9ybXMgd2FzIHJlZmluZWQ6IA0KLSMgICBwcm9ub3VucywgYWR2ZXJicywgaW50ZXJqZWN0aW9ucyB3ZXJlIHJlbW92ZWQNCi0jIA0KLSMgcHJlcG9zaXRpb25zDQotYWl6DQotYXANCi1hcg0KLWFwYWvFoQ0KLcSBcnB1cw0KLWF1Z8WhcHVzDQotYmV6DQotY2F1cg0KLWTEk8S8DQotZ2FyDQotaWVrxaENCi1peg0KLWtvcMWhDQotbGFiYWQNCi1sZWpwdXMNCi1sxKtkeg0KLW5vDQotb3RycHVzDQotcGENCi1wYXINCi1wxIFyDQotcMSTYw0KLXBpZQ0KLXBpcm1zDQotcHJldA0KLXByaWVrxaENCi1zdGFycA0KLcWhYWlwdXMNCi11eg0KLXZpxYZwdXMNCi12aXJzDQotdmlyc3B1cw0KLXplbQ0KLWFwYWvFoXB1cw0KLSMgQ29uanVuY3Rpb25zDQotdW4NCi1iZXQNCi1qbw0KLWphDQota2ENCi1sYWkNCi10b23Ek3INCi10aWtrbw0KLXR1cnByZXTEqw0KLWFyxKsNCi1rYXV0DQotZ2FuDQotdMSBZMSTxLwNCi10xIENCi1uZQ0KLXRpa3ZpZW4NCi12aWVuDQota8SBDQotaXINCi10ZQ0KLXZhaQ0KLWthbcSTcg0KLSMgUGFydGljbGVzDQotYXINCi1kaWV6aW4NCi1kcm/FoWkNCi1kaWVtxb7Ek2wNCi1uZWLFq3QNCi1paw0KLWl0DQotdGHEjXUNCi1udQ0KLXBhdA0KLXRpa2xhYg0KLWlla8WhcHVzDQotbmVkeg0KLXRpaw0KLW5ldmlzDQotdHVycHJldGltDQotamViDQotaWVrYW0NCi1pZWvEgW0NCi1pZWvEgW1zDQota29sxKtkeg0KLWzEq2R6a28NCi10aWtsxKtkeg0KLWplYsWhdQ0KLXTEgWxhYg0KLXTEgXDEk2MNCi1uZWvEgQ0KLWl0aW4NCi1qxIENCi1qYXUNCi1qZWwNCi1uxJMNCi1uZXppbg0KLXRhZA0KLXRpa2FpDQotdmlzDQotdGFrDQotaWVrYW1zDQotdmllbg0KLSMgbW9kYWwgdmVyYnMNCi1ixat0ICANCi1iaWp1IA0KLWJpamkNCi1iaWphDQotYmlqxIFtDQotYmlqxIF0DQotZXNtdQ0KLWVzaQ0KLWVzYW0NCi1lc2F0IA0KLWLFq8WhdSAgICAgDQotYsWrc2kNCi1ixatzDQotYsWrc2ltDQotYsWrc2lldA0KLXRpa3QNCi10aWt1DQotdGlraQ0KLXRpa2ENCi10aWvEgW0NCi10aWvEgXQNCi10aWVrdQ0KLXRpZWMNCi10aWVrDQotdGlla2FtDQotdGlla2F0DQotdGlrxaF1DQotdGlrcw0KLXRpa3NpbQ0KLXRpa3NpZXQNCi10YXB0DQotdGFwaQ0KLXRhcMSBdA0KLXRvcGF0DQotdGFwxaF1DQotdGFwc2kNCi10YXBzDQotdGFwc2ltDQotdGFwc2lldA0KLWvEvMWrdA0KLWvEvHV2dQ0KLWvEvHV2aQ0KLWvEvHV2YQ0KLWvEvHV2xIFtDQota8S8dXbEgXQNCi1rxLzFq3N0dQ0KLWvEvMWrc3RpDQota8S8xatzdA0KLWvEvMWrc3RhbQ0KLWvEvMWrc3RhdA0KLWvEvMWrxaF1DQota8S8xatzaQ0KLWvEvMWrcw0KLWvEvMWrc2ltDQota8S8xatzaWV0DQotIyB2ZXJicw0KLXZhcsSTdA0KLXZhcsSTanUNCi12YXLEk2rEgW0NCi12YXLEk8WhdQ0KLXZhcsSTc2ltDQotdmFyDQotdmFyxJNqaQ0KLXZhcsSTasSBdA0KLXZhcsSTc2kNCi12YXLEk3NpZXQNCi12YXJhdA0KLXZhcsSTamENCi12YXLEk3MNCisjIFNldCBvZiBMYXR2aWFuIHN0b3B3b3JkcyBmcm9tIEEgU3RlbW1pbmcgQWxnb3JpdGhtIGZvciBMYXR2aWFuLCBLYXJsaXMgS3Jlc2xpbnMKKyMgdGhlIG9yaWdpbmFsIGxpc3Qgb2Ygb3ZlciA4MDAgZm9ybXMgd2FzIHJlZmluZWQ6IAorIyAgIHByb25vdW5zLCBhZHZlcmJzLCBpbnRlcmplY3Rpb25zIHdlcmUgcmVtb3ZlZAorIyAKKyMgcHJlcG9zaXRpb25zCithaXoKK2FwCithcgorYXBha8WhCivEgXJwdXMKK2F1Z8WhcHVzCitiZXoKK2NhdXIKK2TEk8S8CitnYXIKK2lla8WhCitpegora29wxaEKK2xhYmFkCitsZWpwdXMKK2zEq2R6Citubworb3RycHVzCitwYQorcGFyCitwxIFyCitwxJNjCitwaWUKK3Bpcm1zCitwcmV0Citwcmlla8WhCitzdGFycAorxaFhaXB1cwordXoKK3ZpxYZwdXMKK3ZpcnMKK3ZpcnNwdXMKK3plbQorYXBha8WhcHVzCisjIENvbmp1bmN0aW9ucwordW4KK2JldAoram8KK2phCitrYQorbGFpCit0b23Ek3IKK3Rpa2tvCit0dXJwcmV0xKsKK2FyxKsKK2thdXQKK2dhbgordMSBZMSTxLwKK3TEgQorbmUKK3Rpa3ZpZW4KK3ZpZW4KK2vEgQoraXIKK3RlCit2YWkKK2thbcSTcgorIyBQYXJ0aWNsZXMKK2FyCitkaWV6aW4KK2Ryb8WhaQorZGllbcW+xJNsCituZWLFq3QKK2lrCitpdAordGHEjXUKK251CitwYXQKK3Rpa2xhYgoraWVrxaFwdXMKK25lZHoKK3RpaworbmV2aXMKK3R1cnByZXRpbQoramViCitpZWthbQoraWVrxIFtCitpZWvEgW1zCitrb2zEq2R6CitsxKtkemtvCit0aWtsxKtkegoramVixaF1Cit0xIFsYWIKK3TEgXDEk2MKK25la8SBCitpdGluCitqxIEKK2phdQoramVsCituxJMKK25lemluCit0YWQKK3Rpa2FpCit2aXMKK3RhaworaWVrYW1zCit2aWVuCisjIG1vZGFsIHZlcmJzCitixat0ICAKK2JpanUgCitiaWppCitiaWphCitiaWrEgW0KK2JpasSBdAorZXNtdQorZXNpCitlc2FtCitlc2F0IAorYsWrxaF1ICAgICAKK2LFq3NpCitixatzCitixatzaW0KK2LFq3NpZXQKK3Rpa3QKK3Rpa3UKK3Rpa2kKK3Rpa2EKK3Rpa8SBbQordGlrxIF0Cit0aWVrdQordGllYwordGllawordGlla2FtCit0aWVrYXQKK3Rpa8WhdQordGlrcwordGlrc2ltCit0aWtzaWV0Cit0YXB0Cit0YXBpCit0YXDEgXQKK3RvcGF0Cit0YXDFoXUKK3RhcHNpCit0YXBzCit0YXBzaW0KK3RhcHNpZXQKK2vEvMWrdAora8S8dXZ1CitrxLx1dmkKK2vEvHV2YQora8S8dXbEgW0KK2vEvHV2xIF0CitrxLzFq3N0dQora8S8xatzdGkKK2vEvMWrc3QKK2vEvMWrc3RhbQora8S8xatzdGF0CitrxLzFq8WhdQora8S8xatzaQora8S8xatzCitrxLzFq3NpbQora8S8xatzaWV0CisjIHZlcmJzCit2YXLEk3QKK3ZhcsSTanUKK3ZhcsSTasSBbQordmFyxJPFoXUKK3ZhcsSTc2ltCit2YXIKK3ZhcsSTamkKK3ZhcsSTasSBdAordmFyxJNzaQordmFyxJNzaWV0Cit2YXJhdAordmFyxJNqYQordmFyxJNzCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX25sLnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfbmwudHh0CmluZGV4IDA2Y2E3NWIuLjQ3YTJhZWEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfbmwudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfbmwudHh0CkBAIC0xLDExOSArMSwxMTkgQEAKLSB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvZHV0Y2gvc3RvcC50eHQNCi0gfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLg0KLSB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwDQotIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sDQotIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4NCi0gfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuDQotIHwNCi0gfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCINCi0NCi0gfCBBIER1dGNoIHN0b3Agd29yZCBsaXN0LiBDb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gRWFjaCBzdG9wDQotIHwgd29yZCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLg0KLQ0KLSB8IFRoaXMgaXMgYSByYW5rZWQgbGlzdCAoY29tbW9uZXN0IHRvIHJhcmVzdCkgb2Ygc3RvcHdvcmRzIGRlcml2ZWQgZnJvbQ0KLSB8IGEgbGFyZ2Ugc2FtcGxlIG9mIER1dGNoIHRleHQuDQotDQotIHwgRHV0Y2ggc3RvcCB3b3JkcyBmcmVxdWVudGx5IGV4aGliaXQgaG9tb255bSBjbGFzaGVzLiBUaGVzZSBhcmUgaW5kaWNhdGVkDQotIHwgY2xlYXJseSBiZWxvdy4NCi0NCi1kZSAgICAgICAgICAgICB8ICB0aGUNCi1lbiAgICAgICAgICAgICB8ICBhbmQNCi12YW4gICAgICAgICAgICB8ICBvZiwgZnJvbQ0KLWlrICAgICAgICAgICAgIHwgIEksIHRoZSBlZ28NCi10ZSAgICAgICAgICAgICB8ICAoMSkgY2hleiwgYXQgZXRjLCAoMikgdG8sICgzKSB0b28NCi1kYXQgICAgICAgICAgICB8ICB0aGF0LCB3aGljaA0KLWRpZSAgICAgICAgICAgIHwgIHRoYXQsIHRob3NlLCB3aG8sIHdoaWNoDQotaW4gICAgICAgICAgICAgfCAgaW4sIGluc2lkZQ0KLWVlbiAgICAgICAgICAgIHwgIGEsIGFuLCBvbmUNCi1oaWogICAgICAgICAgICB8ICBoZQ0KLWhldCAgICAgICAgICAgIHwgIHRoZSwgaXQNCi1uaWV0ICAgICAgICAgICB8ICBub3QsIG5vdGhpbmcsIG5hdWdodA0KLXppam4gICAgICAgICAgIHwgICgxKSB0byBiZSwgYmVpbmcsICgyKSBoaXMsIG9uZSdzLCBpdHMNCi1pcyAgICAgICAgICAgICB8ICBpcw0KLXdhcyAgICAgICAgICAgIHwgICgxKSB3YXMsIHBhc3QgdGVuc2Ugb2YgYWxsIHBlcnNvbnMgc2luZy4gb2YgJ3ppam4nICh0byBiZSkgKDIpIHdheCwgKDMpIHRoZSB3YXNoaW5nLCAoNCkgcmlzZSBvZiByaXZlcg0KLW9wICAgICAgICAgICAgIHwgIG9uLCB1cG9uLCBhdCwgaW4sIHVwLCB1c2VkIHVwDQotYWFuICAgICAgICAgICAgfCAgb24sIHVwb24sIHRvIChhcyBkYXRpdmUpDQotbWV0ICAgICAgICAgICAgfCAgd2l0aCwgYnkNCi1hbHMgICAgICAgICAgICB8ICBsaWtlLCBzdWNoIGFzLCB3aGVuDQotdm9vciAgICAgICAgICAgfCAgKDEpIGJlZm9yZSwgaW4gZnJvbnQgb2YsICgyKSBmdXJyb3cNCi1oYWQgICAgICAgICAgICB8ICBoYWQsIHBhc3QgdGVuc2UgYWxsIHBlcnNvbnMgc2luZy4gb2YgJ2hlYmJlbicgKGhhdmUpDQotZXIgICAgICAgICAgICAgfCAgdGhlcmUNCi1tYWFyICAgICAgICAgICB8ICBidXQsIG9ubHkNCi1vbSAgICAgICAgICAgICB8ICByb3VuZCwgYWJvdXQsIGZvciBldGMNCi1oZW0gICAgICAgICAgICB8ICBoaW0NCi1kYW4gICAgICAgICAgICB8ICB0aGVuDQotem91ICAgICAgICAgICAgfCAgc2hvdWxkL3dvdWxkLCBwYXN0IHRlbnNlIGFsbCBwZXJzb25zIHNpbmcuIG9mICd6dWxsZW4nDQotb2YgICAgICAgICAgICAgfCAgb3IsIHdoZXRoZXIsIGlmDQotd2F0ICAgICAgICAgICAgfCAgd2hhdCwgc29tZXRoaW5nLCBhbnl0aGluZw0KLW1pam4gICAgICAgICAgIHwgIHBvc3Nlc3NpdmUgYW5kIG5vdW4gJ21pbmUnDQotbWVuICAgICAgICAgICAgfCAgcGVvcGxlLCAnb25lJw0KLWRpdCAgICAgICAgICAgIHwgIHRoaXMNCi16byAgICAgICAgICAgICB8ICBzbywgdGh1cywgaW4gdGhpcyB3YXkNCi1kb29yICAgICAgICAgICB8ICB0aHJvdWdoIGJ5DQotb3ZlciAgICAgICAgICAgfCAgb3ZlciwgYWNyb3NzDQotemUgICAgICAgICAgICAgfCAgc2hlLCBoZXIsIHRoZXksIHRoZW0NCi16aWNoICAgICAgICAgICB8ICBvbmVzZWxmDQotYmlqICAgICAgICAgICAgfCAgKDEpIGEgYmVlLCAoMikgYnksIG5lYXIsIGF0DQotb29rICAgICAgICAgICAgfCAgYWxzbywgdG9vDQotdG90ICAgICAgICAgICAgfCAgdGlsbCwgdW50aWwNCi1qZSAgICAgICAgICAgICB8ICB5b3UNCi1taWogICAgICAgICAgICB8ICBtZQ0KLXVpdCAgICAgICAgICAgIHwgIG91dCBvZiwgZnJvbQ0KLWRlciAgICAgICAgICAgIHwgIE9sZCBEdXRjaCBmb3JtIG9mICd2YW4gZGVyJyBzdGlsbCBmb3VuZCBpbiBzdXJuYW1lcw0KLWRhYXIgICAgICAgICAgIHwgICgxKSB0aGVyZSwgKDIpIGJlY2F1c2UNCi1oYWFyICAgICAgICAgICB8ICAoMSkgaGVyLCB0aGVpciwgdGhlbSwgKDIpIGhhaXINCi1uYWFyICAgICAgICAgICB8ICAoMSkgdW5wbGVhc2FudCwgdW53ZWxsIGV0YywgKDIpIHRvd2FyZHMsICgzKSBhcw0KLWhlYiAgICAgICAgICAgIHwgIHByZXNlbnQgZmlyc3QgcGVyc29uIHNpbmcuIG9mICd0byBoYXZlJw0KLWhvZSAgICAgICAgICAgIHwgIGhvdywgd2h5DQotaGVlZnQgICAgICAgICAgfCAgcHJlc2VudCB0aGlyZCBwZXJzb24gc2luZy4gb2YgJ3RvIGhhdmUnDQotaGViYmVuICAgICAgICAgfCAgJ3RvIGhhdmUnIGFuZCB2YXJpb3VzIHBhcnRzIHRoZXJlb2YNCi1kZXplICAgICAgICAgICB8ICB0aGlzDQotdSAgICAgICAgICAgICAgfCAgeW91DQotd2FudCAgICAgICAgICAgfCAgKDEpIGZvciwgKDIpIG1pdHRlbiwgKDMpIHJpZ2dpbmcNCi1ub2cgICAgICAgICAgICB8ICB5ZXQsIHN0aWxsDQotemFsICAgICAgICAgICAgfCAgJ3NoYWxsJywgZmlyc3QgYW5kIHRoaXJkIHBlcnNvbiBzaW5nLiBvZiB2ZXJiICd6dWxsZW4nICh3aWxsKQ0KLW1lICAgICAgICAgICAgIHwgIG1lDQotemlqICAgICAgICAgICAgfCAgc2hlLCB0aGV5DQotbnUgICAgICAgICAgICAgfCAgbm93DQotZ2UgICAgICAgICAgICAgfCAgJ3Rob3UnLCBzdGlsbCB1c2VkIGluIEJlbGdpdW0gYW5kIHNvdXRoIE5ldGhlcmxhbmRzDQotZ2VlbiAgICAgICAgICAgfCAgbm9uZQ0KLW9tZGF0ICAgICAgICAgIHwgIGJlY2F1c2UNCi1pZXRzICAgICAgICAgICB8ICBzb21ldGhpbmcsIHNvbWV3aGF0DQotd29yZGVuICAgICAgICAgfCAgdG8gYmVjb21lLCBncm93LCBnZXQNCi10b2NoICAgICAgICAgICB8ICB5ZXQsIHN0aWxsDQotYWwgICAgICAgICAgICAgfCAgYWxsLCBldmVyeSwgZWFjaA0KLXdhcmVuICAgICAgICAgIHwgICgxKSAnd2VyZScgKDIpIHRvIHdhbmRlciwgKDMpIHdhcmVzLCAoMykNCi12ZWVsICAgICAgICAgICB8ICBtdWNoLCBtYW55DQotbWVlciAgICAgICAgICAgfCAgKDEpIG1vcmUsICgyKSBsYWtlDQotZG9lbiAgICAgICAgICAgfCAgdG8gZG8sIHRvIG1ha2UNCi10b2VuICAgICAgICAgICB8ICB0aGVuLCB3aGVuDQotbW9ldCAgICAgICAgICAgfCAgbm91biAnc3BvdC9tb3RlJyBhbmQgcHJlc2VudCBmb3JtIG9mICd0byBtdXN0Jw0KLWJlbiAgICAgICAgICAgIHwgICgxKSBhbSwgKDIpICdhcmUnIGluIGludGVycm9nYXRpdmUgc2Vjb25kIHBlcnNvbiBzaW5ndWxhciBvZiAndG8gYmUnDQotem9uZGVyICAgICAgICAgfCAgd2l0aG91dA0KLWthbiAgICAgICAgICAgIHwgIG5vdW4gJ2NhbicgYW5kIHByZXNlbnQgZm9ybSBvZiAndG8gYmUgYWJsZScNCi1odW4gICAgICAgICAgICB8ICB0aGVpciwgdGhlbQ0KLWR1cyAgICAgICAgICAgIHwgIHNvLCBjb25zZXF1ZW50bHkNCi1hbGxlcyAgICAgICAgICB8ICBhbGwsIGV2ZXJ5dGhpbmcsIGFueXRoaW5nDQotb25kZXIgICAgICAgICAgfCAgdW5kZXIsIGJlbmVhdGgNCi1qYSAgICAgICAgICAgICB8ICB5ZXMsIG9mIGNvdXJzZQ0KLWVlbnMgICAgICAgICAgIHwgIG9uY2UsIG9uZSBkYXkNCi1oaWVyICAgICAgICAgICB8ICBoZXJlDQotd2llICAgICAgICAgICAgfCAgd2hvDQotd2VyZCAgICAgICAgICAgfCAgaW1wZXJmZWN0IHRoaXJkIHBlcnNvbiBzaW5nLiBvZiAnYmVjb21lJw0KLWFsdGlqZCAgICAgICAgIHwgIGFsd2F5cw0KLWRvY2ggICAgICAgICAgIHwgIHlldCwgYnV0IGV0Yw0KLXdvcmR0ICAgICAgICAgIHwgIHByZXNlbnQgdGhpcmQgcGVyc29uIHNpbmcuIG9mICdiZWNvbWUnDQotd2V6ZW4gICAgICAgICAgfCAgKDEpIHRvIGJlLCAoMikgJ2JlZW4nIGFzIGluICdiZWVuIGZpc2hpbmcnLCAoMykgb3JwaGFucw0KLWt1bm5lbiAgICAgICAgIHwgIHRvIGJlIGFibGUNCi1vbnMgICAgICAgICAgICB8ICB1cy9vdXINCi16ZWxmICAgICAgICAgICB8ICBzZWxmDQotdGVnZW4gICAgICAgICAgfCAgYWdhaW5zdCwgdG93YXJkcywgYXQNCi1uYSAgICAgICAgICAgICB8ICBhZnRlciwgbmVhcg0KLXJlZWRzICAgICAgICAgIHwgIGFscmVhZHkNCi13aWwgICAgICAgICAgICB8ICAoMSkgcHJlc2VudCB0ZW5zZSBvZiAnd2FudCcsICgyKSAnd2lsbCcsIG5vdW4sICgzKSBmZW5kZXINCi1rb24gICAgICAgICAgICB8ICBjb3VsZDsgcGFzdCB0ZW5zZSBvZiAndG8gYmUgYWJsZScNCi1uaWV0cyAgICAgICAgICB8ICBub3RoaW5nDQotdXcgICAgICAgICAgICAgfCAgeW91cg0KLWllbWFuZCAgICAgICAgIHwgIHNvbWVib2R5DQotZ2V3ZWVzdCAgICAgICAgfCAgYmVlbjsgcGFzdCBwYXJ0aWNpcGxlIG9mICdiZScNCi1hbmRlcmUgICAgICAgICB8ICBvdGhlcg0KKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvZHV0Y2gvc3RvcC50eHQKKyB8IFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCisgfCBTZWUgaHR0cDovL3Nub3diYWxsLnRhcnRhcnVzLm9yZy9saWNlbnNlLnBocAorIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCisgfCAgLSBFbmNvZGluZyB3YXMgY29udmVydGVkIHRvIFVURi04LgorIHwgIC0gVGhpcyBub3RpY2Ugd2FzIGFkZGVkLgorIHwKKyB8IE5PVEU6IFRvIHVzZSB0aGlzIGZpbGUgd2l0aCBTdG9wRmlsdGVyRmFjdG9yeSwgeW91IG11c3Qgc3BlY2lmeSBmb3JtYXQ9InNub3diYWxsIgorCisgfCBBIER1dGNoIHN0b3Agd29yZCBsaXN0LiBDb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gRWFjaCBzdG9wCisgfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisKKyB8IFRoaXMgaXMgYSByYW5rZWQgbGlzdCAoY29tbW9uZXN0IHRvIHJhcmVzdCkgb2Ygc3RvcHdvcmRzIGRlcml2ZWQgZnJvbQorIHwgYSBsYXJnZSBzYW1wbGUgb2YgRHV0Y2ggdGV4dC4KKworIHwgRHV0Y2ggc3RvcCB3b3JkcyBmcmVxdWVudGx5IGV4aGliaXQgaG9tb255bSBjbGFzaGVzLiBUaGVzZSBhcmUgaW5kaWNhdGVkCisgfCBjbGVhcmx5IGJlbG93LgorCitkZSAgICAgICAgICAgICB8ICB0aGUKK2VuICAgICAgICAgICAgIHwgIGFuZAordmFuICAgICAgICAgICAgfCAgb2YsIGZyb20KK2lrICAgICAgICAgICAgIHwgIEksIHRoZSBlZ28KK3RlICAgICAgICAgICAgIHwgICgxKSBjaGV6LCBhdCBldGMsICgyKSB0bywgKDMpIHRvbworZGF0ICAgICAgICAgICAgfCAgdGhhdCwgd2hpY2gKK2RpZSAgICAgICAgICAgIHwgIHRoYXQsIHRob3NlLCB3aG8sIHdoaWNoCitpbiAgICAgICAgICAgICB8ICBpbiwgaW5zaWRlCitlZW4gICAgICAgICAgICB8ICBhLCBhbiwgb25lCitoaWogICAgICAgICAgICB8ICBoZQoraGV0ICAgICAgICAgICAgfCAgdGhlLCBpdAorbmlldCAgICAgICAgICAgfCAgbm90LCBub3RoaW5nLCBuYXVnaHQKK3ppam4gICAgICAgICAgIHwgICgxKSB0byBiZSwgYmVpbmcsICgyKSBoaXMsIG9uZSdzLCBpdHMKK2lzICAgICAgICAgICAgIHwgIGlzCit3YXMgICAgICAgICAgICB8ICAoMSkgd2FzLCBwYXN0IHRlbnNlIG9mIGFsbCBwZXJzb25zIHNpbmcuIG9mICd6aWpuJyAodG8gYmUpICgyKSB3YXgsICgzKSB0aGUgd2FzaGluZywgKDQpIHJpc2Ugb2Ygcml2ZXIKK29wICAgICAgICAgICAgIHwgIG9uLCB1cG9uLCBhdCwgaW4sIHVwLCB1c2VkIHVwCithYW4gICAgICAgICAgICB8ICBvbiwgdXBvbiwgdG8gKGFzIGRhdGl2ZSkKK21ldCAgICAgICAgICAgIHwgIHdpdGgsIGJ5CithbHMgICAgICAgICAgICB8ICBsaWtlLCBzdWNoIGFzLCB3aGVuCit2b29yICAgICAgICAgICB8ICAoMSkgYmVmb3JlLCBpbiBmcm9udCBvZiwgKDIpIGZ1cnJvdworaGFkICAgICAgICAgICAgfCAgaGFkLCBwYXN0IHRlbnNlIGFsbCBwZXJzb25zIHNpbmcuIG9mICdoZWJiZW4nIChoYXZlKQorZXIgICAgICAgICAgICAgfCAgdGhlcmUKK21hYXIgICAgICAgICAgIHwgIGJ1dCwgb25seQorb20gICAgICAgICAgICAgfCAgcm91bmQsIGFib3V0LCBmb3IgZXRjCitoZW0gICAgICAgICAgICB8ICBoaW0KK2RhbiAgICAgICAgICAgIHwgIHRoZW4KK3pvdSAgICAgICAgICAgIHwgIHNob3VsZC93b3VsZCwgcGFzdCB0ZW5zZSBhbGwgcGVyc29ucyBzaW5nLiBvZiAnenVsbGVuJworb2YgICAgICAgICAgICAgfCAgb3IsIHdoZXRoZXIsIGlmCit3YXQgICAgICAgICAgICB8ICB3aGF0LCBzb21ldGhpbmcsIGFueXRoaW5nCittaWpuICAgICAgICAgICB8ICBwb3NzZXNzaXZlIGFuZCBub3VuICdtaW5lJworbWVuICAgICAgICAgICAgfCAgcGVvcGxlLCAnb25lJworZGl0ICAgICAgICAgICAgfCAgdGhpcworem8gICAgICAgICAgICAgfCAgc28sIHRodXMsIGluIHRoaXMgd2F5Citkb29yICAgICAgICAgICB8ICB0aHJvdWdoIGJ5CitvdmVyICAgICAgICAgICB8ICBvdmVyLCBhY3Jvc3MKK3plICAgICAgICAgICAgIHwgIHNoZSwgaGVyLCB0aGV5LCB0aGVtCit6aWNoICAgICAgICAgICB8ICBvbmVzZWxmCitiaWogICAgICAgICAgICB8ICAoMSkgYSBiZWUsICgyKSBieSwgbmVhciwgYXQKK29vayAgICAgICAgICAgIHwgIGFsc28sIHRvbwordG90ICAgICAgICAgICAgfCAgdGlsbCwgdW50aWwKK2plICAgICAgICAgICAgIHwgIHlvdQorbWlqICAgICAgICAgICAgfCAgbWUKK3VpdCAgICAgICAgICAgIHwgIG91dCBvZiwgZnJvbQorZGVyICAgICAgICAgICAgfCAgT2xkIER1dGNoIGZvcm0gb2YgJ3ZhbiBkZXInIHN0aWxsIGZvdW5kIGluIHN1cm5hbWVzCitkYWFyICAgICAgICAgICB8ICAoMSkgdGhlcmUsICgyKSBiZWNhdXNlCitoYWFyICAgICAgICAgICB8ICAoMSkgaGVyLCB0aGVpciwgdGhlbSwgKDIpIGhhaXIKK25hYXIgICAgICAgICAgIHwgICgxKSB1bnBsZWFzYW50LCB1bndlbGwgZXRjLCAoMikgdG93YXJkcywgKDMpIGFzCitoZWIgICAgICAgICAgICB8ICBwcmVzZW50IGZpcnN0IHBlcnNvbiBzaW5nLiBvZiAndG8gaGF2ZScKK2hvZSAgICAgICAgICAgIHwgIGhvdywgd2h5CitoZWVmdCAgICAgICAgICB8ICBwcmVzZW50IHRoaXJkIHBlcnNvbiBzaW5nLiBvZiAndG8gaGF2ZScKK2hlYmJlbiAgICAgICAgIHwgICd0byBoYXZlJyBhbmQgdmFyaW91cyBwYXJ0cyB0aGVyZW9mCitkZXplICAgICAgICAgICB8ICB0aGlzCit1ICAgICAgICAgICAgICB8ICB5b3UKK3dhbnQgICAgICAgICAgIHwgICgxKSBmb3IsICgyKSBtaXR0ZW4sICgzKSByaWdnaW5nCitub2cgICAgICAgICAgICB8ICB5ZXQsIHN0aWxsCit6YWwgICAgICAgICAgICB8ICAnc2hhbGwnLCBmaXJzdCBhbmQgdGhpcmQgcGVyc29uIHNpbmcuIG9mIHZlcmIgJ3p1bGxlbicgKHdpbGwpCittZSAgICAgICAgICAgICB8ICBtZQoremlqICAgICAgICAgICAgfCAgc2hlLCB0aGV5CitudSAgICAgICAgICAgICB8ICBub3cKK2dlICAgICAgICAgICAgIHwgICd0aG91Jywgc3RpbGwgdXNlZCBpbiBCZWxnaXVtIGFuZCBzb3V0aCBOZXRoZXJsYW5kcworZ2VlbiAgICAgICAgICAgfCAgbm9uZQorb21kYXQgICAgICAgICAgfCAgYmVjYXVzZQoraWV0cyAgICAgICAgICAgfCAgc29tZXRoaW5nLCBzb21ld2hhdAord29yZGVuICAgICAgICAgfCAgdG8gYmVjb21lLCBncm93LCBnZXQKK3RvY2ggICAgICAgICAgIHwgIHlldCwgc3RpbGwKK2FsICAgICAgICAgICAgIHwgIGFsbCwgZXZlcnksIGVhY2gKK3dhcmVuICAgICAgICAgIHwgICgxKSAnd2VyZScgKDIpIHRvIHdhbmRlciwgKDMpIHdhcmVzLCAoMykKK3ZlZWwgICAgICAgICAgIHwgIG11Y2gsIG1hbnkKK21lZXIgICAgICAgICAgIHwgICgxKSBtb3JlLCAoMikgbGFrZQorZG9lbiAgICAgICAgICAgfCAgdG8gZG8sIHRvIG1ha2UKK3RvZW4gICAgICAgICAgIHwgIHRoZW4sIHdoZW4KK21vZXQgICAgICAgICAgIHwgIG5vdW4gJ3Nwb3QvbW90ZScgYW5kIHByZXNlbnQgZm9ybSBvZiAndG8gbXVzdCcKK2JlbiAgICAgICAgICAgIHwgICgxKSBhbSwgKDIpICdhcmUnIGluIGludGVycm9nYXRpdmUgc2Vjb25kIHBlcnNvbiBzaW5ndWxhciBvZiAndG8gYmUnCit6b25kZXIgICAgICAgICB8ICB3aXRob3V0CitrYW4gICAgICAgICAgICB8ICBub3VuICdjYW4nIGFuZCBwcmVzZW50IGZvcm0gb2YgJ3RvIGJlIGFibGUnCitodW4gICAgICAgICAgICB8ICB0aGVpciwgdGhlbQorZHVzICAgICAgICAgICAgfCAgc28sIGNvbnNlcXVlbnRseQorYWxsZXMgICAgICAgICAgfCAgYWxsLCBldmVyeXRoaW5nLCBhbnl0aGluZworb25kZXIgICAgICAgICAgfCAgdW5kZXIsIGJlbmVhdGgKK2phICAgICAgICAgICAgIHwgIHllcywgb2YgY291cnNlCitlZW5zICAgICAgICAgICB8ICBvbmNlLCBvbmUgZGF5CitoaWVyICAgICAgICAgICB8ICBoZXJlCit3aWUgICAgICAgICAgICB8ICB3aG8KK3dlcmQgICAgICAgICAgIHwgIGltcGVyZmVjdCB0aGlyZCBwZXJzb24gc2luZy4gb2YgJ2JlY29tZScKK2FsdGlqZCAgICAgICAgIHwgIGFsd2F5cworZG9jaCAgICAgICAgICAgfCAgeWV0LCBidXQgZXRjCit3b3JkdCAgICAgICAgICB8ICBwcmVzZW50IHRoaXJkIHBlcnNvbiBzaW5nLiBvZiAnYmVjb21lJword2V6ZW4gICAgICAgICAgfCAgKDEpIHRvIGJlLCAoMikgJ2JlZW4nIGFzIGluICdiZWVuIGZpc2hpbmcnLCAoMykgb3JwaGFucwora3VubmVuICAgICAgICAgfCAgdG8gYmUgYWJsZQorb25zICAgICAgICAgICAgfCAgdXMvb3VyCit6ZWxmICAgICAgICAgICB8ICBzZWxmCit0ZWdlbiAgICAgICAgICB8ICBhZ2FpbnN0LCB0b3dhcmRzLCBhdAorbmEgICAgICAgICAgICAgfCAgYWZ0ZXIsIG5lYXIKK3JlZWRzICAgICAgICAgIHwgIGFscmVhZHkKK3dpbCAgICAgICAgICAgIHwgICgxKSBwcmVzZW50IHRlbnNlIG9mICd3YW50JywgKDIpICd3aWxsJywgbm91biwgKDMpIGZlbmRlcgora29uICAgICAgICAgICAgfCAgY291bGQ7IHBhc3QgdGVuc2Ugb2YgJ3RvIGJlIGFibGUnCituaWV0cyAgICAgICAgICB8ICBub3RoaW5nCit1dyAgICAgICAgICAgICB8ICB5b3VyCitpZW1hbmQgICAgICAgICB8ICBzb21lYm9keQorZ2V3ZWVzdCAgICAgICAgfCAgYmVlbjsgcGFzdCBwYXJ0aWNpcGxlIG9mICdiZScKK2FuZGVyZSAgICAgICAgIHwgIG90aGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX25vLnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfbm8udHh0CmluZGV4IDhhZWZkYTguLmE3YTJjMjggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfbm8udHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfbm8udHh0CkBAIC0xLDE5NCArMSwxOTQgQEAKLSB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvbm9yd2VnaWFuL3N0b3AudHh0DQotIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4NCi0gfCBTZWUgaHR0cDovL3Nub3diYWxsLnRhcnRhcnVzLm9yZy9saWNlbnNlLnBocA0KLSB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbA0KLSB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguDQotIHwgIC0gVGhpcyBub3RpY2Ugd2FzIGFkZGVkLg0KLSB8DQotIHwgTk9URTogVG8gdXNlIHRoaXMgZmlsZSB3aXRoIFN0b3BGaWx0ZXJGYWN0b3J5LCB5b3UgbXVzdCBzcGVjaWZ5IGZvcm1hdD0ic25vd2JhbGwiDQotDQotIHwgQSBOb3J3ZWdpYW4gc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3ANCi0gfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuDQotDQotIHwgVGhpcyBzdG9wIHdvcmQgbGlzdCBpcyBmb3IgdGhlIGRvbWluYW50IGJva23DpWwgZGlhbGVjdC4gV29yZHMgdW5pcXVlDQotIHwgdG8gbnlub3JzayBhcmUgbWFya2VkICouDQotDQotIHwgUmV2aXNlZCBieSBKYW4gQnJ1dXNnYWFyZCA8SmFuLkJydXVzZ2FhcmRAc3NiLm5vPiwgSmFuIDIwMDUNCi0NCi1vZyAgICAgICAgICAgICB8IGFuZA0KLWkgICAgICAgICAgICAgIHwgaW4NCi1qZWcgICAgICAgICAgICB8IEkNCi1kZXQgICAgICAgICAgICB8IGl0L3RoaXMvdGhhdA0KLWF0ICAgICAgICAgICAgIHwgdG8gKHcuIGluZi4pDQotZW4gICAgICAgICAgICAgfCBhL2FuDQotZXQgICAgICAgICAgICAgfCBhL2FuDQotZGVuICAgICAgICAgICAgfCBpdC90aGlzL3RoYXQNCi10aWwgICAgICAgICAgICB8IHRvDQotZXIgICAgICAgICAgICAgfCBpcy9hbS9hcmUNCi1zb20gICAgICAgICAgICB8IHdoby90aGF0DQotcMOlICAgICAgICAgICAgIHwgb24NCi1kZSAgICAgICAgICAgICB8IHRoZXkgLyB5b3UoZm9ybWFsKQ0KLW1lZCAgICAgICAgICAgIHwgd2l0aA0KLWhhbiAgICAgICAgICAgIHwgaGUNCi1hdiAgICAgICAgICAgICB8IG9mDQotaWtrZSAgICAgICAgICAgfCBub3QNCi1pa2tqZSAgICAgICAgICB8IG5vdCAqDQotZGVyICAgICAgICAgICAgfCB0aGVyZQ0KLXPDpSAgICAgICAgICAgICB8IHNvDQotdmFyICAgICAgICAgICAgfCB3YXMvd2VyZQ0KLW1lZyAgICAgICAgICAgIHwgbWUNCi1zZWcgICAgICAgICAgICB8IHlvdQ0KLW1lbiAgICAgICAgICAgIHwgYnV0DQotZXR0ICAgICAgICAgICAgfCBvbmUNCi1oYXIgICAgICAgICAgICB8IGhhdmUNCi1vbSAgICAgICAgICAgICB8IGFib3V0DQotdmkgICAgICAgICAgICAgfCB3ZQ0KLW1pbiAgICAgICAgICAgIHwgbXkNCi1taXR0ICAgICAgICAgICB8IG15DQotaGEgICAgICAgICAgICAgfCBoYXZlDQotaGFkZGUgICAgICAgICAgfCBoYWQNCi1odW4gICAgICAgICAgICB8IHNoZQ0KLW7DpSAgICAgICAgICAgICB8IG5vdw0KLW92ZXIgICAgICAgICAgIHwgb3Zlcg0KLWRhICAgICAgICAgICAgIHwgd2hlbi9hcw0KLXZlZCAgICAgICAgICAgIHwgYnkva25vdw0KLWZyYSAgICAgICAgICAgIHwgZnJvbQ0KLWR1ICAgICAgICAgICAgIHwgeW91DQotdXQgICAgICAgICAgICAgfCBvdXQNCi1zaW4gICAgICAgICAgICB8IHlvdXINCi1kZW0gICAgICAgICAgICB8IHRoZW0NCi1vc3MgICAgICAgICAgICB8IHVzDQotb3BwICAgICAgICAgICAgfCB1cA0KLW1hbiAgICAgICAgICAgIHwgeW91L29uZQ0KLWthbiAgICAgICAgICAgIHwgY2FuDQotaGFucyAgICAgICAgICAgfCBoaXMNCi1odm9yICAgICAgICAgICB8IHdoZXJlDQotZWxsZXIgICAgICAgICAgfCBvcg0KLWh2YSAgICAgICAgICAgIHwgd2hhdA0KLXNrYWwgICAgICAgICAgIHwgc2hhbGwvbXVzdA0KLXNlbHYgICAgICAgICAgIHwgc2VsZiAocmVmbGVjdGl2ZSkNCi1zasO4bCAgICAgICAgICAgfCBzZWxmIChyZWZsZWN0aXZlKQ0KLWhlciAgICAgICAgICAgIHwgaGVyZQ0KLWFsbGUgICAgICAgICAgIHwgYWxsDQotdmlsICAgICAgICAgICAgfCB3aWxsDQotYmxpICAgICAgICAgICAgfCBiZWNvbWUNCi1ibGUgICAgICAgICAgICB8IGJlY2FtZQ0KLWJsZWkgICAgICAgICAgIHwgYmVjYW1lICoNCi1ibGl0dCAgICAgICAgICB8IGhhdmUgYmVjb21lDQota3VubmUgICAgICAgICAgfCBjb3VsZA0KLWlubiAgICAgICAgICAgIHwgaW4NCi1uw6VyICAgICAgICAgICAgfCB3aGVuDQotdsOmcmUgICAgICAgICAgIHwgYmUNCi1rb20gICAgICAgICAgICB8IGNvbWUNCi1ub2VuICAgICAgICAgICB8IHNvbWUNCi1ub2UgICAgICAgICAgICB8IHNvbWUNCi12aWxsZSAgICAgICAgICB8IHdvdWxkDQotZGVyZSAgICAgICAgICAgfCB5b3UNCi1zb20gICAgICAgICAgICB8IHdoby93aGljaC90aGF0DQotZGVyZXMgICAgICAgICAgfCB0aGVpci90aGVpcnMNCi1rdW4gICAgICAgICAgICB8IG9ubHkvanVzdA0KLWphICAgICAgICAgICAgIHwgeWVzDQotZXR0ZXIgICAgICAgICAgfCBhZnRlcg0KLW5lZCAgICAgICAgICAgIHwgZG93bg0KLXNrdWxsZSAgICAgICAgIHwgc2hvdWxkDQotZGVubmUgICAgICAgICAgfCB0aGlzDQotZm9yICAgICAgICAgICAgfCBmb3IvYmVjYXVzZQ0KLWRlZyAgICAgICAgICAgIHwgeW91DQotc2kgICAgICAgICAgICAgfCBoZXJzL2hpcw0KLXNpbmUgICAgICAgICAgIHwgaGVycy9oaXMNCi1zaXR0ICAgICAgICAgICB8IGhlcnMvaGlzDQotbW90ICAgICAgICAgICAgfCBhZ2FpbnN0DQotw6UgICAgICAgICAgICAgIHwgdG8NCi1tZWdldCAgICAgICAgICB8IG11Y2gNCi1odm9yZm9yICAgICAgICB8IHdoeQ0KLWRldHRlICAgICAgICAgIHwgdGhpcw0KLWRpc3NlICAgICAgICAgIHwgdGhlc2UvdGhvc2UNCi11dGVuICAgICAgICAgICB8IHdpdGhvdXQNCi1odm9yZGFuICAgICAgICB8IGhvdw0KLWluZ2VuICAgICAgICAgIHwgbm9uZQ0KLWRpbiAgICAgICAgICAgIHwgeW91cg0KLWRpdHQgICAgICAgICAgIHwgeW91cg0KLWJsaXIgICAgICAgICAgIHwgYmVjb21lDQotc2FtbWUgICAgICAgICAgfCBzYW1lDQotaHZpbGtlbiAgICAgICAgfCB3aGljaA0KLWh2aWxrZSAgICAgICAgIHwgd2hpY2ggKHBsdXJhbCkNCi1zw6VubiAgICAgICAgICAgfCBzdWNoIGENCi1pbm5pICAgICAgICAgICB8IGluc2lkZS93aXRoaW4NCi1tZWxsb20gICAgICAgICB8IGJldHdlZW4NCi12w6VyICAgICAgICAgICAgfCBvdXINCi1odmVyICAgICAgICAgICB8IGVhY2gNCi1odmVtICAgICAgICAgICB8IHdobw0KLXZvcnMgICAgICAgICAgIHwgdXMvb3Vycw0KLWh2aXMgICAgICAgICAgIHwgd2hvc2UNCi1iw6VkZSAgICAgICAgICAgfCBib3RoDQotYmFyZSAgICAgICAgICAgfCBvbmx5L2p1c3QNCi1lbm4gICAgICAgICAgICB8IHRoYW4NCi1mb3JkaSAgICAgICAgICB8IGFzL2JlY2F1c2UNCi1mw7hyICAgICAgICAgICAgfCBiZWZvcmUNCi1tYW5nZSAgICAgICAgICB8IG1hbnkNCi1vZ3PDpSAgICAgICAgICAgfCBhbHNvDQotc2xpayAgICAgICAgICAgfCBqdXN0DQotdsOmcnQgICAgICAgICAgIHwgYmVlbg0KLXbDpnJlICAgICAgICAgICB8IHRvIGJlDQotYsOlZSAgICAgICAgICAgIHwgYm90aCAqDQotYmVnZ2UgICAgICAgICAgfCBib3RoDQotc2lkZW4gICAgICAgICAgfCBzaW5jZQ0KLWR5a2sgICAgICAgICAgIHwgeW91ciAqDQotZHlra2FyICAgICAgICAgfCB5b3VycyAqDQotZGVpICAgICAgICAgICAgfCB0aGV5ICoNCi1kZWlyYSAgICAgICAgICB8IHRoZW0gKg0KLWRlaXJlcyAgICAgICAgIHwgdGhlaXJzICoNCi1kZWltICAgICAgICAgICB8IHRoZW0gKg0KLWRpICAgICAgICAgICAgIHwgeW91ciAoZmVtLikgKg0KLWTDpSAgICAgICAgICAgICB8IGFzL3doZW4gKg0KLWVnICAgICAgICAgICAgIHwgSSAqDQotZWluICAgICAgICAgICAgfCBhL2FuICoNCi1laXQgICAgICAgICAgICB8IGEvYW4gKg0KLWVpdHQgICAgICAgICAgIHwgYS9hbiAqDQotZWxsZXMgICAgICAgICAgfCBvciAqDQotaG9ub20gICAgICAgICAgfCBoZSAqDQotaGrDpSAgICAgICAgICAgIHwgYXQgKg0KLWhvICAgICAgICAgICAgIHwgc2hlICoNCi1ob2UgICAgICAgICAgICB8IHNoZSAqDQotaGVubmUgICAgICAgICAgfCBoZXINCi1oZW5uYXIgICAgICAgICB8IGhlci9oZXJzDQotaGVubmVzICAgICAgICAgfCBoZXJzDQotaG9zcyAgICAgICAgICAgfCBob3cgKg0KLWhvc3NlbiAgICAgICAgIHwgaG93ICoNCi1pa2tqZSAgICAgICAgICB8IG5vdCAqDQotaW5naSAgICAgICAgICAgfCBub29uZSAqDQotaW5ramUgICAgICAgICAgfCBub29uZSAqDQota29ybGVpcyAgICAgICAgfCBob3cgKg0KLWtvcnNvICAgICAgICAgIHwgaG93ICoNCi1rdmEgICAgICAgICAgICB8IHdoYXQvd2hpY2ggKg0KLWt2YXIgICAgICAgICAgIHwgd2hlcmUgKg0KLWt2YXJoZWxzdCAgICAgIHwgd2hlcmUgKg0KLWt2ZW4gICAgICAgICAgIHwgd2hvL3dob20gKg0KLWt2aSAgICAgICAgICAgIHwgd2h5ICoNCi1rdmlmb3IgICAgICAgICB8IHdoeSAqDQotbWUgICAgICAgICAgICAgfCB3ZSAqDQotbWVkYW4gICAgICAgICAgfCB3aGlsZSAqDQotbWkgICAgICAgICAgICAgfCBteSAqDQotbWluZSAgICAgICAgICAgfCBteSAqDQotbXlramUgICAgICAgICAgfCBtdWNoICoNCi1ubyAgICAgICAgICAgICB8IG5vdyAqDQotbm9rb24gICAgICAgICAgfCBzb21lIChtYXNjLi9uZXV0LikgKg0KLW5va2EgICAgICAgICAgIHwgc29tZSAoZmVtLikgKg0KLW5va29yICAgICAgICAgIHwgc29tZSAqDQotbm9rbyAgICAgICAgICAgfCBzb21lICoNCi1ub2tyZSAgICAgICAgICB8IHNvbWUgKg0KLXNpICAgICAgICAgICAgIHwgaGlzL2hlcnMgKg0KLXNpYSAgICAgICAgICAgIHwgc2luY2UgKg0KLXNpZGFuICAgICAgICAgIHwgc2luY2UgKg0KLXNvICAgICAgICAgICAgIHwgc28gKg0KLXNvbXQgICAgICAgICAgIHwgc29tZSAqDQotc29tbWUgICAgICAgICAgfCBzb21lICoNCi11bSAgICAgICAgICAgICB8IGFib3V0Kg0KLXVwcCAgICAgICAgICAgIHwgdXAgKg0KLXZlcmUgICAgICAgICAgIHwgYmUgKg0KLXZvcmUgICAgICAgICAgIHwgd2FzICoNCi12ZXJ0ZSAgICAgICAgICB8IGJlY29tZSAqDQotdm9ydCAgICAgICAgICAgfCBiZWNvbWUgKg0KLXZhcnRlICAgICAgICAgIHwgYmVjYW1lICoNCi12YXJ0ICAgICAgICAgICB8IGJlY2FtZSAqDQotDQorIHwgRnJvbSBzdm4udGFydGFydXMub3JnL3Nub3diYWxsL3RydW5rL3dlYnNpdGUvYWxnb3JpdGhtcy9ub3J3ZWdpYW4vc3RvcC50eHQKKyB8IFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuCisgfCBTZWUgaHR0cDovL3Nub3diYWxsLnRhcnRhcnVzLm9yZy9saWNlbnNlLnBocAorIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCisgfCAgLSBFbmNvZGluZyB3YXMgY29udmVydGVkIHRvIFVURi04LgorIHwgIC0gVGhpcyBub3RpY2Ugd2FzIGFkZGVkLgorIHwKKyB8IE5PVEU6IFRvIHVzZSB0aGlzIGZpbGUgd2l0aCBTdG9wRmlsdGVyRmFjdG9yeSwgeW91IG11c3Qgc3BlY2lmeSBmb3JtYXQ9InNub3diYWxsIgorCisgfCBBIE5vcndlZ2lhbiBzdG9wIHdvcmQgbGlzdC4gQ29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIEVhY2ggc3RvcAorIHwgd29yZCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorCisgfCBUaGlzIHN0b3Agd29yZCBsaXN0IGlzIGZvciB0aGUgZG9taW5hbnQgYm9rbcOlbCBkaWFsZWN0LiBXb3JkcyB1bmlxdWUKKyB8IHRvIG55bm9yc2sgYXJlIG1hcmtlZCAqLgorCisgfCBSZXZpc2VkIGJ5IEphbiBCcnV1c2dhYXJkIDxKYW4uQnJ1dXNnYWFyZEBzc2Iubm8+LCBKYW4gMjAwNQorCitvZyAgICAgICAgICAgICB8IGFuZAoraSAgICAgICAgICAgICAgfCBpbgoramVnICAgICAgICAgICAgfCBJCitkZXQgICAgICAgICAgICB8IGl0L3RoaXMvdGhhdAorYXQgICAgICAgICAgICAgfCB0byAody4gaW5mLikKK2VuICAgICAgICAgICAgIHwgYS9hbgorZXQgICAgICAgICAgICAgfCBhL2FuCitkZW4gICAgICAgICAgICB8IGl0L3RoaXMvdGhhdAordGlsICAgICAgICAgICAgfCB0bworZXIgICAgICAgICAgICAgfCBpcy9hbS9hcmUKK3NvbSAgICAgICAgICAgIHwgd2hvL3RoYXQKK3DDpSAgICAgICAgICAgICB8IG9uCitkZSAgICAgICAgICAgICB8IHRoZXkgLyB5b3UoZm9ybWFsKQorbWVkICAgICAgICAgICAgfCB3aXRoCitoYW4gICAgICAgICAgICB8IGhlCithdiAgICAgICAgICAgICB8IG9mCitpa2tlICAgICAgICAgICB8IG5vdAoraWtramUgICAgICAgICAgfCBub3QgKgorZGVyICAgICAgICAgICAgfCB0aGVyZQorc8OlICAgICAgICAgICAgIHwgc28KK3ZhciAgICAgICAgICAgIHwgd2FzL3dlcmUKK21lZyAgICAgICAgICAgIHwgbWUKK3NlZyAgICAgICAgICAgIHwgeW91CittZW4gICAgICAgICAgICB8IGJ1dAorZXR0ICAgICAgICAgICAgfCBvbmUKK2hhciAgICAgICAgICAgIHwgaGF2ZQorb20gICAgICAgICAgICAgfCBhYm91dAordmkgICAgICAgICAgICAgfCB3ZQorbWluICAgICAgICAgICAgfCBteQorbWl0dCAgICAgICAgICAgfCBteQoraGEgICAgICAgICAgICAgfCBoYXZlCitoYWRkZSAgICAgICAgICB8IGhhZAoraHVuICAgICAgICAgICAgfCBzaGUKK27DpSAgICAgICAgICAgICB8IG5vdworb3ZlciAgICAgICAgICAgfCBvdmVyCitkYSAgICAgICAgICAgICB8IHdoZW4vYXMKK3ZlZCAgICAgICAgICAgIHwgYnkva25vdworZnJhICAgICAgICAgICAgfCBmcm9tCitkdSAgICAgICAgICAgICB8IHlvdQordXQgICAgICAgICAgICAgfCBvdXQKK3NpbiAgICAgICAgICAgIHwgeW91cgorZGVtICAgICAgICAgICAgfCB0aGVtCitvc3MgICAgICAgICAgICB8IHVzCitvcHAgICAgICAgICAgICB8IHVwCittYW4gICAgICAgICAgICB8IHlvdS9vbmUKK2thbiAgICAgICAgICAgIHwgY2FuCitoYW5zICAgICAgICAgICB8IGhpcworaHZvciAgICAgICAgICAgfCB3aGVyZQorZWxsZXIgICAgICAgICAgfCBvcgoraHZhICAgICAgICAgICAgfCB3aGF0Citza2FsICAgICAgICAgICB8IHNoYWxsL211c3QKK3NlbHYgICAgICAgICAgIHwgc2VsZiAocmVmbGVjdGl2ZSkKK3Nqw7hsICAgICAgICAgICB8IHNlbGYgKHJlZmxlY3RpdmUpCitoZXIgICAgICAgICAgICB8IGhlcmUKK2FsbGUgICAgICAgICAgIHwgYWxsCit2aWwgICAgICAgICAgICB8IHdpbGwKK2JsaSAgICAgICAgICAgIHwgYmVjb21lCitibGUgICAgICAgICAgICB8IGJlY2FtZQorYmxlaSAgICAgICAgICAgfCBiZWNhbWUgKgorYmxpdHQgICAgICAgICAgfCBoYXZlIGJlY29tZQora3VubmUgICAgICAgICAgfCBjb3VsZAoraW5uICAgICAgICAgICAgfCBpbgorbsOlciAgICAgICAgICAgIHwgd2hlbgordsOmcmUgICAgICAgICAgIHwgYmUKK2tvbSAgICAgICAgICAgIHwgY29tZQorbm9lbiAgICAgICAgICAgfCBzb21lCitub2UgICAgICAgICAgICB8IHNvbWUKK3ZpbGxlICAgICAgICAgIHwgd291bGQKK2RlcmUgICAgICAgICAgIHwgeW91Citzb20gICAgICAgICAgICB8IHdoby93aGljaC90aGF0CitkZXJlcyAgICAgICAgICB8IHRoZWlyL3RoZWlycwora3VuICAgICAgICAgICAgfCBvbmx5L2p1c3QKK2phICAgICAgICAgICAgIHwgeWVzCitldHRlciAgICAgICAgICB8IGFmdGVyCituZWQgICAgICAgICAgICB8IGRvd24KK3NrdWxsZSAgICAgICAgIHwgc2hvdWxkCitkZW5uZSAgICAgICAgICB8IHRoaXMKK2ZvciAgICAgICAgICAgIHwgZm9yL2JlY2F1c2UKK2RlZyAgICAgICAgICAgIHwgeW91CitzaSAgICAgICAgICAgICB8IGhlcnMvaGlzCitzaW5lICAgICAgICAgICB8IGhlcnMvaGlzCitzaXR0ICAgICAgICAgICB8IGhlcnMvaGlzCittb3QgICAgICAgICAgICB8IGFnYWluc3QKK8OlICAgICAgICAgICAgICB8IHRvCittZWdldCAgICAgICAgICB8IG11Y2gKK2h2b3Jmb3IgICAgICAgIHwgd2h5CitkZXR0ZSAgICAgICAgICB8IHRoaXMKK2Rpc3NlICAgICAgICAgIHwgdGhlc2UvdGhvc2UKK3V0ZW4gICAgICAgICAgIHwgd2l0aG91dAoraHZvcmRhbiAgICAgICAgfCBob3cKK2luZ2VuICAgICAgICAgIHwgbm9uZQorZGluICAgICAgICAgICAgfCB5b3VyCitkaXR0ICAgICAgICAgICB8IHlvdXIKK2JsaXIgICAgICAgICAgIHwgYmVjb21lCitzYW1tZSAgICAgICAgICB8IHNhbWUKK2h2aWxrZW4gICAgICAgIHwgd2hpY2gKK2h2aWxrZSAgICAgICAgIHwgd2hpY2ggKHBsdXJhbCkKK3PDpW5uICAgICAgICAgICB8IHN1Y2ggYQoraW5uaSAgICAgICAgICAgfCBpbnNpZGUvd2l0aGluCittZWxsb20gICAgICAgICB8IGJldHdlZW4KK3bDpXIgICAgICAgICAgICB8IG91cgoraHZlciAgICAgICAgICAgfCBlYWNoCitodmVtICAgICAgICAgICB8IHdobwordm9ycyAgICAgICAgICAgfCB1cy9vdXJzCitodmlzICAgICAgICAgICB8IHdob3NlCitiw6VkZSAgICAgICAgICAgfCBib3RoCitiYXJlICAgICAgICAgICB8IG9ubHkvanVzdAorZW5uICAgICAgICAgICAgfCB0aGFuCitmb3JkaSAgICAgICAgICB8IGFzL2JlY2F1c2UKK2bDuHIgICAgICAgICAgICB8IGJlZm9yZQorbWFuZ2UgICAgICAgICAgfCBtYW55CitvZ3PDpSAgICAgICAgICAgfCBhbHNvCitzbGlrICAgICAgICAgICB8IGp1c3QKK3bDpnJ0ICAgICAgICAgICB8IGJlZW4KK3bDpnJlICAgICAgICAgICB8IHRvIGJlCitiw6VlICAgICAgICAgICAgfCBib3RoICoKK2JlZ2dlICAgICAgICAgIHwgYm90aAorc2lkZW4gICAgICAgICAgfCBzaW5jZQorZHlrayAgICAgICAgICAgfCB5b3VyICoKK2R5a2thciAgICAgICAgIHwgeW91cnMgKgorZGVpICAgICAgICAgICAgfCB0aGV5ICoKK2RlaXJhICAgICAgICAgIHwgdGhlbSAqCitkZWlyZXMgICAgICAgICB8IHRoZWlycyAqCitkZWltICAgICAgICAgICB8IHRoZW0gKgorZGkgICAgICAgICAgICAgfCB5b3VyIChmZW0uKSAqCitkw6UgICAgICAgICAgICAgfCBhcy93aGVuICoKK2VnICAgICAgICAgICAgIHwgSSAqCitlaW4gICAgICAgICAgICB8IGEvYW4gKgorZWl0ICAgICAgICAgICAgfCBhL2FuICoKK2VpdHQgICAgICAgICAgIHwgYS9hbiAqCitlbGxlcyAgICAgICAgICB8IG9yICoKK2hvbm9tICAgICAgICAgIHwgaGUgKgoraGrDpSAgICAgICAgICAgIHwgYXQgKgoraG8gICAgICAgICAgICAgfCBzaGUgKgoraG9lICAgICAgICAgICAgfCBzaGUgKgoraGVubmUgICAgICAgICAgfCBoZXIKK2hlbm5hciAgICAgICAgIHwgaGVyL2hlcnMKK2hlbm5lcyAgICAgICAgIHwgaGVycworaG9zcyAgICAgICAgICAgfCBob3cgKgoraG9zc2VuICAgICAgICAgfCBob3cgKgoraWtramUgICAgICAgICAgfCBub3QgKgoraW5naSAgICAgICAgICAgfCBub29uZSAqCitpbmtqZSAgICAgICAgICB8IG5vb25lICoKK2tvcmxlaXMgICAgICAgIHwgaG93ICoKK2tvcnNvICAgICAgICAgIHwgaG93ICoKK2t2YSAgICAgICAgICAgIHwgd2hhdC93aGljaCAqCitrdmFyICAgICAgICAgICB8IHdoZXJlICoKK2t2YXJoZWxzdCAgICAgIHwgd2hlcmUgKgora3ZlbiAgICAgICAgICAgfCB3aG8vd2hvbSAqCitrdmkgICAgICAgICAgICB8IHdoeSAqCitrdmlmb3IgICAgICAgICB8IHdoeSAqCittZSAgICAgICAgICAgICB8IHdlICoKK21lZGFuICAgICAgICAgIHwgd2hpbGUgKgorbWkgICAgICAgICAgICAgfCBteSAqCittaW5lICAgICAgICAgICB8IG15ICoKK215a2plICAgICAgICAgIHwgbXVjaCAqCitubyAgICAgICAgICAgICB8IG5vdyAqCitub2tvbiAgICAgICAgICB8IHNvbWUgKG1hc2MuL25ldXQuKSAqCitub2thICAgICAgICAgICB8IHNvbWUgKGZlbS4pICoKK25va29yICAgICAgICAgIHwgc29tZSAqCitub2tvICAgICAgICAgICB8IHNvbWUgKgorbm9rcmUgICAgICAgICAgfCBzb21lICoKK3NpICAgICAgICAgICAgIHwgaGlzL2hlcnMgKgorc2lhICAgICAgICAgICAgfCBzaW5jZSAqCitzaWRhbiAgICAgICAgICB8IHNpbmNlICoKK3NvICAgICAgICAgICAgIHwgc28gKgorc29tdCAgICAgICAgICAgfCBzb21lICoKK3NvbW1lICAgICAgICAgIHwgc29tZSAqCit1bSAgICAgICAgICAgICB8IGFib3V0KgordXBwICAgICAgICAgICAgfCB1cCAqCit2ZXJlICAgICAgICAgICB8IGJlICoKK3ZvcmUgICAgICAgICAgIHwgd2FzICoKK3ZlcnRlICAgICAgICAgIHwgYmVjb21lICoKK3ZvcnQgICAgICAgICAgIHwgYmVjb21lICoKK3ZhcnRlICAgICAgICAgIHwgYmVjYW1lICoKK3ZhcnQgICAgICAgICAgIHwgYmVjYW1lICoKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19wdC50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3B0LnR4dAppbmRleCA2YWZhMmI1Li5hY2ZlYjAxIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3B0LnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3B0LnR4dApAQCAtMSwyNTMgKzEsMjUzIEBACi0gfCBGcm9tIHN2bi50YXJ0YXJ1cy5vcmcvc25vd2JhbGwvdHJ1bmsvd2Vic2l0ZS9hbGdvcml0aG1zL3BvcnR1Z3Vlc2Uvc3RvcC50eHQNCi0gfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLg0KLSB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwDQotIHwgQWxzbyBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sDQotIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4NCi0gfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuDQotIHwNCi0gfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCINCi0NCi0gfCBBIFBvcnR1Z3Vlc2Ugc3RvcCB3b3JkIGxpc3QuIENvbW1lbnRzIGJlZ2luIHdpdGggdmVydGljYWwgYmFyLiBFYWNoIHN0b3ANCi0gfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuDQotDQotDQotIHwgVGhlIGZvbGxvd2luZyBpcyBhIHJhbmtlZCBsaXN0IChjb21tb25lc3QgdG8gcmFyZXN0KSBvZiBzdG9wd29yZHMNCi0gfCBkZXJpdmluZyBmcm9tIGEgbGFyZ2Ugc2FtcGxlIG9mIHRleHQuDQotDQotIHwgRXh0cmEgd29yZHMgaGF2ZSBiZWVuIGFkZGVkIGF0IHRoZSBlbmQuDQotDQotZGUgICAgICAgICAgICAgfCAgb2YsIGZyb20NCi1hICAgICAgICAgICAgICB8ICB0aGU7IHRvLCBhdDsgaGVyDQotbyAgICAgICAgICAgICAgfCAgdGhlOyBoaW0NCi1xdWUgICAgICAgICAgICB8ICB3aG8sIHRoYXQNCi1lICAgICAgICAgICAgICB8ICBhbmQNCi1kbyAgICAgICAgICAgICB8ICBkZSArIG8NCi1kYSAgICAgICAgICAgICB8ICBkZSArIGENCi1lbSAgICAgICAgICAgICB8ICBpbg0KLXVtICAgICAgICAgICAgIHwgIGENCi1wYXJhICAgICAgICAgICB8ICBmb3INCi0gIHwgw6kgICAgICAgICAgZnJvbSBTRVINCi1jb20gICAgICAgICAgICB8ICB3aXRoDQotbsOjbyAgICAgICAgICAgIHwgIG5vdCwgbm8NCi11bWEgICAgICAgICAgICB8ICBhDQotb3MgICAgICAgICAgICAgfCAgdGhlOyB0aGVtDQotbm8gICAgICAgICAgICAgfCAgZW0gKyBvDQotc2UgICAgICAgICAgICAgfCAgaGltc2VsZiBldGMNCi1uYSAgICAgICAgICAgICB8ICBlbSArIGENCi1wb3IgICAgICAgICAgICB8ICBmb3INCi1tYWlzICAgICAgICAgICB8ICBtb3JlDQotYXMgICAgICAgICAgICAgfCAgdGhlOyB0aGVtDQotZG9zICAgICAgICAgICAgfCAgZGUgKyBvcw0KLWNvbW8gICAgICAgICAgIHwgIGFzLCBsaWtlDQotbWFzICAgICAgICAgICAgfCAgYnV0DQotICB8IGZvaSAgICAgICAgZnJvbSBTRVINCi1hbyAgICAgICAgICAgICB8ICBhICsgbw0KLWVsZSAgICAgICAgICAgIHwgIGhlDQotZGFzICAgICAgICAgICAgfCAgZGUgKyBhcw0KLSAgfCB0ZW0gICAgICAgIGZyb20gVEVSDQotw6AgICAgICAgICAgICAgIHwgIGEgKyBhDQotc2V1ICAgICAgICAgICAgfCAgaGlzDQotc3VhICAgICAgICAgICAgfCAgaGVyDQotb3UgICAgICAgICAgICAgfCAgb3INCi0gIHwgc2VyICAgICAgICBmcm9tIFNFUg0KLXF1YW5kbyAgICAgICAgIHwgIHdoZW4NCi1tdWl0byAgICAgICAgICB8ICBtdWNoDQotICB8IGjDoSAgICAgICAgIGZyb20gSEFWDQotbm9zICAgICAgICAgICAgfCAgZW0gKyBvczsgdXMNCi1qw6EgICAgICAgICAgICAgfCAgYWxyZWFkeSwgbm93DQotICB8IGVzdMOhICAgICAgIGZyb20gRVNUDQotZXUgICAgICAgICAgICAgfCAgSQ0KLXRhbWLDqW0gICAgICAgICB8ICBhbHNvDQotc8OzICAgICAgICAgICAgIHwgIG9ubHksIGp1c3QNCi1wZWxvICAgICAgICAgICB8ICBwZXIgKyBvDQotcGVsYSAgICAgICAgICAgfCAgcGVyICsgYQ0KLWF0w6kgICAgICAgICAgICB8ICB1cCB0bw0KLWlzc28gICAgICAgICAgIHwgIHRoYXQNCi1lbGEgICAgICAgICAgICB8ICBoZQ0KLWVudHJlICAgICAgICAgIHwgIGJldHdlZW4NCi0gIHwgZXJhICAgICAgICBmcm9tIFNFUg0KLWRlcG9pcyAgICAgICAgIHwgIGFmdGVyDQotc2VtICAgICAgICAgICAgfCAgd2l0aG91dA0KLW1lc21vICAgICAgICAgIHwgIHNhbWUNCi1hb3MgICAgICAgICAgICB8ICBhICsgb3MNCi0gIHwgdGVyICAgICAgICBmcm9tIFRFUg0KLXNldXMgICAgICAgICAgIHwgIGhpcw0KLXF1ZW0gICAgICAgICAgIHwgIHdob20NCi1uYXMgICAgICAgICAgICB8ICBlbSArIGFzDQotbWUgICAgICAgICAgICAgfCAgbWUNCi1lc3NlICAgICAgICAgICB8ICB0aGF0DQotZWxlcyAgICAgICAgICAgfCAgdGhleQ0KLSAgfCBlc3TDo28gICAgICBmcm9tIEVTVA0KLXZvY8OqICAgICAgICAgICB8ICB5b3UNCi0gIHwgdGluaGEgICAgICBmcm9tIFRFUg0KLSAgfCBmb3JhbSAgICAgIGZyb20gU0VSDQotZXNzYSAgICAgICAgICAgfCAgdGhhdA0KLW51bSAgICAgICAgICAgIHwgIGVtICsgdW0NCi1uZW0gICAgICAgICAgICB8ICBub3INCi1zdWFzICAgICAgICAgICB8ICBoZXINCi1tZXUgICAgICAgICAgICB8ICBteQ0KLcOgcyAgICAgICAgICAgICB8ICBhICsgYXMNCi1taW5oYSAgICAgICAgICB8ICBteQ0KLSAgfCB0w6ptICAgICAgICBmcm9tIFRFUg0KLW51bWEgICAgICAgICAgIHwgIGVtICsgdW1hDQotcGVsb3MgICAgICAgICAgfCAgcGVyICsgb3MNCi1lbGFzICAgICAgICAgICB8ICB0aGV5DQotICB8IGhhdmlhICAgICAgZnJvbSBIQVYNCi0gIHwgc2VqYSAgICAgICBmcm9tIFNFUg0KLXF1YWwgICAgICAgICAgIHwgIHdoaWNoDQotICB8IHNlcsOhICAgICAgIGZyb20gU0VSDQotbsOzcyAgICAgICAgICAgIHwgIHdlDQotICB8IHRlbmhvICAgICAgZnJvbSBURVINCi1saGUgICAgICAgICAgICB8ICB0byBoaW0sIGhlcg0KLWRlbGVzICAgICAgICAgIHwgIG9mIHRoZW0NCi1lc3NhcyAgICAgICAgICB8ICB0aG9zZQ0KLWVzc2VzICAgICAgICAgIHwgIHRob3NlDQotcGVsYXMgICAgICAgICAgfCAgcGVyICsgYXMNCi1lc3RlICAgICAgICAgICB8ICB0aGlzDQotICB8IGZvc3NlICAgICAgZnJvbSBTRVINCi1kZWxlICAgICAgICAgICB8ICBvZiBoaW0NCi0NCi0gfCBvdGhlciB3b3Jkcy4gVGhlcmUgYXJlIG1hbnkgY29udHJhY3Rpb25zIHN1Y2ggYXMgbmFxdWVsZSA9IGVtK2FxdWVsZSwNCi0gfCBtbyA9IG1lK28sIGJ1dCB0aGV5IGFyZSByYXJlLg0KLSB8IEluZGVmaW5pdGUgYXJ0aWNsZSBwbHVyYWwgZm9ybXMgYXJlIGFsc28gcmFyZS4NCi0NCi10dSAgICAgICAgICAgICB8ICB0aG91DQotdGUgICAgICAgICAgICAgfCAgdGhlZQ0KLXZvY8OqcyAgICAgICAgICB8ICB5b3UgKHBsdXJhbCkNCi12b3MgICAgICAgICAgICB8ICB5b3UNCi1saGVzICAgICAgICAgICB8ICB0byB0aGVtDQotbWV1cyAgICAgICAgICAgfCAgbXkNCi1taW5oYXMNCi10ZXUgICAgICAgICAgICB8ICB0aHkNCi10dWENCi10ZXVzDQotdHVhcw0KLW5vc3NvICAgICAgICAgIHwgb3VyDQotbm9zc2ENCi1ub3Nzb3MNCi1ub3NzYXMNCi0NCi1kZWxhICAgICAgICAgICB8ICBvZiBoZXINCi1kZWxhcyAgICAgICAgICB8ICBvZiB0aGVtDQotDQotZXN0YSAgICAgICAgICAgfCAgdGhpcw0KLWVzdGVzICAgICAgICAgIHwgIHRoZXNlDQotZXN0YXMgICAgICAgICAgfCAgdGhlc2UNCi1hcXVlbGUgICAgICAgICB8ICB0aGF0DQotYXF1ZWxhICAgICAgICAgfCAgdGhhdA0KLWFxdWVsZXMgICAgICAgIHwgIHRob3NlDQotYXF1ZWxhcyAgICAgICAgfCAgdGhvc2UNCi1pc3RvICAgICAgICAgICB8ICB0aGlzDQotYXF1aWxvICAgICAgICAgfCAgdGhhdA0KLQ0KLSAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgZXN0YXIsIHRvIGJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToNCi1lc3RvdQ0KLWVzdMOhDQotZXN0YW1vcw0KLWVzdMOjbw0KLWVzdGl2ZQ0KLWVzdGV2ZQ0KLWVzdGl2ZW1vcw0KLWVzdGl2ZXJhbQ0KLWVzdGF2YQ0KLWVzdMOhdmFtb3MNCi1lc3RhdmFtDQotZXN0aXZlcmENCi1lc3RpdsOpcmFtb3MNCi1lc3RlamENCi1lc3RlamFtb3MNCi1lc3RlamFtDQotZXN0aXZlc3NlDQotZXN0aXbDqXNzZW1vcw0KLWVzdGl2ZXNzZW0NCi1lc3RpdmVyDQotZXN0aXZlcm1vcw0KLWVzdGl2ZXJlbQ0KLQ0KLSAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgaGF2ZXIsIHRvIGhhdmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOg0KLWhlaQ0KLWjDoQ0KLWhhdmVtb3MNCi1ow6NvDQotaG91dmUNCi1ob3V2ZW1vcw0KLWhvdXZlcmFtDQotaG91dmVyYQ0KLWhvdXbDqXJhbW9zDQotaGFqYQ0KLWhhamFtb3MNCi1oYWphbQ0KLWhvdXZlc3NlDQotaG91dsOpc3NlbW9zDQotaG91dmVzc2VtDQotaG91dmVyDQotaG91dmVybW9zDQotaG91dmVyZW0NCi1ob3V2ZXJlaQ0KLWhvdXZlcsOhDQotaG91dmVyZW1vcw0KLWhvdXZlcsOjbw0KLWhvdXZlcmlhDQotaG91dmVyw61hbW9zDQotaG91dmVyaWFtDQotDQotICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBzZXIsIHRvIGJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToNCi1zb3UNCi1zb21vcw0KLXPDo28NCi1lcmENCi3DqXJhbW9zDQotZXJhbQ0KLWZ1aQ0KLWZvaQ0KLWZvbW9zDQotZm9yYW0NCi1mb3JhDQotZsO0cmFtb3MNCi1zZWphDQotc2VqYW1vcw0KLXNlamFtDQotZm9zc2UNCi1mw7Rzc2Vtb3MNCi1mb3NzZW0NCi1mb3INCi1mb3Jtb3MNCi1mb3JlbQ0KLXNlcmVpDQotc2Vyw6ENCi1zZXJlbW9zDQotc2Vyw6NvDQotc2VyaWENCi1zZXLDrWFtb3MNCi1zZXJpYW0NCi0NCi0gICAgICAgICAgICAgICB8IGZvcm1zIG9mIHRlciwgdG8gaGF2ZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6DQotdGVuaG8NCi10ZW0NCi10ZW1vcw0KLXTDqW0NCi10aW5oYQ0KLXTDrW5oYW1vcw0KLXRpbmhhbQ0KLXRpdmUNCi10ZXZlDQotdGl2ZW1vcw0KLXRpdmVyYW0NCi10aXZlcmENCi10aXbDqXJhbW9zDQotdGVuaGENCi10ZW5oYW1vcw0KLXRlbmhhbQ0KLXRpdmVzc2UNCi10aXbDqXNzZW1vcw0KLXRpdmVzc2VtDQotdGl2ZXINCi10aXZlcm1vcw0KLXRpdmVyZW0NCi10ZXJlaQ0KLXRlcsOhDQotdGVyZW1vcw0KLXRlcsOjbw0KLXRlcmlhDQotdGVyw61hbW9zDQotdGVyaWFtDQorIHwgRnJvbSBzdm4udGFydGFydXMub3JnL3Nub3diYWxsL3RydW5rL3dlYnNpdGUvYWxnb3JpdGhtcy9wb3J0dWd1ZXNlL3N0b3AudHh0CisgfCBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHAKKyB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIHwgIC0gRW5jb2Rpbmcgd2FzIGNvbnZlcnRlZCB0byBVVEYtOC4KKyB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4KKyB8CisgfCBOT1RFOiBUbyB1c2UgdGhpcyBmaWxlIHdpdGggU3RvcEZpbHRlckZhY3RvcnksIHlvdSBtdXN0IHNwZWNpZnkgZm9ybWF0PSJzbm93YmFsbCIKKworIHwgQSBQb3J0dWd1ZXNlIHN0b3Agd29yZCBsaXN0LiBDb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gRWFjaCBzdG9wCisgfCB3b3JkIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisKKworIHwgVGhlIGZvbGxvd2luZyBpcyBhIHJhbmtlZCBsaXN0IChjb21tb25lc3QgdG8gcmFyZXN0KSBvZiBzdG9wd29yZHMKKyB8IGRlcml2aW5nIGZyb20gYSBsYXJnZSBzYW1wbGUgb2YgdGV4dC4KKworIHwgRXh0cmEgd29yZHMgaGF2ZSBiZWVuIGFkZGVkIGF0IHRoZSBlbmQuCisKK2RlICAgICAgICAgICAgIHwgIG9mLCBmcm9tCithICAgICAgICAgICAgICB8ICB0aGU7IHRvLCBhdDsgaGVyCitvICAgICAgICAgICAgICB8ICB0aGU7IGhpbQorcXVlICAgICAgICAgICAgfCAgd2hvLCB0aGF0CitlICAgICAgICAgICAgICB8ICBhbmQKK2RvICAgICAgICAgICAgIHwgIGRlICsgbworZGEgICAgICAgICAgICAgfCAgZGUgKyBhCitlbSAgICAgICAgICAgICB8ICBpbgordW0gICAgICAgICAgICAgfCAgYQorcGFyYSAgICAgICAgICAgfCAgZm9yCisgIHwgw6kgICAgICAgICAgZnJvbSBTRVIKK2NvbSAgICAgICAgICAgIHwgIHdpdGgKK27Do28gICAgICAgICAgICB8ICBub3QsIG5vCit1bWEgICAgICAgICAgICB8ICBhCitvcyAgICAgICAgICAgICB8ICB0aGU7IHRoZW0KK25vICAgICAgICAgICAgIHwgIGVtICsgbworc2UgICAgICAgICAgICAgfCAgaGltc2VsZiBldGMKK25hICAgICAgICAgICAgIHwgIGVtICsgYQorcG9yICAgICAgICAgICAgfCAgZm9yCittYWlzICAgICAgICAgICB8ICBtb3JlCithcyAgICAgICAgICAgICB8ICB0aGU7IHRoZW0KK2RvcyAgICAgICAgICAgIHwgIGRlICsgb3MKK2NvbW8gICAgICAgICAgIHwgIGFzLCBsaWtlCittYXMgICAgICAgICAgICB8ICBidXQKKyAgfCBmb2kgICAgICAgIGZyb20gU0VSCithbyAgICAgICAgICAgICB8ICBhICsgbworZWxlICAgICAgICAgICAgfCAgaGUKK2RhcyAgICAgICAgICAgIHwgIGRlICsgYXMKKyAgfCB0ZW0gICAgICAgIGZyb20gVEVSCivDoCAgICAgICAgICAgICAgfCAgYSArIGEKK3NldSAgICAgICAgICAgIHwgIGhpcworc3VhICAgICAgICAgICAgfCAgaGVyCitvdSAgICAgICAgICAgICB8ICBvcgorICB8IHNlciAgICAgICAgZnJvbSBTRVIKK3F1YW5kbyAgICAgICAgIHwgIHdoZW4KK211aXRvICAgICAgICAgIHwgIG11Y2gKKyAgfCBow6EgICAgICAgICBmcm9tIEhBVgorbm9zICAgICAgICAgICAgfCAgZW0gKyBvczsgdXMKK2rDoSAgICAgICAgICAgICB8ICBhbHJlYWR5LCBub3cKKyAgfCBlc3TDoSAgICAgICBmcm9tIEVTVAorZXUgICAgICAgICAgICAgfCAgSQordGFtYsOpbSAgICAgICAgIHwgIGFsc28KK3PDsyAgICAgICAgICAgICB8ICBvbmx5LCBqdXN0CitwZWxvICAgICAgICAgICB8ICBwZXIgKyBvCitwZWxhICAgICAgICAgICB8ICBwZXIgKyBhCithdMOpICAgICAgICAgICAgfCAgdXAgdG8KK2lzc28gICAgICAgICAgIHwgIHRoYXQKK2VsYSAgICAgICAgICAgIHwgIGhlCitlbnRyZSAgICAgICAgICB8ICBiZXR3ZWVuCisgIHwgZXJhICAgICAgICBmcm9tIFNFUgorZGVwb2lzICAgICAgICAgfCAgYWZ0ZXIKK3NlbSAgICAgICAgICAgIHwgIHdpdGhvdXQKK21lc21vICAgICAgICAgIHwgIHNhbWUKK2FvcyAgICAgICAgICAgIHwgIGEgKyBvcworICB8IHRlciAgICAgICAgZnJvbSBURVIKK3NldXMgICAgICAgICAgIHwgIGhpcworcXVlbSAgICAgICAgICAgfCAgd2hvbQorbmFzICAgICAgICAgICAgfCAgZW0gKyBhcworbWUgICAgICAgICAgICAgfCAgbWUKK2Vzc2UgICAgICAgICAgIHwgIHRoYXQKK2VsZXMgICAgICAgICAgIHwgIHRoZXkKKyAgfCBlc3TDo28gICAgICBmcm9tIEVTVAordm9jw6ogICAgICAgICAgIHwgIHlvdQorICB8IHRpbmhhICAgICAgZnJvbSBURVIKKyAgfCBmb3JhbSAgICAgIGZyb20gU0VSCitlc3NhICAgICAgICAgICB8ICB0aGF0CitudW0gICAgICAgICAgICB8ICBlbSArIHVtCituZW0gICAgICAgICAgICB8ICBub3IKK3N1YXMgICAgICAgICAgIHwgIGhlcgorbWV1ICAgICAgICAgICAgfCAgbXkKK8OgcyAgICAgICAgICAgICB8ICBhICsgYXMKK21pbmhhICAgICAgICAgIHwgIG15CisgIHwgdMOqbSAgICAgICAgZnJvbSBURVIKK251bWEgICAgICAgICAgIHwgIGVtICsgdW1hCitwZWxvcyAgICAgICAgICB8ICBwZXIgKyBvcworZWxhcyAgICAgICAgICAgfCAgdGhleQorICB8IGhhdmlhICAgICAgZnJvbSBIQVYKKyAgfCBzZWphICAgICAgIGZyb20gU0VSCitxdWFsICAgICAgICAgICB8ICB3aGljaAorICB8IHNlcsOhICAgICAgIGZyb20gU0VSCituw7NzICAgICAgICAgICAgfCAgd2UKKyAgfCB0ZW5obyAgICAgIGZyb20gVEVSCitsaGUgICAgICAgICAgICB8ICB0byBoaW0sIGhlcgorZGVsZXMgICAgICAgICAgfCAgb2YgdGhlbQorZXNzYXMgICAgICAgICAgfCAgdGhvc2UKK2Vzc2VzICAgICAgICAgIHwgIHRob3NlCitwZWxhcyAgICAgICAgICB8ICBwZXIgKyBhcworZXN0ZSAgICAgICAgICAgfCAgdGhpcworICB8IGZvc3NlICAgICAgZnJvbSBTRVIKK2RlbGUgICAgICAgICAgIHwgIG9mIGhpbQorCisgfCBvdGhlciB3b3Jkcy4gVGhlcmUgYXJlIG1hbnkgY29udHJhY3Rpb25zIHN1Y2ggYXMgbmFxdWVsZSA9IGVtK2FxdWVsZSwKKyB8IG1vID0gbWUrbywgYnV0IHRoZXkgYXJlIHJhcmUuCisgfCBJbmRlZmluaXRlIGFydGljbGUgcGx1cmFsIGZvcm1zIGFyZSBhbHNvIHJhcmUuCisKK3R1ICAgICAgICAgICAgIHwgIHRob3UKK3RlICAgICAgICAgICAgIHwgIHRoZWUKK3ZvY8OqcyAgICAgICAgICB8ICB5b3UgKHBsdXJhbCkKK3ZvcyAgICAgICAgICAgIHwgIHlvdQorbGhlcyAgICAgICAgICAgfCAgdG8gdGhlbQorbWV1cyAgICAgICAgICAgfCAgbXkKK21pbmhhcwordGV1ICAgICAgICAgICAgfCAgdGh5Cit0dWEKK3RldXMKK3R1YXMKK25vc3NvICAgICAgICAgIHwgb3VyCitub3NzYQorbm9zc29zCitub3NzYXMKKworZGVsYSAgICAgICAgICAgfCAgb2YgaGVyCitkZWxhcyAgICAgICAgICB8ICBvZiB0aGVtCisKK2VzdGEgICAgICAgICAgIHwgIHRoaXMKK2VzdGVzICAgICAgICAgIHwgIHRoZXNlCitlc3RhcyAgICAgICAgICB8ICB0aGVzZQorYXF1ZWxlICAgICAgICAgfCAgdGhhdAorYXF1ZWxhICAgICAgICAgfCAgdGhhdAorYXF1ZWxlcyAgICAgICAgfCAgdGhvc2UKK2FxdWVsYXMgICAgICAgIHwgIHRob3NlCitpc3RvICAgICAgICAgICB8ICB0aGlzCithcXVpbG8gICAgICAgICB8ICB0aGF0CisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgZXN0YXIsIHRvIGJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK2VzdG91Citlc3TDoQorZXN0YW1vcworZXN0w6NvCitlc3RpdmUKK2VzdGV2ZQorZXN0aXZlbW9zCitlc3RpdmVyYW0KK2VzdGF2YQorZXN0w6F2YW1vcworZXN0YXZhbQorZXN0aXZlcmEKK2VzdGl2w6lyYW1vcworZXN0ZWphCitlc3RlamFtb3MKK2VzdGVqYW0KK2VzdGl2ZXNzZQorZXN0aXbDqXNzZW1vcworZXN0aXZlc3NlbQorZXN0aXZlcgorZXN0aXZlcm1vcworZXN0aXZlcmVtCisKKyAgICAgICAgICAgICAgIHwgZm9ybXMgb2YgaGF2ZXIsIHRvIGhhdmUgKG5vdCBpbmNsdWRpbmcgdGhlIGluZmluaXRpdmUpOgoraGVpCitow6EKK2hhdmVtb3MKK2jDo28KK2hvdXZlCitob3V2ZW1vcworaG91dmVyYW0KK2hvdXZlcmEKK2hvdXbDqXJhbW9zCitoYWphCitoYWphbW9zCitoYWphbQoraG91dmVzc2UKK2hvdXbDqXNzZW1vcworaG91dmVzc2VtCitob3V2ZXIKK2hvdXZlcm1vcworaG91dmVyZW0KK2hvdXZlcmVpCitob3V2ZXLDoQoraG91dmVyZW1vcworaG91dmVyw6NvCitob3V2ZXJpYQoraG91dmVyw61hbW9zCitob3V2ZXJpYW0KKworICAgICAgICAgICAgICAgfCBmb3JtcyBvZiBzZXIsIHRvIGJlIChub3QgaW5jbHVkaW5nIHRoZSBpbmZpbml0aXZlKToKK3NvdQorc29tb3MKK3PDo28KK2VyYQorw6lyYW1vcworZXJhbQorZnVpCitmb2kKK2ZvbW9zCitmb3JhbQorZm9yYQorZsO0cmFtb3MKK3NlamEKK3NlamFtb3MKK3NlamFtCitmb3NzZQorZsO0c3NlbW9zCitmb3NzZW0KK2ZvcgorZm9ybW9zCitmb3JlbQorc2VyZWkKK3NlcsOhCitzZXJlbW9zCitzZXLDo28KK3NlcmlhCitzZXLDrWFtb3MKK3NlcmlhbQorCisgICAgICAgICAgICAgICB8IGZvcm1zIG9mIHRlciwgdG8gaGF2ZSAobm90IGluY2x1ZGluZyB0aGUgaW5maW5pdGl2ZSk6Cit0ZW5obwordGVtCit0ZW1vcwordMOpbQordGluaGEKK3TDrW5oYW1vcwordGluaGFtCit0aXZlCit0ZXZlCit0aXZlbW9zCit0aXZlcmFtCit0aXZlcmEKK3RpdsOpcmFtb3MKK3RlbmhhCit0ZW5oYW1vcwordGVuaGFtCit0aXZlc3NlCit0aXbDqXNzZW1vcwordGl2ZXNzZW0KK3RpdmVyCit0aXZlcm1vcwordGl2ZXJlbQordGVyZWkKK3RlcsOhCit0ZXJlbW9zCit0ZXLDo28KK3RlcmlhCit0ZXLDrWFtb3MKK3RlcmlhbQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19yby50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3JvLnR4dAppbmRleCAyZDczOTVjLi40ZmRlZTkwIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3JvLnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3JvLnR4dApAQCAtMSwyMzMgKzEsMjMzIEBACi0jIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBieSBKYWNxdWVzIFNhdm95IGFuZCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuDQotIyBTZWUgaHR0cDovL21lbWJlcnMudW5pbmUuY2gvamFjcXVlcy5zYXZveS9jbGVmL2luZGV4Lmh0bWwuDQotIyBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwNCi1hY2VhDQotYWNlYXN0YQ0KLWFjZWFzdMSDDQotYWNlZWENCi1hY2VpDQotYWNlaWENCi1hY2VsDQotYWNlbGENCi1hY2VsZQ0KLWFjZWxlYQ0KLWFjZXN0DQotYWNlc3RhDQotYWNlc3RlDQotYWNlc3RlYQ0KLWFjZcWfdGkNCi1hY2XFn3RpYQ0KLWFjb2xvDQotYWN1bQ0KLWFpDQotYWlhDQotYWlixIMNCi1haWNpDQotYWwNCi3Eg2xhDQotYWxlDQotYWxlYQ0KLcSDbGVhDQotYWx0Y2V2YQ0KLWFsdGNpbmV2YQ0KLWFtDQotYXINCi1hcmUNCi1hxZ8NCi1hxZ9hZGFyDQotYXNlbWVuZWENCi1hc3RhDQotxINzdGENCi1hc3TEg3ppDQotYXN0ZWENCi3Eg3N0ZWENCi3Eg8WfdGlhDQotYXN1cHJhDQotYcWjaQ0KLWF1DQotYXZlYQ0KLWF2ZW0NCi1hdmXFo2kNCi1hemkNCi1iaW5lDQotYnVjdXINCi1idW7Egw0KLWNhDQotY8SDDQotY8SDY2kNCi1jw6JuZA0KLWNhcmUNCi1jxINyZWkNCi1jxINyb3INCi1jxINydWkNCi1jw6J0DQotY8OidGUNCi1jw6LFo2kNCi1jxIN0cmUNCi1jw6J0dmENCi1jZQ0KLWNlbA0KLWNldmENCi1jaGlhcg0KLWPDrm5kDQotY2luZQ0KLWNpbmV2YQ0KLWPDrnQNCi1jw650ZQ0KLWPDrsWjaQ0KLWPDrnR2YQ0KLWNvbnRyYQ0KLWN1DQotY3VtDQotY3VtdmENCi1jdXLDom5kDQotY3Vyw65uZA0KLWRhDQotZMSDDQotZGFjxIMNCi1kYXINCi1kYXRvcml0xIMNCi1kZQ0KLWRlY2kNCi1kZWphDQotZGVvYXJlY2UNCi1kZXBhcnRlDQotZGXFn2kNCi1kaW4NCi1kaW5haW50ZWENCi1kaW50cg0KLWRpbnRyZQ0KLWRyZXB0DQotZHVwxIMNCi1lYQ0KLWVpDQotZWwNCi1lbGUNCi1lcmFtDQotZXN0ZQ0KLWXFn3RpDQotZXUNCi1mYWNlDQotZsSDcsSDDQotZmkNCi1maWUNCi1maWVjYXJlDQotZmlpDQotZmltDQotZmnFo2kNCi1pYXINCi1pZXJpDQotw65pDQotw65sDQotw65taQ0KLcOubXBvdHJpdmENCi3Drm4gDQotw65uYWludGUNCi3Drm5haW50ZWENCi3Drm5jw6J0DQotw65uY8OudA0KLcOubmNvdHJvDQotw65udHJlDQotw65udHJ1Y8OidA0KLcOubnRydWPDrnQNCi3DrsWjaQ0KLWxhDQotbMOibmfEgw0KLWxlDQotbGkNCi1sw65uZ8SDDQotbG9yDQotbHVpDQotbcSDDQotbcOiaW5lDQotbWVhDQotbWVpDQotbWVsZQ0KLW1lcmV1DQotbWV1DQotbWkNCi1taW5lDQotbXVsdA0KLW11bHTEgw0KLW11bMWjaQ0KLW5lDQotbmljxINpZXJpDQotbmljaQ0KLW5pbWVuaQ0KLW5pxZ90ZQ0KLW5vYXN0csSDDQotbm9hc3RyZQ0KLW5vaQ0KLW5vxZ90cmkNCi1ub3N0cnUNCi1udQ0KLW9yaQ0KLW9yaWPDom5kDQotb3JpY2FyZQ0KLW9yaWPDonQNCi1vcmljZQ0KLW9yaWPDrm5kDQotb3JpY2luZQ0KLW9yaWPDrnQNCi1vcmljdW0NCi1vcml1bmRlDQotcMOibsSDDQotcGUNCi1wZW50cnUNCi1wZXN0ZQ0KLXDDrm7Egw0KLXBvYXRlDQotcG90DQotcHJlYQ0KLXByaW1hDQotcHJpbXVsDQotcHJpbg0KLXByaW50cg0KLXNhDQotc8SDDQotc8SDaQ0KLXNhbGUNCi1zYXUNCi1zxIN1DQotc2UNCi3Fn2kNCi1zw65udA0KLXPDrm50ZW0NCi1zw65udGXFo2kNCi1zcHJlDQotc3ViDQotc3VudA0KLXN1bnRlbQ0KLXN1bnRlxaNpDQotdGENCi10xINpDQotdGFsZQ0KLXTEg3UNCi10ZQ0KLcWjaQ0KLcWjaWUNCi10aW5lDQotdG9hdMSDDQotdG9hdGUNCi10b3QNCi10b8WjaQ0KLXRvdHXFn2kNCi10dQ0KLXVuDQotdW5hDQotdW5kZQ0KLXVuZGV2YQ0KLXVuZWkNCi11bmVsZQ0KLXVuZW9yaQ0KLXVub3INCi12xIMNCi12aQ0KLXZvYXN0csSDDQotdm9hc3RyZQ0KLXZvaQ0KLXZvxZ90cmkNCi12b3N0cnUNCi12b3XEgw0KLXZyZW8NCi12cmV1bg0KKyMgVGhpcyBmaWxlIHdhcyBjcmVhdGVkIGJ5IEphY3F1ZXMgU2F2b3kgYW5kIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgbGljZW5zZS4KKyMgU2VlIGh0dHA6Ly9tZW1iZXJzLnVuaW5lLmNoL2phY3F1ZXMuc2F2b3kvY2xlZi9pbmRleC5odG1sLgorIyBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKK2FjZWEKK2FjZWFzdGEKK2FjZWFzdMSDCithY2VlYQorYWNlaQorYWNlaWEKK2FjZWwKK2FjZWxhCithY2VsZQorYWNlbGVhCithY2VzdAorYWNlc3RhCithY2VzdGUKK2FjZXN0ZWEKK2FjZcWfdGkKK2FjZcWfdGlhCithY29sbworYWN1bQorYWkKK2FpYQorYWlixIMKK2FpY2kKK2FsCivEg2xhCithbGUKK2FsZWEKK8SDbGVhCithbHRjZXZhCithbHRjaW5ldmEKK2FtCithcgorYXJlCithxZ8KK2HFn2FkYXIKK2FzZW1lbmVhCithc3RhCivEg3N0YQorYXN0xIN6aQorYXN0ZWEKK8SDc3RlYQorxIPFn3RpYQorYXN1cHJhCithxaNpCithdQorYXZlYQorYXZlbQorYXZlxaNpCithemkKK2JpbmUKK2J1Y3VyCitidW7EgworY2EKK2PEgworY8SDY2kKK2PDom5kCitjYXJlCitjxINyZWkKK2PEg3JvcgorY8SDcnVpCitjw6J0Citjw6J0ZQorY8OixaNpCitjxIN0cmUKK2PDonR2YQorY2UKK2NlbAorY2V2YQorY2hpYXIKK2PDrm5kCitjaW5lCitjaW5ldmEKK2PDrnQKK2PDrnRlCitjw67Fo2kKK2PDrnR2YQorY29udHJhCitjdQorY3VtCitjdW12YQorY3Vyw6JuZAorY3Vyw65uZAorZGEKK2TEgworZGFjxIMKK2RhcgorZGF0b3JpdMSDCitkZQorZGVjaQorZGVqYQorZGVvYXJlY2UKK2RlcGFydGUKK2RlxZ9pCitkaW4KK2RpbmFpbnRlYQorZGludHIKK2RpbnRyZQorZHJlcHQKK2R1cMSDCitlYQorZWkKK2VsCitlbGUKK2VyYW0KK2VzdGUKK2XFn3RpCitldQorZmFjZQorZsSDcsSDCitmaQorZmllCitmaWVjYXJlCitmaWkKK2ZpbQorZmnFo2kKK2lhcgoraWVyaQorw65pCivDrmwKK8OubWkKK8OubXBvdHJpdmEKK8OubiAKK8OubmFpbnRlCivDrm5haW50ZWEKK8OubmPDonQKK8OubmPDrnQKK8OubmNvdHJvCivDrm50cmUKK8OubnRydWPDonQKK8OubnRydWPDrnQKK8OuxaNpCitsYQorbMOibmfEgworbGUKK2xpCitsw65uZ8SDCitsb3IKK2x1aQorbcSDCittw6JpbmUKK21lYQorbWVpCittZWxlCittZXJldQorbWV1CittaQorbWluZQorbXVsdAorbXVsdMSDCittdWzFo2kKK25lCituaWPEg2llcmkKK25pY2kKK25pbWVuaQorbmnFn3RlCitub2FzdHLEgworbm9hc3RyZQorbm9pCitub8WfdHJpCitub3N0cnUKK251CitvcmkKK29yaWPDom5kCitvcmljYXJlCitvcmljw6J0CitvcmljZQorb3JpY8OubmQKK29yaWNpbmUKK29yaWPDrnQKK29yaWN1bQorb3JpdW5kZQorcMOibsSDCitwZQorcGVudHJ1CitwZXN0ZQorcMOubsSDCitwb2F0ZQorcG90CitwcmVhCitwcmltYQorcHJpbXVsCitwcmluCitwcmludHIKK3NhCitzxIMKK3PEg2kKK3NhbGUKK3NhdQorc8SDdQorc2UKK8WfaQorc8OubnQKK3PDrm50ZW0KK3PDrm50ZcWjaQorc3ByZQorc3ViCitzdW50CitzdW50ZW0KK3N1bnRlxaNpCit0YQordMSDaQordGFsZQordMSDdQordGUKK8WjaQorxaNpZQordGluZQordG9hdMSDCit0b2F0ZQordG90Cit0b8WjaQordG90dcWfaQordHUKK3VuCit1bmEKK3VuZGUKK3VuZGV2YQordW5laQordW5lbGUKK3VuZW9yaQordW5vcgordsSDCit2aQordm9hc3RyxIMKK3ZvYXN0cmUKK3ZvaQordm/Fn3RyaQordm9zdHJ1Cit2b3XEgwordnJlbwordnJldW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfcnUudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19ydS50eHQKaW5kZXggMDE0MWI5Yi4uNTUyNzE0MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19ydS50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc19ydS50eHQKQEAgLTEsMjQzICsxLDI0MyBAQAotIHwgRnJvbSBzdm4udGFydGFydXMub3JnL3Nub3diYWxsL3RydW5rL3dlYnNpdGUvYWxnb3JpdGhtcy9ydXNzaWFuL3N0b3AudHh0DQotIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4NCi0gfCBTZWUgaHR0cDovL3Nub3diYWxsLnRhcnRhcnVzLm9yZy9saWNlbnNlLnBocA0KLSB8IEFsc28gc2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbA0KLSB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguDQotIHwgIC0gVGhpcyBub3RpY2Ugd2FzIGFkZGVkLg0KLSB8DQotIHwgTk9URTogVG8gdXNlIHRoaXMgZmlsZSB3aXRoIFN0b3BGaWx0ZXJGYWN0b3J5LCB5b3UgbXVzdCBzcGVjaWZ5IGZvcm1hdD0ic25vd2JhbGwiDQotDQotIHwgYSBydXNzaWFuIHN0b3Agd29yZCBsaXN0LiBjb21tZW50cyBiZWdpbiB3aXRoIHZlcnRpY2FsIGJhci4gZWFjaCBzdG9wDQotIHwgd29yZCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLg0KLQ0KLSB8IHRoaXMgaXMgYSByYW5rZWQgbGlzdCAoY29tbW9uZXN0IHRvIHJhcmVzdCkgb2Ygc3RvcHdvcmRzIGRlcml2ZWQgZnJvbQ0KLSB8IGEgbGFyZ2UgdGV4dCBzYW1wbGUuDQotDQotIHwgbGV0dGVyIGDRkScgaXMgdHJhbnNsYXRlZCB0byBg0LUnLg0KLQ0KLdC4ICAgICAgICAgICAgICB8IGFuZA0KLdCyICAgICAgICAgICAgICB8IGluL2ludG8NCi3QstC+ICAgICAgICAgICAgIHwgYWx0ZXJuYXRpdmUgZm9ybQ0KLdC90LUgICAgICAgICAgICAgfCBub3QNCi3Rh9GC0L4gICAgICAgICAgICB8IHdoYXQvdGhhdA0KLdC+0L0gICAgICAgICAgICAgfCBoZQ0KLdC90LAgICAgICAgICAgICAgfCBvbi9vbnRvDQot0Y8gICAgICAgICAgICAgIHwgaQ0KLdGBICAgICAgICAgICAgICB8IGZyb20NCi3RgdC+ICAgICAgICAgICAgIHwgYWx0ZXJuYXRpdmUgZm9ybQ0KLdC60LDQuiAgICAgICAgICAgIHwgaG93DQot0LAgICAgICAgICAgICAgIHwgbWlsZGVyIGZvcm0gb2YgYG5vJyAoYnV0KQ0KLdGC0L4gICAgICAgICAgICAgfCBjb25qdW5jdGlvbiBhbmQgZm9ybSBvZiBgdGhhdCcNCi3QstGB0LUgICAgICAgICAgICB8IGFsbA0KLdC+0L3QsCAgICAgICAgICAgIHwgc2hlDQot0YLQsNC6ICAgICAgICAgICAgfCBzbywgdGh1cw0KLdC10LPQviAgICAgICAgICAgIHwgaGltDQot0L3QviAgICAgICAgICAgICB8IGJ1dA0KLdC00LAgICAgICAgICAgICAgfCB5ZXMvYW5kDQot0YLRiyAgICAgICAgICAgICB8IHRob3UNCi3QuiAgICAgICAgICAgICAgfCB0b3dhcmRzLCBieQ0KLdGDICAgICAgICAgICAgICB8IGFyb3VuZCwgY2hleg0KLdC20LUgICAgICAgICAgICAgfCBpbnRlbnNpZmllciBwYXJ0aWNsZQ0KLdCy0YsgICAgICAgICAgICAgfCB5b3UNCi3Qt9CwICAgICAgICAgICAgIHwgYmV5b25kLCBiZWhpbmQNCi3QsdGLICAgICAgICAgICAgIHwgY29uZGl0aW9uYWwvc3Viai4gcGFydGljbGUNCi3Qv9C+ICAgICAgICAgICAgIHwgdXAgdG8sIGFsb25nDQot0YLQvtC70YzQutC+ICAgICAgICAgfCBvbmx5DQot0LXQtSAgICAgICAgICAgICB8IGhlcg0KLdC80L3QtSAgICAgICAgICAgIHwgdG8gbWUNCi3QsdGL0LvQviAgICAgICAgICAgfCBpdCB3YXMNCi3QstC+0YIgICAgICAgICAgICB8IGhlcmUgaXMvYXJlLCBwYXJ0aWNsZQ0KLdC+0YIgICAgICAgICAgICAgfCBhd2F5IGZyb20NCi3QvNC10L3RjyAgICAgICAgICAgfCBtZQ0KLdC10YnQtSAgICAgICAgICAgIHwgc3RpbGwsIHlldCwgbW9yZQ0KLdC90LXRgiAgICAgICAgICAgIHwgbm8sIHRoZXJlIGlzbnQvYXJlbnQNCi3QviAgICAgICAgICAgICAgfCBhYm91dA0KLdC40LcgICAgICAgICAgICAgfCBvdXQgb2YNCi3QtdC80YMgICAgICAgICAgICB8IHRvIGhpbQ0KLdGC0LXQv9C10YDRjCAgICAgICAgIHwgbm93DQot0LrQvtCz0LTQsCAgICAgICAgICB8IHdoZW4NCi3QtNCw0LbQtSAgICAgICAgICAgfCBldmVuDQot0L3RgyAgICAgICAgICAgICB8IHNvLCB3ZWxsDQot0LLQtNGA0YPQsyAgICAgICAgICB8IHN1ZGRlbmx5DQot0LvQuCAgICAgICAgICAgICB8IGludGVycm9nYXRpdmUgcGFydGljbGUNCi3QtdGB0LvQuCAgICAgICAgICAgfCBpZg0KLdGD0LbQtSAgICAgICAgICAgIHwgYWxyZWFkeSwgYnV0IGhvbW9ueW0gb2YgYG5hcnJvd2VyJw0KLdC40LvQuCAgICAgICAgICAgIHwgb3INCi3QvdC4ICAgICAgICAgICAgIHwgbmVpdGhlcg0KLdCx0YvRgtGMICAgICAgICAgICB8IHRvIGJlDQot0LHRi9C7ICAgICAgICAgICAgfCBoZSB3YXMNCi3QvdC10LPQviAgICAgICAgICAgfCBwcmVwb3NpdGlvbmFsIGZvcm0gb2Yg0LXQs9C+DQot0LTQviAgICAgICAgICAgICB8IHVwIHRvDQot0LLQsNGBICAgICAgICAgICAgfCB5b3UgYWNjdXNhdGl2ZQ0KLdC90LjQsdGD0LTRjCAgICAgICAgIHwgaW5kZWYuIHN1ZmZpeCBwcmVjZWRlZCBieSBoeXBoZW4NCi3QvtC/0Y/RgtGMICAgICAgICAgIHwgYWdhaW4NCi3Rg9C2ICAgICAgICAgICAgIHwgYWxyZWFkeSwgYnV0IGhvbW9ueW0gb2YgYGFkZGVyJw0KLdCy0LDQvCAgICAgICAgICAgIHwgdG8geW91DQot0YHQutCw0LfQsNC7ICAgICAgICAgfCBoZSBzYWlkDQot0LLQtdC00YwgICAgICAgICAgIHwgcGFydGljbGUgYGFmdGVyIGFsbCcNCi3RgtCw0LwgICAgICAgICAgICB8IHRoZXJlDQot0L/QvtGC0L7QvCAgICAgICAgICB8IHRoZW4NCi3RgdC10LHRjyAgICAgICAgICAgfCBvbmVzZWxmDQot0L3QuNGH0LXQs9C+ICAgICAgICAgfCBub3RoaW5nDQot0LXQuSAgICAgICAgICAgICB8IHRvIGhlcg0KLdC80L7QttC10YIgICAgICAgICAgfCB1c3VhbGx5IHdpdGggYNCx0YvRgtGMJyBhcyBgbWF5YmUnDQot0L7QvdC4ICAgICAgICAgICAgfCB0aGV5DQot0YLRg9GCICAgICAgICAgICAgfCBoZXJlDQot0LPQtNC1ICAgICAgICAgICAgfCB3aGVyZQ0KLdC10YHRgtGMICAgICAgICAgICB8IHRoZXJlIGlzL2FyZQ0KLdC90LDQtNC+ICAgICAgICAgICB8IGdvdCB0bywgbXVzdA0KLdC90LXQuSAgICAgICAgICAgIHwgcHJlcG9zaXRpb25hbCBmb3JtIG9mICDQtdC5DQot0LTQu9GPICAgICAgICAgICAgfCBmb3INCi3QvNGLICAgICAgICAgICAgIHwgd2UNCi3RgtC10LHRjyAgICAgICAgICAgfCB0aGVlDQot0LjRhSAgICAgICAgICAgICB8IHRoZW0sIHRoZWlyDQot0YfQtdC8ICAgICAgICAgICAgfCB0aGFuDQot0LHRi9C70LAgICAgICAgICAgIHwgc2hlIHdhcw0KLdGB0LDQvCAgICAgICAgICAgIHwgc2VsZg0KLdGH0YLQvtCxICAgICAgICAgICB8IGluIG9yZGVyIHRvDQot0LHQtdC3ICAgICAgICAgICAgfCB3aXRob3V0DQot0LHRg9C00YLQviAgICAgICAgICB8IGFzIGlmDQot0YfQtdC70L7QstC10LogICAgICAgIHwgbWFuLCBwZXJzb24sIG9uZQ0KLdGH0LXQs9C+ICAgICAgICAgICB8IGdlbml0aXZlIGZvcm0gb2YgYHdoYXQnDQot0YDQsNC3ICAgICAgICAgICAgfCBvbmNlDQot0YLQvtC20LUgICAgICAgICAgIHwgYWxzbw0KLdGB0LXQsdC1ICAgICAgICAgICB8IHRvIG9uZXNlbGYNCi3Qv9C+0LQgICAgICAgICAgICB8IGJlbmVhdGgNCi3QttC40LfQvdGMICAgICAgICAgIHwgbGlmZQ0KLdCx0YPQtNC10YIgICAgICAgICAgfCB3aWxsIGJlDQot0LYgICAgICAgICAgICAgIHwgc2hvcnQgZm9ybSBvZiBpbnRlbnNpZmVyIHBhcnRpY2xlIGDQttC1Jw0KLdGC0L7Qs9C00LAgICAgICAgICAgfCB0aGVuDQot0LrRgtC+ICAgICAgICAgICAgfCB3aG8NCi3RjdGC0L7RgiAgICAgICAgICAgfCB0aGlzDQot0LPQvtCy0L7RgNC40LsgICAgICAgIHwgd2FzIHNheWluZw0KLdGC0L7Qs9C+ICAgICAgICAgICB8IGdlbml0aXZlIGZvcm0gb2YgYHRoYXQnDQot0L/QvtGC0L7QvNGDICAgICAgICAgfCBmb3IgdGhhdCByZWFzb24NCi3RjdGC0L7Qs9C+ICAgICAgICAgIHwgZ2VuaXRpdmUgZm9ybSBvZiBgdGhpcycNCi3QutCw0LrQvtC5ICAgICAgICAgIHwgd2hpY2gNCi3RgdC+0LLRgdC10LwgICAgICAgICB8IGFsdG9nZXRoZXINCi3QvdC40LwgICAgICAgICAgICB8IHByZXBvc2l0aW9uYWwgZm9ybSBvZiBg0LXQs9C+JywgYNC+0L3QuCcNCi3Qt9C00LXRgdGMICAgICAgICAgIHwgaGVyZQ0KLdGN0YLQvtC8ICAgICAgICAgICB8IHByZXBvc2l0aW9uYWwgZm9ybSBvZiBg0Y3RgtC+0YInDQot0L7QtNC40L0gICAgICAgICAgIHwgb25lDQot0L/QvtGH0YLQuCAgICAgICAgICB8IGFsbW9zdA0KLdC80L7QuSAgICAgICAgICAgIHwgbXkNCi3RgtC10LwgICAgICAgICAgICB8IGluc3RydW1lbnRhbC9kYXRpdmUgcGx1cmFsIG9mIGDRgtC+0YInLCBg0YLQvicNCi3Rh9GC0L7QsdGLICAgICAgICAgIHwgZnVsbCBmb3JtIG9mIGBpbiBvcmRlciB0aGF0Jw0KLdC90LXQtSAgICAgICAgICAgIHwgaGVyIChhY2MuKQ0KLdC60LDQttC10YLRgdGPICAgICAgICB8IGl0IHNlZW1zDQot0YHQtdC50YfQsNGBICAgICAgICAgfCBub3cNCi3QsdGL0LvQuCAgICAgICAgICAgfCB0aGV5IHdlcmUNCi3QutGD0LTQsCAgICAgICAgICAgfCB3aGVyZSB0bw0KLdC30LDRh9C10LwgICAgICAgICAgfCB3aHkNCi3RgdC60LDQt9Cw0YLRjCAgICAgICAgfCB0byBzYXkNCi3QstGB0LXRhSAgICAgICAgICAgfCBhbGwgKGFjYy4sIGdlbi4gcHJlcG9zbi4gcGx1cmFsKQ0KLdC90LjQutC+0LPQtNCwICAgICAgICB8IG5ldmVyDQot0YHQtdCz0L7QtNC90Y8gICAgICAgIHwgdG9kYXkNCi3QvNC+0LbQvdC+ICAgICAgICAgIHwgcG9zc2libGUsIG9uZSBjYW4NCi3Qv9GA0LggICAgICAgICAgICB8IGJ5DQot0L3QsNC60L7QvdC10YYgICAgICAgIHwgZmluYWxseQ0KLdC00LLQsCAgICAgICAgICAgIHwgdHdvDQot0L7QsSAgICAgICAgICAgICB8IGFsdGVybmF0aXZlIGZvcm0gb2YgYNC+JywgYWJvdXQNCi3QtNGA0YPQs9C+0LkgICAgICAgICB8IGFub3RoZXINCi3RhdC+0YLRjCAgICAgICAgICAgfCBldmVuDQot0L/QvtGB0LvQtSAgICAgICAgICB8IGFmdGVyDQot0L3QsNC0ICAgICAgICAgICAgfCBhYm92ZQ0KLdCx0L7Qu9GM0YjQtSAgICAgICAgIHwgbW9yZQ0KLdGC0L7RgiAgICAgICAgICAgIHwgdGhhdCBvbmUgKG1hc2MuKQ0KLdGH0LXRgNC10LcgICAgICAgICAgfCBhY3Jvc3MsIGluDQot0Y3RgtC4ICAgICAgICAgICAgfCB0aGVzZQ0KLdC90LDRgSAgICAgICAgICAgIHwgdXMNCi3Qv9GA0L4gICAgICAgICAgICB8IGFib3V0DQot0LLRgdC10LPQviAgICAgICAgICB8IGluIGFsbCwgb25seSwgb2YgYWxsDQot0L3QuNGFICAgICAgICAgICAgfCBwcmVwb3NpdGlvbmFsIGZvcm0gb2YgYNC+0L3QuCcgKHRoZXkpDQot0LrQsNC60LDRjyAgICAgICAgICB8IHdoaWNoLCBmZW1pbmluZQ0KLdC80L3QvtCz0L4gICAgICAgICAgfCBsb3RzDQot0YDQsNC30LLQtSAgICAgICAgICB8IGludGVycm9nYXRpdmUgcGFydGljbGUNCi3RgdC60LDQt9Cw0LvQsCAgICAgICAgfCBzaGUgc2FpZA0KLdGC0YDQuCAgICAgICAgICAgIHwgdGhyZWUNCi3RjdGC0YMgICAgICAgICAgICB8IHRoaXMsIGFjYy4gZmVtLiBzaW5nLg0KLdC80L7RjyAgICAgICAgICAgIHwgbXksIGZlbWluaW5lDQot0LLQv9GA0L7Rh9C10LwgICAgICAgIHwgbW9yZW92ZXIsIGJlc2lkZXMNCi3RhdC+0YDQvtGI0L4gICAgICAgICB8IGdvb2QNCi3RgdCy0L7RjiAgICAgICAgICAgfCBvbmVzIG93biwgYWNjLiBmZW0uIHNpbmcuDQot0Y3RgtC+0LkgICAgICAgICAgIHwgb2JsaXF1ZSBmb3JtIG9mIGDRjdGC0LAnLCBmZW0uIGB0aGlzJw0KLdC/0LXRgNC10LQgICAgICAgICAgfCBpbiBmcm9udCBvZg0KLdC40L3QvtCz0LTQsCAgICAgICAgIHwgc29tZXRpbWVzDQot0LvRg9GH0YjQtSAgICAgICAgICB8IGJldHRlcg0KLdGH0YPRgtGMICAgICAgICAgICB8IGEgbGl0dGxlDQot0YLQvtC8ICAgICAgICAgICAgfCBwcmVwb3NuLiBmb3JtIG9mIGB0aGF0IG9uZScNCi3QvdC10LvRjNC30Y8gICAgICAgICB8IG9uZSBtdXN0IG5vdA0KLdGC0LDQutC+0LkgICAgICAgICAgfCBzdWNoIGEgb25lDQot0LjQvCAgICAgICAgICAgICB8IHRvIHRoZW0NCi3QsdC+0LvQtdC1ICAgICAgICAgIHwgbW9yZQ0KLdCy0YHQtdCz0LTQsCAgICAgICAgIHwgYWx3YXlzDQot0LrQvtC90LXRh9C90L4gICAgICAgIHwgb2YgY291cnNlDQot0LLRgdGOICAgICAgICAgICAgfCBhY2MuIGZlbS4gc2luZyBvZiBgYWxsJw0KLdC80LXQttC00YMgICAgICAgICAgfCBiZXR3ZWVuDQotDQotDQotICB8IGI6IHNvbWUgcGFyYWRpZ21zDQotICB8DQotICB8IHBlcnNvbmFsIHByb25vdW5zDQotICB8DQotICB8INGPICDQvNC10L3RjyAg0LzQvdC1ICDQvNC90L7QuSAgW9C80L3QvtGOXQ0KLSAgfCDRgtGLICDRgtC10LHRjyAg0YLQtdCx0LUgINGC0L7QsdC+0LkgIFvRgtC+0LHQvtGOXQ0KLSAgfCDQvtC9ICDQtdCz0L4gINC10LzRgyAg0LjQvCAgW9C90LXQs9C+LCDQvdC10LzRgywg0L3QuNC8XQ0KLSAgfCDQvtC90LAgINC10LUgINGN0LggINC10Y4gIFvQvdC10LUsINC90Y3QuCwg0L3QtdGOXQ0KLSAgfCDQvtC90L4gINC10LPQviAg0LXQvNGDICDQuNC8ICBb0L3QtdCz0L4sINC90LXQvNGDLCDQvdC40LxdDQotICB8DQotICB8INC80YsgINC90LDRgSAg0L3QsNC8ICDQvdCw0LzQuA0KLSAgfCDQstGLICDQstCw0YEgINCy0LDQvCAg0LLQsNC80LgNCi0gIHwg0L7QvdC4ICDQuNGFICDQuNC8ICDQuNC80LggIFvQvdC40YUsINC90LjQvCwg0L3QuNC80LhdDQotICB8DQotICB8ICAg0YHQtdCx0Y8gINGB0LXQsdC1ICDRgdC+0LHQvtC5ICAgW9GB0L7QsdC+0Y5dDQotICB8DQotICB8IGRlbW9uc3RyYXRpdmUgcHJvbm91bnM6INGN0YLQvtGCICh0aGlzKSwg0YLQvtGCICh0aGF0KQ0KLSAgfA0KLSAgfCDRjdGC0L7RgiAg0Y3RgtCwICDRjdGC0L4gINGN0YLQuA0KLSAgfCDRjdGC0L7Qs9C+ICDRjdGC0YsgINGN0YLQviAg0Y3RgtC4DQotICB8INGN0YLQvtCz0L4gINGN0YLQvtC5ICDRjdGC0L7Qs9C+ICDRjdGC0LjRhQ0KLSAgfCDRjdGC0L7QvNGDICDRjdGC0L7QuSAg0Y3RgtC+0LzRgyAg0Y3RgtC40LwNCi0gIHwg0Y3RgtC40LwgINGN0YLQvtC5ICDRjdGC0LjQvCAgW9GN0YLQvtGOXSAg0Y3RgtC40LzQuA0KLSAgfCDRjdGC0L7QvCAg0Y3RgtC+0LkgINGN0YLQvtC8ICDRjdGC0LjRhQ0KLSAgfA0KLSAgfCDRgtC+0YIgINGC0LAgINGC0L4gINGC0LUNCi0gIHwg0YLQvtCz0L4gINGC0YMgINGC0L4gINGC0LUNCi0gIHwg0YLQvtCz0L4gINGC0L7QuSAg0YLQvtCz0L4gINGC0LXRhQ0KLSAgfCDRgtC+0LzRgyAg0YLQvtC5ICDRgtC+0LzRgyAg0YLQtdC8DQotICB8INGC0LXQvCAg0YLQvtC5ICDRgtC10LwgIFvRgtC+0Y5dICDRgtC10LzQuA0KLSAgfCDRgtC+0LwgINGC0L7QuSAg0YLQvtC8ICDRgtC10YUNCi0gIHwNCi0gIHwgZGV0ZXJtaW5hdGl2ZSBwcm9ub3Vucw0KLSAgfA0KLSAgfCAoYSkg0LLQtdGB0YwgKGFsbCkNCi0gIHwNCi0gIHwg0LLQtdGB0YwgINCy0YHRjyAg0LLRgdC1ICDQstGB0LUNCi0gIHwg0LLRgdC10LPQviAg0LLRgdGOICDQstGB0LUgINCy0YHQtQ0KLSAgfCDQstGB0LXQs9C+ICDQstGB0LXQuSAg0LLRgdC10LPQviAg0LLRgdC10YUNCi0gIHwg0LLRgdC10LzRgyAg0LLRgdC10LkgINCy0YHQtdC80YMgINCy0YHQtdC8DQotICB8INCy0YHQtdC8ICDQstGB0LXQuSAg0LLRgdC10LwgIFvQstGB0LXRjl0gINCy0YHQtdC80LgNCi0gIHwg0LLRgdC10LwgINCy0YHQtdC5ICDQstGB0LXQvCAg0LLRgdC10YUNCi0gIHwNCi0gIHwgKGIpINGB0LDQvCAoaGltc2VsZiBldGMpDQotICB8DQotICB8INGB0LDQvCAg0YHQsNC80LAgINGB0LDQvNC+ICDRgdCw0LzQuA0KLSAgfCDRgdCw0LzQvtCz0L4g0YHQsNC80YMgINGB0LDQvNC+ICDRgdCw0LzQuNGFDQotICB8INGB0LDQvNC+0LPQviDRgdCw0LzQvtC5INGB0LDQvNC+0LPQviAg0YHQsNC80LjRhQ0KLSAgfCDRgdCw0LzQvtC80YMg0YHQsNC80L7QuSDRgdCw0LzQvtC80YMgINGB0LDQvNC40LwNCi0gIHwg0YHQsNC80LjQvCAg0YHQsNC80L7QuSAg0YHQsNC80LjQvCAgW9GB0LDQvNC+0Y5dICDRgdCw0LzQuNC80LgNCi0gIHwg0YHQsNC80L7QvCDRgdCw0LzQvtC5INGB0LDQvNC+0LwgINGB0LDQvNC40YUNCi0gIHwNCi0gIHwgc3RlbXMgb2YgdmVyYnMgYHRvIGJlJywgYHRvIGhhdmUnLCBgdG8gZG8nIGFuZCBtb2RhbA0KLSAgfA0KLSAgfCDQsdGL0YLRjCAg0LHRiyAg0LHRg9C0ICDQsdGL0LIgINC10YHRgtGMICDRgdGD0YLRjA0KLSAgfCDQuNC80LUNCi0gIHwg0LTQtdC7DQotICB8INC80L7QsyAgINC80L7QtiAg0LzQvtGH0YwNCi0gIHwg0YPQvNC1DQotICB8INGF0L7RhyAg0YXQvtGCDQotICB8INC00L7Qu9C2DQotICB8INC80L7QttC9DQotICB8INC90YPQttC9DQotICB8INC90LXQu9GM0LfRjw0KLQ0KKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvcnVzc2lhbi9zdG9wLnR4dAorIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KKyB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwCisgfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKKyB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguCisgfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuCisgfAorIHwgTk9URTogVG8gdXNlIHRoaXMgZmlsZSB3aXRoIFN0b3BGaWx0ZXJGYWN0b3J5LCB5b3UgbXVzdCBzcGVjaWZ5IGZvcm1hdD0ic25vd2JhbGwiCisKKyB8IGEgcnVzc2lhbiBzdG9wIHdvcmQgbGlzdC4gY29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIGVhY2ggc3RvcAorIHwgd29yZCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorCisgfCB0aGlzIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3JkcyBkZXJpdmVkIGZyb20KKyB8IGEgbGFyZ2UgdGV4dCBzYW1wbGUuCisKKyB8IGxldHRlciBg0ZEnIGlzIHRyYW5zbGF0ZWQgdG8gYNC1Jy4KKwor0LggICAgICAgICAgICAgIHwgYW5kCivQsiAgICAgICAgICAgICAgfCBpbi9pbnRvCivQstC+ICAgICAgICAgICAgIHwgYWx0ZXJuYXRpdmUgZm9ybQor0L3QtSAgICAgICAgICAgICB8IG5vdAor0YfRgtC+ICAgICAgICAgICAgfCB3aGF0L3RoYXQKK9C+0L0gICAgICAgICAgICAgfCBoZQor0L3QsCAgICAgICAgICAgICB8IG9uL29udG8KK9GPICAgICAgICAgICAgICB8IGkKK9GBICAgICAgICAgICAgICB8IGZyb20KK9GB0L4gICAgICAgICAgICAgfCBhbHRlcm5hdGl2ZSBmb3JtCivQutCw0LogICAgICAgICAgICB8IGhvdwor0LAgICAgICAgICAgICAgIHwgbWlsZGVyIGZvcm0gb2YgYG5vJyAoYnV0KQor0YLQviAgICAgICAgICAgICB8IGNvbmp1bmN0aW9uIGFuZCBmb3JtIG9mIGB0aGF0Jwor0LLRgdC1ICAgICAgICAgICAgfCBhbGwKK9C+0L3QsCAgICAgICAgICAgIHwgc2hlCivRgtCw0LogICAgICAgICAgICB8IHNvLCB0aHVzCivQtdCz0L4gICAgICAgICAgICB8IGhpbQor0L3QviAgICAgICAgICAgICB8IGJ1dAor0LTQsCAgICAgICAgICAgICB8IHllcy9hbmQKK9GC0YsgICAgICAgICAgICAgfCB0aG91CivQuiAgICAgICAgICAgICAgfCB0b3dhcmRzLCBieQor0YMgICAgICAgICAgICAgIHwgYXJvdW5kLCBjaGV6CivQttC1ICAgICAgICAgICAgIHwgaW50ZW5zaWZpZXIgcGFydGljbGUKK9Cy0YsgICAgICAgICAgICAgfCB5b3UKK9C30LAgICAgICAgICAgICAgfCBiZXlvbmQsIGJlaGluZAor0LHRiyAgICAgICAgICAgICB8IGNvbmRpdGlvbmFsL3N1YmouIHBhcnRpY2xlCivQv9C+ICAgICAgICAgICAgIHwgdXAgdG8sIGFsb25nCivRgtC+0LvRjNC60L4gICAgICAgICB8IG9ubHkKK9C10LUgICAgICAgICAgICAgfCBoZXIKK9C80L3QtSAgICAgICAgICAgIHwgdG8gbWUKK9Cx0YvQu9C+ICAgICAgICAgICB8IGl0IHdhcwor0LLQvtGCICAgICAgICAgICAgfCBoZXJlIGlzL2FyZSwgcGFydGljbGUKK9C+0YIgICAgICAgICAgICAgfCBhd2F5IGZyb20KK9C80LXQvdGPICAgICAgICAgICB8IG1lCivQtdGJ0LUgICAgICAgICAgICB8IHN0aWxsLCB5ZXQsIG1vcmUKK9C90LXRgiAgICAgICAgICAgIHwgbm8sIHRoZXJlIGlzbnQvYXJlbnQKK9C+ICAgICAgICAgICAgICB8IGFib3V0CivQuNC3ICAgICAgICAgICAgIHwgb3V0IG9mCivQtdC80YMgICAgICAgICAgICB8IHRvIGhpbQor0YLQtdC/0LXRgNGMICAgICAgICAgfCBub3cKK9C60L7Qs9C00LAgICAgICAgICAgfCB3aGVuCivQtNCw0LbQtSAgICAgICAgICAgfCBldmVuCivQvdGDICAgICAgICAgICAgIHwgc28sIHdlbGwKK9Cy0LTRgNGD0LMgICAgICAgICAgfCBzdWRkZW5seQor0LvQuCAgICAgICAgICAgICB8IGludGVycm9nYXRpdmUgcGFydGljbGUKK9C10YHQu9C4ICAgICAgICAgICB8IGlmCivRg9C20LUgICAgICAgICAgICB8IGFscmVhZHksIGJ1dCBob21vbnltIG9mIGBuYXJyb3dlcicKK9C40LvQuCAgICAgICAgICAgIHwgb3IKK9C90LggICAgICAgICAgICAgfCBuZWl0aGVyCivQsdGL0YLRjCAgICAgICAgICAgfCB0byBiZQor0LHRi9C7ICAgICAgICAgICAgfCBoZSB3YXMKK9C90LXQs9C+ICAgICAgICAgICB8IHByZXBvc2l0aW9uYWwgZm9ybSBvZiDQtdCz0L4KK9C00L4gICAgICAgICAgICAgfCB1cCB0bwor0LLQsNGBICAgICAgICAgICAgfCB5b3UgYWNjdXNhdGl2ZQor0L3QuNCx0YPQtNGMICAgICAgICAgfCBpbmRlZi4gc3VmZml4IHByZWNlZGVkIGJ5IGh5cGhlbgor0L7Qv9GP0YLRjCAgICAgICAgICB8IGFnYWluCivRg9C2ICAgICAgICAgICAgIHwgYWxyZWFkeSwgYnV0IGhvbW9ueW0gb2YgYGFkZGVyJwor0LLQsNC8ICAgICAgICAgICAgfCB0byB5b3UKK9GB0LrQsNC30LDQuyAgICAgICAgIHwgaGUgc2FpZAor0LLQtdC00YwgICAgICAgICAgIHwgcGFydGljbGUgYGFmdGVyIGFsbCcKK9GC0LDQvCAgICAgICAgICAgIHwgdGhlcmUKK9C/0L7RgtC+0LwgICAgICAgICAgfCB0aGVuCivRgdC10LHRjyAgICAgICAgICAgfCBvbmVzZWxmCivQvdC40YfQtdCz0L4gICAgICAgICB8IG5vdGhpbmcKK9C10LkgICAgICAgICAgICAgfCB0byBoZXIKK9C80L7QttC10YIgICAgICAgICAgfCB1c3VhbGx5IHdpdGggYNCx0YvRgtGMJyBhcyBgbWF5YmUnCivQvtC90LggICAgICAgICAgICB8IHRoZXkKK9GC0YPRgiAgICAgICAgICAgIHwgaGVyZQor0LPQtNC1ICAgICAgICAgICAgfCB3aGVyZQor0LXRgdGC0YwgICAgICAgICAgIHwgdGhlcmUgaXMvYXJlCivQvdCw0LTQviAgICAgICAgICAgfCBnb3QgdG8sIG11c3QKK9C90LXQuSAgICAgICAgICAgIHwgcHJlcG9zaXRpb25hbCBmb3JtIG9mICDQtdC5CivQtNC70Y8gICAgICAgICAgICB8IGZvcgor0LzRiyAgICAgICAgICAgICB8IHdlCivRgtC10LHRjyAgICAgICAgICAgfCB0aGVlCivQuNGFICAgICAgICAgICAgIHwgdGhlbSwgdGhlaXIKK9GH0LXQvCAgICAgICAgICAgIHwgdGhhbgor0LHRi9C70LAgICAgICAgICAgIHwgc2hlIHdhcwor0YHQsNC8ICAgICAgICAgICAgfCBzZWxmCivRh9GC0L7QsSAgICAgICAgICAgfCBpbiBvcmRlciB0bwor0LHQtdC3ICAgICAgICAgICAgfCB3aXRob3V0CivQsdGD0LTRgtC+ICAgICAgICAgIHwgYXMgaWYKK9GH0LXQu9C+0LLQtdC6ICAgICAgICB8IG1hbiwgcGVyc29uLCBvbmUKK9GH0LXQs9C+ICAgICAgICAgICB8IGdlbml0aXZlIGZvcm0gb2YgYHdoYXQnCivRgNCw0LcgICAgICAgICAgICB8IG9uY2UKK9GC0L7QttC1ICAgICAgICAgICB8IGFsc28KK9GB0LXQsdC1ICAgICAgICAgICB8IHRvIG9uZXNlbGYKK9C/0L7QtCAgICAgICAgICAgIHwgYmVuZWF0aAor0LbQuNC30L3RjCAgICAgICAgICB8IGxpZmUKK9Cx0YPQtNC10YIgICAgICAgICAgfCB3aWxsIGJlCivQtiAgICAgICAgICAgICAgfCBzaG9ydCBmb3JtIG9mIGludGVuc2lmZXIgcGFydGljbGUgYNC20LUnCivRgtC+0LPQtNCwICAgICAgICAgIHwgdGhlbgor0LrRgtC+ICAgICAgICAgICAgfCB3aG8KK9GN0YLQvtGCICAgICAgICAgICB8IHRoaXMKK9Cz0L7QstC+0YDQuNC7ICAgICAgICB8IHdhcyBzYXlpbmcKK9GC0L7Qs9C+ICAgICAgICAgICB8IGdlbml0aXZlIGZvcm0gb2YgYHRoYXQnCivQv9C+0YLQvtC80YMgICAgICAgICB8IGZvciB0aGF0IHJlYXNvbgor0Y3RgtC+0LPQviAgICAgICAgICB8IGdlbml0aXZlIGZvcm0gb2YgYHRoaXMnCivQutCw0LrQvtC5ICAgICAgICAgIHwgd2hpY2gKK9GB0L7QstGB0LXQvCAgICAgICAgIHwgYWx0b2dldGhlcgor0L3QuNC8ICAgICAgICAgICAgfCBwcmVwb3NpdGlvbmFsIGZvcm0gb2YgYNC10LPQvicsIGDQvtC90LgnCivQt9C00LXRgdGMICAgICAgICAgIHwgaGVyZQor0Y3RgtC+0LwgICAgICAgICAgIHwgcHJlcG9zaXRpb25hbCBmb3JtIG9mIGDRjdGC0L7RgicKK9C+0LTQuNC9ICAgICAgICAgICB8IG9uZQor0L/QvtGH0YLQuCAgICAgICAgICB8IGFsbW9zdAor0LzQvtC5ICAgICAgICAgICAgfCBteQor0YLQtdC8ICAgICAgICAgICAgfCBpbnN0cnVtZW50YWwvZGF0aXZlIHBsdXJhbCBvZiBg0YLQvtGCJywgYNGC0L4nCivRh9GC0L7QsdGLICAgICAgICAgIHwgZnVsbCBmb3JtIG9mIGBpbiBvcmRlciB0aGF0Jwor0L3QtdC1ICAgICAgICAgICAgfCBoZXIgKGFjYy4pCivQutCw0LbQtdGC0YHRjyAgICAgICAgfCBpdCBzZWVtcwor0YHQtdC50YfQsNGBICAgICAgICAgfCBub3cKK9Cx0YvQu9C4ICAgICAgICAgICB8IHRoZXkgd2VyZQor0LrRg9C00LAgICAgICAgICAgIHwgd2hlcmUgdG8KK9C30LDRh9C10LwgICAgICAgICAgfCB3aHkKK9GB0LrQsNC30LDRgtGMICAgICAgICB8IHRvIHNheQor0LLRgdC10YUgICAgICAgICAgIHwgYWxsIChhY2MuLCBnZW4uIHByZXBvc24uIHBsdXJhbCkKK9C90LjQutC+0LPQtNCwICAgICAgICB8IG5ldmVyCivRgdC10LPQvtC00L3RjyAgICAgICAgfCB0b2RheQor0LzQvtC20L3QviAgICAgICAgICB8IHBvc3NpYmxlLCBvbmUgY2FuCivQv9GA0LggICAgICAgICAgICB8IGJ5CivQvdCw0LrQvtC90LXRhiAgICAgICAgfCBmaW5hbGx5CivQtNCy0LAgICAgICAgICAgICB8IHR3bwor0L7QsSAgICAgICAgICAgICB8IGFsdGVybmF0aXZlIGZvcm0gb2YgYNC+JywgYWJvdXQKK9C00YDRg9Cz0L7QuSAgICAgICAgIHwgYW5vdGhlcgor0YXQvtGC0YwgICAgICAgICAgIHwgZXZlbgor0L/QvtGB0LvQtSAgICAgICAgICB8IGFmdGVyCivQvdCw0LQgICAgICAgICAgICB8IGFib3ZlCivQsdC+0LvRjNGI0LUgICAgICAgICB8IG1vcmUKK9GC0L7RgiAgICAgICAgICAgIHwgdGhhdCBvbmUgKG1hc2MuKQor0YfQtdGA0LXQtyAgICAgICAgICB8IGFjcm9zcywgaW4KK9GN0YLQuCAgICAgICAgICAgIHwgdGhlc2UKK9C90LDRgSAgICAgICAgICAgIHwgdXMKK9C/0YDQviAgICAgICAgICAgIHwgYWJvdXQKK9Cy0YHQtdCz0L4gICAgICAgICAgfCBpbiBhbGwsIG9ubHksIG9mIGFsbAor0L3QuNGFICAgICAgICAgICAgfCBwcmVwb3NpdGlvbmFsIGZvcm0gb2YgYNC+0L3QuCcgKHRoZXkpCivQutCw0LrQsNGPICAgICAgICAgIHwgd2hpY2gsIGZlbWluaW5lCivQvNC90L7Qs9C+ICAgICAgICAgIHwgbG90cwor0YDQsNC30LLQtSAgICAgICAgICB8IGludGVycm9nYXRpdmUgcGFydGljbGUKK9GB0LrQsNC30LDQu9CwICAgICAgICB8IHNoZSBzYWlkCivRgtGA0LggICAgICAgICAgICB8IHRocmVlCivRjdGC0YMgICAgICAgICAgICB8IHRoaXMsIGFjYy4gZmVtLiBzaW5nLgor0LzQvtGPICAgICAgICAgICAgfCBteSwgZmVtaW5pbmUKK9Cy0L/RgNC+0YfQtdC8ICAgICAgICB8IG1vcmVvdmVyLCBiZXNpZGVzCivRhdC+0YDQvtGI0L4gICAgICAgICB8IGdvb2QKK9GB0LLQvtGOICAgICAgICAgICB8IG9uZXMgb3duLCBhY2MuIGZlbS4gc2luZy4KK9GN0YLQvtC5ICAgICAgICAgICB8IG9ibGlxdWUgZm9ybSBvZiBg0Y3RgtCwJywgZmVtLiBgdGhpcycKK9C/0LXRgNC10LQgICAgICAgICAgfCBpbiBmcm9udCBvZgor0LjQvdC+0LPQtNCwICAgICAgICAgfCBzb21ldGltZXMKK9C70YPRh9GI0LUgICAgICAgICAgfCBiZXR0ZXIKK9GH0YPRgtGMICAgICAgICAgICB8IGEgbGl0dGxlCivRgtC+0LwgICAgICAgICAgICB8IHByZXBvc24uIGZvcm0gb2YgYHRoYXQgb25lJwor0L3QtdC70YzQt9GPICAgICAgICAgfCBvbmUgbXVzdCBub3QKK9GC0LDQutC+0LkgICAgICAgICAgfCBzdWNoIGEgb25lCivQuNC8ICAgICAgICAgICAgIHwgdG8gdGhlbQor0LHQvtC70LXQtSAgICAgICAgICB8IG1vcmUKK9Cy0YHQtdCz0LTQsCAgICAgICAgIHwgYWx3YXlzCivQutC+0L3QtdGH0L3QviAgICAgICAgfCBvZiBjb3Vyc2UKK9Cy0YHRjiAgICAgICAgICAgIHwgYWNjLiBmZW0uIHNpbmcgb2YgYGFsbCcKK9C80LXQttC00YMgICAgICAgICAgfCBiZXR3ZWVuCisKKworICB8IGI6IHNvbWUgcGFyYWRpZ21zCisgIHwKKyAgfCBwZXJzb25hbCBwcm9ub3VucworICB8CisgIHwg0Y8gINC80LXQvdGPICDQvNC90LUgINC80L3QvtC5ICBb0LzQvdC+0Y5dCisgIHwg0YLRiyAg0YLQtdCx0Y8gINGC0LXQsdC1ICDRgtC+0LHQvtC5ICBb0YLQvtCx0L7Rjl0KKyAgfCDQvtC9ICDQtdCz0L4gINC10LzRgyAg0LjQvCAgW9C90LXQs9C+LCDQvdC10LzRgywg0L3QuNC8XQorICB8INC+0L3QsCAg0LXQtSAg0Y3QuCAg0LXRjiAgW9C90LXQtSwg0L3RjdC4LCDQvdC10Y5dCisgIHwg0L7QvdC+ICDQtdCz0L4gINC10LzRgyAg0LjQvCAgW9C90LXQs9C+LCDQvdC10LzRgywg0L3QuNC8XQorICB8CisgIHwg0LzRiyAg0L3QsNGBICDQvdCw0LwgINC90LDQvNC4CisgIHwg0LLRiyAg0LLQsNGBICDQstCw0LwgINCy0LDQvNC4CisgIHwg0L7QvdC4ICDQuNGFICDQuNC8ICDQuNC80LggIFvQvdC40YUsINC90LjQvCwg0L3QuNC80LhdCisgIHwKKyAgfCAgINGB0LXQsdGPICDRgdC10LHQtSAg0YHQvtCx0L7QuSAgIFvRgdC+0LHQvtGOXQorICB8CisgIHwgZGVtb25zdHJhdGl2ZSBwcm9ub3Vuczog0Y3RgtC+0YIgKHRoaXMpLCDRgtC+0YIgKHRoYXQpCisgIHwKKyAgfCDRjdGC0L7RgiAg0Y3RgtCwICDRjdGC0L4gINGN0YLQuAorICB8INGN0YLQvtCz0L4gINGN0YLRiyAg0Y3RgtC+ICDRjdGC0LgKKyAgfCDRjdGC0L7Qs9C+ICDRjdGC0L7QuSAg0Y3RgtC+0LPQviAg0Y3RgtC40YUKKyAgfCDRjdGC0L7QvNGDICDRjdGC0L7QuSAg0Y3RgtC+0LzRgyAg0Y3RgtC40LwKKyAgfCDRjdGC0LjQvCAg0Y3RgtC+0LkgINGN0YLQuNC8ICBb0Y3RgtC+0Y5dICDRjdGC0LjQvNC4CisgIHwg0Y3RgtC+0LwgINGN0YLQvtC5ICDRjdGC0L7QvCAg0Y3RgtC40YUKKyAgfAorICB8INGC0L7RgiAg0YLQsCAg0YLQviAg0YLQtQorICB8INGC0L7Qs9C+ICDRgtGDICDRgtC+ICDRgtC1CisgIHwg0YLQvtCz0L4gINGC0L7QuSAg0YLQvtCz0L4gINGC0LXRhQorICB8INGC0L7QvNGDICDRgtC+0LkgINGC0L7QvNGDICDRgtC10LwKKyAgfCDRgtC10LwgINGC0L7QuSAg0YLQtdC8ICBb0YLQvtGOXSAg0YLQtdC80LgKKyAgfCDRgtC+0LwgINGC0L7QuSAg0YLQvtC8ICDRgtC10YUKKyAgfAorICB8IGRldGVybWluYXRpdmUgcHJvbm91bnMKKyAgfAorICB8IChhKSDQstC10YHRjCAoYWxsKQorICB8CisgIHwg0LLQtdGB0YwgINCy0YHRjyAg0LLRgdC1ICDQstGB0LUKKyAgfCDQstGB0LXQs9C+ICDQstGB0Y4gINCy0YHQtSAg0LLRgdC1CisgIHwg0LLRgdC10LPQviAg0LLRgdC10LkgINCy0YHQtdCz0L4gINCy0YHQtdGFCisgIHwg0LLRgdC10LzRgyAg0LLRgdC10LkgINCy0YHQtdC80YMgINCy0YHQtdC8CisgIHwg0LLRgdC10LwgINCy0YHQtdC5ICDQstGB0LXQvCAgW9Cy0YHQtdGOXSAg0LLRgdC10LzQuAorICB8INCy0YHQtdC8ICDQstGB0LXQuSAg0LLRgdC10LwgINCy0YHQtdGFCisgIHwKKyAgfCAoYikg0YHQsNC8IChoaW1zZWxmIGV0YykKKyAgfAorICB8INGB0LDQvCAg0YHQsNC80LAgINGB0LDQvNC+ICDRgdCw0LzQuAorICB8INGB0LDQvNC+0LPQviDRgdCw0LzRgyAg0YHQsNC80L4gINGB0LDQvNC40YUKKyAgfCDRgdCw0LzQvtCz0L4g0YHQsNC80L7QuSDRgdCw0LzQvtCz0L4gINGB0LDQvNC40YUKKyAgfCDRgdCw0LzQvtC80YMg0YHQsNC80L7QuSDRgdCw0LzQvtC80YMgINGB0LDQvNC40LwKKyAgfCDRgdCw0LzQuNC8ICDRgdCw0LzQvtC5ICDRgdCw0LzQuNC8ICBb0YHQsNC80L7Rjl0gINGB0LDQvNC40LzQuAorICB8INGB0LDQvNC+0Lwg0YHQsNC80L7QuSDRgdCw0LzQvtC8ICDRgdCw0LzQuNGFCisgIHwKKyAgfCBzdGVtcyBvZiB2ZXJicyBgdG8gYmUnLCBgdG8gaGF2ZScsIGB0byBkbycgYW5kIG1vZGFsCisgIHwKKyAgfCDQsdGL0YLRjCAg0LHRiyAg0LHRg9C0ICDQsdGL0LIgINC10YHRgtGMICDRgdGD0YLRjAorICB8INC40LzQtQorICB8INC00LXQuworICB8INC80L7QsyAgINC80L7QtiAg0LzQvtGH0YwKKyAgfCDRg9C80LUKKyAgfCDRhdC+0YcgINGF0L7RggorICB8INC00L7Qu9C2CisgIHwg0LzQvtC20L0KKyAgfCDQvdGD0LbQvQorICB8INC90LXQu9GM0LfRjworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3N2LnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfc3YudHh0CmluZGV4IDcyMTYzNzMuLjA5NmY4N2YgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfc3YudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy9zdG9wd29yZHNfc3YudHh0CkBAIC0xLDEzMyArMSwxMzMgQEAKLSB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvc3dlZGlzaC9zdG9wLnR4dA0KLSB8IFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuDQotIHwgU2VlIGh0dHA6Ly9zbm93YmFsbC50YXJ0YXJ1cy5vcmcvbGljZW5zZS5waHANCi0gfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwNCi0gfCAgLSBFbmNvZGluZyB3YXMgY29udmVydGVkIHRvIFVURi04Lg0KLSB8ICAtIFRoaXMgbm90aWNlIHdhcyBhZGRlZC4NCi0gfA0KLSB8IE5PVEU6IFRvIHVzZSB0aGlzIGZpbGUgd2l0aCBTdG9wRmlsdGVyRmFjdG9yeSwgeW91IG11c3Qgc3BlY2lmeSBmb3JtYXQ9InNub3diYWxsIg0KLQ0KLSB8IEEgU3dlZGlzaCBzdG9wIHdvcmQgbGlzdC4gQ29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIEVhY2ggc3RvcA0KLSB8IHdvcmQgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4NCi0NCi0gfCBUaGlzIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3JkcyBkZXJpdmVkIGZyb20NCi0gfCBhIGxhcmdlIHRleHQgc2FtcGxlLg0KLQ0KLSB8IFN3ZWRpc2ggc3RvcCB3b3JkcyBvY2Nhc2lvbmFsbHkgZXhoaWJpdCBob21vbnltIGNsYXNoZXMuIEZvciBleGFtcGxlDQotIHwgIHPDpSA9IHNvLCBidXQgYWxzbyBzZWVkLiBUaGVzZSBhcmUgaW5kaWNhdGVkIGNsZWFybHkgYmVsb3cuDQotDQotb2NoICAgICAgICAgICAgfCBhbmQNCi1kZXQgICAgICAgICAgICB8IGl0LCB0aGlzL3RoYXQNCi1hdHQgICAgICAgICAgICB8IHRvICh3aXRoIGluZmluaXRpdmUpDQotaSAgICAgICAgICAgICAgfCBpbiwgYXQNCi1lbiAgICAgICAgICAgICB8IGENCi1qYWcgICAgICAgICAgICB8IEkNCi1ob24gICAgICAgICAgICB8IHNoZQ0KLXNvbSAgICAgICAgICAgIHwgd2hvLCB0aGF0DQotaGFuICAgICAgICAgICAgfCBoZQ0KLXDDpSAgICAgICAgICAgICB8IG9uDQotZGVuICAgICAgICAgICAgfCBpdCwgdGhpcy90aGF0DQotbWVkICAgICAgICAgICAgfCB3aXRoDQotdmFyICAgICAgICAgICAgfCB3aGVyZSwgZWFjaA0KLXNpZyAgICAgICAgICAgIHwgaGltKHNlbGYpIGV0Yw0KLWbDtnIgICAgICAgICAgICB8IGZvcg0KLXPDpSAgICAgICAgICAgICB8IHNvIChhbHNvOiBzZWVkKQ0KLXRpbGwgICAgICAgICAgIHwgdG8NCi3DpHIgICAgICAgICAgICAgfCBpcw0KLW1lbiAgICAgICAgICAgIHwgYnV0DQotZXR0ICAgICAgICAgICAgfCBhDQotb20gICAgICAgICAgICAgfCBpZjsgYXJvdW5kLCBhYm91dA0KLWhhZGUgICAgICAgICAgIHwgaGFkDQotZGUgICAgICAgICAgICAgfCB0aGV5LCB0aGVzZS90aG9zZQ0KLWF2ICAgICAgICAgICAgIHwgb2YNCi1pY2tlICAgICAgICAgICB8IG5vdCwgbm8NCi1taWcgICAgICAgICAgICB8IG1lDQotZHUgICAgICAgICAgICAgfCB5b3UNCi1oZW5uZSAgICAgICAgICB8IGhlcg0KLWTDpSAgICAgICAgICAgICB8IHRoZW4sIHdoZW4NCi1zaW4gICAgICAgICAgICB8IGhpcw0KLW51ICAgICAgICAgICAgIHwgbm93DQotaGFyICAgICAgICAgICAgfCBoYXZlDQotaW50ZSAgICAgICAgICAgfCBpbnRlIG7DpWdvbiA9IG5vIG9uZQ0KLWhhbnMgICAgICAgICAgIHwgaGlzDQotaG9ub20gICAgICAgICAgfCBoaW0NCi1za3VsbGUgICAgICAgICB8ICdzYWtlJw0KLWhlbm5lcyAgICAgICAgIHwgaGVyDQotZMOkciAgICAgICAgICAgIHwgdGhlcmUNCi1taW4gICAgICAgICAgICB8IG15DQotbWFuICAgICAgICAgICAgfCBvbmUgKHByb25vdW4pDQotZWogICAgICAgICAgICAgfCBub3INCi12aWQgICAgICAgICAgICB8IGF0LCBieSwgb24gKGFsc286IHZhc3QpDQota3VuZGUgICAgICAgICAgfCBjb3VsZA0KLW7DpWdvdCAgICAgICAgICB8IHNvbWUgZXRjDQotZnLDpW4gICAgICAgICAgIHwgZnJvbSwgb2ZmDQotdXQgICAgICAgICAgICAgfCBvdXQNCi1uw6RyICAgICAgICAgICAgfCB3aGVuDQotZWZ0ZXIgICAgICAgICAgfCBhZnRlciwgYmVoaW5kDQotdXBwICAgICAgICAgICAgfCB1cA0KLXZpICAgICAgICAgICAgIHwgd2UNCi1kZW0gICAgICAgICAgICB8IHRoZW0NCi12YXJhICAgICAgICAgICB8IGJlDQotdmFkICAgICAgICAgICAgfCB3aGF0DQotw7Z2ZXIgICAgICAgICAgIHwgb3Zlcg0KLcOkbiAgICAgICAgICAgICB8IHRoYW4NCi1kaWcgICAgICAgICAgICB8IHlvdQ0KLWthbiAgICAgICAgICAgIHwgY2FuDQotc2luYSAgICAgICAgICAgfCBoaXMNCi1ow6RyICAgICAgICAgICAgfCBoZXJlDQotaGEgICAgICAgICAgICAgfCBoYXZlDQotbW90ICAgICAgICAgICAgfCB0b3dhcmRzDQotYWxsYSAgICAgICAgICAgfCBhbGwNCi11bmRlciAgICAgICAgICB8IHVuZGVyIChhbHNvOiB3b25kZXIpDQotbsOlZ29uICAgICAgICAgIHwgc29tZSBldGMNCi1lbGxlciAgICAgICAgICB8IG9yIChlbHNlKQ0KLWFsbHQgICAgICAgICAgIHwgYWxsDQotbXlja2V0ICAgICAgICAgfCBtdWNoDQotc2VkYW4gICAgICAgICAgfCBzaW5jZQ0KLWp1ICAgICAgICAgICAgIHwgd2h5DQotZGVubmEgICAgICAgICAgfCB0aGlzL3RoYXQNCi1zasOkbHYgICAgICAgICAgfCBteXNlbGYsIHlvdXJzZWxmIGV0Yw0KLWRldHRhICAgICAgICAgIHwgdGhpcy90aGF0DQotw6V0ICAgICAgICAgICAgIHwgdG8NCi11dGFuICAgICAgICAgICB8IHdpdGhvdXQNCi12YXJpdCAgICAgICAgICB8IHdhcw0KLWh1ciAgICAgICAgICAgIHwgaG93DQotaW5nZW4gICAgICAgICAgfCBubw0KLW1pdHQgICAgICAgICAgIHwgbXkNCi1uaSAgICAgICAgICAgICB8IHlvdQ0KLWJsaSAgICAgICAgICAgIHwgdG8gYmUsIGJlY29tZQ0KLWJsZXYgICAgICAgICAgIHwgZnJvbSBibGkNCi1vc3MgICAgICAgICAgICB8IHVzDQotZGluICAgICAgICAgICAgfCB0aHkNCi1kZXNzYSAgICAgICAgICB8IHRoZXNlL3Rob3NlDQotbsOlZ3JhICAgICAgICAgIHwgc29tZSBldGMNCi1kZXJhcyAgICAgICAgICB8IHRoZWlyDQotYmxpciAgICAgICAgICAgfCBmcm9tIGJsaQ0KLW1pbmEgICAgICAgICAgIHwgbXkNCi1zYW1tYSAgICAgICAgICB8ICh0aGUpIHNhbWUNCi12aWxrZW4gICAgICAgICB8IHdobywgdGhhdA0KLWVyICAgICAgICAgICAgIHwgeW91LCB5b3VyDQotc8OlZGFuICAgICAgICAgIHwgc3VjaCBhDQotdsOlciAgICAgICAgICAgIHwgb3VyDQotYmxpdml0ICAgICAgICAgfCBmcm9tIGJsaQ0KLWRlc3MgICAgICAgICAgIHwgaXRzDQotaW5vbSAgICAgICAgICAgfCB3aXRoaW4NCi1tZWxsYW4gICAgICAgICB8IGJldHdlZW4NCi1zw6VkYW50ICAgICAgICAgfCBzdWNoIGENCi12YXJmw7ZyICAgICAgICAgfCB3aHkNCi12YXJqZSAgICAgICAgICB8IGVhY2gNCi12aWxrYSAgICAgICAgICB8IHdobywgdGhhdA0KLWRpdHQgICAgICAgICAgIHwgdGh5DQotdmVtICAgICAgICAgICAgfCB3aG8NCi12aWxrZXQgICAgICAgICB8IHdobywgdGhhdA0KLXNpdHRhICAgICAgICAgIHwgaGlzDQotc8OlZGFuYSAgICAgICAgIHwgc3VjaCBhDQotdmFydCAgICAgICAgICAgfCBlYWNoDQotZGluYSAgICAgICAgICAgfCB0aHkNCi12YXJzICAgICAgICAgICB8IHdob3NlDQotdsOlcnQgICAgICAgICAgIHwgb3VyDQotdsOlcmEgICAgICAgICAgIHwgb3VyDQotZXJ0ICAgICAgICAgICAgfCB5b3VyDQotZXJhICAgICAgICAgICAgfCB5b3VyDQotdmlsa2FzICAgICAgICAgfCB3aG9zZQ0KLQ0KKyB8IEZyb20gc3ZuLnRhcnRhcnVzLm9yZy9zbm93YmFsbC90cnVuay93ZWJzaXRlL2FsZ29yaXRobXMvc3dlZGlzaC9zdG9wLnR4dAorIHwgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KKyB8IFNlZSBodHRwOi8vc25vd2JhbGwudGFydGFydXMub3JnL2xpY2Vuc2UucGhwCisgfCBBbHNvIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKKyB8ICAtIEVuY29kaW5nIHdhcyBjb252ZXJ0ZWQgdG8gVVRGLTguCisgfCAgLSBUaGlzIG5vdGljZSB3YXMgYWRkZWQuCisgfAorIHwgTk9URTogVG8gdXNlIHRoaXMgZmlsZSB3aXRoIFN0b3BGaWx0ZXJGYWN0b3J5LCB5b3UgbXVzdCBzcGVjaWZ5IGZvcm1hdD0ic25vd2JhbGwiCisKKyB8IEEgU3dlZGlzaCBzdG9wIHdvcmQgbGlzdC4gQ29tbWVudHMgYmVnaW4gd2l0aCB2ZXJ0aWNhbCBiYXIuIEVhY2ggc3RvcAorIHwgd29yZCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorCisgfCBUaGlzIGlzIGEgcmFua2VkIGxpc3QgKGNvbW1vbmVzdCB0byByYXJlc3QpIG9mIHN0b3B3b3JkcyBkZXJpdmVkIGZyb20KKyB8IGEgbGFyZ2UgdGV4dCBzYW1wbGUuCisKKyB8IFN3ZWRpc2ggc3RvcCB3b3JkcyBvY2Nhc2lvbmFsbHkgZXhoaWJpdCBob21vbnltIGNsYXNoZXMuIEZvciBleGFtcGxlCisgfCAgc8OlID0gc28sIGJ1dCBhbHNvIHNlZWQuIFRoZXNlIGFyZSBpbmRpY2F0ZWQgY2xlYXJseSBiZWxvdy4KKworb2NoICAgICAgICAgICAgfCBhbmQKK2RldCAgICAgICAgICAgIHwgaXQsIHRoaXMvdGhhdAorYXR0ICAgICAgICAgICAgfCB0byAod2l0aCBpbmZpbml0aXZlKQoraSAgICAgICAgICAgICAgfCBpbiwgYXQKK2VuICAgICAgICAgICAgIHwgYQoramFnICAgICAgICAgICAgfCBJCitob24gICAgICAgICAgICB8IHNoZQorc29tICAgICAgICAgICAgfCB3aG8sIHRoYXQKK2hhbiAgICAgICAgICAgIHwgaGUKK3DDpSAgICAgICAgICAgICB8IG9uCitkZW4gICAgICAgICAgICB8IGl0LCB0aGlzL3RoYXQKK21lZCAgICAgICAgICAgIHwgd2l0aAordmFyICAgICAgICAgICAgfCB3aGVyZSwgZWFjaAorc2lnICAgICAgICAgICAgfCBoaW0oc2VsZikgZXRjCitmw7ZyICAgICAgICAgICAgfCBmb3IKK3PDpSAgICAgICAgICAgICB8IHNvIChhbHNvOiBzZWVkKQordGlsbCAgICAgICAgICAgfCB0bworw6RyICAgICAgICAgICAgIHwgaXMKK21lbiAgICAgICAgICAgIHwgYnV0CitldHQgICAgICAgICAgICB8IGEKK29tICAgICAgICAgICAgIHwgaWY7IGFyb3VuZCwgYWJvdXQKK2hhZGUgICAgICAgICAgIHwgaGFkCitkZSAgICAgICAgICAgICB8IHRoZXksIHRoZXNlL3Rob3NlCithdiAgICAgICAgICAgICB8IG9mCitpY2tlICAgICAgICAgICB8IG5vdCwgbm8KK21pZyAgICAgICAgICAgIHwgbWUKK2R1ICAgICAgICAgICAgIHwgeW91CitoZW5uZSAgICAgICAgICB8IGhlcgorZMOlICAgICAgICAgICAgIHwgdGhlbiwgd2hlbgorc2luICAgICAgICAgICAgfCBoaXMKK251ICAgICAgICAgICAgIHwgbm93CitoYXIgICAgICAgICAgICB8IGhhdmUKK2ludGUgICAgICAgICAgIHwgaW50ZSBuw6Vnb24gPSBubyBvbmUKK2hhbnMgICAgICAgICAgIHwgaGlzCitob25vbSAgICAgICAgICB8IGhpbQorc2t1bGxlICAgICAgICAgfCAnc2FrZScKK2hlbm5lcyAgICAgICAgIHwgaGVyCitkw6RyICAgICAgICAgICAgfCB0aGVyZQorbWluICAgICAgICAgICAgfCBteQorbWFuICAgICAgICAgICAgfCBvbmUgKHByb25vdW4pCitlaiAgICAgICAgICAgICB8IG5vcgordmlkICAgICAgICAgICAgfCBhdCwgYnksIG9uIChhbHNvOiB2YXN0KQora3VuZGUgICAgICAgICAgfCBjb3VsZAorbsOlZ290ICAgICAgICAgIHwgc29tZSBldGMKK2Zyw6VuICAgICAgICAgICB8IGZyb20sIG9mZgordXQgICAgICAgICAgICAgfCBvdXQKK27DpHIgICAgICAgICAgICB8IHdoZW4KK2VmdGVyICAgICAgICAgIHwgYWZ0ZXIsIGJlaGluZAordXBwICAgICAgICAgICAgfCB1cAordmkgICAgICAgICAgICAgfCB3ZQorZGVtICAgICAgICAgICAgfCB0aGVtCit2YXJhICAgICAgICAgICB8IGJlCit2YWQgICAgICAgICAgICB8IHdoYXQKK8O2dmVyICAgICAgICAgICB8IG92ZXIKK8OkbiAgICAgICAgICAgICB8IHRoYW4KK2RpZyAgICAgICAgICAgIHwgeW91CitrYW4gICAgICAgICAgICB8IGNhbgorc2luYSAgICAgICAgICAgfCBoaXMKK2jDpHIgICAgICAgICAgICB8IGhlcmUKK2hhICAgICAgICAgICAgIHwgaGF2ZQorbW90ICAgICAgICAgICAgfCB0b3dhcmRzCithbGxhICAgICAgICAgICB8IGFsbAordW5kZXIgICAgICAgICAgfCB1bmRlciAoYWxzbzogd29uZGVyKQorbsOlZ29uICAgICAgICAgIHwgc29tZSBldGMKK2VsbGVyICAgICAgICAgIHwgb3IgKGVsc2UpCithbGx0ICAgICAgICAgICB8IGFsbAorbXlja2V0ICAgICAgICAgfCBtdWNoCitzZWRhbiAgICAgICAgICB8IHNpbmNlCitqdSAgICAgICAgICAgICB8IHdoeQorZGVubmEgICAgICAgICAgfCB0aGlzL3RoYXQKK3Nqw6RsdiAgICAgICAgICB8IG15c2VsZiwgeW91cnNlbGYgZXRjCitkZXR0YSAgICAgICAgICB8IHRoaXMvdGhhdAorw6V0ICAgICAgICAgICAgIHwgdG8KK3V0YW4gICAgICAgICAgIHwgd2l0aG91dAordmFyaXQgICAgICAgICAgfCB3YXMKK2h1ciAgICAgICAgICAgIHwgaG93CitpbmdlbiAgICAgICAgICB8IG5vCittaXR0ICAgICAgICAgICB8IG15CituaSAgICAgICAgICAgICB8IHlvdQorYmxpICAgICAgICAgICAgfCB0byBiZSwgYmVjb21lCitibGV2ICAgICAgICAgICB8IGZyb20gYmxpCitvc3MgICAgICAgICAgICB8IHVzCitkaW4gICAgICAgICAgICB8IHRoeQorZGVzc2EgICAgICAgICAgfCB0aGVzZS90aG9zZQorbsOlZ3JhICAgICAgICAgIHwgc29tZSBldGMKK2RlcmFzICAgICAgICAgIHwgdGhlaXIKK2JsaXIgICAgICAgICAgIHwgZnJvbSBibGkKK21pbmEgICAgICAgICAgIHwgbXkKK3NhbW1hICAgICAgICAgIHwgKHRoZSkgc2FtZQordmlsa2VuICAgICAgICAgfCB3aG8sIHRoYXQKK2VyICAgICAgICAgICAgIHwgeW91LCB5b3VyCitzw6VkYW4gICAgICAgICAgfCBzdWNoIGEKK3bDpXIgICAgICAgICAgICB8IG91cgorYmxpdml0ICAgICAgICAgfCBmcm9tIGJsaQorZGVzcyAgICAgICAgICAgfCBpdHMKK2lub20gICAgICAgICAgIHwgd2l0aGluCittZWxsYW4gICAgICAgICB8IGJldHdlZW4KK3PDpWRhbnQgICAgICAgICB8IHN1Y2ggYQordmFyZsO2ciAgICAgICAgIHwgd2h5Cit2YXJqZSAgICAgICAgICB8IGVhY2gKK3ZpbGthICAgICAgICAgIHwgd2hvLCB0aGF0CitkaXR0ICAgICAgICAgICB8IHRoeQordmVtICAgICAgICAgICAgfCB3aG8KK3ZpbGtldCAgICAgICAgIHwgd2hvLCB0aGF0CitzaXR0YSAgICAgICAgICB8IGhpcworc8OlZGFuYSAgICAgICAgIHwgc3VjaCBhCit2YXJ0ICAgICAgICAgICB8IGVhY2gKK2RpbmEgICAgICAgICAgIHwgdGh5Cit2YXJzICAgICAgICAgICB8IHdob3NlCit2w6VydCAgICAgICAgICAgfCBvdXIKK3bDpXJhICAgICAgICAgICB8IG91cgorZXJ0ICAgICAgICAgICAgfCB5b3VyCitlcmEgICAgICAgICAgICB8IHlvdXIKK3ZpbGthcyAgICAgICAgIHwgd2hvc2UKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc190aC50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3RoLnR4dAppbmRleCAxNDE1ZWRmLi4wN2YwZmFiIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3RoLnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3RoLnR4dApAQCAtMSwxMTkgKzEsMTE5IEBACi0jIFRoYWkgc3RvcHdvcmRzIGZyb206DQotIyAiT3BpbmlvbiBEZXRlY3Rpb24gaW4gVGhhaSBQb2xpdGljYWwgTmV3cyBDb2x1bW5zDQotIyBCYXNlZCBvbiBTdWJqZWN0aXZpdHkgQW5hbHlzaXMiDQotIyBLaGFtcG9sIFN1a2h1bSwgU3Vwb3QgTml0c3V3YXQsIGFuZCBDaG9vY2hhcnQgSGFydWVjaGFpeWFzYWsNCi3guYTguKfguYkNCi3guYTguKHguYgNCi3guYTguJsNCi3guYTguJTguYkNCi3guYPguKvguYkNCi3guYPguJkNCi3guYLguJTguKINCi3guYHguKvguYjguIcNCi3guYHguKXguYnguKcNCi3guYHguKXguLANCi3guYHguKPguIENCi3guYHguJrguJoNCi3guYHguJXguYgNCi3guYDguK3guIcNCi3guYDguKvguYfguJkNCi3guYDguKXguKINCi3guYDguKPguLTguYjguKENCi3guYDguKPguLINCi3guYDguKHguLfguYjguK0NCi3guYDguJ7guLfguYjguK0NCi3guYDguJ7guKPguLLguLANCi3guYDguJvguYfguJnguIHguLLguKMNCi3guYDguJvguYfguJkNCi3guYDguJvguLTguJTguYDguJzguKINCi3guYDguJvguLTguJQNCi3guYDguJnguLfguYjguK3guIfguIjguLLguIENCi3guYDguJTguLXguKLguKfguIHguLHguJkNCi3guYDguJTguLXguKLguKcNCi3guYDguIrguYjguJkNCi3guYDguInguJ7guLLguLANCi3guYDguITguKINCi3guYDguILguYnguLINCi3guYDguILguLINCi3guK3guLXguIENCi3guK3guLLguIgNCi3guK3guLDguYTguKMNCi3guK3guK3guIENCi3guK3guKLguYjguLLguIcNCi3guK3guKLguLnguYgNCi3guK3guKLguLLguIENCi3guKvguLLguIENCi3guKvguKXguLLguKINCi3guKvguKXguLHguIfguIjguLLguIENCi3guKvguKXguLHguIcNCi3guKvguKPguLfguK0NCi3guKvguJnguLbguYjguIcNCi3guKrguYjguKfguJkNCi3guKrguYjguIcNCi3guKrguLjguJQNCi3guKrguY3guLLguKvguKPguLHguJoNCi3guKfguYjguLINCi3guKfguLHguJkNCi3guKXguIcNCi3guKPguYjguKfguKENCi3guKPguLLguKINCi3guKPguLHguJoNCi3guKPguLDguKvguKfguYjguLLguIcNCi3guKPguKfguKENCi3guKLguLHguIcNCi3guKHguLUNCi3guKHguLLguIENCi3guKHguLINCi3guJ7guKPguYnguK3guKENCi3guJ7guJoNCi3guJzguYjguLLguJkNCi3guJzguKUNCi3guJrguLLguIcNCi3guJnguYjguLINCi3guJnguLXguYkNCi3guJnguY3guLINCi3guJnguLHguYnguJkNCi3guJnguLHguIENCi3guJnguK3guIHguIjguLLguIENCi3guJfguLjguIENCi3guJfguLXguYjguKrguLjguJQNCi3guJfguLXguYgNCi3guJfguY3guLLguYPguKvguYkNCi3guJfguY3guLINCi3guJfguLLguIcNCi3guJfguLHguYnguIfguJnguLXguYkNCi3guJfguLHguYnguIcNCi3guJbguYnguLINCi3guJbguLnguIENCi3guJbguLbguIcNCi3guJXguYnguK3guIcNCi3guJXguYjguLLguIfguYYNCi3guJXguYjguLLguIcNCi3guJXguYjguK0NCi3guJXguLLguKENCi3guJXguLHguYnguIfguYHguJXguYgNCi3guJXguLHguYnguIcNCi3guJTguYnguLLguJkNCi3guJTguYnguKfguKINCi3guJTguLHguIcNCi3guIvguLbguYjguIcNCi3guIrguYjguKfguIcNCi3guIjguLbguIcNCi3guIjguLLguIENCi3guIjguLHguJQNCi3guIjguLANCi3guITguLfguK0NCi3guITguKfguLLguKENCi3guITguKPguLHguYnguIcNCi3guITguIcNCi3guILguLbguYnguJkNCi3guILguK3guIcNCi3guILguK0NCi3guILguJPguLANCi3guIHguYjguK3guJkNCi3guIHguYcNCi3guIHguLLguKMNCi3guIHguLHguJoNCi3guIHguLHguJkNCi3guIHguKfguYjguLINCi3guIHguKXguYjguLLguKcNCisjIFRoYWkgc3RvcHdvcmRzIGZyb206CisjICJPcGluaW9uIERldGVjdGlvbiBpbiBUaGFpIFBvbGl0aWNhbCBOZXdzIENvbHVtbnMKKyMgQmFzZWQgb24gU3ViamVjdGl2aXR5IEFuYWx5c2lzIgorIyBLaGFtcG9sIFN1a2h1bSwgU3Vwb3QgTml0c3V3YXQsIGFuZCBDaG9vY2hhcnQgSGFydWVjaGFpeWFzYWsKK+C5hOC4p+C5iQor4LmE4Lih4LmICivguYTguJsKK+C5hOC4lOC5iQor4LmD4Lir4LmJCivguYPguJkKK+C5guC4lOC4ogor4LmB4Lir4LmI4LiHCivguYHguKXguYnguKcKK+C5geC4peC4sAor4LmB4Lij4LiBCivguYHguJrguJoKK+C5geC4leC5iAor4LmA4Lit4LiHCivguYDguKvguYfguJkKK+C5gOC4peC4ogor4LmA4Lij4Li04LmI4LihCivguYDguKPguLIKK+C5gOC4oeC4t+C5iOC4rQor4LmA4Lie4Li34LmI4LitCivguYDguJ7guKPguLLguLAKK+C5gOC4m+C5h+C4meC4geC4suC4owor4LmA4Lib4LmH4LiZCivguYDguJvguLTguJTguYDguJzguKIKK+C5gOC4m+C4tOC4lAor4LmA4LiZ4Li34LmI4Lit4LiH4LiI4Liy4LiBCivguYDguJTguLXguKLguKfguIHguLHguJkKK+C5gOC4lOC4teC4ouC4pwor4LmA4LiK4LmI4LiZCivguYDguInguJ7guLLguLAKK+C5gOC4hOC4ogor4LmA4LiC4LmJ4LiyCivguYDguILguLIKK+C4reC4teC4gQor4Lit4Liy4LiICivguK3guLDguYTguKMKK+C4reC4reC4gQor4Lit4Lii4LmI4Liy4LiHCivguK3guKLguLnguYgKK+C4reC4ouC4suC4gQor4Lir4Liy4LiBCivguKvguKXguLLguKIKK+C4q+C4peC4seC4h+C4iOC4suC4gQor4Lir4Lil4Lix4LiHCivguKvguKPguLfguK0KK+C4q+C4meC4tuC5iOC4hwor4Liq4LmI4Lin4LiZCivguKrguYjguIcKK+C4quC4uOC4lAor4Liq4LmN4Liy4Lir4Lij4Lix4LiaCivguKfguYjguLIKK+C4p+C4seC4mQor4Lil4LiHCivguKPguYjguKfguKEKK+C4o+C4suC4ogor4Lij4Lix4LiaCivguKPguLDguKvguKfguYjguLLguIcKK+C4o+C4p+C4oQor4Lii4Lix4LiHCivguKHguLUKK+C4oeC4suC4gQor4Lih4LiyCivguJ7guKPguYnguK3guKEKK+C4nuC4mgor4Lic4LmI4Liy4LiZCivguJzguKUKK+C4muC4suC4hwor4LiZ4LmI4LiyCivguJnguLXguYkKK+C4meC5jeC4sgor4LiZ4Lix4LmJ4LiZCivguJnguLHguIEKK+C4meC4reC4geC4iOC4suC4gQor4LiX4Li44LiBCivguJfguLXguYjguKrguLjguJQKK+C4l+C4teC5iAor4LiX4LmN4Liy4LmD4Lir4LmJCivguJfguY3guLIKK+C4l+C4suC4hwor4LiX4Lix4LmJ4LiH4LiZ4Li14LmJCivguJfguLHguYnguIcKK+C4luC5ieC4sgor4LiW4Li54LiBCivguJbguLbguIcKK+C4leC5ieC4reC4hwor4LiV4LmI4Liy4LiH4LmGCivguJXguYjguLLguIcKK+C4leC5iOC4rQor4LiV4Liy4LihCivguJXguLHguYnguIfguYHguJXguYgKK+C4leC4seC5ieC4hwor4LiU4LmJ4Liy4LiZCivguJTguYnguKfguKIKK+C4lOC4seC4hwor4LiL4Li24LmI4LiHCivguIrguYjguKfguIcKK+C4iOC4tuC4hwor4LiI4Liy4LiBCivguIjguLHguJQKK+C4iOC4sAor4LiE4Li34LitCivguITguKfguLLguKEKK+C4hOC4o+C4seC5ieC4hwor4LiE4LiHCivguILguLbguYnguJkKK+C4guC4reC4hwor4LiC4LitCivguILguJPguLAKK+C4geC5iOC4reC4mQor4LiB4LmHCivguIHguLLguKMKK+C4geC4seC4mgor4LiB4Lix4LiZCivguIHguKfguYjguLIKK+C4geC4peC5iOC4suC4pwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3N0b3B3b3Jkc190ci50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3RyLnR4dAppbmRleCBmZTQwODNiLi44NGQ5NDA4IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3RyLnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvc3RvcHdvcmRzX3RyLnR4dApAQCAtMSwyMTIgKzEsMjEyIEBACi0jIFR1cmtpc2ggc3RvcHdvcmRzIGZyb20gTFVDRU5FLTU1OQ0KLSMgbWVyZ2VkIHdpdGggdGhlIGxpc3QgZnJvbSAiSW5mb3JtYXRpb24gUmV0cmlldmFsIG9uIFR1cmtpc2ggVGV4dHMiDQotIyAgIChodHRwOi8vd3d3LnVzZXJzLm11b2hpby5lZHUvY2FuZi9wYXBlcnMvSkFTSVNUMjAwOG9mZlByaW50LnBkZikNCi1hY2FiYQ0KLWFsdG3EscWfDQotYWx0xLENCi1hbWENCi1hbmNhaw0KLWFyYWRhDQotYXNsxLFuZGENCi1heXLEsWNhDQotYmFuYQ0KLWJhesSxDQotYmVsa2kNCi1iZW4NCi1iZW5kZW4NCi1iZW5pDQotYmVuaW0NCi1iZXJpDQotYmXFnw0KLWJpbGUNCi1iaW4NCi1iaXINCi1iaXLDp29rDQotYmlyaQ0KLWJpcmthw6cNCi1iaXJrZXoNCi1iaXLFn2V5DQotYmlyxZ9leWkNCi1iaXoNCi1iaXplDQotYml6ZGVuDQotYml6aQ0KLWJpemltDQotYsO2eWxlDQotYsO2eWxlY2UNCi1idQ0KLWJ1bmENCi1idW5kYQ0KLWJ1bmRhbg0KLWJ1bmxhcg0KLWJ1bmxhcsSxDQotYnVubGFyxLFuDQotYnVudQ0KLWJ1bnVuDQotYnVyYWRhDQotw6dvaw0KLcOnw7xua8O8DQotZGENCi1kYWhhDQotZGFoaQ0KLWRlDQotZGVmYQ0KLWRlxJ9pbA0KLWRpxJ9lcg0KLWRpeWUNCi1kb2tzYW4NCi1kb2t1eg0KLWRvbGF5xLENCi1kb2xhecSxc8SxeWxhDQotZMO2cnQNCi1lZGVjZWsNCi1lZGVuDQotZWRlcmVrDQotZWRpbGVjZWsNCi1lZGlsaXlvcg0KLWVkaWxtZXNpDQotZWRpeW9yDQotZcSfZXINCi1lbGxpDQotZW4NCi1ldG1lc2kNCi1ldHRpDQotZXR0acSfaQ0KLWV0dGnEn2luaQ0KLWdpYmkNCi1nw7ZyZQ0KLWhhbGVuDQotaGFuZ2kNCi1oYXR0YQ0KLWhlbQ0KLWhlbsO8eg0KLWhlcA0KLWhlcHNpDQotaGVyDQotaGVyaGFuZ2kNCi1oZXJrZXNpbg0KLWhpw6cNCi1oacOnYmlyDQotacOnaW4NCi1pa2kNCi1pbGUNCi1pbGdpbGkNCi1pc2UNCi1pxZ90ZQ0KLWl0aWJhcmVuDQotaXRpYmFyaXlsZQ0KLWthZGFyDQota2FyxZ/EsW4NCi1rYXRyaWx5b24NCi1rZW5kaQ0KLWtlbmRpbGVyaW5lDQota2VuZGluaQ0KLWtlbmRpc2kNCi1rZW5kaXNpbmUNCi1rZW5kaXNpbmkNCi1rZXoNCi1raQ0KLWtpbQ0KLWtpbWRlbg0KLWtpbWUNCi1raW1pDQota2ltc2UNCi1rxLFyaw0KLW1pbHlhcg0KLW1pbHlvbg0KLW11DQotbcO8DQotbcSxDQotbmFzxLFsDQotbmUNCi1uZWRlbg0KLW5lZGVubGUNCi1uZXJkZQ0KLW5lcmVkZQ0KLW5lcmV5ZQ0KLW5peWUNCi1uacOnaW4NCi1vDQotb2xhbg0KLW9sYXJhaw0KLW9sZHUNCi1vbGR1xJ91DQotb2xkdcSfdW51DQotb2xkdWtsYXLEsW7EsQ0KLW9sbWFkxLENCi1vbG1hZMSxxJ/EsQ0KLW9sbWFrDQotb2xtYXPEsQ0KLW9sbWF5YW4NCi1vbG1heg0KLW9sc2ENCi1vbHN1bg0KLW9sdXANCi1vbHVyDQotb2x1cnNhDQotb2x1eW9yDQotb24NCi1vbmENCi1vbmRhbg0KLW9ubGFyDQotb25sYXJkYW4NCi1vbmxhcsSxDQotb25sYXLEsW4NCi1vbnUNCi1vbnVuDQotb3R1eg0KLW95c2ENCi3DtnlsZQ0KLXBlaw0KLXJhxJ9tZW4NCi1zYWRlY2UNCi1zYW5raQ0KLXNla2l6DQotc2Vrc2VuDQotc2VuDQotc2VuZGVuDQotc2VuaQ0KLXNlbmluDQotc2l6DQotc2l6ZGVuDQotc2l6aQ0KLXNpemluDQotxZ9leQ0KLcWfZXlkZW4NCi3Fn2V5aQ0KLcWfZXlsZXINCi3Fn8O2eWxlDQotxZ91DQotxZ91bmENCi3Fn3VuZGENCi3Fn3VuZGFuDQotxZ91bmxhcsSxDQotxZ91bnUNCi10YXJhZsSxbmRhbg0KLXRyaWx5b24NCi10w7xtDQotw7zDpw0KLcO8emVyZQ0KLXZhcg0KLXZhcmTEsQ0KLXZlDQotdmV5YQ0KLXlhDQoteWFuaQ0KLXlhcGFjYWsNCi15YXDEsWxhbg0KLXlhcMSxbG1hc8SxDQoteWFwxLF5b3INCi15YXBtYWsNCi15YXB0xLENCi15YXB0xLHEn8SxDQoteWFwdMSxxJ/EsW7EsQ0KLXlhcHTEsWtsYXLEsQ0KLXllZGkNCi15ZXJpbmUNCi15ZXRtacWfDQoteWluZQ0KLXlpcm1pDQoteW9rc2ENCi15w7x6DQotemF0ZW4NCisjIFR1cmtpc2ggc3RvcHdvcmRzIGZyb20gTFVDRU5FLTU1OQorIyBtZXJnZWQgd2l0aCB0aGUgbGlzdCBmcm9tICJJbmZvcm1hdGlvbiBSZXRyaWV2YWwgb24gVHVya2lzaCBUZXh0cyIKKyMgICAoaHR0cDovL3d3dy51c2Vycy5tdW9oaW8uZWR1L2NhbmYvcGFwZXJzL0pBU0lTVDIwMDhvZmZQcmludC5wZGYpCithY2FiYQorYWx0bcSxxZ8KK2FsdMSxCithbWEKK2FuY2FrCithcmFkYQorYXNsxLFuZGEKK2F5csSxY2EKK2JhbmEKK2JhesSxCitiZWxraQorYmVuCitiZW5kZW4KK2JlbmkKK2JlbmltCitiZXJpCitiZcWfCitiaWxlCitiaW4KK2JpcgorYmlyw6dvaworYmlyaQorYmlya2HDpworYmlya2V6CitiaXLFn2V5CitiaXLFn2V5aQorYml6CitiaXplCitiaXpkZW4KK2JpemkKK2JpemltCitiw7Z5bGUKK2LDtnlsZWNlCitidQorYnVuYQorYnVuZGEKK2J1bmRhbgorYnVubGFyCitidW5sYXLEsQorYnVubGFyxLFuCitidW51CitidW51bgorYnVyYWRhCivDp29rCivDp8O8bmvDvAorZGEKK2RhaGEKK2RhaGkKK2RlCitkZWZhCitkZcSfaWwKK2RpxJ9lcgorZGl5ZQorZG9rc2FuCitkb2t1egorZG9sYXnEsQorZG9sYXnEsXPEsXlsYQorZMO2cnQKK2VkZWNlaworZWRlbgorZWRlcmVrCitlZGlsZWNlaworZWRpbGl5b3IKK2VkaWxtZXNpCitlZGl5b3IKK2XEn2VyCitlbGxpCitlbgorZXRtZXNpCitldHRpCitldHRpxJ9pCitldHRpxJ9pbmkKK2dpYmkKK2fDtnJlCitoYWxlbgoraGFuZ2kKK2hhdHRhCitoZW0KK2hlbsO8egoraGVwCitoZXBzaQoraGVyCitoZXJoYW5naQoraGVya2VzaW4KK2hpw6cKK2hpw6diaXIKK2nDp2luCitpa2kKK2lsZQoraWxnaWxpCitpc2UKK2nFn3RlCitpdGliYXJlbgoraXRpYmFyaXlsZQora2FkYXIKK2thcsWfxLFuCitrYXRyaWx5b24KK2tlbmRpCitrZW5kaWxlcmluZQora2VuZGluaQora2VuZGlzaQora2VuZGlzaW5lCitrZW5kaXNpbmkKK2tlegora2kKK2tpbQora2ltZGVuCitraW1lCitraW1pCitraW1zZQora8SxcmsKK21pbHlhcgorbWlseW9uCittdQorbcO8CittxLEKK25hc8SxbAorbmUKK25lZGVuCituZWRlbmxlCituZXJkZQorbmVyZWRlCituZXJleWUKK25peWUKK25pw6dpbgorbworb2xhbgorb2xhcmFrCitvbGR1CitvbGR1xJ91CitvbGR1xJ91bnUKK29sZHVrbGFyxLFuxLEKK29sbWFkxLEKK29sbWFkxLHEn8SxCitvbG1haworb2xtYXPEsQorb2xtYXlhbgorb2xtYXoKK29sc2EKK29sc3VuCitvbHVwCitvbHVyCitvbHVyc2EKK29sdXlvcgorb24KK29uYQorb25kYW4KK29ubGFyCitvbmxhcmRhbgorb25sYXLEsQorb25sYXLEsW4KK29udQorb251bgorb3R1egorb3lzYQorw7Z5bGUKK3BlaworcmHEn21lbgorc2FkZWNlCitzYW5raQorc2VraXoKK3Nla3Nlbgorc2VuCitzZW5kZW4KK3NlbmkKK3NlbmluCitzaXoKK3NpemRlbgorc2l6aQorc2l6aW4KK8WfZXkKK8WfZXlkZW4KK8WfZXlpCivFn2V5bGVyCivFn8O2eWxlCivFn3UKK8WfdW5hCivFn3VuZGEKK8WfdW5kYW4KK8WfdW5sYXLEsQorxZ91bnUKK3RhcmFmxLFuZGFuCit0cmlseW9uCit0w7xtCivDvMOnCivDvHplcmUKK3ZhcgordmFyZMSxCit2ZQordmV5YQoreWEKK3lhbmkKK3lhcGFjYWsKK3lhcMSxbGFuCit5YXDEsWxtYXPEsQoreWFwxLF5b3IKK3lhcG1haworeWFwdMSxCit5YXB0xLHEn8SxCit5YXB0xLHEn8SxbsSxCit5YXB0xLFrbGFyxLEKK3llZGkKK3llcmluZQoreWV0bWnFnworeWluZQoreWlybWkKK3lva3NhCit5w7x6Cit6YXRlbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3VzZXJkaWN0X2phLnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbGFuZy91c2VyZGljdF9qYS50eHQKaW5kZXggYzc5ZGU4Mi4uNmYwMzY4ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9sYW5nL3VzZXJkaWN0X2phLnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL2xhbmcvdXNlcmRpY3RfamEudHh0CkBAIC0xLDI5ICsxLDI5IEBACi0jDQotIyBUaGlzIGlzIGEgc2FtcGxlIHVzZXIgZGljdGlvbmFyeSBmb3IgS3Vyb21vamkgKEphcGFuZXNlVG9rZW5pemVyKQ0KLSMNCi0jIEFkZCBlbnRyaWVzIHRvIHRoaXMgZmlsZSBpbiBvcmRlciB0byBvdmVycmlkZSB0aGUgc3RhdGlzdGljYWwgbW9kZWwgaW4gdGVybXMNCi0jIG9mIHNlZ21lbnRhdGlvbiwgcmVhZGluZ3MgYW5kIHBhcnQtb2Ytc3BlZWNoIHRhZ3MuICBOb3RpY2UgdGhhdCBlbnRyaWVzIGRvDQotIyBub3QgaGF2ZSB3ZWlnaHRzIHNpbmNlIHRoZXkgYXJlIGFsd2F5cyB1c2VkIHdoZW4gZm91bmQuICBUaGlzIGlzIGJ5LWRlc2lnbg0KLSMgaW4gb3JkZXIgdG8gbWF4aW1pemUgZWFzZS1vZi11c2UuDQotIw0KLSMgRW50cmllcyBhcmUgZGVmaW5lZCB1c2luZyB0aGUgZm9sbG93aW5nIENTViBmb3JtYXQ6DQotIyAgPHRleHQ+LDx0b2tlbiAxPiAuLi4gPHRva2VuIG4+LDxyZWFkaW5nIDE+IC4uLiA8cmVhZGluZyBuPiw8cGFydC1vZi1zcGVlY2ggdGFnPg0KLSMNCi0jIE5vdGljZSB0aGF0IGEgc2luZ2xlIGhhbGYtd2lkdGggc3BhY2Ugc2VwYXJhdGVzIHRva2VucyBhbmQgcmVhZGluZ3MsIGFuZA0KLSMgdGhhdCB0aGUgbnVtYmVyIHRva2VucyBhbmQgcmVhZGluZ3MgbXVzdCBtYXRjaCBleGFjdGx5Lg0KLSMNCi0jIEFsc28gbm90aWNlIHRoYXQgbXVsdGlwbGUgZW50cmllcyB3aXRoIHRoZSBzYW1lIDx0ZXh0PiBpcyB1bmRlZmluZWQuDQotIw0KLSMgV2hpdGVzcGFjZSBvbmx5IGxpbmVzIGFyZSBpZ25vcmVkLiAgQ29tbWVudHMgYXJlIG5vdCBhbGxvd2VkIG9uIGVudHJ5IGxpbmVzLg0KLSMNCi0NCi0jIEN1c3RvbSBzZWdtZW50YXRpb24gZm9yIGthbmppIGNvbXBvdW5kcw0KLeaXpeacrOe1jOa4iOaWsOiBnizml6XmnKwg57WM5riIIOaWsOiBnizjg4vjg5vjg7Mg44Kx44Kk44K244KkIOOCt+ODs+ODluODsyzjgqvjgrnjgr/jg6DlkI3oqZ4NCi3plqLopb/lm73pmpvnqbrmuK8s6Zai6KW/IOWbvemamyDnqbrmuK8s44Kr44Oz44K144KkIOOCs+OCr+OCteOCpCDjgq/jgqbjgrPjgqYs44Kr44K544K/44Og5ZCN6KmeDQotDQotIyBDdXN0b20gc2VnbWVudGF0aW9uIGZvciBjb21wb3VuZCBrYXRha2FuYQ0KLeODiOODvOODiOODkOODg+OCsCzjg4jjg7zjg4gg44OQ44OD44KwLOODiOODvOODiCDjg5Djg4PjgrAs44GL44Ga44Kr44OK5ZCN6KmeDQot44K344On44Or44OA44O844OQ44OD44KwLOOCt+ODp+ODq+ODgOODvCDjg5Djg4PjgrAs44K344On44Or44OA44O8IOODkOODg+OCsCzjgYvjgZrjgqvjg4rlkI3oqZ4NCi0NCi0jIEN1c3RvbSByZWFkaW5nIGZvciBmb3JtZXIgc3VtbyB3cmVzdGxlcg0KLeacnemdkum+jSzmnJ3pnZLpvo0s44Ki44K144K344On44Km44Oq44Ol44KmLOOCq+OCueOCv+ODoOS6uuWQjQ0KKyMKKyMgVGhpcyBpcyBhIHNhbXBsZSB1c2VyIGRpY3Rpb25hcnkgZm9yIEt1cm9tb2ppIChKYXBhbmVzZVRva2VuaXplcikKKyMKKyMgQWRkIGVudHJpZXMgdG8gdGhpcyBmaWxlIGluIG9yZGVyIHRvIG92ZXJyaWRlIHRoZSBzdGF0aXN0aWNhbCBtb2RlbCBpbiB0ZXJtcworIyBvZiBzZWdtZW50YXRpb24sIHJlYWRpbmdzIGFuZCBwYXJ0LW9mLXNwZWVjaCB0YWdzLiAgTm90aWNlIHRoYXQgZW50cmllcyBkbworIyBub3QgaGF2ZSB3ZWlnaHRzIHNpbmNlIHRoZXkgYXJlIGFsd2F5cyB1c2VkIHdoZW4gZm91bmQuICBUaGlzIGlzIGJ5LWRlc2lnbgorIyBpbiBvcmRlciB0byBtYXhpbWl6ZSBlYXNlLW9mLXVzZS4KKyMKKyMgRW50cmllcyBhcmUgZGVmaW5lZCB1c2luZyB0aGUgZm9sbG93aW5nIENTViBmb3JtYXQ6CisjICA8dGV4dD4sPHRva2VuIDE+IC4uLiA8dG9rZW4gbj4sPHJlYWRpbmcgMT4gLi4uIDxyZWFkaW5nIG4+LDxwYXJ0LW9mLXNwZWVjaCB0YWc+CisjCisjIE5vdGljZSB0aGF0IGEgc2luZ2xlIGhhbGYtd2lkdGggc3BhY2Ugc2VwYXJhdGVzIHRva2VucyBhbmQgcmVhZGluZ3MsIGFuZAorIyB0aGF0IHRoZSBudW1iZXIgdG9rZW5zIGFuZCByZWFkaW5ncyBtdXN0IG1hdGNoIGV4YWN0bHkuCisjCisjIEFsc28gbm90aWNlIHRoYXQgbXVsdGlwbGUgZW50cmllcyB3aXRoIHRoZSBzYW1lIDx0ZXh0PiBpcyB1bmRlZmluZWQuCisjCisjIFdoaXRlc3BhY2Ugb25seSBsaW5lcyBhcmUgaWdub3JlZC4gIENvbW1lbnRzIGFyZSBub3QgYWxsb3dlZCBvbiBlbnRyeSBsaW5lcy4KKyMKKworIyBDdXN0b20gc2VnbWVudGF0aW9uIGZvciBrYW5qaSBjb21wb3VuZHMKK+aXpeacrOe1jOa4iOaWsOiBnizml6XmnKwg57WM5riIIOaWsOiBnizjg4vjg5vjg7Mg44Kx44Kk44K244KkIOOCt+ODs+ODluODsyzjgqvjgrnjgr/jg6DlkI3oqZ4KK+mWouilv+Wbvemam+epuua4ryzplqLopb8g5Zu96ZqbIOepuua4ryzjgqvjg7PjgrXjgqQg44Kz44Kv44K144KkIOOCr+OCpuOCs+OCpizjgqvjgrnjgr/jg6DlkI3oqZ4KKworIyBDdXN0b20gc2VnbWVudGF0aW9uIGZvciBjb21wb3VuZCBrYXRha2FuYQor44OI44O844OI44OQ44OD44KwLOODiOODvOODiCDjg5Djg4PjgrAs44OI44O844OIIOODkOODg+OCsCzjgYvjgZrjgqvjg4rlkI3oqZ4KK+OCt+ODp+ODq+ODgOODvOODkOODg+OCsCzjgrfjg6fjg6vjg4Djg7wg44OQ44OD44KwLOOCt+ODp+ODq+ODgOODvCDjg5Djg4PjgrAs44GL44Ga44Kr44OK5ZCN6KmeCisKKyMgQ3VzdG9tIHJlYWRpbmcgZm9yIGZvcm1lciBzdW1vIHdyZXN0bGVyCivmnJ3pnZLpvo0s5pyd6Z2S6b6NLOOCouOCteOCt+ODp+OCpuODquODpeOCpizjgqvjgrnjgr/jg6DkurrlkI0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbWFwcGluZy1Gb2xkVG9BU0NJSS50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL21hcHBpbmctRm9sZFRvQVNDSUkudHh0CmluZGV4IDAyMGY4MzMuLjlhODRiNmUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvbWFwcGluZy1Gb2xkVG9BU0NJSS50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9tYXBwaW5nLUZvbGRUb0FTQ0lJLnR4dApAQCAtMSwzODEzICsxLDM4MTMgQEAKLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0NCi0jIFRoaXMgbWFwIGNvbnZlcnRzIGFscGhhYmV0aWMsIG51bWVyaWMsIGFuZCBzeW1ib2xpYyBVbmljb2RlIGNoYXJhY3RlcnMNCi0jIHdoaWNoIGFyZSBub3QgaW4gdGhlIGZpcnN0IDEyNyBBU0NJSSBjaGFyYWN0ZXJzICh0aGUgIkJhc2ljIExhdGluIiBVbmljb2RlDQotIyBibG9jaykgaW50byB0aGVpciBBU0NJSSBlcXVpdmFsZW50cywgaWYgb25lIGV4aXN0cy4NCi0jDQotIyBDaGFyYWN0ZXJzIGZyb20gdGhlIGZvbGxvd2luZyBVbmljb2RlIGJsb2NrcyBhcmUgY29udmVydGVkOyBob3dldmVyLCBvbmx5DQotIyB0aG9zZSBjaGFyYWN0ZXJzIHdpdGggcmVhc29uYWJsZSBBU0NJSSBhbHRlcm5hdGl2ZXMgYXJlIGNvbnZlcnRlZDoNCi0jDQotIyAtIEMxIENvbnRyb2xzIGFuZCBMYXRpbi0xIFN1cHBsZW1lbnQ6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMDA4MC5wZGYNCi0jIC0gTGF0aW4gRXh0ZW5kZWQtQTogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UwMTAwLnBkZg0KLSMgLSBMYXRpbiBFeHRlbmRlZC1COiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTAxODAucGRmDQotIyAtIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWw6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMUUwMC5wZGYNCi0jIC0gTGF0aW4gRXh0ZW5kZWQtQzogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UyQzYwLnBkZg0KLSMgLSBMYXRpbiBFeHRlbmRlZC1EOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVUE3MjAucGRmDQotIyAtIElQQSBFeHRlbnNpb25zOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTAyNTAucGRmDQotIyAtIFBob25ldGljIEV4dGVuc2lvbnM6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMUQwMC5wZGYNCi0jIC0gUGhvbmV0aWMgRXh0ZW5zaW9ucyBTdXBwbGVtZW50OiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTFEODAucGRmDQotIyAtIEdlbmVyYWwgUHVuY3R1YXRpb246IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMjAwMC5wZGYNCi0jIC0gU3VwZXJzY3JpcHRzIGFuZCBTdWJzY3JpcHRzOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTIwNzAucGRmDQotIyAtIEVuY2xvc2VkIEFscGhhbnVtZXJpY3M6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMjQ2MC5wZGYNCi0jIC0gRGluZ2JhdHM6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMjcwMC5wZGYNCi0jIC0gU3VwcGxlbWVudGFsIFB1bmN0dWF0aW9uOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTJFMDAucGRmDQotIyAtIEFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVUZCMDAucGRmDQotIyAtIEhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVUZGMDAucGRmDQotIyAgDQotIyBTZWU6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fY2hhcmFjdGVyc19pbl9Vbmljb2RlDQotIw0KLSMgVGhlIHNldCBvZiBjaGFyYWN0ZXIgY29udmVyc2lvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgbWFwIGlzIGEgc3VwZXJzZXQgb2YNCi0jIHRob3NlIHN1cHBvcnRlZCBieSB0aGUgbWFwIHJlcHJlc2VudGVkIGJ5IG1hcHBpbmctSVNPTGF0aW4xQWNjZW50LnR4dC4NCi0jDQotIyBTZWUgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUgZm9yIHRoZSBQZXJsIHNjcmlwdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb250ZW50cw0KLSMgb2YgdGhpcyBmaWxlICh3aXRob3V0IHRoaXMgaGVhZGVyKSBmcm9tIEFTQ0lJRm9sZGluZ0ZpbHRlci5qYXZhLg0KLQ0KLQ0KLSMgU3ludGF4Og0KLSMgICAic291cmNlIiA9PiAidGFyZ2V0Ig0KLSMgICAgICJzb3VyY2UiLmxlbmd0aCgpID4gMCAoc291cmNlIGNhbm5vdCBiZSBlbXB0eS4pDQotIyAgICAgInRhcmdldCIubGVuZ3RoKCkgPj0gMCAodGFyZ2V0IGNhbiBiZSBlbXB0eS4pDQotDQotDQotIyDDgCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRV0NCi0iXHUwMEMwIiA9PiAiQSINCi0NCi0jIMOBICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFXQ0KLSJcdTAwQzEiID0+ICJBIg0KLQ0KLSMgw4IgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWF0NCi0iXHUwMEMyIiA9PiAiQSINCi0NCi0jIMODICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFXQ0KLSJcdTAwQzMiID0+ICJBIg0KLQ0KLSMgw4QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTXQ0KLSJcdTAwQzQiID0+ICJBIg0KLQ0KLSMgw4UgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRV0NCi0iXHUwMEM1IiA9PiAiQSINCi0NCi0jIMSAICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE1BQ1JPTl0NCi0iXHUwMTAwIiA9PiAiQSINCi0NCi0jIMSCICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFXQ0KLSJcdTAxMDIiID0+ICJBIg0KLQ0KLSMgxIQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLXQ0KLSJcdTAxMDQiID0+ICJBIg0KLQ0KLSMgxo8gIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2Nod2EgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBTQ0hXQV0NCi0iXHUwMThGIiA9PiAiQSINCi0NCi0jIMeNICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENBUk9OXQ0KLSJcdTAxQ0QiID0+ICJBIg0KLQ0KLSMgx54gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTIEFORCBNQUNST05dDQotIlx1MDFERSIgPT4gIkEiDQotDQotIyDHoCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBET1QgQUJPVkUgQU5EIE1BQ1JPTl0NCi0iXHUwMUUwIiA9PiAiQSINCi0NCi0jIMe6ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgQU5EIEFDVVRFXQ0KLSJcdTAxRkEiID0+ICJBIg0KLQ0KLSMgyIAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRE9VQkxFIEdSQVZFXQ0KLSJcdTAyMDAiID0+ICJBIg0KLQ0KLSMgyIIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggSU5WRVJURUQgQlJFVkVdDQotIlx1MDIwMiIgPT4gIkEiDQotDQotIyDIpiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBET1QgQUJPVkVdDQotIlx1MDIyNiIgPT4gIkEiDQotDQotIyDIuiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBTVFJPS0VdDQotIlx1MDIzQSIgPT4gIkEiDQotDQotIyDhtIAgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBBXQ0KLSJcdTFEMDAiID0+ICJBIg0KLQ0KLSMg4biAICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQkVMT1ddDQotIlx1MUUwMCIgPT4gIkEiDQotDQotIyDhuqAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFQTAiID0+ICJBIg0KLQ0KLSMg4bqiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEhPT0sgQUJPVkVdDQotIlx1MUVBMiIgPT4gIkEiDQotDQotIyDhuqQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEVdDQotIlx1MUVBNCIgPT4gIkEiDQotDQotIyDhuqYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkVdDQotIlx1MUVBNiIgPT4gIkEiDQotDQotIyDhuqggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRV0NCi0iXHUxRUE4IiA9PiAiQSINCi0NCi0jIOG6qiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERV0NCi0iXHUxRUFBIiA9PiAiQSINCi0NCi0jIOG6rCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1ddDQotIlx1MUVBQyIgPT4gIkEiDQotDQotIyDhuq4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEFDVVRFXQ0KLSJcdTFFQUUiID0+ICJBIg0KLQ0KLSMg4bqwICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBHUkFWRV0NCi0iXHUxRUIwIiA9PiAiQSINCi0NCi0jIOG6siAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgSE9PSyBBQk9WRV0NCi0iXHUxRUIyIiA9PiAiQSINCi0NCi0jIOG6tCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgVElMREVdDQotIlx1MUVCNCIgPT4gIkEiDQotDQotIyDhurYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIERPVCBCRUxPV10NCi0iXHUxRUI2IiA9PiAiQSINCi0NCi0jIOKStiAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQV0NCi0iXHUyNEI2IiA9PiAiQSINCi0NCi0jIO+8oSAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBXQ0KLSJcdUZGMjEiID0+ICJBIg0KLQ0KLSMgw6AgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFXQ0KLSJcdTAwRTAiID0+ICJhIg0KLQ0KLSMgw6EgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFXQ0KLSJcdTAwRTEiID0+ICJhIg0KLQ0KLSMgw6IgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVhdDQotIlx1MDBFMiIgPT4gImEiDQotDQotIyDDoyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREVdDQotIlx1MDBFMyIgPT4gImEiDQotDQotIyDDpCAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTXQ0KLSJcdTAwRTQiID0+ICJhIg0KLQ0KLSMgw6UgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkVdDQotIlx1MDBFNSIgPT4gImEiDQotDQotIyDEgSAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggTUFDUk9OXQ0KLSJcdTAxMDEiID0+ICJhIg0KLQ0KLSMgxIMgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFXQ0KLSJcdTAxMDMiID0+ICJhIg0KLQ0KLSMgxIUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FS10NCi0iXHUwMTA1IiA9PiAiYSINCi0NCi0jIMeOICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDQVJPTl0NCi0iXHUwMUNFIiA9PiAiYSINCi0NCi0jIMefICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMgQU5EIE1BQ1JPTl0NCi0iXHUwMURGIiA9PiAiYSINCi0NCi0jIMehICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBET1QgQUJPVkUgQU5EIE1BQ1JPTl0NCi0iXHUwMUUxIiA9PiAiYSINCi0NCi0jIMe7ICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFIEFORCBBQ1VURV0NCi0iXHUwMUZCIiA9PiAiYSINCi0NCi0jIMiBICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBET1VCTEUgR1JBVkVdDQotIlx1MDIwMSIgPT4gImEiDQotDQotIyDIgyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggSU5WRVJURUQgQlJFVkVdDQotIlx1MDIwMyIgPT4gImEiDQotDQotIyDIpyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTAyMjciID0+ICJhIg0KLQ0KLSMgyZAgIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIEFdDQotIlx1MDI1MCIgPT4gImEiDQotDQotIyDJmSAgW0xBVElOIFNNQUxMIExFVFRFUiBTQ0hXQV0NCi0iXHUwMjU5IiA9PiAiYSINCi0NCi0jIMmaICBbTEFUSU4gU01BTEwgTEVUVEVSIFNDSFdBIFdJVEggSE9PS10NCi0iXHUwMjVBIiA9PiAiYSINCi0NCi0jIOG2jyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUkVUUk9GTEVYIEhPT0tdDQotIlx1MUQ4RiIgPT4gImEiDQotDQotIyDhtpUgIFtMQVRJTiBTTUFMTCBMRVRURVIgU0NIV0EgV0lUSCBSRVRST0ZMRVggSE9PS10NCi0iXHUxRDk1IiA9PiAiYSINCi0NCi0jIOG6oSAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBCRUxPV10NCi0iXHUxRTAxIiA9PiAiYSINCi0NCi0jIOG6oyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklHSFQgSEFMRiBSSU5HXQ0KLSJcdTFFOUEiID0+ICJhIg0KLQ0KLSMg4bqhICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBET1QgQkVMT1ddDQotIlx1MUVBMSIgPT4gImEiDQotDQotIyDhuqMgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEhPT0sgQUJPVkVdDQotIlx1MUVBMyIgPT4gImEiDQotDQotIyDhuqUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFXQ0KLSJcdTFFQTUiID0+ICJhIg0KLQ0KLSMg4bqnICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBHUkFWRV0NCi0iXHUxRUE3IiA9PiAiYSINCi0NCi0jIOG6qSAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRV0NCi0iXHUxRUE5IiA9PiAiYSINCi0NCi0jIOG6qyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgVElMREVdDQotIlx1MUVBQiIgPT4gImEiDQotDQotIyDhuq0gIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIERPVCBCRUxPV10NCi0iXHUxRUFEIiA9PiAiYSINCi0NCi0jIOG6ryAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEFDVVRFXQ0KLSJcdTFFQUYiID0+ICJhIg0KLQ0KLSMg4bqxICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgR1JBVkVdDQotIlx1MUVCMSIgPT4gImEiDQotDQotIyDhurMgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBIT09LIEFCT1ZFXQ0KLSJcdTFFQjMiID0+ICJhIg0KLQ0KLSMg4bq1ICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgVElMREVdDQotIlx1MUVCNSIgPT4gImEiDQotDQotIyDhurcgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBET1QgQkVMT1ddDQotIlx1MUVCNyIgPT4gImEiDQotDQotIyDigpAgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIEFdDQotIlx1MjA5MCIgPT4gImEiDQotDQotIyDigpQgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIFNDSFdBXQ0KLSJcdTIwOTQiID0+ICJhIg0KLQ0KLSMg4pOQICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgQV0NCi0iXHUyNEQwIiA9PiAiYSINCi0NCi0jIOKxpSAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggU1RST0tFXQ0KLSJcdTJDNjUiID0+ICJhIg0KLQ0KLSMg4rGvICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVFVSTkVEIEFdDQotIlx1MkM2RiIgPT4gImEiDQotDQotIyDvvYEgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIEFdDQotIlx1RkY0MSIgPT4gImEiDQotDQotIyDqnLIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBQV0NCi0iXHVBNzMyIiA9PiAiQUEiDQotDQotIyDDhiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFFXQ0KLSJcdTAwQzYiID0+ICJBRSINCi0NCi0jIMeiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUgV0lUSCBNQUNST05dDQotIlx1MDFFMiIgPT4gIkFFIg0KLQ0KLSMgx7wgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBRSBXSVRIIEFDVVRFXQ0KLSJcdTAxRkMiID0+ICJBRSINCi0NCi0jIOG0gSAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEFFXQ0KLSJcdTFEMDEiID0+ICJBRSINCi0NCi0jIOqctCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFPXQ0KLSJcdUE3MzQiID0+ICJBTyINCi0NCi0jIOqctiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFVXQ0KLSJcdUE3MzYiID0+ICJBVSINCi0NCi0jIOqcuCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFWXQ0KLSJcdUE3MzgiID0+ICJBViINCi0NCi0jIOqcuiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFWIFdJVEggSE9SSVpPTlRBTCBCQVJdDQotIlx1QTczQSIgPT4gIkFWIg0KLQ0KLSMg6py8ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQVldDQotIlx1QTczQyIgPT4gIkFZIg0KLQ0KLSMg4pKcICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgQV0NCi0iXHUyNDlDIiA9PiAiKGEpIg0KLQ0KLSMg6pyzICBbTEFUSU4gU01BTEwgTEVUVEVSIEFBXQ0KLSJcdUE3MzMiID0+ICJhYSINCi0NCi0jIMOmICBbTEFUSU4gU01BTEwgTEVUVEVSIEFFXQ0KLSJcdTAwRTYiID0+ICJhZSINCi0NCi0jIMejICBbTEFUSU4gU01BTEwgTEVUVEVSIEFFIFdJVEggTUFDUk9OXQ0KLSJcdTAxRTMiID0+ICJhZSINCi0NCi0jIMe9ICBbTEFUSU4gU01BTEwgTEVUVEVSIEFFIFdJVEggQUNVVEVdDQotIlx1MDFGRCIgPT4gImFlIg0KLQ0KLSMg4bSCICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBBRV0NCi0iXHUxRDAyIiA9PiAiYWUiDQotDQotIyDqnLUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQU9dDQotIlx1QTczNSIgPT4gImFvIg0KLQ0KLSMg6py3ICBbTEFUSU4gU01BTEwgTEVUVEVSIEFVXQ0KLSJcdUE3MzciID0+ICJhdSINCi0NCi0jIOqcuSAgW0xBVElOIFNNQUxMIExFVFRFUiBBVl0NCi0iXHVBNzM5IiA9PiAiYXYiDQotDQotIyDqnLsgIFtMQVRJTiBTTUFMTCBMRVRURVIgQVYgV0lUSCBIT1JJWk9OVEFMIEJBUl0NCi0iXHVBNzNCIiA9PiAiYXYiDQotDQotIyDqnL0gIFtMQVRJTiBTTUFMTCBMRVRURVIgQVldDQotIlx1QTczRCIgPT4gImF5Ig0KLQ0KLSMgxoEgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBCIFdJVEggSE9PS10NCi0iXHUwMTgxIiA9PiAiQiINCi0NCi0jIMaCICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiBXSVRIIFRPUEJBUl0NCi0iXHUwMTgyIiA9PiAiQiINCi0NCi0jIMmDICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiBXSVRIIFNUUk9LRV0NCi0iXHUwMjQzIiA9PiAiQiINCi0NCi0jIMqZICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgQl0NCi0iXHUwMjk5IiA9PiAiQiINCi0NCi0jIOG0gyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEJBUlJFRCBCXQ0KLSJcdTFEMDMiID0+ICJCIg0KLQ0KLSMg4biCICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiBXSVRIIERPVCBBQk9WRV0NCi0iXHUxRTAyIiA9PiAiQiINCi0NCi0jIOG4hCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEIgV0lUSCBET1QgQkVMT1ddDQotIlx1MUUwNCIgPT4gIkIiDQotDQotIyDhuIYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBCIFdJVEggTElORSBCRUxPV10NCi0iXHUxRTA2IiA9PiAiQiINCi0NCi0jIOKStyAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQl0NCi0iXHUyNEI3IiA9PiAiQiINCi0NCi0jIO+8oiAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBCXQ0KLSJcdUZGMjIiID0+ICJCIg0KLQ0KLSMgxoAgIFtMQVRJTiBTTUFMTCBMRVRURVIgQiBXSVRIIFNUUk9LRV0NCi0iXHUwMTgwIiA9PiAiYiINCi0NCi0jIMaDICBbTEFUSU4gU01BTEwgTEVUVEVSIEIgV0lUSCBUT1BCQVJdDQotIlx1MDE4MyIgPT4gImIiDQotDQotIyDJkyAgW0xBVElOIFNNQUxMIExFVFRFUiBCIFdJVEggSE9PS10NCi0iXHUwMjUzIiA9PiAiYiINCi0NCi0jIOG1rCAgW0xBVElOIFNNQUxMIExFVFRFUiBCIFdJVEggTUlERExFIFRJTERFXQ0KLSJcdTFENkMiID0+ICJiIg0KLQ0KLSMg4baAICBbTEFUSU4gU01BTEwgTEVUVEVSIEIgV0lUSCBQQUxBVEFMIEhPT0tdDQotIlx1MUQ4MCIgPT4gImIiDQotDQotIyDhuIMgIFtMQVRJTiBTTUFMTCBMRVRURVIgQiBXSVRIIERPVCBBQk9WRV0NCi0iXHUxRTAzIiA9PiAiYiINCi0NCi0jIOG4hSAgW0xBVElOIFNNQUxMIExFVFRFUiBCIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFMDUiID0+ICJiIg0KLQ0KLSMg4biHICBbTEFUSU4gU01BTEwgTEVUVEVSIEIgV0lUSCBMSU5FIEJFTE9XXQ0KLSJcdTFFMDciID0+ICJiIg0KLQ0KLSMg4pORICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgQl0NCi0iXHUyNEQxIiA9PiAiYiINCi0NCi0jIO+9giAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgQl0NCi0iXHVGRjQyIiA9PiAiYiINCi0NCi0jIOKSnSAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIEJdDQotIlx1MjQ5RCIgPT4gIihiKSINCi0NCi0jIMOHICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEFdDQotIlx1MDBDNyIgPT4gIkMiDQotDQotIyDEhiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURV0NCi0iXHUwMTA2IiA9PiAiQyINCi0NCi0jIMSIICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENJUkNVTUZMRVhdDQotIlx1MDEwOCIgPT4gIkMiDQotDQotIyDEiiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBET1QgQUJPVkVdDQotIlx1MDEwQSIgPT4gIkMiDQotDQotIyDEjCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTl0NCi0iXHUwMTBDIiA9PiAiQyINCi0NCi0jIMaHICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIEhPT0tdDQotIlx1MDE4NyIgPT4gIkMiDQotDQotIyDIuyAgW0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBTVFJPS0VdDQotIlx1MDIzQiIgPT4gIkMiDQotDQotIyDKlyAgW0xBVElOIExFVFRFUiBTVFJFVENIRUQgQ10NCi0iXHUwMjk3IiA9PiAiQyINCi0NCi0jIOG0hCAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIENdDQotIlx1MUQwNCIgPT4gIkMiDQotDQotIyDhuIggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSBBTkQgQUNVVEVdDQotIlx1MUUwOCIgPT4gIkMiDQotDQotIyDikrggIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIENdDQotIlx1MjRCOCIgPT4gIkMiDQotDQotIyDvvKMgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgQ10NCi0iXHVGRjIzIiA9PiAiQyINCi0NCi0jIMOnICBbTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBXQ0KLSJcdTAwRTciID0+ICJjIg0KLQ0KLSMgxIcgIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFXQ0KLSJcdTAxMDciID0+ICJjIg0KLQ0KLSMgxIkgIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENJUkNVTUZMRVhdDQotIlx1MDEwOSIgPT4gImMiDQotDQotIyDEiyAgW0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTAxMEIiID0+ICJjIg0KLQ0KLSMgxI0gIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OXQ0KLSJcdTAxMEQiID0+ICJjIg0KLQ0KLSMgxoggIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEhPT0tdDQotIlx1MDE4OCIgPT4gImMiDQotDQotIyDIvCAgW0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggU1RST0tFXQ0KLSJcdTAyM0MiID0+ICJjIg0KLQ0KLSMgyZUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENVUkxdDQotIlx1MDI1NSIgPT4gImMiDQotDQotIyDhuIkgIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEgQU5EIEFDVVRFXQ0KLSJcdTFFMDkiID0+ICJjIg0KLQ0KLSMg4oaEICBbTEFUSU4gU01BTEwgTEVUVEVSIFJFVkVSU0VEIENdDQotIlx1MjE4NCIgPT4gImMiDQotDQotIyDik5IgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBDXQ0KLSJcdTI0RDIiID0+ICJjIg0KLQ0KLSMg6py+ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUkVWRVJTRUQgQyBXSVRIIERPVF0NCi0iXHVBNzNFIiA9PiAiYyINCi0NCi0jIOqcvyAgW0xBVElOIFNNQUxMIExFVFRFUiBSRVZFUlNFRCBDIFdJVEggRE9UXQ0KLSJcdUE3M0YiID0+ICJjIg0KLQ0KLSMg772DICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBDXQ0KLSJcdUZGNDMiID0+ICJjIg0KLQ0KLSMg4pKeICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgQ10NCi0iXHUyNDlFIiA9PiAiKGMpIg0KLQ0KLSMgw5AgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEhdDQotIlx1MDBEMCIgPT4gIkQiDQotDQotIyDEjiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTl0NCi0iXHUwMTBFIiA9PiAiRCINCi0NCi0jIMSQICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRV0NCi0iXHUwMTEwIiA9PiAiRCINCi0NCi0jIMaJICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUZSSUNBTiBEXQ0KLSJcdTAxODkiID0+ICJEIg0KLQ0KLSMgxoogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggSE9PS10NCi0iXHUwMThBIiA9PiAiRCINCi0NCi0jIMaLICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFRPUEJBUl0NCi0iXHUwMThCIiA9PiAiRCINCi0NCi0jIOG0hSAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIERdDQotIlx1MUQwNSIgPT4gIkQiDQotDQotIyDhtIYgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBFVEhdDQotIlx1MUQwNiIgPT4gIkQiDQotDQotIyDhuIogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTFFMEEiID0+ICJEIg0KLQ0KLSMg4biMICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIERPVCBCRUxPV10NCi0iXHUxRTBDIiA9PiAiRCINCi0NCi0jIOG4jiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBMSU5FIEJFTE9XXQ0KLSJcdTFFMEUiID0+ICJEIg0KLQ0KLSMg4biQICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIENFRElMTEFdDQotIlx1MUUxMCIgPT4gIkQiDQotDQotIyDhuJIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10NCi0iXHUxRTEyIiA9PiAiRCINCi0NCi0jIOKSuSAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRF0NCi0iXHUyNEI5IiA9PiAiRCINCi0NCi0jIOqduSAgW0xBVElOIENBUElUQUwgTEVUVEVSIElOU1VMQVIgRF0NCi0iXHVBNzc5IiA9PiAiRCINCi0NCi0jIO+8pCAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBEXQ0KLSJcdUZGMjQiID0+ICJEIg0KLQ0KLSMgw7AgIFtMQVRJTiBTTUFMTCBMRVRURVIgRVRIXQ0KLSJcdTAwRjAiID0+ICJkIg0KLQ0KLSMgxI8gIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIENBUk9OXQ0KLSJcdTAxMEYiID0+ICJkIg0KLQ0KLSMgxJEgIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIFNUUk9LRV0NCi0iXHUwMTExIiA9PiAiZCINCi0NCi0jIMaMICBbTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBUT1BCQVJdDQotIlx1MDE4QyIgPT4gImQiDQotDQotIyDIoSAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ1VSTF0NCi0iXHUwMjIxIiA9PiAiZCINCi0NCi0jIMmWICBbTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBUQUlMXQ0KLSJcdTAyNTYiID0+ICJkIg0KLQ0KLSMgyZcgIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIEhPT0tdDQotIlx1MDI1NyIgPT4gImQiDQotDQotIyDhta0gIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIE1JRERMRSBUSUxERV0NCi0iXHUxRDZEIiA9PiAiZCINCi0NCi0jIOG2gSAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggUEFMQVRBTCBIT09LXQ0KLSJcdTFEODEiID0+ICJkIg0KLQ0KLSMg4baRICBbTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBIT09LIEFORCBUQUlMXQ0KLSJcdTFEOTEiID0+ICJkIg0KLQ0KLSMg4biLICBbTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBET1QgQUJPVkVdDQotIlx1MUUwQiIgPT4gImQiDQotDQotIyDhuI0gIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIERPVCBCRUxPV10NCi0iXHUxRTBEIiA9PiAiZCINCi0NCi0jIOG4jyAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggTElORSBCRUxPV10NCi0iXHUxRTBGIiA9PiAiZCINCi0NCi0jIOG4kSAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0VESUxMQV0NCi0iXHUxRTExIiA9PiAiZCINCi0NCi0jIOG4kyAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10NCi0iXHUxRTEzIiA9PiAiZCINCi0NCi0jIOKTkyAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIERdDQotIlx1MjREMyIgPT4gImQiDQotDQotIyDqnbogIFtMQVRJTiBTTUFMTCBMRVRURVIgSU5TVUxBUiBEXQ0KLSJcdUE3N0EiID0+ICJkIg0KLQ0KLSMg772EICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBEXQ0KLSJcdUZGNDQiID0+ICJkIg0KLQ0KLSMgx4QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEWiBXSVRIIENBUk9OXQ0KLSJcdTAxQzQiID0+ICJEWiINCi0NCi0jIMexICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRFpdDQotIlx1MDFGMSIgPT4gIkRaIg0KLQ0KLSMgx4UgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTl0NCi0iXHUwMUM1IiA9PiAiRHoiDQotDQotIyDHsiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTTUFMTCBMRVRURVIgWl0NCi0iXHUwMUYyIiA9PiAiRHoiDQotDQotIyDikp8gIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBEXQ0KLSJcdTI0OUYiID0+ICIoZCkiDQotDQotIyDIuCAgW0xBVElOIFNNQUxMIExFVFRFUiBEQiBESUdSQVBIXQ0KLSJcdTAyMzgiID0+ICJkYiINCi0NCi0jIMeGICBbTEFUSU4gU01BTEwgTEVUVEVSIERaIFdJVEggQ0FST05dDQotIlx1MDFDNiIgPT4gImR6Ig0KLQ0KLSMgx7MgIFtMQVRJTiBTTUFMTCBMRVRURVIgRFpdDQotIlx1MDFGMyIgPT4gImR6Ig0KLQ0KLSMgyqMgIFtMQVRJTiBTTUFMTCBMRVRURVIgRFogRElHUkFQSF0NCi0iXHUwMkEzIiA9PiAiZHoiDQotDQotIyDKpSAgW0xBVElOIFNNQUxMIExFVFRFUiBEWiBESUdSQVBIIFdJVEggQ1VSTF0NCi0iXHUwMkE1IiA9PiAiZHoiDQotDQotIyDDiCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRV0NCi0iXHUwMEM4IiA9PiAiRSINCi0NCi0jIMOJICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFXQ0KLSJcdTAwQzkiID0+ICJFIg0KLQ0KLSMgw4ogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWF0NCi0iXHUwMENBIiA9PiAiRSINCi0NCi0jIMOLICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJU10NCi0iXHUwMENCIiA9PiAiRSINCi0NCi0jIMSSICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE1BQ1JPTl0NCi0iXHUwMTEyIiA9PiAiRSINCi0NCi0jIMSUICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEJSRVZFXQ0KLSJcdTAxMTQiID0+ICJFIg0KLQ0KLSMgxJYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTAxMTYiID0+ICJFIg0KLQ0KLSMgxJggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLXQ0KLSJcdTAxMTgiID0+ICJFIg0KLQ0KLSMgxJogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0FST05dDQotIlx1MDExQSIgPT4gIkUiDQotDQotIyDGjiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFJFVkVSU0VEIEVdDQotIlx1MDE4RSIgPT4gIkUiDQotDQotIyDGkCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE9QRU4gRV0NCi0iXHUwMTkwIiA9PiAiRSINCi0NCi0jIMiEICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVUJMRSBHUkFWRV0NCi0iXHUwMjA0IiA9PiAiRSINCi0NCi0jIMiGICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIElOVkVSVEVEIEJSRVZFXQ0KLSJcdTAyMDYiID0+ICJFIg0KLQ0KLSMgyKggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0VESUxMQV0NCi0iXHUwMjI4IiA9PiAiRSINCi0NCi0jIMmGICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIFNUUk9LRV0NCi0iXHUwMjQ2IiA9PiAiRSINCi0NCi0jIOG0hyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEVdDQotIlx1MUQwNyIgPT4gIkUiDQotDQotIyDhuJQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OIEFORCBHUkFWRV0NCi0iXHUxRTE0IiA9PiAiRSINCi0NCi0jIOG4liAgW0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBNQUNST04gQU5EIEFDVVRFXQ0KLSJcdTFFMTYiID0+ICJFIg0KLQ0KLSMg4biYICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQkVMT1ddDQotIlx1MUUxOCIgPT4gIkUiDQotDQotIyDhuJogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggVElMREUgQkVMT1ddDQotIlx1MUUxQSIgPT4gIkUiDQotDQotIyDhuJwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0VESUxMQSBBTkQgQlJFVkVdDQotIlx1MUUxQyIgPT4gIkUiDQotDQotIyDhurggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFQjgiID0+ICJFIg0KLQ0KLSMg4bq6ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEhPT0sgQUJPVkVdDQotIlx1MUVCQSIgPT4gIkUiDQotDQotIyDhurwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggVElMREVdDQotIlx1MUVCQyIgPT4gIkUiDQotDQotIyDhur4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEVdDQotIlx1MUVCRSIgPT4gIkUiDQotDQotIyDhu4AgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkVdDQotIlx1MUVDMCIgPT4gIkUiDQotDQotIyDhu4IgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRV0NCi0iXHUxRUMyIiA9PiAiRSINCi0NCi0jIOG7hCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERV0NCi0iXHUxRUM0IiA9PiAiRSINCi0NCi0jIOG7hiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1ddDQotIlx1MUVDNiIgPT4gIkUiDQotDQotIyDikrogIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIEVdDQotIlx1MjRCQSIgPT4gIkUiDQotDQotIyDisbsgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBUVVJORUQgRV0NCi0iXHUyQzdCIiA9PiAiRSINCi0NCi0jIO+8pSAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBFXQ0KLSJcdUZGMjUiID0+ICJFIg0KLQ0KLSMgw6ggIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFXQ0KLSJcdTAwRTgiID0+ICJlIg0KLQ0KLSMgw6kgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFXQ0KLSJcdTAwRTkiID0+ICJlIg0KLQ0KLSMgw6ogIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVhdDQotIlx1MDBFQSIgPT4gImUiDQotDQotIyDDqyAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTXQ0KLSJcdTAwRUIiID0+ICJlIg0KLQ0KLSMgxJMgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE1BQ1JPTl0NCi0iXHUwMTEzIiA9PiAiZSINCi0NCi0jIMSVICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBCUkVWRV0NCi0iXHUwMTE1IiA9PiAiZSINCi0NCi0jIMSXICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkVdDQotIlx1MDExNyIgPT4gImUiDQotDQotIyDEmSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLXQ0KLSJcdTAxMTkiID0+ICJlIg0KLQ0KLSMgxJsgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OXQ0KLSJcdTAxMUIiID0+ICJlIg0KLQ0KLSMgx50gIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIEVdDQotIlx1MDFERCIgPT4gImUiDQotDQotIyDIhSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRE9VQkxFIEdSQVZFXQ0KLSJcdTAyMDUiID0+ICJlIg0KLQ0KLSMgyIcgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIElOVkVSVEVEIEJSRVZFXQ0KLSJcdTAyMDciID0+ICJlIg0KLQ0KLSMgyKkgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENFRElMTEFdDQotIlx1MDIyOSIgPT4gImUiDQotDQotIyDJhyAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggU1RST0tFXQ0KLSJcdTAyNDciID0+ICJlIg0KLQ0KLSMgyZggIFtMQVRJTiBTTUFMTCBMRVRURVIgUkVWRVJTRUQgRV0NCi0iXHUwMjU4IiA9PiAiZSINCi0NCi0jIMmbICBbTEFUSU4gU01BTEwgTEVUVEVSIE9QRU4gRV0NCi0iXHUwMjVCIiA9PiAiZSINCi0NCi0jIMmcICBbTEFUSU4gU01BTEwgTEVUVEVSIFJFVkVSU0VEIE9QRU4gRV0NCi0iXHUwMjVDIiA9PiAiZSINCi0NCi0jIMmdICBbTEFUSU4gU01BTEwgTEVUVEVSIFJFVkVSU0VEIE9QRU4gRSBXSVRIIEhPT0tdDQotIlx1MDI1RCIgPT4gImUiDQotDQotIyDJniAgW0xBVElOIFNNQUxMIExFVFRFUiBDTE9TRUQgUkVWRVJTRUQgT1BFTiBFXQ0KLSJcdTAyNUUiID0+ICJlIg0KLQ0KLSMgypogIFtMQVRJTiBTTUFMTCBMRVRURVIgQ0xPU0VEIE9QRU4gRV0NCi0iXHUwMjlBIiA9PiAiZSINCi0NCi0jIOG0iCAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgT1BFTiBFXQ0KLSJcdTFEMDgiID0+ICJlIg0KLQ0KLSMg4baSICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBSRVRST0ZMRVggSE9PS10NCi0iXHUxRDkyIiA9PiAiZSINCi0NCi0jIOG2kyAgW0xBVElOIFNNQUxMIExFVFRFUiBPUEVOIEUgV0lUSCBSRVRST0ZMRVggSE9PS10NCi0iXHUxRDkzIiA9PiAiZSINCi0NCi0jIOG2lCAgW0xBVElOIFNNQUxMIExFVFRFUiBSRVZFUlNFRCBPUEVOIEUgV0lUSCBSRVRST0ZMRVggSE9PS10NCi0iXHUxRDk0IiA9PiAiZSINCi0NCi0jIOG4lSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OIEFORCBHUkFWRV0NCi0iXHUxRTE1IiA9PiAiZSINCi0NCi0jIOG4lyAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OIEFORCBBQ1VURV0NCi0iXHUxRTE3IiA9PiAiZSINCi0NCi0jIOG4mSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10NCi0iXHUxRTE5IiA9PiAiZSINCi0NCi0jIOG4myAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggVElMREUgQkVMT1ddDQotIlx1MUUxQiIgPT4gImUiDQotDQotIyDhuJ0gIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENFRElMTEEgQU5EIEJSRVZFXQ0KLSJcdTFFMUQiID0+ICJlIg0KLQ0KLSMg4bq5ICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQkVMT1ddDQotIlx1MUVCOSIgPT4gImUiDQotDQotIyDhursgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEhPT0sgQUJPVkVdDQotIlx1MUVCQiIgPT4gImUiDQotDQotIyDhur0gIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIFRJTERFXQ0KLSJcdTFFQkQiID0+ICJlIg0KLQ0KLSMg4bq/ICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBBQ1VURV0NCi0iXHUxRUJGIiA9PiAiZSINCi0NCi0jIOG7gSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkVdDQotIlx1MUVDMSIgPT4gImUiDQotDQotIyDhu4MgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkVdDQotIlx1MUVDMyIgPT4gImUiDQotDQotIyDhu4UgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIFRJTERFXQ0KLSJcdTFFQzUiID0+ICJlIg0KLQ0KLSMg4buHICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1ddDQotIlx1MUVDNyIgPT4gImUiDQotDQotIyDigpEgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIEVdDQotIlx1MjA5MSIgPT4gImUiDQotDQotIyDik5QgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBFXQ0KLSJcdTI0RDQiID0+ICJlIg0KLQ0KLSMg4rG4ICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBOT1RDSF0NCi0iXHUyQzc4IiA9PiAiZSINCi0NCi0jIO+9hSAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgRV0NCi0iXHVGRjQ1IiA9PiAiZSINCi0NCi0jIOKSoCAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIEVdDQotIlx1MjRBMCIgPT4gIihlKSINCi0NCi0jIMaRICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRiBXSVRIIEhPT0tdDQotIlx1MDE5MSIgPT4gIkYiDQotDQotIyDhuJ4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBGIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTFFMUUiID0+ICJGIg0KLQ0KLSMg4pK7ICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBGXQ0KLSJcdTI0QkIiID0+ICJGIg0KLQ0KLSMg6pywICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgRl0NCi0iXHVBNzMwIiA9PiAiRiINCi0NCi0jIOqduyAgW0xBVElOIENBUElUQUwgTEVUVEVSIElOU1VMQVIgRl0NCi0iXHVBNzdCIiA9PiAiRiINCi0NCi0jIOqfuyAgW0xBVElOIEVQSUdSQVBISUMgTEVUVEVSIFJFVkVSU0VEIEZdDQotIlx1QTdGQiIgPT4gIkYiDQotDQotIyDvvKYgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgRl0NCi0iXHVGRjI2IiA9PiAiRiINCi0NCi0jIMaSICBbTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LXQ0KLSJcdTAxOTIiID0+ICJmIg0KLQ0KLSMg4bWuICBbTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBNSURETEUgVElMREVdDQotIlx1MUQ2RSIgPT4gImYiDQotDQotIyDhtoIgIFtMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIFBBTEFUQUwgSE9PS10NCi0iXHUxRDgyIiA9PiAiZiINCi0NCi0jIOG4nyAgW0xBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTFFMUYiID0+ICJmIg0KLQ0KLSMg4bqbICBbTEFUSU4gU01BTEwgTEVUVEVSIExPTkcgUyBXSVRIIERPVCBBQk9WRV0NCi0iXHUxRTlCIiA9PiAiZiINCi0NCi0jIOKTlSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIEZdDQotIlx1MjRENSIgPT4gImYiDQotDQotIyDqnbwgIFtMQVRJTiBTTUFMTCBMRVRURVIgSU5TVUxBUiBGXQ0KLSJcdUE3N0MiID0+ICJmIg0KLQ0KLSMg772GICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBGXQ0KLSJcdUZGNDYiID0+ICJmIg0KLQ0KLSMg4pKhICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgRl0NCi0iXHUyNEExIiA9PiAiKGYpIg0KLQ0KLSMg76yAICBbTEFUSU4gU01BTEwgTElHQVRVUkUgRkZdDQotIlx1RkIwMCIgPT4gImZmIg0KLQ0KLSMg76yDICBbTEFUSU4gU01BTEwgTElHQVRVUkUgRkZJXQ0KLSJcdUZCMDMiID0+ICJmZmkiDQotDQotIyDvrIQgIFtMQVRJTiBTTUFMTCBMSUdBVFVSRSBGRkxdDQotIlx1RkIwNCIgPT4gImZmbCINCi0NCi0jIO+sgSAgW0xBVElOIFNNQUxMIExJR0FUVVJFIEZJXQ0KLSJcdUZCMDEiID0+ICJmaSINCi0NCi0jIO+sgiAgW0xBVElOIFNNQUxMIExJR0FUVVJFIEZMXQ0KLSJcdUZCMDIiID0+ICJmbCINCi0NCi0jIMScICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENJUkNVTUZMRVhdDQotIlx1MDExQyIgPT4gIkciDQotDQotIyDEniAgW0xBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBCUkVWRV0NCi0iXHUwMTFFIiA9PiAiRyINCi0NCi0jIMSgICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIERPVCBBQk9WRV0NCi0iXHUwMTIwIiA9PiAiRyINCi0NCi0jIMSiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENFRElMTEFdDQotIlx1MDEyMiIgPT4gIkciDQotDQotIyDGkyAgW0xBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBIT09LXQ0KLSJcdTAxOTMiID0+ICJHIg0KLQ0KLSMgx6QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggU1RST0tFXQ0KLSJcdTAxRTQiID0+ICJHIg0KLQ0KLSMgx6UgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIFNUUk9LRV0NCi0iXHUwMUU1IiA9PiAiRyINCi0NCi0jIMemICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENBUk9OXQ0KLSJcdTAxRTYiID0+ICJHIg0KLQ0KLSMgx6cgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENBUk9OXQ0KLSJcdTAxRTciID0+ICJHIg0KLQ0KLSMgx7QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQUNVVEVdDQotIlx1MDFGNCIgPT4gIkciDQotDQotIyDJoiAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEddDQotIlx1MDI2MiIgPT4gIkciDQotDQotIyDKmyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEcgV0lUSCBIT09LXQ0KLSJcdTAyOUIiID0+ICJHIg0KLQ0KLSMg4bigICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIE1BQ1JPTl0NCi0iXHUxRTIwIiA9PiAiRyINCi0NCi0jIOKSvCAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgR10NCi0iXHUyNEJDIiA9PiAiRyINCi0NCi0jIOqdvSAgW0xBVElOIENBUElUQUwgTEVUVEVSIElOU1VMQVIgR10NCi0iXHVBNzdEIiA9PiAiRyINCi0NCi0jIOqdviAgW0xBVElOIENBUElUQUwgTEVUVEVSIFRVUk5FRCBJTlNVTEFSIEddDQotIlx1QTc3RSIgPT4gIkciDQotDQotIyDvvKcgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgR10NCi0iXHVGRjI3IiA9PiAiRyINCi0NCi0jIMSdICBbTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDSVJDVU1GTEVYXQ0KLSJcdTAxMUQiID0+ICJnIg0KLQ0KLSMgxJ8gIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEJSRVZFXQ0KLSJcdTAxMUYiID0+ICJnIg0KLQ0KLSMgxKEgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIERPVCBBQk9WRV0NCi0iXHUwMTIxIiA9PiAiZyINCi0NCi0jIMSjICBbTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDRURJTExBXQ0KLSJcdTAxMjMiID0+ICJnIg0KLQ0KLSMgx7UgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEFDVVRFXQ0KLSJcdTAxRjUiID0+ICJnIg0KLQ0KLSMgyaAgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEhPT0tdDQotIlx1MDI2MCIgPT4gImciDQotDQotIyDJoSAgW0xBVElOIFNNQUxMIExFVFRFUiBTQ1JJUFQgR10NCi0iXHUwMjYxIiA9PiAiZyINCi0NCi0jIOG1tyAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgR10NCi0iXHUxRDc3IiA9PiAiZyINCi0NCi0jIOG1uSAgW0xBVElOIFNNQUxMIExFVFRFUiBJTlNVTEFSIEddDQotIlx1MUQ3OSIgPT4gImciDQotDQotIyDhtoMgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIFBBTEFUQUwgSE9PS10NCi0iXHUxRDgzIiA9PiAiZyINCi0NCi0jIOG4oSAgW0xBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggTUFDUk9OXQ0KLSJcdTFFMjEiID0+ICJnIg0KLQ0KLSMg4pOWICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgR10NCi0iXHUyNEQ2IiA9PiAiZyINCi0NCi0jIOqdvyAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgSU5TVUxBUiBHXQ0KLSJcdUE3N0YiID0+ICJnIg0KLQ0KLSMg772HICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBHXQ0KLSJcdUZGNDciID0+ICJnIg0KLQ0KLSMg4pKiICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgR10NCi0iXHUyNEEyIiA9PiAiKGcpIg0KLQ0KLSMgxKQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggQ0lSQ1VNRkxFWF0NCi0iXHUwMTI0IiA9PiAiSCINCi0NCi0jIMSmICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIFNUUk9LRV0NCi0iXHUwMTI2IiA9PiAiSCINCi0NCi0jIMieICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIENBUk9OXQ0KLSJcdTAyMUUiID0+ICJIIg0KLQ0KLSMgypwgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBIXQ0KLSJcdTAyOUMiID0+ICJIIg0KLQ0KLSMg4biiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIERPVCBBQk9WRV0NCi0iXHUxRTIyIiA9PiAiSCINCi0NCi0jIOG4pCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEggV0lUSCBET1QgQkVMT1ddDQotIlx1MUUyNCIgPT4gIkgiDQotDQotIyDhuKYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggRElBRVJFU0lTXQ0KLSJcdTFFMjYiID0+ICJIIg0KLQ0KLSMg4bioICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIENFRElMTEFdDQotIlx1MUUyOCIgPT4gIkgiDQotDQotIyDhuKogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggQlJFVkUgQkVMT1ddDQotIlx1MUUyQSIgPT4gIkgiDQotDQotIyDikr0gIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIEhdDQotIlx1MjRCRCIgPT4gIkgiDQotDQotIyDisacgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggREVTQ0VOREVSXQ0KLSJcdTJDNjciID0+ICJIIg0KLQ0KLSMg4rG1ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSEFMRiBIXQ0KLSJcdTJDNzUiID0+ICJIIg0KLQ0KLSMg77yoICBbRlVMTFdJRFRIIExBVElOIENBUElUQUwgTEVUVEVSIEhdDQotIlx1RkYyOCIgPT4gIkgiDQotDQotIyDEpSAgW0xBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggQ0lSQ1VNRkxFWF0NCi0iXHUwMTI1IiA9PiAiaCINCi0NCi0jIMSnICBbTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBTVFJPS0VdDQotIlx1MDEyNyIgPT4gImgiDQotDQotIyDInyAgW0xBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggQ0FST05dDQotIlx1MDIxRiIgPT4gImgiDQotDQotIyDJpSAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgSF0NCi0iXHUwMjY1IiA9PiAiaCINCi0NCi0jIMmmICBbTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBIT09LXQ0KLSJcdTAyNjYiID0+ICJoIg0KLQ0KLSMgyq4gIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIEggV0lUSCBGSVNISE9PS10NCi0iXHUwMkFFIiA9PiAiaCINCi0NCi0jIMqvICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBIIFdJVEggRklTSEhPT0sgQU5EIFRBSUxdDQotIlx1MDJBRiIgPT4gImgiDQotDQotIyDhuKMgIFtMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIERPVCBBQk9WRV0NCi0iXHUxRTIzIiA9PiAiaCINCi0NCi0jIOG4pSAgW0xBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFMjUiID0+ICJoIg0KLQ0KLSMg4binICBbTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBESUFFUkVTSVNdDQotIlx1MUUyNyIgPT4gImgiDQotDQotIyDhuKkgIFtMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIENFRElMTEFdDQotIlx1MUUyOSIgPT4gImgiDQotDQotIyDhuKsgIFtMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIEJSRVZFIEJFTE9XXQ0KLSJcdTFFMkIiID0+ICJoIg0KLQ0KLSMg4bqWICBbTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBMSU5FIEJFTE9XXQ0KLSJcdTFFOTYiID0+ICJoIg0KLQ0KLSMg4pOXICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgSF0NCi0iXHUyNEQ3IiA9PiAiaCINCi0NCi0jIOKxqCAgW0xBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggREVTQ0VOREVSXQ0KLSJcdTJDNjgiID0+ICJoIg0KLQ0KLSMg4rG2ICBbTEFUSU4gU01BTEwgTEVUVEVSIEhBTEYgSF0NCi0iXHUyQzc2IiA9PiAiaCINCi0NCi0jIO+9iCAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgSF0NCi0iXHVGRjQ4IiA9PiAiaCINCi0NCi0jIMe2ICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h3YWlyICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSFdBSVJdDQotIlx1MDFGNiIgPT4gIkhWIg0KLQ0KLSMg4pKjICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgSF0NCi0iXHUyNEEzIiA9PiAiKGgpIg0KLQ0KLSMgxpUgIFtMQVRJTiBTTUFMTCBMRVRURVIgSFZdDQotIlx1MDE5NSIgPT4gImh2Ig0KLQ0KLSMgw4wgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkVdDQotIlx1MDBDQyIgPT4gIkkiDQotDQotIyDDjSAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURV0NCi0iXHUwMENEIiA9PiAiSSINCi0NCi0jIMOOICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVhdDQotIlx1MDBDRSIgPT4gIkkiDQotDQotIyDDjyAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVNdDQotIlx1MDBDRiIgPT4gIkkiDQotDQotIyDEqCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBUSUxERV0NCi0iXHUwMTI4IiA9PiAiSSINCi0NCi0jIMSqICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTl0NCi0iXHUwMTJBIiA9PiAiSSINCi0NCi0jIMSsICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEJSRVZFXQ0KLSJcdTAxMkMiID0+ICJJIg0KLQ0KLSMgxK4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLXQ0KLSJcdTAxMkUiID0+ICJJIg0KLQ0KLSMgxLAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTAxMzAiID0+ICJJIg0KLQ0KLSMgxpYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJT1RBXQ0KLSJcdTAxOTYiID0+ICJJIg0KLQ0KLSMgxpcgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggU1RST0tFXQ0KLSJcdTAxOTciID0+ICJJIg0KLQ0KLSMgx48gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0FST05dDQotIlx1MDFDRiIgPT4gIkkiDQotDQotIyDIiCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1VCTEUgR1JBVkVdDQotIlx1MDIwOCIgPT4gIkkiDQotDQotIyDIiiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBJTlZFUlRFRCBCUkVWRV0NCi0iXHUwMjBBIiA9PiAiSSINCi0NCi0jIMmqICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgSV0NCi0iXHUwMjZBIiA9PiAiSSINCi0NCi0jIOG1uyAgW0xBVElOIFNNQUxMIENBUElUQUwgTEVUVEVSIEkgV0lUSCBTVFJPS0VdDQotIlx1MUQ3QiIgPT4gIkkiDQotDQotIyDhuKwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggVElMREUgQkVMT1ddDQotIlx1MUUyQyIgPT4gIkkiDQotDQotIyDhuK4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTIEFORCBBQ1VURV0NCi0iXHUxRTJFIiA9PiAiSSINCi0NCi0jIOG7iCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBIT09LIEFCT1ZFXQ0KLSJcdTFFQzgiID0+ICJJIg0KLQ0KLSMg4buKICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERPVCBCRUxPV10NCi0iXHUxRUNBIiA9PiAiSSINCi0NCi0jIOKSviAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSV0NCi0iXHUyNEJFIiA9PiAiSSINCi0NCi0jIOqfviAgW0xBVElOIEVQSUdSQVBISUMgTEVUVEVSIEkgTE9OR0FdDQotIlx1QTdGRSIgPT4gIkkiDQotDQotIyDvvKkgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgSV0NCi0iXHVGRjI5IiA9PiAiSSINCi0NCi0jIMOsICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRV0NCi0iXHUwMEVDIiA9PiAiaSINCi0NCi0jIMOtICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURV0NCi0iXHUwMEVEIiA9PiAiaSINCi0NCi0jIMOuICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYXQ0KLSJcdTAwRUUiID0+ICJpIg0KLQ0KLSMgw68gIFtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJU10NCi0iXHUwMEVGIiA9PiAiaSINCi0NCi0jIMSpICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBUSUxERV0NCi0iXHUwMTI5IiA9PiAiaSINCi0NCi0jIMSrICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST05dDQotIlx1MDEyQiIgPT4gImkiDQotDQotIyDErSAgW0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQlJFVkVdDQotIlx1MDEyRCIgPT4gImkiDQotDQotIyDEryAgW0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLXQ0KLSJcdTAxMkYiID0+ICJpIg0KLQ0KLSMgxLEgIFtMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJXQ0KLSJcdTAxMzEiID0+ICJpIg0KLQ0KLSMgx5AgIFtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENBUk9OXQ0KLSJcdTAxRDAiID0+ICJpIg0KLQ0KLSMgyIkgIFtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERPVUJMRSBHUkFWRV0NCi0iXHUwMjA5IiA9PiAiaSINCi0NCi0jIMiLICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBJTlZFUlRFRCBCUkVWRV0NCi0iXHUwMjBCIiA9PiAiaSINCi0NCi0jIMmoICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBTVFJPS0VdDQotIlx1MDI2OCIgPT4gImkiDQotDQotIyDhtIkgIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIEldDQotIlx1MUQwOSIgPT4gImkiDQotDQotIyDhtaIgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIEldDQotIlx1MUQ2MiIgPT4gImkiDQotDQotIyDhtbwgIFtMQVRJTiBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFNUUk9LRV0NCi0iXHUxRDdDIiA9PiAiaSINCi0NCi0jIOG2liAgW0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggUkVUUk9GTEVYIEhPT0tdDQotIlx1MUQ5NiIgPT4gImkiDQotDQotIyDhuK0gIFtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIFRJTERFIEJFTE9XXQ0KLSJcdTFFMkQiID0+ICJpIg0KLQ0KLSMg4bivICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMgQU5EIEFDVVRFXQ0KLSJcdTFFMkYiID0+ICJpIg0KLQ0KLSMg4buJICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBIT09LIEFCT1ZFXQ0KLSJcdTFFQzkiID0+ICJpIg0KLQ0KLSMg4buLICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBET1QgQkVMT1ddDQotIlx1MUVDQiIgPT4gImkiDQotDQotIyDigbEgIFtTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgSV0NCi0iXHUyMDcxIiA9PiAiaSINCi0NCi0jIOKTmCAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIEldDQotIlx1MjREOCIgPT4gImkiDQotDQotIyDvvYkgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIEldDQotIlx1RkY0OSIgPT4gImkiDQotDQotIyDEsiAgW0xBVElOIENBUElUQUwgTElHQVRVUkUgSUpdDQotIlx1MDEzMiIgPT4gIklKIg0KLQ0KLSMg4pKkICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgSV0NCi0iXHUyNEE0IiA9PiAiKGkpIg0KLQ0KLSMgxLMgIFtMQVRJTiBTTUFMTCBMSUdBVFVSRSBJSl0NCi0iXHUwMTMzIiA9PiAiaWoiDQotDQotIyDEtCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEogV0lUSCBDSVJDVU1GTEVYXQ0KLSJcdTAxMzQiID0+ICJKIg0KLQ0KLSMgyYggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBKIFdJVEggU1RST0tFXQ0KLSJcdTAyNDgiID0+ICJKIg0KLQ0KLSMg4bSKICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgSl0NCi0iXHUxRDBBIiA9PiAiSiINCi0NCi0jIOKSvyAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSl0NCi0iXHUyNEJGIiA9PiAiSiINCi0NCi0jIO+8qiAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBKXQ0KLSJcdUZGMkEiID0+ICJKIg0KLQ0KLSMgxLUgIFtMQVRJTiBTTUFMTCBMRVRURVIgSiBXSVRIIENJUkNVTUZMRVhdDQotIlx1MDEzNSIgPT4gImoiDQotDQotIyDHsCAgW0xBVElOIFNNQUxMIExFVFRFUiBKIFdJVEggQ0FST05dDQotIlx1MDFGMCIgPT4gImoiDQotDQotIyDItyAgW0xBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEpdDQotIlx1MDIzNyIgPT4gImoiDQotDQotIyDJiSAgW0xBVElOIFNNQUxMIExFVFRFUiBKIFdJVEggU1RST0tFXQ0KLSJcdTAyNDkiID0+ICJqIg0KLQ0KLSMgyZ8gIFtMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBKIFdJVEggU1RST0tFXQ0KLSJcdTAyNUYiID0+ICJqIg0KLQ0KLSMgyoQgIFtMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBKIFdJVEggU1RST0tFIEFORCBIT09LXQ0KLSJcdTAyODQiID0+ICJqIg0KLQ0KLSMgyp0gIFtMQVRJTiBTTUFMTCBMRVRURVIgSiBXSVRIIENST1NTRUQtVEFJTF0NCi0iXHUwMjlEIiA9PiAiaiINCi0NCi0jIOKTmSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIEpdDQotIlx1MjREOSIgPT4gImoiDQotDQotIyDisbwgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIEpdDQotIlx1MkM3QyIgPT4gImoiDQotDQotIyDvvYogIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIEpdDQotIlx1RkY0QSIgPT4gImoiDQotDQotIyDikqUgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBKXQ0KLSJcdTI0QTUiID0+ICIoaikiDQotDQotIyDEtiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBDRURJTExBXQ0KLSJcdTAxMzYiID0+ICJLIg0KLQ0KLSMgxpggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggSE9PS10NCi0iXHUwMTk4IiA9PiAiSyINCi0NCi0jIMeoICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENBUk9OXQ0KLSJcdTAxRTgiID0+ICJLIg0KLQ0KLSMg4bSLICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgS10NCi0iXHUxRDBCIiA9PiAiSyINCi0NCi0jIOG4sCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBBQ1VURV0NCi0iXHUxRTMwIiA9PiAiSyINCi0NCi0jIOG4siAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBET1QgQkVMT1ddDQotIlx1MUUzMiIgPT4gIksiDQotDQotIyDhuLQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggTElORSBCRUxPV10NCi0iXHUxRTM0IiA9PiAiSyINCi0NCi0jIOKTgCAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgS10NCi0iXHUyNEMwIiA9PiAiSyINCi0NCi0jIOKxqSAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBERVNDRU5ERVJdDQotIlx1MkM2OSIgPT4gIksiDQotDQotIyDqnYAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggU1RST0tFXQ0KLSJcdUE3NDAiID0+ICJLIg0KLQ0KLSMg6p2CICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIERJQUdPTkFMIFNUUk9LRV0NCi0iXHVBNzQyIiA9PiAiSyINCi0NCi0jIOqdhCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBTVFJPS0UgQU5EIERJQUdPTkFMIFNUUk9LRV0NCi0iXHVBNzQ0IiA9PiAiSyINCi0NCi0jIO+8qyAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBLXQ0KLSJcdUZGMkIiID0+ICJLIg0KLQ0KLSMgxLcgIFtMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEFdDQotIlx1MDEzNyIgPT4gImsiDQotDQotIyDGmSAgW0xBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggSE9PS10NCi0iXHUwMTk5IiA9PiAiayINCi0NCi0jIMepICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBDQVJPTl0NCi0iXHUwMUU5IiA9PiAiayINCi0NCi0jIMqeICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBLXQ0KLSJcdTAyOUUiID0+ICJrIg0KLQ0KLSMg4baEICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBQQUxBVEFMIEhPT0tdDQotIlx1MUQ4NCIgPT4gImsiDQotDQotIyDhuLEgIFtMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIEFDVVRFXQ0KLSJcdTFFMzEiID0+ICJrIg0KLQ0KLSMg4bizICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBET1QgQkVMT1ddDQotIlx1MUUzMyIgPT4gImsiDQotDQotIyDhuLUgIFtMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIExJTkUgQkVMT1ddDQotIlx1MUUzNSIgPT4gImsiDQotDQotIyDik5ogIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBLXQ0KLSJcdTI0REEiID0+ICJrIg0KLQ0KLSMg4rGqICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBERVNDRU5ERVJdDQotIlx1MkM2QSIgPT4gImsiDQotDQotIyDqnYEgIFtMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIFNUUk9LRV0NCi0iXHVBNzQxIiA9PiAiayINCi0NCi0jIOqdgyAgW0xBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggRElBR09OQUwgU1RST0tFXQ0KLSJcdUE3NDMiID0+ICJrIg0KLQ0KLSMg6p2FICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBTVFJPS0UgQU5EIERJQUdPTkFMIFNUUk9LRV0NCi0iXHVBNzQ1IiA9PiAiayINCi0NCi0jIO+9iyAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgS10NCi0iXHVGRjRCIiA9PiAiayINCi0NCi0jIOKSpiAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIEtdDQotIlx1MjRBNiIgPT4gIihrKSINCi0NCi0jIMS5ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEFDVVRFXQ0KLSJcdTAxMzkiID0+ICJMIg0KLQ0KLSMgxLsgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0VESUxMQV0NCi0iXHUwMTNCIiA9PiAiTCINCi0NCi0jIMS9ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENBUk9OXQ0KLSJcdTAxM0QiID0+ICJMIg0KLQ0KLSMgxL8gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggTUlERExFIERPVF0NCi0iXHUwMTNGIiA9PiAiTCINCi0NCi0jIMWBICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRV0NCi0iXHUwMTQxIiA9PiAiTCINCi0NCi0jIMi9ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEJBUl0NCi0iXHUwMjNEIiA9PiAiTCINCi0NCi0jIMqfICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgTF0NCi0iXHUwMjlGIiA9PiAiTCINCi0NCi0jIOG0jCAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEwgV0lUSCBTVFJPS0VdDQotIlx1MUQwQyIgPT4gIkwiDQotDQotIyDhuLYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFMzYiID0+ICJMIg0KLQ0KLSMg4bi4ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIERPVCBCRUxPVyBBTkQgTUFDUk9OXQ0KLSJcdTFFMzgiID0+ICJMIg0KLQ0KLSMg4bi6ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIExJTkUgQkVMT1ddDQotIlx1MUUzQSIgPT4gIkwiDQotDQotIyDhuLwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10NCi0iXHUxRTNDIiA9PiAiTCINCi0NCi0jIOKTgSAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTF0NCi0iXHUyNEMxIiA9PiAiTCINCi0NCi0jIOKxoCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBET1VCTEUgQkFSXQ0KLSJcdTJDNjAiID0+ICJMIg0KLQ0KLSMg4rGiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIE1JRERMRSBUSUxERV0NCi0iXHUyQzYyIiA9PiAiTCINCi0NCi0jIOqdhiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEJST0tFTiBMXQ0KLSJcdUE3NDYiID0+ICJMIg0KLQ0KLSMg6p2IICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEhJR0ggU1RST0tFXQ0KLSJcdUE3NDgiID0+ICJMIg0KLQ0KLSMg6p6AICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVFVSTkVEIExdDQotIlx1QTc4MCIgPT4gIkwiDQotDQotIyDvvKwgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgTF0NCi0iXHVGRjJDIiA9PiAiTCINCi0NCi0jIMS6ICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBBQ1VURV0NCi0iXHUwMTNBIiA9PiAibCINCi0NCi0jIMS8ICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDRURJTExBXQ0KLSJcdTAxM0MiID0+ICJsIg0KLQ0KLSMgxL4gIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENBUk9OXQ0KLSJcdTAxM0UiID0+ICJsIg0KLQ0KLSMgxYAgIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIE1JRERMRSBET1RdDQotIlx1MDE0MCIgPT4gImwiDQotDQotIyDFgiAgW0xBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFXQ0KLSJcdTAxNDIiID0+ICJsIg0KLQ0KLSMgxpogIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIEJBUl0NCi0iXHUwMTlBIiA9PiAibCINCi0NCi0jIMi0ICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDVVJMXQ0KLSJcdTAyMzQiID0+ICJsIg0KLQ0KLSMgyasgIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIE1JRERMRSBUSUxERV0NCi0iXHUwMjZCIiA9PiAibCINCi0NCi0jIMmsICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBCRUxUXQ0KLSJcdTAyNkMiID0+ICJsIg0KLQ0KLSMgya0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFJFVFJPRkxFWCBIT09LXQ0KLSJcdTAyNkQiID0+ICJsIg0KLQ0KLSMg4baFICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBQQUxBVEFMIEhPT0tdDQotIlx1MUQ4NSIgPT4gImwiDQotDQotIyDhuLcgIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIERPVCBCRUxPV10NCi0iXHUxRTM3IiA9PiAibCINCi0NCi0jIOG4uSAgW0xBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggRE9UIEJFTE9XIEFORCBNQUNST05dDQotIlx1MUUzOSIgPT4gImwiDQotDQotIyDhuLsgIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIExJTkUgQkVMT1ddDQotIlx1MUUzQiIgPT4gImwiDQotDQotIyDhuL0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENJUkNVTUZMRVggQkVMT1ddDQotIlx1MUUzRCIgPT4gImwiDQotDQotIyDik5sgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBMXQ0KLSJcdTI0REIiID0+ICJsIg0KLQ0KLSMg4rGhICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBET1VCTEUgQkFSXQ0KLSJcdTJDNjEiID0+ICJsIg0KLQ0KLSMg6p2HICBbTEFUSU4gU01BTEwgTEVUVEVSIEJST0tFTiBMXQ0KLSJcdUE3NDciID0+ICJsIg0KLQ0KLSMg6p2JICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBISUdIIFNUUk9LRV0NCi0iXHVBNzQ5IiA9PiAibCINCi0NCi0jIOqegSAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgTF0NCi0iXHVBNzgxIiA9PiAibCINCi0NCi0jIO+9jCAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgTF0NCi0iXHVGRjRDIiA9PiAibCINCi0NCi0jIMeHICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTEpdDQotIlx1MDFDNyIgPT4gIkxKIg0KLQ0KLSMg4bu6ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTUlERExFLVdFTFNIIExMXQ0KLSJcdTFFRkEiID0+ICJMTCINCi0NCi0jIMeIICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNNQUxMIExFVFRFUiBKXQ0KLSJcdTAxQzgiID0+ICJMaiINCi0NCi0jIOKSpyAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIExdDQotIlx1MjRBNyIgPT4gIihsKSINCi0NCi0jIMeJICBbTEFUSU4gU01BTEwgTEVUVEVSIExKXQ0KLSJcdTAxQzkiID0+ICJsaiINCi0NCi0jIOG7uyAgW0xBVElOIFNNQUxMIExFVFRFUiBNSURETEUtV0VMU0ggTExdDQotIlx1MUVGQiIgPT4gImxsIg0KLQ0KLSMgyqogIFtMQVRJTiBTTUFMTCBMRVRURVIgTFMgRElHUkFQSF0NCi0iXHUwMkFBIiA9PiAibHMiDQotDQotIyDKqyAgW0xBVElOIFNNQUxMIExFVFRFUiBMWiBESUdSQVBIXQ0KLSJcdTAyQUIiID0+ICJseiINCi0NCi0jIMacICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVFVSTkVEIE1dDQotIlx1MDE5QyIgPT4gIk0iDQotDQotIyDhtI0gIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBNXQ0KLSJcdTFEMEQiID0+ICJNIg0KLQ0KLSMg4bi+ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTSBXSVRIIEFDVVRFXQ0KLSJcdTFFM0UiID0+ICJNIg0KLQ0KLSMg4bmAICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTSBXSVRIIERPVCBBQk9WRV0NCi0iXHUxRTQwIiA9PiAiTSINCi0NCi0jIOG5giAgW0xBVElOIENBUElUQUwgTEVUVEVSIE0gV0lUSCBET1QgQkVMT1ddDQotIlx1MUU0MiIgPT4gIk0iDQotDQotIyDik4IgIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIE1dDQotIlx1MjRDMiIgPT4gIk0iDQotDQotIyDisa4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBNIFdJVEggSE9PS10NCi0iXHUyQzZFIiA9PiAiTSINCi0NCi0jIOqfvSAgW0xBVElOIEVQSUdSQVBISUMgTEVUVEVSIElOVkVSVEVEIE1dDQotIlx1QTdGRCIgPT4gIk0iDQotDQotIyDqn78gIFtMQVRJTiBFUElHUkFQSElDIExFVFRFUiBBUkNIQUlDIE1dDQotIlx1QTdGRiIgPT4gIk0iDQotDQotIyDvvK0gIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgTV0NCi0iXHVGRjJEIiA9PiAiTSINCi0NCi0jIMmvICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBNXQ0KLSJcdTAyNkYiID0+ICJtIg0KLQ0KLSMgybAgIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIE0gV0lUSCBMT05HIExFR10NCi0iXHUwMjcwIiA9PiAibSINCi0NCi0jIMmxICBbTEFUSU4gU01BTEwgTEVUVEVSIE0gV0lUSCBIT09LXQ0KLSJcdTAyNzEiID0+ICJtIg0KLQ0KLSMg4bWvICBbTEFUSU4gU01BTEwgTEVUVEVSIE0gV0lUSCBNSURETEUgVElMREVdDQotIlx1MUQ2RiIgPT4gIm0iDQotDQotIyDhtoYgIFtMQVRJTiBTTUFMTCBMRVRURVIgTSBXSVRIIFBBTEFUQUwgSE9PS10NCi0iXHUxRDg2IiA9PiAibSINCi0NCi0jIOG4vyAgW0xBVElOIFNNQUxMIExFVFRFUiBNIFdJVEggQUNVVEVdDQotIlx1MUUzRiIgPT4gIm0iDQotDQotIyDhuYEgIFtMQVRJTiBTTUFMTCBMRVRURVIgTSBXSVRIIERPVCBBQk9WRV0NCi0iXHUxRTQxIiA9PiAibSINCi0NCi0jIOG5gyAgW0xBVElOIFNNQUxMIExFVFRFUiBNIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFNDMiID0+ICJtIg0KLQ0KLSMg4pOcICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgTV0NCi0iXHUyNERDIiA9PiAibSINCi0NCi0jIO+9jSAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgTV0NCi0iXHVGRjREIiA9PiAibSINCi0NCi0jIOKSqCAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIE1dDQotIlx1MjRBOCIgPT4gIihtKSINCi0NCi0jIMORICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFXQ0KLSJcdTAwRDEiID0+ICJOIg0KLQ0KLSMgxYMgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQUNVVEVdDQotIlx1MDE0MyIgPT4gIk4iDQotDQotIyDFhSAgW0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBXQ0KLSJcdTAxNDUiID0+ICJOIg0KLQ0KLSMgxYcgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0FST05dDQotIlx1MDE0NyIgPT4gIk4iDQotDQotIyDFiiAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbmdfKGxldHRlcikgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFTkddDQotIlx1MDE0QSIgPT4gIk4iDQotDQotIyDGnSAgW0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBMRUZUIEhPT0tdDQotIlx1MDE5RCIgPT4gIk4iDQotDQotIyDHuCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBHUkFWRV0NCi0iXHUwMUY4IiA9PiAiTiINCi0NCi0jIMigICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIExPTkcgUklHSFQgTEVHXQ0KLSJcdTAyMjAiID0+ICJOIg0KLQ0KLSMgybQgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBOXQ0KLSJcdTAyNzQiID0+ICJOIg0KLQ0KLSMg4bSOICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgUkVWRVJTRUQgTl0NCi0iXHUxRDBFIiA9PiAiTiINCi0NCi0jIOG5hCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBET1QgQUJPVkVdDQotIlx1MUU0NCIgPT4gIk4iDQotDQotIyDhuYYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFNDYiID0+ICJOIg0KLQ0KLSMg4bmIICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIExJTkUgQkVMT1ddDQotIlx1MUU0OCIgPT4gIk4iDQotDQotIyDhuYogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10NCi0iXHUxRTRBIiA9PiAiTiINCi0NCi0jIOKTgyAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTl0NCi0iXHUyNEMzIiA9PiAiTiINCi0NCi0jIO+8riAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBOXQ0KLSJcdUZGMkUiID0+ICJOIg0KLQ0KLSMgw7EgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFXQ0KLSJcdTAwRjEiID0+ICJuIg0KLQ0KLSMgxYQgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFXQ0KLSJcdTAxNDQiID0+ICJuIg0KLQ0KLSMgxYYgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEFdDQotIlx1MDE0NiIgPT4gIm4iDQotDQotIyDFiCAgW0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0FST05dDQotIlx1MDE0OCIgPT4gIm4iDQotDQotIyDFiSAgW0xBVElOIFNNQUxMIExFVFRFUiBOIFBSRUNFREVEIEJZIEFQT1NUUk9QSEVdDQotIlx1MDE0OSIgPT4gIm4iDQotDQotIyDFiyAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbmdfKGxldHRlcikgIFtMQVRJTiBTTUFMTCBMRVRURVIgRU5HXQ0KLSJcdTAxNEIiID0+ICJuIg0KLQ0KLSMgxp4gIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIExPTkcgUklHSFQgTEVHXQ0KLSJcdTAxOUUiID0+ICJuIg0KLQ0KLSMgx7kgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEdSQVZFXQ0KLSJcdTAxRjkiID0+ICJuIg0KLQ0KLSMgyLUgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENVUkxdDQotIlx1MDIzNSIgPT4gIm4iDQotDQotIyDJsiAgW0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggTEVGVCBIT09LXQ0KLSJcdTAyNzIiID0+ICJuIg0KLQ0KLSMgybMgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFJFVFJPRkxFWCBIT09LXQ0KLSJcdTAyNzMiID0+ICJuIg0KLQ0KLSMg4bWwICBbTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBNSURETEUgVElMREVdDQotIlx1MUQ3MCIgPT4gIm4iDQotDQotIyDhtocgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFBBTEFUQUwgSE9PS10NCi0iXHUxRDg3IiA9PiAibiINCi0NCi0jIOG5hSAgW0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTFFNDUiID0+ICJuIg0KLQ0KLSMg4bmHICBbTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBET1QgQkVMT1ddDQotIlx1MUU0NyIgPT4gIm4iDQotDQotIyDhuYkgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIExJTkUgQkVMT1ddDQotIlx1MUU0OSIgPT4gIm4iDQotDQotIyDhuYsgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENJUkNVTUZMRVggQkVMT1ddDQotIlx1MUU0QiIgPT4gIm4iDQotDQotIyDigb8gIFtTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTl0NCi0iXHUyMDdGIiA9PiAibiINCi0NCi0jIOKTnSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIE5dDQotIlx1MjRERCIgPT4gIm4iDQotDQotIyDvvY4gIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIE5dDQotIlx1RkY0RSIgPT4gIm4iDQotDQotIyDHiiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE5KXQ0KLSJcdTAxQ0EiID0+ICJOSiINCi0NCi0jIMeLICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFNNQUxMIExFVFRFUiBKXQ0KLSJcdTAxQ0IiID0+ICJOaiINCi0NCi0jIOKSqSAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIE5dDQotIlx1MjRBOSIgPT4gIihuKSINCi0NCi0jIMeMICBbTEFUSU4gU01BTEwgTEVUVEVSIE5KXQ0KLSJcdTAxQ0MiID0+ICJuaiINCi0NCi0jIMOSICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFXQ0KLSJcdTAwRDIiID0+ICJPIg0KLQ0KLSMgw5MgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEVdDQotIlx1MDBEMyIgPT4gIk8iDQotDQotIyDDlCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYXQ0KLSJcdTAwRDQiID0+ICJPIg0KLQ0KLSMgw5UgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREVdDQotIlx1MDBENSIgPT4gIk8iDQotDQotIyDDliAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVNdDQotIlx1MDBENiIgPT4gIk8iDQotDQotIyDDmCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0VdDQotIlx1MDBEOCIgPT4gIk8iDQotDQotIyDFjCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST05dDQotIlx1MDE0QyIgPT4gIk8iDQotDQotIyDFjiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBCUkVWRV0NCi0iXHUwMTRFIiA9PiAiTyINCi0NCi0jIMWQICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURV0NCi0iXHUwMTUwIiA9PiAiTyINCi0NCi0jIMaGICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgT1BFTiBPXQ0KLSJcdTAxODYiID0+ICJPIg0KLQ0KLSMgxp8gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUlERExFIFRJTERFXQ0KLSJcdTAxOUYiID0+ICJPIg0KLQ0KLSMgxqAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STl0NCi0iXHUwMUEwIiA9PiAiTyINCi0NCi0jIMeRICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENBUk9OXQ0KLSJcdTAxRDEiID0+ICJPIg0KLQ0KLSMgx6ogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggT0dPTkVLXQ0KLSJcdTAxRUEiID0+ICJPIg0KLQ0KLSMgx6wgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggT0dPTkVLIEFORCBNQUNST05dDQotIlx1MDFFQyIgPT4gIk8iDQotDQotIyDHviAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgQU5EIEFDVVRFXQ0KLSJcdTAxRkUiID0+ICJPIg0KLQ0KLSMgyIwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRE9VQkxFIEdSQVZFXQ0KLSJcdTAyMEMiID0+ICJPIg0KLQ0KLSMgyI4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSU5WRVJURUQgQlJFVkVdDQotIlx1MDIwRSIgPT4gIk8iDQotDQotIyDIqiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMgQU5EIE1BQ1JPTl0NCi0iXHUwMjJBIiA9PiAiTyINCi0NCi0jIMisICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFIEFORCBNQUNST05dDQotIlx1MDIyQyIgPT4gIk8iDQotDQotIyDIriAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1QgQUJPVkVdDQotIlx1MDIyRSIgPT4gIk8iDQotDQotIyDIsCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1QgQUJPVkUgQU5EIE1BQ1JPTl0NCi0iXHUwMjMwIiA9PiAiTyINCi0NCi0jIOG0jyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIE9dDQotIlx1MUQwRiIgPT4gIk8iDQotDQotIyDhtJAgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBPUEVOIE9dDQotIlx1MUQxMCIgPT4gIk8iDQotDQotIyDhuYwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUgQU5EIEFDVVRFXQ0KLSJcdTFFNEMiID0+ICJPIg0KLQ0KLSMg4bmOICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFIEFORCBESUFFUkVTSVNdDQotIlx1MUU0RSIgPT4gIk8iDQotDQotIyDhuZAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OIEFORCBHUkFWRV0NCi0iXHUxRTUwIiA9PiAiTyINCi0NCi0jIOG5kiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST04gQU5EIEFDVVRFXQ0KLSJcdTFFNTIiID0+ICJPIg0KLQ0KLSMg4buMICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVCBCRUxPV10NCi0iXHUxRUNDIiA9PiAiTyINCi0NCi0jIOG7jiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBIT09LIEFCT1ZFXQ0KLSJcdTFFQ0UiID0+ICJPIg0KLQ0KLSMg4buQICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFXQ0KLSJcdTFFRDAiID0+ICJPIg0KLQ0KLSMg4buSICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFXQ0KLSJcdTFFRDIiID0+ICJPIg0KLQ0KLSMg4buUICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkVdDQotIlx1MUVENCIgPT4gIk8iDQotDQotIyDhu5YgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgVElMREVdDQotIlx1MUVENiIgPT4gIk8iDQotDQotIyDhu5ggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgRE9UIEJFTE9XXQ0KLSJcdTFFRDgiID0+ICJPIg0KLQ0KLSMg4buaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEFDVVRFXQ0KLSJcdTFFREEiID0+ICJPIg0KLQ0KLSMg4bucICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEdSQVZFXQ0KLSJcdTFFREMiID0+ICJPIg0KLQ0KLSMg4bueICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEhPT0sgQUJPVkVdDQotIlx1MUVERSIgPT4gIk8iDQotDQotIyDhu6AgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgVElMREVdDQotIlx1MUVFMCIgPT4gIk8iDQotDQotIyDhu6IgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgRE9UIEJFTE9XXQ0KLSJcdTFFRTIiID0+ICJPIg0KLQ0KLSMg4pOEICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPXQ0KLSJcdTI0QzQiID0+ICJPIg0KLQ0KLSMg6p2KICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIExPTkcgU1RST0tFIE9WRVJMQVldDQotIlx1QTc0QSIgPT4gIk8iDQotDQotIyDqnYwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTE9PUF0NCi0iXHVBNzRDIiA9PiAiTyINCi0NCi0jIO+8ryAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPXQ0KLSJcdUZGMkYiID0+ICJPIg0KLQ0KLSMgw7IgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFXQ0KLSJcdTAwRjIiID0+ICJvIg0KLQ0KLSMgw7MgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFXQ0KLSJcdTAwRjMiID0+ICJvIg0KLQ0KLSMgw7QgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVhdDQotIlx1MDBGNCIgPT4gIm8iDQotDQotIyDDtSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREVdDQotIlx1MDBGNSIgPT4gIm8iDQotDQotIyDDtiAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTXQ0KLSJcdTAwRjYiID0+ICJvIg0KLQ0KLSMgw7ggIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRV0NCi0iXHUwMEY4IiA9PiAibyINCi0NCi0jIMWNICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST05dDQotIlx1MDE0RCIgPT4gIm8iDQotDQotIyDFjyAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQlJFVkVdDQotIlx1MDE0RiIgPT4gIm8iDQotDQotIyDFkSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFXQ0KLSJcdTAxNTEiID0+ICJvIg0KLQ0KLSMgxqEgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk5dDQotIlx1MDFBMSIgPT4gIm8iDQotDQotIyDHkiAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0FST05dDQotIlx1MDFEMiIgPT4gIm8iDQotDQotIyDHqyAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggT0dPTkVLXQ0KLSJcdTAxRUIiID0+ICJvIg0KLQ0KLSMgx60gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIE9HT05FSyBBTkQgTUFDUk9OXQ0KLSJcdTAxRUQiID0+ICJvIg0KLQ0KLSMgx78gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRSBBTkQgQUNVVEVdDQotIlx1MDFGRiIgPT4gIm8iDQotDQotIyDIjSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEdSQVZFXQ0KLSJcdTAyMEQiID0+ICJvIg0KLQ0KLSMgyI8gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIElOVkVSVEVEIEJSRVZFXQ0KLSJcdTAyMEYiID0+ICJvIg0KLQ0KLSMgyKsgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyBBTkQgTUFDUk9OXQ0KLSJcdTAyMkIiID0+ICJvIg0KLQ0KLSMgyK0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFIEFORCBNQUNST05dDQotIlx1MDIyRCIgPT4gIm8iDQotDQotIyDIryAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTAyMkYiID0+ICJvIg0KLQ0KLSMgyLEgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVCBBQk9WRSBBTkQgTUFDUk9OXQ0KLSJcdTAyMzEiID0+ICJvIg0KLQ0KLSMgyZQgIFtMQVRJTiBTTUFMTCBMRVRURVIgT1BFTiBPXQ0KLSJcdTAyNTQiID0+ICJvIg0KLQ0KLSMgybUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQkFSUkVEIE9dDQotIlx1MDI3NSIgPT4gIm8iDQotDQotIyDhtJYgIFtMQVRJTiBTTUFMTCBMRVRURVIgVE9QIEhBTEYgT10NCi0iXHUxRDE2IiA9PiAibyINCi0NCi0jIOG0lyAgW0xBVElOIFNNQUxMIExFVFRFUiBCT1RUT00gSEFMRiBPXQ0KLSJcdTFEMTciID0+ICJvIg0KLQ0KLSMg4baXICBbTEFUSU4gU01BTEwgTEVUVEVSIE9QRU4gTyBXSVRIIFJFVFJPRkxFWCBIT09LXQ0KLSJcdTFEOTciID0+ICJvIg0KLQ0KLSMg4bmNICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERSBBTkQgQUNVVEVdDQotIlx1MUU0RCIgPT4gIm8iDQotDQotIyDhuY8gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFIEFORCBESUFFUkVTSVNdDQotIlx1MUU0RiIgPT4gIm8iDQotDQotIyDhuZEgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIE1BQ1JPTiBBTkQgR1JBVkVdDQotIlx1MUU1MSIgPT4gIm8iDQotDQotIyDhuZMgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIE1BQ1JPTiBBTkQgQUNVVEVdDQotIlx1MUU1MyIgPT4gIm8iDQotDQotIyDhu40gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVCBCRUxPV10NCi0iXHUxRUNEIiA9PiAibyINCi0NCi0jIOG7jyAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9PSyBBQk9WRV0NCi0iXHUxRUNGIiA9PiAibyINCi0NCi0jIOG7kSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEVdDQotIlx1MUVEMSIgPT4gIm8iDQotDQotIyDhu5MgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFXQ0KLSJcdTFFRDMiID0+ICJvIg0KLQ0KLSMg4buVICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBIT09LIEFCT1ZFXQ0KLSJcdTFFRDUiID0+ICJvIg0KLQ0KLSMg4buXICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERV0NCi0iXHUxRUQ3IiA9PiAibyINCi0NCi0jIOG7mSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgRE9UIEJFTE9XXQ0KLSJcdTFFRDkiID0+ICJvIg0KLQ0KLSMg4bubICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBBQ1VURV0NCi0iXHUxRURCIiA9PiAibyINCi0NCi0jIOG7nSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgR1JBVkVdDQotIlx1MUVERCIgPT4gIm8iDQotDQotIyDhu58gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEhPT0sgQUJPVkVdDQotIlx1MUVERiIgPT4gIm8iDQotDQotIyDhu6EgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIFRJTERFXQ0KLSJcdTFFRTEiID0+ICJvIg0KLQ0KLSMg4bujICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBET1QgQkVMT1ddDQotIlx1MUVFMyIgPT4gIm8iDQotDQotIyDigpIgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIE9dDQotIlx1MjA5MiIgPT4gIm8iDQotDQotIyDik54gIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBPXQ0KLSJcdTI0REUiID0+ICJvIg0KLQ0KLSMg4rG6ICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBMT1cgUklORyBJTlNJREVdDQotIlx1MkM3QSIgPT4gIm8iDQotDQotIyDqnYsgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIExPTkcgU1RST0tFIE9WRVJMQVldDQotIlx1QTc0QiIgPT4gIm8iDQotDQotIyDqnY0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIExPT1BdDQotIlx1QTc0RCIgPT4gIm8iDQotDQotIyDvvY8gIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIE9dDQotIlx1RkY0RiIgPT4gIm8iDQotDQotIyDFkiAgW0xBVElOIENBUElUQUwgTElHQVRVUkUgT0VdDQotIlx1MDE1MiIgPT4gIk9FIg0KLQ0KLSMgybYgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBPRV0NCi0iXHUwMjc2IiA9PiAiT0UiDQotDQotIyDqnY4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPT10NCi0iXHVBNzRFIiA9PiAiT08iDQotDQotIyDIoiAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PVSAgW0xBVElOIENBUElUQUwgTEVUVEVSIE9VXQ0KLSJcdTAyMjIiID0+ICJPVSINCi0NCi0jIOG0lSAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIE9VXQ0KLSJcdTFEMTUiID0+ICJPVSINCi0NCi0jIOKSqiAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIE9dDQotIlx1MjRBQSIgPT4gIihvKSINCi0NCi0jIMWTICBbTEFUSU4gU01BTEwgTElHQVRVUkUgT0VdDQotIlx1MDE1MyIgPT4gIm9lIg0KLQ0KLSMg4bSUICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBPRV0NCi0iXHUxRDE0IiA9PiAib2UiDQotDQotIyDqnY8gIFtMQVRJTiBTTUFMTCBMRVRURVIgT09dDQotIlx1QTc0RiIgPT4gIm9vIg0KLQ0KLSMgyKMgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT1UgIFtMQVRJTiBTTUFMTCBMRVRURVIgT1VdDQotIlx1MDIyMyIgPT4gIm91Ig0KLQ0KLSMgxqQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggSE9PS10NCi0iXHUwMUE0IiA9PiAiUCINCi0NCi0jIOG0mCAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIFBdDQotIlx1MUQxOCIgPT4gIlAiDQotDQotIyDhuZQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggQUNVVEVdDQotIlx1MUU1NCIgPT4gIlAiDQotDQotIyDhuZYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTFFNTYiID0+ICJQIg0KLQ0KLSMg4pOFICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBQXQ0KLSJcdTI0QzUiID0+ICJQIg0KLQ0KLSMg4rGjICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUCBXSVRIIFNUUk9LRV0NCi0iXHUyQzYzIiA9PiAiUCINCi0NCi0jIOqdkCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFAgV0lUSCBTVFJPS0UgVEhST1VHSCBERVNDRU5ERVJdDQotIlx1QTc1MCIgPT4gIlAiDQotDQotIyDqnZIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggRkxPVVJJU0hdDQotIlx1QTc1MiIgPT4gIlAiDQotDQotIyDqnZQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggU1FVSVJSRUwgVEFJTF0NCi0iXHVBNzU0IiA9PiAiUCINCi0NCi0jIO+8sCAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBQXQ0KLSJcdUZGMzAiID0+ICJQIg0KLQ0KLSMgxqUgIFtMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIEhPT0tdDQotIlx1MDFBNSIgPT4gInAiDQotDQotIyDhtbEgIFtMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIE1JRERMRSBUSUxERV0NCi0iXHUxRDcxIiA9PiAicCINCi0NCi0jIOG1vSAgW0xBVElOIFNNQUxMIExFVFRFUiBQIFdJVEggU1RST0tFXQ0KLSJcdTFEN0QiID0+ICJwIg0KLQ0KLSMg4baIICBbTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBQQUxBVEFMIEhPT0tdDQotIlx1MUQ4OCIgPT4gInAiDQotDQotIyDhuZUgIFtMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIEFDVVRFXQ0KLSJcdTFFNTUiID0+ICJwIg0KLQ0KLSMg4bmXICBbTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBET1QgQUJPVkVdDQotIlx1MUU1NyIgPT4gInAiDQotDQotIyDik58gIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBQXQ0KLSJcdTI0REYiID0+ICJwIg0KLQ0KLSMg6p2RICBbTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBTVFJPS0UgVEhST1VHSCBERVNDRU5ERVJdDQotIlx1QTc1MSIgPT4gInAiDQotDQotIyDqnZMgIFtMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIEZMT1VSSVNIXQ0KLSJcdUE3NTMiID0+ICJwIg0KLQ0KLSMg6p2VICBbTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBTUVVJUlJFTCBUQUlMXQ0KLSJcdUE3NTUiID0+ICJwIg0KLQ0KLSMg6p+8ICBbTEFUSU4gRVBJR1JBUEhJQyBMRVRURVIgUkVWRVJTRUQgUF0NCi0iXHVBN0ZDIiA9PiAicCINCi0NCi0jIO+9kCAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgUF0NCi0iXHVGRjUwIiA9PiAicCINCi0NCi0jIOKSqyAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIFBdDQotIlx1MjRBQiIgPT4gIihwKSINCi0NCi0jIMmKICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgU01BTEwgUSBXSVRIIEhPT0sgVEFJTF0NCi0iXHUwMjRBIiA9PiAiUSINCi0NCi0jIOKThiAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUV0NCi0iXHUyNEM2IiA9PiAiUSINCi0NCi0jIOqdliAgW0xBVElOIENBUElUQUwgTEVUVEVSIFEgV0lUSCBTVFJPS0UgVEhST1VHSCBERVNDRU5ERVJdDQotIlx1QTc1NiIgPT4gIlEiDQotDQotIyDqnZggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBRIFdJVEggRElBR09OQUwgU1RST0tFXQ0KLSJcdUE3NTgiID0+ICJRIg0KLQ0KLSMg77yxICBbRlVMTFdJRFRIIExBVElOIENBUElUQUwgTEVUVEVSIFFdDQotIlx1RkYzMSIgPT4gIlEiDQotDQotIyDEuCAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9LcmFfKGxldHRlcikgIFtMQVRJTiBTTUFMTCBMRVRURVIgS1JBXQ0KLSJcdTAxMzgiID0+ICJxIg0KLQ0KLSMgyYsgIFtMQVRJTiBTTUFMTCBMRVRURVIgUSBXSVRIIEhPT0sgVEFJTF0NCi0iXHUwMjRCIiA9PiAicSINCi0NCi0jIMqgICBbTEFUSU4gU01BTEwgTEVUVEVSIFEgV0lUSCBIT09LXQ0KLSJcdTAyQTAiID0+ICJxIg0KLQ0KLSMg4pOgICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgUV0NCi0iXHUyNEUwIiA9PiAicSINCi0NCi0jIOqdlyAgW0xBVElOIFNNQUxMIExFVFRFUiBRIFdJVEggU1RST0tFIFRIUk9VR0ggREVTQ0VOREVSXQ0KLSJcdUE3NTciID0+ICJxIg0KLQ0KLSMg6p2ZICBbTEFUSU4gU01BTEwgTEVUVEVSIFEgV0lUSCBESUFHT05BTCBTVFJPS0VdDQotIlx1QTc1OSIgPT4gInEiDQotDQotIyDvvZEgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIFFdDQotIlx1RkY1MSIgPT4gInEiDQotDQotIyDikqwgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBRXQ0KLSJcdTI0QUMiID0+ICIocSkiDQotDQotIyDIuSAgW0xBVElOIFNNQUxMIExFVFRFUiBRUCBESUdSQVBIXQ0KLSJcdTAyMzkiID0+ICJxcCINCi0NCi0jIMWUICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIEFDVVRFXQ0KLSJcdTAxNTQiID0+ICJSIg0KLQ0KLSMgxZYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0VESUxMQV0NCi0iXHUwMTU2IiA9PiAiUiINCi0NCi0jIMWYICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENBUk9OXQ0KLSJcdTAxNTgiID0+ICJSIg0KLQ0KLSMgyJIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggRE9VQkxFIEdSQVZFXQ0KLSJcdTAyMTAiID0+ICJSIg0KLQ0KLSMgyJIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggSU5WRVJURUQgQlJFVkVdDQotIlx1MDIxMiIgPT4gIlIiDQotDQotIyDJjCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBTVFJPS0VdDQotIlx1MDI0QyIgPT4gIlIiDQotDQotIyDKgCAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIFJdDQotIlx1MDI4MCIgPT4gIlIiDQotDQotIyDKgSAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIElOVkVSVEVEIFJdDQotIlx1MDI4MSIgPT4gIlIiDQotDQotIyDhtJkgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBSRVZFUlNFRCBSXQ0KLSJcdTFEMTkiID0+ICJSIg0KLQ0KLSMg4bSaICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgVFVSTkVEIFJdDQotIlx1MUQxQSIgPT4gIlIiDQotDQotIyDhuZggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTFFNTgiID0+ICJSIg0KLQ0KLSMg4bmaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIERPVCBCRUxPV10NCi0iXHUxRTVBIiA9PiAiUiINCi0NCi0jIOG5nCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBET1QgQkVMT1cgQU5EIE1BQ1JPTl0NCi0iXHUxRTVDIiA9PiAiUiINCi0NCi0jIOG5niAgW0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBMSU5FIEJFTE9XXQ0KLSJcdTFFNUUiID0+ICJSIg0KLQ0KLSMg4pOHICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBSXQ0KLSJcdTI0QzciID0+ICJSIg0KLQ0KLSMg4rGkICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIFRBSUxdDQotIlx1MkM2NCIgPT4gIlIiDQotDQotIyDqnZogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFJPVFVOREFdDQotIlx1QTc1QSIgPT4gIlIiDQotDQotIyDqnoIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJTlNVTEFSIFJdDQotIlx1QTc4MiIgPT4gIlIiDQotDQotIyDvvLIgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgUl0NCi0iXHVGRjMyIiA9PiAiUiINCi0NCi0jIMWVICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBBQ1VURV0NCi0iXHUwMTU1IiA9PiAiciINCi0NCi0jIMWXICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDRURJTExBXQ0KLSJcdTAxNTciID0+ICJyIg0KLQ0KLSMgxZkgIFtMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENBUk9OXQ0KLSJcdTAxNTkiID0+ICJyIg0KLQ0KLSMgyJEgIFtMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIERPVUJMRSBHUkFWRV0NCi0iXHUwMjExIiA9PiAiciINCi0NCi0jIMiTICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBJTlZFUlRFRCBCUkVWRV0NCi0iXHUwMjEzIiA9PiAiciINCi0NCi0jIMmNICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBTVFJPS0VdDQotIlx1MDI0RCIgPT4gInIiDQotDQotIyDJvCAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggTE9ORyBMRUddDQotIlx1MDI3QyIgPT4gInIiDQotDQotIyDJvSAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggVEFJTF0NCi0iXHUwMjdEIiA9PiAiciINCi0NCi0jIMm+ICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBGSVNISE9PS10NCi0iXHUwMjdFIiA9PiAiciINCi0NCi0jIMm/ICBbTEFUSU4gU01BTEwgTEVUVEVSIFJFVkVSU0VEIFIgV0lUSCBGSVNISE9PS10NCi0iXHUwMjdGIiA9PiAiciINCi0NCi0jIOG1oyAgW0xBVElOIFNVQlNDUklQVCBTTUFMTCBMRVRURVIgUl0NCi0iXHUxRDYzIiA9PiAiciINCi0NCi0jIOG1siAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggTUlERExFIFRJTERFXQ0KLSJcdTFENzIiID0+ICJyIg0KLQ0KLSMg4bWzICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBGSVNISE9PSyBBTkQgTUlERExFIFRJTERFXQ0KLSJcdTFENzMiID0+ICJyIg0KLQ0KLSMg4baJICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBQQUxBVEFMIEhPT0tdDQotIlx1MUQ4OSIgPT4gInIiDQotDQotIyDhuZkgIFtMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIERPVCBBQk9WRV0NCi0iXHUxRTU5IiA9PiAiciINCi0NCi0jIOG5myAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFNUIiID0+ICJyIg0KLQ0KLSMg4bmdICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBET1QgQkVMT1cgQU5EIE1BQ1JPTl0NCi0iXHUxRTVEIiA9PiAiciINCi0NCi0jIOG5nyAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggTElORSBCRUxPV10NCi0iXHUxRTVGIiA9PiAiciINCi0NCi0jIOKToSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFJdDQotIlx1MjRFMSIgPT4gInIiDQotDQotIyDqnZsgIFtMQVRJTiBTTUFMTCBMRVRURVIgUiBST1RVTkRBXQ0KLSJcdUE3NUIiID0+ICJyIg0KLQ0KLSMg6p6DICBbTEFUSU4gU01BTEwgTEVUVEVSIElOU1VMQVIgUl0NCi0iXHVBNzgzIiA9PiAiciINCi0NCi0jIO+9kiAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgUl0NCi0iXHVGRjUyIiA9PiAiciINCi0NCi0jIOKSrSAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIFJdDQotIlx1MjRBRCIgPT4gIihyKSINCi0NCi0jIMWaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIEFDVVRFXQ0KLSJcdTAxNUEiID0+ICJTIg0KLQ0KLSMgxZwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0lSQ1VNRkxFWF0NCi0iXHUwMTVDIiA9PiAiUyINCi0NCi0jIMWeICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEFdDQotIlx1MDE1RSIgPT4gIlMiDQotDQotIyDFoCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTl0NCi0iXHUwMTYwIiA9PiAiUyINCi0NCi0jIMiYICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENPTU1BIEJFTE9XXQ0KLSJcdTAyMTgiID0+ICJTIg0KLQ0KLSMg4bmgICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIERPVCBBQk9WRV0NCi0iXHUxRTYwIiA9PiAiUyINCi0NCi0jIOG5oiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBET1QgQkVMT1ddDQotIlx1MUU2MiIgPT4gIlMiDQotDQotIyDhuaQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUgQU5EIERPVCBBQk9WRV0NCi0iXHUxRTY0IiA9PiAiUyINCi0NCi0jIOG5piAgW0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTiBBTkQgRE9UIEFCT1ZFXQ0KLSJcdTFFNjYiID0+ICJTIg0KLQ0KLSMg4bmoICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIERPVCBCRUxPVyBBTkQgRE9UIEFCT1ZFXQ0KLSJcdTFFNjgiID0+ICJTIg0KLQ0KLSMg4pOIICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBTXQ0KLSJcdTI0QzgiID0+ICJTIg0KLQ0KLSMg6pyxICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgU10NCi0iXHVBNzMxIiA9PiAiUyINCi0NCi0jIOqehSAgW0xBVElOIFNNQUxMIExFVFRFUiBJTlNVTEFSIFNdDQotIlx1QTc4NSIgPT4gIlMiDQotDQotIyDvvLMgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgU10NCi0iXHVGRjMzIiA9PiAiUyINCi0NCi0jIMWbICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURV0NCi0iXHUwMTVCIiA9PiAicyINCi0NCi0jIMWdICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDSVJDVU1GTEVYXQ0KLSJcdTAxNUQiID0+ICJzIg0KLQ0KLSMgxZ8gIFtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEFdDQotIlx1MDE1RiIgPT4gInMiDQotDQotIyDFoSAgW0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST05dDQotIlx1MDE2MSIgPT4gInMiDQotDQotIyDFvyAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb25nX1MgIFtMQVRJTiBTTUFMTCBMRVRURVIgTE9ORyBTXQ0KLSJcdTAxN0YiID0+ICJzIg0KLQ0KLSMgyJkgIFtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENPTU1BIEJFTE9XXQ0KLSJcdTAyMTkiID0+ICJzIg0KLQ0KLSMgyL8gIFtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIFNXQVNIIFRBSUxdDQotIlx1MDIzRiIgPT4gInMiDQotDQotIyDKgiAgW0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggSE9PS10NCi0iXHUwMjgyIiA9PiAicyINCi0NCi0jIOG1tCAgW0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggTUlERExFIFRJTERFXQ0KLSJcdTFENzQiID0+ICJzIg0KLQ0KLSMg4baKICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBQQUxBVEFMIEhPT0tdDQotIlx1MUQ4QSIgPT4gInMiDQotDQotIyDhuaEgIFtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIERPVCBBQk9WRV0NCi0iXHUxRTYxIiA9PiAicyINCi0NCi0jIOG5oyAgW0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFNjMiID0+ICJzIg0KLQ0KLSMg4bmlICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURSBBTkQgRE9UIEFCT1ZFXQ0KLSJcdTFFNjUiID0+ICJzIg0KLQ0KLSMg4bmnICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTiBBTkQgRE9UIEFCT1ZFXQ0KLSJcdTFFNjciID0+ICJzIg0KLQ0KLSMg4bmpICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBET1QgQkVMT1cgQU5EIERPVCBBQk9WRV0NCi0iXHUxRTY5IiA9PiAicyINCi0NCi0jIOG6nCAgW0xBVElOIFNNQUxMIExFVFRFUiBMT05HIFMgV0lUSCBESUFHT05BTCBTVFJPS0VdDQotIlx1MUU5QyIgPT4gInMiDQotDQotIyDhup0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTE9ORyBTIFdJVEggSElHSCBTVFJPS0VdDQotIlx1MUU5RCIgPT4gInMiDQotDQotIyDik6IgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBTXQ0KLSJcdTI0RTIiID0+ICJzIg0KLQ0KLSMg6p6EICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSU5TVUxBUiBTXQ0KLSJcdUE3ODQiID0+ICJzIg0KLQ0KLSMg772TICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBTXQ0KLSJcdUZGNTMiID0+ICJzIg0KLQ0KLSMg4bqeICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgU0hBUlAgU10NCi0iXHUxRTlFIiA9PiAiU1MiDQotDQotIyDikq4gIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBTXQ0KLSJcdTI0QUUiID0+ICIocykiDQotDQotIyDDnyAgW0xBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTXQ0KLSJcdTAwREYiID0+ICJzcyINCi0NCi0jIO+shiAgW0xBVElOIFNNQUxMIExJR0FUVVJFIFNUXQ0KLSJcdUZCMDYiID0+ICJzdCINCi0NCi0jIMWiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENFRElMTEFdDQotIlx1MDE2MiIgPT4gIlQiDQotDQotIyDFpCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDQVJPTl0NCi0iXHUwMTY0IiA9PiAiVCINCi0NCi0jIMWmICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIFNUUk9LRV0NCi0iXHUwMTY2IiA9PiAiVCINCi0NCi0jIMasICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIEhPT0tdDQotIlx1MDFBQyIgPT4gIlQiDQotDQotIyDGriAgW0xBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBSRVRST0ZMRVggSE9PS10NCi0iXHUwMUFFIiA9PiAiVCINCi0NCi0jIMiaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENPTU1BIEJFTE9XXQ0KLSJcdTAyMUEiID0+ICJUIg0KLQ0KLSMgyL4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggRElBR09OQUwgU1RST0tFXQ0KLSJcdTAyM0UiID0+ICJUIg0KLQ0KLSMg4bSbICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgVF0NCi0iXHUxRDFCIiA9PiAiVCINCi0NCi0jIOG5qiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkVdDQotIlx1MUU2QSIgPT4gIlQiDQotDQotIyDhuawgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFNkMiID0+ICJUIg0KLQ0KLSMg4bmuICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIExJTkUgQkVMT1ddDQotIlx1MUU2RSIgPT4gIlQiDQotDQotIyDhubAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10NCi0iXHUxRTcwIiA9PiAiVCINCi0NCi0jIOKTiSAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVF0NCi0iXHUyNEM5IiA9PiAiVCINCi0NCi0jIOqehiAgW0xBVElOIENBUElUQUwgTEVUVEVSIElOU1VMQVIgVF0NCi0iXHVBNzg2IiA9PiAiVCINCi0NCi0jIO+8tCAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBUXQ0KLSJcdUZGMzQiID0+ICJUIg0KLQ0KLSMgxaMgIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENFRElMTEFdDQotIlx1MDE2MyIgPT4gInQiDQotDQotIyDFpSAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0FST05dDQotIlx1MDE2NSIgPT4gInQiDQotDQotIyDFpyAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggU1RST0tFXQ0KLSJcdTAxNjciID0+ICJ0Ig0KLQ0KLSMgxqsgIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIFBBTEFUQUwgSE9PS10NCi0iXHUwMUFCIiA9PiAidCINCi0NCi0jIMatICBbTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBIT09LXQ0KLSJcdTAxQUQiID0+ICJ0Ig0KLQ0KLSMgyJsgIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENPTU1BIEJFTE9XXQ0KLSJcdTAyMUIiID0+ICJ0Ig0KLQ0KLSMgyLYgIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENVUkxdDQotIlx1MDIzNiIgPT4gInQiDQotDQotIyDKhyAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgVF0NCi0iXHUwMjg3IiA9PiAidCINCi0NCi0jIMqIICBbTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBSRVRST0ZMRVggSE9PS10NCi0iXHUwMjg4IiA9PiAidCINCi0NCi0jIOG1tSAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggTUlERExFIFRJTERFXQ0KLSJcdTFENzUiID0+ICJ0Ig0KLQ0KLSMg4bmrICBbTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkVdDQotIlx1MUU2QiIgPT4gInQiDQotDQotIyDhua0gIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIERPVCBCRUxPV10NCi0iXHUxRTZEIiA9PiAidCINCi0NCi0jIOG5ryAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggTElORSBCRUxPV10NCi0iXHUxRTZGIiA9PiAidCINCi0NCi0jIOG5sSAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10NCi0iXHUxRTcxIiA9PiAidCINCi0NCi0jIOG6lyAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggRElBRVJFU0lTXQ0KLSJcdTFFOTciID0+ICJ0Ig0KLQ0KLSMg4pOjICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgVF0NCi0iXHUyNEUzIiA9PiAidCINCi0NCi0jIOKxpiAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggRElBR09OQUwgU1RST0tFXQ0KLSJcdTJDNjYiID0+ICJ0Ig0KLQ0KLSMg772UICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBUXQ0KLSJcdUZGNTQiID0+ICJ0Ig0KLQ0KLSMgw54gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STl0NCi0iXHUwMERFIiA9PiAiVEgiDQotDQotIyDqnaYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STiBXSVRIIFNUUk9LRSBUSFJPVUdIIERFU0NFTkRFUl0NCi0iXHVBNzY2IiA9PiAiVEgiDQotDQotIyDqnKggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUWl0NCi0iXHVBNzI4IiA9PiAiVFoiDQotDQotIyDikq8gIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBUXQ0KLSJcdTI0QUYiID0+ICIodCkiDQotDQotIyDKqCAgW0xBVElOIFNNQUxMIExFVFRFUiBUQyBESUdSQVBIIFdJVEggQ1VSTF0NCi0iXHUwMkE4IiA9PiAidGMiDQotDQotIyDDviAgW0xBVElOIFNNQUxMIExFVFRFUiBUSE9STl0NCi0iXHUwMEZFIiA9PiAidGgiDQotDQotIyDhtbogIFtMQVRJTiBTTUFMTCBMRVRURVIgVEggV0lUSCBTVFJJS0VUSFJPVUdIXQ0KLSJcdTFEN0EiID0+ICJ0aCINCi0NCi0jIOqdpyAgW0xBVElOIFNNQUxMIExFVFRFUiBUSE9STiBXSVRIIFNUUk9LRSBUSFJPVUdIIERFU0NFTkRFUl0NCi0iXHVBNzY3IiA9PiAidGgiDQotDQotIyDKpiAgW0xBVElOIFNNQUxMIExFVFRFUiBUUyBESUdSQVBIXQ0KLSJcdTAyQTYiID0+ICJ0cyINCi0NCi0jIOqcqSAgW0xBVElOIFNNQUxMIExFVFRFUiBUWl0NCi0iXHVBNzI5IiA9PiAidHoiDQotDQotIyDDmSAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRV0NCi0iXHUwMEQ5IiA9PiAiVSINCi0NCi0jIMOaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFXQ0KLSJcdTAwREEiID0+ICJVIg0KLQ0KLSMgw5sgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWF0NCi0iXHUwMERCIiA9PiAiVSINCi0NCi0jIMOcICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJU10NCi0iXHUwMERDIiA9PiAiVSINCi0NCi0jIMWoICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFRJTERFXQ0KLSJcdTAxNjgiID0+ICJVIg0KLQ0KLSMgxaogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OXQ0KLSJcdTAxNkEiID0+ICJVIg0KLQ0KLSMgxawgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQlJFVkVdDQotIlx1MDE2QyIgPT4gIlUiDQotDQotIyDFriAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFXQ0KLSJcdTAxNkUiID0+ICJVIg0KLQ0KLSMgxbAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFXQ0KLSJcdTAxNzAiID0+ICJVIg0KLQ0KLSMgxbIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggT0dPTkVLXQ0KLSJcdTAxNzIiID0+ICJVIg0KLQ0KLSMgxq8gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STl0NCi0iXHUwMUFGIiA9PiAiVSINCi0NCi0jIMeTICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENBUk9OXQ0KLSJcdTAxRDMiID0+ICJVIg0KLQ0KLSMgx5UgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTIEFORCBNQUNST05dDQotIlx1MDFENSIgPT4gIlUiDQotDQotIyDHlyAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgQU5EIEFDVVRFXQ0KLSJcdTAxRDciID0+ICJVIg0KLQ0KLSMgx5kgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTIEFORCBDQVJPTl0NCi0iXHUwMUQ5IiA9PiAiVSINCi0NCi0jIMebICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyBBTkQgR1JBVkVdDQotIlx1MDFEQiIgPT4gIlUiDQotDQotIyDIlCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBET1VCTEUgR1JBVkVdDQotIlx1MDIxNCIgPT4gIlUiDQotDQotIyDIliAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBJTlZFUlRFRCBCUkVWRV0NCi0iXHUwMjE2IiA9PiAiVSINCi0NCi0jIMmEICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBCQVJdDQotIlx1MDI0NCIgPT4gIlUiDQotDQotIyDhtJwgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBVXQ0KLSJcdTFEMUMiID0+ICJVIg0KLQ0KLSMg4bW+ICBbTEFUSU4gU01BTEwgQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFNUUk9LRV0NCi0iXHUxRDdFIiA9PiAiVSINCi0NCi0jIOG5siAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgQkVMT1ddDQotIlx1MUU3MiIgPT4gIlUiDQotDQotIyDhubQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggVElMREUgQkVMT1ddDQotIlx1MUU3NCIgPT4gIlUiDQotDQotIyDhubYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10NCi0iXHUxRTc2IiA9PiAiVSINCi0NCi0jIOG5uCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBUSUxERSBBTkQgQUNVVEVdDQotIlx1MUU3OCIgPT4gIlUiDQotDQotIyDhubogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OIEFORCBESUFFUkVTSVNdDQotIlx1MUU3QSIgPT4gIlUiDQotDQotIyDhu6QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFRTQiID0+ICJVIg0KLQ0KLSMg4bumICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEhPT0sgQUJPVkVdDQotIlx1MUVFNiIgPT4gIlUiDQotDQotIyDhu6ggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgQUNVVEVdDQotIlx1MUVFOCIgPT4gIlUiDQotDQotIyDhu6ogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgR1JBVkVdDQotIlx1MUVFQSIgPT4gIlUiDQotDQotIyDhu6wgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgSE9PSyBBQk9WRV0NCi0iXHUxRUVDIiA9PiAiVSINCi0NCi0jIOG7riAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBUSUxERV0NCi0iXHUxRUVFIiA9PiAiVSINCi0NCi0jIOG7sCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBET1QgQkVMT1ddDQotIlx1MUVGMCIgPT4gIlUiDQotDQotIyDik4ogIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIFVdDQotIlx1MjRDQSIgPT4gIlUiDQotDQotIyDvvLUgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgVV0NCi0iXHVGRjM1IiA9PiAiVSINCi0NCi0jIMO5ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRV0NCi0iXHUwMEY5IiA9PiAidSINCi0NCi0jIMO6ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURV0NCi0iXHUwMEZBIiA9PiAidSINCi0NCi0jIMO7ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYXQ0KLSJcdTAwRkIiID0+ICJ1Ig0KLQ0KLSMgw7wgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJU10NCi0iXHUwMEZDIiA9PiAidSINCi0NCi0jIMWpICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBUSUxERV0NCi0iXHUwMTY5IiA9PiAidSINCi0NCi0jIMWrICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST05dDQotIlx1MDE2QiIgPT4gInUiDQotDQotIyDFrSAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQlJFVkVdDQotIlx1MDE2RCIgPT4gInUiDQotDQotIyDFryAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRV0NCi0iXHUwMTZGIiA9PiAidSINCi0NCi0jIMWxICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEVdDQotIlx1MDE3MSIgPT4gInUiDQotDQotIyDFsyAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggT0dPTkVLXQ0KLSJcdTAxNzMiID0+ICJ1Ig0KLQ0KLSMgxrAgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk5dDQotIlx1MDFCMCIgPT4gInUiDQotDQotIyDHlCAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0FST05dDQotIlx1MDFENCIgPT4gInUiDQotDQotIyDHliAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTIEFORCBNQUNST05dDQotIlx1MDFENiIgPT4gInUiDQotDQotIyDHmCAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTIEFORCBBQ1VURV0NCi0iXHUwMUQ4IiA9PiAidSINCi0NCi0jIMeaICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgQU5EIENBUk9OXQ0KLSJcdTAxREEiID0+ICJ1Ig0KLQ0KLSMgx5wgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyBBTkQgR1JBVkVdDQotIlx1MDFEQyIgPT4gInUiDQotDQotIyDIlSAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRE9VQkxFIEdSQVZFXQ0KLSJcdTAyMTUiID0+ICJ1Ig0KLQ0KLSMgyJcgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIElOVkVSVEVEIEJSRVZFXQ0KLSJcdTAyMTciID0+ICJ1Ig0KLQ0KLSMgyokgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBCQVJdDQotIlx1MDI4OSIgPT4gInUiDQotDQotIyDhtaQgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIFVdDQotIlx1MUQ2NCIgPT4gInUiDQotDQotIyDhtpkgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFJFVFJPRkxFWCBIT09LXQ0KLSJcdTFEOTkiID0+ICJ1Ig0KLQ0KLSMg4bmzICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgQkVMT1ddDQotIlx1MUU3MyIgPT4gInUiDQotDQotIyDhubUgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFRJTERFIEJFTE9XXQ0KLSJcdTFFNzUiID0+ICJ1Ig0KLQ0KLSMg4bm3ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYIEJFTE9XXQ0KLSJcdTFFNzciID0+ICJ1Ig0KLQ0KLSMg4bm5ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBUSUxERSBBTkQgQUNVVEVdDQotIlx1MUU3OSIgPT4gInUiDQotDQotIyDhubsgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE1BQ1JPTiBBTkQgRElBRVJFU0lTXQ0KLSJcdTFFN0IiID0+ICJ1Ig0KLQ0KLSMg4bulICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1QgQkVMT1ddDQotIlx1MUVFNSIgPT4gInUiDQotDQotIyDhu6cgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPT0sgQUJPVkVdDQotIlx1MUVFNyIgPT4gInUiDQotDQotIyDhu6kgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIEFDVVRFXQ0KLSJcdTFFRTkiID0+ICJ1Ig0KLQ0KLSMg4burICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBHUkFWRV0NCi0iXHUxRUVCIiA9PiAidSINCi0NCi0jIOG7rSAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgSE9PSyBBQk9WRV0NCi0iXHUxRUVEIiA9PiAidSINCi0NCi0jIOG7ryAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgVElMREVdDQotIlx1MUVFRiIgPT4gInUiDQotDQotIyDhu7EgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIERPVCBCRUxPV10NCi0iXHUxRUYxIiA9PiAidSINCi0NCi0jIOKTpCAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFVdDQotIlx1MjRFNCIgPT4gInUiDQotDQotIyDvvZUgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIFVdDQotIlx1RkY1NSIgPT4gInUiDQotDQotIyDikrAgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBVXQ0KLSJcdTI0QjAiID0+ICIodSkiDQotDQotIyDhtasgIFtMQVRJTiBTTUFMTCBMRVRURVIgVUVdDQotIlx1MUQ2QiIgPT4gInVlIg0KLQ0KLSMgxrIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBWIFdJVEggSE9PS10NCi0iXHUwMUIyIiA9PiAiViINCi0NCi0jIMmFICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVFVSTkVEIFZdDQotIlx1MDI0NSIgPT4gIlYiDQotDQotIyDhtKAgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBWXQ0KLSJcdTFEMjAiID0+ICJWIg0KLQ0KLSMg4bm8ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgViBXSVRIIFRJTERFXQ0KLSJcdTFFN0MiID0+ICJWIg0KLQ0KLSMg4bm+ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgViBXSVRIIERPVCBCRUxPV10NCi0iXHUxRTdFIiA9PiAiViINCi0NCi0jIOG7vCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE1JRERMRS1XRUxTSCBWXQ0KLSJcdTFFRkMiID0+ICJWIg0KLQ0KLSMg4pOLICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBWXQ0KLSJcdTI0Q0IiID0+ICJWIg0KLQ0KLSMg6p2eICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgViBXSVRIIERJQUdPTkFMIFNUUk9LRV0NCi0iXHVBNzVFIiA9PiAiViINCi0NCi0jIOqdqCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFZFTkRdDQotIlx1QTc2OCIgPT4gIlYiDQotDQotIyDvvLYgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgVl0NCi0iXHVGRjM2IiA9PiAiViINCi0NCi0jIMqLICBbTEFUSU4gU01BTEwgTEVUVEVSIFYgV0lUSCBIT09LXQ0KLSJcdTAyOEIiID0+ICJ2Ig0KLQ0KLSMgyowgIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIFZdDQotIlx1MDI4QyIgPT4gInYiDQotDQotIyDhtaUgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIFZdDQotIlx1MUQ2NSIgPT4gInYiDQotDQotIyDhtowgIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIFBBTEFUQUwgSE9PS10NCi0iXHUxRDhDIiA9PiAidiINCi0NCi0jIOG5vSAgW0xBVElOIFNNQUxMIExFVFRFUiBWIFdJVEggVElMREVdDQotIlx1MUU3RCIgPT4gInYiDQotDQotIyDhub8gIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIERPVCBCRUxPV10NCi0iXHUxRTdGIiA9PiAidiINCi0NCi0jIOKTpSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFZdDQotIlx1MjRFNSIgPT4gInYiDQotDQotIyDisbEgIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIFJJR0hUIEhPT0tdDQotIlx1MkM3MSIgPT4gInYiDQotDQotIyDisbQgIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIENVUkxdDQotIlx1MkM3NCIgPT4gInYiDQotDQotIyDqnZ8gIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIERJQUdPTkFMIFNUUk9LRV0NCi0iXHVBNzVGIiA9PiAidiINCi0NCi0jIO+9liAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgVl0NCi0iXHVGRjU2IiA9PiAidiINCi0NCi0jIOqdoCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFZZXQ0KLSJcdUE3NjAiID0+ICJWWSINCi0NCi0jIOKSsSAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIFZdDQotIlx1MjRCMSIgPT4gIih2KSINCi0NCi0jIOqdoSAgW0xBVElOIFNNQUxMIExFVFRFUiBWWV0NCi0iXHVBNzYxIiA9PiAidnkiDQotDQotIyDFtCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBDSVJDVU1GTEVYXQ0KLSJcdTAxNzQiID0+ICJXIg0KLQ0KLSMgx7cgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV3lubiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFdZTk5dDQotIlx1MDFGNyIgPT4gIlciDQotDQotIyDhtKEgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBXXQ0KLSJcdTFEMjEiID0+ICJXIg0KLQ0KLSMg4bqAICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEdSQVZFXQ0KLSJcdTFFODAiID0+ICJXIg0KLQ0KLSMg4bqCICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEFDVVRFXQ0KLSJcdTFFODIiID0+ICJXIg0KLQ0KLSMg4bqEICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIERJQUVSRVNJU10NCi0iXHUxRTg0IiA9PiAiVyINCi0NCi0jIOG6hiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBET1QgQUJPVkVdDQotIlx1MUU4NiIgPT4gIlciDQotDQotIyDhuoggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBXIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFODgiID0+ICJXIg0KLQ0KLSMg4pOMICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBXXQ0KLSJcdTI0Q0MiID0+ICJXIg0KLQ0KLSMg4rGyICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEhPT0tdDQotIlx1MkM3MiIgPT4gIlciDQotDQotIyDvvLcgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgV10NCi0iXHVGRjM3IiA9PiAiVyINCi0NCi0jIMW1ICBbTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBDSVJDVU1GTEVYXQ0KLSJcdTAxNzUiID0+ICJ3Ig0KLQ0KLSMgxr8gIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV3lubiAgW0xBVElOIExFVFRFUiBXWU5OXQ0KLSJcdTAxQkYiID0+ICJ3Ig0KLQ0KLSMgyo0gIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIFddDQotIlx1MDI4RCIgPT4gInciDQotDQotIyDhuoEgIFtMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIEdSQVZFXQ0KLSJcdTFFODEiID0+ICJ3Ig0KLQ0KLSMg4bqDICBbTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBBQ1VURV0NCi0iXHUxRTgzIiA9PiAidyINCi0NCi0jIOG6hSAgW0xBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggRElBRVJFU0lTXQ0KLSJcdTFFODUiID0+ICJ3Ig0KLQ0KLSMg4bqHICBbTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBET1QgQUJPVkVdDQotIlx1MUU4NyIgPT4gInciDQotDQotIyDhuokgIFtMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIERPVCBCRUxPV10NCi0iXHUxRTg5IiA9PiAidyINCi0NCi0jIOG6mCAgW0xBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggUklORyBBQk9WRV0NCi0iXHUxRTk4IiA9PiAidyINCi0NCi0jIOKTpiAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFddDQotIlx1MjRFNiIgPT4gInciDQotDQotIyDisbMgIFtMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIEhPT0tdDQotIlx1MkM3MyIgPT4gInciDQotDQotIyDvvZcgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIFddDQotIlx1RkY1NyIgPT4gInciDQotDQotIyDikrIgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBXXQ0KLSJcdTI0QjIiID0+ICIodykiDQotDQotIyDhuoogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBYIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTFFOEEiID0+ICJYIg0KLQ0KLSMg4bqMICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWCBXSVRIIERJQUVSRVNJU10NCi0iXHUxRThDIiA9PiAiWCINCi0NCi0jIOKTjSAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWF0NCi0iXHUyNENEIiA9PiAiWCINCi0NCi0jIO+8uCAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBYXQ0KLSJcdUZGMzgiID0+ICJYIg0KLQ0KLSMg4baNICBbTEFUSU4gU01BTEwgTEVUVEVSIFggV0lUSCBQQUxBVEFMIEhPT0tdDQotIlx1MUQ4RCIgPT4gIngiDQotDQotIyDhuosgIFtMQVRJTiBTTUFMTCBMRVRURVIgWCBXSVRIIERPVCBBQk9WRV0NCi0iXHUxRThCIiA9PiAieCINCi0NCi0jIOG6jSAgW0xBVElOIFNNQUxMIExFVFRFUiBYIFdJVEggRElBRVJFU0lTXQ0KLSJcdTFFOEQiID0+ICJ4Ig0KLQ0KLSMg4oKTICBbTEFUSU4gU1VCU0NSSVBUIFNNQUxMIExFVFRFUiBYXQ0KLSJcdTIwOTMiID0+ICJ4Ig0KLQ0KLSMg4pOnICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgWF0NCi0iXHUyNEU3IiA9PiAieCINCi0NCi0jIO+9mCAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgWF0NCi0iXHVGRjU4IiA9PiAieCINCi0NCi0jIOKSsyAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIFhdDQotIlx1MjRCMyIgPT4gIih4KSINCi0NCi0jIMOdICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFXQ0KLSJcdTAwREQiID0+ICJZIg0KLQ0KLSMgxbYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQ0lSQ1VNRkxFWF0NCi0iXHUwMTc2IiA9PiAiWSINCi0NCi0jIMW4ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJU10NCi0iXHUwMTc4IiA9PiAiWSINCi0NCi0jIMazICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEhPT0tdDQotIlx1MDFCMyIgPT4gIlkiDQotDQotIyDIsiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBNQUNST05dDQotIlx1MDIzMiIgPT4gIlkiDQotDQotIyDJjiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBTVFJPS0VdDQotIlx1MDI0RSIgPT4gIlkiDQotDQotIyDKjyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIFldDQotIlx1MDI4RiIgPT4gIlkiDQotDQotIyDhuo4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTFFOEUiID0+ICJZIg0KLQ0KLSMg4buyICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEdSQVZFXQ0KLSJcdTFFRjIiID0+ICJZIg0KLQ0KLSMg4bu0ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERPVCBCRUxPV10NCi0iXHUxRUY0IiA9PiAiWSINCi0NCi0jIOG7tiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBIT09LIEFCT1ZFXQ0KLSJcdTFFRjYiID0+ICJZIg0KLQ0KLSMg4bu4ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIFRJTERFXQ0KLSJcdTFFRjgiID0+ICJZIg0KLQ0KLSMg4bu+ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIExPT1BdDQotIlx1MUVGRSIgPT4gIlkiDQotDQotIyDik44gIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIFldDQotIlx1MjRDRSIgPT4gIlkiDQotDQotIyDvvLkgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgWV0NCi0iXHVGRjM5IiA9PiAiWSINCi0NCi0jIMO9ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURV0NCi0iXHUwMEZEIiA9PiAieSINCi0NCi0jIMO/ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVNdDQotIlx1MDBGRiIgPT4gInkiDQotDQotIyDFtyAgW0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQ0lSQ1VNRkxFWF0NCi0iXHUwMTc3IiA9PiAieSINCi0NCi0jIMa0ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBIT09LXQ0KLSJcdTAxQjQiID0+ICJ5Ig0KLQ0KLSMgyLMgIFtMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIE1BQ1JPTl0NCi0iXHUwMjMzIiA9PiAieSINCi0NCi0jIMmPICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBTVFJPS0VdDQotIlx1MDI0RiIgPT4gInkiDQotDQotIyDKjiAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgWV0NCi0iXHUwMjhFIiA9PiAieSINCi0NCi0jIOG6jyAgW0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRE9UIEFCT1ZFXQ0KLSJcdTFFOEYiID0+ICJ5Ig0KLQ0KLSMg4bqZICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBSSU5HIEFCT1ZFXQ0KLSJcdTFFOTkiID0+ICJ5Ig0KLQ0KLSMg4buzICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBHUkFWRV0NCi0iXHUxRUYzIiA9PiAieSINCi0NCi0jIOG7tSAgW0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRE9UIEJFTE9XXQ0KLSJcdTFFRjUiID0+ICJ5Ig0KLQ0KLSMg4bu3ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBIT09LIEFCT1ZFXQ0KLSJcdTFFRjciID0+ICJ5Ig0KLQ0KLSMg4bu5ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBUSUxERV0NCi0iXHUxRUY5IiA9PiAieSINCi0NCi0jIOG7vyAgW0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggTE9PUF0NCi0iXHUxRUZGIiA9PiAieSINCi0NCi0jIOKTqCAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFldDQotIlx1MjRFOCIgPT4gInkiDQotDQotIyDvvZkgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIFldDQotIlx1RkY1OSIgPT4gInkiDQotDQotIyDikrQgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBZXQ0KLSJcdTI0QjQiID0+ICIoeSkiDQotDQotIyDFuSAgW0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURV0NCi0iXHUwMTc5IiA9PiAiWiINCi0NCi0jIMW7ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRV0NCi0iXHUwMTdCIiA9PiAiWiINCi0NCi0jIMW9ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OXQ0KLSJcdTAxN0QiID0+ICJaIg0KLQ0KLSMgxrUgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggU1RST0tFXQ0KLSJcdTAxQjUiID0+ICJaIg0KLQ0KLSMgyJwgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWW9naCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFlPR0hdDQotIlx1MDIxQyIgPT4gIloiDQotDQotIyDIpCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBIT09LXQ0KLSJcdTAyMjQiID0+ICJaIg0KLQ0KLSMg4bSiICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgWl0NCi0iXHUxRDIyIiA9PiAiWiINCi0NCi0jIOG6kCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDSVJDVU1GTEVYXQ0KLSJcdTFFOTAiID0+ICJaIg0KLQ0KLSMg4bqSICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBCRUxPV10NCi0iXHUxRTkyIiA9PiAiWiINCi0NCi0jIOG6lCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBMSU5FIEJFTE9XXQ0KLSJcdTFFOTQiID0+ICJaIg0KLQ0KLSMg4pOPICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBaXQ0KLSJcdTI0Q0YiID0+ICJaIg0KLQ0KLSMg4rGrICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERFU0NFTkRFUl0NCi0iXHUyQzZCIiA9PiAiWiINCi0NCi0jIOqdoiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFZJU0lHT1RISUMgWl0NCi0iXHVBNzYyIiA9PiAiWiINCi0NCi0jIO+8uiAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBaXQ0KLSJcdUZGM0EiID0+ICJaIg0KLQ0KLSMgxbogIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFXQ0KLSJcdTAxN0EiID0+ICJ6Ig0KLQ0KLSMgxbwgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRV0NCi0iXHUwMTdDIiA9PiAieiINCi0NCi0jIMW+ICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTl0NCi0iXHUwMTdFIiA9PiAieiINCi0NCi0jIMa2ICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBTVFJPS0VdDQotIlx1MDFCNiIgPT4gInoiDQotDQotIyDInSAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Zb2doICBbTEFUSU4gU01BTEwgTEVUVEVSIFlPR0hdDQotIlx1MDIxRCIgPT4gInoiDQotDQotIyDIpSAgW0xBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggSE9PS10NCi0iXHUwMjI1IiA9PiAieiINCi0NCi0jIMmAICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBTV0FTSCBUQUlMXQ0KLSJcdTAyNDAiID0+ICJ6Ig0KLQ0KLSMgypAgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIFJFVFJPRkxFWCBIT09LXQ0KLSJcdTAyOTAiID0+ICJ6Ig0KLQ0KLSMgypEgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENVUkxdDQotIlx1MDI5MSIgPT4gInoiDQotDQotIyDhtbYgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIE1JRERMRSBUSUxERV0NCi0iXHUxRDc2IiA9PiAieiINCi0NCi0jIOG2jiAgW0xBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggUEFMQVRBTCBIT09LXQ0KLSJcdTFEOEUiID0+ICJ6Ig0KLQ0KLSMg4bqRICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDSVJDVU1GTEVYXQ0KLSJcdTFFOTEiID0+ICJ6Ig0KLQ0KLSMg4bqTICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQkVMT1ddDQotIlx1MUU5MyIgPT4gInoiDQotDQotIyDhupUgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIExJTkUgQkVMT1ddDQotIlx1MUU5NSIgPT4gInoiDQotDQotIyDik6kgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBaXQ0KLSJcdTI0RTkiID0+ICJ6Ig0KLQ0KLSMg4rGsICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBERVNDRU5ERVJdDQotIlx1MkM2QyIgPT4gInoiDQotDQotIyDqnaMgIFtMQVRJTiBTTUFMTCBMRVRURVIgVklTSUdPVEhJQyBaXQ0KLSJcdUE3NjMiID0+ICJ6Ig0KLQ0KLSMg772aICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBaXQ0KLSJcdUZGNUEiID0+ICJ6Ig0KLQ0KLSMg4pK1ICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgWl0NCi0iXHUyNEI1IiA9PiAiKHopIg0KLQ0KLSMg4oGwICBbU1VQRVJTQ1JJUFQgWkVST10NCi0iXHUyMDcwIiA9PiAiMCINCi0NCi0jIOKCgCAgW1NVQlNDUklQVCBaRVJPXQ0KLSJcdTIwODAiID0+ICIwIg0KLQ0KLSMg4pOqICBbQ0lSQ0xFRCBESUdJVCBaRVJPXQ0KLSJcdTI0RUEiID0+ICIwIg0KLQ0KLSMg4pO/ICBbTkVHQVRJVkUgQ0lSQ0xFRCBESUdJVCBaRVJPXQ0KLSJcdTI0RkYiID0+ICIwIg0KLQ0KLSMg77yQICBbRlVMTFdJRFRIIERJR0lUIFpFUk9dDQotIlx1RkYxMCIgPT4gIjAiDQotDQotIyDCuSAgW1NVUEVSU0NSSVBUIE9ORV0NCi0iXHUwMEI5IiA9PiAiMSINCi0NCi0jIOKCgSAgW1NVQlNDUklQVCBPTkVdDQotIlx1MjA4MSIgPT4gIjEiDQotDQotIyDikaAgIFtDSVJDTEVEIERJR0lUIE9ORV0NCi0iXHUyNDYwIiA9PiAiMSINCi0NCi0jIOKTtSAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIE9ORV0NCi0iXHUyNEY1IiA9PiAiMSINCi0NCi0jIOKdtiAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBESUdJVCBPTkVdDQotIlx1Mjc3NiIgPT4gIjEiDQotDQotIyDinoAgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBPTkVdDQotIlx1Mjc4MCIgPT4gIjEiDQotDQotIyDinoogIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBPTkVdDQotIlx1Mjc4QSIgPT4gIjEiDQotDQotIyDvvJEgIFtGVUxMV0lEVEggRElHSVQgT05FXQ0KLSJcdUZGMTEiID0+ICIxIg0KLQ0KLSMg4pKIICBbRElHSVQgT05FIEZVTEwgU1RPUF0NCi0iXHUyNDg4IiA9PiAiMS4iDQotDQotIyDikbQgIFtQQVJFTlRIRVNJWkVEIERJR0lUIE9ORV0NCi0iXHUyNDc0IiA9PiAiKDEpIg0KLQ0KLSMgwrIgIFtTVVBFUlNDUklQVCBUV09dDQotIlx1MDBCMiIgPT4gIjIiDQotDQotIyDigoIgIFtTVUJTQ1JJUFQgVFdPXQ0KLSJcdTIwODIiID0+ICIyIg0KLQ0KLSMg4pGhICBbQ0lSQ0xFRCBESUdJVCBUV09dDQotIlx1MjQ2MSIgPT4gIjIiDQotDQotIyDik7YgIFtET1VCTEUgQ0lSQ0xFRCBESUdJVCBUV09dDQotIlx1MjRGNiIgPT4gIjIiDQotDQotIyDinbcgIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgVFdPXQ0KLSJcdTI3NzciID0+ICIyIg0KLQ0KLSMg4p6BICBbRElOR0JBVCBDSVJDTEVEIFNBTlMtU0VSSUYgRElHSVQgVFdPXQ0KLSJcdTI3ODEiID0+ICIyIg0KLQ0KLSMg4p6LICBbRElOR0JBVCBORUdBVElWRSBDSVJDTEVEIFNBTlMtU0VSSUYgRElHSVQgVFdPXQ0KLSJcdTI3OEIiID0+ICIyIg0KLQ0KLSMg77ySICBbRlVMTFdJRFRIIERJR0lUIFRXT10NCi0iXHVGRjEyIiA9PiAiMiINCi0NCi0jIOKSiSAgW0RJR0lUIFRXTyBGVUxMIFNUT1BdDQotIlx1MjQ4OSIgPT4gIjIuIg0KLQ0KLSMg4pG1ICBbUEFSRU5USEVTSVpFRCBESUdJVCBUV09dDQotIlx1MjQ3NSIgPT4gIigyKSINCi0NCi0jIMKzICBbU1VQRVJTQ1JJUFQgVEhSRUVdDQotIlx1MDBCMyIgPT4gIjMiDQotDQotIyDigoMgIFtTVUJTQ1JJUFQgVEhSRUVdDQotIlx1MjA4MyIgPT4gIjMiDQotDQotIyDikaIgIFtDSVJDTEVEIERJR0lUIFRIUkVFXQ0KLSJcdTI0NjIiID0+ICIzIg0KLQ0KLSMg4pO3ICBbRE9VQkxFIENJUkNMRUQgRElHSVQgVEhSRUVdDQotIlx1MjRGNyIgPT4gIjMiDQotDQotIyDinbggIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgVEhSRUVdDQotIlx1Mjc3OCIgPT4gIjMiDQotDQotIyDinoIgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBUSFJFRV0NCi0iXHUyNzgyIiA9PiAiMyINCi0NCi0jIOKejCAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBTQU5TLVNFUklGIERJR0lUIFRIUkVFXQ0KLSJcdTI3OEMiID0+ICIzIg0KLQ0KLSMg77yTICBbRlVMTFdJRFRIIERJR0lUIFRIUkVFXQ0KLSJcdUZGMTMiID0+ICIzIg0KLQ0KLSMg4pKKICBbRElHSVQgVEhSRUUgRlVMTCBTVE9QXQ0KLSJcdTI0OEEiID0+ICIzLiINCi0NCi0jIOKRtiAgW1BBUkVOVEhFU0laRUQgRElHSVQgVEhSRUVdDQotIlx1MjQ3NiIgPT4gIigzKSINCi0NCi0jIOKBtCAgW1NVUEVSU0NSSVBUIEZPVVJdDQotIlx1MjA3NCIgPT4gIjQiDQotDQotIyDigoQgIFtTVUJTQ1JJUFQgRk9VUl0NCi0iXHUyMDg0IiA9PiAiNCINCi0NCi0jIOKRoyAgW0NJUkNMRUQgRElHSVQgRk9VUl0NCi0iXHUyNDYzIiA9PiAiNCINCi0NCi0jIOKTuCAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIEZPVVJdDQotIlx1MjRGOCIgPT4gIjQiDQotDQotIyDinbkgIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgRk9VUl0NCi0iXHUyNzc5IiA9PiAiNCINCi0NCi0jIOKegyAgW0RJTkdCQVQgQ0lSQ0xFRCBTQU5TLVNFUklGIERJR0lUIEZPVVJdDQotIlx1Mjc4MyIgPT4gIjQiDQotDQotIyDino0gIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBGT1VSXQ0KLSJcdTI3OEQiID0+ICI0Ig0KLQ0KLSMg77yUICBbRlVMTFdJRFRIIERJR0lUIEZPVVJdDQotIlx1RkYxNCIgPT4gIjQiDQotDQotIyDikosgIFtESUdJVCBGT1VSIEZVTEwgU1RPUF0NCi0iXHUyNDhCIiA9PiAiNC4iDQotDQotIyDikbcgIFtQQVJFTlRIRVNJWkVEIERJR0lUIEZPVVJdDQotIlx1MjQ3NyIgPT4gIig0KSINCi0NCi0jIOKBtSAgW1NVUEVSU0NSSVBUIEZJVkVdDQotIlx1MjA3NSIgPT4gIjUiDQotDQotIyDigoUgIFtTVUJTQ1JJUFQgRklWRV0NCi0iXHUyMDg1IiA9PiAiNSINCi0NCi0jIOKRpCAgW0NJUkNMRUQgRElHSVQgRklWRV0NCi0iXHUyNDY0IiA9PiAiNSINCi0NCi0jIOKTuSAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIEZJVkVdDQotIlx1MjRGOSIgPT4gIjUiDQotDQotIyDinbogIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgRklWRV0NCi0iXHUyNzdBIiA9PiAiNSINCi0NCi0jIOKehCAgW0RJTkdCQVQgQ0lSQ0xFRCBTQU5TLVNFUklGIERJR0lUIEZJVkVdDQotIlx1Mjc4NCIgPT4gIjUiDQotDQotIyDino4gIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBGSVZFXQ0KLSJcdTI3OEUiID0+ICI1Ig0KLQ0KLSMg77yVICBbRlVMTFdJRFRIIERJR0lUIEZJVkVdDQotIlx1RkYxNSIgPT4gIjUiDQotDQotIyDikowgIFtESUdJVCBGSVZFIEZVTEwgU1RPUF0NCi0iXHUyNDhDIiA9PiAiNS4iDQotDQotIyDikbggIFtQQVJFTlRIRVNJWkVEIERJR0lUIEZJVkVdDQotIlx1MjQ3OCIgPT4gIig1KSINCi0NCi0jIOKBtiAgW1NVUEVSU0NSSVBUIFNJWF0NCi0iXHUyMDc2IiA9PiAiNiINCi0NCi0jIOKChiAgW1NVQlNDUklQVCBTSVhdDQotIlx1MjA4NiIgPT4gIjYiDQotDQotIyDikaUgIFtDSVJDTEVEIERJR0lUIFNJWF0NCi0iXHUyNDY1IiA9PiAiNiINCi0NCi0jIOKTuiAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIFNJWF0NCi0iXHUyNEZBIiA9PiAiNiINCi0NCi0jIOKduyAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBESUdJVCBTSVhdDQotIlx1Mjc3QiIgPT4gIjYiDQotDQotIyDinoUgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBTSVhdDQotIlx1Mjc4NSIgPT4gIjYiDQotDQotIyDino8gIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBTSVhdDQotIlx1Mjc4RiIgPT4gIjYiDQotDQotIyDvvJYgIFtGVUxMV0lEVEggRElHSVQgU0lYXQ0KLSJcdUZGMTYiID0+ICI2Ig0KLQ0KLSMg4pKNICBbRElHSVQgU0lYIEZVTEwgU1RPUF0NCi0iXHUyNDhEIiA9PiAiNi4iDQotDQotIyDikbkgIFtQQVJFTlRIRVNJWkVEIERJR0lUIFNJWF0NCi0iXHUyNDc5IiA9PiAiKDYpIg0KLQ0KLSMg4oG3ICBbU1VQRVJTQ1JJUFQgU0VWRU5dDQotIlx1MjA3NyIgPT4gIjciDQotDQotIyDigocgIFtTVUJTQ1JJUFQgU0VWRU5dDQotIlx1MjA4NyIgPT4gIjciDQotDQotIyDikaYgIFtDSVJDTEVEIERJR0lUIFNFVkVOXQ0KLSJcdTI0NjYiID0+ICI3Ig0KLQ0KLSMg4pO7ICBbRE9VQkxFIENJUkNMRUQgRElHSVQgU0VWRU5dDQotIlx1MjRGQiIgPT4gIjciDQotDQotIyDinbwgIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgU0VWRU5dDQotIlx1Mjc3QyIgPT4gIjciDQotDQotIyDinoYgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBTRVZFTl0NCi0iXHUyNzg2IiA9PiAiNyINCi0NCi0jIOKekCAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBTQU5TLVNFUklGIERJR0lUIFNFVkVOXQ0KLSJcdTI3OTAiID0+ICI3Ig0KLQ0KLSMg77yXICBbRlVMTFdJRFRIIERJR0lUIFNFVkVOXQ0KLSJcdUZGMTciID0+ICI3Ig0KLQ0KLSMg4pKOICBbRElHSVQgU0VWRU4gRlVMTCBTVE9QXQ0KLSJcdTI0OEUiID0+ICI3LiINCi0NCi0jIOKRuiAgW1BBUkVOVEhFU0laRUQgRElHSVQgU0VWRU5dDQotIlx1MjQ3QSIgPT4gIig3KSINCi0NCi0jIOKBuCAgW1NVUEVSU0NSSVBUIEVJR0hUXQ0KLSJcdTIwNzgiID0+ICI4Ig0KLQ0KLSMg4oKIICBbU1VCU0NSSVBUIEVJR0hUXQ0KLSJcdTIwODgiID0+ICI4Ig0KLQ0KLSMg4pGnICBbQ0lSQ0xFRCBESUdJVCBFSUdIVF0NCi0iXHUyNDY3IiA9PiAiOCINCi0NCi0jIOKTvCAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIEVJR0hUXQ0KLSJcdTI0RkMiID0+ICI4Ig0KLQ0KLSMg4p29ICBbRElOR0JBVCBORUdBVElWRSBDSVJDTEVEIERJR0lUIEVJR0hUXQ0KLSJcdTI3N0QiID0+ICI4Ig0KLQ0KLSMg4p6HICBbRElOR0JBVCBDSVJDTEVEIFNBTlMtU0VSSUYgRElHSVQgRUlHSFRdDQotIlx1Mjc4NyIgPT4gIjgiDQotDQotIyDinpEgIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBFSUdIVF0NCi0iXHUyNzkxIiA9PiAiOCINCi0NCi0jIO+8mCAgW0ZVTExXSURUSCBESUdJVCBFSUdIVF0NCi0iXHVGRjE4IiA9PiAiOCINCi0NCi0jIOKSjyAgW0RJR0lUIEVJR0hUIEZVTEwgU1RPUF0NCi0iXHUyNDhGIiA9PiAiOC4iDQotDQotIyDikbsgIFtQQVJFTlRIRVNJWkVEIERJR0lUIEVJR0hUXQ0KLSJcdTI0N0IiID0+ICIoOCkiDQotDQotIyDigbkgIFtTVVBFUlNDUklQVCBOSU5FXQ0KLSJcdTIwNzkiID0+ICI5Ig0KLQ0KLSMg4oKJICBbU1VCU0NSSVBUIE5JTkVdDQotIlx1MjA4OSIgPT4gIjkiDQotDQotIyDikaggIFtDSVJDTEVEIERJR0lUIE5JTkVdDQotIlx1MjQ2OCIgPT4gIjkiDQotDQotIyDik70gIFtET1VCTEUgQ0lSQ0xFRCBESUdJVCBOSU5FXQ0KLSJcdTI0RkQiID0+ICI5Ig0KLQ0KLSMg4p2+ICBbRElOR0JBVCBORUdBVElWRSBDSVJDTEVEIERJR0lUIE5JTkVdDQotIlx1Mjc3RSIgPT4gIjkiDQotDQotIyDinoggIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBOSU5FXQ0KLSJcdTI3ODgiID0+ICI5Ig0KLQ0KLSMg4p6SICBbRElOR0JBVCBORUdBVElWRSBDSVJDTEVEIFNBTlMtU0VSSUYgRElHSVQgTklORV0NCi0iXHUyNzkyIiA9PiAiOSINCi0NCi0jIO+8mSAgW0ZVTExXSURUSCBESUdJVCBOSU5FXQ0KLSJcdUZGMTkiID0+ICI5Ig0KLQ0KLSMg4pKQICBbRElHSVQgTklORSBGVUxMIFNUT1BdDQotIlx1MjQ5MCIgPT4gIjkuIg0KLQ0KLSMg4pG8ICBbUEFSRU5USEVTSVpFRCBESUdJVCBOSU5FXQ0KLSJcdTI0N0MiID0+ICIoOSkiDQotDQotIyDikakgIFtDSVJDTEVEIE5VTUJFUiBURU5dDQotIlx1MjQ2OSIgPT4gIjEwIg0KLQ0KLSMg4pO+ICBbRE9VQkxFIENJUkNMRUQgTlVNQkVSIFRFTl0NCi0iXHUyNEZFIiA9PiAiMTAiDQotDQotIyDinb8gIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgTlVNQkVSIFRFTl0NCi0iXHUyNzdGIiA9PiAiMTAiDQotDQotIyDinokgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBOVU1CRVIgVEVOXQ0KLSJcdTI3ODkiID0+ICIxMCINCi0NCi0jIOKekyAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBTQU5TLVNFUklGIE5VTUJFUiBURU5dDQotIlx1Mjc5MyIgPT4gIjEwIg0KLQ0KLSMg4pKRICBbTlVNQkVSIFRFTiBGVUxMIFNUT1BdDQotIlx1MjQ5MSIgPT4gIjEwLiINCi0NCi0jIOKRvSAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIFRFTl0NCi0iXHUyNDdEIiA9PiAiKDEwKSINCi0NCi0jIOKRqiAgW0NJUkNMRUQgTlVNQkVSIEVMRVZFTl0NCi0iXHUyNDZBIiA9PiAiMTEiDQotDQotIyDik6sgIFtORUdBVElWRSBDSVJDTEVEIE5VTUJFUiBFTEVWRU5dDQotIlx1MjRFQiIgPT4gIjExIg0KLQ0KLSMg4pKSICBbTlVNQkVSIEVMRVZFTiBGVUxMIFNUT1BdDQotIlx1MjQ5MiIgPT4gIjExLiINCi0NCi0jIOKRviAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIEVMRVZFTl0NCi0iXHUyNDdFIiA9PiAiKDExKSINCi0NCi0jIOKRqyAgW0NJUkNMRUQgTlVNQkVSIFRXRUxWRV0NCi0iXHUyNDZCIiA9PiAiMTIiDQotDQotIyDik6wgIFtORUdBVElWRSBDSVJDTEVEIE5VTUJFUiBUV0VMVkVdDQotIlx1MjRFQyIgPT4gIjEyIg0KLQ0KLSMg4pKTICBbTlVNQkVSIFRXRUxWRSBGVUxMIFNUT1BdDQotIlx1MjQ5MyIgPT4gIjEyLiINCi0NCi0jIOKRvyAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIFRXRUxWRV0NCi0iXHUyNDdGIiA9PiAiKDEyKSINCi0NCi0jIOKRrCAgW0NJUkNMRUQgTlVNQkVSIFRISVJURUVOXQ0KLSJcdTI0NkMiID0+ICIxMyINCi0NCi0jIOKTrSAgW05FR0FUSVZFIENJUkNMRUQgTlVNQkVSIFRISVJURUVOXQ0KLSJcdTI0RUQiID0+ICIxMyINCi0NCi0jIOKSlCAgW05VTUJFUiBUSElSVEVFTiBGVUxMIFNUT1BdDQotIlx1MjQ5NCIgPT4gIjEzLiINCi0NCi0jIOKSgCAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIFRISVJURUVOXQ0KLSJcdTI0ODAiID0+ICIoMTMpIg0KLQ0KLSMg4pGtICBbQ0lSQ0xFRCBOVU1CRVIgRk9VUlRFRU5dDQotIlx1MjQ2RCIgPT4gIjE0Ig0KLQ0KLSMg4pOuICBbTkVHQVRJVkUgQ0lSQ0xFRCBOVU1CRVIgRk9VUlRFRU5dDQotIlx1MjRFRSIgPT4gIjE0Ig0KLQ0KLSMg4pKVICBbTlVNQkVSIEZPVVJURUVOIEZVTEwgU1RPUF0NCi0iXHUyNDk1IiA9PiAiMTQuIg0KLQ0KLSMg4pKBICBbUEFSRU5USEVTSVpFRCBOVU1CRVIgRk9VUlRFRU5dDQotIlx1MjQ4MSIgPT4gIigxNCkiDQotDQotIyDika4gIFtDSVJDTEVEIE5VTUJFUiBGSUZURUVOXQ0KLSJcdTI0NkUiID0+ICIxNSINCi0NCi0jIOKTryAgW05FR0FUSVZFIENJUkNMRUQgTlVNQkVSIEZJRlRFRU5dDQotIlx1MjRFRiIgPT4gIjE1Ig0KLQ0KLSMg4pKWICBbTlVNQkVSIEZJRlRFRU4gRlVMTCBTVE9QXQ0KLSJcdTI0OTYiID0+ICIxNS4iDQotDQotIyDikoIgIFtQQVJFTlRIRVNJWkVEIE5VTUJFUiBGSUZURUVOXQ0KLSJcdTI0ODIiID0+ICIoMTUpIg0KLQ0KLSMg4pGvICBbQ0lSQ0xFRCBOVU1CRVIgU0lYVEVFTl0NCi0iXHUyNDZGIiA9PiAiMTYiDQotDQotIyDik7AgIFtORUdBVElWRSBDSVJDTEVEIE5VTUJFUiBTSVhURUVOXQ0KLSJcdTI0RjAiID0+ICIxNiINCi0NCi0jIOKSlyAgW05VTUJFUiBTSVhURUVOIEZVTEwgU1RPUF0NCi0iXHUyNDk3IiA9PiAiMTYuIg0KLQ0KLSMg4pKDICBbUEFSRU5USEVTSVpFRCBOVU1CRVIgU0lYVEVFTl0NCi0iXHUyNDgzIiA9PiAiKDE2KSINCi0NCi0jIOKRsCAgW0NJUkNMRUQgTlVNQkVSIFNFVkVOVEVFTl0NCi0iXHUyNDcwIiA9PiAiMTciDQotDQotIyDik7EgIFtORUdBVElWRSBDSVJDTEVEIE5VTUJFUiBTRVZFTlRFRU5dDQotIlx1MjRGMSIgPT4gIjE3Ig0KLQ0KLSMg4pKYICBbTlVNQkVSIFNFVkVOVEVFTiBGVUxMIFNUT1BdDQotIlx1MjQ5OCIgPT4gIjE3LiINCi0NCi0jIOKShCAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIFNFVkVOVEVFTl0NCi0iXHUyNDg0IiA9PiAiKDE3KSINCi0NCi0jIOKRsSAgW0NJUkNMRUQgTlVNQkVSIEVJR0hURUVOXQ0KLSJcdTI0NzEiID0+ICIxOCINCi0NCi0jIOKTsiAgW05FR0FUSVZFIENJUkNMRUQgTlVNQkVSIEVJR0hURUVOXQ0KLSJcdTI0RjIiID0+ICIxOCINCi0NCi0jIOKSmSAgW05VTUJFUiBFSUdIVEVFTiBGVUxMIFNUT1BdDQotIlx1MjQ5OSIgPT4gIjE4LiINCi0NCi0jIOKShSAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIEVJR0hURUVOXQ0KLSJcdTI0ODUiID0+ICIoMTgpIg0KLQ0KLSMg4pGyICBbQ0lSQ0xFRCBOVU1CRVIgTklORVRFRU5dDQotIlx1MjQ3MiIgPT4gIjE5Ig0KLQ0KLSMg4pOzICBbTkVHQVRJVkUgQ0lSQ0xFRCBOVU1CRVIgTklORVRFRU5dDQotIlx1MjRGMyIgPT4gIjE5Ig0KLQ0KLSMg4pKaICBbTlVNQkVSIE5JTkVURUVOIEZVTEwgU1RPUF0NCi0iXHUyNDlBIiA9PiAiMTkuIg0KLQ0KLSMg4pKGICBbUEFSRU5USEVTSVpFRCBOVU1CRVIgTklORVRFRU5dDQotIlx1MjQ4NiIgPT4gIigxOSkiDQotDQotIyDikbMgIFtDSVJDTEVEIE5VTUJFUiBUV0VOVFldDQotIlx1MjQ3MyIgPT4gIjIwIg0KLQ0KLSMg4pO0ICBbTkVHQVRJVkUgQ0lSQ0xFRCBOVU1CRVIgVFdFTlRZXQ0KLSJcdTI0RjQiID0+ICIyMCINCi0NCi0jIOKSmyAgW05VTUJFUiBUV0VOVFkgRlVMTCBTVE9QXQ0KLSJcdTI0OUIiID0+ICIyMC4iDQotDQotIyDikocgIFtQQVJFTlRIRVNJWkVEIE5VTUJFUiBUV0VOVFldDQotIlx1MjQ4NyIgPT4gIigyMCkiDQotDQotIyDCqyAgW0xFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLXQ0KLSJcdTAwQUIiID0+ICJcIiINCi0NCi0jIMK7ICBbUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLXQ0KLSJcdTAwQkIiID0+ICJcIiINCi0NCi0jIOKAnCAgW0xFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLXQ0KLSJcdTIwMUMiID0+ICJcIiINCi0NCi0jIOKAnSAgW1JJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSS10NCi0iXHUyMDFEIiA9PiAiXCIiDQotDQotIyDigJ4gIFtET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUktdDQotIlx1MjAxRSIgPT4gIlwiIg0KLQ0KLSMg4oCzICBbRE9VQkxFIFBSSU1FXQ0KLSJcdTIwMzMiID0+ICJcIiINCi0NCi0jIOKAtiAgW1JFVkVSU0VEIERPVUJMRSBQUklNRV0NCi0iXHUyMDM2IiA9PiAiXCIiDQotDQotIyDinZ0gIFtIRUFWWSBET1VCTEUgVFVSTkVEIENPTU1BIFFVT1RBVElPTiBNQVJLIE9STkFNRU5UXQ0KLSJcdTI3NUQiID0+ICJcIiINCi0NCi0jIOKdniAgW0hFQVZZIERPVUJMRSBDT01NQSBRVU9UQVRJT04gTUFSSyBPUk5BTUVOVF0NCi0iXHUyNzVFIiA9PiAiXCIiDQotDQotIyDina4gIFtIRUFWWSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLIE9STkFNRU5UXQ0KLSJcdTI3NkUiID0+ICJcIiINCi0NCi0jIOKdryAgW0hFQVZZIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLIE9STkFNRU5UXQ0KLSJcdTI3NkYiID0+ICJcIiINCi0NCi0jIO+8giAgW0ZVTExXSURUSCBRVU9UQVRJT04gTUFSS10NCi0iXHVGRjAyIiA9PiAiXCIiDQotDQotIyDigJggIFtMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSS10NCi0iXHUyMDE4IiA9PiAiXCciDQotDQotIyDigJkgIFtSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUktdDQotIlx1MjAxOSIgPT4gIlwnIg0KLQ0KLSMg4oCaICBbU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLXQ0KLSJcdTIwMUEiID0+ICJcJyINCi0NCi0jIOKAmyAgW1NJTkdMRSBISUdILVJFVkVSU0VELTkgUVVPVEFUSU9OIE1BUktdDQotIlx1MjAxQiIgPT4gIlwnIg0KLQ0KLSMg4oCyICBbUFJJTUVdDQotIlx1MjAzMiIgPT4gIlwnIg0KLQ0KLSMg4oC1ICBbUkVWRVJTRUQgUFJJTUVdDQotIlx1MjAzNSIgPT4gIlwnIg0KLQ0KLSMg4oC5ICBbU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUktdDQotIlx1MjAzOSIgPT4gIlwnIg0KLQ0KLSMg4oC6ICBbU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLXQ0KLSJcdTIwM0EiID0+ICJcJyINCi0NCi0jIOKdmyAgW0hFQVZZIFNJTkdMRSBUVVJORUQgQ09NTUEgUVVPVEFUSU9OIE1BUksgT1JOQU1FTlRdDQotIlx1Mjc1QiIgPT4gIlwnIg0KLQ0KLSMg4p2cICBbSEVBVlkgU0lOR0xFIENPTU1BIFFVT1RBVElPTiBNQVJLIE9STkFNRU5UXQ0KLSJcdTI3NUMiID0+ICJcJyINCi0NCi0jIO+8hyAgW0ZVTExXSURUSCBBUE9TVFJPUEhFXQ0KLSJcdUZGMDciID0+ICJcJyINCi0NCi0jIOKAkCAgW0hZUEhFTl0NCi0iXHUyMDEwIiA9PiAiLSINCi0NCi0jIOKAkSAgW05PTi1CUkVBS0lORyBIWVBIRU5dDQotIlx1MjAxMSIgPT4gIi0iDQotDQotIyDigJIgIFtGSUdVUkUgREFTSF0NCi0iXHUyMDEyIiA9PiAiLSINCi0NCi0jIOKAkyAgW0VOIERBU0hdDQotIlx1MjAxMyIgPT4gIi0iDQotDQotIyDigJQgIFtFTSBEQVNIXQ0KLSJcdTIwMTQiID0+ICItIg0KLQ0KLSMg4oG7ICBbU1VQRVJTQ1JJUFQgTUlOVVNdDQotIlx1MjA3QiIgPT4gIi0iDQotDQotIyDigosgIFtTVUJTQ1JJUFQgTUlOVVNdDQotIlx1MjA4QiIgPT4gIi0iDQotDQotIyDvvI0gIFtGVUxMV0lEVEggSFlQSEVOLU1JTlVTXQ0KLSJcdUZGMEQiID0+ICItIg0KLQ0KLSMg4oGFICBbTEVGVCBTUVVBUkUgQlJBQ0tFVCBXSVRIIFFVSUxMXQ0KLSJcdTIwNDUiID0+ICJbIg0KLQ0KLSMg4p2yICBbTElHSFQgTEVGVCBUT1JUT0lTRSBTSEVMTCBCUkFDS0VUIE9STkFNRU5UXQ0KLSJcdTI3NzIiID0+ICJbIg0KLQ0KLSMg77y7ICBbRlVMTFdJRFRIIExFRlQgU1FVQVJFIEJSQUNLRVRdDQotIlx1RkYzQiIgPT4gIlsiDQotDQotIyDigYYgIFtSSUdIVCBTUVVBUkUgQlJBQ0tFVCBXSVRIIFFVSUxMXQ0KLSJcdTIwNDYiID0+ICJdIg0KLQ0KLSMg4p2zICBbTElHSFQgUklHSFQgVE9SVE9JU0UgU0hFTEwgQlJBQ0tFVCBPUk5BTUVOVF0NCi0iXHUyNzczIiA9PiAiXSINCi0NCi0jIO+8vSAgW0ZVTExXSURUSCBSSUdIVCBTUVVBUkUgQlJBQ0tFVF0NCi0iXHVGRjNEIiA9PiAiXSINCi0NCi0jIOKBvSAgW1NVUEVSU0NSSVBUIExFRlQgUEFSRU5USEVTSVNdDQotIlx1MjA3RCIgPT4gIigiDQotDQotIyDigo0gIFtTVUJTQ1JJUFQgTEVGVCBQQVJFTlRIRVNJU10NCi0iXHUyMDhEIiA9PiAiKCINCi0NCi0jIOKdqCAgW01FRElVTSBMRUZUIFBBUkVOVEhFU0lTIE9STkFNRU5UXQ0KLSJcdTI3NjgiID0+ICIoIg0KLQ0KLSMg4p2qICBbTUVESVVNIEZMQVRURU5FRCBMRUZUIFBBUkVOVEhFU0lTIE9STkFNRU5UXQ0KLSJcdTI3NkEiID0+ICIoIg0KLQ0KLSMg77yIICBbRlVMTFdJRFRIIExFRlQgUEFSRU5USEVTSVNdDQotIlx1RkYwOCIgPT4gIigiDQotDQotIyDiuKggIFtMRUZUIERPVUJMRSBQQVJFTlRIRVNJU10NCi0iXHUyRTI4IiA9PiAiKCgiDQotDQotIyDigb4gIFtTVVBFUlNDUklQVCBSSUdIVCBQQVJFTlRIRVNJU10NCi0iXHUyMDdFIiA9PiAiKSINCi0NCi0jIOKCjiAgW1NVQlNDUklQVCBSSUdIVCBQQVJFTlRIRVNJU10NCi0iXHUyMDhFIiA9PiAiKSINCi0NCi0jIOKdqSAgW01FRElVTSBSSUdIVCBQQVJFTlRIRVNJUyBPUk5BTUVOVF0NCi0iXHUyNzY5IiA9PiAiKSINCi0NCi0jIOKdqyAgW01FRElVTSBGTEFUVEVORUQgUklHSFQgUEFSRU5USEVTSVMgT1JOQU1FTlRdDQotIlx1Mjc2QiIgPT4gIikiDQotDQotIyDvvIkgIFtGVUxMV0lEVEggUklHSFQgUEFSRU5USEVTSVNdDQotIlx1RkYwOSIgPT4gIikiDQotDQotIyDiuKkgIFtSSUdIVCBET1VCTEUgUEFSRU5USEVTSVNdDQotIlx1MkUyOSIgPT4gIikpIg0KLQ0KLSMg4p2sICBbTUVESVVNIExFRlQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVCBPUk5BTUVOVF0NCi0iXHUyNzZDIiA9PiAiPCINCi0NCi0jIOKdsCAgW0hFQVZZIExFRlQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVCBPUk5BTUVOVF0NCi0iXHUyNzcwIiA9PiAiPCINCi0NCi0jIO+8nCAgW0ZVTExXSURUSCBMRVNTLVRIQU4gU0lHTl0NCi0iXHVGRjFDIiA9PiAiPCINCi0NCi0jIOKdrSAgW01FRElVTSBSSUdIVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUIE9STkFNRU5UXQ0KLSJcdTI3NkQiID0+ICI+Ig0KLQ0KLSMg4p2xICBbSEVBVlkgUklHSFQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVCBPUk5BTUVOVF0NCi0iXHUyNzcxIiA9PiAiPiINCi0NCi0jIO+8niAgW0ZVTExXSURUSCBHUkVBVEVSLVRIQU4gU0lHTl0NCi0iXHVGRjFFIiA9PiAiPiINCi0NCi0jIOKdtCAgW01FRElVTSBMRUZUIENVUkxZIEJSQUNLRVQgT1JOQU1FTlRdDQotIlx1Mjc3NCIgPT4gInsiDQotDQotIyDvvZsgIFtGVUxMV0lEVEggTEVGVCBDVVJMWSBCUkFDS0VUXQ0KLSJcdUZGNUIiID0+ICJ7Ig0KLQ0KLSMg4p21ICBbTUVESVVNIFJJR0hUIENVUkxZIEJSQUNLRVQgT1JOQU1FTlRdDQotIlx1Mjc3NSIgPT4gIn0iDQotDQotIyDvvZ0gIFtGVUxMV0lEVEggUklHSFQgQ1VSTFkgQlJBQ0tFVF0NCi0iXHVGRjVEIiA9PiAifSINCi0NCi0jIOKBuiAgW1NVUEVSU0NSSVBUIFBMVVMgU0lHTl0NCi0iXHUyMDdBIiA9PiAiKyINCi0NCi0jIOKCiiAgW1NVQlNDUklQVCBQTFVTIFNJR05dDQotIlx1MjA4QSIgPT4gIisiDQotDQotIyDvvIsgIFtGVUxMV0lEVEggUExVUyBTSUdOXQ0KLSJcdUZGMEIiID0+ICIrIg0KLQ0KLSMg4oG8ICBbU1VQRVJTQ1JJUFQgRVFVQUxTIFNJR05dDQotIlx1MjA3QyIgPT4gIj0iDQotDQotIyDigowgIFtTVUJTQ1JJUFQgRVFVQUxTIFNJR05dDQotIlx1MjA4QyIgPT4gIj0iDQotDQotIyDvvJ0gIFtGVUxMV0lEVEggRVFVQUxTIFNJR05dDQotIlx1RkYxRCIgPT4gIj0iDQotDQotIyDvvIEgIFtGVUxMV0lEVEggRVhDTEFNQVRJT04gTUFSS10NCi0iXHVGRjAxIiA9PiAiISINCi0NCi0jIOKAvCAgW0RPVUJMRSBFWENMQU1BVElPTiBNQVJLXQ0KLSJcdTIwM0MiID0+ICIhISINCi0NCi0jIOKBiSAgW0VYQ0xBTUFUSU9OIFFVRVNUSU9OIE1BUktdDQotIlx1MjA0OSIgPT4gIiE/Ig0KLQ0KLSMg77yDICBbRlVMTFdJRFRIIE5VTUJFUiBTSUdOXQ0KLSJcdUZGMDMiID0+ICIjIg0KLQ0KLSMg77yEICBbRlVMTFdJRFRIIERPTExBUiBTSUdOXQ0KLSJcdUZGMDQiID0+ICIkIg0KLQ0KLSMg4oGSICBbQ09NTUVSQ0lBTCBNSU5VUyBTSUdOXQ0KLSJcdTIwNTIiID0+ICIlIg0KLQ0KLSMg77yFICBbRlVMTFdJRFRIIFBFUkNFTlQgU0lHTl0NCi0iXHVGRjA1IiA9PiAiJSINCi0NCi0jIO+8hiAgW0ZVTExXSURUSCBBTVBFUlNBTkRdDQotIlx1RkYwNiIgPT4gIiYiDQotDQotIyDigY4gIFtMT1cgQVNURVJJU0tdDQotIlx1MjA0RSIgPT4gIioiDQotDQotIyDvvIogIFtGVUxMV0lEVEggQVNURVJJU0tdDQotIlx1RkYwQSIgPT4gIioiDQotDQotIyDvvIwgIFtGVUxMV0lEVEggQ09NTUFdDQotIlx1RkYwQyIgPT4gIiwiDQotDQotIyDvvI4gIFtGVUxMV0lEVEggRlVMTCBTVE9QXQ0KLSJcdUZGMEUiID0+ICIuIg0KLQ0KLSMg4oGEICBbRlJBQ1RJT04gU0xBU0hdDQotIlx1MjA0NCIgPT4gIi8iDQotDQotIyDvvI8gIFtGVUxMV0lEVEggU09MSURVU10NCi0iXHVGRjBGIiA9PiAiLyINCi0NCi0jIO+8miAgW0ZVTExXSURUSCBDT0xPTl0NCi0iXHVGRjFBIiA9PiAiOiINCi0NCi0jIOKBjyAgW1JFVkVSU0VEIFNFTUlDT0xPTl0NCi0iXHUyMDRGIiA9PiAiOyINCi0NCi0jIO+8myAgW0ZVTExXSURUSCBTRU1JQ09MT05dDQotIlx1RkYxQiIgPT4gIjsiDQotDQotIyDvvJ8gIFtGVUxMV0lEVEggUVVFU1RJT04gTUFSS10NCi0iXHVGRjFGIiA9PiAiPyINCi0NCi0jIOKBhyAgW0RPVUJMRSBRVUVTVElPTiBNQVJLXQ0KLSJcdTIwNDciID0+ICI/PyINCi0NCi0jIOKBiCAgW1FVRVNUSU9OIEVYQ0xBTUFUSU9OIE1BUktdDQotIlx1MjA0OCIgPT4gIj8hIg0KLQ0KLSMg77ygICBbRlVMTFdJRFRIIENPTU1FUkNJQUwgQVRdDQotIlx1RkYyMCIgPT4gIkAiDQotDQotIyDvvLwgIFtGVUxMV0lEVEggUkVWRVJTRSBTT0xJRFVTXQ0KLSJcdUZGM0MiID0+ICJcXCINCi0NCi0jIOKAuCAgW0NBUkVUXQ0KLSJcdTIwMzgiID0+ICJeIg0KLQ0KLSMg77y+ICBbRlVMTFdJRFRIIENJUkNVTUZMRVggQUNDRU5UXQ0KLSJcdUZGM0UiID0+ICJeIg0KLQ0KLSMg77y/ICBbRlVMTFdJRFRIIExPVyBMSU5FXQ0KLSJcdUZGM0YiID0+ICJfIg0KLQ0KLSMg4oGTICBbU1dVTkcgREFTSF0NCi0iXHUyMDUzIiA9PiAifiINCi0NCi0jIO+9niAgW0ZVTExXSURUSCBUSUxERV0NCi0iXHVGRjVFIiA9PiAifiINCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBCZWxvdyBpcyB0aGUgUGVybCBzY3JpcHQgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYWJvdmUgbWFwcGluZ3MgIw0KLSMgZnJvbSBBU0NJSUZvbGRpbmdGaWx0ZXIuamF2YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMNCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIw0KLSMgIyEvdXNyL2Jpbi9wZXJsDQotIw0KLSMgdXNlIHdhcm5pbmdzOw0KLSMgdXNlIHN0cmljdDsNCi0jIA0KLSMgbXkgQHNvdXJjZV9jaGFycyA9ICgpOw0KLSMgbXkgQHNvdXJjZV9jaGFyX2Rlc2NyaXB0aW9ucyA9ICgpOw0KLSMgbXkgJHRhcmdldCA9ICcnOw0KLSMgDQotIyB3aGlsZSAoPD4pIHsNCi0jICAgaWYgKC9jYXNlXHMrJyhcXHVbQS1GMC05XSspJzpccypcL1wvXHMqKC4qKS9pKSB7DQotIyAgICAgcHVzaCBAc291cmNlX2NoYXJzLCAkMTsNCi0jCSAgcHVzaCBAc291cmNlX2NoYXJfZGVzY3JpcHRpb25zLCAkMjsNCi0jCSAgbmV4dDsNCi0jICAgfQ0KLSMgICBpZiAoL291dHB1dFxbW15cXV0rXF1ccyo9XHMqJyhcXCd8XFxcXHwuKScvKSB7DQotIyAgICAgJHRhcmdldCAuPSAkMTsNCi0jICAgICBuZXh0Ow0KLSMgICB9DQotIyAgIGlmICgvYnJlYWs7Lykgew0KLSMgICAgICR0YXJnZXQgPSAiXFxcIiIgaWYgKCR0YXJnZXQgZXEgJyInKTsNCi0jICAgICBmb3IgbXkgJHNvdXJjZV9jaGFyX251bSAoMC4uJCNzb3VyY2VfY2hhcnMpIHsNCi0jCSAgICBwcmludCAiIyAkc291cmNlX2NoYXJfZGVzY3JpcHRpb25zWyRzb3VyY2VfY2hhcl9udW1dXG4iOw0KLSMJICAgIHByaW50ICJcIiRzb3VyY2VfY2hhcnNbJHNvdXJjZV9jaGFyX251bV1cIiA9PiBcIiR0YXJnZXRcIlxuXG4iOw0KLSMJICB9DQotIwkgIEBzb3VyY2VfY2hhcnMgPSAoKTsNCi0jCSAgQHNvdXJjZV9jaGFyX2Rlc2NyaXB0aW9ucyA9ICgpOw0KLSMJICAkdGFyZ2V0ID0gJyc7DQotIyAgIH0NCi0jIH0NCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisjIFRoaXMgbWFwIGNvbnZlcnRzIGFscGhhYmV0aWMsIG51bWVyaWMsIGFuZCBzeW1ib2xpYyBVbmljb2RlIGNoYXJhY3RlcnMKKyMgd2hpY2ggYXJlIG5vdCBpbiB0aGUgZmlyc3QgMTI3IEFTQ0lJIGNoYXJhY3RlcnMgKHRoZSAiQmFzaWMgTGF0aW4iIFVuaWNvZGUKKyMgYmxvY2spIGludG8gdGhlaXIgQVNDSUkgZXF1aXZhbGVudHMsIGlmIG9uZSBleGlzdHMuCisjCisjIENoYXJhY3RlcnMgZnJvbSB0aGUgZm9sbG93aW5nIFVuaWNvZGUgYmxvY2tzIGFyZSBjb252ZXJ0ZWQ7IGhvd2V2ZXIsIG9ubHkKKyMgdGhvc2UgY2hhcmFjdGVycyB3aXRoIHJlYXNvbmFibGUgQVNDSUkgYWx0ZXJuYXRpdmVzIGFyZSBjb252ZXJ0ZWQ6CisjCisjIC0gQzEgQ29udHJvbHMgYW5kIExhdGluLTEgU3VwcGxlbWVudDogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UwMDgwLnBkZgorIyAtIExhdGluIEV4dGVuZGVkLUE6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMDEwMC5wZGYKKyMgLSBMYXRpbiBFeHRlbmRlZC1COiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTAxODAucGRmCisjIC0gTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbDogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UxRTAwLnBkZgorIyAtIExhdGluIEV4dGVuZGVkLUM6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMkM2MC5wZGYKKyMgLSBMYXRpbiBFeHRlbmRlZC1EOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVUE3MjAucGRmCisjIC0gSVBBIEV4dGVuc2lvbnM6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMDI1MC5wZGYKKyMgLSBQaG9uZXRpYyBFeHRlbnNpb25zOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTFEMDAucGRmCisjIC0gUGhvbmV0aWMgRXh0ZW5zaW9ucyBTdXBwbGVtZW50OiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTFEODAucGRmCisjIC0gR2VuZXJhbCBQdW5jdHVhdGlvbjogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UyMDAwLnBkZgorIyAtIFN1cGVyc2NyaXB0cyBhbmQgU3Vic2NyaXB0czogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UyMDcwLnBkZgorIyAtIEVuY2xvc2VkIEFscGhhbnVtZXJpY3M6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VMjQ2MC5wZGYKKyMgLSBEaW5nYmF0czogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UyNzAwLnBkZgorIyAtIFN1cHBsZW1lbnRhbCBQdW5jdHVhdGlvbjogaHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvUERGL1UyRTAwLnBkZgorIyAtIEFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVUZCMDAucGRmCisjIC0gSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXM6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VRkYwMC5wZGYKKyMgIAorIyBTZWU6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fY2hhcmFjdGVyc19pbl9Vbmljb2RlCisjCisjIFRoZSBzZXQgb2YgY2hhcmFjdGVyIGNvbnZlcnNpb25zIHN1cHBvcnRlZCBieSB0aGlzIG1hcCBpcyBhIHN1cGVyc2V0IG9mCisjIHRob3NlIHN1cHBvcnRlZCBieSB0aGUgbWFwIHJlcHJlc2VudGVkIGJ5IG1hcHBpbmctSVNPTGF0aW4xQWNjZW50LnR4dC4KKyMKKyMgU2VlIHRoZSBib3R0b20gb2YgdGhpcyBmaWxlIGZvciB0aGUgUGVybCBzY3JpcHQgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29udGVudHMKKyMgb2YgdGhpcyBmaWxlICh3aXRob3V0IHRoaXMgaGVhZGVyKSBmcm9tIEFTQ0lJRm9sZGluZ0ZpbHRlci5qYXZhLgorCisKKyMgU3ludGF4OgorIyAgICJzb3VyY2UiID0+ICJ0YXJnZXQiCisjICAgICAic291cmNlIi5sZW5ndGgoKSA+IDAgKHNvdXJjZSBjYW5ub3QgYmUgZW1wdHkuKQorIyAgICAgInRhcmdldCIubGVuZ3RoKCkgPj0gMCAodGFyZ2V0IGNhbiBiZSBlbXB0eS4pCisKKworIyDDgCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRV0KKyJcdTAwQzAiID0+ICJBIgorCisjIMOBICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFXQorIlx1MDBDMSIgPT4gIkEiCisKKyMgw4IgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAwQzIiID0+ICJBIgorCisjIMODICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFXQorIlx1MDBDMyIgPT4gIkEiCisKKyMgw4QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTXQorIlx1MDBDNCIgPT4gIkEiCisKKyMgw4UgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRV0KKyJcdTAwQzUiID0+ICJBIgorCisjIMSAICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE1BQ1JPTl0KKyJcdTAxMDAiID0+ICJBIgorCisjIMSCICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFXQorIlx1MDEwMiIgPT4gIkEiCisKKyMgxIQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLXQorIlx1MDEwNCIgPT4gIkEiCisKKyMgxo8gIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2Nod2EgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBTQ0hXQV0KKyJcdTAxOEYiID0+ICJBIgorCisjIMeNICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENBUk9OXQorIlx1MDFDRCIgPT4gIkEiCisKKyMgx54gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTIEFORCBNQUNST05dCisiXHUwMURFIiA9PiAiQSIKKworIyDHoCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBET1QgQUJPVkUgQU5EIE1BQ1JPTl0KKyJcdTAxRTAiID0+ICJBIgorCisjIMe6ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgQU5EIEFDVVRFXQorIlx1MDFGQSIgPT4gIkEiCisKKyMgyIAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRE9VQkxFIEdSQVZFXQorIlx1MDIwMCIgPT4gIkEiCisKKyMgyIIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggSU5WRVJURUQgQlJFVkVdCisiXHUwMjAyIiA9PiAiQSIKKworIyDIpiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBET1QgQUJPVkVdCisiXHUwMjI2IiA9PiAiQSIKKworIyDIuiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBTVFJPS0VdCisiXHUwMjNBIiA9PiAiQSIKKworIyDhtIAgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBBXQorIlx1MUQwMCIgPT4gIkEiCisKKyMg4biAICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQkVMT1ddCisiXHUxRTAwIiA9PiAiQSIKKworIyDhuqAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRE9UIEJFTE9XXQorIlx1MUVBMCIgPT4gIkEiCisKKyMg4bqiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEhPT0sgQUJPVkVdCisiXHUxRUEyIiA9PiAiQSIKKworIyDhuqQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEVdCisiXHUxRUE0IiA9PiAiQSIKKworIyDhuqYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkVdCisiXHUxRUE2IiA9PiAiQSIKKworIyDhuqggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRV0KKyJcdTFFQTgiID0+ICJBIgorCisjIOG6qiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERV0KKyJcdTFFQUEiID0+ICJBIgorCisjIOG6rCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1ddCisiXHUxRUFDIiA9PiAiQSIKKworIyDhuq4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEFDVVRFXQorIlx1MUVBRSIgPT4gIkEiCisKKyMg4bqwICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBHUkFWRV0KKyJcdTFFQjAiID0+ICJBIgorCisjIOG6siAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgSE9PSyBBQk9WRV0KKyJcdTFFQjIiID0+ICJBIgorCisjIOG6tCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgVElMREVdCisiXHUxRUI0IiA9PiAiQSIKKworIyDhurYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIERPVCBCRUxPV10KKyJcdTFFQjYiID0+ICJBIgorCisjIOKStiAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQV0KKyJcdTI0QjYiID0+ICJBIgorCisjIO+8oSAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBXQorIlx1RkYyMSIgPT4gIkEiCisKKyMgw6AgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFXQorIlx1MDBFMCIgPT4gImEiCisKKyMgw6EgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFXQorIlx1MDBFMSIgPT4gImEiCisKKyMgw6IgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVhdCisiXHUwMEUyIiA9PiAiYSIKKworIyDDoyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREVdCisiXHUwMEUzIiA9PiAiYSIKKworIyDDpCAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTXQorIlx1MDBFNCIgPT4gImEiCisKKyMgw6UgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkVdCisiXHUwMEU1IiA9PiAiYSIKKworIyDEgSAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggTUFDUk9OXQorIlx1MDEwMSIgPT4gImEiCisKKyMgxIMgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFXQorIlx1MDEwMyIgPT4gImEiCisKKyMgxIUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FS10KKyJcdTAxMDUiID0+ICJhIgorCisjIMeOICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDQVJPTl0KKyJcdTAxQ0UiID0+ICJhIgorCisjIMefICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMgQU5EIE1BQ1JPTl0KKyJcdTAxREYiID0+ICJhIgorCisjIMehICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBET1QgQUJPVkUgQU5EIE1BQ1JPTl0KKyJcdTAxRTEiID0+ICJhIgorCisjIMe7ICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFIEFORCBBQ1VURV0KKyJcdTAxRkIiID0+ICJhIgorCisjIMiBICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBET1VCTEUgR1JBVkVdCisiXHUwMjAxIiA9PiAiYSIKKworIyDIgyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggSU5WRVJURUQgQlJFVkVdCisiXHUwMjAzIiA9PiAiYSIKKworIyDIpyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRE9UIEFCT1ZFXQorIlx1MDIyNyIgPT4gImEiCisKKyMgyZAgIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIEFdCisiXHUwMjUwIiA9PiAiYSIKKworIyDJmSAgW0xBVElOIFNNQUxMIExFVFRFUiBTQ0hXQV0KKyJcdTAyNTkiID0+ICJhIgorCisjIMmaICBbTEFUSU4gU01BTEwgTEVUVEVSIFNDSFdBIFdJVEggSE9PS10KKyJcdTAyNUEiID0+ICJhIgorCisjIOG2jyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUkVUUk9GTEVYIEhPT0tdCisiXHUxRDhGIiA9PiAiYSIKKworIyDhtpUgIFtMQVRJTiBTTUFMTCBMRVRURVIgU0NIV0EgV0lUSCBSRVRST0ZMRVggSE9PS10KKyJcdTFEOTUiID0+ICJhIgorCisjIOG6oSAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBCRUxPV10KKyJcdTFFMDEiID0+ICJhIgorCisjIOG6oyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklHSFQgSEFMRiBSSU5HXQorIlx1MUU5QSIgPT4gImEiCisKKyMg4bqhICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBET1QgQkVMT1ddCisiXHUxRUExIiA9PiAiYSIKKworIyDhuqMgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEhPT0sgQUJPVkVdCisiXHUxRUEzIiA9PiAiYSIKKworIyDhuqUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFXQorIlx1MUVBNSIgPT4gImEiCisKKyMg4bqnICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBHUkFWRV0KKyJcdTFFQTciID0+ICJhIgorCisjIOG6qSAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRV0KKyJcdTFFQTkiID0+ICJhIgorCisjIOG6qyAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgVElMREVdCisiXHUxRUFCIiA9PiAiYSIKKworIyDhuq0gIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIERPVCBCRUxPV10KKyJcdTFFQUQiID0+ICJhIgorCisjIOG6ryAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEFDVVRFXQorIlx1MUVBRiIgPT4gImEiCisKKyMg4bqxICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgR1JBVkVdCisiXHUxRUIxIiA9PiAiYSIKKworIyDhurMgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBIT09LIEFCT1ZFXQorIlx1MUVCMyIgPT4gImEiCisKKyMg4bq1ICBbTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgVElMREVdCisiXHUxRUI1IiA9PiAiYSIKKworIyDhurcgIFtMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBET1QgQkVMT1ddCisiXHUxRUI3IiA9PiAiYSIKKworIyDigpAgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIEFdCisiXHUyMDkwIiA9PiAiYSIKKworIyDigpQgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIFNDSFdBXQorIlx1MjA5NCIgPT4gImEiCisKKyMg4pOQICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgQV0KKyJcdTI0RDAiID0+ICJhIgorCisjIOKxpSAgW0xBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggU1RST0tFXQorIlx1MkM2NSIgPT4gImEiCisKKyMg4rGvICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVFVSTkVEIEFdCisiXHUyQzZGIiA9PiAiYSIKKworIyDvvYEgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIEFdCisiXHVGRjQxIiA9PiAiYSIKKworIyDqnLIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBQV0KKyJcdUE3MzIiID0+ICJBQSIKKworIyDDhiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFFXQorIlx1MDBDNiIgPT4gIkFFIgorCisjIMeiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUgV0lUSCBNQUNST05dCisiXHUwMUUyIiA9PiAiQUUiCisKKyMgx7wgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBBRSBXSVRIIEFDVVRFXQorIlx1MDFGQyIgPT4gIkFFIgorCisjIOG0gSAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEFFXQorIlx1MUQwMSIgPT4gIkFFIgorCisjIOqctCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFPXQorIlx1QTczNCIgPT4gIkFPIgorCisjIOqctiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFVXQorIlx1QTczNiIgPT4gIkFVIgorCisjIOqcuCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFWXQorIlx1QTczOCIgPT4gIkFWIgorCisjIOqcuiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEFWIFdJVEggSE9SSVpPTlRBTCBCQVJdCisiXHVBNzNBIiA9PiAiQVYiCisKKyMg6py8ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQVldCisiXHVBNzNDIiA9PiAiQVkiCisKKyMg4pKcICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgQV0KKyJcdTI0OUMiID0+ICIoYSkiCisKKyMg6pyzICBbTEFUSU4gU01BTEwgTEVUVEVSIEFBXQorIlx1QTczMyIgPT4gImFhIgorCisjIMOmICBbTEFUSU4gU01BTEwgTEVUVEVSIEFFXQorIlx1MDBFNiIgPT4gImFlIgorCisjIMejICBbTEFUSU4gU01BTEwgTEVUVEVSIEFFIFdJVEggTUFDUk9OXQorIlx1MDFFMyIgPT4gImFlIgorCisjIMe9ICBbTEFUSU4gU01BTEwgTEVUVEVSIEFFIFdJVEggQUNVVEVdCisiXHUwMUZEIiA9PiAiYWUiCisKKyMg4bSCICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBBRV0KKyJcdTFEMDIiID0+ICJhZSIKKworIyDqnLUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQU9dCisiXHVBNzM1IiA9PiAiYW8iCisKKyMg6py3ICBbTEFUSU4gU01BTEwgTEVUVEVSIEFVXQorIlx1QTczNyIgPT4gImF1IgorCisjIOqcuSAgW0xBVElOIFNNQUxMIExFVFRFUiBBVl0KKyJcdUE3MzkiID0+ICJhdiIKKworIyDqnLsgIFtMQVRJTiBTTUFMTCBMRVRURVIgQVYgV0lUSCBIT1JJWk9OVEFMIEJBUl0KKyJcdUE3M0IiID0+ICJhdiIKKworIyDqnL0gIFtMQVRJTiBTTUFMTCBMRVRURVIgQVldCisiXHVBNzNEIiA9PiAiYXkiCisKKyMgxoEgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBCIFdJVEggSE9PS10KKyJcdTAxODEiID0+ICJCIgorCisjIMaCICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiBXSVRIIFRPUEJBUl0KKyJcdTAxODIiID0+ICJCIgorCisjIMmDICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiBXSVRIIFNUUk9LRV0KKyJcdTAyNDMiID0+ICJCIgorCisjIMqZICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgQl0KKyJcdTAyOTkiID0+ICJCIgorCisjIOG0gyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEJBUlJFRCBCXQorIlx1MUQwMyIgPT4gIkIiCisKKyMg4biCICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiBXSVRIIERPVCBBQk9WRV0KKyJcdTFFMDIiID0+ICJCIgorCisjIOG4hCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEIgV0lUSCBET1QgQkVMT1ddCisiXHUxRTA0IiA9PiAiQiIKKworIyDhuIYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBCIFdJVEggTElORSBCRUxPV10KKyJcdTFFMDYiID0+ICJCIgorCisjIOKStyAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQl0KKyJcdTI0QjciID0+ICJCIgorCisjIO+8oiAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBCXQorIlx1RkYyMiIgPT4gIkIiCisKKyMgxoAgIFtMQVRJTiBTTUFMTCBMRVRURVIgQiBXSVRIIFNUUk9LRV0KKyJcdTAxODAiID0+ICJiIgorCisjIMaDICBbTEFUSU4gU01BTEwgTEVUVEVSIEIgV0lUSCBUT1BCQVJdCisiXHUwMTgzIiA9PiAiYiIKKworIyDJkyAgW0xBVElOIFNNQUxMIExFVFRFUiBCIFdJVEggSE9PS10KKyJcdTAyNTMiID0+ICJiIgorCisjIOG1rCAgW0xBVElOIFNNQUxMIExFVFRFUiBCIFdJVEggTUlERExFIFRJTERFXQorIlx1MUQ2QyIgPT4gImIiCisKKyMg4baAICBbTEFUSU4gU01BTEwgTEVUVEVSIEIgV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDgwIiA9PiAiYiIKKworIyDhuIMgIFtMQVRJTiBTTUFMTCBMRVRURVIgQiBXSVRIIERPVCBBQk9WRV0KKyJcdTFFMDMiID0+ICJiIgorCisjIOG4hSAgW0xBVElOIFNNQUxMIExFVFRFUiBCIFdJVEggRE9UIEJFTE9XXQorIlx1MUUwNSIgPT4gImIiCisKKyMg4biHICBbTEFUSU4gU01BTEwgTEVUVEVSIEIgV0lUSCBMSU5FIEJFTE9XXQorIlx1MUUwNyIgPT4gImIiCisKKyMg4pORICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgQl0KKyJcdTI0RDEiID0+ICJiIgorCisjIO+9giAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgQl0KKyJcdUZGNDIiID0+ICJiIgorCisjIOKSnSAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIEJdCisiXHUyNDlEIiA9PiAiKGIpIgorCisjIMOHICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEFdCisiXHUwMEM3IiA9PiAiQyIKKworIyDEhiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURV0KKyJcdTAxMDYiID0+ICJDIgorCisjIMSIICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENJUkNVTUZMRVhdCisiXHUwMTA4IiA9PiAiQyIKKworIyDEiiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBET1QgQUJPVkVdCisiXHUwMTBBIiA9PiAiQyIKKworIyDEjCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTl0KKyJcdTAxMEMiID0+ICJDIgorCisjIMaHICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIEhPT0tdCisiXHUwMTg3IiA9PiAiQyIKKworIyDIuyAgW0xBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBTVFJPS0VdCisiXHUwMjNCIiA9PiAiQyIKKworIyDKlyAgW0xBVElOIExFVFRFUiBTVFJFVENIRUQgQ10KKyJcdTAyOTciID0+ICJDIgorCisjIOG0hCAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIENdCisiXHUxRDA0IiA9PiAiQyIKKworIyDhuIggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSBBTkQgQUNVVEVdCisiXHUxRTA4IiA9PiAiQyIKKworIyDikrggIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIENdCisiXHUyNEI4IiA9PiAiQyIKKworIyDvvKMgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgQ10KKyJcdUZGMjMiID0+ICJDIgorCisjIMOnICBbTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBXQorIlx1MDBFNyIgPT4gImMiCisKKyMgxIcgIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFXQorIlx1MDEwNyIgPT4gImMiCisKKyMgxIkgIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENJUkNVTUZMRVhdCisiXHUwMTA5IiA9PiAiYyIKKworIyDEiyAgW0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggRE9UIEFCT1ZFXQorIlx1MDEwQiIgPT4gImMiCisKKyMgxI0gIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OXQorIlx1MDEwRCIgPT4gImMiCisKKyMgxoggIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEhPT0tdCisiXHUwMTg4IiA9PiAiYyIKKworIyDIvCAgW0xBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggU1RST0tFXQorIlx1MDIzQyIgPT4gImMiCisKKyMgyZUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENVUkxdCisiXHUwMjU1IiA9PiAiYyIKKworIyDhuIkgIFtMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEgQU5EIEFDVVRFXQorIlx1MUUwOSIgPT4gImMiCisKKyMg4oaEICBbTEFUSU4gU01BTEwgTEVUVEVSIFJFVkVSU0VEIENdCisiXHUyMTg0IiA9PiAiYyIKKworIyDik5IgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBDXQorIlx1MjREMiIgPT4gImMiCisKKyMg6py+ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUkVWRVJTRUQgQyBXSVRIIERPVF0KKyJcdUE3M0UiID0+ICJjIgorCisjIOqcvyAgW0xBVElOIFNNQUxMIExFVFRFUiBSRVZFUlNFRCBDIFdJVEggRE9UXQorIlx1QTczRiIgPT4gImMiCisKKyMg772DICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBDXQorIlx1RkY0MyIgPT4gImMiCisKKyMg4pKeICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgQ10KKyJcdTI0OUUiID0+ICIoYykiCisKKyMgw5AgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEhdCisiXHUwMEQwIiA9PiAiRCIKKworIyDEjiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTl0KKyJcdTAxMEUiID0+ICJEIgorCisjIMSQICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRV0KKyJcdTAxMTAiID0+ICJEIgorCisjIMaJICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUZSSUNBTiBEXQorIlx1MDE4OSIgPT4gIkQiCisKKyMgxoogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggSE9PS10KKyJcdTAxOEEiID0+ICJEIgorCisjIMaLICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFRPUEJBUl0KKyJcdTAxOEIiID0+ICJEIgorCisjIOG0hSAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIERdCisiXHUxRDA1IiA9PiAiRCIKKworIyDhtIYgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBFVEhdCisiXHUxRDA2IiA9PiAiRCIKKworIyDhuIogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggRE9UIEFCT1ZFXQorIlx1MUUwQSIgPT4gIkQiCisKKyMg4biMICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIERPVCBCRUxPV10KKyJcdTFFMEMiID0+ICJEIgorCisjIOG4jiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBMSU5FIEJFTE9XXQorIlx1MUUwRSIgPT4gIkQiCisKKyMg4biQICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIENFRElMTEFdCisiXHUxRTEwIiA9PiAiRCIKKworIyDhuJIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFMTIiID0+ICJEIgorCisjIOKSuSAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRF0KKyJcdTI0QjkiID0+ICJEIgorCisjIOqduSAgW0xBVElOIENBUElUQUwgTEVUVEVSIElOU1VMQVIgRF0KKyJcdUE3NzkiID0+ICJEIgorCisjIO+8pCAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBEXQorIlx1RkYyNCIgPT4gIkQiCisKKyMgw7AgIFtMQVRJTiBTTUFMTCBMRVRURVIgRVRIXQorIlx1MDBGMCIgPT4gImQiCisKKyMgxI8gIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIENBUk9OXQorIlx1MDEwRiIgPT4gImQiCisKKyMgxJEgIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIFNUUk9LRV0KKyJcdTAxMTEiID0+ICJkIgorCisjIMaMICBbTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBUT1BCQVJdCisiXHUwMThDIiA9PiAiZCIKKworIyDIoSAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ1VSTF0KKyJcdTAyMjEiID0+ICJkIgorCisjIMmWICBbTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBUQUlMXQorIlx1MDI1NiIgPT4gImQiCisKKyMgyZcgIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIEhPT0tdCisiXHUwMjU3IiA9PiAiZCIKKworIyDhta0gIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIE1JRERMRSBUSUxERV0KKyJcdTFENkQiID0+ICJkIgorCisjIOG2gSAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggUEFMQVRBTCBIT09LXQorIlx1MUQ4MSIgPT4gImQiCisKKyMg4baRICBbTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBIT09LIEFORCBUQUlMXQorIlx1MUQ5MSIgPT4gImQiCisKKyMg4biLICBbTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBET1QgQUJPVkVdCisiXHUxRTBCIiA9PiAiZCIKKworIyDhuI0gIFtMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIERPVCBCRUxPV10KKyJcdTFFMEQiID0+ICJkIgorCisjIOG4jyAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggTElORSBCRUxPV10KKyJcdTFFMEYiID0+ICJkIgorCisjIOG4kSAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0VESUxMQV0KKyJcdTFFMTEiID0+ICJkIgorCisjIOG4kyAgW0xBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFMTMiID0+ICJkIgorCisjIOKTkyAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIERdCisiXHUyNEQzIiA9PiAiZCIKKworIyDqnbogIFtMQVRJTiBTTUFMTCBMRVRURVIgSU5TVUxBUiBEXQorIlx1QTc3QSIgPT4gImQiCisKKyMg772EICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBEXQorIlx1RkY0NCIgPT4gImQiCisKKyMgx4QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEWiBXSVRIIENBUk9OXQorIlx1MDFDNCIgPT4gIkRaIgorCisjIMexICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRFpdCisiXHUwMUYxIiA9PiAiRFoiCisKKyMgx4UgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTl0KKyJcdTAxQzUiID0+ICJEeiIKKworIyDHsiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTTUFMTCBMRVRURVIgWl0KKyJcdTAxRjIiID0+ICJEeiIKKworIyDikp8gIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBEXQorIlx1MjQ5RiIgPT4gIihkKSIKKworIyDIuCAgW0xBVElOIFNNQUxMIExFVFRFUiBEQiBESUdSQVBIXQorIlx1MDIzOCIgPT4gImRiIgorCisjIMeGICBbTEFUSU4gU01BTEwgTEVUVEVSIERaIFdJVEggQ0FST05dCisiXHUwMUM2IiA9PiAiZHoiCisKKyMgx7MgIFtMQVRJTiBTTUFMTCBMRVRURVIgRFpdCisiXHUwMUYzIiA9PiAiZHoiCisKKyMgyqMgIFtMQVRJTiBTTUFMTCBMRVRURVIgRFogRElHUkFQSF0KKyJcdTAyQTMiID0+ICJkeiIKKworIyDKpSAgW0xBVElOIFNNQUxMIExFVFRFUiBEWiBESUdSQVBIIFdJVEggQ1VSTF0KKyJcdTAyQTUiID0+ICJkeiIKKworIyDDiCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRV0KKyJcdTAwQzgiID0+ICJFIgorCisjIMOJICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFXQorIlx1MDBDOSIgPT4gIkUiCisKKyMgw4ogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAwQ0EiID0+ICJFIgorCisjIMOLICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJU10KKyJcdTAwQ0IiID0+ICJFIgorCisjIMSSICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE1BQ1JPTl0KKyJcdTAxMTIiID0+ICJFIgorCisjIMSUICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEJSRVZFXQorIlx1MDExNCIgPT4gIkUiCisKKyMgxJYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFXQorIlx1MDExNiIgPT4gIkUiCisKKyMgxJggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLXQorIlx1MDExOCIgPT4gIkUiCisKKyMgxJogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0FST05dCisiXHUwMTFBIiA9PiAiRSIKKworIyDGjiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFJFVkVSU0VEIEVdCisiXHUwMThFIiA9PiAiRSIKKworIyDGkCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE9QRU4gRV0KKyJcdTAxOTAiID0+ICJFIgorCisjIMiEICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVUJMRSBHUkFWRV0KKyJcdTAyMDQiID0+ICJFIgorCisjIMiGICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIElOVkVSVEVEIEJSRVZFXQorIlx1MDIwNiIgPT4gIkUiCisKKyMgyKggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0VESUxMQV0KKyJcdTAyMjgiID0+ICJFIgorCisjIMmGICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIFNUUk9LRV0KKyJcdTAyNDYiID0+ICJFIgorCisjIOG0hyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEVdCisiXHUxRDA3IiA9PiAiRSIKKworIyDhuJQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OIEFORCBHUkFWRV0KKyJcdTFFMTQiID0+ICJFIgorCisjIOG4liAgW0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBNQUNST04gQU5EIEFDVVRFXQorIlx1MUUxNiIgPT4gIkUiCisKKyMg4biYICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQkVMT1ddCisiXHUxRTE4IiA9PiAiRSIKKworIyDhuJogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggVElMREUgQkVMT1ddCisiXHUxRTFBIiA9PiAiRSIKKworIyDhuJwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0VESUxMQSBBTkQgQlJFVkVdCisiXHUxRTFDIiA9PiAiRSIKKworIyDhurggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEJFTE9XXQorIlx1MUVCOCIgPT4gIkUiCisKKyMg4bq6ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEhPT0sgQUJPVkVdCisiXHUxRUJBIiA9PiAiRSIKKworIyDhurwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggVElMREVdCisiXHUxRUJDIiA9PiAiRSIKKworIyDhur4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEVdCisiXHUxRUJFIiA9PiAiRSIKKworIyDhu4AgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkVdCisiXHUxRUMwIiA9PiAiRSIKKworIyDhu4IgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRV0KKyJcdTFFQzIiID0+ICJFIgorCisjIOG7hCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERV0KKyJcdTFFQzQiID0+ICJFIgorCisjIOG7hiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1ddCisiXHUxRUM2IiA9PiAiRSIKKworIyDikrogIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIEVdCisiXHUyNEJBIiA9PiAiRSIKKworIyDisbsgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBUVVJORUQgRV0KKyJcdTJDN0IiID0+ICJFIgorCisjIO+8pSAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBFXQorIlx1RkYyNSIgPT4gIkUiCisKKyMgw6ggIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFXQorIlx1MDBFOCIgPT4gImUiCisKKyMgw6kgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFXQorIlx1MDBFOSIgPT4gImUiCisKKyMgw6ogIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVhdCisiXHUwMEVBIiA9PiAiZSIKKworIyDDqyAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTXQorIlx1MDBFQiIgPT4gImUiCisKKyMgxJMgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE1BQ1JPTl0KKyJcdTAxMTMiID0+ICJlIgorCisjIMSVICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBCUkVWRV0KKyJcdTAxMTUiID0+ICJlIgorCisjIMSXICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkVdCisiXHUwMTE3IiA9PiAiZSIKKworIyDEmSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLXQorIlx1MDExOSIgPT4gImUiCisKKyMgxJsgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OXQorIlx1MDExQiIgPT4gImUiCisKKyMgx50gIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIEVdCisiXHUwMUREIiA9PiAiZSIKKworIyDIhSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRE9VQkxFIEdSQVZFXQorIlx1MDIwNSIgPT4gImUiCisKKyMgyIcgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIElOVkVSVEVEIEJSRVZFXQorIlx1MDIwNyIgPT4gImUiCisKKyMgyKkgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENFRElMTEFdCisiXHUwMjI5IiA9PiAiZSIKKworIyDJhyAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggU1RST0tFXQorIlx1MDI0NyIgPT4gImUiCisKKyMgyZggIFtMQVRJTiBTTUFMTCBMRVRURVIgUkVWRVJTRUQgRV0KKyJcdTAyNTgiID0+ICJlIgorCisjIMmbICBbTEFUSU4gU01BTEwgTEVUVEVSIE9QRU4gRV0KKyJcdTAyNUIiID0+ICJlIgorCisjIMmcICBbTEFUSU4gU01BTEwgTEVUVEVSIFJFVkVSU0VEIE9QRU4gRV0KKyJcdTAyNUMiID0+ICJlIgorCisjIMmdICBbTEFUSU4gU01BTEwgTEVUVEVSIFJFVkVSU0VEIE9QRU4gRSBXSVRIIEhPT0tdCisiXHUwMjVEIiA9PiAiZSIKKworIyDJniAgW0xBVElOIFNNQUxMIExFVFRFUiBDTE9TRUQgUkVWRVJTRUQgT1BFTiBFXQorIlx1MDI1RSIgPT4gImUiCisKKyMgypogIFtMQVRJTiBTTUFMTCBMRVRURVIgQ0xPU0VEIE9QRU4gRV0KKyJcdTAyOUEiID0+ICJlIgorCisjIOG0iCAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgT1BFTiBFXQorIlx1MUQwOCIgPT4gImUiCisKKyMg4baSICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBSRVRST0ZMRVggSE9PS10KKyJcdTFEOTIiID0+ICJlIgorCisjIOG2kyAgW0xBVElOIFNNQUxMIExFVFRFUiBPUEVOIEUgV0lUSCBSRVRST0ZMRVggSE9PS10KKyJcdTFEOTMiID0+ICJlIgorCisjIOG2lCAgW0xBVElOIFNNQUxMIExFVFRFUiBSRVZFUlNFRCBPUEVOIEUgV0lUSCBSRVRST0ZMRVggSE9PS10KKyJcdTFEOTQiID0+ICJlIgorCisjIOG4lSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OIEFORCBHUkFWRV0KKyJcdTFFMTUiID0+ICJlIgorCisjIOG4lyAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OIEFORCBBQ1VURV0KKyJcdTFFMTciID0+ICJlIgorCisjIOG4mSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFMTkiID0+ICJlIgorCisjIOG4myAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggVElMREUgQkVMT1ddCisiXHUxRTFCIiA9PiAiZSIKKworIyDhuJ0gIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENFRElMTEEgQU5EIEJSRVZFXQorIlx1MUUxRCIgPT4gImUiCisKKyMg4bq5ICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQkVMT1ddCisiXHUxRUI5IiA9PiAiZSIKKworIyDhursgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEhPT0sgQUJPVkVdCisiXHUxRUJCIiA9PiAiZSIKKworIyDhur0gIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIFRJTERFXQorIlx1MUVCRCIgPT4gImUiCisKKyMg4bq/ICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBBQ1VURV0KKyJcdTFFQkYiID0+ICJlIgorCisjIOG7gSAgW0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkVdCisiXHUxRUMxIiA9PiAiZSIKKworIyDhu4MgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkVdCisiXHUxRUMzIiA9PiAiZSIKKworIyDhu4UgIFtMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIFRJTERFXQorIlx1MUVDNSIgPT4gImUiCisKKyMg4buHICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1ddCisiXHUxRUM3IiA9PiAiZSIKKworIyDigpEgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIEVdCisiXHUyMDkxIiA9PiAiZSIKKworIyDik5QgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBFXQorIlx1MjRENCIgPT4gImUiCisKKyMg4rG4ICBbTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBOT1RDSF0KKyJcdTJDNzgiID0+ICJlIgorCisjIO+9hSAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgRV0KKyJcdUZGNDUiID0+ICJlIgorCisjIOKSoCAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIEVdCisiXHUyNEEwIiA9PiAiKGUpIgorCisjIMaRICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRiBXSVRIIEhPT0tdCisiXHUwMTkxIiA9PiAiRiIKKworIyDhuJ4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBGIFdJVEggRE9UIEFCT1ZFXQorIlx1MUUxRSIgPT4gIkYiCisKKyMg4pK7ICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBGXQorIlx1MjRCQiIgPT4gIkYiCisKKyMg6pywICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgRl0KKyJcdUE3MzAiID0+ICJGIgorCisjIOqduyAgW0xBVElOIENBUElUQUwgTEVUVEVSIElOU1VMQVIgRl0KKyJcdUE3N0IiID0+ICJGIgorCisjIOqfuyAgW0xBVElOIEVQSUdSQVBISUMgTEVUVEVSIFJFVkVSU0VEIEZdCisiXHVBN0ZCIiA9PiAiRiIKKworIyDvvKYgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgRl0KKyJcdUZGMjYiID0+ICJGIgorCisjIMaSICBbTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LXQorIlx1MDE5MiIgPT4gImYiCisKKyMg4bWuICBbTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBNSURETEUgVElMREVdCisiXHUxRDZFIiA9PiAiZiIKKworIyDhtoIgIFtMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIFBBTEFUQUwgSE9PS10KKyJcdTFEODIiID0+ICJmIgorCisjIOG4nyAgW0xBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggRE9UIEFCT1ZFXQorIlx1MUUxRiIgPT4gImYiCisKKyMg4bqbICBbTEFUSU4gU01BTEwgTEVUVEVSIExPTkcgUyBXSVRIIERPVCBBQk9WRV0KKyJcdTFFOUIiID0+ICJmIgorCisjIOKTlSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIEZdCisiXHUyNEQ1IiA9PiAiZiIKKworIyDqnbwgIFtMQVRJTiBTTUFMTCBMRVRURVIgSU5TVUxBUiBGXQorIlx1QTc3QyIgPT4gImYiCisKKyMg772GICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBGXQorIlx1RkY0NiIgPT4gImYiCisKKyMg4pKhICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgRl0KKyJcdTI0QTEiID0+ICIoZikiCisKKyMg76yAICBbTEFUSU4gU01BTEwgTElHQVRVUkUgRkZdCisiXHVGQjAwIiA9PiAiZmYiCisKKyMg76yDICBbTEFUSU4gU01BTEwgTElHQVRVUkUgRkZJXQorIlx1RkIwMyIgPT4gImZmaSIKKworIyDvrIQgIFtMQVRJTiBTTUFMTCBMSUdBVFVSRSBGRkxdCisiXHVGQjA0IiA9PiAiZmZsIgorCisjIO+sgSAgW0xBVElOIFNNQUxMIExJR0FUVVJFIEZJXQorIlx1RkIwMSIgPT4gImZpIgorCisjIO+sgiAgW0xBVElOIFNNQUxMIExJR0FUVVJFIEZMXQorIlx1RkIwMiIgPT4gImZsIgorCisjIMScICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENJUkNVTUZMRVhdCisiXHUwMTFDIiA9PiAiRyIKKworIyDEniAgW0xBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBCUkVWRV0KKyJcdTAxMUUiID0+ICJHIgorCisjIMSgICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIERPVCBBQk9WRV0KKyJcdTAxMjAiID0+ICJHIgorCisjIMSiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENFRElMTEFdCisiXHUwMTIyIiA9PiAiRyIKKworIyDGkyAgW0xBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBIT09LXQorIlx1MDE5MyIgPT4gIkciCisKKyMgx6QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggU1RST0tFXQorIlx1MDFFNCIgPT4gIkciCisKKyMgx6UgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIFNUUk9LRV0KKyJcdTAxRTUiID0+ICJHIgorCisjIMemICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENBUk9OXQorIlx1MDFFNiIgPT4gIkciCisKKyMgx6cgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENBUk9OXQorIlx1MDFFNyIgPT4gIkciCisKKyMgx7QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQUNVVEVdCisiXHUwMUY0IiA9PiAiRyIKKworIyDJoiAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEddCisiXHUwMjYyIiA9PiAiRyIKKworIyDKmyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEcgV0lUSCBIT09LXQorIlx1MDI5QiIgPT4gIkciCisKKyMg4bigICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIE1BQ1JPTl0KKyJcdTFFMjAiID0+ICJHIgorCisjIOKSvCAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgR10KKyJcdTI0QkMiID0+ICJHIgorCisjIOqdvSAgW0xBVElOIENBUElUQUwgTEVUVEVSIElOU1VMQVIgR10KKyJcdUE3N0QiID0+ICJHIgorCisjIOqdviAgW0xBVElOIENBUElUQUwgTEVUVEVSIFRVUk5FRCBJTlNVTEFSIEddCisiXHVBNzdFIiA9PiAiRyIKKworIyDvvKcgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgR10KKyJcdUZGMjciID0+ICJHIgorCisjIMSdICBbTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDSVJDVU1GTEVYXQorIlx1MDExRCIgPT4gImciCisKKyMgxJ8gIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEJSRVZFXQorIlx1MDExRiIgPT4gImciCisKKyMgxKEgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIERPVCBBQk9WRV0KKyJcdTAxMjEiID0+ICJnIgorCisjIMSjICBbTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDRURJTExBXQorIlx1MDEyMyIgPT4gImciCisKKyMgx7UgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEFDVVRFXQorIlx1MDFGNSIgPT4gImciCisKKyMgyaAgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEhPT0tdCisiXHUwMjYwIiA9PiAiZyIKKworIyDJoSAgW0xBVElOIFNNQUxMIExFVFRFUiBTQ1JJUFQgR10KKyJcdTAyNjEiID0+ICJnIgorCisjIOG1tyAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgR10KKyJcdTFENzciID0+ICJnIgorCisjIOG1uSAgW0xBVElOIFNNQUxMIExFVFRFUiBJTlNVTEFSIEddCisiXHUxRDc5IiA9PiAiZyIKKworIyDhtoMgIFtMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIFBBTEFUQUwgSE9PS10KKyJcdTFEODMiID0+ICJnIgorCisjIOG4oSAgW0xBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggTUFDUk9OXQorIlx1MUUyMSIgPT4gImciCisKKyMg4pOWICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgR10KKyJcdTI0RDYiID0+ICJnIgorCisjIOqdvyAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgSU5TVUxBUiBHXQorIlx1QTc3RiIgPT4gImciCisKKyMg772HICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBHXQorIlx1RkY0NyIgPT4gImciCisKKyMg4pKiICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgR10KKyJcdTI0QTIiID0+ICIoZykiCisKKyMgxKQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAxMjQiID0+ICJIIgorCisjIMSmICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIFNUUk9LRV0KKyJcdTAxMjYiID0+ICJIIgorCisjIMieICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIENBUk9OXQorIlx1MDIxRSIgPT4gIkgiCisKKyMgypwgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBIXQorIlx1MDI5QyIgPT4gIkgiCisKKyMg4biiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIERPVCBBQk9WRV0KKyJcdTFFMjIiID0+ICJIIgorCisjIOG4pCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEggV0lUSCBET1QgQkVMT1ddCisiXHUxRTI0IiA9PiAiSCIKKworIyDhuKYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggRElBRVJFU0lTXQorIlx1MUUyNiIgPT4gIkgiCisKKyMg4bioICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIENFRElMTEFdCisiXHUxRTI4IiA9PiAiSCIKKworIyDhuKogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggQlJFVkUgQkVMT1ddCisiXHUxRTJBIiA9PiAiSCIKKworIyDikr0gIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIEhdCisiXHUyNEJEIiA9PiAiSCIKKworIyDisacgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggREVTQ0VOREVSXQorIlx1MkM2NyIgPT4gIkgiCisKKyMg4rG1ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSEFMRiBIXQorIlx1MkM3NSIgPT4gIkgiCisKKyMg77yoICBbRlVMTFdJRFRIIExBVElOIENBUElUQUwgTEVUVEVSIEhdCisiXHVGRjI4IiA9PiAiSCIKKworIyDEpSAgW0xBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAxMjUiID0+ICJoIgorCisjIMSnICBbTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBTVFJPS0VdCisiXHUwMTI3IiA9PiAiaCIKKworIyDInyAgW0xBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggQ0FST05dCisiXHUwMjFGIiA9PiAiaCIKKworIyDJpSAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgSF0KKyJcdTAyNjUiID0+ICJoIgorCisjIMmmICBbTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBIT09LXQorIlx1MDI2NiIgPT4gImgiCisKKyMgyq4gIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIEggV0lUSCBGSVNISE9PS10KKyJcdTAyQUUiID0+ICJoIgorCisjIMqvICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBIIFdJVEggRklTSEhPT0sgQU5EIFRBSUxdCisiXHUwMkFGIiA9PiAiaCIKKworIyDhuKMgIFtMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIERPVCBBQk9WRV0KKyJcdTFFMjMiID0+ICJoIgorCisjIOG4pSAgW0xBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggRE9UIEJFTE9XXQorIlx1MUUyNSIgPT4gImgiCisKKyMg4binICBbTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBESUFFUkVTSVNdCisiXHUxRTI3IiA9PiAiaCIKKworIyDhuKkgIFtMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIENFRElMTEFdCisiXHUxRTI5IiA9PiAiaCIKKworIyDhuKsgIFtMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIEJSRVZFIEJFTE9XXQorIlx1MUUyQiIgPT4gImgiCisKKyMg4bqWICBbTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBMSU5FIEJFTE9XXQorIlx1MUU5NiIgPT4gImgiCisKKyMg4pOXICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgSF0KKyJcdTI0RDciID0+ICJoIgorCisjIOKxqCAgW0xBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggREVTQ0VOREVSXQorIlx1MkM2OCIgPT4gImgiCisKKyMg4rG2ICBbTEFUSU4gU01BTEwgTEVUVEVSIEhBTEYgSF0KKyJcdTJDNzYiID0+ICJoIgorCisjIO+9iCAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgSF0KKyJcdUZGNDgiID0+ICJoIgorCisjIMe2ICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h3YWlyICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSFdBSVJdCisiXHUwMUY2IiA9PiAiSFYiCisKKyMg4pKjICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgSF0KKyJcdTI0QTMiID0+ICIoaCkiCisKKyMgxpUgIFtMQVRJTiBTTUFMTCBMRVRURVIgSFZdCisiXHUwMTk1IiA9PiAiaHYiCisKKyMgw4wgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkVdCisiXHUwMENDIiA9PiAiSSIKKworIyDDjSAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURV0KKyJcdTAwQ0QiID0+ICJJIgorCisjIMOOICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVhdCisiXHUwMENFIiA9PiAiSSIKKworIyDDjyAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVNdCisiXHUwMENGIiA9PiAiSSIKKworIyDEqCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBUSUxERV0KKyJcdTAxMjgiID0+ICJJIgorCisjIMSqICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTl0KKyJcdTAxMkEiID0+ICJJIgorCisjIMSsICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEJSRVZFXQorIlx1MDEyQyIgPT4gIkkiCisKKyMgxK4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLXQorIlx1MDEyRSIgPT4gIkkiCisKKyMgxLAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRE9UIEFCT1ZFXQorIlx1MDEzMCIgPT4gIkkiCisKKyMgxpYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJT1RBXQorIlx1MDE5NiIgPT4gIkkiCisKKyMgxpcgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggU1RST0tFXQorIlx1MDE5NyIgPT4gIkkiCisKKyMgx48gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0FST05dCisiXHUwMUNGIiA9PiAiSSIKKworIyDIiCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1VCTEUgR1JBVkVdCisiXHUwMjA4IiA9PiAiSSIKKworIyDIiiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBJTlZFUlRFRCBCUkVWRV0KKyJcdTAyMEEiID0+ICJJIgorCisjIMmqICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgSV0KKyJcdTAyNkEiID0+ICJJIgorCisjIOG1uyAgW0xBVElOIFNNQUxMIENBUElUQUwgTEVUVEVSIEkgV0lUSCBTVFJPS0VdCisiXHUxRDdCIiA9PiAiSSIKKworIyDhuKwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggVElMREUgQkVMT1ddCisiXHUxRTJDIiA9PiAiSSIKKworIyDhuK4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTIEFORCBBQ1VURV0KKyJcdTFFMkUiID0+ICJJIgorCisjIOG7iCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBIT09LIEFCT1ZFXQorIlx1MUVDOCIgPT4gIkkiCisKKyMg4buKICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERPVCBCRUxPV10KKyJcdTFFQ0EiID0+ICJJIgorCisjIOKSviAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSV0KKyJcdTI0QkUiID0+ICJJIgorCisjIOqfviAgW0xBVElOIEVQSUdSQVBISUMgTEVUVEVSIEkgTE9OR0FdCisiXHVBN0ZFIiA9PiAiSSIKKworIyDvvKkgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgSV0KKyJcdUZGMjkiID0+ICJJIgorCisjIMOsICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRV0KKyJcdTAwRUMiID0+ICJpIgorCisjIMOtICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURV0KKyJcdTAwRUQiID0+ICJpIgorCisjIMOuICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYXQorIlx1MDBFRSIgPT4gImkiCisKKyMgw68gIFtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJU10KKyJcdTAwRUYiID0+ICJpIgorCisjIMSpICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBUSUxERV0KKyJcdTAxMjkiID0+ICJpIgorCisjIMSrICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST05dCisiXHUwMTJCIiA9PiAiaSIKKworIyDErSAgW0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQlJFVkVdCisiXHUwMTJEIiA9PiAiaSIKKworIyDEryAgW0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLXQorIlx1MDEyRiIgPT4gImkiCisKKyMgxLEgIFtMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJXQorIlx1MDEzMSIgPT4gImkiCisKKyMgx5AgIFtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENBUk9OXQorIlx1MDFEMCIgPT4gImkiCisKKyMgyIkgIFtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERPVUJMRSBHUkFWRV0KKyJcdTAyMDkiID0+ICJpIgorCisjIMiLICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBJTlZFUlRFRCBCUkVWRV0KKyJcdTAyMEIiID0+ICJpIgorCisjIMmoICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBTVFJPS0VdCisiXHUwMjY4IiA9PiAiaSIKKworIyDhtIkgIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIEldCisiXHUxRDA5IiA9PiAiaSIKKworIyDhtaIgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIEldCisiXHUxRDYyIiA9PiAiaSIKKworIyDhtbwgIFtMQVRJTiBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFNUUk9LRV0KKyJcdTFEN0MiID0+ICJpIgorCisjIOG2liAgW0xBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggUkVUUk9GTEVYIEhPT0tdCisiXHUxRDk2IiA9PiAiaSIKKworIyDhuK0gIFtMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIFRJTERFIEJFTE9XXQorIlx1MUUyRCIgPT4gImkiCisKKyMg4bivICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMgQU5EIEFDVVRFXQorIlx1MUUyRiIgPT4gImkiCisKKyMg4buJICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBIT09LIEFCT1ZFXQorIlx1MUVDOSIgPT4gImkiCisKKyMg4buLICBbTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBET1QgQkVMT1ddCisiXHUxRUNCIiA9PiAiaSIKKworIyDigbEgIFtTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgSV0KKyJcdTIwNzEiID0+ICJpIgorCisjIOKTmCAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIEldCisiXHUyNEQ4IiA9PiAiaSIKKworIyDvvYkgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIEldCisiXHVGRjQ5IiA9PiAiaSIKKworIyDEsiAgW0xBVElOIENBUElUQUwgTElHQVRVUkUgSUpdCisiXHUwMTMyIiA9PiAiSUoiCisKKyMg4pKkICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgSV0KKyJcdTI0QTQiID0+ICIoaSkiCisKKyMgxLMgIFtMQVRJTiBTTUFMTCBMSUdBVFVSRSBJSl0KKyJcdTAxMzMiID0+ICJpaiIKKworIyDEtCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEogV0lUSCBDSVJDVU1GTEVYXQorIlx1MDEzNCIgPT4gIkoiCisKKyMgyYggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBKIFdJVEggU1RST0tFXQorIlx1MDI0OCIgPT4gIkoiCisKKyMg4bSKICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgSl0KKyJcdTFEMEEiID0+ICJKIgorCisjIOKSvyAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSl0KKyJcdTI0QkYiID0+ICJKIgorCisjIO+8qiAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBKXQorIlx1RkYyQSIgPT4gIkoiCisKKyMgxLUgIFtMQVRJTiBTTUFMTCBMRVRURVIgSiBXSVRIIENJUkNVTUZMRVhdCisiXHUwMTM1IiA9PiAiaiIKKworIyDHsCAgW0xBVElOIFNNQUxMIExFVFRFUiBKIFdJVEggQ0FST05dCisiXHUwMUYwIiA9PiAiaiIKKworIyDItyAgW0xBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEpdCisiXHUwMjM3IiA9PiAiaiIKKworIyDJiSAgW0xBVElOIFNNQUxMIExFVFRFUiBKIFdJVEggU1RST0tFXQorIlx1MDI0OSIgPT4gImoiCisKKyMgyZ8gIFtMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBKIFdJVEggU1RST0tFXQorIlx1MDI1RiIgPT4gImoiCisKKyMgyoQgIFtMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBKIFdJVEggU1RST0tFIEFORCBIT09LXQorIlx1MDI4NCIgPT4gImoiCisKKyMgyp0gIFtMQVRJTiBTTUFMTCBMRVRURVIgSiBXSVRIIENST1NTRUQtVEFJTF0KKyJcdTAyOUQiID0+ICJqIgorCisjIOKTmSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIEpdCisiXHUyNEQ5IiA9PiAiaiIKKworIyDisbwgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIEpdCisiXHUyQzdDIiA9PiAiaiIKKworIyDvvYogIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIEpdCisiXHVGRjRBIiA9PiAiaiIKKworIyDikqUgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBKXQorIlx1MjRBNSIgPT4gIihqKSIKKworIyDEtiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBDRURJTExBXQorIlx1MDEzNiIgPT4gIksiCisKKyMgxpggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggSE9PS10KKyJcdTAxOTgiID0+ICJLIgorCisjIMeoICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENBUk9OXQorIlx1MDFFOCIgPT4gIksiCisKKyMg4bSLICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgS10KKyJcdTFEMEIiID0+ICJLIgorCisjIOG4sCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBBQ1VURV0KKyJcdTFFMzAiID0+ICJLIgorCisjIOG4siAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBET1QgQkVMT1ddCisiXHUxRTMyIiA9PiAiSyIKKworIyDhuLQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggTElORSBCRUxPV10KKyJcdTFFMzQiID0+ICJLIgorCisjIOKTgCAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgS10KKyJcdTI0QzAiID0+ICJLIgorCisjIOKxqSAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBERVNDRU5ERVJdCisiXHUyQzY5IiA9PiAiSyIKKworIyDqnYAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggU1RST0tFXQorIlx1QTc0MCIgPT4gIksiCisKKyMg6p2CICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIERJQUdPTkFMIFNUUk9LRV0KKyJcdUE3NDIiID0+ICJLIgorCisjIOqdhCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBTVFJPS0UgQU5EIERJQUdPTkFMIFNUUk9LRV0KKyJcdUE3NDQiID0+ICJLIgorCisjIO+8qyAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBLXQorIlx1RkYyQiIgPT4gIksiCisKKyMgxLcgIFtMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEFdCisiXHUwMTM3IiA9PiAiayIKKworIyDGmSAgW0xBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggSE9PS10KKyJcdTAxOTkiID0+ICJrIgorCisjIMepICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBDQVJPTl0KKyJcdTAxRTkiID0+ICJrIgorCisjIMqeICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBLXQorIlx1MDI5RSIgPT4gImsiCisKKyMg4baEICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDg0IiA9PiAiayIKKworIyDhuLEgIFtMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIEFDVVRFXQorIlx1MUUzMSIgPT4gImsiCisKKyMg4bizICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBET1QgQkVMT1ddCisiXHUxRTMzIiA9PiAiayIKKworIyDhuLUgIFtMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTM1IiA9PiAiayIKKworIyDik5ogIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBLXQorIlx1MjREQSIgPT4gImsiCisKKyMg4rGqICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBERVNDRU5ERVJdCisiXHUyQzZBIiA9PiAiayIKKworIyDqnYEgIFtMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIFNUUk9LRV0KKyJcdUE3NDEiID0+ICJrIgorCisjIOqdgyAgW0xBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggRElBR09OQUwgU1RST0tFXQorIlx1QTc0MyIgPT4gImsiCisKKyMg6p2FICBbTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBTVFJPS0UgQU5EIERJQUdPTkFMIFNUUk9LRV0KKyJcdUE3NDUiID0+ICJrIgorCisjIO+9iyAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgS10KKyJcdUZGNEIiID0+ICJrIgorCisjIOKSpiAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIEtdCisiXHUyNEE2IiA9PiAiKGspIgorCisjIMS5ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEFDVVRFXQorIlx1MDEzOSIgPT4gIkwiCisKKyMgxLsgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0VESUxMQV0KKyJcdTAxM0IiID0+ICJMIgorCisjIMS9ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENBUk9OXQorIlx1MDEzRCIgPT4gIkwiCisKKyMgxL8gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggTUlERExFIERPVF0KKyJcdTAxM0YiID0+ICJMIgorCisjIMWBICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRV0KKyJcdTAxNDEiID0+ICJMIgorCisjIMi9ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEJBUl0KKyJcdTAyM0QiID0+ICJMIgorCisjIMqfICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgTF0KKyJcdTAyOUYiID0+ICJMIgorCisjIOG0jCAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIEwgV0lUSCBTVFJPS0VdCisiXHUxRDBDIiA9PiAiTCIKKworIyDhuLYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggRE9UIEJFTE9XXQorIlx1MUUzNiIgPT4gIkwiCisKKyMg4bi4ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIERPVCBCRUxPVyBBTkQgTUFDUk9OXQorIlx1MUUzOCIgPT4gIkwiCisKKyMg4bi6ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTNBIiA9PiAiTCIKKworIyDhuLwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFM0MiID0+ICJMIgorCisjIOKTgSAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTF0KKyJcdTI0QzEiID0+ICJMIgorCisjIOKxoCAgW0xBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBET1VCTEUgQkFSXQorIlx1MkM2MCIgPT4gIkwiCisKKyMg4rGiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIE1JRERMRSBUSUxERV0KKyJcdTJDNjIiID0+ICJMIgorCisjIOqdhiAgW0xBVElOIENBUElUQUwgTEVUVEVSIEJST0tFTiBMXQorIlx1QTc0NiIgPT4gIkwiCisKKyMg6p2IICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEhJR0ggU1RST0tFXQorIlx1QTc0OCIgPT4gIkwiCisKKyMg6p6AICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVFVSTkVEIExdCisiXHVBNzgwIiA9PiAiTCIKKworIyDvvKwgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgTF0KKyJcdUZGMkMiID0+ICJMIgorCisjIMS6ICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBBQ1VURV0KKyJcdTAxM0EiID0+ICJsIgorCisjIMS8ICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDRURJTExBXQorIlx1MDEzQyIgPT4gImwiCisKKyMgxL4gIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENBUk9OXQorIlx1MDEzRSIgPT4gImwiCisKKyMgxYAgIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIE1JRERMRSBET1RdCisiXHUwMTQwIiA9PiAibCIKKworIyDFgiAgW0xBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFXQorIlx1MDE0MiIgPT4gImwiCisKKyMgxpogIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIEJBUl0KKyJcdTAxOUEiID0+ICJsIgorCisjIMi0ICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDVVJMXQorIlx1MDIzNCIgPT4gImwiCisKKyMgyasgIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIE1JRERMRSBUSUxERV0KKyJcdTAyNkIiID0+ICJsIgorCisjIMmsICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBCRUxUXQorIlx1MDI2QyIgPT4gImwiCisKKyMgya0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFJFVFJPRkxFWCBIT09LXQorIlx1MDI2RCIgPT4gImwiCisKKyMg4baFICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDg1IiA9PiAibCIKKworIyDhuLcgIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIERPVCBCRUxPV10KKyJcdTFFMzciID0+ICJsIgorCisjIOG4uSAgW0xBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggRE9UIEJFTE9XIEFORCBNQUNST05dCisiXHUxRTM5IiA9PiAibCIKKworIyDhuLsgIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTNCIiA9PiAibCIKKworIyDhuL0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENJUkNVTUZMRVggQkVMT1ddCisiXHUxRTNEIiA9PiAibCIKKworIyDik5sgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBMXQorIlx1MjREQiIgPT4gImwiCisKKyMg4rGhICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBET1VCTEUgQkFSXQorIlx1MkM2MSIgPT4gImwiCisKKyMg6p2HICBbTEFUSU4gU01BTEwgTEVUVEVSIEJST0tFTiBMXQorIlx1QTc0NyIgPT4gImwiCisKKyMg6p2JICBbTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBISUdIIFNUUk9LRV0KKyJcdUE3NDkiID0+ICJsIgorCisjIOqegSAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgTF0KKyJcdUE3ODEiID0+ICJsIgorCisjIO+9jCAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgTF0KKyJcdUZGNEMiID0+ICJsIgorCisjIMeHICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTEpdCisiXHUwMUM3IiA9PiAiTEoiCisKKyMg4bu6ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTUlERExFLVdFTFNIIExMXQorIlx1MUVGQSIgPT4gIkxMIgorCisjIMeIICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNNQUxMIExFVFRFUiBKXQorIlx1MDFDOCIgPT4gIkxqIgorCisjIOKSpyAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIExdCisiXHUyNEE3IiA9PiAiKGwpIgorCisjIMeJICBbTEFUSU4gU01BTEwgTEVUVEVSIExKXQorIlx1MDFDOSIgPT4gImxqIgorCisjIOG7uyAgW0xBVElOIFNNQUxMIExFVFRFUiBNSURETEUtV0VMU0ggTExdCisiXHUxRUZCIiA9PiAibGwiCisKKyMgyqogIFtMQVRJTiBTTUFMTCBMRVRURVIgTFMgRElHUkFQSF0KKyJcdTAyQUEiID0+ICJscyIKKworIyDKqyAgW0xBVElOIFNNQUxMIExFVFRFUiBMWiBESUdSQVBIXQorIlx1MDJBQiIgPT4gImx6IgorCisjIMacICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVFVSTkVEIE1dCisiXHUwMTlDIiA9PiAiTSIKKworIyDhtI0gIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBNXQorIlx1MUQwRCIgPT4gIk0iCisKKyMg4bi+ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTSBXSVRIIEFDVVRFXQorIlx1MUUzRSIgPT4gIk0iCisKKyMg4bmAICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTSBXSVRIIERPVCBBQk9WRV0KKyJcdTFFNDAiID0+ICJNIgorCisjIOG5giAgW0xBVElOIENBUElUQUwgTEVUVEVSIE0gV0lUSCBET1QgQkVMT1ddCisiXHUxRTQyIiA9PiAiTSIKKworIyDik4IgIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIE1dCisiXHUyNEMyIiA9PiAiTSIKKworIyDisa4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBNIFdJVEggSE9PS10KKyJcdTJDNkUiID0+ICJNIgorCisjIOqfvSAgW0xBVElOIEVQSUdSQVBISUMgTEVUVEVSIElOVkVSVEVEIE1dCisiXHVBN0ZEIiA9PiAiTSIKKworIyDqn78gIFtMQVRJTiBFUElHUkFQSElDIExFVFRFUiBBUkNIQUlDIE1dCisiXHVBN0ZGIiA9PiAiTSIKKworIyDvvK0gIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgTV0KKyJcdUZGMkQiID0+ICJNIgorCisjIMmvICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBNXQorIlx1MDI2RiIgPT4gIm0iCisKKyMgybAgIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIE0gV0lUSCBMT05HIExFR10KKyJcdTAyNzAiID0+ICJtIgorCisjIMmxICBbTEFUSU4gU01BTEwgTEVUVEVSIE0gV0lUSCBIT09LXQorIlx1MDI3MSIgPT4gIm0iCisKKyMg4bWvICBbTEFUSU4gU01BTEwgTEVUVEVSIE0gV0lUSCBNSURETEUgVElMREVdCisiXHUxRDZGIiA9PiAibSIKKworIyDhtoYgIFtMQVRJTiBTTUFMTCBMRVRURVIgTSBXSVRIIFBBTEFUQUwgSE9PS10KKyJcdTFEODYiID0+ICJtIgorCisjIOG4vyAgW0xBVElOIFNNQUxMIExFVFRFUiBNIFdJVEggQUNVVEVdCisiXHUxRTNGIiA9PiAibSIKKworIyDhuYEgIFtMQVRJTiBTTUFMTCBMRVRURVIgTSBXSVRIIERPVCBBQk9WRV0KKyJcdTFFNDEiID0+ICJtIgorCisjIOG5gyAgW0xBVElOIFNNQUxMIExFVFRFUiBNIFdJVEggRE9UIEJFTE9XXQorIlx1MUU0MyIgPT4gIm0iCisKKyMg4pOcICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgTV0KKyJcdTI0REMiID0+ICJtIgorCisjIO+9jSAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgTV0KKyJcdUZGNEQiID0+ICJtIgorCisjIOKSqCAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIE1dCisiXHUyNEE4IiA9PiAiKG0pIgorCisjIMORICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFXQorIlx1MDBEMSIgPT4gIk4iCisKKyMgxYMgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQUNVVEVdCisiXHUwMTQzIiA9PiAiTiIKKworIyDFhSAgW0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBXQorIlx1MDE0NSIgPT4gIk4iCisKKyMgxYcgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0FST05dCisiXHUwMTQ3IiA9PiAiTiIKKworIyDFiiAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbmdfKGxldHRlcikgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBFTkddCisiXHUwMTRBIiA9PiAiTiIKKworIyDGnSAgW0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBMRUZUIEhPT0tdCisiXHUwMTlEIiA9PiAiTiIKKworIyDHuCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBHUkFWRV0KKyJcdTAxRjgiID0+ICJOIgorCisjIMigICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIExPTkcgUklHSFQgTEVHXQorIlx1MDIyMCIgPT4gIk4iCisKKyMgybQgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBOXQorIlx1MDI3NCIgPT4gIk4iCisKKyMg4bSOICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgUkVWRVJTRUQgTl0KKyJcdTFEMEUiID0+ICJOIgorCisjIOG5hCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBET1QgQUJPVkVdCisiXHUxRTQ0IiA9PiAiTiIKKworIyDhuYYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggRE9UIEJFTE9XXQorIlx1MUU0NiIgPT4gIk4iCisKKyMg4bmIICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTQ4IiA9PiAiTiIKKworIyDhuYogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFNEEiID0+ICJOIgorCisjIOKTgyAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTl0KKyJcdTI0QzMiID0+ICJOIgorCisjIO+8riAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBOXQorIlx1RkYyRSIgPT4gIk4iCisKKyMgw7EgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFXQorIlx1MDBGMSIgPT4gIm4iCisKKyMgxYQgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFXQorIlx1MDE0NCIgPT4gIm4iCisKKyMgxYYgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEFdCisiXHUwMTQ2IiA9PiAibiIKKworIyDFiCAgW0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0FST05dCisiXHUwMTQ4IiA9PiAibiIKKworIyDFiSAgW0xBVElOIFNNQUxMIExFVFRFUiBOIFBSRUNFREVEIEJZIEFQT1NUUk9QSEVdCisiXHUwMTQ5IiA9PiAibiIKKworIyDFiyAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbmdfKGxldHRlcikgIFtMQVRJTiBTTUFMTCBMRVRURVIgRU5HXQorIlx1MDE0QiIgPT4gIm4iCisKKyMgxp4gIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIExPTkcgUklHSFQgTEVHXQorIlx1MDE5RSIgPT4gIm4iCisKKyMgx7kgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEdSQVZFXQorIlx1MDFGOSIgPT4gIm4iCisKKyMgyLUgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENVUkxdCisiXHUwMjM1IiA9PiAibiIKKworIyDJsiAgW0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggTEVGVCBIT09LXQorIlx1MDI3MiIgPT4gIm4iCisKKyMgybMgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFJFVFJPRkxFWCBIT09LXQorIlx1MDI3MyIgPT4gIm4iCisKKyMg4bWwICBbTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBNSURETEUgVElMREVdCisiXHUxRDcwIiA9PiAibiIKKworIyDhtocgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFBBTEFUQUwgSE9PS10KKyJcdTFEODciID0+ICJuIgorCisjIOG5hSAgW0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggRE9UIEFCT1ZFXQorIlx1MUU0NSIgPT4gIm4iCisKKyMg4bmHICBbTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBET1QgQkVMT1ddCisiXHUxRTQ3IiA9PiAibiIKKworIyDhuYkgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTQ5IiA9PiAibiIKKworIyDhuYsgIFtMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENJUkNVTUZMRVggQkVMT1ddCisiXHUxRTRCIiA9PiAibiIKKworIyDigb8gIFtTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTl0KKyJcdTIwN0YiID0+ICJuIgorCisjIOKTnSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIE5dCisiXHUyNEREIiA9PiAibiIKKworIyDvvY4gIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIE5dCisiXHVGRjRFIiA9PiAibiIKKworIyDHiiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE5KXQorIlx1MDFDQSIgPT4gIk5KIgorCisjIMeLICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFNNQUxMIExFVFRFUiBKXQorIlx1MDFDQiIgPT4gIk5qIgorCisjIOKSqSAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIE5dCisiXHUyNEE5IiA9PiAiKG4pIgorCisjIMeMICBbTEFUSU4gU01BTEwgTEVUVEVSIE5KXQorIlx1MDFDQyIgPT4gIm5qIgorCisjIMOSICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFXQorIlx1MDBEMiIgPT4gIk8iCisKKyMgw5MgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEVdCisiXHUwMEQzIiA9PiAiTyIKKworIyDDlCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYXQorIlx1MDBENCIgPT4gIk8iCisKKyMgw5UgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREVdCisiXHUwMEQ1IiA9PiAiTyIKKworIyDDliAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVNdCisiXHUwMEQ2IiA9PiAiTyIKKworIyDDmCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0VdCisiXHUwMEQ4IiA9PiAiTyIKKworIyDFjCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST05dCisiXHUwMTRDIiA9PiAiTyIKKworIyDFjiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBCUkVWRV0KKyJcdTAxNEUiID0+ICJPIgorCisjIMWQICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURV0KKyJcdTAxNTAiID0+ICJPIgorCisjIMaGICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgT1BFTiBPXQorIlx1MDE4NiIgPT4gIk8iCisKKyMgxp8gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUlERExFIFRJTERFXQorIlx1MDE5RiIgPT4gIk8iCisKKyMgxqAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STl0KKyJcdTAxQTAiID0+ICJPIgorCisjIMeRICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENBUk9OXQorIlx1MDFEMSIgPT4gIk8iCisKKyMgx6ogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggT0dPTkVLXQorIlx1MDFFQSIgPT4gIk8iCisKKyMgx6wgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggT0dPTkVLIEFORCBNQUNST05dCisiXHUwMUVDIiA9PiAiTyIKKworIyDHviAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgQU5EIEFDVVRFXQorIlx1MDFGRSIgPT4gIk8iCisKKyMgyIwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRE9VQkxFIEdSQVZFXQorIlx1MDIwQyIgPT4gIk8iCisKKyMgyI4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSU5WRVJURUQgQlJFVkVdCisiXHUwMjBFIiA9PiAiTyIKKworIyDIqiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMgQU5EIE1BQ1JPTl0KKyJcdTAyMkEiID0+ICJPIgorCisjIMisICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFIEFORCBNQUNST05dCisiXHUwMjJDIiA9PiAiTyIKKworIyDIriAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1QgQUJPVkVdCisiXHUwMjJFIiA9PiAiTyIKKworIyDIsCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1QgQUJPVkUgQU5EIE1BQ1JPTl0KKyJcdTAyMzAiID0+ICJPIgorCisjIOG0jyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIE9dCisiXHUxRDBGIiA9PiAiTyIKKworIyDhtJAgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBPUEVOIE9dCisiXHUxRDEwIiA9PiAiTyIKKworIyDhuYwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUgQU5EIEFDVVRFXQorIlx1MUU0QyIgPT4gIk8iCisKKyMg4bmOICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFIEFORCBESUFFUkVTSVNdCisiXHUxRTRFIiA9PiAiTyIKKworIyDhuZAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OIEFORCBHUkFWRV0KKyJcdTFFNTAiID0+ICJPIgorCisjIOG5kiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST04gQU5EIEFDVVRFXQorIlx1MUU1MiIgPT4gIk8iCisKKyMg4buMICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVCBCRUxPV10KKyJcdTFFQ0MiID0+ICJPIgorCisjIOG7jiAgW0xBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBIT09LIEFCT1ZFXQorIlx1MUVDRSIgPT4gIk8iCisKKyMg4buQICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFXQorIlx1MUVEMCIgPT4gIk8iCisKKyMg4buSICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFXQorIlx1MUVEMiIgPT4gIk8iCisKKyMg4buUICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkVdCisiXHUxRUQ0IiA9PiAiTyIKKworIyDhu5YgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgVElMREVdCisiXHUxRUQ2IiA9PiAiTyIKKworIyDhu5ggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgRE9UIEJFTE9XXQorIlx1MUVEOCIgPT4gIk8iCisKKyMg4buaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEFDVVRFXQorIlx1MUVEQSIgPT4gIk8iCisKKyMg4bucICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEdSQVZFXQorIlx1MUVEQyIgPT4gIk8iCisKKyMg4bueICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEhPT0sgQUJPVkVdCisiXHUxRURFIiA9PiAiTyIKKworIyDhu6AgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgVElMREVdCisiXHUxRUUwIiA9PiAiTyIKKworIyDhu6IgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgRE9UIEJFTE9XXQorIlx1MUVFMiIgPT4gIk8iCisKKyMg4pOEICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPXQorIlx1MjRDNCIgPT4gIk8iCisKKyMg6p2KICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIExPTkcgU1RST0tFIE9WRVJMQVldCisiXHVBNzRBIiA9PiAiTyIKKworIyDqnYwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTE9PUF0KKyJcdUE3NEMiID0+ICJPIgorCisjIO+8ryAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPXQorIlx1RkYyRiIgPT4gIk8iCisKKyMgw7IgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFXQorIlx1MDBGMiIgPT4gIm8iCisKKyMgw7MgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFXQorIlx1MDBGMyIgPT4gIm8iCisKKyMgw7QgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVhdCisiXHUwMEY0IiA9PiAibyIKKworIyDDtSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREVdCisiXHUwMEY1IiA9PiAibyIKKworIyDDtiAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTXQorIlx1MDBGNiIgPT4gIm8iCisKKyMgw7ggIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRV0KKyJcdTAwRjgiID0+ICJvIgorCisjIMWNICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST05dCisiXHUwMTREIiA9PiAibyIKKworIyDFjyAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQlJFVkVdCisiXHUwMTRGIiA9PiAibyIKKworIyDFkSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFXQorIlx1MDE1MSIgPT4gIm8iCisKKyMgxqEgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk5dCisiXHUwMUExIiA9PiAibyIKKworIyDHkiAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0FST05dCisiXHUwMUQyIiA9PiAibyIKKworIyDHqyAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggT0dPTkVLXQorIlx1MDFFQiIgPT4gIm8iCisKKyMgx60gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIE9HT05FSyBBTkQgTUFDUk9OXQorIlx1MDFFRCIgPT4gIm8iCisKKyMgx78gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRSBBTkQgQUNVVEVdCisiXHUwMUZGIiA9PiAibyIKKworIyDIjSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEdSQVZFXQorIlx1MDIwRCIgPT4gIm8iCisKKyMgyI8gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIElOVkVSVEVEIEJSRVZFXQorIlx1MDIwRiIgPT4gIm8iCisKKyMgyKsgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyBBTkQgTUFDUk9OXQorIlx1MDIyQiIgPT4gIm8iCisKKyMgyK0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFIEFORCBNQUNST05dCisiXHUwMjJEIiA9PiAibyIKKworIyDIryAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9UIEFCT1ZFXQorIlx1MDIyRiIgPT4gIm8iCisKKyMgyLEgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVCBBQk9WRSBBTkQgTUFDUk9OXQorIlx1MDIzMSIgPT4gIm8iCisKKyMgyZQgIFtMQVRJTiBTTUFMTCBMRVRURVIgT1BFTiBPXQorIlx1MDI1NCIgPT4gIm8iCisKKyMgybUgIFtMQVRJTiBTTUFMTCBMRVRURVIgQkFSUkVEIE9dCisiXHUwMjc1IiA9PiAibyIKKworIyDhtJYgIFtMQVRJTiBTTUFMTCBMRVRURVIgVE9QIEhBTEYgT10KKyJcdTFEMTYiID0+ICJvIgorCisjIOG0lyAgW0xBVElOIFNNQUxMIExFVFRFUiBCT1RUT00gSEFMRiBPXQorIlx1MUQxNyIgPT4gIm8iCisKKyMg4baXICBbTEFUSU4gU01BTEwgTEVUVEVSIE9QRU4gTyBXSVRIIFJFVFJPRkxFWCBIT09LXQorIlx1MUQ5NyIgPT4gIm8iCisKKyMg4bmNICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERSBBTkQgQUNVVEVdCisiXHUxRTREIiA9PiAibyIKKworIyDhuY8gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFIEFORCBESUFFUkVTSVNdCisiXHUxRTRGIiA9PiAibyIKKworIyDhuZEgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIE1BQ1JPTiBBTkQgR1JBVkVdCisiXHUxRTUxIiA9PiAibyIKKworIyDhuZMgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIE1BQ1JPTiBBTkQgQUNVVEVdCisiXHUxRTUzIiA9PiAibyIKKworIyDhu40gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVCBCRUxPV10KKyJcdTFFQ0QiID0+ICJvIgorCisjIOG7jyAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9PSyBBQk9WRV0KKyJcdTFFQ0YiID0+ICJvIgorCisjIOG7kSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEVdCisiXHUxRUQxIiA9PiAibyIKKworIyDhu5MgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFXQorIlx1MUVEMyIgPT4gIm8iCisKKyMg4buVICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBIT09LIEFCT1ZFXQorIlx1MUVENSIgPT4gIm8iCisKKyMg4buXICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERV0KKyJcdTFFRDciID0+ICJvIgorCisjIOG7mSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgRE9UIEJFTE9XXQorIlx1MUVEOSIgPT4gIm8iCisKKyMg4bubICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBBQ1VURV0KKyJcdTFFREIiID0+ICJvIgorCisjIOG7nSAgW0xBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgR1JBVkVdCisiXHUxRUREIiA9PiAibyIKKworIyDhu58gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEhPT0sgQUJPVkVdCisiXHUxRURGIiA9PiAibyIKKworIyDhu6EgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIFRJTERFXQorIlx1MUVFMSIgPT4gIm8iCisKKyMg4bujICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBET1QgQkVMT1ddCisiXHUxRUUzIiA9PiAibyIKKworIyDigpIgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIE9dCisiXHUyMDkyIiA9PiAibyIKKworIyDik54gIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBPXQorIlx1MjRERSIgPT4gIm8iCisKKyMg4rG6ICBbTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBMT1cgUklORyBJTlNJREVdCisiXHUyQzdBIiA9PiAibyIKKworIyDqnYsgIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIExPTkcgU1RST0tFIE9WRVJMQVldCisiXHVBNzRCIiA9PiAibyIKKworIyDqnY0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIExPT1BdCisiXHVBNzREIiA9PiAibyIKKworIyDvvY8gIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIE9dCisiXHVGRjRGIiA9PiAibyIKKworIyDFkiAgW0xBVElOIENBUElUQUwgTElHQVRVUkUgT0VdCisiXHUwMTUyIiA9PiAiT0UiCisKKyMgybYgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBPRV0KKyJcdTAyNzYiID0+ICJPRSIKKworIyDqnY4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBPT10KKyJcdUE3NEUiID0+ICJPTyIKKworIyDIoiAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PVSAgW0xBVElOIENBUElUQUwgTEVUVEVSIE9VXQorIlx1MDIyMiIgPT4gIk9VIgorCisjIOG0lSAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIE9VXQorIlx1MUQxNSIgPT4gIk9VIgorCisjIOKSqiAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIE9dCisiXHUyNEFBIiA9PiAiKG8pIgorCisjIMWTICBbTEFUSU4gU01BTEwgTElHQVRVUkUgT0VdCisiXHUwMTUzIiA9PiAib2UiCisKKyMg4bSUICBbTEFUSU4gU01BTEwgTEVUVEVSIFRVUk5FRCBPRV0KKyJcdTFEMTQiID0+ICJvZSIKKworIyDqnY8gIFtMQVRJTiBTTUFMTCBMRVRURVIgT09dCisiXHVBNzRGIiA9PiAib28iCisKKyMgyKMgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT1UgIFtMQVRJTiBTTUFMTCBMRVRURVIgT1VdCisiXHUwMjIzIiA9PiAib3UiCisKKyMgxqQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggSE9PS10KKyJcdTAxQTQiID0+ICJQIgorCisjIOG0mCAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIFBdCisiXHUxRDE4IiA9PiAiUCIKKworIyDhuZQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggQUNVVEVdCisiXHUxRTU0IiA9PiAiUCIKKworIyDhuZYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggRE9UIEFCT1ZFXQorIlx1MUU1NiIgPT4gIlAiCisKKyMg4pOFICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBQXQorIlx1MjRDNSIgPT4gIlAiCisKKyMg4rGjICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUCBXSVRIIFNUUk9LRV0KKyJcdTJDNjMiID0+ICJQIgorCisjIOqdkCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFAgV0lUSCBTVFJPS0UgVEhST1VHSCBERVNDRU5ERVJdCisiXHVBNzUwIiA9PiAiUCIKKworIyDqnZIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggRkxPVVJJU0hdCisiXHVBNzUyIiA9PiAiUCIKKworIyDqnZQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggU1FVSVJSRUwgVEFJTF0KKyJcdUE3NTQiID0+ICJQIgorCisjIO+8sCAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBQXQorIlx1RkYzMCIgPT4gIlAiCisKKyMgxqUgIFtMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIEhPT0tdCisiXHUwMUE1IiA9PiAicCIKKworIyDhtbEgIFtMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIE1JRERMRSBUSUxERV0KKyJcdTFENzEiID0+ICJwIgorCisjIOG1vSAgW0xBVElOIFNNQUxMIExFVFRFUiBQIFdJVEggU1RST0tFXQorIlx1MUQ3RCIgPT4gInAiCisKKyMg4baIICBbTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDg4IiA9PiAicCIKKworIyDhuZUgIFtMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIEFDVVRFXQorIlx1MUU1NSIgPT4gInAiCisKKyMg4bmXICBbTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBET1QgQUJPVkVdCisiXHUxRTU3IiA9PiAicCIKKworIyDik58gIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBQXQorIlx1MjRERiIgPT4gInAiCisKKyMg6p2RICBbTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBTVFJPS0UgVEhST1VHSCBERVNDRU5ERVJdCisiXHVBNzUxIiA9PiAicCIKKworIyDqnZMgIFtMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIEZMT1VSSVNIXQorIlx1QTc1MyIgPT4gInAiCisKKyMg6p2VICBbTEFUSU4gU01BTEwgTEVUVEVSIFAgV0lUSCBTUVVJUlJFTCBUQUlMXQorIlx1QTc1NSIgPT4gInAiCisKKyMg6p+8ICBbTEFUSU4gRVBJR1JBUEhJQyBMRVRURVIgUkVWRVJTRUQgUF0KKyJcdUE3RkMiID0+ICJwIgorCisjIO+9kCAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgUF0KKyJcdUZGNTAiID0+ICJwIgorCisjIOKSqyAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIFBdCisiXHUyNEFCIiA9PiAiKHApIgorCisjIMmKICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgU01BTEwgUSBXSVRIIEhPT0sgVEFJTF0KKyJcdTAyNEEiID0+ICJRIgorCisjIOKThiAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUV0KKyJcdTI0QzYiID0+ICJRIgorCisjIOqdliAgW0xBVElOIENBUElUQUwgTEVUVEVSIFEgV0lUSCBTVFJPS0UgVEhST1VHSCBERVNDRU5ERVJdCisiXHVBNzU2IiA9PiAiUSIKKworIyDqnZggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBRIFdJVEggRElBR09OQUwgU1RST0tFXQorIlx1QTc1OCIgPT4gIlEiCisKKyMg77yxICBbRlVMTFdJRFRIIExBVElOIENBUElUQUwgTEVUVEVSIFFdCisiXHVGRjMxIiA9PiAiUSIKKworIyDEuCAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9LcmFfKGxldHRlcikgIFtMQVRJTiBTTUFMTCBMRVRURVIgS1JBXQorIlx1MDEzOCIgPT4gInEiCisKKyMgyYsgIFtMQVRJTiBTTUFMTCBMRVRURVIgUSBXSVRIIEhPT0sgVEFJTF0KKyJcdTAyNEIiID0+ICJxIgorCisjIMqgICBbTEFUSU4gU01BTEwgTEVUVEVSIFEgV0lUSCBIT09LXQorIlx1MDJBMCIgPT4gInEiCisKKyMg4pOgICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgUV0KKyJcdTI0RTAiID0+ICJxIgorCisjIOqdlyAgW0xBVElOIFNNQUxMIExFVFRFUiBRIFdJVEggU1RST0tFIFRIUk9VR0ggREVTQ0VOREVSXQorIlx1QTc1NyIgPT4gInEiCisKKyMg6p2ZICBbTEFUSU4gU01BTEwgTEVUVEVSIFEgV0lUSCBESUFHT05BTCBTVFJPS0VdCisiXHVBNzU5IiA9PiAicSIKKworIyDvvZEgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIFFdCisiXHVGRjUxIiA9PiAicSIKKworIyDikqwgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBRXQorIlx1MjRBQyIgPT4gIihxKSIKKworIyDIuSAgW0xBVElOIFNNQUxMIExFVFRFUiBRUCBESUdSQVBIXQorIlx1MDIzOSIgPT4gInFwIgorCisjIMWUICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIEFDVVRFXQorIlx1MDE1NCIgPT4gIlIiCisKKyMgxZYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0VESUxMQV0KKyJcdTAxNTYiID0+ICJSIgorCisjIMWYICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENBUk9OXQorIlx1MDE1OCIgPT4gIlIiCisKKyMgyJIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggRE9VQkxFIEdSQVZFXQorIlx1MDIxMCIgPT4gIlIiCisKKyMgyJIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggSU5WRVJURUQgQlJFVkVdCisiXHUwMjEyIiA9PiAiUiIKKworIyDJjCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBTVFJPS0VdCisiXHUwMjRDIiA9PiAiUiIKKworIyDKgCAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIFJdCisiXHUwMjgwIiA9PiAiUiIKKworIyDKgSAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIElOVkVSVEVEIFJdCisiXHUwMjgxIiA9PiAiUiIKKworIyDhtJkgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBSRVZFUlNFRCBSXQorIlx1MUQxOSIgPT4gIlIiCisKKyMg4bSaICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgVFVSTkVEIFJdCisiXHUxRDFBIiA9PiAiUiIKKworIyDhuZggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggRE9UIEFCT1ZFXQorIlx1MUU1OCIgPT4gIlIiCisKKyMg4bmaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIERPVCBCRUxPV10KKyJcdTFFNUEiID0+ICJSIgorCisjIOG5nCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBET1QgQkVMT1cgQU5EIE1BQ1JPTl0KKyJcdTFFNUMiID0+ICJSIgorCisjIOG5niAgW0xBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBMSU5FIEJFTE9XXQorIlx1MUU1RSIgPT4gIlIiCisKKyMg4pOHICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBSXQorIlx1MjRDNyIgPT4gIlIiCisKKyMg4rGkICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIFRBSUxdCisiXHUyQzY0IiA9PiAiUiIKKworIyDqnZogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFJPVFVOREFdCisiXHVBNzVBIiA9PiAiUiIKKworIyDqnoIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBJTlNVTEFSIFJdCisiXHVBNzgyIiA9PiAiUiIKKworIyDvvLIgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgUl0KKyJcdUZGMzIiID0+ICJSIgorCisjIMWVICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBBQ1VURV0KKyJcdTAxNTUiID0+ICJyIgorCisjIMWXICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDRURJTExBXQorIlx1MDE1NyIgPT4gInIiCisKKyMgxZkgIFtMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENBUk9OXQorIlx1MDE1OSIgPT4gInIiCisKKyMgyJEgIFtMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIERPVUJMRSBHUkFWRV0KKyJcdTAyMTEiID0+ICJyIgorCisjIMiTICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBJTlZFUlRFRCBCUkVWRV0KKyJcdTAyMTMiID0+ICJyIgorCisjIMmNICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBTVFJPS0VdCisiXHUwMjREIiA9PiAiciIKKworIyDJvCAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggTE9ORyBMRUddCisiXHUwMjdDIiA9PiAiciIKKworIyDJvSAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggVEFJTF0KKyJcdTAyN0QiID0+ICJyIgorCisjIMm+ICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBGSVNISE9PS10KKyJcdTAyN0UiID0+ICJyIgorCisjIMm/ICBbTEFUSU4gU01BTEwgTEVUVEVSIFJFVkVSU0VEIFIgV0lUSCBGSVNISE9PS10KKyJcdTAyN0YiID0+ICJyIgorCisjIOG1oyAgW0xBVElOIFNVQlNDUklQVCBTTUFMTCBMRVRURVIgUl0KKyJcdTFENjMiID0+ICJyIgorCisjIOG1siAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggTUlERExFIFRJTERFXQorIlx1MUQ3MiIgPT4gInIiCisKKyMg4bWzICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBGSVNISE9PSyBBTkQgTUlERExFIFRJTERFXQorIlx1MUQ3MyIgPT4gInIiCisKKyMg4baJICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDg5IiA9PiAiciIKKworIyDhuZkgIFtMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIERPVCBBQk9WRV0KKyJcdTFFNTkiID0+ICJyIgorCisjIOG5myAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggRE9UIEJFTE9XXQorIlx1MUU1QiIgPT4gInIiCisKKyMg4bmdICBbTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBET1QgQkVMT1cgQU5EIE1BQ1JPTl0KKyJcdTFFNUQiID0+ICJyIgorCisjIOG5nyAgW0xBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggTElORSBCRUxPV10KKyJcdTFFNUYiID0+ICJyIgorCisjIOKToSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFJdCisiXHUyNEUxIiA9PiAiciIKKworIyDqnZsgIFtMQVRJTiBTTUFMTCBMRVRURVIgUiBST1RVTkRBXQorIlx1QTc1QiIgPT4gInIiCisKKyMg6p6DICBbTEFUSU4gU01BTEwgTEVUVEVSIElOU1VMQVIgUl0KKyJcdUE3ODMiID0+ICJyIgorCisjIO+9kiAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgUl0KKyJcdUZGNTIiID0+ICJyIgorCisjIOKSrSAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIFJdCisiXHUyNEFEIiA9PiAiKHIpIgorCisjIMWaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIEFDVVRFXQorIlx1MDE1QSIgPT4gIlMiCisKKyMgxZwgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAxNUMiID0+ICJTIgorCisjIMWeICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEFdCisiXHUwMTVFIiA9PiAiUyIKKworIyDFoCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTl0KKyJcdTAxNjAiID0+ICJTIgorCisjIMiYICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENPTU1BIEJFTE9XXQorIlx1MDIxOCIgPT4gIlMiCisKKyMg4bmgICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIERPVCBBQk9WRV0KKyJcdTFFNjAiID0+ICJTIgorCisjIOG5oiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBET1QgQkVMT1ddCisiXHUxRTYyIiA9PiAiUyIKKworIyDhuaQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUgQU5EIERPVCBBQk9WRV0KKyJcdTFFNjQiID0+ICJTIgorCisjIOG5piAgW0xBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTiBBTkQgRE9UIEFCT1ZFXQorIlx1MUU2NiIgPT4gIlMiCisKKyMg4bmoICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIERPVCBCRUxPVyBBTkQgRE9UIEFCT1ZFXQorIlx1MUU2OCIgPT4gIlMiCisKKyMg4pOIICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBTXQorIlx1MjRDOCIgPT4gIlMiCisKKyMg6pyxICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgU10KKyJcdUE3MzEiID0+ICJTIgorCisjIOqehSAgW0xBVElOIFNNQUxMIExFVFRFUiBJTlNVTEFSIFNdCisiXHVBNzg1IiA9PiAiUyIKKworIyDvvLMgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgU10KKyJcdUZGMzMiID0+ICJTIgorCisjIMWbICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURV0KKyJcdTAxNUIiID0+ICJzIgorCisjIMWdICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDSVJDVU1GTEVYXQorIlx1MDE1RCIgPT4gInMiCisKKyMgxZ8gIFtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEFdCisiXHUwMTVGIiA9PiAicyIKKworIyDFoSAgW0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST05dCisiXHUwMTYxIiA9PiAicyIKKworIyDFvyAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb25nX1MgIFtMQVRJTiBTTUFMTCBMRVRURVIgTE9ORyBTXQorIlx1MDE3RiIgPT4gInMiCisKKyMgyJkgIFtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENPTU1BIEJFTE9XXQorIlx1MDIxOSIgPT4gInMiCisKKyMgyL8gIFtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIFNXQVNIIFRBSUxdCisiXHUwMjNGIiA9PiAicyIKKworIyDKgiAgW0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggSE9PS10KKyJcdTAyODIiID0+ICJzIgorCisjIOG1tCAgW0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggTUlERExFIFRJTERFXQorIlx1MUQ3NCIgPT4gInMiCisKKyMg4baKICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDhBIiA9PiAicyIKKworIyDhuaEgIFtMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIERPVCBBQk9WRV0KKyJcdTFFNjEiID0+ICJzIgorCisjIOG5oyAgW0xBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggRE9UIEJFTE9XXQorIlx1MUU2MyIgPT4gInMiCisKKyMg4bmlICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURSBBTkQgRE9UIEFCT1ZFXQorIlx1MUU2NSIgPT4gInMiCisKKyMg4bmnICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTiBBTkQgRE9UIEFCT1ZFXQorIlx1MUU2NyIgPT4gInMiCisKKyMg4bmpICBbTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBET1QgQkVMT1cgQU5EIERPVCBBQk9WRV0KKyJcdTFFNjkiID0+ICJzIgorCisjIOG6nCAgW0xBVElOIFNNQUxMIExFVFRFUiBMT05HIFMgV0lUSCBESUFHT05BTCBTVFJPS0VdCisiXHUxRTlDIiA9PiAicyIKKworIyDhup0gIFtMQVRJTiBTTUFMTCBMRVRURVIgTE9ORyBTIFdJVEggSElHSCBTVFJPS0VdCisiXHUxRTlEIiA9PiAicyIKKworIyDik6IgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBTXQorIlx1MjRFMiIgPT4gInMiCisKKyMg6p6EICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgSU5TVUxBUiBTXQorIlx1QTc4NCIgPT4gInMiCisKKyMg772TICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBTXQorIlx1RkY1MyIgPT4gInMiCisKKyMg4bqeICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgU0hBUlAgU10KKyJcdTFFOUUiID0+ICJTUyIKKworIyDikq4gIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBTXQorIlx1MjRBRSIgPT4gIihzKSIKKworIyDDnyAgW0xBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTXQorIlx1MDBERiIgPT4gInNzIgorCisjIO+shiAgW0xBVElOIFNNQUxMIExJR0FUVVJFIFNUXQorIlx1RkIwNiIgPT4gInN0IgorCisjIMWiICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENFRElMTEFdCisiXHUwMTYyIiA9PiAiVCIKKworIyDFpCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDQVJPTl0KKyJcdTAxNjQiID0+ICJUIgorCisjIMWmICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIFNUUk9LRV0KKyJcdTAxNjYiID0+ICJUIgorCisjIMasICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIEhPT0tdCisiXHUwMUFDIiA9PiAiVCIKKworIyDGriAgW0xBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBSRVRST0ZMRVggSE9PS10KKyJcdTAxQUUiID0+ICJUIgorCisjIMiaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENPTU1BIEJFTE9XXQorIlx1MDIxQSIgPT4gIlQiCisKKyMgyL4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggRElBR09OQUwgU1RST0tFXQorIlx1MDIzRSIgPT4gIlQiCisKKyMg4bSbICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgVF0KKyJcdTFEMUIiID0+ICJUIgorCisjIOG5qiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkVdCisiXHUxRTZBIiA9PiAiVCIKKworIyDhuawgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggRE9UIEJFTE9XXQorIlx1MUU2QyIgPT4gIlQiCisKKyMg4bmuICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTZFIiA9PiAiVCIKKworIyDhubAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFNzAiID0+ICJUIgorCisjIOKTiSAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVF0KKyJcdTI0QzkiID0+ICJUIgorCisjIOqehiAgW0xBVElOIENBUElUQUwgTEVUVEVSIElOU1VMQVIgVF0KKyJcdUE3ODYiID0+ICJUIgorCisjIO+8tCAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBUXQorIlx1RkYzNCIgPT4gIlQiCisKKyMgxaMgIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENFRElMTEFdCisiXHUwMTYzIiA9PiAidCIKKworIyDFpSAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0FST05dCisiXHUwMTY1IiA9PiAidCIKKworIyDFpyAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggU1RST0tFXQorIlx1MDE2NyIgPT4gInQiCisKKyMgxqsgIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIFBBTEFUQUwgSE9PS10KKyJcdTAxQUIiID0+ICJ0IgorCisjIMatICBbTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBIT09LXQorIlx1MDFBRCIgPT4gInQiCisKKyMgyJsgIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENPTU1BIEJFTE9XXQorIlx1MDIxQiIgPT4gInQiCisKKyMgyLYgIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENVUkxdCisiXHUwMjM2IiA9PiAidCIKKworIyDKhyAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgVF0KKyJcdTAyODciID0+ICJ0IgorCisjIMqIICBbTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBSRVRST0ZMRVggSE9PS10KKyJcdTAyODgiID0+ICJ0IgorCisjIOG1tSAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggTUlERExFIFRJTERFXQorIlx1MUQ3NSIgPT4gInQiCisKKyMg4bmrICBbTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkVdCisiXHUxRTZCIiA9PiAidCIKKworIyDhua0gIFtMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIERPVCBCRUxPV10KKyJcdTFFNkQiID0+ICJ0IgorCisjIOG5ryAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggTElORSBCRUxPV10KKyJcdTFFNkYiID0+ICJ0IgorCisjIOG5sSAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFNzEiID0+ICJ0IgorCisjIOG6lyAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggRElBRVJFU0lTXQorIlx1MUU5NyIgPT4gInQiCisKKyMg4pOjICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgVF0KKyJcdTI0RTMiID0+ICJ0IgorCisjIOKxpiAgW0xBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggRElBR09OQUwgU1RST0tFXQorIlx1MkM2NiIgPT4gInQiCisKKyMg772UICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBUXQorIlx1RkY1NCIgPT4gInQiCisKKyMgw54gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STl0KKyJcdTAwREUiID0+ICJUSCIKKworIyDqnaYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STiBXSVRIIFNUUk9LRSBUSFJPVUdIIERFU0NFTkRFUl0KKyJcdUE3NjYiID0+ICJUSCIKKworIyDqnKggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBUWl0KKyJcdUE3MjgiID0+ICJUWiIKKworIyDikq8gIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBUXQorIlx1MjRBRiIgPT4gIih0KSIKKworIyDKqCAgW0xBVElOIFNNQUxMIExFVFRFUiBUQyBESUdSQVBIIFdJVEggQ1VSTF0KKyJcdTAyQTgiID0+ICJ0YyIKKworIyDDviAgW0xBVElOIFNNQUxMIExFVFRFUiBUSE9STl0KKyJcdTAwRkUiID0+ICJ0aCIKKworIyDhtbogIFtMQVRJTiBTTUFMTCBMRVRURVIgVEggV0lUSCBTVFJJS0VUSFJPVUdIXQorIlx1MUQ3QSIgPT4gInRoIgorCisjIOqdpyAgW0xBVElOIFNNQUxMIExFVFRFUiBUSE9STiBXSVRIIFNUUk9LRSBUSFJPVUdIIERFU0NFTkRFUl0KKyJcdUE3NjciID0+ICJ0aCIKKworIyDKpiAgW0xBVElOIFNNQUxMIExFVFRFUiBUUyBESUdSQVBIXQorIlx1MDJBNiIgPT4gInRzIgorCisjIOqcqSAgW0xBVElOIFNNQUxMIExFVFRFUiBUWl0KKyJcdUE3MjkiID0+ICJ0eiIKKworIyDDmSAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRV0KKyJcdTAwRDkiID0+ICJVIgorCisjIMOaICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFXQorIlx1MDBEQSIgPT4gIlUiCisKKyMgw5sgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAwREIiID0+ICJVIgorCisjIMOcICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJU10KKyJcdTAwREMiID0+ICJVIgorCisjIMWoICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFRJTERFXQorIlx1MDE2OCIgPT4gIlUiCisKKyMgxaogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OXQorIlx1MDE2QSIgPT4gIlUiCisKKyMgxawgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQlJFVkVdCisiXHUwMTZDIiA9PiAiVSIKKworIyDFriAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFXQorIlx1MDE2RSIgPT4gIlUiCisKKyMgxbAgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFXQorIlx1MDE3MCIgPT4gIlUiCisKKyMgxbIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggT0dPTkVLXQorIlx1MDE3MiIgPT4gIlUiCisKKyMgxq8gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STl0KKyJcdTAxQUYiID0+ICJVIgorCisjIMeTICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENBUk9OXQorIlx1MDFEMyIgPT4gIlUiCisKKyMgx5UgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTIEFORCBNQUNST05dCisiXHUwMUQ1IiA9PiAiVSIKKworIyDHlyAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgQU5EIEFDVVRFXQorIlx1MDFENyIgPT4gIlUiCisKKyMgx5kgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTIEFORCBDQVJPTl0KKyJcdTAxRDkiID0+ICJVIgorCisjIMebICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyBBTkQgR1JBVkVdCisiXHUwMURCIiA9PiAiVSIKKworIyDIlCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBET1VCTEUgR1JBVkVdCisiXHUwMjE0IiA9PiAiVSIKKworIyDIliAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBJTlZFUlRFRCBCUkVWRV0KKyJcdTAyMTYiID0+ICJVIgorCisjIMmEICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBCQVJdCisiXHUwMjQ0IiA9PiAiVSIKKworIyDhtJwgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBVXQorIlx1MUQxQyIgPT4gIlUiCisKKyMg4bW+ICBbTEFUSU4gU01BTEwgQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFNUUk9LRV0KKyJcdTFEN0UiID0+ICJVIgorCisjIOG5siAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgQkVMT1ddCisiXHUxRTcyIiA9PiAiVSIKKworIyDhubQgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggVElMREUgQkVMT1ddCisiXHUxRTc0IiA9PiAiVSIKKworIyDhubYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCBCRUxPV10KKyJcdTFFNzYiID0+ICJVIgorCisjIOG5uCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBUSUxERSBBTkQgQUNVVEVdCisiXHUxRTc4IiA9PiAiVSIKKworIyDhubogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OIEFORCBESUFFUkVTSVNdCisiXHUxRTdBIiA9PiAiVSIKKworIyDhu6QgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRE9UIEJFTE9XXQorIlx1MUVFNCIgPT4gIlUiCisKKyMg4bumICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEhPT0sgQUJPVkVdCisiXHUxRUU2IiA9PiAiVSIKKworIyDhu6ggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgQUNVVEVdCisiXHUxRUU4IiA9PiAiVSIKKworIyDhu6ogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgR1JBVkVdCisiXHUxRUVBIiA9PiAiVSIKKworIyDhu6wgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgSE9PSyBBQk9WRV0KKyJcdTFFRUMiID0+ICJVIgorCisjIOG7riAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBUSUxERV0KKyJcdTFFRUUiID0+ICJVIgorCisjIOG7sCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBET1QgQkVMT1ddCisiXHUxRUYwIiA9PiAiVSIKKworIyDik4ogIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIFVdCisiXHUyNENBIiA9PiAiVSIKKworIyDvvLUgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgVV0KKyJcdUZGMzUiID0+ICJVIgorCisjIMO5ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRV0KKyJcdTAwRjkiID0+ICJ1IgorCisjIMO6ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURV0KKyJcdTAwRkEiID0+ICJ1IgorCisjIMO7ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYXQorIlx1MDBGQiIgPT4gInUiCisKKyMgw7wgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJU10KKyJcdTAwRkMiID0+ICJ1IgorCisjIMWpICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBUSUxERV0KKyJcdTAxNjkiID0+ICJ1IgorCisjIMWrICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST05dCisiXHUwMTZCIiA9PiAidSIKKworIyDFrSAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQlJFVkVdCisiXHUwMTZEIiA9PiAidSIKKworIyDFryAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRV0KKyJcdTAxNkYiID0+ICJ1IgorCisjIMWxICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEVdCisiXHUwMTcxIiA9PiAidSIKKworIyDFsyAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggT0dPTkVLXQorIlx1MDE3MyIgPT4gInUiCisKKyMgxrAgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk5dCisiXHUwMUIwIiA9PiAidSIKKworIyDHlCAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0FST05dCisiXHUwMUQ0IiA9PiAidSIKKworIyDHliAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTIEFORCBNQUNST05dCisiXHUwMUQ2IiA9PiAidSIKKworIyDHmCAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTIEFORCBBQ1VURV0KKyJcdTAxRDgiID0+ICJ1IgorCisjIMeaICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgQU5EIENBUk9OXQorIlx1MDFEQSIgPT4gInUiCisKKyMgx5wgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyBBTkQgR1JBVkVdCisiXHUwMURDIiA9PiAidSIKKworIyDIlSAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRE9VQkxFIEdSQVZFXQorIlx1MDIxNSIgPT4gInUiCisKKyMgyJcgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIElOVkVSVEVEIEJSRVZFXQorIlx1MDIxNyIgPT4gInUiCisKKyMgyokgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBCQVJdCisiXHUwMjg5IiA9PiAidSIKKworIyDhtaQgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIFVdCisiXHUxRDY0IiA9PiAidSIKKworIyDhtpkgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFJFVFJPRkxFWCBIT09LXQorIlx1MUQ5OSIgPT4gInUiCisKKyMg4bmzICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgQkVMT1ddCisiXHUxRTczIiA9PiAidSIKKworIyDhubUgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFRJTERFIEJFTE9XXQorIlx1MUU3NSIgPT4gInUiCisKKyMg4bm3ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYIEJFTE9XXQorIlx1MUU3NyIgPT4gInUiCisKKyMg4bm5ICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBUSUxERSBBTkQgQUNVVEVdCisiXHUxRTc5IiA9PiAidSIKKworIyDhubsgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE1BQ1JPTiBBTkQgRElBRVJFU0lTXQorIlx1MUU3QiIgPT4gInUiCisKKyMg4bulICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1QgQkVMT1ddCisiXHUxRUU1IiA9PiAidSIKKworIyDhu6cgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPT0sgQUJPVkVdCisiXHUxRUU3IiA9PiAidSIKKworIyDhu6kgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIEFDVVRFXQorIlx1MUVFOSIgPT4gInUiCisKKyMg4burICBbTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBHUkFWRV0KKyJcdTFFRUIiID0+ICJ1IgorCisjIOG7rSAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgSE9PSyBBQk9WRV0KKyJcdTFFRUQiID0+ICJ1IgorCisjIOG7ryAgW0xBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgVElMREVdCisiXHUxRUVGIiA9PiAidSIKKworIyDhu7EgIFtMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIERPVCBCRUxPV10KKyJcdTFFRjEiID0+ICJ1IgorCisjIOKTpCAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFVdCisiXHUyNEU0IiA9PiAidSIKKworIyDvvZUgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIFVdCisiXHVGRjU1IiA9PiAidSIKKworIyDikrAgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBVXQorIlx1MjRCMCIgPT4gIih1KSIKKworIyDhtasgIFtMQVRJTiBTTUFMTCBMRVRURVIgVUVdCisiXHUxRDZCIiA9PiAidWUiCisKKyMgxrIgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBWIFdJVEggSE9PS10KKyJcdTAxQjIiID0+ICJWIgorCisjIMmFICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVFVSTkVEIFZdCisiXHUwMjQ1IiA9PiAiViIKKworIyDhtKAgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBWXQorIlx1MUQyMCIgPT4gIlYiCisKKyMg4bm8ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgViBXSVRIIFRJTERFXQorIlx1MUU3QyIgPT4gIlYiCisKKyMg4bm+ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgViBXSVRIIERPVCBCRUxPV10KKyJcdTFFN0UiID0+ICJWIgorCisjIOG7vCAgW0xBVElOIENBUElUQUwgTEVUVEVSIE1JRERMRS1XRUxTSCBWXQorIlx1MUVGQyIgPT4gIlYiCisKKyMg4pOLICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBWXQorIlx1MjRDQiIgPT4gIlYiCisKKyMg6p2eICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgViBXSVRIIERJQUdPTkFMIFNUUk9LRV0KKyJcdUE3NUUiID0+ICJWIgorCisjIOqdqCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFZFTkRdCisiXHVBNzY4IiA9PiAiViIKKworIyDvvLYgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgVl0KKyJcdUZGMzYiID0+ICJWIgorCisjIMqLICBbTEFUSU4gU01BTEwgTEVUVEVSIFYgV0lUSCBIT09LXQorIlx1MDI4QiIgPT4gInYiCisKKyMgyowgIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIFZdCisiXHUwMjhDIiA9PiAidiIKKworIyDhtaUgIFtMQVRJTiBTVUJTQ1JJUFQgU01BTEwgTEVUVEVSIFZdCisiXHUxRDY1IiA9PiAidiIKKworIyDhtowgIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIFBBTEFUQUwgSE9PS10KKyJcdTFEOEMiID0+ICJ2IgorCisjIOG5vSAgW0xBVElOIFNNQUxMIExFVFRFUiBWIFdJVEggVElMREVdCisiXHUxRTdEIiA9PiAidiIKKworIyDhub8gIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIERPVCBCRUxPV10KKyJcdTFFN0YiID0+ICJ2IgorCisjIOKTpSAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFZdCisiXHUyNEU1IiA9PiAidiIKKworIyDisbEgIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIFJJR0hUIEhPT0tdCisiXHUyQzcxIiA9PiAidiIKKworIyDisbQgIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIENVUkxdCisiXHUyQzc0IiA9PiAidiIKKworIyDqnZ8gIFtMQVRJTiBTTUFMTCBMRVRURVIgViBXSVRIIERJQUdPTkFMIFNUUk9LRV0KKyJcdUE3NUYiID0+ICJ2IgorCisjIO+9liAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgVl0KKyJcdUZGNTYiID0+ICJ2IgorCisjIOqdoCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFZZXQorIlx1QTc2MCIgPT4gIlZZIgorCisjIOKSsSAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIFZdCisiXHUyNEIxIiA9PiAiKHYpIgorCisjIOqdoSAgW0xBVElOIFNNQUxMIExFVFRFUiBWWV0KKyJcdUE3NjEiID0+ICJ2eSIKKworIyDFtCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBDSVJDVU1GTEVYXQorIlx1MDE3NCIgPT4gIlciCisKKyMgx7cgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV3lubiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFdZTk5dCisiXHUwMUY3IiA9PiAiVyIKKworIyDhtKEgIFtMQVRJTiBMRVRURVIgU01BTEwgQ0FQSVRBTCBXXQorIlx1MUQyMSIgPT4gIlciCisKKyMg4bqAICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEdSQVZFXQorIlx1MUU4MCIgPT4gIlciCisKKyMg4bqCICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEFDVVRFXQorIlx1MUU4MiIgPT4gIlciCisKKyMg4bqEICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIERJQUVSRVNJU10KKyJcdTFFODQiID0+ICJXIgorCisjIOG6hiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBET1QgQUJPVkVdCisiXHUxRTg2IiA9PiAiVyIKKworIyDhuoggIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBXIFdJVEggRE9UIEJFTE9XXQorIlx1MUU4OCIgPT4gIlciCisKKyMg4pOMICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBXXQorIlx1MjRDQyIgPT4gIlciCisKKyMg4rGyICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEhPT0tdCisiXHUyQzcyIiA9PiAiVyIKKworIyDvvLcgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgV10KKyJcdUZGMzciID0+ICJXIgorCisjIMW1ICBbTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBDSVJDVU1GTEVYXQorIlx1MDE3NSIgPT4gInciCisKKyMgxr8gIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV3lubiAgW0xBVElOIExFVFRFUiBXWU5OXQorIlx1MDFCRiIgPT4gInciCisKKyMgyo0gIFtMQVRJTiBTTUFMTCBMRVRURVIgVFVSTkVEIFddCisiXHUwMjhEIiA9PiAidyIKKworIyDhuoEgIFtMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIEdSQVZFXQorIlx1MUU4MSIgPT4gInciCisKKyMg4bqDICBbTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBBQ1VURV0KKyJcdTFFODMiID0+ICJ3IgorCisjIOG6hSAgW0xBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggRElBRVJFU0lTXQorIlx1MUU4NSIgPT4gInciCisKKyMg4bqHICBbTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBET1QgQUJPVkVdCisiXHUxRTg3IiA9PiAidyIKKworIyDhuokgIFtMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIERPVCBCRUxPV10KKyJcdTFFODkiID0+ICJ3IgorCisjIOG6mCAgW0xBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggUklORyBBQk9WRV0KKyJcdTFFOTgiID0+ICJ3IgorCisjIOKTpiAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFddCisiXHUyNEU2IiA9PiAidyIKKworIyDisbMgIFtMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIEhPT0tdCisiXHUyQzczIiA9PiAidyIKKworIyDvvZcgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIFddCisiXHVGRjU3IiA9PiAidyIKKworIyDikrIgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBXXQorIlx1MjRCMiIgPT4gIih3KSIKKworIyDhuoogIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBYIFdJVEggRE9UIEFCT1ZFXQorIlx1MUU4QSIgPT4gIlgiCisKKyMg4bqMICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWCBXSVRIIERJQUVSRVNJU10KKyJcdTFFOEMiID0+ICJYIgorCisjIOKTjSAgW0NJUkNMRUQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWF0KKyJcdTI0Q0QiID0+ICJYIgorCisjIO+8uCAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBYXQorIlx1RkYzOCIgPT4gIlgiCisKKyMg4baNICBbTEFUSU4gU01BTEwgTEVUVEVSIFggV0lUSCBQQUxBVEFMIEhPT0tdCisiXHUxRDhEIiA9PiAieCIKKworIyDhuosgIFtMQVRJTiBTTUFMTCBMRVRURVIgWCBXSVRIIERPVCBBQk9WRV0KKyJcdTFFOEIiID0+ICJ4IgorCisjIOG6jSAgW0xBVElOIFNNQUxMIExFVFRFUiBYIFdJVEggRElBRVJFU0lTXQorIlx1MUU4RCIgPT4gIngiCisKKyMg4oKTICBbTEFUSU4gU1VCU0NSSVBUIFNNQUxMIExFVFRFUiBYXQorIlx1MjA5MyIgPT4gIngiCisKKyMg4pOnICBbQ0lSQ0xFRCBMQVRJTiBTTUFMTCBMRVRURVIgWF0KKyJcdTI0RTciID0+ICJ4IgorCisjIO+9mCAgW0ZVTExXSURUSCBMQVRJTiBTTUFMTCBMRVRURVIgWF0KKyJcdUZGNTgiID0+ICJ4IgorCisjIOKSsyAgW1BBUkVOVEhFU0laRUQgTEFUSU4gU01BTEwgTEVUVEVSIFhdCisiXHUyNEIzIiA9PiAiKHgpIgorCisjIMOdICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFXQorIlx1MDBERCIgPT4gIlkiCisKKyMgxbYgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAxNzYiID0+ICJZIgorCisjIMW4ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJU10KKyJcdTAxNzgiID0+ICJZIgorCisjIMazICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEhPT0tdCisiXHUwMUIzIiA9PiAiWSIKKworIyDIsiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBNQUNST05dCisiXHUwMjMyIiA9PiAiWSIKKworIyDJjiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBTVFJPS0VdCisiXHUwMjRFIiA9PiAiWSIKKworIyDKjyAgW0xBVElOIExFVFRFUiBTTUFMTCBDQVBJVEFMIFldCisiXHUwMjhGIiA9PiAiWSIKKworIyDhuo4gIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRE9UIEFCT1ZFXQorIlx1MUU4RSIgPT4gIlkiCisKKyMg4buyICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEdSQVZFXQorIlx1MUVGMiIgPT4gIlkiCisKKyMg4bu0ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERPVCBCRUxPV10KKyJcdTFFRjQiID0+ICJZIgorCisjIOG7tiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBIT09LIEFCT1ZFXQorIlx1MUVGNiIgPT4gIlkiCisKKyMg4bu4ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIFRJTERFXQorIlx1MUVGOCIgPT4gIlkiCisKKyMg4bu+ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIExPT1BdCisiXHUxRUZFIiA9PiAiWSIKKworIyDik44gIFtDSVJDTEVEIExBVElOIENBUElUQUwgTEVUVEVSIFldCisiXHUyNENFIiA9PiAiWSIKKworIyDvvLkgIFtGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgWV0KKyJcdUZGMzkiID0+ICJZIgorCisjIMO9ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURV0KKyJcdTAwRkQiID0+ICJ5IgorCisjIMO/ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVNdCisiXHUwMEZGIiA9PiAieSIKKworIyDFtyAgW0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQ0lSQ1VNRkxFWF0KKyJcdTAxNzciID0+ICJ5IgorCisjIMa0ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBIT09LXQorIlx1MDFCNCIgPT4gInkiCisKKyMgyLMgIFtMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIE1BQ1JPTl0KKyJcdTAyMzMiID0+ICJ5IgorCisjIMmPICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBTVFJPS0VdCisiXHUwMjRGIiA9PiAieSIKKworIyDKjiAgW0xBVElOIFNNQUxMIExFVFRFUiBUVVJORUQgWV0KKyJcdTAyOEUiID0+ICJ5IgorCisjIOG6jyAgW0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRE9UIEFCT1ZFXQorIlx1MUU4RiIgPT4gInkiCisKKyMg4bqZICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBSSU5HIEFCT1ZFXQorIlx1MUU5OSIgPT4gInkiCisKKyMg4buzICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBHUkFWRV0KKyJcdTFFRjMiID0+ICJ5IgorCisjIOG7tSAgW0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRE9UIEJFTE9XXQorIlx1MUVGNSIgPT4gInkiCisKKyMg4bu3ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBIT09LIEFCT1ZFXQorIlx1MUVGNyIgPT4gInkiCisKKyMg4bu5ICBbTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBUSUxERV0KKyJcdTFFRjkiID0+ICJ5IgorCisjIOG7vyAgW0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggTE9PUF0KKyJcdTFFRkYiID0+ICJ5IgorCisjIOKTqCAgW0NJUkNMRUQgTEFUSU4gU01BTEwgTEVUVEVSIFldCisiXHUyNEU4IiA9PiAieSIKKworIyDvvZkgIFtGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIFldCisiXHVGRjU5IiA9PiAieSIKKworIyDikrQgIFtQQVJFTlRIRVNJWkVEIExBVElOIFNNQUxMIExFVFRFUiBZXQorIlx1MjRCNCIgPT4gIih5KSIKKworIyDFuSAgW0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURV0KKyJcdTAxNzkiID0+ICJaIgorCisjIMW7ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRV0KKyJcdTAxN0IiID0+ICJaIgorCisjIMW9ICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OXQorIlx1MDE3RCIgPT4gIloiCisKKyMgxrUgIFtMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggU1RST0tFXQorIlx1MDFCNSIgPT4gIloiCisKKyMgyJwgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWW9naCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFlPR0hdCisiXHUwMjFDIiA9PiAiWiIKKworIyDIpCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBIT09LXQorIlx1MDIyNCIgPT4gIloiCisKKyMg4bSiICBbTEFUSU4gTEVUVEVSIFNNQUxMIENBUElUQUwgWl0KKyJcdTFEMjIiID0+ICJaIgorCisjIOG6kCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDSVJDVU1GTEVYXQorIlx1MUU5MCIgPT4gIloiCisKKyMg4bqSICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBCRUxPV10KKyJcdTFFOTIiID0+ICJaIgorCisjIOG6lCAgW0xBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBMSU5FIEJFTE9XXQorIlx1MUU5NCIgPT4gIloiCisKKyMg4pOPICBbQ0lSQ0xFRCBMQVRJTiBDQVBJVEFMIExFVFRFUiBaXQorIlx1MjRDRiIgPT4gIloiCisKKyMg4rGrICBbTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERFU0NFTkRFUl0KKyJcdTJDNkIiID0+ICJaIgorCisjIOqdoiAgW0xBVElOIENBUElUQUwgTEVUVEVSIFZJU0lHT1RISUMgWl0KKyJcdUE3NjIiID0+ICJaIgorCisjIO+8uiAgW0ZVTExXSURUSCBMQVRJTiBDQVBJVEFMIExFVFRFUiBaXQorIlx1RkYzQSIgPT4gIloiCisKKyMgxbogIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFXQorIlx1MDE3QSIgPT4gInoiCisKKyMgxbwgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRV0KKyJcdTAxN0MiID0+ICJ6IgorCisjIMW+ICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTl0KKyJcdTAxN0UiID0+ICJ6IgorCisjIMa2ICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBTVFJPS0VdCisiXHUwMUI2IiA9PiAieiIKKworIyDInSAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Zb2doICBbTEFUSU4gU01BTEwgTEVUVEVSIFlPR0hdCisiXHUwMjFEIiA9PiAieiIKKworIyDIpSAgW0xBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggSE9PS10KKyJcdTAyMjUiID0+ICJ6IgorCisjIMmAICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBTV0FTSCBUQUlMXQorIlx1MDI0MCIgPT4gInoiCisKKyMgypAgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIFJFVFJPRkxFWCBIT09LXQorIlx1MDI5MCIgPT4gInoiCisKKyMgypEgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENVUkxdCisiXHUwMjkxIiA9PiAieiIKKworIyDhtbYgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIE1JRERMRSBUSUxERV0KKyJcdTFENzYiID0+ICJ6IgorCisjIOG2jiAgW0xBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggUEFMQVRBTCBIT09LXQorIlx1MUQ4RSIgPT4gInoiCisKKyMg4bqRICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDSVJDVU1GTEVYXQorIlx1MUU5MSIgPT4gInoiCisKKyMg4bqTICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQkVMT1ddCisiXHUxRTkzIiA9PiAieiIKKworIyDhupUgIFtMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIExJTkUgQkVMT1ddCisiXHUxRTk1IiA9PiAieiIKKworIyDik6kgIFtDSVJDTEVEIExBVElOIFNNQUxMIExFVFRFUiBaXQorIlx1MjRFOSIgPT4gInoiCisKKyMg4rGsICBbTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBERVNDRU5ERVJdCisiXHUyQzZDIiA9PiAieiIKKworIyDqnaMgIFtMQVRJTiBTTUFMTCBMRVRURVIgVklTSUdPVEhJQyBaXQorIlx1QTc2MyIgPT4gInoiCisKKyMg772aICBbRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBaXQorIlx1RkY1QSIgPT4gInoiCisKKyMg4pK1ICBbUEFSRU5USEVTSVpFRCBMQVRJTiBTTUFMTCBMRVRURVIgWl0KKyJcdTI0QjUiID0+ICIoeikiCisKKyMg4oGwICBbU1VQRVJTQ1JJUFQgWkVST10KKyJcdTIwNzAiID0+ICIwIgorCisjIOKCgCAgW1NVQlNDUklQVCBaRVJPXQorIlx1MjA4MCIgPT4gIjAiCisKKyMg4pOqICBbQ0lSQ0xFRCBESUdJVCBaRVJPXQorIlx1MjRFQSIgPT4gIjAiCisKKyMg4pO/ICBbTkVHQVRJVkUgQ0lSQ0xFRCBESUdJVCBaRVJPXQorIlx1MjRGRiIgPT4gIjAiCisKKyMg77yQICBbRlVMTFdJRFRIIERJR0lUIFpFUk9dCisiXHVGRjEwIiA9PiAiMCIKKworIyDCuSAgW1NVUEVSU0NSSVBUIE9ORV0KKyJcdTAwQjkiID0+ICIxIgorCisjIOKCgSAgW1NVQlNDUklQVCBPTkVdCisiXHUyMDgxIiA9PiAiMSIKKworIyDikaAgIFtDSVJDTEVEIERJR0lUIE9ORV0KKyJcdTI0NjAiID0+ICIxIgorCisjIOKTtSAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIE9ORV0KKyJcdTI0RjUiID0+ICIxIgorCisjIOKdtiAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBESUdJVCBPTkVdCisiXHUyNzc2IiA9PiAiMSIKKworIyDinoAgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBPTkVdCisiXHUyNzgwIiA9PiAiMSIKKworIyDinoogIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBPTkVdCisiXHUyNzhBIiA9PiAiMSIKKworIyDvvJEgIFtGVUxMV0lEVEggRElHSVQgT05FXQorIlx1RkYxMSIgPT4gIjEiCisKKyMg4pKIICBbRElHSVQgT05FIEZVTEwgU1RPUF0KKyJcdTI0ODgiID0+ICIxLiIKKworIyDikbQgIFtQQVJFTlRIRVNJWkVEIERJR0lUIE9ORV0KKyJcdTI0NzQiID0+ICIoMSkiCisKKyMgwrIgIFtTVVBFUlNDUklQVCBUV09dCisiXHUwMEIyIiA9PiAiMiIKKworIyDigoIgIFtTVUJTQ1JJUFQgVFdPXQorIlx1MjA4MiIgPT4gIjIiCisKKyMg4pGhICBbQ0lSQ0xFRCBESUdJVCBUV09dCisiXHUyNDYxIiA9PiAiMiIKKworIyDik7YgIFtET1VCTEUgQ0lSQ0xFRCBESUdJVCBUV09dCisiXHUyNEY2IiA9PiAiMiIKKworIyDinbcgIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgVFdPXQorIlx1Mjc3NyIgPT4gIjIiCisKKyMg4p6BICBbRElOR0JBVCBDSVJDTEVEIFNBTlMtU0VSSUYgRElHSVQgVFdPXQorIlx1Mjc4MSIgPT4gIjIiCisKKyMg4p6LICBbRElOR0JBVCBORUdBVElWRSBDSVJDTEVEIFNBTlMtU0VSSUYgRElHSVQgVFdPXQorIlx1Mjc4QiIgPT4gIjIiCisKKyMg77ySICBbRlVMTFdJRFRIIERJR0lUIFRXT10KKyJcdUZGMTIiID0+ICIyIgorCisjIOKSiSAgW0RJR0lUIFRXTyBGVUxMIFNUT1BdCisiXHUyNDg5IiA9PiAiMi4iCisKKyMg4pG1ICBbUEFSRU5USEVTSVpFRCBESUdJVCBUV09dCisiXHUyNDc1IiA9PiAiKDIpIgorCisjIMKzICBbU1VQRVJTQ1JJUFQgVEhSRUVdCisiXHUwMEIzIiA9PiAiMyIKKworIyDigoMgIFtTVUJTQ1JJUFQgVEhSRUVdCisiXHUyMDgzIiA9PiAiMyIKKworIyDikaIgIFtDSVJDTEVEIERJR0lUIFRIUkVFXQorIlx1MjQ2MiIgPT4gIjMiCisKKyMg4pO3ICBbRE9VQkxFIENJUkNMRUQgRElHSVQgVEhSRUVdCisiXHUyNEY3IiA9PiAiMyIKKworIyDinbggIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgVEhSRUVdCisiXHUyNzc4IiA9PiAiMyIKKworIyDinoIgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBUSFJFRV0KKyJcdTI3ODIiID0+ICIzIgorCisjIOKejCAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBTQU5TLVNFUklGIERJR0lUIFRIUkVFXQorIlx1Mjc4QyIgPT4gIjMiCisKKyMg77yTICBbRlVMTFdJRFRIIERJR0lUIFRIUkVFXQorIlx1RkYxMyIgPT4gIjMiCisKKyMg4pKKICBbRElHSVQgVEhSRUUgRlVMTCBTVE9QXQorIlx1MjQ4QSIgPT4gIjMuIgorCisjIOKRtiAgW1BBUkVOVEhFU0laRUQgRElHSVQgVEhSRUVdCisiXHUyNDc2IiA9PiAiKDMpIgorCisjIOKBtCAgW1NVUEVSU0NSSVBUIEZPVVJdCisiXHUyMDc0IiA9PiAiNCIKKworIyDigoQgIFtTVUJTQ1JJUFQgRk9VUl0KKyJcdTIwODQiID0+ICI0IgorCisjIOKRoyAgW0NJUkNMRUQgRElHSVQgRk9VUl0KKyJcdTI0NjMiID0+ICI0IgorCisjIOKTuCAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIEZPVVJdCisiXHUyNEY4IiA9PiAiNCIKKworIyDinbkgIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgRk9VUl0KKyJcdTI3NzkiID0+ICI0IgorCisjIOKegyAgW0RJTkdCQVQgQ0lSQ0xFRCBTQU5TLVNFUklGIERJR0lUIEZPVVJdCisiXHUyNzgzIiA9PiAiNCIKKworIyDino0gIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBGT1VSXQorIlx1Mjc4RCIgPT4gIjQiCisKKyMg77yUICBbRlVMTFdJRFRIIERJR0lUIEZPVVJdCisiXHVGRjE0IiA9PiAiNCIKKworIyDikosgIFtESUdJVCBGT1VSIEZVTEwgU1RPUF0KKyJcdTI0OEIiID0+ICI0LiIKKworIyDikbcgIFtQQVJFTlRIRVNJWkVEIERJR0lUIEZPVVJdCisiXHUyNDc3IiA9PiAiKDQpIgorCisjIOKBtSAgW1NVUEVSU0NSSVBUIEZJVkVdCisiXHUyMDc1IiA9PiAiNSIKKworIyDigoUgIFtTVUJTQ1JJUFQgRklWRV0KKyJcdTIwODUiID0+ICI1IgorCisjIOKRpCAgW0NJUkNMRUQgRElHSVQgRklWRV0KKyJcdTI0NjQiID0+ICI1IgorCisjIOKTuSAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIEZJVkVdCisiXHUyNEY5IiA9PiAiNSIKKworIyDinbogIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgRklWRV0KKyJcdTI3N0EiID0+ICI1IgorCisjIOKehCAgW0RJTkdCQVQgQ0lSQ0xFRCBTQU5TLVNFUklGIERJR0lUIEZJVkVdCisiXHUyNzg0IiA9PiAiNSIKKworIyDino4gIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBGSVZFXQorIlx1Mjc4RSIgPT4gIjUiCisKKyMg77yVICBbRlVMTFdJRFRIIERJR0lUIEZJVkVdCisiXHVGRjE1IiA9PiAiNSIKKworIyDikowgIFtESUdJVCBGSVZFIEZVTEwgU1RPUF0KKyJcdTI0OEMiID0+ICI1LiIKKworIyDikbggIFtQQVJFTlRIRVNJWkVEIERJR0lUIEZJVkVdCisiXHUyNDc4IiA9PiAiKDUpIgorCisjIOKBtiAgW1NVUEVSU0NSSVBUIFNJWF0KKyJcdTIwNzYiID0+ICI2IgorCisjIOKChiAgW1NVQlNDUklQVCBTSVhdCisiXHUyMDg2IiA9PiAiNiIKKworIyDikaUgIFtDSVJDTEVEIERJR0lUIFNJWF0KKyJcdTI0NjUiID0+ICI2IgorCisjIOKTuiAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIFNJWF0KKyJcdTI0RkEiID0+ICI2IgorCisjIOKduyAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBESUdJVCBTSVhdCisiXHUyNzdCIiA9PiAiNiIKKworIyDinoUgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBTSVhdCisiXHUyNzg1IiA9PiAiNiIKKworIyDino8gIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBTSVhdCisiXHUyNzhGIiA9PiAiNiIKKworIyDvvJYgIFtGVUxMV0lEVEggRElHSVQgU0lYXQorIlx1RkYxNiIgPT4gIjYiCisKKyMg4pKNICBbRElHSVQgU0lYIEZVTEwgU1RPUF0KKyJcdTI0OEQiID0+ICI2LiIKKworIyDikbkgIFtQQVJFTlRIRVNJWkVEIERJR0lUIFNJWF0KKyJcdTI0NzkiID0+ICIoNikiCisKKyMg4oG3ICBbU1VQRVJTQ1JJUFQgU0VWRU5dCisiXHUyMDc3IiA9PiAiNyIKKworIyDigocgIFtTVUJTQ1JJUFQgU0VWRU5dCisiXHUyMDg3IiA9PiAiNyIKKworIyDikaYgIFtDSVJDTEVEIERJR0lUIFNFVkVOXQorIlx1MjQ2NiIgPT4gIjciCisKKyMg4pO7ICBbRE9VQkxFIENJUkNMRUQgRElHSVQgU0VWRU5dCisiXHUyNEZCIiA9PiAiNyIKKworIyDinbwgIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgRElHSVQgU0VWRU5dCisiXHUyNzdDIiA9PiAiNyIKKworIyDinoYgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBTRVZFTl0KKyJcdTI3ODYiID0+ICI3IgorCisjIOKekCAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBTQU5TLVNFUklGIERJR0lUIFNFVkVOXQorIlx1Mjc5MCIgPT4gIjciCisKKyMg77yXICBbRlVMTFdJRFRIIERJR0lUIFNFVkVOXQorIlx1RkYxNyIgPT4gIjciCisKKyMg4pKOICBbRElHSVQgU0VWRU4gRlVMTCBTVE9QXQorIlx1MjQ4RSIgPT4gIjcuIgorCisjIOKRuiAgW1BBUkVOVEhFU0laRUQgRElHSVQgU0VWRU5dCisiXHUyNDdBIiA9PiAiKDcpIgorCisjIOKBuCAgW1NVUEVSU0NSSVBUIEVJR0hUXQorIlx1MjA3OCIgPT4gIjgiCisKKyMg4oKIICBbU1VCU0NSSVBUIEVJR0hUXQorIlx1MjA4OCIgPT4gIjgiCisKKyMg4pGnICBbQ0lSQ0xFRCBESUdJVCBFSUdIVF0KKyJcdTI0NjciID0+ICI4IgorCisjIOKTvCAgW0RPVUJMRSBDSVJDTEVEIERJR0lUIEVJR0hUXQorIlx1MjRGQyIgPT4gIjgiCisKKyMg4p29ICBbRElOR0JBVCBORUdBVElWRSBDSVJDTEVEIERJR0lUIEVJR0hUXQorIlx1Mjc3RCIgPT4gIjgiCisKKyMg4p6HICBbRElOR0JBVCBDSVJDTEVEIFNBTlMtU0VSSUYgRElHSVQgRUlHSFRdCisiXHUyNzg3IiA9PiAiOCIKKworIyDinpEgIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBFSUdIVF0KKyJcdTI3OTEiID0+ICI4IgorCisjIO+8mCAgW0ZVTExXSURUSCBESUdJVCBFSUdIVF0KKyJcdUZGMTgiID0+ICI4IgorCisjIOKSjyAgW0RJR0lUIEVJR0hUIEZVTEwgU1RPUF0KKyJcdTI0OEYiID0+ICI4LiIKKworIyDikbsgIFtQQVJFTlRIRVNJWkVEIERJR0lUIEVJR0hUXQorIlx1MjQ3QiIgPT4gIig4KSIKKworIyDigbkgIFtTVVBFUlNDUklQVCBOSU5FXQorIlx1MjA3OSIgPT4gIjkiCisKKyMg4oKJICBbU1VCU0NSSVBUIE5JTkVdCisiXHUyMDg5IiA9PiAiOSIKKworIyDikaggIFtDSVJDTEVEIERJR0lUIE5JTkVdCisiXHUyNDY4IiA9PiAiOSIKKworIyDik70gIFtET1VCTEUgQ0lSQ0xFRCBESUdJVCBOSU5FXQorIlx1MjRGRCIgPT4gIjkiCisKKyMg4p2+ICBbRElOR0JBVCBORUdBVElWRSBDSVJDTEVEIERJR0lUIE5JTkVdCisiXHUyNzdFIiA9PiAiOSIKKworIyDinoggIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBESUdJVCBOSU5FXQorIlx1Mjc4OCIgPT4gIjkiCisKKyMg4p6SICBbRElOR0JBVCBORUdBVElWRSBDSVJDTEVEIFNBTlMtU0VSSUYgRElHSVQgTklORV0KKyJcdTI3OTIiID0+ICI5IgorCisjIO+8mSAgW0ZVTExXSURUSCBESUdJVCBOSU5FXQorIlx1RkYxOSIgPT4gIjkiCisKKyMg4pKQICBbRElHSVQgTklORSBGVUxMIFNUT1BdCisiXHUyNDkwIiA9PiAiOS4iCisKKyMg4pG8ICBbUEFSRU5USEVTSVpFRCBESUdJVCBOSU5FXQorIlx1MjQ3QyIgPT4gIig5KSIKKworIyDikakgIFtDSVJDTEVEIE5VTUJFUiBURU5dCisiXHUyNDY5IiA9PiAiMTAiCisKKyMg4pO+ICBbRE9VQkxFIENJUkNMRUQgTlVNQkVSIFRFTl0KKyJcdTI0RkUiID0+ICIxMCIKKworIyDinb8gIFtESU5HQkFUIE5FR0FUSVZFIENJUkNMRUQgTlVNQkVSIFRFTl0KKyJcdTI3N0YiID0+ICIxMCIKKworIyDinokgIFtESU5HQkFUIENJUkNMRUQgU0FOUy1TRVJJRiBOVU1CRVIgVEVOXQorIlx1Mjc4OSIgPT4gIjEwIgorCisjIOKekyAgW0RJTkdCQVQgTkVHQVRJVkUgQ0lSQ0xFRCBTQU5TLVNFUklGIE5VTUJFUiBURU5dCisiXHUyNzkzIiA9PiAiMTAiCisKKyMg4pKRICBbTlVNQkVSIFRFTiBGVUxMIFNUT1BdCisiXHUyNDkxIiA9PiAiMTAuIgorCisjIOKRvSAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIFRFTl0KKyJcdTI0N0QiID0+ICIoMTApIgorCisjIOKRqiAgW0NJUkNMRUQgTlVNQkVSIEVMRVZFTl0KKyJcdTI0NkEiID0+ICIxMSIKKworIyDik6sgIFtORUdBVElWRSBDSVJDTEVEIE5VTUJFUiBFTEVWRU5dCisiXHUyNEVCIiA9PiAiMTEiCisKKyMg4pKSICBbTlVNQkVSIEVMRVZFTiBGVUxMIFNUT1BdCisiXHUyNDkyIiA9PiAiMTEuIgorCisjIOKRviAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIEVMRVZFTl0KKyJcdTI0N0UiID0+ICIoMTEpIgorCisjIOKRqyAgW0NJUkNMRUQgTlVNQkVSIFRXRUxWRV0KKyJcdTI0NkIiID0+ICIxMiIKKworIyDik6wgIFtORUdBVElWRSBDSVJDTEVEIE5VTUJFUiBUV0VMVkVdCisiXHUyNEVDIiA9PiAiMTIiCisKKyMg4pKTICBbTlVNQkVSIFRXRUxWRSBGVUxMIFNUT1BdCisiXHUyNDkzIiA9PiAiMTIuIgorCisjIOKRvyAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIFRXRUxWRV0KKyJcdTI0N0YiID0+ICIoMTIpIgorCisjIOKRrCAgW0NJUkNMRUQgTlVNQkVSIFRISVJURUVOXQorIlx1MjQ2QyIgPT4gIjEzIgorCisjIOKTrSAgW05FR0FUSVZFIENJUkNMRUQgTlVNQkVSIFRISVJURUVOXQorIlx1MjRFRCIgPT4gIjEzIgorCisjIOKSlCAgW05VTUJFUiBUSElSVEVFTiBGVUxMIFNUT1BdCisiXHUyNDk0IiA9PiAiMTMuIgorCisjIOKSgCAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIFRISVJURUVOXQorIlx1MjQ4MCIgPT4gIigxMykiCisKKyMg4pGtICBbQ0lSQ0xFRCBOVU1CRVIgRk9VUlRFRU5dCisiXHUyNDZEIiA9PiAiMTQiCisKKyMg4pOuICBbTkVHQVRJVkUgQ0lSQ0xFRCBOVU1CRVIgRk9VUlRFRU5dCisiXHUyNEVFIiA9PiAiMTQiCisKKyMg4pKVICBbTlVNQkVSIEZPVVJURUVOIEZVTEwgU1RPUF0KKyJcdTI0OTUiID0+ICIxNC4iCisKKyMg4pKBICBbUEFSRU5USEVTSVpFRCBOVU1CRVIgRk9VUlRFRU5dCisiXHUyNDgxIiA9PiAiKDE0KSIKKworIyDika4gIFtDSVJDTEVEIE5VTUJFUiBGSUZURUVOXQorIlx1MjQ2RSIgPT4gIjE1IgorCisjIOKTryAgW05FR0FUSVZFIENJUkNMRUQgTlVNQkVSIEZJRlRFRU5dCisiXHUyNEVGIiA9PiAiMTUiCisKKyMg4pKWICBbTlVNQkVSIEZJRlRFRU4gRlVMTCBTVE9QXQorIlx1MjQ5NiIgPT4gIjE1LiIKKworIyDikoIgIFtQQVJFTlRIRVNJWkVEIE5VTUJFUiBGSUZURUVOXQorIlx1MjQ4MiIgPT4gIigxNSkiCisKKyMg4pGvICBbQ0lSQ0xFRCBOVU1CRVIgU0lYVEVFTl0KKyJcdTI0NkYiID0+ICIxNiIKKworIyDik7AgIFtORUdBVElWRSBDSVJDTEVEIE5VTUJFUiBTSVhURUVOXQorIlx1MjRGMCIgPT4gIjE2IgorCisjIOKSlyAgW05VTUJFUiBTSVhURUVOIEZVTEwgU1RPUF0KKyJcdTI0OTciID0+ICIxNi4iCisKKyMg4pKDICBbUEFSRU5USEVTSVpFRCBOVU1CRVIgU0lYVEVFTl0KKyJcdTI0ODMiID0+ICIoMTYpIgorCisjIOKRsCAgW0NJUkNMRUQgTlVNQkVSIFNFVkVOVEVFTl0KKyJcdTI0NzAiID0+ICIxNyIKKworIyDik7EgIFtORUdBVElWRSBDSVJDTEVEIE5VTUJFUiBTRVZFTlRFRU5dCisiXHUyNEYxIiA9PiAiMTciCisKKyMg4pKYICBbTlVNQkVSIFNFVkVOVEVFTiBGVUxMIFNUT1BdCisiXHUyNDk4IiA9PiAiMTcuIgorCisjIOKShCAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIFNFVkVOVEVFTl0KKyJcdTI0ODQiID0+ICIoMTcpIgorCisjIOKRsSAgW0NJUkNMRUQgTlVNQkVSIEVJR0hURUVOXQorIlx1MjQ3MSIgPT4gIjE4IgorCisjIOKTsiAgW05FR0FUSVZFIENJUkNMRUQgTlVNQkVSIEVJR0hURUVOXQorIlx1MjRGMiIgPT4gIjE4IgorCisjIOKSmSAgW05VTUJFUiBFSUdIVEVFTiBGVUxMIFNUT1BdCisiXHUyNDk5IiA9PiAiMTguIgorCisjIOKShSAgW1BBUkVOVEhFU0laRUQgTlVNQkVSIEVJR0hURUVOXQorIlx1MjQ4NSIgPT4gIigxOCkiCisKKyMg4pGyICBbQ0lSQ0xFRCBOVU1CRVIgTklORVRFRU5dCisiXHUyNDcyIiA9PiAiMTkiCisKKyMg4pOzICBbTkVHQVRJVkUgQ0lSQ0xFRCBOVU1CRVIgTklORVRFRU5dCisiXHUyNEYzIiA9PiAiMTkiCisKKyMg4pKaICBbTlVNQkVSIE5JTkVURUVOIEZVTEwgU1RPUF0KKyJcdTI0OUEiID0+ICIxOS4iCisKKyMg4pKGICBbUEFSRU5USEVTSVpFRCBOVU1CRVIgTklORVRFRU5dCisiXHUyNDg2IiA9PiAiKDE5KSIKKworIyDikbMgIFtDSVJDTEVEIE5VTUJFUiBUV0VOVFldCisiXHUyNDczIiA9PiAiMjAiCisKKyMg4pO0ICBbTkVHQVRJVkUgQ0lSQ0xFRCBOVU1CRVIgVFdFTlRZXQorIlx1MjRGNCIgPT4gIjIwIgorCisjIOKSmyAgW05VTUJFUiBUV0VOVFkgRlVMTCBTVE9QXQorIlx1MjQ5QiIgPT4gIjIwLiIKKworIyDikocgIFtQQVJFTlRIRVNJWkVEIE5VTUJFUiBUV0VOVFldCisiXHUyNDg3IiA9PiAiKDIwKSIKKworIyDCqyAgW0xFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLXQorIlx1MDBBQiIgPT4gIlwiIgorCisjIMK7ICBbUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLXQorIlx1MDBCQiIgPT4gIlwiIgorCisjIOKAnCAgW0xFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLXQorIlx1MjAxQyIgPT4gIlwiIgorCisjIOKAnSAgW1JJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSS10KKyJcdTIwMUQiID0+ICJcIiIKKworIyDigJ4gIFtET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUktdCisiXHUyMDFFIiA9PiAiXCIiCisKKyMg4oCzICBbRE9VQkxFIFBSSU1FXQorIlx1MjAzMyIgPT4gIlwiIgorCisjIOKAtiAgW1JFVkVSU0VEIERPVUJMRSBQUklNRV0KKyJcdTIwMzYiID0+ICJcIiIKKworIyDinZ0gIFtIRUFWWSBET1VCTEUgVFVSTkVEIENPTU1BIFFVT1RBVElPTiBNQVJLIE9STkFNRU5UXQorIlx1Mjc1RCIgPT4gIlwiIgorCisjIOKdniAgW0hFQVZZIERPVUJMRSBDT01NQSBRVU9UQVRJT04gTUFSSyBPUk5BTUVOVF0KKyJcdTI3NUUiID0+ICJcIiIKKworIyDina4gIFtIRUFWWSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLIE9STkFNRU5UXQorIlx1Mjc2RSIgPT4gIlwiIgorCisjIOKdryAgW0hFQVZZIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLIE9STkFNRU5UXQorIlx1Mjc2RiIgPT4gIlwiIgorCisjIO+8giAgW0ZVTExXSURUSCBRVU9UQVRJT04gTUFSS10KKyJcdUZGMDIiID0+ICJcIiIKKworIyDigJggIFtMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSS10KKyJcdTIwMTgiID0+ICJcJyIKKworIyDigJkgIFtSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUktdCisiXHUyMDE5IiA9PiAiXCciCisKKyMg4oCaICBbU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLXQorIlx1MjAxQSIgPT4gIlwnIgorCisjIOKAmyAgW1NJTkdMRSBISUdILVJFVkVSU0VELTkgUVVPVEFUSU9OIE1BUktdCisiXHUyMDFCIiA9PiAiXCciCisKKyMg4oCyICBbUFJJTUVdCisiXHUyMDMyIiA9PiAiXCciCisKKyMg4oC1ICBbUkVWRVJTRUQgUFJJTUVdCisiXHUyMDM1IiA9PiAiXCciCisKKyMg4oC5ICBbU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUktdCisiXHUyMDM5IiA9PiAiXCciCisKKyMg4oC6ICBbU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLXQorIlx1MjAzQSIgPT4gIlwnIgorCisjIOKdmyAgW0hFQVZZIFNJTkdMRSBUVVJORUQgQ09NTUEgUVVPVEFUSU9OIE1BUksgT1JOQU1FTlRdCisiXHUyNzVCIiA9PiAiXCciCisKKyMg4p2cICBbSEVBVlkgU0lOR0xFIENPTU1BIFFVT1RBVElPTiBNQVJLIE9STkFNRU5UXQorIlx1Mjc1QyIgPT4gIlwnIgorCisjIO+8hyAgW0ZVTExXSURUSCBBUE9TVFJPUEhFXQorIlx1RkYwNyIgPT4gIlwnIgorCisjIOKAkCAgW0hZUEhFTl0KKyJcdTIwMTAiID0+ICItIgorCisjIOKAkSAgW05PTi1CUkVBS0lORyBIWVBIRU5dCisiXHUyMDExIiA9PiAiLSIKKworIyDigJIgIFtGSUdVUkUgREFTSF0KKyJcdTIwMTIiID0+ICItIgorCisjIOKAkyAgW0VOIERBU0hdCisiXHUyMDEzIiA9PiAiLSIKKworIyDigJQgIFtFTSBEQVNIXQorIlx1MjAxNCIgPT4gIi0iCisKKyMg4oG7ICBbU1VQRVJTQ1JJUFQgTUlOVVNdCisiXHUyMDdCIiA9PiAiLSIKKworIyDigosgIFtTVUJTQ1JJUFQgTUlOVVNdCisiXHUyMDhCIiA9PiAiLSIKKworIyDvvI0gIFtGVUxMV0lEVEggSFlQSEVOLU1JTlVTXQorIlx1RkYwRCIgPT4gIi0iCisKKyMg4oGFICBbTEVGVCBTUVVBUkUgQlJBQ0tFVCBXSVRIIFFVSUxMXQorIlx1MjA0NSIgPT4gIlsiCisKKyMg4p2yICBbTElHSFQgTEVGVCBUT1JUT0lTRSBTSEVMTCBCUkFDS0VUIE9STkFNRU5UXQorIlx1Mjc3MiIgPT4gIlsiCisKKyMg77y7ICBbRlVMTFdJRFRIIExFRlQgU1FVQVJFIEJSQUNLRVRdCisiXHVGRjNCIiA9PiAiWyIKKworIyDigYYgIFtSSUdIVCBTUVVBUkUgQlJBQ0tFVCBXSVRIIFFVSUxMXQorIlx1MjA0NiIgPT4gIl0iCisKKyMg4p2zICBbTElHSFQgUklHSFQgVE9SVE9JU0UgU0hFTEwgQlJBQ0tFVCBPUk5BTUVOVF0KKyJcdTI3NzMiID0+ICJdIgorCisjIO+8vSAgW0ZVTExXSURUSCBSSUdIVCBTUVVBUkUgQlJBQ0tFVF0KKyJcdUZGM0QiID0+ICJdIgorCisjIOKBvSAgW1NVUEVSU0NSSVBUIExFRlQgUEFSRU5USEVTSVNdCisiXHUyMDdEIiA9PiAiKCIKKworIyDigo0gIFtTVUJTQ1JJUFQgTEVGVCBQQVJFTlRIRVNJU10KKyJcdTIwOEQiID0+ICIoIgorCisjIOKdqCAgW01FRElVTSBMRUZUIFBBUkVOVEhFU0lTIE9STkFNRU5UXQorIlx1Mjc2OCIgPT4gIigiCisKKyMg4p2qICBbTUVESVVNIEZMQVRURU5FRCBMRUZUIFBBUkVOVEhFU0lTIE9STkFNRU5UXQorIlx1Mjc2QSIgPT4gIigiCisKKyMg77yIICBbRlVMTFdJRFRIIExFRlQgUEFSRU5USEVTSVNdCisiXHVGRjA4IiA9PiAiKCIKKworIyDiuKggIFtMRUZUIERPVUJMRSBQQVJFTlRIRVNJU10KKyJcdTJFMjgiID0+ICIoKCIKKworIyDigb4gIFtTVVBFUlNDUklQVCBSSUdIVCBQQVJFTlRIRVNJU10KKyJcdTIwN0UiID0+ICIpIgorCisjIOKCjiAgW1NVQlNDUklQVCBSSUdIVCBQQVJFTlRIRVNJU10KKyJcdTIwOEUiID0+ICIpIgorCisjIOKdqSAgW01FRElVTSBSSUdIVCBQQVJFTlRIRVNJUyBPUk5BTUVOVF0KKyJcdTI3NjkiID0+ICIpIgorCisjIOKdqyAgW01FRElVTSBGTEFUVEVORUQgUklHSFQgUEFSRU5USEVTSVMgT1JOQU1FTlRdCisiXHUyNzZCIiA9PiAiKSIKKworIyDvvIkgIFtGVUxMV0lEVEggUklHSFQgUEFSRU5USEVTSVNdCisiXHVGRjA5IiA9PiAiKSIKKworIyDiuKkgIFtSSUdIVCBET1VCTEUgUEFSRU5USEVTSVNdCisiXHUyRTI5IiA9PiAiKSkiCisKKyMg4p2sICBbTUVESVVNIExFRlQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVCBPUk5BTUVOVF0KKyJcdTI3NkMiID0+ICI8IgorCisjIOKdsCAgW0hFQVZZIExFRlQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVCBPUk5BTUVOVF0KKyJcdTI3NzAiID0+ICI8IgorCisjIO+8nCAgW0ZVTExXSURUSCBMRVNTLVRIQU4gU0lHTl0KKyJcdUZGMUMiID0+ICI8IgorCisjIOKdrSAgW01FRElVTSBSSUdIVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUIE9STkFNRU5UXQorIlx1Mjc2RCIgPT4gIj4iCisKKyMg4p2xICBbSEVBVlkgUklHSFQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVCBPUk5BTUVOVF0KKyJcdTI3NzEiID0+ICI+IgorCisjIO+8niAgW0ZVTExXSURUSCBHUkVBVEVSLVRIQU4gU0lHTl0KKyJcdUZGMUUiID0+ICI+IgorCisjIOKdtCAgW01FRElVTSBMRUZUIENVUkxZIEJSQUNLRVQgT1JOQU1FTlRdCisiXHUyNzc0IiA9PiAieyIKKworIyDvvZsgIFtGVUxMV0lEVEggTEVGVCBDVVJMWSBCUkFDS0VUXQorIlx1RkY1QiIgPT4gInsiCisKKyMg4p21ICBbTUVESVVNIFJJR0hUIENVUkxZIEJSQUNLRVQgT1JOQU1FTlRdCisiXHUyNzc1IiA9PiAifSIKKworIyDvvZ0gIFtGVUxMV0lEVEggUklHSFQgQ1VSTFkgQlJBQ0tFVF0KKyJcdUZGNUQiID0+ICJ9IgorCisjIOKBuiAgW1NVUEVSU0NSSVBUIFBMVVMgU0lHTl0KKyJcdTIwN0EiID0+ICIrIgorCisjIOKCiiAgW1NVQlNDUklQVCBQTFVTIFNJR05dCisiXHUyMDhBIiA9PiAiKyIKKworIyDvvIsgIFtGVUxMV0lEVEggUExVUyBTSUdOXQorIlx1RkYwQiIgPT4gIisiCisKKyMg4oG8ICBbU1VQRVJTQ1JJUFQgRVFVQUxTIFNJR05dCisiXHUyMDdDIiA9PiAiPSIKKworIyDigowgIFtTVUJTQ1JJUFQgRVFVQUxTIFNJR05dCisiXHUyMDhDIiA9PiAiPSIKKworIyDvvJ0gIFtGVUxMV0lEVEggRVFVQUxTIFNJR05dCisiXHVGRjFEIiA9PiAiPSIKKworIyDvvIEgIFtGVUxMV0lEVEggRVhDTEFNQVRJT04gTUFSS10KKyJcdUZGMDEiID0+ICIhIgorCisjIOKAvCAgW0RPVUJMRSBFWENMQU1BVElPTiBNQVJLXQorIlx1MjAzQyIgPT4gIiEhIgorCisjIOKBiSAgW0VYQ0xBTUFUSU9OIFFVRVNUSU9OIE1BUktdCisiXHUyMDQ5IiA9PiAiIT8iCisKKyMg77yDICBbRlVMTFdJRFRIIE5VTUJFUiBTSUdOXQorIlx1RkYwMyIgPT4gIiMiCisKKyMg77yEICBbRlVMTFdJRFRIIERPTExBUiBTSUdOXQorIlx1RkYwNCIgPT4gIiQiCisKKyMg4oGSICBbQ09NTUVSQ0lBTCBNSU5VUyBTSUdOXQorIlx1MjA1MiIgPT4gIiUiCisKKyMg77yFICBbRlVMTFdJRFRIIFBFUkNFTlQgU0lHTl0KKyJcdUZGMDUiID0+ICIlIgorCisjIO+8hiAgW0ZVTExXSURUSCBBTVBFUlNBTkRdCisiXHVGRjA2IiA9PiAiJiIKKworIyDigY4gIFtMT1cgQVNURVJJU0tdCisiXHUyMDRFIiA9PiAiKiIKKworIyDvvIogIFtGVUxMV0lEVEggQVNURVJJU0tdCisiXHVGRjBBIiA9PiAiKiIKKworIyDvvIwgIFtGVUxMV0lEVEggQ09NTUFdCisiXHVGRjBDIiA9PiAiLCIKKworIyDvvI4gIFtGVUxMV0lEVEggRlVMTCBTVE9QXQorIlx1RkYwRSIgPT4gIi4iCisKKyMg4oGEICBbRlJBQ1RJT04gU0xBU0hdCisiXHUyMDQ0IiA9PiAiLyIKKworIyDvvI8gIFtGVUxMV0lEVEggU09MSURVU10KKyJcdUZGMEYiID0+ICIvIgorCisjIO+8miAgW0ZVTExXSURUSCBDT0xPTl0KKyJcdUZGMUEiID0+ICI6IgorCisjIOKBjyAgW1JFVkVSU0VEIFNFTUlDT0xPTl0KKyJcdTIwNEYiID0+ICI7IgorCisjIO+8myAgW0ZVTExXSURUSCBTRU1JQ09MT05dCisiXHVGRjFCIiA9PiAiOyIKKworIyDvvJ8gIFtGVUxMV0lEVEggUVVFU1RJT04gTUFSS10KKyJcdUZGMUYiID0+ICI/IgorCisjIOKBhyAgW0RPVUJMRSBRVUVTVElPTiBNQVJLXQorIlx1MjA0NyIgPT4gIj8/IgorCisjIOKBiCAgW1FVRVNUSU9OIEVYQ0xBTUFUSU9OIE1BUktdCisiXHUyMDQ4IiA9PiAiPyEiCisKKyMg77ygICBbRlVMTFdJRFRIIENPTU1FUkNJQUwgQVRdCisiXHVGRjIwIiA9PiAiQCIKKworIyDvvLwgIFtGVUxMV0lEVEggUkVWRVJTRSBTT0xJRFVTXQorIlx1RkYzQyIgPT4gIlxcIgorCisjIOKAuCAgW0NBUkVUXQorIlx1MjAzOCIgPT4gIl4iCisKKyMg77y+ICBbRlVMTFdJRFRIIENJUkNVTUZMRVggQUNDRU5UXQorIlx1RkYzRSIgPT4gIl4iCisKKyMg77y/ICBbRlVMTFdJRFRIIExPVyBMSU5FXQorIlx1RkYzRiIgPT4gIl8iCisKKyMg4oGTICBbU1dVTkcgREFTSF0KKyJcdTIwNTMiID0+ICJ+IgorCisjIO+9niAgW0ZVTExXSURUSCBUSUxERV0KKyJcdUZGNUUiID0+ICJ+IgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlbG93IGlzIHRoZSBQZXJsIHNjcmlwdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBhYm92ZSBtYXBwaW5ncyAjCisjIGZyb20gQVNDSUlGb2xkaW5nRmlsdGVyLmphdmE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICMhL3Vzci9iaW4vcGVybAorIworIyB1c2Ugd2FybmluZ3M7CisjIHVzZSBzdHJpY3Q7CisjIAorIyBteSBAc291cmNlX2NoYXJzID0gKCk7CisjIG15IEBzb3VyY2VfY2hhcl9kZXNjcmlwdGlvbnMgPSAoKTsKKyMgbXkgJHRhcmdldCA9ICcnOworIyAKKyMgd2hpbGUgKDw+KSB7CisjICAgaWYgKC9jYXNlXHMrJyhcXHVbQS1GMC05XSspJzpccypcL1wvXHMqKC4qKS9pKSB7CisjICAgICBwdXNoIEBzb3VyY2VfY2hhcnMsICQxOworIwkgIHB1c2ggQHNvdXJjZV9jaGFyX2Rlc2NyaXB0aW9ucywgJDI7CisjCSAgbmV4dDsKKyMgICB9CisjICAgaWYgKC9vdXRwdXRcW1teXF1dK1xdXHMqPVxzKicoXFwnfFxcXFx8LiknLykgeworIyAgICAgJHRhcmdldCAuPSAkMTsKKyMgICAgIG5leHQ7CisjICAgfQorIyAgIGlmICgvYnJlYWs7LykgeworIyAgICAgJHRhcmdldCA9ICJcXFwiIiBpZiAoJHRhcmdldCBlcSAnIicpOworIyAgICAgZm9yIG15ICRzb3VyY2VfY2hhcl9udW0gKDAuLiQjc291cmNlX2NoYXJzKSB7CisjCSAgICBwcmludCAiIyAkc291cmNlX2NoYXJfZGVzY3JpcHRpb25zWyRzb3VyY2VfY2hhcl9udW1dXG4iOworIwkgICAgcHJpbnQgIlwiJHNvdXJjZV9jaGFyc1skc291cmNlX2NoYXJfbnVtXVwiID0+IFwiJHRhcmdldFwiXG5cbiI7CisjCSAgfQorIwkgIEBzb3VyY2VfY2hhcnMgPSAoKTsKKyMJICBAc291cmNlX2NoYXJfZGVzY3JpcHRpb25zID0gKCk7CisjCSAgJHRhcmdldCA9ICcnOworIyAgIH0KKyMgfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9tYXBwaW5nLUlTT0xhdGluMUFjY2VudC50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL21hcHBpbmctSVNPTGF0aW4xQWNjZW50LnR4dAppbmRleCBjNDQxMDQzLi5lZGU3NzQyIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL21hcHBpbmctSVNPTGF0aW4xQWNjZW50LnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL21hcHBpbmctSVNPTGF0aW4xQWNjZW50LnR4dApAQCAtMSwyNDYgKzEsMjQ2IEBACi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotIyBTeW50YXg6DQotIyAgICJzb3VyY2UiID0+ICJ0YXJnZXQiDQotIyAgICAgInNvdXJjZSIubGVuZ3RoKCkgPiAwIChzb3VyY2UgY2Fubm90IGJlIGVtcHR5LikNCi0jICAgICAidGFyZ2V0Ii5sZW5ndGgoKSA+PSAwICh0YXJnZXQgY2FuIGJlIGVtcHR5LikNCi0NCi0jIGV4YW1wbGU6DQotIyAgICLDgCIgPT4gIkEiDQotIyAgICJcdTAwQzAiID0+ICJBIg0KLSMgICAiXHUwMEMwIiA9PiAiXHUwMDQxIg0KLSMgICAiw58iID0+ICJzcyINCi0jICAgIlx0IiA9PiAiICINCi0jICAgIlxuIiA9PiAiIg0KLQ0KLSMgw4AgPT4gQQ0KLSJcdTAwQzAiID0+ICJBIg0KLQ0KLSMgw4EgPT4gQQ0KLSJcdTAwQzEiID0+ICJBIg0KLQ0KLSMgw4IgPT4gQQ0KLSJcdTAwQzIiID0+ICJBIg0KLQ0KLSMgw4MgPT4gQQ0KLSJcdTAwQzMiID0+ICJBIg0KLQ0KLSMgw4QgPT4gQQ0KLSJcdTAwQzQiID0+ICJBIg0KLQ0KLSMgw4UgPT4gQQ0KLSJcdTAwQzUiID0+ICJBIg0KLQ0KLSMgw4YgPT4gQUUNCi0iXHUwMEM2IiA9PiAiQUUiDQotDQotIyDDhyA9PiBDDQotIlx1MDBDNyIgPT4gIkMiDQotDQotIyDDiCA9PiBFDQotIlx1MDBDOCIgPT4gIkUiDQotDQotIyDDiSA9PiBFDQotIlx1MDBDOSIgPT4gIkUiDQotDQotIyDDiiA9PiBFDQotIlx1MDBDQSIgPT4gIkUiDQotDQotIyDDiyA9PiBFDQotIlx1MDBDQiIgPT4gIkUiDQotDQotIyDDjCA9PiBJDQotIlx1MDBDQyIgPT4gIkkiDQotDQotIyDDjSA9PiBJDQotIlx1MDBDRCIgPT4gIkkiDQotDQotIyDDjiA9PiBJDQotIlx1MDBDRSIgPT4gIkkiDQotDQotIyDDjyA9PiBJDQotIlx1MDBDRiIgPT4gIkkiDQotDQotIyDEsiA9PiBJSg0KLSJcdTAxMzIiID0+ICJJSiINCi0NCi0jIMOQID0+IEQNCi0iXHUwMEQwIiA9PiAiRCINCi0NCi0jIMORID0+IE4NCi0iXHUwMEQxIiA9PiAiTiINCi0NCi0jIMOSID0+IE8NCi0iXHUwMEQyIiA9PiAiTyINCi0NCi0jIMOTID0+IE8NCi0iXHUwMEQzIiA9PiAiTyINCi0NCi0jIMOUID0+IE8NCi0iXHUwMEQ0IiA9PiAiTyINCi0NCi0jIMOVID0+IE8NCi0iXHUwMEQ1IiA9PiAiTyINCi0NCi0jIMOWID0+IE8NCi0iXHUwMEQ2IiA9PiAiTyINCi0NCi0jIMOYID0+IE8NCi0iXHUwMEQ4IiA9PiAiTyINCi0NCi0jIMWSID0+IE9FDQotIlx1MDE1MiIgPT4gIk9FIg0KLQ0KLSMgw54NCi0iXHUwMERFIiA9PiAiVEgiDQotDQotIyDDmSA9PiBVDQotIlx1MDBEOSIgPT4gIlUiDQotDQotIyDDmiA9PiBVDQotIlx1MDBEQSIgPT4gIlUiDQotDQotIyDDmyA9PiBVDQotIlx1MDBEQiIgPT4gIlUiDQotDQotIyDDnCA9PiBVDQotIlx1MDBEQyIgPT4gIlUiDQotDQotIyDDnSA9PiBZDQotIlx1MDBERCIgPT4gIlkiDQotDQotIyDFuCA9PiBZDQotIlx1MDE3OCIgPT4gIlkiDQotDQotIyDDoCA9PiBhDQotIlx1MDBFMCIgPT4gImEiDQotDQotIyDDoSA9PiBhDQotIlx1MDBFMSIgPT4gImEiDQotDQotIyDDoiA9PiBhDQotIlx1MDBFMiIgPT4gImEiDQotDQotIyDDoyA9PiBhDQotIlx1MDBFMyIgPT4gImEiDQotDQotIyDDpCA9PiBhDQotIlx1MDBFNCIgPT4gImEiDQotDQotIyDDpSA9PiBhDQotIlx1MDBFNSIgPT4gImEiDQotDQotIyDDpiA9PiBhZQ0KLSJcdTAwRTYiID0+ICJhZSINCi0NCi0jIMOnID0+IGMNCi0iXHUwMEU3IiA9PiAiYyINCi0NCi0jIMOoID0+IGUNCi0iXHUwMEU4IiA9PiAiZSINCi0NCi0jIMOpID0+IGUNCi0iXHUwMEU5IiA9PiAiZSINCi0NCi0jIMOqID0+IGUNCi0iXHUwMEVBIiA9PiAiZSINCi0NCi0jIMOrID0+IGUNCi0iXHUwMEVCIiA9PiAiZSINCi0NCi0jIMOsID0+IGkNCi0iXHUwMEVDIiA9PiAiaSINCi0NCi0jIMOtID0+IGkNCi0iXHUwMEVEIiA9PiAiaSINCi0NCi0jIMOuID0+IGkNCi0iXHUwMEVFIiA9PiAiaSINCi0NCi0jIMOvID0+IGkNCi0iXHUwMEVGIiA9PiAiaSINCi0NCi0jIMSzID0+IGlqDQotIlx1MDEzMyIgPT4gImlqIg0KLQ0KLSMgw7AgPT4gZA0KLSJcdTAwRjAiID0+ICJkIg0KLQ0KLSMgw7EgPT4gbg0KLSJcdTAwRjEiID0+ICJuIg0KLQ0KLSMgw7IgPT4gbw0KLSJcdTAwRjIiID0+ICJvIg0KLQ0KLSMgw7MgPT4gbw0KLSJcdTAwRjMiID0+ICJvIg0KLQ0KLSMgw7QgPT4gbw0KLSJcdTAwRjQiID0+ICJvIg0KLQ0KLSMgw7UgPT4gbw0KLSJcdTAwRjUiID0+ICJvIg0KLQ0KLSMgw7YgPT4gbw0KLSJcdTAwRjYiID0+ICJvIg0KLQ0KLSMgw7ggPT4gbw0KLSJcdTAwRjgiID0+ICJvIg0KLQ0KLSMgxZMgPT4gb2UNCi0iXHUwMTUzIiA9PiAib2UiDQotDQotIyDDnyA9PiBzcw0KLSJcdTAwREYiID0+ICJzcyINCi0NCi0jIMO+ID0+IHRoDQotIlx1MDBGRSIgPT4gInRoIg0KLQ0KLSMgw7kgPT4gdQ0KLSJcdTAwRjkiID0+ICJ1Ig0KLQ0KLSMgw7ogPT4gdQ0KLSJcdTAwRkEiID0+ICJ1Ig0KLQ0KLSMgw7sgPT4gdQ0KLSJcdTAwRkIiID0+ICJ1Ig0KLQ0KLSMgw7wgPT4gdQ0KLSJcdTAwRkMiID0+ICJ1Ig0KLQ0KLSMgw70gPT4geQ0KLSJcdTAwRkQiID0+ICJ5Ig0KLQ0KLSMgw78gPT4geQ0KLSJcdTAwRkYiID0+ICJ5Ig0KLQ0KLSMg76yAID0+IGZmDQotIlx1RkIwMCIgPT4gImZmIg0KLQ0KLSMg76yBID0+IGZpDQotIlx1RkIwMSIgPT4gImZpIg0KLQ0KLSMg76yCID0+IGZsDQotIlx1RkIwMiIgPT4gImZsIg0KLQ0KLSMg76yDID0+IGZmaQ0KLSJcdUZCMDMiID0+ICJmZmkiDQotDQotIyDvrIQgPT4gZmZsDQotIlx1RkIwNCIgPT4gImZmbCINCi0NCi0jIO+shSA9PiBmdA0KLSJcdUZCMDUiID0+ICJmdCINCi0NCi0jIO+shiA9PiBzdA0KLSJcdUZCMDYiID0+ICJzdCINCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBTeW50YXg6CisjICAgInNvdXJjZSIgPT4gInRhcmdldCIKKyMgICAgICJzb3VyY2UiLmxlbmd0aCgpID4gMCAoc291cmNlIGNhbm5vdCBiZSBlbXB0eS4pCisjICAgICAidGFyZ2V0Ii5sZW5ndGgoKSA+PSAwICh0YXJnZXQgY2FuIGJlIGVtcHR5LikKKworIyBleGFtcGxlOgorIyAgICLDgCIgPT4gIkEiCisjICAgIlx1MDBDMCIgPT4gIkEiCisjICAgIlx1MDBDMCIgPT4gIlx1MDA0MSIKKyMgICAiw58iID0+ICJzcyIKKyMgICAiXHQiID0+ICIgIgorIyAgICJcbiIgPT4gIiIKKworIyDDgCA9PiBBCisiXHUwMEMwIiA9PiAiQSIKKworIyDDgSA9PiBBCisiXHUwMEMxIiA9PiAiQSIKKworIyDDgiA9PiBBCisiXHUwMEMyIiA9PiAiQSIKKworIyDDgyA9PiBBCisiXHUwMEMzIiA9PiAiQSIKKworIyDDhCA9PiBBCisiXHUwMEM0IiA9PiAiQSIKKworIyDDhSA9PiBBCisiXHUwMEM1IiA9PiAiQSIKKworIyDDhiA9PiBBRQorIlx1MDBDNiIgPT4gIkFFIgorCisjIMOHID0+IEMKKyJcdTAwQzciID0+ICJDIgorCisjIMOIID0+IEUKKyJcdTAwQzgiID0+ICJFIgorCisjIMOJID0+IEUKKyJcdTAwQzkiID0+ICJFIgorCisjIMOKID0+IEUKKyJcdTAwQ0EiID0+ICJFIgorCisjIMOLID0+IEUKKyJcdTAwQ0IiID0+ICJFIgorCisjIMOMID0+IEkKKyJcdTAwQ0MiID0+ICJJIgorCisjIMONID0+IEkKKyJcdTAwQ0QiID0+ICJJIgorCisjIMOOID0+IEkKKyJcdTAwQ0UiID0+ICJJIgorCisjIMOPID0+IEkKKyJcdTAwQ0YiID0+ICJJIgorCisjIMSyID0+IElKCisiXHUwMTMyIiA9PiAiSUoiCisKKyMgw5AgPT4gRAorIlx1MDBEMCIgPT4gIkQiCisKKyMgw5EgPT4gTgorIlx1MDBEMSIgPT4gIk4iCisKKyMgw5IgPT4gTworIlx1MDBEMiIgPT4gIk8iCisKKyMgw5MgPT4gTworIlx1MDBEMyIgPT4gIk8iCisKKyMgw5QgPT4gTworIlx1MDBENCIgPT4gIk8iCisKKyMgw5UgPT4gTworIlx1MDBENSIgPT4gIk8iCisKKyMgw5YgPT4gTworIlx1MDBENiIgPT4gIk8iCisKKyMgw5ggPT4gTworIlx1MDBEOCIgPT4gIk8iCisKKyMgxZIgPT4gT0UKKyJcdTAxNTIiID0+ICJPRSIKKworIyDDngorIlx1MDBERSIgPT4gIlRIIgorCisjIMOZID0+IFUKKyJcdTAwRDkiID0+ICJVIgorCisjIMOaID0+IFUKKyJcdTAwREEiID0+ICJVIgorCisjIMObID0+IFUKKyJcdTAwREIiID0+ICJVIgorCisjIMOcID0+IFUKKyJcdTAwREMiID0+ICJVIgorCisjIMOdID0+IFkKKyJcdTAwREQiID0+ICJZIgorCisjIMW4ID0+IFkKKyJcdTAxNzgiID0+ICJZIgorCisjIMOgID0+IGEKKyJcdTAwRTAiID0+ICJhIgorCisjIMOhID0+IGEKKyJcdTAwRTEiID0+ICJhIgorCisjIMOiID0+IGEKKyJcdTAwRTIiID0+ICJhIgorCisjIMOjID0+IGEKKyJcdTAwRTMiID0+ICJhIgorCisjIMOkID0+IGEKKyJcdTAwRTQiID0+ICJhIgorCisjIMOlID0+IGEKKyJcdTAwRTUiID0+ICJhIgorCisjIMOmID0+IGFlCisiXHUwMEU2IiA9PiAiYWUiCisKKyMgw6cgPT4gYworIlx1MDBFNyIgPT4gImMiCisKKyMgw6ggPT4gZQorIlx1MDBFOCIgPT4gImUiCisKKyMgw6kgPT4gZQorIlx1MDBFOSIgPT4gImUiCisKKyMgw6ogPT4gZQorIlx1MDBFQSIgPT4gImUiCisKKyMgw6sgPT4gZQorIlx1MDBFQiIgPT4gImUiCisKKyMgw6wgPT4gaQorIlx1MDBFQyIgPT4gImkiCisKKyMgw60gPT4gaQorIlx1MDBFRCIgPT4gImkiCisKKyMgw64gPT4gaQorIlx1MDBFRSIgPT4gImkiCisKKyMgw68gPT4gaQorIlx1MDBFRiIgPT4gImkiCisKKyMgxLMgPT4gaWoKKyJcdTAxMzMiID0+ICJpaiIKKworIyDDsCA9PiBkCisiXHUwMEYwIiA9PiAiZCIKKworIyDDsSA9PiBuCisiXHUwMEYxIiA9PiAibiIKKworIyDDsiA9PiBvCisiXHUwMEYyIiA9PiAibyIKKworIyDDsyA9PiBvCisiXHUwMEYzIiA9PiAibyIKKworIyDDtCA9PiBvCisiXHUwMEY0IiA9PiAibyIKKworIyDDtSA9PiBvCisiXHUwMEY1IiA9PiAibyIKKworIyDDtiA9PiBvCisiXHUwMEY2IiA9PiAibyIKKworIyDDuCA9PiBvCisiXHUwMEY4IiA9PiAibyIKKworIyDFkyA9PiBvZQorIlx1MDE1MyIgPT4gIm9lIgorCisjIMOfID0+IHNzCisiXHUwMERGIiA9PiAic3MiCisKKyMgw74gPT4gdGgKKyJcdTAwRkUiID0+ICJ0aCIKKworIyDDuSA9PiB1CisiXHUwMEY5IiA9PiAidSIKKworIyDDuiA9PiB1CisiXHUwMEZBIiA9PiAidSIKKworIyDDuyA9PiB1CisiXHUwMEZCIiA9PiAidSIKKworIyDDvCA9PiB1CisiXHUwMEZDIiA9PiAidSIKKworIyDDvSA9PiB5CisiXHUwMEZEIiA9PiAieSIKKworIyDDvyA9PiB5CisiXHUwMEZGIiA9PiAieSIKKworIyDvrIAgPT4gZmYKKyJcdUZCMDAiID0+ICJmZiIKKworIyDvrIEgPT4gZmkKKyJcdUZCMDEiID0+ICJmaSIKKworIyDvrIIgPT4gZmwKKyJcdUZCMDIiID0+ICJmbCIKKworIyDvrIMgPT4gZmZpCisiXHVGQjAzIiA9PiAiZmZpIgorCisjIO+shCA9PiBmZmwKKyJcdUZCMDQiID0+ICJmZmwiCisKKyMg76yFID0+IGZ0CisiXHVGQjA1IiA9PiAiZnQiCisKKyMg76yGID0+IHN0CisiXHVGQjA2IiA9PiAic3QiCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3Byb3R3b3Jkcy50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3Byb3R3b3Jkcy50eHQKaW5kZXggNWEzMmU1MC4uMWRmYzBhYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9wcm90d29yZHMudHh0CisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvcHJvdHdvcmRzLnR4dApAQCAtMSwyMSArMSwyMSBAQAotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSMgVXNlIGEgcHJvdGVjdGVkIHdvcmQgZmlsZSB0byBwcm90ZWN0IGFnYWluc3QgdGhlIHN0ZW1tZXIgcmVkdWNpbmcgdHdvDQotIyB1bnJlbGF0ZWQgd29yZHMgdG8gdGhlIHNhbWUgYmFzZSB3b3JkLg0KLQ0KLSMgU29tZSBub24td29yZHMgdGhhdCBub3JtYWxseSB3b24ndCBiZSBlbmNvdW50ZXJlZCwNCi0jIGp1c3QgdG8gdGVzdCB0aGF0IHRoZXkgd29uJ3QgYmUgc3RlbW1lZC4NCi1kb250c3RlbXMNCi16d2hhY2t5DQotDQorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBVc2UgYSBwcm90ZWN0ZWQgd29yZCBmaWxlIHRvIHByb3RlY3QgYWdhaW5zdCB0aGUgc3RlbW1lciByZWR1Y2luZyB0d28KKyMgdW5yZWxhdGVkIHdvcmRzIHRvIHRoZSBzYW1lIGJhc2Ugd29yZC4KKworIyBTb21lIG5vbi13b3JkcyB0aGF0IG5vcm1hbGx5IHdvbid0IGJlIGVuY291bnRlcmVkLAorIyBqdXN0IHRvIHRlc3QgdGhhdCB0aGV5IHdvbid0IGJlIHN0ZW1tZWQuCitkb250c3RlbXMKK3p3aGFja3kKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9zcGVsbGluZ3MudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9zcGVsbGluZ3MudHh0CmluZGV4IDc2NTE5MGEuLjE2MmEwNDQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvc3BlbGxpbmdzLnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3NwZWxsaW5ncy50eHQKQEAgLTEsMiArMSwyIEBACi1waXp6YQ0KLWhpc3RvcnkNCitwaXp6YQoraGlzdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9zdG9wd29yZHMudHh0IGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9zdG9wd29yZHMudHh0CmluZGV4IDI1YjQ3ZjYuLmFlMWU4M2UgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvc3RvcHdvcmRzLnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3N0b3B3b3Jkcy50eHQKQEAgLTEsMTQgKzEsMTQgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi9zeW5vbnltcy50eHQgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3N5bm9ueW1zLnR4dAppbmRleCBmMDAyOTRiLi43ZjcyMTI4IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3N5bm9ueW1zLnR4dAorKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3N5bm9ueW1zLnR4dApAQCAtMSwyOSArMSwyOSBAQAotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSNzb21lIHRlc3Qgc3lub255bSBtYXBwaW5ncyB1bmxpa2VseSB0byBhcHBlYXIgaW4gcmVhbCBpbnB1dCB0ZXh0DQotYWFhZm9vID0+IGFhYWJhcg0KLWJiYmZvbyA9PiBiYmJmb28gYmJiYmFyDQotY2NjZm9vID0+IGNjY2JhciBjY2NiYXoNCi1mb29hYWEsYmFyYWFhLGJhemFhYQ0KLQ0KLSMgU29tZSBzeW5vbnltIGdyb3VwcyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUNCi1HQixnaWIsZ2lnYWJ5dGUsZ2lnYWJ5dGVzDQotTUIsbWliLG1lZ2FieXRlLG1lZ2FieXRlcw0KLVRlbGV2aXNpb24sIFRlbGV2aXNpb25zLCBUViwgVFZzDQotI25vdGljZSB3ZSB1c2UgImdpYiIgaW5zdGVhZCBvZiAiR2lCIiBzbyBhbnkgV29yZERlbGltaXRlckZpbHRlciBjb21pbmcNCi0jYWZ0ZXIgdXMgd29uJ3Qgc3BsaXQgaXQgaW50byB0d28gd29yZHMuDQotDQotIyBTeW5vbnltIG1hcHBpbmdzIGNhbiBiZSB1c2VkIGZvciBzcGVsbGluZyBjb3JyZWN0aW9uIHRvbw0KLXBpeGltYSA9PiBwaXhtYQ0KLQ0KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNzb21lIHRlc3Qgc3lub255bSBtYXBwaW5ncyB1bmxpa2VseSB0byBhcHBlYXIgaW4gcmVhbCBpbnB1dCB0ZXh0CithYWFmb28gPT4gYWFhYmFyCitiYmJmb28gPT4gYmJiZm9vIGJiYmJhcgorY2NjZm9vID0+IGNjY2JhciBjY2NiYXoKK2Zvb2FhYSxiYXJhYWEsYmF6YWFhCisKKyMgU29tZSBzeW5vbnltIGdyb3VwcyBzcGVjaWZpYyB0byB0aGlzIGV4YW1wbGUKK0dCLGdpYixnaWdhYnl0ZSxnaWdhYnl0ZXMKK01CLG1pYixtZWdhYnl0ZSxtZWdhYnl0ZXMKK1RlbGV2aXNpb24sIFRlbGV2aXNpb25zLCBUViwgVFZzCisjbm90aWNlIHdlIHVzZSAiZ2liIiBpbnN0ZWFkIG9mICJHaUIiIHNvIGFueSBXb3JkRGVsaW1pdGVyRmlsdGVyIGNvbWluZworI2FmdGVyIHVzIHdvbid0IHNwbGl0IGl0IGludG8gdHdvIHdvcmRzLgorCisjIFN5bm9ueW0gbWFwcGluZ3MgY2FuIGJlIHVzZWQgZm9yIHNwZWxsaW5nIGNvcnJlY3Rpb24gdG9vCitwaXhpbWEgPT4gcGl4bWEKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi91cGRhdGUtc2NyaXB0LmpzIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi91cGRhdGUtc2NyaXB0LmpzCmluZGV4IDI3MmNiZmEuLjQ5YjA3ZjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvdXBkYXRlLXNjcmlwdC5qcworKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3VwZGF0ZS1zY3JpcHQuanMKQEAgLTEsNTMgKzEsNTMgQEAKLS8qDQotICBUaGlzIGlzIGEgYmFzaWMgc2tlbGV0b24gSmF2YVNjcmlwdCB1cGRhdGUgcHJvY2Vzc29yLg0KLQ0KLSAgSW4gb3JkZXIgZm9yIHRoaXMgdG8gYmUgZXhlY3V0ZWQsIGl0IG11c3QgYmUgcHJvcGVybHkgd2lyZWQgaW50byBzb2xyY29uZmlnLnhtbDsgYnkgZGVmYXVsdCBpdCBpcyBjb21tZW50ZWQgb3V0IGluDQotICB0aGUgZXhhbXBsZSBzb2xyY29uZmlnLnhtbCBhbmQgbXVzdCBiZSB1bmNvbW1lbnRlZCB0byBiZSBlbmFibGVkLg0KLQ0KLSAgU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9TY3JpcHRVcGRhdGVQcm9jZXNzb3IgZm9yIG1vcmUgZGV0YWlscy4NCi0qLw0KLQ0KLWZ1bmN0aW9uIHByb2Nlc3NBZGQoY21kKSB7DQotDQotICBkb2MgPSBjbWQuc29sckRvYzsgIC8vIG9yZy5hcGFjaGUuc29sci5jb21tb24uU29scklucHV0RG9jdW1lbnQNCi0gIGlkID0gZG9jLmdldEZpZWxkVmFsdWUoImlkIik7DQotICBsb2dnZXIuaW5mbygidXBkYXRlLXNjcmlwdCNwcm9jZXNzQWRkOiBpZD0iICsgaWQpOw0KLQ0KLS8vIFNldCBhIGZpZWxkIHZhbHVlOg0KLS8vICBkb2Muc2V0RmllbGQoImZvb19zIiwgIndoYXRldmVyIik7DQotDQotLy8gR2V0IGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXI6DQotLy8gIGNvbmZpZ19wYXJhbSA9IHBhcmFtcy5nZXQoJ2NvbmZpZ19wYXJhbScpOyAgLy8gInBhcmFtcyIgb25seSBleGlzdHMgaWYgcHJvY2Vzc29yIGNvbmZpZ3VyZWQgd2l0aCA8bHN0IG5hbWU9InBhcmFtcyI+DQotDQotLy8gR2V0IGEgcmVxdWVzdCBwYXJhbWV0ZXI6DQotLy8gc29tZV9wYXJhbSA9IHJlcS5nZXRQYXJhbXMoKS5nZXQoInNvbWVfcGFyYW0iKQ0KLQ0KLS8vIEFkZCBhIGZpZWxkIG9mIGZpZWxkIG5hbWVzIHRoYXQgbWF0Y2ggYSBwYXR0ZXJuOg0KLS8vICAgLSBQb3RlbnRpYWxseSB1c2VmdWwgdG8gZGV0ZXJtaW5lIHRoZSBmaWVsZHMvYXR0cmlidXRlcyByZXByZXNlbnRlZCBpbiBhIHJlc3VsdCBzZXQsIHZpYSBmYWNldGluZyBvbiBmaWVsZF9uYW1lX3NzDQotLy8gIGZpZWxkX25hbWVzID0gZG9jLmdldEZpZWxkTmFtZXMoKS50b0FycmF5KCk7DQotLy8gIGZvcihpPTA7IGkgPCBmaWVsZF9uYW1lcy5sZW5ndGg7IGkrKykgew0KLS8vICAgIGZpZWxkX25hbWUgPSBmaWVsZF9uYW1lc1tpXTsNCi0vLyAgICBpZiAoL2F0dHJfLiovLnRlc3QoZmllbGRfbmFtZSkpIHsgZG9jLmFkZEZpZWxkKCJhdHRyaWJ1dGVfc3MiLCBmaWVsZF9uYW1lc1tpXSk7IH0NCi0vLyAgfQ0KLQ0KLX0NCi0NCi1mdW5jdGlvbiBwcm9jZXNzRGVsZXRlKGNtZCkgew0KLSAgLy8gbm8tb3ANCi19DQotDQotZnVuY3Rpb24gcHJvY2Vzc01lcmdlSW5kZXhlcyhjbWQpIHsNCi0gIC8vIG5vLW9wDQotfQ0KLQ0KLWZ1bmN0aW9uIHByb2Nlc3NDb21taXQoY21kKSB7DQotICAvLyBuby1vcA0KLX0NCi0NCi1mdW5jdGlvbiBwcm9jZXNzUm9sbGJhY2soY21kKSB7DQotICAvLyBuby1vcA0KLX0NCi0NCi1mdW5jdGlvbiBmaW5pc2goKSB7DQotICAvLyBuby1vcA0KLX0NCisvKgorICBUaGlzIGlzIGEgYmFzaWMgc2tlbGV0b24gSmF2YVNjcmlwdCB1cGRhdGUgcHJvY2Vzc29yLgorCisgIEluIG9yZGVyIGZvciB0aGlzIHRvIGJlIGV4ZWN1dGVkLCBpdCBtdXN0IGJlIHByb3Blcmx5IHdpcmVkIGludG8gc29scmNvbmZpZy54bWw7IGJ5IGRlZmF1bHQgaXQgaXMgY29tbWVudGVkIG91dCBpbgorICB0aGUgZXhhbXBsZSBzb2xyY29uZmlnLnhtbCBhbmQgbXVzdCBiZSB1bmNvbW1lbnRlZCB0byBiZSBlbmFibGVkLgorCisgIFNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvU2NyaXB0VXBkYXRlUHJvY2Vzc29yIGZvciBtb3JlIGRldGFpbHMuCisqLworCitmdW5jdGlvbiBwcm9jZXNzQWRkKGNtZCkgeworCisgIGRvYyA9IGNtZC5zb2xyRG9jOyAgLy8gb3JnLmFwYWNoZS5zb2xyLmNvbW1vbi5Tb2xySW5wdXREb2N1bWVudAorICBpZCA9IGRvYy5nZXRGaWVsZFZhbHVlKCJpZCIpOworICBsb2dnZXIuaW5mbygidXBkYXRlLXNjcmlwdCNwcm9jZXNzQWRkOiBpZD0iICsgaWQpOworCisvLyBTZXQgYSBmaWVsZCB2YWx1ZToKKy8vICBkb2Muc2V0RmllbGQoImZvb19zIiwgIndoYXRldmVyIik7CisKKy8vIEdldCBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyOgorLy8gIGNvbmZpZ19wYXJhbSA9IHBhcmFtcy5nZXQoJ2NvbmZpZ19wYXJhbScpOyAgLy8gInBhcmFtcyIgb25seSBleGlzdHMgaWYgcHJvY2Vzc29yIGNvbmZpZ3VyZWQgd2l0aCA8bHN0IG5hbWU9InBhcmFtcyI+CisKKy8vIEdldCBhIHJlcXVlc3QgcGFyYW1ldGVyOgorLy8gc29tZV9wYXJhbSA9IHJlcS5nZXRQYXJhbXMoKS5nZXQoInNvbWVfcGFyYW0iKQorCisvLyBBZGQgYSBmaWVsZCBvZiBmaWVsZCBuYW1lcyB0aGF0IG1hdGNoIGEgcGF0dGVybjoKKy8vICAgLSBQb3RlbnRpYWxseSB1c2VmdWwgdG8gZGV0ZXJtaW5lIHRoZSBmaWVsZHMvYXR0cmlidXRlcyByZXByZXNlbnRlZCBpbiBhIHJlc3VsdCBzZXQsIHZpYSBmYWNldGluZyBvbiBmaWVsZF9uYW1lX3NzCisvLyAgZmllbGRfbmFtZXMgPSBkb2MuZ2V0RmllbGROYW1lcygpLnRvQXJyYXkoKTsKKy8vICBmb3IoaT0wOyBpIDwgZmllbGRfbmFtZXMubGVuZ3RoOyBpKyspIHsKKy8vICAgIGZpZWxkX25hbWUgPSBmaWVsZF9uYW1lc1tpXTsKKy8vICAgIGlmICgvYXR0cl8uKi8udGVzdChmaWVsZF9uYW1lKSkgeyBkb2MuYWRkRmllbGQoImF0dHJpYnV0ZV9zcyIsIGZpZWxkX25hbWVzW2ldKTsgfQorLy8gIH0KKworfQorCitmdW5jdGlvbiBwcm9jZXNzRGVsZXRlKGNtZCkgeworICAvLyBuby1vcAorfQorCitmdW5jdGlvbiBwcm9jZXNzTWVyZ2VJbmRleGVzKGNtZCkgeworICAvLyBuby1vcAorfQorCitmdW5jdGlvbiBwcm9jZXNzQ29tbWl0KGNtZCkgeworICAvLyBuby1vcAorfQorCitmdW5jdGlvbiBwcm9jZXNzUm9sbGJhY2soY21kKSB7CisgIC8vIG5vLW9wCit9CisKK2Z1bmN0aW9uIGZpbmlzaCgpIHsKKyAgLy8gbm8tb3AKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvdmVsb2NpdHkvUkVBRE1FLnR4dCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvdmVsb2NpdHkvUkVBRE1FLnR4dAppbmRleCBiZGNlM2UxLi41ZDU2MGJhIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3ZlbG9jaXR5L1JFQURNRS50eHQKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi92ZWxvY2l0eS9SRUFETUUudHh0CkBAIC0xLDEwMSArMSwxMDEgQEAKLUludHJvZHVjdGlvbg0KLS0tLS0tLS0tLS0tLQ0KLVNvbHIgU2VhcmNoIFZlbG9jaXR5IFRlbXBsYXRlcw0KLQ0KLUEgcXVpY2sgZGVtbyBvZiB1c2luZyBTb2xyIHVzaW5nIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9WZWxvY2l0eVJlc3BvbnNlV3JpdGVyDQotDQotWW91IHR5cGljYWxseSBhY2Nlc3MgdGhlc2UgdGVtcGxhdGVzIHZpYToNCi0JaHR0cDovL2xvY2FsaG9zdDo4OTgzL3NvbHIvY29sbGVjdGlvbjEvYnJvd3NlDQotDQotSXQncyBjYWxsZWQgImJyb3dzZSIgYmVjYXVzZSB5b3UgY2FuIGNsaWNrIGFyb3VuZCB3aXRoIHlvdXIgbW91c2UNCi13aXRob3V0IG5lZWRpbmcgdG8gdHlwZSBhbnkgc2VhcmNoIHRlcm1zLiAgQW5kIG9mIGNvdXJzZSBpdA0KLWFsc28gd29ya3MgYXMgYSBzdGFuZGFyZCBzZWFyY2ggYXBwIGFzIHdlbGwuDQotDQotS25vd24gTGltaXRhdGlvbnMNCi0tLS0tLS0tLS0tLS0tLS0tLQ0KLSogVGhlIC9icm93c2UgYW5kIHRoZSBWZWxvY2l0eVJlc3BvbnNlV3JpdGVyIGNvbXBvbmVudA0KLSAgc2VydmUgY29udGVudCBkaXJlY3RseSBmcm9tIFNvbHIsIHdoaWNoIHVzdWFsbHkgcmVxdWlyZXMNCi0gIFNvbHIncyBIVFRQIEFQSSB0byBiZSBleHBvc2VkLiAgQWR2YW5jZWQgdXNlcnMgY291bGQNCi0gIHBvdGVudGlhbGx5IGFjY2VzcyBvdGhlciBwYXJ0cyBvZiBTb2xyIGRpcmVjdGx5Lg0KLSogVGhlcmUgYXJlIHNvbWUgaGFyZCBjb2RlZCBmaWVsZHMgaW4gdGhlc2UgdGVtcGxhdGVzLg0KLSAgU2luY2UgdGhlc2UgdGVtcGxhdGVzIGxpdmUgdW5kZXIgY29uZiwgdGhleSBzaG91bGQgYmUNCi0gIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uLCBhbmQNCi0gIG11c3QgYmUgY29vcmRpbmF0ZWQgd2l0aCBzY2hlbWEueG1sIGFuZCBzb2xyY29uZmlnLnhtbA0KLQ0KLVZlbG9jaXR5IEluZm8NCi0tLS0tLS0tLS0tLS0tDQotSmF2YS1iYXNlZCB0ZW1wbGF0ZSBsYW5ndWFnZS4NCi0NCi1JdCdzIG5pY2UgaW4gdGhpcyBjb250ZXh0IGJlY2F1c2UgY2hhbmdlIHRvIHRoZSB0ZW1wbGF0ZXMNCi1hcmUgaW1tZWRpYXRlbHkgdmlzaWJsZSBpbiBicm93c2VyIG9uIHRoZSBuZXh0IHZpc2l0Lg0KLQ0KLUxpbmtzOg0KLQlodHRwOi8vdmVsb2NpdHkuYXBhY2hlLm9yZw0KLQlodHRwOi8vd2lraS5hcGFjaGUub3JnL3ZlbG9jaXR5Lw0KLQlodHRwOi8vdmVsb2NpdHkuYXBhY2hlLm9yZy9lbmdpbmUvcmVsZWFzZXMvdmVsb2NpdHktMS43L3VzZXItZ3VpZGUuaHRtbA0KLQ0KLQ0KLUZpbGUgTGlzdA0KLS0tLS0tLS0tLQ0KLQ0KLVN5c3RlbSBhbmQgTWlzYzoNCi0gIFZNX2dsb2JhbF9saWJyYXJ5LnZtICAgIC0gTWFjcm9zIHVzZWQgb3RoZXIgdGVtcGxhdGVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdCBmaWxlbmFtZSBpcyBpbXBvcnRhbnQgZm9yIFZlbG9jaXR5IHRvIHNlZSBpdA0KLSAgZXJyb3Iudm0gICAgICAgICAgICAgICAgLSBzaG93cyBlcnJvcnMsIGlmIGFueQ0KLSAgZGVidWcudm0gICAgICAgICAgICAgICAgLSBpbmNsdWRlcyB0b2dnbGUgbGlua3MgZm9yICJleHBsYWluIiBhbmQgImFsbCBmaWVsZHMiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlZCBieSBkZWJ1ZyBsaW5rIGluIGZvb3Rlci52bQ0KLSAgUkVBRE1FLnR4dCAgICAgICAgICAgICAgLSB0aGlzIGZpbGUNCi0NCi1PdmVyYWxsIFBhZ2UgQ29tcG9zaXRpb246DQotICBicm93c2Uudm0gICAgICAgICAgICAgICAtIE1haW4gZW50cnkgcG9pbnQgaW50byB0ZW1wbGF0ZXMNCi0gIGxheW91dC52bSAgICAgICAgICAgICAgIC0gb3ZlcmFsbCBIVE1MIHBhZ2UgbGF5b3V0DQotICBoZWFkLnZtICAgICAgICAgICAgICAgICAtIGVsZW1lbnRzIGluIHRoZSA8aGVhZD4gc2VjdGlvbiBvZiB0aGUgSFRNTCBkb2N1bWVudA0KLSAgaGVhZGVyLnZtICAgICAgICAgICAgICAgLSB0b3Agc2VjdGlvbiBvZiBwYWdlIHZpc2libGUgdG8gdXNlcnMNCi0gIGZvb3Rlci52bSAgICAgICAgICAgICAgIC0gYm90dG9tIHNlY3Rpb24gb2YgcGFnZSB2aXNpYmxlIHRvIHVzZXJzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBkZWJ1ZyBhbmQgaGVscCBsaW5rcw0KLSAgbWFpbi5jc3MgICAgICAgICAgICAgICAgLSBDU1Mgc3R5bGUgZm9yIG92ZXJhbGwgcGFnZXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlIGFsc28ganF1ZXJ5LmF1dG9jb21wbGV0ZS5jc3MNCi0NCi1RdWVyeSBGb3JtIGFuZCBPcHRpb25zOg0KLSAgcXVlcnlfZm9ybS52bSAgICAgICAgICAgLSByZW5kZXJzIHF1ZXJ5IGZvcm0NCi0gIHF1ZXJ5X2dyb3VwLnZtICAgICAgICAgIC0gZ3JvdXAgYnkgZmllbGRzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy46IE1hbnVmYWN0dXJlciBvciBQb3BsdWxhcml0eQ0KLSAgcXVlcnlfc3BhdGlhbC52bSAgICAgICAgLSBzZWxlY3QgYm94IGZvciBsb2NhdGlvbiBiYXNlZCBHZW9zcGFjaWFsIHNlYXJjaA0KLQ0KLVNwZWxsaW5nIFN1Z2dlc3Rpb25zOg0KLSAgZGlkX3lvdV9tZWFuLnZtICAgICAgICAgLSBoeXBlcmxpbmtlZCBzcGVsbGluZyBzdWdnZXN0aW9ucyBpbiByZXN1bHRzDQotICBzdWdnZXN0LnZtICAgICAgICAgICAgICAtIGR5bmFtaWMgc3BlbGxpbmcgc3VnZ2VzdGlvbnMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgeW91IHR5cGUgaW4gdGhlIHNlYXJjaCBmb3JtDQotICBqcXVlcnkuYXV0b2NvbXBsZXRlLmpzICAtIHN1cHBvcnRpbmcgZmlsZXMgZm9yIGR5bmFtaWMgc3VnZ2VzdGlvbnMNCi0gIGpxdWVyeS5hdXRvY29tcGxldGUuY3NzIC0gTW9zdCBDU1MgaXMgZGVmaW5lZCBpbiBtYWluLmNzcw0KLQ0KLQ0KLVNlYXJjaCBSZXN1bHRzLCBHZW5lcmFsOg0KLSAgKHNlZSBhbHNvIGJyb3dzZS52bSkNCi0gIHRhYnMudm0gICAgICAgICAgICAgICAgIC0gcHJvdmlkZXMgbmF2aWdhdGlvbiB0byBhZHZhbmNlZCBzZWFyY2ggb3B0aW9ucw0KLSAgcGFnaW5hdGlvbl90b3Audm0gICAgICAgLSBwYWdpbmcgYW5kIHN0YXRpY2lzIGF0IHRvcCBvZiByZXN1bHRzDQotICBwYWdpbmF0aW9uX2JvdHRvbS52bSAgICAtIHBhZ2luZyBhbmQgc3RhdGljaXMgYXQgYm90dG9tIG9mIHJlc3VsdHMNCi0gIHJlc3VsdHNfbGlzdC52bQ0KLSAgaGl0LnZtICAgICAgICAgICAgICAgICAgLSBjYWxsZWQgZm9yIGVhY2ggbWF0Y2hpbmcgZG9jLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpZGVzIHdoaWNoIHRlbXBsYXRlIHRvIHVzZQ0KLSAgaGl0X2dyb3VwZWQudm0gICAgICAgICAgLSBkaXNwbGF5IHJlc3VsdHMgZ3JvdXBlZCBieSBmaWVsZCB2YWx1ZXMNCi0gIHByb2R1Y3RfZG9jLnZtICAgICAgICAgIC0gZGlzcGxheSBhIFByb2R1Y3QNCi0gIGpvaW5fZG9jLnZtICAgICAgICAgICAgIC0gZGlzcGxheSBhIGpvaW5lZCBkb2N1bWVudA0KLSAgcmljaHRleHRfZG9jLnZtICAgICAgICAgLSBkaXNwbGF5IGEgY29tcGxleC9taXNjLiBkb2N1bWVudA0KLSAgaGl0X3BsYWluLnZtICAgICAgICAgICAgLSBiYXNpYyBkaXNwbGF5IG9mIGFsbCBmaWVsZHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXQgcmVzdWx0c19saXN0LnZtIHRvIGVuYWJsZSB0aGlzDQotDQotDQotU2VhcmNoIFJlc3VsdHMsIEZhY2V0cyAmIENsdXN0ZXJzOg0KLSAgZmFjZXRzLnZtICAgICAgICAgICAgICAgLSBjYWxscyB0aGUgNCBmYWNldCBhbmQgMSBjbHVzdGVyIHRlbXBsYXRlDQotICBmYWNldF9maWVsZHMudm0gICAgICAgICAtIGRpc3BsYXkgZmFjZXRzIGJhc2VkIG9uIGZpZWxkIHZhbHVlcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuOiBmaWVsZHMgc3BlY2lmaWVkIGJ5ICZmYWNldC5maWVsZD0NCi0gIGZhY2V0X3F1ZXJpZXMudm0gICAgICAgIC0gZGlzcGxheSBmYWNldHMgYmFzZWQgb24gc3BlY2lmaWMgZmFjZXQgcXVlcmllcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuOiBmYWNldHMgc3BlY2lmaWVkIGJ5ICZmYWNldC5xdWVyeT0NCi0gIGZhY2V0X3Jhbmdlcy52bSAgICAgICAgIC0gZGlzcGxheSBmYWNldHMgYmFzZWQgb24gcmFuZ2VzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy46IHJhbmdlcyBzcGVjaWZpZWQgYnkgJmZhY2V0LnJhbmdlPQ0KLSAgZmFjZXRfcGl2b3Qudm0gICAgICAgICAgLSBkaXNwbGF5IHBpdm90IGJhc2VkIGZhY2V0cw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuOiBmYWNldHMgc3BlY2lmaWVkIGJ5ICZmYWNldC5waXZvdD0NCi0gIGNsdXN0ZXIudm0gICAgICAgICAgICAgIC0gaWYgY2x1c3RlcmluZyBpcyBhdmFpbGFibGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBjYWxsIGNsdXN0ZXJfcmVzdWx0cy52bQ0KLSAgY2x1c3Rlcl9yZXN1bHRzLnZtICAgICAgLSBhY3R1YWwgcmVuZGVyaW5nIG9mIGNsdXN0ZXJzDQorSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KK1NvbHIgU2VhcmNoIFZlbG9jaXR5IFRlbXBsYXRlcworCitBIHF1aWNrIGRlbW8gb2YgdXNpbmcgU29sciB1c2luZyBodHRwOi8vd2lraS5hcGFjaGUub3JnL3NvbHIvVmVsb2NpdHlSZXNwb25zZVdyaXRlcgorCitZb3UgdHlwaWNhbGx5IGFjY2VzcyB0aGVzZSB0ZW1wbGF0ZXMgdmlhOgorCWh0dHA6Ly9sb2NhbGhvc3Q6ODk4My9zb2xyL2NvbGxlY3Rpb24xL2Jyb3dzZQorCitJdCdzIGNhbGxlZCAiYnJvd3NlIiBiZWNhdXNlIHlvdSBjYW4gY2xpY2sgYXJvdW5kIHdpdGggeW91ciBtb3VzZQord2l0aG91dCBuZWVkaW5nIHRvIHR5cGUgYW55IHNlYXJjaCB0ZXJtcy4gIEFuZCBvZiBjb3Vyc2UgaXQKK2Fsc28gd29ya3MgYXMgYSBzdGFuZGFyZCBzZWFyY2ggYXBwIGFzIHdlbGwuCisKK0tub3duIExpbWl0YXRpb25zCistLS0tLS0tLS0tLS0tLS0tLQorKiBUaGUgL2Jyb3dzZSBhbmQgdGhlIFZlbG9jaXR5UmVzcG9uc2VXcml0ZXIgY29tcG9uZW50CisgIHNlcnZlIGNvbnRlbnQgZGlyZWN0bHkgZnJvbSBTb2xyLCB3aGljaCB1c3VhbGx5IHJlcXVpcmVzCisgIFNvbHIncyBIVFRQIEFQSSB0byBiZSBleHBvc2VkLiAgQWR2YW5jZWQgdXNlcnMgY291bGQKKyAgcG90ZW50aWFsbHkgYWNjZXNzIG90aGVyIHBhcnRzIG9mIFNvbHIgZGlyZWN0bHkuCisqIFRoZXJlIGFyZSBzb21lIGhhcmQgY29kZWQgZmllbGRzIGluIHRoZXNlIHRlbXBsYXRlcy4KKyAgU2luY2UgdGhlc2UgdGVtcGxhdGVzIGxpdmUgdW5kZXIgY29uZiwgdGhleSBzaG91bGQgYmUKKyAgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBvdmVyYWxsIGNvbmZpZ3VyYXRpb24sIGFuZAorICBtdXN0IGJlIGNvb3JkaW5hdGVkIHdpdGggc2NoZW1hLnhtbCBhbmQgc29scmNvbmZpZy54bWwKKworVmVsb2NpdHkgSW5mbworLS0tLS0tLS0tLS0tLQorSmF2YS1iYXNlZCB0ZW1wbGF0ZSBsYW5ndWFnZS4KKworSXQncyBuaWNlIGluIHRoaXMgY29udGV4dCBiZWNhdXNlIGNoYW5nZSB0byB0aGUgdGVtcGxhdGVzCithcmUgaW1tZWRpYXRlbHkgdmlzaWJsZSBpbiBicm93c2VyIG9uIHRoZSBuZXh0IHZpc2l0LgorCitMaW5rczoKKwlodHRwOi8vdmVsb2NpdHkuYXBhY2hlLm9yZworCWh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvdmVsb2NpdHkvCisJaHR0cDovL3ZlbG9jaXR5LmFwYWNoZS5vcmcvZW5naW5lL3JlbGVhc2VzL3ZlbG9jaXR5LTEuNy91c2VyLWd1aWRlLmh0bWwKKworCitGaWxlIExpc3QKKy0tLS0tLS0tLQorCitTeXN0ZW0gYW5kIE1pc2M6CisgIFZNX2dsb2JhbF9saWJyYXJ5LnZtICAgIC0gTWFjcm9zIHVzZWQgb3RoZXIgdGVtcGxhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0IGZpbGVuYW1lIGlzIGltcG9ydGFudCBmb3IgVmVsb2NpdHkgdG8gc2VlIGl0CisgIGVycm9yLnZtICAgICAgICAgICAgICAgIC0gc2hvd3MgZXJyb3JzLCBpZiBhbnkKKyAgZGVidWcudm0gICAgICAgICAgICAgICAgLSBpbmNsdWRlcyB0b2dnbGUgbGlua3MgZm9yICJleHBsYWluIiBhbmQgImFsbCBmaWVsZHMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGVkIGJ5IGRlYnVnIGxpbmsgaW4gZm9vdGVyLnZtCisgIFJFQURNRS50eHQgICAgICAgICAgICAgIC0gdGhpcyBmaWxlCisKK092ZXJhbGwgUGFnZSBDb21wb3NpdGlvbjoKKyAgYnJvd3NlLnZtICAgICAgICAgICAgICAgLSBNYWluIGVudHJ5IHBvaW50IGludG8gdGVtcGxhdGVzCisgIGxheW91dC52bSAgICAgICAgICAgICAgIC0gb3ZlcmFsbCBIVE1MIHBhZ2UgbGF5b3V0CisgIGhlYWQudm0gICAgICAgICAgICAgICAgIC0gZWxlbWVudHMgaW4gdGhlIDxoZWFkPiBzZWN0aW9uIG9mIHRoZSBIVE1MIGRvY3VtZW50CisgIGhlYWRlci52bSAgICAgICAgICAgICAgIC0gdG9wIHNlY3Rpb24gb2YgcGFnZSB2aXNpYmxlIHRvIHVzZXJzCisgIGZvb3Rlci52bSAgICAgICAgICAgICAgIC0gYm90dG9tIHNlY3Rpb24gb2YgcGFnZSB2aXNpYmxlIHRvIHVzZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIGRlYnVnIGFuZCBoZWxwIGxpbmtzCisgIG1haW4uY3NzICAgICAgICAgICAgICAgIC0gQ1NTIHN0eWxlIGZvciBvdmVyYWxsIHBhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlIGFsc28ganF1ZXJ5LmF1dG9jb21wbGV0ZS5jc3MKKworUXVlcnkgRm9ybSBhbmQgT3B0aW9uczoKKyAgcXVlcnlfZm9ybS52bSAgICAgICAgICAgLSByZW5kZXJzIHF1ZXJ5IGZvcm0KKyAgcXVlcnlfZ3JvdXAudm0gICAgICAgICAgLSBncm91cCBieSBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuOiBNYW51ZmFjdHVyZXIgb3IgUG9wbHVsYXJpdHkKKyAgcXVlcnlfc3BhdGlhbC52bSAgICAgICAgLSBzZWxlY3QgYm94IGZvciBsb2NhdGlvbiBiYXNlZCBHZW9zcGFjaWFsIHNlYXJjaAorCitTcGVsbGluZyBTdWdnZXN0aW9uczoKKyAgZGlkX3lvdV9tZWFuLnZtICAgICAgICAgLSBoeXBlcmxpbmtlZCBzcGVsbGluZyBzdWdnZXN0aW9ucyBpbiByZXN1bHRzCisgIHN1Z2dlc3Qudm0gICAgICAgICAgICAgIC0gZHluYW1pYyBzcGVsbGluZyBzdWdnZXN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHlvdSB0eXBlIGluIHRoZSBzZWFyY2ggZm9ybQorICBqcXVlcnkuYXV0b2NvbXBsZXRlLmpzICAtIHN1cHBvcnRpbmcgZmlsZXMgZm9yIGR5bmFtaWMgc3VnZ2VzdGlvbnMKKyAganF1ZXJ5LmF1dG9jb21wbGV0ZS5jc3MgLSBNb3N0IENTUyBpcyBkZWZpbmVkIGluIG1haW4uY3NzCisKKworU2VhcmNoIFJlc3VsdHMsIEdlbmVyYWw6CisgIChzZWUgYWxzbyBicm93c2Uudm0pCisgIHRhYnMudm0gICAgICAgICAgICAgICAgIC0gcHJvdmlkZXMgbmF2aWdhdGlvbiB0byBhZHZhbmNlZCBzZWFyY2ggb3B0aW9ucworICBwYWdpbmF0aW9uX3RvcC52bSAgICAgICAtIHBhZ2luZyBhbmQgc3RhdGljaXMgYXQgdG9wIG9mIHJlc3VsdHMKKyAgcGFnaW5hdGlvbl9ib3R0b20udm0gICAgLSBwYWdpbmcgYW5kIHN0YXRpY2lzIGF0IGJvdHRvbSBvZiByZXN1bHRzCisgIHJlc3VsdHNfbGlzdC52bQorICBoaXQudm0gICAgICAgICAgICAgICAgICAtIGNhbGxlZCBmb3IgZWFjaCBtYXRjaGluZyBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaWRlcyB3aGljaCB0ZW1wbGF0ZSB0byB1c2UKKyAgaGl0X2dyb3VwZWQudm0gICAgICAgICAgLSBkaXNwbGF5IHJlc3VsdHMgZ3JvdXBlZCBieSBmaWVsZCB2YWx1ZXMKKyAgcHJvZHVjdF9kb2Mudm0gICAgICAgICAgLSBkaXNwbGF5IGEgUHJvZHVjdAorICBqb2luX2RvYy52bSAgICAgICAgICAgICAtIGRpc3BsYXkgYSBqb2luZWQgZG9jdW1lbnQKKyAgcmljaHRleHRfZG9jLnZtICAgICAgICAgLSBkaXNwbGF5IGEgY29tcGxleC9taXNjLiBkb2N1bWVudAorICBoaXRfcGxhaW4udm0gICAgICAgICAgICAtIGJhc2ljIGRpc3BsYXkgb2YgYWxsIGZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0IHJlc3VsdHNfbGlzdC52bSB0byBlbmFibGUgdGhpcworCisKK1NlYXJjaCBSZXN1bHRzLCBGYWNldHMgJiBDbHVzdGVyczoKKyAgZmFjZXRzLnZtICAgICAgICAgICAgICAgLSBjYWxscyB0aGUgNCBmYWNldCBhbmQgMSBjbHVzdGVyIHRlbXBsYXRlCisgIGZhY2V0X2ZpZWxkcy52bSAgICAgICAgIC0gZGlzcGxheSBmYWNldHMgYmFzZWQgb24gZmllbGQgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLjogZmllbGRzIHNwZWNpZmllZCBieSAmZmFjZXQuZmllbGQ9CisgIGZhY2V0X3F1ZXJpZXMudm0gICAgICAgIC0gZGlzcGxheSBmYWNldHMgYmFzZWQgb24gc3BlY2lmaWMgZmFjZXQgcXVlcmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy46IGZhY2V0cyBzcGVjaWZpZWQgYnkgJmZhY2V0LnF1ZXJ5PQorICBmYWNldF9yYW5nZXMudm0gICAgICAgICAtIGRpc3BsYXkgZmFjZXRzIGJhc2VkIG9uIHJhbmdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy46IHJhbmdlcyBzcGVjaWZpZWQgYnkgJmZhY2V0LnJhbmdlPQorICBmYWNldF9waXZvdC52bSAgICAgICAgICAtIGRpc3BsYXkgcGl2b3QgYmFzZWQgZmFjZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLjogZmFjZXRzIHNwZWNpZmllZCBieSAmZmFjZXQucGl2b3Q9CisgIGNsdXN0ZXIudm0gICAgICAgICAgICAgIC0gaWYgY2x1c3RlcmluZyBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGNhbGwgY2x1c3Rlcl9yZXN1bHRzLnZtCisgIGNsdXN0ZXJfcmVzdWx0cy52bSAgICAgIC0gYWN0dWFsIHJlbmRlcmluZyBvZiBjbHVzdGVycwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi92ZWxvY2l0eS9qcXVlcnkuYXV0b2NvbXBsZXRlLmNzcyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvdmVsb2NpdHkvanF1ZXJ5LmF1dG9jb21wbGV0ZS5jc3MKaW5kZXggNzBmY2IzZi4uOTFiNjIyOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi92ZWxvY2l0eS9qcXVlcnkuYXV0b2NvbXBsZXRlLmNzcworKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3ZlbG9jaXR5L2pxdWVyeS5hdXRvY29tcGxldGUuY3NzCkBAIC0xLDQ4ICsxLDQ4IEBACi0uYWNfcmVzdWx0cyB7DQotCXBhZGRpbmc6IDBweDsNCi0JYm9yZGVyOiAxcHggc29saWQgYmxhY2s7DQotCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOw0KLQlvdmVyZmxvdzogaGlkZGVuOw0KLQl6LWluZGV4OiA5OTk5OTsNCi19DQotDQotLmFjX3Jlc3VsdHMgdWwgew0KLQl3aWR0aDogMTAwJTsNCi0JbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTsNCi0JbGlzdC1zdHlsZTogbm9uZTsNCi0JcGFkZGluZzogMDsNCi0JbWFyZ2luOiAwOw0KLX0NCi0NCi0uYWNfcmVzdWx0cyBsaSB7DQotCW1hcmdpbjogMHB4Ow0KLQlwYWRkaW5nOiAycHggNXB4Ow0KLQljdXJzb3I6IGRlZmF1bHQ7DQotCWRpc3BsYXk6IGJsb2NrOw0KLQkvKiANCi0JaWYgd2lkdGggd2lsbCBiZSAxMDAlIGhvcml6b250YWwgc2Nyb2xsYmFyIHdpbGwgYXBlYXIgDQotCXdoZW4gc2Nyb2xsIG1vZGUgd2lsbCBiZSB1c2VkDQotCSovDQotCS8qd2lkdGg6IDEwMCU7Ki8NCi0JZm9udDogbWVudTsNCi0JZm9udC1zaXplOiAxMnB4Ow0KLQkvKiANCi0JaXQgaXMgdmVyeSBpbXBvcnRhbnQsIGlmIGxpbmUtaGVpZ2h0IG5vdCBzZXR0ZWQgb3Igc2V0dGVkIA0KLQlpbiByZWxhdGl2ZSB1bml0cyBzY3JvbGwgd2lsbCBiZSBicm9rZW4gaW4gZmlyZWZveA0KLQkqLw0KLQlsaW5lLWhlaWdodDogMTZweDsNCi0Jb3ZlcmZsb3c6IGhpZGRlbjsNCi19DQotDQotLmFjX2xvYWRpbmcgew0KLQliYWNrZ3JvdW5kOiB3aGl0ZSB1cmwoJ2luZGljYXRvci5naWYnKSByaWdodCBjZW50ZXIgbm8tcmVwZWF0Ow0KLX0NCi0NCi0uYWNfb2RkIHsNCi0JYmFja2dyb3VuZC1jb2xvcjogI2VlZTsNCi19DQotDQotLmFjX292ZXIgew0KLQliYWNrZ3JvdW5kLWNvbG9yOiAjMEEyNDZBOw0KLQljb2xvcjogd2hpdGU7DQotfQ0KKy5hY19yZXN1bHRzIHsKKwlwYWRkaW5nOiAwcHg7CisJYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CisJYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisJb3ZlcmZsb3c6IGhpZGRlbjsKKwl6LWluZGV4OiA5OTk5OTsKK30KKworLmFjX3Jlc3VsdHMgdWwgeworCXdpZHRoOiAxMDAlOworCWxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7CisJbGlzdC1zdHlsZTogbm9uZTsKKwlwYWRkaW5nOiAwOworCW1hcmdpbjogMDsKK30KKworLmFjX3Jlc3VsdHMgbGkgeworCW1hcmdpbjogMHB4OworCXBhZGRpbmc6IDJweCA1cHg7CisJY3Vyc29yOiBkZWZhdWx0OworCWRpc3BsYXk6IGJsb2NrOworCS8qIAorCWlmIHdpZHRoIHdpbGwgYmUgMTAwJSBob3Jpem9udGFsIHNjcm9sbGJhciB3aWxsIGFwZWFyIAorCXdoZW4gc2Nyb2xsIG1vZGUgd2lsbCBiZSB1c2VkCisJKi8KKwkvKndpZHRoOiAxMDAlOyovCisJZm9udDogbWVudTsKKwlmb250LXNpemU6IDEycHg7CisJLyogCisJaXQgaXMgdmVyeSBpbXBvcnRhbnQsIGlmIGxpbmUtaGVpZ2h0IG5vdCBzZXR0ZWQgb3Igc2V0dGVkIAorCWluIHJlbGF0aXZlIHVuaXRzIHNjcm9sbCB3aWxsIGJlIGJyb2tlbiBpbiBmaXJlZm94CisJKi8KKwlsaW5lLWhlaWdodDogMTZweDsKKwlvdmVyZmxvdzogaGlkZGVuOworfQorCisuYWNfbG9hZGluZyB7CisJYmFja2dyb3VuZDogd2hpdGUgdXJsKCdpbmRpY2F0b3IuZ2lmJykgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsKK30KKworLmFjX29kZCB7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKK30KKworLmFjX292ZXIgeworCWJhY2tncm91bmQtY29sb3I6ICMwQTI0NkE7CisJY29sb3I6IHdoaXRlOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi92ZWxvY2l0eS9qcXVlcnkuYXV0b2NvbXBsZXRlLmpzIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi92ZWxvY2l0eS9qcXVlcnkuYXV0b2NvbXBsZXRlLmpzCmluZGV4IGVkMjg5OWEuLmJiMTFlOTQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvdmVsb2NpdHkvanF1ZXJ5LmF1dG9jb21wbGV0ZS5qcworKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3ZlbG9jaXR5L2pxdWVyeS5hdXRvY29tcGxldGUuanMKQEAgLTEsNzYzICsxLDc2MyBAQAotLyoNCi0gKiBBdXRvY29tcGxldGUgLSBqUXVlcnkgcGx1Z2luIDEuMXByZQ0KLSAqDQotICogQ29weXJpZ2h0IChjKSAyMDA3IER5bGFuIFZlcmhldWwsIERhbiBHLiBTd2l0emVyLCBBbmplc2ggVHVsYWRoYXIsIErDtnJuIFphZWZmZXJlcg0KLSAqDQotICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6DQotICogICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocA0KLSAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sDQotICoNCi0gKiBSZXZpc2lvbjogSWQ6IGpxdWVyeS5hdXRvY29tcGxldGUuanMgNTc4NSAyMDA4LTA3LTEyIDEwOjM3OjMzWiBqb2Vybi56YWVmZmVyZXIgJA0KLSAqDQotICovDQotDQotOyhmdW5jdGlvbigkKSB7DQotCQ0KLSQuZm4uZXh0ZW5kKHsNCi0JYXV0b2NvbXBsZXRlOiBmdW5jdGlvbih1cmxPckRhdGEsIG9wdGlvbnMpIHsNCi0JCXZhciBpc1VybCA9IHR5cGVvZiB1cmxPckRhdGEgPT0gInN0cmluZyI7DQotCQlvcHRpb25zID0gJC5leHRlbmQoe30sICQuQXV0b2NvbXBsZXRlci5kZWZhdWx0cywgew0KLQkJCXVybDogaXNVcmwgPyB1cmxPckRhdGEgOiBudWxsLA0KLQkJCWRhdGE6IGlzVXJsID8gbnVsbCA6IHVybE9yRGF0YSwNCi0JCQlkZWxheTogaXNVcmwgPyAkLkF1dG9jb21wbGV0ZXIuZGVmYXVsdHMuZGVsYXkgOiAxMCwNCi0JCQltYXg6IG9wdGlvbnMgJiYgIW9wdGlvbnMuc2Nyb2xsID8gMTAgOiAxNTANCi0JCX0sIG9wdGlvbnMpOw0KLQkJDQotCQkvLyBpZiBoaWdobGlnaHQgaXMgc2V0IHRvIGZhbHNlLCByZXBsYWNlIGl0IHdpdGggYSBkby1ub3RoaW5nIGZ1bmN0aW9uDQotCQlvcHRpb25zLmhpZ2hsaWdodCA9IG9wdGlvbnMuaGlnaGxpZ2h0IHx8IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTsNCi0JCQ0KLQkJLy8gaWYgdGhlIGZvcm1hdE1hdGNoIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHVzZSBmb3JtYXRJdGVtIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQ0KLQkJb3B0aW9ucy5mb3JtYXRNYXRjaCA9IG9wdGlvbnMuZm9ybWF0TWF0Y2ggfHwgb3B0aW9ucy5mb3JtYXRJdGVtOw0KLQkJDQotCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgew0KLQkJCW5ldyAkLkF1dG9jb21wbGV0ZXIodGhpcywgb3B0aW9ucyk7DQotCQl9KTsNCi0JfSwNCi0JcmVzdWx0OiBmdW5jdGlvbihoYW5kbGVyKSB7DQotCQlyZXR1cm4gdGhpcy5iaW5kKCJyZXN1bHQiLCBoYW5kbGVyKTsNCi0JfSwNCi0Jc2VhcmNoOiBmdW5jdGlvbihoYW5kbGVyKSB7DQotCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZWFyY2giLCBbaGFuZGxlcl0pOw0KLQl9LA0KLQlmbHVzaENhY2hlOiBmdW5jdGlvbigpIHsNCi0JCXJldHVybiB0aGlzLnRyaWdnZXIoImZsdXNoQ2FjaGUiKTsNCi0JfSwNCi0Jc2V0T3B0aW9uczogZnVuY3Rpb24ob3B0aW9ucyl7DQotCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXRPcHRpb25zIiwgW29wdGlvbnNdKTsNCi0JfSwNCi0JdW5hdXRvY29tcGxldGU6IGZ1bmN0aW9uKCkgew0KLQkJcmV0dXJuIHRoaXMudHJpZ2dlcigidW5hdXRvY29tcGxldGUiKTsNCi0JfQ0KLX0pOw0KLQ0KLSQuQXV0b2NvbXBsZXRlciA9IGZ1bmN0aW9uKGlucHV0LCBvcHRpb25zKSB7DQotDQotCXZhciBLRVkgPSB7DQotCQlVUDogMzgsDQotCQlET1dOOiA0MCwNCi0JCURFTDogNDYsDQotCQlUQUI6IDksDQotCQlSRVRVUk46IDEzLA0KLQkJRVNDOiAyNywNCi0JCUNPTU1BOiAxODgsDQotCQlQQUdFVVA6IDMzLA0KLQkJUEFHRURPV046IDM0LA0KLQkJQkFDS1NQQUNFOiA4DQotCX07DQotDQotCS8vIENyZWF0ZSAkIG9iamVjdCBmb3IgaW5wdXQgZWxlbWVudA0KLQl2YXIgJGlucHV0ID0gJChpbnB1dCkuYXR0cigiYXV0b2NvbXBsZXRlIiwgIm9mZiIpLmFkZENsYXNzKG9wdGlvbnMuaW5wdXRDbGFzcyk7DQotDQotCXZhciB0aW1lb3V0Ow0KLQl2YXIgcHJldmlvdXNWYWx1ZSA9ICIiOw0KLQl2YXIgY2FjaGUgPSAkLkF1dG9jb21wbGV0ZXIuQ2FjaGUob3B0aW9ucyk7DQotCXZhciBoYXNGb2N1cyA9IDA7DQotCXZhciBsYXN0S2V5UHJlc3NDb2RlOw0KLQl2YXIgY29uZmlnID0gew0KLQkJbW91c2VEb3duT25TZWxlY3Q6IGZhbHNlDQotCX07DQotCXZhciBzZWxlY3QgPSAkLkF1dG9jb21wbGV0ZXIuU2VsZWN0KG9wdGlvbnMsIGlucHV0LCBzZWxlY3RDdXJyZW50LCBjb25maWcpOw0KLQkNCi0JdmFyIGJsb2NrU3VibWl0Ow0KLQkNCi0JLy8gcHJldmVudCBmb3JtIHN1Ym1pdCBpbiBvcGVyYSB3aGVuIHNlbGVjdGluZyB3aXRoIHJldHVybiBrZXkNCi0JJC5icm93c2VyLm9wZXJhICYmICQoaW5wdXQuZm9ybSkuYmluZCgic3VibWl0LmF1dG9jb21wbGV0ZSIsIGZ1bmN0aW9uKCkgew0KLQkJaWYgKGJsb2NrU3VibWl0KSB7DQotCQkJYmxvY2tTdWJtaXQgPSBmYWxzZTsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCX0pOw0KLQkNCi0JLy8gb25seSBvcGVyYSBkb2Vzbid0IHRyaWdnZXIga2V5ZG93biBtdWx0aXBsZSB0aW1lcyB3aGlsZSBwcmVzc2VkLCBvdGhlcnMgZG9uJ3Qgd29yayB3aXRoIGtleXByZXNzIGF0IGFsbA0KLQkkaW5wdXQuYmluZCgoJC5icm93c2VyLm9wZXJhID8gImtleXByZXNzIiA6ICJrZXlkb3duIikgKyAiLmF1dG9jb21wbGV0ZSIsIGZ1bmN0aW9uKGV2ZW50KSB7DQotCQkvLyB0cmFjayBsYXN0IGtleSBwcmVzc2VkDQotCQlsYXN0S2V5UHJlc3NDb2RlID0gZXZlbnQua2V5Q29kZTsNCi0JCXN3aXRjaChldmVudC5rZXlDb2RlKSB7DQotCQkNCi0JCQljYXNlIEtFWS5VUDoNCi0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsNCi0JCQkJaWYgKCBzZWxlY3QudmlzaWJsZSgpICkgew0KLQkJCQkJc2VsZWN0LnByZXYoKTsNCi0JCQkJfSBlbHNlIHsNCi0JCQkJCW9uQ2hhbmdlKDAsIHRydWUpOw0KLQkJCQl9DQotCQkJCWJyZWFrOw0KLQkJCQkNCi0JCQljYXNlIEtFWS5ET1dOOg0KLQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkJCQlpZiAoIHNlbGVjdC52aXNpYmxlKCkgKSB7DQotCQkJCQlzZWxlY3QubmV4dCgpOw0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJb25DaGFuZ2UoMCwgdHJ1ZSk7DQotCQkJCX0NCi0JCQkJYnJlYWs7DQotCQkJCQ0KLQkJCWNhc2UgS0VZLlBBR0VVUDoNCi0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsNCi0JCQkJaWYgKCBzZWxlY3QudmlzaWJsZSgpICkgew0KLQkJCQkJc2VsZWN0LnBhZ2VVcCgpOw0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJb25DaGFuZ2UoMCwgdHJ1ZSk7DQotCQkJCX0NCi0JCQkJYnJlYWs7DQotCQkJCQ0KLQkJCWNhc2UgS0VZLlBBR0VET1dOOg0KLQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KLQkJCQlpZiAoIHNlbGVjdC52aXNpYmxlKCkgKSB7DQotCQkJCQlzZWxlY3QucGFnZURvd24oKTsNCi0JCQkJfSBlbHNlIHsNCi0JCQkJCW9uQ2hhbmdlKDAsIHRydWUpOw0KLQkJCQl9DQotCQkJCWJyZWFrOw0KLQkJCQ0KLQkJCS8vIG1hdGNoZXMgYWxzbyBzZW1pY29sb24NCi0JCQljYXNlIG9wdGlvbnMubXVsdGlwbGUgJiYgJC50cmltKG9wdGlvbnMubXVsdGlwbGVTZXBhcmF0b3IpID09ICIsIiAmJiBLRVkuQ09NTUE6DQotCQkJY2FzZSBLRVkuVEFCOg0KLQkJCWNhc2UgS0VZLlJFVFVSTjoNCi0JCQkJaWYoIHNlbGVjdEN1cnJlbnQoKSApIHsNCi0JCQkJCS8vIHN0b3AgZGVmYXVsdCB0byBwcmV2ZW50IGEgZm9ybSBzdWJtaXQsIE9wZXJhIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcNCi0JCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQotCQkJCQlibG9ja1N1Ym1pdCA9IHRydWU7DQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCX0NCi0JCQkJYnJlYWs7DQotCQkJCQ0KLQkJCWNhc2UgS0VZLkVTQzoNCi0JCQkJc2VsZWN0LmhpZGUoKTsNCi0JCQkJYnJlYWs7DQotCQkJCQ0KLQkJCWRlZmF1bHQ6DQotCQkJCWNsZWFyVGltZW91dCh0aW1lb3V0KTsNCi0JCQkJdGltZW91dCA9IHNldFRpbWVvdXQob25DaGFuZ2UsIG9wdGlvbnMuZGVsYXkpOw0KLQkJCQlicmVhazsNCi0JCX0NCi0JfSkuZm9jdXMoZnVuY3Rpb24oKXsNCi0JCS8vIHRyYWNrIHdoZXRoZXIgdGhlIGZpZWxkIGhhcyBmb2N1cywgd2Ugc2hvdWxkbid0IHByb2Nlc3MgYW55DQotCQkvLyByZXN1bHRzIGlmIHRoZSBmaWVsZCBubyBsb25nZXIgaGFzIGZvY3VzDQotCQloYXNGb2N1cysrOw0KLQl9KS5ibHVyKGZ1bmN0aW9uKCkgew0KLQkJaGFzRm9jdXMgPSAwOw0KLQkJaWYgKCFjb25maWcubW91c2VEb3duT25TZWxlY3QpIHsNCi0JCQloaWRlUmVzdWx0cygpOw0KLQkJfQ0KLQl9KS5jbGljayhmdW5jdGlvbigpIHsNCi0JCS8vIHNob3cgc2VsZWN0IHdoZW4gY2xpY2tpbmcgaW4gYSBmb2N1c2VkIGZpZWxkDQotCQlpZiAoIGhhc0ZvY3VzKysgPiAxICYmICFzZWxlY3QudmlzaWJsZSgpICkgew0KLQkJCW9uQ2hhbmdlKDAsIHRydWUpOw0KLQkJfQ0KLQl9KS5iaW5kKCJzZWFyY2giLCBmdW5jdGlvbigpIHsNCi0JCS8vIFRPRE8gd2h5IG5vdCBqdXN0IHNwZWNpZnlpbmcgYm90aCBhcmd1bWVudHM/DQotCQl2YXIgZm4gPSAoYXJndW1lbnRzLmxlbmd0aCA+IDEpID8gYXJndW1lbnRzWzFdIDogbnVsbDsNCi0JCWZ1bmN0aW9uIGZpbmRWYWx1ZUNhbGxiYWNrKHEsIGRhdGEpIHsNCi0JCQl2YXIgcmVzdWx0Ow0KLQkJCWlmKCBkYXRhICYmIGRhdGEubGVuZ3RoICkgew0KLQkJCQlmb3IgKHZhciBpPTA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7DQotCQkJCQlpZiggZGF0YVtpXS5yZXN1bHQudG9Mb3dlckNhc2UoKSA9PSBxLnRvTG93ZXJDYXNlKCkgKSB7DQotCQkJCQkJcmVzdWx0ID0gZGF0YVtpXTsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQlpZiggdHlwZW9mIGZuID09ICJmdW5jdGlvbiIgKSBmbihyZXN1bHQpOw0KLQkJCWVsc2UgJGlucHV0LnRyaWdnZXIoInJlc3VsdCIsIHJlc3VsdCAmJiBbcmVzdWx0LmRhdGEsIHJlc3VsdC52YWx1ZV0pOw0KLQkJfQ0KLQkJJC5lYWNoKHRyaW1Xb3JkcygkaW5wdXQudmFsKCkpLCBmdW5jdGlvbihpLCB2YWx1ZSkgew0KLQkJCXJlcXVlc3QodmFsdWUsIGZpbmRWYWx1ZUNhbGxiYWNrLCBmaW5kVmFsdWVDYWxsYmFjayk7DQotCQl9KTsNCi0JfSkuYmluZCgiZmx1c2hDYWNoZSIsIGZ1bmN0aW9uKCkgew0KLQkJY2FjaGUuZmx1c2goKTsNCi0JfSkuYmluZCgic2V0T3B0aW9ucyIsIGZ1bmN0aW9uKCkgew0KLQkJJC5leHRlbmQob3B0aW9ucywgYXJndW1lbnRzWzFdKTsNCi0JCS8vIGlmIHdlJ3ZlIHVwZGF0ZWQgdGhlIGRhdGEsIHJlcG9wdWxhdGUNCi0JCWlmICggImRhdGEiIGluIGFyZ3VtZW50c1sxXSApDQotCQkJY2FjaGUucG9wdWxhdGUoKTsNCi0JfSkuYmluZCgidW5hdXRvY29tcGxldGUiLCBmdW5jdGlvbigpIHsNCi0JCXNlbGVjdC51bmJpbmQoKTsNCi0JCSRpbnB1dC51bmJpbmQoKTsNCi0JCSQoaW5wdXQuZm9ybSkudW5iaW5kKCIuYXV0b2NvbXBsZXRlIik7DQotCX0pOw0KLQkNCi0JDQotCWZ1bmN0aW9uIHNlbGVjdEN1cnJlbnQoKSB7DQotCQl2YXIgc2VsZWN0ZWQgPSBzZWxlY3Quc2VsZWN0ZWQoKTsNCi0JCWlmKCAhc2VsZWN0ZWQgKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCQ0KLQkJdmFyIHYgPSBzZWxlY3RlZC5yZXN1bHQ7DQotCQlwcmV2aW91c1ZhbHVlID0gdjsNCi0JCQ0KLQkJaWYgKCBvcHRpb25zLm11bHRpcGxlICkgew0KLQkJCXZhciB3b3JkcyA9IHRyaW1Xb3JkcygkaW5wdXQudmFsKCkpOw0KLQkJCWlmICggd29yZHMubGVuZ3RoID4gMSApIHsNCi0JCQkJdiA9IHdvcmRzLnNsaWNlKDAsIHdvcmRzLmxlbmd0aCAtIDEpLmpvaW4oIG9wdGlvbnMubXVsdGlwbGVTZXBhcmF0b3IgKSArIG9wdGlvbnMubXVsdGlwbGVTZXBhcmF0b3IgKyB2Ow0KLQkJCX0NCi0JCQl2ICs9IG9wdGlvbnMubXVsdGlwbGVTZXBhcmF0b3I7DQotCQl9DQotCQkNCi0JCSRpbnB1dC52YWwodik7DQotCQloaWRlUmVzdWx0c05vdygpOw0KLQkJJGlucHV0LnRyaWdnZXIoInJlc3VsdCIsIFtzZWxlY3RlZC5kYXRhLCBzZWxlY3RlZC52YWx1ZV0pOw0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCWZ1bmN0aW9uIG9uQ2hhbmdlKGNyYXAsIHNraXBQcmV2Q2hlY2spIHsNCi0JCWlmKCBsYXN0S2V5UHJlc3NDb2RlID09IEtFWS5ERUwgKSB7DQotCQkJc2VsZWN0LmhpZGUoKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCXZhciBjdXJyZW50VmFsdWUgPSAkaW5wdXQudmFsKCk7DQotCQkNCi0JCWlmICggIXNraXBQcmV2Q2hlY2sgJiYgY3VycmVudFZhbHVlID09IHByZXZpb3VzVmFsdWUgKQ0KLQkJCXJldHVybjsNCi0JCQ0KLQkJcHJldmlvdXNWYWx1ZSA9IGN1cnJlbnRWYWx1ZTsNCi0JCQ0KLQkJY3VycmVudFZhbHVlID0gbGFzdFdvcmQoY3VycmVudFZhbHVlKTsNCi0JCWlmICggY3VycmVudFZhbHVlLmxlbmd0aCA+PSBvcHRpb25zLm1pbkNoYXJzKSB7DQotCQkJJGlucHV0LmFkZENsYXNzKG9wdGlvbnMubG9hZGluZ0NsYXNzKTsNCi0JCQlpZiAoIW9wdGlvbnMubWF0Y2hDYXNlKQ0KLQkJCQljdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUudG9Mb3dlckNhc2UoKTsNCi0JCQlyZXF1ZXN0KGN1cnJlbnRWYWx1ZSwgcmVjZWl2ZURhdGEsIGhpZGVSZXN1bHRzTm93KTsNCi0JCX0gZWxzZSB7DQotCQkJc3RvcExvYWRpbmcoKTsNCi0JCQlzZWxlY3QuaGlkZSgpOw0KLQkJfQ0KLQl9Ow0KLQkNCi0JZnVuY3Rpb24gdHJpbVdvcmRzKHZhbHVlKSB7DQotCQlpZiAoICF2YWx1ZSApIHsNCi0JCQlyZXR1cm4gWyIiXTsNCi0JCX0NCi0JCXZhciB3b3JkcyA9IHZhbHVlLnNwbGl0KCBvcHRpb25zLm11bHRpcGxlU2VwYXJhdG9yICk7DQotCQl2YXIgcmVzdWx0ID0gW107DQotCQkkLmVhY2god29yZHMsIGZ1bmN0aW9uKGksIHZhbHVlKSB7DQotCQkJaWYgKCAkLnRyaW0odmFsdWUpICkNCi0JCQkJcmVzdWx0W2ldID0gJC50cmltKHZhbHVlKTsNCi0JCX0pOw0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQkNCi0JZnVuY3Rpb24gbGFzdFdvcmQodmFsdWUpIHsNCi0JCWlmICggIW9wdGlvbnMubXVsdGlwbGUgKQ0KLQkJCXJldHVybiB2YWx1ZTsNCi0JCXZhciB3b3JkcyA9IHRyaW1Xb3Jkcyh2YWx1ZSk7DQotCQlyZXR1cm4gd29yZHNbd29yZHMubGVuZ3RoIC0gMV07DQotCX0NCi0JDQotCS8vIGZpbGxzIGluIHRoZSBpbnB1dCBib3ggdy90aGUgZmlyc3QgbWF0Y2ggKGFzc3VtZWQgdG8gYmUgdGhlIGJlc3QgbWF0Y2gpDQotCS8vIHE6IHRoZSB0ZXJtIGVudGVyZWQNCi0JLy8gc1ZhbHVlOiB0aGUgZmlyc3QgbWF0Y2hpbmcgcmVzdWx0DQotCWZ1bmN0aW9uIGF1dG9GaWxsKHEsIHNWYWx1ZSl7DQotCQkvLyBhdXRvZmlsbCBpbiB0aGUgY29tcGxldGUgYm94IHcvdGhlIGZpcnN0IG1hdGNoIGFzIGxvbmcgYXMgdGhlIHVzZXIgaGFzbid0IGVudGVyZWQgaW4gbW9yZSBkYXRhDQotCQkvLyBpZiB0aGUgbGFzdCB1c2VyIGtleSBwcmVzc2VkIHdhcyBiYWNrc3BhY2UsIGRvbid0IGF1dG9maWxsDQotCQlpZiggb3B0aW9ucy5hdXRvRmlsbCAmJiAobGFzdFdvcmQoJGlucHV0LnZhbCgpKS50b0xvd2VyQ2FzZSgpID09IHEudG9Mb3dlckNhc2UoKSkgJiYgbGFzdEtleVByZXNzQ29kZSAhPSBLRVkuQkFDS1NQQUNFICkgew0KLQkJCS8vIGZpbGwgaW4gdGhlIHZhbHVlIChrZWVwIHRoZSBjYXNlIHRoZSB1c2VyIGhhcyB0eXBlZCkNCi0JCQkkaW5wdXQudmFsKCRpbnB1dC52YWwoKSArIHNWYWx1ZS5zdWJzdHJpbmcobGFzdFdvcmQocHJldmlvdXNWYWx1ZSkubGVuZ3RoKSk7DQotCQkJLy8gc2VsZWN0IHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBub3QgdHlwZWQgYnkgdGhlIHVzZXIgKHNvIHRoZSBuZXh0IGNoYXJhY3RlciB3aWxsIGVyYXNlKQ0KLQkJCSQuQXV0b2NvbXBsZXRlci5TZWxlY3Rpb24oaW5wdXQsIHByZXZpb3VzVmFsdWUubGVuZ3RoLCBwcmV2aW91c1ZhbHVlLmxlbmd0aCArIHNWYWx1ZS5sZW5ndGgpOw0KLQkJfQ0KLQl9Ow0KLQ0KLQlmdW5jdGlvbiBoaWRlUmVzdWx0cygpIHsNCi0JCWNsZWFyVGltZW91dCh0aW1lb3V0KTsNCi0JCXRpbWVvdXQgPSBzZXRUaW1lb3V0KGhpZGVSZXN1bHRzTm93LCAyMDApOw0KLQl9Ow0KLQ0KLQlmdW5jdGlvbiBoaWRlUmVzdWx0c05vdygpIHsNCi0JCXZhciB3YXNWaXNpYmxlID0gc2VsZWN0LnZpc2libGUoKTsNCi0JCXNlbGVjdC5oaWRlKCk7DQotCQljbGVhclRpbWVvdXQodGltZW91dCk7DQotCQlzdG9wTG9hZGluZygpOw0KLQkJaWYgKG9wdGlvbnMubXVzdE1hdGNoKSB7DQotCQkJLy8gY2FsbCBzZWFyY2ggYW5kIHJ1biBjYWxsYmFjaw0KLQkJCSRpbnB1dC5zZWFyY2goDQotCQkJCWZ1bmN0aW9uIChyZXN1bHQpew0KLQkJCQkJLy8gaWYgbm8gdmFsdWUgZm91bmQsIGNsZWFyIHRoZSBpbnB1dCBib3gNCi0JCQkJCWlmKCAhcmVzdWx0ICkgew0KLQkJCQkJCWlmIChvcHRpb25zLm11bHRpcGxlKSB7DQotCQkJCQkJCXZhciB3b3JkcyA9IHRyaW1Xb3JkcygkaW5wdXQudmFsKCkpLnNsaWNlKDAsIC0xKTsNCi0JCQkJCQkJJGlucHV0LnZhbCggd29yZHMuam9pbihvcHRpb25zLm11bHRpcGxlU2VwYXJhdG9yKSArICh3b3Jkcy5sZW5ndGggPyBvcHRpb25zLm11bHRpcGxlU2VwYXJhdG9yIDogIiIpICk7DQotCQkJCQkJfQ0KLQkJCQkJCWVsc2UNCi0JCQkJCQkJJGlucHV0LnZhbCggIiIgKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCSk7DQotCQl9DQotCQlpZiAod2FzVmlzaWJsZSkNCi0JCQkvLyBwb3NpdGlvbiBjdXJzb3IgYXQgZW5kIG9mIGlucHV0IGZpZWxkDQotCQkJJC5BdXRvY29tcGxldGVyLlNlbGVjdGlvbihpbnB1dCwgaW5wdXQudmFsdWUubGVuZ3RoLCBpbnB1dC52YWx1ZS5sZW5ndGgpOw0KLQl9Ow0KLQ0KLQlmdW5jdGlvbiByZWNlaXZlRGF0YShxLCBkYXRhKSB7DQotCQlpZiAoIGRhdGEgJiYgZGF0YS5sZW5ndGggJiYgaGFzRm9jdXMgKSB7DQotCQkJc3RvcExvYWRpbmcoKTsNCi0JCQlzZWxlY3QuZGlzcGxheShkYXRhLCBxKTsNCi0JCQlhdXRvRmlsbChxLCBkYXRhWzBdLnZhbHVlKTsNCi0JCQlzZWxlY3Quc2hvdygpOw0KLQkJfSBlbHNlIHsNCi0JCQloaWRlUmVzdWx0c05vdygpOw0KLQkJfQ0KLQl9Ow0KLQ0KLQlmdW5jdGlvbiByZXF1ZXN0KHRlcm0sIHN1Y2Nlc3MsIGZhaWx1cmUpIHsNCi0JCWlmICghb3B0aW9ucy5tYXRjaENhc2UpDQotCQkJdGVybSA9IHRlcm0udG9Mb3dlckNhc2UoKTsNCi0JCXZhciBkYXRhID0gY2FjaGUubG9hZCh0ZXJtKTsNCi0JCWRhdGEgPSBudWxsOyAvLyBBdm9pZCBidWdneSBjYWNoZSBhbmQgZ28gdG8gU29sciBldmVyeSB0aW1lIA0KLQkJLy8gcmVjaWV2ZSB0aGUgY2FjaGVkIGRhdGENCi0JCWlmIChkYXRhICYmIGRhdGEubGVuZ3RoKSB7DQotCQkJc3VjY2Vzcyh0ZXJtLCBkYXRhKTsNCi0JCS8vIGlmIGFuIEFKQVggdXJsIGhhcyBiZWVuIHN1cHBsaWVkLCB0cnkgbG9hZGluZyB0aGUgZGF0YSBub3cNCi0JCX0gZWxzZSBpZiggKHR5cGVvZiBvcHRpb25zLnVybCA9PSAic3RyaW5nIikgJiYgKG9wdGlvbnMudXJsLmxlbmd0aCA+IDApICl7DQotCQkJDQotCQkJdmFyIGV4dHJhUGFyYW1zID0gew0KLQkJCQl0aW1lc3RhbXA6ICtuZXcgRGF0ZSgpDQotCQkJfTsNCi0JCQkkLmVhY2gob3B0aW9ucy5leHRyYVBhcmFtcywgZnVuY3Rpb24oa2V5LCBwYXJhbSkgew0KLQkJCQlleHRyYVBhcmFtc1trZXldID0gdHlwZW9mIHBhcmFtID09ICJmdW5jdGlvbiIgPyBwYXJhbSgpIDogcGFyYW07DQotCQkJfSk7DQotCQkJDQotCQkJJC5hamF4KHsNCi0JCQkJLy8gdHJ5IHRvIGxldmVyYWdlIGFqYXhRdWV1ZSBwbHVnaW4gdG8gYWJvcnQgcHJldmlvdXMgcmVxdWVzdHMNCi0JCQkJbW9kZTogImFib3J0IiwNCi0JCQkJLy8gbGltaXQgYWJvcnRpb24gdG8gdGhpcyBpbnB1dA0KLQkJCQlwb3J0OiAiYXV0b2NvbXBsZXRlIiArIGlucHV0Lm5hbWUsDQotCQkJCWRhdGFUeXBlOiBvcHRpb25zLmRhdGFUeXBlLA0KLQkJCQl1cmw6IG9wdGlvbnMudXJsLA0KLQkJCQlkYXRhOiAkLmV4dGVuZCh7DQotCQkJCQlxOiBsYXN0V29yZCh0ZXJtKSwNCi0JCQkJCWxpbWl0OiBvcHRpb25zLm1heA0KLQkJCQl9LCBleHRyYVBhcmFtcyksDQotCQkJCXN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsNCi0JCQkJCXZhciBwYXJzZWQgPSBvcHRpb25zLnBhcnNlICYmIG9wdGlvbnMucGFyc2UoZGF0YSkgfHwgcGFyc2UoZGF0YSk7DQotCQkJCQljYWNoZS5hZGQodGVybSwgcGFyc2VkKTsNCi0JCQkJCXN1Y2Nlc3ModGVybSwgcGFyc2VkKTsNCi0JCQkJfQ0KLQkJCX0pOw0KLQkJfSBlbHNlIHsNCi0JCQkvLyBpZiB3ZSBoYXZlIGEgZmFpbHVyZSwgd2UgbmVlZCB0byBlbXB0eSB0aGUgbGlzdCAtLSB0aGlzIHByZXZlbnRzIHRoZSB0aGUgW1RBQl0ga2V5IGZyb20gc2VsZWN0aW5nIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgbWF0Y2gNCi0JCQlzZWxlY3QuZW1wdHlMaXN0KCk7DQotCQkJZmFpbHVyZSh0ZXJtKTsNCi0JCX0NCi0JfTsNCi0JDQotCWZ1bmN0aW9uIHBhcnNlKGRhdGEpIHsNCi0JCXZhciBwYXJzZWQgPSBbXTsNCi0JCXZhciByb3dzID0gZGF0YS5zcGxpdCgiXG4iKTsNCi0JCWZvciAodmFyIGk9MDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsNCi0JCQl2YXIgcm93ID0gJC50cmltKHJvd3NbaV0pOw0KLQkJCWlmIChyb3cpIHsNCi0JCQkJcm93ID0gcm93LnNwbGl0KCJ8Iik7DQotCQkJCXBhcnNlZFtwYXJzZWQubGVuZ3RoXSA9IHsNCi0JCQkJCWRhdGE6IHJvdywNCi0JCQkJCXZhbHVlOiByb3dbMF0sDQotCQkJCQlyZXN1bHQ6IG9wdGlvbnMuZm9ybWF0UmVzdWx0ICYmIG9wdGlvbnMuZm9ybWF0UmVzdWx0KHJvdywgcm93WzBdKSB8fCByb3dbMF0NCi0JCQkJfTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gcGFyc2VkOw0KLQl9Ow0KLQ0KLQlmdW5jdGlvbiBzdG9wTG9hZGluZygpIHsNCi0JCSRpbnB1dC5yZW1vdmVDbGFzcyhvcHRpb25zLmxvYWRpbmdDbGFzcyk7DQotCX07DQotDQotfTsNCi0NCi0kLkF1dG9jb21wbGV0ZXIuZGVmYXVsdHMgPSB7DQotCWlucHV0Q2xhc3M6ICJhY19pbnB1dCIsDQotCXJlc3VsdHNDbGFzczogImFjX3Jlc3VsdHMiLA0KLQlsb2FkaW5nQ2xhc3M6ICJhY19sb2FkaW5nIiwNCi0JbWluQ2hhcnM6IDEsDQotCWRlbGF5OiA0MDAsDQotCW1hdGNoQ2FzZTogZmFsc2UsDQotCW1hdGNoU3Vic2V0OiB0cnVlLA0KLQltYXRjaENvbnRhaW5zOiBmYWxzZSwNCi0JY2FjaGVMZW5ndGg6IDEwLA0KLQltYXg6IDEwMCwNCi0JbXVzdE1hdGNoOiBmYWxzZSwNCi0JZXh0cmFQYXJhbXM6IHt9LA0KLQlzZWxlY3RGaXJzdDogZmFsc2UsDQotCWZvcm1hdEl0ZW06IGZ1bmN0aW9uKHJvdykgeyByZXR1cm4gcm93WzBdOyB9LA0KLQlmb3JtYXRNYXRjaDogbnVsbCwNCi0JYXV0b0ZpbGw6IGZhbHNlLA0KLQl3aWR0aDogMCwNCi0JbXVsdGlwbGU6IGZhbHNlLA0KLQltdWx0aXBsZVNlcGFyYXRvcjogIiwgIiwNCi0JaGlnaGxpZ2h0OiBmdW5jdGlvbih2YWx1ZSwgdGVybSkgew0KLQkJcmV0dXJuIHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cCgiKD8hW14mO10rOykoPyE8W148Pl0qKSgiICsgdGVybS5yZXBsYWNlKC8oW1xeXCRcKFwpXFtcXVx7XH1cKlwuXCtcP1x8XFxdKS9naSwgIlxcJDEiKSArICIpKD8hW148Pl0qPikoPyFbXiY7XSs7KSIsICJnaSIpLCAiPHN0cm9uZz4kMTwvc3Ryb25nPiIpOw0KLQl9LA0KLSAgICBzY3JvbGw6IHRydWUsDQotICAgIHNjcm9sbEhlaWdodDogMTgwDQotfTsNCi0NCi0kLkF1dG9jb21wbGV0ZXIuQ2FjaGUgPSBmdW5jdGlvbihvcHRpb25zKSB7DQotDQotCXZhciBkYXRhID0ge307DQotCXZhciBsZW5ndGggPSAwOw0KLQkNCi0JZnVuY3Rpb24gbWF0Y2hTdWJzZXQocywgc3ViKSB7DQotCQlpZiAoIW9wdGlvbnMubWF0Y2hDYXNlKSANCi0JCQlzID0gcy50b0xvd2VyQ2FzZSgpOw0KLQkJdmFyIGkgPSBzLmluZGV4T2Yoc3ViKTsNCi0JCWlmIChvcHRpb25zLm1hdGNoQ29udGFpbnMgPT0gIndvcmQiKXsNCi0JCQlpID0gcy50b0xvd2VyQ2FzZSgpLnNlYXJjaCgiXFxiIiArIHN1Yi50b0xvd2VyQ2FzZSgpKTsNCi0JCX0NCi0JCWlmIChpID09IC0xKSByZXR1cm4gZmFsc2U7DQotCQlyZXR1cm4gaSA9PSAwIHx8IG9wdGlvbnMubWF0Y2hDb250YWluczsNCi0JfTsNCi0JDQotCWZ1bmN0aW9uIGFkZChxLCB2YWx1ZSkgew0KLQkJaWYgKGxlbmd0aCA+IG9wdGlvbnMuY2FjaGVMZW5ndGgpew0KLQkJCWZsdXNoKCk7DQotCQl9DQotCQlpZiAoIWRhdGFbcV0peyANCi0JCQlsZW5ndGgrKzsNCi0JCX0NCi0JCWRhdGFbcV0gPSB2YWx1ZTsNCi0JfQ0KLQkNCi0JZnVuY3Rpb24gcG9wdWxhdGUoKXsNCi0JCWlmKCAhb3B0aW9ucy5kYXRhICkgcmV0dXJuIGZhbHNlOw0KLQkJLy8gdHJhY2sgdGhlIG1hdGNoZXMNCi0JCXZhciBzdE1hdGNoU2V0cyA9IHt9LA0KLQkJCW51bGxEYXRhID0gMDsNCi0NCi0JCS8vIG5vIHVybCB3YXMgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgY2FjaGUgbGVuZ3RoIHRvIG1ha2Ugc3VyZSBpdCBmaXRzIHRoZSBsb2NhbCBkYXRhIHN0b3JlDQotCQlpZiggIW9wdGlvbnMudXJsICkgb3B0aW9ucy5jYWNoZUxlbmd0aCA9IDE7DQotCQkNCi0JCS8vIHRyYWNrIGFsbCBvcHRpb25zIGZvciBtaW5DaGFycyA9IDANCi0JCXN0TWF0Y2hTZXRzWyIiXSA9IFtdOw0KLQkJDQotCQkvLyBsb29wIHRocm91Z2ggdGhlIGFycmF5IGFuZCBjcmVhdGUgYSBsb29rdXAgc3RydWN0dXJlDQotCQlmb3IgKCB2YXIgaSA9IDAsIG9sID0gb3B0aW9ucy5kYXRhLmxlbmd0aDsgaSA8IG9sOyBpKysgKSB7DQotCQkJdmFyIHJhd1ZhbHVlID0gb3B0aW9ucy5kYXRhW2ldOw0KLQkJCS8vIGlmIHJhd1ZhbHVlIGlzIGEgc3RyaW5nLCBtYWtlIGFuIGFycmF5IG90aGVyd2lzZSBqdXN0IHJlZmVyZW5jZSB0aGUgYXJyYXkNCi0JCQlyYXdWYWx1ZSA9ICh0eXBlb2YgcmF3VmFsdWUgPT0gInN0cmluZyIpID8gW3Jhd1ZhbHVlXSA6IHJhd1ZhbHVlOw0KLQkJCQ0KLQkJCXZhciB2YWx1ZSA9IG9wdGlvbnMuZm9ybWF0TWF0Y2gocmF3VmFsdWUsIGkrMSwgb3B0aW9ucy5kYXRhLmxlbmd0aCk7DQotCQkJaWYgKCB2YWx1ZSA9PT0gZmFsc2UgKQ0KLQkJCQljb250aW51ZTsNCi0JCQkJDQotCQkJdmFyIGZpcnN0Q2hhciA9IHZhbHVlLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpOw0KLQkJCS8vIGlmIG5vIGxvb2t1cCBhcnJheSBmb3IgdGhpcyBjaGFyYWN0ZXIgZXhpc3RzLCBsb29rIGl0IHVwIG5vdw0KLQkJCWlmKCAhc3RNYXRjaFNldHNbZmlyc3RDaGFyXSApIA0KLQkJCQlzdE1hdGNoU2V0c1tmaXJzdENoYXJdID0gW107DQotDQotCQkJLy8gaWYgdGhlIG1hdGNoIGlzIGEgc3RyaW5nDQotCQkJdmFyIHJvdyA9IHsNCi0JCQkJdmFsdWU6IHZhbHVlLA0KLQkJCQlkYXRhOiByYXdWYWx1ZSwNCi0JCQkJcmVzdWx0OiBvcHRpb25zLmZvcm1hdFJlc3VsdCAmJiBvcHRpb25zLmZvcm1hdFJlc3VsdChyYXdWYWx1ZSkgfHwgdmFsdWUNCi0JCQl9Ow0KLQkJCQ0KLQkJCS8vIHB1c2ggdGhlIGN1cnJlbnQgbWF0Y2ggaW50byB0aGUgc2V0IGxpc3QNCi0JCQlzdE1hdGNoU2V0c1tmaXJzdENoYXJdLnB1c2gocm93KTsNCi0NCi0JCQkvLyBrZWVwIHRyYWNrIG9mIG1pbkNoYXJzIHplcm8gaXRlbXMNCi0JCQlpZiAoIG51bGxEYXRhKysgPCBvcHRpb25zLm1heCApIHsNCi0JCQkJc3RNYXRjaFNldHNbIiJdLnB1c2gocm93KTsNCi0JCQl9DQotCQl9Ow0KLQ0KLQkJLy8gYWRkIHRoZSBkYXRhIGl0ZW1zIHRvIHRoZSBjYWNoZQ0KLQkJJC5lYWNoKHN0TWF0Y2hTZXRzLCBmdW5jdGlvbihpLCB2YWx1ZSkgew0KLQkJCS8vIGluY3JlYXNlIHRoZSBjYWNoZSBzaXplDQotCQkJb3B0aW9ucy5jYWNoZUxlbmd0aCsrOw0KLQkJCS8vIGFkZCB0byB0aGUgY2FjaGUNCi0JCQlhZGQoaSwgdmFsdWUpOw0KLQkJfSk7DQotCX0NCi0JDQotCS8vIHBvcHVsYXRlIGFueSBleGlzdGluZyBkYXRhDQotCXNldFRpbWVvdXQocG9wdWxhdGUsIDI1KTsNCi0JDQotCWZ1bmN0aW9uIGZsdXNoKCl7DQotCQlkYXRhID0ge307DQotCQlsZW5ndGggPSAwOw0KLQl9DQotCQ0KLQlyZXR1cm4gew0KLQkJZmx1c2g6IGZsdXNoLA0KLQkJYWRkOiBhZGQsDQotCQlwb3B1bGF0ZTogcG9wdWxhdGUsDQotCQlsb2FkOiBmdW5jdGlvbihxKSB7DQotCQkJaWYgKCFvcHRpb25zLmNhY2hlTGVuZ3RoIHx8ICFsZW5ndGgpDQotCQkJCXJldHVybiBudWxsOw0KLQkJCS8qIA0KLQkJCSAqIGlmIGRlYWxpbmcgdy9sb2NhbCBkYXRhIGFuZCBtYXRjaENvbnRhaW5zIHRoYW4gd2UgbXVzdCBtYWtlIHN1cmUNCi0JCQkgKiB0byBsb29wIHRocm91Z2ggYWxsIHRoZSBkYXRhIGNvbGxlY3Rpb25zIGxvb2tpbmcgZm9yIG1hdGNoZXMNCi0JCQkgKi8NCi0JCQlpZiggIW9wdGlvbnMudXJsICYmIG9wdGlvbnMubWF0Y2hDb250YWlucyApew0KLQkJCQkvLyB0cmFjayBhbGwgbWF0Y2hlcw0KLQkJCQl2YXIgY3N1YiA9IFtdOw0KLQkJCQkvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBkYXRhIGdyaWRzIGZvciBtYXRjaGVzDQotCQkJCWZvciggdmFyIGsgaW4gZGF0YSApew0KLQkJCQkJLy8gZG9uJ3Qgc2VhcmNoIHRocm91Z2ggdGhlIHN0TWF0Y2hTZXRzWyIiXSAobWluQ2hhcnM6IDApIGNhY2hlDQotCQkJCQkvLyB0aGlzIHByZXZlbnRzIGR1cGxpY2F0ZXMNCi0JCQkJCWlmKCBrLmxlbmd0aCA+IDAgKXsNCi0JCQkJCQl2YXIgYyA9IGRhdGFba107DQotCQkJCQkJJC5lYWNoKGMsIGZ1bmN0aW9uKGksIHgpIHsNCi0JCQkJCQkJLy8gaWYgd2UndmUgZ290IGEgbWF0Y2gsIGFkZCBpdCB0byB0aGUgYXJyYXkNCi0JCQkJCQkJaWYgKG1hdGNoU3Vic2V0KHgudmFsdWUsIHEpKSB7DQotCQkJCQkJCQljc3ViLnB1c2goeCk7DQotCQkJCQkJCX0NCi0JCQkJCQl9KTsNCi0JCQkJCX0NCi0JCQkJfQkJCQkNCi0JCQkJcmV0dXJuIGNzdWI7DQotCQkJfSBlbHNlIA0KLQkJCS8vIGlmIHRoZSBleGFjdCBpdGVtIGV4aXN0cywgdXNlIGl0DQotCQkJaWYgKGRhdGFbcV0pew0KLQkJCQlyZXR1cm4gZGF0YVtxXTsNCi0JCQl9IGVsc2UNCi0JCQlpZiAob3B0aW9ucy5tYXRjaFN1YnNldCkgew0KLQkJCQlmb3IgKHZhciBpID0gcS5sZW5ndGggLSAxOyBpID49IG9wdGlvbnMubWluQ2hhcnM7IGktLSkgew0KLQkJCQkJdmFyIGMgPSBkYXRhW3Euc3Vic3RyKDAsIGkpXTsNCi0JCQkJCWlmIChjKSB7DQotCQkJCQkJdmFyIGNzdWIgPSBbXTsNCi0JCQkJCQkkLmVhY2goYywgZnVuY3Rpb24oaSwgeCkgew0KLQkJCQkJCQlpZiAobWF0Y2hTdWJzZXQoeC52YWx1ZSwgcSkpIHsNCi0JCQkJCQkJCWNzdWJbY3N1Yi5sZW5ndGhdID0geDsNCi0JCQkJCQkJfQ0KLQkJCQkJCX0pOw0KLQkJCQkJCXJldHVybiBjc3ViOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9Ow0KLX07DQotDQotJC5BdXRvY29tcGxldGVyLlNlbGVjdCA9IGZ1bmN0aW9uIChvcHRpb25zLCBpbnB1dCwgc2VsZWN0LCBjb25maWcpIHsNCi0JdmFyIENMQVNTRVMgPSB7DQotCQlBQ1RJVkU6ICJhY19vdmVyIg0KLQl9Ow0KLQkNCi0JdmFyIGxpc3RJdGVtcywNCi0JCWFjdGl2ZSA9IC0xLA0KLQkJZGF0YSwNCi0JCXRlcm0gPSAiIiwNCi0JCW5lZWRzSW5pdCA9IHRydWUsDQotCQllbGVtZW50LA0KLQkJbGlzdDsNCi0JDQotCS8vIENyZWF0ZSByZXN1bHRzDQotCWZ1bmN0aW9uIGluaXQoKSB7DQotCQlpZiAoIW5lZWRzSW5pdCkNCi0JCQlyZXR1cm47DQotCQllbGVtZW50ID0gJCgiPGRpdi8+IikNCi0JCS5oaWRlKCkNCi0JCS5hZGRDbGFzcyhvcHRpb25zLnJlc3VsdHNDbGFzcykNCi0JCS5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIikNCi0JCS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTsNCi0JDQotCQlsaXN0ID0gJCgiPHVsLz4iKS5hcHBlbmRUbyhlbGVtZW50KS5tb3VzZW92ZXIoIGZ1bmN0aW9uKGV2ZW50KSB7DQotCQkJaWYodGFyZ2V0KGV2ZW50KS5ub2RlTmFtZSAmJiB0YXJnZXQoZXZlbnQpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gJ0xJJykgew0KLQkgICAgICAgICAgICBhY3RpdmUgPSAkKCJsaSIsIGxpc3QpLnJlbW92ZUNsYXNzKENMQVNTRVMuQUNUSVZFKS5pbmRleCh0YXJnZXQoZXZlbnQpKTsNCi0JCQkgICAgJCh0YXJnZXQoZXZlbnQpKS5hZGRDbGFzcyhDTEFTU0VTLkFDVElWRSk7ICAgICAgICAgICAgDQotCSAgICAgICAgfQ0KLQkJfSkuY2xpY2soZnVuY3Rpb24oZXZlbnQpIHsNCi0JCQkkKHRhcmdldChldmVudCkpLmFkZENsYXNzKENMQVNTRVMuQUNUSVZFKTsNCi0JCQlzZWxlY3QoKTsNCi0JCQkvLyBUT0RPIHByb3ZpZGUgb3B0aW9uIHRvIGF2b2lkIHNldHRpbmcgZm9jdXMgYWdhaW4gYWZ0ZXIgc2VsZWN0aW9uPyB1c2VmdWwgZm9yIGNsZWFudXAtb24tZm9jdXMNCi0JCQlpbnB1dC5mb2N1cygpOw0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0pLm1vdXNlZG93bihmdW5jdGlvbigpIHsNCi0JCQljb25maWcubW91c2VEb3duT25TZWxlY3QgPSB0cnVlOw0KLQkJfSkubW91c2V1cChmdW5jdGlvbigpIHsNCi0JCQljb25maWcubW91c2VEb3duT25TZWxlY3QgPSBmYWxzZTsNCi0JCX0pOw0KLQkJDQotCQlpZiggb3B0aW9ucy53aWR0aCA+IDAgKQ0KLQkJCWVsZW1lbnQuY3NzKCJ3aWR0aCIsIG9wdGlvbnMud2lkdGgpOw0KLQkJCQ0KLQkJbmVlZHNJbml0ID0gZmFsc2U7DQotCX0gDQotCQ0KLQlmdW5jdGlvbiB0YXJnZXQoZXZlbnQpIHsNCi0JCXZhciBlbGVtZW50ID0gZXZlbnQudGFyZ2V0Ow0KLQkJd2hpbGUoZWxlbWVudCAmJiBlbGVtZW50LnRhZ05hbWUgIT0gIkxJIikNCi0JCQllbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOw0KLQkJLy8gbW9yZSBmdW4gd2l0aCBJRSwgc29tZXRpbWVzIGV2ZW50LnRhcmdldCBpcyBlbXB0eSwganVzdCBpZ25vcmUgaXQgdGhlbg0KLQkJaWYoIWVsZW1lbnQpDQotCQkJcmV0dXJuIFtdOw0KLQkJcmV0dXJuIGVsZW1lbnQ7DQotCX0NCi0NCi0JZnVuY3Rpb24gbW92ZVNlbGVjdChzdGVwKSB7DQotCQlsaXN0SXRlbXMuc2xpY2UoYWN0aXZlLCBhY3RpdmUgKyAxKS5yZW1vdmVDbGFzcyhDTEFTU0VTLkFDVElWRSk7DQotCQltb3ZlUG9zaXRpb24oc3RlcCk7DQotICAgICAgICB2YXIgYWN0aXZlSXRlbSA9IGxpc3RJdGVtcy5zbGljZShhY3RpdmUsIGFjdGl2ZSArIDEpLmFkZENsYXNzKENMQVNTRVMuQUNUSVZFKTsNCi0gICAgICAgIGlmKG9wdGlvbnMuc2Nyb2xsKSB7DQotICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7DQotICAgICAgICAgICAgbGlzdEl0ZW1zLnNsaWNlKDAsIGFjdGl2ZSkuZWFjaChmdW5jdGlvbigpIHsNCi0JCQkJb2Zmc2V0ICs9IHRoaXMub2Zmc2V0SGVpZ2h0Ow0KLQkJCX0pOw0KLSAgICAgICAgICAgIGlmKChvZmZzZXQgKyBhY3RpdmVJdGVtWzBdLm9mZnNldEhlaWdodCAtIGxpc3Quc2Nyb2xsVG9wKCkpID4gbGlzdFswXS5jbGllbnRIZWlnaHQpIHsNCi0gICAgICAgICAgICAgICAgbGlzdC5zY3JvbGxUb3Aob2Zmc2V0ICsgYWN0aXZlSXRlbVswXS5vZmZzZXRIZWlnaHQgLSBsaXN0LmlubmVySGVpZ2h0KCkpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZihvZmZzZXQgPCBsaXN0LnNjcm9sbFRvcCgpKSB7DQotICAgICAgICAgICAgICAgIGxpc3Quc2Nyb2xsVG9wKG9mZnNldCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQl9Ow0KLQkNCi0JZnVuY3Rpb24gbW92ZVBvc2l0aW9uKHN0ZXApIHsNCi0JCWFjdGl2ZSArPSBzdGVwOw0KLQkJaWYgKGFjdGl2ZSA8IDApIHsNCi0JCQlhY3RpdmUgPSBsaXN0SXRlbXMuc2l6ZSgpIC0gMTsNCi0JCX0gZWxzZSBpZiAoYWN0aXZlID49IGxpc3RJdGVtcy5zaXplKCkpIHsNCi0JCQlhY3RpdmUgPSAwOw0KLQkJfQ0KLQl9DQotCQ0KLQlmdW5jdGlvbiBsaW1pdE51bWJlck9mSXRlbXMoYXZhaWxhYmxlKSB7DQotCQlyZXR1cm4gb3B0aW9ucy5tYXggJiYgb3B0aW9ucy5tYXggPCBhdmFpbGFibGUNCi0JCQk/IG9wdGlvbnMubWF4DQotCQkJOiBhdmFpbGFibGU7DQotCX0NCi0JDQotCWZ1bmN0aW9uIGZpbGxMaXN0KCkgew0KLQkJbGlzdC5lbXB0eSgpOw0KLQkJdmFyIG1heCA9IGxpbWl0TnVtYmVyT2ZJdGVtcyhkYXRhLmxlbmd0aCk7DQotCQlmb3IgKHZhciBpPTA7IGkgPCBtYXg7IGkrKykgew0KLQkJCWlmICghZGF0YVtpXSkNCi0JCQkJY29udGludWU7DQotCQkJdmFyIGZvcm1hdHRlZCA9IG9wdGlvbnMuZm9ybWF0SXRlbShkYXRhW2ldLmRhdGEsIGkrMSwgbWF4LCBkYXRhW2ldLnZhbHVlLCB0ZXJtKTsNCi0JCQlpZiAoIGZvcm1hdHRlZCA9PT0gZmFsc2UgKQ0KLQkJCQljb250aW51ZTsNCi0JCQl2YXIgbGkgPSAkKCI8bGkvPiIpLmh0bWwoIG9wdGlvbnMuaGlnaGxpZ2h0KGZvcm1hdHRlZCwgdGVybSkgKS5hZGRDbGFzcyhpJTIgPT0gMCA/ICJhY19ldmVuIiA6ICJhY19vZGQiKS5hcHBlbmRUbyhsaXN0KVswXTsNCi0JCQkkLmRhdGEobGksICJhY19kYXRhIiwgZGF0YVtpXSk7DQotCQl9DQotCQlsaXN0SXRlbXMgPSBsaXN0LmZpbmQoImxpIik7DQotCQlpZiAoIG9wdGlvbnMuc2VsZWN0Rmlyc3QgKSB7DQotCQkJbGlzdEl0ZW1zLnNsaWNlKDAsIDEpLmFkZENsYXNzKENMQVNTRVMuQUNUSVZFKTsNCi0JCQlhY3RpdmUgPSAwOw0KLQkJfQ0KLQkJLy8gYXBwbHkgYmdpZnJhbWUgaWYgYXZhaWxhYmxlDQotCQlpZiAoICQuZm4uYmdpZnJhbWUgKQ0KLQkJCWxpc3QuYmdpZnJhbWUoKTsNCi0JfQ0KLQkNCi0JcmV0dXJuIHsNCi0JCWRpc3BsYXk6IGZ1bmN0aW9uKGQsIHEpIHsNCi0JCQlpbml0KCk7DQotCQkJZGF0YSA9IGQ7DQotCQkJdGVybSA9IHE7DQotCQkJZmlsbExpc3QoKTsNCi0JCX0sDQotCQluZXh0OiBmdW5jdGlvbigpIHsNCi0JCQltb3ZlU2VsZWN0KDEpOw0KLQkJfSwNCi0JCXByZXY6IGZ1bmN0aW9uKCkgew0KLQkJCW1vdmVTZWxlY3QoLTEpOw0KLQkJfSwNCi0JCXBhZ2VVcDogZnVuY3Rpb24oKSB7DQotCQkJaWYgKGFjdGl2ZSAhPSAwICYmIGFjdGl2ZSAtIDggPCAwKSB7DQotCQkJCW1vdmVTZWxlY3QoIC1hY3RpdmUgKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQltb3ZlU2VsZWN0KC04KTsNCi0JCQl9DQotCQl9LA0KLQkJcGFnZURvd246IGZ1bmN0aW9uKCkgew0KLQkJCWlmIChhY3RpdmUgIT0gbGlzdEl0ZW1zLnNpemUoKSAtIDEgJiYgYWN0aXZlICsgOCA+IGxpc3RJdGVtcy5zaXplKCkpIHsNCi0JCQkJbW92ZVNlbGVjdCggbGlzdEl0ZW1zLnNpemUoKSAtIDEgLSBhY3RpdmUgKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQltb3ZlU2VsZWN0KDgpOw0KLQkJCX0NCi0JCX0sDQotCQloaWRlOiBmdW5jdGlvbigpIHsNCi0JCQllbGVtZW50ICYmIGVsZW1lbnQuaGlkZSgpOw0KLQkJCWxpc3RJdGVtcyAmJiBsaXN0SXRlbXMucmVtb3ZlQ2xhc3MoQ0xBU1NFUy5BQ1RJVkUpOw0KLQkJCWFjdGl2ZSA9IC0xOw0KLQkJfSwNCi0JCXZpc2libGUgOiBmdW5jdGlvbigpIHsNCi0JCQlyZXR1cm4gZWxlbWVudCAmJiBlbGVtZW50LmlzKCI6dmlzaWJsZSIpOw0KLQkJfSwNCi0JCWN1cnJlbnQ6IGZ1bmN0aW9uKCkgew0KLQkJCXJldHVybiB0aGlzLnZpc2libGUoKSAmJiAobGlzdEl0ZW1zLmZpbHRlcigiLiIgKyBDTEFTU0VTLkFDVElWRSlbMF0gfHwgb3B0aW9ucy5zZWxlY3RGaXJzdCAmJiBsaXN0SXRlbXNbMF0pOw0KLQkJfSwNCi0JCXNob3c6IGZ1bmN0aW9uKCkgew0KLQkJCXZhciBvZmZzZXQgPSAkKGlucHV0KS5vZmZzZXQoKTsNCi0JCQllbGVtZW50LmNzcyh7DQotCQkJCXdpZHRoOiB0eXBlb2Ygb3B0aW9ucy53aWR0aCA9PSAic3RyaW5nIiB8fCBvcHRpb25zLndpZHRoID4gMCA/IG9wdGlvbnMud2lkdGggOiAkKGlucHV0KS53aWR0aCgpLA0KLQkJCQl0b3A6IG9mZnNldC50b3AgKyBpbnB1dC5vZmZzZXRIZWlnaHQsDQotCQkJCWxlZnQ6IG9mZnNldC5sZWZ0DQotCQkJfSkuc2hvdygpOw0KLSAgICAgICAgICAgIGlmKG9wdGlvbnMuc2Nyb2xsKSB7DQotICAgICAgICAgICAgICAgIGxpc3Quc2Nyb2xsVG9wKDApOw0KLSAgICAgICAgICAgICAgICBsaXN0LmNzcyh7DQotCQkJCQltYXhIZWlnaHQ6IG9wdGlvbnMuc2Nyb2xsSGVpZ2h0LA0KLQkJCQkJb3ZlcmZsb3c6ICdhdXRvJw0KLQkJCQl9KTsNCi0JCQkJDQotICAgICAgICAgICAgICAgIGlmKCQuYnJvd3Nlci5tc2llICYmIHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlLm1heEhlaWdodCA9PT0gInVuZGVmaW5lZCIpIHsNCi0JCQkJCXZhciBsaXN0SGVpZ2h0ID0gMDsNCi0JCQkJCWxpc3RJdGVtcy5lYWNoKGZ1bmN0aW9uKCkgew0KLQkJCQkJCWxpc3RIZWlnaHQgKz0gdGhpcy5vZmZzZXRIZWlnaHQ7DQotCQkJCQl9KTsNCi0JCQkJCXZhciBzY3JvbGxiYXJzVmlzaWJsZSA9IGxpc3RIZWlnaHQgPiBvcHRpb25zLnNjcm9sbEhlaWdodDsNCi0gICAgICAgICAgICAgICAgICAgIGxpc3QuY3NzKCdoZWlnaHQnLCBzY3JvbGxiYXJzVmlzaWJsZSA/IG9wdGlvbnMuc2Nyb2xsSGVpZ2h0IDogbGlzdEhlaWdodCApOw0KLQkJCQkJaWYgKCFzY3JvbGxiYXJzVmlzaWJsZSkgew0KLQkJCQkJCS8vIElFIGRvZXNuJ3QgcmVjYWxjdWxhdGUgd2lkdGggd2hlbiBzY3JvbGxiYXIgZGlzYXBwZWFycw0KLQkJCQkJCWxpc3RJdGVtcy53aWR0aCggbGlzdC53aWR0aCgpIC0gcGFyc2VJbnQobGlzdEl0ZW1zLmNzcygicGFkZGluZy1sZWZ0IikpIC0gcGFyc2VJbnQobGlzdEl0ZW1zLmNzcygicGFkZGluZy1yaWdodCIpKSApOw0KLQkJCQkJfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIH0NCi0JCX0sDQotCQlzZWxlY3RlZDogZnVuY3Rpb24oKSB7DQotCQkJdmFyIHNlbGVjdGVkID0gbGlzdEl0ZW1zICYmIGxpc3RJdGVtcy5maWx0ZXIoIi4iICsgQ0xBU1NFUy5BQ1RJVkUpLnJlbW92ZUNsYXNzKENMQVNTRVMuQUNUSVZFKTsNCi0JCQlyZXR1cm4gc2VsZWN0ZWQgJiYgc2VsZWN0ZWQubGVuZ3RoICYmICQuZGF0YShzZWxlY3RlZFswXSwgImFjX2RhdGEiKTsNCi0JCX0sDQotCQllbXB0eUxpc3Q6IGZ1bmN0aW9uICgpew0KLQkJCWxpc3QgJiYgbGlzdC5lbXB0eSgpOw0KLQkJfSwNCi0JCXVuYmluZDogZnVuY3Rpb24oKSB7DQotCQkJZWxlbWVudCAmJiBlbGVtZW50LnJlbW92ZSgpOw0KLQkJfQ0KLQl9Ow0KLX07DQotDQotJC5BdXRvY29tcGxldGVyLlNlbGVjdGlvbiA9IGZ1bmN0aW9uKGZpZWxkLCBzdGFydCwgZW5kKSB7DQotCWlmKCBmaWVsZC5jcmVhdGVUZXh0UmFuZ2UgKXsNCi0JCXZhciBzZWxSYW5nZSA9IGZpZWxkLmNyZWF0ZVRleHRSYW5nZSgpOw0KLQkJc2VsUmFuZ2UuY29sbGFwc2UodHJ1ZSk7DQotCQlzZWxSYW5nZS5tb3ZlU3RhcnQoImNoYXJhY3RlciIsIHN0YXJ0KTsNCi0JCXNlbFJhbmdlLm1vdmVFbmQoImNoYXJhY3RlciIsIGVuZCk7DQotCQlzZWxSYW5nZS5zZWxlY3QoKTsNCi0JfSBlbHNlIGlmKCBmaWVsZC5zZXRTZWxlY3Rpb25SYW5nZSApew0KLQkJZmllbGQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7DQotCX0gZWxzZSB7DQotCQlpZiggZmllbGQuc2VsZWN0aW9uU3RhcnQgKXsNCi0JCQlmaWVsZC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0Ow0KLQkJCWZpZWxkLnNlbGVjdGlvbkVuZCA9IGVuZDsNCi0JCX0NCi0JfQ0KLQlmaWVsZC5mb2N1cygpOw0KLX07DQotDQotfSkoalF1ZXJ5KTsNCisvKgorICogQXV0b2NvbXBsZXRlIC0galF1ZXJ5IHBsdWdpbiAxLjFwcmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgRHlsYW4gVmVyaGV1bCwgRGFuIEcuIFN3aXR6ZXIsIEFuamVzaCBUdWxhZGhhciwgSsO2cm4gWmFlZmZlcmVyCisgKgorICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6CisgKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCisgKiAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbAorICoKKyAqIFJldmlzaW9uOiBJZDoganF1ZXJ5LmF1dG9jb21wbGV0ZS5qcyA1Nzg1IDIwMDgtMDctMTIgMTA6Mzc6MzNaIGpvZXJuLnphZWZmZXJlciAkCisgKgorICovCisKKzsoZnVuY3Rpb24oJCkgeworCQorJC5mbi5leHRlbmQoeworCWF1dG9jb21wbGV0ZTogZnVuY3Rpb24odXJsT3JEYXRhLCBvcHRpb25zKSB7CisJCXZhciBpc1VybCA9IHR5cGVvZiB1cmxPckRhdGEgPT0gInN0cmluZyI7CisJCW9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgJC5BdXRvY29tcGxldGVyLmRlZmF1bHRzLCB7CisJCQl1cmw6IGlzVXJsID8gdXJsT3JEYXRhIDogbnVsbCwKKwkJCWRhdGE6IGlzVXJsID8gbnVsbCA6IHVybE9yRGF0YSwKKwkJCWRlbGF5OiBpc1VybCA/ICQuQXV0b2NvbXBsZXRlci5kZWZhdWx0cy5kZWxheSA6IDEwLAorCQkJbWF4OiBvcHRpb25zICYmICFvcHRpb25zLnNjcm9sbCA/IDEwIDogMTUwCisJCX0sIG9wdGlvbnMpOworCQkKKwkJLy8gaWYgaGlnaGxpZ2h0IGlzIHNldCB0byBmYWxzZSwgcmVwbGFjZSBpdCB3aXRoIGEgZG8tbm90aGluZyBmdW5jdGlvbgorCQlvcHRpb25zLmhpZ2hsaWdodCA9IG9wdGlvbnMuaGlnaGxpZ2h0IHx8IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTsKKwkJCisJCS8vIGlmIHRoZSBmb3JtYXRNYXRjaCBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlbiB1c2UgZm9ybWF0SXRlbSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKwkJb3B0aW9ucy5mb3JtYXRNYXRjaCA9IG9wdGlvbnMuZm9ybWF0TWF0Y2ggfHwgb3B0aW9ucy5mb3JtYXRJdGVtOworCQkKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCW5ldyAkLkF1dG9jb21wbGV0ZXIodGhpcywgb3B0aW9ucyk7CisJCX0pOworCX0sCisJcmVzdWx0OiBmdW5jdGlvbihoYW5kbGVyKSB7CisJCXJldHVybiB0aGlzLmJpbmQoInJlc3VsdCIsIGhhbmRsZXIpOworCX0sCisJc2VhcmNoOiBmdW5jdGlvbihoYW5kbGVyKSB7CisJCXJldHVybiB0aGlzLnRyaWdnZXIoInNlYXJjaCIsIFtoYW5kbGVyXSk7CisJfSwKKwlmbHVzaENhY2hlOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMudHJpZ2dlcigiZmx1c2hDYWNoZSIpOworCX0sCisJc2V0T3B0aW9uczogZnVuY3Rpb24ob3B0aW9ucyl7CisJCXJldHVybiB0aGlzLnRyaWdnZXIoInNldE9wdGlvbnMiLCBbb3B0aW9uc10pOworCX0sCisJdW5hdXRvY29tcGxldGU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJ1bmF1dG9jb21wbGV0ZSIpOworCX0KK30pOworCiskLkF1dG9jb21wbGV0ZXIgPSBmdW5jdGlvbihpbnB1dCwgb3B0aW9ucykgeworCisJdmFyIEtFWSA9IHsKKwkJVVA6IDM4LAorCQlET1dOOiA0MCwKKwkJREVMOiA0NiwKKwkJVEFCOiA5LAorCQlSRVRVUk46IDEzLAorCQlFU0M6IDI3LAorCQlDT01NQTogMTg4LAorCQlQQUdFVVA6IDMzLAorCQlQQUdFRE9XTjogMzQsCisJCUJBQ0tTUEFDRTogOAorCX07CisKKwkvLyBDcmVhdGUgJCBvYmplY3QgZm9yIGlucHV0IGVsZW1lbnQKKwl2YXIgJGlucHV0ID0gJChpbnB1dCkuYXR0cigiYXV0b2NvbXBsZXRlIiwgIm9mZiIpLmFkZENsYXNzKG9wdGlvbnMuaW5wdXRDbGFzcyk7CisKKwl2YXIgdGltZW91dDsKKwl2YXIgcHJldmlvdXNWYWx1ZSA9ICIiOworCXZhciBjYWNoZSA9ICQuQXV0b2NvbXBsZXRlci5DYWNoZShvcHRpb25zKTsKKwl2YXIgaGFzRm9jdXMgPSAwOworCXZhciBsYXN0S2V5UHJlc3NDb2RlOworCXZhciBjb25maWcgPSB7CisJCW1vdXNlRG93bk9uU2VsZWN0OiBmYWxzZQorCX07CisJdmFyIHNlbGVjdCA9ICQuQXV0b2NvbXBsZXRlci5TZWxlY3Qob3B0aW9ucywgaW5wdXQsIHNlbGVjdEN1cnJlbnQsIGNvbmZpZyk7CisJCisJdmFyIGJsb2NrU3VibWl0OworCQorCS8vIHByZXZlbnQgZm9ybSBzdWJtaXQgaW4gb3BlcmEgd2hlbiBzZWxlY3Rpbmcgd2l0aCByZXR1cm4ga2V5CisJJC5icm93c2VyLm9wZXJhICYmICQoaW5wdXQuZm9ybSkuYmluZCgic3VibWl0LmF1dG9jb21wbGV0ZSIsIGZ1bmN0aW9uKCkgeworCQlpZiAoYmxvY2tTdWJtaXQpIHsKKwkJCWJsb2NrU3VibWl0ID0gZmFsc2U7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9KTsKKwkKKwkvLyBvbmx5IG9wZXJhIGRvZXNuJ3QgdHJpZ2dlciBrZXlkb3duIG11bHRpcGxlIHRpbWVzIHdoaWxlIHByZXNzZWQsIG90aGVycyBkb24ndCB3b3JrIHdpdGgga2V5cHJlc3MgYXQgYWxsCisJJGlucHV0LmJpbmQoKCQuYnJvd3Nlci5vcGVyYSA/ICJrZXlwcmVzcyIgOiAia2V5ZG93biIpICsgIi5hdXRvY29tcGxldGUiLCBmdW5jdGlvbihldmVudCkgeworCQkvLyB0cmFjayBsYXN0IGtleSBwcmVzc2VkCisJCWxhc3RLZXlQcmVzc0NvZGUgPSBldmVudC5rZXlDb2RlOworCQlzd2l0Y2goZXZlbnQua2V5Q29kZSkgeworCQkKKwkJCWNhc2UgS0VZLlVQOgorCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQkJaWYgKCBzZWxlY3QudmlzaWJsZSgpICkgeworCQkJCQlzZWxlY3QucHJldigpOworCQkJCX0gZWxzZSB7CisJCQkJCW9uQ2hhbmdlKDAsIHRydWUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgS0VZLkRPV046CisJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKwkJCQlpZiAoIHNlbGVjdC52aXNpYmxlKCkgKSB7CisJCQkJCXNlbGVjdC5uZXh0KCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJb25DaGFuZ2UoMCwgdHJ1ZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBLRVkuUEFHRVVQOgorCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQkJaWYgKCBzZWxlY3QudmlzaWJsZSgpICkgeworCQkJCQlzZWxlY3QucGFnZVVwKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJb25DaGFuZ2UoMCwgdHJ1ZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBLRVkuUEFHRURPV046CisJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKwkJCQlpZiAoIHNlbGVjdC52aXNpYmxlKCkgKSB7CisJCQkJCXNlbGVjdC5wYWdlRG93bigpOworCQkJCX0gZWxzZSB7CisJCQkJCW9uQ2hhbmdlKDAsIHRydWUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQorCQkJLy8gbWF0Y2hlcyBhbHNvIHNlbWljb2xvbgorCQkJY2FzZSBvcHRpb25zLm11bHRpcGxlICYmICQudHJpbShvcHRpb25zLm11bHRpcGxlU2VwYXJhdG9yKSA9PSAiLCIgJiYgS0VZLkNPTU1BOgorCQkJY2FzZSBLRVkuVEFCOgorCQkJY2FzZSBLRVkuUkVUVVJOOgorCQkJCWlmKCBzZWxlY3RDdXJyZW50KCkgKSB7CisJCQkJCS8vIHN0b3AgZGVmYXVsdCB0byBwcmV2ZW50IGEgZm9ybSBzdWJtaXQsIE9wZXJhIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcKKwkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKwkJCQkJYmxvY2tTdWJtaXQgPSB0cnVlOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBLRVkuRVNDOgorCQkJCXNlbGVjdC5oaWRlKCk7CisJCQkJYnJlYWs7CisJCQkJCisJCQlkZWZhdWx0OgorCQkJCWNsZWFyVGltZW91dCh0aW1lb3V0KTsKKwkJCQl0aW1lb3V0ID0gc2V0VGltZW91dChvbkNoYW5nZSwgb3B0aW9ucy5kZWxheSk7CisJCQkJYnJlYWs7CisJCX0KKwl9KS5mb2N1cyhmdW5jdGlvbigpeworCQkvLyB0cmFjayB3aGV0aGVyIHRoZSBmaWVsZCBoYXMgZm9jdXMsIHdlIHNob3VsZG4ndCBwcm9jZXNzIGFueQorCQkvLyByZXN1bHRzIGlmIHRoZSBmaWVsZCBubyBsb25nZXIgaGFzIGZvY3VzCisJCWhhc0ZvY3VzKys7CisJfSkuYmx1cihmdW5jdGlvbigpIHsKKwkJaGFzRm9jdXMgPSAwOworCQlpZiAoIWNvbmZpZy5tb3VzZURvd25PblNlbGVjdCkgeworCQkJaGlkZVJlc3VsdHMoKTsKKwkJfQorCX0pLmNsaWNrKGZ1bmN0aW9uKCkgeworCQkvLyBzaG93IHNlbGVjdCB3aGVuIGNsaWNraW5nIGluIGEgZm9jdXNlZCBmaWVsZAorCQlpZiAoIGhhc0ZvY3VzKysgPiAxICYmICFzZWxlY3QudmlzaWJsZSgpICkgeworCQkJb25DaGFuZ2UoMCwgdHJ1ZSk7CisJCX0KKwl9KS5iaW5kKCJzZWFyY2giLCBmdW5jdGlvbigpIHsKKwkJLy8gVE9ETyB3aHkgbm90IGp1c3Qgc3BlY2lmeWluZyBib3RoIGFyZ3VtZW50cz8KKwkJdmFyIGZuID0gKGFyZ3VtZW50cy5sZW5ndGggPiAxKSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7CisJCWZ1bmN0aW9uIGZpbmRWYWx1ZUNhbGxiYWNrKHEsIGRhdGEpIHsKKwkJCXZhciByZXN1bHQ7CisJCQlpZiggZGF0YSAmJiBkYXRhLmxlbmd0aCApIHsKKwkJCQlmb3IgKHZhciBpPTA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CisJCQkJCWlmKCBkYXRhW2ldLnJlc3VsdC50b0xvd2VyQ2FzZSgpID09IHEudG9Mb3dlckNhc2UoKSApIHsKKwkJCQkJCXJlc3VsdCA9IGRhdGFbaV07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmKCB0eXBlb2YgZm4gPT0gImZ1bmN0aW9uIiApIGZuKHJlc3VsdCk7CisJCQllbHNlICRpbnB1dC50cmlnZ2VyKCJyZXN1bHQiLCByZXN1bHQgJiYgW3Jlc3VsdC5kYXRhLCByZXN1bHQudmFsdWVdKTsKKwkJfQorCQkkLmVhY2godHJpbVdvcmRzKCRpbnB1dC52YWwoKSksIGZ1bmN0aW9uKGksIHZhbHVlKSB7CisJCQlyZXF1ZXN0KHZhbHVlLCBmaW5kVmFsdWVDYWxsYmFjaywgZmluZFZhbHVlQ2FsbGJhY2spOworCQl9KTsKKwl9KS5iaW5kKCJmbHVzaENhY2hlIiwgZnVuY3Rpb24oKSB7CisJCWNhY2hlLmZsdXNoKCk7CisJfSkuYmluZCgic2V0T3B0aW9ucyIsIGZ1bmN0aW9uKCkgeworCQkkLmV4dGVuZChvcHRpb25zLCBhcmd1bWVudHNbMV0pOworCQkvLyBpZiB3ZSd2ZSB1cGRhdGVkIHRoZSBkYXRhLCByZXBvcHVsYXRlCisJCWlmICggImRhdGEiIGluIGFyZ3VtZW50c1sxXSApCisJCQljYWNoZS5wb3B1bGF0ZSgpOworCX0pLmJpbmQoInVuYXV0b2NvbXBsZXRlIiwgZnVuY3Rpb24oKSB7CisJCXNlbGVjdC51bmJpbmQoKTsKKwkJJGlucHV0LnVuYmluZCgpOworCQkkKGlucHV0LmZvcm0pLnVuYmluZCgiLmF1dG9jb21wbGV0ZSIpOworCX0pOworCQorCQorCWZ1bmN0aW9uIHNlbGVjdEN1cnJlbnQoKSB7CisJCXZhciBzZWxlY3RlZCA9IHNlbGVjdC5zZWxlY3RlZCgpOworCQlpZiggIXNlbGVjdGVkICkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCXZhciB2ID0gc2VsZWN0ZWQucmVzdWx0OworCQlwcmV2aW91c1ZhbHVlID0gdjsKKwkJCisJCWlmICggb3B0aW9ucy5tdWx0aXBsZSApIHsKKwkJCXZhciB3b3JkcyA9IHRyaW1Xb3JkcygkaW5wdXQudmFsKCkpOworCQkJaWYgKCB3b3Jkcy5sZW5ndGggPiAxICkgeworCQkJCXYgPSB3b3Jkcy5zbGljZSgwLCB3b3Jkcy5sZW5ndGggLSAxKS5qb2luKCBvcHRpb25zLm11bHRpcGxlU2VwYXJhdG9yICkgKyBvcHRpb25zLm11bHRpcGxlU2VwYXJhdG9yICsgdjsKKwkJCX0KKwkJCXYgKz0gb3B0aW9ucy5tdWx0aXBsZVNlcGFyYXRvcjsKKwkJfQorCQkKKwkJJGlucHV0LnZhbCh2KTsKKwkJaGlkZVJlc3VsdHNOb3coKTsKKwkJJGlucHV0LnRyaWdnZXIoInJlc3VsdCIsIFtzZWxlY3RlZC5kYXRhLCBzZWxlY3RlZC52YWx1ZV0pOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJZnVuY3Rpb24gb25DaGFuZ2UoY3JhcCwgc2tpcFByZXZDaGVjaykgeworCQlpZiggbGFzdEtleVByZXNzQ29kZSA9PSBLRVkuREVMICkgeworCQkJc2VsZWN0LmhpZGUoKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJdmFyIGN1cnJlbnRWYWx1ZSA9ICRpbnB1dC52YWwoKTsKKwkJCisJCWlmICggIXNraXBQcmV2Q2hlY2sgJiYgY3VycmVudFZhbHVlID09IHByZXZpb3VzVmFsdWUgKQorCQkJcmV0dXJuOworCQkKKwkJcHJldmlvdXNWYWx1ZSA9IGN1cnJlbnRWYWx1ZTsKKwkJCisJCWN1cnJlbnRWYWx1ZSA9IGxhc3RXb3JkKGN1cnJlbnRWYWx1ZSk7CisJCWlmICggY3VycmVudFZhbHVlLmxlbmd0aCA+PSBvcHRpb25zLm1pbkNoYXJzKSB7CisJCQkkaW5wdXQuYWRkQ2xhc3Mob3B0aW9ucy5sb2FkaW5nQ2xhc3MpOworCQkJaWYgKCFvcHRpb25zLm1hdGNoQ2FzZSkKKwkJCQljdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUudG9Mb3dlckNhc2UoKTsKKwkJCXJlcXVlc3QoY3VycmVudFZhbHVlLCByZWNlaXZlRGF0YSwgaGlkZVJlc3VsdHNOb3cpOworCQl9IGVsc2UgeworCQkJc3RvcExvYWRpbmcoKTsKKwkJCXNlbGVjdC5oaWRlKCk7CisJCX0KKwl9OworCQorCWZ1bmN0aW9uIHRyaW1Xb3Jkcyh2YWx1ZSkgeworCQlpZiAoICF2YWx1ZSApIHsKKwkJCXJldHVybiBbIiJdOworCQl9CisJCXZhciB3b3JkcyA9IHZhbHVlLnNwbGl0KCBvcHRpb25zLm11bHRpcGxlU2VwYXJhdG9yICk7CisJCXZhciByZXN1bHQgPSBbXTsKKwkJJC5lYWNoKHdvcmRzLCBmdW5jdGlvbihpLCB2YWx1ZSkgeworCQkJaWYgKCAkLnRyaW0odmFsdWUpICkKKwkJCQlyZXN1bHRbaV0gPSAkLnRyaW0odmFsdWUpOworCQl9KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJZnVuY3Rpb24gbGFzdFdvcmQodmFsdWUpIHsKKwkJaWYgKCAhb3B0aW9ucy5tdWx0aXBsZSApCisJCQlyZXR1cm4gdmFsdWU7CisJCXZhciB3b3JkcyA9IHRyaW1Xb3Jkcyh2YWx1ZSk7CisJCXJldHVybiB3b3Jkc1t3b3Jkcy5sZW5ndGggLSAxXTsKKwl9CisJCisJLy8gZmlsbHMgaW4gdGhlIGlucHV0IGJveCB3L3RoZSBmaXJzdCBtYXRjaCAoYXNzdW1lZCB0byBiZSB0aGUgYmVzdCBtYXRjaCkKKwkvLyBxOiB0aGUgdGVybSBlbnRlcmVkCisJLy8gc1ZhbHVlOiB0aGUgZmlyc3QgbWF0Y2hpbmcgcmVzdWx0CisJZnVuY3Rpb24gYXV0b0ZpbGwocSwgc1ZhbHVlKXsKKwkJLy8gYXV0b2ZpbGwgaW4gdGhlIGNvbXBsZXRlIGJveCB3L3RoZSBmaXJzdCBtYXRjaCBhcyBsb25nIGFzIHRoZSB1c2VyIGhhc24ndCBlbnRlcmVkIGluIG1vcmUgZGF0YQorCQkvLyBpZiB0aGUgbGFzdCB1c2VyIGtleSBwcmVzc2VkIHdhcyBiYWNrc3BhY2UsIGRvbid0IGF1dG9maWxsCisJCWlmKCBvcHRpb25zLmF1dG9GaWxsICYmIChsYXN0V29yZCgkaW5wdXQudmFsKCkpLnRvTG93ZXJDYXNlKCkgPT0gcS50b0xvd2VyQ2FzZSgpKSAmJiBsYXN0S2V5UHJlc3NDb2RlICE9IEtFWS5CQUNLU1BBQ0UgKSB7CisJCQkvLyBmaWxsIGluIHRoZSB2YWx1ZSAoa2VlcCB0aGUgY2FzZSB0aGUgdXNlciBoYXMgdHlwZWQpCisJCQkkaW5wdXQudmFsKCRpbnB1dC52YWwoKSArIHNWYWx1ZS5zdWJzdHJpbmcobGFzdFdvcmQocHJldmlvdXNWYWx1ZSkubGVuZ3RoKSk7CisJCQkvLyBzZWxlY3QgdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIG5vdCB0eXBlZCBieSB0aGUgdXNlciAoc28gdGhlIG5leHQgY2hhcmFjdGVyIHdpbGwgZXJhc2UpCisJCQkkLkF1dG9jb21wbGV0ZXIuU2VsZWN0aW9uKGlucHV0LCBwcmV2aW91c1ZhbHVlLmxlbmd0aCwgcHJldmlvdXNWYWx1ZS5sZW5ndGggKyBzVmFsdWUubGVuZ3RoKTsKKwkJfQorCX07CisKKwlmdW5jdGlvbiBoaWRlUmVzdWx0cygpIHsKKwkJY2xlYXJUaW1lb3V0KHRpbWVvdXQpOworCQl0aW1lb3V0ID0gc2V0VGltZW91dChoaWRlUmVzdWx0c05vdywgMjAwKTsKKwl9OworCisJZnVuY3Rpb24gaGlkZVJlc3VsdHNOb3coKSB7CisJCXZhciB3YXNWaXNpYmxlID0gc2VsZWN0LnZpc2libGUoKTsKKwkJc2VsZWN0LmhpZGUoKTsKKwkJY2xlYXJUaW1lb3V0KHRpbWVvdXQpOworCQlzdG9wTG9hZGluZygpOworCQlpZiAob3B0aW9ucy5tdXN0TWF0Y2gpIHsKKwkJCS8vIGNhbGwgc2VhcmNoIGFuZCBydW4gY2FsbGJhY2sKKwkJCSRpbnB1dC5zZWFyY2goCisJCQkJZnVuY3Rpb24gKHJlc3VsdCl7CisJCQkJCS8vIGlmIG5vIHZhbHVlIGZvdW5kLCBjbGVhciB0aGUgaW5wdXQgYm94CisJCQkJCWlmKCAhcmVzdWx0ICkgeworCQkJCQkJaWYgKG9wdGlvbnMubXVsdGlwbGUpIHsKKwkJCQkJCQl2YXIgd29yZHMgPSB0cmltV29yZHMoJGlucHV0LnZhbCgpKS5zbGljZSgwLCAtMSk7CisJCQkJCQkJJGlucHV0LnZhbCggd29yZHMuam9pbihvcHRpb25zLm11bHRpcGxlU2VwYXJhdG9yKSArICh3b3Jkcy5sZW5ndGggPyBvcHRpb25zLm11bHRpcGxlU2VwYXJhdG9yIDogIiIpICk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJJGlucHV0LnZhbCggIiIgKTsKKwkJCQkJfQorCQkJCX0KKwkJCSk7CisJCX0KKwkJaWYgKHdhc1Zpc2libGUpCisJCQkvLyBwb3NpdGlvbiBjdXJzb3IgYXQgZW5kIG9mIGlucHV0IGZpZWxkCisJCQkkLkF1dG9jb21wbGV0ZXIuU2VsZWN0aW9uKGlucHV0LCBpbnB1dC52YWx1ZS5sZW5ndGgsIGlucHV0LnZhbHVlLmxlbmd0aCk7CisJfTsKKworCWZ1bmN0aW9uIHJlY2VpdmVEYXRhKHEsIGRhdGEpIHsKKwkJaWYgKCBkYXRhICYmIGRhdGEubGVuZ3RoICYmIGhhc0ZvY3VzICkgeworCQkJc3RvcExvYWRpbmcoKTsKKwkJCXNlbGVjdC5kaXNwbGF5KGRhdGEsIHEpOworCQkJYXV0b0ZpbGwocSwgZGF0YVswXS52YWx1ZSk7CisJCQlzZWxlY3Quc2hvdygpOworCQl9IGVsc2UgeworCQkJaGlkZVJlc3VsdHNOb3coKTsKKwkJfQorCX07CisKKwlmdW5jdGlvbiByZXF1ZXN0KHRlcm0sIHN1Y2Nlc3MsIGZhaWx1cmUpIHsKKwkJaWYgKCFvcHRpb25zLm1hdGNoQ2FzZSkKKwkJCXRlcm0gPSB0ZXJtLnRvTG93ZXJDYXNlKCk7CisJCXZhciBkYXRhID0gY2FjaGUubG9hZCh0ZXJtKTsKKwkJZGF0YSA9IG51bGw7IC8vIEF2b2lkIGJ1Z2d5IGNhY2hlIGFuZCBnbyB0byBTb2xyIGV2ZXJ5IHRpbWUgCisJCS8vIHJlY2lldmUgdGhlIGNhY2hlZCBkYXRhCisJCWlmIChkYXRhICYmIGRhdGEubGVuZ3RoKSB7CisJCQlzdWNjZXNzKHRlcm0sIGRhdGEpOworCQkvLyBpZiBhbiBBSkFYIHVybCBoYXMgYmVlbiBzdXBwbGllZCwgdHJ5IGxvYWRpbmcgdGhlIGRhdGEgbm93CisJCX0gZWxzZSBpZiggKHR5cGVvZiBvcHRpb25zLnVybCA9PSAic3RyaW5nIikgJiYgKG9wdGlvbnMudXJsLmxlbmd0aCA+IDApICl7CisJCQkKKwkJCXZhciBleHRyYVBhcmFtcyA9IHsKKwkJCQl0aW1lc3RhbXA6ICtuZXcgRGF0ZSgpCisJCQl9OworCQkJJC5lYWNoKG9wdGlvbnMuZXh0cmFQYXJhbXMsIGZ1bmN0aW9uKGtleSwgcGFyYW0pIHsKKwkJCQlleHRyYVBhcmFtc1trZXldID0gdHlwZW9mIHBhcmFtID09ICJmdW5jdGlvbiIgPyBwYXJhbSgpIDogcGFyYW07CisJCQl9KTsKKwkJCQorCQkJJC5hamF4KHsKKwkJCQkvLyB0cnkgdG8gbGV2ZXJhZ2UgYWpheFF1ZXVlIHBsdWdpbiB0byBhYm9ydCBwcmV2aW91cyByZXF1ZXN0cworCQkJCW1vZGU6ICJhYm9ydCIsCisJCQkJLy8gbGltaXQgYWJvcnRpb24gdG8gdGhpcyBpbnB1dAorCQkJCXBvcnQ6ICJhdXRvY29tcGxldGUiICsgaW5wdXQubmFtZSwKKwkJCQlkYXRhVHlwZTogb3B0aW9ucy5kYXRhVHlwZSwKKwkJCQl1cmw6IG9wdGlvbnMudXJsLAorCQkJCWRhdGE6ICQuZXh0ZW5kKHsKKwkJCQkJcTogbGFzdFdvcmQodGVybSksCisJCQkJCWxpbWl0OiBvcHRpb25zLm1heAorCQkJCX0sIGV4dHJhUGFyYW1zKSwKKwkJCQlzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7CisJCQkJCXZhciBwYXJzZWQgPSBvcHRpb25zLnBhcnNlICYmIG9wdGlvbnMucGFyc2UoZGF0YSkgfHwgcGFyc2UoZGF0YSk7CisJCQkJCWNhY2hlLmFkZCh0ZXJtLCBwYXJzZWQpOworCQkJCQlzdWNjZXNzKHRlcm0sIHBhcnNlZCk7CisJCQkJfQorCQkJfSk7CisJCX0gZWxzZSB7CisJCQkvLyBpZiB3ZSBoYXZlIGEgZmFpbHVyZSwgd2UgbmVlZCB0byBlbXB0eSB0aGUgbGlzdCAtLSB0aGlzIHByZXZlbnRzIHRoZSB0aGUgW1RBQl0ga2V5IGZyb20gc2VsZWN0aW5nIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgbWF0Y2gKKwkJCXNlbGVjdC5lbXB0eUxpc3QoKTsKKwkJCWZhaWx1cmUodGVybSk7CisJCX0KKwl9OworCQorCWZ1bmN0aW9uIHBhcnNlKGRhdGEpIHsKKwkJdmFyIHBhcnNlZCA9IFtdOworCQl2YXIgcm93cyA9IGRhdGEuc3BsaXQoIlxuIik7CisJCWZvciAodmFyIGk9MDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsKKwkJCXZhciByb3cgPSAkLnRyaW0ocm93c1tpXSk7CisJCQlpZiAocm93KSB7CisJCQkJcm93ID0gcm93LnNwbGl0KCJ8Iik7CisJCQkJcGFyc2VkW3BhcnNlZC5sZW5ndGhdID0geworCQkJCQlkYXRhOiByb3csCisJCQkJCXZhbHVlOiByb3dbMF0sCisJCQkJCXJlc3VsdDogb3B0aW9ucy5mb3JtYXRSZXN1bHQgJiYgb3B0aW9ucy5mb3JtYXRSZXN1bHQocm93LCByb3dbMF0pIHx8IHJvd1swXQorCQkJCX07CisJCQl9CisJCX0KKwkJcmV0dXJuIHBhcnNlZDsKKwl9OworCisJZnVuY3Rpb24gc3RvcExvYWRpbmcoKSB7CisJCSRpbnB1dC5yZW1vdmVDbGFzcyhvcHRpb25zLmxvYWRpbmdDbGFzcyk7CisJfTsKKworfTsKKworJC5BdXRvY29tcGxldGVyLmRlZmF1bHRzID0geworCWlucHV0Q2xhc3M6ICJhY19pbnB1dCIsCisJcmVzdWx0c0NsYXNzOiAiYWNfcmVzdWx0cyIsCisJbG9hZGluZ0NsYXNzOiAiYWNfbG9hZGluZyIsCisJbWluQ2hhcnM6IDEsCisJZGVsYXk6IDQwMCwKKwltYXRjaENhc2U6IGZhbHNlLAorCW1hdGNoU3Vic2V0OiB0cnVlLAorCW1hdGNoQ29udGFpbnM6IGZhbHNlLAorCWNhY2hlTGVuZ3RoOiAxMCwKKwltYXg6IDEwMCwKKwltdXN0TWF0Y2g6IGZhbHNlLAorCWV4dHJhUGFyYW1zOiB7fSwKKwlzZWxlY3RGaXJzdDogZmFsc2UsCisJZm9ybWF0SXRlbTogZnVuY3Rpb24ocm93KSB7IHJldHVybiByb3dbMF07IH0sCisJZm9ybWF0TWF0Y2g6IG51bGwsCisJYXV0b0ZpbGw6IGZhbHNlLAorCXdpZHRoOiAwLAorCW11bHRpcGxlOiBmYWxzZSwKKwltdWx0aXBsZVNlcGFyYXRvcjogIiwgIiwKKwloaWdobGlnaHQ6IGZ1bmN0aW9uKHZhbHVlLCB0ZXJtKSB7CisJCXJldHVybiB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoIig/IVteJjtdKzspKD8hPFtePD5dKikoIiArIHRlcm0ucmVwbGFjZSgvKFtcXlwkXChcKVxbXF1ce1x9XCpcLlwrXD9cfFxcXSkvZ2ksICJcXCQxIikgKyAiKSg/IVtePD5dKj4pKD8hW14mO10rOykiLCAiZ2kiKSwgIjxzdHJvbmc+JDE8L3N0cm9uZz4iKTsKKwl9LAorICAgIHNjcm9sbDogdHJ1ZSwKKyAgICBzY3JvbGxIZWlnaHQ6IDE4MAorfTsKKworJC5BdXRvY29tcGxldGVyLkNhY2hlID0gZnVuY3Rpb24ob3B0aW9ucykgeworCisJdmFyIGRhdGEgPSB7fTsKKwl2YXIgbGVuZ3RoID0gMDsKKwkKKwlmdW5jdGlvbiBtYXRjaFN1YnNldChzLCBzdWIpIHsKKwkJaWYgKCFvcHRpb25zLm1hdGNoQ2FzZSkgCisJCQlzID0gcy50b0xvd2VyQ2FzZSgpOworCQl2YXIgaSA9IHMuaW5kZXhPZihzdWIpOworCQlpZiAob3B0aW9ucy5tYXRjaENvbnRhaW5zID09ICJ3b3JkIil7CisJCQlpID0gcy50b0xvd2VyQ2FzZSgpLnNlYXJjaCgiXFxiIiArIHN1Yi50b0xvd2VyQ2FzZSgpKTsKKwkJfQorCQlpZiAoaSA9PSAtMSkgcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gaSA9PSAwIHx8IG9wdGlvbnMubWF0Y2hDb250YWluczsKKwl9OworCQorCWZ1bmN0aW9uIGFkZChxLCB2YWx1ZSkgeworCQlpZiAobGVuZ3RoID4gb3B0aW9ucy5jYWNoZUxlbmd0aCl7CisJCQlmbHVzaCgpOworCQl9CisJCWlmICghZGF0YVtxXSl7IAorCQkJbGVuZ3RoKys7CisJCX0KKwkJZGF0YVtxXSA9IHZhbHVlOworCX0KKwkKKwlmdW5jdGlvbiBwb3B1bGF0ZSgpeworCQlpZiggIW9wdGlvbnMuZGF0YSApIHJldHVybiBmYWxzZTsKKwkJLy8gdHJhY2sgdGhlIG1hdGNoZXMKKwkJdmFyIHN0TWF0Y2hTZXRzID0ge30sCisJCQludWxsRGF0YSA9IDA7CisKKwkJLy8gbm8gdXJsIHdhcyBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBjYWNoZSBsZW5ndGggdG8gbWFrZSBzdXJlIGl0IGZpdHMgdGhlIGxvY2FsIGRhdGEgc3RvcmUKKwkJaWYoICFvcHRpb25zLnVybCApIG9wdGlvbnMuY2FjaGVMZW5ndGggPSAxOworCQkKKwkJLy8gdHJhY2sgYWxsIG9wdGlvbnMgZm9yIG1pbkNoYXJzID0gMAorCQlzdE1hdGNoU2V0c1siIl0gPSBbXTsKKwkJCisJCS8vIGxvb3AgdGhyb3VnaCB0aGUgYXJyYXkgYW5kIGNyZWF0ZSBhIGxvb2t1cCBzdHJ1Y3R1cmUKKwkJZm9yICggdmFyIGkgPSAwLCBvbCA9IG9wdGlvbnMuZGF0YS5sZW5ndGg7IGkgPCBvbDsgaSsrICkgeworCQkJdmFyIHJhd1ZhbHVlID0gb3B0aW9ucy5kYXRhW2ldOworCQkJLy8gaWYgcmF3VmFsdWUgaXMgYSBzdHJpbmcsIG1ha2UgYW4gYXJyYXkgb3RoZXJ3aXNlIGp1c3QgcmVmZXJlbmNlIHRoZSBhcnJheQorCQkJcmF3VmFsdWUgPSAodHlwZW9mIHJhd1ZhbHVlID09ICJzdHJpbmciKSA/IFtyYXdWYWx1ZV0gOiByYXdWYWx1ZTsKKwkJCQorCQkJdmFyIHZhbHVlID0gb3B0aW9ucy5mb3JtYXRNYXRjaChyYXdWYWx1ZSwgaSsxLCBvcHRpb25zLmRhdGEubGVuZ3RoKTsKKwkJCWlmICggdmFsdWUgPT09IGZhbHNlICkKKwkJCQljb250aW51ZTsKKwkJCQkKKwkJCXZhciBmaXJzdENoYXIgPSB2YWx1ZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKTsKKwkJCS8vIGlmIG5vIGxvb2t1cCBhcnJheSBmb3IgdGhpcyBjaGFyYWN0ZXIgZXhpc3RzLCBsb29rIGl0IHVwIG5vdworCQkJaWYoICFzdE1hdGNoU2V0c1tmaXJzdENoYXJdICkgCisJCQkJc3RNYXRjaFNldHNbZmlyc3RDaGFyXSA9IFtdOworCisJCQkvLyBpZiB0aGUgbWF0Y2ggaXMgYSBzdHJpbmcKKwkJCXZhciByb3cgPSB7CisJCQkJdmFsdWU6IHZhbHVlLAorCQkJCWRhdGE6IHJhd1ZhbHVlLAorCQkJCXJlc3VsdDogb3B0aW9ucy5mb3JtYXRSZXN1bHQgJiYgb3B0aW9ucy5mb3JtYXRSZXN1bHQocmF3VmFsdWUpIHx8IHZhbHVlCisJCQl9OworCQkJCisJCQkvLyBwdXNoIHRoZSBjdXJyZW50IG1hdGNoIGludG8gdGhlIHNldCBsaXN0CisJCQlzdE1hdGNoU2V0c1tmaXJzdENoYXJdLnB1c2gocm93KTsKKworCQkJLy8ga2VlcCB0cmFjayBvZiBtaW5DaGFycyB6ZXJvIGl0ZW1zCisJCQlpZiAoIG51bGxEYXRhKysgPCBvcHRpb25zLm1heCApIHsKKwkJCQlzdE1hdGNoU2V0c1siIl0ucHVzaChyb3cpOworCQkJfQorCQl9OworCisJCS8vIGFkZCB0aGUgZGF0YSBpdGVtcyB0byB0aGUgY2FjaGUKKwkJJC5lYWNoKHN0TWF0Y2hTZXRzLCBmdW5jdGlvbihpLCB2YWx1ZSkgeworCQkJLy8gaW5jcmVhc2UgdGhlIGNhY2hlIHNpemUKKwkJCW9wdGlvbnMuY2FjaGVMZW5ndGgrKzsKKwkJCS8vIGFkZCB0byB0aGUgY2FjaGUKKwkJCWFkZChpLCB2YWx1ZSk7CisJCX0pOworCX0KKwkKKwkvLyBwb3B1bGF0ZSBhbnkgZXhpc3RpbmcgZGF0YQorCXNldFRpbWVvdXQocG9wdWxhdGUsIDI1KTsKKwkKKwlmdW5jdGlvbiBmbHVzaCgpeworCQlkYXRhID0ge307CisJCWxlbmd0aCA9IDA7CisJfQorCQorCXJldHVybiB7CisJCWZsdXNoOiBmbHVzaCwKKwkJYWRkOiBhZGQsCisJCXBvcHVsYXRlOiBwb3B1bGF0ZSwKKwkJbG9hZDogZnVuY3Rpb24ocSkgeworCQkJaWYgKCFvcHRpb25zLmNhY2hlTGVuZ3RoIHx8ICFsZW5ndGgpCisJCQkJcmV0dXJuIG51bGw7CisJCQkvKiAKKwkJCSAqIGlmIGRlYWxpbmcgdy9sb2NhbCBkYXRhIGFuZCBtYXRjaENvbnRhaW5zIHRoYW4gd2UgbXVzdCBtYWtlIHN1cmUKKwkJCSAqIHRvIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGRhdGEgY29sbGVjdGlvbnMgbG9va2luZyBmb3IgbWF0Y2hlcworCQkJICovCisJCQlpZiggIW9wdGlvbnMudXJsICYmIG9wdGlvbnMubWF0Y2hDb250YWlucyApeworCQkJCS8vIHRyYWNrIGFsbCBtYXRjaGVzCisJCQkJdmFyIGNzdWIgPSBbXTsKKwkJCQkvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBkYXRhIGdyaWRzIGZvciBtYXRjaGVzCisJCQkJZm9yKCB2YXIgayBpbiBkYXRhICl7CisJCQkJCS8vIGRvbid0IHNlYXJjaCB0aHJvdWdoIHRoZSBzdE1hdGNoU2V0c1siIl0gKG1pbkNoYXJzOiAwKSBjYWNoZQorCQkJCQkvLyB0aGlzIHByZXZlbnRzIGR1cGxpY2F0ZXMKKwkJCQkJaWYoIGsubGVuZ3RoID4gMCApeworCQkJCQkJdmFyIGMgPSBkYXRhW2tdOworCQkJCQkJJC5lYWNoKGMsIGZ1bmN0aW9uKGksIHgpIHsKKwkJCQkJCQkvLyBpZiB3ZSd2ZSBnb3QgYSBtYXRjaCwgYWRkIGl0IHRvIHRoZSBhcnJheQorCQkJCQkJCWlmIChtYXRjaFN1YnNldCh4LnZhbHVlLCBxKSkgeworCQkJCQkJCQljc3ViLnB1c2goeCk7CisJCQkJCQkJfQorCQkJCQkJfSk7CisJCQkJCX0KKwkJCQl9CQkJCQorCQkJCXJldHVybiBjc3ViOworCQkJfSBlbHNlIAorCQkJLy8gaWYgdGhlIGV4YWN0IGl0ZW0gZXhpc3RzLCB1c2UgaXQKKwkJCWlmIChkYXRhW3FdKXsKKwkJCQlyZXR1cm4gZGF0YVtxXTsKKwkJCX0gZWxzZQorCQkJaWYgKG9wdGlvbnMubWF0Y2hTdWJzZXQpIHsKKwkJCQlmb3IgKHZhciBpID0gcS5sZW5ndGggLSAxOyBpID49IG9wdGlvbnMubWluQ2hhcnM7IGktLSkgeworCQkJCQl2YXIgYyA9IGRhdGFbcS5zdWJzdHIoMCwgaSldOworCQkJCQlpZiAoYykgeworCQkJCQkJdmFyIGNzdWIgPSBbXTsKKwkJCQkJCSQuZWFjaChjLCBmdW5jdGlvbihpLCB4KSB7CisJCQkJCQkJaWYgKG1hdGNoU3Vic2V0KHgudmFsdWUsIHEpKSB7CisJCQkJCQkJCWNzdWJbY3N1Yi5sZW5ndGhdID0geDsKKwkJCQkJCQl9CisJCQkJCQl9KTsKKwkJCQkJCXJldHVybiBjc3ViOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9OworfTsKKworJC5BdXRvY29tcGxldGVyLlNlbGVjdCA9IGZ1bmN0aW9uIChvcHRpb25zLCBpbnB1dCwgc2VsZWN0LCBjb25maWcpIHsKKwl2YXIgQ0xBU1NFUyA9IHsKKwkJQUNUSVZFOiAiYWNfb3ZlciIKKwl9OworCQorCXZhciBsaXN0SXRlbXMsCisJCWFjdGl2ZSA9IC0xLAorCQlkYXRhLAorCQl0ZXJtID0gIiIsCisJCW5lZWRzSW5pdCA9IHRydWUsCisJCWVsZW1lbnQsCisJCWxpc3Q7CisJCisJLy8gQ3JlYXRlIHJlc3VsdHMKKwlmdW5jdGlvbiBpbml0KCkgeworCQlpZiAoIW5lZWRzSW5pdCkKKwkJCXJldHVybjsKKwkJZWxlbWVudCA9ICQoIjxkaXYvPiIpCisJCS5oaWRlKCkKKwkJLmFkZENsYXNzKG9wdGlvbnMucmVzdWx0c0NsYXNzKQorCQkuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCisJCS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTsKKwkKKwkJbGlzdCA9ICQoIjx1bC8+IikuYXBwZW5kVG8oZWxlbWVudCkubW91c2VvdmVyKCBmdW5jdGlvbihldmVudCkgeworCQkJaWYodGFyZ2V0KGV2ZW50KS5ub2RlTmFtZSAmJiB0YXJnZXQoZXZlbnQpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gJ0xJJykgeworCSAgICAgICAgICAgIGFjdGl2ZSA9ICQoImxpIiwgbGlzdCkucmVtb3ZlQ2xhc3MoQ0xBU1NFUy5BQ1RJVkUpLmluZGV4KHRhcmdldChldmVudCkpOworCQkJICAgICQodGFyZ2V0KGV2ZW50KSkuYWRkQ2xhc3MoQ0xBU1NFUy5BQ1RJVkUpOyAgICAgICAgICAgIAorCSAgICAgICAgfQorCQl9KS5jbGljayhmdW5jdGlvbihldmVudCkgeworCQkJJCh0YXJnZXQoZXZlbnQpKS5hZGRDbGFzcyhDTEFTU0VTLkFDVElWRSk7CisJCQlzZWxlY3QoKTsKKwkJCS8vIFRPRE8gcHJvdmlkZSBvcHRpb24gdG8gYXZvaWQgc2V0dGluZyBmb2N1cyBhZ2FpbiBhZnRlciBzZWxlY3Rpb24/IHVzZWZ1bCBmb3IgY2xlYW51cC1vbi1mb2N1cworCQkJaW5wdXQuZm9jdXMoKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfSkubW91c2Vkb3duKGZ1bmN0aW9uKCkgeworCQkJY29uZmlnLm1vdXNlRG93bk9uU2VsZWN0ID0gdHJ1ZTsKKwkJfSkubW91c2V1cChmdW5jdGlvbigpIHsKKwkJCWNvbmZpZy5tb3VzZURvd25PblNlbGVjdCA9IGZhbHNlOworCQl9KTsKKwkJCisJCWlmKCBvcHRpb25zLndpZHRoID4gMCApCisJCQllbGVtZW50LmNzcygid2lkdGgiLCBvcHRpb25zLndpZHRoKTsKKwkJCQorCQluZWVkc0luaXQgPSBmYWxzZTsKKwl9IAorCQorCWZ1bmN0aW9uIHRhcmdldChldmVudCkgeworCQl2YXIgZWxlbWVudCA9IGV2ZW50LnRhcmdldDsKKwkJd2hpbGUoZWxlbWVudCAmJiBlbGVtZW50LnRhZ05hbWUgIT0gIkxJIikKKwkJCWVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7CisJCS8vIG1vcmUgZnVuIHdpdGggSUUsIHNvbWV0aW1lcyBldmVudC50YXJnZXQgaXMgZW1wdHksIGp1c3QgaWdub3JlIGl0IHRoZW4KKwkJaWYoIWVsZW1lbnQpCisJCQlyZXR1cm4gW107CisJCXJldHVybiBlbGVtZW50OworCX0KKworCWZ1bmN0aW9uIG1vdmVTZWxlY3Qoc3RlcCkgeworCQlsaXN0SXRlbXMuc2xpY2UoYWN0aXZlLCBhY3RpdmUgKyAxKS5yZW1vdmVDbGFzcyhDTEFTU0VTLkFDVElWRSk7CisJCW1vdmVQb3NpdGlvbihzdGVwKTsKKyAgICAgICAgdmFyIGFjdGl2ZUl0ZW0gPSBsaXN0SXRlbXMuc2xpY2UoYWN0aXZlLCBhY3RpdmUgKyAxKS5hZGRDbGFzcyhDTEFTU0VTLkFDVElWRSk7CisgICAgICAgIGlmKG9wdGlvbnMuc2Nyb2xsKSB7CisgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGxpc3RJdGVtcy5zbGljZSgwLCBhY3RpdmUpLmVhY2goZnVuY3Rpb24oKSB7CisJCQkJb2Zmc2V0ICs9IHRoaXMub2Zmc2V0SGVpZ2h0OworCQkJfSk7CisgICAgICAgICAgICBpZigob2Zmc2V0ICsgYWN0aXZlSXRlbVswXS5vZmZzZXRIZWlnaHQgLSBsaXN0LnNjcm9sbFRvcCgpKSA+IGxpc3RbMF0uY2xpZW50SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbGlzdC5zY3JvbGxUb3Aob2Zmc2V0ICsgYWN0aXZlSXRlbVswXS5vZmZzZXRIZWlnaHQgLSBsaXN0LmlubmVySGVpZ2h0KCkpOworICAgICAgICAgICAgfSBlbHNlIGlmKG9mZnNldCA8IGxpc3Quc2Nyb2xsVG9wKCkpIHsKKyAgICAgICAgICAgICAgICBsaXN0LnNjcm9sbFRvcChvZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisJfTsKKwkKKwlmdW5jdGlvbiBtb3ZlUG9zaXRpb24oc3RlcCkgeworCQlhY3RpdmUgKz0gc3RlcDsKKwkJaWYgKGFjdGl2ZSA8IDApIHsKKwkJCWFjdGl2ZSA9IGxpc3RJdGVtcy5zaXplKCkgLSAxOworCQl9IGVsc2UgaWYgKGFjdGl2ZSA+PSBsaXN0SXRlbXMuc2l6ZSgpKSB7CisJCQlhY3RpdmUgPSAwOworCQl9CisJfQorCQorCWZ1bmN0aW9uIGxpbWl0TnVtYmVyT2ZJdGVtcyhhdmFpbGFibGUpIHsKKwkJcmV0dXJuIG9wdGlvbnMubWF4ICYmIG9wdGlvbnMubWF4IDwgYXZhaWxhYmxlCisJCQk/IG9wdGlvbnMubWF4CisJCQk6IGF2YWlsYWJsZTsKKwl9CisJCisJZnVuY3Rpb24gZmlsbExpc3QoKSB7CisJCWxpc3QuZW1wdHkoKTsKKwkJdmFyIG1heCA9IGxpbWl0TnVtYmVyT2ZJdGVtcyhkYXRhLmxlbmd0aCk7CisJCWZvciAodmFyIGk9MDsgaSA8IG1heDsgaSsrKSB7CisJCQlpZiAoIWRhdGFbaV0pCisJCQkJY29udGludWU7CisJCQl2YXIgZm9ybWF0dGVkID0gb3B0aW9ucy5mb3JtYXRJdGVtKGRhdGFbaV0uZGF0YSwgaSsxLCBtYXgsIGRhdGFbaV0udmFsdWUsIHRlcm0pOworCQkJaWYgKCBmb3JtYXR0ZWQgPT09IGZhbHNlICkKKwkJCQljb250aW51ZTsKKwkJCXZhciBsaSA9ICQoIjxsaS8+IikuaHRtbCggb3B0aW9ucy5oaWdobGlnaHQoZm9ybWF0dGVkLCB0ZXJtKSApLmFkZENsYXNzKGklMiA9PSAwID8gImFjX2V2ZW4iIDogImFjX29kZCIpLmFwcGVuZFRvKGxpc3QpWzBdOworCQkJJC5kYXRhKGxpLCAiYWNfZGF0YSIsIGRhdGFbaV0pOworCQl9CisJCWxpc3RJdGVtcyA9IGxpc3QuZmluZCgibGkiKTsKKwkJaWYgKCBvcHRpb25zLnNlbGVjdEZpcnN0ICkgeworCQkJbGlzdEl0ZW1zLnNsaWNlKDAsIDEpLmFkZENsYXNzKENMQVNTRVMuQUNUSVZFKTsKKwkJCWFjdGl2ZSA9IDA7CisJCX0KKwkJLy8gYXBwbHkgYmdpZnJhbWUgaWYgYXZhaWxhYmxlCisJCWlmICggJC5mbi5iZ2lmcmFtZSApCisJCQlsaXN0LmJnaWZyYW1lKCk7CisJfQorCQorCXJldHVybiB7CisJCWRpc3BsYXk6IGZ1bmN0aW9uKGQsIHEpIHsKKwkJCWluaXQoKTsKKwkJCWRhdGEgPSBkOworCQkJdGVybSA9IHE7CisJCQlmaWxsTGlzdCgpOworCQl9LAorCQluZXh0OiBmdW5jdGlvbigpIHsKKwkJCW1vdmVTZWxlY3QoMSk7CisJCX0sCisJCXByZXY6IGZ1bmN0aW9uKCkgeworCQkJbW92ZVNlbGVjdCgtMSk7CisJCX0sCisJCXBhZ2VVcDogZnVuY3Rpb24oKSB7CisJCQlpZiAoYWN0aXZlICE9IDAgJiYgYWN0aXZlIC0gOCA8IDApIHsKKwkJCQltb3ZlU2VsZWN0KCAtYWN0aXZlICk7CisJCQl9IGVsc2UgeworCQkJCW1vdmVTZWxlY3QoLTgpOworCQkJfQorCQl9LAorCQlwYWdlRG93bjogZnVuY3Rpb24oKSB7CisJCQlpZiAoYWN0aXZlICE9IGxpc3RJdGVtcy5zaXplKCkgLSAxICYmIGFjdGl2ZSArIDggPiBsaXN0SXRlbXMuc2l6ZSgpKSB7CisJCQkJbW92ZVNlbGVjdCggbGlzdEl0ZW1zLnNpemUoKSAtIDEgLSBhY3RpdmUgKTsKKwkJCX0gZWxzZSB7CisJCQkJbW92ZVNlbGVjdCg4KTsKKwkJCX0KKwkJfSwKKwkJaGlkZTogZnVuY3Rpb24oKSB7CisJCQllbGVtZW50ICYmIGVsZW1lbnQuaGlkZSgpOworCQkJbGlzdEl0ZW1zICYmIGxpc3RJdGVtcy5yZW1vdmVDbGFzcyhDTEFTU0VTLkFDVElWRSk7CisJCQlhY3RpdmUgPSAtMTsKKwkJfSwKKwkJdmlzaWJsZSA6IGZ1bmN0aW9uKCkgeworCQkJcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5pcygiOnZpc2libGUiKTsKKwkJfSwKKwkJY3VycmVudDogZnVuY3Rpb24oKSB7CisJCQlyZXR1cm4gdGhpcy52aXNpYmxlKCkgJiYgKGxpc3RJdGVtcy5maWx0ZXIoIi4iICsgQ0xBU1NFUy5BQ1RJVkUpWzBdIHx8IG9wdGlvbnMuc2VsZWN0Rmlyc3QgJiYgbGlzdEl0ZW1zWzBdKTsKKwkJfSwKKwkJc2hvdzogZnVuY3Rpb24oKSB7CisJCQl2YXIgb2Zmc2V0ID0gJChpbnB1dCkub2Zmc2V0KCk7CisJCQllbGVtZW50LmNzcyh7CisJCQkJd2lkdGg6IHR5cGVvZiBvcHRpb25zLndpZHRoID09ICJzdHJpbmciIHx8IG9wdGlvbnMud2lkdGggPiAwID8gb3B0aW9ucy53aWR0aCA6ICQoaW5wdXQpLndpZHRoKCksCisJCQkJdG9wOiBvZmZzZXQudG9wICsgaW5wdXQub2Zmc2V0SGVpZ2h0LAorCQkJCWxlZnQ6IG9mZnNldC5sZWZ0CisJCQl9KS5zaG93KCk7CisgICAgICAgICAgICBpZihvcHRpb25zLnNjcm9sbCkgeworICAgICAgICAgICAgICAgIGxpc3Quc2Nyb2xsVG9wKDApOworICAgICAgICAgICAgICAgIGxpc3QuY3NzKHsKKwkJCQkJbWF4SGVpZ2h0OiBvcHRpb25zLnNjcm9sbEhlaWdodCwKKwkJCQkJb3ZlcmZsb3c6ICdhdXRvJworCQkJCX0pOworCQkJCQorICAgICAgICAgICAgICAgIGlmKCQuYnJvd3Nlci5tc2llICYmIHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlLm1heEhlaWdodCA9PT0gInVuZGVmaW5lZCIpIHsKKwkJCQkJdmFyIGxpc3RIZWlnaHQgPSAwOworCQkJCQlsaXN0SXRlbXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQkJCWxpc3RIZWlnaHQgKz0gdGhpcy5vZmZzZXRIZWlnaHQ7CisJCQkJCX0pOworCQkJCQl2YXIgc2Nyb2xsYmFyc1Zpc2libGUgPSBsaXN0SGVpZ2h0ID4gb3B0aW9ucy5zY3JvbGxIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuY3NzKCdoZWlnaHQnLCBzY3JvbGxiYXJzVmlzaWJsZSA/IG9wdGlvbnMuc2Nyb2xsSGVpZ2h0IDogbGlzdEhlaWdodCApOworCQkJCQlpZiAoIXNjcm9sbGJhcnNWaXNpYmxlKSB7CisJCQkJCQkvLyBJRSBkb2Vzbid0IHJlY2FsY3VsYXRlIHdpZHRoIHdoZW4gc2Nyb2xsYmFyIGRpc2FwcGVhcnMKKwkJCQkJCWxpc3RJdGVtcy53aWR0aCggbGlzdC53aWR0aCgpIC0gcGFyc2VJbnQobGlzdEl0ZW1zLmNzcygicGFkZGluZy1sZWZ0IikpIC0gcGFyc2VJbnQobGlzdEl0ZW1zLmNzcygicGFkZGluZy1yaWdodCIpKSApOworCQkJCQl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCQl9LAorCQlzZWxlY3RlZDogZnVuY3Rpb24oKSB7CisJCQl2YXIgc2VsZWN0ZWQgPSBsaXN0SXRlbXMgJiYgbGlzdEl0ZW1zLmZpbHRlcigiLiIgKyBDTEFTU0VTLkFDVElWRSkucmVtb3ZlQ2xhc3MoQ0xBU1NFUy5BQ1RJVkUpOworCQkJcmV0dXJuIHNlbGVjdGVkICYmIHNlbGVjdGVkLmxlbmd0aCAmJiAkLmRhdGEoc2VsZWN0ZWRbMF0sICJhY19kYXRhIik7CisJCX0sCisJCWVtcHR5TGlzdDogZnVuY3Rpb24gKCl7CisJCQlsaXN0ICYmIGxpc3QuZW1wdHkoKTsKKwkJfSwKKwkJdW5iaW5kOiBmdW5jdGlvbigpIHsKKwkJCWVsZW1lbnQgJiYgZWxlbWVudC5yZW1vdmUoKTsKKwkJfQorCX07Cit9OworCiskLkF1dG9jb21wbGV0ZXIuU2VsZWN0aW9uID0gZnVuY3Rpb24oZmllbGQsIHN0YXJ0LCBlbmQpIHsKKwlpZiggZmllbGQuY3JlYXRlVGV4dFJhbmdlICl7CisJCXZhciBzZWxSYW5nZSA9IGZpZWxkLmNyZWF0ZVRleHRSYW5nZSgpOworCQlzZWxSYW5nZS5jb2xsYXBzZSh0cnVlKTsKKwkJc2VsUmFuZ2UubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLCBzdGFydCk7CisJCXNlbFJhbmdlLm1vdmVFbmQoImNoYXJhY3RlciIsIGVuZCk7CisJCXNlbFJhbmdlLnNlbGVjdCgpOworCX0gZWxzZSBpZiggZmllbGQuc2V0U2VsZWN0aW9uUmFuZ2UgKXsKKwkJZmllbGQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZCk7CisJfSBlbHNlIHsKKwkJaWYoIGZpZWxkLnNlbGVjdGlvblN0YXJ0ICl7CisJCQlmaWVsZC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0OworCQkJZmllbGQuc2VsZWN0aW9uRW5kID0gZW5kOworCQl9CisJfQorCWZpZWxkLmZvY3VzKCk7Cit9OworCit9KShqUXVlcnkpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi92ZWxvY2l0eS9tYWluLmNzcyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYvdmVsb2NpdHkvbWFpbi5jc3MKaW5kZXggM2U3MWJlZi4uNjcyNzhmYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi92ZWxvY2l0eS9tYWluLmNzcworKysgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3ZlbG9jaXR5L21haW4uY3NzCkBAIC0xLDIzMSArMSwyMzEgQEAKLSNhZG1pbnsNCi0gIHRleHQtYWxpZ246IHJpZ2h0Ow0KLSAgdmVydGljYWwtYWxpZ246IHRvcDsgDQotfQ0KLQ0KLSNoZWFkew0KLSAgd2lkdGg6IDEwMCU7DQotfQ0KLS5hcnJheS1maWVsZCB7DQotICBib3JkZXI6IDJweCBzb2xpZCAjNDc0NzQ3Ow0KLSAgYmFja2dyb3VuZDogI0ZGRTlEODsNCi0gIHBhZGRpbmc6IDVweDsNCi0gIG1hcmdpbjogNXB4Ow0KLX0NCi0NCi0uYXJyYXktZmllbGQtbGlzdCBsaSB7DQotICBsaXN0LXN0eWxlOiBjaXJjbGU7DQotICBtYXJnaW4tbGVmdDogMjBweDsNCi19DQotDQotLnBhcnNlZF9xdWVyeV9oZWFkZXIgew0KLSAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7DQotICBmb250LXNpemU6IDEwcHQ7DQotICBmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotLnBhcnNlZF9xdWVyeSB7DQotICBmb250LWZhbWlseTogQ291cmllciwgQ291cmllciBOZXcsIG1vbm9zcGFjZWQ7DQotICBmb250LXNpemU6IDEwcHQ7DQotICBmb250LXdlaWdodDogbm9ybWFsOw0KLX0NCi0NCi1ib2R5IHsNCi0gIGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOw0KLSAgZm9udC1zaXplOiAxMHB0Ow0KLX0NCi0NCi1hIHsNCi0gIGNvbG9yOiAjNDNhNGIxOw0KLX0NCi0NCi0ubmF2aWdhdG9ycyB7DQotICBmbG9hdDogbGVmdDsNCi0gIG1hcmdpbjogNXB4Ow0KLSAgbWFyZ2luLXRvcDogMHB4Ow0KLSAgd2lkdGg6IDE4NXB4Ow0KLSAgcGFkZGluZzogNXB4Ow0KLSAgdG9wOiAtMjBweDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsgIA0KLX0NCi0NCi0udGFicy1iYXIgew0KLSAgcGFkZGluZzogNXB4Ow0KLSAgd2lkdGg6IDEwMCU7DQotICBib3JkZXI6IDFweCBzb2xpZDsNCi0gIGJvcmRlci13aWR0aDogMHB4IDBweCAxcHggMHB4Ow0KLX0NCi0udGFiIHsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgcGFkZGluZzogNXB4Ow0KLSAgbWFyZ2luOiAwcHggNXB4Ow0KLSAgYm9yZGVyOiAxcHggc29saWQ7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkOw0KLSAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4Ow0KLSAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsNCi19DQotLnRhYjpob3ZlciB7DQotICBiYWNrZ3JvdW5kOiAjRkVDMjkzOw0KLX0NCi0udGFiLnNlbGVjdGVkIHsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQotICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZmZmZmZjsNCi19DQotDQotLm5hdmlnYXRvcnMgaDIgew0KLSAgYmFja2dyb3VuZDogI0ZFQzI5MzsNCi0gIHBhZGRpbmc6IDJweCA1cHg7DQotfQ0KLQ0KLS5uYXZpZ2F0b3JzIHVsIHsNCi0gIGxpc3Qtc3R5bGU6IG5vbmU7DQotICBtYXJnaW46IDA7DQotICBtYXJnaW4tYm90dG9tOiA1cHg7DQotICBtYXJnaW4tdG9wOiA1cHg7DQotICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQotfQ0KLQ0KLS5uYXZpZ2F0b3JzIHVsIGxpIHsNCi0gIGNvbG9yOiAjOTk5Ow0KLSAgcGFkZGluZzogMnB4Ow0KLX0NCi0NCi0NCi0NCi0uZmFjZXQtZmllbGQgew0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLS5oaWdobGlnaHQgew0KLSAgY29sb3I6IHdoaXRlOw0KLSAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTsNCi0gIGJvcmRlcjogMXB4IGJsYWNrIHNvbGlkOw0KLX0NCi0NCi0uaGlnaGxpZ2h0LWJveCB7DQotICBtYXJnaW4tbGVmdDogMTVweDsNCi19DQotDQotLmZpZWxkLW5hbWUgew0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLS5oaWdobGlnaHRlZC1mYWNldC1maWVsZCB7DQotICBiYWNrZ3JvdW5kOiB3aGl0ZTsNCi19DQotDQotLmNvbnN0cmFpbnRzIHsNCi0gIG1hcmdpbi10b3A6IDEwcHg7DQotfQ0KLQ0KLSNxdWVyeS1mb3Jtew0KLSAgd2lkdGg6IDgwJTsNCi19DQotDQotDQotDQotLnF1ZXJ5LWJveCwgLmNvbnN0cmFpbnRzIHsNCi0gIHBhZGRpbmc6IDVweDsNCi0gIG1hcmdpbjogNXB4Ow0KLSAgZm9udC13ZWlnaHQ6IG5vcm1hbDsNCi0gIGZvbnQtc2l6ZTogMjRweDsNCi0gIGxldHRlci1zcGFjaW5nOiAwLjA4ZW07DQotfQ0KLQ0KLS5xdWVyeS1ib3ggI3Egew0KLSAgbWFyZ2luLWxlZnQ6IDhweDsNCi0gIHdpZHRoOiA2MCU7DQotICBoZWlnaHQ6IDUwcHg7DQotICBib3JkZXI6IDFweCBzb2xpZCAjOTk5Ow0KLSAgZm9udC1zaXplOiAxZW07DQotICBwYWRkaW5nOiAwLjRlbTsNCi19DQotDQotLnF1ZXJ5LWJveCB7DQotICANCi19DQotDQotLnF1ZXJ5LWJvb3N0IHsNCi0gIA0KLSAgdG9wOiAxMHB4Ow0KLSAgbGVmdDogNTBweDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGZvbnQtc2l6ZTogMC44ZW07DQotfQ0KLQ0KLS5xdWVyeS1ib3ggLmlucHV0c3sNCi0gIGxlZnQ6IDE4MHB4Ow0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgDQotfQ0KLQ0KLSNsb2dvIHsNCi0gIHdpZHRoOiAxMTVweDsNCi0gIG1hcmdpbjogMHB4IDBweCAyMHB4IDEycHg7DQotICBib3JkZXItc3R5bGU6IG5vbmU7DQotfQ0KLQ0KLS5wYWdpbmF0aW9uIHsNCi0gIHBhZGRpbmctbGVmdDogMzMlOw0KLSAgYmFja2dyb3VuZDogI2VlZTsNCi0gIG1hcmdpbjogNXB4Ow0KLSAgbWFyZ2luLWxlZnQ6IDIxMHB4Ow0KLSAgcGFkZGluZy10b3A6IDVweDsNCi0gIHBhZGRpbmctYm90dG9tOiA1cHg7DQotfQ0KLQ0KLS5yZXN1bHQtZG9jdW1lbnQgew0KLSAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsNCi0gIHBhZGRpbmc6IDVweDsNCi0gIG1hcmdpbjogNXB4Ow0KLSAgbWFyZ2luLWxlZnQ6IDIxMHB4Ow0KLSAgbWFyZ2luLWJvdHRvbTogMTVweDsNCi19DQotDQotLnJlc3VsdC1kb2N1bWVudCBkaXZ7DQotICBwYWRkaW5nOiA1cHg7DQotfQ0KLQ0KLS5yZXN1bHQtdGl0bGV7DQotICB3aWR0aDo2MCU7DQotfQ0KLQ0KLS5yZXN1bHQtYm9keXsNCi0gIGJhY2tncm91bmQ6ICNkZGQ7DQotfQ0KLQ0KLS5tbHR7DQotICANCi19DQotDQotLm1hcHsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIHRvcDogLTI1cHg7ICANCi19DQotDQotLnJlc3VsdC1kb2N1bWVudDpudGgtY2hpbGQoMm4rMSkgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsNCi19DQotDQotDQotLnNlbGVjdGVkLWZhY2V0LWZpZWxkIHsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi1saS5zaG93IHsNCi0gIGxpc3Qtc3R5bGU6IGRpc2M7DQotfQ0KLQ0KLS5ncm91cC12YWx1ZXsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0uZXJyb3Igew0KLSAgY29sb3I6IHdoaXRlOw0KLSAgYmFja2dyb3VuZC1jb2xvcjogcmVkOw0KLSAgbGVmdDogMjEwcHg7DQotICB3aWR0aDo4MCU7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotDQotfQ0KKyNhZG1pbnsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7CisgIHZlcnRpY2FsLWFsaWduOiB0b3A7IAorfQorCisjaGVhZHsKKyAgd2lkdGg6IDEwMCU7Cit9CisuYXJyYXktZmllbGQgeworICBib3JkZXI6IDJweCBzb2xpZCAjNDc0NzQ3OworICBiYWNrZ3JvdW5kOiAjRkZFOUQ4OworICBwYWRkaW5nOiA1cHg7CisgIG1hcmdpbjogNXB4OworfQorCisuYXJyYXktZmllbGQtbGlzdCBsaSB7CisgIGxpc3Qtc3R5bGU6IGNpcmNsZTsKKyAgbWFyZ2luLWxlZnQ6IDIwcHg7Cit9CisKKy5wYXJzZWRfcXVlcnlfaGVhZGVyIHsKKyAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogMTBwdDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5wYXJzZWRfcXVlcnkgeworICBmb250LWZhbWlseTogQ291cmllciwgQ291cmllciBOZXcsIG1vbm9zcGFjZWQ7CisgIGZvbnQtc2l6ZTogMTBwdDsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKK30KKworYm9keSB7CisgIGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDEwcHQ7Cit9CisKK2EgeworICBjb2xvcjogIzQzYTRiMTsKK30KKworLm5hdmlnYXRvcnMgeworICBmbG9hdDogbGVmdDsKKyAgbWFyZ2luOiA1cHg7CisgIG1hcmdpbi10b3A6IDBweDsKKyAgd2lkdGg6IDE4NXB4OworICBwYWRkaW5nOiA1cHg7CisgIHRvcDogLTIwcHg7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsgIAorfQorCisudGFicy1iYXIgeworICBwYWRkaW5nOiA1cHg7CisgIHdpZHRoOiAxMDAlOworICBib3JkZXI6IDFweCBzb2xpZDsKKyAgYm9yZGVyLXdpZHRoOiAwcHggMHB4IDFweCAwcHg7Cit9CisudGFiIHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIHBhZGRpbmc6IDVweDsKKyAgbWFyZ2luOiAwcHggNXB4OworICBib3JkZXI6IDFweCBzb2xpZDsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsKKyAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OworICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OworfQorLnRhYjpob3ZlciB7CisgIGJhY2tncm91bmQ6ICNGRUMyOTM7Cit9CisudGFiLnNlbGVjdGVkIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmZmZmZmY7Cit9CisKKy5uYXZpZ2F0b3JzIGgyIHsKKyAgYmFja2dyb3VuZDogI0ZFQzI5MzsKKyAgcGFkZGluZzogMnB4IDVweDsKK30KKworLm5hdmlnYXRvcnMgdWwgeworICBsaXN0LXN0eWxlOiBub25lOworICBtYXJnaW46IDA7CisgIG1hcmdpbi1ib3R0b206IDVweDsKKyAgbWFyZ2luLXRvcDogNXB4OworICBwYWRkaW5nLWxlZnQ6IDEwcHg7Cit9CisKKy5uYXZpZ2F0b3JzIHVsIGxpIHsKKyAgY29sb3I6ICM5OTk7CisgIHBhZGRpbmc6IDJweDsKK30KKworCisKKy5mYWNldC1maWVsZCB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisuaGlnaGxpZ2h0IHsKKyAgY29sb3I6IHdoaXRlOworICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5OworICBib3JkZXI6IDFweCBibGFjayBzb2xpZDsKK30KKworLmhpZ2hsaWdodC1ib3ggeworICBtYXJnaW4tbGVmdDogMTVweDsKK30KKworLmZpZWxkLW5hbWUgeworICBmb250LXdlaWdodDogYm9sZDsKK30KKworLmhpZ2hsaWdodGVkLWZhY2V0LWZpZWxkIHsKKyAgYmFja2dyb3VuZDogd2hpdGU7Cit9CisKKy5jb25zdHJhaW50cyB7CisgIG1hcmdpbi10b3A6IDEwcHg7Cit9CisKKyNxdWVyeS1mb3JteworICB3aWR0aDogODAlOworfQorCisKKworLnF1ZXJ5LWJveCwgLmNvbnN0cmFpbnRzIHsKKyAgcGFkZGluZzogNXB4OworICBtYXJnaW46IDVweDsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgZm9udC1zaXplOiAyNHB4OworICBsZXR0ZXItc3BhY2luZzogMC4wOGVtOworfQorCisucXVlcnktYm94ICNxIHsKKyAgbWFyZ2luLWxlZnQ6IDhweDsKKyAgd2lkdGg6IDYwJTsKKyAgaGVpZ2h0OiA1MHB4OworICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OworICBmb250LXNpemU6IDFlbTsKKyAgcGFkZGluZzogMC40ZW07Cit9CisKKy5xdWVyeS1ib3ggeworICAKK30KKworLnF1ZXJ5LWJvb3N0IHsKKyAgCisgIHRvcDogMTBweDsKKyAgbGVmdDogNTBweDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBmb250LXNpemU6IDAuOGVtOworfQorCisucXVlcnktYm94IC5pbnB1dHN7CisgIGxlZnQ6IDE4MHB4OworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIAorfQorCisjbG9nbyB7CisgIHdpZHRoOiAxMTVweDsKKyAgbWFyZ2luOiAwcHggMHB4IDIwcHggMTJweDsKKyAgYm9yZGVyLXN0eWxlOiBub25lOworfQorCisucGFnaW5hdGlvbiB7CisgIHBhZGRpbmctbGVmdDogMzMlOworICBiYWNrZ3JvdW5kOiAjZWVlOworICBtYXJnaW46IDVweDsKKyAgbWFyZ2luLWxlZnQ6IDIxMHB4OworICBwYWRkaW5nLXRvcDogNXB4OworICBwYWRkaW5nLWJvdHRvbTogNXB4OworfQorCisucmVzdWx0LWRvY3VtZW50IHsKKyAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsKKyAgcGFkZGluZzogNXB4OworICBtYXJnaW46IDVweDsKKyAgbWFyZ2luLWxlZnQ6IDIxMHB4OworICBtYXJnaW4tYm90dG9tOiAxNXB4OworfQorCisucmVzdWx0LWRvY3VtZW50IGRpdnsKKyAgcGFkZGluZzogNXB4OworfQorCisucmVzdWx0LXRpdGxleworICB3aWR0aDo2MCU7Cit9CisKKy5yZXN1bHQtYm9keXsKKyAgYmFja2dyb3VuZDogI2RkZDsKK30KKworLm1sdHsKKyAgCit9CisKKy5tYXB7CisgIGZsb2F0OiByaWdodDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB0b3A6IC0yNXB4OyAgCit9CisKKy5yZXN1bHQtZG9jdW1lbnQ6bnRoLWNoaWxkKDJuKzEpIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKK30KKworCisuc2VsZWN0ZWQtZmFjZXQtZmllbGQgeworICBmb250LXdlaWdodDogYm9sZDsKK30KKworbGkuc2hvdyB7CisgIGxpc3Qtc3R5bGU6IGRpc2M7Cit9CisKKy5ncm91cC12YWx1ZXsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5lcnJvciB7CisgIGNvbG9yOiB3aGl0ZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmVkOworICBsZWZ0OiAyMTBweDsKKyAgd2lkdGg6ODAlOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYveHNsdC9leGFtcGxlLnhzbCBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYveHNsdC9leGFtcGxlLnhzbAppbmRleCBjMTdmOWVhLi5iODk5MjcwIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3hzbHQvZXhhbXBsZS54c2wKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi94c2x0L2V4YW1wbGUueHNsCkBAIC0xLDEzMiArMSwxMzIgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotDQotPCEtLSANCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIC0tPg0KLQ0KLTwhLS0gDQotICBTaW1wbGUgdHJhbnNmb3JtIG9mIFNvbHIgcXVlcnkgcmVzdWx0cyB0byBIVE1MDQotIC0tPg0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPScxLjAnDQotICAgIHhtbG5zOnhzbD0naHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJw0KLT4NCi0NCi0gIDx4c2w6b3V0cHV0IG1lZGlhLXR5cGU9InRleHQvaHRtbCIgZW5jb2Rpbmc9IlVURi04Ii8+IA0KLSAgDQotICA8eHNsOnZhcmlhYmxlIG5hbWU9InRpdGxlIiBzZWxlY3Q9ImNvbmNhdCgnU29sciBzZWFyY2ggcmVzdWx0cyAoJyxyZXNwb25zZS9yZXN1bHQvQG51bUZvdW5kLCcgZG9jdW1lbnRzKScpIi8+DQotICANCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Jy8nPg0KLSAgICA8aHRtbD4NCi0gICAgICA8aGVhZD4NCi0gICAgICAgIDx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4NCi0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjc3MiLz4NCi0gICAgICA8L2hlYWQ+DQotICAgICAgPGJvZHk+DQotICAgICAgICA8aDE+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvaDE+DQotICAgICAgICA8ZGl2IGNsYXNzPSJub3RlIj4NCi0gICAgICAgICAgVGhpcyBoYXMgYmVlbiBmb3JtYXR0ZWQgYnkgdGhlIHNhbXBsZSAiZXhhbXBsZS54c2wiIHRyYW5zZm9ybSAtDQotICAgICAgICAgIHVzZSB5b3VyIG93biBYU0xUIHRvIGdldCBhIG5pY2VyIHBhZ2UNCi0gICAgICAgIDwvZGl2Pg0KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZXNwb25zZS9yZXN1bHQvZG9jIi8+DQotICAgICAgPC9ib2R5Pg0KLSAgICA8L2h0bWw+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0gIA0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jIj4NCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwb3MiIHNlbGVjdD0icG9zaXRpb24oKSIvPg0KLSAgICA8ZGl2IGNsYXNzPSJkb2MiPg0KLSAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+DQotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcz4NCi0gICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBvcyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3MiLz48L3hzbDp3aXRoLXBhcmFtPg0KLSAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPg0KLSAgICAgIDwvdGFibGU+DQotICAgIDwvZGl2Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MvKltAbmFtZT0nc2NvcmUnXSIgcHJpb3JpdHk9IjEwMCI+DQotICAgIDx4c2w6cGFyYW0gbmFtZT0icG9zIj48L3hzbDpwYXJhbT4NCi0gICAgPHRyPg0KLSAgICAgIDx0ZCBjbGFzcz0ibmFtZSI+DQotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICA8L3RkPg0KLSAgICAgIDx0ZCBjbGFzcz0idmFsdWUiPg0KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4NCi0NCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iYm9vbGVhbigvL2xzdFtAbmFtZT0nZXhwbGFpbiddKSI+DQotICAgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhIj4NCi0gICAgICAgICAgICA8IS0tIGNhbid0IGFsbG93IHdoaXRlc3BhY2UgaGVyZSAtLT4NCi0gICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj5qYXZhc2NyaXB0OnRvZ2dsZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgnZXhwLScsJHBvcykiIC8+Iik7PC94c2w6YXR0cmlidXRlPj88L3hzbDplbGVtZW50Pg0KLSAgICAgICAgICA8YnIvPg0KLSAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGl2Ij4NCi0gICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+ZXhwPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlkIj4NCi0gICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJ2V4cC0nLCRwb3MpIiAvPg0KLSAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLy9sc3RbQG5hbWU9J2V4cGxhaW4nXS9zdHJbcG9zaXRpb24oKT0kcG9zXSIvPg0KLSAgICAgICAgICA8L3hzbDplbGVtZW50Pg0KLSAgICAgICAgPC94c2w6aWY+DQotICAgICAgPC90ZD4NCi0gICAgPC90cj4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jL2FyciIgcHJpb3JpdHk9IjEwMCI+DQotICAgIDx0cj4NCi0gICAgICA8dGQgY2xhc3M9Im5hbWUiPg0KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgPC90ZD4NCi0gICAgICA8dGQgY2xhc3M9InZhbHVlIj4NCi0gICAgICAgIDx1bD4NCi0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIqIj4NCi0gICAgICAgICAgPGxpPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9saT4NCi0gICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgPC91bD4NCi0gICAgICA8L3RkPg0KLSAgICA8L3RyPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MvKiI+DQotICAgIDx0cj4NCi0gICAgICA8dGQgY2xhc3M9Im5hbWUiPg0KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgPC90ZD4NCi0gICAgICA8dGQgY2xhc3M9InZhbHVlIj4NCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+DQotICAgICAgPC90ZD4NCi0gICAgPC90cj4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiIvPg0KLSAgDQotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImNzcyI+DQotICAgIDxzY3JpcHQ+DQotICAgICAgZnVuY3Rpb24gdG9nZ2xlKGlkKSB7DQotICAgICAgICB2YXIgb2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOw0KLSAgICAgICAgb2JqLnN0eWxlLmRpc3BsYXkgPSAob2JqLnN0eWxlLmRpc3BsYXkgIT0gJ2Jsb2NrJykgPyAnYmxvY2snIDogJ25vbmUnOw0KLSAgICAgIH0NCi0gICAgPC9zY3JpcHQ+DQotICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotICAgICAgYm9keSB7IGZvbnQtZmFtaWx5OiAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWYgfQ0KLSAgICAgIHRkLm5hbWUgeyBmb250LXN0eWxlOiBpdGFsaWM7IGZvbnQtc2l6ZTo4MCU7IH0NCi0gICAgICB0ZCB7IHZlcnRpY2FsLWFsaWduOiB0b3A7IH0NCi0gICAgICB1bCB7IG1hcmdpbjogMHB4OyBtYXJnaW4tbGVmdDogMWVtOyBwYWRkaW5nOiAwcHg7IH0NCi0gICAgICAubm90ZSB7IGZvbnQtc2l6ZTo4MCU7IH0NCi0gICAgICAuZG9jIHsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItdG9wOiBzb2xpZCBncmV5IDFweDsgfQ0KLSAgICAgIC5leHAgeyBkaXNwbGF5OiBub25lOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyB3aGl0ZS1zcGFjZTogcHJlOyB9DQotICAgIDwvc3R5bGU+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi08L3hzbDpzdHlsZXNoZWV0Pg0KKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+CisKKzwhLS0gCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPCEtLSAKKyAgU2ltcGxlIHRyYW5zZm9ybSBvZiBTb2xyIHF1ZXJ5IHJlc3VsdHMgdG8gSFRNTAorIC0tPgorPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249JzEuMCcKKyAgICB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybScKKz4KKworICA8eHNsOm91dHB1dCBtZWRpYS10eXBlPSJ0ZXh0L2h0bWwiIGVuY29kaW5nPSJVVEYtOCIvPiAKKyAgCisgIDx4c2w6dmFyaWFibGUgbmFtZT0idGl0bGUiIHNlbGVjdD0iY29uY2F0KCdTb2xyIHNlYXJjaCByZXN1bHRzICgnLHJlc3BvbnNlL3Jlc3VsdC9AbnVtRm91bmQsJyBkb2N1bWVudHMpJykiLz4KKyAgCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Jy8nPgorICAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNzcyIvPgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgIDxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC9oMT4KKyAgICAgICAgPGRpdiBjbGFzcz0ibm90ZSI+CisgICAgICAgICAgVGhpcyBoYXMgYmVlbiBmb3JtYXR0ZWQgYnkgdGhlIHNhbXBsZSAiZXhhbXBsZS54c2wiIHRyYW5zZm9ybSAtCisgICAgICAgICAgdXNlIHlvdXIgb3duIFhTTFQgdG8gZ2V0IGEgbmljZXIgcGFnZQorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZXNwb25zZS9yZXN1bHQvZG9jIi8+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorICA8L3hzbDp0ZW1wbGF0ZT4KKyAgCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwb3MiIHNlbGVjdD0icG9zaXRpb24oKSIvPgorICAgIDxkaXYgY2xhc3M9ImRvYyI+CisgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icG9zIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvcyIvPjwveHNsOndpdGgtcGFyYW0+CisgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgIDwvdGFibGU+CisgICAgPC9kaXY+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYy8qW0BuYW1lPSdzY29yZSddIiBwcmlvcml0eT0iMTAwIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InBvcyI+PC94c2w6cGFyYW0+CisgICAgPHRyPgorICAgICAgPHRkIGNsYXNzPSJuYW1lIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICA8L3RkPgorICAgICAgPHRkIGNsYXNzPSJ2YWx1ZSI+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+CisKKyAgICAgICAgPHhzbDppZiB0ZXN0PSJib29sZWFuKC8vbHN0W0BuYW1lPSdleHBsYWluJ10pIj4KKyAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYSI+CisgICAgICAgICAgICA8IS0tIGNhbid0IGFsbG93IHdoaXRlc3BhY2UgaGVyZSAtLT4KKyAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmphdmFzY3JpcHQ6dG9nZ2xlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KCdleHAtJywkcG9zKSIgLz4iKTs8L3hzbDphdHRyaWJ1dGU+PzwveHNsOmVsZW1lbnQ+CisgICAgICAgICAgPGJyLz4KKyAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGl2Ij4KKyAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5leHA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZCI+CisgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJ2V4cC0nLCRwb3MpIiAvPgorICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii8vbHN0W0BuYW1lPSdleHBsYWluJ10vc3RyW3Bvc2l0aW9uKCk9JHBvc10iLz4KKyAgICAgICAgICA8L3hzbDplbGVtZW50PgorICAgICAgICA8L3hzbDppZj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jL2FyciIgcHJpb3JpdHk9IjEwMCI+CisgICAgPHRyPgorICAgICAgPHRkIGNsYXNzPSJuYW1lIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICA8L3RkPgorICAgICAgPHRkIGNsYXNzPSJ2YWx1ZSI+CisgICAgICAgIDx1bD4KKyAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IioiPgorICAgICAgICAgIDxsaT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvbGk+CisgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICA8L3VsPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYy8qIj4KKyAgICA8dHI+CisgICAgICA8dGQgY2xhc3M9Im5hbWUiPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgY2xhc3M9InZhbHVlIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiIvPgorICAKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjc3MiPgorICAgIDxzY3JpcHQ+CisgICAgICBmdW5jdGlvbiB0b2dnbGUoaWQpIHsKKyAgICAgICAgdmFyIG9iaiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKKyAgICAgICAgb2JqLnN0eWxlLmRpc3BsYXkgPSAob2JqLnN0eWxlLmRpc3BsYXkgIT0gJ2Jsb2NrJykgPyAnYmxvY2snIDogJ25vbmUnOworICAgICAgfQorICAgIDwvc2NyaXB0PgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICBib2R5IHsgZm9udC1mYW1pbHk6ICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZiB9CisgICAgICB0ZC5uYW1lIHsgZm9udC1zdHlsZTogaXRhbGljOyBmb250LXNpemU6ODAlOyB9CisgICAgICB0ZCB7IHZlcnRpY2FsLWFsaWduOiB0b3A7IH0KKyAgICAgIHVsIHsgbWFyZ2luOiAwcHg7IG1hcmdpbi1sZWZ0OiAxZW07IHBhZGRpbmc6IDBweDsgfQorICAgICAgLm5vdGUgeyBmb250LXNpemU6ODAlOyB9CisgICAgICAuZG9jIHsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItdG9wOiBzb2xpZCBncmV5IDFweDsgfQorICAgICAgLmV4cCB7IGRpc3BsYXk6IG5vbmU7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IHdoaXRlLXNwYWNlOiBwcmU7IH0KKyAgICA8L3N0eWxlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYveHNsdC9leGFtcGxlX2F0b20ueHNsIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi94c2x0L2V4YW1wbGVfYXRvbS54c2wKaW5kZXggZGE0ZDA4Mi4uYjZjMjMxNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi94c2x0L2V4YW1wbGVfYXRvbS54c2wKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi94c2x0L2V4YW1wbGVfYXRvbS54c2wKQEAgLTEsNjcgKzEsNjcgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotDQotPCEtLSANCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIC0tPg0KLQ0KLTwhLS0gDQotICBTaW1wbGUgdHJhbnNmb3JtIG9mIFNvbHIgcXVlcnkgcmVzdWx0cyB0byBBdG9tDQotIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPScxLjAnDQotICAgIHhtbG5zOnhzbD0naHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJz4NCi0NCi0gIDx4c2w6b3V0cHV0DQotICAgICAgIG1ldGhvZD0ieG1sIg0KLSAgICAgICBlbmNvZGluZz0idXRmLTgiDQotICAgICAgIG1lZGlhLXR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gIC8+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPScvJz4NCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeSIgc2VsZWN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J3Jlc3BvbnNlSGVhZGVyJ10vbHN0W0BuYW1lPSdwYXJhbXMnXS9zdHJbQG5hbWU9J3EnXSIvPg0KLSAgICA8ZmVlZCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIj4NCi0gICAgICA8dGl0bGU+RXhhbXBsZSBTb2xyIEF0b20gMS4wIEZlZWQ8L3RpdGxlPg0KLSAgICAgIDxzdWJ0aXRsZT4NCi0gICAgICAgVGhpcyBoYXMgYmVlbiBmb3JtYXR0ZWQgYnkgdGhlIHNhbXBsZSAiZXhhbXBsZV9hdG9tLnhzbCIgdHJhbnNmb3JtIC0NCi0gICAgICAgdXNlIHlvdXIgb3duIFhTTFQgdG8gZ2V0IGEgbmljZXIgQXRvbSBmZWVkLg0KLSAgICAgIDwvc3VidGl0bGU+DQotICAgICAgPGF1dGhvcj4NCi0gICAgICAgIDxuYW1lPkFwYWNoZSBTb2xyPC9uYW1lPg0KLSAgICAgICAgPGVtYWlsPnNvbHItdXNlckBsdWNlbmUuYXBhY2hlLm9yZzwvZW1haWw+DQotICAgICAgPC9hdXRob3I+DQotICAgICAgPGxpbmsgcmVsPSJzZWxmIiB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tK3htbCIgDQotICAgICAgICAgICAgaHJlZj0iaHR0cDovL2xvY2FsaG9zdDo4OTgzL3NvbHIvcT17JHF1ZXJ5fSZhbXA7d3Q9eHNsdCZhbXA7dHI9YXRvbS54c2wiLz4NCi0gICAgICA8dXBkYXRlZD4NCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyZXNwb25zZS9yZXN1bHQvZG9jW3Bvc2l0aW9uKCk9MV0vZGF0ZVtAbmFtZT0ndGltZXN0YW1wJ10iLz4NCi0gICAgICA8L3VwZGF0ZWQ+DQotICAgICAgPGlkPnRhZzpsb2NhbGhvc3QsMjAwNzpleGFtcGxlPC9pZD4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InJlc3BvbnNlL3Jlc3VsdC9kb2MiLz4NCi0gICAgPC9mZWVkPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotICAgIA0KLSAgPCEtLSBzZWFyY2ggcmVzdWx0cyB4c2x0IC0tPg0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jIj4NCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpZCIgc2VsZWN0PSJzdHJbQG5hbWU9J2lkJ10iLz4NCi0gICAgPGVudHJ5Pg0KLSAgICAgIDx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3RyW0BuYW1lPSduYW1lJ10iLz48L3RpdGxlPg0KLSAgICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly9sb2NhbGhvc3Q6ODk4My9zb2xyL3NlbGVjdD9xPXskaWR9Ii8+DQotICAgICAgPGlkPnRhZzpsb2NhbGhvc3QsMjAwNzo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlkIi8+PC9pZD4NCi0gICAgICA8c3VtbWFyeT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXJyW0BuYW1lPSdmZWF0dXJlcyddIi8+PC9zdW1tYXJ5Pg0KLSAgICAgIDx1cGRhdGVkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkYXRlW0BuYW1lPSd0aW1lc3RhbXAnXSIvPjwvdXBkYXRlZD4NCi0gICAgPC9lbnRyeT4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLTwveHNsOnN0eWxlc2hlZXQ+DQorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKworPCEtLSAKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8IS0tIAorICBTaW1wbGUgdHJhbnNmb3JtIG9mIFNvbHIgcXVlcnkgcmVzdWx0cyB0byBBdG9tCisgLS0+CisKKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPScxLjAnCisgICAgeG1sbnM6eHNsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0nPgorCisgIDx4c2w6b3V0cHV0CisgICAgICAgbWV0aG9kPSJ4bWwiCisgICAgICAgZW5jb2Rpbmc9InV0Zi04IgorICAgICAgIG1lZGlhLXR5cGU9ImFwcGxpY2F0aW9uL3htbCIKKyAgLz4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPScvJz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5IiBzZWxlY3Q9InJlc3BvbnNlL2xzdFtAbmFtZT0ncmVzcG9uc2VIZWFkZXInXS9sc3RbQG5hbWU9J3BhcmFtcyddL3N0cltAbmFtZT0ncSddIi8+CisgICAgPGZlZWQgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSI+CisgICAgICA8dGl0bGU+RXhhbXBsZSBTb2xyIEF0b20gMS4wIEZlZWQ8L3RpdGxlPgorICAgICAgPHN1YnRpdGxlPgorICAgICAgIFRoaXMgaGFzIGJlZW4gZm9ybWF0dGVkIGJ5IHRoZSBzYW1wbGUgImV4YW1wbGVfYXRvbS54c2wiIHRyYW5zZm9ybSAtCisgICAgICAgdXNlIHlvdXIgb3duIFhTTFQgdG8gZ2V0IGEgbmljZXIgQXRvbSBmZWVkLgorICAgICAgPC9zdWJ0aXRsZT4KKyAgICAgIDxhdXRob3I+CisgICAgICAgIDxuYW1lPkFwYWNoZSBTb2xyPC9uYW1lPgorICAgICAgICA8ZW1haWw+c29sci11c2VyQGx1Y2VuZS5hcGFjaGUub3JnPC9lbWFpbD4KKyAgICAgIDwvYXV0aG9yPgorICAgICAgPGxpbmsgcmVsPSJzZWxmIiB0eXBlPSJhcHBsaWNhdGlvbi9hdG9tK3htbCIgCisgICAgICAgICAgICBocmVmPSJodHRwOi8vbG9jYWxob3N0Ojg5ODMvc29sci9xPXskcXVlcnl9JmFtcDt3dD14c2x0JmFtcDt0cj1hdG9tLnhzbCIvPgorICAgICAgPHVwZGF0ZWQ+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyZXNwb25zZS9yZXN1bHQvZG9jW3Bvc2l0aW9uKCk9MV0vZGF0ZVtAbmFtZT0ndGltZXN0YW1wJ10iLz4KKyAgICAgIDwvdXBkYXRlZD4KKyAgICAgIDxpZD50YWc6bG9jYWxob3N0LDIwMDc6ZXhhbXBsZTwvaWQ+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InJlc3BvbnNlL3Jlc3VsdC9kb2MiLz4KKyAgICA8L2ZlZWQ+CisgIDwveHNsOnRlbXBsYXRlPgorICAgIAorICA8IS0tIHNlYXJjaCByZXN1bHRzIHhzbHQgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpZCIgc2VsZWN0PSJzdHJbQG5hbWU9J2lkJ10iLz4KKyAgICA8ZW50cnk+CisgICAgICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN0cltAbmFtZT0nbmFtZSddIi8+PC90aXRsZT4KKyAgICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly9sb2NhbGhvc3Q6ODk4My9zb2xyL3NlbGVjdD9xPXskaWR9Ii8+CisgICAgICA8aWQ+dGFnOmxvY2FsaG9zdCwyMDA3Ojx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaWQiLz48L2lkPgorICAgICAgPHN1bW1hcnk+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImFycltAbmFtZT0nZmVhdHVyZXMnXSIvPjwvc3VtbWFyeT4KKyAgICAgIDx1cGRhdGVkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkYXRlW0BuYW1lPSd0aW1lc3RhbXAnXSIvPjwvdXBkYXRlZD4KKyAgICA8L2VudHJ5PgorICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYveHNsdC9leGFtcGxlX3Jzcy54c2wgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3hzbHQvZXhhbXBsZV9yc3MueHNsCmluZGV4IDI2YzgxNGIuLjI4NTdmMTEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYveHNsdC9leGFtcGxlX3Jzcy54c2wKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi94c2x0L2V4YW1wbGVfcnNzLnhzbApAQCAtMSw2NiArMSw2NiBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi0NCi08IS0tIA0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gLS0+DQotDQotPCEtLSANCi0gIFNpbXBsZSB0cmFuc2Zvcm0gb2YgU29sciBxdWVyeSByZXN1bHRzIHRvIFJTUw0KLSAtLT4NCi0NCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0nMS4wJw0KLSAgICB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSc+DQotDQotICA8eHNsOm91dHB1dA0KLSAgICAgICBtZXRob2Q9InhtbCINCi0gICAgICAgZW5jb2Rpbmc9InV0Zi04Ig0KLSAgICAgICBtZWRpYS10eXBlPSJhcHBsaWNhdGlvbi94bWwiDQotICAvPg0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0nLyc+DQotICAgIDxyc3MgdmVyc2lvbj0iMi4wIj4NCi0gICAgICAgPGNoYW5uZWw+DQotCSA8dGl0bGU+RXhhbXBsZSBTb2xyIFJTUyAyLjAgRmVlZDwvdGl0bGU+DQotICAgICAgICAgPGxpbms+aHR0cDovL2xvY2FsaG9zdDo4OTgzL3NvbHI8L2xpbms+DQotICAgICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICBUaGlzIGhhcyBiZWVuIGZvcm1hdHRlZCBieSB0aGUgc2FtcGxlICJleGFtcGxlX3Jzcy54c2wiIHRyYW5zZm9ybSAtDQotICAgICAgICAgIHVzZSB5b3VyIG93biBYU0xUIHRvIGdldCBhIG5pY2VyIFJTUyBmZWVkLg0KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgICAgPGxhbmd1YWdlPmVuLXVzPC9sYW5ndWFnZT4NCi0gICAgICAgICA8ZG9jcz5odHRwOi8vbG9jYWxob3N0Ojg5ODMvc29scjwvZG9jcz4NCi0gICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InJlc3BvbnNlL3Jlc3VsdC9kb2MiLz4NCi0gICAgICAgPC9jaGFubmVsPg0KLSAgICA8L3Jzcz4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLSAgDQotICA8IS0tIHNlYXJjaCByZXN1bHRzIHhzbHQgLS0+DQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MiPg0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlkIiBzZWxlY3Q9InN0cltAbmFtZT0naWQnXSIvPg0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRpbWVzdGFtcCIgc2VsZWN0PSJkYXRlW0BuYW1lPSd0aW1lc3RhbXAnXSIvPg0KLSAgICA8aXRlbT4NCi0gICAgICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN0cltAbmFtZT0nbmFtZSddIi8+PC90aXRsZT4NCi0gICAgICA8bGluaz4NCi0gICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODk4My9zb2xyL3NlbGVjdD9xPWlkOjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaWQiLz4NCi0gICAgICA8L2xpbms+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImFycltAbmFtZT0nZmVhdHVyZXMnXSIvPg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPHB1YkRhdGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aW1lc3RhbXAiLz48L3B1YkRhdGU+DQotICAgICAgPGd1aWQ+DQotICAgICAgICBodHRwOi8vbG9jYWxob3N0Ojg5ODMvc29sci9zZWxlY3Q/cT1pZDo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlkIi8+DQotICAgICAgPC9ndWlkPg0KLSAgICA8L2l0ZW0+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi08L3hzbDpzdHlsZXNoZWV0Pg0KKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+CisKKzwhLS0gCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPCEtLSAKKyAgU2ltcGxlIHRyYW5zZm9ybSBvZiBTb2xyIHF1ZXJ5IHJlc3VsdHMgdG8gUlNTCisgLS0+CisKKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPScxLjAnCisgICAgeG1sbnM6eHNsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0nPgorCisgIDx4c2w6b3V0cHV0CisgICAgICAgbWV0aG9kPSJ4bWwiCisgICAgICAgZW5jb2Rpbmc9InV0Zi04IgorICAgICAgIG1lZGlhLXR5cGU9ImFwcGxpY2F0aW9uL3htbCIKKyAgLz4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0nLyc+CisgICAgPHJzcyB2ZXJzaW9uPSIyLjAiPgorICAgICAgIDxjaGFubmVsPgorCSA8dGl0bGU+RXhhbXBsZSBTb2xyIFJTUyAyLjAgRmVlZDwvdGl0bGU+CisgICAgICAgICA8bGluaz5odHRwOi8vbG9jYWxob3N0Ojg5ODMvc29scjwvbGluaz4KKyAgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICBUaGlzIGhhcyBiZWVuIGZvcm1hdHRlZCBieSB0aGUgc2FtcGxlICJleGFtcGxlX3Jzcy54c2wiIHRyYW5zZm9ybSAtCisgICAgICAgICAgdXNlIHlvdXIgb3duIFhTTFQgdG8gZ2V0IGEgbmljZXIgUlNTIGZlZWQuCisgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAgPGxhbmd1YWdlPmVuLXVzPC9sYW5ndWFnZT4KKyAgICAgICAgIDxkb2NzPmh0dHA6Ly9sb2NhbGhvc3Q6ODk4My9zb2xyPC9kb2NzPgorICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZXNwb25zZS9yZXN1bHQvZG9jIi8+CisgICAgICAgPC9jaGFubmVsPgorICAgIDwvcnNzPgorICA8L3hzbDp0ZW1wbGF0ZT4KKyAgCisgIDwhLS0gc2VhcmNoIHJlc3VsdHMgeHNsdCAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jIj4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlkIiBzZWxlY3Q9InN0cltAbmFtZT0naWQnXSIvPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGltZXN0YW1wIiBzZWxlY3Q9ImRhdGVbQG5hbWU9J3RpbWVzdGFtcCddIi8+CisgICAgPGl0ZW0+CisgICAgICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN0cltAbmFtZT0nbmFtZSddIi8+PC90aXRsZT4KKyAgICAgIDxsaW5rPgorICAgICAgICBodHRwOi8vbG9jYWxob3N0Ojg5ODMvc29sci9zZWxlY3Q/cT1pZDo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlkIi8+CisgICAgICA8L2xpbms+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhcnJbQG5hbWU9J2ZlYXR1cmVzJ10iLz4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8cHViRGF0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpbWVzdGFtcCIvPjwvcHViRGF0ZT4KKyAgICAgIDxndWlkPgorICAgICAgICBodHRwOi8vbG9jYWxob3N0Ojg5ODMvc29sci9zZWxlY3Q/cT1pZDo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlkIi8+CisgICAgICA8L2d1aWQ+CisgICAgPC9pdGVtPgorICA8L3hzbDp0ZW1wbGF0ZT4KKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3hzbHQvbHVrZS54c2wgYi9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb25mL3hzbHQvbHVrZS54c2wKaW5kZXggN2U3Mjk3OC4uMDVmYjViZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi94c2x0L2x1a2UueHNsCisrKyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYveHNsdC9sdWtlLnhzbApAQCAtMSwzMzcgKzEsMzM3IEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICAgIA0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gICAgDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotDQotPCEtLSANCi0gIERpc3BsYXkgdGhlIGx1a2UgcmVxdWVzdCBoYW5kbGVyIHdpdGggZ3JhcGhzDQotIC0tPg0KLTx4c2w6c3R5bGVzaGVldA0KLSAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSINCi0gICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotICAgIHZlcnNpb249IjEuMCINCi0gICAgPg0KLSAgICA8eHNsOm91dHB1dA0KLSAgICAgICAgbWV0aG9kPSJodG1sIg0KLSAgICAgICAgZW5jb2Rpbmc9IlVURi04Ig0KLSAgICAgICAgbWVkaWEtdHlwZT0idGV4dC9odG1sIg0KLSAgICAgICAgZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIg0KLSAgICAgICAgZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiDQotICAgIC8+DQotDQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGl0bGUiPlNvbHIgTHVrZSBSZXF1ZXN0IEhhbmRsZXIgUmVzcG9uc2U8L3hzbDp2YXJpYWJsZT4NCi0NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+DQotICAgICAgICA8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotICAgICAgICAgICAgPGhlYWQ+DQotICAgICAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InNvbHItYWRtaW4uY3NzIi8+DQotICAgICAgICAgICAgICAgIDxsaW5rIHJlbD0iaWNvbiIgaHJlZj0iZmF2aWNvbi5pY28iIHR5cGU9ImltYWdlL3gtaWNvbiIvPg0KLSAgICAgICAgICAgICAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9ImZhdmljb24uaWNvIiB0eXBlPSJpbWFnZS94LWljb24iLz4NCi0gICAgICAgICAgICAgICAgPHRpdGxlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPg0KLSAgICAgICAgICAgICAgICA8L3RpdGxlPg0KLSAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3NzIi8+DQotDQotICAgICAgICAgICAgPC9oZWFkPg0KLSAgICAgICAgICAgIDxib2R5Pg0KLSAgICAgICAgICAgICAgICA8aDE+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+DQotICAgICAgICAgICAgICAgIDwvaDE+DQotICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvYyI+DQotICAgICAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J2luZGV4J10iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjaW5kZXgiPkluZGV4IFN0YXRpc3RpY3M8L2E+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J2ZpZWxkcyddIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI2ZpZWxkcyI+RmllbGQgU3RhdGlzdGljczwvYT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icmVzcG9uc2UvbHN0W0BuYW1lPSdmaWVsZHMnXS9sc3QiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIje0BuYW1lfSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icmVzcG9uc2UvbHN0W0BuYW1lPSdkb2MnXSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNkb2MiPkRvY3VtZW50IHN0YXRpc3RpY3M8L2E+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J2luZGV4J10iPg0KLSAgICAgICAgICAgICAgICAgICAgPGgyPjxhIG5hbWU9ImluZGV4Ii8+SW5kZXggU3RhdGlzdGljczwvaDI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InJlc3BvbnNlL2xzdFtAbmFtZT0naW5kZXgnXSIvPg0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J2ZpZWxkcyddIj4NCi0gICAgICAgICAgICAgICAgICAgIDxoMj48YSBuYW1lPSJmaWVsZHMiLz5GaWVsZCBTdGF0aXN0aWNzPC9oMj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icmVzcG9uc2UvbHN0W0BuYW1lPSdmaWVsZHMnXSIvPg0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J2RvYyddIj4NCi0gICAgICAgICAgICAgICAgICAgIDxoMj48YSBuYW1lPSJkb2MiLz5Eb2N1bWVudCBzdGF0aXN0aWNzPC9oMj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icmVzcG9uc2UvbHN0W0BuYW1lPSdkb2MnXSIvPg0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICA8L2JvZHk+DQotICAgICAgICA8L2h0bWw+DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJsc3QiPg0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJwYXJlbnQ6OmxzdCI+DQotICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+DQotICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb2MiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJsaXN0Ii8+DQotICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgPC94c2w6aWY+DQotICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChwYXJlbnQ6OmxzdCkiPg0KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvYyI+DQotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJsaXN0Ii8+DQotICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICA8L3hzbDppZj4NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotDQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ibGlzdCI+DQotICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KGNoaWxkOjoqKT4wIj4NCi0gICAgICAgICAgICA8dGFibGU+DQotICAgICAgICAgICAgICAgIDx0aGVhZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0ie0BuYW1lfSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+DQotICAgICAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8L3RoZWFkPg0KLSAgICAgICAgICAgICAgICA8dGJvZHk+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdD0iQG5hbWU9J2hpc3RvZ3JhbSciPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Imhpc3RvZ3JhbSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICA8L3Rib2R5Pg0KLSAgICAgICAgICAgIDwvdGFibGU+DQotICAgICAgICA8L3hzbDppZj4NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotDQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iaGlzdG9ncmFtIj4NCi0gICAgICAgIDxkaXYgY2xhc3M9ImRvYyI+DQotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJhcmNoYXJ0Ij4NCi0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im1heF9iYXJfd2lkdGgiPjUwPC94c2w6d2l0aC1wYXJhbT4NCi0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Iml3aWR0aCI+ODAwPC94c2w6d2l0aC1wYXJhbT4NCi0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImloZWlnaHQiPjE2MDwveHNsOndpdGgtcGFyYW0+DQotICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWxsIj5ibHVlPC94c2w6d2l0aC1wYXJhbT4NCi0gICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KLSAgICAgICAgPC9kaXY+DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImJhcmNoYXJ0Ij4NCi0gICAgICAgIDx4c2w6cGFyYW0gbmFtZT0ibWF4X2Jhcl93aWR0aCIvPg0KLSAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJpd2lkdGgiLz4NCi0gICAgICAgIDx4c2w6cGFyYW0gbmFtZT0iaWhlaWdodCIvPg0KLSAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJmaWxsIi8+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1heCI+DQotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImludCI+DQotICAgICAgICAgICAgICAgIDx4c2w6c29ydCBkYXRhLXR5cGU9Im51bWJlciIgb3JkZXI9ImRlc2NlbmRpbmciLz4NCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4NCi0gICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICA8L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYmFycyI+DQotICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoaW50KSIvPg0KLSAgICAgICAgPC94c2w6dmFyaWFibGU+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImJhcl93aWR0aCI+DQotICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtYXhfYmFyX3dpZHRoICZsdDsgKCRpd2lkdGggZGl2ICRiYXJzKSI+DQotICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYXhfYmFyX3dpZHRoIi8+DQotICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaXdpZHRoIGRpdiAkYmFycyIvPg0KLSAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICA8L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgIDx0YWJsZSBjbGFzcz0iaGlzdG9ncmFtIj4NCi0gICAgICAgICAgIDx0Ym9keT4NCi0gICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImludCI+DQotICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+DQotICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoaXN0b2dyYW0iPg0KLSAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InN0eWxlIj5iYWNrZ3JvdW5kLWNvbG9yOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpbGwiLz47IHdpZHRoOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhcl93aWR0aCIvPnB4OyBoZWlnaHQ6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIoJGloZWlnaHQqbnVtYmVyKC4pKSBkaXYgJG1heCIvPnB4OzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICA8L3RkPiANCi0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW50Ij4NCi0gICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgIDwvdGJvZHk+DQotICAgICAgICA8L3RhYmxlPg0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJrZXl2YWx1ZSI+DQotICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5hbWUiPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im5hbWUiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idmFsdWUiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+DQotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaW50fGJvb2x8bG9uZ3xmbG9hdHxkb3VibGV8dXVpZHxkYXRlIj4NCi0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXl2YWx1ZSIvPg0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYXJyIj4NCi0gICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQgY2xhc3M9Im5hbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0idmFsdWUiPg0KLSAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iY2hpbGQ6OioiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgPC90cj4NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotDQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InN0ciI+DQotICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5hbWU9J3NjaGVtYScgb3IgQG5hbWU9J2luZGV4JyBvciBAbmFtZT0nZmxhZ3MnIj4NCi0gICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNjaGVtYSIvPg0KLSAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXl2YWx1ZSIvPg0KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotDQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2NoZW1hIj4NCi0gICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQgY2xhc3M9Im5hbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0idmFsdWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKC4sJ3Vuc3RvcmVkJykiPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4NCi0gICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KGNvbnRhaW5zKC4sJ3Vuc3RvcmVkJykpIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbmZvY2hhcjJzdHJpbmciPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGFyTGlzdCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2l0aC1wYXJhbT4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQotICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmZvY2hhcjJzdHJpbmciPg0KLSAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJpIj4xPC94c2w6cGFyYW0+DQotICAgICAgICA8eHNsOnBhcmFtIG5hbWU9ImNoYXJMaXN0Ii8+DQotDQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNoYXIiPg0KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmcoJGNoYXJMaXN0LCRpLDEpIi8+DQotICAgICAgICA8L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nSSciPg0KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J0knXSIvPiAtIDwveHNsOndoZW4+DQotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRjaGFyPSdUJyI+DQotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nVCddIi8+IC0gPC94c2w6d2hlbj4NCi0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J1MnIj4NCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9yZXNwb25zZS9sc3RbQG5hbWU9J2luZm8nXS9sc3Qvc3RyW0BuYW1lPSdTJ10iLz4gLSA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nTSciPg0KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J00nXSIvPiAtIDwveHNsOndoZW4+DQotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRjaGFyPSdWJyI+DQotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nViddIi8+IC0gPC94c2w6d2hlbj4NCi0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J28nIj4NCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9yZXNwb25zZS9sc3RbQG5hbWU9J2luZm8nXS9sc3Qvc3RyW0BuYW1lPSdvJ10iLz4gLSA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0ncCciPg0KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J3AnXSIvPiAtIDwveHNsOndoZW4+DQotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRjaGFyPSdPJyI+DQotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nTyddIi8+IC0gPC94c2w6d2hlbj4NCi0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J0wnIj4NCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9yZXNwb25zZS9sc3RbQG5hbWU9J2luZm8nXS9sc3Qvc3RyW0BuYW1lPSdMJ10iLz4gLSA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nQiciPg0KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J0InXSIvPiAtIDwveHNsOndoZW4+DQotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRjaGFyPSdDJyI+DQotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvcmVzcG9uc2UvbHN0W0BuYW1lPSdpbmZvJ10vbHN0L3N0cltAbmFtZT0nQyddIi8+IC0gPC94c2w6d2hlbj4NCi0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J2YnIj4NCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9yZXNwb25zZS9sc3RbQG5hbWU9J2luZm8nXS9sc3Qvc3RyW0BuYW1lPSdmJ10iLz4gLSA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hhcj0nbCciPg0KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J2wnXSIvPiAtDQotICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgIDwveHNsOmNob29zZT4NCi0NCi0gICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRpPj1zdHJpbmctbGVuZ3RoKCRjaGFyTGlzdCkpIj4NCi0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5mb2NoYXIyc3RyaW5nIj4NCi0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImkiPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpKzEiLz4NCi0gICAgICAgICAgICAgICAgPC94c2w6d2l0aC1wYXJhbT4NCi0gICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoYXJMaXN0Ij4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2hhckxpc3QiLz4NCi0gICAgICAgICAgICAgICAgPC94c2w6d2l0aC1wYXJhbT4NCi0gICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KLSAgICAgICAgPC94c2w6aWY+DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImNzcyI+DQotICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLSAgICAgICAgICAgIDwhW0NEQVRBWw0KLSAgICAgICAgICAgIHRkLm5hbWUge2ZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC1zaXplOjgwJTsgfQ0KLSAgICAgICAgICAgIC5kb2MgeyBtYXJnaW46IDAuNWVtOyBib3JkZXI6IHNvbGlkIGdyZXkgMXB4OyB9DQotICAgICAgICAgICAgLmV4cCB7IGRpc3BsYXk6IG5vbmU7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IHdoaXRlLXNwYWNlOiBwcmU7IH0NCi0gICAgICAgICAgICBkaXYuaGlzdG9ncmFtIHsgYmFja2dyb3VuZDogbm9uZSByZXBlYXQgc2Nyb2xsIDAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7fQ0KLSAgICAgICAgICAgIHRhYmxlLmhpc3RvZ3JhbSB7IHdpZHRoOiBhdXRvOyB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOyB9DQotICAgICAgICAgICAgdGFibGUuaGlzdG9ncmFtIHRkLCB0YWJsZS5oaXN0b2dyYW0gdGggeyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBib3R0b207IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmY5OTMzOyB3aWR0aDogYXV0bzsgfQ0KLSAgICAgICAgICAgIF1dPg0KLSAgICAgICAgPC9zdHlsZT4NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotPC94c2w6c3R5bGVzaGVldD4NCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworCis8IS0tIAorICBEaXNwbGF5IHRoZSBsdWtlIHJlcXVlc3QgaGFuZGxlciB3aXRoIGdyYXBocworIC0tPgorPHhzbDpzdHlsZXNoZWV0CisgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCisgICAgdmVyc2lvbj0iMS4wIgorICAgID4KKyAgICA8eHNsOm91dHB1dAorICAgICAgICBtZXRob2Q9Imh0bWwiCisgICAgICAgIGVuY29kaW5nPSJVVEYtOCIKKyAgICAgICAgbWVkaWEtdHlwZT0idGV4dC9odG1sIgorICAgICAgICBkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgICAgIGRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIgorICAgIC8+CisKKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRpdGxlIj5Tb2xyIEx1a2UgUmVxdWVzdCBIYW5kbGVyIFJlc3BvbnNlPC94c2w6dmFyaWFibGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgICAgICAgPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICAgICAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic29sci1hZG1pbi5jc3MiLz4KKyAgICAgICAgICAgICAgICA8bGluayByZWw9Imljb24iIGhyZWY9ImZhdmljb24uaWNvIiB0eXBlPSJpbWFnZS94LWljb24iLz4KKyAgICAgICAgICAgICAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9ImZhdmljb24uaWNvIiB0eXBlPSJpbWFnZS94LWljb24iLz4KKyAgICAgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz4KKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjc3MiLz4KKworICAgICAgICAgICAgPC9oZWFkPgorICAgICAgICAgICAgPGJvZHk+CisgICAgICAgICAgICAgICAgPGgxPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+CisgICAgICAgICAgICAgICAgPC9oMT4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb2MiPgorICAgICAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InJlc3BvbnNlL2xzdFtAbmFtZT0naW5kZXgnXSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjaW5kZXgiPkluZGV4IFN0YXRpc3RpY3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J2ZpZWxkcyddIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNmaWVsZHMiPkZpZWxkIFN0YXRpc3RpY3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J2ZpZWxkcyddL2xzdCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIje0BuYW1lfSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InJlc3BvbnNlL2xzdFtAbmFtZT0nZG9jJ10iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI2RvYyI+RG9jdW1lbnQgc3RhdGlzdGljczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J2luZGV4J10iPgorICAgICAgICAgICAgICAgICAgICA8aDI+PGEgbmFtZT0iaW5kZXgiLz5JbmRleCBTdGF0aXN0aWNzPC9oMj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J2luZGV4J10iLz4KKyAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InJlc3BvbnNlL2xzdFtAbmFtZT0nZmllbGRzJ10iPgorICAgICAgICAgICAgICAgICAgICA8aDI+PGEgbmFtZT0iZmllbGRzIi8+RmllbGQgU3RhdGlzdGljczwvaDI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icmVzcG9uc2UvbHN0W0BuYW1lPSdmaWVsZHMnXSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icmVzcG9uc2UvbHN0W0BuYW1lPSdkb2MnXSI+CisgICAgICAgICAgICAgICAgICAgIDxoMj48YSBuYW1lPSJkb2MiLz5Eb2N1bWVudCBzdGF0aXN0aWNzPC9oMj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZXNwb25zZS9sc3RbQG5hbWU9J2RvYyddIi8+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8L2JvZHk+CisgICAgICAgIDwvaHRtbD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxzdCI+CisgICAgICAgIDx4c2w6aWYgdGVzdD0icGFyZW50Ojpsc3QiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9jIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJsaXN0Ii8+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QocGFyZW50Ojpsc3QpIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvYyI+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Imxpc3QiLz4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L3hzbDppZj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ibGlzdCI+CisgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoY2hpbGQ6OiopPjAiPgorICAgICAgICAgICAgPHRhYmxlPgorICAgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJ7QG5hbWV9Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0PSJAbmFtZT0naGlzdG9ncmFtJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaGlzdG9ncmFtIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC94c2w6aWY+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9Imhpc3RvZ3JhbSI+CisgICAgICAgIDxkaXYgY2xhc3M9ImRvYyI+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYmFyY2hhcnQiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJtYXhfYmFyX3dpZHRoIj41MDwveHNsOndpdGgtcGFyYW0+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Iml3aWR0aCI+ODAwPC94c2w6d2l0aC1wYXJhbT4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iaWhlaWdodCI+MTYwPC94c2w6d2l0aC1wYXJhbT4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmlsbCI+Ymx1ZTwveHNsOndpdGgtcGFyYW0+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L2Rpdj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iYmFyY2hhcnQiPgorICAgICAgICA8eHNsOnBhcmFtIG5hbWU9Im1heF9iYXJfd2lkdGgiLz4KKyAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJpd2lkdGgiLz4KKyAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJpaGVpZ2h0Ii8+CisgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0iZmlsbCIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1heCI+CisgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW50Ij4KKyAgICAgICAgICAgICAgICA8eHNsOnNvcnQgZGF0YS10eXBlPSJudW1iZXIiIG9yZGVyPSJkZXNjZW5kaW5nIi8+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImJhcnMiPgorICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoaW50KSIvPgorICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJiYXJfd2lkdGgiPgorICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG1heF9iYXJfd2lkdGggJmx0OyAoJGl3aWR0aCBkaXYgJGJhcnMpIj4KKyAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWF4X2Jhcl93aWR0aCIvPgorICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGl3aWR0aCBkaXYgJGJhcnMiLz4KKyAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iaGlzdG9ncmFtIj4KKyAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImludCI+CisgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgorICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoaXN0b2dyYW0iPgorICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3R5bGUiPmJhY2tncm91bmQtY29sb3I6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmlsbCIvPjsgd2lkdGg6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFyX3dpZHRoIi8+cHg7IGhlaWdodDogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IigkaWhlaWdodCpudW1iZXIoLikpIGRpdiAkbWF4Ii8+cHg7PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICA8L3RkPiAKKyAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnQiPgorICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90YWJsZT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ia2V5dmFsdWUiPgorICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmFtZSI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im5hbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idmFsdWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+CisgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICAgIDwveHNsOmNob29zZT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImludHxib29sfGxvbmd8ZmxvYXR8ZG91YmxlfHV1aWR8ZGF0ZSI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXl2YWx1ZSIvPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYXJyIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJuYW1lIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9InZhbHVlIj4KKyAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJjaGlsZDo6KiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzdHIiPgorICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmFtZT0nc2NoZW1hJyBvciBAbmFtZT0naW5kZXgnIG9yIEBuYW1lPSdmbGFncyciPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzY2hlbWEiLz4KKyAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5dmFsdWUiLz4KKyAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzY2hlbWEiPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgY2xhc3M9Im5hbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0idmFsdWUiPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY29udGFpbnMoLiwndW5zdG9yZWQnKSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoY29udGFpbnMoLiwndW5zdG9yZWQnKSkiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5mb2NoYXIyc3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGFyTGlzdCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndpdGgtcGFyYW0+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmZvY2hhcjJzdHJpbmciPgorICAgICAgICA8eHNsOnBhcmFtIG5hbWU9ImkiPjE8L3hzbDpwYXJhbT4KKyAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJjaGFyTGlzdCIvPgorCisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2hhciI+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nKCRjaGFyTGlzdCwkaSwxKSIvPgorICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J0knIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J0knXSIvPiAtIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J1QnIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J1QnXSIvPiAtIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J1MnIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J1MnXSIvPiAtIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J00nIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J00nXSIvPiAtIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J1YnIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J1YnXSIvPiAtIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J28nIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J28nXSIvPiAtIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J3AnIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J3AnXSIvPiAtIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J08nIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J08nXSIvPiAtIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J0wnIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J0wnXSIvPiAtIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J0InIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J0InXSIvPiAtIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J0MnIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J0MnXSIvPiAtIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J2YnIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J2YnXSIvPiAtIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoYXI9J2wnIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL3Jlc3BvbnNlL2xzdFtAbmFtZT0naW5mbyddL2xzdC9zdHJbQG5hbWU9J2wnXSIvPiAtCisgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICA8L3hzbDpjaG9vc2U+CisKKyAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJGk+PXN0cmluZy1sZW5ndGgoJGNoYXJMaXN0KSkiPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImluZm9jaGFyMnN0cmluZyI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImkiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGkrMSIvPgorICAgICAgICAgICAgICAgIDwveHNsOndpdGgtcGFyYW0+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoYXJMaXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjaGFyTGlzdCIvPgorICAgICAgICAgICAgICAgIDwveHNsOndpdGgtcGFyYW0+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L3hzbDppZj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImNzcyI+CisgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgICAgICA8IVtDREFUQVsKKyAgICAgICAgICAgIHRkLm5hbWUge2ZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC1zaXplOjgwJTsgfQorICAgICAgICAgICAgLmRvYyB7IG1hcmdpbjogMC41ZW07IGJvcmRlcjogc29saWQgZ3JleSAxcHg7IH0KKyAgICAgICAgICAgIC5leHAgeyBkaXNwbGF5OiBub25lOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyB3aGl0ZS1zcGFjZTogcHJlOyB9CisgICAgICAgICAgICBkaXYuaGlzdG9ncmFtIHsgYmFja2dyb3VuZDogbm9uZSByZXBlYXQgc2Nyb2xsIDAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7fQorICAgICAgICAgICAgdGFibGUuaGlzdG9ncmFtIHsgd2lkdGg6IGF1dG87IHZlcnRpY2FsLWFsaWduOiBib3R0b207IH0KKyAgICAgICAgICAgIHRhYmxlLmhpc3RvZ3JhbSB0ZCwgdGFibGUuaGlzdG9ncmFtIHRoIHsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZmOTkzMzsgd2lkdGg6IGF1dG87IH0KKyAgICAgICAgICAgIF1dPgorICAgICAgICA8L3N0eWxlPgorICAgIDwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvbmYveHNsdC91cGRhdGVYbWwueHNsIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi94c2x0L3VwZGF0ZVhtbC54c2wKaW5kZXggY2IwNGQwNS4uZGFmMTM0NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi94c2x0L3VwZGF0ZVhtbC54c2wKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29uZi94c2x0L3VwZGF0ZVhtbC54c2wKQEAgLTEsNzAgKzEsNzAgQEAKLTwhLS0gDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAtLT4NCi0NCi08IS0tDQotICBTaW1wbGUgdHJhbnNmb3JtIG9mIFNvbHIgcXVlcnkgcmVzcG9uc2UgaW50byBTb2xyIFVwZGF0ZSBYTUwgY29tcGxpYW50IFhNTC4NCi0gIFdoZW4gdXNlZCBpbiB0aGUgeHNsdCByZXNwb25zZSB3cml0ZXIgeW91IHdpbGwgZ2V0IFVwZGFhdGVYTUwgYXMgb3V0cHV0Lg0KLSAgQnV0IHlvdSBjYW4gYWxzbyBzdG9yZSBhIHF1ZXJ5IHJlc3BvbnNlIFhNTCB0byBkaXNrIGFuZCBmZWVkIHRoaXMgWE1MIHRvDQotICB0aGUgWFNMVFVwZGF0ZVJlcXVlc3RIYW5kbGVyIHRvIGluZGV4IHRoZSBjb250ZW50LiBQcm92aWRlZCBhcyBleGFtcGxlIG9ubHkuDQotICBTZWUgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9zb2xyL1hzbHRVcGRhdGVSZXF1ZXN0SGFuZGxlciBmb3IgbW9yZSBpbmZvDQotIC0tPg0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPScxLjAnIHhtbG5zOnhzbD0naHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJz4NCi0gIDx4c2w6b3V0cHV0IG1lZGlhLXR5cGU9InRleHQveG1sIiBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiLz4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Jy8nPg0KLSAgICA8YWRkPg0KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZXNwb25zZS9yZXN1bHQvZG9jIi8+DQotICAgIDwvYWRkPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotICANCi0gIDwhLS0gSWdub3JlIHNjb3JlIChtYWtlcyBubyBzZW5zZSB0byBpbmRleCkgLS0+DQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MvKltAbmFtZT0nc2NvcmUnXSIgcHJpb3JpdHk9IjEwMCI+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYyI+DQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icG9zIiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4NCi0gICAgPGRvYz4NCi0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzPg0KLSAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icG9zIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvcyIvPjwveHNsOndpdGgtcGFyYW0+DQotICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+DQotICAgIDwvZG9jPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8IS0tIEZsYXR0ZW4gYXJyYXlzIHRvIGR1cGxpY2F0ZSBmaWVsZCBsaW5lcyAtLT4NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYy9hcnIiIHByaW9yaXR5PSIxMDAiPg0KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZm4iIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICANCi0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iKiI+DQotCQk8eHNsOmVsZW1lbnQgbmFtZT0iZmllbGQiPg0KLQkJICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZm4iLz48L3hzbDphdHRyaWJ1dGU+DQotCSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4NCi0JCTwveHNsOmVsZW1lbnQ+DQotICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYy8qIj4NCi0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZuIiBzZWxlY3Q9IkBuYW1lIi8+DQotDQotCTx4c2w6ZWxlbWVudCBuYW1lPSJmaWVsZCI+DQotCSAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZuIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4NCi0JPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiIvPg0KLTwveHNsOnN0eWxlc2hlZXQ+DQorPCEtLSAKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8IS0tCisgIFNpbXBsZSB0cmFuc2Zvcm0gb2YgU29sciBxdWVyeSByZXNwb25zZSBpbnRvIFNvbHIgVXBkYXRlIFhNTCBjb21wbGlhbnQgWE1MLgorICBXaGVuIHVzZWQgaW4gdGhlIHhzbHQgcmVzcG9uc2Ugd3JpdGVyIHlvdSB3aWxsIGdldCBVcGRhYXRlWE1MIGFzIG91dHB1dC4KKyAgQnV0IHlvdSBjYW4gYWxzbyBzdG9yZSBhIHF1ZXJ5IHJlc3BvbnNlIFhNTCB0byBkaXNrIGFuZCBmZWVkIHRoaXMgWE1MIHRvCisgIHRoZSBYU0xUVXBkYXRlUmVxdWVzdEhhbmRsZXIgdG8gaW5kZXggdGhlIGNvbnRlbnQuIFByb3ZpZGVkIGFzIGV4YW1wbGUgb25seS4KKyAgU2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvc29sci9Yc2x0VXBkYXRlUmVxdWVzdEhhbmRsZXIgZm9yIG1vcmUgaW5mbworIC0tPgorPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249JzEuMCcgeG1sbnM6eHNsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0nPgorICA8eHNsOm91dHB1dCBtZWRpYS10eXBlPSJ0ZXh0L3htbCIgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0nLyc+CisgICAgPGFkZD4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZXNwb25zZS9yZXN1bHQvZG9jIi8+CisgICAgPC9hZGQ+CisgIDwveHNsOnRlbXBsYXRlPgorICAKKyAgPCEtLSBJZ25vcmUgc2NvcmUgKG1ha2VzIG5vIHNlbnNlIHRvIGluZGV4KSAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jLypbQG5hbWU9J3Njb3JlJ10iIHByaW9yaXR5PSIxMDAiPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkb2MiPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icG9zIiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4KKyAgICA8ZG9jPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icG9zIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvcyIvPjwveHNsOndpdGgtcGFyYW0+CisgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICA8L2RvYz4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLSBGbGF0dGVuIGFycmF5cyB0byBkdXBsaWNhdGUgZmllbGQgbGluZXMgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYy9hcnIiIHByaW9yaXR5PSIxMDAiPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmbiIgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgCisgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iKiI+CisJCTx4c2w6ZWxlbWVudCBuYW1lPSJmaWVsZCI+CisJCSAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZuIi8+PC94c2w6YXR0cmlidXRlPgorCSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KKwkJPC94c2w6ZWxlbWVudD4KKyAgICAgIDwveHNsOmZvci1lYWNoPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRvYy8qIj4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZm4iIHNlbGVjdD0iQG5hbWUiLz4KKworCTx4c2w6ZWxlbWVudCBuYW1lPSJmaWVsZCI+CisJICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZm4iLz48L3hzbDphdHRyaWJ1dGU+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+CisJPC94c2w6ZWxlbWVudD4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiIvPgorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvcmUucHJvcGVydGllcyBiL3BsdWdpbnMvc29sci9ob21lL3NvbHJkZWZhdWx0L2NvcmUucHJvcGVydGllcwppbmRleCAwOTAxZjZmLi41MTAxODg5IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvaG9tZS9zb2xyZGVmYXVsdC9jb3JlLnByb3BlcnRpZXMKKysrIGIvcGx1Z2lucy9zb2xyL2hvbWUvc29scmRlZmF1bHQvY29yZS5wcm9wZXJ0aWVzCkBAIC0xLDIgKzEsMiBAQAotIyBUbyBjb25maWcgdGhpcyBmaWxlLCBwbGVhc2UgcmVhZDoNCi0jIGh0dHBzOi8vY3dpa2kuYXBhY2hlLm9yZy9jb25mbHVlbmNlL2Rpc3BsYXkvc29sci9EZWZpbmluZytjb3JlLnByb3BlcnRpZXMNCisjIFRvIGNvbmZpZyB0aGlzIGZpbGUsIHBsZWFzZSByZWFkOgorIyBodHRwczovL2N3aWtpLmFwYWNoZS5vcmcvY29uZmx1ZW5jZS9kaXNwbGF5L3NvbHIvRGVmaW5pbmcrY29yZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvYW5hbHlzaXMuY3NzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2FuYWx5c2lzLmNzcwppbmRleCAwMzkwN2QwLi44MDA5NjRlIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvYW5hbHlzaXMuY3NzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9hbmFseXNpcy5jc3MKQEAgLTEsMzA0ICsxLDMwNCBAQAotLyoNCi0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSovDQotDQotI2NvbnRlbnQgI2FuYWx5c2lzLWhvbGRlcg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2Rpdi5naWYgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDUwJSAwOw0KLSAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC15Ow0KLX0NCi0NCi0jY29udGVudCAjYW5hbHlzaXMgI2ZpZWxkLWFuYWx5c2lzDQotew0KLSAgbWFyZ2luLWJvdHRvbTogMDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzICNmaWVsZC1hbmFseXNpcyAuY29udGVudA0KLXsNCi0gIHBhZGRpbmctYm90dG9tOiAwOw0KLX0NCi0NCi0jY29udGVudCAjYW5hbHlzaXMgLnNldHRpbmdzLWhvbGRlcg0KLXsNCi0gIGNsZWFyOiBib3RoOw0KLSAgcGFkZGluZy10b3A6IDE1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAuc2V0dGluZ3MNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmYWZhZmE7DQotICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZhZmFmYTsNCi0gIHBhZGRpbmctdG9wOiAxMHB4Ow0KLSAgcGFkZGluZy1ib3R0b206IDEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAuc2V0dGluZ3Mgc2VsZWN0LmxvYWRlcg0KLXsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDNweCA1MCU7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAuc2V0dGluZ3Mgc2VsZWN0IG9wdGdyb3VwDQotew0KLSAgZm9udC1zdHlsZTogbm9ybWFsOw0KLSAgcGFkZGluZzogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjYW5hbHlzaXMgLnNldHRpbmdzIHNlbGVjdCBvcHRpb24NCi17DQotICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAuc2V0dGluZ3MgI3Rvcl9zY2hlbWENCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcXVlc3Rpb24td2hpdGUucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLSAgbWFyZ2luLWxlZnQ6IDVweDsNCi0gIHBhZGRpbmctbGVmdDogMjFweDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzIC5zZXR0aW5ncyAjdG9yX3NjaGVtYTpob3Zlcg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9xdWVzdGlvbi5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzIC5zZXR0aW5ncyAjdG9yX3NjaGVtYSBzcGFuDQotew0KLS8vICBkaXNwbGF5OiBub25lOw0KLX0NCi0NCi0jY29udGVudCAjYW5hbHlzaXMgLnNldHRpbmdzICN0b3Jfc2NoZW1hOmhvdmVyIHNwYW4NCi17DQotICBkaXNwbGF5OiBpbmxpbmU7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAuc2V0dGluZ3MgLmJ1dHRvbnMNCi17DQotICBmbG9hdDogcmlnaHQ7DQotICB3aWR0aDogNDclOw0KLX0NCi0NCi0jY29udGVudCAjYW5hbHlzaXMgLnNldHRpbmdzIGJ1dHRvbg0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzIC5zZXR0aW5ncyBidXR0b24gc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9mdW5uZWwucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAuc2V0dGluZ3MgLnZlcmJvc2Vfb3V0cHV0DQotew0KLSAgZmxvYXQ6IGxlZnQ7DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzIC5zZXR0aW5ncyAudmVyYm9zZV9vdXRwdXQgYQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1jaGVjay1ib3gtdW5jaGVjay5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgY29sb3I6ICM5OTk7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHBhZGRpbmctbGVmdDogMjFweDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzIC5zZXR0aW5ncyAudmVyYm9zZV9vdXRwdXQuYWN0aXZlIGENCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdWktY2hlY2stYm94LnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjYW5hbHlzaXMgLmluZGV4IGxhYmVsLA0KLSNjb250ZW50ICNhbmFseXNpcyAucXVlcnkgbGFiZWwNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzIC5pbmRleCB0ZXh0YXJlYSwNCi0jY29udGVudCAjYW5hbHlzaXMgLnF1ZXJ5IHRleHRhcmVhDQotew0KLSAgZGlzcGxheTogYmxvY2s7DQotICB3aWR0aDogMTAwJTsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzIC5pbmRleA0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgbWFyZ2luLXJpZ2h0OiAwLjUlOw0KLSAgbWluLXdpZHRoOiA0NyU7DQotICBtYXgtd2lkdGg6IDk5JTsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzIC5xdWVyeQ0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIG1hcmdpbi1sZWZ0OiAwLjUlOw0KLSAgbWluLXdpZHRoOiA0NyU7DQotICBtYXgtd2lkdGg6IDk5JTsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzIC5hbmFseXNpcy1lcnJvcg0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmMDA7DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY29uc3RydWN0aW9uLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTBweCA1MCU7DQotICBjb2xvcjogI2ZmZjsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgbWFyZ2luLWJvdHRvbTogMjBweDsNCi0gIHBhZGRpbmc6IDEwcHg7DQotICBwYWRkaW5nLWxlZnQ6IDM1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAuYW5hbHlzaXMtZXJyb3IgLmhlYWQgYQ0KLXsNCi0gIGNvbG9yOiAjZmZmOw0KLSAgY3Vyc29yOiBhdXRvOw0KLX0NCi0NCi0jY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdA0KLXsNCi0gIG92ZXJmbG93OiBhdXRvOw0KLX0NCi0NCi0jY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCAuaW5kZXgsDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgLnF1ZXJ5DQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsNCi0gIHBhZGRpbmctdG9wOiAyMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCB0YWJsZQ0KLXsNCi0gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkDQotew0KLSAgdmVydGljYWwtYWxpZ246IHRvcDsNCi0gIHdoaXRlLXNwYWNlOiBub3dyYXA7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLnBhcnQuYW5hbHl6ZXIgZGl2LA0KLSNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLnBhcnQuc3BhY2VyIC5ob2xkZXIsDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgdGQgdGQgdGQNCi17DQotICBwYWRkaW5nLXRvcDogMXB4Ow0KLSAgcGFkZGluZy1ib3R0b206IDFweDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQudmVyYm9zZV9vdXRwdXQgdGQubGVnZW5kDQotew0KLSAgZGlzcGxheTogdGFibGUtY2VsbDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQudmVyYm9zZV9vdXRwdXQgdGQuZGF0YSB0ci52ZXJib3NlX291dHB1dA0KLXsNCi0gIGRpc3BsYXk6IHRhYmxlLXJvdzsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgLm1hdGNoDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZWZmNzsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZmY7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLnBhcnQNCi17DQotICBwYWRkaW5nLWJvdHRvbTogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgdGQucGFydC5hbmFseXplciBkaXYNCi17DQotICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgcGFkZGluZy1yaWdodDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgdGQucGFydC5hbmFseXplciBhYmJyDQotew0KLSAgY29sb3I6ICNjMGMwYzA7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLnBhcnQubGVnZW5kIC5ob2xkZXIsDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgdGQucGFydC5kYXRhIC5ob2xkZXINCi17DQotICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQotICBwYWRkaW5nLXJpZ2h0OiAxMHB4Ow0KLSAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2MwYzBjMDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgdGQucGFydC5sZWdlbmQgdGQNCi17DQotICBjb2xvcjogI2MwYzBjMDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgdGQucGFydC5sZWdlbmQgLmhvbGRlcg0KLXsNCi0gIGJvcmRlci1yaWdodC1jb2xvcjogI2YwZjBmMDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgdGQucGFydC5kYXRhOmxhc3QtY2hpbGQgLmhvbGRlcg0KLXsNCi0gIHBhZGRpbmctcmlnaHQ6IDA7DQotICBib3JkZXItcmlnaHQ6IDA7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLmRldGFpbHMgDQotew0KLSAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KLSAgcGFkZGluZy1yaWdodDogMTBweDsNCi0gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2YwZjBmMDsNCi0gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNmMGYwZjA7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLmRldGFpbHM6Zmlyc3QtY2hpbGQNCi17DQotICBwYWRkaW5nLWxlZnQ6IDA7DQotICBib3JkZXItbGVmdDogMDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgdGQuZGV0YWlsczpsYXN0LWNoaWxkDQotew0KLSAgcGFkZGluZy1yaWdodDogMDsNCi0gIGJvcmRlci1yaWdodDogMDsNCi19DQotDQotI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgdGQuZGV0YWlscyB0ci5lbXB0eSB0ZA0KLXsNCi0gIGNvbG9yOiAjZjBmMGYwOw0KLX0NCi0NCi0jY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCB0ZC5kZXRhaWxzIHRyLnJhd19ieXRlcyB0ZA0KLXsNCi0gIGxldHRlci1zcGFjaW5nOiAtMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCAucGFydCB0YWJsZSB0YWJsZSB0ZA0KLXsNCi0gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjBmMGYwOw0KLX0NCi0NCi0jY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCAucGFydCB0YWJsZSB0YWJsZSB0cjpmaXJzdC1jaGlsZCB0ZA0KLXsNCi0gIGJvcmRlci10b3A6IDA7DQotfQ0KLQ0KLSNjb250ZW50ICNhbmFseXNpcyAjZmllbGQtYW5hbHlzaXMgaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcmVjZWlwdC5wbmcgKTsgfQ0KLSNjb250ZW50ICNhbmFseXNpcyAuYW5hbHlzaXMtcmVzdWx0IGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3JlY2VpcHQtaW52b2ljZS5wbmcgKTsgfQ0KKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKworI2NvbnRlbnQgI2FuYWx5c2lzLWhvbGRlcgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9kaXYuZ2lmICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDUwJSAwOworICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXk7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAjZmllbGQtYW5hbHlzaXMKK3sKKyAgbWFyZ2luLWJvdHRvbTogMDsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzICNmaWVsZC1hbmFseXNpcyAuY29udGVudAoreworICBwYWRkaW5nLWJvdHRvbTogMDsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzIC5zZXR0aW5ncy1ob2xkZXIKK3sKKyAgY2xlYXI6IGJvdGg7CisgIHBhZGRpbmctdG9wOiAxNXB4OworfQorCisjY29udGVudCAjYW5hbHlzaXMgLnNldHRpbmdzCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZmFmYWZhOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZhZmFmYTsKKyAgcGFkZGluZy10b3A6IDEwcHg7CisgIHBhZGRpbmctYm90dG9tOiAxMHB4OworfQorCisjY29udGVudCAjYW5hbHlzaXMgLnNldHRpbmdzIHNlbGVjdC5sb2FkZXIKK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogM3B4IDUwJTsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjYW5hbHlzaXMgLnNldHRpbmdzIHNlbGVjdCBvcHRncm91cAoreworICBmb250LXN0eWxlOiBub3JtYWw7CisgIHBhZGRpbmc6IDVweDsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzIC5zZXR0aW5ncyBzZWxlY3Qgb3B0aW9uCit7CisgIHBhZGRpbmctbGVmdDogMTBweDsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzIC5zZXR0aW5ncyAjdG9yX3NjaGVtYQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcXVlc3Rpb24td2hpdGUucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOworICBjb2xvcjogI2MwYzBjMDsKKyAgbWFyZ2luLWxlZnQ6IDVweDsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjYW5hbHlzaXMgLnNldHRpbmdzICN0b3Jfc2NoZW1hOmhvdmVyCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9xdWVzdGlvbi5wbmcgKTsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzIC5zZXR0aW5ncyAjdG9yX3NjaGVtYSBzcGFuCit7CisvLyAgZGlzcGxheTogbm9uZTsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzIC5zZXR0aW5ncyAjdG9yX3NjaGVtYTpob3ZlciBzcGFuCit7CisgIGRpc3BsYXk6IGlubGluZTsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzIC5zZXR0aW5ncyAuYnV0dG9ucworeworICBmbG9hdDogcmlnaHQ7CisgIHdpZHRoOiA0NyU7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAuc2V0dGluZ3MgYnV0dG9uCit7CisgIGZsb2F0OiByaWdodDsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzIC5zZXR0aW5ncyBidXR0b24gc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZnVubmVsLnBuZyApOworfQorCisjY29udGVudCAjYW5hbHlzaXMgLnNldHRpbmdzIC52ZXJib3NlX291dHB1dAoreworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IGF1dG87Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAuc2V0dGluZ3MgLnZlcmJvc2Vfb3V0cHV0IGEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3VpLWNoZWNrLWJveC11bmNoZWNrLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgY29sb3I6ICM5OTk7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAuc2V0dGluZ3MgLnZlcmJvc2Vfb3V0cHV0LmFjdGl2ZSBhCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1jaGVjay1ib3gucG5nICk7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAuaW5kZXggbGFiZWwsCisjY29udGVudCAjYW5hbHlzaXMgLnF1ZXJ5IGxhYmVsCit7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjY29udGVudCAjYW5hbHlzaXMgLmluZGV4IHRleHRhcmVhLAorI2NvbnRlbnQgI2FuYWx5c2lzIC5xdWVyeSB0ZXh0YXJlYQoreworICBkaXNwbGF5OiBibG9jazsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAuaW5kZXgKK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIG1hcmdpbi1yaWdodDogMC41JTsKKyAgbWluLXdpZHRoOiA0NyU7CisgIG1heC13aWR0aDogOTklOworfQorCisjY29udGVudCAjYW5hbHlzaXMgLnF1ZXJ5Cit7CisgIGZsb2F0OiByaWdodDsKKyAgbWFyZ2luLWxlZnQ6IDAuNSU7CisgIG1pbi13aWR0aDogNDclOworICBtYXgtd2lkdGg6IDk5JTsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzIC5hbmFseXNpcy1lcnJvcgoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjAwOworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY29uc3RydWN0aW9uLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMHB4IDUwJTsKKyAgY29sb3I6ICNmZmY7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBtYXJnaW4tYm90dG9tOiAyMHB4OworICBwYWRkaW5nOiAxMHB4OworICBwYWRkaW5nLWxlZnQ6IDM1cHg7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAuYW5hbHlzaXMtZXJyb3IgLmhlYWQgYQoreworICBjb2xvcjogI2ZmZjsKKyAgY3Vyc29yOiBhdXRvOworfQorCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdAoreworICBvdmVyZmxvdzogYXV0bzsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgLmluZGV4LAorI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgLnF1ZXJ5Cit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgIHBhZGRpbmctdG9wOiAyMHB4OworfQorCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCB0YWJsZQoreworICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworfQorCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCB0ZAoreworICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCB0ZC5wYXJ0LmFuYWx5emVyIGRpdiwKKyNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLnBhcnQuc3BhY2VyIC5ob2xkZXIsCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCB0ZCB0ZCB0ZAoreworICBwYWRkaW5nLXRvcDogMXB4OworICBwYWRkaW5nLWJvdHRvbTogMXB4OworfQorCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdC52ZXJib3NlX291dHB1dCB0ZC5sZWdlbmQKK3sKKyAgZGlzcGxheTogdGFibGUtY2VsbDsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQudmVyYm9zZV9vdXRwdXQgdGQuZGF0YSB0ci52ZXJib3NlX291dHB1dAoreworICBkaXNwbGF5OiB0YWJsZS1yb3c7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IC5tYXRjaAoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllZmY3OworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmZmOworfQorCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCB0ZC5wYXJ0Cit7CisgIHBhZGRpbmctYm90dG9tOiAxMHB4OworfQorCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCB0ZC5wYXJ0LmFuYWx5emVyIGRpdgoreworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZjBmMGYwOworICBwYWRkaW5nLXJpZ2h0OiAxMHB4OworfQorCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCB0ZC5wYXJ0LmFuYWx5emVyIGFiYnIKK3sKKyAgY29sb3I6ICNjMGMwYzA7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLnBhcnQubGVnZW5kIC5ob2xkZXIsCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCB0ZC5wYXJ0LmRhdGEgLmhvbGRlcgoreworICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgIHBhZGRpbmctcmlnaHQ6IDEwcHg7CisgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNjMGMwYzA7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLnBhcnQubGVnZW5kIHRkCit7CisgIGNvbG9yOiAjYzBjMGMwOworfQorCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCB0ZC5wYXJ0LmxlZ2VuZCAuaG9sZGVyCit7CisgIGJvcmRlci1yaWdodC1jb2xvcjogI2YwZjBmMDsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgdGQucGFydC5kYXRhOmxhc3QtY2hpbGQgLmhvbGRlcgoreworICBwYWRkaW5nLXJpZ2h0OiAwOworICBib3JkZXItcmlnaHQ6IDA7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLmRldGFpbHMgCit7CisgIHBhZGRpbmctbGVmdDogMTBweDsKKyAgcGFkZGluZy1yaWdodDogMTBweDsKKyAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZjBmMGYwOworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZjBmMGYwOworfQorCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCB0ZC5kZXRhaWxzOmZpcnN0LWNoaWxkCit7CisgIHBhZGRpbmctbGVmdDogMDsKKyAgYm9yZGVyLWxlZnQ6IDA7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLmRldGFpbHM6bGFzdC1jaGlsZAoreworICBwYWRkaW5nLXJpZ2h0OiAwOworICBib3JkZXItcmlnaHQ6IDA7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLmRldGFpbHMgdHIuZW1wdHkgdGQKK3sKKyAgY29sb3I6ICNmMGYwZjA7Cit9CisKKyNjb250ZW50ICNhbmFseXNpcyAjYW5hbHlzaXMtcmVzdWx0IHRkLmRldGFpbHMgdHIucmF3X2J5dGVzIHRkCit7CisgIGxldHRlci1zcGFjaW5nOiAtMXB4OworfQorCisjY29udGVudCAjYW5hbHlzaXMgI2FuYWx5c2lzLXJlc3VsdCAucGFydCB0YWJsZSB0YWJsZSB0ZAoreworICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzICNhbmFseXNpcy1yZXN1bHQgLnBhcnQgdGFibGUgdGFibGUgdHI6Zmlyc3QtY2hpbGQgdGQKK3sKKyAgYm9yZGVyLXRvcDogMDsKK30KKworI2NvbnRlbnQgI2FuYWx5c2lzICNmaWVsZC1hbmFseXNpcyBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9yZWNlaXB0LnBuZyApOyB9CisjY29udGVudCAjYW5hbHlzaXMgLmFuYWx5c2lzLXJlc3VsdCBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9yZWNlaXB0LWludm9pY2UucG5nICk7IH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9jaG9zZW4uY3NzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2Nob3Nlbi5jc3MKaW5kZXggMjA2OWVkOS4uZjdhZTc3MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2Nob3Nlbi5jc3MKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2Nob3Nlbi5jc3MKQEAgLTEsNDY1ICsxLDQ2NSBAQAotLyoNCi0NCi1DaG9zZW4NCi0NCi0tIGJ5IFBhdHJpY2sgRmlsbGVyIGZvciBIYXJ2ZXN0IGh0dHA6Ly9nZXRoYXJ2ZXN0LmNvbQ0KLS0gQ29weXJpZ2h0IChjKSAyMDExLTIwMTMgYnkgSGFydmVzdA0KLQ0KLUF2YWlsYWJsZSBmb3IgdXNlIHVuZGVyIHRoZSBNSVQgTGljZW5zZQ0KLQ0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkNCi1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCi10byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KLQ0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQotQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTg0KLVRIRSBTT0ZUV0FSRS4NCi0NCi0qLw0KLS8qIQ0KLUNob3NlbiwgYSBTZWxlY3QgQm94IEVuaGFuY2VyIGZvciBqUXVlcnkgYW5kIFByb3RvdHlwZQ0KLWJ5IFBhdHJpY2sgRmlsbGVyIGZvciBIYXJ2ZXN0LCBodHRwOi8vZ2V0aGFydmVzdC5jb20NCi0NCi1WZXJzaW9uIDEuMy4wDQotRnVsbCBzb3VyY2UgYXQgaHR0cHM6Ly9naXRodWIuY29tL2hhcnZlc3RocS9jaG9zZW4NCi1Db3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBIYXJ2ZXN0IGh0dHA6Ly9nZXRoYXJ2ZXN0LmNvbQ0KLQ0KLU1JVCBMaWNlbnNlLCBodHRwczovL2dpdGh1Yi5jb20vaGFydmVzdGhxL2Nob3Nlbi9ibG9iL21hc3Rlci9MSUNFTlNFLm1kDQotVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBgZ3J1bnQgYnVpbGRgLCBkbyBub3QgZWRpdCBpdCBieSBoYW5kLg0KLSovDQotDQotLyogQGdyb3VwIEJhc2UgKi8NCi0uY2hvc2VuLWNvbnRhaW5lciB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQotICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KLSAgZm9udC1zaXplOiAxM3B4Ow0KLSAgem9vbTogMTsNCi0gICpkaXNwbGF5OiBpbmxpbmU7DQotICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOw0KLSAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsNCi0gIHVzZXItc2VsZWN0OiBub25lOw0KLX0NCi0uY2hvc2VuLWNvbnRhaW5lciAqIHsNCi0gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsNCi0gIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsNCi0gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyIC5jaG9zZW4tZHJvcCB7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICB0b3A6IDEwMCU7DQotICBsZWZ0OiAtOTk5OXB4Ow0KLSAgei1pbmRleDogMTAxMDsNCi0gIHdpZHRoOiAxMDAlOw0KLSAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsNCi0gIGJvcmRlci10b3A6IDA7DQotICBiYWNrZ3JvdW5kOiAjZmZmOw0KLSAgYm94LXNoYWRvdzogMCA0cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLmNob3Nlbi13aXRoLWRyb3AgLmNob3Nlbi1kcm9wIHsNCi0gIGxlZnQ6IDA7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyIGEgew0KLSAgY3Vyc29yOiBwb2ludGVyOw0KLX0NCi0NCi0vKiBAZW5kICovDQotLyogQGdyb3VwIFNpbmdsZSBDaG9zZW4gKi8NCi0uY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUgLmNob3Nlbi1zaW5nbGUgew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBvdmVyZmxvdzogaGlkZGVuOw0KLSAgcGFkZGluZzogMCAwIDAgOHB4Ow0KLSAgaGVpZ2h0OiAyNXB4Ow0KLSAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsNCi0gIGJvcmRlci1yYWRpdXM6IDVweDsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQotICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgNTAlIDAlLCA1MCUgMTAwJSwgY29sb3Itc3RvcCgyMCUsICNmZmZmZmYpLCBjb2xvci1zdG9wKDUwJSwgI2Y2ZjZmNiksIGNvbG9yLXN0b3AoNTIlLCAjZWVlZWVlKSwgY29sb3Itc3RvcCgxMDAlLCAjZjRmNGY0KSk7DQotICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYgMjAlLCAjZjZmNmY2IDUwJSwgI2VlZWVlZSA1MiUsICNmNGY0ZjQgMTAwJSk7DQotICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYgMjAlLCAjZjZmNmY2IDUwJSwgI2VlZWVlZSA1MiUsICNmNGY0ZjQgMTAwJSk7DQotICBiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjZmZmZmZmIDIwJSwgI2Y2ZjZmNiA1MCUsICNlZWVlZWUgNTIlLCAjZjRmNGY0IDEwMCUpOw0KLSAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZmZmZmZiAyMCUsICNmNmY2ZjYgNTAlLCAjZWVlZWVlIDUyJSwgI2Y0ZjRmNCAxMDAlKTsNCi0gIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7DQotICBib3gtc2hhZG93OiAwIDAgM3B4IHdoaXRlIGluc2V0LCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEpOw0KLSAgY29sb3I6ICM0NDQ7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KLSAgbGluZS1oZWlnaHQ6IDI0cHg7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLWRlZmF1bHQgew0KLSAgY29sb3I6ICM5OTk7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNpbmdsZSBzcGFuIHsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgb3ZlcmZsb3c6IGhpZGRlbjsNCi0gIG1hcmdpbi1yaWdodDogMjZweDsNCi0gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOw0KLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCi19DQotLmNob3Nlbi1jb250YWluZXItc2luZ2xlIC5jaG9zZW4tc2luZ2xlLXdpdGgtZGVzZWxlY3Qgc3BhbiB7DQotICBtYXJnaW4tcmlnaHQ6IDM4cHg7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNpbmdsZSBhYmJyIHsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHRvcDogNnB4Ow0KLSAgcmlnaHQ6IDI2cHg7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHdpZHRoOiAxMnB4Ow0KLSAgaGVpZ2h0OiAxMnB4Ow0KLSAgYmFja2dyb3VuZDogdXJsKCcuLi8uLi9pbWcvY2hvc2VuLXNwcml0ZS5wbmcnKSAtNDJweCAxcHggbm8tcmVwZWF0Ow0KLSAgZm9udC1zaXplOiAxcHg7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNpbmdsZSBhYmJyOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IC00MnB4IC0xMHB4Ow0KLX0NCi0uY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUuY2hvc2VuLWRpc2FibGVkIC5jaG9zZW4tc2luZ2xlIGFiYnI6aG92ZXIgew0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQycHggLTEwcHg7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNpbmdsZSBkaXYgew0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgdG9wOiAwOw0KLSAgcmlnaHQ6IDA7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHdpZHRoOiAxOHB4Ow0KLSAgaGVpZ2h0OiAxMDAlOw0KLX0NCi0uY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUgLmNob3Nlbi1zaW5nbGUgZGl2IGIgew0KLSAgZGlzcGxheTogYmxvY2s7DQotICB3aWR0aDogMTAwJTsNCi0gIGhlaWdodDogMTAwJTsNCi0gIGJhY2tncm91bmQ6IHVybCgnLi4vLi4vaW1nL2Nob3Nlbi1zcHJpdGUucG5nJykgbm8tcmVwZWF0IDBweCAycHg7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNlYXJjaCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICB6LWluZGV4OiAxMDEwOw0KLSAgbWFyZ2luOiAwOw0KLSAgcGFkZGluZzogM3B4IDRweDsNCi0gIHdoaXRlLXNwYWNlOiBub3dyYXA7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNlYXJjaCBpbnB1dFt0eXBlPSJ0ZXh0Il0gew0KLSAgbWFyZ2luOiAxcHggMDsNCi0gIHBhZGRpbmc6IDRweCAyMHB4IDRweCA1cHg7DQotICB3aWR0aDogMTAwJTsNCi0gIGhlaWdodDogYXV0bzsNCi0gIG91dGxpbmU6IDA7DQotICBib3JkZXI6IDFweCBzb2xpZCAjYWFhOw0KLSAgYmFja2dyb3VuZDogd2hpdGUgdXJsKCcuLi8uLi9pbWcvY2hvc2VuLXNwcml0ZS5wbmcnKSBuby1yZXBlYXQgMTAwJSAtMjBweDsNCi0gIGJhY2tncm91bmQ6IHVybCgnLi4vLi4vaW1nL2Nob3Nlbi1zcHJpdGUucG5nJykgbm8tcmVwZWF0IDEwMCUgLTIwcHg7DQotICBmb250LXNpemU6IDFlbTsNCi0gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOw0KLSAgbGluZS1oZWlnaHQ6IG5vcm1hbDsNCi0gIGJvcmRlci1yYWRpdXM6IDA7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLWRyb3Agew0KLSAgbWFyZ2luLXRvcDogLTFweDsNCi0gIGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4Ow0KLSAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsNCi19DQotLmNob3Nlbi1jb250YWluZXItc2luZ2xlLmNob3Nlbi1jb250YWluZXItc2luZ2xlLW5vc2VhcmNoIC5jaG9zZW4tc2VhcmNoIHsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIGxlZnQ6IC05OTk5cHg7DQotfQ0KLQ0KLS8qIEBlbmQgKi8NCi0vKiBAZ3JvdXAgUmVzdWx0cyAqLw0KLS5jaG9zZW4tY29udGFpbmVyIC5jaG9zZW4tcmVzdWx0cyB7DQotICBjb2xvcjogIzQ0NDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIG92ZXJmbG93LXg6IGhpZGRlbjsNCi0gIG92ZXJmbG93LXk6IGF1dG87DQotICBtYXJnaW46IDAgNHB4IDRweCAwOw0KLSAgcGFkZGluZzogMCAwIDAgNHB4Ow0KLSAgbWF4LWhlaWdodDogMjQwcHg7DQotICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyIC5jaG9zZW4tcmVzdWx0cyBsaSB7DQotICBkaXNwbGF5OiBub25lOw0KLSAgbWFyZ2luOiAwOw0KLSAgcGFkZGluZzogNXB4IDZweDsNCi0gIGxpc3Qtc3R5bGU6IG5vbmU7DQotICBsaW5lLWhlaWdodDogMTVweDsNCi0gIHdvcmQtd3JhcDogYnJlYWstd29yZDsNCi0gIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsNCi19DQotLmNob3Nlbi1jb250YWluZXIgLmNob3Nlbi1yZXN1bHRzIGxpLmFjdGl2ZS1yZXN1bHQgew0KLSAgZGlzcGxheTogbGlzdC1pdGVtOw0KLSAgY3Vyc29yOiBwb2ludGVyOw0KLX0NCi0uY2hvc2VuLWNvbnRhaW5lciAuY2hvc2VuLXJlc3VsdHMgbGkuZGlzYWJsZWQtcmVzdWx0IHsNCi0gIGRpc3BsYXk6IGxpc3QtaXRlbTsNCi0gIGNvbG9yOiAjY2NjOw0KLSAgY3Vyc29yOiBkZWZhdWx0Ow0KLX0NCi0uY2hvc2VuLWNvbnRhaW5lciAuY2hvc2VuLXJlc3VsdHMgbGkuaGlnaGxpZ2h0ZWQgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogIzM4NzVkNzsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCA1MCUgMCUsIDUwJSAxMDAlLCBjb2xvci1zdG9wKDIwJSwgIzM4NzVkNyksIGNvbG9yLXN0b3AoOTAlLCAjMmE2MmJjKSk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCgjMzg3NWQ3IDIwJSwgIzJhNjJiYyA5MCUpOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoIzM4NzVkNyAyMCUsICMyYTYyYmMgOTAlKTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCgjMzg3NWQ3IDIwJSwgIzJhNjJiYyA5MCUpOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCMzODc1ZDcgMjAlLCAjMmE2MmJjIDkwJSk7DQotICBjb2xvcjogI2ZmZjsNCi19DQotLmNob3Nlbi1jb250YWluZXIgLmNob3Nlbi1yZXN1bHRzIGxpLm5vLXJlc3VsdHMgew0KLSAgY29sb3I6ICM3Nzc7DQotICBkaXNwbGF5OiBsaXN0LWl0ZW07DQotICBiYWNrZ3JvdW5kOiAjZjRmNGY0Ow0KLX0NCi0uY2hvc2VuLWNvbnRhaW5lciAuY2hvc2VuLXJlc3VsdHMgbGkuZ3JvdXAtcmVzdWx0IHsNCi0gIGRpc3BsYXk6IGxpc3QtaXRlbTsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgY3Vyc29yOiBkZWZhdWx0Ow0KLX0NCi0uY2hvc2VuLWNvbnRhaW5lciAuY2hvc2VuLXJlc3VsdHMgbGkuZ3JvdXAtb3B0aW9uIHsNCi0gIHBhZGRpbmctbGVmdDogMTVweDsNCi19DQotLmNob3Nlbi1jb250YWluZXIgLmNob3Nlbi1yZXN1bHRzIGxpIGVtIHsNCi0gIGZvbnQtc3R5bGU6IG5vcm1hbDsNCi0gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KLX0NCi0NCi0vKiBAZW5kICovDQotLyogQGdyb3VwIE11bHRpIENob3NlbiAqLw0KLS5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBvdmVyZmxvdzogaGlkZGVuOw0KLSAgbWFyZ2luOiAwOw0KLSAgcGFkZGluZzogMCA1cHg7DQotICB3aWR0aDogMTAwJTsNCi0gIGhlaWdodDogYXV0byAhaW1wb3J0YW50Ow0KLSAgaGVpZ2h0OiAxJTsNCi0gIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDUwJSAwJSwgNTAlIDEwMCUsIGNvbG9yLXN0b3AoMSUsICNlZWVlZWUpLCBjb2xvci1zdG9wKDE1JSwgI2ZmZmZmZikpOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoI2VlZWVlZSAxJSwgI2ZmZmZmZiAxNSUpOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoI2VlZWVlZSAxJSwgI2ZmZmZmZiAxNSUpOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KCNlZWVlZWUgMSUsICNmZmZmZmYgMTUlKTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCgjZWVlZWVlIDElLCAjZmZmZmZmIDE1JSk7DQotICBjdXJzb3I6IHRleHQ7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaSB7DQotICBmbG9hdDogbGVmdDsNCi0gIGxpc3Qtc3R5bGU6IG5vbmU7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtZmllbGQgew0KLSAgbWFyZ2luOiAwOw0KLSAgcGFkZGluZzogMDsNCi0gIHdoaXRlLXNwYWNlOiBub3dyYXA7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtZmllbGQgaW5wdXRbdHlwZT0idGV4dCJdIHsNCi0gIG1hcmdpbjogMXB4IDA7DQotICBwYWRkaW5nOiAwOw0KLSAgaGVpZ2h0OiAyNXB4Ow0KLSAgb3V0bGluZTogMDsNCi0gIGJvcmRlcjogMCAhaW1wb3J0YW50Ow0KLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsNCi0gIGJveC1zaGFkb3c6IG5vbmU7DQotICBjb2xvcjogIzk5OTsNCi0gIGZvbnQtc2l6ZTogMTAwJTsNCi0gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOw0KLSAgbGluZS1oZWlnaHQ6IG5vcm1hbDsNCi0gIGJvcmRlci1yYWRpdXM6IDA7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtY2hvaWNlIHsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIG1hcmdpbjogM3B4IDVweCAzcHggMDsNCi0gIHBhZGRpbmc6IDNweCAyMHB4IDNweCA1cHg7DQotICBib3JkZXI6IDFweCBzb2xpZCAjYWFhOw0KLSAgbWF4LXdpZHRoOiAxMDAlOw0KLSAgYm9yZGVyLXJhZGl1czogM3B4Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCA1MCUgMCUsIDUwJSAxMDAlLCBjb2xvci1zdG9wKDIwJSwgI2Y0ZjRmNCksIGNvbG9yLXN0b3AoNTAlLCAjZjBmMGYwKSwgY29sb3Itc3RvcCg1MiUsICNlOGU4ZTgpLCBjb2xvci1zdG9wKDEwMCUsICNlZWVlZWUpKTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KCNmNGY0ZjQgMjAlLCAjZjBmMGYwIDUwJSwgI2U4ZThlOCA1MiUsICNlZWVlZWUgMTAwJSk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCgjZjRmNGY0IDIwJSwgI2YwZjBmMCA1MCUsICNlOGU4ZTggNTIlLCAjZWVlZWVlIDEwMCUpOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KCNmNGY0ZjQgMjAlLCAjZjBmMGYwIDUwJSwgI2U4ZThlOCA1MiUsICNlZWVlZWUgMTAwJSk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoI2Y0ZjRmNCAyMCUsICNmMGYwZjAgNTAlLCAjZThlOGU4IDUyJSwgI2VlZWVlZSAxMDAlKTsNCi0gIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxOXB4Ow0KLSAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14Ow0KLSAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsNCi0gIGJveC1zaGFkb3c6IDAgMCAycHggd2hpdGUgaW5zZXQsIDAgMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjA1KTsNCi0gIGNvbG9yOiAjMzMzOw0KLSAgbGluZS1oZWlnaHQ6IDEzcHg7DQotICBjdXJzb3I6IGRlZmF1bHQ7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtY2hvaWNlIHNwYW4gew0KLSAgd29yZC13cmFwOiBicmVhay13b3JkOw0KLX0NCi0uY2hvc2VuLWNvbnRhaW5lci1tdWx0aSAuY2hvc2VuLWNob2ljZXMgbGkuc2VhcmNoLWNob2ljZSAuc2VhcmNoLWNob2ljZS1jbG9zZSB7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICB0b3A6IDRweDsNCi0gIHJpZ2h0OiAzcHg7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHdpZHRoOiAxMnB4Ow0KLSAgaGVpZ2h0OiAxMnB4Ow0KLSAgYmFja2dyb3VuZDogdXJsKCcuLi8uLi9pbWcvY2hvc2VuLXNwcml0ZS5wbmcnKSAtNDJweCAxcHggbm8tcmVwZWF0Ow0KLSAgZm9udC1zaXplOiAxcHg7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtY2hvaWNlIC5zZWFyY2gtY2hvaWNlLWNsb3NlOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IC00MnB4IC0xMHB4Ow0KLX0NCi0uY2hvc2VuLWNvbnRhaW5lci1tdWx0aSAuY2hvc2VuLWNob2ljZXMgbGkuc2VhcmNoLWNob2ljZS1kaXNhYmxlZCB7DQotICBwYWRkaW5nLXJpZ2h0OiA1cHg7DQotICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOw0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2U0ZTRlNDsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCA1MCUgMCUsIDUwJSAxMDAlLCBjb2xvci1zdG9wKDIwJSwgI2Y0ZjRmNCksIGNvbG9yLXN0b3AoNTAlLCAjZjBmMGYwKSwgY29sb3Itc3RvcCg1MiUsICNlOGU4ZTgpLCBjb2xvci1zdG9wKDEwMCUsICNlZWVlZWUpKTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgI2Y0ZjRmNCAyMCUsICNmMGYwZjAgNTAlLCAjZThlOGU4IDUyJSwgI2VlZWVlZSAxMDAlKTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2Y0ZjRmNCAyMCUsICNmMGYwZjAgNTAlLCAjZThlOGU4IDUyJSwgI2VlZWVlZSAxMDAlKTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICNmNGY0ZjQgMjAlLCAjZjBmMGYwIDUwJSwgI2U4ZThlOCA1MiUsICNlZWVlZWUgMTAwJSk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjZjRmNGY0IDIwJSwgI2YwZjBmMCA1MCUsICNlOGU4ZTggNTIlLCAjZWVlZWVlIDEwMCUpOw0KLSAgY29sb3I6ICM2NjY7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtY2hvaWNlLWZvY3VzIHsNCi0gIGJhY2tncm91bmQ6ICNkNGQ0ZDQ7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtY2hvaWNlLWZvY3VzIC5zZWFyY2gtY2hvaWNlLWNsb3NlIHsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IC00MnB4IC0xMHB4Ow0KLX0NCi0uY2hvc2VuLWNvbnRhaW5lci1tdWx0aSAuY2hvc2VuLXJlc3VsdHMgew0KLSAgbWFyZ2luOiAwOw0KLSAgcGFkZGluZzogMDsNCi19DQotLmNob3Nlbi1jb250YWluZXItbXVsdGkgLmNob3Nlbi1kcm9wIC5yZXN1bHQtc2VsZWN0ZWQgew0KLSAgZGlzcGxheTogbGlzdC1pdGVtOw0KLSAgY29sb3I6ICNjY2M7DQotICBjdXJzb3I6IGRlZmF1bHQ7DQotfQ0KLQ0KLS8qIEBlbmQgKi8NCi0vKiBAZ3JvdXAgQWN0aXZlICAqLw0KLS5jaG9zZW4tY29udGFpbmVyLWFjdGl2ZSAuY2hvc2VuLXNpbmdsZSB7DQotICBib3JkZXI6IDFweCBzb2xpZCAjNTg5N2ZiOw0KLSAgYm94LXNoYWRvdzogMCAwIDVweCByZ2JhKDAsIDAsIDAsIDAuMyk7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLWFjdGl2ZS5jaG9zZW4td2l0aC1kcm9wIC5jaG9zZW4tc2luZ2xlIHsNCi0gIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7DQotICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDA7DQotICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDsNCi0gIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiAwOw0KLSAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCA1MCUgMCUsIDUwJSAxMDAlLCBjb2xvci1zdG9wKDIwJSwgI2VlZWVlZSksIGNvbG9yLXN0b3AoODAlLCAjZmZmZmZmKSk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCgjZWVlZWVlIDIwJSwgI2ZmZmZmZiA4MCUpOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoI2VlZWVlZSAyMCUsICNmZmZmZmYgODAlKTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCgjZWVlZWVlIDIwJSwgI2ZmZmZmZiA4MCUpOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCNlZWVlZWUgMjAlLCAjZmZmZmZmIDgwJSk7DQotICBib3gtc2hhZG93OiAwIDFweCAwICNmZmYgaW5zZXQ7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLWFjdGl2ZS5jaG9zZW4td2l0aC1kcm9wIC5jaG9zZW4tc2luZ2xlIGRpdiB7DQotICBib3JkZXItbGVmdDogbm9uZTsNCi0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Ow0KLX0NCi0uY2hvc2VuLWNvbnRhaW5lci1hY3RpdmUuY2hvc2VuLXdpdGgtZHJvcCAuY2hvc2VuLXNpbmdsZSBkaXYgYiB7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMThweCAycHg7DQotfQ0KLS5jaG9zZW4tY29udGFpbmVyLWFjdGl2ZSAuY2hvc2VuLWNob2ljZXMgew0KLSAgYm9yZGVyOiAxcHggc29saWQgIzU4OTdmYjsNCi0gIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjMpOw0KLX0NCi0uY2hvc2VuLWNvbnRhaW5lci1hY3RpdmUgLmNob3Nlbi1jaG9pY2VzIGxpLnNlYXJjaC1maWVsZCBpbnB1dFt0eXBlPSJ0ZXh0Il0gew0KLSAgY29sb3I6ICMyMjIgIWltcG9ydGFudDsNCi19DQotDQotLyogQGVuZCAqLw0KLS8qIEBncm91cCBEaXNhYmxlZCBTdXBwb3J0ICovDQotLmNob3Nlbi1kaXNhYmxlZCB7DQotICBvcGFjaXR5OiAwLjUgIWltcG9ydGFudDsNCi0gIGN1cnNvcjogZGVmYXVsdDsNCi19DQotLmNob3Nlbi1kaXNhYmxlZCAuY2hvc2VuLXNpbmdsZSB7DQotICBjdXJzb3I6IGRlZmF1bHQ7DQotfQ0KLS5jaG9zZW4tZGlzYWJsZWQgLmNob3Nlbi1jaG9pY2VzIC5zZWFyY2gtY2hvaWNlIC5zZWFyY2gtY2hvaWNlLWNsb3NlIHsNCi0gIGN1cnNvcjogZGVmYXVsdDsNCi19DQotDQotLyogQGVuZCAqLw0KLS8qIEBncm91cCBSaWdodCB0byBMZWZ0ICovDQotLmNob3Nlbi1ydGwgew0KLSAgdGV4dC1hbGlnbjogcmlnaHQ7DQotfQ0KLS5jaG9zZW4tcnRsIC5jaG9zZW4tc2luZ2xlIHsNCi0gIG92ZXJmbG93OiB2aXNpYmxlOw0KLSAgcGFkZGluZzogMCA4cHggMCAwOw0KLX0NCi0uY2hvc2VuLXJ0bCAuY2hvc2VuLXNpbmdsZSBzcGFuIHsNCi0gIG1hcmdpbi1yaWdodDogMDsNCi0gIG1hcmdpbi1sZWZ0OiAyNnB4Ow0KLSAgZGlyZWN0aW9uOiBydGw7DQotfQ0KLS5jaG9zZW4tcnRsIC5jaG9zZW4tc2luZ2xlLXdpdGgtZGVzZWxlY3Qgc3BhbiB7DQotICBtYXJnaW4tbGVmdDogMzhweDsNCi19DQotLmNob3Nlbi1ydGwgLmNob3Nlbi1zaW5nbGUgZGl2IHsNCi0gIHJpZ2h0OiBhdXRvOw0KLSAgbGVmdDogM3B4Ow0KLX0NCi0uY2hvc2VuLXJ0bCAuY2hvc2VuLXNpbmdsZSBhYmJyIHsNCi0gIHJpZ2h0OiBhdXRvOw0KLSAgbGVmdDogMjZweDsNCi19DQotLmNob3Nlbi1ydGwgLmNob3Nlbi1jaG9pY2VzIGxpIHsNCi0gIGZsb2F0OiByaWdodDsNCi19DQotLmNob3Nlbi1ydGwgLmNob3Nlbi1jaG9pY2VzIGxpLnNlYXJjaC1maWVsZCBpbnB1dFt0eXBlPSJ0ZXh0Il0gew0KLSAgZGlyZWN0aW9uOiBydGw7DQotfQ0KLS5jaG9zZW4tcnRsIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtY2hvaWNlIHsNCi0gIG1hcmdpbjogM3B4IDVweCAzcHggMDsNCi0gIHBhZGRpbmc6IDNweCA1cHggM3B4IDE5cHg7DQotfQ0KLS5jaG9zZW4tcnRsIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtY2hvaWNlIC5zZWFyY2gtY2hvaWNlLWNsb3NlIHsNCi0gIHJpZ2h0OiBhdXRvOw0KLSAgbGVmdDogNHB4Ow0KLX0NCi0uY2hvc2VuLXJ0bC5jaG9zZW4tY29udGFpbmVyLXNpbmdsZS1ub3NlYXJjaCAuY2hvc2VuLXNlYXJjaCwNCi0uY2hvc2VuLXJ0bCAuY2hvc2VuLWRyb3Agew0KLSAgbGVmdDogOTk5OXB4Ow0KLX0NCi0uY2hvc2VuLXJ0bC5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXJlc3VsdHMgew0KLSAgbWFyZ2luOiAwIDAgNHB4IDRweDsNCi0gIHBhZGRpbmc6IDAgNHB4IDAgMDsNCi19DQotLmNob3Nlbi1ydGwgLmNob3Nlbi1yZXN1bHRzIGxpLmdyb3VwLW9wdGlvbiB7DQotICBwYWRkaW5nLXJpZ2h0OiAxNXB4Ow0KLSAgcGFkZGluZy1sZWZ0OiAwOw0KLX0NCi0uY2hvc2VuLXJ0bC5jaG9zZW4tY29udGFpbmVyLWFjdGl2ZS5jaG9zZW4td2l0aC1kcm9wIC5jaG9zZW4tc2luZ2xlIGRpdiB7DQotICBib3JkZXItcmlnaHQ6IG5vbmU7DQotfQ0KLS5jaG9zZW4tcnRsIC5jaG9zZW4tc2VhcmNoIGlucHV0W3R5cGU9InRleHQiXSB7DQotICBwYWRkaW5nOiA0cHggNXB4IDRweCAyMHB4Ow0KLSAgYmFja2dyb3VuZDogd2hpdGUgdXJsKCcuLi8uLi9pbWcvY2hvc2VuLXNwcml0ZS5wbmcnKSBuby1yZXBlYXQgLTMwcHggLTIwcHg7DQotICBiYWNrZ3JvdW5kOiB1cmwoJy4uLy4uL2ltZy9jaG9zZW4tc3ByaXRlLnBuZycpIG5vLXJlcGVhdCAtMzBweCAtMjBweDsNCi0gIGRpcmVjdGlvbjogcnRsOw0KLX0NCi0uY2hvc2VuLXJ0bC5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNpbmdsZSBkaXYgYiB7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA2cHggMnB4Ow0KLX0NCi0uY2hvc2VuLXJ0bC5jaG9zZW4tY29udGFpbmVyLXNpbmdsZS5jaG9zZW4td2l0aC1kcm9wIC5jaG9zZW4tc2luZ2xlIGRpdiBiIHsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IC0xMnB4IDJweDsNCi19DQotDQotLyogQGVuZCAqLw0KLS8qIEBncm91cCBSZXRpbmEgY29tcGF0aWJpbGl0eSAqLw0KLUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksIG9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE0NGRwaSkgew0KLSAgLmNob3Nlbi1ydGwgLmNob3Nlbi1zZWFyY2ggaW5wdXRbdHlwZT0idGV4dCJdLA0KLSAgLmNob3Nlbi1jb250YWluZXItc2luZ2xlIC5jaG9zZW4tc2luZ2xlIGFiYnIsDQotICAuY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUgLmNob3Nlbi1zaW5nbGUgZGl2IGIsDQotICAuY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUgLmNob3Nlbi1zZWFyY2ggaW5wdXRbdHlwZT0idGV4dCJdLA0KLSAgLmNob3Nlbi1jb250YWluZXItbXVsdGkgLmNob3Nlbi1jaG9pY2VzIC5zZWFyY2gtY2hvaWNlIC5zZWFyY2gtY2hvaWNlLWNsb3NlLA0KLSAgLmNob3Nlbi1jb250YWluZXIgLmNob3Nlbi1yZXN1bHRzLXNjcm9sbC1kb3duIHNwYW4sDQotICAuY2hvc2VuLWNvbnRhaW5lciAuY2hvc2VuLXJlc3VsdHMtc2Nyb2xsLXVwIHNwYW4gew0KLSAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uLy4uL2ltZy9jaG9zZW4tc3ByaXRlLTJ4LnBuZycpICFpbXBvcnRhbnQ7DQotICAgIGJhY2tncm91bmQtc2l6ZTogNTJweCAzN3B4ICFpbXBvcnRhbnQ7DQotICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQgIWltcG9ydGFudDsNCi0gIH0NCi19DQotLyogQGVuZCAqLw0KKy8qCisKK0Nob3NlbgorCistIGJ5IFBhdHJpY2sgRmlsbGVyIGZvciBIYXJ2ZXN0IGh0dHA6Ly9nZXRoYXJ2ZXN0LmNvbQorLSBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMyBieSBIYXJ2ZXN0CisKK0F2YWlsYWJsZSBmb3IgdXNlIHVuZGVyIHRoZSBNSVQgTGljZW5zZQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworKi8KKy8qIQorQ2hvc2VuLCBhIFNlbGVjdCBCb3ggRW5oYW5jZXIgZm9yIGpRdWVyeSBhbmQgUHJvdG90eXBlCitieSBQYXRyaWNrIEZpbGxlciBmb3IgSGFydmVzdCwgaHR0cDovL2dldGhhcnZlc3QuY29tCisKK1ZlcnNpb24gMS4zLjAKK0Z1bGwgc291cmNlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJ2ZXN0aHEvY2hvc2VuCitDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBIYXJ2ZXN0IGh0dHA6Ly9nZXRoYXJ2ZXN0LmNvbQorCitNSVQgTGljZW5zZSwgaHR0cHM6Ly9naXRodWIuY29tL2hhcnZlc3RocS9jaG9zZW4vYmxvYi9tYXN0ZXIvTElDRU5TRS5tZAorVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBgZ3J1bnQgYnVpbGRgLCBkbyBub3QgZWRpdCBpdCBieSBoYW5kLgorKi8KKworLyogQGdyb3VwIEJhc2UgKi8KKy5jaG9zZW4tY29udGFpbmVyIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgIGZvbnQtc2l6ZTogMTNweDsKKyAgem9vbTogMTsKKyAgKmRpc3BsYXk6IGlubGluZTsKKyAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKKyAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKKyAgdXNlci1zZWxlY3Q6IG5vbmU7Cit9CisuY2hvc2VuLWNvbnRhaW5lciAqIHsKKyAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94OworICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CisgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cit9CisuY2hvc2VuLWNvbnRhaW5lciAuY2hvc2VuLWRyb3AgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHRvcDogMTAwJTsKKyAgbGVmdDogLTk5OTlweDsKKyAgei1pbmRleDogMTAxMDsKKyAgd2lkdGg6IDEwMCU7CisgIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7CisgIGJvcmRlci10b3A6IDA7CisgIGJhY2tncm91bmQ6ICNmZmY7CisgIGJveC1zaGFkb3c6IDAgNHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTUpOworfQorLmNob3Nlbi1jb250YWluZXIuY2hvc2VuLXdpdGgtZHJvcCAuY2hvc2VuLWRyb3AgeworICBsZWZ0OiAwOworfQorLmNob3Nlbi1jb250YWluZXIgYSB7CisgIGN1cnNvcjogcG9pbnRlcjsKK30KKworLyogQGVuZCAqLworLyogQGdyb3VwIFNpbmdsZSBDaG9zZW4gKi8KKy5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNpbmdsZSB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgZGlzcGxheTogYmxvY2s7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBhZGRpbmc6IDAgMCAwIDhweDsKKyAgaGVpZ2h0OiAyNXB4OworICBib3JkZXI6IDFweCBzb2xpZCAjYWFhOworICBib3JkZXItcmFkaXVzOiA1cHg7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgIGJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCA1MCUgMCUsIDUwJSAxMDAlLCBjb2xvci1zdG9wKDIwJSwgI2ZmZmZmZiksIGNvbG9yLXN0b3AoNTAlLCAjZjZmNmY2KSwgY29sb3Itc3RvcCg1MiUsICNlZWVlZWUpLCBjb2xvci1zdG9wKDEwMCUsICNmNGY0ZjQpKTsKKyAgYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjZmZmZmZmIDIwJSwgI2Y2ZjZmNiA1MCUsICNlZWVlZWUgNTIlLCAjZjRmNGY0IDEwMCUpOworICBiYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYgMjAlLCAjZjZmNmY2IDUwJSwgI2VlZWVlZSA1MiUsICNmNGY0ZjQgMTAwJSk7CisgIGJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYgMjAlLCAjZjZmNmY2IDUwJSwgI2VlZWVlZSA1MiUsICNmNGY0ZjQgMTAwJSk7CisgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYgMjAlLCAjZjZmNmY2IDUwJSwgI2VlZWVlZSA1MiUsICNmNGY0ZjQgMTAwJSk7CisgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7CisgIGJveC1zaGFkb3c6IDAgMCAzcHggd2hpdGUgaW5zZXQsIDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMSk7CisgIGNvbG9yOiAjNDQ0OworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgIGxpbmUtaGVpZ2h0OiAyNHB4OworfQorLmNob3Nlbi1jb250YWluZXItc2luZ2xlIC5jaG9zZW4tZGVmYXVsdCB7CisgIGNvbG9yOiAjOTk5OworfQorLmNob3Nlbi1jb250YWluZXItc2luZ2xlIC5jaG9zZW4tc2luZ2xlIHNwYW4geworICBkaXNwbGF5OiBibG9jazsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgbWFyZ2luLXJpZ2h0OiAyNnB4OworICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKy5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNpbmdsZS13aXRoLWRlc2VsZWN0IHNwYW4geworICBtYXJnaW4tcmlnaHQ6IDM4cHg7Cit9CisuY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUgLmNob3Nlbi1zaW5nbGUgYWJiciB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgdG9wOiA2cHg7CisgIHJpZ2h0OiAyNnB4OworICBkaXNwbGF5OiBibG9jazsKKyAgd2lkdGg6IDEycHg7CisgIGhlaWdodDogMTJweDsKKyAgYmFja2dyb3VuZDogdXJsKCcuLi8uLi9pbWcvY2hvc2VuLXNwcml0ZS5wbmcnKSAtNDJweCAxcHggbm8tcmVwZWF0OworICBmb250LXNpemU6IDFweDsKK30KKy5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNpbmdsZSBhYmJyOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQycHggLTEwcHg7Cit9CisuY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUuY2hvc2VuLWRpc2FibGVkIC5jaG9zZW4tc2luZ2xlIGFiYnI6aG92ZXIgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDJweCAtMTBweDsKK30KKy5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNpbmdsZSBkaXYgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHRvcDogMDsKKyAgcmlnaHQ6IDA7CisgIGRpc3BsYXk6IGJsb2NrOworICB3aWR0aDogMThweDsKKyAgaGVpZ2h0OiAxMDAlOworfQorLmNob3Nlbi1jb250YWluZXItc2luZ2xlIC5jaG9zZW4tc2luZ2xlIGRpdiBiIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIHdpZHRoOiAxMDAlOworICBoZWlnaHQ6IDEwMCU7CisgIGJhY2tncm91bmQ6IHVybCgnLi4vLi4vaW1nL2Nob3Nlbi1zcHJpdGUucG5nJykgbm8tcmVwZWF0IDBweCAycHg7Cit9CisuY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUgLmNob3Nlbi1zZWFyY2ggeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHotaW5kZXg6IDEwMTA7CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogM3B4IDRweDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKy5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNlYXJjaCBpbnB1dFt0eXBlPSJ0ZXh0Il0geworICBtYXJnaW46IDFweCAwOworICBwYWRkaW5nOiA0cHggMjBweCA0cHggNXB4OworICB3aWR0aDogMTAwJTsKKyAgaGVpZ2h0OiBhdXRvOworICBvdXRsaW5lOiAwOworICBib3JkZXI6IDFweCBzb2xpZCAjYWFhOworICBiYWNrZ3JvdW5kOiB3aGl0ZSB1cmwoJy4uLy4uL2ltZy9jaG9zZW4tc3ByaXRlLnBuZycpIG5vLXJlcGVhdCAxMDAlIC0yMHB4OworICBiYWNrZ3JvdW5kOiB1cmwoJy4uLy4uL2ltZy9jaG9zZW4tc3ByaXRlLnBuZycpIG5vLXJlcGVhdCAxMDAlIC0yMHB4OworICBmb250LXNpemU6IDFlbTsKKyAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisgIGxpbmUtaGVpZ2h0OiBub3JtYWw7CisgIGJvcmRlci1yYWRpdXM6IDA7Cit9CisuY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUgLmNob3Nlbi1kcm9wIHsKKyAgbWFyZ2luLXRvcDogLTFweDsKKyAgYm9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7CisgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7Cit9CisuY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUuY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUtbm9zZWFyY2ggLmNob3Nlbi1zZWFyY2ggeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IC05OTk5cHg7Cit9CisKKy8qIEBlbmQgKi8KKy8qIEBncm91cCBSZXN1bHRzICovCisuY2hvc2VuLWNvbnRhaW5lciAuY2hvc2VuLXJlc3VsdHMgeworICBjb2xvcjogIzQ0NDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBvdmVyZmxvdy14OiBoaWRkZW47CisgIG92ZXJmbG93LXk6IGF1dG87CisgIG1hcmdpbjogMCA0cHggNHB4IDA7CisgIHBhZGRpbmc6IDAgMCAwIDRweDsKKyAgbWF4LWhlaWdodDogMjQwcHg7CisgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKK30KKy5jaG9zZW4tY29udGFpbmVyIC5jaG9zZW4tcmVzdWx0cyBsaSB7CisgIGRpc3BsYXk6IG5vbmU7CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogNXB4IDZweDsKKyAgbGlzdC1zdHlsZTogbm9uZTsKKyAgbGluZS1oZWlnaHQ6IDE1cHg7CisgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKKyAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOworfQorLmNob3Nlbi1jb250YWluZXIgLmNob3Nlbi1yZXN1bHRzIGxpLmFjdGl2ZS1yZXN1bHQgeworICBkaXNwbGF5OiBsaXN0LWl0ZW07CisgIGN1cnNvcjogcG9pbnRlcjsKK30KKy5jaG9zZW4tY29udGFpbmVyIC5jaG9zZW4tcmVzdWx0cyBsaS5kaXNhYmxlZC1yZXN1bHQgeworICBkaXNwbGF5OiBsaXN0LWl0ZW07CisgIGNvbG9yOiAjY2NjOworICBjdXJzb3I6IGRlZmF1bHQ7Cit9CisuY2hvc2VuLWNvbnRhaW5lciAuY2hvc2VuLXJlc3VsdHMgbGkuaGlnaGxpZ2h0ZWQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzg3NWQ3OworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgNTAlIDAlLCA1MCUgMTAwJSwgY29sb3Itc3RvcCgyMCUsICMzODc1ZDcpLCBjb2xvci1zdG9wKDkwJSwgIzJhNjJiYykpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCgjMzg3NWQ3IDIwJSwgIzJhNjJiYyA5MCUpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCgjMzg3NWQ3IDIwJSwgIzJhNjJiYyA5MCUpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoIzM4NzVkNyAyMCUsICMyYTYyYmMgOTAlKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCMzODc1ZDcgMjAlLCAjMmE2MmJjIDkwJSk7CisgIGNvbG9yOiAjZmZmOworfQorLmNob3Nlbi1jb250YWluZXIgLmNob3Nlbi1yZXN1bHRzIGxpLm5vLXJlc3VsdHMgeworICBjb2xvcjogIzc3NzsKKyAgZGlzcGxheTogbGlzdC1pdGVtOworICBiYWNrZ3JvdW5kOiAjZjRmNGY0OworfQorLmNob3Nlbi1jb250YWluZXIgLmNob3Nlbi1yZXN1bHRzIGxpLmdyb3VwLXJlc3VsdCB7CisgIGRpc3BsYXk6IGxpc3QtaXRlbTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGN1cnNvcjogZGVmYXVsdDsKK30KKy5jaG9zZW4tY29udGFpbmVyIC5jaG9zZW4tcmVzdWx0cyBsaS5ncm91cC1vcHRpb24geworICBwYWRkaW5nLWxlZnQ6IDE1cHg7Cit9CisuY2hvc2VuLWNvbnRhaW5lciAuY2hvc2VuLXJlc3VsdHMgbGkgZW0geworICBmb250LXN0eWxlOiBub3JtYWw7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCisvKiBAZW5kICovCisvKiBAZ3JvdXAgTXVsdGkgQ2hvc2VuICovCisuY2hvc2VuLWNvbnRhaW5lci1tdWx0aSAuY2hvc2VuLWNob2ljZXMgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogMCA1cHg7CisgIHdpZHRoOiAxMDAlOworICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsKKyAgaGVpZ2h0OiAxJTsKKyAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDUwJSAwJSwgNTAlIDEwMCUsIGNvbG9yLXN0b3AoMSUsICNlZWVlZWUpLCBjb2xvci1zdG9wKDE1JSwgI2ZmZmZmZikpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCgjZWVlZWVlIDElLCAjZmZmZmZmIDE1JSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KCNlZWVlZWUgMSUsICNmZmZmZmYgMTUlKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KCNlZWVlZWUgMSUsICNmZmZmZmYgMTUlKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCNlZWVlZWUgMSUsICNmZmZmZmYgMTUlKTsKKyAgY3Vyc29yOiB0ZXh0OworfQorLmNob3Nlbi1jb250YWluZXItbXVsdGkgLmNob3Nlbi1jaG9pY2VzIGxpIHsKKyAgZmxvYXQ6IGxlZnQ7CisgIGxpc3Qtc3R5bGU6IG5vbmU7Cit9CisuY2hvc2VuLWNvbnRhaW5lci1tdWx0aSAuY2hvc2VuLWNob2ljZXMgbGkuc2VhcmNoLWZpZWxkIHsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorLmNob3Nlbi1jb250YWluZXItbXVsdGkgLmNob3Nlbi1jaG9pY2VzIGxpLnNlYXJjaC1maWVsZCBpbnB1dFt0eXBlPSJ0ZXh0Il0geworICBtYXJnaW46IDFweCAwOworICBwYWRkaW5nOiAwOworICBoZWlnaHQ6IDI1cHg7CisgIG91dGxpbmU6IDA7CisgIGJvcmRlcjogMCAhaW1wb3J0YW50OworICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OworICBib3gtc2hhZG93OiBub25lOworICBjb2xvcjogIzk5OTsKKyAgZm9udC1zaXplOiAxMDAlOworICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKyAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKKyAgYm9yZGVyLXJhZGl1czogMDsKK30KKy5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtY2hvaWNlIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBtYXJnaW46IDNweCA1cHggM3B4IDA7CisgIHBhZGRpbmc6IDNweCAyMHB4IDNweCA1cHg7CisgIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7CisgIG1heC13aWR0aDogMTAwJTsKKyAgYm9yZGVyLXJhZGl1czogM3B4OworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgNTAlIDAlLCA1MCUgMTAwJSwgY29sb3Itc3RvcCgyMCUsICNmNGY0ZjQpLCBjb2xvci1zdG9wKDUwJSwgI2YwZjBmMCksIGNvbG9yLXN0b3AoNTIlLCAjZThlOGU4KSwgY29sb3Itc3RvcCgxMDAlLCAjZWVlZWVlKSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KCNmNGY0ZjQgMjAlLCAjZjBmMGYwIDUwJSwgI2U4ZThlOCA1MiUsICNlZWVlZWUgMTAwJSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KCNmNGY0ZjQgMjAlLCAjZjBmMGYwIDUwJSwgI2U4ZThlOCA1MiUsICNlZWVlZWUgMTAwJSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCgjZjRmNGY0IDIwJSwgI2YwZjBmMCA1MCUsICNlOGU4ZTggNTIlLCAjZWVlZWVlIDEwMCUpOworICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoI2Y0ZjRmNCAyMCUsICNmMGYwZjAgNTAlLCAjZThlOGU4IDUyJSwgI2VlZWVlZSAxMDAlKTsKKyAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDE5cHg7CisgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKKyAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKKyAgYm94LXNoYWRvdzogMCAwIDJweCB3aGl0ZSBpbnNldCwgMCAxcHggMCByZ2JhKDAsIDAsIDAsIDAuMDUpOworICBjb2xvcjogIzMzMzsKKyAgbGluZS1oZWlnaHQ6IDEzcHg7CisgIGN1cnNvcjogZGVmYXVsdDsKK30KKy5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtY2hvaWNlIHNwYW4geworICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cit9CisuY2hvc2VuLWNvbnRhaW5lci1tdWx0aSAuY2hvc2VuLWNob2ljZXMgbGkuc2VhcmNoLWNob2ljZSAuc2VhcmNoLWNob2ljZS1jbG9zZSB7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgdG9wOiA0cHg7CisgIHJpZ2h0OiAzcHg7CisgIGRpc3BsYXk6IGJsb2NrOworICB3aWR0aDogMTJweDsKKyAgaGVpZ2h0OiAxMnB4OworICBiYWNrZ3JvdW5kOiB1cmwoJy4uLy4uL2ltZy9jaG9zZW4tc3ByaXRlLnBuZycpIC00MnB4IDFweCBuby1yZXBlYXQ7CisgIGZvbnQtc2l6ZTogMXB4OworfQorLmNob3Nlbi1jb250YWluZXItbXVsdGkgLmNob3Nlbi1jaG9pY2VzIGxpLnNlYXJjaC1jaG9pY2UgLnNlYXJjaC1jaG9pY2UtY2xvc2U6aG92ZXIgeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDJweCAtMTBweDsKK30KKy5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtY2hvaWNlLWRpc2FibGVkIHsKKyAgcGFkZGluZy1yaWdodDogNXB4OworICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTRlNGU0OworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgNTAlIDAlLCA1MCUgMTAwJSwgY29sb3Itc3RvcCgyMCUsICNmNGY0ZjQpLCBjb2xvci1zdG9wKDUwJSwgI2YwZjBmMCksIGNvbG9yLXN0b3AoNTIlLCAjZThlOGU4KSwgY29sb3Itc3RvcCgxMDAlLCAjZWVlZWVlKSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgI2Y0ZjRmNCAyMCUsICNmMGYwZjAgNTAlLCAjZThlOGU4IDUyJSwgI2VlZWVlZSAxMDAlKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjZjRmNGY0IDIwJSwgI2YwZjBmMCA1MCUsICNlOGU4ZTggNTIlLCAjZWVlZWVlIDEwMCUpOworICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjZjRmNGY0IDIwJSwgI2YwZjBmMCA1MCUsICNlOGU4ZTggNTIlLCAjZWVlZWVlIDEwMCUpOworICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjZjRmNGY0IDIwJSwgI2YwZjBmMCA1MCUsICNlOGU4ZTggNTIlLCAjZWVlZWVlIDEwMCUpOworICBjb2xvcjogIzY2NjsKK30KKy5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtY2hvaWNlLWZvY3VzIHsKKyAgYmFja2dyb3VuZDogI2Q0ZDRkNDsKK30KKy5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyBsaS5zZWFyY2gtY2hvaWNlLWZvY3VzIC5zZWFyY2gtY2hvaWNlLWNsb3NlIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQycHggLTEwcHg7Cit9CisuY2hvc2VuLWNvbnRhaW5lci1tdWx0aSAuY2hvc2VuLXJlc3VsdHMgeworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDA7Cit9CisuY2hvc2VuLWNvbnRhaW5lci1tdWx0aSAuY2hvc2VuLWRyb3AgLnJlc3VsdC1zZWxlY3RlZCB7CisgIGRpc3BsYXk6IGxpc3QtaXRlbTsKKyAgY29sb3I6ICNjY2M7CisgIGN1cnNvcjogZGVmYXVsdDsKK30KKworLyogQGVuZCAqLworLyogQGdyb3VwIEFjdGl2ZSAgKi8KKy5jaG9zZW4tY29udGFpbmVyLWFjdGl2ZSAuY2hvc2VuLXNpbmdsZSB7CisgIGJvcmRlcjogMXB4IHNvbGlkICM1ODk3ZmI7CisgIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSgwLCAwLCAwLCAwLjMpOworfQorLmNob3Nlbi1jb250YWluZXItYWN0aXZlLmNob3Nlbi13aXRoLWRyb3AgLmNob3Nlbi1zaW5nbGUgeworICBib3JkZXI6IDFweCBzb2xpZCAjYWFhOworICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDA7CisgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwOworICAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDogMDsKKyAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDUwJSAwJSwgNTAlIDEwMCUsIGNvbG9yLXN0b3AoMjAlLCAjZWVlZWVlKSwgY29sb3Itc3RvcCg4MCUsICNmZmZmZmYpKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoI2VlZWVlZSAyMCUsICNmZmZmZmYgODAlKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoI2VlZWVlZSAyMCUsICNmZmZmZmYgODAlKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KCNlZWVlZWUgMjAlLCAjZmZmZmZmIDgwJSk7CisgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCgjZWVlZWVlIDIwJSwgI2ZmZmZmZiA4MCUpOworICBib3gtc2hhZG93OiAwIDFweCAwICNmZmYgaW5zZXQ7Cit9CisuY2hvc2VuLWNvbnRhaW5lci1hY3RpdmUuY2hvc2VuLXdpdGgtZHJvcCAuY2hvc2VuLXNpbmdsZSBkaXYgeworICBib3JkZXItbGVmdDogbm9uZTsKKyAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cit9CisuY2hvc2VuLWNvbnRhaW5lci1hY3RpdmUuY2hvc2VuLXdpdGgtZHJvcCAuY2hvc2VuLXNpbmdsZSBkaXYgYiB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC0xOHB4IDJweDsKK30KKy5jaG9zZW4tY29udGFpbmVyLWFjdGl2ZSAuY2hvc2VuLWNob2ljZXMgeworICBib3JkZXI6IDFweCBzb2xpZCAjNTg5N2ZiOworICBib3gtc2hhZG93OiAwIDAgNXB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKK30KKy5jaG9zZW4tY29udGFpbmVyLWFjdGl2ZSAuY2hvc2VuLWNob2ljZXMgbGkuc2VhcmNoLWZpZWxkIGlucHV0W3R5cGU9InRleHQiXSB7CisgIGNvbG9yOiAjMjIyICFpbXBvcnRhbnQ7Cit9CisKKy8qIEBlbmQgKi8KKy8qIEBncm91cCBEaXNhYmxlZCBTdXBwb3J0ICovCisuY2hvc2VuLWRpc2FibGVkIHsKKyAgb3BhY2l0eTogMC41ICFpbXBvcnRhbnQ7CisgIGN1cnNvcjogZGVmYXVsdDsKK30KKy5jaG9zZW4tZGlzYWJsZWQgLmNob3Nlbi1zaW5nbGUgeworICBjdXJzb3I6IGRlZmF1bHQ7Cit9CisuY2hvc2VuLWRpc2FibGVkIC5jaG9zZW4tY2hvaWNlcyAuc2VhcmNoLWNob2ljZSAuc2VhcmNoLWNob2ljZS1jbG9zZSB7CisgIGN1cnNvcjogZGVmYXVsdDsKK30KKworLyogQGVuZCAqLworLyogQGdyb3VwIFJpZ2h0IHRvIExlZnQgKi8KKy5jaG9zZW4tcnRsIHsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisuY2hvc2VuLXJ0bCAuY2hvc2VuLXNpbmdsZSB7CisgIG92ZXJmbG93OiB2aXNpYmxlOworICBwYWRkaW5nOiAwIDhweCAwIDA7Cit9CisuY2hvc2VuLXJ0bCAuY2hvc2VuLXNpbmdsZSBzcGFuIHsKKyAgbWFyZ2luLXJpZ2h0OiAwOworICBtYXJnaW4tbGVmdDogMjZweDsKKyAgZGlyZWN0aW9uOiBydGw7Cit9CisuY2hvc2VuLXJ0bCAuY2hvc2VuLXNpbmdsZS13aXRoLWRlc2VsZWN0IHNwYW4geworICBtYXJnaW4tbGVmdDogMzhweDsKK30KKy5jaG9zZW4tcnRsIC5jaG9zZW4tc2luZ2xlIGRpdiB7CisgIHJpZ2h0OiBhdXRvOworICBsZWZ0OiAzcHg7Cit9CisuY2hvc2VuLXJ0bCAuY2hvc2VuLXNpbmdsZSBhYmJyIHsKKyAgcmlnaHQ6IGF1dG87CisgIGxlZnQ6IDI2cHg7Cit9CisuY2hvc2VuLXJ0bCAuY2hvc2VuLWNob2ljZXMgbGkgeworICBmbG9hdDogcmlnaHQ7Cit9CisuY2hvc2VuLXJ0bCAuY2hvc2VuLWNob2ljZXMgbGkuc2VhcmNoLWZpZWxkIGlucHV0W3R5cGU9InRleHQiXSB7CisgIGRpcmVjdGlvbjogcnRsOworfQorLmNob3Nlbi1ydGwgLmNob3Nlbi1jaG9pY2VzIGxpLnNlYXJjaC1jaG9pY2UgeworICBtYXJnaW46IDNweCA1cHggM3B4IDA7CisgIHBhZGRpbmc6IDNweCA1cHggM3B4IDE5cHg7Cit9CisuY2hvc2VuLXJ0bCAuY2hvc2VuLWNob2ljZXMgbGkuc2VhcmNoLWNob2ljZSAuc2VhcmNoLWNob2ljZS1jbG9zZSB7CisgIHJpZ2h0OiBhdXRvOworICBsZWZ0OiA0cHg7Cit9CisuY2hvc2VuLXJ0bC5jaG9zZW4tY29udGFpbmVyLXNpbmdsZS1ub3NlYXJjaCAuY2hvc2VuLXNlYXJjaCwKKy5jaG9zZW4tcnRsIC5jaG9zZW4tZHJvcCB7CisgIGxlZnQ6IDk5OTlweDsKK30KKy5jaG9zZW4tcnRsLmNob3Nlbi1jb250YWluZXItc2luZ2xlIC5jaG9zZW4tcmVzdWx0cyB7CisgIG1hcmdpbjogMCAwIDRweCA0cHg7CisgIHBhZGRpbmc6IDAgNHB4IDAgMDsKK30KKy5jaG9zZW4tcnRsIC5jaG9zZW4tcmVzdWx0cyBsaS5ncm91cC1vcHRpb24geworICBwYWRkaW5nLXJpZ2h0OiAxNXB4OworICBwYWRkaW5nLWxlZnQ6IDA7Cit9CisuY2hvc2VuLXJ0bC5jaG9zZW4tY29udGFpbmVyLWFjdGl2ZS5jaG9zZW4td2l0aC1kcm9wIC5jaG9zZW4tc2luZ2xlIGRpdiB7CisgIGJvcmRlci1yaWdodDogbm9uZTsKK30KKy5jaG9zZW4tcnRsIC5jaG9zZW4tc2VhcmNoIGlucHV0W3R5cGU9InRleHQiXSB7CisgIHBhZGRpbmc6IDRweCA1cHggNHB4IDIwcHg7CisgIGJhY2tncm91bmQ6IHdoaXRlIHVybCgnLi4vLi4vaW1nL2Nob3Nlbi1zcHJpdGUucG5nJykgbm8tcmVwZWF0IC0zMHB4IC0yMHB4OworICBiYWNrZ3JvdW5kOiB1cmwoJy4uLy4uL2ltZy9jaG9zZW4tc3ByaXRlLnBuZycpIG5vLXJlcGVhdCAtMzBweCAtMjBweDsKKyAgZGlyZWN0aW9uOiBydGw7Cit9CisuY2hvc2VuLXJ0bC5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNpbmdsZSBkaXYgYiB7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDZweCAycHg7Cit9CisuY2hvc2VuLXJ0bC5jaG9zZW4tY29udGFpbmVyLXNpbmdsZS5jaG9zZW4td2l0aC1kcm9wIC5jaG9zZW4tc2luZ2xlIGRpdiBiIHsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEycHggMnB4OworfQorCisvKiBAZW5kICovCisvKiBAZ3JvdXAgUmV0aW5hIGNvbXBhdGliaWxpdHkgKi8KK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksIG9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE0NGRwaSkgeworICAuY2hvc2VuLXJ0bCAuY2hvc2VuLXNlYXJjaCBpbnB1dFt0eXBlPSJ0ZXh0Il0sCisgIC5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNpbmdsZSBhYmJyLAorICAuY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUgLmNob3Nlbi1zaW5nbGUgZGl2IGIsCisgIC5jaG9zZW4tY29udGFpbmVyLXNpbmdsZSAuY2hvc2VuLXNlYXJjaCBpbnB1dFt0eXBlPSJ0ZXh0Il0sCisgIC5jaG9zZW4tY29udGFpbmVyLW11bHRpIC5jaG9zZW4tY2hvaWNlcyAuc2VhcmNoLWNob2ljZSAuc2VhcmNoLWNob2ljZS1jbG9zZSwKKyAgLmNob3Nlbi1jb250YWluZXIgLmNob3Nlbi1yZXN1bHRzLXNjcm9sbC1kb3duIHNwYW4sCisgIC5jaG9zZW4tY29udGFpbmVyIC5jaG9zZW4tcmVzdWx0cy1zY3JvbGwtdXAgc3BhbiB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi8uLi9pbWcvY2hvc2VuLXNwcml0ZS0yeC5wbmcnKSAhaW1wb3J0YW50OworICAgIGJhY2tncm91bmQtc2l6ZTogNTJweCAzN3B4ICFpbXBvcnRhbnQ7CisgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCAhaW1wb3J0YW50OworICB9Cit9CisvKiBAZW5kICovCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvY2xvdWQuY3NzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2Nsb3VkLmNzcwppbmRleCBhZjEzMzgzLi40MDE3YzIyIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvY2xvdWQuY3NzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9jbG91ZC5jc3MKQEAgLTEsNDEyICsxLDQxMiBAQAotLyoNCi0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSovDQotDQotI2NvbnRlbnQgI2Nsb3VkDQotew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgLmxvYWRlcg0KLXsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2Vycm9yDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2YwMDsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jb25zdHJ1Y3Rpb24ucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMHB4IDEycHg7DQotICBjb2xvcjogI2ZmZjsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgbWFyZ2luLWJvdHRvbTogMjBweDsNCi0gIHBhZGRpbmc6IDEwcHg7DQotICBwYWRkaW5nLWxlZnQ6IDM1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAjZXJyb3IgLm1zZw0KLXsNCi0gIGZvbnQtc3R5bGU6IGl0YWxpYzsNCi0gIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICBtYXJnaW4tdG9wOiAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2RlYnVnDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsNCi0gIGJveC1zaGFkb3c6IDBweCAwcHggMTBweCAjYzBjMGMwOw0KLSAgLW1vei1ib3gtc2hhZG93OiAwcHggMHB4IDEwcHggI2MwYzBjMDsNCi0gIC13ZWJraXQtYm94LXNoYWRvdzogMHB4IDBweCAxMHB4ICNjMGMwYzA7DQotICBwYWRkaW5nOiAyMHB4Ow0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgbGVmdDogNTBweDsNCi0gIHRvcDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyB1bA0KLXsNCi0gIG1hcmdpbi1ib3R0b206IDVweDsNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyB1bCBhDQotew0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogNHB4IDUwJTsNCi0gIGJvcmRlci1yaWdodDogMDsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgcGFkZGluZzogMnB4IDRweDsNCi0gIHBhZGRpbmctbGVmdDogMjVweDsNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyB1bCBhOmhvdmVyLA0KLSNjb250ZW50ICNjbG91ZCAjZGVidWcgdWwgYS5ob3Zlcg0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAjZGVidWcgLmNsaXBib2FyZA0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2RlYnVnIC5jbGlwYm9hcmQgYQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jbGlwYm9hcmQtcGFzdGUucG5nICk7DQotICB6LWluZGV4OiA5ODsNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyAuY2xpcGJvYXJkIGE6aG92ZXIsDQotI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyAuY2xpcGJvYXJkIGEuaG92ZXIsDQotI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyAuY2xpcGJvYXJkLmNvcGllZCBhDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NsaXBib2FyZC1wYXN0ZS1kb2N1bWVudC10ZXh0LnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2RlYnVnIC5jbG9zZQ0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyAuY2xvc2UgYQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy0wLnBuZyApOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2RlYnVnIC5jbG9zZSBhOmhvdmVyDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLTEucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAjZGVidWcgLmRlYnVnDQotew0KLSAgYm9yZGVyOiAxcHggc29saWQgI2YwZjBmMDsNCi0gIG1heC1oZWlnaHQ6IDM1MHB4Ow0KLSAgb3ZlcmZsb3c6IGF1dG87DQotICBwYWRkaW5nOiA1cHg7DQotICB3aWR0aDogNTAwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAjZGVidWcgLmRlYnVnIC5sb2FkZXINCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1cHggNTAlOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBwYWRkaW5nOiAxMHB4IDI2cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAuY29udGVudA0KLXsNCi0gIHBhZGRpbmctbGVmdDogMDsNCi0gIHBhZGRpbmctcmlnaHQ6IDA7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAuY29udGVudC5zaG93DQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvZGl2LmdpZiApOw0KLSAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC15Ow0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzElIDA7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAjdHJlZQ0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgd2lkdGg6IDMwJTsNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkIC5zaG93ICN0cmVlDQotew0KLSAgb3ZlcmZsb3c6IGhpZGRlbjsNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkICNmaWxlLWNvbnRlbnQNCi17DQotICBmbG9hdDogcmlnaHQ7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICB3aWR0aDogNjglOw0KLSAgbWluLWhlaWdodDogMTAwcHgNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkIC5zaG93ICNmaWxlLWNvbnRlbnQNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkICNmaWxlLWNvbnRlbnQgLmNsb3NlDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLTAucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1MCUgNTAlOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBoZWlnaHQ6IDIwcHg7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICByaWdodDogMDsNCi0gIHRvcDogMDsNCi0gIHdpZHRoOiAyMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2ZpbGUtY29udGVudCAuY2xvc2U6aG92ZXINCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MtMS5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkICNmaWxlLWNvbnRlbnQgI3RvZ2dsZS5wbHVzDQotew0KLSAgZm9udC1zdHlsZTogaXRhbGljOw0KLSAgcGFkZGluZy1sZWZ0OiAxN3B4Ow0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RvZ2dsZS1zbWFsbC1leHBhbmQucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAjZmlsZS1jb250ZW50ICN0b2dnbGUubWludXMNCi17DQotICBmb250LXN0eWxlOiBpdGFsaWM7DQotICBwYWRkaW5nLWxlZnQ6IDE3cHg7DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdG9nZ2xlLXNtYWxsLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2ZpbGUtY29udGVudCAjZGF0YQ0KLXsNCi0gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYzBjMGMwOw0KLSAgbWFyZ2luLXRvcDogMTBweDsNCi0gIHBhZGRpbmctdG9wOiAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2ZpbGUtY29udGVudCAjZGF0YSBwcmUNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi0gIG1heC1oZWlnaHQ6IDYwMHB4Ow0KLSAgb3ZlcmZsb3c6IGF1dG87DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAjZmlsZS1jb250ZW50ICNkYXRhIGVtDQotew0KLSAgY29sb3I6ICNjMGMwYzA7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAjZmlsZS1jb250ZW50ICNwcm9wDQotew0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2ZpbGUtY29udGVudCBsaQ0KLXsNCi0gIHBhZGRpbmctdG9wOiAzcHg7DQotICBwYWRkaW5nLWJvdHRvbTogM3B4Ow0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2ZpbGUtY29udGVudCBsaS5vZGQNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjhGOEY4Ow0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2ZpbGUtY29udGVudCBsaSBkdA0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgd2lkdGg6IDE5JTsNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkICNmaWxlLWNvbnRlbnQgbGkgZGQNCi17DQotICBmbG9hdDogcmlnaHQ7DQotICB3aWR0aDogODAlOw0KLX0NCi0NCi0vKiB0cmVlICovDQotDQotI2NvbnRlbnQgI2Nsb3VkICNsZWdlbmQNCi17DQotICBib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgcGFkZGluZzogMTBweDsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHJpZ2h0OiAwOw0KLSAgYm90dG9tOiAwOw0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2xlZ2VuZCBsaQ0KLXsNCi0gIHBhZGRpbmctbGVmdDogMTVweDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkICNsZWdlbmQgbGkgc3ZnDQotew0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgbGVmdDogMDsNCi0gIHRvcDogMnB4Ow0KLX0NCi0NCi0jY29udGVudCAjZ3JhcGgtY29udGVudA0KLXsNCi0gIG1pbi1oZWlnaHQ6IDQwMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjZ3JhcGgtY29udGVudCAubm9kZQ0KLXsNCi0gIGZpbGw6ICMzMzM7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAjbGVnZW5kIGNpcmNsZSwNCi0jY29udGVudCAjZ3JhcGgtY29udGVudCAubm9kZSBjaXJjbGUNCi17DQotICBmaWxsOiAjZmZmOw0KLSAgc3Ryb2tlOiAjYzBjMGMwOw0KLSAgc3Ryb2tlLXdpZHRoOiAxLjVweDsNCi19DQotDQotI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLm5vZGUubHZsLTMgdGV4dA0KLXsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi19DQotDQotI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLm5vZGUubHZsLTM6aG92ZXIgY2lyY2xlDQotew0KLSAgc3Ryb2tlOiAjMDAwICFpbXBvcnRhbnQ7DQotfQ0KLQ0KLSNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLmx2bC0zOmhvdmVyIHRleHQNCi17DQotICBmaWxsOiAjMDAwICFpbXBvcnRhbnQ7DQotfQ0KLQ0KLSNjb250ZW50ICNncmFwaC1jb250ZW50IC5saW5rDQotew0KLSAgZmlsbDogbm9uZTsNCi0gIHN0cm9rZTogI2UwZTBlMDsNCi0gIHN0cm9rZS13aWR0aDogMS41cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAjbGVnZW5kIC5nb25lIGNpcmNsZSwNCi0jY29udGVudCAjZ3JhcGgtY29udGVudCAubm9kZS5nb25lIGNpcmNsZSwNCi0jY29udGVudCAjZ3JhcGgtY29udGVudCAubGluay5nb25lDQotew0KLSAgc3Ryb2tlOiAjZjBmMGYwOw0KLX0NCi0NCi0jY29udGVudCAjZ3JhcGgtY29udGVudCAubm9kZS5nb25lIHRleHQNCi17DQotICBmaWxsOiAjZjBmMGYwOw0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2xlZ2VuZCB1bCAuZ29uZQ0KLXsNCi0gIGNvbG9yOiAjZTBlMGUwOw0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2xlZ2VuZCAucmVjb3ZlcnlfZmFpbGVkLA0KLSNjb250ZW50ICNjbG91ZCAjbGVnZW5kIC5yZWNvdmVyeV9mYWlsZWQgY2lyY2xlLA0KLSNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLnJlY292ZXJ5X2ZhaWxlZCBjaXJjbGUNCi17DQotICBjb2xvcjogI0M0M0MzNTsNCi0gIHN0cm9rZTogI0M0M0MzNTsNCi19DQotDQotI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLm5vZGUucmVjb3ZlcnlfZmFpbGVkIHRleHQNCi17DQotICBmaWxsOiAjQzQzQzM1Ow0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2xlZ2VuZCAuZG93biwNCi0jY29udGVudCAjY2xvdWQgI2xlZ2VuZCAuZG93biBjaXJjbGUsDQotI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLm5vZGUuZG93biBjaXJjbGUNCi17DQotICBjb2xvcjogI2M0OGYwMDsNCi0gIHN0cm9rZTogI2M0OGYwMDsNCi19DQotDQotI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLm5vZGUuZG93biB0ZXh0DQotew0KLSAgZmlsbDogI2M0OGYwMDsNCi19DQotDQotI2NvbnRlbnQgI2Nsb3VkICNsZWdlbmQgLnJlY292ZXJpbmcsDQotI2NvbnRlbnQgI2Nsb3VkICNsZWdlbmQgLnJlY292ZXJpbmcgY2lyY2xlLA0KLSNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLnJlY292ZXJpbmcgY2lyY2xlDQotew0KLSAgY29sb3I6ICNkNWRkMDA7DQotICBzdHJva2U6ICNkNWRkMDA7DQotfQ0KLQ0KLSNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLnJlY292ZXJpbmcgdGV4dA0KLXsNCi0gIGZpbGw6ICNkNWRkMDA7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAjbGVnZW5kIC5hY3RpdmUsDQotI2NvbnRlbnQgI2Nsb3VkICNsZWdlbmQgLmFjdGl2ZSBjaXJjbGUsDQotI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLm5vZGUuYWN0aXZlIGNpcmNsZQ0KLXsNCi0gIGNvbG9yOiAjNTdBOTU3Ow0KLSAgc3Ryb2tlOiAjNTdBOTU3Ow0KLX0NCi0NCi0jY29udGVudCAjZ3JhcGgtY29udGVudCAubm9kZS5hY3RpdmUgdGV4dA0KLXsNCi0gIGZpbGw6ICM1N0E5NTc7DQotfQ0KLQ0KLSNjb250ZW50ICNjbG91ZCAjbGVnZW5kIC5sZWFkZXIgY2lyY2xlLA0KLSNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLmxlYWRlciBjaXJjbGUNCi17DQotICBmaWxsOiAjMDAwOw0KLX0NCi0NCi0jY29udGVudCAjY2xvdWQgI2xlZ2VuZCAubGVhZGVyIGNpcmNsZQ0KLXsNCi0gIHN0cm9rZTogI2ZmZjsNCi19DQotDQotI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLmxpbmsubHZsLTIsDQotI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLmxpbmsubGVhZGVyDQotew0KLSAgc3Ryb2tlOiAjYzBjMGMwOw0KLX0NCi0NCi0jY29udGVudCAjZ3JhcGgtY29udGVudCAubm9kZS5sdmwtMCBjaXJjbGUNCi17DQotICBzdHJva2U6ICNmZmY7DQotfQ0KLQ0KLSNjb250ZW50ICNncmFwaC1jb250ZW50IC5saW5rLmx2bC0xDQotew0KLSAgc3Ryb2tlOiAjZmZmOw0KLX0NCi0NCi0jY2xvdWRHcmFwaFBhZ2luZw0KLXsNCi0gIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCi0gIHBhZGRpbmctdG9wOiAxNXB4Ow0KLSAgcGFkZGluZy1ib3R0b206IDE1cHg7DQotfQ0KKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKworI2NvbnRlbnQgI2Nsb3VkCit7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworI2NvbnRlbnQgI2Nsb3VkIC5sb2FkZXIKK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIHBhZGRpbmctbGVmdDogMjFweDsKK30KKworI2NvbnRlbnQgI2Nsb3VkICNlcnJvcgoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjAwOworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY29uc3RydWN0aW9uLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMHB4IDEycHg7CisgIGNvbG9yOiAjZmZmOworICBmb250LXdlaWdodDogYm9sZDsKKyAgbWFyZ2luLWJvdHRvbTogMjBweDsKKyAgcGFkZGluZzogMTBweDsKKyAgcGFkZGluZy1sZWZ0OiAzNXB4OworfQorCisjY29udGVudCAjY2xvdWQgI2Vycm9yIC5tc2cKK3sKKyAgZm9udC1zdHlsZTogaXRhbGljOworICBmb250LXdlaWdodDogbm9ybWFsOworICBtYXJnaW4tdG9wOiAxMHB4OworfQorCisjY29udGVudCAjY2xvdWQgI2RlYnVnCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgIGJveC1zaGFkb3c6IDBweCAwcHggMTBweCAjYzBjMGMwOworICAtbW96LWJveC1zaGFkb3c6IDBweCAwcHggMTBweCAjYzBjMGMwOworICAtd2Via2l0LWJveC1zaGFkb3c6IDBweCAwcHggMTBweCAjYzBjMGMwOworICBwYWRkaW5nOiAyMHB4OworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IDUwcHg7CisgIHRvcDogMTBweDsKK30KKworI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyB1bAoreworICBtYXJnaW4tYm90dG9tOiA1cHg7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjZGVidWcgdWwgYQoreworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA0cHggNTAlOworICBib3JkZXItcmlnaHQ6IDA7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nOiAycHggNHB4OworICBwYWRkaW5nLWxlZnQ6IDI1cHg7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjZGVidWcgdWwgYTpob3ZlciwKKyNjb250ZW50ICNjbG91ZCAjZGVidWcgdWwgYS5ob3ZlcgoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOworfQorCisjY29udGVudCAjY2xvdWQgI2RlYnVnIC5jbGlwYm9hcmQKK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyAuY2xpcGJvYXJkIGEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NsaXBib2FyZC1wYXN0ZS5wbmcgKTsKKyAgei1pbmRleDogOTg7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjZGVidWcgLmNsaXBib2FyZCBhOmhvdmVyLAorI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyAuY2xpcGJvYXJkIGEuaG92ZXIsCisjY29udGVudCAjY2xvdWQgI2RlYnVnIC5jbGlwYm9hcmQuY29waWVkIGEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NsaXBib2FyZC1wYXN0ZS1kb2N1bWVudC10ZXh0LnBuZyApOworfQorCisjY29udGVudCAjY2xvdWQgI2RlYnVnIC5jbG9zZQoreworICBmbG9hdDogcmlnaHQ7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjZGVidWcgLmNsb3NlIGEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLTAucG5nICk7CisgIHBhZGRpbmctbGVmdDogMjFweDsKK30KKworI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyAuY2xvc2UgYTpob3ZlcgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MtMS5wbmcgKTsKK30KKworI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyAuZGVidWcKK3sKKyAgYm9yZGVyOiAxcHggc29saWQgI2YwZjBmMDsKKyAgbWF4LWhlaWdodDogMzUwcHg7CisgIG92ZXJmbG93OiBhdXRvOworICBwYWRkaW5nOiA1cHg7CisgIHdpZHRoOiA1MDBweDsKK30KKworI2NvbnRlbnQgI2Nsb3VkICNkZWJ1ZyAuZGVidWcgLmxvYWRlcgoreworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1cHggNTAlOworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZzogMTBweCAyNnB4OworfQorCisjY29udGVudCAjY2xvdWQgLmNvbnRlbnQKK3sKKyAgcGFkZGluZy1sZWZ0OiAwOworICBwYWRkaW5nLXJpZ2h0OiAwOworfQorCisjY29udGVudCAjY2xvdWQgLmNvbnRlbnQuc2hvdworeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9kaXYuZ2lmICk7CisgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzElIDA7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjdHJlZQoreworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDMwJTsKK30KKworI2NvbnRlbnQgI2Nsb3VkIC5zaG93ICN0cmVlCit7CisgIG92ZXJmbG93OiBoaWRkZW47Cit9CisKKyNjb250ZW50ICNjbG91ZCAjZmlsZS1jb250ZW50Cit7CisgIGZsb2F0OiByaWdodDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB3aWR0aDogNjglOworICBtaW4taGVpZ2h0OiAxMDBweAorfQorCisjY29udGVudCAjY2xvdWQgLnNob3cgI2ZpbGUtY29udGVudAoreworICBkaXNwbGF5OiBibG9jazsKK30KKworI2NvbnRlbnQgI2Nsb3VkICNmaWxlLWNvbnRlbnQgLmNsb3NlCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy0wLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1MCUgNTAlOworICBkaXNwbGF5OiBibG9jazsKKyAgaGVpZ2h0OiAyMHB4OworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAwOworICB0b3A6IDA7CisgIHdpZHRoOiAyMHB4OworfQorCisjY29udGVudCAjY2xvdWQgI2ZpbGUtY29udGVudCAuY2xvc2U6aG92ZXIKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLTEucG5nICk7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjZmlsZS1jb250ZW50ICN0b2dnbGUucGx1cworeworICBmb250LXN0eWxlOiBpdGFsaWM7CisgIHBhZGRpbmctbGVmdDogMTdweDsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RvZ2dsZS1zbWFsbC1leHBhbmQucG5nICk7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjZmlsZS1jb250ZW50ICN0b2dnbGUubWludXMKK3sKKyAgZm9udC1zdHlsZTogaXRhbGljOworICBwYWRkaW5nLWxlZnQ6IDE3cHg7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90b2dnbGUtc21hbGwucG5nICk7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjZmlsZS1jb250ZW50ICNkYXRhCit7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYzBjMGMwOworICBtYXJnaW4tdG9wOiAxMHB4OworICBwYWRkaW5nLXRvcDogMTBweDsKK30KKworI2NvbnRlbnQgI2Nsb3VkICNmaWxlLWNvbnRlbnQgI2RhdGEgcHJlCit7CisgIGRpc3BsYXk6IGJsb2NrOworICBtYXgtaGVpZ2h0OiA2MDBweDsKKyAgb3ZlcmZsb3c6IGF1dG87Cit9CisKKyNjb250ZW50ICNjbG91ZCAjZmlsZS1jb250ZW50ICNkYXRhIGVtCit7CisgIGNvbG9yOiAjYzBjMGMwOworfQorCisjY29udGVudCAjY2xvdWQgI2ZpbGUtY29udGVudCAjcHJvcAoreworfQorCisjY29udGVudCAjY2xvdWQgI2ZpbGUtY29udGVudCBsaQoreworICBwYWRkaW5nLXRvcDogM3B4OworICBwYWRkaW5nLWJvdHRvbTogM3B4OworfQorCisjY29udGVudCAjY2xvdWQgI2ZpbGUtY29udGVudCBsaS5vZGQKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI0Y4RjhGODsKK30KKworI2NvbnRlbnQgI2Nsb3VkICNmaWxlLWNvbnRlbnQgbGkgZHQKK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIHdpZHRoOiAxOSU7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjZmlsZS1jb250ZW50IGxpIGRkCit7CisgIGZsb2F0OiByaWdodDsKKyAgd2lkdGg6IDgwJTsKK30KKworLyogdHJlZSAqLworCisjY29udGVudCAjY2xvdWQgI2xlZ2VuZAoreworICBib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwOworICBwYWRkaW5nOiAxMHB4OworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAwOworICBib3R0b206IDA7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjbGVnZW5kIGxpCit7CisgIHBhZGRpbmctbGVmdDogMTVweDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCisjY29udGVudCAjY2xvdWQgI2xlZ2VuZCBsaSBzdmcKK3sKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiAwOworICB0b3A6IDJweDsKK30KKworI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQKK3sKKyAgbWluLWhlaWdodDogNDAwcHg7Cit9CisKKyNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlCit7CisgIGZpbGw6ICMzMzM7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjbGVnZW5kIGNpcmNsZSwKKyNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlIGNpcmNsZQoreworICBmaWxsOiAjZmZmOworICBzdHJva2U6ICNjMGMwYzA7CisgIHN0cm9rZS13aWR0aDogMS41cHg7Cit9CisKKyNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLmx2bC0zIHRleHQKK3sKKyAgY3Vyc29yOiBwb2ludGVyOworfQorCisjY29udGVudCAjZ3JhcGgtY29udGVudCAubm9kZS5sdmwtMzpob3ZlciBjaXJjbGUKK3sKKyAgc3Ryb2tlOiAjMDAwICFpbXBvcnRhbnQ7Cit9CisKKyNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLmx2bC0zOmhvdmVyIHRleHQKK3sKKyAgZmlsbDogIzAwMCAhaW1wb3J0YW50OworfQorCisjY29udGVudCAjZ3JhcGgtY29udGVudCAubGluaworeworICBmaWxsOiBub25lOworICBzdHJva2U6ICNlMGUwZTA7CisgIHN0cm9rZS13aWR0aDogMS41cHg7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjbGVnZW5kIC5nb25lIGNpcmNsZSwKKyNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLmdvbmUgY2lyY2xlLAorI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLmxpbmsuZ29uZQoreworICBzdHJva2U6ICNmMGYwZjA7Cit9CisKKyNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLmdvbmUgdGV4dAoreworICBmaWxsOiAjZjBmMGYwOworfQorCisjY29udGVudCAjY2xvdWQgI2xlZ2VuZCB1bCAuZ29uZQoreworICBjb2xvcjogI2UwZTBlMDsKK30KKworI2NvbnRlbnQgI2Nsb3VkICNsZWdlbmQgLnJlY292ZXJ5X2ZhaWxlZCwKKyNjb250ZW50ICNjbG91ZCAjbGVnZW5kIC5yZWNvdmVyeV9mYWlsZWQgY2lyY2xlLAorI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLm5vZGUucmVjb3ZlcnlfZmFpbGVkIGNpcmNsZQoreworICBjb2xvcjogI0M0M0MzNTsKKyAgc3Ryb2tlOiAjQzQzQzM1OworfQorCisjY29udGVudCAjZ3JhcGgtY29udGVudCAubm9kZS5yZWNvdmVyeV9mYWlsZWQgdGV4dAoreworICBmaWxsOiAjQzQzQzM1OworfQorCisjY29udGVudCAjY2xvdWQgI2xlZ2VuZCAuZG93biwKKyNjb250ZW50ICNjbG91ZCAjbGVnZW5kIC5kb3duIGNpcmNsZSwKKyNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLmRvd24gY2lyY2xlCit7CisgIGNvbG9yOiAjYzQ4ZjAwOworICBzdHJva2U6ICNjNDhmMDA7Cit9CisKKyNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLmRvd24gdGV4dAoreworICBmaWxsOiAjYzQ4ZjAwOworfQorCisjY29udGVudCAjY2xvdWQgI2xlZ2VuZCAucmVjb3ZlcmluZywKKyNjb250ZW50ICNjbG91ZCAjbGVnZW5kIC5yZWNvdmVyaW5nIGNpcmNsZSwKKyNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLnJlY292ZXJpbmcgY2lyY2xlCit7CisgIGNvbG9yOiAjZDVkZDAwOworICBzdHJva2U6ICNkNWRkMDA7Cit9CisKKyNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLnJlY292ZXJpbmcgdGV4dAoreworICBmaWxsOiAjZDVkZDAwOworfQorCisjY29udGVudCAjY2xvdWQgI2xlZ2VuZCAuYWN0aXZlLAorI2NvbnRlbnQgI2Nsb3VkICNsZWdlbmQgLmFjdGl2ZSBjaXJjbGUsCisjY29udGVudCAjZ3JhcGgtY29udGVudCAubm9kZS5hY3RpdmUgY2lyY2xlCit7CisgIGNvbG9yOiAjNTdBOTU3OworICBzdHJva2U6ICM1N0E5NTc7Cit9CisKKyNjb250ZW50ICNncmFwaC1jb250ZW50IC5ub2RlLmFjdGl2ZSB0ZXh0Cit7CisgIGZpbGw6ICM1N0E5NTc7Cit9CisKKyNjb250ZW50ICNjbG91ZCAjbGVnZW5kIC5sZWFkZXIgY2lyY2xlLAorI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLm5vZGUubGVhZGVyIGNpcmNsZQoreworICBmaWxsOiAjMDAwOworfQorCisjY29udGVudCAjY2xvdWQgI2xlZ2VuZCAubGVhZGVyIGNpcmNsZQoreworICBzdHJva2U6ICNmZmY7Cit9CisKKyNjb250ZW50ICNncmFwaC1jb250ZW50IC5saW5rLmx2bC0yLAorI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLmxpbmsubGVhZGVyCit7CisgIHN0cm9rZTogI2MwYzBjMDsKK30KKworI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLm5vZGUubHZsLTAgY2lyY2xlCit7CisgIHN0cm9rZTogI2ZmZjsKK30KKworI2NvbnRlbnQgI2dyYXBoLWNvbnRlbnQgLmxpbmsubHZsLTEKK3sKKyAgc3Ryb2tlOiAjZmZmOworfQorCisjY2xvdWRHcmFwaFBhZ2luZworeworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgIHBhZGRpbmctdG9wOiAxNXB4OworICBwYWRkaW5nLWJvdHRvbTogMTVweDsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9jb2xsZWN0aW9ucy5jc3MgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvY29sbGVjdGlvbnMuY3NzCmluZGV4IDI4ODNlYmUuLjA3MWQwYTEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9jb2xsZWN0aW9ucy5jc3MKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2NvbGxlY3Rpb25zLmNzcwpAQCAtMSwzNTMgKzEsMzUzIEBACi0vKg0KLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotKi8NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMNCi17DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAjdWktYmxvY2sNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KLSAgaGVpZ2h0OiAyMDBweDsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIGxlZnQ6IC01cHg7DQotICB0b3A6IDM1cHg7DQotICB3aWR0aDogNTAwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAjZnJhbWUNCi17DQotICBmbG9hdDogcmlnaHQ7DQotICB3aWR0aDogODYlOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgI25hdmlnYXRpb24NCi17DQotICBwYWRkaW5nLXRvcDogNTBweDsNCi0gIHdpZHRoOiAxMiU7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAjbmF2aWdhdGlvbiBhDQotew0KLSAgcGFkZGluZy1sZWZ0OiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAjZnJhbWUgLmFjdGlvbnMNCi17DQotICBtYXJnaW4tYm90dG9tOiAyMHB4Ow0KLSAgbWluLWhlaWdodDogMzBweDsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zIGRpdi5hY3Rpb24NCi17DQotICB3aWR0aDogMzIwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBkaXYuYWN0aW9uIC5jbG91ZA0KLXsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zIGZvcm0gLmRpcmVjdG9yeS1ub3RlDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2luZm9ybWF0aW9uLXdoaXRlLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMjIlIDFweDsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgZm9ybSAuZXJyb3INCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MtYnV0dG9uLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMjIlIDFweDsNCi0gIGNvbG9yOiAjYzAwOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIHANCi17DQotICBwYWRkaW5nLWJvdHRvbTogOHB4Ow0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgZm9ybSBsYWJlbA0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgcGFkZGluZy10b3A6IDNweDsNCi0gIHBhZGRpbmctYm90dG9tOiAzcHg7DQotICB0ZXh0LWFsaWduOiByaWdodDsNCi0gIHdpZHRoOiAyNSU7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIGlucHV0LA0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIHNlbGVjdCwNCi0jY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgZm9ybSAuY2hvc2VuLWNvbnRhaW5lcg0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIC5idXR0b25zLA0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIC5ub3RlIHNwYW4NCi17DQotICBmbG9hdDogcmlnaHQ7DQotICB3aWR0aDogNzElOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgZm9ybSAubm90ZSBzcGFuDQotew0KLSAgcGFkZGluZy1sZWZ0OiAzcHg7DQotICBwYWRkaW5nLXJpZ2h0OiAzcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIC5idXR0b25zDQotew0KLSAgcGFkZGluZy10b3A6IDEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIGJ1dHRvbi5zdWJtaXQNCi17DQotICBtYXJnaW4tcmlnaHQ6IDIwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIGJ1dHRvbi5zdWJtaXQgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgZm9ybSBidXR0b24ucmVzZXQgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zICNhZGQNCi17DQotICBsZWZ0OiAwOw0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgI2FkZCBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3BsdXMtYnV0dG9uLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgI2RlbGV0ZQ0KLXsNCi0gIG1hcmdpbi1yaWdodDogMjBweDsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zICNkZWxldGUgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zICNyZWxvYWQgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9hcnJvdy1jaXJjbGUucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyAjcmVuYW1lIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdWktdGV4dC1maWVsZC1zZWxlY3QucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyAjY3JlYXRlLWFsaWFzIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctc3dpdGNoLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgI2RlbGV0ZS1hbGlhcyBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLWJ1dHRvbi5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zICNvcHRpbWl6ZSBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2hhbW1lci1zY3Jld2RyaXZlci5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zIGRpdi5hY3Rpb24NCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KLSAgYm9yZGVyOiAxcHggc29saWQgI2YwZjBmMDsNCi0gIGJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOw0KLSAgLW1vei1ib3gtc2hhZG93OiA1cHggNXB4IDEwcHggI2MwYzBjMDsNCi0gIC13ZWJraXQtYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICBsZWZ0OiA1MHB4Ow0KLSAgdG9wOiA0MHB4Ow0KLSAgcGFkZGluZzogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zICNhZGQtcmVwbGljYSBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3BsdXMtYnV0dG9uLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgZGl2LmFjdGlvbi5hZGQtcmVwbGljYSB7DQotICBib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgd2lkdGg6IDQwMHB4Ow0KLSAgbWFyZ2luLXJpZ2h0OiAwcHg7DQotICBwYWRkaW5nOiAxMHB4Ow0KLSAgZmxvYXQ6IHJpZ2h0Ow0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgZGl2LmFjdGlvbi5hZGQtcmVwbGljYSBwIHsNCi0gIHBhZGRpbmctYm90dG9tOiA4cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyBkaXYuYWN0aW9uLmFkZC1yZXBsaWNhIC5idXR0b25zIHsNCi0gIGZsb2F0OiByaWdodDsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zIGRpdi5hY3Rpb24uYWRkLXJlcGxpY2EgLmJ1dHRvbnMgLnN1Ym1pdCBzcGFuIHsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCUgNTAlOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgZGl2LmFjdGlvbi5hZGQtcmVwbGljYSAuYnV0dG9ucyAucmVzZXQgc3BhbiB7DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwJSA1MCU7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAjZGF0YSAjY29sbGVjdGlvbi1kYXRhIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2JveC5wbmcgKTsgfQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAjZGF0YSAjc2hhcmQtZGF0YSBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9zaXRlbWFwLnBuZyApOyB9DQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zICNkYXRhICNzaGFyZC1kYXRhIC5yZXBsaWNhIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL25vZGUtc2xhdmUucG5nICk7IH0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgI2RhdGEgI2luZGV4LWRhdGENCi17DQotICBtYXJnaW4tdG9wOiAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgI2RhdGEgbGkNCi17DQotICBwYWRkaW5nLWJvdHRvbTogM3B4Ow0KLSAgcGFkZGluZy10b3A6IDNweDsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zICNkYXRhIGxpLm9kZA0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAjZGF0YSBsaSBkdA0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgd2lkdGg6IDUwJTsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zICNkYXRhIGxpIGRkDQotew0KLSAgZmxvYXQ6IHJpZ2h0Ow0KLSAgd2lkdGg6IDUwJTsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zICNkYXRhIGxpIGRkLmljbw0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9zbGFzaC5wbmcgKTsNCi0gIGhlaWdodDogMjBweDsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zICNkYXRhIGxpIGRkLmljby5pY28tMQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgI2RhdGEgbGkgZGQuaWNvIHNwYW4NCi17DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAjYWRkX2FkdmFuY2VkIHsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLWV4cGFuZC5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgNTAlOw0KLSAgY3Vyc29yOiBwb2ludGVyOw0KLSAgcGFkZGluZy1yaWdodDogMjFweDsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zICNhZGRfYWR2YW5jZWQub3BlbiB7DQotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgLnNoYXJkIHsNCi0gICAgbWFyZ2luLWxlZnQ6IDQwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAucmVwbGljYSB7DQotICAgIG1hcmdpbi1sZWZ0OiA0MHB4Ow0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgLnNoYXJkIGgyIHNwYW4ub3BlblJlcGxpY2Egew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoZXZyb24tc21hbGwtZXhwYW5kLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSA1MCU7DQotICBjdXJzb3I6IHBvaW50ZXI7DQotICBwYWRkaW5nLXJpZ2h0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgLnNoYXJkIGgyIHNwYW4ub3BlblJlcGxpY2EgLm9wZW4gew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoZXZyb24tc21hbGwucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAucmVwbGljYSBoMiBzcGFuIHsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLWV4cGFuZC5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgNTAlOw0KLSAgY3Vyc29yOiBwb2ludGVyOw0KLSAgcGFkZGluZy1yaWdodDogMjFweDsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5yZXBsaWNhIGgyIHNwYW4ucmVtIHsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgNTAlOw0KLSAgY3Vyc29yOiBwb2ludGVyOw0KLSAgcGFkZGluZy1yaWdodDogMjFweDsNCi0gIHJpZ2h0OjEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAucmVwbGljYSBoMiBzcGFuIC5vcGVuIHsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgI2FkZC1yZXBsaWNhIHsNCi0gIGZsb2F0OiByaWdodDsNCi19DQotDQotI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hZGQgc2VsZWN0IHsNCi0gIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgLmNob3Nlbi1jb250YWluZXIgdWwgew0KLSAgICB3aWR0aDogMTAwJTsNCi0gICAgcGFkZGluZzogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgLmRlbGV0ZS1yZXBsaWNhIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MucG5nICk7DQotfQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAuZGVsZXRlLXJlcGxpY2EgYnV0dG9uLnN1Ym1pdCBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAjbm9kZS1uYW1lIC5jaG9zZW4tY29udGFpbmVyDQotew0KLSAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50Ow0KLX0NCi0NCi0jY29udGVudCAjY29sbGVjdGlvbnMgI2NvbGxlY3Rpb24tZGF0YSB7DQotICBmbG9hdDogbGVmdDsNCi0gIHdpZHRoOiAzNSU7DQotfQ0KLQ0KLSNjb250ZW50ICNjb2xsZWN0aW9ucyAjc2hhcmQtZGF0YSB7DQotICBmbG9hdDogbGVmdDsNCi0gIHdpZHRoOiA2NSU7DQotfQ0KKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zCit7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zICN1aS1ibG9jaworeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworICBoZWlnaHQ6IDIwMHB4OworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IC01cHg7CisgIHRvcDogMzVweDsKKyAgd2lkdGg6IDUwMHB4OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgI2ZyYW1lCit7CisgIGZsb2F0OiByaWdodDsKKyAgd2lkdGg6IDg2JTsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zICNuYXZpZ2F0aW9uCit7CisgIHBhZGRpbmctdG9wOiA1MHB4OworICB3aWR0aDogMTIlOworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgI25hdmlnYXRpb24gYQoreworICBwYWRkaW5nLWxlZnQ6IDVweDsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zICNmcmFtZSAuYWN0aW9ucworeworICBtYXJnaW4tYm90dG9tOiAyMHB4OworICBtaW4taGVpZ2h0OiAzMHB4OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgZGl2LmFjdGlvbgoreworICB3aWR0aDogMzIwcHg7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBkaXYuYWN0aW9uIC5jbG91ZAoreworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgZm9ybSAuZGlyZWN0b3J5LW5vdGUKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2luZm9ybWF0aW9uLXdoaXRlLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAyMiUgMXB4OworICBjb2xvcjogI2MwYzBjMDsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zIGZvcm0gLmVycm9yCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy1idXR0b24ucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDIyJSAxcHg7CisgIGNvbG9yOiAjYzAwOworICBmb250LXdlaWdodDogYm9sZDsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zIGZvcm0gcAoreworICBwYWRkaW5nLWJvdHRvbTogOHB4OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgZm9ybSBsYWJlbAoreworICBmbG9hdDogbGVmdDsKKyAgcGFkZGluZy10b3A6IDNweDsKKyAgcGFkZGluZy1ib3R0b206IDNweDsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7CisgIHdpZHRoOiAyNSU7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIGlucHV0LAorI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zIGZvcm0gc2VsZWN0LAorI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zIGZvcm0gLmNob3Nlbi1jb250YWluZXIKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIC5idXR0b25zLAorI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zIGZvcm0gLm5vdGUgc3BhbgoreworICBmbG9hdDogcmlnaHQ7CisgIHdpZHRoOiA3MSU7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIC5ub3RlIHNwYW4KK3sKKyAgcGFkZGluZy1sZWZ0OiAzcHg7CisgIHBhZGRpbmctcmlnaHQ6IDNweDsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zIGZvcm0gLmJ1dHRvbnMKK3sKKyAgcGFkZGluZy10b3A6IDEwcHg7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIGJ1dHRvbi5zdWJtaXQKK3sKKyAgbWFyZ2luLXJpZ2h0OiAyMHB4OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgZm9ybSBidXR0b24uc3VibWl0IHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyBmb3JtIGJ1dHRvbi5yZXNldCBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy5wbmcgKTsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zICNhZGQKK3sKKyAgbGVmdDogMDsKKyAgcG9zaXRpb246IGFic29sdXRlOworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgI2FkZCBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9wbHVzLWJ1dHRvbi5wbmcgKTsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zICNkZWxldGUKK3sKKyAgbWFyZ2luLXJpZ2h0OiAyMHB4OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgI2RlbGV0ZSBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy5wbmcgKTsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zICNyZWxvYWQgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctY2lyY2xlLnBuZyApOworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgI3JlbmFtZSBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS10ZXh0LWZpZWxkLXNlbGVjdC5wbmcgKTsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5hY3Rpb25zICNjcmVhdGUtYWxpYXMgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctc3dpdGNoLnBuZyApOworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgI2RlbGV0ZS1hbGlhcyBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy1idXR0b24ucG5nICk7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyAjb3B0aW1pemUgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaGFtbWVyLXNjcmV3ZHJpdmVyLnBuZyApOworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLmFjdGlvbnMgZGl2LmFjdGlvbgoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworICBib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwOworICBib3gtc2hhZG93OiA1cHggNXB4IDEwcHggI2MwYzBjMDsKKyAgLW1vei1ib3gtc2hhZG93OiA1cHggNXB4IDEwcHggI2MwYzBjMDsKKyAgLXdlYmtpdC1ib3gtc2hhZG93OiA1cHggNXB4IDEwcHggI2MwYzBjMDsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiA1MHB4OworICB0b3A6IDQwcHg7CisgIHBhZGRpbmc6IDEwcHg7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAuYWN0aW9ucyAjYWRkLXJlcGxpY2Egc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcGx1cy1idXR0b24ucG5nICk7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyBkaXYuYWN0aW9uLmFkZC1yZXBsaWNhIHsKKyAgYm9yZGVyOiAxcHggc29saWQgI2YwZjBmMDsKKyAgd2lkdGg6IDQwMHB4OworICBtYXJnaW4tcmlnaHQ6IDBweDsKKyAgcGFkZGluZzogMTBweDsKKyAgZmxvYXQ6IHJpZ2h0OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgZGl2LmFjdGlvbi5hZGQtcmVwbGljYSBwIHsKKyAgcGFkZGluZy1ib3R0b206IDhweDsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zIGRpdi5hY3Rpb24uYWRkLXJlcGxpY2EgLmJ1dHRvbnMgeworICBmbG9hdDogcmlnaHQ7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyBkaXYuYWN0aW9uLmFkZC1yZXBsaWNhIC5idXR0b25zIC5zdWJtaXQgc3BhbiB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwJSA1MCU7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyBkaXYuYWN0aW9uLmFkZC1yZXBsaWNhIC5idXR0b25zIC5yZXNldCBzcGFuIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwJSA1MCU7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAjZGF0YSAjY29sbGVjdGlvbi1kYXRhIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2JveC5wbmcgKTsgfQorI2NvbnRlbnQgI2NvbGxlY3Rpb25zICNkYXRhICNzaGFyZC1kYXRhIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3NpdGVtYXAucG5nICk7IH0KKyNjb250ZW50ICNjb2xsZWN0aW9ucyAjZGF0YSAjc2hhcmQtZGF0YSAucmVwbGljYSBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ub2RlLXNsYXZlLnBuZyApOyB9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAjZGF0YSAjaW5kZXgtZGF0YQoreworICBtYXJnaW4tdG9wOiAxMHB4OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgI2RhdGEgbGkKK3sKKyAgcGFkZGluZy1ib3R0b206IDNweDsKKyAgcGFkZGluZy10b3A6IDNweDsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zICNkYXRhIGxpLm9kZAoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgI2RhdGEgbGkgZHQKK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIHdpZHRoOiA1MCU7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAjZGF0YSBsaSBkZAoreworICBmbG9hdDogcmlnaHQ7CisgIHdpZHRoOiA1MCU7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAjZGF0YSBsaSBkZC5pY28KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3NsYXNoLnBuZyApOworICBoZWlnaHQ6IDIwcHg7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAjZGF0YSBsaSBkZC5pY28uaWNvLTEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAjZGF0YSBsaSBkZC5pY28gc3BhbgoreworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgI2FkZF9hZHZhbmNlZCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLWV4cGFuZC5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSA1MCU7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgcGFkZGluZy1yaWdodDogMjFweDsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zICNhZGRfYWR2YW5jZWQub3BlbiB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoZXZyb24tc21hbGwucG5nICk7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAuc2hhcmQgeworICAgIG1hcmdpbi1sZWZ0OiA0MHB4OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLnJlcGxpY2EgeworICAgIG1hcmdpbi1sZWZ0OiA0MHB4OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLnNoYXJkIGgyIHNwYW4ub3BlblJlcGxpY2EgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hldnJvbi1zbWFsbC1leHBhbmQucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgNTAlOworICBjdXJzb3I6IHBvaW50ZXI7CisgIHBhZGRpbmctcmlnaHQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAuc2hhcmQgaDIgc3Bhbi5vcGVuUmVwbGljYSAub3BlbiB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLnBuZyApOworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLnJlcGxpY2EgaDIgc3BhbiB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLWV4cGFuZC5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSA1MCU7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgcGFkZGluZy1yaWdodDogMjFweDsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5yZXBsaWNhIGgyIHNwYW4ucmVtIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMDAlIDUwJTsKKyAgY3Vyc29yOiBwb2ludGVyOworICBwYWRkaW5nLXJpZ2h0OiAyMXB4OworICByaWdodDoxMHB4OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLnJlcGxpY2EgaDIgc3BhbiAub3BlbiB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLnBuZyApOworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgI2FkZC1yZXBsaWNhIHsKKyAgZmxvYXQ6IHJpZ2h0OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgLmFkZCBzZWxlY3QgeworICB3aWR0aDogMTAwJTsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zIC5jaG9zZW4tY29udGFpbmVyIHVsIHsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBwYWRkaW5nOiA1cHg7Cit9CisKKyNjb250ZW50ICNjb2xsZWN0aW9ucyAuZGVsZXRlLXJlcGxpY2Egc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MucG5nICk7Cit9CisjY29udGVudCAjY29sbGVjdGlvbnMgLmRlbGV0ZS1yZXBsaWNhIGJ1dHRvbi5zdWJtaXQgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsKK30KKworI2NvbnRlbnQgI2NvbGxlY3Rpb25zICNub2RlLW5hbWUgLmNob3Nlbi1jb250YWluZXIKK3sKKyAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgI2NvbGxlY3Rpb24tZGF0YSB7CisgIGZsb2F0OiBsZWZ0OworICB3aWR0aDogMzUlOworfQorCisjY29udGVudCAjY29sbGVjdGlvbnMgI3NoYXJkLWRhdGEgeworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDY1JTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9jb21tb24uY3NzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2NvbW1vbi5jc3MKaW5kZXggZTI5MDM1NS4uZDk2MDQ0NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2NvbW1vbi5jc3MKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2NvbW1vbi5jc3MKQEAgLTEsNzY4ICsxLDc2OCBAQAotLyoNCi0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSovDQotDQotKg0KLXsNCi0gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQotICBtYXJnaW46IDA7DQotICBwYWRkaW5nOiAwOw0KLX0NCi0NCi1ib2R5LCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBhLCBidXR0b24sIGlucHV0LCBzZWxlY3QsIG9wdGlvbiwgdGV4dGFyZWEsIHRoLCB0ZA0KLXsNCi0gIGNvbG9yOiAjMzMzOw0KLSAgZm9udDogMTJweC8xLjZlbSAiTHVjaWRhIEdyYW5kZSIsICJEZWphVnUgU2FucyIsICJCaXRzdHJlYW0gVmVyYSBTYW5zIiwgVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7DQotfQ0KLQ0KLWJvZHkNCi17DQotICBwYWRkaW5nOiAzMHB4Ow0KLSAgdGV4dC1hbGlnbjogY2VudGVyOw0KLX0NCi0NCi1hLCBidXR0b24NCi17DQotICBjdXJzb3I6IHBvaW50ZXI7DQotfQ0KLQ0KLWlucHV0LCBzZWxlY3QsIHRleHRhcmVhDQotew0KLSAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDsNCi0gIHBhZGRpbmc6IDJweDsNCi19DQotDQotaW5wdXRbcmVhZG9ubHk9cmVhZG9ubHldDQotew0KLSAgYm9yZGVyLWNvbG9yOiAjZjBmMGYwOw0KLX0NCi0NCi1idXR0b24NCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZlNmU2Ow0KLSAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQoIGxpbmVhciwgMCAwLCAwIDEwMCUsIGZyb20oICNmZmZmZmYgKSwgY29sb3Itc3RvcCggMjUlLCAjZmZmZmZmICksIHRvKCAjZTZlNmU2ICkgKTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KCAjZmZmZmZmLCAjZmZmZmZmIDI1JSwgI2U2ZTZlNiApOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoIHRvcCwgI2ZmZmZmZiwgI2ZmZmZmZiAyNSUsICNlNmU2ZTYgKTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQoICNmZmZmZmYsICNmZmZmZmYgMjUlLCAjZTZlNmU2ICk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoICNmZmZmZmYsICNmZmZmZmYgMjUlLCAjZTZlNmU2ICk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoICNmZmZmZmYsICNmZmZmZmYgMjUlLCAjZTZlNmU2ICk7DQotICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudCggc3RhcnRDb2xvcnN0cj0nI2ZmZmZmZicsIGVuZENvbG9yc3RyPScjZTZlNmU2JywgR3JhZGllbnRUeXBlPTAgKTsNCi0gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7DQotICBib3JkZXItYm90dG9tLWNvbG9yOiAjYmJiOw0KLSAgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7DQotICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsNCi0gIC1raHRtbC1ib3JkZXItcmFkaXVzOiA0cHg7DQotICBib3JkZXItcmFkaXVzOiA0cHg7DQotICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSggMjU1LCAyNTUsIDI1NSwgMC4yICksIDAgMXB4IDJweCByZ2JhKCAwLCAwLCAwLCAwLjA1ICk7DQotICAtbW96LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSggMjU1LCAyNTUsIDI1NSwgMC4yICksIDAgMXB4IDJweCByZ2JhKCAwLCAwLCAwLCAwLjA1ICk7DQotICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoIDI1NSwgMjU1LCAyNTUsIDAuMiApLCAwIDFweCAycHggcmdiYSggMCwgMCwgMCwgMC4wNSApOw0KLSAgY29sb3I6ICMzMzM7DQotICBjdXJzb3I6IHBvaW50ZXI7DQotICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQotICBwYWRkaW5nOiA0cHggN3B4IDVweDsNCi0gIG92ZXJmbG93OiB2aXNpYmxlOw0KLSAgdGV4dC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKCAyNTUsIDI1NSwgMjU1LCAwLjc1ICk7DQotICAtd2Via2l0LXRyYW5zaXRpb246IDAuMXMgbGluZWFyIGJhY2tncm91bmQtaW1hZ2U7DQotICAtbW96LXRyYW5zaXRpb246IDAuMXMgbGluZWFyIGJhY2tncm91bmQtaW1hZ2U7DQotICAtbXMtdHJhbnNpdGlvbjogMC4xcyBsaW5lYXIgYmFja2dyb3VuZC1pbWFnZTsNCi0gIC1vLXRyYW5zaXRpb246IDAuMXMgbGluZWFyIGJhY2tncm91bmQtaW1hZ2U7DQotICB0cmFuc2l0aW9uOiAwLjFzIGxpbmVhciBiYWNrZ3JvdW5kLWltYWdlOw0KLX0NCi0NCi1idXR0b24gc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLWJ1dHRvblt0eXBlPXN1Ym1pdF0sIGJ1dHRvbi5wcmltYXJ5DQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogIzAwNjRjZDsNCi0gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC1raHRtbC1ncmFkaWVudCggbGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20oICMwNDljZGIgKSwgdG8oICMwMDY0Y2QgKSApOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoIHRvcCwgIzA0OWNkYiwgIzAwNjRjZCApOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCggdG9wLCAjMDQ5Y2RiLCAjMDA2NGNkICk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KCBsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgY29sb3Itc3RvcCggMCUsICMwNDljZGIgKSwgY29sb3Itc3RvcCggMTAwJSwgIzAwNjRjZCApICk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCggdG9wLCAjMDQ5Y2RiLCAjMDA2NGNkICk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoIHRvcCwgIzA0OWNkYiwgIzAwNjRjZCApOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCB0b3AsICMwNDljZGIsICMwMDY0Y2QgKTsNCi0gIGJvcmRlci1jb2xvcjogIzAwNjRjZCAjMDA2NGNkICMwMDNmODE7DQotICBib3JkZXItY29sb3I6IHJnYmEoIDAsIDAsIDAsIDAuMSApIHJnYmEoIDAsIDAsIDAsIDAuMSApIHJnYmEoIDAsIDAsIDAsIDAuMjUgKTsNCi0gIGNvbG9yOiAjZmZmZmZmOw0KLSAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoIHN0YXJ0Q29sb3JzdHI9JyMwNDljZGInLCBlbmRDb2xvcnN0cj0nIzAwNjRjZCcsIEdyYWRpZW50VHlwZT0wICk7DQotICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjI1KTsNCi19DQotDQotYnV0dG9uLnN1Y2Nlc3MNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTdhOTU3Ow0KLSAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14Ow0KLSAgYmFja2dyb3VuZC1pbWFnZTogLWtodG1sLWdyYWRpZW50KCBsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbSggIzYyYzQ2MiApLCB0byggIzU3YTk1NyApICk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCggdG9wLCAjNjJjNDYyLCAjNTdhOTU3ICk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiAtbXMtbGluZWFyLWdyYWRpZW50KCB0b3AsICM2MmM0NjIsICM1N2E5NTcgKTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQoIGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKCAwJSwgIzYyYzQ2MiApLCBjb2xvci1zdG9wKCAxMDAlLCAjNTdhOTU3ICkgKTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KCB0b3AsICM2MmM0NjIsICM1N2E5NTcgKTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCggdG9wLCAjNjJjNDYyLCAjNTdhOTU3ICk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoIHRvcCwgIzYyYzQ2MiwgIzU3YTk1NyApOw0KLSAgYm9yZGVyLWNvbG9yOiAjNTdhOTU3ICM1N2E5NTcgIzNkNzczZDsNCi0gIGJvcmRlci1jb2xvcjogcmdiYSggMCwgMCwgMCwgMC4xICkgcmdiYSggMCwgMCwgMCwgMC4xICkgcmdiYSggMCwgMCwgMCwgMC4yNSApOw0KLSAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoIHN0YXJ0Q29sb3JzdHI9JyM2MmM0NjInLCBlbmRDb2xvcnN0cj0nIzU3YTk1NycsIEdyYWRpZW50VHlwZT0wICk7DQotICBjb2xvcjogI2ZmZmZmZjsNCi0gIHRleHQtc2hhZG93OiAwIC0xcHggMCByZ2JhKCAwLCAwLCAwLCAwLjI1ICk7DQotfQ0KLQ0KLWJ1dHRvbi53YXJuDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2M0M2MzNTsNCi0gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IC1raHRtbC1ncmFkaWVudCggbGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20oICNlZTVmNWIgKSwgdG8oICNjNDNjMzUgKSApOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoIHRvcCwgI2VlNWY1YiwgI2M0M2MzNSApOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCggdG9wLCAjZWU1ZjViLCAjYzQzYzM1ICk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KCBsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgY29sb3Itc3RvcCggMCUsICNlZTVmNWIgKSwgY29sb3Itc3RvcCggMTAwJSwgI2M0M2MzNSApICk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCggdG9wLCAjZWU1ZjViLCAjYzQzYzM1ICk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoIHRvcCwgI2VlNWY1YiwgI2M0M2MzNSApOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCB0b3AsICNlZTVmNWIsICNjNDNjMzUgKTsNCi0gIGJvcmRlci1jb2xvcjogI2M0M2MzNSAjYzQzYzM1ICM4ODJhMjU7DQotICBib3JkZXItY29sb3I6IHJnYmEoIDAsIDAsIDAsIDAuMSApIHJnYmEoIDAsIDAsIDAsIDAuMSApIHJnYmEoIDAsIDAsIDAsIDAuMjUgKTsNCi0gIGNvbG9yOiAjZmZmZmZmOw0KLSAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoIHN0YXJ0Q29sb3JzdHI9JyNlZTVmNWInLCBlbmRDb2xvcnN0cj0nI2M0M2MzNScsIEdyYWRpZW50VHlwZT0wICk7DQotICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgcmdiYSggMCwgMCwgMCwgMC4yNSApOw0KLX0NCi0NCi1hDQotew0KLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi1wcmUNCi17DQotICBjb2xvcjogIzMzMzsNCi0gIHRleHQtYWxpZ246IGxlZnQ7DQotfQ0KLQ0KLWFiYnINCi17DQotICBjdXJzb3I6IGhlbHA7DQotfQ0KLQ0KLXVsDQotew0KLSAgbGlzdC1zdHlsZTogbm9uZTsNCi19DQotDQotLmNsZWFyZml4OmFmdGVyIHsgY2xlYXI6IGJvdGg7IGNvbnRlbnQ6ICIuIjsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMDsgaGVpZ2h0OiAwOyB2aXNpYmlsaXR5OiBoaWRkZW47IH0NCi0uY2xlYXJmaXggICAgICAgeyBkaXNwbGF5OiBibG9jazsgfQ0KLQ0KLS5sb2FkZXINCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9sb2FkZXIuZ2lmICkgIWltcG9ydGFudDsNCi19DQotDQotLmxvYWRlci1saWdodA0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2xvYWRlci1saWdodC5naWYgKSAhaW1wb3J0YW50Ow0KLX0NCi0NCi0udW5pdmVyc2FsLWxvYWRlciB7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICBsZWZ0OiAtMTZweDsNCi0gIHRvcDogMHB4Ow0KLSAgd2lkdGg6IDE2cHg7DQotICBoZWlnaHQ6IDE2cHg7DQotfQ0KLQ0KLSN3cmFwcGVyDQotew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgbWFyZ2luOiAwIGF1dG87DQotICBtYXJnaW4tYm90dG9tOiAzMHB4Ow0KLSAgdGV4dC1hbGlnbjogbGVmdDsNCi19DQotDQotI2hlYWRlcg0KLXsNCi0gIHBhZGRpbmctYm90dG9tOiAxMHB4Ow0KLSAgcG9zaXRpb246IGZpeGVkOw0KLSAgei1pbmRleDogNDI7DQotfQ0KLQ0KLS5zY3JvbGwgI2hlYWRlcg0KLXsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi19DQotDQotI2hlYWRlciAjc29scg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL3NvbHIuc3ZnICk7DQotICBiYWNrZ3JvdW5kLXNpemU6IDEyOHB4Ow0KLSAgZGlzcGxheTogYmxvY2s7DQotICBoZWlnaHQ6IDc4cHg7DQotICB3aWR0aDogMTUwcHg7DQotfQ0KLQ0KLSNoZWFkZXIgI3NvbHIgc3Bhbg0KLXsNCi0gIGRpc3BsYXk6IG5vbmU7DQotfQ0KLQ0KLSNtYWluDQotew0KLSAgbWluLXdpZHRoOiA3NTBweDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi19DQotDQotI21haW4uZXJyb3INCi17DQotICBib3JkZXI6IDA7DQotICBtaW4taGVpZ2h0OiAwOw0KLSAgcGFkZGluZy10b3A6IDIwcHg7DQotfQ0KLQ0KLSNtYWluLmVycm9yIC5tZXNzYWdlDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2YwMDsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jb25zdHJ1Y3Rpb24ucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMHB4IDUwJTsNCi0gIGNvbG9yOiAjZmZmOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBtYXJnaW4tbGVmdDogMTUwcHg7DQotICBtYXJnaW4tYm90dG9tOiAyMHB4Ow0KLSAgcGFkZGluZzogMTBweDsNCi0gIHBhZGRpbmctbGVmdDogMzVweDsNCi19DQotDQotI21haW4uZXJyb3IgLmNvZGUNCi17DQotICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwOw0KLSAgcGFkZGluZzogNXB4Ow0KLX0NCi0NCi0jbWV0YQ0KLXsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIGJvdHRvbTogLTI2cHg7DQotICByaWdodDogMDsNCi19DQotDQotI21ldGEgbGkNCi17DQotICBmbG9hdDogbGVmdDsNCi19DQotDQotI21ldGEgbGkgYQ0KLXsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDEwcHggNTAlOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBoZWlnaHQ6IDI1cHg7DQotICBsaW5lLWhlaWdodDogMjVweDsNCi0gIHBhZGRpbmctbGVmdDogMzFweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDEwcHg7DQotfQ0KLQ0KLSNtZXRhIGxpIGE6aG92ZXINCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOw0KLX0NCi0NCi0jbWV0YSAuZG9jdW1lbnRhdGlvbiBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2RvY3VtZW50LXRleHQucG5nICk7IH0NCi0jbWV0YSAuaXNzdWVzIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYnVnLnBuZyApOyB9DQotI21ldGEgLmlyYyBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3VzZXJzLnBuZyApOyB9DQotI21ldGEgLm1haWxpbmdsaXN0IGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vbWFpbC5wbmcgKTsgfQ0KLSNtZXRhIC53aWtpLXF1ZXJ5LXN5bnRheCBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3NjcmlwdC1jb2RlLnBuZyApOyB9DQotDQotI2Vudmlyb25tZW50DQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2JveC5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDVweCA1MCU7DQotICBkaXNwbGF5OiBub25lOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBtYXJnaW4tdG9wOiAxMHB4Ow0KLSAgcGFkZGluZzogNXB4IDEwcHg7DQotICBwYWRkaW5nLWxlZnQ6IDI2cHg7DQotfQ0KLQ0KLS5oYXMtZW52aXJvbm1lbnQgI2Vudmlyb25tZW50DQotew0KLSAgZGlzcGxheTogYmxvY2s7DQotfQ0KLQ0KLSNlbnZpcm9ubWVudC5wcm9kDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2MzN2Y3ZjsNCi0gIGNvbG9yOiAjZmZmOw0KLX0NCi0NCi0jZW52aXJvbm1lbnQudGVzdA0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1YjI7DQotfQ0KLQ0KLSNlbnZpcm9ubWVudC5kZXYNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NlN2NjOw0KLX0NCi0NCi0uaGVhZGVyLW1lc3NhZ2UNCi17DQotICBib3JkZXI6IDFweCBzb2xpZCAjZjAwOw0KLSAgbWFyZ2luLWxlZnQ6IDE1MHB4Ow0KLSAgbWFyZ2luLWJvdHRvbTogMjBweDsNCi19DQotDQotLmhlYWRlci1tZXNzYWdlIGgyLA0KLS5oZWFkZXItbWVzc2FnZSB1bCwNCi0uaGVhZGVyLW1lc3NhZ2UgcA0KLXsNCi0gIHBhZGRpbmc6IDEwcHg7DQotfQ0KLQ0KLS5oZWFkZXItbWVzc2FnZSBoMg0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmMDA7DQotICBjb2xvcjogI2ZmZjsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0uaGVhZGVyLW1lc3NhZ2UgcA0KLXsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLSAgcGFkZGluZy10b3A6IDA7DQotfQ0KLQ0KLSNsb2FkaW5nDQotI2h0dHAtZXhjZXB0aW9uDQotew0KLSAgZGlzcGxheTogbm9uZTsNCi19DQotDQotLmV4Y2VwdGlvbg0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmMDA7DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY29uc3RydWN0aW9uLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTBweCA1MCU7DQotICBjb2xvcjogI2ZmZjsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgbWFyZ2luLWJvdHRvbTogMjBweDsNCi0gIHBhZGRpbmc6IDEwcHg7DQotICBwYWRkaW5nLWxlZnQ6IDM1cHg7DQotfQ0KLQ0KLSNjb250ZW50LXdyYXBwZXINCi17DQotICBtYXJnaW4tbGVmdDogMTUwcHg7DQotICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwOw0KLSAgbWluLWhlaWdodDogNTAwcHg7DQotfQ0KLQ0KLSNjb250ZW50DQotew0KLSAgcGFkZGluZzogMTBweDsNCi19DQotDQotI2NvbnRlbnQgPiAubG9hZGVyDQotew0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50IGlmcmFtZQ0KLXsNCi0gIGJvcmRlcjogMDsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgbWluLWhlaWdodDogNDAwcHg7DQotICB3aWR0aDogMTAwJTsNCi19DQotDQotI2NvbnRlbnQgLmJsb2NrDQotew0KLSAgbWFyZ2luLWJvdHRvbTogMTBweDsNCi19DQotDQotI2NvbnRlbnQgLmJsb2NrIGgyDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDVweCA1MCU7DQotICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YwZjBmMDsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgcGFkZGluZzogNXB4Ow0KLSAgcGFkZGluZy1sZWZ0OiAyNnB4Ow0KLX0NCi0NCi0jY29udGVudCAuYmxvY2suZGlzYWJsZWQsDQotI2NvbnRlbnQgLmJsb2NrLmRpc2FibGVkIGgyDQotew0KLSAgY29sb3I6ICNjMGMwYzA7DQotfQ0KLQ0KLSNjb250ZW50IC5ibG9jayAubWVzc2FnZSwNCi0jY29udGVudCAuYmxvY2sgLmNvbnRlbnQNCi17DQotICBwYWRkaW5nOiA1cHg7DQotfQ0KLQ0KLS8qIHN5bnRheCAqLw0KLQ0KLXByZS5zeW50YXgNCi17DQotICBvdmVyZmxvdzogYXV0bzsNCi19DQotDQotcHJlLnN5bnRheCBjb2RlDQotew0KLSAgZGlzcGxheTogYmxvY2s7DQotICBjb2xvcjogIzAwMDsNCi19DQotDQotcHJlLnN5bnRheCAuY29tbWVudCwNCi1wcmUuc3ludGF4IC50ZW1wbGF0ZV9jb21tZW50LA0KLXByZS5zeW50YXggLmRpZmYgLmhlYWRlciwNCi1wcmUuc3ludGF4IC5qYXZhZG9jDQotew0KLSAgY29sb3I6ICM5OTg7DQotICBmb250LXN0eWxlOiBpdGFsaWM7DQotfQ0KLQ0KLXByZS5zeW50YXggLmtleXdvcmQsDQotcHJlLnN5bnRheCAuY3NzIC5ydWxlIC5rZXl3b3JkLA0KLXByZS5zeW50YXggLndpbnV0aWxzLA0KLXByZS5zeW50YXggLmphdmFzY3JpcHQgLnRpdGxlLA0KLXByZS5zeW50YXggLmxpc3AgLnRpdGxlLA0KLXByZS5zeW50YXggLnN1YnN0DQotew0KLSAgY29sb3I6ICMwMDA7DQotICBmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotcHJlLnN5bnRheCAubnVtYmVyLA0KLXByZS5zeW50YXggLmhleGNvbG9yDQotew0KLSAgY29sb3I6ICM0MGEwNzA7DQotfQ0KLQ0KLXByZS5zeW50YXgubGFuZ3VhZ2UtanNvbiAubnVtYmVyDQotew0KLSAgY29sb3I6IGJsdWU7DQotfQ0KLQ0KLXByZS5zeW50YXgubGFuZ3VhZ2UtanNvbiAubGl0ZXJhbA0KLXsNCi0gIGNvbG9yOiBmaXJlYnJpY2s7DQotfQ0KLQ0KLXByZS5zeW50YXggLnN0cmluZywNCi1wcmUuc3ludGF4IC50YWcgLnZhbHVlLA0KLXByZS5zeW50YXggLnBocGRvYywNCi1wcmUuc3ludGF4IC50ZXggLmZvcm11bGENCi17DQotICBjb2xvcjogI2QxNDsNCi19DQotDQotcHJlLnN5bnRheC5sYW5ndWFnZS1qc29uIC5zdHJpbmcNCi17DQotICBjb2xvcjogZ3JlZW47DQotfQ0KLQ0KLXByZS5zeW50YXggLnRpdGxlLA0KLXByZS5zeW50YXggLmlkDQotew0KLSAgY29sb3I6ICM5MDA7DQotICBmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotcHJlLnN5bnRheCAuamF2YXNjcmlwdCAudGl0bGUsDQotcHJlLnN5bnRheCAubGlzcCAudGl0bGUsDQotcHJlLnN5bnRheCAuc3Vic3QNCi17DQotICBmb250LXdlaWdodDogbm9ybWFsOw0KLX0NCi0NCi1wcmUuc3ludGF4IC5jbGFzcyAudGl0bGUsDQotcHJlLnN5bnRheCAudGV4IC5jb21tYW5kDQotew0KLSAgY29sb3I6ICM0NTg7DQotICBmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotcHJlLnN5bnRheCAudGFnLA0KLXByZS5zeW50YXggLmNzcyAua2V5d29yZCwNCi1wcmUuc3ludGF4IC5odG1sIC5rZXl3b3JkLA0KLXByZS5zeW50YXggLnRhZyAudGl0bGUsDQotcHJlLnN5bnRheCAuZGphbmdvIC50YWcgLmtleXdvcmQNCi17DQotICBjb2xvcjogIzAwMDA4MDsNCi0gIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotfQ0KLQ0KLXByZS5zeW50YXggLmF0dHJpYnV0ZSwNCi1wcmUuc3ludGF4IC52YXJpYWJsZSwNCi1wcmUuc3ludGF4IC5pbnN0YW5jZXZhciwNCi1wcmUuc3ludGF4IC5saXNwIC5ib2R5DQotew0KLSAgY29sb3I6ICMwMDgwODA7DQotfQ0KLQ0KLXByZS5zeW50YXgubGFuZ3VhZ2UtanNvbiAuYXR0cmlidXRlDQotew0KLSAgY29sb3I6IGJsYWNrOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLXByZS5zeW50YXggLnJlZ2V4cA0KLXsNCi0gIGNvbG9yOiAjMDA5OTI2Ow0KLX0NCi0NCi1wcmUuc3ludGF4IC5jbGFzcw0KLXsNCi0gIGNvbG9yOiAjNDU4Ow0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLXByZS5zeW50YXggLnN5bWJvbCwNCi1wcmUuc3ludGF4IC5ydWJ5IC5zeW1ib2wgLnN0cmluZywNCi1wcmUuc3ludGF4IC5ydWJ5IC5zeW1ib2wgLmtleXdvcmQsDQotcHJlLnN5bnRheCAucnVieSAuc3ltYm9sIC5rZXltZXRob2RzLA0KLXByZS5zeW50YXggLmxpc3AgLmtleXdvcmQsDQotcHJlLnN5bnRheCAudGV4IC5zcGVjaWFsDQotew0KLSAgY29sb3I6ICM5OTAwNzM7DQotfQ0KLQ0KLXByZS5zeW50YXggLmJ1aWx0aW4sDQotcHJlLnN5bnRheCAuYnVpbHRfaW4sDQotcHJlLnN5bnRheCAubGlzcCAudGl0bGUNCi17DQotICBjb2xvcjogIzAwODZiMzsNCi19DQotDQotcHJlLnN5bnRheCAucHJlcHJvY2Vzc29yLA0KLXByZS5zeW50YXggLnBpLA0KLXByZS5zeW50YXggLmRvY3R5cGUsDQotcHJlLnN5bnRheCAuc2hlYmFuZywNCi1wcmUuc3ludGF4IC5jZGF0YQ0KLXsNCi0gIGNvbG9yOiAjOTk5Ow0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLXByZS5zeW50YXggLmRlbGV0aW9uDQotew0KLSAgYmFja2dyb3VuZDogI2ZkZDsNCi19DQotDQotcHJlLnN5bnRheCAuYWRkaXRpb24NCi17DQotICBiYWNrZ3JvdW5kOiAjZGZkOw0KLX0NCi0NCi1wcmUuc3ludGF4IC5kaWZmIC5jaGFuZ2UNCi17DQotICBiYWNrZ3JvdW5kOiAjMDA4NmIzOw0KLX0NCi0NCi1wcmUuc3ludGF4IC5jaHVuaw0KLXsNCi0gIGNvbG9yOiAjYWFhOw0KLX0NCi0NCi1wcmUuc3ludGF4IC50ZXggLmZvcm11bGENCi17DQotICBvcGFjaXR5OiAwLjU7DQotfQ0KLQ0KLSNjb250ZW50IC50cmVlIGxpLCANCi0jY29udGVudCAudHJlZSBpbnMNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL3RyZWUucG5nICk7DQotICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyANCi19DQotDQotI2NvbnRlbnQgLnRyZWUgbGkNCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNTRweCAwOw0KLSAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC15Ow0KLSAgbGluZS1oZWlnaHQ6IDIycHg7DQotfQ0KLQ0KLSNjb250ZW50IC50cmVlIGxpLmpzdHJlZS1sYXN0DQotew0KLSAgYmFja2dyb3VuZDp0cmFuc3BhcmVudDsNCi19DQotDQotI2NvbnRlbnQgLnRyZWUgLmpzdHJlZS1vcGVuID4gaW5zDQotew0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM2cHggMDsNCi19DQotDQotI2NvbnRlbnQgLnRyZWUgLmpzdHJlZS1jbG9zZWQgPiBpbnMNCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMThweCAwOw0KLX0NCi0NCi0jY29udGVudCAudHJlZSAuanN0cmVlLWxlYWYgPiBpbnMNCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7DQotfQ0KLQ0KLSNjb250ZW50IC50cmVlIC5qc3RyZWUtaG92ZXJlZA0KLXsNCi0gIGJhY2tncm91bmQ6I2U3ZjRmOTsgYm9yZGVyOjFweCBzb2xpZCAjZDhmMGZhOyBwYWRkaW5nOjAgMnB4IDAgMXB4Ow0KLX0NCi0NCi0jY29udGVudCAudHJlZSAuanN0cmVlLWNsaWNrZWQNCi17DQotICBiYWNrZ3JvdW5kOiNiZWViZmY7IGJvcmRlcjoxcHggc29saWQgIzk5ZGVmZDsgcGFkZGluZzowIDJweCAwIDFweDsNCi19DQotDQotI2NvbnRlbnQgLnRyZWUgYS5hY3RpdmUNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOw0KLSAgY29sb3I6ICMwMGY7DQotfQ0KLQ0KLSNjb250ZW50IC50cmVlIGEgLmpzdHJlZS1pY29uDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2ZvbGRlci5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgLnRyZWUgLmpzdHJlZS1sZWFmIGEgLmpzdHJlZS1pY29uDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2RvY3VtZW50LXRleHQucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50IC50cmVlIC5qc3RyZWUtc2VhcmNoDQotew0KLSAgZm9udC1zdHlsZTppdGFsaWM7DQotfQ0KLQ0KLSNjb250ZW50IC50cmVlIGEuanN0cmVlLXNlYXJjaA0KLXsNCi0gIGNvbG9yOmFxdWE7DQotfQ0KLQ0KLSNjb25uZWN0aW9uLWJveA0KLXsNCi0gIGRpc3BsYXk6IG5vbmU7DQotfQ0KLQ0KLSNjb25uZWN0aW9uLXN0YXR1cy1tb2RhbA0KLXsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHRvcDogMHB4Ow0KLSAgbGVmdDogMHB4Ow0KLSAgd2lkdGg6IDEwMCU7DQotICBoZWlnaHQ6IDEwMCU7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZlNmU2Ow0KLSAgb3BhY2l0eTogMC41Ow0KLSAgei1pbmRleDogMTAwOw0KLX0NCi0NCi0jY29ubmVjdGlvbi1zdGF0dXMtcmVjb3ZlcmVkOg0KLXsNCi0gIHotaW5kZXg6MTAyOw0KLX0NCi0NCi0uY29ubmVjdGlvbi1zdGF0dXMNCi17DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICBsZWZ0OiAyMDBweDsNCi0gIHJpZ2h0OiAyMDBweDsNCi0gIHRvcDogNDAlOw0KLSAgaGVpZ2h0OiA3NXB4Ow0KLSAgYm9yZGVyOiAxcHggc29saWQgI2YwMDsNCi0gIHBhZGRpbmc6IDMwcHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KLSAgb3BhY2l0eTogMTsNCi0gIHotaW5kZXg6IDEwMTsNCi19DQotDQotLmNvbm5lY3Rpb24tc3RhdHVzIHANCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vbmV0d29yay1zdGF0dXMtYnVzeS5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgY29sb3I6ICM4MDA7DQotICBwYWRkaW5nLWxlZnQ6IDI2cHg7DQotfQ0KLQ0KLSNjb25uZWN0aW9uLXN0YXR1cy1yZWNvdmVyZWQgcA0KLXsNCi0gIGNvbG9yOiAjMDgwOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL25ldHdvcmstc3RhdHVzLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAuYWRkcmVzcy1iYXINCi17DQotICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3VpLWFkZHJlc3MtYmFyLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogNXB4IDUwJTsNCi0gIGJvcmRlcjogMXB4IHNvbGlkICNmMGYwZjA7DQotICBib3gtc2hhZG93OiAxcHggMXB4IDAgI2YwZjBmMDsNCi0gIC1tb3otYm94LXNoYWRvdzogMXB4IDFweCAwICNmMGYwZjA7DQotICAtd2Via2l0LWJveC1zaGFkb3c6IDFweCAxcHggMCAjZjBmMGYwOw0KLSAgY29sb3I6ICNjMGMwYzA7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIG92ZXJmbG93OiBoaWRkZW47DQotICBwYWRkaW5nOiA1cHg7DQotICBwYWRkaW5nLWxlZnQ6IDI2cHg7DQotICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KLX0NCi0NCi0jY29udGVudCAuYWRkcmVzcy1iYXI6Zm9jdXMsDQotI2NvbnRlbnQgLmFkZHJlc3MtYmFyOmhvdmVyDQotew0KLSAgYm9yZGVyLWNvbG9yOiAjYzBjMGMwOw0KLSAgYm94LXNoYWRvdzogMXB4IDFweCAwICNkOGQ4ZDg7DQotICAtbW96LWJveC1zaGFkb3c6IDFweCAxcHggMCAjZDhkOGQ4Ow0KLSAgLXdlYmtpdC1ib3gtc2hhZG93OiAxcHggMXB4IDAgI2Q4ZDhkODsNCi0gIGNvbG9yOiAjMzMzOw0KLX0NCi0NCi0uZXhjZXB0aW9uIC5zaG93LWV4Y2VwdGlvbiB7DQotICBtYXJnaW4tdG9wOiA0cHg7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHJpZ2h0OiAxMHB4Ow0KLSAgdG9wOiA3cHg7DQotICBjb2xvcjogI2ZmZjsNCi19DQotDQotI2V4Y2VwdGlvbiAuc2hvdy1leGNlcHRpb24gYTpob3ZlciB7DQotICBjb2xvcjogIzMzMzsNCi19DQotDQotLm90aGVyLXVpLWxpbmsgew0KLSAgbWFyZ2luOiAwcHg7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICByaWdodDogMHB4Ow0KLSAgdG9wOiAtMjBweDsNCi19DQotDQotLm90aGVyLXVpLWxpbmsgc3BhbiwNCi0ubmV3LXVpLXdhcm5pbmcgc3Bhbi5oZWxwIHsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9pbmZvcm1hdGlvbi13aGl0ZS5wbmcgKTsNCi0gIHJpZ2h0OiAwcHg7DQotICBwYWRkaW5nLWxlZnQ6IDE2cHg7DQotfQ0KLQ0KLS5vdGhlci11aS1saW5rIGEudWwgew0KLSAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQotfQ0KLQ0KKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKworKgoreworICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDA7Cit9CisKK2JvZHksIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIGEsIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgb3B0aW9uLCB0ZXh0YXJlYSwgdGgsIHRkCit7CisgIGNvbG9yOiAjMzMzOworICBmb250OiAxMnB4LzEuNmVtICJMdWNpZGEgR3JhbmRlIiwgIkRlamFWdSBTYW5zIiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMiLCBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKK30KKworYm9keQoreworICBwYWRkaW5nOiAzMHB4OworICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKK2EsIGJ1dHRvbgoreworICBjdXJzb3I6IHBvaW50ZXI7Cit9CisKK2lucHV0LCBzZWxlY3QsIHRleHRhcmVhCit7CisgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7CisgIHBhZGRpbmc6IDJweDsKK30KKworaW5wdXRbcmVhZG9ubHk9cmVhZG9ubHldCit7CisgIGJvcmRlci1jb2xvcjogI2YwZjBmMDsKK30KKworYnV0dG9uCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNlNmU2ZTY7CisgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CisgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQoIGxpbmVhciwgMCAwLCAwIDEwMCUsIGZyb20oICNmZmZmZmYgKSwgY29sb3Itc3RvcCggMjUlLCAjZmZmZmZmICksIHRvKCAjZTZlNmU2ICkgKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoICNmZmZmZmYsICNmZmZmZmYgMjUlLCAjZTZlNmU2ICk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KCB0b3AsICNmZmZmZmYsICNmZmZmZmYgMjUlLCAjZTZlNmU2ICk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQoICNmZmZmZmYsICNmZmZmZmYgMjUlLCAjZTZlNmU2ICk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCggI2ZmZmZmZiwgI2ZmZmZmZiAyNSUsICNlNmU2ZTYgKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCAjZmZmZmZmLCAjZmZmZmZmIDI1JSwgI2U2ZTZlNiApOworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudCggc3RhcnRDb2xvcnN0cj0nI2ZmZmZmZicsIGVuZENvbG9yc3RyPScjZTZlNmU2JywgR3JhZGllbnRUeXBlPTAgKTsKKyAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKKyAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2JiYjsKKyAgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4OworICAta2h0bWwtYm9yZGVyLXJhZGl1czogNHB4OworICBib3JkZXItcmFkaXVzOiA0cHg7CisgIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKCAyNTUsIDI1NSwgMjU1LCAwLjIgKSwgMCAxcHggMnB4IHJnYmEoIDAsIDAsIDAsIDAuMDUgKTsKKyAgLW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoIDI1NSwgMjU1LCAyNTUsIDAuMiApLCAwIDFweCAycHggcmdiYSggMCwgMCwgMCwgMC4wNSApOworICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoIDI1NSwgMjU1LCAyNTUsIDAuMiApLCAwIDFweCAycHggcmdiYSggMCwgMCwgMCwgMC4wNSApOworICBjb2xvcjogIzMzMzsKKyAgY3Vyc29yOiBwb2ludGVyOworICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgIHBhZGRpbmc6IDRweCA3cHggNXB4OworICBvdmVyZmxvdzogdmlzaWJsZTsKKyAgdGV4dC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKCAyNTUsIDI1NSwgMjU1LCAwLjc1ICk7CisgIC13ZWJraXQtdHJhbnNpdGlvbjogMC4xcyBsaW5lYXIgYmFja2dyb3VuZC1pbWFnZTsKKyAgLW1vei10cmFuc2l0aW9uOiAwLjFzIGxpbmVhciBiYWNrZ3JvdW5kLWltYWdlOworICAtbXMtdHJhbnNpdGlvbjogMC4xcyBsaW5lYXIgYmFja2dyb3VuZC1pbWFnZTsKKyAgLW8tdHJhbnNpdGlvbjogMC4xcyBsaW5lYXIgYmFja2dyb3VuZC1pbWFnZTsKKyAgdHJhbnNpdGlvbjogMC4xcyBsaW5lYXIgYmFja2dyb3VuZC1pbWFnZTsKK30KKworYnV0dG9uIHNwYW4KK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKK2J1dHRvblt0eXBlPXN1Ym1pdF0sIGJ1dHRvbi5wcmltYXJ5Cit7CisgIGJhY2tncm91bmQtY29sb3I6ICMwMDY0Y2Q7CisgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKKyAgYmFja2dyb3VuZC1pbWFnZTogLWtodG1sLWdyYWRpZW50KCBsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbSggIzA0OWNkYiApLCB0byggIzAwNjRjZCApICk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KCB0b3AsICMwNDljZGIsICMwMDY0Y2QgKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCggdG9wLCAjMDQ5Y2RiLCAjMDA2NGNkICk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQoIGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKCAwJSwgIzA0OWNkYiApLCBjb2xvci1zdG9wKCAxMDAlLCAjMDA2NGNkICkgKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoIHRvcCwgIzA0OWNkYiwgIzAwNjRjZCApOworICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoIHRvcCwgIzA0OWNkYiwgIzAwNjRjZCApOworICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoIHRvcCwgIzA0OWNkYiwgIzAwNjRjZCApOworICBib3JkZXItY29sb3I6ICMwMDY0Y2QgIzAwNjRjZCAjMDAzZjgxOworICBib3JkZXItY29sb3I6IHJnYmEoIDAsIDAsIDAsIDAuMSApIHJnYmEoIDAsIDAsIDAsIDAuMSApIHJnYmEoIDAsIDAsIDAsIDAuMjUgKTsKKyAgY29sb3I6ICNmZmZmZmY7CisgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KCBzdGFydENvbG9yc3RyPScjMDQ5Y2RiJywgZW5kQ29sb3JzdHI9JyMwMDY0Y2QnLCBHcmFkaWVudFR5cGU9MCApOworICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjI1KTsKK30KKworYnV0dG9uLnN1Y2Nlc3MKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogIzU3YTk1NzsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OworICBiYWNrZ3JvdW5kLWltYWdlOiAta2h0bWwtZ3JhZGllbnQoIGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCAjNjJjNDYyICksIHRvKCAjNTdhOTU3ICkgKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoIHRvcCwgIzYyYzQ2MiwgIzU3YTk1NyApOworICBiYWNrZ3JvdW5kLWltYWdlOiAtbXMtbGluZWFyLWdyYWRpZW50KCB0b3AsICM2MmM0NjIsICM1N2E5NTcgKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudCggbGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGNvbG9yLXN0b3AoIDAlLCAjNjJjNDYyICksIGNvbG9yLXN0b3AoIDEwMCUsICM1N2E5NTcgKSApOworICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCggdG9wLCAjNjJjNDYyLCAjNTdhOTU3ICk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCggdG9wLCAjNjJjNDYyLCAjNTdhOTU3ICk7CisgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCggdG9wLCAjNjJjNDYyLCAjNTdhOTU3ICk7CisgIGJvcmRlci1jb2xvcjogIzU3YTk1NyAjNTdhOTU3ICMzZDc3M2Q7CisgIGJvcmRlci1jb2xvcjogcmdiYSggMCwgMCwgMCwgMC4xICkgcmdiYSggMCwgMCwgMCwgMC4xICkgcmdiYSggMCwgMCwgMCwgMC4yNSApOworICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudCggc3RhcnRDb2xvcnN0cj0nIzYyYzQ2MicsIGVuZENvbG9yc3RyPScjNTdhOTU3JywgR3JhZGllbnRUeXBlPTAgKTsKKyAgY29sb3I6ICNmZmZmZmY7CisgIHRleHQtc2hhZG93OiAwIC0xcHggMCByZ2JhKCAwLCAwLCAwLCAwLjI1ICk7Cit9CisKK2J1dHRvbi53YXJuCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNjNDNjMzU7CisgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKKyAgYmFja2dyb3VuZC1pbWFnZTogLWtodG1sLWdyYWRpZW50KCBsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbSggI2VlNWY1YiApLCB0byggI2M0M2MzNSApICk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KCB0b3AsICNlZTVmNWIsICNjNDNjMzUgKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCggdG9wLCAjZWU1ZjViLCAjYzQzYzM1ICk7CisgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQoIGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKCAwJSwgI2VlNWY1YiApLCBjb2xvci1zdG9wKCAxMDAlLCAjYzQzYzM1ICkgKTsKKyAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoIHRvcCwgI2VlNWY1YiwgI2M0M2MzNSApOworICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoIHRvcCwgI2VlNWY1YiwgI2M0M2MzNSApOworICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoIHRvcCwgI2VlNWY1YiwgI2M0M2MzNSApOworICBib3JkZXItY29sb3I6ICNjNDNjMzUgI2M0M2MzNSAjODgyYTI1OworICBib3JkZXItY29sb3I6IHJnYmEoIDAsIDAsIDAsIDAuMSApIHJnYmEoIDAsIDAsIDAsIDAuMSApIHJnYmEoIDAsIDAsIDAsIDAuMjUgKTsKKyAgY29sb3I6ICNmZmZmZmY7CisgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KCBzdGFydENvbG9yc3RyPScjZWU1ZjViJywgZW5kQ29sb3JzdHI9JyNjNDNjMzUnLCBHcmFkaWVudFR5cGU9MCApOworICB0ZXh0LXNoYWRvdzogMCAtMXB4IDAgcmdiYSggMCwgMCwgMCwgMC4yNSApOworfQorCithCit7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworcHJlCit7CisgIGNvbG9yOiAjMzMzOworICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCithYmJyCit7CisgIGN1cnNvcjogaGVscDsKK30KKwordWwKK3sKKyAgbGlzdC1zdHlsZTogbm9uZTsKK30KKworLmNsZWFyZml4OmFmdGVyIHsgY2xlYXI6IGJvdGg7IGNvbnRlbnQ6ICIuIjsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMDsgaGVpZ2h0OiAwOyB2aXNpYmlsaXR5OiBoaWRkZW47IH0KKy5jbGVhcmZpeCAgICAgICB7IGRpc3BsYXk6IGJsb2NrOyB9CisKKy5sb2FkZXIKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvbG9hZGVyLmdpZiApICFpbXBvcnRhbnQ7Cit9CisKKy5sb2FkZXItbGlnaHQKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvbG9hZGVyLWxpZ2h0LmdpZiApICFpbXBvcnRhbnQ7Cit9CisKKy51bml2ZXJzYWwtbG9hZGVyIHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiAtMTZweDsKKyAgdG9wOiAwcHg7CisgIHdpZHRoOiAxNnB4OworICBoZWlnaHQ6IDE2cHg7Cit9CisKKyN3cmFwcGVyCit7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgbWFyZ2luOiAwIGF1dG87CisgIG1hcmdpbi1ib3R0b206IDMwcHg7CisgIHRleHQtYWxpZ246IGxlZnQ7Cit9CisKKyNoZWFkZXIKK3sKKyAgcGFkZGluZy1ib3R0b206IDEwcHg7CisgIHBvc2l0aW9uOiBmaXhlZDsKKyAgei1pbmRleDogNDI7Cit9CisKKy5zY3JvbGwgI2hlYWRlcgoreworICBwb3NpdGlvbjogYWJzb2x1dGU7Cit9CisKKyNoZWFkZXIgI3NvbHIKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvc29sci5zdmcgKTsKKyAgYmFja2dyb3VuZC1zaXplOiAxMjhweDsKKyAgZGlzcGxheTogYmxvY2s7CisgIGhlaWdodDogNzhweDsKKyAgd2lkdGg6IDE1MHB4OworfQorCisjaGVhZGVyICNzb2xyIHNwYW4KK3sKKyAgZGlzcGxheTogbm9uZTsKK30KKworI21haW4KK3sKKyAgbWluLXdpZHRoOiA3NTBweDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCisjbWFpbi5lcnJvcgoreworICBib3JkZXI6IDA7CisgIG1pbi1oZWlnaHQ6IDA7CisgIHBhZGRpbmctdG9wOiAyMHB4OworfQorCisjbWFpbi5lcnJvciAubWVzc2FnZQoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjAwOworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY29uc3RydWN0aW9uLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMHB4IDUwJTsKKyAgY29sb3I6ICNmZmY7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBtYXJnaW4tbGVmdDogMTUwcHg7CisgIG1hcmdpbi1ib3R0b206IDIwcHg7CisgIHBhZGRpbmc6IDEwcHg7CisgIHBhZGRpbmctbGVmdDogMzVweDsKK30KKworI21haW4uZXJyb3IgLmNvZGUKK3sKKyAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDsKKyAgcGFkZGluZzogNXB4OworfQorCisjbWV0YQoreworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGJvdHRvbTogLTI2cHg7CisgIHJpZ2h0OiAwOworfQorCisjbWV0YSBsaQoreworICBmbG9hdDogbGVmdDsKK30KKworI21ldGEgbGkgYQoreworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMHB4IDUwJTsKKyAgZGlzcGxheTogYmxvY2s7CisgIGhlaWdodDogMjVweDsKKyAgbGluZS1oZWlnaHQ6IDI1cHg7CisgIHBhZGRpbmctbGVmdDogMzFweDsKKyAgcGFkZGluZy1yaWdodDogMTBweDsKK30KKworI21ldGEgbGkgYTpob3ZlcgoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOworfQorCisjbWV0YSAuZG9jdW1lbnRhdGlvbiBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2RvY3VtZW50LXRleHQucG5nICk7IH0KKyNtZXRhIC5pc3N1ZXMgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9idWcucG5nICk7IH0KKyNtZXRhIC5pcmMgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91c2Vycy5wbmcgKTsgfQorI21ldGEgLm1haWxpbmdsaXN0IGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vbWFpbC5wbmcgKTsgfQorI21ldGEgLndpa2ktcXVlcnktc3ludGF4IGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc2NyaXB0LWNvZGUucG5nICk7IH0KKworI2Vudmlyb25tZW50Cit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ib3gucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDVweCA1MCU7CisgIGRpc3BsYXk6IG5vbmU7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBtYXJnaW4tdG9wOiAxMHB4OworICBwYWRkaW5nOiA1cHggMTBweDsKKyAgcGFkZGluZy1sZWZ0OiAyNnB4OworfQorCisuaGFzLWVudmlyb25tZW50ICNlbnZpcm9ubWVudAoreworICBkaXNwbGF5OiBibG9jazsKK30KKworI2Vudmlyb25tZW50LnByb2QKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2MzN2Y3ZjsKKyAgY29sb3I6ICNmZmY7Cit9CisKKyNlbnZpcm9ubWVudC50ZXN0Cit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1YjI7Cit9CisKKyNlbnZpcm9ubWVudC5kZXYKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2NjZTdjYzsKK30KKworLmhlYWRlci1tZXNzYWdlCit7CisgIGJvcmRlcjogMXB4IHNvbGlkICNmMDA7CisgIG1hcmdpbi1sZWZ0OiAxNTBweDsKKyAgbWFyZ2luLWJvdHRvbTogMjBweDsKK30KKworLmhlYWRlci1tZXNzYWdlIGgyLAorLmhlYWRlci1tZXNzYWdlIHVsLAorLmhlYWRlci1tZXNzYWdlIHAKK3sKKyAgcGFkZGluZzogMTBweDsKK30KKworLmhlYWRlci1tZXNzYWdlIGgyCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmMDA7CisgIGNvbG9yOiAjZmZmOworICBmb250LXdlaWdodDogYm9sZDsKK30KKworLmhlYWRlci1tZXNzYWdlIHAKK3sKKyAgY29sb3I6ICNjMGMwYzA7CisgIHBhZGRpbmctdG9wOiAwOworfQorCisjbG9hZGluZworI2h0dHAtZXhjZXB0aW9uCit7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKKy5leGNlcHRpb24KK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwMDsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NvbnN0cnVjdGlvbi5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTBweCA1MCU7CisgIGNvbG9yOiAjZmZmOworICBmb250LXdlaWdodDogYm9sZDsKKyAgbWFyZ2luLWJvdHRvbTogMjBweDsKKyAgcGFkZGluZzogMTBweDsKKyAgcGFkZGluZy1sZWZ0OiAzNXB4OworfQorCisjY29udGVudC13cmFwcGVyCit7CisgIG1hcmdpbi1sZWZ0OiAxNTBweDsKKyAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDsKKyAgbWluLWhlaWdodDogNTAwcHg7Cit9CisKKyNjb250ZW50Cit7CisgIHBhZGRpbmc6IDEwcHg7Cit9CisKKyNjb250ZW50ID4gLmxvYWRlcgoreworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCBpZnJhbWUKK3sKKyAgYm9yZGVyOiAwOworICBkaXNwbGF5OiBibG9jazsKKyAgbWluLWhlaWdodDogNDAwcHg7CisgIHdpZHRoOiAxMDAlOworfQorCisjY29udGVudCAuYmxvY2sKK3sKKyAgbWFyZ2luLWJvdHRvbTogMTBweDsKK30KKworI2NvbnRlbnQgLmJsb2NrIGgyCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDVweCA1MCU7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjBmMGYwOworICBmb250LXdlaWdodDogYm9sZDsKKyAgcGFkZGluZzogNXB4OworICBwYWRkaW5nLWxlZnQ6IDI2cHg7Cit9CisKKyNjb250ZW50IC5ibG9jay5kaXNhYmxlZCwKKyNjb250ZW50IC5ibG9jay5kaXNhYmxlZCBoMgoreworICBjb2xvcjogI2MwYzBjMDsKK30KKworI2NvbnRlbnQgLmJsb2NrIC5tZXNzYWdlLAorI2NvbnRlbnQgLmJsb2NrIC5jb250ZW50Cit7CisgIHBhZGRpbmc6IDVweDsKK30KKworLyogc3ludGF4ICovCisKK3ByZS5zeW50YXgKK3sKKyAgb3ZlcmZsb3c6IGF1dG87Cit9CisKK3ByZS5zeW50YXggY29kZQoreworICBkaXNwbGF5OiBibG9jazsKKyAgY29sb3I6ICMwMDA7Cit9CisKK3ByZS5zeW50YXggLmNvbW1lbnQsCitwcmUuc3ludGF4IC50ZW1wbGF0ZV9jb21tZW50LAorcHJlLnN5bnRheCAuZGlmZiAuaGVhZGVyLAorcHJlLnN5bnRheCAuamF2YWRvYworeworICBjb2xvcjogIzk5ODsKKyAgZm9udC1zdHlsZTogaXRhbGljOworfQorCitwcmUuc3ludGF4IC5rZXl3b3JkLAorcHJlLnN5bnRheCAuY3NzIC5ydWxlIC5rZXl3b3JkLAorcHJlLnN5bnRheCAud2ludXRpbHMsCitwcmUuc3ludGF4IC5qYXZhc2NyaXB0IC50aXRsZSwKK3ByZS5zeW50YXggLmxpc3AgLnRpdGxlLAorcHJlLnN5bnRheCAuc3Vic3QKK3sKKyAgY29sb3I6ICMwMDA7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitwcmUuc3ludGF4IC5udW1iZXIsCitwcmUuc3ludGF4IC5oZXhjb2xvcgoreworICBjb2xvcjogIzQwYTA3MDsKK30KKworcHJlLnN5bnRheC5sYW5ndWFnZS1qc29uIC5udW1iZXIKK3sKKyAgY29sb3I6IGJsdWU7Cit9CisKK3ByZS5zeW50YXgubGFuZ3VhZ2UtanNvbiAubGl0ZXJhbAoreworICBjb2xvcjogZmlyZWJyaWNrOworfQorCitwcmUuc3ludGF4IC5zdHJpbmcsCitwcmUuc3ludGF4IC50YWcgLnZhbHVlLAorcHJlLnN5bnRheCAucGhwZG9jLAorcHJlLnN5bnRheCAudGV4IC5mb3JtdWxhCit7CisgIGNvbG9yOiAjZDE0OworfQorCitwcmUuc3ludGF4Lmxhbmd1YWdlLWpzb24gLnN0cmluZworeworICBjb2xvcjogZ3JlZW47Cit9CisKK3ByZS5zeW50YXggLnRpdGxlLAorcHJlLnN5bnRheCAuaWQKK3sKKyAgY29sb3I6ICM5MDA7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitwcmUuc3ludGF4IC5qYXZhc2NyaXB0IC50aXRsZSwKK3ByZS5zeW50YXggLmxpc3AgLnRpdGxlLAorcHJlLnN5bnRheCAuc3Vic3QKK3sKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKK30KKworcHJlLnN5bnRheCAuY2xhc3MgLnRpdGxlLAorcHJlLnN5bnRheCAudGV4IC5jb21tYW5kCit7CisgIGNvbG9yOiAjNDU4OworICBmb250LXdlaWdodDogYm9sZDsKK30KKworcHJlLnN5bnRheCAudGFnLAorcHJlLnN5bnRheCAuY3NzIC5rZXl3b3JkLAorcHJlLnN5bnRheCAuaHRtbCAua2V5d29yZCwKK3ByZS5zeW50YXggLnRhZyAudGl0bGUsCitwcmUuc3ludGF4IC5kamFuZ28gLnRhZyAua2V5d29yZAoreworICBjb2xvcjogIzAwMDA4MDsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKK30KKworcHJlLnN5bnRheCAuYXR0cmlidXRlLAorcHJlLnN5bnRheCAudmFyaWFibGUsCitwcmUuc3ludGF4IC5pbnN0YW5jZXZhciwKK3ByZS5zeW50YXggLmxpc3AgLmJvZHkKK3sKKyAgY29sb3I6ICMwMDgwODA7Cit9CisKK3ByZS5zeW50YXgubGFuZ3VhZ2UtanNvbiAuYXR0cmlidXRlCit7CisgIGNvbG9yOiBibGFjazsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK3ByZS5zeW50YXggLnJlZ2V4cAoreworICBjb2xvcjogIzAwOTkyNjsKK30KKworcHJlLnN5bnRheCAuY2xhc3MKK3sKKyAgY29sb3I6ICM0NTg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitwcmUuc3ludGF4IC5zeW1ib2wsCitwcmUuc3ludGF4IC5ydWJ5IC5zeW1ib2wgLnN0cmluZywKK3ByZS5zeW50YXggLnJ1YnkgLnN5bWJvbCAua2V5d29yZCwKK3ByZS5zeW50YXggLnJ1YnkgLnN5bWJvbCAua2V5bWV0aG9kcywKK3ByZS5zeW50YXggLmxpc3AgLmtleXdvcmQsCitwcmUuc3ludGF4IC50ZXggLnNwZWNpYWwKK3sKKyAgY29sb3I6ICM5OTAwNzM7Cit9CisKK3ByZS5zeW50YXggLmJ1aWx0aW4sCitwcmUuc3ludGF4IC5idWlsdF9pbiwKK3ByZS5zeW50YXggLmxpc3AgLnRpdGxlCit7CisgIGNvbG9yOiAjMDA4NmIzOworfQorCitwcmUuc3ludGF4IC5wcmVwcm9jZXNzb3IsCitwcmUuc3ludGF4IC5waSwKK3ByZS5zeW50YXggLmRvY3R5cGUsCitwcmUuc3ludGF4IC5zaGViYW5nLAorcHJlLnN5bnRheCAuY2RhdGEKK3sKKyAgY29sb3I6ICM5OTk7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitwcmUuc3ludGF4IC5kZWxldGlvbgoreworICBiYWNrZ3JvdW5kOiAjZmRkOworfQorCitwcmUuc3ludGF4IC5hZGRpdGlvbgoreworICBiYWNrZ3JvdW5kOiAjZGZkOworfQorCitwcmUuc3ludGF4IC5kaWZmIC5jaGFuZ2UKK3sKKyAgYmFja2dyb3VuZDogIzAwODZiMzsKK30KKworcHJlLnN5bnRheCAuY2h1bmsKK3sKKyAgY29sb3I6ICNhYWE7Cit9CisKK3ByZS5zeW50YXggLnRleCAuZm9ybXVsYQoreworICBvcGFjaXR5OiAwLjU7Cit9CisKKyNjb250ZW50IC50cmVlIGxpLCAKKyNjb250ZW50IC50cmVlIGlucworeworICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvdHJlZS5wbmcgKTsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgCit9CisKKyNjb250ZW50IC50cmVlIGxpCit7CisgIGJhY2tncm91bmQtcG9zaXRpb246IC01NHB4IDA7CisgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteTsKKyAgbGluZS1oZWlnaHQ6IDIycHg7Cit9CisKKyNjb250ZW50IC50cmVlIGxpLmpzdHJlZS1sYXN0Cit7CisgIGJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Cit9CisKKyNjb250ZW50IC50cmVlIC5qc3RyZWUtb3BlbiA+IGlucworeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzZweCAwOworfQorCisjY29udGVudCAudHJlZSAuanN0cmVlLWNsb3NlZCA+IGlucworeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMThweCAwOworfQorCisjY29udGVudCAudHJlZSAuanN0cmVlLWxlYWYgPiBpbnMKK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOworfQorCisjY29udGVudCAudHJlZSAuanN0cmVlLWhvdmVyZWQKK3sKKyAgYmFja2dyb3VuZDojZTdmNGY5OyBib3JkZXI6MXB4IHNvbGlkICNkOGYwZmE7IHBhZGRpbmc6MCAycHggMCAxcHg7Cit9CisKKyNjb250ZW50IC50cmVlIC5qc3RyZWUtY2xpY2tlZAoreworICBiYWNrZ3JvdW5kOiNiZWViZmY7IGJvcmRlcjoxcHggc29saWQgIzk5ZGVmZDsgcGFkZGluZzowIDJweCAwIDFweDsKK30KKworI2NvbnRlbnQgLnRyZWUgYS5hY3RpdmUKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKKyAgY29sb3I6ICMwMGY7Cit9CisKKyNjb250ZW50IC50cmVlIGEgLmpzdHJlZS1pY29uCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9mb2xkZXIucG5nICk7Cit9CisKKyNjb250ZW50IC50cmVlIC5qc3RyZWUtbGVhZiBhIC5qc3RyZWUtaWNvbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZG9jdW1lbnQtdGV4dC5wbmcgKTsKK30KKworI2NvbnRlbnQgLnRyZWUgLmpzdHJlZS1zZWFyY2gKK3sKKyAgZm9udC1zdHlsZTppdGFsaWM7Cit9CisKKyNjb250ZW50IC50cmVlIGEuanN0cmVlLXNlYXJjaAoreworICBjb2xvcjphcXVhOworfQorCisjY29ubmVjdGlvbi1ib3gKK3sKKyAgZGlzcGxheTogbm9uZTsKK30KKworI2Nvbm5lY3Rpb24tc3RhdHVzLW1vZGFsCit7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgdG9wOiAwcHg7CisgIGxlZnQ6IDBweDsKKyAgd2lkdGg6IDEwMCU7CisgIGhlaWdodDogMTAwJTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2U2ZTZlNjsKKyAgb3BhY2l0eTogMC41OworICB6LWluZGV4OiAxMDA7Cit9CisKKyNjb25uZWN0aW9uLXN0YXR1cy1yZWNvdmVyZWQ6Cit7CisgIHotaW5kZXg6MTAyOworfQorCisuY29ubmVjdGlvbi1zdGF0dXMKK3sKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiAyMDBweDsKKyAgcmlnaHQ6IDIwMHB4OworICB0b3A6IDQwJTsKKyAgaGVpZ2h0OiA3NXB4OworICBib3JkZXI6IDFweCBzb2xpZCAjZjAwOworICBwYWRkaW5nOiAzMHB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworICBvcGFjaXR5OiAxOworICB6LWluZGV4OiAxMDE7Cit9CisKKy5jb25uZWN0aW9uLXN0YXR1cyBwCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9uZXR3b3JrLXN0YXR1cy1idXN5LnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgY29sb3I6ICM4MDA7CisgIHBhZGRpbmctbGVmdDogMjZweDsKK30KKworI2Nvbm5lY3Rpb24tc3RhdHVzLXJlY292ZXJlZCBwCit7CisgIGNvbG9yOiAjMDgwOworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vbmV0d29yay1zdGF0dXMucG5nICk7Cit9CisKKyNjb250ZW50IC5hZGRyZXNzLWJhcgoreworICBtYXJnaW4tYm90dG9tOiAxMHB4OworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdWktYWRkcmVzcy1iYXIucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDVweCA1MCU7CisgIGJvcmRlcjogMXB4IHNvbGlkICNmMGYwZjA7CisgIGJveC1zaGFkb3c6IDFweCAxcHggMCAjZjBmMGYwOworICAtbW96LWJveC1zaGFkb3c6IDFweCAxcHggMCAjZjBmMGYwOworICAtd2Via2l0LWJveC1zaGFkb3c6IDFweCAxcHggMCAjZjBmMGYwOworICBjb2xvcjogI2MwYzBjMDsKKyAgZGlzcGxheTogYmxvY2s7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBhZGRpbmc6IDVweDsKKyAgcGFkZGluZy1sZWZ0OiAyNnB4OworICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisjY29udGVudCAuYWRkcmVzcy1iYXI6Zm9jdXMsCisjY29udGVudCAuYWRkcmVzcy1iYXI6aG92ZXIKK3sKKyAgYm9yZGVyLWNvbG9yOiAjYzBjMGMwOworICBib3gtc2hhZG93OiAxcHggMXB4IDAgI2Q4ZDhkODsKKyAgLW1vei1ib3gtc2hhZG93OiAxcHggMXB4IDAgI2Q4ZDhkODsKKyAgLXdlYmtpdC1ib3gtc2hhZG93OiAxcHggMXB4IDAgI2Q4ZDhkODsKKyAgY29sb3I6ICMzMzM7Cit9CisKKy5leGNlcHRpb24gLnNob3ctZXhjZXB0aW9uIHsKKyAgbWFyZ2luLXRvcDogNHB4OworICBkaXNwbGF5OiBibG9jazsKKyAgcG9zaXRpb246IGFic29sdXRlOworICByaWdodDogMTBweDsKKyAgdG9wOiA3cHg7CisgIGNvbG9yOiAjZmZmOworfQorCisjZXhjZXB0aW9uIC5zaG93LWV4Y2VwdGlvbiBhOmhvdmVyIHsKKyAgY29sb3I6ICMzMzM7Cit9CisKKy5vdGhlci11aS1saW5rIHsKKyAgbWFyZ2luOiAwcHg7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgcmlnaHQ6IDBweDsKKyAgdG9wOiAtMjBweDsKK30KKworLm90aGVyLXVpLWxpbmsgc3BhbiwKKy5uZXctdWktd2FybmluZyBzcGFuLmhlbHAgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaW5mb3JtYXRpb24td2hpdGUucG5nICk7CisgIHJpZ2h0OiAwcHg7CisgIHBhZGRpbmctbGVmdDogMTZweDsKK30KKworLm90aGVyLXVpLWxpbmsgYS51bCB7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvY29yZXMuY3NzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2NvcmVzLmNzcwppbmRleCBkYjQ1ODdhLi45NmU2Zjk2IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvY29yZXMuY3NzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9jb3Jlcy5jc3MKQEAgLTEsMjMzICsxLDIzMyBAQAotLyoNCi0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSovDQotDQotI2NvbnRlbnQgI2NvcmVzDQotew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgI3VpLWJsb2NrDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsNCi0gIGhlaWdodDogMjAwcHg7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICBsZWZ0OiAtNXB4Ow0KLSAgdG9wOiAzNXB4Ow0KLSAgd2lkdGg6IDUwMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgI2ZyYW1lDQotew0KLSAgZmxvYXQ6IHJpZ2h0Ow0KLSAgd2lkdGg6IDg2JTsNCi19DQotDQotI2NvbnRlbnQgI2NvcmVzICNuYXZpZ2F0aW9uDQotew0KLSAgcGFkZGluZy10b3A6IDUwcHg7DQotICB3aWR0aDogMTIlOw0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgI25hdmlnYXRpb24gYQ0KLXsNCi0gIHBhZGRpbmctbGVmdDogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgI2ZyYW1lIC5hY3Rpb25zDQotew0KLSAgbWFyZ2luLWJvdHRvbTogMjBweDsNCi0gIG1pbi1oZWlnaHQ6IDMwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyBkaXYuYWN0aW9uDQotew0KLSAgd2lkdGg6IDMyMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgLmFjdGlvbnMgZGl2LmFjdGlvbiAuY2xvdWQNCi17DQotfQ0KLQ0KLSNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyBmb3JtIC5kaXJlY3Rvcnktbm90ZQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9pbmZvcm1hdGlvbi13aGl0ZS5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDIyJSAxcHg7DQotICBjb2xvcjogI2MwYzBjMDsNCi19DQotDQotI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGZvcm0gLmVycm9yDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLWJ1dHRvbi5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDIyJSAxcHg7DQotICBjb2xvcjogI2MwMDsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgLmFjdGlvbnMgZm9ybSBwDQotew0KLSAgcGFkZGluZy1ib3R0b206IDhweDsNCi19DQotDQotI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGZvcm0gbGFiZWwNCi17DQotICBmbG9hdDogbGVmdDsNCi0gIHBhZGRpbmctdG9wOiAzcHg7DQotICBwYWRkaW5nLWJvdHRvbTogM3B4Ow0KLSAgdGV4dC1hbGlnbjogcmlnaHQ7DQotICB3aWR0aDogMjUlOw0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgLmFjdGlvbnMgZm9ybSBpbnB1dCwNCi0jY29udGVudCAjY29yZXMgLmFjdGlvbnMgZm9ybSBzZWxlY3QsDQotI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGZvcm0gLmJ1dHRvbnMsDQotI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGZvcm0gLm5vdGUgc3Bhbg0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHdpZHRoOiA3MSU7DQotfQ0KLQ0KLSNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyBmb3JtIC5ub3RlIHNwYW4NCi17DQotICBwYWRkaW5nLWxlZnQ6IDNweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDNweDsNCi19DQotDQotI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGZvcm0gLmJ1dHRvbnMNCi17DQotICBwYWRkaW5nLXRvcDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGZvcm0gYnV0dG9uLnN1Ym1pdA0KLXsNCi0gIG1hcmdpbi1yaWdodDogMjBweDsNCi19DQotDQotI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGZvcm0gYnV0dG9uLnN1Ym1pdCBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyBmb3JtIGJ1dHRvbi5yZXNldCBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgLmFjdGlvbnMgI2FkZA0KLXsNCi0gIGxlZnQ6IDA7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotfQ0KLQ0KLSNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyAjYWRkIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcGx1cy1idXR0b24ucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyAjdW5sb2FkDQotew0KLSAgbWFyZ2luLXJpZ2h0OiAyMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgLmFjdGlvbnMgI3VubG9hZCBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgLmFjdGlvbnMgI3JlbG9hZCBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Fycm93LWNpcmNsZS5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zICNyZW5hbWUgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS10ZXh0LWZpZWxkLXNlbGVjdC5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zICNzd2FwIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctc3dpdGNoLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgLmFjdGlvbnMgI29wdGltaXplDQotew0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgLmFjdGlvbnMgI29wdGltaXplIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaGFtbWVyLXNjcmV3ZHJpdmVyLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgLmFjdGlvbnMgZGl2LmFjdGlvbg0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQotICBib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7DQotICAtbW96LWJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOw0KLSAgLXdlYmtpdC1ib3gtc2hhZG93OiA1cHggNXB4IDEwcHggI2MwYzBjMDsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIGxlZnQ6IC01MHB4Ow0KLSAgdG9wOiA0MHB4Ow0KLSAgcGFkZGluZzogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI2NvcmVzICNkYXRhICNjb3JlLWRhdGEgaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYm94LnBuZyApOyB9DQotI2NvbnRlbnQgI2NvcmVzICNkYXRhICNpbmRleC1kYXRhIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoYXJ0LnBuZyApOyB9DQotDQotI2NvbnRlbnQgI2NvcmVzICNkYXRhICNpbmRleC1kYXRhDQotew0KLSAgbWFyZ2luLXRvcDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI2NvcmVzICNkYXRhIGxpDQotew0KLSAgcGFkZGluZy1ib3R0b206IDNweDsNCi0gIHBhZGRpbmctdG9wOiAzcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb3JlcyAjZGF0YSBsaS5vZGQNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4Ow0KLX0NCi0NCi0jY29udGVudCAjY29yZXMgI2RhdGEgbGkgZHQNCi17DQotICBmbG9hdDogbGVmdDsNCi0gIHdpZHRoOiAxNyU7DQotfQ0KLQ0KLSNjb250ZW50ICNjb3JlcyAjZGF0YSBsaSBkZA0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHdpZHRoOiA4MiU7DQotfQ0KLQ0KLSNjb250ZW50ICNjb3JlcyAjZGF0YSBsaSBkZC5pY28NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc2xhc2gucG5nICk7DQotICBoZWlnaHQ6IDIwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNjb3JlcyAjZGF0YSBsaSBkZC5pY28uaWNvLTENCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2NvcmVzICNkYXRhIGxpIGRkLmljbyBzcGFuDQotew0KLX0NCisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKKyNjb250ZW50ICNjb3JlcworeworICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKyNjb250ZW50ICNjb3JlcyAjdWktYmxvY2sKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKKyAgaGVpZ2h0OiAyMDBweDsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiAtNXB4OworICB0b3A6IDM1cHg7CisgIHdpZHRoOiA1MDBweDsKK30KKworI2NvbnRlbnQgI2NvcmVzICNmcmFtZQoreworICBmbG9hdDogcmlnaHQ7CisgIHdpZHRoOiA4NiU7Cit9CisKKyNjb250ZW50ICNjb3JlcyAjbmF2aWdhdGlvbgoreworICBwYWRkaW5nLXRvcDogNTBweDsKKyAgd2lkdGg6IDEyJTsKK30KKworI2NvbnRlbnQgI2NvcmVzICNuYXZpZ2F0aW9uIGEKK3sKKyAgcGFkZGluZy1sZWZ0OiA1cHg7Cit9CisKKyNjb250ZW50ICNjb3JlcyAjZnJhbWUgLmFjdGlvbnMKK3sKKyAgbWFyZ2luLWJvdHRvbTogMjBweDsKKyAgbWluLWhlaWdodDogMzBweDsKK30KKworI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGRpdi5hY3Rpb24KK3sKKyAgd2lkdGg6IDMyMHB4OworfQorCisjY29udGVudCAjY29yZXMgLmFjdGlvbnMgZGl2LmFjdGlvbiAuY2xvdWQKK3sKK30KKworI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGZvcm0gLmRpcmVjdG9yeS1ub3RlCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9pbmZvcm1hdGlvbi13aGl0ZS5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMjIlIDFweDsKKyAgY29sb3I6ICNjMGMwYzA7Cit9CisKKyNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyBmb3JtIC5lcnJvcgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MtYnV0dG9uLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAyMiUgMXB4OworICBjb2xvcjogI2MwMDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKyNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyBmb3JtIHAKK3sKKyAgcGFkZGluZy1ib3R0b206IDhweDsKK30KKworI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGZvcm0gbGFiZWwKK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIHBhZGRpbmctdG9wOiAzcHg7CisgIHBhZGRpbmctYm90dG9tOiAzcHg7CisgIHRleHQtYWxpZ246IHJpZ2h0OworICB3aWR0aDogMjUlOworfQorCisjY29udGVudCAjY29yZXMgLmFjdGlvbnMgZm9ybSBpbnB1dCwKKyNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyBmb3JtIHNlbGVjdCwKKyNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyBmb3JtIC5idXR0b25zLAorI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGZvcm0gLm5vdGUgc3BhbgoreworICBmbG9hdDogcmlnaHQ7CisgIHdpZHRoOiA3MSU7Cit9CisKKyNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyBmb3JtIC5ub3RlIHNwYW4KK3sKKyAgcGFkZGluZy1sZWZ0OiAzcHg7CisgIHBhZGRpbmctcmlnaHQ6IDNweDsKK30KKworI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGZvcm0gLmJ1dHRvbnMKK3sKKyAgcGFkZGluZy10b3A6IDEwcHg7Cit9CisKKyNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyBmb3JtIGJ1dHRvbi5zdWJtaXQKK3sKKyAgbWFyZ2luLXJpZ2h0OiAyMHB4OworfQorCisjY29udGVudCAjY29yZXMgLmFjdGlvbnMgZm9ybSBidXR0b24uc3VibWl0IHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7Cit9CisKKyNjb250ZW50ICNjb3JlcyAuYWN0aW9ucyBmb3JtIGJ1dHRvbi5yZXNldCBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy5wbmcgKTsKK30KKworI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zICNhZGQKK3sKKyAgbGVmdDogMDsKKyAgcG9zaXRpb246IGFic29sdXRlOworfQorCisjY29udGVudCAjY29yZXMgLmFjdGlvbnMgI2FkZCBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9wbHVzLWJ1dHRvbi5wbmcgKTsKK30KKworI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zICN1bmxvYWQKK3sKKyAgbWFyZ2luLXJpZ2h0OiAyMHB4OworfQorCisjY29udGVudCAjY29yZXMgLmFjdGlvbnMgI3VubG9hZCBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy5wbmcgKTsKK30KKworI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zICNyZWxvYWQgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctY2lyY2xlLnBuZyApOworfQorCisjY29udGVudCAjY29yZXMgLmFjdGlvbnMgI3JlbmFtZSBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS10ZXh0LWZpZWxkLXNlbGVjdC5wbmcgKTsKK30KKworI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zICNzd2FwIHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Fycm93LXN3aXRjaC5wbmcgKTsKK30KKworI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zICNvcHRpbWl6ZQoreworfQorCisjY29udGVudCAjY29yZXMgLmFjdGlvbnMgI29wdGltaXplIHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2hhbW1lci1zY3Jld2RyaXZlci5wbmcgKTsKK30KKworI2NvbnRlbnQgI2NvcmVzIC5hY3Rpb25zIGRpdi5hY3Rpb24KK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKKyAgYm9yZGVyOiAxcHggc29saWQgI2YwZjBmMDsKKyAgYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7CisgIC1tb3otYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7CisgIC13ZWJraXQtYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgbGVmdDogLTUwcHg7CisgIHRvcDogNDBweDsKKyAgcGFkZGluZzogMTBweDsKK30KKworI2NvbnRlbnQgI2NvcmVzICNkYXRhICNjb3JlLWRhdGEgaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYm94LnBuZyApOyB9CisjY29udGVudCAjY29yZXMgI2RhdGEgI2luZGV4LWRhdGEgaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hhcnQucG5nICk7IH0KKworI2NvbnRlbnQgI2NvcmVzICNkYXRhICNpbmRleC1kYXRhCit7CisgIG1hcmdpbi10b3A6IDEwcHg7Cit9CisKKyNjb250ZW50ICNjb3JlcyAjZGF0YSBsaQoreworICBwYWRkaW5nLWJvdHRvbTogM3B4OworICBwYWRkaW5nLXRvcDogM3B4OworfQorCisjY29udGVudCAjY29yZXMgI2RhdGEgbGkub2RkCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7Cit9CisKKyNjb250ZW50ICNjb3JlcyAjZGF0YSBsaSBkdAoreworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDE3JTsKK30KKworI2NvbnRlbnQgI2NvcmVzICNkYXRhIGxpIGRkCit7CisgIGZsb2F0OiByaWdodDsKKyAgd2lkdGg6IDgyJTsKK30KKworI2NvbnRlbnQgI2NvcmVzICNkYXRhIGxpIGRkLmljbworeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc2xhc2gucG5nICk7CisgIGhlaWdodDogMjBweDsKK30KKworI2NvbnRlbnQgI2NvcmVzICNkYXRhIGxpIGRkLmljby5pY28tMQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsKK30KKworI2NvbnRlbnQgI2NvcmVzICNkYXRhIGxpIGRkLmljbyBzcGFuCit7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvZGFzaGJvYXJkLmNzcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9kYXNoYm9hcmQuY3NzCmluZGV4IGU2NTNiYTYuLjVmN2Q4YjkzIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvZGFzaGJvYXJkLmNzcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvZGFzaGJvYXJkLmNzcwpAQCAtMSwxODUgKzEsMTg1IEBACi0vKg0KLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotKi8NCi0NCi0jY29udGVudCAjZGFzaGJvYXJkIC5ibG9jaw0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7DQotICB3aWR0aDogNDklOw0KLX0NCi0NCi0jY29udGVudCAjZGFzaGJvYXJkIC5maWVsZGxpc3QNCi17DQotICBmbG9hdDogbGVmdDsNCi19DQotDQotI2NvbnRlbnQgI2Rhc2hib2FyZCAuZmllbGRsaXN0IGR0LA0KLSNjb250ZW50ICNkYXNoYm9hcmQgLmZpZWxkbGlzdCBkZA0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgZmxvYXQ6IGxlZnQ7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXNoYm9hcmQgLmZpZWxkbGlzdCBkdA0KLXsNCi0gIGNsZWFyOiBsZWZ0Ow0KLSAgbWFyZ2luLXJpZ2h0OiAyJTsNCi0gIHRleHQtYWxpZ246IHJpZ2h0Ow0KLSAgd2lkdGg6IDIzJTsNCi19DQotDQotI2NvbnRlbnQgI2Rhc2hib2FyZCAuZmllbGRsaXN0IGRkDQotew0KLSAgd2lkdGg6IDc0JTsNCi19DQotDQotI2NvbnRlbnQgI2Rhc2hib2FyZCAuZmllbGRsaXN0IC5pbmRleF9vcHRpbWl6ZWQNCi17DQotICBtYXJnaW4tdG9wOiAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjZGFzaGJvYXJkIC5maWVsZGxpc3QgLmljbw0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9zbGFzaC5wbmcgKTsNCi0gIGhlaWdodDogMjBweDsNCi19DQotDQotI2NvbnRlbnQgI2Rhc2hib2FyZCAuZmllbGRsaXN0IC5pY28uaWNvLTENCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2Rhc2hib2FyZCAuZmllbGRsaXN0IC5pY28gc3Bhbg0KLXsNCi0gIGRpc3BsYXk6IG5vbmU7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXNoYm9hcmQgI3N0YXRpc3RpY3MgLmluZGV4X29wdGltaXplZC52YWx1ZSBhDQotew0KLSAgZGlzcGxheTogbm9uZTsNCi19DQotDQotI2NvbnRlbnQgI2Rhc2hib2FyZCAjc3RhdGlzdGljcyAuaW5kZXhfb3B0aW1pemVkLnZhbHVlLmljby0wIGENCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2hhbW1lci1zY3Jld2RyaXZlci5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDVweCA1MCU7DQotICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBmbG9hdDogbGVmdDsNCi0gIG1hcmdpbi1sZWZ0OiA1MHB4Ow0KLSAgcGFkZGluZzogMXB4IDVweDsNCi0gIHBhZGRpbmctbGVmdDogMjZweDsNCi19DQotDQotI2NvbnRlbnQgI2Rhc2hib2FyZCAjc3RhdGlzdGljcyAuaW5kZXhfaGFzLWRlbGV0aW9ucw0KLXsNCi0gIGRpc3BsYXk6IG5vbmU7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXNoYm9hcmQgI3N0YXRpc3RpY3MgLmluZGV4X2hhcy1kZWxldGlvbnMudmFsdWUuaWNvLTANCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay1yZWQucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXNoYm9hcmQgI3JlcGxpY2F0aW9uDQotew0KLSAgZmxvYXQ6IGxlZnQ7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXNoYm9hcmQgI3JlcGxpY2F0aW9uIC5pcy1yZXBsaWNhdGluZw0KLXsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDk5JSA1MCU7DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI2NvbnRlbnQgI2Rhc2hib2FyZCAjcmVwbGljYXRpb24gI2RldGFpbHMgdGFibGUgdGhlYWQgdGQgc3Bhbg0KLXsNCi0gIGRpc3BsYXk6IG5vbmU7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXNoYm9hcmQgI2luc3RhbmNlDQotew0KLSAgZmxvYXQ6IHJpZ2h0Ow0KLX0NCi0NCi0jY29udGVudCAjZGFzaGJvYXJkICNpbnN0YW5jZSAuZGlyX2ltcGwNCi17DQotICBtYXJnaW4tdG9wOiAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjZGFzaGJvYXJkICNhZG1pbi1leHRyYQ0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLX0NCi0NCi0jY29udGVudCAjZGFzaGJvYXJkICNoZWFsdGhjaGVjaw0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi19DQotDQotI2NvbnRlbnQgI2Rhc2hib2FyZCAjaGVhbHRoY2hlY2sgLmljbw0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9zbGFzaC5wbmcgKTsNCi0gIGhlaWdodDogMjBweDsNCi0gIHBhZGRpbmctbGVmdDogMjBweDsNCi0gIHdpZHRoOiA2MCU7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXNoYm9hcmQgI2hlYWx0aGNoZWNrIC5pY28uaWNvLTENCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2Rhc2hib2FyZCAjc3lzdGVtIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3NlcnZlci5wbmcgKTsgfQ0KLSNjb250ZW50ICNkYXNoYm9hcmQgI3N0YXRpc3RpY3MgaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hhcnQucG5nICk7IH0NCi0jY29udGVudCAjZGFzaGJvYXJkICNyZXBsaWNhdGlvbiBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ub2RlLnBuZyApOyB9DQotI2NvbnRlbnQgI2Rhc2hib2FyZCAjcmVwbGljYXRpb24ubWFzdGVyIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL25vZGUtbWFzdGVyLnBuZyApOyB9DQotI2NvbnRlbnQgI2Rhc2hib2FyZCAjcmVwbGljYXRpb24uc2xhdmUgaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vbm9kZS1zbGF2ZS5wbmcgKTsgfQ0KLSNjb250ZW50ICNkYXNoYm9hcmQgI2luc3RhbmNlIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3NlcnZlci5wbmcgKTsgfQ0KLSNjb250ZW50ICNkYXNoYm9hcmQgI2FkbWluLWV4dHJhIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3BsdXMtYnV0dG9uLnBuZyApOyB9DQotI2NvbnRlbnQgI2Rhc2hib2FyZCAjY29sbGVjdGlvbiBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ib29rLW9wZW4tdGV4dC5wbmcgKTsgfQ0KLSNjb250ZW50ICNkYXNoYm9hcmQgI3NoYXJkcyBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9kb2N1bWVudHMtc3RhY2sucG5nICk7IH0NCi0NCi0jY29udGVudCAjZGFzaGJvYXJkICNzaGFyZHMgeyBtYXJnaW4tbGVmdDogMjBweDt9DQotDQotI2Rhc2hib2FyZCAjc2hhcmRzIC5zaGFyZCBoMy5zaGFyZC10aXRsZSB7DQotICAgIGRpc3BsYXk6IGJsb2NrOw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzhjOGM4Ow0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgcGFkZGluZzogM3B4Ow0KLSAgICBwYWRkaW5nLWxlZnQ6IDMwcHg7DQotICAgIG1hcmdpbi1sZWZ0OiAyMHB4Ow0KLSAgICBtYXJnaW4tdG9wOiAyMHB4Ow0KLSAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZG9jdW1lbnQtdGV4dC5wbmcgKTsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbi14OiAxMHB4Ow0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uLXk6IDNweDsNCi19DQotDQotI2Rhc2hib2FyZCAjc2hhcmRzIC5zaGFyZCAuc2hhcmQtZGV0YWlsIHsNCi0gICAgbWFyZ2luLWJvdHRvbTogMjVweDsNCi0gICAgbWFyZ2luLXRvcDogN3B4Ow0KLX0NCi0NCi0jZGFzaGJvYXJkICNzaGFyZHMgLnNoYXJkIC5yZXBsaWNhIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2U0ZTRlNDsNCi19DQotDQotI2Rhc2hib2FyZCAjc2hhcmRzIC5zaGFyZCAucmVwbGljYS5vZGQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KLX0NCisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKKyNjb250ZW50ICNkYXNoYm9hcmQgLmJsb2NrCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CisgIHdpZHRoOiA0OSU7Cit9CisKKyNjb250ZW50ICNkYXNoYm9hcmQgLmZpZWxkbGlzdAoreworICBmbG9hdDogbGVmdDsKK30KKworI2NvbnRlbnQgI2Rhc2hib2FyZCAuZmllbGRsaXN0IGR0LAorI2NvbnRlbnQgI2Rhc2hib2FyZCAuZmllbGRsaXN0IGRkCit7CisgIGRpc3BsYXk6IGJsb2NrOworICBmbG9hdDogbGVmdDsKK30KKworI2NvbnRlbnQgI2Rhc2hib2FyZCAuZmllbGRsaXN0IGR0Cit7CisgIGNsZWFyOiBsZWZ0OworICBtYXJnaW4tcmlnaHQ6IDIlOworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgd2lkdGg6IDIzJTsKK30KKworI2NvbnRlbnQgI2Rhc2hib2FyZCAuZmllbGRsaXN0IGRkCit7CisgIHdpZHRoOiA3NCU7Cit9CisKKyNjb250ZW50ICNkYXNoYm9hcmQgLmZpZWxkbGlzdCAuaW5kZXhfb3B0aW1pemVkCit7CisgIG1hcmdpbi10b3A6IDEwcHg7Cit9CisKKyNjb250ZW50ICNkYXNoYm9hcmQgLmZpZWxkbGlzdCAuaWNvCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9zbGFzaC5wbmcgKTsKKyAgaGVpZ2h0OiAyMHB4OworfQorCisjY29udGVudCAjZGFzaGJvYXJkIC5maWVsZGxpc3QgLmljby5pY28tMQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsKK30KKworI2NvbnRlbnQgI2Rhc2hib2FyZCAuZmllbGRsaXN0IC5pY28gc3BhbgoreworICBkaXNwbGF5OiBub25lOworfQorCisjY29udGVudCAjZGFzaGJvYXJkICNzdGF0aXN0aWNzIC5pbmRleF9vcHRpbWl6ZWQudmFsdWUgYQoreworICBkaXNwbGF5OiBub25lOworfQorCisjY29udGVudCAjZGFzaGJvYXJkICNzdGF0aXN0aWNzIC5pbmRleF9vcHRpbWl6ZWQudmFsdWUuaWNvLTAgYQoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaGFtbWVyLXNjcmV3ZHJpdmVyLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1cHggNTAlOworICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwOworICBkaXNwbGF5OiBibG9jazsKKyAgZmxvYXQ6IGxlZnQ7CisgIG1hcmdpbi1sZWZ0OiA1MHB4OworICBwYWRkaW5nOiAxcHggNXB4OworICBwYWRkaW5nLWxlZnQ6IDI2cHg7Cit9CisKKyNjb250ZW50ICNkYXNoYm9hcmQgI3N0YXRpc3RpY3MgLmluZGV4X2hhcy1kZWxldGlvbnMKK3sKKyAgZGlzcGxheTogbm9uZTsKK30KKworI2NvbnRlbnQgI2Rhc2hib2FyZCAjc3RhdGlzdGljcyAuaW5kZXhfaGFzLWRlbGV0aW9ucy52YWx1ZS5pY28tMAoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay1yZWQucG5nICk7Cit9CisKKyNjb250ZW50ICNkYXNoYm9hcmQgI3JlcGxpY2F0aW9uCit7CisgIGZsb2F0OiBsZWZ0OworfQorCisjY29udGVudCAjZGFzaGJvYXJkICNyZXBsaWNhdGlvbiAuaXMtcmVwbGljYXRpbmcKK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogOTklIDUwJTsKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKyNjb250ZW50ICNkYXNoYm9hcmQgI3JlcGxpY2F0aW9uICNkZXRhaWxzIHRhYmxlIHRoZWFkIHRkIHNwYW4KK3sKKyAgZGlzcGxheTogbm9uZTsKK30KKworI2NvbnRlbnQgI2Rhc2hib2FyZCAjaW5zdGFuY2UKK3sKKyAgZmxvYXQ6IHJpZ2h0OworfQorCisjY29udGVudCAjZGFzaGJvYXJkICNpbnN0YW5jZSAuZGlyX2ltcGwKK3sKKyAgbWFyZ2luLXRvcDogMTBweDsKK30KKworI2NvbnRlbnQgI2Rhc2hib2FyZCAjYWRtaW4tZXh0cmEKK3sKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKKyNjb250ZW50ICNkYXNoYm9hcmQgI2hlYWx0aGNoZWNrCit7CisgIGZsb2F0OiByaWdodDsKK30KKworI2NvbnRlbnQgI2Rhc2hib2FyZCAjaGVhbHRoY2hlY2sgLmljbworeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc2xhc2gucG5nICk7CisgIGhlaWdodDogMjBweDsKKyAgcGFkZGluZy1sZWZ0OiAyMHB4OworICB3aWR0aDogNjAlOworfQorCisjY29udGVudCAjZGFzaGJvYXJkICNoZWFsdGhjaGVjayAuaWNvLmljby0xCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOworfQorCisjY29udGVudCAjZGFzaGJvYXJkICNzeXN0ZW0gaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc2VydmVyLnBuZyApOyB9CisjY29udGVudCAjZGFzaGJvYXJkICNzdGF0aXN0aWNzIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoYXJ0LnBuZyApOyB9CisjY29udGVudCAjZGFzaGJvYXJkICNyZXBsaWNhdGlvbiBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ub2RlLnBuZyApOyB9CisjY29udGVudCAjZGFzaGJvYXJkICNyZXBsaWNhdGlvbi5tYXN0ZXIgaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vbm9kZS1tYXN0ZXIucG5nICk7IH0KKyNjb250ZW50ICNkYXNoYm9hcmQgI3JlcGxpY2F0aW9uLnNsYXZlIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL25vZGUtc2xhdmUucG5nICk7IH0KKyNjb250ZW50ICNkYXNoYm9hcmQgI2luc3RhbmNlIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3NlcnZlci5wbmcgKTsgfQorI2NvbnRlbnQgI2Rhc2hib2FyZCAjYWRtaW4tZXh0cmEgaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcGx1cy1idXR0b24ucG5nICk7IH0KKyNjb250ZW50ICNkYXNoYm9hcmQgI2NvbGxlY3Rpb24gaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYm9vay1vcGVuLXRleHQucG5nICk7IH0KKyNjb250ZW50ICNkYXNoYm9hcmQgI3NoYXJkcyBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9kb2N1bWVudHMtc3RhY2sucG5nICk7IH0KKworI2NvbnRlbnQgI2Rhc2hib2FyZCAjc2hhcmRzIHsgbWFyZ2luLWxlZnQ6IDIwcHg7fQorCisjZGFzaGJvYXJkICNzaGFyZHMgLnNoYXJkIGgzLnNoYXJkLXRpdGxlIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzhjOGM4OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHBhZGRpbmc6IDNweDsKKyAgICBwYWRkaW5nLWxlZnQ6IDMwcHg7CisgICAgbWFyZ2luLWxlZnQ6IDIwcHg7CisgICAgbWFyZ2luLXRvcDogMjBweDsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZG9jdW1lbnQtdGV4dC5wbmcgKTsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uLXg6IDEwcHg7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbi15OiAzcHg7Cit9CisKKyNkYXNoYm9hcmQgI3NoYXJkcyAuc2hhcmQgLnNoYXJkLWRldGFpbCB7CisgICAgbWFyZ2luLWJvdHRvbTogMjVweDsKKyAgICBtYXJnaW4tdG9wOiA3cHg7Cit9CisKKyNkYXNoYm9hcmQgI3NoYXJkcyAuc2hhcmQgLnJlcGxpY2EgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7Cit9CisKKyNkYXNoYm9hcmQgI3NoYXJkcyAuc2hhcmQgLnJlcGxpY2Eub2RkIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2RhdGFpbXBvcnQuY3NzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2RhdGFpbXBvcnQuY3NzCmluZGV4IDk0M2U3N2YuLjk3ZmM1YzcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9kYXRhaW1wb3J0LmNzcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvZGF0YWltcG9ydC5jc3MKQEAgLTEsMzcwICsxLDM3MCBAQAotLyoNCi0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSovDQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9kaXYuZ2lmICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAyMSUgMDsNCi0gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteTsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2ZyYW1lDQotew0KLSAgZmxvYXQ6IHJpZ2h0Ow0KLSAgd2lkdGg6IDc4JTsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2Zvcm0NCi17DQotICBmbG9hdDogbGVmdDsNCi0gIHdpZHRoOiAyMCU7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtICNuYXZpZ2F0aW9uDQotew0KLSAgYm9yZGVyLXJpZ2h0OiAwOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSAjbmF2aWdhdGlvbiBhDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3N0YXR1cy1vZmZsaW5lLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSAjbmF2aWdhdGlvbiAuY3VycmVudCBhDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3N0YXR1cy5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2Zvcm0gZm9ybQ0KLXsNCi0gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgbWFyZ2luLXRvcDogMTBweDsNCi0gIHBhZGRpbmctdG9wOiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIGxhYmVsDQotew0KLSAgY3Vyc29yOiBwb2ludGVyOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBtYXJnaW4tdG9wOiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIGlucHV0LA0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIHNlbGVjdCwNCi0jY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSB0ZXh0YXJlYQ0KLXsNCi0gIG1hcmdpbi1ib3R0b206IDJweDsNCi0gIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSBpbnB1dA0KLXsNCi0gIHdpZHRoOiA5OCU7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIGJ1dHRvbg0KLXsNCi0gIG1hcmdpbi10b3A6IDEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIC5leGVjdXRlIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZG9jdW1lbnQtaW1wb3J0LnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSAucmVmcmVzaC1zdGF0dXMgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9hcnJvdy1jaXJjbGUucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIC5yZWZyZXNoLXN0YXR1cyBzcGFuLnN1Y2Nlc3MNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2Zvcm0gI3N0YXJ0DQotew0KLSAgZmxvYXQ6IGxlZnQ7DQotICB3aWR0aDogNDclOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSAjcm93cw0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHdpZHRoOiA0NyU7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIC5jaGVja2JveCBpbnB1dA0KLXsNCi0gIG1hcmdpbi1ib3R0b206IDA7DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2Zvcm0gI2F1dG8tcmVmcmVzaC1zdGF0dXMNCi17DQotICBtYXJnaW4tdG9wOiAyMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSAjYXV0by1yZWZyZXNoLXN0YXR1cyBhDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3VpLWNoZWNrLWJveC11bmNoZWNrLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBjb2xvcjogI2MwYzBjMDsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSAjYXV0by1yZWZyZXNoLXN0YXR1cyBhLm9uLA0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtICNhdXRvLXJlZnJlc2gtc3RhdHVzIGE6aG92ZXINCi17DQotICBjb2xvcjogIzMzMzsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2Zvcm0gI2F1dG8tcmVmcmVzaC1zdGF0dXMgYS5vbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1jaGVjay1ib3gucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlDQotew0KLSAgcGFkZGluZzogMTBweDsNCi0gIG1hcmdpbi1ib3R0b206IDIwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlIC5sYXN0X3VwZGF0ZSwNCi0jY29udGVudCAjZGF0YWltcG9ydCAjY3VycmVudF9zdGF0ZSAuaW5mbw0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjY3VycmVudF9zdGF0ZSAubGFzdF91cGRhdGUNCi17DQotICBjb2xvcjogI2MwYzBjMDsNCi0gIGZvbnQtc2l6ZTogMTFweDsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUgLmluZm8NCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDFweDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUgLmluZm8gLmRldGFpbHMgc3Bhbg0KLXsNCi0jICBjb2xvcjogI2MwYzBjMDsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUgLmluZm8gLmFib3J0LWltcG9ydA0KLXsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHJpZ2h0OiAwcHg7DQotICB0b3A6IDBweDsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUgLmluZm8gLmFib3J0LWltcG9ydCBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjY3VycmVudF9zdGF0ZSAuaW5mbyAuYWJvcnQtaW1wb3J0LnN1Y2Nlc3Mgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjY3VycmVudF9zdGF0ZS5pbmRleGluZw0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlLmluZGV4aW5nIC5pbmZvDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2hvdXJnbGFzcy5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuaW5kZXhpbmcgLmluZm8gLmFib3J0LWltcG9ydA0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjY3VycmVudF9zdGF0ZS5zdWNjZXNzDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2U2ZjNlNjsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuc3VjY2VzcyAuaW5mbw0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLWNpcmNsZS5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuc3VjY2VzcyAuaW5mbyBzdHJvbmcNCi17DQotICBjb2xvcjogIzA4MDsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuYWJvcnRlZA0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmM2U2ZTY7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlLmFib3J0ZWQgLmluZm8NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc2xhc2gucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlLmFib3J0ZWQgLmluZm8gc3Ryb25nDQotew0KLSAgY29sb3I6ICM4MDA7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlLmZhaWx1cmUNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNlNmU2Ow0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjY3VycmVudF9zdGF0ZS5mYWlsdXJlIC5pbmZvDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLWJ1dHRvbi5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuZmFpbHVyZSAuaW5mbyBzdHJvbmcNCi17DQotICBjb2xvcjogIzgwMDsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuaWRsZQ0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNlNmU2ZmY7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlLmlkbGUgLmluZm8NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaW5mb3JtYXRpb24ucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNlcnJvcg0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmMDA7DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY29uc3RydWN0aW9uLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTBweCA1MCU7DQotICBjb2xvcjogI2ZmZjsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgbWFyZ2luLWJvdHRvbTogMjBweDsNCi0gIHBhZGRpbmc6IDEwcHg7DQotICBwYWRkaW5nLWxlZnQ6IDM1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0IC5ibG9jayBoMg0KLXsNCi0gIGJvcmRlci1jb2xvcjogI2MwYzBjMDsNCi0gIHBhZGRpbmctbGVmdDogNXB4Ow0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAuYmxvY2suaGlkZGVuIGgyDQotew0KLSAgYm9yZGVyLWNvbG9yOiAjZmFmYWZhOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAuYmxvY2sgaDIgYS50b2dnbGUNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdG9nZ2xlLXNtYWxsLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0IC5ibG9jay5oaWRkZW4gaDIgYS50b2dnbGUNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdG9nZ2xlLXNtYWxsLWV4cGFuZC5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2NvbmZpZyBoMiBhLnINCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzcHggNTAlOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBmbG9hdDogcmlnaHQ7DQotICBtYXJnaW4tbGVmdDogMTBweDsNCi0gIHBhZGRpbmctbGVmdDogMjRweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDNweDsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2NvbmZpZyBoMiBhLnJlbG9hZF9jb25maWcNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctY2lyY2xlLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjY29uZmlnIGgyIGEucmVsb2FkX2NvbmZpZy5zdWNjZXNzDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNjb25maWcgaDIgYS5yZWxvYWRfY29uZmlnLmVycm9yDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3NsYXNoLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjY29uZmlnIGgyIGEuZGVidWdfbW9kZQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9oYW1tZXIucG5nICk7DQotICBjb2xvcjogI2MwYzBjMDsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2NvbmZpZy5kZWJ1Z19tb2RlIGgyIGEuZGVidWdfbW9kZQ0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmZjA7DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaGFtbWVyLXNjcmV3ZHJpdmVyLnBuZyApOw0KLSAgY29sb3I6ICMzMzM7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNjb25maWcgLmNvbnRlbnQNCi17DQotICBwYWRkaW5nOiA1cHggMnB4Ow0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjZGF0YWltcG9ydF9jb25maWcgLmxvYWRlcg0KLXsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjZGF0YWltcG9ydF9jb25maWcgLmZvcm1hdHRlZA0KLXsNCi0gIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHBhZGRpbmc6IDJweDsNCi19DQotDQotI2NvbnRlbnQgI2RhdGFpbXBvcnQgLmRlYnVnX21vZGUgI2RhdGFpbXBvcnRfY29uZmlnIC5lZGl0YWJsZQ0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi0jY29udGVudCAjZGF0YWltcG9ydCAjZGF0YWltcG9ydF9jb25maWcgLmVkaXRhYmxlIHRleHRhcmVhDQotew0KLSAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCi0gIGhlaWdodDogMTIwcHg7DQotICBtaW4taGVpZ2h0OiA2MHB4Ow0KLSAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLSNjb250ZW50ICNkYXRhaW1wb3J0ICNkZWJ1Z19yZXNwb25zZSBlbQ0KLXsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLSAgZm9udC1zdHlsZTogbm9ybWFsOw0KLX0NCisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKKyNjb250ZW50ICNkYXRhaW1wb3J0Cit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2Rpdi5naWYgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMjElIDA7CisgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteTsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2ZyYW1lCit7CisgIGZsb2F0OiByaWdodDsKKyAgd2lkdGg6IDc4JTsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2Zvcm0KK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIHdpZHRoOiAyMCU7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtICNuYXZpZ2F0aW9uCit7CisgIGJvcmRlci1yaWdodDogMDsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2Zvcm0gI25hdmlnYXRpb24gYQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc3RhdHVzLW9mZmxpbmUucG5nICk7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtICNuYXZpZ2F0aW9uIC5jdXJyZW50IGEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3N0YXR1cy5wbmcgKTsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2Zvcm0gZm9ybQoreworICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsKKyAgbWFyZ2luLXRvcDogMTBweDsKKyAgcGFkZGluZy10b3A6IDVweDsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2Zvcm0gbGFiZWwKK3sKKyAgY3Vyc29yOiBwb2ludGVyOworICBkaXNwbGF5OiBibG9jazsKKyAgbWFyZ2luLXRvcDogNXB4OworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSBpbnB1dCwKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIHNlbGVjdCwKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIHRleHRhcmVhCit7CisgIG1hcmdpbi1ib3R0b206IDJweDsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIGlucHV0Cit7CisgIHdpZHRoOiA5OCU7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIGJ1dHRvbgoreworICBtYXJnaW4tdG9wOiAxMHB4OworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSAuZXhlY3V0ZSBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9kb2N1bWVudC1pbXBvcnQucG5nICk7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIC5yZWZyZXNoLXN0YXR1cyBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9hcnJvdy1jaXJjbGUucG5nICk7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtIC5yZWZyZXNoLXN0YXR1cyBzcGFuLnN1Y2Nlc3MKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtICNzdGFydAoreworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDQ3JTsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2Zvcm0gI3Jvd3MKK3sKKyAgZmxvYXQ6IHJpZ2h0OworICB3aWR0aDogNDclOworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSAuY2hlY2tib3ggaW5wdXQKK3sKKyAgbWFyZ2luLWJvdHRvbTogMDsKKyAgd2lkdGg6IGF1dG87Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtICNhdXRvLXJlZnJlc2gtc3RhdHVzCit7CisgIG1hcmdpbi10b3A6IDIwcHg7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtICNhdXRvLXJlZnJlc2gtc3RhdHVzIGEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3VpLWNoZWNrLWJveC11bmNoZWNrLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgY29sb3I6ICNjMGMwYzA7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNmb3JtICNhdXRvLXJlZnJlc2gtc3RhdHVzIGEub24sCisjY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSAjYXV0by1yZWZyZXNoLXN0YXR1cyBhOmhvdmVyCit7CisgIGNvbG9yOiAjMzMzOworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjZm9ybSAjYXV0by1yZWZyZXNoLXN0YXR1cyBhLm9uCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1jaGVjay1ib3gucG5nICk7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlCit7CisgIHBhZGRpbmc6IDEwcHg7CisgIG1hcmdpbi1ib3R0b206IDIwcHg7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlIC5sYXN0X3VwZGF0ZSwKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlIC5pbmZvCit7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlIC5sYXN0X3VwZGF0ZQoreworICBjb2xvcjogI2MwYzBjMDsKKyAgZm9udC1zaXplOiAxMXB4OworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjY3VycmVudF9zdGF0ZSAuaW5mbworeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDFweDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjY3VycmVudF9zdGF0ZSAuaW5mbyAuZGV0YWlscyBzcGFuCit7CisjICBjb2xvcjogI2MwYzBjMDsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUgLmluZm8gLmFib3J0LWltcG9ydAoreworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAwcHg7CisgIHRvcDogMHB4OworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjY3VycmVudF9zdGF0ZSAuaW5mbyAuYWJvcnQtaW1wb3J0IHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLnBuZyApOworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjY3VycmVudF9zdGF0ZSAuaW5mbyAuYWJvcnQtaW1wb3J0LnN1Y2Nlc3Mgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuaW5kZXhpbmcKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuaW5kZXhpbmcgLmluZm8KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2hvdXJnbGFzcy5wbmcgKTsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuaW5kZXhpbmcgLmluZm8gLmFib3J0LWltcG9ydAoreworICBkaXNwbGF5OiBibG9jazsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuc3VjY2VzcworeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZmM2U2OworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjY3VycmVudF9zdGF0ZS5zdWNjZXNzIC5pbmZvCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLWNpcmNsZS5wbmcgKTsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuc3VjY2VzcyAuaW5mbyBzdHJvbmcKK3sKKyAgY29sb3I6ICMwODA7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlLmFib3J0ZWQKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YzZTZlNjsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuYWJvcnRlZCAuaW5mbworeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc2xhc2gucG5nICk7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlLmFib3J0ZWQgLmluZm8gc3Ryb25nCit7CisgIGNvbG9yOiAjODAwOworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjY3VycmVudF9zdGF0ZS5mYWlsdXJlCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmM2U2ZTY7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlLmZhaWx1cmUgLmluZm8KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLWJ1dHRvbi5wbmcgKTsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuZmFpbHVyZSAuaW5mbyBzdHJvbmcKK3sKKyAgY29sb3I6ICM4MDA7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNjdXJyZW50X3N0YXRlLmlkbGUKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2U2ZTZmZjsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2N1cnJlbnRfc3RhdGUuaWRsZSAuaW5mbworeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaW5mb3JtYXRpb24ucG5nICk7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNlcnJvcgoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjAwOworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY29uc3RydWN0aW9uLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMHB4IDUwJTsKKyAgY29sb3I6ICNmZmY7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBtYXJnaW4tYm90dG9tOiAyMHB4OworICBwYWRkaW5nOiAxMHB4OworICBwYWRkaW5nLWxlZnQ6IDM1cHg7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0IC5ibG9jayBoMgoreworICBib3JkZXItY29sb3I6ICNjMGMwYzA7CisgIHBhZGRpbmctbGVmdDogNXB4OworICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0IC5ibG9jay5oaWRkZW4gaDIKK3sKKyAgYm9yZGVyLWNvbG9yOiAjZmFmYWZhOworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAuYmxvY2sgaDIgYS50b2dnbGUKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RvZ2dsZS1zbWFsbC5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIHBhZGRpbmctbGVmdDogMjFweDsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgLmJsb2NrLmhpZGRlbiBoMiBhLnRvZ2dsZQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdG9nZ2xlLXNtYWxsLWV4cGFuZC5wbmcgKTsKK30KKworI2NvbnRlbnQgI2RhdGFpbXBvcnQgI2NvbmZpZyBoMiBhLnIKK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogM3B4IDUwJTsKKyAgZGlzcGxheTogYmxvY2s7CisgIGZsb2F0OiByaWdodDsKKyAgbWFyZ2luLWxlZnQ6IDEwcHg7CisgIHBhZGRpbmctbGVmdDogMjRweDsKKyAgcGFkZGluZy1yaWdodDogM3B4OworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjY29uZmlnIGgyIGEucmVsb2FkX2NvbmZpZworeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctY2lyY2xlLnBuZyApOworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjY29uZmlnIGgyIGEucmVsb2FkX2NvbmZpZy5zdWNjZXNzCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjY29uZmlnIGgyIGEucmVsb2FkX2NvbmZpZy5lcnJvcgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc2xhc2gucG5nICk7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNjb25maWcgaDIgYS5kZWJ1Z19tb2RlCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9oYW1tZXIucG5nICk7CisgIGNvbG9yOiAjYzBjMGMwOworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjY29uZmlnLmRlYnVnX21vZGUgaDIgYS5kZWJ1Z19tb2RlCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZjA7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9oYW1tZXItc2NyZXdkcml2ZXIucG5nICk7CisgIGNvbG9yOiAjMzMzOworfQorCisjY29udGVudCAjZGF0YWltcG9ydCAjY29uZmlnIC5jb250ZW50Cit7CisgIHBhZGRpbmc6IDVweCAycHg7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNkYXRhaW1wb3J0X2NvbmZpZyAubG9hZGVyCit7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNkYXRhaW1wb3J0X2NvbmZpZyAuZm9ybWF0dGVkCit7CisgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nOiAycHg7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0IC5kZWJ1Z19tb2RlICNkYXRhaW1wb3J0X2NvbmZpZyAuZWRpdGFibGUKK3sKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNkYXRhaW1wb3J0X2NvbmZpZyAuZWRpdGFibGUgdGV4dGFyZWEKK3sKKyAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKKyAgaGVpZ2h0OiAxMjBweDsKKyAgbWluLWhlaWdodDogNjBweDsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKyNjb250ZW50ICNkYXRhaW1wb3J0ICNkZWJ1Z19yZXNwb25zZSBlbQoreworICBjb2xvcjogI2MwYzBjMDsKKyAgZm9udC1zdHlsZTogbm9ybWFsOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2RvY3VtZW50cy5jc3MgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvZG9jdW1lbnRzLmNzcwppbmRleCBiNDBmZGU0Li4yZjBiYTEyIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvZG9jdW1lbnRzLmNzcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvZG9jdW1lbnRzLmNzcwpAQCAtMSwxNzkgKzEsMTc5IEBACi0vKg0KLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotKi8NCi0NCi0jY29udGVudCAjZG9jdW1lbnRzDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvZGl2LmdpZiApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogNDUlIDA7DQotICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXk7DQotfQ0KLQ0KLSNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0NCi17DQotICBmbG9hdDogbGVmdDsNCi0gIC8qd2lkdGg6IDIxJTsqLw0KLX0NCi0NCi0jY29udGVudCAjZG9jdW1lbnRzICNmb3JtIGxhYmVsDQotew0KLSAgY3Vyc29yOiBwb2ludGVyOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBtYXJnaW4tdG9wOiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0gaW5wdXQsDQotI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBzZWxlY3QsDQotI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSB0ZXh0YXJlYQ0KLXsNCi0gIG1hcmdpbi1ib3R0b206IDJweDsNCi0gIC8qd2lkdGg6IDEwMCU7Ki8NCi19DQotDQotI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBpbnB1dCwNCi0jY29udGVudCAjZG9jdW1lbnRzICNmb3JtIHRleHRhcmVhDQotew0KLSAgbWFyZ2luLWJvdHRvbTogMnB4Ow0KLSAgLyp3aWR0aDogOTglOyovDQotfQ0KLQ0KLSNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0gI3N0YXJ0DQotew0KLSAgZmxvYXQ6IGxlZnQ7DQotICAvKndpZHRoOiA0NSU7Ki8NCi19DQotDQotI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSAjcm93cw0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gLyogd2lkdGg6IDQ1JTsqLw0KLX0NCi0NCi0jY29udGVudCAjZG9jdW1lbnRzICNmb3JtIC5jaGVja2JveCBpbnB1dA0KLXsNCi0gIG1hcmdpbi1ib3R0b206IDA7DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBmaWVsZHNldCwNCi0jY29udGVudCAjZG9jdW1lbnRzICNmb3JtIC5vcHRpb25hbC5leHBhbmRlZA0KLXsNCi0gIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7DQotICBib3JkZXItdG9wOiAxcHggc29saWQgI2MwYzBjMDsNCi0gIG1hcmdpbi1ib3R0b206IDVweDsNCi19DQotDQotI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBmaWVsZHNldC5jb21tb24NCi17DQotICBtYXJnaW4tdG9wOiAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjZG9jdW1lbnRzICNmb3JtIGZpZWxkc2V0IGxlZ2VuZCwNCi0jY29udGVudCAjZG9jdW1lbnRzICNmb3JtIC5vcHRpb25hbC5leHBhbmRlZCBsZWdlbmQNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi0gIG1hcmdpbi1sZWZ0OiAxMHB4Ow0KLSAgcGFkZGluZzogMHB4IDVweDsNCi19DQotDQotI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBmaWVsZHNldCBsZWdlbmQgbGFiZWwNCi17DQotICBtYXJnaW4tdG9wOiAwOw0KLX0NCi0NCi0jY29udGVudCAjZG9jdW1lbnRzICNmb3JtIGZpZWxkc2V0IC5maWVsZHNldA0KLXsNCi0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KLSAgcGFkZGluZy1ib3R0b206IDEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0gLm9wdGlvbmFsDQotew0KLSAgYm9yZGVyOiAwOw0KLX0NCi0NCi0jY29udGVudCAjZG9jdW1lbnRzICNmb3JtIC5vcHRpb25hbCBsZWdlbmQNCi17DQotICBtYXJnaW4tbGVmdDogMDsNCi0gIHBhZGRpbmctbGVmdDogMDsNCi19DQotDQotI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSAub3B0aW9uYWwuZXhwYW5kZWQgLmZpZWxkc2V0DQotew0KLSAgZGlzcGxheTogYmxvY2s7DQotfQ0KLQ0KLSNjb250ZW50ICNkb2N1bWVudHMgI3Jlc3VsdA0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHdpZHRoOiA1NCU7DQotfQ0KLQ0KLSNjb250ZW50ICNkb2N1bWVudHMgI3Jlc3VsdCAjdXJsDQotew0KLSAgbWFyZ2luLWJvdHRvbTogMTBweDsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1hZGRyZXNzLWJhci5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDVweCA1MCU7DQotICBib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgYm94LXNoYWRvdzogMXB4IDFweCAwICNmMGYwZjA7DQotICAtbW96LWJveC1zaGFkb3c6IDFweCAxcHggMCAjZjBmMGYwOw0KLSAgLXdlYmtpdC1ib3gtc2hhZG93OiAxcHggMXB4IDAgI2YwZjBmMDsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBvdmVyZmxvdzogaGlkZGVuOw0KLSAgcGFkZGluZzogNXB4Ow0KLSAgcGFkZGluZy1sZWZ0OiAyNnB4Ow0KLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCi19DQotDQotI2NvbnRlbnQgI2RvY3VtZW50cyAjcmVzdWx0ICN1cmw6Zm9jdXMsDQotI2NvbnRlbnQgI2RvY3VtZW50cyAjcmVzdWx0ICN1cmw6aG92ZXINCi17DQotICBib3JkZXItY29sb3I6ICNjMGMwYzA7DQotICBib3gtc2hhZG93OiAxcHggMXB4IDAgI2Q4ZDhkODsNCi0gIC1tb3otYm94LXNoYWRvdzogMXB4IDFweCAwICNkOGQ4ZDg7DQotICAtd2Via2l0LWJveC1zaGFkb3c6IDFweCAxcHggMCAjZDhkOGQ4Ow0KLSAgY29sb3I6ICMzMzM7DQotfQ0KLQ0KLSNjb250ZW50ICNkb2N1bWVudHMgI3Jlc3VsdCAjcmVzcG9uc2UNCi17DQotfQ0KLQ0KLSNjb250ZW50ICNkb2N1bWVudHMgI3Jlc3VsdCAjcmVzcG9uc2UgcHJlDQotew0KLSAgcGFkZGluZy1sZWZ0OiAyMHB4Ow0KLX0NCi0NCi0uZGVzY3JpcHRpb257DQotICBmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotI2RvY3VtZW50LXR5cGV7DQotICBwYWRkaW5nLWJvdHRvbTogNXB4Ow0KLX0NCi0NCi0jd2l6YXJkLWZpZWxkcyBkaXZ7DQotICBwYWRkaW5nLXRvcDogNXB4Ow0KLSAgcGFkZGluZy1ib3R0b206IDVweDsNCi19DQotDQotI3dpei1maWVsZC1kYXRhLCAjd2l6LWZpZWxkLWRhdGEgc3BhbnsNCi0gIHZlcnRpY2FsLWFsaWduOiB0b3A7DQotfQ0KKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKworI2NvbnRlbnQgI2RvY3VtZW50cworeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9kaXYuZ2lmICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDQ1JSAwOworICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXk7Cit9CisKKyNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0KK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIC8qd2lkdGg6IDIxJTsqLworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtIGxhYmVsCit7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi10b3A6IDVweDsKK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBpbnB1dCwKKyNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0gc2VsZWN0LAorI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSB0ZXh0YXJlYQoreworICBtYXJnaW4tYm90dG9tOiAycHg7CisgIC8qd2lkdGg6IDEwMCU7Ki8KK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBpbnB1dCwKKyNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0gdGV4dGFyZWEKK3sKKyAgbWFyZ2luLWJvdHRvbTogMnB4OworICAvKndpZHRoOiA5OCU7Ki8KK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSAjc3RhcnQKK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIC8qd2lkdGg6IDQ1JTsqLworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtICNyb3dzCit7CisgIGZsb2F0OiByaWdodDsKKyAvKiB3aWR0aDogNDUlOyovCit9CisKKyNjb250ZW50ICNkb2N1bWVudHMgI2Zvcm0gLmNoZWNrYm94IGlucHV0Cit7CisgIG1hcmdpbi1ib3R0b206IDA7CisgIHdpZHRoOiBhdXRvOworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtIGZpZWxkc2V0LAorI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSAub3B0aW9uYWwuZXhwYW5kZWQKK3sKKyAgYm9yZGVyOiAxcHggc29saWQgI2ZmZjsKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjMGMwYzA7CisgIG1hcmdpbi1ib3R0b206IDVweDsKK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBmaWVsZHNldC5jb21tb24KK3sKKyAgbWFyZ2luLXRvcDogMTBweDsKK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSBmaWVsZHNldCBsZWdlbmQsCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtIC5vcHRpb25hbC5leHBhbmRlZCBsZWdlbmQKK3sKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi1sZWZ0OiAxMHB4OworICBwYWRkaW5nOiAwcHggNXB4OworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtIGZpZWxkc2V0IGxlZ2VuZCBsYWJlbAoreworICBtYXJnaW4tdG9wOiAwOworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtIGZpZWxkc2V0IC5maWVsZHNldAoreworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YwZjBmMDsKKyAgbWFyZ2luLWJvdHRvbTogNXB4OworICBwYWRkaW5nLWJvdHRvbTogMTBweDsKK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSAub3B0aW9uYWwKK3sKKyAgYm9yZGVyOiAwOworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNmb3JtIC5vcHRpb25hbCBsZWdlbmQKK3sKKyAgbWFyZ2luLWxlZnQ6IDA7CisgIHBhZGRpbmctbGVmdDogMDsKK30KKworI2NvbnRlbnQgI2RvY3VtZW50cyAjZm9ybSAub3B0aW9uYWwuZXhwYW5kZWQgLmZpZWxkc2V0Cit7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNyZXN1bHQKK3sKKyAgZmxvYXQ6IHJpZ2h0OworICB3aWR0aDogNTQlOworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNyZXN1bHQgI3VybAoreworICBtYXJnaW4tYm90dG9tOiAxMHB4OworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdWktYWRkcmVzcy1iYXIucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDVweCA1MCU7CisgIGJvcmRlcjogMXB4IHNvbGlkICNmMGYwZjA7CisgIGJveC1zaGFkb3c6IDFweCAxcHggMCAjZjBmMGYwOworICAtbW96LWJveC1zaGFkb3c6IDFweCAxcHggMCAjZjBmMGYwOworICAtd2Via2l0LWJveC1zaGFkb3c6IDFweCAxcHggMCAjZjBmMGYwOworICBjb2xvcjogI2MwYzBjMDsKKyAgZGlzcGxheTogYmxvY2s7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHBhZGRpbmc6IDVweDsKKyAgcGFkZGluZy1sZWZ0OiAyNnB4OworICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNyZXN1bHQgI3VybDpmb2N1cywKKyNjb250ZW50ICNkb2N1bWVudHMgI3Jlc3VsdCAjdXJsOmhvdmVyCit7CisgIGJvcmRlci1jb2xvcjogI2MwYzBjMDsKKyAgYm94LXNoYWRvdzogMXB4IDFweCAwICNkOGQ4ZDg7CisgIC1tb3otYm94LXNoYWRvdzogMXB4IDFweCAwICNkOGQ4ZDg7CisgIC13ZWJraXQtYm94LXNoYWRvdzogMXB4IDFweCAwICNkOGQ4ZDg7CisgIGNvbG9yOiAjMzMzOworfQorCisjY29udGVudCAjZG9jdW1lbnRzICNyZXN1bHQgI3Jlc3BvbnNlCit7Cit9CisKKyNjb250ZW50ICNkb2N1bWVudHMgI3Jlc3VsdCAjcmVzcG9uc2UgcHJlCit7CisgIHBhZGRpbmctbGVmdDogMjBweDsKK30KKworLmRlc2NyaXB0aW9ueworICBmb250LXdlaWdodDogYm9sZDsKK30KKworI2RvY3VtZW50LXR5cGV7CisgIHBhZGRpbmctYm90dG9tOiA1cHg7Cit9CisKKyN3aXphcmQtZmllbGRzIGRpdnsKKyAgcGFkZGluZy10b3A6IDVweDsKKyAgcGFkZGluZy1ib3R0b206IDVweDsKK30KKworI3dpei1maWVsZC1kYXRhLCAjd2l6LWZpZWxkLWRhdGEgc3BhbnsKKyAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9maWxlcy5jc3MgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvZmlsZXMuY3NzCmluZGV4IDgxZWY3MTUuLjQ2YjNlOGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9maWxlcy5jc3MKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2ZpbGVzLmNzcwpAQCAtMSw1MyArMSw1MyBAQAotLyoNCi0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSovDQotDQotI2NvbnRlbnQgI2ZpbGVzICN0cmVlLWhvbGRlcg0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgd2lkdGg6IDIwJTsNCi19DQotDQotI2NvbnRlbnQgI2ZpbGVzICN0cmVlLWhvbGRlciBsaQ0KLXsNCi0gIG92ZXJmbG93OiBoaWRkZW47DQotfQ0KLQ0KLSNjb250ZW50ICNmaWxlcyBmb3JtIC5idXR0b25zIGJ1dHRvbg0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi19DQotDQotI2NvbnRlbnQgI2ZpbGVzICNmaWxlLWNvbnRlbnQNCi17DQotICBmbG9hdDogcmlnaHQ7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICB3aWR0aDogNzglOw0KLSAgbWluLWhlaWdodDogMTAwcHgNCi19DQotDQotI2NvbnRlbnQgI2ZpbGVzIC5zaG93ICNmaWxlLWNvbnRlbnQNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI2NvbnRlbnQgI2ZpbGVzICNmaWxlLWNvbnRlbnQgLnJlc3BvbnNlDQotew0KLSAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7DQotICBwYWRkaW5nOiAycHg7DQotfQ0KKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKworI2NvbnRlbnQgI2ZpbGVzICN0cmVlLWhvbGRlcgoreworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDIwJTsKK30KKworI2NvbnRlbnQgI2ZpbGVzICN0cmVlLWhvbGRlciBsaQoreworICBvdmVyZmxvdzogaGlkZGVuOworfQorCisjY29udGVudCAjZmlsZXMgZm9ybSAuYnV0dG9ucyBidXR0b24KK3sKKyAgZmxvYXQ6IHJpZ2h0OworfQorCisjY29udGVudCAjZmlsZXMgI2ZpbGUtY29udGVudAoreworICBmbG9hdDogcmlnaHQ7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgd2lkdGg6IDc4JTsKKyAgbWluLWhlaWdodDogMTAwcHgKK30KKworI2NvbnRlbnQgI2ZpbGVzIC5zaG93ICNmaWxlLWNvbnRlbnQKK3sKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKyNjb250ZW50ICNmaWxlcyAjZmlsZS1jb250ZW50IC5yZXNwb25zZQoreworICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgcGFkZGluZzogMnB4OworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2luZGV4LmNzcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9pbmRleC5jc3MKaW5kZXggYWJhYjRhNS4uZTA3YjhkNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2luZGV4LmNzcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvaW5kZXguY3NzCkBAIC0xLDIxNiArMSwyMTYgQEAKLS8qDQotDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0qLw0KLQ0KLSNjb250ZW50ICNpbmRleCAuYmFyLWRlc2MNCi17DQotICBjb2xvcjogI2MwYzBjMDsNCi0gIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICBtYXJnaW4tbGVmdDogMTBweDsNCi0gIHdoaXRlLXNwYWNlOiBwcmU7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlcg0KLXsNCi0gIGJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOw0KLSAgLW1vei1ib3gtc2hhZG93OiA1cHggNXB4IDEwcHggI2MwYzBjMDsNCi0gIC13ZWJraXQtYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7DQotICBoZWlnaHQ6IDM1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlciAuYmFyDQotew0KLSAgaGVpZ2h0OiAxMDAlOw0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLX0NCi0NCi0jY29udGVudCAjaW5kZXggLmJhci1ob2xkZXIgZGl2IC52YWwNCi17DQotICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZjAwOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBwYWRkaW5nLXJpZ2h0OiA1cHg7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICByaWdodDogMDsNCi0gIHRvcDogMzVweDsNCi0gIHdoaXRlLXNwYWNlOiBub3dyYXA7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlciAuYmFyLW1heC5iYXINCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOw0KLX0NCi0NCi0jY29udGVudCAjaW5kZXggLmJhci1ob2xkZXIgLmJhci1tYXgudmFsDQotew0KLSAgYm9yZGVyLWNvbG9yOiAjZjBmMGYwOw0KLSAgY29sb3I6ICNkNmQ2ZDY7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlciAuYmFyLXRvdGFsLmJhcg0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNjMGMwYzA7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlciAuYmFyLXRvdGFsLnZhbA0KLXsNCi0gIGJvcmRlci1jb2xvcjogI2MwYzBjMDsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLX0NCi0NCi0jY29udGVudCAjaW5kZXggLmJhci1ob2xkZXIgLmJhci11c2VkLmJhcg0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICM5Njk2OTY7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlciAuYmFyLXVzZWQudmFsDQotew0KLSAgYm9yZGVyLWNvbG9yOiAjOTY5Njk2Ow0KLSAgY29sb3I6ICM5Njk2OTY7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlci5iYXItbHZsLTIgLmJhci1tYXgudmFsIHsgcGFkZGluZy10b3A6IDI1cHg7IH0NCi0jY29udGVudCAjaW5kZXggLmJhci1ob2xkZXIuYmFyLWx2bC0yIC5iYXItdG90YWwudmFsIHsgcGFkZGluZy10b3A6IDVweDsgfQ0KLSNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlci5iYXItbHZsLTIgeyBtYXJnaW4tYm90dG9tOiA0NXB4OyB9DQotDQotI2NvbnRlbnQgI2luZGV4IC5iYXItaG9sZGVyLmJhci1sdmwtMyAuYmFyLW1heC52YWwgeyBwYWRkaW5nLXRvcDogNDVweDsgfQ0KLSNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlci5iYXItbHZsLTMgLmJhci10b3RhbC52YWwgeyBwYWRkaW5nLXRvcDogMjVweDsgfQ0KLSNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlci5iYXItbHZsLTMgLmJhci11c2VkLnZhbCB7IHBhZGRpbmctdG9wOiA1cHg7IH0NCi0jY29udGVudCAjaW5kZXggLmJhci1ob2xkZXIuYmFyLWx2bC0zIHsgbWFyZ2luLWJvdHRvbTogNjVweDsgfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAubG9hZGVyDQotew0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAuaW5kZXgtbGVmdA0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgd2lkdGg6IDU1JTsNCi19DQotDQotI2NvbnRlbnQgI2luZGV4IC5pbmRleC1yaWdodA0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHdpZHRoOiA0MCU7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAuZGF0YQ0KLXsNCi0gIHBhZGRpbmctYm90dG9tOiAxMnB4Ow0KLSAgb3ZlcmZsb3c6IGhpZGRlbjsNCi19DQotDQotI2NvbnRlbnQgI2luZGV4IC5kYXRhOmhvdmVyDQotew0KLSAgb3ZlcmZsb3cteDogYXV0bzsNCi19DQotDQotI2NvbnRlbnQgI2luZGV4IC5kYXRhIGxpDQotew0KLSAgcGFkZGluZy10b3A6IDNweDsNCi0gIHBhZGRpbmctYm90dG9tOiAzcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAuZGF0YSBsaSBkdA0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCi0gIHdpZHRoOiAyMCU7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAuZGF0YSBsaSBkZA0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOw0KLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCi0gIHdpZHRoOiA4MCUNCi19DQotDQotI2NvbnRlbnQgI2luZGV4IC5kYXRhIGxpIGRkLm9kZA0KLXsNCi0gIGNvbG9yOiAjOTk5Ow0KLX0NCi0NCi0jY29udGVudCAjaW5kZXggLmRhdGEgZHQgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDFweCA1MCU7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHBhZGRpbmctbGVmdDogMjJweDsNCi19DQotDQotI2NvbnRlbnQgI2luZGV4ICNpbnN0YW5jZSBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9zZXJ2ZXIucG5nICk7IH0NCi0jY29udGVudCAjaW5kZXggI2luc3RhbmNlIC5zdGFydF90aW1lIGR0IHNwYW4geyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2xvY2stc2VsZWN0LnBuZyApOyB9DQotDQotI2NvbnRlbnQgI2luZGV4ICN2ZXJzaW9ucyBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9wcm9wZXJ0eS5wbmcgKTsgfQ0KLSNjb250ZW50ICNpbmRleCAjdmVyc2lvbnMgLnNvbHIgc3BhbiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL3NvbHItaWNvLnBuZyApOyB9DQotI2NvbnRlbnQgI2luZGV4ICN2ZXJzaW9ucyAubHVjZW5lIHNwYW4geyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9sdWNlbmUtaWNvLnBuZyApOyB9DQotDQotI2NvbnRlbnQgI2luZGV4ICNqdm0gaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vamFyLnBuZyApOyB9DQotI2NvbnRlbnQgI2luZGV4ICNqdm0gLmp2bV92ZXJzaW9uIGR0IHNwYW4geyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vamFyLnBuZyApOyB9DQotI2NvbnRlbnQgI2luZGV4ICNqdm0gLnByb2Nlc3NvcnMgZHQgc3BhbiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9wcm9jZXNzb3IucG5nICk7IH0NCi0jY29udGVudCAjaW5kZXggI2p2bSAuY29tbWFuZF9saW5lX2FyZ3MgZHQgc3BhbiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90ZXJtaW5hbC5wbmcgKTsgfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAjc3lzdGVtIGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3N5c3RlbS1tb25pdG9yLnBuZyApOyB9DQotDQotI2NvbnRlbnQgI2luZGV4ICNzeXN0ZW0NCi17DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAjc3lzdGVtIC5yZWxvYWQNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctY2lyY2xlLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgaGVpZ2h0OiAzMHB4Ow0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgcmlnaHQ6IDA7DQotICB0b3A6IDA7DQotICB3aWR0aDogMzBweDsNCi19DQotDQotI2NvbnRlbnQgI2luZGV4ICNzeXN0ZW0gLnJlbG9hZC5sb2FkZXINCi17DQotICBwYWRkaW5nLWxlZnQ6IDA7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAjc3lzdGVtIC5yZWxvYWQgc3Bhbg0KLXsNCi0gIGRpc3BsYXk6IG5vbmU7DQotfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAjc3lzdGVtIC5jb250ZW50IHANCi17DQotICBtYXJnaW4tdG9wOiAxMHB4Ow0KLSAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjaW5kZXggI3N5c3RlbSAuY29udGVudCAubm8taW5mbw0KLXsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLSAgZGlzcGxheTogbm9uZTsNCi0gIGZvbnQtc3R5bGU6IGl0YWxpYzsNCi19DQotDQotI2NvbnRlbnQgI2luZGV4ICNqdm0tbWVtb3J5IGgyIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL21lbW9yeS5wbmcgKTsgfQ0KLQ0KLSNjb250ZW50ICNpbmRleCAjanZtLW1lbW9yeS1iYXINCi17DQotICBtYXJnaW4tdG9wOiAyMHB4Ow0KLX0NCisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKKyNjb250ZW50ICNpbmRleCAuYmFyLWRlc2MKK3sKKyAgY29sb3I6ICNjMGMwYzA7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIG1hcmdpbi1sZWZ0OiAxMHB4OworICB3aGl0ZS1zcGFjZTogcHJlOworfQorCisjY29udGVudCAjaW5kZXggLmJhci1ob2xkZXIKK3sKKyAgYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7CisgIC1tb3otYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7CisgIC13ZWJraXQtYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7CisgIGhlaWdodDogMzVweDsKK30KKworI2NvbnRlbnQgI2luZGV4IC5iYXItaG9sZGVyIC5iYXIKK3sKKyAgaGVpZ2h0OiAxMDAlOworICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKyNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlciBkaXYgLnZhbAoreworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZjAwOworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZy1yaWdodDogNXB4OworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAwOworICB0b3A6IDM1cHg7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKyNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlciAuYmFyLW1heC5iYXIKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKK30KKworI2NvbnRlbnQgI2luZGV4IC5iYXItaG9sZGVyIC5iYXItbWF4LnZhbAoreworICBib3JkZXItY29sb3I6ICNmMGYwZjA7CisgIGNvbG9yOiAjZDZkNmQ2OworfQorCisjY29udGVudCAjaW5kZXggLmJhci1ob2xkZXIgLmJhci10b3RhbC5iYXIKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2MwYzBjMDsKK30KKworI2NvbnRlbnQgI2luZGV4IC5iYXItaG9sZGVyIC5iYXItdG90YWwudmFsCit7CisgIGJvcmRlci1jb2xvcjogI2MwYzBjMDsKKyAgY29sb3I6ICNjMGMwYzA7Cit9CisKKyNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlciAuYmFyLXVzZWQuYmFyCit7CisgIGJhY2tncm91bmQtY29sb3I6ICM5Njk2OTY7Cit9CisKKyNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlciAuYmFyLXVzZWQudmFsCit7CisgIGJvcmRlci1jb2xvcjogIzk2OTY5NjsKKyAgY29sb3I6ICM5Njk2OTY7Cit9CisKKyNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlci5iYXItbHZsLTIgLmJhci1tYXgudmFsIHsgcGFkZGluZy10b3A6IDI1cHg7IH0KKyNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlci5iYXItbHZsLTIgLmJhci10b3RhbC52YWwgeyBwYWRkaW5nLXRvcDogNXB4OyB9CisjY29udGVudCAjaW5kZXggLmJhci1ob2xkZXIuYmFyLWx2bC0yIHsgbWFyZ2luLWJvdHRvbTogNDVweDsgfQorCisjY29udGVudCAjaW5kZXggLmJhci1ob2xkZXIuYmFyLWx2bC0zIC5iYXItbWF4LnZhbCB7IHBhZGRpbmctdG9wOiA0NXB4OyB9CisjY29udGVudCAjaW5kZXggLmJhci1ob2xkZXIuYmFyLWx2bC0zIC5iYXItdG90YWwudmFsIHsgcGFkZGluZy10b3A6IDI1cHg7IH0KKyNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlci5iYXItbHZsLTMgLmJhci11c2VkLnZhbCB7IHBhZGRpbmctdG9wOiA1cHg7IH0KKyNjb250ZW50ICNpbmRleCAuYmFyLWhvbGRlci5iYXItbHZsLTMgeyBtYXJnaW4tYm90dG9tOiA2NXB4OyB9CisKKyNjb250ZW50ICNpbmRleCAubG9hZGVyCit7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNpbmRleCAuaW5kZXgtbGVmdAoreworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDU1JTsKK30KKworI2NvbnRlbnQgI2luZGV4IC5pbmRleC1yaWdodAoreworICBmbG9hdDogcmlnaHQ7CisgIHdpZHRoOiA0MCU7Cit9CisKKyNjb250ZW50ICNpbmRleCAuZGF0YQoreworICBwYWRkaW5nLWJvdHRvbTogMTJweDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKK30KKworI2NvbnRlbnQgI2luZGV4IC5kYXRhOmhvdmVyCit7CisgIG92ZXJmbG93LXg6IGF1dG87Cit9CisKKyNjb250ZW50ICNpbmRleCAuZGF0YSBsaQoreworICBwYWRkaW5nLXRvcDogM3B4OworICBwYWRkaW5nLWJvdHRvbTogM3B4OworfQorCisjY29udGVudCAjaW5kZXggLmRhdGEgbGkgZHQKK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgIHdpZHRoOiAyMCU7Cit9CisKKyNjb250ZW50ICNpbmRleCAuZGF0YSBsaSBkZAoreworICBmbG9hdDogcmlnaHQ7CisgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICB3aGl0ZS1zcGFjZTogbm93cmFwOworICB3aWR0aDogODAlCit9CisKKyNjb250ZW50ICNpbmRleCAuZGF0YSBsaSBkZC5vZGQKK3sKKyAgY29sb3I6ICM5OTk7Cit9CisKKyNjb250ZW50ICNpbmRleCAuZGF0YSBkdCBzcGFuCit7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDFweCA1MCU7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nLWxlZnQ6IDIycHg7Cit9CisKKyNjb250ZW50ICNpbmRleCAjaW5zdGFuY2UgaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc2VydmVyLnBuZyApOyB9CisjY29udGVudCAjaW5kZXggI2luc3RhbmNlIC5zdGFydF90aW1lIGR0IHNwYW4geyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2xvY2stc2VsZWN0LnBuZyApOyB9CisKKyNjb250ZW50ICNpbmRleCAjdmVyc2lvbnMgaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcHJvcGVydHkucG5nICk7IH0KKyNjb250ZW50ICNpbmRleCAjdmVyc2lvbnMgLnNvbHIgc3BhbiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL3NvbHItaWNvLnBuZyApOyB9CisjY29udGVudCAjaW5kZXggI3ZlcnNpb25zIC5sdWNlbmUgc3BhbiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2x1Y2VuZS1pY28ucG5nICk7IH0KKworI2NvbnRlbnQgI2luZGV4ICNqdm0gaDIgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vamFyLnBuZyApOyB9CisjY29udGVudCAjaW5kZXggI2p2bSAuanZtX3ZlcnNpb24gZHQgc3BhbiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9qYXIucG5nICk7IH0KKyNjb250ZW50ICNpbmRleCAjanZtIC5wcm9jZXNzb3JzIGR0IHNwYW4geyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcHJvY2Vzc29yLnBuZyApOyB9CisjY29udGVudCAjaW5kZXggI2p2bSAuY29tbWFuZF9saW5lX2FyZ3MgZHQgc3BhbiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90ZXJtaW5hbC5wbmcgKTsgfQorCisjY29udGVudCAjaW5kZXggI3N5c3RlbSBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9zeXN0ZW0tbW9uaXRvci5wbmcgKTsgfQorCisjY29udGVudCAjaW5kZXggI3N5c3RlbQoreworICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKyNjb250ZW50ICNpbmRleCAjc3lzdGVtIC5yZWxvYWQKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Fycm93LWNpcmNsZS5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTsKKyAgZGlzcGxheTogYmxvY2s7CisgIGhlaWdodDogMzBweDsKKyAgcG9zaXRpb246IGFic29sdXRlOworICByaWdodDogMDsKKyAgdG9wOiAwOworICB3aWR0aDogMzBweDsKK30KKworI2NvbnRlbnQgI2luZGV4ICNzeXN0ZW0gLnJlbG9hZC5sb2FkZXIKK3sKKyAgcGFkZGluZy1sZWZ0OiAwOworfQorCisjY29udGVudCAjaW5kZXggI3N5c3RlbSAucmVsb2FkIHNwYW4KK3sKKyAgZGlzcGxheTogbm9uZTsKK30KKworI2NvbnRlbnQgI2luZGV4ICNzeXN0ZW0gLmNvbnRlbnQgcAoreworICBtYXJnaW4tdG9wOiAxMHB4OworICBtYXJnaW4tYm90dG9tOiA1cHg7Cit9CisKKyNjb250ZW50ICNpbmRleCAjc3lzdGVtIC5jb250ZW50IC5uby1pbmZvCit7CisgIGNvbG9yOiAjYzBjMGMwOworICBkaXNwbGF5OiBub25lOworICBmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKKyNjb250ZW50ICNpbmRleCAjanZtLW1lbW9yeSBoMiB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9tZW1vcnkucG5nICk7IH0KKworI2NvbnRlbnQgI2luZGV4ICNqdm0tbWVtb3J5LWJhcgoreworICBtYXJnaW4tdG9wOiAyMHB4OworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2xvZ2dpbmcuY3NzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL2xvZ2dpbmcuY3NzCmluZGV4IDk4ZjY2NGUuLmFmN2VjNDQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9sb2dnaW5nLmNzcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvbG9nZ2luZy5jc3MKQEAgLTEsMzc2ICsxLDM3NiBAQAotLyoNCi0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSovDQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmxvYWRlcg0KLXsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAuYmxvY2sgaDINCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZG9jdW1lbnQtdGV4dC5wbmcgKTsNCi0gIG1hcmdpbi1ib3R0b206IDEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nIC5ibG9jayBoMiBzcGFuIHNwYW4NCi17DQotICBjb2xvcjogI2MwYzBjMDsNCi0gIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICBtYXJnaW4tbGVmdDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlcg0KLXsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0aW1lDQotew0KLSAgd2hpdGUtc3BhY2U6IHByZTsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciAjZm9vdGVyDQotew0KLSAgbWFyZ2luLXRvcDogMjBweDsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciAjc3RhdGUNCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgY29sb3I6ICNjMGMwYzA7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotICB3aWR0aDogNDUlOw0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAjdmlld2VyICNkYXRlLWZvcm1hdA0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciAjZGF0ZS1mb3JtYXQgYQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1jaGVjay1ib3gtdW5jaGVjay5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgY29sb3I6ICNjMGMwYzA7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHBhZGRpbmctbGVmdDogMjFweDsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciAjZGF0ZS1mb3JtYXQgYTpob3Zlcg0KLXsNCi0gIGNvbG9yOiAjMDA4Ow0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAjdmlld2VyICNkYXRlLWZvcm1hdCBhLm9uDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3VpLWNoZWNrLWJveC5wbmcgKTsNCi0gIGNvbG9yOiAjMzMzOw0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRhYmxlDQotew0KLSAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsNCi0gIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRoLA0KLSNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGQgYSwNCi0jY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRib2R5IC50cmFjZSB0ZA0KLXsNCi0gIHBhZGRpbmc6IDNweCAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRkDQotew0KLSAgdmVydGljYWwtYWxpZ246IHRvcDsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0ZCBhDQotew0KLSAgZGlzcGxheTogYmxvY2s7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGhlYWQgdGgNCi17DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIHRleHQtYWxpZ246IGxlZnQ7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGJvZHkgdGQsDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Zm9vdCB0ZA0KLXsNCi0gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjBmMGYwOw0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRoZWFkIHRoLm1lc3NhZ2UNCi17DQotICB3aWR0aDoxMDAlOw0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRib2R5IHRkLnNwYW4gYQ0KLXsNCi0gIHBhZGRpbmctbGVmdDogMDsNCi0gIHBhZGRpbmctcmlnaHQ6IDA7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGJvZHkgc3Bhbg0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KLSAgcGFkZGluZy1yaWdodDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSAubGV2ZWwtaW5mbyAubGV2ZWwgc3BhbiB7IGJhY2tncm91bmQtY29sb3I6ICNlYmY1ZWI7IH0NCi0jY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRib2R5IC5sZXZlbC13YXJuaW5nICAgICBzcGFuIHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRDkzMDsgfQ0KLSNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGJvZHkgLmxldmVsLXNldmVyZSAgICAgc3BhbiAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQzYzM1OyBjb2xvcjogI2ZmZjsgfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGJvZHkgLmxldmVsLWRlYnVnICBzcGFuICB7IGJhY2tncm91bmQtY29sb3I6ICNlYmY1ZWI7IH0NCi0jY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRib2R5IC5sZXZlbC13YXJuICAgc3BhbiAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZEOTMwOyB9DQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSAubGV2ZWwtZXJyb3IgIHNwYW4gIHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGNjEzMDsgfQ0KLSNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGJvZHkgLmxldmVsLWZhdGFsICBzcGFuICB7IGJhY2tncm91bmQtY29sb3I6ICNjNDNjMzU7IH0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRib2R5IC5oYXMtdHJhY2UgYQ0KLXsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSAuaGFzLXRyYWNlIGE6aG92ZXINCi17DQotICBjb2xvcjogIzAwODsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSAuaGFzLXRyYWNlIC5tZXNzYWdlIGENCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaW5mb3JtYXRpb24ucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMDAlIDUwJTsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgcGFkZGluZy1yaWdodDogMjFweDsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSAuaGFzLXRyYWNlLm9wZW4gLm1lc3NhZ2UgYQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9pbmZvcm1hdGlvbi13aGl0ZS5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSAudHJhY2UgdGQNCi17DQotICBib3JkZXItdG9wOiAwOw0KLSAgY29sb3I6ICNjMGMwYzA7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgLmhhcy1kYXRhIHRmb290DQotew0KLSAgZGlzcGxheTogbm9uZTsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Zm9vdCB0ZA0KLXsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlID4gbGkNCi17DQotICBtYXJnaW4tbGVmdDogMDsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSBsaQ0KLXsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAubGV2ZWwtZmluZXN0ICB7IGJhY2tncm91bmQtY29sb3I6ICNkNWU1ZmM7IH0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5sZXZlbC1maW5lICAgIHsgYmFja2dyb3VuZC1jb2xvcjogI2Q1ZmFmYzsgfQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLmxldmVsLWNvbmZpZyAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZmZGVkOyB9DQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAubGV2ZWwtaW5mbyAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmYWZjZDc7IH0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5sZXZlbC13YXJuaW5nIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZWNkNTsgfQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLmxldmVsLXNldmVyZSAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNkY2RhOyB9DQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAubGV2ZWwtb2ZmICAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7IH0NCi0NCi0vKiBMb2c0aiAqLw0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLmxldmVsLWFsbCAgICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjOUVEQUZGOyB9DQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAubGV2ZWwtdHJhY2UgICB7IGJhY2tncm91bmQtY29sb3I6ICNkNWU1ZmM7IH0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5sZXZlbC1kZWJ1ZyAgIHsgYmFja2dyb3VuZC1jb2xvcjogI2Q1ZmFmYzsgfQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLmxldmVsLXdhcm4gICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZmZGVkOyB9DQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAubGV2ZWwtZXJyb3IgICB7IGJhY2tncm91bmQtY29sb3I6ICNmY2VjZDU7IH0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5sZXZlbC1mYXRhbCAgIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZGNkYTsgfQ0KLQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgYQ0KLXsNCi0gIGhlaWdodDogMTdweDsNCi0gIGxpbmUtaGVpZ2h0OiAxN3B4Ow0KLSAgcGFkZGluZzogMDsNCi0gIHdpZHRoOiA5MCU7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgYTpob3Zlcg0KLXsNCi0gIGNvbG9yOiAjMDA4Ow0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIGEgc3Bhbi5ucw0KLXsNCi0gIGRpc3BsYXk6IG5vbmU7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nLm5zIC5qc3RyZWUgYSBzcGFuLm5zDQotew0KLSAgZGlzcGxheTogaW5saW5lOw0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIGEgc3Bhbi5uYW1lDQotew0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSA1MCU7DQotICBjdXJzb3I6IHBvaW50ZXI7DQotICBwYWRkaW5nLXJpZ2h0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIGEgc3Bhbi5uYW1lIGVtDQotew0KLSAgY29sb3I6ICNmMDA7DQotICBmb250LXN0eWxlOiBub3JtYWw7DQotICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOw0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIGEudHJpZ2dlci5zZXQNCi17DQotICBmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSBhOmhvdmVyIHNwYW4ubmFtZQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9wZW5jaWwtc21hbGwucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLnNlbGVjdG9yLWhvbGRlcg0KLXsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHRvcDogLTJweDsNCi0gIHotaW5kZXg6IDcwMDsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAuc2VsZWN0b3ItaG9sZGVyLm9wZW4NCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KLSAgbWFyZ2luLWxlZnQ6IC0xOXB4Ow0KLSAgei1pbmRleDogODAwOw0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIGxpIC5zZWxlY3Rvci1ob2xkZXIgeyBsZWZ0OiA0NDBweDsgfQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgbGkgbGkgLnNlbGVjdG9yLWhvbGRlciB7IGxlZnQ6IDQyMnB4OyB9DQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSBsaSBsaSBsaSAuc2VsZWN0b3ItaG9sZGVyIHsgbGVmdDogNDA0cHg7IH0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIGxpIGxpIGxpIGxpIC5zZWxlY3Rvci1ob2xkZXIgeyBsZWZ0OiAzODZweDsgfQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgbGkgbGkgbGkgbGkgbGkgLnNlbGVjdG9yLWhvbGRlciB7IGxlZnQ6IDM2OHB4OyB9DQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSBsaSBsaSBsaSBsaSBsaSBsaSAuc2VsZWN0b3ItaG9sZGVyIHsgbGVmdDogMzUwcHg7IH0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIGxpIGxpIGxpIGxpIGxpIGxpIGxpIC5zZWxlY3Rvci1ob2xkZXIgeyBsZWZ0OiAzMzJweDsgfQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgbGkgbGkgbGkgbGkgbGkgbGkgbGkgbGkgLnNlbGVjdG9yLWhvbGRlciB7IGxlZnQ6IDMxNHB4OyB9DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAuc2VsZWN0b3INCi17DQotICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAub3BlbiAuc2VsZWN0b3INCi17DQotICBib3JkZXItY29sb3I6ICNmMGYwZjA7DQotICBib3gtc2hhZG93OiA1cHggNXB4IDEwcHggI2MwYzBjMDsNCi0gIC1tb3otYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7DQotICAtd2Via2l0LWJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOw0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5zZWxlY3RvciBhDQotew0KLSAgZGlzcGxheTogYmxvY2s7DQotICBwYWRkaW5nOiAycHg7DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAub3BlbiAuc2VsZWN0b3IgLmNsb3NlDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLTAucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1MCUgNTAlOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICByaWdodDogLTI1cHg7DQotICB0b3A6IDA7DQotICB3aWR0aDogMjBweDsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAub3BlbiAuc2VsZWN0b3IgLmNsb3NlOmhvdmVyDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLTEucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLm9wZW4gLnNlbGVjdG9yIC5jbG9zZSBzcGFuDQotew0KLSAgZGlzcGxheTogbm9uZTsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAub3BlbiAuc2VsZWN0b3IgYS50cmlnZ2VyDQotew0KLSAgZGlzcGxheTogbm9uZTsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAub3BlbiAuc2VsZWN0b3IgdWwNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAuc2VsZWN0b3IgdWwgbGkNCi17DQotICBiYWNrZ3JvdW5kOiBub25lOw0KLSAgbWFyZ2luLWxlZnQ6IDA7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLnNlbGVjdG9yIHVsIGxpIGENCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdWktcmFkaW8tYnV0dG9uLXVuY2hlY2sucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggNTAlOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5zZWxlY3RvciB1bCBsaSBhLmxldmVsDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsNCi19DQotDQotI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAuc2VsZWN0b3IgdWwgbGkgYTpob3Zlcg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1yYWRpby1idXR0b24ucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLnNlbGVjdG9yIGxpLnVuc2V0DQotew0KLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmMGYwZjA7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLnNlbGVjdG9yIGxpLnVuc2V0IGENCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MtMC5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDRweCA1MCU7DQotfQ0KLQ0KLSNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLnNlbGVjdG9yIGxpLnVuc2V0IGE6aG92ZXINCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MtMS5wbmcgKTsNCi0gIGNvbG9yOiAjODAwOw0KLX0NCisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKKyNjb250ZW50ICNsb2dnaW5nIC5sb2FkZXIKK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIHBhZGRpbmctbGVmdDogMjFweDsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgLmJsb2NrIGgyCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9kb2N1bWVudC10ZXh0LnBuZyApOworICBtYXJnaW4tYm90dG9tOiAxMHB4OworfQorCisjY29udGVudCAjbG9nZ2luZyAuYmxvY2sgaDIgc3BhbiBzcGFuCit7CisgIGNvbG9yOiAjYzBjMGMwOworICBmb250LXdlaWdodDogbm9ybWFsOworICBtYXJnaW4tbGVmdDogMTBweDsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlcgoreworICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGltZQoreworICB3aGl0ZS1zcGFjZTogcHJlOworfQorCisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyICNmb290ZXIKK3sKKyAgbWFyZ2luLXRvcDogMjBweDsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciAjc3RhdGUKK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIGZsb2F0OiBsZWZ0OworICBjb2xvcjogI2MwYzBjMDsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworICB3aWR0aDogNDUlOworfQorCisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyICNkYXRlLWZvcm1hdAoreworICBmbG9hdDogcmlnaHQ7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgI2RhdGUtZm9ybWF0IGEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3VpLWNoZWNrLWJveC11bmNoZWNrLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgY29sb3I6ICNjMGMwYzA7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgI2RhdGUtZm9ybWF0IGE6aG92ZXIKK3sKKyAgY29sb3I6ICMwMDg7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgI2RhdGUtZm9ybWF0IGEub24KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3VpLWNoZWNrLWJveC5wbmcgKTsKKyAgY29sb3I6ICMzMzM7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGFibGUKK3sKKyAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGgsCisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRkIGEsCisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRib2R5IC50cmFjZSB0ZAoreworICBwYWRkaW5nOiAzcHggMTBweDsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0ZAoreworICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRkIGEKK3sKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGhlYWQgdGgKK3sKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIHRleHQtYWxpZ246IGxlZnQ7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGJvZHkgdGQsCisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRmb290IHRkCit7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjBmMGYwOworfQorCisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRoZWFkIHRoLm1lc3NhZ2UKK3sKKyAgd2lkdGg6MTAwJTsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSB0ZC5zcGFuIGEKK3sKKyAgcGFkZGluZy1sZWZ0OiAwOworICBwYWRkaW5nLXJpZ2h0OiAwOworfQorCisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRib2R5IHNwYW4KK3sKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmctbGVmdDogMTBweDsKKyAgcGFkZGluZy1yaWdodDogMTBweDsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSAubGV2ZWwtaW5mbyAubGV2ZWwgc3BhbiB7IGJhY2tncm91bmQtY29sb3I6ICNlYmY1ZWI7IH0KKyNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGJvZHkgLmxldmVsLXdhcm5pbmcgICAgIHNwYW4geyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZEOTMwOyB9CisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRib2R5IC5sZXZlbC1zZXZlcmUgICAgIHNwYW4gIHsgYmFja2dyb3VuZC1jb2xvcjogI2M0M2MzNTsgY29sb3I6ICNmZmY7IH0KKworI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSAubGV2ZWwtZGVidWcgIHNwYW4gIHsgYmFja2dyb3VuZC1jb2xvcjogI2ViZjVlYjsgfQorI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSAubGV2ZWwtd2FybiAgIHNwYW4gIHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRDkzMDsgfQorI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSAubGV2ZWwtZXJyb3IgIHNwYW4gIHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGNjEzMDsgfQorI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSAubGV2ZWwtZmF0YWwgIHNwYW4gIHsgYmFja2dyb3VuZC1jb2xvcjogI2M0M2MzNTsgfQorCisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRib2R5IC5oYXMtdHJhY2UgYQoreworICBjdXJzb3I6IHBvaW50ZXI7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGJvZHkgLmhhcy10cmFjZSBhOmhvdmVyCit7CisgIGNvbG9yOiAjMDA4OworfQorCisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRib2R5IC5oYXMtdHJhY2UgLm1lc3NhZ2UgYQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaW5mb3JtYXRpb24ucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgNTAlOworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZy1yaWdodDogMjFweDsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgI3ZpZXdlciB0Ym9keSAuaGFzLXRyYWNlLm9wZW4gLm1lc3NhZ2UgYQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaW5mb3JtYXRpb24td2hpdGUucG5nICk7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nICN2aWV3ZXIgdGJvZHkgLnRyYWNlIHRkCit7CisgIGJvcmRlci10b3A6IDA7CisgIGNvbG9yOiAjYzBjMGMwOworfQorCisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyIC5oYXMtZGF0YSB0Zm9vdAoreworICBkaXNwbGF5OiBub25lOworfQorCisjY29udGVudCAjbG9nZ2luZyAjdmlld2VyIHRmb290IHRkCit7CisgIGNvbG9yOiAjYzBjMGMwOworfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlID4gbGkKK3sKKyAgbWFyZ2luLWxlZnQ6IDA7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgbGkKK3sKKyAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5sZXZlbC1maW5lc3QgIHsgYmFja2dyb3VuZC1jb2xvcjogI2Q1ZTVmYzsgfQorI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAubGV2ZWwtZmluZSAgICB7IGJhY2tncm91bmQtY29sb3I6ICNkNWZhZmM7IH0KKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLmxldmVsLWNvbmZpZyAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTZmZGVkOyB9CisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5sZXZlbC1pbmZvICAgIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmNkNzsgfQorI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAubGV2ZWwtd2FybmluZyB7IGJhY2tncm91bmQtY29sb3I6ICNmY2VjZDU7IH0KKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLmxldmVsLXNldmVyZSAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNkY2RhOyB9CisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5sZXZlbC1vZmYgICAgIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsgfQorCisvKiBMb2c0aiAqLworI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAubGV2ZWwtYWxsICAgICB7IGJhY2tncm91bmQtY29sb3I6ICM5RURBRkY7IH0KKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLmxldmVsLXRyYWNlICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZDVlNWZjOyB9CisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5sZXZlbC1kZWJ1ZyAgIHsgYmFja2dyb3VuZC1jb2xvcjogI2Q1ZmFmYzsgfQorI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAubGV2ZWwtd2FybiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNlNmZkZWQ7IH0KKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLmxldmVsLWVycm9yICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNlY2Q1OyB9CisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5sZXZlbC1mYXRhbCAgIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZGNkYTsgfQorCisKKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgYQoreworICBoZWlnaHQ6IDE3cHg7CisgIGxpbmUtaGVpZ2h0OiAxN3B4OworICBwYWRkaW5nOiAwOworICB3aWR0aDogOTAlOworfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIGE6aG92ZXIKK3sKKyAgY29sb3I6ICMwMDg7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgYSBzcGFuLm5zCit7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nLm5zIC5qc3RyZWUgYSBzcGFuLm5zCit7CisgIGRpc3BsYXk6IGlubGluZTsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSBhIHNwYW4ubmFtZQoreworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMDAlIDUwJTsKKyAgY3Vyc29yOiBwb2ludGVyOworICBwYWRkaW5nLXJpZ2h0OiAyMXB4OworfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIGEgc3Bhbi5uYW1lIGVtCit7CisgIGNvbG9yOiAjZjAwOworICBmb250LXN0eWxlOiBub3JtYWw7CisgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgYS50cmlnZ2VyLnNldAoreworICBmb250LXdlaWdodDogYm9sZDsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSBhOmhvdmVyIHNwYW4ubmFtZQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcGVuY2lsLXNtYWxsLnBuZyApOworfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5zZWxlY3Rvci1ob2xkZXIKK3sKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IC0ycHg7CisgIHotaW5kZXg6IDcwMDsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAuc2VsZWN0b3ItaG9sZGVyLm9wZW4KK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKKyAgbWFyZ2luLWxlZnQ6IC0xOXB4OworICB6LWluZGV4OiA4MDA7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgbGkgLnNlbGVjdG9yLWhvbGRlciB7IGxlZnQ6IDQ0MHB4OyB9CisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIGxpIGxpIC5zZWxlY3Rvci1ob2xkZXIgeyBsZWZ0OiA0MjJweDsgfQorI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSBsaSBsaSBsaSAuc2VsZWN0b3ItaG9sZGVyIHsgbGVmdDogNDA0cHg7IH0KKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgbGkgbGkgbGkgbGkgLnNlbGVjdG9yLWhvbGRlciB7IGxlZnQ6IDM4NnB4OyB9CisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIGxpIGxpIGxpIGxpIGxpIC5zZWxlY3Rvci1ob2xkZXIgeyBsZWZ0OiAzNjhweDsgfQorI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSBsaSBsaSBsaSBsaSBsaSBsaSAuc2VsZWN0b3ItaG9sZGVyIHsgbGVmdDogMzUwcHg7IH0KKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgbGkgbGkgbGkgbGkgbGkgbGkgbGkgLnNlbGVjdG9yLWhvbGRlciB7IGxlZnQ6IDMzMnB4OyB9CisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIGxpIGxpIGxpIGxpIGxpIGxpIGxpIGxpIC5zZWxlY3Rvci1ob2xkZXIgeyBsZWZ0OiAzMTRweDsgfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5zZWxlY3RvcgoreworICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5vcGVuIC5zZWxlY3RvcgoreworICBib3JkZXItY29sb3I6ICNmMGYwZjA7CisgIGJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOworICAtbW96LWJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOworICAtd2Via2l0LWJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOworfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5zZWxlY3RvciBhCit7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nOiAycHg7CisgIHdpZHRoOiBhdXRvOworfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5vcGVuIC5zZWxlY3RvciAuY2xvc2UKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLTAucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDUwJSA1MCU7CisgIGRpc3BsYXk6IGJsb2NrOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAtMjVweDsKKyAgdG9wOiAwOworICB3aWR0aDogMjBweDsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAub3BlbiAuc2VsZWN0b3IgLmNsb3NlOmhvdmVyCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy0xLnBuZyApOworfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5vcGVuIC5zZWxlY3RvciAuY2xvc2Ugc3BhbgoreworICBkaXNwbGF5OiBub25lOworfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5vcGVuIC5zZWxlY3RvciBhLnRyaWdnZXIKK3sKKyAgZGlzcGxheTogbm9uZTsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAub3BlbiAuc2VsZWN0b3IgdWwKK3sKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLnNlbGVjdG9yIHVsIGxpCit7CisgIGJhY2tncm91bmQ6IG5vbmU7CisgIG1hcmdpbi1sZWZ0OiAwOworfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5zZWxlY3RvciB1bCBsaSBhCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1yYWRpby1idXR0b24tdW5jaGVjay5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMnB4IDUwJTsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjbG9nZ2luZyAuanN0cmVlIC5zZWxlY3RvciB1bCBsaSBhLmxldmVsCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLnNlbGVjdG9yIHVsIGxpIGE6aG92ZXIKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3VpLXJhZGlvLWJ1dHRvbi5wbmcgKTsKK30KKworI2NvbnRlbnQgI2xvZ2dpbmcgLmpzdHJlZSAuc2VsZWN0b3IgbGkudW5zZXQKK3sKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmMGYwZjA7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLnNlbGVjdG9yIGxpLnVuc2V0IGEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLTAucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDRweCA1MCU7Cit9CisKKyNjb250ZW50ICNsb2dnaW5nIC5qc3RyZWUgLnNlbGVjdG9yIGxpLnVuc2V0IGE6aG92ZXIKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLTEucG5nICk7CisgIGNvbG9yOiAjODAwOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL21lbnUuY3NzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL21lbnUuY3NzCmluZGV4IGJhZDY3ZTQuLjBlNzNhNTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9tZW51LmNzcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvbWVudS5jc3MKQEAgLTEsMzI4ICsxLDMyOCBAQAotLyoNCi0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSovDQotDQotI21lbnUtd3JhcHBlcg0KLXsNCi0gIHBvc2l0aW9uOiBmaXhlZDsNCi0gIHRvcDogMTIwcHg7DQotICB3aWR0aDogMTUwcHg7DQotfQ0KLQ0KLS5zY3JvbGwgI21lbnUtd3JhcHBlcg0KLXsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHRvcDogOTBweDsNCi19DQotDQotLmhhcy1lbnZpcm9ubWVudCAjbWVudS13cmFwcGVyDQotew0KLSAgdG9wOiAxNjBweDsNCi19DQotDQotI21lbnUtd3JhcHBlciBhDQotew0KLSAgZGlzcGxheTogYmxvY2s7DQotICBwYWRkaW5nOiA0cHggMnB4Ow0KLSAgb3ZlcmZsb3c6IGhpZGRlbjsNCi0gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOw0KLX0NCi0NCi0jY29yZS1zZWxlY3RvciwjY29sbGVjdGlvbi1zZWxlY3Rvcg0KLXsNCi0gIG1hcmdpbi10b3A6IDIwcHg7DQotICBwYWRkaW5nLXJpZ2h0OiAxMHB4Ow0KLX0NCi0NCi0jY29yZS1zZWxlY3RvciBhLA0KLSNjb2xsZWN0aW9uLXNlbGVjdG9yIGENCi17DQotICBwYWRkaW5nOiAwOw0KLSAgcGFkZGluZy1sZWZ0OiA4cHg7DQotfQ0KLQ0KLSNjb3JlLXNlbGVjdG9yIHNlbGVjdCwNCi0jY29sbGVjdGlvbi1zZWxlY3RvciBzZWxlY3QNCi17DQotICB3aWR0aDogMTAwJTsNCi19DQotDQotI2NvcmUtc2VsZWN0b3IgI2hhcy1uby1jb3JlcyBhLA0KLSNjb2xsZWN0aW9uLXNlbGVjdG9yICNoYXMtbm8tY29sbGVjdGlvbnMgYQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9kYXRhYmFzZS0tcGx1cy5wbmcgKTsNCi19DQotDQotI2NvcmUtc2VsZWN0b3IgI2hhcy1uby1jb3JlcyBzcGFuLA0KLSNjb2xsZWN0aW9uLXNlbGVjdG9yICNoYXMtbm8tY29sbGVjdGlvbnMgc3Bhbg0KLXsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLSAgZGlzcGxheTogYmxvY2s7DQotfQ0KLQ0KLSNtZW51LXdyYXBwZXIgLmFjdGl2ZSBwDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTsNCi0gIGJvcmRlci1jb2xvcjogI2MwYzBjMDsNCi19DQotDQotI21lbnUtd3JhcHBlciBwIGEsDQotI21lbnUgYQ0KLXsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDVweCA1MCU7DQotICBwYWRkaW5nLWxlZnQ6IDI2cHg7DQotICBwYWRkaW5nLXRvcDogNXB4Ow0KLSAgcGFkZGluZy1ib3R0b206IDVweDsNCi19DQotDQotI21lbnUtd3JhcHBlciBwIGE6aG92ZXINCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOw0KLX0NCi0NCi0jbWVudS13cmFwcGVyIC5hY3RpdmUgcCBhDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2MwYzBjMDsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0jbWVudSBwLmxvYWRlcg0KLXsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDVweCA1MCU7DQotICBjb2xvcjogI2MwYzBjMDsNCi0gIG1hcmdpbi10b3A6IDVweDsNCi0gIHBhZGRpbmctbGVmdDogMjZweDsNCi19DQotDQotI21lbnUgcCBhIHNtYWxsDQotew0KLSAgY29sb3I6ICNiNWI1YjU7DQotICBmb250LXdlaWdodDogbm9ybWFsOw0KLX0NCi0NCi0jbWVudSBwIGEgc21hbGwgc3Bhbi50eHQNCi17DQotfQ0KLQ0KLSNtZW51IHAgYSBzbWFsbDpob3ZlciBzcGFuLnR4dA0KLXsNCi0gIGRpc3BsYXk6IGlubGluZTsNCi19DQotDQotI21lbnUgLmJ1c3kNCi17DQotICBib3JkZXItcmlnaHQtY29sb3I6ICNmNmY1ZDk7DQotfQ0KLQ0KLSNtZW51IC5idXN5IHAgYQ0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmNmY1ZDk7DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc3RhdHVzLWF3YXkucG5nICk7DQotfQ0KLQ0KLSNtZW51IC5vZmZsaW5lDQotew0KLSAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjZWNjZmNmOw0KLX0NCi0NCi0jbWVudSAub2ZmbGluZSBwIGENCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWNjZmNmOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3N0YXR1cy1idXN5LnBuZyApOw0KLX0NCi0NCi0jbWVudSAub25saW5lDQotew0KLSAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjY2ZlY2QzOw0KLX0NCi0NCi0jbWVudSAub25saW5lIHAgYQ0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNjZmVjZDM7DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc3RhdHVzLnBuZyApOw0KLX0NCi0NCi0jbWVudSAucGluZyBzbWFsbA0KLXsNCi0gIGNvbG9yOiAjMDAwDQotfQ0KLQ0KLSNtZW51IGxpDQotew0KLSAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmMGYwZjA7DQotfQ0KLQ0KLSNtZW51IGxpOmxhc3QtY2hpbGQNCi17DQotICBib3JkZXItYm90dG9tOiAwOw0KLX0NCi0NCi0jbWVudSBsaS5vcHRpb25hbA0KLXsNCi19DQotDQotLnN1Yi1tZW51IHANCi17DQotICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsNCi19DQotDQotLnN1Yi1tZW51IGxpOmZpcnN0LWNoaWxkIHANCi17DQotICBib3JkZXItdG9wOiAwOw0KLX0NCi0NCi0uc3ViLW1lbnUgcCBhDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3N0YXR1cy1vZmZsaW5lLnBuZyApOw0KLX0NCi0NCi0uc3ViLW1lbnUgLmFjdGl2ZSBwIGENCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYm94LnBuZyApOw0KLX0NCi0NCi0uc3ViLW1lbnUgdWwsDQotI21lbnUgdWwNCi17DQotICBwYWRkaW5nLXRvcDogNXB4Ow0KLSAgcGFkZGluZy1ib3R0b206IDEwcHg7DQotfQ0KLQ0KLS5zdWItbWVudSAuYWN0aXZlIHVsLA0KLSNtZW51IC5hY3RpdmUgdWwNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI21lbnUgdWwgbGkNCi17DQotICBib3JkZXItYm90dG9tOiAwOw0KLX0NCi0NCi0jY29yZS1tZW51IHVsIGxpIGEsDQotI2NvbGxlY3Rpb24tbWVudSB1bCBsaSBhLA0KLSNtZW51IHVsIGxpIGENCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA3cHggNTAlOw0KLSAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmMGYwZjA7DQotICBjb2xvcjogI2JiYjsNCi0gIG1hcmdpbi1sZWZ0OiAxNXB4Ow0KLSAgcGFkZGluZy1sZWZ0OiAyNnB4Ow0KLX0NCi0NCi0uc3ViLW1lbnUgdWwgbGk6bGFzdC1jaGlsZCBhLA0KLSNtZW51IHVsIGxpOmxhc3QtY2hpbGQgYQ0KLXsNCi0gIGJvcmRlci1ib3R0b206IDA7DQotfQ0KLQ0KLS5zdWItbWVudSB1bCBsaSBhOmhvdmVyLA0KLSNtZW51IHVsIGxpIGE6aG92ZXINCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOw0KLSAgY29sb3I6ICMzMzM7DQotfQ0KLQ0KLS5zdWItbWVudSB1bCBsaS5hY3RpdmUgYSwNCi0jbWVudSB1bCBsaS5hY3RpdmUgYQ0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7DQotICBib3JkZXItY29sb3I6ICNkMGQwZDA7DQotICBjb2xvcjogIzMzMzsNCi19DQotDQotI21lbnUgI2luZGV4Lmdsb2JhbCBwIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZGFzaGJvYXJkLnBuZyApOyB9DQotDQotI21lbnUgI2xvZ2dpbmcuZ2xvYmFsIHAgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9pbmJveC1kb2N1bWVudC10ZXh0LnBuZyApOyB9DQotI21lbnUgI2xvZ2dpbmcuZ2xvYmFsIC5sZXZlbCBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2dlYXIucG5nICk7IH0NCi0NCi0jbWVudSAjamF2YS1wcm9wZXJ0aWVzLmdsb2JhbCBwIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vamFyLnBuZyApOyB9DQotDQotI21lbnUgI3RocmVhZHMuZ2xvYmFsIHAgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1hY2NvcmRpb24ucG5nICk7IH0NCi0NCi0jbWVudSAjY29sbGVjdGlvbnMuZ2xvYmFsIHAgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9kb2N1bWVudHMtc3RhY2sucG5nICk7IH0NCi0jbWVudSAjY29yZXMuZ2xvYmFsIHAgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9kYXRhYmFzZXMucG5nICk7IH0NCi0NCi0jbWVudSAjY2xvdWQuZ2xvYmFsIHAgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9uZXR3b3JrLWNsb3VkLnBuZyApOyB9DQotI21lbnUgI2Nsb3VkLmdsb2JhbCAudHJlZSBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2ZvbGRlci10cmVlLnBuZyApOyB9DQotI21lbnUgI2Nsb3VkLmdsb2JhbCAuZ3JhcGggYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9tb2xlY3VsZS5wbmcgKTsgfQ0KLSNtZW51ICNjbG91ZC5nbG9iYWwgLnJncmFwaCBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2FzdGVyaXNrLnBuZyApOyB9DQotI21lbnUgI2Nsb3VkLmdsb2JhbCAuZHVtcCBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Rvd25sb2FkLWNsb3VkLnBuZyApOyB9DQotDQotLnN1Yi1tZW51IC5waW5nLmVycm9yIGENCi17DQotICANCi0gIGJhY2tncm91bmQtY29sb3I6ICNmZmNjY2M7DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc3lzdGVtLW1vbml0b3ItLWV4Y2xhbWF0aW9uLnBuZyApOw0KLSAgYm9yZGVyLWNvbG9yOiAjZmZjY2NjOw0KLSAgY3Vyc29yOiBoZWxwOw0KLX0NCi0NCi0uc3ViLW1lbnUgLm92ZXJ2aWV3IGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaG9tZS5wbmcgKTsgfQ0KLS5zdWItbWVudSAucXVlcnkgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9tYWduaWZpZXIucG5nICk7IH0NCi0uc3ViLW1lbnUgLnN0cmVhbSBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL25vZGUucG5nICk7IH0NCi0uc3ViLW1lbnUgLmFuYWx5c2lzIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZnVubmVsLnBuZyApOyB9DQotLnN1Yi1tZW51IC5kb2N1bWVudHMgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9kb2N1bWVudHMtc3RhY2sucG5nICk7IH0NCi0uc3ViLW1lbnUgLmZpbGVzIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZm9sZGVyLnBuZyApOyB9DQotLnN1Yi1tZW51IC5zY2hlbWEgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ib29rLW9wZW4tdGV4dC5wbmcgKTsgfQ0KLS5zdWItbWVudSAucmVwbGljYXRpb24gYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ub2RlLnBuZyApOyB9DQotLnN1Yi1tZW51IC5kaXN0cmlidXRpb24gYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ub2RlLXNlbGVjdC5wbmcgKTsgfQ0KLS5zdWItbWVudSAucGluZyBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3N5c3RlbS1tb25pdG9yLnBuZyApOyB9DQotLnN1Yi1tZW51IC5sb2dnaW5nIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaW5ib3gtZG9jdW1lbnQtdGV4dC5wbmcgKTsgfQ0KLS5zdWItbWVudSAucGx1Z2lucyBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Jsb2NrLnBuZyApOyB9DQotLnN1Yi1tZW51IC5kYXRhaW1wb3J0IGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZG9jdW1lbnQtaW1wb3J0LnBuZyApOyB9DQotLnN1Yi1tZW51IC5zZWdtZW50cyBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NvbnN0cnVjdGlvbi5wbmcgKTsgfQ0KLQ0KLQ0KLSNjb250ZW50ICNuYXZpZ2F0aW9uDQotew0KLSAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2UwZTBlMDsNCi19DQotDQotI2NvbnRlbnQgI25hdmlnYXRpb24gYQ0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgcGFkZGluZzogNHB4IDJweDsNCi19DQotDQotI2NvbnRlbnQgI25hdmlnYXRpb24gLmN1cnJlbnQNCi17DQotICBib3JkZXItY29sb3I6ICNlMGUwZTA7DQotfQ0KLQ0KLSNjb250ZW50ICNuYXZpZ2F0aW9uIGENCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1cHggNTAlOw0KLSAgcGFkZGluZy1sZWZ0OiAyNnB4Ow0KLSAgcGFkZGluZy10b3A6IDVweDsNCi0gIHBhZGRpbmctYm90dG9tOiA1cHg7DQotICBvdmVyZmxvdzogaGlkZGVuOw0KLSAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7DQotICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KLX0NCi0NCi0jY29udGVudCAjbmF2aWdhdGlvbiBhOmhvdmVyDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsNCi19DQotDQotI2NvbnRlbnQgI25hdmlnYXRpb24gLmN1cnJlbnQgYQ0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNlMGUwZTA7DQotICBmb250LXdlaWdodDogYm9sZDsNCi19DQorLyoKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisqLworCisjbWVudS13cmFwcGVyCit7CisgIHBvc2l0aW9uOiBmaXhlZDsKKyAgdG9wOiAxMjBweDsKKyAgd2lkdGg6IDE1MHB4OworfQorCisuc2Nyb2xsICNtZW51LXdyYXBwZXIKK3sKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IDkwcHg7Cit9CisKKy5oYXMtZW52aXJvbm1lbnQgI21lbnUtd3JhcHBlcgoreworICB0b3A6IDE2MHB4OworfQorCisjbWVudS13cmFwcGVyIGEKK3sKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmc6IDRweCAycHg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworfQorCisjY29yZS1zZWxlY3RvciwjY29sbGVjdGlvbi1zZWxlY3RvcgoreworICBtYXJnaW4tdG9wOiAyMHB4OworICBwYWRkaW5nLXJpZ2h0OiAxMHB4OworfQorCisjY29yZS1zZWxlY3RvciBhLAorI2NvbGxlY3Rpb24tc2VsZWN0b3IgYQoreworICBwYWRkaW5nOiAwOworICBwYWRkaW5nLWxlZnQ6IDhweDsKK30KKworI2NvcmUtc2VsZWN0b3Igc2VsZWN0LAorI2NvbGxlY3Rpb24tc2VsZWN0b3Igc2VsZWN0Cit7CisgIHdpZHRoOiAxMDAlOworfQorCisjY29yZS1zZWxlY3RvciAjaGFzLW5vLWNvcmVzIGEsCisjY29sbGVjdGlvbi1zZWxlY3RvciAjaGFzLW5vLWNvbGxlY3Rpb25zIGEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2RhdGFiYXNlLS1wbHVzLnBuZyApOworfQorCisjY29yZS1zZWxlY3RvciAjaGFzLW5vLWNvcmVzIHNwYW4sCisjY29sbGVjdGlvbi1zZWxlY3RvciAjaGFzLW5vLWNvbGxlY3Rpb25zIHNwYW4KK3sKKyAgY29sb3I6ICNjMGMwYzA7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjbWVudS13cmFwcGVyIC5hY3RpdmUgcAoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhOworICBib3JkZXItY29sb3I6ICNjMGMwYzA7Cit9CisKKyNtZW51LXdyYXBwZXIgcCBhLAorI21lbnUgYQoreworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1cHggNTAlOworICBwYWRkaW5nLWxlZnQ6IDI2cHg7CisgIHBhZGRpbmctdG9wOiA1cHg7CisgIHBhZGRpbmctYm90dG9tOiA1cHg7Cit9CisKKyNtZW51LXdyYXBwZXIgcCBhOmhvdmVyCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7Cit9CisKKyNtZW51LXdyYXBwZXIgLmFjdGl2ZSBwIGEKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2MwYzBjMDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKyNtZW51IHAubG9hZGVyCit7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDVweCA1MCU7CisgIGNvbG9yOiAjYzBjMGMwOworICBtYXJnaW4tdG9wOiA1cHg7CisgIHBhZGRpbmctbGVmdDogMjZweDsKK30KKworI21lbnUgcCBhIHNtYWxsCit7CisgIGNvbG9yOiAjYjViNWI1OworICBmb250LXdlaWdodDogbm9ybWFsOworfQorCisjbWVudSBwIGEgc21hbGwgc3Bhbi50eHQKK3sKK30KKworI21lbnUgcCBhIHNtYWxsOmhvdmVyIHNwYW4udHh0Cit7CisgIGRpc3BsYXk6IGlubGluZTsKK30KKworI21lbnUgLmJ1c3kKK3sKKyAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjZjZmNWQ5OworfQorCisjbWVudSAuYnVzeSBwIGEKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjVkOTsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3N0YXR1cy1hd2F5LnBuZyApOworfQorCisjbWVudSAub2ZmbGluZQoreworICBib3JkZXItcmlnaHQtY29sb3I6ICNlY2NmY2Y7Cit9CisKKyNtZW51IC5vZmZsaW5lIHAgYQoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWNjZmNmOworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc3RhdHVzLWJ1c3kucG5nICk7Cit9CisKKyNtZW51IC5vbmxpbmUKK3sKKyAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjY2ZlY2QzOworfQorCisjbWVudSAub25saW5lIHAgYQoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2ZlY2QzOworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc3RhdHVzLnBuZyApOworfQorCisjbWVudSAucGluZyBzbWFsbAoreworICBjb2xvcjogIzAwMAorfQorCisjbWVudSBsaQoreworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YwZjBmMDsKK30KKworI21lbnUgbGk6bGFzdC1jaGlsZAoreworICBib3JkZXItYm90dG9tOiAwOworfQorCisjbWVudSBsaS5vcHRpb25hbAoreworfQorCisuc3ViLW1lbnUgcAoreworICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsKK30KKworLnN1Yi1tZW51IGxpOmZpcnN0LWNoaWxkIHAKK3sKKyAgYm9yZGVyLXRvcDogMDsKK30KKworLnN1Yi1tZW51IHAgYQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc3RhdHVzLW9mZmxpbmUucG5nICk7Cit9CisKKy5zdWItbWVudSAuYWN0aXZlIHAgYQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYm94LnBuZyApOworfQorCisuc3ViLW1lbnUgdWwsCisjbWVudSB1bAoreworICBwYWRkaW5nLXRvcDogNXB4OworICBwYWRkaW5nLWJvdHRvbTogMTBweDsKK30KKworLnN1Yi1tZW51IC5hY3RpdmUgdWwsCisjbWVudSAuYWN0aXZlIHVsCit7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjbWVudSB1bCBsaQoreworICBib3JkZXItYm90dG9tOiAwOworfQorCisjY29yZS1tZW51IHVsIGxpIGEsCisjY29sbGVjdGlvbi1tZW51IHVsIGxpIGEsCisjbWVudSB1bCBsaSBhCit7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDdweCA1MCU7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjBmMGYwOworICBjb2xvcjogI2JiYjsKKyAgbWFyZ2luLWxlZnQ6IDE1cHg7CisgIHBhZGRpbmctbGVmdDogMjZweDsKK30KKworLnN1Yi1tZW51IHVsIGxpOmxhc3QtY2hpbGQgYSwKKyNtZW51IHVsIGxpOmxhc3QtY2hpbGQgYQoreworICBib3JkZXItYm90dG9tOiAwOworfQorCisuc3ViLW1lbnUgdWwgbGkgYTpob3ZlciwKKyNtZW51IHVsIGxpIGE6aG92ZXIKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKKyAgY29sb3I6ICMzMzM7Cit9CisKKy5zdWItbWVudSB1bCBsaS5hY3RpdmUgYSwKKyNtZW51IHVsIGxpLmFjdGl2ZSBhCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7CisgIGJvcmRlci1jb2xvcjogI2QwZDBkMDsKKyAgY29sb3I6ICMzMzM7Cit9CisKKyNtZW51ICNpbmRleC5nbG9iYWwgcCBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Rhc2hib2FyZC5wbmcgKTsgfQorCisjbWVudSAjbG9nZ2luZy5nbG9iYWwgcCBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2luYm94LWRvY3VtZW50LXRleHQucG5nICk7IH0KKyNtZW51ICNsb2dnaW5nLmdsb2JhbCAubGV2ZWwgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9nZWFyLnBuZyApOyB9CisKKyNtZW51ICNqYXZhLXByb3BlcnRpZXMuZ2xvYmFsIHAgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9qYXIucG5nICk7IH0KKworI21lbnUgI3RocmVhZHMuZ2xvYmFsIHAgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1hY2NvcmRpb24ucG5nICk7IH0KKworI21lbnUgI2NvbGxlY3Rpb25zLmdsb2JhbCBwIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZG9jdW1lbnRzLXN0YWNrLnBuZyApOyB9CisjbWVudSAjY29yZXMuZ2xvYmFsIHAgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9kYXRhYmFzZXMucG5nICk7IH0KKworI21lbnUgI2Nsb3VkLmdsb2JhbCBwIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vbmV0d29yay1jbG91ZC5wbmcgKTsgfQorI21lbnUgI2Nsb3VkLmdsb2JhbCAudHJlZSBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2ZvbGRlci10cmVlLnBuZyApOyB9CisjbWVudSAjY2xvdWQuZ2xvYmFsIC5ncmFwaCBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL21vbGVjdWxlLnBuZyApOyB9CisjbWVudSAjY2xvdWQuZ2xvYmFsIC5yZ3JhcGggYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9hc3Rlcmlzay5wbmcgKTsgfQorI21lbnUgI2Nsb3VkLmdsb2JhbCAuZHVtcCBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Rvd25sb2FkLWNsb3VkLnBuZyApOyB9CisKKy5zdWItbWVudSAucGluZy5lcnJvciBhCit7CisgIAorICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZjY2NjOworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vc3lzdGVtLW1vbml0b3ItLWV4Y2xhbWF0aW9uLnBuZyApOworICBib3JkZXItY29sb3I6ICNmZmNjY2M7CisgIGN1cnNvcjogaGVscDsKK30KKworLnN1Yi1tZW51IC5vdmVydmlldyBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2hvbWUucG5nICk7IH0KKy5zdWItbWVudSAucXVlcnkgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9tYWduaWZpZXIucG5nICk7IH0KKy5zdWItbWVudSAuc3RyZWFtIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vbm9kZS5wbmcgKTsgfQorLnN1Yi1tZW51IC5hbmFseXNpcyBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Z1bm5lbC5wbmcgKTsgfQorLnN1Yi1tZW51IC5kb2N1bWVudHMgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9kb2N1bWVudHMtc3RhY2sucG5nICk7IH0KKy5zdWItbWVudSAuZmlsZXMgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9mb2xkZXIucG5nICk7IH0KKy5zdWItbWVudSAuc2NoZW1hIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYm9vay1vcGVuLXRleHQucG5nICk7IH0KKy5zdWItbWVudSAucmVwbGljYXRpb24gYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ub2RlLnBuZyApOyB9Cisuc3ViLW1lbnUgLmRpc3RyaWJ1dGlvbiBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL25vZGUtc2VsZWN0LnBuZyApOyB9Cisuc3ViLW1lbnUgLnBpbmcgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9zeXN0ZW0tbW9uaXRvci5wbmcgKTsgfQorLnN1Yi1tZW51IC5sb2dnaW5nIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaW5ib3gtZG9jdW1lbnQtdGV4dC5wbmcgKTsgfQorLnN1Yi1tZW51IC5wbHVnaW5zIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYmxvY2sucG5nICk7IH0KKy5zdWItbWVudSAuZGF0YWltcG9ydCBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2RvY3VtZW50LWltcG9ydC5wbmcgKTsgfQorLnN1Yi1tZW51IC5zZWdtZW50cyBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NvbnN0cnVjdGlvbi5wbmcgKTsgfQorCisKKyNjb250ZW50ICNuYXZpZ2F0aW9uCit7CisgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlMGUwZTA7Cit9CisKKyNjb250ZW50ICNuYXZpZ2F0aW9uIGEKK3sKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmc6IDRweCAycHg7Cit9CisKKyNjb250ZW50ICNuYXZpZ2F0aW9uIC5jdXJyZW50Cit7CisgIGJvcmRlci1jb2xvcjogI2UwZTBlMDsKK30KKworI2NvbnRlbnQgI25hdmlnYXRpb24gYQoreworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1cHggNTAlOworICBwYWRkaW5nLWxlZnQ6IDI2cHg7CisgIHBhZGRpbmctdG9wOiA1cHg7CisgIHBhZGRpbmctYm90dG9tOiA1cHg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisjY29udGVudCAjbmF2aWdhdGlvbiBhOmhvdmVyCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7Cit9CisKKyNjb250ZW50ICNuYXZpZ2F0aW9uIC5jdXJyZW50IGEKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2UwZTBlMDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvcGx1Z2lucy5jc3MgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvcGx1Z2lucy5jc3MKaW5kZXggMDk0YWYzOS4uMDMxMGUwZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL3BsdWdpbnMuY3NzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9wbHVnaW5zLmNzcwpAQCAtMSwyMTIgKzEsMjEyIEBACi0vKg0KLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotKi8NCi0NCi0jY29udGVudCAjcGx1Z2lucyAjbmF2aWdhdGlvbg0KLXsNCi0gIHdpZHRoOiAyMCU7DQotfQ0KLQ0KLSNjb250ZW50ICNwbHVnaW5zICNuYXZpZ2F0aW9uIC5jYWNoZSBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Rpc2stYmxhY2sucG5nICk7IH0NCi0jY29udGVudCAjcGx1Z2lucyAjbmF2aWdhdGlvbiAuY29yZSBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3dvb2Rlbi1ib3gucG5nICk7IH0NCi0jY29udGVudCAjcGx1Z2lucyAjbmF2aWdhdGlvbiAub3RoZXIgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby96b25lLnBuZyApOyB9DQotI2NvbnRlbnQgI3BsdWdpbnMgI25hdmlnYXRpb24gLmhpZ2hsaWdodGluZyBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2hpZ2hsaWdodGVyLXRleHQucG5nICk7IH0NCi0jY29udGVudCAjcGx1Z2lucyAjbmF2aWdhdGlvbiAudXBkYXRlaGFuZGxlciBheyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctY2lyY2xlLnBuZyApOyB9DQotI2NvbnRlbnQgI3BsdWdpbnMgI25hdmlnYXRpb24gLnF1ZXJ5aGFuZGxlciBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL21hZ25pZmllci5wbmcgKTsgfQ0KLSNjb250ZW50ICNwbHVnaW5zICNuYXZpZ2F0aW9uIC5xdWVyeXBhcnNlciBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2FzdGVyaXNrLnBuZyApOyB9DQotDQotI2NvbnRlbnQgI3BsdWdpbnMgI25hdmlnYXRpb24gLlBMVUdJTkNIQU5HRVMgeyBtYXJnaW4tdG9wOiAyMHB4OyB9DQotI2NvbnRlbnQgI3BsdWdpbnMgI25hdmlnYXRpb24gLlBMVUdJTkNIQU5HRVMgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9leWUucG5nICk7IH0NCi0jY29udGVudCAjcGx1Z2lucyAjbmF2aWdhdGlvbiAuUkVMT0FEIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctY2lyY2xlLnBuZyApOyB9DQotDQotDQotI2NvbnRlbnQgI3BsdWdpbnMgI25hdmlnYXRpb24gYQ0KLXsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi19DQotDQotI2NvbnRlbnQgI3BsdWdpbnMgI25hdmlnYXRpb24gYSBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2JiYTUwMDsNCi0gIGJvcmRlci1yYWRpdXM6IDVweDsNCi0gIGNvbG9yOiAjZmZmOw0KLSAgZm9udC1zaXplOiAxMHB4Ow0KLSAgZm9udC13ZWlnaHQ6IG5vcm1hbDsNCi0gIGxpbmUtaGVpZ2h0OiAxLjRlbTsNCi0gIHBhZGRpbmctbGVmdDogNHB4Ow0KLSAgcGFkZGluZy1yaWdodDogNHB4Ow0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgcmlnaHQ6IDVweDsNCi0gIHRvcDogN3B4Ow0KLX0NCi0NCi0jY29udGVudCAjcGx1Z2lucyAjZnJhbWUNCi17DQotICBmbG9hdDogcmlnaHQ7DQotICB3aWR0aDogNzglOw0KLX0NCi0NCi0jY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5DQotew0KLSAgbWFyZ2luLWJvdHRvbTogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI3BsdWdpbnMgI2ZyYW1lIC5lbnRyeTpsYXN0LWNoaWxkDQotew0KLSAgbWFyZ2luLWJvdHRvbTogMDsNCi19DQotDQotI2NvbnRlbnQgI3BsdWdpbnMgI2ZyYW1lIC5lbnRyeSBhDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoZXZyb24tc21hbGwtZXhwYW5kLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5LmNoYW5nZWQgYSBzcGFuDQotew0KLSAgY29sb3I6ICNiYmE1MDA7DQotfQ0KLQ0KLSNjb250ZW50ICNwbHVnaW5zICNmcmFtZSAuZW50cnkuZXhwYW5kZWQgYQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5LmV4cGFuZGVkIHVsDQotew0KLSAgZGlzcGxheTogYmxvY2s7DQotfQ0KLQ0KLSNjb250ZW50ICNwbHVnaW5zICNmcmFtZSAuZW50cnkgdWwNCi17DQotICBib3JkZXItbGVmdDogOXB4IHNvbGlkICNmMGYzZmY7DQotICBtYXJnaW4tbGVmdDogM3B4Ow0KLSAgcGFkZGluZy10b3A6IDVweDsNCi0gIHBhZGRpbmctbGVmdDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI3BsdWdpbnMgI2ZyYW1lIC5lbnRyeSBsaQ0KLXsNCi0gIHBhZGRpbmctdG9wOiAycHg7DQotICBwYWRkaW5nLWJvdHRvbTogMnB4Ow0KLX0NCi0NCi0jY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5IGxpLnN0YXRzDQotew0KLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjMGMwYzA7DQotICBtYXJnaW4tdG9wOiA1cHg7DQotICBwYWRkaW5nLXRvcDogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5IGxpLm9kZA0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7DQotfQ0KLQ0KLSNjb250ZW50ICNwbHVnaW5zICNmcmFtZSAuZW50cnkgZHQsDQotI2NvbnRlbnQgI3BsdWdpbnMgI2ZyYW1lIC5lbnRyeSAuc3RhdHMgc3Bhbg0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgd2lkdGg6IDExJTsNCi19DQotDQotI2NvbnRlbnQgI3BsdWdpbnMgI2ZyYW1lIC5lbnRyeSBkZCwNCi0jY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5IC5zdGF0cyB1bA0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHdpZHRoOiA4OCU7DQotfQ0KLQ0KLSNjb250ZW50ICNwbHVnaW5zICNmcmFtZSAuZW50cnkgLnN0YXRzIHVsDQotew0KLSAgYm9yZGVyLWxlZnQ6IDA7DQotICBtYXJnaW46IDA7DQotICBwYWRkaW5nOiAwOw0KLX0NCi0NCi0jY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5IC5zdGF0cyBkdA0KLXsNCi0gIHdpZHRoOiAyNyU7DQotfQ0KLQ0KLSNjb250ZW50ICNwbHVnaW5zICNmcmFtZSAuZW50cnkgLnN0YXRzIGRkDQotew0KLSAgd2lkdGg6IDcyJTsNCi19DQotDQotI2NvbnRlbnQgI3BsdWdpbnMgI2ZyYW1lIC5lbnRyeS5leHBhbmRlZCBhLmxpbmtlciB7DQotICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOw0KLSAgZGlzcGxheTogaW5saW5lOw0KLSAgZm9udC13ZWlnaHQ6IG5vcm1hbDsNCi0gIHBhZGRpbmc6MHB4Ow0KLX0NCi0NCi0jY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5LmV4cGFuZGVkIGEubGlua2VyOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6I0YwRjNGRjsNCi19DQotDQotI3JlY29yZGluZyAjYmxvY2tVSQ0KLXsNCi0gICAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgICBsZWZ0OjA7DQotICAgIHRvcDowOw0KLSAgICB3aWR0aDogMTAwJTsNCi0gICAgaGVpZ2h0OiAxMDAlOw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOw0KLSAgICBvcGFjaXR5OiAwLjY7DQotICAgIHotaW5kZXg6MTAwMDsNCi0gICAgcGFkZGluZzowOw0KLX0NCi0NCi0jcmVjb3JkaW5nIC53cmFwcGVyDQotew0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHRvcDogNTAlOw0KLSAgICBsZWZ0OiA1MCU7DQotICAgIHBhZGRpbmc6IDMwcHg7DQotICAgIHdpZHRoOiA0MTVweDsNCi0gICAgaGVpZ2h0OiAxMDBweDsNCi0gICAgYm9yZGVyOiAycHggc29saWQgYmxhY2s7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkY7DQotICAgIG9wYWNpdHk6IDE7DQotICAgIHotaW5kZXg6IDIwMDA7DQotICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOw0KLX0NCi0NCi0jcmVjb3JkaW5nIHANCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLSAgcGFkZGluZy10b3A6IDdweDsNCi0gIHBhZGRpbmctYm90dG9tOiA3cHg7DQotfQ0KLQ0KLSNyZWNvcmRpbmcgYnV0dG9uDQotew0KLSAgZmxvYXQ6IHJpZ2h0Ow0KLX0NCi0NCi0jcmVjb3JkaW5nIGJ1dHRvbiBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL25ldy10ZXh0LnBuZyApOw0KLX0NCisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKKyNjb250ZW50ICNwbHVnaW5zICNuYXZpZ2F0aW9uCit7CisgIHdpZHRoOiAyMCU7Cit9CisKKyNjb250ZW50ICNwbHVnaW5zICNuYXZpZ2F0aW9uIC5jYWNoZSBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Rpc2stYmxhY2sucG5nICk7IH0KKyNjb250ZW50ICNwbHVnaW5zICNuYXZpZ2F0aW9uIC5jb3JlIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vd29vZGVuLWJveC5wbmcgKTsgfQorI2NvbnRlbnQgI3BsdWdpbnMgI25hdmlnYXRpb24gLm90aGVyIGEgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vem9uZS5wbmcgKTsgfQorI2NvbnRlbnQgI3BsdWdpbnMgI25hdmlnYXRpb24gLmhpZ2hsaWdodGluZyBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2hpZ2hsaWdodGVyLXRleHQucG5nICk7IH0KKyNjb250ZW50ICNwbHVnaW5zICNuYXZpZ2F0aW9uIC51cGRhdGVoYW5kbGVyIGF7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9hcnJvdy1jaXJjbGUucG5nICk7IH0KKyNjb250ZW50ICNwbHVnaW5zICNuYXZpZ2F0aW9uIC5xdWVyeWhhbmRsZXIgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9tYWduaWZpZXIucG5nICk7IH0KKyNjb250ZW50ICNwbHVnaW5zICNuYXZpZ2F0aW9uIC5xdWVyeXBhcnNlciBhIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2FzdGVyaXNrLnBuZyApOyB9CisKKyNjb250ZW50ICNwbHVnaW5zICNuYXZpZ2F0aW9uIC5QTFVHSU5DSEFOR0VTIHsgbWFyZ2luLXRvcDogMjBweDsgfQorI2NvbnRlbnQgI3BsdWdpbnMgI25hdmlnYXRpb24gLlBMVUdJTkNIQU5HRVMgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9leWUucG5nICk7IH0KKyNjb250ZW50ICNwbHVnaW5zICNuYXZpZ2F0aW9uIC5SRUxPQUQgYSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9hcnJvdy1jaXJjbGUucG5nICk7IH0KKworCisjY29udGVudCAjcGx1Z2lucyAjbmF2aWdhdGlvbiBhCit7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworI2NvbnRlbnQgI3BsdWdpbnMgI25hdmlnYXRpb24gYSBzcGFuCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNiYmE1MDA7CisgIGJvcmRlci1yYWRpdXM6IDVweDsKKyAgY29sb3I6ICNmZmY7CisgIGZvbnQtc2l6ZTogMTBweDsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgbGluZS1oZWlnaHQ6IDEuNGVtOworICBwYWRkaW5nLWxlZnQ6IDRweDsKKyAgcGFkZGluZy1yaWdodDogNHB4OworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiA1cHg7CisgIHRvcDogN3B4OworfQorCisjY29udGVudCAjcGx1Z2lucyAjZnJhbWUKK3sKKyAgZmxvYXQ6IHJpZ2h0OworICB3aWR0aDogNzglOworfQorCisjY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5Cit7CisgIG1hcmdpbi1ib3R0b206IDEwcHg7Cit9CisKKyNjb250ZW50ICNwbHVnaW5zICNmcmFtZSAuZW50cnk6bGFzdC1jaGlsZAoreworICBtYXJnaW4tYm90dG9tOiAwOworfQorCisjY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5IGEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoZXZyb24tc21hbGwtZXhwYW5kLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgZGlzcGxheTogYmxvY2s7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNwbHVnaW5zICNmcmFtZSAuZW50cnkuY2hhbmdlZCBhIHNwYW4KK3sKKyAgY29sb3I6ICNiYmE1MDA7Cit9CisKKyNjb250ZW50ICNwbHVnaW5zICNmcmFtZSAuZW50cnkuZXhwYW5kZWQgYQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hldnJvbi1zbWFsbC5wbmcgKTsKK30KKworI2NvbnRlbnQgI3BsdWdpbnMgI2ZyYW1lIC5lbnRyeS5leHBhbmRlZCB1bAoreworICBkaXNwbGF5OiBibG9jazsKK30KKworI2NvbnRlbnQgI3BsdWdpbnMgI2ZyYW1lIC5lbnRyeSB1bAoreworICBib3JkZXItbGVmdDogOXB4IHNvbGlkICNmMGYzZmY7CisgIG1hcmdpbi1sZWZ0OiAzcHg7CisgIHBhZGRpbmctdG9wOiA1cHg7CisgIHBhZGRpbmctbGVmdDogMTBweDsKK30KKworI2NvbnRlbnQgI3BsdWdpbnMgI2ZyYW1lIC5lbnRyeSBsaQoreworICBwYWRkaW5nLXRvcDogMnB4OworICBwYWRkaW5nLWJvdHRvbTogMnB4OworfQorCisjY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5IGxpLnN0YXRzCit7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYzBjMGMwOworICBtYXJnaW4tdG9wOiA1cHg7CisgIHBhZGRpbmctdG9wOiA1cHg7Cit9CisKKyNjb250ZW50ICNwbHVnaW5zICNmcmFtZSAuZW50cnkgbGkub2RkCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7Cit9CisKKyNjb250ZW50ICNwbHVnaW5zICNmcmFtZSAuZW50cnkgZHQsCisjY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5IC5zdGF0cyBzcGFuCit7CisgIGZsb2F0OiBsZWZ0OworICB3aWR0aDogMTElOworfQorCisjY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5IGRkLAorI2NvbnRlbnQgI3BsdWdpbnMgI2ZyYW1lIC5lbnRyeSAuc3RhdHMgdWwKK3sKKyAgZmxvYXQ6IHJpZ2h0OworICB3aWR0aDogODglOworfQorCisjY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5IC5zdGF0cyB1bAoreworICBib3JkZXItbGVmdDogMDsKKyAgbWFyZ2luOiAwOworICBwYWRkaW5nOiAwOworfQorCisjY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5IC5zdGF0cyBkdAoreworICB3aWR0aDogMjclOworfQorCisjY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5IC5zdGF0cyBkZAoreworICB3aWR0aDogNzIlOworfQorCisjY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5LmV4cGFuZGVkIGEubGlua2VyIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOworICBkaXNwbGF5OiBpbmxpbmU7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIHBhZGRpbmc6MHB4OworfQorCisjY29udGVudCAjcGx1Z2lucyAjZnJhbWUgLmVudHJ5LmV4cGFuZGVkIGEubGlua2VyOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjojRjBGM0ZGOworfQorCisjcmVjb3JkaW5nICNibG9ja1VJCit7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGxlZnQ6MDsKKyAgICB0b3A6MDsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBoZWlnaHQ6IDEwMCU7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKKyAgICBvcGFjaXR5OiAwLjY7CisgICAgei1pbmRleDoxMDAwOworICAgIHBhZGRpbmc6MDsKK30KKworI3JlY29yZGluZyAud3JhcHBlcgoreworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDUwJTsKKyAgICBsZWZ0OiA1MCU7CisgICAgcGFkZGluZzogMzBweDsKKyAgICB3aWR0aDogNDE1cHg7CisgICAgaGVpZ2h0OiAxMDBweDsKKyAgICBib3JkZXI6IDJweCBzb2xpZCBibGFjazsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOworICAgIG9wYWNpdHk6IDE7CisgICAgei1pbmRleDogMjAwMDsKKyAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKK30KKworI3JlY29yZGluZyBwCit7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOworICBmbG9hdDogbGVmdDsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworICBwYWRkaW5nLXRvcDogN3B4OworICBwYWRkaW5nLWJvdHRvbTogN3B4OworfQorCisjcmVjb3JkaW5nIGJ1dHRvbgoreworICBmbG9hdDogcmlnaHQ7Cit9CisKKyNyZWNvcmRpbmcgYnV0dG9uIHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL25ldy10ZXh0LnBuZyApOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL3F1ZXJ5LmNzcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9xdWVyeS5jc3MKaW5kZXggMmYxZTgxYi4uYmUyNjRiZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL3F1ZXJ5LmNzcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvcXVlcnkuY3NzCkBAIC0xLDE2MiArMSwxNjIgQEAKLS8qDQotDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0qLw0KLQ0KLSNjb250ZW50ICNxdWVyeQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2Rpdi5naWYgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDIyJSAwOw0KLSAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC15Ow0KLX0NCi0NCi0jY29udGVudCAjcXVlcnkgI2Zvcm0NCi17DQotICBmbG9hdDogbGVmdDsNCi0gIHdpZHRoOiAyMSU7DQotfQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSBsYWJlbA0KLXsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgbWFyZ2luLXRvcDogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjcXVlcnkgI2Zvcm0gaW5wdXQsDQotI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIHNlbGVjdCwNCi0jY29udGVudCAjcXVlcnkgI2Zvcm0gdGV4dGFyZWENCi17DQotICBtYXJnaW4tYm90dG9tOiAycHg7DQotICB3aWR0aDogMTAwJTsNCi19DQotDQotI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIGlucHV0LA0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSB0ZXh0YXJlYQ0KLXsNCi0gIHdpZHRoOiA5OCU7DQotfQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSAubXVsdGlwbGUgaW5wdXQNCi17DQotICBmbG9hdDogbGVmdDsNCi0gIHdpZHRoOiA4MCUNCi19DQotDQotI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIC5tdWx0aXBsZSAuYnV0dG9ucw0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHdpZHRoOiAxNiU7DQotfQ0KLQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSAubXVsdGlwbGUgYQ0KLXsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDUwJSA1MCU7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIGhlaWdodDogMjVweDsNCi0gIHdpZHRoOiA0OSU7DQotfQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSAubXVsdGlwbGUgYS5hZGQNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcGx1cy1idXR0b24ucG5nICk7DQotICBmbG9hdDogcmlnaHQ7DQotfQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSAubXVsdGlwbGUgYS5yZW0NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vbWludXMtYnV0dG9uLnBuZyApOw0KLSAgZmxvYXQ6IGxlZnQ7DQotfQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSAjc3RhcnQNCi17DQotICBmbG9hdDogbGVmdDsNCi0gIHdpZHRoOiA0NSU7DQotfQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSAjcm93cw0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHdpZHRoOiA0NSU7DQotfQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSAuY2hlY2tib3ggaW5wdXQNCi17DQotICBtYXJnaW4tYm90dG9tOiAwOw0KLSAgd2lkdGg6IGF1dG87DQotfQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSBmaWVsZHNldCwNCi0jY29udGVudCAjcXVlcnkgI2Zvcm0gLm9wdGlvbmFsLmV4cGFuZGVkDQotew0KLSAgYm9yZGVyOiAxcHggc29saWQgI2ZmZjsNCi0gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYzBjMGMwOw0KLSAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjcXVlcnkgI2Zvcm0gZmllbGRzZXQuY29tbW9uDQotew0KLSAgbWFyZ2luLXRvcDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIGZpZWxkc2V0IGxlZ2VuZCwNCi0jY29udGVudCAjcXVlcnkgI2Zvcm0gLm9wdGlvbmFsLmV4cGFuZGVkIGxlZ2VuZA0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgbWFyZ2luLWxlZnQ6IDEwcHg7DQotICBwYWRkaW5nOiAwcHggNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjcXVlcnkgI2Zvcm0gZmllbGRzZXQgbGVnZW5kIGxhYmVsDQotew0KLSAgbWFyZ2luLXRvcDogMDsNCi19DQotDQotI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIGZpZWxkc2V0IC5maWVsZHNldA0KLXsNCi0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KLSAgcGFkZGluZy1ib3R0b206IDEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSAub3B0aW9uYWwNCi17DQotICBib3JkZXI6IDA7DQotfQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSAub3B0aW9uYWwgbGVnZW5kDQotew0KLSAgbWFyZ2luLWxlZnQ6IDA7DQotICBwYWRkaW5nLWxlZnQ6IDA7DQotfQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjZm9ybSAub3B0aW9uYWwuZXhwYW5kZWQgLmZpZWxkc2V0DQotew0KLSAgZGlzcGxheTogYmxvY2s7DQotfQ0KLQ0KLSNjb250ZW50ICNxdWVyeSAjcmVzdWx0DQotew0KLSAgZmxvYXQ6IHJpZ2h0Ow0KLSAgd2lkdGg6IDc3JTsNCi19DQotDQotI2NvbnRlbnQgI3F1ZXJ5ICNyZXN1bHQgI3Jlc3BvbnNlDQotew0KLX0NCisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKKyNjb250ZW50ICNxdWVyeQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9kaXYuZ2lmICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDIyJSAwOworICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXk7Cit9CisKKyNjb250ZW50ICNxdWVyeSAjZm9ybQoreworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDIxJTsKK30KKworI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIGxhYmVsCit7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi10b3A6IDVweDsKK30KKworI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIGlucHV0LAorI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIHNlbGVjdCwKKyNjb250ZW50ICNxdWVyeSAjZm9ybSB0ZXh0YXJlYQoreworICBtYXJnaW4tYm90dG9tOiAycHg7CisgIHdpZHRoOiAxMDAlOworfQorCisjY29udGVudCAjcXVlcnkgI2Zvcm0gaW5wdXQsCisjY29udGVudCAjcXVlcnkgI2Zvcm0gdGV4dGFyZWEKK3sKKyAgd2lkdGg6IDk4JTsKK30KKworI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIC5tdWx0aXBsZSBpbnB1dAoreworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDgwJQorfQorCisjY29udGVudCAjcXVlcnkgI2Zvcm0gLm11bHRpcGxlIC5idXR0b25zCit7CisgIGZsb2F0OiByaWdodDsKKyAgd2lkdGg6IDE2JTsKK30KKworCisjY29udGVudCAjcXVlcnkgI2Zvcm0gLm11bHRpcGxlIGEKK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTsKKyAgZGlzcGxheTogYmxvY2s7CisgIGhlaWdodDogMjVweDsKKyAgd2lkdGg6IDQ5JTsKK30KKworI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIC5tdWx0aXBsZSBhLmFkZAoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcGx1cy1idXR0b24ucG5nICk7CisgIGZsb2F0OiByaWdodDsKK30KKworI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIC5tdWx0aXBsZSBhLnJlbQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vbWludXMtYnV0dG9uLnBuZyApOworICBmbG9hdDogbGVmdDsKK30KKworI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtICNzdGFydAoreworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDQ1JTsKK30KKworI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtICNyb3dzCit7CisgIGZsb2F0OiByaWdodDsKKyAgd2lkdGg6IDQ1JTsKK30KKworI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIC5jaGVja2JveCBpbnB1dAoreworICBtYXJnaW4tYm90dG9tOiAwOworICB3aWR0aDogYXV0bzsKK30KKworI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIGZpZWxkc2V0LAorI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIC5vcHRpb25hbC5leHBhbmRlZAoreworICBib3JkZXI6IDFweCBzb2xpZCAjZmZmOworICBib3JkZXItdG9wOiAxcHggc29saWQgI2MwYzBjMDsKKyAgbWFyZ2luLWJvdHRvbTogNXB4OworfQorCisjY29udGVudCAjcXVlcnkgI2Zvcm0gZmllbGRzZXQuY29tbW9uCit7CisgIG1hcmdpbi10b3A6IDEwcHg7Cit9CisKKyNjb250ZW50ICNxdWVyeSAjZm9ybSBmaWVsZHNldCBsZWdlbmQsCisjY29udGVudCAjcXVlcnkgI2Zvcm0gLm9wdGlvbmFsLmV4cGFuZGVkIGxlZ2VuZAoreworICBkaXNwbGF5OiBibG9jazsKKyAgbWFyZ2luLWxlZnQ6IDEwcHg7CisgIHBhZGRpbmc6IDBweCA1cHg7Cit9CisKKyNjb250ZW50ICNxdWVyeSAjZm9ybSBmaWVsZHNldCBsZWdlbmQgbGFiZWwKK3sKKyAgbWFyZ2luLXRvcDogMDsKK30KKworI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIGZpZWxkc2V0IC5maWVsZHNldAoreworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YwZjBmMDsKKyAgbWFyZ2luLWJvdHRvbTogNXB4OworICBwYWRkaW5nLWJvdHRvbTogMTBweDsKK30KKworI2NvbnRlbnQgI3F1ZXJ5ICNmb3JtIC5vcHRpb25hbAoreworICBib3JkZXI6IDA7Cit9CisKKyNjb250ZW50ICNxdWVyeSAjZm9ybSAub3B0aW9uYWwgbGVnZW5kCit7CisgIG1hcmdpbi1sZWZ0OiAwOworICBwYWRkaW5nLWxlZnQ6IDA7Cit9CisKKyNjb250ZW50ICNxdWVyeSAjZm9ybSAub3B0aW9uYWwuZXhwYW5kZWQgLmZpZWxkc2V0Cit7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjY29udGVudCAjcXVlcnkgI3Jlc3VsdAoreworICBmbG9hdDogcmlnaHQ7CisgIHdpZHRoOiA3NyU7Cit9CisKKyNjb250ZW50ICNxdWVyeSAjcmVzdWx0ICNyZXNwb25zZQoreworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL3JlcGxpY2F0aW9uLmNzcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9yZXBsaWNhdGlvbi5jc3MKaW5kZXggNzQ0ZDA5YS4uYThiMWY4OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL3JlcGxpY2F0aW9uLmNzcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvcmVwbGljYXRpb24uY3NzCkBAIC0xLDUwMCArMSw1MDAgQEAKLS8qDQotDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0qLw0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2Rpdi5naWYgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDIxJSAwOw0KLSAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC15Ow0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI2ZyYW1lDQotew0KLSAgZmxvYXQ6IHJpZ2h0Ow0KLSAgd2lkdGg6IDc4JTsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNuYXZpZ2F0aW9uDQotew0KLSAgYm9yZGVyLXJpZ2h0OiAwOw0KLSAgZmxvYXQ6IGxlZnQ7DQotICB3aWR0aDogMjAlOw0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI2Vycm9yDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2YwMDsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jb25zdHJ1Y3Rpb24ucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMHB4IDUwJTsNCi0gIGNvbG9yOiAjZmZmOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBtYXJnaW4tYm90dG9tOiAyMHB4Ow0KLSAgcGFkZGluZzogMTBweDsNCi0gIHBhZGRpbmctbGVmdDogMzVweDsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uIC5ibG9jaw0KLXsNCi0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYzBjMGMwOw0KLSAgbWFyZ2luLWJvdHRvbTogMjBweDsNCi0gIHBhZGRpbmctYm90dG9tOiAyMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gLmJsb2NrLmxhc3QNCi17DQotICBib3JkZXItYm90dG9tOiAwOw0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gLm1hc3Rlck9ubHksDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uIC5zbGF2ZU9ubHkNCi17DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbi5tYXN0ZXIgLm1hc3Rlck9ubHkNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uLnNsYXZlIC5zbGF2ZU9ubHkNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uIC5yZXBsaWNhdGluZw0KLXsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uLnJlcGxpY2F0aW5nIC5yZXBsaWNhdGluZw0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI3Byb2dyZXNzDQotew0KLSAgcGFkZGluZy1ib3R0b206IDgwcHg7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjcHJvZ3Jlc3MgLmluZm8NCi17DQotICBwYWRkaW5nOiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjcHJvZ3Jlc3MgI3N0YXJ0DQotew0KLSAgbWFyZ2luLWxlZnQ6IDEwMHB4Ow0KLSAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYzBjMGMwOw0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI3Byb2dyZXNzICNiYXINCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOw0KLSAgbWFyZ2luLWxlZnQ6IDEwMHB4Ow0KLSAgbWFyZ2luLXJpZ2h0OiAxMDBweDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNwcm9ncmVzcyAjYmFyICNiYXItaW5mbywNCi0jY29udGVudCAjcmVwbGljYXRpb24gI3Byb2dyZXNzICNiYXIgI2V0YQ0KLXsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHJpZ2h0OiAtMTAwcHg7DQotICB3aWR0aDogMTAwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjcHJvZ3Jlc3MgI2JhciAjYmFyLWluZm8NCi17DQotICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNmMGYwZjA7DQotICBtYXJnaW4tdG9wOiAzMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI3Byb2dyZXNzICNldGEgLmluZm8NCi17DQotICBjb2xvcjogI2MwYzBjMDsNCi0gIGhlaWdodDogMzBweDsNCi0gIGxpbmUtaGVpZ2h0OiAzMHB4Ow0KLSAgcGFkZGluZy10b3A6IDA7DQotICBwYWRkaW5nLWJvdHRvbTogMDsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNwcm9ncmVzcyAjc3BlZWQNCi17DQotICBjb2xvcjogI2MwYzBjMDsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHJpZ2h0OiAxMDBweDsNCi0gIHRvcDogMDsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNwcm9ncmVzcyAjYmFyICNkb25lDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2MwYzBjMDsNCi0gIGJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOw0KLSAgLW1vei1ib3gtc2hhZG93OiA1cHggNXB4IDEwcHggI2MwYzBjMDsNCi0gIC13ZWJraXQtYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7DQotICBoZWlnaHQ6IDMwcHg7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjcHJvZ3Jlc3MgI2JhciAjZG9uZSAucGVyY2VudA0KLXsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgaGVpZ2h0OiAzMHB4Ow0KLSAgbGluZS1oZWlnaHQ6IDMwcHg7DQotICBwYWRkaW5nLWxlZnQ6IDVweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDVweDsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHJpZ2h0OiAwOw0KLSAgdGV4dC1hbGlnbjogcmlnaHQ7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjcHJvZ3Jlc3MgI2JhciAjZG9uZSAjZG9uZS1pbmZvDQotew0KLSAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2MwYzBjMDsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHJpZ2h0OiAwOw0KLSAgbWFyZ2luLXRvcDogMzBweDsNCi0gIHRleHQtYWxpZ246IHJpZ2h0Ow0KLSAgd2lkdGg6IDEwMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI3Byb2dyZXNzICNiYXIgI2RvbmUgI2RvbmUtaW5mbyAucGVyY2VudA0KLXsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gLmJsb2NrIC5sYWJlbCwNCi0jY29udGVudCAjcmVwbGljYXRpb24gI2N1cnJlbnQtZmlsZSAuZmlsZSwNCi0jY29udGVudCAjcmVwbGljYXRpb24gI2N1cnJlbnQtZmlsZSAucHJvZ3Jlc3MsDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNpdGVyYXRpb25zIC5pdGVyYXRpb25zDQotew0KLSAgZmxvYXQ6IGxlZnQ7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAuYmxvY2sgLmxhYmVsDQotew0KLSAgd2lkdGg6IDEwMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gLmJsb2NrIC5sYWJlbCBzcGFuDQotew0KLSAgZGlzcGxheTogYmxvY2s7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjY3VycmVudC1maWxlDQotew0KLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmMGYwZjA7DQotICBtYXJnaW4tdG9wOiAxMHB4Ow0KLSAgcGFkZGluZy10b3A6IDEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjY3VycmVudC1maWxlIC5wcm9ncmVzcw0KLXsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLSAgbWFyZ2luLWxlZnQ6IDIwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjaXRlcmF0aW9ucyAubGFiZWwgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ub2RlLWRlc2lnbi5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNpdGVyYXRpb25zIC5pdGVyYXRpb25zIGxpDQotew0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSA1MCU7DQotICBwYWRkaW5nLXJpZ2h0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI2l0ZXJhdGlvbnMgLml0ZXJhdGlvbnMuZXhwYW5kZWQgbGkNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNpdGVyYXRpb25zIC5pdGVyYXRpb25zIC5sYXRlc3QNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNpdGVyYXRpb25zIC5pdGVyYXRpb25zIC5yZXBsaWNhdGVkDQotew0KLSAgY29sb3I6ICM4MGM0ODA7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjaXRlcmF0aW9ucyAuaXRlcmF0aW9ucyB1bDpob3ZlciAucmVwbGljYXRlZCwNCi0jY29udGVudCAjcmVwbGljYXRpb24gI2l0ZXJhdGlvbnMgLml0ZXJhdGlvbnMgLnJlcGxpY2F0ZWQubGF0ZXN0DQotew0KLSAgY29sb3I6ICMwODA7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjaXRlcmF0aW9ucyAuaXRlcmF0aW9ucyAucmVwbGljYXRlZC5sYXRlc3QNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNpdGVyYXRpb25zIC5pdGVyYXRpb25zIC5mYWlsZWQNCi17DQotICBjb2xvcjogI2M0ODA4MDsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNpdGVyYXRpb25zIC5pdGVyYXRpb25zIHVsOmhvdmVyIC5mYWlsZWQsDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNpdGVyYXRpb25zIC5pdGVyYXRpb25zIC5mYWlsZWQubGF0ZXN0DQotew0KLSAgY29sb3I6ICM4MDA7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjaXRlcmF0aW9ucyAuaXRlcmF0aW9ucyAuZmFpbGVkLmxhdGVzdA0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNpdGVyYXRpb25zIC5pdGVyYXRpb25zIGENCi17DQotICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsNCi0gIG1hcmdpbi10b3A6IDJweDsNCi0gIHBhZGRpbmctdG9wOiAycHg7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjaXRlcmF0aW9ucyAuaXRlcmF0aW9ucyBhIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI2l0ZXJhdGlvbnMgLml0ZXJhdGlvbnMgYSBzcGFuLmV4cGFuZA0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLWV4cGFuZC5wbmcgKTsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI2l0ZXJhdGlvbnMgLml0ZXJhdGlvbnMgYSBzcGFuLmNvbGxhcHNlDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoZXZyb24tc21hbGwucG5nICk7DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNkZXRhaWxzIHRhYmxlDQotew0KLSAgbWFyZ2luLWxlZnQ6IDIwcHg7DQotICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI2RldGFpbHMgdGFibGUgdGgNCi17DQotICB0ZXh0LWFsaWduOiBsZWZ0Ow0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24uc2xhdmUgI2RldGFpbHMgdGFibGUgLnNsYXZlT25seQ0KLXsNCi0gIGRpc3BsYXk6IHRhYmxlLXJvdzsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNkZXRhaWxzIHRhYmxlIHRoZWFkIHRoDQotew0KLSAgY29sb3I6ICNjMGMwYzA7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0aGVhZCB0aCwNCi0jY29udGVudCAjcmVwbGljYXRpb24gI2RldGFpbHMgdGFibGUgdGJvZHkgdGQNCi17DQotICBwYWRkaW5nLXJpZ2h0OiAyMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI2RldGFpbHMgdGFibGUgdGhlYWQgdGQsDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNkZXRhaWxzIHRhYmxlIHRoZWFkIHRoLA0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0Ym9keSB0aCwNCi0jY29udGVudCAjcmVwbGljYXRpb24gI2RldGFpbHMgdGFibGUgdGJvZHkgdGQgZGl2DQotew0KLSAgcGFkZGluZy10b3A6IDNweDsNCi0gIHBhZGRpbmctYm90dG9tOiAzcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0Ym9keSB0ZCwNCi0jY29udGVudCAjcmVwbGljYXRpb24gI2RldGFpbHMgdGFibGUgdGJvZHkgdGgNCi17DQotICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNkZXRhaWxzIHRhYmxlIHRoZWFkIHRkDQotew0KLSAgd2lkdGg6IDEwMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI2RldGFpbHMgdGFibGUgdGhlYWQgdGQgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jbGlwYm9hcmQtbGlzdC5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0Ym9keSB0aA0KLXsNCi0gIHBhZGRpbmctcmlnaHQ6IDEwcHg7DQotICB0ZXh0LWFsaWduOiByaWdodDsNCi0gIHdoaXRlLXNwYWNlOiBub3dyYXA7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0Ym9keSAuc2l6ZQ0KLXsNCi0gIHRleHQtYWxpZ246IHJpZ2h0Ow0KLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNkZXRhaWxzIHRhYmxlIHRib2R5IC5nZW5lcmF0aW9uIGRpdg0KLXsNCi0gIHRleHQtYWxpZ246IGNlbnRlcjsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNkZXRhaWxzIHRhYmxlIHRib2R5IC5kaWZmIGRpdg0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmY2ZjYzk7DQotICBwYWRkaW5nLWxlZnQ6IDFweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDFweDsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uIC5zZXR0aW5ncyAubGFiZWwgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9oYW1tZXItc2NyZXdkcml2ZXIucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAuc2V0dGluZ3MgdWwsDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uIC5zZXR0aW5ncyBkbCBkdCwNCi0jY29udGVudCAjcmVwbGljYXRpb24gLnNldHRpbmdzIGRsIGRkDQotew0KLSAgZmxvYXQ6IGxlZnQ7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAuc2V0dGluZ3MgdWwgbGkNCi17DQotICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsNCi0gIHBhZGRpbmctdG9wOiAzcHg7DQotICBwYWRkaW5nLXRvcDogM3B4Ow0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gLnNldHRpbmdzIHVsIGxpOmZpcnN0LWNoaWxkDQotew0KLSAgYm9yZGVyLXRvcDogMDsNCi0gIHBhZGRpbmctdG9wOiAwOw0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gLnNldHRpbmdzIGRsIGR0DQotew0KLSAgY2xlYXI6IGxlZnQ7DQotICBtYXJnaW4tcmlnaHQ6IDVweDsNCi0gIHdpZHRoOiAxMjBweDsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uIC5zZXR0aW5ncyBkbCAuaWNvDQotew0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAuc2V0dGluZ3MgZGwgLmljby5pY28tMA0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9zbGFzaC5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uIC5zZXR0aW5ncyBkbCAuaWNvLmljby0xDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAudGltZXINCi17DQotICBib3gtc2hhZG93OiA1cHggNXB4IDEwcHggI2MwYzBjMDsNCi0gIC1tb3otYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7DQotICAtd2Via2l0LWJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOw0KLSAgbWFyZ2luLWJvdHRvbTogMjBweDsNCi0gIHBhZGRpbmc6IDEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAudGltZXIgcCwNCi0jY29udGVudCAjcmVwbGljYXRpb24gLnRpbWVyIHNtYWxsDQotew0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gLnRpbWVyIHANCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2xvY2stc2VsZWN0LXJlbWFpbi5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gLnRpbWVyIHAgLmFwcHJveA0KLXsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLSAgbWFyZ2luLXJpZ2h0OiAxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAudGltZXIgcCAudGljaw0KLXsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gLnRpbWVyIHNtYWxsDQotew0KLSAgY29sb3I6ICNjMGMwYzA7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjbmF2aWdhdGlvbiBidXR0b24NCi17DQotICBkaXNwbGF5OiBibG9jazsNCi0gIG1hcmdpbi1ib3R0b206IDEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjbmF2aWdhdGlvbiBidXR0b24ub3B0aW9uYWwNCi17DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjbmF2aWdhdGlvbiAucmVwbGljYXRlLW5vdyBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2RvY3VtZW50LWNvbnZlcnQucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjbmF2aWdhdGlvbiAuYWJvcnQtcmVwbGljYXRpb24gc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9oYW5kLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI25hdmlnYXRpb24gLmRpc2FibGUtcG9sbGluZyBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjcmVwbGljYXRpb24gI25hdmlnYXRpb24gLmVuYWJsZS1wb2xsaW5nIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNuYXZpZ2F0aW9uIC5kaXNhYmxlLXJlcGxpY2F0aW9uIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNyZXBsaWNhdGlvbiAjbmF2aWdhdGlvbiAuZW5hYmxlLXJlcGxpY2F0aW9uIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNuYXZpZ2F0aW9uIC5yZWZyZXNoLXN0YXR1cyBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Fycm93LWNpcmNsZS5wbmcgKTsNCi19DQorLyoKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisqLworCisjY29udGVudCAjcmVwbGljYXRpb24KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvZGl2LmdpZiApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAyMSUgMDsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC15OworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI2ZyYW1lCit7CisgIGZsb2F0OiByaWdodDsKKyAgd2lkdGg6IDc4JTsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNuYXZpZ2F0aW9uCit7CisgIGJvcmRlci1yaWdodDogMDsKKyAgZmxvYXQ6IGxlZnQ7CisgIHdpZHRoOiAyMCU7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjZXJyb3IKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwMDsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NvbnN0cnVjdGlvbi5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTBweCA1MCU7CisgIGNvbG9yOiAjZmZmOworICBmb250LXdlaWdodDogYm9sZDsKKyAgbWFyZ2luLWJvdHRvbTogMjBweDsKKyAgcGFkZGluZzogMTBweDsKKyAgcGFkZGluZy1sZWZ0OiAzNXB4OworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gLmJsb2NrCit7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYzBjMGMwOworICBtYXJnaW4tYm90dG9tOiAyMHB4OworICBwYWRkaW5nLWJvdHRvbTogMjBweDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uIC5ibG9jay5sYXN0Cit7CisgIGJvcmRlci1ib3R0b206IDA7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAubWFzdGVyT25seSwKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAuc2xhdmVPbmx5Cit7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbi5tYXN0ZXIgLm1hc3Rlck9ubHkKK3sKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbi5zbGF2ZSAuc2xhdmVPbmx5Cit7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gLnJlcGxpY2F0aW5nCit7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbi5yZXBsaWNhdGluZyAucmVwbGljYXRpbmcKK3sKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjcHJvZ3Jlc3MKK3sKKyAgcGFkZGluZy1ib3R0b206IDgwcHg7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNwcm9ncmVzcyAuaW5mbworeworICBwYWRkaW5nOiA1cHg7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjcHJvZ3Jlc3MgI3N0YXJ0Cit7CisgIG1hcmdpbi1sZWZ0OiAxMDBweDsKKyAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYzBjMGMwOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI3Byb2dyZXNzICNiYXIKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKKyAgbWFyZ2luLWxlZnQ6IDEwMHB4OworICBtYXJnaW4tcmlnaHQ6IDEwMHB4OworICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjcHJvZ3Jlc3MgI2JhciAjYmFyLWluZm8sCisjY29udGVudCAjcmVwbGljYXRpb24gI3Byb2dyZXNzICNiYXIgI2V0YQoreworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAtMTAwcHg7CisgIHdpZHRoOiAxMDBweDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNwcm9ncmVzcyAjYmFyICNiYXItaW5mbworeworICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNmMGYwZjA7CisgIG1hcmdpbi10b3A6IDMwcHg7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjcHJvZ3Jlc3MgI2V0YSAuaW5mbworeworICBjb2xvcjogI2MwYzBjMDsKKyAgaGVpZ2h0OiAzMHB4OworICBsaW5lLWhlaWdodDogMzBweDsKKyAgcGFkZGluZy10b3A6IDA7CisgIHBhZGRpbmctYm90dG9tOiAwOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI3Byb2dyZXNzICNzcGVlZAoreworICBjb2xvcjogI2MwYzBjMDsKKyAgcG9zaXRpb246IGFic29sdXRlOworICByaWdodDogMTAwcHg7CisgIHRvcDogMDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNwcm9ncmVzcyAjYmFyICNkb25lCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNjMGMwYzA7CisgIGJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOworICAtbW96LWJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOworICAtd2Via2l0LWJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOworICBoZWlnaHQ6IDMwcHg7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNwcm9ncmVzcyAjYmFyICNkb25lIC5wZXJjZW50Cit7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBoZWlnaHQ6IDMwcHg7CisgIGxpbmUtaGVpZ2h0OiAzMHB4OworICBwYWRkaW5nLWxlZnQ6IDVweDsKKyAgcGFkZGluZy1yaWdodDogNXB4OworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAwOworICB0ZXh0LWFsaWduOiByaWdodDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNwcm9ncmVzcyAjYmFyICNkb25lICNkb25lLWluZm8KK3sKKyAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2MwYzBjMDsKKyAgcG9zaXRpb246IGFic29sdXRlOworICByaWdodDogMDsKKyAgbWFyZ2luLXRvcDogMzBweDsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7CisgIHdpZHRoOiAxMDBweDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNwcm9ncmVzcyAjYmFyICNkb25lICNkb25lLWluZm8gLnBlcmNlbnQKK3sKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAuYmxvY2sgLmxhYmVsLAorI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNjdXJyZW50LWZpbGUgLmZpbGUsCisjY29udGVudCAjcmVwbGljYXRpb24gI2N1cnJlbnQtZmlsZSAucHJvZ3Jlc3MsCisjY29udGVudCAjcmVwbGljYXRpb24gI2l0ZXJhdGlvbnMgLml0ZXJhdGlvbnMKK3sKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAuYmxvY2sgLmxhYmVsCit7CisgIHdpZHRoOiAxMDBweDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uIC5ibG9jayAubGFiZWwgc3BhbgoreworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI2N1cnJlbnQtZmlsZQoreworICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsKKyAgbWFyZ2luLXRvcDogMTBweDsKKyAgcGFkZGluZy10b3A6IDEwcHg7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjY3VycmVudC1maWxlIC5wcm9ncmVzcworeworICBjb2xvcjogI2MwYzBjMDsKKyAgbWFyZ2luLWxlZnQ6IDIwcHg7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjaXRlcmF0aW9ucyAubGFiZWwgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vbm9kZS1kZXNpZ24ucG5nICk7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjaXRlcmF0aW9ucyAuaXRlcmF0aW9ucyBsaQoreworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMDAlIDUwJTsKKyAgcGFkZGluZy1yaWdodDogMjFweDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNpdGVyYXRpb25zIC5pdGVyYXRpb25zLmV4cGFuZGVkIGxpCit7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI2l0ZXJhdGlvbnMgLml0ZXJhdGlvbnMgLmxhdGVzdAoreworICBkaXNwbGF5OiBibG9jazsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNpdGVyYXRpb25zIC5pdGVyYXRpb25zIC5yZXBsaWNhdGVkCit7CisgIGNvbG9yOiAjODBjNDgwOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI2l0ZXJhdGlvbnMgLml0ZXJhdGlvbnMgdWw6aG92ZXIgLnJlcGxpY2F0ZWQsCisjY29udGVudCAjcmVwbGljYXRpb24gI2l0ZXJhdGlvbnMgLml0ZXJhdGlvbnMgLnJlcGxpY2F0ZWQubGF0ZXN0Cit7CisgIGNvbG9yOiAjMDgwOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI2l0ZXJhdGlvbnMgLml0ZXJhdGlvbnMgLnJlcGxpY2F0ZWQubGF0ZXN0Cit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI2l0ZXJhdGlvbnMgLml0ZXJhdGlvbnMgLmZhaWxlZAoreworICBjb2xvcjogI2M0ODA4MDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNpdGVyYXRpb25zIC5pdGVyYXRpb25zIHVsOmhvdmVyIC5mYWlsZWQsCisjY29udGVudCAjcmVwbGljYXRpb24gI2l0ZXJhdGlvbnMgLml0ZXJhdGlvbnMgLmZhaWxlZC5sYXRlc3QKK3sKKyAgY29sb3I6ICM4MDA7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjaXRlcmF0aW9ucyAuaXRlcmF0aW9ucyAuZmFpbGVkLmxhdGVzdAoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MucG5nICk7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjaXRlcmF0aW9ucyAuaXRlcmF0aW9ucyBhCit7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjBmMGYwOworICBtYXJnaW4tdG9wOiAycHg7CisgIHBhZGRpbmctdG9wOiAycHg7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjaXRlcmF0aW9ucyAuaXRlcmF0aW9ucyBhIHNwYW4KK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIGNvbG9yOiAjYzBjMGMwOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjaXRlcmF0aW9ucyAuaXRlcmF0aW9ucyBhIHNwYW4uZXhwYW5kCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLWV4cGFuZC5wbmcgKTsKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjaXRlcmF0aW9ucyAuaXRlcmF0aW9ucyBhIHNwYW4uY29sbGFwc2UKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoZXZyb24tc21hbGwucG5nICk7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI2RldGFpbHMgdGFibGUKK3sKKyAgbWFyZ2luLWxlZnQ6IDIwcHg7CisgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0aAoreworICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisjY29udGVudCAjcmVwbGljYXRpb24uc2xhdmUgI2RldGFpbHMgdGFibGUgLnNsYXZlT25seQoreworICBkaXNwbGF5OiB0YWJsZS1yb3c7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0aGVhZCB0aAoreworICBjb2xvcjogI2MwYzBjMDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNkZXRhaWxzIHRhYmxlIHRoZWFkIHRoLAorI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNkZXRhaWxzIHRhYmxlIHRib2R5IHRkCit7CisgIHBhZGRpbmctcmlnaHQ6IDIwcHg7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0aGVhZCB0ZCwKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0aGVhZCB0aCwKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0Ym9keSB0aCwKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0Ym9keSB0ZCBkaXYKK3sKKyAgcGFkZGluZy10b3A6IDNweDsKKyAgcGFkZGluZy1ib3R0b206IDNweDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNkZXRhaWxzIHRhYmxlIHRib2R5IHRkLAorI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNkZXRhaWxzIHRhYmxlIHRib2R5IHRoCit7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjBmMGYwOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI2RldGFpbHMgdGFibGUgdGhlYWQgdGQKK3sKKyAgd2lkdGg6IDEwMHB4OworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI2RldGFpbHMgdGFibGUgdGhlYWQgdGQgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2xpcGJvYXJkLWxpc3QucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI2RldGFpbHMgdGFibGUgdGJvZHkgdGgKK3sKKyAgcGFkZGluZy1yaWdodDogMTBweDsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0Ym9keSAuc2l6ZQoreworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNkZXRhaWxzIHRhYmxlIHRib2R5IC5nZW5lcmF0aW9uIGRpdgoreworICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjZGV0YWlscyB0YWJsZSB0Ym9keSAuZGlmZiBkaXYKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZmNjOTsKKyAgcGFkZGluZy1sZWZ0OiAxcHg7CisgIHBhZGRpbmctcmlnaHQ6IDFweDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uIC5zZXR0aW5ncyAubGFiZWwgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vaGFtbWVyLXNjcmV3ZHJpdmVyLnBuZyApOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gLnNldHRpbmdzIHVsLAorI2NvbnRlbnQgI3JlcGxpY2F0aW9uIC5zZXR0aW5ncyBkbCBkdCwKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAuc2V0dGluZ3MgZGwgZGQKK3sKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAuc2V0dGluZ3MgdWwgbGkKK3sKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmMGYwZjA7CisgIHBhZGRpbmctdG9wOiAzcHg7CisgIHBhZGRpbmctdG9wOiAzcHg7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAuc2V0dGluZ3MgdWwgbGk6Zmlyc3QtY2hpbGQKK3sKKyAgYm9yZGVyLXRvcDogMDsKKyAgcGFkZGluZy10b3A6IDA7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAuc2V0dGluZ3MgZGwgZHQKK3sKKyAgY2xlYXI6IGxlZnQ7CisgIG1hcmdpbi1yaWdodDogNXB4OworICB3aWR0aDogMTIwcHg7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAuc2V0dGluZ3MgZGwgLmljbworeworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gLnNldHRpbmdzIGRsIC5pY28uaWNvLTAKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3NsYXNoLnBuZyApOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gLnNldHRpbmdzIGRsIC5pY28uaWNvLTEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAudGltZXIKK3sKKyAgYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7CisgIC1tb3otYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7CisgIC13ZWJraXQtYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7CisgIG1hcmdpbi1ib3R0b206IDIwcHg7CisgIHBhZGRpbmc6IDEwcHg7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAudGltZXIgcCwKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAudGltZXIgc21hbGwKK3sKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gLnRpbWVyIHAKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nsb2NrLXNlbGVjdC1yZW1haW4ucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gLnRpbWVyIHAgLmFwcHJveAoreworICBjb2xvcjogI2MwYzBjMDsKKyAgbWFyZ2luLXJpZ2h0OiAxcHg7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAudGltZXIgcCAudGljaworeworICBmb250LXdlaWdodDogYm9sZDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uIC50aW1lciBzbWFsbAoreworICBjb2xvcjogI2MwYzBjMDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNuYXZpZ2F0aW9uIGJ1dHRvbgoreworICBkaXNwbGF5OiBibG9jazsKKyAgbWFyZ2luLWJvdHRvbTogMTBweDsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNuYXZpZ2F0aW9uIGJ1dHRvbi5vcHRpb25hbAoreworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI25hdmlnYXRpb24gLnJlcGxpY2F0ZS1ub3cgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZG9jdW1lbnQtY29udmVydC5wbmcgKTsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNuYXZpZ2F0aW9uIC5hYm9ydC1yZXBsaWNhdGlvbiBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9oYW5kLnBuZyApOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI25hdmlnYXRpb24gLmRpc2FibGUtcG9sbGluZyBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy5wbmcgKTsKK30KKworI2NvbnRlbnQgI3JlcGxpY2F0aW9uICNuYXZpZ2F0aW9uIC5lbmFibGUtcG9sbGluZyBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOworfQorCisjY29udGVudCAjcmVwbGljYXRpb24gI25hdmlnYXRpb24gLmRpc2FibGUtcmVwbGljYXRpb24gc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MucG5nICk7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjbmF2aWdhdGlvbiAuZW5hYmxlLXJlcGxpY2F0aW9uIHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7Cit9CisKKyNjb250ZW50ICNyZXBsaWNhdGlvbiAjbmF2aWdhdGlvbiAucmVmcmVzaC1zdGF0dXMgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctY2lyY2xlLnBuZyApOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL3NjaGVtYS1icm93c2VyLmNzcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9zY2hlbWEtYnJvd3Nlci5jc3MKaW5kZXggMGJmMDAyMS4uNWRkOGRhZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL3NjaGVtYS1icm93c2VyLmNzcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvc2NoZW1hLWJyb3dzZXIuY3NzCkBAIC0xLDU2NyArMSw1NjcgQEAKLS8qDQotDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0qLw0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAubG9hZGVyDQotew0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7ICAgDQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3Nlci5sb2FkZWQNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9kaXYuZ2lmICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAyMSUgMDsNCi0gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteTsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhDQotew0KLSAgZmxvYXQ6IHJpZ2h0Ow0KLSAgd2lkdGg6IDc4JTsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkDQotew0KLSAgZmxvYXQ6IGxlZnQ7DQotICB3aWR0aDogMjAlOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgc2VsZWN0DQotew0KLSAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCBzZWxlY3Qgb3B0Z3JvdXANCi17DQotICBmb250LXN0eWxlOiBub3JtYWw7DQotICBwYWRkaW5nOiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCBzZWxlY3Qgb3B0aW9uDQotew0KLSAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgI2YtZGYtdA0KLXsNCi0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgcGFkZGluZy1ib3R0b206IDE1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCAudWtmLWRzZiBkdA0KLXsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkIGRsDQotew0KLSAgbWFyZ2luLXRvcDogMTVweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkIGRsIGR0LA0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCBkbCBkZCBhDQotew0KLSAgY29sb3I6ICNjMGMwYzA7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCBkbCBkdA0KLXsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgbWFyZ2luLXRvcDogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgZGwgZGQgYQ0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgZGwgZGQgYTpob3Zlcg0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCAuZmllbGQgLmZpZWxkLA0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCAuZmllbGQgLmZpZWxkIGEsDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkIC5keW5hbWljLWZpZWxkIC5keW5hbWljLWZpZWxkLA0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCAuZHluYW1pYy1maWVsZCAuZHluYW1pYy1maWVsZCBhLA0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCAudHlwZSAudHlwZSwNCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgLnR5cGUgLnR5cGUgYSwNCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgLmFjdGl2ZSwNCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgLmFjdGl2ZSBhDQotew0KLSAgY29sb3I6ICMzMzM7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCAuY29weWZpZWxkLA0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCAuY29weWZpZWxkIGENCi17DQotICBjb2xvcjogIzY2NjsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhDQotew0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2luZGV4IGR0DQotew0KLSAgZmxvYXQ6IGxlZnQ7DQotICBtYXJnaW4tcmlnaHQ6IDVweDsNCi0gIHdpZHRoOiAxNTBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucw0KLXsNCi0gIG1hcmdpbi1ib3R0b206IDEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmhlYWQgaDINCi17DQotICBwYWRkaW5nLWxlZnQ6IDVweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAucGFydGlhbA0KLXsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAucGFydGlhbCBwDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2V4Y2xhbWF0aW9uLWJ1dHRvbi5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5vcHRpb25zIGR0LA0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLm9wdGlvbnMgZGQNCi17DQotICBmbG9hdDogbGVmdDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAub3B0aW9ucyBkdA0KLXsNCi0gIGNsZWFyOiBsZWZ0Ow0KLSAgbWFyZ2luLXJpZ2h0OiA1cHg7DQotICB3aWR0aDogMTAwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzDQotew0KLSAgbWFyZ2luLXRvcDogMTBweDsNCi0gIG1hcmdpbi1ib3R0b206IDIwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRoZWFkIHRkDQotew0KLSAgY29sb3I6ICNjMGMwYzA7DQotICBwYWRkaW5nLXJpZ2h0OiA1cHg7DQotICB3aWR0aDogMTAwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRib2R5IHRkLA0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRoDQotew0KLSAgcGFkZGluZzogMnB4IDVweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MgdGhlYWQgdGQsDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MgdGJvZHkgdGgNCi17DQotICBwYWRkaW5nLWxlZnQ6IDA7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRoZWFkIHRoLA0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRib2R5IHRkDQotew0KLSAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZjBmMGYwOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSB0aCwNCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSB0ZA0KLXsNCi0gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjBmMGYwOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSAuY2hlY2sNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmZGZhOw0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1MCUgNTAlOw0KLSAgdGV4dC1hbGlnbjogY2VudGVyOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSAuY2hlY2sgc3Bhbg0KLXsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MgdGJvZHkgLnRleHQNCi17DQotICBjb2xvcjogI2MwYzBjMDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIsDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgbGksDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwsDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwgbGkNCi17DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHAsDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgZGwNCi17DQotICBmbG9hdDogbGVmdDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgcA0KLXsNCi0gIG1hcmdpbi1yaWdodDogNXB4Ow0KLSAgdGV4dC1hbGlnbjogcmlnaHQ7DQotICB3aWR0aDogMTI1cHg7DQotICB3aGl0ZS1zcGFjZTogcHJlOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciBwIGENCi17DQotICBjdXJzb3I6IGF1dG87DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHAgYS5hbmFseXNpcw0KLXsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciBwIGEuYW5hbHlzaXMgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9xdWVzdGlvbi13aGl0ZS5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciBwIGEuYW5hbHlzaXM6aG92ZXIgc3Bhbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9xdWVzdGlvbi5wbmcgKTsNCi0gIGNvbG9yOiAjMDA4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciBhDQotew0KLSAgY3Vyc29yOiBhdXRvOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciAudG9nZ2xlDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoZXZyb24tc21hbGwtZXhwYW5kLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSA1MCU7DQotICBjdXJzb3I6IHBvaW50ZXI7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHBhZGRpbmctcmlnaHQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIC5vcGVuIC50b2dnbGUNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hldnJvbi1zbWFsbC5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgbGkNCi17DQotICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsNCi0gIG1hcmdpbi10b3A6IDEwcHg7DQotICBwYWRkaW5nLXRvcDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwNCi17DQotICBjbGVhcjogbGVmdDsNCi0gIG1hcmdpbi1sZWZ0OiA1NXB4Ow0KLSAgcGFkZGluZy10b3A6IDVweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgLm9wZW4gdWwNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwgbGkNCi17DQotICBib3JkZXItdG9wOiAxcHggc29saWQgI2Y4ZjhmODsNCi0gIG1hcmdpbi10b3A6IDVweDsNCi0gIHBhZGRpbmctdG9wOiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHVsIHANCi17DQotICBjb2xvcjogIzk5OTsNCi0gIG1hcmdpbi1yaWdodDogNXB4Ow0KLSAgdGV4dC1hbGlnbjogcmlnaHQ7DQotICB3aWR0aDogNzBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwgZGQNCi17DQotICBtYXJnaW4tbGVmdDogMjBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwgZGQNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZG9jdW1lbnQtbGlzdC5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgY29sb3I6ICNjMGMwYzA7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHVsIGRkLmljby0wDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3NsYXNoLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciB1bCBkZC5pY28tMQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oZWFkDQotew0KLSAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXINCi17DQotICBib3JkZXItdG9wOiAxcHggc29saWQgI2MwYzBjMDsNCi0gIHBhZGRpbmctdG9wOiAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIgLnRyaWdnZXINCi17DQotICBmbG9hdDogbGVmdDsNCi0gIHdpZHRoOiAxNDBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyIC50cmlnZ2VyIGJ1dHRvbiBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2luZm9ybWF0aW9uLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIgLnN0YXR1cw0KLXsNCi0gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2YwZjBmMDsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgcGFkZGluZy1sZWZ0OiAyMHB4Ow0KLSAgcGFkZGluZy1yaWdodDogMjBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyLmRpc2FibGVkIC50cmlnZ2VyIGJ1dHRvbiBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3Byb2hpYml0aW9uLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIuZGlzYWJsZWQgLnN0YXR1cw0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIgLnRyaWdnZXIgLmF1dG9sb2FkDQotew0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIubG9hZGVkIC50cmlnZ2VyIC5hdXRvbG9hZA0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1jaGVjay1ib3gtdW5jaGVjay5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgY29sb3I6ICNjMGMwYzA7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIG1hcmdpbi10b3A6IDEwcHg7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLnRlcm1pbmZvLWhvbGRlciAudHJpZ2dlciAuYXV0b2xvYWQ6aG92ZXINCi17DQotICBjb2xvcjogIzAwODsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyIC50cmlnZ2VyIC5hdXRvbG9hZC5vbg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1jaGVjay1ib3gucG5nICk7DQotICBjb2xvcjogIzMzMzsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAudG9wdGVybXMtaG9sZGVyLA0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXINCi17DQotICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNmMGYwZjA7DQotICBmbG9hdDogbGVmdDsNCi0gIHBhZGRpbmctbGVmdDogMjBweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDIwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLnRvcHRlcm1zLWhvbGRlciAuaGVhZCBpbnB1dA0KLXsNCi0gIGhlaWdodDogMThweDsNCi0gIGxpbmUtaGVpZ2h0OiAxNnB4Ow0KLSAgdGV4dC1hbGlnbjogcmlnaHQ7DQotICB3aWR0aDogMzBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAudG9wdGVybXMtaG9sZGVyIC5oZWFkIC5tYXgtaG9sZGVyDQotew0KLSAgY29sb3I6ICNjMGMwYzA7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLnRvcHRlcm1zLWhvbGRlciAuaGVhZCAubWF4LWhvbGRlcjpob3ZlciAubWF4DQotew0KLSAgY29sb3I6ICMwMDg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLnRvcHRlcm1zLWhvbGRlciAuaGVhZCAjcXVlcnlfbGluaw0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9xdWVzdGlvbi13aGl0ZS5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgY29sb3I6ICNjMGMwYzA7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotICBtYXJnaW4tbGVmdDogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50b3B0ZXJtcy1ob2xkZXIgLmhlYWQgI3F1ZXJ5X2xpbms6aG92ZXINCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcXVlc3Rpb24ucG5nICk7DQotfQ0KLQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLnRvcHRlcm1zLWhvbGRlciAuaGVhZCAjcXVlcnlfbGluayBzcGFuDQotew0KLSAgdmlzaWJpbGl0eTogaGlkZGVuOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50b3B0ZXJtcy1ob2xkZXIgLmhlYWQgI3F1ZXJ5X2xpbms6aG92ZXIgc3Bhbg0KLXsNCi0gIHZpc2liaWxpdHk6IHZpc2libGU7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAudG9wdGVybXMtaG9sZGVyIGxpDQotew0KLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICAjOTk5Ow0KLSAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KLX0NCi0NCi0vKiBwb3NzaWJsZSBvdmVyd3JpdGUgd2l0aCBpbmxpbmUgc3R5bGUgKi8NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgLnRvcHRlcm1zLWhvbGRlciBsaSBwDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogICM5OTk7DQotICBjb2xvcjogI2ZmZjsNCi0gIGZsb2F0OiBsZWZ0Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgLnRvcHRlcm1zLWhvbGRlciBsaSBwIHNwYW4NCi17DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHBhZGRpbmctcmlnaHQ6IDJweDsNCi0gIHRleHQtYWxpZ246IHJpZ2h0Ow0KLX0NCi0NCi0vKiBwb3NzaWJsZSBvdmVyd3JpdGUgd2l0aCBpbmxpbmUgc3R5bGUgKi8NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgLnRvcHRlcm1zLWhvbGRlciBsaSB1bA0KLXsNCi0gIG1hcmdpbi1sZWZ0OiAzMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgLnRvcHRlcm1zLWhvbGRlciBsaSBsaQ0KLXsNCi0gIGJvcmRlci10b3A6IDA7DQotICBtYXJnaW4tYm90dG9tOiAwOw0KLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyIC50b3B0ZXJtcy1ob2xkZXIgbGkgbGkub2RkDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyIC50b3B0ZXJtcy1ob2xkZXIgbGkgbGkgYQ0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgcGFkZGluZy1sZWZ0OiAycHg7DQotICBwYWRkaW5nLXJpZ2h0OiAycHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAudG9wdGVybXMtaG9sZGVyIGxpIGxpIGE6aG92ZXINCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzBjMGMwOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIHVsDQotew0KLSAgbWFyZ2luLWxlZnQ6IDI1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgbGkNCi17DQotICBtYXJnaW4tYm90dG9tOiAycHg7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICB3aWR0aDogMTUwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgbGkub2RkDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuaGlzdG9ncmFtLWhvbGRlciBsaSBkbCwNCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGR0DQotew0KLSAgcGFkZGluZy10b3A6IDFweDsNCi0gIHBhZGRpbmctYm90dG9tOiAxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgbGkgZGwNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzBjMGMwOw0KLSAgbWluLXdpZHRoOiAxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgbGkgZHQNCi17DQotICBjb2xvcjogI2EwYTBhMDsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIG92ZXJmbG93OiBoaWRkZW47DQotICBsZWZ0OiAtMjVweDsNCi0gIHRvcDogMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGR0IHNwYW4NCi17DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHBhZGRpbmctcmlnaHQ6IDRweDsNCi0gIHRleHQtYWxpZ246IHJpZ2h0Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGRkDQotew0KLSAgY2xlYXI6IGxlZnQ7DQotICBmbG9hdDogbGVmdDsNCi0gIG1hcmdpbi1sZWZ0OiAycHg7DQotICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpOmhvdmVyIGRsDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2IwYjBiMDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuaGlzdG9ncmFtLWhvbGRlciBsaTpob3ZlciBkdA0KLXsNCi0gIGNvbG9yOiAjMzMzOw0KLX0NCisvKgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyovCisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAubG9hZGVyCit7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7ICAgCit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3Nlci5sb2FkZWQKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvZGl2LmdpZiApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAyMSUgMDsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC15OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEKK3sKKyAgZmxvYXQ6IHJpZ2h0OworICB3aWR0aDogNzglOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQKK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIHdpZHRoOiAyMCU7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCBzZWxlY3QKK3sKKyAgd2lkdGg6IDEwMCU7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCBzZWxlY3Qgb3B0Z3JvdXAKK3sKKyAgZm9udC1zdHlsZTogbm9ybWFsOworICBwYWRkaW5nOiA1cHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCBzZWxlY3Qgb3B0aW9uCit7CisgIHBhZGRpbmctbGVmdDogMTBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkICNmLWRmLXQKK3sKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmMGYwZjA7CisgIHBhZGRpbmctYm90dG9tOiAxNXB4OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgLnVrZi1kc2YgZHQKK3sKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkIGRsCit7CisgIG1hcmdpbi10b3A6IDE1cHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCBkbCBkdCwKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCBkbCBkZCBhCit7CisgIGNvbG9yOiAjYzBjMGMwOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgZGwgZHQKK3sKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG1hcmdpbi10b3A6IDVweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkIGRsIGRkIGEKK3sKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmctbGVmdDogMTBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkIGRsIGRkIGE6aG92ZXIKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkIC5maWVsZCAuZmllbGQsCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgLmZpZWxkIC5maWVsZCBhLAorI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkIC5keW5hbWljLWZpZWxkIC5keW5hbWljLWZpZWxkLAorI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkIC5keW5hbWljLWZpZWxkIC5keW5hbWljLWZpZWxkIGEsCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgLnR5cGUgLnR5cGUsCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgLnR5cGUgLnR5cGUgYSwKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjcmVsYXRlZCAuYWN0aXZlLAorI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkIC5hY3RpdmUgYQoreworICBjb2xvcjogIzMzMzsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNyZWxhdGVkIC5jb3B5ZmllbGQsCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI3JlbGF0ZWQgLmNvcHlmaWVsZCBhCit7CisgIGNvbG9yOiAjNjY2OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEKK3sKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNpbmRleCBkdAoreworICBmbG9hdDogbGVmdDsKKyAgbWFyZ2luLXJpZ2h0OiA1cHg7CisgIHdpZHRoOiAxNTBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucworeworICBtYXJnaW4tYm90dG9tOiAxMHB4OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5oZWFkIGgyCit7CisgIHBhZGRpbmctbGVmdDogNXB4OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5wYXJ0aWFsCit7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLnBhcnRpYWwgcAoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZXhjbGFtYXRpb24tYnV0dG9uLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5vcHRpb25zIGR0LAorI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAub3B0aW9ucyBkZAoreworICBmbG9hdDogbGVmdDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAub3B0aW9ucyBkdAoreworICBjbGVhcjogbGVmdDsKKyAgbWFyZ2luLXJpZ2h0OiA1cHg7CisgIHdpZHRoOiAxMDBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MKK3sKKyAgbWFyZ2luLXRvcDogMTBweDsKKyAgbWFyZ2luLWJvdHRvbTogMjBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MgdGhlYWQgdGQKK3sKKyAgY29sb3I6ICNjMGMwYzA7CisgIHBhZGRpbmctcmlnaHQ6IDVweDsKKyAgd2lkdGg6IDEwMHB4OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSB0ZCwKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRoCit7CisgIHBhZGRpbmc6IDJweCA1cHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRoZWFkIHRkLAorI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MgdGJvZHkgdGgKK3sKKyAgcGFkZGluZy1sZWZ0OiAwOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0aGVhZCB0aCwKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRib2R5IHRkCit7CisgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2YwZjBmMDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MgdGJvZHkgdGgsCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSB0ZAoreworICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MgdGJvZHkgLmNoZWNrCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmYWZkZmE7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1MCUgNTAlOworICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRib2R5IC5jaGVjayBzcGFuCit7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRib2R5IC50ZXh0Cit7CisgIGNvbG9yOiAjYzBjMGMwOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciwKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIGxpLAorI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwsCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciB1bCBsaQoreworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciBwLAorI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgZGwKK3sKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHAKK3sKKyAgbWFyZ2luLXJpZ2h0OiA1cHg7CisgIHRleHQtYWxpZ246IHJpZ2h0OworICB3aWR0aDogMTI1cHg7CisgIHdoaXRlLXNwYWNlOiBwcmU7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHAgYQoreworICBjdXJzb3I6IGF1dG87Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHAgYS5hbmFseXNpcworeworICBjdXJzb3I6IHBvaW50ZXI7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciBwIGEuYW5hbHlzaXMgc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcXVlc3Rpb24td2hpdGUucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHAgYS5hbmFseXNpczpob3ZlciBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9xdWVzdGlvbi5wbmcgKTsKKyAgY29sb3I6ICMwMDg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIGEKK3sKKyAgY3Vyc29yOiBhdXRvOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciAudG9nZ2xlCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLWV4cGFuZC5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSA1MCU7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmctcmlnaHQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIC5vcGVuIC50b2dnbGUKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoZXZyb24tc21hbGwucG5nICk7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIGxpCit7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjBmMGYwOworICBtYXJnaW4tdG9wOiAxMHB4OworICBwYWRkaW5nLXRvcDogMTBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwKK3sKKyAgY2xlYXI6IGxlZnQ7CisgIG1hcmdpbi1sZWZ0OiA1NXB4OworICBwYWRkaW5nLXRvcDogNXB4OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciAub3BlbiB1bAoreworICBkaXNwbGF5OiBibG9jazsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwgbGkKK3sKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmOGY4Zjg7CisgIG1hcmdpbi10b3A6IDVweDsKKyAgcGFkZGluZy10b3A6IDVweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwgcAoreworICBjb2xvcjogIzk5OTsKKyAgbWFyZ2luLXJpZ2h0OiA1cHg7CisgIHRleHQtYWxpZ246IHJpZ2h0OworICB3aWR0aDogNzBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwgZGQKK3sKKyAgbWFyZ2luLWxlZnQ6IDIwcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHVsIGRkCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9kb2N1bWVudC1saXN0LnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgY29sb3I6ICNjMGMwYzA7CisgIHBhZGRpbmctbGVmdDogMjFweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwgZGQuaWNvLTAKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3NsYXNoLnBuZyApOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciB1bCBkZC5pY28tMQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuaGVhZAoreworICBtYXJnaW4tYm90dG9tOiA1cHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLnRlcm1pbmZvLWhvbGRlcgoreworICBib3JkZXItdG9wOiAxcHggc29saWQgI2MwYzBjMDsKKyAgcGFkZGluZy10b3A6IDEwcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLnRlcm1pbmZvLWhvbGRlciAudHJpZ2dlcgoreworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDE0MHB4OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIgLnRyaWdnZXIgYnV0dG9uIHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2luZm9ybWF0aW9uLnBuZyApOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIgLnN0YXR1cworeworICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNmMGYwZjA7CisgIGZsb2F0OiBsZWZ0OworICBwYWRkaW5nLWxlZnQ6IDIwcHg7CisgIHBhZGRpbmctcmlnaHQ6IDIwcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLnRlcm1pbmZvLWhvbGRlci5kaXNhYmxlZCAudHJpZ2dlciBidXR0b24gc3BhbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcHJvaGliaXRpb24ucG5nICk7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLnRlcm1pbmZvLWhvbGRlci5kaXNhYmxlZCAuc3RhdHVzCit7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIgLnRyaWdnZXIgLmF1dG9sb2FkCit7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLnRlcm1pbmZvLWhvbGRlci5sb2FkZWQgLnRyaWdnZXIgLmF1dG9sb2FkCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1jaGVjay1ib3gtdW5jaGVjay5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIGNvbG9yOiAjYzBjMGMwOworICBkaXNwbGF5OiBibG9jazsKKyAgbWFyZ2luLXRvcDogMTBweDsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIgLnRyaWdnZXIgLmF1dG9sb2FkOmhvdmVyCit7CisgIGNvbG9yOiAjMDA4OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIgLnRyaWdnZXIgLmF1dG9sb2FkLm9uCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1jaGVjay1ib3gucG5nICk7CisgIGNvbG9yOiAjMzMzOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50b3B0ZXJtcy1ob2xkZXIsCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyCit7CisgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2YwZjBmMDsKKyAgZmxvYXQ6IGxlZnQ7CisgIHBhZGRpbmctbGVmdDogMjBweDsKKyAgcGFkZGluZy1yaWdodDogMjBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAudG9wdGVybXMtaG9sZGVyIC5oZWFkIGlucHV0Cit7CisgIGhlaWdodDogMThweDsKKyAgbGluZS1oZWlnaHQ6IDE2cHg7CisgIHRleHQtYWxpZ246IHJpZ2h0OworICB3aWR0aDogMzBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAudG9wdGVybXMtaG9sZGVyIC5oZWFkIC5tYXgtaG9sZGVyCit7CisgIGNvbG9yOiAjYzBjMGMwOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50b3B0ZXJtcy1ob2xkZXIgLmhlYWQgLm1heC1ob2xkZXI6aG92ZXIgLm1heAoreworICBjb2xvcjogIzAwODsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAudG9wdGVybXMtaG9sZGVyIC5oZWFkICNxdWVyeV9saW5rCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9xdWVzdGlvbi13aGl0ZS5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIGNvbG9yOiAjYzBjMGMwOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7CisgIG1hcmdpbi1sZWZ0OiA1cHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAjZGF0YSAjZmllbGQgLnRvcHRlcm1zLWhvbGRlciAuaGVhZCAjcXVlcnlfbGluazpob3ZlcgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcXVlc3Rpb24ucG5nICk7Cit9CisKKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAudG9wdGVybXMtaG9sZGVyIC5oZWFkICNxdWVyeV9saW5rIHNwYW4KK3sKKyAgdmlzaWJpbGl0eTogaGlkZGVuOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC50b3B0ZXJtcy1ob2xkZXIgLmhlYWQgI3F1ZXJ5X2xpbms6aG92ZXIgc3BhbgoreworICB2aXNpYmlsaXR5OiB2aXNpYmxlOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgLnRvcHRlcm1zLWhvbGRlciBsaQoreworICBib3JkZXItdG9wOiAxcHggc29saWQgICM5OTk7CisgIG1hcmdpbi1ib3R0b206IDVweDsKK30KKworLyogcG9zc2libGUgb3ZlcndyaXRlIHdpdGggaW5saW5lIHN0eWxlICovCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgLnRvcHRlcm1zLWhvbGRlciBsaSBwCit7CisgIGJhY2tncm91bmQtY29sb3I6ICAjOTk5OworICBjb2xvcjogI2ZmZjsKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAudG9wdGVybXMtaG9sZGVyIGxpIHAgc3BhbgoreworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZy1yaWdodDogMnB4OworICB0ZXh0LWFsaWduOiByaWdodDsKK30KKworLyogcG9zc2libGUgb3ZlcndyaXRlIHdpdGggaW5saW5lIHN0eWxlICovCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgLnRvcHRlcm1zLWhvbGRlciBsaSB1bAoreworICBtYXJnaW4tbGVmdDogMzBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyIC50b3B0ZXJtcy1ob2xkZXIgbGkgbGkKK3sKKyAgYm9yZGVyLXRvcDogMDsKKyAgbWFyZ2luLWJvdHRvbTogMDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyIC50b3B0ZXJtcy1ob2xkZXIgbGkgbGkub2RkCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAudG9wdGVybXMtaG9sZGVyIGxpIGxpIGEKK3sKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmctbGVmdDogMnB4OworICBwYWRkaW5nLXJpZ2h0OiAycHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEtYnJvd3NlciAudG9wdGVybXMtaG9sZGVyIGxpIGxpIGE6aG92ZXIKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2MwYzBjMDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuaGlzdG9ncmFtLWhvbGRlciB1bAoreworICBtYXJnaW4tbGVmdDogMjVweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuaGlzdG9ncmFtLWhvbGRlciBsaQoreworICBtYXJnaW4tYm90dG9tOiAycHg7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgd2lkdGg6IDE1MHB4OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpLm9kZAoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGRsLAorI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuaGlzdG9ncmFtLWhvbGRlciBsaSBkdAoreworICBwYWRkaW5nLXRvcDogMXB4OworICBwYWRkaW5nLWJvdHRvbTogMXB4OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGRsCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNjMGMwYzA7CisgIG1pbi13aWR0aDogMXB4OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGR0Cit7CisgIGNvbG9yOiAjYTBhMGEwOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGxlZnQ6IC0yNXB4OworICB0b3A6IDBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuaGlzdG9ncmFtLWhvbGRlciBsaSBkdCBzcGFuCit7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nLXJpZ2h0OiA0cHg7CisgIHRleHQtYWxpZ246IHJpZ2h0OworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGRkCit7CisgIGNsZWFyOiBsZWZ0OworICBmbG9hdDogbGVmdDsKKyAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworI2NvbnRlbnQgI3NjaGVtYS1icm93c2VyICNkYXRhICNmaWVsZCAuaGlzdG9ncmFtLWhvbGRlciBsaTpob3ZlciBkbAoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjYjBiMGIwOworfQorCisjY29udGVudCAjc2NoZW1hLWJyb3dzZXIgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpOmhvdmVyIGR0Cit7CisgIGNvbG9yOiAjMzMzOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL3NjaGVtYS5jc3MgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvc2NoZW1hLmNzcwppbmRleCBhZDkwOWFjLi4wZGEyNWE2IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvc2NoZW1hLmNzcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvc2NoZW1hLmNzcwpAQCAtMSw3MDQgKzEsNzA0IEBACi0vKg0KLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotKi8NCi0NCi0jY29udGVudCAjc2NoZW1hIC5sb2FkZXINCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsNCi0gIHBhZGRpbmctbGVmdDogMjFweDsgICANCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYS5sb2FkZWQNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9kaXYuZ2lmICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAyMSUgMDsNCi0gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteTsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YQ0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHdpZHRoOiA3OCU7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQNCi17DQotICBmbG9hdDogbGVmdDsNCi0gIHdpZHRoOiAyMCU7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgc2VsZWN0DQotew0KLSAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgc2VsZWN0IG9wdGdyb3VwDQotew0KLSAgZm9udC1zdHlsZTogbm9ybWFsOw0KLSAgcGFkZGluZzogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNyZWxhdGVkIHNlbGVjdCBvcHRpb24NCi17DQotICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgI2YtZGYtdA0KLXsNCi0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgcGFkZGluZy1ib3R0b206IDE1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgLnVrZi1kc2YgZHQNCi17DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgZGwNCi17DQotICBtYXJnaW4tdG9wOiAxNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNyZWxhdGVkIGRsIGR0LA0KLSNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgZGwgZGQgYQ0KLXsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNyZWxhdGVkIGRsIGR0DQotew0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBtYXJnaW4tdG9wOiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgZGwgZGQgYQ0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNyZWxhdGVkIGRsIGRkIGE6aG92ZXINCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNyZWxhdGVkIC5maWVsZCAuZmllbGQsDQotI2NvbnRlbnQgI3NjaGVtYSAjcmVsYXRlZCAuZmllbGQgLmZpZWxkIGEsDQotI2NvbnRlbnQgI3NjaGVtYSAjcmVsYXRlZCAuZHluYW1pYy1maWVsZCAuZHluYW1pYy1maWVsZCwNCi0jY29udGVudCAjc2NoZW1hICNyZWxhdGVkIC5keW5hbWljLWZpZWxkIC5keW5hbWljLWZpZWxkIGEsDQotI2NvbnRlbnQgI3NjaGVtYSAjcmVsYXRlZCAudHlwZSAudHlwZSwNCi0jY29udGVudCAjc2NoZW1hICNyZWxhdGVkIC50eXBlIC50eXBlIGEsDQotI2NvbnRlbnQgI3NjaGVtYSAjcmVsYXRlZCAuYWN0aXZlLA0KLSNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgLmFjdGl2ZSBhDQotew0KLSAgY29sb3I6ICMzMzM7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgLmNvcHlmaWVsZCwNCi0jY29udGVudCAjc2NoZW1hICNyZWxhdGVkIC5jb3B5ZmllbGQgYQ0KLXsNCi0gIGNvbG9yOiAjNjY2Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhDQotew0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNpbmRleCBkdA0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgbWFyZ2luLXJpZ2h0OiA1cHg7DQotICB3aWR0aDogMTUwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zDQotew0KLSAgbWFyZ2luLWJvdHRvbTogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmhlYWQgaDINCi17DQotICBwYWRkaW5nLWxlZnQ6IDVweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLnBhcnRpYWwNCi17DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5wYXJ0aWFsIHANCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZXhjbGFtYXRpb24tYnV0dG9uLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5vcHRpb25zIGR0LA0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5vcHRpb25zIGRkDQotew0KLSAgZmxvYXQ6IGxlZnQ7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5vcHRpb25zIGR0DQotew0KLSAgY2xlYXI6IGxlZnQ7DQotICBtYXJnaW4tcmlnaHQ6IDVweDsNCi0gIHdpZHRoOiAxMDBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzDQotew0KLSAgbWFyZ2luLXRvcDogMTBweDsNCi0gIG1hcmdpbi1ib3R0b206IDIwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0aGVhZCB0ZA0KLXsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLSAgcGFkZGluZy1yaWdodDogNXB4Ow0KLSAgd2lkdGg6IDEwMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MgdGJvZHkgdGQsDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRoDQotew0KLSAgcGFkZGluZzogMnB4IDVweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRoZWFkIHRkLA0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSB0aA0KLXsNCi0gIHBhZGRpbmctbGVmdDogMDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRoZWFkIHRoLA0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSB0ZA0KLXsNCi0gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2YwZjBmMDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRib2R5IHRoLA0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSB0ZA0KLXsNCi0gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjBmMGYwOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MgdGJvZHkgLmNoZWNrDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmRmYTsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTsNCi0gIHRleHQtYWxpZ246IGNlbnRlcjsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRib2R5IC5jaGVjayBzcGFuDQotew0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MgdGJvZHkgLnRleHQNCi17DQotICBjb2xvcjogI2MwYzBjMDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyLA0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciBsaSwNCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwsDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHVsIGxpDQotew0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgcCwNCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgZGwNCi17DQotICBmbG9hdDogbGVmdDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHANCi17DQotICBtYXJnaW4tcmlnaHQ6IDVweDsNCi0gIHRleHQtYWxpZ246IHJpZ2h0Ow0KLSAgd2lkdGg6IDEyNXB4Ow0KLSAgd2hpdGUtc3BhY2U6IHByZTsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHAgYQ0KLXsNCi0gIGN1cnNvcjogYXV0bzsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHAgYS5hbmFseXNpcw0KLXsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgcCBhLmFuYWx5c2lzIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcXVlc3Rpb24td2hpdGUucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsNCi0gIHBhZGRpbmctbGVmdDogMjFweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHAgYS5hbmFseXNpczpob3ZlciBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3F1ZXN0aW9uLnBuZyApOw0KLSAgY29sb3I6ICMwMDg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciBhDQotew0KLSAgY3Vyc29yOiBhdXRvOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgLnRvZ2dsZQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLWV4cGFuZC5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgNTAlOw0KLSAgY3Vyc29yOiBwb2ludGVyOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBwYWRkaW5nLXJpZ2h0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgLm9wZW4gLnRvZ2dsZQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgbGkNCi17DQotICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsNCi0gIG1hcmdpbi10b3A6IDEwcHg7DQotICBwYWRkaW5nLXRvcDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHVsDQotew0KLSAgY2xlYXI6IGxlZnQ7DQotICBtYXJnaW4tbGVmdDogNTVweDsNCi0gIHBhZGRpbmctdG9wOiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciAub3BlbiB1bA0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwgbGkNCi17DQotICBib3JkZXItdG9wOiAxcHggc29saWQgI2Y4ZjhmODsNCi0gIG1hcmdpbi10b3A6IDVweDsNCi0gIHBhZGRpbmctdG9wOiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciB1bCBwDQotew0KLSAgY29sb3I6ICM5OTk7DQotICBtYXJnaW4tcmlnaHQ6IDVweDsNCi0gIHRleHQtYWxpZ246IHJpZ2h0Ow0KLSAgd2lkdGg6IDcwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciB1bCBkZA0KLXsNCi0gIG1hcmdpbi1sZWZ0OiAyMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwgZGQNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZG9jdW1lbnQtbGlzdC5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgY29sb3I6ICNjMGMwYzA7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciB1bCBkZC5pY28tMA0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9zbGFzaC5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHVsIGRkLmljby0xDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5oZWFkDQotew0KLSAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyDQotew0KLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjMGMwYzA7DQotICBwYWRkaW5nLXRvcDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLnRlcm1pbmZvLWhvbGRlciAudHJpZ2dlcg0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgd2lkdGg6IDE0MHB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyIC50cmlnZ2VyIGJ1dHRvbiBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2luZm9ybWF0aW9uLnBuZyApOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyIC5zdGF0dXMNCi17DQotICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNmMGYwZjA7DQotICBmbG9hdDogbGVmdDsNCi0gIHBhZGRpbmctbGVmdDogMjBweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDIwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIuZGlzYWJsZWQgLnRyaWdnZXIgYnV0dG9uIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcHJvaGliaXRpb24ucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIuZGlzYWJsZWQgLnN0YXR1cw0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyIC50cmlnZ2VyIC5hdXRvbG9hZA0KLXsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLnRlcm1pbmZvLWhvbGRlci5sb2FkZWQgLnRyaWdnZXIgLmF1dG9sb2FkDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3VpLWNoZWNrLWJveC11bmNoZWNrLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBjb2xvcjogI2MwYzBjMDsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgbWFyZ2luLXRvcDogMTBweDsNCi0gIHBhZGRpbmctbGVmdDogMjFweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLnRlcm1pbmZvLWhvbGRlciAudHJpZ2dlciAuYXV0b2xvYWQ6aG92ZXINCi17DQotICBjb2xvcjogIzAwODsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLnRlcm1pbmZvLWhvbGRlciAudHJpZ2dlciAuYXV0b2xvYWQub24NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdWktY2hlY2stYm94LnBuZyApOw0KLSAgY29sb3I6ICMzMzM7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC50b3B0ZXJtcy1ob2xkZXIsDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXINCi17DQotICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNmMGYwZjA7DQotICBmbG9hdDogbGVmdDsNCi0gIHBhZGRpbmctbGVmdDogMjBweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDIwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC50b3B0ZXJtcy1ob2xkZXIgLmhlYWQgaW5wdXQNCi17DQotICBoZWlnaHQ6IDE4cHg7DQotICBsaW5lLWhlaWdodDogMTZweDsNCi0gIHRleHQtYWxpZ246IHJpZ2h0Ow0KLSAgd2lkdGg6IDMwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC50b3B0ZXJtcy1ob2xkZXIgLmhlYWQgLm1heC1ob2xkZXINCi17DQotICBjb2xvcjogI2MwYzBjMDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLnRvcHRlcm1zLWhvbGRlciAuaGVhZCAubWF4LWhvbGRlcjpob3ZlciAubWF4DQotew0KLSAgY29sb3I6ICMwMDg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC50b3B0ZXJtcy1ob2xkZXIgLmhlYWQgI3F1ZXJ5X2xpbmsNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcXVlc3Rpb24td2hpdGUucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsNCi0gIGNvbG9yOiAjYzBjMGMwOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLSAgbWFyZ2luLWxlZnQ6IDVweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLnRvcHRlcm1zLWhvbGRlciAuaGVhZCAjcXVlcnlfbGluazpob3Zlcg0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9xdWVzdGlvbi5wbmcgKTsNCi19DQotDQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLnRvcHRlcm1zLWhvbGRlciAuaGVhZCAjcXVlcnlfbGluayBzcGFuDQotew0KLSAgdmlzaWJpbGl0eTogaGlkZGVuOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudG9wdGVybXMtaG9sZGVyIC5oZWFkICNxdWVyeV9saW5rOmhvdmVyIHNwYW4NCi17DQotICB2aXNpYmlsaXR5OiB2aXNpYmxlOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hIC50b3B0ZXJtcy1ob2xkZXIgbGkNCi17DQotICBib3JkZXItdG9wOiAxcHggc29saWQgICM5OTk7DQotICBtYXJnaW4tYm90dG9tOiA1cHg7DQotfQ0KLQ0KLS8qIHBvc3NpYmxlIG92ZXJ3cml0ZSB3aXRoIGlubGluZSBzdHlsZSAqLw0KLSNjb250ZW50ICNzY2hlbWEgLnRvcHRlcm1zLWhvbGRlciBsaSBwDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogICM5OTk7DQotICBjb2xvcjogI2ZmZjsNCi0gIGZsb2F0OiBsZWZ0Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hIC50b3B0ZXJtcy1ob2xkZXIgbGkgcCBzcGFuDQotew0KLSAgZGlzcGxheTogYmxvY2s7DQotICBwYWRkaW5nLXJpZ2h0OiAycHg7DQotICB0ZXh0LWFsaWduOiByaWdodDsNCi19DQotDQotLyogcG9zc2libGUgb3ZlcndyaXRlIHdpdGggaW5saW5lIHN0eWxlICovDQotI2NvbnRlbnQgI3NjaGVtYSAudG9wdGVybXMtaG9sZGVyIGxpIHVsDQotew0KLSAgbWFyZ2luLWxlZnQ6IDMwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgLnRvcHRlcm1zLWhvbGRlciBsaSBsaQ0KLXsNCi0gIGJvcmRlci10b3A6IDA7DQotICBtYXJnaW4tYm90dG9tOiAwOw0KLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAudG9wdGVybXMtaG9sZGVyIGxpIGxpLm9kZA0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgLnRvcHRlcm1zLWhvbGRlciBsaSBsaSBhDQotew0KLSAgZGlzcGxheTogYmxvY2s7DQotICBwYWRkaW5nLWxlZnQ6IDJweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDJweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAudG9wdGVybXMtaG9sZGVyIGxpIGxpIGE6aG92ZXINCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzBjMGMwOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuaGlzdG9ncmFtLWhvbGRlciB1bA0KLXsNCi0gIG1hcmdpbi1sZWZ0OiAyNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuaGlzdG9ncmFtLWhvbGRlciBsaQ0KLXsNCi0gIG1hcmdpbi1ib3R0b206IDJweDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIHdpZHRoOiAxNTBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgbGkub2RkDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgbGkgZGwsDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgbGkgZHQNCi17DQotICBwYWRkaW5nLXRvcDogMXB4Ow0KLSAgcGFkZGluZy1ib3R0b206IDFweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgbGkgZGwNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzBjMGMwOw0KLSAgbWluLXdpZHRoOiAxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGR0DQotew0KLSAgY29sb3I6ICNhMGEwYTA7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICBvdmVyZmxvdzogaGlkZGVuOw0KLSAgbGVmdDogLTI1cHg7DQotICB0b3A6IDBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgbGkgZHQgc3Bhbg0KLXsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgcGFkZGluZy1yaWdodDogNHB4Ow0KLSAgdGV4dC1hbGlnbjogcmlnaHQ7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGRkDQotew0KLSAgY2xlYXI6IGxlZnQ7DQotICBmbG9hdDogbGVmdDsNCi0gIG1hcmdpbi1sZWZ0OiAycHg7DQotICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuaGlzdG9ncmFtLWhvbGRlciBsaTpob3ZlciBkbA0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNiMGIwYjA7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpOmhvdmVyIGR0DQotew0KLSAgY29sb3I6ICMzMzM7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgI2FjdGlvbnMgew0KLSAgbWFyZ2luLWJvdHRvbTogMjBweDsNCi0gIG1pbi1oZWlnaHQ6IDMwcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgI2FkZEZpZWxkIHNwYW4geyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZG9jdW1lbnQtbGlzdC5wbmcgKTsgfQ0KLSNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgI2FkZER5bmFtaWNGaWVsZCBzcGFuIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2RvY3VtZW50cy1zdGFjay5wbmcgKTsgfQ0KLSNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgI2FkZENvcHlGaWVsZCBzcGFuIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2RvY3VtZW50LWltcG9ydC5wbmcgKTsgfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgZGl2LmFjdGlvbg0KLXsNCi0gIHdpZHRoOiAzMjBweDsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQotICBib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgYm94LXNoYWRvdzogNXB4IDVweCAxMHB4ICNjMGMwYzA7DQotICAtbW96LWJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOw0KLSAgLXdlYmtpdC1ib3gtc2hhZG93OiA1cHggNXB4IDEwcHggI2MwYzBjMDsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIGxlZnQ6IDE2MHB4Ow0KLSAgdG9wOiA1MHB4Ow0KLSAgcGFkZGluZzogMTBweDsNCi0gIHotaW5kZXg6IDI7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgcA0KLXsNCi0gIHBhZGRpbmctYm90dG9tOiA4cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgbGFiZWwNCi17DQotICBmbG9hdDogbGVmdDsNCi0gIHBhZGRpbmctdG9wOiAzcHg7DQotICBwYWRkaW5nLWJvdHRvbTogM3B4Ow0KLSAgdGV4dC1hbGlnbjogcmlnaHQ7DQotICB3aWR0aDogMjUlOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hIC5hY3Rpb25zIGlucHV0LA0KLSNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgc2VsZWN0LA0KLSNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgLmJ1dHRvbnMsDQotI2NvbnRlbnQgI3NjaGVtYSAuYWN0aW9ucyAubm90ZSBzcGFuDQotew0KLSAgZmxvYXQ6IHJpZ2h0Ow0KLSAgd2lkdGg6IDcxJTsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAuYWN0aW9ucyBsYWJlbC5jaGVja2JveCB7DQotICBtYXJnaW4tbGVmdDogMjclOw0KLSAgdGV4dC1hbGlnbjogbGVmdDsNCi0gIHdpZHRoOiA3MyU7DQotICBwYWRkaW5nOiAwcHg7DQotICBtYXJnaW4tdG9wOiAwcHg7DQotfQ0KLSNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgLmNoZWNrYm94IGlucHV0IHsNCi0gIGZsb2F0OiBub25lOw0KLSAgd2lkdGg6IGF1dG87DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgLmFkZF9zaG93aGlkZSB7DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hldnJvbi1zbWFsbC1leHBhbmQucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMDAlIDUwJTsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi0gIHBhZGRpbmctcmlnaHQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgLmFkZF9zaG93aGlkZS5vcGVuIHsNCi0gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoZXZyb24tc21hbGwucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgbGFiZWwNCi17DQotICBjdXJzb3I6IHBvaW50ZXI7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIG1hcmdpbi10b3A6IDVweDsNCi0gIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi0jY29udGVudCAjc2NoZW1hIC5jaGVja2JveA0KLXsNCi0gIG1hcmdpbi1ib3R0b206IDA7DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAuY2hvc2VuLWNvbnRhaW5lciB7DQotICBtYXJnaW4tbGVmdDogNnB4Ow0KLSAgd2lkdGg6IDEwMCU7DQotfQ0KLSNjb250ZW50ICNzY2hlbWEgLmNob3Nlbi1kcm9wIGlucHV0LA0KLSNjb250ZW50ICNzY2hlbWEgLmNob3Nlbi1yZXN1bHRzIHsNCi0gIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgYnV0dG9uIHNwYW4NCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MucG5nICk7DQotfQ0KLSNjb250ZW50ICNzY2hlbWEgYnV0dG9uLnN1Ym1pdCBzcGFuDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgLmVycm9yDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLWJ1dHRvbi5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDIyJSAxcHg7DQotICBjb2xvcjogI2MwMDsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgbWFyZ2luLWJvdHRvbTogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAjYWN0aW9ucyAuZXJyb3Igc3Bhbg0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHdpZHRoOiA3MSU7DQotICBwYWRkaW5nLWxlZnQ6IDNweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDNweDsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSAuZGVsZXRlLWZpZWxkIGJ1dHRvbiBzcGFuIHsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI3NjaGVtYSBzcGFuLnJlbSB7DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY3Jvc3MucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMDAlIDUwJTsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi0gIHBhZGRpbmctcmlnaHQ6IDIxcHg7DQotICByaWdodDoxMHB4Ow0KLSAgZmxvYXQ6cmlnaHQ7DQotfQ0KLQ0KLSNjb250ZW50ICNzY2hlbWEgLmNvcHlmaWVsZCAudXBkYXRhYmxlIGEgew0KLSAgZmxvYXQ6bGVmdDsNCi0gIHdpZHRoOjgwJTsNCi19DQorLyoKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisqLworCisjY29udGVudCAjc2NoZW1hIC5sb2FkZXIKK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIHBhZGRpbmctbGVmdDogMjFweDsgICAKK30KKworI2NvbnRlbnQgI3NjaGVtYS5sb2FkZWQKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvZGl2LmdpZiApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAyMSUgMDsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC15OworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhCit7CisgIGZsb2F0OiByaWdodDsKKyAgd2lkdGg6IDc4JTsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjcmVsYXRlZAoreworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDIwJTsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjcmVsYXRlZCBzZWxlY3QKK3sKKyAgd2lkdGg6IDEwMCU7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgc2VsZWN0IG9wdGdyb3VwCit7CisgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgcGFkZGluZzogNXB4OworfQorCisjY29udGVudCAjc2NoZW1hICNyZWxhdGVkIHNlbGVjdCBvcHRpb24KK3sKKyAgcGFkZGluZy1sZWZ0OiAxMHB4OworfQorCisjY29udGVudCAjc2NoZW1hICNyZWxhdGVkICNmLWRmLXQKK3sKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmMGYwZjA7CisgIHBhZGRpbmctYm90dG9tOiAxNXB4OworfQorCisjY29udGVudCAjc2NoZW1hICNyZWxhdGVkIC51a2YtZHNmIGR0Cit7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgZGwKK3sKKyAgbWFyZ2luLXRvcDogMTVweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjcmVsYXRlZCBkbCBkdCwKKyNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgZGwgZGQgYQoreworICBjb2xvcjogI2MwYzBjMDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjcmVsYXRlZCBkbCBkdAoreworICBmb250LXdlaWdodDogYm9sZDsKKyAgbWFyZ2luLXRvcDogNXB4OworfQorCisjY29udGVudCAjc2NoZW1hICNyZWxhdGVkIGRsIGRkIGEKK3sKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmctbGVmdDogMTBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjcmVsYXRlZCBkbCBkZCBhOmhvdmVyCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgLmZpZWxkIC5maWVsZCwKKyNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgLmZpZWxkIC5maWVsZCBhLAorI2NvbnRlbnQgI3NjaGVtYSAjcmVsYXRlZCAuZHluYW1pYy1maWVsZCAuZHluYW1pYy1maWVsZCwKKyNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgLmR5bmFtaWMtZmllbGQgLmR5bmFtaWMtZmllbGQgYSwKKyNjb250ZW50ICNzY2hlbWEgI3JlbGF0ZWQgLnR5cGUgLnR5cGUsCisjY29udGVudCAjc2NoZW1hICNyZWxhdGVkIC50eXBlIC50eXBlIGEsCisjY29udGVudCAjc2NoZW1hICNyZWxhdGVkIC5hY3RpdmUsCisjY29udGVudCAjc2NoZW1hICNyZWxhdGVkIC5hY3RpdmUgYQoreworICBjb2xvcjogIzMzMzsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjcmVsYXRlZCAuY29weWZpZWxkLAorI2NvbnRlbnQgI3NjaGVtYSAjcmVsYXRlZCAuY29weWZpZWxkIGEKK3sKKyAgY29sb3I6ICM2NjY7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEKK3sKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjaW5kZXggZHQKK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIG1hcmdpbi1yaWdodDogNXB4OworICB3aWR0aDogMTUwcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zCit7CisgIG1hcmdpbi1ib3R0b206IDEwcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5oZWFkIGgyCit7CisgIHBhZGRpbmctbGVmdDogNXB4OworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAucGFydGlhbAoreworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAucGFydGlhbCBwCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9leGNsYW1hdGlvbi1idXR0b24ucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5vcHRpb25zIGR0LAorI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLm9wdGlvbnMgZGQKK3sKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5vcHRpb25zIGR0Cit7CisgIGNsZWFyOiBsZWZ0OworICBtYXJnaW4tcmlnaHQ6IDVweDsKKyAgd2lkdGg6IDEwMHB4OworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MKK3sKKyAgbWFyZ2luLXRvcDogMTBweDsKKyAgbWFyZ2luLWJvdHRvbTogMjBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRoZWFkIHRkCit7CisgIGNvbG9yOiAjYzBjMGMwOworICBwYWRkaW5nLXJpZ2h0OiA1cHg7CisgIHdpZHRoOiAxMDBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRib2R5IHRkLAorI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRoCit7CisgIHBhZGRpbmc6IDJweCA1cHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0aGVhZCB0ZCwKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSB0aAoreworICBwYWRkaW5nLWxlZnQ6IDA7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0aGVhZCB0aCwKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSB0ZAoreworICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNmMGYwZjA7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSB0aCwKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5mbGFncyB0Ym9keSB0ZAoreworICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRib2R5IC5jaGVjaworeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmZGZhOworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuZmxhZ3MgdGJvZHkgLmNoZWNrIHNwYW4KK3sKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmZsYWdzIHRib2R5IC50ZXh0Cit7CisgIGNvbG9yOiAjYzBjMGMwOworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIsCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgbGksCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwsCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwgbGkKK3sKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHAsCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgZGwKK3sKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciBwCit7CisgIG1hcmdpbi1yaWdodDogNXB4OworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgd2lkdGg6IDEyNXB4OworICB3aGl0ZS1zcGFjZTogcHJlOworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgcCBhCit7CisgIGN1cnNvcjogYXV0bzsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHAgYS5hbmFseXNpcworeworICBjdXJzb3I6IHBvaW50ZXI7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgcCBhLmFuYWx5c2lzIHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3F1ZXN0aW9uLXdoaXRlLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgcCBhLmFuYWx5c2lzOmhvdmVyIHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3F1ZXN0aW9uLnBuZyApOworICBjb2xvcjogIzAwODsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIGEKK3sKKyAgY3Vyc29yOiBhdXRvOworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgLnRvZ2dsZQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hldnJvbi1zbWFsbC1leHBhbmQucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgNTAlOworICBjdXJzb3I6IHBvaW50ZXI7CisgIGRpc3BsYXk6IGJsb2NrOworICBwYWRkaW5nLXJpZ2h0OiAyMXB4OworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgLm9wZW4gLnRvZ2dsZQoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hldnJvbi1zbWFsbC5wbmcgKTsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIGxpCit7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjBmMGYwOworICBtYXJnaW4tdG9wOiAxMHB4OworICBwYWRkaW5nLXRvcDogMTBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHVsCit7CisgIGNsZWFyOiBsZWZ0OworICBtYXJnaW4tbGVmdDogNTVweDsKKyAgcGFkZGluZy10b3A6IDVweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIC5vcGVuIHVsCit7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuZmllbGQtb3B0aW9ucyAuYW5hbHl6ZXIgdWwgbGkKK3sKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmOGY4Zjg7CisgIG1hcmdpbi10b3A6IDVweDsKKyAgcGFkZGluZy10b3A6IDVweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHVsIHAKK3sKKyAgY29sb3I6ICM5OTk7CisgIG1hcmdpbi1yaWdodDogNXB4OworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgd2lkdGg6IDcwcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5maWVsZC1vcHRpb25zIC5hbmFseXplciB1bCBkZAoreworICBtYXJnaW4tbGVmdDogMjBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHVsIGRkCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9kb2N1bWVudC1saXN0LnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgY29sb3I6ICNjMGMwYzA7CisgIHBhZGRpbmctbGVmdDogMjFweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHVsIGRkLmljby0wCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9zbGFzaC5wbmcgKTsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmZpZWxkLW9wdGlvbnMgLmFuYWx5emVyIHVsIGRkLmljby0xCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby90aWNrLnBuZyApOworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuaGVhZAoreworICBtYXJnaW4tYm90dG9tOiA1cHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIKK3sKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjMGMwYzA7CisgIHBhZGRpbmctdG9wOiAxMHB4OworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyIC50cmlnZ2VyCit7CisgIGZsb2F0OiBsZWZ0OworICB3aWR0aDogMTQwcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIgLnRyaWdnZXIgYnV0dG9uIHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2luZm9ybWF0aW9uLnBuZyApOworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyIC5zdGF0dXMKK3sKKyAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZjBmMGYwOworICBmbG9hdDogbGVmdDsKKyAgcGFkZGluZy1sZWZ0OiAyMHB4OworICBwYWRkaW5nLXJpZ2h0OiAyMHB4OworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyLmRpc2FibGVkIC50cmlnZ2VyIGJ1dHRvbiBzcGFuCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9wcm9oaWJpdGlvbi5wbmcgKTsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLnRlcm1pbmZvLWhvbGRlci5kaXNhYmxlZCAuc3RhdHVzCit7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyIC50cmlnZ2VyIC5hdXRvbG9hZAoreworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyLmxvYWRlZCAudHJpZ2dlciAuYXV0b2xvYWQKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3VpLWNoZWNrLWJveC11bmNoZWNrLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgY29sb3I6ICNjMGMwYzA7CisgIGRpc3BsYXk6IGJsb2NrOworICBtYXJnaW4tdG9wOiAxMHB4OworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC50ZXJtaW5mby1ob2xkZXIgLnRyaWdnZXIgLmF1dG9sb2FkOmhvdmVyCit7CisgIGNvbG9yOiAjMDA4OworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudGVybWluZm8taG9sZGVyIC50cmlnZ2VyIC5hdXRvbG9hZC5vbgoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdWktY2hlY2stYm94LnBuZyApOworICBjb2xvcjogIzMzMzsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLnRvcHRlcm1zLWhvbGRlciwKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyCit7CisgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2YwZjBmMDsKKyAgZmxvYXQ6IGxlZnQ7CisgIHBhZGRpbmctbGVmdDogMjBweDsKKyAgcGFkZGluZy1yaWdodDogMjBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLnRvcHRlcm1zLWhvbGRlciAuaGVhZCBpbnB1dAoreworICBoZWlnaHQ6IDE4cHg7CisgIGxpbmUtaGVpZ2h0OiAxNnB4OworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgd2lkdGg6IDMwcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC50b3B0ZXJtcy1ob2xkZXIgLmhlYWQgLm1heC1ob2xkZXIKK3sKKyAgY29sb3I6ICNjMGMwYzA7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC50b3B0ZXJtcy1ob2xkZXIgLmhlYWQgLm1heC1ob2xkZXI6aG92ZXIgLm1heAoreworICBjb2xvcjogIzAwODsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLnRvcHRlcm1zLWhvbGRlciAuaGVhZCAjcXVlcnlfbGluaworeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vcXVlc3Rpb24td2hpdGUucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOworICBjb2xvcjogI2MwYzBjMDsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworICBtYXJnaW4tbGVmdDogNXB4OworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudG9wdGVybXMtaG9sZGVyIC5oZWFkICNxdWVyeV9saW5rOmhvdmVyCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9xdWVzdGlvbi5wbmcgKTsKK30KKworCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudG9wdGVybXMtaG9sZGVyIC5oZWFkICNxdWVyeV9saW5rIHNwYW4KK3sKKyAgdmlzaWJpbGl0eTogaGlkZGVuOworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAudG9wdGVybXMtaG9sZGVyIC5oZWFkICNxdWVyeV9saW5rOmhvdmVyIHNwYW4KK3sKKyAgdmlzaWJpbGl0eTogdmlzaWJsZTsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAudG9wdGVybXMtaG9sZGVyIGxpCit7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAgIzk5OTsKKyAgbWFyZ2luLWJvdHRvbTogNXB4OworfQorCisvKiBwb3NzaWJsZSBvdmVyd3JpdGUgd2l0aCBpbmxpbmUgc3R5bGUgKi8KKyNjb250ZW50ICNzY2hlbWEgLnRvcHRlcm1zLWhvbGRlciBsaSBwCit7CisgIGJhY2tncm91bmQtY29sb3I6ICAjOTk5OworICBjb2xvcjogI2ZmZjsKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgLnRvcHRlcm1zLWhvbGRlciBsaSBwIHNwYW4KK3sKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmctcmlnaHQ6IDJweDsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKy8qIHBvc3NpYmxlIG92ZXJ3cml0ZSB3aXRoIGlubGluZSBzdHlsZSAqLworI2NvbnRlbnQgI3NjaGVtYSAudG9wdGVybXMtaG9sZGVyIGxpIHVsCit7CisgIG1hcmdpbi1sZWZ0OiAzMHB4OworfQorCisjY29udGVudCAjc2NoZW1hIC50b3B0ZXJtcy1ob2xkZXIgbGkgbGkKK3sKKyAgYm9yZGVyLXRvcDogMDsKKyAgbWFyZ2luLWJvdHRvbTogMDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAudG9wdGVybXMtaG9sZGVyIGxpIGxpLm9kZAoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOworfQorCisjY29udGVudCAjc2NoZW1hIC50b3B0ZXJtcy1ob2xkZXIgbGkgbGkgYQoreworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZy1sZWZ0OiAycHg7CisgIHBhZGRpbmctcmlnaHQ6IDJweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAudG9wdGVybXMtaG9sZGVyIGxpIGxpIGE6aG92ZXIKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2MwYzBjMDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgdWwKK3sKKyAgbWFyZ2luLWxlZnQ6IDI1cHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpCit7CisgIG1hcmdpbi1ib3R0b206IDJweDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB3aWR0aDogMTUwcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpLm9kZAoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuaGlzdG9ncmFtLWhvbGRlciBsaSBkbCwKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGR0Cit7CisgIHBhZGRpbmctdG9wOiAxcHg7CisgIHBhZGRpbmctYm90dG9tOiAxcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGRsCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNjMGMwYzA7CisgIG1pbi13aWR0aDogMXB4OworfQorCisjY29udGVudCAjc2NoZW1hICNkYXRhICNmaWVsZCAuaGlzdG9ncmFtLWhvbGRlciBsaSBkdAoreworICBjb2xvcjogI2EwYTBhMDsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBvdmVyZmxvdzogaGlkZGVuOworICBsZWZ0OiAtMjVweDsKKyAgdG9wOiAwcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGR0IHNwYW4KK3sKKyAgZGlzcGxheTogYmxvY2s7CisgIHBhZGRpbmctcmlnaHQ6IDRweDsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2RhdGEgI2ZpZWxkIC5oaXN0b2dyYW0taG9sZGVyIGxpIGRkCit7CisgIGNsZWFyOiBsZWZ0OworICBmbG9hdDogbGVmdDsKKyAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgbGk6aG92ZXIgZGwKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2IwYjBiMDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjZGF0YSAjZmllbGQgLmhpc3RvZ3JhbS1ob2xkZXIgbGk6aG92ZXIgZHQKK3sKKyAgY29sb3I6ICMzMzM7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgI2FjdGlvbnMgeworICBtYXJnaW4tYm90dG9tOiAyMHB4OworICBtaW4taGVpZ2h0OiAzMHB4OworfQorCisjY29udGVudCAjc2NoZW1hIC5hY3Rpb25zICNhZGRGaWVsZCBzcGFuIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2RvY3VtZW50LWxpc3QucG5nICk7IH0KKyNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgI2FkZER5bmFtaWNGaWVsZCBzcGFuIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2RvY3VtZW50cy1zdGFjay5wbmcgKTsgfQorI2NvbnRlbnQgI3NjaGVtYSAuYWN0aW9ucyAjYWRkQ29weUZpZWxkIHNwYW4geyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vZG9jdW1lbnQtaW1wb3J0LnBuZyApOyB9CisKKyNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgZGl2LmFjdGlvbgoreworICB3aWR0aDogMzIwcHg7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgIGJvcmRlcjogMXB4IHNvbGlkICNmMGYwZjA7CisgIGJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOworICAtbW96LWJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOworICAtd2Via2l0LWJveC1zaGFkb3c6IDVweCA1cHggMTBweCAjYzBjMGMwOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IDE2MHB4OworICB0b3A6IDUwcHg7CisgIHBhZGRpbmc6IDEwcHg7CisgIHotaW5kZXg6IDI7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgcAoreworICBwYWRkaW5nLWJvdHRvbTogOHB4OworfQorCisjY29udGVudCAjc2NoZW1hIC5hY3Rpb25zIGxhYmVsCit7CisgIGZsb2F0OiBsZWZ0OworICBwYWRkaW5nLXRvcDogM3B4OworICBwYWRkaW5nLWJvdHRvbTogM3B4OworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgd2lkdGg6IDI1JTsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAuYWN0aW9ucyBpbnB1dCwKKyNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgc2VsZWN0LAorI2NvbnRlbnQgI3NjaGVtYSAuYWN0aW9ucyAuYnV0dG9ucywKKyNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgLm5vdGUgc3BhbgoreworICBmbG9hdDogcmlnaHQ7CisgIHdpZHRoOiA3MSU7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgbGFiZWwuY2hlY2tib3ggeworICBtYXJnaW4tbGVmdDogMjclOworICB0ZXh0LWFsaWduOiBsZWZ0OworICB3aWR0aDogNzMlOworICBwYWRkaW5nOiAwcHg7CisgIG1hcmdpbi10b3A6IDBweDsKK30KKyNjb250ZW50ICNzY2hlbWEgLmFjdGlvbnMgLmNoZWNrYm94IGlucHV0IHsKKyAgZmxvYXQ6IG5vbmU7CisgIHdpZHRoOiBhdXRvOworfQorCisjY29udGVudCAjc2NoZW1hIC5hZGRfc2hvd2hpZGUgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hldnJvbi1zbWFsbC1leHBhbmQucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDEwMCUgNTAlOworICBjdXJzb3I6IHBvaW50ZXI7CisgIHBhZGRpbmctcmlnaHQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgLmFkZF9zaG93aGlkZS5vcGVuIHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hldnJvbi1zbWFsbC5wbmcgKTsKK30KKworI2NvbnRlbnQgI3NjaGVtYSBsYWJlbAoreworICBjdXJzb3I6IHBvaW50ZXI7CisgIGRpc3BsYXk6IGJsb2NrOworICBtYXJnaW4tdG9wOiA1cHg7CisgIHdpZHRoOiAxMDAlOworfQorCisjY29udGVudCAjc2NoZW1hIC5jaGVja2JveAoreworICBtYXJnaW4tYm90dG9tOiAwOworICB3aWR0aDogYXV0bzsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAuY2hvc2VuLWNvbnRhaW5lciB7CisgIG1hcmdpbi1sZWZ0OiA2cHg7CisgIHdpZHRoOiAxMDAlOworfQorI2NvbnRlbnQgI3NjaGVtYSAuY2hvc2VuLWRyb3AgaW5wdXQsCisjY29udGVudCAjc2NoZW1hIC5jaG9zZW4tcmVzdWx0cyB7CisgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgYnV0dG9uIHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Nyb3NzLnBuZyApOworfQorI2NvbnRlbnQgI3NjaGVtYSBidXR0b24uc3VibWl0IHNwYW4KK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2sucG5nICk7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgLmVycm9yCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy1idXR0b24ucG5nICk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDIyJSAxcHg7CisgIGNvbG9yOiAjYzAwOworICBmb250LXdlaWdodDogYm9sZDsKKyAgbWFyZ2luLWJvdHRvbTogMTBweDsKK30KKworI2NvbnRlbnQgI3NjaGVtYSAjYWN0aW9ucyAuZXJyb3Igc3BhbgoreworICBmbG9hdDogcmlnaHQ7CisgIHdpZHRoOiA3MSU7CisgIHBhZGRpbmctbGVmdDogM3B4OworICBwYWRkaW5nLXJpZ2h0OiAzcHg7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgLmRlbGV0ZS1maWVsZCBidXR0b24gc3BhbiB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy5wbmcgKTsKK30KKworI2NvbnRlbnQgI3NjaGVtYSBzcGFuLnJlbSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jcm9zcy5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSA1MCU7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgcGFkZGluZy1yaWdodDogMjFweDsKKyAgcmlnaHQ6MTBweDsKKyAgZmxvYXQ6cmlnaHQ7Cit9CisKKyNjb250ZW50ICNzY2hlbWEgLmNvcHlmaWVsZCAudXBkYXRhYmxlIGEgeworICBmbG9hdDpsZWZ0OworICB3aWR0aDo4MCU7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvc2VnbWVudHMuY3NzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL3NlZ21lbnRzLmNzcwppbmRleCA4MDIzOTNjLi5hMThiNTNkIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvc2VnbWVudHMuY3NzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci9zZWdtZW50cy5jc3MKQEAgLTEsMTczICsxLDE3MyBAQAotLyoNCi0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSovDQotDQotI2NvbnRlbnQgI3NlZ21lbnRzIC5sb2FkZXINCi17DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsNCi0gIHBhZGRpbmctbGVmdDogMjFweDsNCi19DQotDQotI2NvbnRlbnQgI3NlZ21lbnRzIC5yZWxvYWQNCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctY2lyY2xlLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLSAgaGVpZ2h0OiAzMHB4Ow0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgcmlnaHQ6IDEwcHg7DQotICB0b3A6IDEwcHg7DQotICB3aWR0aDogMzBweDsgDQotfQ0KLQ0KLSNjb250ZW50ICNzZWdtZW50cyAucmVsb2FkLmxvYWRlcg0KLXsNCi0gIHBhZGRpbmctbGVmdDogMDsNCi19DQotDQotI2NvbnRlbnQgI3NlZ21lbnRzIC5yZWxvYWQgc3Bhbg0KLXsNCi0gIGRpc3BsYXk6IG5vbmU7DQotfQ0KLQ0KLSNjb250ZW50ICNzZWdtZW50cyAjcmVzdWx0DQoteyAgIA0KLSAgd2lkdGg6IDc3JTsNCi19DQotDQotI2NvbnRlbnQgI3NlZ21lbnRzICNyZXN1bHQgI3Jlc3BvbnNlDQotew0KLSAgbWFyZ2luLWxlZnQ6IDI1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIHVsIHsNCi0gICAgbWFyZ2luLWxlZnQ6IDI1cHg7DQotfQ0KLSNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIHsNCi0gICAgbWFyZ2luLWJvdHRvbTogMnB4Ow0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi0jY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSAudG9vbHRpcCB7DQotICBkaXNwbGF5OiBub25lOw0KLSAgICBiYWNrZ3JvdW5kOiAjQzhDOEM4Ow0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHotaW5kZXg6IDEwMDA7DQotICAgIHdpZHRoOjIyMHB4Ow0KLSAgICBoZWlnaHQ6MTIwcHg7DQotICAgIG1hcmdpbi1sZWZ0OiAxMDAlOw0KLSAgICBvcGFjaXR5OiAuODsNCi0gICAgcGFkZGluZzogNXB4Ow0KLSAgICBib3JkZXI6IDFweCBzb2xpZDsNCi0gICAgYm9yZGVyLXJhZGl1czogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSAudG9vbHRpcCAubGFiZWwgew0KLSAgZmxvYXQ6IGxlZnQ7DQotICB3aWR0aDogMjAlOyAgDQotICBvcGFjaXR5OiAxOw0KLX0NCi0NCi0jY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaTpob3ZlciAudG9vbHRpcCB7DQotICBkaXNwbGF5OmJsb2NrOyAgDQotfQ0KLQ0KLSNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIGRsLCANCi0jY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkdCB7DQotICAgIHBhZGRpbmctYm90dG9tOiAxcHg7DQotICAgIHBhZGRpbmctdG9wOiAxcHg7DQotfQ0KLSNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIGRsIHsNCi0gICAgbWluLXdpZHRoOiAxcHg7DQotfQ0KLSNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIGR0IHsNCi0gICAgY29sb3I6ICNhMGEwYTA7DQotICAgIGxlZnQ6IC00NXB4Ow0KLSAgICBvdmVyZmxvdzogaGlkZGVuOw0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHRvcDogMDsNCi19DQotI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZHQgZGl2IHsNCi0gICAgZGlzcGxheTogYmxvY2s7DQotICAgIHBhZGRpbmctcmlnaHQ6IDRweDsNCi0gICAgdGV4dC1hbGlnbjogcmlnaHQ7DQotfQ0KLSNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIGRkIHsNCi0gICAgY2xlYXI6IGxlZnQ7DQotICAgIGZsb2F0OiBsZWZ0Ow0KLSAgICBtYXJnaW4tbGVmdDogMnB4Ow0KLSAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KLSAgICB3aWR0aDogMTAwJTsNCi19DQotDQotI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZGQgZGl2LmRlbGV0ZWQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODA4MDgwOyAgICANCi0gICAgcGFkZGluZy1sZWZ0OiA1cHg7ICAgIA0KLX0NCi0NCi0jY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkZCBkaXYubGl2ZSB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjREREREREOw0KLSAgZmxvYXQ6IGxlZnQ7ICANCi19DQotDQotI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZGQgZGl2LnN0YXJ0IHsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgd2lkdGg6IDIwJTsNCi19DQotDQotI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZGQgZGl2LmVuZCB7DQotICB0ZXh0LWFsaWduOiByaWdodDsNCi19DQotDQotLm1lcmdlLWNhbmRpZGF0ZSB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZDOUY5ICFpbXBvcnRhbnQ7DQotfQ0KLQ0KLSNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIGRkIGRpdi53NSB7DQotICB3aWR0aDogMjAlOw0KLSAgZmxvYXQ6IGxlZnQ7DQotfQ0KLQ0KLSNjb250ZW50ICNzZWdtZW50cyAjYXV0by1yZWZyZXNoIHsNCi0gIG1hcmdpbi10b3A6IDRweDsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDUwJSA1MCU7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIGhlaWdodDogMzBweDsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHJpZ2h0OiA1MHB4Ow0KLSAgdG9wOiAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2VnbWVudHMgI2F1dG8tcmVmcmVzaCBhIHsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1jaGVjay1ib3gtdW5jaGVjay5wbmcgKTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgY29sb3I6ICNjMGMwYzA7DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHBhZGRpbmctbGVmdDogMjFweDsNCi19DQotDQotI2NvbnRlbnQgI3NlZ21lbnRzICNhdXRvLXJlZnJlc2ggYS5vbiwNCi0jY29udGVudCAjc2VnbWVudHMgI2F1dG8tcmVmcmVzaCBhOmhvdmVyIHsNCi0gIGNvbG9yOiAjMzMzOw0KLX0NCi0NCi0jY29udGVudCAjc2VnbWVudHMgI2F1dG8tcmVmcmVzaCBhLm9uIHsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1jaGVjay1ib3gucG5nICk7DQotfQ0KLQ0KKy8qCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKworI2NvbnRlbnQgI3NlZ21lbnRzIC5sb2FkZXIKK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIHBhZGRpbmctbGVmdDogMjFweDsKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzIC5yZWxvYWQKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Fycm93LWNpcmNsZS5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTsKKyAgZGlzcGxheTogYmxvY2s7CisgIGhlaWdodDogMzBweDsKKyAgcG9zaXRpb246IGFic29sdXRlOworICByaWdodDogMTBweDsKKyAgdG9wOiAxMHB4OworICB3aWR0aDogMzBweDsgCit9CisKKyNjb250ZW50ICNzZWdtZW50cyAucmVsb2FkLmxvYWRlcgoreworICBwYWRkaW5nLWxlZnQ6IDA7Cit9CisKKyNjb250ZW50ICNzZWdtZW50cyAucmVsb2FkIHNwYW4KK3sKKyAgZGlzcGxheTogbm9uZTsKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzICNyZXN1bHQKK3sgICAKKyAgd2lkdGg6IDc3JTsKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzICNyZXN1bHQgI3Jlc3BvbnNlCit7CisgIG1hcmdpbi1sZWZ0OiAyNXB4OworfQorCisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciB1bCB7CisgICAgbWFyZ2luLWxlZnQ6IDI1cHg7Cit9CisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSB7CisgICAgbWFyZ2luLWJvdHRvbTogMnB4OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB3aWR0aDogMTAwJTsKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgLnRvb2x0aXAgeworICBkaXNwbGF5OiBub25lOworICAgIGJhY2tncm91bmQ6ICNDOEM4Qzg7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHotaW5kZXg6IDEwMDA7CisgICAgd2lkdGg6MjIwcHg7CisgICAgaGVpZ2h0OjEyMHB4OworICAgIG1hcmdpbi1sZWZ0OiAxMDAlOworICAgIG9wYWNpdHk6IC44OworICAgIHBhZGRpbmc6IDVweDsKKyAgICBib3JkZXI6IDFweCBzb2xpZDsKKyAgICBib3JkZXItcmFkaXVzOiA1cHg7Cit9CisKKyNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIC50b29sdGlwIC5sYWJlbCB7CisgIGZsb2F0OiBsZWZ0OworICB3aWR0aDogMjAlOyAgCisgIG9wYWNpdHk6IDE7Cit9CisKKyNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpOmhvdmVyIC50b29sdGlwIHsKKyAgZGlzcGxheTpibG9jazsgIAorfQorCisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkbCwgCisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkdCB7CisgICAgcGFkZGluZy1ib3R0b206IDFweDsKKyAgICBwYWRkaW5nLXRvcDogMXB4OworfQorI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZGwgeworICAgIG1pbi13aWR0aDogMXB4OworfQorI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZHQgeworICAgIGNvbG9yOiAjYTBhMGEwOworICAgIGxlZnQ6IC00NXB4OworICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMDsKK30KKyNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIGR0IGRpdiB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgcGFkZGluZy1yaWdodDogNHB4OworICAgIHRleHQtYWxpZ246IHJpZ2h0OworfQorI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZGQgeworICAgIGNsZWFyOiBsZWZ0OworICAgIGZsb2F0OiBsZWZ0OworICAgIG1hcmdpbi1sZWZ0OiAycHg7CisgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICB3aWR0aDogMTAwJTsKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZGQgZGl2LmRlbGV0ZWQgeworICAgIGJhY2tncm91bmQtY29sb3I6ICM4MDgwODA7ICAgIAorICAgIHBhZGRpbmctbGVmdDogNXB4OyAgICAKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZGQgZGl2LmxpdmUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjREREREREOworICBmbG9hdDogbGVmdDsgIAorfQorCisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkZCBkaXYuc3RhcnQgeworICBmbG9hdDogbGVmdDsKKyAgd2lkdGg6IDIwJTsKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZGQgZGl2LmVuZCB7CisgIHRleHQtYWxpZ246IHJpZ2h0OworfQorCisubWVyZ2UtY2FuZGlkYXRlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0ZGQzlGOSAhaW1wb3J0YW50OworfQorCisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkZCBkaXYudzUgeworICB3aWR0aDogMjAlOworICBmbG9hdDogbGVmdDsKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzICNhdXRvLXJlZnJlc2ggeworICBtYXJnaW4tdG9wOiA0cHg7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDUwJSA1MCU7CisgIGRpc3BsYXk6IGJsb2NrOworICBoZWlnaHQ6IDMwcHg7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgcmlnaHQ6IDUwcHg7CisgIHRvcDogMTBweDsKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzICNhdXRvLXJlZnJlc2ggYSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby91aS1jaGVjay1ib3gtdW5jaGVjay5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIGNvbG9yOiAjYzBjMGMwOworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjc2VnbWVudHMgI2F1dG8tcmVmcmVzaCBhLm9uLAorI2NvbnRlbnQgI3NlZ21lbnRzICNhdXRvLXJlZnJlc2ggYTpob3ZlciB7CisgIGNvbG9yOiAjMzMzOworfQorCisjY29udGVudCAjc2VnbWVudHMgI2F1dG8tcmVmcmVzaCBhLm9uIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3VpLWNoZWNrLWJveC5wbmcgKTsKK30KKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL3N0cmVhbS5jc3MgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvc3RyZWFtLmNzcwppbmRleCBmYjdkMTFmLi4wZWJiNTkyIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvc3RyZWFtLmNzcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvc3RyZWFtLmNzcwpAQCAtMSwyMzMgKzEsMjMzIEBACi0vKg0KLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotKi8NCi0NCi0jY29udGVudCAjc3RyZWFtDQotew0KLX0NCi0NCi0jY29udGVudCAjc3RyZWFtICNmb3JtDQotew0KLSAgZmxvYXQ6IHRvcDsNCi19DQotDQotI2NvbnRlbnQgI3N0cmVhbSAjZm9ybSBsYWJlbA0KLXsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi0gIGRpc3BsYXk6IGlubGluZTsNCi0gIG1hcmdpbi10b3A6IDVweDsNCi19DQotDQotI2NvbnRlbnQgI3N0cmVhbSAjZm9ybSBpbnB1dCwNCi0jY29udGVudCAjc3RyZWFtICNmb3JtIHNlbGVjdCwNCi0jY29udGVudCAjc3RyZWFtICNmb3JtIHRleHRhcmVhDQotew0KLSAgbWFyZ2luLWJvdHRvbTogMnB4Ow0KLSAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLSNjb250ZW50ICNzdHJlYW0gI2Zvcm0gdGV4dGFyZWENCi17DQotICBoZWlnaHQ6IDEyNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc3RyZWFtICNmb3JtICNzdGFydA0KLXsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgd2lkdGg6IDQ1JTsNCi19DQotDQotI2NvbnRlbnQgI3N0cmVhbSAjZm9ybSAjcm93cw0KLXsNCi0gIGZsb2F0OiByaWdodDsNCi0gIHdpZHRoOiA0NSU7DQotfQ0KLQ0KLSNjb250ZW50ICNzdHJlYW0gI2Zvcm0gaW5wdXRbdHlwZT1jaGVja2JveF0NCi17DQotICBtYXJnaW4tYm90dG9tOiAwOw0KLSAgbWFyZ2luLWxlZnQ6IDVweDsNCi0gIG1hcmdpbi1yaWdodDogMHB4Ow0KLSAgd2lkdGg6IDEwcHg7DQotICBoZWlnaHQ6IDEwcHg7DQotICBkaXNwbGF5OiBpbmxpbmU7DQotfQ0KLQ0KLSNjb250ZW50ICNzdHJlYW0gI2Zvcm0gZmllbGRzZXQNCi17DQotICBib3JkZXI6IDFweCBzb2xpZCAjZmZmOw0KLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjMGMwYzA7DQotICBtYXJnaW4tYm90dG9tOiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzdHJlYW0gI2Zvcm0gZmllbGRzZXQuY29tbW9uDQotew0KLSAgbWFyZ2luLXRvcDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI3N0cmVhbSAjZm9ybSBmaWVsZHNldCBsZWdlbmQNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi0gIG1hcmdpbi1sZWZ0OiAxMHB4Ow0KLSAgcGFkZGluZzogMHB4IDVweDsNCi19DQotDQotI2NvbnRlbnQgI3N0cmVhbSAjZm9ybSBmaWVsZHNldCBsZWdlbmQgbGFiZWwNCi17DQotICBtYXJnaW4tdG9wOiAwOw0KLX0NCi0NCi0jY29udGVudCAjc3RyZWFtICNmb3JtIGJ1dHRvbg0KLXsNCi0gIG1hcmdpbi1yaWdodDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI3N0cmVhbSAjZm9ybSBmaWVsZHNldCAuZmllbGRzZXQNCi17DQotICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YwZjBmMDsNCi0gIG1hcmdpbi1ib3R0b206IDVweDsNCi0gIHBhZGRpbmctYm90dG9tOiAxMHB4Ow0KLX0NCi0NCi0jY29udGVudCAjc3RyZWFtICNyZXN1bHQNCi17DQotICBmbG9hdDogYm90dG9tOw0KLX0NCi0NCi0jY29udGVudCAjc3RyZWFtICNyZXN1bHQgI3Jlc3BvbnNlDQotew0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24NCi17DQotICBib3JkZXItdG9wOiAxcHggc29saWQgI2YwZjBmMDsNCi0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2YwZjBmMDsNCi19DQotDQotI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNleHBsYW5hdGlvbiAubG9hZGVyDQotew0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24gI2Vycm9yDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2YwMDsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jb25zdHJ1Y3Rpb24ucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxMHB4IDEycHg7DQotICBjb2xvcjogI2ZmZjsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgbWFyZ2luLWJvdHRvbTogMjBweDsNCi0gIHBhZGRpbmc6IDEwcHg7DQotICBwYWRkaW5nLWxlZnQ6IDM1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24gI2Vycm9yIC5tc2cNCi17DQotICBmb250LXN0eWxlOiBpdGFsaWM7DQotICBmb250LXdlaWdodDogbm9ybWFsOw0KLSAgbWFyZ2luLXRvcDogMTBweDsNCi19DQotDQotI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNleHBsYW5hdGlvbiAuY29udGVudA0KLXsNCi0gIHBhZGRpbmctbGVmdDogMDsNCi0gIHBhZGRpbmctcmlnaHQ6IDA7DQotfQ0KLQ0KLSNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24gLmNvbnRlbnQuc2hvdw0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2Rpdi5naWYgKTsNCi0gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteTsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDMxJSAwOw0KLX0NCi0NCi0jY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uICNsZWdlbmQNCi17DQotICBib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwOw0KLSAgcGFkZGluZzogMTBweDsNCi0gIC8qcG9zaXRpb246IGFic29sdXRlOw0KLSAgcmlnaHQ6IDA7DQotICBib3R0b206IDA7Ki8NCi19DQotDQotI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNleHBsYW5hdGlvbiAjbGVnZW5kIGxpDQotew0KLSAgcGFkZGluZy1sZWZ0OiAxNXB4Ow0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94Ow0KLX0NCi0NCi0jY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uICNsZWdlbmQgbGkgc3ZnDQotew0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgbGVmdDogMDsNCi0gIHRvcDogMnB4Ow0KLX0NCi0NCi0jY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uICNleHBsYW5hdGlvbi1jb250ZW50DQotew0KLSAgbWluLWhlaWdodDogNTBweDsNCi0gIHdpZHRoOiAxMDAlDQotfQ0KLQ0KLSNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24gI2V4cGxhbmF0aW9uLWNvbnRlbnQgLm5vZGUgY2lyY2xlDQotew0KLSAgY29sb3I6ICNjNDhmMDA7DQotICBzdHJva2U6ICNjNDhmMDA7DQotICBmaWxsOiAjYzQ4ZjAwOw0KLX0NCi0NCi0jY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uICNleHBsYW5hdGlvbi1jb250ZW50IC5saW5rDQotew0KLSAgZmlsbDogbm9uZTsNCi0gIHN0cm9rZTogI2UwZTBlMDsNCi0gIHN0cm9rZS13aWR0aDogMS41cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24gI2xlZ2VuZCAuZGF0YXN0b3JlIGNpcmNsZSwNCi0jY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uICNleHBsYW5hdGlvbi1jb250ZW50IC5ub2RlLmRhdGFzdG9yZSBjaXJjbGUNCi17DQotICBzdHJva2U6ICMzODAwYzQ7DQotICBmaWxsOiAjMzgwMGM0Ow0KLX0NCi0NCi0jY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uICNsZWdlbmQgLnN0cmVhbS1zb3VyY2UgY2lyY2xlLA0KLSNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24gI2V4cGxhbmF0aW9uLWNvbnRlbnQgLm5vZGUuc3RyZWFtLXNvdXJjZSBjaXJjbGUNCi17DQotICBzdHJva2U6ICMyMWE5ZWM7DQotICBmaWxsOiAjMjFhOWVjOw0KLX0NCi0NCi0jY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uICNsZWdlbmQgLnN0cmVhbS1kZWNvcmF0b3IgY2lyY2xlLA0KLSNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24gI2V4cGxhbmF0aW9uLWNvbnRlbnQgLm5vZGUuc3RyZWFtLWRlY29yYXRvciBjaXJjbGUNCi17DQotICBzdHJva2U6ICNjYjIxZWM7DQotICBmaWxsOiAjY2IyMWVjOw0KLX0NCi0NCi0jY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uICNsZWdlbmQgLmdyYXBoLXNvdXJjZSBjaXJjbGUsDQotI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNleHBsYW5hdGlvbiAjZXhwbGFuYXRpb24tY29udGVudCAubm9kZS5ncmFwaC1zb3VyY2UgY2lyY2xlDQotew0KLSAgc3Ryb2tlOiAjMjFlY2E5Ow0KLSAgZmlsbDogIzIxZWNhOTsNCi19DQorLyoKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisqLworCisjY29udGVudCAjc3RyZWFtCit7Cit9CisKKyNjb250ZW50ICNzdHJlYW0gI2Zvcm0KK3sKKyAgZmxvYXQ6IHRvcDsKK30KKworI2NvbnRlbnQgI3N0cmVhbSAjZm9ybSBsYWJlbAoreworICBjdXJzb3I6IHBvaW50ZXI7CisgIGRpc3BsYXk6IGlubGluZTsKKyAgbWFyZ2luLXRvcDogNXB4OworfQorCisjY29udGVudCAjc3RyZWFtICNmb3JtIGlucHV0LAorI2NvbnRlbnQgI3N0cmVhbSAjZm9ybSBzZWxlY3QsCisjY29udGVudCAjc3RyZWFtICNmb3JtIHRleHRhcmVhCit7CisgIG1hcmdpbi1ib3R0b206IDJweDsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKyNjb250ZW50ICNzdHJlYW0gI2Zvcm0gdGV4dGFyZWEKK3sKKyAgaGVpZ2h0OiAxMjVweDsKK30KKworI2NvbnRlbnQgI3N0cmVhbSAjZm9ybSAjc3RhcnQKK3sKKyAgZmxvYXQ6IGxlZnQ7CisgIHdpZHRoOiA0NSU7Cit9CisKKyNjb250ZW50ICNzdHJlYW0gI2Zvcm0gI3Jvd3MKK3sKKyAgZmxvYXQ6IHJpZ2h0OworICB3aWR0aDogNDUlOworfQorCisjY29udGVudCAjc3RyZWFtICNmb3JtIGlucHV0W3R5cGU9Y2hlY2tib3hdCit7CisgIG1hcmdpbi1ib3R0b206IDA7CisgIG1hcmdpbi1sZWZ0OiA1cHg7CisgIG1hcmdpbi1yaWdodDogMHB4OworICB3aWR0aDogMTBweDsKKyAgaGVpZ2h0OiAxMHB4OworICBkaXNwbGF5OiBpbmxpbmU7Cit9CisKKyNjb250ZW50ICNzdHJlYW0gI2Zvcm0gZmllbGRzZXQKK3sKKyAgYm9yZGVyOiAxcHggc29saWQgI2ZmZjsKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjMGMwYzA7CisgIG1hcmdpbi1ib3R0b206IDVweDsKK30KKworI2NvbnRlbnQgI3N0cmVhbSAjZm9ybSBmaWVsZHNldC5jb21tb24KK3sKKyAgbWFyZ2luLXRvcDogMTBweDsKK30KKworI2NvbnRlbnQgI3N0cmVhbSAjZm9ybSBmaWVsZHNldCBsZWdlbmQKK3sKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi1sZWZ0OiAxMHB4OworICBwYWRkaW5nOiAwcHggNXB4OworfQorCisjY29udGVudCAjc3RyZWFtICNmb3JtIGZpZWxkc2V0IGxlZ2VuZCBsYWJlbAoreworICBtYXJnaW4tdG9wOiAwOworfQorCisjY29udGVudCAjc3RyZWFtICNmb3JtIGJ1dHRvbgoreworICBtYXJnaW4tcmlnaHQ6IDEwcHg7Cit9CisKKyNjb250ZW50ICNzdHJlYW0gI2Zvcm0gZmllbGRzZXQgLmZpZWxkc2V0Cit7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjBmMGYwOworICBtYXJnaW4tYm90dG9tOiA1cHg7CisgIHBhZGRpbmctYm90dG9tOiAxMHB4OworfQorCisjY29udGVudCAjc3RyZWFtICNyZXN1bHQKK3sKKyAgZmxvYXQ6IGJvdHRvbTsKK30KKworI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNyZXNwb25zZQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqLworCisjY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uCit7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjBmMGYwOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YwZjBmMDsKKyAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZjBmMGYwOworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZjBmMGYwOworfQorCisjY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uIC5sb2FkZXIKK3sKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIHBhZGRpbmctbGVmdDogMjFweDsKK30KKworI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNleHBsYW5hdGlvbiAjZXJyb3IKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwMDsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NvbnN0cnVjdGlvbi5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTBweCAxMnB4OworICBjb2xvcjogI2ZmZjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG1hcmdpbi1ib3R0b206IDIwcHg7CisgIHBhZGRpbmc6IDEwcHg7CisgIHBhZGRpbmctbGVmdDogMzVweDsKK30KKworI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNleHBsYW5hdGlvbiAjZXJyb3IgLm1zZworeworICBmb250LXN0eWxlOiBpdGFsaWM7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIG1hcmdpbi10b3A6IDEwcHg7Cit9CisKKyNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24gLmNvbnRlbnQKK3sKKyAgcGFkZGluZy1sZWZ0OiAwOworICBwYWRkaW5nLXJpZ2h0OiAwOworfQorCisjY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uIC5jb250ZW50LnNob3cKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvZGl2LmdpZiApOworICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXk7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDMxJSAwOworfQorCisjY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uICNsZWdlbmQKK3sKKyAgYm9yZGVyOiAxcHggc29saWQgI2YwZjBmMDsKKyAgcGFkZGluZzogMTBweDsKKyAgLypwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAwOworICBib3R0b206IDA7Ki8KK30KKworI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNleHBsYW5hdGlvbiAjbGVnZW5kIGxpCit7CisgIHBhZGRpbmctbGVmdDogMTVweDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7Cit9CisKKyNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24gI2xlZ2VuZCBsaSBzdmcKK3sKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiAwOworICB0b3A6IDJweDsKK30KKworI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNleHBsYW5hdGlvbiAjZXhwbGFuYXRpb24tY29udGVudAoreworICBtaW4taGVpZ2h0OiA1MHB4OworICB3aWR0aDogMTAwJQorfQorCisjY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uICNleHBsYW5hdGlvbi1jb250ZW50IC5ub2RlIGNpcmNsZQoreworICBjb2xvcjogI2M0OGYwMDsKKyAgc3Ryb2tlOiAjYzQ4ZjAwOworICBmaWxsOiAjYzQ4ZjAwOworfQorCisjY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uICNleHBsYW5hdGlvbi1jb250ZW50IC5saW5rCit7CisgIGZpbGw6IG5vbmU7CisgIHN0cm9rZTogI2UwZTBlMDsKKyAgc3Ryb2tlLXdpZHRoOiAxLjVweDsKK30KKworI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNleHBsYW5hdGlvbiAjbGVnZW5kIC5kYXRhc3RvcmUgY2lyY2xlLAorI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNleHBsYW5hdGlvbiAjZXhwbGFuYXRpb24tY29udGVudCAubm9kZS5kYXRhc3RvcmUgY2lyY2xlCit7CisgIHN0cm9rZTogIzM4MDBjNDsKKyAgZmlsbDogIzM4MDBjNDsKK30KKworI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNleHBsYW5hdGlvbiAjbGVnZW5kIC5zdHJlYW0tc291cmNlIGNpcmNsZSwKKyNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24gI2V4cGxhbmF0aW9uLWNvbnRlbnQgLm5vZGUuc3RyZWFtLXNvdXJjZSBjaXJjbGUKK3sKKyAgc3Ryb2tlOiAjMjFhOWVjOworICBmaWxsOiAjMjFhOWVjOworfQorCisjY29udGVudCAjc3RyZWFtICNyZXN1bHQgI2V4cGxhbmF0aW9uICNsZWdlbmQgLnN0cmVhbS1kZWNvcmF0b3IgY2lyY2xlLAorI2NvbnRlbnQgI3N0cmVhbSAjcmVzdWx0ICNleHBsYW5hdGlvbiAjZXhwbGFuYXRpb24tY29udGVudCAubm9kZS5zdHJlYW0tZGVjb3JhdG9yIGNpcmNsZQoreworICBzdHJva2U6ICNjYjIxZWM7CisgIGZpbGw6ICNjYjIxZWM7Cit9CisKKyNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24gI2xlZ2VuZCAuZ3JhcGgtc291cmNlIGNpcmNsZSwKKyNjb250ZW50ICNzdHJlYW0gI3Jlc3VsdCAjZXhwbGFuYXRpb24gI2V4cGxhbmF0aW9uLWNvbnRlbnQgLm5vZGUuZ3JhcGgtc291cmNlIGNpcmNsZQoreworICBzdHJva2U6ICMyMWVjYTk7CisgIGZpbGw6ICMyMWVjYTk7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvdGhyZWFkcy5jc3MgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL2FuZ3VsYXIvdGhyZWFkcy5jc3MKaW5kZXggZWEwMDg0OS4uYzk5ODczMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9hbmd1bGFyL3RocmVhZHMuY3NzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3MvYW5ndWxhci90aHJlYWRzLmNzcwpAQCAtMSwxNjEgKzEsMTYxIEBACi0vKg0KLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotKi8NCi0NCi0jY29udGVudCAjdGhyZWFkcyAubG9hZGVyDQotew0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBwYWRkaW5nLWxlZnQ6IDIxcHg7DQotfQ0KLQ0KLSNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0YWJsZQ0KLXsNCi0gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7DQotICB3aWR0aDogMTAwJTsNCi19DQotDQotI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRhYmxlIC5zcGFjZXIsDQotI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRib2R5IC5zdGF0ZQ0KLXsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQotfQ0KLQ0KLSNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0YWJsZSB0aCwNCi0jY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGFibGUgdGQNCi17DQotICBwYWRkaW5nOiA1cHggM3B4Ow0KLSAgdmVydGljYWwtYWxpZ246IHRvcDsNCi19DQotDQotI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRoZWFkIHRoDQotew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2M4YzhjODsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgdGV4dC1hbGlnbjogbGVmdDsNCi19DQotDQotI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRoZWFkIHRoLm5hbWUNCi17DQotICB3aWR0aDogODUlOw0KLX0NCi0NCi0jY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGhlYWQgdGgudGltZQ0KLXsNCi0gIHRleHQtYWxpZ246IHJpZ2h0Ow0KLSAgd2lkdGg6IDE1JTsNCi19DQotDQotI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRib2R5IC5vZGQNCi17DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOw0KLX0NCi0NCi0jY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGJvZHkgLlJVTk5BQkxFIGENCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vdGljay1jaXJjbGUucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0Ym9keSAuV0FJVElORyBhLA0KLSNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0Ym9keSAuVElNRURfV0FJVElORyBhDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2hvdXJnbGFzcy5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRib2R5IC5XQUlUSU5HLmxvY2sgYSwNCi0jY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGJvZHkgLlRJTUVEX1dBSVRJTkcubG9jayBhDQotew0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2hvdXJnbGFzcy0tZXhjbGFtYXRpb24ucG5nICk7DQotfQ0KLQ0KLSNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0Ym9keSAubmFtZSBhDQotew0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBjdXJzb3I6IGF1dG87DQotICBkaXNwbGF5OiBibG9jazsNCi0gIHBhZGRpbmctbGVmdDogMjFweDsNCi19DQotDQotI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRib2R5IC5zdGFja3RyYWNlIC5uYW1lIGENCi17DQotICBjdXJzb3I6IHBvaW50ZXI7DQotfQ0KLQ0KLSNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0Ym9keSAuc3RhY2t0cmFjZSAubmFtZSBhIHNwYW4NCi17ICAgIA0KLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoZXZyb24tc21hbGwtZXhwYW5kLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSA1MCU7DQotICBwYWRkaW5nLXJpZ2h0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGJvZHkgLnN0YWNrdHJhY2Uub3BlbiAubmFtZSBhIHNwYW4NCi17ICAgDQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hldnJvbi1zbWFsbC5wbmcgKTsNCi19DQotDQotI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRib2R5IC5uYW1lIHANCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctMDAwLXNtYWxsLnBuZyApOw0KLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7DQotICBjb2xvcjogI2MwYzBjMDsNCi0gIGZvbnQtc2l6ZTogMTFweDsNCi0gIG1hcmdpbi1sZWZ0OiAyMXB4Ow0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGJvZHkgLm5hbWUgZGl2DQotew0KLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjMGMwYzA7DQotICBtYXJnaW4tbGVmdDogMjFweDsNCi0gIG1hcmdpbi10b3A6IDVweDsNCi0gIHBhZGRpbmctdG9wOiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0Ym9keSAub3BlbiAubmFtZSBkaXYNCi17DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRib2R5IC5uYW1lIHVsDQotew0KLSAgbGlzdC1zdHlsZS10eXBlOiBkaXNjOw0KLSAgbWFyZ2luLWxlZnQ6IDAuN2VtOw0KLSAgcGFkZGluZy1sZWZ0OiAwLjdlbTsNCi19DQotDQotI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRib2R5IC50aW1lDQotew0KLSAgdGV4dC1hbGlnbjogcmlnaHQ7DQotfQ0KLQ0KLSNjb250ZW50ICN0aHJlYWRzIC5jb250cm9scw0KLXsNCi0gIHBhZGRpbmctdG9wOiA1cHg7DQotICBwYWRkaW5nLWJvdHRvbTogNXB4Ow0KLX0NCi0NCi0jY29udGVudCAjdGhyZWFkcyAuY29udHJvbHMgYQ0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLWV4cGFuZC5wbmcgKTsNCi0gIHBhZGRpbmctbGVmdDogMjFweDsNCi19DQotDQotI2NvbnRlbnQgI3RocmVhZHMuZXhwYW5kZWQgLmNvbnRyb2xzIGENCi17DQotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hldnJvbi1zbWFsbC5wbmcgKTsNCi19DQotDQorLyoKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisqLworCisjY29udGVudCAjdGhyZWFkcyAubG9hZGVyCit7CisgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0YWJsZQoreworICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICB3aWR0aDogMTAwJTsKK30KKworI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRhYmxlIC5zcGFjZXIsCisjY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGJvZHkgLnN0YXRlCit7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cit9CisKKyNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0YWJsZSB0aCwKKyNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0YWJsZSB0ZAoreworICBwYWRkaW5nOiA1cHggM3B4OworICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCisjY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGhlYWQgdGgKK3sKKyAgYmFja2dyb3VuZC1jb2xvcjogI2M4YzhjODsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIHRleHQtYWxpZ246IGxlZnQ7Cit9CisKKyNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0aGVhZCB0aC5uYW1lCit7CisgIHdpZHRoOiA4NSU7Cit9CisKKyNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0aGVhZCB0aC50aW1lCit7CisgIHRleHQtYWxpZ246IHJpZ2h0OworICB3aWR0aDogMTUlOworfQorCisjY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGJvZHkgLm9kZAoreworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOworfQorCisjY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGJvZHkgLlJVTk5BQkxFIGEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL3RpY2stY2lyY2xlLnBuZyApOworfQorCisjY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGJvZHkgLldBSVRJTkcgYSwKKyNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0Ym9keSAuVElNRURfV0FJVElORyBhCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ob3VyZ2xhc3MucG5nICk7Cit9CisKKyNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0Ym9keSAuV0FJVElORy5sb2NrIGEsCisjY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGJvZHkgLlRJTUVEX1dBSVRJTkcubG9jayBhCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9ob3VyZ2xhc3MtLWV4Y2xhbWF0aW9uLnBuZyApOworfQorCisjY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGJvZHkgLm5hbWUgYQoreworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgY3Vyc29yOiBhdXRvOworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjdGhyZWFkcyAjdGhyZWFkLWR1bXAgdGJvZHkgLnN0YWNrdHJhY2UgLm5hbWUgYQoreworICBjdXJzb3I6IHBvaW50ZXI7Cit9CisKKyNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0Ym9keSAuc3RhY2t0cmFjZSAubmFtZSBhIHNwYW4KK3sgICAgCisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLWV4cGFuZC5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSA1MCU7CisgIHBhZGRpbmctcmlnaHQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0Ym9keSAuc3RhY2t0cmFjZS5vcGVuIC5uYW1lIGEgc3BhbgoreyAgIAorICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vY2hldnJvbi1zbWFsbC5wbmcgKTsKK30KKworI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRib2R5IC5uYW1lIHAKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2Fycm93LTAwMC1zbWFsbC5wbmcgKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCA1MCU7CisgIGNvbG9yOiAjYzBjMGMwOworICBmb250LXNpemU6IDExcHg7CisgIG1hcmdpbi1sZWZ0OiAyMXB4OworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0Ym9keSAubmFtZSBkaXYKK3sKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjMGMwYzA7CisgIG1hcmdpbi1sZWZ0OiAyMXB4OworICBtYXJnaW4tdG9wOiA1cHg7CisgIHBhZGRpbmctdG9wOiA1cHg7Cit9CisKKyNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0Ym9keSAub3BlbiAubmFtZSBkaXYKK3sKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKyNjb250ZW50ICN0aHJlYWRzICN0aHJlYWQtZHVtcCB0Ym9keSAubmFtZSB1bAoreworICBsaXN0LXN0eWxlLXR5cGU6IGRpc2M7CisgIG1hcmdpbi1sZWZ0OiAwLjdlbTsKKyAgcGFkZGluZy1sZWZ0OiAwLjdlbTsKK30KKworI2NvbnRlbnQgI3RocmVhZHMgI3RocmVhZC1kdW1wIHRib2R5IC50aW1lCit7CisgIHRleHQtYWxpZ246IHJpZ2h0OworfQorCisjY29udGVudCAjdGhyZWFkcyAuY29udHJvbHMKK3sKKyAgcGFkZGluZy10b3A6IDVweDsKKyAgcGFkZGluZy1ib3R0b206IDVweDsKK30KKworI2NvbnRlbnQgI3RocmVhZHMgLmNvbnRyb2xzIGEKK3sKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi8uLi9pbWcvaWNvL2NoZXZyb24tc21hbGwtZXhwYW5kLnBuZyApOworICBwYWRkaW5nLWxlZnQ6IDIxcHg7Cit9CisKKyNjb250ZW50ICN0aHJlYWRzLmV4cGFuZGVkIC5jb250cm9scyBhCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9jaGV2cm9uLXNtYWxsLnBuZyApOworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL3N0eWxlcy9zZWdtZW50cy5jc3MgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvY3NzL3N0eWxlcy9zZWdtZW50cy5jc3MKaW5kZXggYjcxYTNhYy4uMjI0OWQyYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2Nzcy9zdHlsZXMvc2VnbWVudHMuY3NzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9jc3Mvc3R5bGVzL3NlZ21lbnRzLmNzcwpAQCAtMSwxNDUgKzEsMTQ1IEBACi0vKg0KLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotKi8NCi0NCi0jY29udGVudCAjc2VnbWVudHMgLmxvYWRlcg0KLXsNCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOw0KLSAgcGFkZGluZy1sZWZ0OiAyMXB4Ow0KLX0NCi0NCi0jY29udGVudCAjc2VnbWVudHMgLnJlbG9hZA0KLXsNCi0gIGJhY2tncm91bmQtaW1hZ2U6IHVybCggLi4vLi4vaW1nL2ljby9hcnJvdy1jaXJjbGUucG5nICk7DQotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1MCUgNTAlOw0KLSAgZGlzcGxheTogYmxvY2s7DQotICBoZWlnaHQ6IDMwcHg7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICByaWdodDogMTBweDsNCi0gIHRvcDogMTBweDsNCi0gIHdpZHRoOiAzMHB4OyANCi19DQotDQotI2NvbnRlbnQgI3NlZ21lbnRzIC5yZWxvYWQubG9hZGVyDQotew0KLSAgcGFkZGluZy1sZWZ0OiAwOw0KLX0NCi0NCi0jY29udGVudCAjc2VnbWVudHMgLnJlbG9hZCBzcGFuDQotew0KLSAgZGlzcGxheTogbm9uZTsNCi19DQotDQotI2NvbnRlbnQgI3NlZ21lbnRzICNyZXN1bHQNCi17ICAgDQotICB3aWR0aDogNzclOw0KLX0NCi0NCi0jY29udGVudCAjc2VnbWVudHMgI3Jlc3VsdCAjcmVzcG9uc2UNCi17DQotICBtYXJnaW4tbGVmdDogMjVweDsNCi19DQotDQotI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgdWwgew0KLSAgICBtYXJnaW4tbGVmdDogMjVweDsNCi19DQotI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgew0KLSAgICBtYXJnaW4tYm90dG9tOiAycHg7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gICAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLSNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIC50b29saXRwIHsNCi0gIGRpc3BsYXk6IG5vbmU7DQotICAgIGJhY2tncm91bmQ6ICNDOEM4Qzg7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgei1pbmRleDogMTAwMDsNCi0gICAgd2lkdGg6MjIwcHg7DQotICAgIGhlaWdodDoxMjBweDsNCi0gICAgbWFyZ2luLWxlZnQ6IDEwMCU7DQotICAgIG9wYWNpdHk6IC44Ow0KLSAgICBwYWRkaW5nOiA1cHg7DQotICAgIGJvcmRlcjogMXB4IHNvbGlkOw0KLSAgICBib3JkZXItcmFkaXVzOiA1cHg7DQotfQ0KLQ0KLSNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIC50b29saXRwIC5sYWJlbCB7DQotICBmbG9hdDogbGVmdDsNCi0gIHdpZHRoOiAyMCU7ICANCi0gIG9wYWNpdHk6IDE7DQotfQ0KLQ0KLSNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpOmhvdmVyIC50b29saXRwIHsNCi0gIGRpc3BsYXk6YmxvY2s7ICANCi19DQotDQotI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZGwsIA0KLSNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIGR0IHsNCi0gICAgcGFkZGluZy1ib3R0b206IDFweDsNCi0gICAgcGFkZGluZy10b3A6IDFweDsNCi19DQotI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZGwgew0KLSAgICBtaW4td2lkdGg6IDFweDsNCi19DQotI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZHQgew0KLSAgICBjb2xvcjogI2EwYTBhMDsNCi0gICAgbGVmdDogLTQ1cHg7DQotICAgIG92ZXJmbG93OiBoaWRkZW47DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgdG9wOiAwOw0KLX0NCi0jY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkdCBkaXYgew0KLSAgICBkaXNwbGF5OiBibG9jazsNCi0gICAgcGFkZGluZy1yaWdodDogNHB4Ow0KLSAgICB0ZXh0LWFsaWduOiByaWdodDsNCi19DQotI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZGQgew0KLSAgICBjbGVhcjogbGVmdDsNCi0gICAgZmxvYXQ6IGxlZnQ7DQotICAgIG1hcmdpbi1sZWZ0OiAycHg7DQotICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7DQotICAgIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi0jY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkZCBkaXYuZGVsZXRlZCB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICM4MDgwODA7ICAgIA0KLSAgICBwYWRkaW5nLWxlZnQ6IDVweDsgICAgDQotfQ0KLQ0KLSNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIGRkIGRpdi5saXZlIHsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNEREREREQ7DQotICBmbG9hdDogbGVmdDsgIA0KLX0NCi0NCi0jY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkZCBkaXYuc3RhcnQgew0KLSAgZmxvYXQ6IGxlZnQ7DQotICB3aWR0aDogMjAlOw0KLX0NCi0NCi0jY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkZCBkaXYuZW5kIHsNCi0gIHRleHQtYWxpZ246IHJpZ2h0Ow0KLX0NCi0NCi0ubWVyZ2UtY2FuZGlkYXRlIHsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNGRkM5RjkgIWltcG9ydGFudDsNCi19DQotDQotI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZGQgZGl2Lnc1IHsNCi0gIHdpZHRoOiAyMCU7DQotICBmbG9hdDogbGVmdDsNCi19DQorLyoKKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisqLworCisjY29udGVudCAjc2VnbWVudHMgLmxvYWRlcgoreworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKKyAgcGFkZGluZy1sZWZ0OiAyMXB4OworfQorCisjY29udGVudCAjc2VnbWVudHMgLnJlbG9hZAoreworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uLy4uL2ltZy9pY28vYXJyb3ctY2lyY2xlLnBuZyApOworICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1MCUgNTAlOworICBkaXNwbGF5OiBibG9jazsKKyAgaGVpZ2h0OiAzMHB4OworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAxMHB4OworICB0b3A6IDEwcHg7CisgIHdpZHRoOiAzMHB4OyAKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzIC5yZWxvYWQubG9hZGVyCit7CisgIHBhZGRpbmctbGVmdDogMDsKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzIC5yZWxvYWQgc3BhbgoreworICBkaXNwbGF5OiBub25lOworfQorCisjY29udGVudCAjc2VnbWVudHMgI3Jlc3VsdAoreyAgIAorICB3aWR0aDogNzclOworfQorCisjY29udGVudCAjc2VnbWVudHMgI3Jlc3VsdCAjcmVzcG9uc2UKK3sKKyAgbWFyZ2luLWxlZnQ6IDI1cHg7Cit9CisKKyNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIHVsIHsKKyAgICBtYXJnaW4tbGVmdDogMjVweDsKK30KKyNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIHsKKyAgICBtYXJnaW4tYm90dG9tOiAycHg7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHdpZHRoOiAxMDAlOworfQorCisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSAudG9vbGl0cCB7CisgIGRpc3BsYXk6IG5vbmU7CisgICAgYmFja2dyb3VuZDogI0M4QzhDODsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgei1pbmRleDogMTAwMDsKKyAgICB3aWR0aDoyMjBweDsKKyAgICBoZWlnaHQ6MTIwcHg7CisgICAgbWFyZ2luLWxlZnQ6IDEwMCU7CisgICAgb3BhY2l0eTogLjg7CisgICAgcGFkZGluZzogNXB4OworICAgIGJvcmRlcjogMXB4IHNvbGlkOworICAgIGJvcmRlci1yYWRpdXM6IDVweDsKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgLnRvb2xpdHAgLmxhYmVsIHsKKyAgZmxvYXQ6IGxlZnQ7CisgIHdpZHRoOiAyMCU7ICAKKyAgb3BhY2l0eTogMTsKK30KKworI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGk6aG92ZXIgLnRvb2xpdHAgeworICBkaXNwbGF5OmJsb2NrOyAgCit9CisKKyNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIGRsLCAKKyNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIGR0IHsKKyAgICBwYWRkaW5nLWJvdHRvbTogMXB4OworICAgIHBhZGRpbmctdG9wOiAxcHg7Cit9CisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkbCB7CisgICAgbWluLXdpZHRoOiAxcHg7Cit9CisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkdCB7CisgICAgY29sb3I6ICNhMGEwYTA7CisgICAgbGVmdDogLTQ1cHg7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAwOworfQorI2NvbnRlbnQgI3NlZ21lbnRzIC5zZWdtZW50cy1ob2xkZXIgbGkgZHQgZGl2IHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkZCB7CisgICAgY2xlYXI6IGxlZnQ7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgIHdpZHRoOiAxMDAlOworfQorCisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkZCBkaXYuZGVsZXRlZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzgwODA4MDsgICAgCisgICAgcGFkZGluZy1sZWZ0OiA1cHg7ICAgIAorfQorCisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkZCBkaXYubGl2ZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNEREREREQ7CisgIGZsb2F0OiBsZWZ0OyAgCit9CisKKyNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIGRkIGRpdi5zdGFydCB7CisgIGZsb2F0OiBsZWZ0OworICB3aWR0aDogMjAlOworfQorCisjY29udGVudCAjc2VnbWVudHMgLnNlZ21lbnRzLWhvbGRlciBsaSBkZCBkaXYuZW5kIHsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKy5tZXJnZS1jYW5kaWRhdGUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZDOUY5ICFpbXBvcnRhbnQ7Cit9CisKKyNjb250ZW50ICNzZWdtZW50cyAuc2VnbWVudHMtaG9sZGVyIGxpIGRkIGRpdi53NSB7CisgIHdpZHRoOiAyMCU7CisgIGZsb2F0OiBsZWZ0OworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvYXBwLmpzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvYXBwLmpzCmluZGV4IGI3MDBhNzQuLmU3NDkxZmUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2FwcC5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9hcHAuanMKQEAgLTEsNzk5ICsxLDc5OSBAQAotLyoNCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLQ0KLXZhciBzb2xyQWRtaW5BcHAgPSBhbmd1bGFyLm1vZHVsZSgic29sckFkbWluQXBwIiwgWw0KLSAgIm5nUmVzb3VyY2UiLA0KLSAgIm5nUm91dGUiLA0KLSAgIm5nQ29va2llcyIsDQotICAibmd0aW1lYWdvIiwNCi0gICJzb2xyQWRtaW5TZXJ2aWNlcyIsDQotICAibG9jYWx5dGljcy5kaXJlY3RpdmVzIg0KLV0pOw0KLQ0KLXNvbHJBZG1pbkFwcC5jb25maWcoWw0KLSAgJyRyb3V0ZVByb3ZpZGVyJywgZnVuY3Rpb24oJHJvdXRlUHJvdmlkZXIpIHsNCi0gICAgJHJvdXRlUHJvdmlkZXIuDQotICAgICAgd2hlbignLycsIHsNCi0gICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvaW5kZXguaHRtbCcsDQotICAgICAgICBjb250cm9sbGVyOiAnSW5kZXhDb250cm9sbGVyJw0KLSAgICAgIH0pLg0KLSAgICAgIHdoZW4oJy9+bG9nZ2luZycsIHsNCi0gICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvbG9nZ2luZy5odG1sJywNCi0gICAgICAgIGNvbnRyb2xsZXI6ICdMb2dnaW5nQ29udHJvbGxlcicNCi0gICAgICB9KS4NCi0gICAgICB3aGVuKCcvfmxvZ2dpbmcvbGV2ZWwnLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2xvZ2dpbmctbGV2ZWxzLmh0bWwnLA0KLSAgICAgICAgY29udHJvbGxlcjogJ0xvZ2dpbmdMZXZlbENvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignL35jbG91ZCcsIHsNCi0gICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvY2xvdWQuaHRtbCcsDQotICAgICAgICBjb250cm9sbGVyOiAnQ2xvdWRDb250cm9sbGVyJw0KLSAgICAgIH0pLg0KLSAgICAgIHdoZW4oJy9+Y29yZXMnLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2NvcmVzLmh0bWwnLA0KLSAgICAgICAgY29udHJvbGxlcjogJ0NvcmVBZG1pbkNvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignL35jb3Jlcy86Y29yZW5hbWUnLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2NvcmVzLmh0bWwnLA0KLSAgICAgICAgY29udHJvbGxlcjogJ0NvcmVBZG1pbkNvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignL35jb2xsZWN0aW9ucycsIHsNCi0gICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvY29sbGVjdGlvbnMuaHRtbCcsDQotICAgICAgICBjb250cm9sbGVyOiAnQ29sbGVjdGlvbnNDb250cm9sbGVyJw0KLSAgICAgIH0pLg0KLSAgICAgIHdoZW4oJy9+Y29sbGVjdGlvbnMvOmNvbGxlY3Rpb24nLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2NvbGxlY3Rpb25zLmh0bWwnLA0KLSAgICAgICAgY29udHJvbGxlcjogJ0NvbGxlY3Rpb25zQ29udHJvbGxlcicNCi0gICAgICB9KS4NCi0gICAgICB3aGVuKCcvfnRocmVhZHMnLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL3RocmVhZHMuaHRtbCcsDQotICAgICAgICBjb250cm9sbGVyOiAnVGhyZWFkc0NvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignL35qYXZhLXByb3BlcnRpZXMnLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2phdmEtcHJvcGVydGllcy5odG1sJywNCi0gICAgICAgIGNvbnRyb2xsZXI6ICdKYXZhUHJvcGVydGllc0NvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignLzpjb3JlJywgew0KLSAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9jb3JlX292ZXJ2aWV3Lmh0bWwnLA0KLSAgICAgICAgY29udHJvbGxlcjogJ0NvcmVPdmVydmlld0NvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignLzpjb3JlL2NvbGxlY3Rpb24tb3ZlcnZpZXcnLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2NvbGxlY3Rpb25fb3ZlcnZpZXcuaHRtbCcsDQotICAgICAgICBjb250cm9sbGVyOiAnQ29sbGVjdGlvbk92ZXJ2aWV3Q29udHJvbGxlcicNCi0gICAgICB9KS4NCi0gICAgICB3aGVuKCcvOmNvcmUvYW5hbHlzaXMnLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2FuYWx5c2lzLmh0bWwnLA0KLSAgICAgICAgY29udHJvbGxlcjogJ0FuYWx5c2lzQ29udHJvbGxlcicNCi0gICAgICB9KS4NCi0gICAgICB3aGVuKCcvOmNvcmUvZGF0YWltcG9ydCcsIHsNCi0gICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvZGF0YWltcG9ydC5odG1sJywNCi0gICAgICAgIGNvbnRyb2xsZXI6ICdEYXRhSW1wb3J0Q29udHJvbGxlcicNCi0gICAgICB9KS4NCi0gICAgICB3aGVuKCcvOmNvcmUvZGF0YWltcG9ydC86aGFuZGxlcionLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2RhdGFpbXBvcnQuaHRtbCcsDQotICAgICAgICBjb250cm9sbGVyOiAnRGF0YUltcG9ydENvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignLzpjb3JlL2RvY3VtZW50cycsIHsNCi0gICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvZG9jdW1lbnRzLmh0bWwnLA0KLSAgICAgICAgY29udHJvbGxlcjogJ0RvY3VtZW50c0NvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignLzpjb3JlL2ZpbGVzJywgew0KLSAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9maWxlcy5odG1sJywNCi0gICAgICAgIGNvbnRyb2xsZXI6ICdGaWxlc0NvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignLzpjb3JlL3BsdWdpbnMnLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL3BsdWdpbnMuaHRtbCcsDQotICAgICAgICBjb250cm9sbGVyOiAnUGx1Z2luc0NvbnRyb2xsZXInLA0KLSAgICAgICAgcmVsb2FkT25TZWFyY2g6IGZhbHNlDQotICAgICAgfSkuDQotICAgICAgd2hlbignLzpjb3JlL3BsdWdpbnMvOmxlZ2FjeXR5cGUnLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL3BsdWdpbnMuaHRtbCcsDQotICAgICAgICBjb250cm9sbGVyOiAnUGx1Z2luc0NvbnRyb2xsZXInLA0KLSAgICAgICAgcmVsb2FkT25TZWFyY2g6IGZhbHNlDQotICAgICAgfSkuDQotICAgICAgd2hlbignLzpjb3JlL3F1ZXJ5Jywgew0KLSAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9xdWVyeS5odG1sJywNCi0gICAgICAgIGNvbnRyb2xsZXI6ICdRdWVyeUNvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignLzpjb3JlL3N0cmVhbScsIHsNCi0gICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvc3RyZWFtLmh0bWwnLA0KLSAgICAgICAgY29udHJvbGxlcjogJ1N0cmVhbUNvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignLzpjb3JlL3JlcGxpY2F0aW9uJywgew0KLSAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9yZXBsaWNhdGlvbi5odG1sJywNCi0gICAgICAgIGNvbnRyb2xsZXI6ICdSZXBsaWNhdGlvbkNvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignLzpjb3JlL2RhdGFpbXBvcnQnLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2RhdGFpbXBvcnQuaHRtbCcsDQotICAgICAgICBjb250cm9sbGVyOiAnRGF0YUltcG9ydENvbnRyb2xsZXInDQotICAgICAgfSkuDQotICAgICAgd2hlbignLzpjb3JlL2RhdGFpbXBvcnQvOmhhbmRsZXIqJywgew0KLSAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9kYXRhaW1wb3J0Lmh0bWwnLA0KLSAgICAgICAgY29udHJvbGxlcjogJ0RhdGFJbXBvcnRDb250cm9sbGVyJw0KLSAgICAgIH0pLg0KLSAgICAgIHdoZW4oJy86Y29yZS9zY2hlbWEnLCB7DQotICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL3NjaGVtYS5odG1sJywNCi0gICAgICAgIGNvbnRyb2xsZXI6ICdTY2hlbWFDb250cm9sbGVyJw0KLSAgICAgIH0pLg0KLSAgICAgIHdoZW4oJy86Y29yZS9zZWdtZW50cycsIHsNCi0gICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvc2VnbWVudHMuaHRtbCcsDQotICAgICAgICBjb250cm9sbGVyOiAnU2VnbWVudHNDb250cm9sbGVyJw0KLSAgICAgIH0pLg0KLSAgICAgIG90aGVyd2lzZSh7DQotICAgICAgICByZWRpcmVjdFRvOiAnLycNCi0gICAgICB9KTsNCi19XSkNCi0uY29uc3RhbnQoJ0NvbnN0YW50cycsIHsNCi0gIElTX1JPT1RfUEFHRTogMSwNCi0gIElTX0NPUkVfUEFHRTogMiwNCi0gIElTX0NPTExFQ1RJT05fUEFHRTogMywNCi0gIFJPT1RfVVJMOiAiLyINCi19KQ0KLS5maWx0ZXIoJ3VyaWVuY29kZScsIGZ1bmN0aW9uKCkgew0KLSAgcmV0dXJuIHdpbmRvdy5lbmNvZGVVUklDb21wb25lbnQ7DQotfSkNCi0uZmlsdGVyKCdoaWdobGlnaHQnLCBmdW5jdGlvbigkc2NlKSB7DQotICByZXR1cm4gZnVuY3Rpb24oaW5wdXQsIGxhbmcpIHsNCi0gICAgaWYgKGxhbmcgJiYgaW5wdXQgJiYgbGFuZyE9InR4dCIpIHJldHVybiBobGpzLmhpZ2hsaWdodChsYW5nLCBpbnB1dCkudmFsdWU7DQotICAgIHJldHVybiBpbnB1dDsNCi0gIH0NCi19KQ0KLS5maWx0ZXIoJ3Vuc2FmZScsIGZ1bmN0aW9uKCRzY2UpIHsgcmV0dXJuICRzY2UudHJ1c3RBc0h0bWw7IH0pDQotLmRpcmVjdGl2ZSgnbG9hZGluZ1N0YXR1c01lc3NhZ2UnLCBmdW5jdGlvbigpIHsNCi0gIHJldHVybiB7DQotICAgIGxpbms6IGZ1bmN0aW9uKCRzY29wZSwgJGVsZW1lbnQsIGF0dHJzKSB7DQotICAgICAgdmFyIHNob3cgPSBmdW5jdGlvbigpIHskZWxlbWVudC5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKX07DQotICAgICAgdmFyIGhpZGUgPSBmdW5jdGlvbigpIHskZWxlbWVudC5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpfTsNCi0gICAgICAkc2NvcGUuJG9uKCdsb2FkaW5nU3RhdHVzQWN0aXZlJywgc2hvdyk7DQotICAgICAgJHNjb3BlLiRvbignbG9hZGluZ1N0YXR1c0luYWN0aXZlJywgaGlkZSk7DQotICAgIH0NCi0gIH07DQotfSkNCi0uZGlyZWN0aXZlKCdlc2NhcGVQcmVzc2VkJywgZnVuY3Rpb24gKCkgew0KLSAgICByZXR1cm4gZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycykgew0KLSAgICAgICAgZWxlbWVudC5iaW5kKCJrZXlkb3duIGtleXByZXNzIiwgZnVuY3Rpb24gKGV2ZW50KSB7DQotICAgICAgICAgICAgaWYoZXZlbnQud2hpY2ggPT09IDI3KSB7DQotICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseShmdW5jdGlvbiAoKXsNCi0gICAgICAgICAgICAgICAgICAgIHNjb3BlLiRldmFsKGF0dHJzLmVzY2FwZVByZXNzZWQpOw0KLSAgICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0gICAgfTsNCi19KQ0KLS5kaXJlY3RpdmUoJ2ZvY3VzV2hlbicsIGZ1bmN0aW9uKCR0aW1lb3V0KSB7DQotICByZXR1cm4gew0KLSAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHsNCi0gICAgICBzY29wZS4kd2F0Y2goYXR0cnMuZm9jdXNXaGVuLCBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICAgICAgaWYodmFsdWUgPT09IHRydWUpIHsNCi0gICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgZWxlbWVudFswXS5mb2N1cygpOw0KLSAgICAgICAgICB9LCAxMDApOw0KLSAgICAgICAgfQ0KLSAgICAgIH0pOw0KLSAgICB9DQotICB9Ow0KLX0pDQotLmRpcmVjdGl2ZSgnc2Nyb2xsYWJsZVdoZW5TbWFsbCcsIGZ1bmN0aW9uKCR3aW5kb3cpIHsNCi0gIHJldHVybiB7DQotICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykgew0KLSAgICAgIHZhciB3ID0gYW5ndWxhci5lbGVtZW50KCR3aW5kb3cpOw0KLQ0KLSAgICAgIHZhciBjaGVja0ZpeGVkTWVudSA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgdmFyIHNob3VsZFNjcm9sbCA9IHcuaGVpZ2h0KCkgPCAoZWxlbWVudC5oZWlnaHQoKSArICQoJyNoZWFkZXInKS5oZWlnaHQoKSArIDQwKTsNCi0gICAgICAgIGVsZW1lbnQudG9nZ2xlQ2xhc3MoICdzY3JvbGwnLCBzaG91bGRTY3JvbGwpOw0KLSAgICAgIH07DQotICAgICAgdy5iaW5kKCdyZXNpemUnLCBjaGVja0ZpeGVkTWVudSk7DQotICAgICAgdy5iaW5kKCdsb2FkJywgY2hlY2tGaXhlZE1lbnUpOw0KLSAgICB9DQotICB9DQotfSkNCi0uZmlsdGVyKCdyZWFkYWJsZVNlY29uZHMnLCBmdW5jdGlvbigpIHsNCi0gICAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0KSB7DQotICAgIHNlY29uZHMgPSBwYXJzZUludChpbnB1dHx8MCwgMTApOw0KLSAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IoIHNlY29uZHMgLyA2MCApOw0KLSAgICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKCBtaW51dGVzIC8gNjAgKTsNCi0NCi0gICAgdmFyIHRleHQgPSBbXTsNCi0gICAgaWYoIDAgIT09IGhvdXJzICkgew0KLSAgICAgIHRleHQucHVzaCggaG91cnMgKyAnaCcgKTsNCi0gICAgICBzZWNvbmRzIC09IGhvdXJzICogNjAgKiA2MDsNCi0gICAgICBtaW51dGVzIC09IGhvdXJzICogNjA7DQotICAgIH0NCi0NCi0gICAgaWYoIDAgIT09IG1pbnV0ZXMgKSB7DQotICAgICAgdGV4dC5wdXNoKCBtaW51dGVzICsgJ20nICk7DQotICAgICAgc2Vjb25kcyAtPSBtaW51dGVzICogNjA7DQotICAgIH0NCi0NCi0gICAgaWYoIDAgIT09IHNlY29uZHMgKSB7DQotICAgICAgdGV4dC5wdXNoKCAoICcwJyArIHNlY29uZHMgKS5zdWJzdHIoIC0yICkgKyAncycgKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gdGV4dC5qb2luKCcgJyk7DQotICB9Ow0KLX0pDQotLmZpbHRlcignbnVtYmVyJywgZnVuY3Rpb24oJGxvY2FsZSkgew0KLSAgICByZXR1cm4gZnVuY3Rpb24oaW5wdXQpIHsNCi0gICAgICAgIHZhciBzZXAgPSB7DQotICAgICAgICAgICdkZV9DSCcgOiAnXCcnLA0KLSAgICAgICAgICAnZGUnIDogJy4nLA0KLSAgICAgICAgICAnZW4nIDogJywnLA0KLSAgICAgICAgICAnZXMnIDogJy4nLA0KLSAgICAgICAgICAnaXQnIDogJy4nLA0KLSAgICAgICAgICAnamEnIDogJywnLA0KLSAgICAgICAgICAnc3YnIDogJyAnLA0KLSAgICAgICAgICAndHInIDogJy4nLA0KLSAgICAgICAgICAnXycgOiAnJyAvLyBmYWxsYmFjaw0KLSAgICAgICAgfTsNCi0NCi0gICAgICAgIHZhciBicm93c2VyID0ge307DQotICAgICAgICB2YXIgbWF0Y2ggPSAkbG9jYWxlLmlkLm1hdGNoKCAvXihcd3syfSkoWy1fXShcd3syfSkpPyQvICk7DQotICAgICAgICBpZiAobWF0Y2hbMV0pIHsNCi0gICAgICAgICAgICBicm93c2VyLmxhbmd1YWdlID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtYXRjaFsxXSAmJiBtYXRjaFszXSkgew0KLSAgICAgICAgICAgIGJyb3dzZXIubG9jYWxlID0gbWF0Y2hbMV0gKyAnXycgKyBtYXRjaFszXTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiAoIGlucHV0IHx8IDAgKS50b1N0cmluZygpLnJlcGxhY2UoL1xCKD89KFxkezN9KSsoPyFcZCkpL2csDQotICAgICAgICAgICAgc2VwWyBicm93c2VyLmxvY2FsZSBdIHx8IHNlcFsgYnJvd3Nlci5sYW5ndWFnZSBdIHx8IHNlcFsnXyddKTsNCi0gICAgfTsNCi19KQ0KLS5maWx0ZXIoJ29yZGVyT2JqZWN0QnknLCBmdW5jdGlvbigpIHsNCi0gIHJldHVybiBmdW5jdGlvbihpdGVtcywgZmllbGQsIHJldmVyc2UpIHsNCi0gICAgdmFyIGZpbHRlcmVkID0gW107DQotICAgIGFuZ3VsYXIuZm9yRWFjaChpdGVtcywgZnVuY3Rpb24oaXRlbSkgew0KLSAgICAgIGZpbHRlcmVkLnB1c2goaXRlbSk7DQotICAgIH0pOw0KLSAgICBmaWx0ZXJlZC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7DQotICAgICAgcmV0dXJuIChhW2ZpZWxkXSA+IGJbZmllbGRdID8gMSA6IC0xKTsNCi0gICAgfSk7DQotICAgIGlmKHJldmVyc2UpIGZpbHRlcmVkLnJldmVyc2UoKTsNCi0gICAgcmV0dXJuIGZpbHRlcmVkOw0KLSAgfTsNCi19KQ0KLS5kaXJlY3RpdmUoJ2pzdHJlZScsIGZ1bmN0aW9uKCRwYXJzZSkgew0KLSAgICByZXR1cm4gew0KLSAgICAgICAgcmVzdHJpY3Q6ICdFQScsDQotICAgICAgICBzY29wZTogew0KLSAgICAgICAgICBkYXRhOiAnPScsDQotICAgICAgICAgIG9uU2VsZWN0OiAnJicNCi0gICAgICAgIH0sDQotICAgICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHsNCi0gICAgICAgICAgICBzY29wZS4kd2F0Y2goImRhdGEiLCBmdW5jdGlvbihuZXdWYWx1ZSwgb2xkVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7DQotICAgICAgICAgICAgICAgICAgdmFyIHRyZWVDb25maWcgPSB7DQotICAgICAgICAgICAgICAgICAgICAgICJwbHVnaW5zIiA6IFsgInRoZW1lcyIsICJqc29uX2RhdGEiLCAidWkiIF0sDQotICAgICAgICAgICAgICAgICAgICAgICJqc29uX2RhdGEiIDogew0KLSAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIiA6IHNjb3BlLmRhdGEsDQotICAgICAgICAgICAgICAgICAgICAgICAgInByb2dyZXNzaXZlX3JlbmRlciIgOiB0cnVlDQotICAgICAgICAgICAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgICAgICAgICAgICJjb3JlIiA6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiYW5pbWF0aW9uIiA6IDANCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgIH07DQotDQotICAgICAgICAgICAgICAgICAgdmFyIHRyZWUgPSAkKGVsZW1lbnQpLmpzdHJlZSh0cmVlQ29uZmlnKTsNCi0gICAgICAgICAgICAgICAgICB0cmVlLmpzdHJlZSgnb3Blbl9ub2RlJywnbGk6Zmlyc3QnKTsNCi0gICAgICAgICAgICAgICAgICBpZiAodHJlZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmJpbmQoInNlbGVjdF9ub2RlLmpzdHJlZSIsIGZ1bmN0aW9uIChldmVudCwgZGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm9uU2VsZWN0KHt1cmw6IGRhdGEuYXJnc1swXS5ocmVmLCBkYXRhOiBkYXRhfSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgIH07DQotfSkNCi0uZGlyZWN0aXZlKCdjb25uZWN0aW9uTWVzc2FnZScsIGZ1bmN0aW9uKCkgew0KLSAgcmV0dXJuIHsNCi0gICAgbGluazogZnVuY3Rpb24oJHNjb3BlLCAkZWxlbWVudCwgYXR0cnMpIHsNCi0gICAgICB2YXIgc2hvdyA9IGZ1bmN0aW9uKCkgeyRlbGVtZW50LmNzcygnZGlzcGxheScsICdibG9jaycpfTsNCi0gICAgICB2YXIgaGlkZSA9IGZ1bmN0aW9uKCkgeyRlbGVtZW50LmNzcygnZGlzcGxheScsICdub25lJyl9Ow0KLSAgICAgICRzY29wZS4kb24oJ2Nvbm5lY3Rpb25TdGF0dXNBY3RpdmUnLCBzaG93KTsNCi0gICAgICAkc2NvcGUuJG9uKCdjb25uZWN0aW9uU3RhdHVzSW5hY3RpdmUnLCBoaWRlKTsNCi0gICAgfQ0KLSAgfTsNCi19KQ0KLS5mYWN0b3J5KCdodHRwSW50ZXJjZXB0b3InLCBmdW5jdGlvbigkcSwgJHJvb3RTY29wZSwgJHRpbWVvdXQsICRpbmplY3Rvcikgew0KLSAgdmFyIGFjdGl2ZVJlcXVlc3RzID0gMDsNCi0NCi0gIHZhciBzdGFydGVkID0gZnVuY3Rpb24oY29uZmlnKSB7DQotICAgIGlmIChhY3RpdmVSZXF1ZXN0cyA9PSAwKSB7DQotICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCdsb2FkaW5nU3RhdHVzQWN0aXZlJyk7DQotICAgIH0NCi0gICAgaWYgKCRyb290U2NvcGUuZXhjZXB0aW9uc1tjb25maWcudXJsXSkgew0KLSAgICAgIGRlbGV0ZSAkcm9vdFNjb3BlLmV4Y2VwdGlvbnNbY29uZmlnLnVybF07DQotICAgIH0NCi0gICAgYWN0aXZlUmVxdWVzdHMrKzsNCi0gICAgY29uZmlnLnRpbWVvdXQgPSAxMDAwMDsNCi0gICAgcmV0dXJuIGNvbmZpZyB8fCAkcS53aGVuKGNvbmZpZyk7DQotICB9Ow0KLQ0KLSAgdmFyIGVuZGVkID0gZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgYWN0aXZlUmVxdWVzdHMtLTsNCi0gICAgaWYgKGFjdGl2ZVJlcXVlc3RzID09IDApIHsNCi0gICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJ2xvYWRpbmdTdGF0dXNJbmFjdGl2ZScpOw0KLSAgICB9DQotICAgIGlmICgkcm9vdFNjb3BlLnJldHJ5Q291bnQ+MCkgew0KLSAgICAgICRyb290U2NvcGUuY29ubmVjdGlvblJlY292ZXJlZCA9IHRydWU7DQotICAgICAgJHJvb3RTY29wZS5yZXRyeUNvdW50PTA7DQotICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7DQotICAgICAgICAkcm9vdFNjb3BlLmNvbm5lY3Rpb25SZWNvdmVyZWQ9ZmFsc2U7DQotICAgICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJ2Nvbm5lY3Rpb25TdGF0dXNJbmFjdGl2ZScpOw0KLSAgICAgIH0sMjAwMCk7DQotICAgIH0NCi0gICAgcmV0dXJuIHJlc3BvbnNlIHx8ICRxLndoZW4ocmVzcG9uc2UpOw0KLSAgfTsNCi0NCi0gIHZhciBmYWlsZWQgPSBmdW5jdGlvbihyZWplY3Rpb24pIHsNCi0gICAgYWN0aXZlUmVxdWVzdHMtLTsNCi0gICAgaWYgKGFjdGl2ZVJlcXVlc3RzID09IDApIHsNCi0gICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJ2xvYWRpbmdTdGF0dXNJbmFjdGl2ZScpOw0KLSAgICB9DQotICAgIGlmIChyZWplY3Rpb24uY29uZmlnLmhlYWRlcnMuZG9Ob3RJbnRlcmNlcHQpIHsNCi0gICAgICAgIHJldHVybiByZWplY3Rpb247DQotICAgIH0NCi0gICAgaWYgKHJlamVjdGlvbi5zdGF0dXMgPT09IDApIHsNCi0gICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJ2Nvbm5lY3Rpb25TdGF0dXNBY3RpdmUnKTsNCi0gICAgICBpZiAoISRyb290U2NvcGUucmV0cnlDb3VudCkgJHJvb3RTY29wZS5yZXRyeUNvdW50PTA7DQotICAgICAgJHJvb3RTY29wZS5yZXRyeUNvdW50ICsrOw0KLSAgICAgIHZhciAkaHR0cCA9ICRpbmplY3Rvci5nZXQoJyRodHRwJyk7DQotICAgICAgdmFyIHJlc3VsdCA9ICRodHRwKHJlamVjdGlvbi5jb25maWcpOw0KLSAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgJHJvb3RTY29wZS5leGNlcHRpb25zW3JlamVjdGlvbi5jb25maWcudXJsXSA9IHJlamVjdGlvbi5kYXRhLmVycm9yOw0KLSAgICB9DQotICAgIHJldHVybiAkcS5yZWplY3QocmVqZWN0aW9uKTsNCi0gIH0NCi0NCi0gIHJldHVybiB7cmVxdWVzdDogc3RhcnRlZCwgcmVzcG9uc2U6IGVuZGVkLCByZXNwb25zZUVycm9yOiBmYWlsZWR9Ow0KLX0pDQotLmNvbmZpZyhmdW5jdGlvbigkaHR0cFByb3ZpZGVyKSB7DQotICAkaHR0cFByb3ZpZGVyLmludGVyY2VwdG9ycy5wdXNoKCJodHRwSW50ZXJjZXB0b3IiKTsNCi19KQ0KLS5kaXJlY3RpdmUoJ2ZpbGVNb2RlbCcsIGZ1bmN0aW9uICgkcGFyc2UpIHsNCi0gICAgcmV0dXJuIHsNCi0gICAgICAgIHJlc3RyaWN0OiAnQScsDQotICAgICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHsNCi0gICAgICAgICAgICB2YXIgbW9kZWwgPSAkcGFyc2UoYXR0cnMuZmlsZU1vZGVsKTsNCi0gICAgICAgICAgICB2YXIgbW9kZWxTZXR0ZXIgPSBtb2RlbC5hc3NpZ247DQotDQotICAgICAgICAgICAgZWxlbWVudC5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbigpew0KLSAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24oKXsNCi0gICAgICAgICAgICAgICAgICAgIG1vZGVsU2V0dGVyKHNjb3BlLCBlbGVtZW50WzBdLmZpbGVzWzBdKTsNCi0gICAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgfSk7DQotICAgICAgICB9DQotICAgIH07DQotfSk7DQotDQotc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ01haW5Db250cm9sbGVyJywgZnVuY3Rpb24oJHNjb3BlLCAkcm91dGUsICRyb290U2NvcGUsICRsb2NhdGlvbiwgQ29yZXMsIENvbGxlY3Rpb25zLCBTeXN0ZW0sIFBpbmcsIENvbnN0YW50cykgew0KLQ0KLSAgJHJvb3RTY29wZS5leGNlcHRpb25zPXt9Ow0KLQ0KLSAgJHJvb3RTY29wZS50b2dnbGVFeGNlcHRpb24gPSBmdW5jdGlvbigpIHsNCi0gICAgJHNjb3BlLnNob3dFeGNlcHRpb249ISRzY29wZS5zaG93RXhjZXB0aW9uOw0KLSAgfTsNCi0NCi0gICRzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7DQotICAgICAgJHNjb3BlLmNvcmVzID0gW107DQotICAgICAgJHNjb3BlLmNvbGxlY3Rpb25zID0gW107DQotICB9DQotDQotICAkc2NvcGUucmVmcmVzaCgpOw0KLSAgJHNjb3BlLnJlc2V0TWVudSA9IGZ1bmN0aW9uKHBhZ2UsIHBhZ2VUeXBlKSB7DQotICAgIENvcmVzLmxpc3QoZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICRzY29wZS5jb3JlcyA9IFtdOw0KLSAgICAgIHZhciBjdXJyZW50Q29yZU5hbWUgPSAkcm91dGUuY3VycmVudC5wYXJhbXMuY29yZTsNCi0gICAgICBkZWxldGUgJHNjb3BlLmN1cnJlbnRDb3JlOw0KLSAgICAgIGZvciAoa2V5IGluIGRhdGEuc3RhdHVzKSB7DQotICAgICAgICB2YXIgY29yZSA9IGRhdGEuc3RhdHVzW2tleV07DQotICAgICAgICAkc2NvcGUuY29yZXMucHVzaChjb3JlKTsNCi0gICAgICAgIGlmICgoISRzY29wZS5pc1NvbHJDbG91ZCB8fCBwYWdlVHlwZSA9PSBDb25zdGFudHMuSVNfQ09SRV9QQUdFKSAmJiBjb3JlLm5hbWUgPT0gY3VycmVudENvcmVOYW1lKSB7DQotICAgICAgICAgICAgJHNjb3BlLmN1cnJlbnRDb3JlID0gY29yZTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgJHNjb3BlLnNob3dJbml0RmFpbHVyZXMgPSBPYmplY3Qua2V5cyhkYXRhLmluaXRGYWlsdXJlcykubGVuZ3RoPjA7DQotICAgICAgJHNjb3BlLmluaXRGYWlsdXJlcyA9IGRhdGEuaW5pdEZhaWx1cmVzOw0KLSAgICB9KTsNCi0NCi0gICAgU3lzdGVtLmdldChmdW5jdGlvbihkYXRhKSB7DQotICAgICAgJHNjb3BlLmlzQ2xvdWRFbmFibGVkID0gZGF0YS5tb2RlLm1hdGNoKCAvc29scmNsb3VkL2kgKTsNCi0NCi0gICAgICBpZiAoJHNjb3BlLmlzQ2xvdWRFbmFibGVkKSB7DQotICAgICAgICBDb2xsZWN0aW9ucy5saXN0KGZ1bmN0aW9uIChkYXRhKSB7DQotICAgICAgICAgICRzY29wZS5jb2xsZWN0aW9ucyA9IFtdOw0KLSAgICAgICAgICB2YXIgY3VycmVudENvbGxlY3Rpb25OYW1lID0gJHJvdXRlLmN1cnJlbnQucGFyYW1zLmNvcmU7DQotICAgICAgICAgIGRlbGV0ZSAkc2NvcGUuY3VycmVudENvbGxlY3Rpb247DQotICAgICAgICAgIGZvciAoa2V5IGluIGRhdGEuY29sbGVjdGlvbnMpIHsNCi0gICAgICAgICAgICB2YXIgY29sbGVjdGlvbiA9IHtuYW1lOiBkYXRhLmNvbGxlY3Rpb25zW2tleV19Ow0KLSAgICAgICAgICAgICRzY29wZS5jb2xsZWN0aW9ucy5wdXNoKGNvbGxlY3Rpb24pOw0KLSAgICAgICAgICAgIGlmIChwYWdlVHlwZSA9PSBDb25zdGFudHMuSVNfQ09MTEVDVElPTl9QQUdFICYmIGNvbGxlY3Rpb24ubmFtZSA9PSBjdXJyZW50Q29sbGVjdGlvbk5hbWUpIHsNCi0gICAgICAgICAgICAgICRzY29wZS5jdXJyZW50Q29sbGVjdGlvbiA9IGNvbGxlY3Rpb247DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9DQotICAgICAgICB9KQ0KLSAgICAgIH0NCi0NCi0gICAgfSk7DQotDQotICAgICRzY29wZS5zaG93aW5nTG9nZ2luZyA9IHBhZ2UubGFzdEluZGV4T2YoImxvZ2dpbmciLCAwKSA9PT0gMDsNCi0gICAgJHNjb3BlLnNob3dpbmdDbG91ZCA9IHBhZ2UubGFzdEluZGV4T2YoImNsb3VkIiwgMCkgPT09IDA7DQotICAgICRzY29wZS5wYWdlID0gcGFnZTsNCi0gIH07DQotDQotICAkc2NvcGUucGluZyA9IGZ1bmN0aW9uKCkgew0KLSAgICBQaW5nLnBpbmcoe2NvcmU6ICRzY29wZS5jdXJyZW50Q29yZS5uYW1lfSwgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICRzY29wZS5zaG93UGluZyA9IHRydWU7DQotICAgICAgJHNjb3BlLnBpbmdNUyA9IGRhdGEucmVzcG9uc2VIZWFkZXIuUVRpbWU7DQotICAgIH0pOw0KLSAgICAvLyBAdG9kbyAuYXR0ciggJ3RpdGxlJywgJy9hZG1pbi9waW5nIGlzIG5vdCBjb25maWd1cmVkICgnICsgeGhyLnN0YXR1cyArICc6ICcgKyBlcnJvcl90aHJvd24gKyAnKScgKTsNCi0gIH07DQotDQotICAkc2NvcGUuZHVtcENsb3VkID0gZnVuY3Rpb24oKSB7DQotICAgICAgJHNjb3BlLiRicm9hZGNhc3QoImNsb3VkLWR1bXAiKTsNCi0gIH0NCi0NCi0gICRzY29wZS5zaG93Q29yZSA9IGZ1bmN0aW9uKGNvcmUpIHsNCi0gICAgJGxvY2F0aW9uLnVybCgiLyIgKyBjb3JlLm5hbWUpOw0KLSAgfQ0KLQ0KLSAgJHNjb3BlLnNob3dDb2xsZWN0aW9uID0gZnVuY3Rpb24oY29sbGVjdGlvbikgew0KLSAgICAkbG9jYXRpb24udXJsKCIvIiArIGNvbGxlY3Rpb24ubmFtZSArICIvY29sbGVjdGlvbi1vdmVydmlldyIpDQotICB9DQotDQotICAkc2NvcGUuJG9uKCckcm91dGVDaGFuZ2VTdGFydCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICRyb290U2NvcGUuZXhjZXB0aW9ucyA9IHt9Ow0KLSAgfSk7DQotfSk7DQotDQotDQotKGZ1bmN0aW9uKHdpbmRvdywgYW5ndWxhciwgdW5kZWZpbmVkKSB7DQotICAndXNlIHN0cmljdCc7DQotDQotICBhbmd1bGFyLm1vZHVsZSgnbmdDbGlwYm9hcmQnLCBbXSkuDQotICAgIHByb3ZpZGVyKCduZ0NsaXAnLCBmdW5jdGlvbigpIHsNCi0gICAgICB2YXIgc2VsZiA9IHRoaXM7DQotICAgICAgdGhpcy5wYXRoID0gJy8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL3plcm9jbGlwYm9hcmQvMi4xLjYvWmVyb0NsaXBib2FyZC5zd2YnOw0KLSAgICAgIHJldHVybiB7DQotICAgICAgICBzZXRQYXRoOiBmdW5jdGlvbihuZXdQYXRoKSB7DQotICAgICAgICAgc2VsZi5wYXRoID0gbmV3UGF0aDsNCi0gICAgICAgIH0sDQotICAgICAgICBzZXRDb25maWc6IGZ1bmN0aW9uKGNvbmZpZykgew0KLSAgICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZzsNCi0gICAgICAgIH0sDQotICAgICAgICAkZ2V0OiBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgcmV0dXJuIHsNCi0gICAgICAgICAgICBwYXRoOiBzZWxmLnBhdGgsDQotICAgICAgICAgICAgY29uZmlnOiBzZWxmLmNvbmZpZw0KLSAgICAgICAgICB9Ow0KLSAgICAgICAgfQ0KLSAgICAgIH07DQotICAgIH0pLg0KLSAgICBydW4oWyduZ0NsaXAnLCBmdW5jdGlvbihuZ0NsaXApIHsNCi0gICAgICB2YXIgY29uZmlnID0gew0KLSAgICAgICAgc3dmUGF0aDogbmdDbGlwLnBhdGgsDQotICAgICAgICB0cnVzdGVkRG9tYWluczogWyIqIl0sDQotICAgICAgICBhbGxvd1NjcmlwdEFjY2VzczogImFsd2F5cyIsDQotICAgICAgICBmb3JjZUhhbmRDdXJzb3I6IHRydWUsDQotICAgICAgfTsNCi0gICAgICBaZXJvQ2xpcGJvYXJkLmNvbmZpZyhhbmd1bGFyLmV4dGVuZChjb25maWcsbmdDbGlwLmNvbmZpZyB8fCB7fSkpOw0KLSAgICB9XSkuDQotICAgIGRpcmVjdGl2ZSgnY2xpcENvcHknLCBbJ25nQ2xpcCcsIGZ1bmN0aW9uIChuZ0NsaXApIHsNCi0gICAgICByZXR1cm4gew0KLSAgICAgICAgc2NvcGU6IHsNCi0gICAgICAgICAgY2xpcENvcHk6ICcmJywNCi0gICAgICAgICAgY2xpcENsaWNrOiAnJicsDQotICAgICAgICAgIGNsaXBDbGlja0ZhbGxiYWNrOiAnJicNCi0gICAgICAgIH0sDQotICAgICAgICByZXN0cmljdDogJ0EnLA0KLSAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycykgew0KLSAgICAgICAgICAvLyBCaW5kIGEgZmFsbGJhY2sgZnVuY3Rpb24gaWYgZmxhc2ggaXMgdW5hdmFpbGFibGUNCi0gICAgICAgICAgaWYgKFplcm9DbGlwYm9hcmQuaXNGbGFzaFVudXNhYmxlKCkpIHsNCi0gICAgICAgICAgICBlbGVtZW50LmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oJGV2ZW50KSB7DQotICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBleHByZXNzaW9uIHdpdGggbG9jYWwgdmFyaWFibGVzIGAkZXZlbnRgIGFuZCBgY29weWANCi0gICAgICAgICAgICAgIHNjb3BlLiRhcHBseShzY29wZS5jbGlwQ2xpY2tGYWxsYmFjayh7DQotICAgICAgICAgICAgICAgICRldmVudDogJGV2ZW50LA0KLSAgICAgICAgICAgICAgICBjb3B5OiBzY29wZS4kZXZhbChzY29wZS5jbGlwQ29weSkNCi0gICAgICAgICAgICAgIH0pKTsNCi0gICAgICAgICAgICB9KTsNCi0NCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjbGllbnQgb2JqZWN0DQotICAgICAgICAgIHZhciBjbGllbnQgPSBuZXcgWmVyb0NsaXBib2FyZChlbGVtZW50KTsNCi0gICAgICAgICAgaWYgKGF0dHJzLmNsaXBDb3B5ID09PSAiIikgew0KLSAgICAgICAgICAgIHNjb3BlLmNsaXBDb3B5ID0gZnVuY3Rpb24oc2NvcGUpIHsNCi0gICAgICAgICAgICAgIHJldHVybiBlbGVtZW50WzBdLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaW5uZXJUZXh0Ow0KLSAgICAgICAgICAgIH07DQotICAgICAgICAgIH0NCi0gICAgICAgICAgY2xpZW50Lm9uKCAncmVhZHknLCBmdW5jdGlvbihyZWFkeUV2ZW50KSB7DQotDQotICAgICAgICAgICAgY2xpZW50Lm9uKCdjb3B5JywgZnVuY3Rpb24gKGV2ZW50KSB7DQotICAgICAgICAgICAgICB2YXIgY2xpcGJvYXJkID0gZXZlbnQuY2xpcGJvYXJkRGF0YTsNCi0gICAgICAgICAgICAgIGNsaXBib2FyZC5zZXREYXRhKGF0dHJzLmNsaXBDb3B5TWltZVR5cGUgfHwgJ3RleHQvcGxhaW4nLCBzY29wZS4kZXZhbChzY29wZS5jbGlwQ29weSkpOw0KLSAgICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgICAgIGNsaWVudC5vbiggJ2FmdGVyY29weScsIGZ1bmN0aW9uKGV2ZW50KSB7DQotICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQoYXR0cnMuY2xpcENsaWNrKSkgew0KLSAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoc2NvcGUuY2xpcENsaWNrKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0NCi0gICAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICBjbGllbnQuZGVzdHJveSgpOw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0gICAgICB9Ow0KLSAgICB9XSk7DQotfSkod2luZG93LCB3aW5kb3cuYW5ndWxhcik7DQotDQotDQotLyogVEhFIEJFTE9XIENPREUgSVMgVEFLRU4gRlJPTSBqcy9zY3JpcHRzL2FwcC5qcywgQU5EIFNUSUxMIFJFUVVJUkVTIElOVEVHUkFUSU5HDQotDQotDQotLy8gQHRvZG8gY2xlYXIgdGltZW91dHMNCi0NCi0gICAgLy8gYWN0aXZhdGVfY29yZQ0KLSAgICB0aGlzLmJlZm9yZQ0KLSAgICAoDQotICAgICAge30sDQotICAgICAgZnVuY3Rpb24oIGNvbnRleHQgKQ0KLSAgICAgIHsNCi0NCi0gICAgICAgIHZhciBtZW51X3dyYXBwZXIgPSAkKCAnI21lbnUtd3JhcHBlcicgKTsNCi0NCi0gICAgICAgIC8vIGdsb2JhbCBkYXNoYm9hcmQgZG9lc24ndCBoYXZlIHBhcmFtcy5zcGxhdA0KLSAgICAgICAgaWYoICF0aGlzLnBhcmFtcy5zcGxhdCApDQotICAgICAgICB7DQotICAgICAgICAgIHRoaXMucGFyYW1zLnNwbGF0ID0gWyAnfmluZGV4JyBdOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdmFyIHNlbGVjdG9yID0gJ34nID09PSB0aGlzLnBhcmFtcy5zcGxhdFswXVswXQ0KLSAgICAgICAgICAgICAgICAgICAgID8gJyMnICsgdGhpcy5wYXJhbXMuc3BsYXRbMF0ucmVwbGFjZSggL15+LywgJycgKSArICcuZ2xvYmFsJw0KLSAgICAgICAgICAgICAgICAgICAgIDogJyNjb3JlLXNlbGVjdG9yICMnICsgdGhpcy5wYXJhbXMuc3BsYXRbMF0ucmVwbGFjZSggL1wuL2csICdfXycgKTsNCi0NCi0gICAgICAgIHZhciBhY3RpdmVfZWxlbWVudCA9ICQoIHNlbGVjdG9yLCBtZW51X3dyYXBwZXIgKTsNCi0NCi0gICAgICAgIC8vIEB0b2RvICJUaGVyZSBpcyBubyBjb3JlIHdpdGggdGhpcyBuYW1lIg0KLQ0KLSAgICAgICAgaWYoIGFjdGl2ZV9lbGVtZW50Lmhhc0NsYXNzKCAnZ2xvYmFsJyApICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgYWN0aXZlX2VsZW1lbnQNCi0gICAgICAgICAgICAuYWRkQ2xhc3MoICdhY3RpdmUnICk7DQotDQotICAgICAgICAgIGlmKCB0aGlzLnBhcmFtcy5zcGxhdFsxXSApDQotICAgICAgICAgIHsNCi0gICAgICAgICAgICAkKCAnLicgKyB0aGlzLnBhcmFtcy5zcGxhdFsxXSwgYWN0aXZlX2VsZW1lbnQgKQ0KLSAgICAgICAgICAgICAgLmFkZENsYXNzKCAnYWN0aXZlJyApOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgICQoICcjY29yZS1zZWxlY3RvciBvcHRpb25bc2VsZWN0ZWRdJyApDQotICAgICAgICAgICAgLnJlbW92ZUF0dHIoICdzZWxlY3RlZCcgKQ0KLSAgICAgICAgICAgIC50cmlnZ2VyKCAnbGlzenQ6dXBkYXRlZCcgKTsNCi0NCi0gICAgICAgICAgJCggJyNjb3JlLXNlbGVjdG9yIC5jaHpuLWNvbnRhaW5lciA+IGEnICkNCi0gICAgICAgICAgICAuYWRkQ2xhc3MoICdjaHpuLWRlZmF1bHQnICk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgIGFjdGl2ZV9lbGVtZW50DQotICAgICAgICAgICAgLmF0dHIoICdzZWxlY3RlZCcsICdzZWxlY3RlZCcgKQ0KLSAgICAgICAgICAgIC50cmlnZ2VyKCAnbGlzenQ6dXBkYXRlZCcgKTsNCi0NCi0NCi0gICAgICAgICAgJCggJyNjb3JlLW1lbnUgLicgKyB0aGlzLnBhcmFtcy5zcGxhdFsxXSApDQotICAgICAgICAgICAgLmFkZENsYXNzKCAnYWN0aXZlJyApOw0KLQ0KLSAgICAgIH0NCi0gICAgKTsNCi0gIH0NCi0pOw0KLQ0KLXZhciBzb2xyX2FkbWluID0gZnVuY3Rpb24oIGFwcF9jb25maWcgKQ0KLXsNCi0gIHRoaXMubWVudV9lbGVtZW50ID0gJCggJyNjb3JlLXNlbGVjdG9yIHNlbGVjdCcgKTsNCi0gIHRoaXMuY29yZV9tZW51ID0gJCggJyNjb3JlLW1lbnUgdWwnICk7DQotDQotICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsNCi0gIHRoaXMudGltZW91dCA9IG51bGw7DQotDQotICB0aGlzLmNvcmVfcmVnZXhfYmFzZSA9ICdeI1xcLyhbXFx3XFxkLVxcLl0rKSc7DQotDQotICBzaG93X2dsb2JhbF9lcnJvciA9IGZ1bmN0aW9uKCBlcnJvciApDQotICB7DQotICAgIHZhciBtYWluID0gJCggJyNtYWluJyApOw0KLQ0KLSAgICAkKCAnZGl2W2lkJD0iLXdyYXBwZXIiXScsIG1haW4gKQ0KLSAgICAgIC5yZW1vdmUoKTsNCi0NCi0gICAgbWFpbg0KLSAgICAgIC5hZGRDbGFzcyggJ2Vycm9yJyApDQotICAgICAgLmFwcGVuZCggZXJyb3IgKTsNCi0NCi0gICAgdmFyIHByZV90YWdzID0gJCggJ3ByZScsIG1haW4gKTsNCi0gICAgaWYoIDAgIT09IHByZV90YWdzLnNpemUoKSApDQotICAgIHsNCi0gICAgICBobGpzLmhpZ2hsaWdodEJsb2NrKCBwcmVfdGFncy5nZXQoMCkgKTsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gIHNvcnRfY29yZXNfZGF0YSA9IGZ1bmN0aW9uIHNvcnRfY29yZXNfZGF0YSggY29yZXNfc3RhdHVzICkNCi0gIHsNCi0gICAgLy8gYnVpbGQgYXJyYXkgb2YgY29yZS1uYW1lcyBmb3Igc29ydGluZw0KLSAgICB2YXIgY29yZV9uYW1lcyA9IFtdOw0KLSAgICBmb3IoIHZhciBjb3JlX25hbWUgaW4gY29yZXNfc3RhdHVzICkNCi0gICAgew0KLSAgICAgIGNvcmVfbmFtZXMucHVzaCggY29yZV9uYW1lICk7DQotICAgIH0NCi0gICAgY29yZV9uYW1lcy5zb3J0KCk7DQotDQotICAgIHZhciBjb3JlX2NvdW50ID0gY29yZV9uYW1lcy5sZW5ndGg7DQotICAgIHZhciBjb3JlcyA9IHt9Ow0KLQ0KLSAgICBmb3IoIHZhciBpID0gMDsgaSA8IGNvcmVfY291bnQ7IGkrKyApDQotICAgIHsNCi0gICAgICB2YXIgY29yZV9uYW1lID0gY29yZV9uYW1lc1tpXTsNCi0gICAgICBjb3Jlc1tjb3JlX25hbWVdID0gY29yZXNfc3RhdHVzW2NvcmVfbmFtZV07DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIGNvcmVzOw0KLSAgfTsNCi0NCi0gIHRoaXMuc2V0X2NvcmVzX2RhdGEgPSBmdW5jdGlvbiBzZXRfY29yZXNfZGF0YSggY29yZXMgKQ0KLSAgew0KLSAgICB0aGF0LmNvcmVzX2RhdGEgPSBzb3J0X2NvcmVzX2RhdGEoIGNvcmVzLnN0YXR1cyApOw0KLQ0KLSAgICB0aGF0Lm1lbnVfZWxlbWVudA0KLSAgICAgIC5lbXB0eSgpOw0KLQ0KLSAgICB2YXIgY29yZV9saXN0ID0gW107DQotICAgIGNvcmVfbGlzdC5wdXNoKCAnPG9wdGlvbj48L29wdGlvbj4nICk7DQotDQotICAgIHZhciBjb3JlX2NvdW50ID0gMDsNCi0gICAgZm9yKCB2YXIgY29yZV9uYW1lIGluIHRoYXQuY29yZXNfZGF0YSApDQotICAgIHsNCi0gICAgICBjb3JlX2NvdW50Kys7DQotICAgICAgdmFyIGNvcmVfcGF0aCA9IGNvbmZpZy5zb2xyX3BhdGggKyAnLycgKyBjb3JlX25hbWU7DQotICAgICAgdmFyIGNsYXNzZXMgPSBbXTsNCi0NCi0gICAgICBpZiggY29yZXMuc3RhdHVzW2NvcmVfbmFtZV1bJ2lzRGVmYXVsdENvcmUnXSApDQotICAgICAgew0KLSAgICAgICAgY2xhc3Nlcy5wdXNoKCAnZGVmYXVsdCcgKTsNCi0gICAgICB9DQotDQotICAgICAgdmFyIGNvcmVfdHBsID0gJzxvcHRpb24gJw0KLSAgICAgICAgICAgICAgICAgICArICcgICAgaWQ9IicgKyBjb3JlX25hbWUucmVwbGFjZSggL1wuL2csICdfXycgKSArICciICcNCi0gICAgICAgICAgICAgICAgICAgKyAnICAgIGNsYXNzPSInICsgY2xhc3Nlcy5qb2luKCAnICcgKSArICciJw0KLSAgICAgICAgICAgICAgICAgICArICcgICAgZGF0YS1iYXNlcGF0aD0iJyArIGNvcmVfcGF0aCArICciJw0KLSAgICAgICAgICAgICAgICAgICArICcgICAgc2NoZW1hPSInICsgY29yZXMuc3RhdHVzW2NvcmVfbmFtZV1bJ3NjaGVtYSddICsgJyInDQotICAgICAgICAgICAgICAgICAgICsgJyAgICBjb25maWc9IicgKyBjb3Jlcy5zdGF0dXNbY29yZV9uYW1lXVsnY29uZmlnJ10gKyAnIicNCi0gICAgICAgICAgICAgICAgICAgKyAnICAgIHZhbHVlPSIjLycgKyBjb3JlX25hbWUgKyAnIicNCi0gICAgICAgICAgICAgICAgICAgKyAnICAgIHRpdGxlPSInICsgY29yZV9uYW1lICsgJyInDQotICAgICAgICAgICAgICAgICAgICsgJz4nDQotICAgICAgICAgICAgICAgICAgICsgY29yZV9uYW1lDQotICAgICAgICAgICAgICAgICAgICsgJzwvb3B0aW9uPic7DQotDQotICAgICAgY29yZV9saXN0LnB1c2goIGNvcmVfdHBsICk7DQotICAgIH0NCi0NCi0gICAgdmFyIGhhc19jb3JlcyA9IDAgIT09IGNvcmVfY291bnQ7DQotICAgIGlmKCBoYXNfY29yZXMgKQ0KLSAgICB7DQotICAgICAgdGhhdC5tZW51X2VsZW1lbnQNCi0gICAgICAgIC5hcHBlbmQoIGNvcmVfbGlzdC5qb2luKCAiXG4iICkgKQ0KLSAgICAgICAgLnRyaWdnZXIoICdsaXN6dDp1cGRhdGVkJyApOw0KLSAgICB9DQotDQotICAgIHZhciBjb3JlX3NlbGVjdG9yID0gJCggJyNjb3JlLXNlbGVjdG9yJyApOw0KLQ0KLSAgICBpZiggaGFzX2NvcmVzICkNCi0gICAgew0KLSAgICAgIHZhciBjb3Jlc19lbGVtZW50ID0gY29yZV9zZWxlY3Rvci5maW5kKCAnI2hhcy1jb3JlcycgKTsNCi0gICAgICB2YXIgc2VsZWN0b3Jfd2lkdGggPSBjb3Jlc19lbGVtZW50LndpZHRoKCk7DQotDQotICAgICAgY29yZXNfZWxlbWVudC5maW5kKCAnLmNoem4tY29udGFpbmVyJyApDQotICAgICAgICAuY3NzKCAnd2lkdGgnLCBzZWxlY3Rvcl93aWR0aCArICdweCcgKTsNCi0NCi0gICAgICBjb3Jlc19lbGVtZW50LmZpbmQoICcuY2h6bi1kcm9wJyApDQotICAgICAgICAuY3NzKCAnd2lkdGgnLCAoIHNlbGVjdG9yX3dpZHRoIC0gMiApICsgJ3B4JyApOw0KLSAgICB9DQotICB9Ow0KLQ0KLSAgdGhpcy5ydW4gPSBmdW5jdGlvbigpDQotICB7DQotICAgICQuYWpheA0KLSAgICAoDQotICAgICAgew0KLSAgICAgICAgLy8gbG9hZCBjb3JlcyAoaW5kZXhJbmZvID0gZmFsc2UNCi0gICAgICAgIHN1Y2Nlc3MgOiBmdW5jdGlvbiggcmVzcG9uc2UgKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgICB2YXIgc3lzdGVtX3VybCA9IGNvbmZpZy5zb2xyX3BhdGggKyAnL2FkbWluL2luZm8vc3lzdGVtP3d0PWpzb24nOw0KLSAgICAgICAgICAkLmFqYXgNCi0gICAgICAgICAgKA0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgIHVybCA6IHN5c3RlbV91cmwsDQotICAgICAgICAgICAgICBkYXRhVHlwZSA6ICdqc29uJywNCi0gICAgICAgICAgICAgIGJlZm9yZVNlbmQgOiBmdW5jdGlvbiggYXJyLCBmb3JtLCBvcHRpb25zICkNCi0gICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgICBzdWNjZXNzIDogZnVuY3Rpb24oIHJlc3BvbnNlICkNCi0gICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhhdC5kYXNoYm9hcmRfdmFsdWVzID0gcmVzcG9uc2U7DQotDQotICAgICAgICAgICAgICAgIHZhciBlbnZpcm9ubWVudF9hcmdzID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgdmFyIGNsb3VkX2FyZ3MgPSBudWxsOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiggcmVzcG9uc2UuanZtICYmIHJlc3BvbnNlLmp2bS5qbXggJiYgcmVzcG9uc2UuanZtLmpteC5jb21tYW5kTGluZUFyZ3MgKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgdmFyIGNvbW1hbmRfbGluZV9hcmdzID0gcmVzcG9uc2UuanZtLmpteC5jb21tYW5kTGluZUFyZ3Muam9pbiggJyB8ICcgKTsNCi0NCi0gICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF9hcmdzID0gY29tbWFuZF9saW5lX2FyZ3MubWF0Y2goIC8tRHNvbHIuZW52aXJvbm1lbnQ9KChkZXZ8dGVzdHxwcm9kKT9bXHdcZF0qKS9pICk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0vLyBAdG9kbyBkZXRlY3QgJHNjb3BlLmlzQ2xvdWQgPSByZXNwb25zZS5tb2RlLm1hdGNoKCAvc29scmNsb3VkL2kgKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gZW52aXJvbm1lbnQNCi0NCi0gICAgICAgICAgICAgICAgdmFyIHdyYXBwZXIgPSAkKCAnI3dyYXBwZXInICk7DQotICAgICAgICAgICAgICAgIHZhciBlbnZpcm9ubWVudF9lbGVtZW50ID0gJCggJyNlbnZpcm9ubWVudCcgKTsNCi0gICAgICAgICAgICAgICAgaWYoIGVudmlyb25tZW50X2FyZ3MgKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgd3JhcHBlcg0KLSAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCAnaGFzLWVudmlyb25tZW50JyApOw0KLQ0KLSAgICAgICAgICAgICAgICAgIGlmKCBlbnZpcm9ubWVudF9hcmdzWzFdICkNCi0gICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF9lbGVtZW50DQotICAgICAgICAgICAgICAgICAgICAgIC5odG1sKCBlbnZpcm9ubWVudF9hcmdzWzFdICk7DQotICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgIGlmKCBlbnZpcm9ubWVudF9hcmdzWzJdICkNCi0gICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF9lbGVtZW50DQotICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyggZW52aXJvbm1lbnRfYXJnc1syXSApOw0KLSAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICB3cmFwcGVyDQotICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoICdoYXMtZW52aXJvbm1lbnQnICk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy8gY2xvdWQNCi0NCi0gICAgICAgICAgICAgICAgdmFyIGNsb3VkX25hdl9lbGVtZW50ID0gJCggJyNtZW51ICNjbG91ZCcgKTsNCi0gICAgICAgICAgICAgICAgaWYoIGNsb3VkX2FyZ3MgKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgY2xvdWRfbmF2X2VsZW1lbnQNCi0gICAgICAgICAgICAgICAgICAgIC5zaG93KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy8gc2FtbXkNCi0NCi0gICAgICAgICAgICAgICAgc2FtbXkucnVuKCBsb2NhdGlvbi5oYXNoICk7DQotICAgICAgICAgICAgICB9LA0KLSAgICAgICAgICAgICAgZXJyb3IgOiBmdW5jdGlvbigpDQotICAgICAgICAgICAgICB7DQotICB9Ow0KLSovDQorLyoKKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCit2YXIgc29sckFkbWluQXBwID0gYW5ndWxhci5tb2R1bGUoInNvbHJBZG1pbkFwcCIsIFsKKyAgIm5nUmVzb3VyY2UiLAorICAibmdSb3V0ZSIsCisgICJuZ0Nvb2tpZXMiLAorICAibmd0aW1lYWdvIiwKKyAgInNvbHJBZG1pblNlcnZpY2VzIiwKKyAgImxvY2FseXRpY3MuZGlyZWN0aXZlcyIKK10pOworCitzb2xyQWRtaW5BcHAuY29uZmlnKFsKKyAgJyRyb3V0ZVByb3ZpZGVyJywgZnVuY3Rpb24oJHJvdXRlUHJvdmlkZXIpIHsKKyAgICAkcm91dGVQcm92aWRlci4KKyAgICAgIHdoZW4oJy8nLCB7CisgICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvaW5kZXguaHRtbCcsCisgICAgICAgIGNvbnRyb2xsZXI6ICdJbmRleENvbnRyb2xsZXInCisgICAgICB9KS4KKyAgICAgIHdoZW4oJy9+bG9nZ2luZycsIHsKKyAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9sb2dnaW5nLmh0bWwnLAorICAgICAgICBjb250cm9sbGVyOiAnTG9nZ2luZ0NvbnRyb2xsZXInCisgICAgICB9KS4KKyAgICAgIHdoZW4oJy9+bG9nZ2luZy9sZXZlbCcsIHsKKyAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9sb2dnaW5nLWxldmVscy5odG1sJywKKyAgICAgICAgY29udHJvbGxlcjogJ0xvZ2dpbmdMZXZlbENvbnRyb2xsZXInCisgICAgICB9KS4KKyAgICAgIHdoZW4oJy9+Y2xvdWQnLCB7CisgICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvY2xvdWQuaHRtbCcsCisgICAgICAgIGNvbnRyb2xsZXI6ICdDbG91ZENvbnRyb2xsZXInCisgICAgICB9KS4KKyAgICAgIHdoZW4oJy9+Y29yZXMnLCB7CisgICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvY29yZXMuaHRtbCcsCisgICAgICAgIGNvbnRyb2xsZXI6ICdDb3JlQWRtaW5Db250cm9sbGVyJworICAgICAgfSkuCisgICAgICB3aGVuKCcvfmNvcmVzLzpjb3JlbmFtZScsIHsKKyAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9jb3Jlcy5odG1sJywKKyAgICAgICAgY29udHJvbGxlcjogJ0NvcmVBZG1pbkNvbnRyb2xsZXInCisgICAgICB9KS4KKyAgICAgIHdoZW4oJy9+Y29sbGVjdGlvbnMnLCB7CisgICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvY29sbGVjdGlvbnMuaHRtbCcsCisgICAgICAgIGNvbnRyb2xsZXI6ICdDb2xsZWN0aW9uc0NvbnRyb2xsZXInCisgICAgICB9KS4KKyAgICAgIHdoZW4oJy9+Y29sbGVjdGlvbnMvOmNvbGxlY3Rpb24nLCB7CisgICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvY29sbGVjdGlvbnMuaHRtbCcsCisgICAgICAgIGNvbnRyb2xsZXI6ICdDb2xsZWN0aW9uc0NvbnRyb2xsZXInCisgICAgICB9KS4KKyAgICAgIHdoZW4oJy9+dGhyZWFkcycsIHsKKyAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy90aHJlYWRzLmh0bWwnLAorICAgICAgICBjb250cm9sbGVyOiAnVGhyZWFkc0NvbnRyb2xsZXInCisgICAgICB9KS4KKyAgICAgIHdoZW4oJy9+amF2YS1wcm9wZXJ0aWVzJywgeworICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2phdmEtcHJvcGVydGllcy5odG1sJywKKyAgICAgICAgY29udHJvbGxlcjogJ0phdmFQcm9wZXJ0aWVzQ29udHJvbGxlcicKKyAgICAgIH0pLgorICAgICAgd2hlbignLzpjb3JlJywgeworICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2NvcmVfb3ZlcnZpZXcuaHRtbCcsCisgICAgICAgIGNvbnRyb2xsZXI6ICdDb3JlT3ZlcnZpZXdDb250cm9sbGVyJworICAgICAgfSkuCisgICAgICB3aGVuKCcvOmNvcmUvY29sbGVjdGlvbi1vdmVydmlldycsIHsKKyAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9jb2xsZWN0aW9uX292ZXJ2aWV3Lmh0bWwnLAorICAgICAgICBjb250cm9sbGVyOiAnQ29sbGVjdGlvbk92ZXJ2aWV3Q29udHJvbGxlcicKKyAgICAgIH0pLgorICAgICAgd2hlbignLzpjb3JlL2FuYWx5c2lzJywgeworICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2FuYWx5c2lzLmh0bWwnLAorICAgICAgICBjb250cm9sbGVyOiAnQW5hbHlzaXNDb250cm9sbGVyJworICAgICAgfSkuCisgICAgICB3aGVuKCcvOmNvcmUvZGF0YWltcG9ydCcsIHsKKyAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9kYXRhaW1wb3J0Lmh0bWwnLAorICAgICAgICBjb250cm9sbGVyOiAnRGF0YUltcG9ydENvbnRyb2xsZXInCisgICAgICB9KS4KKyAgICAgIHdoZW4oJy86Y29yZS9kYXRhaW1wb3J0LzpoYW5kbGVyKicsIHsKKyAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9kYXRhaW1wb3J0Lmh0bWwnLAorICAgICAgICBjb250cm9sbGVyOiAnRGF0YUltcG9ydENvbnRyb2xsZXInCisgICAgICB9KS4KKyAgICAgIHdoZW4oJy86Y29yZS9kb2N1bWVudHMnLCB7CisgICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvZG9jdW1lbnRzLmh0bWwnLAorICAgICAgICBjb250cm9sbGVyOiAnRG9jdW1lbnRzQ29udHJvbGxlcicKKyAgICAgIH0pLgorICAgICAgd2hlbignLzpjb3JlL2ZpbGVzJywgeworICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2ZpbGVzLmh0bWwnLAorICAgICAgICBjb250cm9sbGVyOiAnRmlsZXNDb250cm9sbGVyJworICAgICAgfSkuCisgICAgICB3aGVuKCcvOmNvcmUvcGx1Z2lucycsIHsKKyAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9wbHVnaW5zLmh0bWwnLAorICAgICAgICBjb250cm9sbGVyOiAnUGx1Z2luc0NvbnRyb2xsZXInLAorICAgICAgICByZWxvYWRPblNlYXJjaDogZmFsc2UKKyAgICAgIH0pLgorICAgICAgd2hlbignLzpjb3JlL3BsdWdpbnMvOmxlZ2FjeXR5cGUnLCB7CisgICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvcGx1Z2lucy5odG1sJywKKyAgICAgICAgY29udHJvbGxlcjogJ1BsdWdpbnNDb250cm9sbGVyJywKKyAgICAgICAgcmVsb2FkT25TZWFyY2g6IGZhbHNlCisgICAgICB9KS4KKyAgICAgIHdoZW4oJy86Y29yZS9xdWVyeScsIHsKKyAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9xdWVyeS5odG1sJywKKyAgICAgICAgY29udHJvbGxlcjogJ1F1ZXJ5Q29udHJvbGxlcicKKyAgICAgIH0pLgorICAgICAgd2hlbignLzpjb3JlL3N0cmVhbScsIHsKKyAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9zdHJlYW0uaHRtbCcsCisgICAgICAgIGNvbnRyb2xsZXI6ICdTdHJlYW1Db250cm9sbGVyJworICAgICAgfSkuCisgICAgICB3aGVuKCcvOmNvcmUvcmVwbGljYXRpb24nLCB7CisgICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvcmVwbGljYXRpb24uaHRtbCcsCisgICAgICAgIGNvbnRyb2xsZXI6ICdSZXBsaWNhdGlvbkNvbnRyb2xsZXInCisgICAgICB9KS4KKyAgICAgIHdoZW4oJy86Y29yZS9kYXRhaW1wb3J0JywgeworICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2RhdGFpbXBvcnQuaHRtbCcsCisgICAgICAgIGNvbnRyb2xsZXI6ICdEYXRhSW1wb3J0Q29udHJvbGxlcicKKyAgICAgIH0pLgorICAgICAgd2hlbignLzpjb3JlL2RhdGFpbXBvcnQvOmhhbmRsZXIqJywgeworICAgICAgICB0ZW1wbGF0ZVVybDogJ3BhcnRpYWxzL2RhdGFpbXBvcnQuaHRtbCcsCisgICAgICAgIGNvbnRyb2xsZXI6ICdEYXRhSW1wb3J0Q29udHJvbGxlcicKKyAgICAgIH0pLgorICAgICAgd2hlbignLzpjb3JlL3NjaGVtYScsIHsKKyAgICAgICAgdGVtcGxhdGVVcmw6ICdwYXJ0aWFscy9zY2hlbWEuaHRtbCcsCisgICAgICAgIGNvbnRyb2xsZXI6ICdTY2hlbWFDb250cm9sbGVyJworICAgICAgfSkuCisgICAgICB3aGVuKCcvOmNvcmUvc2VnbWVudHMnLCB7CisgICAgICAgIHRlbXBsYXRlVXJsOiAncGFydGlhbHMvc2VnbWVudHMuaHRtbCcsCisgICAgICAgIGNvbnRyb2xsZXI6ICdTZWdtZW50c0NvbnRyb2xsZXInCisgICAgICB9KS4KKyAgICAgIG90aGVyd2lzZSh7CisgICAgICAgIHJlZGlyZWN0VG86ICcvJworICAgICAgfSk7Cit9XSkKKy5jb25zdGFudCgnQ29uc3RhbnRzJywgeworICBJU19ST09UX1BBR0U6IDEsCisgIElTX0NPUkVfUEFHRTogMiwKKyAgSVNfQ09MTEVDVElPTl9QQUdFOiAzLAorICBST09UX1VSTDogIi8iCit9KQorLmZpbHRlcigndXJpZW5jb2RlJywgZnVuY3Rpb24oKSB7CisgIHJldHVybiB3aW5kb3cuZW5jb2RlVVJJQ29tcG9uZW50OworfSkKKy5maWx0ZXIoJ2hpZ2hsaWdodCcsIGZ1bmN0aW9uKCRzY2UpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBsYW5nKSB7CisgICAgaWYgKGxhbmcgJiYgaW5wdXQgJiYgbGFuZyE9InR4dCIpIHJldHVybiBobGpzLmhpZ2hsaWdodChsYW5nLCBpbnB1dCkudmFsdWU7CisgICAgcmV0dXJuIGlucHV0OworICB9Cit9KQorLmZpbHRlcigndW5zYWZlJywgZnVuY3Rpb24oJHNjZSkgeyByZXR1cm4gJHNjZS50cnVzdEFzSHRtbDsgfSkKKy5kaXJlY3RpdmUoJ2xvYWRpbmdTdGF0dXNNZXNzYWdlJywgZnVuY3Rpb24oKSB7CisgIHJldHVybiB7CisgICAgbGluazogZnVuY3Rpb24oJHNjb3BlLCAkZWxlbWVudCwgYXR0cnMpIHsKKyAgICAgIHZhciBzaG93ID0gZnVuY3Rpb24oKSB7JGVsZW1lbnQuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyl9OworICAgICAgdmFyIGhpZGUgPSBmdW5jdGlvbigpIHskZWxlbWVudC5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpfTsKKyAgICAgICRzY29wZS4kb24oJ2xvYWRpbmdTdGF0dXNBY3RpdmUnLCBzaG93KTsKKyAgICAgICRzY29wZS4kb24oJ2xvYWRpbmdTdGF0dXNJbmFjdGl2ZScsIGhpZGUpOworICAgIH0KKyAgfTsKK30pCisuZGlyZWN0aXZlKCdlc2NhcGVQcmVzc2VkJywgZnVuY3Rpb24gKCkgeworICAgIHJldHVybiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7CisgICAgICAgIGVsZW1lbnQuYmluZCgia2V5ZG93biBrZXlwcmVzcyIsIGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICAgICAgaWYoZXZlbnQud2hpY2ggPT09IDI3KSB7CisgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uICgpeworICAgICAgICAgICAgICAgICAgICBzY29wZS4kZXZhbChhdHRycy5lc2NhcGVQcmVzc2VkKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9OworfSkKKy5kaXJlY3RpdmUoJ2ZvY3VzV2hlbicsIGZ1bmN0aW9uKCR0aW1lb3V0KSB7CisgIHJldHVybiB7CisgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7CisgICAgICBzY29wZS4kd2F0Y2goYXR0cnMuZm9jdXNXaGVuLCBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICBpZih2YWx1ZSA9PT0gdHJ1ZSkgeworICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgZWxlbWVudFswXS5mb2N1cygpOworICAgICAgICAgIH0sIDEwMCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgfTsKK30pCisuZGlyZWN0aXZlKCdzY3JvbGxhYmxlV2hlblNtYWxsJywgZnVuY3Rpb24oJHdpbmRvdykgeworICByZXR1cm4geworICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykgeworICAgICAgdmFyIHcgPSBhbmd1bGFyLmVsZW1lbnQoJHdpbmRvdyk7CisKKyAgICAgIHZhciBjaGVja0ZpeGVkTWVudSA9IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgc2hvdWxkU2Nyb2xsID0gdy5oZWlnaHQoKSA8IChlbGVtZW50LmhlaWdodCgpICsgJCgnI2hlYWRlcicpLmhlaWdodCgpICsgNDApOworICAgICAgICBlbGVtZW50LnRvZ2dsZUNsYXNzKCAnc2Nyb2xsJywgc2hvdWxkU2Nyb2xsKTsKKyAgICAgIH07CisgICAgICB3LmJpbmQoJ3Jlc2l6ZScsIGNoZWNrRml4ZWRNZW51KTsKKyAgICAgIHcuYmluZCgnbG9hZCcsIGNoZWNrRml4ZWRNZW51KTsKKyAgICB9CisgIH0KK30pCisuZmlsdGVyKCdyZWFkYWJsZVNlY29uZHMnLCBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZnVuY3Rpb24oaW5wdXQpIHsKKyAgICBzZWNvbmRzID0gcGFyc2VJbnQoaW5wdXR8fDAsIDEwKTsKKyAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IoIHNlY29uZHMgLyA2MCApOworICAgIHZhciBob3VycyA9IE1hdGguZmxvb3IoIG1pbnV0ZXMgLyA2MCApOworCisgICAgdmFyIHRleHQgPSBbXTsKKyAgICBpZiggMCAhPT0gaG91cnMgKSB7CisgICAgICB0ZXh0LnB1c2goIGhvdXJzICsgJ2gnICk7CisgICAgICBzZWNvbmRzIC09IGhvdXJzICogNjAgKiA2MDsKKyAgICAgIG1pbnV0ZXMgLT0gaG91cnMgKiA2MDsKKyAgICB9CisKKyAgICBpZiggMCAhPT0gbWludXRlcyApIHsKKyAgICAgIHRleHQucHVzaCggbWludXRlcyArICdtJyApOworICAgICAgc2Vjb25kcyAtPSBtaW51dGVzICogNjA7CisgICAgfQorCisgICAgaWYoIDAgIT09IHNlY29uZHMgKSB7CisgICAgICB0ZXh0LnB1c2goICggJzAnICsgc2Vjb25kcyApLnN1YnN0ciggLTIgKSArICdzJyApOworICAgIH0KKyAgICByZXR1cm4gdGV4dC5qb2luKCcgJyk7CisgIH07Cit9KQorLmZpbHRlcignbnVtYmVyJywgZnVuY3Rpb24oJGxvY2FsZSkgeworICAgIHJldHVybiBmdW5jdGlvbihpbnB1dCkgeworICAgICAgICB2YXIgc2VwID0geworICAgICAgICAgICdkZV9DSCcgOiAnXCcnLAorICAgICAgICAgICdkZScgOiAnLicsCisgICAgICAgICAgJ2VuJyA6ICcsJywKKyAgICAgICAgICAnZXMnIDogJy4nLAorICAgICAgICAgICdpdCcgOiAnLicsCisgICAgICAgICAgJ2phJyA6ICcsJywKKyAgICAgICAgICAnc3YnIDogJyAnLAorICAgICAgICAgICd0cicgOiAnLicsCisgICAgICAgICAgJ18nIDogJycgLy8gZmFsbGJhY2sKKyAgICAgICAgfTsKKworICAgICAgICB2YXIgYnJvd3NlciA9IHt9OworICAgICAgICB2YXIgbWF0Y2ggPSAkbG9jYWxlLmlkLm1hdGNoKCAvXihcd3syfSkoWy1fXShcd3syfSkpPyQvICk7CisgICAgICAgIGlmIChtYXRjaFsxXSkgeworICAgICAgICAgICAgYnJvd3Nlci5sYW5ndWFnZSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hdGNoWzFdICYmIG1hdGNoWzNdKSB7CisgICAgICAgICAgICBicm93c2VyLmxvY2FsZSA9IG1hdGNoWzFdICsgJ18nICsgbWF0Y2hbM107CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKCBpbnB1dCB8fCAwICkudG9TdHJpbmcoKS5yZXBsYWNlKC9cQig/PShcZHszfSkrKD8hXGQpKS9nLAorICAgICAgICAgICAgc2VwWyBicm93c2VyLmxvY2FsZSBdIHx8IHNlcFsgYnJvd3Nlci5sYW5ndWFnZSBdIHx8IHNlcFsnXyddKTsKKyAgICB9OworfSkKKy5maWx0ZXIoJ29yZGVyT2JqZWN0QnknLCBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW1zLCBmaWVsZCwgcmV2ZXJzZSkgeworICAgIHZhciBmaWx0ZXJlZCA9IFtdOworICAgIGFuZ3VsYXIuZm9yRWFjaChpdGVtcywgZnVuY3Rpb24oaXRlbSkgeworICAgICAgZmlsdGVyZWQucHVzaChpdGVtKTsKKyAgICB9KTsKKyAgICBmaWx0ZXJlZC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CisgICAgICByZXR1cm4gKGFbZmllbGRdID4gYltmaWVsZF0gPyAxIDogLTEpOworICAgIH0pOworICAgIGlmKHJldmVyc2UpIGZpbHRlcmVkLnJldmVyc2UoKTsKKyAgICByZXR1cm4gZmlsdGVyZWQ7CisgIH07Cit9KQorLmRpcmVjdGl2ZSgnanN0cmVlJywgZnVuY3Rpb24oJHBhcnNlKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgcmVzdHJpY3Q6ICdFQScsCisgICAgICAgIHNjb3BlOiB7CisgICAgICAgICAgZGF0YTogJz0nLAorICAgICAgICAgIG9uU2VsZWN0OiAnJicKKyAgICAgICAgfSwKKyAgICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7CisgICAgICAgICAgICBzY29wZS4kd2F0Y2goImRhdGEiLCBmdW5jdGlvbihuZXdWYWx1ZSwgb2xkVmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgIHZhciB0cmVlQ29uZmlnID0geworICAgICAgICAgICAgICAgICAgICAgICJwbHVnaW5zIiA6IFsgInRoZW1lcyIsICJqc29uX2RhdGEiLCAidWkiIF0sCisgICAgICAgICAgICAgICAgICAgICAgImpzb25fZGF0YSIgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSIgOiBzY29wZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgInByb2dyZXNzaXZlX3JlbmRlciIgOiB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAiY29yZSIgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAiYW5pbWF0aW9uIiA6IDAKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICB2YXIgdHJlZSA9ICQoZWxlbWVudCkuanN0cmVlKHRyZWVDb25maWcpOworICAgICAgICAgICAgICAgICAgdHJlZS5qc3RyZWUoJ29wZW5fbm9kZScsJ2xpOmZpcnN0Jyk7CisgICAgICAgICAgICAgICAgICBpZiAodHJlZSkgeworICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYmluZCgic2VsZWN0X25vZGUuanN0cmVlIiwgZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseShmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLm9uU2VsZWN0KHt1cmw6IGRhdGEuYXJnc1swXS5ocmVmLCBkYXRhOiBkYXRhfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIHRydWUpOworICAgICAgICB9CisgICAgfTsKK30pCisuZGlyZWN0aXZlKCdjb25uZWN0aW9uTWVzc2FnZScsIGZ1bmN0aW9uKCkgeworICByZXR1cm4geworICAgIGxpbms6IGZ1bmN0aW9uKCRzY29wZSwgJGVsZW1lbnQsIGF0dHJzKSB7CisgICAgICB2YXIgc2hvdyA9IGZ1bmN0aW9uKCkgeyRlbGVtZW50LmNzcygnZGlzcGxheScsICdibG9jaycpfTsKKyAgICAgIHZhciBoaWRlID0gZnVuY3Rpb24oKSB7JGVsZW1lbnQuY3NzKCdkaXNwbGF5JywgJ25vbmUnKX07CisgICAgICAkc2NvcGUuJG9uKCdjb25uZWN0aW9uU3RhdHVzQWN0aXZlJywgc2hvdyk7CisgICAgICAkc2NvcGUuJG9uKCdjb25uZWN0aW9uU3RhdHVzSW5hY3RpdmUnLCBoaWRlKTsKKyAgICB9CisgIH07Cit9KQorLmZhY3RvcnkoJ2h0dHBJbnRlcmNlcHRvcicsIGZ1bmN0aW9uKCRxLCAkcm9vdFNjb3BlLCAkdGltZW91dCwgJGluamVjdG9yKSB7CisgIHZhciBhY3RpdmVSZXF1ZXN0cyA9IDA7CisKKyAgdmFyIHN0YXJ0ZWQgPSBmdW5jdGlvbihjb25maWcpIHsKKyAgICBpZiAoYWN0aXZlUmVxdWVzdHMgPT0gMCkgeworICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCdsb2FkaW5nU3RhdHVzQWN0aXZlJyk7CisgICAgfQorICAgIGlmICgkcm9vdFNjb3BlLmV4Y2VwdGlvbnNbY29uZmlnLnVybF0pIHsKKyAgICAgIGRlbGV0ZSAkcm9vdFNjb3BlLmV4Y2VwdGlvbnNbY29uZmlnLnVybF07CisgICAgfQorICAgIGFjdGl2ZVJlcXVlc3RzKys7CisgICAgY29uZmlnLnRpbWVvdXQgPSAxMDAwMDsKKyAgICByZXR1cm4gY29uZmlnIHx8ICRxLndoZW4oY29uZmlnKTsKKyAgfTsKKworICB2YXIgZW5kZWQgPSBmdW5jdGlvbihyZXNwb25zZSkgeworICAgIGFjdGl2ZVJlcXVlc3RzLS07CisgICAgaWYgKGFjdGl2ZVJlcXVlc3RzID09IDApIHsKKyAgICAgICRyb290U2NvcGUuJGJyb2FkY2FzdCgnbG9hZGluZ1N0YXR1c0luYWN0aXZlJyk7CisgICAgfQorICAgIGlmICgkcm9vdFNjb3BlLnJldHJ5Q291bnQ+MCkgeworICAgICAgJHJvb3RTY29wZS5jb25uZWN0aW9uUmVjb3ZlcmVkID0gdHJ1ZTsKKyAgICAgICRyb290U2NvcGUucmV0cnlDb3VudD0wOworICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICAgICRyb290U2NvcGUuY29ubmVjdGlvblJlY292ZXJlZD1mYWxzZTsKKyAgICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCdjb25uZWN0aW9uU3RhdHVzSW5hY3RpdmUnKTsKKyAgICAgIH0sMjAwMCk7CisgICAgfQorICAgIHJldHVybiByZXNwb25zZSB8fCAkcS53aGVuKHJlc3BvbnNlKTsKKyAgfTsKKworICB2YXIgZmFpbGVkID0gZnVuY3Rpb24ocmVqZWN0aW9uKSB7CisgICAgYWN0aXZlUmVxdWVzdHMtLTsKKyAgICBpZiAoYWN0aXZlUmVxdWVzdHMgPT0gMCkgeworICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCdsb2FkaW5nU3RhdHVzSW5hY3RpdmUnKTsKKyAgICB9CisgICAgaWYgKHJlamVjdGlvbi5jb25maWcuaGVhZGVycy5kb05vdEludGVyY2VwdCkgeworICAgICAgICByZXR1cm4gcmVqZWN0aW9uOworICAgIH0KKyAgICBpZiAocmVqZWN0aW9uLnN0YXR1cyA9PT0gMCkgeworICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCdjb25uZWN0aW9uU3RhdHVzQWN0aXZlJyk7CisgICAgICBpZiAoISRyb290U2NvcGUucmV0cnlDb3VudCkgJHJvb3RTY29wZS5yZXRyeUNvdW50PTA7CisgICAgICAkcm9vdFNjb3BlLnJldHJ5Q291bnQgKys7CisgICAgICB2YXIgJGh0dHAgPSAkaW5qZWN0b3IuZ2V0KCckaHR0cCcpOworICAgICAgdmFyIHJlc3VsdCA9ICRodHRwKHJlamVjdGlvbi5jb25maWcpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAgJHJvb3RTY29wZS5leGNlcHRpb25zW3JlamVjdGlvbi5jb25maWcudXJsXSA9IHJlamVjdGlvbi5kYXRhLmVycm9yOworICAgIH0KKyAgICByZXR1cm4gJHEucmVqZWN0KHJlamVjdGlvbik7CisgIH0KKworICByZXR1cm4ge3JlcXVlc3Q6IHN0YXJ0ZWQsIHJlc3BvbnNlOiBlbmRlZCwgcmVzcG9uc2VFcnJvcjogZmFpbGVkfTsKK30pCisuY29uZmlnKGZ1bmN0aW9uKCRodHRwUHJvdmlkZXIpIHsKKyAgJGh0dHBQcm92aWRlci5pbnRlcmNlcHRvcnMucHVzaCgiaHR0cEludGVyY2VwdG9yIik7Cit9KQorLmRpcmVjdGl2ZSgnZmlsZU1vZGVsJywgZnVuY3Rpb24gKCRwYXJzZSkgeworICAgIHJldHVybiB7CisgICAgICAgIHJlc3RyaWN0OiAnQScsCisgICAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykgeworICAgICAgICAgICAgdmFyIG1vZGVsID0gJHBhcnNlKGF0dHJzLmZpbGVNb2RlbCk7CisgICAgICAgICAgICB2YXIgbW9kZWxTZXR0ZXIgPSBtb2RlbC5hc3NpZ247CisKKyAgICAgICAgICAgIGVsZW1lbnQuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICAgICAgbW9kZWxTZXR0ZXIoc2NvcGUsIGVsZW1lbnRbMF0uZmlsZXNbMF0pOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9OworfSk7CisKK3NvbHJBZG1pbkFwcC5jb250cm9sbGVyKCdNYWluQ29udHJvbGxlcicsIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlLCAkcm9vdFNjb3BlLCAkbG9jYXRpb24sIENvcmVzLCBDb2xsZWN0aW9ucywgU3lzdGVtLCBQaW5nLCBDb25zdGFudHMpIHsKKworICAkcm9vdFNjb3BlLmV4Y2VwdGlvbnM9e307CisKKyAgJHJvb3RTY29wZS50b2dnbGVFeGNlcHRpb24gPSBmdW5jdGlvbigpIHsKKyAgICAkc2NvcGUuc2hvd0V4Y2VwdGlvbj0hJHNjb3BlLnNob3dFeGNlcHRpb247CisgIH07CisKKyAgJHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHsKKyAgICAgICRzY29wZS5jb3JlcyA9IFtdOworICAgICAgJHNjb3BlLmNvbGxlY3Rpb25zID0gW107CisgIH0KKworICAkc2NvcGUucmVmcmVzaCgpOworICAkc2NvcGUucmVzZXRNZW51ID0gZnVuY3Rpb24ocGFnZSwgcGFnZVR5cGUpIHsKKyAgICBDb3Jlcy5saXN0KGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICRzY29wZS5jb3JlcyA9IFtdOworICAgICAgdmFyIGN1cnJlbnRDb3JlTmFtZSA9ICRyb3V0ZS5jdXJyZW50LnBhcmFtcy5jb3JlOworICAgICAgZGVsZXRlICRzY29wZS5jdXJyZW50Q29yZTsKKyAgICAgIGZvciAoa2V5IGluIGRhdGEuc3RhdHVzKSB7CisgICAgICAgIHZhciBjb3JlID0gZGF0YS5zdGF0dXNba2V5XTsKKyAgICAgICAgJHNjb3BlLmNvcmVzLnB1c2goY29yZSk7CisgICAgICAgIGlmICgoISRzY29wZS5pc1NvbHJDbG91ZCB8fCBwYWdlVHlwZSA9PSBDb25zdGFudHMuSVNfQ09SRV9QQUdFKSAmJiBjb3JlLm5hbWUgPT0gY3VycmVudENvcmVOYW1lKSB7CisgICAgICAgICAgICAkc2NvcGUuY3VycmVudENvcmUgPSBjb3JlOworICAgICAgICB9CisgICAgICB9CisgICAgICAkc2NvcGUuc2hvd0luaXRGYWlsdXJlcyA9IE9iamVjdC5rZXlzKGRhdGEuaW5pdEZhaWx1cmVzKS5sZW5ndGg+MDsKKyAgICAgICRzY29wZS5pbml0RmFpbHVyZXMgPSBkYXRhLmluaXRGYWlsdXJlczsKKyAgICB9KTsKKworICAgIFN5c3RlbS5nZXQoZnVuY3Rpb24oZGF0YSkgeworICAgICAgJHNjb3BlLmlzQ2xvdWRFbmFibGVkID0gZGF0YS5tb2RlLm1hdGNoKCAvc29scmNsb3VkL2kgKTsKKworICAgICAgaWYgKCRzY29wZS5pc0Nsb3VkRW5hYmxlZCkgeworICAgICAgICBDb2xsZWN0aW9ucy5saXN0KGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgICAgJHNjb3BlLmNvbGxlY3Rpb25zID0gW107CisgICAgICAgICAgdmFyIGN1cnJlbnRDb2xsZWN0aW9uTmFtZSA9ICRyb3V0ZS5jdXJyZW50LnBhcmFtcy5jb3JlOworICAgICAgICAgIGRlbGV0ZSAkc2NvcGUuY3VycmVudENvbGxlY3Rpb247CisgICAgICAgICAgZm9yIChrZXkgaW4gZGF0YS5jb2xsZWN0aW9ucykgeworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSB7bmFtZTogZGF0YS5jb2xsZWN0aW9uc1trZXldfTsKKyAgICAgICAgICAgICRzY29wZS5jb2xsZWN0aW9ucy5wdXNoKGNvbGxlY3Rpb24pOworICAgICAgICAgICAgaWYgKHBhZ2VUeXBlID09IENvbnN0YW50cy5JU19DT0xMRUNUSU9OX1BBR0UgJiYgY29sbGVjdGlvbi5uYW1lID09IGN1cnJlbnRDb2xsZWN0aW9uTmFtZSkgeworICAgICAgICAgICAgICAkc2NvcGUuY3VycmVudENvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSkKKyAgICAgIH0KKworICAgIH0pOworCisgICAgJHNjb3BlLnNob3dpbmdMb2dnaW5nID0gcGFnZS5sYXN0SW5kZXhPZigibG9nZ2luZyIsIDApID09PSAwOworICAgICRzY29wZS5zaG93aW5nQ2xvdWQgPSBwYWdlLmxhc3RJbmRleE9mKCJjbG91ZCIsIDApID09PSAwOworICAgICRzY29wZS5wYWdlID0gcGFnZTsKKyAgfTsKKworICAkc2NvcGUucGluZyA9IGZ1bmN0aW9uKCkgeworICAgIFBpbmcucGluZyh7Y29yZTogJHNjb3BlLmN1cnJlbnRDb3JlLm5hbWV9LCBmdW5jdGlvbihkYXRhKSB7CisgICAgICAkc2NvcGUuc2hvd1BpbmcgPSB0cnVlOworICAgICAgJHNjb3BlLnBpbmdNUyA9IGRhdGEucmVzcG9uc2VIZWFkZXIuUVRpbWU7CisgICAgfSk7CisgICAgLy8gQHRvZG8gLmF0dHIoICd0aXRsZScsICcvYWRtaW4vcGluZyBpcyBub3QgY29uZmlndXJlZCAoJyArIHhoci5zdGF0dXMgKyAnOiAnICsgZXJyb3JfdGhyb3duICsgJyknICk7CisgIH07CisKKyAgJHNjb3BlLmR1bXBDbG91ZCA9IGZ1bmN0aW9uKCkgeworICAgICAgJHNjb3BlLiRicm9hZGNhc3QoImNsb3VkLWR1bXAiKTsKKyAgfQorCisgICRzY29wZS5zaG93Q29yZSA9IGZ1bmN0aW9uKGNvcmUpIHsKKyAgICAkbG9jYXRpb24udXJsKCIvIiArIGNvcmUubmFtZSk7CisgIH0KKworICAkc2NvcGUuc2hvd0NvbGxlY3Rpb24gPSBmdW5jdGlvbihjb2xsZWN0aW9uKSB7CisgICAgJGxvY2F0aW9uLnVybCgiLyIgKyBjb2xsZWN0aW9uLm5hbWUgKyAiL2NvbGxlY3Rpb24tb3ZlcnZpZXciKQorICB9CisKKyAgJHNjb3BlLiRvbignJHJvdXRlQ2hhbmdlU3RhcnQnLCBmdW5jdGlvbigpIHsKKyAgICAgICRyb290U2NvcGUuZXhjZXB0aW9ucyA9IHt9OworICB9KTsKK30pOworCisKKyhmdW5jdGlvbih3aW5kb3csIGFuZ3VsYXIsIHVuZGVmaW5lZCkgeworICAndXNlIHN0cmljdCc7CisKKyAgYW5ndWxhci5tb2R1bGUoJ25nQ2xpcGJvYXJkJywgW10pLgorICAgIHByb3ZpZGVyKCduZ0NsaXAnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgIHRoaXMucGF0aCA9ICcvL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy96ZXJvY2xpcGJvYXJkLzIuMS42L1plcm9DbGlwYm9hcmQuc3dmJzsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHNldFBhdGg6IGZ1bmN0aW9uKG5ld1BhdGgpIHsKKyAgICAgICAgIHNlbGYucGF0aCA9IG5ld1BhdGg7CisgICAgICAgIH0sCisgICAgICAgIHNldENvbmZpZzogZnVuY3Rpb24oY29uZmlnKSB7CisgICAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWc7CisgICAgICAgIH0sCisgICAgICAgICRnZXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBwYXRoOiBzZWxmLnBhdGgsCisgICAgICAgICAgICBjb25maWc6IHNlbGYuY29uZmlnCisgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICB9KS4KKyAgICBydW4oWyduZ0NsaXAnLCBmdW5jdGlvbihuZ0NsaXApIHsKKyAgICAgIHZhciBjb25maWcgPSB7CisgICAgICAgIHN3ZlBhdGg6IG5nQ2xpcC5wYXRoLAorICAgICAgICB0cnVzdGVkRG9tYWluczogWyIqIl0sCisgICAgICAgIGFsbG93U2NyaXB0QWNjZXNzOiAiYWx3YXlzIiwKKyAgICAgICAgZm9yY2VIYW5kQ3Vyc29yOiB0cnVlLAorICAgICAgfTsKKyAgICAgIFplcm9DbGlwYm9hcmQuY29uZmlnKGFuZ3VsYXIuZXh0ZW5kKGNvbmZpZyxuZ0NsaXAuY29uZmlnIHx8IHt9KSk7CisgICAgfV0pLgorICAgIGRpcmVjdGl2ZSgnY2xpcENvcHknLCBbJ25nQ2xpcCcsIGZ1bmN0aW9uIChuZ0NsaXApIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHNjb3BlOiB7CisgICAgICAgICAgY2xpcENvcHk6ICcmJywKKyAgICAgICAgICBjbGlwQ2xpY2s6ICcmJywKKyAgICAgICAgICBjbGlwQ2xpY2tGYWxsYmFjazogJyYnCisgICAgICAgIH0sCisgICAgICAgIHJlc3RyaWN0OiAnQScsCisgICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCwgYXR0cnMpIHsKKyAgICAgICAgICAvLyBCaW5kIGEgZmFsbGJhY2sgZnVuY3Rpb24gaWYgZmxhc2ggaXMgdW5hdmFpbGFibGUKKyAgICAgICAgICBpZiAoWmVyb0NsaXBib2FyZC5pc0ZsYXNoVW51c2FibGUoKSkgeworICAgICAgICAgICAgZWxlbWVudC5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCRldmVudCkgeworICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBleHByZXNzaW9uIHdpdGggbG9jYWwgdmFyaWFibGVzIGAkZXZlbnRgIGFuZCBgY29weWAKKyAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KHNjb3BlLmNsaXBDbGlja0ZhbGxiYWNrKHsKKyAgICAgICAgICAgICAgICAkZXZlbnQ6ICRldmVudCwKKyAgICAgICAgICAgICAgICBjb3B5OiBzY29wZS4kZXZhbChzY29wZS5jbGlwQ29weSkKKyAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNsaWVudCBvYmplY3QKKyAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IFplcm9DbGlwYm9hcmQoZWxlbWVudCk7CisgICAgICAgICAgaWYgKGF0dHJzLmNsaXBDb3B5ID09PSAiIikgeworICAgICAgICAgICAgc2NvcGUuY2xpcENvcHkgPSBmdW5jdGlvbihzY29wZSkgeworICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFswXS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlubmVyVGV4dDsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgfQorICAgICAgICAgIGNsaWVudC5vbiggJ3JlYWR5JywgZnVuY3Rpb24ocmVhZHlFdmVudCkgeworCisgICAgICAgICAgICBjbGllbnQub24oJ2NvcHknLCBmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgICAgICAgICAgdmFyIGNsaXBib2FyZCA9IGV2ZW50LmNsaXBib2FyZERhdGE7CisgICAgICAgICAgICAgIGNsaXBib2FyZC5zZXREYXRhKGF0dHJzLmNsaXBDb3B5TWltZVR5cGUgfHwgJ3RleHQvcGxhaW4nLCBzY29wZS4kZXZhbChzY29wZS5jbGlwQ29weSkpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGNsaWVudC5vbiggJ2FmdGVyY29weScsIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChhdHRycy5jbGlwQ2xpY2spKSB7CisgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KHNjb3BlLmNsaXBDbGljayk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgIGNsaWVudC5kZXN0cm95KCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICB9XSk7Cit9KSh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKTsKKworCisvKiBUSEUgQkVMT1cgQ09ERSBJUyBUQUtFTiBGUk9NIGpzL3NjcmlwdHMvYXBwLmpzLCBBTkQgU1RJTEwgUkVRVUlSRVMgSU5URUdSQVRJTkcKKworCisvLyBAdG9kbyBjbGVhciB0aW1lb3V0cworCisgICAgLy8gYWN0aXZhdGVfY29yZQorICAgIHRoaXMuYmVmb3JlCisgICAgKAorICAgICAge30sCisgICAgICBmdW5jdGlvbiggY29udGV4dCApCisgICAgICB7CisKKyAgICAgICAgdmFyIG1lbnVfd3JhcHBlciA9ICQoICcjbWVudS13cmFwcGVyJyApOworCisgICAgICAgIC8vIGdsb2JhbCBkYXNoYm9hcmQgZG9lc24ndCBoYXZlIHBhcmFtcy5zcGxhdAorICAgICAgICBpZiggIXRoaXMucGFyYW1zLnNwbGF0ICkKKyAgICAgICAgeworICAgICAgICAgIHRoaXMucGFyYW1zLnNwbGF0ID0gWyAnfmluZGV4JyBdOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHNlbGVjdG9yID0gJ34nID09PSB0aGlzLnBhcmFtcy5zcGxhdFswXVswXQorICAgICAgICAgICAgICAgICAgICAgPyAnIycgKyB0aGlzLnBhcmFtcy5zcGxhdFswXS5yZXBsYWNlKCAvXn4vLCAnJyApICsgJy5nbG9iYWwnCisgICAgICAgICAgICAgICAgICAgICA6ICcjY29yZS1zZWxlY3RvciAjJyArIHRoaXMucGFyYW1zLnNwbGF0WzBdLnJlcGxhY2UoIC9cLi9nLCAnX18nICk7CisKKyAgICAgICAgdmFyIGFjdGl2ZV9lbGVtZW50ID0gJCggc2VsZWN0b3IsIG1lbnVfd3JhcHBlciApOworCisgICAgICAgIC8vIEB0b2RvICJUaGVyZSBpcyBubyBjb3JlIHdpdGggdGhpcyBuYW1lIgorCisgICAgICAgIGlmKCBhY3RpdmVfZWxlbWVudC5oYXNDbGFzcyggJ2dsb2JhbCcgKSApCisgICAgICAgIHsKKyAgICAgICAgICBhY3RpdmVfZWxlbWVudAorICAgICAgICAgICAgLmFkZENsYXNzKCAnYWN0aXZlJyApOworCisgICAgICAgICAgaWYoIHRoaXMucGFyYW1zLnNwbGF0WzFdICkKKyAgICAgICAgICB7CisgICAgICAgICAgICAkKCAnLicgKyB0aGlzLnBhcmFtcy5zcGxhdFsxXSwgYWN0aXZlX2VsZW1lbnQgKQorICAgICAgICAgICAgICAuYWRkQ2xhc3MoICdhY3RpdmUnICk7CisgICAgICAgICAgfQorCisgICAgICAgICAgJCggJyNjb3JlLXNlbGVjdG9yIG9wdGlvbltzZWxlY3RlZF0nICkKKyAgICAgICAgICAgIC5yZW1vdmVBdHRyKCAnc2VsZWN0ZWQnICkKKyAgICAgICAgICAgIC50cmlnZ2VyKCAnbGlzenQ6dXBkYXRlZCcgKTsKKworICAgICAgICAgICQoICcjY29yZS1zZWxlY3RvciAuY2h6bi1jb250YWluZXIgPiBhJyApCisgICAgICAgICAgICAuYWRkQ2xhc3MoICdjaHpuLWRlZmF1bHQnICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgYWN0aXZlX2VsZW1lbnQKKyAgICAgICAgICAgIC5hdHRyKCAnc2VsZWN0ZWQnLCAnc2VsZWN0ZWQnICkKKyAgICAgICAgICAgIC50cmlnZ2VyKCAnbGlzenQ6dXBkYXRlZCcgKTsKKworCisgICAgICAgICAgJCggJyNjb3JlLW1lbnUgLicgKyB0aGlzLnBhcmFtcy5zcGxhdFsxXSApCisgICAgICAgICAgICAuYWRkQ2xhc3MoICdhY3RpdmUnICk7CisKKyAgICAgIH0KKyAgICApOworICB9CispOworCit2YXIgc29scl9hZG1pbiA9IGZ1bmN0aW9uKCBhcHBfY29uZmlnICkKK3sKKyAgdGhpcy5tZW51X2VsZW1lbnQgPSAkKCAnI2NvcmUtc2VsZWN0b3Igc2VsZWN0JyApOworICB0aGlzLmNvcmVfbWVudSA9ICQoICcjY29yZS1tZW51IHVsJyApOworCisgIHRoaXMuY29uZmlnID0gY29uZmlnOworICB0aGlzLnRpbWVvdXQgPSBudWxsOworCisgIHRoaXMuY29yZV9yZWdleF9iYXNlID0gJ14jXFwvKFtcXHdcXGQtXFwuXSspJzsKKworICBzaG93X2dsb2JhbF9lcnJvciA9IGZ1bmN0aW9uKCBlcnJvciApCisgIHsKKyAgICB2YXIgbWFpbiA9ICQoICcjbWFpbicgKTsKKworICAgICQoICdkaXZbaWQkPSItd3JhcHBlciJdJywgbWFpbiApCisgICAgICAucmVtb3ZlKCk7CisKKyAgICBtYWluCisgICAgICAuYWRkQ2xhc3MoICdlcnJvcicgKQorICAgICAgLmFwcGVuZCggZXJyb3IgKTsKKworICAgIHZhciBwcmVfdGFncyA9ICQoICdwcmUnLCBtYWluICk7CisgICAgaWYoIDAgIT09IHByZV90YWdzLnNpemUoKSApCisgICAgeworICAgICAgaGxqcy5oaWdobGlnaHRCbG9jayggcHJlX3RhZ3MuZ2V0KDApICk7CisgICAgfQorICB9OworCisgIHNvcnRfY29yZXNfZGF0YSA9IGZ1bmN0aW9uIHNvcnRfY29yZXNfZGF0YSggY29yZXNfc3RhdHVzICkKKyAgeworICAgIC8vIGJ1aWxkIGFycmF5IG9mIGNvcmUtbmFtZXMgZm9yIHNvcnRpbmcKKyAgICB2YXIgY29yZV9uYW1lcyA9IFtdOworICAgIGZvciggdmFyIGNvcmVfbmFtZSBpbiBjb3Jlc19zdGF0dXMgKQorICAgIHsKKyAgICAgIGNvcmVfbmFtZXMucHVzaCggY29yZV9uYW1lICk7CisgICAgfQorICAgIGNvcmVfbmFtZXMuc29ydCgpOworCisgICAgdmFyIGNvcmVfY291bnQgPSBjb3JlX25hbWVzLmxlbmd0aDsKKyAgICB2YXIgY29yZXMgPSB7fTsKKworICAgIGZvciggdmFyIGkgPSAwOyBpIDwgY29yZV9jb3VudDsgaSsrICkKKyAgICB7CisgICAgICB2YXIgY29yZV9uYW1lID0gY29yZV9uYW1lc1tpXTsKKyAgICAgIGNvcmVzW2NvcmVfbmFtZV0gPSBjb3Jlc19zdGF0dXNbY29yZV9uYW1lXTsKKyAgICB9CisKKyAgICByZXR1cm4gY29yZXM7CisgIH07CisKKyAgdGhpcy5zZXRfY29yZXNfZGF0YSA9IGZ1bmN0aW9uIHNldF9jb3Jlc19kYXRhKCBjb3JlcyApCisgIHsKKyAgICB0aGF0LmNvcmVzX2RhdGEgPSBzb3J0X2NvcmVzX2RhdGEoIGNvcmVzLnN0YXR1cyApOworCisgICAgdGhhdC5tZW51X2VsZW1lbnQKKyAgICAgIC5lbXB0eSgpOworCisgICAgdmFyIGNvcmVfbGlzdCA9IFtdOworICAgIGNvcmVfbGlzdC5wdXNoKCAnPG9wdGlvbj48L29wdGlvbj4nICk7CisKKyAgICB2YXIgY29yZV9jb3VudCA9IDA7CisgICAgZm9yKCB2YXIgY29yZV9uYW1lIGluIHRoYXQuY29yZXNfZGF0YSApCisgICAgeworICAgICAgY29yZV9jb3VudCsrOworICAgICAgdmFyIGNvcmVfcGF0aCA9IGNvbmZpZy5zb2xyX3BhdGggKyAnLycgKyBjb3JlX25hbWU7CisgICAgICB2YXIgY2xhc3NlcyA9IFtdOworCisgICAgICBpZiggY29yZXMuc3RhdHVzW2NvcmVfbmFtZV1bJ2lzRGVmYXVsdENvcmUnXSApCisgICAgICB7CisgICAgICAgIGNsYXNzZXMucHVzaCggJ2RlZmF1bHQnICk7CisgICAgICB9CisKKyAgICAgIHZhciBjb3JlX3RwbCA9ICc8b3B0aW9uICcKKyAgICAgICAgICAgICAgICAgICArICcgICAgaWQ9IicgKyBjb3JlX25hbWUucmVwbGFjZSggL1wuL2csICdfXycgKSArICciICcKKyAgICAgICAgICAgICAgICAgICArICcgICAgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oICcgJyApICsgJyInCisgICAgICAgICAgICAgICAgICAgKyAnICAgIGRhdGEtYmFzZXBhdGg9IicgKyBjb3JlX3BhdGggKyAnIicKKyAgICAgICAgICAgICAgICAgICArICcgICAgc2NoZW1hPSInICsgY29yZXMuc3RhdHVzW2NvcmVfbmFtZV1bJ3NjaGVtYSddICsgJyInCisgICAgICAgICAgICAgICAgICAgKyAnICAgIGNvbmZpZz0iJyArIGNvcmVzLnN0YXR1c1tjb3JlX25hbWVdWydjb25maWcnXSArICciJworICAgICAgICAgICAgICAgICAgICsgJyAgICB2YWx1ZT0iIy8nICsgY29yZV9uYW1lICsgJyInCisgICAgICAgICAgICAgICAgICAgKyAnICAgIHRpdGxlPSInICsgY29yZV9uYW1lICsgJyInCisgICAgICAgICAgICAgICAgICAgKyAnPicKKyAgICAgICAgICAgICAgICAgICArIGNvcmVfbmFtZQorICAgICAgICAgICAgICAgICAgICsgJzwvb3B0aW9uPic7CisKKyAgICAgIGNvcmVfbGlzdC5wdXNoKCBjb3JlX3RwbCApOworICAgIH0KKworICAgIHZhciBoYXNfY29yZXMgPSAwICE9PSBjb3JlX2NvdW50OworICAgIGlmKCBoYXNfY29yZXMgKQorICAgIHsKKyAgICAgIHRoYXQubWVudV9lbGVtZW50CisgICAgICAgIC5hcHBlbmQoIGNvcmVfbGlzdC5qb2luKCAiXG4iICkgKQorICAgICAgICAudHJpZ2dlciggJ2xpc3p0OnVwZGF0ZWQnICk7CisgICAgfQorCisgICAgdmFyIGNvcmVfc2VsZWN0b3IgPSAkKCAnI2NvcmUtc2VsZWN0b3InICk7CisKKyAgICBpZiggaGFzX2NvcmVzICkKKyAgICB7CisgICAgICB2YXIgY29yZXNfZWxlbWVudCA9IGNvcmVfc2VsZWN0b3IuZmluZCggJyNoYXMtY29yZXMnICk7CisgICAgICB2YXIgc2VsZWN0b3Jfd2lkdGggPSBjb3Jlc19lbGVtZW50LndpZHRoKCk7CisKKyAgICAgIGNvcmVzX2VsZW1lbnQuZmluZCggJy5jaHpuLWNvbnRhaW5lcicgKQorICAgICAgICAuY3NzKCAnd2lkdGgnLCBzZWxlY3Rvcl93aWR0aCArICdweCcgKTsKKworICAgICAgY29yZXNfZWxlbWVudC5maW5kKCAnLmNoem4tZHJvcCcgKQorICAgICAgICAuY3NzKCAnd2lkdGgnLCAoIHNlbGVjdG9yX3dpZHRoIC0gMiApICsgJ3B4JyApOworICAgIH0KKyAgfTsKKworICB0aGlzLnJ1biA9IGZ1bmN0aW9uKCkKKyAgeworICAgICQuYWpheAorICAgICgKKyAgICAgIHsKKyAgICAgICAgLy8gbG9hZCBjb3JlcyAoaW5kZXhJbmZvID0gZmFsc2UKKyAgICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKCByZXNwb25zZSApCisgICAgICAgIHsKKworICAgICAgICAgIHZhciBzeXN0ZW1fdXJsID0gY29uZmlnLnNvbHJfcGF0aCArICcvYWRtaW4vaW5mby9zeXN0ZW0/d3Q9anNvbic7CisgICAgICAgICAgJC5hamF4CisgICAgICAgICAgKAorICAgICAgICAgICAgeworICAgICAgICAgICAgICB1cmwgOiBzeXN0ZW1fdXJsLAorICAgICAgICAgICAgICBkYXRhVHlwZSA6ICdqc29uJywKKyAgICAgICAgICAgICAgYmVmb3JlU2VuZCA6IGZ1bmN0aW9uKCBhcnIsIGZvcm0sIG9wdGlvbnMgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgIHN1Y2Nlc3MgOiBmdW5jdGlvbiggcmVzcG9uc2UgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhhdC5kYXNoYm9hcmRfdmFsdWVzID0gcmVzcG9uc2U7CisKKyAgICAgICAgICAgICAgICB2YXIgZW52aXJvbm1lbnRfYXJncyA9IG51bGw7CisgICAgICAgICAgICAgICAgdmFyIGNsb3VkX2FyZ3MgPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYoIHJlc3BvbnNlLmp2bSAmJiByZXNwb25zZS5qdm0uam14ICYmIHJlc3BvbnNlLmp2bS5qbXguY29tbWFuZExpbmVBcmdzICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB2YXIgY29tbWFuZF9saW5lX2FyZ3MgPSByZXNwb25zZS5qdm0uam14LmNvbW1hbmRMaW5lQXJncy5qb2luKCAnIHwgJyApOworCisgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF9hcmdzID0gY29tbWFuZF9saW5lX2FyZ3MubWF0Y2goIC8tRHNvbHIuZW52aXJvbm1lbnQ9KChkZXZ8dGVzdHxwcm9kKT9bXHdcZF0qKS9pICk7CisgICAgICAgICAgICAgICAgfQorCisvLyBAdG9kbyBkZXRlY3QgJHNjb3BlLmlzQ2xvdWQgPSByZXNwb25zZS5tb2RlLm1hdGNoKCAvc29scmNsb3VkL2kgKTsKKworICAgICAgICAgICAgICAgIC8vIGVudmlyb25tZW50CisKKyAgICAgICAgICAgICAgICB2YXIgd3JhcHBlciA9ICQoICcjd3JhcHBlcicgKTsKKyAgICAgICAgICAgICAgICB2YXIgZW52aXJvbm1lbnRfZWxlbWVudCA9ICQoICcjZW52aXJvbm1lbnQnICk7CisgICAgICAgICAgICAgICAgaWYoIGVudmlyb25tZW50X2FyZ3MgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHdyYXBwZXIKKyAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCAnaGFzLWVudmlyb25tZW50JyApOworCisgICAgICAgICAgICAgICAgICBpZiggZW52aXJvbm1lbnRfYXJnc1sxXSApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50X2VsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAuaHRtbCggZW52aXJvbm1lbnRfYXJnc1sxXSApOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiggZW52aXJvbm1lbnRfYXJnc1syXSApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50X2VsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoIGVudmlyb25tZW50X2FyZ3NbMl0gKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHdyYXBwZXIKKyAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCAnaGFzLWVudmlyb25tZW50JyApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNsb3VkCisKKyAgICAgICAgICAgICAgICB2YXIgY2xvdWRfbmF2X2VsZW1lbnQgPSAkKCAnI21lbnUgI2Nsb3VkJyApOworICAgICAgICAgICAgICAgIGlmKCBjbG91ZF9hcmdzICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjbG91ZF9uYXZfZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAuc2hvdygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHNhbW15CisKKyAgICAgICAgICAgICAgICBzYW1teS5ydW4oIGxvY2F0aW9uLmhhc2ggKTsKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgZXJyb3IgOiBmdW5jdGlvbigpCisgICAgICAgICAgICAgIHsKKyAgfTsKKyovCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9hbmFseXNpcy5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2FuYWx5c2lzLmpzCmluZGV4IGU1ZjU3MTcuLjM0MGRmMmUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2FuYWx5c2lzLmpzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2FuYWx5c2lzLmpzCkBAIC0xLDIwMyArMSwyMDMgQEAKLS8qDQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi0NCi1zb2xyQWRtaW5BcHAuY29udHJvbGxlcignQW5hbHlzaXNDb250cm9sbGVyJywNCi0gIGZ1bmN0aW9uKCRzY29wZSwgJGxvY2F0aW9uLCAkcm91dGVQYXJhbXMsIEx1a2UsIEFuYWx5c2lzLCBDb25zdGFudHMpIHsNCi0gICAgICAkc2NvcGUucmVzZXRNZW51KCJhbmFseXNpcyIsIENvbnN0YW50cy5JU19DT0xMRUNUSU9OX1BBR0UpOw0KLQ0KLSAgICAgICRzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7DQotICAgICAgICBMdWtlLnNjaGVtYSh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAgICRzY29wZS5maWVsZHNBbmRUeXBlcyA9IFtdOw0KLSAgICAgICAgICBmb3IgKHZhciBmaWVsZCBpbiBkYXRhLnNjaGVtYS5maWVsZHMpIHsNCi0gICAgICAgICAgICAkc2NvcGUuZmllbGRzQW5kVHlwZXMucHVzaCh7DQotICAgICAgICAgICAgICBncm91cDogIkZpZWxkcyIsDQotICAgICAgICAgICAgICB2YWx1ZTogImZpZWxkbmFtZT0iICsgZmllbGQsDQotICAgICAgICAgICAgICBsYWJlbDogZmllbGR9KTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBmb3IgKHZhciB0eXBlIGluIGRhdGEuc2NoZW1hLnR5cGVzKSB7DQotICAgICAgICAgICAgJHNjb3BlLmZpZWxkc0FuZFR5cGVzLnB1c2goew0KLSAgICAgICAgICAgICAgZ3JvdXA6ICJUeXBlcyIsDQotICAgICAgICAgICAgICB2YWx1ZTogImZpZWxkdHlwZT0iICsgdHlwZSwNCi0gICAgICAgICAgICAgIGxhYmVsOiB0eXBlfSk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgJHNjb3BlLmNvcmUgPSAkcm91dGVQYXJhbXMuY29yZTsNCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgJHNjb3BlLnBhcnNlUXVlcnlTdHJpbmcoKTsNCi0gICAgICAgIC8vIEB0b2RvIC0gc2V0IGRlZmF1bHRTZWFyY2hGaWVsZCBlaXRoZXIgdG8gY29udGV4dFsiYW5hbHlzaXMuZmllbGRuYW1lIl0gb3IgY29udGV4dFsiYW5hbHlzaXMuZmllbGR0eXBlIl0NCi0NCi0gICAgICB9Ow0KLSAgICAgICRzY29wZS52ZXJib3NlID0gdHJ1ZTsNCi0NCi0gICAgICB2YXIgZ2V0U2hvcnRDb21wb25lbnROYW1lID0gZnVuY3Rpb24obG9uZ25hbWUpIHsNCi0gICAgICAgIHZhciBzaG9ydCA9IC0xICE9PSBsb25nbmFtZS5pbmRleE9mKCAnJCcgKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICA/IGxvbmduYW1lLnNwbGl0KCAnJCcgKVsxXQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICA6IGxvbmduYW1lLnNwbGl0KCAnLicgKS5wb3AoKTsNCi0gICAgICAgIHJldHVybiBzaG9ydC5tYXRjaCggL1tBLVpdL2cgKS5qb2luKCAnJyApOw0KLSAgICAgIH07DQotDQotICAgICAgdmFyIGdldENhcHRpb25zRm9yQ29tcG9uZW50ID0gZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgdmFyIGNhcHRpb25zID0gW107DQotICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YVswXSkgew0KLSAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgvLiojLywnJyk7DQotICAgICAgICAgIGlmIChrZXkgIT0gIm1hdGNoIiAmJiBrZXkhPSJwb3NpdGlvbkhpc3RvcnkiKSB7DQotICAgICAgICAgICAgY2FwdGlvbnMucHVzaChrZXkucmVwbGFjZSgvLiojLywnJykpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY2FwdGlvbnM7DQotICAgICAgfTsNCi0NCi0gICAgICB2YXIgZ2V0VG9rZW5zRm9yQ29tcG9uZW50ID0gZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgdmFyIHRva2VucyA9IFtdOw0KLSAgICAgICAgdmFyIHByZXZpb3VzUG9zaXRpb24gPSAwOw0KLSAgICAgICAgdmFyIGluZGV4PTA7DQotICAgICAgICBmb3IgKHZhciBpIGluIGRhdGEpIHsNCi0gICAgICAgICAgdmFyIHRva2VuaGFzaCA9IGRhdGFbaV07DQotICAgICAgICAgIHZhciBwb3NpdGlvbkRpZmZlcmVuY2UgPSB0b2tlbmhhc2gucG9zaXRpb24gLSBwcmV2aW91c1Bvc2l0aW9uOw0KLSAgICAgICAgICBmb3IgKHZhciBqPXBvc2l0aW9uRGlmZmVyZW5jZTsgaj4xOyBqLS0pIHsNCi0gICAgICAgICAgICB0b2tlbnMucHVzaCh7cG9zaXRpb246IHRva2VuaGFzaC5wb3NpdGlvbiAtIGorMSwgYmxhbms6dHJ1ZSwgaW5kZXg6aW5kZXgrK30pOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIHZhciB0b2tlbiA9IHtwb3NpdGlvbjogdG9rZW5oYXNoLnBvc2l0aW9uLCBrZXlzOltdLCBpbmRleDppbmRleCsrfTsNCi0NCi0gICAgICAgICAgZm9yIChrZXkgaW4gdG9rZW5oYXNoKSB7DQotICAgICAgICAgICAgaWYgKGtleSA9PSAibWF0Y2giIHx8IGtleT09InBvc2l0aW9uSGlzdG9yeSIpIHsNCi0gICAgICAgICAgICAgIC8vQCB0b2RvIGRvIHNvbWV0aGluZw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICB0b2tlbi5rZXlzLnB1c2goe25hbWU6a2V5LCB2YWx1ZTp0b2tlbmhhc2hba2V5XX0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7DQotICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24gPSB0b2tlbmhhc2gucG9zaXRpb247DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdG9rZW5zOw0KLSAgICAgIH07DQotDQotICAgICAgdmFyIGV4dHJhY3RDb21wb25lbnRzID0gZnVuY3Rpb24oZGF0YSwgcmVzdWx0LCBuYW1lKSB7DQotICAgICAgICBpZiAoZGF0YSkgew0KLSAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IFtdOw0KLSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gMikgew0KLSAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gew0KLSAgICAgICAgICAgICAgICAgICAgbmFtZTogZGF0YVtpXSwNCi0gICAgICAgICAgICAgICAgICAgIHNob3J0OiBnZXRTaG9ydENvbXBvbmVudE5hbWUoZGF0YVtpXSksDQotICAgICAgICAgICAgICAgICAgICBjYXB0aW9uczogZ2V0Q2FwdGlvbnNGb3JDb21wb25lbnQoZGF0YVtpICsgMV0pLA0KLSAgICAgICAgICAgICAgICAgICAgdG9rZW5zOiBnZXRUb2tlbnNGb3JDb21wb25lbnQoZGF0YVtpICsgMV0pDQotICAgICAgICAgICAgICAgIH07DQotICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXS5wdXNoKGNvbXBvbmVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH07DQotDQotICAgICAgdmFyIHByb2Nlc3NBbmFseXNpc0RhdGEgPSBmdW5jdGlvbihhbmFseXNpcywgZmllbGRPclR5cGUpIHsNCi0gICAgICAgIHZhciBmaWVsZG5hbWU7DQotICAgICAgICBmb3IgKGZpZWxkbmFtZSBpbiBhbmFseXNpc1tmaWVsZE9yVHlwZV0pIHtjb25zb2xlLmxvZyhmaWVsZG5hbWUpO2JyZWFrO30NCi0gICAgICAgIHZhciByZXNwb25zZSA9IHt9Ow0KLSAgICAgICAgZXh0cmFjdENvbXBvbmVudHMoYW5hbHlzaXNbZmllbGRPclR5cGVdW2ZpZWxkbmFtZV0uaW5kZXgsIHJlc3BvbnNlLCAiaW5kZXgiKTsNCi0gICAgICAgIGV4dHJhY3RDb21wb25lbnRzKGFuYWx5c2lzW2ZpZWxkT3JUeXBlXVtmaWVsZG5hbWVdLnF1ZXJ5LCByZXNwb25zZSwgInF1ZXJ5Iik7DQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgICAgfTsNCi0NCi0gICAgICAkc2NvcGUudXBkYXRlUXVlcnlTdHJpbmcgPSBmdW5jdGlvbigpIHsNCi0NCi0gICAgICAgIHZhciBwYXJ0cyA9ICRzY29wZS5maWVsZE9yVHlwZS5zcGxpdCgiPSIpOw0KLSAgICAgICAgdmFyIGZpZWxkT3JUeXBlID0gcGFydHNbMF07DQotICAgICAgICB2YXIgbmFtZSA9IHBhcnRzWzFdOw0KLQ0KLSAgICAgICAgaWYgKCRzY29wZS5pbmRleFRleHQpIHsNCi0gICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCJhbmFseXNpcy5maWVsZHZhbHVlIiwgJHNjb3BlLmluZGV4VGV4dCk7DQotICAgICAgICB9IGVsc2UgaWYgKCRsb2NhdGlvbi5zZWFyY2goKVsiYW5hbHlzaXMuZmllbGR2YWx1ZSJdKSB7DQotICAgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgiYW5hbHlzaXMuZmllbGR2YWx1ZSIsIG51bGwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCRzY29wZS5xdWVyeVRleHQpIHsNCi0gICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgiYW5hbHlzaXMucXVlcnkiLCAkc2NvcGUucXVlcnlUZXh0KTsNCi0gICAgICAgIH0gZWxzZSBpZiAoJGxvY2F0aW9uLnNlYXJjaCgpWyJhbmFseXNpcy5xdWVyeSJdKSB7DQotICAgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgiYW5hbHlzaXMucXVlcnkiLCBudWxsKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChmaWVsZE9yVHlwZSA9PSAiZmllbGRuYW1lIikgew0KLSAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCJhbmFseXNpcy5maWVsZG5hbWUiLCBuYW1lKTsNCi0gICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgiYW5hbHlzaXMuZmllbGR0eXBlIiwgbnVsbCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCJhbmFseXNpcy5maWVsZHR5cGUiLCBuYW1lKTsNCi0gICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgiYW5hbHlzaXMuZmllbGRuYW1lIiwgbnVsbCk7DQotICAgICAgICB9DQotICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCJ2ZXJib3NlX291dHB1dCIsICRzY29wZS52ZXJib3NlID8gIjEiIDogIjAiKTsNCi0gICAgICB9Ow0KLQ0KLSAgICAgICRzY29wZS5wYXJzZVF1ZXJ5U3RyaW5nID0gZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICB2YXIgcGFyYW1zID0ge307DQotICAgICAgICAgIHZhciBzZWFyY2ggPSAkbG9jYXRpb24uc2VhcmNoKCk7DQotDQotICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzZWFyY2gpLmxlbmd0aCA9PSAwKSB7DQotICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgIH0NCi0gICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlYXJjaCkgew0KLSAgICAgICAgICAgICAgcGFyYW1zW2tleV09c2VhcmNoW2tleV07DQotICAgICAgICAgIH0NCi0gICAgICAgICAgJHNjb3BlLmluZGV4VGV4dCA9IHNlYXJjaFsiYW5hbHlzaXMuZmllbGR2YWx1ZSJdOw0KLSAgICAgICAgICAkc2NvcGUucXVlcnlUZXh0ID0gc2VhcmNoWyJhbmFseXNpcy5xdWVyeSJdOw0KLSAgICAgICAgICBpZiAoc2VhcmNoWyJhbmFseXNpcy5maWVsZG5hbWUiXSkgew0KLSAgICAgICAgICAgICAgJHNjb3BlLmZpZWxkT3JUeXBlID0gImZpZWxkbmFtZT0iICsgc2VhcmNoWyJhbmFseXNpcy5maWVsZG5hbWUiXTsNCi0gICAgICAgICAgICAgICRzY29wZS5zY2hlbWFCcm93c2VyVXJsID0gImZpZWxkPSIgKyBzZWFyY2hbImFuYWx5c2lzLmZpZWxkbmFtZSJdOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgJHNjb3BlLmZpZWxkT3JUeXBlID0gImZpZWxkdHlwZT0iICsgc2VhcmNoWyJhbmFseXNpcy5maWVsZHR5cGUiXTsNCi0gICAgICAgICAgICAgICRzY29wZS5zY2hlbWFCcm93c2VyVXJsID0gInR5cGU9IiArIHNlYXJjaFsiYW5hbHlzaXMuZmllbGR0eXBlIl07DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKHNlYXJjaFsidmVyYm9zZV9vdXRwdXQiXSA9PSB1bmRlZmluZWQpIHsNCi0gICAgICAgICAgICAkc2NvcGUudmVyYm9zZSA9IHRydWU7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgJHNjb3BlLnZlcmJvc2UgPSBzZWFyY2hbInZlcmJvc2Vfb3V0cHV0Il0gPT0gIjEiOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIGlmICgkc2NvcGUuZmllbGRPclR5cGUgfHwgJHNjb3BlLmluZGV4VGV4dCB8fCAkc2NvcGUucXVlcnlUZXh0KSB7DQotICAgICAgICAgICAgcGFyYW1zLmNvcmUgPSAkcm91dGVQYXJhbXMuY29yZTsNCi0gICAgICAgICAgICB2YXIgcGFydHMgPSAkc2NvcGUuZmllbGRPclR5cGUuc3BsaXQoIj0iKTsNCi0gICAgICAgICAgICB2YXIgZmllbGRPclR5cGUgPSBwYXJ0c1swXSA9PSAiZmllbGRuYW1lIiA/ICJmaWVsZF9uYW1lcyIgOiAiZmllbGRfdHlwZXMiOw0KLQ0KLSAgICAgICAgICAgIEFuYWx5c2lzLmZpZWxkKHBhcmFtcywgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgICAgICAgJHNjb3BlLnJlc3VsdCA9IHByb2Nlc3NBbmFseXNpc0RhdGEoZGF0YS5hbmFseXNpcywgZmllbGRPclR5cGUpOw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICB9DQotICAgICAgfTsNCi0NCi0gICAgICAkc2NvcGUuY2hhbmdlRmllbGRPclR5cGUgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgIHZhciBwYXJ0cyA9ICRzY29wZS5maWVsZE9yVHlwZS5zcGxpdCgiPSIpOw0KLSAgICAgICAgaWYgKHBhcnRzWzBdPT0nZmllbGRuYW1lJykgew0KLSAgICAgICAgICAkc2NvcGUuc2NoZW1hQnJvd3NlclVybCA9ICJmaWVsZD0iICsgcGFydHNbMV07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAkc2NvcGUuc2NoZW1hQnJvd3NlclVybCA9ICJ0eXBlPSIgKyBwYXJ0c1sxXTsNCi0gICAgICAgIH0NCi0gICAgICB9Ow0KLQ0KLSAgICAgICRzY29wZS50b2dnbGVWZXJib3NlID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAkc2NvcGUudmVyYm9zZSA9ICEkc2NvcGUudmVyYm9zZTsNCi0gICAgICAgICRzY29wZS51cGRhdGVRdWVyeVN0cmluZygpOw0KLSAgICAgIH07DQotDQotICAgICAgJHNjb3BlLnJlZnJlc2goKTsNCi0gICAgfQ0KLSk7DQotDQotLyoqKioqKioqKioqKioqKg0KLQ0KLWZ1bmN0aW9uKGVycm9yKSB7DQotICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwNCkgew0KLSAgICAkc2NvcGUuaXNIYW5kbGVyTWlzc2luZyA9IHRydWU7DQotICB9IGVsc2Ugew0KLSAgICAkc2NvcGUuYW5hbHlzaXNFcnJvciA9IGVycm9yLmVycm9yLm1zZzsNCi0gIH0NCi0qKioqLw0KKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ0FuYWx5c2lzQ29udHJvbGxlcicsCisgIGZ1bmN0aW9uKCRzY29wZSwgJGxvY2F0aW9uLCAkcm91dGVQYXJhbXMsIEx1a2UsIEFuYWx5c2lzLCBDb25zdGFudHMpIHsKKyAgICAgICRzY29wZS5yZXNldE1lbnUoImFuYWx5c2lzIiwgQ29uc3RhbnRzLklTX0NPTExFQ1RJT05fUEFHRSk7CisKKyAgICAgICRzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7CisgICAgICAgIEx1a2Uuc2NoZW1hKHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZX0sIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICAkc2NvcGUuZmllbGRzQW5kVHlwZXMgPSBbXTsKKyAgICAgICAgICBmb3IgKHZhciBmaWVsZCBpbiBkYXRhLnNjaGVtYS5maWVsZHMpIHsKKyAgICAgICAgICAgICRzY29wZS5maWVsZHNBbmRUeXBlcy5wdXNoKHsKKyAgICAgICAgICAgICAgZ3JvdXA6ICJGaWVsZHMiLAorICAgICAgICAgICAgICB2YWx1ZTogImZpZWxkbmFtZT0iICsgZmllbGQsCisgICAgICAgICAgICAgIGxhYmVsOiBmaWVsZH0pOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKHZhciB0eXBlIGluIGRhdGEuc2NoZW1hLnR5cGVzKSB7CisgICAgICAgICAgICAkc2NvcGUuZmllbGRzQW5kVHlwZXMucHVzaCh7CisgICAgICAgICAgICAgIGdyb3VwOiAiVHlwZXMiLAorICAgICAgICAgICAgICB2YWx1ZTogImZpZWxkdHlwZT0iICsgdHlwZSwKKyAgICAgICAgICAgICAgbGFiZWw6IHR5cGV9KTsKKyAgICAgICAgICB9CisgICAgICAgICAgJHNjb3BlLmNvcmUgPSAkcm91dGVQYXJhbXMuY29yZTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgJHNjb3BlLnBhcnNlUXVlcnlTdHJpbmcoKTsKKyAgICAgICAgLy8gQHRvZG8gLSBzZXQgZGVmYXVsdFNlYXJjaEZpZWxkIGVpdGhlciB0byBjb250ZXh0WyJhbmFseXNpcy5maWVsZG5hbWUiXSBvciBjb250ZXh0WyJhbmFseXNpcy5maWVsZHR5cGUiXQorCisgICAgICB9OworICAgICAgJHNjb3BlLnZlcmJvc2UgPSB0cnVlOworCisgICAgICB2YXIgZ2V0U2hvcnRDb21wb25lbnROYW1lID0gZnVuY3Rpb24obG9uZ25hbWUpIHsKKyAgICAgICAgdmFyIHNob3J0ID0gLTEgIT09IGxvbmduYW1lLmluZGV4T2YoICckJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBsb25nbmFtZS5zcGxpdCggJyQnIClbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICA6IGxvbmduYW1lLnNwbGl0KCAnLicgKS5wb3AoKTsKKyAgICAgICAgcmV0dXJuIHNob3J0Lm1hdGNoKCAvW0EtWl0vZyApLmpvaW4oICcnICk7CisgICAgICB9OworCisgICAgICB2YXIgZ2V0Q2FwdGlvbnNGb3JDb21wb25lbnQgPSBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgIHZhciBjYXB0aW9ucyA9IFtdOworICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YVswXSkgeworICAgICAgICAgIGtleSA9IGtleS5yZXBsYWNlKC8uKiMvLCcnKTsKKyAgICAgICAgICBpZiAoa2V5ICE9ICJtYXRjaCIgJiYga2V5IT0icG9zaXRpb25IaXN0b3J5IikgeworICAgICAgICAgICAgY2FwdGlvbnMucHVzaChrZXkucmVwbGFjZSgvLiojLywnJykpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2FwdGlvbnM7CisgICAgICB9OworCisgICAgICB2YXIgZ2V0VG9rZW5zRm9yQ29tcG9uZW50ID0gZnVuY3Rpb24oZGF0YSkgeworICAgICAgICB2YXIgdG9rZW5zID0gW107CisgICAgICAgIHZhciBwcmV2aW91c1Bvc2l0aW9uID0gMDsKKyAgICAgICAgdmFyIGluZGV4PTA7CisgICAgICAgIGZvciAodmFyIGkgaW4gZGF0YSkgeworICAgICAgICAgIHZhciB0b2tlbmhhc2ggPSBkYXRhW2ldOworICAgICAgICAgIHZhciBwb3NpdGlvbkRpZmZlcmVuY2UgPSB0b2tlbmhhc2gucG9zaXRpb24gLSBwcmV2aW91c1Bvc2l0aW9uOworICAgICAgICAgIGZvciAodmFyIGo9cG9zaXRpb25EaWZmZXJlbmNlOyBqPjE7IGotLSkgeworICAgICAgICAgICAgdG9rZW5zLnB1c2goe3Bvc2l0aW9uOiB0b2tlbmhhc2gucG9zaXRpb24gLSBqKzEsIGJsYW5rOnRydWUsIGluZGV4OmluZGV4Kyt9KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB2YXIgdG9rZW4gPSB7cG9zaXRpb246IHRva2VuaGFzaC5wb3NpdGlvbiwga2V5czpbXSwgaW5kZXg6aW5kZXgrK307CisKKyAgICAgICAgICBmb3IgKGtleSBpbiB0b2tlbmhhc2gpIHsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gIm1hdGNoIiB8fCBrZXk9PSJwb3NpdGlvbkhpc3RvcnkiKSB7CisgICAgICAgICAgICAgIC8vQCB0b2RvIGRvIHNvbWV0aGluZworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdG9rZW4ua2V5cy5wdXNoKHtuYW1lOmtleSwgdmFsdWU6dG9rZW5oYXNoW2tleV19KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOworICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24gPSB0b2tlbmhhc2gucG9zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRva2VuczsKKyAgICAgIH07CisKKyAgICAgIHZhciBleHRyYWN0Q29tcG9uZW50cyA9IGZ1bmN0aW9uKGRhdGEsIHJlc3VsdCwgbmFtZSkgeworICAgICAgICBpZiAoZGF0YSkgeworICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gW107CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0geworICAgICAgICAgICAgICAgICAgICBuYW1lOiBkYXRhW2ldLAorICAgICAgICAgICAgICAgICAgICBzaG9ydDogZ2V0U2hvcnRDb21wb25lbnROYW1lKGRhdGFbaV0pLAorICAgICAgICAgICAgICAgICAgICBjYXB0aW9uczogZ2V0Q2FwdGlvbnNGb3JDb21wb25lbnQoZGF0YVtpICsgMV0pLAorICAgICAgICAgICAgICAgICAgICB0b2tlbnM6IGdldFRva2Vuc0ZvckNvbXBvbmVudChkYXRhW2kgKyAxXSkKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXS5wdXNoKGNvbXBvbmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIHZhciBwcm9jZXNzQW5hbHlzaXNEYXRhID0gZnVuY3Rpb24oYW5hbHlzaXMsIGZpZWxkT3JUeXBlKSB7CisgICAgICAgIHZhciBmaWVsZG5hbWU7CisgICAgICAgIGZvciAoZmllbGRuYW1lIGluIGFuYWx5c2lzW2ZpZWxkT3JUeXBlXSkge2NvbnNvbGUubG9nKGZpZWxkbmFtZSk7YnJlYWs7fQorICAgICAgICB2YXIgcmVzcG9uc2UgPSB7fTsKKyAgICAgICAgZXh0cmFjdENvbXBvbmVudHMoYW5hbHlzaXNbZmllbGRPclR5cGVdW2ZpZWxkbmFtZV0uaW5kZXgsIHJlc3BvbnNlLCAiaW5kZXgiKTsKKyAgICAgICAgZXh0cmFjdENvbXBvbmVudHMoYW5hbHlzaXNbZmllbGRPclR5cGVdW2ZpZWxkbmFtZV0ucXVlcnksIHJlc3BvbnNlLCAicXVlcnkiKTsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgICAgfTsKKworICAgICAgJHNjb3BlLnVwZGF0ZVF1ZXJ5U3RyaW5nID0gZnVuY3Rpb24oKSB7CisKKyAgICAgICAgdmFyIHBhcnRzID0gJHNjb3BlLmZpZWxkT3JUeXBlLnNwbGl0KCI9Iik7CisgICAgICAgIHZhciBmaWVsZE9yVHlwZSA9IHBhcnRzWzBdOworICAgICAgICB2YXIgbmFtZSA9IHBhcnRzWzFdOworCisgICAgICAgIGlmICgkc2NvcGUuaW5kZXhUZXh0KSB7CisgICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCJhbmFseXNpcy5maWVsZHZhbHVlIiwgJHNjb3BlLmluZGV4VGV4dCk7CisgICAgICAgIH0gZWxzZSBpZiAoJGxvY2F0aW9uLnNlYXJjaCgpWyJhbmFseXNpcy5maWVsZHZhbHVlIl0pIHsKKyAgICAgICAgICAgICRsb2NhdGlvbi5zZWFyY2goImFuYWx5c2lzLmZpZWxkdmFsdWUiLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoJHNjb3BlLnF1ZXJ5VGV4dCkgeworICAgICAgICAgICRsb2NhdGlvbi5zZWFyY2goImFuYWx5c2lzLnF1ZXJ5IiwgJHNjb3BlLnF1ZXJ5VGV4dCk7CisgICAgICAgIH0gZWxzZSBpZiAoJGxvY2F0aW9uLnNlYXJjaCgpWyJhbmFseXNpcy5xdWVyeSJdKSB7CisgICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCJhbmFseXNpcy5xdWVyeSIsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpZWxkT3JUeXBlID09ICJmaWVsZG5hbWUiKSB7CisgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgiYW5hbHlzaXMuZmllbGRuYW1lIiwgbmFtZSk7CisgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgiYW5hbHlzaXMuZmllbGR0eXBlIiwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgiYW5hbHlzaXMuZmllbGR0eXBlIiwgbmFtZSk7CisgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgiYW5hbHlzaXMuZmllbGRuYW1lIiwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgidmVyYm9zZV9vdXRwdXQiLCAkc2NvcGUudmVyYm9zZSA/ICIxIiA6ICIwIik7CisgICAgICB9OworCisgICAgICAkc2NvcGUucGFyc2VRdWVyeVN0cmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICB2YXIgcGFyYW1zID0ge307CisgICAgICAgICAgdmFyIHNlYXJjaCA9ICRsb2NhdGlvbi5zZWFyY2goKTsKKworICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzZWFyY2gpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNlYXJjaCkgeworICAgICAgICAgICAgICBwYXJhbXNba2V5XT1zZWFyY2hba2V5XTsKKyAgICAgICAgICB9CisgICAgICAgICAgJHNjb3BlLmluZGV4VGV4dCA9IHNlYXJjaFsiYW5hbHlzaXMuZmllbGR2YWx1ZSJdOworICAgICAgICAgICRzY29wZS5xdWVyeVRleHQgPSBzZWFyY2hbImFuYWx5c2lzLnF1ZXJ5Il07CisgICAgICAgICAgaWYgKHNlYXJjaFsiYW5hbHlzaXMuZmllbGRuYW1lIl0pIHsKKyAgICAgICAgICAgICAgJHNjb3BlLmZpZWxkT3JUeXBlID0gImZpZWxkbmFtZT0iICsgc2VhcmNoWyJhbmFseXNpcy5maWVsZG5hbWUiXTsKKyAgICAgICAgICAgICAgJHNjb3BlLnNjaGVtYUJyb3dzZXJVcmwgPSAiZmllbGQ9IiArIHNlYXJjaFsiYW5hbHlzaXMuZmllbGRuYW1lIl07CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgJHNjb3BlLmZpZWxkT3JUeXBlID0gImZpZWxkdHlwZT0iICsgc2VhcmNoWyJhbmFseXNpcy5maWVsZHR5cGUiXTsKKyAgICAgICAgICAgICAgJHNjb3BlLnNjaGVtYUJyb3dzZXJVcmwgPSAidHlwZT0iICsgc2VhcmNoWyJhbmFseXNpcy5maWVsZHR5cGUiXTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNlYXJjaFsidmVyYm9zZV9vdXRwdXQiXSA9PSB1bmRlZmluZWQpIHsKKyAgICAgICAgICAgICRzY29wZS52ZXJib3NlID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHNjb3BlLnZlcmJvc2UgPSBzZWFyY2hbInZlcmJvc2Vfb3V0cHV0Il0gPT0gIjEiOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICgkc2NvcGUuZmllbGRPclR5cGUgfHwgJHNjb3BlLmluZGV4VGV4dCB8fCAkc2NvcGUucXVlcnlUZXh0KSB7CisgICAgICAgICAgICBwYXJhbXMuY29yZSA9ICRyb3V0ZVBhcmFtcy5jb3JlOworICAgICAgICAgICAgdmFyIHBhcnRzID0gJHNjb3BlLmZpZWxkT3JUeXBlLnNwbGl0KCI9Iik7CisgICAgICAgICAgICB2YXIgZmllbGRPclR5cGUgPSBwYXJ0c1swXSA9PSAiZmllbGRuYW1lIiA/ICJmaWVsZF9uYW1lcyIgOiAiZmllbGRfdHlwZXMiOworCisgICAgICAgICAgICBBbmFseXNpcy5maWVsZChwYXJhbXMsIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICAgICAgJHNjb3BlLnJlc3VsdCA9IHByb2Nlc3NBbmFseXNpc0RhdGEoZGF0YS5hbmFseXNpcywgZmllbGRPclR5cGUpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgfTsKKworICAgICAgJHNjb3BlLmNoYW5nZUZpZWxkT3JUeXBlID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBwYXJ0cyA9ICRzY29wZS5maWVsZE9yVHlwZS5zcGxpdCgiPSIpOworICAgICAgICBpZiAocGFydHNbMF09PSdmaWVsZG5hbWUnKSB7CisgICAgICAgICAgJHNjb3BlLnNjaGVtYUJyb3dzZXJVcmwgPSAiZmllbGQ9IiArIHBhcnRzWzFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICRzY29wZS5zY2hlbWFCcm93c2VyVXJsID0gInR5cGU9IiArIHBhcnRzWzFdOworICAgICAgICB9CisgICAgICB9OworCisgICAgICAkc2NvcGUudG9nZ2xlVmVyYm9zZSA9IGZ1bmN0aW9uKCkgeworICAgICAgICAkc2NvcGUudmVyYm9zZSA9ICEkc2NvcGUudmVyYm9zZTsKKyAgICAgICAgJHNjb3BlLnVwZGF0ZVF1ZXJ5U3RyaW5nKCk7CisgICAgICB9OworCisgICAgICAkc2NvcGUucmVmcmVzaCgpOworICAgIH0KKyk7CisKKy8qKioqKioqKioqKioqKioKKworZnVuY3Rpb24oZXJyb3IpIHsKKyAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDQpIHsKKyAgICAkc2NvcGUuaXNIYW5kbGVyTWlzc2luZyA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgJHNjb3BlLmFuYWx5c2lzRXJyb3IgPSBlcnJvci5lcnJvci5tc2c7CisgIH0KKyoqKiovCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9jbG91ZC5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2Nsb3VkLmpzCmluZGV4IGJjNmNiZGMuLjJkMGRhZTAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2Nsb3VkLmpzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2Nsb3VkLmpzCkBAIC0xLDU1MSArMSw1NTEgQEAKLS8qDQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi0NCi1zb2xyQWRtaW5BcHAuY29udHJvbGxlcignQ2xvdWRDb250cm9sbGVyJywNCi0gICAgZnVuY3Rpb24oJHNjb3BlLCAkbG9jYXRpb24sIFpvb2tlZXBlciwgQ29uc3RhbnRzKSB7DQotDQotICAgICAgICAkc2NvcGUuc2hvd0RlYnVnID0gZmFsc2U7DQotDQotICAgICAgICAkc2NvcGUuJG9uKCJjbG91ZC1kdW1wIiwgZnVuY3Rpb24oZXZlbnQpIHsNCi0gICAgICAgICAgICAkc2NvcGUuc2hvd0RlYnVnID0gdHJ1ZTsNCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgJHNjb3BlLmNsb3NlRGVidWcgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAkc2NvcGUuc2hvd0RlYnVnID0gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICB2YXIgdmlldyA9ICRsb2NhdGlvbi5zZWFyY2goKS52aWV3ID8gJGxvY2F0aW9uLnNlYXJjaCgpLnZpZXcgOiAiZ3JhcGgiOw0KLSAgICAgICAgaWYgKHZpZXcgPT0gInRyZWUiKSB7DQotICAgICAgICAgICAgJHNjb3BlLnJlc2V0TWVudSgiY2xvdWQtdHJlZSIsIENvbnN0YW50cy5JU19ST09UX1BBR0UpOw0KLSAgICAgICAgICAgIHRyZWVTdWJDb250cm9sbGVyKCRzY29wZSwgWm9va2VlcGVyKTsNCi0gICAgICAgIH0gZWxzZSBpZiAodmlldyA9PSAicmdyYXBoIikgew0KLSAgICAgICAgICAgICRzY29wZS5yZXNldE1lbnUoImNsb3VkLXJncmFwaCIsIENvbnN0YW50cy5JU19ST09UX1BBR0UpOw0KLSAgICAgICAgICAgIGdyYXBoU3ViQ29udHJvbGxlcigkc2NvcGUsIFpvb2tlZXBlciwgdHJ1ZSk7DQotICAgICAgICB9IGVsc2UgaWYgKHZpZXcgPT0gImdyYXBoIikgew0KLSAgICAgICAgICAgICRzY29wZS5yZXNldE1lbnUoImNsb3VkLWdyYXBoIiwgQ29uc3RhbnRzLklTX1JPT1RfUEFHRSk7DQotICAgICAgICAgICAgZ3JhcGhTdWJDb250cm9sbGVyKCRzY29wZSwgWm9va2VlcGVyLCBmYWxzZSk7DQotICAgICAgICB9DQotICAgIH0NCi0pOw0KLQ0KLXZhciB0cmVlU3ViQ29udHJvbGxlciA9IGZ1bmN0aW9uKCRzY29wZSwgWm9va2VlcGVyKSB7DQotICAgICRzY29wZS5zaG93VHJlZSA9IHRydWU7DQotICAgICRzY29wZS5zaG93R3JhcGggPSBmYWxzZTsNCi0gICAgJHNjb3BlLnRyZWUgPSB7fTsNCi0gICAgJHNjb3BlLnNob3dEYXRhID0gZmFsc2U7DQotDQotICAgICRzY29wZS5zaG93VHJlZUxpbmsgPSBmdW5jdGlvbihsaW5rKSB7DQotICAgICAgICB2YXIgcGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudChsaW5rLnJlcGxhY2UoLy4qW1xcPyZdcGF0aD0oW14mI10qKS4qLywgIiQxIikpOw0KLSAgICAgICAgWm9va2VlcGVyLmRldGFpbCh7cGF0aDogcGF0aH0sIGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICAgICAkc2NvcGUuem5vZGUgPSBkYXRhLnpub2RlOw0KLSAgICAgICAgICAgIHZhciBwYXRoID0gZGF0YS56bm9kZS5wYXRoLnNwbGl0KCAnLicgKTsNCi0gICAgICAgICAgICBpZihwYXRoLmxlbmd0aCA+MSkgew0KLSAgICAgICAgICAgICAgJHNjb3BlLmxhbmcgPSBwYXRoLnBvcCgpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICB2YXIgbGFzdFBhdGhFbGVtZW50ID0gZGF0YS56bm9kZS5wYXRoLnNwbGl0KCAnLycgKS5wb3AoKTsNCi0gICAgICAgICAgICAgIGlmIChsYXN0UGF0aEVsZW1lbnQgPT0gIm1hbmFnZWQtc2NoZW1hIikgew0KLSAgICAgICAgICAgICAgICAgICRzY29wZS5sYW5nID0gInhtbCI7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICRzY29wZS5zaG93RGF0YSA9IHRydWU7DQotICAgICAgICB9KTsNCi0gICAgfTsNCi0NCi0gICAgJHNjb3BlLmhpZGVEYXRhID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAkc2NvcGUuc2hvd0RhdGEgPSBmYWxzZTsNCi0gICAgfTsNCi0NCi0gICAgJHNjb3BlLmluaXRUcmVlID0gZnVuY3Rpb24oKSB7DQotICAgICAgWm9va2VlcGVyLnNpbXBsZShmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAkc2NvcGUudHJlZSA9IGRhdGEudHJlZTsNCi0gICAgICB9KTsNCi0gICAgfTsNCi0NCi0gICAgJHNjb3BlLmluaXRUcmVlKCk7DQotfTsNCi0NCi12YXIgZ3JhcGhTdWJDb250cm9sbGVyID0gZnVuY3Rpb24gKCRzY29wZSwgWm9va2VlcGVyLCBpc1JhZGlhbCkgew0KLSAgICAkc2NvcGUuc2hvd1RyZWUgPSBmYWxzZTsNCi0gICAgJHNjb3BlLnNob3dHcmFwaCA9IHRydWU7DQotDQotICAgICRzY29wZS5maWx0ZXJUeXBlID0gInN0YXR1cyI7DQotDQotICAgICRzY29wZS5oZWxwZXJEYXRhID0gew0KLSAgICAgICAgcHJvdG9jb2w6IFtdLA0KLSAgICAgICAgaG9zdDogW10sDQotICAgICAgICBob3N0bmFtZTogW10sDQotICAgICAgICBwb3J0OiBbXSwNCi0gICAgICAgIHBhdGhuYW1lOiBbXQ0KLSAgICB9Ow0KLQ0KLSAgICAkc2NvcGUubmV4dCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgJHNjb3BlLnBvcyArPSAkc2NvcGUucm93czsNCi0gICAgICAgICRzY29wZS5pbml0R3JhcGgoKTsNCi0gICAgfQ0KLQ0KLSAgICAkc2NvcGUucHJldmlvdXMgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICRzY29wZS5wb3MgPSBNYXRoLm1heCgwLCAkc2NvcGUucG9zIC0gJHNjb3BlLnJvd3MpOw0KLSAgICAgICAgJHNjb3BlLmluaXRHcmFwaCgpOw0KLSAgICB9DQotDQotICAgICRzY29wZS5yZXNldEdyYXBoID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAkc2NvcGUucG9zID0gMDsNCi0gICAgICAgICRzY29wZS5pbml0R3JhcGgoKTsNCi0gICAgfQ0KLQ0KLSAgICAkc2NvcGUuaW5pdEdyYXBoID0gZnVuY3Rpb24oKSB7DQotICAgICAgICBab29rZWVwZXIubGl2ZU5vZGVzKGZ1bmN0aW9uIChkYXRhKSB7DQotICAgICAgICAgICAgdmFyIGxpdmVfbm9kZXMgPSB7fTsNCi0gICAgICAgICAgICBmb3IgKHZhciBjIGluIGRhdGEudHJlZVswXS5jaGlsZHJlbikgew0KLSAgICAgICAgICAgICAgICBsaXZlX25vZGVzW2RhdGEudHJlZVswXS5jaGlsZHJlbltjXS5kYXRhLnRpdGxlXSA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7dmlldzogImdyYXBoIn07DQotICAgICAgICAgICAgaWYgKCRzY29wZS5yb3dzKSB7DQotICAgICAgICAgICAgICAgIHBhcmFtcy5zdGFydCA9ICRzY29wZS5wb3M7DQotICAgICAgICAgICAgICAgIHBhcmFtcy5yb3dzID0gJHNjb3BlLnJvd3M7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhciBmaWx0ZXIgPSAoJHNjb3BlLmZpbHRlclR5cGU9PSdzdGF0dXMnKSA/ICRzY29wZS5wYWdpbmdTdGF0dXNGaWx0ZXIgOiAkc2NvcGUucGFnaW5nRmlsdGVyOw0KLQ0KLSAgICAgICAgICAgIGlmIChmaWx0ZXIpIHsNCi0gICAgICAgICAgICAgICAgcGFyYW1zLmZpbHRlclR5cGUgPSAkc2NvcGUuZmlsdGVyVHlwZTsNCi0gICAgICAgICAgICAgICAgcGFyYW1zLmZpbHRlciA9IGZpbHRlcjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgWm9va2VlcGVyLmNsdXN0ZXJTdGF0ZShwYXJhbXMsIGZ1bmN0aW9uIChkYXRhKSB7DQotICAgICAgICAgICAgICAgICAgICBldmFsKCJ2YXIgc3RhdGU9IiArIGRhdGEuem5vZGUuZGF0YSk7IC8vIEB0b2RvIGZpeCBob3JyaWQgbWVhbnMgdG8gcGFyc2UgSlNPTg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdmFyIGxlYWZfY291bnQgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgdmFyIGdyYXBoX2RhdGEgPSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbnVsbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10NCi0gICAgICAgICAgICAgICAgICAgIH07DQotDQotICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjIGluIHN0YXRlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJkcyA9IFtdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgaW4gc3RhdGVbY10uc2hhcmRzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IFtdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHN0YXRlW2NdLnNoYXJkc1tzXS5yZXBsaWNhcykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhZl9jb3VudCsrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxpY2EgPSBzdGF0ZVtjXS5zaGFyZHNbc10ucmVwbGljYXNbbl0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmkgPSByZXBsaWNhLmJhc2VfdXJsOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gdXJpLm1hdGNoKC9eKFx3KzopXC9cLygoW1x3XGRcLi1dKykoOihcZCspKT8pKC4rKSQvKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmlfcGFydHMgPSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2w6IHBhcnRzWzFdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IHBhcnRzWzJdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBwYXJ0c1szXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0OiBwYXJzZUludChwYXJ0c1s1XSB8fCA4MCwgMTApLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lOiBwYXJ0c1s2XQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5oZWxwZXJEYXRhLnByb3RvY29sLnB1c2godXJpX3BhcnRzLnByb3RvY29sKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5oZWxwZXJEYXRhLmhvc3QucHVzaCh1cmlfcGFydHMuaG9zdCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaGVscGVyRGF0YS5ob3N0bmFtZS5wdXNoKHVyaV9wYXJ0cy5ob3N0bmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaGVscGVyRGF0YS5wb3J0LnB1c2godXJpX3BhcnRzLnBvcnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmhlbHBlckRhdGEucGF0aG5hbWUucHVzaCh1cmlfcGFydHMucGF0aG5hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHJlcGxpY2Euc3RhdGU7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpdmVfbm9kZXNbcmVwbGljYS5ub2RlX25hbWVdKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ2dvbmUnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdXJpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ25vZGUnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogc3RhdHVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkZXI6ICd0cnVlJyA9PT0gcmVwbGljYS5sZWFkZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaTogdXJpX3BhcnRzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJkID0gew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc2hhcmQnDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IG5vZGVzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJkcy5wdXNoKHNoYXJkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2xsZWN0aW9uJw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogc2hhcmRzDQotICAgICAgICAgICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBncmFwaF9kYXRhLmNoaWxkcmVuLnB1c2goY29sbGVjdGlvbik7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaGVscGVyRGF0YS5wcm90b2NvbCA9ICQudW5pcXVlKCRzY29wZS5oZWxwZXJEYXRhLnByb3RvY29sKTsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5oZWxwZXJEYXRhLmhvc3QgPSAkLnVuaXF1ZSgkc2NvcGUuaGVscGVyRGF0YS5ob3N0KTsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5oZWxwZXJEYXRhLmhvc3RuYW1lID0gJC51bmlxdWUoJHNjb3BlLmhlbHBlckRhdGEuaG9zdG5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmhlbHBlckRhdGEucG9ydCA9ICQudW5pcXVlKCRzY29wZS5oZWxwZXJEYXRhLnBvcnQpOw0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmhlbHBlckRhdGEucGF0aG5hbWUgPSAkLnVuaXF1ZSgkc2NvcGUuaGVscGVyRGF0YS5wYXRobmFtZSk7DQotDQotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUmFkaWFsICYmIGRhdGEuem5vZGUgJiYgZGF0YS56bm9kZS5wYWdpbmcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc2hvd1BhZ2luZyA9IHRydWU7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnIgPSBkYXRhLnpub2RlLnBhZ2luZy5zcGxpdCgnfCcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJyLmxlbmd0aCA8IDMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dQYWdpbmcgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc3RhcnQgPSBNYXRoLm1heChwYXJzZUludChwYXJyWzBdKSwgMCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcmV2RW5hYmxlZCA9ICgkc2NvcGUuc3RhcnQgPiAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnJvd3MgPSBwYXJzZUludChwYXJyWzFdKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnRvdGFsID0gcGFyc2VJbnQocGFyclsyXSk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkc2NvcGUucm93cyA9PSAtMSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dQYWdpbmcgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJUeXBlID0gcGFyci5sZW5ndGggPiAzID8gcGFyclszXSA6ICcnOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlclR5cGUgPT0gJycgfHwgZmlsdGVyVHlwZSA9PSAnbm9uZScpIGZpbHRlclR5cGUgPSAnc3RhdHVzJzsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICskKCcjY2xvdWRHcmFwaFBhZ2luZ0ZpbHRlclR5cGUnKS52YWwoZmlsdGVyVHlwZSk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsdGVyID0gcGFyci5sZW5ndGggPiA0ID8gcGFycls0XSA6ICcnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2UgPSBNYXRoLmZsb29yKCRzY29wZS5zdGFydCAvICRzY29wZS5yb3dzKSArIDE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFnZXMgPSBNYXRoLmNlaWwoJHNjb3BlLnRvdGFsIC8gJHNjb3BlLnJvd3MpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmxhc3QgPSBNYXRoLm1pbigkc2NvcGUuc3RhcnQgKyAkc2NvcGUucm93cywgJHNjb3BlLnRvdGFsKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5uZXh0RW5hYmxlZCA9ICgkc2NvcGUubGFzdCA8ICRzY29wZS50b3RhbCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc2hvd1BhZ2luZyA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdyYXBoRGF0YSA9IGdyYXBoX2RhdGE7DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUubGVhZkNvdW50ID0gbGVhZl9jb3VudDsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5pc1JhZGlhbCA9IGlzUmFkaWFsOw0KLSAgICAgICAgICAgICAgICB9KTsNCi0gICAgICAgIH0pOw0KLSAgICB9Ow0KLQ0KLSAgICAkc2NvcGUuaW5pdEdyYXBoKCk7DQotfTsNCi0NCi1zb2xyQWRtaW5BcHAuZGlyZWN0aXZlKCdncmFwaCcsIGZ1bmN0aW9uKENvbnN0YW50cykgew0KLSAgICByZXR1cm4gew0KLSAgICAgICAgcmVzdHJpY3Q6ICdFQScsDQotICAgICAgICBzY29wZTogew0KLSAgICAgICAgICAgIGRhdGE6ICI9IiwNCi0gICAgICAgICAgICBsZWFmQ291bnQ6ICI9IiwNCi0gICAgICAgICAgICBoZWxwZXJEYXRhOiAiPSIsDQotICAgICAgICAgICAgaXNSYWRpYWw6ICI9Ig0KLSAgICAgICAgfSwNCi0gICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCwgYXR0cnMpIHsNCi0gICAgICAgICAgICB2YXIgaGVscGVyX3BhdGhfY2xhc3MgPSBmdW5jdGlvbiAocCkgew0KLSAgICAgICAgICAgICAgICB2YXIgY2xhc3NlcyA9IFsnbGluayddOw0KLSAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2x2bC0nICsgcC50YXJnZXQuZGVwdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAocC50YXJnZXQuZGF0YSAmJiBwLnRhcmdldC5kYXRhLmxlYWRlcikgew0KLSAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdsZWFkZXInKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAocC50YXJnZXQuZGF0YSAmJiBwLnRhcmdldC5kYXRhLnN0YXRlKSB7DQotICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2gocC50YXJnZXQuZGF0YS5zdGF0ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpOw0KLSAgICAgICAgICAgIH07DQotDQotICAgICAgICAgICAgdmFyIGhlbHBlcl9ub2RlX2NsYXNzID0gZnVuY3Rpb24gKGQpIHsNCi0gICAgICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSBbJ25vZGUnXTsNCi0gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdsdmwtJyArIGQuZGVwdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoZC5kYXRhICYmIGQuZGF0YS5sZWFkZXIpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnbGVhZGVyJyk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGQuZGF0YSAmJiBkLmRhdGEuc3RhdGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaChkLmRhdGEuc3RhdGUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTsNCi0gICAgICAgICAgICB9Ow0KLQ0KLSAgICAgICAgICAgIHZhciBoZWxwZXJfbm9kZV90ZXh0ID0gZnVuY3Rpb24gKGQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFkLmRhdGEgfHwgIWQuZGF0YS51cmkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkLm5hbWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBkLmRhdGEudXJpLmhvc3RuYW1lOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoMSAhPT0gc2NvcGUuaGVscGVyRGF0YS5wcm90b2NvbC5sZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBkLmRhdGEudXJpLnByb3RvY29sICsgJy8vJyArIG5hbWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKDEgIT09IHNjb3BlLmhlbHBlckRhdGEucG9ydC5sZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgICAgIG5hbWUgKz0gJzonICsgZC5kYXRhLnVyaS5wb3J0Ow0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmICgxICE9PSBzY29wZS5oZWxwZXJEYXRhLnBhdGhuYW1lLmxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgICAgbmFtZSArPSBkLmRhdGEudXJpLnBhdGhuYW1lOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOw0KLSAgICAgICAgICAgIH07DQotDQotICAgICAgICAgICAgc2NvcGUuJHdhdGNoKCJkYXRhIiwgZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7DQotICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmlzUmFkaWFsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmFkaWFsR3JhcGgoZWxlbWVudCwgc2NvcGUuZGF0YSwgc2NvcGUubGVhZkNvdW50KTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZmxhdEdyYXBoKGVsZW1lbnQsIHNjb3BlLmRhdGEsIHNjb3BlLmxlYWZDb3VudCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0NCi0NCi0gICAgICAgICAgICBmdW5jdGlvbiBzZXROb2RlTmF2aWdhdGlvbkJlaGF2aW9yKG5vZGUsIHZpZXcpew0KLSAgICAgICAgICAgICAgICBub2RlDQotICAgICAgICAgICAgICAgIC5hdHRyKCdkYXRhLWhyZWYnLCBmdW5jdGlvbiAoZCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGQudHlwZSA9PSAibm9kZSIpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXROb2RlVXJsKGQsIHZpZXcpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZXsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0pDQotICAgICAgICAgICAgICAgIC5vbignY2xpY2snLCBmdW5jdGlvbihkKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZC5kYXRhLnR5cGUgPT0gIm5vZGUiKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gZ2V0Tm9kZVVybChkLCB2aWV3KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGZ1bmN0aW9uIGdldE5vZGVVcmwoZCwgdmlldyl7DQotICAgICAgICAgICAgICAgIHZhciB1cmwgPSBkLm5hbWUgKyBDb25zdGFudHMuUk9PVF9VUkwgKyAiIy9+Y2xvdWQiOw0KLSAgICAgICAgICAgICAgICBpZiAodmlldyAhPSB1bmRlZmluZWQpew0KLSAgICAgICAgICAgICAgICAgICAgdXJsICs9ICI/dmlldz0iICsgdmlldzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdXJsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB2YXIgZmxhdEdyYXBoID0gZnVuY3Rpb24oZWxlbWVudCwgZ3JhcGhEYXRhLCBsZWFmQ291bnQpIHsNCi0gICAgICAgICAgICAgICAgdmFyIHcgPSBlbGVtZW50LndpZHRoKCksDQotICAgICAgICAgICAgICAgICAgICBoID0gbGVhZkNvdW50ICogMjA7DQotDQotICAgICAgICAgICAgICAgIHZhciB0cmVlID0gZDMubGF5b3V0LnRyZWUoKS5zaXplKFtoLCB3IC0gNDAwXSk7DQotDQotICAgICAgICAgICAgICAgIHZhciBkaWFnb25hbCA9IGQzLnN2Zy5kaWFnb25hbCgpLnByb2plY3Rpb24oZnVuY3Rpb24gKGQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBbZC55LCBkLnhdOw0KLSAgICAgICAgICAgICAgICB9KTsNCi0NCi0gICAgICAgICAgICAgICAgZDMuc2VsZWN0KCcjY2FudmFzJywgZWxlbWVudCkuaHRtbCgnJyk7DQotICAgICAgICAgICAgICAgIHZhciB2aXMgPSBkMy5zZWxlY3QoJyNjYW52YXMnLCBlbGVtZW50KS5hcHBlbmQoJ3N2ZycpDQotICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KQ0KLSAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpDQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJykNCi0gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDEwMCwgMCknKTsNCi0NCi0gICAgICAgICAgICAgICAgdmFyIG5vZGVzID0gdHJlZS5ub2RlcyhncmFwaERhdGEpOw0KLQ0KLSAgICAgICAgICAgICAgICB2YXIgbGluayA9IHZpcy5zZWxlY3RBbGwoJ3BhdGgubGluaycpDQotICAgICAgICAgICAgICAgICAgICAuZGF0YSh0cmVlLmxpbmtzKG5vZGVzKSkNCi0gICAgICAgICAgICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgncGF0aCcpDQotICAgICAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCBoZWxwZXJfcGF0aF9jbGFzcykNCi0gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdkJywgZGlhZ29uYWwpOw0KLQ0KLSAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IHZpcy5zZWxlY3RBbGwoJ2cubm9kZScpDQotICAgICAgICAgICAgICAgICAgICAuZGF0YShub2RlcykNCi0gICAgICAgICAgICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgnZycpDQotICAgICAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCBoZWxwZXJfbm9kZV9jbGFzcykNCi0gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBkLnkgKyAnLCcgKyBkLnggKyAnKSc7DQotICAgICAgICAgICAgICAgICAgICB9KQ0KLQ0KLSAgICAgICAgICAgICAgICBub2RlLmFwcGVuZCgnY2lyY2xlJykNCi0gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgNC41KTsNCi0NCi0gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmQoJ3RleHQnKQ0KLSAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2R4JywgZnVuY3Rpb24gKGQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gZC5kZXB0aCA/IC04IDogODsNCi0gICAgICAgICAgICAgICAgICAgIH0pDQotICAgICAgICAgICAgICAgICAgICAuYXR0cignZHknLCBmdW5jdGlvbiAoZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1Ow0KLSAgICAgICAgICAgICAgICAgICAgfSkNCi0gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsIGZ1bmN0aW9uIChkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IGQuZGVwdGggPyAnZW5kJyA6ICdzdGFydCc7DQotICAgICAgICAgICAgICAgICAgICB9KSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAudGV4dChoZWxwZXJfbm9kZV90ZXh0KTsNCi0NCi0gICAgICAgICAgICAgICAgc2V0Tm9kZU5hdmlnYXRpb25CZWhhdmlvcihub2RlKTsNCi0gICAgICAgICAgICB9Ow0KLQ0KLSAgICAgICAgICAgIHZhciByYWRpYWxHcmFwaCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGdyYXBoRGF0YSwgbGVhZkNvdW50KSB7DQotICAgICAgICAgICAgICAgIHZhciBtYXhfdmFsID0gTWF0aC5taW4oZWxlbWVudC53aWR0aCgpLCAkKCdib2R5JykuaGVpZ2h0KCkpDQotICAgICAgICAgICAgICAgIHZhciByID0gbWF4X3ZhbCAvIDI7DQotDQotICAgICAgICAgICAgICAgIHZhciBjbHVzdGVyID0gZDMubGF5b3V0LmNsdXN0ZXIoKQ0KLSAgICAgICAgICAgICAgICAgICAgLnNpemUoWzM2MCwgciAtIDE2MF0pOw0KLQ0KLSAgICAgICAgICAgICAgICB2YXIgZGlhZ29uYWwgPSBkMy5zdmcuZGlhZ29uYWwucmFkaWFsKCkNCi0gICAgICAgICAgICAgICAgICAgIC5wcm9qZWN0aW9uKGZ1bmN0aW9uIChkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtkLnksIGQueCAvIDE4MCAqIE1hdGguUEldOw0KLSAgICAgICAgICAgICAgICAgICAgfSk7DQotDQotICAgICAgICAgICAgICAgIGQzLnNlbGVjdCgnI2NhbnZhcycsIGVsZW1lbnQpLmh0bWwoJycpOw0KLSAgICAgICAgICAgICAgICB2YXIgdmlzID0gZDMuc2VsZWN0KCcjY2FudmFzJykuYXBwZW5kKCdzdmcnKQ0KLSAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgciAqIDIpDQotICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgciAqIDIpDQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJykNCi0gICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyByICsgJywnICsgciArICcpJyk7DQotDQotICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IGNsdXN0ZXIubm9kZXMoZ3JhcGhEYXRhKTsNCi0NCi0gICAgICAgICAgICAgICAgdmFyIGxpbmsgPSB2aXMuc2VsZWN0QWxsKCdwYXRoLmxpbmsnKQ0KLSAgICAgICAgICAgICAgICAgICAgLmRhdGEoY2x1c3Rlci5saW5rcyhub2RlcykpDQotICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoJ3BhdGgnKQ0KLSAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgaGVscGVyX3BhdGhfY2xhc3MpDQotICAgICAgICAgICAgICAgICAgICAuYXR0cignZCcsIGRpYWdvbmFsKTsNCi0NCi0gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB2aXMuc2VsZWN0QWxsKCdnLm5vZGUnKQ0KLSAgICAgICAgICAgICAgICAgICAgLmRhdGEobm9kZXMpDQotICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoJ2cnKQ0KLSAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgaGVscGVyX25vZGVfY2xhc3MpDQotICAgICAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3JvdGF0ZSgnICsgKGQueCAtIDkwKSArICcpdHJhbnNsYXRlKCcgKyBkLnkgKyAnKSc7DQotICAgICAgICAgICAgICAgICAgICB9KQ0KLQ0KLSAgICAgICAgICAgICAgICBub2RlLmFwcGVuZCgnY2lyY2xlJykNCi0gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgNC41KTsNCi0NCi0gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmQoJ3RleHQnKQ0KLSAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2R4JywgZnVuY3Rpb24gKGQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC54IDwgMTgwID8gOCA6IC04Ow0KLSAgICAgICAgICAgICAgICAgICAgfSkNCi0gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdkeScsICcuMzFlbScpDQotICAgICAgICAgICAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCBmdW5jdGlvbiAoZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnggPCAxODAgPyAnc3RhcnQnIDogJ2VuZCc7DQotICAgICAgICAgICAgICAgICAgICB9KQ0KLSAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQueCA8IDE4MCA/IG51bGwgOiAncm90YXRlKDE4MCknOw0KLSAgICAgICAgICAgICAgICAgICAgfSkNCi0gICAgICAgICAgICAgICAgICAgIC50ZXh0KGhlbHBlcl9ub2RlX3RleHQpOw0KLQ0KLSAgICAgICAgICAgICAgICBzZXROb2RlTmF2aWdhdGlvbkJlaGF2aW9yKG5vZGUsICJyZ3JhcGgiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH07DQotfSkNCi0NCi0vKg0KLQ0KLT09PT09PT09PT09PT09PT09PT09PT09PQ0KLXZhciBpbml0X2RlYnVnID0gZnVuY3Rpb24oIGNsb3VkX2VsZW1lbnQgKQ0KLXsNCi0gIHZhciBkZWJ1Z19lbGVtZW50ID0gJCggJyNkZWJ1ZycsIGNsb3VkX2VsZW1lbnQgKTsNCi0gIHZhciBkZWJ1Z19idXR0b24gPSAkKCAnI21lbnUgI2Nsb3VkIC5kdW1wIGEnICk7DQotDQotICB2YXIgY2xpcGJvYXJkX2VsZW1lbnQgPSAkKCAnLmNsaXBib2FyZCcsIGRlYnVnX2VsZW1lbnQgKTsNCi0gIHZhciBjbGlwYm9hcmRfYnV0dG9uID0gJCggJ2EnLCBjbGlwYm9hcmRfZWxlbWVudCApOw0KLQ0KLSAgJCggJy5jbGlwYm9hcmQnLCBkZWJ1Z19lbGVtZW50ICkNCi0gICAgLmRpZSggJ2NsaWNrJyApDQotICAgIC5saXZlDQotICAgICgNCi0gICAgICAnY2xpY2snLA0KLSAgICAgIGZ1bmN0aW9uKCBldmVudCApDQotICAgICAgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgIH0NCi0gICAgKTsNCi0NCi0gICAgICAgICAgICB1cmwgOiBhcHAuY29uZmlnLnNvbHJfcGF0aCArICcvem9va2VlcGVyP3d0PWpzb24mZHVtcD10cnVlJywNCi0gICAgICAgICAgICAgIFplcm9DbGlwYm9hcmQuc2V0TW92aWVQYXRoKCAnaW1nL1plcm9DbGlwYm9hcmQuc3dmJyApOw0KLQ0KLSAgICAgICAgICAgICAgY2xpcGJvYXJkX2NsaWVudCA9IG5ldyBaZXJvQ2xpcGJvYXJkLkNsaWVudCgpOw0KLQ0KLSAgICAgICAgICAgICAgY2xpcGJvYXJkX2NsaWVudC5hZGRFdmVudExpc3RlbmVyDQotICAgICAgICAgICAgICAoDQotICAgICAgICAgICAgICAgICdsb2FkJywNCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24oIGNsaWVudCApDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgKTsNCi0NCi0gICAgICAgICAgICAgIGNsaXBib2FyZF9jbGllbnQuYWRkRXZlbnRMaXN0ZW5lcg0KLSAgICAgICAgICAgICAgKA0KLSAgICAgICAgICAgICAgICAnY29tcGxldGUnLA0KLSAgICAgICAgICAgICAgICBmdW5jdGlvbiggY2xpZW50LCB0ZXh0ICkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgIGNsaXBib2FyZF9lbGVtZW50DQotICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoICdjb3BpZWQnICk7DQotDQotICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkX2J1dHRvbg0KLSAgICAgICAgICAgICAgICAgICAgLmRhdGEoICd0ZXh0JywgY2xpcGJvYXJkX2J1dHRvbi50ZXh0KCkgKQ0KLSAgICAgICAgICAgICAgICAgICAgLnRleHQoIGNsaXBib2FyZF9idXR0b24uZGF0YSggJ2NvcGllZCcgKSApOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICApOw0KLSAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKCByZXNwb25zZSwgdGV4dF9zdGF0dXMsIHhociApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgY2xpcGJvYXJkX2NsaWVudC5nbHVlDQotICAgICAgICAgICAgICAoDQotICAgICAgICAgICAgICAgIGNsaXBib2FyZF9lbGVtZW50LmdldCgwKSwNCi0gICAgICAgICAgICAgICAgY2xpcGJvYXJkX2J1dHRvbi5nZXQoMCkNCi0gICAgICAgICAgICAgICk7DQotDQotICAgICAgICAgICAgICBjbGlwYm9hcmRfY2xpZW50LnNldFRleHQoIHJlc3BvbnNlLnJlcGxhY2UoIC9cXC9nLCAnXFxcXCcgKSApOw0KLQ0KLSAgICAgICAgICAgICAgJCggJy5kZWJ1ZycsIGRlYnVnX2VsZW1lbnQgKQ0KLSAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoICdsb2FkZXInICkNCi0gICAgICAgICAgICAgICAgLnRleHQoIHJlc3BvbnNlICk7DQotICAgICAgICAgICAgfSwNCi0gICAgICAgICAgICBlcnJvciA6IGZ1bmN0aW9uKCB4aHIsIHRleHRfc3RhdHVzLCBlcnJvcl90aHJvd24gKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICB9LA0KLSAgICAgICAgICAgIGNvbXBsZXRlIDogZnVuY3Rpb24oIHhociwgdGV4dF9zdGF0dXMgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgICk7DQotICAgICAgfQ0KLSAgICApDQotICAgIC5kaWUoICdoaWRlJyApDQotICAgIC5saXZlDQotICAgICgNCi0gICAgICAnaGlkZScsDQotICAgICAgZnVuY3Rpb24oIGV2ZW50ICkNCi0gICAgICB7DQotICAgICAgICAkKCAnLmRlYnVnJywgZGVidWdfZWxlbWVudCApDQotICAgICAgICAgIC5lbXB0eSgpOw0KLQ0KLSAgICAgICAgY2xpcGJvYXJkX2VsZW1lbnQNCi0gICAgICAgICAgLnJlbW92ZUNsYXNzKCAnY29waWVkJyApOw0KLQ0KLSAgICAgICAgY2xpcGJvYXJkX2J1dHRvbg0KLSAgICAgICAgICAuZGF0YSggJ2NvcGllZCcsIGNsaXBib2FyZF9idXR0b24udGV4dCgpICkNCi0gICAgICAgICAgLnRleHQoIGNsaXBib2FyZF9idXR0b24uZGF0YSggJ3RleHQnICkgKTsNCi0NCi0gICAgICAgIGNsaXBib2FyZF9jbGllbnQuZGVzdHJveSgpOw0KLQ0KLSAgICAgICAgZGVidWdfZWxlbWVudC5oaWRlKCk7DQotICAgICAgfQ0KLSAgICApOw0KLX07DQotDQotKi8NCisvKgorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3NvbHJBZG1pbkFwcC5jb250cm9sbGVyKCdDbG91ZENvbnRyb2xsZXInLAorICAgIGZ1bmN0aW9uKCRzY29wZSwgJGxvY2F0aW9uLCBab29rZWVwZXIsIENvbnN0YW50cykgeworCisgICAgICAgICRzY29wZS5zaG93RGVidWcgPSBmYWxzZTsKKworICAgICAgICAkc2NvcGUuJG9uKCJjbG91ZC1kdW1wIiwgZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgICAgICAgICRzY29wZS5zaG93RGVidWcgPSB0cnVlOworICAgICAgICB9KTsKKworICAgICAgICAkc2NvcGUuY2xvc2VEZWJ1ZyA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgJHNjb3BlLnNob3dEZWJ1ZyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHZpZXcgPSAkbG9jYXRpb24uc2VhcmNoKCkudmlldyA/ICRsb2NhdGlvbi5zZWFyY2goKS52aWV3IDogImdyYXBoIjsKKyAgICAgICAgaWYgKHZpZXcgPT0gInRyZWUiKSB7CisgICAgICAgICAgICAkc2NvcGUucmVzZXRNZW51KCJjbG91ZC10cmVlIiwgQ29uc3RhbnRzLklTX1JPT1RfUEFHRSk7CisgICAgICAgICAgICB0cmVlU3ViQ29udHJvbGxlcigkc2NvcGUsIFpvb2tlZXBlcik7CisgICAgICAgIH0gZWxzZSBpZiAodmlldyA9PSAicmdyYXBoIikgeworICAgICAgICAgICAgJHNjb3BlLnJlc2V0TWVudSgiY2xvdWQtcmdyYXBoIiwgQ29uc3RhbnRzLklTX1JPT1RfUEFHRSk7CisgICAgICAgICAgICBncmFwaFN1YkNvbnRyb2xsZXIoJHNjb3BlLCBab29rZWVwZXIsIHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKHZpZXcgPT0gImdyYXBoIikgeworICAgICAgICAgICAgJHNjb3BlLnJlc2V0TWVudSgiY2xvdWQtZ3JhcGgiLCBDb25zdGFudHMuSVNfUk9PVF9QQUdFKTsKKyAgICAgICAgICAgIGdyYXBoU3ViQ29udHJvbGxlcigkc2NvcGUsIFpvb2tlZXBlciwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorKTsKKwordmFyIHRyZWVTdWJDb250cm9sbGVyID0gZnVuY3Rpb24oJHNjb3BlLCBab29rZWVwZXIpIHsKKyAgICAkc2NvcGUuc2hvd1RyZWUgPSB0cnVlOworICAgICRzY29wZS5zaG93R3JhcGggPSBmYWxzZTsKKyAgICAkc2NvcGUudHJlZSA9IHt9OworICAgICRzY29wZS5zaG93RGF0YSA9IGZhbHNlOworCisgICAgJHNjb3BlLnNob3dUcmVlTGluayA9IGZ1bmN0aW9uKGxpbmspIHsKKyAgICAgICAgdmFyIHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQobGluay5yZXBsYWNlKC8uKltcXD8mXXBhdGg9KFteJiNdKikuKi8sICIkMSIpKTsKKyAgICAgICAgWm9va2VlcGVyLmRldGFpbCh7cGF0aDogcGF0aH0sIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICAgICRzY29wZS56bm9kZSA9IGRhdGEuem5vZGU7CisgICAgICAgICAgICB2YXIgcGF0aCA9IGRhdGEuem5vZGUucGF0aC5zcGxpdCggJy4nICk7CisgICAgICAgICAgICBpZihwYXRoLmxlbmd0aCA+MSkgeworICAgICAgICAgICAgICAkc2NvcGUubGFuZyA9IHBhdGgucG9wKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB2YXIgbGFzdFBhdGhFbGVtZW50ID0gZGF0YS56bm9kZS5wYXRoLnNwbGl0KCAnLycgKS5wb3AoKTsKKyAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoRWxlbWVudCA9PSAibWFuYWdlZC1zY2hlbWEiKSB7CisgICAgICAgICAgICAgICAgICAkc2NvcGUubGFuZyA9ICJ4bWwiOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2NvcGUuc2hvd0RhdGEgPSB0cnVlOworICAgICAgICB9KTsKKyAgICB9OworCisgICAgJHNjb3BlLmhpZGVEYXRhID0gZnVuY3Rpb24oKSB7CisgICAgICAgICRzY29wZS5zaG93RGF0YSA9IGZhbHNlOworICAgIH07CisKKyAgICAkc2NvcGUuaW5pdFRyZWUgPSBmdW5jdGlvbigpIHsKKyAgICAgIFpvb2tlZXBlci5zaW1wbGUoZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAkc2NvcGUudHJlZSA9IGRhdGEudHJlZTsKKyAgICAgIH0pOworICAgIH07CisKKyAgICAkc2NvcGUuaW5pdFRyZWUoKTsKK307CisKK3ZhciBncmFwaFN1YkNvbnRyb2xsZXIgPSBmdW5jdGlvbiAoJHNjb3BlLCBab29rZWVwZXIsIGlzUmFkaWFsKSB7CisgICAgJHNjb3BlLnNob3dUcmVlID0gZmFsc2U7CisgICAgJHNjb3BlLnNob3dHcmFwaCA9IHRydWU7CisKKyAgICAkc2NvcGUuZmlsdGVyVHlwZSA9ICJzdGF0dXMiOworCisgICAgJHNjb3BlLmhlbHBlckRhdGEgPSB7CisgICAgICAgIHByb3RvY29sOiBbXSwKKyAgICAgICAgaG9zdDogW10sCisgICAgICAgIGhvc3RuYW1lOiBbXSwKKyAgICAgICAgcG9ydDogW10sCisgICAgICAgIHBhdGhuYW1lOiBbXQorICAgIH07CisKKyAgICAkc2NvcGUubmV4dCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAkc2NvcGUucG9zICs9ICRzY29wZS5yb3dzOworICAgICAgICAkc2NvcGUuaW5pdEdyYXBoKCk7CisgICAgfQorCisgICAgJHNjb3BlLnByZXZpb3VzID0gZnVuY3Rpb24oKSB7CisgICAgICAgICRzY29wZS5wb3MgPSBNYXRoLm1heCgwLCAkc2NvcGUucG9zIC0gJHNjb3BlLnJvd3MpOworICAgICAgICAkc2NvcGUuaW5pdEdyYXBoKCk7CisgICAgfQorCisgICAgJHNjb3BlLnJlc2V0R3JhcGggPSBmdW5jdGlvbigpIHsKKyAgICAgICAgJHNjb3BlLnBvcyA9IDA7CisgICAgICAgICRzY29wZS5pbml0R3JhcGgoKTsKKyAgICB9CisKKyAgICAkc2NvcGUuaW5pdEdyYXBoID0gZnVuY3Rpb24oKSB7CisgICAgICAgIFpvb2tlZXBlci5saXZlTm9kZXMoZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgIHZhciBsaXZlX25vZGVzID0ge307CisgICAgICAgICAgICBmb3IgKHZhciBjIGluIGRhdGEudHJlZVswXS5jaGlsZHJlbikgeworICAgICAgICAgICAgICAgIGxpdmVfbm9kZXNbZGF0YS50cmVlWzBdLmNoaWxkcmVuW2NdLmRhdGEudGl0bGVdID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt2aWV3OiAiZ3JhcGgifTsKKyAgICAgICAgICAgIGlmICgkc2NvcGUucm93cykgeworICAgICAgICAgICAgICAgIHBhcmFtcy5zdGFydCA9ICRzY29wZS5wb3M7CisgICAgICAgICAgICAgICAgcGFyYW1zLnJvd3MgPSAkc2NvcGUucm93czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGZpbHRlciA9ICgkc2NvcGUuZmlsdGVyVHlwZT09J3N0YXR1cycpID8gJHNjb3BlLnBhZ2luZ1N0YXR1c0ZpbHRlciA6ICRzY29wZS5wYWdpbmdGaWx0ZXI7CisKKyAgICAgICAgICAgIGlmIChmaWx0ZXIpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMuZmlsdGVyVHlwZSA9ICRzY29wZS5maWx0ZXJUeXBlOworICAgICAgICAgICAgICAgIHBhcmFtcy5maWx0ZXIgPSBmaWx0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFpvb2tlZXBlci5jbHVzdGVyU3RhdGUocGFyYW1zLCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBldmFsKCJ2YXIgc3RhdGU9IiArIGRhdGEuem5vZGUuZGF0YSk7IC8vIEB0b2RvIGZpeCBob3JyaWQgbWVhbnMgdG8gcGFyc2UgSlNPTgorCisgICAgICAgICAgICAgICAgICAgIHZhciBsZWFmX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdyYXBoX2RhdGEgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdCisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYyBpbiBzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJkcyA9IFtdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyBpbiBzdGF0ZVtjXS5zaGFyZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZXMgPSBbXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHN0YXRlW2NdLnNoYXJkc1tzXS5yZXBsaWNhcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFmX2NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsaWNhID0gc3RhdGVbY10uc2hhcmRzW3NdLnJlcGxpY2FzW25dCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVyaSA9IHJlcGxpY2EuYmFzZV91cmw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IHVyaS5tYXRjaCgvXihcdys6KVwvXC8oKFtcd1xkXC4tXSspKDooXGQrKSk/KSguKykkLyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmlfcGFydHMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbDogcGFydHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0OiBwYXJ0c1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBwYXJ0c1szXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KHBhcnRzWzVdIHx8IDgwLCAxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZTogcGFydHNbNl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaGVscGVyRGF0YS5wcm90b2NvbC5wdXNoKHVyaV9wYXJ0cy5wcm90b2NvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5oZWxwZXJEYXRhLmhvc3QucHVzaCh1cmlfcGFydHMuaG9zdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5oZWxwZXJEYXRhLmhvc3RuYW1lLnB1c2godXJpX3BhcnRzLmhvc3RuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmhlbHBlckRhdGEucG9ydC5wdXNoKHVyaV9wYXJ0cy5wb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmhlbHBlckRhdGEucGF0aG5hbWUucHVzaCh1cmlfcGFydHMucGF0aG5hbWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSByZXBsaWNhLnN0YXRlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGl2ZV9ub2Rlc1tyZXBsaWNhLm5vZGVfbmFtZV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdnb25lJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdub2RlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRlcjogJ3RydWUnID09PSByZXBsaWNhLmxlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmk6IHVyaV9wYXJ0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZCA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NoYXJkJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogbm9kZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJkcy5wdXNoKHNoYXJkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2xsZWN0aW9uJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IHNoYXJkcworICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoX2RhdGEuY2hpbGRyZW4ucHVzaChjb2xsZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICRzY29wZS5oZWxwZXJEYXRhLnByb3RvY29sID0gJC51bmlxdWUoJHNjb3BlLmhlbHBlckRhdGEucHJvdG9jb2wpOworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaGVscGVyRGF0YS5ob3N0ID0gJC51bmlxdWUoJHNjb3BlLmhlbHBlckRhdGEuaG9zdCk7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5oZWxwZXJEYXRhLmhvc3RuYW1lID0gJC51bmlxdWUoJHNjb3BlLmhlbHBlckRhdGEuaG9zdG5hbWUpOworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaGVscGVyRGF0YS5wb3J0ID0gJC51bmlxdWUoJHNjb3BlLmhlbHBlckRhdGEucG9ydCk7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5oZWxwZXJEYXRhLnBhdGhuYW1lID0gJC51bmlxdWUoJHNjb3BlLmhlbHBlckRhdGEucGF0aG5hbWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghaXNSYWRpYWwgJiYgZGF0YS56bm9kZSAmJiBkYXRhLnpub2RlLnBhZ2luZykgeworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dQYWdpbmcgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyciA9IGRhdGEuem5vZGUucGFnaW5nLnNwbGl0KCd8Jyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyci5sZW5ndGggPCAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dQYWdpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnN0YXJ0ID0gTWF0aC5tYXgocGFyc2VJbnQocGFyclswXSksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcmV2RW5hYmxlZCA9ICgkc2NvcGUuc3RhcnQgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucm93cyA9IHBhcnNlSW50KHBhcnJbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS50b3RhbCA9IHBhcnNlSW50KHBhcnJbMl0pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5yb3dzID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zaG93UGFnaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbHRlclR5cGUgPSBwYXJyLmxlbmd0aCA+IDMgPyBwYXJyWzNdIDogJyc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlclR5cGUgPT0gJycgfHwgZmlsdGVyVHlwZSA9PSAnbm9uZScpIGZpbHRlclR5cGUgPSAnc3RhdHVzJzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArJCgnI2Nsb3VkR3JhcGhQYWdpbmdGaWx0ZXJUeXBlJykudmFsKGZpbHRlclR5cGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSBwYXJyLmxlbmd0aCA+IDQgPyBwYXJyWzRdIDogJyc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYWdlID0gTWF0aC5mbG9vcigkc2NvcGUuc3RhcnQgLyAkc2NvcGUucm93cykgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFnZXMgPSBNYXRoLmNlaWwoJHNjb3BlLnRvdGFsIC8gJHNjb3BlLnJvd3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUubGFzdCA9IE1hdGgubWluKCRzY29wZS5zdGFydCArICRzY29wZS5yb3dzLCAkc2NvcGUudG90YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUubmV4dEVuYWJsZWQgPSAoJHNjb3BlLmxhc3QgPCAkc2NvcGUudG90YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zaG93UGFnaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdyYXBoRGF0YSA9IGdyYXBoX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5sZWFmQ291bnQgPSBsZWFmX2NvdW50OworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaXNSYWRpYWwgPSBpc1JhZGlhbDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgfTsKKworICAgICRzY29wZS5pbml0R3JhcGgoKTsKK307CisKK3NvbHJBZG1pbkFwcC5kaXJlY3RpdmUoJ2dyYXBoJywgZnVuY3Rpb24oQ29uc3RhbnRzKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgcmVzdHJpY3Q6ICdFQScsCisgICAgICAgIHNjb3BlOiB7CisgICAgICAgICAgICBkYXRhOiAiPSIsCisgICAgICAgICAgICBsZWFmQ291bnQ6ICI9IiwKKyAgICAgICAgICAgIGhlbHBlckRhdGE6ICI9IiwKKyAgICAgICAgICAgIGlzUmFkaWFsOiAiPSIKKyAgICAgICAgfSwKKyAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycykgeworICAgICAgICAgICAgdmFyIGhlbHBlcl9wYXRoX2NsYXNzID0gZnVuY3Rpb24gKHApIHsKKyAgICAgICAgICAgICAgICB2YXIgY2xhc3NlcyA9IFsnbGluayddOworICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnbHZsLScgKyBwLnRhcmdldC5kZXB0aCk7CisKKyAgICAgICAgICAgICAgICBpZiAocC50YXJnZXQuZGF0YSAmJiBwLnRhcmdldC5kYXRhLmxlYWRlcikgeworICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2xlYWRlcicpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwLnRhcmdldC5kYXRhICYmIHAudGFyZ2V0LmRhdGEuc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKHAudGFyZ2V0LmRhdGEuc3RhdGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHZhciBoZWxwZXJfbm9kZV9jbGFzcyA9IGZ1bmN0aW9uIChkKSB7CisgICAgICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSBbJ25vZGUnXTsKKyAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2x2bC0nICsgZC5kZXB0aCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZC5kYXRhICYmIGQuZGF0YS5sZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdsZWFkZXInKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZC5kYXRhICYmIGQuZGF0YS5zdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goZC5kYXRhLnN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB2YXIgaGVscGVyX25vZGVfdGV4dCA9IGZ1bmN0aW9uIChkKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkLmRhdGEgfHwgIWQuZGF0YS51cmkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQubmFtZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGQuZGF0YS51cmkuaG9zdG5hbWU7CisKKyAgICAgICAgICAgICAgICBpZiAoMSAhPT0gc2NvcGUuaGVscGVyRGF0YS5wcm90b2NvbC5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGQuZGF0YS51cmkucHJvdG9jb2wgKyAnLy8nICsgbmFtZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoMSAhPT0gc2NvcGUuaGVscGVyRGF0YS5wb3J0Lmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lICs9ICc6JyArIGQuZGF0YS51cmkucG9ydDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoMSAhPT0gc2NvcGUuaGVscGVyRGF0YS5wYXRobmFtZS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSArPSBkLmRhdGEudXJpLnBhdGhuYW1lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc2NvcGUuJHdhdGNoKCJkYXRhIiwgZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7CisgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5pc1JhZGlhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmFkaWFsR3JhcGgoZWxlbWVudCwgc2NvcGUuZGF0YSwgc2NvcGUubGVhZkNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRHcmFwaChlbGVtZW50LCBzY29wZS5kYXRhLCBzY29wZS5sZWFmQ291bnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKworICAgICAgICAgICAgZnVuY3Rpb24gc2V0Tm9kZU5hdmlnYXRpb25CZWhhdmlvcihub2RlLCB2aWV3KXsKKyAgICAgICAgICAgICAgICBub2RlCisgICAgICAgICAgICAgICAgLmF0dHIoJ2RhdGEtaHJlZicsIGZ1bmN0aW9uIChkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkLnR5cGUgPT0gIm5vZGUiKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXROb2RlVXJsKGQsIHZpZXcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5vbignY2xpY2snLCBmdW5jdGlvbihkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkLmRhdGEudHlwZSA9PSAibm9kZSIpeworICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IGdldE5vZGVVcmwoZCwgdmlldyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnVuY3Rpb24gZ2V0Tm9kZVVybChkLCB2aWV3KXsKKyAgICAgICAgICAgICAgICB2YXIgdXJsID0gZC5uYW1lICsgQ29uc3RhbnRzLlJPT1RfVVJMICsgIiMvfmNsb3VkIjsKKyAgICAgICAgICAgICAgICBpZiAodmlldyAhPSB1bmRlZmluZWQpeworICAgICAgICAgICAgICAgICAgICB1cmwgKz0gIj92aWV3PSIgKyB2aWV3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdXJsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZmxhdEdyYXBoID0gZnVuY3Rpb24oZWxlbWVudCwgZ3JhcGhEYXRhLCBsZWFmQ291bnQpIHsKKyAgICAgICAgICAgICAgICB2YXIgdyA9IGVsZW1lbnQud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgaCA9IGxlYWZDb3VudCAqIDIwOworCisgICAgICAgICAgICAgICAgdmFyIHRyZWUgPSBkMy5sYXlvdXQudHJlZSgpLnNpemUoW2gsIHcgLSA0MDBdKTsKKworICAgICAgICAgICAgICAgIHZhciBkaWFnb25hbCA9IGQzLnN2Zy5kaWFnb25hbCgpLnByb2plY3Rpb24oZnVuY3Rpb24gKGQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtkLnksIGQueF07CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBkMy5zZWxlY3QoJyNjYW52YXMnLCBlbGVtZW50KS5odG1sKCcnKTsKKyAgICAgICAgICAgICAgICB2YXIgdmlzID0gZDMuc2VsZWN0KCcjY2FudmFzJywgZWxlbWVudCkuYXBwZW5kKCdzdmcnKQorICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KQorICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaCkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnZycpCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDEwMCwgMCknKTsKKworICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IHRyZWUubm9kZXMoZ3JhcGhEYXRhKTsKKworICAgICAgICAgICAgICAgIHZhciBsaW5rID0gdmlzLnNlbGVjdEFsbCgncGF0aC5saW5rJykKKyAgICAgICAgICAgICAgICAgICAgLmRhdGEodHJlZS5saW5rcyhub2RlcykpCisgICAgICAgICAgICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgncGF0aCcpCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGhlbHBlcl9wYXRoX2NsYXNzKQorICAgICAgICAgICAgICAgICAgICAuYXR0cignZCcsIGRpYWdvbmFsKTsKKworICAgICAgICAgICAgICAgIHZhciBub2RlID0gdmlzLnNlbGVjdEFsbCgnZy5ub2RlJykKKyAgICAgICAgICAgICAgICAgICAgLmRhdGEobm9kZXMpCisgICAgICAgICAgICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgnZycpCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGhlbHBlcl9ub2RlX2NsYXNzKQorICAgICAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBkLnkgKyAnLCcgKyBkLnggKyAnKSc7CisgICAgICAgICAgICAgICAgICAgIH0pCisKKyAgICAgICAgICAgICAgICBub2RlLmFwcGVuZCgnY2lyY2xlJykKKyAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3InLCA0LjUpOworCisgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmQoJ3RleHQnKQorICAgICAgICAgICAgICAgICAgICAuYXR0cignZHgnLCBmdW5jdGlvbiAoZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IGQuZGVwdGggPyAtOCA6IDg7CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdkeScsIGZ1bmN0aW9uIChkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNTsKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgZnVuY3Rpb24gKGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09PSBkLmRlcHRoID8gJ2VuZCcgOiAnc3RhcnQnOworICAgICAgICAgICAgICAgICAgICB9KSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC50ZXh0KGhlbHBlcl9ub2RlX3RleHQpOworCisgICAgICAgICAgICAgICAgc2V0Tm9kZU5hdmlnYXRpb25CZWhhdmlvcihub2RlKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHZhciByYWRpYWxHcmFwaCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGdyYXBoRGF0YSwgbGVhZkNvdW50KSB7CisgICAgICAgICAgICAgICAgdmFyIG1heF92YWwgPSBNYXRoLm1pbihlbGVtZW50LndpZHRoKCksICQoJ2JvZHknKS5oZWlnaHQoKSkKKyAgICAgICAgICAgICAgICB2YXIgciA9IG1heF92YWwgLyAyOworCisgICAgICAgICAgICAgICAgdmFyIGNsdXN0ZXIgPSBkMy5sYXlvdXQuY2x1c3RlcigpCisgICAgICAgICAgICAgICAgICAgIC5zaXplKFszNjAsIHIgLSAxNjBdKTsKKworICAgICAgICAgICAgICAgIHZhciBkaWFnb25hbCA9IGQzLnN2Zy5kaWFnb25hbC5yYWRpYWwoKQorICAgICAgICAgICAgICAgICAgICAucHJvamVjdGlvbihmdW5jdGlvbiAoZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtkLnksIGQueCAvIDE4MCAqIE1hdGguUEldOworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGQzLnNlbGVjdCgnI2NhbnZhcycsIGVsZW1lbnQpLmh0bWwoJycpOworICAgICAgICAgICAgICAgIHZhciB2aXMgPSBkMy5zZWxlY3QoJyNjYW52YXMnKS5hcHBlbmQoJ3N2ZycpCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHIgKiAyKQorICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgciAqIDIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQorICAgICAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgciArICcsJyArIHIgKyAnKScpOworCisgICAgICAgICAgICAgICAgdmFyIG5vZGVzID0gY2x1c3Rlci5ub2RlcyhncmFwaERhdGEpOworCisgICAgICAgICAgICAgICAgdmFyIGxpbmsgPSB2aXMuc2VsZWN0QWxsKCdwYXRoLmxpbmsnKQorICAgICAgICAgICAgICAgICAgICAuZGF0YShjbHVzdGVyLmxpbmtzKG5vZGVzKSkKKyAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCdwYXRoJykKKyAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgaGVscGVyX3BhdGhfY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdkJywgZGlhZ29uYWwpOworCisgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB2aXMuc2VsZWN0QWxsKCdnLm5vZGUnKQorICAgICAgICAgICAgICAgICAgICAuZGF0YShub2RlcykKKyAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCdnJykKKyAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgaGVscGVyX25vZGVfY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdyb3RhdGUoJyArIChkLnggLSA5MCkgKyAnKXRyYW5zbGF0ZSgnICsgZC55ICsgJyknOworICAgICAgICAgICAgICAgICAgICB9KQorCisgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmQoJ2NpcmNsZScpCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgNC41KTsKKworICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kKCd0ZXh0JykKKyAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2R4JywgZnVuY3Rpb24gKGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnggPCAxODAgPyA4IDogLTg7CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdkeScsICcuMzFlbScpCisgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsIGZ1bmN0aW9uIChkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC54IDwgMTgwID8gJ3N0YXJ0JyA6ICdlbmQnOworICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnggPCAxODAgPyBudWxsIDogJ3JvdGF0ZSgxODApJzsKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgLnRleHQoaGVscGVyX25vZGVfdGV4dCk7CisKKyAgICAgICAgICAgICAgICBzZXROb2RlTmF2aWdhdGlvbkJlaGF2aW9yKG5vZGUsICJyZ3JhcGgiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07Cit9KQorCisvKgorCis9PT09PT09PT09PT09PT09PT09PT09PT0KK3ZhciBpbml0X2RlYnVnID0gZnVuY3Rpb24oIGNsb3VkX2VsZW1lbnQgKQoreworICB2YXIgZGVidWdfZWxlbWVudCA9ICQoICcjZGVidWcnLCBjbG91ZF9lbGVtZW50ICk7CisgIHZhciBkZWJ1Z19idXR0b24gPSAkKCAnI21lbnUgI2Nsb3VkIC5kdW1wIGEnICk7CisKKyAgdmFyIGNsaXBib2FyZF9lbGVtZW50ID0gJCggJy5jbGlwYm9hcmQnLCBkZWJ1Z19lbGVtZW50ICk7CisgIHZhciBjbGlwYm9hcmRfYnV0dG9uID0gJCggJ2EnLCBjbGlwYm9hcmRfZWxlbWVudCApOworCisgICQoICcuY2xpcGJvYXJkJywgZGVidWdfZWxlbWVudCApCisgICAgLmRpZSggJ2NsaWNrJyApCisgICAgLmxpdmUKKyAgICAoCisgICAgICAnY2xpY2snLAorICAgICAgZnVuY3Rpb24oIGV2ZW50ICkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICk7CisKKyAgICAgICAgICAgIHVybCA6IGFwcC5jb25maWcuc29scl9wYXRoICsgJy96b29rZWVwZXI/d3Q9anNvbiZkdW1wPXRydWUnLAorICAgICAgICAgICAgICBaZXJvQ2xpcGJvYXJkLnNldE1vdmllUGF0aCggJ2ltZy9aZXJvQ2xpcGJvYXJkLnN3ZicgKTsKKworICAgICAgICAgICAgICBjbGlwYm9hcmRfY2xpZW50ID0gbmV3IFplcm9DbGlwYm9hcmQuQ2xpZW50KCk7CisKKyAgICAgICAgICAgICAgY2xpcGJvYXJkX2NsaWVudC5hZGRFdmVudExpc3RlbmVyCisgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAnbG9hZCcsCisgICAgICAgICAgICAgICAgZnVuY3Rpb24oIGNsaWVudCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICBjbGlwYm9hcmRfY2xpZW50LmFkZEV2ZW50TGlzdGVuZXIKKyAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICdjb21wbGV0ZScsCisgICAgICAgICAgICAgICAgZnVuY3Rpb24oIGNsaWVudCwgdGV4dCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkX2VsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCAnY29waWVkJyApOworCisgICAgICAgICAgICAgICAgICBjbGlwYm9hcmRfYnV0dG9uCisgICAgICAgICAgICAgICAgICAgIC5kYXRhKCAndGV4dCcsIGNsaXBib2FyZF9idXR0b24udGV4dCgpICkKKyAgICAgICAgICAgICAgICAgICAgLnRleHQoIGNsaXBib2FyZF9idXR0b24uZGF0YSggJ2NvcGllZCcgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBzdWNjZXNzIDogZnVuY3Rpb24oIHJlc3BvbnNlLCB0ZXh0X3N0YXR1cywgeGhyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2xpcGJvYXJkX2NsaWVudC5nbHVlCisgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICBjbGlwYm9hcmRfZWxlbWVudC5nZXQoMCksCisgICAgICAgICAgICAgICAgY2xpcGJvYXJkX2J1dHRvbi5nZXQoMCkKKyAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICBjbGlwYm9hcmRfY2xpZW50LnNldFRleHQoIHJlc3BvbnNlLnJlcGxhY2UoIC9cXC9nLCAnXFxcXCcgKSApOworCisgICAgICAgICAgICAgICQoICcuZGVidWcnLCBkZWJ1Z19lbGVtZW50ICkKKyAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoICdsb2FkZXInICkKKyAgICAgICAgICAgICAgICAudGV4dCggcmVzcG9uc2UgKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBlcnJvciA6IGZ1bmN0aW9uKCB4aHIsIHRleHRfc3RhdHVzLCBlcnJvcl90aHJvd24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGNvbXBsZXRlIDogZnVuY3Rpb24oIHhociwgdGV4dF9zdGF0dXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgIH0KKyAgICApCisgICAgLmRpZSggJ2hpZGUnICkKKyAgICAubGl2ZQorICAgICgKKyAgICAgICdoaWRlJywKKyAgICAgIGZ1bmN0aW9uKCBldmVudCApCisgICAgICB7CisgICAgICAgICQoICcuZGVidWcnLCBkZWJ1Z19lbGVtZW50ICkKKyAgICAgICAgICAuZW1wdHkoKTsKKworICAgICAgICBjbGlwYm9hcmRfZWxlbWVudAorICAgICAgICAgIC5yZW1vdmVDbGFzcyggJ2NvcGllZCcgKTsKKworICAgICAgICBjbGlwYm9hcmRfYnV0dG9uCisgICAgICAgICAgLmRhdGEoICdjb3BpZWQnLCBjbGlwYm9hcmRfYnV0dG9uLnRleHQoKSApCisgICAgICAgICAgLnRleHQoIGNsaXBib2FyZF9idXR0b24uZGF0YSggJ3RleHQnICkgKTsKKworICAgICAgICBjbGlwYm9hcmRfY2xpZW50LmRlc3Ryb3koKTsKKworICAgICAgICBkZWJ1Z19lbGVtZW50LmhpZGUoKTsKKyAgICAgIH0KKyAgICApOworfTsKKworKi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2NvbGxlY3Rpb24tb3ZlcnZpZXcuanMgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9jb2xsZWN0aW9uLW92ZXJ2aWV3LmpzCmluZGV4IGE5ODQ1NmEuLmQxODM0YjIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2NvbGxlY3Rpb24tb3ZlcnZpZXcuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvY29sbGVjdGlvbi1vdmVydmlldy5qcwpAQCAtMSwzOSArMSwzOSBAQAotLyoNCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLQ0KLXNvbHJBZG1pbkFwcC5jb250cm9sbGVyKCdDb2xsZWN0aW9uT3ZlcnZpZXdDb250cm9sbGVyJywNCi1mdW5jdGlvbigkc2NvcGUsICRyb3V0ZVBhcmFtcywgQ29sbGVjdGlvbnMsIENvbnN0YW50cykgew0KLSAgJHNjb3BlLnJlc2V0TWVudSgiY29sbGVjdGlvbi1vdmVydmlldyIsIENvbnN0YW50cy5JU19DT0xMRUNUSU9OX1BBR0UpOw0KLQ0KLSAgJHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHsNCi0gICAgQ29sbGVjdGlvbnMuc3RhdHVzKHt9LCBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgJHNjb3BlLnNlbGVjdGVkQ29sbGVjdGlvbiA9IGRhdGEuY2x1c3Rlci5jb2xsZWN0aW9uc1skcm91dGVQYXJhbXMuY29yZV07DQotICAgICAgJHNjb3BlLnNlbGVjdGVkQ29sbGVjdGlvbi5uYW1lID0gJHJvdXRlUGFyYW1zLmNvcmU7DQotICAgICAgJHNjb3BlLnJvb3RVcmwgPSBDb25zdGFudHMuUk9PVF9VUkw7DQotICAgIH0pOw0KLSAgfTsNCi0NCi0gICRzY29wZS5zaG93UmVwbGljYSA9IGZ1bmN0aW9uKHJlcGxpY2EpIHsNCi0gICAgcmVwbGljYS5zaG93ID0gIXJlcGxpY2Euc2hvdzsNCi0gIH0NCi0NCi0gICRzY29wZS5oaWRlU2hhcmQgPSBmdW5jdGlvbihzaGFyZCkgew0KLSAgICBzaGFyZC5oaWRlID0gIXNoYXJkLmhpZGU7DQotICB9DQotDQotICAkc2NvcGUucmVmcmVzaCgpOw0KLX0pOw0KKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ0NvbGxlY3Rpb25PdmVydmlld0NvbnRyb2xsZXInLAorZnVuY3Rpb24oJHNjb3BlLCAkcm91dGVQYXJhbXMsIENvbGxlY3Rpb25zLCBDb25zdGFudHMpIHsKKyAgJHNjb3BlLnJlc2V0TWVudSgiY29sbGVjdGlvbi1vdmVydmlldyIsIENvbnN0YW50cy5JU19DT0xMRUNUSU9OX1BBR0UpOworCisgICRzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7CisgICAgQ29sbGVjdGlvbnMuc3RhdHVzKHt9LCBmdW5jdGlvbihkYXRhKSB7CisgICAgICAkc2NvcGUuc2VsZWN0ZWRDb2xsZWN0aW9uID0gZGF0YS5jbHVzdGVyLmNvbGxlY3Rpb25zWyRyb3V0ZVBhcmFtcy5jb3JlXTsKKyAgICAgICRzY29wZS5zZWxlY3RlZENvbGxlY3Rpb24ubmFtZSA9ICRyb3V0ZVBhcmFtcy5jb3JlOworICAgICAgJHNjb3BlLnJvb3RVcmwgPSBDb25zdGFudHMuUk9PVF9VUkw7CisgICAgfSk7CisgIH07CisKKyAgJHNjb3BlLnNob3dSZXBsaWNhID0gZnVuY3Rpb24ocmVwbGljYSkgeworICAgIHJlcGxpY2Euc2hvdyA9ICFyZXBsaWNhLnNob3c7CisgIH0KKworICAkc2NvcGUuaGlkZVNoYXJkID0gZnVuY3Rpb24oc2hhcmQpIHsKKyAgICBzaGFyZC5oaWRlID0gIXNoYXJkLmhpZGU7CisgIH0KKworICAkc2NvcGUucmVmcmVzaCgpOworfSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9jb2xsZWN0aW9ucy5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2NvbGxlY3Rpb25zLmpzCmluZGV4IDAyNjM3NmQuLjJiZDZhYjYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2NvbGxlY3Rpb25zLmpzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2NvbGxlY3Rpb25zLmpzCkBAIC0xLDI2MCArMSwyNjAgQEAKLS8qDQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi0NCi0vLyBAdG9kbyB0ZXN0IG9wdGltaXplIChkZWxldGUgc3R1ZmYsIHdhdGNoIGJ1dHRvbiBhcHBlYXIsIHRlc3QgYnV0dG9uL2Zvcm0pDQotc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ0NvbGxlY3Rpb25zQ29udHJvbGxlcicsDQotICAgIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24sICR0aW1lb3V0LCBDb2xsZWN0aW9ucywgWm9va2VlcGVyLCBDb25zdGFudHMpew0KLSAgICAgICRzY29wZS5yZXNldE1lbnUoImNvbGxlY3Rpb25zIiwgQ29uc3RhbnRzLklTX1JPT1RfUEFHRSk7DQotDQotICAgICAgJHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHsNCi0NCi0gICAgICAgICAgJHNjb3BlLnJvb3RVcmwgPSBDb25zdGFudHMuUk9PVF9VUkwgKyAiIy9+Y29sbGVjdGlvbnMvIiArICRyb3V0ZVBhcmFtcy5jb2xsZWN0aW9uOw0KLQ0KLSAgICAgICAgICBDb2xsZWN0aW9ucy5zdGF0dXMoZnVuY3Rpb24gKGRhdGEpIHsNCi0gICAgICAgICAgICAgICRzY29wZS5jb2xsZWN0aW9ucyA9IFtdOw0KLSAgICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBkYXRhLmNsdXN0ZXIuY29sbGVjdGlvbnMpIHsNCi0gICAgICAgICAgICAgICAgICB2YXIgY29sbGVjdGlvbiA9IGRhdGEuY2x1c3Rlci5jb2xsZWN0aW9uc1tuYW1lXTsNCi0gICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLm5hbWUgPSBuYW1lOw0KLSAgICAgICAgICAgICAgICAgIHZhciBzaGFyZHMgPSBjb2xsZWN0aW9uLnNoYXJkczsNCi0gICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnNoYXJkcyA9IFtdOw0KLSAgICAgICAgICAgICAgICAgIGZvciAodmFyIHNoYXJkTmFtZSBpbiBzaGFyZHMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJkID0gc2hhcmRzW3NoYXJkTmFtZV07DQotICAgICAgICAgICAgICAgICAgICAgIHNoYXJkLm5hbWUgPSBzaGFyZE5hbWU7DQotICAgICAgICAgICAgICAgICAgICAgIHNoYXJkLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uLm5hbWU7DQotICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsaWNhcyA9IHNoYXJkLnJlcGxpY2FzOw0KLSAgICAgICAgICAgICAgICAgICAgICBzaGFyZC5yZXBsaWNhcyA9IFtdOw0KLSAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByZXBsaWNhTmFtZSBpbiByZXBsaWNhcykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxpY2EgPSByZXBsaWNhc1tyZXBsaWNhTmFtZV07DQotICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsaWNhLm5hbWUgPSByZXBsaWNhTmFtZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxpY2EuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb24ubmFtZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxpY2Euc2hhcmQgPSBzaGFyZC5uYW1lOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmQucmVwbGljYXMucHVzaChyZXBsaWNhKTsNCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnNoYXJkcy5wdXNoKHNoYXJkKTsNCi0gICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgJHNjb3BlLmNvbGxlY3Rpb25zLnB1c2goY29sbGVjdGlvbik7DQotICAgICAgICAgICAgICAgICAgaWYgKCRyb3V0ZVBhcmFtcy5jb2xsZWN0aW9uID09IG5hbWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOw0KLSAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIGlmICgkcm91dGVQYXJhbXMuY29sbGVjdGlvbiAmJiAhJHNjb3BlLmNvbGxlY3Rpb24pIHsNCi0gICAgICAgICAgICAgICAgICBhbGVydCgiTm8gY29sbGVjdGlvbiBjYWxsZWQgIiArICRyb3V0ZVBhcmFtcy5jb2xsZWN0aW9uKQ0KLSAgICAgICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCIvfmNvbGxlY3Rpb25zIik7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAkc2NvcGUubGl2ZU5vZGVzID0gZGF0YS5jbHVzdGVyLmxpdmVOb2RlczsNCi0gICAgICAgICAgfSk7DQotICAgICAgICAgIFpvb2tlZXBlci5jb25maWdzKGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICAgICAgICRzY29wZS5jb25maWdzID0gW107DQotICAgICAgICAgICAgICB2YXIgaXRlbXMgPSBkYXRhLnRyZWVbMF0uY2hpbGRyZW47DQotICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGl0ZW1zKSB7DQotICAgICAgICAgICAgICAgICAgJHNjb3BlLmNvbmZpZ3MucHVzaCh7bmFtZTogaXRlbXNbaV0uZGF0YS50aXRsZX0pOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9KTsNCi0gICAgICB9Ow0KLQ0KLSAgICAgICRzY29wZS5oaWRlQWxsID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICRzY29wZS5zaG93UmVuYW1lID0gZmFsc2U7DQotICAgICAgICAgICRzY29wZS5zaG93QWRkID0gZmFsc2U7DQotICAgICAgICAgICRzY29wZS5zaG93RGVsZXRlID0gZmFsc2U7DQotICAgICAgICAgICRzY29wZS5zaG93U3dhcCA9IGZhbHNlOw0KLSAgICAgICAgICAkc2NvcGUuc2hvd0NyZWF0ZUFsaWFzID0gZmFsc2U7DQotICAgICAgICAgICRzY29wZS5zaG93RGVsZXRlQWxpYXMgPSBmYWxzZTsNCi0gICAgICB9Ow0KLQ0KLSAgICAgICRzY29wZS5zaG93QWRkQ29sbGVjdGlvbiA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgJHNjb3BlLmhpZGVBbGwoKTsNCi0gICAgICAgICRzY29wZS5zaG93QWRkID0gdHJ1ZTsNCi0gICAgICAgICRzY29wZS5uZXdDb2xsZWN0aW9uID0gew0KLSAgICAgICAgICBuYW1lOiAiIiwNCi0gICAgICAgICAgcm91dGVyTmFtZTogImNvbXBvc2l0ZUlkIiwNCi0gICAgICAgICAgbnVtU2hhcmRzOiAxLA0KLSAgICAgICAgICBjb25maWdOYW1lOiAiIiwNCi0gICAgICAgICAgcmVwbGljYXRpb25GYWN0b3I6IDEsDQotICAgICAgICAgIG1heFNoYXJkc1Blck5vZGU6IDENCi0gICAgICAgIH07DQotICAgICAgfTsNCi0NCi0gICAgICAkc2NvcGUudG9nZ2xlQ3JlYXRlQWxpYXMgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICRzY29wZS5oaWRlQWxsKCk7DQotICAgICAgICAkc2NvcGUuc2hvd0NyZWF0ZUFsaWFzID0gdHJ1ZTsNCi0gICAgICB9DQotDQotICAgICAgJHNjb3BlLnRvZ2dsZURlbGV0ZUFsaWFzID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOw0KLSAgICAgICAgJHNjb3BlLnNob3dEZWxldGVBbGlhcyA9IHRydWU7DQotICAgICAgICBab29rZWVwZXIuYWxpYXNlcyh7fSwgZnVuY3Rpb24oZGF0YSl7DQotICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhLmFsaWFzZXMpLmxlbmd0aCA9PSAwKSB7DQotICAgICAgICAgICAgZGVsZXRlICRzY29wZS5hbGlhc2VzOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICRzY29wZS5hbGlhc2VzID0gZGF0YS5hbGlhc2VzOw0KLSAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICB9DQotDQotICAgICAgJHNjb3BlLmNhbmNlbENyZWF0ZUFsaWFzID0gJHNjb3BlLmNhbmNlbERlbGV0ZUFsaWFzID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOw0KLSAgICAgIH0NCi0NCi0gICAgICAkc2NvcGUuY3JlYXRlQWxpYXMgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgIHZhciBjb2xsZWN0aW9ucyA9IFtdOw0KLSAgICAgICAgZm9yICh2YXIgaSBpbiAkc2NvcGUuYWxpYXNDb2xsZWN0aW9ucykgew0KLSAgICAgICAgICBjb2xsZWN0aW9ucy5wdXNoKCRzY29wZS5hbGlhc0NvbGxlY3Rpb25zW2ldLm5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ29sbGVjdGlvbnMuY3JlYXRlQWxpYXMoe25hbWU6ICRzY29wZS5hbGlhc1RvQ3JlYXRlLCBjb2xsZWN0aW9uczogY29sbGVjdGlvbnMuam9pbigiLCIpfSwgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOw0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLSAgICAgICRzY29wZS5kZWxldGVBbGlhcyA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgQ29sbGVjdGlvbnMuZGVsZXRlQWxpYXMoe25hbWU6ICRzY29wZS5hbGlhc1RvRGVsZXRlfSwgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOw0KLSAgICAgICAgfSk7DQotDQotICAgICAgfTsNCi0gICAgICAkc2NvcGUuYWRkQ29sbGVjdGlvbiA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgaWYgKCEkc2NvcGUubmV3Q29sbGVjdGlvbi5uYW1lKSB7DQotICAgICAgICAgICRzY29wZS5hZGRNZXNzYWdlID0gIlBsZWFzZSBwcm92aWRlIGEgY29yZSBuYW1lIjsNCi0gICAgICAgIH0gZWxzZSBpZiAoZmFsc2UpIHsgLy9AdG9kbyBkZXRlY3Qgd2hldGhlciBjb3JlIGV4aXN0cw0KLSAgICAgICAgICAkc2NvcGUuQWRkTWVzc2FnZSA9ICJBIGNvcmUgd2l0aCB0aGF0IG5hbWUgYWxyZWFkeSBleGlzdHMiOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB2YXIgY29sbCA9ICRzY29wZS5uZXdDb2xsZWN0aW9uOw0KLSAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7DQotICAgICAgICAgICAgICAgIG5hbWU6IGNvbGwubmFtZSwNCi0gICAgICAgICAgICAgICAgInJvdXRlci5uYW1lIjogY29sbC5yb3V0ZXJOYW1lLA0KLSAgICAgICAgICAgICAgICBudW1TaGFyZHM6IGNvbGwubnVtU2hhcmRzLA0KLSAgICAgICAgICAgICAgICAiY29sbGVjdGlvbi5jb25maWdOYW1lIjogY29sbC5jb25maWdOYW1lLA0KLSAgICAgICAgICAgICAgICByZXBsaWNhdGlvbkZhY3RvcjogY29sbC5yZXBsaWNhdGlvbkZhY3RvciwNCi0gICAgICAgICAgICAgICAgbWF4U2hhcmRzUGVyTm9kZTogY29sbC5tYXhTaGFyZHNQZXJOb2RlDQotICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICBpZiAoY29sbC5zaGFyZHMpIHBhcmFtcy5zaGFyZHMgPSBjb2xsLnNoYXJkczsNCi0gICAgICAgICAgICBpZiAoY29sbC5yb3V0ZXJGaWVsZCkgcGFyYW1zLnJvdXRlckZpZWxkID0gY29sbC5yb3V0ZXJGaWVsZDsNCi0gICAgICAgICAgICBpZiAoY29sbC5yb3V0ZXJOYW1lKSBwYXJhbXMucm91dGVyTmFtZSA9IGNvbGwucm91dGVyTmFtZTsNCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5hZGQocGFyYW1zLCBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAgICAgICAkc2NvcGUuY2FuY2VsQWRkQ29sbGVjdGlvbigpOw0KLSAgICAgICAgICAgICAgJHNjb3BlLnJlc2V0TWVudSgiY29sbGVjdGlvbnMiLCBDb25zdGFudHMuSVNfUk9PVF9QQUdFKTsNCi0gICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCIvfmNvbGxlY3Rpb25zLyIgKyAkc2NvcGUubmV3Q29sbGVjdGlvbi5uYW1lKTsNCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0gICAgICB9Ow0KLQ0KLSAgICAgICRzY29wZS5jYW5jZWxBZGRDb2xsZWN0aW9uID0gZnVuY3Rpb24oKSB7DQotICAgICAgICBkZWxldGUgJHNjb3BlLmFkZE1lc3NhZ2U7DQotICAgICAgICAkc2NvcGUuc2hvd0FkZCA9IGZhbHNlOw0KLSAgICAgIH07DQotDQotICAgICAgJHNjb3BlLnNob3dEZWxldGVDb2xsZWN0aW9uID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICRzY29wZS5oaWRlQWxsKCk7DQotICAgICAgICAgIGlmICgkc2NvcGUuY29sbGVjdGlvbikgew0KLSAgICAgICAgICAgICAgJHNjb3BlLnNob3dEZWxldGUgPSB0cnVlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgYWxlcnQoIk5vIGNvbGxlY3Rpb24gc2VsZWN0ZWQuIik7DQotICAgICAgICAgIH0NCi0gICAgICB9Ow0KLQ0KLSAgICAgICRzY29wZS5kZWxldGVDb2xsZWN0aW9uID0gZnVuY3Rpb24oKSB7DQotICAgICAgICBpZiAoJHNjb3BlLmNvbGxlY3Rpb24ubmFtZSA9PSAkc2NvcGUuY29sbGVjdGlvbkRlbGV0ZUNvbmZpcm0pIHsNCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5kZWxldGUoe25hbWU6ICRzY29wZS5jb2xsZWN0aW9uLm5hbWV9LCBmdW5jdGlvbiAoZGF0YSkgew0KLSAgICAgICAgICAgICAgICAkbG9jYXRpb24ucGF0aCgiL35jb2xsZWN0aW9ucyIpOw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAkc2NvcGUuZGVsZXRlTWVzc2FnZSA9ICJDb2xsZWN0aW9uIG5hbWVzIGRvIG5vdCBtYXRjaC4iOw0KLSAgICAgICAgfQ0KLSAgICAgIH07DQotDQotICAgICAgJHNjb3BlLnJlbG9hZENvbGxlY3Rpb24gPSBmdW5jdGlvbigpIHsNCi0gICAgICAgIGlmICghJHNjb3BlLmNvbGxlY3Rpb24pIHsNCi0gICAgICAgICAgICBhbGVydCgiTm8gY29sbGVjdGlvbiBzZWxlY3RlZC4iKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBDb2xsZWN0aW9ucy5yZWxvYWQoe25hbWU6ICRzY29wZS5jb2xsZWN0aW9uLm5hbWV9LA0KLSAgICAgICAgICBmdW5jdGlvbihzdWNjZXNzRGF0YSkgew0KLSAgICAgICAgICAgICRzY29wZS5yZWxvYWRTdWNjZXNzID0gdHJ1ZTsNCi0gICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbigpIHskc2NvcGUucmVsb2FkU3VjY2Vzcz1mYWxzZX0sIDEwMDApOw0KLSAgICAgICAgICB9LA0KLSAgICAgICAgICBmdW5jdGlvbihmYWlsdXJlRGF0YSkgew0KLSAgICAgICAgICAgICRzY29wZS5yZWxvYWRGYWlsdXJlID0gdHJ1ZTsNCi0gICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbigpIHskc2NvcGUucmVsb2FkRmFpbHVyZT1mYWxzZX0sIDEwMDApOw0KLSAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCIvfmNvbGxlY3Rpb25zIik7DQotICAgICAgICAgIH0pOw0KLSAgICAgIH07DQotDQotICAgICAgJHNjb3BlLnRvZ2dsZUFkZFJlcGxpY2EgPSBmdW5jdGlvbihzaGFyZCkgew0KLSAgICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOw0KLSAgICAgICAgICBzaGFyZC5zaG93QWRkID0gIXNoYXJkLnNob3dBZGQ7DQotICAgICAgICAgIGRlbGV0ZSAkc2NvcGUuYWRkUmVwbGljYU1lc3NhZ2U7DQotDQotICAgICAgICAgIFpvb2tlZXBlci5saXZlTm9kZXMoe30sIGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICAgICAkc2NvcGUubm9kZXMgPSBbXTsNCi0gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBkYXRhLnRyZWVbMF0uY2hpbGRyZW47DQotICAgICAgICAgICAgZm9yICh2YXIgY2hpbGQgaW4gY2hpbGRyZW4pIHsNCi0gICAgICAgICAgICAgICRzY29wZS5ub2Rlcy5wdXNoKGNoaWxkcmVuW2NoaWxkXS5kYXRhLnRpdGxlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0pOw0KLSAgICAgIH07DQotDQotICAgICAgJHNjb3BlLnRvZ2dsZVJlbW92ZVJlcGxpY2EgPSBmdW5jdGlvbihyZXBsaWNhKSB7DQotICAgICAgICAgICRzY29wZS5oaWRlQWxsKCk7DQotICAgICAgICAgIHJlcGxpY2Euc2hvd1JlbW92ZSA9ICFyZXBsaWNhLnNob3dSZW1vdmU7DQotICAgICAgfTsNCi0NCi0gICAgICAkc2NvcGUuZGVsZXRlUmVwbGljYSA9IGZ1bmN0aW9uKHJlcGxpY2EpIHsNCi0gICAgICAgIENvbGxlY3Rpb25zLmRlbGV0ZVJlcGxpY2Eoe2NvbGxlY3Rpb246IHJlcGxpY2EuY29sbGVjdGlvbiwgc2hhcmQ6cmVwbGljYS5zaGFyZCwgcmVwbGljYTpyZXBsaWNhLm5hbWV9LCBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAgIHJlcGxpY2EuZGVsZXRlZCA9IHRydWU7DQotICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgICRzY29wZS5yZWZyZXNoKCk7DQotICAgICAgICAgIH0sIDIwMDApOw0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLSAgICAgICRzY29wZS5hZGRSZXBsaWNhID0gZnVuY3Rpb24oc2hhcmQpIHsNCi0gICAgICAgIHZhciBwYXJhbXMgPSB7DQotICAgICAgICAgIGNvbGxlY3Rpb246IHNoYXJkLmNvbGxlY3Rpb24sDQotICAgICAgICAgIHNoYXJkOiBzaGFyZC5uYW1lLA0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHNoYXJkLnJlcGxpY2FOb2RlTmFtZSAmJiBzaGFyZC5yZXBsaWNhTm9kZU5hbWUgIT0gIiIpIHsNCi0gICAgICAgICAgcGFyYW1zLm5vZGUgPSBzaGFyZC5yZXBsaWNhTm9kZU5hbWU7DQotICAgICAgICB9DQotICAgICAgICBDb2xsZWN0aW9ucy5hZGRSZXBsaWNhKHBhcmFtcywgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgICBzaGFyZC5yZXBsaWNhQWRkZWQgPSB0cnVlOw0KLSAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7DQotICAgICAgICAgICAgc2hhcmQucmVwbGljYUFkZGVkID0gZmFsc2U7DQotICAgICAgICAgICAgc2hhcmQuc2hvd0FkZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICQkc2NvcGUucmVmcmVzaCgpOw0KLSAgICAgICAgICB9LCAyMDAwKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIH07DQotDQotICAgICAgJHNjb3BlLnRvZ2dsZVNoYXJkID0gZnVuY3Rpb24oc2hhcmQpIHsNCi0gICAgICAgICAgc2hhcmQuc2hvdyA9ICFzaGFyZC5zaG93Ow0KLSAgICAgIH0NCi0NCi0gICAgICAkc2NvcGUudG9nZ2xlUmVwbGljYSA9IGZ1bmN0aW9uKHJlcGxpY2EpIHsNCi0gICAgICAgICAgcmVwbGljYS5zaG93ID0gIXJlcGxpY2Euc2hvdzsNCi0gICAgICB9DQotDQotICAgICAgJHNjb3BlLnJlZnJlc2goKTsNCi0gICAgfQ0KLSk7DQotDQotdmFyIGZsYXR0ZW4gPSBmdW5jdGlvbihkYXRhKSB7DQotICAgIHZhciBsaXN0ID0gW107DQotICAgIGZvciAodmFyIG5hbWUgaW4gZGF0YSkgew0KLSAgICAgICB2YXIgZW50cnkgPSBkYXRhW25hbWVdOw0KLSAgICAgICAgZW50cnkubmFtZSA9IG5hbWU7DQotICAgICAgICBsaXN0LnB1c2goZW50cnkpOw0KLSAgICB9DQotICAgIHJldHVybiBsaXN0Ow0KLX0NCisvKgorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIEB0b2RvIHRlc3Qgb3B0aW1pemUgKGRlbGV0ZSBzdHVmZiwgd2F0Y2ggYnV0dG9uIGFwcGVhciwgdGVzdCBidXR0b24vZm9ybSkKK3NvbHJBZG1pbkFwcC5jb250cm9sbGVyKCdDb2xsZWN0aW9uc0NvbnRyb2xsZXInLAorICAgIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24sICR0aW1lb3V0LCBDb2xsZWN0aW9ucywgWm9va2VlcGVyLCBDb25zdGFudHMpeworICAgICAgJHNjb3BlLnJlc2V0TWVudSgiY29sbGVjdGlvbnMiLCBDb25zdGFudHMuSVNfUk9PVF9QQUdFKTsKKworICAgICAgJHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHsKKworICAgICAgICAgICRzY29wZS5yb290VXJsID0gQ29uc3RhbnRzLlJPT1RfVVJMICsgIiMvfmNvbGxlY3Rpb25zLyIgKyAkcm91dGVQYXJhbXMuY29sbGVjdGlvbjsKKworICAgICAgICAgIENvbGxlY3Rpb25zLnN0YXR1cyhmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgICAgICAkc2NvcGUuY29sbGVjdGlvbnMgPSBbXTsKKyAgICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBkYXRhLmNsdXN0ZXIuY29sbGVjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uID0gZGF0YS5jbHVzdGVyLmNvbGxlY3Rpb25zW25hbWVdOworICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgICAgICAgIHZhciBzaGFyZHMgPSBjb2xsZWN0aW9uLnNoYXJkczsKKyAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uc2hhcmRzID0gW107CisgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzaGFyZE5hbWUgaW4gc2hhcmRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJkID0gc2hhcmRzW3NoYXJkTmFtZV07CisgICAgICAgICAgICAgICAgICAgICAgc2hhcmQubmFtZSA9IHNoYXJkTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICBzaGFyZC5jb2xsZWN0aW9uID0gY29sbGVjdGlvbi5uYW1lOworICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsaWNhcyA9IHNoYXJkLnJlcGxpY2FzOworICAgICAgICAgICAgICAgICAgICAgIHNoYXJkLnJlcGxpY2FzID0gW107CisgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcmVwbGljYU5hbWUgaW4gcmVwbGljYXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxpY2EgPSByZXBsaWNhc1tyZXBsaWNhTmFtZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxpY2EubmFtZSA9IHJlcGxpY2FOYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsaWNhLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uLm5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxpY2Euc2hhcmQgPSBzaGFyZC5uYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZC5yZXBsaWNhcy5wdXNoKHJlcGxpY2EpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnNoYXJkcy5wdXNoKHNoYXJkKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICRzY29wZS5jb2xsZWN0aW9ucy5wdXNoKGNvbGxlY3Rpb24pOworICAgICAgICAgICAgICAgICAgaWYgKCRyb3V0ZVBhcmFtcy5jb2xsZWN0aW9uID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKCRyb3V0ZVBhcmFtcy5jb2xsZWN0aW9uICYmICEkc2NvcGUuY29sbGVjdGlvbikgeworICAgICAgICAgICAgICAgICAgYWxlcnQoIk5vIGNvbGxlY3Rpb24gY2FsbGVkICIgKyAkcm91dGVQYXJhbXMuY29sbGVjdGlvbikKKyAgICAgICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCIvfmNvbGxlY3Rpb25zIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgJHNjb3BlLmxpdmVOb2RlcyA9IGRhdGEuY2x1c3Rlci5saXZlTm9kZXM7CisgICAgICAgICAgfSk7CisgICAgICAgICAgWm9va2VlcGVyLmNvbmZpZ3MoZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgICAgICAkc2NvcGUuY29uZmlncyA9IFtdOworICAgICAgICAgICAgICB2YXIgaXRlbXMgPSBkYXRhLnRyZWVbMF0uY2hpbGRyZW47CisgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gaXRlbXMpIHsKKyAgICAgICAgICAgICAgICAgICRzY29wZS5jb25maWdzLnB1c2goe25hbWU6IGl0ZW1zW2ldLmRhdGEudGl0bGV9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgfTsKKworICAgICAgJHNjb3BlLmhpZGVBbGwgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAkc2NvcGUuc2hvd1JlbmFtZSA9IGZhbHNlOworICAgICAgICAgICRzY29wZS5zaG93QWRkID0gZmFsc2U7CisgICAgICAgICAgJHNjb3BlLnNob3dEZWxldGUgPSBmYWxzZTsKKyAgICAgICAgICAkc2NvcGUuc2hvd1N3YXAgPSBmYWxzZTsKKyAgICAgICAgICAkc2NvcGUuc2hvd0NyZWF0ZUFsaWFzID0gZmFsc2U7CisgICAgICAgICAgJHNjb3BlLnNob3dEZWxldGVBbGlhcyA9IGZhbHNlOworICAgICAgfTsKKworICAgICAgJHNjb3BlLnNob3dBZGRDb2xsZWN0aW9uID0gZnVuY3Rpb24oKSB7CisgICAgICAgICRzY29wZS5oaWRlQWxsKCk7CisgICAgICAgICRzY29wZS5zaG93QWRkID0gdHJ1ZTsKKyAgICAgICAgJHNjb3BlLm5ld0NvbGxlY3Rpb24gPSB7CisgICAgICAgICAgbmFtZTogIiIsCisgICAgICAgICAgcm91dGVyTmFtZTogImNvbXBvc2l0ZUlkIiwKKyAgICAgICAgICBudW1TaGFyZHM6IDEsCisgICAgICAgICAgY29uZmlnTmFtZTogIiIsCisgICAgICAgICAgcmVwbGljYXRpb25GYWN0b3I6IDEsCisgICAgICAgICAgbWF4U2hhcmRzUGVyTm9kZTogMQorICAgICAgICB9OworICAgICAgfTsKKworICAgICAgJHNjb3BlLnRvZ2dsZUNyZWF0ZUFsaWFzID0gZnVuY3Rpb24oKSB7CisgICAgICAgICRzY29wZS5oaWRlQWxsKCk7CisgICAgICAgICRzY29wZS5zaG93Q3JlYXRlQWxpYXMgPSB0cnVlOworICAgICAgfQorCisgICAgICAkc2NvcGUudG9nZ2xlRGVsZXRlQWxpYXMgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgJHNjb3BlLmhpZGVBbGwoKTsKKyAgICAgICAgJHNjb3BlLnNob3dEZWxldGVBbGlhcyA9IHRydWU7CisgICAgICAgIFpvb2tlZXBlci5hbGlhc2VzKHt9LCBmdW5jdGlvbihkYXRhKXsKKyAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGF0YS5hbGlhc2VzKS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgZGVsZXRlICRzY29wZS5hbGlhc2VzOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkc2NvcGUuYWxpYXNlcyA9IGRhdGEuYWxpYXNlczsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICB9CisKKyAgICAgICRzY29wZS5jYW5jZWxDcmVhdGVBbGlhcyA9ICRzY29wZS5jYW5jZWxEZWxldGVBbGlhcyA9IGZ1bmN0aW9uKCkgeworICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOworICAgICAgfQorCisgICAgICAkc2NvcGUuY3JlYXRlQWxpYXMgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGNvbGxlY3Rpb25zID0gW107CisgICAgICAgIGZvciAodmFyIGkgaW4gJHNjb3BlLmFsaWFzQ29sbGVjdGlvbnMpIHsKKyAgICAgICAgICBjb2xsZWN0aW9ucy5wdXNoKCRzY29wZS5hbGlhc0NvbGxlY3Rpb25zW2ldLm5hbWUpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLmNyZWF0ZUFsaWFzKHtuYW1lOiAkc2NvcGUuYWxpYXNUb0NyZWF0ZSwgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb25zLmpvaW4oIiwiKX0sIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgICRzY29wZS5kZWxldGVBbGlhcyA9IGZ1bmN0aW9uKCkgeworICAgICAgICBDb2xsZWN0aW9ucy5kZWxldGVBbGlhcyh7bmFtZTogJHNjb3BlLmFsaWFzVG9EZWxldGV9LCBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgJHNjb3BlLmhpZGVBbGwoKTsKKyAgICAgICAgfSk7CisKKyAgICAgIH07CisgICAgICAkc2NvcGUuYWRkQ29sbGVjdGlvbiA9IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAoISRzY29wZS5uZXdDb2xsZWN0aW9uLm5hbWUpIHsKKyAgICAgICAgICAkc2NvcGUuYWRkTWVzc2FnZSA9ICJQbGVhc2UgcHJvdmlkZSBhIGNvcmUgbmFtZSI7CisgICAgICAgIH0gZWxzZSBpZiAoZmFsc2UpIHsgLy9AdG9kbyBkZXRlY3Qgd2hldGhlciBjb3JlIGV4aXN0cworICAgICAgICAgICRzY29wZS5BZGRNZXNzYWdlID0gIkEgY29yZSB3aXRoIHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YXIgY29sbCA9ICRzY29wZS5uZXdDb2xsZWN0aW9uOworICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHsKKyAgICAgICAgICAgICAgICBuYW1lOiBjb2xsLm5hbWUsCisgICAgICAgICAgICAgICAgInJvdXRlci5uYW1lIjogY29sbC5yb3V0ZXJOYW1lLAorICAgICAgICAgICAgICAgIG51bVNoYXJkczogY29sbC5udW1TaGFyZHMsCisgICAgICAgICAgICAgICAgImNvbGxlY3Rpb24uY29uZmlnTmFtZSI6IGNvbGwuY29uZmlnTmFtZSwKKyAgICAgICAgICAgICAgICByZXBsaWNhdGlvbkZhY3RvcjogY29sbC5yZXBsaWNhdGlvbkZhY3RvciwKKyAgICAgICAgICAgICAgICBtYXhTaGFyZHNQZXJOb2RlOiBjb2xsLm1heFNoYXJkc1Blck5vZGUKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpZiAoY29sbC5zaGFyZHMpIHBhcmFtcy5zaGFyZHMgPSBjb2xsLnNoYXJkczsKKyAgICAgICAgICAgIGlmIChjb2xsLnJvdXRlckZpZWxkKSBwYXJhbXMucm91dGVyRmllbGQgPSBjb2xsLnJvdXRlckZpZWxkOworICAgICAgICAgICAgaWYgKGNvbGwucm91dGVyTmFtZSkgcGFyYW1zLnJvdXRlck5hbWUgPSBjb2xsLnJvdXRlck5hbWU7CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5hZGQocGFyYW1zLCBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgICAgICRzY29wZS5jYW5jZWxBZGRDb2xsZWN0aW9uKCk7CisgICAgICAgICAgICAgICRzY29wZS5yZXNldE1lbnUoImNvbGxlY3Rpb25zIiwgQ29uc3RhbnRzLklTX1JPT1RfUEFHRSk7CisgICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCIvfmNvbGxlY3Rpb25zLyIgKyAkc2NvcGUubmV3Q29sbGVjdGlvbi5uYW1lKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9OworCisgICAgICAkc2NvcGUuY2FuY2VsQWRkQ29sbGVjdGlvbiA9IGZ1bmN0aW9uKCkgeworICAgICAgICBkZWxldGUgJHNjb3BlLmFkZE1lc3NhZ2U7CisgICAgICAgICRzY29wZS5zaG93QWRkID0gZmFsc2U7CisgICAgICB9OworCisgICAgICAkc2NvcGUuc2hvd0RlbGV0ZUNvbGxlY3Rpb24gPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOworICAgICAgICAgIGlmICgkc2NvcGUuY29sbGVjdGlvbikgeworICAgICAgICAgICAgICAkc2NvcGUuc2hvd0RlbGV0ZSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgYWxlcnQoIk5vIGNvbGxlY3Rpb24gc2VsZWN0ZWQuIik7CisgICAgICAgICAgfQorICAgICAgfTsKKworICAgICAgJHNjb3BlLmRlbGV0ZUNvbGxlY3Rpb24gPSBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCRzY29wZS5jb2xsZWN0aW9uLm5hbWUgPT0gJHNjb3BlLmNvbGxlY3Rpb25EZWxldGVDb25maXJtKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5kZWxldGUoe25hbWU6ICRzY29wZS5jb2xsZWN0aW9uLm5hbWV9LCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCIvfmNvbGxlY3Rpb25zIik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRzY29wZS5kZWxldGVNZXNzYWdlID0gIkNvbGxlY3Rpb24gbmFtZXMgZG8gbm90IG1hdGNoLiI7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgICRzY29wZS5yZWxvYWRDb2xsZWN0aW9uID0gZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICghJHNjb3BlLmNvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgIGFsZXJ0KCJObyBjb2xsZWN0aW9uIHNlbGVjdGVkLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnJlbG9hZCh7bmFtZTogJHNjb3BlLmNvbGxlY3Rpb24ubmFtZX0sCisgICAgICAgICAgZnVuY3Rpb24oc3VjY2Vzc0RhdGEpIHsKKyAgICAgICAgICAgICRzY29wZS5yZWxvYWRTdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkgeyRzY29wZS5yZWxvYWRTdWNjZXNzPWZhbHNlfSwgMTAwMCk7CisgICAgICAgICAgfSwKKyAgICAgICAgICBmdW5jdGlvbihmYWlsdXJlRGF0YSkgeworICAgICAgICAgICAgJHNjb3BlLnJlbG9hZEZhaWx1cmUgPSB0cnVlOworICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7JHNjb3BlLnJlbG9hZEZhaWx1cmU9ZmFsc2V9LCAxMDAwKTsKKyAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCIvfmNvbGxlY3Rpb25zIik7CisgICAgICAgICAgfSk7CisgICAgICB9OworCisgICAgICAkc2NvcGUudG9nZ2xlQWRkUmVwbGljYSA9IGZ1bmN0aW9uKHNoYXJkKSB7CisgICAgICAgICAgJHNjb3BlLmhpZGVBbGwoKTsKKyAgICAgICAgICBzaGFyZC5zaG93QWRkID0gIXNoYXJkLnNob3dBZGQ7CisgICAgICAgICAgZGVsZXRlICRzY29wZS5hZGRSZXBsaWNhTWVzc2FnZTsKKworICAgICAgICAgIFpvb2tlZXBlci5saXZlTm9kZXMoe30sIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICAgICRzY29wZS5ub2RlcyA9IFtdOworICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZGF0YS50cmVlWzBdLmNoaWxkcmVuOworICAgICAgICAgICAgZm9yICh2YXIgY2hpbGQgaW4gY2hpbGRyZW4pIHsKKyAgICAgICAgICAgICAgJHNjb3BlLm5vZGVzLnB1c2goY2hpbGRyZW5bY2hpbGRdLmRhdGEudGl0bGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgfTsKKworICAgICAgJHNjb3BlLnRvZ2dsZVJlbW92ZVJlcGxpY2EgPSBmdW5jdGlvbihyZXBsaWNhKSB7CisgICAgICAgICAgJHNjb3BlLmhpZGVBbGwoKTsKKyAgICAgICAgICByZXBsaWNhLnNob3dSZW1vdmUgPSAhcmVwbGljYS5zaG93UmVtb3ZlOworICAgICAgfTsKKworICAgICAgJHNjb3BlLmRlbGV0ZVJlcGxpY2EgPSBmdW5jdGlvbihyZXBsaWNhKSB7CisgICAgICAgIENvbGxlY3Rpb25zLmRlbGV0ZVJlcGxpY2Eoe2NvbGxlY3Rpb246IHJlcGxpY2EuY29sbGVjdGlvbiwgc2hhcmQ6cmVwbGljYS5zaGFyZCwgcmVwbGljYTpyZXBsaWNhLm5hbWV9LCBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgcmVwbGljYS5kZWxldGVkID0gdHJ1ZTsKKyAgICAgICAgICAkdGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICRzY29wZS5yZWZyZXNoKCk7CisgICAgICAgICAgfSwgMjAwMCk7CisgICAgICAgIH0pOworICAgICAgfQorICAgICAgJHNjb3BlLmFkZFJlcGxpY2EgPSBmdW5jdGlvbihzaGFyZCkgeworICAgICAgICB2YXIgcGFyYW1zID0geworICAgICAgICAgIGNvbGxlY3Rpb246IHNoYXJkLmNvbGxlY3Rpb24sCisgICAgICAgICAgc2hhcmQ6IHNoYXJkLm5hbWUsCisgICAgICAgIH0KKyAgICAgICAgaWYgKHNoYXJkLnJlcGxpY2FOb2RlTmFtZSAmJiBzaGFyZC5yZXBsaWNhTm9kZU5hbWUgIT0gIiIpIHsKKyAgICAgICAgICBwYXJhbXMubm9kZSA9IHNoYXJkLnJlcGxpY2FOb2RlTmFtZTsKKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5hZGRSZXBsaWNhKHBhcmFtcywgZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgIHNoYXJkLnJlcGxpY2FBZGRlZCA9IHRydWU7CisgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgc2hhcmQucmVwbGljYUFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICBzaGFyZC5zaG93QWRkID0gZmFsc2U7CisgICAgICAgICAgICAkJHNjb3BlLnJlZnJlc2goKTsKKyAgICAgICAgICB9LCAyMDAwKTsKKyAgICAgICAgfSk7CisgICAgICB9OworCisgICAgICAkc2NvcGUudG9nZ2xlU2hhcmQgPSBmdW5jdGlvbihzaGFyZCkgeworICAgICAgICAgIHNoYXJkLnNob3cgPSAhc2hhcmQuc2hvdzsKKyAgICAgIH0KKworICAgICAgJHNjb3BlLnRvZ2dsZVJlcGxpY2EgPSBmdW5jdGlvbihyZXBsaWNhKSB7CisgICAgICAgICAgcmVwbGljYS5zaG93ID0gIXJlcGxpY2Euc2hvdzsKKyAgICAgIH0KKworICAgICAgJHNjb3BlLnJlZnJlc2goKTsKKyAgICB9CispOworCit2YXIgZmxhdHRlbiA9IGZ1bmN0aW9uKGRhdGEpIHsKKyAgICB2YXIgbGlzdCA9IFtdOworICAgIGZvciAodmFyIG5hbWUgaW4gZGF0YSkgeworICAgICAgIHZhciBlbnRyeSA9IGRhdGFbbmFtZV07CisgICAgICAgIGVudHJ5Lm5hbWUgPSBuYW1lOworICAgICAgICBsaXN0LnB1c2goZW50cnkpOworICAgIH0KKyAgICByZXR1cm4gbGlzdDsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2NvcmUtb3ZlcnZpZXcuanMgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9jb3JlLW92ZXJ2aWV3LmpzCmluZGV4IDZiZTdkYmQuLjcxMGU2ZjIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2NvcmUtb3ZlcnZpZXcuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvY29yZS1vdmVydmlldy5qcwpAQCAtMSwyMjQgKzEsMjI0IEBACi0vKg0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotDQotc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ0NvcmVPdmVydmlld0NvbnRyb2xsZXInLA0KLWZ1bmN0aW9uKCRzY29wZSwgJHJvb3RTY29wZSwgJHJvdXRlUGFyYW1zLCBMdWtlLCBDb3JlU3lzdGVtLCBVcGRhdGUsIFJlcGxpY2F0aW9uLCBQaW5nLCBDb25zdGFudHMpIHsNCi0gICRzY29wZS5yZXNldE1lbnUoIm92ZXJ2aWV3IiwgQ29uc3RhbnRzLklTX0NPUkVfUEFHRSk7DQotICAkc2NvcGUucmVmcmVzaEluZGV4ID0gZnVuY3Rpb24oKSB7DQotICAgIEx1a2UuaW5kZXgoe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlfSwNCi0gICAgICBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAkc2NvcGUuaW5kZXggPSBkYXRhLmluZGV4Ow0KLSAgICAgICAgZGVsZXRlICRzY29wZS5zdGF0c01lc3NhZ2U7DQotICAgICAgfSwNCi0gICAgICBmdW5jdGlvbihlcnJvcikgew0KLSAgICAgICAgJHNjb3BlLnN0YXRzTWVzc2FnZSA9ICJMdWtlIGlzIG5vdCBjb25maWd1cmVkIjsNCi0gICAgICB9DQotICAgICk7DQotICB9Ow0KLQ0KLSAgJHNjb3BlLm9wdGltaXplSW5kZXggPSBmdW5jdGlvbihjb3JlKSB7DQotICAgIFVwZGF0ZS5vcHRpbWl6ZSh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LA0KLSAgICAgIGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQotICAgICAgICAkc2NvcGUucmVmcmVzaCgpOw0KLSAgICAgICAgZGVsZXRlICRzY29wZS5pbmRleE1lc3NhZ2U7DQotICAgICAgfSwNCi0gICAgICBmdW5jdGlvbihlcnJvcikgew0KLSAgICAgICAgJHNjb3BlLnN0YXRpc3RpY3NEaXNhYmxlZCA9IHRydWU7DQotICAgICAgICAkc2NvcGUuaW5kZXhNZXNzYWdlID0gIk9wdGltaXplIGJyb2tlbi4iOw0KLSAgICAgIH0pOw0KLSAgfTsNCi0NCi0gICRzY29wZS5yZWZyZXNoUmVwbGljYXRpb24gPSBmdW5jdGlvbigpIHsNCi0gICAgUmVwbGljYXRpb24uZGV0YWlscyh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LA0KLSAgICAgIGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICRzY29wZS5pc1NsYXZlID0gZGF0YS5kZXRhaWxzLmlzU2xhdmUgPT0gInRydWUiOw0KLSAgICAgICAgJHNjb3BlLmlzTWFzdGVyID0gZGF0YS5kZXRhaWxzLmlzTWFzdGVyID09ICJ0cnVlIjsNCi0gICAgICAgICRzY29wZS5yZXBsaWNhdGlvbiA9IGRhdGEuZGV0YWlsczsNCi0gICAgICB9LA0KLSAgICAgIGZ1bmN0aW9uKGVycm9yKSB7DQotICAgICAgICAkc2NvcGUucmVwbGljYXRpb25NZXNzYWdlID0gIlJlcGxpY2F0aW9uIGlzIG5vdCBjb25maWd1cmVkIjsNCi0gICAgICB9KTsNCi0gIC8qDQotICAgICAgL3JlcGxpY2F0aW9uP2NvbW1hbmQ9ZGV0YWlscyZ3dD1qc29uDQotDQotICAgICAgICAgICAgICBpZiggaXNfc2xhdmUgKQ0KLSAgICAgICAgICAgICAgew0KLQ0KLSAgICAgICAgICAgICAgICAvLyB3YXJuaW5ncyBpZiBzbGF2ZSB2ZXJzaW9ufGdlbiBkb2Vzbid0IG1hdGNoIHdoYXQncyByZXBsaWNhYmxlDQotICAgICAgICAgICAgICAgIGlmKCBkYXRhLmluZGV4VmVyc2lvbiAhPT0gbWFzdGVyX2RhdGEubWFzdGVyLnJlcGxpY2FibGVWZXJzaW9uICkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICQoICcudmVyc2lvbicsIGRldGFpbHNfZWxlbWVudCApDQotICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoICdkaWZmJyApOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICQoICcudmVyc2lvbicsIGRldGFpbHNfZWxlbWVudCApDQotICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoICdkaWZmJyApOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmKCBkYXRhLmdlbmVyYXRpb24gIT09IG1hc3Rlcl9kYXRhLm1hc3Rlci5yZXBsaWNhYmxlR2VuZXJhdGlvbiApDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAkKCAnLmdlbmVyYXRpb24nLCBkZXRhaWxzX2VsZW1lbnQgKQ0KLSAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCAnZGlmZicgKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAkKCAnLmdlbmVyYXRpb24nLCBkZXRhaWxzX2VsZW1lbnQgKQ0KLSAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCAnZGlmZicgKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0sDQotDQotKi8NCi0gIH07DQotDQotICAkc2NvcGUucmVmcmVzaEFkbWluRXh0cmEgPSBmdW5jdGlvbigpIHsNCi0gIH07DQotDQotICAkc2NvcGUucmVmcmVzaFN5c3RlbSA9IGZ1bmN0aW9uKCkgew0KLSAgICBDb3JlU3lzdGVtLmdldCh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LA0KLSAgICAgIGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICRzY29wZS5jb3JlID0gZGF0YS5jb3JlOw0KLSAgICAgICAgZGVsZXRlICRzY29wZS5zeXN0ZW1NZXNzYWdlOw0KLSAgICAgIH0sDQotICAgICAgZnVuY3Rpb24oZXJyb3IpIHsNCi0gICAgICAgICRzY29wZS5zeXN0ZW1NZXNzYWdlID0gIi9hZG1pbi9zeXN0ZW0gSGFuZGxlciBpcyBub3QgY29uZmlndXJlZCI7DQotICAgICAgfQ0KLSAgICApOw0KLSAgfTsNCi0NCi0gICRzY29wZS5yZWZyZXNoUGluZyA9IGZ1bmN0aW9uKCkgew0KLSAgICBQaW5nLnN0YXR1cyh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgaWYgKGRhdGEuZXJyb3IpIHsNCi0gICAgICAgICRzY29wZS5oZWFsdGhjaGVja1N0YXR1cyA9IGZhbHNlOw0KLSAgICAgICAgaWYgKGRhdGEuZXJyb3IuY29kZSA9PSA1MDMpIHsNCi0gICAgICAgICAgJHNjb3BlLmhlYWx0aGNoZWNrTWVzc2FnZSA9ICdQaW5nIHJlcXVlc3QgaGFuZGxlciBpcyBub3QgY29uZmlndXJlZCB3aXRoIGEgaGVhbHRoY2hlY2sgZmlsZS4nOw0KLSAgICAgICAgfQ0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICAkc2NvcGUuaGVhbHRoY2hlY2tTdGF0dXMgPSBkYXRhLnN0YXR1cyA9PSAiZW5hYmxlZCI7DQotICAgICAgfQ0KLSAgICB9KTsNCi0gIH07DQotDQotICAkc2NvcGUudG9nZ2xlSGVhbHRoY2hlY2sgPSBmdW5jdGlvbigpIHsNCi0gICAgaWYgKCRzY29wZS5oZWFsdGhjaGVja1N0YXR1cykgew0KLSAgICAgIFBpbmcuZGlzYWJsZSgNCi0gICAgICAgIGZ1bmN0aW9uKGRhdGEpIHskc2NvcGUuaGVhbHRoY2hlY2tTdGF0dXMgPSBmYWxzZX0sDQotICAgICAgICBmdW5jdGlvbihlcnJvcikgeyRzY29wZS5oZWFsdGhjaGVja01lc3NhZ2UgPSBlcnJvcn0NCi0gICAgICApOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIFBpbmcuZW5hYmxlKA0KLSAgICAgICAgZnVuY3Rpb24oZGF0YSkgeyRzY29wZS5oZWFsdGhjaGVja1N0YXR1cyA9IHRydWV9LA0KLSAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHskc2NvcGUuaGVhbHRoY2hlY2tNZXNzYWdlID0gZXJyb3J9DQotICAgICAgKTsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gICRzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7DQotICAgICRzY29wZS5yZWZyZXNoSW5kZXgoKTsNCi0gICAgJHNjb3BlLnJlZnJlc2hSZXBsaWNhdGlvbigpOw0KLSAgICAkc2NvcGUucmVmcmVzaEFkbWluRXh0cmEoKTsNCi0gICAgJHNjb3BlLnJlZnJlc2hTeXN0ZW0oKTsNCi0gICAgJHNjb3BlLnJlZnJlc2hQaW5nKCk7DQotICB9Ow0KLQ0KLSAgJHNjb3BlLnJlZnJlc2goKTsNCi19KTsNCi0NCi0vKioqKioqKg0KLQ0KLS8vIEB0b2RvIGFkbWluLWV4dHJhDQotICAgIHZhciBjb3JlX2Jhc2VwYXRoID0gdGhpcy5hY3RpdmVfY29yZS5hdHRyKCAnZGF0YS1iYXNlcGF0aCcgKTsNCi0gICAgdmFyIGNvbnRlbnRfZWxlbWVudCA9ICQoICcjY29udGVudCcgKTsNCi0NCi0gICAgY29udGVudF9lbGVtZW50DQotICAgICAgLnJlbW92ZUNsYXNzKCAnc2luZ2xlJyApOw0KLQ0KLSAgICBpZiggIWFwcC5jb3JlX21lbnUuZGF0YSggJ2FkbWluLWV4dHJhLWxvYWRlZCcgKSApDQotICAgIHsNCi0gICAgICBhcHAuY29yZV9tZW51LmRhdGEoICdhZG1pbi1leHRyYS1sb2FkZWQnLCBuZXcgRGF0ZSgpICk7DQotDQotICAgICAgJC5nZXQNCi0gICAgICAoDQotICAgICAgICBjb3JlX2Jhc2VwYXRoICsgJy9hZG1pbi9maWxlLz9maWxlPWFkbWluLWV4dHJhLm1lbnUtdG9wLmh0bWwmY29udGVudFR5cGU9dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgnLA0KLSAgICAgICAgZnVuY3Rpb24oIG1lbnVfZXh0cmEgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICBhcHAuY29yZV9tZW51DQotICAgICAgICAgICAgLnByZXBlbmQoIG1lbnVfZXh0cmEgKTsNCi0gICAgICAgIH0NCi0gICAgICApOw0KLQ0KLSAgICAgICQuZ2V0DQotICAgICAgKA0KLSAgICAgICAgY29yZV9iYXNlcGF0aCArICcvYWRtaW4vZmlsZS8/ZmlsZT1hZG1pbi1leHRyYS5tZW51LWJvdHRvbS5odG1sJmNvbnRlbnRUeXBlPXRleHQvaHRtbDtjaGFyc2V0PXV0Zi04JywNCi0gICAgICAgIGZ1bmN0aW9uKCBtZW51X2V4dHJhICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgYXBwLmNvcmVfbWVudQ0KLSAgICAgICAgICAgIC5hcHBlbmQoIG1lbnVfZXh0cmEgKTsNCi0gICAgICAgIH0NCi0gICAgICApOw0KLSAgICB9DQotDQotDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBBRE1JTiBFWFRSQQ0KLSAgICAgICAgJC5hamF4DQotICAgICAgICAoDQotICAgICAgICAgIHsNCi0gICAgICAgICAgICB1cmwgOiBjb3JlX2Jhc2VwYXRoICsgJy9hZG1pbi9maWxlLz9maWxlPWFkbWluLWV4dHJhLmh0bWwnLA0KLSAgICAgICAgICAgIGRhdGFUeXBlIDogJ2h0bWwnLA0KLSAgICAgICAgICAgIGNvbnRleHQgOiAkKCAnI2FkbWluLWV4dHJhJywgZGFzaGJvYXJkX2VsZW1lbnQgKSwNCi0gICAgICAgICAgICBiZWZvcmVTZW5kIDogZnVuY3Rpb24oIHhociwgc2V0dGluZ3MgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICQoICdoMicsIHRoaXMgKQ0KLSAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoICdsb2FkZXInICk7DQotDQotICAgICAgICAgICAgICAkKCAnLm1lc3NhZ2UnLCB0aGlzICkNCi0gICAgICAgICAgICAgICAgLnNob3coKQ0KLSAgICAgICAgICAgICAgICAuaHRtbCggJ0xvYWRpbmcnICk7DQotDQotICAgICAgICAgICAgICAkKCAnLmNvbnRlbnQnLCB0aGlzICkNCi0gICAgICAgICAgICAgICAgLmhpZGUoKTsNCi0gICAgICAgICAgICB9LA0KLSAgICAgICAgICAgIHN1Y2Nlc3MgOiBmdW5jdGlvbiggcmVzcG9uc2UsIHRleHRfc3RhdHVzLCB4aHIgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICQoICcubWVzc2FnZScsIHRoaXMgKQ0KLSAgICAgICAgICAgICAgICAuaGlkZSgpDQotICAgICAgICAgICAgICAgIC5lbXB0eSgpOw0KLQ0KLSAgICAgICAgICAgICAgJCggJy5jb250ZW50JywgdGhpcyApDQotICAgICAgICAgICAgICAgIC5zaG93KCkNCi0gICAgICAgICAgICAgICAgLmh0bWwoIHJlc3BvbnNlICk7DQotICAgICAgICAgICAgfSwNCi0gICAgICAgICAgICBlcnJvciA6IGZ1bmN0aW9uKCB4aHIsIHRleHRfc3RhdHVzLCBlcnJvcl90aHJvd24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgdGhpcw0KLSAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoICdkaXNhYmxlZCcgKTsNCi0NCi0gICAgICAgICAgICAgICQoICcubWVzc2FnZScsIHRoaXMgKQ0KLSAgICAgICAgICAgICAgICAuc2hvdygpDQotICAgICAgICAgICAgICAgIC5odG1sKCAnV2UgZm91bmQgbm8gImFkbWluLWV4dHJhLmh0bWwiIGZpbGUuJyApOw0KLSAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgY29tcGxldGUgOiBmdW5jdGlvbiggeGhyLCB0ZXh0X3N0YXR1cyApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgJCggJ2gyJywgdGhpcyApDQotICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyggJ2xvYWRlcicgKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgICk7DQotDQotKioqLw0KKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ0NvcmVPdmVydmlld0NvbnRyb2xsZXInLAorZnVuY3Rpb24oJHNjb3BlLCAkcm9vdFNjb3BlLCAkcm91dGVQYXJhbXMsIEx1a2UsIENvcmVTeXN0ZW0sIFVwZGF0ZSwgUmVwbGljYXRpb24sIFBpbmcsIENvbnN0YW50cykgeworICAkc2NvcGUucmVzZXRNZW51KCJvdmVydmlldyIsIENvbnN0YW50cy5JU19DT1JFX1BBR0UpOworICAkc2NvcGUucmVmcmVzaEluZGV4ID0gZnVuY3Rpb24oKSB7CisgICAgTHVrZS5pbmRleCh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LAorICAgICAgZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAkc2NvcGUuaW5kZXggPSBkYXRhLmluZGV4OworICAgICAgICBkZWxldGUgJHNjb3BlLnN0YXRzTWVzc2FnZTsKKyAgICAgIH0sCisgICAgICBmdW5jdGlvbihlcnJvcikgeworICAgICAgICAkc2NvcGUuc3RhdHNNZXNzYWdlID0gIkx1a2UgaXMgbm90IGNvbmZpZ3VyZWQiOworICAgICAgfQorICAgICk7CisgIH07CisKKyAgJHNjb3BlLm9wdGltaXplSW5kZXggPSBmdW5jdGlvbihjb3JlKSB7CisgICAgVXBkYXRlLm9wdGltaXplKHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZX0sCisgICAgICBmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICAkc2NvcGUucmVmcmVzaCgpOworICAgICAgICBkZWxldGUgJHNjb3BlLmluZGV4TWVzc2FnZTsKKyAgICAgIH0sCisgICAgICBmdW5jdGlvbihlcnJvcikgeworICAgICAgICAkc2NvcGUuc3RhdGlzdGljc0Rpc2FibGVkID0gdHJ1ZTsKKyAgICAgICAgJHNjb3BlLmluZGV4TWVzc2FnZSA9ICJPcHRpbWl6ZSBicm9rZW4uIjsKKyAgICAgIH0pOworICB9OworCisgICRzY29wZS5yZWZyZXNoUmVwbGljYXRpb24gPSBmdW5jdGlvbigpIHsKKyAgICBSZXBsaWNhdGlvbi5kZXRhaWxzKHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZX0sCisgICAgICBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICRzY29wZS5pc1NsYXZlID0gZGF0YS5kZXRhaWxzLmlzU2xhdmUgPT0gInRydWUiOworICAgICAgICAkc2NvcGUuaXNNYXN0ZXIgPSBkYXRhLmRldGFpbHMuaXNNYXN0ZXIgPT0gInRydWUiOworICAgICAgICAkc2NvcGUucmVwbGljYXRpb24gPSBkYXRhLmRldGFpbHM7CisgICAgICB9LAorICAgICAgZnVuY3Rpb24oZXJyb3IpIHsKKyAgICAgICAgJHNjb3BlLnJlcGxpY2F0aW9uTWVzc2FnZSA9ICJSZXBsaWNhdGlvbiBpcyBub3QgY29uZmlndXJlZCI7CisgICAgICB9KTsKKyAgLyoKKyAgICAgIC9yZXBsaWNhdGlvbj9jb21tYW5kPWRldGFpbHMmd3Q9anNvbgorCisgICAgICAgICAgICAgIGlmKCBpc19zbGF2ZSApCisgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIC8vIHdhcm5pbmdzIGlmIHNsYXZlIHZlcnNpb258Z2VuIGRvZXNuJ3QgbWF0Y2ggd2hhdCdzIHJlcGxpY2FibGUKKyAgICAgICAgICAgICAgICBpZiggZGF0YS5pbmRleFZlcnNpb24gIT09IG1hc3Rlcl9kYXRhLm1hc3Rlci5yZXBsaWNhYmxlVmVyc2lvbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgJCggJy52ZXJzaW9uJywgZGV0YWlsc19lbGVtZW50ICkKKyAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCAnZGlmZicgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICQoICcudmVyc2lvbicsIGRldGFpbHNfZWxlbWVudCApCisgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyggJ2RpZmYnICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIGRhdGEuZ2VuZXJhdGlvbiAhPT0gbWFzdGVyX2RhdGEubWFzdGVyLnJlcGxpY2FibGVHZW5lcmF0aW9uICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAkKCAnLmdlbmVyYXRpb24nLCBkZXRhaWxzX2VsZW1lbnQgKQorICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoICdkaWZmJyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgJCggJy5nZW5lcmF0aW9uJywgZGV0YWlsc19lbGVtZW50ICkKKyAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCAnZGlmZicgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisKKyovCisgIH07CisKKyAgJHNjb3BlLnJlZnJlc2hBZG1pbkV4dHJhID0gZnVuY3Rpb24oKSB7CisgIH07CisKKyAgJHNjb3BlLnJlZnJlc2hTeXN0ZW0gPSBmdW5jdGlvbigpIHsKKyAgICBDb3JlU3lzdGVtLmdldCh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LAorICAgICAgZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAkc2NvcGUuY29yZSA9IGRhdGEuY29yZTsKKyAgICAgICAgZGVsZXRlICRzY29wZS5zeXN0ZW1NZXNzYWdlOworICAgICAgfSwKKyAgICAgIGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgICRzY29wZS5zeXN0ZW1NZXNzYWdlID0gIi9hZG1pbi9zeXN0ZW0gSGFuZGxlciBpcyBub3QgY29uZmlndXJlZCI7CisgICAgICB9CisgICAgKTsKKyAgfTsKKworICAkc2NvcGUucmVmcmVzaFBpbmcgPSBmdW5jdGlvbigpIHsKKyAgICBQaW5nLnN0YXR1cyh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCBmdW5jdGlvbihkYXRhKSB7CisgICAgICBpZiAoZGF0YS5lcnJvcikgeworICAgICAgICAkc2NvcGUuaGVhbHRoY2hlY2tTdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgaWYgKGRhdGEuZXJyb3IuY29kZSA9PSA1MDMpIHsKKyAgICAgICAgICAkc2NvcGUuaGVhbHRoY2hlY2tNZXNzYWdlID0gJ1BpbmcgcmVxdWVzdCBoYW5kbGVyIGlzIG5vdCBjb25maWd1cmVkIHdpdGggYSBoZWFsdGhjaGVjayBmaWxlLic7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICRzY29wZS5oZWFsdGhjaGVja1N0YXR1cyA9IGRhdGEuc3RhdHVzID09ICJlbmFibGVkIjsKKyAgICAgIH0KKyAgICB9KTsKKyAgfTsKKworICAkc2NvcGUudG9nZ2xlSGVhbHRoY2hlY2sgPSBmdW5jdGlvbigpIHsKKyAgICBpZiAoJHNjb3BlLmhlYWx0aGNoZWNrU3RhdHVzKSB7CisgICAgICBQaW5nLmRpc2FibGUoCisgICAgICAgIGZ1bmN0aW9uKGRhdGEpIHskc2NvcGUuaGVhbHRoY2hlY2tTdGF0dXMgPSBmYWxzZX0sCisgICAgICAgIGZ1bmN0aW9uKGVycm9yKSB7JHNjb3BlLmhlYWx0aGNoZWNrTWVzc2FnZSA9IGVycm9yfQorICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgUGluZy5lbmFibGUoCisgICAgICAgIGZ1bmN0aW9uKGRhdGEpIHskc2NvcGUuaGVhbHRoY2hlY2tTdGF0dXMgPSB0cnVlfSwKKyAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHskc2NvcGUuaGVhbHRoY2hlY2tNZXNzYWdlID0gZXJyb3J9CisgICAgICApOworICAgIH0KKyAgfTsKKworICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkgeworICAgICRzY29wZS5yZWZyZXNoSW5kZXgoKTsKKyAgICAkc2NvcGUucmVmcmVzaFJlcGxpY2F0aW9uKCk7CisgICAgJHNjb3BlLnJlZnJlc2hBZG1pbkV4dHJhKCk7CisgICAgJHNjb3BlLnJlZnJlc2hTeXN0ZW0oKTsKKyAgICAkc2NvcGUucmVmcmVzaFBpbmcoKTsKKyAgfTsKKworICAkc2NvcGUucmVmcmVzaCgpOworfSk7CisKKy8qKioqKioqCisKKy8vIEB0b2RvIGFkbWluLWV4dHJhCisgICAgdmFyIGNvcmVfYmFzZXBhdGggPSB0aGlzLmFjdGl2ZV9jb3JlLmF0dHIoICdkYXRhLWJhc2VwYXRoJyApOworICAgIHZhciBjb250ZW50X2VsZW1lbnQgPSAkKCAnI2NvbnRlbnQnICk7CisKKyAgICBjb250ZW50X2VsZW1lbnQKKyAgICAgIC5yZW1vdmVDbGFzcyggJ3NpbmdsZScgKTsKKworICAgIGlmKCAhYXBwLmNvcmVfbWVudS5kYXRhKCAnYWRtaW4tZXh0cmEtbG9hZGVkJyApICkKKyAgICB7CisgICAgICBhcHAuY29yZV9tZW51LmRhdGEoICdhZG1pbi1leHRyYS1sb2FkZWQnLCBuZXcgRGF0ZSgpICk7CisKKyAgICAgICQuZ2V0CisgICAgICAoCisgICAgICAgIGNvcmVfYmFzZXBhdGggKyAnL2FkbWluL2ZpbGUvP2ZpbGU9YWRtaW4tZXh0cmEubWVudS10b3AuaHRtbCZjb250ZW50VHlwZT10ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCcsCisgICAgICAgIGZ1bmN0aW9uKCBtZW51X2V4dHJhICkKKyAgICAgICAgeworICAgICAgICAgIGFwcC5jb3JlX21lbnUKKyAgICAgICAgICAgIC5wcmVwZW5kKCBtZW51X2V4dHJhICk7CisgICAgICAgIH0KKyAgICAgICk7CisKKyAgICAgICQuZ2V0CisgICAgICAoCisgICAgICAgIGNvcmVfYmFzZXBhdGggKyAnL2FkbWluL2ZpbGUvP2ZpbGU9YWRtaW4tZXh0cmEubWVudS1ib3R0b20uaHRtbCZjb250ZW50VHlwZT10ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCcsCisgICAgICAgIGZ1bmN0aW9uKCBtZW51X2V4dHJhICkKKyAgICAgICAgeworICAgICAgICAgIGFwcC5jb3JlX21lbnUKKyAgICAgICAgICAgIC5hcHBlbmQoIG1lbnVfZXh0cmEgKTsKKyAgICAgICAgfQorICAgICAgKTsKKyAgICB9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEFETUlOIEVYVFJBCisgICAgICAgICQuYWpheAorICAgICAgICAoCisgICAgICAgICAgeworICAgICAgICAgICAgdXJsIDogY29yZV9iYXNlcGF0aCArICcvYWRtaW4vZmlsZS8/ZmlsZT1hZG1pbi1leHRyYS5odG1sJywKKyAgICAgICAgICAgIGRhdGFUeXBlIDogJ2h0bWwnLAorICAgICAgICAgICAgY29udGV4dCA6ICQoICcjYWRtaW4tZXh0cmEnLCBkYXNoYm9hcmRfZWxlbWVudCApLAorICAgICAgICAgICAgYmVmb3JlU2VuZCA6IGZ1bmN0aW9uKCB4aHIsIHNldHRpbmdzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJCggJ2gyJywgdGhpcyApCisgICAgICAgICAgICAgICAgLmFkZENsYXNzKCAnbG9hZGVyJyApOworCisgICAgICAgICAgICAgICQoICcubWVzc2FnZScsIHRoaXMgKQorICAgICAgICAgICAgICAgIC5zaG93KCkKKyAgICAgICAgICAgICAgICAuaHRtbCggJ0xvYWRpbmcnICk7CisKKyAgICAgICAgICAgICAgJCggJy5jb250ZW50JywgdGhpcyApCisgICAgICAgICAgICAgICAgLmhpZGUoKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBzdWNjZXNzIDogZnVuY3Rpb24oIHJlc3BvbnNlLCB0ZXh0X3N0YXR1cywgeGhyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJCggJy5tZXNzYWdlJywgdGhpcyApCisgICAgICAgICAgICAgICAgLmhpZGUoKQorICAgICAgICAgICAgICAgIC5lbXB0eSgpOworCisgICAgICAgICAgICAgICQoICcuY29udGVudCcsIHRoaXMgKQorICAgICAgICAgICAgICAgIC5zaG93KCkKKyAgICAgICAgICAgICAgICAuaHRtbCggcmVzcG9uc2UgKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBlcnJvciA6IGZ1bmN0aW9uKCB4aHIsIHRleHRfc3RhdHVzLCBlcnJvcl90aHJvd24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRoaXMKKyAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoICdkaXNhYmxlZCcgKTsKKworICAgICAgICAgICAgICAkKCAnLm1lc3NhZ2UnLCB0aGlzICkKKyAgICAgICAgICAgICAgICAuc2hvdygpCisgICAgICAgICAgICAgICAgLmh0bWwoICdXZSBmb3VuZCBubyAiYWRtaW4tZXh0cmEuaHRtbCIgZmlsZS4nICk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgY29tcGxldGUgOiBmdW5jdGlvbiggeGhyLCB0ZXh0X3N0YXR1cyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICQoICdoMicsIHRoaXMgKQorICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyggJ2xvYWRlcicgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICk7CisKKyoqKi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2NvcmVzLmpzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvY29yZXMuanMKaW5kZXggOTFlMjE4Ni4uZDEzNTM5NSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvY29yZXMuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvY29yZXMuanMKQEAgLTEsNDc4ICsxLDQ3OCBAQAotLyoNCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLQ0KLS8vIEB0b2RvIHRlc3Qgb3B0aW1pemUgKGRlbGV0ZSBzdHVmZiwgd2F0Y2ggYnV0dG9uIGFwcGVhciwgdGVzdCBidXR0b24vZm9ybSkNCi1zb2xyQWRtaW5BcHAuY29udHJvbGxlcignQ29yZUFkbWluQ29udHJvbGxlcicsDQotICAgIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24sICR0aW1lb3V0LCAkcm91dGUsIENvcmVzLCBVcGRhdGUsIENvbnN0YW50cyl7DQotICAgICAgJHNjb3BlLnJlc2V0TWVudSgiY29yZXMiLCBDb25zdGFudHMuSVNfUk9PVF9QQUdFKTsNCi0gICAgICAkc2NvcGUuc2VsZWN0ZWRDb3JlID0gJHJvdXRlUGFyYW1zLmNvcmVuYW1lOyAvLyB1c2UgJ2NvcmVuYW1lJyBub3QgJ2NvcmUnIHRvIGRpc3Rpbmd1aXNoIGZyb20gL3NvbHIvOmNvcmUvDQotICAgICAgJHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHsNCi0gICAgICAgIENvcmVzLmdldChmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAgIHZhciBjb3JlQ291bnQgPSAwOw0KLSAgICAgICAgICB2YXIgY29yZXMgPSBkYXRhLnN0YXR1czsNCi0gICAgICAgICAgZm9yIChfb2JqIGluIGNvcmVzKSBjb3JlQ291bnQrKzsNCi0gICAgICAgICAgJHNjb3BlLmhhc0NvcmVzID0gY29yZUNvdW50ID4wOw0KLSAgICAgICAgICBpZiAoISRzY29wZS5zZWxlY3RlZENvcmUgJiYgY29yZUNvdW50PT0wKSB7DQotICAgICAgICAgICAgJHNjb3BlLnNob3dBZGRDb3JlKCk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICB9IGVsc2UgaWYgKCEkc2NvcGUuc2VsZWN0ZWRDb3JlKSB7DQotICAgICAgICAgICAgZm9yIChmaXJzdENvcmUgaW4gY29yZXMpIGJyZWFrOw0KLSAgICAgICAgICAgICRzY29wZS5zZWxlY3RlZENvcmUgPSBmaXJzdENvcmU7DQotICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoIi9+Y29yZXMvIiArICRzY29wZS5zZWxlY3RlZENvcmUpLnJlcGxhY2UoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICAkc2NvcGUuY29yZSA9IGNvcmVzWyRzY29wZS5zZWxlY3RlZENvcmVdOw0KLSAgICAgICAgICAkc2NvcGUuY29yZWxpc3QgPSBbXTsNCi0gICAgICAgICAgJHNjb3BlLnN3YXBDb3JlbGlzdCA9IFtdOw0KLSAgICAgICAgICBmb3IgKHZhciBjb3JlIGluIGNvcmVzKSB7DQotICAgICAgICAgICAgICRzY29wZS5jb3JlbGlzdC5wdXNoKGNvcmVzW2NvcmVdKTsNCi0gICAgICAgICAgICBpZiAoY29yZXNbY29yZV0gIT0gJHNjb3BlLmNvcmUpIHsNCi0gICAgICAgICAgICAgICRzY29wZS5zd2FwQ29yZWxpc3QucHVzaChjb3Jlc1tjb3JlXSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmICgkc2NvcGUuc3dhcENvcmVsaXN0Lmxlbmd0aD4wKSB7DQotICAgICAgICAgICAgJHNjb3BlLnN3YXBPdGhlciA9ICRzY29wZS5zd2FwQ29yZWxpc3RbMF0ubmFtZTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgICAgfTsNCi0gICAgICAkc2NvcGUuc2hvd0FkZENvcmUgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICRzY29wZS5oaWRlQWxsKCk7DQotICAgICAgICAkc2NvcGUuc2hvd0FkZCA9IHRydWU7DQotICAgICAgICAkc2NvcGUubmV3Q29yZSA9IHsNCi0gICAgICAgICAgbmFtZTogIm5ld19jb3JlIiwNCi0gICAgICAgICAgZGF0YURpcjogImRhdGEiLA0KLSAgICAgICAgICBpbnN0YW5jZURpcjogIm5ld19jb3JlIiwNCi0gICAgICAgICAgY29uZmlnOiAic29scmNvbmZpZy54bWwiLA0KLSAgICAgICAgICBzY2hlbWE6ICJzY2hlbWEueG1sIiwNCi0gICAgICAgICAgY29sbGVjdGlvbjogIiIsDQotICAgICAgICAgIHNoYXJkOiAiIg0KLSAgICAgICAgfTsNCi0gICAgICB9Ow0KLQ0KLSAgICAgICRzY29wZS5hZGRDb3JlID0gZnVuY3Rpb24oKSB7DQotICAgICAgICBpZiAoISRzY29wZS5uZXdDb3JlLm5hbWUpIHsNCi0gICAgICAgICAgJHNjb3BlLmFkZE1lc3NhZ2UgPSAiUGxlYXNlIHByb3ZpZGUgYSBjb3JlIG5hbWUiOw0KLSAgICAgICAgfSBlbHNlIGlmIChmYWxzZSkgeyAvL0B0b2RvIGRldGVjdCB3aGV0aGVyIGNvcmUgZXhpc3RzDQotICAgICAgICAgICRzY29wZS5BZGRNZXNzYWdlID0gIkEgY29yZSB3aXRoIHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cyI7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICB2YXIgcGFyYW1zID0gew0KLSAgICAgICAgICAgIG5hbWU6ICRzY29wZS5uZXdDb3JlLm5hbWUsDQotICAgICAgICAgICAgaW5zdGFuY2VEaXI6ICRzY29wZS5uZXdDb3JlLmluc3RhbmNlRGlyLA0KLSAgICAgICAgICAgIGNvbmZpZzogJHNjb3BlLm5ld0NvcmUuY29uZmlnLA0KLSAgICAgICAgICAgIHNjaGVtYTogJHNjb3BlLm5ld0NvcmUuc2NoZW1hLA0KLSAgICAgICAgICAgIGRhdGFEaXI6ICRzY29wZS5uZXdDb3JlLmRhdGFEaXINCi0gICAgICAgICAgfTsNCi0gICAgICAgICAgaWYgKCRzY29wZS5pc0Nsb3VkKSB7DQotICAgICAgICAgICAgcGFyYW1zLmNvbGxlY3Rpb24gPSAkc2NvcGUubmV3Q29yZS5jb2xsZWN0aW9uOw0KLSAgICAgICAgICAgIHBhcmFtcy5zaGFyZCA9ICRzY29wZS5uZXdDb3JlLnNoYXJkOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIENvcmVzLmFkZChwYXJhbXMsIGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICAgICAkbG9jYXRpb24ucGF0aCgiL35jb3Jlcy8iICsgJHNjb3BlLm5ld0NvcmUubmFtZSk7DQotICAgICAgICAgICAgJHNjb3BlLmNhbmNlbEFkZENvcmUoKTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICB9DQotICAgICAgfTsNCi0NCi0gICAgICAkc2NvcGUuY2FuY2VsQWRkQ29yZSA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgZGVsZXRlICRzY29wZS5hZGRNZXNzYWdlOw0KLSAgICAgICAgJHNjb3BlLnNob3dBZGQgPSBmYWxzZQ0KLSAgICAgIH07DQotDQotICAgICAgJHNjb3BlLnVubG9hZENvcmUgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgIHZhciBhbnN3ZXIgPSBjb25maXJtKCAnRG8geW91IHJlYWxseSB3YW50IHRvIHVubG9hZCBDb3JlICInICsgJHNjb3BlLnNlbGVjdGVkQ29yZSArICciPycgKTsNCi0gICAgICAgIGlmKCAhYW5zd2VyICkgcmV0dXJuOw0KLSAgICAgICAgQ29yZXMudW5sb2FkKHtjb3JlOiAkc2NvcGUuc2VsZWN0ZWRDb3JlfSwgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgICAkbG9jYXRpb24ucGF0aCgiL35jb3JlcyIpOw0KLSAgICAgICAgfSk7DQotICAgICAgfTsNCi0NCi0gICAgICAkc2NvcGUuc2hvd1JlbmFtZUNvcmUgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICRzY29wZS5oaWRlQWxsKCk7DQotICAgICAgICAkc2NvcGUuc2hvd1JlbmFtZSA9IHRydWU7DQotICAgICAgfTsNCi0NCi0gICAgICAkc2NvcGUucmVuYW1lQ29yZSA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgaWYgKCEkc2NvcGUub3RoZXIpIHsNCi0gICAgICAgICAgJHNjb3BlLnJlbmFtZU1lc3NhZ2UgPSAiUGxlYXNlIHByb3ZpZGUgYSBuZXcgbmFtZSBmb3IgdGhlICIgKyAkc2NvcGUuc2VsZWN0ZWRDb3JlICsgIiBjb3JlIjsNCi0gICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLm90aGVyID09ICRzY29wZS5zZWxlY3RlZENvcmUpIHsNCi0gICAgICAgICAgJHNjb3BlLnJlbmFtZU1lc3NhZ2UgPSAiTmV3IG5hbWUgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmUiOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgQ29yZXMucmVuYW1lKHtjb3JlOiRzY29wZS5zZWxlY3RlZENvcmUsIG90aGVyOiAkc2NvcGUub3RoZXJ9LCBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoIi9+Y29yZXMvIiArICRzY29wZS5vdGhlcik7DQotICAgICAgICAgICAgJHNjb3BlLmNhbmNlbFJlbmFtZSgpOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0gICAgICB9Ow0KLQ0KLSAgICAgICRzY29wZS5jYW5jZWxSZW5hbWVDb3JlID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAkc2NvcGUuc2hvd1JlbmFtZSA9IGZhbHNlOw0KLSAgICAgICAgZGVsZXRlICRzY29wZS5yZW5hbWVNZXNzYWdlOw0KLSAgICAgICAgJHNjb3BlLm90aGVyID0gIiI7DQotICAgICAgfTsNCi0NCi0gICAgICAkc2NvcGUuc2hvd1N3YXBDb3JlcyA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgJHNjb3BlLmhpZGVBbGwoKTsNCi0gICAgICAgICRzY29wZS5zaG93U3dhcCA9IHRydWU7DQotICAgICAgfTsNCi0NCi0gICAgICAkc2NvcGUuc3dhcENvcmVzID0gZnVuY3Rpb24oKSB7DQotICAgICAgICBpZiAoISRzY29wZS5zd2FwT3RoZXIpIHsNCi0gICAgICAgICAgJHNjb3BlLnN3YXBNZXNzYWdlID0gIlBsZWFzZSBzZWxlY3QgYSBjb3JlIHRvIHN3YXAgd2l0aCI7DQotICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS5zd2FwT3RoZXIgPT0gJHNjb3BlLnNlbGVjdGVkQ29yZSkgew0KLSAgICAgICAgICAkc2NvcGUuc3dhcE1lc3NhZ2UgPSAiQ2Fubm90IHN3YXAgd2l0aCB0aGUgc2FtZSBjb3JlIjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIENvcmVzLnN3YXAoe2NvcmU6ICRzY29wZS5zZWxlY3RlZENvcmUsIG90aGVyOiAkc2NvcGUuc3dhcE90aGVyfSwgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCIvfmNvcmVzLyIgKyAkc2NvcGUuc3dhcE90aGVyKTsNCi0gICAgICAgICAgICBkZWxldGUgJHNjb3BlLnN3YXBPdGhlcjsNCi0gICAgICAgICAgICAkc2NvcGUuY2FuY2VsU3dhcENvcmVzKCk7DQotICAgICAgICAgIH0pOw0KLSAgICAgICAgfQ0KLSAgICAgIH07DQotDQotICAgICAgJHNjb3BlLmNhbmNlbFN3YXBDb3JlcyA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgZGVsZXRlICRzY29wZS5zd2FwTWVzc2FnZTsNCi0gICAgICAgICRzY29wZS5zaG93U3dhcCA9IGZhbHNlOw0KLSAgICAgIH0NCi0NCi0gICAgICAkc2NvcGUucmVsb2FkQ29yZSA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgaWYgKCRzY29wZS5pbml0RmFpbHVyZXNbJHNjb3BlLnNlbGVjdGVkQ29yZV0pIHsNCi0gICAgICAgICAgZGVsZXRlICRzY29wZS5pbml0RmFpbHVyZXNbJHNjb3BlLnNlbGVjdGVkQ29yZV07DQotICAgICAgICAgICRzY29wZS5zaG93SW5pdEZhaWx1cmVzID0gT2JqZWN0LmtleXMoZGF0YS5pbml0RmFpbHVyZXMpLmxlbmd0aD4wOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQ29yZXMucmVsb2FkKHtjb3JlOiAkc2NvcGUuc2VsZWN0ZWRDb3JlfSwNCi0gICAgICAgICAgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7DQotICAgICAgICAgICAgICAkc2NvcGUucmVsb2FkRmFpbHVyZSA9IHRydWU7DQotICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgJHNjb3BlLnJlbG9hZEZhaWx1cmUgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgJHJvdXRlLnJlbG9hZCgpOw0KLSAgICAgICAgICAgICAgfSwgMTAwMCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICRzY29wZS5yZWxvYWRTdWNjZXNzID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICAgICAgJHNjb3BlLnJlbG9hZFN1Y2Nlc3MgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgJHJvdXRlLnJlbG9hZCgpOw0KLSAgICAgICAgICAgICAgfSwgMTAwMCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9KTsNCi0gICAgICB9Ow0KLQ0KLSAgICAgICRzY29wZS5oaWRlQWxsID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAkc2NvcGUuc2hvd1JlbmFtZSA9IGZhbHNlOw0KLSAgICAgICAgJHNjb3BlLnNob3dBZGQgPSBmYWxzZTsNCi0gICAgICAgICRzY29wZS5zaG93U3dhcCA9IGZhbHNlOw0KLSAgICAgIH07DQotDQotICAgICAgJHNjb3BlLm9wdGltaXplQ29yZSA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgVXBkYXRlLm9wdGltaXplKHtjb3JlOiAkc2NvcGUuc2VsZWN0ZWRDb3JlfSwNCi0gICAgICAgICAgZnVuY3Rpb24oc3VjY2Vzc0RhdGEpIHsNCi0gICAgICAgICAgICAkc2NvcGUub3B0aW1pemVTdWNjZXNzID0gdHJ1ZTsNCi0gICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbigpIHskc2NvcGUub3B0aW1pemVTdWNjZXNzPWZhbHNlfSwgMTAwMCk7DQotICAgICAgICAgICAgJHNjb3BlLnJlZnJlc2goKTsNCi0gICAgICAgICAgfSwNCi0gICAgICAgICAgZnVuY3Rpb24oZmFpbHVyZURhdGEpIHsNCi0gICAgICAgICAgICAkc2NvcGUub3B0aW1pemVGYWlsdXJlID0gdHJ1ZTsNCi0gICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7JHNjb3BlLm9wdGltaXplRmFpbHVyZT1mYWxzZX0sIDEwMDApOw0KLSAgICAgICAgICAgICRzY29wZS5yZWZyZXNoKCk7DQotICAgICAgICAgIH0pOw0KLSAgICAgIH07DQotDQotICAgICAgJHNjb3BlLnJlZnJlc2goKTsNCi0gICAgfQ0KLSk7DQotDQotLyoqKioqKioqKioqKioqDQotICAnY29yZXNfbG9hZF9kYXRhJywNCi0gIGZ1bmN0aW9uKCBldmVudCwgcGFyYW1zICkNCi0gIHsNCi0gICAgJC5hamF4DQotICAgICgNCi0gICAgICB7DQotICAgICAgICB1cmwgOiBhcHAuY29uZmlnLnNvbHJfcGF0aCArIGFwcC5jb25maWcuY29yZV9hZG1pbl9wYXRoICsgJz93dD1qc29uJywNCi0gICAgICAgIGRhdGFUeXBlIDogJ2pzb24nLA0KLSAgICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKCByZXNwb25zZSwgdGV4dF9zdGF0dXMsIHhociApDQotICAgICAgICB7DQotICAgICAgICAgIGlmKCBwYXJhbXMub25seV9mYWlsdXJlcyApDQotICAgICAgICAgIHsNCi0gICAgICAgICAgICBhcHAuY2hlY2tfZm9yX2luaXRfZmFpbHVyZXMoIHJlc3BvbnNlICk7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgIH0NCi0NCi0NCi09PT09PT09PT09PSBOTyBDT1JFUw0KLSAgICAgICAgZXJyb3IgOiBmdW5jdGlvbigpDQotICAgICAgICB7DQotICAgICAgICAgIHNhbW15LnRyaWdnZXINCi0gICAgICAgICAgKA0KLSAgICAgICAgICAgICdjb3Jlc19sb2FkX3RlbXBsYXRlJywNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICBjb250ZW50X2VsZW1lbnQgOiBjb250ZW50X2VsZW1lbnQsDQotICAgICAgICAgICAgICBjYWxsYmFjayA6IGZ1bmN0aW9uKCkNCi0gICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFyIGNvcmVzX2VsZW1lbnQgPSAkKCAnI2NvcmVzJywgY29udGVudF9lbGVtZW50ICk7DQotICAgICAgICAgICAgICAgIHZhciBuYXZpZ2F0aW9uX2VsZW1lbnQgPSAkKCAnI25hdmlnYXRpb24nLCBjb3Jlc19lbGVtZW50ICk7DQotICAgICAgICAgICAgICAgIHZhciBkYXRhX2VsZW1lbnQgPSAkKCAnI2RhdGEnLCBjb3Jlc19lbGVtZW50ICk7DQotICAgICAgICAgICAgICAgIHZhciBjb3JlX2RhdGFfZWxlbWVudCA9ICQoICcjY29yZS1kYXRhJywgZGF0YV9lbGVtZW50ICk7DQotICAgICAgICAgICAgICAgIHZhciBpbmRleF9kYXRhX2VsZW1lbnQgPSAkKCAnI2luZGV4LWRhdGEnLCBkYXRhX2VsZW1lbnQgKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gbGF5b3V0DQotDQotICAgICAgICAgICAgICAgIHZhciB1aV9ibG9jayA9ICQoICcjdWktYmxvY2snICk7DQotICAgICAgICAgICAgICAgIHZhciBhY3Rpb25zX2VsZW1lbnQgPSAkKCAnLmFjdGlvbnMnLCBjb3Jlc19lbGVtZW50ICk7DQotICAgICAgICAgICAgICAgIHZhciBkaXZfYWN0aW9uID0gJCggJ2Rpdi5hY3Rpb24nLCBhY3Rpb25zX2VsZW1lbnQgKTsNCi0NCi0gICAgICAgICAgICAgICAgdWlfYmxvY2sNCi0gICAgICAgICAgICAgICAgICAuY3NzKCAnb3BhY2l0eScsIDAuNyApDQotICAgICAgICAgICAgICAgICAgLndpZHRoKCBjb3Jlc19lbGVtZW50LndpZHRoKCkgKyAxMCApDQotICAgICAgICAgICAgICAgICAgLmhlaWdodCggY29yZXNfZWxlbWVudC5oZWlnaHQoKSApOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiggJCggJyNjbG91ZC5nbG9iYWwnICkuaXMoICc6dmlzaWJsZScgKSApDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAkKCAnLmNsb3VkJywgZGl2X2FjdGlvbiApDQotICAgICAgICAgICAgICAgICAgICAuc2hvdygpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICQoICdidXR0b24uYWN0aW9uJywgYWN0aW9uc19lbGVtZW50ICkNCi0gICAgICAgICAgICAgICAgICAuZGllKCAnY2xpY2snICkNCi0gICAgICAgICAgICAgICAgICAubGl2ZQ0KLSAgICAgICAgICAgICAgICAgICgNCi0gICAgICAgICAgICAgICAgICAgICdjbGljaycsDQotICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiggZXZlbnQgKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9ICQoIHRoaXMgKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgc2VsZg0KLSAgICAgICAgICAgICAgICAgICAgICAgIC50b2dnbGVDbGFzcyggJ29wZW4nICk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICQoICcuYWN0aW9uLicgKyBzZWxmLmF0dHIoICdpZCcgKSwgYWN0aW9uc19lbGVtZW50ICkNCi0gICAgICAgICAgICAgICAgICAgICAgICAudHJpZ2dlciggJ29wZW4nICk7DQotDQotICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICApOw0KLQ0KLSAgICAgICAgICAgICAgICBkaXZfYWN0aW9uDQotICAgICAgICAgICAgICAgICAgLmRpZSggJ2Nsb3NlJyApDQotICAgICAgICAgICAgICAgICAgLmxpdmUNCi0gICAgICAgICAgICAgICAgICAoDQotICAgICAgICAgICAgICAgICAgICAnY2xvc2UnLA0KLSAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oIGV2ZW50ICkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgZGl2X2FjdGlvbi5oaWRlKCk7DQotICAgICAgICAgICAgICAgICAgICAgIHVpX2Jsb2NrLmhpZGUoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICApDQotICAgICAgICAgICAgICAgICAgLmRpZSggJ29wZW4nICkNCi0gICAgICAgICAgICAgICAgICAubGl2ZQ0KLSAgICAgICAgICAgICAgICAgICgNCi0gICAgICAgICAgICAgICAgICAgICdvcGVuJywNCi0gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCBldmVudCApDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gJCggdGhpcyApOw0KLSAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVsID0gJCggJyMnICsgc2VsZi5kYXRhKCAncmVsJyApICk7DQotDQotICAgICAgICAgICAgICAgICAgICAgIHNlbGYNCi0gICAgICAgICAgICAgICAgICAgICAgICAudHJpZ2dlciggJ2Nsb3NlJyApDQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5jc3MoICdsZWZ0JywgcmVsLnBvc2l0aW9uKCkubGVmdCApOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICB1aV9ibG9jaw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgKTsNCi0NCi0gICAgICAgICAgICAgICAgJCggJ2Zvcm0gYnV0dG9uLnJlc2V0JywgYWN0aW9uc19lbGVtZW50ICkNCi0gICAgICAgICAgICAgICAgICAuZGllKCAnY2xpY2snICkNCi0gICAgICAgICAgICAgICAgICAubGl2ZQ0KLSAgICAgICAgICAgICAgICAgICgNCi0gICAgICAgICAgICAgICAgICAgICdjbGljaycsDQotICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiggZXZlbnQgKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAkKCB0aGlzICkuY2xvc2VzdCggJ2Rpdi5hY3Rpb24nICkNCi0gICAgICAgICAgICAgICAgICAgICAgICAudHJpZ2dlciggJ2Nsb3NlJyApOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICk7DQotDQotICAgICAgICAgICAgICAgICQoICdmb3JtJywgZGl2X2FjdGlvbiApDQotICAgICAgICAgICAgICAgICAgLmFqYXhGb3JtDQotICAgICAgICAgICAgICAgICAgKA0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICB1cmwgOiBhcHAuY29uZmlnLnNvbHJfcGF0aCArIGFwcC5jb25maWcuY29yZV9hZG1pbl9wYXRoICsgJz93dD1qc29uJmluZGV4SW5mbz1mYWxzZScsDQotICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlIDogJ2pzb24nLA0KLSAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVTdWJtaXQgOiBmdW5jdGlvbiggYXJyYXksIGZvcm0sIG9wdGlvbnMgKQ0KLSAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgJCggJ2J1dHRvblt0eXBlPSJzdWJtaXQiXSBzcGFuJywgZm9ybSApDQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoICdsb2FkZXInICk7DQotICAgICAgICAgICAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgOiBmdW5jdGlvbiggcmVzcG9uc2UsIHN0YXR1c190ZXh0LCB4aHIsIGZvcm0gKQ0KLSAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFwcC5jb3Jlc19kYXRhOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbW15LnJlZnJlc2goKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAkKCAnYnV0dG9uLnJlc2V0JywgZm9ybSApDQotICAgICAgICAgICAgICAgICAgICAgICAgICAudHJpZ2dlciggJ2NsaWNrJyApOw0KLSAgICAgICAgICAgICAgICAgICAgICB9LA0KLSAgICAgICAgICAgICAgICAgICAgICBlcnJvciA6IGZ1bmN0aW9uKCB4aHIsIHRleHRfc3RhdHVzLCBlcnJvcl90aHJvd24gKQ0KLSAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBldmFsKCAncmVzcG9uc2UgPSAnICsgeGhyLnJlc3BvbnNlVGV4dCArICc7JyApOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnJvcl9lbGVtID0gJCggJy5lcnJvcicsIGRpdl9hY3Rpb24uZmlsdGVyKCAnOnZpc2libGUnICkgKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9lbGVtLnNob3coKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAkKCAnc3BhbicsIGVycm9yX2VsZW0gKS50ZXh0KCByZXNwb25zZS5lcnJvci5tc2cgKTsNCi0gICAgICAgICAgICAgICAgICAgICAgfSwNCi0gICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUgOiBmdW5jdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAkKCAnYnV0dG9uIHNwYW4ubG9hZGVyJywgYWN0aW9uc19lbGVtZW50ICkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyggJ2xvYWRlcicgKTsNCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICk7DQotDQotICAgICAgICAgICAgICAgIC8vIC0tDQotDQotICAgICAgICAgICAgICAgICQoICcjYWRkJywgY29udGVudF9lbGVtZW50ICkNCi0gICAgICAgICAgICAgICAgICAudHJpZ2dlciggJ2NsaWNrJyApOw0KLQ0KLSAgICAgICAgICAgICAgICAkKCAnW2RhdGEtcmVsPSJhZGQiXSBpbnB1dFt0eXBlPSJ0ZXh0Il06Zmlyc3QnLCBjb250ZW50X2VsZW1lbnQgKQ0KLSAgICAgICAgICAgICAgICAgIC5mb2N1cygpOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICk7DQotICB9DQotKTsNCi0NCi0vLyAjL35jb3Jlcw0KLXNhbW15LmdldA0KLSgNCi0gIC9eI1wvKH5jb3JlcylcLy8sDQotICBmdW5jdGlvbiggY29udGV4dCApDQotICB7DQotICAgIHZhciBjb250ZW50X2VsZW1lbnQgPSAkKCAnI2NvbnRlbnQnICk7DQotDQotICAgIHZhciBwYXRoX3BhcnRzID0gdGhpcy5wYXRoLm1hdGNoKCAvXiguK1wvfmNvcmVzXC8pKC4qKSQvICk7DQotICAgIHZhciBjdXJyZW50X2NvcmUgPSBwYXRoX3BhcnRzWzJdOw0KLQ0KLSAgICBzYW1teS50cmlnZ2VyDQotICAgICgNCi0gICAgICAnY29yZXNfbG9hZF9kYXRhJywNCi0gICAgICB7DQotICAgICAgICBlcnJvciA6IGZ1bmN0aW9uKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgY29udGV4dC5yZWRpcmVjdCggJyMvJyArIGNvbnRleHQucGFyYW1zLnNwbGF0WzBdICk7DQotICAgICAgICB9LA0KLSAgICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKCBjb3JlcyApDQotICAgICAgICB7DQotICAgICAgICAgIHNhbW15LnRyaWdnZXINCi0gICAgICAgICAgKA0KLSAgICAgICAgICAgICdjb3Jlc19sb2FkX3RlbXBsYXRlJywNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICBjb250ZW50X2VsZW1lbnQgOiBjb250ZW50X2VsZW1lbnQsDQotICAgICAgICAgICAgICBjYWxsYmFjayA6IGZ1bmN0aW9uKCkNCi0gICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdmFyIGNvcmVzX2VsZW1lbnQgPSAkKCAnI2NvcmVzJywgY29udGVudF9lbGVtZW50ICk7DQotICAgICAgICAgICAgICAgIHZhciBuYXZpZ2F0aW9uX2VsZW1lbnQgPSAkKCAnI25hdmlnYXRpb24nLCBjb3Jlc19lbGVtZW50ICk7DQotICAgICAgICAgICAgICAgIHZhciBkYXRhX2VsZW1lbnQgPSAkKCAnI2RhdGEnLCBjb3Jlc19lbGVtZW50ICk7DQotICAgICAgICAgICAgICAgIHZhciBjb3JlX2RhdGFfZWxlbWVudCA9ICQoICcjY29yZS1kYXRhJywgZGF0YV9lbGVtZW50ICk7DQotICAgICAgICAgICAgICAgIHZhciBpbmRleF9kYXRhX2VsZW1lbnQgPSAkKCAnI2luZGV4LWRhdGEnLCBkYXRhX2VsZW1lbnQgKTsNCi0NCi0gICAgICAgICAgICAgICAgY29yZXNfZWxlbWVudA0KLSAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyggJ2VtcHR5JyApOw0KLQ0KLSAgICAgICAgICAgICAgICB2YXIgY29yZV9kYXRhID0gY29yZXNbY3VycmVudF9jb3JlXTsNCi0gICAgICAgICAgICAgICAgdmFyIGNvcmVfYmFzZXBhdGggPSAkKCAnIycgKyBjdXJyZW50X2NvcmUsIGFwcC5tZW51X2VsZW1lbnQgKS5hdHRyKCAnZGF0YS1iYXNlcGF0aCcgKTsNCi0NCi0gICAgICAgICAgICAgICAgdmFyIGNvcmVfbmFtZXMgPSBbXTsNCi0gICAgICAgICAgICAgICAgdmFyIGNvcmVfc2VsZWN0cyA9ICQoICcjYWN0aW9ucyBzZWxlY3QnLCBjb3Jlc19lbGVtZW50ICk7DQotDQotICAgICAgICAgICAgICAgICQoICdvcHRpb25bdmFsdWU9IicgKyBjdXJyZW50X2NvcmUgKyAnIl0nLCBjb3JlX3NlbGVjdHMuZmlsdGVyKCAnLm90aGVyJyApICkNCi0gICAgICAgICAgICAgICAgICAucmVtb3ZlKCk7DQotDQotICAgICAgICAgICAgICAgICQoICdpbnB1dFtkYXRhLWNvcmU9ImN1cnJlbnQiXScsIGNvcmVzX2VsZW1lbnQgKQ0KLSAgICAgICAgICAgICAgICAgIC52YWwoIGN1cnJlbnRfY29yZSApOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyBsYXlvdXQNCi0NCi0gICAgICAgICAgICAgICAgdmFyIHVpX2Jsb2NrID0gJCggJyN1aS1ibG9jaycgKTsNCi0gICAgICAgICAgICAgICAgdmFyIGFjdGlvbnNfZWxlbWVudCA9ICQoICcuYWN0aW9ucycsIGNvcmVzX2VsZW1lbnQgKTsNCi0gICAgICAgICAgICAgICAgdmFyIGRpdl9hY3Rpb24gPSAkKCAnZGl2LmFjdGlvbicsIGFjdGlvbnNfZWxlbWVudCApOw0KLQ0KLSAgICAgICAgICAgICAgICB1aV9ibG9jaw0KLSAgICAgICAgICAgICAgICAgIC5jc3MoICdvcGFjaXR5JywgMC43ICkNCi0gICAgICAgICAgICAgICAgICAud2lkdGgoIGNvcmVzX2VsZW1lbnQud2lkdGgoKSArIDEwICkNCi0gICAgICAgICAgICAgICAgICAuaGVpZ2h0KCBjb3Jlc19lbGVtZW50LmhlaWdodCgpICk7DQotDQotICAgICAgICAgICAgICAgIGlmKCAkKCAnI2Nsb3VkLmdsb2JhbCcgKS5pcyggJzp2aXNpYmxlJyApICkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICQoICcuY2xvdWQnLCBkaXZfYWN0aW9uICkNCi0gICAgICAgICAgICAgICAgICAgIC5zaG93KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgdmFyIGZvcm1fY2FsbGJhY2sgPSB7DQotDQotICAgICAgICAgICAgICAgICAgcmVuYW1lIDogZnVuY3Rpb24oIGZvcm0sIHJlc3BvbnNlICkNCi0gICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gcGF0aF9wYXJ0c1sxXSArICQoICdpbnB1dFtuYW1lPSJvdGhlciJdJywgZm9ybSApLnZhbCgpOw0KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWRpcmVjdCggdXJsICk7DQotICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICB9Ow0KLQ0KLSAgICAgICAgICAgICAgICAkKCAnZm9ybScsIGRpdl9hY3Rpb24gKQ0KLSAgICAgICAgICAgICAgICAgIC5hamF4Rm9ybQ0KLSAgICAgICAgICAgICAgICAgICgNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgdXJsIDogYXBwLmNvbmZpZy5zb2xyX3BhdGggKyBhcHAuY29uZmlnLmNvcmVfYWRtaW5fcGF0aCArICc/d3Q9anNvbiZpbmRleEluZm89ZmFsc2UnLA0KLSAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzIDogZnVuY3Rpb24oIHJlc3BvbnNlLCBzdGF0dXNfdGV4dCwgeGhyLCBmb3JtICkNCi0gICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSAkKCAnaW5wdXRbbmFtZT0iYWN0aW9uIl0nLCBmb3JtICkudmFsKCkudG9Mb3dlckNhc2UoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXBwLmNvcmVzX2RhdGE7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZvcm1fY2FsbGJhY2tbYWN0aW9uXSApDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtX2NhbGxiYWNrW2FjdGlvbl0oIGZvcm0sIHJlc3BvbnNlICk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1teS5yZWZyZXNoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICQoICdidXR0b24ucmVzZXQnLCBmb3JtICkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC50cmlnZ2VyKCAnY2xpY2snICk7DQotICAgICAgICAgICAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgICAgICAgKTsNCi0NCi0gICAgICAgICAgICAgICAgJCggJyNhY3Rpb25zICN1bmxvYWQnLCBjb3Jlc19lbGVtZW50ICkNCi0gICAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IGNvbmZpcm0oICdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gdW5sb2FkIENvcmUgIicgKyBjdXJyZW50X2NvcmUgKyAnIj8nICk7DQotICAgICAgICAgICAgICAgICAgICAgIGlmKCAhcmV0ICkNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgOiBhcHAuY29uZmlnLnNvbHJfcGF0aCArIGFwcC5jb25maWcuY29yZV9hZG1pbl9wYXRoICsgJz93dD1qc29uJmFjdGlvbj1VTkxPQUQmY29yZT0nICsgY3VycmVudF9jb3JlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKCByZXNwb25zZSwgdGV4dF9zdGF0dXMsIHhociApDQotICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhcHAuY29yZXNfZGF0YTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWRpcmVjdCggcGF0aF9wYXJ0c1sxXS5zdWJzdHIoIDAsIHBhdGhfcGFydHNbMV0ubGVuZ3RoIC0gMSApICk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICB9LA0KLQ0KLSAgICAgICAgICAgICAgICBvcHRpbWl6ZV9idXR0b24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA6IGNvcmVfYmFzZXBhdGggKyAnL3VwZGF0ZT9vcHRpbWl6ZT10cnVlJndhaXRGbHVzaD10cnVlJnd0PWpzb24nLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKCByZXNwb25zZSwgdGV4dF9zdGF0dXMsIHhociApDQotDQotKioqKioqLw0KKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gQHRvZG8gdGVzdCBvcHRpbWl6ZSAoZGVsZXRlIHN0dWZmLCB3YXRjaCBidXR0b24gYXBwZWFyLCB0ZXN0IGJ1dHRvbi9mb3JtKQorc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ0NvcmVBZG1pbkNvbnRyb2xsZXInLAorICAgIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24sICR0aW1lb3V0LCAkcm91dGUsIENvcmVzLCBVcGRhdGUsIENvbnN0YW50cyl7CisgICAgICAkc2NvcGUucmVzZXRNZW51KCJjb3JlcyIsIENvbnN0YW50cy5JU19ST09UX1BBR0UpOworICAgICAgJHNjb3BlLnNlbGVjdGVkQ29yZSA9ICRyb3V0ZVBhcmFtcy5jb3JlbmFtZTsgLy8gdXNlICdjb3JlbmFtZScgbm90ICdjb3JlJyB0byBkaXN0aW5ndWlzaCBmcm9tIC9zb2xyLzpjb3JlLworICAgICAgJHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHsKKyAgICAgICAgQ29yZXMuZ2V0KGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICB2YXIgY29yZUNvdW50ID0gMDsKKyAgICAgICAgICB2YXIgY29yZXMgPSBkYXRhLnN0YXR1czsKKyAgICAgICAgICBmb3IgKF9vYmogaW4gY29yZXMpIGNvcmVDb3VudCsrOworICAgICAgICAgICRzY29wZS5oYXNDb3JlcyA9IGNvcmVDb3VudCA+MDsKKyAgICAgICAgICBpZiAoISRzY29wZS5zZWxlY3RlZENvcmUgJiYgY29yZUNvdW50PT0wKSB7CisgICAgICAgICAgICAkc2NvcGUuc2hvd0FkZENvcmUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9IGVsc2UgaWYgKCEkc2NvcGUuc2VsZWN0ZWRDb3JlKSB7CisgICAgICAgICAgICBmb3IgKGZpcnN0Q29yZSBpbiBjb3JlcykgYnJlYWs7CisgICAgICAgICAgICAkc2NvcGUuc2VsZWN0ZWRDb3JlID0gZmlyc3RDb3JlOworICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoIi9+Y29yZXMvIiArICRzY29wZS5zZWxlY3RlZENvcmUpLnJlcGxhY2UoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgJHNjb3BlLmNvcmUgPSBjb3Jlc1skc2NvcGUuc2VsZWN0ZWRDb3JlXTsKKyAgICAgICAgICAkc2NvcGUuY29yZWxpc3QgPSBbXTsKKyAgICAgICAgICAkc2NvcGUuc3dhcENvcmVsaXN0ID0gW107CisgICAgICAgICAgZm9yICh2YXIgY29yZSBpbiBjb3JlcykgeworICAgICAgICAgICAgICRzY29wZS5jb3JlbGlzdC5wdXNoKGNvcmVzW2NvcmVdKTsKKyAgICAgICAgICAgIGlmIChjb3Jlc1tjb3JlXSAhPSAkc2NvcGUuY29yZSkgeworICAgICAgICAgICAgICAkc2NvcGUuc3dhcENvcmVsaXN0LnB1c2goY29yZXNbY29yZV0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoJHNjb3BlLnN3YXBDb3JlbGlzdC5sZW5ndGg+MCkgeworICAgICAgICAgICAgJHNjb3BlLnN3YXBPdGhlciA9ICRzY29wZS5zd2FwQ29yZWxpc3RbMF0ubmFtZTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfTsKKyAgICAgICRzY29wZS5zaG93QWRkQ29yZSA9IGZ1bmN0aW9uKCkgeworICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOworICAgICAgICAkc2NvcGUuc2hvd0FkZCA9IHRydWU7CisgICAgICAgICRzY29wZS5uZXdDb3JlID0geworICAgICAgICAgIG5hbWU6ICJuZXdfY29yZSIsCisgICAgICAgICAgZGF0YURpcjogImRhdGEiLAorICAgICAgICAgIGluc3RhbmNlRGlyOiAibmV3X2NvcmUiLAorICAgICAgICAgIGNvbmZpZzogInNvbHJjb25maWcueG1sIiwKKyAgICAgICAgICBzY2hlbWE6ICJzY2hlbWEueG1sIiwKKyAgICAgICAgICBjb2xsZWN0aW9uOiAiIiwKKyAgICAgICAgICBzaGFyZDogIiIKKyAgICAgICAgfTsKKyAgICAgIH07CisKKyAgICAgICRzY29wZS5hZGRDb3JlID0gZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICghJHNjb3BlLm5ld0NvcmUubmFtZSkgeworICAgICAgICAgICRzY29wZS5hZGRNZXNzYWdlID0gIlBsZWFzZSBwcm92aWRlIGEgY29yZSBuYW1lIjsKKyAgICAgICAgfSBlbHNlIGlmIChmYWxzZSkgeyAvL0B0b2RvIGRldGVjdCB3aGV0aGVyIGNvcmUgZXhpc3RzCisgICAgICAgICAgJHNjb3BlLkFkZE1lc3NhZ2UgPSAiQSBjb3JlIHdpdGggdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgcGFyYW1zID0geworICAgICAgICAgICAgbmFtZTogJHNjb3BlLm5ld0NvcmUubmFtZSwKKyAgICAgICAgICAgIGluc3RhbmNlRGlyOiAkc2NvcGUubmV3Q29yZS5pbnN0YW5jZURpciwKKyAgICAgICAgICAgIGNvbmZpZzogJHNjb3BlLm5ld0NvcmUuY29uZmlnLAorICAgICAgICAgICAgc2NoZW1hOiAkc2NvcGUubmV3Q29yZS5zY2hlbWEsCisgICAgICAgICAgICBkYXRhRGlyOiAkc2NvcGUubmV3Q29yZS5kYXRhRGlyCisgICAgICAgICAgfTsKKyAgICAgICAgICBpZiAoJHNjb3BlLmlzQ2xvdWQpIHsKKyAgICAgICAgICAgIHBhcmFtcy5jb2xsZWN0aW9uID0gJHNjb3BlLm5ld0NvcmUuY29sbGVjdGlvbjsKKyAgICAgICAgICAgIHBhcmFtcy5zaGFyZCA9ICRzY29wZS5uZXdDb3JlLnNoYXJkOworICAgICAgICAgIH0KKyAgICAgICAgICBDb3Jlcy5hZGQocGFyYW1zLCBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgICAkbG9jYXRpb24ucGF0aCgiL35jb3Jlcy8iICsgJHNjb3BlLm5ld0NvcmUubmFtZSk7CisgICAgICAgICAgICAkc2NvcGUuY2FuY2VsQWRkQ29yZSgpOworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9OworCisgICAgICAkc2NvcGUuY2FuY2VsQWRkQ29yZSA9IGZ1bmN0aW9uKCkgeworICAgICAgICBkZWxldGUgJHNjb3BlLmFkZE1lc3NhZ2U7CisgICAgICAgICRzY29wZS5zaG93QWRkID0gZmFsc2UKKyAgICAgIH07CisKKyAgICAgICRzY29wZS51bmxvYWRDb3JlID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBhbnN3ZXIgPSBjb25maXJtKCAnRG8geW91IHJlYWxseSB3YW50IHRvIHVubG9hZCBDb3JlICInICsgJHNjb3BlLnNlbGVjdGVkQ29yZSArICciPycgKTsKKyAgICAgICAgaWYoICFhbnN3ZXIgKSByZXR1cm47CisgICAgICAgIENvcmVzLnVubG9hZCh7Y29yZTogJHNjb3BlLnNlbGVjdGVkQ29yZX0sIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICAkbG9jYXRpb24ucGF0aCgiL35jb3JlcyIpOworICAgICAgICB9KTsKKyAgICAgIH07CisKKyAgICAgICRzY29wZS5zaG93UmVuYW1lQ29yZSA9IGZ1bmN0aW9uKCkgeworICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOworICAgICAgICAkc2NvcGUuc2hvd1JlbmFtZSA9IHRydWU7CisgICAgICB9OworCisgICAgICAkc2NvcGUucmVuYW1lQ29yZSA9IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAoISRzY29wZS5vdGhlcikgeworICAgICAgICAgICRzY29wZS5yZW5hbWVNZXNzYWdlID0gIlBsZWFzZSBwcm92aWRlIGEgbmV3IG5hbWUgZm9yIHRoZSAiICsgJHNjb3BlLnNlbGVjdGVkQ29yZSArICIgY29yZSI7CisgICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLm90aGVyID09ICRzY29wZS5zZWxlY3RlZENvcmUpIHsKKyAgICAgICAgICAkc2NvcGUucmVuYW1lTWVzc2FnZSA9ICJOZXcgbmFtZSBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IG9uZSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ29yZXMucmVuYW1lKHtjb3JlOiRzY29wZS5zZWxlY3RlZENvcmUsIG90aGVyOiAkc2NvcGUub3RoZXJ9LCBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgICAkbG9jYXRpb24ucGF0aCgiL35jb3Jlcy8iICsgJHNjb3BlLm90aGVyKTsKKyAgICAgICAgICAgICRzY29wZS5jYW5jZWxSZW5hbWUoKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgJHNjb3BlLmNhbmNlbFJlbmFtZUNvcmUgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgJHNjb3BlLnNob3dSZW5hbWUgPSBmYWxzZTsKKyAgICAgICAgZGVsZXRlICRzY29wZS5yZW5hbWVNZXNzYWdlOworICAgICAgICAkc2NvcGUub3RoZXIgPSAiIjsKKyAgICAgIH07CisKKyAgICAgICRzY29wZS5zaG93U3dhcENvcmVzID0gZnVuY3Rpb24oKSB7CisgICAgICAgICRzY29wZS5oaWRlQWxsKCk7CisgICAgICAgICRzY29wZS5zaG93U3dhcCA9IHRydWU7CisgICAgICB9OworCisgICAgICAkc2NvcGUuc3dhcENvcmVzID0gZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICghJHNjb3BlLnN3YXBPdGhlcikgeworICAgICAgICAgICRzY29wZS5zd2FwTWVzc2FnZSA9ICJQbGVhc2Ugc2VsZWN0IGEgY29yZSB0byBzd2FwIHdpdGgiOworICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS5zd2FwT3RoZXIgPT0gJHNjb3BlLnNlbGVjdGVkQ29yZSkgeworICAgICAgICAgICRzY29wZS5zd2FwTWVzc2FnZSA9ICJDYW5ub3Qgc3dhcCB3aXRoIHRoZSBzYW1lIGNvcmUiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENvcmVzLnN3YXAoe2NvcmU6ICRzY29wZS5zZWxlY3RlZENvcmUsIG90aGVyOiAkc2NvcGUuc3dhcE90aGVyfSwgZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoIi9+Y29yZXMvIiArICRzY29wZS5zd2FwT3RoZXIpOworICAgICAgICAgICAgZGVsZXRlICRzY29wZS5zd2FwT3RoZXI7CisgICAgICAgICAgICAkc2NvcGUuY2FuY2VsU3dhcENvcmVzKCk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgICRzY29wZS5jYW5jZWxTd2FwQ29yZXMgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgZGVsZXRlICRzY29wZS5zd2FwTWVzc2FnZTsKKyAgICAgICAgJHNjb3BlLnNob3dTd2FwID0gZmFsc2U7CisgICAgICB9CisKKyAgICAgICRzY29wZS5yZWxvYWRDb3JlID0gZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICgkc2NvcGUuaW5pdEZhaWx1cmVzWyRzY29wZS5zZWxlY3RlZENvcmVdKSB7CisgICAgICAgICAgZGVsZXRlICRzY29wZS5pbml0RmFpbHVyZXNbJHNjb3BlLnNlbGVjdGVkQ29yZV07CisgICAgICAgICAgJHNjb3BlLnNob3dJbml0RmFpbHVyZXMgPSBPYmplY3Qua2V5cyhkYXRhLmluaXRGYWlsdXJlcykubGVuZ3RoPjA7CisgICAgICAgIH0KKyAgICAgICAgQ29yZXMucmVsb2FkKHtjb3JlOiAkc2NvcGUuc2VsZWN0ZWRDb3JlfSwKKyAgICAgICAgICBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgICBpZiAoZGF0YS5lcnJvcikgeworICAgICAgICAgICAgICAkc2NvcGUucmVsb2FkRmFpbHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICRzY29wZS5yZWxvYWRGYWlsdXJlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgJHJvdXRlLnJlbG9hZCgpOworICAgICAgICAgICAgICB9LCAxMDAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICRzY29wZS5yZWxvYWRTdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICRzY29wZS5yZWxvYWRTdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgJHJvdXRlLnJlbG9hZCgpOworICAgICAgICAgICAgICB9LCAxMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAgIH07CisKKyAgICAgICRzY29wZS5oaWRlQWxsID0gZnVuY3Rpb24oKSB7CisgICAgICAgICRzY29wZS5zaG93UmVuYW1lID0gZmFsc2U7CisgICAgICAgICRzY29wZS5zaG93QWRkID0gZmFsc2U7CisgICAgICAgICRzY29wZS5zaG93U3dhcCA9IGZhbHNlOworICAgICAgfTsKKworICAgICAgJHNjb3BlLm9wdGltaXplQ29yZSA9IGZ1bmN0aW9uKCkgeworICAgICAgICBVcGRhdGUub3B0aW1pemUoe2NvcmU6ICRzY29wZS5zZWxlY3RlZENvcmV9LAorICAgICAgICAgIGZ1bmN0aW9uKHN1Y2Nlc3NEYXRhKSB7CisgICAgICAgICAgICAkc2NvcGUub3B0aW1pemVTdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkgeyRzY29wZS5vcHRpbWl6ZVN1Y2Nlc3M9ZmFsc2V9LCAxMDAwKTsKKyAgICAgICAgICAgICRzY29wZS5yZWZyZXNoKCk7CisgICAgICAgICAgfSwKKyAgICAgICAgICBmdW5jdGlvbihmYWlsdXJlRGF0YSkgeworICAgICAgICAgICAgJHNjb3BlLm9wdGltaXplRmFpbHVyZSA9IHRydWU7CisgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7JHNjb3BlLm9wdGltaXplRmFpbHVyZT1mYWxzZX0sIDEwMDApOworICAgICAgICAgICAgJHNjb3BlLnJlZnJlc2goKTsKKyAgICAgICAgICB9KTsKKyAgICAgIH07CisKKyAgICAgICRzY29wZS5yZWZyZXNoKCk7CisgICAgfQorKTsKKworLyoqKioqKioqKioqKioqCisgICdjb3Jlc19sb2FkX2RhdGEnLAorICBmdW5jdGlvbiggZXZlbnQsIHBhcmFtcyApCisgIHsKKyAgICAkLmFqYXgKKyAgICAoCisgICAgICB7CisgICAgICAgIHVybCA6IGFwcC5jb25maWcuc29scl9wYXRoICsgYXBwLmNvbmZpZy5jb3JlX2FkbWluX3BhdGggKyAnP3d0PWpzb24nLAorICAgICAgICBkYXRhVHlwZSA6ICdqc29uJywKKyAgICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKCByZXNwb25zZSwgdGV4dF9zdGF0dXMsIHhociApCisgICAgICAgIHsKKyAgICAgICAgICBpZiggcGFyYW1zLm9ubHlfZmFpbHVyZXMgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGFwcC5jaGVja19mb3JfaW5pdF9mYWlsdXJlcyggcmVzcG9uc2UgKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworCis9PT09PT09PT09PSBOTyBDT1JFUworICAgICAgICBlcnJvciA6IGZ1bmN0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgIHNhbW15LnRyaWdnZXIKKyAgICAgICAgICAoCisgICAgICAgICAgICAnY29yZXNfbG9hZF90ZW1wbGF0ZScsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnRlbnRfZWxlbWVudCA6IGNvbnRlbnRfZWxlbWVudCwKKyAgICAgICAgICAgICAgY2FsbGJhY2sgOiBmdW5jdGlvbigpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY29yZXNfZWxlbWVudCA9ICQoICcjY29yZXMnLCBjb250ZW50X2VsZW1lbnQgKTsKKyAgICAgICAgICAgICAgICB2YXIgbmF2aWdhdGlvbl9lbGVtZW50ID0gJCggJyNuYXZpZ2F0aW9uJywgY29yZXNfZWxlbWVudCApOworICAgICAgICAgICAgICAgIHZhciBkYXRhX2VsZW1lbnQgPSAkKCAnI2RhdGEnLCBjb3Jlc19lbGVtZW50ICk7CisgICAgICAgICAgICAgICAgdmFyIGNvcmVfZGF0YV9lbGVtZW50ID0gJCggJyNjb3JlLWRhdGEnLCBkYXRhX2VsZW1lbnQgKTsKKyAgICAgICAgICAgICAgICB2YXIgaW5kZXhfZGF0YV9lbGVtZW50ID0gJCggJyNpbmRleC1kYXRhJywgZGF0YV9lbGVtZW50ICk7CisKKyAgICAgICAgICAgICAgICAvLyBsYXlvdXQKKworICAgICAgICAgICAgICAgIHZhciB1aV9ibG9jayA9ICQoICcjdWktYmxvY2snICk7CisgICAgICAgICAgICAgICAgdmFyIGFjdGlvbnNfZWxlbWVudCA9ICQoICcuYWN0aW9ucycsIGNvcmVzX2VsZW1lbnQgKTsKKyAgICAgICAgICAgICAgICB2YXIgZGl2X2FjdGlvbiA9ICQoICdkaXYuYWN0aW9uJywgYWN0aW9uc19lbGVtZW50ICk7CisKKyAgICAgICAgICAgICAgICB1aV9ibG9jaworICAgICAgICAgICAgICAgICAgLmNzcyggJ29wYWNpdHknLCAwLjcgKQorICAgICAgICAgICAgICAgICAgLndpZHRoKCBjb3Jlc19lbGVtZW50LndpZHRoKCkgKyAxMCApCisgICAgICAgICAgICAgICAgICAuaGVpZ2h0KCBjb3Jlc19lbGVtZW50LmhlaWdodCgpICk7CisKKyAgICAgICAgICAgICAgICBpZiggJCggJyNjbG91ZC5nbG9iYWwnICkuaXMoICc6dmlzaWJsZScgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgJCggJy5jbG91ZCcsIGRpdl9hY3Rpb24gKQorICAgICAgICAgICAgICAgICAgICAuc2hvdygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICQoICdidXR0b24uYWN0aW9uJywgYWN0aW9uc19lbGVtZW50ICkKKyAgICAgICAgICAgICAgICAgIC5kaWUoICdjbGljaycgKQorICAgICAgICAgICAgICAgICAgLmxpdmUKKyAgICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgJ2NsaWNrJywKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oIGV2ZW50ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gJCggdGhpcyApOworCisgICAgICAgICAgICAgICAgICAgICAgc2VsZgorICAgICAgICAgICAgICAgICAgICAgICAgLnRvZ2dsZUNsYXNzKCAnb3BlbicgKTsKKworICAgICAgICAgICAgICAgICAgICAgICQoICcuYWN0aW9uLicgKyBzZWxmLmF0dHIoICdpZCcgKSwgYWN0aW9uc19lbGVtZW50ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIC50cmlnZ2VyKCAnb3BlbicgKTsKKworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIGRpdl9hY3Rpb24KKyAgICAgICAgICAgICAgICAgIC5kaWUoICdjbG9zZScgKQorICAgICAgICAgICAgICAgICAgLmxpdmUKKyAgICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgJ2Nsb3NlJywKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oIGV2ZW50ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGRpdl9hY3Rpb24uaGlkZSgpOworICAgICAgICAgICAgICAgICAgICAgIHVpX2Jsb2NrLmhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgLmRpZSggJ29wZW4nICkKKyAgICAgICAgICAgICAgICAgIC5saXZlCisgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICdvcGVuJywKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oIGV2ZW50ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gJCggdGhpcyApOworICAgICAgICAgICAgICAgICAgICAgIHZhciByZWwgPSAkKCAnIycgKyBzZWxmLmRhdGEoICdyZWwnICkgKTsKKworICAgICAgICAgICAgICAgICAgICAgIHNlbGYKKyAgICAgICAgICAgICAgICAgICAgICAgIC50cmlnZ2VyKCAnY2xvc2UnICkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jc3MoICdsZWZ0JywgcmVsLnBvc2l0aW9uKCkubGVmdCApOworCisgICAgICAgICAgICAgICAgICAgICAgdWlfYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAkKCAnZm9ybSBidXR0b24ucmVzZXQnLCBhY3Rpb25zX2VsZW1lbnQgKQorICAgICAgICAgICAgICAgICAgLmRpZSggJ2NsaWNrJyApCisgICAgICAgICAgICAgICAgICAubGl2ZQorICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAnY2xpY2snLAorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiggZXZlbnQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgJCggdGhpcyApLmNsb3Nlc3QoICdkaXYuYWN0aW9uJyApCisgICAgICAgICAgICAgICAgICAgICAgICAudHJpZ2dlciggJ2Nsb3NlJyApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgJCggJ2Zvcm0nLCBkaXZfYWN0aW9uICkKKyAgICAgICAgICAgICAgICAgIC5hamF4Rm9ybQorICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgdXJsIDogYXBwLmNvbmZpZy5zb2xyX3BhdGggKyBhcHAuY29uZmlnLmNvcmVfYWRtaW5fcGF0aCArICc/d3Q9anNvbiZpbmRleEluZm89ZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlIDogJ2pzb24nLAorICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZVN1Ym1pdCA6IGZ1bmN0aW9uKCBhcnJheSwgZm9ybSwgb3B0aW9ucyApCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgJCggJ2J1dHRvblt0eXBlPSJzdWJtaXQiXSBzcGFuJywgZm9ybSApCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyggJ2xvYWRlcicgKTsKKyAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgOiBmdW5jdGlvbiggcmVzcG9uc2UsIHN0YXR1c190ZXh0LCB4aHIsIGZvcm0gKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhcHAuY29yZXNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbW15LnJlZnJlc2goKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgJCggJ2J1dHRvbi5yZXNldCcsIGZvcm0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAudHJpZ2dlciggJ2NsaWNrJyApOworICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgOiBmdW5jdGlvbiggeGhyLCB0ZXh0X3N0YXR1cywgZXJyb3JfdGhyb3duICkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgZXZhbCggJ3Jlc3BvbnNlID0gJyArIHhoci5yZXNwb25zZVRleHQgKyAnOycgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yX2VsZW0gPSAkKCAnLmVycm9yJywgZGl2X2FjdGlvbi5maWx0ZXIoICc6dmlzaWJsZScgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfZWxlbS5zaG93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkKCAnc3BhbicsIGVycm9yX2VsZW0gKS50ZXh0KCByZXNwb25zZS5lcnJvci5tc2cgKTsKKyAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlIDogZnVuY3Rpb24oKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICQoICdidXR0b24gc3Bhbi5sb2FkZXInLCBhY3Rpb25zX2VsZW1lbnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoICdsb2FkZXInICk7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgLy8gLS0KKworICAgICAgICAgICAgICAgICQoICcjYWRkJywgY29udGVudF9lbGVtZW50ICkKKyAgICAgICAgICAgICAgICAgIC50cmlnZ2VyKCAnY2xpY2snICk7CisKKyAgICAgICAgICAgICAgICAkKCAnW2RhdGEtcmVsPSJhZGQiXSBpbnB1dFt0eXBlPSJ0ZXh0Il06Zmlyc3QnLCBjb250ZW50X2VsZW1lbnQgKQorICAgICAgICAgICAgICAgICAgLmZvY3VzKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICApOworICAgICAgICB9CisgICAgICB9CisgICAgKTsKKyAgfQorKTsKKworLy8gIy9+Y29yZXMKK3NhbW15LmdldAorKAorICAvXiNcLyh+Y29yZXMpXC8vLAorICBmdW5jdGlvbiggY29udGV4dCApCisgIHsKKyAgICB2YXIgY29udGVudF9lbGVtZW50ID0gJCggJyNjb250ZW50JyApOworCisgICAgdmFyIHBhdGhfcGFydHMgPSB0aGlzLnBhdGgubWF0Y2goIC9eKC4rXC9+Y29yZXNcLykoLiopJC8gKTsKKyAgICB2YXIgY3VycmVudF9jb3JlID0gcGF0aF9wYXJ0c1syXTsKKworICAgIHNhbW15LnRyaWdnZXIKKyAgICAoCisgICAgICAnY29yZXNfbG9hZF9kYXRhJywKKyAgICAgIHsKKyAgICAgICAgZXJyb3IgOiBmdW5jdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICBjb250ZXh0LnJlZGlyZWN0KCAnIy8nICsgY29udGV4dC5wYXJhbXMuc3BsYXRbMF0gKTsKKyAgICAgICAgfSwKKyAgICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKCBjb3JlcyApCisgICAgICAgIHsKKyAgICAgICAgICBzYW1teS50cmlnZ2VyCisgICAgICAgICAgKAorICAgICAgICAgICAgJ2NvcmVzX2xvYWRfdGVtcGxhdGUnLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb250ZW50X2VsZW1lbnQgOiBjb250ZW50X2VsZW1lbnQsCisgICAgICAgICAgICAgIGNhbGxiYWNrIDogZnVuY3Rpb24oKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNvcmVzX2VsZW1lbnQgPSAkKCAnI2NvcmVzJywgY29udGVudF9lbGVtZW50ICk7CisgICAgICAgICAgICAgICAgdmFyIG5hdmlnYXRpb25fZWxlbWVudCA9ICQoICcjbmF2aWdhdGlvbicsIGNvcmVzX2VsZW1lbnQgKTsKKyAgICAgICAgICAgICAgICB2YXIgZGF0YV9lbGVtZW50ID0gJCggJyNkYXRhJywgY29yZXNfZWxlbWVudCApOworICAgICAgICAgICAgICAgIHZhciBjb3JlX2RhdGFfZWxlbWVudCA9ICQoICcjY29yZS1kYXRhJywgZGF0YV9lbGVtZW50ICk7CisgICAgICAgICAgICAgICAgdmFyIGluZGV4X2RhdGFfZWxlbWVudCA9ICQoICcjaW5kZXgtZGF0YScsIGRhdGFfZWxlbWVudCApOworCisgICAgICAgICAgICAgICAgY29yZXNfZWxlbWVudAorICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCAnZW1wdHknICk7CisKKyAgICAgICAgICAgICAgICB2YXIgY29yZV9kYXRhID0gY29yZXNbY3VycmVudF9jb3JlXTsKKyAgICAgICAgICAgICAgICB2YXIgY29yZV9iYXNlcGF0aCA9ICQoICcjJyArIGN1cnJlbnRfY29yZSwgYXBwLm1lbnVfZWxlbWVudCApLmF0dHIoICdkYXRhLWJhc2VwYXRoJyApOworCisgICAgICAgICAgICAgICAgdmFyIGNvcmVfbmFtZXMgPSBbXTsKKyAgICAgICAgICAgICAgICB2YXIgY29yZV9zZWxlY3RzID0gJCggJyNhY3Rpb25zIHNlbGVjdCcsIGNvcmVzX2VsZW1lbnQgKTsKKworICAgICAgICAgICAgICAgICQoICdvcHRpb25bdmFsdWU9IicgKyBjdXJyZW50X2NvcmUgKyAnIl0nLCBjb3JlX3NlbGVjdHMuZmlsdGVyKCAnLm90aGVyJyApICkKKyAgICAgICAgICAgICAgICAgIC5yZW1vdmUoKTsKKworICAgICAgICAgICAgICAgICQoICdpbnB1dFtkYXRhLWNvcmU9ImN1cnJlbnQiXScsIGNvcmVzX2VsZW1lbnQgKQorICAgICAgICAgICAgICAgICAgLnZhbCggY3VycmVudF9jb3JlICk7CisKKyAgICAgICAgICAgICAgICAvLyBsYXlvdXQKKworICAgICAgICAgICAgICAgIHZhciB1aV9ibG9jayA9ICQoICcjdWktYmxvY2snICk7CisgICAgICAgICAgICAgICAgdmFyIGFjdGlvbnNfZWxlbWVudCA9ICQoICcuYWN0aW9ucycsIGNvcmVzX2VsZW1lbnQgKTsKKyAgICAgICAgICAgICAgICB2YXIgZGl2X2FjdGlvbiA9ICQoICdkaXYuYWN0aW9uJywgYWN0aW9uc19lbGVtZW50ICk7CisKKyAgICAgICAgICAgICAgICB1aV9ibG9jaworICAgICAgICAgICAgICAgICAgLmNzcyggJ29wYWNpdHknLCAwLjcgKQorICAgICAgICAgICAgICAgICAgLndpZHRoKCBjb3Jlc19lbGVtZW50LndpZHRoKCkgKyAxMCApCisgICAgICAgICAgICAgICAgICAuaGVpZ2h0KCBjb3Jlc19lbGVtZW50LmhlaWdodCgpICk7CisKKyAgICAgICAgICAgICAgICBpZiggJCggJyNjbG91ZC5nbG9iYWwnICkuaXMoICc6dmlzaWJsZScgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgJCggJy5jbG91ZCcsIGRpdl9hY3Rpb24gKQorICAgICAgICAgICAgICAgICAgICAuc2hvdygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBmb3JtX2NhbGxiYWNrID0geworCisgICAgICAgICAgICAgICAgICByZW5hbWUgOiBmdW5jdGlvbiggZm9ybSwgcmVzcG9uc2UgKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gcGF0aF9wYXJ0c1sxXSArICQoICdpbnB1dFtuYW1lPSJvdGhlciJdJywgZm9ybSApLnZhbCgpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZGlyZWN0KCB1cmwgKTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAkKCAnZm9ybScsIGRpdl9hY3Rpb24gKQorICAgICAgICAgICAgICAgICAgLmFqYXhGb3JtCisgICAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICB1cmwgOiBhcHAuY29uZmlnLnNvbHJfcGF0aCArIGFwcC5jb25maWcuY29yZV9hZG1pbl9wYXRoICsgJz93dD1qc29uJmluZGV4SW5mbz1mYWxzZScsCisgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKCByZXNwb25zZSwgc3RhdHVzX3RleHQsIHhociwgZm9ybSApCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9ICQoICdpbnB1dFtuYW1lPSJhY3Rpb24iXScsIGZvcm0gKS52YWwoKS50b0xvd2VyQ2FzZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXBwLmNvcmVzX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmb3JtX2NhbGxiYWNrW2FjdGlvbl0gKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1fY2FsbGJhY2tbYWN0aW9uXSggZm9ybSwgcmVzcG9uc2UgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtbXkucmVmcmVzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAkKCAnYnV0dG9uLnJlc2V0JywgZm9ybSApCisgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmlnZ2VyKCAnY2xpY2snICk7CisgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAkKCAnI2FjdGlvbnMgI3VubG9hZCcsIGNvcmVzX2VsZW1lbnQgKQorICAgICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBjb25maXJtKCAnRG8geW91IHJlYWxseSB3YW50IHRvIHVubG9hZCBDb3JlICInICsgY3VycmVudF9jb3JlICsgJyI/JyApOworICAgICAgICAgICAgICAgICAgICAgIGlmKCAhcmV0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgOiBhcHAuY29uZmlnLnNvbHJfcGF0aCArIGFwcC5jb25maWcuY29yZV9hZG1pbl9wYXRoICsgJz93dD1qc29uJmFjdGlvbj1VTkxPQUQmY29yZT0nICsgY3VycmVudF9jb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzIDogZnVuY3Rpb24oIHJlc3BvbnNlLCB0ZXh0X3N0YXR1cywgeGhyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhcHAuY29yZXNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZGlyZWN0KCBwYXRoX3BhcnRzWzFdLnN1YnN0ciggMCwgcGF0aF9wYXJ0c1sxXS5sZW5ndGggLSAxICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgIG9wdGltaXplX2J1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgOiBjb3JlX2Jhc2VwYXRoICsgJy91cGRhdGU/b3B0aW1pemU9dHJ1ZSZ3YWl0Rmx1c2g9dHJ1ZSZ3dD1qc29uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA6IGZ1bmN0aW9uKCByZXNwb25zZSwgdGV4dF9zdGF0dXMsIHhociApCisKKyoqKioqKi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2RhdGFpbXBvcnQuanMgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9kYXRhaW1wb3J0LmpzCmluZGV4IGQ2ZmY3MTIuLmQ4ZmJjNGYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2RhdGFpbXBvcnQuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvZGF0YWltcG9ydC5qcwpAQCAtMSwzMDMgKzEsMzAzIEBACi0vKg0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotDQotdmFyIGRhdGFpbXBvcnRfdGltZW91dCA9IDIwMDA7DQotDQotc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ0RhdGFJbXBvcnRDb250cm9sbGVyJywNCi0gICAgZnVuY3Rpb24oJHNjb3BlLCAkcm9vdFNjb3BlLCAkcm91dGVQYXJhbXMsICRsb2NhdGlvbiwgJHRpbWVvdXQsICRpbnRlcnZhbCwgJGNvb2tpZXMsIE1iZWFucywgRGF0YUltcG9ydCwgQ29uc3RhbnRzKSB7DQotICAgICAgICAkc2NvcGUucmVzZXRNZW51KCJkYXRhaW1wb3J0IiwgQ29uc3RhbnRzLklTX0NPTExFQ1RJT05fUEFHRSk7DQotDQotICAgICAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICBNYmVhbnMuaW5mbyh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmUsIGNhdDogJ1FVRVJZSEFORExFUid9LCBmdW5jdGlvbiAoZGF0YSkgew0KLSAgICAgICAgICAgICAgICB2YXIgbWJlYW5zID0gZGF0YVsnc29sci1tYmVhbnMnXVsxXTsNCi0gICAgICAgICAgICAgICAgJHNjb3BlLmhhbmRsZXJzID0gW107DQotICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBtYmVhbnMpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYmVhbnNba2V5XVsnY2xhc3MnXSAhPT0ga2V5ICYmIG1iZWFuc1trZXldWydjbGFzcyddID09PSAnb3JnLmFwYWNoZS5zb2xyLmhhbmRsZXIuZGF0YWltcG9ydC5EYXRhSW1wb3J0SGFuZGxlcicpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaGFuZGxlcnMucHVzaChrZXkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICRzY29wZS5oYXNIYW5kbGVycyA9ICRzY29wZS5oYW5kbGVycy5sZW5ndGggPiAwOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoISRyb3V0ZVBhcmFtcy5oYW5kbGVyKSB7DQotICAgICAgICAgICAgICAgICAgICAkbG9jYXRpb24ucGF0aCgiLyIgKyAkcm91dGVQYXJhbXMuY29yZSArICIvZGF0YWltcG9ydC8iICsgJHNjb3BlLmhhbmRsZXJzWzBdKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5jdXJyZW50SGFuZGxlciA9ICRyb3V0ZVBhcmFtcy5oYW5kbGVyOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotDQotICAgICAgICAgICAgJHNjb3BlLmhhbmRsZXIgPSAkcm91dGVQYXJhbXMuaGFuZGxlcjsNCi0gICAgICAgICAgICBpZiAoJHNjb3BlLmhhbmRsZXIgJiYgJHNjb3BlLmhhbmRsZXJbMF09PSIvIikgew0KLSAgICAgICAgICAgICAgICAkc2NvcGUuaGFuZGxlciA9ICRzY29wZS5oYW5kbGVyLnN1YnN0cigxKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCRzY29wZS5oYW5kbGVyKSB7DQotICAgICAgICAgICAgICAgIERhdGFJbXBvcnQuY29uZmlnKHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZSwgbmFtZTogJHNjb3BlLmhhbmRsZXJ9LCBmdW5jdGlvbiAoZGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuY29uZmlnID0gZGF0YS5jb25maWc7DQotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhtbCA9ICQucGFyc2VYTUwoZGF0YS5jb25maWcpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5lbnRpdGllcyA9IFtdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICQoJ2RvY3VtZW50ID4gZW50aXR5JywgeG1sKS5lYWNoKGZ1bmN0aW9uIChpLCBlbGVtZW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5lbnRpdGllcy5wdXNoKCQoZWxlbWVudCkuYXR0cignbmFtZScpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucmVmcmVzaFN0YXR1cygpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICRzY29wZS5sYXN0VXBkYXRlID0gInVua25vd24iOw0KLSAgICAgICAgICAgICRzY29wZS5sYXN0VXBkYXRlVVRDID0gIiI7DQotICAgICAgICB9Ow0KLQ0KLSAgICAgICAgJHNjb3BlLnRvZ2dsZURlYnVnID0gZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICAgICRzY29wZS5pc0RlYnVnTW9kZSA9ICEkc2NvcGUuaXNEZWJ1Z01vZGU7DQotICAgICAgICAgICAgaWYgKCRzY29wZS5pc0RlYnVnTW9kZSkgew0KLSAgICAgICAgICAgICAgICAvLyBhbHNvIGVuYWJsZSBEZWJ1ZyBjaGVja2JveA0KLSAgICAgICAgICAgICAgICAkc2NvcGUuZm9ybS5zaG93RGVidWcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAkc2NvcGUuc2hvd0NvbmZpZ3VyYXRpb24gPSB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgJHNjb3BlLnRvZ2dsZUNvbmZpZ3VyYXRpb24gPSBmdW5jdGlvbiAoKSB7DQotICAgICAgICAgICAgJHNjb3BlLnNob3dDb25maWd1cmF0aW9uID0gISRzY29wZS5zaG93Q29uZmlndXJhdGlvbjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgICRzY29wZS50b2dnbGVSYXdTdGF0dXMgPSBmdW5jdGlvbiAoKSB7DQotICAgICAgICAgICAgJHNjb3BlLnNob3dSYXdTdGF0dXMgPSAhJHNjb3BlLnNob3dSYXdTdGF0dXM7DQotICAgICAgICB9DQotDQotICAgICAgICAkc2NvcGUudG9nZ2xlUmF3RGVidWcgPSBmdW5jdGlvbiAoKSB7DQotICAgICAgICAgICAgJHNjb3BlLnNob3dSYXdEZWJ1ZyA9ICEkc2NvcGUuc2hvd1Jhd0RlYnVnOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgJHNjb3BlLnJlbG9hZCA9IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICBEYXRhSW1wb3J0LnJlbG9hZCh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmUsIG5hbWU6ICRzY29wZS5oYW5kbGVyfSwgZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICAgICAgICAkc2NvcGUucmVsb2FkZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUucmVsb2FkZWQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgfSwgNTAwMCk7DQotICAgICAgICAgICAgICAgICRzY29wZS5yZWZyZXNoKCk7DQotICAgICAgICAgICAgfSk7DQotICAgICAgICB9DQotDQotICAgICAgICAkc2NvcGUuZm9ybSA9IHsNCi0gICAgICAgICAgICBjb21tYW5kOiAiZnVsbC1pbXBvcnQiLA0KLSAgICAgICAgICAgIHZlcmJvc2U6IGZhbHNlLA0KLSAgICAgICAgICAgIGNsZWFuOiB0cnVlLA0KLSAgICAgICAgICAgIGNvbW1pdDogdHJ1ZSwNCi0gICAgICAgICAgICBvcHRpbWl6ZTogZmFsc2UsDQotICAgICAgICAgICAgc2hvd0RlYnVnOiBmYWxzZSwNCi0gICAgICAgICAgICBjdXN0b206ICIiLA0KLSAgICAgICAgICAgIGNvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlDQotICAgICAgICB9Ow0KLQ0KLSAgICAgICAgJHNjb3BlLnN1Ym1pdCA9IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICB2YXIgcGFyYW1zID0ge307DQotICAgICAgICAgICAgZm9yICh2YXIga2V5IGluICRzY29wZS5mb3JtKSB7DQotICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gInNob3dEZWJ1ZyIpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuZm9ybS5zaG93RGVidWcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbImRlYnVnIl0gPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2tleV0gPSAkc2NvcGUuZm9ybVtrZXldOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwYXJhbXMuY3VzdG9tLmxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICB2YXIgY3VzdG9tUGFyYW1zID0gJHNjb3BlLmZvcm0uY3VzdG9tLnNwbGl0KCImIik7DQotICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY3VzdG9tUGFyYW1zKSB7DQotICAgICAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBjdXN0b21QYXJhbXNbaV0uc3BsaXQoIj0iKTsNCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtc1twYXJ0c1swXV0gPSBwYXJ0c1sxXTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkZWxldGUgcGFyYW1zLmN1c3RvbTsNCi0NCi0gICAgICAgICAgICBpZiAoJHNjb3BlLmlzRGVidWdNb2RlKSB7DQotICAgICAgICAgICAgICAgIHBhcmFtcy5kYXRhQ29uZmlnID0gJHNjb3BlLmNvbmZpZzsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcGFyYW1zLmNvcmUgPSAkcm91dGVQYXJhbXMuY29yZTsNCi0gICAgICAgICAgICBwYXJhbXMubmFtZSA9ICRzY29wZS5oYW5kbGVyOw0KLQ0KLSAgICAgICAgICAgIERhdGFJbXBvcnQucG9zdChwYXJhbXMsIGZ1bmN0aW9uIChkYXRhKSB7DQotICAgICAgICAgICAgICAgICRzY29wZS5yYXdSZXNwb25zZSA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpOw0KLSAgICAgICAgICAgICAgICAkc2NvcGUucmVmcmVzaFN0YXR1cygpOw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfTsNCi0NCi0gICAgICAgICRzY29wZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICAkc2NvcGUuaXNBYm9ydGluZyA9IHRydWU7DQotICAgICAgICAgICAgRGF0YUltcG9ydC5hYm9ydCh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmUsIG5hbWU6ICRzY29wZS5oYW5kbGVyfSwgZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaXNBYm9ydGluZyA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnJlZnJlc2hTdGF0dXMoKTsNCi0gICAgICAgICAgICAgICAgfSwgNDAwMCk7DQotICAgICAgICAgICAgfSk7DQotICAgICAgICB9DQotDQotICAgICAgICAkc2NvcGUucmVmcmVzaFN0YXR1cyA9IGZ1bmN0aW9uICgpIHsNCi0NCi0gICAgICAgICAgICBjb25zb2xlLmxvZygiUmVmcmVzaCBTdGF0dXMiKTsNCi0NCi0gICAgICAgICAgICAkc2NvcGUuaXNTdGF0dXNMb2FkaW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICBEYXRhSW1wb3J0LnN0YXR1cyh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmUsIG5hbWU6ICRzY29wZS5oYW5kbGVyfSwgZnVuY3Rpb24gKGRhdGEpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGRhdGFbMF0gPT0gIjwiKSB7DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaGFzSGFuZGxlcnMgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTsNCi0gICAgICAgICAgICAgICAgJHNjb3BlLmxhc3RVcGRhdGUgPSBub3cudG9UaW1lU3RyaW5nKCkuc3BsaXQoJyAnKS5zaGlmdCgpOw0KLSAgICAgICAgICAgICAgICAkc2NvcGUubGFzdFVwZGF0ZVVUQyA9IG5vdy50b1VUQ1N0cmluZygpOw0KLSAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSBkYXRhLnN0YXR1c01lc3NhZ2VzOw0KLSAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZXNDb3VudCA9IDA7DQotICAgICAgICAgICAgICAgIGZvciggdmFyIGtleSBpbiBtZXNzYWdlcyApIHsgbWVzc2FnZXNDb3VudCsrOyB9DQotDQotICAgICAgICAgICAgICAgIGlmIChkYXRhLnN0YXR1cyA9PSAnYnVzeScpIHsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSAiaW5kZXhpbmciOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnRpbWVFbGFwc2VkID0gZGF0YS5zdGF0dXNNZXNzYWdlc1snVGltZSBFbGFwc2VkJ107DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZWxhcHNlZFNlY29uZHMgPSBwYXJzZVNlY29uZHMoJHNjb3BlLnRpbWVFbGFwc2VkKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIHZhciBpbmZvID0gJHNjb3BlLnRpbWVFbGFwc2VkID8gJ0luZGV4aW5nIHNpbmNlICcgKyAkc2NvcGUudGltZUVsYXBzZWQgOiAnSW5kZXhpbmcgLi4uJzsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5pbmZvID0gc2hvd0luZm8obWVzc2FnZXMsIHRydWUsIGluZm8sICRzY29wZS5lbGFwc2VkU2Vjb25kcyk7DQotDQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZXMuUm9sbGVkQmFjaykgew0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9ICJmYWlsdXJlIjsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5pbmZvID0gc2hvd0luZm8obWVzc2FnZXMsIHRydWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VzLkFib3J0ZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSAiYWJvcnRlZCI7DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaW5mbyA9IHNob3dJbmZvKG1lc3NhZ2VzLCB0cnVlLCAnQWJvcnRpbmcgY3VycmVudCBJbXBvcnQgLi4uJyk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5zdGF0dXMgPT0gImlkbGUiICYmIG1lc3NhZ2VzQ291bnQgIT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9ICJzdWNjZXNzIjsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5pbmZvID0gc2hvd0luZm8obWVzc2FnZXMsIHRydWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9ICJpZGxlIjsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5pbmZvID0gc2hvd0luZm8obWVzc2FnZXMsIGZhbHNlLCAnTm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlIChpZGxlKScpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhLiRwcm9taXNlOw0KLSAgICAgICAgICAgICAgICBkZWxldGUgZGF0YS4kcmVzb2x2ZWQ7DQotDQotICAgICAgICAgICAgICAgICRzY29wZS5yYXdTdGF0dXMgPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTsNCi0NCi0gICAgICAgICAgICAgICAgJHNjb3BlLmlzU3RhdHVzTG9hZGluZyA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAkc2NvcGUuc3RhdHVzVXBkYXRlZCA9IHRydWU7DQotICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5zdGF0dXNVcGRhdGVkID0gZmFsc2U7DQotICAgICAgICAgICAgICAgIH0sIGRhdGFpbXBvcnRfdGltZW91dCAvIDIpOw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfTsNCi0NCi0gICAgICAgICRzY29wZS51cGRhdGVBdXRvUmVmcmVzaCA9IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICAkc2NvcGUuYXV0b3JlZnJlc2ggPSAhJHNjb3BlLmF1dG9yZWZyZXNoOw0KLSAgICAgICAgICAgICRjb29raWVzLmRhdGFpbXBvcnRfYXV0b3JlZnJlc2ggPSAkc2NvcGUuYXV0b3JlZnJlc2ggPyB0cnVlIDogbnVsbDsNCi0gICAgICAgICAgICBpZiAoJHNjb3BlLmF1dG9yZWZyZXNoKSB7DQotICAgICAgICAgICAgICAgICRzY29wZS5yZWZyZXNoVGltZW91dCA9ICRpbnRlcnZhbCgkc2NvcGUucmVmcmVzaFN0YXR1cywgZGF0YWltcG9ydF90aW1lb3V0KTsNCi0gICAgICAgICAgICAgICAgdmFyIG9uUm91dGVDaGFuZ2VPZmYgPSAkc2NvcGUuJG9uKCckcm91dGVDaGFuZ2VTdGFydCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgJGludGVydmFsLmNhbmNlbCgkc2NvcGUucmVmcmVzaFRpbWVvdXQpOw0KLSAgICAgICAgICAgICAgICAgICAgb25Sb3V0ZUNoYW5nZU9mZigpOw0KLSAgICAgICAgICAgICAgICB9KTsNCi0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS5yZWZyZXNoVGltZW91dCkgew0KLSAgICAgICAgICAgICAgICAkaW50ZXJ2YWwuY2FuY2VsKCRzY29wZS5yZWZyZXNoVGltZW91dCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICRzY29wZS5yZWZyZXNoU3RhdHVzKCk7DQotICAgICAgICB9Ow0KLQ0KLSAgICAgICAgJHNjb3BlLnJlZnJlc2goKTsNCi0NCi19KTsNCi0NCi12YXIgc2hvd0luZm8gPSBmdW5jdGlvbiAobWVzc2FnZXMsIHNob3dGdWxsLCBpbmZvX3RleHQsIGVsYXBzZWRfc2Vjb25kcykgew0KLQ0KLSAgICB2YXIgaW5mbyA9IHt9Ow0KLSAgICBpZiAoaW5mb190ZXh0KSB7DQotICAgICAgICBpbmZvLnRleHQgPSBpbmZvX3RleHQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgICBpbmZvLnRleHQgPSBtZXNzYWdlc1snJ10gfHwgJyc7DQotICAgICAgICAvLyBmb3JtYXQgbnVtYmVycyBpbmNsdWRlZCBpbiBzdGF0dXMgbmljZWx5DQotICAgICAgICAvKiBAdG9kbyB0aGlzIHByZXR0eSBwcmludGluZyBpcyBoYXJkIHRvIHdvcmsgb3V0IGhvdyB0byBkbyBpbiBhbiBBbmd1bGFyZXNxdWUgd2F5Og0KLSAgICAgICAgaW5mby50ZXh0ID0gaW5mby50ZXh0LnJlcGxhY2UoL1xkezQsfS9nLA0KLSAgICAgICAgICAgIGZ1bmN0aW9uIChtYXRjaCwgcG9zaXRpb24sIHN0cmluZykgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYXBwLmZvcm1hdF9udW1iZXIocGFyc2VJbnQobWF0Y2gsIDEwKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgKTsNCi0gICAgICAgICovDQotDQotICAgICAgICB2YXIgdGltZV90YWtlbl90ZXh0ID0gbWVzc2FnZXNbJ1RpbWUgdGFrZW4nXTsNCi0gICAgICAgIGluZm8udGltZVRha2VuID0gcGFyc2VTZWNvbmRzKHRpbWVfdGFrZW5fdGV4dCk7DQotICAgIH0NCi0gICAgaW5mby5zaG93RGV0YWlscyA9IGZhbHNlOw0KLQ0KLSAgICBpZiAoc2hvd0Z1bGwpIHsNCi0gICAgICAgIGlmICghZWxhcHNlZF9zZWNvbmRzKSB7DQotICAgICAgICAgICAgdmFyIHRpbWVfdGFrZW5fdGV4dCA9IG1lc3NhZ2VzWydUaW1lIHRha2VuJ107DQotICAgICAgICAgICAgZWxhcHNlZF9zZWNvbmRzID0gcGFyc2VTZWNvbmRzKHRpbWVfdGFrZW5fdGV4dCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpbmZvLnNob3dEZXRhaWxzID0gdHJ1ZTsNCi0NCi0gICAgICAgIHZhciBkb2N1bWVudF9jb25maWcgPSB7DQotICAgICAgICAgICAgJ1JlcXVlc3RzJzogJ1RvdGFsIFJlcXVlc3RzIG1hZGUgdG8gRGF0YVNvdXJjZScsDQotICAgICAgICAgICAgJ0ZldGNoZWQnOiAnVG90YWwgUm93cyBGZXRjaGVkJywNCi0gICAgICAgICAgICAnU2tpcHBlZCc6ICdUb3RhbCBEb2N1bWVudHMgU2tpcHBlZCcsDQotICAgICAgICAgICAgJ1Byb2Nlc3NlZCc6ICdUb3RhbCBEb2N1bWVudHMgUHJvY2Vzc2VkJw0KLSAgICAgICAgfTsNCi0NCi0gICAgICAgIGluZm8uZG9jcyA9IFtdOw0KLSAgICAgICAgZm9yICh2YXIga2V5IGluIGRvY3VtZW50X2NvbmZpZykgew0KLSAgICAgICAgICAgIHZhciB2YWx1ZSA9IHBhcnNlSW50KG1lc3NhZ2VzW2RvY3VtZW50X2NvbmZpZ1trZXldXSwgMTApOw0KLSAgICAgICAgICAgIHZhciBkb2MgPSB7ZGVzYzogZG9jdW1lbnRfY29uZmlnW2tleV0sIG5hbWU6IGtleSwgdmFsdWU6IHZhbHVlfTsNCi0gICAgICAgICAgICBpZiAoZWxhcHNlZF9zZWNvbmRzICYmIGtleSAhPSAnU2tpcHBlZCcpIHsNCi0gICAgICAgICAgICAgICAgZG9jLnNwZWVkID0gTWF0aC5yb3VuZCh2YWx1ZSAvIGVsYXBzZWRfc2Vjb25kcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGluZm8uZG9jcy5wdXNoKGRvYyk7DQotICAgICAgICB9DQotDQotICAgICAgICB2YXIgZGF0ZXNfY29uZmlnID0gew0KLSAgICAgICAgICAgICdTdGFydGVkJzogJ0Z1bGwgRHVtcCBTdGFydGVkJywNCi0gICAgICAgICAgICAnQWJvcnRlZCc6ICdBYm9ydGVkJywNCi0gICAgICAgICAgICAnUm9sbGVkYmFjayc6ICdSb2xsZWRiYWNrJw0KLSAgICAgICAgfTsNCi0NCi0gICAgICAgIGluZm8uZGF0ZXMgPSBbXTsNCi0gICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRlc19jb25maWcpIHsNCi0gICAgICAgICAgICB2YXIgdmFsdWUgPSBtZXNzYWdlc1tkYXRlc19jb25maWdba2V5XV07DQotICAgICAgICAgICAgaWYgKHZhbHVlKSB7DQotICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgiICIsICJUIikrIi4wMDBaIjsNCi0gICAgICAgICAgICAgICAgY29uc29sZS5sb2codmFsdWUpOw0KLSAgICAgICAgICAgICAgICB2YXIgZGF0ZSA9IHtkZXNjOiBkYXRlc19jb25maWdba2V5XSwgbmFtZToga2V5LCB2YWx1ZTogdmFsdWV9Ow0KLSAgICAgICAgICAgICAgICBpbmZvLmRhdGVzLnB1c2goZGF0ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBpbmZvOw0KLX0NCi0NCi12YXIgcGFyc2VTZWNvbmRzID0gZnVuY3Rpb24odGltZSkgew0KLSAgICB2YXIgc2Vjb25kcyA9IDA7DQotICAgIHZhciBhcnIgPSBuZXcgU3RyaW5nKHRpbWUgfHwgJycpLnNwbGl0KCcuJyk7DQotICAgIHZhciBwYXJ0cyA9IGFyclswXS5zcGxpdCgnOicpLnJldmVyc2UoKTsNCi0NCi0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgc2Vjb25kcyArPSAoIHBhcnNlSW50KHBhcnRzW2ldLCAxMCkgfHwgMCApICogTWF0aC5wb3coNjAsIGkpOw0KLSAgICB9DQotDQotICAgIGlmIChhcnJbMV0gJiYgNSA8PSBwYXJzZUludChhcnJbMV1bMF0sIDEwKSkgew0KLSAgICAgICAgc2Vjb25kcysrOyAvLyB0cmVhdCBtb3JlIG9yIGVxdWFsIHRoYW4gLjUgYXMgYWRkaXRpb25hbCBzZWNvbmQNCi0gICAgfQ0KLSAgICByZXR1cm4gc2Vjb25kczsNCi19DQorLyoKKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCit2YXIgZGF0YWltcG9ydF90aW1lb3V0ID0gMjAwMDsKKworc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ0RhdGFJbXBvcnRDb250cm9sbGVyJywKKyAgICBmdW5jdGlvbigkc2NvcGUsICRyb290U2NvcGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uLCAkdGltZW91dCwgJGludGVydmFsLCAkY29va2llcywgTWJlYW5zLCBEYXRhSW1wb3J0LCBDb25zdGFudHMpIHsKKyAgICAgICAgJHNjb3BlLnJlc2V0TWVudSgiZGF0YWltcG9ydCIsIENvbnN0YW50cy5JU19DT0xMRUNUSU9OX1BBR0UpOworCisgICAgICAgICRzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgTWJlYW5zLmluZm8oe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlLCBjYXQ6ICdRVUVSWUhBTkRMRVInfSwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgICB2YXIgbWJlYW5zID0gZGF0YVsnc29sci1tYmVhbnMnXVsxXTsKKyAgICAgICAgICAgICAgICAkc2NvcGUuaGFuZGxlcnMgPSBbXTsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gbWJlYW5zKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYmVhbnNba2V5XVsnY2xhc3MnXSAhPT0ga2V5ICYmIG1iZWFuc1trZXldWydjbGFzcyddID09PSAnb3JnLmFwYWNoZS5zb2xyLmhhbmRsZXIuZGF0YWltcG9ydC5EYXRhSW1wb3J0SGFuZGxlcicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5oYW5kbGVycy5wdXNoKGtleSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHNjb3BlLmhhc0hhbmRsZXJzID0gJHNjb3BlLmhhbmRsZXJzLmxlbmd0aCA+IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoISRyb3V0ZVBhcmFtcy5oYW5kbGVyKSB7CisgICAgICAgICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCIvIiArICRyb3V0ZVBhcmFtcy5jb3JlICsgIi9kYXRhaW1wb3J0LyIgKyAkc2NvcGUuaGFuZGxlcnNbMF0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5jdXJyZW50SGFuZGxlciA9ICRyb3V0ZVBhcmFtcy5oYW5kbGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAkc2NvcGUuaGFuZGxlciA9ICRyb3V0ZVBhcmFtcy5oYW5kbGVyOworICAgICAgICAgICAgaWYgKCRzY29wZS5oYW5kbGVyICYmICRzY29wZS5oYW5kbGVyWzBdPT0iLyIpIHsKKyAgICAgICAgICAgICAgICAkc2NvcGUuaGFuZGxlciA9ICRzY29wZS5oYW5kbGVyLnN1YnN0cigxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkc2NvcGUuaGFuZGxlcikgeworICAgICAgICAgICAgICAgIERhdGFJbXBvcnQuY29uZmlnKHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZSwgbmFtZTogJHNjb3BlLmhhbmRsZXJ9LCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmNvbmZpZyA9IGRhdGEuY29uZmlnOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhtbCA9ICQucGFyc2VYTUwoZGF0YS5jb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVudGl0aWVzID0gW107CisgICAgICAgICAgICAgICAgICAgICAgICAkKCdkb2N1bWVudCA+IGVudGl0eScsIHhtbCkuZWFjaChmdW5jdGlvbiAoaSwgZWxlbWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5lbnRpdGllcy5wdXNoKCQoZWxlbWVudCkuYXR0cignbmFtZScpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnJlZnJlc2hTdGF0dXMoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2NvcGUubGFzdFVwZGF0ZSA9ICJ1bmtub3duIjsKKyAgICAgICAgICAgICRzY29wZS5sYXN0VXBkYXRlVVRDID0gIiI7CisgICAgICAgIH07CisKKyAgICAgICAgJHNjb3BlLnRvZ2dsZURlYnVnID0gZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgJHNjb3BlLmlzRGVidWdNb2RlID0gISRzY29wZS5pc0RlYnVnTW9kZTsKKyAgICAgICAgICAgIGlmICgkc2NvcGUuaXNEZWJ1Z01vZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBhbHNvIGVuYWJsZSBEZWJ1ZyBjaGVja2JveAorICAgICAgICAgICAgICAgICRzY29wZS5mb3JtLnNob3dEZWJ1ZyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2NvcGUuc2hvd0NvbmZpZ3VyYXRpb24gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgJHNjb3BlLnRvZ2dsZUNvbmZpZ3VyYXRpb24gPSBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAkc2NvcGUuc2hvd0NvbmZpZ3VyYXRpb24gPSAhJHNjb3BlLnNob3dDb25maWd1cmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgJHNjb3BlLnRvZ2dsZVJhd1N0YXR1cyA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICRzY29wZS5zaG93UmF3U3RhdHVzID0gISRzY29wZS5zaG93UmF3U3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgJHNjb3BlLnRvZ2dsZVJhd0RlYnVnID0gZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgJHNjb3BlLnNob3dSYXdEZWJ1ZyA9ICEkc2NvcGUuc2hvd1Jhd0RlYnVnOworICAgICAgICB9CisKKyAgICAgICAgJHNjb3BlLnJlbG9hZCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIERhdGFJbXBvcnQucmVsb2FkKHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZSwgbmFtZTogJHNjb3BlLmhhbmRsZXJ9LCBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgJHNjb3BlLnJlbG9hZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5yZWxvYWRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0sIDUwMDApOworICAgICAgICAgICAgICAgICRzY29wZS5yZWZyZXNoKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgICRzY29wZS5mb3JtID0geworICAgICAgICAgICAgY29tbWFuZDogImZ1bGwtaW1wb3J0IiwKKyAgICAgICAgICAgIHZlcmJvc2U6IGZhbHNlLAorICAgICAgICAgICAgY2xlYW46IHRydWUsCisgICAgICAgICAgICBjb21taXQ6IHRydWUsCisgICAgICAgICAgICBvcHRpbWl6ZTogZmFsc2UsCisgICAgICAgICAgICBzaG93RGVidWc6IGZhbHNlLAorICAgICAgICAgICAgY3VzdG9tOiAiIiwKKyAgICAgICAgICAgIGNvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlCisgICAgICAgIH07CisKKyAgICAgICAgJHNjb3BlLnN1Ym1pdCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTsKKyAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiAkc2NvcGUuZm9ybSkgeworICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gInNob3dEZWJ1ZyIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5mb3JtLnNob3dEZWJ1ZykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWyJkZWJ1ZyJdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtc1trZXldID0gJHNjb3BlLmZvcm1ba2V5XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW1zLmN1c3RvbS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB2YXIgY3VzdG9tUGFyYW1zID0gJHNjb3BlLmZvcm0uY3VzdG9tLnNwbGl0KCImIik7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBjdXN0b21QYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gY3VzdG9tUGFyYW1zW2ldLnNwbGl0KCI9Iik7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtc1twYXJ0c1swXV0gPSBwYXJ0c1sxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGUgcGFyYW1zLmN1c3RvbTsKKworICAgICAgICAgICAgaWYgKCRzY29wZS5pc0RlYnVnTW9kZSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5kYXRhQ29uZmlnID0gJHNjb3BlLmNvbmZpZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyYW1zLmNvcmUgPSAkcm91dGVQYXJhbXMuY29yZTsKKyAgICAgICAgICAgIHBhcmFtcy5uYW1lID0gJHNjb3BlLmhhbmRsZXI7CisKKyAgICAgICAgICAgIERhdGFJbXBvcnQucG9zdChwYXJhbXMsIGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgICAgICAgICAgJHNjb3BlLnJhd1Jlc3BvbnNlID0gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMik7CisgICAgICAgICAgICAgICAgJHNjb3BlLnJlZnJlc2hTdGF0dXMoKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgICAgICRzY29wZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICRzY29wZS5pc0Fib3J0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIERhdGFJbXBvcnQuYWJvcnQoe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlLCBuYW1lOiAkc2NvcGUuaGFuZGxlcn0sIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5pc0Fib3J0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5yZWZyZXNoU3RhdHVzKCk7CisgICAgICAgICAgICAgICAgfSwgNDAwMCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgICRzY29wZS5yZWZyZXNoU3RhdHVzID0gZnVuY3Rpb24gKCkgeworCisgICAgICAgICAgICBjb25zb2xlLmxvZygiUmVmcmVzaCBTdGF0dXMiKTsKKworICAgICAgICAgICAgJHNjb3BlLmlzU3RhdHVzTG9hZGluZyA9IHRydWU7CisgICAgICAgICAgICBEYXRhSW1wb3J0LnN0YXR1cyh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmUsIG5hbWU6ICRzY29wZS5oYW5kbGVyfSwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YVswXSA9PSAiPCIpIHsKKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmhhc0hhbmRsZXJzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTsKKyAgICAgICAgICAgICAgICAkc2NvcGUubGFzdFVwZGF0ZSA9IG5vdy50b1RpbWVTdHJpbmcoKS5zcGxpdCgnICcpLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgJHNjb3BlLmxhc3RVcGRhdGVVVEMgPSBub3cudG9VVENTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSBkYXRhLnN0YXR1c01lc3NhZ2VzOworICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlc0NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIHZhciBrZXkgaW4gbWVzc2FnZXMgKSB7IG1lc3NhZ2VzQ291bnQrKzsgfQorCisgICAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09ICdidXN5JykgeworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc3RhdHVzID0gImluZGV4aW5nIjsKKworICAgICAgICAgICAgICAgICAgICAkc2NvcGUudGltZUVsYXBzZWQgPSBkYXRhLnN0YXR1c01lc3NhZ2VzWydUaW1lIEVsYXBzZWQnXTsKKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVsYXBzZWRTZWNvbmRzID0gcGFyc2VTZWNvbmRzKCRzY29wZS50aW1lRWxhcHNlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGluZm8gPSAkc2NvcGUudGltZUVsYXBzZWQgPyAnSW5kZXhpbmcgc2luY2UgJyArICRzY29wZS50aW1lRWxhcHNlZCA6ICdJbmRleGluZyAuLi4nOworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaW5mbyA9IHNob3dJbmZvKG1lc3NhZ2VzLCB0cnVlLCBpbmZvLCAkc2NvcGUuZWxhcHNlZFNlY29uZHMpOworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlcy5Sb2xsZWRCYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSAiZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5pbmZvID0gc2hvd0luZm8obWVzc2FnZXMsIHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZXMuQWJvcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc3RhdHVzID0gImFib3J0ZWQiOworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaW5mbyA9IHNob3dJbmZvKG1lc3NhZ2VzLCB0cnVlLCAnQWJvcnRpbmcgY3VycmVudCBJbXBvcnQgLi4uJyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnN0YXR1cyA9PSAiaWRsZSIgJiYgbWVzc2FnZXNDb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSAic3VjY2VzcyI7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5pbmZvID0gc2hvd0luZm8obWVzc2FnZXMsIHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSAiaWRsZSI7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5pbmZvID0gc2hvd0luZm8obWVzc2FnZXMsIGZhbHNlLCAnTm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlIChpZGxlKScpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhLiRwcm9taXNlOworICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhLiRyZXNvbHZlZDsKKworICAgICAgICAgICAgICAgICRzY29wZS5yYXdTdGF0dXMgPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTsKKworICAgICAgICAgICAgICAgICRzY29wZS5pc1N0YXR1c0xvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAkc2NvcGUuc3RhdHVzVXBkYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc3RhdHVzVXBkYXRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0sIGRhdGFpbXBvcnRfdGltZW91dCAvIDIpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisKKyAgICAgICAgJHNjb3BlLnVwZGF0ZUF1dG9SZWZyZXNoID0gZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgJHNjb3BlLmF1dG9yZWZyZXNoID0gISRzY29wZS5hdXRvcmVmcmVzaDsKKyAgICAgICAgICAgICRjb29raWVzLmRhdGFpbXBvcnRfYXV0b3JlZnJlc2ggPSAkc2NvcGUuYXV0b3JlZnJlc2ggPyB0cnVlIDogbnVsbDsKKyAgICAgICAgICAgIGlmICgkc2NvcGUuYXV0b3JlZnJlc2gpIHsKKyAgICAgICAgICAgICAgICAkc2NvcGUucmVmcmVzaFRpbWVvdXQgPSAkaW50ZXJ2YWwoJHNjb3BlLnJlZnJlc2hTdGF0dXMsIGRhdGFpbXBvcnRfdGltZW91dCk7CisgICAgICAgICAgICAgICAgdmFyIG9uUm91dGVDaGFuZ2VPZmYgPSAkc2NvcGUuJG9uKCckcm91dGVDaGFuZ2VTdGFydCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAkaW50ZXJ2YWwuY2FuY2VsKCRzY29wZS5yZWZyZXNoVGltZW91dCk7CisgICAgICAgICAgICAgICAgICAgIG9uUm91dGVDaGFuZ2VPZmYoKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUucmVmcmVzaFRpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICAkaW50ZXJ2YWwuY2FuY2VsKCRzY29wZS5yZWZyZXNoVGltZW91dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2NvcGUucmVmcmVzaFN0YXR1cygpOworICAgICAgICB9OworCisgICAgICAgICRzY29wZS5yZWZyZXNoKCk7CisKK30pOworCit2YXIgc2hvd0luZm8gPSBmdW5jdGlvbiAobWVzc2FnZXMsIHNob3dGdWxsLCBpbmZvX3RleHQsIGVsYXBzZWRfc2Vjb25kcykgeworCisgICAgdmFyIGluZm8gPSB7fTsKKyAgICBpZiAoaW5mb190ZXh0KSB7CisgICAgICAgIGluZm8udGV4dCA9IGluZm9fdGV4dDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmZvLnRleHQgPSBtZXNzYWdlc1snJ10gfHwgJyc7CisgICAgICAgIC8vIGZvcm1hdCBudW1iZXJzIGluY2x1ZGVkIGluIHN0YXR1cyBuaWNlbHkKKyAgICAgICAgLyogQHRvZG8gdGhpcyBwcmV0dHkgcHJpbnRpbmcgaXMgaGFyZCB0byB3b3JrIG91dCBob3cgdG8gZG8gaW4gYW4gQW5ndWxhcmVzcXVlIHdheToKKyAgICAgICAgaW5mby50ZXh0ID0gaW5mby50ZXh0LnJlcGxhY2UoL1xkezQsfS9nLAorICAgICAgICAgICAgZnVuY3Rpb24gKG1hdGNoLCBwb3NpdGlvbiwgc3RyaW5nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFwcC5mb3JtYXRfbnVtYmVyKHBhcnNlSW50KG1hdGNoLCAxMCkpOworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICAqLworCisgICAgICAgIHZhciB0aW1lX3Rha2VuX3RleHQgPSBtZXNzYWdlc1snVGltZSB0YWtlbiddOworICAgICAgICBpbmZvLnRpbWVUYWtlbiA9IHBhcnNlU2Vjb25kcyh0aW1lX3Rha2VuX3RleHQpOworICAgIH0KKyAgICBpbmZvLnNob3dEZXRhaWxzID0gZmFsc2U7CisKKyAgICBpZiAoc2hvd0Z1bGwpIHsKKyAgICAgICAgaWYgKCFlbGFwc2VkX3NlY29uZHMpIHsKKyAgICAgICAgICAgIHZhciB0aW1lX3Rha2VuX3RleHQgPSBtZXNzYWdlc1snVGltZSB0YWtlbiddOworICAgICAgICAgICAgZWxhcHNlZF9zZWNvbmRzID0gcGFyc2VTZWNvbmRzKHRpbWVfdGFrZW5fdGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBpbmZvLnNob3dEZXRhaWxzID0gdHJ1ZTsKKworICAgICAgICB2YXIgZG9jdW1lbnRfY29uZmlnID0geworICAgICAgICAgICAgJ1JlcXVlc3RzJzogJ1RvdGFsIFJlcXVlc3RzIG1hZGUgdG8gRGF0YVNvdXJjZScsCisgICAgICAgICAgICAnRmV0Y2hlZCc6ICdUb3RhbCBSb3dzIEZldGNoZWQnLAorICAgICAgICAgICAgJ1NraXBwZWQnOiAnVG90YWwgRG9jdW1lbnRzIFNraXBwZWQnLAorICAgICAgICAgICAgJ1Byb2Nlc3NlZCc6ICdUb3RhbCBEb2N1bWVudHMgUHJvY2Vzc2VkJworICAgICAgICB9OworCisgICAgICAgIGluZm8uZG9jcyA9IFtdOworICAgICAgICBmb3IgKHZhciBrZXkgaW4gZG9jdW1lbnRfY29uZmlnKSB7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSBwYXJzZUludChtZXNzYWdlc1tkb2N1bWVudF9jb25maWdba2V5XV0sIDEwKTsKKyAgICAgICAgICAgIHZhciBkb2MgPSB7ZGVzYzogZG9jdW1lbnRfY29uZmlnW2tleV0sIG5hbWU6IGtleSwgdmFsdWU6IHZhbHVlfTsKKyAgICAgICAgICAgIGlmIChlbGFwc2VkX3NlY29uZHMgJiYga2V5ICE9ICdTa2lwcGVkJykgeworICAgICAgICAgICAgICAgIGRvYy5zcGVlZCA9IE1hdGgucm91bmQodmFsdWUgLyBlbGFwc2VkX3NlY29uZHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5mby5kb2NzLnB1c2goZG9jKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBkYXRlc19jb25maWcgPSB7CisgICAgICAgICAgICAnU3RhcnRlZCc6ICdGdWxsIER1bXAgU3RhcnRlZCcsCisgICAgICAgICAgICAnQWJvcnRlZCc6ICdBYm9ydGVkJywKKyAgICAgICAgICAgICdSb2xsZWRiYWNrJzogJ1JvbGxlZGJhY2snCisgICAgICAgIH07CisKKyAgICAgICAgaW5mby5kYXRlcyA9IFtdOworICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0ZXNfY29uZmlnKSB7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSBtZXNzYWdlc1tkYXRlc19jb25maWdba2V5XV07CisgICAgICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIiAiLCAiVCIpKyIuMDAwWiI7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2codmFsdWUpOworICAgICAgICAgICAgICAgIHZhciBkYXRlID0ge2Rlc2M6IGRhdGVzX2NvbmZpZ1trZXldLCBuYW1lOiBrZXksIHZhbHVlOiB2YWx1ZX07CisgICAgICAgICAgICAgICAgaW5mby5kYXRlcy5wdXNoKGRhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmZvOworfQorCit2YXIgcGFyc2VTZWNvbmRzID0gZnVuY3Rpb24odGltZSkgeworICAgIHZhciBzZWNvbmRzID0gMDsKKyAgICB2YXIgYXJyID0gbmV3IFN0cmluZyh0aW1lIHx8ICcnKS5zcGxpdCgnLicpOworICAgIHZhciBwYXJ0cyA9IGFyclswXS5zcGxpdCgnOicpLnJldmVyc2UoKTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgc2Vjb25kcyArPSAoIHBhcnNlSW50KHBhcnRzW2ldLCAxMCkgfHwgMCApICogTWF0aC5wb3coNjAsIGkpOworICAgIH0KKworICAgIGlmIChhcnJbMV0gJiYgNSA8PSBwYXJzZUludChhcnJbMV1bMF0sIDEwKSkgeworICAgICAgICBzZWNvbmRzKys7IC8vIHRyZWF0IG1vcmUgb3IgZXF1YWwgdGhhbiAuNSBhcyBhZGRpdGlvbmFsIHNlY29uZAorICAgIH0KKyAgICByZXR1cm4gc2Vjb25kczsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2RvY3VtZW50cy5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2RvY3VtZW50cy5qcwppbmRleCA2ODZhZWNhLi5iZTM3YzlmIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9kb2N1bWVudHMuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvZG9jdW1lbnRzLmpzCkBAIC0xLDEzOSArMSwxMzkgQEAKLS8qDQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0vL2hlbHBlciBmb3IgZm9ybWF0dGluZyBKU09OIGFuZCBvdGhlcnMNCi0NCi12YXIgRE9DX1BMQUNFSE9MREVSID0gJzxkb2M+XG4nICsNCi0gICAgICAgICAgICAgICAgJzxmaWVsZCBuYW1lPSJpZCI+Y2hhbmdlLm1lPC9maWVsZD4nICsNCi0gICAgICAgICAgICAgICAgJzxmaWVsZCBuYW1lPSJ0aXRsZSI+Y2hhbmdlLm1lPC9maWVsZD4nICsNCi0gICAgICAgICAgICAgICAgJzwvZG9jPic7DQotDQotdmFyIEFERF9QTEFDRUhPTERFUiA9ICc8YWRkPlxuJyArIERPQ19QTEFDRUhPTERFUiArICc8L2FkZD5cbic7DQotDQotc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ0RvY3VtZW50c0NvbnRyb2xsZXInLA0KLSAgICBmdW5jdGlvbigkc2NvcGUsICRyb290U2NvcGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uLCBMdWtlLCBVcGRhdGUsIEZpbGVVcGxvYWQsIENvbnN0YW50cykgew0KLSAgICAgICAgJHNjb3BlLnJlc2V0TWVudSgiZG9jdW1lbnRzIiwgQ29uc3RhbnRzLklTX0NPTExFQ1RJT05fUEFHRSk7DQotDQotICAgICAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICBMdWtlLnNjaGVtYSh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAgICAgICAgIC8vVE9ETzogaGFuZGxlIGR5bmFtaWMgZmllbGRzDQotICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhLnNjaGVtYS5maWVsZHMuX3ZlcnNpb25fOw0KLSAgICAgICAgICAgICAgICAkc2NvcGUuZmllbGRzID0gT2JqZWN0LmtleXMoZGF0YS5zY2hlbWEuZmllbGRzKTsNCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICAkc2NvcGUuZG9jdW1lbnQgPSAiIjsNCi0gICAgICAgICAgICAkc2NvcGUuaGFuZGxlciA9ICIvdXBkYXRlIjsNCi0gICAgICAgICAgICAkc2NvcGUudHlwZSA9ICJqc29uIjsNCi0gICAgICAgICAgICAkc2NvcGUuY29tbWl0V2l0aGluID0gMTAwMDsNCi0gICAgICAgICAgICAkc2NvcGUub3ZlcndyaXRlID0gdHJ1ZTsNCi0gICAgICAgICAgICAkc2NvcGUuYm9vc3QgPSAiMS4wIjsNCi0gICAgICAgIH07DQotDQotICAgICAgICAkc2NvcGUucmVmcmVzaCgpOw0KLQ0KLSAgICAgICAgJHNjb3BlLmNoYW5nZURvY3VtZW50VHlwZSA9IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICAkc2NvcGUucGxhY2Vob2xkZXIgPSAiIjsNCi0gICAgICAgICAgICBpZiAoJHNjb3BlLnR5cGUgPT0gJ2pzb24nKSB7DQotICAgICAgICAgICAgICAgICRzY29wZS5wbGFjZWhvbGRlciA9ICd7ImlkIjoiY2hhbmdlLm1lIiwidGl0bGUiOiJjaGFuZ2UubWUifSc7DQotICAgICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUudHlwZSA9PSAnY3N2Jykgew0KLSAgICAgICAgICAgICAgICAkc2NvcGUucGxhY2Vob2xkZXIgPSAiaWQsdGl0bGVcbmNoYW5nZS5tZSxjaGFuZ2UubWUiOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLnR5cGUgPT0gJ3NvbHInKSB7DQotICAgICAgICAgICAgICAgICRzY29wZS5wbGFjZWhvbGRlciA9IEFERF9QTEFDRUhPTERFUjsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS50eXBlID09ICd4bWwnKSB7DQotICAgICAgICAgICAgICAgICRzY29wZS5wbGFjZWhvbGRlciA9IERPQ19QTEFDRUhPTERFUjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLQ0KLSAgICAgICAgJHNjb3BlLmFkZFdpemFyZEZpZWxkID0gZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICAgIGlmICgkc2NvcGUuZG9jdW1lbnQgPT0gIiIpICRzY29wZS5kb2N1bWVudCA9ICJ7fSI7DQotICAgICAgICAgICAgdmFyIGRvYyA9IEpTT04ucGFyc2UoJHNjb3BlLmRvY3VtZW50KTsNCi0gICAgICAgICAgICBkb2NbJHNjb3BlLmZpZWxkTmFtZV0gPSAkc2NvcGUuZmllbGREYXRhOw0KLSAgICAgICAgICAgICRzY29wZS5kb2N1bWVudCA9IEpTT04uc3RyaW5naWZ5KGRvYywgbnVsbCwgJ1x0Jyk7DQotICAgICAgICAgICAgJHNjb3BlLmZpZWxkRGF0YSA9ICIiOw0KLSAgICAgICAgfTsNCi0NCi0gICAgICAgICRzY29wZS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7DQotICAgICAgICAgICAgdmFyIGNvbnRlbnRUeXBlID0gIiI7DQotICAgICAgICAgICAgdmFyIHBvc3REYXRhID0gIiI7DQotICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9Ow0KLSAgICAgICAgICAgIHZhciBkb2luZ0ZpbGVVcGxvYWQgPSBmYWxzZTsNCi0NCi0gICAgICAgICAgICBpZiAoJHNjb3BlLmhhbmRsZXJbMF0gPT0gJy8nKSB7DQotICAgICAgICAgICAgICAgIHBhcmFtcy5oYW5kbGVyID0gJHNjb3BlLmhhbmRsZXIuc3Vic3RyaW5nKDEpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHBhcmFtcy5oYW5kbGVyID0gJ3VwZGF0ZSc7DQotICAgICAgICAgICAgICAgIHBhcmFtcy5xdCA9ICRzY29wZS5oYW5kbGVyOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwYXJhbXMuY29tbWl0V2l0aGluID0gJHNjb3BlLmNvbW1pdFdpdGhpbjsNCi0gICAgICAgICAgICBwYXJhbXMuYm9vc3QgPSAkc2NvcGUuYm9vc3Q7DQotICAgICAgICAgICAgcGFyYW1zLm92ZXJ3cml0ZSA9ICRzY29wZS5vdmVyd3JpdGU7DQotICAgICAgICAgICAgcGFyYW1zLmNvcmUgPSAkcm91dGVQYXJhbXMuY29yZTsNCi0gICAgICAgICAgICBwYXJhbXMud3QgPSAianNvbiI7DQotDQotICAgICAgICAgICAgaWYgKCRzY29wZS50eXBlID09ICJqc29uIiB8fCAkc2NvcGUudHlwZSA9PSAid2l6YXJkIikgew0KLSAgICAgICAgICAgICAgICBwb3N0RGF0YSA9ICJbIiArICRzY29wZS5kb2N1bWVudCArICJdIjsNCi0gICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSAianNvbiI7DQotICAgICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUudHlwZSA9PSAiY3N2Iikgew0KLSAgICAgICAgICAgICAgICBwb3N0RGF0YSA9ICRzY29wZS5kb2N1bWVudDsNCi0gICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSAiY3N2IjsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS50eXBlID09ICJ4bWwiKSB7DQotICAgICAgICAgICAgICAgIHBvc3REYXRhID0gIjxhZGQ+IiArICRzY29wZS5kb2N1bWVudCArICI8L2FkZD4iOw0KLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9ICJ4bWwiOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLnR5cGUgPT0gInVwbG9hZCIpIHsNCi0gICAgICAgICAgICAgICAgZG9pbmdGaWxlVXBsb2FkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgcGFyYW1zLnJhdyA9ICRzY29wZS5saXRlcmFsUGFyYW1zOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLnR5cGUgPT0gInNvbHIiKSB7DQotICAgICAgICAgICAgICAgIHBvc3REYXRhID0gJHNjb3BlLmRvY3VtZW50Ow0KLSAgICAgICAgICAgICAgICBpZiAocG9zdERhdGFbMF0gPT0gIjwiKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9ICJ4bWwiOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc3REYXRhWzBdID09ICJ7IiB8fCBwb3N0RGF0YVswXSA9PSAnWycpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gImpzb24iOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgYWxlcnQoIkNhbm5vdCBpZGVudGlmeSBjb250ZW50IHR5cGUiKQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghZG9pbmdGaWxlVXBsb2FkKSB7DQotICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIChzdWNjZXNzKSB7DQotICAgICAgICAgICAgICAgICAgJHNjb3BlLnJlc3BvbnNlU3RhdHVzID0gInN1Y2Nlc3MiOw0KLSAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzdWNjZXNzLiRwcm9taXNlOw0KLSAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzdWNjZXNzLiRyZXNvbHZlZDsNCi0gICAgICAgICAgICAgICAgICAkc2NvcGUucmVzcG9uc2UgPSBKU09OLnN0cmluZ2lmeShzdWNjZXNzLCBudWxsLCAnICAnKTsNCi0gICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgdmFyIGZhaWx1cmUgPSBmdW5jdGlvbiAoZmFpbHVyZSkgew0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnJlc3BvbnNlU3RhdHVzID0gZmFpbHVyZTsNCi0gICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09ICJqc29uIikgew0KLSAgICAgICAgICAgICAgICAgIFVwZGF0ZS5wb3N0SnNvbihwYXJhbXMsIHBvc3REYXRhLCBjYWxsYmFjaywgZmFpbHVyZSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudFR5cGUgPT0gInhtbCIpIHsNCi0gICAgICAgICAgICAgICAgICBVcGRhdGUucG9zdFhtbChwYXJhbXMsIHBvc3REYXRhLCBjYWxsYmFjaywgZmFpbHVyZSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudFR5cGUgPT0gImNzdiIpIHsNCi0gICAgICAgICAgICAgICAgICBVcGRhdGUucG9zdENzdihwYXJhbXMsIHBvc3REYXRhLCBjYWxsYmFjaywgZmFpbHVyZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB2YXIgZmlsZSA9ICRzY29wZS5maWxlVXBsb2FkOw0KLSAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZmlsZSBpcyAnICsgSlNPTi5zdHJpbmdpZnkoZmlsZSkpOw0KLSAgICAgICAgICAgICAgICB2YXIgdXBsb2FkVXJsID0gIi9maWxlVXBsb2FkIjsNCi0gICAgICAgICAgICAgICAgRmlsZVVwbG9hZC51cGxvYWQocGFyYW1zLCAkc2NvcGUuZmlsZVVwbG9hZCwgZnVuY3Rpb24gKHN1Y2Nlc3MpIHsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5yZXNwb25zZVN0YXR1cyA9ICJzdWNjZXNzIjsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5yZXNwb25zZSA9IEpTT04uc3RyaW5naWZ5KHN1Y2Nlc3MsIG51bGwsICcgICcpOw0KLSAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZmFpbHVyZSkgew0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnJlc3BvbnNlU3RhdHVzID0gImZhaWx1cmUiOw0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnJlc3BvbnNlID0gSlNPTi5zdHJpbmdpZnkoZmFpbHVyZSwgbnVsbCwgJyAgJyk7DQotICAgICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfSk7DQotDQorLyoKKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy9oZWxwZXIgZm9yIGZvcm1hdHRpbmcgSlNPTiBhbmQgb3RoZXJzCisKK3ZhciBET0NfUExBQ0VIT0xERVIgPSAnPGRvYz5cbicgKworICAgICAgICAgICAgICAgICc8ZmllbGQgbmFtZT0iaWQiPmNoYW5nZS5tZTwvZmllbGQ+JyArCisgICAgICAgICAgICAgICAgJzxmaWVsZCBuYW1lPSJ0aXRsZSI+Y2hhbmdlLm1lPC9maWVsZD4nICsKKyAgICAgICAgICAgICAgICAnPC9kb2M+JzsKKwordmFyIEFERF9QTEFDRUhPTERFUiA9ICc8YWRkPlxuJyArIERPQ19QTEFDRUhPTERFUiArICc8L2FkZD5cbic7CisKK3NvbHJBZG1pbkFwcC5jb250cm9sbGVyKCdEb2N1bWVudHNDb250cm9sbGVyJywKKyAgICBmdW5jdGlvbigkc2NvcGUsICRyb290U2NvcGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uLCBMdWtlLCBVcGRhdGUsIEZpbGVVcGxvYWQsIENvbnN0YW50cykgeworICAgICAgICAkc2NvcGUucmVzZXRNZW51KCJkb2N1bWVudHMiLCBDb25zdGFudHMuSVNfQ09MTEVDVElPTl9QQUdFKTsKKworICAgICAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIEx1a2Uuc2NoZW1hKHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZX0sIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICAgICAgICAvL1RPRE86IGhhbmRsZSBkeW5hbWljIGZpZWxkcworICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhLnNjaGVtYS5maWVsZHMuX3ZlcnNpb25fOworICAgICAgICAgICAgICAgICRzY29wZS5maWVsZHMgPSBPYmplY3Qua2V5cyhkYXRhLnNjaGVtYS5maWVsZHMpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAkc2NvcGUuZG9jdW1lbnQgPSAiIjsKKyAgICAgICAgICAgICRzY29wZS5oYW5kbGVyID0gIi91cGRhdGUiOworICAgICAgICAgICAgJHNjb3BlLnR5cGUgPSAianNvbiI7CisgICAgICAgICAgICAkc2NvcGUuY29tbWl0V2l0aGluID0gMTAwMDsKKyAgICAgICAgICAgICRzY29wZS5vdmVyd3JpdGUgPSB0cnVlOworICAgICAgICAgICAgJHNjb3BlLmJvb3N0ID0gIjEuMCI7CisgICAgICAgIH07CisKKyAgICAgICAgJHNjb3BlLnJlZnJlc2goKTsKKworICAgICAgICAkc2NvcGUuY2hhbmdlRG9jdW1lbnRUeXBlID0gZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgJHNjb3BlLnBsYWNlaG9sZGVyID0gIiI7CisgICAgICAgICAgICBpZiAoJHNjb3BlLnR5cGUgPT0gJ2pzb24nKSB7CisgICAgICAgICAgICAgICAgJHNjb3BlLnBsYWNlaG9sZGVyID0gJ3siaWQiOiJjaGFuZ2UubWUiLCJ0aXRsZSI6ImNoYW5nZS5tZSJ9JzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLnR5cGUgPT0gJ2NzdicpIHsKKyAgICAgICAgICAgICAgICAkc2NvcGUucGxhY2Vob2xkZXIgPSAiaWQsdGl0bGVcbmNoYW5nZS5tZSxjaGFuZ2UubWUiOworICAgICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUudHlwZSA9PSAnc29scicpIHsKKyAgICAgICAgICAgICAgICAkc2NvcGUucGxhY2Vob2xkZXIgPSBBRERfUExBQ0VIT0xERVI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS50eXBlID09ICd4bWwnKSB7CisgICAgICAgICAgICAgICAgJHNjb3BlLnBsYWNlaG9sZGVyID0gRE9DX1BMQUNFSE9MREVSOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgICRzY29wZS5hZGRXaXphcmRGaWVsZCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGlmICgkc2NvcGUuZG9jdW1lbnQgPT0gIiIpICRzY29wZS5kb2N1bWVudCA9ICJ7fSI7CisgICAgICAgICAgICB2YXIgZG9jID0gSlNPTi5wYXJzZSgkc2NvcGUuZG9jdW1lbnQpOworICAgICAgICAgICAgZG9jWyRzY29wZS5maWVsZE5hbWVdID0gJHNjb3BlLmZpZWxkRGF0YTsKKyAgICAgICAgICAgICRzY29wZS5kb2N1bWVudCA9IEpTT04uc3RyaW5naWZ5KGRvYywgbnVsbCwgJ1x0Jyk7CisgICAgICAgICAgICAkc2NvcGUuZmllbGREYXRhID0gIiI7CisgICAgICAgIH07CisKKyAgICAgICAgJHNjb3BlLnN1Ym1pdCA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHZhciBjb250ZW50VHlwZSA9ICIiOworICAgICAgICAgICAgdmFyIHBvc3REYXRhID0gIiI7CisgICAgICAgICAgICB2YXIgcGFyYW1zID0ge307CisgICAgICAgICAgICB2YXIgZG9pbmdGaWxlVXBsb2FkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICgkc2NvcGUuaGFuZGxlclswXSA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMuaGFuZGxlciA9ICRzY29wZS5oYW5kbGVyLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLmhhbmRsZXIgPSAndXBkYXRlJzsKKyAgICAgICAgICAgICAgICBwYXJhbXMucXQgPSAkc2NvcGUuaGFuZGxlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyYW1zLmNvbW1pdFdpdGhpbiA9ICRzY29wZS5jb21taXRXaXRoaW47CisgICAgICAgICAgICBwYXJhbXMuYm9vc3QgPSAkc2NvcGUuYm9vc3Q7CisgICAgICAgICAgICBwYXJhbXMub3ZlcndyaXRlID0gJHNjb3BlLm92ZXJ3cml0ZTsKKyAgICAgICAgICAgIHBhcmFtcy5jb3JlID0gJHJvdXRlUGFyYW1zLmNvcmU7CisgICAgICAgICAgICBwYXJhbXMud3QgPSAianNvbiI7CisKKyAgICAgICAgICAgIGlmICgkc2NvcGUudHlwZSA9PSAianNvbiIgfHwgJHNjb3BlLnR5cGUgPT0gIndpemFyZCIpIHsKKyAgICAgICAgICAgICAgICBwb3N0RGF0YSA9ICJbIiArICRzY29wZS5kb2N1bWVudCArICJdIjsKKyAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9ICJqc29uIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLnR5cGUgPT0gImNzdiIpIHsKKyAgICAgICAgICAgICAgICBwb3N0RGF0YSA9ICRzY29wZS5kb2N1bWVudDsKKyAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9ICJjc3YiOworICAgICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUudHlwZSA9PSAieG1sIikgeworICAgICAgICAgICAgICAgIHBvc3REYXRhID0gIjxhZGQ+IiArICRzY29wZS5kb2N1bWVudCArICI8L2FkZD4iOworICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gInhtbCI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS50eXBlID09ICJ1cGxvYWQiKSB7CisgICAgICAgICAgICAgICAgZG9pbmdGaWxlVXBsb2FkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwYXJhbXMucmF3ID0gJHNjb3BlLmxpdGVyYWxQYXJhbXM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS50eXBlID09ICJzb2xyIikgeworICAgICAgICAgICAgICAgIHBvc3REYXRhID0gJHNjb3BlLmRvY3VtZW50OworICAgICAgICAgICAgICAgIGlmIChwb3N0RGF0YVswXSA9PSAiPCIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSAieG1sIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc3REYXRhWzBdID09ICJ7IiB8fCBwb3N0RGF0YVswXSA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSAianNvbiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWxlcnQoIkNhbm5vdCBpZGVudGlmeSBjb250ZW50IHR5cGUiKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZG9pbmdGaWxlVXBsb2FkKSB7CisgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICRzY29wZS5yZXNwb25zZVN0YXR1cyA9ICJzdWNjZXNzIjsKKyAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzdWNjZXNzLiRwcm9taXNlOworICAgICAgICAgICAgICAgICAgZGVsZXRlIHN1Y2Nlc3MuJHJlc29sdmVkOworICAgICAgICAgICAgICAgICAgJHNjb3BlLnJlc3BvbnNlID0gSlNPTi5zdHJpbmdpZnkoc3VjY2VzcywgbnVsbCwgJyAgJyk7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB2YXIgZmFpbHVyZSA9IGZ1bmN0aW9uIChmYWlsdXJlKSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5yZXNwb25zZVN0YXR1cyA9IGZhaWx1cmU7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gImpzb24iKSB7CisgICAgICAgICAgICAgICAgICBVcGRhdGUucG9zdEpzb24ocGFyYW1zLCBwb3N0RGF0YSwgY2FsbGJhY2ssIGZhaWx1cmUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudFR5cGUgPT0gInhtbCIpIHsKKyAgICAgICAgICAgICAgICAgIFVwZGF0ZS5wb3N0WG1sKHBhcmFtcywgcG9zdERhdGEsIGNhbGxiYWNrLCBmYWlsdXJlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09ICJjc3YiKSB7CisgICAgICAgICAgICAgICAgICBVcGRhdGUucG9zdENzdihwYXJhbXMsIHBvc3REYXRhLCBjYWxsYmFjaywgZmFpbHVyZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YXIgZmlsZSA9ICRzY29wZS5maWxlVXBsb2FkOworICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmaWxlIGlzICcgKyBKU09OLnN0cmluZ2lmeShmaWxlKSk7CisgICAgICAgICAgICAgICAgdmFyIHVwbG9hZFVybCA9ICIvZmlsZVVwbG9hZCI7CisgICAgICAgICAgICAgICAgRmlsZVVwbG9hZC51cGxvYWQocGFyYW1zLCAkc2NvcGUuZmlsZVVwbG9hZCwgZnVuY3Rpb24gKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnJlc3BvbnNlU3RhdHVzID0gInN1Y2Nlc3MiOworICAgICAgICAgICAgICAgICAgICAkc2NvcGUucmVzcG9uc2UgPSBKU09OLnN0cmluZ2lmeShzdWNjZXNzLCBudWxsLCAnICAnKTsKKyAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZmFpbHVyZSkgeworICAgICAgICAgICAgICAgICAgICAkc2NvcGUucmVzcG9uc2VTdGF0dXMgPSAiZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5yZXNwb25zZSA9IEpTT04uc3RyaW5naWZ5KGZhaWx1cmUsIG51bGwsICcgICcpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSk7CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2ZpbGVzLmpzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvZmlsZXMuanMKaW5kZXggNzMxZGFkNy4uMDBlYTRiMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvZmlsZXMuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvZmlsZXMuanMKQEAgLTEsMTAwICsxLDEwMCBAQAotLyoNCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLQ0KLXZhciBjb250ZW50VHlwZU1hcCA9IHsgeG1sIDogJ3RleHQveG1sJywgaHRtbCA6ICd0ZXh0L2h0bWwnLCBqcyA6ICd0ZXh0L2phdmFzY3JpcHQnLCBqc29uIDogJ2FwcGxpY2F0aW9uL2pzb24nLCAnY3NzJyA6ICd0ZXh0L2NzcycgfTsNCi12YXIgbGFuZ3VhZ2VzID0ge2pzOiAiamF2YXNjcmlwdCIsIHhtbDoieG1sIiwgeHNsOiJ4bWwiLCB2bTogInhtbCIsIGh0bWw6ICJ4bWwiLCBqc29uOiAianNvbiIsIGNzczogImNzcyJ9Ow0KLQ0KLXNvbHJBZG1pbkFwcC5jb250cm9sbGVyKCdGaWxlc0NvbnRyb2xsZXInLA0KLSAgICBmdW5jdGlvbigkc2NvcGUsICRyb290U2NvcGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uLCBGaWxlcywgQ29uc3RhbnRzKSB7DQotICAgICAgICAkc2NvcGUucmVzZXRNZW51KCJmaWxlcyIsIENvbnN0YW50cy5JU19DT0xMRUNUSU9OX1BBR0UpOw0KLQ0KLSAgICAgICAgJHNjb3BlLmZpbGUgPSAkbG9jYXRpb24uc2VhcmNoKCkuZmlsZTsNCi0gICAgICAgICRzY29wZS5jb250ZW50ID0gbnVsbDsNCi0NCi0gICAgICAgICRzY29wZS5iYXNldXJsID0gJGxvY2F0aW9uLnByb3RvY29sKCkrICI6Ly8iICsgJGxvY2F0aW9uLmhvc3QoKSArICI6IiArICRsb2NhdGlvbi5wb3J0KCk7DQotDQotICAgICAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHsNCi0NCi0gICAgICAgICAgICB2YXIgcHJvY2VzcyA9IGZ1bmN0aW9uIChwYXRoLCB0cmVlKSB7DQotICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9Ow0KLSAgICAgICAgICAgICAgICBpZiAocGF0aC5zbGljZSgtMSkgPT0gJy8nKSB7DQotICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZmlsZSA9IHBhdGguc2xpY2UoMCwgLTEpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGghPScnKSB7DQotICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZmlsZSA9IHBhdGg7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgRmlsZXMubGlzdChwYXJhbXMsIGZ1bmN0aW9uIChkYXRhKSB7DQotICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZW5hbWVzID0gT2JqZWN0LmtleXMoZGF0YS5maWxlcyk7DQotICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZXMuc29ydCgpOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBmaWxlbmFtZXMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGZpbGVuYW1lc1tpXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZWRhdGEgPSBkYXRhLmZpbGVzW2ZpbGVdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0ZSA9IHVuZGVmaW5lZDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSB1bmRlZmluZWQ7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVkYXRhLmRpcmVjdG9yeSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gZmlsZSArICIvIjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5maWxlICYmICRzY29wZS5maWxlLmluZGV4T2YocGF0aCArIGZpbGUpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gIm9wZW4iOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAiY2xvc2VkIjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFtdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKHBhdGggKyBmaWxlLCBjaGlsZHJlbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyZWUucHVzaCh7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmaWxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cjogeyBpZDogcGF0aCArIGZpbGV9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlDQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAkc2NvcGUudHJlZSA9IFtdOw0KLSAgICAgICAgICAgIHByb2Nlc3MoIiIsICRzY29wZS50cmVlKTsNCi0NCi0gICAgICAgICAgICBpZiAoJHNjb3BlLmZpbGUgJiYgJHNjb3BlLmZpbGUgIT0gJycgJiYgJHNjb3BlLmZpbGUuc3BsaXQoJycpLnBvcCgpIT0nLycpIHsNCi0gICAgICAgICAgICAgICAgdmFyIGV4dGVuc2lvbjsNCi0gICAgICAgICAgICAgICAgaWYgKCRzY29wZS5maWxlID09ICJtYW5hZ2VkLXNjaGVtYSIpIHsNCi0gICAgICAgICAgICAgICAgICBleHRlbnNpb24gPSBjb250ZW50VHlwZU1hcFsneG1sJ107DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gJHNjb3BlLmZpbGUubWF0Y2goIC9cLihcdyspJC8pWzFdIHx8ICcnOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHZhciBjb250ZW50VHlwZSA9IChjb250ZW50VHlwZU1hcFtleHRlbnNpb25dIHx8ICd0ZXh0L3BsYWluJyApICsgJztjaGFyc2V0PXV0Zi04JzsNCi0NCi0gICAgICAgICAgICAgICAgRmlsZXMuZ2V0KHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZSwgZmlsZTogJHNjb3BlLmZpbGUsIGNvbnRlbnRUeXBlOiBjb250ZW50VHlwZX0sIGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5jb250ZW50ID0gZGF0YS5kYXRhOw0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnVybCA9ICRzY29wZS5iYXNldXJsICsgZGF0YS5jb25maWcudXJsICsgIj8iICsgJC5wYXJhbShkYXRhLmNvbmZpZy5wYXJhbXMpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoInRleHQvcGxhaW4iKSAmJiAoZGF0YS5kYXRhLmluZGV4T2YoIjw/eG1sIik+PTApIHx8IGRhdGEuZGF0YS5pbmRleE9mKCI8IS0tIik+PTApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUubGFuZyA9ICJ4bWwiOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUubGFuZyA9IGxhbmd1YWdlc1tleHRlbnNpb25dIHx8ICJ0eHQiOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLQ0KLSAgICAgICAgJHNjb3BlLnNob3dUcmVlTGluayA9IGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICAgICB2YXIgZmlsZSA9IGRhdGEuYXJnc1swXS5pZDsNCi0gICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKHtmaWxlOmZpbGV9KTsNCi0gICAgICAgIH07DQotDQotICAgICAgICAkc2NvcGUucmVmcmVzaCgpOw0KLSAgICB9KTsNCisvKgorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3ZhciBjb250ZW50VHlwZU1hcCA9IHsgeG1sIDogJ3RleHQveG1sJywgaHRtbCA6ICd0ZXh0L2h0bWwnLCBqcyA6ICd0ZXh0L2phdmFzY3JpcHQnLCBqc29uIDogJ2FwcGxpY2F0aW9uL2pzb24nLCAnY3NzJyA6ICd0ZXh0L2NzcycgfTsKK3ZhciBsYW5ndWFnZXMgPSB7anM6ICJqYXZhc2NyaXB0IiwgeG1sOiJ4bWwiLCB4c2w6InhtbCIsIHZtOiAieG1sIiwgaHRtbDogInhtbCIsIGpzb246ICJqc29uIiwgY3NzOiAiY3NzIn07CisKK3NvbHJBZG1pbkFwcC5jb250cm9sbGVyKCdGaWxlc0NvbnRyb2xsZXInLAorICAgIGZ1bmN0aW9uKCRzY29wZSwgJHJvb3RTY29wZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24sIEZpbGVzLCBDb25zdGFudHMpIHsKKyAgICAgICAgJHNjb3BlLnJlc2V0TWVudSgiZmlsZXMiLCBDb25zdGFudHMuSVNfQ09MTEVDVElPTl9QQUdFKTsKKworICAgICAgICAkc2NvcGUuZmlsZSA9ICRsb2NhdGlvbi5zZWFyY2goKS5maWxlOworICAgICAgICAkc2NvcGUuY29udGVudCA9IG51bGw7CisKKyAgICAgICAgJHNjb3BlLmJhc2V1cmwgPSAkbG9jYXRpb24ucHJvdG9jb2woKSsgIjovLyIgKyAkbG9jYXRpb24uaG9zdCgpICsgIjoiICsgJGxvY2F0aW9uLnBvcnQoKTsKKworICAgICAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHsKKworICAgICAgICAgICAgdmFyIHByb2Nlc3MgPSBmdW5jdGlvbiAocGF0aCwgdHJlZSkgeworICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9OworICAgICAgICAgICAgICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZpbGUgPSBwYXRoLnNsaWNlKDAsIC0xKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGghPScnKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5maWxlID0gcGF0aDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBGaWxlcy5saXN0KHBhcmFtcywgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVuYW1lcyA9IE9iamVjdC5rZXlzKGRhdGEuZmlsZXMpOworICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZXMuc29ydCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGZpbGVuYW1lcykgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBmaWxlbmFtZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZWRhdGEgPSBkYXRhLmZpbGVzW2ZpbGVdOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXRlID0gdW5kZWZpbmVkOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gdW5kZWZpbmVkOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZWRhdGEuZGlyZWN0b3J5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGZpbGUgKyAiLyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5maWxlICYmICRzY29wZS5maWxlLmluZGV4T2YocGF0aCArIGZpbGUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAib3BlbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAiY2xvc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKHBhdGggKyBmaWxlLCBjaGlsZHJlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0cmVlLnB1c2goeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHI6IHsgaWQ6IHBhdGggKyBmaWxlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRzY29wZS50cmVlID0gW107CisgICAgICAgICAgICBwcm9jZXNzKCIiLCAkc2NvcGUudHJlZSk7CisKKyAgICAgICAgICAgIGlmICgkc2NvcGUuZmlsZSAmJiAkc2NvcGUuZmlsZSAhPSAnJyAmJiAkc2NvcGUuZmlsZS5zcGxpdCgnJykucG9wKCkhPScvJykgeworICAgICAgICAgICAgICAgIHZhciBleHRlbnNpb247CisgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5maWxlID09ICJtYW5hZ2VkLXNjaGVtYSIpIHsKKyAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9IGNvbnRlbnRUeXBlTWFwWyd4bWwnXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gJHNjb3BlLmZpbGUubWF0Y2goIC9cLihcdyspJC8pWzFdIHx8ICcnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXIgY29udGVudFR5cGUgPSAoY29udGVudFR5cGVNYXBbZXh0ZW5zaW9uXSB8fCAndGV4dC9wbGFpbicgKSArICc7Y2hhcnNldD11dGYtOCc7CisKKyAgICAgICAgICAgICAgICBGaWxlcy5nZXQoe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlLCBmaWxlOiAkc2NvcGUuZmlsZSwgY29udGVudFR5cGU6IGNvbnRlbnRUeXBlfSwgZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuY29udGVudCA9IGRhdGEuZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnVybCA9ICRzY29wZS5iYXNldXJsICsgZGF0YS5jb25maWcudXJsICsgIj8iICsgJC5wYXJhbShkYXRhLmNvbmZpZy5wYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZigidGV4dC9wbGFpbiIpICYmIChkYXRhLmRhdGEuaW5kZXhPZigiPD94bWwiKT49MCkgfHwgZGF0YS5kYXRhLmluZGV4T2YoIjwhLS0iKT49MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmxhbmcgPSAieG1sIjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5sYW5nID0gbGFuZ3VhZ2VzW2V4dGVuc2lvbl0gfHwgInR4dCI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAkc2NvcGUuc2hvd1RyZWVMaW5rID0gZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgICAgdmFyIGZpbGUgPSBkYXRhLmFyZ3NbMF0uaWQ7CisgICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKHtmaWxlOmZpbGV9KTsKKyAgICAgICAgfTsKKworICAgICAgICAkc2NvcGUucmVmcmVzaCgpOworICAgIH0pOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvaW5kZXguanMgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9pbmRleC5qcwppbmRleCBkZGExYTJlLi5mN2NlNWE4IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9pbmRleC5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9pbmRleC5qcwpAQCAtMSw5NyArMSw5NyBAQAotLyoNCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotDQotc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ0luZGV4Q29udHJvbGxlcicsIGZ1bmN0aW9uKCRzY29wZSwgU3lzdGVtLCBDb3JlcywgQ29uc3RhbnRzKSB7DQotICAkc2NvcGUucmVzZXRNZW51KCJpbmRleCIsIENvbnN0YW50cy5JU19ST09UX1BBR0UpOw0KLSAgJHNjb3BlLnJlbG9hZCA9IGZ1bmN0aW9uKCkgew0KLSAgICBTeXN0ZW0uZ2V0KGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAkc2NvcGUuc3lzdGVtID0gZGF0YTsNCi0NCi0gICAgICAvLyBsb2FkIGF2ZXJhZ2UNCi0gICAgICB2YXIgbG9hZF9hdmVyYWdlID0gKCBkYXRhLnN5c3RlbS51cHRpbWUgfHwgJycgKS5tYXRjaCggL2xvYWQgYXZlcmFnZXM/OiAoXGQrWy4sXVxkXGQpLD8gKFxkK1suLF1cZFxkKSw/IChcZCtbLixdXGRcZCkvICk7DQotICAgICAgaWYgKGxvYWRfYXZlcmFnZSkgew0KLSAgICAgICAgZm9yICh2YXIgaT0wO2k8MjtpKyspIHsNCi0gICAgICAgICAgbG9hZF9hdmVyYWdlW2ldPWxvYWRfYXZlcmFnZVtpXS5yZXBsYWNlKCIsIiwiLiIpOyAvLyBmb3IgRXVyb3BlYW4gdXNlcnMNCi0gICAgICAgIH0NCi0gICAgICAgICRzY29wZS5sb2FkX2F2ZXJhZ2UgPSBsb2FkX2F2ZXJhZ2Uuc2xpY2UoMSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8vIHBoeXNpY2FsIG1lbW9yeQ0KLSAgICAgIHZhciBtZW1vcnlNYXggPSBwYXJzZV9tZW1vcnlfdmFsdWUoZGF0YS5zeXN0ZW0udG90YWxQaHlzaWNhbE1lbW9yeVNpemUpOw0KLSAgICAgICRzY29wZS5tZW1vcnlUb3RhbCA9IHBhcnNlX21lbW9yeV92YWx1ZShkYXRhLnN5c3RlbS50b3RhbFBoeXNpY2FsTWVtb3J5U2l6ZSAtIGRhdGEuc3lzdGVtLmZyZWVQaHlzaWNhbE1lbW9yeVNpemUpOw0KLSAgICAgICRzY29wZS5tZW1vcnlQZXJjZW50YWdlID0gKCRzY29wZS5tZW1vcnlUb3RhbCAvIG1lbW9yeU1heCAqIDEwMCkudG9GaXhlZCgxKSsgIiUiOw0KLSAgICAgICRzY29wZS5tZW1vcnlNYXggPSBwcmV0dHlfcHJpbnRfYnl0ZXMobWVtb3J5TWF4KTsNCi0gICAgICAkc2NvcGUubWVtb3J5VG90YWxEaXNwbGF5ID0gcHJldHR5X3ByaW50X2J5dGVzKCRzY29wZS5tZW1vcnlUb3RhbCk7DQotDQotICAgICAgLy8gc3dhcCBzcGFjZQ0KLSAgICAgIHZhciBzd2FwTWF4ID0gcGFyc2VfbWVtb3J5X3ZhbHVlKGRhdGEuc3lzdGVtLnRvdGFsU3dhcFNwYWNlU2l6ZSk7DQotICAgICAgJHNjb3BlLnN3YXBUb3RhbCA9IHBhcnNlX21lbW9yeV92YWx1ZShkYXRhLnN5c3RlbS50b3RhbFN3YXBTcGFjZVNpemUgLSBkYXRhLnN5c3RlbS5mcmVlU3dhcFNwYWNlU2l6ZSk7DQotICAgICAgJHNjb3BlLnN3YXBQZXJjZW50YWdlID0gKCRzY29wZS5zd2FwVG90YWwgLyBzd2FwTWF4ICogMTAwKS50b0ZpeGVkKDEpKyAiJSI7DQotICAgICAgJHNjb3BlLnN3YXBNYXggPSBwcmV0dHlfcHJpbnRfYnl0ZXMoc3dhcE1heCk7DQotICAgICAgJHNjb3BlLnN3YXBUb3RhbERpc3BsYXkgPSBwcmV0dHlfcHJpbnRfYnl0ZXMoJHNjb3BlLnN3YXBUb3RhbCk7DQotDQotICAgICAgLy8gZmlsZSBoYW5kbGVzDQotICAgICAgJHNjb3BlLmZpbGVEZXNjcmlwdG9yUGVyY2VudGFnZSA9IChkYXRhLnN5c3RlbS5vcGVuRmlsZURlc2NyaXB0b3JDb3VudCAvIGRhdGEuc3lzdGVtLm1heEZpbGVEZXNjcmlwdG9yQ291bnQgKjEwMCkudG9GaXhlZCgxKSArICIlIjsNCi0NCi0gICAgICAvLyBqYXZhIG1lbW9yeQ0KLSAgICAgIHZhciBqYXZhTWVtb3J5TWF4ID0gcGFyc2VfbWVtb3J5X3ZhbHVlKGRhdGEuanZtLm1lbW9yeS5yYXcubWF4IHx8IGRhdGEuanZtLm1lbW9yeS5tYXgpOw0KLSAgICAgICRzY29wZS5qYXZhTWVtb3J5VG90YWwgPSBwYXJzZV9tZW1vcnlfdmFsdWUoZGF0YS5qdm0ubWVtb3J5LnJhdy50b3RhbCB8fCBkYXRhLmp2bS5tZW1vcnkudG90YWwpOw0KLSAgICAgICRzY29wZS5qYXZhTWVtb3J5VXNlZCA9IHBhcnNlX21lbW9yeV92YWx1ZShkYXRhLmp2bS5tZW1vcnkucmF3LnVzZWQgfHwgZGF0YS5qdm0ubWVtb3J5LnVzZWQpOw0KLSAgICAgICRzY29wZS5qYXZhTWVtb3J5VG90YWxQZXJjZW50YWdlID0gKCRzY29wZS5qYXZhTWVtb3J5VG90YWwgLyBqYXZhTWVtb3J5TWF4ICoxMDApLnRvRml4ZWQoMSkgKyAiJSI7DQotICAgICAgJHNjb3BlLmphdmFNZW1vcnlVc2VkUGVyY2VudGFnZSA9ICgkc2NvcGUuamF2YU1lbW9yeVVzZWQgLyAkc2NvcGUuamF2YU1lbW9yeVRvdGFsICoxMDApLnRvRml4ZWQoMSkgKyAiJSI7DQotICAgICAgJHNjb3BlLmphdmFNZW1vcnlQZXJjZW50YWdlID0gKCRzY29wZS5qYXZhTWVtb3J5VXNlZCAvIGphdmFNZW1vcnlNYXggKiAxMDApLnRvRml4ZWQoMSkgKyAiJSI7DQotICAgICAgJHNjb3BlLmphdmFNZW1vcnlUb3RhbERpc3BsYXkgPSBwcmV0dHlfcHJpbnRfYnl0ZXMoJHNjb3BlLmphdmFNZW1vcnlUb3RhbCk7DQotICAgICAgJHNjb3BlLmphdmFNZW1vcnlVc2VkRGlzcGxheSA9IHByZXR0eV9wcmludF9ieXRlcygkc2NvcGUuamF2YU1lbW9yeVVzZWQpOyAgLy8gQHRvZG8gVGhlc2Ugc2hvdWxkIHJlYWxseSBiZSBhbiBBbmd1bGFySlMgRmlsdGVyOiB7eyBqYXZhTWVtb3J5VXNlZCB8IGJ5dGVzIH19DQotICAgICAgJHNjb3BlLmphdmFNZW1vcnlNYXggPSBwcmV0dHlfcHJpbnRfYnl0ZXMoamF2YU1lbW9yeU1heCk7DQotDQotICAgICAgLy8gbm8gaW5mbyBiYXI6DQotICAgICAgJHNjb3BlLm5vSW5mbyA9ICEoDQotICAgICAgICBkYXRhLnN5c3RlbS50b3RhbFBoeXNpY2FsTWVtb3J5U2l6ZSAmJiBkYXRhLnN5c3RlbS5mcmVlUGh5c2ljYWxNZW1vcnlTaXplICYmDQotICAgICAgICBkYXRhLnN5c3RlbS50b3RhbFN3YXBTcGFjZVNpemUgJiYgZGF0YS5zeXN0ZW0uZnJlZVN3YXBTcGFjZVNpemUgJiYNCi0gICAgICAgIGRhdGEuc3lzdGVtLm9wZW5GaWxlRGVzY3JpcHRvckNvdW50ICYmIGRhdGEuc3lzdGVtLm1heEZpbGVEZXNjcmlwdG9yQ291bnQpOw0KLQ0KLSAgICAgIC8vIGNvbW1hbmQgbGluZSBhcmdzOg0KLSAgICAgICRzY29wZS5jb21tYW5kTGluZUFyZ3MgPSBkYXRhLmp2bS5qbXguY29tbWFuZExpbmVBcmdzLnNvcnQoKTsNCi0gICAgfSk7DQotICB9Ow0KLSAgJHNjb3BlLnJlbG9hZCgpOw0KLX0pOw0KLQ0KLXZhciBwYXJzZV9tZW1vcnlfdmFsdWUgPSBmdW5jdGlvbiggdmFsdWUgKSB7DQotICBpZiggdmFsdWUgIT09IE51bWJlciggdmFsdWUgKSApDQotICB7DQotICAgIHZhciB1bml0cyA9ICdCS01HVFBFWlknOw0KLSAgICB2YXIgbWF0Y2ggPSB2YWx1ZS5tYXRjaCggL14oXGQrKFssXC5dXGQrKT8pIChcdykuKiQvICk7DQotICAgIHZhciB2YWx1ZSA9IHBhcnNlRmxvYXQoIG1hdGNoWzFdICkgKiBNYXRoLnBvdyggMTAyNCwgdW5pdHMuaW5kZXhPZiggbWF0Y2hbM10udG9VcHBlckNhc2UoKSApICk7DQotICB9DQotDQotICByZXR1cm4gdmFsdWU7DQotfTsNCi0NCi12YXIgcHJldHR5X3ByaW50X2J5dGVzID0gZnVuY3Rpb24oYnl0ZV92YWx1ZSkgew0KLSAgdmFyIHVuaXQgPSBudWxsOw0KLQ0KLSAgYnl0ZV92YWx1ZSAvPSAxMDI0Ow0KLSAgYnl0ZV92YWx1ZSAvPSAxMDI0Ow0KLSAgdW5pdCA9ICdNQic7DQotDQotICBpZiggMTAyNCA8PSBieXRlX3ZhbHVlICkgew0KLSAgICBieXRlX3ZhbHVlIC89IDEwMjQ7DQotICAgIHVuaXQgPSAnR0InOw0KLSAgfQ0KLSAgcmV0dXJuIGJ5dGVfdmFsdWUudG9GaXhlZCggMiApICsgJyAnICsgdW5pdDsNCi19Ow0KKy8qCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitzb2xyQWRtaW5BcHAuY29udHJvbGxlcignSW5kZXhDb250cm9sbGVyJywgZnVuY3Rpb24oJHNjb3BlLCBTeXN0ZW0sIENvcmVzLCBDb25zdGFudHMpIHsKKyAgJHNjb3BlLnJlc2V0TWVudSgiaW5kZXgiLCBDb25zdGFudHMuSVNfUk9PVF9QQUdFKTsKKyAgJHNjb3BlLnJlbG9hZCA9IGZ1bmN0aW9uKCkgeworICAgIFN5c3RlbS5nZXQoZnVuY3Rpb24oZGF0YSkgeworICAgICAgJHNjb3BlLnN5c3RlbSA9IGRhdGE7CisKKyAgICAgIC8vIGxvYWQgYXZlcmFnZQorICAgICAgdmFyIGxvYWRfYXZlcmFnZSA9ICggZGF0YS5zeXN0ZW0udXB0aW1lIHx8ICcnICkubWF0Y2goIC9sb2FkIGF2ZXJhZ2VzPzogKFxkK1suLF1cZFxkKSw/IChcZCtbLixdXGRcZCksPyAoXGQrWy4sXVxkXGQpLyApOworICAgICAgaWYgKGxvYWRfYXZlcmFnZSkgeworICAgICAgICBmb3IgKHZhciBpPTA7aTwyO2krKykgeworICAgICAgICAgIGxvYWRfYXZlcmFnZVtpXT1sb2FkX2F2ZXJhZ2VbaV0ucmVwbGFjZSgiLCIsIi4iKTsgLy8gZm9yIEV1cm9wZWFuIHVzZXJzCisgICAgICAgIH0KKyAgICAgICAgJHNjb3BlLmxvYWRfYXZlcmFnZSA9IGxvYWRfYXZlcmFnZS5zbGljZSgxKTsKKyAgICAgIH0KKworICAgICAgLy8gcGh5c2ljYWwgbWVtb3J5CisgICAgICB2YXIgbWVtb3J5TWF4ID0gcGFyc2VfbWVtb3J5X3ZhbHVlKGRhdGEuc3lzdGVtLnRvdGFsUGh5c2ljYWxNZW1vcnlTaXplKTsKKyAgICAgICRzY29wZS5tZW1vcnlUb3RhbCA9IHBhcnNlX21lbW9yeV92YWx1ZShkYXRhLnN5c3RlbS50b3RhbFBoeXNpY2FsTWVtb3J5U2l6ZSAtIGRhdGEuc3lzdGVtLmZyZWVQaHlzaWNhbE1lbW9yeVNpemUpOworICAgICAgJHNjb3BlLm1lbW9yeVBlcmNlbnRhZ2UgPSAoJHNjb3BlLm1lbW9yeVRvdGFsIC8gbWVtb3J5TWF4ICogMTAwKS50b0ZpeGVkKDEpKyAiJSI7CisgICAgICAkc2NvcGUubWVtb3J5TWF4ID0gcHJldHR5X3ByaW50X2J5dGVzKG1lbW9yeU1heCk7CisgICAgICAkc2NvcGUubWVtb3J5VG90YWxEaXNwbGF5ID0gcHJldHR5X3ByaW50X2J5dGVzKCRzY29wZS5tZW1vcnlUb3RhbCk7CisKKyAgICAgIC8vIHN3YXAgc3BhY2UKKyAgICAgIHZhciBzd2FwTWF4ID0gcGFyc2VfbWVtb3J5X3ZhbHVlKGRhdGEuc3lzdGVtLnRvdGFsU3dhcFNwYWNlU2l6ZSk7CisgICAgICAkc2NvcGUuc3dhcFRvdGFsID0gcGFyc2VfbWVtb3J5X3ZhbHVlKGRhdGEuc3lzdGVtLnRvdGFsU3dhcFNwYWNlU2l6ZSAtIGRhdGEuc3lzdGVtLmZyZWVTd2FwU3BhY2VTaXplKTsKKyAgICAgICRzY29wZS5zd2FwUGVyY2VudGFnZSA9ICgkc2NvcGUuc3dhcFRvdGFsIC8gc3dhcE1heCAqIDEwMCkudG9GaXhlZCgxKSsgIiUiOworICAgICAgJHNjb3BlLnN3YXBNYXggPSBwcmV0dHlfcHJpbnRfYnl0ZXMoc3dhcE1heCk7CisgICAgICAkc2NvcGUuc3dhcFRvdGFsRGlzcGxheSA9IHByZXR0eV9wcmludF9ieXRlcygkc2NvcGUuc3dhcFRvdGFsKTsKKworICAgICAgLy8gZmlsZSBoYW5kbGVzCisgICAgICAkc2NvcGUuZmlsZURlc2NyaXB0b3JQZXJjZW50YWdlID0gKGRhdGEuc3lzdGVtLm9wZW5GaWxlRGVzY3JpcHRvckNvdW50IC8gZGF0YS5zeXN0ZW0ubWF4RmlsZURlc2NyaXB0b3JDb3VudCAqMTAwKS50b0ZpeGVkKDEpICsgIiUiOworCisgICAgICAvLyBqYXZhIG1lbW9yeQorICAgICAgdmFyIGphdmFNZW1vcnlNYXggPSBwYXJzZV9tZW1vcnlfdmFsdWUoZGF0YS5qdm0ubWVtb3J5LnJhdy5tYXggfHwgZGF0YS5qdm0ubWVtb3J5Lm1heCk7CisgICAgICAkc2NvcGUuamF2YU1lbW9yeVRvdGFsID0gcGFyc2VfbWVtb3J5X3ZhbHVlKGRhdGEuanZtLm1lbW9yeS5yYXcudG90YWwgfHwgZGF0YS5qdm0ubWVtb3J5LnRvdGFsKTsKKyAgICAgICRzY29wZS5qYXZhTWVtb3J5VXNlZCA9IHBhcnNlX21lbW9yeV92YWx1ZShkYXRhLmp2bS5tZW1vcnkucmF3LnVzZWQgfHwgZGF0YS5qdm0ubWVtb3J5LnVzZWQpOworICAgICAgJHNjb3BlLmphdmFNZW1vcnlUb3RhbFBlcmNlbnRhZ2UgPSAoJHNjb3BlLmphdmFNZW1vcnlUb3RhbCAvIGphdmFNZW1vcnlNYXggKjEwMCkudG9GaXhlZCgxKSArICIlIjsKKyAgICAgICRzY29wZS5qYXZhTWVtb3J5VXNlZFBlcmNlbnRhZ2UgPSAoJHNjb3BlLmphdmFNZW1vcnlVc2VkIC8gJHNjb3BlLmphdmFNZW1vcnlUb3RhbCAqMTAwKS50b0ZpeGVkKDEpICsgIiUiOworICAgICAgJHNjb3BlLmphdmFNZW1vcnlQZXJjZW50YWdlID0gKCRzY29wZS5qYXZhTWVtb3J5VXNlZCAvIGphdmFNZW1vcnlNYXggKiAxMDApLnRvRml4ZWQoMSkgKyAiJSI7CisgICAgICAkc2NvcGUuamF2YU1lbW9yeVRvdGFsRGlzcGxheSA9IHByZXR0eV9wcmludF9ieXRlcygkc2NvcGUuamF2YU1lbW9yeVRvdGFsKTsKKyAgICAgICRzY29wZS5qYXZhTWVtb3J5VXNlZERpc3BsYXkgPSBwcmV0dHlfcHJpbnRfYnl0ZXMoJHNjb3BlLmphdmFNZW1vcnlVc2VkKTsgIC8vIEB0b2RvIFRoZXNlIHNob3VsZCByZWFsbHkgYmUgYW4gQW5ndWxhckpTIEZpbHRlcjoge3sgamF2YU1lbW9yeVVzZWQgfCBieXRlcyB9fQorICAgICAgJHNjb3BlLmphdmFNZW1vcnlNYXggPSBwcmV0dHlfcHJpbnRfYnl0ZXMoamF2YU1lbW9yeU1heCk7CisKKyAgICAgIC8vIG5vIGluZm8gYmFyOgorICAgICAgJHNjb3BlLm5vSW5mbyA9ICEoCisgICAgICAgIGRhdGEuc3lzdGVtLnRvdGFsUGh5c2ljYWxNZW1vcnlTaXplICYmIGRhdGEuc3lzdGVtLmZyZWVQaHlzaWNhbE1lbW9yeVNpemUgJiYKKyAgICAgICAgZGF0YS5zeXN0ZW0udG90YWxTd2FwU3BhY2VTaXplICYmIGRhdGEuc3lzdGVtLmZyZWVTd2FwU3BhY2VTaXplICYmCisgICAgICAgIGRhdGEuc3lzdGVtLm9wZW5GaWxlRGVzY3JpcHRvckNvdW50ICYmIGRhdGEuc3lzdGVtLm1heEZpbGVEZXNjcmlwdG9yQ291bnQpOworCisgICAgICAvLyBjb21tYW5kIGxpbmUgYXJnczoKKyAgICAgICRzY29wZS5jb21tYW5kTGluZUFyZ3MgPSBkYXRhLmp2bS5qbXguY29tbWFuZExpbmVBcmdzLnNvcnQoKTsKKyAgICB9KTsKKyAgfTsKKyAgJHNjb3BlLnJlbG9hZCgpOworfSk7CisKK3ZhciBwYXJzZV9tZW1vcnlfdmFsdWUgPSBmdW5jdGlvbiggdmFsdWUgKSB7CisgIGlmKCB2YWx1ZSAhPT0gTnVtYmVyKCB2YWx1ZSApICkKKyAgeworICAgIHZhciB1bml0cyA9ICdCS01HVFBFWlknOworICAgIHZhciBtYXRjaCA9IHZhbHVlLm1hdGNoKCAvXihcZCsoWyxcLl1cZCspPykgKFx3KS4qJC8gKTsKKyAgICB2YXIgdmFsdWUgPSBwYXJzZUZsb2F0KCBtYXRjaFsxXSApICogTWF0aC5wb3coIDEwMjQsIHVuaXRzLmluZGV4T2YoIG1hdGNoWzNdLnRvVXBwZXJDYXNlKCkgKSApOworICB9CisKKyAgcmV0dXJuIHZhbHVlOworfTsKKwordmFyIHByZXR0eV9wcmludF9ieXRlcyA9IGZ1bmN0aW9uKGJ5dGVfdmFsdWUpIHsKKyAgdmFyIHVuaXQgPSBudWxsOworCisgIGJ5dGVfdmFsdWUgLz0gMTAyNDsKKyAgYnl0ZV92YWx1ZSAvPSAxMDI0OworICB1bml0ID0gJ01CJzsKKworICBpZiggMTAyNCA8PSBieXRlX3ZhbHVlICkgeworICAgIGJ5dGVfdmFsdWUgLz0gMTAyNDsKKyAgICB1bml0ID0gJ0dCJzsKKyAgfQorICByZXR1cm4gYnl0ZV92YWx1ZS50b0ZpeGVkKCAyICkgKyAnICcgKyB1bml0OworfTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2phdmEtcHJvcGVydGllcy5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2phdmEtcHJvcGVydGllcy5qcwppbmRleCAyYWVkOWM4Li4wMDFlZGZiIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9qYXZhLXByb3BlcnRpZXMuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvamF2YS1wcm9wZXJ0aWVzLmpzCkBAIC0xLDQ1ICsxLDQ1IEBACi0vKg0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotDQotc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ0phdmFQcm9wZXJ0aWVzQ29udHJvbGxlcicsDQotICBmdW5jdGlvbigkc2NvcGUsIFByb3BlcnRpZXMsIENvbnN0YW50cyl7DQotICAgICRzY29wZS5yZXNldE1lbnUoImphdmEtcHJvcHMiLCBDb25zdGFudHMuSVNfUk9PVF9QQUdFKTsNCi0gICAgJHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHsNCi0gICAgICBQcm9wZXJ0aWVzLmdldChmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICB2YXIgc3lzcHJvcHMgPSBkYXRhWyJzeXN0ZW0ucHJvcGVydGllcyJdOw0KLSAgICAgICAgdmFyIHNlcCA9IHN5c3Byb3BzWyJwYXRoLnNlcGFyYXRvciJdDQotICAgICAgICB2YXIgcHJvcHMgPSBbXTsNCi0gICAgICAgIGZvciAodmFyIGtleSBpbiBzeXNwcm9wcykgew0KLSAgICAgICAgICB2YXIgdmFsdWUgPSBzeXNwcm9wc1trZXldOw0KLSAgICAgICAgICB2YXIga2V5ID0ga2V5LnJlcGxhY2UoL1wuL2csICcuJiM4MjAzOycpOw0KLSAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoIi5wYXRoIikhPS0xIHx8IGtleS5pbmRleE9mKCIuZGlycyIpKSB7DQotICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOw0KLSAgICAgICAgICAgIHZhciBwYXJ0cyA9IHZhbHVlLnNwbGl0KHNlcCk7DQotICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBwYXJ0cykgew0KLSAgICAgICAgICAgICAgdmFsdWVzLnB1c2goe3BvczppLCB2YWx1ZTpwYXJ0c1tpXX0pDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHByb3BzLnB1c2goe25hbWU6IGtleSwgdmFsdWVzOiB2YWx1ZXN9KTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBwcm9wcy5wdXNoKHtuYW1lOiBrZXksIHZhbHVlczogW3ZhbHVlXX0pOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAkc2NvcGUucHJvcHMgPSBwcm9wczsNCi0gICAgICB9KTsNCi0gICAgfTsNCi0NCi0gICAgJHNjb3BlLnJlZnJlc2goKTsNCi0gIH0pOw0KKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ0phdmFQcm9wZXJ0aWVzQ29udHJvbGxlcicsCisgIGZ1bmN0aW9uKCRzY29wZSwgUHJvcGVydGllcywgQ29uc3RhbnRzKXsKKyAgICAkc2NvcGUucmVzZXRNZW51KCJqYXZhLXByb3BzIiwgQ29uc3RhbnRzLklTX1JPT1RfUEFHRSk7CisgICAgJHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHsKKyAgICAgIFByb3BlcnRpZXMuZ2V0KGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgdmFyIHN5c3Byb3BzID0gZGF0YVsic3lzdGVtLnByb3BlcnRpZXMiXTsKKyAgICAgICAgdmFyIHNlcCA9IHN5c3Byb3BzWyJwYXRoLnNlcGFyYXRvciJdCisgICAgICAgIHZhciBwcm9wcyA9IFtdOworICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3lzcHJvcHMpIHsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBzeXNwcm9wc1trZXldOworICAgICAgICAgIHZhciBrZXkgPSBrZXkucmVwbGFjZSgvXC4vZywgJy4mIzgyMDM7Jyk7CisgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCIucGF0aCIpIT0tMSB8fCBrZXkuaW5kZXhPZigiLmRpcnMiKSkgeworICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdOworICAgICAgICAgICAgdmFyIHBhcnRzID0gdmFsdWUuc3BsaXQoc2VwKTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGFydHMpIHsKKyAgICAgICAgICAgICAgdmFsdWVzLnB1c2goe3BvczppLCB2YWx1ZTpwYXJ0c1tpXX0pCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9wcy5wdXNoKHtuYW1lOiBrZXksIHZhbHVlczogdmFsdWVzfSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb3BzLnB1c2goe25hbWU6IGtleSwgdmFsdWVzOiBbdmFsdWVdfSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICRzY29wZS5wcm9wcyA9IHByb3BzOworICAgICAgfSk7CisgICAgfTsKKworICAgICRzY29wZS5yZWZyZXNoKCk7CisgIH0pOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvbG9nZ2luZy5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL2xvZ2dpbmcuanMKaW5kZXggZmU3NWI5NC4uMzE3NDc0NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvbG9nZ2luZy5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9sb2dnaW5nLmpzCkBAIC0xLDE1MCArMSwxNTAgQEAKLS8qDQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi0NCi12YXIgZm9ybWF0X3RpbWVfY29udGVudCA9IGZ1bmN0aW9uKCB0aW1lLCB0aW1lWm9uZSApIHsNCi0gIHZhciBmb3JtYXRfdGltZV9vcHRpb25zID0ge307DQotICBpZiAodGltZVpvbmUgJiYgdGltZVpvbmUhPSJMb2NhbCIpIHsNCi0gICAgZm9ybWF0X3RpbWVfb3B0aW9ucy50aW1lWm9uZSA9IHRpbWVab25lOw0KLSAgfQ0KLSAgcmV0dXJuIHRpbWUudG9Mb2NhbGVTdHJpbmcoIHVuZGVmaW5lZCwgZm9ybWF0X3RpbWVfb3B0aW9ucyApOw0KLX0NCi0NCi1zb2xyQWRtaW5BcHAuY29udHJvbGxlcignTG9nZ2luZ0NvbnRyb2xsZXInLA0KLSAgZnVuY3Rpb24oJHNjb3BlLCAkdGltZW91dCwgJGNvb2tpZXMsIExvZ2dpbmcsIENvbnN0YW50cyl7DQotICAgICRzY29wZS5yZXNldE1lbnUoImxvZ2dpbmciLCBDb25zdGFudHMuSVNfUk9PVF9QQUdFKTsNCi0gICAgJHNjb3BlLnRpbWV6b25lID0gJGNvb2tpZXMubG9nZ2luZ190aW1lem9uZSB8fCAiTG9jYWwiOw0KLSAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIExvZ2dpbmcuZXZlbnRzKGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICRzY29wZS5zaW5jZSA9IG5ldyBEYXRlKCk7DQotICAgICAgICAkc2NvcGUuc2luY2VEaXNwbGF5ID0gZm9ybWF0X3RpbWVfY29udGVudCgkc2NvcGUuc2luY2UsICJMb2NhbCIpOw0KLSAgICAgICAgdmFyIGV2ZW50cyA9IGRhdGEuaGlzdG9yeS5kb2NzOw0KLSAgICAgICAgZm9yICh2YXIgaT0wOyBpPGV2ZW50cy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICB2YXIgZXZlbnQgPSBldmVudHNbaV07DQotICAgICAgICAgIHZhciB0aW1lID0gbmV3IERhdGUoZXZlbnQudGltZSk7DQotICAgICAgICAgIGV2ZW50LmxvY2FsX3RpbWUgPSBmb3JtYXRfdGltZV9jb250ZW50KHRpbWUsICJMb2NhbCIpOw0KLSAgICAgICAgICBldmVudC51dGNfdGltZSA9IGZvcm1hdF90aW1lX2NvbnRlbnQodGltZSwgIlVUQyIpOw0KLSAgICAgICAgICBldmVudC5sb2dnZXJCYXNlID0gZXZlbnQubG9nZ2VyLnNwbGl0KCAnLicgKS5wb3AoKTsNCi0NCi0gICAgICAgICAgaWYoICFldmVudC50cmFjZSApIHsNCi0gICAgICAgICAgICB2YXIgbGluZXMgPSBldmVudC5tZXNzYWdlLnNwbGl0KCAiXG4iICk7DQotICAgICAgICAgICAgaWYoIGxpbmVzLmxlbmd0aCA+IDEpIHsNCi0gICAgICAgICAgICAgIGV2ZW50LnRyYWNlID0gZXZlbnQubWVzc2FnZTsNCi0gICAgICAgICAgICAgIGV2ZW50Lm1lc3NhZ2UgPSBsaW5lc1swXTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgICAgZXZlbnQubWVzc2FnZSA9IGV2ZW50Lm1lc3NhZ2UucmVwbGFjZSgvLC9nLCAnLCYjODIwMzsnKTsNCi0gICAgICAgICAgZXZlbnQuc2hvd1RyYWNlID0gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICAkc2NvcGUuZXZlbnRzID0gZXZlbnRzOw0KLSAgICAgICAgJHNjb3BlLndhdGNoZXIgPSBkYXRhLndhdGNoZXI7DQotICAgICAgICAvKiBAdG9kbyBzdGlja3lfbW9kZQ0KLSAgICAgICAgLy8gc3RhdGUgZWxlbWVudCBpcyBpbiB2aWV3cG9ydA0KLSAgICAgICAgc3RpY2t5X21vZGUgPSAoIHN0YXRlLnBvc2l0aW9uKCkudG9wIDw9ICQoIHdpbmRvdyApLnNjcm9sbFRvcCgpICsgJCggd2luZG93ICkuaGVpZ2h0KCkgLSAoICQoICdib2R5JyApLmhlaWdodCgpIC0gc3RhdGUucG9zaXRpb24oKS50b3AgKSApOw0KLSAgICAgICAgLy8gaW5pdGlhbCByZXF1ZXN0DQotICAgICAgICBpZiggMCA9PT0gc2luY2UgKSB7DQotICAgICAgICAgIHN0aWNreV9tb2RlID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgICRzY29wZS5sb2dnaW5nRXZlbnRzID0gZXZlbnRzOw0KLQ0KLSAgICAgICAgaWYoIHN0aWNreV9tb2RlICkNCi0gICAgICAgIHsNCi0gICAgICAgICAgJCggJ2JvZHknICkNCi0gICAgICAgICAgICAuYW5pbWF0ZQ0KLSAgICAgICAgICAgICgNCi0gICAgICAgICAgICAgICAgeyBzY3JvbGxUb3A6IHN0YXRlLnBvc2l0aW9uKCkudG9wIH0sDQotICAgICAgICAgICAgICAgIDEwMDANCi0gICAgICAgICAgICApOw0KLSAgICAgICAgfQ0KLSAgICAgICovDQotICAgICAgfSk7DQotICAgICAgJHNjb3BlLnRpbWVvdXQgPSAkdGltZW91dCgkc2NvcGUucmVmcmVzaCwgMTAwMDApOw0KLSAgICAgIHZhciBvblJvdXRlQ2hhbmdlT2ZmID0gJHNjb3BlLiRvbignJHJvdXRlQ2hhbmdlU3RhcnQnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICR0aW1lb3V0LmNhbmNlbCgkc2NvcGUudGltZW91dCk7DQotICAgICAgICBvblJvdXRlQ2hhbmdlT2ZmKCk7DQotICAgICAgfSk7DQotICAgIH07DQotICAgICRzY29wZS5yZWZyZXNoKCk7DQotDQotICAgICRzY29wZS50b2dnbGVUaW1lem9uZSA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICRzY29wZS50aW1lem9uZSA9ICgkc2NvcGUudGltZXpvbmU9PSJMb2NhbCIpID8gIlVUQyI6IkxvY2FsIjsNCi0gICAgICAkY29va2llcy5sb2dnaW5nX3RpbWV6b25lID0gJHNjb3BlLnRpbWV6b25lOw0KLSAgICB9DQotICAgICRzY29wZS50b2dnbGVSb3cgPSBmdW5jdGlvbihldmVudCkgew0KLSAgICAgIGV2ZW50LnNob3dUcmFjZSA9ISBldmVudC5zaG93VHJhY2U7DQotICAgIH07DQotICAgfQ0KLSkNCi0NCi0uY29udHJvbGxlcignTG9nZ2luZ0xldmVsQ29udHJvbGxlcicsDQotICBmdW5jdGlvbigkc2NvcGUsIExvZ2dpbmcpIHsNCi0gICAgJHNjb3BlLnJlc2V0TWVudSgibG9nZ2luZy1sZXZlbHMiKTsNCi0NCi0gICAgdmFyIHBhY2thZ2VPZiA9IGZ1bmN0aW9uKGxvZ2dlcikgew0KLSAgICAgIHZhciBwYXJ0cyA9IGxvZ2dlci5uYW1lLnNwbGl0KCIuIik7DQotICAgICAgcmV0dXJuICFwYXJ0cy5wb3AoKSA/ICIiIDogcGFydHMuam9pbigiLiIpOw0KLSAgICB9Ow0KLQ0KLSAgICB2YXIgc2hvcnROYW1lT2YgPSBmdW5jdGlvbihsb2dnZXIpIHtyZXR1cm4gbG9nZ2VyLm5hbWUuc3BsaXQoIi4iKS5wb3AoKTt9DQotDQotICAgIHZhciBtYWtlVHJlZSA9IGZ1bmN0aW9uKGxvZ2dlcnMsIHBhY2thZykgew0KLSAgICAgIHZhciB0cmVlID0gW107DQotICAgICAgZm9yICh2YXIgaT0wOyBpPGxvZ2dlcnMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgIHZhciBsb2dnZXIgPSBsb2dnZXJzW2ldOw0KLSAgICAgICAgbG9nZ2VyLnBhY2thZyA9IHBhY2thZ2VPZihsb2dnZXIpOw0KLSAgICAgICAgbG9nZ2VyLnNob3J0ID0gc2hvcnROYW1lT2YobG9nZ2VyKTsNCi0gICAgICAgIGlmIChsb2dnZXIucGFja2FnID09IHBhY2thZykgew0KLSAgICAgICAgICBsb2dnZXIuY2hpbGRyZW4gPSBtYWtlVHJlZShsb2dnZXJzLCBsb2dnZXIubmFtZSk7DQotICAgICAgICAgIHRyZWUucHVzaChsb2dnZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gdHJlZTsNCi0gICAgfTsNCi0NCi0gICAgJHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHsNCi0gICAgICBMb2dnaW5nLmxldmVscyhmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAkc2NvcGUubG9nZ2luZyA9IG1ha2VUcmVlKGRhdGEubG9nZ2VycywgIiIpOw0KLSAgICAgICAgJHNjb3BlLndhdGNoZXIgPSBkYXRhLndhdGNoZXI7DQotICAgICAgICAkc2NvcGUubGV2ZWxzID0gW107DQotICAgICAgICBmb3IgKGxldmVsIGluIGRhdGEubGV2ZWxzKSB7DQotICAgICAgICAgICRzY29wZS5sZXZlbHMucHVzaCh7bmFtZTpkYXRhLmxldmVsc1tsZXZlbF0sIHBvczpsZXZlbH0pOw0KLSAgICAgICAgfQ0KLSAgICAgIH0pOw0KLSAgICB9Ow0KLQ0KLSAgICAkc2NvcGUudG9nZ2xlT3B0aW9ucyA9IGZ1bmN0aW9uKGxvZ2dlcikgew0KLSAgICAgIGlmIChsb2dnZXIuc2hvd09wdGlvbnMpIHsNCi0gICAgICAgIGxvZ2dlci5zaG93T3B0aW9ucyA9IGZhbHNlOw0KLSAgICAgICAgZGVsZXRlICRzY29wZS5jdXJyZW50TG9nZ2VyOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAoJHNjb3BlLmN1cnJlbnRMb2dnZXIpIHsNCi0gICAgICAgICAgJHNjb3BlLmN1cnJlbnRMb2dnZXIuc2hvd09wdGlvbnMgPSBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGxvZ2dlci5zaG93T3B0aW9ucyA9IHRydWU7DQotICAgICAgICAkc2NvcGUuY3VycmVudExvZ2dlciA9IGxvZ2dlcjsNCi0gICAgICB9DQotICAgIH07DQotDQotICAgICRzY29wZS5zZXRMZXZlbCA9IGZ1bmN0aW9uKGxvZ2dlciwgbmV3TGV2ZWwpIHsNCi0gICAgICB2YXIgc2V0U3RyaW5nID0gbG9nZ2VyLm5hbWUgKyAiOiIgKyBuZXdMZXZlbDsNCi0gICAgICBsb2dnZXIuc2hvd09wdGlvbnMgPSBmYWxzZTsNCi0gICAgICBMb2dnaW5nLnNldExldmVsKHtzZXQ6IHNldFN0cmluZ30sIGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICRzY29wZS5yZWZyZXNoKCk7DQotICAgICAgfSk7DQotICAgIH07DQotDQotICAgICRzY29wZS5yZWZyZXNoKCk7DQotICB9KTsNCisvKgorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3ZhciBmb3JtYXRfdGltZV9jb250ZW50ID0gZnVuY3Rpb24oIHRpbWUsIHRpbWVab25lICkgeworICB2YXIgZm9ybWF0X3RpbWVfb3B0aW9ucyA9IHt9OworICBpZiAodGltZVpvbmUgJiYgdGltZVpvbmUhPSJMb2NhbCIpIHsKKyAgICBmb3JtYXRfdGltZV9vcHRpb25zLnRpbWVab25lID0gdGltZVpvbmU7CisgIH0KKyAgcmV0dXJuIHRpbWUudG9Mb2NhbGVTdHJpbmcoIHVuZGVmaW5lZCwgZm9ybWF0X3RpbWVfb3B0aW9ucyApOworfQorCitzb2xyQWRtaW5BcHAuY29udHJvbGxlcignTG9nZ2luZ0NvbnRyb2xsZXInLAorICBmdW5jdGlvbigkc2NvcGUsICR0aW1lb3V0LCAkY29va2llcywgTG9nZ2luZywgQ29uc3RhbnRzKXsKKyAgICAkc2NvcGUucmVzZXRNZW51KCJsb2dnaW5nIiwgQ29uc3RhbnRzLklTX1JPT1RfUEFHRSk7CisgICAgJHNjb3BlLnRpbWV6b25lID0gJGNvb2tpZXMubG9nZ2luZ190aW1lem9uZSB8fCAiTG9jYWwiOworICAgICRzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7CisgICAgICBMb2dnaW5nLmV2ZW50cyhmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICRzY29wZS5zaW5jZSA9IG5ldyBEYXRlKCk7CisgICAgICAgICRzY29wZS5zaW5jZURpc3BsYXkgPSBmb3JtYXRfdGltZV9jb250ZW50KCRzY29wZS5zaW5jZSwgIkxvY2FsIik7CisgICAgICAgIHZhciBldmVudHMgPSBkYXRhLmhpc3RvcnkuZG9jczsKKyAgICAgICAgZm9yICh2YXIgaT0wOyBpPGV2ZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHZhciBldmVudCA9IGV2ZW50c1tpXTsKKyAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKGV2ZW50LnRpbWUpOworICAgICAgICAgIGV2ZW50LmxvY2FsX3RpbWUgPSBmb3JtYXRfdGltZV9jb250ZW50KHRpbWUsICJMb2NhbCIpOworICAgICAgICAgIGV2ZW50LnV0Y190aW1lID0gZm9ybWF0X3RpbWVfY29udGVudCh0aW1lLCAiVVRDIik7CisgICAgICAgICAgZXZlbnQubG9nZ2VyQmFzZSA9IGV2ZW50LmxvZ2dlci5zcGxpdCggJy4nICkucG9wKCk7CisKKyAgICAgICAgICBpZiggIWV2ZW50LnRyYWNlICkgeworICAgICAgICAgICAgdmFyIGxpbmVzID0gZXZlbnQubWVzc2FnZS5zcGxpdCggIlxuIiApOworICAgICAgICAgICAgaWYoIGxpbmVzLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgICAgZXZlbnQudHJhY2UgPSBldmVudC5tZXNzYWdlOworICAgICAgICAgICAgICBldmVudC5tZXNzYWdlID0gbGluZXNbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGV2ZW50Lm1lc3NhZ2UgPSBldmVudC5tZXNzYWdlLnJlcGxhY2UoLywvZywgJywmIzgyMDM7Jyk7CisgICAgICAgICAgZXZlbnQuc2hvd1RyYWNlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgJHNjb3BlLmV2ZW50cyA9IGV2ZW50czsKKyAgICAgICAgJHNjb3BlLndhdGNoZXIgPSBkYXRhLndhdGNoZXI7CisgICAgICAgIC8qIEB0b2RvIHN0aWNreV9tb2RlCisgICAgICAgIC8vIHN0YXRlIGVsZW1lbnQgaXMgaW4gdmlld3BvcnQKKyAgICAgICAgc3RpY2t5X21vZGUgPSAoIHN0YXRlLnBvc2l0aW9uKCkudG9wIDw9ICQoIHdpbmRvdyApLnNjcm9sbFRvcCgpICsgJCggd2luZG93ICkuaGVpZ2h0KCkgLSAoICQoICdib2R5JyApLmhlaWdodCgpIC0gc3RhdGUucG9zaXRpb24oKS50b3AgKSApOworICAgICAgICAvLyBpbml0aWFsIHJlcXVlc3QKKyAgICAgICAgaWYoIDAgPT09IHNpbmNlICkgeworICAgICAgICAgIHN0aWNreV9tb2RlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAkc2NvcGUubG9nZ2luZ0V2ZW50cyA9IGV2ZW50czsKKworICAgICAgICBpZiggc3RpY2t5X21vZGUgKQorICAgICAgICB7CisgICAgICAgICAgJCggJ2JvZHknICkKKyAgICAgICAgICAgIC5hbmltYXRlCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgeyBzY3JvbGxUb3A6IHN0YXRlLnBvc2l0aW9uKCkudG9wIH0sCisgICAgICAgICAgICAgICAgMTAwMAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgKi8KKyAgICAgIH0pOworICAgICAgJHNjb3BlLnRpbWVvdXQgPSAkdGltZW91dCgkc2NvcGUucmVmcmVzaCwgMTAwMDApOworICAgICAgdmFyIG9uUm91dGVDaGFuZ2VPZmYgPSAkc2NvcGUuJG9uKCckcm91dGVDaGFuZ2VTdGFydCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAkdGltZW91dC5jYW5jZWwoJHNjb3BlLnRpbWVvdXQpOworICAgICAgICBvblJvdXRlQ2hhbmdlT2ZmKCk7CisgICAgICB9KTsKKyAgICB9OworICAgICRzY29wZS5yZWZyZXNoKCk7CisKKyAgICAkc2NvcGUudG9nZ2xlVGltZXpvbmUgPSBmdW5jdGlvbigpIHsKKyAgICAgICRzY29wZS50aW1lem9uZSA9ICgkc2NvcGUudGltZXpvbmU9PSJMb2NhbCIpID8gIlVUQyI6IkxvY2FsIjsKKyAgICAgICRjb29raWVzLmxvZ2dpbmdfdGltZXpvbmUgPSAkc2NvcGUudGltZXpvbmU7CisgICAgfQorICAgICRzY29wZS50b2dnbGVSb3cgPSBmdW5jdGlvbihldmVudCkgeworICAgICAgZXZlbnQuc2hvd1RyYWNlID0hIGV2ZW50LnNob3dUcmFjZTsKKyAgICB9OworICAgfQorKQorCisuY29udHJvbGxlcignTG9nZ2luZ0xldmVsQ29udHJvbGxlcicsCisgIGZ1bmN0aW9uKCRzY29wZSwgTG9nZ2luZykgeworICAgICRzY29wZS5yZXNldE1lbnUoImxvZ2dpbmctbGV2ZWxzIik7CisKKyAgICB2YXIgcGFja2FnZU9mID0gZnVuY3Rpb24obG9nZ2VyKSB7CisgICAgICB2YXIgcGFydHMgPSBsb2dnZXIubmFtZS5zcGxpdCgiLiIpOworICAgICAgcmV0dXJuICFwYXJ0cy5wb3AoKSA/ICIiIDogcGFydHMuam9pbigiLiIpOworICAgIH07CisKKyAgICB2YXIgc2hvcnROYW1lT2YgPSBmdW5jdGlvbihsb2dnZXIpIHtyZXR1cm4gbG9nZ2VyLm5hbWUuc3BsaXQoIi4iKS5wb3AoKTt9CisKKyAgICB2YXIgbWFrZVRyZWUgPSBmdW5jdGlvbihsb2dnZXJzLCBwYWNrYWcpIHsKKyAgICAgIHZhciB0cmVlID0gW107CisgICAgICBmb3IgKHZhciBpPTA7IGk8bG9nZ2Vycy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgbG9nZ2VyID0gbG9nZ2Vyc1tpXTsKKyAgICAgICAgbG9nZ2VyLnBhY2thZyA9IHBhY2thZ2VPZihsb2dnZXIpOworICAgICAgICBsb2dnZXIuc2hvcnQgPSBzaG9ydE5hbWVPZihsb2dnZXIpOworICAgICAgICBpZiAobG9nZ2VyLnBhY2thZyA9PSBwYWNrYWcpIHsKKyAgICAgICAgICBsb2dnZXIuY2hpbGRyZW4gPSBtYWtlVHJlZShsb2dnZXJzLCBsb2dnZXIubmFtZSk7CisgICAgICAgICAgdHJlZS5wdXNoKGxvZ2dlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0cmVlOworICAgIH07CisKKyAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkgeworICAgICAgTG9nZ2luZy5sZXZlbHMoZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAkc2NvcGUubG9nZ2luZyA9IG1ha2VUcmVlKGRhdGEubG9nZ2VycywgIiIpOworICAgICAgICAkc2NvcGUud2F0Y2hlciA9IGRhdGEud2F0Y2hlcjsKKyAgICAgICAgJHNjb3BlLmxldmVscyA9IFtdOworICAgICAgICBmb3IgKGxldmVsIGluIGRhdGEubGV2ZWxzKSB7CisgICAgICAgICAgJHNjb3BlLmxldmVscy5wdXNoKHtuYW1lOmRhdGEubGV2ZWxzW2xldmVsXSwgcG9zOmxldmVsfSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH07CisKKyAgICAkc2NvcGUudG9nZ2xlT3B0aW9ucyA9IGZ1bmN0aW9uKGxvZ2dlcikgeworICAgICAgaWYgKGxvZ2dlci5zaG93T3B0aW9ucykgeworICAgICAgICBsb2dnZXIuc2hvd09wdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgZGVsZXRlICRzY29wZS5jdXJyZW50TG9nZ2VyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCRzY29wZS5jdXJyZW50TG9nZ2VyKSB7CisgICAgICAgICAgJHNjb3BlLmN1cnJlbnRMb2dnZXIuc2hvd09wdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBsb2dnZXIuc2hvd09wdGlvbnMgPSB0cnVlOworICAgICAgICAkc2NvcGUuY3VycmVudExvZ2dlciA9IGxvZ2dlcjsKKyAgICAgIH0KKyAgICB9OworCisgICAgJHNjb3BlLnNldExldmVsID0gZnVuY3Rpb24obG9nZ2VyLCBuZXdMZXZlbCkgeworICAgICAgdmFyIHNldFN0cmluZyA9IGxvZ2dlci5uYW1lICsgIjoiICsgbmV3TGV2ZWw7CisgICAgICBsb2dnZXIuc2hvd09wdGlvbnMgPSBmYWxzZTsKKyAgICAgIExvZ2dpbmcuc2V0TGV2ZWwoe3NldDogc2V0U3RyaW5nfSwgZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAkc2NvcGUucmVmcmVzaCgpOworICAgICAgfSk7CisgICAgfTsKKworICAgICRzY29wZS5yZWZyZXNoKCk7CisgIH0pOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvcGx1Z2lucy5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL3BsdWdpbnMuanMKaW5kZXggNWFhMTkzOC4uOTA3MGI4NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvcGx1Z2lucy5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9wbHVnaW5zLmpzCkBAIC0xLDE2NiArMSwxNjYgQEAKLS8qDQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi0NCi1zb2xyQWRtaW5BcHAuY29udHJvbGxlcignUGx1Z2luc0NvbnRyb2xsZXInLA0KLSAgICBmdW5jdGlvbigkc2NvcGUsICRyb290U2NvcGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uLCBNYmVhbnMsIENvbnN0YW50cykgew0KLSAgICAgICAgJHNjb3BlLnJlc2V0TWVudSgicGx1Z2lucyIsIENvbnN0YW50cy5JU19DT1JFX1BBR0UpOw0KLQ0KLSAgICAgICAgaWYgKCRyb3V0ZVBhcmFtcy5sZWdhY3l0eXBlKSB7DQotICAgICAgICAgICAgLy8gc3VwcG9ydCBsZWdhY3kgVVJMcy4gQW5ndWxhciBjYW5ub3QgY2hhbmdlICNwYXRoIHdpdGhvdXQgcmVsb2FkaW5nIGNvbnRyb2xsZXINCi0gICAgICAgICAgICAkbG9jYXRpb24ucGF0aCgiLyIrJHJvdXRlUGFyYW1zLmNvcmUrIi9wbHVnaW5zIik7DQotICAgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgidHlwZSIsICRyb3V0ZVBhcmFtcy5sZWdhY3l0eXBlKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIE1iZWFucy5zdGF0cyh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCBmdW5jdGlvbiAoZGF0YSkgew0KLSAgICAgICAgICAgICAgICB2YXIgdHlwZSA9ICRsb2NhdGlvbi5zZWFyY2goKS50eXBlOw0KLSAgICAgICAgICAgICAgICAkc2NvcGUudHlwZXMgPSBnZXRQbHVnaW5UeXBlcyhkYXRhLCB0eXBlKTsNCi0gICAgICAgICAgICAgICAgJHNjb3BlLnR5cGUgPSBnZXRTZWxlY3RlZFR5cGUoJHNjb3BlLnR5cGVzLCB0eXBlKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKCRzY29wZS50eXBlICYmICRyb3V0ZVBhcmFtcy5lbnRyeSkgew0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnBsdWdpbnMgPSAkcm91dGVQYXJhbXMuZW50cnkuc3BsaXQoIiwiKTsNCi0gICAgICAgICAgICAgICAgICAgIG9wZW5QbHVnaW5zKCRzY29wZS50eXBlLCAkc2NvcGUucGx1Z2lucyk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUucGx1Z2lucyA9IFtdOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICB9Ow0KLQ0KLSAgICAgICAgJHNjb3BlLnNlbGVjdFBsdWdpblR5cGUgPSBmdW5jdGlvbih0eXBlKSB7DQotICAgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCh7ZW50cnk6bnVsbCwgdHlwZTogdHlwZS5sb3dlcn0pOw0KLSAgICAgICAgICAgICRzY29wZS50eXBlID0gdHlwZTsNCi0gICAgICAgIH07DQotDQotICAgICAgICAkc2NvcGUuc2VsZWN0UGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luKSB7DQotICAgICAgICAgICAgcGx1Z2luLm9wZW4gPSAhcGx1Z2luLm9wZW47DQotDQotICAgICAgICAgICAgaWYgKHBsdWdpbi5vcGVuKSB7DQotICAgICAgICAgICAgICAgICRzY29wZS5wbHVnaW5zLnB1c2gocGx1Z2luLm5hbWUpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICRzY29wZS5wbHVnaW5zLnNwbGljZSgkc2NvcGUucGx1Z2lucy5pbmRleE9mKHBsdWdpbi5uYW1lKSwgMSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmICgkc2NvcGUucGx1Z2lucy5sZW5ndGg9PTApIHsNCi0gICAgICAgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgiZW50cnkiLCBudWxsKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCJlbnRyeSIsICRzY29wZS5wbHVnaW5zLmpvaW4oJywnKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgJHNjb3BlLnN0YXJ0UmVjb3JkaW5nID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgJHNjb3BlLmlzUmVjb3JkaW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICBNYmVhbnMucmVmZXJlbmNlKHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZX0sIGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICAgICAgICAgJHNjb3BlLnJlZmVyZW5jZSA9IGRhdGEucmVmZXJlbmNlOw0KLSAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygkc2NvcGUucmVmZXJlbmNlKTsNCi0gICAgICAgICAgICB9KQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgJHNjb3BlLnN0b3BSZWNvcmRpbmcgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAkc2NvcGUuaXNSZWNvcmRpbmcgPSBmYWxzZTsNCi0gICAgICAgICAgICBjb25zb2xlLmxvZygkc2NvcGUucmVmZXJlbmNlKTsNCi0gICAgICAgICAgICBNYmVhbnMuZGVsdGEoe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlfSwgJHNjb3BlLnJlZmVyZW5jZSwgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgICAgICAgICBwYXJzZURlbHRhKCRzY29wZS50eXBlcywgZGF0YSk7DQotICAgICAgICAgICAgfSk7DQotICAgICAgICB9DQotDQotICAgICAgICAkc2NvcGUucmVmcmVzaCgpOw0KLSAgICB9KTsNCi0NCi12YXIgZ2V0UGx1Z2luVHlwZXMgPSBmdW5jdGlvbihkYXRhLCBzZWxlY3RlZCkgew0KLSAgICB2YXIga2V5cyA9IFtdOw0KLSAgICB2YXIgbWJlYW5zID0gZGF0YVsic29sci1tYmVhbnMiXTsNCi0gICAgZm9yICh2YXIgaT0wOyBpPG1iZWFucy5sZW5ndGg7IGkrPTIpIHsNCi0gICAgICAgIHZhciBrZXkgPSBtYmVhbnNbaV07DQotICAgICAgICB2YXIgbG93ZXIgPSBrZXkudG9Mb3dlckNhc2UoKTsNCi0gICAgICAgIHZhciBwbHVnaW5zID0gZ2V0UGx1Z2lucyhtYmVhbnNbaSsxXSk7DQotICAgICAgICBrZXlzLnB1c2goe25hbWU6IGtleSwNCi0gICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGxvd2VyID09IHNlbGVjdGVkLA0KLSAgICAgICAgICAgICAgICAgICBjaGFuZ2VzOiAwLA0KLSAgICAgICAgICAgICAgICAgICBsb3dlcjogbG93ZXIsDQotICAgICAgICAgICAgICAgICAgIHBsdWdpbnM6IHBsdWdpbnMNCi0gICAgICAgIH0pOw0KLSAgICB9DQotICAgIGtleXMuc29ydChmdW5jdGlvbihhLGIpIHtyZXR1cm4gYS5uYW1lID4gYi5uYW1lfSk7DQotICAgIHJldHVybiBrZXlzOw0KLX07DQotDQotdmFyIGdldFBsdWdpbnMgPSBmdW5jdGlvbihkYXRhKSB7DQotICAgIHZhciBwbHVnaW5zID0gW107DQotICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7DQotICAgICAgICB2YXIgcGx1Z2luUHJvcGVydGllcyA9IGRhdGFba2V5XTsNCi0gICAgICAgIHZhciBzdGF0cyA9IHBsdWdpblByb3BlcnRpZXMuc3RhdHM7DQotICAgICAgICBkZWxldGUgcGx1Z2luUHJvcGVydGllcy5zdGF0czsNCi0gICAgICAgIGZvciAodmFyIHN0YXQgaW4gc3RhdHMpIHsNCi0gICAgICAgICAgICAvLyBhZGQgYnJlYWtpbmcgc3BhY2UgYWZ0ZXIgYSBicmFja2V0IG9yIEAgdG8gaGFuZGxlIHdyYXAgbG9uZyBsaW5lczoNCi0gICAgICAgICAgICBzdGF0c1tzdGF0XSA9IG5ldyBTdHJpbmcoc3RhdHNbc3RhdF0pLnJlcGxhY2UoIC8oW1woQF0pL2csICckMSYjODIwMzsnKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBsdWdpbiA9IHtuYW1lOiBrZXksIGNoYW5nZWQ6IGZhbHNlLCBzdGF0czogc3RhdHMsIG9wZW46ZmFsc2V9Ow0KLSAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMgPSBwbHVnaW5Qcm9wZXJ0aWVzOw0KLSAgICAgICAgcGx1Z2lucy5wdXNoKHBsdWdpbik7DQotICAgIH0NCi0gICAgcGx1Z2lucy5zb3J0KGZ1bmN0aW9uKGEsYikge3JldHVybiBhLm5hbWUgPiBiLm5hbWV9KTsNCi0gICAgcmV0dXJuIHBsdWdpbnM7DQotfTsNCi0NCi12YXIgZ2V0U2VsZWN0ZWRUeXBlID0gZnVuY3Rpb24odHlwZXMsIHNlbGVjdGVkKSB7DQotICAgIGlmIChzZWxlY3RlZCkgew0KLSAgICAgICAgZm9yICh2YXIgaSBpbiB0eXBlcykgew0KLSAgICAgICAgICAgIGlmICh0eXBlc1tpXS5sb3dlciA9PSBzZWxlY3RlZCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZXNbaV07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfTsNCi0NCi12YXIgcGFyc2VEZWx0YSA9IGZ1bmN0aW9uKHR5cGVzLCBkYXRhKSB7DQotDQotICAgIHZhciBnZXRCeU5hbWUgPSBmdW5jdGlvbihsaXN0LCBuYW1lKSB7DQotICAgICAgICBmb3IgKHZhciBpIGluIGxpc3QpIHsNCi0gICAgICAgICAgICBpZiAobGlzdFtpXS5uYW1lID09IG5hbWUpIHJldHVybiBsaXN0W2ldOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHZhciBtYmVhbnMgPSBkYXRhWyJzb2xyLW1iZWFucyJdDQotICAgIGZvciAodmFyIGk9MDsgaTxtYmVhbnMubGVuZ3RoOyBpKz0yKSB7DQotICAgICAgICB2YXIgdHlwZU5hbWUgPSBtYmVhbnNbaV07DQotICAgICAgICB2YXIgdHlwZSA9IGdldEJ5TmFtZSh0eXBlcywgdHlwZU5hbWUpOw0KLSAgICAgICAgdmFyIHBsdWdpbnMgPSBtYmVhbnNbaSsxXTsNCi0gICAgICAgIGZvciAodmFyIGtleSBpbiBwbHVnaW5zKSB7DQotICAgICAgICAgICAgdmFyIGNoYW5nZWRQbHVnaW4gPSBwbHVnaW5zW2tleV07DQotICAgICAgICAgICAgaWYgKGNoYW5nZWRQbHVnaW4uX2NoYW5nZWRfKSB7DQotICAgICAgICAgICAgICAgIHZhciBwbHVnaW4gPSBnZXRCeU5hbWUodHlwZS5wbHVnaW5zLCBrZXkpOw0KLSAgICAgICAgICAgICAgICB2YXIgc3RhdHMgPSBjaGFuZ2VkUGx1Z2luLnN0YXRzOw0KLSAgICAgICAgICAgICAgICBkZWxldGUgY2hhbmdlZFBsdWdpbi5zdGF0czsNCi0gICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMgPSBjaGFuZ2VkUGx1Z2luOw0KLSAgICAgICAgICAgICAgICBmb3IgKHZhciBzdGF0IGluIHN0YXRzKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnJlYWtpbmcgc3BhY2UgYWZ0ZXIgYSBicmFja2V0IG9yIEAgdG8gaGFuZGxlIHdyYXAgbG9uZyBsaW5lczoNCi0gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zdGF0c1tzdGF0XSA9IG5ldyBTdHJpbmcoc3RhdHNbc3RhdF0pLnJlcGxhY2UoIC8oW1woQF0pL2csICckMSYjODIwMzsnKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwbHVnaW4uY2hhbmdlZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIHR5cGUuY2hhbmdlcysrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX07DQotDQotdmFyIG9wZW5QbHVnaW5zID0gZnVuY3Rpb24odHlwZSwgc2VsZWN0ZWQpIHsNCi0gICAgZm9yICh2YXIgaSBpbiB0eXBlLnBsdWdpbnMpIHsNCi0gICAgICAgIHZhciBwbHVnaW4gPSB0eXBlLnBsdWdpbnNbaV07DQotICAgICAgICBwbHVnaW4ub3BlbiA9IHNlbGVjdGVkLmluZGV4T2YocGx1Z2luLm5hbWUpPj0wOw0KLSAgICB9DQotfQ0KKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ1BsdWdpbnNDb250cm9sbGVyJywKKyAgICBmdW5jdGlvbigkc2NvcGUsICRyb290U2NvcGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uLCBNYmVhbnMsIENvbnN0YW50cykgeworICAgICAgICAkc2NvcGUucmVzZXRNZW51KCJwbHVnaW5zIiwgQ29uc3RhbnRzLklTX0NPUkVfUEFHRSk7CisKKyAgICAgICAgaWYgKCRyb3V0ZVBhcmFtcy5sZWdhY3l0eXBlKSB7CisgICAgICAgICAgICAvLyBzdXBwb3J0IGxlZ2FjeSBVUkxzLiBBbmd1bGFyIGNhbm5vdCBjaGFuZ2UgI3BhdGggd2l0aG91dCByZWxvYWRpbmcgY29udHJvbGxlcgorICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoIi8iKyRyb3V0ZVBhcmFtcy5jb3JlKyIvcGx1Z2lucyIpOworICAgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgidHlwZSIsICRyb3V0ZVBhcmFtcy5sZWdhY3l0eXBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgICRzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBNYmVhbnMuc3RhdHMoe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlfSwgZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgICB2YXIgdHlwZSA9ICRsb2NhdGlvbi5zZWFyY2goKS50eXBlOworICAgICAgICAgICAgICAgICRzY29wZS50eXBlcyA9IGdldFBsdWdpblR5cGVzKGRhdGEsIHR5cGUpOworICAgICAgICAgICAgICAgICRzY29wZS50eXBlID0gZ2V0U2VsZWN0ZWRUeXBlKCRzY29wZS50eXBlcywgdHlwZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLnR5cGUgJiYgJHJvdXRlUGFyYW1zLmVudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5wbHVnaW5zID0gJHJvdXRlUGFyYW1zLmVudHJ5LnNwbGl0KCIsIik7CisgICAgICAgICAgICAgICAgICAgIG9wZW5QbHVnaW5zKCRzY29wZS50eXBlLCAkc2NvcGUucGx1Z2lucyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnBsdWdpbnMgPSBbXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICAkc2NvcGUuc2VsZWN0UGx1Z2luVHlwZSA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgICAgICAgICAgICRsb2NhdGlvbi5zZWFyY2goe2VudHJ5Om51bGwsIHR5cGU6IHR5cGUubG93ZXJ9KTsKKyAgICAgICAgICAgICRzY29wZS50eXBlID0gdHlwZTsKKyAgICAgICAgfTsKKworICAgICAgICAkc2NvcGUuc2VsZWN0UGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luKSB7CisgICAgICAgICAgICBwbHVnaW4ub3BlbiA9ICFwbHVnaW4ub3BlbjsKKworICAgICAgICAgICAgaWYgKHBsdWdpbi5vcGVuKSB7CisgICAgICAgICAgICAgICAgJHNjb3BlLnBsdWdpbnMucHVzaChwbHVnaW4ubmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRzY29wZS5wbHVnaW5zLnNwbGljZSgkc2NvcGUucGx1Z2lucy5pbmRleE9mKHBsdWdpbi5uYW1lKSwgMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgkc2NvcGUucGx1Z2lucy5sZW5ndGg9PTApIHsKKyAgICAgICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCJlbnRyeSIsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCJlbnRyeSIsICRzY29wZS5wbHVnaW5zLmpvaW4oJywnKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAkc2NvcGUuc3RhcnRSZWNvcmRpbmcgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICRzY29wZS5pc1JlY29yZGluZyA9IHRydWU7CisgICAgICAgICAgICBNYmVhbnMucmVmZXJlbmNlKHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZX0sIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICAgICAgICAkc2NvcGUucmVmZXJlbmNlID0gZGF0YS5yZWZlcmVuY2U7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJHNjb3BlLnJlZmVyZW5jZSk7CisgICAgICAgICAgICB9KQorICAgICAgICB9CisKKyAgICAgICAgJHNjb3BlLnN0b3BSZWNvcmRpbmcgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICRzY29wZS5pc1JlY29yZGluZyA9IGZhbHNlOworICAgICAgICAgICAgY29uc29sZS5sb2coJHNjb3BlLnJlZmVyZW5jZSk7CisgICAgICAgICAgICBNYmVhbnMuZGVsdGEoe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlfSwgJHNjb3BlLnJlZmVyZW5jZSwgZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgICAgICAgIHBhcnNlRGVsdGEoJHNjb3BlLnR5cGVzLCBkYXRhKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgJHNjb3BlLnJlZnJlc2goKTsKKyAgICB9KTsKKwordmFyIGdldFBsdWdpblR5cGVzID0gZnVuY3Rpb24oZGF0YSwgc2VsZWN0ZWQpIHsKKyAgICB2YXIga2V5cyA9IFtdOworICAgIHZhciBtYmVhbnMgPSBkYXRhWyJzb2xyLW1iZWFucyJdOworICAgIGZvciAodmFyIGk9MDsgaTxtYmVhbnMubGVuZ3RoOyBpKz0yKSB7CisgICAgICAgIHZhciBrZXkgPSBtYmVhbnNbaV07CisgICAgICAgIHZhciBsb3dlciA9IGtleS50b0xvd2VyQ2FzZSgpOworICAgICAgICB2YXIgcGx1Z2lucyA9IGdldFBsdWdpbnMobWJlYW5zW2krMV0pOworICAgICAgICBrZXlzLnB1c2goe25hbWU6IGtleSwKKyAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogbG93ZXIgPT0gc2VsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgY2hhbmdlczogMCwKKyAgICAgICAgICAgICAgICAgICBsb3dlcjogbG93ZXIsCisgICAgICAgICAgICAgICAgICAgcGx1Z2luczogcGx1Z2lucworICAgICAgICB9KTsKKyAgICB9CisgICAga2V5cy5zb3J0KGZ1bmN0aW9uKGEsYikge3JldHVybiBhLm5hbWUgPiBiLm5hbWV9KTsKKyAgICByZXR1cm4ga2V5czsKK307CisKK3ZhciBnZXRQbHVnaW5zID0gZnVuY3Rpb24oZGF0YSkgeworICAgIHZhciBwbHVnaW5zID0gW107CisgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKKyAgICAgICAgdmFyIHBsdWdpblByb3BlcnRpZXMgPSBkYXRhW2tleV07CisgICAgICAgIHZhciBzdGF0cyA9IHBsdWdpblByb3BlcnRpZXMuc3RhdHM7CisgICAgICAgIGRlbGV0ZSBwbHVnaW5Qcm9wZXJ0aWVzLnN0YXRzOworICAgICAgICBmb3IgKHZhciBzdGF0IGluIHN0YXRzKSB7CisgICAgICAgICAgICAvLyBhZGQgYnJlYWtpbmcgc3BhY2UgYWZ0ZXIgYSBicmFja2V0IG9yIEAgdG8gaGFuZGxlIHdyYXAgbG9uZyBsaW5lczoKKyAgICAgICAgICAgIHN0YXRzW3N0YXRdID0gbmV3IFN0cmluZyhzdGF0c1tzdGF0XSkucmVwbGFjZSggLyhbXChAXSkvZywgJyQxJiM4MjAzOycpOworICAgICAgICB9CisgICAgICAgIHBsdWdpbiA9IHtuYW1lOiBrZXksIGNoYW5nZWQ6IGZhbHNlLCBzdGF0czogc3RhdHMsIG9wZW46ZmFsc2V9OworICAgICAgICBwbHVnaW4ucHJvcGVydGllcyA9IHBsdWdpblByb3BlcnRpZXM7CisgICAgICAgIHBsdWdpbnMucHVzaChwbHVnaW4pOworICAgIH0KKyAgICBwbHVnaW5zLnNvcnQoZnVuY3Rpb24oYSxiKSB7cmV0dXJuIGEubmFtZSA+IGIubmFtZX0pOworICAgIHJldHVybiBwbHVnaW5zOworfTsKKwordmFyIGdldFNlbGVjdGVkVHlwZSA9IGZ1bmN0aW9uKHR5cGVzLCBzZWxlY3RlZCkgeworICAgIGlmIChzZWxlY3RlZCkgeworICAgICAgICBmb3IgKHZhciBpIGluIHR5cGVzKSB7CisgICAgICAgICAgICBpZiAodHlwZXNbaV0ubG93ZXIgPT0gc2VsZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9OworCit2YXIgcGFyc2VEZWx0YSA9IGZ1bmN0aW9uKHR5cGVzLCBkYXRhKSB7CisKKyAgICB2YXIgZ2V0QnlOYW1lID0gZnVuY3Rpb24obGlzdCwgbmFtZSkgeworICAgICAgICBmb3IgKHZhciBpIGluIGxpc3QpIHsKKyAgICAgICAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT0gbmFtZSkgcmV0dXJuIGxpc3RbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgbWJlYW5zID0gZGF0YVsic29sci1tYmVhbnMiXQorICAgIGZvciAodmFyIGk9MDsgaTxtYmVhbnMubGVuZ3RoOyBpKz0yKSB7CisgICAgICAgIHZhciB0eXBlTmFtZSA9IG1iZWFuc1tpXTsKKyAgICAgICAgdmFyIHR5cGUgPSBnZXRCeU5hbWUodHlwZXMsIHR5cGVOYW1lKTsKKyAgICAgICAgdmFyIHBsdWdpbnMgPSBtYmVhbnNbaSsxXTsKKyAgICAgICAgZm9yICh2YXIga2V5IGluIHBsdWdpbnMpIHsKKyAgICAgICAgICAgIHZhciBjaGFuZ2VkUGx1Z2luID0gcGx1Z2luc1trZXldOworICAgICAgICAgICAgaWYgKGNoYW5nZWRQbHVnaW4uX2NoYW5nZWRfKSB7CisgICAgICAgICAgICAgICAgdmFyIHBsdWdpbiA9IGdldEJ5TmFtZSh0eXBlLnBsdWdpbnMsIGtleSk7CisgICAgICAgICAgICAgICAgdmFyIHN0YXRzID0gY2hhbmdlZFBsdWdpbi5zdGF0czsKKyAgICAgICAgICAgICAgICBkZWxldGUgY2hhbmdlZFBsdWdpbi5zdGF0czsKKyAgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyA9IGNoYW5nZWRQbHVnaW47CisgICAgICAgICAgICAgICAgZm9yICh2YXIgc3RhdCBpbiBzdGF0cykgeworICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnJlYWtpbmcgc3BhY2UgYWZ0ZXIgYSBicmFja2V0IG9yIEAgdG8gaGFuZGxlIHdyYXAgbG9uZyBsaW5lczoKKyAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnN0YXRzW3N0YXRdID0gbmV3IFN0cmluZyhzdGF0c1tzdGF0XSkucmVwbGFjZSggLyhbXChAXSkvZywgJyQxJiM4MjAzOycpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbHVnaW4uY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgdHlwZS5jaGFuZ2VzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9OworCit2YXIgb3BlblBsdWdpbnMgPSBmdW5jdGlvbih0eXBlLCBzZWxlY3RlZCkgeworICAgIGZvciAodmFyIGkgaW4gdHlwZS5wbHVnaW5zKSB7CisgICAgICAgIHZhciBwbHVnaW4gPSB0eXBlLnBsdWdpbnNbaV07CisgICAgICAgIHBsdWdpbi5vcGVuID0gc2VsZWN0ZWQuaW5kZXhPZihwbHVnaW4ubmFtZSk+PTA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvcXVlcnkuanMgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9xdWVyeS5qcwppbmRleCA2MDQ2NGUxLi4xNjk1NjQ3IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9xdWVyeS5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9xdWVyeS5qcwpAQCAtMSwxMTQgKzEsMTE0IEBACi0vKg0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotDQotc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ1F1ZXJ5Q29udHJvbGxlcicsDQotICBmdW5jdGlvbigkc2NvcGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uLCBRdWVyeSwgQ29uc3RhbnRzKXsNCi0gICAgJHNjb3BlLnJlc2V0TWVudSgicXVlcnkiLCBDb25zdGFudHMuSVNfQ09MTEVDVElPTl9QQUdFKTsNCi0NCi0gICAgLy8gQHRvZG8gcmVhZCBVUkwgcGFyYW1ldGVycyBpbnRvIHNjb3BlDQotICAgICRzY29wZS5xdWVyeSA9IHt3dDogJ2pzb24nLCBxOicqOionLCBpbmRlbnQ6J29uJ307DQotICAgICRzY29wZS5maWx0ZXJzID0gW3tmcToiIn1dOw0KLSAgICAkc2NvcGUuZGlzbWF4ID0ge2RlZlR5cGU6ICJkaXNtYXgifTsNCi0gICAgJHNjb3BlLmVkaXNtYXggPSB7ZGVmVHlwZTogImVkaXNtYXgiLCBzdG9wd29yZHM6IHRydWUsIGxvd2VyY2FzZU9wZXJhdG9yczogdHJ1ZX07DQotICAgICRzY29wZS5obCA9IHtobDoib24ifTsNCi0gICAgJHNjb3BlLmZhY2V0ID0ge2ZhY2V0OiAib24ifTsNCi0gICAgJHNjb3BlLnNwYXRpYWwgPSB7fTsNCi0gICAgJHNjb3BlLnNwZWxsY2hlY2sgPSB7c3BlbGxjaGVjazoib24ifTsNCi0gICAgJHNjb3BlLnF0ID0gIi9zZWxlY3QiOw0KLQ0KLSAgICAkc2NvcGUuZG9RdWVyeSA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHZhciBwYXJhbXMgPSB7fTsNCi0NCi0gICAgICB2YXIgc2V0ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkgew0KLSAgICAgICAgaWYgKHBhcmFtc1trZXldKSB7DQotICAgICAgICAgIHBhcmFtc1trZXldLnB1c2godmFsdWUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgcGFyYW1zW2tleV0gPSBbdmFsdWVdOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICB2YXIgY29weSA9IGZ1bmN0aW9uKHBhcmFtcywgcXVlcnkpIHsNCi0gICAgICAgIGZvciAodmFyIGtleSBpbiBxdWVyeSkgew0KLSAgICAgICAgICB0ZXJtcyA9IHF1ZXJ5W2tleV07DQotICAgICAgICAgIGlmICh0ZXJtcy5sZW5ndGggPiAwICYmIGtleVswXSE9IiQiKSB7DQotICAgICAgICAgICAgc2V0KGtleSwgdGVybXMpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfTsNCi0NCi0gICAgICBjb3B5KHBhcmFtcywgJHNjb3BlLnF1ZXJ5KTsNCi0NCi0gICAgICBpZiAoJHNjb3BlLmlzRGlzbWF4KSAgICAgY29weShwYXJhbXMsICRzY29wZS5kaXNtYXgpOw0KLSAgICAgIGlmICgkc2NvcGUuaXNFZGlzbWF4KSAgICBjb3B5KHBhcmFtcywgJHNjb3BlLmVkaXNtYXgpOw0KLSAgICAgIGlmICgkc2NvcGUuaXNIaWdobGlnaHQpICBjb3B5KHBhcmFtcywgJHNjb3BlLmhsKTsNCi0gICAgICBpZiAoJHNjb3BlLmlzRmFjZXQpICAgICAgY29weShwYXJhbXMsICRzY29wZS5mYWNldCk7DQotICAgICAgaWYgKCRzY29wZS5pc1NwYXRpYWwpICAgIGNvcHkocGFyYW1zLCAkc2NvcGUuc3BhdGlhbCk7DQotICAgICAgaWYgKCRzY29wZS5pc1NwZWxsY2hlY2spIGNvcHkocGFyYW1zLCAkc2NvcGUuc3BlbGxjaGVjayk7DQotDQotICAgICAgaWYgKCRzY29wZS5yYXdQYXJhbXMpIHsNCi0gICAgICAgIHZhciByYXdQYXJhbXMgPSAkc2NvcGUucmF3UGFyYW1zLnNwbGl0KC9bJlxuXS8pOw0KLSAgICAgICAgZm9yICh2YXIgaSBpbiByYXdQYXJhbXMpIHsNCi0gICAgICAgICAgdmFyIHBhcmFtID0gcmF3UGFyYW1zW2ldOw0KLSAgICAgICAgICB2YXIgZXF1YWxQb3MgPSBwYXJhbS5pbmRleE9mKCI9Iik7DQotICAgICAgICAgIGlmIChlcXVhbFBvcyA+IC0xKSB7DQotICAgICAgICAgICAgc2V0KHBhcmFtLnN1YnN0cmluZygwLCBlcXVhbFBvcyksIHBhcmFtLnN1YnN0cmluZyhlcXVhbFBvcysxKSk7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgc2V0KHBhcmFtLCAiIik7IC8vIFVzZSBlbXB0eSB2YWx1ZSBmb3IgcGFyYW1zIHdpdGhvdXQgIj0iDQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotICAgICAgdmFyIHF0ID0gJHNjb3BlLnF0ID8gJHNjb3BlLnF0IDogIi9zZWxlY3QiOw0KLQ0KLSAgICAgIGZvciAodmFyIGZpbHRlciBpbiAkc2NvcGUuZmlsdGVycykgew0KLSAgICAgICAgY29weShwYXJhbXMsICRzY29wZS5maWx0ZXJzW2ZpbHRlcl0pOw0KLSAgICAgIH0NCi0NCi0gICAgICBwYXJhbXMuY29yZSA9ICRyb3V0ZVBhcmFtcy5jb3JlOw0KLSAgICAgIGlmIChxdFswXSA9PSAnLycpIHsNCi0gICAgICAgIHBhcmFtcy5oYW5kbGVyID0gcXQuc3Vic3RyaW5nKDEpOw0KLSAgICAgIH0gZWxzZSB7IC8vIFN1cHBvcnQgbGVnYWN5IHN0eWxlIGhhbmRsZVNlbGVjdD10cnVlIGNvbmZpZ3MNCi0gICAgICAgIHBhcmFtcy5oYW5kbGVyID0gInNlbGVjdCI7DQotICAgICAgICBzZXQoInF0IiwgcXQpOw0KLSAgICAgIH0NCi0gICAgICB2YXIgdXJsID0gUXVlcnkudXJsKHBhcmFtcyk7DQotICAgICAgUXVlcnkucXVlcnkocGFyYW1zLCBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAkc2NvcGUubGFuZyA9ICRzY29wZS5xdWVyeS53dDsNCi0gICAgICAgICRzY29wZS5yZXNwb25zZSA9IGRhdGE7DQotICAgICAgICAkc2NvcGUudXJsID0gJGxvY2F0aW9uLnByb3RvY29sKCkgKyAiOi8vIiArDQotICAgICAgICAgICAgICAgICAgICAgJGxvY2F0aW9uLmhvc3QoKSArICI6IiArDQotICAgICAgICAgICAgICAgICAgICAgJGxvY2F0aW9uLnBvcnQoKSArIHVybDsNCi0gICAgICB9KTsNCi0gICAgfTsNCi0NCi0gICAgaWYgKCRsb2NhdGlvbi5zZWFyY2goKS5xKSB7DQotICAgICAgJHNjb3BlLnF1ZXJ5LnEgPSAkbG9jYXRpb24uc2VhcmNoKClbInEiXTsNCi0gICAgICAkc2NvcGUuZG9RdWVyeSgpOw0KLSAgICB9DQotDQotICAgICRzY29wZS5yZW1vdmVGaWx0ZXIgPSBmdW5jdGlvbihpbmRleCkgew0KLSAgICAgIGlmICgkc2NvcGUuZmlsdGVycy5sZW5ndGggPT09IDEpIHsNCi0gICAgICAgICRzY29wZS5maWx0ZXJzID0gW3tmcTogIiJ9XTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgJHNjb3BlLmZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKTsNCi0gICAgICB9DQotICAgIH07DQotDQotICAgICRzY29wZS5hZGRGaWx0ZXIgPSBmdW5jdGlvbihpbmRleCkgew0KLSAgICAgICRzY29wZS5maWx0ZXJzLnNwbGljZShpbmRleCsxLCAwLCB7ZnE6IiJ9KTsNCi0gICAgfTsNCi0gIH0NCi0pOw0KKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ1F1ZXJ5Q29udHJvbGxlcicsCisgIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24sIFF1ZXJ5LCBDb25zdGFudHMpeworICAgICRzY29wZS5yZXNldE1lbnUoInF1ZXJ5IiwgQ29uc3RhbnRzLklTX0NPTExFQ1RJT05fUEFHRSk7CisKKyAgICAvLyBAdG9kbyByZWFkIFVSTCBwYXJhbWV0ZXJzIGludG8gc2NvcGUKKyAgICAkc2NvcGUucXVlcnkgPSB7d3Q6ICdqc29uJywgcTonKjoqJywgaW5kZW50Oidvbid9OworICAgICRzY29wZS5maWx0ZXJzID0gW3tmcToiIn1dOworICAgICRzY29wZS5kaXNtYXggPSB7ZGVmVHlwZTogImRpc21heCJ9OworICAgICRzY29wZS5lZGlzbWF4ID0ge2RlZlR5cGU6ICJlZGlzbWF4Iiwgc3RvcHdvcmRzOiB0cnVlLCBsb3dlcmNhc2VPcGVyYXRvcnM6IHRydWV9OworICAgICRzY29wZS5obCA9IHtobDoib24ifTsKKyAgICAkc2NvcGUuZmFjZXQgPSB7ZmFjZXQ6ICJvbiJ9OworICAgICRzY29wZS5zcGF0aWFsID0ge307CisgICAgJHNjb3BlLnNwZWxsY2hlY2sgPSB7c3BlbGxjaGVjazoib24ifTsKKyAgICAkc2NvcGUucXQgPSAiL3NlbGVjdCI7CisKKyAgICAkc2NvcGUuZG9RdWVyeSA9IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHBhcmFtcyA9IHt9OworCisgICAgICB2YXIgc2V0ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAgICAgICBpZiAocGFyYW1zW2tleV0pIHsKKyAgICAgICAgICBwYXJhbXNba2V5XS5wdXNoKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwYXJhbXNba2V5XSA9IFt2YWx1ZV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHZhciBjb3B5ID0gZnVuY3Rpb24ocGFyYW1zLCBxdWVyeSkgeworICAgICAgICBmb3IgKHZhciBrZXkgaW4gcXVlcnkpIHsKKyAgICAgICAgICB0ZXJtcyA9IHF1ZXJ5W2tleV07CisgICAgICAgICAgaWYgKHRlcm1zLmxlbmd0aCA+IDAgJiYga2V5WzBdIT0iJCIpIHsKKyAgICAgICAgICAgIHNldChrZXksIHRlcm1zKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGNvcHkocGFyYW1zLCAkc2NvcGUucXVlcnkpOworCisgICAgICBpZiAoJHNjb3BlLmlzRGlzbWF4KSAgICAgY29weShwYXJhbXMsICRzY29wZS5kaXNtYXgpOworICAgICAgaWYgKCRzY29wZS5pc0VkaXNtYXgpICAgIGNvcHkocGFyYW1zLCAkc2NvcGUuZWRpc21heCk7CisgICAgICBpZiAoJHNjb3BlLmlzSGlnaGxpZ2h0KSAgY29weShwYXJhbXMsICRzY29wZS5obCk7CisgICAgICBpZiAoJHNjb3BlLmlzRmFjZXQpICAgICAgY29weShwYXJhbXMsICRzY29wZS5mYWNldCk7CisgICAgICBpZiAoJHNjb3BlLmlzU3BhdGlhbCkgICAgY29weShwYXJhbXMsICRzY29wZS5zcGF0aWFsKTsKKyAgICAgIGlmICgkc2NvcGUuaXNTcGVsbGNoZWNrKSBjb3B5KHBhcmFtcywgJHNjb3BlLnNwZWxsY2hlY2spOworCisgICAgICBpZiAoJHNjb3BlLnJhd1BhcmFtcykgeworICAgICAgICB2YXIgcmF3UGFyYW1zID0gJHNjb3BlLnJhd1BhcmFtcy5zcGxpdCgvWyZcbl0vKTsKKyAgICAgICAgZm9yICh2YXIgaSBpbiByYXdQYXJhbXMpIHsKKyAgICAgICAgICB2YXIgcGFyYW0gPSByYXdQYXJhbXNbaV07CisgICAgICAgICAgdmFyIGVxdWFsUG9zID0gcGFyYW0uaW5kZXhPZigiPSIpOworICAgICAgICAgIGlmIChlcXVhbFBvcyA+IC0xKSB7CisgICAgICAgICAgICBzZXQocGFyYW0uc3Vic3RyaW5nKDAsIGVxdWFsUG9zKSwgcGFyYW0uc3Vic3RyaW5nKGVxdWFsUG9zKzEpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0KHBhcmFtLCAiIik7IC8vIFVzZSBlbXB0eSB2YWx1ZSBmb3IgcGFyYW1zIHdpdGhvdXQgIj0iCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZhciBxdCA9ICRzY29wZS5xdCA/ICRzY29wZS5xdCA6ICIvc2VsZWN0IjsKKworICAgICAgZm9yICh2YXIgZmlsdGVyIGluICRzY29wZS5maWx0ZXJzKSB7CisgICAgICAgIGNvcHkocGFyYW1zLCAkc2NvcGUuZmlsdGVyc1tmaWx0ZXJdKTsKKyAgICAgIH0KKworICAgICAgcGFyYW1zLmNvcmUgPSAkcm91dGVQYXJhbXMuY29yZTsKKyAgICAgIGlmIChxdFswXSA9PSAnLycpIHsKKyAgICAgICAgcGFyYW1zLmhhbmRsZXIgPSBxdC5zdWJzdHJpbmcoMSk7CisgICAgICB9IGVsc2UgeyAvLyBTdXBwb3J0IGxlZ2FjeSBzdHlsZSBoYW5kbGVTZWxlY3Q9dHJ1ZSBjb25maWdzCisgICAgICAgIHBhcmFtcy5oYW5kbGVyID0gInNlbGVjdCI7CisgICAgICAgIHNldCgicXQiLCBxdCk7CisgICAgICB9CisgICAgICB2YXIgdXJsID0gUXVlcnkudXJsKHBhcmFtcyk7CisgICAgICBRdWVyeS5xdWVyeShwYXJhbXMsIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgJHNjb3BlLmxhbmcgPSAkc2NvcGUucXVlcnkud3Q7CisgICAgICAgICRzY29wZS5yZXNwb25zZSA9IGRhdGE7CisgICAgICAgICRzY29wZS51cmwgPSAkbG9jYXRpb24ucHJvdG9jb2woKSArICI6Ly8iICsKKyAgICAgICAgICAgICAgICAgICAgICRsb2NhdGlvbi5ob3N0KCkgKyAiOiIgKworICAgICAgICAgICAgICAgICAgICAgJGxvY2F0aW9uLnBvcnQoKSArIHVybDsKKyAgICAgIH0pOworICAgIH07CisKKyAgICBpZiAoJGxvY2F0aW9uLnNlYXJjaCgpLnEpIHsKKyAgICAgICRzY29wZS5xdWVyeS5xID0gJGxvY2F0aW9uLnNlYXJjaCgpWyJxIl07CisgICAgICAkc2NvcGUuZG9RdWVyeSgpOworICAgIH0KKworICAgICRzY29wZS5yZW1vdmVGaWx0ZXIgPSBmdW5jdGlvbihpbmRleCkgeworICAgICAgaWYgKCRzY29wZS5maWx0ZXJzLmxlbmd0aCA9PT0gMSkgeworICAgICAgICAkc2NvcGUuZmlsdGVycyA9IFt7ZnE6ICIifV07CisgICAgICB9IGVsc2UgeworICAgICAgICAkc2NvcGUuZmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpOworICAgICAgfQorICAgIH07CisKKyAgICAkc2NvcGUuYWRkRmlsdGVyID0gZnVuY3Rpb24oaW5kZXgpIHsKKyAgICAgICRzY29wZS5maWx0ZXJzLnNwbGljZShpbmRleCsxLCAwLCB7ZnE6IiJ9KTsKKyAgICB9OworICB9CispOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvcmVwbGljYXRpb24uanMgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9yZXBsaWNhdGlvbi5qcwppbmRleCA4YmMwYTI4Li44MzA4MjVkIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9yZXBsaWNhdGlvbi5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9yZXBsaWNhdGlvbi5qcwpAQCAtMSwyMzUgKzEsMjM1IEBACi0vKg0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotDQotc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ1JlcGxpY2F0aW9uQ29udHJvbGxlcicsDQotICAgIGZ1bmN0aW9uKCRzY29wZSwgJHJvb3RTY29wZSwgJHJvdXRlUGFyYW1zLCAkaW50ZXJ2YWwsICR0aW1lb3V0LCBSZXBsaWNhdGlvbiwgQ29uc3RhbnRzKSB7DQotICAgICAgICAkc2NvcGUucmVzZXRNZW51KCJyZXBsaWNhdGlvbiIsIENvbnN0YW50cy5JU19DT1JFX1BBR0UpOw0KLQ0KLSAgICAgICAgJHNjb3BlLml0ZXJhdGlvbkNvdW50ID0gMTsNCi0NCi0gICAgICAgICRzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgUmVwbGljYXRpb24uZGV0YWlscyh7Y29yZTokcm91dGVQYXJhbXMuY29yZX0sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQotICAgICAgICAgICAgICAgIHZhciB0aW1lb3V0Ow0KLSAgICAgICAgICAgICAgICB2YXIgaW50ZXJ2YWw7DQotICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuaW50ZXJ2YWwpICRpbnRlcnZhbC5jYW5jZWwoJHNjb3BlLmludGVydmFsKTsNCi0gICAgICAgICAgICAgICAgJHNjb3BlLmlzU2xhdmUgPSAocmVzcG9uc2UuZGV0YWlscy5pc1NsYXZlID09PSAndHJ1ZScpOw0KLSAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmlzU2xhdmUpIHsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9ncmVzcyA9IGdldFByb2dyZXNzRGV0YWlscyhyZXNwb25zZS5kZXRhaWxzLnNsYXZlKTsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5pdGVyYXRpb25zID0gZ2V0SXRlcmF0aW9ucyhyZXNwb25zZS5kZXRhaWxzLnNsYXZlKTsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS52ZXJzaW9ucyA9IGdldFNsYXZlVmVyc2lvbnMocmVzcG9uc2UuZGV0YWlscyk7DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc2V0dGluZ3MgPSBnZXRTbGF2ZVNldHRpbmdzKHJlc3BvbnNlLmRldGFpbHMpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5zZXR0aW5ncy5pc1JlcGxpY2F0aW5nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9ICR0aW1lb3V0KCRzY29wZS5yZWZyZXNoLCAxMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZighJHNjb3BlLnNldHRpbmdzLmlzUG9sbGluZ0Rpc2FibGVkICYmICRzY29wZS5zZXR0aW5ncy5wb2xsSW50ZXJ2YWwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCA9ICRzY29wZS5pbnRlcnZhbCA9ICRpbnRlcnZhbChmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNldHRpbmdzLnRpY2stLTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDAwLCAkc2NvcGUuc2V0dGluZ3MudGljayk7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9ICR0aW1lb3V0KCRzY29wZS5yZWZyZXNoLCAxMDAwKigxKyRzY29wZS5zZXR0aW5ncy50aWNrKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUudmVyc2lvbnMgPSBnZXRNYXN0ZXJWZXJzaW9ucyhyZXNwb25zZS5kZXRhaWxzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAkc2NvcGUubWFzdGVyID0gZ2V0TWFzdGVyU2V0dGluZ3MocmVzcG9uc2UuZGV0YWlscywgJHNjb3BlLmlzU2xhdmUpOw0KLQ0KLSAgICAgICAgICAgICAgICB2YXIgb25Sb3V0ZUNoYW5nZU9mZiA9ICRzY29wZS4kb24oJyRyb3V0ZUNoYW5nZVN0YXJ0JywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJ2YWwpICRpbnRlcnZhbC5jYW5jZWwoaW50ZXJ2YWwpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQpICR0aW1lb3V0LmNhbmNlbCh0aW1lb3V0KTsNCi0gICAgICAgICAgICAgICAgICAgIG9uUm91dGVDaGFuZ2VPZmYoKTsNCi0gICAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgfSk7DQotDQotICAgICAgICB9Ow0KLQ0KLSAgICAgICAgJHNjb3BlLmV4ZWN1dGUgPSBmdW5jdGlvbihjb21tYW5kKSB7DQotICAgICAgICAgICAgUmVwbGljYXRpb24uY29tbWFuZCh7Y29yZTokcm91dGVQYXJhbXMuY29yZSwgY29tbWFuZDpjb21tYW5kfSwgZnVuY3Rpb24oZGF0YSl7JHNjb3BlLnJlZnJlc2goKX0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgJHNjb3BlLnNob3dJdGVyYXRpb25zID0gZnVuY3Rpb24oKSB7ICRzY29wZS5pdGVyYXRpb25Db3VudCA9IDEwMDAwMH07IC8vIGxpbWl0VG8gc2hvdWxkIGFjY2VwdCB1bmRlZmluZWQsIGJ1dCBkb2Vzbid0IHdvcmsuDQotICAgICAgICAkc2NvcGUuaGlkZUl0ZXJhdGlvbnMgPSBmdW5jdGlvbigpIHsgJHNjb3BlLml0ZXJhdGlvbkNvdW50ID0gMX07DQotDQotICAgICAgICAkc2NvcGUucmVmcmVzaCgpOw0KLSAgICB9KTsNCi0NCi12YXIgZ2V0UHJvZ3Jlc3NEZXRhaWxzID0gZnVuY3Rpb24ocHJvZ3Jlc3MpIHsNCi0NCi0gICAgcHJvZ3Jlc3MudGltZVJlbWFpbmluZyA9IHBhcnNlU2Vjb25kcyhwcm9ncmVzcy50aW1lUmVtYWluaW5nKTsNCi0gICAgcHJvZ3Jlc3MudG90YWxQZXJjZW50ID0gcGFyc2VJbnQocHJvZ3Jlc3MudG90YWxQZXJjZW50KTsNCi0gICAgaWYgKHByb2dyZXNzLnRvdGFsUGVyY2VudCA9PT0gMCkgew0KLSAgICAgICAgcHJvZ3Jlc3MudG90YWxQZXJjZW50V2lkdGggPSAiMXB4IjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHByb2dyZXNzLnRvdGFsUGVyY2VudFdpZHRoID0gcHJvZ3Jlc3MudG90YWxQZXJjZW50ICsgIiUiOw0KLSAgICB9DQotICAgIHByb2dyZXNzLmN1cnJlbnRGaWxlU2l6ZVBlcmNlbnQgPSBwYXJzZUludChwcm9ncmVzcy5jdXJyZW50RmlsZVNpemVQZXJjZW50KTsNCi0NCi0gICAgaWYgKCFwcm9ncmVzcy5pbmRleFJlcGxpY2F0ZWRBdExpc3QpIHsNCi0gICAgICAgIHByb2dyZXNzLmluZGV4UmVwbGljYXRlZEF0TGlzdCA9IFtdOw0KLSAgICB9DQotDQotICAgIGlmICghcHJvZ3Jlc3MucmVwbGljYXRpb25GYWlsZWRBdExpc3QpIHsNCi0gICAgICAgIHByb2dyZXNzLnJlcGxpY2F0aW9uRmFpbGVkQXRMaXN0ID0gW107DQotICAgIH0NCi0gICAgcmV0dXJuIHByb2dyZXNzOw0KLX07DQotDQotdmFyIGdldEl0ZXJhdGlvbnMgPSBmdW5jdGlvbihzbGF2ZSkgew0KLQ0KLSAgICB2YXIgaXRlcmF0aW9ucyA9IFtdOw0KLQ0KLSAgICB2YXIgZmluZCA9IGZ1bmN0aW9uKGxpc3QsIGRhdGUpIHsNCi0gICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbihlKSB7cmV0dXJuIGUuZGF0ZSA9PSBkYXRlfSk7DQotICAgIH07DQotDQotICAgIGZvciAodmFyIGkgaW4gc2xhdmUuaW5kZXhSZXBsaWNhdGVkQXRMaXN0KSB7DQotICAgICAgICB2YXIgZGF0ZSA9IHNsYXZlLmluZGV4UmVwbGljYXRlZEF0TGlzdFtpXTsNCi0gICAgICAgIHZhciBpdGVyYXRpb24gPSB7ZGF0ZTpkYXRlLCBzdGF0dXM6InJlcGxpY2F0ZWQiLCBsYXRlc3Q6IGZhbHNlfTsNCi0gICAgICAgIGlmIChkYXRlID09IHNsYXZlLmluZGV4UmVwbGljYXRlZEF0KSB7DQotICAgICAgICAgICAgaXRlcmF0aW9uLmxhdGVzdCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpdGVyYXRpb25zLnB1c2goaXRlcmF0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBmb3IgKHZhciBpIGluIHNsYXZlLnJlcGxpY2F0aW9uRmFpbGVkQXRMaXN0KSB7DQotICAgICAgICB2YXIgZmFpbGVkRGF0ZSA9IHNsYXZlLnJlcGxpY2F0aW9uRmFpbGVkQXRMaXN0W2ldOw0KLSAgICAgICAgdmFyIG1hdGNoaW5nSXRlcmF0aW9ucyA9IGZpbmQoaXRlcmF0aW9ucywgZmFpbGVkRGF0ZSk7DQotICAgICAgICBpZiAobWF0Y2hpbmdJdGVyYXRpb25zKSB7DQotICAgICAgICAgICAgaXRlcmF0aW9uID0gbWF0Y2hpbmdJdGVyYXRpb25zWzBdOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpdGVyYXRpb24gPSB7ZGF0ZTogZmFpbGVkRGF0ZSwgbGF0ZXN0OmZhbHNlfTsNCi0gICAgICAgICAgICBpdGVyYXRpb25zLnB1c2goaXRlcmF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGl0ZXJhdGlvbi5zdGF0dXMgPSAiZmFpbGVkIjsNCi0gICAgICAgIGlmIChmYWlsZWREYXRlID09IHNsYXZlLnJlcGxpY2F0aW9uRmFpbGVkQXQpIHsNCi0gICAgICAgICAgICBpdGVyYXRpb24ubGF0ZXN0ID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpdGVyYXRpb25zLnNvcnQoZnVuY3Rpb24oYSxiKXsgcmV0dXJuIGEuZGF0ZT4gYi5kYXRlO30pLnJldmVyc2UoKTsNCi0gICAgcmV0dXJuIGl0ZXJhdGlvbnM7DQotfTsNCi0NCi12YXIgZ2V0TWFzdGVyVmVyc2lvbnMgPSBmdW5jdGlvbihkYXRhKSB7DQotICAgIHZlcnNpb25zID0ge21hc3RlclNlYXJjaDp7fSwgbWFzdGVyOnt9fTsNCi0NCi0gICAgdmVyc2lvbnMubWFzdGVyU2VhcmNoLnZlcnNpb24gPSBkYXRhLmluZGV4VmVyc2lvbjsNCi0gICAgdmVyc2lvbnMubWFzdGVyU2VhcmNoLmdlbmVyYXRpb24gPSBkYXRhLmdlbmVyYXRpb247DQotICAgIHZlcnNpb25zLm1hc3RlclNlYXJjaC5zaXplID0gZGF0YS5pbmRleFNpemU7DQotDQotICAgIHZlcnNpb25zLm1hc3Rlci52ZXJzaW9uID0gZGF0YS5tYXN0ZXIucmVwbGljYWJsZVZlcnNpb24gfHwgJy0nOw0KLSAgICB2ZXJzaW9ucy5tYXN0ZXIuZ2VuZXJhdGlvbiA9IGRhdGEubWFzdGVyLnJlcGxpY2FibGVHZW5lcmF0aW9uIHx8ICctJzsNCi0gICAgdmVyc2lvbnMubWFzdGVyLnNpemUgPSAnLSc7DQotDQotICAgIHJldHVybiB2ZXJzaW9uczsNCi19Ow0KLQ0KLXZhciBnZXRTbGF2ZVZlcnNpb25zID0gZnVuY3Rpb24oZGF0YSkgew0KLSAgICB2ZXJzaW9ucyA9IHttYXN0ZXJTZWFyY2g6IHt9LCBtYXN0ZXI6IHt9LCBzbGF2ZToge319Ow0KLQ0KLSAgICB2ZXJzaW9ucy5zbGF2ZS52ZXJzaW9uID0gZGF0YS5pbmRleFZlcnNpb247DQotICAgIHZlcnNpb25zLnNsYXZlLmdlbmVyYXRpb24gPSBkYXRhLmdlbmVyYXRpb247DQotICAgIHZlcnNpb25zLnNsYXZlLnNpemUgPSBkYXRhLmluZGV4U2l6ZTsNCi0NCi0gICAgdmVyc2lvbnMubWFzdGVyLnZlcnNpb24gPSBkYXRhLnNsYXZlLm1hc3RlckRldGFpbHMucmVwbGljYWJsZVZlcnNpb24gfHwgJy0nOw0KLSAgICB2ZXJzaW9ucy5tYXN0ZXIuZ2VuZXJhdGlvbiA9IGRhdGEuc2xhdmUubWFzdGVyRGV0YWlscy5yZXBsaWNhYmxlR2VuZXJhdGlvbiB8fCAnLSc7DQotICAgIHZlcnNpb25zLm1hc3Rlci5zaXplID0gJy0nOw0KLQ0KLSAgICB2ZXJzaW9ucy5tYXN0ZXJTZWFyY2gudmVyc2lvbiA9IGRhdGEuc2xhdmUubWFzdGVyRGV0YWlscy5pbmRleFZlcnNpb247DQotICAgIHZlcnNpb25zLm1hc3RlclNlYXJjaC5nZW5lcmF0aW9uID0gZGF0YS5zbGF2ZS5tYXN0ZXJEZXRhaWxzLmdlbmVyYXRpb247DQotICAgIHZlcnNpb25zLm1hc3RlclNlYXJjaC5zaXplID0gZGF0YS5zbGF2ZS5tYXN0ZXJEZXRhaWxzLmluZGV4U2l6ZTsNCi0NCi0gICAgdmVyc2lvbnMuY2hhbmdlZFZlcnNpb24gPSBkYXRhLmluZGV4VmVyc2lvbiAhPT0gZGF0YS5zbGF2ZS5tYXN0ZXJEZXRhaWxzLmluZGV4VmVyc2lvbjsNCi0gICAgdmVyc2lvbnMuY2hhbmdlZEdlbmVyYXRpb24gPSBkYXRhLmdlbmVyYXRpb24gIT09IGRhdGEuc2xhdmUubWFzdGVyRGV0YWlscy5nZW5lcmF0aW9uOw0KLQ0KLSAgICByZXR1cm4gdmVyc2lvbnM7DQotfTsNCi0NCi12YXIgcGFyc2VEYXRlVG9FcG9jaCA9IGZ1bmN0aW9uKGRhdGUpIHsNCi0gICAgLy8gWyJTYXQgTWFyIDAzIDExOjAwOjAwIENFVCAyMDEyIiwgIlNhdCIsICJNYXIiLCAiMDMiLCAiMTE6MDA6MDAiLCAiQ0VUIiwgIjIwMTIiXQ0KLSAgICB2YXIgcGFydHMgPSBkYXRlLm1hdGNoKCAvXihcdyspXHMrKFx3KylccysoXGQrKVxzKyhcZCtcOlxkK1w6XGQrKVxzKyhcdyspXHMrKFxkKykkLyApOw0KLQ0KLSAgICAvLyAiU2F0IE1hciAwMyAyMDEyIDEwOjM3OjMzIg0KLSAgICB2YXIgZCA9IG5ldyBEYXRlKCBwYXJ0c1sxXSArICcgJyArIHBhcnRzWzJdICsgJyAnICsgcGFydHNbM10gKyAnICcgKyBwYXJ0c1s2XSArICcgJyArIHBhcnRzWzRdICk7DQotICAgIHJldHVybiBkLmdldFRpbWUoKTsNCi19DQotDQotdmFyIHBhcnNlU2Vjb25kcyA9IGZ1bmN0aW9uKHRpbWUpIHsNCi0gICAgdmFyIHNlY29uZHMgPSAwOw0KLSAgICB2YXIgYXJyID0gbmV3IFN0cmluZyh0aW1lIHx8ICcnKS5zcGxpdCgnLicpOw0KLSAgICB2YXIgcGFydHMgPSBhcnJbMF0uc3BsaXQoJzonKS5yZXZlcnNlKCk7DQotDQotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgIHNlY29uZHMgKz0gKCBwYXJzZUludChwYXJ0c1tpXSwgMTApIHx8IDAgKSAqIE1hdGgucG93KDYwLCBpKTsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoYXJyWzFdICYmIDUgPD0gcGFyc2VJbnQoYXJyWzFdWzBdLCAxMCkpIHsNCi0gICAgICAgIHNlY29uZHMrKzsgLy8gdHJlYXQgbW9yZSBvciBlcXVhbCB0aGFuIC41IGFzIGFkZGl0aW9uYWwgc2Vjb25kDQotDQotICAgIH0NCi0NCi0gICAgcmV0dXJuIHNlY29uZHM7DQotfQ0KLQ0KLXZhciBnZXRTbGF2ZVNldHRpbmdzID0gZnVuY3Rpb24oZGF0YSkgew0KLSAgICB2YXIgc2V0dGluZ3MgPSB7fTsNCi0gICAgc2V0dGluZ3MubWFzdGVyVXJsID0gZGF0YS5zbGF2ZS5tYXN0ZXJVcmw7DQotICAgIHNldHRpbmdzLmlzUG9sbGluZ0Rpc2FibGVkID0gZGF0YS5zbGF2ZS5pc1BvbGxpbmdEaXNhYmxlZCA9PSAndHJ1ZSc7DQotICAgIHNldHRpbmdzLnBvbGxJbnRlcnZhbCA9IGRhdGEuc2xhdmUucG9sbEludGVydmFsOw0KLSAgICBzZXR0aW5ncy5pc1JlcGxpY2F0aW5nID0gZGF0YS5zbGF2ZS5pc1JlcGxpY2F0aW5nID09ICd0cnVlJzsNCi0gICAgc2V0dGluZ3MubmV4dEV4ZWN1dGlvbkF0ID0gZGF0YS5zbGF2ZS5uZXh0RXhlY3V0aW9uQXQ7DQotDQotICAgIGlmKHNldHRpbmdzLmlzUmVwbGljYXRpbmcpIHsNCi0gICAgICAgIHNldHRpbmdzLmlzQXBwcm94ID0gdHJ1ZTsNCi0gICAgICAgIHNldHRpbmdzLnRpY2sgPSBwYXJzZVNlY29uZHMoc2V0dGluZ3MucG9sbEludGVydmFsKTsNCi0gICAgfSBlbHNlIGlmICghc2V0dGluZ3MuaXNQb2xsaW5nRGlzYWJsZWQgJiYgc2V0dGluZ3MucG9sbEludGVydmFsKSB7DQotICAgICAgICBpZiggc2V0dGluZ3MubmV4dEV4ZWN1dGlvbkF0ICkgew0KLSAgICAgICAgICAgIHNldHRpbmdzLm5leHRFeGVjdXRpb25BdEVwb2NoID0gcGFyc2VEYXRlVG9FcG9jaChzZXR0aW5ncy5uZXh0RXhlY3V0aW9uQXQpOw0KLSAgICAgICAgICAgIHNldHRpbmdzLmN1cnJlbnRUaW1lID0gcGFyc2VEYXRlVG9FcG9jaChkYXRhLnNsYXZlLmN1cnJlbnREYXRlKTsNCi0NCi0gICAgICAgICAgICBpZiggc2V0dGluZ3MubmV4dEV4ZWN1dGlvbkF0RXBvY2ggPiBzZXR0aW5ncy5jdXJyZW50VGltZSkgew0KLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5pc0FwcHJveCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICBzZXR0aW5ncy50aWNrID0gKCBzZXR0aW5ncy5uZXh0RXhlY3V0aW9uQXRFcG9jaCAtIHNldHRpbmdzLmN1cnJlbnRUaW1lKSAvIDEwMDA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBzZXR0aW5nczsNCi19Ow0KLQ0KLXZhciBnZXRNYXN0ZXJTZXR0aW5ncyA9IGZ1bmN0aW9uKGRldGFpbHMsIGlzU2xhdmUpIHsNCi0gICAgdmFyIG1hc3RlciA9IHt9Ow0KLSAgICB2YXIgbWFzdGVyRGF0YSA9IGlzU2xhdmUgPyBkZXRhaWxzLnNsYXZlLm1hc3RlckRldGFpbHMubWFzdGVyIDogZGV0YWlscy5tYXN0ZXI7DQotICAgIG1hc3Rlci5yZXBsaWNhdGlvbkVuYWJsZWQgPSBtYXN0ZXJEYXRhLnJlcGxpY2F0aW9uRW5hYmxlZCA9PSAidHJ1ZSI7DQotICAgIG1hc3Rlci5yZXBsaWNhdGVBZnRlciA9IG1hc3RlckRhdGEucmVwbGljYXRlQWZ0ZXIuam9pbigiLCAiKTsNCi0NCi0gICAgaWYgKG1hc3RlckRhdGEuY29uZkZpbGVzKSB7DQotICAgICAgICBtYXN0ZXIuZmlsZXMgPSBbXTsNCi0gICAgICAgIHZhciBjb25mRmlsZXMgPSBtYXN0ZXJEYXRhLmNvbmZGaWxlcy5zcGxpdCgnLCcpOw0KLSAgICAgICAgZm9yICh2YXIgaT0wOyBpPGNvbmZGaWxlcy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIHZhciBmaWxlID0gY29uZkZpbGVzW2ldOw0KLSAgICAgICAgICAgIHZhciBzaG9ydCA9IGZpbGU7DQotICAgICAgICAgICAgdmFyIHRpdGxlID0gZmlsZTsNCi0gICAgICAgICAgICBpZiAoZmlsZS5pbmRleE9mKCI6Iik+PTApIHsNCi0gICAgICAgICAgICAgICAgdGl0bGUgPSBmaWxlLnJlcGxhY2UoJzonLCAnIMK7ICcpOw0KLSAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBmaWxlLnNwbGl0KCc6Jyk7DQotICAgICAgICAgICAgICAgIGlmIChpc1NsYXZlKSB7DQotICAgICAgICAgICAgICAgICAgICBzaG9ydCA9IHBhcnRzWzFdOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgc2hvcnQgPSBwYXJ0c1swXTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBtYXN0ZXIuZmlsZXMucHVzaCh7dGl0bGU6dGl0bGUsIG5hbWU6c2hvcnR9KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gbWFzdGVyOw0KLX0NCisvKgorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3NvbHJBZG1pbkFwcC5jb250cm9sbGVyKCdSZXBsaWNhdGlvbkNvbnRyb2xsZXInLAorICAgIGZ1bmN0aW9uKCRzY29wZSwgJHJvb3RTY29wZSwgJHJvdXRlUGFyYW1zLCAkaW50ZXJ2YWwsICR0aW1lb3V0LCBSZXBsaWNhdGlvbiwgQ29uc3RhbnRzKSB7CisgICAgICAgICRzY29wZS5yZXNldE1lbnUoInJlcGxpY2F0aW9uIiwgQ29uc3RhbnRzLklTX0NPUkVfUEFHRSk7CisKKyAgICAgICAgJHNjb3BlLml0ZXJhdGlvbkNvdW50ID0gMTsKKworICAgICAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgUmVwbGljYXRpb24uZGV0YWlscyh7Y29yZTokcm91dGVQYXJhbXMuY29yZX0sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgdmFyIHRpbWVvdXQ7CisgICAgICAgICAgICAgICAgdmFyIGludGVydmFsOworICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuaW50ZXJ2YWwpICRpbnRlcnZhbC5jYW5jZWwoJHNjb3BlLmludGVydmFsKTsKKyAgICAgICAgICAgICAgICAkc2NvcGUuaXNTbGF2ZSA9IChyZXNwb25zZS5kZXRhaWxzLmlzU2xhdmUgPT09ICd0cnVlJyk7CisgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5pc1NsYXZlKSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5wcm9ncmVzcyA9IGdldFByb2dyZXNzRGV0YWlscyhyZXNwb25zZS5kZXRhaWxzLnNsYXZlKTsKKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLml0ZXJhdGlvbnMgPSBnZXRJdGVyYXRpb25zKHJlc3BvbnNlLmRldGFpbHMuc2xhdmUpOworICAgICAgICAgICAgICAgICAgICAkc2NvcGUudmVyc2lvbnMgPSBnZXRTbGF2ZVZlcnNpb25zKHJlc3BvbnNlLmRldGFpbHMpOworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc2V0dGluZ3MgPSBnZXRTbGF2ZVNldHRpbmdzKHJlc3BvbnNlLmRldGFpbHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLnNldHRpbmdzLmlzUmVwbGljYXRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAkdGltZW91dCgkc2NvcGUucmVmcmVzaCwgMTAwMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZighJHNjb3BlLnNldHRpbmdzLmlzUG9sbGluZ0Rpc2FibGVkICYmICRzY29wZS5zZXR0aW5ncy5wb2xsSW50ZXJ2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gJHNjb3BlLmludGVydmFsID0gJGludGVydmFsKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zZXR0aW5ncy50aWNrLS07CisgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDAwLCAkc2NvcGUuc2V0dGluZ3MudGljayk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gJHRpbWVvdXQoJHNjb3BlLnJlZnJlc2gsIDEwMDAqKDErJHNjb3BlLnNldHRpbmdzLnRpY2spKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS52ZXJzaW9ucyA9IGdldE1hc3RlclZlcnNpb25zKHJlc3BvbnNlLmRldGFpbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkc2NvcGUubWFzdGVyID0gZ2V0TWFzdGVyU2V0dGluZ3MocmVzcG9uc2UuZGV0YWlscywgJHNjb3BlLmlzU2xhdmUpOworCisgICAgICAgICAgICAgICAgdmFyIG9uUm91dGVDaGFuZ2VPZmYgPSAkc2NvcGUuJG9uKCckcm91dGVDaGFuZ2VTdGFydCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJ2YWwpICRpbnRlcnZhbC5jYW5jZWwoaW50ZXJ2YWwpOworICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dCkgJHRpbWVvdXQuY2FuY2VsKHRpbWVvdXQpOworICAgICAgICAgICAgICAgICAgICBvblJvdXRlQ2hhbmdlT2ZmKCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICB9OworCisgICAgICAgICRzY29wZS5leGVjdXRlID0gZnVuY3Rpb24oY29tbWFuZCkgeworICAgICAgICAgICAgUmVwbGljYXRpb24uY29tbWFuZCh7Y29yZTokcm91dGVQYXJhbXMuY29yZSwgY29tbWFuZDpjb21tYW5kfSwgZnVuY3Rpb24oZGF0YSl7JHNjb3BlLnJlZnJlc2goKX0pOworICAgICAgICB9CisKKyAgICAgICAgJHNjb3BlLnNob3dJdGVyYXRpb25zID0gZnVuY3Rpb24oKSB7ICRzY29wZS5pdGVyYXRpb25Db3VudCA9IDEwMDAwMH07IC8vIGxpbWl0VG8gc2hvdWxkIGFjY2VwdCB1bmRlZmluZWQsIGJ1dCBkb2Vzbid0IHdvcmsuCisgICAgICAgICRzY29wZS5oaWRlSXRlcmF0aW9ucyA9IGZ1bmN0aW9uKCkgeyAkc2NvcGUuaXRlcmF0aW9uQ291bnQgPSAxfTsKKworICAgICAgICAkc2NvcGUucmVmcmVzaCgpOworICAgIH0pOworCit2YXIgZ2V0UHJvZ3Jlc3NEZXRhaWxzID0gZnVuY3Rpb24ocHJvZ3Jlc3MpIHsKKworICAgIHByb2dyZXNzLnRpbWVSZW1haW5pbmcgPSBwYXJzZVNlY29uZHMocHJvZ3Jlc3MudGltZVJlbWFpbmluZyk7CisgICAgcHJvZ3Jlc3MudG90YWxQZXJjZW50ID0gcGFyc2VJbnQocHJvZ3Jlc3MudG90YWxQZXJjZW50KTsKKyAgICBpZiAocHJvZ3Jlc3MudG90YWxQZXJjZW50ID09PSAwKSB7CisgICAgICAgIHByb2dyZXNzLnRvdGFsUGVyY2VudFdpZHRoID0gIjFweCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvZ3Jlc3MudG90YWxQZXJjZW50V2lkdGggPSBwcm9ncmVzcy50b3RhbFBlcmNlbnQgKyAiJSI7CisgICAgfQorICAgIHByb2dyZXNzLmN1cnJlbnRGaWxlU2l6ZVBlcmNlbnQgPSBwYXJzZUludChwcm9ncmVzcy5jdXJyZW50RmlsZVNpemVQZXJjZW50KTsKKworICAgIGlmICghcHJvZ3Jlc3MuaW5kZXhSZXBsaWNhdGVkQXRMaXN0KSB7CisgICAgICAgIHByb2dyZXNzLmluZGV4UmVwbGljYXRlZEF0TGlzdCA9IFtdOworICAgIH0KKworICAgIGlmICghcHJvZ3Jlc3MucmVwbGljYXRpb25GYWlsZWRBdExpc3QpIHsKKyAgICAgICAgcHJvZ3Jlc3MucmVwbGljYXRpb25GYWlsZWRBdExpc3QgPSBbXTsKKyAgICB9CisgICAgcmV0dXJuIHByb2dyZXNzOworfTsKKwordmFyIGdldEl0ZXJhdGlvbnMgPSBmdW5jdGlvbihzbGF2ZSkgeworCisgICAgdmFyIGl0ZXJhdGlvbnMgPSBbXTsKKworICAgIHZhciBmaW5kID0gZnVuY3Rpb24obGlzdCwgZGF0ZSkgeworICAgICAgICByZXR1cm4gbGlzdC5maWx0ZXIoZnVuY3Rpb24oZSkge3JldHVybiBlLmRhdGUgPT0gZGF0ZX0pOworICAgIH07CisKKyAgICBmb3IgKHZhciBpIGluIHNsYXZlLmluZGV4UmVwbGljYXRlZEF0TGlzdCkgeworICAgICAgICB2YXIgZGF0ZSA9IHNsYXZlLmluZGV4UmVwbGljYXRlZEF0TGlzdFtpXTsKKyAgICAgICAgdmFyIGl0ZXJhdGlvbiA9IHtkYXRlOmRhdGUsIHN0YXR1czoicmVwbGljYXRlZCIsIGxhdGVzdDogZmFsc2V9OworICAgICAgICBpZiAoZGF0ZSA9PSBzbGF2ZS5pbmRleFJlcGxpY2F0ZWRBdCkgeworICAgICAgICAgICAgaXRlcmF0aW9uLmxhdGVzdCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaXRlcmF0aW9ucy5wdXNoKGl0ZXJhdGlvbik7CisgICAgfQorCisgICAgZm9yICh2YXIgaSBpbiBzbGF2ZS5yZXBsaWNhdGlvbkZhaWxlZEF0TGlzdCkgeworICAgICAgICB2YXIgZmFpbGVkRGF0ZSA9IHNsYXZlLnJlcGxpY2F0aW9uRmFpbGVkQXRMaXN0W2ldOworICAgICAgICB2YXIgbWF0Y2hpbmdJdGVyYXRpb25zID0gZmluZChpdGVyYXRpb25zLCBmYWlsZWREYXRlKTsKKyAgICAgICAgaWYgKG1hdGNoaW5nSXRlcmF0aW9ucykgeworICAgICAgICAgICAgaXRlcmF0aW9uID0gbWF0Y2hpbmdJdGVyYXRpb25zWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXRlcmF0aW9uID0ge2RhdGU6IGZhaWxlZERhdGUsIGxhdGVzdDpmYWxzZX07CisgICAgICAgICAgICBpdGVyYXRpb25zLnB1c2goaXRlcmF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpdGVyYXRpb24uc3RhdHVzID0gImZhaWxlZCI7CisgICAgICAgIGlmIChmYWlsZWREYXRlID09IHNsYXZlLnJlcGxpY2F0aW9uRmFpbGVkQXQpIHsKKyAgICAgICAgICAgIGl0ZXJhdGlvbi5sYXRlc3QgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGl0ZXJhdGlvbnMuc29ydChmdW5jdGlvbihhLGIpeyByZXR1cm4gYS5kYXRlPiBiLmRhdGU7fSkucmV2ZXJzZSgpOworICAgIHJldHVybiBpdGVyYXRpb25zOworfTsKKwordmFyIGdldE1hc3RlclZlcnNpb25zID0gZnVuY3Rpb24oZGF0YSkgeworICAgIHZlcnNpb25zID0ge21hc3RlclNlYXJjaDp7fSwgbWFzdGVyOnt9fTsKKworICAgIHZlcnNpb25zLm1hc3RlclNlYXJjaC52ZXJzaW9uID0gZGF0YS5pbmRleFZlcnNpb247CisgICAgdmVyc2lvbnMubWFzdGVyU2VhcmNoLmdlbmVyYXRpb24gPSBkYXRhLmdlbmVyYXRpb247CisgICAgdmVyc2lvbnMubWFzdGVyU2VhcmNoLnNpemUgPSBkYXRhLmluZGV4U2l6ZTsKKworICAgIHZlcnNpb25zLm1hc3Rlci52ZXJzaW9uID0gZGF0YS5tYXN0ZXIucmVwbGljYWJsZVZlcnNpb24gfHwgJy0nOworICAgIHZlcnNpb25zLm1hc3Rlci5nZW5lcmF0aW9uID0gZGF0YS5tYXN0ZXIucmVwbGljYWJsZUdlbmVyYXRpb24gfHwgJy0nOworICAgIHZlcnNpb25zLm1hc3Rlci5zaXplID0gJy0nOworCisgICAgcmV0dXJuIHZlcnNpb25zOworfTsKKwordmFyIGdldFNsYXZlVmVyc2lvbnMgPSBmdW5jdGlvbihkYXRhKSB7CisgICAgdmVyc2lvbnMgPSB7bWFzdGVyU2VhcmNoOiB7fSwgbWFzdGVyOiB7fSwgc2xhdmU6IHt9fTsKKworICAgIHZlcnNpb25zLnNsYXZlLnZlcnNpb24gPSBkYXRhLmluZGV4VmVyc2lvbjsKKyAgICB2ZXJzaW9ucy5zbGF2ZS5nZW5lcmF0aW9uID0gZGF0YS5nZW5lcmF0aW9uOworICAgIHZlcnNpb25zLnNsYXZlLnNpemUgPSBkYXRhLmluZGV4U2l6ZTsKKworICAgIHZlcnNpb25zLm1hc3Rlci52ZXJzaW9uID0gZGF0YS5zbGF2ZS5tYXN0ZXJEZXRhaWxzLnJlcGxpY2FibGVWZXJzaW9uIHx8ICctJzsKKyAgICB2ZXJzaW9ucy5tYXN0ZXIuZ2VuZXJhdGlvbiA9IGRhdGEuc2xhdmUubWFzdGVyRGV0YWlscy5yZXBsaWNhYmxlR2VuZXJhdGlvbiB8fCAnLSc7CisgICAgdmVyc2lvbnMubWFzdGVyLnNpemUgPSAnLSc7CisKKyAgICB2ZXJzaW9ucy5tYXN0ZXJTZWFyY2gudmVyc2lvbiA9IGRhdGEuc2xhdmUubWFzdGVyRGV0YWlscy5pbmRleFZlcnNpb247CisgICAgdmVyc2lvbnMubWFzdGVyU2VhcmNoLmdlbmVyYXRpb24gPSBkYXRhLnNsYXZlLm1hc3RlckRldGFpbHMuZ2VuZXJhdGlvbjsKKyAgICB2ZXJzaW9ucy5tYXN0ZXJTZWFyY2guc2l6ZSA9IGRhdGEuc2xhdmUubWFzdGVyRGV0YWlscy5pbmRleFNpemU7CisKKyAgICB2ZXJzaW9ucy5jaGFuZ2VkVmVyc2lvbiA9IGRhdGEuaW5kZXhWZXJzaW9uICE9PSBkYXRhLnNsYXZlLm1hc3RlckRldGFpbHMuaW5kZXhWZXJzaW9uOworICAgIHZlcnNpb25zLmNoYW5nZWRHZW5lcmF0aW9uID0gZGF0YS5nZW5lcmF0aW9uICE9PSBkYXRhLnNsYXZlLm1hc3RlckRldGFpbHMuZ2VuZXJhdGlvbjsKKworICAgIHJldHVybiB2ZXJzaW9uczsKK307CisKK3ZhciBwYXJzZURhdGVUb0Vwb2NoID0gZnVuY3Rpb24oZGF0ZSkgeworICAgIC8vIFsiU2F0IE1hciAwMyAxMTowMDowMCBDRVQgMjAxMiIsICJTYXQiLCAiTWFyIiwgIjAzIiwgIjExOjAwOjAwIiwgIkNFVCIsICIyMDEyIl0KKyAgICB2YXIgcGFydHMgPSBkYXRlLm1hdGNoKCAvXihcdyspXHMrKFx3KylccysoXGQrKVxzKyhcZCtcOlxkK1w6XGQrKVxzKyhcdyspXHMrKFxkKykkLyApOworCisgICAgLy8gIlNhdCBNYXIgMDMgMjAxMiAxMDozNzozMyIKKyAgICB2YXIgZCA9IG5ldyBEYXRlKCBwYXJ0c1sxXSArICcgJyArIHBhcnRzWzJdICsgJyAnICsgcGFydHNbM10gKyAnICcgKyBwYXJ0c1s2XSArICcgJyArIHBhcnRzWzRdICk7CisgICAgcmV0dXJuIGQuZ2V0VGltZSgpOworfQorCit2YXIgcGFyc2VTZWNvbmRzID0gZnVuY3Rpb24odGltZSkgeworICAgIHZhciBzZWNvbmRzID0gMDsKKyAgICB2YXIgYXJyID0gbmV3IFN0cmluZyh0aW1lIHx8ICcnKS5zcGxpdCgnLicpOworICAgIHZhciBwYXJ0cyA9IGFyclswXS5zcGxpdCgnOicpLnJldmVyc2UoKTsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgc2Vjb25kcyArPSAoIHBhcnNlSW50KHBhcnRzW2ldLCAxMCkgfHwgMCApICogTWF0aC5wb3coNjAsIGkpOworICAgIH0KKworICAgIGlmIChhcnJbMV0gJiYgNSA8PSBwYXJzZUludChhcnJbMV1bMF0sIDEwKSkgeworICAgICAgICBzZWNvbmRzKys7IC8vIHRyZWF0IG1vcmUgb3IgZXF1YWwgdGhhbiAuNSBhcyBhZGRpdGlvbmFsIHNlY29uZAorCisgICAgfQorCisgICAgcmV0dXJuIHNlY29uZHM7Cit9CisKK3ZhciBnZXRTbGF2ZVNldHRpbmdzID0gZnVuY3Rpb24oZGF0YSkgeworICAgIHZhciBzZXR0aW5ncyA9IHt9OworICAgIHNldHRpbmdzLm1hc3RlclVybCA9IGRhdGEuc2xhdmUubWFzdGVyVXJsOworICAgIHNldHRpbmdzLmlzUG9sbGluZ0Rpc2FibGVkID0gZGF0YS5zbGF2ZS5pc1BvbGxpbmdEaXNhYmxlZCA9PSAndHJ1ZSc7CisgICAgc2V0dGluZ3MucG9sbEludGVydmFsID0gZGF0YS5zbGF2ZS5wb2xsSW50ZXJ2YWw7CisgICAgc2V0dGluZ3MuaXNSZXBsaWNhdGluZyA9IGRhdGEuc2xhdmUuaXNSZXBsaWNhdGluZyA9PSAndHJ1ZSc7CisgICAgc2V0dGluZ3MubmV4dEV4ZWN1dGlvbkF0ID0gZGF0YS5zbGF2ZS5uZXh0RXhlY3V0aW9uQXQ7CisKKyAgICBpZihzZXR0aW5ncy5pc1JlcGxpY2F0aW5nKSB7CisgICAgICAgIHNldHRpbmdzLmlzQXBwcm94ID0gdHJ1ZTsKKyAgICAgICAgc2V0dGluZ3MudGljayA9IHBhcnNlU2Vjb25kcyhzZXR0aW5ncy5wb2xsSW50ZXJ2YWwpOworICAgIH0gZWxzZSBpZiAoIXNldHRpbmdzLmlzUG9sbGluZ0Rpc2FibGVkICYmIHNldHRpbmdzLnBvbGxJbnRlcnZhbCkgeworICAgICAgICBpZiggc2V0dGluZ3MubmV4dEV4ZWN1dGlvbkF0ICkgeworICAgICAgICAgICAgc2V0dGluZ3MubmV4dEV4ZWN1dGlvbkF0RXBvY2ggPSBwYXJzZURhdGVUb0Vwb2NoKHNldHRpbmdzLm5leHRFeGVjdXRpb25BdCk7CisgICAgICAgICAgICBzZXR0aW5ncy5jdXJyZW50VGltZSA9IHBhcnNlRGF0ZVRvRXBvY2goZGF0YS5zbGF2ZS5jdXJyZW50RGF0ZSk7CisKKyAgICAgICAgICAgIGlmKCBzZXR0aW5ncy5uZXh0RXhlY3V0aW9uQXRFcG9jaCA+IHNldHRpbmdzLmN1cnJlbnRUaW1lKSB7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MuaXNBcHByb3ggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy50aWNrID0gKCBzZXR0aW5ncy5uZXh0RXhlY3V0aW9uQXRFcG9jaCAtIHNldHRpbmdzLmN1cnJlbnRUaW1lKSAvIDEwMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNldHRpbmdzOworfTsKKwordmFyIGdldE1hc3RlclNldHRpbmdzID0gZnVuY3Rpb24oZGV0YWlscywgaXNTbGF2ZSkgeworICAgIHZhciBtYXN0ZXIgPSB7fTsKKyAgICB2YXIgbWFzdGVyRGF0YSA9IGlzU2xhdmUgPyBkZXRhaWxzLnNsYXZlLm1hc3RlckRldGFpbHMubWFzdGVyIDogZGV0YWlscy5tYXN0ZXI7CisgICAgbWFzdGVyLnJlcGxpY2F0aW9uRW5hYmxlZCA9IG1hc3RlckRhdGEucmVwbGljYXRpb25FbmFibGVkID09ICJ0cnVlIjsKKyAgICBtYXN0ZXIucmVwbGljYXRlQWZ0ZXIgPSBtYXN0ZXJEYXRhLnJlcGxpY2F0ZUFmdGVyLmpvaW4oIiwgIik7CisKKyAgICBpZiAobWFzdGVyRGF0YS5jb25mRmlsZXMpIHsKKyAgICAgICAgbWFzdGVyLmZpbGVzID0gW107CisgICAgICAgIHZhciBjb25mRmlsZXMgPSBtYXN0ZXJEYXRhLmNvbmZGaWxlcy5zcGxpdCgnLCcpOworICAgICAgICBmb3IgKHZhciBpPTA7IGk8Y29uZkZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB2YXIgZmlsZSA9IGNvbmZGaWxlc1tpXTsKKyAgICAgICAgICAgIHZhciBzaG9ydCA9IGZpbGU7CisgICAgICAgICAgICB2YXIgdGl0bGUgPSBmaWxlOworICAgICAgICAgICAgaWYgKGZpbGUuaW5kZXhPZigiOiIpPj0wKSB7CisgICAgICAgICAgICAgICAgdGl0bGUgPSBmaWxlLnJlcGxhY2UoJzonLCAnIMK7ICcpOworICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IGZpbGUuc3BsaXQoJzonKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNTbGF2ZSkgeworICAgICAgICAgICAgICAgICAgICBzaG9ydCA9IHBhcnRzWzFdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNob3J0ID0gcGFydHNbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFzdGVyLmZpbGVzLnB1c2goe3RpdGxlOnRpdGxlLCBuYW1lOnNob3J0fSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1hc3RlcjsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL3NjaGVtYS5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL3NjaGVtYS5qcwppbmRleCAyMWIwYzA0Li5lZTIzYmQ3IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9zY2hlbWEuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvc2NoZW1hLmpzCkBAIC0xLDYxMSArMSw2MTEgQEAKLS8qDQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi0NCi12YXIgY29va2llX3NjaGVtYV9icm93c2VyX2F1dG9sb2FkID0gJ3NjaGVtYS1icm93c2VyX2F1dG9sb2FkJzsNCi0NCi1zb2xyQWRtaW5BcHAuY29udHJvbGxlcignU2NoZW1hQ29udHJvbGxlcicsDQotICAgIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24sICRjb29raWVzLCAkdGltZW91dCwgTHVrZSwgQ29uc3RhbnRzLCBTY2hlbWEsIENvbmZpZykgew0KLSAgICAgICAgJHNjb3BlLnJlc2V0TWVudSgic2NoZW1hIiwgQ29uc3RhbnRzLklTX0NPTExFQ1RJT05fUEFHRSk7DQotDQotICAgICAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICBMdWtlLnNjaGVtYSh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCBmdW5jdGlvbiAoc2NoZW1hKSB7DQotICAgICAgICAgICAgICAgIEx1a2UucmF3KHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZX0sIGZ1bmN0aW9uIChpbmRleCkgew0KLSAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBtZXJnZUluZGV4QW5kU2NoZW1hRGF0YShpbmRleCwgc2NoZW1hLnNjaGVtYSk7DQotDQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZmllbGRzQW5kVHlwZXMgPSBnZXRGaWVsZHNBbmRUeXBlcyhkYXRhKTsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5pcyA9IHt9Ow0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdmFyIHNlYXJjaCA9ICRsb2NhdGlvbi5zZWFyY2goKTsNCi0gICAgICAgICAgICAgICAgICAgIGxlZnRiYXIgPSB7fTsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5pc0ZpZWxkID0gJHNjb3BlLmlzRHluYW1pY0ZpZWxkID0gJHNjb3BlLmlzVHlwZSA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaC5maWVsZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zZWxlY3RlZFR5cGUgPSAiRmllbGQiOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5pcy5maWVsZCA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLm5hbWUgPSBzZWFyY2guZmllbGQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdGJhci5maWVsZHMgPSBbJHNjb3BlLm5hbWVdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IGRhdGEuZmllbGRzWyRzY29wZS5uYW1lXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0YmFyLnR5cGVzID0gW2ZpZWxkLnR5cGVdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5keW5hbWljQmFzZSkgbGVmdGJhci5keW5hbWljRmllbGRzID0gW2ZpZWxkLmR5bmFtaWNCYXNlXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuY29weVNvdXJjZXMgJiYgZmllbGQuY29weVNvdXJjZXMubGVuZ3RoPjApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdGJhci5jb3B5RmllbGRTb3VyY2VzID0gc29ydGVkT2JqZWN0QXJyYXkoZmllbGQuY29weVNvdXJjZXMuc29ydCgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmNvcHlEZXN0cyAmJiBmaWVsZC5jb3B5RGVzdHMubGVuZ3RoPjApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdGJhci5jb3B5RmllbGREZXN0cyA9IHNvcnRlZE9iamVjdEFycmF5KGZpZWxkLmNvcHlEZXN0cy5zb3J0KCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZmllbGRPclR5cGUgPSAiZmllbGQ9IiArICRzY29wZS5uYW1lOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWFyY2hbImR5bmFtaWMtZmllbGQiXSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zZWxlY3RlZFR5cGUgPSAiRHluYW1pYyBGaWVsZCI7DQotICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmlzLmR5bmFtaWNGaWVsZCA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLm5hbWUgPSBzZWFyY2hbImR5bmFtaWMtZmllbGQiXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0YmFyLmR5bmFtaWNGaWVsZHMgPSBbJHNjb3BlLm5hbWVdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRiYXIudHlwZXMgPSBbZGF0YS5keW5hbWljX2ZpZWxkc1skc2NvcGUubmFtZV0udHlwZV07DQotICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmZpZWxkT3JUeXBlID0gImR5bmFtaWMtZmllbGQ9IiArICRzY29wZS5uYW1lOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWFyY2gudHlwZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zZWxlY3RlZFR5cGUgPSAiVHlwZSI7DQotICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmlzLnR5cGUgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5uYW1lID0gc2VhcmNoLnR5cGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdGJhci50eXBlcyA9IFskc2NvcGUubmFtZV07DQotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdGJhci5maWVsZHMgPSBmaWx0ZXJGaWVsZHMoImZpZWxkcyIsIGRhdGEsICRzY29wZS5uYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0YmFyLmR5bmFtaWNGaWVsZHMgPSBmaWx0ZXJGaWVsZHMoImR5bmFtaWNfZmllbGRzIiwgZGF0YSwgJHNjb3BlLm5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5maWVsZE9yVHlwZSA9ICJ0eXBlPSIgKyAkc2NvcGUubmFtZTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dpbmcgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5sZWZ0YmFyID0gbGVmdGJhcjsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5jb3JlID0gJHJvdXRlUGFyYW1zLmNvcmU7DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZGVmYXVsdFNlYXJjaEZpZWxkID0gZGF0YS5kZWZhdWx0X3NlYXJjaF9maWVsZDsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS51bmlxdWVLZXlGaWVsZCA9IGRhdGEudW5pcXVlX2tleV9maWVsZDsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5pc0RlZmF1bHRTZWFyY2hGaWVsZCA9ICgkc2NvcGUuc2VsZWN0ZWRUeXBlID09ICJGaWVsZCIgJiYgJHNjb3BlLm5hbWUgPT0gJHNjb3BlLmRlZmF1bHRTZWFyY2hGaWVsZCk7DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaXNVbmlxdWVLZXlGaWVsZCA9ICgkc2NvcGUuc2VsZWN0ZWRUeXBlID09ICJGaWVsZCIgJiYgJHNjb3BlLm5hbWUgPT0gJHNjb3BlLnVuaXF1ZUtleUZpZWxkKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5kaXNwbGF5ID0gZ2V0RmllbGRQcm9wZXJ0aWVzKGRhdGEsICRyb3V0ZVBhcmFtcy5jb3JlLCAkc2NvcGUuaXMsICRzY29wZS5uYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5hbmFseXNpcyA9IGdldEFuYWx5c2lzSW5mbyhkYXRhLCAkc2NvcGUuaXMsICRzY29wZS5uYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5pc0F1dG9sb2FkID0gJGNvb2tpZXNbY29va2llX3NjaGVtYV9icm93c2VyX2F1dG9sb2FkXSA9PSAidHJ1ZSI7DQotICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmlzQXV0b2xvYWQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudG9nZ2xlVGVybXMoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS50eXBlcyA9IE9iamVjdC5rZXlzKHNjaGVtYS5zY2hlbWEudHlwZXMpOw0KLSAgICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICBDb25maWcuZ2V0KHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZX0sIGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICAgICAgICAgJHNjb3BlLmlzU2NoZW1hVXBkYXRhYmxlID0gKGRhdGEuY29uZmlnLmhhc093blByb3BlcnR5KCdzY2hlbWFGYWN0b3J5JykgPT0gZmFsc2UgfHwgZGF0YS5jb25maWcuc2NoZW1hRmFjdG9yeS5jbGFzcyA9PSAiTWFuYWdlZEluZGV4U2NoZW1hRmFjdG9yeSIpOw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfTsNCi0gICAgICAgICRzY29wZS5yZWZyZXNoKCk7DQotDQotICAgICAgICAkc2NvcGUuc2VsZWN0RmllbGRPclR5cGUgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCRzY29wZS5maWVsZE9yVHlwZSk7DQotICAgICAgICB9DQotDQotICAgICAgICAkc2NvcGUudG9nZ2xlQW5hbHl6ZXIgPSBmdW5jdGlvbihhbmFseXplcikgew0KLSAgICAgICAgICAgIGFuYWx5emVyLnNob3cgPSAhYW5hbHl6ZXIuc2hvdzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgICRzY29wZS5sb2FkVGVybUluZm8gPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICB2YXIgcGFyYW1zID0ge2ZsOiAkc2NvcGUubmFtZSwgY29yZTogJHJvdXRlUGFyYW1zLmNvcmV9Ow0KLSAgICAgICAgICAgIGlmICgkc2NvcGUudG9wVGVybXNDb3VudCkgew0KLSAgICAgICAgICAgICAgICBwYXJhbXMubnVtVGVybXMgPSAkc2NvcGUudG9wVGVybXNDb3VudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgJHNjb3BlLmlzTG9hZGluZ1Rlcm1zID0gdHJ1ZTsNCi0gICAgICAgICAgICBMdWtlLmZpZWxkKHBhcmFtcywgZnVuY3Rpb24gKGRhdGEpIHsNCi0gICAgICAgICAgICAgICAgJHNjb3BlLmlzTG9hZGluZ1Rlcm1zID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICRzY29wZS50ZXJtSW5mbyA9IGdldFRlcm1JbmZvKGRhdGEuZmllbGRzWyRzY29wZS5uYW1lXSk7DQotICAgICAgICAgICAgICAgIGlmICghJHNjb3BlLnRvcFRlcm1zQ291bnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS50b3BUZXJtc0NvdW50ID0gJHNjb3BlLnRlcm1JbmZvLnRlcm1Db3VudDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgJHNjb3BlLnRvZ2dsZVRlcm1zID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgJHNjb3BlLnNob3dUZXJtcyA9ICEkc2NvcGUuc2hvd1Rlcm1zOw0KLQ0KLSAgICAgICAgICAgIGlmICgkc2NvcGUuc2hvd1Rlcm1zKSB7DQotICAgICAgICAgICAgICAgICRzY29wZS5sb2FkVGVybUluZm8oKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAkc2NvcGUubG9hZEFsbFRlcm1zID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgJHNjb3BlLnRvcFRlcm1zQ291bnQgPSAkc2NvcGUudGVybUluZm8ubWF4VGVybXM7DQotICAgICAgICAgICAgJHNjb3BlLmxvYWRUZXJtSW5mbygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgJHNjb3BlLnRvZ2dsZUF1dG9sb2FkID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgJHNjb3BlLmlzQXV0b2xvYWQgPSAhJHNjb3BlLmlzQXV0b2xvYWQ7DQotICAgICAgICAgICAgJGNvb2tpZXNbY29va2llX3NjaGVtYV9icm93c2VyX2F1dG9sb2FkXSA9ICRzY29wZS5pc0F1dG9sb2FkOw0KLSAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb29raWU6ICIgKyAkY29va2llc1tjb29raWVfc2NoZW1hX2Jyb3dzZXJfYXV0b2xvYWRdKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgICRzY29wZS5oaWRlQWxsID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgJHNjb3BlLnNob3dBZGRGaWVsZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICRzY29wZS5zaG93QWRkRHluYW1pY0ZpZWxkID0gZmFsc2U7DQotICAgICAgICAgICAgJHNjb3BlLnNob3dBZGRDb3B5RmllbGQgPSBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgICRzY29wZS50b2dnbGVBZGRGaWVsZCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIGlmICgkc2NvcGUuc2hvd0FkZEZpZWxkICYmICRzY29wZS5hZGRpbmcgPT0gImZpZWxkIikgew0KLSAgICAgICAgICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICRzY29wZS5oaWRlQWxsKCk7DQotICAgICAgICAgICAgICAgICRzY29wZS5zaG93QWRkRmllbGQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAkc2NvcGUuYWRkaW5nID0gImZpZWxkIjsNCi0NCi0gICAgICAgICAgICAgICAgJHNjb3BlLm5ld0ZpZWxkID0gew0KLSAgICAgICAgICAgICAgICAgICAgc3RvcmVkOiAidHJ1ZSIsDQotICAgICAgICAgICAgICAgICAgICBpbmRleGVkOiAidHJ1ZSINCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBkZWxldGUgJHNjb3BlLmFkZEVycm9yczsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAkc2NvcGUuYWRkRmllbGQgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBkZWxldGUgJHNjb3BlLmFkZEVycm9yczsNCi0gICAgICAgICAgICB2YXIgZGF0YSA9IHsiYWRkLWZpZWxkIjogJHNjb3BlLm5ld0ZpZWxkfTsNCi0gICAgICAgICAgICBTY2hlbWEucG9zdCh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCBkYXRhLCBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9ycykgew0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFkZEVycm9ycyA9IGRhdGEuZXJyb3JzWzBdLmVycm9yTWVzc2FnZXM7DQotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mICRzY29wZS5hZGRFcnJvcnMgPT09ICJzdHJpbmciKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFkZEVycm9ycyA9IFskc2NvcGUuYWRkRXJyb3JzXTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5hZGRlZCA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc2hvd0FkZEZpZWxkID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFkZGVkID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnJlZnJlc2goKTsNCi0gICAgICAgICAgICAgICAgICAgIH0sIDE1MDApOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICB9DQotDQotICAgICAgICAkc2NvcGUudG9nZ2xlQWRkRHluYW1pY0ZpZWxkID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgaWYgKCRzY29wZS5zaG93QWRkRmllbGQgJiYgJHNjb3BlLmFkZGluZyA9PSAiZHluYW1pY0ZpZWxkIikgew0KLSAgICAgICAgICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICRzY29wZS5oaWRlQWxsKCk7DQotICAgICAgICAgICAgICAgICRzY29wZS5zaG93QWRkRmllbGQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAkc2NvcGUuYWRkaW5nID0gImR5bmFtaWNGaWVsZCI7DQotDQotICAgICAgICAgICAgICAgICRzY29wZS5uZXdGaWVsZCA9IHsNCi0gICAgICAgICAgICAgICAgICAgIHN0b3JlZDogInRydWUiLA0KLSAgICAgICAgICAgICAgICAgICAgaW5kZXhlZDogInRydWUiDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZGVsZXRlICRzY29wZS5hZGRFcnJvcnM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgJHNjb3BlLmFkZER5bmFtaWNGaWVsZCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIGRlbGV0ZSAkc2NvcGUuYWRkRXJyb3JzOw0KLSAgICAgICAgICAgIHZhciBkYXRhID0geyJhZGQtZHluYW1pYy1maWVsZCI6ICRzY29wZS5uZXdGaWVsZH07DQotICAgICAgICAgICAgU2NoZW1hLnBvc3Qoe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlfSwgZGF0YSwgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvcnMpIHsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5hZGRFcnJvcnMgPSBkYXRhLmVycm9yc1swXS5lcnJvck1lc3NhZ2VzOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkc2NvcGUuYWRkRXJyb3JzID09PSAic3RyaW5nIikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hZGRFcnJvcnMgPSBbJHNjb3BlLmFkZEVycm9yc107DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWRkZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dBZGRGaWVsZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hZGRlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5yZWZyZXNoKCk7DQotICAgICAgICAgICAgICAgICAgICB9LCAxNTAwKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgJHNjb3BlLnRvZ2dsZUFkZENvcHlGaWVsZCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIGlmICgkc2NvcGUuc2hvd0FkZENvcHlGaWVsZCkgew0KLSAgICAgICAgICAgICAgICAkc2NvcGUuaGlkZUFsbCgpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICRzY29wZS5oaWRlQWxsKCk7DQotICAgICAgICAgICAgICAgICRzY29wZS5zaG93QWRkQ29weUZpZWxkID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICAgICAgJHNjb3BlLmNvcHlGaWVsZCA9IHt9Ow0KLSAgICAgICAgICAgICAgICBkZWxldGUgJHNjb3BlLmFkZENvcHlGaWVsZEVycm9yczsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAkc2NvcGUuYWRkQ29weUZpZWxkID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgZGVsZXRlICRzY29wZS5hZGRDb3B5RmllbGRFcnJvcnM7DQotICAgICAgICAgICAgdmFyIGRhdGEgPSB7ImFkZC1jb3B5LWZpZWxkIjogJHNjb3BlLmNvcHlGaWVsZH07DQotICAgICAgICAgICAgU2NoZW1hLnBvc3Qoe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlfSwgZGF0YSwgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvcnMpIHsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5hZGRDb3B5RmllbGRFcnJvcnMgPSBkYXRhLmVycm9yc1swXS5lcnJvck1lc3NhZ2VzOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkc2NvcGUuYWRkQ29weUZpZWxkRXJyb3JzID09PSAic3RyaW5nIikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hZGRDb3B5RmllbGRFcnJvcnMgPSBbJHNjb3BlLmFkZENvcHlGaWVsZEVycm9yc107DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc2hvd0FkZENvcHlGaWVsZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoJHNjb3BlLnJlZnJlc2gsIDE1MDApOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICB9DQotDQotICAgICAgICAkc2NvcGUudG9nZ2xlRGVsZXRlID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgaWYgKCRzY29wZS5zaG93RGVsZXRlKSB7DQotICAgICAgICAgICAgICAgICRzY29wZS5zaG93RGVsZXRlID0gZmFsc2U7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKCRzY29wZS5pcy5maWVsZCkgew0KLSAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmRlbGV0ZURhdGEgPSB7J2RlbGV0ZS1maWVsZCc6IHtuYW1lOiAkc2NvcGUubmFtZX19Ow0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS5pcy5keW5hbWljRmllbGQpIHsNCi0gICAgICAgICAgICAgICAgICAgICRzY29wZS5kZWxldGVEYXRhID0geydkZWxldGUtZHluYW1pYy1maWVsZCc6IHtuYW1lOiAkc2NvcGUubmFtZX19Ow0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgYWxlcnQoIlRZUEUgTk9UIEtOT1dOIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgJHNjb3BlLnNob3dEZWxldGUgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgICRzY29wZS5kZWxldGUgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBTY2hlbWEucG9zdCh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCAkc2NvcGUuZGVsZXRlRGF0YSwgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9ycykgew0KLSAgICAgICAgICAgICAgICAgICAkc2NvcGUuZGVsZXRlRXJyb3JzID0gZGF0YS5lcnJvcnNbMF0uZXJyb3JNZXNzYWdlczsNCi0gICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkc2NvcGUuZGVsZXRlRXJyb3JzID09PSAic3RyaW5nIikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmRlbGV0ZUVycm9ycyA9IFskc2NvcGUuZGVsZXRlRXJyb3JzXTsNCi0gICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICRzY29wZS5kZWxldGVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCIiKTsNCi0gICAgICAgICAgICAgICAgICAgICB9LCAxNTAwDQotICAgICAgICAgICAgICAgICAgICk7DQotICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgJHNjb3BlLnRvZ2dsZURlbGV0ZUNvcHlGaWVsZCA9IGZ1bmN0aW9uKGZpZWxkKSB7DQotICAgICAgICAgICAgZmllbGQuc2hvdyA9ICFmaWVsZC5zaG93Ow0KLSAgICAgICAgICAgIGRlbGV0ZSBmaWVsZC5lcnJvcnM7DQotICAgICAgICB9DQotICAgICAgICAkc2NvcGUuZGVsZXRlQ29weUZpZWxkID0gZnVuY3Rpb24oZmllbGQsIHNvdXJjZSwgZGVzdCkgew0KLSAgICAgICAgICAgIGRhdGEgPSB7J2RlbGV0ZS1jb3B5LWZpZWxkJzoge3NvdXJjZTogc291cmNlLCBkZXN0OiBkZXN0fX07DQotICAgICAgICAgICAgU2NoZW1hLnBvc3Qoe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlfSwgZGF0YSwgZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9ycykgew0KLSAgICAgICAgICAgICAgICAgICBmaWVsZC5lcnJvcnMgPSBkYXRhLmVycm9yc1swXS5lcnJvck1lc3NhZ2VzOw0KLSAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mICRzY29wZS5kZWxldGVFcnJvcnMgPT09ICJzdHJpbmciKSB7DQotICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5lcnJvcnMgPSBbZmllbGQuZXJyb3JzXTsNCi0gICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgIGZpZWxkLmRlbGV0ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAkdGltZW91dCgkc2NvcGUucmVmcmVzaCwgMTUwMCk7DQotICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotKTsNCi0NCi12YXIgZ2V0RmllbGRzQW5kVHlwZXMgPSBmdW5jdGlvbihkYXRhKSB7DQotICAgIHZhciBmaWVsZHNBbmRUeXBlcyA9IFtdOw0KLSAgICB2YXIgZmllbGRzID0gT2JqZWN0LmtleXMoZGF0YS5maWVsZHMpLnNvcnQoKTsNCi0gICAgZm9yICh2YXIgaSBpbiBmaWVsZHMpIHsNCi0gICAgICAgIGZpZWxkc0FuZFR5cGVzLnB1c2goew0KLSAgICAgICAgICAgIGdyb3VwOiAiRmllbGRzIiwNCi0gICAgICAgICAgICB2YWx1ZTogImZpZWxkPSIgKyBmaWVsZHNbaV0sDQotICAgICAgICAgICAgbGFiZWw6IGZpZWxkc1tpXQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi0gICAgdmFyIGR5bmFtaWNfZmllbGRzID0gT2JqZWN0LmtleXMoZGF0YS5keW5hbWljX2ZpZWxkcykuc29ydCgpOw0KLSAgICBmb3IgKHZhciBpIGluIGR5bmFtaWNfZmllbGRzKSB7DQotICAgICAgICBmaWVsZHNBbmRUeXBlcy5wdXNoKHsNCi0gICAgICAgICAgICBncm91cDogIkR5bmFtaWMgRmllbGRzIiwNCi0gICAgICAgICAgICB2YWx1ZTogImR5bmFtaWMtZmllbGQ9IiArIGR5bmFtaWNfZmllbGRzW2ldLA0KLSAgICAgICAgICAgIGxhYmVsOiBkeW5hbWljX2ZpZWxkc1tpXQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi0gICAgdmFyIHR5cGVzID0gT2JqZWN0LmtleXMoZGF0YS50eXBlcykuc29ydCgpOw0KLSAgICBmb3IgKHZhciBpIGluIHR5cGVzKSB7DQotICAgICAgICBmaWVsZHNBbmRUeXBlcy5wdXNoKHsNCi0gICAgICAgICAgICBncm91cDogIlR5cGVzIiwNCi0gICAgICAgICAgICB2YWx1ZTogInR5cGU9IiArIHR5cGVzW2ldLA0KLSAgICAgICAgICAgIGxhYmVsOiB0eXBlc1tpXQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi0gICAgcmV0dXJuIGZpZWxkc0FuZFR5cGVzOw0KLX07DQotDQotdmFyIGZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uKHR5cGUsIGRhdGEsIG5hbWUpIHsNCi0gICAgdmFyIGZpZWxkcyA9IFtdOw0KLSAgICBmb3IgKHZhciBpIGluIGRhdGEudHlwZXNbbmFtZV0uZmllbGRzKSB7DQotICAgICAgICB2YXIgZmllbGQgPSBkYXRhLnR5cGVzW25hbWVdLmZpZWxkc1tpXTsNCi0gICAgICAgIGlmIChkYXRhW3R5cGVdW2ZpZWxkXSkgew0KLSAgICAgICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBmaWVsZHMuc29ydCgpOw0KLX0NCi0NCi12YXIgbWVyZ2VJbmRleEFuZFNjaGVtYURhdGEgPSBmdW5jdGlvbihpbmRleCwgc2NoZW1hKSB7DQotDQotICAgIHZhciBkYXRhID0gew0KLSAgICAgICAgZGVmYXVsdF9zZWFyY2hfZmllbGQ6IG51bGwsDQotICAgICAgICB1bmlxdWVfa2V5X2ZpZWxkOiBudWxsLA0KLSAgICAgICAga2V5OiB7fSwNCi0gICAgICAgIGZpZWxkczoge30sDQotICAgICAgICBkeW5hbWljX2ZpZWxkczoge30sDQotICAgICAgICB0eXBlczoge30sDQotICAgICAgICByZWxhdGlvbnM6IHsNCi0gICAgICAgICAgICBmX2RmOiB7fSwNCi0gICAgICAgICAgICBmX3Q6IHt9LA0KLSAgICAgICAgICAgIGRmX2Y6IHt9LA0KLSAgICAgICAgICAgIGRmX3Q6IHt9LA0KLSAgICAgICAgICAgIHRfZjoge30sDQotICAgICAgICAgICAgdF9kZjoge30NCi0gICAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgZGF0YS5maWVsZHMgPSBpbmRleC5maWVsZHM7DQotDQotICAgIGRhdGEua2V5ID0gaW5kZXguaW5mby5rZXk7DQotDQotICAgIGRhdGEuZGVmYXVsdF9zZWFyY2hfZmllbGQgPSBzY2hlbWEuZGVmYXVsdFNlYXJjaEZpZWxkOw0KLSAgICBkYXRhLnVuaXF1ZV9rZXlfZmllbGQgPSBzY2hlbWEudW5pcXVlS2V5RmllbGQ7DQotDQotICAgIGRhdGEuZHluYW1pY19maWVsZHMgPSBzY2hlbWEuZHluYW1pY0ZpZWxkczsNCi0gICAgZGF0YS50eXBlcyA9IHNjaGVtYS50eXBlczsNCi0NCi0gICAgZm9yICh2YXIgZmllbGQgaW4gc2NoZW1hLmZpZWxkcykgew0KLSAgICAgICAgZGF0YS5maWVsZHNbZmllbGRdID0NCi0gICAgICAgICAgICAkLmV4dGVuZCh7fSwgZGF0YS5maWVsZHNbZmllbGRdLCBzY2hlbWEuZmllbGRzW2ZpZWxkXSk7DQotICAgIH0NCi0NCi0gICAgZm9yICh2YXIgZmllbGQgaW4gZGF0YS5maWVsZHMpIHsNCi0gICAgICAgIHZhciBjb3B5X2Rlc3RzID0gZGF0YS5maWVsZHNbZmllbGRdLmNvcHlEZXN0czsNCi0gICAgICAgIGZvciAodmFyIGkgaW4gY29weV9kZXN0cykgew0KLSAgICAgICAgICAgIHZhciBjb3B5X2Rlc3QgPSBjb3B5X2Rlc3RzW2ldOw0KLSAgICAgICAgICAgIGlmICghZGF0YS5maWVsZHNbY29weV9kZXN0XSkgew0KLSAgICAgICAgICAgICAgICBkYXRhLmZpZWxkc1tjb3B5X2Rlc3RdID0gew0KLSAgICAgICAgICAgICAgICAgICAgcGFydGlhbDogdHJ1ZSwNCi0gICAgICAgICAgICAgICAgICAgIGNvcHlTb3VyY2VzOiBbXQ0KLSAgICAgICAgICAgICAgICB9Ow0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGF0YS5maWVsZHNbY29weV9kZXN0XS5wYXJ0aWFsKSB7DQotICAgICAgICAgICAgICAgIGRhdGEuZmllbGRzW2NvcHlfZGVzdF0uY29weVNvdXJjZXMucHVzaChmaWVsZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdmFyIGNvcHlfc291cmNlcyA9IGRhdGEuZmllbGRzW2ZpZWxkXS5jb3B5U291cmNlczsNCi0gICAgICAgIGZvciAodmFyIGkgaW4gY29weV9zb3VyY2VzKSB7DQotICAgICAgICAgICAgdmFyIGNvcHlfc291cmNlID0gY29weV9zb3VyY2VzW2ldOw0KLSAgICAgICAgICAgIGlmICghZGF0YS5maWVsZHNbY29weV9zb3VyY2VdKSB7DQotICAgICAgICAgICAgICAgIGRhdGEuZmllbGRzW2NvcHlfc291cmNlXSA9IHsNCi0gICAgICAgICAgICAgICAgICAgIHBhcnRpYWw6IHRydWUsDQotICAgICAgICAgICAgICAgICAgICBjb3B5RGVzdHM6IFtdDQotICAgICAgICAgICAgICAgIH07DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkYXRhLmZpZWxkc1tjb3B5X3NvdXJjZV0ucGFydGlhbCkgew0KLSAgICAgICAgICAgICAgICBkYXRhLmZpZWxkc1tjb3B5X3NvdXJjZV0uY29weURlc3RzLnB1c2goZmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRhdGEucmVsYXRpb25zLmZfdFtmaWVsZF0gPSBkYXRhLmZpZWxkc1tmaWVsZF0udHlwZTsNCi0NCi0gICAgICAgIGlmICghZGF0YS5yZWxhdGlvbnMudF9mW2RhdGEuZmllbGRzW2ZpZWxkXS50eXBlXSkgew0KLSAgICAgICAgICAgIGRhdGEucmVsYXRpb25zLnRfZltkYXRhLmZpZWxkc1tmaWVsZF0udHlwZV0gPSBbXTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRhdGEucmVsYXRpb25zLnRfZltkYXRhLmZpZWxkc1tmaWVsZF0udHlwZV0ucHVzaChmaWVsZCk7DQotDQotICAgICAgICBpZiAoZGF0YS5maWVsZHNbZmllbGRdLmR5bmFtaWNCYXNlKSB7DQotICAgICAgICAgICAgZGF0YS5yZWxhdGlvbnMuZl9kZltmaWVsZF0gPSBkYXRhLmZpZWxkc1tmaWVsZF0uZHluYW1pY0Jhc2U7DQotDQotICAgICAgICAgICAgaWYgKCFkYXRhLnJlbGF0aW9ucy5kZl9mW2RhdGEuZmllbGRzW2ZpZWxkXS5keW5hbWljQmFzZV0pIHsNCi0gICAgICAgICAgICAgICAgZGF0YS5yZWxhdGlvbnMuZGZfZltkYXRhLmZpZWxkc1tmaWVsZF0uZHluYW1pY0Jhc2VdID0gW107DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGRhdGEucmVsYXRpb25zLmRmX2ZbZGF0YS5maWVsZHNbZmllbGRdLmR5bmFtaWNCYXNlXS5wdXNoKGZpZWxkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBmb3IgKHZhciBkeW5hbWljX2ZpZWxkIGluIGRhdGEuZHluYW1pY19maWVsZHMpIHsNCi0gICAgICAgIGRhdGEucmVsYXRpb25zLmRmX3RbZHluYW1pY19maWVsZF0gPSBkYXRhLmR5bmFtaWNfZmllbGRzW2R5bmFtaWNfZmllbGRdLnR5cGU7DQotDQotICAgICAgICBpZiAoIWRhdGEucmVsYXRpb25zLnRfZGZbZGF0YS5keW5hbWljX2ZpZWxkc1tkeW5hbWljX2ZpZWxkXS50eXBlXSkgew0KLSAgICAgICAgICAgIGRhdGEucmVsYXRpb25zLnRfZGZbZGF0YS5keW5hbWljX2ZpZWxkc1tkeW5hbWljX2ZpZWxkXS50eXBlXSA9IFtdOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZGF0YS5yZWxhdGlvbnMudF9kZltkYXRhLmR5bmFtaWNfZmllbGRzW2R5bmFtaWNfZmllbGRdLnR5cGVdLnB1c2goZHluYW1pY19maWVsZCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGRhdGE7DQotfTsNCi0NCi12YXIgZ2V0RmllbGRQcm9wZXJ0aWVzID0gZnVuY3Rpb24oZGF0YSwgY29yZSwgaXMsIGZpZWxkKSB7DQotDQotICAgIHZhciBkaXNwbGF5ID0ge307DQotDQotICAgIGRpc3BsYXkucGFydGlhbFN0YXRlID0gaXMuZmllbGQgJiYgISFkYXRhLmZpZWxkc1tmaWVsZF0ucGFydGlhbDsNCi0NCi0gICAgZGlzcGxheS5jb2x1bW5zID0gW107DQotICAgIGRpc3BsYXkucm93cyA9IFtdOw0KLSAgICB2YXIgYWxsRmxhZ3MgPSAiIjsNCi0NCi0gICAgdmFyIGFkZFJvdyA9IGZ1bmN0aW9uKG5hbWUsIGZsYWdzKSB7DQotICAgICAgICBpZiAoZmxhZ3NbMF0hPScoJykgew0KLSAgICAgICAgICAgIGRpc3BsYXkucm93cy5wdXNoKHtuYW1lOm5hbWUsIGZsYWdzOmZsYWdzfSk7DQotICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBmbGFncykgew0KLSAgICAgICAgICAgICAgICBpZiAoZmxhZ3NbaV0hPSItIiAmJiBhbGxGbGFncy5pbmRleE9mKGZsYWdzW2ldKTwwKSB7DQotICAgICAgICAgICAgICAgICAgICBhbGxGbGFncys9ZmxhZ3NbaV07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGRpc3BsYXkucm93cy5wdXNoKHtuYW1lOm5hbWUsIGNvbW1lbnQ6ZmxhZ3N9KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvLyBJZGVudGlmeSB0aGUgcm93cyBmb3Igb3VyIGZpZWxkIHByb3BlcnR5IHRhYmxlDQotICAgIGlmIChpcy5maWVsZCAmJiBkYXRhLmZpZWxkc1tmaWVsZF0pIHsNCi0gICAgICAgIGlmIChkYXRhLmZpZWxkc1tmaWVsZF0uZmxhZ3MpIHsNCi0gICAgICAgICAgICBhZGRSb3coJ1Byb3BlcnRpZXMnLCBkYXRhLmZpZWxkc1tmaWVsZF0uZmxhZ3MpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGRhdGEuZmllbGRzW2ZpZWxkXS5zY2hlbWEpIHsNCi0gICAgICAgICAgICBhZGRSb3coJ1NjaGVtYScsIGRhdGEuZmllbGRzW2ZpZWxkXS5zY2hlbWEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGRhdGEuZmllbGRzW2ZpZWxkXS5pbmRleCkgew0KLSAgICAgICAgICAgIGFkZFJvdygnSW5kZXgnLCBkYXRhLmZpZWxkc1tmaWVsZF0uaW5kZXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZGlzcGxheS5kb2NzID0gZGF0YS5maWVsZHNbZmllbGRdLmRvY3M7DQotICAgICAgICBkaXNwbGF5LmRvY3NVcmwgPSAiIy8iICsgY29yZSArICIvcXVlcnk/cT0iICsgZmllbGQgKyAiOlsqIFRPICpdIjsNCi0gICAgICAgIGRpc3BsYXkuZGlzdGluY3QgPSBkYXRhLmZpZWxkc1tmaWVsZF0uZGlzdGluY3Q7DQotICAgICAgICBkaXNwbGF5LnBvc2l0aW9uSW5jcmVtZW50R2FwID0gZGF0YS5maWVsZHNbZmllbGRdLnBvc2l0aW9uSW5jcmVtZW50R2FwOw0KLSAgICAgICAgZGlzcGxheS5zaW1pbGFyaXR5ID0gZGF0YS5maWVsZHNbZmllbGRdLnNpbWlsYXJpdHk7DQotICAgIH0gZWxzZSBpZiAoaXMuZHluYW1pY0ZpZWxkICYmIGRhdGEuZHluYW1pY19maWVsZHNbZmllbGRdICYmIGRhdGEuZHluYW1pY19maWVsZHNbZmllbGRdLmZsYWdzKSB7DQotICAgICAgICBhZGRSb3coJ1Byb3BlcnRpZXMnLCBkYXRhLmR5bmFtaWNfZmllbGRzW2ZpZWxkXS5mbGFncyk7DQotICAgIH0NCi0NCi0gICAgLy8gaWRlbnRpZnkgY29sdW1ucyBpbiBmaWVsZCBwcm9wZXJ0eSB0YWJsZToNCi0gICAgZm9yICh2YXIga2V5IGluIGRhdGEua2V5KSB7DQotICAgICAgICBpZiAoYWxsRmxhZ3MuaW5kZXhPZihrZXkpPj0wKSB7DQotICAgICAgICAgICAgZGlzcGxheS5jb2x1bW5zLnB1c2goe2tleToga2V5LCBuYW1lOiBkYXRhLmtleVtrZXldfSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLy8gaWRlbnRpZnkgcm93cyBhbmQgY2VsbCB2YWx1ZXMgaW4gZmllbGQgcHJvcGVydHkgdGFibGU6DQotICAgIGZvciAodmFyIGkgaW4gZGlzcGxheS5yb3dzKSB7DQotICAgICAgICB2YXIgcm93ID0gZGlzcGxheS5yb3dzW2ldOw0KLSAgICAgICAgcm93LmNlbGxzID0gW107DQotDQotICAgICAgICBpZiAoIXJvdy5mbGFncykgew0KLSAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBNYXRjaCB0aGUgc3BlY2lhbCBjYXNlIGluIHRoZSBMdWtlUmVxdWVzdEhhbmRsZXINCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAodmFyIGogaW4gZGlzcGxheS5jb2x1bW5zKSB7DQotICAgICAgICAgICAgdmFyIGZsYWcgPSBkaXNwbGF5LmNvbHVtbnNbal0ua2V5Ow0KLSAgICAgICAgICAgIHJvdy5jZWxscy5wdXNoKHtrZXk6IGZsYWcsIHZhbHVlOiByb3cuZmxhZ3MuaW5kZXhPZihmbGFnKT49MH0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHJldHVybiBkaXNwbGF5Ow0KLX07DQotDQotdmFyIGdldEFuYWx5c2lzSW5mbyA9IGZ1bmN0aW9uKGRhdGEsIGlzLCBuYW1lKSB7DQotDQotICAgIHZhciBhbmFseXNpcyA9IHt9Ow0KLQ0KLSAgICBpZiAoaXMuZmllbGQpIHsNCi0gICAgICAgIHZhciB0eXBlID0gZGF0YS5yZWxhdGlvbnMuZl90W25hbWVdOw0KLSAgICAgICAgYW5hbHlzaXMucXVlcnkgPSAiYW5hbHlzaXMuZmllbGRuYW1lPSIgKyBuYW1lOw0KLSAgICB9DQotICAgIGVsc2UgaWYgKGlzLmR5bmFtaWNGaWVsZCkgew0KLSAgICAgICAgdmFyIHR5cGUgPSBkYXRhLnJlbGF0aW9ucy5kZl90W25hbWVdOw0KLSAgICAgICAgYW5hbHlzaXMucXVlcnkgPSAiYW5hbHlzaXMuZmllbGR0eXBlPSIgKyB0eXBlOw0KLSAgICB9DQotICAgIGVsc2UgaWYgKGlzLnR5cGUpIHsNCi0gICAgICAgIHZhciB0eXBlID0gbmFtZTsNCi0gICAgICAgIGFuYWx5c2lzLnF1ZXJ5ID0gImFuYWx5c2lzLmZpZWxkdHlwZT0iICsgbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICB2YXIgcHJvY2Vzc0NvbXBvbmVudFR5cGUgPSBmdW5jdGlvbiAobGFiZWwsIGtleSwgY29tcG9uZW50VHlwZURhdGEpIHsNCi0gICAgICAgIGlmIChjb21wb25lbnRUeXBlRGF0YSkgew0KLSAgICAgICAgICAgIHZhciBjb21wb25lbnRzID0gW107DQotICAgICAgICAgICAgZm9yICh2YXIgY29tcG9uZW50TmFtZSBpbiBjb21wb25lbnRUeXBlRGF0YSkgew0KLSAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50RGF0YSA9IGNvbXBvbmVudFR5cGVEYXRhW2NvbXBvbmVudE5hbWVdOw0KLSAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0ge2NsYXNzTmFtZTogY29tcG9uZW50RGF0YS5jbGFzc05hbWUsIGFyZ3M6W119Ow0KLSAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50RGF0YS5hcmdzKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhcmdOYW1lIGluIGNvbXBvbmVudERhdGEuYXJncykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdWYWx1ZSA9IGNvbXBvbmVudERhdGEuYXJnc1thcmdOYW1lXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnVmFsdWUgPT0gIjEiIHx8IGFyZ1ZhbHVlID09ICJ0cnVlIikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuYXJncy5wdXNoKHtuYW1lOiBhcmdOYW1lLCBib29sZWFuVmFsdWU6dHJ1ZX0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnVmFsdWUgPT0gIjAiIHx8IGFyZ1ZhbHVlID09ICJmYWxzZSIpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmFyZ3MucHVzaCh7bmFtZTogYXJnTmFtZSwgYm9vbGVhblZhbHVlOmZhbHNlfSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmFyZ3MucHVzaCh7bmFtZTogYXJnTmFtZSwgdmFsdWU6YXJnVmFsdWV9KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiB7bGFiZWw6IGxhYmVsLCBrZXk6IGtleSwgY29tcG9uZW50czogY29tcG9uZW50c307DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiB7bGFiZWw6IGxhYmVsLCBrZXk6IGtleX07DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgdmFyIGJ1aWxkQW5hbHl6ZXIgPSBmdW5jdGlvbiAoYW5hbHl6ZXJEYXRhKSB7DQotICAgICAgICB2YXIgYW5hbHl6ZXIgPSB7fTsNCi0gICAgICAgIGFuYWx5emVyLmNsYXNzTmFtZSA9IGFuYWx5emVyRGF0YS5jbGFzc05hbWU7DQotICAgICAgICBhbmFseXplci5jb21wb25lbnRUeXBlcyA9IFtdOw0KLSAgICAgICAgaWYgKGFuYWx5emVyRGF0YS50b2tlbml6ZXIpIHsNCi0gICAgICAgICAgICBhbmFseXplci5jb21wb25lbnRUeXBlcy5wdXNoKHByb2Nlc3NDb21wb25lbnRUeXBlKCJDaGFyIEZpbHRlcnMiLCAiY2hhckZpbHRlcnMiLCBhbmFseXplckRhdGEuY2hhckZpbHRlcnMpKTsNCi0gICAgICAgICAgICBhbmFseXplci5jb21wb25lbnRUeXBlcy5wdXNoKHByb2Nlc3NDb21wb25lbnRUeXBlKCJUb2tlbml6ZXIiLCAidG9rZW5pemVyIiwge3Rva2VuaXplcjogYW5hbHl6ZXJEYXRhLnRva2VuaXplcn0pKTsNCi0gICAgICAgICAgICBhbmFseXplci5jb21wb25lbnRUeXBlcy5wdXNoKHByb2Nlc3NDb21wb25lbnRUeXBlKCJUb2tlbiBGaWx0ZXJzIiwgInRva2VuRmlsdGVycyIsIGFuYWx5emVyRGF0YS5maWx0ZXJzKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYW5hbHl6ZXI7DQotICAgIH0NCi0NCi0gICAgYW5hbHlzaXMuZGF0YSA9IGRhdGEudHlwZXNbdHlwZV07DQotICAgIGlmIChhbmFseXNpcy5kYXRhKSB7DQotICAgICAgICBhbmFseXNpcy5hbmFseXplcnMgPSBbDQotICAgICAgICAgICAge2tleTogImluZGV4IiwgbmFtZTogIkluZGV4IiwgZGV0YWlsOiBidWlsZEFuYWx5emVyKGFuYWx5c2lzLmRhdGEuaW5kZXhBbmFseXplcil9LA0KLSAgICAgICAgICAgIHtrZXk6ICJxdWVyeSIsIG5hbWU6ICJRdWVyeSIsIGRldGFpbDogYnVpbGRBbmFseXplcihhbmFseXNpcy5kYXRhLnF1ZXJ5QW5hbHl6ZXIpfQ0KLSAgICAgICAgXTsNCi0gICAgfQ0KLSAgICByZXR1cm4gYW5hbHlzaXM7DQotfQ0KLQ0KLXZhciBnZXRUZXJtSW5mbyA9IGZ1bmN0aW9uKGRhdGEpIHsNCi0NCi0gICAgdmFyIHRlcm1JbmZvID0ge307DQotICAgIGlmIChkYXRhICYmIGRhdGEudG9wVGVybXMpIHsNCi0gICAgICAgIHRlcm1JbmZvLnRvcFRlcm1zID0gW107DQotDQotICAgICAgICB2YXIgY3VycmVudEdyb3VwID0ge2NvdW50OiAwfQ0KLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLnRvcFRlcm1zLmxlbmd0aDsgaSArPSAyKSB7DQotICAgICAgICAgICAgdmFyIGNvdW50ID0gZGF0YS50b3BUZXJtc1tpICsgMV07DQotICAgICAgICAgICAgaWYgKGN1cnJlbnRHcm91cC5jb3VudCAhPSBjb3VudCkgew0KLSAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXAgPSB7Y291bnQ6IGNvdW50LCB0ZXJtczogW119Ow0KLSAgICAgICAgICAgICAgICB0ZXJtSW5mby50b3BUZXJtcy5wdXNoKGN1cnJlbnRHcm91cCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGN1cnJlbnRHcm91cC50ZXJtcy5wdXNoKGRhdGEudG9wVGVybXNbaV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGVybUluZm8udGVybUNvdW50ID0gZGF0YS50b3BUZXJtcy5sZW5ndGggLyAyOw0KLSAgICAgICAgdGVybUluZm8ubWF4VGVybXMgPSBkYXRhLmRpc3RpbmN0Ow0KLSAgICB9DQotDQotICAgIGlmKGRhdGEgJiYgZGF0YS5oaXN0b2dyYW0pIHsNCi0gICAgICAgIHRlcm1JbmZvLmhpc3RvZ3JhbSA9IFtdOw0KLSAgICAgICAgdGVybUluZm8uaGlzdG9ncmFtTWF4ID0gMDsNCi0gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5oaXN0b2dyYW0ubGVuZ3RoOyBpICs9IDIpIHsNCi0gICAgICAgICAgICB0ZXJtSW5mby5oaXN0b2dyYW0ucHVzaCh7a2V5OiBkYXRhLmhpc3RvZ3JhbVtpXSwgdmFsdWU6IGRhdGEuaGlzdG9ncmFtW2kgKyAxXX0pOw0KLSAgICAgICAgICAgIHRlcm1JbmZvLmhpc3RvZ3JhbU1heCA9IE1hdGgubWF4KHRlcm1JbmZvLmhpc3RvZ3JhbU1heCwgZGF0YS5oaXN0b2dyYW1baSArIDFdKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gdGVybUluZm87DQotfTsNCi0NCi12YXIgc29ydGVkT2JqZWN0QXJyYXkgPSBmdW5jdGlvbihsaXN0KSB7DQotICAgIHZhciBvYmphcnIgPSBbXTsNCi0gICAgZm9yICh2YXIgaSBpbiBsaXN0KSB7DQotICAgICAgb2JqYXJyLnB1c2goeyJuYW1lIjogbGlzdFtpXX0pOw0KLSAgICB9DQotICAgIHJldHVybiBvYmphcnI7DQotfQ0KLQ0KLS8qDQotICAgICAgICB2YXIgZ2V0X3dpZHRoID0gZnVuY3Rpb24gZ2V0X3dpZHRoKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgcmV0dXJuICQoIHRoaXMgKS53aWR0aCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgdmFyIG1heF93aWR0aCA9IDEwICsgTWF0aC5tYXguYXBwbHkoIE1hdGgsICQoICdwJywgdG9wdGVybXNfdGFibGVfZWxlbWVudCApLm1hcCggZ2V0X3dpZHRoICkuZ2V0KCkgKTsNCi0gIHRvcHRlcm1zOg0KLSAgICBwIHsgd2lkdGg6IHt7bWF4V2lkdGh9fXB4ICFpbXBvcnRhbnQ7IH0NCi0gICAgdWwgeyBtYXJnaW4tbGVmdDoge3ttYXhfd2lkdGggKyA1IH19cHggIWltcG9ydGFudDsgfQ0KLQ0KLSAgdmFyIG1heF93aWR0aCA9IDEwICsgTWF0aC5tYXguYXBwbHkoIE1hdGgsICQoICdkdCcsIGhpc3RvZ3JhbV9ob2xkZXJfZWxlbWVudCApLm1hcCggZ2V0X3dpZHRoICkuZ2V0KCkgKTsNCi0gIGhpc3RvZ3JhbV9ob2xkZXI6DQotICAgIHVsIHsgbWFyZ2luLWxlZnQ6IHt7bWF4V2lkdGh9fXB4ICFpbXBvcnRhbnQ7IH0NCi0gICAgbGkgZHQgeyBsZWZ0OiB7ey1tYXhXaWR0aH19cHggIWltcG9ydGFudDsgd2lkdGg6IHt7bWF4V2lkdGh9fXB4ICFpbXBvcnRhbnQ7IH0NCi0qLw0KKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKwordmFyIGNvb2tpZV9zY2hlbWFfYnJvd3Nlcl9hdXRvbG9hZCA9ICdzY2hlbWEtYnJvd3Nlcl9hdXRvbG9hZCc7CisKK3NvbHJBZG1pbkFwcC5jb250cm9sbGVyKCdTY2hlbWFDb250cm9sbGVyJywKKyAgICBmdW5jdGlvbigkc2NvcGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uLCAkY29va2llcywgJHRpbWVvdXQsIEx1a2UsIENvbnN0YW50cywgU2NoZW1hLCBDb25maWcpIHsKKyAgICAgICAgJHNjb3BlLnJlc2V0TWVudSgic2NoZW1hIiwgQ29uc3RhbnRzLklTX0NPTExFQ1RJT05fUEFHRSk7CisKKyAgICAgICAgJHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBMdWtlLnNjaGVtYSh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCBmdW5jdGlvbiAoc2NoZW1hKSB7CisgICAgICAgICAgICAgICAgTHVrZS5yYXcoe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlfSwgZnVuY3Rpb24gKGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gbWVyZ2VJbmRleEFuZFNjaGVtYURhdGEoaW5kZXgsIHNjaGVtYS5zY2hlbWEpOworCisgICAgICAgICAgICAgICAgICAgICRzY29wZS5maWVsZHNBbmRUeXBlcyA9IGdldEZpZWxkc0FuZFR5cGVzKGRhdGEpOworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaXMgPSB7fTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoID0gJGxvY2F0aW9uLnNlYXJjaCgpOworICAgICAgICAgICAgICAgICAgICBsZWZ0YmFyID0ge307CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5pc0ZpZWxkID0gJHNjb3BlLmlzRHluYW1pY0ZpZWxkID0gJHNjb3BlLmlzVHlwZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc2hvd2luZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2guZmllbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zZWxlY3RlZFR5cGUgPSAiRmllbGQiOworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmlzLmZpZWxkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5uYW1lID0gc2VhcmNoLmZpZWxkOworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdGJhci5maWVsZHMgPSBbJHNjb3BlLm5hbWVdOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZGF0YS5maWVsZHNbJHNjb3BlLm5hbWVdOworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdGJhci50eXBlcyA9IFtmaWVsZC50eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5keW5hbWljQmFzZSkgbGVmdGJhci5keW5hbWljRmllbGRzID0gW2ZpZWxkLmR5bmFtaWNCYXNlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5jb3B5U291cmNlcyAmJiBmaWVsZC5jb3B5U291cmNlcy5sZW5ndGg+MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRiYXIuY29weUZpZWxkU291cmNlcyA9IHNvcnRlZE9iamVjdEFycmF5KGZpZWxkLmNvcHlTb3VyY2VzLnNvcnQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuY29weURlc3RzICYmIGZpZWxkLmNvcHlEZXN0cy5sZW5ndGg+MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRiYXIuY29weUZpZWxkRGVzdHMgPSBzb3J0ZWRPYmplY3RBcnJheShmaWVsZC5jb3B5RGVzdHMuc29ydCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5maWVsZE9yVHlwZSA9ICJmaWVsZD0iICsgJHNjb3BlLm5hbWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VhcmNoWyJkeW5hbWljLWZpZWxkIl0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5zZWxlY3RlZFR5cGUgPSAiRHluYW1pYyBGaWVsZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaXMuZHluYW1pY0ZpZWxkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5uYW1lID0gc2VhcmNoWyJkeW5hbWljLWZpZWxkIl07CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0YmFyLmR5bmFtaWNGaWVsZHMgPSBbJHNjb3BlLm5hbWVdOworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdGJhci50eXBlcyA9IFtkYXRhLmR5bmFtaWNfZmllbGRzWyRzY29wZS5uYW1lXS50eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5maWVsZE9yVHlwZSA9ICJkeW5hbWljLWZpZWxkPSIgKyAkc2NvcGUubmFtZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWFyY2gudHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNlbGVjdGVkVHlwZSA9ICJUeXBlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5pcy50eXBlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5uYW1lID0gc2VhcmNoLnR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0YmFyLnR5cGVzID0gWyRzY29wZS5uYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRiYXIuZmllbGRzID0gZmlsdGVyRmllbGRzKCJmaWVsZHMiLCBkYXRhLCAkc2NvcGUubmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0YmFyLmR5bmFtaWNGaWVsZHMgPSBmaWx0ZXJGaWVsZHMoImR5bmFtaWNfZmllbGRzIiwgZGF0YSwgJHNjb3BlLm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmZpZWxkT3JUeXBlID0gInR5cGU9IiArICRzY29wZS5uYW1lOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAkc2NvcGUubGVmdGJhciA9IGxlZnRiYXI7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5jb3JlID0gJHJvdXRlUGFyYW1zLmNvcmU7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5kZWZhdWx0U2VhcmNoRmllbGQgPSBkYXRhLmRlZmF1bHRfc2VhcmNoX2ZpZWxkOworICAgICAgICAgICAgICAgICAgICAkc2NvcGUudW5pcXVlS2V5RmllbGQgPSBkYXRhLnVuaXF1ZV9rZXlfZmllbGQ7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5pc0RlZmF1bHRTZWFyY2hGaWVsZCA9ICgkc2NvcGUuc2VsZWN0ZWRUeXBlID09ICJGaWVsZCIgJiYgJHNjb3BlLm5hbWUgPT0gJHNjb3BlLmRlZmF1bHRTZWFyY2hGaWVsZCk7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5pc1VuaXF1ZUtleUZpZWxkID0gKCRzY29wZS5zZWxlY3RlZFR5cGUgPT0gIkZpZWxkIiAmJiAkc2NvcGUubmFtZSA9PSAkc2NvcGUudW5pcXVlS2V5RmllbGQpOworCisgICAgICAgICAgICAgICAgICAgICRzY29wZS5kaXNwbGF5ID0gZ2V0RmllbGRQcm9wZXJ0aWVzKGRhdGEsICRyb3V0ZVBhcmFtcy5jb3JlLCAkc2NvcGUuaXMsICRzY29wZS5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFuYWx5c2lzID0gZ2V0QW5hbHlzaXNJbmZvKGRhdGEsICRzY29wZS5pcywgJHNjb3BlLm5hbWUpOworCisgICAgICAgICAgICAgICAgICAgICRzY29wZS5pc0F1dG9sb2FkID0gJGNvb2tpZXNbY29va2llX3NjaGVtYV9icm93c2VyX2F1dG9sb2FkXSA9PSAidHJ1ZSI7CisgICAgICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuaXNBdXRvbG9hZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnRvZ2dsZVRlcm1zKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAkc2NvcGUudHlwZXMgPSBPYmplY3Qua2V5cyhzY2hlbWEuc2NoZW1hLnR5cGVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgQ29uZmlnLmdldCh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgICAgICAgJHNjb3BlLmlzU2NoZW1hVXBkYXRhYmxlID0gKGRhdGEuY29uZmlnLmhhc093blByb3BlcnR5KCdzY2hlbWFGYWN0b3J5JykgPT0gZmFsc2UgfHwgZGF0YS5jb25maWcuc2NoZW1hRmFjdG9yeS5jbGFzcyA9PSAiTWFuYWdlZEluZGV4U2NoZW1hRmFjdG9yeSIpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH07CisgICAgICAgICRzY29wZS5yZWZyZXNoKCk7CisKKyAgICAgICAgJHNjb3BlLnNlbGVjdEZpZWxkT3JUeXBlID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCRzY29wZS5maWVsZE9yVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICAkc2NvcGUudG9nZ2xlQW5hbHl6ZXIgPSBmdW5jdGlvbihhbmFseXplcikgeworICAgICAgICAgICAgYW5hbHl6ZXIuc2hvdyA9ICFhbmFseXplci5zaG93OworICAgICAgICB9CisKKyAgICAgICAgJHNjb3BlLmxvYWRUZXJtSW5mbyA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHtmbDogJHNjb3BlLm5hbWUsIGNvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlfTsKKyAgICAgICAgICAgIGlmICgkc2NvcGUudG9wVGVybXNDb3VudCkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5udW1UZXJtcyA9ICRzY29wZS50b3BUZXJtc0NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHNjb3BlLmlzTG9hZGluZ1Rlcm1zID0gdHJ1ZTsKKyAgICAgICAgICAgIEx1a2UuZmllbGQocGFyYW1zLCBmdW5jdGlvbiAoZGF0YSkgeworICAgICAgICAgICAgICAgICRzY29wZS5pc0xvYWRpbmdUZXJtcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICRzY29wZS50ZXJtSW5mbyA9IGdldFRlcm1JbmZvKGRhdGEuZmllbGRzWyRzY29wZS5uYW1lXSk7CisgICAgICAgICAgICAgICAgaWYgKCEkc2NvcGUudG9wVGVybXNDb3VudCkgeworICAgICAgICAgICAgICAgICAgICAkc2NvcGUudG9wVGVybXNDb3VudCA9ICRzY29wZS50ZXJtSW5mby50ZXJtQ291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICAkc2NvcGUudG9nZ2xlVGVybXMgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICRzY29wZS5zaG93VGVybXMgPSAhJHNjb3BlLnNob3dUZXJtczsKKworICAgICAgICAgICAgaWYgKCRzY29wZS5zaG93VGVybXMpIHsKKyAgICAgICAgICAgICAgICAkc2NvcGUubG9hZFRlcm1JbmZvKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAkc2NvcGUubG9hZEFsbFRlcm1zID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAkc2NvcGUudG9wVGVybXNDb3VudCA9ICRzY29wZS50ZXJtSW5mby5tYXhUZXJtczsKKyAgICAgICAgICAgICRzY29wZS5sb2FkVGVybUluZm8oKTsKKyAgICAgICAgfQorCisgICAgICAgICRzY29wZS50b2dnbGVBdXRvbG9hZCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgJHNjb3BlLmlzQXV0b2xvYWQgPSAhJHNjb3BlLmlzQXV0b2xvYWQ7CisgICAgICAgICAgICAkY29va2llc1tjb29raWVfc2NoZW1hX2Jyb3dzZXJfYXV0b2xvYWRdID0gJHNjb3BlLmlzQXV0b2xvYWQ7CisgICAgICAgICAgICBjb25zb2xlLmxvZygiY29va2llOiAiICsgJGNvb2tpZXNbY29va2llX3NjaGVtYV9icm93c2VyX2F1dG9sb2FkXSk7CisgICAgICAgIH0KKworICAgICAgICAkc2NvcGUuaGlkZUFsbCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgJHNjb3BlLnNob3dBZGRGaWVsZCA9IGZhbHNlOworICAgICAgICAgICAgJHNjb3BlLnNob3dBZGREeW5hbWljRmllbGQgPSBmYWxzZTsKKyAgICAgICAgICAgICRzY29wZS5zaG93QWRkQ29weUZpZWxkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAkc2NvcGUudG9nZ2xlQWRkRmllbGQgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGlmICgkc2NvcGUuc2hvd0FkZEZpZWxkICYmICRzY29wZS5hZGRpbmcgPT0gImZpZWxkIikgeworICAgICAgICAgICAgICAgICRzY29wZS5oaWRlQWxsKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRzY29wZS5oaWRlQWxsKCk7CisgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dBZGRGaWVsZCA9IHRydWU7CisgICAgICAgICAgICAgICAgJHNjb3BlLmFkZGluZyA9ICJmaWVsZCI7CisKKyAgICAgICAgICAgICAgICAkc2NvcGUubmV3RmllbGQgPSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlZDogInRydWUiLAorICAgICAgICAgICAgICAgICAgICBpbmRleGVkOiAidHJ1ZSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlICRzY29wZS5hZGRFcnJvcnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAkc2NvcGUuYWRkRmllbGQgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGRlbGV0ZSAkc2NvcGUuYWRkRXJyb3JzOworICAgICAgICAgICAgdmFyIGRhdGEgPSB7ImFkZC1maWVsZCI6ICRzY29wZS5uZXdGaWVsZH07CisgICAgICAgICAgICBTY2hlbWEucG9zdCh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCBkYXRhLCBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JzKSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5hZGRFcnJvcnMgPSBkYXRhLmVycm9yc1swXS5lcnJvck1lc3NhZ2VzOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mICRzY29wZS5hZGRFcnJvcnMgPT09ICJzdHJpbmciKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWRkRXJyb3JzID0gWyRzY29wZS5hZGRFcnJvcnNdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc2hvd0FkZEZpZWxkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5yZWZyZXNoKCk7CisgICAgICAgICAgICAgICAgICAgIH0sIDE1MDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgJHNjb3BlLnRvZ2dsZUFkZER5bmFtaWNGaWVsZCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgaWYgKCRzY29wZS5zaG93QWRkRmllbGQgJiYgJHNjb3BlLmFkZGluZyA9PSAiZHluYW1pY0ZpZWxkIikgeworICAgICAgICAgICAgICAgICRzY29wZS5oaWRlQWxsKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRzY29wZS5oaWRlQWxsKCk7CisgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dBZGRGaWVsZCA9IHRydWU7CisgICAgICAgICAgICAgICAgJHNjb3BlLmFkZGluZyA9ICJkeW5hbWljRmllbGQiOworCisgICAgICAgICAgICAgICAgJHNjb3BlLm5ld0ZpZWxkID0geworICAgICAgICAgICAgICAgICAgICBzdG9yZWQ6ICJ0cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhlZDogInRydWUiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlbGV0ZSAkc2NvcGUuYWRkRXJyb3JzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgJHNjb3BlLmFkZER5bmFtaWNGaWVsZCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgZGVsZXRlICRzY29wZS5hZGRFcnJvcnM7CisgICAgICAgICAgICB2YXIgZGF0YSA9IHsiYWRkLWR5bmFtaWMtZmllbGQiOiAkc2NvcGUubmV3RmllbGR9OworICAgICAgICAgICAgU2NoZW1hLnBvc3Qoe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlfSwgZGF0YSwgZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9ycykgeworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWRkRXJyb3JzID0gZGF0YS5lcnJvcnNbMF0uZXJyb3JNZXNzYWdlczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkc2NvcGUuYWRkRXJyb3JzID09PSAic3RyaW5nIikgeworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFkZEVycm9ycyA9IFskc2NvcGUuYWRkRXJyb3JzXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5hZGRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dBZGRGaWVsZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUucmVmcmVzaCgpOworICAgICAgICAgICAgICAgICAgICB9LCAxNTAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgICRzY29wZS50b2dnbGVBZGRDb3B5RmllbGQgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGlmICgkc2NvcGUuc2hvd0FkZENvcHlGaWVsZCkgeworICAgICAgICAgICAgICAgICRzY29wZS5oaWRlQWxsKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRzY29wZS5oaWRlQWxsKCk7CisgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dBZGRDb3B5RmllbGQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgJHNjb3BlLmNvcHlGaWVsZCA9IHt9OworICAgICAgICAgICAgICAgIGRlbGV0ZSAkc2NvcGUuYWRkQ29weUZpZWxkRXJyb3JzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICRzY29wZS5hZGRDb3B5RmllbGQgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGRlbGV0ZSAkc2NvcGUuYWRkQ29weUZpZWxkRXJyb3JzOworICAgICAgICAgICAgdmFyIGRhdGEgPSB7ImFkZC1jb3B5LWZpZWxkIjogJHNjb3BlLmNvcHlGaWVsZH07CisgICAgICAgICAgICBTY2hlbWEucG9zdCh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCBkYXRhLCBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JzKSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5hZGRDb3B5RmllbGRFcnJvcnMgPSBkYXRhLmVycm9yc1swXS5lcnJvck1lc3NhZ2VzOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mICRzY29wZS5hZGRDb3B5RmllbGRFcnJvcnMgPT09ICJzdHJpbmciKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWRkQ29weUZpZWxkRXJyb3JzID0gWyRzY29wZS5hZGRDb3B5RmllbGRFcnJvcnNdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dBZGRDb3B5RmllbGQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoJHNjb3BlLnJlZnJlc2gsIDE1MDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgJHNjb3BlLnRvZ2dsZURlbGV0ZSA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgaWYgKCRzY29wZS5zaG93RGVsZXRlKSB7CisgICAgICAgICAgICAgICAgJHNjb3BlLnNob3dEZWxldGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5pcy5maWVsZCkgeworICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZGVsZXRlRGF0YSA9IHsnZGVsZXRlLWZpZWxkJzoge25hbWU6ICRzY29wZS5uYW1lfX07CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUuaXMuZHluYW1pY0ZpZWxkKSB7CisgICAgICAgICAgICAgICAgICAgICRzY29wZS5kZWxldGVEYXRhID0geydkZWxldGUtZHluYW1pYy1maWVsZCc6IHtuYW1lOiAkc2NvcGUubmFtZX19OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFsZXJ0KCJUWVBFIE5PVCBLTk9XTiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkc2NvcGUuc2hvd0RlbGV0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAkc2NvcGUuZGVsZXRlID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBTY2hlbWEucG9zdCh7Y29yZTogJHJvdXRlUGFyYW1zLmNvcmV9LCAkc2NvcGUuZGVsZXRlRGF0YSwgZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JzKSB7CisgICAgICAgICAgICAgICAgICAgJHNjb3BlLmRlbGV0ZUVycm9ycyA9IGRhdGEuZXJyb3JzWzBdLmVycm9yTWVzc2FnZXM7CisgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkc2NvcGUuZGVsZXRlRXJyb3JzID09PSAic3RyaW5nIikgeworICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZGVsZXRlRXJyb3JzID0gWyRzY29wZS5kZWxldGVFcnJvcnNdOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgJHNjb3BlLmRlbGV0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKCIiKTsKKyAgICAgICAgICAgICAgICAgICAgIH0sIDE1MDAKKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgJHNjb3BlLnRvZ2dsZURlbGV0ZUNvcHlGaWVsZCA9IGZ1bmN0aW9uKGZpZWxkKSB7CisgICAgICAgICAgICBmaWVsZC5zaG93ID0gIWZpZWxkLnNob3c7CisgICAgICAgICAgICBkZWxldGUgZmllbGQuZXJyb3JzOworICAgICAgICB9CisgICAgICAgICRzY29wZS5kZWxldGVDb3B5RmllbGQgPSBmdW5jdGlvbihmaWVsZCwgc291cmNlLCBkZXN0KSB7CisgICAgICAgICAgICBkYXRhID0geydkZWxldGUtY29weS1maWVsZCc6IHtzb3VyY2U6IHNvdXJjZSwgZGVzdDogZGVzdH19OworICAgICAgICAgICAgU2NoZW1hLnBvc3Qoe2NvcmU6ICRyb3V0ZVBhcmFtcy5jb3JlfSwgZGF0YSwgZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JzKSB7CisgICAgICAgICAgICAgICAgICAgZmllbGQuZXJyb3JzID0gZGF0YS5lcnJvcnNbMF0uZXJyb3JNZXNzYWdlczsKKyAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mICRzY29wZS5kZWxldGVFcnJvcnMgPT09ICJzdHJpbmciKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmVycm9ycyA9IFtmaWVsZC5lcnJvcnNdOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgZmllbGQuZGVsZXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQoJHNjb3BlLnJlZnJlc2gsIDE1MDApOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CispOworCit2YXIgZ2V0RmllbGRzQW5kVHlwZXMgPSBmdW5jdGlvbihkYXRhKSB7CisgICAgdmFyIGZpZWxkc0FuZFR5cGVzID0gW107CisgICAgdmFyIGZpZWxkcyA9IE9iamVjdC5rZXlzKGRhdGEuZmllbGRzKS5zb3J0KCk7CisgICAgZm9yICh2YXIgaSBpbiBmaWVsZHMpIHsKKyAgICAgICAgZmllbGRzQW5kVHlwZXMucHVzaCh7CisgICAgICAgICAgICBncm91cDogIkZpZWxkcyIsCisgICAgICAgICAgICB2YWx1ZTogImZpZWxkPSIgKyBmaWVsZHNbaV0sCisgICAgICAgICAgICBsYWJlbDogZmllbGRzW2ldCisgICAgICAgIH0pOworICAgIH0KKyAgICB2YXIgZHluYW1pY19maWVsZHMgPSBPYmplY3Qua2V5cyhkYXRhLmR5bmFtaWNfZmllbGRzKS5zb3J0KCk7CisgICAgZm9yICh2YXIgaSBpbiBkeW5hbWljX2ZpZWxkcykgeworICAgICAgICBmaWVsZHNBbmRUeXBlcy5wdXNoKHsKKyAgICAgICAgICAgIGdyb3VwOiAiRHluYW1pYyBGaWVsZHMiLAorICAgICAgICAgICAgdmFsdWU6ICJkeW5hbWljLWZpZWxkPSIgKyBkeW5hbWljX2ZpZWxkc1tpXSwKKyAgICAgICAgICAgIGxhYmVsOiBkeW5hbWljX2ZpZWxkc1tpXQorICAgICAgICB9KTsKKyAgICB9CisgICAgdmFyIHR5cGVzID0gT2JqZWN0LmtleXMoZGF0YS50eXBlcykuc29ydCgpOworICAgIGZvciAodmFyIGkgaW4gdHlwZXMpIHsKKyAgICAgICAgZmllbGRzQW5kVHlwZXMucHVzaCh7CisgICAgICAgICAgICBncm91cDogIlR5cGVzIiwKKyAgICAgICAgICAgIHZhbHVlOiAidHlwZT0iICsgdHlwZXNbaV0sCisgICAgICAgICAgICBsYWJlbDogdHlwZXNbaV0KKyAgICAgICAgfSk7CisgICAgfQorICAgIHJldHVybiBmaWVsZHNBbmRUeXBlczsKK307CisKK3ZhciBmaWx0ZXJGaWVsZHMgPSBmdW5jdGlvbih0eXBlLCBkYXRhLCBuYW1lKSB7CisgICAgdmFyIGZpZWxkcyA9IFtdOworICAgIGZvciAodmFyIGkgaW4gZGF0YS50eXBlc1tuYW1lXS5maWVsZHMpIHsKKyAgICAgICAgdmFyIGZpZWxkID0gZGF0YS50eXBlc1tuYW1lXS5maWVsZHNbaV07CisgICAgICAgIGlmIChkYXRhW3R5cGVdW2ZpZWxkXSkgeworICAgICAgICAgICAgZmllbGRzLnB1c2goZmllbGQpCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZpZWxkcy5zb3J0KCk7Cit9CisKK3ZhciBtZXJnZUluZGV4QW5kU2NoZW1hRGF0YSA9IGZ1bmN0aW9uKGluZGV4LCBzY2hlbWEpIHsKKworICAgIHZhciBkYXRhID0geworICAgICAgICBkZWZhdWx0X3NlYXJjaF9maWVsZDogbnVsbCwKKyAgICAgICAgdW5pcXVlX2tleV9maWVsZDogbnVsbCwKKyAgICAgICAga2V5OiB7fSwKKyAgICAgICAgZmllbGRzOiB7fSwKKyAgICAgICAgZHluYW1pY19maWVsZHM6IHt9LAorICAgICAgICB0eXBlczoge30sCisgICAgICAgIHJlbGF0aW9uczogeworICAgICAgICAgICAgZl9kZjoge30sCisgICAgICAgICAgICBmX3Q6IHt9LAorICAgICAgICAgICAgZGZfZjoge30sCisgICAgICAgICAgICBkZl90OiB7fSwKKyAgICAgICAgICAgIHRfZjoge30sCisgICAgICAgICAgICB0X2RmOiB7fQorICAgICAgICB9CisgICAgfTsKKworICAgIGRhdGEuZmllbGRzID0gaW5kZXguZmllbGRzOworCisgICAgZGF0YS5rZXkgPSBpbmRleC5pbmZvLmtleTsKKworICAgIGRhdGEuZGVmYXVsdF9zZWFyY2hfZmllbGQgPSBzY2hlbWEuZGVmYXVsdFNlYXJjaEZpZWxkOworICAgIGRhdGEudW5pcXVlX2tleV9maWVsZCA9IHNjaGVtYS51bmlxdWVLZXlGaWVsZDsKKworICAgIGRhdGEuZHluYW1pY19maWVsZHMgPSBzY2hlbWEuZHluYW1pY0ZpZWxkczsKKyAgICBkYXRhLnR5cGVzID0gc2NoZW1hLnR5cGVzOworCisgICAgZm9yICh2YXIgZmllbGQgaW4gc2NoZW1hLmZpZWxkcykgeworICAgICAgICBkYXRhLmZpZWxkc1tmaWVsZF0gPQorICAgICAgICAgICAgJC5leHRlbmQoe30sIGRhdGEuZmllbGRzW2ZpZWxkXSwgc2NoZW1hLmZpZWxkc1tmaWVsZF0pOworICAgIH0KKworICAgIGZvciAodmFyIGZpZWxkIGluIGRhdGEuZmllbGRzKSB7CisgICAgICAgIHZhciBjb3B5X2Rlc3RzID0gZGF0YS5maWVsZHNbZmllbGRdLmNvcHlEZXN0czsKKyAgICAgICAgZm9yICh2YXIgaSBpbiBjb3B5X2Rlc3RzKSB7CisgICAgICAgICAgICB2YXIgY29weV9kZXN0ID0gY29weV9kZXN0c1tpXTsKKyAgICAgICAgICAgIGlmICghZGF0YS5maWVsZHNbY29weV9kZXN0XSkgeworICAgICAgICAgICAgICAgIGRhdGEuZmllbGRzW2NvcHlfZGVzdF0gPSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnRpYWw6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIGNvcHlTb3VyY2VzOiBbXQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkYXRhLmZpZWxkc1tjb3B5X2Rlc3RdLnBhcnRpYWwpIHsKKyAgICAgICAgICAgICAgICBkYXRhLmZpZWxkc1tjb3B5X2Rlc3RdLmNvcHlTb3VyY2VzLnB1c2goZmllbGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFyIGNvcHlfc291cmNlcyA9IGRhdGEuZmllbGRzW2ZpZWxkXS5jb3B5U291cmNlczsKKyAgICAgICAgZm9yICh2YXIgaSBpbiBjb3B5X3NvdXJjZXMpIHsKKyAgICAgICAgICAgIHZhciBjb3B5X3NvdXJjZSA9IGNvcHlfc291cmNlc1tpXTsKKyAgICAgICAgICAgIGlmICghZGF0YS5maWVsZHNbY29weV9zb3VyY2VdKSB7CisgICAgICAgICAgICAgICAgZGF0YS5maWVsZHNbY29weV9zb3VyY2VdID0geworICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBjb3B5RGVzdHM6IFtdCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRhdGEuZmllbGRzW2NvcHlfc291cmNlXS5wYXJ0aWFsKSB7CisgICAgICAgICAgICAgICAgZGF0YS5maWVsZHNbY29weV9zb3VyY2VdLmNvcHlEZXN0cy5wdXNoKGZpZWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRhdGEucmVsYXRpb25zLmZfdFtmaWVsZF0gPSBkYXRhLmZpZWxkc1tmaWVsZF0udHlwZTsKKworICAgICAgICBpZiAoIWRhdGEucmVsYXRpb25zLnRfZltkYXRhLmZpZWxkc1tmaWVsZF0udHlwZV0pIHsKKyAgICAgICAgICAgIGRhdGEucmVsYXRpb25zLnRfZltkYXRhLmZpZWxkc1tmaWVsZF0udHlwZV0gPSBbXTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLnJlbGF0aW9ucy50X2ZbZGF0YS5maWVsZHNbZmllbGRdLnR5cGVdLnB1c2goZmllbGQpOworCisgICAgICAgIGlmIChkYXRhLmZpZWxkc1tmaWVsZF0uZHluYW1pY0Jhc2UpIHsKKyAgICAgICAgICAgIGRhdGEucmVsYXRpb25zLmZfZGZbZmllbGRdID0gZGF0YS5maWVsZHNbZmllbGRdLmR5bmFtaWNCYXNlOworCisgICAgICAgICAgICBpZiAoIWRhdGEucmVsYXRpb25zLmRmX2ZbZGF0YS5maWVsZHNbZmllbGRdLmR5bmFtaWNCYXNlXSkgeworICAgICAgICAgICAgICAgIGRhdGEucmVsYXRpb25zLmRmX2ZbZGF0YS5maWVsZHNbZmllbGRdLmR5bmFtaWNCYXNlXSA9IFtdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YS5yZWxhdGlvbnMuZGZfZltkYXRhLmZpZWxkc1tmaWVsZF0uZHluYW1pY0Jhc2VdLnB1c2goZmllbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh2YXIgZHluYW1pY19maWVsZCBpbiBkYXRhLmR5bmFtaWNfZmllbGRzKSB7CisgICAgICAgIGRhdGEucmVsYXRpb25zLmRmX3RbZHluYW1pY19maWVsZF0gPSBkYXRhLmR5bmFtaWNfZmllbGRzW2R5bmFtaWNfZmllbGRdLnR5cGU7CisKKyAgICAgICAgaWYgKCFkYXRhLnJlbGF0aW9ucy50X2RmW2RhdGEuZHluYW1pY19maWVsZHNbZHluYW1pY19maWVsZF0udHlwZV0pIHsKKyAgICAgICAgICAgIGRhdGEucmVsYXRpb25zLnRfZGZbZGF0YS5keW5hbWljX2ZpZWxkc1tkeW5hbWljX2ZpZWxkXS50eXBlXSA9IFtdOworICAgICAgICB9CisgICAgICAgIGRhdGEucmVsYXRpb25zLnRfZGZbZGF0YS5keW5hbWljX2ZpZWxkc1tkeW5hbWljX2ZpZWxkXS50eXBlXS5wdXNoKGR5bmFtaWNfZmllbGQpOworICAgIH0KKyAgICByZXR1cm4gZGF0YTsKK307CisKK3ZhciBnZXRGaWVsZFByb3BlcnRpZXMgPSBmdW5jdGlvbihkYXRhLCBjb3JlLCBpcywgZmllbGQpIHsKKworICAgIHZhciBkaXNwbGF5ID0ge307CisKKyAgICBkaXNwbGF5LnBhcnRpYWxTdGF0ZSA9IGlzLmZpZWxkICYmICEhZGF0YS5maWVsZHNbZmllbGRdLnBhcnRpYWw7CisKKyAgICBkaXNwbGF5LmNvbHVtbnMgPSBbXTsKKyAgICBkaXNwbGF5LnJvd3MgPSBbXTsKKyAgICB2YXIgYWxsRmxhZ3MgPSAiIjsKKworICAgIHZhciBhZGRSb3cgPSBmdW5jdGlvbihuYW1lLCBmbGFncykgeworICAgICAgICBpZiAoZmxhZ3NbMF0hPScoJykgeworICAgICAgICAgICAgZGlzcGxheS5yb3dzLnB1c2goe25hbWU6bmFtZSwgZmxhZ3M6ZmxhZ3N9KTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3NbaV0hPSItIiAmJiBhbGxGbGFncy5pbmRleE9mKGZsYWdzW2ldKTwwKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbEZsYWdzKz1mbGFnc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaXNwbGF5LnJvd3MucHVzaCh7bmFtZTpuYW1lLCBjb21tZW50OmZsYWdzfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZGVudGlmeSB0aGUgcm93cyBmb3Igb3VyIGZpZWxkIHByb3BlcnR5IHRhYmxlCisgICAgaWYgKGlzLmZpZWxkICYmIGRhdGEuZmllbGRzW2ZpZWxkXSkgeworICAgICAgICBpZiAoZGF0YS5maWVsZHNbZmllbGRdLmZsYWdzKSB7CisgICAgICAgICAgICBhZGRSb3coJ1Byb3BlcnRpZXMnLCBkYXRhLmZpZWxkc1tmaWVsZF0uZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIGlmIChkYXRhLmZpZWxkc1tmaWVsZF0uc2NoZW1hKSB7CisgICAgICAgICAgICBhZGRSb3coJ1NjaGVtYScsIGRhdGEuZmllbGRzW2ZpZWxkXS5zY2hlbWEpOworICAgICAgICB9CisgICAgICAgIGlmIChkYXRhLmZpZWxkc1tmaWVsZF0uaW5kZXgpIHsKKyAgICAgICAgICAgIGFkZFJvdygnSW5kZXgnLCBkYXRhLmZpZWxkc1tmaWVsZF0uaW5kZXgpOworICAgICAgICB9CisgICAgICAgIGRpc3BsYXkuZG9jcyA9IGRhdGEuZmllbGRzW2ZpZWxkXS5kb2NzOworICAgICAgICBkaXNwbGF5LmRvY3NVcmwgPSAiIy8iICsgY29yZSArICIvcXVlcnk/cT0iICsgZmllbGQgKyAiOlsqIFRPICpdIjsKKyAgICAgICAgZGlzcGxheS5kaXN0aW5jdCA9IGRhdGEuZmllbGRzW2ZpZWxkXS5kaXN0aW5jdDsKKyAgICAgICAgZGlzcGxheS5wb3NpdGlvbkluY3JlbWVudEdhcCA9IGRhdGEuZmllbGRzW2ZpZWxkXS5wb3NpdGlvbkluY3JlbWVudEdhcDsKKyAgICAgICAgZGlzcGxheS5zaW1pbGFyaXR5ID0gZGF0YS5maWVsZHNbZmllbGRdLnNpbWlsYXJpdHk7CisgICAgfSBlbHNlIGlmIChpcy5keW5hbWljRmllbGQgJiYgZGF0YS5keW5hbWljX2ZpZWxkc1tmaWVsZF0gJiYgZGF0YS5keW5hbWljX2ZpZWxkc1tmaWVsZF0uZmxhZ3MpIHsKKyAgICAgICAgYWRkUm93KCdQcm9wZXJ0aWVzJywgZGF0YS5keW5hbWljX2ZpZWxkc1tmaWVsZF0uZmxhZ3MpOworICAgIH0KKworICAgIC8vIGlkZW50aWZ5IGNvbHVtbnMgaW4gZmllbGQgcHJvcGVydHkgdGFibGU6CisgICAgZm9yICh2YXIga2V5IGluIGRhdGEua2V5KSB7CisgICAgICAgIGlmIChhbGxGbGFncy5pbmRleE9mKGtleSk+PTApIHsKKyAgICAgICAgICAgIGRpc3BsYXkuY29sdW1ucy5wdXNoKHtrZXk6IGtleSwgbmFtZTogZGF0YS5rZXlba2V5XX0pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaWRlbnRpZnkgcm93cyBhbmQgY2VsbCB2YWx1ZXMgaW4gZmllbGQgcHJvcGVydHkgdGFibGU6CisgICAgZm9yICh2YXIgaSBpbiBkaXNwbGF5LnJvd3MpIHsKKyAgICAgICAgdmFyIHJvdyA9IGRpc3BsYXkucm93c1tpXTsKKyAgICAgICAgcm93LmNlbGxzID0gW107CisKKyAgICAgICAgaWYgKCFyb3cuZmxhZ3MpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBNYXRjaCB0aGUgc3BlY2lhbCBjYXNlIGluIHRoZSBMdWtlUmVxdWVzdEhhbmRsZXIKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodmFyIGogaW4gZGlzcGxheS5jb2x1bW5zKSB7CisgICAgICAgICAgICB2YXIgZmxhZyA9IGRpc3BsYXkuY29sdW1uc1tqXS5rZXk7CisgICAgICAgICAgICByb3cuY2VsbHMucHVzaCh7a2V5OiBmbGFnLCB2YWx1ZTogcm93LmZsYWdzLmluZGV4T2YoZmxhZyk+PTB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkaXNwbGF5OworfTsKKwordmFyIGdldEFuYWx5c2lzSW5mbyA9IGZ1bmN0aW9uKGRhdGEsIGlzLCBuYW1lKSB7CisKKyAgICB2YXIgYW5hbHlzaXMgPSB7fTsKKworICAgIGlmIChpcy5maWVsZCkgeworICAgICAgICB2YXIgdHlwZSA9IGRhdGEucmVsYXRpb25zLmZfdFtuYW1lXTsKKyAgICAgICAgYW5hbHlzaXMucXVlcnkgPSAiYW5hbHlzaXMuZmllbGRuYW1lPSIgKyBuYW1lOworICAgIH0KKyAgICBlbHNlIGlmIChpcy5keW5hbWljRmllbGQpIHsKKyAgICAgICAgdmFyIHR5cGUgPSBkYXRhLnJlbGF0aW9ucy5kZl90W25hbWVdOworICAgICAgICBhbmFseXNpcy5xdWVyeSA9ICJhbmFseXNpcy5maWVsZHR5cGU9IiArIHR5cGU7CisgICAgfQorICAgIGVsc2UgaWYgKGlzLnR5cGUpIHsKKyAgICAgICAgdmFyIHR5cGUgPSBuYW1lOworICAgICAgICBhbmFseXNpcy5xdWVyeSA9ICJhbmFseXNpcy5maWVsZHR5cGU9IiArIG5hbWU7CisgICAgfQorCisgICAgdmFyIHByb2Nlc3NDb21wb25lbnRUeXBlID0gZnVuY3Rpb24gKGxhYmVsLCBrZXksIGNvbXBvbmVudFR5cGVEYXRhKSB7CisgICAgICAgIGlmIChjb21wb25lbnRUeXBlRGF0YSkgeworICAgICAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXTsKKyAgICAgICAgICAgIGZvciAodmFyIGNvbXBvbmVudE5hbWUgaW4gY29tcG9uZW50VHlwZURhdGEpIHsKKyAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50RGF0YSA9IGNvbXBvbmVudFR5cGVEYXRhW2NvbXBvbmVudE5hbWVdOworICAgICAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB7Y2xhc3NOYW1lOiBjb21wb25lbnREYXRhLmNsYXNzTmFtZSwgYXJnczpbXX07CisgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudERhdGEuYXJncykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhcmdOYW1lIGluIGNvbXBvbmVudERhdGEuYXJncykgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ1ZhbHVlID0gY29tcG9uZW50RGF0YS5hcmdzW2FyZ05hbWVdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ1ZhbHVlID09ICIxIiB8fCBhcmdWYWx1ZSA9PSAidHJ1ZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuYXJncy5wdXNoKHtuYW1lOiBhcmdOYW1lLCBib29sZWFuVmFsdWU6dHJ1ZX0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdWYWx1ZSA9PSAiMCIgfHwgYXJnVmFsdWUgPT0gImZhbHNlIikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5hcmdzLnB1c2goe25hbWU6IGFyZ05hbWUsIGJvb2xlYW5WYWx1ZTpmYWxzZX0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuYXJncy5wdXNoKHtuYW1lOiBhcmdOYW1lLCB2YWx1ZTphcmdWYWx1ZX0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHtsYWJlbDogbGFiZWwsIGtleToga2V5LCBjb21wb25lbnRzOiBjb21wb25lbnRzfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB7bGFiZWw6IGxhYmVsLCBrZXk6IGtleX07CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgYnVpbGRBbmFseXplciA9IGZ1bmN0aW9uIChhbmFseXplckRhdGEpIHsKKyAgICAgICAgdmFyIGFuYWx5emVyID0ge307CisgICAgICAgIGFuYWx5emVyLmNsYXNzTmFtZSA9IGFuYWx5emVyRGF0YS5jbGFzc05hbWU7CisgICAgICAgIGFuYWx5emVyLmNvbXBvbmVudFR5cGVzID0gW107CisgICAgICAgIGlmIChhbmFseXplckRhdGEudG9rZW5pemVyKSB7CisgICAgICAgICAgICBhbmFseXplci5jb21wb25lbnRUeXBlcy5wdXNoKHByb2Nlc3NDb21wb25lbnRUeXBlKCJDaGFyIEZpbHRlcnMiLCAiY2hhckZpbHRlcnMiLCBhbmFseXplckRhdGEuY2hhckZpbHRlcnMpKTsKKyAgICAgICAgICAgIGFuYWx5emVyLmNvbXBvbmVudFR5cGVzLnB1c2gocHJvY2Vzc0NvbXBvbmVudFR5cGUoIlRva2VuaXplciIsICJ0b2tlbml6ZXIiLCB7dG9rZW5pemVyOiBhbmFseXplckRhdGEudG9rZW5pemVyfSkpOworICAgICAgICAgICAgYW5hbHl6ZXIuY29tcG9uZW50VHlwZXMucHVzaChwcm9jZXNzQ29tcG9uZW50VHlwZSgiVG9rZW4gRmlsdGVycyIsICJ0b2tlbkZpbHRlcnMiLCBhbmFseXplckRhdGEuZmlsdGVycykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmFseXplcjsKKyAgICB9CisKKyAgICBhbmFseXNpcy5kYXRhID0gZGF0YS50eXBlc1t0eXBlXTsKKyAgICBpZiAoYW5hbHlzaXMuZGF0YSkgeworICAgICAgICBhbmFseXNpcy5hbmFseXplcnMgPSBbCisgICAgICAgICAgICB7a2V5OiAiaW5kZXgiLCBuYW1lOiAiSW5kZXgiLCBkZXRhaWw6IGJ1aWxkQW5hbHl6ZXIoYW5hbHlzaXMuZGF0YS5pbmRleEFuYWx5emVyKX0sCisgICAgICAgICAgICB7a2V5OiAicXVlcnkiLCBuYW1lOiAiUXVlcnkiLCBkZXRhaWw6IGJ1aWxkQW5hbHl6ZXIoYW5hbHlzaXMuZGF0YS5xdWVyeUFuYWx5emVyKX0KKyAgICAgICAgXTsKKyAgICB9CisgICAgcmV0dXJuIGFuYWx5c2lzOworfQorCit2YXIgZ2V0VGVybUluZm8gPSBmdW5jdGlvbihkYXRhKSB7CisKKyAgICB2YXIgdGVybUluZm8gPSB7fTsKKyAgICBpZiAoZGF0YSAmJiBkYXRhLnRvcFRlcm1zKSB7CisgICAgICAgIHRlcm1JbmZvLnRvcFRlcm1zID0gW107CisKKyAgICAgICAgdmFyIGN1cnJlbnRHcm91cCA9IHtjb3VudDogMH0KKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLnRvcFRlcm1zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICB2YXIgY291bnQgPSBkYXRhLnRvcFRlcm1zW2kgKyAxXTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50R3JvdXAuY291bnQgIT0gY291bnQpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXAgPSB7Y291bnQ6IGNvdW50LCB0ZXJtczogW119OworICAgICAgICAgICAgICAgIHRlcm1JbmZvLnRvcFRlcm1zLnB1c2goY3VycmVudEdyb3VwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnRHcm91cC50ZXJtcy5wdXNoKGRhdGEudG9wVGVybXNbaV0pOworICAgICAgICB9CisgICAgICAgIHRlcm1JbmZvLnRlcm1Db3VudCA9IGRhdGEudG9wVGVybXMubGVuZ3RoIC8gMjsKKyAgICAgICAgdGVybUluZm8ubWF4VGVybXMgPSBkYXRhLmRpc3RpbmN0OworICAgIH0KKworICAgIGlmKGRhdGEgJiYgZGF0YS5oaXN0b2dyYW0pIHsKKyAgICAgICAgdGVybUluZm8uaGlzdG9ncmFtID0gW107CisgICAgICAgIHRlcm1JbmZvLmhpc3RvZ3JhbU1heCA9IDA7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5oaXN0b2dyYW0ubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIHRlcm1JbmZvLmhpc3RvZ3JhbS5wdXNoKHtrZXk6IGRhdGEuaGlzdG9ncmFtW2ldLCB2YWx1ZTogZGF0YS5oaXN0b2dyYW1baSArIDFdfSk7CisgICAgICAgICAgICB0ZXJtSW5mby5oaXN0b2dyYW1NYXggPSBNYXRoLm1heCh0ZXJtSW5mby5oaXN0b2dyYW1NYXgsIGRhdGEuaGlzdG9ncmFtW2kgKyAxXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRlcm1JbmZvOworfTsKKwordmFyIHNvcnRlZE9iamVjdEFycmF5ID0gZnVuY3Rpb24obGlzdCkgeworICAgIHZhciBvYmphcnIgPSBbXTsKKyAgICBmb3IgKHZhciBpIGluIGxpc3QpIHsKKyAgICAgIG9iamFyci5wdXNoKHsibmFtZSI6IGxpc3RbaV19KTsKKyAgICB9CisgICAgcmV0dXJuIG9iamFycjsKK30KKworLyoKKyAgICAgICAgdmFyIGdldF93aWR0aCA9IGZ1bmN0aW9uIGdldF93aWR0aCgpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gJCggdGhpcyApLndpZHRoKCk7CisgICAgICAgIH0KKworICB2YXIgbWF4X3dpZHRoID0gMTAgKyBNYXRoLm1heC5hcHBseSggTWF0aCwgJCggJ3AnLCB0b3B0ZXJtc190YWJsZV9lbGVtZW50ICkubWFwKCBnZXRfd2lkdGggKS5nZXQoKSApOworICB0b3B0ZXJtczoKKyAgICBwIHsgd2lkdGg6IHt7bWF4V2lkdGh9fXB4ICFpbXBvcnRhbnQ7IH0KKyAgICB1bCB7IG1hcmdpbi1sZWZ0OiB7e21heF93aWR0aCArIDUgfX1weCAhaW1wb3J0YW50OyB9CisKKyAgdmFyIG1heF93aWR0aCA9IDEwICsgTWF0aC5tYXguYXBwbHkoIE1hdGgsICQoICdkdCcsIGhpc3RvZ3JhbV9ob2xkZXJfZWxlbWVudCApLm1hcCggZ2V0X3dpZHRoICkuZ2V0KCkgKTsKKyAgaGlzdG9ncmFtX2hvbGRlcjoKKyAgICB1bCB7IG1hcmdpbi1sZWZ0OiB7e21heFdpZHRofX1weCAhaW1wb3J0YW50OyB9CisgICAgbGkgZHQgeyBsZWZ0OiB7ey1tYXhXaWR0aH19cHggIWltcG9ydGFudDsgd2lkdGg6IHt7bWF4V2lkdGh9fXB4ICFpbXBvcnRhbnQ7IH0KKyovCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9zZWdtZW50cy5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL3NlZ21lbnRzLmpzCmluZGV4IGVkNDM2MjUuLjRjMDA4MGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL3NlZ21lbnRzLmpzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL3NlZ21lbnRzLmpzCkBAIC0xLDk5ICsxLDk5IEBACi0vKg0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotDQotdmFyIE1CX0ZBQ1RPUiA9IDEwMjQqMTAyNDsNCi0NCi1zb2xyQWRtaW5BcHAuY29udHJvbGxlcignU2VnbWVudHNDb250cm9sbGVyJywgZnVuY3Rpb24oJHNjb3BlLCAkcm91dGVQYXJhbXMsICRpbnRlcnZhbCwgU2VnbWVudHMsIENvbnN0YW50cykgew0KLSAgICAkc2NvcGUucmVzZXRNZW51KCJzZWdtZW50cyIsIENvbnN0YW50cy5JU19DT1JFX1BBR0UpOw0KLQ0KLSAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkgew0KLQ0KLSAgICAgICAgU2VnbWVudHMuZ2V0KHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZX0sIGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICAgICB2YXIgc2VnbWVudHMgPSBkYXRhLnNlZ21lbnRzOw0KLQ0KLSAgICAgICAgICAgIHZhciBzZWdtZW50U2l6ZUluQnl0ZXNNYXggPSBnZXRMYXJnZXN0U2VnbWVudFNpemUoc2VnbWVudHMpOw0KLSAgICAgICAgICAgICRzY29wZS5zZWdtZW50TUIgPSBNYXRoLmZsb29yKHNlZ21lbnRTaXplSW5CeXRlc01heCAvIE1CX0ZBQ1RPUik7DQotICAgICAgICAgICAgJHNjb3BlLnhheGlzID0gY2FsY3VsYXRlWEF4aXMoc2VnbWVudFNpemVJbkJ5dGVzTWF4KTsNCi0NCi0gICAgICAgICAgICAkc2NvcGUuZG9jdW1lbnRDb3VudCA9IDA7DQotICAgICAgICAgICAgJHNjb3BlLmRlbGV0aW9uQ291bnQgPSAwOw0KLQ0KLSAgICAgICAgICAgICRzY29wZS5zZWdtZW50cyA9IFtdOw0KLSAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gc2VnbWVudHMpIHsNCi0gICAgICAgICAgICAgICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1tuYW1lXTsNCi0NCi0gICAgICAgICAgICAgICAgdmFyIHNlZ21lbnRTaXplSW5CeXRlc0xvZyA9IE1hdGgubG9nKHNlZ21lbnQuc2l6ZUluQnl0ZXMpOw0KLSAgICAgICAgICAgICAgICB2YXIgc2VnbWVudFNpemVJbkJ5dGVzTWF4TG9nID0gTWF0aC5sb2coc2VnbWVudFNpemVJbkJ5dGVzTWF4KTsNCi0NCi0gICAgICAgICAgICAgICAgc2VnbWVudC50b3RhbFNpemUgPSBNYXRoLmZsb29yKChzZWdtZW50U2l6ZUluQnl0ZXNMb2cgLyBzZWdtZW50U2l6ZUluQnl0ZXNNYXhMb2cgKSAqIDEwMCk7DQotDQotICAgICAgICAgICAgICAgIHNlZ21lbnQuZGVsZXRlZERvY1NpemUgPSBNYXRoLmZsb29yKChzZWdtZW50LmRlbENvdW50IC8gKHNlZ21lbnQuZGVsQ291bnQgKyBzZWdtZW50LnRvdGFsU2l6ZSkpICogc2VnbWVudC50b3RhbFNpemUpOw0KLSAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5kZWxEb2NTaXplIDw9IDAuMDAxKSBkZWxldGUgc2VnbWVudC5kZWxldGVkRG9jU2l6ZTsNCi0NCi0gICAgICAgICAgICAgICAgc2VnbWVudC5hbGl2ZURvY1NpemUgPSBzZWdtZW50LnRvdGFsU2l6ZSAtIHNlZ21lbnQuZGVsZXRlZERvY1NpemU7DQotDQotICAgICAgICAgICAgICAgICRzY29wZS5zZWdtZW50cy5wdXNoKHNlZ21lbnQpOw0KLQ0KLSAgICAgICAgICAgICAgICAkc2NvcGUuZG9jdW1lbnRDb3VudCArPSBzZWdtZW50LnNpemU7DQotICAgICAgICAgICAgICAgICRzY29wZS5kZWxldGlvbkNvdW50ICs9IHNlZ21lbnQuZGVsQ291bnQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICRzY29wZS5kZWxldGlvbnNQZXJjZW50YWdlID0gY2FsY3VsYXRlRGVsZXRpb25zUGVyY2VudGFnZSgkc2NvcGUuZG9jdW1lbnRDb3VudCwgJHNjb3BlLmRlbGV0aW9uQ291bnQpOw0KLSAgICAgICAgfSk7DQotICAgIH07DQotDQotICAgICRzY29wZS50b2dnbGVBdXRvUmVmcmVzaCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgJHNjb3BlLmF1dG9yZWZyZXNoID0gISRzY29wZS5hdXRvcmVmcmVzaDsNCi0gICAgICAgIGlmICgkc2NvcGUuYXV0b3JlZnJlc2gpIHsNCi0gICAgICAgICAgICAkc2NvcGUuaW50ZXJ2YWwgPSAkaW50ZXJ2YWwoJHNjb3BlLnJlZnJlc2gsIDEwMDApOw0KLSAgICAgICAgICAgIHZhciBvblJvdXRlQ2hhbmdlT2ZmID0gJHNjb3BlLiRvbignJHJvdXRlQ2hhbmdlU3RhcnQnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwoJHNjb3BlLmludGVydmFsKTsNCi0gICAgICAgICAgICAgIG9uUm91dGVDaGFuZ2VPZmYoKTsNCi0gICAgICAgICAgICB9KTsNCi0NCi0gICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLmludGVydmFsKSB7DQotICAgICAgICAgICAgJGludGVydmFsLmNhbmNlbCgkc2NvcGUuaW50ZXJ2YWwpOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLSAgICAkc2NvcGUucmVmcmVzaCgpOw0KLX0pOw0KLQ0KLXZhciBjYWxjdWxhdGVYQXhpcyA9IGZ1bmN0aW9uKHNlZ21lbnRJbkJ5dGVzTWF4KSB7DQotICAgIHZhciBzdGVwcyA9IFtdOw0KLSAgICB2YXIgbG9nID0gTWF0aC5sb2coc2VnbWVudEluQnl0ZXNNYXgpOw0KLQ0KLSAgICBmb3IgKHZhciBqPTAsIHN0ZXA9bG9nLzQ7IGo8MzsgaisrLCBzdGVwKz1sb2cvNCkgew0KLSAgICAgICAgc3RlcHMucHVzaCh7cG9zOmosIHZhbHVlOk1hdGguZmxvb3IoKE1hdGgucG93KE1hdGguRSwgc3RlcCkpL01CX0ZBQ1RPUil9KQ0KLSAgICB9DQotICAgIHJldHVybiBzdGVwczsNCi19Ow0KLQ0KLXZhciBnZXRMYXJnZXN0U2VnbWVudFNpemUgPSBmdW5jdGlvbihzZWdtZW50cykgew0KLSAgICB2YXIgbWF4ID0gMDsNCi0gICAgZm9yICh2YXIgbmFtZSBpbiBzZWdtZW50cykgew0KLSAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBzZWdtZW50c1tuYW1lXS5zaXplSW5CeXRlcyk7DQotICAgIH0NCi0gICAgcmV0dXJuIG1heDsNCi19Ow0KLQ0KLXZhciBjYWxjdWxhdGVEZWxldGlvbnNQZXJjZW50YWdlID0gZnVuY3Rpb24oZG9jQ291bnQsIGRlbENvdW50KSB7DQotICAgIGlmIChkb2NDb3VudCA9PSAwKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICAgIHZhciBwZXJjZW50ID0gZGVsQ291bnQgLyBkb2NDb3VudCAqIDEwMDsNCi0gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHBlcmNlbnQgKiAxMDApIC8gMTAwOw0KLSAgICB9DQotfTsNCisvKgorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3ZhciBNQl9GQUNUT1IgPSAxMDI0KjEwMjQ7CisKK3NvbHJBZG1pbkFwcC5jb250cm9sbGVyKCdTZWdtZW50c0NvbnRyb2xsZXInLCBmdW5jdGlvbigkc2NvcGUsICRyb3V0ZVBhcmFtcywgJGludGVydmFsLCBTZWdtZW50cywgQ29uc3RhbnRzKSB7CisgICAgJHNjb3BlLnJlc2V0TWVudSgic2VnbWVudHMiLCBDb25zdGFudHMuSVNfQ09SRV9QQUdFKTsKKworICAgICRzY29wZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7CisKKyAgICAgICAgU2VnbWVudHMuZ2V0KHtjb3JlOiAkcm91dGVQYXJhbXMuY29yZX0sIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICAgIHZhciBzZWdtZW50cyA9IGRhdGEuc2VnbWVudHM7CisKKyAgICAgICAgICAgIHZhciBzZWdtZW50U2l6ZUluQnl0ZXNNYXggPSBnZXRMYXJnZXN0U2VnbWVudFNpemUoc2VnbWVudHMpOworICAgICAgICAgICAgJHNjb3BlLnNlZ21lbnRNQiA9IE1hdGguZmxvb3Ioc2VnbWVudFNpemVJbkJ5dGVzTWF4IC8gTUJfRkFDVE9SKTsKKyAgICAgICAgICAgICRzY29wZS54YXhpcyA9IGNhbGN1bGF0ZVhBeGlzKHNlZ21lbnRTaXplSW5CeXRlc01heCk7CisKKyAgICAgICAgICAgICRzY29wZS5kb2N1bWVudENvdW50ID0gMDsKKyAgICAgICAgICAgICRzY29wZS5kZWxldGlvbkNvdW50ID0gMDsKKworICAgICAgICAgICAgJHNjb3BlLnNlZ21lbnRzID0gW107CisgICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHNlZ21lbnRzKSB7CisgICAgICAgICAgICAgICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1tuYW1lXTsKKworICAgICAgICAgICAgICAgIHZhciBzZWdtZW50U2l6ZUluQnl0ZXNMb2cgPSBNYXRoLmxvZyhzZWdtZW50LnNpemVJbkJ5dGVzKTsKKyAgICAgICAgICAgICAgICB2YXIgc2VnbWVudFNpemVJbkJ5dGVzTWF4TG9nID0gTWF0aC5sb2coc2VnbWVudFNpemVJbkJ5dGVzTWF4KTsKKworICAgICAgICAgICAgICAgIHNlZ21lbnQudG90YWxTaXplID0gTWF0aC5mbG9vcigoc2VnbWVudFNpemVJbkJ5dGVzTG9nIC8gc2VnbWVudFNpemVJbkJ5dGVzTWF4TG9nICkgKiAxMDApOworCisgICAgICAgICAgICAgICAgc2VnbWVudC5kZWxldGVkRG9jU2l6ZSA9IE1hdGguZmxvb3IoKHNlZ21lbnQuZGVsQ291bnQgLyAoc2VnbWVudC5kZWxDb3VudCArIHNlZ21lbnQudG90YWxTaXplKSkgKiBzZWdtZW50LnRvdGFsU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuZGVsRG9jU2l6ZSA8PSAwLjAwMSkgZGVsZXRlIHNlZ21lbnQuZGVsZXRlZERvY1NpemU7CisKKyAgICAgICAgICAgICAgICBzZWdtZW50LmFsaXZlRG9jU2l6ZSA9IHNlZ21lbnQudG90YWxTaXplIC0gc2VnbWVudC5kZWxldGVkRG9jU2l6ZTsKKworICAgICAgICAgICAgICAgICRzY29wZS5zZWdtZW50cy5wdXNoKHNlZ21lbnQpOworCisgICAgICAgICAgICAgICAgJHNjb3BlLmRvY3VtZW50Q291bnQgKz0gc2VnbWVudC5zaXplOworICAgICAgICAgICAgICAgICRzY29wZS5kZWxldGlvbkNvdW50ICs9IHNlZ21lbnQuZGVsQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2NvcGUuZGVsZXRpb25zUGVyY2VudGFnZSA9IGNhbGN1bGF0ZURlbGV0aW9uc1BlcmNlbnRhZ2UoJHNjb3BlLmRvY3VtZW50Q291bnQsICRzY29wZS5kZWxldGlvbkNvdW50KTsKKyAgICAgICAgfSk7CisgICAgfTsKKworICAgICRzY29wZS50b2dnbGVBdXRvUmVmcmVzaCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAkc2NvcGUuYXV0b3JlZnJlc2ggPSAhJHNjb3BlLmF1dG9yZWZyZXNoOworICAgICAgICBpZiAoJHNjb3BlLmF1dG9yZWZyZXNoKSB7CisgICAgICAgICAgICAkc2NvcGUuaW50ZXJ2YWwgPSAkaW50ZXJ2YWwoJHNjb3BlLnJlZnJlc2gsIDEwMDApOworICAgICAgICAgICAgdmFyIG9uUm91dGVDaGFuZ2VPZmYgPSAkc2NvcGUuJG9uKCckcm91dGVDaGFuZ2VTdGFydCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAkaW50ZXJ2YWwuY2FuY2VsKCRzY29wZS5pbnRlcnZhbCk7CisgICAgICAgICAgICAgIG9uUm91dGVDaGFuZ2VPZmYoKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLmludGVydmFsKSB7CisgICAgICAgICAgICAkaW50ZXJ2YWwuY2FuY2VsKCRzY29wZS5pbnRlcnZhbCk7CisgICAgICAgIH0KKyAgICB9OworICAgICRzY29wZS5yZWZyZXNoKCk7Cit9KTsKKwordmFyIGNhbGN1bGF0ZVhBeGlzID0gZnVuY3Rpb24oc2VnbWVudEluQnl0ZXNNYXgpIHsKKyAgICB2YXIgc3RlcHMgPSBbXTsKKyAgICB2YXIgbG9nID0gTWF0aC5sb2coc2VnbWVudEluQnl0ZXNNYXgpOworCisgICAgZm9yICh2YXIgaj0wLCBzdGVwPWxvZy80OyBqPDM7IGorKywgc3RlcCs9bG9nLzQpIHsKKyAgICAgICAgc3RlcHMucHVzaCh7cG9zOmosIHZhbHVlOk1hdGguZmxvb3IoKE1hdGgucG93KE1hdGguRSwgc3RlcCkpL01CX0ZBQ1RPUil9KQorICAgIH0KKyAgICByZXR1cm4gc3RlcHM7Cit9OworCit2YXIgZ2V0TGFyZ2VzdFNlZ21lbnRTaXplID0gZnVuY3Rpb24oc2VnbWVudHMpIHsKKyAgICB2YXIgbWF4ID0gMDsKKyAgICBmb3IgKHZhciBuYW1lIGluIHNlZ21lbnRzKSB7CisgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgc2VnbWVudHNbbmFtZV0uc2l6ZUluQnl0ZXMpOworICAgIH0KKyAgICByZXR1cm4gbWF4OworfTsKKwordmFyIGNhbGN1bGF0ZURlbGV0aW9uc1BlcmNlbnRhZ2UgPSBmdW5jdGlvbihkb2NDb3VudCwgZGVsQ291bnQpIHsKKyAgICBpZiAoZG9jQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICB2YXIgcGVyY2VudCA9IGRlbENvdW50IC8gZG9jQ291bnQgKiAxMDA7CisgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHBlcmNlbnQgKiAxMDApIC8gMTAwOworICAgIH0KK307CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9zdHJlYW0uanMgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy9zdHJlYW0uanMKaW5kZXggNjZiMmZjNC4uN2MzYmNjZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvc3RyZWFtLmpzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL3N0cmVhbS5qcwpAQCAtMSwyNDAgKzEsMjQwIEBACi0vKg0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXNvbHJBZG1pbkFwcC5jb250cm9sbGVyKCdTdHJlYW1Db250cm9sbGVyJywNCi0gIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24sIFF1ZXJ5LCBDb25zdGFudHMpIHsNCi0NCi0gICAgJHNjb3BlLnJlc2V0TWVudSgic3RyZWFtIiwgQ29uc3RhbnRzLklTX0NPTExFQ1RJT05fUEFHRSk7DQotDQotICAgICRzY29wZS5zdHJlYW0gPSB7DQotICAgICAgd3Q6ICdqc29uJywNCi0gICAgICBleHByOiAkc2NvcGUuZXhwciwNCi0gICAgICBpbmRlbnQ6ICdvbicNCi0gICAgfTsNCi0gICAgJHNjb3BlLnF0ID0gInN0cmVhbSI7DQotICAgICRzY29wZS5kb0V4cGxhbmF0aW9uID0gZmFsc2UNCi0NCi0gICAgJHNjb3BlLmRvU3RyZWFtID0gZnVuY3Rpb24oKSB7DQotDQotICAgICAgdmFyIHBhcmFtcyA9IHt9Ow0KLSAgICAgIHBhcmFtcy5jb3JlID0gJHJvdXRlUGFyYW1zLmNvcmU7DQotICAgICAgcGFyYW1zLmhhbmRsZXIgPSAkc2NvcGUucXQ7DQotICAgICAgcGFyYW1zLmV4cHIgPSBbJHNjb3BlLmV4cHJdDQotICAgICAgaWYoJHNjb3BlLmRvRXhwbGFuYXRpb24pew0KLSAgICAgICAgcGFyYW1zLmV4cGxhaW4gPSBbJHNjb3BlLmRvRXhwbGFuYXRpb25dDQotICAgICAgfQ0KLQ0KLSAgICAgICRzY29wZS5sYW5nID0gImpzb24iOw0KLSAgICAgICRzY29wZS5yZXNwb25zZSA9IG51bGw7DQotICAgICAgJHNjb3BlLnVybCA9ICIiOw0KLQ0KLSAgICAgIHZhciB1cmwgPSBRdWVyeS51cmwocGFyYW1zKTsNCi0NCi0gICAgICBRdWVyeS5xdWVyeShwYXJhbXMsIGZ1bmN0aW9uKGRhdGEpIHsNCi0NCi0gICAgICAgIHZhciBqc29uRGF0YSA9IEpTT04ucGFyc2UoZGF0YS50b0pTT04oKS5kYXRhKTsNCi0gICAgICAgIGlmICh1bmRlZmluZWQgIT0ganNvbkRhdGFbImV4cGxhbmF0aW9uIl0pIHsNCi0gICAgICAgICAgJHNjb3BlLnNob3dFeHBsYW5hdGlvbiA9IHRydWU7DQotDQotICAgICAgICAgIHN0cmVhbUdyYXBoU3ViQ29udHJvbGxlcigkc2NvcGUsIGpzb25EYXRhWyJleHBsYW5hdGlvbiJdKQ0KLSAgICAgICAgICBkZWxldGUganNvbkRhdGFbImV4cGxhbmF0aW9uIl0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICRzY29wZS5zaG93RXhwbGFuYXRpb24gPSBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRhdGEuZGF0YSA9IEpTT04uc3RyaW5naWZ5KGpzb25EYXRhLG51bGwsMik7DQotDQotICAgICAgICAkc2NvcGUubGFuZyA9ICJqc29uIjsNCi0gICAgICAgICRzY29wZS5yZXNwb25zZSA9IGRhdGE7DQotICAgICAgICAkc2NvcGUudXJsID0gJGxvY2F0aW9uLnByb3RvY29sKCkgKyAiOi8vIiArDQotICAgICAgICAgICRsb2NhdGlvbi5ob3N0KCkgKyAiOiIgKw0KLSAgICAgICAgICAkbG9jYXRpb24ucG9ydCgpICsgdXJsOw0KLQ0KLSAgICAgIH0pOw0KLSAgICB9Ow0KLQ0KLSAgICBpZiAoJGxvY2F0aW9uLnNlYXJjaCgpLmV4cHIpIHsNCi0gICAgICAkc2NvcGUuZXhwciA9ICRsb2NhdGlvbi5zZWFyY2goKVsiZXhwciJdOw0KLSAgICAgICRzY29wZS5kb1N0cmVhbSgpOw0KLSAgICB9DQotDQotICB9DQotKTsNCi0NCi12YXIgc3RyZWFtR3JhcGhTdWJDb250cm9sbGVyID0gZnVuY3Rpb24oJHNjb3BlLCBleHBsYW5hdGlvbikgew0KLSAgJHNjb3BlLnNob3dHcmFwaCA9IHRydWU7DQotICAkc2NvcGUucG9zID0gMDsNCi0gICRzY29wZS5yb3dzID0gODsNCi0NCi0gICRzY29wZS5yZXNldEdyYXBoID0gZnVuY3Rpb24oKSB7DQotICAgICRzY29wZS5wb3MgPSAwOw0KLSAgICAkc2NvcGUuaW5pdEdyYXBoKCk7DQotICB9DQotDQotICAkc2NvcGUuaW5pdEdyYXBoID0gZnVuY3Rpb24oZXhwbGFuYXRpb24pIHsNCi0NCi0gICAgZGF0YSA9IGV4cGxhbmF0aW9uDQotDQotICAgIHZhciBsZWFmQ291bnQgPSAwOw0KLSAgICB2YXIgbWF4RGVwdGggPSAwOw0KLSAgICB2YXIgcm9vdE5vZGUgPSB7fTsNCi0NCi0gICAgbGVhZkNvdW50ID0gMDsNCi0NCi0gICAgbGV0IHJlY3Vyc2UgPSBmdW5jdGlvbihkYXRhTm9kZSwgZGVwdGgpIHsNCi0NCi0gICAgICBpZiAoZGVwdGggPiBtYXhEZXB0aCkgew0KLSAgICAgICAgbWF4RGVwdGggPSBkZXB0aDsNCi0gICAgICB9DQotDQotICAgICAgbGV0IGdyYXBoTm9kZSA9IHsNCi0gICAgICAgIG5hbWU6IGRhdGFOb2RlLmV4cHJlc3Npb25Ob2RlSWQsDQotICAgICAgICBpbXBsZW1lbnRpbmdDbGFzczogJ3Vua25vd24nLA0KLSAgICAgICAgZGF0YToge30NCi0gICAgICB9Ow0KLQ0KLSAgICAgIFsiZXhwcmVzc2lvbk5vZGVJZCIsICJleHByZXNzaW9uVHlwZSIsICJmdW5jdGlvbk5hbWUiLCAiaW1wbGVtZW50aW5nQ2xhc3MiLCAiZXhwcmVzc2lvbiIsICJub3RlIiwgImhlbHBlcnMiXS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgew0KLSAgICAgICAgZ3JhcGhOb2RlLmRhdGFba2V5XSA9IGRhdGFOb2RlW2tleV07DQotICAgICAgfSk7DQotDQotICAgICAgaWYgKGRhdGFOb2RlLmNoaWxkcmVuICYmIGRhdGFOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsNCi0gICAgICAgIGdyYXBoTm9kZS5jaGlsZHJlbiA9IFtdOw0KLSAgICAgICAgZGF0YU5vZGUuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihuKSB7DQotICAgICAgICAgIGdyYXBoTm9kZS5jaGlsZHJlbi5wdXNoKHJlY3Vyc2UobiwgZGVwdGggKyAxKSk7DQotICAgICAgICB9KTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgKytsZWFmQ291bnQ7DQotICAgICAgfQ0KLQ0KLSAgICAgIHJldHVybiBncmFwaE5vZGU7DQotICAgIH0NCi0NCi0gICAgJHNjb3BlLnNob3dQYWdpbmcgPSBmYWxzZTsNCi0gICAgJHNjb3BlLmlzUmFkaWFsID0gZmFsc2U7DQotICAgICRzY29wZS5leHBsYW5hdGlvbkRhdGEgPSByZWN1cnNlKGRhdGEsIDEpOw0KLQ0KLSAgICAkc2NvcGUuZGVwdGggPSBtYXhEZXB0aCArIDE7DQotICAgICRzY29wZS5sZWFmQ291bnQgPSBsZWFmQ291bnQ7DQotICB9Ow0KLQ0KLSAgJHNjb3BlLmluaXRHcmFwaChleHBsYW5hdGlvbik7DQotfTsNCi0NCi1zb2xyQWRtaW5BcHAuZGlyZWN0aXZlKCdleHBsYW5hdGlvbkdyYXBoJywgZnVuY3Rpb24oQ29uc3RhbnRzKSB7DQotICByZXR1cm4gew0KLSAgICByZXN0cmljdDogJ0VBJywNCi0gICAgc2NvcGU6IHsNCi0gICAgICBkYXRhOiAiPSIsDQotICAgICAgbGVhZkNvdW50OiAiPSIsDQotICAgICAgZGVwdGg6ICI9Ig0KLSAgICB9LA0KLSAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHsNCi0gICAgICANCi0gICAgICB2YXIgaGVscGVyX3BhdGhfY2xhc3MgPSBmdW5jdGlvbihwKSB7DQotICAgICAgICB2YXIgY2xhc3NlcyA9IFsnbGluayddOw0KLQ0KLSAgICAgICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpOw0KLSAgICAgIH07DQotDQotICAgICAgdmFyIGhlbHBlcl9ub2RlX2NsYXNzID0gZnVuY3Rpb24oZCkgew0KLSAgICAgICAgdmFyIGNsYXNzZXMgPSBbJ25vZGUnXTsNCi0NCi0gICAgICAgIGlmIChkLmRhdGEgJiYgZC5kYXRhLmV4cHJlc3Npb25UeXBlKSB7DQotICAgICAgICAgIGNsYXNzZXMucHVzaChkLmRhdGEuZXhwcmVzc2lvblR5cGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpOw0KLSAgICAgIH07DQotDQotICAgICAgdmFyIGhlbHBlcl9ub2RlX3RleHQgPSBmdW5jdGlvbihkKSB7DQotICAgICAgICBpZiAoZC5kYXRhICYmIGQuZGF0YS5mdW5jdGlvbk5hbWUpIHsNCi0gICAgICAgICAgcmV0dXJuIGQuZGF0YS5mdW5jdGlvbk5hbWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZC5uYW1lDQotICAgICAgfTsNCi0NCi0gICAgICB2YXIgaGVscGVyX3Rvb2x0aXAgPSBmdW5jdGlvbihkKSB7DQotDQotICAgICAgICByZXR1cm4gWw0KLSAgICAgICAgICAiRnVuY3Rpb246ICIgKyBkLmRhdGEuZnVuY3Rpb25OYW1lLA0KLSAgICAgICAgICAiVHlwZTogIiArIGQuZGF0YS5leHByZXNzaW9uVHlwZSwNCi0gICAgICAgICAgIkNsYXNzOiAiICsgZC5kYXRhLmltcGxlbWVudGluZ0NsYXNzLnJlcGxhY2UoIm9yZy5hcGFjaGUuc29sci5jbGllbnQuc29scmouaW8iLCAiby5hLnMuYy5zLmkiKSwNCi0gICAgICAgICAgIj09PT09PT09PT09PT0iLA0KLSAgICAgICAgICBkLmRhdGEuZXhwcmVzc2lvbg0KLSAgICAgICAgXS5qb2luKCJcbiIpOw0KLSAgICAgIH0NCi0NCi0gICAgICBzY29wZS4kd2F0Y2goImRhdGEiLCBmdW5jdGlvbihuZXdWYWx1ZSwgb2xkVmFsdWUpIHsNCi0gICAgICAgIGlmIChuZXdWYWx1ZSkgew0KLSAgICAgICAgICBmbGF0R3JhcGgoZWxlbWVudCwgc2NvcGUuZGF0YSwgc2NvcGUuZGVwdGgsIHNjb3BlLmxlYWZDb3VudCk7DQotICAgICAgICB9DQotICAgICAgfSk7DQotDQotICAgICAgdmFyIGZsYXRHcmFwaCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGdyYXBoRGF0YSwgZGVwdGgsIGxlYWZDb3VudCkgew0KLSAgICAgICAgdmFyIHcgPSAxMDAgKyAoZGVwdGggKiAxMDApLA0KLSAgICAgICAgICBoID0gbGVhZkNvdW50ICogNDA7DQotDQotICAgICAgICB2YXIgdHJlZSA9IGQzLmxheW91dC50cmVlKCkuc2l6ZShbaCwgd10pOw0KLQ0KLSAgICAgICAgdmFyIGRpYWdvbmFsID0gZDMuc3ZnLmRpYWdvbmFsKCkucHJvamVjdGlvbihmdW5jdGlvbihkKSB7DQotICAgICAgICAgIHJldHVybiBbZC55ICogLjcsIGQueF07DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIGQzLnNlbGVjdCgnI2NhbnZhcycsIGVsZW1lbnQpLmh0bWwoJycpOw0KLSAgICAgICAgdmFyIHZpcyA9IGQzLnNlbGVjdCgnI2NhbnZhcycsIGVsZW1lbnQpLmFwcGVuZCgnc3ZnJykNCi0gICAgICAgICAgLmF0dHIoJ3dpZHRoJywgdykNCi0gICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGgpDQotICAgICAgICAgIC5hcHBlbmQoJ2cnKQ0KLSAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgyNSwgMCknKTsNCi0NCi0gICAgICAgIHZhciBub2RlcyA9IHRyZWUubm9kZXMoZ3JhcGhEYXRhKTsNCi0NCi0gICAgICAgIHZhciBsaW5rID0gdmlzLnNlbGVjdEFsbCgncGF0aC5saW5rJykNCi0gICAgICAgICAgLmRhdGEodHJlZS5saW5rcyhub2RlcykpDQotICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgncGF0aCcpDQotICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGhlbHBlcl9wYXRoX2NsYXNzKQ0KLSAgICAgICAgICAuYXR0cignZCcsIGRpYWdvbmFsKTsNCi0NCi0gICAgICAgIHZhciBub2RlID0gdmlzLnNlbGVjdEFsbCgnZy5ub2RlJykNCi0gICAgICAgICAgLmRhdGEobm9kZXMpDQotICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgnZycpDQotICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGhlbHBlcl9ub2RlX2NsYXNzKQ0KLSAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCkgew0KLSAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBkLnkgKiAuNyArICcsJyArIGQueCArICcpJzsNCi0gICAgICAgICAgfSkNCi0NCi0gICAgICAgIG5vZGUuYXBwZW5kKCdjaXJjbGUnKQ0KLSAgICAgICAgICAuYXR0cigncicsIDQuNSk7DQotDQotICAgICAgICBub2RlLmFwcGVuZCgndGl0bGUnKQ0KLSAgICAgICAgICAudGV4dChoZWxwZXJfdG9vbHRpcCk7DQotDQotICAgICAgICBub2RlLmFwcGVuZCgndGV4dCcpDQotICAgICAgICAgIC5hdHRyKCdkeCcsIGZ1bmN0aW9uKGQpIHsNCi0gICAgICAgICAgICByZXR1cm4gODsNCi0gICAgICAgICAgfSkNCi0gICAgICAgICAgLmF0dHIoJ2R5JywgZnVuY3Rpb24oZCkgew0KLSAgICAgICAgICAgIHJldHVybiA1Ow0KLSAgICAgICAgICB9KQ0KLSAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCBmdW5jdGlvbihkKSB7DQotICAgICAgICAgICAgcmV0dXJuICdzdGFydCc7DQotICAgICAgICAgIH0pDQotICAgICAgICAgIC50ZXh0KGhlbHBlcl9ub2RlX3RleHQpDQotICAgICAgfTsNCi0gICAgfQ0KLSAgfTsNCi19KQ0KKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitzb2xyQWRtaW5BcHAuY29udHJvbGxlcignU3RyZWFtQ29udHJvbGxlcicsCisgIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24sIFF1ZXJ5LCBDb25zdGFudHMpIHsKKworICAgICRzY29wZS5yZXNldE1lbnUoInN0cmVhbSIsIENvbnN0YW50cy5JU19DT0xMRUNUSU9OX1BBR0UpOworCisgICAgJHNjb3BlLnN0cmVhbSA9IHsKKyAgICAgIHd0OiAnanNvbicsCisgICAgICBleHByOiAkc2NvcGUuZXhwciwKKyAgICAgIGluZGVudDogJ29uJworICAgIH07CisgICAgJHNjb3BlLnF0ID0gInN0cmVhbSI7CisgICAgJHNjb3BlLmRvRXhwbGFuYXRpb24gPSBmYWxzZQorCisgICAgJHNjb3BlLmRvU3RyZWFtID0gZnVuY3Rpb24oKSB7CisKKyAgICAgIHZhciBwYXJhbXMgPSB7fTsKKyAgICAgIHBhcmFtcy5jb3JlID0gJHJvdXRlUGFyYW1zLmNvcmU7CisgICAgICBwYXJhbXMuaGFuZGxlciA9ICRzY29wZS5xdDsKKyAgICAgIHBhcmFtcy5leHByID0gWyRzY29wZS5leHByXQorICAgICAgaWYoJHNjb3BlLmRvRXhwbGFuYXRpb24peworICAgICAgICBwYXJhbXMuZXhwbGFpbiA9IFskc2NvcGUuZG9FeHBsYW5hdGlvbl0KKyAgICAgIH0KKworICAgICAgJHNjb3BlLmxhbmcgPSAianNvbiI7CisgICAgICAkc2NvcGUucmVzcG9uc2UgPSBudWxsOworICAgICAgJHNjb3BlLnVybCA9ICIiOworCisgICAgICB2YXIgdXJsID0gUXVlcnkudXJsKHBhcmFtcyk7CisKKyAgICAgIFF1ZXJ5LnF1ZXJ5KHBhcmFtcywgZnVuY3Rpb24oZGF0YSkgeworCisgICAgICAgIHZhciBqc29uRGF0YSA9IEpTT04ucGFyc2UoZGF0YS50b0pTT04oKS5kYXRhKTsKKyAgICAgICAgaWYgKHVuZGVmaW5lZCAhPSBqc29uRGF0YVsiZXhwbGFuYXRpb24iXSkgeworICAgICAgICAgICRzY29wZS5zaG93RXhwbGFuYXRpb24gPSB0cnVlOworCisgICAgICAgICAgc3RyZWFtR3JhcGhTdWJDb250cm9sbGVyKCRzY29wZSwganNvbkRhdGFbImV4cGxhbmF0aW9uIl0pCisgICAgICAgICAgZGVsZXRlIGpzb25EYXRhWyJleHBsYW5hdGlvbiJdCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgJHNjb3BlLnNob3dFeHBsYW5hdGlvbiA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZGF0YS5kYXRhID0gSlNPTi5zdHJpbmdpZnkoanNvbkRhdGEsbnVsbCwyKTsKKworICAgICAgICAkc2NvcGUubGFuZyA9ICJqc29uIjsKKyAgICAgICAgJHNjb3BlLnJlc3BvbnNlID0gZGF0YTsKKyAgICAgICAgJHNjb3BlLnVybCA9ICRsb2NhdGlvbi5wcm90b2NvbCgpICsgIjovLyIgKworICAgICAgICAgICRsb2NhdGlvbi5ob3N0KCkgKyAiOiIgKworICAgICAgICAgICRsb2NhdGlvbi5wb3J0KCkgKyB1cmw7CisKKyAgICAgIH0pOworICAgIH07CisKKyAgICBpZiAoJGxvY2F0aW9uLnNlYXJjaCgpLmV4cHIpIHsKKyAgICAgICRzY29wZS5leHByID0gJGxvY2F0aW9uLnNlYXJjaCgpWyJleHByIl07CisgICAgICAkc2NvcGUuZG9TdHJlYW0oKTsKKyAgICB9CisKKyAgfQorKTsKKwordmFyIHN0cmVhbUdyYXBoU3ViQ29udHJvbGxlciA9IGZ1bmN0aW9uKCRzY29wZSwgZXhwbGFuYXRpb24pIHsKKyAgJHNjb3BlLnNob3dHcmFwaCA9IHRydWU7CisgICRzY29wZS5wb3MgPSAwOworICAkc2NvcGUucm93cyA9IDg7CisKKyAgJHNjb3BlLnJlc2V0R3JhcGggPSBmdW5jdGlvbigpIHsKKyAgICAkc2NvcGUucG9zID0gMDsKKyAgICAkc2NvcGUuaW5pdEdyYXBoKCk7CisgIH0KKworICAkc2NvcGUuaW5pdEdyYXBoID0gZnVuY3Rpb24oZXhwbGFuYXRpb24pIHsKKworICAgIGRhdGEgPSBleHBsYW5hdGlvbgorCisgICAgdmFyIGxlYWZDb3VudCA9IDA7CisgICAgdmFyIG1heERlcHRoID0gMDsKKyAgICB2YXIgcm9vdE5vZGUgPSB7fTsKKworICAgIGxlYWZDb3VudCA9IDA7CisKKyAgICBsZXQgcmVjdXJzZSA9IGZ1bmN0aW9uKGRhdGFOb2RlLCBkZXB0aCkgeworCisgICAgICBpZiAoZGVwdGggPiBtYXhEZXB0aCkgeworICAgICAgICBtYXhEZXB0aCA9IGRlcHRoOworICAgICAgfQorCisgICAgICBsZXQgZ3JhcGhOb2RlID0geworICAgICAgICBuYW1lOiBkYXRhTm9kZS5leHByZXNzaW9uTm9kZUlkLAorICAgICAgICBpbXBsZW1lbnRpbmdDbGFzczogJ3Vua25vd24nLAorICAgICAgICBkYXRhOiB7fQorICAgICAgfTsKKworICAgICAgWyJleHByZXNzaW9uTm9kZUlkIiwgImV4cHJlc3Npb25UeXBlIiwgImZ1bmN0aW9uTmFtZSIsICJpbXBsZW1lbnRpbmdDbGFzcyIsICJleHByZXNzaW9uIiwgIm5vdGUiLCAiaGVscGVycyJdLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7CisgICAgICAgIGdyYXBoTm9kZS5kYXRhW2tleV0gPSBkYXRhTm9kZVtrZXldOworICAgICAgfSk7CisKKyAgICAgIGlmIChkYXRhTm9kZS5jaGlsZHJlbiAmJiBkYXRhTm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CisgICAgICAgIGdyYXBoTm9kZS5jaGlsZHJlbiA9IFtdOworICAgICAgICBkYXRhTm9kZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKG4pIHsKKyAgICAgICAgICBncmFwaE5vZGUuY2hpbGRyZW4ucHVzaChyZWN1cnNlKG4sIGRlcHRoICsgMSkpOworICAgICAgICB9KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICsrbGVhZkNvdW50OworICAgICAgfQorCisgICAgICByZXR1cm4gZ3JhcGhOb2RlOworICAgIH0KKworICAgICRzY29wZS5zaG93UGFnaW5nID0gZmFsc2U7CisgICAgJHNjb3BlLmlzUmFkaWFsID0gZmFsc2U7CisgICAgJHNjb3BlLmV4cGxhbmF0aW9uRGF0YSA9IHJlY3Vyc2UoZGF0YSwgMSk7CisKKyAgICAkc2NvcGUuZGVwdGggPSBtYXhEZXB0aCArIDE7CisgICAgJHNjb3BlLmxlYWZDb3VudCA9IGxlYWZDb3VudDsKKyAgfTsKKworICAkc2NvcGUuaW5pdEdyYXBoKGV4cGxhbmF0aW9uKTsKK307CisKK3NvbHJBZG1pbkFwcC5kaXJlY3RpdmUoJ2V4cGxhbmF0aW9uR3JhcGgnLCBmdW5jdGlvbihDb25zdGFudHMpIHsKKyAgcmV0dXJuIHsKKyAgICByZXN0cmljdDogJ0VBJywKKyAgICBzY29wZTogeworICAgICAgZGF0YTogIj0iLAorICAgICAgbGVhZkNvdW50OiAiPSIsCisgICAgICBkZXB0aDogIj0iCisgICAgfSwKKyAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHsKKyAgICAgIAorICAgICAgdmFyIGhlbHBlcl9wYXRoX2NsYXNzID0gZnVuY3Rpb24ocCkgeworICAgICAgICB2YXIgY2xhc3NlcyA9IFsnbGluayddOworCisgICAgICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTsKKyAgICAgIH07CisKKyAgICAgIHZhciBoZWxwZXJfbm9kZV9jbGFzcyA9IGZ1bmN0aW9uKGQpIHsKKyAgICAgICAgdmFyIGNsYXNzZXMgPSBbJ25vZGUnXTsKKworICAgICAgICBpZiAoZC5kYXRhICYmIGQuZGF0YS5leHByZXNzaW9uVHlwZSkgeworICAgICAgICAgIGNsYXNzZXMucHVzaChkLmRhdGEuZXhwcmVzc2lvblR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNsYXNzZXMuam9pbignICcpOworICAgICAgfTsKKworICAgICAgdmFyIGhlbHBlcl9ub2RlX3RleHQgPSBmdW5jdGlvbihkKSB7CisgICAgICAgIGlmIChkLmRhdGEgJiYgZC5kYXRhLmZ1bmN0aW9uTmFtZSkgeworICAgICAgICAgIHJldHVybiBkLmRhdGEuZnVuY3Rpb25OYW1lOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGQubmFtZQorICAgICAgfTsKKworICAgICAgdmFyIGhlbHBlcl90b29sdGlwID0gZnVuY3Rpb24oZCkgeworCisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgIkZ1bmN0aW9uOiAiICsgZC5kYXRhLmZ1bmN0aW9uTmFtZSwKKyAgICAgICAgICAiVHlwZTogIiArIGQuZGF0YS5leHByZXNzaW9uVHlwZSwKKyAgICAgICAgICAiQ2xhc3M6ICIgKyBkLmRhdGEuaW1wbGVtZW50aW5nQ2xhc3MucmVwbGFjZSgib3JnLmFwYWNoZS5zb2xyLmNsaWVudC5zb2xyai5pbyIsICJvLmEucy5jLnMuaSIpLAorICAgICAgICAgICI9PT09PT09PT09PT09IiwKKyAgICAgICAgICBkLmRhdGEuZXhwcmVzc2lvbgorICAgICAgICBdLmpvaW4oIlxuIik7CisgICAgICB9CisKKyAgICAgIHNjb3BlLiR3YXRjaCgiZGF0YSIsIGZ1bmN0aW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgeworICAgICAgICBpZiAobmV3VmFsdWUpIHsKKyAgICAgICAgICBmbGF0R3JhcGgoZWxlbWVudCwgc2NvcGUuZGF0YSwgc2NvcGUuZGVwdGgsIHNjb3BlLmxlYWZDb3VudCk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICB2YXIgZmxhdEdyYXBoID0gZnVuY3Rpb24oZWxlbWVudCwgZ3JhcGhEYXRhLCBkZXB0aCwgbGVhZkNvdW50KSB7CisgICAgICAgIHZhciB3ID0gMTAwICsgKGRlcHRoICogMTAwKSwKKyAgICAgICAgICBoID0gbGVhZkNvdW50ICogNDA7CisKKyAgICAgICAgdmFyIHRyZWUgPSBkMy5sYXlvdXQudHJlZSgpLnNpemUoW2gsIHddKTsKKworICAgICAgICB2YXIgZGlhZ29uYWwgPSBkMy5zdmcuZGlhZ29uYWwoKS5wcm9qZWN0aW9uKGZ1bmN0aW9uKGQpIHsKKyAgICAgICAgICByZXR1cm4gW2QueSAqIC43LCBkLnhdOworICAgICAgICB9KTsKKworICAgICAgICBkMy5zZWxlY3QoJyNjYW52YXMnLCBlbGVtZW50KS5odG1sKCcnKTsKKyAgICAgICAgdmFyIHZpcyA9IGQzLnNlbGVjdCgnI2NhbnZhcycsIGVsZW1lbnQpLmFwcGVuZCgnc3ZnJykKKyAgICAgICAgICAuYXR0cignd2lkdGgnLCB3KQorICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoKQorICAgICAgICAgIC5hcHBlbmQoJ2cnKQorICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDI1LCAwKScpOworCisgICAgICAgIHZhciBub2RlcyA9IHRyZWUubm9kZXMoZ3JhcGhEYXRhKTsKKworICAgICAgICB2YXIgbGluayA9IHZpcy5zZWxlY3RBbGwoJ3BhdGgubGluaycpCisgICAgICAgICAgLmRhdGEodHJlZS5saW5rcyhub2RlcykpCisgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCdwYXRoJykKKyAgICAgICAgICAuYXR0cignY2xhc3MnLCBoZWxwZXJfcGF0aF9jbGFzcykKKyAgICAgICAgICAuYXR0cignZCcsIGRpYWdvbmFsKTsKKworICAgICAgICB2YXIgbm9kZSA9IHZpcy5zZWxlY3RBbGwoJ2cubm9kZScpCisgICAgICAgICAgLmRhdGEobm9kZXMpCisgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCdnJykKKyAgICAgICAgICAuYXR0cignY2xhc3MnLCBoZWxwZXJfbm9kZV9jbGFzcykKKyAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCkgeworICAgICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIGQueSAqIC43ICsgJywnICsgZC54ICsgJyknOworICAgICAgICAgIH0pCisKKyAgICAgICAgbm9kZS5hcHBlbmQoJ2NpcmNsZScpCisgICAgICAgICAgLmF0dHIoJ3InLCA0LjUpOworCisgICAgICAgIG5vZGUuYXBwZW5kKCd0aXRsZScpCisgICAgICAgICAgLnRleHQoaGVscGVyX3Rvb2x0aXApOworCisgICAgICAgIG5vZGUuYXBwZW5kKCd0ZXh0JykKKyAgICAgICAgICAuYXR0cignZHgnLCBmdW5jdGlvbihkKSB7CisgICAgICAgICAgICByZXR1cm4gODsKKyAgICAgICAgICB9KQorICAgICAgICAgIC5hdHRyKCdkeScsIGZ1bmN0aW9uKGQpIHsKKyAgICAgICAgICAgIHJldHVybiA1OworICAgICAgICAgIH0pCisgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgZnVuY3Rpb24oZCkgeworICAgICAgICAgICAgcmV0dXJuICdzdGFydCc7CisgICAgICAgICAgfSkKKyAgICAgICAgICAudGV4dChoZWxwZXJfbm9kZV90ZXh0KQorICAgICAgfTsKKyAgICB9CisgIH07Cit9KQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvdGhyZWFkcy5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL2NvbnRyb2xsZXJzL3RocmVhZHMuanMKaW5kZXggNmY5MWYzMC4uMjJhOTAwMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvY29udHJvbGxlcnMvdGhyZWFkcy5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvYW5ndWxhci9jb250cm9sbGVycy90aHJlYWRzLmpzCkBAIC0xLDUwICsxLDUwIEBACi0vKg0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotDQotc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ1RocmVhZHNDb250cm9sbGVyJywNCi0gIGZ1bmN0aW9uKCRzY29wZSwgVGhyZWFkcywgQ29uc3RhbnRzKXsNCi0gICAgJHNjb3BlLnJlc2V0TWVudSgidGhyZWFkcyIsIENvbnN0YW50cy5JU19ST09UX1BBR0UpOw0KLSAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIFRocmVhZHMuZ2V0KGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgIHZhciB0aHJlYWREdW1wID0gZGF0YS5zeXN0ZW0udGhyZWFkRHVtcDsNCi0gICAgICAgIHZhciB0aHJlYWRzID0gW107DQotICAgICAgICBmb3IgKHZhciBpPTE7IGk8dGhyZWFkRHVtcC5sZW5ndGg7IGkrPTIpIHsNCi0gICAgICAgICAgdmFyIHRocmVhZCA9IHRocmVhZER1bXBbaV07DQotICAgICAgICAgIGlmICghIXRocmVhZC5zdGFja1RyYWNlKSB7DQotICAgICAgICAgICAgdmFyIHN0YWNrVHJhY2UgPSBbXTsNCi0gICAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8dGhyZWFkLnN0YWNrVHJhY2UubGVuZ3RoOyBqKyspIHsNCi0gICAgICAgICAgICAgIHZhciB0cmFjZSA9IHRocmVhZC5zdGFja1RyYWNlW2pdLnJlcGxhY2UoIigiLCAiXHUyMDBCKCIpOyAvLyBhbGxvdyB3cmFwcGluZyB0byBoYXBwZW4sIFx1MjAwQiBpcyBhIHplcm8td2lkdGggc3BhY2UNCi0gICAgICAgICAgICAgIHN0YWNrVHJhY2UucHVzaCh7aWQ6dGhyZWFkLmlkICsgIjoiICsgaiwgdHJhY2U6IHRyYWNlfSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocmVhZC5zdGFja1RyYWNlID0gc3RhY2tUcmFjZTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJlYWRzLnB1c2godGhyZWFkKTsNCi0gICAgICAgIH0NCi0gICAgICAgICRzY29wZS50aHJlYWRzID0gdGhyZWFkczsNCi0gICAgICB9KTsNCi0gICAgfTsNCi0gICAgJHNjb3BlLnRvZ2dsZVN0YWNrdHJhY2UgPSBmdW5jdGlvbih0aHJlYWQpIHsNCi0gICAgICB0aHJlYWQuc2hvd1N0YWNrVHJhY2UgPSAhdGhyZWFkLnNob3dTdGFja1RyYWNlOw0KLSAgICB9Ow0KLSAgICAkc2NvcGUudG9nZ2xlU3RhY2t0cmFjZXMgPSBmdW5jdGlvbigpIHsNCi0gICAgICAkc2NvcGUuc2hvd0FsbFN0YWNrdHJhY2VzID0gISRzY29wZS5zaG93QWxsU3RhY2t0cmFjZXM7DQotICAgICAgZm9yICh2YXIgaT0wOyBpPCRzY29wZS50aHJlYWRzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAkc2NvcGUudGhyZWFkc1tpXS5zaG93U3RhY2tUcmFjZSA9ICRzY29wZS5zaG93QWxsU3RhY2t0cmFjZXM7DQotICAgICAgfQ0KLSAgICB9Ow0KLSAgICAkc2NvcGUucmVmcmVzaCgpOw0KLX0pOw0KKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworc29sckFkbWluQXBwLmNvbnRyb2xsZXIoJ1RocmVhZHNDb250cm9sbGVyJywKKyAgZnVuY3Rpb24oJHNjb3BlLCBUaHJlYWRzLCBDb25zdGFudHMpeworICAgICRzY29wZS5yZXNldE1lbnUoInRocmVhZHMiLCBDb25zdGFudHMuSVNfUk9PVF9QQUdFKTsKKyAgICAkc2NvcGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkgeworICAgICAgVGhyZWFkcy5nZXQoZnVuY3Rpb24oZGF0YSkgeworICAgICAgICB2YXIgdGhyZWFkRHVtcCA9IGRhdGEuc3lzdGVtLnRocmVhZER1bXA7CisgICAgICAgIHZhciB0aHJlYWRzID0gW107CisgICAgICAgIGZvciAodmFyIGk9MTsgaTx0aHJlYWREdW1wLmxlbmd0aDsgaSs9MikgeworICAgICAgICAgIHZhciB0aHJlYWQgPSB0aHJlYWREdW1wW2ldOworICAgICAgICAgIGlmICghIXRocmVhZC5zdGFja1RyYWNlKSB7CisgICAgICAgICAgICB2YXIgc3RhY2tUcmFjZSA9IFtdOworICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPHRocmVhZC5zdGFja1RyYWNlLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgIHZhciB0cmFjZSA9IHRocmVhZC5zdGFja1RyYWNlW2pdLnJlcGxhY2UoIigiLCAiXHUyMDBCKCIpOyAvLyBhbGxvdyB3cmFwcGluZyB0byBoYXBwZW4sIFx1MjAwQiBpcyBhIHplcm8td2lkdGggc3BhY2UKKyAgICAgICAgICAgICAgc3RhY2tUcmFjZS5wdXNoKHtpZDp0aHJlYWQuaWQgKyAiOiIgKyBqLCB0cmFjZTogdHJhY2V9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocmVhZC5zdGFja1RyYWNlID0gc3RhY2tUcmFjZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhyZWFkcy5wdXNoKHRocmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgJHNjb3BlLnRocmVhZHMgPSB0aHJlYWRzOworICAgICAgfSk7CisgICAgfTsKKyAgICAkc2NvcGUudG9nZ2xlU3RhY2t0cmFjZSA9IGZ1bmN0aW9uKHRocmVhZCkgeworICAgICAgdGhyZWFkLnNob3dTdGFja1RyYWNlID0gIXRocmVhZC5zaG93U3RhY2tUcmFjZTsKKyAgICB9OworICAgICRzY29wZS50b2dnbGVTdGFja3RyYWNlcyA9IGZ1bmN0aW9uKCkgeworICAgICAgJHNjb3BlLnNob3dBbGxTdGFja3RyYWNlcyA9ICEkc2NvcGUuc2hvd0FsbFN0YWNrdHJhY2VzOworICAgICAgZm9yICh2YXIgaT0wOyBpPCRzY29wZS50aHJlYWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICRzY29wZS50aHJlYWRzW2ldLnNob3dTdGFja1RyYWNlID0gJHNjb3BlLnNob3dBbGxTdGFja3RyYWNlczsKKyAgICAgIH0KKyAgICB9OworICAgICRzY29wZS5yZWZyZXNoKCk7Cit9KTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9hbmd1bGFyL3NlcnZpY2VzLmpzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvc2VydmljZXMuanMKaW5kZXggMzNlNjgzNi4uMTQ2OTM5YiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvc2VydmljZXMuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2FuZ3VsYXIvc2VydmljZXMuanMKQEAgLTEsMjU4ICsxLDI1OCBAQAotLyoNCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLQ0KLXZhciBzb2xyQWRtaW5TZXJ2aWNlcyA9IGFuZ3VsYXIubW9kdWxlKCdzb2xyQWRtaW5TZXJ2aWNlcycsIFsnbmdSZXNvdXJjZSddKTsNCi0NCi1zb2xyQWRtaW5TZXJ2aWNlcy5mYWN0b3J5KCdTeXN0ZW0nLA0KLSAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsNCi0gICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvYWRtaW4vaW5mby9zeXN0ZW0nLCB7Ind0IjoianNvbiIsICJfIjpEYXRlLm5vdygpfSk7DQotICB9XSkNCi0uZmFjdG9yeSgnQ29sbGVjdGlvbnMnLA0KLSAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsNCi0gICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvYWRtaW4vY29sbGVjdGlvbnMnLA0KLSAgICB7J3d0JzonanNvbicsICdfJzpEYXRlLm5vdygpfSwgew0KLSAgICAibGlzdCI6IHtwYXJhbXM6e2FjdGlvbjogIkxJU1QifX0sDQotICAgICJzdGF0dXMiOiB7cGFyYW1zOnthY3Rpb246ICJDTFVTVEVSU1RBVFVTIn19LA0KLSAgICAiYWRkIjoge3BhcmFtczp7YWN0aW9uOiAiQ1JFQVRFIn19LA0KLSAgICAiZGVsZXRlIjoge3BhcmFtczp7YWN0aW9uOiAiREVMRVRFIn19LA0KLSAgICAicmVuYW1lIjoge3BhcmFtczp7YWN0aW9uOiAiUkVOQU1FIn19LA0KLSAgICAiY3JlYXRlQWxpYXMiOiB7cGFyYW1zOnthY3Rpb246ICJDUkVBVEVBTElBUyJ9fSwNCi0gICAgImRlbGV0ZUFsaWFzIjoge3BhcmFtczp7YWN0aW9uOiAiREVMRVRFQUxJQVMifX0sDQotICAgICJkZWxldGVSZXBsaWNhIjoge3BhcmFtczp7YWN0aW9uOiAiREVMRVRFUkVQTElDQSJ9fSwNCi0gICAgImFkZFJlcGxpY2EiOiB7cGFyYW1zOnthY3Rpb246ICJBRERSRVBMSUNBIn19LA0KLSAgICAicmVsb2FkIjoge21ldGhvZDogIkdFVCIsIHBhcmFtczp7YWN0aW9uOiJSRUxPQUQiLCBjb3JlOiAiQGNvcmUifX0sDQotICAgICJvcHRpbWl6ZSI6IHtwYXJhbXM6e319DQotICAgIH0pOw0KLSAgfV0pDQotLmZhY3RvcnkoJ0NvcmVzJywNCi0gIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7DQotICAgIHJldHVybiAkcmVzb3VyY2UoJy9zb2xyL2FkbWluL2NvcmVzJywNCi0gICAgeyd3dCc6J2pzb24nLCAnXyc6RGF0ZS5ub3coKX0sIHsNCi0gICAgInF1ZXJ5Ijoge30sDQotICAgICJsaXN0Ijoge3BhcmFtczp7aW5kZXhJbmZvOiBmYWxzZX19LA0KLSAgICAiYWRkIjoge3BhcmFtczp7YWN0aW9uOiAiQ1JFQVRFIn19LA0KLSAgICAidW5sb2FkIjoge3BhcmFtczp7YWN0aW9uOiAiVU5MT0FEIiwgY29yZTogIkBjb3JlIn19LA0KLSAgICAicmVuYW1lIjoge3BhcmFtczp7YWN0aW9uOiAiUkVOQU1FIn19LA0KLSAgICAic3dhcCI6IHtwYXJhbXM6e2FjdGlvbjogIlNXQVAifX0sDQotICAgICJyZWxvYWQiOiB7bWV0aG9kOiAiR0VUIiwgcGFyYW1zOnthY3Rpb246IlJFTE9BRCIsIGNvcmU6ICJAY29yZSJ9LCBoZWFkZXJzOntkb05vdEludGVyY2VwdDogInRydWUifX0sDQotICAgICJvcHRpbWl6ZSI6IHtwYXJhbXM6e319DQotICAgIH0pOw0KLSAgfV0pDQotLmZhY3RvcnkoJ0xvZ2dpbmcnLA0KLSAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsNCi0gICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvYWRtaW4vaW5mby9sb2dnaW5nJywgeyd3dCc6J2pzb24nLCAnXyc6RGF0ZS5ub3coKX0sIHsNCi0gICAgICAiZXZlbnRzIjoge3BhcmFtczoge3NpbmNlOicwJ319LA0KLSAgICAgICJsZXZlbHMiOiB7fSwNCi0gICAgICAic2V0TGV2ZWwiOiB7fQ0KLSAgICAgIH0pOw0KLSAgfV0pDQotLmZhY3RvcnkoJ1pvb2tlZXBlcicsDQotICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgew0KLSAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci9hZG1pbi96b29rZWVwZXInLCB7d3Q6J2pzb24nLCBfOkRhdGUubm93KCl9LCB7DQotICAgICAgInNpbXBsZSI6IHt9LA0KLSAgICAgICJkdW1wIjoge3BhcmFtczoge2R1bXA6ICJ0cnVlIn19LA0KLSAgICAgICJsaXZlTm9kZXMiOiB7cGFyYW1zOiB7cGF0aDogJy9saXZlX25vZGVzJ319LA0KLSAgICAgICJjbHVzdGVyU3RhdGUiOiB7cGFyYW1zOiB7ZGV0YWlsOiAidHJ1ZSIsIHBhdGg6ICIvY2x1c3RlcnN0YXRlLmpzb24ifX0sDQotICAgICAgImRldGFpbCI6IHtwYXJhbXM6IHtkZXRhaWw6ICJ0cnVlIiwgcGF0aDogIkBwYXRoIn19LA0KLSAgICAgICJjb25maWdzIjoge3BhcmFtczoge2RldGFpbDpmYWxzZSwgcGF0aDogIi9jb25maWdzLyJ9fSwNCi0gICAgICAiYWxpYXNlcyI6IHtwYXJhbXM6IHtkZXRhaWw6ICJ0cnVlIiwgcGF0aDogIi9hbGlhc2VzLmpzb24ifSwgdHJhbnNmb3JtUmVzcG9uc2U6ZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgdmFyIHpub2RlID0gJC5wYXJzZUpTT04oZGF0YSkuem5vZGU7DQotICAgICAgICBpZiAoem5vZGUuZGF0YSkgew0KLSAgICAgICAgICByZXR1cm4ge2FsaWFzZXM6ICQucGFyc2VKU09OKHpub2RlLmRhdGEpLmNvbGxlY3Rpb259Ow0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgcmV0dXJuIHthbGlhc2VzOiB7fX07DQotICAgICAgICB9DQotICAgICAgfX0NCi0gICAgfSk7DQotICB9XSkNCi0uZmFjdG9yeSgnUHJvcGVydGllcycsDQotICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgew0KLSAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci9hZG1pbi9pbmZvL3Byb3BlcnRpZXMnLCB7J3d0JzonanNvbicsICdfJzpEYXRlLm5vdygpfSk7DQotICB9XSkNCi0uZmFjdG9yeSgnVGhyZWFkcycsDQotICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgew0KLSAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci9hZG1pbi9pbmZvL3RocmVhZHMnLCB7J3d0JzonanNvbicsICdfJzpEYXRlLm5vdygpfSk7DQotICB9XSkNCi0uZmFjdG9yeSgnUHJvcGVydGllcycsDQotICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgew0KLSAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci9hZG1pbi9pbmZvL3Byb3BlcnRpZXMnLCB7J3d0JzonanNvbicsICdfJzpEYXRlLm5vdygpfSk7DQotICB9XSkNCi0uZmFjdG9yeSgnUmVwbGljYXRpb24nLA0KLSAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsNCi0gICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvOmNvcmUvcmVwbGljYXRpb24nLCB7J3d0JzonanNvbicsIGNvcmU6ICJAY29yZSIsICdfJzpEYXRlLm5vdygpfSwgew0KLSAgICAgICJkZXRhaWxzIjoge3BhcmFtczoge2NvbW1hbmQ6ICJkZXRhaWxzIn19LA0KLSAgICAgICJjb21tYW5kIjoge3BhcmFtczoge319DQotICAgIH0pOw0KLSAgfV0pDQotLmZhY3RvcnkoJ0NvcmVTeXN0ZW0nLA0KLSAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsNCi0gICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvOmNvcmUvYWRtaW4vc3lzdGVtJywge3d0Oidqc29uJywgY29yZTogIkBjb3JlIiwgXzpEYXRlLm5vdygpfSk7DQotICB9XSkNCi0uZmFjdG9yeSgnVXBkYXRlJywNCi0gIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7DQotICAgIHJldHVybiAkcmVzb3VyY2UoJy9zb2xyLzpjb3JlLzpoYW5kbGVyJywge2NvcmU6ICdAY29yZScsIHd0Oidqc29uJywgXzpEYXRlLm5vdygpLCBoYW5kbGVyOid1cGRhdGUnfSwgew0KLSAgICAgICJvcHRpbWl6ZSI6IHtwYXJhbXM6IHsgb3B0aW1pemU6ICJ0cnVlIn19LA0KLSAgICAgICJjb21taXQiOiB7cGFyYW1zOiB7Y29tbWl0OiAidHJ1ZSJ9fSwNCi0gICAgICAicG9zdCI6IHtoZWFkZXJzOiB7J0NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30sIG1ldGhvZDogIlBPU1QiLCBwYXJhbXM6IHtoYW5kbGVyOiAnQGhhbmRsZXInfX0sDQotICAgICAgInBvc3RKc29uIjoge2hlYWRlcnM6IHsnQ29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSwgbWV0aG9kOiAiUE9TVCIsIHBhcmFtczoge2hhbmRsZXI6ICdAaGFuZGxlcid9fSwNCi0gICAgICAicG9zdFhtbCI6IHtoZWFkZXJzOiB7J0NvbnRlbnQtdHlwZSc6ICd0ZXh0L3htbCd9LCBtZXRob2Q6ICJQT1NUIiwgcGFyYW1zOiB7aGFuZGxlcjogJ0BoYW5kbGVyJ319LA0KLSAgICAgICJwb3N0Q3N2Ijoge2hlYWRlcnM6IHsnQ29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2Nzdid9LCBtZXRob2Q6ICJQT1NUIiwgcGFyYW1zOiB7aGFuZGxlcjogJ0BoYW5kbGVyJ319DQotICAgIH0pOw0KLSAgfV0pDQotLnNlcnZpY2UoJ0ZpbGVVcGxvYWQnLCBmdW5jdGlvbiAoJGh0dHApIHsNCi0gICAgdGhpcy51cGxvYWQgPSBmdW5jdGlvbihwYXJhbXMsIGZpbGUsIHN1Y2Nlc3MsIGVycm9yKXsNCi0gICAgICAgIHZhciB1cmwgPSAiL3NvbHIvIiArIHBhcmFtcy5jb3JlICsgIi8iICsgcGFyYW1zLmhhbmRsZXIgKyAiPyI7DQotICAgICAgICByYXcgPSBwYXJhbXMucmF3Ow0KLSAgICAgICAgZGVsZXRlIHBhcmFtcy5jb3JlOw0KLSAgICAgICAgZGVsZXRlIHBhcmFtcy5oYW5kbGVyOw0KLSAgICAgICAgZGVsZXRlIHBhcmFtcy5yYXc7DQotICAgICAgICB1cmwgKz0gJC5wYXJhbShwYXJhbXMpOw0KLSAgICAgICAgaWYgKHJhdyAmJiByYXcubGVuZ3RoPjApIHsNCi0gICAgICAgICAgICBpZiAocmF3WzBdICE9ICImIikgcmF3ID0gIiYiICsgcmF3Ow0KLSAgICAgICAgICAgIHVybCArPSByYXc7DQotICAgICAgICB9DQotICAgICAgICB2YXIgZmQgPSBuZXcgRm9ybURhdGEoKTsNCi0gICAgICAgIGZkLmFwcGVuZCgnZmlsZScsIGZpbGUpOw0KLSAgICAgICAgJGh0dHAucG9zdCh1cmwsIGZkLCB7DQotICAgICAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogYW5ndWxhci5pZGVudGl0eSwNCi0gICAgICAgICAgICBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6IHVuZGVmaW5lZH0NCi0gICAgICAgIH0pLnN1Y2Nlc3Moc3VjY2VzcykuZXJyb3IoZXJyb3IpOw0KLSAgICB9DQotfSkNCi0uZmFjdG9yeSgnTHVrZScsDQotICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgew0KLSAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci86Y29yZS9hZG1pbi9sdWtlJywge2NvcmU6ICdAY29yZScsIHd0Oidqc29uJywgXzpEYXRlLm5vdygpfSwgew0KLSAgICAgICJpbmRleCI6ICB7cGFyYW1zOiB7bnVtVGVybXM6IDAsIHNob3c6ICdpbmRleCd9fSwNCi0gICAgICAicmF3Ijoge3BhcmFtczoge251bVRlcm1zOiAwfX0sDQotICAgICAgInNjaGVtYSI6IHtwYXJhbXM6IHtzaG93OidzY2hlbWEnfX0sDQotICAgICAgImZpZWxkIjoge30sDQotICAgICAgImZpZWxkcyI6IHtwYXJhbXM6IHtzaG93OidzY2hlbWEnfSwgaW50ZXJjZXB0b3I6IHsNCi0gICAgICAgICAgcmVzcG9uc2U6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQotICAgICAgICAgICAgICB2YXIgZmllbGRzQW5kVHlwZXMgPSBbXTsNCi0gICAgICAgICAgICAgIGZvciAodmFyIGZpZWxkIGluIHJlc3BvbnNlLmRhdGEuc2NoZW1hLmZpZWxkcykgew0KLSAgICAgICAgICAgICAgICBmaWVsZHNBbmRUeXBlcy5wdXNoKHtncm91cDogIkZpZWxkcyIsIGxhYmVsOiBmaWVsZCwgdmFsdWU6ICJmaWVsZG5hbWU9IiArIGZpZWxkfSk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICBmb3IgKHZhciB0eXBlIGluIHJlc3BvbnNlLmRhdGEuc2NoZW1hLnR5cGVzKSB7DQotICAgICAgICAgICAgICAgIGZpZWxkc0FuZFR5cGVzLnB1c2goe2dyb3VwOiAiVHlwZXMiLCBsYWJlbDogdHlwZSwgdmFsdWU6ICJmaWVsZHR5cGU9IiArIHR5cGV9KTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIHJldHVybiBmaWVsZHNBbmRUeXBlczsNCi0gICAgICAgICAgfQ0KLSAgICAgIH19DQotICAgIH0pOw0KLSAgfV0pDQotLmZhY3RvcnkoJ0FuYWx5c2lzJywNCi0gIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7DQotICAgIHJldHVybiAkcmVzb3VyY2UoJy9zb2xyLzpjb3JlL2FuYWx5c2lzL2ZpZWxkJywge2NvcmU6ICdAY29yZScsIHd0Oidqc29uJywgXzpEYXRlLm5vdygpfSwgew0KLSAgICAgICJmaWVsZCI6IHtwYXJhbXM6IHsiYW5hbHlzaXMuc2hvd21hdGNoIjogdHJ1ZX19DQotICAgIH0pOw0KLSAgfV0pDQotLmZhY3RvcnkoJ0RhdGFJbXBvcnQnLA0KLSAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsNCi0gICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvOmNvcmUvOm5hbWUnLCB7Y29yZTogJ0Bjb3JlJywgbmFtZTogJ0BuYW1lJywgaW5kZW50OidvbicsIHd0Oidqc29uJywgXzpEYXRlLm5vdygpfSwgew0KLSAgICAgICJjb25maWciOiB7cGFyYW1zOiB7Y29tbWFuZDogInNob3ctY29uZmlnIn0sIGhlYWRlcnM6IHtkb05vdEludGVyY2VwdDogInRydWUifSwNCi0gICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2NvbmZpZzogZGF0YX07DQotICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0sDQotICAgICAgInN0YXR1cyI6IHtwYXJhbXM6IHtjb21tYW5kOiAic3RhdHVzIn0sIGhlYWRlcnM6IHtkb05vdEludGVyY2VwdDogInRydWUifX0sDQotICAgICAgInJlbG9hZCI6IHtwYXJhbXM6IHtjb21tYW5kOiAicmVsb2FkLWNvbmZpZyJ9fSwNCi0gICAgICAicG9zdCI6IHttZXRob2Q6ICJQT1NUIiwNCi0gICAgICAgICAgICAgICAgaGVhZGVyczogeydDb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ30sDQotICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGZ1bmN0aW9uKGRhdGEpIHsgcmV0dXJuICQucGFyYW0oZGF0YSkgfX0NCi0gICAgfSk7DQotICB9XSkNCi0uZmFjdG9yeSgnUGluZycsDQotICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgew0KLSAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci86Y29yZS9hZG1pbi9waW5nJywge3d0Oidqc29uJywgY29yZTogJ0Bjb3JlJywgdHM6RGF0ZS5ub3coKSwgXzpEYXRlLm5vdygpfSwgew0KLSAgICAgInBpbmciOiB7fSwNCi0gICAgICJzdGF0dXMiOiB7cGFyYW1zOnthY3Rpb246InN0YXR1cyJ9LCBoZWFkZXJzOiB7ZG9Ob3RJbnRlcmNlcHQ6ICJ0cnVlIn0NCi0gICAgfX0pOw0KLSAgfV0pDQotLmZhY3RvcnkoJ01iZWFucycsDQotICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgew0KLSAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci86Y29yZS9hZG1pbi9tYmVhbnMnLCB7J3d0JzonanNvbicsIGNvcmU6ICdAY29yZScsICdfJzpEYXRlLm5vdygpfSwgew0KLSAgICAgICAgc3RhdHM6IHtwYXJhbXM6IHtzdGF0czogdHJ1ZX19LA0KLSAgICAgICAgaW5mbzoge30sDQotICAgICAgICByZWZlcmVuY2U6IHsNCi0gICAgICAgICAgICBwYXJhbXM6IHt3dDogInhtbCIsIHN0YXRzOiB0cnVlfSwgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uIChkYXRhKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB7cmVmZXJlbmNlOiBkYXRhfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0sDQotICAgICAgICBkZWx0YToge21ldGhvZDogIlBPU1QiLA0KLSAgICAgICAgICAgICAgICBwYXJhbXM6IHtzdGF0czogdHJ1ZSwgZGlmZjp0cnVlfSwNCi0gICAgICAgICAgICAgICAgaGVhZGVyczogeydDb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ30sDQotICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAic3RyZWFtLmJvZHk9IiArIGVuY29kZVVSSUNvbXBvbmVudChkYXRhKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9KTsNCi0gIH1dKQ0KLS5mYWN0b3J5KCdGaWxlcycsDQotICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgew0KLSAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci86Y29yZS9hZG1pbi9maWxlJywgeyd3dCc6J2pzb24nLCBjb3JlOiAnQGNvcmUnLCAnXyc6RGF0ZS5ub3coKX0sIHsNCi0gICAgICAibGlzdCI6IHt9LA0KLSAgICAgICJnZXQiOiB7bWV0aG9kOiAiR0VUIiwgaW50ZXJjZXB0b3I6IHsNCi0gICAgICAgICAgcmVzcG9uc2U6IGZ1bmN0aW9uKGNvbmZpZykge3JldHVybiBjb25maWc7fQ0KLSAgICAgIH0sIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgICAgIHJldHVybiBkYXRhOw0KLSAgICAgIH19DQotICAgIH0pOw0KLSAgfV0pDQotLmZhY3RvcnkoJ1F1ZXJ5JywNCi0gICAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsNCi0gICAgICAgdmFyIHJlc291cmNlID0gJHJlc291cmNlKCcvc29sci86Y29yZS86aGFuZGxlcicsIHtjb3JlOiAnQGNvcmUnLCBoYW5kbGVyOiAnQGhhbmRsZXInLCAnXyc6RGF0ZS5ub3coKX0sIHsNCi0gICAgICAgICAgICJxdWVyeSI6IHsNCi0gICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwNCi0gICAgICAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uIChkYXRhKSB7DQotICAgICAgICAgICAgICAgcmV0dXJuIHtkYXRhOiBkYXRhfQ0KLSAgICAgICAgICAgICB9LA0KLSAgICAgICAgICAgICBoZWFkZXJzOiB7ZG9Ob3RJbnRlcmNlcHQ6ICJ0cnVlIn0NCi0gICAgICAgICAgIH0NCi0gICAgICAgfSk7DQotICAgICAgIHJlc291cmNlLnVybCA9IGZ1bmN0aW9uKHBhcmFtcykgew0KLSAgICAgICAgICAgdmFyIHFzID0gW107DQotICAgICAgICAgICBmb3IgKGtleSBpbiBwYXJhbXMpIHsNCi0gICAgICAgICAgICAgICBpZiAoa2V5ICE9ICJjb3JlIiAmJiBrZXkgIT0gImhhbmRsZXIiKSB7DQotICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcGFyYW1zW2tleV0pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIHFzLnB1c2goa2V5ICsgIj0iICsgcGFyYW1zW2tleV1baV0pOw0KLSAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgfQ0KLSAgICAgICAgICAgcmV0dXJuICIvc29sci8iICsgcGFyYW1zLmNvcmUgKyAiLyIgKyBwYXJhbXMuaGFuZGxlciArICI/IiArIHFzLnNvcnQoKS5qb2luKCImIik7DQotICAgICAgIH0NCi0gICAgICAgcmV0dXJuIHJlc291cmNlOw0KLX1dKQ0KLS5mYWN0b3J5KCdTZWdtZW50cycsDQotICAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsNCi0gICAgICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvOmNvcmUvYWRtaW4vc2VnbWVudHMnLCB7J3d0JzonanNvbicsIGNvcmU6ICdAY29yZScsIF86RGF0ZS5ub3coKX0sIHsNCi0gICAgICAgICAgIGdldDoge30NCi0gICAgICAgfSk7DQotfV0pDQotLmZhY3RvcnkoJ1NjaGVtYScsDQotICAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsNCi0gICAgIHJldHVybiAkcmVzb3VyY2UoJy9zb2xyLzpjb3JlL3NjaGVtYScsIHt3dDogJ2pzb24nLCBjb3JlOiAnQGNvcmUnLCBfOkRhdGUubm93KCl9LCB7DQotICAgICAgIGdldDoge21ldGhvZDogIkdFVCJ9LA0KLSAgICAgICBjaGVjazoge21ldGhvZDogIkdFVCIsIGhlYWRlcnM6IHtkb05vdEludGVyY2VwdDogInRydWUifX0sDQotICAgICAgIHBvc3Q6IHttZXRob2Q6ICJQT1NUIn0NCi0gICAgIH0pOw0KLX1dKQ0KLS5mYWN0b3J5KCdDb25maWcnLA0KLSAgIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7DQotICAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci86Y29yZS9jb25maWcnLCB7d3Q6ICdqc29uJywgY29yZTogJ0Bjb3JlJywgXzpEYXRlLm5vdygpfSwgew0KLSAgICAgICBnZXQ6IHttZXRob2Q6ICJHRVQifQ0KLSAgICAgfSkNCi19XSk7DQorLyoKKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCit2YXIgc29sckFkbWluU2VydmljZXMgPSBhbmd1bGFyLm1vZHVsZSgnc29sckFkbWluU2VydmljZXMnLCBbJ25nUmVzb3VyY2UnXSk7CisKK3NvbHJBZG1pblNlcnZpY2VzLmZhY3RvcnkoJ1N5c3RlbScsCisgIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7CisgICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvYWRtaW4vaW5mby9zeXN0ZW0nLCB7Ind0IjoianNvbiIsICJfIjpEYXRlLm5vdygpfSk7CisgIH1dKQorLmZhY3RvcnkoJ0NvbGxlY3Rpb25zJywKKyAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsKKyAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci9hZG1pbi9jb2xsZWN0aW9ucycsCisgICAgeyd3dCc6J2pzb24nLCAnXyc6RGF0ZS5ub3coKX0sIHsKKyAgICAibGlzdCI6IHtwYXJhbXM6e2FjdGlvbjogIkxJU1QifX0sCisgICAgInN0YXR1cyI6IHtwYXJhbXM6e2FjdGlvbjogIkNMVVNURVJTVEFUVVMifX0sCisgICAgImFkZCI6IHtwYXJhbXM6e2FjdGlvbjogIkNSRUFURSJ9fSwKKyAgICAiZGVsZXRlIjoge3BhcmFtczp7YWN0aW9uOiAiREVMRVRFIn19LAorICAgICJyZW5hbWUiOiB7cGFyYW1zOnthY3Rpb246ICJSRU5BTUUifX0sCisgICAgImNyZWF0ZUFsaWFzIjoge3BhcmFtczp7YWN0aW9uOiAiQ1JFQVRFQUxJQVMifX0sCisgICAgImRlbGV0ZUFsaWFzIjoge3BhcmFtczp7YWN0aW9uOiAiREVMRVRFQUxJQVMifX0sCisgICAgImRlbGV0ZVJlcGxpY2EiOiB7cGFyYW1zOnthY3Rpb246ICJERUxFVEVSRVBMSUNBIn19LAorICAgICJhZGRSZXBsaWNhIjoge3BhcmFtczp7YWN0aW9uOiAiQUREUkVQTElDQSJ9fSwKKyAgICAicmVsb2FkIjoge21ldGhvZDogIkdFVCIsIHBhcmFtczp7YWN0aW9uOiJSRUxPQUQiLCBjb3JlOiAiQGNvcmUifX0sCisgICAgIm9wdGltaXplIjoge3BhcmFtczp7fX0KKyAgICB9KTsKKyAgfV0pCisuZmFjdG9yeSgnQ29yZXMnLAorICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgeworICAgIHJldHVybiAkcmVzb3VyY2UoJy9zb2xyL2FkbWluL2NvcmVzJywKKyAgICB7J3d0JzonanNvbicsICdfJzpEYXRlLm5vdygpfSwgeworICAgICJxdWVyeSI6IHt9LAorICAgICJsaXN0Ijoge3BhcmFtczp7aW5kZXhJbmZvOiBmYWxzZX19LAorICAgICJhZGQiOiB7cGFyYW1zOnthY3Rpb246ICJDUkVBVEUifX0sCisgICAgInVubG9hZCI6IHtwYXJhbXM6e2FjdGlvbjogIlVOTE9BRCIsIGNvcmU6ICJAY29yZSJ9fSwKKyAgICAicmVuYW1lIjoge3BhcmFtczp7YWN0aW9uOiAiUkVOQU1FIn19LAorICAgICJzd2FwIjoge3BhcmFtczp7YWN0aW9uOiAiU1dBUCJ9fSwKKyAgICAicmVsb2FkIjoge21ldGhvZDogIkdFVCIsIHBhcmFtczp7YWN0aW9uOiJSRUxPQUQiLCBjb3JlOiAiQGNvcmUifSwgaGVhZGVyczp7ZG9Ob3RJbnRlcmNlcHQ6ICJ0cnVlIn19LAorICAgICJvcHRpbWl6ZSI6IHtwYXJhbXM6e319CisgICAgfSk7CisgIH1dKQorLmZhY3RvcnkoJ0xvZ2dpbmcnLAorICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgeworICAgIHJldHVybiAkcmVzb3VyY2UoJy9zb2xyL2FkbWluL2luZm8vbG9nZ2luZycsIHsnd3QnOidqc29uJywgJ18nOkRhdGUubm93KCl9LCB7CisgICAgICAiZXZlbnRzIjoge3BhcmFtczoge3NpbmNlOicwJ319LAorICAgICAgImxldmVscyI6IHt9LAorICAgICAgInNldExldmVsIjoge30KKyAgICAgIH0pOworICB9XSkKKy5mYWN0b3J5KCdab29rZWVwZXInLAorICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgeworICAgIHJldHVybiAkcmVzb3VyY2UoJy9zb2xyL2FkbWluL3pvb2tlZXBlcicsIHt3dDonanNvbicsIF86RGF0ZS5ub3coKX0sIHsKKyAgICAgICJzaW1wbGUiOiB7fSwKKyAgICAgICJkdW1wIjoge3BhcmFtczoge2R1bXA6ICJ0cnVlIn19LAorICAgICAgImxpdmVOb2RlcyI6IHtwYXJhbXM6IHtwYXRoOiAnL2xpdmVfbm9kZXMnfX0sCisgICAgICAiY2x1c3RlclN0YXRlIjoge3BhcmFtczoge2RldGFpbDogInRydWUiLCBwYXRoOiAiL2NsdXN0ZXJzdGF0ZS5qc29uIn19LAorICAgICAgImRldGFpbCI6IHtwYXJhbXM6IHtkZXRhaWw6ICJ0cnVlIiwgcGF0aDogIkBwYXRoIn19LAorICAgICAgImNvbmZpZ3MiOiB7cGFyYW1zOiB7ZGV0YWlsOmZhbHNlLCBwYXRoOiAiL2NvbmZpZ3MvIn19LAorICAgICAgImFsaWFzZXMiOiB7cGFyYW1zOiB7ZGV0YWlsOiAidHJ1ZSIsIHBhdGg6ICIvYWxpYXNlcy5qc29uIn0sIHRyYW5zZm9ybVJlc3BvbnNlOmZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgdmFyIHpub2RlID0gJC5wYXJzZUpTT04oZGF0YSkuem5vZGU7CisgICAgICAgIGlmICh6bm9kZS5kYXRhKSB7CisgICAgICAgICAgcmV0dXJuIHthbGlhc2VzOiAkLnBhcnNlSlNPTih6bm9kZS5kYXRhKS5jb2xsZWN0aW9ufTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4ge2FsaWFzZXM6IHt9fTsKKyAgICAgICAgfQorICAgICAgfX0KKyAgICB9KTsKKyAgfV0pCisuZmFjdG9yeSgnUHJvcGVydGllcycsCisgIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7CisgICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvYWRtaW4vaW5mby9wcm9wZXJ0aWVzJywgeyd3dCc6J2pzb24nLCAnXyc6RGF0ZS5ub3coKX0pOworICB9XSkKKy5mYWN0b3J5KCdUaHJlYWRzJywKKyAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsKKyAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci9hZG1pbi9pbmZvL3RocmVhZHMnLCB7J3d0JzonanNvbicsICdfJzpEYXRlLm5vdygpfSk7CisgIH1dKQorLmZhY3RvcnkoJ1Byb3BlcnRpZXMnLAorICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgeworICAgIHJldHVybiAkcmVzb3VyY2UoJy9zb2xyL2FkbWluL2luZm8vcHJvcGVydGllcycsIHsnd3QnOidqc29uJywgJ18nOkRhdGUubm93KCl9KTsKKyAgfV0pCisuZmFjdG9yeSgnUmVwbGljYXRpb24nLAorICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgeworICAgIHJldHVybiAkcmVzb3VyY2UoJy9zb2xyLzpjb3JlL3JlcGxpY2F0aW9uJywgeyd3dCc6J2pzb24nLCBjb3JlOiAiQGNvcmUiLCAnXyc6RGF0ZS5ub3coKX0sIHsKKyAgICAgICJkZXRhaWxzIjoge3BhcmFtczoge2NvbW1hbmQ6ICJkZXRhaWxzIn19LAorICAgICAgImNvbW1hbmQiOiB7cGFyYW1zOiB7fX0KKyAgICB9KTsKKyAgfV0pCisuZmFjdG9yeSgnQ29yZVN5c3RlbScsCisgIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7CisgICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvOmNvcmUvYWRtaW4vc3lzdGVtJywge3d0Oidqc29uJywgY29yZTogIkBjb3JlIiwgXzpEYXRlLm5vdygpfSk7CisgIH1dKQorLmZhY3RvcnkoJ1VwZGF0ZScsCisgIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7CisgICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvOmNvcmUvOmhhbmRsZXInLCB7Y29yZTogJ0Bjb3JlJywgd3Q6J2pzb24nLCBfOkRhdGUubm93KCksIGhhbmRsZXI6J3VwZGF0ZSd9LCB7CisgICAgICAib3B0aW1pemUiOiB7cGFyYW1zOiB7IG9wdGltaXplOiAidHJ1ZSJ9fSwKKyAgICAgICJjb21taXQiOiB7cGFyYW1zOiB7Y29tbWl0OiAidHJ1ZSJ9fSwKKyAgICAgICJwb3N0Ijoge2hlYWRlcnM6IHsnQ29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nfSwgbWV0aG9kOiAiUE9TVCIsIHBhcmFtczoge2hhbmRsZXI6ICdAaGFuZGxlcid9fSwKKyAgICAgICJwb3N0SnNvbiI6IHtoZWFkZXJzOiB7J0NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ30sIG1ldGhvZDogIlBPU1QiLCBwYXJhbXM6IHtoYW5kbGVyOiAnQGhhbmRsZXInfX0sCisgICAgICAicG9zdFhtbCI6IHtoZWFkZXJzOiB7J0NvbnRlbnQtdHlwZSc6ICd0ZXh0L3htbCd9LCBtZXRob2Q6ICJQT1NUIiwgcGFyYW1zOiB7aGFuZGxlcjogJ0BoYW5kbGVyJ319LAorICAgICAgInBvc3RDc3YiOiB7aGVhZGVyczogeydDb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vY3N2J30sIG1ldGhvZDogIlBPU1QiLCBwYXJhbXM6IHtoYW5kbGVyOiAnQGhhbmRsZXInfX0KKyAgICB9KTsKKyAgfV0pCisuc2VydmljZSgnRmlsZVVwbG9hZCcsIGZ1bmN0aW9uICgkaHR0cCkgeworICAgIHRoaXMudXBsb2FkID0gZnVuY3Rpb24ocGFyYW1zLCBmaWxlLCBzdWNjZXNzLCBlcnJvcil7CisgICAgICAgIHZhciB1cmwgPSAiL3NvbHIvIiArIHBhcmFtcy5jb3JlICsgIi8iICsgcGFyYW1zLmhhbmRsZXIgKyAiPyI7CisgICAgICAgIHJhdyA9IHBhcmFtcy5yYXc7CisgICAgICAgIGRlbGV0ZSBwYXJhbXMuY29yZTsKKyAgICAgICAgZGVsZXRlIHBhcmFtcy5oYW5kbGVyOworICAgICAgICBkZWxldGUgcGFyYW1zLnJhdzsKKyAgICAgICAgdXJsICs9ICQucGFyYW0ocGFyYW1zKTsKKyAgICAgICAgaWYgKHJhdyAmJiByYXcubGVuZ3RoPjApIHsKKyAgICAgICAgICAgIGlmIChyYXdbMF0gIT0gIiYiKSByYXcgPSAiJiIgKyByYXc7CisgICAgICAgICAgICB1cmwgKz0gcmF3OworICAgICAgICB9CisgICAgICAgIHZhciBmZCA9IG5ldyBGb3JtRGF0YSgpOworICAgICAgICBmZC5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTsKKyAgICAgICAgJGh0dHAucG9zdCh1cmwsIGZkLCB7CisgICAgICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBhbmd1bGFyLmlkZW50aXR5LAorICAgICAgICAgICAgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiB1bmRlZmluZWR9CisgICAgICAgIH0pLnN1Y2Nlc3Moc3VjY2VzcykuZXJyb3IoZXJyb3IpOworICAgIH0KK30pCisuZmFjdG9yeSgnTHVrZScsCisgIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7CisgICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvOmNvcmUvYWRtaW4vbHVrZScsIHtjb3JlOiAnQGNvcmUnLCB3dDonanNvbicsIF86RGF0ZS5ub3coKX0sIHsKKyAgICAgICJpbmRleCI6ICB7cGFyYW1zOiB7bnVtVGVybXM6IDAsIHNob3c6ICdpbmRleCd9fSwKKyAgICAgICJyYXciOiB7cGFyYW1zOiB7bnVtVGVybXM6IDB9fSwKKyAgICAgICJzY2hlbWEiOiB7cGFyYW1zOiB7c2hvdzonc2NoZW1hJ319LAorICAgICAgImZpZWxkIjoge30sCisgICAgICAiZmllbGRzIjoge3BhcmFtczoge3Nob3c6J3NjaGVtYSd9LCBpbnRlcmNlcHRvcjogeworICAgICAgICAgIHJlc3BvbnNlOiBmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICAgICAgICB2YXIgZmllbGRzQW5kVHlwZXMgPSBbXTsKKyAgICAgICAgICAgICAgZm9yICh2YXIgZmllbGQgaW4gcmVzcG9uc2UuZGF0YS5zY2hlbWEuZmllbGRzKSB7CisgICAgICAgICAgICAgICAgZmllbGRzQW5kVHlwZXMucHVzaCh7Z3JvdXA6ICJGaWVsZHMiLCBsYWJlbDogZmllbGQsIHZhbHVlOiAiZmllbGRuYW1lPSIgKyBmaWVsZH0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGZvciAodmFyIHR5cGUgaW4gcmVzcG9uc2UuZGF0YS5zY2hlbWEudHlwZXMpIHsKKyAgICAgICAgICAgICAgICBmaWVsZHNBbmRUeXBlcy5wdXNoKHtncm91cDogIlR5cGVzIiwgbGFiZWw6IHR5cGUsIHZhbHVlOiAiZmllbGR0eXBlPSIgKyB0eXBlfSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkc0FuZFR5cGVzOworICAgICAgICAgIH0KKyAgICAgIH19CisgICAgfSk7CisgIH1dKQorLmZhY3RvcnkoJ0FuYWx5c2lzJywKKyAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsKKyAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci86Y29yZS9hbmFseXNpcy9maWVsZCcsIHtjb3JlOiAnQGNvcmUnLCB3dDonanNvbicsIF86RGF0ZS5ub3coKX0sIHsKKyAgICAgICJmaWVsZCI6IHtwYXJhbXM6IHsiYW5hbHlzaXMuc2hvd21hdGNoIjogdHJ1ZX19CisgICAgfSk7CisgIH1dKQorLmZhY3RvcnkoJ0RhdGFJbXBvcnQnLAorICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgeworICAgIHJldHVybiAkcmVzb3VyY2UoJy9zb2xyLzpjb3JlLzpuYW1lJywge2NvcmU6ICdAY29yZScsIG5hbWU6ICdAbmFtZScsIGluZGVudDonb24nLCB3dDonanNvbicsIF86RGF0ZS5ub3coKX0sIHsKKyAgICAgICJjb25maWciOiB7cGFyYW1zOiB7Y29tbWFuZDogInNob3ctY29uZmlnIn0sIGhlYWRlcnM6IHtkb05vdEludGVyY2VwdDogInRydWUifSwKKyAgICAgICAgICAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtjb25maWc6IGRhdGF9OworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICJzdGF0dXMiOiB7cGFyYW1zOiB7Y29tbWFuZDogInN0YXR1cyJ9LCBoZWFkZXJzOiB7ZG9Ob3RJbnRlcmNlcHQ6ICJ0cnVlIn19LAorICAgICAgInJlbG9hZCI6IHtwYXJhbXM6IHtjb21tYW5kOiAicmVsb2FkLWNvbmZpZyJ9fSwKKyAgICAgICJwb3N0Ijoge21ldGhvZDogIlBPU1QiLAorICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsnQ29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCd9LAorICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGZ1bmN0aW9uKGRhdGEpIHsgcmV0dXJuICQucGFyYW0oZGF0YSkgfX0KKyAgICB9KTsKKyAgfV0pCisuZmFjdG9yeSgnUGluZycsCisgIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7CisgICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvOmNvcmUvYWRtaW4vcGluZycsIHt3dDonanNvbicsIGNvcmU6ICdAY29yZScsIHRzOkRhdGUubm93KCksIF86RGF0ZS5ub3coKX0sIHsKKyAgICAgInBpbmciOiB7fSwKKyAgICAgInN0YXR1cyI6IHtwYXJhbXM6e2FjdGlvbjoic3RhdHVzIn0sIGhlYWRlcnM6IHtkb05vdEludGVyY2VwdDogInRydWUifQorICAgIH19KTsKKyAgfV0pCisuZmFjdG9yeSgnTWJlYW5zJywKKyAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsKKyAgICByZXR1cm4gJHJlc291cmNlKCcvc29sci86Y29yZS9hZG1pbi9tYmVhbnMnLCB7J3d0JzonanNvbicsIGNvcmU6ICdAY29yZScsICdfJzpEYXRlLm5vdygpfSwgeworICAgICAgICBzdGF0czoge3BhcmFtczoge3N0YXRzOiB0cnVlfX0sCisgICAgICAgIGluZm86IHt9LAorICAgICAgICByZWZlcmVuY2U6IHsKKyAgICAgICAgICAgIHBhcmFtczoge3d0OiAieG1sIiwgc3RhdHM6IHRydWV9LCB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4ge3JlZmVyZW5jZTogZGF0YX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgZGVsdGE6IHttZXRob2Q6ICJQT1NUIiwKKyAgICAgICAgICAgICAgICBwYXJhbXM6IHtzdGF0czogdHJ1ZSwgZGlmZjp0cnVlfSwKKyAgICAgICAgICAgICAgICBoZWFkZXJzOiB7J0NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnfSwKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3RyZWFtLmJvZHk9IiArIGVuY29kZVVSSUNvbXBvbmVudChkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9KTsKKyAgfV0pCisuZmFjdG9yeSgnRmlsZXMnLAorICBbJyRyZXNvdXJjZScsIGZ1bmN0aW9uKCRyZXNvdXJjZSkgeworICAgIHJldHVybiAkcmVzb3VyY2UoJy9zb2xyLzpjb3JlL2FkbWluL2ZpbGUnLCB7J3d0JzonanNvbicsIGNvcmU6ICdAY29yZScsICdfJzpEYXRlLm5vdygpfSwgeworICAgICAgImxpc3QiOiB7fSwKKyAgICAgICJnZXQiOiB7bWV0aG9kOiAiR0VUIiwgaW50ZXJjZXB0b3I6IHsKKyAgICAgICAgICByZXNwb25zZTogZnVuY3Rpb24oY29uZmlnKSB7cmV0dXJuIGNvbmZpZzt9CisgICAgICB9LCB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24oZGF0YSkgeworICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgfX0KKyAgICB9KTsKKyAgfV0pCisuZmFjdG9yeSgnUXVlcnknLAorICAgIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7CisgICAgICAgdmFyIHJlc291cmNlID0gJHJlc291cmNlKCcvc29sci86Y29yZS86aGFuZGxlcicsIHtjb3JlOiAnQGNvcmUnLCBoYW5kbGVyOiAnQGhhbmRsZXInLCAnXyc6RGF0ZS5ub3coKX0sIHsKKyAgICAgICAgICAgInF1ZXJ5IjogeworICAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCisgICAgICAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uIChkYXRhKSB7CisgICAgICAgICAgICAgICByZXR1cm4ge2RhdGE6IGRhdGF9CisgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICBoZWFkZXJzOiB7ZG9Ob3RJbnRlcmNlcHQ6ICJ0cnVlIn0KKyAgICAgICAgICAgfQorICAgICAgIH0pOworICAgICAgIHJlc291cmNlLnVybCA9IGZ1bmN0aW9uKHBhcmFtcykgeworICAgICAgICAgICB2YXIgcXMgPSBbXTsKKyAgICAgICAgICAgZm9yIChrZXkgaW4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICBpZiAoa2V5ICE9ICJjb3JlIiAmJiBrZXkgIT0gImhhbmRsZXIiKSB7CisgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBwYXJhbXNba2V5XSkgeworICAgICAgICAgICAgICAgICAgICAgICBxcy5wdXNoKGtleSArICI9IiArIHBhcmFtc1trZXldW2ldKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgICAgcmV0dXJuICIvc29sci8iICsgcGFyYW1zLmNvcmUgKyAiLyIgKyBwYXJhbXMuaGFuZGxlciArICI/IiArIHFzLnNvcnQoKS5qb2luKCImIik7CisgICAgICAgfQorICAgICAgIHJldHVybiByZXNvdXJjZTsKK31dKQorLmZhY3RvcnkoJ1NlZ21lbnRzJywKKyAgIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7CisgICAgICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvOmNvcmUvYWRtaW4vc2VnbWVudHMnLCB7J3d0JzonanNvbicsIGNvcmU6ICdAY29yZScsIF86RGF0ZS5ub3coKX0sIHsKKyAgICAgICAgICAgZ2V0OiB7fQorICAgICAgIH0pOworfV0pCisuZmFjdG9yeSgnU2NoZW1hJywKKyAgIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7CisgICAgIHJldHVybiAkcmVzb3VyY2UoJy9zb2xyLzpjb3JlL3NjaGVtYScsIHt3dDogJ2pzb24nLCBjb3JlOiAnQGNvcmUnLCBfOkRhdGUubm93KCl9LCB7CisgICAgICAgZ2V0OiB7bWV0aG9kOiAiR0VUIn0sCisgICAgICAgY2hlY2s6IHttZXRob2Q6ICJHRVQiLCBoZWFkZXJzOiB7ZG9Ob3RJbnRlcmNlcHQ6ICJ0cnVlIn19LAorICAgICAgIHBvc3Q6IHttZXRob2Q6ICJQT1NUIn0KKyAgICAgfSk7Cit9XSkKKy5mYWN0b3J5KCdDb25maWcnLAorICAgWyckcmVzb3VyY2UnLCBmdW5jdGlvbigkcmVzb3VyY2UpIHsKKyAgICAgcmV0dXJuICRyZXNvdXJjZSgnL3NvbHIvOmNvcmUvY29uZmlnJywge3d0OiAnanNvbicsIGNvcmU6ICdAY29yZScsIF86RGF0ZS5ub3coKX0sIHsKKyAgICAgICBnZXQ6IHttZXRob2Q6ICJHRVQifQorICAgICB9KQorfV0pOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2xpYi9qcXVlcnktMS43LjIubWluLmpzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2xpYi9qcXVlcnktMS43LjIubWluLmpzCmluZGV4IGRmMWNhZTQuLjkwMTY1ZTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9saWIvanF1ZXJ5LTEuNy4yLm1pbi5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvbGliL2pxdWVyeS0xLjcuMi5taW4uanMKQEAgLTEsMzAgKzEsMzAgQEAKLS8qIQ0KLQ0KLUNvcHlyaWdodCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMNCi1odHRwOi8vanF1ZXJ5LmNvbS8NCi0NCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcNCi1hIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUNCi0iU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nDQotd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLA0KLWRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bw0KLXBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bw0KLXRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KLWluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KLQ0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KLUVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRg0KLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EDQotTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQ0KLUxJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04NCi1PRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04NCi1XSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4NCi0NCi0qLw0KLQ0KLS8qISBqUXVlcnkgdjEuNy4yIGpxdWVyeS5jb20gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8NCi0oZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjeShhKXtyZXR1cm4gZi5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfWZ1bmN0aW9uIGN1KGEpe2lmKCFjalthXSl7dmFyIGI9Yy5ib2R5LGQ9ZigiPCIrYSsiPiIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKGU9PT0ibm9uZSJ8fGU9PT0iIil7Y2t8fChjaz1jLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGNrLmZyYW1lQm9yZGVyPWNrLndpZHRoPWNrLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKGNrKTtpZighY2x8fCFjay5jcmVhdGVFbGVtZW50KWNsPShjay5jb250ZW50V2luZG93fHxjay5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGNsLndyaXRlKChmLnN1cHBvcnQuYm94TW9kZWw/IjwhZG9jdHlwZSBodG1sPiI6IiIpKyI8aHRtbD48Ym9keT4iKSxjbC5jbG9zZSgpO2Q9Y2wuY3JlYXRlRWxlbWVudChhKSxjbC5ib2R5LmFwcGVuZENoaWxkKGQpLGU9Zi5jc3MoZCwiZGlzcGxheSIpLGIucmVtb3ZlQ2hpbGQoY2spfWNqW2FdPWV9cmV0dXJuIGNqW2FdfWZ1bmN0aW9uIGN0KGEsYil7dmFyIGM9e307Zi5lYWNoKGNwLmNvbmNhdC5hcHBseShbXSxjcC5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2NbdGhpc109YX0pO3JldHVybiBjfWZ1bmN0aW9uIGNzKCl7Y3E9Yn1mdW5jdGlvbiBjcigpe3NldFRpbWVvdXQoY3MsMCk7cmV0dXJuIGNxPWYubm93KCl9ZnVuY3Rpb24gY2koKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjaCgpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBjYihhLGMpe2EuZGF0YUZpbHRlciYmKGM9YS5kYXRhRmlsdGVyKGMsYS5kYXRhVHlwZSkpO3ZhciBkPWEuZGF0YVR5cGVzLGU9e30sZyxoLGk9ZC5sZW5ndGgsaixrPWRbMF0sbCxtLG4sbyxwO2ZvcihnPTE7ZzxpO2crKyl7aWYoZz09PTEpZm9yKGggaW4gYS5jb252ZXJ0ZXJzKXR5cGVvZiBoPT0ic3RyaW5nIiYmKGVbaC50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbaF0pO2w9ayxrPWRbZ107aWYoaz09PSIqIilrPWw7ZWxzZSBpZihsIT09IioiJiZsIT09ayl7bT1sKyIgIitrLG49ZVttXXx8ZVsiKiAiK2tdO2lmKCFuKXtwPWI7Zm9yKG8gaW4gZSl7aj1vLnNwbGl0KCIgIik7aWYoalswXT09PWx8fGpbMF09PT0iKiIpe3A9ZVtqWzFdKyIgIitrXTtpZihwKXtvPWVbb10sbz09PSEwP249cDpwPT09ITAmJihuPW8pO2JyZWFrfX19fSFuJiYhcCYmZi5lcnJvcigiTm8gY29udmVyc2lvbiBmcm9tICIrbS5yZXBsYWNlKCIgIiwiIHRvICIpKSxuIT09ITAmJihjPW4/bihjKTpwKG8oYykpKX19cmV0dXJuIGN9ZnVuY3Rpb24gY2EoYSxjLGQpe3ZhciBlPWEuY29udGVudHMsZj1hLmRhdGFUeXBlcyxnPWEucmVzcG9uc2VGaWVsZHMsaCxpLGosaztmb3IoaSBpbiBnKWkgaW4gZCYmKGNbZ1tpXV09ZFtpXSk7d2hpbGUoZlswXT09PSIqIilmLnNoaWZ0KCksaD09PWImJihoPWEubWltZVR5cGV8fGMuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihoKWZvcihpIGluIGUpaWYoZVtpXSYmZVtpXS50ZXN0KGgpKXtmLnVuc2hpZnQoaSk7YnJlYWt9aWYoZlswXWluIGQpaj1mWzBdO2Vsc2V7Zm9yKGkgaW4gZCl7aWYoIWZbMF18fGEuY29udmVydGVyc1tpKyIgIitmWzBdXSl7aj1pO2JyZWFrfWt8fChrPWkpfWo9anx8a31pZihqKXtqIT09ZlswXSYmZi51bnNoaWZ0KGopO3JldHVybiBkW2pdfX1mdW5jdGlvbiBiXyhhLGIsYyxkKXtpZihmLmlzQXJyYXkoYikpZi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxiRC50ZXN0KGEpP2QoYSxlKTpiXyhhKyJbIisodHlwZW9mIGU9PSJvYmplY3QiP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKCFjJiZmLnR5cGUoYik9PT0ib2JqZWN0Iilmb3IodmFyIGUgaW4gYiliXyhhKyJbIitlKyJdIixiW2VdLGMsZCk7ZWxzZSBkKGEsYil9ZnVuY3Rpb24gYiQoYSxjKXt2YXIgZCxlLGc9Zi5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZ1tkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmZi5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBiWihhLGMsZCxlLGYsZyl7Zj1mfHxjLmRhdGFUeXBlc1swXSxnPWd8fHt9LGdbZl09ITA7dmFyIGg9YVtmXSxpPTAsaj1oP2gubGVuZ3RoOjAsaz1hPT09YlMsbDtmb3IoO2k8aiYmKGt8fCFsKTtpKyspbD1oW2ldKGMsZCxlKSx0eXBlb2YgbD09InN0cmluZyImJigha3x8Z1tsXT9sPWI6KGMuZGF0YVR5cGVzLnVuc2hpZnQobCksbD1iWihhLGMsZCxlLGwsZykpKTsoa3x8IWwpJiYhZ1siKiJdJiYobD1iWihhLGMsZCxlLCIqIixnKSk7cmV0dXJuIGx9ZnVuY3Rpb24gYlkoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dHlwZW9mIGIhPSJzdHJpbmciJiYoYz1iLGI9IioiKTtpZihmLmlzRnVuY3Rpb24oYykpe3ZhciBkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChiTyksZT0wLGc9ZC5sZW5ndGgsaCxpLGo7Zm9yKDtlPGc7ZSsrKWg9ZFtlXSxqPS9eXCsvLnRlc3QoaCksaiYmKGg9aC5zdWJzdHIoMSl8fCIqIiksaT1hW2hdPWFbaF18fFtdLGlbaj8idW5zaGlmdCI6InB1c2giXShjKX19fWZ1bmN0aW9uIGJCKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9Yj09PSJ3aWR0aCI/MTowLGc9NDtpZihkPjApe2lmKGMhPT0iYm9yZGVyIilmb3IoO2U8ZztlKz0yKWN8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2J4W2VdKSl8fDApLGM9PT0ibWFyZ2luIj9kKz1wYXJzZUZsb2F0KGYuY3NzKGEsYytieFtlXSkpfHwwOmQtPXBhcnNlRmxvYXQoZi5jc3MoYSwiYm9yZGVyIitieFtlXSsiV2lkdGgiKSl8fDA7cmV0dXJuIGQrInB4In1kPWJ5KGEsYik7aWYoZDwwfHxkPT1udWxsKWQ9YS5zdHlsZVtiXTtpZihidC50ZXN0KGQpKXJldHVybiBkO2Q9cGFyc2VGbG9hdChkKXx8MDtpZihjKWZvcig7ZTxnO2UrPTIpZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJwYWRkaW5nIitieFtlXSkpfHwwLGMhPT0icGFkZGluZyImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrYnhbZV0rIldpZHRoIikpfHwwKSxjPT09Im1hcmdpbiImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsYytieFtlXSkpfHwwKTtyZXR1cm4gZCsicHgifWZ1bmN0aW9uIGJvKGEpe3ZhciBiPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YmguYXBwZW5kQ2hpbGQoYiksYi5pbm5lckhUTUw9YS5vdXRlckhUTUw7cmV0dXJuIGIuZmlyc3RDaGlsZH1mdW5jdGlvbiBibihhKXt2YXIgYj0oYS5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk7Yj09PSJpbnB1dCI/Ym0oYSk6YiE9PSJzY3JpcHQiJiZ0eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCImJmYuZ3JlcChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLGJtKX1mdW5jdGlvbiBibShhKXtpZihhLnR5cGU9PT0iY2hlY2tib3gifHxhLnR5cGU9PT0icmFkaW8iKWEuZGVmYXVsdENoZWNrZWQ9YS5jaGVja2VkfWZ1bmN0aW9uIGJsKGEpe3JldHVybiB0eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCI/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOnR5cGVvZiBhLnF1ZXJ5U2VsZWN0b3JBbGwhPSJ1bmRlZmluZWQiP2EucXVlcnlTZWxlY3RvckFsbCgiKiIpOltdfWZ1bmN0aW9uIGJrKGEsYil7dmFyIGM7Yi5ub2RlVHlwZT09PTEmJihiLmNsZWFyQXR0cmlidXRlcyYmYi5jbGVhckF0dHJpYnV0ZXMoKSxiLm1lcmdlQXR0cmlidXRlcyYmYi5tZXJnZUF0dHJpYnV0ZXMoYSksYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYz09PSJvYmplY3QiP2Iub3V0ZXJIVE1MPWEub3V0ZXJIVE1MOmMhPT0iaW5wdXQifHxhLnR5cGUhPT0iY2hlY2tib3giJiZhLnR5cGUhPT0icmFkaW8iP2M9PT0ib3B0aW9uIj9iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOmM9PT0iaW5wdXQifHxjPT09InRleHRhcmVhIj9iLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZTpjPT09InNjcmlwdCImJmIudGV4dCE9PWEudGV4dCYmKGIudGV4dD1hLnRleHQpOihhLmNoZWNrZWQmJihiLmRlZmF1bHRDaGVja2VkPWIuY2hlY2tlZD1hLmNoZWNrZWQpLGIudmFsdWUhPT1hLnZhbHVlJiYoYi52YWx1ZT1hLnZhbHVlKSksYi5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKSxiLnJlbW92ZUF0dHJpYnV0ZSgiX3N1Ym1pdF9hdHRhY2hlZCIpLGIucmVtb3ZlQXR0cmlidXRlKCJfY2hhbmdlX2F0dGFjaGVkIikpfWZ1bmN0aW9uIGJqKGEsYil7aWYoYi5ub2RlVHlwZT09PTEmJiEhZi5oYXNEYXRhKGEpKXt2YXIgYyxkLGUsZz1mLl9kYXRhKGEpLGg9Zi5fZGF0YShiLGcpLGk9Zy5ldmVudHM7aWYoaSl7ZGVsZXRlIGguaGFuZGxlLGguZXZlbnRzPXt9O2ZvcihjIGluIGkpZm9yKGQ9MCxlPWlbY10ubGVuZ3RoO2Q8ZTtkKyspZi5ldmVudC5hZGQoYixjLGlbY11bZF0pfWguZGF0YSYmKGguZGF0YT1mLmV4dGVuZCh7fSxoLmRhdGEpKX19ZnVuY3Rpb24gYmkoYSxiKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJ0YWJsZSIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24gVShhKXt2YXIgYj1WLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfWZ1bmN0aW9uIFQoYSxiLGMpe2I9Ynx8MDtpZihmLmlzRnVuY3Rpb24oYikpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7dmFyIGU9ISFiLmNhbGwoYSxkLGEpO3JldHVybiBlPT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9PT1iPT09Y30pO2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7dmFyIGQ9Zi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT0xfSk7aWYoTy50ZXN0KGIpKXJldHVybiBmLmZpbHRlcihiLGQsIWMpO2I9Zi5maWx0ZXIoYixkKX1yZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gZi5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gUyhhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gSygpe3JldHVybiEwfWZ1bmN0aW9uIEooKXtyZXR1cm4hMX1mdW5jdGlvbiBuKGEsYixjKXt2YXIgZD1iKyJkZWZlciIsZT1iKyJxdWV1ZSIsZz1iKyJtYXJrIixoPWYuX2RhdGEoYSxkKTtoJiYoYz09PSJxdWV1ZSJ8fCFmLl9kYXRhKGEsZSkpJiYoYz09PSJtYXJrInx8IWYuX2RhdGEoYSxnKSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXshZi5fZGF0YShhLGUpJiYhZi5fZGF0YShhLGcpJiYoZi5yZW1vdmVEYXRhKGEsZCwhMCksaC5maXJlKCkpfSwwKX1mdW5jdGlvbiBtKGEpe2Zvcih2YXIgYiBpbiBhKXtpZihiPT09ImRhdGEiJiZmLmlzRW1wdHlPYmplY3QoYVtiXSkpY29udGludWU7aWYoYiE9PSJ0b0pTT04iKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGwoYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoaywiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6Zi5pc051bWVyaWMoZCk/K2Q6ai50ZXN0KGQpP2YucGFyc2VKU09OKGQpOmR9Y2F0Y2goZyl7fWYuZGF0YShhLGMsZCl9ZWxzZSBkPWJ9cmV0dXJuIGR9ZnVuY3Rpb24gaChhKXt2YXIgYj1nW2FdPXt9LGMsZDthPWEuc3BsaXQoL1xzKy8pO2ZvcihjPTAsZD1hLmxlbmd0aDtjPGQ7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIGM9YS5kb2N1bWVudCxkPWEubmF2aWdhdG9yLGU9YS5sb2NhdGlvbixmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSigpe2lmKCFlLmlzUmVhZHkpe3RyeXtjLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3NldFRpbWVvdXQoSiwxKTtyZXR1cm59ZS5yZWFkeSgpfX12YXIgZT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgZS5mbi5pbml0KGEsYixoKX0sZj1hLmpRdWVyeSxnPWEuJCxoLGk9L14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLGo9L1xTLyxrPS9eXHMrLyxsPS9ccyskLyxtPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPik/JC8sbj0vXltcXSw6e31cc10qJC8sbz0vXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLHA9LyJbXiJcXFxuXHJdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy9nLHE9Lyg/Ol58OnwsKSg/OlxzKlxbKSsvZyxyPS8od2Via2l0KVsgXC9dKFtcdy5dKykvLHM9LyhvcGVyYSkoPzouKnZlcnNpb24pP1sgXC9dKFtcdy5dKykvLHQ9Lyhtc2llKSAoW1x3Ll0rKS8sdT0vKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspKT8vLHY9Ly0oW2Etel18WzAtOV0pL2lnLHc9L14tbXMtLyx4PWZ1bmN0aW9uKGEsYil7cmV0dXJuKGIrIiIpLnRvVXBwZXJDYXNlKCl9LHk9ZC51c2VyQWdlbnQseixBLEIsQz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxFPUFycmF5LnByb3RvdHlwZS5wdXNoLEY9QXJyYXkucHJvdG90eXBlLnNsaWNlLEc9U3RyaW5nLnByb3RvdHlwZS50cmltLEg9QXJyYXkucHJvdG90eXBlLmluZGV4T2YsST17fTtlLmZuPWUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplLGluaXQ6ZnVuY3Rpb24oYSxkLGYpe3ZhciBnLGgsaixrO2lmKCFhKXJldHVybiB0aGlzO2lmKGEubm9kZVR5cGUpe3RoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZihhPT09ImJvZHkiJiYhZCYmYy5ib2R5KXt0aGlzLmNvbnRleHQ9Yyx0aGlzWzBdPWMuYm9keSx0aGlzLnNlbGVjdG9yPWEsdGhpcy5sZW5ndGg9MTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09InN0cmluZyIpe2EuY2hhckF0KDApIT09IjwifHxhLmNoYXJBdChhLmxlbmd0aC0xKSE9PSI+Inx8YS5sZW5ndGg8Mz9nPWkuZXhlYyhhKTpnPVtudWxsLGEsbnVsbF07aWYoZyYmKGdbMV18fCFkKSl7aWYoZ1sxXSl7ZD1kIGluc3RhbmNlb2YgZT9kWzBdOmQsaz1kP2Qub3duZXJEb2N1bWVudHx8ZDpjLGo9bS5leGVjKGEpLGo/ZS5pc1BsYWluT2JqZWN0KGQpPyhhPVtjLmNyZWF0ZUVsZW1lbnQoalsxXSldLGUuZm4uYXR0ci5jYWxsKGEsZCwhMCkpOmE9W2suY3JlYXRlRWxlbWVudChqWzFdKV06KGo9ZS5idWlsZEZyYWdtZW50KFtnWzFdXSxba10pLGE9KGouY2FjaGVhYmxlP2UuY2xvbmUoai5mcmFnbWVudCk6ai5mcmFnbWVudCkuY2hpbGROb2Rlcyk7cmV0dXJuIGUubWVyZ2UodGhpcyxhKX1oPWMuZ2V0RWxlbWVudEJ5SWQoZ1syXSk7aWYoaCYmaC5wYXJlbnROb2RlKXtpZihoLmlkIT09Z1syXSlyZXR1cm4gZi5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1ofXRoaXMuY29udGV4dD1jLHRoaXMuc2VsZWN0b3I9YTtyZXR1cm4gdGhpc31yZXR1cm4hZHx8ZC5qcXVlcnk/KGR8fGYpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihkKS5maW5kKGEpfWlmKGUuaXNGdW5jdGlvbihhKSlyZXR1cm4gZi5yZWFkeShhKTthLnNlbGVjdG9yIT09YiYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KTtyZXR1cm4gZS5tYWtlQXJyYXkoYSx0aGlzKX0sc2VsZWN0b3I6IiIsanF1ZXJ5OiIxLjcuMiIsbGVuZ3RoOjAsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBGLmNhbGwodGhpcywwKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP3RoaXMudG9BcnJheSgpOmE8MD90aGlzW3RoaXMubGVuZ3RoK2FdOnRoaXNbYV19LHB1c2hTdGFjazpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5jb25zdHJ1Y3RvcigpO2UuaXNBcnJheShhKT9FLmFwcGx5KGQsYSk6ZS5tZXJnZShkLGEpLGQucHJldk9iamVjdD10aGlzLGQuY29udGV4dD10aGlzLmNvbnRleHQsYj09PSJmaW5kIj9kLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKStjOmImJihkLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK2IrIigiK2MrIikiKTtyZXR1cm4gZH0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBlLmVhY2godGhpcyxhLGIpfSxyZWFkeTpmdW5jdGlvbihhKXtlLmJpbmRSZWFkeSgpLEEuYWRkKGEpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihhKXthPSthO3JldHVybiBhPT09LTE/dGhpcy5zbGljZShhKTp0aGlzLnNsaWNlKGEsYSsxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRi5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixGLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpFLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSxlLmZuLmluaXQucHJvdG90eXBlPWUuZm4sZS5leHRlbmQ9ZS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxjLGQsZixnLGgsaT1hcmd1bWVudHNbMF18fHt9LGo9MSxrPWFyZ3VtZW50cy5sZW5ndGgsbD0hMTt0eXBlb2YgaT09ImJvb2xlYW4iJiYobD1pLGk9YXJndW1lbnRzWzFdfHx7fSxqPTIpLHR5cGVvZiBpIT0ib2JqZWN0IiYmIWUuaXNGdW5jdGlvbihpKSYmKGk9e30pLGs9PT1qJiYoaT10aGlzLC0taik7Zm9yKDtqPGs7aisrKWlmKChhPWFyZ3VtZW50c1tqXSkhPW51bGwpZm9yKGMgaW4gYSl7ZD1pW2NdLGY9YVtjXTtpZihpPT09Ziljb250aW51ZTtsJiZmJiYoZS5pc1BsYWluT2JqZWN0KGYpfHwoZz1lLmlzQXJyYXkoZikpKT8oZz8oZz0hMSxoPWQmJmUuaXNBcnJheShkKT9kOltdKTpoPWQmJmUuaXNQbGFpbk9iamVjdChkKT9kOnt9LGlbY109ZS5leHRlbmQobCxoLGYpKTpmIT09YiYmKGlbY109Zil9cmV0dXJuIGl9LGUuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKGIpe2EuJD09PWUmJihhLiQ9ZyksYiYmYS5qUXVlcnk9PT1lJiYoYS5qUXVlcnk9Zik7cmV0dXJuIGV9LGlzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGEpe2E/ZS5yZWFkeVdhaXQrKzplLnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oYSl7aWYoYT09PSEwJiYhLS1lLnJlYWR5V2FpdHx8YSE9PSEwJiYhZS5pc1JlYWR5KXtpZighYy5ib2R5KXJldHVybiBzZXRUaW1lb3V0KGUucmVhZHksMSk7ZS5pc1JlYWR5PSEwO2lmKGEhPT0hMCYmLS1lLnJlYWR5V2FpdD4wKXJldHVybjtBLmZpcmVXaXRoKGMsW2VdKSxlLmZuLnRyaWdnZXImJmUoYykudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5Iil9fSxiaW5kUmVhZHk6ZnVuY3Rpb24oKXtpZighQSl7QT1lLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKTtpZihjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXJldHVybiBzZXRUaW1lb3V0KGUucmVhZHksMSk7aWYoYy5hZGRFdmVudExpc3RlbmVyKWMuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiwhMSksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixlLnJlYWR5LCExKTtlbHNlIGlmKGMuYXR0YWNoRXZlbnQpe2MuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQiksYS5hdHRhY2hFdmVudCgib25sb2FkIixlLnJlYWR5KTt2YXIgYj0hMTt0cnl7Yj1hLmZyYW1lRWxlbWVudD09bnVsbH1jYXRjaChkKXt9Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwmJmImJkooKX19fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBlLnR5cGUoYSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVybiBlLnR5cGUoYSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChhKSkmJmlzRmluaXRlKGEpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP1N0cmluZyhhKTpJW0MuY2FsbChhKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHxlLnR5cGUoYSkhPT0ib2JqZWN0Inx8YS5ub2RlVHlwZXx8ZS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIUQuY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhRC5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9dmFyIGQ7Zm9yKGQgaW4gYSk7cmV0dXJuIGQ9PT1ifHxELmNhbGwoYSxkKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxwYXJzZUpTT046ZnVuY3Rpb24oYil7aWYodHlwZW9mIGIhPSJzdHJpbmcifHwhYilyZXR1cm4gbnVsbDtiPWUudHJpbShiKTtpZihhLkpTT04mJmEuSlNPTi5wYXJzZSlyZXR1cm4gYS5KU09OLnBhcnNlKGIpO2lmKG4udGVzdChiLnJlcGxhY2UobywiQCIpLnJlcGxhY2UocCwiXSIpLnJlcGxhY2UocSwiIikpKXJldHVybihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IpKSgpO2UuZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0scGFyc2VYTUw6ZnVuY3Rpb24oYyl7aWYodHlwZW9mIGMhPSJzdHJpbmcifHwhYylyZXR1cm4gbnVsbDt2YXIgZCxmO3RyeXthLkRPTVBhcnNlcj8oZj1uZXcgRE9NUGFyc2VyLGQ9Zi5wYXJzZUZyb21TdHJpbmcoYywidGV4dC94bWwiKSk6KGQ9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxkLmFzeW5jPSJmYWxzZSIsZC5sb2FkWE1MKGMpKX1jYXRjaChnKXtkPWJ9KCFkfHwhZC5kb2N1bWVudEVsZW1lbnR8fGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmZS5lcnJvcigiSW52YWxpZCBYTUw6ICIrYyk7cmV0dXJuIGR9LG5vb3A6ZnVuY3Rpb24oKXt9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYil7YiYmai50ZXN0KGIpJiYoYS5leGVjU2NyaXB0fHxmdW5jdGlvbihiKXthLmV2YWwuY2FsbChhLGIpfSkoYil9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHcsIm1zLSIpLnJlcGxhY2Uodix4KX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT09Yi50b1VwcGVyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZixnPTAsaD1hLmxlbmd0aCxpPWg9PT1ifHxlLmlzRnVuY3Rpb24oYSk7aWYoZCl7aWYoaSl7Zm9yKGYgaW4gYSlpZihjLmFwcGx5KGFbZl0sZCk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmFwcGx5KGFbZysrXSxkKT09PSExKWJyZWFrfWVsc2UgaWYoaSl7Zm9yKGYgaW4gYSlpZihjLmNhbGwoYVtmXSxmLGFbZl0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoO2c8aDspaWYoYy5jYWxsKGFbZ10sZyxhW2crK10pPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06Rz9mdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjpHLmNhbGwoYSl9OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOihhKyIiKS5yZXBsYWNlKGssIiIpLnJlcGxhY2UobCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO2lmKGEhPW51bGwpe3ZhciBkPWUudHlwZShhKTthLmxlbmd0aD09bnVsbHx8ZD09PSJzdHJpbmcifHxkPT09ImZ1bmN0aW9uInx8ZD09PSJyZWdleHAifHxlLmlzV2luZG93KGEpP0UuY2FsbChjLGEpOmUubWVyZ2UoYyxhKX1yZXR1cm4gY30saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYil7aWYoSClyZXR1cm4gSC5jYWxsKGIsYSxjKTtkPWIubGVuZ3RoLGM9Yz9jPDA/TWF0aC5tYXgoMCxkK2MpOmM6MDtmb3IoO2M8ZDtjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLmxlbmd0aCxlPTA7aWYodHlwZW9mIGMubGVuZ3RoPT0ibnVtYmVyIilmb3IodmFyIGY9Yy5sZW5ndGg7ZTxmO2UrKylhW2QrK109Y1tlXTtlbHNlIHdoaWxlKGNbZV0hPT1iKWFbZCsrXT1jW2UrK107YS5sZW5ndGg9ZDtyZXR1cm4gYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZTtjPSEhYztmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspZT0hIWIoYVtmXSxmKSxjIT09ZSYmZC5wdXNoKGFbZl0pO3JldHVybiBkfSxtYXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGcsaD1bXSxpPTAsaj1hLmxlbmd0aCxrPWEgaW5zdGFuY2VvZiBlfHxqIT09YiYmdHlwZW9mIGo9PSJudW1iZXIiJiYoaj4wJiZhWzBdJiZhW2otMV18fGo9PT0wfHxlLmlzQXJyYXkoYSkpO2lmKGspZm9yKDtpPGo7aSsrKWY9YyhhW2ldLGksZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO2Vsc2UgZm9yKGcgaW4gYSlmPWMoYVtnXSxnLGQpLGYhPW51bGwmJihoW2gubGVuZ3RoXT1mKTtyZXR1cm4gaC5jb25jYXQuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGMpe2lmKHR5cGVvZiBjPT0ic3RyaW5nIil7dmFyIGQ9YVtjXTtjPWEsYT1kfWlmKCFlLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGI7dmFyIGY9Ri5jYWxsKGFyZ3VtZW50cywyKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYyxmLmNvbmNhdChGLmNhbGwoYXJndW1lbnRzKSkpfTtnLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8Zy5ndWlkfHxlLmd1aWQrKztyZXR1cm4gZ30sYWNjZXNzOmZ1bmN0aW9uKGEsYyxkLGYsZyxoLGkpe3ZhciBqLGs9ZD09bnVsbCxsPTAsbT1hLmxlbmd0aDtpZihkJiZ0eXBlb2YgZD09Im9iamVjdCIpe2ZvcihsIGluIGQpZS5hY2Nlc3MoYSxjLGwsZFtsXSwxLGgsZik7Zz0xfWVsc2UgaWYoZiE9PWIpe2o9aT09PWImJmUuaXNGdW5jdGlvbihmKSxrJiYoaj8oaj1jLGM9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwoZShhKSxjKX0pOihjLmNhbGwoYSxmKSxjPW51bGwpKTtpZihjKWZvcig7bDxtO2wrKyljKGFbbF0sZCxqP2YuY2FsbChhW2xdLGwsYyhhW2xdLGQpKTpmLGkpO2c9MX1yZXR1cm4gZz9hOms/Yy5jYWxsKGEpOm0/YyhhWzBdLGQpOmh9LG5vdzpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSx1YU1hdGNoOmZ1bmN0aW9uKGEpe2E9YS50b0xvd2VyQ2FzZSgpO3ZhciBiPXIuZXhlYyhhKXx8cy5leGVjKGEpfHx0LmV4ZWMoYSl8fGEuaW5kZXhPZigiY29tcGF0aWJsZSIpPDAmJnUuZXhlYyhhKXx8W107cmV0dXJue2Jyb3dzZXI6YlsxXXx8IiIsdmVyc2lvbjpiWzJdfHwiMCJ9fSxzdWI6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIsYyl7cmV0dXJuIG5ldyBhLmZuLmluaXQoYixjKX1lLmV4dGVuZCghMCxhLHRoaXMpLGEuc3VwZXJjbGFzcz10aGlzLGEuZm49YS5wcm90b3R5cGU9dGhpcygpLGEuZm4uY29uc3RydWN0b3I9YSxhLnN1Yj10aGlzLnN1YixhLmZuLmluaXQ9ZnVuY3Rpb24oZCxmKXtmJiZmIGluc3RhbmNlb2YgZSYmIShmIGluc3RhbmNlb2YgYSkmJihmPWEoZikpO3JldHVybiBlLmZuLmluaXQuY2FsbCh0aGlzLGQsZixiKX0sYS5mbi5pbml0LnByb3RvdHlwZT1hLmZuO3ZhciBiPWEoYyk7cmV0dXJuIGF9LGJyb3dzZXI6e319KSxlLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtJWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pLHo9ZS51YU1hdGNoKHkpLHouYnJvd3NlciYmKGUuYnJvd3Nlclt6LmJyb3dzZXJdPSEwLGUuYnJvd3Nlci52ZXJzaW9uPXoudmVyc2lvbiksZS5icm93c2VyLndlYmtpdCYmKGUuYnJvd3Nlci5zYWZhcmk9ITApLGoudGVzdCgiwqAiKSYmKGs9L15bXHNceEEwXSsvLGw9L1tcc1x4QTBdKyQvKSxoPWUoYyksYy5hZGRFdmVudExpc3RlbmVyP0I9ZnVuY3Rpb24oKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIsITEpLGUucmVhZHkoKX06Yy5hdHRhY2hFdmVudCYmKEI9ZnVuY3Rpb24oKXtjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoYy5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxlLnJlYWR5KCkpfSk7cmV0dXJuIGV9KCksZz17fTtmLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPWE/Z1thXXx8aChhKTp7fTt2YXIgYz1bXSxkPVtdLGUsaSxqLGssbCxtLG49ZnVuY3Rpb24oYil7dmFyIGQsZSxnLGgsaTtmb3IoZD0wLGU9Yi5sZW5ndGg7ZDxlO2QrKylnPWJbZF0saD1mLnR5cGUoZyksaD09PSJhcnJheSI/bihnKTpoPT09ImZ1bmN0aW9uIiYmKCFhLnVuaXF1ZXx8IXAuaGFzKGcpKSYmYy5wdXNoKGcpfSxvPWZ1bmN0aW9uKGIsZil7Zj1mfHxbXSxlPSFhLm1lbW9yeXx8W2IsZl0saT0hMCxqPSEwLG09a3x8MCxrPTAsbD1jLmxlbmd0aDtmb3IoO2MmJm08bDttKyspaWYoY1ttXS5hcHBseShiLGYpPT09ITEmJmEuc3RvcE9uRmFsc2Upe2U9ITA7YnJlYWt9aj0hMSxjJiYoYS5vbmNlP2U9PT0hMD9wLmRpc2FibGUoKTpjPVtdOmQmJmQubGVuZ3RoJiYoZT1kLnNoaWZ0KCkscC5maXJlV2l0aChlWzBdLGVbMV0pKSl9LHA9e2FkZDpmdW5jdGlvbigpe2lmKGMpe3ZhciBhPWMubGVuZ3RoO24oYXJndW1lbnRzKSxqP2w9Yy5sZW5ndGg6ZSYmZSE9PSEwJiYoaz1hLG8oZVswXSxlWzFdKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe2lmKGMpe3ZhciBiPWFyZ3VtZW50cyxkPTAsZT1iLmxlbmd0aDtmb3IoO2Q8ZTtkKyspZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspaWYoYltkXT09PWNbZl0pe2omJmY8PWwmJihsLS0sZjw9bSYmbS0tKSxjLnNwbGljZShmLS0sMSk7aWYoYS51bmlxdWUpYnJlYWt9fXJldHVybiB0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7aWYoYyl7dmFyIGI9MCxkPWMubGVuZ3RoO2Zvcig7YjxkO2IrKylpZihhPT09Y1tiXSlyZXR1cm4hMH1yZXR1cm4hMX0sZW1wdHk6ZnVuY3Rpb24oKXtjPVtdO3JldHVybiB0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7Yz1kPWU9YjtyZXR1cm4gdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hY30sbG9jazpmdW5jdGlvbigpe2Q9YiwoIWV8fGU9PT0hMCkmJnAuZGlzYWJsZSgpO3JldHVybiB0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hZH0sZmlyZVdpdGg6ZnVuY3Rpb24oYixjKXtkJiYoaj9hLm9uY2V8fGQucHVzaChbYixjXSk6KCFhLm9uY2V8fCFlKSYmbyhiLGMpKTtyZXR1cm4gdGhpc30sZmlyZTpmdW5jdGlvbigpe3AuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhaX19O3JldHVybiBwfTt2YXIgaT1bXS5zbGljZTtmLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYz1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxkPWYuQ2FsbGJhY2tzKCJtZW1vcnkiKSxlPSJwZW5kaW5nIixnPXtyZXNvbHZlOmIscmVqZWN0OmMsbm90aWZ5OmR9LGg9e2RvbmU6Yi5hZGQsZmFpbDpjLmFkZCxwcm9ncmVzczpkLmFkZCxzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBlfSxpc1Jlc29sdmVkOmIuZmlyZWQsaXNSZWplY3RlZDpjLmZpcmVkLHRoZW46ZnVuY3Rpb24oYSxiLGMpe2kuZG9uZShhKS5mYWlsKGIpLnByb2dyZXNzKGMpO3JldHVybiB0aGlzfSxhbHdheXM6ZnVuY3Rpb24oKXtpLmRvbmUuYXBwbHkoaSxhcmd1bWVudHMpLmZhaWwuYXBwbHkoaSxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxwaXBlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5EZWZlcnJlZChmdW5jdGlvbihkKXtmLmVhY2goe2RvbmU6W2EsInJlc29sdmUiXSxmYWlsOltiLCJyZWplY3QiXSxwcm9ncmVzczpbYywibm90aWZ5Il19LGZ1bmN0aW9uKGEsYil7dmFyIGM9YlswXSxlPWJbMV0sZztmLmlzRnVuY3Rpb24oYyk/aVthXShmdW5jdGlvbigpe2c9Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyksZyYmZi5pc0Z1bmN0aW9uKGcucHJvbWlzZSk/Zy5wcm9taXNlKCkudGhlbihkLnJlc29sdmUsZC5yZWplY3QsZC5ub3RpZnkpOmRbZSsiV2l0aCJdKHRoaXM9PT1pP2Q6dGhpcyxbZ10pfSk6aVthXShkW2VdKX0pfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpYT1oO2Vsc2UgZm9yKHZhciBiIGluIGgpYVtiXT1oW2JdO3JldHVybiBhfX0saT1oLnByb21pc2Uoe30pLGo7Zm9yKGogaW4gZylpW2pdPWdbal0uZmlyZSxpW2orIldpdGgiXT1nW2pdLmZpcmVXaXRoO2kuZG9uZShmdW5jdGlvbigpe2U9InJlc29sdmVkIn0sYy5kaXNhYmxlLGQubG9jaykuZmFpbChmdW5jdGlvbigpe2U9InJlamVjdGVkIn0sYi5kaXNhYmxlLGQubG9jayksYSYmYS5jYWxsKGksaSk7cmV0dXJuIGl9LHdoZW46ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gbShhKXtyZXR1cm4gZnVuY3Rpb24oYil7ZVthXT1hcmd1bWVudHMubGVuZ3RoPjE/aS5jYWxsKGFyZ3VtZW50cywwKTpiLGoubm90aWZ5V2l0aChrLGUpfX1mdW5jdGlvbiBsKGEpe3JldHVybiBmdW5jdGlvbihjKXtiW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9pLmNhbGwoYXJndW1lbnRzLDApOmMsLS1nfHxqLnJlc29sdmVXaXRoKGosYil9fXZhciBiPWkuY2FsbChhcmd1bWVudHMsMCksYz0wLGQ9Yi5sZW5ndGgsZT1BcnJheShkKSxnPWQsaD1kLGo9ZDw9MSYmYSYmZi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YTpmLkRlZmVycmVkKCksaz1qLnByb21pc2UoKTtpZihkPjEpe2Zvcig7YzxkO2MrKyliW2NdJiZiW2NdLnByb21pc2UmJmYuaXNGdW5jdGlvbihiW2NdLnByb21pc2UpP2JbY10ucHJvbWlzZSgpLnRoZW4obChjKSxqLnJlamVjdCxtKGMpKTotLWc7Z3x8ai5yZXNvbHZlV2l0aChqLGIpfWVsc2UgaiE9PWEmJmoucmVzb2x2ZVdpdGgoaixkP1thXTpbXSk7cmV0dXJuIGt9fSksZi5zdXBwb3J0PWZ1bmN0aW9uKCl7dmFyIGIsZCxlLGcsaCxpLGosayxsLG0sbixvLHA9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxxPWMuZG9jdW1lbnRFbGVtZW50O3Auc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IikscC5pbm5lckhUTUw9IiAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYScgc3R5bGU9J3RvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41NTsnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxlPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTtpZighZHx8IWQubGVuZ3RofHwhZSlyZXR1cm57fTtnPWMuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksaD1nLmFwcGVuZENoaWxkKGMuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGk9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxiPXtsZWFkaW5nV2hpdGVzcGFjZTpwLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0zLHRib2R5OiFwLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovdG9wLy50ZXN0KGUuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDplLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5Oi9eMC41NS8udGVzdChlLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhZS5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmkudmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmguc2VsZWN0ZWQsZ2V0U2V0QXR0cmlidXRlOnAuY2xhc3NOYW1lIT09InQiLGVuY3R5cGU6ISFjLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGh0bWw1Q2xvbmU6Yy5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCE9PSI8Om5hdj48LzpuYXY+IixzdWJtaXRCdWJibGVzOiEwLGNoYW5nZUJ1YmJsZXM6ITAsZm9jdXNpbkJ1YmJsZXM6ITEsZGVsZXRlRXhwYW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLHJlbGlhYmxlTWFyZ2luUmlnaHQ6ITAscGl4ZWxNYXJnaW46ITB9LGYuYm94TW9kZWw9Yi5ib3hNb2RlbD1jLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCIsaS5jaGVja2VkPSEwLGIubm9DbG9uZUNoZWNrZWQ9aS5jbG9uZU5vZGUoITApLmNoZWNrZWQsZy5kaXNhYmxlZD0hMCxiLm9wdERpc2FibGVkPSFoLmRpc2FibGVkO3RyeXtkZWxldGUgcC50ZXN0fWNhdGNoKHIpe2IuZGVsZXRlRXhwYW5kbz0hMX0hcC5hZGRFdmVudExpc3RlbmVyJiZwLmF0dGFjaEV2ZW50JiZwLmZpcmVFdmVudCYmKHAuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7Yi5ub0Nsb25lRXZlbnQ9ITF9KSxwLmNsb25lTm9kZSghMCkuZmlyZUV2ZW50KCJvbmNsaWNrIikpLGk9Yy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGkudmFsdWU9InQiLGkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxiLnJhZGlvVmFsdWU9aS52YWx1ZT09PSJ0IixpLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxpLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxwLmFwcGVuZENoaWxkKGkpLGo9Yy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksai5hcHBlbmRDaGlsZChwLmxhc3RDaGlsZCksYi5jaGVja0Nsb25lPWouY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGIuYXBwZW5kQ2hlY2tlZD1pLmNoZWNrZWQsai5yZW1vdmVDaGlsZChpKSxqLmFwcGVuZENoaWxkKHApO2lmKHAuYXR0YWNoRXZlbnQpZm9yKG4gaW57c3VibWl0OjEsY2hhbmdlOjEsZm9jdXNpbjoxfSltPSJvbiIrbixvPW0gaW4gcCxvfHwocC5zZXRBdHRyaWJ1dGUobSwicmV0dXJuOyIpLG89dHlwZW9mIHBbbV09PSJmdW5jdGlvbiIpLGJbbisiQnViYmxlcyJdPW87ai5yZW1vdmVDaGlsZChwKSxqPWc9aD1wPWk9bnVsbCxmKGZ1bmN0aW9uKCl7dmFyIGQsZSxnLGgsaSxqLGwsbSxuLHEscixzLHQsdT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07IXV8fChtPTEsdD0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjoiLHI9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsiLHM9dCsiMDt2aXNpYmlsaXR5OmhpZGRlbjsiLG49InN0eWxlPSciK3IrdCsiNXB4IHNvbGlkICMwMDA7IixxPSI8ZGl2ICIrbisiZGlzcGxheTpibG9jazsnPjxkaXYgc3R5bGU9JyIrdCsiMDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjsnPjwvZGl2PjwvZGl2PiIrIjx0YWJsZSAiK24rIicgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz4iKyI8dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiIsZD1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD1zKyJ3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOiIrbSsicHgiLHUuaW5zZXJ0QmVmb3JlKGQsdS5maXJzdENoaWxkKSxwPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5hcHBlbmRDaGlsZChwKSxwLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQgc3R5bGU9JyIrdCsiMDtkaXNwbGF5Om5vbmUnPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGs9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxvPWtbMF0ub2Zmc2V0SGVpZ2h0PT09MCxrWzBdLnN0eWxlLmRpc3BsYXk9IiIsa1sxXS5zdHlsZS5kaXNwbGF5PSJub25lIixiLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1vJiZrWzBdLm9mZnNldEhlaWdodD09PTAsYS5nZXRDb21wdXRlZFN0eWxlJiYocC5pbm5lckhUTUw9IiIsbD1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGwuc3R5bGUud2lkdGg9IjAiLGwuc3R5bGUubWFyZ2luUmlnaHQ9IjAiLHAuc3R5bGUud2lkdGg9IjJweCIscC5hcHBlbmRDaGlsZChsKSxiLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChhLmdldENvbXB1dGVkU3R5bGUobCxudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCksdHlwZW9mIHAuc3R5bGUuem9vbSE9InVuZGVmaW5lZCImJihwLmlubmVySFRNTD0iIixwLnN0eWxlLndpZHRoPXAuc3R5bGUucGFkZGluZz0iMXB4IixwLnN0eWxlLmJvcmRlcj0wLHAuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIscC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiLHAuc3R5bGUuem9vbT0xLGIuaW5saW5lQmxvY2tOZWVkc0xheW91dD1wLm9mZnNldFdpZHRoPT09MyxwLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixwLnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIixwLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nd2lkdGg6NXB4Oyc+PC9kaXY+IixiLnNocmlua1dyYXBCbG9ja3M9cC5vZmZzZXRXaWR0aCE9PTMpLHAuc3R5bGUuY3NzVGV4dD1yK3MscC5pbm5lckhUTUw9cSxlPXAuZmlyc3RDaGlsZCxnPWUuZmlyc3RDaGlsZCxpPWUubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkLGo9e2RvZXNOb3RBZGRCb3JkZXI6Zy5vZmZzZXRUb3AhPT01LGRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzOmkub2Zmc2V0VG9wPT09NX0sZy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGcuc3R5bGUudG9wPSIyMHB4IixqLmZpeGVkUG9zaXRpb249Zy5vZmZzZXRUb3A9PT0yMHx8Zy5vZmZzZXRUb3A9PT0xNSxnLnN0eWxlLnBvc2l0aW9uPWcuc3R5bGUudG9wPSIiLGUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGouc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlPWcub2Zmc2V0VG9wPT09LTUsai5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD11Lm9mZnNldFRvcCE9PW0sYS5nZXRDb21wdXRlZFN0eWxlJiYocC5zdHlsZS5tYXJnaW5Ub3A9IjElIixiLnBpeGVsTWFyZ2luPShhLmdldENvbXB1dGVkU3R5bGUocCxudWxsKXx8e21hcmdpblRvcDowfSkubWFyZ2luVG9wIT09IjElIiksdHlwZW9mIGQuc3R5bGUuem9vbSE9InVuZGVmaW5lZCImJihkLnN0eWxlLnpvb209MSksdS5yZW1vdmVDaGlsZChkKSxsPXA9ZD1udWxsLGYuZXh0ZW5kKGIsaikpfSk7cmV0dXJuIGJ9KCk7dmFyIGo9L14oPzpcey4qXH18XFsuKlxdKSQvLGs9LyhbQS1aXSkvZztmLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKGYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXthPWEubm9kZVR5cGU/Zi5jYWNoZVthW2YuZXhwYW5kb11dOmFbZi5leHBhbmRvXTtyZXR1cm4hIWEmJiFtKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZyxoLGksaj1mLmV4cGFuZG8saz10eXBlb2YgYz09InN0cmluZyIsbD1hLm5vZGVUeXBlLG09bD9mLmNhY2hlOmEsbj1sP2Fbal06YVtqXSYmaixvPWM9PT0iZXZlbnRzIjtpZigoIW58fCFtW25dfHwhbyYmIWUmJiFtW25dLmRhdGEpJiZrJiZkPT09YilyZXR1cm47bnx8KGw/YVtqXT1uPSsrZi51dWlkOm49aiksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtoXTpoO2lmKCFqW2tdKXJldHVybjtpZihiKXtkPWM/altrXTpqW2tdLmRhdGE7aWYoZCl7Zi5pc0FycmF5KGIpfHwoYiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSkpO2ZvcihlPTAsZz1iLmxlbmd0aDtlPGc7ZSsrKWRlbGV0ZSBkW2JbZV1dO2lmKCEoYz9tOmYuaXNFbXB0eU9iamVjdCkoZCkpcmV0dXJufX1pZighYyl7ZGVsZXRlIGpba10uZGF0YTtpZighbShqW2tdKSlyZXR1cm59Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fCFqLnNldEludGVydmFsP2RlbGV0ZSBqW2tdOmpba109bnVsbCxpJiYoZi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8/ZGVsZXRlIGFbaF06YS5yZW1vdmVBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoaCk6YVtoXT1udWxsKX19LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kYXRhKGEsYixjLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1mLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuIGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9cmV0dXJuITB9fSksZi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGcsaCxpLGo9dGhpc1swXSxrPTAsbT1udWxsO2lmKGE9PT1iKXtpZih0aGlzLmxlbmd0aCl7bT1mLmRhdGEoaik7aWYoai5ub2RlVHlwZT09PTEmJiFmLl9kYXRhKGosInBhcnNlZEF0dHJzIikpe2c9ai5hdHRyaWJ1dGVzO2ZvcihpPWcubGVuZ3RoO2s8aTtrKyspaD1nW2tdLm5hbWUsaC5pbmRleE9mKCJkYXRhLSIpPT09MCYmKGg9Zi5jYW1lbENhc2UoaC5zdWJzdHJpbmcoNSkpLGwoaixoLG1baF0pKTtmLl9kYXRhKGosInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBtfWlmKHR5cGVvZiBhPT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kYXRhKHRoaXMsYSl9KTtkPWEuc3BsaXQoIi4iLDIpLGRbMV09ZFsxXT8iLiIrZFsxXToiIixlPWRbMV0rIiEiO3JldHVybiBmLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGMpe2lmKGM9PT1iKXttPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2UsW2RbMF1dKSxtPT09YiYmaiYmKG09Zi5kYXRhKGosYSksbT1sKGosYSxtKSk7cmV0dXJuIG09PT1iJiZkWzFdP3RoaXMuZGF0YShkWzBdKTptfWRbMV09Yyx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mKHRoaXMpO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2UsZCksZi5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitlLGQpfSl9LG51bGwsYyxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSksZi5leHRlbmQoe19tYXJrOmZ1bmN0aW9uKGEsYil7YSYmKGI9KGJ8fCJmeCIpKyJtYXJrIixmLl9kYXRhKGEsYiwoZi5fZGF0YShhLGIpfHwwKSsxKSl9LF91bm1hcms6ZnVuY3Rpb24oYSxiLGMpe2EhPT0hMCYmKGM9YixiPWEsYT0hMSk7aWYoYil7Yz1jfHwiZngiO3ZhciBkPWMrIm1hcmsiLGU9YT8wOihmLl9kYXRhKGIsZCl8fDEpLTE7ZT9mLl9kYXRhKGIsZCxlKTooZi5yZW1vdmVEYXRhKGIsZCwhMCksbihiLGMsIm1hcmsiKSl9fSxxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYSl7Yj0oYnx8ImZ4IikrInF1ZXVlIixkPWYuX2RhdGEoYSxiKSxjJiYoIWR8fGYuaXNBcnJheShjKT9kPWYuX2RhdGEoYSxiLGYubWFrZUFycmF5KGMpKTpkLnB1c2goYykpO3JldHVybiBkfHxbXX19LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9Zi5xdWV1ZShhLGIpLGQ9Yy5zaGlmdCgpLGU9e307ZD09PSJpbnByb2dyZXNzIiYmKGQ9Yy5zaGlmdCgpKSxkJiYoYj09PSJmeCImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGYuX2RhdGEoYSxiKyIucnVuIixlKSxkLmNhbGwoYSxmdW5jdGlvbigpe2YuZGVxdWV1ZShhLGIpfSxlKSksYy5sZW5ndGh8fChmLnJlbW92ZURhdGEoYSxiKyJxdWV1ZSAiK2IrIi5ydW4iLCEwKSxuKGEsYiwicXVldWUiKSl9fSksZi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9Mjt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT0iZngiLGQtLSk7aWYoYXJndW1lbnRzLmxlbmd0aDxkKXJldHVybiBmLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIGM9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zi5xdWV1ZSh0aGlzLGEsYyk7YT09PSJmeCImJmJbMF0hPT0iaW5wcm9ncmVzcyImJmYuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7YT1mLmZ4P2YuZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiO3JldHVybiB0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gbSgpey0taHx8ZC5yZXNvbHZlV2l0aChlLFtlXSl9dHlwZW9mIGEhPSJzdHJpbmciJiYoYz1hLGE9YiksYT1hfHwiZngiO3ZhciBkPWYuRGVmZXJyZWQoKSxlPXRoaXMsZz1lLmxlbmd0aCxoPTEsaT1hKyJkZWZlciIsaj1hKyJxdWV1ZSIsaz1hKyJtYXJrIixsO3doaWxlKGctLSlpZihsPWYuZGF0YShlW2ddLGksYiwhMCl8fChmLmRhdGEoZVtnXSxqLGIsITApfHxmLmRhdGEoZVtnXSxrLGIsITApKSYmZi5kYXRhKGVbZ10saSxmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwhMCkpaCsrLGwuYWRkKG0pO20oKTtyZXR1cm4gZC5wcm9taXNlKGMpfX0pO3ZhciBvPS9bXG5cdFxyXS9nLHA9L1xzKy8scT0vXHIvZyxyPS9eKD86YnV0dG9ufGlucHV0KSQvaSxzPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLHQ9L15hKD86cmVhKT8kL2ksdT0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSx2PWYuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUsdyx4LHk7Zi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmLmF0dHIsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9LHByb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7YT1mLnByb3BGaXhbYV18fGE7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPWIsZGVsZXRlIHRoaXNbYV19Y2F0Y2goYyl7fX0pfSxhZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxnLGgsaTtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nIil7Yj1hLnNwbGl0KHApO2ZvcihjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXtlPXRoaXNbY107aWYoZS5ub2RlVHlwZT09PTEpaWYoIWUuY2xhc3NOYW1lJiZiLmxlbmd0aD09PTEpZS5jbGFzc05hbWU9YTtlbHNle2c9IiAiK2UuY2xhc3NOYW1lKyIgIjtmb3IoaD0wLGk9Yi5sZW5ndGg7aDxpO2grKyl+Zy5pbmRleE9mKCIgIitiW2hdKyIgIil8fChnKz1iW2hdKyIgIik7ZS5jbGFzc05hbWU9Zi50cmltKGcpfX19cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxnLGgsaSxqO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmcifHxhPT09Yil7Yz0oYXx8IiIpLnNwbGl0KHApO2ZvcihkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKXtnPXRoaXNbZF07aWYoZy5ub2RlVHlwZT09PTEmJmcuY2xhc3NOYW1lKWlmKGEpe2g9KCIgIitnLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UobywiICIpO2ZvcihpPTAsaj1jLmxlbmd0aDtpPGo7aSsrKWg9aC5yZXBsYWNlKCIgIitjW2ldKyIgIiwiICIpO2cuY2xhc3NOYW1lPWYudHJpbShoKX1lbHNlIGcuY2xhc3NOYW1lPSIifX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYSxkPXR5cGVvZiBiPT0iYm9vbGVhbiI7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7Zih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHRoaXMuY2xhc3NOYW1lLGIpLGIpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGM9PT0ic3RyaW5nIil7dmFyIGUsZz0wLGg9Zih0aGlzKSxpPWIsaj1hLnNwbGl0KHApO3doaWxlKGU9altnKytdKWk9ZD9pOiFoLmhhc0NsYXNzKGUpLGhbaT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGUpfWVsc2UgaWYoYz09PSJ1bmRlZmluZWQifHxjPT09ImJvb2xlYW4iKXRoaXMuY2xhc3NOYW1lJiZmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8YT09PSExPyIiOmYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXt2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7Zm9yKDtjPGQ7YysrKWlmKHRoaXNbY10ubm9kZVR5cGU9PT0xJiYoIiAiK3RoaXNbY10uY2xhc3NOYW1lKyIgIikucmVwbGFjZShvLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxnPXRoaXNbMF07e2lmKCEhYXJndW1lbnRzLmxlbmd0aCl7ZT1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXt2YXIgZz1mKHRoaXMpLGg7aWYodGhpcy5ub2RlVHlwZT09PTEpe2U/aD1hLmNhbGwodGhpcyxkLGcudmFsKCkpOmg9YSxoPT1udWxsP2g9IiI6dHlwZW9mIGg9PSJudW1iZXIiP2grPSIiOmYuaXNBcnJheShoKSYmKGg9Zi5tYXAoaCxmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjphKyIifSkpLGM9Zi52YWxIb29rc1t0aGlzLnR5cGVdfHxmLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoIWN8fCEoInNldCJpbiBjKXx8Yy5zZXQodGhpcyxoLCJ2YWx1ZSIpPT09Yil0aGlzLnZhbHVlPWh9fSl9aWYoZyl7Yz1mLnZhbEhvb2tzW2cudHlwZV18fGYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtpZihjJiYiZ2V0ImluIGMmJihkPWMuZ2V0KGcsInZhbHVlIikpIT09YilyZXR1cm4gZDtkPWcudmFsdWU7cmV0dXJuIHR5cGVvZiBkPT0ic3RyaW5nIj9kLnJlcGxhY2UocSwiIik6ZD09bnVsbD8iIjpkfX19fSksZi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWJ8fGIuc3BlY2lmaWVkP2EudmFsdWU6YS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZz1hLnNlbGVjdGVkSW5kZXgsaD1bXSxpPWEub3B0aW9ucyxqPWEudHlwZT09PSJzZWxlY3Qtb25lIjtpZihnPDApcmV0dXJuIG51bGw7Yz1qP2c6MCxkPWo/ZysxOmkubGVuZ3RoO2Zvcig7YzxkO2MrKyl7ZT1pW2NdO2lmKGUuc2VsZWN0ZWQmJihmLnN1cHBvcnQub3B0RGlzYWJsZWQ/IWUuZGlzYWJsZWQ6ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFlLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFmLm5vZGVOYW1lKGUucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2I9ZihlKS52YWwoKTtpZihqKXJldHVybiBiO2gucHVzaChiKX19aWYoaiYmIWgubGVuZ3RoJiZpLmxlbmd0aClyZXR1cm4gZihpW2ddKS52YWwoKTtyZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9Zi5tYWtlQXJyYXkoYik7ZihhKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD1mLmluQXJyYXkoZih0aGlzKS52YWwoKSxjKT49MH0pLGMubGVuZ3RofHwoYS5zZWxlY3RlZEluZGV4PS0xKTtyZXR1cm4gY319fSxhdHRyRm46e3ZhbDohMCxjc3M6ITAsaHRtbDohMCx0ZXh0OiEwLGRhdGE6ITAsd2lkdGg6ITAsaGVpZ2h0OiEwLG9mZnNldDohMH0sYXR0cjpmdW5jdGlvbihhLGMsZCxlKXt2YXIgZyxoLGksaj1hLm5vZGVUeXBlO2lmKCEhYSYmaiE9PTMmJmohPT04JiZqIT09Mil7aWYoZSYmYyBpbiBmLmF0dHJGbilyZXR1cm4gZihhKVtjXShkKTtpZih0eXBlb2YgYS5nZXRBdHRyaWJ1dGU9PSJ1bmRlZmluZWQiKXJldHVybiBmLnByb3AoYSxjLGQpO2k9aiE9PTF8fCFmLmlzWE1MRG9jKGEpLGkmJihjPWMudG9Mb3dlckNhc2UoKSxoPWYuYXR0ckhvb2tzW2NdfHwodS50ZXN0KGMpP3g6dykpO2lmKGQhPT1iKXtpZihkPT09bnVsbCl7Zi5yZW1vdmVBdHRyKGEsYyk7cmV0dXJufWlmKGgmJiJzZXQiaW4gaCYmaSYmKGc9aC5zZXQoYSxkLGMpKSE9PWIpcmV0dXJuIGc7YS5zZXRBdHRyaWJ1dGUoYywiIitkKTtyZXR1cm4gZH1pZihoJiYiZ2V0ImluIGgmJmkmJihnPWguZ2V0KGEsYykpIT09bnVsbClyZXR1cm4gZztnPWEuZ2V0QXR0cmlidXRlKGMpO3JldHVybiBnPT09bnVsbD9iOmd9fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGcsaCxpPTA7aWYoYiYmYS5ub2RlVHlwZT09PTEpe2Q9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtpPGc7aSsrKWU9ZFtpXSxlJiYoYz1mLnByb3BGaXhbZV18fGUsaD11LnRlc3QoZSksaHx8Zi5hdHRyKGEsZSwiIiksYS5yZW1vdmVBdHRyaWJ1dGUodj9lOmMpLGgmJmMgaW4gYSYmKGFbY109ITEpKX19LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoci50ZXN0KGEubm9kZU5hbWUpJiZhLnBhcmVudE5vZGUpZi5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7ZWxzZSBpZighZi5zdXBwb3J0LnJhZGlvVmFsdWUmJmI9PT0icmFkaW8iJiZmLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpO3JldHVybiBifX19LHZhbHVlOntnZXQ6ZnVuY3Rpb24oYSxiKXtpZih3JiZmLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiB3LmdldChhLGIpO3JldHVybiBiIGluIGE/YS52YWx1ZTpudWxsfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuc2V0KGEsYixjKTthLnZhbHVlPWJ9fX0scHJvcEZpeDp7dGFiaW5kZXg6InRhYkluZGV4IixyZWFkb25seToicmVhZE9ubHkiLCJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsY29udGVudGVkaXRhYmxlOiJjb250ZW50RWRpdGFibGUifSxwcm9wOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnLGgsaT1hLm5vZGVUeXBlO2lmKCEhYSYmaSE9PTMmJmkhPT04JiZpIT09Mil7aD1pIT09MXx8IWYuaXNYTUxEb2MoYSksaCYmKGM9Zi5wcm9wRml4W2NdfHxjLGc9Zi5wcm9wSG9va3NbY10pO3JldHVybiBkIT09Yj9nJiYic2V0ImluIGcmJihlPWcuc2V0KGEsZCxjKSkhPT1iP2U6YVtjXT1kOmcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSxjKSkhPT1udWxsP2U6YVtjXX19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP3BhcnNlSW50KGMudmFsdWUsMTApOnMudGVzdChhLm5vZGVOYW1lKXx8dC50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDpifX19fSksZi5hdHRySG9va3MudGFiaW5kZXg9Zi5wcm9wSG9va3MudGFiSW5kZXgseD17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQsZT1mLnByb3AoYSxjKTtyZXR1cm4gZT09PSEwfHx0eXBlb2YgZSE9ImJvb2xlYW4iJiYoZD1hLmdldEF0dHJpYnV0ZU5vZGUoYykpJiZkLm5vZGVWYWx1ZSE9PSExP2MudG9Mb3dlckNhc2UoKTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2I9PT0hMT9mLnJlbW92ZUF0dHIoYSxjKTooZD1mLnByb3BGaXhbY118fGMsZCBpbiBhJiYoYVtkXT0hMCksYS5zZXRBdHRyaWJ1dGUoYyxjLnRvTG93ZXJDYXNlKCkpKTtyZXR1cm4gY319LHZ8fCh5PXtuYW1lOiEwLGlkOiEwLGNvb3JkczohMH0sdz1mLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQ7ZD1hLmdldEF0dHJpYnV0ZU5vZGUoYyk7cmV0dXJuIGQmJih5W2NdP2Qubm9kZVZhbHVlIT09IiI6ZC5zcGVjaWZpZWQpP2Qubm9kZVZhbHVlOmJ9LHNldDpmdW5jdGlvbihhLGIsZCl7dmFyIGU9YS5nZXRBdHRyaWJ1dGVOb2RlKGQpO2V8fChlPWMuY3JlYXRlQXR0cmlidXRlKGQpLGEuc2V0QXR0cmlidXRlTm9kZShlKSk7cmV0dXJuIGUubm9kZVZhbHVlPWIrIiJ9fSxmLmF0dHJIb29rcy50YWJpbmRleC5zZXQ9dy5zZXQsZi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe2YuYXR0ckhvb2tzW2JdPWYuZXh0ZW5kKGYuYXR0ckhvb2tzW2JdLHtzZXQ6ZnVuY3Rpb24oYSxjKXtpZihjPT09IiIpe2Euc2V0QXR0cmlidXRlKGIsImF1dG8iKTtyZXR1cm4gY319fSl9KSxmLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e2dldDp3LmdldCxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2I9PT0iIiYmKGI9ImZhbHNlIiksdy5zZXQoYSxiLGMpfX0pLGYuc3VwcG9ydC5ocmVmTm9ybWFsaXplZHx8Zi5lYWNoKFsiaHJlZiIsInNyYyIsIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxjKXtmLmF0dHJIb29rc1tjXT1mLmV4dGVuZChmLmF0dHJIb29rc1tjXSx7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKGMsMik7cmV0dXJuIGQ9PT1udWxsP2I6ZH19KX0pLGYuc3VwcG9ydC5zdHlsZXx8KGYuYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpfHxifSxzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0PSIiK2J9fSksZi5zdXBwb3J0Lm9wdFNlbGVjdGVkfHwoZi5wcm9wSG9va3Muc2VsZWN0ZWQ9Zi5leHRlbmQoZi5wcm9wSG9va3Muc2VsZWN0ZWQse2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7YiYmKGIuc2VsZWN0ZWRJbmRleCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KTtyZXR1cm4gbnVsbH19KSksZi5zdXBwb3J0LmVuY3R5cGV8fChmLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKSxmLnN1cHBvcnQuY2hlY2tPbnx8Zi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjphLnZhbHVlfX19KSxmLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtmLnZhbEhvb2tzW3RoaXNdPWYuZXh0ZW5kKGYudmFsSG9va3NbdGhpc10se3NldDpmdW5jdGlvbihhLGIpe2lmKGYuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPWYuaW5BcnJheShmKGEpLnZhbCgpLGIpPj0wfX0pfSk7dmFyIHo9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLEE9L14oW15cLl0qKT8oPzpcLiguKykpPyQvLEI9Lyg/Ol58XHMpaG92ZXIoXC5cUyspP1xiLyxDPS9ea2V5LyxEPS9eKD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLyxFPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxGPS9eKFx3KikoPzojKFtcd1wtXSspKT8oPzpcLihbXHdcLV0rKSk/JC8sRz1mdW5jdGlvbigNCi1hKXt2YXIgYj1GLmV4ZWMoYSk7YiYmKGJbMV09KGJbMV18fCIiKS50b0xvd2VyQ2FzZSgpLGJbM109YlszXSYmbmV3IFJlZ0V4cCgiKD86XnxcXHMpIitiWzNdKyIoPzpcXHN8JCkiKSk7cmV0dXJuIGJ9LEg9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmF0dHJpYnV0ZXN8fHt9O3JldHVybighYlsxXXx8YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09YlsxXSkmJighYlsyXXx8KGMuaWR8fHt9KS52YWx1ZT09PWJbMl0pJiYoIWJbM118fGJbM10udGVzdCgoY1siY2xhc3MiXXx8e30pLnZhbHVlKSl9LEk9ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZXZlbnQuc3BlY2lhbC5ob3Zlcj9hOmEucmVwbGFjZShCLCJtb3VzZWVudGVyJDEgbW91c2VsZWF2ZSQxIil9O2YuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OHx8IWN8fCFkfHwhKGg9Zi5fZGF0YShhKSkpKXtkLmhhbmRsZXImJihwPWQsZD1wLmhhbmRsZXIsZz1wLnNlbGVjdG9yKSxkLmd1aWR8fChkLmd1aWQ9Zi5ndWlkKyspLGo9aC5ldmVudHMsanx8KGguZXZlbnRzPWo9e30pLGk9aC5oYW5kbGUsaXx8KGguaGFuZGxlPWk9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBmIT0idW5kZWZpbmVkIiYmKCFhfHxmLmV2ZW50LnRyaWdnZXJlZCE9PWEudHlwZSk/Zi5ldmVudC5kaXNwYXRjaC5hcHBseShpLmVsZW0sYXJndW1lbnRzKTpifSxpLmVsZW09YSksYz1mLnRyaW0oSShjKSkuc3BsaXQoIiAiKTtmb3Ioaz0wO2s8Yy5sZW5ndGg7aysrKXtsPUEuZXhlYyhjW2tdKXx8W10sbT1sWzFdLG49KGxbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxzPWYuZXZlbnQuc3BlY2lhbFttXXx8e30sbT0oZz9zLmRlbGVnYXRlVHlwZTpzLmJpbmRUeXBlKXx8bSxzPWYuZXZlbnQuc3BlY2lhbFttXXx8e30sbz1mLmV4dGVuZCh7dHlwZTptLG9yaWdUeXBlOmxbMV0sZGF0YTplLGhhbmRsZXI6ZCxndWlkOmQuZ3VpZCxzZWxlY3RvcjpnLHF1aWNrOmcmJkcoZyksbmFtZXNwYWNlOm4uam9pbigiLiIpfSxwKSxyPWpbbV07aWYoIXIpe3I9alttXT1bXSxyLmRlbGVnYXRlQ291bnQ9MDtpZighcy5zZXR1cHx8cy5zZXR1cC5jYWxsKGEsZSxuLGkpPT09ITEpYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihtLGksITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIittLGkpfXMuYWRkJiYocy5hZGQuY2FsbChhLG8pLG8uaGFuZGxlci5ndWlkfHwoby5oYW5kbGVyLmd1aWQ9ZC5ndWlkKSksZz9yLnNwbGljZShyLmRlbGVnYXRlQ291bnQrKywwLG8pOnIucHVzaChvKSxmLmV2ZW50Lmdsb2JhbFttXT0hMH1hPW51bGx9fSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGc9Zi5oYXNEYXRhKGEpJiZmLl9kYXRhKGEpLGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEhZyYmISEobz1nLmV2ZW50cykpe2I9Zi50cmltKEkoYnx8IiIpKS5zcGxpdCgiICIpO2ZvcihoPTA7aDxiLmxlbmd0aDtoKyspe2k9QS5leGVjKGJbaF0pfHxbXSxqPWs9aVsxXSxsPWlbMl07aWYoIWope2ZvcihqIGluIG8pZi5ldmVudC5yZW1vdmUoYSxqK2JbaF0sYyxkLCEwKTtjb250aW51ZX1wPWYuZXZlbnQuc3BlY2lhbFtqXXx8e30saj0oZD9wLmRlbGVnYXRlVHlwZTpwLmJpbmRUeXBlKXx8aixyPW9bal18fFtdLG09ci5sZW5ndGgsbD1sP25ldyBSZWdFeHAoIihefFxcLikiK2wuc3BsaXQoIi4iKS5zb3J0KCkuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbDtmb3Iobj0wO248ci5sZW5ndGg7bisrKXM9cltuXSwoZXx8az09PXMub3JpZ1R5cGUpJiYoIWN8fGMuZ3VpZD09PXMuZ3VpZCkmJighbHx8bC50ZXN0KHMubmFtZXNwYWNlKSkmJighZHx8ZD09PXMuc2VsZWN0b3J8fGQ9PT0iKioiJiZzLnNlbGVjdG9yKSYmKHIuc3BsaWNlKG4tLSwxKSxzLnNlbGVjdG9yJiZyLmRlbGVnYXRlQ291bnQtLSxwLnJlbW92ZSYmcC5yZW1vdmUuY2FsbChhLHMpKTtyLmxlbmd0aD09PTAmJm0hPT1yLmxlbmd0aCYmKCghcC50ZWFyZG93bnx8cC50ZWFyZG93bi5jYWxsKGEsbCk9PT0hMSkmJmYucmVtb3ZlRXZlbnQoYSxqLGcuaGFuZGxlKSxkZWxldGUgb1tqXSl9Zi5pc0VtcHR5T2JqZWN0KG8pJiYocT1nLmhhbmRsZSxxJiYocS5lbGVtPW51bGwpLGYucmVtb3ZlRGF0YShhLFsiZXZlbnRzIiwiaGFuZGxlIl0sITApKX19LGN1c3RvbUV2ZW50OntnZXREYXRhOiEwLHNldERhdGE6ITAsY2hhbmdlRGF0YTohMH0sdHJpZ2dlcjpmdW5jdGlvbihjLGQsZSxnKXtpZighZXx8ZS5ub2RlVHlwZSE9PTMmJmUubm9kZVR5cGUhPT04KXt2YXIgaD1jLnR5cGV8fGMsaT1bXSxqLGssbCxtLG4sbyxwLHEscixzO2lmKEUudGVzdChoK2YuZXZlbnQudHJpZ2dlcmVkKSlyZXR1cm47aC5pbmRleE9mKCIhIik+PTAmJihoPWguc2xpY2UoMCwtMSksaz0hMCksaC5pbmRleE9mKCIuIik+PTAmJihpPWguc3BsaXQoIi4iKSxoPWkuc2hpZnQoKSxpLnNvcnQoKSk7aWYoKCFlfHxmLmV2ZW50LmN1c3RvbUV2ZW50W2hdKSYmIWYuZXZlbnQuZ2xvYmFsW2hdKXJldHVybjtjPXR5cGVvZiBjPT0ib2JqZWN0Ij9jW2YuZXhwYW5kb10/YzpuZXcgZi5FdmVudChoLGMpOm5ldyBmLkV2ZW50KGgpLGMudHlwZT1oLGMuaXNUcmlnZ2VyPSEwLGMuZXhjbHVzaXZlPWssYy5uYW1lc3BhY2U9aS5qb2luKCIuIiksYy5uYW1lc3BhY2VfcmU9Yy5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIraS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTpudWxsLG89aC5pbmRleE9mKCI6Iik8MD8ib24iK2g6IiI7aWYoIWUpe2o9Zi5jYWNoZTtmb3IobCBpbiBqKWpbbF0uZXZlbnRzJiZqW2xdLmV2ZW50c1toXSYmZi5ldmVudC50cmlnZ2VyKGMsZCxqW2xdLmhhbmRsZS5lbGVtLCEwKTtyZXR1cm59Yy5yZXN1bHQ9YixjLnRhcmdldHx8KGMudGFyZ2V0PWUpLGQ9ZCE9bnVsbD9mLm1ha2VBcnJheShkKTpbXSxkLnVuc2hpZnQoYykscD1mLmV2ZW50LnNwZWNpYWxbaF18fHt9O2lmKHAudHJpZ2dlciYmcC50cmlnZ2VyLmFwcGx5KGUsZCk9PT0hMSlyZXR1cm47cj1bW2UscC5iaW5kVHlwZXx8aF1dO2lmKCFnJiYhcC5ub0J1YmJsZSYmIWYuaXNXaW5kb3coZSkpe3M9cC5kZWxlZ2F0ZVR5cGV8fGgsbT1FLnRlc3QocytoKT9lOmUucGFyZW50Tm9kZSxuPW51bGw7Zm9yKDttO209bS5wYXJlbnROb2RlKXIucHVzaChbbSxzXSksbj1tO24mJm49PT1lLm93bmVyRG9jdW1lbnQmJnIucHVzaChbbi5kZWZhdWx0Vmlld3x8bi5wYXJlbnRXaW5kb3d8fGEsc10pfWZvcihsPTA7bDxyLmxlbmd0aCYmIWMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtsKyspbT1yW2xdWzBdLGMudHlwZT1yW2xdWzFdLHE9KGYuX2RhdGEobSwiZXZlbnRzIil8fHt9KVtjLnR5cGVdJiZmLl9kYXRhKG0sImhhbmRsZSIpLHEmJnEuYXBwbHkobSxkKSxxPW8mJm1bb10scSYmZi5hY2NlcHREYXRhKG0pJiZxLmFwcGx5KG0sZCk9PT0hMSYmYy5wcmV2ZW50RGVmYXVsdCgpO2MudHlwZT1oLCFnJiYhYy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFwLl9kZWZhdWx0fHxwLl9kZWZhdWx0LmFwcGx5KGUub3duZXJEb2N1bWVudCxkKT09PSExKSYmKGghPT0iY2xpY2sifHwhZi5ub2RlTmFtZShlLCJhIikpJiZmLmFjY2VwdERhdGEoZSkmJm8mJmVbaF0mJihoIT09ImZvY3VzIiYmaCE9PSJibHVyInx8Yy50YXJnZXQub2Zmc2V0V2lkdGghPT0wKSYmIWYuaXNXaW5kb3coZSkmJihuPWVbb10sbiYmKGVbb109bnVsbCksZi5ldmVudC50cmlnZ2VyZWQ9aCxlW2hdKCksZi5ldmVudC50cmlnZ2VyZWQ9YixuJiYoZVtvXT1uKSk7cmV0dXJuIGMucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYyl7Yz1mLmV2ZW50LmZpeChjfHxhLmV2ZW50KTt2YXIgZD0oZi5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30pW2MudHlwZV18fFtdLGU9ZC5kZWxlZ2F0ZUNvdW50LGc9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCksaD0hYy5leGNsdXNpdmUmJiFjLm5hbWVzcGFjZSxpPWYuZXZlbnQuc3BlY2lhbFtjLnR5cGVdfHx7fSxqPVtdLGssbCxtLG4sbyxwLHEscixzLHQsdTtnWzBdPWMsYy5kZWxlZ2F0ZVRhcmdldD10aGlzO2lmKCFpLnByZURpc3BhdGNofHxpLnByZURpc3BhdGNoLmNhbGwodGhpcyxjKSE9PSExKXtpZihlJiYoIWMuYnV0dG9ufHxjLnR5cGUhPT0iY2xpY2siKSl7bj1mKHRoaXMpLG4uY29udGV4dD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXM7Zm9yKG09Yy50YXJnZXQ7bSE9dGhpczttPW0ucGFyZW50Tm9kZXx8dGhpcylpZihtLmRpc2FibGVkIT09ITApe3A9e30scj1bXSxuWzBdPW07Zm9yKGs9MDtrPGU7aysrKXM9ZFtrXSx0PXMuc2VsZWN0b3IscFt0XT09PWImJihwW3RdPXMucXVpY2s/SChtLHMucXVpY2spOm4uaXModCkpLHBbdF0mJnIucHVzaChzKTtyLmxlbmd0aCYmai5wdXNoKHtlbGVtOm0sbWF0Y2hlczpyfSl9fWQubGVuZ3RoPmUmJmoucHVzaCh7ZWxlbTp0aGlzLG1hdGNoZXM6ZC5zbGljZShlKX0pO2ZvcihrPTA7azxqLmxlbmd0aCYmIWMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtrKyspe3E9altrXSxjLmN1cnJlbnRUYXJnZXQ9cS5lbGVtO2ZvcihsPTA7bDxxLm1hdGNoZXMubGVuZ3RoJiYhYy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO2wrKyl7cz1xLm1hdGNoZXNbbF07aWYoaHx8IWMubmFtZXNwYWNlJiYhcy5uYW1lc3BhY2V8fGMubmFtZXNwYWNlX3JlJiZjLm5hbWVzcGFjZV9yZS50ZXN0KHMubmFtZXNwYWNlKSljLmRhdGE9cy5kYXRhLGMuaGFuZGxlT2JqPXMsbz0oKGYuZXZlbnQuc3BlY2lhbFtzLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8cy5oYW5kbGVyKS5hcHBseShxLmVsZW0sZyksbyE9PWImJihjLnJlc3VsdD1vLG89PT0hMSYmKGMucHJldmVudERlZmF1bHQoKSxjLnN0b3BQcm9wYWdhdGlvbigpKSl9fWkucG9zdERpc3BhdGNoJiZpLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYyk7cmV0dXJuIGMucmVzdWx0fX0scHJvcHM6ImF0dHJDaGFuZ2UgYXR0ck5hbWUgcmVsYXRlZE5vZGUgc3JjRWxlbWVudCBhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe2Eud2hpY2g9PW51bGwmJihhLndoaWNoPWIuY2hhckNvZGUhPW51bGw/Yi5jaGFyQ29kZTpiLmtleUNvZGUpO3JldHVybiBhfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxkKXt2YXIgZSxmLGcsaD1kLmJ1dHRvbixpPWQuZnJvbUVsZW1lbnQ7YS5wYWdlWD09bnVsbCYmZC5jbGllbnRYIT1udWxsJiYoZT1hLnRhcmdldC5vd25lckRvY3VtZW50fHxjLGY9ZS5kb2N1bWVudEVsZW1lbnQsZz1lLmJvZHksYS5wYWdlWD1kLmNsaWVudFgrKGYmJmYuc2Nyb2xsTGVmdHx8ZyYmZy5zY3JvbGxMZWZ0fHwwKS0oZiYmZi5jbGllbnRMZWZ0fHxnJiZnLmNsaWVudExlZnR8fDApLGEucGFnZVk9ZC5jbGllbnRZKyhmJiZmLnNjcm9sbFRvcHx8ZyYmZy5zY3JvbGxUb3B8fDApLShmJiZmLmNsaWVudFRvcHx8ZyYmZy5jbGllbnRUb3B8fDApKSwhYS5yZWxhdGVkVGFyZ2V0JiZpJiYoYS5yZWxhdGVkVGFyZ2V0PWk9PT1hLnRhcmdldD9kLnRvRWxlbWVudDppKSwhYS53aGljaCYmaCE9PWImJihhLndoaWNoPWgmMT8xOmgmMj8zOmgmND8yOjApO3JldHVybiBhfX0sZml4OmZ1bmN0aW9uKGEpe2lmKGFbZi5leHBhbmRvXSlyZXR1cm4gYTt2YXIgZCxlLGc9YSxoPWYuZXZlbnQuZml4SG9va3NbYS50eXBlXXx8e30saT1oLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KGgucHJvcHMpOnRoaXMucHJvcHM7YT1mLkV2ZW50KGcpO2ZvcihkPWkubGVuZ3RoO2Q7KWU9aVstLWRdLGFbZV09Z1tlXTthLnRhcmdldHx8KGEudGFyZ2V0PWcuc3JjRWxlbWVudHx8YyksYS50YXJnZXQubm9kZVR5cGU9PT0zJiYoYS50YXJnZXQ9YS50YXJnZXQucGFyZW50Tm9kZSksYS5tZXRhS2V5PT09YiYmKGEubWV0YUtleT1hLmN0cmxLZXkpO3JldHVybiBoLmZpbHRlcj9oLmZpbHRlcihhLGcpOmF9LHNwZWNpYWw6e3JlYWR5OntzZXR1cDpmLmJpbmRSZWFkeX0sbG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOntkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOntkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsYyl7Zi5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9Yyl9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7dGhpcy5vbmJlZm9yZXVubG9hZD09PWImJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWYuZXh0ZW5kKG5ldyBmLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7ZD9mLmV2ZW50LnRyaWdnZXIoZSxudWxsLGIpOmYuZXZlbnQuZGlzcGF0Y2guY2FsbChiLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMucHJldmVudERlZmF1bHQoKX19LGYuZXZlbnQuaGFuZGxlPWYuZXZlbnQuZGlzcGF0Y2gsZi5yZW1vdmVFdmVudD1jLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXthLmRldGFjaEV2ZW50JiZhLmRldGFjaEV2ZW50KCJvbiIrYixjKX0sZi5FdmVudD1mdW5jdGlvbihhLGIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGYuRXZlbnQpKXJldHVybiBuZXcgZi5FdmVudChhLGIpO2EmJmEudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fGEucmV0dXJuVmFsdWU9PT0hMXx8YS5nZXRQcmV2ZW50RGVmYXVsdCYmYS5nZXRQcmV2ZW50RGVmYXVsdCgpP0s6Sik6dGhpcy50eXBlPWEsYiYmZi5leHRlbmQodGhpcyxiKSx0aGlzLnRpbWVTdGFtcD1hJiZhLnRpbWVTdGFtcHx8Zi5ub3coKSx0aGlzW2YuZXhwYW5kb109ITB9LGYuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPUs7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9Szt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7IWF8fChhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9Syx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6Sixpc1Byb3BhZ2F0aW9uU3RvcHBlZDpKLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOkp9LGYuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7Zi5ldmVudC5zcGVjaWFsW2FdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLGQ9YS5yZWxhdGVkVGFyZ2V0LGU9YS5oYW5kbGVPYmosZz1lLnNlbGVjdG9yLGg7aWYoIWR8fGQhPT1jJiYhZi5jb250YWlucyhjLGQpKWEudHlwZT1lLm9yaWdUeXBlLGg9ZS5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YjtyZXR1cm4gaH19fSksZi5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGM9YS50YXJnZXQsZD1mLm5vZGVOYW1lKGMsImlucHV0Iil8fGYubm9kZU5hbWUoYywiYnV0dG9uIik/Yy5mb3JtOmI7ZCYmIWQuX3N1Ym1pdF9hdHRhY2hlZCYmKGYuZXZlbnQuYWRkKGQsInN1Ym1pdC5fc3VibWl0IixmdW5jdGlvbihhKXthLl9zdWJtaXRfYnViYmxlPSEwfSksZC5fc3VibWl0X2F0dGFjaGVkPSEwKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZmLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7aWYoZi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7Zi5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxmLnN1cHBvcnQuY2hhbmdlQnViYmxlc3x8KGYuZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7aWYoei50ZXN0KHRoaXMubm9kZU5hbWUpKXtpZih0aGlzLnR5cGU9PT0iY2hlY2tib3gifHx0aGlzLnR5cGU9PT0icmFkaW8iKWYuZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe2Eub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWU9PT0iY2hlY2tlZCImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksZi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEsZi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLGEsITApKX0pO3JldHVybiExfWYuZXZlbnQuYWRkKHRoaXMsImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3oudGVzdChiLm5vZGVOYW1lKSYmIWIuX2NoYW5nZV9hdHRhY2hlZCYmKGYuZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJiFhLmlzU2ltdWxhdGVkJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksYi5fY2hhbmdlX2F0dGFjaGVkPSEwKX0pfSxoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7aWYodGhpcyE9PWJ8fGEuaXNTaW11bGF0ZWR8fGEuaXNUcmlnZ2VyfHxiLnR5cGUhPT0icmFkaW8iJiZiLnR5cGUhPT0iY2hlY2tib3giKXJldHVybiBhLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpO3JldHVybiB6LnRlc3QodGhpcy5ub2RlTmFtZSl9fSksZi5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHxmLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPWZ1bmN0aW9uKGEpe2YuZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxmLmV2ZW50LmZpeChhKSwhMCl9O2YuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXtkKys9PT0wJiZjLmFkZEV2ZW50TGlzdGVuZXIoYSxlLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXstLWQ9PT0wJiZjLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxlLCEwKX19fSksZi5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaTtpZih0eXBlb2YgYT09Im9iamVjdCIpe3R5cGVvZiBjIT0ic3RyaW5nIiYmKGQ9ZHx8YyxjPWIpO2ZvcihpIGluIGEpdGhpcy5vbihpLGMsZCxhW2ldLGcpO3JldHVybiB0aGlzfWQ9PW51bGwmJmU9PW51bGw/KGU9YyxkPWM9Yik6ZT09bnVsbCYmKHR5cGVvZiBjPT0ic3RyaW5nIj8oZT1kLGQ9Yik6KGU9ZCxkPWMsYz1iKSk7aWYoZT09PSExKWU9SjtlbHNlIGlmKCFlKXJldHVybiB0aGlzO2c9PT0xJiYoaD1lLGU9ZnVuY3Rpb24oYSl7ZigpLm9mZihhKTtyZXR1cm4gaC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZ3VpZD1oLmd1aWR8fChoLmd1aWQ9Zi5ndWlkKyspKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5hZGQodGhpcyxhLGUsZCxjKX0pfSxvbmU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYSxiLGMsZCwxKX0sb2ZmOmZ1bmN0aW9uKGEsYyxkKXtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iail7dmFyIGU9YS5oYW5kbGVPYmo7ZihhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoZS5uYW1lc3BhY2U/ZS5vcmlnVHlwZSsiLiIrZS5uYW1lc3BhY2U6ZS5vcmlnVHlwZSxlLnNlbGVjdG9yLGUuaGFuZGxlcik7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJvYmplY3QiKXtmb3IodmFyIGcgaW4gYSl0aGlzLm9mZihnLGMsYVtnXSk7cmV0dXJuIHRoaXN9aWYoYz09PSExfHx0eXBlb2YgYz09ImZ1bmN0aW9uIilkPWMsYz1iO2Q9PT0hMSYmKGQ9Sik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsYSxkLGMpfSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxsaXZlOmZ1bmN0aW9uKGEsYixjKXtmKHRoaXMuY29udGV4dCkub24oYSx0aGlzLnNlbGVjdG9yLGIsYyk7cmV0dXJuIHRoaXN9LGRpZTpmdW5jdGlvbihhLGIpe2YodGhpcy5jb250ZXh0KS5vZmYoYSx0aGlzLnNlbGVjdG9yfHwiKioiLGIpO3JldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGEsYyl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pcmV0dXJuIGYuZXZlbnQudHJpZ2dlcihhLGIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz1hLmd1aWR8fGYuZ3VpZCsrLGQ9MCxlPWZ1bmN0aW9uKGMpe3ZhciBlPShmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7Zi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZSsxKSxjLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07ZS5ndWlkPWM7d2hpbGUoZDxiLmxlbmd0aCliW2QrK10uZ3VpZD1jO3JldHVybiB0aGlzLmNsaWNrKGUpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxmLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEsYyl7Yz09bnVsbCYmKGM9YSxhPW51bGwpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9LGYuYXR0ckZuJiYoZi5hdHRyRm5bYl09ITApLEMudGVzdChiKSYmKGYuZXZlbnQuZml4SG9va3NbYl09Zi5ldmVudC5rZXlIb29rcyksRC50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oKXtmdW5jdGlvbiB4KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWlmKGoubm9kZVR5cGU9PT0xKXtnfHwoaltkXT1jLGouc2l6c2V0PWgpO2lmKHR5cGVvZiBiIT0ic3RyaW5nIil7aWYoaj09PWIpe2s9ITA7YnJlYWt9fWVsc2UgaWYobS5maWx0ZXIoYixbal0pLmxlbmd0aD4wKXtrPWo7YnJlYWt9fWo9althXX1lW2hdPWt9fX1mdW5jdGlvbiB3KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWoubm9kZVR5cGU9PT0xJiYhZyYmKGpbZF09YyxqLnNpenNldD1oKTtpZihqLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iKXtrPWo7YnJlYWt9aj1qW2FdfWVbaF09a319fXZhciBhPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZD0ic2l6Y2FjaGUiKyhNYXRoLnJhbmRvbSgpKyIiKS5yZXBsYWNlKCIuIiwiIiksZT0wLGc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPSExLGk9ITAsaj0vXFwvZyxrPS9cclxuL2csbD0vXFcvO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtpPSExO3JldHVybiAwfSk7dmFyIG09ZnVuY3Rpb24oYixkLGUsZil7ZT1lfHxbXSxkPWR8fGM7dmFyIGg9ZDtpZihkLm5vZGVUeXBlIT09MSYmZC5ub2RlVHlwZSE9PTkpcmV0dXJuW107aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gZTt2YXIgaSxqLGssbCxuLHEscix0LHU9ITAsdj1tLmlzWE1MKGQpLHc9W10seD1iO2Rve2EuZXhlYygiIiksaT1hLmV4ZWMoeCk7aWYoaSl7eD1pWzNdLHcucHVzaChpWzFdKTtpZihpWzJdKXtsPWlbM107YnJlYWt9fX13aGlsZShpKTtpZih3Lmxlbmd0aD4xJiZwLmV4ZWMoYikpaWYody5sZW5ndGg9PT0yJiZvLnJlbGF0aXZlW3dbMF1dKWo9eSh3WzBdK3dbMV0sZCxmKTtlbHNle2o9by5yZWxhdGl2ZVt3WzBdXT9bZF06bSh3LnNoaWZ0KCksZCk7d2hpbGUody5sZW5ndGgpYj13LnNoaWZ0KCksby5yZWxhdGl2ZVtiXSYmKGIrPXcuc2hpZnQoKSksaj15KGIsaixmKX1lbHNleyFmJiZ3Lmxlbmd0aD4xJiZkLm5vZGVUeXBlPT09OSYmIXYmJm8ubWF0Y2guSUQudGVzdCh3WzBdKSYmIW8ubWF0Y2guSUQudGVzdCh3W3cubGVuZ3RoLTFdKSYmKG49bS5maW5kKHcuc2hpZnQoKSxkLHYpLGQ9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldClbMF06bi5zZXRbMF0pO2lmKGQpe249Zj97ZXhwcjp3LnBvcCgpLHNldDpzKGYpfTptLmZpbmQody5wb3AoKSx3Lmxlbmd0aD09PTEmJih3WzBdPT09In4ifHx3WzBdPT09IisiKSYmZC5wYXJlbnROb2RlP2QucGFyZW50Tm9kZTpkLHYpLGo9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldCk6bi5zZXQsdy5sZW5ndGg+MD9rPXMoaik6dT0hMTt3aGlsZSh3Lmxlbmd0aClxPXcucG9wKCkscj1xLG8ucmVsYXRpdmVbcV0/cj13LnBvcCgpOnE9IiIscj09bnVsbCYmKHI9ZCksby5yZWxhdGl2ZVtxXShrLHIsdil9ZWxzZSBrPXc9W119a3x8KGs9aiksa3x8bS5lcnJvcihxfHxiKTtpZihnLmNhbGwoayk9PT0iW29iamVjdCBBcnJheV0iKWlmKCF1KWUucHVzaC5hcHBseShlLGspO2Vsc2UgaWYoZCYmZC5ub2RlVHlwZT09PTEpZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiYoa1t0XT09PSEwfHxrW3RdLm5vZGVUeXBlPT09MSYmbS5jb250YWlucyhkLGtbdF0pKSYmZS5wdXNoKGpbdF0pO2Vsc2UgZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiZrW3RdLm5vZGVUeXBlPT09MSYmZS5wdXNoKGpbdF0pO2Vsc2UgcyhrLGUpO2wmJihtKGwsaCxlLGYpLG0udW5pcXVlU29ydChlKSk7cmV0dXJuIGV9O20udW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZih1KXtoPWksYS5zb3J0KHUpO2lmKGgpZm9yKHZhciBiPTE7YjxhLmxlbmd0aDtiKyspYVtiXT09PWFbYi0xXSYmYS5zcGxpY2UoYi0tLDEpfXJldHVybiBhfSxtLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShhLG51bGwsbnVsbCxiKX0sbS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShiLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfSxtLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaTtpZighYSlyZXR1cm5bXTtmb3IoZT0wLGY9by5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7aD1vLm9yZGVyW2VdO2lmKGc9by5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7aT1nWzFdLGcuc3BsaWNlKDEsMSk7aWYoaS5zdWJzdHIoaS5sZW5ndGgtMSkhPT0iXFwiKXtnWzFdPShnWzFdfHwiIikucmVwbGFjZShqLCIiKSxkPW8uZmluZFtoXShnLGIsYyk7aWYoZCE9bnVsbCl7YT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7YnJlYWt9fX19ZHx8KGQ9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTpbXSk7cmV0dXJue3NldDpkLGV4cHI6YX19LG0uZmlsdGVyPWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG4scCxxPWEscj1bXSxzPWMsdD1jJiZjWzBdJiZtLmlzWE1MKGNbMF0pO3doaWxlKGEmJmMubGVuZ3RoKXtmb3IoaCBpbiBvLmZpbHRlcilpZigoZj1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKSE9bnVsbCYmZlsyXSl7az1vLmZpbHRlcltoXSxsPWZbMV0sZz0hMSxmLnNwbGljZSgxLDEpO2lmKGwuc3Vic3RyKGwubGVuZ3RoLTEpPT09IlxcIiljb250aW51ZTtzPT09ciYmKHI9W10pO2lmKG8ucHJlRmlsdGVyW2hdKXtmPW8ucHJlRmlsdGVyW2hdKGYscyxkLHIsZSx0KTtpZighZilnPWk9ITA7ZWxzZSBpZihmPT09ITApY29udGludWV9aWYoZilmb3Iobj0wOyhqPXNbbl0pIT1udWxsO24rKylqJiYoaT1rKGosZixuLHMpLHA9ZV5pLGQmJmkhPW51bGw/cD9nPSEwOnNbbl09ITE6cCYmKHIucHVzaChqKSxnPSEwKSk7aWYoaSE9PWIpe2R8fChzPXIpLGE9YS5yZXBsYWNlKG8ubWF0Y2hbaF0sIiIpO2lmKCFnKXJldHVybltdO2JyZWFrfX1pZihhPT09cSlpZihnPT1udWxsKW0uZXJyb3IoYSk7ZWxzZSBicmVhaztxPWF9cmV0dXJuIHN9LG0uZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfTt2YXIgbj1tLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWEubm9kZVR5cGUsZT0iIjtpZihkKXtpZihkPT09MXx8ZD09PTl8fGQ9PT0xMSl7aWYodHlwZW9mIGEudGV4dENvbnRlbnQ9PSJzdHJpbmciKXJldHVybiBhLnRleHRDb250ZW50O2lmKHR5cGVvZiBhLmlubmVyVGV4dD09InN0cmluZyIpcmV0dXJuIGEuaW5uZXJUZXh0LnJlcGxhY2UoaywiIik7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWUrPW4oYSl9ZWxzZSBpZihkPT09M3x8ZD09PTQpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2UgZm9yKGI9MDtjPWFbYl07YisrKWMubm9kZVR5cGUhPT04JiYoZSs9bihjKSk7cmV0dXJuIGV9LG89bS5zZWxlY3RvcnM9e29yZGVyOlsiSUQiLCJOQU1FIiwiVEFHIl0sbWF0Y2g6e0lEOi8jKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxDTEFTUzovXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLE5BTUU6L1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVsnIl0qXF0vLEFUVFI6L1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKD86KFsnIl0pKC4qPylcM3woIz8oPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikqKXwpfClccypcXS8sVEFHOi9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XChccyooZXZlbnxvZGR8KD86WytcLV0/XGQrfCg/OlsrXC1dP1xkKik/blxzKig/OlsrXC1dXHMqXGQrKT8pKVxzKlwpKT8vLFBPUzovOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcKChcZCopXCkpPyg/PVteXC1dfCQpLyxQU0VVRE86LzooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy99LGxlZnRNYXRjaDp7fSxhdHRyTWFwOnsiY2xhc3MiOiJjbGFzc05hbWUiLCJmb3IiOiJodG1sRm9yIn0sYXR0ckhhbmRsZTp7aHJlZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInR5cGUiKX19LHJlbGF0aXZlOnsiKyI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYj09InN0cmluZyIsZD1jJiYhbC50ZXN0KGIpLGU9YyYmIWQ7ZCYmKGI9Yi50b0xvd2VyQ2FzZSgpKTtmb3IodmFyIGY9MCxnPWEubGVuZ3RoLGg7ZjxnO2YrKylpZihoPWFbZl0pe3doaWxlKChoPWgucHJldmlvdXNTaWJsaW5nKSYmaC5ub2RlVHlwZSE9PTEpO2FbZl09ZXx8aCYmaC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yj9ofHwhMTpoPT09Yn1lJiZtLmZpbHRlcihiLGEsITApfSwiPiI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPXR5cGVvZiBiPT0ic3RyaW5nIixlPTAsZj1hLmxlbmd0aDtpZihkJiYhbC50ZXN0KGIpKXtiPWIudG9Mb3dlckNhc2UoKTtmb3IoO2U8ZjtlKyspe2M9YVtlXTtpZihjKXt2YXIgZz1jLnBhcmVudE5vZGU7YVtlXT1nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2c6ITF9fX1lbHNle2Zvcig7ZTxmO2UrKyljPWFbZV0sYyYmKGFbZV09ZD9jLnBhcmVudE5vZGU6Yy5wYXJlbnROb2RlPT09Yik7ZCYmbS5maWx0ZXIoYixhLCEwKX19LCIiOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPWUrKyxnPXg7dHlwZW9mIGI9PSJzdHJpbmciJiYhbC50ZXN0KGIpJiYoYj1iLnRvTG93ZXJDYXNlKCksZD1iLGc9dyksZygicGFyZW50Tm9kZSIsYixmLGEsZCxjKX0sIn4iOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPWUrKyxnPXg7dHlwZW9mIGI9PSJzdHJpbmciJiYhbC50ZXN0KGIpJiYoYj1iLnRvTG93ZXJDYXNlKCksZD1iLGc9dyksZygicHJldmlvdXNTaWJsaW5nIixiLGYsYSxkLGMpfX0sZmluZDp7SUQ6ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWMpe3ZhciBkPWIuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGQmJmQucGFyZW50Tm9kZT9bZF06W119fSxOQU1FOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeU5hbWUhPSJ1bmRlZmluZWQiKXt2YXIgYz1bXSxkPWIuZ2V0RWxlbWVudHNCeU5hbWUoYVsxXSk7Zm9yKHZhciBlPTAsZj1kLmxlbmd0aDtlPGY7ZSsrKWRbZV0uZ2V0QXR0cmlidXRlKCJuYW1lIik9PT1hWzFdJiZjLnB1c2goZFtlXSk7cmV0dXJuIGMubGVuZ3RoPT09MD9udWxsOmN9fSxUQUc6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCIpcmV0dXJuIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSl9fSxwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXthPSIgIithWzFdLnJlcGxhY2UoaiwiIikrIiAiO2lmKGYpcmV0dXJuIGE7Zm9yKHZhciBnPTAsaDsoaD1iW2ddKSE9bnVsbDtnKyspaCYmKGVeKGguY2xhc3NOYW1lJiYoIiAiK2guY2xhc3NOYW1lKyIgIikucmVwbGFjZSgvW1x0XG5ccl0vZywiICIpLmluZGV4T2YoYSk+PTApP2N8fGQucHVzaChoKTpjJiYoYltnXT0hMSkpO3JldHVybiExfSxJRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXS5yZXBsYWNlKGosIiIpfSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVsxXS5yZXBsYWNlKGosIiIpLnRvTG93ZXJDYXNlKCl9LENISUxEOmZ1bmN0aW9uKGEpe2lmKGFbMV09PT0ibnRoIil7YVsyXXx8bS5lcnJvcihhWzBdKSxhWzJdPWFbMl0ucmVwbGFjZSgvXlwrfFxzKi9nLCIiKTt2YXIgYj0vKC0/KShcZCopKD86bihbK1wtXT9cZCopKT8vLmV4ZWMoYVsyXT09PSJldmVuIiYmIjJuInx8YVsyXT09PSJvZGQiJiYiMm4rMSJ8fCEvXEQvLnRlc3QoYVsyXSkmJiIwbisiK2FbMl18fGFbMl0pO2FbMl09YlsxXSsoYlsyXXx8MSktMCxhWzNdPWJbM10tMH1lbHNlIGFbMl0mJm0uZXJyb3IoYVswXSk7YVswXT1lKys7cmV0dXJuIGF9LEFUVFI6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPWFbMV09YVsxXS5yZXBsYWNlKGosIiIpOyFmJiZvLmF0dHJNYXBbZ10mJihhWzFdPW8uYXR0ck1hcFtnXSksYVs0XT0oYVs0XXx8YVs1XXx8IiIpLnJlcGxhY2UoaiwiIiksYVsyXT09PSJ+PSImJihhWzRdPSIgIithWzRdKyIgIik7cmV0dXJuIGF9LFBTRVVETzpmdW5jdGlvbihiLGMsZCxlLGYpe2lmKGJbMV09PT0ibm90IilpZigoYS5leGVjKGJbM10pfHwiIikubGVuZ3RoPjF8fC9eXHcvLnRlc3QoYlszXSkpYlszXT1tKGJbM10sbnVsbCxudWxsLGMpO2Vsc2V7dmFyIGc9bS5maWx0ZXIoYlszXSxjLGQsITBeZik7ZHx8ZS5wdXNoLmFwcGx5KGUsZyk7cmV0dXJuITF9ZWxzZSBpZihvLm1hdGNoLlBPUy50ZXN0KGJbMF0pfHxvLm1hdGNoLkNISUxELnRlc3QoYlswXSkpcmV0dXJuITA7cmV0dXJuIGJ9LFBPUzpmdW5jdGlvbihhKXthLnVuc2hpZnQoITApO3JldHVybiBhfX0sZmlsdGVyczp7ZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExJiZhLnR5cGUhPT0iaGlkZGVuIn0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5jaGVja2VkPT09ITB9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe2EucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7cmV0dXJuIGEuc2VsZWN0ZWQ9PT0hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiEhYS5maXJzdENoaWxkfSxlbXB0eTpmdW5jdGlvbihhKXtyZXR1cm4hYS5maXJzdENoaWxkfSxoYXM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiEhbShjWzNdLGEpLmxlbmd0aH0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybi9oXGQvaS50ZXN0KGEubm9kZU5hbWUpfSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIiksYz1hLnR5cGU7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJ0ZXh0Ij09PWMmJihiPT09Y3x8Yj09PW51bGwpfSxyYWRpbzpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInJhZGlvIj09PWEudHlwZX0sY2hlY2tib3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJjaGVja2JveCI9PT1hLnR5cGV9LGZpbGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJmaWxlIj09PWEudHlwZX0scGFzc3dvcmQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJwYXNzd29yZCI9PT1hLnR5cGV9LHN1Ym1pdDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKGI9PT0iaW5wdXQifHxiPT09ImJ1dHRvbiIpJiYic3VibWl0Ij09PWEudHlwZX0saW1hZ2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJpbWFnZSI9PT1hLnR5cGV9LHJlc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJyZXNldCI9PT1hLnR5cGV9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGI9PT0iaW5wdXQiJiYiYnV0dG9uIj09PWEudHlwZXx8Yj09PSJidXR0b24ifSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4vaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoYS5ub2RlTmFtZSl9LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09YS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9fSxzZXRGaWx0ZXJzOntmaXJzdDpmdW5jdGlvbihhLGIpe3JldHVybiBiPT09MH0sbGFzdDpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYj09PWQubGVuZ3RoLTF9LGV2ZW46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MH0sb2RkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTF9LGx0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYjxjWzNdLTB9LGd0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYj5jWzNdLTB9LG50aDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9LGVxOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn19LGZpbHRlcjp7UFNFVURPOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWJbMV0sZj1vLmZpbHRlcnNbZV07aWYoZilyZXR1cm4gZihhLGMsYixkKTtpZihlPT09ImNvbnRhaW5zIilyZXR1cm4oYS50ZXh0Q29udGVudHx8YS5pbm5lclRleHR8fG4oW2FdKXx8IiIpLmluZGV4T2YoYlszXSk+PTA7aWYoZT09PSJub3QiKXt2YXIgZz1iWzNdO2Zvcih2YXIgaD0wLGk9Zy5sZW5ndGg7aDxpO2grKylpZihnW2hdPT09YSlyZXR1cm4hMTtyZXR1cm4hMH1tLmVycm9yKGUpfSxDSElMRDpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaSxqLGs9YlsxXSxsPWE7c3dpdGNoKGspe2Nhc2Uib25seSI6Y2FzZSJmaXJzdCI6d2hpbGUobD1sLnByZXZpb3VzU2libGluZylpZihsLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtpZihrPT09ImZpcnN0IilyZXR1cm4hMDtsPWE7Y2FzZSJsYXN0Ijp3aGlsZShsPWwubmV4dFNpYmxpbmcpaWYobC5ub2RlVHlwZT09PTEpcmV0dXJuITE7cmV0dXJuITA7Y2FzZSJudGgiOmM9YlsyXSxlPWJbM107aWYoYz09PTEmJmU9PT0wKXJldHVybiEwO2Y9YlswXSxnPWEucGFyZW50Tm9kZTtpZihnJiYoZ1tkXSE9PWZ8fCFhLm5vZGVJbmRleCkpe2k9MDtmb3IobD1nLmZpcnN0Q2hpbGQ7bDtsPWwubmV4dFNpYmxpbmcpbC5ub2RlVHlwZT09PTEmJihsLm5vZGVJbmRleD0rK2kpO2dbZF09Zn1qPWEubm9kZUluZGV4LWU7cmV0dXJuIGM9PT0wP2o9PT0wOmolYz09PTAmJmovYz49MH19LElEOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEubm9kZVR5cGU9PT0xJiZhLmdldEF0dHJpYnV0ZSgiaWQiKT09PWJ9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBiPT09IioiJiZhLm5vZGVUeXBlPT09MXx8ISFhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifSxDTEFTUzpmdW5jdGlvbihhLGIpe3JldHVybigiICIrKGEuY2xhc3NOYW1lfHxhLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkrIiAiKS5pbmRleE9mKGIpPi0xfSxBVFRSOmZ1bmN0aW9uKGEsYil7dmFyIGM9YlsxXSxkPW0uYXR0cj9tLmF0dHIoYSxjKTpvLmF0dHJIYW5kbGVbY10/by5hdHRySGFuZGxlW2NdKGEpOmFbY10hPW51bGw/YVtjXTphLmdldEF0dHJpYnV0ZShjKSxlPWQrIiIsZj1iWzJdLGc9Yls0XTtyZXR1cm4gZD09bnVsbD9mPT09IiE9IjohZiYmbS5hdHRyP2QhPW51bGw6Zj09PSI9Ij9lPT09ZzpmPT09Iio9Ij9lLmluZGV4T2YoZyk+PTA6Zj09PSJ+PSI/KCIgIitlKyIgIikuaW5kZXhPZihnKT49MDpnP2Y9PT0iIT0iP2UhPT1nOmY9PT0iXj0iP2UuaW5kZXhPZihnKT09PTA6Zj09PSIkPSI/ZS5zdWJzdHIoZS5sZW5ndGgtZy5sZW5ndGgpPT09ZzpmPT09Inw9Ij9lPT09Z3x8ZS5zdWJzdHIoMCxnLmxlbmd0aCsxKT09PWcrIi0iOiExOmUmJmQhPT0hMX0sUE9TOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWJbMl0sZj1vLnNldEZpbHRlcnNbZV07aWYoZilyZXR1cm4gZihhLGMsYixkKX19fSxwPW8ubWF0Y2guUE9TLHE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4iXFwiKyhiLTArMSl9O2Zvcih2YXIgciBpbiBvLm1hdGNoKW8ubWF0Y2hbcl09bmV3IFJlZ0V4cChvLm1hdGNoW3JdLnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpLG8ubGVmdE1hdGNoW3JdPW5ldyBSZWdFeHAoLyheKD86LnxccnxcbikqPykvLnNvdXJjZStvLm1hdGNoW3JdLnNvdXJjZS5yZXBsYWNlKC9cXChcZCspL2cscSkpO28ubWF0Y2guZ2xvYmFsUE9TPXA7dmFyIHM9ZnVuY3Rpb24oYSxiKXthPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsMCk7aWYoYil7Yi5wdXNoLmFwcGx5KGIsYSk7cmV0dXJuIGJ9cmV0dXJuIGF9O3RyeXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLDApWzBdLm5vZGVUeXBlfWNhdGNoKHQpe3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9Ynx8W107aWYoZy5jYWxsKGEpPT09IltvYmplY3QgQXJyYXldIilBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkLGEpO2Vsc2UgaWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilmb3IodmFyIGU9YS5sZW5ndGg7YzxlO2MrKylkLnB1c2goYVtjXSk7ZWxzZSBmb3IoO2FbY107YysrKWQucHVzaChhW2NdKTtyZXR1cm4gZH19dmFyIHUsdjtjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj91PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjE7cmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmND8tMToxfToodT1mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXtoPSEwO3JldHVybiAwfWlmKGEuc291cmNlSW5kZXgmJmIuc291cmNlSW5kZXgpcmV0dXJuIGEuc291cmNlSW5kZXgtYi5zb3VyY2VJbmRleDt2YXIgYyxkLGU9W10sZj1bXSxnPWEucGFyZW50Tm9kZSxpPWIucGFyZW50Tm9kZSxqPWc7aWYoZz09PWkpcmV0dXJuIHYoYSxiKTtpZighZylyZXR1cm4tMTtpZighaSlyZXR1cm4gMTt3aGlsZShqKWUudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtqPWk7d2hpbGUoailmLnVuc2hpZnQoaiksaj1qLnBhcmVudE5vZGU7Yz1lLmxlbmd0aCxkPWYubGVuZ3RoO2Zvcih2YXIgaz0wO2s8YyYmazxkO2srKylpZihlW2tdIT09ZltrXSlyZXR1cm4gdihlW2tdLGZba10pO3JldHVybiBrPT09Yz92KGEsZltrXSwtMSk6dihlW2tdLGIsMSl9LHY9ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PT1iKXJldHVybiBjO3ZhciBkPWEubmV4dFNpYmxpbmc7d2hpbGUoZCl7aWYoZD09PWIpcmV0dXJuLTE7ZD1kLm5leHRTaWJsaW5nfXJldHVybiAxfSksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9InNjcmlwdCIrKG5ldyBEYXRlKS5nZXRUaW1lKCksZT1jLmRvY3VtZW50RWxlbWVudDthLmlubmVySFRNTD0iPGEgbmFtZT0nIitkKyInLz4iLGUuaW5zZXJ0QmVmb3JlKGEsZS5maXJzdENoaWxkKSxjLmdldEVsZW1lbnRCeUlkKGQpJiYoby5maW5kLklEPWZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYy5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFkKXt2YXIgZT1jLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBlP2UuaWQ9PT1hWzFdfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT0idW5kZWZpbmVkIiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZT09PWFbMV0/W2VdOmI6W119fSxvLmZpbHRlci5JRD1mdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGEubm9kZVR5cGU9PT0xJiZjJiZjLm5vZGVWYWx1ZT09PWJ9KSxlLnJlbW92ZUNoaWxkKGEpLGU9YT1udWxsfSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmFwcGVuZENoaWxkKGMuY3JlYXRlQ29tbWVudCgiIikpLGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MCYmKG8uZmluZC5UQUc9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pO2lmKGFbMV09PT0iKiIpe3ZhciBkPVtdO2Zvcih2YXIgZT0wO2NbZV07ZSsrKWNbZV0ubm9kZVR5cGU9PT0xJiZkLnB1c2goY1tlXSk7Yz1kfXJldHVybiBjfSksYS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLGEuZmlyc3RDaGlsZCYmdHlwZW9mIGEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPSJ1bmRlZmluZWQiJiZhLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyImJihvLmF0dHJIYW5kbGUuaHJlZj1mdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiLDIpfSksYT1udWxsfSgpLGMucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgYT1tLGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPSJfX3NpenpsZV9fIjtiLmlubmVySFRNTD0iPHAgY2xhc3M9J1RFU1QnPjwvcD4iO2lmKCFiLnF1ZXJ5U2VsZWN0b3JBbGx8fGIucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGghPT0wKXttPWZ1bmN0aW9uKGIsZSxmLGcpe2U9ZXx8YztpZighZyYmIW0uaXNYTUwoZSkpe3ZhciBoPS9eKFx3KyQpfF5cLihbXHdcLV0rJCl8XiMoW1x3XC1dKyQpLy5leGVjKGIpO2lmKGgmJihlLm5vZGVUeXBlPT09MXx8ZS5ub2RlVHlwZT09PTkpKXtpZihoWzFdKXJldHVybiBzKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYiksZik7aWYoaFsyXSYmby5maW5kLkNMQVNTJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGhbMl0pLGYpfWlmKGUubm9kZVR5cGU9PT05KXtpZihiPT09ImJvZHkiJiZlLmJvZHkpcmV0dXJuIHMoW2UuYm9keV0sZik7aWYoaCYmaFszXSl7dmFyIGk9ZS5nZXRFbGVtZW50QnlJZChoWzNdKTtpZighaXx8IWkucGFyZW50Tm9kZSlyZXR1cm4gcyhbXSxmKTtpZihpLmlkPT09aFszXSlyZXR1cm4gcyhbaV0sZil9dHJ5e3JldHVybiBzKGUucXVlcnlTZWxlY3RvckFsbChiKSxmKX1jYXRjaChqKXt9fWVsc2UgaWYoZS5ub2RlVHlwZT09PTEmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXt2YXIgaz1lLGw9ZS5nZXRBdHRyaWJ1dGUoImlkIiksbj1sfHxkLHA9ZS5wYXJlbnROb2RlLHE9L15ccypbK35dLy50ZXN0KGIpO2w/bj1uLnJlcGxhY2UoLycvZywiXFwkJiIpOmUuc2V0QXR0cmlidXRlKCJpZCIsbikscSYmcCYmKGU9ZS5wYXJlbnROb2RlKTt0cnl7aWYoIXF8fHApcmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWQ9JyIrbisiJ10gIitiKSxmKX1jYXRjaChyKXt9ZmluYWxseXtsfHxrLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBhKGIsZSxmLGcpfTtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07Yj1udWxsfX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuZG9jdW1lbnRFbGVtZW50LGI9YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcjtpZihiKXt2YXIgZD0hYi5jYWxsKGMuY3JlYXRlRWxlbWVudCgiZGl2IiksImRpdiIpLGU9ITE7dHJ5e2IuY2FsbChjLmRvY3VtZW50RWxlbWVudCwiW3Rlc3QhPScnXTpzaXp6bGUiKX1jYXRjaChmKXtlPSEwfW0ubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYyl7Yz1jLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCFtLmlzWE1MKGEpKXRyeXtpZihlfHwhby5tYXRjaC5QU0VVRE8udGVzdChjKSYmIS8hPS8udGVzdChjKSl7dmFyIGY9Yi5jYWxsKGEsYyk7aWYoZnx8IWR8fGEuZG9jdW1lbnQmJmEuZG9jdW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gZn19Y2F0Y2goZyl7fXJldHVybiBtKGMsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9fX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjtpZighIWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MCl7YS5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIjtpZihhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0xKXJldHVybjtvLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIiksby5maW5kLkNMQVNTPWZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT0idW5kZWZpbmVkIiYmIWMpcmV0dXJuIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhWzFdKX0sYT1udWxsfX0oKSxjLmRvY3VtZW50RWxlbWVudC5jb250YWlucz9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEhPT1iJiYoYS5jb250YWlucz9hLmNvbnRhaW5zKGIpOiEwKX06Yy5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/bS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpfTptLmNvbnRhaW5zPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG0uaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9KGE/YS5vd25lckRvY3VtZW50fHxhOjApLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj9iLm5vZGVOYW1lIT09IkhUTUwiOiExfTt2YXIgeT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZT1bXSxmPSIiLGc9Yi5ub2RlVHlwZT9bYl06Yjt3aGlsZShkPW8ubWF0Y2guUFNFVURPLmV4ZWMoYSkpZis9ZFswXSxhPWEucmVwbGFjZShvLm1hdGNoLlBTRVVETywiIik7YT1vLnJlbGF0aXZlW2FdP2ErIioiOmE7Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKW0oYSxnW2hdLGUsYyk7cmV0dXJuIG0uZmlsdGVyKGYsZSl9O20uYXR0cj1mLmF0dHIsbS5zZWxlY3RvcnMuYXR0ck1hcD17fSxmLmZpbmQ9bSxmLmV4cHI9bS5zZWxlY3RvcnMsZi5leHByWyI6Il09Zi5leHByLmZpbHRlcnMsZi51bmlxdWU9bS51bmlxdWVTb3J0LGYudGV4dD1tLmdldFRleHQsZi5pc1hNTERvYz1tLmlzWE1MLGYuY29udGFpbnM9bS5jb250YWluc30oKTt2YXIgTD0vVW50aWwkLyxNPS9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLE49LywvLE89L14uW146I1xbXC4sXSokLyxQPUFycmF5LnByb3RvdHlwZS5zbGljZSxRPWYuZXhwci5tYXRjaC5nbG9iYWxQT1MsUj17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGMsZDtpZih0eXBlb2YgYSE9InN0cmluZyIpcmV0dXJuIGYoYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGM9MCxkPWIubGVuZ3RoO2M8ZDtjKyspaWYoZi5jb250YWlucyhiW2NdLHRoaXMpKXJldHVybiEwfSk7dmFyIGU9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGcsaCxpO2ZvcihjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXtnPWUubGVuZ3RoLGYuZmluZChhLHRoaXNbY10sZSk7aWYoYz4wKWZvcihoPWc7aDxlLmxlbmd0aDtoKyspZm9yKGk9MDtpPGc7aSsrKWlmKGVbaV09PT1lW2hdKXtlLnNwbGljZShoLS0sMSk7YnJlYWt9fXJldHVybiBlfSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGI9ZihhKTtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxjPWIubGVuZ3RoO2E8YzthKyspaWYoZi5jb250YWlucyh0aGlzLGJbYV0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITEpLCJub3QiLGEpfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFQodGhpcyxhLCEwKSwiZmlsdGVyIixhKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISFhJiYodHlwZW9mIGE9PSJzdHJpbmciP1EudGVzdChhKT9mKGEsdGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKT49MDpmLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wOnRoaXMuZmlsdGVyKGEpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQsZSxnPXRoaXNbMF07aWYoZi5pc0FycmF5KGEpKXt2YXIgaD0xO3doaWxlKGcmJmcub3duZXJEb2N1bWVudCYmZyE9PWIpe2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZihnKS5pcyhhW2RdKSYmYy5wdXNoKHtzZWxlY3RvcjphW2RdLGVsZW06ZyxsZXZlbDpofSk7Zz1nLnBhcmVudE5vZGUsaCsrfXJldHVybiBjfXZhciBpPVEudGVzdChhKXx8dHlwZW9mIGEhPSJzdHJpbmciP2YoYSxifHx0aGlzLmNvbnRleHQpOjA7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTt3aGlsZShnKXtpZihpP2kuaW5kZXgoZyk+LTE6Zi5maW5kLm1hdGNoZXNTZWxlY3RvcihnLGEpKXtjLnB1c2goZyk7YnJlYWt9Zz1nLnBhcmVudE5vZGU7aWYoIWd8fCFnLm93bmVyRG9jdW1lbnR8fGc9PT1ifHxnLm5vZGVUeXBlPT09MTEpYnJlYWt9fWM9Yy5sZW5ndGg+MT9mLnVuaXF1ZShjKTpjO3JldHVybiB0aGlzLnB1c2hTdGFjayhjLCJjbG9zZXN0IixhKX0saW5kZXg6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLnByZXZBbGwoKS5sZW5ndGg6LTE7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBmLmluQXJyYXkodGhpc1swXSxmKGEpKTtyZXR1cm4gZi5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKX0sYWRkOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE9PSJzdHJpbmciP2YoYSxiKTpmLm1ha2VBcnJheShhJiZhLm5vZGVUeXBlP1thXTphKSxkPWYubWVyZ2UodGhpcy5nZXQoKSxjKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUyhjWzBdKXx8UyhkWzBdKT9kOmYudW5pcXVlKGQpKX0sYW5kU2VsZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZCh0aGlzLnByZXZPYmplY3QpfX0pLGYuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmYi5ub2RlVHlwZSE9PTExP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gZi5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIixjKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gZi5udGgoYSwyLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kaXIoYSwibmV4dFNpYmxpbmciLGMpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gZi5zaWJsaW5nKChhLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4gZi5zaWJsaW5nKGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLm5vZGVOYW1lKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50fHxhLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6Zi5tYWtlQXJyYXkoYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPWYubWFwKHRoaXMsYixjKTtMLnRlc3QoYSl8fChkPWMpLGQmJnR5cGVvZiBkPT0ic3RyaW5nIiYmKGU9Zi5maWx0ZXIoZCxlKSksZT10aGlzLmxlbmd0aD4xJiYhUlthXT9mLnVuaXF1ZShlKTplLCh0aGlzLmxlbmd0aD4xfHxOLnRlc3QoZCkpJiZNLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSxhLFAuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9fSksZi5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihhLGIsYyl7YyYmKGE9Ijpub3QoIithKyIpIik7cmV0dXJuIGIubGVuZ3RoPT09MT9mLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGJbMF0sYSk/W2JbMF1dOltdOmYuZmluZC5tYXRjaGVzKGEsYil9LGRpcjpmdW5jdGlvbihhLGMsZCl7dmFyIGU9W10sZz1hW2NdO3doaWxlKGcmJmcubm9kZVR5cGUhPT05JiYoZD09PWJ8fGcubm9kZVR5cGUhPT0xfHwhZihnKS5pcyhkKSkpZy5ub2RlVHlwZT09PTEmJmUucHVzaChnKSxnPWdbY107cmV0dXJuIGV9LG50aDpmdW5jdGlvbihhLGIsYyxkKXtiPWJ8fDE7dmFyIGU9MDtmb3IoO2E7YT1hW2NdKWlmKGEubm9kZVR5cGU9PT0xJiYrK2U9PT1iKWJyZWFrO3JldHVybiBhfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7dmFyIGM9W107Zm9yKDthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY319KTt2YXIgVj0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsVz0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLFg9L15ccysvLFk9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9pZyxaPS88KFtcdzpdKykvLCQ9Lzx0Ym9keS9pLF89Lzx8JiM/XHcrOy8sYmE9LzwoPzpzY3JpcHR8c3R5bGUpL2ksYmI9LzwoPzpzY3JpcHR8b2JqZWN0fGVtYmVkfG9wdGlvbnxzdHlsZSkvaSxiYz1uZXcgUmVnRXhwKCI8KD86IitWKyIpW1xccy8+XSIsImkiKSxiZD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxiZT0vXC8oamF2YXxlY21hKXNjcmlwdC9pLGJmPS9eXHMqPCEoPzpcW0NEQVRBXFt8XC1cLSkvLGJnPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sYXJlYTpbMSwiPG1hcD4iLCI8L21hcD4iXSxfZGVmYXVsdDpbMCwiIiwiIl19LGJoPVUoYyk7Ymcub3B0Z3JvdXA9Ymcub3B0aW9uLGJnLnRib2R5PWJnLnRmb290PWJnLmNvbGdyb3VwPWJnLmNhcHRpb249YmcudGhlYWQsYmcudGg9YmcudGQsZi5zdXBwb3J0Lmh0bWxTZXJpYWxpemV8fChiZy5fZGVmYXVsdD1bMSwiZGl2PGRpdj4iLCI8L2Rpdj4iXSksZi5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iP2YudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGMpLmNyZWF0ZVRleHROb2RlKGEpKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSx3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1mKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdENoaWxkJiZhLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xKWE9YS5maXJzdENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7Zih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe2Yubm9kZU5hbWUodGhpcywiYm9keSIpfHxmKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmFwcGVuZENoaWxkKGEpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuaW5zZXJ0QmVmb3JlKGEsdGhpcy5maXJzdENoaWxkKX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPWYNCi0uY2xlYW4oYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSx0aGlzLnRvQXJyYXkoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGEsImJlZm9yZSIsYXJndW1lbnRzKX19LGFmdGVyOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT10aGlzLnB1c2hTdGFjayh0aGlzLCJhZnRlciIsYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSxmLmNsZWFuKGFyZ3VtZW50cykpO3JldHVybiBhfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZDsoZD10aGlzW2NdKSE9bnVsbDtjKyspaWYoIWF8fGYuZmlsdGVyKGEsW2RdKS5sZW5ndGgpIWImJmQubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEoZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKSxmLmNsZWFuRGF0YShbZF0pKSxkLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKyl7Yi5ub2RlVHlwZT09PTEmJmYuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYi5maXJzdENoaWxkKWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXthPWE9PW51bGw/ITE6YSxiPWI9PW51bGw/YTpiO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBmLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEpe3ZhciBjPXRoaXNbMF18fHt9LGQ9MCxlPXRoaXMubGVuZ3RoO2lmKGE9PT1iKXJldHVybiBjLm5vZGVUeXBlPT09MT9jLmlubmVySFRNTC5yZXBsYWNlKFcsIiIpOm51bGw7aWYodHlwZW9mIGE9PSJzdHJpbmciJiYhYmEudGVzdChhKSYmKGYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8IVgudGVzdChhKSkmJiFiZ1soWi5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoWSwiPCQxPjwvJDI+Iik7dHJ5e2Zvcig7ZDxlO2QrKyljPXRoaXNbZF18fHt9LGMubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEoYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKSxjLmlubmVySFRNTD1hKTtjPTB9Y2F0Y2goZyl7fX1jJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKSxkPWMuaHRtbCgpO2MucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixkKSl9KTt0eXBlb2YgYSE9InN0cmluZyImJihhPWYoYSkuZGV0YWNoKCkpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5leHRTaWJsaW5nLGM9dGhpcy5wYXJlbnROb2RlO2YodGhpcykucmVtb3ZlKCksYj9mKGIpLmJlZm9yZShhKTpmKGMpLmFwcGVuZChhKX0pfXJldHVybiB0aGlzLmxlbmd0aD90aGlzLnB1c2hTdGFjayhmKGYuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKTp0aGlzfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZyxoLGksaj1hWzBdLGs9W107aWYoIWYuc3VwcG9ydC5jaGVja0Nsb25lJiZhcmd1bWVudHMubGVuZ3RoPT09MyYmdHlwZW9mIGo9PSJzdHJpbmciJiZiZC50ZXN0KGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmKHRoaXMpLmRvbU1hbmlwKGEsYyxkLCEwKX0pO2lmKGYuaXNGdW5jdGlvbihqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBnPWYodGhpcyk7YVswXT1qLmNhbGwodGhpcyxlLGM/Zy5odG1sKCk6YiksZy5kb21NYW5pcChhLGMsZCl9KTtpZih0aGlzWzBdKXtpPWomJmoucGFyZW50Tm9kZSxmLnN1cHBvcnQucGFyZW50Tm9kZSYmaSYmaS5ub2RlVHlwZT09PTExJiZpLmNoaWxkTm9kZXMubGVuZ3RoPT09dGhpcy5sZW5ndGg/ZT17ZnJhZ21lbnQ6aX06ZT1mLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspLGg9ZS5mcmFnbWVudCxoLmNoaWxkTm9kZXMubGVuZ3RoPT09MT9nPWg9aC5maXJzdENoaWxkOmc9aC5maXJzdENoaWxkO2lmKGcpe2M9YyYmZi5ub2RlTmFtZShnLCJ0ciIpO2Zvcih2YXIgbD0wLG09dGhpcy5sZW5ndGgsbj1tLTE7bDxtO2wrKylkLmNhbGwoYz9iaSh0aGlzW2xdLGcpOnRoaXNbbF0sZS5jYWNoZWFibGV8fG0+MSYmbDxuP2YuY2xvbmUoaCwhMCwhMCk6aCl9ay5sZW5ndGgmJmYuZWFjaChrLGZ1bmN0aW9uKGEsYil7Yi5zcmM/Zi5hamF4KHt0eXBlOiJHRVQiLGdsb2JhbDohMSx1cmw6Yi5zcmMsYXN5bmM6ITEsZGF0YVR5cGU6InNjcmlwdCJ9KTpmLmdsb2JhbEV2YWwoKGIudGV4dHx8Yi50ZXh0Q29udGVudHx8Yi5pbm5lckhUTUx8fCIiKS5yZXBsYWNlKGJmLCIvKiQwKi8iKSksYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYil9KX1yZXR1cm4gdGhpc319KSxmLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGcsaCxpLGo9YVswXTtiJiZiWzBdJiYoaT1iWzBdLm93bmVyRG9jdW1lbnR8fGJbMF0pLGkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8KGk9YyksYS5sZW5ndGg9PT0xJiZ0eXBlb2Ygaj09InN0cmluZyImJmoubGVuZ3RoPDUxMiYmaT09PWMmJmouY2hhckF0KDApPT09IjwiJiYhYmIudGVzdChqKSYmKGYuc3VwcG9ydC5jaGVja0Nsb25lfHwhYmQudGVzdChqKSkmJihmLnN1cHBvcnQuaHRtbDVDbG9uZXx8IWJjLnRlc3QoaikpJiYoZz0hMCxoPWYuZnJhZ21lbnRzW2pdLGgmJmghPT0xJiYoZT1oKSksZXx8KGU9aS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZi5jbGVhbihhLGksZSxkKSksZyYmKGYuZnJhZ21lbnRzW2pdPWg/ZToxKTtyZXR1cm57ZnJhZ21lbnQ6ZSxjYWNoZWFibGU6Z319LGYuZnJhZ21lbnRzPXt9LGYuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjKXt2YXIgZD1bXSxlPWYoYyksZz10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihnJiZnLm5vZGVUeXBlPT09MTEmJmcuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZlLmxlbmd0aD09PTEpe2VbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj0oaD4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpO2YoZVtoXSlbYl0oaiksZD1kLmNvbmNhdChqKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZCxhLGUuc2VsZWN0b3IpfX0pLGYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxnLGg9Zi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fGYuaXNYTUxEb2MoYSl8fCFiYy50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/YS5jbG9uZU5vZGUoITApOmJvKGEpO2lmKCghZi5zdXBwb3J0Lm5vQ2xvbmVFdmVudHx8IWYuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCkmJihhLm5vZGVUeXBlPT09MXx8YS5ub2RlVHlwZT09PTExKSYmIWYuaXNYTUxEb2MoYSkpe2JrKGEsaCksZD1ibChhKSxlPWJsKGgpO2ZvcihnPTA7ZFtnXTsrK2cpZVtnXSYmYmsoZFtnXSxlW2ddKX1pZihiKXtiaihhLGgpO2lmKGMpe2Q9YmwoYSksZT1ibChoKTtmb3IoZz0wO2RbZ107KytnKWJqKGRbZ10sZVtnXSl9fWQ9ZT1udWxsO3JldHVybiBofSxjbGVhbjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZyxoLGksaj1bXTtiPWJ8fGMsdHlwZW9mIGIuY3JlYXRlRWxlbWVudD09InVuZGVmaW5lZCImJihiPWIub3duZXJEb2N1bWVudHx8YlswXSYmYlswXS5vd25lckRvY3VtZW50fHxjKTtmb3IodmFyIGs9MCxsOyhsPWFba10pIT1udWxsO2srKyl7dHlwZW9mIGw9PSJudW1iZXIiJiYobCs9IiIpO2lmKCFsKWNvbnRpbnVlO2lmKHR5cGVvZiBsPT0ic3RyaW5nIilpZighXy50ZXN0KGwpKWw9Yi5jcmVhdGVUZXh0Tm9kZShsKTtlbHNle2w9bC5yZXBsYWNlKFksIjwkMT48LyQyPiIpO3ZhciBtPShaLmV4ZWMobCl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksbj1iZ1ttXXx8YmcuX2RlZmF1bHQsbz1uWzBdLHA9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxxPWJoLmNoaWxkTm9kZXMscjtiPT09Yz9iaC5hcHBlbmRDaGlsZChwKTpVKGIpLmFwcGVuZENoaWxkKHApLHAuaW5uZXJIVE1MPW5bMV0rbCtuWzJdO3doaWxlKG8tLSlwPXAubGFzdENoaWxkO2lmKCFmLnN1cHBvcnQudGJvZHkpe3ZhciBzPSQudGVzdChsKSx0PW09PT0idGFibGUiJiYhcz9wLmZpcnN0Q2hpbGQmJnAuZmlyc3RDaGlsZC5jaGlsZE5vZGVzOm5bMV09PT0iPHRhYmxlPiImJiFzP3AuY2hpbGROb2RlczpbXTtmb3IoaT10Lmxlbmd0aC0xO2k+PTA7LS1pKWYubm9kZU5hbWUodFtpXSwidGJvZHkiKSYmIXRbaV0uY2hpbGROb2Rlcy5sZW5ndGgmJnRbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0W2ldKX0hZi5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZYLnRlc3QobCkmJnAuaW5zZXJ0QmVmb3JlKGIuY3JlYXRlVGV4dE5vZGUoWC5leGVjKGwpWzBdKSxwLmZpcnN0Q2hpbGQpLGw9cC5jaGlsZE5vZGVzLHAmJihwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocCkscS5sZW5ndGg+MCYmKHI9cVtxLmxlbmd0aC0xXSxyJiZyLnBhcmVudE5vZGUmJnIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSkpfXZhciB1O2lmKCFmLnN1cHBvcnQuYXBwZW5kQ2hlY2tlZClpZihsWzBdJiZ0eXBlb2YgKHU9bC5sZW5ndGgpPT0ibnVtYmVyIilmb3IoaT0wO2k8dTtpKyspYm4obFtpXSk7ZWxzZSBibihsKTtsLm5vZGVUeXBlP2oucHVzaChsKTpqPWYubWVyZ2UoaixsKX1pZihkKXtnPWZ1bmN0aW9uKGEpe3JldHVybiFhLnR5cGV8fGJlLnRlc3QoYS50eXBlKX07Zm9yKGs9MDtqW2tdO2srKyl7aD1qW2tdO2lmKGUmJmYubm9kZU5hbWUoaCwic2NyaXB0IikmJighaC50eXBlfHxiZS50ZXN0KGgudHlwZSkpKWUucHVzaChoLnBhcmVudE5vZGU/aC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGgpOmgpO2Vsc2V7aWYoaC5ub2RlVHlwZT09PTEpe3ZhciB2PWYuZ3JlcChoLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtqLnNwbGljZS5hcHBseShqLFtrKzEsMF0uY29uY2F0KHYpKX1kLmFwcGVuZENoaWxkKGgpfX19cmV0dXJuIGp9LGNsZWFuRGF0YTpmdW5jdGlvbihhKXt2YXIgYixjLGQ9Zi5jYWNoZSxlPWYuZXZlbnQuc3BlY2lhbCxnPWYuc3VwcG9ydC5kZWxldGVFeHBhbmRvO2Zvcih2YXIgaD0wLGk7KGk9YVtoXSkhPW51bGw7aCsrKXtpZihpLm5vZGVOYW1lJiZmLm5vRGF0YVtpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKWNvbnRpbnVlO2M9aVtmLmV4cGFuZG9dO2lmKGMpe2I9ZFtjXTtpZihiJiZiLmV2ZW50cyl7Zm9yKHZhciBqIGluIGIuZXZlbnRzKWVbal0/Zi5ldmVudC5yZW1vdmUoaSxqKTpmLnJlbW92ZUV2ZW50KGksaixiLmhhbmRsZSk7Yi5oYW5kbGUmJihiLmhhbmRsZS5lbGVtPW51bGwpfWc/ZGVsZXRlIGlbZi5leHBhbmRvXTppLnJlbW92ZUF0dHJpYnV0ZSYmaS5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKSxkZWxldGUgZFtjXX19fX0pO3ZhciBicD0vYWxwaGFcKFteKV0qXCkvaSxicT0vb3BhY2l0eT0oW14pXSopLyxicj0vKFtBLVpdfF5tcykvZyxicz0vXltcLStdPyg/OlxkKlwuKT9cZCskL2ksYnQ9L14tPyg/OlxkKlwuKT9cZCsoPyFweClbXlxkXHNdKyQvaSxidT0vXihbXC0rXSk9KFtcLSsuXGRlXSspLyxidj0vXm1hcmdpbi8sYnc9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ4PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYnksYnosYkE7Zi5mbi5jc3M9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGQhPT1iP2Yuc3R5bGUoYSxjLGQpOmYuY3NzKGEsYyl9LGEsYyxhcmd1bWVudHMubGVuZ3RoPjEpfSxmLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWJ5KGEsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQsaD09PSJzdHJpbmciJiYoZz1idS5leGVjKGQpKSYmKGQ9KyhnWzFdKzEpKitnWzJdK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIik7aWYoZD09bnVsbHx8aD09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47aD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYnkpcmV0dXJuIGJ5KGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9LGUsZjtmb3IoZiBpbiBiKWRbZl09YS5zdHlsZVtmXSxhLnN0eWxlW2ZdPWJbZl07ZT1jLmNhbGwoYSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWRbZl07cmV0dXJuIGV9fSksZi5jdXJDU1M9Zi5jc3MsYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYno9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZyxoPWEuc3R5bGU7Yj1iLnJlcGxhY2UoYnIsIi0kMSIpLnRvTG93ZXJDYXNlKCksKGQ9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSYmKGU9ZC5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkpJiYoYz1lLmdldFByb3BlcnR5VmFsdWUoYiksYz09PSIiJiYhZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGEpJiYoYz1mLnN0eWxlKGEsYikpKSwhZi5zdXBwb3J0LnBpeGVsTWFyZ2luJiZlJiZidi50ZXN0KGIpJiZidC50ZXN0KGMpJiYoZz1oLndpZHRoLGgud2lkdGg9YyxjPWUud2lkdGgsaC53aWR0aD1nKTtyZXR1cm4gY30pLGMuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKGJBPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGc9YS5zdHlsZTtmPT1udWxsJiZnJiYoZT1nW2JdKSYmKGY9ZSksYnQudGVzdChmKSYmKGM9Zy5sZWZ0LGQ9YS5ydW50aW1lU3R5bGUmJmEucnVudGltZVN0eWxlLmxlZnQsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksZy5sZWZ0PWI9PT0iZm9udFNpemUiPyIxZW0iOmYsZj1nLnBpeGVsTGVmdCsicHgiLGcubGVmdD1jLGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWQpKTtyZXR1cm4gZj09PSIiPyJhdXRvIjpmfSksYnk9Ynp8fGJBLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe2lmKGMpcmV0dXJuIGEub2Zmc2V0V2lkdGghPT0wP2JCKGEsYixkKTpmLnN3YXAoYSxidyxmdW5jdGlvbigpe3JldHVybiBiQihhLGIsZCl9KX0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGJzLnRlc3QoYik/YisicHgiOmJ9fX0pLGYuc3VwcG9ydC5vcGFjaXR5fHwoZi5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYnEudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpP3BhcnNlRmxvYXQoUmVnRXhwLiQxKS8xMDArIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPWYuaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrYioxMDArIikiOiIiLGc9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MTtpZihiPj0xJiZmLnRyaW0oZy5yZXBsYWNlKGJwLCIiKSk9PT0iIil7Yy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO2lmKGQmJiFkLmZpbHRlcilyZXR1cm59Yy5maWx0ZXI9YnAudGVzdChnKT9nLnJlcGxhY2UoYnAsZSk6ZysiICIrZX19KSxmKGZ1bmN0aW9uKCl7Zi5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fChmLmNzc0hvb2tzLm1hcmdpblJpZ2h0PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LGZ1bmN0aW9uKCl7cmV0dXJuIGI/YnkoYSwibWFyZ2luLXJpZ2h0Iik6YS5zdHlsZS5tYXJnaW5SaWdodH0pfX0pfSksZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFdpZHRoLGM9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGI9PT0wJiZjPT09MHx8IWYuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJihhLnN0eWxlJiZhLnN0eWxlLmRpc3BsYXl8fGYuY3NzKGEsImRpc3BsYXkiKSk9PT0ibm9uZSJ9LGYuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWYuZXhwci5maWx0ZXJzLmhpZGRlbihhKX0pLGYuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGEsYil7Zi5jc3NIb29rc1thK2JdPXtleHBhbmQ6ZnVuY3Rpb24oYyl7dmFyIGQsZT10eXBlb2YgYz09InN0cmluZyI/Yy5zcGxpdCgiICIpOltjXSxmPXt9O2ZvcihkPTA7ZDw0O2QrKylmW2ErYnhbZF0rYl09ZVtkXXx8ZVtkLTJdfHxlWzBdO3JldHVybiBmfX19KTt2YXIgYkM9LyUyMC9nLGJEPS9cW1xdJC8sYkU9L1xyP1xuL2csYkY9LyMuKiQvLGJHPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsYkg9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGJJPS9eKD86YWJvdXR8YXBwfGFwcFwtc3RvcmFnZXwuK1wtZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sYko9L14oPzpHRVR8SEVBRCkkLyxiSz0vXlwvXC8vLGJMPS9cPy8sYk09LzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksYk49L14oPzpzZWxlY3R8dGV4dGFyZWEpL2ksYk89L1xzKy8sYlA9LyhbPyZdKV89W14mXSovLGJRPS9eKFtcd1wrXC5cLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKykpPyk/LyxiUj1mLmZuLmxvYWQsYlM9e30sYlQ9e30sYlUsYlYsYlc9WyIqLyJdK1siKiJdO3RyeXtiVT1lLmhyZWZ9Y2F0Y2goYlgpe2JVPWMuY3JlYXRlRWxlbWVudCgiYSIpLGJVLmhyZWY9IiIsYlU9YlUuaHJlZn1iVj1iUS5leGVjKGJVLnRvTG93ZXJDYXNlKCkpfHxbXSxmLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGEhPSJzdHJpbmciJiZiUilyZXR1cm4gYlIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZT1hLmluZGV4T2YoIiAiKTtpZihlPj0wKXt2YXIgZz1hLnNsaWNlKGUsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGUpfXZhciBoPSJHRVQiO2MmJihmLmlzRnVuY3Rpb24oYyk/KGQ9YyxjPWIpOnR5cGVvZiBjPT0ib2JqZWN0IiYmKGM9Zi5wYXJhbShjLGYuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxoPSJQT1NUIikpO3ZhciBpPXRoaXM7Zi5hamF4KHt1cmw6YSx0eXBlOmgsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Yyxjb21wbGV0ZTpmdW5jdGlvbihhLGIsYyl7Yz1hLnJlc3BvbnNlVGV4dCxhLmlzUmVzb2x2ZWQoKSYmKGEuZG9uZShmdW5jdGlvbihhKXtjPWF9KSxpLmh0bWwoZz9mKCI8ZGl2PiIpLmFwcGVuZChjLnJlcGxhY2UoYk0sIiIpKS5maW5kKGcpOmMpKSxkJiZpLmVhY2goZCxbYyxiLGFdKX19KTtyZXR1cm4gdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGYucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9mLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fGJOLnRlc3QodGhpcy5ub2RlTmFtZSl8fGJILnRlc3QodGhpcy50eXBlKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1mKHRoaXMpLnZhbCgpO3JldHVybiBjPT1udWxsP251bGw6Zi5pc0FycmF5KGMpP2YubWFwKGMsZnVuY3Rpb24oYSxjKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKGJFLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZShiRSwiXHJcbiIpfX0pLmdldCgpfX0pLGYuZWFjaCgiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksZi5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGEsYyl7ZltjXT1mdW5jdGlvbihhLGQsZSxnKXtmLmlzRnVuY3Rpb24oZCkmJihnPWd8fGUsZT1kLGQ9Yik7cmV0dXJuIGYuYWpheCh7dHlwZTpjLHVybDphLGRhdGE6ZCxzdWNjZXNzOmUsZGF0YVR5cGU6Z30pfX0pLGYuZXh0ZW5kKHtnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZi5nZXQoYSxiLGMsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5nZXQoYSxiLGMsImpzb24iKX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7Yj9iJChhLGYuYWpheFNldHRpbmdzKTooYj1hLGE9Zi5hamF4U2V0dGluZ3MpLGIkKGEsYik7cmV0dXJuIGF9LGFqYXhTZXR0aW5nczp7dXJsOmJVLGlzTG9jYWw6YkkudGVzdChiVlsxXSksZ2xvYmFsOiEwLHR5cGU6IkdFVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLHRleHQ6InRleHQvcGxhaW4iLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsIioiOmJXfSxjb250ZW50czp7eG1sOi94bWwvLGh0bWw6L2h0bWwvLGpzb246L2pzb24vfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0In0sY29udmVydGVyczp7IiogdGV4dCI6YS5TdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6Zi5wYXJzZUpTT04sInRleHQgeG1sIjpmLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7Y29udGV4dDohMCx1cmw6ITB9fSxhamF4UHJlZmlsdGVyOmJZKGJTKSxhamF4VHJhbnNwb3J0OmJZKGJUKSxhamF4OmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gdyhhLGMsbCxtKXtpZihzIT09Mil7cz0yLHEmJmNsZWFyVGltZW91dChxKSxwPWIsbj1tfHwiIix2LnJlYWR5U3RhdGU9YT4wPzQ6MDt2YXIgbyxyLHUsdz1jLHg9bD9jYShkLHYsbCk6Yix5LHo7aWYoYT49MjAwJiZhPDMwMHx8YT09PTMwNCl7aWYoZC5pZk1vZGlmaWVkKXtpZih5PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSlmLmxhc3RNb2RpZmllZFtrXT15O2lmKHo9di5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpKWYuZXRhZ1trXT16fWlmKGE9PT0zMDQpdz0ibm90bW9kaWZpZWQiLG89ITA7ZWxzZSB0cnl7cj1jYihkLHgpLHc9InN1Y2Nlc3MiLG89ITB9Y2F0Y2goQSl7dz0icGFyc2VyZXJyb3IiLHU9QX19ZWxzZXt1PXc7aWYoIXd8fGEpdz0iZXJyb3IiLGE8MCYmKGE9MCl9di5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9IiIrKGN8fHcpLG8/aC5yZXNvbHZlV2l0aChlLFtyLHcsdl0pOmgucmVqZWN0V2l0aChlLFt2LHcsdV0pLHYuc3RhdHVzQ29kZShqKSxqPWIsdCYmZy50cmlnZ2VyKCJhamF4Iisobz8iU3VjY2VzcyI6IkVycm9yIiksW3YsZCxvP3I6dV0pLGkuZmlyZVdpdGgoZSxbdix3XSksdCYmKGcudHJpZ2dlcigiYWpheENvbXBsZXRlIixbdixkXSksLS1mLmFjdGl2ZXx8Zi5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKX19dHlwZW9mIGE9PSJvYmplY3QiJiYoYz1hLGE9YiksYz1jfHx7fTt2YXIgZD1mLmFqYXhTZXR1cCh7fSxjKSxlPWQuY29udGV4dHx8ZCxnPWUhPT1kJiYoZS5ub2RlVHlwZXx8ZSBpbnN0YW5jZW9mIGYpP2YoZSk6Zi5ldmVudCxoPWYuRGVmZXJyZWQoKSxpPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGo9ZC5zdGF0dXNDb2RlfHx7fSxrLGw9e30sbT17fSxuLG8scCxxLHIscz0wLHQsdSx2PXtyZWFkeVN0YXRlOjAsc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe2lmKCFzKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7YT1tW2NdPW1bY118fGEsbFthXT1ifXJldHVybiB0aGlzfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gcz09PTI/bjpudWxsfSxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYztpZihzPT09Mil7aWYoIW8pe289e307d2hpbGUoYz1iRy5leGVjKG4pKW9bY1sxXS50b0xvd2VyQ2FzZSgpXT1jWzJdfWM9b1thLnRvTG93ZXJDYXNlKCldfXJldHVybiBjPT09Yj9udWxsOmN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oYSl7c3x8KGQubWltZVR5cGU9YSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe2E9YXx8ImFib3J0IixwJiZwLmFib3J0KGEpLHcoMCxhKTtyZXR1cm4gdGhpc319O2gucHJvbWlzZSh2KSx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLHYuY29tcGxldGU9aS5hZGQsdi5zdGF0dXNDb2RlPWZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiO2lmKHM8Milmb3IoYiBpbiBhKWpbYl09W2pbYl0sYVtiXV07ZWxzZSBiPWFbdi5zdGF0dXNdLHYudGhlbihiLGIpfXJldHVybiB0aGlzfSxkLnVybD0oKGF8fGQudXJsKSsiIikucmVwbGFjZShiRiwiIikucmVwbGFjZShiSyxiVlsxXSsiLy8iKSxkLmRhdGFUeXBlcz1mLnRyaW0oZC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLnNwbGl0KGJPKSxkLmNyb3NzRG9tYWluPT1udWxsJiYocj1iUS5leGVjKGQudXJsLnRvTG93ZXJDYXNlKCkpLGQuY3Jvc3NEb21haW49ISghcnx8clsxXT09YlZbMV0mJnJbMl09PWJWWzJdJiYoclszXXx8KHJbMV09PT0iaHR0cDoiPzgwOjQ0MykpPT0oYlZbM118fChiVlsxXT09PSJodHRwOiI/ODA6NDQzKSkpKSxkLmRhdGEmJmQucHJvY2Vzc0RhdGEmJnR5cGVvZiBkLmRhdGEhPSJzdHJpbmciJiYoZC5kYXRhPWYucGFyYW0oZC5kYXRhLGQudHJhZGl0aW9uYWwpKSxiWihiUyxkLGMsdik7aWYocz09PTIpcmV0dXJuITE7dD1kLmdsb2JhbCxkLnR5cGU9ZC50eXBlLnRvVXBwZXJDYXNlKCksZC5oYXNDb250ZW50PSFiSi50ZXN0KGQudHlwZSksdCYmZi5hY3RpdmUrKz09PTAmJmYuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7aWYoIWQuaGFzQ29udGVudCl7ZC5kYXRhJiYoZC51cmwrPShiTC50ZXN0KGQudXJsKT8iJiI6Ij8iKStkLmRhdGEsZGVsZXRlIGQuZGF0YSksaz1kLnVybDtpZihkLmNhY2hlPT09ITEpe3ZhciB4PWYubm93KCkseT1kLnVybC5yZXBsYWNlKGJQLCIkMV89Iit4KTtkLnVybD15Kyh5PT09ZC51cmw/KGJMLnRlc3QoZC51cmwpPyImIjoiPyIpKyJfPSIreDoiIil9fShkLmRhdGEmJmQuaGFzQ29udGVudCYmZC5jb250ZW50VHlwZSE9PSExfHxjLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGQuY29udGVudFR5cGUpLGQuaWZNb2RpZmllZCYmKGs9a3x8ZC51cmwsZi5sYXN0TW9kaWZpZWRba10mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLGYubGFzdE1vZGlmaWVkW2tdKSxmLmV0YWdba10mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsZi5ldGFnW2tdKSksdi5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGQuZGF0YVR5cGVzWzBdJiZkLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dP2QuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0rKGQuZGF0YVR5cGVzWzBdIT09IioiPyIsICIrYlcrIjsgcT0wLjAxIjoiIik6ZC5hY2NlcHRzWyIqIl0pO2Zvcih1IGluIGQuaGVhZGVycyl2LnNldFJlcXVlc3RIZWFkZXIodSxkLmhlYWRlcnNbdV0pO2lmKGQuYmVmb3JlU2VuZCYmKGQuYmVmb3JlU2VuZC5jYWxsKGUsdixkKT09PSExfHxzPT09Mikpe3YuYWJvcnQoKTtyZXR1cm4hMX1mb3IodSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl2W3VdKGRbdV0pO3A9YlooYlQsZCxjLHYpO2lmKCFwKXcoLTEsIk5vIFRyYW5zcG9ydCIpO2Vsc2V7di5yZWFkeVN0YXRlPTEsdCYmZy50cmlnZ2VyKCJhamF4U2VuZCIsW3YsZF0pLGQuYXN5bmMmJmQudGltZW91dD4wJiYocT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7di5hYm9ydCgidGltZW91dCIpfSxkLnRpbWVvdXQpKTt0cnl7cz0xLHAuc2VuZChsLHcpfWNhdGNoKHope2lmKHM8Mil3KC0xLHopO2Vsc2UgdGhyb3cgen19cmV0dXJuIHZ9LHBhcmFtOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9Zi5pc0Z1bmN0aW9uKGIpP2IoKTpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtjPT09YiYmKGM9Zi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKGYuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFmLmlzUGxhaW5PYmplY3QoYSkpZi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHZhciBnIGluIGEpYl8oZyxhW2ddLGMsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UoYkMsIisiKX19KSxmLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgY2M9Zi5ub3coKSxjZD0vKFw9KVw/KCZ8JCl8XD9cPy9pO2YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZi5leHBhbmRvKyJfIitjYysrfX0pLGYuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlPXR5cGVvZiBiLmRhdGE9PSJzdHJpbmciJiYvXmFwcGxpY2F0aW9uXC94XC13d3dcLWZvcm1cLXVybGVuY29kZWQvLnRlc3QoYi5jb250ZW50VHlwZSk7aWYoYi5kYXRhVHlwZXNbMF09PT0ianNvbnAifHxiLmpzb25wIT09ITEmJihjZC50ZXN0KGIudXJsKXx8ZSYmY2QudGVzdChiLmRhdGEpKSl7dmFyIGcsaD1iLmpzb25wQ2FsbGJhY2s9Zi5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGk9YVtoXSxqPWIudXJsLGs9Yi5kYXRhLGw9IiQxIitoKyIkMiI7Yi5qc29ucCE9PSExJiYoaj1qLnJlcGxhY2UoY2QsbCksYi51cmw9PT1qJiYoZSYmKGs9ay5yZXBsYWNlKGNkLGwpKSxiLmRhdGE9PT1rJiYoais9KC9cPy8udGVzdChqKT8iJiI6Ij8iKStiLmpzb25wKyI9IitoKSkpLGIudXJsPWosYi5kYXRhPWssYVtoXT1mdW5jdGlvbihhKXtnPVthXX0sZC5hbHdheXMoZnVuY3Rpb24oKXthW2hdPWksZyYmZi5pc0Z1bmN0aW9uKGkpJiZhW2hdKGdbMF0pfSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7Z3x8Zi5lcnJvcihoKyIgd2FzIG5vdCBjYWxsZWQiKTtyZXR1cm4gZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iO3JldHVybiJzY3JpcHQifX0pLGYuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovamF2YXNjcmlwdHxlY21hc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtmLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fX0pLGYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXthLmNhY2hlPT09YiYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIsYS5nbG9iYWw9ITEpfSksZi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBkLGU9Yy5oZWFkfHxjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGMuZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKGYsZyl7ZD1jLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGQuYXN5bmM9ImFzeW5jIixhLnNjcmlwdENoYXJzZXQmJihkLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxkLnNyYz1hLnVybCxkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpe2lmKGN8fCFkLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZC5yZWFkeVN0YXRlKSlkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGUmJmQucGFyZW50Tm9kZSYmZS5yZW1vdmVDaGlsZChkKSxkPWIsY3x8ZygyMDAsInN1Y2Nlc3MiKX0sZS5pbnNlcnRCZWZvcmUoZCxlLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQub25sb2FkKDAsMSl9fX19KTt2YXIgY2U9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGNnKWNnW2FdKDAsMSl9OiExLGNmPTAsY2c7Zi5hamF4U2V0dGluZ3MueGhyPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJmNoKCl8fGNpKCl9OmNoLGZ1bmN0aW9uKGEpe2YuZXh0ZW5kKGYuc3VwcG9ydCx7YWpheDohIWEsY29yczohIWEmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gYX0pfShmLmFqYXhTZXR0aW5ncy54aHIoKSksZi5zdXBwb3J0LmFqYXgmJmYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihjKXtpZighYy5jcm9zc0RvbWFpbnx8Zi5zdXBwb3J0LmNvcnMpe3ZhciBkO3JldHVybntzZW5kOmZ1bmN0aW9uKGUsZyl7dmFyIGg9Yy54aHIoKSxpLGo7Yy51c2VybmFtZT9oLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMsYy51c2VybmFtZSxjLnBhc3N3b3JkKTpoLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMpO2lmKGMueGhyRmllbGRzKWZvcihqIGluIGMueGhyRmllbGRzKWhbal09Yy54aHJGaWVsZHNbal07Yy5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYy5taW1lVHlwZSksIWMuY3Jvc3NEb21haW4mJiFlWyJYLVJlcXVlc3RlZC1XaXRoIl0mJihlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2ZvcihqIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGosZVtqXSl9Y2F0Y2goayl7fWguc2VuZChjLmhhc0NvbnRlbnQmJmMuZGF0YXx8bnVsbCksZD1mdW5jdGlvbihhLGUpe3ZhciBqLGssbCxtLG47dHJ5e2lmKGQmJihlfHxoLnJlYWR5U3RhdGU9PT00KSl7ZD1iLGkmJihoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mLm5vb3AsY2UmJmRlbGV0ZSBjZ1tpXSk7aWYoZSloLnJlYWR5U3RhdGUhPT00JiZoLmFib3J0KCk7ZWxzZXtqPWguc3RhdHVzLGw9aC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSxtPXt9LG49aC5yZXNwb25zZVhNTCxuJiZuLmRvY3VtZW50RWxlbWVudCYmKG0ueG1sPW4pO3RyeXttLnRleHQ9aC5yZXNwb25zZVRleHR9Y2F0Y2goYSl7fXRyeXtrPWguc3RhdHVzVGV4dH1jYXRjaChvKXtrPSIifSFqJiZjLmlzTG9jYWwmJiFjLmNyb3NzRG9tYWluP2o9bS50ZXh0PzIwMDo0MDQ6aj09PTEyMjMmJihqPTIwNCl9fX1jYXRjaChwKXtlfHxnKC0xLHApfW0mJmcoaixrLG0sbCl9LCFjLmFzeW5jfHxoLnJlYWR5U3RhdGU9PT00P2QoKTooaT0rK2NmLGNlJiYoY2d8fChjZz17fSxmKGEpLnVubG9hZChjZSkpLGNnW2ldPWQpLGgub25yZWFkeXN0YXRlY2hhbmdlPWQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQoMCwxKX19fX0pO3ZhciBjaj17fSxjayxjbCxjbT0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sY249L14oWytcLV09KT8oW1xkKy5cLV0rKShbYS16JV0qKSQvaSxjbyxjcD1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXSxjcTtmLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN0KCJzaG93IiwzKSxhLGIsYyk7Zm9yKHZhciBnPTAsaD10aGlzLmxlbmd0aDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1kLnN0eWxlLmRpc3BsYXksIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZlPT09Im5vbmUiJiYoZT1kLnN0eWxlLmRpc3BsYXk9IiIpLChlPT09IiImJmYuY3NzKGQsImRpc3BsYXkiKT09PSJub25lInx8IWYuY29udGFpbnMoZC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkKSkmJmYuX2RhdGEoZCwib2xkZGlzcGxheSIsY3UoZC5ub2RlTmFtZSkpKTtmb3IoZz0wO2c8aDtnKyspe2Q9dGhpc1tnXTtpZihkLnN0eWxlKXtlPWQuc3R5bGUuZGlzcGxheTtpZihlPT09IiJ8fGU9PT0ibm9uZSIpZC5zdHlsZS5kaXNwbGF5PWYuX2RhdGEoZCwib2xkZGlzcGxheSIpfHwiIn19cmV0dXJuIHRoaXN9LGhpZGU6ZnVuY3Rpb24oYSxiLGMpe2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoY3QoImhpZGUiLDMpLGEsYixjKTt2YXIgZCxlLGc9MCxoPXRoaXMubGVuZ3RoO2Zvcig7ZzxoO2crKylkPXRoaXNbZ10sZC5zdHlsZSYmKGU9Zi5jc3MoZCwiZGlzcGxheSIpLGUhPT0ibm9uZSImJiFmLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSYmZi5fZGF0YShkLCJvbGRkaXNwbGF5IixlKSk7Zm9yKGc9MDtnPGg7ZysrKXRoaXNbZ10uc3R5bGUmJih0aGlzW2ddLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTtyZXR1cm4gdGhpc30sX3RvZ2dsZTpmLmZuLnRvZ2dsZSx0b2dnbGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXR5cGVvZiBhPT0iYm9vbGVhbiI7Zi5pc0Z1bmN0aW9uKGEpJiZmLmlzRnVuY3Rpb24oYik/dGhpcy5fdG9nZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphPT1udWxsfHxkP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWQ/YTpmKHRoaXMpLmlzKCI6aGlkZGVuIik7Zih0aGlzKVtiPyJzaG93IjoiaGlkZSJdKCl9KTp0aGlzLmFuaW1hdGUoY3QoInRvZ2dsZSIsMyksYSxiLGMpO3JldHVybiB0aGlzfSxmYWRlVG86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKCI6aGlkZGVuIikuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZygpe2UucXVldWU9PT0hMSYmZi5fbWFyayh0aGlzKTt2YXIgYj1mLmV4dGVuZCh7fSxlKSxjPXRoaXMubm9kZVR5cGU9PT0xLGQ9YyYmZih0aGlzKS5pcygiOmhpZGRlbiIpLGcsaCxpLGosayxsLG0sbixvLHAscTtiLmFuaW1hdGVkUHJvcGVydGllcz17fTtmb3IoaSBpbiBhKXtnPWYuY2FtZWxDYXNlKGkpLGkhPT1nJiYoYVtnXT1hW2ldLGRlbGV0ZSBhW2ldKTtpZigoaz1mLmNzc0hvb2tzW2ddKSYmImV4cGFuZCJpbiBrKXtsPWsuZXhwYW5kKGFbZ10pLGRlbGV0ZSBhW2ddO2ZvcihpIGluIGwpaSBpbiBhfHwoYVtpXT1sW2ldKX19Zm9yKGcgaW4gYSl7aD1hW2ddLGYuaXNBcnJheShoKT8oYi5hbmltYXRlZFByb3BlcnRpZXNbZ109aFsxXSxoPWFbZ109aFswXSk6Yi5hbmltYXRlZFByb3BlcnRpZXNbZ109Yi5zcGVjaWFsRWFzaW5nJiZiLnNwZWNpYWxFYXNpbmdbZ118fGIuZWFzaW5nfHwic3dpbmciO2lmKGg9PT0iaGlkZSImJmR8fGg9PT0ic2hvdyImJiFkKXJldHVybiBiLmNvbXBsZXRlLmNhbGwodGhpcyk7YyYmKGc9PT0iaGVpZ2h0Inx8Zz09PSJ3aWR0aCIpJiYoYi5vdmVyZmxvdz1bdGhpcy5zdHlsZS5vdmVyZmxvdyx0aGlzLnN0eWxlLm92ZXJmbG93WCx0aGlzLnN0eWxlLm92ZXJmbG93WV0sZi5jc3ModGhpcywiZGlzcGxheSIpPT09ImlubGluZSImJmYuY3NzKHRoaXMsImZsb2F0Iik9PT0ibm9uZSImJighZi5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXR8fGN1KHRoaXMubm9kZU5hbWUpPT09ImlubGluZSI/dGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnRoaXMuc3R5bGUuem9vbT0xKSl9Yi5vdmVyZmxvdyE9bnVsbCYmKHRoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpO2ZvcihpIGluIGEpaj1uZXcgZi5meCh0aGlzLGIsaSksaD1hW2ldLGNtLnRlc3QoaCk/KHE9Zi5fZGF0YSh0aGlzLCJ0b2dnbGUiK2kpfHwoaD09PSJ0b2dnbGUiP2Q/InNob3ciOiJoaWRlIjowKSxxPyhmLl9kYXRhKHRoaXMsInRvZ2dsZSIraSxxPT09InNob3ciPyJoaWRlIjoic2hvdyIpLGpbcV0oKSk6altoXSgpKToobT1jbi5leGVjKGgpLG49ai5jdXIoKSxtPyhvPXBhcnNlRmxvYXQobVsyXSkscD1tWzNdfHwoZi5jc3NOdW1iZXJbaV0/IiI6InB4IikscCE9PSJweCImJihmLnN0eWxlKHRoaXMsaSwob3x8MSkrcCksbj0ob3x8MSkvai5jdXIoKSpuLGYuc3R5bGUodGhpcyxpLG4rcCkpLG1bMV0mJihvPShtWzFdPT09Ii09Ij8tMToxKSpvK24pLGouY3VzdG9tKG4sbyxwKSk6ai5jdXN0b20obixoLCIiKSk7cmV0dXJuITB9dmFyIGU9Zi5zcGVlZChiLGMsZCk7aWYoZi5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZS5jb21wbGV0ZSxbITFdKTthPWYuZXh0ZW5kKHt9LGEpO3JldHVybiBlLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZS5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGMsZCl7dHlwZW9mIGEhPSJzdHJpbmciJiYoZD1jLGM9YSxhPWIpLGMmJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChhLGIsYyl7dmFyIGU9YltjXTtmLnJlbW92ZURhdGEoYSxjLCEwKSxlLnN0b3AoZCl9dmFyIGIsYz0hMSxlPWYudGltZXJzLGc9Zi5fZGF0YSh0aGlzKTtkfHxmLl91bm1hcmsoITAsdGhpcyk7aWYoYT09bnVsbClmb3IoYiBpbiBnKWdbYl0mJmdbYl0uc3RvcCYmYi5pbmRleE9mKCIucnVuIik9PT1iLmxlbmd0aC00JiZoKHRoaXMsZyxiKTtlbHNlIGdbYj1hKyIucnVuIl0mJmdbYl0uc3RvcCYmaCh0aGlzLGcsYik7Zm9yKGI9ZS5sZW5ndGg7Yi0tOyllW2JdLmVsZW09PT10aGlzJiYoYT09bnVsbHx8ZVtiXS5xdWV1ZT09PWEpJiYoZD9lW2JdKCEwKTplW2JdLnNhdmVTdGF0ZSgpLGM9ITAsZS5zcGxpY2UoYiwxKSk7KCFkfHwhYykmJmYuZGVxdWV1ZSh0aGlzLGEpfSl9fSksZi5lYWNoKHtzbGlkZURvd246Y3QoInNob3ciLDEpLHNsaWRlVXA6Y3QoImhpZGUiLDEpLHNsaWRlVG9nZ2xlOmN0KCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsYSxjLGQpfX0pLGYuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmdHlwZW9mIGE9PSJvYmplY3QiP2YuZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8Zi5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFmLmlzRnVuY3Rpb24oYikmJmJ9O2QuZHVyYXRpb249Zi5meC5vZmY/MDp0eXBlb2YgZC5kdXJhdGlvbj09Im51bWJlciI/ZC5kdXJhdGlvbjpkLmR1cmF0aW9uIGluIGYuZnguc3BlZWRzP2YuZnguc3BlZWRzW2QuZHVyYXRpb25dOmYuZnguc3BlZWRzLl9kZWZhdWx0O2lmKGQucXVldWU9PW51bGx8fGQucXVldWU9PT0hMClkLnF1ZXVlPSJmeCI7ZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKGEpe2YuaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZT9mLmRlcXVldWUodGhpcyxkLnF1ZXVlKTphIT09ITEmJmYuX3VubWFyayh0aGlzKX07cmV0dXJuIGR9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4tTWF0aC5jb3MoYSpNYXRoLlBJKS8yKy41fX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixjKXt0aGlzLm9wdGlvbnM9Yix0aGlzLmVsZW09YSx0aGlzLnByb3A9YyxiLm9yaWc9Yi5vcmlnfHx7fX19KSxmLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLChmLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Zi5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhLGI9Zi5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCk7cmV0dXJuIGlzTmFOKGE9cGFyc2VGbG9hdChiKSk/IWJ8fGI9PT0iYXV0byI/MDpiOmF9LGN1c3RvbTpmdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gaChhKXtyZXR1cm4gZS5zdGVwKGEpfXZhciBlPXRoaXMsZz1mLmZ4O3RoaXMuc3RhcnRUaW1lPWNxfHxjcigpLHRoaXMuZW5kPWMsdGhpcy5ub3c9dGhpcy5zdGFydD1hLHRoaXMucG9zPXRoaXMuc3RhdGU9MCx0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwoZi5jc3NOdW1iZXJbdGhpcy5wcm9wXT8iIjoicHgiKSxoLnF1ZXVlPXRoaXMub3B0aW9ucy5xdWV1ZSxoLmVsZW09dGhpcy5lbGVtLGguc2F2ZVN0YXRlPWZ1bmN0aW9uKCl7Zi5fZGF0YShlLmVsZW0sImZ4c2hvdyIrZS5wcm9wKT09PWImJihlLm9wdGlvbnMuaGlkZT9mLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3AsZS5zdGFydCk6ZS5vcHRpb25zLnNob3cmJmYuX2RhdGEoZS5lbGVtLCJmeHNob3ciK2UucHJvcCxlLmVuZCkpfSxoKCkmJmYudGltZXJzLnB1c2goaCkmJiFjbyYmKGNvPXNldEludGVydmFsKGcudGljayxnLmludGVydmFsKSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgYT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09YXx8Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuc2hvdz0hMCxhIT09Yj90aGlzLmN1c3RvbSh0aGlzLmN1cigpLGEpOnRoaXMuY3VzdG9tKHRoaXMucHJvcD09PSJ3aWR0aCJ8fHRoaXMucHJvcD09PSJoZWlnaHQiPzE6MCx0aGlzLmN1cigpKSxmKHRoaXMuZWxlbSkuc2hvdygpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5oaWRlPSEwLHRoaXMuY3VzdG9tKHRoaXMuY3VyKCksMCl9LHN0ZXA6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9Y3F8fGNyKCksZz0hMCxoPXRoaXMuZWxlbSxpPXRoaXMub3B0aW9ucztpZihhfHxlPj1pLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz10aGlzLmVuZCx0aGlzLnBvcz10aGlzLnN0YXRlPTEsdGhpcy51cGRhdGUoKSxpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdPSEwO2ZvcihiIGluIGkuYW5pbWF0ZWRQcm9wZXJ0aWVzKWkuYW5pbWF0ZWRQcm9wZXJ0aWVzW2JdIT09ITAmJihnPSExKTtpZihnKXtpLm92ZXJmbG93IT1udWxsJiYhZi5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3MmJmYuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oYSxiKXtoLnN0eWxlWyJvdmVyZmxvdyIrYl09aS5vdmVyZmxvd1thXX0pLGkuaGlkZSYmZihoKS5oaWRlKCk7aWYoaS5oaWRlfHxpLnNob3cpZm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpZi5zdHlsZShoLGIsaS5vcmlnW2JdKSxmLnJlbW92ZURhdGEoaCwiZnhzaG93IitiLCEwKSxmLnJlbW92ZURhdGEoaCwidG9nZ2xlIitiLCEwKTtkPWkuY29tcGxldGUsZCYmKGkuY29tcGxldGU9ITEsZC5jYWxsKGgpKX1yZXR1cm4hMX1pLmR1cmF0aW9uPT1JbmZpbml0eT90aGlzLm5vdz1lOihjPWUtdGhpcy5zdGFydFRpbWUsdGhpcy5zdGF0ZT1jL2kuZHVyYXRpb24sdGhpcy5wb3M9Zi5lYXNpbmdbaS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXV0odGhpcy5zdGF0ZSxjLDAsMSxpLmR1cmF0aW9uKSx0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvcyksdGhpcy51cGRhdGUoKTtyZXR1cm4hMH19LGYuZXh0ZW5kKGYuZngse3RpY2s6ZnVuY3Rpb24oKXt2YXIgYSxiPWYudGltZXJzLGM9MDtmb3IoO2M8Yi5sZW5ndGg7YysrKWE9YltjXSwhYSgpJiZiW2NdPT09YSYmYi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxmLmZ4LnN0b3AoKX0saW50ZXJ2YWw6MTMsc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoY28pLGNvPW51bGx9LHNwZWVkczp7c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxzdGVwOntvcGFjaXR5OmZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLCJvcGFjaXR5IixhLm5vdyl9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe2EuZWxlbS5zdHlsZSYmYS5lbGVtLnN0eWxlW2EucHJvcF0hPW51bGw/YS5lbGVtLnN0eWxlW2EucHJvcF09YS5ub3crYS51bml0OmEuZWxlbVthLnByb3BdPWEubm93fX19KSxmLmVhY2goY3AuY29uY2F0LmFwcGx5KFtdLGNwKSxmdW5jdGlvbihhLGIpe2IuaW5kZXhPZigibWFyZ2luIikmJihmLmZ4LnN0ZXBbYl09ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sYixNYXRoLm1heCgwLGEubm93KSthLnVuaXQpfSl9KSxmLmV4cHImJmYuZXhwci5maWx0ZXJzJiYoZi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZ3JlcChmLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0pO3ZhciBjdixjdz0vXnQoPzphYmxlfGR8aCkkL2ksY3g9L14oPzpib2R5fGh0bWwpJC9pOyJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gYy5kb2N1bWVudEVsZW1lbnQ/Y3Y9ZnVuY3Rpb24oYSxiLGMsZCl7dHJ5e2Q9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChlKXt9aWYoIWR8fCFmLmNvbnRhaW5zKGMsYSkpcmV0dXJuIGQ/e3RvcDpkLnRvcCxsZWZ0OmQubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGc9Yi5ib2R5LGg9Y3koYiksaT1jLmNsaWVudFRvcHx8Zy5jbGllbnRUb3B8fDAsaj1jLmNsaWVudExlZnR8fGcuY2xpZW50TGVmdHx8MCxrPWgucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmYy5zY3JvbGxUb3B8fGcuc2Nyb2xsVG9wLGw9aC5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZjLnNjcm9sbExlZnR8fGcuc2Nyb2xsTGVmdCxtPWQudG9wK2staSxuPWQubGVmdCtsLWo7cmV0dXJue3RvcDptLGxlZnQ6bn19OmN2PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPWEub2Zmc2V0UGFyZW50LGc9YSxoPWIuYm9keSxpPWIuZGVmYXVsdFZpZXcsaj1pP2kuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpOmEuY3VycmVudFN0eWxlLGs9YS5vZmZzZXRUb3AsbD1hLm9mZnNldExlZnQ7d2hpbGUoKGE9YS5wYXJlbnROb2RlKSYmYSE9PWgmJmEhPT1jKXtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmai5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7ZD1pP2kuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpOmEuY3VycmVudFN0eWxlLGstPWEuc2Nyb2xsVG9wLGwtPWEuc2Nyb2xsTGVmdCxhPT09ZSYmKGsrPWEub2Zmc2V0VG9wLGwrPWEub2Zmc2V0TGVmdCxmLnN1cHBvcnQuZG9lc05vdEFkZEJvcmRlciYmKCFmLnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjdy50ZXN0KGEubm9kZU5hbWUpKSYmKGsrPXBhcnNlRmxvYXQoZC5ib3JkZXJUb3BXaWR0aCl8fDAsbCs9cGFyc2VGbG9hdChkLmJvcmRlckxlZnRXaWR0aCl8fDApLGc9ZSxlPWEub2Zmc2V0UGFyZW50KSxmLnN1cHBvcnQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZkLm92ZXJmbG93IT09InZpc2libGUiJiYoays9cGFyc2VGbG9hdChkLmJvcmRlclRvcFdpZHRoKXx8MCxsKz1wYXJzZUZsb2F0KGQuYm9yZGVyTGVmdFdpZHRoKXx8MCksaj1kfWlmKGoucG9zaXRpb249PT0icmVsYXRpdmUifHxqLnBvc2l0aW9uPT09InN0YXRpYyIpays9aC5vZmZzZXRUb3AsbCs9aC5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZqLnBvc2l0aW9uPT09ImZpeGVkIiYmKGsrPU1hdGgubWF4KGMuc2Nyb2xsVG9wLGguc2Nyb2xsVG9wKSxsKz1NYXRoLm1heChjLnNjcm9sbExlZnQsaC5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDprLGxlZnQ6bH19LGYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGE9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYz10aGlzWzBdLGQ9YyYmYy5vd25lckRvY3VtZW50O2lmKCFkKXJldHVybiBudWxsO2lmKGM9PT1kLmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYyk7cmV0dXJuIGN2KGMsZCxkLmRvY3VtZW50RWxlbWVudCl9LGYub2Zmc2V0PXtib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3gudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3gudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxjKXt2YXIgZD0vWS8udGVzdChjKTtmLmZuW2FdPWZ1bmN0aW9uKGUpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEsZSxnKXt2YXIgaD1jeShhKTtpZihnPT09YilyZXR1cm4gaD9jIGluIGg/aFtjXTpmLnN1cHBvcnQuYm94TW9kZWwmJmguZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W2VdfHxoLmRvY3VtZW50LmJvZHlbZV06YVtlXTtoP2guc2Nyb2xsVG8oZD9mKGgpLnNjcm9sbExlZnQoKTpnLGQ/ZzpmKGgpLnNjcm9sbFRvcCgpKTphW2VdPWd9LGEsZSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLGYuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGEsYyl7dmFyIGQ9ImNsaWVudCIrYSxlPSJzY3JvbGwiK2EsZz0ib2Zmc2V0IithO2YuZm5bImlubmVyIithXT1mdW5jdGlvbigpe3ZhciBhPXRoaXNbMF07cmV0dXJuIGE/YS5zdHlsZT9wYXJzZUZsb2F0KGYuY3NzKGEsYywicGFkZGluZyIpKTp0aGlzW2NdKCk6bnVsbH0sZi5mblsib3V0ZXIiK2FdPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07cmV0dXJuIGI/Yi5zdHlsZT9wYXJzZUZsb2F0KGYuY3NzKGIsYyxhPyJtYXJnaW4iOiJib3JkZXIiKSk6dGhpc1tjXSgpOm51bGx9LGYuZm5bY109ZnVuY3Rpb24oYSl7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSxjLGgpe3ZhciBpLGosayxsO2lmKGYuaXNXaW5kb3coYSkpe2k9YS5kb2N1bWVudCxqPWkuZG9jdW1lbnRFbGVtZW50W2RdO3JldHVybiBmLnN1cHBvcnQuYm94TW9kZWwmJmp8fGkuYm9keSYmaS5ib2R5W2RdfHxqfWlmKGEubm9kZVR5cGU9PT05KXtpPWEuZG9jdW1lbnRFbGVtZW50O2lmKGlbZF0+PWlbZV0pcmV0dXJuIGlbZF07cmV0dXJuIE1hdGgubWF4KGEuYm9keVtlXSxpW2VdLGEuYm9keVtnXSxpW2ddKX1pZihoPT09Yil7az1mLmNzcyhhLGMpLGw9cGFyc2VGbG9hdChrKTtyZXR1cm4gZi5pc051bWVyaWMobCk/bDprfWYoYSkuY3NzKGMsaCl9LGMsYSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLGEualF1ZXJ5PWEuJD1mLHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQmJmRlZmluZS5hbWQualF1ZXJ5JiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gZn0pfSkod2luZG93KTsNCisvKiEKKworQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycworaHR0cDovL2pxdWVyeS5jb20vCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQoraW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCitXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworKi8KKworLyohIGpRdWVyeSB2MS43LjIganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLworKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gY3koYSl7cmV0dXJuIGYuaXNXaW5kb3coYSk/YTphLm5vZGVUeXBlPT09OT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1mdW5jdGlvbiBjdShhKXtpZighY2pbYV0pe3ZhciBiPWMuYm9keSxkPWYoIjwiK2ErIj4iKS5hcHBlbmRUbyhiKSxlPWQuY3NzKCJkaXNwbGF5Iik7ZC5yZW1vdmUoKTtpZihlPT09Im5vbmUifHxlPT09IiIpe2NrfHwoY2s9Yy5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSxjay5mcmFtZUJvcmRlcj1jay53aWR0aD1jay5oZWlnaHQ9MCksYi5hcHBlbmRDaGlsZChjayk7aWYoIWNsfHwhY2suY3JlYXRlRWxlbWVudCljbD0oY2suY29udGVudFdpbmRvd3x8Y2suY29udGVudERvY3VtZW50KS5kb2N1bWVudCxjbC53cml0ZSgoZi5zdXBwb3J0LmJveE1vZGVsPyI8IWRvY3R5cGUgaHRtbD4iOiIiKSsiPGh0bWw+PGJvZHk+IiksY2wuY2xvc2UoKTtkPWNsLmNyZWF0ZUVsZW1lbnQoYSksY2wuYm9keS5hcHBlbmRDaGlsZChkKSxlPWYuY3NzKGQsImRpc3BsYXkiKSxiLnJlbW92ZUNoaWxkKGNrKX1jalthXT1lfXJldHVybiBjalthXX1mdW5jdGlvbiBjdChhLGIpe3ZhciBjPXt9O2YuZWFjaChjcC5jb25jYXQuYXBwbHkoW10sY3Auc2xpY2UoMCxiKSksZnVuY3Rpb24oKXtjW3RoaXNdPWF9KTtyZXR1cm4gY31mdW5jdGlvbiBjcygpe2NxPWJ9ZnVuY3Rpb24gY3IoKXtzZXRUaW1lb3V0KGNzLDApO3JldHVybiBjcT1mLm5vdygpfWZ1bmN0aW9uIGNpKCl7dHJ5e3JldHVybiBuZXcgYS5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfWNhdGNoKGIpe319ZnVuY3Rpb24gY2goKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gY2IoYSxjKXthLmRhdGFGaWx0ZXImJihjPWEuZGF0YUZpbHRlcihjLGEuZGF0YVR5cGUpKTt2YXIgZD1hLmRhdGFUeXBlcyxlPXt9LGcsaCxpPWQubGVuZ3RoLGosaz1kWzBdLGwsbSxuLG8scDtmb3IoZz0xO2c8aTtnKyspe2lmKGc9PT0xKWZvcihoIGluIGEuY29udmVydGVycyl0eXBlb2YgaD09InN0cmluZyImJihlW2gudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2hdKTtsPWssaz1kW2ddO2lmKGs9PT0iKiIpaz1sO2Vsc2UgaWYobCE9PSIqIiYmbCE9PWspe209bCsiICIrayxuPWVbbV18fGVbIiogIitrXTtpZighbil7cD1iO2ZvcihvIGluIGUpe2o9by5zcGxpdCgiICIpO2lmKGpbMF09PT1sfHxqWzBdPT09IioiKXtwPWVbalsxXSsiICIra107aWYocCl7bz1lW29dLG89PT0hMD9uPXA6cD09PSEwJiYobj1vKTticmVha319fX0hbiYmIXAmJmYuZXJyb3IoIk5vIGNvbnZlcnNpb24gZnJvbSAiK20ucmVwbGFjZSgiICIsIiB0byAiKSksbiE9PSEwJiYoYz1uP24oYyk6cChvKGMpKSl9fXJldHVybiBjfWZ1bmN0aW9uIGNhKGEsYyxkKXt2YXIgZT1hLmNvbnRlbnRzLGY9YS5kYXRhVHlwZXMsZz1hLnJlc3BvbnNlRmllbGRzLGgsaSxqLGs7Zm9yKGkgaW4gZylpIGluIGQmJihjW2dbaV1dPWRbaV0pO3doaWxlKGZbMF09PT0iKiIpZi5zaGlmdCgpLGg9PT1iJiYoaD1hLm1pbWVUeXBlfHxjLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSk7aWYoaClmb3IoaSBpbiBlKWlmKGVbaV0mJmVbaV0udGVzdChoKSl7Zi51bnNoaWZ0KGkpO2JyZWFrfWlmKGZbMF1pbiBkKWo9ZlswXTtlbHNle2ZvcihpIGluIGQpe2lmKCFmWzBdfHxhLmNvbnZlcnRlcnNbaSsiICIrZlswXV0pe2o9aTticmVha31rfHwoaz1pKX1qPWp8fGt9aWYoail7aiE9PWZbMF0mJmYudW5zaGlmdChqKTtyZXR1cm4gZFtqXX19ZnVuY3Rpb24gYl8oYSxiLGMsZCl7aWYoZi5pc0FycmF5KGIpKWYuZWFjaChiLGZ1bmN0aW9uKGIsZSl7Y3x8YkQudGVzdChhKT9kKGEsZSk6Yl8oYSsiWyIrKHR5cGVvZiBlPT0ib2JqZWN0Ij9iOiIiKSsiXSIsZSxjLGQpfSk7ZWxzZSBpZighYyYmZi50eXBlKGIpPT09Im9iamVjdCIpZm9yKHZhciBlIGluIGIpYl8oYSsiWyIrZSsiXSIsYltlXSxjLGQpO2Vsc2UgZChhLGIpfWZ1bmN0aW9uIGIkKGEsYyl7dmFyIGQsZSxnPWYuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoZCBpbiBjKWNbZF0hPT1iJiYoKGdbZF0/YTplfHwoZT17fSkpW2RdPWNbZF0pO2UmJmYuZXh0ZW5kKCEwLGEsZSl9ZnVuY3Rpb24gYlooYSxjLGQsZSxmLGcpe2Y9Znx8Yy5kYXRhVHlwZXNbMF0sZz1nfHx7fSxnW2ZdPSEwO3ZhciBoPWFbZl0saT0wLGo9aD9oLmxlbmd0aDowLGs9YT09PWJTLGw7Zm9yKDtpPGomJihrfHwhbCk7aSsrKWw9aFtpXShjLGQsZSksdHlwZW9mIGw9PSJzdHJpbmciJiYoIWt8fGdbbF0/bD1iOihjLmRhdGFUeXBlcy51bnNoaWZ0KGwpLGw9YlooYSxjLGQsZSxsLGcpKSk7KGt8fCFsKSYmIWdbIioiXSYmKGw9YlooYSxjLGQsZSwiKiIsZykpO3JldHVybiBsfWZ1bmN0aW9uIGJZKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe3R5cGVvZiBiIT0ic3RyaW5nIiYmKGM9YixiPSIqIik7aWYoZi5pc0Z1bmN0aW9uKGMpKXt2YXIgZD1iLnRvTG93ZXJDYXNlKCkuc3BsaXQoYk8pLGU9MCxnPWQubGVuZ3RoLGgsaSxqO2Zvcig7ZTxnO2UrKyloPWRbZV0saj0vXlwrLy50ZXN0KGgpLGomJihoPWguc3Vic3RyKDEpfHwiKiIpLGk9YVtoXT1hW2hdfHxbXSxpW2o/InVuc2hpZnQiOiJwdXNoIl0oYyl9fX1mdW5jdGlvbiBiQihhLGIsYyl7dmFyIGQ9Yj09PSJ3aWR0aCI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxlPWI9PT0id2lkdGgiPzE6MCxnPTQ7aWYoZD4wKXtpZihjIT09ImJvcmRlciIpZm9yKDtlPGc7ZSs9MiljfHwoZC09cGFyc2VGbG9hdChmLmNzcyhhLCJwYWRkaW5nIitieFtlXSkpfHwwKSxjPT09Im1hcmdpbiI/ZCs9cGFyc2VGbG9hdChmLmNzcyhhLGMrYnhbZV0pKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrYnhbZV0rIldpZHRoIikpfHwwO3JldHVybiBkKyJweCJ9ZD1ieShhLGIpO2lmKGQ8MHx8ZD09bnVsbClkPWEuc3R5bGVbYl07aWYoYnQudGVzdChkKSlyZXR1cm4gZDtkPXBhcnNlRmxvYXQoZCl8fDA7aWYoYylmb3IoO2U8ZztlKz0yKWQrPXBhcnNlRmxvYXQoZi5jc3MoYSwicGFkZGluZyIrYnhbZV0pKXx8MCxjIT09InBhZGRpbmciJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK2J4W2VdKyJXaWR0aCIpKXx8MCksYz09PSJtYXJnaW4iJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLGMrYnhbZV0pKXx8MCk7cmV0dXJuIGQrInB4In1mdW5jdGlvbiBibyhhKXt2YXIgYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2JoLmFwcGVuZENoaWxkKGIpLGIuaW5uZXJIVE1MPWEub3V0ZXJIVE1MO3JldHVybiBiLmZpcnN0Q2hpbGR9ZnVuY3Rpb24gYm4oYSl7dmFyIGI9KGEubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpO2I9PT0iaW5wdXQiP2JtKGEpOmIhPT0ic2NyaXB0IiYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZmLmdyZXAoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxibSl9ZnVuY3Rpb24gYm0oYSl7aWYoYS50eXBlPT09ImNoZWNrYm94Inx8YS50eXBlPT09InJhZGlvIilhLmRlZmF1bHRDaGVja2VkPWEuY2hlY2tlZH1mdW5jdGlvbiBibChhKXtyZXR1cm4gdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsIT0idW5kZWZpbmVkIj9hLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTpbXX1mdW5jdGlvbiBiayhhLGIpe3ZhciBjO2Iubm9kZVR5cGU9PT0xJiYoYi5jbGVhckF0dHJpYnV0ZXMmJmIuY2xlYXJBdHRyaWJ1dGVzKCksYi5tZXJnZUF0dHJpYnV0ZXMmJmIubWVyZ2VBdHRyaWJ1dGVzKGEpLGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGM9PT0ib2JqZWN0Ij9iLm91dGVySFRNTD1hLm91dGVySFRNTDpjIT09ImlucHV0Inx8YS50eXBlIT09ImNoZWNrYm94IiYmYS50eXBlIT09InJhZGlvIj9jPT09Im9wdGlvbiI/Yi5zZWxlY3RlZD1hLmRlZmF1bHRTZWxlY3RlZDpjPT09ImlucHV0Inx8Yz09PSJ0ZXh0YXJlYSI/Yi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWU6Yz09PSJzY3JpcHQiJiZiLnRleHQhPT1hLnRleHQmJihiLnRleHQ9YS50ZXh0KTooYS5jaGVja2VkJiYoYi5kZWZhdWx0Q2hlY2tlZD1iLmNoZWNrZWQ9YS5jaGVja2VkKSxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpLGIucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyksYi5yZW1vdmVBdHRyaWJ1dGUoIl9zdWJtaXRfYXR0YWNoZWQiKSxiLnJlbW92ZUF0dHJpYnV0ZSgiX2NoYW5nZV9hdHRhY2hlZCIpKX1mdW5jdGlvbiBiaihhLGIpe2lmKGIubm9kZVR5cGU9PT0xJiYhIWYuaGFzRGF0YShhKSl7dmFyIGMsZCxlLGc9Zi5fZGF0YShhKSxoPWYuX2RhdGEoYixnKSxpPWcuZXZlbnRzO2lmKGkpe2RlbGV0ZSBoLmhhbmRsZSxoLmV2ZW50cz17fTtmb3IoYyBpbiBpKWZvcihkPTAsZT1pW2NdLmxlbmd0aDtkPGU7ZCsrKWYuZXZlbnQuYWRkKGIsYyxpW2NdW2RdKX1oLmRhdGEmJihoLmRhdGE9Zi5leHRlbmQoe30saC5kYXRhKSl9fWZ1bmN0aW9uIGJpKGEsYil7cmV0dXJuIGYubm9kZU5hbWUoYSwidGFibGUiKT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxhLmFwcGVuZENoaWxkKGEub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTphfWZ1bmN0aW9uIFUoYSl7dmFyIGI9Vi5zcGxpdCgifCIpLGM9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYoYy5jcmVhdGVFbGVtZW50KXdoaWxlKGIubGVuZ3RoKWMuY3JlYXRlRWxlbWVudChiLnBvcCgpKTtyZXR1cm4gY31mdW5jdGlvbiBUKGEsYixjKXtiPWJ8fDA7aWYoZi5pc0Z1bmN0aW9uKGIpKXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3ZhciBlPSEhYi5jYWxsKGEsZCxhKTtyZXR1cm4gZT09PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiBhPT09Yj09PWN9KTtpZih0eXBlb2YgYj09InN0cmluZyIpe3ZhciBkPWYuZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVUeXBlPT09MX0pO2lmKE8udGVzdChiKSlyZXR1cm4gZi5maWx0ZXIoYixkLCFjKTtiPWYuZmlsdGVyKGIsZCl9cmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGYuaW5BcnJheShhLGIpPj0wPT09Y30pfWZ1bmN0aW9uIFMoYSl7cmV0dXJuIWF8fCFhLnBhcmVudE5vZGV8fGEucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExfWZ1bmN0aW9uIEsoKXtyZXR1cm4hMH1mdW5jdGlvbiBKKCl7cmV0dXJuITF9ZnVuY3Rpb24gbihhLGIsYyl7dmFyIGQ9YisiZGVmZXIiLGU9YisicXVldWUiLGc9YisibWFyayIsaD1mLl9kYXRhKGEsZCk7aCYmKGM9PT0icXVldWUifHwhZi5fZGF0YShhLGUpKSYmKGM9PT0ibWFyayJ8fCFmLl9kYXRhKGEsZykpJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IWYuX2RhdGEoYSxlKSYmIWYuX2RhdGEoYSxnKSYmKGYucmVtb3ZlRGF0YShhLGQsITApLGguZmlyZSgpKX0sMCl9ZnVuY3Rpb24gbShhKXtmb3IodmFyIGIgaW4gYSl7aWYoYj09PSJkYXRhIiYmZi5pc0VtcHR5T2JqZWN0KGFbYl0pKWNvbnRpbnVlO2lmKGIhPT0idG9KU09OIilyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBsKGEsYyxkKXtpZihkPT09YiYmYS5ub2RlVHlwZT09PTEpe3ZhciBlPSJkYXRhLSIrYy5yZXBsYWNlKGssIi0kMSIpLnRvTG93ZXJDYXNlKCk7ZD1hLmdldEF0dHJpYnV0ZShlKTtpZih0eXBlb2YgZD09InN0cmluZyIpe3RyeXtkPWQ9PT0idHJ1ZSI/ITA6ZD09PSJmYWxzZSI/ITE6ZD09PSJudWxsIj9udWxsOmYuaXNOdW1lcmljKGQpPytkOmoudGVzdChkKT9mLnBhcnNlSlNPTihkKTpkfWNhdGNoKGcpe31mLmRhdGEoYSxjLGQpfWVsc2UgZD1ifXJldHVybiBkfWZ1bmN0aW9uIGgoYSl7dmFyIGI9Z1thXT17fSxjLGQ7YT1hLnNwbGl0KC9ccysvKTtmb3IoYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyliW2FbY11dPSEwO3JldHVybiBifXZhciBjPWEuZG9jdW1lbnQsZD1hLm5hdmlnYXRvcixlPWEubG9jYXRpb24sZj1mdW5jdGlvbigpe2Z1bmN0aW9uIEooKXtpZighZS5pc1JlYWR5KXt0cnl7Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChhKXtzZXRUaW1lb3V0KEosMSk7cmV0dXJufWUucmVhZHkoKX19dmFyIGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IGUuZm4uaW5pdChhLGIsaCl9LGY9YS5qUXVlcnksZz1hLiQsaCxpPS9eKD86W14jPF0qKDxbXHdcV10rPilbXj5dKiR8IyhbXHdcLV0qKSQpLyxqPS9cUy8saz0vXlxzKy8sbD0vXHMrJC8sbT0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLG49L15bXF0sOnt9XHNdKiQvLG89L1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZyxwPS8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZyxxPS8oPzpefDp8LCkoPzpccypcWykrL2cscj0vKHdlYmtpdClbIFwvXShbXHcuXSspLyxzPS8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLyx0PS8obXNpZSkgKFtcdy5dKykvLHU9Lyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKSk/Lyx2PS8tKFthLXpdfFswLTldKS9pZyx3PS9eLW1zLS8seD1mdW5jdGlvbihhLGIpe3JldHVybihiKyIiKS50b1VwcGVyQ2FzZSgpfSx5PWQudXNlckFnZW50LHosQSxCLEM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxEPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksRT1BcnJheS5wcm90b3R5cGUucHVzaCxGPUFycmF5LnByb3RvdHlwZS5zbGljZSxHPVN0cmluZy5wcm90b3R5cGUudHJpbSxIPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLEk9e307ZS5mbj1lLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZSxpbml0OmZ1bmN0aW9uKGEsZCxmKXt2YXIgZyxoLGosaztpZighYSlyZXR1cm4gdGhpcztpZihhLm5vZGVUeXBlKXt0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTE7cmV0dXJuIHRoaXN9aWYoYT09PSJib2R5IiYmIWQmJmMuYm9keSl7dGhpcy5jb250ZXh0PWMsdGhpc1swXT1jLmJvZHksdGhpcy5zZWxlY3Rvcj1hLHRoaXMubGVuZ3RoPTE7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJzdHJpbmciKXthLmNoYXJBdCgwKSE9PSI8Inx8YS5jaGFyQXQoYS5sZW5ndGgtMSkhPT0iPiJ8fGEubGVuZ3RoPDM/Zz1pLmV4ZWMoYSk6Zz1bbnVsbCxhLG51bGxdO2lmKGcmJihnWzFdfHwhZCkpe2lmKGdbMV0pe2Q9ZCBpbnN0YW5jZW9mIGU/ZFswXTpkLGs9ZD9kLm93bmVyRG9jdW1lbnR8fGQ6YyxqPW0uZXhlYyhhKSxqP2UuaXNQbGFpbk9iamVjdChkKT8oYT1bYy5jcmVhdGVFbGVtZW50KGpbMV0pXSxlLmZuLmF0dHIuY2FsbChhLGQsITApKTphPVtrLmNyZWF0ZUVsZW1lbnQoalsxXSldOihqPWUuYnVpbGRGcmFnbWVudChbZ1sxXV0sW2tdKSxhPShqLmNhY2hlYWJsZT9lLmNsb25lKGouZnJhZ21lbnQpOmouZnJhZ21lbnQpLmNoaWxkTm9kZXMpO3JldHVybiBlLm1lcmdlKHRoaXMsYSl9aD1jLmdldEVsZW1lbnRCeUlkKGdbMl0pO2lmKGgmJmgucGFyZW50Tm9kZSl7aWYoaC5pZCE9PWdbMl0pcmV0dXJuIGYuZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09aH10aGlzLmNvbnRleHQ9Yyx0aGlzLnNlbGVjdG9yPWE7cmV0dXJuIHRoaXN9cmV0dXJuIWR8fGQuanF1ZXJ5PyhkfHxmKS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoZCkuZmluZChhKX1pZihlLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGYucmVhZHkoYSk7YS5zZWxlY3RvciE9PWImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCk7cmV0dXJuIGUubWFrZUFycmF5KGEsdGhpcyl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS43LjIiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gRi5jYWxsKHRoaXMsMCl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD90aGlzLnRvQXJyYXkoKTphPDA/dGhpc1t0aGlzLmxlbmd0aCthXTp0aGlzW2FdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuY29uc3RydWN0b3IoKTtlLmlzQXJyYXkoYSk/RS5hcHBseShkLGEpOmUubWVyZ2UoZCxhKSxkLnByZXZPYmplY3Q9dGhpcyxkLmNvbnRleHQ9dGhpcy5jb250ZXh0LGI9PT0iZmluZCI/ZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyh0aGlzLnNlbGVjdG9yPyIgIjoiIikrYzpiJiYoZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyIuIitiKyIoIitjKyIpIik7cmV0dXJuIGR9LGVhY2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZS5lYWNoKHRoaXMsYSxiKX0scmVhZHk6ZnVuY3Rpb24oYSl7ZS5iaW5kUmVhZHkoKSxBLmFkZChhKTtyZXR1cm4gdGhpc30sZXE6ZnVuY3Rpb24oYSl7YT0rYTtyZXR1cm4gYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLGErMSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKEYuYXBwbHkodGhpcyxhcmd1bWVudHMpLCJzbGljZSIsRi5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhlLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6RSxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0sZS5mbi5pbml0LnByb3RvdHlwZT1lLmZuLGUuZXh0ZW5kPWUuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYyxkLGYsZyxoLGk9YXJndW1lbnRzWzBdfHx7fSxqPTEsaz1hcmd1bWVudHMubGVuZ3RoLGw9ITE7dHlwZW9mIGk9PSJib29sZWFuIiYmKGw9aSxpPWFyZ3VtZW50c1sxXXx8e30saj0yKSx0eXBlb2YgaSE9Im9iamVjdCImJiFlLmlzRnVuY3Rpb24oaSkmJihpPXt9KSxrPT09aiYmKGk9dGhpcywtLWopO2Zvcig7ajxrO2orKylpZigoYT1hcmd1bWVudHNbal0pIT1udWxsKWZvcihjIGluIGEpe2Q9aVtjXSxmPWFbY107aWYoaT09PWYpY29udGludWU7bCYmZiYmKGUuaXNQbGFpbk9iamVjdChmKXx8KGc9ZS5pc0FycmF5KGYpKSk/KGc/KGc9ITEsaD1kJiZlLmlzQXJyYXkoZCk/ZDpbXSk6aD1kJiZlLmlzUGxhaW5PYmplY3QoZCk/ZDp7fSxpW2NdPWUuZXh0ZW5kKGwsaCxmKSk6ZiE9PWImJihpW2NdPWYpfXJldHVybiBpfSxlLmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbihiKXthLiQ9PT1lJiYoYS4kPWcpLGImJmEualF1ZXJ5PT09ZSYmKGEualF1ZXJ5PWYpO3JldHVybiBlfSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP2UucmVhZHlXYWl0Kys6ZS5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMCYmIS0tZS5yZWFkeVdhaXR8fGEhPT0hMCYmIWUuaXNSZWFkeSl7aWYoIWMuYm9keSlyZXR1cm4gc2V0VGltZW91dChlLnJlYWR5LDEpO2UuaXNSZWFkeT0hMDtpZihhIT09ITAmJi0tZS5yZWFkeVdhaXQ+MClyZXR1cm47QS5maXJlV2l0aChjLFtlXSksZS5mbi50cmlnZ2VyJiZlKGMpLnRyaWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpfX0sYmluZFJlYWR5OmZ1bmN0aW9uKCl7aWYoIUEpe0E9ZS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iik7aWYoYy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIilyZXR1cm4gc2V0VGltZW91dChlLnJlYWR5LDEpO2lmKGMuYWRkRXZlbnRMaXN0ZW5lciljLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIsITEpLGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZS5yZWFkeSwhMSk7ZWxzZSBpZihjLmF0dGFjaEV2ZW50KXtjLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEIpLGEuYXR0YWNoRXZlbnQoIm9ubG9hZCIsZS5yZWFkeSk7dmFyIGI9ITE7dHJ5e2I9YS5mcmFtZUVsZW1lbnQ9PW51bGx9Y2F0Y2goZCl7fWMuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsJiZiJiZKKCl9fX0saXNGdW5jdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4gZS50eXBlKGEpPT09ImZ1bmN0aW9uIn0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4gZS50eXBlKGEpPT09ImFycmF5In0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPW51bGwmJmE9PWEud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoYSkpJiZpc0Zpbml0ZShhKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9TdHJpbmcoYSk6SVtDLmNhbGwoYSldfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtpZighYXx8ZS50eXBlKGEpIT09Im9iamVjdCJ8fGEubm9kZVR5cGV8fGUuaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFELmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIUQuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfXZhciBkO2ZvcihkIGluIGEpO3JldHVybiBkPT09Ynx8RC5jYWxsKGEsZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihuLnRlc3QoYi5yZXBsYWNlKG8sIkAiKS5yZXBsYWNlKHAsIl0iKS5yZXBsYWNlKHEsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe2lmKHR5cGVvZiBjIT0ic3RyaW5nInx8IWMpcmV0dXJuIG51bGw7dmFyIGQsZjt0cnl7YS5ET01QYXJzZXI/KGY9bmV3IERPTVBhcnNlcixkPWYucGFyc2VGcm9tU3RyaW5nKGMsInRleHQveG1sIikpOihkPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIiksZC5hc3luYz0iZmFsc2UiLGQubG9hZFhNTChjKSl9Y2F0Y2goZyl7ZD1ifSghZHx8IWQuZG9jdW1lbnRFbGVtZW50fHxkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aCkmJmUuZXJyb3IoIkludmFsaWQgWE1MOiAiK2MpO3JldHVybiBkfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGIpe2ImJmoudGVzdChiKSYmKGEuZXhlY1NjcmlwdHx8ZnVuY3Rpb24oYil7YS5ldmFsLmNhbGwoYSxiKX0pKGIpfSxjYW1lbENhc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSh3LCJtcy0iKS5yZXBsYWNlKHYseCl9LG5vZGVOYW1lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9VcHBlckNhc2UoKT09PWIudG9VcHBlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZz0wLGg9YS5sZW5ndGgsaT1oPT09Ynx8ZS5pc0Z1bmN0aW9uKGEpO2lmKGQpe2lmKGkpe2ZvcihmIGluIGEpaWYoYy5hcHBseShhW2ZdLGQpPT09ITEpYnJlYWt9ZWxzZSBmb3IoO2c8aDspaWYoYy5hcHBseShhW2crK10sZCk9PT0hMSlicmVha31lbHNlIGlmKGkpe2ZvcihmIGluIGEpaWYoYy5jYWxsKGFbZl0sZixhW2ZdKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuY2FsbChhW2ddLGcsYVtnKytdKT09PSExKWJyZWFrO3JldHVybiBhfSx0cmltOkc/ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6Ry5jYWxsKGEpfTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjooYSsiIikucmVwbGFjZShrLCIiKS5yZXBsYWNlKGwsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxiKXt2YXIgYz1ifHxbXTtpZihhIT1udWxsKXt2YXIgZD1lLnR5cGUoYSk7YS5sZW5ndGg9PW51bGx8fGQ9PT0ic3RyaW5nInx8ZD09PSJmdW5jdGlvbiJ8fGQ9PT0icmVnZXhwInx8ZS5pc1dpbmRvdyhhKT9FLmNhbGwoYyxhKTplLm1lcmdlKGMsYSl9cmV0dXJuIGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKEgpcmV0dXJuIEguY2FsbChiLGEsYyk7ZD1iLmxlbmd0aCxjPWM/YzwwP01hdGgubWF4KDAsZCtjKTpjOjA7Zm9yKDtjPGQ7YysrKWlmKGMgaW4gYiYmYltjXT09PWEpcmV0dXJuIGN9cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5sZW5ndGgsZT0wO2lmKHR5cGVvZiBjLmxlbmd0aD09Im51bWJlciIpZm9yKHZhciBmPWMubGVuZ3RoO2U8ZjtlKyspYVtkKytdPWNbZV07ZWxzZSB3aGlsZShjW2VdIT09YilhW2QrK109Y1tlKytdO2EubGVuZ3RoPWQ7cmV0dXJuIGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU7Yz0hIWM7Zm9yKHZhciBmPTAsZz1hLmxlbmd0aDtmPGc7ZisrKWU9ISFiKGFbZl0sZiksYyE9PWUmJmQucHVzaChhW2ZdKTtyZXR1cm4gZH0sbWFwOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZixnLGg9W10saT0wLGo9YS5sZW5ndGgsaz1hIGluc3RhbmNlb2YgZXx8aiE9PWImJnR5cGVvZiBqPT0ibnVtYmVyIiYmKGo+MCYmYVswXSYmYVtqLTFdfHxqPT09MHx8ZS5pc0FycmF5KGEpKTtpZihrKWZvcig7aTxqO2krKylmPWMoYVtpXSxpLGQpLGYhPW51bGwmJihoW2gubGVuZ3RoXT1mKTtlbHNlIGZvcihnIGluIGEpZj1jKGFbZ10sZyxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7cmV0dXJuIGguY29uY2F0LmFwcGx5KFtdLGgpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oYSxjKXtpZih0eXBlb2YgYz09InN0cmluZyIpe3ZhciBkPWFbY107Yz1hLGE9ZH1pZighZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBiO3ZhciBmPUYuY2FsbChhcmd1bWVudHMsMiksZz1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGMsZi5jb25jYXQoRi5jYWxsKGFyZ3VtZW50cykpKX07Zy5ndWlkPWEuZ3VpZD1hLmd1aWR8fGcuZ3VpZHx8ZS5ndWlkKys7cmV0dXJuIGd9LGFjY2VzczpmdW5jdGlvbihhLGMsZCxmLGcsaCxpKXt2YXIgaixrPWQ9PW51bGwsbD0wLG09YS5sZW5ndGg7aWYoZCYmdHlwZW9mIGQ9PSJvYmplY3QiKXtmb3IobCBpbiBkKWUuYWNjZXNzKGEsYyxsLGRbbF0sMSxoLGYpO2c9MX1lbHNlIGlmKGYhPT1iKXtqPWk9PT1iJiZlLmlzRnVuY3Rpb24oZiksayYmKGo/KGo9YyxjPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gai5jYWxsKGUoYSksYyl9KTooYy5jYWxsKGEsZiksYz1udWxsKSk7aWYoYylmb3IoO2w8bTtsKyspYyhhW2xdLGQsaj9mLmNhbGwoYVtsXSxsLGMoYVtsXSxkKSk6ZixpKTtnPTF9cmV0dXJuIGc/YTprP2MuY2FsbChhKTptP2MoYVswXSxkKTpofSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1yLmV4ZWMoYSl8fHMuZXhlYyhhKXx8dC5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ1LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSx6PWUudWFNYXRjaCh5KSx6LmJyb3dzZXImJihlLmJyb3dzZXJbei5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj16LnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIsKgIikmJihrPS9eW1xzXHhBMF0rLyxsPS9bXHNceEEwXSskLyksaD1lKGMpLGMuYWRkRXZlbnRMaXN0ZW5lcj9CPWZ1bmN0aW9uKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxlLnJlYWR5KCl9OmMuYXR0YWNoRXZlbnQmJihCPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIiYmKGMuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQiksZS5yZWFkeSgpKX0pO3JldHVybiBlfSgpLGc9e307Zi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT1hP2dbYV18fGgoYSk6e307dmFyIGM9W10sZD1bXSxlLGksaixrLGwsbSxuPWZ1bmN0aW9uKGIpe3ZhciBkLGUsZyxoLGk7Zm9yKGQ9MCxlPWIubGVuZ3RoO2Q8ZTtkKyspZz1iW2RdLGg9Zi50eXBlKGcpLGg9PT0iYXJyYXkiP24oZyk6aD09PSJmdW5jdGlvbiImJighYS51bmlxdWV8fCFwLmhhcyhnKSkmJmMucHVzaChnKX0sbz1mdW5jdGlvbihiLGYpe2Y9Znx8W10sZT0hYS5tZW1vcnl8fFtiLGZdLGk9ITAsaj0hMCxtPWt8fDAsaz0wLGw9Yy5sZW5ndGg7Zm9yKDtjJiZtPGw7bSsrKWlmKGNbbV0uYXBwbHkoYixmKT09PSExJiZhLnN0b3BPbkZhbHNlKXtlPSEwO2JyZWFrfWo9ITEsYyYmKGEub25jZT9lPT09ITA/cC5kaXNhYmxlKCk6Yz1bXTpkJiZkLmxlbmd0aCYmKGU9ZC5zaGlmdCgpLHAuZmlyZVdpdGgoZVswXSxlWzFdKSkpfSxwPXthZGQ6ZnVuY3Rpb24oKXtpZihjKXt2YXIgYT1jLmxlbmd0aDtuKGFyZ3VtZW50cyksaj9sPWMubGVuZ3RoOmUmJmUhPT0hMCYmKGs9YSxvKGVbMF0sZVsxXSkpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtpZihjKXt2YXIgYj1hcmd1bWVudHMsZD0wLGU9Yi5sZW5ndGg7Zm9yKDtkPGU7ZCsrKWZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKWlmKGJbZF09PT1jW2ZdKXtqJiZmPD1sJiYobC0tLGY8PW0mJm0tLSksYy5zcGxpY2UoZi0tLDEpO2lmKGEudW5pcXVlKWJyZWFrfX1yZXR1cm4gdGhpc30saGFzOmZ1bmN0aW9uKGEpe2lmKGMpe3ZhciBiPTAsZD1jLmxlbmd0aDtmb3IoO2I8ZDtiKyspaWYoYT09PWNbYl0pcmV0dXJuITB9cmV0dXJuITF9LGVtcHR5OmZ1bmN0aW9uKCl7Yz1bXTtyZXR1cm4gdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe2M9ZD1lPWI7cmV0dXJuIHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWN9LGxvY2s6ZnVuY3Rpb24oKXtkPWIsKCFlfHxlPT09ITApJiZwLmRpc2FibGUoKTtyZXR1cm4gdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIWR9LGZpcmVXaXRoOmZ1bmN0aW9uKGIsYyl7ZCYmKGo/YS5vbmNlfHxkLnB1c2goW2IsY10pOighYS5vbmNlfHwhZSkmJm8oYixjKSk7cmV0dXJuIHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtwLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9fTtyZXR1cm4gcH07dmFyIGk9W10uc2xpY2U7Zi5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGEpe3ZhciBiPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGM9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksZD1mLkNhbGxiYWNrcygibWVtb3J5IiksZT0icGVuZGluZyIsZz17cmVzb2x2ZTpiLHJlamVjdDpjLG5vdGlmeTpkfSxoPXtkb25lOmIuYWRkLGZhaWw6Yy5hZGQscHJvZ3Jlc3M6ZC5hZGQsc3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gZX0saXNSZXNvbHZlZDpiLmZpcmVkLGlzUmVqZWN0ZWQ6Yy5maXJlZCx0aGVuOmZ1bmN0aW9uKGEsYixjKXtpLmRvbmUoYSkuZmFpbChiKS5wcm9ncmVzcyhjKTtyZXR1cm4gdGhpc30sYWx3YXlzOmZ1bmN0aW9uKCl7aS5kb25lLmFwcGx5KGksYXJndW1lbnRzKS5mYWlsLmFwcGx5KGksYXJndW1lbnRzKTtyZXR1cm4gdGhpc30scGlwZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuRGVmZXJyZWQoZnVuY3Rpb24oZCl7Zi5lYWNoKHtkb25lOlthLCJyZXNvbHZlIl0sZmFpbDpbYiwicmVqZWN0Il0scHJvZ3Jlc3M6W2MsIm5vdGlmeSJdfSxmdW5jdGlvbihhLGIpe3ZhciBjPWJbMF0sZT1iWzFdLGc7Zi5pc0Z1bmN0aW9uKGMpP2lbYV0oZnVuY3Rpb24oKXtnPWMuYXBwbHkodGhpcyxhcmd1bWVudHMpLGcmJmYuaXNGdW5jdGlvbihnLnByb21pc2UpP2cucHJvbWlzZSgpLnRoZW4oZC5yZXNvbHZlLGQucmVqZWN0LGQubm90aWZ5KTpkW2UrIldpdGgiXSh0aGlzPT09aT9kOnRoaXMsW2ddKX0pOmlbYV0oZFtlXSl9KX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtpZihhPT1udWxsKWE9aDtlbHNlIGZvcih2YXIgYiBpbiBoKWFbYl09aFtiXTtyZXR1cm4gYX19LGk9aC5wcm9taXNlKHt9KSxqO2ZvcihqIGluIGcpaVtqXT1nW2pdLmZpcmUsaVtqKyJXaXRoIl09Z1tqXS5maXJlV2l0aDtpLmRvbmUoZnVuY3Rpb24oKXtlPSJyZXNvbHZlZCJ9LGMuZGlzYWJsZSxkLmxvY2spLmZhaWwoZnVuY3Rpb24oKXtlPSJyZWplY3RlZCJ9LGIuZGlzYWJsZSxkLmxvY2spLGEmJmEuY2FsbChpLGkpO3JldHVybiBpfSx3aGVuOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIG0oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2VbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YixqLm5vdGlmeVdpdGgoayxlKX19ZnVuY3Rpb24gbChhKXtyZXR1cm4gZnVuY3Rpb24oYyl7YlthXT1hcmd1bWVudHMubGVuZ3RoPjE/aS5jYWxsKGFyZ3VtZW50cywwKTpjLC0tZ3x8ai5yZXNvbHZlV2l0aChqLGIpfX12YXIgYj1pLmNhbGwoYXJndW1lbnRzLDApLGM9MCxkPWIubGVuZ3RoLGU9QXJyYXkoZCksZz1kLGg9ZCxqPWQ8PTEmJmEmJmYuaXNGdW5jdGlvbihhLnByb21pc2UpP2E6Zi5EZWZlcnJlZCgpLGs9ai5wcm9taXNlKCk7aWYoZD4xKXtmb3IoO2M8ZDtjKyspYltjXSYmYltjXS5wcm9taXNlJiZmLmlzRnVuY3Rpb24oYltjXS5wcm9taXNlKT9iW2NdLnByb21pc2UoKS50aGVuKGwoYyksai5yZWplY3QsbShjKSk6LS1nO2d8fGoucmVzb2x2ZVdpdGgoaixiKX1lbHNlIGohPT1hJiZqLnJlc29sdmVXaXRoKGosZD9bYV06W10pO3JldHVybiBrfX0pLGYuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciBiLGQsZSxnLGgsaSxqLGssbCxtLG4sbyxwPWMuY3JlYXRlRWxlbWVudCgiZGl2IikscT1jLmRvY3VtZW50RWxlbWVudDtwLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLHAuaW5uZXJIVE1MPSIgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSd0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZT1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIWR8fCFkLmxlbmd0aHx8IWUpcmV0dXJue307Zz1jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGg9Zy5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxpPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sYj17bGVhZGluZ1doaXRlc3BhY2U6cC5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChlLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjppLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpoLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZTpwLmNsYXNzTmFtZSE9PSJ0IixlbmN0eXBlOiEhYy5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxodG1sNUNsb25lOmMuY3JlYXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCEwKS5vdXRlckhUTUwhPT0iPDpuYXY+PC86bmF2PiIsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwLHBpeGVsTWFyZ2luOiEwfSxmLmJveE1vZGVsPWIuYm94TW9kZWw9Yy5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiLGkuY2hlY2tlZD0hMCxiLm5vQ2xvbmVDaGVja2VkPWkuY2xvbmVOb2RlKCEwKS5jaGVja2VkLGcuZGlzYWJsZWQ9ITAsYi5vcHREaXNhYmxlZD0haC5kaXNhYmxlZDt0cnl7ZGVsZXRlIHAudGVzdH1jYXRjaChyKXtiLmRlbGV0ZUV4cGFuZG89ITF9IXAuYWRkRXZlbnRMaXN0ZW5lciYmcC5hdHRhY2hFdmVudCYmcC5maXJlRXZlbnQmJihwLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbigpe2Iubm9DbG9uZUV2ZW50PSExfSkscC5jbG9uZU5vZGUoITApLmZpcmVFdmVudCgib25jbGljayIpKSxpPWMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxpLnZhbHVlPSJ0IixpLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYi5yYWRpb1ZhbHVlPWkudmFsdWU9PT0idCIsaS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksaS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IikscC5hcHBlbmRDaGlsZChpKSxqPWMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGouYXBwZW5kQ2hpbGQocC5sYXN0Q2hpbGQpLGIuY2hlY2tDbG9uZT1qLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxiLmFwcGVuZENoZWNrZWQ9aS5jaGVja2VkLGoucmVtb3ZlQ2hpbGQoaSksai5hcHBlbmRDaGlsZChwKTtpZihwLmF0dGFjaEV2ZW50KWZvcihuIGlue3N1Ym1pdDoxLGNoYW5nZToxLGZvY3VzaW46MX0pbT0ib24iK24sbz1tIGluIHAsb3x8KHAuc2V0QXR0cmlidXRlKG0sInJldHVybjsiKSxvPXR5cGVvZiBwW21dPT0iZnVuY3Rpb24iKSxiW24rIkJ1YmJsZXMiXT1vO2oucmVtb3ZlQ2hpbGQocCksaj1nPWg9cD1pPW51bGwsZihmdW5jdGlvbigpe3ZhciBkLGUsZyxoLGksaixsLG0sbixxLHIscyx0LHU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdOyF1fHwobT0xLHQ9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6IixyPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7IixzPXQrIjA7dmlzaWJpbGl0eTpoaWRkZW47IixuPSJzdHlsZT0nIityK3QrIjVweCBzb2xpZCAjMDAwOyIscT0iPGRpdiAiK24rImRpc3BsYXk6YmxvY2s7Jz48ZGl2IHN0eWxlPSciK3QrIjA7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47Jz48L2Rpdj48L2Rpdj4iKyI8dGFibGUgIituKyInIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCc+IisiPHRyPjx0ZD48L3RkPjwvdHI+PC90YWJsZT4iLGQ9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9cysid2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bWFyZ2luLXRvcDoiK20rInB4Iix1Lmluc2VydEJlZm9yZShkLHUuZmlyc3RDaGlsZCkscD1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuYXBwZW5kQ2hpbGQocCkscC5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkIHN0eWxlPSciK3QrIjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IixrPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIiksbz1rWzBdLm9mZnNldEhlaWdodD09PTAsa1swXS5zdHlsZS5kaXNwbGF5PSIiLGtbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsYi5yZWxpYWJsZUhpZGRlbk9mZnNldHM9byYma1swXS5vZmZzZXRIZWlnaHQ9PT0wLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKHAuaW5uZXJIVE1MPSIiLGw9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxsLnN0eWxlLndpZHRoPSIwIixsLnN0eWxlLm1hcmdpblJpZ2h0PSIwIixwLnN0eWxlLndpZHRoPSIycHgiLHAuYXBwZW5kQ2hpbGQobCksYi5yZWxpYWJsZU1hcmdpblJpZ2h0PShwYXJzZUludCgoYS5nZXRDb21wdXRlZFN0eWxlKGwsbnVsbCl8fHttYXJnaW5SaWdodDowfSkubWFyZ2luUmlnaHQsMTApfHwwKT09PTApLHR5cGVvZiBwLnN0eWxlLnpvb20hPSJ1bmRlZmluZWQiJiYocC5pbm5lckhUTUw9IiIscC5zdHlsZS53aWR0aD1wLnN0eWxlLnBhZGRpbmc9IjFweCIscC5zdHlsZS5ib3JkZXI9MCxwLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLHAuc3R5bGUuZGlzcGxheT0iaW5saW5lIixwLnN0eWxlLnpvb209MSxiLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9cC5vZmZzZXRXaWR0aD09PTMscC5zdHlsZS5kaXNwbGF5PSJibG9jayIscC5zdHlsZS5vdmVyZmxvdz0idmlzaWJsZSIscC5pbm5lckhUTUw9IjxkaXYgc3R5bGU9J3dpZHRoOjVweDsnPjwvZGl2PiIsYi5zaHJpbmtXcmFwQmxvY2tzPXAub2Zmc2V0V2lkdGghPT0zKSxwLnN0eWxlLmNzc1RleHQ9citzLHAuaW5uZXJIVE1MPXEsZT1wLmZpcnN0Q2hpbGQsZz1lLmZpcnN0Q2hpbGQsaT1lLm5leHRTaWJsaW5nLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCxqPXtkb2VzTm90QWRkQm9yZGVyOmcub2Zmc2V0VG9wIT09NSxkb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxsczppLm9mZnNldFRvcD09PTV9LGcuc3R5bGUucG9zaXRpb249ImZpeGVkIixnLnN0eWxlLnRvcD0iMjBweCIsai5maXhlZFBvc2l0aW9uPWcub2Zmc2V0VG9wPT09MjB8fGcub2Zmc2V0VG9wPT09MTUsZy5zdHlsZS5wb3NpdGlvbj1nLnN0eWxlLnRvcD0iIixlLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixqLnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZT1nLm9mZnNldFRvcD09PS01LGouZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9dS5vZmZzZXRUb3AhPT1tLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKHAuc3R5bGUubWFyZ2luVG9wPSIxJSIsYi5waXhlbE1hcmdpbj0oYS5nZXRDb21wdXRlZFN0eWxlKHAsbnVsbCl8fHttYXJnaW5Ub3A6MH0pLm1hcmdpblRvcCE9PSIxJSIpLHR5cGVvZiBkLnN0eWxlLnpvb20hPSJ1bmRlZmluZWQiJiYoZC5zdHlsZS56b29tPTEpLHUucmVtb3ZlQ2hpbGQoZCksbD1wPWQ9bnVsbCxmLmV4dGVuZChiLGopKX0pO3JldHVybiBifSgpO3ZhciBqPS9eKD86XHsuKlx9fFxbLipcXSkkLyxrPS8oW0EtWl0pL2c7Zi5leHRlbmQoe2NhY2hlOnt9LHV1aWQ6MCxleHBhbmRvOiJqUXVlcnkiKyhmLmZuLmpxdWVyeStNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxub0RhdGE6e2VtYmVkOiEwLG9iamVjdDoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIixhcHBsZXQ6ITB9LGhhc0RhdGE6ZnVuY3Rpb24oYSl7YT1hLm5vZGVUeXBlP2YuY2FjaGVbYVtmLmV4cGFuZG9dXTphW2YuZXhwYW5kb107cmV0dXJuISFhJiYhbShhKX0sZGF0YTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWYuYWNjZXB0RGF0YShhKSl7dmFyIGcsaCxpLGo9Zi5leHBhbmRvLGs9dHlwZW9mIGM9PSJzdHJpbmciLGw9YS5ub2RlVHlwZSxtPWw/Zi5jYWNoZTphLG49bD9hW2pdOmFbal0mJmosbz1jPT09ImV2ZW50cyI7aWYoKCFufHwhbVtuXXx8IW8mJiFlJiYhbVtuXS5kYXRhKSYmayYmZD09PWIpcmV0dXJuO258fChsP2Fbal09bj0rK2YudXVpZDpuPWopLG1bbl18fChtW25dPXt9LGx8fChtW25dLnRvSlNPTj1mLm5vb3ApKTtpZih0eXBlb2YgYz09Im9iamVjdCJ8fHR5cGVvZiBjPT0iZnVuY3Rpb24iKWU/bVtuXT1mLmV4dGVuZChtW25dLGMpOm1bbl0uZGF0YT1mLmV4dGVuZChtW25dLmRhdGEsYyk7Zz1oPW1bbl0sZXx8KGguZGF0YXx8KGguZGF0YT17fSksaD1oLmRhdGEpLGQhPT1iJiYoaFtmLmNhbWVsQ2FzZShjKV09ZCk7aWYobyYmIWhbY10pcmV0dXJuIGcuZXZlbnRzO2s/KGk9aFtjXSxpPT1udWxsJiYoaT1oW2YuY2FtZWxDYXNlKGMpXSkpOmk9aDtyZXR1cm4gaX19LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSxiLGMpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZCxlLGcsaD1mLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9mLmNhY2hlOmEsaz1pP2FbaF06aDtpZighaltrXSlyZXR1cm47aWYoYil7ZD1jP2pba106altrXS5kYXRhO2lmKGQpe2YuaXNBcnJheShiKXx8KGIgaW4gZD9iPVtiXTooYj1mLmNhbWVsQ2FzZShiKSxiIGluIGQ/Yj1bYl06Yj1iLnNwbGl0KCIgIikpKTtmb3IoZT0wLGc9Yi5sZW5ndGg7ZTxnO2UrKylkZWxldGUgZFtiW2VdXTtpZighKGM/bTpmLmlzRW1wdHlPYmplY3QpKGQpKXJldHVybn19aWYoIWMpe2RlbGV0ZSBqW2tdLmRhdGE7aWYoIW0oaltrXSkpcmV0dXJufWYuc3VwcG9ydC5kZWxldGVFeHBhbmRvfHwhai5zZXRJbnRlcnZhbD9kZWxldGUgaltrXTpqW2tdPW51bGwsaSYmKGYuc3VwcG9ydC5kZWxldGVFeHBhbmRvP2RlbGV0ZSBhW2hdOmEucmVtb3ZlQXR0cmlidXRlP2EucmVtb3ZlQXR0cmlidXRlKGgpOmFbaF09bnVsbCl9fSxfZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGF0YShhLGIsYywhMCl9LGFjY2VwdERhdGE6ZnVuY3Rpb24oYSl7aWYoYS5ub2RlTmFtZSl7dmFyIGI9Zi5ub0RhdGFbYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtpZihiKXJldHVybiBiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifXJldHVybiEwfX0pLGYuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYyl7dmFyIGQsZSxnLGgsaSxqPXRoaXNbMF0saz0wLG09bnVsbDtpZihhPT09Yil7aWYodGhpcy5sZW5ndGgpe209Zi5kYXRhKGopO2lmKGoubm9kZVR5cGU9PT0xJiYhZi5fZGF0YShqLCJwYXJzZWRBdHRycyIpKXtnPWouYXR0cmlidXRlcztmb3IoaT1nLmxlbmd0aDtrPGk7aysrKWg9Z1trXS5uYW1lLGguaW5kZXhPZigiZGF0YS0iKT09PTAmJihoPWYuY2FtZWxDYXNlKGguc3Vic3RyaW5nKDUpKSxsKGosaCxtW2hdKSk7Zi5fZGF0YShqLCJwYXJzZWRBdHRycyIsITApfX1yZXR1cm4gbX1pZih0eXBlb2YgYT09Im9iamVjdCIpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZGF0YSh0aGlzLGEpfSk7ZD1hLnNwbGl0KCIuIiwyKSxkWzFdPWRbMV0/Ii4iK2RbMV06IiIsZT1kWzFdKyIhIjtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihjKXtpZihjPT09Yil7bT10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitlLFtkWzBdXSksbT09PWImJmomJihtPWYuZGF0YShqLGEpLG09bChqLGEsbSkpO3JldHVybiBtPT09YiYmZFsxXT90aGlzLmRhdGEoZFswXSk6bX1kWzFdPWMsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKTtiLnRyaWdnZXJIYW5kbGVyKCJzZXREYXRhIitlLGQpLGYuZGF0YSh0aGlzLGEsYyksYi50cmlnZ2VySGFuZGxlcigiY2hhbmdlRGF0YSIrZSxkKX0pfSxudWxsLGMsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITEpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLGYuZXh0ZW5kKHtfbWFyazpmdW5jdGlvbihhLGIpe2EmJihiPShifHwiZngiKSsibWFyayIsZi5fZGF0YShhLGIsKGYuX2RhdGEoYSxiKXx8MCkrMSkpfSxfdW5tYXJrOmZ1bmN0aW9uKGEsYixjKXthIT09ITAmJihjPWIsYj1hLGE9ITEpO2lmKGIpe2M9Y3x8ImZ4Ijt2YXIgZD1jKyJtYXJrIixlPWE/MDooZi5fZGF0YShiLGQpfHwxKS0xO2U/Zi5fZGF0YShiLGQsZSk6KGYucmVtb3ZlRGF0YShiLGQsITApLG4oYixjLCJtYXJrIikpfX0scXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGEpe2I9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1mLl9kYXRhKGEsYiksYyYmKCFkfHxmLmlzQXJyYXkoYyk/ZD1mLl9kYXRhKGEsYixmLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKTtyZXR1cm4gZHx8W119fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPWYucXVldWUoYSxiKSxkPWMuc2hpZnQoKSxlPXt9O2Q9PT0iaW5wcm9ncmVzcyImJihkPWMuc2hpZnQoKSksZCYmKGI9PT0iZngiJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxmLl9kYXRhKGEsYisiLnJ1biIsZSksZC5jYWxsKGEsZnVuY3Rpb24oKXtmLmRlcXVldWUoYSxiKX0sZSkpLGMubGVuZ3RofHwoZi5yZW1vdmVEYXRhKGEsYisicXVldWUgIitiKyIucnVuIiwhMCksbihhLGIsInF1ZXVlIikpfX0pLGYuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGMpe3ZhciBkPTI7dHlwZW9mIGEhPSJzdHJpbmciJiYoYz1hLGE9ImZ4IixkLS0pO2lmKGFyZ3VtZW50cy5sZW5ndGg8ZClyZXR1cm4gZi5xdWV1ZSh0aGlzWzBdLGEpO3JldHVybiBjPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYucXVldWUodGhpcyxhLGMpO2E9PT0iZngiJiZiWzBdIT09ImlucHJvZ3Jlc3MiJiZmLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmRlcXVldWUodGhpcyxhKX0pfSxkZWxheTpmdW5jdGlvbihhLGIpe2E9Zi5meD9mLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4IjtyZXR1cm4gdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9c2V0VGltZW91dChiLGEpO2Muc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChkKX19KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIG0oKXstLWh8fGQucmVzb2x2ZVdpdGgoZSxbZV0pfXR5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPWIpLGE9YXx8ImZ4Ijt2YXIgZD1mLkRlZmVycmVkKCksZT10aGlzLGc9ZS5sZW5ndGgsaD0xLGk9YSsiZGVmZXIiLGo9YSsicXVldWUiLGs9YSsibWFyayIsbDt3aGlsZShnLS0paWYobD1mLmRhdGEoZVtnXSxpLGIsITApfHwoZi5kYXRhKGVbZ10saixiLCEwKXx8Zi5kYXRhKGVbZ10sayxiLCEwKSkmJmYuZGF0YShlW2ddLGksZi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksITApKWgrKyxsLmFkZChtKTttKCk7cmV0dXJuIGQucHJvbWlzZShjKX19KTt2YXIgbz0vW1xuXHRccl0vZyxwPS9ccysvLHE9L1xyL2cscj0vXig/OmJ1dHRvbnxpbnB1dCkkL2kscz0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSx0PS9eYSg/OnJlYSk/JC9pLHU9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksdj1mLnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLHcseCx5O2YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZi5hdHRyLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLnJlbW92ZUF0dHIodGhpcyxhKX0pfSxwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZi5wcm9wLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe2E9Zi5wcm9wRml4W2FdfHxhO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1thXT1iLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGMpe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZyxoLGk7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyIpe2I9YS5zcGxpdChwKTtmb3IoYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl7ZT10aGlzW2NdO2lmKGUubm9kZVR5cGU9PT0xKWlmKCFlLmNsYXNzTmFtZSYmYi5sZW5ndGg9PT0xKWUuY2xhc3NOYW1lPWE7ZWxzZXtnPSIgIitlLmNsYXNzTmFtZSsiICI7Zm9yKGg9MCxpPWIubGVuZ3RoO2g8aTtoKyspfmcuaW5kZXhPZigiICIrYltoXSsiICIpfHwoZys9YltoXSsiICIpO2UuY2xhc3NOYW1lPWYudHJpbShnKX19fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZyxoLGksajtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nInx8YT09PWIpe2M9KGF8fCIiKS5zcGxpdChwKTtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO2lmKGcubm9kZVR5cGU9PT0xJiZnLmNsYXNzTmFtZSlpZihhKXtoPSgiICIrZy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKTtmb3IoaT0wLGo9Yy5sZW5ndGg7aTxqO2krKyloPWgucmVwbGFjZSgiICIrY1tpXSsiICIsIiAiKTtnLmNsYXNzTmFtZT1mLnRyaW0oaCl9ZWxzZSBnLmNsYXNzTmFtZT0iIn19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEsZD10eXBlb2YgYj09ImJvb2xlYW4iO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe2YodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihjPT09InN0cmluZyIpe3ZhciBlLGc9MCxoPWYodGhpcyksaT1iLGo9YS5zcGxpdChwKTt3aGlsZShlPWpbZysrXSlpPWQ/aTohaC5oYXNDbGFzcyhlKSxoW2k/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShlKX1lbHNlIGlmKGM9PT0idW5kZWZpbmVkInx8Yz09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmZi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Zvcig7YzxkO2MrKylpZih0aGlzW2NdLm5vZGVUeXBlPT09MSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UobywiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZz10aGlzWzBdO3tpZighIWFyZ3VtZW50cy5sZW5ndGgpe2U9Zi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZCl7dmFyIGc9Zih0aGlzKSxoO2lmKHRoaXMubm9kZVR5cGU9PT0xKXtlP2g9YS5jYWxsKHRoaXMsZCxnLnZhbCgpKTpoPWEsaD09bnVsbD9oPSIiOnR5cGVvZiBoPT0ibnVtYmVyIj9oKz0iIjpmLmlzQXJyYXkoaCkmJihoPWYubWFwKGgsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6YSsiIn0pKSxjPWYudmFsSG9va3NbdGhpcy50eXBlXXx8Zi52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKCFjfHwhKCJzZXQiaW4gYyl8fGMuc2V0KHRoaXMsaCwidmFsdWUiKT09PWIpdGhpcy52YWx1ZT1ofX0pfWlmKGcpe2M9Zi52YWxIb29rc1tnLnR5cGVdfHxmLnZhbEhvb2tzW2cubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoYyYmImdldCJpbiBjJiYoZD1jLmdldChnLCJ2YWx1ZSIpKSE9PWIpcmV0dXJuIGQ7ZD1nLnZhbHVlO3JldHVybiB0eXBlb2YgZD09InN0cmluZyI/ZC5yZXBsYWNlKHEsIiIpOmQ9PW51bGw/IiI6ZH19fX0pLGYuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5hdHRyaWJ1dGVzLnZhbHVlO3JldHVybiFifHxiLnNwZWNpZmllZD9hLnZhbHVlOmEudGV4dH19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGc9YS5zZWxlY3RlZEluZGV4LGg9W10saT1hLm9wdGlvbnMsaj1hLnR5cGU9PT0ic2VsZWN0LW9uZSI7aWYoZzwwKXJldHVybiBudWxsO2M9aj9nOjAsZD1qP2crMTppLmxlbmd0aDtmb3IoO2M8ZDtjKyspe2U9aVtjXTtpZihlLnNlbGVjdGVkJiYoZi5zdXBwb3J0Lm9wdERpc2FibGVkPyFlLmRpc2FibGVkOmUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpPT09bnVsbCkmJighZS5wYXJlbnROb2RlLmRpc2FibGVkfHwhZi5ub2RlTmFtZShlLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtiPWYoZSkudmFsKCk7aWYoailyZXR1cm4gYjtoLnB1c2goYil9fWlmKGomJiFoLmxlbmd0aCYmaS5sZW5ndGgpcmV0dXJuIGYoaVtnXSkudmFsKCk7cmV0dXJuIGh9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWYubWFrZUFycmF5KGIpO2YoYSkuZmluZCgib3B0aW9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9Zi5pbkFycmF5KGYodGhpcykudmFsKCksYyk+PTB9KSxjLmxlbmd0aHx8KGEuc2VsZWN0ZWRJbmRleD0tMSk7cmV0dXJuIGN9fX0sYXR0ckZuOnt2YWw6ITAsY3NzOiEwLGh0bWw6ITAsdGV4dDohMCxkYXRhOiEwLHdpZHRoOiEwLGhlaWdodDohMCxvZmZzZXQ6ITB9LGF0dHI6ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGcsaCxpLGo9YS5ub2RlVHlwZTtpZighIWEmJmohPT0zJiZqIT09OCYmaiE9PTIpe2lmKGUmJmMgaW4gZi5hdHRyRm4pcmV0dXJuIGYoYSlbY10oZCk7aWYodHlwZW9mIGEuZ2V0QXR0cmlidXRlPT0idW5kZWZpbmVkIilyZXR1cm4gZi5wcm9wKGEsYyxkKTtpPWohPT0xfHwhZi5pc1hNTERvYyhhKSxpJiYoYz1jLnRvTG93ZXJDYXNlKCksaD1mLmF0dHJIb29rc1tjXXx8KHUudGVzdChjKT94OncpKTtpZihkIT09Yil7aWYoZD09PW51bGwpe2YucmVtb3ZlQXR0cihhLGMpO3JldHVybn1pZihoJiYic2V0ImluIGgmJmkmJihnPWguc2V0KGEsZCxjKSkhPT1iKXJldHVybiBnO2Euc2V0QXR0cmlidXRlKGMsIiIrZCk7cmV0dXJuIGR9aWYoaCYmImdldCJpbiBoJiZpJiYoZz1oLmdldChhLGMpKSE9PW51bGwpcmV0dXJuIGc7Zz1hLmdldEF0dHJpYnV0ZShjKTtyZXR1cm4gZz09PW51bGw/YjpnfX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxnLGgsaT0wO2lmKGImJmEubm9kZVR5cGU9PT0xKXtkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChwKSxnPWQubGVuZ3RoO2Zvcig7aTxnO2krKyllPWRbaV0sZSYmKGM9Zi5wcm9wRml4W2VdfHxlLGg9dS50ZXN0KGUpLGh8fGYuYXR0cihhLGUsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHY/ZTpjKSxoJiZjIGluIGEmJihhW2NdPSExKSl9fSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKHIudGVzdChhLm5vZGVOYW1lKSYmYS5wYXJlbnROb2RlKWYuZXJyb3IoInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCIpO2Vsc2UgaWYoIWYuc3VwcG9ydC5yYWRpb1ZhbHVlJiZiPT09InJhZGlvIiYmZi5ub2RlTmFtZShhLCJpbnB1dCIpKXt2YXIgYz1hLnZhbHVlO2Euc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKTtyZXR1cm4gYn19fSx2YWx1ZTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYodyYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdy5nZXQoYSxiKTtyZXR1cm4gYiBpbiBhP2EudmFsdWU6bnVsbH0sc2V0OmZ1bmN0aW9uKGEsYixjKXtpZih3JiZmLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiB3LnNldChhLGIsYyk7YS52YWx1ZT1ifX19LHByb3BGaXg6e3RhYmluZGV4OiJ0YWJJbmRleCIscmVhZG9ubHk6InJlYWRPbmx5IiwiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjZWxscGFkZGluZzoiY2VsbFBhZGRpbmciLHJvd3NwYW46InJvd1NwYW4iLGNvbHNwYW46ImNvbFNwYW4iLHVzZW1hcDoidXNlTWFwIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGNvbnRlbnRlZGl0YWJsZToiY29udGVudEVkaXRhYmxlIn0scHJvcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZyxoLGk9YS5ub2RlVHlwZTtpZighIWEmJmkhPT0zJiZpIT09OCYmaSE9PTIpe2g9aSE9PTF8fCFmLmlzWE1MRG9jKGEpLGgmJihjPWYucHJvcEZpeFtjXXx8YyxnPWYucHJvcEhvb2tzW2NdKTtyZXR1cm4gZCE9PWI/ZyYmInNldCJpbiBnJiYoZT1nLnNldChhLGQsYykpIT09Yj9lOmFbY109ZDpnJiYiZ2V0ImluIGcmJihlPWcuZ2V0KGEsYykpIT09bnVsbD9lOmFbY119fSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJpbmRleCIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9wYXJzZUludChjLnZhbHVlLDEwKTpzLnRlc3QoYS5ub2RlTmFtZSl8fHQudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6Yn19fX0pLGYuYXR0ckhvb2tzLnRhYmluZGV4PWYucHJvcEhvb2tzLnRhYkluZGV4LHg9e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkLGU9Zi5wcm9wKGEsYyk7cmV0dXJuIGU9PT0hMHx8dHlwZW9mIGUhPSJib29sZWFuIiYmKGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpKSYmZC5ub2RlVmFsdWUhPT0hMT9jLnRvTG93ZXJDYXNlKCk6Yn0sc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtiPT09ITE/Zi5yZW1vdmVBdHRyKGEsYyk6KGQ9Zi5wcm9wRml4W2NdfHxjLGQgaW4gYSYmKGFbZF09ITApLGEuc2V0QXR0cmlidXRlKGMsYy50b0xvd2VyQ2FzZSgpKSk7cmV0dXJuIGN9fSx2fHwoeT17bmFtZTohMCxpZDohMCxjb29yZHM6ITB9LHc9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiYoeVtjXT9kLm5vZGVWYWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLm5vZGVWYWx1ZTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShkKTtlfHwoZT1jLmNyZWF0ZUF0dHJpYnV0ZShkKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sZi5hdHRySG9va3MudGFiaW5kZXguc2V0PXcuc2V0LGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmF0dHJIb29rc1tiXT1mLmV4dGVuZChmLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXthLnNldEF0dHJpYnV0ZShiLCJhdXRvIik7cmV0dXJuIGN9fX0pfSksZi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6dy5nZXQsc2V0OmZ1bmN0aW9uKGEsYixjKXtiPT09IiImJihiPSJmYWxzZSIpLHcuc2V0KGEsYixjKX19KSxmLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fGYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYyl7Zi5hdHRySG9va3NbY109Zi5leHRlbmQoZi5hdHRySG9va3NbY10se2dldDpmdW5jdGlvbihhKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShjLDIpO3JldHVybiBkPT09bnVsbD9iOmR9fSl9KSxmLnN1cHBvcnQuc3R5bGV8fChmLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8Yn0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pLGYuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPWYuZXh0ZW5kKGYucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIG51bGx9fSkpLGYuc3VwcG9ydC5lbmN0eXBlfHwoZi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksZi5zdXBwb3J0LmNoZWNrT258fGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSksZi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT1mLmV4dGVuZChmLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihmLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxiKT49MH19KX0pO3ZhciB6PS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxBPS9eKFteXC5dKik/KD86XC4oLispKT8kLyxCPS8oPzpefFxzKWhvdmVyKFwuXFMrKT9cYi8sQz0vXmtleS8sRD0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sRT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sRj0vXihcdyopKD86IyhbXHdcLV0rKSk/KD86XC4oW1x3XC1dKykpPyQvLEc9ZnVuY3Rpb24oCithKXt2YXIgYj1GLmV4ZWMoYSk7YiYmKGJbMV09KGJbMV18fCIiKS50b0xvd2VyQ2FzZSgpLGJbM109YlszXSYmbmV3IFJlZ0V4cCgiKD86XnxcXHMpIitiWzNdKyIoPzpcXHN8JCkiKSk7cmV0dXJuIGJ9LEg9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmF0dHJpYnV0ZXN8fHt9O3JldHVybighYlsxXXx8YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09YlsxXSkmJighYlsyXXx8KGMuaWR8fHt9KS52YWx1ZT09PWJbMl0pJiYoIWJbM118fGJbM10udGVzdCgoY1siY2xhc3MiXXx8e30pLnZhbHVlKSl9LEk9ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZXZlbnQuc3BlY2lhbC5ob3Zlcj9hOmEucmVwbGFjZShCLCJtb3VzZWVudGVyJDEgbW91c2VsZWF2ZSQxIil9O2YuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OHx8IWN8fCFkfHwhKGg9Zi5fZGF0YShhKSkpKXtkLmhhbmRsZXImJihwPWQsZD1wLmhhbmRsZXIsZz1wLnNlbGVjdG9yKSxkLmd1aWR8fChkLmd1aWQ9Zi5ndWlkKyspLGo9aC5ldmVudHMsanx8KGguZXZlbnRzPWo9e30pLGk9aC5oYW5kbGUsaXx8KGguaGFuZGxlPWk9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBmIT0idW5kZWZpbmVkIiYmKCFhfHxmLmV2ZW50LnRyaWdnZXJlZCE9PWEudHlwZSk/Zi5ldmVudC5kaXNwYXRjaC5hcHBseShpLmVsZW0sYXJndW1lbnRzKTpifSxpLmVsZW09YSksYz1mLnRyaW0oSShjKSkuc3BsaXQoIiAiKTtmb3Ioaz0wO2s8Yy5sZW5ndGg7aysrKXtsPUEuZXhlYyhjW2tdKXx8W10sbT1sWzFdLG49KGxbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxzPWYuZXZlbnQuc3BlY2lhbFttXXx8e30sbT0oZz9zLmRlbGVnYXRlVHlwZTpzLmJpbmRUeXBlKXx8bSxzPWYuZXZlbnQuc3BlY2lhbFttXXx8e30sbz1mLmV4dGVuZCh7dHlwZTptLG9yaWdUeXBlOmxbMV0sZGF0YTplLGhhbmRsZXI6ZCxndWlkOmQuZ3VpZCxzZWxlY3RvcjpnLHF1aWNrOmcmJkcoZyksbmFtZXNwYWNlOm4uam9pbigiLiIpfSxwKSxyPWpbbV07aWYoIXIpe3I9alttXT1bXSxyLmRlbGVnYXRlQ291bnQ9MDtpZighcy5zZXR1cHx8cy5zZXR1cC5jYWxsKGEsZSxuLGkpPT09ITEpYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihtLGksITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIittLGkpfXMuYWRkJiYocy5hZGQuY2FsbChhLG8pLG8uaGFuZGxlci5ndWlkfHwoby5oYW5kbGVyLmd1aWQ9ZC5ndWlkKSksZz9yLnNwbGljZShyLmRlbGVnYXRlQ291bnQrKywwLG8pOnIucHVzaChvKSxmLmV2ZW50Lmdsb2JhbFttXT0hMH1hPW51bGx9fSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGc9Zi5oYXNEYXRhKGEpJiZmLl9kYXRhKGEpLGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEhZyYmISEobz1nLmV2ZW50cykpe2I9Zi50cmltKEkoYnx8IiIpKS5zcGxpdCgiICIpO2ZvcihoPTA7aDxiLmxlbmd0aDtoKyspe2k9QS5leGVjKGJbaF0pfHxbXSxqPWs9aVsxXSxsPWlbMl07aWYoIWope2ZvcihqIGluIG8pZi5ldmVudC5yZW1vdmUoYSxqK2JbaF0sYyxkLCEwKTtjb250aW51ZX1wPWYuZXZlbnQuc3BlY2lhbFtqXXx8e30saj0oZD9wLmRlbGVnYXRlVHlwZTpwLmJpbmRUeXBlKXx8aixyPW9bal18fFtdLG09ci5sZW5ndGgsbD1sP25ldyBSZWdFeHAoIihefFxcLikiK2wuc3BsaXQoIi4iKS5zb3J0KCkuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbDtmb3Iobj0wO248ci5sZW5ndGg7bisrKXM9cltuXSwoZXx8az09PXMub3JpZ1R5cGUpJiYoIWN8fGMuZ3VpZD09PXMuZ3VpZCkmJighbHx8bC50ZXN0KHMubmFtZXNwYWNlKSkmJighZHx8ZD09PXMuc2VsZWN0b3J8fGQ9PT0iKioiJiZzLnNlbGVjdG9yKSYmKHIuc3BsaWNlKG4tLSwxKSxzLnNlbGVjdG9yJiZyLmRlbGVnYXRlQ291bnQtLSxwLnJlbW92ZSYmcC5yZW1vdmUuY2FsbChhLHMpKTtyLmxlbmd0aD09PTAmJm0hPT1yLmxlbmd0aCYmKCghcC50ZWFyZG93bnx8cC50ZWFyZG93bi5jYWxsKGEsbCk9PT0hMSkmJmYucmVtb3ZlRXZlbnQoYSxqLGcuaGFuZGxlKSxkZWxldGUgb1tqXSl9Zi5pc0VtcHR5T2JqZWN0KG8pJiYocT1nLmhhbmRsZSxxJiYocS5lbGVtPW51bGwpLGYucmVtb3ZlRGF0YShhLFsiZXZlbnRzIiwiaGFuZGxlIl0sITApKX19LGN1c3RvbUV2ZW50OntnZXREYXRhOiEwLHNldERhdGE6ITAsY2hhbmdlRGF0YTohMH0sdHJpZ2dlcjpmdW5jdGlvbihjLGQsZSxnKXtpZighZXx8ZS5ub2RlVHlwZSE9PTMmJmUubm9kZVR5cGUhPT04KXt2YXIgaD1jLnR5cGV8fGMsaT1bXSxqLGssbCxtLG4sbyxwLHEscixzO2lmKEUudGVzdChoK2YuZXZlbnQudHJpZ2dlcmVkKSlyZXR1cm47aC5pbmRleE9mKCIhIik+PTAmJihoPWguc2xpY2UoMCwtMSksaz0hMCksaC5pbmRleE9mKCIuIik+PTAmJihpPWguc3BsaXQoIi4iKSxoPWkuc2hpZnQoKSxpLnNvcnQoKSk7aWYoKCFlfHxmLmV2ZW50LmN1c3RvbUV2ZW50W2hdKSYmIWYuZXZlbnQuZ2xvYmFsW2hdKXJldHVybjtjPXR5cGVvZiBjPT0ib2JqZWN0Ij9jW2YuZXhwYW5kb10/YzpuZXcgZi5FdmVudChoLGMpOm5ldyBmLkV2ZW50KGgpLGMudHlwZT1oLGMuaXNUcmlnZ2VyPSEwLGMuZXhjbHVzaXZlPWssYy5uYW1lc3BhY2U9aS5qb2luKCIuIiksYy5uYW1lc3BhY2VfcmU9Yy5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIraS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTpudWxsLG89aC5pbmRleE9mKCI6Iik8MD8ib24iK2g6IiI7aWYoIWUpe2o9Zi5jYWNoZTtmb3IobCBpbiBqKWpbbF0uZXZlbnRzJiZqW2xdLmV2ZW50c1toXSYmZi5ldmVudC50cmlnZ2VyKGMsZCxqW2xdLmhhbmRsZS5lbGVtLCEwKTtyZXR1cm59Yy5yZXN1bHQ9YixjLnRhcmdldHx8KGMudGFyZ2V0PWUpLGQ9ZCE9bnVsbD9mLm1ha2VBcnJheShkKTpbXSxkLnVuc2hpZnQoYykscD1mLmV2ZW50LnNwZWNpYWxbaF18fHt9O2lmKHAudHJpZ2dlciYmcC50cmlnZ2VyLmFwcGx5KGUsZCk9PT0hMSlyZXR1cm47cj1bW2UscC5iaW5kVHlwZXx8aF1dO2lmKCFnJiYhcC5ub0J1YmJsZSYmIWYuaXNXaW5kb3coZSkpe3M9cC5kZWxlZ2F0ZVR5cGV8fGgsbT1FLnRlc3QocytoKT9lOmUucGFyZW50Tm9kZSxuPW51bGw7Zm9yKDttO209bS5wYXJlbnROb2RlKXIucHVzaChbbSxzXSksbj1tO24mJm49PT1lLm93bmVyRG9jdW1lbnQmJnIucHVzaChbbi5kZWZhdWx0Vmlld3x8bi5wYXJlbnRXaW5kb3d8fGEsc10pfWZvcihsPTA7bDxyLmxlbmd0aCYmIWMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtsKyspbT1yW2xdWzBdLGMudHlwZT1yW2xdWzFdLHE9KGYuX2RhdGEobSwiZXZlbnRzIil8fHt9KVtjLnR5cGVdJiZmLl9kYXRhKG0sImhhbmRsZSIpLHEmJnEuYXBwbHkobSxkKSxxPW8mJm1bb10scSYmZi5hY2NlcHREYXRhKG0pJiZxLmFwcGx5KG0sZCk9PT0hMSYmYy5wcmV2ZW50RGVmYXVsdCgpO2MudHlwZT1oLCFnJiYhYy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFwLl9kZWZhdWx0fHxwLl9kZWZhdWx0LmFwcGx5KGUub3duZXJEb2N1bWVudCxkKT09PSExKSYmKGghPT0iY2xpY2sifHwhZi5ub2RlTmFtZShlLCJhIikpJiZmLmFjY2VwdERhdGEoZSkmJm8mJmVbaF0mJihoIT09ImZvY3VzIiYmaCE9PSJibHVyInx8Yy50YXJnZXQub2Zmc2V0V2lkdGghPT0wKSYmIWYuaXNXaW5kb3coZSkmJihuPWVbb10sbiYmKGVbb109bnVsbCksZi5ldmVudC50cmlnZ2VyZWQ9aCxlW2hdKCksZi5ldmVudC50cmlnZ2VyZWQ9YixuJiYoZVtvXT1uKSk7cmV0dXJuIGMucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYyl7Yz1mLmV2ZW50LmZpeChjfHxhLmV2ZW50KTt2YXIgZD0oZi5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30pW2MudHlwZV18fFtdLGU9ZC5kZWxlZ2F0ZUNvdW50LGc9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCksaD0hYy5leGNsdXNpdmUmJiFjLm5hbWVzcGFjZSxpPWYuZXZlbnQuc3BlY2lhbFtjLnR5cGVdfHx7fSxqPVtdLGssbCxtLG4sbyxwLHEscixzLHQsdTtnWzBdPWMsYy5kZWxlZ2F0ZVRhcmdldD10aGlzO2lmKCFpLnByZURpc3BhdGNofHxpLnByZURpc3BhdGNoLmNhbGwodGhpcyxjKSE9PSExKXtpZihlJiYoIWMuYnV0dG9ufHxjLnR5cGUhPT0iY2xpY2siKSl7bj1mKHRoaXMpLG4uY29udGV4dD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXM7Zm9yKG09Yy50YXJnZXQ7bSE9dGhpczttPW0ucGFyZW50Tm9kZXx8dGhpcylpZihtLmRpc2FibGVkIT09ITApe3A9e30scj1bXSxuWzBdPW07Zm9yKGs9MDtrPGU7aysrKXM9ZFtrXSx0PXMuc2VsZWN0b3IscFt0XT09PWImJihwW3RdPXMucXVpY2s/SChtLHMucXVpY2spOm4uaXModCkpLHBbdF0mJnIucHVzaChzKTtyLmxlbmd0aCYmai5wdXNoKHtlbGVtOm0sbWF0Y2hlczpyfSl9fWQubGVuZ3RoPmUmJmoucHVzaCh7ZWxlbTp0aGlzLG1hdGNoZXM6ZC5zbGljZShlKX0pO2ZvcihrPTA7azxqLmxlbmd0aCYmIWMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtrKyspe3E9altrXSxjLmN1cnJlbnRUYXJnZXQ9cS5lbGVtO2ZvcihsPTA7bDxxLm1hdGNoZXMubGVuZ3RoJiYhYy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO2wrKyl7cz1xLm1hdGNoZXNbbF07aWYoaHx8IWMubmFtZXNwYWNlJiYhcy5uYW1lc3BhY2V8fGMubmFtZXNwYWNlX3JlJiZjLm5hbWVzcGFjZV9yZS50ZXN0KHMubmFtZXNwYWNlKSljLmRhdGE9cy5kYXRhLGMuaGFuZGxlT2JqPXMsbz0oKGYuZXZlbnQuc3BlY2lhbFtzLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8cy5oYW5kbGVyKS5hcHBseShxLmVsZW0sZyksbyE9PWImJihjLnJlc3VsdD1vLG89PT0hMSYmKGMucHJldmVudERlZmF1bHQoKSxjLnN0b3BQcm9wYWdhdGlvbigpKSl9fWkucG9zdERpc3BhdGNoJiZpLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYyk7cmV0dXJuIGMucmVzdWx0fX0scHJvcHM6ImF0dHJDaGFuZ2UgYXR0ck5hbWUgcmVsYXRlZE5vZGUgc3JjRWxlbWVudCBhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe2Eud2hpY2g9PW51bGwmJihhLndoaWNoPWIuY2hhckNvZGUhPW51bGw/Yi5jaGFyQ29kZTpiLmtleUNvZGUpO3JldHVybiBhfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxkKXt2YXIgZSxmLGcsaD1kLmJ1dHRvbixpPWQuZnJvbUVsZW1lbnQ7YS5wYWdlWD09bnVsbCYmZC5jbGllbnRYIT1udWxsJiYoZT1hLnRhcmdldC5vd25lckRvY3VtZW50fHxjLGY9ZS5kb2N1bWVudEVsZW1lbnQsZz1lLmJvZHksYS5wYWdlWD1kLmNsaWVudFgrKGYmJmYuc2Nyb2xsTGVmdHx8ZyYmZy5zY3JvbGxMZWZ0fHwwKS0oZiYmZi5jbGllbnRMZWZ0fHxnJiZnLmNsaWVudExlZnR8fDApLGEucGFnZVk9ZC5jbGllbnRZKyhmJiZmLnNjcm9sbFRvcHx8ZyYmZy5zY3JvbGxUb3B8fDApLShmJiZmLmNsaWVudFRvcHx8ZyYmZy5jbGllbnRUb3B8fDApKSwhYS5yZWxhdGVkVGFyZ2V0JiZpJiYoYS5yZWxhdGVkVGFyZ2V0PWk9PT1hLnRhcmdldD9kLnRvRWxlbWVudDppKSwhYS53aGljaCYmaCE9PWImJihhLndoaWNoPWgmMT8xOmgmMj8zOmgmND8yOjApO3JldHVybiBhfX0sZml4OmZ1bmN0aW9uKGEpe2lmKGFbZi5leHBhbmRvXSlyZXR1cm4gYTt2YXIgZCxlLGc9YSxoPWYuZXZlbnQuZml4SG9va3NbYS50eXBlXXx8e30saT1oLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KGgucHJvcHMpOnRoaXMucHJvcHM7YT1mLkV2ZW50KGcpO2ZvcihkPWkubGVuZ3RoO2Q7KWU9aVstLWRdLGFbZV09Z1tlXTthLnRhcmdldHx8KGEudGFyZ2V0PWcuc3JjRWxlbWVudHx8YyksYS50YXJnZXQubm9kZVR5cGU9PT0zJiYoYS50YXJnZXQ9YS50YXJnZXQucGFyZW50Tm9kZSksYS5tZXRhS2V5PT09YiYmKGEubWV0YUtleT1hLmN0cmxLZXkpO3JldHVybiBoLmZpbHRlcj9oLmZpbHRlcihhLGcpOmF9LHNwZWNpYWw6e3JlYWR5OntzZXR1cDpmLmJpbmRSZWFkeX0sbG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOntkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOntkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsYyl7Zi5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9Yyl9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7dGhpcy5vbmJlZm9yZXVubG9hZD09PWImJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWYuZXh0ZW5kKG5ldyBmLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7ZD9mLmV2ZW50LnRyaWdnZXIoZSxudWxsLGIpOmYuZXZlbnQuZGlzcGF0Y2guY2FsbChiLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMucHJldmVudERlZmF1bHQoKX19LGYuZXZlbnQuaGFuZGxlPWYuZXZlbnQuZGlzcGF0Y2gsZi5yZW1vdmVFdmVudD1jLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXthLmRldGFjaEV2ZW50JiZhLmRldGFjaEV2ZW50KCJvbiIrYixjKX0sZi5FdmVudD1mdW5jdGlvbihhLGIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGYuRXZlbnQpKXJldHVybiBuZXcgZi5FdmVudChhLGIpO2EmJmEudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fGEucmV0dXJuVmFsdWU9PT0hMXx8YS5nZXRQcmV2ZW50RGVmYXVsdCYmYS5nZXRQcmV2ZW50RGVmYXVsdCgpP0s6Sik6dGhpcy50eXBlPWEsYiYmZi5leHRlbmQodGhpcyxiKSx0aGlzLnRpbWVTdGFtcD1hJiZhLnRpbWVTdGFtcHx8Zi5ub3coKSx0aGlzW2YuZXhwYW5kb109ITB9LGYuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPUs7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9Szt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7IWF8fChhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9Syx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6Sixpc1Byb3BhZ2F0aW9uU3RvcHBlZDpKLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOkp9LGYuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7Zi5ldmVudC5zcGVjaWFsW2FdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLGQ9YS5yZWxhdGVkVGFyZ2V0LGU9YS5oYW5kbGVPYmosZz1lLnNlbGVjdG9yLGg7aWYoIWR8fGQhPT1jJiYhZi5jb250YWlucyhjLGQpKWEudHlwZT1lLm9yaWdUeXBlLGg9ZS5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YjtyZXR1cm4gaH19fSksZi5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGM9YS50YXJnZXQsZD1mLm5vZGVOYW1lKGMsImlucHV0Iil8fGYubm9kZU5hbWUoYywiYnV0dG9uIik/Yy5mb3JtOmI7ZCYmIWQuX3N1Ym1pdF9hdHRhY2hlZCYmKGYuZXZlbnQuYWRkKGQsInN1Ym1pdC5fc3VibWl0IixmdW5jdGlvbihhKXthLl9zdWJtaXRfYnViYmxlPSEwfSksZC5fc3VibWl0X2F0dGFjaGVkPSEwKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZmLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7aWYoZi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7Zi5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxmLnN1cHBvcnQuY2hhbmdlQnViYmxlc3x8KGYuZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7aWYoei50ZXN0KHRoaXMubm9kZU5hbWUpKXtpZih0aGlzLnR5cGU9PT0iY2hlY2tib3gifHx0aGlzLnR5cGU9PT0icmFkaW8iKWYuZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe2Eub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWU9PT0iY2hlY2tlZCImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksZi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEsZi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLGEsITApKX0pO3JldHVybiExfWYuZXZlbnQuYWRkKHRoaXMsImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3oudGVzdChiLm5vZGVOYW1lKSYmIWIuX2NoYW5nZV9hdHRhY2hlZCYmKGYuZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJiFhLmlzU2ltdWxhdGVkJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksYi5fY2hhbmdlX2F0dGFjaGVkPSEwKX0pfSxoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7aWYodGhpcyE9PWJ8fGEuaXNTaW11bGF0ZWR8fGEuaXNUcmlnZ2VyfHxiLnR5cGUhPT0icmFkaW8iJiZiLnR5cGUhPT0iY2hlY2tib3giKXJldHVybiBhLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpO3JldHVybiB6LnRlc3QodGhpcy5ub2RlTmFtZSl9fSksZi5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHxmLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPWZ1bmN0aW9uKGEpe2YuZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxmLmV2ZW50LmZpeChhKSwhMCl9O2YuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXtkKys9PT0wJiZjLmFkZEV2ZW50TGlzdGVuZXIoYSxlLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXstLWQ9PT0wJiZjLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxlLCEwKX19fSksZi5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaTtpZih0eXBlb2YgYT09Im9iamVjdCIpe3R5cGVvZiBjIT0ic3RyaW5nIiYmKGQ9ZHx8YyxjPWIpO2ZvcihpIGluIGEpdGhpcy5vbihpLGMsZCxhW2ldLGcpO3JldHVybiB0aGlzfWQ9PW51bGwmJmU9PW51bGw/KGU9YyxkPWM9Yik6ZT09bnVsbCYmKHR5cGVvZiBjPT0ic3RyaW5nIj8oZT1kLGQ9Yik6KGU9ZCxkPWMsYz1iKSk7aWYoZT09PSExKWU9SjtlbHNlIGlmKCFlKXJldHVybiB0aGlzO2c9PT0xJiYoaD1lLGU9ZnVuY3Rpb24oYSl7ZigpLm9mZihhKTtyZXR1cm4gaC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZ3VpZD1oLmd1aWR8fChoLmd1aWQ9Zi5ndWlkKyspKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5hZGQodGhpcyxhLGUsZCxjKX0pfSxvbmU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYSxiLGMsZCwxKX0sb2ZmOmZ1bmN0aW9uKGEsYyxkKXtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iail7dmFyIGU9YS5oYW5kbGVPYmo7ZihhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoZS5uYW1lc3BhY2U/ZS5vcmlnVHlwZSsiLiIrZS5uYW1lc3BhY2U6ZS5vcmlnVHlwZSxlLnNlbGVjdG9yLGUuaGFuZGxlcik7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJvYmplY3QiKXtmb3IodmFyIGcgaW4gYSl0aGlzLm9mZihnLGMsYVtnXSk7cmV0dXJuIHRoaXN9aWYoYz09PSExfHx0eXBlb2YgYz09ImZ1bmN0aW9uIilkPWMsYz1iO2Q9PT0hMSYmKGQ9Sik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsYSxkLGMpfSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxsaXZlOmZ1bmN0aW9uKGEsYixjKXtmKHRoaXMuY29udGV4dCkub24oYSx0aGlzLnNlbGVjdG9yLGIsYyk7cmV0dXJuIHRoaXN9LGRpZTpmdW5jdGlvbihhLGIpe2YodGhpcy5jb250ZXh0KS5vZmYoYSx0aGlzLnNlbGVjdG9yfHwiKioiLGIpO3JldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGEsYyl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pcmV0dXJuIGYuZXZlbnQudHJpZ2dlcihhLGIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz1hLmd1aWR8fGYuZ3VpZCsrLGQ9MCxlPWZ1bmN0aW9uKGMpe3ZhciBlPShmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7Zi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZSsxKSxjLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07ZS5ndWlkPWM7d2hpbGUoZDxiLmxlbmd0aCliW2QrK10uZ3VpZD1jO3JldHVybiB0aGlzLmNsaWNrKGUpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxmLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEsYyl7Yz09bnVsbCYmKGM9YSxhPW51bGwpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9LGYuYXR0ckZuJiYoZi5hdHRyRm5bYl09ITApLEMudGVzdChiKSYmKGYuZXZlbnQuZml4SG9va3NbYl09Zi5ldmVudC5rZXlIb29rcyksRC50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oKXtmdW5jdGlvbiB4KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWlmKGoubm9kZVR5cGU9PT0xKXtnfHwoaltkXT1jLGouc2l6c2V0PWgpO2lmKHR5cGVvZiBiIT0ic3RyaW5nIil7aWYoaj09PWIpe2s9ITA7YnJlYWt9fWVsc2UgaWYobS5maWx0ZXIoYixbal0pLmxlbmd0aD4wKXtrPWo7YnJlYWt9fWo9althXX1lW2hdPWt9fX1mdW5jdGlvbiB3KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWoubm9kZVR5cGU9PT0xJiYhZyYmKGpbZF09YyxqLnNpenNldD1oKTtpZihqLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iKXtrPWo7YnJlYWt9aj1qW2FdfWVbaF09a319fXZhciBhPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZD0ic2l6Y2FjaGUiKyhNYXRoLnJhbmRvbSgpKyIiKS5yZXBsYWNlKCIuIiwiIiksZT0wLGc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPSExLGk9ITAsaj0vXFwvZyxrPS9cclxuL2csbD0vXFcvO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtpPSExO3JldHVybiAwfSk7dmFyIG09ZnVuY3Rpb24oYixkLGUsZil7ZT1lfHxbXSxkPWR8fGM7dmFyIGg9ZDtpZihkLm5vZGVUeXBlIT09MSYmZC5ub2RlVHlwZSE9PTkpcmV0dXJuW107aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gZTt2YXIgaSxqLGssbCxuLHEscix0LHU9ITAsdj1tLmlzWE1MKGQpLHc9W10seD1iO2Rve2EuZXhlYygiIiksaT1hLmV4ZWMoeCk7aWYoaSl7eD1pWzNdLHcucHVzaChpWzFdKTtpZihpWzJdKXtsPWlbM107YnJlYWt9fX13aGlsZShpKTtpZih3Lmxlbmd0aD4xJiZwLmV4ZWMoYikpaWYody5sZW5ndGg9PT0yJiZvLnJlbGF0aXZlW3dbMF1dKWo9eSh3WzBdK3dbMV0sZCxmKTtlbHNle2o9by5yZWxhdGl2ZVt3WzBdXT9bZF06bSh3LnNoaWZ0KCksZCk7d2hpbGUody5sZW5ndGgpYj13LnNoaWZ0KCksby5yZWxhdGl2ZVtiXSYmKGIrPXcuc2hpZnQoKSksaj15KGIsaixmKX1lbHNleyFmJiZ3Lmxlbmd0aD4xJiZkLm5vZGVUeXBlPT09OSYmIXYmJm8ubWF0Y2guSUQudGVzdCh3WzBdKSYmIW8ubWF0Y2guSUQudGVzdCh3W3cubGVuZ3RoLTFdKSYmKG49bS5maW5kKHcuc2hpZnQoKSxkLHYpLGQ9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldClbMF06bi5zZXRbMF0pO2lmKGQpe249Zj97ZXhwcjp3LnBvcCgpLHNldDpzKGYpfTptLmZpbmQody5wb3AoKSx3Lmxlbmd0aD09PTEmJih3WzBdPT09In4ifHx3WzBdPT09IisiKSYmZC5wYXJlbnROb2RlP2QucGFyZW50Tm9kZTpkLHYpLGo9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldCk6bi5zZXQsdy5sZW5ndGg+MD9rPXMoaik6dT0hMTt3aGlsZSh3Lmxlbmd0aClxPXcucG9wKCkscj1xLG8ucmVsYXRpdmVbcV0/cj13LnBvcCgpOnE9IiIscj09bnVsbCYmKHI9ZCksby5yZWxhdGl2ZVtxXShrLHIsdil9ZWxzZSBrPXc9W119a3x8KGs9aiksa3x8bS5lcnJvcihxfHxiKTtpZihnLmNhbGwoayk9PT0iW29iamVjdCBBcnJheV0iKWlmKCF1KWUucHVzaC5hcHBseShlLGspO2Vsc2UgaWYoZCYmZC5ub2RlVHlwZT09PTEpZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiYoa1t0XT09PSEwfHxrW3RdLm5vZGVUeXBlPT09MSYmbS5jb250YWlucyhkLGtbdF0pKSYmZS5wdXNoKGpbdF0pO2Vsc2UgZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiZrW3RdLm5vZGVUeXBlPT09MSYmZS5wdXNoKGpbdF0pO2Vsc2UgcyhrLGUpO2wmJihtKGwsaCxlLGYpLG0udW5pcXVlU29ydChlKSk7cmV0dXJuIGV9O20udW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZih1KXtoPWksYS5zb3J0KHUpO2lmKGgpZm9yKHZhciBiPTE7YjxhLmxlbmd0aDtiKyspYVtiXT09PWFbYi0xXSYmYS5zcGxpY2UoYi0tLDEpfXJldHVybiBhfSxtLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShhLG51bGwsbnVsbCxiKX0sbS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShiLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfSxtLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaTtpZighYSlyZXR1cm5bXTtmb3IoZT0wLGY9by5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7aD1vLm9yZGVyW2VdO2lmKGc9by5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7aT1nWzFdLGcuc3BsaWNlKDEsMSk7aWYoaS5zdWJzdHIoaS5sZW5ndGgtMSkhPT0iXFwiKXtnWzFdPShnWzFdfHwiIikucmVwbGFjZShqLCIiKSxkPW8uZmluZFtoXShnLGIsYyk7aWYoZCE9bnVsbCl7YT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7YnJlYWt9fX19ZHx8KGQ9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTpbXSk7cmV0dXJue3NldDpkLGV4cHI6YX19LG0uZmlsdGVyPWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG4scCxxPWEscj1bXSxzPWMsdD1jJiZjWzBdJiZtLmlzWE1MKGNbMF0pO3doaWxlKGEmJmMubGVuZ3RoKXtmb3IoaCBpbiBvLmZpbHRlcilpZigoZj1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKSE9bnVsbCYmZlsyXSl7az1vLmZpbHRlcltoXSxsPWZbMV0sZz0hMSxmLnNwbGljZSgxLDEpO2lmKGwuc3Vic3RyKGwubGVuZ3RoLTEpPT09IlxcIiljb250aW51ZTtzPT09ciYmKHI9W10pO2lmKG8ucHJlRmlsdGVyW2hdKXtmPW8ucHJlRmlsdGVyW2hdKGYscyxkLHIsZSx0KTtpZighZilnPWk9ITA7ZWxzZSBpZihmPT09ITApY29udGludWV9aWYoZilmb3Iobj0wOyhqPXNbbl0pIT1udWxsO24rKylqJiYoaT1rKGosZixuLHMpLHA9ZV5pLGQmJmkhPW51bGw/cD9nPSEwOnNbbl09ITE6cCYmKHIucHVzaChqKSxnPSEwKSk7aWYoaSE9PWIpe2R8fChzPXIpLGE9YS5yZXBsYWNlKG8ubWF0Y2hbaF0sIiIpO2lmKCFnKXJldHVybltdO2JyZWFrfX1pZihhPT09cSlpZihnPT1udWxsKW0uZXJyb3IoYSk7ZWxzZSBicmVhaztxPWF9cmV0dXJuIHN9LG0uZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfTt2YXIgbj1tLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWEubm9kZVR5cGUsZT0iIjtpZihkKXtpZihkPT09MXx8ZD09PTl8fGQ9PT0xMSl7aWYodHlwZW9mIGEudGV4dENvbnRlbnQ9PSJzdHJpbmciKXJldHVybiBhLnRleHRDb250ZW50O2lmKHR5cGVvZiBhLmlubmVyVGV4dD09InN0cmluZyIpcmV0dXJuIGEuaW5uZXJUZXh0LnJlcGxhY2UoaywiIik7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWUrPW4oYSl9ZWxzZSBpZihkPT09M3x8ZD09PTQpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2UgZm9yKGI9MDtjPWFbYl07YisrKWMubm9kZVR5cGUhPT04JiYoZSs9bihjKSk7cmV0dXJuIGV9LG89bS5zZWxlY3RvcnM9e29yZGVyOlsiSUQiLCJOQU1FIiwiVEFHIl0sbWF0Y2g6e0lEOi8jKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxDTEFTUzovXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLE5BTUU6L1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVsnIl0qXF0vLEFUVFI6L1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKD86KFsnIl0pKC4qPylcM3woIz8oPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikqKXwpfClccypcXS8sVEFHOi9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XChccyooZXZlbnxvZGR8KD86WytcLV0/XGQrfCg/OlsrXC1dP1xkKik/blxzKig/OlsrXC1dXHMqXGQrKT8pKVxzKlwpKT8vLFBPUzovOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcKChcZCopXCkpPyg/PVteXC1dfCQpLyxQU0VVRE86LzooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy99LGxlZnRNYXRjaDp7fSxhdHRyTWFwOnsiY2xhc3MiOiJjbGFzc05hbWUiLCJmb3IiOiJodG1sRm9yIn0sYXR0ckhhbmRsZTp7aHJlZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInR5cGUiKX19LHJlbGF0aXZlOnsiKyI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYj09InN0cmluZyIsZD1jJiYhbC50ZXN0KGIpLGU9YyYmIWQ7ZCYmKGI9Yi50b0xvd2VyQ2FzZSgpKTtmb3IodmFyIGY9MCxnPWEubGVuZ3RoLGg7ZjxnO2YrKylpZihoPWFbZl0pe3doaWxlKChoPWgucHJldmlvdXNTaWJsaW5nKSYmaC5ub2RlVHlwZSE9PTEpO2FbZl09ZXx8aCYmaC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yj9ofHwhMTpoPT09Yn1lJiZtLmZpbHRlcihiLGEsITApfSwiPiI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPXR5cGVvZiBiPT0ic3RyaW5nIixlPTAsZj1hLmxlbmd0aDtpZihkJiYhbC50ZXN0KGIpKXtiPWIudG9Mb3dlckNhc2UoKTtmb3IoO2U8ZjtlKyspe2M9YVtlXTtpZihjKXt2YXIgZz1jLnBhcmVudE5vZGU7YVtlXT1nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2c6ITF9fX1lbHNle2Zvcig7ZTxmO2UrKyljPWFbZV0sYyYmKGFbZV09ZD9jLnBhcmVudE5vZGU6Yy5wYXJlbnROb2RlPT09Yik7ZCYmbS5maWx0ZXIoYixhLCEwKX19LCIiOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPWUrKyxnPXg7dHlwZW9mIGI9PSJzdHJpbmciJiYhbC50ZXN0KGIpJiYoYj1iLnRvTG93ZXJDYXNlKCksZD1iLGc9dyksZygicGFyZW50Tm9kZSIsYixmLGEsZCxjKX0sIn4iOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPWUrKyxnPXg7dHlwZW9mIGI9PSJzdHJpbmciJiYhbC50ZXN0KGIpJiYoYj1iLnRvTG93ZXJDYXNlKCksZD1iLGc9dyksZygicHJldmlvdXNTaWJsaW5nIixiLGYsYSxkLGMpfX0sZmluZDp7SUQ6ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWMpe3ZhciBkPWIuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGQmJmQucGFyZW50Tm9kZT9bZF06W119fSxOQU1FOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeU5hbWUhPSJ1bmRlZmluZWQiKXt2YXIgYz1bXSxkPWIuZ2V0RWxlbWVudHNCeU5hbWUoYVsxXSk7Zm9yKHZhciBlPTAsZj1kLmxlbmd0aDtlPGY7ZSsrKWRbZV0uZ2V0QXR0cmlidXRlKCJuYW1lIik9PT1hWzFdJiZjLnB1c2goZFtlXSk7cmV0dXJuIGMubGVuZ3RoPT09MD9udWxsOmN9fSxUQUc6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCIpcmV0dXJuIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSl9fSxwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXthPSIgIithWzFdLnJlcGxhY2UoaiwiIikrIiAiO2lmKGYpcmV0dXJuIGE7Zm9yKHZhciBnPTAsaDsoaD1iW2ddKSE9bnVsbDtnKyspaCYmKGVeKGguY2xhc3NOYW1lJiYoIiAiK2guY2xhc3NOYW1lKyIgIikucmVwbGFjZSgvW1x0XG5ccl0vZywiICIpLmluZGV4T2YoYSk+PTApP2N8fGQucHVzaChoKTpjJiYoYltnXT0hMSkpO3JldHVybiExfSxJRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXS5yZXBsYWNlKGosIiIpfSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVsxXS5yZXBsYWNlKGosIiIpLnRvTG93ZXJDYXNlKCl9LENISUxEOmZ1bmN0aW9uKGEpe2lmKGFbMV09PT0ibnRoIil7YVsyXXx8bS5lcnJvcihhWzBdKSxhWzJdPWFbMl0ucmVwbGFjZSgvXlwrfFxzKi9nLCIiKTt2YXIgYj0vKC0/KShcZCopKD86bihbK1wtXT9cZCopKT8vLmV4ZWMoYVsyXT09PSJldmVuIiYmIjJuInx8YVsyXT09PSJvZGQiJiYiMm4rMSJ8fCEvXEQvLnRlc3QoYVsyXSkmJiIwbisiK2FbMl18fGFbMl0pO2FbMl09YlsxXSsoYlsyXXx8MSktMCxhWzNdPWJbM10tMH1lbHNlIGFbMl0mJm0uZXJyb3IoYVswXSk7YVswXT1lKys7cmV0dXJuIGF9LEFUVFI6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPWFbMV09YVsxXS5yZXBsYWNlKGosIiIpOyFmJiZvLmF0dHJNYXBbZ10mJihhWzFdPW8uYXR0ck1hcFtnXSksYVs0XT0oYVs0XXx8YVs1XXx8IiIpLnJlcGxhY2UoaiwiIiksYVsyXT09PSJ+PSImJihhWzRdPSIgIithWzRdKyIgIik7cmV0dXJuIGF9LFBTRVVETzpmdW5jdGlvbihiLGMsZCxlLGYpe2lmKGJbMV09PT0ibm90IilpZigoYS5leGVjKGJbM10pfHwiIikubGVuZ3RoPjF8fC9eXHcvLnRlc3QoYlszXSkpYlszXT1tKGJbM10sbnVsbCxudWxsLGMpO2Vsc2V7dmFyIGc9bS5maWx0ZXIoYlszXSxjLGQsITBeZik7ZHx8ZS5wdXNoLmFwcGx5KGUsZyk7cmV0dXJuITF9ZWxzZSBpZihvLm1hdGNoLlBPUy50ZXN0KGJbMF0pfHxvLm1hdGNoLkNISUxELnRlc3QoYlswXSkpcmV0dXJuITA7cmV0dXJuIGJ9LFBPUzpmdW5jdGlvbihhKXthLnVuc2hpZnQoITApO3JldHVybiBhfX0sZmlsdGVyczp7ZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExJiZhLnR5cGUhPT0iaGlkZGVuIn0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5jaGVja2VkPT09ITB9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe2EucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7cmV0dXJuIGEuc2VsZWN0ZWQ9PT0hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiEhYS5maXJzdENoaWxkfSxlbXB0eTpmdW5jdGlvbihhKXtyZXR1cm4hYS5maXJzdENoaWxkfSxoYXM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiEhbShjWzNdLGEpLmxlbmd0aH0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybi9oXGQvaS50ZXN0KGEubm9kZU5hbWUpfSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIiksYz1hLnR5cGU7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJ0ZXh0Ij09PWMmJihiPT09Y3x8Yj09PW51bGwpfSxyYWRpbzpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInJhZGlvIj09PWEudHlwZX0sY2hlY2tib3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJjaGVja2JveCI9PT1hLnR5cGV9LGZpbGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJmaWxlIj09PWEudHlwZX0scGFzc3dvcmQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJwYXNzd29yZCI9PT1hLnR5cGV9LHN1Ym1pdDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKGI9PT0iaW5wdXQifHxiPT09ImJ1dHRvbiIpJiYic3VibWl0Ij09PWEudHlwZX0saW1hZ2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJpbWFnZSI9PT1hLnR5cGV9LHJlc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJyZXNldCI9PT1hLnR5cGV9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGI9PT0iaW5wdXQiJiYiYnV0dG9uIj09PWEudHlwZXx8Yj09PSJidXR0b24ifSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4vaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoYS5ub2RlTmFtZSl9LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09YS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9fSxzZXRGaWx0ZXJzOntmaXJzdDpmdW5jdGlvbihhLGIpe3JldHVybiBiPT09MH0sbGFzdDpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYj09PWQubGVuZ3RoLTF9LGV2ZW46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MH0sb2RkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTF9LGx0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYjxjWzNdLTB9LGd0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYj5jWzNdLTB9LG50aDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9LGVxOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn19LGZpbHRlcjp7UFNFVURPOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWJbMV0sZj1vLmZpbHRlcnNbZV07aWYoZilyZXR1cm4gZihhLGMsYixkKTtpZihlPT09ImNvbnRhaW5zIilyZXR1cm4oYS50ZXh0Q29udGVudHx8YS5pbm5lclRleHR8fG4oW2FdKXx8IiIpLmluZGV4T2YoYlszXSk+PTA7aWYoZT09PSJub3QiKXt2YXIgZz1iWzNdO2Zvcih2YXIgaD0wLGk9Zy5sZW5ndGg7aDxpO2grKylpZihnW2hdPT09YSlyZXR1cm4hMTtyZXR1cm4hMH1tLmVycm9yKGUpfSxDSElMRDpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaSxqLGs9YlsxXSxsPWE7c3dpdGNoKGspe2Nhc2Uib25seSI6Y2FzZSJmaXJzdCI6d2hpbGUobD1sLnByZXZpb3VzU2libGluZylpZihsLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtpZihrPT09ImZpcnN0IilyZXR1cm4hMDtsPWE7Y2FzZSJsYXN0Ijp3aGlsZShsPWwubmV4dFNpYmxpbmcpaWYobC5ub2RlVHlwZT09PTEpcmV0dXJuITE7cmV0dXJuITA7Y2FzZSJudGgiOmM9YlsyXSxlPWJbM107aWYoYz09PTEmJmU9PT0wKXJldHVybiEwO2Y9YlswXSxnPWEucGFyZW50Tm9kZTtpZihnJiYoZ1tkXSE9PWZ8fCFhLm5vZGVJbmRleCkpe2k9MDtmb3IobD1nLmZpcnN0Q2hpbGQ7bDtsPWwubmV4dFNpYmxpbmcpbC5ub2RlVHlwZT09PTEmJihsLm5vZGVJbmRleD0rK2kpO2dbZF09Zn1qPWEubm9kZUluZGV4LWU7cmV0dXJuIGM9PT0wP2o9PT0wOmolYz09PTAmJmovYz49MH19LElEOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEubm9kZVR5cGU9PT0xJiZhLmdldEF0dHJpYnV0ZSgiaWQiKT09PWJ9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBiPT09IioiJiZhLm5vZGVUeXBlPT09MXx8ISFhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifSxDTEFTUzpmdW5jdGlvbihhLGIpe3JldHVybigiICIrKGEuY2xhc3NOYW1lfHxhLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkrIiAiKS5pbmRleE9mKGIpPi0xfSxBVFRSOmZ1bmN0aW9uKGEsYil7dmFyIGM9YlsxXSxkPW0uYXR0cj9tLmF0dHIoYSxjKTpvLmF0dHJIYW5kbGVbY10/by5hdHRySGFuZGxlW2NdKGEpOmFbY10hPW51bGw/YVtjXTphLmdldEF0dHJpYnV0ZShjKSxlPWQrIiIsZj1iWzJdLGc9Yls0XTtyZXR1cm4gZD09bnVsbD9mPT09IiE9IjohZiYmbS5hdHRyP2QhPW51bGw6Zj09PSI9Ij9lPT09ZzpmPT09Iio9Ij9lLmluZGV4T2YoZyk+PTA6Zj09PSJ+PSI/KCIgIitlKyIgIikuaW5kZXhPZihnKT49MDpnP2Y9PT0iIT0iP2UhPT1nOmY9PT0iXj0iP2UuaW5kZXhPZihnKT09PTA6Zj09PSIkPSI/ZS5zdWJzdHIoZS5sZW5ndGgtZy5sZW5ndGgpPT09ZzpmPT09Inw9Ij9lPT09Z3x8ZS5zdWJzdHIoMCxnLmxlbmd0aCsxKT09PWcrIi0iOiExOmUmJmQhPT0hMX0sUE9TOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWJbMl0sZj1vLnNldEZpbHRlcnNbZV07aWYoZilyZXR1cm4gZihhLGMsYixkKX19fSxwPW8ubWF0Y2guUE9TLHE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4iXFwiKyhiLTArMSl9O2Zvcih2YXIgciBpbiBvLm1hdGNoKW8ubWF0Y2hbcl09bmV3IFJlZ0V4cChvLm1hdGNoW3JdLnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpLG8ubGVmdE1hdGNoW3JdPW5ldyBSZWdFeHAoLyheKD86LnxccnxcbikqPykvLnNvdXJjZStvLm1hdGNoW3JdLnNvdXJjZS5yZXBsYWNlKC9cXChcZCspL2cscSkpO28ubWF0Y2guZ2xvYmFsUE9TPXA7dmFyIHM9ZnVuY3Rpb24oYSxiKXthPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsMCk7aWYoYil7Yi5wdXNoLmFwcGx5KGIsYSk7cmV0dXJuIGJ9cmV0dXJuIGF9O3RyeXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLDApWzBdLm5vZGVUeXBlfWNhdGNoKHQpe3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9Ynx8W107aWYoZy5jYWxsKGEpPT09IltvYmplY3QgQXJyYXldIilBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkLGEpO2Vsc2UgaWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilmb3IodmFyIGU9YS5sZW5ndGg7YzxlO2MrKylkLnB1c2goYVtjXSk7ZWxzZSBmb3IoO2FbY107YysrKWQucHVzaChhW2NdKTtyZXR1cm4gZH19dmFyIHUsdjtjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj91PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjE7cmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmND8tMToxfToodT1mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXtoPSEwO3JldHVybiAwfWlmKGEuc291cmNlSW5kZXgmJmIuc291cmNlSW5kZXgpcmV0dXJuIGEuc291cmNlSW5kZXgtYi5zb3VyY2VJbmRleDt2YXIgYyxkLGU9W10sZj1bXSxnPWEucGFyZW50Tm9kZSxpPWIucGFyZW50Tm9kZSxqPWc7aWYoZz09PWkpcmV0dXJuIHYoYSxiKTtpZighZylyZXR1cm4tMTtpZighaSlyZXR1cm4gMTt3aGlsZShqKWUudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtqPWk7d2hpbGUoailmLnVuc2hpZnQoaiksaj1qLnBhcmVudE5vZGU7Yz1lLmxlbmd0aCxkPWYubGVuZ3RoO2Zvcih2YXIgaz0wO2s8YyYmazxkO2srKylpZihlW2tdIT09ZltrXSlyZXR1cm4gdihlW2tdLGZba10pO3JldHVybiBrPT09Yz92KGEsZltrXSwtMSk6dihlW2tdLGIsMSl9LHY9ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PT1iKXJldHVybiBjO3ZhciBkPWEubmV4dFNpYmxpbmc7d2hpbGUoZCl7aWYoZD09PWIpcmV0dXJuLTE7ZD1kLm5leHRTaWJsaW5nfXJldHVybiAxfSksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9InNjcmlwdCIrKG5ldyBEYXRlKS5nZXRUaW1lKCksZT1jLmRvY3VtZW50RWxlbWVudDthLmlubmVySFRNTD0iPGEgbmFtZT0nIitkKyInLz4iLGUuaW5zZXJ0QmVmb3JlKGEsZS5maXJzdENoaWxkKSxjLmdldEVsZW1lbnRCeUlkKGQpJiYoby5maW5kLklEPWZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYy5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFkKXt2YXIgZT1jLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBlP2UuaWQ9PT1hWzFdfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT0idW5kZWZpbmVkIiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZT09PWFbMV0/W2VdOmI6W119fSxvLmZpbHRlci5JRD1mdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGEubm9kZVR5cGU9PT0xJiZjJiZjLm5vZGVWYWx1ZT09PWJ9KSxlLnJlbW92ZUNoaWxkKGEpLGU9YT1udWxsfSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmFwcGVuZENoaWxkKGMuY3JlYXRlQ29tbWVudCgiIikpLGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MCYmKG8uZmluZC5UQUc9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pO2lmKGFbMV09PT0iKiIpe3ZhciBkPVtdO2Zvcih2YXIgZT0wO2NbZV07ZSsrKWNbZV0ubm9kZVR5cGU9PT0xJiZkLnB1c2goY1tlXSk7Yz1kfXJldHVybiBjfSksYS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLGEuZmlyc3RDaGlsZCYmdHlwZW9mIGEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPSJ1bmRlZmluZWQiJiZhLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyImJihvLmF0dHJIYW5kbGUuaHJlZj1mdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiLDIpfSksYT1udWxsfSgpLGMucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgYT1tLGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPSJfX3NpenpsZV9fIjtiLmlubmVySFRNTD0iPHAgY2xhc3M9J1RFU1QnPjwvcD4iO2lmKCFiLnF1ZXJ5U2VsZWN0b3JBbGx8fGIucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGghPT0wKXttPWZ1bmN0aW9uKGIsZSxmLGcpe2U9ZXx8YztpZighZyYmIW0uaXNYTUwoZSkpe3ZhciBoPS9eKFx3KyQpfF5cLihbXHdcLV0rJCl8XiMoW1x3XC1dKyQpLy5leGVjKGIpO2lmKGgmJihlLm5vZGVUeXBlPT09MXx8ZS5ub2RlVHlwZT09PTkpKXtpZihoWzFdKXJldHVybiBzKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYiksZik7aWYoaFsyXSYmby5maW5kLkNMQVNTJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGhbMl0pLGYpfWlmKGUubm9kZVR5cGU9PT05KXtpZihiPT09ImJvZHkiJiZlLmJvZHkpcmV0dXJuIHMoW2UuYm9keV0sZik7aWYoaCYmaFszXSl7dmFyIGk9ZS5nZXRFbGVtZW50QnlJZChoWzNdKTtpZighaXx8IWkucGFyZW50Tm9kZSlyZXR1cm4gcyhbXSxmKTtpZihpLmlkPT09aFszXSlyZXR1cm4gcyhbaV0sZil9dHJ5e3JldHVybiBzKGUucXVlcnlTZWxlY3RvckFsbChiKSxmKX1jYXRjaChqKXt9fWVsc2UgaWYoZS5ub2RlVHlwZT09PTEmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXt2YXIgaz1lLGw9ZS5nZXRBdHRyaWJ1dGUoImlkIiksbj1sfHxkLHA9ZS5wYXJlbnROb2RlLHE9L15ccypbK35dLy50ZXN0KGIpO2w/bj1uLnJlcGxhY2UoLycvZywiXFwkJiIpOmUuc2V0QXR0cmlidXRlKCJpZCIsbikscSYmcCYmKGU9ZS5wYXJlbnROb2RlKTt0cnl7aWYoIXF8fHApcmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWQ9JyIrbisiJ10gIitiKSxmKX1jYXRjaChyKXt9ZmluYWxseXtsfHxrLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBhKGIsZSxmLGcpfTtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07Yj1udWxsfX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuZG9jdW1lbnRFbGVtZW50LGI9YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcjtpZihiKXt2YXIgZD0hYi5jYWxsKGMuY3JlYXRlRWxlbWVudCgiZGl2IiksImRpdiIpLGU9ITE7dHJ5e2IuY2FsbChjLmRvY3VtZW50RWxlbWVudCwiW3Rlc3QhPScnXTpzaXp6bGUiKX1jYXRjaChmKXtlPSEwfW0ubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYyl7Yz1jLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCFtLmlzWE1MKGEpKXRyeXtpZihlfHwhby5tYXRjaC5QU0VVRE8udGVzdChjKSYmIS8hPS8udGVzdChjKSl7dmFyIGY9Yi5jYWxsKGEsYyk7aWYoZnx8IWR8fGEuZG9jdW1lbnQmJmEuZG9jdW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gZn19Y2F0Y2goZyl7fXJldHVybiBtKGMsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9fX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjtpZighIWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MCl7YS5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIjtpZihhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0xKXJldHVybjtvLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIiksby5maW5kLkNMQVNTPWZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT0idW5kZWZpbmVkIiYmIWMpcmV0dXJuIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhWzFdKX0sYT1udWxsfX0oKSxjLmRvY3VtZW50RWxlbWVudC5jb250YWlucz9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEhPT1iJiYoYS5jb250YWlucz9hLmNvbnRhaW5zKGIpOiEwKX06Yy5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/bS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpfTptLmNvbnRhaW5zPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG0uaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9KGE/YS5vd25lckRvY3VtZW50fHxhOjApLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj9iLm5vZGVOYW1lIT09IkhUTUwiOiExfTt2YXIgeT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZT1bXSxmPSIiLGc9Yi5ub2RlVHlwZT9bYl06Yjt3aGlsZShkPW8ubWF0Y2guUFNFVURPLmV4ZWMoYSkpZis9ZFswXSxhPWEucmVwbGFjZShvLm1hdGNoLlBTRVVETywiIik7YT1vLnJlbGF0aXZlW2FdP2ErIioiOmE7Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKW0oYSxnW2hdLGUsYyk7cmV0dXJuIG0uZmlsdGVyKGYsZSl9O20uYXR0cj1mLmF0dHIsbS5zZWxlY3RvcnMuYXR0ck1hcD17fSxmLmZpbmQ9bSxmLmV4cHI9bS5zZWxlY3RvcnMsZi5leHByWyI6Il09Zi5leHByLmZpbHRlcnMsZi51bmlxdWU9bS51bmlxdWVTb3J0LGYudGV4dD1tLmdldFRleHQsZi5pc1hNTERvYz1tLmlzWE1MLGYuY29udGFpbnM9bS5jb250YWluc30oKTt2YXIgTD0vVW50aWwkLyxNPS9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLE49LywvLE89L14uW146I1xbXC4sXSokLyxQPUFycmF5LnByb3RvdHlwZS5zbGljZSxRPWYuZXhwci5tYXRjaC5nbG9iYWxQT1MsUj17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGMsZDtpZih0eXBlb2YgYSE9InN0cmluZyIpcmV0dXJuIGYoYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGM9MCxkPWIubGVuZ3RoO2M8ZDtjKyspaWYoZi5jb250YWlucyhiW2NdLHRoaXMpKXJldHVybiEwfSk7dmFyIGU9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGcsaCxpO2ZvcihjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXtnPWUubGVuZ3RoLGYuZmluZChhLHRoaXNbY10sZSk7aWYoYz4wKWZvcihoPWc7aDxlLmxlbmd0aDtoKyspZm9yKGk9MDtpPGc7aSsrKWlmKGVbaV09PT1lW2hdKXtlLnNwbGljZShoLS0sMSk7YnJlYWt9fXJldHVybiBlfSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGI9ZihhKTtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxjPWIubGVuZ3RoO2E8YzthKyspaWYoZi5jb250YWlucyh0aGlzLGJbYV0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITEpLCJub3QiLGEpfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFQodGhpcyxhLCEwKSwiZmlsdGVyIixhKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISFhJiYodHlwZW9mIGE9PSJzdHJpbmciP1EudGVzdChhKT9mKGEsdGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKT49MDpmLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wOnRoaXMuZmlsdGVyKGEpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQsZSxnPXRoaXNbMF07aWYoZi5pc0FycmF5KGEpKXt2YXIgaD0xO3doaWxlKGcmJmcub3duZXJEb2N1bWVudCYmZyE9PWIpe2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZihnKS5pcyhhW2RdKSYmYy5wdXNoKHtzZWxlY3RvcjphW2RdLGVsZW06ZyxsZXZlbDpofSk7Zz1nLnBhcmVudE5vZGUsaCsrfXJldHVybiBjfXZhciBpPVEudGVzdChhKXx8dHlwZW9mIGEhPSJzdHJpbmciP2YoYSxifHx0aGlzLmNvbnRleHQpOjA7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTt3aGlsZShnKXtpZihpP2kuaW5kZXgoZyk+LTE6Zi5maW5kLm1hdGNoZXNTZWxlY3RvcihnLGEpKXtjLnB1c2goZyk7YnJlYWt9Zz1nLnBhcmVudE5vZGU7aWYoIWd8fCFnLm93bmVyRG9jdW1lbnR8fGc9PT1ifHxnLm5vZGVUeXBlPT09MTEpYnJlYWt9fWM9Yy5sZW5ndGg+MT9mLnVuaXF1ZShjKTpjO3JldHVybiB0aGlzLnB1c2hTdGFjayhjLCJjbG9zZXN0IixhKX0saW5kZXg6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLnByZXZBbGwoKS5sZW5ndGg6LTE7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBmLmluQXJyYXkodGhpc1swXSxmKGEpKTtyZXR1cm4gZi5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKX0sYWRkOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE9PSJzdHJpbmciP2YoYSxiKTpmLm1ha2VBcnJheShhJiZhLm5vZGVUeXBlP1thXTphKSxkPWYubWVyZ2UodGhpcy5nZXQoKSxjKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUyhjWzBdKXx8UyhkWzBdKT9kOmYudW5pcXVlKGQpKX0sYW5kU2VsZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZCh0aGlzLnByZXZPYmplY3QpfX0pLGYuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmYi5ub2RlVHlwZSE9PTExP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gZi5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIixjKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gZi5udGgoYSwyLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kaXIoYSwibmV4dFNpYmxpbmciLGMpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gZi5zaWJsaW5nKChhLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4gZi5zaWJsaW5nKGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLm5vZGVOYW1lKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50fHxhLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6Zi5tYWtlQXJyYXkoYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPWYubWFwKHRoaXMsYixjKTtMLnRlc3QoYSl8fChkPWMpLGQmJnR5cGVvZiBkPT0ic3RyaW5nIiYmKGU9Zi5maWx0ZXIoZCxlKSksZT10aGlzLmxlbmd0aD4xJiYhUlthXT9mLnVuaXF1ZShlKTplLCh0aGlzLmxlbmd0aD4xfHxOLnRlc3QoZCkpJiZNLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSxhLFAuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9fSksZi5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihhLGIsYyl7YyYmKGE9Ijpub3QoIithKyIpIik7cmV0dXJuIGIubGVuZ3RoPT09MT9mLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGJbMF0sYSk/W2JbMF1dOltdOmYuZmluZC5tYXRjaGVzKGEsYil9LGRpcjpmdW5jdGlvbihhLGMsZCl7dmFyIGU9W10sZz1hW2NdO3doaWxlKGcmJmcubm9kZVR5cGUhPT05JiYoZD09PWJ8fGcubm9kZVR5cGUhPT0xfHwhZihnKS5pcyhkKSkpZy5ub2RlVHlwZT09PTEmJmUucHVzaChnKSxnPWdbY107cmV0dXJuIGV9LG50aDpmdW5jdGlvbihhLGIsYyxkKXtiPWJ8fDE7dmFyIGU9MDtmb3IoO2E7YT1hW2NdKWlmKGEubm9kZVR5cGU9PT0xJiYrK2U9PT1iKWJyZWFrO3JldHVybiBhfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7dmFyIGM9W107Zm9yKDthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY319KTt2YXIgVj0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsVz0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLFg9L15ccysvLFk9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9pZyxaPS88KFtcdzpdKykvLCQ9Lzx0Ym9keS9pLF89Lzx8JiM/XHcrOy8sYmE9LzwoPzpzY3JpcHR8c3R5bGUpL2ksYmI9LzwoPzpzY3JpcHR8b2JqZWN0fGVtYmVkfG9wdGlvbnxzdHlsZSkvaSxiYz1uZXcgUmVnRXhwKCI8KD86IitWKyIpW1xccy8+XSIsImkiKSxiZD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxiZT0vXC8oamF2YXxlY21hKXNjcmlwdC9pLGJmPS9eXHMqPCEoPzpcW0NEQVRBXFt8XC1cLSkvLGJnPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sYXJlYTpbMSwiPG1hcD4iLCI8L21hcD4iXSxfZGVmYXVsdDpbMCwiIiwiIl19LGJoPVUoYyk7Ymcub3B0Z3JvdXA9Ymcub3B0aW9uLGJnLnRib2R5PWJnLnRmb290PWJnLmNvbGdyb3VwPWJnLmNhcHRpb249YmcudGhlYWQsYmcudGg9YmcudGQsZi5zdXBwb3J0Lmh0bWxTZXJpYWxpemV8fChiZy5fZGVmYXVsdD1bMSwiZGl2PGRpdj4iLCI8L2Rpdj4iXSksZi5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iP2YudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGMpLmNyZWF0ZVRleHROb2RlKGEpKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSx3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1mKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdENoaWxkJiZhLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xKWE9YS5maXJzdENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7Zih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe2Yubm9kZU5hbWUodGhpcywiYm9keSIpfHxmKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmFwcGVuZENoaWxkKGEpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuaW5zZXJ0QmVmb3JlKGEsdGhpcy5maXJzdENoaWxkKX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPWYKKy5jbGVhbihhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGYuY2xlYW4oYXJndW1lbnRzKSk7cmV0dXJuIGF9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkOyhkPXRoaXNbY10pIT1udWxsO2MrKylpZighYXx8Zi5maWx0ZXIoYSxbZF0pLmxlbmd0aCkhYiYmZC5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YShkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGYuY2xlYW5EYXRhKFtkXSkpLGQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGI7KGI9dGhpc1thXSkhPW51bGw7YSsrKXtiLm5vZGVUeXBlPT09MSYmZi5jbGVhbkRhdGEoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTt3aGlsZShiLmZpcnN0Q2hpbGQpYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfXJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe2E9YT09bnVsbD8hMTphLGI9Yj09bnVsbD9hOmI7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGYuY2xvbmUodGhpcyxhLGIpfSl9LGh0bWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSl7dmFyIGM9dGhpc1swXXx8e30sZD0wLGU9dGhpcy5sZW5ndGg7aWYoYT09PWIpcmV0dXJuIGMubm9kZVR5cGU9PT0xP2MuaW5uZXJIVE1MLnJlcGxhY2UoVywiIik6bnVsbDtpZih0eXBlb2YgYT09InN0cmluZyImJiFiYS50ZXN0KGEpJiYoZi5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhWC50ZXN0KGEpKSYmIWJnWyhaLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPWEucmVwbGFjZShZLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPGU7ZCsrKWM9dGhpc1tkXXx8e30sYy5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YShjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGMuaW5uZXJIVE1MPWEpO2M9MH1jYXRjaChnKXt9fWMmJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpLGQ9Yy5odG1sKCk7Yy5yZXBsYWNlV2l0aChhLmNhbGwodGhpcyxiLGQpKX0pO3R5cGVvZiBhIT0ic3RyaW5nIiYmKGE9ZihhKS5kZXRhY2goKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsYz10aGlzLnBhcmVudE5vZGU7Zih0aGlzKS5yZW1vdmUoKSxiP2YoYikuYmVmb3JlKGEpOmYoYykuYXBwZW5kKGEpfSl9cmV0dXJuIHRoaXMubGVuZ3RoP3RoaXMucHVzaFN0YWNrKGYoZi5pc0Z1bmN0aW9uKGEpP2EoKTphKSwicmVwbGFjZVdpdGgiLGEpOnRoaXN9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnLGgsaSxqPWFbMF0saz1bXTtpZighZi5zdXBwb3J0LmNoZWNrQ2xvbmUmJmFyZ3VtZW50cy5sZW5ndGg9PT0zJiZ0eXBlb2Ygaj09InN0cmluZyImJmJkLnRlc3QoaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YodGhpcykuZG9tTWFuaXAoYSxjLGQsITApfSk7aWYoZi5pc0Z1bmN0aW9uKGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGc9Zih0aGlzKTthWzBdPWouY2FsbCh0aGlzLGUsYz9nLmh0bWwoKTpiKSxnLmRvbU1hbmlwKGEsYyxkKX0pO2lmKHRoaXNbMF0pe2k9aiYmai5wYXJlbnROb2RlLGYuc3VwcG9ydC5wYXJlbnROb2RlJiZpJiZpLm5vZGVUeXBlPT09MTEmJmkuY2hpbGROb2Rlcy5sZW5ndGg9PT10aGlzLmxlbmd0aD9lPXtmcmFnbWVudDppfTplPWYuYnVpbGRGcmFnbWVudChhLHRoaXMsayksaD1lLmZyYWdtZW50LGguY2hpbGROb2Rlcy5sZW5ndGg9PT0xP2c9aD1oLmZpcnN0Q2hpbGQ6Zz1oLmZpcnN0Q2hpbGQ7aWYoZyl7Yz1jJiZmLm5vZGVOYW1lKGcsInRyIik7Zm9yKHZhciBsPTAsbT10aGlzLmxlbmd0aCxuPW0tMTtsPG07bCsrKWQuY2FsbChjP2JpKHRoaXNbbF0sZyk6dGhpc1tsXSxlLmNhY2hlYWJsZXx8bT4xJiZsPG4/Zi5jbG9uZShoLCEwLCEwKTpoKX1rLmxlbmd0aCYmZi5lYWNoKGssZnVuY3Rpb24oYSxiKXtiLnNyYz9mLmFqYXgoe3R5cGU6IkdFVCIsZ2xvYmFsOiExLHVybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmYuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYmYsIi8qJDAqLyIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX0pfXJldHVybiB0aGlzfX0pLGYuYnVpbGRGcmFnbWVudD1mdW5jdGlvbihhLGIsZCl7dmFyIGUsZyxoLGksaj1hWzBdO2ImJmJbMF0mJihpPWJbMF0ub3duZXJEb2N1bWVudHx8YlswXSksaS5jcmVhdGVEb2N1bWVudEZyYWdtZW50fHwoaT1jKSxhLmxlbmd0aD09PTEmJnR5cGVvZiBqPT0ic3RyaW5nIiYmai5sZW5ndGg8NTEyJiZpPT09YyYmai5jaGFyQXQoMCk9PT0iPCImJiFiYi50ZXN0KGopJiYoZi5zdXBwb3J0LmNoZWNrQ2xvbmV8fCFiZC50ZXN0KGopKSYmKGYuc3VwcG9ydC5odG1sNUNsb25lfHwhYmMudGVzdChqKSkmJihnPSEwLGg9Zi5mcmFnbWVudHNbal0saCYmaCE9PTEmJihlPWgpKSxlfHwoZT1pLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxmLmNsZWFuKGEsaSxlLGQpKSxnJiYoZi5mcmFnbWVudHNbal09aD9lOjEpO3JldHVybntmcmFnbWVudDplLGNhY2hlYWJsZTpnfX0sZi5mcmFnbWVudHM9e30sZi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMpe3ZhciBkPVtdLGU9ZihjKSxnPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKGcmJmcubm9kZVR5cGU9PT0xMSYmZy5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJmUubGVuZ3RoPT09MSl7ZVtiXSh0aGlzWzBdKTtyZXR1cm4gdGhpc31mb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPShoPjA/dGhpcy5jbG9uZSghMCk6dGhpcykuZ2V0KCk7ZihlW2hdKVtiXShqKSxkPWQuY29uY2F0KGopfXJldHVybiB0aGlzLnB1c2hTdGFjayhkLGEsZS5zZWxlY3Rvcil9fSksZi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGcsaD1mLnN1cHBvcnQuaHRtbDVDbG9uZXx8Zi5pc1hNTERvYyhhKXx8IWJjLnRlc3QoIjwiK2Eubm9kZU5hbWUrIj4iKT9hLmNsb25lTm9kZSghMCk6Ym8oYSk7aWYoKCFmLnN1cHBvcnQubm9DbG9uZUV2ZW50fHwhZi5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSl7YmsoYSxoKSxkPWJsKGEpLGU9YmwoaCk7Zm9yKGc9MDtkW2ddOysrZyllW2ddJiZiayhkW2ddLGVbZ10pfWlmKGIpe2JqKGEsaCk7aWYoYyl7ZD1ibChhKSxlPWJsKGgpO2ZvcihnPTA7ZFtnXTsrK2cpYmooZFtnXSxlW2ddKX19ZD1lPW51bGw7cmV0dXJuIGh9LGNsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBnLGgsaSxqPVtdO2I9Ynx8Yyx0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIiYmKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fGMpO2Zvcih2YXIgaz0wLGw7KGw9YVtrXSkhPW51bGw7aysrKXt0eXBlb2YgbD09Im51bWJlciImJihsKz0iIik7aWYoIWwpY29udGludWU7aWYodHlwZW9mIGw9PSJzdHJpbmciKWlmKCFfLnRlc3QobCkpbD1iLmNyZWF0ZVRleHROb2RlKGwpO2Vsc2V7bD1sLnJlcGxhY2UoWSwiPCQxPjwvJDI+Iik7dmFyIG09KFouZXhlYyhsKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxuPWJnW21dfHxiZy5fZGVmYXVsdCxvPW5bMF0scD1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHE9YmguY2hpbGROb2RlcyxyO2I9PT1jP2JoLmFwcGVuZENoaWxkKHApOlUoYikuYXBwZW5kQ2hpbGQocCkscC5pbm5lckhUTUw9blsxXStsK25bMl07d2hpbGUoby0tKXA9cC5sYXN0Q2hpbGQ7aWYoIWYuc3VwcG9ydC50Ym9keSl7dmFyIHM9JC50ZXN0KGwpLHQ9bT09PSJ0YWJsZSImJiFzP3AuZmlyc3RDaGlsZCYmcC5maXJzdENoaWxkLmNoaWxkTm9kZXM6blsxXT09PSI8dGFibGU+IiYmIXM/cC5jaGlsZE5vZGVzOltdO2ZvcihpPXQubGVuZ3RoLTE7aT49MDstLWkpZi5ub2RlTmFtZSh0W2ldLCJ0Ym9keSIpJiYhdFtpXS5jaGlsZE5vZGVzLmxlbmd0aCYmdFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRbaV0pfSFmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJlgudGVzdChsKSYmcC5pbnNlcnRCZWZvcmUoYi5jcmVhdGVUZXh0Tm9kZShYLmV4ZWMobClbMF0pLHAuZmlyc3RDaGlsZCksbD1wLmNoaWxkTm9kZXMscCYmKHAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKSxxLmxlbmd0aD4wJiYocj1xW3EubGVuZ3RoLTFdLHImJnIucGFyZW50Tm9kZSYmci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKSl9dmFyIHU7aWYoIWYuc3VwcG9ydC5hcHBlbmRDaGVja2VkKWlmKGxbMF0mJnR5cGVvZiAodT1sLmxlbmd0aCk9PSJudW1iZXIiKWZvcihpPTA7aTx1O2krKylibihsW2ldKTtlbHNlIGJuKGwpO2wubm9kZVR5cGU/ai5wdXNoKGwpOmo9Zi5tZXJnZShqLGwpfWlmKGQpe2c9ZnVuY3Rpb24oYSl7cmV0dXJuIWEudHlwZXx8YmUudGVzdChhLnR5cGUpfTtmb3Ioaz0wO2pba107aysrKXtoPWpba107aWYoZSYmZi5ub2RlTmFtZShoLCJzY3JpcHQiKSYmKCFoLnR5cGV8fGJlLnRlc3QoaC50eXBlKSkpZS5wdXNoKGgucGFyZW50Tm9kZT9oLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaCk6aCk7ZWxzZXtpZihoLm5vZGVUeXBlPT09MSl7dmFyIHY9Zi5ncmVwKGguZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGcpO2ouc3BsaWNlLmFwcGx5KGosW2srMSwwXS5jb25jYXQodikpfWQuYXBwZW5kQ2hpbGQoaCl9fX1yZXR1cm4gan0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1mLmNhY2hlLGU9Zi5ldmVudC5zcGVjaWFsLGc9Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87Zm9yKHZhciBoPTAsaTsoaT1hW2hdKSE9bnVsbDtoKyspe2lmKGkubm9kZU5hbWUmJmYubm9EYXRhW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pY29udGludWU7Yz1pW2YuZXhwYW5kb107aWYoYyl7Yj1kW2NdO2lmKGImJmIuZXZlbnRzKXtmb3IodmFyIGogaW4gYi5ldmVudHMpZVtqXT9mLmV2ZW50LnJlbW92ZShpLGopOmYucmVtb3ZlRXZlbnQoaSxqLGIuaGFuZGxlKTtiLmhhbmRsZSYmKGIuaGFuZGxlLmVsZW09bnVsbCl9Zz9kZWxldGUgaVtmLmV4cGFuZG9dOmkucmVtb3ZlQXR0cmlidXRlJiZpLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGRlbGV0ZSBkW2NdfX19fSk7dmFyIGJwPS9hbHBoYVwoW14pXSpcKS9pLGJxPS9vcGFjaXR5PShbXildKikvLGJyPS8oW0EtWl18Xm1zKS9nLGJzPS9eW1wtK10/KD86XGQqXC4pP1xkKyQvaSxidD0vXi0/KD86XGQqXC4pP1xkKyg/IXB4KVteXGRcc10rJC9pLGJ1PS9eKFtcLStdKT0oW1wtKy5cZGVdKykvLGJ2PS9ebWFyZ2luLyxidz17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sYng9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxieSxieixiQTtmLmZuLmNzcz1mdW5jdGlvbihhLGMpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gZCE9PWI/Zi5zdHlsZShhLGMsZCk6Zi5jc3MoYSxjKX0sYSxjLGFyZ3VtZW50cy5sZW5ndGg+MSl9LGYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YnkoYSwib3BhY2l0eSIpO3JldHVybiBjPT09IiI/IjEiOmN9cmV0dXJuIGEuc3R5bGUub3BhY2l0eX19fSxjc3NOdW1iZXI6e2ZpbGxPcGFjaXR5OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7ImZsb2F0IjpmLnN1cHBvcnQuY3NzRmxvYXQ/ImNzc0Zsb2F0Ijoic3R5bGVGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhYSYmYS5ub2RlVHlwZSE9PTMmJmEubm9kZVR5cGUhPT04JiYhIWEuc3R5bGUpe3ZhciBnLGgsaT1mLmNhbWVsQ2FzZShjKSxqPWEuc3R5bGUsaz1mLmNzc0hvb2tzW2ldO2M9Zi5jc3NQcm9wc1tpXXx8aTtpZihkPT09Yil7aWYoayYmImdldCJpbiBrJiYoZz1rLmdldChhLCExLGUpKSE9PWIpcmV0dXJuIGc7cmV0dXJuIGpbY119aD10eXBlb2YgZCxoPT09InN0cmluZyImJihnPWJ1LmV4ZWMoZCkpJiYoZD0rKGdbMV0rMSkqK2dbMl0rcGFyc2VGbG9hdChmLmNzcyhhLGMpKSxoPSJudW1iZXIiKTtpZihkPT1udWxsfHxoPT09Im51bWJlciImJmlzTmFOKGQpKXJldHVybjtoPT09Im51bWJlciImJiFmLmNzc051bWJlcltpXSYmKGQrPSJweCIpO2lmKCFrfHwhKCJzZXQiaW4gayl8fChkPWsuc2V0KGEsZCkpIT09Yil0cnl7altjXT1kfWNhdGNoKGwpe319fSxjc3M6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGc7Yz1mLmNhbWVsQ2FzZShjKSxnPWYuY3NzSG9va3NbY10sYz1mLmNzc1Byb3BzW2NdfHxjLGM9PT0iY3NzRmxvYXQiJiYoYz0iZmxvYXQiKTtpZihnJiYiZ2V0ImluIGcmJihlPWcuZ2V0KGEsITAsZCkpIT09YilyZXR1cm4gZTtpZihieSlyZXR1cm4gYnkoYSxjKX0sc3dhcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9e30sZSxmO2ZvcihmIGluIGIpZFtmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuY2FsbChhKTtmb3IoZiBpbiBiKWEuc3R5bGVbZl09ZFtmXTtyZXR1cm4gZX19KSxmLmN1ckNTUz1mLmNzcyxjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihiej1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxnLGg9YS5zdHlsZTtiPWIucmVwbGFjZShiciwiLSQxIikudG9Mb3dlckNhc2UoKSwoZD1hLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpJiYoZT1kLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKSkmJihjPWUuZ2V0UHJvcGVydHlWYWx1ZShiKSxjPT09IiImJiFmLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYSkmJihjPWYuc3R5bGUoYSxiKSkpLCFmLnN1cHBvcnQucGl4ZWxNYXJnaW4mJmUmJmJ2LnRlc3QoYikmJmJ0LnRlc3QoYykmJihnPWgud2lkdGgsaC53aWR0aD1jLGM9ZS53aWR0aCxoLndpZHRoPWcpO3JldHVybiBjfSksYy5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoYkE9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj1hLmN1cnJlbnRTdHlsZSYmYS5jdXJyZW50U3R5bGVbYl0sZz1hLnN0eWxlO2Y9PW51bGwmJmcmJihlPWdbYl0pJiYoZj1lKSxidC50ZXN0KGYpJiYoYz1nLmxlZnQsZD1hLnJ1bnRpbWVTdHlsZSYmYS5ydW50aW1lU3R5bGUubGVmdCxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxnLmxlZnQ9Yj09PSJmb250U2l6ZSI/IjFlbSI6ZixmPWcucGl4ZWxMZWZ0KyJweCIsZy5sZWZ0PWMsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9ZCkpO3JldHVybiBmPT09IiI/ImF1dG8iOmZ9KSxieT1ienx8YkEsZi5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe2YuY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7aWYoYylyZXR1cm4gYS5vZmZzZXRXaWR0aCE9PTA/YkIoYSxiLGQpOmYuc3dhcChhLGJ3LGZ1bmN0aW9uKCl7cmV0dXJuIGJCKGEsYixkKX0pfSxzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYnMudGVzdChiKT9iKyJweCI6Yn19fSksZi5zdXBwb3J0Lm9wYWNpdHl8fChmLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBicS50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9Zi5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZz1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJmYudHJpbShnLnJlcGxhY2UoYnAsIiIpKT09PSIiKXtjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYoZCYmIWQuZmlsdGVyKXJldHVybn1jLmZpbHRlcj1icC50ZXN0KGcpP2cucmVwbGFjZShicCxlKTpnKyIgIitlfX0pLGYoZnVuY3Rpb24oKXtmLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBmLnN3YXAoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sZnVuY3Rpb24oKXtyZXR1cm4gYj9ieShhLCJtYXJnaW4tcmlnaHQiKTphLnN0eWxlLm1hcmdpblJpZ2h0fSl9fSl9KSxmLmV4cHImJmYuZXhwci5maWx0ZXJzJiYoZi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0V2lkdGgsYz1hLm9mZnNldEhlaWdodDtyZXR1cm4gYj09PTAmJmM9PT0wfHwhZi5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmKGEuc3R5bGUmJmEuc3R5bGUuZGlzcGxheXx8Zi5jc3MoYSwiZGlzcGxheSIpKT09PSJub25lIn0sZi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hZi5leHByLmZpbHRlcnMuaGlkZGVuKGEpfSksZi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXt2YXIgZCxlPXR5cGVvZiBjPT0ic3RyaW5nIj9jLnNwbGl0KCIgIik6W2NdLGY9e307Zm9yKGQ9MDtkPDQ7ZCsrKWZbYStieFtkXStiXT1lW2RdfHxlW2QtMl18fGVbMF07cmV0dXJuIGZ9fX0pO3ZhciBiQz0vJTIwL2csYkQ9L1xbXF0kLyxiRT0vXHI/XG4vZyxiRj0vIy4qJC8sYkc9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZyxiSD0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksYkk9L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxiSj0vXig/OkdFVHxIRUFEKSQvLGJLPS9eXC9cLy8sYkw9L1w/LyxiTT0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxiTj0vXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSxiTz0vXHMrLyxiUD0vKFs/Jl0pXz1bXiZdKi8sYlE9L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLGJSPWYuZm4ubG9hZCxiUz17fSxiVD17fSxiVSxiVixiVz1bIiovIl0rWyIqIl07dHJ5e2JVPWUuaHJlZn1jYXRjaChiWCl7YlU9Yy5jcmVhdGVFbGVtZW50KCJhIiksYlUuaHJlZj0iIixiVT1iVS5ocmVmfWJWPWJRLmV4ZWMoYlUudG9Mb3dlckNhc2UoKSl8fFtdLGYuZm4uZXh0ZW5kKHtsb2FkOmZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYSE9InN0cmluZyImJmJSKXJldHVybiBiUi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciBlPWEuaW5kZXhPZigiICIpO2lmKGU+PTApe3ZhciBnPWEuc2xpY2UoZSxhLmxlbmd0aCk7YT1hLnNsaWNlKDAsZSl9dmFyIGg9IkdFVCI7YyYmKGYuaXNGdW5jdGlvbihjKT8oZD1jLGM9Yik6dHlwZW9mIGM9PSJvYmplY3QiJiYoYz1mLnBhcmFtKGMsZi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLGg9IlBPU1QiKSk7dmFyIGk9dGhpcztmLmFqYXgoe3VybDphLHR5cGU6aCxkYXRhVHlwZToiaHRtbCIsZGF0YTpjLGNvbXBsZXRlOmZ1bmN0aW9uKGEsYixjKXtjPWEucmVzcG9uc2VUZXh0LGEuaXNSZXNvbHZlZCgpJiYoYS5kb25lKGZ1bmN0aW9uKGEpe2M9YX0pLGkuaHRtbChnP2YoIjxkaXY+IikuYXBwZW5kKGMucmVwbGFjZShiTSwiIikpLmZpbmQoZyk6YykpLGQmJmkuZWFjaChkLFtjLGIsYV0pfX0pO3JldHVybiB0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP2YubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8Yk4udGVzdCh0aGlzLm5vZGVOYW1lKXx8YkgudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPWYodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpmLmlzQXJyYXkoYyk/Zi5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYkUsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGJFLCJcclxuIil9fSkuZ2V0KCl9fSksZi5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxmLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtmW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe2YuaXNGdW5jdGlvbihkKSYmKGc9Z3x8ZSxlPWQsZD1iKTtyZXR1cm4gZi5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpnfSl9fSksZi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBmLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP2IkKGEsZi5hamF4U2V0dGluZ3MpOihiPWEsYT1mLmFqYXhTZXR0aW5ncyksYiQoYSxiKTtyZXR1cm4gYX0sYWpheFNldHRpbmdzOnt1cmw6YlUsaXNMb2NhbDpiSS50ZXN0KGJWWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Iixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Yld9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpmLnBhcnNlSlNPTiwidGV4dCB4bWwiOmYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6YlkoYlMpLGFqYXhUcmFuc3BvcnQ6YlkoYlQpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB3KGEsYyxsLG0pe2lmKHMhPT0yKXtzPTIscSYmY2xlYXJUaW1lb3V0KHEpLHA9YixuPW18fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowO3ZhciBvLHIsdSx3PWMseD1sP2NhKGQsdixsKTpiLHksejtpZihhPj0yMDAmJmE8MzAwfHxhPT09MzA0KXtpZihkLmlmTW9kaWZpZWQpe2lmKHk9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKWYubGFzdE1vZGlmaWVkW2tdPXk7aWYoej12LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIikpZi5ldGFnW2tdPXp9aWYoYT09PTMwNCl3PSJub3Rtb2RpZmllZCIsbz0hMDtlbHNlIHRyeXtyPWNiKGQseCksdz0ic3VjY2VzcyIsbz0hMH1jYXRjaChBKXt3PSJwYXJzZXJlcnJvciIsdT1BfX1lbHNle3U9dztpZighd3x8YSl3PSJlcnJvciIsYTwwJiYoYT0wKX12LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0iIisoY3x8dyksbz9oLnJlc29sdmVXaXRoKGUsW3Isdyx2XSk6aC5yZWplY3RXaXRoKGUsW3Ysdyx1XSksdi5zdGF0dXNDb2RlKGopLGo9Yix0JiZnLnRyaWdnZXIoImFqYXgiKyhvPyJTdWNjZXNzIjoiRXJyb3IiKSxbdixkLG8/cjp1XSksaS5maXJlV2l0aChlLFt2LHddKSx0JiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGRdKSwtLWYuYWN0aXZlfHxmLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfX10eXBlb2YgYT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBkPWYuYWpheFNldHVwKHt9LGMpLGU9ZC5jb250ZXh0fHxkLGc9ZSE9PWQmJihlLm5vZGVUeXBlfHxlIGluc3RhbmNlb2YgZik/ZihlKTpmLmV2ZW50LGg9Zi5EZWZlcnJlZCgpLGk9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksaj1kLnN0YXR1c0NvZGV8fHt9LGssbD17fSxtPXt9LG4sbyxwLHEscixzPTAsdCx1LHY9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXMpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPW1bY109bVtjXXx8YSxsW2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBzPT09Mj9uOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHM9PT0yKXtpZighbyl7bz17fTt3aGlsZShjPWJHLmV4ZWMobikpb1tjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1vW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtzfHwoZC5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiLHAmJnAuYWJvcnQoYSksdygwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHYpLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsdi5jb21wbGV0ZT1pLmFkZCx2LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYoczwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt2LnN0YXR1c10sdi50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGQudXJsPSgoYXx8ZC51cmwpKyIiKS5yZXBsYWNlKGJGLCIiKS5yZXBsYWNlKGJLLGJWWzFdKyIvLyIpLGQuZGF0YVR5cGVzPWYudHJpbShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYk8pLGQuY3Jvc3NEb21haW49PW51bGwmJihyPWJRLmV4ZWMoZC51cmwudG9Mb3dlckNhc2UoKSksZC5jcm9zc0RvbWFpbj0hKCFyfHxyWzFdPT1iVlsxXSYmclsyXT09YlZbMl0mJihyWzNdfHwoclsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShiVlszXXx8KGJWWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmdHlwZW9mIGQuZGF0YSE9InN0cmluZyImJihkLmRhdGE9Zi5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLGJaKGJTLGQsYyx2KTtpZihzPT09MilyZXR1cm4hMTt0PWQuZ2xvYmFsLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IWJKLnRlc3QoZC50eXBlKSx0JiZmLmFjdGl2ZSsrPT09MCYmZi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighZC5oYXNDb250ZW50KXtkLmRhdGEmJihkLnVybCs9KGJMLnRlc3QoZC51cmwpPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSxrPWQudXJsO2lmKGQuY2FjaGU9PT0hMSl7dmFyIHg9Zi5ub3coKSx5PWQudXJsLnJlcGxhY2UoYlAsIiQxXz0iK3gpO2QudXJsPXkrKHk9PT1kLnVybD8oYkwudGVzdChkLnVybCk/IiYiOiI/IikrIl89Iit4OiIiKX19KGQuZGF0YSYmZC5oYXNDb250ZW50JiZkLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksZC5pZk1vZGlmaWVkJiYoaz1rfHxkLnVybCxmLmxhc3RNb2RpZmllZFtrXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRba10pLGYuZXRhZ1trXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixmLmV0YWdba10pKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoZC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitiVysiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSk7Zm9yKHUgaW4gZC5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcih1LGQuaGVhZGVyc1t1XSk7aWYoZC5iZWZvcmVTZW5kJiYoZC5iZWZvcmVTZW5kLmNhbGwoZSx2LGQpPT09ITF8fHM9PT0yKSl7di5hYm9ydCgpO3JldHVybiExfWZvcih1IGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbdV0oZFt1XSk7cD1iWihiVCxkLGMsdik7aWYoIXApdygtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt2LnJlYWR5U3RhdGU9MSx0JiZnLnRyaWdnZXIoImFqYXhTZW5kIixbdixkXSksZC5hc3luYyYmZC50aW1lb3V0PjAmJihxPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtzPTEscC5zZW5kKGwsdyl9Y2F0Y2goeil7aWYoczwyKXcoLTEseik7ZWxzZSB0aHJvdyB6fX1yZXR1cm4gdn0scGFyYW06ZnVuY3Rpb24oYSxjKXt2YXIgZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1mLmlzRnVuY3Rpb24oYik/YigpOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2M9PT1iJiYoYz1mLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYoZi5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIWYuaXNQbGFpbk9iamVjdChhKSlmLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGcgaW4gYSliXyhnLGFbZ10sYyxlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShiQywiKyIpfX0pLGYuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBjYz1mLm5vdygpLGNkPS8oXD0pXD8oJnwkKXxcP1w/L2k7Zi5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiBmLmV4cGFuZG8rIl8iK2NjKyt9fSksZi5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihiLGMsZCl7dmFyIGU9dHlwZW9mIGIuZGF0YT09InN0cmluZyImJi9eYXBwbGljYXRpb25cL3hcLXd3d1wtZm9ybVwtdXJsZW5jb2RlZC8udGVzdChiLmNvbnRlbnRUeXBlKTtpZihiLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGIuanNvbnAhPT0hMSYmKGNkLnRlc3QoYi51cmwpfHxlJiZjZC50ZXN0KGIuZGF0YSkpKXt2YXIgZyxoPWIuanNvbnBDYWxsYmFjaz1mLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaT1hW2hdLGo9Yi51cmwsaz1iLmRhdGEsbD0iJDEiK2grIiQyIjtiLmpzb25wIT09ITEmJihqPWoucmVwbGFjZShjZCxsKSxiLnVybD09PWomJihlJiYoaz1rLnJlcGxhY2UoY2QsbCkpLGIuZGF0YT09PWsmJihqKz0oL1w/Ly50ZXN0KGopPyImIjoiPyIpK2IuanNvbnArIj0iK2gpKSksYi51cmw9aixiLmRhdGE9ayxhW2hdPWZ1bmN0aW9uKGEpe2c9W2FdfSxkLmFsd2F5cyhmdW5jdGlvbigpe2FbaF09aSxnJiZmLmlzRnVuY3Rpb24oaSkmJmFbaF0oZ1swXSl9KSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtnfHxmLmVycm9yKGgrIiB3YXMgbm90IGNhbGxlZCIpO3JldHVybiBnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiI7cmV0dXJuInNjcmlwdCJ9fSksZi5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe2YuZ2xvYmFsRXZhbChhKTtyZXR1cm4gYX19fSksZi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2EuY2FjaGU9PT1iJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxmLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGQsZT1jLmhlYWR8fGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8Yy5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZixnKXtkPWMuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksZC5hc3luYz0iYXN5bmMiLGEuc2NyaXB0Q2hhcnNldCYmKGQuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGQuc3JjPWEudXJsLGQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7aWYoY3x8IWQucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChkLnJlYWR5U3RhdGUpKWQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZSYmZC5wYXJlbnROb2RlJiZlLnJlbW92ZUNoaWxkKGQpLGQ9YixjfHxnKDIwMCwic3VjY2VzcyIpfSxlLmluc2VydEJlZm9yZShkLGUuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7ZCYmZC5vbmxvYWQoMCwxKX19fX0pO3ZhciBjZT1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gY2cpY2dbYV0oMCwxKX06ITEsY2Y9MCxjZztmLmFqYXhTZXR0aW5ncy54aHI9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmY2goKXx8Y2koKX06Y2gsZnVuY3Rpb24oYSl7Zi5leHRlbmQoZi5zdXBwb3J0LHthamF4OiEhYSxjb3JzOiEhYSYmIndpdGhDcmVkZW50aWFscyJpbiBhfSl9KGYuYWpheFNldHRpbmdzLnhocigpKSxmLnN1cHBvcnQuYWpheCYmZi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGMpe2lmKCFjLmNyb3NzRG9tYWlufHxmLnN1cHBvcnQuY29ycyl7dmFyIGQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxnKXt2YXIgaD1jLnhocigpLGksajtjLnVzZXJuYW1lP2gub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyxjLnVzZXJuYW1lLGMucGFzc3dvcmQpOmgub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyk7aWYoYy54aHJGaWVsZHMpZm9yKGogaW4gYy54aHJGaWVsZHMpaFtqXT1jLnhockZpZWxkc1tqXTtjLm1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZShjLm1pbWVUeXBlKSwhYy5jcm9zc0RvbWFpbiYmIWVbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKGogaW4gZSloLnNldFJlcXVlc3RIZWFkZXIoaixlW2pdKX1jYXRjaChrKXt9aC5zZW5kKGMuaGFzQ29udGVudCYmYy5kYXRhfHxudWxsKSxkPWZ1bmN0aW9uKGEsZSl7dmFyIGosayxsLG0sbjt0cnl7aWYoZCYmKGV8fGgucmVhZHlTdGF0ZT09PTQpKXtkPWIsaSYmKGgub25yZWFkeXN0YXRlY2hhbmdlPWYubm9vcCxjZSYmZGVsZXRlIGNnW2ldKTtpZihlKWgucmVhZHlTdGF0ZSE9PTQmJmguYWJvcnQoKTtlbHNle2o9aC5zdGF0dXMsbD1oLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLG09e30sbj1oLnJlc3BvbnNlWE1MLG4mJm4uZG9jdW1lbnRFbGVtZW50JiYobS54bWw9bik7dHJ5e20udGV4dD1oLnJlc3BvbnNlVGV4dH1jYXRjaChhKXt9dHJ5e2s9aC5zdGF0dXNUZXh0fWNhdGNoKG8pe2s9IiJ9IWomJmMuaXNMb2NhbCYmIWMuY3Jvc3NEb21haW4/aj1tLnRleHQ/MjAwOjQwNDpqPT09MTIyMyYmKGo9MjA0KX19fWNhdGNoKHApe2V8fGcoLTEscCl9bSYmZyhqLGssbSxsKX0sIWMuYXN5bmN8fGgucmVhZHlTdGF0ZT09PTQ/ZCgpOihpPSsrY2YsY2UmJihjZ3x8KGNnPXt9LGYoYSkudW5sb2FkKGNlKSksY2dbaV09ZCksaC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZCl9LGFib3J0OmZ1bmN0aW9uKCl7ZCYmZCgwLDEpfX19fSk7dmFyIGNqPXt9LGNrLGNsLGNtPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxjbj0vXihbK1wtXT0pPyhbXGQrLlwtXSspKFthLXolXSopJC9pLGNvLGNwPVtbImhlaWdodCIsIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0sWyJ3aWR0aCIsIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Il0sWyJvcGFjaXR5Il1dLGNxO2YuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoY3QoInNob3ciLDMpLGEsYixjKTtmb3IodmFyIGc9MCxoPXRoaXMubGVuZ3RoO2c8aDtnKyspZD10aGlzW2ddLGQuc3R5bGUmJihlPWQuc3R5bGUuZGlzcGxheSwhZi5fZGF0YShkLCJvbGRkaXNwbGF5IikmJmU9PT0ibm9uZSImJihlPWQuc3R5bGUuZGlzcGxheT0iIiksKGU9PT0iIiYmZi5jc3MoZCwiZGlzcGxheSIpPT09Im5vbmUifHwhZi5jb250YWlucyhkLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGQpKSYmZi5fZGF0YShkLCJvbGRkaXNwbGF5IixjdShkLm5vZGVOYW1lKSkpO2ZvcihnPTA7ZzxoO2crKyl7ZD10aGlzW2ddO2lmKGQuc3R5bGUpe2U9ZC5zdHlsZS5kaXNwbGF5O2lmKGU9PT0iInx8ZT09PSJub25lIilkLnN0eWxlLmRpc3BsYXk9Zi5fZGF0YShkLCJvbGRkaXNwbGF5Iil8fCIifX1yZXR1cm4gdGhpc30saGlkZTpmdW5jdGlvbihhLGIsYyl7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdCgiaGlkZSIsMyksYSxiLGMpO3ZhciBkLGUsZz0wLGg9dGhpcy5sZW5ndGg7Zm9yKDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1mLmNzcyhkLCJkaXNwbGF5IiksZSE9PSJub25lIiYmIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGUpKTtmb3IoZz0wO2c8aDtnKyspdGhpc1tnXS5zdHlsZSYmKHRoaXNbZ10uc3R5bGUuZGlzcGxheT0ibm9uZSIpO3JldHVybiB0aGlzfSxfdG9nZ2xlOmYuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dHlwZW9mIGE9PSJib29sZWFuIjtmLmlzRnVuY3Rpb24oYSkmJmYuaXNGdW5jdGlvbihiKT90aGlzLl90b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOmE9PW51bGx8fGQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ZD9hOmYodGhpcykuaXMoIjpoaWRkZW4iKTtmKHRoaXMpW2I/InNob3ciOiJoaWRlIl0oKX0pOnRoaXMuYW5pbWF0ZShjdCgidG9nZ2xlIiwzKSxhLGIsYyk7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXtmdW5jdGlvbiBnKCl7ZS5xdWV1ZT09PSExJiZmLl9tYXJrKHRoaXMpO3ZhciBiPWYuZXh0ZW5kKHt9LGUpLGM9dGhpcy5ub2RlVHlwZT09PTEsZD1jJiZmKHRoaXMpLmlzKCI6aGlkZGVuIiksZyxoLGksaixrLGwsbSxuLG8scCxxO2IuYW5pbWF0ZWRQcm9wZXJ0aWVzPXt9O2ZvcihpIGluIGEpe2c9Zi5jYW1lbENhc2UoaSksaSE9PWcmJihhW2ddPWFbaV0sZGVsZXRlIGFbaV0pO2lmKChrPWYuY3NzSG9va3NbZ10pJiYiZXhwYW5kImluIGspe2w9ay5leHBhbmQoYVtnXSksZGVsZXRlIGFbZ107Zm9yKGkgaW4gbClpIGluIGF8fChhW2ldPWxbaV0pfX1mb3IoZyBpbiBhKXtoPWFbZ10sZi5pc0FycmF5KGgpPyhiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1oWzFdLGg9YVtnXT1oWzBdKTpiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1iLnNwZWNpYWxFYXNpbmcmJmIuc3BlY2lhbEVhc2luZ1tnXXx8Yi5lYXNpbmd8fCJzd2luZyI7aWYoaD09PSJoaWRlIiYmZHx8aD09PSJzaG93IiYmIWQpcmV0dXJuIGIuY29tcGxldGUuY2FsbCh0aGlzKTtjJiYoZz09PSJoZWlnaHQifHxnPT09IndpZHRoIikmJihiLm92ZXJmbG93PVt0aGlzLnN0eWxlLm92ZXJmbG93LHRoaXMuc3R5bGUub3ZlcmZsb3dYLHRoaXMuc3R5bGUub3ZlcmZsb3dZXSxmLmNzcyh0aGlzLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmZi5jc3ModGhpcywiZmxvYXQiKT09PSJub25lIiYmKCFmLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8Y3UodGhpcy5ub2RlTmFtZSk9PT0iaW5saW5lIj90aGlzLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI6dGhpcy5zdHlsZS56b29tPTEpKX1iLm92ZXJmbG93IT1udWxsJiYodGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIik7Zm9yKGkgaW4gYSlqPW5ldyBmLmZ4KHRoaXMsYixpKSxoPWFbaV0sY20udGVzdChoKT8ocT1mLl9kYXRhKHRoaXMsInRvZ2dsZSIraSl8fChoPT09InRvZ2dsZSI/ZD8ic2hvdyI6ImhpZGUiOjApLHE/KGYuX2RhdGEodGhpcywidG9nZ2xlIitpLHE9PT0ic2hvdyI/ImhpZGUiOiJzaG93IiksaltxXSgpKTpqW2hdKCkpOihtPWNuLmV4ZWMoaCksbj1qLmN1cigpLG0/KG89cGFyc2VGbG9hdChtWzJdKSxwPW1bM118fChmLmNzc051bWJlcltpXT8iIjoicHgiKSxwIT09InB4IiYmKGYuc3R5bGUodGhpcyxpLChvfHwxKStwKSxuPShvfHwxKS9qLmN1cigpKm4sZi5zdHlsZSh0aGlzLGksbitwKSksbVsxXSYmKG89KG1bMV09PT0iLT0iPy0xOjEpKm8rbiksai5jdXN0b20obixvLHApKTpqLmN1c3RvbShuLGgsIiIpKTtyZXR1cm4hMH12YXIgZT1mLnNwZWVkKGIsYyxkKTtpZihmLmlzRW1wdHlPYmplY3QoYSkpcmV0dXJuIHRoaXMuZWFjaChlLmNvbXBsZXRlLFshMV0pO2E9Zi5leHRlbmQoe30sYSk7cmV0dXJuIGUucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShlLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYyxkKXt0eXBlb2YgYSE9InN0cmluZyImJihkPWMsYz1hLGE9YiksYyYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGEsYixjKXt2YXIgZT1iW2NdO2YucmVtb3ZlRGF0YShhLGMsITApLGUuc3RvcChkKX12YXIgYixjPSExLGU9Zi50aW1lcnMsZz1mLl9kYXRhKHRoaXMpO2R8fGYuX3VubWFyayghMCx0aGlzKTtpZihhPT1udWxsKWZvcihiIGluIGcpZ1tiXSYmZ1tiXS5zdG9wJiZiLmluZGV4T2YoIi5ydW4iKT09PWIubGVuZ3RoLTQmJmgodGhpcyxnLGIpO2Vsc2UgZ1tiPWErIi5ydW4iXSYmZ1tiXS5zdG9wJiZoKHRoaXMsZyxiKTtmb3IoYj1lLmxlbmd0aDtiLS07KWVbYl0uZWxlbT09PXRoaXMmJihhPT1udWxsfHxlW2JdLnF1ZXVlPT09YSkmJihkP2VbYl0oITApOmVbYl0uc2F2ZVN0YXRlKCksYz0hMCxlLnNwbGljZShiLDEpKTsoIWR8fCFjKSYmZi5kZXF1ZXVlKHRoaXMsYSl9KX19KSxmLmVhY2goe3NsaWRlRG93bjpjdCgic2hvdyIsMSksc2xpZGVVcDpjdCgiaGlkZSIsMSksc2xpZGVUb2dnbGU6Y3QoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksZi5leHRlbmQoe3NwZWVkOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiZ0eXBlb2YgYT09Im9iamVjdCI/Zi5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxmLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIWYuaXNGdW5jdGlvbihiKSYmYn07ZC5kdXJhdGlvbj1mLmZ4Lm9mZj8wOnR5cGVvZiBkLmR1cmF0aW9uPT0ibnVtYmVyIj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gZi5meC5zcGVlZHM/Zi5meC5zcGVlZHNbZC5kdXJhdGlvbl06Zi5meC5zcGVlZHMuX2RlZmF1bHQ7aWYoZC5xdWV1ZT09bnVsbHx8ZC5xdWV1ZT09PSEwKWQucXVldWU9ImZ4IjtkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oYSl7Zi5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlP2YuZGVxdWV1ZSh0aGlzLGQucXVldWUpOmEhPT0hMSYmZi5fdW5tYXJrKHRoaXMpfTtyZXR1cm4gZH0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LHN3aW5nOmZ1bmN0aW9uKGEpe3JldHVybi1NYXRoLmNvcyhhKk1hdGguUEkpLzIrLjV9fSx0aW1lcnM6W10sZng6ZnVuY3Rpb24oYSxiLGMpe3RoaXMub3B0aW9ucz1iLHRoaXMuZWxlbT1hLHRoaXMucHJvcD1jLGIub3JpZz1iLm9yaWd8fHt9fX0pLGYuZngucHJvdG90eXBlPXt1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksKGYuZnguc3RlcFt0aGlzLnByb3BdfHxmLmZ4LnN0ZXAuX2RlZmF1bHQpKHRoaXMpfSxjdXI6ZnVuY3Rpb24oKXtpZih0aGlzLmVsZW1bdGhpcy5wcm9wXSE9bnVsbCYmKCF0aGlzLmVsZW0uc3R5bGV8fHRoaXMuZWxlbS5zdHlsZVt0aGlzLnByb3BdPT1udWxsKSlyZXR1cm4gdGhpcy5lbGVtW3RoaXMucHJvcF07dmFyIGEsYj1mLmNzcyh0aGlzLmVsZW0sdGhpcy5wcm9wKTtyZXR1cm4gaXNOYU4oYT1wYXJzZUZsb2F0KGIpKT8hYnx8Yj09PSJhdXRvIj8wOmI6YX0sY3VzdG9tOmZ1bmN0aW9uKGEsYyxkKXtmdW5jdGlvbiBoKGEpe3JldHVybiBlLnN0ZXAoYSl9dmFyIGU9dGhpcyxnPWYuZng7dGhpcy5zdGFydFRpbWU9Y3F8fGNyKCksdGhpcy5lbmQ9Yyx0aGlzLm5vdz10aGlzLnN0YXJ0PWEsdGhpcy5wb3M9dGhpcy5zdGF0ZT0wLHRoaXMudW5pdD1kfHx0aGlzLnVuaXR8fChmLmNzc051bWJlclt0aGlzLnByb3BdPyIiOiJweCIpLGgucXVldWU9dGhpcy5vcHRpb25zLnF1ZXVlLGguZWxlbT10aGlzLmVsZW0saC5zYXZlU3RhdGU9ZnVuY3Rpb24oKXtmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3ApPT09YiYmKGUub3B0aW9ucy5oaWRlP2YuX2RhdGEoZS5lbGVtLCJmeHNob3ciK2UucHJvcCxlLnN0YXJ0KTplLm9wdGlvbnMuc2hvdyYmZi5fZGF0YShlLmVsZW0sImZ4c2hvdyIrZS5wcm9wLGUuZW5kKSl9LGgoKSYmZi50aW1lcnMucHVzaChoKSYmIWNvJiYoY289c2V0SW50ZXJ2YWwoZy50aWNrLGcuaW50ZXJ2YWwpKX0sc2hvdzpmdW5jdGlvbigpe3ZhciBhPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCk7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1hfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5zaG93PSEwLGEhPT1iP3RoaXMuY3VzdG9tKHRoaXMuY3VyKCksYSk6dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpLGYodGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCl8fGYuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCksdGhpcy5vcHRpb25zLmhpZGU9ITAsdGhpcy5jdXN0b20odGhpcy5jdXIoKSwwKX0sc3RlcDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT1jcXx8Y3IoKSxnPSEwLGg9dGhpcy5lbGVtLGk9dGhpcy5vcHRpb25zO2lmKGF8fGU+PWkuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kLHRoaXMucG9zPXRoaXMuc3RhdGU9MSx0aGlzLnVwZGF0ZSgpLGkuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF09ITA7Zm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpaS5hbmltYXRlZFByb3BlcnRpZXNbYl0hPT0hMCYmKGc9ITEpO2lmKGcpe2kub3ZlcmZsb3chPW51bGwmJiFmLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyYmZi5lYWNoKFsiIiwiWCIsIlkiXSxmdW5jdGlvbihhLGIpe2guc3R5bGVbIm92ZXJmbG93IitiXT1pLm92ZXJmbG93W2FdfSksaS5oaWRlJiZmKGgpLmhpZGUoKTtpZihpLmhpZGV8fGkuc2hvdylmb3IoYiBpbiBpLmFuaW1hdGVkUHJvcGVydGllcylmLnN0eWxlKGgsYixpLm9yaWdbYl0pLGYucmVtb3ZlRGF0YShoLCJmeHNob3ciK2IsITApLGYucmVtb3ZlRGF0YShoLCJ0b2dnbGUiK2IsITApO2Q9aS5jb21wbGV0ZSxkJiYoaS5jb21wbGV0ZT0hMSxkLmNhbGwoaCkpfXJldHVybiExfWkuZHVyYXRpb249PUluZmluaXR5P3RoaXMubm93PWU6KGM9ZS10aGlzLnN0YXJ0VGltZSx0aGlzLnN0YXRlPWMvaS5kdXJhdGlvbix0aGlzLnBvcz1mLmVhc2luZ1tpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdXSh0aGlzLnN0YXRlLGMsMCwxLGkuZHVyYXRpb24pLHRoaXMubm93PXRoaXMuc3RhcnQrKHRoaXMuZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zKSx0aGlzLnVwZGF0ZSgpO3JldHVybiEwfX0sZi5leHRlbmQoZi5meCx7dGljazpmdW5jdGlvbigpe3ZhciBhLGI9Zi50aW1lcnMsYz0wO2Zvcig7YzxiLmxlbmd0aDtjKyspYT1iW2NdLCFhKCkmJmJbY109PT1hJiZiLnNwbGljZShjLS0sMSk7Yi5sZW5ndGh8fGYuZnguc3RvcCgpfSxpbnRlcnZhbDoxMyxzdG9wOmZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjbyksY289bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7YS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbD9hLmVsZW0uc3R5bGVbYS5wcm9wXT1hLm5vdythLnVuaXQ6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0pLGYuZWFjaChjcC5jb25jYXQuYXBwbHkoW10sY3ApLGZ1bmN0aW9uKGEsYil7Yi5pbmRleE9mKCJtYXJnaW4iKSYmKGYuZnguc3RlcFtiXT1mdW5jdGlvbihhKXtmLnN0eWxlKGEuZWxlbSxiLE1hdGgubWF4KDAsYS5ub3cpK2EudW5pdCl9KX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGN2LGN3PS9edCg/OmFibGV8ZHxoKSQvaSxjeD0vXig/OmJvZHl8aHRtbCkkL2k7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBjLmRvY3VtZW50RWxlbWVudD9jdj1mdW5jdGlvbihhLGIsYyxkKXt0cnl7ZD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWNhdGNoKGUpe31pZighZHx8IWYuY29udGFpbnMoYyxhKSlyZXR1cm4gZD97dG9wOmQudG9wLGxlZnQ6ZC5sZWZ0fTp7dG9wOjAsbGVmdDowfTt2YXIgZz1iLmJvZHksaD1jeShiKSxpPWMuY2xpZW50VG9wfHxnLmNsaWVudFRvcHx8MCxqPWMuY2xpZW50TGVmdHx8Zy5jbGllbnRMZWZ0fHwwLGs9aC5wYWdlWU9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZjLnNjcm9sbFRvcHx8Zy5zY3JvbGxUb3AsbD1oLnBhZ2VYT2Zmc2V0fHxmLnN1cHBvcnQuYm94TW9kZWwmJmMuc2Nyb2xsTGVmdHx8Zy5zY3JvbGxMZWZ0LG09ZC50b3Aray1pLG49ZC5sZWZ0K2wtajtyZXR1cm57dG9wOm0sbGVmdDpufX06Y3Y9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9YS5vZmZzZXRQYXJlbnQsZz1hLGg9Yi5ib2R5LGk9Yi5kZWZhdWx0VmlldyxqPWk/aS5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCk6YS5jdXJyZW50U3R5bGUsaz1hLm9mZnNldFRvcCxsPWEub2Zmc2V0TGVmdDt3aGlsZSgoYT1hLnBhcmVudE5vZGUpJiZhIT09aCYmYSE9PWMpe2lmKGYuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZqLnBvc2l0aW9uPT09ImZpeGVkIilicmVhaztkPWk/aS5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCk6YS5jdXJyZW50U3R5bGUsay09YS5zY3JvbGxUb3AsbC09YS5zY3JvbGxMZWZ0LGE9PT1lJiYoays9YS5vZmZzZXRUb3AsbCs9YS5vZmZzZXRMZWZ0LGYuc3VwcG9ydC5kb2VzTm90QWRkQm9yZGVyJiYoIWYuc3VwcG9ydC5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxsc3x8IWN3LnRlc3QoYS5ub2RlTmFtZSkpJiYoays9cGFyc2VGbG9hdChkLmJvcmRlclRvcFdpZHRoKXx8MCxsKz1wYXJzZUZsb2F0KGQuYm9yZGVyTGVmdFdpZHRoKXx8MCksZz1lLGU9YS5vZmZzZXRQYXJlbnQpLGYuc3VwcG9ydC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUmJmQub3ZlcmZsb3chPT0idmlzaWJsZSImJihrKz1wYXJzZUZsb2F0KGQuYm9yZGVyVG9wV2lkdGgpfHwwLGwrPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwKSxqPWR9aWYoai5wb3NpdGlvbj09PSJyZWxhdGl2ZSJ8fGoucG9zaXRpb249PT0ic3RhdGljIilrKz1oLm9mZnNldFRvcCxsKz1oLm9mZnNldExlZnQ7Zi5zdXBwb3J0LmZpeGVkUG9zaXRpb24mJmoucG9zaXRpb249PT0iZml4ZWQiJiYoays9TWF0aC5tYXgoYy5zY3JvbGxUb3AsaC5zY3JvbGxUb3ApLGwrPU1hdGgubWF4KGMuc2Nyb2xsTGVmdCxoLnNjcm9sbExlZnQpKTtyZXR1cm57dG9wOmssbGVmdDpsfX0sZi5mbi5vZmZzZXQ9ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYT09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oYil7Zi5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsYSxiKX0pO3ZhciBjPXRoaXNbMF0sZD1jJiZjLm93bmVyRG9jdW1lbnQ7aWYoIWQpcmV0dXJuIG51bGw7aWYoYz09PWQuYm9keSlyZXR1cm4gZi5vZmZzZXQuYm9keU9mZnNldChjKTtyZXR1cm4gY3YoYyxkLGQuZG9jdW1lbnRFbGVtZW50KX0sZi5vZmZzZXQ9e2JvZHlPZmZzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRUb3AsYz1hLm9mZnNldExlZnQ7Zi5zdXBwb3J0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0JiYoYis9cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDAsYys9cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5MZWZ0IikpfHwwKTtyZXR1cm57dG9wOmIsbGVmdDpjfX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mLmNzcyhhLCJwb3NpdGlvbiIpO2Q9PT0ic3RhdGljIiYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIik7dmFyIGU9ZihhKSxnPWUub2Zmc2V0KCksaD1mLmNzcyhhLCJ0b3AiKSxpPWYuY3NzKGEsImxlZnQiKSxqPShkPT09ImFic29sdXRlInx8ZD09PSJmaXhlZCIpJiZmLmluQXJyYXkoImF1dG8iLFtoLGldKT4tMSxrPXt9LGw9e30sbSxuO2o/KGw9ZS5wb3NpdGlvbigpLG09bC50b3Asbj1sLmxlZnQpOihtPXBhcnNlRmxvYXQoaCl8fDAsbj1wYXJzZUZsb2F0KGkpfHwwKSxmLmlzRnVuY3Rpb24oYikmJihiPWIuY2FsbChhLGMsZykpLGIudG9wIT1udWxsJiYoay50b3A9Yi50b3AtZy50b3ArbSksYi5sZWZ0IT1udWxsJiYoay5sZWZ0PWIubGVmdC1nLmxlZnQrbiksInVzaW5nImluIGI/Yi51c2luZy5jYWxsKGEsayk6ZS5jc3Moayl9fSxmLmZuLmV4dGVuZCh7cG9zaXRpb246ZnVuY3Rpb24oKXtpZighdGhpc1swXSlyZXR1cm4gbnVsbDt2YXIgYT10aGlzWzBdLGI9dGhpcy5vZmZzZXRQYXJlbnQoKSxjPXRoaXMub2Zmc2V0KCksZD1jeC50ZXN0KGJbMF0ubm9kZU5hbWUpP3t0b3A6MCxsZWZ0OjB9OmIub2Zmc2V0KCk7Yy50b3AtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMubGVmdC09cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5MZWZ0IikpfHwwLGQudG9wKz1wYXJzZUZsb2F0KGYuY3NzKGJbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLGQubGVmdCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJMZWZ0V2lkdGgiKSl8fDA7cmV0dXJue3RvcDpjLnRvcC1kLnRvcCxsZWZ0OmMubGVmdC1kLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8Yy5ib2R5O3doaWxlKGEmJiFjeC50ZXN0KGEubm9kZU5hbWUpJiZmLmNzcyhhLCJwb3NpdGlvbiIpPT09InN0YXRpYyIpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYX0pfX0pLGYuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGMpe3ZhciBkPS9ZLy50ZXN0KGMpO2YuZm5bYV09ZnVuY3Rpb24oZSl7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSxlLGcpe3ZhciBoPWN5KGEpO2lmKGc9PT1iKXJldHVybiBoP2MgaW4gaD9oW2NdOmYuc3VwcG9ydC5ib3hNb2RlbCYmaC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZV18fGguZG9jdW1lbnQuYm9keVtlXTphW2VdO2g/aC5zY3JvbGxUbyhkP2YoaCkuc2Nyb2xsTGVmdCgpOmcsZD9nOmYoaCkuc2Nyb2xsVG9wKCkpOmFbZV09Z30sYSxlLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksZi5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxjKXt2YXIgZD0iY2xpZW50IithLGU9InNjcm9sbCIrYSxnPSJvZmZzZXQiK2E7Zi5mblsiaW5uZXIiK2FdPWZ1bmN0aW9uKCl7dmFyIGE9dGhpc1swXTtyZXR1cm4gYT9hLnN0eWxlP3BhcnNlRmxvYXQoZi5jc3MoYSxjLCJwYWRkaW5nIikpOnRoaXNbY10oKTpudWxsfSxmLmZuWyJvdXRlciIrYV09ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXTtyZXR1cm4gYj9iLnN0eWxlP3BhcnNlRmxvYXQoZi5jc3MoYixjLGE/Im1hcmdpbiI6ImJvcmRlciIpKTp0aGlzW2NdKCk6bnVsbH0sZi5mbltjXT1mdW5jdGlvbihhKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhLGMsaCl7dmFyIGksaixrLGw7aWYoZi5pc1dpbmRvdyhhKSl7aT1hLmRvY3VtZW50LGo9aS5kb2N1bWVudEVsZW1lbnRbZF07cmV0dXJuIGYuc3VwcG9ydC5ib3hNb2RlbCYmanx8aS5ib2R5JiZpLmJvZHlbZF18fGp9aWYoYS5ub2RlVHlwZT09PTkpe2k9YS5kb2N1bWVudEVsZW1lbnQ7aWYoaVtkXT49aVtlXSlyZXR1cm4gaVtkXTtyZXR1cm4gTWF0aC5tYXgoYS5ib2R5W2VdLGlbZV0sYS5ib2R5W2ddLGlbZ10pfWlmKGg9PT1iKXtrPWYuY3NzKGEsYyksbD1wYXJzZUZsb2F0KGspO3JldHVybiBmLmlzTnVtZXJpYyhsKT9sOmt9ZihhKS5jc3MoYyxoKX0sYyxhLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksYS5qUXVlcnk9YS4kPWYsdHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCYmZGVmaW5lLmFtZC5qUXVlcnkmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBmfSl9KSh3aW5kb3cpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2xpYi9uYXR1cmFsU29ydC5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9saWIvbmF0dXJhbFNvcnQuanMKaW5kZXggYTE0ZTE2My4uNmYwNTJlOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL2xpYi9uYXR1cmFsU29ydC5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvanMvbGliL25hdHVyYWxTb3J0LmpzCkBAIC0xLDgyICsxLDgyIEBACi0vKg0KLW5hdHVyYWxTb3J0LmpzDQotLSBieSBKaW0gUGFsbWVyIGFuZCBvdGhlciBjb250cmlidXRvcnMNCi0NCi1UaGUgTUlUIExpY2Vuc2UgKE1JVCkNCi0NCi1Db3B5cmlnaHQgKGMpIDIwMTEgSmltIFBhbG1lciBhbmQgb3RoZXIgY29udHJpYnV0b3JzDQotDQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0KLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsDQotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMNCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbA0KLWNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQotDQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQ0KLVNPRlRXQVJFLg0KLSovDQotDQotLy8gICAgbmF0dXJhbFNvcnQuanMgMC43LjANCi0vLyAgICBodHRwczovL2dpdGh1Yi5jb20vamFyaW51ZG9tL25hdHVyYWxTb3J0LmpzDQotLy8gICAgKGMpIDIwMTEgSmltIFBhbG1lciBhbmQgb3RoZXIgY29udHJpYnV0b3JzDQotLy8gICAgbmF0dXJhbFNvcnQuanMgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuDQotLy8gICAgR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMQ0KLShmdW5jdGlvbigpIHsNCi0gIHdpbmRvdy5uYXR1cmFsU29ydCA9IGZ1bmN0aW9uKGEsIGIpIHsNCi0gICAgdmFyIGNMb2MsIGRyZSwgaHJlLCBpLCBudW1TLCBvRnhOY0wsIG9GeU5jTCwgb3JlLCByZSwgc3JlLCB4LCB4RCwgeE4sIHksIHlELCB5TjsNCi0gICAgcmUgPSAvKF4oWytcLV0/KD86MHxbMS05XVxkKikoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/KT8kfF4weFswLTlhLWZdKyR8XGQrKS9nOw0KLSAgICBzcmUgPSAvKF5bIF0qfFsgXSokKS9nOw0KLSAgICBkcmUgPSAvKF4oW1x3IF0rLD9bXHcgXSspP1tcdyBdKyw/W1x3IF0rXGQrOlxkKyg6XGQrKT9bXHcgXT98XlxkezEsNH1bXC9cLV1cZHsxLDR9W1wvXC1dXGR7MSw0fXxeXHcrLCBcdysgXGQrLCBcZHs0fSkvOw0KLSAgICBocmUgPSAvXjB4WzAtOWEtZl0rJC9pOw0KLSAgICBvcmUgPSAvXjAvOw0KLSAgICBpID0gZnVuY3Rpb24ocykgew0KLSAgICAgIHJldHVybiBuYXR1cmFsU29ydC5pbnNlbnNpdGl2ZSAmJiAoJycgKyBzKS50b0xvd2VyQ2FzZSgpIHx8ICcnICsgczsNCi0gICAgfTsNCi0gICAgeCA9IGkoYSkucmVwbGFjZShzcmUsICcnKSB8fCAnJzsNCi0gICAgeSA9IGkoYikucmVwbGFjZShzcmUsICcnKSB8fCAnJzsNCi0gICAgeE4gPSB4LnJlcGxhY2UocmUsICdcdTAwMDAkMVx1MDAwMCcpLnJlcGxhY2UoL1wwJC8sICcnKS5yZXBsYWNlKC9eXDAvLCAnJykuc3BsaXQoJ1x1MDAwMCcpOw0KLSAgICB5TiA9IHkucmVwbGFjZShyZSwgJ1x1MDAwMCQxXHUwMDAwJykucmVwbGFjZSgvXDAkLywgJycpLnJlcGxhY2UoL15cMC8sICcnKS5zcGxpdCgnXHUwMDAwJyk7DQotICAgIHhEID0gcGFyc2VJbnQoeC5tYXRjaChocmUpLCAxNikgfHwgKHhOLmxlbmd0aCAhPT0gMSAmJiB4Lm1hdGNoKGRyZSkgJiYgRGF0ZS5wYXJzZSh4KSk7DQotICAgIHlEID0gcGFyc2VJbnQoeS5tYXRjaChocmUpLCAxNikgfHwgeEQgJiYgeS5tYXRjaChkcmUpICYmIERhdGUucGFyc2UoeSkgfHwgbnVsbDsNCi0gICAgb0Z4TmNMID0gdm9pZCAwOw0KLSAgICBvRnlOY0wgPSB2b2lkIDA7DQotICAgIGlmICh5RCkgew0KLSAgICAgIGlmICh4RCA8IHlEKSB7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgICAgfQ0KLSAgICAgIGlmICh4RCA+IHlEKSB7DQotICAgICAgICByZXR1cm4gMTsNCi0gICAgICB9DQotICAgIH0NCi0gICAgY0xvYyA9IDA7DQotICAgIG51bVMgPSBNYXRoLm1heCh4Ti5sZW5ndGgsIHlOLmxlbmd0aCk7DQotICAgIHdoaWxlIChjTG9jIDwgbnVtUykgew0KLSAgICAgIG9GeE5jTCA9ICEoeE5bY0xvY10gfHwgJycpLm1hdGNoKG9yZSkgJiYgcGFyc2VGbG9hdCh4TltjTG9jXSkgfHwgeE5bY0xvY10gfHwgMDsNCi0gICAgICBvRnlOY0wgPSAhKHlOW2NMb2NdIHx8ICcnKS5tYXRjaChvcmUpICYmIHBhcnNlRmxvYXQoeU5bY0xvY10pIHx8IHlOW2NMb2NdIHx8IDA7DQotICAgICAgaWYgKGlzTmFOKG9GeE5jTCkgIT09IGlzTmFOKG9GeU5jTCkpIHsNCi0gICAgICAgIHJldHVybiAoaXNOYU4ob0Z4TmNMKSA/IDEgOiAtMSk7DQotICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb0Z4TmNMICE9PSB0eXBlb2Ygb0Z5TmNMKSB7DQotICAgICAgICBvRnhOY0wgKz0gJyc7DQotICAgICAgICBvRnlOY0wgKz0gJyc7DQotICAgICAgfQ0KLSAgICAgIGlmIChvRnhOY0wgPCBvRnlOY0wpIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgICB9DQotICAgICAgaWYgKG9GeE5jTCA+IG9GeU5jTCkgew0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgICAgfQ0KLSAgICAgIGNMb2MrKzsNCi0gICAgfQ0KLSAgICByZXR1cm4gMDsNCi0gIH07DQotDQotfSkuY2FsbCh0aGlzKTsNCisvKgorbmF0dXJhbFNvcnQuanMKKy0gYnkgSmltIFBhbG1lciBhbmQgb3RoZXIgY29udHJpYnV0b3JzCisKK1RoZSBNSVQgTGljZW5zZSAoTUlUKQorCitDb3B5cmlnaHQgKGMpIDIwMTEgSmltIFBhbG1lciBhbmQgb3RoZXIgY29udHJpYnV0b3JzCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKK1NPRlRXQVJFLgorKi8KKworLy8gICAgbmF0dXJhbFNvcnQuanMgMC43LjAKKy8vICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXJpbnVkb20vbmF0dXJhbFNvcnQuanMKKy8vICAgIChjKSAyMDExIEppbSBQYWxtZXIgYW5kIG90aGVyIGNvbnRyaWJ1dG9ycworLy8gICAgbmF0dXJhbFNvcnQuanMgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCisvLyAgICBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xCisoZnVuY3Rpb24oKSB7CisgIHdpbmRvdy5uYXR1cmFsU29ydCA9IGZ1bmN0aW9uKGEsIGIpIHsKKyAgICB2YXIgY0xvYywgZHJlLCBocmUsIGksIG51bVMsIG9GeE5jTCwgb0Z5TmNMLCBvcmUsIHJlLCBzcmUsIHgsIHhELCB4TiwgeSwgeUQsIHlOOworICAgIHJlID0gLyheKFsrXC1dPyg/OjB8WzEtOV1cZCopKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPyk/JHxeMHhbMC05YS1mXSskfFxkKykvZzsKKyAgICBzcmUgPSAvKF5bIF0qfFsgXSokKS9nOworICAgIGRyZSA9IC8oXihbXHcgXSssP1tcdyBdKyk/W1x3IF0rLD9bXHcgXStcZCs6XGQrKDpcZCspP1tcdyBdP3xeXGR7MSw0fVtcL1wtXVxkezEsNH1bXC9cLV1cZHsxLDR9fF5cdyssIFx3KyBcZCssIFxkezR9KS87CisgICAgaHJlID0gL14weFswLTlhLWZdKyQvaTsKKyAgICBvcmUgPSAvXjAvOworICAgIGkgPSBmdW5jdGlvbihzKSB7CisgICAgICByZXR1cm4gbmF0dXJhbFNvcnQuaW5zZW5zaXRpdmUgJiYgKCcnICsgcykudG9Mb3dlckNhc2UoKSB8fCAnJyArIHM7CisgICAgfTsKKyAgICB4ID0gaShhKS5yZXBsYWNlKHNyZSwgJycpIHx8ICcnOworICAgIHkgPSBpKGIpLnJlcGxhY2Uoc3JlLCAnJykgfHwgJyc7CisgICAgeE4gPSB4LnJlcGxhY2UocmUsICdcdTAwMDAkMVx1MDAwMCcpLnJlcGxhY2UoL1wwJC8sICcnKS5yZXBsYWNlKC9eXDAvLCAnJykuc3BsaXQoJ1x1MDAwMCcpOworICAgIHlOID0geS5yZXBsYWNlKHJlLCAnXHUwMDAwJDFcdTAwMDAnKS5yZXBsYWNlKC9cMCQvLCAnJykucmVwbGFjZSgvXlwwLywgJycpLnNwbGl0KCdcdTAwMDAnKTsKKyAgICB4RCA9IHBhcnNlSW50KHgubWF0Y2goaHJlKSwgMTYpIHx8ICh4Ti5sZW5ndGggIT09IDEgJiYgeC5tYXRjaChkcmUpICYmIERhdGUucGFyc2UoeCkpOworICAgIHlEID0gcGFyc2VJbnQoeS5tYXRjaChocmUpLCAxNikgfHwgeEQgJiYgeS5tYXRjaChkcmUpICYmIERhdGUucGFyc2UoeSkgfHwgbnVsbDsKKyAgICBvRnhOY0wgPSB2b2lkIDA7CisgICAgb0Z5TmNMID0gdm9pZCAwOworICAgIGlmICh5RCkgeworICAgICAgaWYgKHhEIDwgeUQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKHhEID4geUQpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIGNMb2MgPSAwOworICAgIG51bVMgPSBNYXRoLm1heCh4Ti5sZW5ndGgsIHlOLmxlbmd0aCk7CisgICAgd2hpbGUgKGNMb2MgPCBudW1TKSB7CisgICAgICBvRnhOY0wgPSAhKHhOW2NMb2NdIHx8ICcnKS5tYXRjaChvcmUpICYmIHBhcnNlRmxvYXQoeE5bY0xvY10pIHx8IHhOW2NMb2NdIHx8IDA7CisgICAgICBvRnlOY0wgPSAhKHlOW2NMb2NdIHx8ICcnKS5tYXRjaChvcmUpICYmIHBhcnNlRmxvYXQoeU5bY0xvY10pIHx8IHlOW2NMb2NdIHx8IDA7CisgICAgICBpZiAoaXNOYU4ob0Z4TmNMKSAhPT0gaXNOYU4ob0Z5TmNMKSkgeworICAgICAgICByZXR1cm4gKGlzTmFOKG9GeE5jTCkgPyAxIDogLTEpOworICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb0Z4TmNMICE9PSB0eXBlb2Ygb0Z5TmNMKSB7CisgICAgICAgIG9GeE5jTCArPSAnJzsKKyAgICAgICAgb0Z5TmNMICs9ICcnOworICAgICAgfQorICAgICAgaWYgKG9GeE5jTCA8IG9GeU5jTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAob0Z4TmNMID4gb0Z5TmNMKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgY0xvYysrOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfTsKKworfSkuY2FsbCh0aGlzKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9qcy9zY3JpcHRzL3NlZ21lbnRzLmpzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL3NjcmlwdHMvc2VnbWVudHMuanMKaW5kZXggMjkzNjUxZC4uNjkxOWE5MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL3NjcmlwdHMvc2VnbWVudHMuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2pzL3NjcmlwdHMvc2VnbWVudHMuanMKQEAgLTEsMjA2ICsxLDIwNiBAQAotLyoNCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLQ0KLQ0KLXZhciBnZXRfdG9vbHRpcCA9IGZ1bmN0aW9uKCBzZWdtZW50X3Jlc3BvbnNlICkgew0KLSAgICB2YXIgdG9vbHRpcCA9DQotICAgICAgICAnPGRpdj5TZWdtZW50IDxiPicgKyBzZWdtZW50X3Jlc3BvbnNlLm5hbWUgKyAnPC9iPjo8L2Rpdj4nICsNCi0gICAgICAgICc8ZGl2IGNsYXNzPSJsYWJlbCI+I2RvY3M6PC9kaXY+PGRpdj4nICsgbnVtYmVyX2Zvcm1hdChzZWdtZW50X3Jlc3BvbnNlLnNpemUpICsnPC9kaXY+JyArDQotICAgICAgICAnPGRpdiBjbGFzcz0ibGFiZWwiPiNkZWxzOjwvZGl2PjxkaXY+JyArIG51bWJlcl9mb3JtYXQoc2VnbWVudF9yZXNwb25zZS5kZWxDb3VudCkgKyAnPC9kaXY+JyArDQotICAgICAgICAnPGRpdiBjbGFzcz0ibGFiZWwiPnNpemU6PC9kaXY+PGRpdj4nICsgbnVtYmVyX2Zvcm1hdChzZWdtZW50X3Jlc3BvbnNlLnNpemVJbkJ5dGVzKSArICcgYnl0ZXMgPC9kaXY+JyArDQotICAgICAgICAnPGRpdiBjbGFzcz0ibGFiZWwiPmFnZTo8L2Rpdj48ZGl2PicgKyBzZWdtZW50X3Jlc3BvbnNlLmFnZSArICc8L2Rpdj4nICsNCi0gICAgICAgICc8ZGl2IGNsYXNzPSJsYWJlbCI+c291cmNlOjwvZGl2PjxkaXY+JyArIHNlZ21lbnRfcmVzcG9uc2Uuc291cmNlICsgJzwvZGl2Pic7DQotICAgIHJldHVybiB0b29sdGlwOw0KLX07DQotDQotdmFyIGdldF9lbnRyeSA9IGZ1bmN0aW9uKCBzZWdtZW50X3Jlc3BvbnNlLCBzZWdtZW50X2J5dGVzX21heCApIHsNCi0gICAgLy9jYWxjdWFsdGUgZGltZW5zaW9ucyBvZiBncmFwaA0KLSAgICB2YXIgZGltcyA9IGNhbGN1bGF0ZV9kaW1lbnNpb25zKHNlZ21lbnRfcmVzcG9uc2Uuc2l6ZUluQnl0ZXMsIA0KLSAgICAgICAgICAgIHNlZ21lbnRfYnl0ZXNfbWF4LCBzZWdtZW50X3Jlc3BvbnNlLnNpemUsIHNlZ21lbnRfcmVzcG9uc2UuZGVsQ291bnQpDQotICAgIC8vY3JlYXRlIGVudHJ5IGZvciBzZWdtZW50IHdpdGggZ2l2ZW4gZGltZW5zaW9ucw0KLSAgICB2YXIgZW50cnkgPSBnZXRfZW50cnlfaXRlbShzZWdtZW50X3Jlc3BvbnNlLm5hbWUsIGRpbXMsIA0KLSAgICAgICAgICAgIGdldF90b29sdGlwKHNlZ21lbnRfcmVzcG9uc2UpLCAoc2VnbWVudF9yZXNwb25zZS5tZXJnZUNhbmRpZGF0ZSk/dHJ1ZTpmYWxzZSk7DQotDQotICAgIHJldHVybiBlbnRyeTsNCi19Ow0KLQ0KLXZhciBnZXRfZW50cnlfaXRlbSA9IGZ1bmN0aW9uKG5hbWUsIGRpbXMsIHRvb2x0aXAsIGlzTWVyZ2VDYW5kaWRhdGUpIHsNCi0gICAgdmFyIGVudHJ5ID0gJzxsaT4nICsgIlxuIiArDQotICAgICcgIDxkbCBjbGFzcz0iY2xlYXJmaXgiIHN0eWxlPSJ3aWR0aDogJyArIGRpbXNbJ3NpemUnXSArICclOyI+JyArICJcbiIgKw0KLSAgICAnICAgIDxkdD48ZGl2PicgKyBuYW1lICsgJzwvZGl2PjwvZHQ+JyArICJcbiIgKw0KLSAgICAnICAgIDxkZD4nOw0KLSAgICBlbnRyeSArPSAnPGRpdiBjbGFzcz0ibGl2ZScgKyAoKGlzTWVyZ2VDYW5kaWRhdGUpPycgbWVyZ2UtY2FuZGlkYXRlJzonJykgKyANCi0gICAgICAgICAnIiBzdHlsZT0id2lkdGg6ICcgKyBkaW1zWydhbGl2ZV9kb2Nfc2l6ZSddICsgJyU7Ij4mbmJzcDs8L2Rpdj4nOw0KLSAgICBlbnRyeSArPSAnPGRpdiBjbGFzcz0idG9vbGl0cCI+JyArIHRvb2x0aXAgKyc8L2Rpdj4nOw0KLSAgICAgIA0KLSAgICBpZiAoZGltc1snZGVsZXRlZF9kb2Nfc2l6ZSddID4gMC4wMDEpIHsNCi0gICAgIGVudHJ5ICs9ICc8ZGl2IGNsYXNzPSJkZWxldGVkIiBzdHlsZT0id2lkdGg6JyArIGRpbXNbJ2RlbGV0ZWRfZG9jX3NpemUnXSAgDQotICAgICAgICAgKyAnJTttYXJnaW4tbGVmdDonICsgZGltc1snYWxpdmVfZG9jX3NpemUnXSArICclOyI+Jm5ic3A7PC9kaXY+JzsNCi0gICAgfQ0KLSAgICBlbnRyeSArPSAnPC9kZD48L2RsPjwvbGk+JzsNCi0gICAgcmV0dXJuIGVudHJ5Ow0KLX07DQotDQotdmFyIGdldF9mb290ZXIgPSBmdW5jdGlvbihkZWxldGlvbnNfY291bnQsIGRvY3VtZW50c19jb3VudCkgew0KLSAgICByZXR1cm4gJzxsaT48ZGw+PGR0PjwvZHQ+PGRkPkRlbGV0aW9uczogJyArIA0KLSAgICAgICAgKGRvY3VtZW50c19jb3VudCA9PSAwID8gMCA6IHJvdW5kXzIoZGVsZXRpb25zX2NvdW50L2RvY3VtZW50c19jb3VudCAqIDEwMCkpICsNCi0gICAgICAgICAgICAnJSA8L2RkPjwvZGw+PC9saT4nOw0KLX07DQotDQotdmFyIGNhbGN1bGF0ZV9kaW1lbnNpb25zID0gZnVuY3Rpb24oc2VnbWVudF9zaXplX2luX2J5dGVzLCBzZWdtZW50X3NpemVfaW5fYnl0ZXNfbWF4LCBkb2NfY291bnQsIGRlbGV0ZV9kb2NfY291bnQpIHsNCi0gICAgdmFyIHNlZ21lbnRfc2l6ZV9pbl9ieXRlc19sb2cgPSBNYXRoLmxvZyhzZWdtZW50X3NpemVfaW5fYnl0ZXMpOw0KLSAgICB2YXIgc2VnbWVudF9zaXplX2luX2J5dGVzX21heF9sb2cgPSBNYXRoLmxvZyhzZWdtZW50X3NpemVfaW5fYnl0ZXNfbWF4KTsNCi0NCi0gICAgdmFyIGRpbXMgPSB7fTsNCi0gICAgLy9Ob3JtYWxpemUgdG8gMTAwJSBzaXplIG9mIGJhcg0KLSAgICBkaW1zWydzaXplJ10gPSBNYXRoLmZsb29yKChzZWdtZW50X3NpemVfaW5fYnl0ZXNfbG9nIC8gc2VnbWVudF9zaXplX2luX2J5dGVzX21heF9sb2cgKSAqIDEwMCk7DQotICAgIC8vRGVsZXRlZCBkb2MgcGFydCBzaXplDQotICAgIGRpbXNbJ2RlbGV0ZWRfZG9jX3NpemUnXSA9IE1hdGguZmxvb3IoKGRlbGV0ZV9kb2NfY291bnQvKGRlbGV0ZV9kb2NfY291bnQgKyBkb2NfY291bnQpKSAqIGRpbXNbJ3NpemUnXSk7DQotICAgIC8vQWxpdmUgZG9jIHBhcnQgc2l6ZQ0KLSAgICBkaW1zWydhbGl2ZV9kb2Nfc2l6ZSddID0gZGltc1snc2l6ZSddIC0gZGltc1snZGVsZXRlZF9kb2Nfc2l6ZSddOw0KLQ0KLSAgICByZXR1cm4gZGltczsNCi19Ow0KLQ0KLXZhciBjYWxjdWxhdGVfbWF4X3NpemVfb25fZGlzayA9IGZ1bmN0aW9uKHNlZ21lbnRfZW50cmllcykgew0KLSAgICB2YXIgbWF4ID0gMDsNCi0gICAgJC5lYWNoKHNlZ21lbnRfZW50cmllcywgZnVuY3Rpb24oaWR4LCBvYmopIHsNCi0gICAgICAgIGlmIChvYmouc2l6ZUluQnl0ZXMgPiBtYXgpIHsNCi0gICAgICAgICAgICBtYXggPSBvYmouc2l6ZUluQnl0ZXM7DQotICAgICAgICB9DQotICAgIH0pOw0KLSAgICByZXR1cm4gbWF4Ow0KLX07DQotDQotdmFyIHJvdW5kXzIgPSBmdW5jdGlvbihudW0pIHsNCi0gICAgcmV0dXJuIE1hdGgucm91bmQobnVtKjEwMCkvMTAwOw0KLX07DQotDQotdmFyIG51bWJlcl9mb3JtYXQgPSBmdW5jdGlvbih4KSB7DQotICAgIHJldHVybiB4LnRvU3RyaW5nKCkucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZywgIiAiKTsNCi19Ow0KLQ0KLXZhciBwcmVwYXJlX3hfYXhpcyA9IGZ1bmN0aW9uKHNlZ21lbnRfYnl0ZXNfbWF4KSB7DQotICAgIHZhciBmYWN0b3IgPSAxMDI0KjEwMjQ7IC8vZm9yIE1CDQotICAgIA0KLSAgICB2YXIgc2VnbWVudF9ieXRlc19tYXhfbG9nID0gTWF0aC5sb2coc2VnbWVudF9ieXRlc19tYXgpOw0KLSAgICANCi0gICAgdmFyIHNlcmllc19lbnRyeSA9ICc8bGk+JyArICJcbiIgKw0KLSAgICAnICA8ZGwgY2xhc3M9ImNsZWFyZml4IiBzdHlsZT0id2lkdGg6MTAwJTsiPicgKyAiXG4iICsNCi0gICAgJyAgICA8ZHQ+PGRpdj5TaXplPC9kaXY+PC9kdD4nICsgIlxuIiArDQotICAgICcgICAgPGRkPicgKyANCi0gICAgJyAgICAgICAgPGRpdiBjbGFzcz0ic3RhcnQiPjA8L2Rpdj4nOw0KLSAgICB2YXIgc3RlcCA9IDA7DQotICAgIGZvciAodmFyIGogPSAwOyBqIDwgMzsgais9MSkgew0KLSAgICAgICAgICAgIHN0ZXAgKz0gc2VnbWVudF9ieXRlc19tYXhfbG9nLzQ7DQotICAgICAgICAgICAgdmFyIHN0ZXBfdmFsdWUgPSBudW1iZXJfZm9ybWF0KE1hdGguZmxvb3IoKE1hdGgucG93KE1hdGguRSwgc3RlcCkpL2ZhY3RvcikpDQotICAgICAgICAgICAgc2VyaWVzX2VudHJ5ICs9ICc8ZGl2IGNsYXNzPSJ3NSI+JyArICgoc3RlcF92YWx1ZSA+IDAuMDAxKT9zdGVwX3ZhbHVlIDogJyZuYnNwOycpICArICc8L2Rpdj4nDQotICAgIH0NCi0gICAgc2VyaWVzX2VudHJ5ICs9ICc8ZGl2IGNsYXNzPSJlbmQiPicgKyBudW1iZXJfZm9ybWF0KE1hdGguZmxvb3Ioc2VnbWVudF9ieXRlc19tYXgvZmFjdG9yKSkgKyAnIE1CIDwvZGl2PicgKw0KLSAgICAnICAgIDwvZGQ+JyArDQotICAgICcgIDwvZGw+JyArDQotICAgICc8L2xpPic7DQotICAgIHJldHVybiBzZXJpZXNfZW50cnk7DQotfTsNCi0NCi0vLyAjLzpjb3JlL2FkbWluL3NlZ21lbnRzDQotc2FtbXkuZ2V0DQotKA0KLSAgbmV3IFJlZ0V4cCggYXBwLmNvcmVfcmVnZXhfYmFzZSArICdcXC8oc2VnbWVudHMpJCcgKSwNCi0gIGZ1bmN0aW9uKCBjb250ZXh0ICkNCi0gIHsNCi0gICAgdmFyIGNvcmVfYmFzZXBhdGggPSB0aGlzLmFjdGl2ZV9jb3JlLmF0dHIoICdkYXRhLWJhc2VwYXRoJyApOw0KLSAgICB2YXIgY29udGVudF9lbGVtZW50ID0gJCggJyNjb250ZW50JyApOw0KLSAgICAgICAgDQotICAgICQuZ2V0DQotICAgICgNCi0gICAgICAndHBsL3NlZ21lbnRzLmh0bWwnLA0KLSAgICAgIGZ1bmN0aW9uKCB0ZW1wbGF0ZSApDQotICAgICAgew0KLSAgICAgICAgY29udGVudF9lbGVtZW50Lmh0bWwoIHRlbXBsYXRlICk7DQotICAgICAgICAgICAgDQotICAgICAgICB2YXIgc2VnbWVudHNfZWxlbWVudCA9ICQoJyNzZWdtZW50cycsIGNvbnRlbnRfZWxlbWVudCk7DQotICAgICAgICB2YXIgc2VnbWVudHNfcmVsb2FkID0gJCggJyNzZWdtZW50cyBhLnJlbG9hZCcgKTsNCi0gICAgICAgIHZhciB1cmxfZWxlbWVudCA9ICQoJyN1cmwnLCBzZWdtZW50c19lbGVtZW50KTsNCi0gICAgICAgIHZhciByZXN1bHRfZWxlbWVudCA9ICQoJyNyZXN1bHQnLCBzZWdtZW50c19lbGVtZW50KTsNCi0gICAgICAgIHZhciByZXNwb25zZV9lbGVtZW50ID0gJCgnI3Jlc3BvbnNlJywgcmVzdWx0X2VsZW1lbnQpOw0KLSAgICAgICAgdmFyIHNlZ21lbnRzX2hvbGRlcl9lbGVtZW50ID0gJCgnLnNlZ21lbnRzLWhvbGRlcicsIHJlc3VsdF9lbGVtZW50KTsNCi0NCi0gICAgICAgIHNlZ21lbnRzX3JlbG9hZA0KLSAgICAgICAgICAgIC5kaWUoICdjbGljaycgKQ0KLSAgICAgICAgICAgIC5saXZlDQotICAgICAgICAgICAgKA0KLSAgICAgICAgICAgICdjbGljaycsDQotICAgICAgICAgICAgZnVuY3Rpb24oIGV2ZW50ICkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICQuYWpheA0KLSAgICAgICAgICAgICAgICAoDQotICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgdXJsIDogY29yZV9iYXNlcGF0aCArICAnL2FkbWluL3NlZ21lbnRzP3d0PWpzb24nLA0KLSAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUgOiAnanNvbicsDQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB0aGlzLA0KLSAgICAgICAgICAgICAgICAgICAgYmVmb3JlU2VuZCA6IGZ1bmN0aW9uKCBhcnIsIGZvcm0sIG9wdGlvbnMgKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIuc2hvdyggdGhpcyApOyAgICANCi0gICAgICAgICAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgICAgICAgICBzdWNjZXNzIDogZnVuY3Rpb24oIHJlc3BvbnNlLCB0ZXh0X3N0YXR1cywgeGhyICkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VnbWVudHNfcmVzcG9uc2UgPSByZXNwb25zZVsnc2VnbWVudHMnXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudHNfZW50cmllcyA9IFtdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50X2J5dGVzX21heCA9IGNhbGN1bGF0ZV9tYXhfc2l6ZV9vbl9kaXNrKCBzZWdtZW50c19yZXNwb25zZSApOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vc2NhbGUNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50c19lbnRyaWVzLnB1c2goIHByZXBhcmVfeF9heGlzKCBzZWdtZW50X2J5dGVzX21heCApICk7DQotICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRvY3VtZW50c19jb3VudCA9IDAsIGRlbGV0aW9uc19jb3VudCA9IDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgLy9lbGVtZW50cw0KLSAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCggc2VnbWVudHNfcmVzcG9uc2UsIGZ1bmN0aW9uKCBrZXksIHNlZ21lbnRfcmVzcG9uc2UgKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzX2VudHJpZXMucHVzaCggZ2V0X2VudHJ5KCBzZWdtZW50X3Jlc3BvbnNlLCBzZWdtZW50X2J5dGVzX21heCApICk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudHNfY291bnQgKz0gc2VnbWVudF9yZXNwb25zZS5zaXplOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9uc19jb3VudCArPSBzZWdtZW50X3Jlc3BvbnNlLmRlbENvdW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KLSAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgLy9mb290ZXINCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50c19lbnRyaWVzLnB1c2goIGdldF9mb290ZXIoIGRlbGV0aW9uc19jb3VudCwgZG9jdW1lbnRzX2NvdW50ICkgKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAkKCAndWwnLCBzZWdtZW50c19ob2xkZXJfZWxlbWVudCApLmh0bWwoIHNlZ21lbnRzX2VudHJpZXMuam9pbigiXG4iICkgKTsNCi0gICAgICAgICAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgICAgICAgICBlcnJvciA6IGZ1bmN0aW9uKCB4aHIsIHRleHRfc3RhdHVzLCBlcnJvcl90aHJvd24gKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAkKCB0aGlzICkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXR0ciggJ3RpdGxlJywgJy9hZG1pbi9zZWdtZW50cyBpcyBub3QgY29uZmlndXJlZCAoJyArIHhoci5zdGF0dXMgKyAnOiAnICsgZXJyb3JfdGhyb3duICsgJyknICk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICQoIHRoaXMgKS5wYXJlbnRzKCAnbGknICkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoICdlcnJvcicgKTsNCi0gICAgICAgICAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSA6IGZ1bmN0aW9uKCB4aHIsIHRleHRfc3RhdHVzICkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmhpZGUoIHRoaXMgKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICk7DQotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICApOw0KLSAgICAgICAgLy9pbml0aWFsbHkgc3VibWl0DQotICAgICAgICBzZWdtZW50c19yZWxvYWQuY2xpY2soKTsNCi0gICAgICB9DQotICAgICk7DQotICB9DQotKTsNCisvKgorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKwordmFyIGdldF90b29sdGlwID0gZnVuY3Rpb24oIHNlZ21lbnRfcmVzcG9uc2UgKSB7CisgICAgdmFyIHRvb2x0aXAgPQorICAgICAgICAnPGRpdj5TZWdtZW50IDxiPicgKyBzZWdtZW50X3Jlc3BvbnNlLm5hbWUgKyAnPC9iPjo8L2Rpdj4nICsKKyAgICAgICAgJzxkaXYgY2xhc3M9ImxhYmVsIj4jZG9jczo8L2Rpdj48ZGl2PicgKyBudW1iZXJfZm9ybWF0KHNlZ21lbnRfcmVzcG9uc2Uuc2l6ZSkgKyc8L2Rpdj4nICsKKyAgICAgICAgJzxkaXYgY2xhc3M9ImxhYmVsIj4jZGVsczo8L2Rpdj48ZGl2PicgKyBudW1iZXJfZm9ybWF0KHNlZ21lbnRfcmVzcG9uc2UuZGVsQ291bnQpICsgJzwvZGl2PicgKworICAgICAgICAnPGRpdiBjbGFzcz0ibGFiZWwiPnNpemU6PC9kaXY+PGRpdj4nICsgbnVtYmVyX2Zvcm1hdChzZWdtZW50X3Jlc3BvbnNlLnNpemVJbkJ5dGVzKSArICcgYnl0ZXMgPC9kaXY+JyArCisgICAgICAgICc8ZGl2IGNsYXNzPSJsYWJlbCI+YWdlOjwvZGl2PjxkaXY+JyArIHNlZ21lbnRfcmVzcG9uc2UuYWdlICsgJzwvZGl2PicgKworICAgICAgICAnPGRpdiBjbGFzcz0ibGFiZWwiPnNvdXJjZTo8L2Rpdj48ZGl2PicgKyBzZWdtZW50X3Jlc3BvbnNlLnNvdXJjZSArICc8L2Rpdj4nOworICAgIHJldHVybiB0b29sdGlwOworfTsKKwordmFyIGdldF9lbnRyeSA9IGZ1bmN0aW9uKCBzZWdtZW50X3Jlc3BvbnNlLCBzZWdtZW50X2J5dGVzX21heCApIHsKKyAgICAvL2NhbGN1YWx0ZSBkaW1lbnNpb25zIG9mIGdyYXBoCisgICAgdmFyIGRpbXMgPSBjYWxjdWxhdGVfZGltZW5zaW9ucyhzZWdtZW50X3Jlc3BvbnNlLnNpemVJbkJ5dGVzLCAKKyAgICAgICAgICAgIHNlZ21lbnRfYnl0ZXNfbWF4LCBzZWdtZW50X3Jlc3BvbnNlLnNpemUsIHNlZ21lbnRfcmVzcG9uc2UuZGVsQ291bnQpCisgICAgLy9jcmVhdGUgZW50cnkgZm9yIHNlZ21lbnQgd2l0aCBnaXZlbiBkaW1lbnNpb25zCisgICAgdmFyIGVudHJ5ID0gZ2V0X2VudHJ5X2l0ZW0oc2VnbWVudF9yZXNwb25zZS5uYW1lLCBkaW1zLCAKKyAgICAgICAgICAgIGdldF90b29sdGlwKHNlZ21lbnRfcmVzcG9uc2UpLCAoc2VnbWVudF9yZXNwb25zZS5tZXJnZUNhbmRpZGF0ZSk/dHJ1ZTpmYWxzZSk7CisKKyAgICByZXR1cm4gZW50cnk7Cit9OworCit2YXIgZ2V0X2VudHJ5X2l0ZW0gPSBmdW5jdGlvbihuYW1lLCBkaW1zLCB0b29sdGlwLCBpc01lcmdlQ2FuZGlkYXRlKSB7CisgICAgdmFyIGVudHJ5ID0gJzxsaT4nICsgIlxuIiArCisgICAgJyAgPGRsIGNsYXNzPSJjbGVhcmZpeCIgc3R5bGU9IndpZHRoOiAnICsgZGltc1snc2l6ZSddICsgJyU7Ij4nICsgIlxuIiArCisgICAgJyAgICA8ZHQ+PGRpdj4nICsgbmFtZSArICc8L2Rpdj48L2R0PicgKyAiXG4iICsKKyAgICAnICAgIDxkZD4nOworICAgIGVudHJ5ICs9ICc8ZGl2IGNsYXNzPSJsaXZlJyArICgoaXNNZXJnZUNhbmRpZGF0ZSk/JyBtZXJnZS1jYW5kaWRhdGUnOicnKSArIAorICAgICAgICAgJyIgc3R5bGU9IndpZHRoOiAnICsgZGltc1snYWxpdmVfZG9jX3NpemUnXSArICclOyI+Jm5ic3A7PC9kaXY+JzsKKyAgICBlbnRyeSArPSAnPGRpdiBjbGFzcz0idG9vbGl0cCI+JyArIHRvb2x0aXAgKyc8L2Rpdj4nOworICAgICAgCisgICAgaWYgKGRpbXNbJ2RlbGV0ZWRfZG9jX3NpemUnXSA+IDAuMDAxKSB7CisgICAgIGVudHJ5ICs9ICc8ZGl2IGNsYXNzPSJkZWxldGVkIiBzdHlsZT0id2lkdGg6JyArIGRpbXNbJ2RlbGV0ZWRfZG9jX3NpemUnXSAgCisgICAgICAgICArICclO21hcmdpbi1sZWZ0OicgKyBkaW1zWydhbGl2ZV9kb2Nfc2l6ZSddICsgJyU7Ij4mbmJzcDs8L2Rpdj4nOworICAgIH0KKyAgICBlbnRyeSArPSAnPC9kZD48L2RsPjwvbGk+JzsKKyAgICByZXR1cm4gZW50cnk7Cit9OworCit2YXIgZ2V0X2Zvb3RlciA9IGZ1bmN0aW9uKGRlbGV0aW9uc19jb3VudCwgZG9jdW1lbnRzX2NvdW50KSB7CisgICAgcmV0dXJuICc8bGk+PGRsPjxkdD48L2R0PjxkZD5EZWxldGlvbnM6ICcgKyAKKyAgICAgICAgKGRvY3VtZW50c19jb3VudCA9PSAwID8gMCA6IHJvdW5kXzIoZGVsZXRpb25zX2NvdW50L2RvY3VtZW50c19jb3VudCAqIDEwMCkpICsKKyAgICAgICAgICAgICclIDwvZGQ+PC9kbD48L2xpPic7Cit9OworCit2YXIgY2FsY3VsYXRlX2RpbWVuc2lvbnMgPSBmdW5jdGlvbihzZWdtZW50X3NpemVfaW5fYnl0ZXMsIHNlZ21lbnRfc2l6ZV9pbl9ieXRlc19tYXgsIGRvY19jb3VudCwgZGVsZXRlX2RvY19jb3VudCkgeworICAgIHZhciBzZWdtZW50X3NpemVfaW5fYnl0ZXNfbG9nID0gTWF0aC5sb2coc2VnbWVudF9zaXplX2luX2J5dGVzKTsKKyAgICB2YXIgc2VnbWVudF9zaXplX2luX2J5dGVzX21heF9sb2cgPSBNYXRoLmxvZyhzZWdtZW50X3NpemVfaW5fYnl0ZXNfbWF4KTsKKworICAgIHZhciBkaW1zID0ge307CisgICAgLy9Ob3JtYWxpemUgdG8gMTAwJSBzaXplIG9mIGJhcgorICAgIGRpbXNbJ3NpemUnXSA9IE1hdGguZmxvb3IoKHNlZ21lbnRfc2l6ZV9pbl9ieXRlc19sb2cgLyBzZWdtZW50X3NpemVfaW5fYnl0ZXNfbWF4X2xvZyApICogMTAwKTsKKyAgICAvL0RlbGV0ZWQgZG9jIHBhcnQgc2l6ZQorICAgIGRpbXNbJ2RlbGV0ZWRfZG9jX3NpemUnXSA9IE1hdGguZmxvb3IoKGRlbGV0ZV9kb2NfY291bnQvKGRlbGV0ZV9kb2NfY291bnQgKyBkb2NfY291bnQpKSAqIGRpbXNbJ3NpemUnXSk7CisgICAgLy9BbGl2ZSBkb2MgcGFydCBzaXplCisgICAgZGltc1snYWxpdmVfZG9jX3NpemUnXSA9IGRpbXNbJ3NpemUnXSAtIGRpbXNbJ2RlbGV0ZWRfZG9jX3NpemUnXTsKKworICAgIHJldHVybiBkaW1zOworfTsKKwordmFyIGNhbGN1bGF0ZV9tYXhfc2l6ZV9vbl9kaXNrID0gZnVuY3Rpb24oc2VnbWVudF9lbnRyaWVzKSB7CisgICAgdmFyIG1heCA9IDA7CisgICAgJC5lYWNoKHNlZ21lbnRfZW50cmllcywgZnVuY3Rpb24oaWR4LCBvYmopIHsKKyAgICAgICAgaWYgKG9iai5zaXplSW5CeXRlcyA+IG1heCkgeworICAgICAgICAgICAgbWF4ID0gb2JqLnNpemVJbkJ5dGVzOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIG1heDsKK307CisKK3ZhciByb3VuZF8yID0gZnVuY3Rpb24obnVtKSB7CisgICAgcmV0dXJuIE1hdGgucm91bmQobnVtKjEwMCkvMTAwOworfTsKKwordmFyIG51bWJlcl9mb3JtYXQgPSBmdW5jdGlvbih4KSB7CisgICAgcmV0dXJuIHgudG9TdHJpbmcoKS5yZXBsYWNlKC9cQig/PShcZHszfSkrKD8hXGQpKS9nLCAiICIpOworfTsKKwordmFyIHByZXBhcmVfeF9heGlzID0gZnVuY3Rpb24oc2VnbWVudF9ieXRlc19tYXgpIHsKKyAgICB2YXIgZmFjdG9yID0gMTAyNCoxMDI0OyAvL2ZvciBNQgorICAgIAorICAgIHZhciBzZWdtZW50X2J5dGVzX21heF9sb2cgPSBNYXRoLmxvZyhzZWdtZW50X2J5dGVzX21heCk7CisgICAgCisgICAgdmFyIHNlcmllc19lbnRyeSA9ICc8bGk+JyArICJcbiIgKworICAgICcgIDxkbCBjbGFzcz0iY2xlYXJmaXgiIHN0eWxlPSJ3aWR0aDoxMDAlOyI+JyArICJcbiIgKworICAgICcgICAgPGR0PjxkaXY+U2l6ZTwvZGl2PjwvZHQ+JyArICJcbiIgKworICAgICcgICAgPGRkPicgKyAKKyAgICAnICAgICAgICA8ZGl2IGNsYXNzPSJzdGFydCI+MDwvZGl2Pic7CisgICAgdmFyIHN0ZXAgPSAwOworICAgIGZvciAodmFyIGogPSAwOyBqIDwgMzsgais9MSkgeworICAgICAgICAgICAgc3RlcCArPSBzZWdtZW50X2J5dGVzX21heF9sb2cvNDsKKyAgICAgICAgICAgIHZhciBzdGVwX3ZhbHVlID0gbnVtYmVyX2Zvcm1hdChNYXRoLmZsb29yKChNYXRoLnBvdyhNYXRoLkUsIHN0ZXApKS9mYWN0b3IpKQorICAgICAgICAgICAgc2VyaWVzX2VudHJ5ICs9ICc8ZGl2IGNsYXNzPSJ3NSI+JyArICgoc3RlcF92YWx1ZSA+IDAuMDAxKT9zdGVwX3ZhbHVlIDogJyZuYnNwOycpICArICc8L2Rpdj4nCisgICAgfQorICAgIHNlcmllc19lbnRyeSArPSAnPGRpdiBjbGFzcz0iZW5kIj4nICsgbnVtYmVyX2Zvcm1hdChNYXRoLmZsb29yKHNlZ21lbnRfYnl0ZXNfbWF4L2ZhY3RvcikpICsgJyBNQiA8L2Rpdj4nICsKKyAgICAnICAgIDwvZGQ+JyArCisgICAgJyAgPC9kbD4nICsKKyAgICAnPC9saT4nOworICAgIHJldHVybiBzZXJpZXNfZW50cnk7Cit9OworCisvLyAjLzpjb3JlL2FkbWluL3NlZ21lbnRzCitzYW1teS5nZXQKKygKKyAgbmV3IFJlZ0V4cCggYXBwLmNvcmVfcmVnZXhfYmFzZSArICdcXC8oc2VnbWVudHMpJCcgKSwKKyAgZnVuY3Rpb24oIGNvbnRleHQgKQorICB7CisgICAgdmFyIGNvcmVfYmFzZXBhdGggPSB0aGlzLmFjdGl2ZV9jb3JlLmF0dHIoICdkYXRhLWJhc2VwYXRoJyApOworICAgIHZhciBjb250ZW50X2VsZW1lbnQgPSAkKCAnI2NvbnRlbnQnICk7CisgICAgICAgIAorICAgICQuZ2V0CisgICAgKAorICAgICAgJ3RwbC9zZWdtZW50cy5odG1sJywKKyAgICAgIGZ1bmN0aW9uKCB0ZW1wbGF0ZSApCisgICAgICB7CisgICAgICAgIGNvbnRlbnRfZWxlbWVudC5odG1sKCB0ZW1wbGF0ZSApOworICAgICAgICAgICAgCisgICAgICAgIHZhciBzZWdtZW50c19lbGVtZW50ID0gJCgnI3NlZ21lbnRzJywgY29udGVudF9lbGVtZW50KTsKKyAgICAgICAgdmFyIHNlZ21lbnRzX3JlbG9hZCA9ICQoICcjc2VnbWVudHMgYS5yZWxvYWQnICk7CisgICAgICAgIHZhciB1cmxfZWxlbWVudCA9ICQoJyN1cmwnLCBzZWdtZW50c19lbGVtZW50KTsKKyAgICAgICAgdmFyIHJlc3VsdF9lbGVtZW50ID0gJCgnI3Jlc3VsdCcsIHNlZ21lbnRzX2VsZW1lbnQpOworICAgICAgICB2YXIgcmVzcG9uc2VfZWxlbWVudCA9ICQoJyNyZXNwb25zZScsIHJlc3VsdF9lbGVtZW50KTsKKyAgICAgICAgdmFyIHNlZ21lbnRzX2hvbGRlcl9lbGVtZW50ID0gJCgnLnNlZ21lbnRzLWhvbGRlcicsIHJlc3VsdF9lbGVtZW50KTsKKworICAgICAgICBzZWdtZW50c19yZWxvYWQKKyAgICAgICAgICAgIC5kaWUoICdjbGljaycgKQorICAgICAgICAgICAgLmxpdmUKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICdjbGljaycsCisgICAgICAgICAgICBmdW5jdGlvbiggZXZlbnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICQuYWpheAorICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsIDogY29yZV9iYXNlcGF0aCArICAnL2FkbWluL3NlZ21lbnRzP3d0PWpzb24nLAorICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZSA6ICdqc29uJywKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpcywKKyAgICAgICAgICAgICAgICAgICAgYmVmb3JlU2VuZCA6IGZ1bmN0aW9uKCBhcnIsIGZvcm0sIG9wdGlvbnMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLnNob3coIHRoaXMgKTsgICAgCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgOiBmdW5jdGlvbiggcmVzcG9uc2UsIHRleHRfc3RhdHVzLCB4aHIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VnbWVudHNfcmVzcG9uc2UgPSByZXNwb25zZVsnc2VnbWVudHMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50c19lbnRyaWVzID0gW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudF9ieXRlc19tYXggPSBjYWxjdWxhdGVfbWF4X3NpemVfb25fZGlzayggc2VnbWVudHNfcmVzcG9uc2UgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9zY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudHNfZW50cmllcy5wdXNoKCBwcmVwYXJlX3hfYXhpcyggc2VnbWVudF9ieXRlc19tYXggKSApOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9jdW1lbnRzX2NvdW50ID0gMCwgZGVsZXRpb25zX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLy9lbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKCBzZWdtZW50c19yZXNwb25zZSwgZnVuY3Rpb24oIGtleSwgc2VnbWVudF9yZXNwb25zZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50c19lbnRyaWVzLnB1c2goIGdldF9lbnRyeSggc2VnbWVudF9yZXNwb25zZSwgc2VnbWVudF9ieXRlc19tYXggKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50c19jb3VudCArPSBzZWdtZW50X3Jlc3BvbnNlLnNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGlvbnNfY291bnQgKz0gc2VnbWVudF9yZXNwb25zZS5kZWxDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9vdGVyCisgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50c19lbnRyaWVzLnB1c2goIGdldF9mb290ZXIoIGRlbGV0aW9uc19jb3VudCwgZG9jdW1lbnRzX2NvdW50ICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgJCggJ3VsJywgc2VnbWVudHNfaG9sZGVyX2VsZW1lbnQgKS5odG1sKCBzZWdtZW50c19lbnRyaWVzLmpvaW4oIlxuIiApICk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIGVycm9yIDogZnVuY3Rpb24oIHhociwgdGV4dF9zdGF0dXMsIGVycm9yX3Rocm93biApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAkKCB0aGlzICkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCAndGl0bGUnLCAnL2FkbWluL3NlZ21lbnRzIGlzIG5vdCBjb25maWd1cmVkICgnICsgeGhyLnN0YXR1cyArICc6ICcgKyBlcnJvcl90aHJvd24gKyAnKScgKTsKKworICAgICAgICAgICAgICAgICAgICAgICQoIHRoaXMgKS5wYXJlbnRzKCAnbGknICkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyggJ2Vycm9yJyApOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSA6IGZ1bmN0aW9uKCB4aHIsIHRleHRfc3RhdHVzICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci5oaWRlKCB0aGlzICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgKTsKKyAgICAgICAgLy9pbml0aWFsbHkgc3VibWl0CisgICAgICAgIHNlZ21lbnRzX3JlbG9hZC5jbGljaygpOworICAgICAgfQorICAgICk7CisgIH0KKyk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9hbmd1bGFyLWNob3Nlbi5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItY2hvc2VuLmpzCmluZGV4IGJjNDYwZWIuLjc2MDQyMmYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItY2hvc2VuLmpzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItY2hvc2VuLmpzCkBAIC0xLDEzOSArMSwxMzkgQEAKLS8qDQotVGhlIE1JVCBMaWNlbnNlDQotDQotQ29weXJpZ2h0IChjKSAyMDEzIExvY2FseXRpY3MgaHR0cDovL3d3dy5sb2NhbHl0aWNzLmNvbQ0KLQ0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkNCi1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCi10byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KLQ0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQotQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTg0KLVRIRSBTT0ZUV0FSRS4NCi0qLw0KLS8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS44LjANCi0oZnVuY3Rpb24oKSB7DQotICB2YXIgX19pbmRleE9mID0gW10uaW5kZXhPZiB8fCBmdW5jdGlvbihpdGVtKSB7IGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsgaWYgKGkgaW4gdGhpcyAmJiB0aGlzW2ldID09PSBpdGVtKSByZXR1cm4gaTsgfSByZXR1cm4gLTE7IH07DQotDQotICBhbmd1bGFyLm1vZHVsZSgnbG9jYWx5dGljcy5kaXJlY3RpdmVzJywgW10pOw0KLQ0KLSAgYW5ndWxhci5tb2R1bGUoJ2xvY2FseXRpY3MuZGlyZWN0aXZlcycpLmRpcmVjdGl2ZSgnY2hvc2VuJywgWw0KLSAgICAnJHRpbWVvdXQnLCBmdW5jdGlvbigkdGltZW91dCkgew0KLSAgICAgIHZhciBDSE9TRU5fT1BUSU9OX1dISVRFTElTVCwgTkdfT1BUSU9OU19SRUdFWFAsIGlzRW1wdHksIHNuYWtlQ2FzZTsNCi0gICAgICBOR19PUFRJT05TX1JFR0VYUCA9IC9eXHMqKC4qPykoPzpccythc1xzKyguKj8pKT8oPzpccytncm91cFxzK2J5XHMrKC4qKSk/XHMrZm9yXHMrKD86KFtcJFx3XVtcJFx3XSopfCg/OlwoXHMqKFtcJFx3XVtcJFx3XSopXHMqLFxzKihbXCRcd11bXCRcd10qKVxzKlwpKSlccytpblxzKyguKj8pKD86XHMrdHJhY2tccytieVxzKyguKj8pKT8kLzsNCi0gICAgICBDSE9TRU5fT1BUSU9OX1dISVRFTElTVCA9IFsnbm9SZXN1bHRzVGV4dCcsICdhbGxvd1NpbmdsZURlc2VsZWN0JywgJ2Rpc2FibGVTZWFyY2hUaHJlc2hvbGQnLCAnZGlzYWJsZVNlYXJjaCcsICdlbmFibGVTcGxpdFdvcmRTZWFyY2gnLCAnaW5oZXJpdFNlbGVjdENsYXNzZXMnLCAnbWF4U2VsZWN0ZWRPcHRpb25zJywgJ3BsYWNlaG9sZGVyVGV4dE11bHRpcGxlJywgJ3BsYWNlaG9sZGVyVGV4dFNpbmdsZScsICdzZWFyY2hDb250YWlucycsICdzaW5nbGVCYWNrc3Ryb2tlRGVsZXRlJywgJ2Rpc3BsYXlEaXNhYmxlZE9wdGlvbnMnLCAnZGlzcGxheVNlbGVjdGVkT3B0aW9ucycsICd3aWR0aCddOw0KLSAgICAgIHNuYWtlQ2FzZSA9IGZ1bmN0aW9uKGlucHV0KSB7DQotICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvW0EtWl0vZywgZnVuY3Rpb24oJDEpIHsNCi0gICAgICAgICAgcmV0dXJuICJfIiArICgkMS50b0xvd2VyQ2FzZSgpKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIH07DQotICAgICAgaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgICB2YXIga2V5Ow0KLSAgICAgICAgaWYgKGFuZ3VsYXIuaXNBcnJheSh2YWx1ZSkpIHsNCi0gICAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PT0gMDsNCi0gICAgICAgIH0gZWxzZSBpZiAoYW5ndWxhci5pc09iamVjdCh2YWx1ZSkpIHsNCi0gICAgICAgICAgZm9yIChrZXkgaW4gdmFsdWUpIHsNCi0gICAgICAgICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSkgew0KLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgfTsNCi0gICAgICByZXR1cm4gew0KLSAgICAgICAgcmVzdHJpY3Q6ICdBJywNCi0gICAgICAgIHJlcXVpcmU6ICc/bmdNb2RlbCcsDQotICAgICAgICB0ZXJtaW5hbDogdHJ1ZSwNCi0gICAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBuZ01vZGVsKSB7DQotICAgICAgICAgIHZhciBjaG9zZW4sIGRlZmF1bHRUZXh0LCBkaXNhYmxlV2l0aE1lc3NhZ2UsIGVtcHR5LCBpbml0T3JVcGRhdGUsIG1hdGNoLCBvcHRpb25zLCBvcmlnUmVuZGVyLCByZW1vdmVFbXB0eU1lc3NhZ2UsIHN0YXJ0TG9hZGluZywgc3RvcExvYWRpbmcsIHZhbHVlc0V4cHIsIHZpZXdXYXRjaDsNCi0gICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygnbG9jYWx5dGljcy1jaG9zZW4nKTsNCi0gICAgICAgICAgb3B0aW9ucyA9IHNjb3BlLiRldmFsKGF0dHIuY2hvc2VuKSB8fCB7fTsNCi0gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGF0dHIsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsNCi0gICAgICAgICAgICBpZiAoX19pbmRleE9mLmNhbGwoQ0hPU0VOX09QVElPTl9XSElURUxJU1QsIGtleSkgPj0gMCkgew0KLSAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNbc25ha2VDYXNlKGtleSldID0gc2NvcGUuJGV2YWwodmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSk7DQotICAgICAgICAgIHN0YXJ0TG9hZGluZyA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmFkZENsYXNzKCdsb2FkaW5nJykuYXR0cignZGlzYWJsZWQnLCB0cnVlKS50cmlnZ2VyKCdjaG9zZW46dXBkYXRlZCcpOw0KLSAgICAgICAgICB9Ow0KLSAgICAgICAgICBzdG9wTG9hZGluZyA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnJlbW92ZUNsYXNzKCdsb2FkaW5nJykuYXR0cignZGlzYWJsZWQnLCBmYWxzZSkudHJpZ2dlcignY2hvc2VuOnVwZGF0ZWQnKTsNCi0gICAgICAgICAgfTsNCi0gICAgICAgICAgY2hvc2VuID0gbnVsbDsNCi0gICAgICAgICAgZGVmYXVsdFRleHQgPSBudWxsOw0KLSAgICAgICAgICBlbXB0eSA9IGZhbHNlOw0KLSAgICAgICAgICBpbml0T3JVcGRhdGUgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBpZiAoY2hvc2VuKSB7DQotICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC50cmlnZ2VyKCdjaG9zZW46dXBkYXRlZCcpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICBjaG9zZW4gPSBlbGVtZW50LmNob3NlbihvcHRpb25zKS5kYXRhKCdjaG9zZW4nKTsNCi0gICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VGV4dCA9IGNob3Nlbi5kZWZhdWx0X3RleHQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9Ow0KLSAgICAgICAgICByZW1vdmVFbXB0eU1lc3NhZ2UgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBlbXB0eSA9IGZhbHNlOw0KLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmF0dHIoJ2RhdGEtcGxhY2Vob2xkZXInLCBkZWZhdWx0VGV4dCk7DQotICAgICAgICAgIH07DQotICAgICAgICAgIGRpc2FibGVXaXRoTWVzc2FnZSA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIGVtcHR5ID0gdHJ1ZTsNCi0gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5hdHRyKCdkYXRhLXBsYWNlaG9sZGVyJywgY2hvc2VuLnJlc3VsdHNfbm9uZV9mb3VuZCkuYXR0cignZGlzYWJsZWQnLCB0cnVlKS50cmlnZ2VyKCdjaG9zZW46dXBkYXRlZCcpOw0KLSAgICAgICAgICB9Ow0KLSAgICAgICAgICBpZiAobmdNb2RlbCkgew0KLSAgICAgICAgICAgIG9yaWdSZW5kZXIgPSBuZ01vZGVsLiRyZW5kZXI7DQotICAgICAgICAgICAgbmdNb2RlbC4kcmVuZGVyID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICBvcmlnUmVuZGVyKCk7DQotICAgICAgICAgICAgICByZXR1cm4gaW5pdE9yVXBkYXRlKCk7DQotICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICBpZiAoYXR0ci5tdWx0aXBsZSkgew0KLSAgICAgICAgICAgICAgdmlld1dhdGNoID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZ01vZGVsLiR2aWV3VmFsdWU7DQotICAgICAgICAgICAgICB9Ow0KLSAgICAgICAgICAgICAgc2NvcGUuJHdhdGNoKHZpZXdXYXRjaCwgbmdNb2RlbC4kcmVuZGVyLCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaW5pdE9yVXBkYXRlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgYXR0ci4kb2JzZXJ2ZSgnZGlzYWJsZWQnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gZWxlbWVudC50cmlnZ2VyKCdjaG9zZW46dXBkYXRlZCcpOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgICAgaWYgKGF0dHIubmdPcHRpb25zICYmIG5nTW9kZWwpIHsNCi0gICAgICAgICAgICBtYXRjaCA9IGF0dHIubmdPcHRpb25zLm1hdGNoKE5HX09QVElPTlNfUkVHRVhQKTsNCi0gICAgICAgICAgICB2YWx1ZXNFeHByID0gbWF0Y2hbN107DQotICAgICAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbih2YWx1ZXNFeHByLCBmdW5jdGlvbihuZXdWYWwsIG9sZFZhbCkgew0KLSAgICAgICAgICAgICAgdmFyIHRpbWVyOw0KLSAgICAgICAgICAgICAgcmV0dXJuIHRpbWVyID0gJHRpbWVvdXQoZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKG5ld1ZhbCkpIHsNCi0gICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRMb2FkaW5nKCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KSB7DQotICAgICAgICAgICAgICAgICAgICByZW1vdmVFbXB0eU1lc3NhZ2UoKTsNCi0gICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgc3RvcExvYWRpbmcoKTsNCi0gICAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShuZXdWYWwpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZVdpdGhNZXNzYWdlKCk7DQotICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICByZXR1cm4gc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKGV2ZW50KSB7DQotICAgICAgICAgICAgICBpZiAodHlwZW9mIHRpbWVyICE9PSAidW5kZWZpbmVkIiAmJiB0aW1lciAhPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gJHRpbWVvdXQuY2FuY2VsKHRpbWVyKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH07DQotICAgIH0NCi0gIF0pOw0KLQ0KLX0pLmNhbGwodGhpcyk7DQorLyoKK1RoZSBNSVQgTGljZW5zZQorCitDb3B5cmlnaHQgKGMpIDIwMTMgTG9jYWx5dGljcyBodHRwOi8vd3d3LmxvY2FseXRpY3MuY29tCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorKi8KKy8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS44LjAKKyhmdW5jdGlvbigpIHsKKyAgdmFyIF9faW5kZXhPZiA9IFtdLmluZGV4T2YgfHwgZnVuY3Rpb24oaXRlbSkgeyBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7IGlmIChpIGluIHRoaXMgJiYgdGhpc1tpXSA9PT0gaXRlbSkgcmV0dXJuIGk7IH0gcmV0dXJuIC0xOyB9OworCisgIGFuZ3VsYXIubW9kdWxlKCdsb2NhbHl0aWNzLmRpcmVjdGl2ZXMnLCBbXSk7CisKKyAgYW5ndWxhci5tb2R1bGUoJ2xvY2FseXRpY3MuZGlyZWN0aXZlcycpLmRpcmVjdGl2ZSgnY2hvc2VuJywgWworICAgICckdGltZW91dCcsIGZ1bmN0aW9uKCR0aW1lb3V0KSB7CisgICAgICB2YXIgQ0hPU0VOX09QVElPTl9XSElURUxJU1QsIE5HX09QVElPTlNfUkVHRVhQLCBpc0VtcHR5LCBzbmFrZUNhc2U7CisgICAgICBOR19PUFRJT05TX1JFR0VYUCA9IC9eXHMqKC4qPykoPzpccythc1xzKyguKj8pKT8oPzpccytncm91cFxzK2J5XHMrKC4qKSk/XHMrZm9yXHMrKD86KFtcJFx3XVtcJFx3XSopfCg/OlwoXHMqKFtcJFx3XVtcJFx3XSopXHMqLFxzKihbXCRcd11bXCRcd10qKVxzKlwpKSlccytpblxzKyguKj8pKD86XHMrdHJhY2tccytieVxzKyguKj8pKT8kLzsKKyAgICAgIENIT1NFTl9PUFRJT05fV0hJVEVMSVNUID0gWydub1Jlc3VsdHNUZXh0JywgJ2FsbG93U2luZ2xlRGVzZWxlY3QnLCAnZGlzYWJsZVNlYXJjaFRocmVzaG9sZCcsICdkaXNhYmxlU2VhcmNoJywgJ2VuYWJsZVNwbGl0V29yZFNlYXJjaCcsICdpbmhlcml0U2VsZWN0Q2xhc3NlcycsICdtYXhTZWxlY3RlZE9wdGlvbnMnLCAncGxhY2Vob2xkZXJUZXh0TXVsdGlwbGUnLCAncGxhY2Vob2xkZXJUZXh0U2luZ2xlJywgJ3NlYXJjaENvbnRhaW5zJywgJ3NpbmdsZUJhY2tzdHJva2VEZWxldGUnLCAnZGlzcGxheURpc2FibGVkT3B0aW9ucycsICdkaXNwbGF5U2VsZWN0ZWRPcHRpb25zJywgJ3dpZHRoJ107CisgICAgICBzbmFrZUNhc2UgPSBmdW5jdGlvbihpbnB1dCkgeworICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvW0EtWl0vZywgZnVuY3Rpb24oJDEpIHsKKyAgICAgICAgICByZXR1cm4gIl8iICsgKCQxLnRvTG93ZXJDYXNlKCkpOworICAgICAgICB9KTsKKyAgICAgIH07CisgICAgICBpc0VtcHR5ID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgdmFyIGtleTsKKyAgICAgICAgaWYgKGFuZ3VsYXIuaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID09PSAwOworICAgICAgICB9IGVsc2UgaWYgKGFuZ3VsYXIuaXNPYmplY3QodmFsdWUpKSB7CisgICAgICAgICAgZm9yIChrZXkgaW4gdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9OworICAgICAgcmV0dXJuIHsKKyAgICAgICAgcmVzdHJpY3Q6ICdBJywKKyAgICAgICAgcmVxdWlyZTogJz9uZ01vZGVsJywKKyAgICAgICAgdGVybWluYWw6IHRydWUsCisgICAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBuZ01vZGVsKSB7CisgICAgICAgICAgdmFyIGNob3NlbiwgZGVmYXVsdFRleHQsIGRpc2FibGVXaXRoTWVzc2FnZSwgZW1wdHksIGluaXRPclVwZGF0ZSwgbWF0Y2gsIG9wdGlvbnMsIG9yaWdSZW5kZXIsIHJlbW92ZUVtcHR5TWVzc2FnZSwgc3RhcnRMb2FkaW5nLCBzdG9wTG9hZGluZywgdmFsdWVzRXhwciwgdmlld1dhdGNoOworICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MoJ2xvY2FseXRpY3MtY2hvc2VuJyk7CisgICAgICAgICAgb3B0aW9ucyA9IHNjb3BlLiRldmFsKGF0dHIuY2hvc2VuKSB8fCB7fTsKKyAgICAgICAgICBhbmd1bGFyLmZvckVhY2goYXR0ciwgZnVuY3Rpb24odmFsdWUsIGtleSkgeworICAgICAgICAgICAgaWYgKF9faW5kZXhPZi5jYWxsKENIT1NFTl9PUFRJT05fV0hJVEVMSVNULCBrZXkpID49IDApIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNbc25ha2VDYXNlKGtleSldID0gc2NvcGUuJGV2YWwodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICAgIHN0YXJ0TG9hZGluZyA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuYWRkQ2xhc3MoJ2xvYWRpbmcnKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpLnRyaWdnZXIoJ2Nob3Nlbjp1cGRhdGVkJyk7CisgICAgICAgICAgfTsKKyAgICAgICAgICBzdG9wTG9hZGluZyA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2xvYWRpbmcnKS5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKS50cmlnZ2VyKCdjaG9zZW46dXBkYXRlZCcpOworICAgICAgICAgIH07CisgICAgICAgICAgY2hvc2VuID0gbnVsbDsKKyAgICAgICAgICBkZWZhdWx0VGV4dCA9IG51bGw7CisgICAgICAgICAgZW1wdHkgPSBmYWxzZTsKKyAgICAgICAgICBpbml0T3JVcGRhdGUgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChjaG9zZW4pIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudHJpZ2dlcignY2hvc2VuOnVwZGF0ZWQnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNob3NlbiA9IGVsZW1lbnQuY2hvc2VuKG9wdGlvbnMpLmRhdGEoJ2Nob3NlbicpOworICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFRleHQgPSBjaG9zZW4uZGVmYXVsdF90ZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgICAgcmVtb3ZlRW1wdHlNZXNzYWdlID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuYXR0cignZGF0YS1wbGFjZWhvbGRlcicsIGRlZmF1bHRUZXh0KTsKKyAgICAgICAgICB9OworICAgICAgICAgIGRpc2FibGVXaXRoTWVzc2FnZSA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgZW1wdHkgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuYXR0cignZGF0YS1wbGFjZWhvbGRlcicsIGNob3Nlbi5yZXN1bHRzX25vbmVfZm91bmQpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSkudHJpZ2dlcignY2hvc2VuOnVwZGF0ZWQnKTsKKyAgICAgICAgICB9OworICAgICAgICAgIGlmIChuZ01vZGVsKSB7CisgICAgICAgICAgICBvcmlnUmVuZGVyID0gbmdNb2RlbC4kcmVuZGVyOworICAgICAgICAgICAgbmdNb2RlbC4kcmVuZGVyID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgIG9yaWdSZW5kZXIoKTsKKyAgICAgICAgICAgICAgcmV0dXJuIGluaXRPclVwZGF0ZSgpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGlmIChhdHRyLm11bHRpcGxlKSB7CisgICAgICAgICAgICAgIHZpZXdXYXRjaCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZ01vZGVsLiR2aWV3VmFsdWU7CisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIHNjb3BlLiR3YXRjaCh2aWV3V2F0Y2gsIG5nTW9kZWwuJHJlbmRlciwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluaXRPclVwZGF0ZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBhdHRyLiRvYnNlcnZlKCdkaXNhYmxlZCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudHJpZ2dlcignY2hvc2VuOnVwZGF0ZWQnKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBpZiAoYXR0ci5uZ09wdGlvbnMgJiYgbmdNb2RlbCkgeworICAgICAgICAgICAgbWF0Y2ggPSBhdHRyLm5nT3B0aW9ucy5tYXRjaChOR19PUFRJT05TX1JFR0VYUCk7CisgICAgICAgICAgICB2YWx1ZXNFeHByID0gbWF0Y2hbN107CisgICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKHZhbHVlc0V4cHIsIGZ1bmN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7CisgICAgICAgICAgICAgIHZhciB0aW1lcjsKKyAgICAgICAgICAgICAgcmV0dXJuIHRpbWVyID0gJHRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNVbmRlZmluZWQobmV3VmFsKSkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0TG9hZGluZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRW1wdHlNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBzdG9wTG9hZGluZygpOworICAgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkobmV3VmFsKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZVdpdGhNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbihldmVudCkgeworICAgICAgICAgICAgICBpZiAodHlwZW9mIHRpbWVyICE9PSAidW5kZWZpbmVkIiAmJiB0aW1lciAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAkdGltZW91dC5jYW5jZWwodGltZXIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfQorICBdKTsKKworfSkuY2FsbCh0aGlzKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItY29va2llcy5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItY29va2llcy5qcwppbmRleCA0ZmZlYWU5Li42YWZhYmQ2IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9hbmd1bGFyLWNvb2tpZXMuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvYW5ndWxhci1jb29raWVzLmpzCkBAIC0xLDIyOSArMSwyMjkgQEAKLS8qDQotVGhlIE1JVCBMaWNlbnNlDQotDQotQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnDQotDQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0KLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsDQotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMNCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluDQotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQotDQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQotVEhFIFNPRlRXQVJFLg0KLSovDQotLyoqDQotICogQGxpY2Vuc2UgQW5ndWxhckpTIHYxLjMuOA0KLSAqIChjKSAyMDEwLTIwMTQgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnDQotICogTGljZW5zZTogTUlUDQotICovDQotKGZ1bmN0aW9uKHdpbmRvdywgYW5ndWxhciwgdW5kZWZpbmVkKSB7J3VzZSBzdHJpY3QnOw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBtb2R1bGUNCi0gKiBAbmFtZSBuZ0Nvb2tpZXMNCi0gKiBAZGVzY3JpcHRpb24NCi0gKg0KLSAqICMgbmdDb29raWVzDQotICoNCi0gKiBUaGUgYG5nQ29va2llc2AgbW9kdWxlIHByb3ZpZGVzIGEgY29udmVuaWVudCB3cmFwcGVyIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIGJyb3dzZXIgY29va2llcy4NCi0gKg0KLSAqDQotICogPGRpdiBkb2MtbW9kdWxlLWNvbXBvbmVudHM9Im5nQ29va2llcyI+PC9kaXY+DQotICoNCi0gKiBTZWUge0BsaW5rIG5nQ29va2llcy4kY29va2llcyBgJGNvb2tpZXNgfSBhbmQNCi0gKiB7QGxpbmsgbmdDb29raWVzLiRjb29raWVTdG9yZSBgJGNvb2tpZVN0b3JlYH0gZm9yIHVzYWdlLg0KLSAqLw0KLQ0KLQ0KLWFuZ3VsYXIubW9kdWxlKCduZ0Nvb2tpZXMnLCBbJ25nJ10pLg0KLSAgLyoqDQotICAgKiBAbmdkb2Mgc2VydmljZQ0KLSAgICogQG5hbWUgJGNvb2tpZXMNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFByb3ZpZGVzIHJlYWQvd3JpdGUgYWNjZXNzIHRvIGJyb3dzZXIncyBjb29raWVzLg0KLSAgICoNCi0gICAqIE9ubHkgYSBzaW1wbGUgT2JqZWN0IGlzIGV4cG9zZWQgYW5kIGJ5IGFkZGluZyBvciByZW1vdmluZyBwcm9wZXJ0aWVzIHRvL2Zyb20gdGhpcyBvYmplY3QsIG5ldw0KLSAgICogY29va2llcyBhcmUgY3JlYXRlZC9kZWxldGVkIGF0IHRoZSBlbmQgb2YgY3VycmVudCAkZXZhbC4NCi0gICAqIFRoZSBvYmplY3QncyBwcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHN0cmluZ3MuDQotICAgKg0KLSAgICogUmVxdWlyZXMgdGhlIHtAbGluayBuZ0Nvb2tpZXMgYG5nQ29va2llc2B9IG1vZHVsZSB0byBiZSBpbnN0YWxsZWQuDQotICAgKg0KLSAgICogQGV4YW1wbGUNCi0gICAqDQotICAgKiBgYGBqcw0KLSAgICogYW5ndWxhci5tb2R1bGUoJ2Nvb2tpZXNFeGFtcGxlJywgWyduZ0Nvb2tpZXMnXSkNCi0gICAqICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckY29va2llcycsIGZ1bmN0aW9uKCRjb29raWVzKSB7DQotICAgKiAgICAgLy8gUmV0cmlldmluZyBhIGNvb2tpZQ0KLSAgICogICAgIHZhciBmYXZvcml0ZUNvb2tpZSA9ICRjb29raWVzLm15RmF2b3JpdGU7DQotICAgKiAgICAgLy8gU2V0dGluZyBhIGNvb2tpZQ0KLSAgICogICAgICRjb29raWVzLm15RmF2b3JpdGUgPSAnb2F0bWVhbCc7DQotICAgKiAgIH1dKTsNCi0gICAqIGBgYA0KLSAgICovDQotICAgZmFjdG9yeSgnJGNvb2tpZXMnLCBbJyRyb290U2NvcGUnLCAnJGJyb3dzZXInLCBmdW5jdGlvbigkcm9vdFNjb3BlLCAkYnJvd3Nlcikgew0KLSAgICAgIHZhciBjb29raWVzID0ge30sDQotICAgICAgICAgIGxhc3RDb29raWVzID0ge30sDQotICAgICAgICAgIGxhc3RCcm93c2VyQ29va2llcywNCi0gICAgICAgICAgcnVuRXZhbCA9IGZhbHNlLA0KLSAgICAgICAgICBjb3B5ID0gYW5ndWxhci5jb3B5LA0KLSAgICAgICAgICBpc1VuZGVmaW5lZCA9IGFuZ3VsYXIuaXNVbmRlZmluZWQ7DQotDQotICAgICAgLy9jcmVhdGVzIGEgcG9sbGVyIGZuIHRoYXQgY29waWVzIGFsbCBjb29raWVzIGZyb20gdGhlICRicm93c2VyIHRvIHNlcnZpY2UgJiBpbml0cyB0aGUgc2VydmljZQ0KLSAgICAgICRicm93c2VyLmFkZFBvbGxGbihmdW5jdGlvbigpIHsNCi0gICAgICAgIHZhciBjdXJyZW50Q29va2llcyA9ICRicm93c2VyLmNvb2tpZXMoKTsNCi0gICAgICAgIGlmIChsYXN0QnJvd3NlckNvb2tpZXMgIT0gY3VycmVudENvb2tpZXMpIHsgLy9yZWxpZXMgb24gYnJvd3Nlci5jb29raWVzKCkgaW1wbA0KLSAgICAgICAgICBsYXN0QnJvd3NlckNvb2tpZXMgPSBjdXJyZW50Q29va2llczsNCi0gICAgICAgICAgY29weShjdXJyZW50Q29va2llcywgbGFzdENvb2tpZXMpOw0KLSAgICAgICAgICBjb3B5KGN1cnJlbnRDb29raWVzLCBjb29raWVzKTsNCi0gICAgICAgICAgaWYgKHJ1bkV2YWwpICRyb290U2NvcGUuJGFwcGx5KCk7DQotICAgICAgICB9DQotICAgICAgfSkoKTsNCi0NCi0gICAgICBydW5FdmFsID0gdHJ1ZTsNCi0NCi0gICAgICAvL2F0IHRoZSBlbmQgb2YgZWFjaCBldmFsLCBwdXNoIGNvb2tpZXMNCi0gICAgICAvL1RPRE86IHRoaXMgc2hvdWxkIGhhcHBlbiBiZWZvcmUgdGhlICJkZWxheWVkIiB3YXRjaGVzIGZpcmUsIGJlY2F1c2UgaWYgc29tZSBjb29raWVzIGFyZSBub3QNCi0gICAgICAvLyAgICAgIHN0cmluZ3Mgb3IgYnJvd3NlciByZWZ1c2VzIHRvIHN0b3JlIHNvbWUgY29va2llcywgd2UgdXBkYXRlIHRoZSBtb2RlbCBpbiB0aGUgcHVzaCBmbi4NCi0gICAgICAkcm9vdFNjb3BlLiR3YXRjaChwdXNoKTsNCi0NCi0gICAgICByZXR1cm4gY29va2llczsNCi0NCi0NCi0gICAgICAvKioNCi0gICAgICAgKiBQdXNoZXMgYWxsIHRoZSBjb29raWVzIGZyb20gdGhlIHNlcnZpY2UgdG8gdGhlIGJyb3dzZXIgYW5kIHZlcmlmaWVzIGlmIGFsbCBjb29raWVzIHdlcmUNCi0gICAgICAgKiBzdG9yZWQuDQotICAgICAgICovDQotICAgICAgZnVuY3Rpb24gcHVzaCgpIHsNCi0gICAgICAgIHZhciBuYW1lLA0KLSAgICAgICAgICAgIHZhbHVlLA0KLSAgICAgICAgICAgIGJyb3dzZXJDb29raWVzLA0KLSAgICAgICAgICAgIHVwZGF0ZWQ7DQotDQotICAgICAgICAvL2RlbGV0ZSBhbnkgY29va2llcyBkZWxldGVkIGluICRjb29raWVzDQotICAgICAgICBmb3IgKG5hbWUgaW4gbGFzdENvb2tpZXMpIHsNCi0gICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGNvb2tpZXNbbmFtZV0pKSB7DQotICAgICAgICAgICAgJGJyb3dzZXIuY29va2llcyhuYW1lLCB1bmRlZmluZWQpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvL3VwZGF0ZSBhbGwgY29va2llcyB1cGRhdGVkIGluICRjb29raWVzDQotICAgICAgICBmb3IgKG5hbWUgaW4gY29va2llcykgew0KLSAgICAgICAgICB2YWx1ZSA9IGNvb2tpZXNbbmFtZV07DQotICAgICAgICAgIGlmICghYW5ndWxhci5pc1N0cmluZyh2YWx1ZSkpIHsNCi0gICAgICAgICAgICB2YWx1ZSA9ICcnICsgdmFsdWU7DQotICAgICAgICAgICAgY29va2llc1tuYW1lXSA9IHZhbHVlOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbGFzdENvb2tpZXNbbmFtZV0pIHsNCi0gICAgICAgICAgICAkYnJvd3Nlci5jb29raWVzKG5hbWUsIHZhbHVlKTsNCi0gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy92ZXJpZnkgd2hhdCB3YXMgYWN0dWFsbHkgc3RvcmVkDQotICAgICAgICBpZiAodXBkYXRlZCkgew0KLSAgICAgICAgICB1cGRhdGVkID0gZmFsc2U7DQotICAgICAgICAgIGJyb3dzZXJDb29raWVzID0gJGJyb3dzZXIuY29va2llcygpOw0KLQ0KLSAgICAgICAgICBmb3IgKG5hbWUgaW4gY29va2llcykgew0KLSAgICAgICAgICAgIGlmIChjb29raWVzW25hbWVdICE9PSBicm93c2VyQ29va2llc1tuYW1lXSkgew0KLSAgICAgICAgICAgICAgLy9kZWxldGUgb3IgcmVzZXQgYWxsIGNvb2tpZXMgdGhhdCB0aGUgYnJvd3NlciBkcm9wcGVkIGZyb20gJGNvb2tpZXMNCi0gICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChicm93c2VyQ29va2llc1tuYW1lXSkpIHsNCi0gICAgICAgICAgICAgICAgZGVsZXRlIGNvb2tpZXNbbmFtZV07DQotICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjb29raWVzW25hbWVdID0gYnJvd3NlckNvb2tpZXNbbmFtZV07DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH1dKS4NCi0NCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIHNlcnZpY2UNCi0gICAqIEBuYW1lICRjb29raWVTdG9yZQ0KLSAgICogQHJlcXVpcmVzICRjb29raWVzDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBQcm92aWRlcyBhIGtleS12YWx1ZSAoc3RyaW5nLW9iamVjdCkgc3RvcmFnZSwgdGhhdCBpcyBiYWNrZWQgYnkgc2Vzc2lvbiBjb29raWVzLg0KLSAgICogT2JqZWN0cyBwdXQgb3IgcmV0cmlldmVkIGZyb20gdGhpcyBzdG9yYWdlIGFyZSBhdXRvbWF0aWNhbGx5IHNlcmlhbGl6ZWQgb3INCi0gICAqIGRlc2VyaWFsaXplZCBieSBhbmd1bGFyJ3MgdG9Kc29uL2Zyb21Kc29uLg0KLSAgICoNCi0gICAqIFJlcXVpcmVzIHRoZSB7QGxpbmsgbmdDb29raWVzIGBuZ0Nvb2tpZXNgfSBtb2R1bGUgdG8gYmUgaW5zdGFsbGVkLg0KLSAgICoNCi0gICAqIEBleGFtcGxlDQotICAgKg0KLSAgICogYGBganMNCi0gICAqIGFuZ3VsYXIubW9kdWxlKCdjb29raWVTdG9yZUV4YW1wbGUnLCBbJ25nQ29va2llcyddKQ0KLSAgICogICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRjb29raWVTdG9yZScsIGZ1bmN0aW9uKCRjb29raWVTdG9yZSkgew0KLSAgICogICAgIC8vIFB1dCBjb29raWUNCi0gICAqICAgICAkY29va2llU3RvcmUucHV0KCdteUZhdm9yaXRlJywnb2F0bWVhbCcpOw0KLSAgICogICAgIC8vIEdldCBjb29raWUNCi0gICAqICAgICB2YXIgZmF2b3JpdGVDb29raWUgPSAkY29va2llU3RvcmUuZ2V0KCdteUZhdm9yaXRlJyk7DQotICAgKiAgICAgLy8gUmVtb3ZpbmcgYSBjb29raWUNCi0gICAqICAgICAkY29va2llU3RvcmUucmVtb3ZlKCdteUZhdm9yaXRlJyk7DQotICAgKiAgIH1dKTsNCi0gICAqIGBgYA0KLSAgICovDQotICAgZmFjdG9yeSgnJGNvb2tpZVN0b3JlJywgWyckY29va2llcycsIGZ1bmN0aW9uKCRjb29raWVzKSB7DQotDQotICAgICAgcmV0dXJuIHsNCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAgICogQG5hbWUgJGNvb2tpZVN0b3JlI2dldA0KLSAgICAgICAgICoNCi0gICAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgZ2l2ZW4gY29va2llIGtleQ0KLSAgICAgICAgICoNCi0gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgSWQgdG8gdXNlIGZvciBsb29rdXAuDQotICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBEZXNlcmlhbGl6ZWQgY29va2llIHZhbHVlLg0KLSAgICAgICAgICovDQotICAgICAgICBnZXQ6IGZ1bmN0aW9uKGtleSkgew0KLSAgICAgICAgICB2YXIgdmFsdWUgPSAkY29va2llc1trZXldOw0KLSAgICAgICAgICByZXR1cm4gdmFsdWUgPyBhbmd1bGFyLmZyb21Kc29uKHZhbHVlKSA6IHZhbHVlOw0KLSAgICAgICAgfSwNCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAgICogQG5hbWUgJGNvb2tpZVN0b3JlI3B1dA0KLSAgICAgICAgICoNCi0gICAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAgICogU2V0cyBhIHZhbHVlIGZvciBnaXZlbiBjb29raWUga2V5DQotICAgICAgICAgKg0KLSAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBJZCBmb3IgdGhlIGB2YWx1ZWAuDQotICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgVmFsdWUgdG8gYmUgc3RvcmVkLg0KLSAgICAgICAgICovDQotICAgICAgICBwdXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsNCi0gICAgICAgICAgJGNvb2tpZXNba2V5XSA9IGFuZ3VsYXIudG9Kc29uKHZhbHVlKTsNCi0gICAgICAgIH0sDQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgICAqIEBuYW1lICRjb29raWVTdG9yZSNyZW1vdmUNCi0gICAgICAgICAqDQotICAgICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgICAqIFJlbW92ZSBnaXZlbiBjb29raWUNCi0gICAgICAgICAqDQotICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IElkIG9mIHRoZSBrZXktdmFsdWUgcGFpciB0byBkZWxldGUuDQotICAgICAgICAgKi8NCi0gICAgICAgIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7DQotICAgICAgICAgIGRlbGV0ZSAkY29va2llc1trZXldOw0KLSAgICAgICAgfQ0KLSAgICAgIH07DQotDQotICAgIH1dKTsNCi0NCi0NCi19KSh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKTsNCisvKgorVGhlIE1JVCBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKyovCisvKioKKyAqIEBsaWNlbnNlIEFuZ3VsYXJKUyB2MS4zLjgKKyAqIChjKSAyMDEwLTIwMTQgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnCisgKiBMaWNlbnNlOiBNSVQKKyAqLworKGZ1bmN0aW9uKHdpbmRvdywgYW5ndWxhciwgdW5kZWZpbmVkKSB7J3VzZSBzdHJpY3QnOworCisvKioKKyAqIEBuZ2RvYyBtb2R1bGUKKyAqIEBuYW1lIG5nQ29va2llcworICogQGRlc2NyaXB0aW9uCisgKgorICogIyBuZ0Nvb2tpZXMKKyAqCisgKiBUaGUgYG5nQ29va2llc2AgbW9kdWxlIHByb3ZpZGVzIGEgY29udmVuaWVudCB3cmFwcGVyIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIGJyb3dzZXIgY29va2llcy4KKyAqCisgKgorICogPGRpdiBkb2MtbW9kdWxlLWNvbXBvbmVudHM9Im5nQ29va2llcyI+PC9kaXY+CisgKgorICogU2VlIHtAbGluayBuZ0Nvb2tpZXMuJGNvb2tpZXMgYCRjb29raWVzYH0gYW5kCisgKiB7QGxpbmsgbmdDb29raWVzLiRjb29raWVTdG9yZSBgJGNvb2tpZVN0b3JlYH0gZm9yIHVzYWdlLgorICovCisKKworYW5ndWxhci5tb2R1bGUoJ25nQ29va2llcycsIFsnbmcnXSkuCisgIC8qKgorICAgKiBAbmdkb2Mgc2VydmljZQorICAgKiBAbmFtZSAkY29va2llcworICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogUHJvdmlkZXMgcmVhZC93cml0ZSBhY2Nlc3MgdG8gYnJvd3NlcidzIGNvb2tpZXMuCisgICAqCisgICAqIE9ubHkgYSBzaW1wbGUgT2JqZWN0IGlzIGV4cG9zZWQgYW5kIGJ5IGFkZGluZyBvciByZW1vdmluZyBwcm9wZXJ0aWVzIHRvL2Zyb20gdGhpcyBvYmplY3QsIG5ldworICAgKiBjb29raWVzIGFyZSBjcmVhdGVkL2RlbGV0ZWQgYXQgdGhlIGVuZCBvZiBjdXJyZW50ICRldmFsLgorICAgKiBUaGUgb2JqZWN0J3MgcHJvcGVydGllcyBjYW4gb25seSBiZSBzdHJpbmdzLgorICAgKgorICAgKiBSZXF1aXJlcyB0aGUge0BsaW5rIG5nQ29va2llcyBgbmdDb29raWVzYH0gbW9kdWxlIHRvIGJlIGluc3RhbGxlZC4KKyAgICoKKyAgICogQGV4YW1wbGUKKyAgICoKKyAgICogYGBganMKKyAgICogYW5ndWxhci5tb2R1bGUoJ2Nvb2tpZXNFeGFtcGxlJywgWyduZ0Nvb2tpZXMnXSkKKyAgICogICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRjb29raWVzJywgZnVuY3Rpb24oJGNvb2tpZXMpIHsKKyAgICogICAgIC8vIFJldHJpZXZpbmcgYSBjb29raWUKKyAgICogICAgIHZhciBmYXZvcml0ZUNvb2tpZSA9ICRjb29raWVzLm15RmF2b3JpdGU7CisgICAqICAgICAvLyBTZXR0aW5nIGEgY29va2llCisgICAqICAgICAkY29va2llcy5teUZhdm9yaXRlID0gJ29hdG1lYWwnOworICAgKiAgIH1dKTsKKyAgICogYGBgCisgICAqLworICAgZmFjdG9yeSgnJGNvb2tpZXMnLCBbJyRyb290U2NvcGUnLCAnJGJyb3dzZXInLCBmdW5jdGlvbigkcm9vdFNjb3BlLCAkYnJvd3NlcikgeworICAgICAgdmFyIGNvb2tpZXMgPSB7fSwKKyAgICAgICAgICBsYXN0Q29va2llcyA9IHt9LAorICAgICAgICAgIGxhc3RCcm93c2VyQ29va2llcywKKyAgICAgICAgICBydW5FdmFsID0gZmFsc2UsCisgICAgICAgICAgY29weSA9IGFuZ3VsYXIuY29weSwKKyAgICAgICAgICBpc1VuZGVmaW5lZCA9IGFuZ3VsYXIuaXNVbmRlZmluZWQ7CisKKyAgICAgIC8vY3JlYXRlcyBhIHBvbGxlciBmbiB0aGF0IGNvcGllcyBhbGwgY29va2llcyBmcm9tIHRoZSAkYnJvd3NlciB0byBzZXJ2aWNlICYgaW5pdHMgdGhlIHNlcnZpY2UKKyAgICAgICRicm93c2VyLmFkZFBvbGxGbihmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGN1cnJlbnRDb29raWVzID0gJGJyb3dzZXIuY29va2llcygpOworICAgICAgICBpZiAobGFzdEJyb3dzZXJDb29raWVzICE9IGN1cnJlbnRDb29raWVzKSB7IC8vcmVsaWVzIG9uIGJyb3dzZXIuY29va2llcygpIGltcGwKKyAgICAgICAgICBsYXN0QnJvd3NlckNvb2tpZXMgPSBjdXJyZW50Q29va2llczsKKyAgICAgICAgICBjb3B5KGN1cnJlbnRDb29raWVzLCBsYXN0Q29va2llcyk7CisgICAgICAgICAgY29weShjdXJyZW50Q29va2llcywgY29va2llcyk7CisgICAgICAgICAgaWYgKHJ1bkV2YWwpICRyb290U2NvcGUuJGFwcGx5KCk7CisgICAgICAgIH0KKyAgICAgIH0pKCk7CisKKyAgICAgIHJ1bkV2YWwgPSB0cnVlOworCisgICAgICAvL2F0IHRoZSBlbmQgb2YgZWFjaCBldmFsLCBwdXNoIGNvb2tpZXMKKyAgICAgIC8vVE9ETzogdGhpcyBzaG91bGQgaGFwcGVuIGJlZm9yZSB0aGUgImRlbGF5ZWQiIHdhdGNoZXMgZmlyZSwgYmVjYXVzZSBpZiBzb21lIGNvb2tpZXMgYXJlIG5vdAorICAgICAgLy8gICAgICBzdHJpbmdzIG9yIGJyb3dzZXIgcmVmdXNlcyB0byBzdG9yZSBzb21lIGNvb2tpZXMsIHdlIHVwZGF0ZSB0aGUgbW9kZWwgaW4gdGhlIHB1c2ggZm4uCisgICAgICAkcm9vdFNjb3BlLiR3YXRjaChwdXNoKTsKKworICAgICAgcmV0dXJuIGNvb2tpZXM7CisKKworICAgICAgLyoqCisgICAgICAgKiBQdXNoZXMgYWxsIHRoZSBjb29raWVzIGZyb20gdGhlIHNlcnZpY2UgdG8gdGhlIGJyb3dzZXIgYW5kIHZlcmlmaWVzIGlmIGFsbCBjb29raWVzIHdlcmUKKyAgICAgICAqIHN0b3JlZC4KKyAgICAgICAqLworICAgICAgZnVuY3Rpb24gcHVzaCgpIHsKKyAgICAgICAgdmFyIG5hbWUsCisgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgIGJyb3dzZXJDb29raWVzLAorICAgICAgICAgICAgdXBkYXRlZDsKKworICAgICAgICAvL2RlbGV0ZSBhbnkgY29va2llcyBkZWxldGVkIGluICRjb29raWVzCisgICAgICAgIGZvciAobmFtZSBpbiBsYXN0Q29va2llcykgeworICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChjb29raWVzW25hbWVdKSkgeworICAgICAgICAgICAgJGJyb3dzZXIuY29va2llcyhuYW1lLCB1bmRlZmluZWQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vdXBkYXRlIGFsbCBjb29raWVzIHVwZGF0ZWQgaW4gJGNvb2tpZXMKKyAgICAgICAgZm9yIChuYW1lIGluIGNvb2tpZXMpIHsKKyAgICAgICAgICB2YWx1ZSA9IGNvb2tpZXNbbmFtZV07CisgICAgICAgICAgaWYgKCFhbmd1bGFyLmlzU3RyaW5nKHZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSAnJyArIHZhbHVlOworICAgICAgICAgICAgY29va2llc1tuYW1lXSA9IHZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAodmFsdWUgIT09IGxhc3RDb29raWVzW25hbWVdKSB7CisgICAgICAgICAgICAkYnJvd3Nlci5jb29raWVzKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vdmVyaWZ5IHdoYXQgd2FzIGFjdHVhbGx5IHN0b3JlZAorICAgICAgICBpZiAodXBkYXRlZCkgeworICAgICAgICAgIHVwZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgICBicm93c2VyQ29va2llcyA9ICRicm93c2VyLmNvb2tpZXMoKTsKKworICAgICAgICAgIGZvciAobmFtZSBpbiBjb29raWVzKSB7CisgICAgICAgICAgICBpZiAoY29va2llc1tuYW1lXSAhPT0gYnJvd3NlckNvb2tpZXNbbmFtZV0pIHsKKyAgICAgICAgICAgICAgLy9kZWxldGUgb3IgcmVzZXQgYWxsIGNvb2tpZXMgdGhhdCB0aGUgYnJvd3NlciBkcm9wcGVkIGZyb20gJGNvb2tpZXMKKyAgICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGJyb3dzZXJDb29raWVzW25hbWVdKSkgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBjb29raWVzW25hbWVdOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvb2tpZXNbbmFtZV0gPSBicm93c2VyQ29va2llc1tuYW1lXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9XSkuCisKKworICAvKioKKyAgICogQG5nZG9jIHNlcnZpY2UKKyAgICogQG5hbWUgJGNvb2tpZVN0b3JlCisgICAqIEByZXF1aXJlcyAkY29va2llcworICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogUHJvdmlkZXMgYSBrZXktdmFsdWUgKHN0cmluZy1vYmplY3QpIHN0b3JhZ2UsIHRoYXQgaXMgYmFja2VkIGJ5IHNlc3Npb24gY29va2llcy4KKyAgICogT2JqZWN0cyBwdXQgb3IgcmV0cmlldmVkIGZyb20gdGhpcyBzdG9yYWdlIGFyZSBhdXRvbWF0aWNhbGx5IHNlcmlhbGl6ZWQgb3IKKyAgICogZGVzZXJpYWxpemVkIGJ5IGFuZ3VsYXIncyB0b0pzb24vZnJvbUpzb24uCisgICAqCisgICAqIFJlcXVpcmVzIHRoZSB7QGxpbmsgbmdDb29raWVzIGBuZ0Nvb2tpZXNgfSBtb2R1bGUgdG8gYmUgaW5zdGFsbGVkLgorICAgKgorICAgKiBAZXhhbXBsZQorICAgKgorICAgKiBgYGBqcworICAgKiBhbmd1bGFyLm1vZHVsZSgnY29va2llU3RvcmVFeGFtcGxlJywgWyduZ0Nvb2tpZXMnXSkKKyAgICogICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRjb29raWVTdG9yZScsIGZ1bmN0aW9uKCRjb29raWVTdG9yZSkgeworICAgKiAgICAgLy8gUHV0IGNvb2tpZQorICAgKiAgICAgJGNvb2tpZVN0b3JlLnB1dCgnbXlGYXZvcml0ZScsJ29hdG1lYWwnKTsKKyAgICogICAgIC8vIEdldCBjb29raWUKKyAgICogICAgIHZhciBmYXZvcml0ZUNvb2tpZSA9ICRjb29raWVTdG9yZS5nZXQoJ215RmF2b3JpdGUnKTsKKyAgICogICAgIC8vIFJlbW92aW5nIGEgY29va2llCisgICAqICAgICAkY29va2llU3RvcmUucmVtb3ZlKCdteUZhdm9yaXRlJyk7CisgICAqICAgfV0pOworICAgKiBgYGAKKyAgICovCisgICBmYWN0b3J5KCckY29va2llU3RvcmUnLCBbJyRjb29raWVzJywgZnVuY3Rpb24oJGNvb2tpZXMpIHsKKworICAgICAgcmV0dXJuIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAgICogQG5hbWUgJGNvb2tpZVN0b3JlI2dldAorICAgICAgICAgKgorICAgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgZ2l2ZW4gY29va2llIGtleQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IElkIHRvIHVzZSBmb3IgbG9va3VwLgorICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBEZXNlcmlhbGl6ZWQgY29va2llIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKKyAgICAgICAgICB2YXIgdmFsdWUgPSAkY29va2llc1trZXldOworICAgICAgICAgIHJldHVybiB2YWx1ZSA/IGFuZ3VsYXIuZnJvbUpzb24odmFsdWUpIDogdmFsdWU7CisgICAgICAgIH0sCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAgICogQG5hbWUgJGNvb2tpZVN0b3JlI3B1dAorICAgICAgICAgKgorICAgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAgICogU2V0cyBhIHZhbHVlIGZvciBnaXZlbiBjb29raWUga2V5CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgSWQgZm9yIHRoZSBgdmFsdWVgLgorICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgVmFsdWUgdG8gYmUgc3RvcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHV0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgICAgICAgJGNvb2tpZXNba2V5XSA9IGFuZ3VsYXIudG9Kc29uKHZhbHVlKTsKKyAgICAgICAgfSwKKworICAgICAgICAvKioKKyAgICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICAgKiBAbmFtZSAkY29va2llU3RvcmUjcmVtb3ZlCisgICAgICAgICAqCisgICAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICAgKiBSZW1vdmUgZ2l2ZW4gY29va2llCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgSWQgb2YgdGhlIGtleS12YWx1ZSBwYWlyIHRvIGRlbGV0ZS4KKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7CisgICAgICAgICAgZGVsZXRlICRjb29raWVzW2tleV07CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICB9XSk7CisKKworfSkod2luZG93LCB3aW5kb3cuYW5ndWxhcik7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9hbmd1bGFyLWNvb2tpZXMubWluLmpzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvYW5ndWxhci1jb29raWVzLm1pbi5qcwppbmRleCBhYTYzMjc3Li5jYjFmY2U2IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9hbmd1bGFyLWNvb2tpZXMubWluLmpzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItY29va2llcy5taW4uanMKQEAgLTEsMzEgKzEsMzEgQEAKLS8qDQotVGhlIE1JVCBMaWNlbnNlDQotDQotQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnDQotDQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0KLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsDQotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMNCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluDQotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQotDQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQotVEhFIFNPRlRXQVJFLg0KLSovDQotLyoNCi0gQW5ndWxhckpTIHYxLjMuOA0KLSAoYykgMjAxMC0yMDE0IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZw0KLSBMaWNlbnNlOiBNSVQNCi0qLw0KLShmdW5jdGlvbihwLGYsbil7J3VzZSBzdHJpY3QnO2YubW9kdWxlKCJuZ0Nvb2tpZXMiLFsibmciXSkuZmFjdG9yeSgiJGNvb2tpZXMiLFsiJHJvb3RTY29wZSIsIiRicm93c2VyIixmdW5jdGlvbihlLGIpe3ZhciBjPXt9LGc9e30saCxrPSExLGw9Zi5jb3B5LG09Zi5pc1VuZGVmaW5lZDtiLmFkZFBvbGxGbihmdW5jdGlvbigpe3ZhciBhPWIuY29va2llcygpO2ghPWEmJihoPWEsbChhLGcpLGwoYSxjKSxrJiZlLiRhcHBseSgpKX0pKCk7az0hMDtlLiR3YXRjaChmdW5jdGlvbigpe3ZhciBhLGQsZTtmb3IoYSBpbiBnKW0oY1thXSkmJmIuY29va2llcyhhLG4pO2ZvcihhIGluIGMpZD1jW2FdLGYuaXNTdHJpbmcoZCl8fChkPSIiK2QsY1thXT1kKSxkIT09Z1thXSYmKGIuY29va2llcyhhLGQpLGU9ITApO2lmKGUpZm9yKGEgaW4gZD1iLmNvb2tpZXMoKSxjKWNbYV0hPT1kW2FdJiYobShkW2FdKT9kZWxldGUgY1thXTpjW2FdPWRbYV0pfSk7cmV0dXJuIGN9XSkuZmFjdG9yeSgiJGNvb2tpZVN0b3JlIiwNCi1bIiRjb29raWVzIixmdW5jdGlvbihlKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKGIpe3JldHVybihiPWVbYl0pP2YuZnJvbUpzb24oYik6Yn0scHV0OmZ1bmN0aW9uKGIsYyl7ZVtiXT1mLnRvSnNvbihjKX0scmVtb3ZlOmZ1bmN0aW9uKGIpe2RlbGV0ZSBlW2JdfX19XSl9KSh3aW5kb3csd2luZG93LmFuZ3VsYXIpOw0KLS8vIyBzb3VyY2VNYXBwaW5nVVJMPWFuZ3VsYXItY29va2llcy5taW4uanMubWFwDQorLyoKK1RoZSBNSVQgTGljZW5zZQorCitDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmcKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCisqLworLyoKKyBBbmd1bGFySlMgdjEuMy44CisgKGMpIDIwMTAtMjAxNCBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmcKKyBMaWNlbnNlOiBNSVQKKyovCisoZnVuY3Rpb24ocCxmLG4peyd1c2Ugc3RyaWN0JztmLm1vZHVsZSgibmdDb29raWVzIixbIm5nIl0pLmZhY3RvcnkoIiRjb29raWVzIixbIiRyb290U2NvcGUiLCIkYnJvd3NlciIsZnVuY3Rpb24oZSxiKXt2YXIgYz17fSxnPXt9LGgsaz0hMSxsPWYuY29weSxtPWYuaXNVbmRlZmluZWQ7Yi5hZGRQb2xsRm4oZnVuY3Rpb24oKXt2YXIgYT1iLmNvb2tpZXMoKTtoIT1hJiYoaD1hLGwoYSxnKSxsKGEsYyksayYmZS4kYXBwbHkoKSl9KSgpO2s9ITA7ZS4kd2F0Y2goZnVuY3Rpb24oKXt2YXIgYSxkLGU7Zm9yKGEgaW4gZyltKGNbYV0pJiZiLmNvb2tpZXMoYSxuKTtmb3IoYSBpbiBjKWQ9Y1thXSxmLmlzU3RyaW5nKGQpfHwoZD0iIitkLGNbYV09ZCksZCE9PWdbYV0mJihiLmNvb2tpZXMoYSxkKSxlPSEwKTtpZihlKWZvcihhIGluIGQ9Yi5jb29raWVzKCksYyljW2FdIT09ZFthXSYmKG0oZFthXSk/ZGVsZXRlIGNbYV06Y1thXT1kW2FdKX0pO3JldHVybiBjfV0pLmZhY3RvcnkoIiRjb29raWVTdG9yZSIsCitbIiRjb29raWVzIixmdW5jdGlvbihlKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKGIpe3JldHVybihiPWVbYl0pP2YuZnJvbUpzb24oYik6Yn0scHV0OmZ1bmN0aW9uKGIsYyl7ZVtiXT1mLnRvSnNvbihjKX0scmVtb3ZlOmZ1bmN0aW9uKGIpe2RlbGV0ZSBlW2JdfX19XSl9KSh3aW5kb3csd2luZG93LmFuZ3VsYXIpOworLy8jIHNvdXJjZU1hcHBpbmdVUkw9YW5ndWxhci1jb29raWVzLm1pbi5qcy5tYXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItcmVzb3VyY2UubWluLmpzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvYW5ndWxhci1yZXNvdXJjZS5taW4uanMKaW5kZXggMWNhYWIxMC4uMDViNmQ0YyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvYW5ndWxhci1yZXNvdXJjZS5taW4uanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvYW5ndWxhci1yZXNvdXJjZS5taW4uanMKQEAgLTEsMzYgKzEsMzYgQEAKLS8qDQotVGhlIE1JVCBMaWNlbnNlDQotDQotQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnDQotDQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0KLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsDQotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMNCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluDQotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQotDQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQotVEhFIFNPRlRXQVJFLg0KLSovDQotLyoNCi0gQW5ndWxhckpTIHYxLjMuOA0KLSAoYykgMjAxMC0yMDE0IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZw0KLSBMaWNlbnNlOiBNSVQNCi0qLw0KLShmdW5jdGlvbihJLGQsQil7J3VzZSBzdHJpY3QnO2Z1bmN0aW9uIEQoZixxKXtxPXF8fHt9O2QuZm9yRWFjaChxLGZ1bmN0aW9uKGQsaCl7ZGVsZXRlIHFbaF19KTtmb3IodmFyIGggaW4gZikhZi5oYXNPd25Qcm9wZXJ0eShoKXx8IiQiPT09aC5jaGFyQXQoMCkmJiIkIj09PWguY2hhckF0KDEpfHwocVtoXT1mW2hdKTtyZXR1cm4gcX12YXIgdz1kLiQkbWluRXJyKCIkcmVzb3VyY2UiKSxDPS9eKFwuW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qKSskLztkLm1vZHVsZSgibmdSZXNvdXJjZSIsWyJuZyJdKS5wcm92aWRlcigiJHJlc291cmNlIixmdW5jdGlvbigpe3ZhciBmPXRoaXM7dGhpcy5kZWZhdWx0cz17c3RyaXBUcmFpbGluZ1NsYXNoZXM6ITAsYWN0aW9uczp7Z2V0OnttZXRob2Q6IkdFVCJ9LHNhdmU6e21ldGhvZDoiUE9TVCJ9LHF1ZXJ5OnttZXRob2Q6IkdFVCIsaXNBcnJheTohMH0scmVtb3ZlOnttZXRob2Q6IkRFTEVURSJ9LCJkZWxldGUiOnttZXRob2Q6IkRFTEVURSJ9fX07DQotdGhpcy4kZ2V0PVsiJGh0dHAiLCIkcSIsZnVuY3Rpb24ocSxoKXtmdW5jdGlvbiB0KGQsZyl7dGhpcy50ZW1wbGF0ZT1kO3RoaXMuZGVmYXVsdHM9cyh7fSxmLmRlZmF1bHRzLGcpO3RoaXMudXJsUGFyYW1zPXt9fWZ1bmN0aW9uIHYoeCxnLGwsbSl7ZnVuY3Rpb24gYyhiLGspe3ZhciBjPXt9O2s9cyh7fSxnLGspO3IoayxmdW5jdGlvbihhLGspe3UoYSkmJihhPWEoKSk7dmFyIGQ7aWYoYSYmYS5jaGFyQXQmJiJAIj09YS5jaGFyQXQoMCkpe2Q9Yjt2YXIgZT1hLnN1YnN0cigxKTtpZihudWxsPT1lfHwiIj09PWV8fCJoYXNPd25Qcm9wZXJ0eSI9PT1lfHwhQy50ZXN0KCIuIitlKSl0aHJvdyB3KCJiYWRtZW1iZXIiLGUpO2Zvcih2YXIgZT1lLnNwbGl0KCIuIiksbj0wLGc9ZS5sZW5ndGg7bjxnJiZkIT09QjtuKyspe3ZhciBoPWVbbl07ZD1udWxsIT09ZD9kW2hdOkJ9fWVsc2UgZD1hO2Nba109ZH0pO3JldHVybiBjfWZ1bmN0aW9uIEYoYil7cmV0dXJuIGIucmVzb3VyY2V9ZnVuY3Rpb24gZShiKXtEKGJ8fA0KLXt9LHRoaXMpfXZhciBHPW5ldyB0KHgsbSk7bD1zKHt9LGYuZGVmYXVsdHMuYWN0aW9ucyxsKTtlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYj1zKHt9LHRoaXMpO2RlbGV0ZSBiLiRwcm9taXNlO2RlbGV0ZSBiLiRyZXNvbHZlZDtyZXR1cm4gYn07cihsLGZ1bmN0aW9uKGIsayl7dmFyIGc9L14oUE9TVHxQVVR8UEFUQ0gpJC9pLnRlc3QoYi5tZXRob2QpO2Vba109ZnVuY3Rpb24oYSx5LG0seCl7dmFyIG49e30sZixsLHo7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgNDp6PXgsbD1tO2Nhc2UgMzpjYXNlIDI6aWYodSh5KSl7aWYodShhKSl7bD1hO3o9eTticmVha31sPXk7ej1tfWVsc2V7bj1hO2Y9eTtsPW07YnJlYWt9Y2FzZSAxOnUoYSk/bD1hOmc/Zj1hOm49YTticmVhaztjYXNlIDA6YnJlYWs7ZGVmYXVsdDp0aHJvdyB3KCJiYWRhcmdzIixhcmd1bWVudHMubGVuZ3RoKTt9dmFyIHQ9dGhpcyBpbnN0YW5jZW9mIGUscD10P2Y6Yi5pc0FycmF5P1tdOm5ldyBlKGYpLA0KLUE9e30sdj1iLmludGVyY2VwdG9yJiZiLmludGVyY2VwdG9yLnJlc3BvbnNlfHxGLEM9Yi5pbnRlcmNlcHRvciYmYi5pbnRlcmNlcHRvci5yZXNwb25zZUVycm9yfHxCO3IoYixmdW5jdGlvbihiLGEpeyJwYXJhbXMiIT1hJiYiaXNBcnJheSIhPWEmJiJpbnRlcmNlcHRvciIhPWEmJihBW2FdPUgoYikpfSk7ZyYmKEEuZGF0YT1mKTtHLnNldFVybFBhcmFtcyhBLHMoe30sYyhmLGIucGFyYW1zfHx7fSksbiksYi51cmwpO249cShBKS50aGVuKGZ1bmN0aW9uKGEpe3ZhciBjPWEuZGF0YSxnPXAuJHByb21pc2U7aWYoYyl7aWYoZC5pc0FycmF5KGMpIT09ISFiLmlzQXJyYXkpdGhyb3cgdygiYmFkY2ZnIixrLGIuaXNBcnJheT8iYXJyYXkiOiJvYmplY3QiLGQuaXNBcnJheShjKT8iYXJyYXkiOiJvYmplY3QiKTtiLmlzQXJyYXk/KHAubGVuZ3RoPTAscihjLGZ1bmN0aW9uKGEpeyJvYmplY3QiPT09dHlwZW9mIGE/cC5wdXNoKG5ldyBlKGEpKTpwLnB1c2goYSl9KSk6KEQoYyxwKSxwLiRwcm9taXNlPQ0KLWcpfXAuJHJlc29sdmVkPSEwO2EucmVzb3VyY2U9cDtyZXR1cm4gYX0sZnVuY3Rpb24oYSl7cC4kcmVzb2x2ZWQ9ITA7KHp8fEUpKGEpO3JldHVybiBoLnJlamVjdChhKX0pO249bi50aGVuKGZ1bmN0aW9uKGEpe3ZhciBiPXYoYSk7KGx8fEUpKGIsYS5oZWFkZXJzKTtyZXR1cm4gYn0sQyk7cmV0dXJuIHQ/bjoocC4kcHJvbWlzZT1uLHAuJHJlc29sdmVkPSExLHApfTtlLnByb3RvdHlwZVsiJCIra109ZnVuY3Rpb24oYSxiLGMpe3UoYSkmJihjPWIsYj1hLGE9e30pO2E9ZVtrXS5jYWxsKHRoaXMsYSx0aGlzLGIsYyk7cmV0dXJuIGEuJHByb21pc2V8fGF9fSk7ZS5iaW5kPWZ1bmN0aW9uKGIpe3JldHVybiB2KHgscyh7fSxnLGIpLGwpfTtyZXR1cm4gZX12YXIgRT1kLm5vb3Ascj1kLmZvckVhY2gscz1kLmV4dGVuZCxIPWQuY29weSx1PWQuaXNGdW5jdGlvbjt0LnByb3RvdHlwZT17c2V0VXJsUGFyYW1zOmZ1bmN0aW9uKGYsZyxsKXt2YXIgbT10aGlzLGM9bHx8bS50ZW1wbGF0ZSxoLA0KLWUscT1tLnVybFBhcmFtcz17fTtyKGMuc3BsaXQoL1xXLyksZnVuY3Rpb24oYil7aWYoImhhc093blByb3BlcnR5Ij09PWIpdGhyb3cgdygiYmFkbmFtZSIpOyEvXlxkKyQvLnRlc3QoYikmJmImJihuZXcgUmVnRXhwKCIoXnxbXlxcXFxdKToiK2IrIihcXFd8JCkiKSkudGVzdChjKSYmKHFbYl09ITApfSk7Yz1jLnJlcGxhY2UoL1xcOi9nLCI6Iik7Zz1nfHx7fTtyKG0udXJsUGFyYW1zLGZ1bmN0aW9uKGIsayl7aD1nLmhhc093blByb3BlcnR5KGspP2dba106bS5kZWZhdWx0c1trXTtkLmlzRGVmaW5lZChoKSYmbnVsbCE9PWg/KGU9ZW5jb2RlVVJJQ29tcG9uZW50KGgpLnJlcGxhY2UoLyU0MC9naSwiQCIpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTIwL2csIiUyMCIpLnJlcGxhY2UoLyUyNi9naSwiJiIpLnJlcGxhY2UoLyUzRC9naSwiPSIpLnJlcGxhY2UoLyUyQi9naSwiKyIpLGM9Yy5yZXBsYWNlKG5ldyBSZWdFeHAoIjoiKw0KLWsrIihcXFd8JCkiLCJnIiksZnVuY3Rpb24oYixhKXtyZXR1cm4gZSthfSkpOmM9Yy5yZXBsYWNlKG5ldyBSZWdFeHAoIigvPyk6IitrKyIoXFxXfCQpIiwiZyIpLGZ1bmN0aW9uKGIsYSxjKXtyZXR1cm4iLyI9PWMuY2hhckF0KDApP2M6YStjfSl9KTttLmRlZmF1bHRzLnN0cmlwVHJhaWxpbmdTbGFzaGVzJiYoYz1jLnJlcGxhY2UoL1wvKyQvLCIiKXx8Ii8iKTtjPWMucmVwbGFjZSgvXC9cLig/PVx3KygkfFw/KSkvLCIuIik7Zi51cmw9Yy5yZXBsYWNlKC9cL1xcXC4vLCIvLiIpO3IoZyxmdW5jdGlvbihiLGMpe20udXJsUGFyYW1zW2NdfHwoZi5wYXJhbXM9Zi5wYXJhbXN8fHt9LGYucGFyYW1zW2NdPWIpfSl9fTtyZXR1cm4gdn1dfSl9KSh3aW5kb3csd2luZG93LmFuZ3VsYXIpOw0KLS8vIyBzb3VyY2VNYXBwaW5nVVJMPWFuZ3VsYXItcmVzb3VyY2UubWluLmpzLm1hcA0KKy8qCitUaGUgTUlUIExpY2Vuc2UKKworQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorKi8KKy8qCisgQW5ndWxhckpTIHYxLjMuOAorIChjKSAyMDEwLTIwMTQgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnCisgTGljZW5zZTogTUlUCisqLworKGZ1bmN0aW9uKEksZCxCKXsndXNlIHN0cmljdCc7ZnVuY3Rpb24gRChmLHEpe3E9cXx8e307ZC5mb3JFYWNoKHEsZnVuY3Rpb24oZCxoKXtkZWxldGUgcVtoXX0pO2Zvcih2YXIgaCBpbiBmKSFmLmhhc093blByb3BlcnR5KGgpfHwiJCI9PT1oLmNoYXJBdCgwKSYmIiQiPT09aC5jaGFyQXQoMSl8fChxW2hdPWZbaF0pO3JldHVybiBxfXZhciB3PWQuJCRtaW5FcnIoIiRyZXNvdXJjZSIpLEM9L14oXC5bYS16QS1aXyRdWzAtOWEtekEtWl8kXSopKyQvO2QubW9kdWxlKCJuZ1Jlc291cmNlIixbIm5nIl0pLnByb3ZpZGVyKCIkcmVzb3VyY2UiLGZ1bmN0aW9uKCl7dmFyIGY9dGhpczt0aGlzLmRlZmF1bHRzPXtzdHJpcFRyYWlsaW5nU2xhc2hlczohMCxhY3Rpb25zOntnZXQ6e21ldGhvZDoiR0VUIn0sc2F2ZTp7bWV0aG9kOiJQT1NUIn0scXVlcnk6e21ldGhvZDoiR0VUIixpc0FycmF5OiEwfSxyZW1vdmU6e21ldGhvZDoiREVMRVRFIn0sImRlbGV0ZSI6e21ldGhvZDoiREVMRVRFIn19fTsKK3RoaXMuJGdldD1bIiRodHRwIiwiJHEiLGZ1bmN0aW9uKHEsaCl7ZnVuY3Rpb24gdChkLGcpe3RoaXMudGVtcGxhdGU9ZDt0aGlzLmRlZmF1bHRzPXMoe30sZi5kZWZhdWx0cyxnKTt0aGlzLnVybFBhcmFtcz17fX1mdW5jdGlvbiB2KHgsZyxsLG0pe2Z1bmN0aW9uIGMoYixrKXt2YXIgYz17fTtrPXMoe30sZyxrKTtyKGssZnVuY3Rpb24oYSxrKXt1KGEpJiYoYT1hKCkpO3ZhciBkO2lmKGEmJmEuY2hhckF0JiYiQCI9PWEuY2hhckF0KDApKXtkPWI7dmFyIGU9YS5zdWJzdHIoMSk7aWYobnVsbD09ZXx8IiI9PT1lfHwiaGFzT3duUHJvcGVydHkiPT09ZXx8IUMudGVzdCgiLiIrZSkpdGhyb3cgdygiYmFkbWVtYmVyIixlKTtmb3IodmFyIGU9ZS5zcGxpdCgiLiIpLG49MCxnPWUubGVuZ3RoO248ZyYmZCE9PUI7bisrKXt2YXIgaD1lW25dO2Q9bnVsbCE9PWQ/ZFtoXTpCfX1lbHNlIGQ9YTtjW2tdPWR9KTtyZXR1cm4gY31mdW5jdGlvbiBGKGIpe3JldHVybiBiLnJlc291cmNlfWZ1bmN0aW9uIGUoYil7RChifHwKK3t9LHRoaXMpfXZhciBHPW5ldyB0KHgsbSk7bD1zKHt9LGYuZGVmYXVsdHMuYWN0aW9ucyxsKTtlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYj1zKHt9LHRoaXMpO2RlbGV0ZSBiLiRwcm9taXNlO2RlbGV0ZSBiLiRyZXNvbHZlZDtyZXR1cm4gYn07cihsLGZ1bmN0aW9uKGIsayl7dmFyIGc9L14oUE9TVHxQVVR8UEFUQ0gpJC9pLnRlc3QoYi5tZXRob2QpO2Vba109ZnVuY3Rpb24oYSx5LG0seCl7dmFyIG49e30sZixsLHo7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgNDp6PXgsbD1tO2Nhc2UgMzpjYXNlIDI6aWYodSh5KSl7aWYodShhKSl7bD1hO3o9eTticmVha31sPXk7ej1tfWVsc2V7bj1hO2Y9eTtsPW07YnJlYWt9Y2FzZSAxOnUoYSk/bD1hOmc/Zj1hOm49YTticmVhaztjYXNlIDA6YnJlYWs7ZGVmYXVsdDp0aHJvdyB3KCJiYWRhcmdzIixhcmd1bWVudHMubGVuZ3RoKTt9dmFyIHQ9dGhpcyBpbnN0YW5jZW9mIGUscD10P2Y6Yi5pc0FycmF5P1tdOm5ldyBlKGYpLAorQT17fSx2PWIuaW50ZXJjZXB0b3ImJmIuaW50ZXJjZXB0b3IucmVzcG9uc2V8fEYsQz1iLmludGVyY2VwdG9yJiZiLmludGVyY2VwdG9yLnJlc3BvbnNlRXJyb3J8fEI7cihiLGZ1bmN0aW9uKGIsYSl7InBhcmFtcyIhPWEmJiJpc0FycmF5IiE9YSYmImludGVyY2VwdG9yIiE9YSYmKEFbYV09SChiKSl9KTtnJiYoQS5kYXRhPWYpO0cuc2V0VXJsUGFyYW1zKEEscyh7fSxjKGYsYi5wYXJhbXN8fHt9KSxuKSxiLnVybCk7bj1xKEEpLnRoZW4oZnVuY3Rpb24oYSl7dmFyIGM9YS5kYXRhLGc9cC4kcHJvbWlzZTtpZihjKXtpZihkLmlzQXJyYXkoYykhPT0hIWIuaXNBcnJheSl0aHJvdyB3KCJiYWRjZmciLGssYi5pc0FycmF5PyJhcnJheSI6Im9iamVjdCIsZC5pc0FycmF5KGMpPyJhcnJheSI6Im9iamVjdCIpO2IuaXNBcnJheT8ocC5sZW5ndGg9MCxyKGMsZnVuY3Rpb24oYSl7Im9iamVjdCI9PT10eXBlb2YgYT9wLnB1c2gobmV3IGUoYSkpOnAucHVzaChhKX0pKTooRChjLHApLHAuJHByb21pc2U9CitnKX1wLiRyZXNvbHZlZD0hMDthLnJlc291cmNlPXA7cmV0dXJuIGF9LGZ1bmN0aW9uKGEpe3AuJHJlc29sdmVkPSEwOyh6fHxFKShhKTtyZXR1cm4gaC5yZWplY3QoYSl9KTtuPW4udGhlbihmdW5jdGlvbihhKXt2YXIgYj12KGEpOyhsfHxFKShiLGEuaGVhZGVycyk7cmV0dXJuIGJ9LEMpO3JldHVybiB0P246KHAuJHByb21pc2U9bixwLiRyZXNvbHZlZD0hMSxwKX07ZS5wcm90b3R5cGVbIiQiK2tdPWZ1bmN0aW9uKGEsYixjKXt1KGEpJiYoYz1iLGI9YSxhPXt9KTthPWVba10uY2FsbCh0aGlzLGEsdGhpcyxiLGMpO3JldHVybiBhLiRwcm9taXNlfHxhfX0pO2UuYmluZD1mdW5jdGlvbihiKXtyZXR1cm4gdih4LHMoe30sZyxiKSxsKX07cmV0dXJuIGV9dmFyIEU9ZC5ub29wLHI9ZC5mb3JFYWNoLHM9ZC5leHRlbmQsSD1kLmNvcHksdT1kLmlzRnVuY3Rpb247dC5wcm90b3R5cGU9e3NldFVybFBhcmFtczpmdW5jdGlvbihmLGcsbCl7dmFyIG09dGhpcyxjPWx8fG0udGVtcGxhdGUsaCwKK2UscT1tLnVybFBhcmFtcz17fTtyKGMuc3BsaXQoL1xXLyksZnVuY3Rpb24oYil7aWYoImhhc093blByb3BlcnR5Ij09PWIpdGhyb3cgdygiYmFkbmFtZSIpOyEvXlxkKyQvLnRlc3QoYikmJmImJihuZXcgUmVnRXhwKCIoXnxbXlxcXFxdKToiK2IrIihcXFd8JCkiKSkudGVzdChjKSYmKHFbYl09ITApfSk7Yz1jLnJlcGxhY2UoL1xcOi9nLCI6Iik7Zz1nfHx7fTtyKG0udXJsUGFyYW1zLGZ1bmN0aW9uKGIsayl7aD1nLmhhc093blByb3BlcnR5KGspP2dba106bS5kZWZhdWx0c1trXTtkLmlzRGVmaW5lZChoKSYmbnVsbCE9PWg/KGU9ZW5jb2RlVVJJQ29tcG9uZW50KGgpLnJlcGxhY2UoLyU0MC9naSwiQCIpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTIwL2csIiUyMCIpLnJlcGxhY2UoLyUyNi9naSwiJiIpLnJlcGxhY2UoLyUzRC9naSwiPSIpLnJlcGxhY2UoLyUyQi9naSwiKyIpLGM9Yy5yZXBsYWNlKG5ldyBSZWdFeHAoIjoiKworaysiKFxcV3wkKSIsImciKSxmdW5jdGlvbihiLGEpe3JldHVybiBlK2F9KSk6Yz1jLnJlcGxhY2UobmV3IFJlZ0V4cCgiKC8/KToiK2srIihcXFd8JCkiLCJnIiksZnVuY3Rpb24oYixhLGMpe3JldHVybiIvIj09Yy5jaGFyQXQoMCk/YzphK2N9KX0pO20uZGVmYXVsdHMuc3RyaXBUcmFpbGluZ1NsYXNoZXMmJihjPWMucmVwbGFjZSgvXC8rJC8sIiIpfHwiLyIpO2M9Yy5yZXBsYWNlKC9cL1wuKD89XHcrKCR8XD8pKS8sIi4iKTtmLnVybD1jLnJlcGxhY2UoL1wvXFxcLi8sIi8uIik7cihnLGZ1bmN0aW9uKGIsYyl7bS51cmxQYXJhbXNbY118fChmLnBhcmFtcz1mLnBhcmFtc3x8e30sZi5wYXJhbXNbY109Yil9KX19O3JldHVybiB2fV19KX0pKHdpbmRvdyx3aW5kb3cuYW5ndWxhcik7CisvLyMgc291cmNlTWFwcGluZ1VSTD1hbmd1bGFyLXJlc291cmNlLm1pbi5qcy5tYXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItcm91dGUuanMgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9hbmd1bGFyLXJvdXRlLmpzCmluZGV4IDA1ODU5Y2MuLjMwNTE2OWMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItcm91dGUuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvYW5ndWxhci1yb3V0ZS5qcwpAQCAtMSwxMDE4ICsxLDEwMTggQEAKLS8qDQotVGhlIE1JVCBMaWNlbnNlDQotDQotQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnDQotDQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0KLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsDQotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMNCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluDQotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQotDQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQotVEhFIFNPRlRXQVJFLg0KLSovDQotLyoqDQotICogQGxpY2Vuc2UgQW5ndWxhckpTIHYxLjMuOA0KLSAqIChjKSAyMDEwLTIwMTQgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnDQotICogTGljZW5zZTogTUlUDQotICovDQotKGZ1bmN0aW9uKHdpbmRvdywgYW5ndWxhciwgdW5kZWZpbmVkKSB7J3VzZSBzdHJpY3QnOw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBtb2R1bGUNCi0gKiBAbmFtZSBuZ1JvdXRlDQotICogQGRlc2NyaXB0aW9uDQotICoNCi0gKiAjIG5nUm91dGUNCi0gKg0KLSAqIFRoZSBgbmdSb3V0ZWAgbW9kdWxlIHByb3ZpZGVzIHJvdXRpbmcgYW5kIGRlZXBsaW5raW5nIHNlcnZpY2VzIGFuZCBkaXJlY3RpdmVzIGZvciBhbmd1bGFyIGFwcHMuDQotICoNCi0gKiAjIyBFeGFtcGxlDQotICogU2VlIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSNleGFtcGxlICRyb3V0ZX0gZm9yIGFuIGV4YW1wbGUgb2YgY29uZmlndXJpbmcgYW5kIHVzaW5nIGBuZ1JvdXRlYC4NCi0gKg0KLSAqDQotICogPGRpdiBkb2MtbW9kdWxlLWNvbXBvbmVudHM9Im5nUm91dGUiPjwvZGl2Pg0KLSAqLw0KLSAvKiBnbG9iYWwgLW5nUm91dGVNb2R1bGUgKi8NCi12YXIgbmdSb3V0ZU1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCduZ1JvdXRlJywgWyduZyddKS4NCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcignJHJvdXRlJywgJFJvdXRlUHJvdmlkZXIpLA0KLSAgICAkcm91dGVNaW5FcnIgPSBhbmd1bGFyLiQkbWluRXJyKCduZ1JvdXRlJyk7DQotDQotLyoqDQotICogQG5nZG9jIHByb3ZpZGVyDQotICogQG5hbWUgJHJvdXRlUHJvdmlkZXINCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqDQotICogVXNlZCBmb3IgY29uZmlndXJpbmcgcm91dGVzLg0KLSAqDQotICogIyMgRXhhbXBsZQ0KLSAqIFNlZSB7QGxpbmsgbmdSb3V0ZS4kcm91dGUjZXhhbXBsZSAkcm91dGV9IGZvciBhbiBleGFtcGxlIG9mIGNvbmZpZ3VyaW5nIGFuZCB1c2luZyBgbmdSb3V0ZWAuDQotICoNCi0gKiAjIyBEZXBlbmRlbmNpZXMNCi0gKiBSZXF1aXJlcyB0aGUge0BsaW5rIG5nUm91dGUgYG5nUm91dGVgfSBtb2R1bGUgdG8gYmUgaW5zdGFsbGVkLg0KLSAqLw0KLWZ1bmN0aW9uICRSb3V0ZVByb3ZpZGVyKCkgew0KLSAgZnVuY3Rpb24gaW5oZXJpdChwYXJlbnQsIGV4dHJhKSB7DQotICAgIHJldHVybiBhbmd1bGFyLmV4dGVuZChPYmplY3QuY3JlYXRlKHBhcmVudCksIGV4dHJhKTsNCi0gIH0NCi0NCi0gIHZhciByb3V0ZXMgPSB7fTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJHJvdXRlUHJvdmlkZXIjd2hlbg0KLSAgICoNCi0gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFJvdXRlIHBhdGggKG1hdGNoZWQgYWdhaW5zdCBgJGxvY2F0aW9uLnBhdGhgKS4gSWYgYCRsb2NhdGlvbi5wYXRoYA0KLSAgICogICAgY29udGFpbnMgcmVkdW5kYW50IHRyYWlsaW5nIHNsYXNoIG9yIGlzIG1pc3Npbmcgb25lLCB0aGUgcm91dGUgd2lsbCBzdGlsbCBtYXRjaCBhbmQgdGhlDQotICAgKiAgICBgJGxvY2F0aW9uLnBhdGhgIHdpbGwgYmUgdXBkYXRlZCB0byBhZGQgb3IgZHJvcCB0aGUgdHJhaWxpbmcgc2xhc2ggdG8gZXhhY3RseSBtYXRjaCB0aGUNCi0gICAqICAgIHJvdXRlIGRlZmluaXRpb24uDQotICAgKg0KLSAgICogICAgKiBgcGF0aGAgY2FuIGNvbnRhaW4gbmFtZWQgZ3JvdXBzIHN0YXJ0aW5nIHdpdGggYSBjb2xvbjogZS5nLiBgOm5hbWVgLiBBbGwgY2hhcmFjdGVycyB1cA0KLSAgICogICAgICAgIHRvIHRoZSBuZXh0IHNsYXNoIGFyZSBtYXRjaGVkIGFuZCBzdG9yZWQgaW4gYCRyb3V0ZVBhcmFtc2AgdW5kZXIgdGhlIGdpdmVuIGBuYW1lYA0KLSAgICogICAgICAgIHdoZW4gdGhlIHJvdXRlIG1hdGNoZXMuDQotICAgKiAgICAqIGBwYXRoYCBjYW4gY29udGFpbiBuYW1lZCBncm91cHMgc3RhcnRpbmcgd2l0aCBhIGNvbG9uIGFuZCBlbmRpbmcgd2l0aCBhIHN0YXI6DQotICAgKiAgICAgICAgZS5nLmA6bmFtZSpgLiBBbGwgY2hhcmFjdGVycyBhcmUgZWFnZXJseSBzdG9yZWQgaW4gYCRyb3V0ZVBhcmFtc2AgdW5kZXIgdGhlIGdpdmVuIGBuYW1lYA0KLSAgICogICAgICAgIHdoZW4gdGhlIHJvdXRlIG1hdGNoZXMuDQotICAgKiAgICAqIGBwYXRoYCBjYW4gY29udGFpbiBvcHRpb25hbCBuYW1lZCBncm91cHMgd2l0aCBhIHF1ZXN0aW9uIG1hcms6IGUuZy5gOm5hbWU/YC4NCi0gICAqDQotICAgKiAgICBGb3IgZXhhbXBsZSwgcm91dGVzIGxpa2UgYC9jb2xvci86Y29sb3IvbGFyZ2Vjb2RlLzpsYXJnZWNvZGUqXC9lZGl0YCB3aWxsIG1hdGNoDQotICAgKiAgICBgL2NvbG9yL2Jyb3duL2xhcmdlY29kZS9jb2RlL3dpdGgvc2xhc2hlcy9lZGl0YCBhbmQgZXh0cmFjdDoNCi0gICAqDQotICAgKiAgICAqIGBjb2xvcjogYnJvd25gDQotICAgKiAgICAqIGBsYXJnZWNvZGU6IGNvZGUvd2l0aC9zbGFzaGVzYC4NCi0gICAqDQotICAgKg0KLSAgICogQHBhcmFtIHtPYmplY3R9IHJvdXRlIE1hcHBpbmcgaW5mb3JtYXRpb24gdG8gYmUgYXNzaWduZWQgdG8gYCRyb3V0ZS5jdXJyZW50YCBvbiByb3V0ZQ0KLSAgICogICAgbWF0Y2guDQotICAgKg0KLSAgICogICAgT2JqZWN0IHByb3BlcnRpZXM6DQotICAgKg0KLSAgICogICAgLSBgY29udHJvbGxlcmAg4oA/IGB7KHN0cmluZ3xmdW5jdGlvbigpPX1gIOKAPyBDb250cm9sbGVyIGZuIHRoYXQgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aA0KLSAgICogICAgICBuZXdseSBjcmVhdGVkIHNjb3BlIG9yIHRoZSBuYW1lIG9mIGEge0BsaW5rIGFuZ3VsYXIuTW9kdWxlI2NvbnRyb2xsZXIgcmVnaXN0ZXJlZA0KLSAgICogICAgICBjb250cm9sbGVyfSBpZiBwYXNzZWQgYXMgYSBzdHJpbmcuDQotICAgKiAgICAtIGBjb250cm9sbGVyQXNgIOKAPyBge3N0cmluZz19YCDigD8gQSBjb250cm9sbGVyIGFsaWFzIG5hbWUuIElmIHByZXNlbnQgdGhlIGNvbnRyb2xsZXIgd2lsbCBiZQ0KLSAgICogICAgICBwdWJsaXNoZWQgdG8gc2NvcGUgdW5kZXIgdGhlIGBjb250cm9sbGVyQXNgIG5hbWUuDQotICAgKiAgICAtIGB0ZW1wbGF0ZWAg4oA/IGB7c3RyaW5nPXxmdW5jdGlvbigpPX1gIOKAPyBodG1sIHRlbXBsYXRlIGFzIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdGhhdA0KLSAgICogICAgICByZXR1cm5zIGFuIGh0bWwgdGVtcGxhdGUgYXMgYSBzdHJpbmcgd2hpY2ggc2hvdWxkIGJlIHVzZWQgYnkge0BsaW5rDQotICAgKiAgICAgIG5nUm91dGUuZGlyZWN0aXZlOm5nVmlldyBuZ1ZpZXd9IG9yIHtAbGluayBuZy5kaXJlY3RpdmU6bmdJbmNsdWRlIG5nSW5jbHVkZX0gZGlyZWN0aXZlcy4NCi0gICAqICAgICAgVGhpcyBwcm9wZXJ0eSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYHRlbXBsYXRlVXJsYC4NCi0gICAqDQotICAgKiAgICAgIElmIGB0ZW1wbGF0ZWAgaXMgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6DQotICAgKg0KLSAgICogICAgICAtIGB7QXJyYXkuPE9iamVjdD59YCAtIHJvdXRlIHBhcmFtZXRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIGN1cnJlbnQNCi0gICAqICAgICAgICBgJGxvY2F0aW9uLnBhdGgoKWAgYnkgYXBwbHlpbmcgdGhlIGN1cnJlbnQgcm91dGUNCi0gICAqDQotICAgKiAgICAtIGB0ZW1wbGF0ZVVybGAg4oA/IGB7c3RyaW5nPXxmdW5jdGlvbigpPX1gIOKAPyBwYXRoIG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHBhdGggdG8gYW4gaHRtbA0KLSAgICogICAgICB0ZW1wbGF0ZSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHtAbGluayBuZ1JvdXRlLmRpcmVjdGl2ZTpuZ1ZpZXcgbmdWaWV3fS4NCi0gICAqDQotICAgKiAgICAgIElmIGB0ZW1wbGF0ZVVybGAgaXMgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6DQotICAgKg0KLSAgICogICAgICAtIGB7QXJyYXkuPE9iamVjdD59YCAtIHJvdXRlIHBhcmFtZXRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIGN1cnJlbnQNCi0gICAqICAgICAgICBgJGxvY2F0aW9uLnBhdGgoKWAgYnkgYXBwbHlpbmcgdGhlIGN1cnJlbnQgcm91dGUNCi0gICAqDQotICAgKiAgICAtIGByZXNvbHZlYCAtIGB7T2JqZWN0LjxzdHJpbmcsIGZ1bmN0aW9uPj19YCAtIEFuIG9wdGlvbmFsIG1hcCBvZiBkZXBlbmRlbmNpZXMgd2hpY2ggc2hvdWxkDQotICAgKiAgICAgIGJlIGluamVjdGVkIGludG8gdGhlIGNvbnRyb2xsZXIuIElmIGFueSBvZiB0aGVzZSBkZXBlbmRlbmNpZXMgYXJlIHByb21pc2VzLCB0aGUgcm91dGVyDQotICAgKiAgICAgIHdpbGwgd2FpdCBmb3IgdGhlbSBhbGwgdG8gYmUgcmVzb2x2ZWQgb3Igb25lIHRvIGJlIHJlamVjdGVkIGJlZm9yZSB0aGUgY29udHJvbGxlciBpcw0KLSAgICogICAgICBpbnN0YW50aWF0ZWQuDQotICAgKiAgICAgIElmIGFsbCB0aGUgcHJvbWlzZXMgYXJlIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSwgdGhlIHZhbHVlcyBvZiB0aGUgcmVzb2x2ZWQgcHJvbWlzZXMgYXJlDQotICAgKiAgICAgIGluamVjdGVkIGFuZCB7QGxpbmsgbmdSb3V0ZS4kcm91dGUjJHJvdXRlQ2hhbmdlU3VjY2VzcyAkcm91dGVDaGFuZ2VTdWNjZXNzfSBldmVudCBpcw0KLSAgICogICAgICBmaXJlZC4gSWYgYW55IG9mIHRoZSBwcm9taXNlcyBhcmUgcmVqZWN0ZWQgdGhlDQotICAgKiAgICAgIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSMkcm91dGVDaGFuZ2VFcnJvciAkcm91dGVDaGFuZ2VFcnJvcn0gZXZlbnQgaXMgZmlyZWQuIFRoZSBtYXAgb2JqZWN0DQotICAgKiAgICAgIGlzOg0KLSAgICoNCi0gICAqICAgICAgLSBga2V5YCDigD8gYHtzdHJpbmd9YDogYSBuYW1lIG9mIGEgZGVwZW5kZW5jeSB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBjb250cm9sbGVyLg0KLSAgICogICAgICAtIGBmYWN0b3J5YCAtIGB7c3RyaW5nfGZ1bmN0aW9ufWA6IElmIGBzdHJpbmdgIHRoZW4gaXQgaXMgYW4gYWxpYXMgZm9yIGEgc2VydmljZS4NCi0gICAqICAgICAgICBPdGhlcndpc2UgaWYgZnVuY3Rpb24sIHRoZW4gaXQgaXMge0BsaW5rIGF1dG8uJGluamVjdG9yI2ludm9rZSBpbmplY3RlZH0NCi0gICAqICAgICAgICBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyB0cmVhdGVkIGFzIHRoZSBkZXBlbmRlbmN5LiBJZiB0aGUgcmVzdWx0IGlzIGEgcHJvbWlzZSwgaXQgaXMNCi0gICAqICAgICAgICByZXNvbHZlZCBiZWZvcmUgaXRzIHZhbHVlIGlzIGluamVjdGVkIGludG8gdGhlIGNvbnRyb2xsZXIuIEJlIGF3YXJlIHRoYXQNCi0gICAqICAgICAgICBgbmdSb3V0ZS4kcm91dGVQYXJhbXNgIHdpbGwgc3RpbGwgcmVmZXIgdG8gdGhlIHByZXZpb3VzIHJvdXRlIHdpdGhpbiB0aGVzZSByZXNvbHZlDQotICAgKiAgICAgICAgZnVuY3Rpb25zLiAgVXNlIGAkcm91dGUuY3VycmVudC5wYXJhbXNgIHRvIGFjY2VzcyB0aGUgbmV3IHJvdXRlIHBhcmFtZXRlcnMsIGluc3RlYWQuDQotICAgKg0KLSAgICogICAgLSBgcmVkaXJlY3RUb2Ag4oA/IHsoc3RyaW5nfGZ1bmN0aW9uKCkpPX0g4oA/IHZhbHVlIHRvIHVwZGF0ZQ0KLSAgICogICAgICB7QGxpbmsgbmcuJGxvY2F0aW9uICRsb2NhdGlvbn0gcGF0aCB3aXRoIGFuZCB0cmlnZ2VyIHJvdXRlIHJlZGlyZWN0aW9uLg0KLSAgICoNCi0gICAqICAgICAgSWYgYHJlZGlyZWN0VG9gIGlzIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOg0KLSAgICoNCi0gICAqICAgICAgLSBge09iamVjdC48c3RyaW5nPn1gIC0gcm91dGUgcGFyYW1ldGVycyBleHRyYWN0ZWQgZnJvbSB0aGUgY3VycmVudA0KLSAgICogICAgICAgIGAkbG9jYXRpb24ucGF0aCgpYCBieSBhcHBseWluZyB0aGUgY3VycmVudCByb3V0ZSB0ZW1wbGF0ZVVybC4NCi0gICAqICAgICAgLSBge3N0cmluZ31gIC0gY3VycmVudCBgJGxvY2F0aW9uLnBhdGgoKWANCi0gICAqICAgICAgLSBge09iamVjdH1gIC0gY3VycmVudCBgJGxvY2F0aW9uLnNlYXJjaCgpYA0KLSAgICoNCi0gICAqICAgICAgVGhlIGN1c3RvbSBgcmVkaXJlY3RUb2AgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZA0KLSAgICogICAgICB0byB1cGRhdGUgYCRsb2NhdGlvbi5wYXRoKClgIGFuZCBgJGxvY2F0aW9uLnNlYXJjaCgpYC4NCi0gICAqDQotICAgKiAgICAtIGBbcmVsb2FkT25TZWFyY2g9dHJ1ZV1gIC0ge2Jvb2xlYW49fSAtIHJlbG9hZCByb3V0ZSB3aGVuIG9ubHkgYCRsb2NhdGlvbi5zZWFyY2goKWANCi0gICAqICAgICAgb3IgYCRsb2NhdGlvbi5oYXNoKClgIGNoYW5nZXMuDQotICAgKg0KLSAgICogICAgICBJZiB0aGUgb3B0aW9uIGlzIHNldCB0byBgZmFsc2VgIGFuZCB1cmwgaW4gdGhlIGJyb3dzZXIgY2hhbmdlcywgdGhlbg0KLSAgICogICAgICBgJHJvdXRlVXBkYXRlYCBldmVudCBpcyBicm9hZGNhc3RlZCBvbiB0aGUgcm9vdCBzY29wZS4NCi0gICAqDQotICAgKiAgICAtIGBbY2FzZUluc2Vuc2l0aXZlTWF0Y2g9ZmFsc2VdYCAtIHtib29sZWFuPX0gLSBtYXRjaCByb3V0ZXMgd2l0aG91dCBiZWluZyBjYXNlIHNlbnNpdGl2ZQ0KLSAgICoNCi0gICAqICAgICAgSWYgdGhlIG9wdGlvbiBpcyBzZXQgdG8gYHRydWVgLCB0aGVuIHRoZSBwYXJ0aWN1bGFyIHJvdXRlIGNhbiBiZSBtYXRjaGVkIHdpdGhvdXQgYmVpbmcNCi0gICAqICAgICAgY2FzZSBzZW5zaXRpdmUNCi0gICAqDQotICAgKiBAcmV0dXJucyB7T2JqZWN0fSBzZWxmDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBBZGRzIGEgbmV3IHJvdXRlIGRlZmluaXRpb24gdG8gdGhlIGAkcm91dGVgIHNlcnZpY2UuDQotICAgKi8NCi0gIHRoaXMud2hlbiA9IGZ1bmN0aW9uKHBhdGgsIHJvdXRlKSB7DQotICAgIC8vY29weSBvcmlnaW5hbCByb3V0ZSBvYmplY3QgdG8gcHJlc2VydmUgcGFyYW1zIGluaGVyaXRlZCBmcm9tIHByb3RvIGNoYWluDQotICAgIHZhciByb3V0ZUNvcHkgPSBhbmd1bGFyLmNvcHkocm91dGUpOw0KLSAgICBpZiAoYW5ndWxhci5pc1VuZGVmaW5lZChyb3V0ZUNvcHkucmVsb2FkT25TZWFyY2gpKSB7DQotICAgICAgcm91dGVDb3B5LnJlbG9hZE9uU2VhcmNoID0gdHJ1ZTsNCi0gICAgfQ0KLSAgICBpZiAoYW5ndWxhci5pc1VuZGVmaW5lZChyb3V0ZUNvcHkuY2FzZUluc2Vuc2l0aXZlTWF0Y2gpKSB7DQotICAgICAgcm91dGVDb3B5LmNhc2VJbnNlbnNpdGl2ZU1hdGNoID0gdGhpcy5jYXNlSW5zZW5zaXRpdmVNYXRjaDsNCi0gICAgfQ0KLSAgICByb3V0ZXNbcGF0aF0gPSBhbmd1bGFyLmV4dGVuZCgNCi0gICAgICByb3V0ZUNvcHksDQotICAgICAgcGF0aCAmJiBwYXRoUmVnRXhwKHBhdGgsIHJvdXRlQ29weSkNCi0gICAgKTsNCi0NCi0gICAgLy8gY3JlYXRlIHJlZGlyZWN0aW9uIGZvciB0cmFpbGluZyBzbGFzaGVzDQotICAgIGlmIChwYXRoKSB7DQotICAgICAgdmFyIHJlZGlyZWN0UGF0aCA9IChwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPT0gJy8nKQ0KLSAgICAgICAgICAgID8gcGF0aC5zdWJzdHIoMCwgcGF0aC5sZW5ndGggLSAxKQ0KLSAgICAgICAgICAgIDogcGF0aCArICcvJzsNCi0NCi0gICAgICByb3V0ZXNbcmVkaXJlY3RQYXRoXSA9IGFuZ3VsYXIuZXh0ZW5kKA0KLSAgICAgICAge3JlZGlyZWN0VG86IHBhdGh9LA0KLSAgICAgICAgcGF0aFJlZ0V4cChyZWRpcmVjdFBhdGgsIHJvdXRlQ29weSkNCi0gICAgICApOw0KLSAgICB9DQotDQotICAgIHJldHVybiB0aGlzOw0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIHByb3BlcnR5DQotICAgKiBAbmFtZSAkcm91dGVQcm92aWRlciNjYXNlSW5zZW5zaXRpdmVNYXRjaA0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKg0KLSAgICogQSBib29sZWFuIHByb3BlcnR5IGluZGljYXRpbmcgaWYgcm91dGVzIGRlZmluZWQNCi0gICAqIHVzaW5nIHRoaXMgcHJvdmlkZXIgc2hvdWxkIGJlIG1hdGNoZWQgdXNpbmcgYSBjYXNlIGluc2Vuc2l0aXZlDQotICAgKiBhbGdvcml0aG0uIERlZmF1bHRzIHRvIGBmYWxzZWAuDQotICAgKi8NCi0gIHRoaXMuY2FzZUluc2Vuc2l0aXZlTWF0Y2ggPSBmYWxzZTsNCi0NCi0gICAvKioNCi0gICAgKiBAcGFyYW0gcGF0aCB7c3RyaW5nfSBwYXRoDQotICAgICogQHBhcmFtIG9wdHMge09iamVjdH0gb3B0aW9ucw0KLSAgICAqIEByZXR1cm4gez9PYmplY3R9DQotICAgICoNCi0gICAgKiBAZGVzY3JpcHRpb24NCi0gICAgKiBOb3JtYWxpemVzIHRoZSBnaXZlbiBwYXRoLCByZXR1cm5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24NCi0gICAgKiBhbmQgdGhlIG9yaWdpbmFsIHBhdGguDQotICAgICoNCi0gICAgKiBJbnNwaXJlZCBieSBwYXRoUmV4cCBpbiB2aXNpb25tZWRpYS9leHByZXNzL2xpYi91dGlscy5qcy4NCi0gICAgKi8NCi0gIGZ1bmN0aW9uIHBhdGhSZWdFeHAocGF0aCwgb3B0cykgew0KLSAgICB2YXIgaW5zZW5zaXRpdmUgPSBvcHRzLmNhc2VJbnNlbnNpdGl2ZU1hdGNoLA0KLSAgICAgICAgcmV0ID0gew0KLSAgICAgICAgICBvcmlnaW5hbFBhdGg6IHBhdGgsDQotICAgICAgICAgIHJlZ2V4cDogcGF0aA0KLSAgICAgICAgfSwNCi0gICAgICAgIGtleXMgPSByZXQua2V5cyA9IFtdOw0KLQ0KLSAgICBwYXRoID0gcGF0aA0KLSAgICAgIC5yZXBsYWNlKC8oWygpLl0pL2csICdcXCQxJykNCi0gICAgICAucmVwbGFjZSgvKFwvKT86KFx3KykoW1w/XCpdKT8vZywgZnVuY3Rpb24oXywgc2xhc2gsIGtleSwgb3B0aW9uKSB7DQotICAgICAgICB2YXIgb3B0aW9uYWwgPSBvcHRpb24gPT09ICc/JyA/IG9wdGlvbiA6IG51bGw7DQotICAgICAgICB2YXIgc3RhciA9IG9wdGlvbiA9PT0gJyonID8gb3B0aW9uIDogbnVsbDsNCi0gICAgICAgIGtleXMucHVzaCh7IG5hbWU6IGtleSwgb3B0aW9uYWw6ICEhb3B0aW9uYWwgfSk7DQotICAgICAgICBzbGFzaCA9IHNsYXNoIHx8ICcnOw0KLSAgICAgICAgcmV0dXJuICcnDQotICAgICAgICAgICsgKG9wdGlvbmFsID8gJycgOiBzbGFzaCkNCi0gICAgICAgICAgKyAnKD86Jw0KLSAgICAgICAgICArIChvcHRpb25hbCA/IHNsYXNoIDogJycpDQotICAgICAgICAgICsgKHN0YXIgJiYgJyguKz8pJyB8fCAnKFteL10rKScpDQotICAgICAgICAgICsgKG9wdGlvbmFsIHx8ICcnKQ0KLSAgICAgICAgICArICcpJw0KLSAgICAgICAgICArIChvcHRpb25hbCB8fCAnJyk7DQotICAgICAgfSkNCi0gICAgICAucmVwbGFjZSgvKFtcLyRcKl0pL2csICdcXCQxJyk7DQotDQotICAgIHJldC5yZWdleHAgPSBuZXcgUmVnRXhwKCdeJyArIHBhdGggKyAnJCcsIGluc2Vuc2l0aXZlID8gJ2knIDogJycpOw0KLSAgICByZXR1cm4gcmV0Ow0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSAkcm91dGVQcm92aWRlciNvdGhlcndpc2UNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFNldHMgcm91dGUgZGVmaW5pdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBvbiByb3V0ZSBjaGFuZ2Ugd2hlbiBubyBvdGhlciByb3V0ZSBkZWZpbml0aW9uDQotICAgKiBpcyBtYXRjaGVkLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7T2JqZWN0fHN0cmluZ30gcGFyYW1zIE1hcHBpbmcgaW5mb3JtYXRpb24gdG8gYmUgYXNzaWduZWQgdG8gYCRyb3V0ZS5jdXJyZW50YC4NCi0gICAqIElmIGNhbGxlZCB3aXRoIGEgc3RyaW5nLCB0aGUgdmFsdWUgbWFwcyB0byBgcmVkaXJlY3RUb2AuDQotICAgKiBAcmV0dXJucyB7T2JqZWN0fSBzZWxmDQotICAgKi8NCi0gIHRoaXMub3RoZXJ3aXNlID0gZnVuY3Rpb24ocGFyYW1zKSB7DQotICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykgew0KLSAgICAgIHBhcmFtcyA9IHtyZWRpcmVjdFRvOiBwYXJhbXN9Ow0KLSAgICB9DQotICAgIHRoaXMud2hlbihudWxsLCBwYXJhbXMpOw0KLSAgICByZXR1cm4gdGhpczsNCi0gIH07DQotDQotDQotICB0aGlzLiRnZXQgPSBbJyRyb290U2NvcGUnLA0KLSAgICAgICAgICAgICAgICckbG9jYXRpb24nLA0KLSAgICAgICAgICAgICAgICckcm91dGVQYXJhbXMnLA0KLSAgICAgICAgICAgICAgICckcScsDQotICAgICAgICAgICAgICAgJyRpbmplY3RvcicsDQotICAgICAgICAgICAgICAgJyR0ZW1wbGF0ZVJlcXVlc3QnLA0KLSAgICAgICAgICAgICAgICckc2NlJywNCi0gICAgICBmdW5jdGlvbigkcm9vdFNjb3BlLCAkbG9jYXRpb24sICRyb3V0ZVBhcmFtcywgJHEsICRpbmplY3RvciwgJHRlbXBsYXRlUmVxdWVzdCwgJHNjZSkgew0KLQ0KLSAgICAvKioNCi0gICAgICogQG5nZG9jIHNlcnZpY2UNCi0gICAgICogQG5hbWUgJHJvdXRlDQotICAgICAqIEByZXF1aXJlcyAkbG9jYXRpb24NCi0gICAgICogQHJlcXVpcmVzICRyb3V0ZVBhcmFtcw0KLSAgICAgKg0KLSAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY3VycmVudCBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcm91dGUgZGVmaW5pdGlvbi4NCi0gICAgICogVGhlIHJvdXRlIGRlZmluaXRpb24gY29udGFpbnM6DQotICAgICAqDQotICAgICAqICAgLSBgY29udHJvbGxlcmA6IFRoZSBjb250cm9sbGVyIGNvbnN0cnVjdG9yIGFzIGRlZmluZSBpbiByb3V0ZSBkZWZpbml0aW9uLg0KLSAgICAgKiAgIC0gYGxvY2Fsc2A6IEEgbWFwIG9mIGxvY2FscyB3aGljaCBpcyB1c2VkIGJ5IHtAbGluayBuZy4kY29udHJvbGxlciAkY29udHJvbGxlcn0gc2VydmljZSBmb3INCi0gICAgICogICAgIGNvbnRyb2xsZXIgaW5zdGFudGlhdGlvbi4gVGhlIGBsb2NhbHNgIGNvbnRhaW4NCi0gICAgICogICAgIHRoZSByZXNvbHZlZCB2YWx1ZXMgb2YgdGhlIGByZXNvbHZlYCBtYXAuIEFkZGl0aW9uYWxseSB0aGUgYGxvY2Fsc2AgYWxzbyBjb250YWluOg0KLSAgICAgKg0KLSAgICAgKiAgICAgLSBgJHNjb3BlYCAtIFRoZSBjdXJyZW50IHJvdXRlIHNjb3BlLg0KLSAgICAgKiAgICAgLSBgJHRlbXBsYXRlYCAtIFRoZSBjdXJyZW50IHJvdXRlIHRlbXBsYXRlIEhUTUwuDQotICAgICAqDQotICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSByb3V0ZXMgT2JqZWN0IHdpdGggYWxsIHJvdXRlIGNvbmZpZ3VyYXRpb24gT2JqZWN0cyBhcyBpdHMgcHJvcGVydGllcy4NCi0gICAgICoNCi0gICAgICogQGRlc2NyaXB0aW9uDQotICAgICAqIGAkcm91dGVgIGlzIHVzZWQgZm9yIGRlZXAtbGlua2luZyBVUkxzIHRvIGNvbnRyb2xsZXJzIGFuZCB2aWV3cyAoSFRNTCBwYXJ0aWFscykuDQotICAgICAqIEl0IHdhdGNoZXMgYCRsb2NhdGlvbi51cmwoKWAgYW5kIHRyaWVzIHRvIG1hcCB0aGUgcGF0aCB0byBhbiBleGlzdGluZyByb3V0ZSBkZWZpbml0aW9uLg0KLSAgICAgKg0KLSAgICAgKiBSZXF1aXJlcyB0aGUge0BsaW5rIG5nUm91dGUgYG5nUm91dGVgfSBtb2R1bGUgdG8gYmUgaW5zdGFsbGVkLg0KLSAgICAgKg0KLSAgICAgKiBZb3UgY2FuIGRlZmluZSByb3V0ZXMgdGhyb3VnaCB7QGxpbmsgbmdSb3V0ZS4kcm91dGVQcm92aWRlciAkcm91dGVQcm92aWRlcn0ncyBBUEkuDQotICAgICAqDQotICAgICAqIFRoZSBgJHJvdXRlYCBzZXJ2aWNlIGlzIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlDQotICAgICAqIHtAbGluayBuZ1JvdXRlLmRpcmVjdGl2ZTpuZ1ZpZXcgYG5nVmlld2B9IGRpcmVjdGl2ZSBhbmQgdGhlDQotICAgICAqIHtAbGluayBuZ1JvdXRlLiRyb3V0ZVBhcmFtcyBgJHJvdXRlUGFyYW1zYH0gc2VydmljZS4NCi0gICAgICoNCi0gICAgICogQGV4YW1wbGUNCi0gICAgICogVGhpcyBleGFtcGxlIHNob3dzIGhvdyBjaGFuZ2luZyB0aGUgVVJMIGhhc2ggY2F1c2VzIHRoZSBgJHJvdXRlYCB0byBtYXRjaCBhIHJvdXRlIGFnYWluc3QgdGhlDQotICAgICAqIFVSTCwgYW5kIHRoZSBgbmdWaWV3YCBwdWxscyBpbiB0aGUgcGFydGlhbC4NCi0gICAgICoNCi0gICAgICogPGV4YW1wbGUgbmFtZT0iJHJvdXRlLXNlcnZpY2UiIG1vZHVsZT0ibmdSb3V0ZUV4YW1wbGUiDQotICAgICAqICAgICAgICAgIGRlcHM9ImFuZ3VsYXItcm91dGUuanMiIGZpeEJhc2U9InRydWUiPg0KLSAgICAgKiAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgKiAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJNYWluQ29udHJvbGxlciI+DQotICAgICAqICAgICAgIENob29zZToNCi0gICAgICogICAgICAgPGEgaHJlZj0iQm9vay9Nb2J5Ij5Nb2J5PC9hPiB8DQotICAgICAqICAgICAgIDxhIGhyZWY9IkJvb2svTW9ieS9jaC8xIj5Nb2J5OiBDaDE8L2E+IHwNCi0gICAgICogICAgICAgPGEgaHJlZj0iQm9vay9HYXRzYnkiPkdhdHNieTwvYT4gfA0KLSAgICAgKiAgICAgICA8YSBocmVmPSJCb29rL0dhdHNieS9jaC80P2tleT12YWx1ZSI+R2F0c2J5OiBDaDQ8L2E+IHwNCi0gICAgICogICAgICAgPGEgaHJlZj0iQm9vay9TY2FybGV0Ij5TY2FybGV0IExldHRlcjwvYT48YnIvPg0KLSAgICAgKg0KLSAgICAgKiAgICAgICA8ZGl2IG5nLXZpZXc+PC9kaXY+DQotICAgICAqDQotICAgICAqICAgICAgIDxociAvPg0KLSAgICAgKg0KLSAgICAgKiAgICAgICA8cHJlPiRsb2NhdGlvbi5wYXRoKCkgPSB7eyRsb2NhdGlvbi5wYXRoKCl9fTwvcHJlPg0KLSAgICAgKiAgICAgICA8cHJlPiRyb3V0ZS5jdXJyZW50LnRlbXBsYXRlVXJsID0ge3skcm91dGUuY3VycmVudC50ZW1wbGF0ZVVybH19PC9wcmU+DQotICAgICAqICAgICAgIDxwcmU+JHJvdXRlLmN1cnJlbnQucGFyYW1zID0ge3skcm91dGUuY3VycmVudC5wYXJhbXN9fTwvcHJlPg0KLSAgICAgKiAgICAgICA8cHJlPiRyb3V0ZS5jdXJyZW50LnNjb3BlLm5hbWUgPSB7eyRyb3V0ZS5jdXJyZW50LnNjb3BlLm5hbWV9fTwvcHJlPg0KLSAgICAgKiAgICAgICA8cHJlPiRyb3V0ZVBhcmFtcyA9IHt7JHJvdXRlUGFyYW1zfX08L3ByZT4NCi0gICAgICogICAgIDwvZGl2Pg0KLSAgICAgKiAgIDwvZmlsZT4NCi0gICAgICoNCi0gICAgICogICA8ZmlsZSBuYW1lPSJib29rLmh0bWwiPg0KLSAgICAgKiAgICAgY29udHJvbGxlcjoge3tuYW1lfX08YnIgLz4NCi0gICAgICogICAgIEJvb2sgSWQ6IHt7cGFyYW1zLmJvb2tJZH19PGJyIC8+DQotICAgICAqICAgPC9maWxlPg0KLSAgICAgKg0KLSAgICAgKiAgIDxmaWxlIG5hbWU9ImNoYXB0ZXIuaHRtbCI+DQotICAgICAqICAgICBjb250cm9sbGVyOiB7e25hbWV9fTxiciAvPg0KLSAgICAgKiAgICAgQm9vayBJZDoge3twYXJhbXMuYm9va0lkfX08YnIgLz4NCi0gICAgICogICAgIENoYXB0ZXIgSWQ6IHt7cGFyYW1zLmNoYXB0ZXJJZH19DQotICAgICAqICAgPC9maWxlPg0KLSAgICAgKg0KLSAgICAgKiAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+DQotICAgICAqICAgICBhbmd1bGFyLm1vZHVsZSgnbmdSb3V0ZUV4YW1wbGUnLCBbJ25nUm91dGUnXSkNCi0gICAgICoNCi0gICAgICogICAgICAuY29udHJvbGxlcignTWFpbkNvbnRyb2xsZXInLCBmdW5jdGlvbigkc2NvcGUsICRyb3V0ZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb24pIHsNCi0gICAgICogICAgICAgICAgJHNjb3BlLiRyb3V0ZSA9ICRyb3V0ZTsNCi0gICAgICogICAgICAgICAgJHNjb3BlLiRsb2NhdGlvbiA9ICRsb2NhdGlvbjsNCi0gICAgICogICAgICAgICAgJHNjb3BlLiRyb3V0ZVBhcmFtcyA9ICRyb3V0ZVBhcmFtczsNCi0gICAgICogICAgICB9KQ0KLSAgICAgKg0KLSAgICAgKiAgICAgIC5jb250cm9sbGVyKCdCb29rQ29udHJvbGxlcicsIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlUGFyYW1zKSB7DQotICAgICAqICAgICAgICAgICRzY29wZS5uYW1lID0gIkJvb2tDb250cm9sbGVyIjsNCi0gICAgICogICAgICAgICAgJHNjb3BlLnBhcmFtcyA9ICRyb3V0ZVBhcmFtczsNCi0gICAgICogICAgICB9KQ0KLSAgICAgKg0KLSAgICAgKiAgICAgIC5jb250cm9sbGVyKCdDaGFwdGVyQ29udHJvbGxlcicsIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlUGFyYW1zKSB7DQotICAgICAqICAgICAgICAgICRzY29wZS5uYW1lID0gIkNoYXB0ZXJDb250cm9sbGVyIjsNCi0gICAgICogICAgICAgICAgJHNjb3BlLnBhcmFtcyA9ICRyb3V0ZVBhcmFtczsNCi0gICAgICogICAgICB9KQ0KLSAgICAgKg0KLSAgICAgKiAgICAgLmNvbmZpZyhmdW5jdGlvbigkcm91dGVQcm92aWRlciwgJGxvY2F0aW9uUHJvdmlkZXIpIHsNCi0gICAgICogICAgICAgJHJvdXRlUHJvdmlkZXINCi0gICAgICogICAgICAgIC53aGVuKCcvQm9vay86Ym9va0lkJywgew0KLSAgICAgKiAgICAgICAgIHRlbXBsYXRlVXJsOiAnYm9vay5odG1sJywNCi0gICAgICogICAgICAgICBjb250cm9sbGVyOiAnQm9va0NvbnRyb2xsZXInLA0KLSAgICAgKiAgICAgICAgIHJlc29sdmU6IHsNCi0gICAgICogICAgICAgICAgIC8vIEkgd2lsbCBjYXVzZSBhIDEgc2Vjb25kIGRlbGF5DQotICAgICAqICAgICAgICAgICBkZWxheTogZnVuY3Rpb24oJHEsICR0aW1lb3V0KSB7DQotICAgICAqICAgICAgICAgICAgIHZhciBkZWxheSA9ICRxLmRlZmVyKCk7DQotICAgICAqICAgICAgICAgICAgICR0aW1lb3V0KGRlbGF5LnJlc29sdmUsIDEwMDApOw0KLSAgICAgKiAgICAgICAgICAgICByZXR1cm4gZGVsYXkucHJvbWlzZTsNCi0gICAgICogICAgICAgICAgIH0NCi0gICAgICogICAgICAgICB9DQotICAgICAqICAgICAgIH0pDQotICAgICAqICAgICAgIC53aGVuKCcvQm9vay86Ym9va0lkL2NoLzpjaGFwdGVySWQnLCB7DQotICAgICAqICAgICAgICAgdGVtcGxhdGVVcmw6ICdjaGFwdGVyLmh0bWwnLA0KLSAgICAgKiAgICAgICAgIGNvbnRyb2xsZXI6ICdDaGFwdGVyQ29udHJvbGxlcicNCi0gICAgICogICAgICAgfSk7DQotICAgICAqDQotICAgICAqICAgICAgIC8vIGNvbmZpZ3VyZSBodG1sNSB0byBnZXQgbGlua3Mgd29ya2luZyBvbiBqc2ZpZGRsZQ0KLSAgICAgKiAgICAgICAkbG9jYXRpb25Qcm92aWRlci5odG1sNU1vZGUodHJ1ZSk7DQotICAgICAqICAgICB9KTsNCi0gICAgICoNCi0gICAgICogICA8L2ZpbGU+DQotICAgICAqDQotICAgICAqICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAqICAgICBpdCgnc2hvdWxkIGxvYWQgYW5kIGNvbXBpbGUgY29ycmVjdCB0ZW1wbGF0ZScsIGZ1bmN0aW9uKCkgew0KLSAgICAgKiAgICAgICBlbGVtZW50KGJ5LmxpbmtUZXh0KCdNb2J5OiBDaDEnKSkuY2xpY2soKTsNCi0gICAgICogICAgICAgdmFyIGNvbnRlbnQgPSBlbGVtZW50KGJ5LmNzcygnW25nLXZpZXddJykpLmdldFRleHQoKTsNCi0gICAgICogICAgICAgZXhwZWN0KGNvbnRlbnQpLnRvTWF0Y2goL2NvbnRyb2xsZXJcOiBDaGFwdGVyQ29udHJvbGxlci8pOw0KLSAgICAgKiAgICAgICBleHBlY3QoY29udGVudCkudG9NYXRjaCgvQm9vayBJZFw6IE1vYnkvKTsNCi0gICAgICogICAgICAgZXhwZWN0KGNvbnRlbnQpLnRvTWF0Y2goL0NoYXB0ZXIgSWRcOiAxLyk7DQotICAgICAqDQotICAgICAqICAgICAgIGVsZW1lbnQoYnkucGFydGlhbExpbmtUZXh0KCdTY2FybGV0JykpLmNsaWNrKCk7DQotICAgICAqDQotICAgICAqICAgICAgIGNvbnRlbnQgPSBlbGVtZW50KGJ5LmNzcygnW25nLXZpZXddJykpLmdldFRleHQoKTsNCi0gICAgICogICAgICAgZXhwZWN0KGNvbnRlbnQpLnRvTWF0Y2goL2NvbnRyb2xsZXJcOiBCb29rQ29udHJvbGxlci8pOw0KLSAgICAgKiAgICAgICBleHBlY3QoY29udGVudCkudG9NYXRjaCgvQm9vayBJZFw6IFNjYXJsZXQvKTsNCi0gICAgICogICAgIH0pOw0KLSAgICAgKiAgIDwvZmlsZT4NCi0gICAgICogPC9leGFtcGxlPg0KLSAgICAgKi8NCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBldmVudA0KLSAgICAgKiBAbmFtZSAkcm91dGUjJHJvdXRlQ2hhbmdlU3RhcnQNCi0gICAgICogQGV2ZW50VHlwZSBicm9hZGNhc3Qgb24gcm9vdCBzY29wZQ0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogQnJvYWRjYXN0ZWQgYmVmb3JlIGEgcm91dGUgY2hhbmdlLiBBdCB0aGlzICBwb2ludCB0aGUgcm91dGUgc2VydmljZXMgc3RhcnRzDQotICAgICAqIHJlc29sdmluZyBhbGwgb2YgdGhlIGRlcGVuZGVuY2llcyBuZWVkZWQgZm9yIHRoZSByb3V0ZSBjaGFuZ2UgdG8gb2NjdXIuDQotICAgICAqIFR5cGljYWxseSB0aGlzIGludm9sdmVzIGZldGNoaW5nIHRoZSB2aWV3IHRlbXBsYXRlIGFzIHdlbGwgYXMgYW55IGRlcGVuZGVuY2llcw0KLSAgICAgKiBkZWZpbmVkIGluIGByZXNvbHZlYCByb3V0ZSBwcm9wZXJ0eS4gT25jZSAgYWxsIG9mIHRoZSBkZXBlbmRlbmNpZXMgYXJlIHJlc29sdmVkDQotICAgICAqIGAkcm91dGVDaGFuZ2VTdWNjZXNzYCBpcyBmaXJlZC4NCi0gICAgICoNCi0gICAgICogVGhlIHJvdXRlIGNoYW5nZSAoYW5kIHRoZSBgJGxvY2F0aW9uYCBjaGFuZ2UgdGhhdCB0cmlnZ2VyZWQgaXQpIGNhbiBiZSBwcmV2ZW50ZWQNCi0gICAgICogYnkgY2FsbGluZyBgcHJldmVudERlZmF1bHRgIG1ldGhvZCBvZiB0aGUgZXZlbnQuIFNlZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb259DQotICAgICAqIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgZXZlbnQgb2JqZWN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuDQotICAgICAqIEBwYXJhbSB7Um91dGV9IG5leHQgRnV0dXJlIHJvdXRlIGluZm9ybWF0aW9uLg0KLSAgICAgKiBAcGFyYW0ge1JvdXRlfSBjdXJyZW50IEN1cnJlbnQgcm91dGUgaW5mb3JtYXRpb24uDQotICAgICAqLw0KLQ0KLSAgICAvKioNCi0gICAgICogQG5nZG9jIGV2ZW50DQotICAgICAqIEBuYW1lICRyb3V0ZSMkcm91dGVDaGFuZ2VTdWNjZXNzDQotICAgICAqIEBldmVudFR5cGUgYnJvYWRjYXN0IG9uIHJvb3Qgc2NvcGUNCi0gICAgICogQGRlc2NyaXB0aW9uDQotICAgICAqIEJyb2FkY2FzdGVkIGFmdGVyIGEgcm91dGUgZGVwZW5kZW5jaWVzIGFyZSByZXNvbHZlZC4NCi0gICAgICoge0BsaW5rIG5nUm91dGUuZGlyZWN0aXZlOm5nVmlldyBuZ1ZpZXd9IGxpc3RlbnMgZm9yIHRoZSBkaXJlY3RpdmUNCi0gICAgICogdG8gaW5zdGFudGlhdGUgdGhlIGNvbnRyb2xsZXIgYW5kIHJlbmRlciB0aGUgdmlldy4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHtPYmplY3R9IGFuZ3VsYXJFdmVudCBTeW50aGV0aWMgZXZlbnQgb2JqZWN0Lg0KLSAgICAgKiBAcGFyYW0ge1JvdXRlfSBjdXJyZW50IEN1cnJlbnQgcm91dGUgaW5mb3JtYXRpb24uDQotICAgICAqIEBwYXJhbSB7Um91dGV8VW5kZWZpbmVkfSBwcmV2aW91cyBQcmV2aW91cyByb3V0ZSBpbmZvcm1hdGlvbiwgb3IgdW5kZWZpbmVkIGlmIGN1cnJlbnQgaXMNCi0gICAgICogZmlyc3Qgcm91dGUgZW50ZXJlZC4NCi0gICAgICovDQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgZXZlbnQNCi0gICAgICogQG5hbWUgJHJvdXRlIyRyb3V0ZUNoYW5nZUVycm9yDQotICAgICAqIEBldmVudFR5cGUgYnJvYWRjYXN0IG9uIHJvb3Qgc2NvcGUNCi0gICAgICogQGRlc2NyaXB0aW9uDQotICAgICAqIEJyb2FkY2FzdGVkIGlmIGFueSBvZiB0aGUgcmVzb2x2ZSBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhbmd1bGFyRXZlbnQgU3ludGhldGljIGV2ZW50IG9iamVjdA0KLSAgICAgKiBAcGFyYW0ge1JvdXRlfSBjdXJyZW50IEN1cnJlbnQgcm91dGUgaW5mb3JtYXRpb24uDQotICAgICAqIEBwYXJhbSB7Um91dGV9IHByZXZpb3VzIFByZXZpb3VzIHJvdXRlIGluZm9ybWF0aW9uLg0KLSAgICAgKiBAcGFyYW0ge1JvdXRlfSByZWplY3Rpb24gUmVqZWN0aW9uIG9mIHRoZSBwcm9taXNlLiBVc3VhbGx5IHRoZSBlcnJvciBvZiB0aGUgZmFpbGVkIHByb21pc2UuDQotICAgICAqLw0KLQ0KLSAgICAvKioNCi0gICAgICogQG5nZG9jIGV2ZW50DQotICAgICAqIEBuYW1lICRyb3V0ZSMkcm91dGVVcGRhdGUNCi0gICAgICogQGV2ZW50VHlwZSBicm9hZGNhc3Qgb24gcm9vdCBzY29wZQ0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICoNCi0gICAgICogVGhlIGByZWxvYWRPblNlYXJjaGAgcHJvcGVydHkgaGFzIGJlZW4gc2V0IHRvIGZhbHNlLCBhbmQgd2UgYXJlIHJldXNpbmcgdGhlIHNhbWUNCi0gICAgICogaW5zdGFuY2Ugb2YgdGhlIENvbnRyb2xsZXIuDQotICAgICAqLw0KLQ0KLSAgICB2YXIgZm9yY2VSZWxvYWQgPSBmYWxzZSwNCi0gICAgICAgIHByZXBhcmVkUm91dGUsDQotICAgICAgICBwcmVwYXJlZFJvdXRlSXNVcGRhdGVPbmx5LA0KLSAgICAgICAgJHJvdXRlID0gew0KLSAgICAgICAgICByb3V0ZXM6IHJvdXRlcywNCi0NCi0gICAgICAgICAgLyoqDQotICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgICAgICogQG5hbWUgJHJvdXRlI3JlbG9hZA0KLSAgICAgICAgICAgKg0KLSAgICAgICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgICAgICogQ2F1c2VzIGAkcm91dGVgIHNlcnZpY2UgdG8gcmVsb2FkIHRoZSBjdXJyZW50IHJvdXRlIGV2ZW4gaWYNCi0gICAgICAgICAgICoge0BsaW5rIG5nLiRsb2NhdGlvbiAkbG9jYXRpb259IGhhc24ndCBjaGFuZ2VkLg0KLSAgICAgICAgICAgKg0KLSAgICAgICAgICAgKiBBcyBhIHJlc3VsdCBvZiB0aGF0LCB7QGxpbmsgbmdSb3V0ZS5kaXJlY3RpdmU6bmdWaWV3IG5nVmlld30NCi0gICAgICAgICAgICogY3JlYXRlcyBuZXcgc2NvcGUgYW5kIHJlaW5zdGFudGlhdGVzIHRoZSBjb250cm9sbGVyLg0KLSAgICAgICAgICAgKi8NCi0gICAgICAgICAgcmVsb2FkOiBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBmb3JjZVJlbG9hZCA9IHRydWU7DQotICAgICAgICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgICAgLy8gRG9uJ3Qgc3VwcG9ydCBjYW5jZWxsYXRpb24gb2YgYSByZWxvYWQgZm9yIG5vdy4uLg0KLSAgICAgICAgICAgICAgcHJlcGFyZVJvdXRlKCk7DQotICAgICAgICAgICAgICBjb21taXRSb3V0ZSgpOw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICB9LA0KLQ0KLSAgICAgICAgICAvKioNCi0gICAgICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAgICAgKiBAbmFtZSAkcm91dGUjdXBkYXRlUGFyYW1zDQotICAgICAgICAgICAqDQotICAgICAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAgICAgKiBDYXVzZXMgYCRyb3V0ZWAgc2VydmljZSB0byB1cGRhdGUgdGhlIGN1cnJlbnQgVVJMLCByZXBsYWNpbmcNCi0gICAgICAgICAgICogY3VycmVudCByb3V0ZSBwYXJhbWV0ZXJzIHdpdGggdGhvc2Ugc3BlY2lmaWVkIGluIGBuZXdQYXJhbXNgLg0KLSAgICAgICAgICAgKiBQcm92aWRlZCBwcm9wZXJ0eSBuYW1lcyB0aGF0IG1hdGNoIHRoZSByb3V0ZSdzIHBhdGggc2VnbWVudA0KLSAgICAgICAgICAgKiBkZWZpbml0aW9ucyB3aWxsIGJlIGludGVycG9sYXRlZCBpbnRvIHRoZSBsb2NhdGlvbidzIHBhdGgsIHdoaWxlDQotICAgICAgICAgICAqIHJlbWFpbmluZyBwcm9wZXJ0aWVzIHdpbGwgYmUgdHJlYXRlZCBhcyBxdWVyeSBwYXJhbXMuDQotICAgICAgICAgICAqDQotICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuZXdQYXJhbXMgbWFwcGluZyBvZiBVUkwgcGFyYW1ldGVyIG5hbWVzIHRvIHZhbHVlcw0KLSAgICAgICAgICAgKi8NCi0gICAgICAgICAgdXBkYXRlUGFyYW1zOiBmdW5jdGlvbihuZXdQYXJhbXMpIHsNCi0gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50ICYmIHRoaXMuY3VycmVudC4kJHJvdXRlKSB7DQotICAgICAgICAgICAgICB2YXIgc2VhcmNoUGFyYW1zID0ge30sIHNlbGY9dGhpczsNCi0NCi0gICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChPYmplY3Qua2V5cyhuZXdQYXJhbXMpLCBmdW5jdGlvbihrZXkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFzZWxmLmN1cnJlbnQucGF0aFBhcmFtc1trZXldKSBzZWFyY2hQYXJhbXNba2V5XSA9IG5ld1BhcmFtc1trZXldOw0KLSAgICAgICAgICAgICAgfSk7DQotDQotICAgICAgICAgICAgICBuZXdQYXJhbXMgPSBhbmd1bGFyLmV4dGVuZCh7fSwgdGhpcy5jdXJyZW50LnBhcmFtcywgbmV3UGFyYW1zKTsNCi0gICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKGludGVycG9sYXRlKHRoaXMuY3VycmVudC4kJHJvdXRlLm9yaWdpbmFsUGF0aCwgbmV3UGFyYW1zKSk7DQotICAgICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKGFuZ3VsYXIuZXh0ZW5kKHt9LCAkbG9jYXRpb24uc2VhcmNoKCksIHNlYXJjaFBhcmFtcykpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgIHRocm93ICRyb3V0ZU1pbkVycignbm9yb3V0JywgJ1RyaWVkIHVwZGF0aW5nIHJvdXRlIHdoZW4gd2l0aCBubyBjdXJyZW50IHJvdXRlJyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9DQotICAgICAgICB9Ow0KLQ0KLSAgICAkcm9vdFNjb3BlLiRvbignJGxvY2F0aW9uQ2hhbmdlU3RhcnQnLCBwcmVwYXJlUm91dGUpOw0KLSAgICAkcm9vdFNjb3BlLiRvbignJGxvY2F0aW9uQ2hhbmdlU3VjY2VzcycsIGNvbW1pdFJvdXRlKTsNCi0NCi0gICAgcmV0dXJuICRyb3V0ZTsNCi0NCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBvbiB7c3RyaW5nfSBjdXJyZW50IHVybA0KLSAgICAgKiBAcGFyYW0gcm91dGUge09iamVjdH0gcm91dGUgcmVnZXhwIHRvIG1hdGNoIHRoZSB1cmwgYWdhaW5zdA0KLSAgICAgKiBAcmV0dXJuIHs/T2JqZWN0fQ0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogQ2hlY2sgaWYgdGhlIHJvdXRlIG1hdGNoZXMgdGhlIGN1cnJlbnQgdXJsLg0KLSAgICAgKg0KLSAgICAgKiBJbnNwaXJlZCBieSBtYXRjaCBpbg0KLSAgICAgKiB2aXNpb25tZWRpYS9leHByZXNzL2xpYi9yb3V0ZXIvcm91dGVyLmpzLg0KLSAgICAgKi8NCi0gICAgZnVuY3Rpb24gc3dpdGNoUm91dGVNYXRjaGVyKG9uLCByb3V0ZSkgew0KLSAgICAgIHZhciBrZXlzID0gcm91dGUua2V5cywNCi0gICAgICAgICAgcGFyYW1zID0ge307DQotDQotICAgICAgaWYgKCFyb3V0ZS5yZWdleHApIHJldHVybiBudWxsOw0KLQ0KLSAgICAgIHZhciBtID0gcm91dGUucmVnZXhwLmV4ZWMob24pOw0KLSAgICAgIGlmICghbSkgcmV0dXJuIG51bGw7DQotDQotICAgICAgZm9yICh2YXIgaSA9IDEsIGxlbiA9IG0ubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsNCi0gICAgICAgIHZhciBrZXkgPSBrZXlzW2kgLSAxXTsNCi0NCi0gICAgICAgIHZhciB2YWwgPSBtW2ldOw0KLQ0KLSAgICAgICAgaWYgKGtleSAmJiB2YWwpIHsNCi0gICAgICAgICAgcGFyYW1zW2tleS5uYW1lXSA9IHZhbDsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgcmV0dXJuIHBhcmFtczsNCi0gICAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBwcmVwYXJlUm91dGUoJGxvY2F0aW9uRXZlbnQpIHsNCi0gICAgICB2YXIgbGFzdFJvdXRlID0gJHJvdXRlLmN1cnJlbnQ7DQotDQotICAgICAgcHJlcGFyZWRSb3V0ZSA9IHBhcnNlUm91dGUoKTsNCi0gICAgICBwcmVwYXJlZFJvdXRlSXNVcGRhdGVPbmx5ID0gcHJlcGFyZWRSb3V0ZSAmJiBsYXN0Um91dGUgJiYgcHJlcGFyZWRSb3V0ZS4kJHJvdXRlID09PSBsYXN0Um91dGUuJCRyb3V0ZQ0KLSAgICAgICAgICAmJiBhbmd1bGFyLmVxdWFscyhwcmVwYXJlZFJvdXRlLnBhdGhQYXJhbXMsIGxhc3RSb3V0ZS5wYXRoUGFyYW1zKQ0KLSAgICAgICAgICAmJiAhcHJlcGFyZWRSb3V0ZS5yZWxvYWRPblNlYXJjaCAmJiAhZm9yY2VSZWxvYWQ7DQotDQotICAgICAgaWYgKCFwcmVwYXJlZFJvdXRlSXNVcGRhdGVPbmx5ICYmIChsYXN0Um91dGUgfHwgcHJlcGFyZWRSb3V0ZSkpIHsNCi0gICAgICAgIGlmICgkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRyb3V0ZUNoYW5nZVN0YXJ0JywgcHJlcGFyZWRSb3V0ZSwgbGFzdFJvdXRlKS5kZWZhdWx0UHJldmVudGVkKSB7DQotICAgICAgICAgIGlmICgkbG9jYXRpb25FdmVudCkgew0KLSAgICAgICAgICAgICRsb2NhdGlvbkV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gY29tbWl0Um91dGUoKSB7DQotICAgICAgdmFyIGxhc3RSb3V0ZSA9ICRyb3V0ZS5jdXJyZW50Ow0KLSAgICAgIHZhciBuZXh0Um91dGUgPSBwcmVwYXJlZFJvdXRlOw0KLQ0KLSAgICAgIGlmIChwcmVwYXJlZFJvdXRlSXNVcGRhdGVPbmx5KSB7DQotICAgICAgICBsYXN0Um91dGUucGFyYW1zID0gbmV4dFJvdXRlLnBhcmFtczsNCi0gICAgICAgIGFuZ3VsYXIuY29weShsYXN0Um91dGUucGFyYW1zLCAkcm91dGVQYXJhbXMpOw0KLSAgICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckcm91dGVVcGRhdGUnLCBsYXN0Um91dGUpOw0KLSAgICAgIH0gZWxzZSBpZiAobmV4dFJvdXRlIHx8IGxhc3RSb3V0ZSkgew0KLSAgICAgICAgZm9yY2VSZWxvYWQgPSBmYWxzZTsNCi0gICAgICAgICRyb3V0ZS5jdXJyZW50ID0gbmV4dFJvdXRlOw0KLSAgICAgICAgaWYgKG5leHRSb3V0ZSkgew0KLSAgICAgICAgICBpZiAobmV4dFJvdXRlLnJlZGlyZWN0VG8pIHsNCi0gICAgICAgICAgICBpZiAoYW5ndWxhci5pc1N0cmluZyhuZXh0Um91dGUucmVkaXJlY3RUbykpIHsNCi0gICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKGludGVycG9sYXRlKG5leHRSb3V0ZS5yZWRpcmVjdFRvLCBuZXh0Um91dGUucGFyYW1zKSkuc2VhcmNoKG5leHRSb3V0ZS5wYXJhbXMpDQotICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAkbG9jYXRpb24udXJsKG5leHRSb3V0ZS5yZWRpcmVjdFRvKG5leHRSb3V0ZS5wYXRoUGFyYW1zLCAkbG9jYXRpb24ucGF0aCgpLCAkbG9jYXRpb24uc2VhcmNoKCkpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgICRxLndoZW4obmV4dFJvdXRlKS4NCi0gICAgICAgICAgdGhlbihmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBpZiAobmV4dFJvdXRlKSB7DQotICAgICAgICAgICAgICB2YXIgbG9jYWxzID0gYW5ndWxhci5leHRlbmQoe30sIG5leHRSb3V0ZS5yZXNvbHZlKSwNCi0gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwgdGVtcGxhdGVVcmw7DQotDQotICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gobG9jYWxzLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7DQotICAgICAgICAgICAgICAgIGxvY2Fsc1trZXldID0gYW5ndWxhci5pc1N0cmluZyh2YWx1ZSkgPw0KLSAgICAgICAgICAgICAgICAgICAgJGluamVjdG9yLmdldCh2YWx1ZSkgOiAkaW5qZWN0b3IuaW52b2tlKHZhbHVlLCBudWxsLCBudWxsLCBrZXkpOw0KLSAgICAgICAgICAgICAgfSk7DQotDQotICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQodGVtcGxhdGUgPSBuZXh0Um91dGUudGVtcGxhdGUpKSB7DQotICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRnVuY3Rpb24odGVtcGxhdGUpKSB7DQotICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZShuZXh0Um91dGUucGFyYW1zKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbmd1bGFyLmlzRGVmaW5lZCh0ZW1wbGF0ZVVybCA9IG5leHRSb3V0ZS50ZW1wbGF0ZVVybCkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNGdW5jdGlvbih0ZW1wbGF0ZVVybCkpIHsNCi0gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybCA9IHRlbXBsYXRlVXJsKG5leHRSb3V0ZS5wYXJhbXMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsID0gJHNjZS5nZXRUcnVzdGVkUmVzb3VyY2VVcmwodGVtcGxhdGVVcmwpOw0KLSAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQodGVtcGxhdGVVcmwpKSB7DQotICAgICAgICAgICAgICAgICAgbmV4dFJvdXRlLmxvYWRlZFRlbXBsYXRlVXJsID0gdGVtcGxhdGVVcmw7DQotICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAkdGVtcGxhdGVSZXF1ZXN0KHRlbXBsYXRlVXJsKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKHRlbXBsYXRlKSkgew0KLSAgICAgICAgICAgICAgICBsb2NhbHNbJyR0ZW1wbGF0ZSddID0gdGVtcGxhdGU7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICByZXR1cm4gJHEuYWxsKGxvY2Fscyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9KS4NCi0gICAgICAgICAgLy8gYWZ0ZXIgcm91dGUgY2hhbmdlDQotICAgICAgICAgIHRoZW4oZnVuY3Rpb24obG9jYWxzKSB7DQotICAgICAgICAgICAgaWYgKG5leHRSb3V0ZSA9PSAkcm91dGUuY3VycmVudCkgew0KLSAgICAgICAgICAgICAgaWYgKG5leHRSb3V0ZSkgew0KLSAgICAgICAgICAgICAgICBuZXh0Um91dGUubG9jYWxzID0gbG9jYWxzOw0KLSAgICAgICAgICAgICAgICBhbmd1bGFyLmNvcHkobmV4dFJvdXRlLnBhcmFtcywgJHJvdXRlUGFyYW1zKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICRyb290U2NvcGUuJGJyb2FkY2FzdCgnJHJvdXRlQ2hhbmdlU3VjY2VzcycsIG5leHRSb3V0ZSwgbGFzdFJvdXRlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7DQotICAgICAgICAgICAgaWYgKG5leHRSb3V0ZSA9PSAkcm91dGUuY3VycmVudCkgew0KLSAgICAgICAgICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckcm91dGVDaGFuZ2VFcnJvcicsIG5leHRSb3V0ZSwgbGFzdFJvdXRlLCBlcnJvcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9KTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSBjdXJyZW50IGFjdGl2ZSByb3V0ZSwgYnkgbWF0Y2hpbmcgaXQgYWdhaW5zdCB0aGUgVVJMDQotICAgICAqLw0KLSAgICBmdW5jdGlvbiBwYXJzZVJvdXRlKCkgew0KLSAgICAgIC8vIE1hdGNoIGEgcm91dGUNCi0gICAgICB2YXIgcGFyYW1zLCBtYXRjaDsNCi0gICAgICBhbmd1bGFyLmZvckVhY2gocm91dGVzLCBmdW5jdGlvbihyb3V0ZSwgcGF0aCkgew0KLSAgICAgICAgaWYgKCFtYXRjaCAmJiAocGFyYW1zID0gc3dpdGNoUm91dGVNYXRjaGVyKCRsb2NhdGlvbi5wYXRoKCksIHJvdXRlKSkpIHsNCi0gICAgICAgICAgbWF0Y2ggPSBpbmhlcml0KHJvdXRlLCB7DQotICAgICAgICAgICAgcGFyYW1zOiBhbmd1bGFyLmV4dGVuZCh7fSwgJGxvY2F0aW9uLnNlYXJjaCgpLCBwYXJhbXMpLA0KLSAgICAgICAgICAgIHBhdGhQYXJhbXM6IHBhcmFtc30pOw0KLSAgICAgICAgICBtYXRjaC4kJHJvdXRlID0gcm91dGU7DQotICAgICAgICB9DQotICAgICAgfSk7DQotICAgICAgLy8gTm8gcm91dGUgbWF0Y2hlZDsgZmFsbGJhY2sgdG8gIm90aGVyd2lzZSIgcm91dGUNCi0gICAgICByZXR1cm4gbWF0Y2ggfHwgcm91dGVzW251bGxdICYmIGluaGVyaXQocm91dGVzW251bGxdLCB7cGFyYW1zOiB7fSwgcGF0aFBhcmFtczp7fX0pOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBpbnRlcnBvbGF0aW9uIG9mIHRoZSByZWRpcmVjdCBwYXRoIHdpdGggdGhlIHBhcmFtZXRlcnMNCi0gICAgICovDQotICAgIGZ1bmN0aW9uIGludGVycG9sYXRlKHN0cmluZywgcGFyYW1zKSB7DQotICAgICAgdmFyIHJlc3VsdCA9IFtdOw0KLSAgICAgIGFuZ3VsYXIuZm9yRWFjaCgoc3RyaW5nIHx8ICcnKS5zcGxpdCgnOicpLCBmdW5jdGlvbihzZWdtZW50LCBpKSB7DQotICAgICAgICBpZiAoaSA9PT0gMCkgew0KLSAgICAgICAgICByZXN1bHQucHVzaChzZWdtZW50KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIHZhciBzZWdtZW50TWF0Y2ggPSBzZWdtZW50Lm1hdGNoKC8oXHcrKSg/Ols/Kl0pPyguKikvKTsNCi0gICAgICAgICAgdmFyIGtleSA9IHNlZ21lbnRNYXRjaFsxXTsNCi0gICAgICAgICAgcmVzdWx0LnB1c2gocGFyYW1zW2tleV0pOw0KLSAgICAgICAgICByZXN1bHQucHVzaChzZWdtZW50TWF0Y2hbMl0gfHwgJycpOw0KLSAgICAgICAgICBkZWxldGUgcGFyYW1zW2tleV07DQotICAgICAgICB9DQotICAgICAgfSk7DQotICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsNCi0gICAgfQ0KLSAgfV07DQotfQ0KLQ0KLW5nUm91dGVNb2R1bGUucHJvdmlkZXIoJyRyb3V0ZVBhcmFtcycsICRSb3V0ZVBhcmFtc1Byb3ZpZGVyKTsNCi0NCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICRyb3V0ZVBhcmFtcw0KLSAqIEByZXF1aXJlcyAkcm91dGUNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRoZSBgJHJvdXRlUGFyYW1zYCBzZXJ2aWNlIGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgc2V0IG9mIHJvdXRlIHBhcmFtZXRlcnMuDQotICoNCi0gKiBSZXF1aXJlcyB0aGUge0BsaW5rIG5nUm91dGUgYG5nUm91dGVgfSBtb2R1bGUgdG8gYmUgaW5zdGFsbGVkLg0KLSAqDQotICogVGhlIHJvdXRlIHBhcmFtZXRlcnMgYXJlIGEgY29tYmluYXRpb24gb2Yge0BsaW5rIG5nLiRsb2NhdGlvbiBgJGxvY2F0aW9uYH0ncw0KLSAqIHtAbGluayBuZy4kbG9jYXRpb24jc2VhcmNoIGBzZWFyY2goKWB9IGFuZCB7QGxpbmsgbmcuJGxvY2F0aW9uI3BhdGggYHBhdGgoKWB9Lg0KLSAqIFRoZSBgcGF0aGAgcGFyYW1ldGVycyBhcmUgZXh0cmFjdGVkIHdoZW4gdGhlIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSBgJHJvdXRlYH0gcGF0aCBpcyBtYXRjaGVkLg0KLSAqDQotICogSW4gY2FzZSBvZiBwYXJhbWV0ZXIgbmFtZSBjb2xsaXNpb24sIGBwYXRoYCBwYXJhbXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgYHNlYXJjaGAgcGFyYW1zLg0KLSAqDQotICogVGhlIHNlcnZpY2UgZ3VhcmFudGVlcyB0aGF0IHRoZSBpZGVudGl0eSBvZiB0aGUgYCRyb3V0ZVBhcmFtc2Agb2JqZWN0IHdpbGwgcmVtYWluIHVuY2hhbmdlZA0KLSAqIChidXQgaXRzIHByb3BlcnRpZXMgd2lsbCBsaWtlbHkgY2hhbmdlKSBldmVuIHdoZW4gYSByb3V0ZSBjaGFuZ2Ugb2NjdXJzLg0KLSAqDQotICogTm90ZSB0aGF0IHRoZSBgJHJvdXRlUGFyYW1zYCBhcmUgb25seSB1cGRhdGVkICphZnRlciogYSByb3V0ZSBjaGFuZ2UgY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4NCi0gKiBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbm5vdCByZWx5IG9uIGAkcm91dGVQYXJhbXNgIGJlaW5nIGNvcnJlY3QgaW4gcm91dGUgcmVzb2x2ZSBmdW5jdGlvbnMuDQotICogSW5zdGVhZCB5b3UgY2FuIHVzZSBgJHJvdXRlLmN1cnJlbnQucGFyYW1zYCB0byBhY2Nlc3MgdGhlIG5ldyByb3V0ZSdzIHBhcmFtZXRlcnMuDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAqIGBgYGpzDQotICogIC8vIEdpdmVuOg0KLSAqICAvLyBVUkw6IGh0dHA6Ly9zZXJ2ZXIuY29tL2luZGV4Lmh0bWwjL0NoYXB0ZXIvMS9TZWN0aW9uLzI/c2VhcmNoPW1vYnkNCi0gKiAgLy8gUm91dGU6IC9DaGFwdGVyLzpjaGFwdGVySWQvU2VjdGlvbi86c2VjdGlvbklkDQotICogIC8vDQotICogIC8vIFRoZW4NCi0gKiAgJHJvdXRlUGFyYW1zID09PiB7Y2hhcHRlcklkOicxJywgc2VjdGlvbklkOicyJywgc2VhcmNoOidtb2J5J30NCi0gKiBgYGANCi0gKi8NCi1mdW5jdGlvbiAkUm91dGVQYXJhbXNQcm92aWRlcigpIHsNCi0gIHRoaXMuJGdldCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4ge307IH07DQotfQ0KLQ0KLW5nUm91dGVNb2R1bGUuZGlyZWN0aXZlKCduZ1ZpZXcnLCBuZ1ZpZXdGYWN0b3J5KTsNCi1uZ1JvdXRlTW9kdWxlLmRpcmVjdGl2ZSgnbmdWaWV3JywgbmdWaWV3RmlsbENvbnRlbnRGYWN0b3J5KTsNCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZGlyZWN0aXZlDQotICogQG5hbWUgbmdWaWV3DQotICogQHJlc3RyaWN0IEVDQQ0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogIyBPdmVydmlldw0KLSAqIGBuZ1ZpZXdgIGlzIGEgZGlyZWN0aXZlIHRoYXQgY29tcGxlbWVudHMgdGhlIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSAkcm91dGV9IHNlcnZpY2UgYnkNCi0gKiBpbmNsdWRpbmcgdGhlIHJlbmRlcmVkIHRlbXBsYXRlIG9mIHRoZSBjdXJyZW50IHJvdXRlIGludG8gdGhlIG1haW4gbGF5b3V0IChgaW5kZXguaHRtbGApIGZpbGUuDQotICogRXZlcnkgdGltZSB0aGUgY3VycmVudCByb3V0ZSBjaGFuZ2VzLCB0aGUgaW5jbHVkZWQgdmlldyBjaGFuZ2VzIHdpdGggaXQgYWNjb3JkaW5nIHRvIHRoZQ0KLSAqIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGAkcm91dGVgIHNlcnZpY2UuDQotICoNCi0gKiBSZXF1aXJlcyB0aGUge0BsaW5rIG5nUm91dGUgYG5nUm91dGVgfSBtb2R1bGUgdG8gYmUgaW5zdGFsbGVkLg0KLSAqDQotICogQGFuaW1hdGlvbnMNCi0gKiBlbnRlciAtIGFuaW1hdGlvbiBpcyB1c2VkIHRvIGJyaW5nIG5ldyBjb250ZW50IGludG8gdGhlIGJyb3dzZXIuDQotICogbGVhdmUgLSBhbmltYXRpb24gaXMgdXNlZCB0byBhbmltYXRlIGV4aXN0aW5nIGNvbnRlbnQgYXdheS4NCi0gKg0KLSAqIFRoZSBlbnRlciBhbmQgbGVhdmUgYW5pbWF0aW9uIG9jY3VyIGNvbmN1cnJlbnRseS4NCi0gKg0KLSAqIEBzY29wZQ0KLSAqIEBwcmlvcml0eSA0MDANCi0gKiBAcGFyYW0ge3N0cmluZz19IG9ubG9hZCBFeHByZXNzaW9uIHRvIGV2YWx1YXRlIHdoZW5ldmVyIHRoZSB2aWV3IHVwZGF0ZXMuDQotICoNCi0gKiBAcGFyYW0ge3N0cmluZz19IGF1dG9zY3JvbGwgV2hldGhlciBgbmdWaWV3YCBzaG91bGQgY2FsbCB7QGxpbmsgbmcuJGFuY2hvclNjcm9sbA0KLSAqICAgICAgICAgICAgICAgICAgJGFuY2hvclNjcm9sbH0gdG8gc2Nyb2xsIHRoZSB2aWV3cG9ydCBhZnRlciB0aGUgdmlldyBpcyB1cGRhdGVkLg0KLSAqDQotICogICAgICAgICAgICAgICAgICAtIElmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHNldCwgZGlzYWJsZSBzY3JvbGxpbmcuDQotICogICAgICAgICAgICAgICAgICAtIElmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0IHdpdGhvdXQgdmFsdWUsIGVuYWJsZSBzY3JvbGxpbmcuDQotICogICAgICAgICAgICAgICAgICAtIE90aGVyd2lzZSBlbmFibGUgc2Nyb2xsaW5nIG9ubHkgaWYgdGhlIGBhdXRvc2Nyb2xsYCBhdHRyaWJ1dGUgdmFsdWUgZXZhbHVhdGVkDQotICogICAgICAgICAgICAgICAgICAgIGFzIGFuIGV4cHJlc3Npb24geWllbGRzIGEgdHJ1dGh5IHZhbHVlLg0KLSAqIEBleGFtcGxlDQotICAgIDxleGFtcGxlIG5hbWU9Im5nVmlldy1kaXJlY3RpdmUiIG1vZHVsZT0ibmdWaWV3RXhhbXBsZSINCi0gICAgICAgICAgICAgZGVwcz0iYW5ndWxhci1yb3V0ZS5qczthbmd1bGFyLWFuaW1hdGUuanMiDQotICAgICAgICAgICAgIGFuaW1hdGlvbnM9InRydWUiIGZpeEJhc2U9InRydWUiPg0KLSAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJNYWluQ3RybCBhcyBtYWluIj4NCi0gICAgICAgICAgQ2hvb3NlOg0KLSAgICAgICAgICA8YSBocmVmPSJCb29rL01vYnkiPk1vYnk8L2E+IHwNCi0gICAgICAgICAgPGEgaHJlZj0iQm9vay9Nb2J5L2NoLzEiPk1vYnk6IENoMTwvYT4gfA0KLSAgICAgICAgICA8YSBocmVmPSJCb29rL0dhdHNieSI+R2F0c2J5PC9hPiB8DQotICAgICAgICAgIDxhIGhyZWY9IkJvb2svR2F0c2J5L2NoLzQ/a2V5PXZhbHVlIj5HYXRzYnk6IENoNDwvYT4gfA0KLSAgICAgICAgICA8YSBocmVmPSJCb29rL1NjYXJsZXQiPlNjYXJsZXQgTGV0dGVyPC9hPjxici8+DQotDQotICAgICAgICAgIDxkaXYgY2xhc3M9InZpZXctYW5pbWF0ZS1jb250YWluZXIiPg0KLSAgICAgICAgICAgIDxkaXYgbmctdmlldyBjbGFzcz0idmlldy1hbmltYXRlIj48L2Rpdj4NCi0gICAgICAgICAgPC9kaXY+DQotICAgICAgICAgIDxociAvPg0KLQ0KLSAgICAgICAgICA8cHJlPiRsb2NhdGlvbi5wYXRoKCkgPSB7e21haW4uJGxvY2F0aW9uLnBhdGgoKX19PC9wcmU+DQotICAgICAgICAgIDxwcmU+JHJvdXRlLmN1cnJlbnQudGVtcGxhdGVVcmwgPSB7e21haW4uJHJvdXRlLmN1cnJlbnQudGVtcGxhdGVVcmx9fTwvcHJlPg0KLSAgICAgICAgICA8cHJlPiRyb3V0ZS5jdXJyZW50LnBhcmFtcyA9IHt7bWFpbi4kcm91dGUuY3VycmVudC5wYXJhbXN9fTwvcHJlPg0KLSAgICAgICAgICA8cHJlPiRyb3V0ZVBhcmFtcyA9IHt7bWFpbi4kcm91dGVQYXJhbXN9fTwvcHJlPg0KLSAgICAgICAgPC9kaXY+DQotICAgICAgPC9maWxlPg0KLQ0KLSAgICAgIDxmaWxlIG5hbWU9ImJvb2suaHRtbCI+DQotICAgICAgICA8ZGl2Pg0KLSAgICAgICAgICBjb250cm9sbGVyOiB7e2Jvb2submFtZX19PGJyIC8+DQotICAgICAgICAgIEJvb2sgSWQ6IHt7Ym9vay5wYXJhbXMuYm9va0lkfX08YnIgLz4NCi0gICAgICAgIDwvZGl2Pg0KLSAgICAgIDwvZmlsZT4NCi0NCi0gICAgICA8ZmlsZSBuYW1lPSJjaGFwdGVyLmh0bWwiPg0KLSAgICAgICAgPGRpdj4NCi0gICAgICAgICAgY29udHJvbGxlcjoge3tjaGFwdGVyLm5hbWV9fTxiciAvPg0KLSAgICAgICAgICBCb29rIElkOiB7e2NoYXB0ZXIucGFyYW1zLmJvb2tJZH19PGJyIC8+DQotICAgICAgICAgIENoYXB0ZXIgSWQ6IHt7Y2hhcHRlci5wYXJhbXMuY2hhcHRlcklkfX0NCi0gICAgICAgIDwvZGl2Pg0KLSAgICAgIDwvZmlsZT4NCi0NCi0gICAgICA8ZmlsZSBuYW1lPSJhbmltYXRpb25zLmNzcyI+DQotICAgICAgICAudmlldy1hbmltYXRlLWNvbnRhaW5lciB7DQotICAgICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlOw0KLSAgICAgICAgICBoZWlnaHQ6MTAwcHghaW1wb3J0YW50Ow0KLSAgICAgICAgICBiYWNrZ3JvdW5kOndoaXRlOw0KLSAgICAgICAgICBib3JkZXI6MXB4IHNvbGlkIGJsYWNrOw0KLSAgICAgICAgICBoZWlnaHQ6NDBweDsNCi0gICAgICAgICAgb3ZlcmZsb3c6aGlkZGVuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLnZpZXctYW5pbWF0ZSB7DQotICAgICAgICAgIHBhZGRpbmc6MTBweDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC52aWV3LWFuaW1hdGUubmctZW50ZXIsIC52aWV3LWFuaW1hdGUubmctbGVhdmUgew0KLSAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246YWxsIGN1YmljLWJlemllcigwLjI1MCwgMC40NjAsIDAuNDUwLCAwLjk0MCkgMS41czsNCi0gICAgICAgICAgdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAxLjVzOw0KLQ0KLSAgICAgICAgICBkaXNwbGF5OmJsb2NrOw0KLSAgICAgICAgICB3aWR0aDoxMDAlOw0KLSAgICAgICAgICBib3JkZXItbGVmdDoxcHggc29saWQgYmxhY2s7DQotDQotICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOw0KLSAgICAgICAgICB0b3A6MDsNCi0gICAgICAgICAgbGVmdDowOw0KLSAgICAgICAgICByaWdodDowOw0KLSAgICAgICAgICBib3R0b206MDsNCi0gICAgICAgICAgcGFkZGluZzoxMHB4Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLnZpZXctYW5pbWF0ZS5uZy1lbnRlciB7DQotICAgICAgICAgIGxlZnQ6MTAwJTsNCi0gICAgICAgIH0NCi0gICAgICAgIC52aWV3LWFuaW1hdGUubmctZW50ZXIubmctZW50ZXItYWN0aXZlIHsNCi0gICAgICAgICAgbGVmdDowOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLnZpZXctYW5pbWF0ZS5uZy1sZWF2ZS5uZy1sZWF2ZS1hY3RpdmUgew0KLSAgICAgICAgICBsZWZ0Oi0xMDAlOw0KLSAgICAgICAgfQ0KLSAgICAgIDwvZmlsZT4NCi0NCi0gICAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPg0KLSAgICAgICAgYW5ndWxhci5tb2R1bGUoJ25nVmlld0V4YW1wbGUnLCBbJ25nUm91dGUnLCAnbmdBbmltYXRlJ10pDQotICAgICAgICAgIC5jb25maWcoWyckcm91dGVQcm92aWRlcicsICckbG9jYXRpb25Qcm92aWRlcicsDQotICAgICAgICAgICAgZnVuY3Rpb24oJHJvdXRlUHJvdmlkZXIsICRsb2NhdGlvblByb3ZpZGVyKSB7DQotICAgICAgICAgICAgICAkcm91dGVQcm92aWRlcg0KLSAgICAgICAgICAgICAgICAud2hlbignL0Jvb2svOmJvb2tJZCcsIHsNCi0gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jvb2suaHRtbCcsDQotICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogJ0Jvb2tDdHJsJywNCi0gICAgICAgICAgICAgICAgICBjb250cm9sbGVyQXM6ICdib29rJw0KLSAgICAgICAgICAgICAgICB9KQ0KLSAgICAgICAgICAgICAgICAud2hlbignL0Jvb2svOmJvb2tJZC9jaC86Y2hhcHRlcklkJywgew0KLSAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY2hhcHRlci5odG1sJywNCi0gICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnQ2hhcHRlckN0cmwnLA0KLSAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJBczogJ2NoYXB0ZXInDQotICAgICAgICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgICAgICAgJGxvY2F0aW9uUHJvdmlkZXIuaHRtbDVNb2RlKHRydWUpOw0KLSAgICAgICAgICB9XSkNCi0gICAgICAgICAgLmNvbnRyb2xsZXIoJ01haW5DdHJsJywgWyckcm91dGUnLCAnJHJvdXRlUGFyYW1zJywgJyRsb2NhdGlvbicsDQotICAgICAgICAgICAgZnVuY3Rpb24oJHJvdXRlLCAkcm91dGVQYXJhbXMsICRsb2NhdGlvbikgew0KLSAgICAgICAgICAgICAgdGhpcy4kcm91dGUgPSAkcm91dGU7DQotICAgICAgICAgICAgICB0aGlzLiRsb2NhdGlvbiA9ICRsb2NhdGlvbjsNCi0gICAgICAgICAgICAgIHRoaXMuJHJvdXRlUGFyYW1zID0gJHJvdXRlUGFyYW1zOw0KLSAgICAgICAgICB9XSkNCi0gICAgICAgICAgLmNvbnRyb2xsZXIoJ0Jvb2tDdHJsJywgWyckcm91dGVQYXJhbXMnLCBmdW5jdGlvbigkcm91dGVQYXJhbXMpIHsNCi0gICAgICAgICAgICB0aGlzLm5hbWUgPSAiQm9va0N0cmwiOw0KLSAgICAgICAgICAgIHRoaXMucGFyYW1zID0gJHJvdXRlUGFyYW1zOw0KLSAgICAgICAgICB9XSkNCi0gICAgICAgICAgLmNvbnRyb2xsZXIoJ0NoYXB0ZXJDdHJsJywgWyckcm91dGVQYXJhbXMnLCBmdW5jdGlvbigkcm91dGVQYXJhbXMpIHsNCi0gICAgICAgICAgICB0aGlzLm5hbWUgPSAiQ2hhcHRlckN0cmwiOw0KLSAgICAgICAgICAgIHRoaXMucGFyYW1zID0gJHJvdXRlUGFyYW1zOw0KLSAgICAgICAgICB9XSk7DQotDQotICAgICAgPC9maWxlPg0KLQ0KLSAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICAgaXQoJ3Nob3VsZCBsb2FkIGFuZCBjb21waWxlIGNvcnJlY3QgdGVtcGxhdGUnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgZWxlbWVudChieS5saW5rVGV4dCgnTW9ieTogQ2gxJykpLmNsaWNrKCk7DQotICAgICAgICAgIHZhciBjb250ZW50ID0gZWxlbWVudChieS5jc3MoJ1tuZy12aWV3XScpKS5nZXRUZXh0KCk7DQotICAgICAgICAgIGV4cGVjdChjb250ZW50KS50b01hdGNoKC9jb250cm9sbGVyXDogQ2hhcHRlckN0cmwvKTsNCi0gICAgICAgICAgZXhwZWN0KGNvbnRlbnQpLnRvTWF0Y2goL0Jvb2sgSWRcOiBNb2J5Lyk7DQotICAgICAgICAgIGV4cGVjdChjb250ZW50KS50b01hdGNoKC9DaGFwdGVyIElkXDogMS8pOw0KLQ0KLSAgICAgICAgICBlbGVtZW50KGJ5LnBhcnRpYWxMaW5rVGV4dCgnU2NhcmxldCcpKS5jbGljaygpOw0KLQ0KLSAgICAgICAgICBjb250ZW50ID0gZWxlbWVudChieS5jc3MoJ1tuZy12aWV3XScpKS5nZXRUZXh0KCk7DQotICAgICAgICAgIGV4cGVjdChjb250ZW50KS50b01hdGNoKC9jb250cm9sbGVyXDogQm9va0N0cmwvKTsNCi0gICAgICAgICAgZXhwZWN0KGNvbnRlbnQpLnRvTWF0Y2goL0Jvb2sgSWRcOiBTY2FybGV0Lyk7DQotICAgICAgICB9KTsNCi0gICAgICA8L2ZpbGU+DQotICAgIDwvZXhhbXBsZT4NCi0gKi8NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZXZlbnQNCi0gKiBAbmFtZSBuZ1ZpZXcjJHZpZXdDb250ZW50TG9hZGVkDQotICogQGV2ZW50VHlwZSBlbWl0IG9uIHRoZSBjdXJyZW50IG5nVmlldyBzY29wZQ0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEVtaXR0ZWQgZXZlcnkgdGltZSB0aGUgbmdWaWV3IGNvbnRlbnQgaXMgcmVsb2FkZWQuDQotICovDQotbmdWaWV3RmFjdG9yeS4kaW5qZWN0ID0gWyckcm91dGUnLCAnJGFuY2hvclNjcm9sbCcsICckYW5pbWF0ZSddOw0KLWZ1bmN0aW9uIG5nVmlld0ZhY3RvcnkoJHJvdXRlLCAkYW5jaG9yU2Nyb2xsLCAkYW5pbWF0ZSkgew0KLSAgcmV0dXJuIHsNCi0gICAgcmVzdHJpY3Q6ICdFQ0EnLA0KLSAgICB0ZXJtaW5hbDogdHJ1ZSwNCi0gICAgcHJpb3JpdHk6IDQwMCwNCi0gICAgdHJhbnNjbHVkZTogJ2VsZW1lbnQnLA0KLSAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgJGVsZW1lbnQsIGF0dHIsIGN0cmwsICR0cmFuc2NsdWRlKSB7DQotICAgICAgICB2YXIgY3VycmVudFNjb3BlLA0KLSAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LA0KLSAgICAgICAgICAgIHByZXZpb3VzTGVhdmVBbmltYXRpb24sDQotICAgICAgICAgICAgYXV0b1Njcm9sbEV4cCA9IGF0dHIuYXV0b3Njcm9sbCwNCi0gICAgICAgICAgICBvbmxvYWRFeHAgPSBhdHRyLm9ubG9hZCB8fCAnJzsNCi0NCi0gICAgICAgIHNjb3BlLiRvbignJHJvdXRlQ2hhbmdlU3VjY2VzcycsIHVwZGF0ZSk7DQotICAgICAgICB1cGRhdGUoKTsNCi0NCi0gICAgICAgIGZ1bmN0aW9uIGNsZWFudXBMYXN0VmlldygpIHsNCi0gICAgICAgICAgaWYgKHByZXZpb3VzTGVhdmVBbmltYXRpb24pIHsNCi0gICAgICAgICAgICAkYW5pbWF0ZS5jYW5jZWwocHJldmlvdXNMZWF2ZUFuaW1hdGlvbik7DQotICAgICAgICAgICAgcHJldmlvdXNMZWF2ZUFuaW1hdGlvbiA9IG51bGw7DQotICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgaWYgKGN1cnJlbnRTY29wZSkgew0KLSAgICAgICAgICAgIGN1cnJlbnRTY29wZS4kZGVzdHJveSgpOw0KLSAgICAgICAgICAgIGN1cnJlbnRTY29wZSA9IG51bGw7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50KSB7DQotICAgICAgICAgICAgcHJldmlvdXNMZWF2ZUFuaW1hdGlvbiA9ICRhbmltYXRlLmxlYXZlKGN1cnJlbnRFbGVtZW50KTsNCi0gICAgICAgICAgICBwcmV2aW91c0xlYXZlQW5pbWF0aW9uLnRoZW4oZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICBwcmV2aW91c0xlYXZlQW5pbWF0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IG51bGw7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHsNCi0gICAgICAgICAgdmFyIGxvY2FscyA9ICRyb3V0ZS5jdXJyZW50ICYmICRyb3V0ZS5jdXJyZW50LmxvY2FscywNCi0gICAgICAgICAgICAgIHRlbXBsYXRlID0gbG9jYWxzICYmIGxvY2Fscy4kdGVtcGxhdGU7DQotDQotICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZCh0ZW1wbGF0ZSkpIHsNCi0gICAgICAgICAgICB2YXIgbmV3U2NvcGUgPSBzY29wZS4kbmV3KCk7DQotICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSAkcm91dGUuY3VycmVudDsNCi0NCi0gICAgICAgICAgICAvLyBOb3RlOiBUaGlzIHdpbGwgYWxzbyBsaW5rIGFsbCBjaGlsZHJlbiBvZiBuZy12aWV3IHRoYXQgd2VyZSBjb250YWluZWQgaW4gdGhlIG9yaWdpbmFsDQotICAgICAgICAgICAgLy8gaHRtbC4gSWYgdGhhdCBjb250ZW50IGNvbnRhaW5zIGNvbnRyb2xsZXJzLCAuLi4gdGhleSBjb3VsZCBwb2xsdXRlL2NoYW5nZSB0aGUgc2NvcGUuDQotICAgICAgICAgICAgLy8gSG93ZXZlciwgdXNpbmcgbmctdmlldyBvbiBhbiBlbGVtZW50IHdpdGggYWRkaXRpb25hbCBjb250ZW50IGRvZXMgbm90IG1ha2Ugc2Vuc2UuLi4NCi0gICAgICAgICAgICAvLyBOb3RlOiBXZSBjYW4ndCByZW1vdmUgdGhlbSBpbiB0aGUgY2xvbmVBdHRjaEZuIG9mICR0cmFuc2NsdWRlIGFzIHRoYXQNCi0gICAgICAgICAgICAvLyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGxpbmtpbmcgdGhlIGNvbnRlbnQsIHdoaWNoIHdvdWxkIGFwcGx5IGNoaWxkDQotICAgICAgICAgICAgLy8gZGlyZWN0aXZlcyB0byBub24gZXhpc3RpbmcgZWxlbWVudHMuDQotICAgICAgICAgICAgdmFyIGNsb25lID0gJHRyYW5zY2x1ZGUobmV3U2NvcGUsIGZ1bmN0aW9uKGNsb25lKSB7DQotICAgICAgICAgICAgICAkYW5pbWF0ZS5lbnRlcihjbG9uZSwgbnVsbCwgY3VycmVudEVsZW1lbnQgfHwgJGVsZW1lbnQpLnRoZW4oZnVuY3Rpb24gb25OZ1ZpZXdFbnRlcigpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKGF1dG9TY3JvbGxFeHApDQotICAgICAgICAgICAgICAgICAgJiYgKCFhdXRvU2Nyb2xsRXhwIHx8IHNjb3BlLiRldmFsKGF1dG9TY3JvbGxFeHApKSkgew0KLSAgICAgICAgICAgICAgICAgICRhbmNob3JTY3JvbGwoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgICBjbGVhbnVwTGFzdFZpZXcoKTsNCi0gICAgICAgICAgICB9KTsNCi0NCi0gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGNsb25lOw0KLSAgICAgICAgICAgIGN1cnJlbnRTY29wZSA9IGN1cnJlbnQuc2NvcGUgPSBuZXdTY29wZTsNCi0gICAgICAgICAgICBjdXJyZW50U2NvcGUuJGVtaXQoJyR2aWV3Q29udGVudExvYWRlZCcpOw0KLSAgICAgICAgICAgIGN1cnJlbnRTY29wZS4kZXZhbChvbmxvYWRFeHApOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGNsZWFudXBMYXN0VmlldygpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gIH07DQotfQ0KLQ0KLS8vIFRoaXMgZGlyZWN0aXZlIGlzIGNhbGxlZCBkdXJpbmcgdGhlICR0cmFuc2NsdWRlIGNhbGwgb2YgdGhlIGZpcnN0IGBuZ1ZpZXdgIGRpcmVjdGl2ZS4NCi0vLyBJdCB3aWxsIHJlcGxhY2UgYW5kIGNvbXBpbGUgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgd2l0aCB0aGUgbG9hZGVkIHRlbXBsYXRlLg0KLS8vIFdlIG5lZWQgdGhpcyBkaXJlY3RpdmUgc28gdGhhdCB0aGUgZWxlbWVudCBjb250ZW50IGlzIGFscmVhZHkgZmlsbGVkIHdoZW4NCi0vLyB0aGUgbGluayBmdW5jdGlvbiBvZiBhbm90aGVyIGRpcmVjdGl2ZSBvbiB0aGUgc2FtZSBlbGVtZW50IGFzIG5nVmlldw0KLS8vIGlzIGNhbGxlZC4NCi1uZ1ZpZXdGaWxsQ29udGVudEZhY3RvcnkuJGluamVjdCA9IFsnJGNvbXBpbGUnLCAnJGNvbnRyb2xsZXInLCAnJHJvdXRlJ107DQotZnVuY3Rpb24gbmdWaWV3RmlsbENvbnRlbnRGYWN0b3J5KCRjb21waWxlLCAkY29udHJvbGxlciwgJHJvdXRlKSB7DQotICByZXR1cm4gew0KLSAgICByZXN0cmljdDogJ0VDQScsDQotICAgIHByaW9yaXR5OiAtNDAwLA0KLSAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgJGVsZW1lbnQpIHsNCi0gICAgICB2YXIgY3VycmVudCA9ICRyb3V0ZS5jdXJyZW50LA0KLSAgICAgICAgICBsb2NhbHMgPSBjdXJyZW50LmxvY2FsczsNCi0NCi0gICAgICAkZWxlbWVudC5odG1sKGxvY2Fscy4kdGVtcGxhdGUpOw0KLQ0KLSAgICAgIHZhciBsaW5rID0gJGNvbXBpbGUoJGVsZW1lbnQuY29udGVudHMoKSk7DQotDQotICAgICAgaWYgKGN1cnJlbnQuY29udHJvbGxlcikgew0KLSAgICAgICAgbG9jYWxzLiRzY29wZSA9IHNjb3BlOw0KLSAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSAkY29udHJvbGxlcihjdXJyZW50LmNvbnRyb2xsZXIsIGxvY2Fscyk7DQotICAgICAgICBpZiAoY3VycmVudC5jb250cm9sbGVyQXMpIHsNCi0gICAgICAgICAgc2NvcGVbY3VycmVudC5jb250cm9sbGVyQXNdID0gY29udHJvbGxlcjsNCi0gICAgICAgIH0NCi0gICAgICAgICRlbGVtZW50LmRhdGEoJyRuZ0NvbnRyb2xsZXJDb250cm9sbGVyJywgY29udHJvbGxlcik7DQotICAgICAgICAkZWxlbWVudC5jaGlsZHJlbigpLmRhdGEoJyRuZ0NvbnRyb2xsZXJDb250cm9sbGVyJywgY29udHJvbGxlcik7DQotICAgICAgfQ0KLQ0KLSAgICAgIGxpbmsoc2NvcGUpOw0KLSAgICB9DQotICB9Ow0KLX0NCi0NCi0NCi19KSh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKTsNCisvKgorVGhlIE1JVCBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKyovCisvKioKKyAqIEBsaWNlbnNlIEFuZ3VsYXJKUyB2MS4zLjgKKyAqIChjKSAyMDEwLTIwMTQgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnCisgKiBMaWNlbnNlOiBNSVQKKyAqLworKGZ1bmN0aW9uKHdpbmRvdywgYW5ndWxhciwgdW5kZWZpbmVkKSB7J3VzZSBzdHJpY3QnOworCisvKioKKyAqIEBuZ2RvYyBtb2R1bGUKKyAqIEBuYW1lIG5nUm91dGUKKyAqIEBkZXNjcmlwdGlvbgorICoKKyAqICMgbmdSb3V0ZQorICoKKyAqIFRoZSBgbmdSb3V0ZWAgbW9kdWxlIHByb3ZpZGVzIHJvdXRpbmcgYW5kIGRlZXBsaW5raW5nIHNlcnZpY2VzIGFuZCBkaXJlY3RpdmVzIGZvciBhbmd1bGFyIGFwcHMuCisgKgorICogIyMgRXhhbXBsZQorICogU2VlIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSNleGFtcGxlICRyb3V0ZX0gZm9yIGFuIGV4YW1wbGUgb2YgY29uZmlndXJpbmcgYW5kIHVzaW5nIGBuZ1JvdXRlYC4KKyAqCisgKgorICogPGRpdiBkb2MtbW9kdWxlLWNvbXBvbmVudHM9Im5nUm91dGUiPjwvZGl2PgorICovCisgLyogZ2xvYmFsIC1uZ1JvdXRlTW9kdWxlICovCit2YXIgbmdSb3V0ZU1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCduZ1JvdXRlJywgWyduZyddKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyKCckcm91dGUnLCAkUm91dGVQcm92aWRlciksCisgICAgJHJvdXRlTWluRXJyID0gYW5ndWxhci4kJG1pbkVycignbmdSb3V0ZScpOworCisvKioKKyAqIEBuZ2RvYyBwcm92aWRlcgorICogQG5hbWUgJHJvdXRlUHJvdmlkZXIKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBVc2VkIGZvciBjb25maWd1cmluZyByb3V0ZXMuCisgKgorICogIyMgRXhhbXBsZQorICogU2VlIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSNleGFtcGxlICRyb3V0ZX0gZm9yIGFuIGV4YW1wbGUgb2YgY29uZmlndXJpbmcgYW5kIHVzaW5nIGBuZ1JvdXRlYC4KKyAqCisgKiAjIyBEZXBlbmRlbmNpZXMKKyAqIFJlcXVpcmVzIHRoZSB7QGxpbmsgbmdSb3V0ZSBgbmdSb3V0ZWB9IG1vZHVsZSB0byBiZSBpbnN0YWxsZWQuCisgKi8KK2Z1bmN0aW9uICRSb3V0ZVByb3ZpZGVyKCkgeworICBmdW5jdGlvbiBpbmhlcml0KHBhcmVudCwgZXh0cmEpIHsKKyAgICByZXR1cm4gYW5ndWxhci5leHRlbmQoT2JqZWN0LmNyZWF0ZShwYXJlbnQpLCBleHRyYSk7CisgIH0KKworICB2YXIgcm91dGVzID0ge307CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgJHJvdXRlUHJvdmlkZXIjd2hlbgorICAgKgorICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBSb3V0ZSBwYXRoIChtYXRjaGVkIGFnYWluc3QgYCRsb2NhdGlvbi5wYXRoYCkuIElmIGAkbG9jYXRpb24ucGF0aGAKKyAgICogICAgY29udGFpbnMgcmVkdW5kYW50IHRyYWlsaW5nIHNsYXNoIG9yIGlzIG1pc3Npbmcgb25lLCB0aGUgcm91dGUgd2lsbCBzdGlsbCBtYXRjaCBhbmQgdGhlCisgICAqICAgIGAkbG9jYXRpb24ucGF0aGAgd2lsbCBiZSB1cGRhdGVkIHRvIGFkZCBvciBkcm9wIHRoZSB0cmFpbGluZyBzbGFzaCB0byBleGFjdGx5IG1hdGNoIHRoZQorICAgKiAgICByb3V0ZSBkZWZpbml0aW9uLgorICAgKgorICAgKiAgICAqIGBwYXRoYCBjYW4gY29udGFpbiBuYW1lZCBncm91cHMgc3RhcnRpbmcgd2l0aCBhIGNvbG9uOiBlLmcuIGA6bmFtZWAuIEFsbCBjaGFyYWN0ZXJzIHVwCisgICAqICAgICAgICB0byB0aGUgbmV4dCBzbGFzaCBhcmUgbWF0Y2hlZCBhbmQgc3RvcmVkIGluIGAkcm91dGVQYXJhbXNgIHVuZGVyIHRoZSBnaXZlbiBgbmFtZWAKKyAgICogICAgICAgIHdoZW4gdGhlIHJvdXRlIG1hdGNoZXMuCisgICAqICAgICogYHBhdGhgIGNhbiBjb250YWluIG5hbWVkIGdyb3VwcyBzdGFydGluZyB3aXRoIGEgY29sb24gYW5kIGVuZGluZyB3aXRoIGEgc3RhcjoKKyAgICogICAgICAgIGUuZy5gOm5hbWUqYC4gQWxsIGNoYXJhY3RlcnMgYXJlIGVhZ2VybHkgc3RvcmVkIGluIGAkcm91dGVQYXJhbXNgIHVuZGVyIHRoZSBnaXZlbiBgbmFtZWAKKyAgICogICAgICAgIHdoZW4gdGhlIHJvdXRlIG1hdGNoZXMuCisgICAqICAgICogYHBhdGhgIGNhbiBjb250YWluIG9wdGlvbmFsIG5hbWVkIGdyb3VwcyB3aXRoIGEgcXVlc3Rpb24gbWFyazogZS5nLmA6bmFtZT9gLgorICAgKgorICAgKiAgICBGb3IgZXhhbXBsZSwgcm91dGVzIGxpa2UgYC9jb2xvci86Y29sb3IvbGFyZ2Vjb2RlLzpsYXJnZWNvZGUqXC9lZGl0YCB3aWxsIG1hdGNoCisgICAqICAgIGAvY29sb3IvYnJvd24vbGFyZ2Vjb2RlL2NvZGUvd2l0aC9zbGFzaGVzL2VkaXRgIGFuZCBleHRyYWN0OgorICAgKgorICAgKiAgICAqIGBjb2xvcjogYnJvd25gCisgICAqICAgICogYGxhcmdlY29kZTogY29kZS93aXRoL3NsYXNoZXNgLgorICAgKgorICAgKgorICAgKiBAcGFyYW0ge09iamVjdH0gcm91dGUgTWFwcGluZyBpbmZvcm1hdGlvbiB0byBiZSBhc3NpZ25lZCB0byBgJHJvdXRlLmN1cnJlbnRgIG9uIHJvdXRlCisgICAqICAgIG1hdGNoLgorICAgKgorICAgKiAgICBPYmplY3QgcHJvcGVydGllczoKKyAgICoKKyAgICogICAgLSBgY29udHJvbGxlcmAg4oA/IGB7KHN0cmluZ3xmdW5jdGlvbigpPX1gIOKAPyBDb250cm9sbGVyIGZuIHRoYXQgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aAorICAgKiAgICAgIG5ld2x5IGNyZWF0ZWQgc2NvcGUgb3IgdGhlIG5hbWUgb2YgYSB7QGxpbmsgYW5ndWxhci5Nb2R1bGUjY29udHJvbGxlciByZWdpc3RlcmVkCisgICAqICAgICAgY29udHJvbGxlcn0gaWYgcGFzc2VkIGFzIGEgc3RyaW5nLgorICAgKiAgICAtIGBjb250cm9sbGVyQXNgIOKAPyBge3N0cmluZz19YCDigD8gQSBjb250cm9sbGVyIGFsaWFzIG5hbWUuIElmIHByZXNlbnQgdGhlIGNvbnRyb2xsZXIgd2lsbCBiZQorICAgKiAgICAgIHB1Ymxpc2hlZCB0byBzY29wZSB1bmRlciB0aGUgYGNvbnRyb2xsZXJBc2AgbmFtZS4KKyAgICogICAgLSBgdGVtcGxhdGVgIOKAPyBge3N0cmluZz18ZnVuY3Rpb24oKT19YCDigD8gaHRtbCB0ZW1wbGF0ZSBhcyBhIHN0cmluZyBvciBhIGZ1bmN0aW9uIHRoYXQKKyAgICogICAgICByZXR1cm5zIGFuIGh0bWwgdGVtcGxhdGUgYXMgYSBzdHJpbmcgd2hpY2ggc2hvdWxkIGJlIHVzZWQgYnkge0BsaW5rCisgICAqICAgICAgbmdSb3V0ZS5kaXJlY3RpdmU6bmdWaWV3IG5nVmlld30gb3Ige0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0luY2x1ZGUgbmdJbmNsdWRlfSBkaXJlY3RpdmVzLgorICAgKiAgICAgIFRoaXMgcHJvcGVydHkgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGB0ZW1wbGF0ZVVybGAuCisgICAqCisgICAqICAgICAgSWYgYHRlbXBsYXRlYCBpcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAgICoKKyAgICogICAgICAtIGB7QXJyYXkuPE9iamVjdD59YCAtIHJvdXRlIHBhcmFtZXRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIGN1cnJlbnQKKyAgICogICAgICAgIGAkbG9jYXRpb24ucGF0aCgpYCBieSBhcHBseWluZyB0aGUgY3VycmVudCByb3V0ZQorICAgKgorICAgKiAgICAtIGB0ZW1wbGF0ZVVybGAg4oA/IGB7c3RyaW5nPXxmdW5jdGlvbigpPX1gIOKAPyBwYXRoIG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHBhdGggdG8gYW4gaHRtbAorICAgKiAgICAgIHRlbXBsYXRlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkge0BsaW5rIG5nUm91dGUuZGlyZWN0aXZlOm5nVmlldyBuZ1ZpZXd9LgorICAgKgorICAgKiAgICAgIElmIGB0ZW1wbGF0ZVVybGAgaXMgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisgICAqCisgICAqICAgICAgLSBge0FycmF5LjxPYmplY3Q+fWAgLSByb3V0ZSBwYXJhbWV0ZXJzIGV4dHJhY3RlZCBmcm9tIHRoZSBjdXJyZW50CisgICAqICAgICAgICBgJGxvY2F0aW9uLnBhdGgoKWAgYnkgYXBwbHlpbmcgdGhlIGN1cnJlbnQgcm91dGUKKyAgICoKKyAgICogICAgLSBgcmVzb2x2ZWAgLSBge09iamVjdC48c3RyaW5nLCBmdW5jdGlvbj49fWAgLSBBbiBvcHRpb25hbCBtYXAgb2YgZGVwZW5kZW5jaWVzIHdoaWNoIHNob3VsZAorICAgKiAgICAgIGJlIGluamVjdGVkIGludG8gdGhlIGNvbnRyb2xsZXIuIElmIGFueSBvZiB0aGVzZSBkZXBlbmRlbmNpZXMgYXJlIHByb21pc2VzLCB0aGUgcm91dGVyCisgICAqICAgICAgd2lsbCB3YWl0IGZvciB0aGVtIGFsbCB0byBiZSByZXNvbHZlZCBvciBvbmUgdG8gYmUgcmVqZWN0ZWQgYmVmb3JlIHRoZSBjb250cm9sbGVyIGlzCisgICAqICAgICAgaW5zdGFudGlhdGVkLgorICAgKiAgICAgIElmIGFsbCB0aGUgcHJvbWlzZXMgYXJlIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSwgdGhlIHZhbHVlcyBvZiB0aGUgcmVzb2x2ZWQgcHJvbWlzZXMgYXJlCisgICAqICAgICAgaW5qZWN0ZWQgYW5kIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSMkcm91dGVDaGFuZ2VTdWNjZXNzICRyb3V0ZUNoYW5nZVN1Y2Nlc3N9IGV2ZW50IGlzCisgICAqICAgICAgZmlyZWQuIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgYXJlIHJlamVjdGVkIHRoZQorICAgKiAgICAgIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSMkcm91dGVDaGFuZ2VFcnJvciAkcm91dGVDaGFuZ2VFcnJvcn0gZXZlbnQgaXMgZmlyZWQuIFRoZSBtYXAgb2JqZWN0CisgICAqICAgICAgaXM6CisgICAqCisgICAqICAgICAgLSBga2V5YCDigD8gYHtzdHJpbmd9YDogYSBuYW1lIG9mIGEgZGVwZW5kZW5jeSB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBjb250cm9sbGVyLgorICAgKiAgICAgIC0gYGZhY3RvcnlgIC0gYHtzdHJpbmd8ZnVuY3Rpb259YDogSWYgYHN0cmluZ2AgdGhlbiBpdCBpcyBhbiBhbGlhcyBmb3IgYSBzZXJ2aWNlLgorICAgKiAgICAgICAgT3RoZXJ3aXNlIGlmIGZ1bmN0aW9uLCB0aGVuIGl0IGlzIHtAbGluayBhdXRvLiRpbmplY3RvciNpbnZva2UgaW5qZWN0ZWR9CisgICAqICAgICAgICBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyB0cmVhdGVkIGFzIHRoZSBkZXBlbmRlbmN5LiBJZiB0aGUgcmVzdWx0IGlzIGEgcHJvbWlzZSwgaXQgaXMKKyAgICogICAgICAgIHJlc29sdmVkIGJlZm9yZSBpdHMgdmFsdWUgaXMgaW5qZWN0ZWQgaW50byB0aGUgY29udHJvbGxlci4gQmUgYXdhcmUgdGhhdAorICAgKiAgICAgICAgYG5nUm91dGUuJHJvdXRlUGFyYW1zYCB3aWxsIHN0aWxsIHJlZmVyIHRvIHRoZSBwcmV2aW91cyByb3V0ZSB3aXRoaW4gdGhlc2UgcmVzb2x2ZQorICAgKiAgICAgICAgZnVuY3Rpb25zLiAgVXNlIGAkcm91dGUuY3VycmVudC5wYXJhbXNgIHRvIGFjY2VzcyB0aGUgbmV3IHJvdXRlIHBhcmFtZXRlcnMsIGluc3RlYWQuCisgICAqCisgICAqICAgIC0gYHJlZGlyZWN0VG9gIOKAPyB7KHN0cmluZ3xmdW5jdGlvbigpKT19IOKAPyB2YWx1ZSB0byB1cGRhdGUKKyAgICogICAgICB7QGxpbmsgbmcuJGxvY2F0aW9uICRsb2NhdGlvbn0gcGF0aCB3aXRoIGFuZCB0cmlnZ2VyIHJvdXRlIHJlZGlyZWN0aW9uLgorICAgKgorICAgKiAgICAgIElmIGByZWRpcmVjdFRvYCBpcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAgICoKKyAgICogICAgICAtIGB7T2JqZWN0LjxzdHJpbmc+fWAgLSByb3V0ZSBwYXJhbWV0ZXJzIGV4dHJhY3RlZCBmcm9tIHRoZSBjdXJyZW50CisgICAqICAgICAgICBgJGxvY2F0aW9uLnBhdGgoKWAgYnkgYXBwbHlpbmcgdGhlIGN1cnJlbnQgcm91dGUgdGVtcGxhdGVVcmwuCisgICAqICAgICAgLSBge3N0cmluZ31gIC0gY3VycmVudCBgJGxvY2F0aW9uLnBhdGgoKWAKKyAgICogICAgICAtIGB7T2JqZWN0fWAgLSBjdXJyZW50IGAkbG9jYXRpb24uc2VhcmNoKClgCisgICAqCisgICAqICAgICAgVGhlIGN1c3RvbSBgcmVkaXJlY3RUb2AgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZAorICAgKiAgICAgIHRvIHVwZGF0ZSBgJGxvY2F0aW9uLnBhdGgoKWAgYW5kIGAkbG9jYXRpb24uc2VhcmNoKClgLgorICAgKgorICAgKiAgICAtIGBbcmVsb2FkT25TZWFyY2g9dHJ1ZV1gIC0ge2Jvb2xlYW49fSAtIHJlbG9hZCByb3V0ZSB3aGVuIG9ubHkgYCRsb2NhdGlvbi5zZWFyY2goKWAKKyAgICogICAgICBvciBgJGxvY2F0aW9uLmhhc2goKWAgY2hhbmdlcy4KKyAgICoKKyAgICogICAgICBJZiB0aGUgb3B0aW9uIGlzIHNldCB0byBgZmFsc2VgIGFuZCB1cmwgaW4gdGhlIGJyb3dzZXIgY2hhbmdlcywgdGhlbgorICAgKiAgICAgIGAkcm91dGVVcGRhdGVgIGV2ZW50IGlzIGJyb2FkY2FzdGVkIG9uIHRoZSByb290IHNjb3BlLgorICAgKgorICAgKiAgICAtIGBbY2FzZUluc2Vuc2l0aXZlTWF0Y2g9ZmFsc2VdYCAtIHtib29sZWFuPX0gLSBtYXRjaCByb3V0ZXMgd2l0aG91dCBiZWluZyBjYXNlIHNlbnNpdGl2ZQorICAgKgorICAgKiAgICAgIElmIHRoZSBvcHRpb24gaXMgc2V0IHRvIGB0cnVlYCwgdGhlbiB0aGUgcGFydGljdWxhciByb3V0ZSBjYW4gYmUgbWF0Y2hlZCB3aXRob3V0IGJlaW5nCisgICAqICAgICAgY2FzZSBzZW5zaXRpdmUKKyAgICoKKyAgICogQHJldHVybnMge09iamVjdH0gc2VsZgorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogQWRkcyBhIG5ldyByb3V0ZSBkZWZpbml0aW9uIHRvIHRoZSBgJHJvdXRlYCBzZXJ2aWNlLgorICAgKi8KKyAgdGhpcy53aGVuID0gZnVuY3Rpb24ocGF0aCwgcm91dGUpIHsKKyAgICAvL2NvcHkgb3JpZ2luYWwgcm91dGUgb2JqZWN0IHRvIHByZXNlcnZlIHBhcmFtcyBpbmhlcml0ZWQgZnJvbSBwcm90byBjaGFpbgorICAgIHZhciByb3V0ZUNvcHkgPSBhbmd1bGFyLmNvcHkocm91dGUpOworICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKHJvdXRlQ29weS5yZWxvYWRPblNlYXJjaCkpIHsKKyAgICAgIHJvdXRlQ29weS5yZWxvYWRPblNlYXJjaCA9IHRydWU7CisgICAgfQorICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKHJvdXRlQ29weS5jYXNlSW5zZW5zaXRpdmVNYXRjaCkpIHsKKyAgICAgIHJvdXRlQ29weS5jYXNlSW5zZW5zaXRpdmVNYXRjaCA9IHRoaXMuY2FzZUluc2Vuc2l0aXZlTWF0Y2g7CisgICAgfQorICAgIHJvdXRlc1twYXRoXSA9IGFuZ3VsYXIuZXh0ZW5kKAorICAgICAgcm91dGVDb3B5LAorICAgICAgcGF0aCAmJiBwYXRoUmVnRXhwKHBhdGgsIHJvdXRlQ29weSkKKyAgICApOworCisgICAgLy8gY3JlYXRlIHJlZGlyZWN0aW9uIGZvciB0cmFpbGluZyBzbGFzaGVzCisgICAgaWYgKHBhdGgpIHsKKyAgICAgIHZhciByZWRpcmVjdFBhdGggPSAocGF0aFtwYXRoLmxlbmd0aCAtIDFdID09ICcvJykKKyAgICAgICAgICAgID8gcGF0aC5zdWJzdHIoMCwgcGF0aC5sZW5ndGggLSAxKQorICAgICAgICAgICAgOiBwYXRoICsgJy8nOworCisgICAgICByb3V0ZXNbcmVkaXJlY3RQYXRoXSA9IGFuZ3VsYXIuZXh0ZW5kKAorICAgICAgICB7cmVkaXJlY3RUbzogcGF0aH0sCisgICAgICAgIHBhdGhSZWdFeHAocmVkaXJlY3RQYXRoLCByb3V0ZUNvcHkpCisgICAgICApOworICAgIH0KKworICAgIHJldHVybiB0aGlzOworICB9OworCisgIC8qKgorICAgKiBAbmdkb2MgcHJvcGVydHkKKyAgICogQG5hbWUgJHJvdXRlUHJvdmlkZXIjY2FzZUluc2Vuc2l0aXZlTWF0Y2gKKyAgICogQGRlc2NyaXB0aW9uCisgICAqCisgICAqIEEgYm9vbGVhbiBwcm9wZXJ0eSBpbmRpY2F0aW5nIGlmIHJvdXRlcyBkZWZpbmVkCisgICAqIHVzaW5nIHRoaXMgcHJvdmlkZXIgc2hvdWxkIGJlIG1hdGNoZWQgdXNpbmcgYSBjYXNlIGluc2Vuc2l0aXZlCisgICAqIGFsZ29yaXRobS4gRGVmYXVsdHMgdG8gYGZhbHNlYC4KKyAgICovCisgIHRoaXMuY2FzZUluc2Vuc2l0aXZlTWF0Y2ggPSBmYWxzZTsKKworICAgLyoqCisgICAgKiBAcGFyYW0gcGF0aCB7c3RyaW5nfSBwYXRoCisgICAgKiBAcGFyYW0gb3B0cyB7T2JqZWN0fSBvcHRpb25zCisgICAgKiBAcmV0dXJuIHs/T2JqZWN0fQorICAgICoKKyAgICAqIEBkZXNjcmlwdGlvbgorICAgICogTm9ybWFsaXplcyB0aGUgZ2l2ZW4gcGF0aCwgcmV0dXJuaW5nIGEgcmVndWxhciBleHByZXNzaW9uCisgICAgKiBhbmQgdGhlIG9yaWdpbmFsIHBhdGguCisgICAgKgorICAgICogSW5zcGlyZWQgYnkgcGF0aFJleHAgaW4gdmlzaW9ubWVkaWEvZXhwcmVzcy9saWIvdXRpbHMuanMuCisgICAgKi8KKyAgZnVuY3Rpb24gcGF0aFJlZ0V4cChwYXRoLCBvcHRzKSB7CisgICAgdmFyIGluc2Vuc2l0aXZlID0gb3B0cy5jYXNlSW5zZW5zaXRpdmVNYXRjaCwKKyAgICAgICAgcmV0ID0geworICAgICAgICAgIG9yaWdpbmFsUGF0aDogcGF0aCwKKyAgICAgICAgICByZWdleHA6IHBhdGgKKyAgICAgICAgfSwKKyAgICAgICAga2V5cyA9IHJldC5rZXlzID0gW107CisKKyAgICBwYXRoID0gcGF0aAorICAgICAgLnJlcGxhY2UoLyhbKCkuXSkvZywgJ1xcJDEnKQorICAgICAgLnJlcGxhY2UoLyhcLyk/OihcdyspKFtcP1wqXSk/L2csIGZ1bmN0aW9uKF8sIHNsYXNoLCBrZXksIG9wdGlvbikgeworICAgICAgICB2YXIgb3B0aW9uYWwgPSBvcHRpb24gPT09ICc/JyA/IG9wdGlvbiA6IG51bGw7CisgICAgICAgIHZhciBzdGFyID0gb3B0aW9uID09PSAnKicgPyBvcHRpb24gOiBudWxsOworICAgICAgICBrZXlzLnB1c2goeyBuYW1lOiBrZXksIG9wdGlvbmFsOiAhIW9wdGlvbmFsIH0pOworICAgICAgICBzbGFzaCA9IHNsYXNoIHx8ICcnOworICAgICAgICByZXR1cm4gJycKKyAgICAgICAgICArIChvcHRpb25hbCA/ICcnIDogc2xhc2gpCisgICAgICAgICAgKyAnKD86JworICAgICAgICAgICsgKG9wdGlvbmFsID8gc2xhc2ggOiAnJykKKyAgICAgICAgICArIChzdGFyICYmICcoLis/KScgfHwgJyhbXi9dKyknKQorICAgICAgICAgICsgKG9wdGlvbmFsIHx8ICcnKQorICAgICAgICAgICsgJyknCisgICAgICAgICAgKyAob3B0aW9uYWwgfHwgJycpOworICAgICAgfSkKKyAgICAgIC5yZXBsYWNlKC8oW1wvJFwqXSkvZywgJ1xcJDEnKTsKKworICAgIHJldC5yZWdleHAgPSBuZXcgUmVnRXhwKCdeJyArIHBhdGggKyAnJCcsIGluc2Vuc2l0aXZlID8gJ2knIDogJycpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAkcm91dGVQcm92aWRlciNvdGhlcndpc2UKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIFNldHMgcm91dGUgZGVmaW5pdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBvbiByb3V0ZSBjaGFuZ2Ugd2hlbiBubyBvdGhlciByb3V0ZSBkZWZpbml0aW9uCisgICAqIGlzIG1hdGNoZWQuCisgICAqCisgICAqIEBwYXJhbSB7T2JqZWN0fHN0cmluZ30gcGFyYW1zIE1hcHBpbmcgaW5mb3JtYXRpb24gdG8gYmUgYXNzaWduZWQgdG8gYCRyb3V0ZS5jdXJyZW50YC4KKyAgICogSWYgY2FsbGVkIHdpdGggYSBzdHJpbmcsIHRoZSB2YWx1ZSBtYXBzIHRvIGByZWRpcmVjdFRvYC4KKyAgICogQHJldHVybnMge09iamVjdH0gc2VsZgorICAgKi8KKyAgdGhpcy5vdGhlcndpc2UgPSBmdW5jdGlvbihwYXJhbXMpIHsKKyAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHsKKyAgICAgIHBhcmFtcyA9IHtyZWRpcmVjdFRvOiBwYXJhbXN9OworICAgIH0KKyAgICB0aGlzLndoZW4obnVsbCwgcGFyYW1zKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfTsKKworCisgIHRoaXMuJGdldCA9IFsnJHJvb3RTY29wZScsCisgICAgICAgICAgICAgICAnJGxvY2F0aW9uJywKKyAgICAgICAgICAgICAgICckcm91dGVQYXJhbXMnLAorICAgICAgICAgICAgICAgJyRxJywKKyAgICAgICAgICAgICAgICckaW5qZWN0b3InLAorICAgICAgICAgICAgICAgJyR0ZW1wbGF0ZVJlcXVlc3QnLAorICAgICAgICAgICAgICAgJyRzY2UnLAorICAgICAgZnVuY3Rpb24oJHJvb3RTY29wZSwgJGxvY2F0aW9uLCAkcm91dGVQYXJhbXMsICRxLCAkaW5qZWN0b3IsICR0ZW1wbGF0ZVJlcXVlc3QsICRzY2UpIHsKKworICAgIC8qKgorICAgICAqIEBuZ2RvYyBzZXJ2aWNlCisgICAgICogQG5hbWUgJHJvdXRlCisgICAgICogQHJlcXVpcmVzICRsb2NhdGlvbgorICAgICAqIEByZXF1aXJlcyAkcm91dGVQYXJhbXMKKyAgICAgKgorICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjdXJyZW50IFJlZmVyZW5jZSB0byB0aGUgY3VycmVudCByb3V0ZSBkZWZpbml0aW9uLgorICAgICAqIFRoZSByb3V0ZSBkZWZpbml0aW9uIGNvbnRhaW5zOgorICAgICAqCisgICAgICogICAtIGBjb250cm9sbGVyYDogVGhlIGNvbnRyb2xsZXIgY29uc3RydWN0b3IgYXMgZGVmaW5lIGluIHJvdXRlIGRlZmluaXRpb24uCisgICAgICogICAtIGBsb2NhbHNgOiBBIG1hcCBvZiBsb2NhbHMgd2hpY2ggaXMgdXNlZCBieSB7QGxpbmsgbmcuJGNvbnRyb2xsZXIgJGNvbnRyb2xsZXJ9IHNlcnZpY2UgZm9yCisgICAgICogICAgIGNvbnRyb2xsZXIgaW5zdGFudGlhdGlvbi4gVGhlIGBsb2NhbHNgIGNvbnRhaW4KKyAgICAgKiAgICAgdGhlIHJlc29sdmVkIHZhbHVlcyBvZiB0aGUgYHJlc29sdmVgIG1hcC4gQWRkaXRpb25hbGx5IHRoZSBgbG9jYWxzYCBhbHNvIGNvbnRhaW46CisgICAgICoKKyAgICAgKiAgICAgLSBgJHNjb3BlYCAtIFRoZSBjdXJyZW50IHJvdXRlIHNjb3BlLgorICAgICAqICAgICAtIGAkdGVtcGxhdGVgIC0gVGhlIGN1cnJlbnQgcm91dGUgdGVtcGxhdGUgSFRNTC4KKyAgICAgKgorICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSByb3V0ZXMgT2JqZWN0IHdpdGggYWxsIHJvdXRlIGNvbmZpZ3VyYXRpb24gT2JqZWN0cyBhcyBpdHMgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqIGAkcm91dGVgIGlzIHVzZWQgZm9yIGRlZXAtbGlua2luZyBVUkxzIHRvIGNvbnRyb2xsZXJzIGFuZCB2aWV3cyAoSFRNTCBwYXJ0aWFscykuCisgICAgICogSXQgd2F0Y2hlcyBgJGxvY2F0aW9uLnVybCgpYCBhbmQgdHJpZXMgdG8gbWFwIHRoZSBwYXRoIHRvIGFuIGV4aXN0aW5nIHJvdXRlIGRlZmluaXRpb24uCisgICAgICoKKyAgICAgKiBSZXF1aXJlcyB0aGUge0BsaW5rIG5nUm91dGUgYG5nUm91dGVgfSBtb2R1bGUgdG8gYmUgaW5zdGFsbGVkLgorICAgICAqCisgICAgICogWW91IGNhbiBkZWZpbmUgcm91dGVzIHRocm91Z2gge0BsaW5rIG5nUm91dGUuJHJvdXRlUHJvdmlkZXIgJHJvdXRlUHJvdmlkZXJ9J3MgQVBJLgorICAgICAqCisgICAgICogVGhlIGAkcm91dGVgIHNlcnZpY2UgaXMgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKKyAgICAgKiB7QGxpbmsgbmdSb3V0ZS5kaXJlY3RpdmU6bmdWaWV3IGBuZ1ZpZXdgfSBkaXJlY3RpdmUgYW5kIHRoZQorICAgICAqIHtAbGluayBuZ1JvdXRlLiRyb3V0ZVBhcmFtcyBgJHJvdXRlUGFyYW1zYH0gc2VydmljZS4KKyAgICAgKgorICAgICAqIEBleGFtcGxlCisgICAgICogVGhpcyBleGFtcGxlIHNob3dzIGhvdyBjaGFuZ2luZyB0aGUgVVJMIGhhc2ggY2F1c2VzIHRoZSBgJHJvdXRlYCB0byBtYXRjaCBhIHJvdXRlIGFnYWluc3QgdGhlCisgICAgICogVVJMLCBhbmQgdGhlIGBuZ1ZpZXdgIHB1bGxzIGluIHRoZSBwYXJ0aWFsLgorICAgICAqCisgICAgICogPGV4YW1wbGUgbmFtZT0iJHJvdXRlLXNlcnZpY2UiIG1vZHVsZT0ibmdSb3V0ZUV4YW1wbGUiCisgICAgICogICAgICAgICAgZGVwcz0iYW5ndWxhci1yb3V0ZS5qcyIgZml4QmFzZT0idHJ1ZSI+CisgICAgICogICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgKiAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJNYWluQ29udHJvbGxlciI+CisgICAgICogICAgICAgQ2hvb3NlOgorICAgICAqICAgICAgIDxhIGhyZWY9IkJvb2svTW9ieSI+TW9ieTwvYT4gfAorICAgICAqICAgICAgIDxhIGhyZWY9IkJvb2svTW9ieS9jaC8xIj5Nb2J5OiBDaDE8L2E+IHwKKyAgICAgKiAgICAgICA8YSBocmVmPSJCb29rL0dhdHNieSI+R2F0c2J5PC9hPiB8CisgICAgICogICAgICAgPGEgaHJlZj0iQm9vay9HYXRzYnkvY2gvND9rZXk9dmFsdWUiPkdhdHNieTogQ2g0PC9hPiB8CisgICAgICogICAgICAgPGEgaHJlZj0iQm9vay9TY2FybGV0Ij5TY2FybGV0IExldHRlcjwvYT48YnIvPgorICAgICAqCisgICAgICogICAgICAgPGRpdiBuZy12aWV3PjwvZGl2PgorICAgICAqCisgICAgICogICAgICAgPGhyIC8+CisgICAgICoKKyAgICAgKiAgICAgICA8cHJlPiRsb2NhdGlvbi5wYXRoKCkgPSB7eyRsb2NhdGlvbi5wYXRoKCl9fTwvcHJlPgorICAgICAqICAgICAgIDxwcmU+JHJvdXRlLmN1cnJlbnQudGVtcGxhdGVVcmwgPSB7eyRyb3V0ZS5jdXJyZW50LnRlbXBsYXRlVXJsfX08L3ByZT4KKyAgICAgKiAgICAgICA8cHJlPiRyb3V0ZS5jdXJyZW50LnBhcmFtcyA9IHt7JHJvdXRlLmN1cnJlbnQucGFyYW1zfX08L3ByZT4KKyAgICAgKiAgICAgICA8cHJlPiRyb3V0ZS5jdXJyZW50LnNjb3BlLm5hbWUgPSB7eyRyb3V0ZS5jdXJyZW50LnNjb3BlLm5hbWV9fTwvcHJlPgorICAgICAqICAgICAgIDxwcmU+JHJvdXRlUGFyYW1zID0ge3skcm91dGVQYXJhbXN9fTwvcHJlPgorICAgICAqICAgICA8L2Rpdj4KKyAgICAgKiAgIDwvZmlsZT4KKyAgICAgKgorICAgICAqICAgPGZpbGUgbmFtZT0iYm9vay5odG1sIj4KKyAgICAgKiAgICAgY29udHJvbGxlcjoge3tuYW1lfX08YnIgLz4KKyAgICAgKiAgICAgQm9vayBJZDoge3twYXJhbXMuYm9va0lkfX08YnIgLz4KKyAgICAgKiAgIDwvZmlsZT4KKyAgICAgKgorICAgICAqICAgPGZpbGUgbmFtZT0iY2hhcHRlci5odG1sIj4KKyAgICAgKiAgICAgY29udHJvbGxlcjoge3tuYW1lfX08YnIgLz4KKyAgICAgKiAgICAgQm9vayBJZDoge3twYXJhbXMuYm9va0lkfX08YnIgLz4KKyAgICAgKiAgICAgQ2hhcHRlciBJZDoge3twYXJhbXMuY2hhcHRlcklkfX0KKyAgICAgKiAgIDwvZmlsZT4KKyAgICAgKgorICAgICAqICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KKyAgICAgKiAgICAgYW5ndWxhci5tb2R1bGUoJ25nUm91dGVFeGFtcGxlJywgWyduZ1JvdXRlJ10pCisgICAgICoKKyAgICAgKiAgICAgIC5jb250cm9sbGVyKCdNYWluQ29udHJvbGxlcicsIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlLCAkcm91dGVQYXJhbXMsICRsb2NhdGlvbikgeworICAgICAqICAgICAgICAgICRzY29wZS4kcm91dGUgPSAkcm91dGU7CisgICAgICogICAgICAgICAgJHNjb3BlLiRsb2NhdGlvbiA9ICRsb2NhdGlvbjsKKyAgICAgKiAgICAgICAgICAkc2NvcGUuJHJvdXRlUGFyYW1zID0gJHJvdXRlUGFyYW1zOworICAgICAqICAgICAgfSkKKyAgICAgKgorICAgICAqICAgICAgLmNvbnRyb2xsZXIoJ0Jvb2tDb250cm9sbGVyJywgZnVuY3Rpb24oJHNjb3BlLCAkcm91dGVQYXJhbXMpIHsKKyAgICAgKiAgICAgICAgICAkc2NvcGUubmFtZSA9ICJCb29rQ29udHJvbGxlciI7CisgICAgICogICAgICAgICAgJHNjb3BlLnBhcmFtcyA9ICRyb3V0ZVBhcmFtczsKKyAgICAgKiAgICAgIH0pCisgICAgICoKKyAgICAgKiAgICAgIC5jb250cm9sbGVyKCdDaGFwdGVyQ29udHJvbGxlcicsIGZ1bmN0aW9uKCRzY29wZSwgJHJvdXRlUGFyYW1zKSB7CisgICAgICogICAgICAgICAgJHNjb3BlLm5hbWUgPSAiQ2hhcHRlckNvbnRyb2xsZXIiOworICAgICAqICAgICAgICAgICRzY29wZS5wYXJhbXMgPSAkcm91dGVQYXJhbXM7CisgICAgICogICAgICB9KQorICAgICAqCisgICAgICogICAgIC5jb25maWcoZnVuY3Rpb24oJHJvdXRlUHJvdmlkZXIsICRsb2NhdGlvblByb3ZpZGVyKSB7CisgICAgICogICAgICAgJHJvdXRlUHJvdmlkZXIKKyAgICAgKiAgICAgICAgLndoZW4oJy9Cb29rLzpib29rSWQnLCB7CisgICAgICogICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jvb2suaHRtbCcsCisgICAgICogICAgICAgICBjb250cm9sbGVyOiAnQm9va0NvbnRyb2xsZXInLAorICAgICAqICAgICAgICAgcmVzb2x2ZTogeworICAgICAqICAgICAgICAgICAvLyBJIHdpbGwgY2F1c2UgYSAxIHNlY29uZCBkZWxheQorICAgICAqICAgICAgICAgICBkZWxheTogZnVuY3Rpb24oJHEsICR0aW1lb3V0KSB7CisgICAgICogICAgICAgICAgICAgdmFyIGRlbGF5ID0gJHEuZGVmZXIoKTsKKyAgICAgKiAgICAgICAgICAgICAkdGltZW91dChkZWxheS5yZXNvbHZlLCAxMDAwKTsKKyAgICAgKiAgICAgICAgICAgICByZXR1cm4gZGVsYXkucHJvbWlzZTsKKyAgICAgKiAgICAgICAgICAgfQorICAgICAqICAgICAgICAgfQorICAgICAqICAgICAgIH0pCisgICAgICogICAgICAgLndoZW4oJy9Cb29rLzpib29rSWQvY2gvOmNoYXB0ZXJJZCcsIHsKKyAgICAgKiAgICAgICAgIHRlbXBsYXRlVXJsOiAnY2hhcHRlci5odG1sJywKKyAgICAgKiAgICAgICAgIGNvbnRyb2xsZXI6ICdDaGFwdGVyQ29udHJvbGxlcicKKyAgICAgKiAgICAgICB9KTsKKyAgICAgKgorICAgICAqICAgICAgIC8vIGNvbmZpZ3VyZSBodG1sNSB0byBnZXQgbGlua3Mgd29ya2luZyBvbiBqc2ZpZGRsZQorICAgICAqICAgICAgICRsb2NhdGlvblByb3ZpZGVyLmh0bWw1TW9kZSh0cnVlKTsKKyAgICAgKiAgICAgfSk7CisgICAgICoKKyAgICAgKiAgIDwvZmlsZT4KKyAgICAgKgorICAgICAqICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICogICAgIGl0KCdzaG91bGQgbG9hZCBhbmQgY29tcGlsZSBjb3JyZWN0IHRlbXBsYXRlJywgZnVuY3Rpb24oKSB7CisgICAgICogICAgICAgZWxlbWVudChieS5saW5rVGV4dCgnTW9ieTogQ2gxJykpLmNsaWNrKCk7CisgICAgICogICAgICAgdmFyIGNvbnRlbnQgPSBlbGVtZW50KGJ5LmNzcygnW25nLXZpZXddJykpLmdldFRleHQoKTsKKyAgICAgKiAgICAgICBleHBlY3QoY29udGVudCkudG9NYXRjaCgvY29udHJvbGxlclw6IENoYXB0ZXJDb250cm9sbGVyLyk7CisgICAgICogICAgICAgZXhwZWN0KGNvbnRlbnQpLnRvTWF0Y2goL0Jvb2sgSWRcOiBNb2J5Lyk7CisgICAgICogICAgICAgZXhwZWN0KGNvbnRlbnQpLnRvTWF0Y2goL0NoYXB0ZXIgSWRcOiAxLyk7CisgICAgICoKKyAgICAgKiAgICAgICBlbGVtZW50KGJ5LnBhcnRpYWxMaW5rVGV4dCgnU2NhcmxldCcpKS5jbGljaygpOworICAgICAqCisgICAgICogICAgICAgY29udGVudCA9IGVsZW1lbnQoYnkuY3NzKCdbbmctdmlld10nKSkuZ2V0VGV4dCgpOworICAgICAqICAgICAgIGV4cGVjdChjb250ZW50KS50b01hdGNoKC9jb250cm9sbGVyXDogQm9va0NvbnRyb2xsZXIvKTsKKyAgICAgKiAgICAgICBleHBlY3QoY29udGVudCkudG9NYXRjaCgvQm9vayBJZFw6IFNjYXJsZXQvKTsKKyAgICAgKiAgICAgfSk7CisgICAgICogICA8L2ZpbGU+CisgICAgICogPC9leGFtcGxlPgorICAgICAqLworCisgICAgLyoqCisgICAgICogQG5nZG9jIGV2ZW50CisgICAgICogQG5hbWUgJHJvdXRlIyRyb3V0ZUNoYW5nZVN0YXJ0CisgICAgICogQGV2ZW50VHlwZSBicm9hZGNhc3Qgb24gcm9vdCBzY29wZQorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqIEJyb2FkY2FzdGVkIGJlZm9yZSBhIHJvdXRlIGNoYW5nZS4gQXQgdGhpcyAgcG9pbnQgdGhlIHJvdXRlIHNlcnZpY2VzIHN0YXJ0cworICAgICAqIHJlc29sdmluZyBhbGwgb2YgdGhlIGRlcGVuZGVuY2llcyBuZWVkZWQgZm9yIHRoZSByb3V0ZSBjaGFuZ2UgdG8gb2NjdXIuCisgICAgICogVHlwaWNhbGx5IHRoaXMgaW52b2x2ZXMgZmV0Y2hpbmcgdGhlIHZpZXcgdGVtcGxhdGUgYXMgd2VsbCBhcyBhbnkgZGVwZW5kZW5jaWVzCisgICAgICogZGVmaW5lZCBpbiBgcmVzb2x2ZWAgcm91dGUgcHJvcGVydHkuIE9uY2UgIGFsbCBvZiB0aGUgZGVwZW5kZW5jaWVzIGFyZSByZXNvbHZlZAorICAgICAqIGAkcm91dGVDaGFuZ2VTdWNjZXNzYCBpcyBmaXJlZC4KKyAgICAgKgorICAgICAqIFRoZSByb3V0ZSBjaGFuZ2UgKGFuZCB0aGUgYCRsb2NhdGlvbmAgY2hhbmdlIHRoYXQgdHJpZ2dlcmVkIGl0KSBjYW4gYmUgcHJldmVudGVkCisgICAgICogYnkgY2FsbGluZyBgcHJldmVudERlZmF1bHRgIG1ldGhvZCBvZiB0aGUgZXZlbnQuIFNlZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb259CisgICAgICogZm9yIG1vcmUgZGV0YWlscyBhYm91dCBldmVudCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuCisgICAgICogQHBhcmFtIHtSb3V0ZX0gbmV4dCBGdXR1cmUgcm91dGUgaW5mb3JtYXRpb24uCisgICAgICogQHBhcmFtIHtSb3V0ZX0gY3VycmVudCBDdXJyZW50IHJvdXRlIGluZm9ybWF0aW9uLgorICAgICAqLworCisgICAgLyoqCisgICAgICogQG5nZG9jIGV2ZW50CisgICAgICogQG5hbWUgJHJvdXRlIyRyb3V0ZUNoYW5nZVN1Y2Nlc3MKKyAgICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICogQnJvYWRjYXN0ZWQgYWZ0ZXIgYSByb3V0ZSBkZXBlbmRlbmNpZXMgYXJlIHJlc29sdmVkLgorICAgICAqIHtAbGluayBuZ1JvdXRlLmRpcmVjdGl2ZTpuZ1ZpZXcgbmdWaWV3fSBsaXN0ZW5zIGZvciB0aGUgZGlyZWN0aXZlCisgICAgICogdG8gaW5zdGFudGlhdGUgdGhlIGNvbnRyb2xsZXIgYW5kIHJlbmRlciB0aGUgdmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhbmd1bGFyRXZlbnQgU3ludGhldGljIGV2ZW50IG9iamVjdC4KKyAgICAgKiBAcGFyYW0ge1JvdXRlfSBjdXJyZW50IEN1cnJlbnQgcm91dGUgaW5mb3JtYXRpb24uCisgICAgICogQHBhcmFtIHtSb3V0ZXxVbmRlZmluZWR9IHByZXZpb3VzIFByZXZpb3VzIHJvdXRlIGluZm9ybWF0aW9uLCBvciB1bmRlZmluZWQgaWYgY3VycmVudCBpcworICAgICAqIGZpcnN0IHJvdXRlIGVudGVyZWQuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgZXZlbnQKKyAgICAgKiBAbmFtZSAkcm91dGUjJHJvdXRlQ2hhbmdlRXJyb3IKKyAgICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICogQnJvYWRjYXN0ZWQgaWYgYW55IG9mIHRoZSByZXNvbHZlIHByb21pc2VzIGFyZSByZWplY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhbmd1bGFyRXZlbnQgU3ludGhldGljIGV2ZW50IG9iamVjdAorICAgICAqIEBwYXJhbSB7Um91dGV9IGN1cnJlbnQgQ3VycmVudCByb3V0ZSBpbmZvcm1hdGlvbi4KKyAgICAgKiBAcGFyYW0ge1JvdXRlfSBwcmV2aW91cyBQcmV2aW91cyByb3V0ZSBpbmZvcm1hdGlvbi4KKyAgICAgKiBAcGFyYW0ge1JvdXRlfSByZWplY3Rpb24gUmVqZWN0aW9uIG9mIHRoZSBwcm9taXNlLiBVc3VhbGx5IHRoZSBlcnJvciBvZiB0aGUgZmFpbGVkIHByb21pc2UuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgZXZlbnQKKyAgICAgKiBAbmFtZSAkcm91dGUjJHJvdXRlVXBkYXRlCisgICAgICogQGV2ZW50VHlwZSBicm9hZGNhc3Qgb24gcm9vdCBzY29wZQorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqCisgICAgICogVGhlIGByZWxvYWRPblNlYXJjaGAgcHJvcGVydHkgaGFzIGJlZW4gc2V0IHRvIGZhbHNlLCBhbmQgd2UgYXJlIHJldXNpbmcgdGhlIHNhbWUKKyAgICAgKiBpbnN0YW5jZSBvZiB0aGUgQ29udHJvbGxlci4KKyAgICAgKi8KKworICAgIHZhciBmb3JjZVJlbG9hZCA9IGZhbHNlLAorICAgICAgICBwcmVwYXJlZFJvdXRlLAorICAgICAgICBwcmVwYXJlZFJvdXRlSXNVcGRhdGVPbmx5LAorICAgICAgICAkcm91dGUgPSB7CisgICAgICAgICAgcm91dGVzOiByb3V0ZXMsCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgICAgICogQG5hbWUgJHJvdXRlI3JlbG9hZAorICAgICAgICAgICAqCisgICAgICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgICAgICogQ2F1c2VzIGAkcm91dGVgIHNlcnZpY2UgdG8gcmVsb2FkIHRoZSBjdXJyZW50IHJvdXRlIGV2ZW4gaWYKKyAgICAgICAgICAgKiB7QGxpbmsgbmcuJGxvY2F0aW9uICRsb2NhdGlvbn0gaGFzbid0IGNoYW5nZWQuCisgICAgICAgICAgICoKKyAgICAgICAgICAgKiBBcyBhIHJlc3VsdCBvZiB0aGF0LCB7QGxpbmsgbmdSb3V0ZS5kaXJlY3RpdmU6bmdWaWV3IG5nVmlld30KKyAgICAgICAgICAgKiBjcmVhdGVzIG5ldyBzY29wZSBhbmQgcmVpbnN0YW50aWF0ZXMgdGhlIGNvbnRyb2xsZXIuCisgICAgICAgICAgICovCisgICAgICAgICAgcmVsb2FkOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGZvcmNlUmVsb2FkID0gdHJ1ZTsKKyAgICAgICAgICAgICRyb290U2NvcGUuJGV2YWxBc3luYyhmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgLy8gRG9uJ3Qgc3VwcG9ydCBjYW5jZWxsYXRpb24gb2YgYSByZWxvYWQgZm9yIG5vdy4uLgorICAgICAgICAgICAgICBwcmVwYXJlUm91dGUoKTsKKyAgICAgICAgICAgICAgY29tbWl0Um91dGUoKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0sCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgICAgICogQG5hbWUgJHJvdXRlI3VwZGF0ZVBhcmFtcworICAgICAgICAgICAqCisgICAgICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgICAgICogQ2F1c2VzIGAkcm91dGVgIHNlcnZpY2UgdG8gdXBkYXRlIHRoZSBjdXJyZW50IFVSTCwgcmVwbGFjaW5nCisgICAgICAgICAgICogY3VycmVudCByb3V0ZSBwYXJhbWV0ZXJzIHdpdGggdGhvc2Ugc3BlY2lmaWVkIGluIGBuZXdQYXJhbXNgLgorICAgICAgICAgICAqIFByb3ZpZGVkIHByb3BlcnR5IG5hbWVzIHRoYXQgbWF0Y2ggdGhlIHJvdXRlJ3MgcGF0aCBzZWdtZW50CisgICAgICAgICAgICogZGVmaW5pdGlvbnMgd2lsbCBiZSBpbnRlcnBvbGF0ZWQgaW50byB0aGUgbG9jYXRpb24ncyBwYXRoLCB3aGlsZQorICAgICAgICAgICAqIHJlbWFpbmluZyBwcm9wZXJ0aWVzIHdpbGwgYmUgdHJlYXRlZCBhcyBxdWVyeSBwYXJhbXMuCisgICAgICAgICAgICoKKyAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gbmV3UGFyYW1zIG1hcHBpbmcgb2YgVVJMIHBhcmFtZXRlciBuYW1lcyB0byB2YWx1ZXMKKyAgICAgICAgICAgKi8KKyAgICAgICAgICB1cGRhdGVQYXJhbXM6IGZ1bmN0aW9uKG5ld1BhcmFtcykgeworICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudCAmJiB0aGlzLmN1cnJlbnQuJCRyb3V0ZSkgeworICAgICAgICAgICAgICB2YXIgc2VhcmNoUGFyYW1zID0ge30sIHNlbGY9dGhpczsKKworICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goT2JqZWN0LmtleXMobmV3UGFyYW1zKSwgZnVuY3Rpb24oa2V5KSB7CisgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmN1cnJlbnQucGF0aFBhcmFtc1trZXldKSBzZWFyY2hQYXJhbXNba2V5XSA9IG5ld1BhcmFtc1trZXldOworICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICBuZXdQYXJhbXMgPSBhbmd1bGFyLmV4dGVuZCh7fSwgdGhpcy5jdXJyZW50LnBhcmFtcywgbmV3UGFyYW1zKTsKKyAgICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgoaW50ZXJwb2xhdGUodGhpcy5jdXJyZW50LiQkcm91dGUub3JpZ2luYWxQYXRoLCBuZXdQYXJhbXMpKTsKKyAgICAgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaChhbmd1bGFyLmV4dGVuZCh7fSwgJGxvY2F0aW9uLnNlYXJjaCgpLCBzZWFyY2hQYXJhbXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICB0aHJvdyAkcm91dGVNaW5FcnIoJ25vcm91dCcsICdUcmllZCB1cGRhdGluZyByb3V0ZSB3aGVuIHdpdGggbm8gY3VycmVudCByb3V0ZScpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICRyb290U2NvcGUuJG9uKCckbG9jYXRpb25DaGFuZ2VTdGFydCcsIHByZXBhcmVSb3V0ZSk7CisgICAgJHJvb3RTY29wZS4kb24oJyRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MnLCBjb21taXRSb3V0ZSk7CisKKyAgICByZXR1cm4gJHJvdXRlOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvbiB7c3RyaW5nfSBjdXJyZW50IHVybAorICAgICAqIEBwYXJhbSByb3V0ZSB7T2JqZWN0fSByb3V0ZSByZWdleHAgdG8gbWF0Y2ggdGhlIHVybCBhZ2FpbnN0CisgICAgICogQHJldHVybiB7P09iamVjdH0KKyAgICAgKgorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqIENoZWNrIGlmIHRoZSByb3V0ZSBtYXRjaGVzIHRoZSBjdXJyZW50IHVybC4KKyAgICAgKgorICAgICAqIEluc3BpcmVkIGJ5IG1hdGNoIGluCisgICAgICogdmlzaW9ubWVkaWEvZXhwcmVzcy9saWIvcm91dGVyL3JvdXRlci5qcy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBzd2l0Y2hSb3V0ZU1hdGNoZXIob24sIHJvdXRlKSB7CisgICAgICB2YXIga2V5cyA9IHJvdXRlLmtleXMsCisgICAgICAgICAgcGFyYW1zID0ge307CisKKyAgICAgIGlmICghcm91dGUucmVnZXhwKSByZXR1cm4gbnVsbDsKKworICAgICAgdmFyIG0gPSByb3V0ZS5yZWdleHAuZXhlYyhvbik7CisgICAgICBpZiAoIW0pIHJldHVybiBudWxsOworCisgICAgICBmb3IgKHZhciBpID0gMSwgbGVuID0gbS5sZW5ndGg7IGkgPCBsZW47ICsraSkgeworICAgICAgICB2YXIga2V5ID0ga2V5c1tpIC0gMV07CisKKyAgICAgICAgdmFyIHZhbCA9IG1baV07CisKKyAgICAgICAgaWYgKGtleSAmJiB2YWwpIHsKKyAgICAgICAgICBwYXJhbXNba2V5Lm5hbWVdID0gdmFsOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKworICAgIGZ1bmN0aW9uIHByZXBhcmVSb3V0ZSgkbG9jYXRpb25FdmVudCkgeworICAgICAgdmFyIGxhc3RSb3V0ZSA9ICRyb3V0ZS5jdXJyZW50OworCisgICAgICBwcmVwYXJlZFJvdXRlID0gcGFyc2VSb3V0ZSgpOworICAgICAgcHJlcGFyZWRSb3V0ZUlzVXBkYXRlT25seSA9IHByZXBhcmVkUm91dGUgJiYgbGFzdFJvdXRlICYmIHByZXBhcmVkUm91dGUuJCRyb3V0ZSA9PT0gbGFzdFJvdXRlLiQkcm91dGUKKyAgICAgICAgICAmJiBhbmd1bGFyLmVxdWFscyhwcmVwYXJlZFJvdXRlLnBhdGhQYXJhbXMsIGxhc3RSb3V0ZS5wYXRoUGFyYW1zKQorICAgICAgICAgICYmICFwcmVwYXJlZFJvdXRlLnJlbG9hZE9uU2VhcmNoICYmICFmb3JjZVJlbG9hZDsKKworICAgICAgaWYgKCFwcmVwYXJlZFJvdXRlSXNVcGRhdGVPbmx5ICYmIChsYXN0Um91dGUgfHwgcHJlcGFyZWRSb3V0ZSkpIHsKKyAgICAgICAgaWYgKCRyb290U2NvcGUuJGJyb2FkY2FzdCgnJHJvdXRlQ2hhbmdlU3RhcnQnLCBwcmVwYXJlZFJvdXRlLCBsYXN0Um91dGUpLmRlZmF1bHRQcmV2ZW50ZWQpIHsKKyAgICAgICAgICBpZiAoJGxvY2F0aW9uRXZlbnQpIHsKKyAgICAgICAgICAgICRsb2NhdGlvbkV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gY29tbWl0Um91dGUoKSB7CisgICAgICB2YXIgbGFzdFJvdXRlID0gJHJvdXRlLmN1cnJlbnQ7CisgICAgICB2YXIgbmV4dFJvdXRlID0gcHJlcGFyZWRSb3V0ZTsKKworICAgICAgaWYgKHByZXBhcmVkUm91dGVJc1VwZGF0ZU9ubHkpIHsKKyAgICAgICAgbGFzdFJvdXRlLnBhcmFtcyA9IG5leHRSb3V0ZS5wYXJhbXM7CisgICAgICAgIGFuZ3VsYXIuY29weShsYXN0Um91dGUucGFyYW1zLCAkcm91dGVQYXJhbXMpOworICAgICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRyb3V0ZVVwZGF0ZScsIGxhc3RSb3V0ZSk7CisgICAgICB9IGVsc2UgaWYgKG5leHRSb3V0ZSB8fCBsYXN0Um91dGUpIHsKKyAgICAgICAgZm9yY2VSZWxvYWQgPSBmYWxzZTsKKyAgICAgICAgJHJvdXRlLmN1cnJlbnQgPSBuZXh0Um91dGU7CisgICAgICAgIGlmIChuZXh0Um91dGUpIHsKKyAgICAgICAgICBpZiAobmV4dFJvdXRlLnJlZGlyZWN0VG8pIHsKKyAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzU3RyaW5nKG5leHRSb3V0ZS5yZWRpcmVjdFRvKSkgeworICAgICAgICAgICAgICAkbG9jYXRpb24ucGF0aChpbnRlcnBvbGF0ZShuZXh0Um91dGUucmVkaXJlY3RUbywgbmV4dFJvdXRlLnBhcmFtcykpLnNlYXJjaChuZXh0Um91dGUucGFyYW1zKQorICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgJGxvY2F0aW9uLnVybChuZXh0Um91dGUucmVkaXJlY3RUbyhuZXh0Um91dGUucGF0aFBhcmFtcywgJGxvY2F0aW9uLnBhdGgoKSwgJGxvY2F0aW9uLnNlYXJjaCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAkcS53aGVuKG5leHRSb3V0ZSkuCisgICAgICAgICAgdGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChuZXh0Um91dGUpIHsKKyAgICAgICAgICAgICAgdmFyIGxvY2FscyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBuZXh0Um91dGUucmVzb2x2ZSksCisgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwgdGVtcGxhdGVVcmw7CisKKyAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGxvY2FscywgZnVuY3Rpb24odmFsdWUsIGtleSkgeworICAgICAgICAgICAgICAgIGxvY2Fsc1trZXldID0gYW5ndWxhci5pc1N0cmluZyh2YWx1ZSkgPworICAgICAgICAgICAgICAgICAgICAkaW5qZWN0b3IuZ2V0KHZhbHVlKSA6ICRpbmplY3Rvci5pbnZva2UodmFsdWUsIG51bGwsIG51bGwsIGtleSk7CisgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZCh0ZW1wbGF0ZSA9IG5leHRSb3V0ZS50ZW1wbGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0Z1bmN0aW9uKHRlbXBsYXRlKSkgeworICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZShuZXh0Um91dGUucGFyYW1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5ndWxhci5pc0RlZmluZWQodGVtcGxhdGVVcmwgPSBuZXh0Um91dGUudGVtcGxhdGVVcmwpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNGdW5jdGlvbih0ZW1wbGF0ZVVybCkpIHsKKyAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsID0gdGVtcGxhdGVVcmwobmV4dFJvdXRlLnBhcmFtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsID0gJHNjZS5nZXRUcnVzdGVkUmVzb3VyY2VVcmwodGVtcGxhdGVVcmwpOworICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZCh0ZW1wbGF0ZVVybCkpIHsKKyAgICAgICAgICAgICAgICAgIG5leHRSb3V0ZS5sb2FkZWRUZW1wbGF0ZVVybCA9IHRlbXBsYXRlVXJsOworICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAkdGVtcGxhdGVSZXF1ZXN0KHRlbXBsYXRlVXJsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKHRlbXBsYXRlKSkgeworICAgICAgICAgICAgICAgIGxvY2Fsc1snJHRlbXBsYXRlJ10gPSB0ZW1wbGF0ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICByZXR1cm4gJHEuYWxsKGxvY2Fscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSkuCisgICAgICAgICAgLy8gYWZ0ZXIgcm91dGUgY2hhbmdlCisgICAgICAgICAgdGhlbihmdW5jdGlvbihsb2NhbHMpIHsKKyAgICAgICAgICAgIGlmIChuZXh0Um91dGUgPT0gJHJvdXRlLmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgaWYgKG5leHRSb3V0ZSkgeworICAgICAgICAgICAgICAgIG5leHRSb3V0ZS5sb2NhbHMgPSBsb2NhbHM7CisgICAgICAgICAgICAgICAgYW5ndWxhci5jb3B5KG5leHRSb3V0ZS5wYXJhbXMsICRyb3V0ZVBhcmFtcyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckcm91dGVDaGFuZ2VTdWNjZXNzJywgbmV4dFJvdXRlLCBsYXN0Um91dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgICAgICBpZiAobmV4dFJvdXRlID09ICRyb3V0ZS5jdXJyZW50KSB7CisgICAgICAgICAgICAgICRyb290U2NvcGUuJGJyb2FkY2FzdCgnJHJvdXRlQ2hhbmdlRXJyb3InLCBuZXh0Um91dGUsIGxhc3RSb3V0ZSwgZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQHJldHVybnMge09iamVjdH0gdGhlIGN1cnJlbnQgYWN0aXZlIHJvdXRlLCBieSBtYXRjaGluZyBpdCBhZ2FpbnN0IHRoZSBVUkwKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBwYXJzZVJvdXRlKCkgeworICAgICAgLy8gTWF0Y2ggYSByb3V0ZQorICAgICAgdmFyIHBhcmFtcywgbWF0Y2g7CisgICAgICBhbmd1bGFyLmZvckVhY2gocm91dGVzLCBmdW5jdGlvbihyb3V0ZSwgcGF0aCkgeworICAgICAgICBpZiAoIW1hdGNoICYmIChwYXJhbXMgPSBzd2l0Y2hSb3V0ZU1hdGNoZXIoJGxvY2F0aW9uLnBhdGgoKSwgcm91dGUpKSkgeworICAgICAgICAgIG1hdGNoID0gaW5oZXJpdChyb3V0ZSwgeworICAgICAgICAgICAgcGFyYW1zOiBhbmd1bGFyLmV4dGVuZCh7fSwgJGxvY2F0aW9uLnNlYXJjaCgpLCBwYXJhbXMpLAorICAgICAgICAgICAgcGF0aFBhcmFtczogcGFyYW1zfSk7CisgICAgICAgICAgbWF0Y2guJCRyb3V0ZSA9IHJvdXRlOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIC8vIE5vIHJvdXRlIG1hdGNoZWQ7IGZhbGxiYWNrIHRvICJvdGhlcndpc2UiIHJvdXRlCisgICAgICByZXR1cm4gbWF0Y2ggfHwgcm91dGVzW251bGxdICYmIGluaGVyaXQocm91dGVzW251bGxdLCB7cGFyYW1zOiB7fSwgcGF0aFBhcmFtczp7fX0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IGludGVycG9sYXRpb24gb2YgdGhlIHJlZGlyZWN0IHBhdGggd2l0aCB0aGUgcGFyYW1ldGVycworICAgICAqLworICAgIGZ1bmN0aW9uIGludGVycG9sYXRlKHN0cmluZywgcGFyYW1zKSB7CisgICAgICB2YXIgcmVzdWx0ID0gW107CisgICAgICBhbmd1bGFyLmZvckVhY2goKHN0cmluZyB8fCAnJykuc3BsaXQoJzonKSwgZnVuY3Rpb24oc2VnbWVudCwgaSkgeworICAgICAgICBpZiAoaSA9PT0gMCkgeworICAgICAgICAgIHJlc3VsdC5wdXNoKHNlZ21lbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZhciBzZWdtZW50TWF0Y2ggPSBzZWdtZW50Lm1hdGNoKC8oXHcrKSg/Ols/Kl0pPyguKikvKTsKKyAgICAgICAgICB2YXIga2V5ID0gc2VnbWVudE1hdGNoWzFdOworICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcmFtc1trZXldKTsKKyAgICAgICAgICByZXN1bHQucHVzaChzZWdtZW50TWF0Y2hbMl0gfHwgJycpOworICAgICAgICAgIGRlbGV0ZSBwYXJhbXNba2V5XTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpOworICAgIH0KKyAgfV07Cit9CisKK25nUm91dGVNb2R1bGUucHJvdmlkZXIoJyRyb3V0ZVBhcmFtcycsICRSb3V0ZVBhcmFtc1Byb3ZpZGVyKTsKKworCisvKioKKyAqIEBuZ2RvYyBzZXJ2aWNlCisgKiBAbmFtZSAkcm91dGVQYXJhbXMKKyAqIEByZXF1aXJlcyAkcm91dGUKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFRoZSBgJHJvdXRlUGFyYW1zYCBzZXJ2aWNlIGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgc2V0IG9mIHJvdXRlIHBhcmFtZXRlcnMuCisgKgorICogUmVxdWlyZXMgdGhlIHtAbGluayBuZ1JvdXRlIGBuZ1JvdXRlYH0gbW9kdWxlIHRvIGJlIGluc3RhbGxlZC4KKyAqCisgKiBUaGUgcm91dGUgcGFyYW1ldGVycyBhcmUgYSBjb21iaW5hdGlvbiBvZiB7QGxpbmsgbmcuJGxvY2F0aW9uIGAkbG9jYXRpb25gfSdzCisgKiB7QGxpbmsgbmcuJGxvY2F0aW9uI3NlYXJjaCBgc2VhcmNoKClgfSBhbmQge0BsaW5rIG5nLiRsb2NhdGlvbiNwYXRoIGBwYXRoKClgfS4KKyAqIFRoZSBgcGF0aGAgcGFyYW1ldGVycyBhcmUgZXh0cmFjdGVkIHdoZW4gdGhlIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSBgJHJvdXRlYH0gcGF0aCBpcyBtYXRjaGVkLgorICoKKyAqIEluIGNhc2Ugb2YgcGFyYW1ldGVyIG5hbWUgY29sbGlzaW9uLCBgcGF0aGAgcGFyYW1zIHRha2UgcHJlY2VkZW5jZSBvdmVyIGBzZWFyY2hgIHBhcmFtcy4KKyAqCisgKiBUaGUgc2VydmljZSBndWFyYW50ZWVzIHRoYXQgdGhlIGlkZW50aXR5IG9mIHRoZSBgJHJvdXRlUGFyYW1zYCBvYmplY3Qgd2lsbCByZW1haW4gdW5jaGFuZ2VkCisgKiAoYnV0IGl0cyBwcm9wZXJ0aWVzIHdpbGwgbGlrZWx5IGNoYW5nZSkgZXZlbiB3aGVuIGEgcm91dGUgY2hhbmdlIG9jY3Vycy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGAkcm91dGVQYXJhbXNgIGFyZSBvbmx5IHVwZGF0ZWQgKmFmdGVyKiBhIHJvdXRlIGNoYW5nZSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LgorICogVGhpcyBtZWFucyB0aGF0IHlvdSBjYW5ub3QgcmVseSBvbiBgJHJvdXRlUGFyYW1zYCBiZWluZyBjb3JyZWN0IGluIHJvdXRlIHJlc29sdmUgZnVuY3Rpb25zLgorICogSW5zdGVhZCB5b3UgY2FuIHVzZSBgJHJvdXRlLmN1cnJlbnQucGFyYW1zYCB0byBhY2Nlc3MgdGhlIG5ldyByb3V0ZSdzIHBhcmFtZXRlcnMuCisgKgorICogQGV4YW1wbGUKKyAqIGBgYGpzCisgKiAgLy8gR2l2ZW46CisgKiAgLy8gVVJMOiBodHRwOi8vc2VydmVyLmNvbS9pbmRleC5odG1sIy9DaGFwdGVyLzEvU2VjdGlvbi8yP3NlYXJjaD1tb2J5CisgKiAgLy8gUm91dGU6IC9DaGFwdGVyLzpjaGFwdGVySWQvU2VjdGlvbi86c2VjdGlvbklkCisgKiAgLy8KKyAqICAvLyBUaGVuCisgKiAgJHJvdXRlUGFyYW1zID09PiB7Y2hhcHRlcklkOicxJywgc2VjdGlvbklkOicyJywgc2VhcmNoOidtb2J5J30KKyAqIGBgYAorICovCitmdW5jdGlvbiAkUm91dGVQYXJhbXNQcm92aWRlcigpIHsKKyAgdGhpcy4kZ2V0ID0gZnVuY3Rpb24oKSB7IHJldHVybiB7fTsgfTsKK30KKworbmdSb3V0ZU1vZHVsZS5kaXJlY3RpdmUoJ25nVmlldycsIG5nVmlld0ZhY3RvcnkpOworbmdSb3V0ZU1vZHVsZS5kaXJlY3RpdmUoJ25nVmlldycsIG5nVmlld0ZpbGxDb250ZW50RmFjdG9yeSk7CisKKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ1ZpZXcKKyAqIEByZXN0cmljdCBFQ0EKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqICMgT3ZlcnZpZXcKKyAqIGBuZ1ZpZXdgIGlzIGEgZGlyZWN0aXZlIHRoYXQgY29tcGxlbWVudHMgdGhlIHtAbGluayBuZ1JvdXRlLiRyb3V0ZSAkcm91dGV9IHNlcnZpY2UgYnkKKyAqIGluY2x1ZGluZyB0aGUgcmVuZGVyZWQgdGVtcGxhdGUgb2YgdGhlIGN1cnJlbnQgcm91dGUgaW50byB0aGUgbWFpbiBsYXlvdXQgKGBpbmRleC5odG1sYCkgZmlsZS4KKyAqIEV2ZXJ5IHRpbWUgdGhlIGN1cnJlbnQgcm91dGUgY2hhbmdlcywgdGhlIGluY2x1ZGVkIHZpZXcgY2hhbmdlcyB3aXRoIGl0IGFjY29yZGluZyB0byB0aGUKKyAqIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGAkcm91dGVgIHNlcnZpY2UuCisgKgorICogUmVxdWlyZXMgdGhlIHtAbGluayBuZ1JvdXRlIGBuZ1JvdXRlYH0gbW9kdWxlIHRvIGJlIGluc3RhbGxlZC4KKyAqCisgKiBAYW5pbWF0aW9ucworICogZW50ZXIgLSBhbmltYXRpb24gaXMgdXNlZCB0byBicmluZyBuZXcgY29udGVudCBpbnRvIHRoZSBicm93c2VyLgorICogbGVhdmUgLSBhbmltYXRpb24gaXMgdXNlZCB0byBhbmltYXRlIGV4aXN0aW5nIGNvbnRlbnQgYXdheS4KKyAqCisgKiBUaGUgZW50ZXIgYW5kIGxlYXZlIGFuaW1hdGlvbiBvY2N1ciBjb25jdXJyZW50bHkuCisgKgorICogQHNjb3BlCisgKiBAcHJpb3JpdHkgNDAwCisgKiBAcGFyYW0ge3N0cmluZz19IG9ubG9hZCBFeHByZXNzaW9uIHRvIGV2YWx1YXRlIHdoZW5ldmVyIHRoZSB2aWV3IHVwZGF0ZXMuCisgKgorICogQHBhcmFtIHtzdHJpbmc9fSBhdXRvc2Nyb2xsIFdoZXRoZXIgYG5nVmlld2Agc2hvdWxkIGNhbGwge0BsaW5rIG5nLiRhbmNob3JTY3JvbGwKKyAqICAgICAgICAgICAgICAgICAgJGFuY2hvclNjcm9sbH0gdG8gc2Nyb2xsIHRoZSB2aWV3cG9ydCBhZnRlciB0aGUgdmlldyBpcyB1cGRhdGVkLgorICoKKyAqICAgICAgICAgICAgICAgICAgLSBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBzZXQsIGRpc2FibGUgc2Nyb2xsaW5nLgorICogICAgICAgICAgICAgICAgICAtIElmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0IHdpdGhvdXQgdmFsdWUsIGVuYWJsZSBzY3JvbGxpbmcuCisgKiAgICAgICAgICAgICAgICAgIC0gT3RoZXJ3aXNlIGVuYWJsZSBzY3JvbGxpbmcgb25seSBpZiB0aGUgYGF1dG9zY3JvbGxgIGF0dHJpYnV0ZSB2YWx1ZSBldmFsdWF0ZWQKKyAqICAgICAgICAgICAgICAgICAgICBhcyBhbiBleHByZXNzaW9uIHlpZWxkcyBhIHRydXRoeSB2YWx1ZS4KKyAqIEBleGFtcGxlCisgICAgPGV4YW1wbGUgbmFtZT0ibmdWaWV3LWRpcmVjdGl2ZSIgbW9kdWxlPSJuZ1ZpZXdFeGFtcGxlIgorICAgICAgICAgICAgIGRlcHM9ImFuZ3VsYXItcm91dGUuanM7YW5ndWxhci1hbmltYXRlLmpzIgorICAgICAgICAgICAgIGFuaW1hdGlvbnM9InRydWUiIGZpeEJhc2U9InRydWUiPgorICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iTWFpbkN0cmwgYXMgbWFpbiI+CisgICAgICAgICAgQ2hvb3NlOgorICAgICAgICAgIDxhIGhyZWY9IkJvb2svTW9ieSI+TW9ieTwvYT4gfAorICAgICAgICAgIDxhIGhyZWY9IkJvb2svTW9ieS9jaC8xIj5Nb2J5OiBDaDE8L2E+IHwKKyAgICAgICAgICA8YSBocmVmPSJCb29rL0dhdHNieSI+R2F0c2J5PC9hPiB8CisgICAgICAgICAgPGEgaHJlZj0iQm9vay9HYXRzYnkvY2gvND9rZXk9dmFsdWUiPkdhdHNieTogQ2g0PC9hPiB8CisgICAgICAgICAgPGEgaHJlZj0iQm9vay9TY2FybGV0Ij5TY2FybGV0IExldHRlcjwvYT48YnIvPgorCisgICAgICAgICAgPGRpdiBjbGFzcz0idmlldy1hbmltYXRlLWNvbnRhaW5lciI+CisgICAgICAgICAgICA8ZGl2IG5nLXZpZXcgY2xhc3M9InZpZXctYW5pbWF0ZSI+PC9kaXY+CisgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgPGhyIC8+CisKKyAgICAgICAgICA8cHJlPiRsb2NhdGlvbi5wYXRoKCkgPSB7e21haW4uJGxvY2F0aW9uLnBhdGgoKX19PC9wcmU+CisgICAgICAgICAgPHByZT4kcm91dGUuY3VycmVudC50ZW1wbGF0ZVVybCA9IHt7bWFpbi4kcm91dGUuY3VycmVudC50ZW1wbGF0ZVVybH19PC9wcmU+CisgICAgICAgICAgPHByZT4kcm91dGUuY3VycmVudC5wYXJhbXMgPSB7e21haW4uJHJvdXRlLmN1cnJlbnQucGFyYW1zfX08L3ByZT4KKyAgICAgICAgICA8cHJlPiRyb3V0ZVBhcmFtcyA9IHt7bWFpbi4kcm91dGVQYXJhbXN9fTwvcHJlPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZmlsZT4KKworICAgICAgPGZpbGUgbmFtZT0iYm9vay5odG1sIj4KKyAgICAgICAgPGRpdj4KKyAgICAgICAgICBjb250cm9sbGVyOiB7e2Jvb2submFtZX19PGJyIC8+CisgICAgICAgICAgQm9vayBJZDoge3tib29rLnBhcmFtcy5ib29rSWR9fTxiciAvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZmlsZT4KKworICAgICAgPGZpbGUgbmFtZT0iY2hhcHRlci5odG1sIj4KKyAgICAgICAgPGRpdj4KKyAgICAgICAgICBjb250cm9sbGVyOiB7e2NoYXB0ZXIubmFtZX19PGJyIC8+CisgICAgICAgICAgQm9vayBJZDoge3tjaGFwdGVyLnBhcmFtcy5ib29rSWR9fTxiciAvPgorICAgICAgICAgIENoYXB0ZXIgSWQ6IHt7Y2hhcHRlci5wYXJhbXMuY2hhcHRlcklkfX0KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2ZpbGU+CisKKyAgICAgIDxmaWxlIG5hbWU9ImFuaW1hdGlvbnMuY3NzIj4KKyAgICAgICAgLnZpZXctYW5pbWF0ZS1jb250YWluZXIgeworICAgICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgICAgICAgIGhlaWdodDoxMDBweCFpbXBvcnRhbnQ7CisgICAgICAgICAgYmFja2dyb3VuZDp3aGl0ZTsKKyAgICAgICAgICBib3JkZXI6MXB4IHNvbGlkIGJsYWNrOworICAgICAgICAgIGhlaWdodDo0MHB4OworICAgICAgICAgIG92ZXJmbG93OmhpZGRlbjsKKyAgICAgICAgfQorCisgICAgICAgIC52aWV3LWFuaW1hdGUgeworICAgICAgICAgIHBhZGRpbmc6MTBweDsKKyAgICAgICAgfQorCisgICAgICAgIC52aWV3LWFuaW1hdGUubmctZW50ZXIsIC52aWV3LWFuaW1hdGUubmctbGVhdmUgeworICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAxLjVzOworICAgICAgICAgIHRyYW5zaXRpb246YWxsIGN1YmljLWJlemllcigwLjI1MCwgMC40NjAsIDAuNDUwLCAwLjk0MCkgMS41czsKKworICAgICAgICAgIGRpc3BsYXk6YmxvY2s7CisgICAgICAgICAgd2lkdGg6MTAwJTsKKyAgICAgICAgICBib3JkZXItbGVmdDoxcHggc29saWQgYmxhY2s7CisKKyAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTsKKyAgICAgICAgICB0b3A6MDsKKyAgICAgICAgICBsZWZ0OjA7CisgICAgICAgICAgcmlnaHQ6MDsKKyAgICAgICAgICBib3R0b206MDsKKyAgICAgICAgICBwYWRkaW5nOjEwcHg7CisgICAgICAgIH0KKworICAgICAgICAudmlldy1hbmltYXRlLm5nLWVudGVyIHsKKyAgICAgICAgICBsZWZ0OjEwMCU7CisgICAgICAgIH0KKyAgICAgICAgLnZpZXctYW5pbWF0ZS5uZy1lbnRlci5uZy1lbnRlci1hY3RpdmUgeworICAgICAgICAgIGxlZnQ6MDsKKyAgICAgICAgfQorICAgICAgICAudmlldy1hbmltYXRlLm5nLWxlYXZlLm5nLWxlYXZlLWFjdGl2ZSB7CisgICAgICAgICAgbGVmdDotMTAwJTsKKyAgICAgICAgfQorICAgICAgPC9maWxlPgorCisgICAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgorICAgICAgICBhbmd1bGFyLm1vZHVsZSgnbmdWaWV3RXhhbXBsZScsIFsnbmdSb3V0ZScsICduZ0FuaW1hdGUnXSkKKyAgICAgICAgICAuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCAnJGxvY2F0aW9uUHJvdmlkZXInLAorICAgICAgICAgICAgZnVuY3Rpb24oJHJvdXRlUHJvdmlkZXIsICRsb2NhdGlvblByb3ZpZGVyKSB7CisgICAgICAgICAgICAgICRyb3V0ZVByb3ZpZGVyCisgICAgICAgICAgICAgICAgLndoZW4oJy9Cb29rLzpib29rSWQnLCB7CisgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2Jvb2suaHRtbCcsCisgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnQm9va0N0cmwnLAorICAgICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiAnYm9vaycKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aGVuKCcvQm9vay86Ym9va0lkL2NoLzpjaGFwdGVySWQnLCB7CisgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NoYXB0ZXIuaHRtbCcsCisgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiAnQ2hhcHRlckN0cmwnLAorICAgICAgICAgICAgICAgICAgY29udHJvbGxlckFzOiAnY2hhcHRlcicKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAkbG9jYXRpb25Qcm92aWRlci5odG1sNU1vZGUodHJ1ZSk7CisgICAgICAgICAgfV0pCisgICAgICAgICAgLmNvbnRyb2xsZXIoJ01haW5DdHJsJywgWyckcm91dGUnLCAnJHJvdXRlUGFyYW1zJywgJyRsb2NhdGlvbicsCisgICAgICAgICAgICBmdW5jdGlvbigkcm91dGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uKSB7CisgICAgICAgICAgICAgIHRoaXMuJHJvdXRlID0gJHJvdXRlOworICAgICAgICAgICAgICB0aGlzLiRsb2NhdGlvbiA9ICRsb2NhdGlvbjsKKyAgICAgICAgICAgICAgdGhpcy4kcm91dGVQYXJhbXMgPSAkcm91dGVQYXJhbXM7CisgICAgICAgICAgfV0pCisgICAgICAgICAgLmNvbnRyb2xsZXIoJ0Jvb2tDdHJsJywgWyckcm91dGVQYXJhbXMnLCBmdW5jdGlvbigkcm91dGVQYXJhbXMpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9ICJCb29rQ3RybCI7CisgICAgICAgICAgICB0aGlzLnBhcmFtcyA9ICRyb3V0ZVBhcmFtczsKKyAgICAgICAgICB9XSkKKyAgICAgICAgICAuY29udHJvbGxlcignQ2hhcHRlckN0cmwnLCBbJyRyb3V0ZVBhcmFtcycsIGZ1bmN0aW9uKCRyb3V0ZVBhcmFtcykgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gIkNoYXB0ZXJDdHJsIjsKKyAgICAgICAgICAgIHRoaXMucGFyYW1zID0gJHJvdXRlUGFyYW1zOworICAgICAgICAgIH1dKTsKKworICAgICAgPC9maWxlPgorCisgICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAgICAgICAgaXQoJ3Nob3VsZCBsb2FkIGFuZCBjb21waWxlIGNvcnJlY3QgdGVtcGxhdGUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICBlbGVtZW50KGJ5LmxpbmtUZXh0KCdNb2J5OiBDaDEnKSkuY2xpY2soKTsKKyAgICAgICAgICB2YXIgY29udGVudCA9IGVsZW1lbnQoYnkuY3NzKCdbbmctdmlld10nKSkuZ2V0VGV4dCgpOworICAgICAgICAgIGV4cGVjdChjb250ZW50KS50b01hdGNoKC9jb250cm9sbGVyXDogQ2hhcHRlckN0cmwvKTsKKyAgICAgICAgICBleHBlY3QoY29udGVudCkudG9NYXRjaCgvQm9vayBJZFw6IE1vYnkvKTsKKyAgICAgICAgICBleHBlY3QoY29udGVudCkudG9NYXRjaCgvQ2hhcHRlciBJZFw6IDEvKTsKKworICAgICAgICAgIGVsZW1lbnQoYnkucGFydGlhbExpbmtUZXh0KCdTY2FybGV0JykpLmNsaWNrKCk7CisKKyAgICAgICAgICBjb250ZW50ID0gZWxlbWVudChieS5jc3MoJ1tuZy12aWV3XScpKS5nZXRUZXh0KCk7CisgICAgICAgICAgZXhwZWN0KGNvbnRlbnQpLnRvTWF0Y2goL2NvbnRyb2xsZXJcOiBCb29rQ3RybC8pOworICAgICAgICAgIGV4cGVjdChjb250ZW50KS50b01hdGNoKC9Cb29rIElkXDogU2NhcmxldC8pOworICAgICAgICB9KTsKKyAgICAgIDwvZmlsZT4KKyAgICA8L2V4YW1wbGU+CisgKi8KKworCisvKioKKyAqIEBuZ2RvYyBldmVudAorICogQG5hbWUgbmdWaWV3IyR2aWV3Q29udGVudExvYWRlZAorICogQGV2ZW50VHlwZSBlbWl0IG9uIHRoZSBjdXJyZW50IG5nVmlldyBzY29wZQorICogQGRlc2NyaXB0aW9uCisgKiBFbWl0dGVkIGV2ZXJ5IHRpbWUgdGhlIG5nVmlldyBjb250ZW50IGlzIHJlbG9hZGVkLgorICovCituZ1ZpZXdGYWN0b3J5LiRpbmplY3QgPSBbJyRyb3V0ZScsICckYW5jaG9yU2Nyb2xsJywgJyRhbmltYXRlJ107CitmdW5jdGlvbiBuZ1ZpZXdGYWN0b3J5KCRyb3V0ZSwgJGFuY2hvclNjcm9sbCwgJGFuaW1hdGUpIHsKKyAgcmV0dXJuIHsKKyAgICByZXN0cmljdDogJ0VDQScsCisgICAgdGVybWluYWw6IHRydWUsCisgICAgcHJpb3JpdHk6IDQwMCwKKyAgICB0cmFuc2NsdWRlOiAnZWxlbWVudCcsCisgICAgbGluazogZnVuY3Rpb24oc2NvcGUsICRlbGVtZW50LCBhdHRyLCBjdHJsLCAkdHJhbnNjbHVkZSkgeworICAgICAgICB2YXIgY3VycmVudFNjb3BlLAorICAgICAgICAgICAgY3VycmVudEVsZW1lbnQsCisgICAgICAgICAgICBwcmV2aW91c0xlYXZlQW5pbWF0aW9uLAorICAgICAgICAgICAgYXV0b1Njcm9sbEV4cCA9IGF0dHIuYXV0b3Njcm9sbCwKKyAgICAgICAgICAgIG9ubG9hZEV4cCA9IGF0dHIub25sb2FkIHx8ICcnOworCisgICAgICAgIHNjb3BlLiRvbignJHJvdXRlQ2hhbmdlU3VjY2VzcycsIHVwZGF0ZSk7CisgICAgICAgIHVwZGF0ZSgpOworCisgICAgICAgIGZ1bmN0aW9uIGNsZWFudXBMYXN0VmlldygpIHsKKyAgICAgICAgICBpZiAocHJldmlvdXNMZWF2ZUFuaW1hdGlvbikgeworICAgICAgICAgICAgJGFuaW1hdGUuY2FuY2VsKHByZXZpb3VzTGVhdmVBbmltYXRpb24pOworICAgICAgICAgICAgcHJldmlvdXNMZWF2ZUFuaW1hdGlvbiA9IG51bGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGN1cnJlbnRTY29wZSkgeworICAgICAgICAgICAgY3VycmVudFNjb3BlLiRkZXN0cm95KCk7CisgICAgICAgICAgICBjdXJyZW50U2NvcGUgPSBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQpIHsKKyAgICAgICAgICAgIHByZXZpb3VzTGVhdmVBbmltYXRpb24gPSAkYW5pbWF0ZS5sZWF2ZShjdXJyZW50RWxlbWVudCk7CisgICAgICAgICAgICBwcmV2aW91c0xlYXZlQW5pbWF0aW9uLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgIHByZXZpb3VzTGVhdmVBbmltYXRpb24gPSBudWxsOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gdXBkYXRlKCkgeworICAgICAgICAgIHZhciBsb2NhbHMgPSAkcm91dGUuY3VycmVudCAmJiAkcm91dGUuY3VycmVudC5sb2NhbHMsCisgICAgICAgICAgICAgIHRlbXBsYXRlID0gbG9jYWxzICYmIGxvY2Fscy4kdGVtcGxhdGU7CisKKyAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQodGVtcGxhdGUpKSB7CisgICAgICAgICAgICB2YXIgbmV3U2NvcGUgPSBzY29wZS4kbmV3KCk7CisgICAgICAgICAgICB2YXIgY3VycmVudCA9ICRyb3V0ZS5jdXJyZW50OworCisgICAgICAgICAgICAvLyBOb3RlOiBUaGlzIHdpbGwgYWxzbyBsaW5rIGFsbCBjaGlsZHJlbiBvZiBuZy12aWV3IHRoYXQgd2VyZSBjb250YWluZWQgaW4gdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAvLyBodG1sLiBJZiB0aGF0IGNvbnRlbnQgY29udGFpbnMgY29udHJvbGxlcnMsIC4uLiB0aGV5IGNvdWxkIHBvbGx1dGUvY2hhbmdlIHRoZSBzY29wZS4KKyAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHVzaW5nIG5nLXZpZXcgb24gYW4gZWxlbWVudCB3aXRoIGFkZGl0aW9uYWwgY29udGVudCBkb2VzIG5vdCBtYWtlIHNlbnNlLi4uCisgICAgICAgICAgICAvLyBOb3RlOiBXZSBjYW4ndCByZW1vdmUgdGhlbSBpbiB0aGUgY2xvbmVBdHRjaEZuIG9mICR0cmFuc2NsdWRlIGFzIHRoYXQKKyAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgbGlua2luZyB0aGUgY29udGVudCwgd2hpY2ggd291bGQgYXBwbHkgY2hpbGQKKyAgICAgICAgICAgIC8vIGRpcmVjdGl2ZXMgdG8gbm9uIGV4aXN0aW5nIGVsZW1lbnRzLgorICAgICAgICAgICAgdmFyIGNsb25lID0gJHRyYW5zY2x1ZGUobmV3U2NvcGUsIGZ1bmN0aW9uKGNsb25lKSB7CisgICAgICAgICAgICAgICRhbmltYXRlLmVudGVyKGNsb25lLCBudWxsLCBjdXJyZW50RWxlbWVudCB8fCAkZWxlbWVudCkudGhlbihmdW5jdGlvbiBvbk5nVmlld0VudGVyKCkgeworICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChhdXRvU2Nyb2xsRXhwKQorICAgICAgICAgICAgICAgICAgJiYgKCFhdXRvU2Nyb2xsRXhwIHx8IHNjb3BlLiRldmFsKGF1dG9TY3JvbGxFeHApKSkgeworICAgICAgICAgICAgICAgICAgJGFuY2hvclNjcm9sbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIGNsZWFudXBMYXN0VmlldygpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY2xvbmU7CisgICAgICAgICAgICBjdXJyZW50U2NvcGUgPSBjdXJyZW50LnNjb3BlID0gbmV3U2NvcGU7CisgICAgICAgICAgICBjdXJyZW50U2NvcGUuJGVtaXQoJyR2aWV3Q29udGVudExvYWRlZCcpOworICAgICAgICAgICAgY3VycmVudFNjb3BlLiRldmFsKG9ubG9hZEV4cCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsZWFudXBMYXN0VmlldygpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgfTsKK30KKworLy8gVGhpcyBkaXJlY3RpdmUgaXMgY2FsbGVkIGR1cmluZyB0aGUgJHRyYW5zY2x1ZGUgY2FsbCBvZiB0aGUgZmlyc3QgYG5nVmlld2AgZGlyZWN0aXZlLgorLy8gSXQgd2lsbCByZXBsYWNlIGFuZCBjb21waWxlIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50IHdpdGggdGhlIGxvYWRlZCB0ZW1wbGF0ZS4KKy8vIFdlIG5lZWQgdGhpcyBkaXJlY3RpdmUgc28gdGhhdCB0aGUgZWxlbWVudCBjb250ZW50IGlzIGFscmVhZHkgZmlsbGVkIHdoZW4KKy8vIHRoZSBsaW5rIGZ1bmN0aW9uIG9mIGFub3RoZXIgZGlyZWN0aXZlIG9uIHRoZSBzYW1lIGVsZW1lbnQgYXMgbmdWaWV3CisvLyBpcyBjYWxsZWQuCituZ1ZpZXdGaWxsQ29udGVudEZhY3RvcnkuJGluamVjdCA9IFsnJGNvbXBpbGUnLCAnJGNvbnRyb2xsZXInLCAnJHJvdXRlJ107CitmdW5jdGlvbiBuZ1ZpZXdGaWxsQ29udGVudEZhY3RvcnkoJGNvbXBpbGUsICRjb250cm9sbGVyLCAkcm91dGUpIHsKKyAgcmV0dXJuIHsKKyAgICByZXN0cmljdDogJ0VDQScsCisgICAgcHJpb3JpdHk6IC00MDAsCisgICAgbGluazogZnVuY3Rpb24oc2NvcGUsICRlbGVtZW50KSB7CisgICAgICB2YXIgY3VycmVudCA9ICRyb3V0ZS5jdXJyZW50LAorICAgICAgICAgIGxvY2FscyA9IGN1cnJlbnQubG9jYWxzOworCisgICAgICAkZWxlbWVudC5odG1sKGxvY2Fscy4kdGVtcGxhdGUpOworCisgICAgICB2YXIgbGluayA9ICRjb21waWxlKCRlbGVtZW50LmNvbnRlbnRzKCkpOworCisgICAgICBpZiAoY3VycmVudC5jb250cm9sbGVyKSB7CisgICAgICAgIGxvY2Fscy4kc2NvcGUgPSBzY29wZTsKKyAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSAkY29udHJvbGxlcihjdXJyZW50LmNvbnRyb2xsZXIsIGxvY2Fscyk7CisgICAgICAgIGlmIChjdXJyZW50LmNvbnRyb2xsZXJBcykgeworICAgICAgICAgIHNjb3BlW2N1cnJlbnQuY29udHJvbGxlckFzXSA9IGNvbnRyb2xsZXI7CisgICAgICAgIH0KKyAgICAgICAgJGVsZW1lbnQuZGF0YSgnJG5nQ29udHJvbGxlckNvbnRyb2xsZXInLCBjb250cm9sbGVyKTsKKyAgICAgICAgJGVsZW1lbnQuY2hpbGRyZW4oKS5kYXRhKCckbmdDb250cm9sbGVyQ29udHJvbGxlcicsIGNvbnRyb2xsZXIpOworICAgICAgfQorCisgICAgICBsaW5rKHNjb3BlKTsKKyAgICB9CisgIH07Cit9CisKKworfSkod2luZG93LCB3aW5kb3cuYW5ndWxhcik7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9hbmd1bGFyLXJvdXRlLm1pbi5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItcm91dGUubWluLmpzCmluZGV4IDNkNGU1YzIuLmI3ZjMzYTggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItcm91dGUubWluLmpzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItcm91dGUubWluLmpzCkBAIC0xLDM4ICsxLDM4IEBACi0vKg0KLVRoZSBNSVQgTGljZW5zZQ0KLQ0KLUNvcHlyaWdodCAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZw0KLQ0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkNCi1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCi10byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KLQ0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQotQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTg0KLVRIRSBTT0ZUV0FSRS4NCi0qLw0KLS8qDQotIEFuZ3VsYXJKUyB2MS4zLjgNCi0gKGMpIDIwMTAtMjAxNCBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmcNCi0gTGljZW5zZTogTUlUDQotKi8NCi0oZnVuY3Rpb24ocCxkLEMpeyd1c2Ugc3RyaWN0JztmdW5jdGlvbiB2KHIsaCxnKXtyZXR1cm57cmVzdHJpY3Q6IkVDQSIsdGVybWluYWw6ITAscHJpb3JpdHk6NDAwLHRyYW5zY2x1ZGU6ImVsZW1lbnQiLGxpbms6ZnVuY3Rpb24oYSxjLGIsZix5KXtmdW5jdGlvbiB6KCl7ayYmKGcuY2FuY2VsKGspLGs9bnVsbCk7bCYmKGwuJGRlc3Ryb3koKSxsPW51bGwpO20mJihrPWcubGVhdmUobSksay50aGVuKGZ1bmN0aW9uKCl7az1udWxsfSksbT1udWxsKX1mdW5jdGlvbiB4KCl7dmFyIGI9ci5jdXJyZW50JiZyLmN1cnJlbnQubG9jYWxzO2lmKGQuaXNEZWZpbmVkKGImJmIuJHRlbXBsYXRlKSl7dmFyIGI9YS4kbmV3KCksZj1yLmN1cnJlbnQ7bT15KGIsZnVuY3Rpb24oYil7Zy5lbnRlcihiLG51bGwsbXx8YykudGhlbihmdW5jdGlvbigpeyFkLmlzRGVmaW5lZCh0KXx8dCYmIWEuJGV2YWwodCl8fGgoKX0pO3ooKX0pO2w9Zi5zY29wZT1iO2wuJGVtaXQoIiR2aWV3Q29udGVudExvYWRlZCIpOw0KLWwuJGV2YWwodyl9ZWxzZSB6KCl9dmFyIGwsbSxrLHQ9Yi5hdXRvc2Nyb2xsLHc9Yi5vbmxvYWR8fCIiO2EuJG9uKCIkcm91dGVDaGFuZ2VTdWNjZXNzIix4KTt4KCl9fX1mdW5jdGlvbiBBKGQsaCxnKXtyZXR1cm57cmVzdHJpY3Q6IkVDQSIscHJpb3JpdHk6LTQwMCxsaW5rOmZ1bmN0aW9uKGEsYyl7dmFyIGI9Zy5jdXJyZW50LGY9Yi5sb2NhbHM7Yy5odG1sKGYuJHRlbXBsYXRlKTt2YXIgeT1kKGMuY29udGVudHMoKSk7Yi5jb250cm9sbGVyJiYoZi4kc2NvcGU9YSxmPWgoYi5jb250cm9sbGVyLGYpLGIuY29udHJvbGxlckFzJiYoYVtiLmNvbnRyb2xsZXJBc109ZiksYy5kYXRhKCIkbmdDb250cm9sbGVyQ29udHJvbGxlciIsZiksYy5jaGlsZHJlbigpLmRhdGEoIiRuZ0NvbnRyb2xsZXJDb250cm9sbGVyIixmKSk7eShhKX19fXA9ZC5tb2R1bGUoIm5nUm91dGUiLFsibmciXSkucHJvdmlkZXIoIiRyb3V0ZSIsZnVuY3Rpb24oKXtmdW5jdGlvbiByKGEsYyl7cmV0dXJuIGQuZXh0ZW5kKE9iamVjdC5jcmVhdGUoYSksDQotYyl9ZnVuY3Rpb24gaChhLGQpe3ZhciBiPWQuY2FzZUluc2Vuc2l0aXZlTWF0Y2gsZj17b3JpZ2luYWxQYXRoOmEscmVnZXhwOmF9LGc9Zi5rZXlzPVtdO2E9YS5yZXBsYWNlKC8oWygpLl0pL2csIlxcJDEiKS5yZXBsYWNlKC8oXC8pPzooXHcrKShbXD9cKl0pPy9nLGZ1bmN0aW9uKGEsZCxiLGMpe2E9Ij8iPT09Yz9jOm51bGw7Yz0iKiI9PT1jP2M6bnVsbDtnLnB1c2goe25hbWU6YixvcHRpb25hbDohIWF9KTtkPWR8fCIiO3JldHVybiIiKyhhPyIiOmQpKyIoPzoiKyhhP2Q6IiIpKyhjJiYiKC4rPykifHwiKFteL10rKSIpKyhhfHwiIikrIikiKyhhfHwiIil9KS5yZXBsYWNlKC8oW1wvJFwqXSkvZywiXFwkMSIpO2YucmVnZXhwPW5ldyBSZWdFeHAoIl4iK2ErIiQiLGI/ImkiOiIiKTtyZXR1cm4gZn12YXIgZz17fTt0aGlzLndoZW49ZnVuY3Rpb24oYSxjKXt2YXIgYj1kLmNvcHkoYyk7ZC5pc1VuZGVmaW5lZChiLnJlbG9hZE9uU2VhcmNoKSYmKGIucmVsb2FkT25TZWFyY2g9ITApOw0KLWQuaXNVbmRlZmluZWQoYi5jYXNlSW5zZW5zaXRpdmVNYXRjaCkmJihiLmNhc2VJbnNlbnNpdGl2ZU1hdGNoPXRoaXMuY2FzZUluc2Vuc2l0aXZlTWF0Y2gpO2dbYV09ZC5leHRlbmQoYixhJiZoKGEsYikpO2lmKGEpe3ZhciBmPSIvIj09YVthLmxlbmd0aC0xXT9hLnN1YnN0cigwLGEubGVuZ3RoLTEpOmErIi8iO2dbZl09ZC5leHRlbmQoe3JlZGlyZWN0VG86YX0saChmLGIpKX1yZXR1cm4gdGhpc307dGhpcy5jYXNlSW5zZW5zaXRpdmVNYXRjaD0hMTt0aGlzLm90aGVyd2lzZT1mdW5jdGlvbihhKXsic3RyaW5nIj09PXR5cGVvZiBhJiYoYT17cmVkaXJlY3RUbzphfSk7dGhpcy53aGVuKG51bGwsYSk7cmV0dXJuIHRoaXN9O3RoaXMuJGdldD1bIiRyb290U2NvcGUiLCIkbG9jYXRpb24iLCIkcm91dGVQYXJhbXMiLCIkcSIsIiRpbmplY3RvciIsIiR0ZW1wbGF0ZVJlcXVlc3QiLCIkc2NlIixmdW5jdGlvbihhLGMsYixmLGgscCx4KXtmdW5jdGlvbiBsKGIpe3ZhciBlPXMuY3VycmVudDsNCi0odj0obj1rKCkpJiZlJiZuLiQkcm91dGU9PT1lLiQkcm91dGUmJmQuZXF1YWxzKG4ucGF0aFBhcmFtcyxlLnBhdGhQYXJhbXMpJiYhbi5yZWxvYWRPblNlYXJjaCYmIXcpfHwhZSYmIW58fGEuJGJyb2FkY2FzdCgiJHJvdXRlQ2hhbmdlU3RhcnQiLG4sZSkuZGVmYXVsdFByZXZlbnRlZCYmYiYmYi5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIG0oKXt2YXIgdT1zLmN1cnJlbnQsZT1uO2lmKHYpdS5wYXJhbXM9ZS5wYXJhbXMsZC5jb3B5KHUucGFyYW1zLGIpLGEuJGJyb2FkY2FzdCgiJHJvdXRlVXBkYXRlIix1KTtlbHNlIGlmKGV8fHUpdz0hMSwocy5jdXJyZW50PWUpJiZlLnJlZGlyZWN0VG8mJihkLmlzU3RyaW5nKGUucmVkaXJlY3RUbyk/Yy5wYXRoKHQoZS5yZWRpcmVjdFRvLGUucGFyYW1zKSkuc2VhcmNoKGUucGFyYW1zKS5yZXBsYWNlKCk6Yy51cmwoZS5yZWRpcmVjdFRvKGUucGF0aFBhcmFtcyxjLnBhdGgoKSxjLnNlYXJjaCgpKSkucmVwbGFjZSgpKSxmLndoZW4oZSkudGhlbihmdW5jdGlvbigpe2lmKGUpe3ZhciBhPQ0KLWQuZXh0ZW5kKHt9LGUucmVzb2x2ZSksYixjO2QuZm9yRWFjaChhLGZ1bmN0aW9uKGIsZSl7YVtlXT1kLmlzU3RyaW5nKGIpP2guZ2V0KGIpOmguaW52b2tlKGIsbnVsbCxudWxsLGUpfSk7ZC5pc0RlZmluZWQoYj1lLnRlbXBsYXRlKT9kLmlzRnVuY3Rpb24oYikmJihiPWIoZS5wYXJhbXMpKTpkLmlzRGVmaW5lZChjPWUudGVtcGxhdGVVcmwpJiYoZC5pc0Z1bmN0aW9uKGMpJiYoYz1jKGUucGFyYW1zKSksYz14LmdldFRydXN0ZWRSZXNvdXJjZVVybChjKSxkLmlzRGVmaW5lZChjKSYmKGUubG9hZGVkVGVtcGxhdGVVcmw9YyxiPXAoYykpKTtkLmlzRGVmaW5lZChiKSYmKGEuJHRlbXBsYXRlPWIpO3JldHVybiBmLmFsbChhKX19KS50aGVuKGZ1bmN0aW9uKGMpe2U9PXMuY3VycmVudCYmKGUmJihlLmxvY2Fscz1jLGQuY29weShlLnBhcmFtcyxiKSksYS4kYnJvYWRjYXN0KCIkcm91dGVDaGFuZ2VTdWNjZXNzIixlLHUpKX0sZnVuY3Rpb24oYil7ZT09cy5jdXJyZW50JiZhLiRicm9hZGNhc3QoIiRyb3V0ZUNoYW5nZUVycm9yIiwNCi1lLHUsYil9KX1mdW5jdGlvbiBrKCl7dmFyIGEsYjtkLmZvckVhY2goZyxmdW5jdGlvbihmLGcpe3ZhciBxO2lmKHE9IWIpe3ZhciBoPWMucGF0aCgpO3E9Zi5rZXlzO3ZhciBsPXt9O2lmKGYucmVnZXhwKWlmKGg9Zi5yZWdleHAuZXhlYyhoKSl7Zm9yKHZhciBrPTEsbT1oLmxlbmd0aDtrPG07KytrKXt2YXIgbj1xW2stMV0scD1oW2tdO24mJnAmJihsW24ubmFtZV09cCl9cT1sfWVsc2UgcT1udWxsO2Vsc2UgcT1udWxsO3E9YT1xfXEmJihiPXIoZix7cGFyYW1zOmQuZXh0ZW5kKHt9LGMuc2VhcmNoKCksYSkscGF0aFBhcmFtczphfSksYi4kJHJvdXRlPWYpfSk7cmV0dXJuIGJ8fGdbbnVsbF0mJnIoZ1tudWxsXSx7cGFyYW1zOnt9LHBhdGhQYXJhbXM6e319KX1mdW5jdGlvbiB0KGEsYil7dmFyIGM9W107ZC5mb3JFYWNoKChhfHwiIikuc3BsaXQoIjoiKSxmdW5jdGlvbihhLGQpe2lmKDA9PT1kKWMucHVzaChhKTtlbHNle3ZhciBmPWEubWF0Y2goLyhcdyspKD86Wz8qXSk/KC4qKS8pLA0KLWc9ZlsxXTtjLnB1c2goYltnXSk7Yy5wdXNoKGZbMl18fCIiKTtkZWxldGUgYltnXX19KTtyZXR1cm4gYy5qb2luKCIiKX12YXIgdz0hMSxuLHYscz17cm91dGVzOmcscmVsb2FkOmZ1bmN0aW9uKCl7dz0hMDthLiRldmFsQXN5bmMoZnVuY3Rpb24oKXtsKCk7bSgpfSl9LHVwZGF0ZVBhcmFtczpmdW5jdGlvbihhKXtpZih0aGlzLmN1cnJlbnQmJnRoaXMuY3VycmVudC4kJHJvdXRlKXt2YXIgYj17fSxmPXRoaXM7ZC5mb3JFYWNoKE9iamVjdC5rZXlzKGEpLGZ1bmN0aW9uKGMpe2YuY3VycmVudC5wYXRoUGFyYW1zW2NdfHwoYltjXT1hW2NdKX0pO2E9ZC5leHRlbmQoe30sdGhpcy5jdXJyZW50LnBhcmFtcyxhKTtjLnBhdGgodCh0aGlzLmN1cnJlbnQuJCRyb3V0ZS5vcmlnaW5hbFBhdGgsYSkpO2Muc2VhcmNoKGQuZXh0ZW5kKHt9LGMuc2VhcmNoKCksYikpfWVsc2UgdGhyb3cgQigibm9yb3V0Iik7fX07YS4kb24oIiRsb2NhdGlvbkNoYW5nZVN0YXJ0IixsKTthLiRvbigiJGxvY2F0aW9uQ2hhbmdlU3VjY2VzcyIsDQotbSk7cmV0dXJuIHN9XX0pO3ZhciBCPWQuJCRtaW5FcnIoIm5nUm91dGUiKTtwLnByb3ZpZGVyKCIkcm91dGVQYXJhbXMiLGZ1bmN0aW9uKCl7dGhpcy4kZ2V0PWZ1bmN0aW9uKCl7cmV0dXJue319fSk7cC5kaXJlY3RpdmUoIm5nVmlldyIsdik7cC5kaXJlY3RpdmUoIm5nVmlldyIsQSk7di4kaW5qZWN0PVsiJHJvdXRlIiwiJGFuY2hvclNjcm9sbCIsIiRhbmltYXRlIl07QS4kaW5qZWN0PVsiJGNvbXBpbGUiLCIkY29udHJvbGxlciIsIiRyb3V0ZSJdfSkod2luZG93LHdpbmRvdy5hbmd1bGFyKTsNCi0vLyMgc291cmNlTWFwcGluZ1VSTD1hbmd1bGFyLXJvdXRlLm1pbi5qcy5tYXANCisvKgorVGhlIE1JVCBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKyovCisvKgorIEFuZ3VsYXJKUyB2MS4zLjgKKyAoYykgMjAxMC0yMDE0IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZworIExpY2Vuc2U6IE1JVAorKi8KKyhmdW5jdGlvbihwLGQsQyl7J3VzZSBzdHJpY3QnO2Z1bmN0aW9uIHYocixoLGcpe3JldHVybntyZXN0cmljdDoiRUNBIix0ZXJtaW5hbDohMCxwcmlvcml0eTo0MDAsdHJhbnNjbHVkZToiZWxlbWVudCIsbGluazpmdW5jdGlvbihhLGMsYixmLHkpe2Z1bmN0aW9uIHooKXtrJiYoZy5jYW5jZWwoayksaz1udWxsKTtsJiYobC4kZGVzdHJveSgpLGw9bnVsbCk7bSYmKGs9Zy5sZWF2ZShtKSxrLnRoZW4oZnVuY3Rpb24oKXtrPW51bGx9KSxtPW51bGwpfWZ1bmN0aW9uIHgoKXt2YXIgYj1yLmN1cnJlbnQmJnIuY3VycmVudC5sb2NhbHM7aWYoZC5pc0RlZmluZWQoYiYmYi4kdGVtcGxhdGUpKXt2YXIgYj1hLiRuZXcoKSxmPXIuY3VycmVudDttPXkoYixmdW5jdGlvbihiKXtnLmVudGVyKGIsbnVsbCxtfHxjKS50aGVuKGZ1bmN0aW9uKCl7IWQuaXNEZWZpbmVkKHQpfHx0JiYhYS4kZXZhbCh0KXx8aCgpfSk7eigpfSk7bD1mLnNjb3BlPWI7bC4kZW1pdCgiJHZpZXdDb250ZW50TG9hZGVkIik7CitsLiRldmFsKHcpfWVsc2UgeigpfXZhciBsLG0sayx0PWIuYXV0b3Njcm9sbCx3PWIub25sb2FkfHwiIjthLiRvbigiJHJvdXRlQ2hhbmdlU3VjY2VzcyIseCk7eCgpfX19ZnVuY3Rpb24gQShkLGgsZyl7cmV0dXJue3Jlc3RyaWN0OiJFQ0EiLHByaW9yaXR5Oi00MDAsbGluazpmdW5jdGlvbihhLGMpe3ZhciBiPWcuY3VycmVudCxmPWIubG9jYWxzO2MuaHRtbChmLiR0ZW1wbGF0ZSk7dmFyIHk9ZChjLmNvbnRlbnRzKCkpO2IuY29udHJvbGxlciYmKGYuJHNjb3BlPWEsZj1oKGIuY29udHJvbGxlcixmKSxiLmNvbnRyb2xsZXJBcyYmKGFbYi5jb250cm9sbGVyQXNdPWYpLGMuZGF0YSgiJG5nQ29udHJvbGxlckNvbnRyb2xsZXIiLGYpLGMuY2hpbGRyZW4oKS5kYXRhKCIkbmdDb250cm9sbGVyQ29udHJvbGxlciIsZikpO3koYSl9fX1wPWQubW9kdWxlKCJuZ1JvdXRlIixbIm5nIl0pLnByb3ZpZGVyKCIkcm91dGUiLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihhLGMpe3JldHVybiBkLmV4dGVuZChPYmplY3QuY3JlYXRlKGEpLAorYyl9ZnVuY3Rpb24gaChhLGQpe3ZhciBiPWQuY2FzZUluc2Vuc2l0aXZlTWF0Y2gsZj17b3JpZ2luYWxQYXRoOmEscmVnZXhwOmF9LGc9Zi5rZXlzPVtdO2E9YS5yZXBsYWNlKC8oWygpLl0pL2csIlxcJDEiKS5yZXBsYWNlKC8oXC8pPzooXHcrKShbXD9cKl0pPy9nLGZ1bmN0aW9uKGEsZCxiLGMpe2E9Ij8iPT09Yz9jOm51bGw7Yz0iKiI9PT1jP2M6bnVsbDtnLnB1c2goe25hbWU6YixvcHRpb25hbDohIWF9KTtkPWR8fCIiO3JldHVybiIiKyhhPyIiOmQpKyIoPzoiKyhhP2Q6IiIpKyhjJiYiKC4rPykifHwiKFteL10rKSIpKyhhfHwiIikrIikiKyhhfHwiIil9KS5yZXBsYWNlKC8oW1wvJFwqXSkvZywiXFwkMSIpO2YucmVnZXhwPW5ldyBSZWdFeHAoIl4iK2ErIiQiLGI/ImkiOiIiKTtyZXR1cm4gZn12YXIgZz17fTt0aGlzLndoZW49ZnVuY3Rpb24oYSxjKXt2YXIgYj1kLmNvcHkoYyk7ZC5pc1VuZGVmaW5lZChiLnJlbG9hZE9uU2VhcmNoKSYmKGIucmVsb2FkT25TZWFyY2g9ITApOworZC5pc1VuZGVmaW5lZChiLmNhc2VJbnNlbnNpdGl2ZU1hdGNoKSYmKGIuY2FzZUluc2Vuc2l0aXZlTWF0Y2g9dGhpcy5jYXNlSW5zZW5zaXRpdmVNYXRjaCk7Z1thXT1kLmV4dGVuZChiLGEmJmgoYSxiKSk7aWYoYSl7dmFyIGY9Ii8iPT1hW2EubGVuZ3RoLTFdP2Euc3Vic3RyKDAsYS5sZW5ndGgtMSk6YSsiLyI7Z1tmXT1kLmV4dGVuZCh7cmVkaXJlY3RUbzphfSxoKGYsYikpfXJldHVybiB0aGlzfTt0aGlzLmNhc2VJbnNlbnNpdGl2ZU1hdGNoPSExO3RoaXMub3RoZXJ3aXNlPWZ1bmN0aW9uKGEpeyJzdHJpbmciPT09dHlwZW9mIGEmJihhPXtyZWRpcmVjdFRvOmF9KTt0aGlzLndoZW4obnVsbCxhKTtyZXR1cm4gdGhpc307dGhpcy4kZ2V0PVsiJHJvb3RTY29wZSIsIiRsb2NhdGlvbiIsIiRyb3V0ZVBhcmFtcyIsIiRxIiwiJGluamVjdG9yIiwiJHRlbXBsYXRlUmVxdWVzdCIsIiRzY2UiLGZ1bmN0aW9uKGEsYyxiLGYsaCxwLHgpe2Z1bmN0aW9uIGwoYil7dmFyIGU9cy5jdXJyZW50OworKHY9KG49aygpKSYmZSYmbi4kJHJvdXRlPT09ZS4kJHJvdXRlJiZkLmVxdWFscyhuLnBhdGhQYXJhbXMsZS5wYXRoUGFyYW1zKSYmIW4ucmVsb2FkT25TZWFyY2gmJiF3KXx8IWUmJiFufHxhLiRicm9hZGNhc3QoIiRyb3V0ZUNoYW5nZVN0YXJ0IixuLGUpLmRlZmF1bHRQcmV2ZW50ZWQmJmImJmIucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBtKCl7dmFyIHU9cy5jdXJyZW50LGU9bjtpZih2KXUucGFyYW1zPWUucGFyYW1zLGQuY29weSh1LnBhcmFtcyxiKSxhLiRicm9hZGNhc3QoIiRyb3V0ZVVwZGF0ZSIsdSk7ZWxzZSBpZihlfHx1KXc9ITEsKHMuY3VycmVudD1lKSYmZS5yZWRpcmVjdFRvJiYoZC5pc1N0cmluZyhlLnJlZGlyZWN0VG8pP2MucGF0aCh0KGUucmVkaXJlY3RUbyxlLnBhcmFtcykpLnNlYXJjaChlLnBhcmFtcykucmVwbGFjZSgpOmMudXJsKGUucmVkaXJlY3RUbyhlLnBhdGhQYXJhbXMsYy5wYXRoKCksYy5zZWFyY2goKSkpLnJlcGxhY2UoKSksZi53aGVuKGUpLnRoZW4oZnVuY3Rpb24oKXtpZihlKXt2YXIgYT0KK2QuZXh0ZW5kKHt9LGUucmVzb2x2ZSksYixjO2QuZm9yRWFjaChhLGZ1bmN0aW9uKGIsZSl7YVtlXT1kLmlzU3RyaW5nKGIpP2guZ2V0KGIpOmguaW52b2tlKGIsbnVsbCxudWxsLGUpfSk7ZC5pc0RlZmluZWQoYj1lLnRlbXBsYXRlKT9kLmlzRnVuY3Rpb24oYikmJihiPWIoZS5wYXJhbXMpKTpkLmlzRGVmaW5lZChjPWUudGVtcGxhdGVVcmwpJiYoZC5pc0Z1bmN0aW9uKGMpJiYoYz1jKGUucGFyYW1zKSksYz14LmdldFRydXN0ZWRSZXNvdXJjZVVybChjKSxkLmlzRGVmaW5lZChjKSYmKGUubG9hZGVkVGVtcGxhdGVVcmw9YyxiPXAoYykpKTtkLmlzRGVmaW5lZChiKSYmKGEuJHRlbXBsYXRlPWIpO3JldHVybiBmLmFsbChhKX19KS50aGVuKGZ1bmN0aW9uKGMpe2U9PXMuY3VycmVudCYmKGUmJihlLmxvY2Fscz1jLGQuY29weShlLnBhcmFtcyxiKSksYS4kYnJvYWRjYXN0KCIkcm91dGVDaGFuZ2VTdWNjZXNzIixlLHUpKX0sZnVuY3Rpb24oYil7ZT09cy5jdXJyZW50JiZhLiRicm9hZGNhc3QoIiRyb3V0ZUNoYW5nZUVycm9yIiwKK2UsdSxiKX0pfWZ1bmN0aW9uIGsoKXt2YXIgYSxiO2QuZm9yRWFjaChnLGZ1bmN0aW9uKGYsZyl7dmFyIHE7aWYocT0hYil7dmFyIGg9Yy5wYXRoKCk7cT1mLmtleXM7dmFyIGw9e307aWYoZi5yZWdleHApaWYoaD1mLnJlZ2V4cC5leGVjKGgpKXtmb3IodmFyIGs9MSxtPWgubGVuZ3RoO2s8bTsrK2spe3ZhciBuPXFbay0xXSxwPWhba107biYmcCYmKGxbbi5uYW1lXT1wKX1xPWx9ZWxzZSBxPW51bGw7ZWxzZSBxPW51bGw7cT1hPXF9cSYmKGI9cihmLHtwYXJhbXM6ZC5leHRlbmQoe30sYy5zZWFyY2goKSxhKSxwYXRoUGFyYW1zOmF9KSxiLiQkcm91dGU9Zil9KTtyZXR1cm4gYnx8Z1tudWxsXSYmcihnW251bGxdLHtwYXJhbXM6e30scGF0aFBhcmFtczp7fX0pfWZ1bmN0aW9uIHQoYSxiKXt2YXIgYz1bXTtkLmZvckVhY2goKGF8fCIiKS5zcGxpdCgiOiIpLGZ1bmN0aW9uKGEsZCl7aWYoMD09PWQpYy5wdXNoKGEpO2Vsc2V7dmFyIGY9YS5tYXRjaCgvKFx3KykoPzpbPypdKT8oLiopLyksCitnPWZbMV07Yy5wdXNoKGJbZ10pO2MucHVzaChmWzJdfHwiIik7ZGVsZXRlIGJbZ119fSk7cmV0dXJuIGMuam9pbigiIil9dmFyIHc9ITEsbix2LHM9e3JvdXRlczpnLHJlbG9hZDpmdW5jdGlvbigpe3c9ITA7YS4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7bCgpO20oKX0pfSx1cGRhdGVQYXJhbXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5jdXJyZW50JiZ0aGlzLmN1cnJlbnQuJCRyb3V0ZSl7dmFyIGI9e30sZj10aGlzO2QuZm9yRWFjaChPYmplY3Qua2V5cyhhKSxmdW5jdGlvbihjKXtmLmN1cnJlbnQucGF0aFBhcmFtc1tjXXx8KGJbY109YVtjXSl9KTthPWQuZXh0ZW5kKHt9LHRoaXMuY3VycmVudC5wYXJhbXMsYSk7Yy5wYXRoKHQodGhpcy5jdXJyZW50LiQkcm91dGUub3JpZ2luYWxQYXRoLGEpKTtjLnNlYXJjaChkLmV4dGVuZCh7fSxjLnNlYXJjaCgpLGIpKX1lbHNlIHRocm93IEIoIm5vcm91dCIpO319O2EuJG9uKCIkbG9jYXRpb25DaGFuZ2VTdGFydCIsbCk7YS4kb24oIiRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MiLAorbSk7cmV0dXJuIHN9XX0pO3ZhciBCPWQuJCRtaW5FcnIoIm5nUm91dGUiKTtwLnByb3ZpZGVyKCIkcm91dGVQYXJhbXMiLGZ1bmN0aW9uKCl7dGhpcy4kZ2V0PWZ1bmN0aW9uKCl7cmV0dXJue319fSk7cC5kaXJlY3RpdmUoIm5nVmlldyIsdik7cC5kaXJlY3RpdmUoIm5nVmlldyIsQSk7di4kaW5qZWN0PVsiJHJvdXRlIiwiJGFuY2hvclNjcm9sbCIsIiRhbmltYXRlIl07QS4kaW5qZWN0PVsiJGNvbXBpbGUiLCIkY29udHJvbGxlciIsIiRyb3V0ZSJdfSkod2luZG93LHdpbmRvdy5hbmd1bGFyKTsKKy8vIyBzb3VyY2VNYXBwaW5nVVJMPWFuZ3VsYXItcm91dGUubWluLmpzLm1hcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvYW5ndWxhci1zYW5pdGl6ZS5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItc2FuaXRpemUuanMKaW5kZXggMGRkOWRmOS4uMTY4YTBlZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvYW5ndWxhci1zYW5pdGl6ZS5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9hbmd1bGFyLXNhbml0aXplLmpzCkBAIC0xLDcwMyArMSw3MDMgQEAKLS8qDQotVGhlIE1JVCBMaWNlbnNlDQotDQotQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnDQotDQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0KLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsDQotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMNCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluDQotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQotDQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQotVEhFIFNPRlRXQVJFLg0KLSovDQotLyoqDQotICogQGxpY2Vuc2UgQW5ndWxhckpTIHYxLjMuOA0KLSAqIChjKSAyMDEwLTIwMTQgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnDQotICogTGljZW5zZTogTUlUDQotICovDQotKGZ1bmN0aW9uKHdpbmRvdywgYW5ndWxhciwgdW5kZWZpbmVkKSB7J3VzZSBzdHJpY3QnOw0KLQ0KLXZhciAkc2FuaXRpemVNaW5FcnIgPSBhbmd1bGFyLiQkbWluRXJyKCckc2FuaXRpemUnKTsNCi0NCi0vKioNCi0gKiBAbmdkb2MgbW9kdWxlDQotICogQG5hbWUgbmdTYW5pdGl6ZQ0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqDQotICogIyBuZ1Nhbml0aXplDQotICoNCi0gKiBUaGUgYG5nU2FuaXRpemVgIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIHNhbml0aXplIEhUTUwuDQotICoNCi0gKg0KLSAqIDxkaXYgZG9jLW1vZHVsZS1jb21wb25lbnRzPSJuZ1Nhbml0aXplIj48L2Rpdj4NCi0gKg0KLSAqIFNlZSB7QGxpbmsgbmdTYW5pdGl6ZS4kc2FuaXRpemUgYCRzYW5pdGl6ZWB9IGZvciB1c2FnZS4NCi0gKi8NCi0NCi0vKg0KLSAqIEhUTUwgUGFyc2VyIEJ5IE1pc2tvIEhldmVyeSAobWlza29AaGV2ZXJ5LmNvbSkNCi0gKiBiYXNlZCBvbjogIEhUTUwgUGFyc2VyIEJ5IEpvaG4gUmVzaWcgKGVqb2huLm9yZykNCi0gKiBPcmlnaW5hbCBjb2RlIGJ5IEVyaWsgQXJ2aWRzc29uLCBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlDQotICogaHR0cDovL2VyaWsuZWFlLm5ldC9zaW1wbGVodG1scGFyc2VyL3NpbXBsZWh0bWxwYXJzZXIuanMNCi0gKg0KLSAqIC8vIFVzZSBsaWtlIHNvOg0KLSAqIGh0bWxQYXJzZXIoaHRtbFN0cmluZywgew0KLSAqICAgICBzdGFydDogZnVuY3Rpb24odGFnLCBhdHRycywgdW5hcnkpIHt9LA0KLSAqICAgICBlbmQ6IGZ1bmN0aW9uKHRhZykge30sDQotICogICAgIGNoYXJzOiBmdW5jdGlvbih0ZXh0KSB7fSwNCi0gKiAgICAgY29tbWVudDogZnVuY3Rpb24odGV4dCkge30NCi0gKiB9KTsNCi0gKg0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBzZXJ2aWNlDQotICogQG5hbWUgJHNhbml0aXplDQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqICAgVGhlIGlucHV0IGlzIHNhbml0aXplZCBieSBwYXJzaW5nIHRoZSBIVE1MIGludG8gdG9rZW5zLiBBbGwgc2FmZSB0b2tlbnMgKGZyb20gYSB3aGl0ZWxpc3QpIGFyZQ0KLSAqICAgdGhlbiBzZXJpYWxpemVkIGJhY2sgdG8gcHJvcGVybHkgZXNjYXBlZCBodG1sIHN0cmluZy4gVGhpcyBtZWFucyB0aGF0IG5vIHVuc2FmZSBpbnB1dCBjYW4gbWFrZQ0KLSAqICAgaXQgaW50byB0aGUgcmV0dXJuZWQgc3RyaW5nLCBob3dldmVyLCBzaW5jZSBvdXIgcGFyc2VyIGlzIG1vcmUgc3RyaWN0IHRoYW4gYSB0eXBpY2FsIGJyb3dzZXINCi0gKiAgIHBhcnNlciwgaXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgb2JzY3VyZSBpbnB1dCwgd2hpY2ggd291bGQgYmUgcmVjb2duaXplZCBhcyB2YWxpZCBIVE1MIGJ5IGENCi0gKiAgIGJyb3dzZXIsIHdvbid0IG1ha2UgaXQgdGhyb3VnaCB0aGUgc2FuaXRpemVyLiBUaGUgaW5wdXQgbWF5IGFsc28gY29udGFpbiBTVkcgbWFya3VwLg0KLSAqICAgVGhlIHdoaXRlbGlzdCBpcyBjb25maWd1cmVkIHVzaW5nIHRoZSBmdW5jdGlvbnMgYGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0YCBhbmQNCi0gKiAgIGBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3RgIG9mIHtAbGluayBuZy4kY29tcGlsZVByb3ZpZGVyIGAkY29tcGlsZVByb3ZpZGVyYH0uDQotICoNCi0gKiBAcGFyYW0ge3N0cmluZ30gaHRtbCBIVE1MIGlucHV0Lg0KLSAqIEByZXR1cm5zIHtzdHJpbmd9IFNhbml0aXplZCBIVE1MLg0KLSAqDQotICogQGV4YW1wbGUNCi0gICA8ZXhhbXBsZSBtb2R1bGU9InNhbml0aXplRXhhbXBsZSIgZGVwcz0iYW5ndWxhci1zYW5pdGl6ZS5qcyI+DQotICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICA8c2NyaXB0Pg0KLSAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdzYW5pdGl6ZUV4YW1wbGUnLCBbJ25nU2FuaXRpemUnXSkNCi0gICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRzY2UnLCBmdW5jdGlvbigkc2NvcGUsICRzY2UpIHsNCi0gICAgICAgICAgICAgJHNjb3BlLnNuaXBwZXQgPQ0KLSAgICAgICAgICAgICAgICc8cCBzdHlsZT0iY29sb3I6Ymx1ZSI+YW4gaHRtbFxuJyArDQotICAgICAgICAgICAgICAgJzxlbSBvbm1vdXNlb3Zlcj0idGhpcy50ZXh0Q29udGVudD1cJ1BXTjNEIVwnIj5jbGljayBoZXJlPC9lbT5cbicgKw0KLSAgICAgICAgICAgICAgICdzbmlwcGV0PC9wPic7DQotICAgICAgICAgICAgICRzY29wZS5kZWxpYmVyYXRlbHlUcnVzdERhbmdlcm91c1NuaXBwZXQgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAgICByZXR1cm4gJHNjZS50cnVzdEFzSHRtbCgkc2NvcGUuc25pcHBldCk7DQotICAgICAgICAgICAgIH07DQotICAgICAgICAgICB9XSk7DQotICAgICA8L3NjcmlwdD4NCi0gICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAgICAgICAgU25pcHBldDogPHRleHRhcmVhIG5nLW1vZGVsPSJzbmlwcGV0IiBjb2xzPSI2MCIgcm93cz0iMyI+PC90ZXh0YXJlYT4NCi0gICAgICAgPHRhYmxlPg0KLSAgICAgICAgIDx0cj4NCi0gICAgICAgICAgIDx0ZD5EaXJlY3RpdmU8L3RkPg0KLSAgICAgICAgICAgPHRkPkhvdzwvdGQ+DQotICAgICAgICAgICA8dGQ+U291cmNlPC90ZD4NCi0gICAgICAgICAgIDx0ZD5SZW5kZXJlZDwvdGQ+DQotICAgICAgICAgPC90cj4NCi0gICAgICAgICA8dHIgaWQ9ImJpbmQtaHRtbC13aXRoLXNhbml0aXplIj4NCi0gICAgICAgICAgIDx0ZD5uZy1iaW5kLWh0bWw8L3RkPg0KLSAgICAgICAgICAgPHRkPkF1dG9tYXRpY2FsbHkgdXNlcyAkc2FuaXRpemU8L3RkPg0KLSAgICAgICAgICAgPHRkPjxwcmU+Jmx0O2RpdiBuZy1iaW5kLWh0bWw9InNuaXBwZXQiJmd0Ozxici8+Jmx0Oy9kaXYmZ3Q7PC9wcmU+PC90ZD4NCi0gICAgICAgICAgIDx0ZD48ZGl2IG5nLWJpbmQtaHRtbD0ic25pcHBldCI+PC9kaXY+PC90ZD4NCi0gICAgICAgICA8L3RyPg0KLSAgICAgICAgIDx0ciBpZD0iYmluZC1odG1sLXdpdGgtdHJ1c3QiPg0KLSAgICAgICAgICAgPHRkPm5nLWJpbmQtaHRtbDwvdGQ+DQotICAgICAgICAgICA8dGQ+QnlwYXNzICRzYW5pdGl6ZSBieSBleHBsaWNpdGx5IHRydXN0aW5nIHRoZSBkYW5nZXJvdXMgdmFsdWU8L3RkPg0KLSAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgPHByZT4mbHQ7ZGl2IG5nLWJpbmQtaHRtbD0iZGVsaWJlcmF0ZWx5VHJ1c3REYW5nZXJvdXNTbmlwcGV0KCkiJmd0Ow0KLSZsdDsvZGl2Jmd0OzwvcHJlPg0KLSAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgIDx0ZD48ZGl2IG5nLWJpbmQtaHRtbD0iZGVsaWJlcmF0ZWx5VHJ1c3REYW5nZXJvdXNTbmlwcGV0KCkiPjwvZGl2PjwvdGQ+DQotICAgICAgICAgPC90cj4NCi0gICAgICAgICA8dHIgaWQ9ImJpbmQtZGVmYXVsdCI+DQotICAgICAgICAgICA8dGQ+bmctYmluZDwvdGQ+DQotICAgICAgICAgICA8dGQ+QXV0b21hdGljYWxseSBlc2NhcGVzPC90ZD4NCi0gICAgICAgICAgIDx0ZD48cHJlPiZsdDtkaXYgbmctYmluZD0ic25pcHBldCImZ3Q7PGJyLz4mbHQ7L2RpdiZndDs8L3ByZT48L3RkPg0KLSAgICAgICAgICAgPHRkPjxkaXYgbmctYmluZD0ic25pcHBldCI+PC9kaXY+PC90ZD4NCi0gICAgICAgICA8L3RyPg0KLSAgICAgICA8L3RhYmxlPg0KLSAgICAgICA8L2Rpdj4NCi0gICA8L2ZpbGU+DQotICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICBpdCgnc2hvdWxkIHNhbml0aXplIHRoZSBodG1sIHNuaXBwZXQgYnkgZGVmYXVsdCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWh0bWwtd2l0aC1zYW5pdGl6ZSBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLg0KLSAgICAgICAgIHRvQmUoJzxwPmFuIGh0bWxcbjxlbT5jbGljayBoZXJlPC9lbT5cbnNuaXBwZXQ8L3A+Jyk7DQotICAgICB9KTsNCi0NCi0gICAgIGl0KCdzaG91bGQgaW5saW5lIHJhdyBzbmlwcGV0IGlmIGJvdW5kIHRvIGEgdHJ1c3RlZCB2YWx1ZScsIGZ1bmN0aW9uKCkgew0KLSAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWh0bWwtd2l0aC10cnVzdCBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLg0KLSAgICAgICAgIHRvQmUoIjxwIHN0eWxlPVwiY29sb3I6Ymx1ZVwiPmFuIGh0bWxcbiIgKw0KLSAgICAgICAgICAgICAgIjxlbSBvbm1vdXNlb3Zlcj1cInRoaXMudGV4dENvbnRlbnQ9J1BXTjNEISdcIj5jbGljayBoZXJlPC9lbT5cbiIgKw0KLSAgICAgICAgICAgICAgInNuaXBwZXQ8L3A+Iik7DQotICAgICB9KTsNCi0NCi0gICAgIGl0KCdzaG91bGQgZXNjYXBlIHNuaXBwZXQgd2l0aG91dCBhbnkgZmlsdGVyJywgZnVuY3Rpb24oKSB7DQotICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnI2JpbmQtZGVmYXVsdCBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLg0KLSAgICAgICAgIHRvQmUoIiZsdDtwIHN0eWxlPVwiY29sb3I6Ymx1ZVwiJmd0O2FuIGh0bWxcbiIgKw0KLSAgICAgICAgICAgICAgIiZsdDtlbSBvbm1vdXNlb3Zlcj1cInRoaXMudGV4dENvbnRlbnQ9J1BXTjNEISdcIiZndDtjbGljayBoZXJlJmx0Oy9lbSZndDtcbiIgKw0KLSAgICAgICAgICAgICAgInNuaXBwZXQmbHQ7L3AmZ3Q7Iik7DQotICAgICB9KTsNCi0NCi0gICAgIGl0KCdzaG91bGQgdXBkYXRlJywgZnVuY3Rpb24oKSB7DQotICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3NuaXBwZXQnKSkuY2xlYXIoKTsNCi0gICAgICAgZWxlbWVudChieS5tb2RlbCgnc25pcHBldCcpKS5zZW5kS2V5cygnbmV3IDxiIG9uY2xpY2s9ImFsZXJ0KDEpIj50ZXh0PC9iPicpOw0KLSAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWh0bWwtd2l0aC1zYW5pdGl6ZSBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLg0KLSAgICAgICAgIHRvQmUoJ25ldyA8Yj50ZXh0PC9iPicpOw0KLSAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWh0bWwtd2l0aC10cnVzdCBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLnRvQmUoDQotICAgICAgICAgJ25ldyA8YiBvbmNsaWNrPSJhbGVydCgxKSI+dGV4dDwvYj4nKTsNCi0gICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcjYmluZC1kZWZhdWx0IGRpdicpKS5nZXRJbm5lckh0bWwoKSkudG9CZSgNCi0gICAgICAgICAibmV3ICZsdDtiIG9uY2xpY2s9XCJhbGVydCgxKVwiJmd0O3RleHQmbHQ7L2ImZ3Q7Iik7DQotICAgICB9KTsNCi0gICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLWZ1bmN0aW9uICRTYW5pdGl6ZVByb3ZpZGVyKCkgew0KLSAgdGhpcy4kZ2V0ID0gWyckJHNhbml0aXplVXJpJywgZnVuY3Rpb24oJCRzYW5pdGl6ZVVyaSkgew0KLSAgICByZXR1cm4gZnVuY3Rpb24oaHRtbCkgew0KLSAgICAgIHZhciBidWYgPSBbXTsNCi0gICAgICBodG1sUGFyc2VyKGh0bWwsIGh0bWxTYW5pdGl6ZVdyaXRlcihidWYsIGZ1bmN0aW9uKHVyaSwgaXNJbWFnZSkgew0KLSAgICAgICAgcmV0dXJuICEvXnVuc2FmZS8udGVzdCgkJHNhbml0aXplVXJpKHVyaSwgaXNJbWFnZSkpOw0KLSAgICAgIH0pKTsNCi0gICAgICByZXR1cm4gYnVmLmpvaW4oJycpOw0KLSAgICB9Ow0KLSAgfV07DQotfQ0KLQ0KLWZ1bmN0aW9uIHNhbml0aXplVGV4dChjaGFycykgew0KLSAgdmFyIGJ1ZiA9IFtdOw0KLSAgdmFyIHdyaXRlciA9IGh0bWxTYW5pdGl6ZVdyaXRlcihidWYsIGFuZ3VsYXIubm9vcCk7DQotICB3cml0ZXIuY2hhcnMoY2hhcnMpOw0KLSAgcmV0dXJuIGJ1Zi5qb2luKCcnKTsNCi19DQotDQotDQotLy8gUmVndWxhciBFeHByZXNzaW9ucyBmb3IgcGFyc2luZyB0YWdzIGFuZCBhdHRyaWJ1dGVzDQotdmFyIFNUQVJUX1RBR19SRUdFWFAgPQ0KLSAgICAgICAvXjwoKD86W2EtekEtWl0pW1x3Oi1dKikoKD86XHMrW1x3Oi1dKyg/OlxzKj1ccyooPzooPzoiW14iXSoiKXwoPzonW14nXSonKXxbXj5cc10rKSk/KSopXHMqKFwvPylccyooPj8pLywNCi0gIEVORF9UQUdfUkVHRVhQID0gL148XC9ccyooW1x3Oi1dKylbXj5dKj4vLA0KLSAgQVRUUl9SRUdFWFAgPSAvKFtcdzotXSspKD86XHMqPVxzKig/Oig/OiIoKD86W14iXSkqKSIpfCg/OicoKD86W14nXSkqKScpfChbXj5cc10rKSkpPy9nLA0KLSAgQkVHSU5fVEFHX1JFR0VYUCA9IC9ePC8sDQotICBCRUdJTkdfRU5EX1RBR0VfUkVHRVhQID0gL148XC8vLA0KLSAgQ09NTUVOVF9SRUdFWFAgPSAvPCEtLSguKj8pLS0+L2csDQotICBET0NUWVBFX1JFR0VYUCA9IC88IURPQ1RZUEUoW14+XSo/KT4vaSwNCi0gIENEQVRBX1JFR0VYUCA9IC88IVxbQ0RBVEFcWyguKj8pXV0+L2csDQotICBTVVJST0dBVEVfUEFJUl9SRUdFWFAgPSAvW1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdL2csDQotICAvLyBNYXRjaCBldmVyeXRoaW5nIG91dHNpZGUgb2Ygbm9ybWFsIGNoYXJzIGFuZCAiIChxdW90ZSBjaGFyYWN0ZXIpDQotICBOT05fQUxQSEFOVU1FUklDX1JFR0VYUCA9IC8oW15cIy1+fCB8IV0pL2c7DQotDQotDQotLy8gR29vZCBzb3VyY2Ugb2YgaW5mbyBhYm91dCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcw0KLS8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCNzZW1hbnRpY3MNCi0vLyBodHRwOi8vc2ltb24uaHRtbDUub3JnL2h0bWwtZWxlbWVudHMNCi0NCi0vLyBTYWZlIFZvaWQgRWxlbWVudHMgLSBIVE1MNQ0KLS8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCN2b2lkLWVsZW1lbnRzDQotdmFyIHZvaWRFbGVtZW50cyA9IG1ha2VNYXAoImFyZWEsYnIsY29sLGhyLGltZyx3YnIiKTsNCi0NCi0vLyBFbGVtZW50cyB0aGF0IHlvdSBjYW4sIGludGVudGlvbmFsbHksIGxlYXZlIG9wZW4gKGFuZCB3aGljaCBjbG9zZSB0aGVtc2VsdmVzKQ0KLS8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCNvcHRpb25hbC10YWdzDQotdmFyIG9wdGlvbmFsRW5kVGFnQmxvY2tFbGVtZW50cyA9IG1ha2VNYXAoImNvbGdyb3VwLGRkLGR0LGxpLHAsdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsdHIiKSwNCi0gICAgb3B0aW9uYWxFbmRUYWdJbmxpbmVFbGVtZW50cyA9IG1ha2VNYXAoInJwLHJ0IiksDQotICAgIG9wdGlvbmFsRW5kVGFnRWxlbWVudHMgPSBhbmd1bGFyLmV4dGVuZCh7fSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsRW5kVGFnSW5saW5lRWxlbWVudHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbEVuZFRhZ0Jsb2NrRWxlbWVudHMpOw0KLQ0KLS8vIFNhZmUgQmxvY2sgRWxlbWVudHMgLSBIVE1MNQ0KLXZhciBibG9ja0VsZW1lbnRzID0gYW5ndWxhci5leHRlbmQoe30sIG9wdGlvbmFsRW5kVGFnQmxvY2tFbGVtZW50cywgbWFrZU1hcCgiYWRkcmVzcyxhcnRpY2xlLCIgKw0KLSAgICAgICAgImFzaWRlLGJsb2NrcXVvdGUsY2FwdGlvbixjZW50ZXIsZGVsLGRpcixkaXYsZGwsZmlndXJlLGZpZ2NhcHRpb24sZm9vdGVyLGgxLGgyLGgzLGg0LGg1LCIgKw0KLSAgICAgICAgImg2LGhlYWRlcixoZ3JvdXAsaHIsaW5zLG1hcCxtZW51LG5hdixvbCxwcmUsc2NyaXB0LHNlY3Rpb24sdGFibGUsdWwiKSk7DQotDQotLy8gSW5saW5lIEVsZW1lbnRzIC0gSFRNTDUNCi12YXIgaW5saW5lRWxlbWVudHMgPSBhbmd1bGFyLmV4dGVuZCh7fSwgb3B0aW9uYWxFbmRUYWdJbmxpbmVFbGVtZW50cywgbWFrZU1hcCgiYSxhYmJyLGFjcm9ueW0sYiwiICsNCi0gICAgICAgICJiZGksYmRvLGJpZyxicixjaXRlLGNvZGUsZGVsLGRmbixlbSxmb250LGksaW1nLGlucyxrYmQsbGFiZWwsbWFwLG1hcmsscSxydWJ5LHJwLHJ0LHMsIiArDQotICAgICAgICAic2FtcCxzbWFsbCxzcGFuLHN0cmlrZSxzdHJvbmcsc3ViLHN1cCx0aW1lLHR0LHUsdmFyIikpOw0KLQ0KLS8vIFNWRyBFbGVtZW50cw0KLS8vIGh0dHBzOi8vd2lraS53aGF0d2cub3JnL3dpa2kvU2FuaXRpemF0aW9uX3J1bGVzI3N2Z19FbGVtZW50cw0KLXZhciBzdmdFbGVtZW50cyA9IG1ha2VNYXAoImFuaW1hdGUsYW5pbWF0ZUNvbG9yLGFuaW1hdGVNb3Rpb24sYW5pbWF0ZVRyYW5zZm9ybSxjaXJjbGUsZGVmcywiICsNCi0gICAgICAgICJkZXNjLGVsbGlwc2UsZm9udC1mYWNlLGZvbnQtZmFjZS1uYW1lLGZvbnQtZmFjZS1zcmMsZyxnbHlwaCxoa2VybixpbWFnZSxsaW5lYXJHcmFkaWVudCwiICsNCi0gICAgICAgICJsaW5lLG1hcmtlcixtZXRhZGF0YSxtaXNzaW5nLWdseXBoLG1wYXRoLHBhdGgscG9seWdvbixwb2x5bGluZSxyYWRpYWxHcmFkaWVudCxyZWN0LHNldCwiICsNCi0gICAgICAgICJzdG9wLHN2Zyxzd2l0Y2gsdGV4dCx0aXRsZSx0c3Bhbix1c2UiKTsNCi0NCi0vLyBTcGVjaWFsIEVsZW1lbnRzIChjYW4gY29udGFpbiBhbnl0aGluZykNCi12YXIgc3BlY2lhbEVsZW1lbnRzID0gbWFrZU1hcCgic2NyaXB0LHN0eWxlIik7DQotDQotdmFyIHZhbGlkRWxlbWVudHMgPSBhbmd1bGFyLmV4dGVuZCh7fSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRFbGVtZW50cywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrRWxlbWVudHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVFbGVtZW50cywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsRW5kVGFnRWxlbWVudHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmdFbGVtZW50cyk7DQotDQotLy9BdHRyaWJ1dGVzIHRoYXQgaGF2ZSBocmVmIGFuZCBoZW5jZSBuZWVkIHRvIGJlIHNhbml0aXplZA0KLXZhciB1cmlBdHRycyA9IG1ha2VNYXAoImJhY2tncm91bmQsY2l0ZSxocmVmLGxvbmdkZXNjLHNyYyx1c2VtYXAseGxpbms6aHJlZiIpOw0KLQ0KLXZhciBodG1sQXR0cnMgPSBtYWtlTWFwKCdhYmJyLGFsaWduLGFsdCxheGlzLGJnY29sb3IsYm9yZGVyLGNlbGxwYWRkaW5nLGNlbGxzcGFjaW5nLGNsYXNzLGNsZWFyLCcgKw0KLSAgICAnY29sb3IsY29scyxjb2xzcGFuLGNvbXBhY3QsY29vcmRzLGRpcixmYWNlLGhlYWRlcnMsaGVpZ2h0LGhyZWZsYW5nLGhzcGFjZSwnICsNCi0gICAgJ2lzbWFwLGxhbmcsbGFuZ3VhZ2Usbm9ocmVmLG5vd3JhcCxyZWwscmV2LHJvd3Mscm93c3BhbixydWxlcywnICsNCi0gICAgJ3Njb3BlLHNjcm9sbGluZyxzaGFwZSxzaXplLHNwYW4sc3RhcnQsc3VtbWFyeSx0YXJnZXQsdGl0bGUsdHlwZSwnICsNCi0gICAgJ3ZhbGlnbix2YWx1ZSx2c3BhY2Usd2lkdGgnKTsNCi0NCi0vLyBTVkcgYXR0cmlidXRlcyAod2l0aG91dCAiaWQiIGFuZCAibmFtZSIgYXR0cmlidXRlcykNCi0vLyBodHRwczovL3dpa2kud2hhdHdnLm9yZy93aWtpL1Nhbml0aXphdGlvbl9ydWxlcyNzdmdfQXR0cmlidXRlcw0KLXZhciBzdmdBdHRycyA9IG1ha2VNYXAoJ2FjY2VudC1oZWlnaHQsYWNjdW11bGF0ZSxhZGRpdGl2ZSxhbHBoYWJldGljLGFyYWJpYy1mb3JtLGFzY2VudCwnICsNCi0gICAgJ2F0dHJpYnV0ZU5hbWUsYXR0cmlidXRlVHlwZSxiYXNlUHJvZmlsZSxiYm94LGJlZ2luLGJ5LGNhbGNNb2RlLGNhcC1oZWlnaHQsY2xhc3MsY29sb3IsJyArDQotICAgICdjb2xvci1yZW5kZXJpbmcsY29udGVudCxjeCxjeSxkLGR4LGR5LGRlc2NlbnQsZGlzcGxheSxkdXIsZW5kLGZpbGwsZmlsbC1ydWxlLGZvbnQtZmFtaWx5LCcgKw0KLSAgICAnZm9udC1zaXplLGZvbnQtc3RyZXRjaCxmb250LXN0eWxlLGZvbnQtdmFyaWFudCxmb250LXdlaWdodCxmcm9tLGZ4LGZ5LGcxLGcyLGdseXBoLW5hbWUsJyArDQotICAgICdncmFkaWVudFVuaXRzLGhhbmdpbmcsaGVpZ2h0LGhvcml6LWFkdi14LGhvcml6LW9yaWdpbi14LGlkZW9ncmFwaGljLGssa2V5UG9pbnRzLCcgKw0KLSAgICAna2V5U3BsaW5lcyxrZXlUaW1lcyxsYW5nLG1hcmtlci1lbmQsbWFya2VyLW1pZCxtYXJrZXItc3RhcnQsbWFya2VySGVpZ2h0LG1hcmtlclVuaXRzLCcgKw0KLSAgICAnbWFya2VyV2lkdGgsbWF0aGVtYXRpY2FsLG1heCxtaW4sb2Zmc2V0LG9wYWNpdHksb3JpZW50LG9yaWdpbixvdmVybGluZS1wb3NpdGlvbiwnICsNCi0gICAgJ292ZXJsaW5lLXRoaWNrbmVzcyxwYW5vc2UtMSxwYXRoLHBhdGhMZW5ndGgscG9pbnRzLHByZXNlcnZlQXNwZWN0UmF0aW8scixyZWZYLHJlZlksJyArDQotICAgICdyZXBlYXRDb3VudCxyZXBlYXREdXIscmVxdWlyZWRFeHRlbnNpb25zLHJlcXVpcmVkRmVhdHVyZXMscmVzdGFydCxyb3RhdGUscngscnksc2xvcGUsc3RlbWgsJyArDQotICAgICdzdGVtdixzdG9wLWNvbG9yLHN0b3Atb3BhY2l0eSxzdHJpa2V0aHJvdWdoLXBvc2l0aW9uLHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzLHN0cm9rZSwnICsNCi0gICAgJ3N0cm9rZS1kYXNoYXJyYXksc3Ryb2tlLWRhc2hvZmZzZXQsc3Ryb2tlLWxpbmVjYXAsc3Ryb2tlLWxpbmVqb2luLHN0cm9rZS1taXRlcmxpbWl0LCcgKw0KLSAgICAnc3Ryb2tlLW9wYWNpdHksc3Ryb2tlLXdpZHRoLHN5c3RlbUxhbmd1YWdlLHRhcmdldCx0ZXh0LWFuY2hvcix0byx0cmFuc2Zvcm0sdHlwZSx1MSx1MiwnICsNCi0gICAgJ3VuZGVybGluZS1wb3NpdGlvbix1bmRlcmxpbmUtdGhpY2tuZXNzLHVuaWNvZGUsdW5pY29kZS1yYW5nZSx1bml0cy1wZXItZW0sdmFsdWVzLHZlcnNpb24sJyArDQotICAgICd2aWV3Qm94LHZpc2liaWxpdHksd2lkdGgsd2lkdGhzLHgseC1oZWlnaHQseDEseDIseGxpbms6YWN0dWF0ZSx4bGluazphcmNyb2xlLHhsaW5rOnJvbGUsJyArDQotICAgICd4bGluazpzaG93LHhsaW5rOnRpdGxlLHhsaW5rOnR5cGUseG1sOmJhc2UseG1sOmxhbmcseG1sOnNwYWNlLHhtbG5zLHhtbG5zOnhsaW5rLHkseTEseTIsJyArDQotICAgICd6b29tQW5kUGFuJyk7DQotDQotdmFyIHZhbGlkQXR0cnMgPSBhbmd1bGFyLmV4dGVuZCh7fSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaUF0dHJzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZnQXR0cnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sQXR0cnMpOw0KLQ0KLWZ1bmN0aW9uIG1ha2VNYXAoc3RyKSB7DQotICB2YXIgb2JqID0ge30sIGl0ZW1zID0gc3RyLnNwbGl0KCcsJyksIGk7DQotICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIG9ialtpdGVtc1tpXV0gPSB0cnVlOw0KLSAgcmV0dXJuIG9iajsNCi19DQotDQotDQotLyoqDQotICogQGV4YW1wbGUNCi0gKiBodG1sUGFyc2VyKGh0bWxTdHJpbmcsIHsNCi0gKiAgICAgc3RhcnQ6IGZ1bmN0aW9uKHRhZywgYXR0cnMsIHVuYXJ5KSB7fSwNCi0gKiAgICAgZW5kOiBmdW5jdGlvbih0YWcpIHt9LA0KLSAqICAgICBjaGFyczogZnVuY3Rpb24odGV4dCkge30sDQotICogICAgIGNvbW1lbnQ6IGZ1bmN0aW9uKHRleHQpIHt9DQotICogfSk7DQotICoNCi0gKiBAcGFyYW0ge3N0cmluZ30gaHRtbCBzdHJpbmcNCi0gKiBAcGFyYW0ge29iamVjdH0gaGFuZGxlcg0KLSAqLw0KLWZ1bmN0aW9uIGh0bWxQYXJzZXIoaHRtbCwgaGFuZGxlcikgew0KLSAgaWYgKHR5cGVvZiBodG1sICE9PSAnc3RyaW5nJykgew0KLSAgICBpZiAoaHRtbCA9PT0gbnVsbCB8fCB0eXBlb2YgaHRtbCA9PT0gJ3VuZGVmaW5lZCcpIHsNCi0gICAgICBodG1sID0gJyc7DQotICAgIH0gZWxzZSB7DQotICAgICAgaHRtbCA9ICcnICsgaHRtbDsNCi0gICAgfQ0KLSAgfQ0KLSAgdmFyIGluZGV4LCBjaGFycywgbWF0Y2gsIHN0YWNrID0gW10sIGxhc3QgPSBodG1sLCB0ZXh0Ow0KLSAgc3RhY2subGFzdCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3RhY2tbIHN0YWNrLmxlbmd0aCAtIDEgXTsgfTsNCi0NCi0gIHdoaWxlIChodG1sKSB7DQotICAgIHRleHQgPSAnJzsNCi0gICAgY2hhcnMgPSB0cnVlOw0KLQ0KLSAgICAvLyBNYWtlIHN1cmUgd2UncmUgbm90IGluIGEgc2NyaXB0IG9yIHN0eWxlIGVsZW1lbnQNCi0gICAgaWYgKCFzdGFjay5sYXN0KCkgfHwgIXNwZWNpYWxFbGVtZW50c1sgc3RhY2subGFzdCgpIF0pIHsNCi0NCi0gICAgICAvLyBDb21tZW50DQotICAgICAgaWYgKGh0bWwuaW5kZXhPZigiPCEtLSIpID09PSAwKSB7DQotICAgICAgICAvLyBjb21tZW50cyBjb250YWluaW5nIC0tIGFyZSBub3QgYWxsb3dlZCB1bmxlc3MgdGhleSB0ZXJtaW5hdGUgdGhlIGNvbW1lbnQNCi0gICAgICAgIGluZGV4ID0gaHRtbC5pbmRleE9mKCItLSIsIDQpOw0KLQ0KLSAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaHRtbC5sYXN0SW5kZXhPZigiLS0+IiwgaW5kZXgpID09PSBpbmRleCkgew0KLSAgICAgICAgICBpZiAoaGFuZGxlci5jb21tZW50KSBoYW5kbGVyLmNvbW1lbnQoaHRtbC5zdWJzdHJpbmcoNCwgaW5kZXgpKTsNCi0gICAgICAgICAgaHRtbCA9IGh0bWwuc3Vic3RyaW5nKGluZGV4ICsgMyk7DQotICAgICAgICAgIGNoYXJzID0gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgLy8gRE9DVFlQRQ0KLSAgICAgIH0gZWxzZSBpZiAoRE9DVFlQRV9SRUdFWFAudGVzdChodG1sKSkgew0KLSAgICAgICAgbWF0Y2ggPSBodG1sLm1hdGNoKERPQ1RZUEVfUkVHRVhQKTsNCi0NCi0gICAgICAgIGlmIChtYXRjaCkgew0KLSAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKG1hdGNoWzBdLCAnJyk7DQotICAgICAgICAgIGNoYXJzID0gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgLy8gZW5kIHRhZw0KLSAgICAgIH0gZWxzZSBpZiAoQkVHSU5HX0VORF9UQUdFX1JFR0VYUC50ZXN0KGh0bWwpKSB7DQotICAgICAgICBtYXRjaCA9IGh0bWwubWF0Y2goRU5EX1RBR19SRUdFWFApOw0KLQ0KLSAgICAgICAgaWYgKG1hdGNoKSB7DQotICAgICAgICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZyhtYXRjaFswXS5sZW5ndGgpOw0KLSAgICAgICAgICBtYXRjaFswXS5yZXBsYWNlKEVORF9UQUdfUkVHRVhQLCBwYXJzZUVuZFRhZyk7DQotICAgICAgICAgIGNoYXJzID0gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgLy8gc3RhcnQgdGFnDQotICAgICAgfSBlbHNlIGlmIChCRUdJTl9UQUdfUkVHRVhQLnRlc3QoaHRtbCkpIHsNCi0gICAgICAgIG1hdGNoID0gaHRtbC5tYXRjaChTVEFSVF9UQUdfUkVHRVhQKTsNCi0NCi0gICAgICAgIGlmIChtYXRjaCkgew0KLSAgICAgICAgICAvLyBXZSBvbmx5IGhhdmUgYSB2YWxpZCBzdGFydC10YWcgaWYgdGhlcmUgaXMgYSAnPicuDQotICAgICAgICAgIGlmIChtYXRjaFs0XSkgew0KLSAgICAgICAgICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZyhtYXRjaFswXS5sZW5ndGgpOw0KLSAgICAgICAgICAgIG1hdGNoWzBdLnJlcGxhY2UoU1RBUlRfVEFHX1JFR0VYUCwgcGFyc2VTdGFydFRhZyk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgY2hhcnMgPSBmYWxzZTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIC8vIG5vIGVuZGluZyB0YWcgZm91bmQgLS0tIHRoaXMgcGllY2Ugc2hvdWxkIGJlIGVuY29kZWQgYXMgYW4gZW50aXR5Lg0KLSAgICAgICAgICB0ZXh0ICs9ICc8JzsNCi0gICAgICAgICAgaHRtbCA9IGh0bWwuc3Vic3RyaW5nKDEpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICBpZiAoY2hhcnMpIHsNCi0gICAgICAgIGluZGV4ID0gaHRtbC5pbmRleE9mKCI8Iik7DQotDQotICAgICAgICB0ZXh0ICs9IGluZGV4IDwgMCA/IGh0bWwgOiBodG1sLnN1YnN0cmluZygwLCBpbmRleCk7DQotICAgICAgICBodG1sID0gaW5kZXggPCAwID8gIiIgOiBodG1sLnN1YnN0cmluZyhpbmRleCk7DQotDQotICAgICAgICBpZiAoaGFuZGxlci5jaGFycykgaGFuZGxlci5jaGFycyhkZWNvZGVFbnRpdGllcyh0ZXh0KSk7DQotICAgICAgfQ0KLQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UobmV3IFJlZ0V4cCgiKC4qKTxcXHMqXFwvXFxzKiIgKyBzdGFjay5sYXN0KCkgKyAiW14+XSo+IiwgJ2knKSwNCi0gICAgICAgIGZ1bmN0aW9uKGFsbCwgdGV4dCkgew0KLSAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKENPTU1FTlRfUkVHRVhQLCAiJDEiKS5yZXBsYWNlKENEQVRBX1JFR0VYUCwgIiQxIik7DQotDQotICAgICAgICAgIGlmIChoYW5kbGVyLmNoYXJzKSBoYW5kbGVyLmNoYXJzKGRlY29kZUVudGl0aWVzKHRleHQpKTsNCi0NCi0gICAgICAgICAgcmV0dXJuICIiOw0KLSAgICAgIH0pOw0KLQ0KLSAgICAgIHBhcnNlRW5kVGFnKCIiLCBzdGFjay5sYXN0KCkpOw0KLSAgICB9DQotDQotICAgIGlmIChodG1sID09IGxhc3QpIHsNCi0gICAgICB0aHJvdyAkc2FuaXRpemVNaW5FcnIoJ2JhZHBhcnNlJywgIlRoZSBzYW5pdGl6ZXIgd2FzIHVuYWJsZSB0byBwYXJzZSB0aGUgZm9sbG93aW5nIGJsb2NrICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2YgaHRtbDogezB9IiwgaHRtbCk7DQotICAgIH0NCi0gICAgbGFzdCA9IGh0bWw7DQotICB9DQotDQotICAvLyBDbGVhbiB1cCBhbnkgcmVtYWluaW5nIHRhZ3MNCi0gIHBhcnNlRW5kVGFnKCk7DQotDQotICBmdW5jdGlvbiBwYXJzZVN0YXJ0VGFnKHRhZywgdGFnTmFtZSwgcmVzdCwgdW5hcnkpIHsNCi0gICAgdGFnTmFtZSA9IGFuZ3VsYXIubG93ZXJjYXNlKHRhZ05hbWUpOw0KLSAgICBpZiAoYmxvY2tFbGVtZW50c1sgdGFnTmFtZSBdKSB7DQotICAgICAgd2hpbGUgKHN0YWNrLmxhc3QoKSAmJiBpbmxpbmVFbGVtZW50c1sgc3RhY2subGFzdCgpIF0pIHsNCi0gICAgICAgIHBhcnNlRW5kVGFnKCIiLCBzdGFjay5sYXN0KCkpOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZiAob3B0aW9uYWxFbmRUYWdFbGVtZW50c1sgdGFnTmFtZSBdICYmIHN0YWNrLmxhc3QoKSA9PSB0YWdOYW1lKSB7DQotICAgICAgcGFyc2VFbmRUYWcoIiIsIHRhZ05hbWUpOw0KLSAgICB9DQotDQotICAgIHVuYXJ5ID0gdm9pZEVsZW1lbnRzWyB0YWdOYW1lIF0gfHwgISF1bmFyeTsNCi0NCi0gICAgaWYgKCF1bmFyeSkNCi0gICAgICBzdGFjay5wdXNoKHRhZ05hbWUpOw0KLQ0KLSAgICB2YXIgYXR0cnMgPSB7fTsNCi0NCi0gICAgcmVzdC5yZXBsYWNlKEFUVFJfUkVHRVhQLA0KLSAgICAgIGZ1bmN0aW9uKG1hdGNoLCBuYW1lLCBkb3VibGVRdW90ZWRWYWx1ZSwgc2luZ2xlUXVvdGVkVmFsdWUsIHVucXVvdGVkVmFsdWUpIHsNCi0gICAgICAgIHZhciB2YWx1ZSA9IGRvdWJsZVF1b3RlZFZhbHVlDQotICAgICAgICAgIHx8IHNpbmdsZVF1b3RlZFZhbHVlDQotICAgICAgICAgIHx8IHVucXVvdGVkVmFsdWUNCi0gICAgICAgICAgfHwgJyc7DQotDQotICAgICAgICBhdHRyc1tuYW1lXSA9IGRlY29kZUVudGl0aWVzKHZhbHVlKTsNCi0gICAgfSk7DQotICAgIGlmIChoYW5kbGVyLnN0YXJ0KSBoYW5kbGVyLnN0YXJ0KHRhZ05hbWUsIGF0dHJzLCB1bmFyeSk7DQotICB9DQotDQotICBmdW5jdGlvbiBwYXJzZUVuZFRhZyh0YWcsIHRhZ05hbWUpIHsNCi0gICAgdmFyIHBvcyA9IDAsIGk7DQotICAgIHRhZ05hbWUgPSBhbmd1bGFyLmxvd2VyY2FzZSh0YWdOYW1lKTsNCi0gICAgaWYgKHRhZ05hbWUpDQotICAgICAgLy8gRmluZCB0aGUgY2xvc2VzdCBvcGVuZWQgdGFnIG9mIHRoZSBzYW1lIHR5cGUNCi0gICAgICBmb3IgKHBvcyA9IHN0YWNrLmxlbmd0aCAtIDE7IHBvcyA+PSAwOyBwb3MtLSkNCi0gICAgICAgIGlmIChzdGFja1sgcG9zIF0gPT0gdGFnTmFtZSkNCi0gICAgICAgICAgYnJlYWs7DQotDQotICAgIGlmIChwb3MgPj0gMCkgew0KLSAgICAgIC8vIENsb3NlIGFsbCB0aGUgb3BlbiBlbGVtZW50cywgdXAgdGhlIHN0YWNrDQotICAgICAgZm9yIChpID0gc3RhY2subGVuZ3RoIC0gMTsgaSA+PSBwb3M7IGktLSkNCi0gICAgICAgIGlmIChoYW5kbGVyLmVuZCkgaGFuZGxlci5lbmQoc3RhY2tbIGkgXSk7DQotDQotICAgICAgLy8gUmVtb3ZlIHRoZSBvcGVuIGVsZW1lbnRzIGZyb20gdGhlIHN0YWNrDQotICAgICAgc3RhY2subGVuZ3RoID0gcG9zOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLXZhciBoaWRkZW5QcmU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicHJlIik7DQotdmFyIHNwYWNlUmUgPSAvXihccyopKFtcc1xTXSo/KShccyopJC87DQotLyoqDQotICogZGVjb2RlcyBhbGwgZW50aXRpZXMgaW50byByZWd1bGFyIHN0cmluZw0KLSAqIEBwYXJhbSB2YWx1ZQ0KLSAqIEByZXR1cm5zIHtzdHJpbmd9IEEgc3RyaW5nIHdpdGggZGVjb2RlZCBlbnRpdGllcy4NCi0gKi8NCi1mdW5jdGlvbiBkZWNvZGVFbnRpdGllcyh2YWx1ZSkgew0KLSAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gJyc7IH0NCi0NCi0gIC8vIE5vdGU6IElFOCBkb2VzIG5vdCBwcmVzZXJ2ZSBzcGFjZXMgYXQgdGhlIHN0YXJ0L2VuZCBvZiBpbm5lckhUTUwNCi0gIC8vIHNvIHdlIG11c3QgY2FwdHVyZSB0aGVtIGFuZCByZWF0dGFjaCB0aGVtIGFmdGVyd2FyZA0KLSAgdmFyIHBhcnRzID0gc3BhY2VSZS5leGVjKHZhbHVlKTsNCi0gIHZhciBzcGFjZUJlZm9yZSA9IHBhcnRzWzFdOw0KLSAgdmFyIHNwYWNlQWZ0ZXIgPSBwYXJ0c1szXTsNCi0gIHZhciBjb250ZW50ID0gcGFydHNbMl07DQotICBpZiAoY29udGVudCkgew0KLSAgICBoaWRkZW5QcmUuaW5uZXJIVE1MPWNvbnRlbnQucmVwbGFjZSgvPC9nLCImbHQ7Iik7DQotICAgIC8vIGlubmVyVGV4dCBkZXBlbmRzIG9uIHN0eWxpbmcgYXMgaXQgZG9lc24ndCBkaXNwbGF5IGhpZGRlbiBlbGVtZW50cy4NCi0gICAgLy8gVGhlcmVmb3JlLCBpdCdzIGJldHRlciB0byB1c2UgdGV4dENvbnRlbnQgbm90IHRvIGNhdXNlIHVubmVjZXNzYXJ5DQotICAgIC8vIHJlZmxvd3MuIEhvd2V2ZXIsIElFPDkgZG9uJ3Qgc3VwcG9ydCB0ZXh0Q29udGVudCBzbyB0aGUgaW5uZXJUZXh0DQotICAgIC8vIGZhbGxiYWNrIGlzIG5lY2Vzc2FyeS4NCi0gICAgY29udGVudCA9ICd0ZXh0Q29udGVudCcgaW4gaGlkZGVuUHJlID8NCi0gICAgICBoaWRkZW5QcmUudGV4dENvbnRlbnQgOiBoaWRkZW5QcmUuaW5uZXJUZXh0Ow0KLSAgfQ0KLSAgcmV0dXJuIHNwYWNlQmVmb3JlICsgY29udGVudCArIHNwYWNlQWZ0ZXI7DQotfQ0KLQ0KLS8qKg0KLSAqIEVzY2FwZXMgYWxsIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjaGFyYWN0ZXJzLCBzbyB0aGF0IHRoZQ0KLSAqIHJlc3VsdGluZyBzdHJpbmcgY2FuIGJlIHNhZmVseSBpbnNlcnRlZCBpbnRvIGF0dHJpYnV0ZSBvcg0KLSAqIGVsZW1lbnQgdGV4dC4NCi0gKiBAcGFyYW0gdmFsdWUNCi0gKiBAcmV0dXJucyB7c3RyaW5nfSBlc2NhcGVkIHRleHQNCi0gKi8NCi1mdW5jdGlvbiBlbmNvZGVFbnRpdGllcyh2YWx1ZSkgew0KLSAgcmV0dXJuIHZhbHVlLg0KLSAgICByZXBsYWNlKC8mL2csICcmYW1wOycpLg0KLSAgICByZXBsYWNlKFNVUlJPR0FURV9QQUlSX1JFR0VYUCwgZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICB2YXIgaGkgPSB2YWx1ZS5jaGFyQ29kZUF0KDApOw0KLSAgICAgIHZhciBsb3cgPSB2YWx1ZS5jaGFyQ29kZUF0KDEpOw0KLSAgICAgIHJldHVybiAnJiMnICsgKCgoaGkgLSAweEQ4MDApICogMHg0MDApICsgKGxvdyAtIDB4REMwMCkgKyAweDEwMDAwKSArICc7JzsNCi0gICAgfSkuDQotICAgIHJlcGxhY2UoTk9OX0FMUEhBTlVNRVJJQ19SRUdFWFAsIGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgcmV0dXJuICcmIycgKyB2YWx1ZS5jaGFyQ29kZUF0KDApICsgJzsnOw0KLSAgICB9KS4NCi0gICAgcmVwbGFjZSgvPC9nLCAnJmx0OycpLg0KLSAgICByZXBsYWNlKC8+L2csICcmZ3Q7Jyk7DQotfQ0KLQ0KLS8qKg0KLSAqIGNyZWF0ZSBhbiBIVE1ML1hNTCB3cml0ZXIgd2hpY2ggd3JpdGVzIHRvIGJ1ZmZlcg0KLSAqIEBwYXJhbSB7QXJyYXl9IGJ1ZiB1c2UgYnVmLmphaW4oJycpIHRvIGdldCBvdXQgc2FuaXRpemVkIGh0bWwgc3RyaW5nDQotICogQHJldHVybnMge29iamVjdH0gaW4gdGhlIGZvcm0gb2Ygew0KLSAqICAgICBzdGFydDogZnVuY3Rpb24odGFnLCBhdHRycywgdW5hcnkpIHt9LA0KLSAqICAgICBlbmQ6IGZ1bmN0aW9uKHRhZykge30sDQotICogICAgIGNoYXJzOiBmdW5jdGlvbih0ZXh0KSB7fSwNCi0gKiAgICAgY29tbWVudDogZnVuY3Rpb24odGV4dCkge30NCi0gKiB9DQotICovDQotZnVuY3Rpb24gaHRtbFNhbml0aXplV3JpdGVyKGJ1ZiwgdXJpVmFsaWRhdG9yKSB7DQotICB2YXIgaWdub3JlID0gZmFsc2U7DQotICB2YXIgb3V0ID0gYW5ndWxhci5iaW5kKGJ1ZiwgYnVmLnB1c2gpOw0KLSAgcmV0dXJuIHsNCi0gICAgc3RhcnQ6IGZ1bmN0aW9uKHRhZywgYXR0cnMsIHVuYXJ5KSB7DQotICAgICAgdGFnID0gYW5ndWxhci5sb3dlcmNhc2UodGFnKTsNCi0gICAgICBpZiAoIWlnbm9yZSAmJiBzcGVjaWFsRWxlbWVudHNbdGFnXSkgew0KLSAgICAgICAgaWdub3JlID0gdGFnOw0KLSAgICAgIH0NCi0gICAgICBpZiAoIWlnbm9yZSAmJiB2YWxpZEVsZW1lbnRzW3RhZ10gPT09IHRydWUpIHsNCi0gICAgICAgIG91dCgnPCcpOw0KLSAgICAgICAgb3V0KHRhZyk7DQotICAgICAgICBhbmd1bGFyLmZvckVhY2goYXR0cnMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsNCi0gICAgICAgICAgdmFyIGxrZXk9YW5ndWxhci5sb3dlcmNhc2Uoa2V5KTsNCi0gICAgICAgICAgdmFyIGlzSW1hZ2UgPSAodGFnID09PSAnaW1nJyAmJiBsa2V5ID09PSAnc3JjJykgfHwgKGxrZXkgPT09ICdiYWNrZ3JvdW5kJyk7DQotICAgICAgICAgIGlmICh2YWxpZEF0dHJzW2xrZXldID09PSB0cnVlICYmDQotICAgICAgICAgICAgKHVyaUF0dHJzW2xrZXldICE9PSB0cnVlIHx8IHVyaVZhbGlkYXRvcih2YWx1ZSwgaXNJbWFnZSkpKSB7DQotICAgICAgICAgICAgb3V0KCcgJyk7DQotICAgICAgICAgICAgb3V0KGtleSk7DQotICAgICAgICAgICAgb3V0KCc9IicpOw0KLSAgICAgICAgICAgIG91dChlbmNvZGVFbnRpdGllcyh2YWx1ZSkpOw0KLSAgICAgICAgICAgIG91dCgnIicpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0gICAgICAgIG91dCh1bmFyeSA/ICcvPicgOiAnPicpOw0KLSAgICAgIH0NCi0gICAgfSwNCi0gICAgZW5kOiBmdW5jdGlvbih0YWcpIHsNCi0gICAgICAgIHRhZyA9IGFuZ3VsYXIubG93ZXJjYXNlKHRhZyk7DQotICAgICAgICBpZiAoIWlnbm9yZSAmJiB2YWxpZEVsZW1lbnRzW3RhZ10gPT09IHRydWUpIHsNCi0gICAgICAgICAgb3V0KCc8LycpOw0KLSAgICAgICAgICBvdXQodGFnKTsNCi0gICAgICAgICAgb3V0KCc+Jyk7DQotICAgICAgICB9DQotICAgICAgICBpZiAodGFnID09IGlnbm9yZSkgew0KLSAgICAgICAgICBpZ25vcmUgPSBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICB9LA0KLSAgICBjaGFyczogZnVuY3Rpb24oY2hhcnMpIHsNCi0gICAgICAgIGlmICghaWdub3JlKSB7DQotICAgICAgICAgIG91dChlbmNvZGVFbnRpdGllcyhjaGFycykpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gIH07DQotfQ0KLQ0KLQ0KLS8vIGRlZmluZSBuZ1Nhbml0aXplIG1vZHVsZSBhbmQgcmVnaXN0ZXIgJHNhbml0aXplIHNlcnZpY2UNCi1hbmd1bGFyLm1vZHVsZSgnbmdTYW5pdGl6ZScsIFtdKS5wcm92aWRlcignJHNhbml0aXplJywgJFNhbml0aXplUHJvdmlkZXIpOw0KLQ0KLS8qIGdsb2JhbCBzYW5pdGl6ZVRleHQ6IGZhbHNlICovDQotDQotLyoqDQotICogQG5nZG9jIGZpbHRlcg0KLSAqIEBuYW1lIGxpbmt5DQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEZpbmRzIGxpbmtzIGluIHRleHQgaW5wdXQgYW5kIHR1cm5zIHRoZW0gaW50byBodG1sIGxpbmtzLiBTdXBwb3J0cyBodHRwL2h0dHBzL2Z0cC9tYWlsdG8gYW5kDQotICogcGxhaW4gZW1haWwgYWRkcmVzcyBsaW5rcy4NCi0gKg0KLSAqIFJlcXVpcmVzIHRoZSB7QGxpbmsgbmdTYW5pdGl6ZSBgbmdTYW5pdGl6ZWB9IG1vZHVsZSB0byBiZSBpbnN0YWxsZWQuDQotICoNCi0gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBJbnB1dCB0ZXh0Lg0KLSAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgV2luZG93IChfYmxhbmt8X3NlbGZ8X3BhcmVudHxfdG9wKSBvciBuYW1lZCBmcmFtZSB0byBvcGVuIGxpbmtzIGluLg0KLSAqIEByZXR1cm5zIHtzdHJpbmd9IEh0bWwtbGlua2lmaWVkIHRleHQuDQotICoNCi0gKiBAdXNhZ2UNCi0gICA8c3BhbiBuZy1iaW5kLWh0bWw9Imxpbmt5X2V4cHJlc3Npb24gfCBsaW5reSI+PC9zcGFuPg0KLSAqDQotICogQGV4YW1wbGUNCi0gICA8ZXhhbXBsZSBtb2R1bGU9Imxpbmt5RXhhbXBsZSIgZGVwcz0iYW5ndWxhci1zYW5pdGl6ZS5qcyI+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgPHNjcmlwdD4NCi0gICAgICAgICBhbmd1bGFyLm1vZHVsZSgnbGlua3lFeGFtcGxlJywgWyduZ1Nhbml0aXplJ10pDQotICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAgICAkc2NvcGUuc25pcHBldCA9DQotICAgICAgICAgICAgICAgJ1ByZXR0eSB0ZXh0IHdpdGggc29tZSBsaW5rczpcbicrDQotICAgICAgICAgICAgICAgJ2h0dHA6Ly9hbmd1bGFyanMub3JnLyxcbicrDQotICAgICAgICAgICAgICAgJ21haWx0bzp1c0Bzb21ld2hlcmUub3JnLFxuJysNCi0gICAgICAgICAgICAgICAnYW5vdGhlckBzb21ld2hlcmUub3JnLFxuJysNCi0gICAgICAgICAgICAgICAnYW5kIG9uZSBtb3JlOiBmdHA6Ly8xMjcuMC4wLjEvLic7DQotICAgICAgICAgICAgICRzY29wZS5zbmlwcGV0V2l0aFRhcmdldCA9ICdodHRwOi8vYW5ndWxhcmpzLm9yZy8nOw0KLSAgICAgICAgICAgfV0pOw0KLSAgICAgICA8L3NjcmlwdD4NCi0gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+DQotICAgICAgIFNuaXBwZXQ6IDx0ZXh0YXJlYSBuZy1tb2RlbD0ic25pcHBldCIgY29scz0iNjAiIHJvd3M9IjMiPjwvdGV4dGFyZWE+DQotICAgICAgIDx0YWJsZT4NCi0gICAgICAgICA8dHI+DQotICAgICAgICAgICA8dGQ+RmlsdGVyPC90ZD4NCi0gICAgICAgICAgIDx0ZD5Tb3VyY2U8L3RkPg0KLSAgICAgICAgICAgPHRkPlJlbmRlcmVkPC90ZD4NCi0gICAgICAgICA8L3RyPg0KLSAgICAgICAgIDx0ciBpZD0ibGlua3ktZmlsdGVyIj4NCi0gICAgICAgICAgIDx0ZD5saW5reSBmaWx0ZXI8L3RkPg0KLSAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICA8cHJlPiZsdDtkaXYgbmctYmluZC1odG1sPSJzbmlwcGV0IHwgbGlua3kiJmd0Ozxicj4mbHQ7L2RpdiZndDs8L3ByZT4NCi0gICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgIDxkaXYgbmctYmluZC1odG1sPSJzbmlwcGV0IHwgbGlua3kiPjwvZGl2Pg0KLSAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICA8L3RyPg0KLSAgICAgICAgIDx0ciBpZD0ibGlua3ktdGFyZ2V0Ij4NCi0gICAgICAgICAgPHRkPmxpbmt5IHRhcmdldDwvdGQ+DQotICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICA8cHJlPiZsdDtkaXYgbmctYmluZC1odG1sPSJzbmlwcGV0V2l0aFRhcmdldCB8IGxpbmt5OidfYmxhbmsnIiZndDs8YnI+Jmx0Oy9kaXYmZ3Q7PC9wcmU+DQotICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICA8ZGl2IG5nLWJpbmQtaHRtbD0ic25pcHBldFdpdGhUYXJnZXQgfCBsaW5reTonX2JsYW5rJyI+PC9kaXY+DQotICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgPC90cj4NCi0gICAgICAgICA8dHIgaWQ9ImVzY2FwZWQtaHRtbCI+DQotICAgICAgICAgICA8dGQ+bm8gZmlsdGVyPC90ZD4NCi0gICAgICAgICAgIDx0ZD48cHJlPiZsdDtkaXYgbmctYmluZD0ic25pcHBldCImZ3Q7PGJyPiZsdDsvZGl2Jmd0OzwvcHJlPjwvdGQ+DQotICAgICAgICAgICA8dGQ+PGRpdiBuZy1iaW5kPSJzbmlwcGV0Ij48L2Rpdj48L3RkPg0KLSAgICAgICAgIDwvdHI+DQotICAgICAgIDwvdGFibGU+DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgaXQoJ3Nob3VsZCBsaW5raWZ5IHRoZSBzbmlwcGV0IHdpdGggdXJscycsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5reS1maWx0ZXInKSkuZWxlbWVudChieS5iaW5kaW5nKCdzbmlwcGV0IHwgbGlua3knKSkuZ2V0VGV4dCgpKS4NCi0gICAgICAgICAgICAgdG9CZSgnUHJldHR5IHRleHQgd2l0aCBzb21lIGxpbmtzOiBodHRwOi8vYW5ndWxhcmpzLm9yZy8sIHVzQHNvbWV3aGVyZS5vcmcsICcgKw0KLSAgICAgICAgICAgICAgICAgICdhbm90aGVyQHNvbWV3aGVyZS5vcmcsIGFuZCBvbmUgbW9yZTogZnRwOi8vMTI3LjAuMC4xLy4nKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwoYnkuY3NzKCcjbGlua3ktZmlsdGVyIGEnKSkuY291bnQoKSkudG9FcXVhbCg0KTsNCi0gICAgICAgfSk7DQotDQotICAgICAgIGl0KCdzaG91bGQgbm90IGxpbmtpZnkgc25pcHBldCB3aXRob3V0IHRoZSBsaW5reSBmaWx0ZXInLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZXNjYXBlZC1odG1sJykpLmVsZW1lbnQoYnkuYmluZGluZygnc25pcHBldCcpKS5nZXRUZXh0KCkpLg0KLSAgICAgICAgICAgICB0b0JlKCdQcmV0dHkgdGV4dCB3aXRoIHNvbWUgbGlua3M6IGh0dHA6Ly9hbmd1bGFyanMub3JnLywgbWFpbHRvOnVzQHNvbWV3aGVyZS5vcmcsICcgKw0KLSAgICAgICAgICAgICAgICAgICdhbm90aGVyQHNvbWV3aGVyZS5vcmcsIGFuZCBvbmUgbW9yZTogZnRwOi8vMTI3LjAuMC4xLy4nKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwoYnkuY3NzKCcjZXNjYXBlZC1odG1sIGEnKSkuY291bnQoKSkudG9FcXVhbCgwKTsNCi0gICAgICAgfSk7DQotDQotICAgICAgIGl0KCdzaG91bGQgdXBkYXRlJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnc25pcHBldCcpKS5jbGVhcigpOw0KLSAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3NuaXBwZXQnKSkuc2VuZEtleXMoJ25ldyBodHRwOi8vbGluay4nKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGlua3ktZmlsdGVyJykpLmVsZW1lbnQoYnkuYmluZGluZygnc25pcHBldCB8IGxpbmt5JykpLmdldFRleHQoKSkuDQotICAgICAgICAgICAgIHRvQmUoJ25ldyBodHRwOi8vbGluay4nKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwoYnkuY3NzKCcjbGlua3ktZmlsdGVyIGEnKSkuY291bnQoKSkudG9FcXVhbCgxKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZXNjYXBlZC1odG1sJykpLmVsZW1lbnQoYnkuYmluZGluZygnc25pcHBldCcpKS5nZXRUZXh0KCkpDQotICAgICAgICAgICAgIC50b0JlKCduZXcgaHR0cDovL2xpbmsuJyk7DQotICAgICAgIH0pOw0KLQ0KLSAgICAgICBpdCgnc2hvdWxkIHdvcmsgd2l0aCB0aGUgdGFyZ2V0IHByb3BlcnR5JywgZnVuY3Rpb24oKSB7DQotICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGlua3ktdGFyZ2V0JykpLg0KLSAgICAgICAgICAgIGVsZW1lbnQoYnkuYmluZGluZygic25pcHBldFdpdGhUYXJnZXQgfCBsaW5reTonX2JsYW5rJyIpKS5nZXRUZXh0KCkpLg0KLSAgICAgICAgICAgIHRvQmUoJ2h0dHA6Ly9hbmd1bGFyanMub3JnLycpOw0KLSAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcjbGlua3ktdGFyZ2V0IGEnKSkuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKSkudG9FcXVhbCgnX2JsYW5rJyk7DQotICAgICAgIH0pOw0KLSAgICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gKi8NCi1hbmd1bGFyLm1vZHVsZSgnbmdTYW5pdGl6ZScpLmZpbHRlcignbGlua3knLCBbJyRzYW5pdGl6ZScsIGZ1bmN0aW9uKCRzYW5pdGl6ZSkgew0KLSAgdmFyIExJTktZX1VSTF9SRUdFWFAgPQ0KLSAgICAgICAgLygoZnRwfGh0dHBzPyk6XC9cL3wod3d3XC4pfChtYWlsdG86KT9bQS1aYS16MC05Ll8lKy1dK0ApXFMqW15ccy47LCgpe308PiLigJ3iP5ldLywNCi0gICAgICBNQUlMVE9fUkVHRVhQID0gL15tYWlsdG86LzsNCi0NCi0gIHJldHVybiBmdW5jdGlvbih0ZXh0LCB0YXJnZXQpIHsNCi0gICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDsNCi0gICAgdmFyIG1hdGNoOw0KLSAgICB2YXIgcmF3ID0gdGV4dDsNCi0gICAgdmFyIGh0bWwgPSBbXTsNCi0gICAgdmFyIHVybDsNCi0gICAgdmFyIGk7DQotICAgIHdoaWxlICgobWF0Y2ggPSByYXcubWF0Y2goTElOS1lfVVJMX1JFR0VYUCkpKSB7DQotICAgICAgLy8gV2UgY2FuIG5vdCBlbmQgaW4gdGhlc2UgYXMgdGhleSBhcmUgc29tZXRpbWVzIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIHNlbnRlbmNlDQotICAgICAgdXJsID0gbWF0Y2hbMF07DQotICAgICAgLy8gaWYgd2UgZGlkIG5vdCBtYXRjaCBmdHAvaHR0cC93d3cvbWFpbHRvIHRoZW4gYXNzdW1lIG1haWx0bw0KLSAgICAgIGlmICghbWF0Y2hbMl0gJiYgIW1hdGNoWzRdKSB7DQotICAgICAgICB1cmwgPSAobWF0Y2hbM10gPyAnaHR0cDovLycgOiAnbWFpbHRvOicpICsgdXJsOw0KLSAgICAgIH0NCi0gICAgICBpID0gbWF0Y2guaW5kZXg7DQotICAgICAgYWRkVGV4dChyYXcuc3Vic3RyKDAsIGkpKTsNCi0gICAgICBhZGRMaW5rKHVybCwgbWF0Y2hbMF0ucmVwbGFjZShNQUlMVE9fUkVHRVhQLCAnJykpOw0KLSAgICAgIHJhdyA9IHJhdy5zdWJzdHJpbmcoaSArIG1hdGNoWzBdLmxlbmd0aCk7DQotICAgIH0NCi0gICAgYWRkVGV4dChyYXcpOw0KLSAgICByZXR1cm4gJHNhbml0aXplKGh0bWwuam9pbignJykpOw0KLQ0KLSAgICBmdW5jdGlvbiBhZGRUZXh0KHRleHQpIHsNCi0gICAgICBpZiAoIXRleHQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgICB9DQotICAgICAgaHRtbC5wdXNoKHNhbml0aXplVGV4dCh0ZXh0KSk7DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gYWRkTGluayh1cmwsIHRleHQpIHsNCi0gICAgICBodG1sLnB1c2goJzxhICcpOw0KLSAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZCh0YXJnZXQpKSB7DQotICAgICAgICBodG1sLnB1c2goJ3RhcmdldD0iJywNCi0gICAgICAgICAgICAgICAgICB0YXJnZXQsDQotICAgICAgICAgICAgICAgICAgJyIgJyk7DQotICAgICAgfQ0KLSAgICAgIGh0bWwucHVzaCgnaHJlZj0iJywNCi0gICAgICAgICAgICAgICAgdXJsLnJlcGxhY2UoLyIvZywgJyZxdW90OycpLA0KLSAgICAgICAgICAgICAgICAnIj4nKTsNCi0gICAgICBhZGRUZXh0KHRleHQpOw0KLSAgICAgIGh0bWwucHVzaCgnPC9hPicpOw0KLSAgICB9DQotICB9Ow0KLX1dKTsNCi0NCi0NCi19KSh3aW5kb3csIHdpbmRvdy5hbmd1bGFyKTsNCisvKgorVGhlIE1JVCBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKyovCisvKioKKyAqIEBsaWNlbnNlIEFuZ3VsYXJKUyB2MS4zLjgKKyAqIChjKSAyMDEwLTIwMTQgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnCisgKiBMaWNlbnNlOiBNSVQKKyAqLworKGZ1bmN0aW9uKHdpbmRvdywgYW5ndWxhciwgdW5kZWZpbmVkKSB7J3VzZSBzdHJpY3QnOworCit2YXIgJHNhbml0aXplTWluRXJyID0gYW5ndWxhci4kJG1pbkVycignJHNhbml0aXplJyk7CisKKy8qKgorICogQG5nZG9jIG1vZHVsZQorICogQG5hbWUgbmdTYW5pdGl6ZQorICogQGRlc2NyaXB0aW9uCisgKgorICogIyBuZ1Nhbml0aXplCisgKgorICogVGhlIGBuZ1Nhbml0aXplYCBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0byBzYW5pdGl6ZSBIVE1MLgorICoKKyAqCisgKiA8ZGl2IGRvYy1tb2R1bGUtY29tcG9uZW50cz0ibmdTYW5pdGl6ZSI+PC9kaXY+CisgKgorICogU2VlIHtAbGluayBuZ1Nhbml0aXplLiRzYW5pdGl6ZSBgJHNhbml0aXplYH0gZm9yIHVzYWdlLgorICovCisKKy8qCisgKiBIVE1MIFBhcnNlciBCeSBNaXNrbyBIZXZlcnkgKG1pc2tvQGhldmVyeS5jb20pCisgKiBiYXNlZCBvbjogIEhUTUwgUGFyc2VyIEJ5IEpvaG4gUmVzaWcgKGVqb2huLm9yZykKKyAqIE9yaWdpbmFsIGNvZGUgYnkgRXJpayBBcnZpZHNzb24sIE1vemlsbGEgUHVibGljIExpY2Vuc2UKKyAqIGh0dHA6Ly9lcmlrLmVhZS5uZXQvc2ltcGxlaHRtbHBhcnNlci9zaW1wbGVodG1scGFyc2VyLmpzCisgKgorICogLy8gVXNlIGxpa2Ugc286CisgKiBodG1sUGFyc2VyKGh0bWxTdHJpbmcsIHsKKyAqICAgICBzdGFydDogZnVuY3Rpb24odGFnLCBhdHRycywgdW5hcnkpIHt9LAorICogICAgIGVuZDogZnVuY3Rpb24odGFnKSB7fSwKKyAqICAgICBjaGFyczogZnVuY3Rpb24odGV4dCkge30sCisgKiAgICAgY29tbWVudDogZnVuY3Rpb24odGV4dCkge30KKyAqIH0pOworICoKKyAqLworCisKKy8qKgorICogQG5nZG9jIHNlcnZpY2UKKyAqIEBuYW1lICRzYW5pdGl6ZQorICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqICAgVGhlIGlucHV0IGlzIHNhbml0aXplZCBieSBwYXJzaW5nIHRoZSBIVE1MIGludG8gdG9rZW5zLiBBbGwgc2FmZSB0b2tlbnMgKGZyb20gYSB3aGl0ZWxpc3QpIGFyZQorICogICB0aGVuIHNlcmlhbGl6ZWQgYmFjayB0byBwcm9wZXJseSBlc2NhcGVkIGh0bWwgc3RyaW5nLiBUaGlzIG1lYW5zIHRoYXQgbm8gdW5zYWZlIGlucHV0IGNhbiBtYWtlCisgKiAgIGl0IGludG8gdGhlIHJldHVybmVkIHN0cmluZywgaG93ZXZlciwgc2luY2Ugb3VyIHBhcnNlciBpcyBtb3JlIHN0cmljdCB0aGFuIGEgdHlwaWNhbCBicm93c2VyCisgKiAgIHBhcnNlciwgaXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgb2JzY3VyZSBpbnB1dCwgd2hpY2ggd291bGQgYmUgcmVjb2duaXplZCBhcyB2YWxpZCBIVE1MIGJ5IGEKKyAqICAgYnJvd3Nlciwgd29uJ3QgbWFrZSBpdCB0aHJvdWdoIHRoZSBzYW5pdGl6ZXIuIFRoZSBpbnB1dCBtYXkgYWxzbyBjb250YWluIFNWRyBtYXJrdXAuCisgKiAgIFRoZSB3aGl0ZWxpc3QgaXMgY29uZmlndXJlZCB1c2luZyB0aGUgZnVuY3Rpb25zIGBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdGAgYW5kCisgKiAgIGBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3RgIG9mIHtAbGluayBuZy4kY29tcGlsZVByb3ZpZGVyIGAkY29tcGlsZVByb3ZpZGVyYH0uCisgKgorICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgSFRNTCBpbnB1dC4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IFNhbml0aXplZCBIVE1MLgorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZSBtb2R1bGU9InNhbml0aXplRXhhbXBsZSIgZGVwcz0iYW5ndWxhci1zYW5pdGl6ZS5qcyI+CisgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgPHNjcmlwdD4KKyAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdzYW5pdGl6ZUV4YW1wbGUnLCBbJ25nU2FuaXRpemUnXSkKKyAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJHNjZScsIGZ1bmN0aW9uKCRzY29wZSwgJHNjZSkgeworICAgICAgICAgICAgICRzY29wZS5zbmlwcGV0ID0KKyAgICAgICAgICAgICAgICc8cCBzdHlsZT0iY29sb3I6Ymx1ZSI+YW4gaHRtbFxuJyArCisgICAgICAgICAgICAgICAnPGVtIG9ubW91c2VvdmVyPSJ0aGlzLnRleHRDb250ZW50PVwnUFdOM0QhXCciPmNsaWNrIGhlcmU8L2VtPlxuJyArCisgICAgICAgICAgICAgICAnc25pcHBldDwvcD4nOworICAgICAgICAgICAgICRzY29wZS5kZWxpYmVyYXRlbHlUcnVzdERhbmdlcm91c1NuaXBwZXQgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgIHJldHVybiAkc2NlLnRydXN0QXNIdG1sKCRzY29wZS5zbmlwcGV0KTsKKyAgICAgICAgICAgICB9OworICAgICAgICAgICB9XSk7CisgICAgIDwvc2NyaXB0PgorICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KKyAgICAgICAgU25pcHBldDogPHRleHRhcmVhIG5nLW1vZGVsPSJzbmlwcGV0IiBjb2xzPSI2MCIgcm93cz0iMyI+PC90ZXh0YXJlYT4KKyAgICAgICA8dGFibGU+CisgICAgICAgICA8dHI+CisgICAgICAgICAgIDx0ZD5EaXJlY3RpdmU8L3RkPgorICAgICAgICAgICA8dGQ+SG93PC90ZD4KKyAgICAgICAgICAgPHRkPlNvdXJjZTwvdGQ+CisgICAgICAgICAgIDx0ZD5SZW5kZXJlZDwvdGQ+CisgICAgICAgICA8L3RyPgorICAgICAgICAgPHRyIGlkPSJiaW5kLWh0bWwtd2l0aC1zYW5pdGl6ZSI+CisgICAgICAgICAgIDx0ZD5uZy1iaW5kLWh0bWw8L3RkPgorICAgICAgICAgICA8dGQ+QXV0b21hdGljYWxseSB1c2VzICRzYW5pdGl6ZTwvdGQ+CisgICAgICAgICAgIDx0ZD48cHJlPiZsdDtkaXYgbmctYmluZC1odG1sPSJzbmlwcGV0IiZndDs8YnIvPiZsdDsvZGl2Jmd0OzwvcHJlPjwvdGQ+CisgICAgICAgICAgIDx0ZD48ZGl2IG5nLWJpbmQtaHRtbD0ic25pcHBldCI+PC9kaXY+PC90ZD4KKyAgICAgICAgIDwvdHI+CisgICAgICAgICA8dHIgaWQ9ImJpbmQtaHRtbC13aXRoLXRydXN0Ij4KKyAgICAgICAgICAgPHRkPm5nLWJpbmQtaHRtbDwvdGQ+CisgICAgICAgICAgIDx0ZD5CeXBhc3MgJHNhbml0aXplIGJ5IGV4cGxpY2l0bHkgdHJ1c3RpbmcgdGhlIGRhbmdlcm91cyB2YWx1ZTwvdGQ+CisgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgPHByZT4mbHQ7ZGl2IG5nLWJpbmQtaHRtbD0iZGVsaWJlcmF0ZWx5VHJ1c3REYW5nZXJvdXNTbmlwcGV0KCkiJmd0OworJmx0Oy9kaXYmZ3Q7PC9wcmU+CisgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgIDx0ZD48ZGl2IG5nLWJpbmQtaHRtbD0iZGVsaWJlcmF0ZWx5VHJ1c3REYW5nZXJvdXNTbmlwcGV0KCkiPjwvZGl2PjwvdGQ+CisgICAgICAgICA8L3RyPgorICAgICAgICAgPHRyIGlkPSJiaW5kLWRlZmF1bHQiPgorICAgICAgICAgICA8dGQ+bmctYmluZDwvdGQ+CisgICAgICAgICAgIDx0ZD5BdXRvbWF0aWNhbGx5IGVzY2FwZXM8L3RkPgorICAgICAgICAgICA8dGQ+PHByZT4mbHQ7ZGl2IG5nLWJpbmQ9InNuaXBwZXQiJmd0Ozxici8+Jmx0Oy9kaXYmZ3Q7PC9wcmU+PC90ZD4KKyAgICAgICAgICAgPHRkPjxkaXYgbmctYmluZD0ic25pcHBldCI+PC9kaXY+PC90ZD4KKyAgICAgICAgIDwvdHI+CisgICAgICAgPC90YWJsZT4KKyAgICAgICA8L2Rpdj4KKyAgIDwvZmlsZT4KKyAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICBpdCgnc2hvdWxkIHNhbml0aXplIHRoZSBodG1sIHNuaXBwZXQgYnkgZGVmYXVsdCcsIGZ1bmN0aW9uKCkgeworICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnI2JpbmQtaHRtbC13aXRoLXNhbml0aXplIGRpdicpKS5nZXRJbm5lckh0bWwoKSkuCisgICAgICAgICB0b0JlKCc8cD5hbiBodG1sXG48ZW0+Y2xpY2sgaGVyZTwvZW0+XG5zbmlwcGV0PC9wPicpOworICAgICB9KTsKKworICAgICBpdCgnc2hvdWxkIGlubGluZSByYXcgc25pcHBldCBpZiBib3VuZCB0byBhIHRydXN0ZWQgdmFsdWUnLCBmdW5jdGlvbigpIHsKKyAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWh0bWwtd2l0aC10cnVzdCBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLgorICAgICAgICAgdG9CZSgiPHAgc3R5bGU9XCJjb2xvcjpibHVlXCI+YW4gaHRtbFxuIiArCisgICAgICAgICAgICAgICI8ZW0gb25tb3VzZW92ZXI9XCJ0aGlzLnRleHRDb250ZW50PSdQV04zRCEnXCI+Y2xpY2sgaGVyZTwvZW0+XG4iICsKKyAgICAgICAgICAgICAgInNuaXBwZXQ8L3A+Iik7CisgICAgIH0pOworCisgICAgIGl0KCdzaG91bGQgZXNjYXBlIHNuaXBwZXQgd2l0aG91dCBhbnkgZmlsdGVyJywgZnVuY3Rpb24oKSB7CisgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcjYmluZC1kZWZhdWx0IGRpdicpKS5nZXRJbm5lckh0bWwoKSkuCisgICAgICAgICB0b0JlKCImbHQ7cCBzdHlsZT1cImNvbG9yOmJsdWVcIiZndDthbiBodG1sXG4iICsKKyAgICAgICAgICAgICAgIiZsdDtlbSBvbm1vdXNlb3Zlcj1cInRoaXMudGV4dENvbnRlbnQ9J1BXTjNEISdcIiZndDtjbGljayBoZXJlJmx0Oy9lbSZndDtcbiIgKworICAgICAgICAgICAgICAic25pcHBldCZsdDsvcCZndDsiKTsKKyAgICAgfSk7CisKKyAgICAgaXQoJ3Nob3VsZCB1cGRhdGUnLCBmdW5jdGlvbigpIHsKKyAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzbmlwcGV0JykpLmNsZWFyKCk7CisgICAgICAgZWxlbWVudChieS5tb2RlbCgnc25pcHBldCcpKS5zZW5kS2V5cygnbmV3IDxiIG9uY2xpY2s9ImFsZXJ0KDEpIj50ZXh0PC9iPicpOworICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnI2JpbmQtaHRtbC13aXRoLXNhbml0aXplIGRpdicpKS5nZXRJbm5lckh0bWwoKSkuCisgICAgICAgICB0b0JlKCduZXcgPGI+dGV4dDwvYj4nKTsKKyAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyNiaW5kLWh0bWwtd2l0aC10cnVzdCBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLnRvQmUoCisgICAgICAgICAnbmV3IDxiIG9uY2xpY2s9ImFsZXJ0KDEpIj50ZXh0PC9iPicpOworICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnI2JpbmQtZGVmYXVsdCBkaXYnKSkuZ2V0SW5uZXJIdG1sKCkpLnRvQmUoCisgICAgICAgICAibmV3ICZsdDtiIG9uY2xpY2s9XCJhbGVydCgxKVwiJmd0O3RleHQmbHQ7L2ImZ3Q7Iik7CisgICAgIH0pOworICAgPC9maWxlPgorICAgPC9leGFtcGxlPgorICovCitmdW5jdGlvbiAkU2FuaXRpemVQcm92aWRlcigpIHsKKyAgdGhpcy4kZ2V0ID0gWyckJHNhbml0aXplVXJpJywgZnVuY3Rpb24oJCRzYW5pdGl6ZVVyaSkgeworICAgIHJldHVybiBmdW5jdGlvbihodG1sKSB7CisgICAgICB2YXIgYnVmID0gW107CisgICAgICBodG1sUGFyc2VyKGh0bWwsIGh0bWxTYW5pdGl6ZVdyaXRlcihidWYsIGZ1bmN0aW9uKHVyaSwgaXNJbWFnZSkgeworICAgICAgICByZXR1cm4gIS9edW5zYWZlLy50ZXN0KCQkc2FuaXRpemVVcmkodXJpLCBpc0ltYWdlKSk7CisgICAgICB9KSk7CisgICAgICByZXR1cm4gYnVmLmpvaW4oJycpOworICAgIH07CisgIH1dOworfQorCitmdW5jdGlvbiBzYW5pdGl6ZVRleHQoY2hhcnMpIHsKKyAgdmFyIGJ1ZiA9IFtdOworICB2YXIgd3JpdGVyID0gaHRtbFNhbml0aXplV3JpdGVyKGJ1ZiwgYW5ndWxhci5ub29wKTsKKyAgd3JpdGVyLmNoYXJzKGNoYXJzKTsKKyAgcmV0dXJuIGJ1Zi5qb2luKCcnKTsKK30KKworCisvLyBSZWd1bGFyIEV4cHJlc3Npb25zIGZvciBwYXJzaW5nIHRhZ3MgYW5kIGF0dHJpYnV0ZXMKK3ZhciBTVEFSVF9UQUdfUkVHRVhQID0KKyAgICAgICAvXjwoKD86W2EtekEtWl0pW1x3Oi1dKikoKD86XHMrW1x3Oi1dKyg/OlxzKj1ccyooPzooPzoiW14iXSoiKXwoPzonW14nXSonKXxbXj5cc10rKSk/KSopXHMqKFwvPylccyooPj8pLywKKyAgRU5EX1RBR19SRUdFWFAgPSAvXjxcL1xzKihbXHc6LV0rKVtePl0qPi8sCisgIEFUVFJfUkVHRVhQID0gLyhbXHc6LV0rKSg/OlxzKj1ccyooPzooPzoiKCg/OlteIl0pKikiKXwoPzonKCg/OlteJ10pKiknKXwoW14+XHNdKykpKT8vZywKKyAgQkVHSU5fVEFHX1JFR0VYUCA9IC9ePC8sCisgIEJFR0lOR19FTkRfVEFHRV9SRUdFWFAgPSAvXjxcLy8sCisgIENPTU1FTlRfUkVHRVhQID0gLzwhLS0oLio/KS0tPi9nLAorICBET0NUWVBFX1JFR0VYUCA9IC88IURPQ1RZUEUoW14+XSo/KT4vaSwKKyAgQ0RBVEFfUkVHRVhQID0gLzwhXFtDREFUQVxbKC4qPyldXT4vZywKKyAgU1VSUk9HQVRFX1BBSVJfUkVHRVhQID0gL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXS9nLAorICAvLyBNYXRjaCBldmVyeXRoaW5nIG91dHNpZGUgb2Ygbm9ybWFsIGNoYXJzIGFuZCAiIChxdW90ZSBjaGFyYWN0ZXIpCisgIE5PTl9BTFBIQU5VTUVSSUNfUkVHRVhQID0gLyhbXlwjLX58IHwhXSkvZzsKKworCisvLyBHb29kIHNvdXJjZSBvZiBpbmZvIGFib3V0IGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzCisvLyBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjL092ZXJ2aWV3Lmh0bWwjc2VtYW50aWNzCisvLyBodHRwOi8vc2ltb24uaHRtbDUub3JnL2h0bWwtZWxlbWVudHMKKworLy8gU2FmZSBWb2lkIEVsZW1lbnRzIC0gSFRNTDUKKy8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCN2b2lkLWVsZW1lbnRzCit2YXIgdm9pZEVsZW1lbnRzID0gbWFrZU1hcCgiYXJlYSxicixjb2wsaHIsaW1nLHdiciIpOworCisvLyBFbGVtZW50cyB0aGF0IHlvdSBjYW4sIGludGVudGlvbmFsbHksIGxlYXZlIG9wZW4gKGFuZCB3aGljaCBjbG9zZSB0aGVtc2VsdmVzKQorLy8gaHR0cDovL2Rldi53My5vcmcvaHRtbDUvc3BlYy9PdmVydmlldy5odG1sI29wdGlvbmFsLXRhZ3MKK3ZhciBvcHRpb25hbEVuZFRhZ0Jsb2NrRWxlbWVudHMgPSBtYWtlTWFwKCJjb2xncm91cCxkZCxkdCxsaSxwLHRib2R5LHRkLHRmb290LHRoLHRoZWFkLHRyIiksCisgICAgb3B0aW9uYWxFbmRUYWdJbmxpbmVFbGVtZW50cyA9IG1ha2VNYXAoInJwLHJ0IiksCisgICAgb3B0aW9uYWxFbmRUYWdFbGVtZW50cyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbEVuZFRhZ0lubGluZUVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbEVuZFRhZ0Jsb2NrRWxlbWVudHMpOworCisvLyBTYWZlIEJsb2NrIEVsZW1lbnRzIC0gSFRNTDUKK3ZhciBibG9ja0VsZW1lbnRzID0gYW5ndWxhci5leHRlbmQoe30sIG9wdGlvbmFsRW5kVGFnQmxvY2tFbGVtZW50cywgbWFrZU1hcCgiYWRkcmVzcyxhcnRpY2xlLCIgKworICAgICAgICAiYXNpZGUsYmxvY2txdW90ZSxjYXB0aW9uLGNlbnRlcixkZWwsZGlyLGRpdixkbCxmaWd1cmUsZmlnY2FwdGlvbixmb290ZXIsaDEsaDIsaDMsaDQsaDUsIiArCisgICAgICAgICJoNixoZWFkZXIsaGdyb3VwLGhyLGlucyxtYXAsbWVudSxuYXYsb2wscHJlLHNjcmlwdCxzZWN0aW9uLHRhYmxlLHVsIikpOworCisvLyBJbmxpbmUgRWxlbWVudHMgLSBIVE1MNQordmFyIGlubGluZUVsZW1lbnRzID0gYW5ndWxhci5leHRlbmQoe30sIG9wdGlvbmFsRW5kVGFnSW5saW5lRWxlbWVudHMsIG1ha2VNYXAoImEsYWJicixhY3JvbnltLGIsIiArCisgICAgICAgICJiZGksYmRvLGJpZyxicixjaXRlLGNvZGUsZGVsLGRmbixlbSxmb250LGksaW1nLGlucyxrYmQsbGFiZWwsbWFwLG1hcmsscSxydWJ5LHJwLHJ0LHMsIiArCisgICAgICAgICJzYW1wLHNtYWxsLHNwYW4sc3RyaWtlLHN0cm9uZyxzdWIsc3VwLHRpbWUsdHQsdSx2YXIiKSk7CisKKy8vIFNWRyBFbGVtZW50cworLy8gaHR0cHM6Ly93aWtpLndoYXR3Zy5vcmcvd2lraS9TYW5pdGl6YXRpb25fcnVsZXMjc3ZnX0VsZW1lbnRzCit2YXIgc3ZnRWxlbWVudHMgPSBtYWtlTWFwKCJhbmltYXRlLGFuaW1hdGVDb2xvcixhbmltYXRlTW90aW9uLGFuaW1hdGVUcmFuc2Zvcm0sY2lyY2xlLGRlZnMsIiArCisgICAgICAgICJkZXNjLGVsbGlwc2UsZm9udC1mYWNlLGZvbnQtZmFjZS1uYW1lLGZvbnQtZmFjZS1zcmMsZyxnbHlwaCxoa2VybixpbWFnZSxsaW5lYXJHcmFkaWVudCwiICsKKyAgICAgICAgImxpbmUsbWFya2VyLG1ldGFkYXRhLG1pc3NpbmctZ2x5cGgsbXBhdGgscGF0aCxwb2x5Z29uLHBvbHlsaW5lLHJhZGlhbEdyYWRpZW50LHJlY3Qsc2V0LCIgKworICAgICAgICAic3RvcCxzdmcsc3dpdGNoLHRleHQsdGl0bGUsdHNwYW4sdXNlIik7CisKKy8vIFNwZWNpYWwgRWxlbWVudHMgKGNhbiBjb250YWluIGFueXRoaW5nKQordmFyIHNwZWNpYWxFbGVtZW50cyA9IG1ha2VNYXAoInNjcmlwdCxzdHlsZSIpOworCit2YXIgdmFsaWRFbGVtZW50cyA9IGFuZ3VsYXIuZXh0ZW5kKHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbEVuZFRhZ0VsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmdFbGVtZW50cyk7CisKKy8vQXR0cmlidXRlcyB0aGF0IGhhdmUgaHJlZiBhbmQgaGVuY2UgbmVlZCB0byBiZSBzYW5pdGl6ZWQKK3ZhciB1cmlBdHRycyA9IG1ha2VNYXAoImJhY2tncm91bmQsY2l0ZSxocmVmLGxvbmdkZXNjLHNyYyx1c2VtYXAseGxpbms6aHJlZiIpOworCit2YXIgaHRtbEF0dHJzID0gbWFrZU1hcCgnYWJicixhbGlnbixhbHQsYXhpcyxiZ2NvbG9yLGJvcmRlcixjZWxscGFkZGluZyxjZWxsc3BhY2luZyxjbGFzcyxjbGVhciwnICsKKyAgICAnY29sb3IsY29scyxjb2xzcGFuLGNvbXBhY3QsY29vcmRzLGRpcixmYWNlLGhlYWRlcnMsaGVpZ2h0LGhyZWZsYW5nLGhzcGFjZSwnICsKKyAgICAnaXNtYXAsbGFuZyxsYW5ndWFnZSxub2hyZWYsbm93cmFwLHJlbCxyZXYscm93cyxyb3dzcGFuLHJ1bGVzLCcgKworICAgICdzY29wZSxzY3JvbGxpbmcsc2hhcGUsc2l6ZSxzcGFuLHN0YXJ0LHN1bW1hcnksdGFyZ2V0LHRpdGxlLHR5cGUsJyArCisgICAgJ3ZhbGlnbix2YWx1ZSx2c3BhY2Usd2lkdGgnKTsKKworLy8gU1ZHIGF0dHJpYnV0ZXMgKHdpdGhvdXQgImlkIiBhbmQgIm5hbWUiIGF0dHJpYnV0ZXMpCisvLyBodHRwczovL3dpa2kud2hhdHdnLm9yZy93aWtpL1Nhbml0aXphdGlvbl9ydWxlcyNzdmdfQXR0cmlidXRlcwordmFyIHN2Z0F0dHJzID0gbWFrZU1hcCgnYWNjZW50LWhlaWdodCxhY2N1bXVsYXRlLGFkZGl0aXZlLGFscGhhYmV0aWMsYXJhYmljLWZvcm0sYXNjZW50LCcgKworICAgICdhdHRyaWJ1dGVOYW1lLGF0dHJpYnV0ZVR5cGUsYmFzZVByb2ZpbGUsYmJveCxiZWdpbixieSxjYWxjTW9kZSxjYXAtaGVpZ2h0LGNsYXNzLGNvbG9yLCcgKworICAgICdjb2xvci1yZW5kZXJpbmcsY29udGVudCxjeCxjeSxkLGR4LGR5LGRlc2NlbnQsZGlzcGxheSxkdXIsZW5kLGZpbGwsZmlsbC1ydWxlLGZvbnQtZmFtaWx5LCcgKworICAgICdmb250LXNpemUsZm9udC1zdHJldGNoLGZvbnQtc3R5bGUsZm9udC12YXJpYW50LGZvbnQtd2VpZ2h0LGZyb20sZngsZnksZzEsZzIsZ2x5cGgtbmFtZSwnICsKKyAgICAnZ3JhZGllbnRVbml0cyxoYW5naW5nLGhlaWdodCxob3Jpei1hZHYteCxob3Jpei1vcmlnaW4teCxpZGVvZ3JhcGhpYyxrLGtleVBvaW50cywnICsKKyAgICAna2V5U3BsaW5lcyxrZXlUaW1lcyxsYW5nLG1hcmtlci1lbmQsbWFya2VyLW1pZCxtYXJrZXItc3RhcnQsbWFya2VySGVpZ2h0LG1hcmtlclVuaXRzLCcgKworICAgICdtYXJrZXJXaWR0aCxtYXRoZW1hdGljYWwsbWF4LG1pbixvZmZzZXQsb3BhY2l0eSxvcmllbnQsb3JpZ2luLG92ZXJsaW5lLXBvc2l0aW9uLCcgKworICAgICdvdmVybGluZS10aGlja25lc3MscGFub3NlLTEscGF0aCxwYXRoTGVuZ3RoLHBvaW50cyxwcmVzZXJ2ZUFzcGVjdFJhdGlvLHIscmVmWCxyZWZZLCcgKworICAgICdyZXBlYXRDb3VudCxyZXBlYXREdXIscmVxdWlyZWRFeHRlbnNpb25zLHJlcXVpcmVkRmVhdHVyZXMscmVzdGFydCxyb3RhdGUscngscnksc2xvcGUsc3RlbWgsJyArCisgICAgJ3N0ZW12LHN0b3AtY29sb3Isc3RvcC1vcGFjaXR5LHN0cmlrZXRocm91Z2gtcG9zaXRpb24sc3RyaWtldGhyb3VnaC10aGlja25lc3Msc3Ryb2tlLCcgKworICAgICdzdHJva2UtZGFzaGFycmF5LHN0cm9rZS1kYXNob2Zmc2V0LHN0cm9rZS1saW5lY2FwLHN0cm9rZS1saW5lam9pbixzdHJva2UtbWl0ZXJsaW1pdCwnICsKKyAgICAnc3Ryb2tlLW9wYWNpdHksc3Ryb2tlLXdpZHRoLHN5c3RlbUxhbmd1YWdlLHRhcmdldCx0ZXh0LWFuY2hvcix0byx0cmFuc2Zvcm0sdHlwZSx1MSx1MiwnICsKKyAgICAndW5kZXJsaW5lLXBvc2l0aW9uLHVuZGVybGluZS10aGlja25lc3MsdW5pY29kZSx1bmljb2RlLXJhbmdlLHVuaXRzLXBlci1lbSx2YWx1ZXMsdmVyc2lvbiwnICsKKyAgICAndmlld0JveCx2aXNpYmlsaXR5LHdpZHRoLHdpZHRocyx4LHgtaGVpZ2h0LHgxLHgyLHhsaW5rOmFjdHVhdGUseGxpbms6YXJjcm9sZSx4bGluazpyb2xlLCcgKworICAgICd4bGluazpzaG93LHhsaW5rOnRpdGxlLHhsaW5rOnR5cGUseG1sOmJhc2UseG1sOmxhbmcseG1sOnNwYWNlLHhtbG5zLHhtbG5zOnhsaW5rLHkseTEseTIsJyArCisgICAgJ3pvb21BbmRQYW4nKTsKKwordmFyIHZhbGlkQXR0cnMgPSBhbmd1bGFyLmV4dGVuZCh7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Z0F0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sQXR0cnMpOworCitmdW5jdGlvbiBtYWtlTWFwKHN0cikgeworICB2YXIgb2JqID0ge30sIGl0ZW1zID0gc3RyLnNwbGl0KCcsJyksIGk7CisgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgb2JqW2l0ZW1zW2ldXSA9IHRydWU7CisgIHJldHVybiBvYmo7Cit9CisKKworLyoqCisgKiBAZXhhbXBsZQorICogaHRtbFBhcnNlcihodG1sU3RyaW5nLCB7CisgKiAgICAgc3RhcnQ6IGZ1bmN0aW9uKHRhZywgYXR0cnMsIHVuYXJ5KSB7fSwKKyAqICAgICBlbmQ6IGZ1bmN0aW9uKHRhZykge30sCisgKiAgICAgY2hhcnM6IGZ1bmN0aW9uKHRleHQpIHt9LAorICogICAgIGNvbW1lbnQ6IGZ1bmN0aW9uKHRleHQpIHt9CisgKiB9KTsKKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gaHRtbCBzdHJpbmcKKyAqIEBwYXJhbSB7b2JqZWN0fSBoYW5kbGVyCisgKi8KK2Z1bmN0aW9uIGh0bWxQYXJzZXIoaHRtbCwgaGFuZGxlcikgeworICBpZiAodHlwZW9mIGh0bWwgIT09ICdzdHJpbmcnKSB7CisgICAgaWYgKGh0bWwgPT09IG51bGwgfHwgdHlwZW9mIGh0bWwgPT09ICd1bmRlZmluZWQnKSB7CisgICAgICBodG1sID0gJyc7CisgICAgfSBlbHNlIHsKKyAgICAgIGh0bWwgPSAnJyArIGh0bWw7CisgICAgfQorICB9CisgIHZhciBpbmRleCwgY2hhcnMsIG1hdGNoLCBzdGFjayA9IFtdLCBsYXN0ID0gaHRtbCwgdGV4dDsKKyAgc3RhY2subGFzdCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3RhY2tbIHN0YWNrLmxlbmd0aCAtIDEgXTsgfTsKKworICB3aGlsZSAoaHRtbCkgeworICAgIHRleHQgPSAnJzsKKyAgICBjaGFycyA9IHRydWU7CisKKyAgICAvLyBNYWtlIHN1cmUgd2UncmUgbm90IGluIGEgc2NyaXB0IG9yIHN0eWxlIGVsZW1lbnQKKyAgICBpZiAoIXN0YWNrLmxhc3QoKSB8fCAhc3BlY2lhbEVsZW1lbnRzWyBzdGFjay5sYXN0KCkgXSkgeworCisgICAgICAvLyBDb21tZW50CisgICAgICBpZiAoaHRtbC5pbmRleE9mKCI8IS0tIikgPT09IDApIHsKKyAgICAgICAgLy8gY29tbWVudHMgY29udGFpbmluZyAtLSBhcmUgbm90IGFsbG93ZWQgdW5sZXNzIHRoZXkgdGVybWluYXRlIHRoZSBjb21tZW50CisgICAgICAgIGluZGV4ID0gaHRtbC5pbmRleE9mKCItLSIsIDQpOworCisgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGh0bWwubGFzdEluZGV4T2YoIi0tPiIsIGluZGV4KSA9PT0gaW5kZXgpIHsKKyAgICAgICAgICBpZiAoaGFuZGxlci5jb21tZW50KSBoYW5kbGVyLmNvbW1lbnQoaHRtbC5zdWJzdHJpbmcoNCwgaW5kZXgpKTsKKyAgICAgICAgICBodG1sID0gaHRtbC5zdWJzdHJpbmcoaW5kZXggKyAzKTsKKyAgICAgICAgICBjaGFycyA9IGZhbHNlOworICAgICAgICB9CisgICAgICAvLyBET0NUWVBFCisgICAgICB9IGVsc2UgaWYgKERPQ1RZUEVfUkVHRVhQLnRlc3QoaHRtbCkpIHsKKyAgICAgICAgbWF0Y2ggPSBodG1sLm1hdGNoKERPQ1RZUEVfUkVHRVhQKTsKKworICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKG1hdGNoWzBdLCAnJyk7CisgICAgICAgICAgY2hhcnMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgLy8gZW5kIHRhZworICAgICAgfSBlbHNlIGlmIChCRUdJTkdfRU5EX1RBR0VfUkVHRVhQLnRlc3QoaHRtbCkpIHsKKyAgICAgICAgbWF0Y2ggPSBodG1sLm1hdGNoKEVORF9UQUdfUkVHRVhQKTsKKworICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICBodG1sID0gaHRtbC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTsKKyAgICAgICAgICBtYXRjaFswXS5yZXBsYWNlKEVORF9UQUdfUkVHRVhQLCBwYXJzZUVuZFRhZyk7CisgICAgICAgICAgY2hhcnMgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAvLyBzdGFydCB0YWcKKyAgICAgIH0gZWxzZSBpZiAoQkVHSU5fVEFHX1JFR0VYUC50ZXN0KGh0bWwpKSB7CisgICAgICAgIG1hdGNoID0gaHRtbC5tYXRjaChTVEFSVF9UQUdfUkVHRVhQKTsKKworICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAvLyBXZSBvbmx5IGhhdmUgYSB2YWxpZCBzdGFydC10YWcgaWYgdGhlcmUgaXMgYSAnPicuCisgICAgICAgICAgaWYgKG1hdGNoWzRdKSB7CisgICAgICAgICAgICBodG1sID0gaHRtbC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTsKKyAgICAgICAgICAgIG1hdGNoWzBdLnJlcGxhY2UoU1RBUlRfVEFHX1JFR0VYUCwgcGFyc2VTdGFydFRhZyk7CisgICAgICAgICAgfQorICAgICAgICAgIGNoYXJzID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gbm8gZW5kaW5nIHRhZyBmb3VuZCAtLS0gdGhpcyBwaWVjZSBzaG91bGQgYmUgZW5jb2RlZCBhcyBhbiBlbnRpdHkuCisgICAgICAgICAgdGV4dCArPSAnPCc7CisgICAgICAgICAgaHRtbCA9IGh0bWwuc3Vic3RyaW5nKDEpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChjaGFycykgeworICAgICAgICBpbmRleCA9IGh0bWwuaW5kZXhPZigiPCIpOworCisgICAgICAgIHRleHQgKz0gaW5kZXggPCAwID8gaHRtbCA6IGh0bWwuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgaHRtbCA9IGluZGV4IDwgMCA/ICIiIDogaHRtbC5zdWJzdHJpbmcoaW5kZXgpOworCisgICAgICAgIGlmIChoYW5kbGVyLmNoYXJzKSBoYW5kbGVyLmNoYXJzKGRlY29kZUVudGl0aWVzKHRleHQpKTsKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKG5ldyBSZWdFeHAoIiguKik8XFxzKlxcL1xccyoiICsgc3RhY2subGFzdCgpICsgIltePl0qPiIsICdpJyksCisgICAgICAgIGZ1bmN0aW9uKGFsbCwgdGV4dCkgeworICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoQ09NTUVOVF9SRUdFWFAsICIkMSIpLnJlcGxhY2UoQ0RBVEFfUkVHRVhQLCAiJDEiKTsKKworICAgICAgICAgIGlmIChoYW5kbGVyLmNoYXJzKSBoYW5kbGVyLmNoYXJzKGRlY29kZUVudGl0aWVzKHRleHQpKTsKKworICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgIH0pOworCisgICAgICBwYXJzZUVuZFRhZygiIiwgc3RhY2subGFzdCgpKTsKKyAgICB9CisKKyAgICBpZiAoaHRtbCA9PSBsYXN0KSB7CisgICAgICB0aHJvdyAkc2FuaXRpemVNaW5FcnIoJ2JhZHBhcnNlJywgIlRoZSBzYW5pdGl6ZXIgd2FzIHVuYWJsZSB0byBwYXJzZSB0aGUgZm9sbG93aW5nIGJsb2NrICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiBodG1sOiB7MH0iLCBodG1sKTsKKyAgICB9CisgICAgbGFzdCA9IGh0bWw7CisgIH0KKworICAvLyBDbGVhbiB1cCBhbnkgcmVtYWluaW5nIHRhZ3MKKyAgcGFyc2VFbmRUYWcoKTsKKworICBmdW5jdGlvbiBwYXJzZVN0YXJ0VGFnKHRhZywgdGFnTmFtZSwgcmVzdCwgdW5hcnkpIHsKKyAgICB0YWdOYW1lID0gYW5ndWxhci5sb3dlcmNhc2UodGFnTmFtZSk7CisgICAgaWYgKGJsb2NrRWxlbWVudHNbIHRhZ05hbWUgXSkgeworICAgICAgd2hpbGUgKHN0YWNrLmxhc3QoKSAmJiBpbmxpbmVFbGVtZW50c1sgc3RhY2subGFzdCgpIF0pIHsKKyAgICAgICAgcGFyc2VFbmRUYWcoIiIsIHN0YWNrLmxhc3QoKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGlvbmFsRW5kVGFnRWxlbWVudHNbIHRhZ05hbWUgXSAmJiBzdGFjay5sYXN0KCkgPT0gdGFnTmFtZSkgeworICAgICAgcGFyc2VFbmRUYWcoIiIsIHRhZ05hbWUpOworICAgIH0KKworICAgIHVuYXJ5ID0gdm9pZEVsZW1lbnRzWyB0YWdOYW1lIF0gfHwgISF1bmFyeTsKKworICAgIGlmICghdW5hcnkpCisgICAgICBzdGFjay5wdXNoKHRhZ05hbWUpOworCisgICAgdmFyIGF0dHJzID0ge307CisKKyAgICByZXN0LnJlcGxhY2UoQVRUUl9SRUdFWFAsCisgICAgICBmdW5jdGlvbihtYXRjaCwgbmFtZSwgZG91YmxlUXVvdGVkVmFsdWUsIHNpbmdsZVF1b3RlZFZhbHVlLCB1bnF1b3RlZFZhbHVlKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IGRvdWJsZVF1b3RlZFZhbHVlCisgICAgICAgICAgfHwgc2luZ2xlUXVvdGVkVmFsdWUKKyAgICAgICAgICB8fCB1bnF1b3RlZFZhbHVlCisgICAgICAgICAgfHwgJyc7CisKKyAgICAgICAgYXR0cnNbbmFtZV0gPSBkZWNvZGVFbnRpdGllcyh2YWx1ZSk7CisgICAgfSk7CisgICAgaWYgKGhhbmRsZXIuc3RhcnQpIGhhbmRsZXIuc3RhcnQodGFnTmFtZSwgYXR0cnMsIHVuYXJ5KTsKKyAgfQorCisgIGZ1bmN0aW9uIHBhcnNlRW5kVGFnKHRhZywgdGFnTmFtZSkgeworICAgIHZhciBwb3MgPSAwLCBpOworICAgIHRhZ05hbWUgPSBhbmd1bGFyLmxvd2VyY2FzZSh0YWdOYW1lKTsKKyAgICBpZiAodGFnTmFtZSkKKyAgICAgIC8vIEZpbmQgdGhlIGNsb3Nlc3Qgb3BlbmVkIHRhZyBvZiB0aGUgc2FtZSB0eXBlCisgICAgICBmb3IgKHBvcyA9IHN0YWNrLmxlbmd0aCAtIDE7IHBvcyA+PSAwOyBwb3MtLSkKKyAgICAgICAgaWYgKHN0YWNrWyBwb3MgXSA9PSB0YWdOYW1lKQorICAgICAgICAgIGJyZWFrOworCisgICAgaWYgKHBvcyA+PSAwKSB7CisgICAgICAvLyBDbG9zZSBhbGwgdGhlIG9wZW4gZWxlbWVudHMsIHVwIHRoZSBzdGFjaworICAgICAgZm9yIChpID0gc3RhY2subGVuZ3RoIC0gMTsgaSA+PSBwb3M7IGktLSkKKyAgICAgICAgaWYgKGhhbmRsZXIuZW5kKSBoYW5kbGVyLmVuZChzdGFja1sgaSBdKTsKKworICAgICAgLy8gUmVtb3ZlIHRoZSBvcGVuIGVsZW1lbnRzIGZyb20gdGhlIHN0YWNrCisgICAgICBzdGFjay5sZW5ndGggPSBwb3M7CisgICAgfQorICB9Cit9CisKK3ZhciBoaWRkZW5QcmU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicHJlIik7Cit2YXIgc3BhY2VSZSA9IC9eKFxzKikoW1xzXFNdKj8pKFxzKikkLzsKKy8qKgorICogZGVjb2RlcyBhbGwgZW50aXRpZXMgaW50byByZWd1bGFyIHN0cmluZworICogQHBhcmFtIHZhbHVlCisgKiBAcmV0dXJucyB7c3RyaW5nfSBBIHN0cmluZyB3aXRoIGRlY29kZWQgZW50aXRpZXMuCisgKi8KK2Z1bmN0aW9uIGRlY29kZUVudGl0aWVzKHZhbHVlKSB7CisgIGlmICghdmFsdWUpIHsgcmV0dXJuICcnOyB9CisKKyAgLy8gTm90ZTogSUU4IGRvZXMgbm90IHByZXNlcnZlIHNwYWNlcyBhdCB0aGUgc3RhcnQvZW5kIG9mIGlubmVySFRNTAorICAvLyBzbyB3ZSBtdXN0IGNhcHR1cmUgdGhlbSBhbmQgcmVhdHRhY2ggdGhlbSBhZnRlcndhcmQKKyAgdmFyIHBhcnRzID0gc3BhY2VSZS5leGVjKHZhbHVlKTsKKyAgdmFyIHNwYWNlQmVmb3JlID0gcGFydHNbMV07CisgIHZhciBzcGFjZUFmdGVyID0gcGFydHNbM107CisgIHZhciBjb250ZW50ID0gcGFydHNbMl07CisgIGlmIChjb250ZW50KSB7CisgICAgaGlkZGVuUHJlLmlubmVySFRNTD1jb250ZW50LnJlcGxhY2UoLzwvZywiJmx0OyIpOworICAgIC8vIGlubmVyVGV4dCBkZXBlbmRzIG9uIHN0eWxpbmcgYXMgaXQgZG9lc24ndCBkaXNwbGF5IGhpZGRlbiBlbGVtZW50cy4KKyAgICAvLyBUaGVyZWZvcmUsIGl0J3MgYmV0dGVyIHRvIHVzZSB0ZXh0Q29udGVudCBub3QgdG8gY2F1c2UgdW5uZWNlc3NhcnkKKyAgICAvLyByZWZsb3dzLiBIb3dldmVyLCBJRTw5IGRvbid0IHN1cHBvcnQgdGV4dENvbnRlbnQgc28gdGhlIGlubmVyVGV4dAorICAgIC8vIGZhbGxiYWNrIGlzIG5lY2Vzc2FyeS4KKyAgICBjb250ZW50ID0gJ3RleHRDb250ZW50JyBpbiBoaWRkZW5QcmUgPworICAgICAgaGlkZGVuUHJlLnRleHRDb250ZW50IDogaGlkZGVuUHJlLmlubmVyVGV4dDsKKyAgfQorICByZXR1cm4gc3BhY2VCZWZvcmUgKyBjb250ZW50ICsgc3BhY2VBZnRlcjsKK30KKworLyoqCisgKiBFc2NhcGVzIGFsbCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgY2hhcmFjdGVycywgc28gdGhhdCB0aGUKKyAqIHJlc3VsdGluZyBzdHJpbmcgY2FuIGJlIHNhZmVseSBpbnNlcnRlZCBpbnRvIGF0dHJpYnV0ZSBvcgorICogZWxlbWVudCB0ZXh0LgorICogQHBhcmFtIHZhbHVlCisgKiBAcmV0dXJucyB7c3RyaW5nfSBlc2NhcGVkIHRleHQKKyAqLworZnVuY3Rpb24gZW5jb2RlRW50aXRpZXModmFsdWUpIHsKKyAgcmV0dXJuIHZhbHVlLgorICAgIHJlcGxhY2UoLyYvZywgJyZhbXA7JykuCisgICAgcmVwbGFjZShTVVJST0dBVEVfUEFJUl9SRUdFWFAsIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICB2YXIgaGkgPSB2YWx1ZS5jaGFyQ29kZUF0KDApOworICAgICAgdmFyIGxvdyA9IHZhbHVlLmNoYXJDb2RlQXQoMSk7CisgICAgICByZXR1cm4gJyYjJyArICgoKGhpIC0gMHhEODAwKSAqIDB4NDAwKSArIChsb3cgLSAweERDMDApICsgMHgxMDAwMCkgKyAnOyc7CisgICAgfSkuCisgICAgcmVwbGFjZShOT05fQUxQSEFOVU1FUklDX1JFR0VYUCwgZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIHJldHVybiAnJiMnICsgdmFsdWUuY2hhckNvZGVBdCgwKSArICc7JzsKKyAgICB9KS4KKyAgICByZXBsYWNlKC88L2csICcmbHQ7JykuCisgICAgcmVwbGFjZSgvPi9nLCAnJmd0OycpOworfQorCisvKioKKyAqIGNyZWF0ZSBhbiBIVE1ML1hNTCB3cml0ZXIgd2hpY2ggd3JpdGVzIHRvIGJ1ZmZlcgorICogQHBhcmFtIHtBcnJheX0gYnVmIHVzZSBidWYuamFpbignJykgdG8gZ2V0IG91dCBzYW5pdGl6ZWQgaHRtbCBzdHJpbmcKKyAqIEByZXR1cm5zIHtvYmplY3R9IGluIHRoZSBmb3JtIG9mIHsKKyAqICAgICBzdGFydDogZnVuY3Rpb24odGFnLCBhdHRycywgdW5hcnkpIHt9LAorICogICAgIGVuZDogZnVuY3Rpb24odGFnKSB7fSwKKyAqICAgICBjaGFyczogZnVuY3Rpb24odGV4dCkge30sCisgKiAgICAgY29tbWVudDogZnVuY3Rpb24odGV4dCkge30KKyAqIH0KKyAqLworZnVuY3Rpb24gaHRtbFNhbml0aXplV3JpdGVyKGJ1ZiwgdXJpVmFsaWRhdG9yKSB7CisgIHZhciBpZ25vcmUgPSBmYWxzZTsKKyAgdmFyIG91dCA9IGFuZ3VsYXIuYmluZChidWYsIGJ1Zi5wdXNoKTsKKyAgcmV0dXJuIHsKKyAgICBzdGFydDogZnVuY3Rpb24odGFnLCBhdHRycywgdW5hcnkpIHsKKyAgICAgIHRhZyA9IGFuZ3VsYXIubG93ZXJjYXNlKHRhZyk7CisgICAgICBpZiAoIWlnbm9yZSAmJiBzcGVjaWFsRWxlbWVudHNbdGFnXSkgeworICAgICAgICBpZ25vcmUgPSB0YWc7CisgICAgICB9CisgICAgICBpZiAoIWlnbm9yZSAmJiB2YWxpZEVsZW1lbnRzW3RhZ10gPT09IHRydWUpIHsKKyAgICAgICAgb3V0KCc8Jyk7CisgICAgICAgIG91dCh0YWcpOworICAgICAgICBhbmd1bGFyLmZvckVhY2goYXR0cnMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKKyAgICAgICAgICB2YXIgbGtleT1hbmd1bGFyLmxvd2VyY2FzZShrZXkpOworICAgICAgICAgIHZhciBpc0ltYWdlID0gKHRhZyA9PT0gJ2ltZycgJiYgbGtleSA9PT0gJ3NyYycpIHx8IChsa2V5ID09PSAnYmFja2dyb3VuZCcpOworICAgICAgICAgIGlmICh2YWxpZEF0dHJzW2xrZXldID09PSB0cnVlICYmCisgICAgICAgICAgICAodXJpQXR0cnNbbGtleV0gIT09IHRydWUgfHwgdXJpVmFsaWRhdG9yKHZhbHVlLCBpc0ltYWdlKSkpIHsKKyAgICAgICAgICAgIG91dCgnICcpOworICAgICAgICAgICAgb3V0KGtleSk7CisgICAgICAgICAgICBvdXQoJz0iJyk7CisgICAgICAgICAgICBvdXQoZW5jb2RlRW50aXRpZXModmFsdWUpKTsKKyAgICAgICAgICAgIG91dCgnIicpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG91dCh1bmFyeSA/ICcvPicgOiAnPicpOworICAgICAgfQorICAgIH0sCisgICAgZW5kOiBmdW5jdGlvbih0YWcpIHsKKyAgICAgICAgdGFnID0gYW5ndWxhci5sb3dlcmNhc2UodGFnKTsKKyAgICAgICAgaWYgKCFpZ25vcmUgJiYgdmFsaWRFbGVtZW50c1t0YWddID09PSB0cnVlKSB7CisgICAgICAgICAgb3V0KCc8LycpOworICAgICAgICAgIG91dCh0YWcpOworICAgICAgICAgIG91dCgnPicpOworICAgICAgICB9CisgICAgICAgIGlmICh0YWcgPT0gaWdub3JlKSB7CisgICAgICAgICAgaWdub3JlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgY2hhcnM6IGZ1bmN0aW9uKGNoYXJzKSB7CisgICAgICAgIGlmICghaWdub3JlKSB7CisgICAgICAgICAgb3V0KGVuY29kZUVudGl0aWVzKGNoYXJzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgfTsKK30KKworCisvLyBkZWZpbmUgbmdTYW5pdGl6ZSBtb2R1bGUgYW5kIHJlZ2lzdGVyICRzYW5pdGl6ZSBzZXJ2aWNlCithbmd1bGFyLm1vZHVsZSgnbmdTYW5pdGl6ZScsIFtdKS5wcm92aWRlcignJHNhbml0aXplJywgJFNhbml0aXplUHJvdmlkZXIpOworCisvKiBnbG9iYWwgc2FuaXRpemVUZXh0OiBmYWxzZSAqLworCisvKioKKyAqIEBuZ2RvYyBmaWx0ZXIKKyAqIEBuYW1lIGxpbmt5CisgKiBAa2luZCBmdW5jdGlvbgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogRmluZHMgbGlua3MgaW4gdGV4dCBpbnB1dCBhbmQgdHVybnMgdGhlbSBpbnRvIGh0bWwgbGlua3MuIFN1cHBvcnRzIGh0dHAvaHR0cHMvZnRwL21haWx0byBhbmQKKyAqIHBsYWluIGVtYWlsIGFkZHJlc3MgbGlua3MuCisgKgorICogUmVxdWlyZXMgdGhlIHtAbGluayBuZ1Nhbml0aXplIGBuZ1Nhbml0aXplYH0gbW9kdWxlIHRvIGJlIGluc3RhbGxlZC4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBJbnB1dCB0ZXh0LgorICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCBXaW5kb3cgKF9ibGFua3xfc2VsZnxfcGFyZW50fF90b3ApIG9yIG5hbWVkIGZyYW1lIHRvIG9wZW4gbGlua3MgaW4uCisgKiBAcmV0dXJucyB7c3RyaW5nfSBIdG1sLWxpbmtpZmllZCB0ZXh0LgorICoKKyAqIEB1c2FnZQorICAgPHNwYW4gbmctYmluZC1odG1sPSJsaW5reV9leHByZXNzaW9uIHwgbGlua3kiPjwvc3Bhbj4KKyAqCisgKiBAZXhhbXBsZQorICAgPGV4YW1wbGUgbW9kdWxlPSJsaW5reUV4YW1wbGUiIGRlcHM9ImFuZ3VsYXItc2FuaXRpemUuanMiPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8c2NyaXB0PgorICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2xpbmt5RXhhbXBsZScsIFsnbmdTYW5pdGl6ZSddKQorICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgICAgICAgICRzY29wZS5zbmlwcGV0ID0KKyAgICAgICAgICAgICAgICdQcmV0dHkgdGV4dCB3aXRoIHNvbWUgbGlua3M6XG4nKworICAgICAgICAgICAgICAgJ2h0dHA6Ly9hbmd1bGFyanMub3JnLyxcbicrCisgICAgICAgICAgICAgICAnbWFpbHRvOnVzQHNvbWV3aGVyZS5vcmcsXG4nKworICAgICAgICAgICAgICAgJ2Fub3RoZXJAc29tZXdoZXJlLm9yZyxcbicrCisgICAgICAgICAgICAgICAnYW5kIG9uZSBtb3JlOiBmdHA6Ly8xMjcuMC4wLjEvLic7CisgICAgICAgICAgICAgJHNjb3BlLnNuaXBwZXRXaXRoVGFyZ2V0ID0gJ2h0dHA6Ly9hbmd1bGFyanMub3JnLyc7CisgICAgICAgICAgIH1dKTsKKyAgICAgICA8L3NjcmlwdD4KKyAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KKyAgICAgICBTbmlwcGV0OiA8dGV4dGFyZWEgbmctbW9kZWw9InNuaXBwZXQiIGNvbHM9IjYwIiByb3dzPSIzIj48L3RleHRhcmVhPgorICAgICAgIDx0YWJsZT4KKyAgICAgICAgIDx0cj4KKyAgICAgICAgICAgPHRkPkZpbHRlcjwvdGQ+CisgICAgICAgICAgIDx0ZD5Tb3VyY2U8L3RkPgorICAgICAgICAgICA8dGQ+UmVuZGVyZWQ8L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgICAgIDx0ciBpZD0ibGlua3ktZmlsdGVyIj4KKyAgICAgICAgICAgPHRkPmxpbmt5IGZpbHRlcjwvdGQ+CisgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICA8cHJlPiZsdDtkaXYgbmctYmluZC1odG1sPSJzbmlwcGV0IHwgbGlua3kiJmd0Ozxicj4mbHQ7L2RpdiZndDs8L3ByZT4KKyAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgIDxkaXYgbmctYmluZC1odG1sPSJzbmlwcGV0IHwgbGlua3kiPjwvZGl2PgorICAgICAgICAgICA8L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgICAgIDx0ciBpZD0ibGlua3ktdGFyZ2V0Ij4KKyAgICAgICAgICA8dGQ+bGlua3kgdGFyZ2V0PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8cHJlPiZsdDtkaXYgbmctYmluZC1odG1sPSJzbmlwcGV0V2l0aFRhcmdldCB8IGxpbmt5OidfYmxhbmsnIiZndDs8YnI+Jmx0Oy9kaXYmZ3Q7PC9wcmU+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8ZGl2IG5nLWJpbmQtaHRtbD0ic25pcHBldFdpdGhUYXJnZXQgfCBsaW5reTonX2JsYW5rJyI+PC9kaXY+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgIDwvdHI+CisgICAgICAgICA8dHIgaWQ9ImVzY2FwZWQtaHRtbCI+CisgICAgICAgICAgIDx0ZD5ubyBmaWx0ZXI8L3RkPgorICAgICAgICAgICA8dGQ+PHByZT4mbHQ7ZGl2IG5nLWJpbmQ9InNuaXBwZXQiJmd0Ozxicj4mbHQ7L2RpdiZndDs8L3ByZT48L3RkPgorICAgICAgICAgICA8dGQ+PGRpdiBuZy1iaW5kPSJzbmlwcGV0Ij48L2Rpdj48L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgICA8L3RhYmxlPgorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIGl0KCdzaG91bGQgbGlua2lmeSB0aGUgc25pcHBldCB3aXRoIHVybHMnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5reS1maWx0ZXInKSkuZWxlbWVudChieS5iaW5kaW5nKCdzbmlwcGV0IHwgbGlua3knKSkuZ2V0VGV4dCgpKS4KKyAgICAgICAgICAgICB0b0JlKCdQcmV0dHkgdGV4dCB3aXRoIHNvbWUgbGlua3M6IGh0dHA6Ly9hbmd1bGFyanMub3JnLywgdXNAc29tZXdoZXJlLm9yZywgJyArCisgICAgICAgICAgICAgICAgICAnYW5vdGhlckBzb21ld2hlcmUub3JnLCBhbmQgb25lIG1vcmU6IGZ0cDovLzEyNy4wLjAuMS8uJyk7CisgICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwoYnkuY3NzKCcjbGlua3ktZmlsdGVyIGEnKSkuY291bnQoKSkudG9FcXVhbCg0KTsKKyAgICAgICB9KTsKKworICAgICAgIGl0KCdzaG91bGQgbm90IGxpbmtpZnkgc25pcHBldCB3aXRob3V0IHRoZSBsaW5reSBmaWx0ZXInLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdlc2NhcGVkLWh0bWwnKSkuZWxlbWVudChieS5iaW5kaW5nKCdzbmlwcGV0JykpLmdldFRleHQoKSkuCisgICAgICAgICAgICAgdG9CZSgnUHJldHR5IHRleHQgd2l0aCBzb21lIGxpbmtzOiBodHRwOi8vYW5ndWxhcmpzLm9yZy8sIG1haWx0bzp1c0Bzb21ld2hlcmUub3JnLCAnICsKKyAgICAgICAgICAgICAgICAgICdhbm90aGVyQHNvbWV3aGVyZS5vcmcsIGFuZCBvbmUgbW9yZTogZnRwOi8vMTI3LjAuMC4xLy4nKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50LmFsbChieS5jc3MoJyNlc2NhcGVkLWh0bWwgYScpKS5jb3VudCgpKS50b0VxdWFsKDApOworICAgICAgIH0pOworCisgICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3NuaXBwZXQnKSkuY2xlYXIoKTsKKyAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3NuaXBwZXQnKSkuc2VuZEtleXMoJ25ldyBodHRwOi8vbGluay4nKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5reS1maWx0ZXInKSkuZWxlbWVudChieS5iaW5kaW5nKCdzbmlwcGV0IHwgbGlua3knKSkuZ2V0VGV4dCgpKS4KKyAgICAgICAgICAgICB0b0JlKCduZXcgaHR0cDovL2xpbmsuJyk7CisgICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwoYnkuY3NzKCcjbGlua3ktZmlsdGVyIGEnKSkuY291bnQoKSkudG9FcXVhbCgxKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdlc2NhcGVkLWh0bWwnKSkuZWxlbWVudChieS5iaW5kaW5nKCdzbmlwcGV0JykpLmdldFRleHQoKSkKKyAgICAgICAgICAgICAudG9CZSgnbmV3IGh0dHA6Ly9saW5rLicpOworICAgICAgIH0pOworCisgICAgICAgaXQoJ3Nob3VsZCB3b3JrIHdpdGggdGhlIHRhcmdldCBwcm9wZXJ0eScsIGZ1bmN0aW9uKCkgeworICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGlua3ktdGFyZ2V0JykpLgorICAgICAgICAgICAgZWxlbWVudChieS5iaW5kaW5nKCJzbmlwcGV0V2l0aFRhcmdldCB8IGxpbmt5OidfYmxhbmsnIikpLmdldFRleHQoKSkuCisgICAgICAgICAgICB0b0JlKCdodHRwOi8vYW5ndWxhcmpzLm9yZy8nKTsKKyAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcjbGlua3ktdGFyZ2V0IGEnKSkuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKSkudG9FcXVhbCgnX2JsYW5rJyk7CisgICAgICAgfSk7CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLworYW5ndWxhci5tb2R1bGUoJ25nU2FuaXRpemUnKS5maWx0ZXIoJ2xpbmt5JywgWyckc2FuaXRpemUnLCBmdW5jdGlvbigkc2FuaXRpemUpIHsKKyAgdmFyIExJTktZX1VSTF9SRUdFWFAgPQorICAgICAgICAvKChmdHB8aHR0cHM/KTpcL1wvfCh3d3dcLil8KG1haWx0bzopP1tBLVphLXowLTkuXyUrLV0rQClcUypbXlxzLjssKCl7fTw+IuKAneI/mV0vLAorICAgICAgTUFJTFRPX1JFR0VYUCA9IC9ebWFpbHRvOi87CisKKyAgcmV0dXJuIGZ1bmN0aW9uKHRleHQsIHRhcmdldCkgeworICAgIGlmICghdGV4dCkgcmV0dXJuIHRleHQ7CisgICAgdmFyIG1hdGNoOworICAgIHZhciByYXcgPSB0ZXh0OworICAgIHZhciBodG1sID0gW107CisgICAgdmFyIHVybDsKKyAgICB2YXIgaTsKKyAgICB3aGlsZSAoKG1hdGNoID0gcmF3Lm1hdGNoKExJTktZX1VSTF9SRUdFWFApKSkgeworICAgICAgLy8gV2UgY2FuIG5vdCBlbmQgaW4gdGhlc2UgYXMgdGhleSBhcmUgc29tZXRpbWVzIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIHNlbnRlbmNlCisgICAgICB1cmwgPSBtYXRjaFswXTsKKyAgICAgIC8vIGlmIHdlIGRpZCBub3QgbWF0Y2ggZnRwL2h0dHAvd3d3L21haWx0byB0aGVuIGFzc3VtZSBtYWlsdG8KKyAgICAgIGlmICghbWF0Y2hbMl0gJiYgIW1hdGNoWzRdKSB7CisgICAgICAgIHVybCA9IChtYXRjaFszXSA/ICdodHRwOi8vJyA6ICdtYWlsdG86JykgKyB1cmw7CisgICAgICB9CisgICAgICBpID0gbWF0Y2guaW5kZXg7CisgICAgICBhZGRUZXh0KHJhdy5zdWJzdHIoMCwgaSkpOworICAgICAgYWRkTGluayh1cmwsIG1hdGNoWzBdLnJlcGxhY2UoTUFJTFRPX1JFR0VYUCwgJycpKTsKKyAgICAgIHJhdyA9IHJhdy5zdWJzdHJpbmcoaSArIG1hdGNoWzBdLmxlbmd0aCk7CisgICAgfQorICAgIGFkZFRleHQocmF3KTsKKyAgICByZXR1cm4gJHNhbml0aXplKGh0bWwuam9pbignJykpOworCisgICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0KSB7CisgICAgICBpZiAoIXRleHQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaHRtbC5wdXNoKHNhbml0aXplVGV4dCh0ZXh0KSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gYWRkTGluayh1cmwsIHRleHQpIHsKKyAgICAgIGh0bWwucHVzaCgnPGEgJyk7CisgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQodGFyZ2V0KSkgeworICAgICAgICBodG1sLnB1c2goJ3RhcmdldD0iJywKKyAgICAgICAgICAgICAgICAgIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICciICcpOworICAgICAgfQorICAgICAgaHRtbC5wdXNoKCdocmVmPSInLAorICAgICAgICAgICAgICAgIHVybC5yZXBsYWNlKC8iL2csICcmcXVvdDsnKSwKKyAgICAgICAgICAgICAgICAnIj4nKTsKKyAgICAgIGFkZFRleHQodGV4dCk7CisgICAgICBodG1sLnB1c2goJzwvYT4nKTsKKyAgICB9CisgIH07Cit9XSk7CisKKworfSkod2luZG93LCB3aW5kb3cuYW5ndWxhcik7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9hbmd1bGFyLXNhbml0aXplLm1pbi5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItc2FuaXRpemUubWluLmpzCmluZGV4IGQ1ZDcyYzQuLmU2NTdjNWIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItc2FuaXRpemUubWluLmpzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXItc2FuaXRpemUubWluLmpzCkBAIC0xLDM5ICsxLDM5IEBACi0vKg0KLVRoZSBNSVQgTGljZW5zZQ0KLQ0KLUNvcHlyaWdodCAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZw0KLQ0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkNCi1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCi10byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KLQ0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQotQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTg0KLVRIRSBTT0ZUV0FSRS4NCi0qLw0KLS8qDQotIEFuZ3VsYXJKUyB2MS4zLjgNCi0gKGMpIDIwMTAtMjAxNCBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmcNCi0gTGljZW5zZTogTUlUDQotKi8NCi0oZnVuY3Rpb24obixoLHApeyd1c2Ugc3RyaWN0JztmdW5jdGlvbiBFKGEpe3ZhciBkPVtdO3MoZCxoLm5vb3ApLmNoYXJzKGEpO3JldHVybiBkLmpvaW4oIiIpfWZ1bmN0aW9uIGcoYSl7dmFyIGQ9e307YT1hLnNwbGl0KCIsIik7dmFyIGM7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dPSEwO3JldHVybiBkfWZ1bmN0aW9uIEYoYSxkKXtmdW5jdGlvbiBjKGEsYixjLGwpe2I9aC5sb3dlcmNhc2UoYik7aWYodFtiXSlmb3IoO2YubGFzdCgpJiZ1W2YubGFzdCgpXTspZSgiIixmLmxhc3QoKSk7dltiXSYmZi5sYXN0KCk9PWImJmUoIiIsYik7KGw9d1tiXXx8ISFsKXx8Zi5wdXNoKGIpO3ZhciBtPXt9O2MucmVwbGFjZShHLGZ1bmN0aW9uKGEsYixkLGMsZSl7bVtiXT1yKGR8fGN8fGV8fCIiKX0pO2Quc3RhcnQmJmQuc3RhcnQoYixtLGwpfWZ1bmN0aW9uIGUoYSxiKXt2YXIgYz0wLGU7aWYoYj1oLmxvd2VyY2FzZShiKSlmb3IoYz1mLmxlbmd0aC0xOzA8PWMmJmZbY10hPWI7Yy0tKTsNCi1pZigwPD1jKXtmb3IoZT1mLmxlbmd0aC0xO2U+PWM7ZS0tKWQuZW5kJiZkLmVuZChmW2VdKTtmLmxlbmd0aD1jfX0ic3RyaW5nIiE9PXR5cGVvZiBhJiYoYT1udWxsPT09YXx8InVuZGVmaW5lZCI9PT10eXBlb2YgYT8iIjoiIithKTt2YXIgYixrLGY9W10sbT1hLGw7Zm9yKGYubGFzdD1mdW5jdGlvbigpe3JldHVybiBmW2YubGVuZ3RoLTFdfTthOyl7bD0iIjtrPSEwO2lmKGYubGFzdCgpJiZ4W2YubGFzdCgpXSlhPWEucmVwbGFjZShuZXcgUmVnRXhwKCIoLiopPFxccypcXC9cXHMqIitmLmxhc3QoKSsiW14+XSo+IiwiaSIpLGZ1bmN0aW9uKGEsYil7Yj1iLnJlcGxhY2UoSCwiJDEiKS5yZXBsYWNlKEksIiQxIik7ZC5jaGFycyYmZC5jaGFycyhyKGIpKTtyZXR1cm4iIn0pLGUoIiIsZi5sYXN0KCkpO2Vsc2V7aWYoMD09PWEuaW5kZXhPZigiXHgzYyEtLSIpKWI9YS5pbmRleE9mKCItLSIsNCksMDw9YiYmYS5sYXN0SW5kZXhPZigiLS1ceDNlIixiKT09PWImJihkLmNvbW1lbnQmJmQuY29tbWVudChhLnN1YnN0cmluZyg0LA0KLWIpKSxhPWEuc3Vic3RyaW5nKGIrMyksaz0hMSk7ZWxzZSBpZih5LnRlc3QoYSkpe2lmKGI9YS5tYXRjaCh5KSlhPWEucmVwbGFjZShiWzBdLCIiKSxrPSExfWVsc2UgaWYoSi50ZXN0KGEpKXtpZihiPWEubWF0Y2goeikpYT1hLnN1YnN0cmluZyhiWzBdLmxlbmd0aCksYlswXS5yZXBsYWNlKHosZSksaz0hMX1lbHNlIEsudGVzdChhKSYmKChiPWEubWF0Y2goQSkpPyhiWzRdJiYoYT1hLnN1YnN0cmluZyhiWzBdLmxlbmd0aCksYlswXS5yZXBsYWNlKEEsYykpLGs9ITEpOihsKz0iPCIsYT1hLnN1YnN0cmluZygxKSkpO2smJihiPWEuaW5kZXhPZigiPCIpLGwrPTA+Yj9hOmEuc3Vic3RyaW5nKDAsYiksYT0wPmI/IiI6YS5zdWJzdHJpbmcoYiksZC5jaGFycyYmZC5jaGFycyhyKGwpKSl9aWYoYT09bSl0aHJvdyBMKCJiYWRwYXJzZSIsYSk7bT1hfWUoKX1mdW5jdGlvbiByKGEpe2lmKCFhKXJldHVybiIiO3ZhciBkPU0uZXhlYyhhKTthPWRbMV07dmFyIGM9ZFszXTtpZihkPWRbMl0pcS5pbm5lckhUTUw9DQotZC5yZXBsYWNlKC88L2csIiZsdDsiKSxkPSJ0ZXh0Q29udGVudCJpbiBxP3EudGV4dENvbnRlbnQ6cS5pbm5lclRleHQ7cmV0dXJuIGErZCtjfWZ1bmN0aW9uIEIoYSl7cmV0dXJuIGEucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoTixmdW5jdGlvbihhKXt2YXIgYz1hLmNoYXJDb2RlQXQoMCk7YT1hLmNoYXJDb2RlQXQoMSk7cmV0dXJuIiYjIisoMTAyNCooYy01NTI5NikrKGEtNTYzMjApKzY1NTM2KSsiOyJ9KS5yZXBsYWNlKE8sZnVuY3Rpb24oYSl7cmV0dXJuIiYjIithLmNoYXJDb2RlQXQoMCkrIjsifSkucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7Iil9ZnVuY3Rpb24gcyhhLGQpe3ZhciBjPSExLGU9aC5iaW5kKGEsYS5wdXNoKTtyZXR1cm57c3RhcnQ6ZnVuY3Rpb24oYSxrLGYpe2E9aC5sb3dlcmNhc2UoYSk7IWMmJnhbYV0mJihjPWEpO2N8fCEwIT09Q1thXXx8KGUoIjwiKSxlKGEpLGguZm9yRWFjaChrLGZ1bmN0aW9uKGMsZil7dmFyIGs9DQotaC5sb3dlcmNhc2UoZiksZz0iaW1nIj09PWEmJiJzcmMiPT09a3x8ImJhY2tncm91bmQiPT09azshMCE9PVBba118fCEwPT09RFtrXSYmIWQoYyxnKXx8KGUoIiAiKSxlKGYpLGUoJz0iJyksZShCKGMpKSxlKCciJykpfSksZShmPyIvPiI6Ij4iKSl9LGVuZDpmdW5jdGlvbihhKXthPWgubG93ZXJjYXNlKGEpO2N8fCEwIT09Q1thXXx8KGUoIjwvIiksZShhKSxlKCI+IikpO2E9PWMmJihjPSExKX0sY2hhcnM6ZnVuY3Rpb24oYSl7Y3x8ZShCKGEpKX19fXZhciBMPWguJCRtaW5FcnIoIiRzYW5pdGl6ZSIpLEE9L148KCg/OlthLXpBLVpdKVtcdzotXSopKCg/OlxzK1tcdzotXSsoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKihcLz8pXHMqKD4/KS8sej0vXjxcL1xzKihbXHc6LV0rKVtePl0qPi8sRz0vKFtcdzotXSspKD86XHMqPVxzKig/Oig/OiIoKD86W14iXSkqKSIpfCg/OicoKD86W14nXSkqKScpfChbXj5cc10rKSkpPy9nLEs9L148LywNCi1KPS9ePFwvLyxIPS9ceDNjIS0tKC4qPyktLVx4M2UvZyx5PS88IURPQ1RZUEUoW14+XSo/KT4vaSxJPS88IVxbQ0RBVEFcWyguKj8pXV1ceDNlL2csTj0vW1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdL2csTz0vKFteXCMtfnwgfCFdKS9nLHc9ZygiYXJlYSxicixjb2wsaHIsaW1nLHdiciIpO249ZygiY29sZ3JvdXAsZGQsZHQsbGkscCx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCx0ciIpO3A9ZygicnAscnQiKTt2YXIgdj1oLmV4dGVuZCh7fSxwLG4pLHQ9aC5leHRlbmQoe30sbixnKCJhZGRyZXNzLGFydGljbGUsYXNpZGUsYmxvY2txdW90ZSxjYXB0aW9uLGNlbnRlcixkZWwsZGlyLGRpdixkbCxmaWd1cmUsZmlnY2FwdGlvbixmb290ZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGVhZGVyLGhncm91cCxocixpbnMsbWFwLG1lbnUsbmF2LG9sLHByZSxzY3JpcHQsc2VjdGlvbix0YWJsZSx1bCIpKSx1PWguZXh0ZW5kKHt9LHAsZygiYSxhYmJyLGFjcm9ueW0sYixiZGksYmRvLGJpZyxicixjaXRlLGNvZGUsZGVsLGRmbixlbSxmb250LGksaW1nLGlucyxrYmQsbGFiZWwsbWFwLG1hcmsscSxydWJ5LHJwLHJ0LHMsc2FtcCxzbWFsbCxzcGFuLHN0cmlrZSxzdHJvbmcsc3ViLHN1cCx0aW1lLHR0LHUsdmFyIikpOw0KLW49ZygiYW5pbWF0ZSxhbmltYXRlQ29sb3IsYW5pbWF0ZU1vdGlvbixhbmltYXRlVHJhbnNmb3JtLGNpcmNsZSxkZWZzLGRlc2MsZWxsaXBzZSxmb250LWZhY2UsZm9udC1mYWNlLW5hbWUsZm9udC1mYWNlLXNyYyxnLGdseXBoLGhrZXJuLGltYWdlLGxpbmVhckdyYWRpZW50LGxpbmUsbWFya2VyLG1ldGFkYXRhLG1pc3NpbmctZ2x5cGgsbXBhdGgscGF0aCxwb2x5Z29uLHBvbHlsaW5lLHJhZGlhbEdyYWRpZW50LHJlY3Qsc2V0LHN0b3Asc3ZnLHN3aXRjaCx0ZXh0LHRpdGxlLHRzcGFuLHVzZSIpO3ZhciB4PWcoInNjcmlwdCxzdHlsZSIpLEM9aC5leHRlbmQoe30sdyx0LHUsdixuKSxEPWcoImJhY2tncm91bmQsY2l0ZSxocmVmLGxvbmdkZXNjLHNyYyx1c2VtYXAseGxpbms6aHJlZiIpO249ZygiYWJicixhbGlnbixhbHQsYXhpcyxiZ2NvbG9yLGJvcmRlcixjZWxscGFkZGluZyxjZWxsc3BhY2luZyxjbGFzcyxjbGVhcixjb2xvcixjb2xzLGNvbHNwYW4sY29tcGFjdCxjb29yZHMsZGlyLGZhY2UsaGVhZGVycyxoZWlnaHQsaHJlZmxhbmcsaHNwYWNlLGlzbWFwLGxhbmcsbGFuZ3VhZ2Usbm9ocmVmLG5vd3JhcCxyZWwscmV2LHJvd3Mscm93c3BhbixydWxlcyxzY29wZSxzY3JvbGxpbmcsc2hhcGUsc2l6ZSxzcGFuLHN0YXJ0LHN1bW1hcnksdGFyZ2V0LHRpdGxlLHR5cGUsdmFsaWduLHZhbHVlLHZzcGFjZSx3aWR0aCIpOw0KLXA9ZygiYWNjZW50LWhlaWdodCxhY2N1bXVsYXRlLGFkZGl0aXZlLGFscGhhYmV0aWMsYXJhYmljLWZvcm0sYXNjZW50LGF0dHJpYnV0ZU5hbWUsYXR0cmlidXRlVHlwZSxiYXNlUHJvZmlsZSxiYm94LGJlZ2luLGJ5LGNhbGNNb2RlLGNhcC1oZWlnaHQsY2xhc3MsY29sb3IsY29sb3ItcmVuZGVyaW5nLGNvbnRlbnQsY3gsY3ksZCxkeCxkeSxkZXNjZW50LGRpc3BsYXksZHVyLGVuZCxmaWxsLGZpbGwtcnVsZSxmb250LWZhbWlseSxmb250LXNpemUsZm9udC1zdHJldGNoLGZvbnQtc3R5bGUsZm9udC12YXJpYW50LGZvbnQtd2VpZ2h0LGZyb20sZngsZnksZzEsZzIsZ2x5cGgtbmFtZSxncmFkaWVudFVuaXRzLGhhbmdpbmcsaGVpZ2h0LGhvcml6LWFkdi14LGhvcml6LW9yaWdpbi14LGlkZW9ncmFwaGljLGssa2V5UG9pbnRzLGtleVNwbGluZXMsa2V5VGltZXMsbGFuZyxtYXJrZXItZW5kLG1hcmtlci1taWQsbWFya2VyLXN0YXJ0LG1hcmtlckhlaWdodCxtYXJrZXJVbml0cyxtYXJrZXJXaWR0aCxtYXRoZW1hdGljYWwsbWF4LG1pbixvZmZzZXQsb3BhY2l0eSxvcmllbnQsb3JpZ2luLG92ZXJsaW5lLXBvc2l0aW9uLG92ZXJsaW5lLXRoaWNrbmVzcyxwYW5vc2UtMSxwYXRoLHBhdGhMZW5ndGgscG9pbnRzLHByZXNlcnZlQXNwZWN0UmF0aW8scixyZWZYLHJlZlkscmVwZWF0Q291bnQscmVwZWF0RHVyLHJlcXVpcmVkRXh0ZW5zaW9ucyxyZXF1aXJlZEZlYXR1cmVzLHJlc3RhcnQscm90YXRlLHJ4LHJ5LHNsb3BlLHN0ZW1oLHN0ZW12LHN0b3AtY29sb3Isc3RvcC1vcGFjaXR5LHN0cmlrZXRocm91Z2gtcG9zaXRpb24sc3RyaWtldGhyb3VnaC10aGlja25lc3Msc3Ryb2tlLHN0cm9rZS1kYXNoYXJyYXksc3Ryb2tlLWRhc2hvZmZzZXQsc3Ryb2tlLWxpbmVjYXAsc3Ryb2tlLWxpbmVqb2luLHN0cm9rZS1taXRlcmxpbWl0LHN0cm9rZS1vcGFjaXR5LHN0cm9rZS13aWR0aCxzeXN0ZW1MYW5ndWFnZSx0YXJnZXQsdGV4dC1hbmNob3IsdG8sdHJhbnNmb3JtLHR5cGUsdTEsdTIsdW5kZXJsaW5lLXBvc2l0aW9uLHVuZGVybGluZS10aGlja25lc3MsdW5pY29kZSx1bmljb2RlLXJhbmdlLHVuaXRzLXBlci1lbSx2YWx1ZXMsdmVyc2lvbix2aWV3Qm94LHZpc2liaWxpdHksd2lkdGgsd2lkdGhzLHgseC1oZWlnaHQseDEseDIseGxpbms6YWN0dWF0ZSx4bGluazphcmNyb2xlLHhsaW5rOnJvbGUseGxpbms6c2hvdyx4bGluazp0aXRsZSx4bGluazp0eXBlLHhtbDpiYXNlLHhtbDpsYW5nLHhtbDpzcGFjZSx4bWxucyx4bWxuczp4bGluayx5LHkxLHkyLHpvb21BbmRQYW4iKTsNCi12YXIgUD1oLmV4dGVuZCh7fSxELHAsbikscT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwcmUiKSxNPS9eKFxzKikoW1xzXFNdKj8pKFxzKikkLztoLm1vZHVsZSgibmdTYW5pdGl6ZSIsW10pLnByb3ZpZGVyKCIkc2FuaXRpemUiLGZ1bmN0aW9uKCl7dGhpcy4kZ2V0PVsiJCRzYW5pdGl6ZVVyaSIsZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBjPVtdO0YoZCxzKGMsZnVuY3Rpb24oYyxiKXtyZXR1cm4hL151bnNhZmUvLnRlc3QoYShjLGIpKX0pKTtyZXR1cm4gYy5qb2luKCIiKX19XX0pO2gubW9kdWxlKCJuZ1Nhbml0aXplIikuZmlsdGVyKCJsaW5reSIsWyIkc2FuaXRpemUiLGZ1bmN0aW9uKGEpe3ZhciBkPS8oKGZ0cHxodHRwcz8pOlwvXC98KHd3d1wuKXwobWFpbHRvOik/W0EtWmEtejAtOS5fJSstXStAKVxTKlteXHMuOywoKXt9PD4iXHUyMDFkXHUyMDE5XS8sYz0vXm1haWx0bzovO3JldHVybiBmdW5jdGlvbihlLGIpe2Z1bmN0aW9uIGsoYSl7YSYmZy5wdXNoKEUoYSkpfQ0KLWZ1bmN0aW9uIGYoYSxjKXtnLnB1c2goIjxhICIpO2guaXNEZWZpbmVkKGIpJiZnLnB1c2goJ3RhcmdldD0iJyxiLCciICcpO2cucHVzaCgnaHJlZj0iJyxhLnJlcGxhY2UoLyIvZywiJnF1b3Q7IiksJyI+Jyk7ayhjKTtnLnB1c2goIjwvYT4iKX1pZighZSlyZXR1cm4gZTtmb3IodmFyIG0sbD1lLGc9W10sbixwO209bC5tYXRjaChkKTspbj1tWzBdLG1bMl18fG1bNF18fChuPShtWzNdPyJodHRwOi8vIjoibWFpbHRvOiIpK24pLHA9bS5pbmRleCxrKGwuc3Vic3RyKDAscCkpLGYobixtWzBdLnJlcGxhY2UoYywiIikpLGw9bC5zdWJzdHJpbmcocCttWzBdLmxlbmd0aCk7ayhsKTtyZXR1cm4gYShnLmpvaW4oIiIpKX19XSl9KSh3aW5kb3csd2luZG93LmFuZ3VsYXIpOw0KLS8vIyBzb3VyY2VNYXBwaW5nVVJMPWFuZ3VsYXItc2FuaXRpemUubWluLmpzLm1hcA0KKy8qCitUaGUgTUlUIExpY2Vuc2UKKworQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorKi8KKy8qCisgQW5ndWxhckpTIHYxLjMuOAorIChjKSAyMDEwLTIwMTQgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnCisgTGljZW5zZTogTUlUCisqLworKGZ1bmN0aW9uKG4saCxwKXsndXNlIHN0cmljdCc7ZnVuY3Rpb24gRShhKXt2YXIgZD1bXTtzKGQsaC5ub29wKS5jaGFycyhhKTtyZXR1cm4gZC5qb2luKCIiKX1mdW5jdGlvbiBnKGEpe3ZhciBkPXt9O2E9YS5zcGxpdCgiLCIpO3ZhciBjO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXT0hMDtyZXR1cm4gZH1mdW5jdGlvbiBGKGEsZCl7ZnVuY3Rpb24gYyhhLGIsYyxsKXtiPWgubG93ZXJjYXNlKGIpO2lmKHRbYl0pZm9yKDtmLmxhc3QoKSYmdVtmLmxhc3QoKV07KWUoIiIsZi5sYXN0KCkpO3ZbYl0mJmYubGFzdCgpPT1iJiZlKCIiLGIpOyhsPXdbYl18fCEhbCl8fGYucHVzaChiKTt2YXIgbT17fTtjLnJlcGxhY2UoRyxmdW5jdGlvbihhLGIsZCxjLGUpe21bYl09cihkfHxjfHxlfHwiIil9KTtkLnN0YXJ0JiZkLnN0YXJ0KGIsbSxsKX1mdW5jdGlvbiBlKGEsYil7dmFyIGM9MCxlO2lmKGI9aC5sb3dlcmNhc2UoYikpZm9yKGM9Zi5sZW5ndGgtMTswPD1jJiZmW2NdIT1iO2MtLSk7CitpZigwPD1jKXtmb3IoZT1mLmxlbmd0aC0xO2U+PWM7ZS0tKWQuZW5kJiZkLmVuZChmW2VdKTtmLmxlbmd0aD1jfX0ic3RyaW5nIiE9PXR5cGVvZiBhJiYoYT1udWxsPT09YXx8InVuZGVmaW5lZCI9PT10eXBlb2YgYT8iIjoiIithKTt2YXIgYixrLGY9W10sbT1hLGw7Zm9yKGYubGFzdD1mdW5jdGlvbigpe3JldHVybiBmW2YubGVuZ3RoLTFdfTthOyl7bD0iIjtrPSEwO2lmKGYubGFzdCgpJiZ4W2YubGFzdCgpXSlhPWEucmVwbGFjZShuZXcgUmVnRXhwKCIoLiopPFxccypcXC9cXHMqIitmLmxhc3QoKSsiW14+XSo+IiwiaSIpLGZ1bmN0aW9uKGEsYil7Yj1iLnJlcGxhY2UoSCwiJDEiKS5yZXBsYWNlKEksIiQxIik7ZC5jaGFycyYmZC5jaGFycyhyKGIpKTtyZXR1cm4iIn0pLGUoIiIsZi5sYXN0KCkpO2Vsc2V7aWYoMD09PWEuaW5kZXhPZigiXHgzYyEtLSIpKWI9YS5pbmRleE9mKCItLSIsNCksMDw9YiYmYS5sYXN0SW5kZXhPZigiLS1ceDNlIixiKT09PWImJihkLmNvbW1lbnQmJmQuY29tbWVudChhLnN1YnN0cmluZyg0LAorYikpLGE9YS5zdWJzdHJpbmcoYiszKSxrPSExKTtlbHNlIGlmKHkudGVzdChhKSl7aWYoYj1hLm1hdGNoKHkpKWE9YS5yZXBsYWNlKGJbMF0sIiIpLGs9ITF9ZWxzZSBpZihKLnRlc3QoYSkpe2lmKGI9YS5tYXRjaCh6KSlhPWEuc3Vic3RyaW5nKGJbMF0ubGVuZ3RoKSxiWzBdLnJlcGxhY2UoeixlKSxrPSExfWVsc2UgSy50ZXN0KGEpJiYoKGI9YS5tYXRjaChBKSk/KGJbNF0mJihhPWEuc3Vic3RyaW5nKGJbMF0ubGVuZ3RoKSxiWzBdLnJlcGxhY2UoQSxjKSksaz0hMSk6KGwrPSI8IixhPWEuc3Vic3RyaW5nKDEpKSk7ayYmKGI9YS5pbmRleE9mKCI8IiksbCs9MD5iP2E6YS5zdWJzdHJpbmcoMCxiKSxhPTA+Yj8iIjphLnN1YnN0cmluZyhiKSxkLmNoYXJzJiZkLmNoYXJzKHIobCkpKX1pZihhPT1tKXRocm93IEwoImJhZHBhcnNlIixhKTttPWF9ZSgpfWZ1bmN0aW9uIHIoYSl7aWYoIWEpcmV0dXJuIiI7dmFyIGQ9TS5leGVjKGEpO2E9ZFsxXTt2YXIgYz1kWzNdO2lmKGQ9ZFsyXSlxLmlubmVySFRNTD0KK2QucmVwbGFjZSgvPC9nLCImbHQ7IiksZD0idGV4dENvbnRlbnQiaW4gcT9xLnRleHRDb250ZW50OnEuaW5uZXJUZXh0O3JldHVybiBhK2QrY31mdW5jdGlvbiBCKGEpe3JldHVybiBhLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKE4sZnVuY3Rpb24oYSl7dmFyIGM9YS5jaGFyQ29kZUF0KDApO2E9YS5jaGFyQ29kZUF0KDEpO3JldHVybiImIyIrKDEwMjQqKGMtNTUyOTYpKyhhLTU2MzIwKSs2NTUzNikrIjsifSkucmVwbGFjZShPLGZ1bmN0aW9uKGEpe3JldHVybiImIyIrYS5jaGFyQ29kZUF0KDApKyI7In0pLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpfWZ1bmN0aW9uIHMoYSxkKXt2YXIgYz0hMSxlPWguYmluZChhLGEucHVzaCk7cmV0dXJue3N0YXJ0OmZ1bmN0aW9uKGEsayxmKXthPWgubG93ZXJjYXNlKGEpOyFjJiZ4W2FdJiYoYz1hKTtjfHwhMCE9PUNbYV18fChlKCI8IiksZShhKSxoLmZvckVhY2goayxmdW5jdGlvbihjLGYpe3ZhciBrPQoraC5sb3dlcmNhc2UoZiksZz0iaW1nIj09PWEmJiJzcmMiPT09a3x8ImJhY2tncm91bmQiPT09azshMCE9PVBba118fCEwPT09RFtrXSYmIWQoYyxnKXx8KGUoIiAiKSxlKGYpLGUoJz0iJyksZShCKGMpKSxlKCciJykpfSksZShmPyIvPiI6Ij4iKSl9LGVuZDpmdW5jdGlvbihhKXthPWgubG93ZXJjYXNlKGEpO2N8fCEwIT09Q1thXXx8KGUoIjwvIiksZShhKSxlKCI+IikpO2E9PWMmJihjPSExKX0sY2hhcnM6ZnVuY3Rpb24oYSl7Y3x8ZShCKGEpKX19fXZhciBMPWguJCRtaW5FcnIoIiRzYW5pdGl6ZSIpLEE9L148KCg/OlthLXpBLVpdKVtcdzotXSopKCg/OlxzK1tcdzotXSsoPzpccyo9XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKihcLz8pXHMqKD4/KS8sej0vXjxcL1xzKihbXHc6LV0rKVtePl0qPi8sRz0vKFtcdzotXSspKD86XHMqPVxzKig/Oig/OiIoKD86W14iXSkqKSIpfCg/OicoKD86W14nXSkqKScpfChbXj5cc10rKSkpPy9nLEs9L148LywKK0o9L148XC8vLEg9L1x4M2MhLS0oLio/KS0tXHgzZS9nLHk9LzwhRE9DVFlQRShbXj5dKj8pPi9pLEk9LzwhXFtDREFUQVxbKC4qPyldXVx4M2UvZyxOPS9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0vZyxPPS8oW15cIy1+fCB8IV0pL2csdz1nKCJhcmVhLGJyLGNvbCxocixpbWcsd2JyIik7bj1nKCJjb2xncm91cCxkZCxkdCxsaSxwLHRib2R5LHRkLHRmb290LHRoLHRoZWFkLHRyIik7cD1nKCJycCxydCIpO3ZhciB2PWguZXh0ZW5kKHt9LHAsbiksdD1oLmV4dGVuZCh7fSxuLGcoImFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxibG9ja3F1b3RlLGNhcHRpb24sY2VudGVyLGRlbCxkaXIsZGl2LGRsLGZpZ3VyZSxmaWdjYXB0aW9uLGZvb3RlcixoMSxoMixoMyxoNCxoNSxoNixoZWFkZXIsaGdyb3VwLGhyLGlucyxtYXAsbWVudSxuYXYsb2wscHJlLHNjcmlwdCxzZWN0aW9uLHRhYmxlLHVsIikpLHU9aC5leHRlbmQoe30scCxnKCJhLGFiYnIsYWNyb255bSxiLGJkaSxiZG8sYmlnLGJyLGNpdGUsY29kZSxkZWwsZGZuLGVtLGZvbnQsaSxpbWcsaW5zLGtiZCxsYWJlbCxtYXAsbWFyayxxLHJ1YnkscnAscnQscyxzYW1wLHNtYWxsLHNwYW4sc3RyaWtlLHN0cm9uZyxzdWIsc3VwLHRpbWUsdHQsdSx2YXIiKSk7CituPWcoImFuaW1hdGUsYW5pbWF0ZUNvbG9yLGFuaW1hdGVNb3Rpb24sYW5pbWF0ZVRyYW5zZm9ybSxjaXJjbGUsZGVmcyxkZXNjLGVsbGlwc2UsZm9udC1mYWNlLGZvbnQtZmFjZS1uYW1lLGZvbnQtZmFjZS1zcmMsZyxnbHlwaCxoa2VybixpbWFnZSxsaW5lYXJHcmFkaWVudCxsaW5lLG1hcmtlcixtZXRhZGF0YSxtaXNzaW5nLWdseXBoLG1wYXRoLHBhdGgscG9seWdvbixwb2x5bGluZSxyYWRpYWxHcmFkaWVudCxyZWN0LHNldCxzdG9wLHN2Zyxzd2l0Y2gsdGV4dCx0aXRsZSx0c3Bhbix1c2UiKTt2YXIgeD1nKCJzY3JpcHQsc3R5bGUiKSxDPWguZXh0ZW5kKHt9LHcsdCx1LHYsbiksRD1nKCJiYWNrZ3JvdW5kLGNpdGUsaHJlZixsb25nZGVzYyxzcmMsdXNlbWFwLHhsaW5rOmhyZWYiKTtuPWcoImFiYnIsYWxpZ24sYWx0LGF4aXMsYmdjb2xvcixib3JkZXIsY2VsbHBhZGRpbmcsY2VsbHNwYWNpbmcsY2xhc3MsY2xlYXIsY29sb3IsY29scyxjb2xzcGFuLGNvbXBhY3QsY29vcmRzLGRpcixmYWNlLGhlYWRlcnMsaGVpZ2h0LGhyZWZsYW5nLGhzcGFjZSxpc21hcCxsYW5nLGxhbmd1YWdlLG5vaHJlZixub3dyYXAscmVsLHJldixyb3dzLHJvd3NwYW4scnVsZXMsc2NvcGUsc2Nyb2xsaW5nLHNoYXBlLHNpemUsc3BhbixzdGFydCxzdW1tYXJ5LHRhcmdldCx0aXRsZSx0eXBlLHZhbGlnbix2YWx1ZSx2c3BhY2Usd2lkdGgiKTsKK3A9ZygiYWNjZW50LWhlaWdodCxhY2N1bXVsYXRlLGFkZGl0aXZlLGFscGhhYmV0aWMsYXJhYmljLWZvcm0sYXNjZW50LGF0dHJpYnV0ZU5hbWUsYXR0cmlidXRlVHlwZSxiYXNlUHJvZmlsZSxiYm94LGJlZ2luLGJ5LGNhbGNNb2RlLGNhcC1oZWlnaHQsY2xhc3MsY29sb3IsY29sb3ItcmVuZGVyaW5nLGNvbnRlbnQsY3gsY3ksZCxkeCxkeSxkZXNjZW50LGRpc3BsYXksZHVyLGVuZCxmaWxsLGZpbGwtcnVsZSxmb250LWZhbWlseSxmb250LXNpemUsZm9udC1zdHJldGNoLGZvbnQtc3R5bGUsZm9udC12YXJpYW50LGZvbnQtd2VpZ2h0LGZyb20sZngsZnksZzEsZzIsZ2x5cGgtbmFtZSxncmFkaWVudFVuaXRzLGhhbmdpbmcsaGVpZ2h0LGhvcml6LWFkdi14LGhvcml6LW9yaWdpbi14LGlkZW9ncmFwaGljLGssa2V5UG9pbnRzLGtleVNwbGluZXMsa2V5VGltZXMsbGFuZyxtYXJrZXItZW5kLG1hcmtlci1taWQsbWFya2VyLXN0YXJ0LG1hcmtlckhlaWdodCxtYXJrZXJVbml0cyxtYXJrZXJXaWR0aCxtYXRoZW1hdGljYWwsbWF4LG1pbixvZmZzZXQsb3BhY2l0eSxvcmllbnQsb3JpZ2luLG92ZXJsaW5lLXBvc2l0aW9uLG92ZXJsaW5lLXRoaWNrbmVzcyxwYW5vc2UtMSxwYXRoLHBhdGhMZW5ndGgscG9pbnRzLHByZXNlcnZlQXNwZWN0UmF0aW8scixyZWZYLHJlZlkscmVwZWF0Q291bnQscmVwZWF0RHVyLHJlcXVpcmVkRXh0ZW5zaW9ucyxyZXF1aXJlZEZlYXR1cmVzLHJlc3RhcnQscm90YXRlLHJ4LHJ5LHNsb3BlLHN0ZW1oLHN0ZW12LHN0b3AtY29sb3Isc3RvcC1vcGFjaXR5LHN0cmlrZXRocm91Z2gtcG9zaXRpb24sc3RyaWtldGhyb3VnaC10aGlja25lc3Msc3Ryb2tlLHN0cm9rZS1kYXNoYXJyYXksc3Ryb2tlLWRhc2hvZmZzZXQsc3Ryb2tlLWxpbmVjYXAsc3Ryb2tlLWxpbmVqb2luLHN0cm9rZS1taXRlcmxpbWl0LHN0cm9rZS1vcGFjaXR5LHN0cm9rZS13aWR0aCxzeXN0ZW1MYW5ndWFnZSx0YXJnZXQsdGV4dC1hbmNob3IsdG8sdHJhbnNmb3JtLHR5cGUsdTEsdTIsdW5kZXJsaW5lLXBvc2l0aW9uLHVuZGVybGluZS10aGlja25lc3MsdW5pY29kZSx1bmljb2RlLXJhbmdlLHVuaXRzLXBlci1lbSx2YWx1ZXMsdmVyc2lvbix2aWV3Qm94LHZpc2liaWxpdHksd2lkdGgsd2lkdGhzLHgseC1oZWlnaHQseDEseDIseGxpbms6YWN0dWF0ZSx4bGluazphcmNyb2xlLHhsaW5rOnJvbGUseGxpbms6c2hvdyx4bGluazp0aXRsZSx4bGluazp0eXBlLHhtbDpiYXNlLHhtbDpsYW5nLHhtbDpzcGFjZSx4bWxucyx4bWxuczp4bGluayx5LHkxLHkyLHpvb21BbmRQYW4iKTsKK3ZhciBQPWguZXh0ZW5kKHt9LEQscCxuKSxxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByZSIpLE09L14oXHMqKShbXHNcU10qPykoXHMqKSQvO2gubW9kdWxlKCJuZ1Nhbml0aXplIixbXSkucHJvdmlkZXIoIiRzYW5pdGl6ZSIsZnVuY3Rpb24oKXt0aGlzLiRnZXQ9WyIkJHNhbml0aXplVXJpIixmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGM9W107RihkLHMoYyxmdW5jdGlvbihjLGIpe3JldHVybiEvXnVuc2FmZS8udGVzdChhKGMsYikpfSkpO3JldHVybiBjLmpvaW4oIiIpfX1dfSk7aC5tb2R1bGUoIm5nU2FuaXRpemUiKS5maWx0ZXIoImxpbmt5IixbIiRzYW5pdGl6ZSIsZnVuY3Rpb24oYSl7dmFyIGQ9LygoZnRwfGh0dHBzPyk6XC9cL3wod3d3XC4pfChtYWlsdG86KT9bQS1aYS16MC05Ll8lKy1dK0ApXFMqW15ccy47LCgpe308PiJcdTIwMWRcdTIwMTldLyxjPS9ebWFpbHRvOi87cmV0dXJuIGZ1bmN0aW9uKGUsYil7ZnVuY3Rpb24gayhhKXthJiZnLnB1c2goRShhKSl9CitmdW5jdGlvbiBmKGEsYyl7Zy5wdXNoKCI8YSAiKTtoLmlzRGVmaW5lZChiKSYmZy5wdXNoKCd0YXJnZXQ9IicsYiwnIiAnKTtnLnB1c2goJ2hyZWY9IicsYS5yZXBsYWNlKC8iL2csIiZxdW90OyIpLCciPicpO2soYyk7Zy5wdXNoKCI8L2E+Iil9aWYoIWUpcmV0dXJuIGU7Zm9yKHZhciBtLGw9ZSxnPVtdLG4scDttPWwubWF0Y2goZCk7KW49bVswXSxtWzJdfHxtWzRdfHwobj0obVszXT8iaHR0cDovLyI6Im1haWx0bzoiKStuKSxwPW0uaW5kZXgsayhsLnN1YnN0cigwLHApKSxmKG4sbVswXS5yZXBsYWNlKGMsIiIpKSxsPWwuc3Vic3RyaW5nKHArbVswXS5sZW5ndGgpO2sobCk7cmV0dXJuIGEoZy5qb2luKCIiKSl9fV0pfSkod2luZG93LHdpbmRvdy5hbmd1bGFyKTsKKy8vIyBzb3VyY2VNYXBwaW5nVVJMPWFuZ3VsYXItc2FuaXRpemUubWluLmpzLm1hcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvYW5ndWxhci5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2FuZ3VsYXIuanMKaW5kZXggZjM3ZGE2ZC4uMzA0YzVhMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvYW5ndWxhci5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9hbmd1bGFyLmpzCkBAIC0xLDI2MDkzICsxLDI2MDkzIEBACi0vKg0KLVRoZSBNSVQgTGljZW5zZQ0KLQ0KLUNvcHlyaWdodCAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZw0KLQ0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkNCi1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCi10byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KLQ0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQotQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTg0KLVRIRSBTT0ZUV0FSRS4NCi0qLw0KLS8qKg0KLSAqIEBsaWNlbnNlIEFuZ3VsYXJKUyB2MS4zLjgNCi0gKiAoYykgMjAxMC0yMDE0IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZw0KLSAqIExpY2Vuc2U6IE1JVA0KLSAqLw0KLShmdW5jdGlvbih3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHsndXNlIHN0cmljdCc7DQotDQotLyoqDQotICogQGRlc2NyaXB0aW9uDQotICoNCi0gKiBUaGlzIG9iamVjdCBwcm92aWRlcyBhIHV0aWxpdHkgZm9yIHByb2R1Y2luZyByaWNoIEVycm9yIG1lc3NhZ2VzIHdpdGhpbg0KLSAqIEFuZ3VsYXIuIEl0IGNhbiBiZSBjYWxsZWQgYXMgZm9sbG93czoNCi0gKg0KLSAqIHZhciBleGFtcGxlTWluRXJyID0gbWluRXJyKCdleGFtcGxlJyk7DQotICogdGhyb3cgZXhhbXBsZU1pbkVycignb25lJywgJ1RoaXMgezB9IGlzIHsxfScsIGZvbywgYmFyKTsNCi0gKg0KLSAqIFRoZSBhYm92ZSBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIG1pbkVyciBpbiB0aGUgZXhhbXBsZSBuYW1lc3BhY2UuIFRoZQ0KLSAqIHJlc3VsdGluZyBlcnJvciB3aWxsIGhhdmUgYSBuYW1lc3BhY2VkIGVycm9yIGNvZGUgb2YgZXhhbXBsZS5vbmUuICBUaGUNCi0gKiByZXN1bHRpbmcgZXJyb3Igd2lsbCByZXBsYWNlIHswfSB3aXRoIHRoZSB2YWx1ZSBvZiBmb28sIGFuZCB7MX0gd2l0aCB0aGUNCi0gKiB2YWx1ZSBvZiBiYXIuIFRoZSBvYmplY3QgaXMgbm90IHJlc3RyaWN0ZWQgaW4gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaXQgY2FuDQotICogdGFrZS4NCi0gKg0KLSAqIElmIGZld2VyIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIHRoYW4gbmVjZXNzYXJ5IGZvciBpbnRlcnBvbGF0aW9uLCB0aGUgZXh0cmENCi0gKiBpbnRlcnBvbGF0aW9uIG1hcmtlcnMgd2lsbCBiZSBwcmVzZXJ2ZWQgaW4gdGhlIGZpbmFsIHN0cmluZy4NCi0gKg0KLSAqIFNpbmNlIGRhdGEgd2lsbCBiZSBwYXJzZWQgc3RhdGljYWxseSBkdXJpbmcgYSBidWlsZCBzdGVwLCBzb21lIHJlc3RyaWN0aW9ucw0KLSAqIGFyZSBhcHBsaWVkIHdpdGggcmVzcGVjdCB0byBob3cgbWluRXJyIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBhbmQgY2FsbGVkLg0KLSAqIEluc3RhbmNlcyBzaG91bGQgaGF2ZSBuYW1lcyBvZiB0aGUgZm9ybSBuYW1lc3BhY2VNaW5FcnIgZm9yIGEgbWluRXJyIGNyZWF0ZWQNCi0gKiB1c2luZyBtaW5FcnIoJ25hbWVzcGFjZScpIC4gRXJyb3IgY29kZXMsIG5hbWVzcGFjZXMgYW5kIHRlbXBsYXRlIHN0cmluZ3MNCi0gKiBzaG91bGQgYWxsIGJlIHN0YXRpYyBzdHJpbmdzLCBub3QgdmFyaWFibGVzIG9yIGdlbmVyYWwgZXhwcmVzc2lvbnMuDQotICoNCi0gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlIFRoZSBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgbmV3IG1pbkVyciBpbnN0YW5jZS4NCi0gKiBAcGFyYW0ge2Z1bmN0aW9ufSBFcnJvckNvbnN0cnVjdG9yIEN1c3RvbSBlcnJvciBjb25zdHJ1Y3RvciB0byBiZSBpbnN0YW50aWF0ZWQgd2hlbiByZXR1cm5pbmcNCi0gKiAgIGVycm9yIGZyb20gcmV0dXJuZWQgZnVuY3Rpb24sIGZvciBjYXNlcyB3aGVuIGEgcGFydGljdWxhciB0eXBlIG9mIGVycm9yIGlzIHVzZWZ1bC4NCi0gKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29kZTpzdHJpbmcsIHRlbXBsYXRlOnN0cmluZywgLi4udGVtcGxhdGVBcmdzKTogRXJyb3J9IG1pbkVyciBpbnN0YW5jZQ0KLSAqLw0KLQ0KLWZ1bmN0aW9uIG1pbkVycihtb2R1bGUsIEVycm9yQ29uc3RydWN0b3IpIHsNCi0gIEVycm9yQ29uc3RydWN0b3IgPSBFcnJvckNvbnN0cnVjdG9yIHx8IEVycm9yOw0KLSAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KLSAgICB2YXIgY29kZSA9IGFyZ3VtZW50c1swXSwNCi0gICAgICBwcmVmaXggPSAnWycgKyAobW9kdWxlID8gbW9kdWxlICsgJzonIDogJycpICsgY29kZSArICddICcsDQotICAgICAgdGVtcGxhdGUgPSBhcmd1bWVudHNbMV0sDQotICAgICAgdGVtcGxhdGVBcmdzID0gYXJndW1lbnRzLA0KLQ0KLSAgICAgIG1lc3NhZ2UsIGk7DQotDQotICAgIG1lc3NhZ2UgPSBwcmVmaXggKyB0ZW1wbGF0ZS5yZXBsYWNlKC9ce1xkK1x9L2csIGZ1bmN0aW9uKG1hdGNoKSB7DQotICAgICAgdmFyIGluZGV4ID0gK21hdGNoLnNsaWNlKDEsIC0xKSwgYXJnOw0KLQ0KLSAgICAgIGlmIChpbmRleCArIDIgPCB0ZW1wbGF0ZUFyZ3MubGVuZ3RoKSB7DQotICAgICAgICByZXR1cm4gdG9EZWJ1Z1N0cmluZyh0ZW1wbGF0ZUFyZ3NbaW5kZXggKyAyXSk7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBtYXRjaDsNCi0gICAgfSk7DQotDQotICAgIG1lc3NhZ2UgPSBtZXNzYWdlICsgJ1xuaHR0cDovL2Vycm9ycy5hbmd1bGFyanMub3JnLzEuMy44LycgKw0KLSAgICAgIChtb2R1bGUgPyBtb2R1bGUgKyAnLycgOiAnJykgKyBjb2RlOw0KLSAgICBmb3IgKGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgKyAoaSA9PSAyID8gJz8nIDogJyYnKSArICdwJyArIChpIC0gMikgKyAnPScgKw0KLSAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHRvRGVidWdTdHJpbmcoYXJndW1lbnRzW2ldKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIG5ldyBFcnJvckNvbnN0cnVjdG9yKG1lc3NhZ2UpOw0KLSAgfTsNCi19DQotDQotLyogV2UgbmVlZCB0byB0ZWxsIGpzaGludCB3aGF0IHZhcmlhYmxlcyBhcmUgYmVpbmcgZXhwb3J0ZWQgKi8NCi0vKiBnbG9iYWwgYW5ndWxhcjogdHJ1ZSwNCi0gIG1zaWU6IHRydWUsDQotICBqcUxpdGU6IHRydWUsDQotICBqUXVlcnk6IHRydWUsDQotICBzbGljZTogdHJ1ZSwNCi0gIHNwbGljZTogdHJ1ZSwNCi0gIHB1c2g6IHRydWUsDQotICB0b1N0cmluZzogdHJ1ZSwNCi0gIG5nTWluRXJyOiB0cnVlLA0KLSAgYW5ndWxhck1vZHVsZTogdHJ1ZSwNCi0gIHVpZDogdHJ1ZSwNCi0gIFJFR0VYX1NUUklOR19SRUdFWFA6IHRydWUsDQotICBWQUxJRElUWV9TVEFURV9QUk9QRVJUWTogdHJ1ZSwNCi0NCi0gIGxvd2VyY2FzZTogdHJ1ZSwNCi0gIHVwcGVyY2FzZTogdHJ1ZSwNCi0gIG1hbnVhbExvd2VyY2FzZTogdHJ1ZSwNCi0gIG1hbnVhbFVwcGVyY2FzZTogdHJ1ZSwNCi0gIG5vZGVOYW1lXzogdHJ1ZSwNCi0gIGlzQXJyYXlMaWtlOiB0cnVlLA0KLSAgZm9yRWFjaDogdHJ1ZSwNCi0gIHNvcnRlZEtleXM6IHRydWUsDQotICBmb3JFYWNoU29ydGVkOiB0cnVlLA0KLSAgcmV2ZXJzZVBhcmFtczogdHJ1ZSwNCi0gIG5leHRVaWQ6IHRydWUsDQotICBzZXRIYXNoS2V5OiB0cnVlLA0KLSAgZXh0ZW5kOiB0cnVlLA0KLSAgaW50OiB0cnVlLA0KLSAgaW5oZXJpdDogdHJ1ZSwNCi0gIG5vb3A6IHRydWUsDQotICBpZGVudGl0eTogdHJ1ZSwNCi0gIHZhbHVlRm46IHRydWUsDQotICBpc1VuZGVmaW5lZDogdHJ1ZSwNCi0gIGlzRGVmaW5lZDogdHJ1ZSwNCi0gIGlzT2JqZWN0OiB0cnVlLA0KLSAgaXNTdHJpbmc6IHRydWUsDQotICBpc051bWJlcjogdHJ1ZSwNCi0gIGlzRGF0ZTogdHJ1ZSwNCi0gIGlzQXJyYXk6IHRydWUsDQotICBpc0Z1bmN0aW9uOiB0cnVlLA0KLSAgaXNSZWdFeHA6IHRydWUsDQotICBpc1dpbmRvdzogdHJ1ZSwNCi0gIGlzU2NvcGU6IHRydWUsDQotICBpc0ZpbGU6IHRydWUsDQotICBpc0Zvcm1EYXRhOiB0cnVlLA0KLSAgaXNCbG9iOiB0cnVlLA0KLSAgaXNCb29sZWFuOiB0cnVlLA0KLSAgaXNQcm9taXNlTGlrZTogdHJ1ZSwNCi0gIHRyaW06IHRydWUsDQotICBlc2NhcGVGb3JSZWdleHA6IHRydWUsDQotICBpc0VsZW1lbnQ6IHRydWUsDQotICBtYWtlTWFwOiB0cnVlLA0KLSAgaW5jbHVkZXM6IHRydWUsDQotICBhcnJheVJlbW92ZTogdHJ1ZSwNCi0gIGNvcHk6IHRydWUsDQotICBzaGFsbG93Q29weTogdHJ1ZSwNCi0gIGVxdWFsczogdHJ1ZSwNCi0gIGNzcDogdHJ1ZSwNCi0gIGNvbmNhdDogdHJ1ZSwNCi0gIHNsaWNlQXJnczogdHJ1ZSwNCi0gIGJpbmQ6IHRydWUsDQotICB0b0pzb25SZXBsYWNlcjogdHJ1ZSwNCi0gIHRvSnNvbjogdHJ1ZSwNCi0gIGZyb21Kc29uOiB0cnVlLA0KLSAgc3RhcnRpbmdUYWc6IHRydWUsDQotICB0cnlEZWNvZGVVUklDb21wb25lbnQ6IHRydWUsDQotICBwYXJzZUtleVZhbHVlOiB0cnVlLA0KLSAgdG9LZXlWYWx1ZTogdHJ1ZSwNCi0gIGVuY29kZVVyaVNlZ21lbnQ6IHRydWUsDQotICBlbmNvZGVVcmlRdWVyeTogdHJ1ZSwNCi0gIGFuZ3VsYXJJbml0OiB0cnVlLA0KLSAgYm9vdHN0cmFwOiB0cnVlLA0KLSAgZ2V0VGVzdGFiaWxpdHk6IHRydWUsDQotICBzbmFrZV9jYXNlOiB0cnVlLA0KLSAgYmluZEpRdWVyeTogdHJ1ZSwNCi0gIGFzc2VydEFyZzogdHJ1ZSwNCi0gIGFzc2VydEFyZ0ZuOiB0cnVlLA0KLSAgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHk6IHRydWUsDQotICBnZXR0ZXI6IHRydWUsDQotICBnZXRCbG9ja05vZGVzOiB0cnVlLA0KLSAgaGFzT3duUHJvcGVydHk6IHRydWUsDQotICBjcmVhdGVNYXA6IHRydWUsDQotDQotICBOT0RFX1RZUEVfRUxFTUVOVDogdHJ1ZSwNCi0gIE5PREVfVFlQRV9URVhUOiB0cnVlLA0KLSAgTk9ERV9UWVBFX0NPTU1FTlQ6IHRydWUsDQotICBOT0RFX1RZUEVfRE9DVU1FTlQ6IHRydWUsDQotICBOT0RFX1RZUEVfRE9DVU1FTlRfRlJBR01FTlQ6IHRydWUsDQotKi8NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi0vKioNCi0gKiBAbmdkb2MgbW9kdWxlDQotICogQG5hbWUgbmcNCi0gKiBAbW9kdWxlIG5nDQotICogQGRlc2NyaXB0aW9uDQotICoNCi0gKiAjIG5nIChjb3JlIG1vZHVsZSkNCi0gKiBUaGUgbmcgbW9kdWxlIGlzIGxvYWRlZCBieSBkZWZhdWx0IHdoZW4gYW4gQW5ndWxhckpTIGFwcGxpY2F0aW9uIGlzIHN0YXJ0ZWQuIFRoZSBtb2R1bGUgaXRzZWxmDQotICogY29udGFpbnMgdGhlIGVzc2VudGlhbCBjb21wb25lbnRzIGZvciBhbiBBbmd1bGFySlMgYXBwbGljYXRpb24gdG8gZnVuY3Rpb24uIFRoZSB0YWJsZSBiZWxvdw0KLSAqIGxpc3RzIGEgaGlnaCBsZXZlbCBicmVha2Rvd24gb2YgZWFjaCBvZiB0aGUgc2VydmljZXMvZmFjdG9yaWVzLCBmaWx0ZXJzLCBkaXJlY3RpdmVzIGFuZCB0ZXN0aW5nDQotICogY29tcG9uZW50cyBhdmFpbGFibGUgd2l0aGluIHRoaXMgY29yZSBtb2R1bGUuDQotICoNCi0gKiA8ZGl2IGRvYy1tb2R1bGUtY29tcG9uZW50cz0ibmciPjwvZGl2Pg0KLSAqLw0KLQ0KLXZhciBSRUdFWF9TVFJJTkdfUkVHRVhQID0gL15cLyguKylcLyhbYS16XSopJC87DQotDQotLy8gVGhlIG5hbWUgb2YgYSBmb3JtIGNvbnRyb2wncyBWYWxpZGl0eVN0YXRlIHByb3BlcnR5Lg0KLS8vIFRoaXMgaXMgdXNlZCBzbyB0aGF0IGl0J3MgcG9zc2libGUgZm9yIGludGVybmFsIHRlc3RzIHRvIGNyZWF0ZSBtb2NrIFZhbGlkaXR5U3RhdGVzLg0KLXZhciBWQUxJRElUWV9TVEFURV9QUk9QRVJUWSA9ICd2YWxpZGl0eSc7DQotDQotLyoqDQotICogQG5nZG9jIGZ1bmN0aW9uDQotICogQG5hbWUgYW5ndWxhci5sb3dlcmNhc2UNCi0gKiBAbW9kdWxlIG5nDQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBsb3dlcmNhc2UuDQotICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBTdHJpbmcgdG8gYmUgY29udmVydGVkIHRvIGxvd2VyY2FzZS4NCi0gKiBAcmV0dXJucyB7c3RyaW5nfSBMb3dlcmNhc2VkIHN0cmluZy4NCi0gKi8NCi12YXIgbG93ZXJjYXNlID0gZnVuY3Rpb24oc3RyaW5nKSB7cmV0dXJuIGlzU3RyaW5nKHN0cmluZykgPyBzdHJpbmcudG9Mb3dlckNhc2UoKSA6IHN0cmluZzt9Ow0KLXZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7DQotDQotLyoqDQotICogQG5nZG9jIGZ1bmN0aW9uDQotICogQG5hbWUgYW5ndWxhci51cHBlcmNhc2UNCi0gKiBAbW9kdWxlIG5nDQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB1cHBlcmNhc2UuDQotICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBTdHJpbmcgdG8gYmUgY29udmVydGVkIHRvIHVwcGVyY2FzZS4NCi0gKiBAcmV0dXJucyB7c3RyaW5nfSBVcHBlcmNhc2VkIHN0cmluZy4NCi0gKi8NCi12YXIgdXBwZXJjYXNlID0gZnVuY3Rpb24oc3RyaW5nKSB7cmV0dXJuIGlzU3RyaW5nKHN0cmluZykgPyBzdHJpbmcudG9VcHBlckNhc2UoKSA6IHN0cmluZzt9Ow0KLQ0KLQ0KLXZhciBtYW51YWxMb3dlcmNhc2UgPSBmdW5jdGlvbihzKSB7DQotICAvKiBqc2hpbnQgYml0d2lzZTogZmFsc2UgKi8NCi0gIHJldHVybiBpc1N0cmluZyhzKQ0KLSAgICAgID8gcy5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbihjaCkge3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCkgfCAzMik7fSkNCi0gICAgICA6IHM7DQotfTsNCi12YXIgbWFudWFsVXBwZXJjYXNlID0gZnVuY3Rpb24ocykgew0KLSAgLyoganNoaW50IGJpdHdpc2U6IGZhbHNlICovDQotICByZXR1cm4gaXNTdHJpbmcocykNCi0gICAgICA/IHMucmVwbGFjZSgvW2Etel0vZywgZnVuY3Rpb24oY2gpIHtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaC5jaGFyQ29kZUF0KDApICYgfjMyKTt9KQ0KLSAgICAgIDogczsNCi19Ow0KLQ0KLQ0KLS8vIFN0cmluZyN0b0xvd2VyQ2FzZSBhbmQgU3RyaW5nI3RvVXBwZXJDYXNlIGRvbid0IHByb2R1Y2UgY29ycmVjdCByZXN1bHRzIGluIGJyb3dzZXJzIHdpdGggVHVya2lzaA0KLS8vIGxvY2FsZSwgZm9yIHRoaXMgcmVhc29uIHdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMgY2FzZSBhbmQgcmVkZWZpbmUgbG93ZXJjYXNlL3VwcGVyY2FzZSBtZXRob2RzDQotLy8gd2l0aCBjb3JyZWN0IGJ1dCBzbG93ZXIgYWx0ZXJuYXRpdmVzLg0KLWlmICgnaScgIT09ICdJJy50b0xvd2VyQ2FzZSgpKSB7DQotICBsb3dlcmNhc2UgPSBtYW51YWxMb3dlcmNhc2U7DQotICB1cHBlcmNhc2UgPSBtYW51YWxVcHBlcmNhc2U7DQotfQ0KLQ0KLQ0KLXZhcg0KLSAgICBtc2llLCAgICAgICAgICAgICAvLyBob2xkcyBtYWpvciB2ZXJzaW9uIG51bWJlciBmb3IgSUUsIG9yIE5hTiBpZiBVQSBpcyBub3QgSUUuDQotICAgIGpxTGl0ZSwgICAgICAgICAgIC8vIGRlbGF5IGJpbmRpbmcgc2luY2UgalF1ZXJ5IGNvdWxkIGJlIGxvYWRlZCBhZnRlciB1cy4NCi0gICAgalF1ZXJ5LCAgICAgICAgICAgLy8gZGVsYXkgYmluZGluZw0KLSAgICBzbGljZSAgICAgICAgICAgICA9IFtdLnNsaWNlLA0KLSAgICBzcGxpY2UgICAgICAgICAgICA9IFtdLnNwbGljZSwNCi0gICAgcHVzaCAgICAgICAgICAgICAgPSBbXS5wdXNoLA0KLSAgICB0b1N0cmluZyAgICAgICAgICA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsDQotICAgIG5nTWluRXJyICAgICAgICAgID0gbWluRXJyKCduZycpLA0KLQ0KLSAgICAvKiogQG5hbWUgYW5ndWxhciAqLw0KLSAgICBhbmd1bGFyICAgICAgICAgICA9IHdpbmRvdy5hbmd1bGFyIHx8ICh3aW5kb3cuYW5ndWxhciA9IHt9KSwNCi0gICAgYW5ndWxhck1vZHVsZSwNCi0gICAgdWlkICAgICAgICAgICAgICAgPSAwOw0KLQ0KLS8qKg0KLSAqIGRvY3VtZW50TW9kZSBpcyBhbiBJRS1vbmx5IHByb3BlcnR5DQotICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2NjMTk2OTg4KHY9dnMuODUpLmFzcHgNCi0gKi8NCi1tc2llID0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlOw0KLQ0KLQ0KLS8qKg0KLSAqIEBwcml2YXRlDQotICogQHBhcmFtIHsqfSBvYmoNCi0gKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYG9iamAgaXMgYW4gYXJyYXkgb3IgYXJyYXktbGlrZSBvYmplY3QgKE5vZGVMaXN0LCBBcmd1bWVudHMsDQotICogICAgICAgICAgICAgICAgICAgU3RyaW5nIC4uLikNCi0gKi8NCi1mdW5jdGlvbiBpc0FycmF5TGlrZShvYmopIHsNCi0gIGlmIChvYmogPT0gbnVsbCB8fCBpc1dpbmRvdyhvYmopKSB7DQotICAgIHJldHVybiBmYWxzZTsNCi0gIH0NCi0NCi0gIHZhciBsZW5ndGggPSBvYmoubGVuZ3RoOw0KLQ0KLSAgaWYgKG9iai5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0VMRU1FTlQgJiYgbGVuZ3RoKSB7DQotICAgIHJldHVybiB0cnVlOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGlzU3RyaW5nKG9iaikgfHwgaXNBcnJheShvYmopIHx8IGxlbmd0aCA9PT0gMCB8fA0KLSAgICAgICAgIHR5cGVvZiBsZW5ndGggPT09ICdudW1iZXInICYmIGxlbmd0aCA+IDAgJiYgKGxlbmd0aCAtIDEpIGluIG9iajsNCi19DQotDQotLyoqDQotICogQG5nZG9jIGZ1bmN0aW9uDQotICogQG5hbWUgYW5ndWxhci5mb3JFYWNoDQotICogQG1vZHVsZSBuZw0KLSAqIEBraW5kIGZ1bmN0aW9uDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBJbnZva2VzIHRoZSBgaXRlcmF0b3JgIGZ1bmN0aW9uIG9uY2UgZm9yIGVhY2ggaXRlbSBpbiBgb2JqYCBjb2xsZWN0aW9uLCB3aGljaCBjYW4gYmUgZWl0aGVyIGFuDQotICogb2JqZWN0IG9yIGFuIGFycmF5LiBUaGUgYGl0ZXJhdG9yYCBmdW5jdGlvbiBpcyBpbnZva2VkIHdpdGggYGl0ZXJhdG9yKHZhbHVlLCBrZXksIG9iailgLCB3aGVyZSBgdmFsdWVgDQotICogaXMgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBwcm9wZXJ0eSBvciBhbiBhcnJheSBlbGVtZW50LCBga2V5YCBpcyB0aGUgb2JqZWN0IHByb3BlcnR5IGtleSBvcg0KLSAqIGFycmF5IGVsZW1lbnQgaW5kZXggYW5kIG9iaiBpcyB0aGUgYG9iamAgaXRzZWxmLiBTcGVjaWZ5aW5nIGEgYGNvbnRleHRgIGZvciB0aGUgZnVuY3Rpb24gaXMgb3B0aW9uYWwuDQotICoNCi0gKiBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCBgLmZvckVhY2hgIGRvZXMgbm90IGl0ZXJhdGUgb3ZlciBpbmhlcml0ZWQgcHJvcGVydGllcyBiZWNhdXNlIGl0IGZpbHRlcnMNCi0gKiB1c2luZyB0aGUgYGhhc093blByb3BlcnR5YCBtZXRob2QuDQotICoNCi0gKiBVbmxpa2UgRVMyNjIncw0KLSAqIFtBcnJheS5wcm90b3R5cGUuZm9yRWFjaF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTE1LjQuNC4xOCksDQotICogUHJvdmlkaW5nICd1bmRlZmluZWQnIG9yICdudWxsJyB2YWx1ZXMgZm9yIGBvYmpgIHdpbGwgbm90IHRocm93IGEgVHlwZUVycm9yLCBidXQgcmF0aGVyIGp1c3QNCi0gKiByZXR1cm4gdGhlIHZhbHVlIHByb3ZpZGVkLg0KLSAqDQotICAgYGBganMNCi0gICAgIHZhciB2YWx1ZXMgPSB7bmFtZTogJ21pc2tvJywgZ2VuZGVyOiAnbWFsZSd9Ow0KLSAgICAgdmFyIGxvZyA9IFtdOw0KLSAgICAgYW5ndWxhci5mb3JFYWNoKHZhbHVlcywgZnVuY3Rpb24odmFsdWUsIGtleSkgew0KLSAgICAgICB0aGlzLnB1c2goa2V5ICsgJzogJyArIHZhbHVlKTsNCi0gICAgIH0sIGxvZyk7DQotICAgICBleHBlY3QobG9nKS50b0VxdWFsKFsnbmFtZTogbWlza28nLCAnZ2VuZGVyOiBtYWxlJ10pOw0KLSAgIGBgYA0KLSAqDQotICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBPYmplY3QgdG8gaXRlcmF0ZSBvdmVyLg0KLSAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yIEl0ZXJhdG9yIGZ1bmN0aW9uLg0KLSAqIEBwYXJhbSB7T2JqZWN0PX0gY29udGV4dCBPYmplY3QgdG8gYmVjb21lIGNvbnRleHQgKGB0aGlzYCkgZm9yIHRoZSBpdGVyYXRvciBmdW5jdGlvbi4NCi0gKiBAcmV0dXJucyB7T2JqZWN0fEFycmF5fSBSZWZlcmVuY2UgdG8gYG9iamAuDQotICovDQotDQotZnVuY3Rpb24gZm9yRWFjaChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7DQotICB2YXIga2V5LCBsZW5ndGg7DQotICBpZiAob2JqKSB7DQotICAgIGlmIChpc0Z1bmN0aW9uKG9iaikpIHsNCi0gICAgICBmb3IgKGtleSBpbiBvYmopIHsNCi0gICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgaGFzT3duUHJvcGVydHkgZXhpc3RzLA0KLSAgICAgICAgLy8gYXMgb24gSUU4IHRoZSByZXN1bHQgb2YgcXVlcnlTZWxlY3RvckFsbCBpcyBhbiBvYmplY3Qgd2l0aG91dCBhIGhhc093blByb3BlcnR5IGZ1bmN0aW9uDQotICAgICAgICBpZiAoa2V5ICE9ICdwcm90b3R5cGUnICYmIGtleSAhPSAnbGVuZ3RoJyAmJiBrZXkgIT0gJ25hbWUnICYmICghb2JqLmhhc093blByb3BlcnR5IHx8IG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSkgew0KLSAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtrZXldLCBrZXksIG9iaik7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKGlzQXJyYXkob2JqKSB8fCBpc0FycmF5TGlrZShvYmopKSB7DQotICAgICAgdmFyIGlzUHJpbWl0aXZlID0gdHlwZW9mIG9iaiAhPT0gJ29iamVjdCc7DQotICAgICAgZm9yIChrZXkgPSAwLCBsZW5ndGggPSBvYmoubGVuZ3RoOyBrZXkgPCBsZW5ndGg7IGtleSsrKSB7DQotICAgICAgICBpZiAoaXNQcmltaXRpdmUgfHwga2V5IGluIG9iaikgew0KLSAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtrZXldLCBrZXksIG9iaik7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9IGVsc2UgaWYgKG9iai5mb3JFYWNoICYmIG9iai5mb3JFYWNoICE9PSBmb3JFYWNoKSB7DQotICAgICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCwgb2JqKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBmb3IgKGtleSBpbiBvYmopIHsNCi0gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgew0KLSAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtrZXldLCBrZXksIG9iaik7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotICByZXR1cm4gb2JqOw0KLX0NCi0NCi1mdW5jdGlvbiBzb3J0ZWRLZXlzKG9iaikgew0KLSAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikuc29ydCgpOw0KLX0NCi0NCi1mdW5jdGlvbiBmb3JFYWNoU29ydGVkKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHsNCi0gIHZhciBrZXlzID0gc29ydGVkS2V5cyhvYmopOw0KLSAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7DQotICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2tleXNbaV1dLCBrZXlzW2ldKTsNCi0gIH0NCi0gIHJldHVybiBrZXlzOw0KLX0NCi0NCi0NCi0vKioNCi0gKiB3aGVuIHVzaW5nIGZvckVhY2ggdGhlIHBhcmFtcyBhcmUgdmFsdWUsIGtleSwgYnV0IGl0IGlzIG9mdGVuIHVzZWZ1bCB0byBoYXZlIGtleSwgdmFsdWUuDQotICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcsICopfSBpdGVyYXRvckZuDQotICogQHJldHVybnMge2Z1bmN0aW9uKCosIHN0cmluZyl9DQotICovDQotZnVuY3Rpb24gcmV2ZXJzZVBhcmFtcyhpdGVyYXRvckZuKSB7DQotICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGtleSkgeyBpdGVyYXRvckZuKGtleSwgdmFsdWUpOyB9Ow0KLX0NCi0NCi0vKioNCi0gKiBBIGNvbnNpc3RlbnQgd2F5IG9mIGNyZWF0aW5nIHVuaXF1ZSBJRHMgaW4gYW5ndWxhci4NCi0gKg0KLSAqIFVzaW5nIHNpbXBsZSBudW1iZXJzIGFsbG93cyB1cyB0byBnZW5lcmF0ZSAyOC42IG1pbGxpb24gdW5pcXVlIGlkcyBwZXIgc2Vjb25kIGZvciAxMCB5ZWFycyBiZWZvcmUNCi0gKiB3ZSBoaXQgbnVtYmVyIHByZWNpc2lvbiBpc3N1ZXMgaW4gSmF2YVNjcmlwdC4NCi0gKg0KLSAqIE1hdGgucG93KDIsNTMpIC8gNjAgLyA2MCAvIDI0IC8gMzY1IC8gMTAgPSAyOC42TQ0KLSAqDQotICogQHJldHVybnMge251bWJlcn0gYW4gdW5pcXVlIGFscGhhLW51bWVyaWMgc3RyaW5nDQotICovDQotZnVuY3Rpb24gbmV4dFVpZCgpIHsNCi0gIHJldHVybiArK3VpZDsNCi19DQotDQotDQotLyoqDQotICogU2V0IG9yIGNsZWFyIHRoZSBoYXNoa2V5IGZvciBhbiBvYmplY3QuDQotICogQHBhcmFtIG9iaiBvYmplY3QNCi0gKiBAcGFyYW0gaCB0aGUgaGFzaGtleSAoIXRydXRoeSB0byBkZWxldGUgdGhlIGhhc2hrZXkpDQotICovDQotZnVuY3Rpb24gc2V0SGFzaEtleShvYmosIGgpIHsNCi0gIGlmIChoKSB7DQotICAgIG9iai4kJGhhc2hLZXkgPSBoOw0KLSAgfQ0KLSAgZWxzZSB7DQotICAgIGRlbGV0ZSBvYmouJCRoYXNoS2V5Ow0KLSAgfQ0KLX0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZnVuY3Rpb24NCi0gKiBAbmFtZSBhbmd1bGFyLmV4dGVuZA0KLSAqIEBtb2R1bGUgbmcNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogRXh0ZW5kcyB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGBkc3RgIGJ5IGNvcHlpbmcgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBmcm9tIHRoZSBgc3JjYCBvYmplY3QocykNCi0gKiB0byBgZHN0YC4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIGBzcmNgIG9iamVjdHMuIElmIHlvdSB3YW50IHRvIHByZXNlcnZlIG9yaWdpbmFsIG9iamVjdHMsIHlvdSBjYW4gZG8gc28NCi0gKiBieSBwYXNzaW5nIGFuIGVtcHR5IG9iamVjdCBhcyB0aGUgdGFyZ2V0OiBgdmFyIG9iamVjdCA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBvYmplY3QxLCBvYmplY3QyKWAuDQotICogTm90ZTogS2VlcCBpbiBtaW5kIHRoYXQgYGFuZ3VsYXIuZXh0ZW5kYCBkb2VzIG5vdCBzdXBwb3J0IHJlY3Vyc2l2ZSBtZXJnZSAoZGVlcCBjb3B5KS4NCi0gKg0KLSAqIEBwYXJhbSB7T2JqZWN0fSBkc3QgRGVzdGluYXRpb24gb2JqZWN0Lg0KLSAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzcmMgU291cmNlIG9iamVjdChzKS4NCi0gKiBAcmV0dXJucyB7T2JqZWN0fSBSZWZlcmVuY2UgdG8gYGRzdGAuDQotICovDQotZnVuY3Rpb24gZXh0ZW5kKGRzdCkgew0KLSAgdmFyIGggPSBkc3QuJCRoYXNoS2V5Ow0KLQ0KLSAgZm9yICh2YXIgaSA9IDEsIGlpID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsNCi0gICAgdmFyIG9iaiA9IGFyZ3VtZW50c1tpXTsNCi0gICAgaWYgKG9iaikgew0KLSAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTsNCi0gICAgICBmb3IgKHZhciBqID0gMCwgamogPSBrZXlzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsNCi0gICAgICAgIHZhciBrZXkgPSBrZXlzW2pdOw0KLSAgICAgICAgZHN0W2tleV0gPSBvYmpba2V5XTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIHNldEhhc2hLZXkoZHN0LCBoKTsNCi0gIHJldHVybiBkc3Q7DQotfQ0KLQ0KLWZ1bmN0aW9uIGludChzdHIpIHsNCi0gIHJldHVybiBwYXJzZUludChzdHIsIDEwKTsNCi19DQotDQotDQotZnVuY3Rpb24gaW5oZXJpdChwYXJlbnQsIGV4dHJhKSB7DQotICByZXR1cm4gZXh0ZW5kKE9iamVjdC5jcmVhdGUocGFyZW50KSwgZXh0cmEpOw0KLX0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZnVuY3Rpb24NCi0gKiBAbmFtZSBhbmd1bGFyLm5vb3ANCi0gKiBAbW9kdWxlIG5nDQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBubyBvcGVyYXRpb25zLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiB3cml0aW5nIGNvZGUgaW4gdGhlDQotICogZnVuY3Rpb25hbCBzdHlsZS4NCi0gICBgYGBqcw0KLSAgICAgZnVuY3Rpb24gZm9vKGNhbGxiYWNrKSB7DQotICAgICAgIHZhciByZXN1bHQgPSBjYWxjdWxhdGVSZXN1bHQoKTsNCi0gICAgICAgKGNhbGxiYWNrIHx8IGFuZ3VsYXIubm9vcCkocmVzdWx0KTsNCi0gICAgIH0NCi0gICBgYGANCi0gKi8NCi1mdW5jdGlvbiBub29wKCkge30NCi1ub29wLiRpbmplY3QgPSBbXTsNCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZnVuY3Rpb24NCi0gKiBAbmFtZSBhbmd1bGFyLmlkZW50aXR5DQotICogQG1vZHVsZSBuZw0KLSAqIEBraW5kIGZ1bmN0aW9uDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBpdHMgZmlyc3QgYXJndW1lbnQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4gd3JpdGluZyBjb2RlIGluIHRoZQ0KLSAqIGZ1bmN0aW9uYWwgc3R5bGUuDQotICoNCi0gICBgYGBqcw0KLSAgICAgZnVuY3Rpb24gdHJhbnNmb3JtZXIodHJhbnNmb3JtYXRpb25GbiwgdmFsdWUpIHsNCi0gICAgICAgcmV0dXJuICh0cmFuc2Zvcm1hdGlvbkZuIHx8IGFuZ3VsYXIuaWRlbnRpdHkpKHZhbHVlKTsNCi0gICAgIH07DQotICAgYGBgDQotICAqIEBwYXJhbSB7Kn0gdmFsdWUgdG8gYmUgcmV0dXJuZWQuDQotICAqIEByZXR1cm5zIHsqfSB0aGUgdmFsdWUgcGFzc2VkIGluLg0KLSAqLw0KLWZ1bmN0aW9uIGlkZW50aXR5KCQpIHtyZXR1cm4gJDt9DQotaWRlbnRpdHkuJGluamVjdCA9IFtdOw0KLQ0KLQ0KLWZ1bmN0aW9uIHZhbHVlRm4odmFsdWUpIHtyZXR1cm4gZnVuY3Rpb24oKSB7cmV0dXJuIHZhbHVlO307fQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBmdW5jdGlvbg0KLSAqIEBuYW1lIGFuZ3VsYXIuaXNVbmRlZmluZWQNCi0gKiBAbW9kdWxlIG5nDQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIERldGVybWluZXMgaWYgYSByZWZlcmVuY2UgaXMgdW5kZWZpbmVkLg0KLSAqDQotICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suDQotICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyB1bmRlZmluZWQuDQotICovDQotZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJzt9DQotDQotDQotLyoqDQotICogQG5nZG9jIGZ1bmN0aW9uDQotICogQG5hbWUgYW5ndWxhci5pc0RlZmluZWQNCi0gKiBAbW9kdWxlIG5nDQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIERldGVybWluZXMgaWYgYSByZWZlcmVuY2UgaXMgZGVmaW5lZC4NCi0gKg0KLSAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLg0KLSAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgZGVmaW5lZC4NCi0gKi8NCi1mdW5jdGlvbiBpc0RlZmluZWQodmFsdWUpIHtyZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJzt9DQotDQotDQotLyoqDQotICogQG5nZG9jIGZ1bmN0aW9uDQotICogQG5hbWUgYW5ndWxhci5pc09iamVjdA0KLSAqIEBtb2R1bGUgbmcNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBhbiBgT2JqZWN0YC4gVW5saWtlIGB0eXBlb2ZgIGluIEphdmFTY3JpcHQsIGBudWxsYHMgYXJlIG5vdA0KLSAqIGNvbnNpZGVyZWQgdG8gYmUgb2JqZWN0cy4gTm90ZSB0aGF0IEphdmFTY3JpcHQgYXJyYXlzIGFyZSBvYmplY3RzLg0KLSAqDQotICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suDQotICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhbiBgT2JqZWN0YCBidXQgbm90IGBudWxsYC4NCi0gKi8NCi1mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkgew0KLSAgLy8gaHR0cDovL2pzcGVyZi5jb20vaXNvYmplY3Q0DQotICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JzsNCi19DQotDQotDQotLyoqDQotICogQG5nZG9jIGZ1bmN0aW9uDQotICogQG5hbWUgYW5ndWxhci5pc1N0cmluZw0KLSAqIEBtb2R1bGUgbmcNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBhIGBTdHJpbmdgLg0KLSAqDQotICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suDQotICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhIGBTdHJpbmdgLg0KLSAqLw0KLWZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7fQ0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBmdW5jdGlvbg0KLSAqIEBuYW1lIGFuZ3VsYXIuaXNOdW1iZXINCi0gKiBAbW9kdWxlIG5nDQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIERldGVybWluZXMgaWYgYSByZWZlcmVuY2UgaXMgYSBgTnVtYmVyYC4NCi0gKg0KLSAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLg0KLSAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYSBgTnVtYmVyYC4NCi0gKi8NCi1mdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge3JldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO30NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZnVuY3Rpb24NCi0gKiBAbmFtZSBhbmd1bGFyLmlzRGF0ZQ0KLSAqIEBtb2R1bGUgbmcNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogRGV0ZXJtaW5lcyBpZiBhIHZhbHVlIGlzIGEgZGF0ZS4NCi0gKg0KLSAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLg0KLSAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYSBgRGF0ZWAuDQotICovDQotZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7DQotICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IERhdGVdJzsNCi19DQotDQotDQotLyoqDQotICogQG5nZG9jIGZ1bmN0aW9uDQotICogQG5hbWUgYW5ndWxhci5pc0FycmF5DQotICogQG1vZHVsZSBuZw0KLSAqIEBraW5kIGZ1bmN0aW9uDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGFuIGBBcnJheWAuDQotICoNCi0gKiBAcGFyYW0geyp9IHZhbHVlIFJlZmVyZW5jZSB0byBjaGVjay4NCi0gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIGBBcnJheWAuDQotICovDQotdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5Ow0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBmdW5jdGlvbg0KLSAqIEBuYW1lIGFuZ3VsYXIuaXNGdW5jdGlvbg0KLSAqIEBtb2R1bGUgbmcNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBhIGBGdW5jdGlvbmAuDQotICoNCi0gKiBAcGFyYW0geyp9IHZhbHVlIFJlZmVyZW5jZSB0byBjaGVjay4NCi0gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGEgYEZ1bmN0aW9uYC4NCi0gKi8NCi1mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzt9DQotDQotDQotLyoqDQotICogRGV0ZXJtaW5lcyBpZiBhIHZhbHVlIGlzIGEgcmVndWxhciBleHByZXNzaW9uIG9iamVjdC4NCi0gKg0KLSAqIEBwcml2YXRlDQotICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suDQotICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhIGBSZWdFeHBgLg0KLSAqLw0KLWZ1bmN0aW9uIGlzUmVnRXhwKHZhbHVlKSB7DQotICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nOw0KLX0NCi0NCi0NCi0vKioNCi0gKiBDaGVja3MgaWYgYG9iamAgaXMgYSB3aW5kb3cgb2JqZWN0Lg0KLSAqDQotICogQHByaXZhdGUNCi0gKiBAcGFyYW0geyp9IG9iaiBPYmplY3QgdG8gY2hlY2sNCi0gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqYCBpcyBhIHdpbmRvdyBvYmouDQotICovDQotZnVuY3Rpb24gaXNXaW5kb3cob2JqKSB7DQotICByZXR1cm4gb2JqICYmIG9iai53aW5kb3cgPT09IG9iajsNCi19DQotDQotDQotZnVuY3Rpb24gaXNTY29wZShvYmopIHsNCi0gIHJldHVybiBvYmogJiYgb2JqLiRldmFsQXN5bmMgJiYgb2JqLiR3YXRjaDsNCi19DQotDQotDQotZnVuY3Rpb24gaXNGaWxlKG9iaikgew0KLSAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgRmlsZV0nOw0KLX0NCi0NCi0NCi1mdW5jdGlvbiBpc0Zvcm1EYXRhKG9iaikgew0KLSAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJzsNCi19DQotDQotDQotZnVuY3Rpb24gaXNCbG9iKG9iaikgew0KLSAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQmxvYl0nOw0KLX0NCi0NCi0NCi1mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHsNCi0gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJzsNCi19DQotDQotDQotZnVuY3Rpb24gaXNQcm9taXNlTGlrZShvYmopIHsNCi0gIHJldHVybiBvYmogJiYgaXNGdW5jdGlvbihvYmoudGhlbik7DQotfQ0KLQ0KLQ0KLXZhciB0cmltID0gZnVuY3Rpb24odmFsdWUpIHsNCi0gIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZS50cmltKCkgOiB2YWx1ZTsNCi19Ow0KLQ0KLS8vIENvcGllZCBmcm9tOg0KLS8vIGh0dHA6Ly9kb2NzLmNsb3N1cmUtbGlicmFyeS5nb29nbGVjb2RlLmNvbS9naXQvbG9jYWxfY2xvc3VyZV9nb29nX3N0cmluZ19zdHJpbmcuanMuc291cmNlLmh0bWwjbGluZTEwMjENCi0vLyBQcmVyZXE6IHMgaXMgYSBzdHJpbmcuDQotdmFyIGVzY2FwZUZvclJlZ2V4cCA9IGZ1bmN0aW9uKHMpIHsNCi0gIHJldHVybiBzLnJlcGxhY2UoLyhbLSgpXFtcXXt9Kz8qLiRcXnwsOiM8IVxcXSkvZywgJ1xcJDEnKS4NCi0gICAgICAgICAgIHJlcGxhY2UoL1x4MDgvZywgJ1xceDA4Jyk7DQotfTsNCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZnVuY3Rpb24NCi0gKiBAbmFtZSBhbmd1bGFyLmlzRWxlbWVudA0KLSAqIEBtb2R1bGUgbmcNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBhIERPTSBlbGVtZW50IChvciB3cmFwcGVkIGpRdWVyeSBlbGVtZW50KS4NCi0gKg0KLSAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLg0KLSAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYSBET00gZWxlbWVudCAob3Igd3JhcHBlZCBqUXVlcnkgZWxlbWVudCkuDQotICovDQotZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUpIHsNCi0gIHJldHVybiAhIShub2RlICYmDQotICAgIChub2RlLm5vZGVOYW1lICAvLyB3ZSBhcmUgYSBkaXJlY3QgZWxlbWVudA0KLSAgICB8fCAobm9kZS5wcm9wICYmIG5vZGUuYXR0ciAmJiBub2RlLmZpbmQpKSk7ICAvLyB3ZSBoYXZlIGFuIG9uIGFuZCBmaW5kIG1ldGhvZCBwYXJ0IG9mIGpRdWVyeSBBUEkNCi19DQotDQotLyoqDQotICogQHBhcmFtIHN0ciAna2V5MSxrZXkyLC4uLicNCi0gKiBAcmV0dXJucyB7b2JqZWN0fSBpbiB0aGUgZm9ybSBvZiB7a2V5MTp0cnVlLCBrZXkyOnRydWUsIC4uLn0NCi0gKi8NCi1mdW5jdGlvbiBtYWtlTWFwKHN0cikgew0KLSAgdmFyIG9iaiA9IHt9LCBpdGVtcyA9IHN0ci5zcGxpdCgiLCIpLCBpOw0KLSAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQ0KLSAgICBvYmpbIGl0ZW1zW2ldIF0gPSB0cnVlOw0KLSAgcmV0dXJuIG9iajsNCi19DQotDQotDQotZnVuY3Rpb24gbm9kZU5hbWVfKGVsZW1lbnQpIHsNCi0gIHJldHVybiBsb3dlcmNhc2UoZWxlbWVudC5ub2RlTmFtZSB8fCAoZWxlbWVudFswXSAmJiBlbGVtZW50WzBdLm5vZGVOYW1lKSk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGluY2x1ZGVzKGFycmF5LCBvYmopIHsNCi0gIHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGFycmF5LCBvYmopICE9IC0xOw0KLX0NCi0NCi1mdW5jdGlvbiBhcnJheVJlbW92ZShhcnJheSwgdmFsdWUpIHsNCi0gIHZhciBpbmRleCA9IGFycmF5LmluZGV4T2YodmFsdWUpOw0KLSAgaWYgKGluZGV4ID49IDApDQotICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7DQotICByZXR1cm4gdmFsdWU7DQotfQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBmdW5jdGlvbg0KLSAqIEBuYW1lIGFuZ3VsYXIuY29weQ0KLSAqIEBtb2R1bGUgbmcNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiBgc291cmNlYCwgd2hpY2ggc2hvdWxkIGJlIGFuIG9iamVjdCBvciBhbiBhcnJheS4NCi0gKg0KLSAqICogSWYgbm8gZGVzdGluYXRpb24gaXMgc3VwcGxpZWQsIGEgY29weSBvZiB0aGUgb2JqZWN0IG9yIGFycmF5IGlzIGNyZWF0ZWQuDQotICogKiBJZiBhIGRlc3RpbmF0aW9uIGlzIHByb3ZpZGVkLCBhbGwgb2YgaXRzIGVsZW1lbnRzIChmb3IgYXJyYXlzKSBvciBwcm9wZXJ0aWVzIChmb3Igb2JqZWN0cykNCi0gKiAgIGFyZSBkZWxldGVkIGFuZCB0aGVuIGFsbCBlbGVtZW50cy9wcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGl0Lg0KLSAqICogSWYgYHNvdXJjZWAgaXMgbm90IGFuIG9iamVjdCBvciBhcnJheSAoaW5jLiBgbnVsbGAgYW5kIGB1bmRlZmluZWRgKSwgYHNvdXJjZWAgaXMgcmV0dXJuZWQuDQotICogKiBJZiBgc291cmNlYCBpcyBpZGVudGljYWwgdG8gJ2Rlc3RpbmF0aW9uJyBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uDQotICoNCi0gKiBAcGFyYW0geyp9IHNvdXJjZSBUaGUgc291cmNlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1ha2UgYSBjb3B5Lg0KLSAqICAgICAgICAgICAgICAgICAgIENhbiBiZSBhbnkgdHlwZSwgaW5jbHVkaW5nIHByaW1pdGl2ZXMsIGBudWxsYCwgYW5kIGB1bmRlZmluZWRgLg0KLSAqIEBwYXJhbSB7KE9iamVjdHxBcnJheSk9fSBkZXN0aW5hdGlvbiBEZXN0aW5hdGlvbiBpbnRvIHdoaWNoIHRoZSBzb3VyY2UgaXMgY29waWVkLiBJZg0KLSAqICAgICBwcm92aWRlZCwgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFzIGBzb3VyY2VgLg0KLSAqIEByZXR1cm5zIHsqfSBUaGUgY29weSBvciB1cGRhdGVkIGBkZXN0aW5hdGlvbmAsIGlmIGBkZXN0aW5hdGlvbmAgd2FzIHNwZWNpZmllZC4NCi0gKg0KLSAqIEBleGFtcGxlDQotIDxleGFtcGxlIG1vZHVsZT0iY29weUV4YW1wbGUiPg0KLSA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+DQotIDxmb3JtIG5vdmFsaWRhdGUgY2xhc3M9InNpbXBsZS1mb3JtIj4NCi0gTmFtZTogPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJ1c2VyLm5hbWUiIC8+PGJyIC8+DQotIEUtbWFpbDogPGlucHV0IHR5cGU9ImVtYWlsIiBuZy1tb2RlbD0idXNlci5lbWFpbCIgLz48YnIgLz4NCi0gR2VuZGVyOiA8aW5wdXQgdHlwZT0icmFkaW8iIG5nLW1vZGVsPSJ1c2VyLmdlbmRlciIgdmFsdWU9Im1hbGUiIC8+bWFsZQ0KLSA8aW5wdXQgdHlwZT0icmFkaW8iIG5nLW1vZGVsPSJ1c2VyLmdlbmRlciIgdmFsdWU9ImZlbWFsZSIgLz5mZW1hbGU8YnIgLz4NCi0gPGJ1dHRvbiBuZy1jbGljaz0icmVzZXQoKSI+UkVTRVQ8L2J1dHRvbj4NCi0gPGJ1dHRvbiBuZy1jbGljaz0idXBkYXRlKHVzZXIpIj5TQVZFPC9idXR0b24+DQotIDwvZm9ybT4NCi0gPHByZT5mb3JtID0ge3t1c2VyIHwganNvbn19PC9wcmU+DQotIDxwcmU+bWFzdGVyID0ge3ttYXN0ZXIgfCBqc29ufX08L3ByZT4NCi0gPC9kaXY+DQotDQotIDxzY3JpcHQ+DQotICBhbmd1bGFyLm1vZHVsZSgnY29weUV4YW1wbGUnLCBbXSkNCi0gICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsNCi0gICAgICAkc2NvcGUubWFzdGVyPSB7fTsNCi0NCi0gICAgICAkc2NvcGUudXBkYXRlID0gZnVuY3Rpb24odXNlcikgew0KLSAgICAgICAgLy8gRXhhbXBsZSB3aXRoIDEgYXJndW1lbnQNCi0gICAgICAgICRzY29wZS5tYXN0ZXI9IGFuZ3VsYXIuY29weSh1c2VyKTsNCi0gICAgICB9Ow0KLQ0KLSAgICAgICRzY29wZS5yZXNldCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgLy8gRXhhbXBsZSB3aXRoIDIgYXJndW1lbnRzDQotICAgICAgICBhbmd1bGFyLmNvcHkoJHNjb3BlLm1hc3RlciwgJHNjb3BlLnVzZXIpOw0KLSAgICAgIH07DQotDQotICAgICAgJHNjb3BlLnJlc2V0KCk7DQotICAgIH1dKTsNCi0gPC9zY3JpcHQ+DQotIDwvZmlsZT4NCi0gPC9leGFtcGxlPg0KLSAqLw0KLWZ1bmN0aW9uIGNvcHkoc291cmNlLCBkZXN0aW5hdGlvbiwgc3RhY2tTb3VyY2UsIHN0YWNrRGVzdCkgew0KLSAgaWYgKGlzV2luZG93KHNvdXJjZSkgfHwgaXNTY29wZShzb3VyY2UpKSB7DQotICAgIHRocm93IG5nTWluRXJyKCdjcHdzJywNCi0gICAgICAiQ2FuJ3QgY29weSEgTWFraW5nIGNvcGllcyBvZiBXaW5kb3cgb3IgU2NvcGUgaW5zdGFuY2VzIGlzIG5vdCBzdXBwb3J0ZWQuIik7DQotICB9DQotDQotICBpZiAoIWRlc3RpbmF0aW9uKSB7DQotICAgIGRlc3RpbmF0aW9uID0gc291cmNlOw0KLSAgICBpZiAoc291cmNlKSB7DQotICAgICAgaWYgKGlzQXJyYXkoc291cmNlKSkgew0KLSAgICAgICAgZGVzdGluYXRpb24gPSBjb3B5KHNvdXJjZSwgW10sIHN0YWNrU291cmNlLCBzdGFja0Rlc3QpOw0KLSAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKHNvdXJjZSkpIHsNCi0gICAgICAgIGRlc3RpbmF0aW9uID0gbmV3IERhdGUoc291cmNlLmdldFRpbWUoKSk7DQotICAgICAgfSBlbHNlIGlmIChpc1JlZ0V4cChzb3VyY2UpKSB7DQotICAgICAgICBkZXN0aW5hdGlvbiA9IG5ldyBSZWdFeHAoc291cmNlLnNvdXJjZSwgc291cmNlLnRvU3RyaW5nKCkubWF0Y2goL1teXC9dKiQvKVswXSk7DQotICAgICAgICBkZXN0aW5hdGlvbi5sYXN0SW5kZXggPSBzb3VyY2UubGFzdEluZGV4Ow0KLSAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkgew0KLSAgICAgICAgdmFyIGVtcHR5T2JqZWN0ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc291cmNlKSk7DQotICAgICAgICBkZXN0aW5hdGlvbiA9IGNvcHkoc291cmNlLCBlbXB0eU9iamVjdCwgc3RhY2tTb3VyY2UsIHN0YWNrRGVzdCk7DQotICAgICAgfQ0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICBpZiAoc291cmNlID09PSBkZXN0aW5hdGlvbikgdGhyb3cgbmdNaW5FcnIoJ2NwaScsDQotICAgICAgIkNhbid0IGNvcHkhIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGlkZW50aWNhbC4iKTsNCi0NCi0gICAgc3RhY2tTb3VyY2UgPSBzdGFja1NvdXJjZSB8fCBbXTsNCi0gICAgc3RhY2tEZXN0ID0gc3RhY2tEZXN0IHx8IFtdOw0KLQ0KLSAgICBpZiAoaXNPYmplY3Qoc291cmNlKSkgew0KLSAgICAgIHZhciBpbmRleCA9IHN0YWNrU291cmNlLmluZGV4T2Yoc291cmNlKTsNCi0gICAgICBpZiAoaW5kZXggIT09IC0xKSByZXR1cm4gc3RhY2tEZXN0W2luZGV4XTsNCi0NCi0gICAgICBzdGFja1NvdXJjZS5wdXNoKHNvdXJjZSk7DQotICAgICAgc3RhY2tEZXN0LnB1c2goZGVzdGluYXRpb24pOw0KLSAgICB9DQotDQotICAgIHZhciByZXN1bHQ7DQotICAgIGlmIChpc0FycmF5KHNvdXJjZSkpIHsNCi0gICAgICBkZXN0aW5hdGlvbi5sZW5ndGggPSAwOw0KLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICByZXN1bHQgPSBjb3B5KHNvdXJjZVtpXSwgbnVsbCwgc3RhY2tTb3VyY2UsIHN0YWNrRGVzdCk7DQotICAgICAgICBpZiAoaXNPYmplY3Qoc291cmNlW2ldKSkgew0KLSAgICAgICAgICBzdGFja1NvdXJjZS5wdXNoKHNvdXJjZVtpXSk7DQotICAgICAgICAgIHN0YWNrRGVzdC5wdXNoKHJlc3VsdCk7DQotICAgICAgICB9DQotICAgICAgICBkZXN0aW5hdGlvbi5wdXNoKHJlc3VsdCk7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHZhciBoID0gZGVzdGluYXRpb24uJCRoYXNoS2V5Ow0KLSAgICAgIGlmIChpc0FycmF5KGRlc3RpbmF0aW9uKSkgew0KLSAgICAgICAgZGVzdGluYXRpb24ubGVuZ3RoID0gMDsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgZm9yRWFjaChkZXN0aW5hdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSkgew0KLSAgICAgICAgICBkZWxldGUgZGVzdGluYXRpb25ba2V5XTsNCi0gICAgICAgIH0pOw0KLSAgICAgIH0NCi0gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7DQotICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGtleSkpIHsNCi0gICAgICAgICAgcmVzdWx0ID0gY29weShzb3VyY2Vba2V5XSwgbnVsbCwgc3RhY2tTb3VyY2UsIHN0YWNrRGVzdCk7DQotICAgICAgICAgIGlmIChpc09iamVjdChzb3VyY2Vba2V5XSkpIHsNCi0gICAgICAgICAgICBzdGFja1NvdXJjZS5wdXNoKHNvdXJjZVtrZXldKTsNCi0gICAgICAgICAgICBzdGFja0Rlc3QucHVzaChyZXN1bHQpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSByZXN1bHQ7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIHNldEhhc2hLZXkoZGVzdGluYXRpb24saCk7DQotICAgIH0NCi0NCi0gIH0NCi0gIHJldHVybiBkZXN0aW5hdGlvbjsNCi19DQotDQotLyoqDQotICogQ3JlYXRlcyBhIHNoYWxsb3cgY29weSBvZiBhbiBvYmplY3QsIGFuIGFycmF5IG9yIGEgcHJpbWl0aXZlLg0KLSAqDQotICogQXNzdW1lcyB0aGF0IHRoZXJlIGFyZSBubyBwcm90byBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLg0KLSAqLw0KLWZ1bmN0aW9uIHNoYWxsb3dDb3B5KHNyYywgZHN0KSB7DQotICBpZiAoaXNBcnJheShzcmMpKSB7DQotICAgIGRzdCA9IGRzdCB8fCBbXTsNCi0NCi0gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsNCi0gICAgICBkc3RbaV0gPSBzcmNbaV07DQotICAgIH0NCi0gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc3JjKSkgew0KLSAgICBkc3QgPSBkc3QgfHwge307DQotDQotICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHsNCi0gICAgICBpZiAoIShrZXkuY2hhckF0KDApID09PSAnJCcgJiYga2V5LmNoYXJBdCgxKSA9PT0gJyQnKSkgew0KLSAgICAgICAgZHN0W2tleV0gPSBzcmNba2V5XTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIHJldHVybiBkc3QgfHwgc3JjOw0KLX0NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZnVuY3Rpb24NCi0gKiBAbmFtZSBhbmd1bGFyLmVxdWFscw0KLSAqIEBtb2R1bGUgbmcNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogRGV0ZXJtaW5lcyBpZiB0d28gb2JqZWN0cyBvciB0d28gdmFsdWVzIGFyZSBlcXVpdmFsZW50LiBTdXBwb3J0cyB2YWx1ZSB0eXBlcywgcmVndWxhcg0KLSAqIGV4cHJlc3Npb25zLCBhcnJheXMgYW5kIG9iamVjdHMuDQotICoNCi0gKiBUd28gb2JqZWN0cyBvciB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOg0KLSAqDQotICogKiBCb3RoIG9iamVjdHMgb3IgdmFsdWVzIHBhc3MgYD09PWAgY29tcGFyaXNvbi4NCi0gKiAqIEJvdGggb2JqZWN0cyBvciB2YWx1ZXMgYXJlIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGFsbCBvZiB0aGVpciBwcm9wZXJ0aWVzIGFyZSBlcXVhbCBieQ0KLSAqICAgY29tcGFyaW5nIHRoZW0gd2l0aCBgYW5ndWxhci5lcXVhbHNgLg0KLSAqICogQm90aCB2YWx1ZXMgYXJlIE5hTi4gKEluIEphdmFTY3JpcHQsIE5hTiA9PSBOYU4gPT4gZmFsc2UuIEJ1dCB3ZSBjb25zaWRlciB0d28gTmFOIGFzIGVxdWFsKQ0KLSAqICogQm90aCB2YWx1ZXMgcmVwcmVzZW50IHRoZSBzYW1lIHJlZ3VsYXIgZXhwcmVzc2lvbiAoSW4gSmF2YVNjcmlwdCwNCi0gKiAgIC9hYmMvID09IC9hYmMvID0+IGZhbHNlLiBCdXQgd2UgY29uc2lkZXIgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXMgZXF1YWwgd2hlbiB0aGVpciB0ZXh0dWFsDQotICogICByZXByZXNlbnRhdGlvbiBtYXRjaGVzKS4NCi0gKg0KLSAqIER1cmluZyBhIHByb3BlcnR5IGNvbXBhcmlzb24sIHByb3BlcnRpZXMgb2YgYGZ1bmN0aW9uYCB0eXBlIGFuZCBwcm9wZXJ0aWVzIHdpdGggbmFtZXMNCi0gKiB0aGF0IGJlZ2luIHdpdGggYCRgIGFyZSBpZ25vcmVkLg0KLSAqDQotICogU2NvcGUgYW5kIERPTVdpbmRvdyBvYmplY3RzIGFyZSBiZWluZyBjb21wYXJlZCBvbmx5IGJ5IGlkZW50aWZ5IChgPT09YCkuDQotICoNCi0gKiBAcGFyYW0geyp9IG8xIE9iamVjdCBvciB2YWx1ZSB0byBjb21wYXJlLg0KLSAqIEBwYXJhbSB7Kn0gbzIgT2JqZWN0IG9yIHZhbHVlIHRvIGNvbXBhcmUuDQotICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYXJndW1lbnRzIGFyZSBlcXVhbC4NCi0gKi8NCi1mdW5jdGlvbiBlcXVhbHMobzEsIG8yKSB7DQotICBpZiAobzEgPT09IG8yKSByZXR1cm4gdHJ1ZTsNCi0gIGlmIChvMSA9PT0gbnVsbCB8fCBvMiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOw0KLSAgaWYgKG8xICE9PSBvMSAmJiBvMiAhPT0gbzIpIHJldHVybiB0cnVlOyAvLyBOYU4gPT09IE5hTg0KLSAgdmFyIHQxID0gdHlwZW9mIG8xLCB0MiA9IHR5cGVvZiBvMiwgbGVuZ3RoLCBrZXksIGtleVNldDsNCi0gIGlmICh0MSA9PSB0Mikgew0KLSAgICBpZiAodDEgPT0gJ29iamVjdCcpIHsNCi0gICAgICBpZiAoaXNBcnJheShvMSkpIHsNCi0gICAgICAgIGlmICghaXNBcnJheShvMikpIHJldHVybiBmYWxzZTsNCi0gICAgICAgIGlmICgobGVuZ3RoID0gbzEubGVuZ3RoKSA9PSBvMi5sZW5ndGgpIHsNCi0gICAgICAgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBsZW5ndGg7IGtleSsrKSB7DQotICAgICAgICAgICAgaWYgKCFlcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2UgaWYgKGlzRGF0ZShvMSkpIHsNCi0gICAgICAgIGlmICghaXNEYXRlKG8yKSkgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgcmV0dXJuIGVxdWFscyhvMS5nZXRUaW1lKCksIG8yLmdldFRpbWUoKSk7DQotICAgICAgfSBlbHNlIGlmIChpc1JlZ0V4cChvMSkgJiYgaXNSZWdFeHAobzIpKSB7DQotICAgICAgICByZXR1cm4gbzEudG9TdHJpbmcoKSA9PSBvMi50b1N0cmluZygpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAoaXNTY29wZShvMSkgfHwgaXNTY29wZShvMikgfHwgaXNXaW5kb3cobzEpIHx8IGlzV2luZG93KG8yKSB8fCBpc0FycmF5KG8yKSkgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAga2V5U2V0ID0ge307DQotICAgICAgICBmb3IgKGtleSBpbiBvMSkgew0KLSAgICAgICAgICBpZiAoa2V5LmNoYXJBdCgwKSA9PT0gJyQnIHx8IGlzRnVuY3Rpb24obzFba2V5XSkpIGNvbnRpbnVlOw0KLSAgICAgICAgICBpZiAoIWVxdWFscyhvMVtrZXldLCBvMltrZXldKSkgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICBrZXlTZXRba2V5XSA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICBmb3IgKGtleSBpbiBvMikgew0KLSAgICAgICAgICBpZiAoIWtleVNldC5oYXNPd25Qcm9wZXJ0eShrZXkpICYmDQotICAgICAgICAgICAgICBrZXkuY2hhckF0KDApICE9PSAnJCcgJiYNCi0gICAgICAgICAgICAgIG8yW2tleV0gIT09IHVuZGVmaW5lZCAmJg0KLSAgICAgICAgICAgICAgIWlzRnVuY3Rpb24obzJba2V5XSkpIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIGZhbHNlOw0KLX0NCi0NCi12YXIgY3NwID0gZnVuY3Rpb24oKSB7DQotICBpZiAoaXNEZWZpbmVkKGNzcC5pc0FjdGl2ZV8pKSByZXR1cm4gY3NwLmlzQWN0aXZlXzsNCi0NCi0gIHZhciBhY3RpdmUgPSAhIShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmctY3NwXScpIHx8DQotICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtbmctY3NwXScpKTsNCi0NCi0gIGlmICghYWN0aXZlKSB7DQotICAgIHRyeSB7DQotICAgICAgLyoganNoaW50IC1XMDMxLCAtVzA1NCAqLw0KLSAgICAgIG5ldyBGdW5jdGlvbignJyk7DQotICAgICAgLyoganNoaW50ICtXMDMxLCArVzA1NCAqLw0KLSAgICB9IGNhdGNoIChlKSB7DQotICAgICAgYWN0aXZlID0gdHJ1ZTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIChjc3AuaXNBY3RpdmVfID0gYWN0aXZlKTsNCi19Ow0KLQ0KLQ0KLQ0KLWZ1bmN0aW9uIGNvbmNhdChhcnJheTEsIGFycmF5MiwgaW5kZXgpIHsNCi0gIHJldHVybiBhcnJheTEuY29uY2F0KHNsaWNlLmNhbGwoYXJyYXkyLCBpbmRleCkpOw0KLX0NCi0NCi1mdW5jdGlvbiBzbGljZUFyZ3MoYXJncywgc3RhcnRJbmRleCkgew0KLSAgcmV0dXJuIHNsaWNlLmNhbGwoYXJncywgc3RhcnRJbmRleCB8fCAwKTsNCi19DQotDQotDQotLyoganNoaW50IC1XMTAxICovDQotLyoqDQotICogQG5nZG9jIGZ1bmN0aW9uDQotICogQG5hbWUgYW5ndWxhci5iaW5kDQotICogQG1vZHVsZSBuZw0KLSAqIEBraW5kIGZ1bmN0aW9uDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBSZXR1cm5zIGEgZnVuY3Rpb24gd2hpY2ggY2FsbHMgZnVuY3Rpb24gYGZuYCBib3VuZCB0byBgc2VsZmAgKGBzZWxmYCBiZWNvbWVzIHRoZSBgdGhpc2AgZm9yDQotICogYGZuYCkuIFlvdSBjYW4gc3VwcGx5IG9wdGlvbmFsIGBhcmdzYCB0aGF0IGFyZSBwcmVib3VuZCB0byB0aGUgZnVuY3Rpb24uIFRoaXMgZmVhdHVyZSBpcyBhbHNvDQotICoga25vd24gYXMgW3BhcnRpYWwgYXBwbGljYXRpb25dKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGFydGlhbF9hcHBsaWNhdGlvbiksIGFzDQotICogZGlzdGluZ3Vpc2hlZCBmcm9tIFtmdW5jdGlvbiBjdXJyeWluZ10oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdXJyeWluZyNDb250cmFzdF93aXRoX3BhcnRpYWxfZnVuY3Rpb25fYXBwbGljYXRpb24pLg0KLSAqDQotICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQ29udGV4dCB3aGljaCBgZm5gIHNob3VsZCBiZSBldmFsdWF0ZWQgaW4uDQotICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBGdW5jdGlvbiB0byBiZSBib3VuZC4NCi0gKiBAcGFyYW0gey4uLip9IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHByZWJvdW5kIHRvIHRoZSBgZm5gIGZ1bmN0aW9uIGNhbGwuDQotICogQHJldHVybnMge2Z1bmN0aW9uKCl9IEZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIGBmbmAgd2l0aCBhbGwgdGhlIHNwZWNpZmllZCBiaW5kaW5ncy4NCi0gKi8NCi0vKiBqc2hpbnQgK1cxMDEgKi8NCi1mdW5jdGlvbiBiaW5kKHNlbGYsIGZuKSB7DQotICB2YXIgY3VycnlBcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBzbGljZUFyZ3MoYXJndW1lbnRzLCAyKSA6IFtdOw0KLSAgaWYgKGlzRnVuY3Rpb24oZm4pICYmICEoZm4gaW5zdGFuY2VvZiBSZWdFeHApKSB7DQotICAgIHJldHVybiBjdXJyeUFyZ3MubGVuZ3RoDQotICAgICAgPyBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgNCi0gICAgICAgICAgICA/IGZuLmFwcGx5KHNlbGYsIGNvbmNhdChjdXJyeUFyZ3MsIGFyZ3VtZW50cywgMCkpDQotICAgICAgICAgICAgOiBmbi5hcHBseShzZWxmLCBjdXJyeUFyZ3MpOw0KLSAgICAgICAgfQ0KLSAgICAgIDogZnVuY3Rpb24oKSB7DQotICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoDQotICAgICAgICAgICAgPyBmbi5hcHBseShzZWxmLCBhcmd1bWVudHMpDQotICAgICAgICAgICAgOiBmbi5jYWxsKHNlbGYpOw0KLSAgICAgICAgfTsNCi0gIH0gZWxzZSB7DQotICAgIC8vIGluIElFLCBuYXRpdmUgbWV0aG9kcyBhcmUgbm90IGZ1bmN0aW9ucyBzbyB0aGV5IGNhbm5vdCBiZSBib3VuZCAobm90ZTogdGhleSBkb24ndCBuZWVkIHRvIGJlKQ0KLSAgICByZXR1cm4gZm47DQotICB9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHRvSnNvblJlcGxhY2VyKGtleSwgdmFsdWUpIHsNCi0gIHZhciB2YWwgPSB2YWx1ZTsNCi0NCi0gIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkuY2hhckF0KDApID09PSAnJCcgJiYga2V5LmNoYXJBdCgxKSA9PT0gJyQnKSB7DQotICAgIHZhbCA9IHVuZGVmaW5lZDsNCi0gIH0gZWxzZSBpZiAoaXNXaW5kb3codmFsdWUpKSB7DQotICAgIHZhbCA9ICckV0lORE9XJzsNCi0gIH0gZWxzZSBpZiAodmFsdWUgJiYgIGRvY3VtZW50ID09PSB2YWx1ZSkgew0KLSAgICB2YWwgPSAnJERPQ1VNRU5UJzsNCi0gIH0gZWxzZSBpZiAoaXNTY29wZSh2YWx1ZSkpIHsNCi0gICAgdmFsID0gJyRTQ09QRSc7DQotICB9DQotDQotICByZXR1cm4gdmFsOw0KLX0NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZnVuY3Rpb24NCi0gKiBAbmFtZSBhbmd1bGFyLnRvSnNvbg0KLSAqIEBtb2R1bGUgbmcNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogU2VyaWFsaXplcyBpbnB1dCBpbnRvIGEgSlNPTi1mb3JtYXR0ZWQgc3RyaW5nLiBQcm9wZXJ0aWVzIHdpdGggbGVhZGluZyAkJCBjaGFyYWN0ZXJzIHdpbGwgYmUNCi0gKiBzdHJpcHBlZCBzaW5jZSBhbmd1bGFyIHVzZXMgdGhpcyBub3RhdGlvbiBpbnRlcm5hbGx5Lg0KLSAqDQotICogQHBhcmFtIHtPYmplY3R8QXJyYXl8RGF0ZXxzdHJpbmd8bnVtYmVyfSBvYmogSW5wdXQgdG8gYmUgc2VyaWFsaXplZCBpbnRvIEpTT04uDQotICogQHBhcmFtIHtib29sZWFufG51bWJlcj19IHByZXR0eSBJZiBzZXQgdG8gdHJ1ZSwgdGhlIEpTT04gb3V0cHV0IHdpbGwgY29udGFpbiBuZXdsaW5lcyBhbmQgd2hpdGVzcGFjZS4NCi0gKiAgICBJZiBzZXQgdG8gYW4gaW50ZWdlciwgdGhlIEpTT04gb3V0cHV0IHdpbGwgY29udGFpbiB0aGF0IG1hbnkgc3BhY2VzIHBlciBpbmRlbnRhdGlvbiAodGhlIGRlZmF1bHQgaXMgMikuDQotICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IEpTT04taWZpZWQgc3RyaW5nIHJlcHJlc2VudGluZyBgb2JqYC4NCi0gKi8NCi1mdW5jdGlvbiB0b0pzb24ob2JqLCBwcmV0dHkpIHsNCi0gIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykgcmV0dXJuIHVuZGVmaW5lZDsNCi0gIGlmICghaXNOdW1iZXIocHJldHR5KSkgew0KLSAgICBwcmV0dHkgPSBwcmV0dHkgPyAyIDogbnVsbDsNCi0gIH0NCi0gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIHRvSnNvblJlcGxhY2VyLCBwcmV0dHkpOw0KLX0NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZnVuY3Rpb24NCi0gKiBAbmFtZSBhbmd1bGFyLmZyb21Kc29uDQotICogQG1vZHVsZSBuZw0KLSAqIEBraW5kIGZ1bmN0aW9uDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBEZXNlcmlhbGl6ZXMgYSBKU09OIHN0cmluZy4NCi0gKg0KLSAqIEBwYXJhbSB7c3RyaW5nfSBqc29uIEpTT04gc3RyaW5nIHRvIGRlc2VyaWFsaXplLg0KLSAqIEByZXR1cm5zIHtPYmplY3R8QXJyYXl8c3RyaW5nfG51bWJlcn0gRGVzZXJpYWxpemVkIEpTT04gc3RyaW5nLg0KLSAqLw0KLWZ1bmN0aW9uIGZyb21Kc29uKGpzb24pIHsNCi0gIHJldHVybiBpc1N0cmluZyhqc29uKQ0KLSAgICAgID8gSlNPTi5wYXJzZShqc29uKQ0KLSAgICAgIDoganNvbjsNCi19DQotDQotDQotLyoqDQotICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50Lg0KLSAqLw0KLWZ1bmN0aW9uIHN0YXJ0aW5nVGFnKGVsZW1lbnQpIHsNCi0gIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCkuY2xvbmUoKTsNCi0gIHRyeSB7DQotICAgIC8vIHR1cm5zIG91dCBJRSBkb2VzIG5vdCBsZXQgeW91IHNldCAuaHRtbCgpIG9uIGVsZW1lbnRzIHdoaWNoDQotICAgIC8vIGFyZSBub3QgYWxsb3dlZCB0byBoYXZlIGNoaWxkcmVuLiBTbyB3ZSBqdXN0IGlnbm9yZSBpdC4NCi0gICAgZWxlbWVudC5lbXB0eSgpOw0KLSAgfSBjYXRjaCAoZSkge30NCi0gIHZhciBlbGVtSHRtbCA9IGpxTGl0ZSgnPGRpdj4nKS5hcHBlbmQoZWxlbWVudCkuaHRtbCgpOw0KLSAgdHJ5IHsNCi0gICAgcmV0dXJuIGVsZW1lbnRbMF0ubm9kZVR5cGUgPT09IE5PREVfVFlQRV9URVhUID8gbG93ZXJjYXNlKGVsZW1IdG1sKSA6DQotICAgICAgICBlbGVtSHRtbC4NCi0gICAgICAgICAgbWF0Y2goL14oPFtePl0rPikvKVsxXS4NCi0gICAgICAgICAgcmVwbGFjZSgvXjwoW1x3XC1dKykvLCBmdW5jdGlvbihtYXRjaCwgbm9kZU5hbWUpIHsgcmV0dXJuICc8JyArIGxvd2VyY2FzZShub2RlTmFtZSk7IH0pOw0KLSAgfSBjYXRjaCAoZSkgew0KLSAgICByZXR1cm4gbG93ZXJjYXNlKGVsZW1IdG1sKTsNCi0gIH0NCi0NCi19DQotDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLS8qKg0KLSAqIFRyaWVzIHRvIGRlY29kZSB0aGUgVVJJIGNvbXBvbmVudCB3aXRob3V0IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4NCi0gKg0KLSAqIEBwcml2YXRlDQotICogQHBhcmFtIHN0ciB2YWx1ZSBwb3RlbnRpYWwgVVJJIGNvbXBvbmVudCB0byBjaGVjay4NCi0gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGNhbiBiZSBkZWNvZGVkDQotICogd2l0aCB0aGUgZGVjb2RlVVJJQ29tcG9uZW50IGZ1bmN0aW9uLg0KLSAqLw0KLWZ1bmN0aW9uIHRyeURlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgew0KLSAgdHJ5IHsNCi0gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7DQotICB9IGNhdGNoIChlKSB7DQotICAgIC8vIElnbm9yZSBhbnkgaW52YWxpZCB1cmkgY29tcG9uZW50DQotICB9DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIFBhcnNlcyBhbiBlc2NhcGVkIHVybCBxdWVyeSBzdHJpbmcgaW50byBrZXktdmFsdWUgcGFpcnMuDQotICogQHJldHVybnMge09iamVjdC48c3RyaW5nLGJvb2xlYW58QXJyYXk+fQ0KLSAqLw0KLWZ1bmN0aW9uIHBhcnNlS2V5VmFsdWUoLyoqc3RyaW5nKi9rZXlWYWx1ZSkgew0KLSAgdmFyIG9iaiA9IHt9LCBrZXlfdmFsdWUsIGtleTsNCi0gIGZvckVhY2goKGtleVZhbHVlIHx8ICIiKS5zcGxpdCgnJicpLCBmdW5jdGlvbihrZXlWYWx1ZSkgew0KLSAgICBpZiAoa2V5VmFsdWUpIHsNCi0gICAgICBrZXlfdmFsdWUgPSBrZXlWYWx1ZS5yZXBsYWNlKC9cKy9nLCclMjAnKS5zcGxpdCgnPScpOw0KLSAgICAgIGtleSA9IHRyeURlY29kZVVSSUNvbXBvbmVudChrZXlfdmFsdWVbMF0pOw0KLSAgICAgIGlmIChpc0RlZmluZWQoa2V5KSkgew0KLSAgICAgICAgdmFyIHZhbCA9IGlzRGVmaW5lZChrZXlfdmFsdWVbMV0pID8gdHJ5RGVjb2RlVVJJQ29tcG9uZW50KGtleV92YWx1ZVsxXSkgOiB0cnVlOw0KLSAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgew0KLSAgICAgICAgICBvYmpba2V5XSA9IHZhbDsNCi0gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmpba2V5XSkpIHsNCi0gICAgICAgICAgb2JqW2tleV0ucHVzaCh2YWwpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgb2JqW2tleV0gPSBbb2JqW2tleV0sdmFsXTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0pOw0KLSAgcmV0dXJuIG9iajsNCi19DQotDQotZnVuY3Rpb24gdG9LZXlWYWx1ZShvYmopIHsNCi0gIHZhciBwYXJ0cyA9IFtdOw0KLSAgZm9yRWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsNCi0gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7DQotICAgICAgZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24oYXJyYXlWYWx1ZSkgew0KLSAgICAgICAgcGFydHMucHVzaChlbmNvZGVVcmlRdWVyeShrZXksIHRydWUpICsNCi0gICAgICAgICAgICAgICAgICAgKGFycmF5VmFsdWUgPT09IHRydWUgPyAnJyA6ICc9JyArIGVuY29kZVVyaVF1ZXJ5KGFycmF5VmFsdWUsIHRydWUpKSk7DQotICAgICAgfSk7DQotICAgIH0gZWxzZSB7DQotICAgIHBhcnRzLnB1c2goZW5jb2RlVXJpUXVlcnkoa2V5LCB0cnVlKSArDQotICAgICAgICAgICAgICAgKHZhbHVlID09PSB0cnVlID8gJycgOiAnPScgKyBlbmNvZGVVcmlRdWVyeSh2YWx1ZSwgdHJ1ZSkpKTsNCi0gICAgfQ0KLSAgfSk7DQotICByZXR1cm4gcGFydHMubGVuZ3RoID8gcGFydHMuam9pbignJicpIDogJyc7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIFdlIG5lZWQgb3VyIGN1c3RvbSBtZXRob2QgYmVjYXVzZSBlbmNvZGVVUklDb21wb25lbnQgaXMgdG9vIGFnZ3Jlc3NpdmUgYW5kIGRvZXNuJ3QgZm9sbG93DQotICogaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzk4Ni50eHQgd2l0aCByZWdhcmRzIHRvIHRoZSBjaGFyYWN0ZXIgc2V0IChwY2hhcikgYWxsb3dlZCBpbiBwYXRoDQotICogc2VnbWVudHM6DQotICogICAgc2VnbWVudCAgICAgICA9ICpwY2hhcg0KLSAqICAgIHBjaGFyICAgICAgICAgPSB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zIC8gIjoiIC8gIkAiDQotICogICAgcGN0LWVuY29kZWQgICA9ICIlIiBIRVhESUcgSEVYRElHDQotICogICAgdW5yZXNlcnZlZCAgICA9IEFMUEhBIC8gRElHSVQgLyAiLSIgLyAiLiIgLyAiXyIgLyAifiINCi0gKiAgICBzdWItZGVsaW1zICAgID0gIiEiIC8gIiQiIC8gIiYiIC8gIiciIC8gIigiIC8gIikiDQotICogICAgICAgICAgICAgICAgICAgICAvICIqIiAvICIrIiAvICIsIiAvICI7IiAvICI9Ig0KLSAqLw0KLWZ1bmN0aW9uIGVuY29kZVVyaVNlZ21lbnQodmFsKSB7DQotICByZXR1cm4gZW5jb2RlVXJpUXVlcnkodmFsLCB0cnVlKS4NCi0gICAgICAgICAgICAgcmVwbGFjZSgvJTI2L2dpLCAnJicpLg0KLSAgICAgICAgICAgICByZXBsYWNlKC8lM0QvZ2ksICc9JykuDQotICAgICAgICAgICAgIHJlcGxhY2UoLyUyQi9naSwgJysnKTsNCi19DQotDQotDQotLyoqDQotICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGVuY29kaW5nICprZXkqIG9yICp2YWx1ZSogcGFydHMgb2YgcXVlcnkgY29tcG9uZW50LiBXZSBuZWVkIGEgY3VzdG9tDQotICogbWV0aG9kIGJlY2F1c2UgZW5jb2RlVVJJQ29tcG9uZW50IGlzIHRvbyBhZ2dyZXNzaXZlIGFuZCBlbmNvZGVzIHN0dWZmIHRoYXQgZG9lc24ndCBoYXZlIHRvIGJlDQotICogZW5jb2RlZCBwZXIgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NjoNCi0gKiAgICBxdWVyeSAgICAgICA9ICooIHBjaGFyIC8gIi8iIC8gIj8iICkNCi0gKiAgICBwY2hhciAgICAgICAgID0gdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyAvICI6IiAvICJAIg0KLSAqICAgIHVucmVzZXJ2ZWQgICAgPSBBTFBIQSAvIERJR0lUIC8gIi0iIC8gIi4iIC8gIl8iIC8gIn4iDQotICogICAgcGN0LWVuY29kZWQgICA9ICIlIiBIRVhESUcgSEVYRElHDQotICogICAgc3ViLWRlbGltcyAgICA9ICIhIiAvICIkIiAvICImIiAvICInIiAvICIoIiAvICIpIg0KLSAqICAgICAgICAgICAgICAgICAgICAgLyAiKiIgLyAiKyIgLyAiLCIgLyAiOyIgLyAiPSINCi0gKi8NCi1mdW5jdGlvbiBlbmNvZGVVcmlRdWVyeSh2YWwsIHBjdEVuY29kZVNwYWNlcykgew0KLSAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLg0KLSAgICAgICAgICAgICByZXBsYWNlKC8lNDAvZ2ksICdAJykuDQotICAgICAgICAgICAgIHJlcGxhY2UoLyUzQS9naSwgJzonKS4NCi0gICAgICAgICAgICAgcmVwbGFjZSgvJTI0L2csICckJykuDQotICAgICAgICAgICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS4NCi0gICAgICAgICAgICAgcmVwbGFjZSgvJTNCL2dpLCAnOycpLg0KLSAgICAgICAgICAgICByZXBsYWNlKC8lMjAvZywgKHBjdEVuY29kZVNwYWNlcyA/ICclMjAnIDogJysnKSk7DQotfQ0KLQ0KLXZhciBuZ0F0dHJQcmVmaXhlcyA9IFsnbmctJywgJ2RhdGEtbmctJywgJ25nOicsICd4LW5nLSddOw0KLQ0KLWZ1bmN0aW9uIGdldE5nQXR0cmlidXRlKGVsZW1lbnQsIG5nQXR0cikgew0KLSAgdmFyIGF0dHIsIGksIGlpID0gbmdBdHRyUHJlZml4ZXMubGVuZ3RoOw0KLSAgZWxlbWVudCA9IGpxTGl0ZShlbGVtZW50KTsNCi0gIGZvciAoaSA9IDA7IGkgPCBpaTsgKytpKSB7DQotICAgIGF0dHIgPSBuZ0F0dHJQcmVmaXhlc1tpXSArIG5nQXR0cjsNCi0gICAgaWYgKGlzU3RyaW5nKGF0dHIgPSBlbGVtZW50LmF0dHIoYXR0cikpKSB7DQotICAgICAgcmV0dXJuIGF0dHI7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBudWxsOw0KLX0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZGlyZWN0aXZlDQotICogQG5hbWUgbmdBcHANCi0gKiBAbW9kdWxlIG5nDQotICoNCi0gKiBAZWxlbWVudCBBTlkNCi0gKiBAcGFyYW0ge2FuZ3VsYXIuTW9kdWxlfSBuZ0FwcCBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbg0KLSAqICAge0BsaW5rIGFuZ3VsYXIubW9kdWxlIG1vZHVsZX0gbmFtZSB0byBsb2FkLg0KLSAqIEBwYXJhbSB7Ym9vbGVhbj19IG5nU3RyaWN0RGkgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgcHJlc2VudCBvbiB0aGUgYXBwIGVsZW1lbnQsIHRoZSBpbmplY3RvciB3aWxsIGJlDQotICogICBjcmVhdGVkIGluICJzdHJpY3QtZGkiIG1vZGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lsbCBmYWlsIHRvIGludm9rZSBmdW5jdGlvbnMgd2hpY2gNCi0gKiAgIGRvIG5vdCB1c2UgZXhwbGljaXQgZnVuY3Rpb24gYW5ub3RhdGlvbiAoYW5kIGFyZSB0aHVzIHVuc3VpdGFibGUgZm9yIG1pbmlmaWNhdGlvbiksIGFzIGRlc2NyaWJlZA0KLSAqICAgaW4ge0BsaW5rIGd1aWRlL2RpIHRoZSBEZXBlbmRlbmN5IEluamVjdGlvbiBndWlkZX0sIGFuZCB1c2VmdWwgZGVidWdnaW5nIGluZm8gd2lsbCBhc3Npc3QgaW4NCi0gKiAgIHRyYWNraW5nIGRvd24gdGhlIHJvb3Qgb2YgdGhlc2UgYnVncy4NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqDQotICogVXNlIHRoaXMgZGlyZWN0aXZlIHRvICoqYXV0by1ib290c3RyYXAqKiBhbiBBbmd1bGFySlMgYXBwbGljYXRpb24uIFRoZSBgbmdBcHBgIGRpcmVjdGl2ZQ0KLSAqIGRlc2lnbmF0ZXMgdGhlICoqcm9vdCBlbGVtZW50Kiogb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCBpcyB0eXBpY2FsbHkgcGxhY2VkIG5lYXIgdGhlIHJvb3QgZWxlbWVudA0KLSAqIG9mIHRoZSBwYWdlIC0gZS5nLiBvbiB0aGUgYDxib2R5PmAgb3IgYDxodG1sPmAgdGFncy4NCi0gKg0KLSAqIE9ubHkgb25lIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbiBjYW4gYmUgYXV0by1ib290c3RyYXBwZWQgcGVyIEhUTUwgZG9jdW1lbnQuIFRoZSBmaXJzdCBgbmdBcHBgDQotICogZm91bmQgaW4gdGhlIGRvY3VtZW50IHdpbGwgYmUgdXNlZCB0byBkZWZpbmUgdGhlIHJvb3QgZWxlbWVudCB0byBhdXRvLWJvb3RzdHJhcCBhcyBhbg0KLSAqIGFwcGxpY2F0aW9uLiBUbyBydW4gbXVsdGlwbGUgYXBwbGljYXRpb25zIGluIGFuIEhUTUwgZG9jdW1lbnQgeW91IG11c3QgbWFudWFsbHkgYm9vdHN0cmFwIHRoZW0gdXNpbmcNCi0gKiB7QGxpbmsgYW5ndWxhci5ib290c3RyYXB9IGluc3RlYWQuIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbnMgY2Fubm90IGJlIG5lc3RlZCB3aXRoaW4gZWFjaCBvdGhlci4NCi0gKg0KLSAqIFlvdSBjYW4gc3BlY2lmeSBhbiAqKkFuZ3VsYXJKUyBtb2R1bGUqKiB0byBiZSB1c2VkIGFzIHRoZSByb290IG1vZHVsZSBmb3IgdGhlIGFwcGxpY2F0aW9uLiAgVGhpcw0KLSAqIG1vZHVsZSB3aWxsIGJlIGxvYWRlZCBpbnRvIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3J9IHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGJvb3RzdHJhcHBlZC4gSXQNCi0gKiBzaG91bGQgY29udGFpbiB0aGUgYXBwbGljYXRpb24gY29kZSBuZWVkZWQgb3IgaGF2ZSBkZXBlbmRlbmNpZXMgb24gb3RoZXIgbW9kdWxlcyB0aGF0IHdpbGwNCi0gKiBjb250YWluIHRoZSBjb2RlLiBTZWUge0BsaW5rIGFuZ3VsYXIubW9kdWxlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCi0gKg0KLSAqIEluIHRoZSBleGFtcGxlIGJlbG93IGlmIHRoZSBgbmdBcHBgIGRpcmVjdGl2ZSB3ZXJlIG5vdCBwbGFjZWQgb24gdGhlIGBodG1sYCBlbGVtZW50IHRoZW4gdGhlDQotICogZG9jdW1lbnQgd291bGQgbm90IGJlIGNvbXBpbGVkLCB0aGUgYEFwcENvbnRyb2xsZXJgIHdvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgYW5kIHRoZSBge3sgYStiIH19YA0KLSAqIHdvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBgM2AuDQotICoNCi0gKiBgbmdBcHBgIGlzIHRoZSBlYXNpZXN0LCBhbmQgbW9zdCBjb21tb24gd2F5IHRvIGJvb3RzdHJhcCBhbiBhcHBsaWNhdGlvbi4NCi0gKg0KLSA8ZXhhbXBsZSBtb2R1bGU9Im5nQXBwRGVtbyI+DQotICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgPGRpdiBuZy1jb250cm9sbGVyPSJuZ0FwcERlbW9Db250cm9sbGVyIj4NCi0gICAgIEkgY2FuIGFkZDoge3thfX0gKyB7e2J9fSA9ICB7eyBhK2IgfX0NCi0gICA8L2Rpdj4NCi0gICA8L2ZpbGU+DQotICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4NCi0gICBhbmd1bGFyLm1vZHVsZSgnbmdBcHBEZW1vJywgW10pLmNvbnRyb2xsZXIoJ25nQXBwRGVtb0NvbnRyb2xsZXInLCBmdW5jdGlvbigkc2NvcGUpIHsNCi0gICAgICRzY29wZS5hID0gMTsNCi0gICAgICRzY29wZS5iID0gMjsNCi0gICB9KTsNCi0gICA8L2ZpbGU+DQotIDwvZXhhbXBsZT4NCi0gKg0KLSAqIFVzaW5nIGBuZ1N0cmljdERpYCwgeW91IHdvdWxkIHNlZSBzb21ldGhpbmcgbGlrZSB0aGlzOg0KLSAqDQotIDxleGFtcGxlIG5nLWFwcC1pbmNsdWRlZD0idHJ1ZSI+DQotICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgPGRpdiBuZy1hcHA9Im5nQXBwU3RyaWN0RGVtbyIgbmctc3RyaWN0LWRpPg0KLSAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9Ikdvb2RDb250cm9sbGVyMSI+DQotICAgICAgICAgICBJIGNhbiBhZGQ6IHt7YX19ICsge3tifX0gPSAge3sgYStiIH19DQotDQotICAgICAgICAgICA8cD5UaGlzIHJlbmRlcnMgYmVjYXVzZSB0aGUgY29udHJvbGxlciBkb2VzIG5vdCBmYWlsIHRvDQotICAgICAgICAgICAgICBpbnN0YW50aWF0ZSwgYnkgdXNpbmcgZXhwbGljaXQgYW5ub3RhdGlvbiBzdHlsZSAoc2VlDQotICAgICAgICAgICAgICBzY3JpcHQuanMgZm9yIGRldGFpbHMpDQotICAgICAgICAgICA8L3A+DQotICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9Ikdvb2RDb250cm9sbGVyMiI+DQotICAgICAgICAgICBOYW1lOiA8aW5wdXQgbmctbW9kZWw9Im5hbWUiPjxiciAvPg0KLSAgICAgICAgICAgSGVsbG8sIHt7bmFtZX19IQ0KLQ0KLSAgICAgICAgICAgPHA+VGhpcyByZW5kZXJzIGJlY2F1c2UgdGhlIGNvbnRyb2xsZXIgZG9lcyBub3QgZmFpbCB0bw0KLSAgICAgICAgICAgICAgaW5zdGFudGlhdGUsIGJ5IHVzaW5nIGV4cGxpY2l0IGFubm90YXRpb24gc3R5bGUNCi0gICAgICAgICAgICAgIChzZWUgc2NyaXB0LmpzIGZvciBkZXRhaWxzKQ0KLSAgICAgICAgICAgPC9wPg0KLSAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJCYWRDb250cm9sbGVyIj4NCi0gICAgICAgICAgIEkgY2FuIGFkZDoge3thfX0gKyB7e2J9fSA9ICB7eyBhK2IgfX0NCi0NCi0gICAgICAgICAgIDxwPlRoZSBjb250cm9sbGVyIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQsIGR1ZSB0byByZWx5aW5nDQotICAgICAgICAgICAgICBvbiBhdXRvbWF0aWMgZnVuY3Rpb24gYW5ub3RhdGlvbnMgKHdoaWNoIGFyZSBkaXNhYmxlZCBpbg0KLSAgICAgICAgICAgICAgc3RyaWN0IG1vZGUpLiBBcyBzdWNoLCB0aGUgY29udGVudCBvZiB0aGlzIHNlY3Rpb24gaXMgbm90DQotICAgICAgICAgICAgICBpbnRlcnBvbGF0ZWQsIGFuZCB0aGVyZSBzaG91bGQgYmUgYW4gZXJyb3IgaW4geW91ciB3ZWIgY29uc29sZS4NCi0gICAgICAgICAgIDwvcD4NCi0gICAgICAgPC9kaXY+DQotICAgPC9kaXY+DQotICAgPC9maWxlPg0KLSAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+DQotICAgYW5ndWxhci5tb2R1bGUoJ25nQXBwU3RyaWN0RGVtbycsIFtdKQ0KLSAgICAgLy8gQmFkQ29udHJvbGxlciB3aWxsIGZhaWwgdG8gaW5zdGFudGlhdGUsIGR1ZSB0byByZWx5aW5nIG9uIGF1dG9tYXRpYyBmdW5jdGlvbiBhbm5vdGF0aW9uLA0KLSAgICAgLy8gcmF0aGVyIHRoYW4gYW4gZXhwbGljaXQgYW5ub3RhdGlvbg0KLSAgICAgLmNvbnRyb2xsZXIoJ0JhZENvbnRyb2xsZXInLCBmdW5jdGlvbigkc2NvcGUpIHsNCi0gICAgICAgJHNjb3BlLmEgPSAxOw0KLSAgICAgICAkc2NvcGUuYiA9IDI7DQotICAgICB9KQ0KLSAgICAgLy8gVW5saWtlIEJhZENvbnRyb2xsZXIsIEdvb2RDb250cm9sbGVyMSBhbmQgR29vZENvbnRyb2xsZXIyIHdpbGwgbm90IGZhaWwgdG8gYmUgaW5zdGFudGlhdGVkLA0KLSAgICAgLy8gZHVlIHRvIHVzaW5nIGV4cGxpY2l0IGFubm90YXRpb25zIHVzaW5nIHRoZSBhcnJheSBzdHlsZSBhbmQgJGluamVjdCBwcm9wZXJ0eSwgcmVzcGVjdGl2ZWx5Lg0KLSAgICAgLmNvbnRyb2xsZXIoJ0dvb2RDb250cm9sbGVyMScsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICRzY29wZS5hID0gMTsNCi0gICAgICAgJHNjb3BlLmIgPSAyOw0KLSAgICAgfV0pDQotICAgICAuY29udHJvbGxlcignR29vZENvbnRyb2xsZXIyJywgR29vZENvbnRyb2xsZXIyKTsNCi0gICAgIGZ1bmN0aW9uIEdvb2RDb250cm9sbGVyMigkc2NvcGUpIHsNCi0gICAgICAgJHNjb3BlLm5hbWUgPSAiV29ybGQiOw0KLSAgICAgfQ0KLSAgICAgR29vZENvbnRyb2xsZXIyLiRpbmplY3QgPSBbJyRzY29wZSddOw0KLSAgIDwvZmlsZT4NCi0gICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPg0KLSAgIGRpdltuZy1jb250cm9sbGVyXSB7DQotICAgICAgIG1hcmdpbi1ib3R0b206IDFlbTsNCi0gICAgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7DQotICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCi0gICAgICAgYm9yZGVyOiAxcHggc29saWQ7DQotICAgICAgIHBhZGRpbmc6IC41ZW07DQotICAgfQ0KLSAgIGRpdltuZy1jb250cm9sbGVyXj1Hb29kXSB7DQotICAgICAgIGJvcmRlci1jb2xvcjogI2Q2ZTljNjsNCi0gICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODsNCi0gICAgICAgY29sb3I6ICMzYzc2M2Q7DQotICAgfQ0KLSAgIGRpdltuZy1jb250cm9sbGVyXj1CYWRdIHsNCi0gICAgICAgYm9yZGVyLWNvbG9yOiAjZWJjY2QxOw0KLSAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlOw0KLSAgICAgICBjb2xvcjogI2E5NDQ0MjsNCi0gICAgICAgbWFyZ2luLWJvdHRvbTogMDsNCi0gICB9DQotICAgPC9maWxlPg0KLSA8L2V4YW1wbGU+DQotICovDQotZnVuY3Rpb24gYW5ndWxhckluaXQoZWxlbWVudCwgYm9vdHN0cmFwKSB7DQotICB2YXIgYXBwRWxlbWVudCwNCi0gICAgICBtb2R1bGUsDQotICAgICAgY29uZmlnID0ge307DQotDQotICAvLyBUaGUgZWxlbWVudCBgZWxlbWVudGAgaGFzIHByaW9yaXR5IG92ZXIgYW55IG90aGVyIGVsZW1lbnQNCi0gIGZvckVhY2gobmdBdHRyUHJlZml4ZXMsIGZ1bmN0aW9uKHByZWZpeCkgew0KLSAgICB2YXIgbmFtZSA9IHByZWZpeCArICdhcHAnOw0KLQ0KLSAgICBpZiAoIWFwcEVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUobmFtZSkpIHsNCi0gICAgICBhcHBFbGVtZW50ID0gZWxlbWVudDsNCi0gICAgICBtb2R1bGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKTsNCi0gICAgfQ0KLSAgfSk7DQotICBmb3JFYWNoKG5nQXR0clByZWZpeGVzLCBmdW5jdGlvbihwcmVmaXgpIHsNCi0gICAgdmFyIG5hbWUgPSBwcmVmaXggKyAnYXBwJzsNCi0gICAgdmFyIGNhbmRpZGF0ZTsNCi0NCi0gICAgaWYgKCFhcHBFbGVtZW50ICYmIChjYW5kaWRhdGUgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1snICsgbmFtZS5yZXBsYWNlKCc6JywgJ1xcOicpICsgJ10nKSkpIHsNCi0gICAgICBhcHBFbGVtZW50ID0gY2FuZGlkYXRlOw0KLSAgICAgIG1vZHVsZSA9IGNhbmRpZGF0ZS5nZXRBdHRyaWJ1dGUobmFtZSk7DQotICAgIH0NCi0gIH0pOw0KLSAgaWYgKGFwcEVsZW1lbnQpIHsNCi0gICAgY29uZmlnLnN0cmljdERpID0gZ2V0TmdBdHRyaWJ1dGUoYXBwRWxlbWVudCwgInN0cmljdC1kaSIpICE9PSBudWxsOw0KLSAgICBib290c3RyYXAoYXBwRWxlbWVudCwgbW9kdWxlID8gW21vZHVsZV0gOiBbXSwgY29uZmlnKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQG5nZG9jIGZ1bmN0aW9uDQotICogQG5hbWUgYW5ndWxhci5ib290c3RyYXANCi0gKiBAbW9kdWxlIG5nDQotICogQGRlc2NyaXB0aW9uDQotICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFudWFsbHkgc3RhcnQgdXAgYW5ndWxhciBhcHBsaWNhdGlvbi4NCi0gKg0KLSAqIFNlZToge0BsaW5rIGd1aWRlL2Jvb3RzdHJhcCBCb290c3RyYXB9DQotICoNCi0gKiBOb3RlIHRoYXQgUHJvdHJhY3RvciBiYXNlZCBlbmQtdG8tZW5kIHRlc3RzIGNhbm5vdCB1c2UgdGhpcyBmdW5jdGlvbiB0byBib290c3RyYXAgbWFudWFsbHkuDQotICogVGhleSBtdXN0IHVzZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQXBwIG5nQXBwfS4NCi0gKg0KLSAqIEFuZ3VsYXIgd2lsbCBkZXRlY3QgaWYgaXQgaGFzIGJlZW4gbG9hZGVkIGludG8gdGhlIGJyb3dzZXIgbW9yZSB0aGFuIG9uY2UgYW5kIG9ubHkgYWxsb3cgdGhlDQotICogZmlyc3QgbG9hZGVkIHNjcmlwdCB0byBiZSBib290c3RyYXBwZWQgYW5kIHdpbGwgcmVwb3J0IGEgd2FybmluZyB0byB0aGUgYnJvd3NlciBjb25zb2xlIGZvcg0KLSAqIGVhY2ggb2YgdGhlIHN1YnNlcXVlbnQgc2NyaXB0cy4gVGhpcyBwcmV2ZW50cyBzdHJhbmdlIHJlc3VsdHMgaW4gYXBwbGljYXRpb25zLCB3aGVyZSBvdGhlcndpc2UNCi0gKiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgQW5ndWxhciB0cnkgdG8gd29yayBvbiB0aGUgRE9NLg0KLSAqDQotICogYGBgaHRtbA0KLSAqIDwhZG9jdHlwZSBodG1sPg0KLSAqIDxodG1sPg0KLSAqIDxib2R5Pg0KLSAqIDxkaXYgbmctY29udHJvbGxlcj0iV2VsY29tZUNvbnRyb2xsZXIiPg0KLSAqICAge3tncmVldGluZ319DQotICogPC9kaXY+DQotICoNCi0gKiA8c2NyaXB0IHNyYz0iYW5ndWxhci5qcyI+PC9zY3JpcHQ+DQotICogPHNjcmlwdD4NCi0gKiAgIHZhciBhcHAgPSBhbmd1bGFyLm1vZHVsZSgnZGVtbycsIFtdKQ0KLSAqICAgLmNvbnRyb2xsZXIoJ1dlbGNvbWVDb250cm9sbGVyJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICogICAgICAgJHNjb3BlLmdyZWV0aW5nID0gJ1dlbGNvbWUhJzsNCi0gKiAgIH0pOw0KLSAqICAgYW5ndWxhci5ib290c3RyYXAoZG9jdW1lbnQsIFsnZGVtbyddKTsNCi0gKiA8L3NjcmlwdD4NCi0gKiA8L2JvZHk+DQotICogPC9odG1sPg0KLSAqIGBgYA0KLSAqDQotICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IERPTSBlbGVtZW50IHdoaWNoIGlzIHRoZSByb290IG9mIGFuZ3VsYXIgYXBwbGljYXRpb24uDQotICogQHBhcmFtIHtBcnJheTxTdHJpbmd8RnVuY3Rpb258QXJyYXk+PX0gbW9kdWxlcyBhbiBhcnJheSBvZiBtb2R1bGVzIHRvIGxvYWQgaW50byB0aGUgYXBwbGljYXRpb24uDQotICogICAgIEVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgcHJlZGVmaW5lZCBtb2R1bGUgb3IgYSAoREkgYW5ub3RhdGVkKQ0KLSAqICAgICBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUgaW5qZWN0b3IgYXMgYSBydW4gYmxvY2suDQotICogICAgIFNlZToge0BsaW5rIGFuZ3VsYXIubW9kdWxlIG1vZHVsZXN9DQotICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgYW4gb2JqZWN0IGZvciBkZWZpbmluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhlDQotICogICAgIGZvbGxvd2luZyBrZXlzIGFyZSBzdXBwb3J0ZWQ6DQotICoNCi0gKiAqIGBzdHJpY3REaWAgLSBkaXNhYmxlIGF1dG9tYXRpYyBmdW5jdGlvbiBhbm5vdGF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24uIFRoaXMgaXMgbWVhbnQgdG8NCi0gKiAgIGFzc2lzdCBpbiBmaW5kaW5nIGJ1Z3Mgd2hpY2ggYnJlYWsgbWluaWZpZWQgY29kZS4gRGVmYXVsdHMgdG8gYGZhbHNlYC4NCi0gKg0KLSAqIEByZXR1cm5zIHthdXRvLiRpbmplY3Rvcn0gUmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCBpbmplY3RvciBmb3IgdGhpcyBhcHAuDQotICovDQotZnVuY3Rpb24gYm9vdHN0cmFwKGVsZW1lbnQsIG1vZHVsZXMsIGNvbmZpZykgew0KLSAgaWYgKCFpc09iamVjdChjb25maWcpKSBjb25maWcgPSB7fTsNCi0gIHZhciBkZWZhdWx0Q29uZmlnID0gew0KLSAgICBzdHJpY3REaTogZmFsc2UNCi0gIH07DQotICBjb25maWcgPSBleHRlbmQoZGVmYXVsdENvbmZpZywgY29uZmlnKTsNCi0gIHZhciBkb0Jvb3RzdHJhcCA9IGZ1bmN0aW9uKCkgew0KLSAgICBlbGVtZW50ID0ganFMaXRlKGVsZW1lbnQpOw0KLQ0KLSAgICBpZiAoZWxlbWVudC5pbmplY3RvcigpKSB7DQotICAgICAgdmFyIHRhZyA9IChlbGVtZW50WzBdID09PSBkb2N1bWVudCkgPyAnZG9jdW1lbnQnIDogc3RhcnRpbmdUYWcoZWxlbWVudCk7DQotICAgICAgLy9FbmNvZGUgYW5nbGUgYnJhY2tldHMgdG8gcHJldmVudCBpbnB1dCBmcm9tIGJlaW5nIHNhbml0aXplZCB0byBlbXB0eSBzdHJpbmcgIzg2ODMNCi0gICAgICB0aHJvdyBuZ01pbkVycigNCi0gICAgICAgICAgJ2J0c3RycGQnLA0KLSAgICAgICAgICAiQXBwIEFscmVhZHkgQm9vdHN0cmFwcGVkIHdpdGggdGhpcyBFbGVtZW50ICd7MH0nIiwNCi0gICAgICAgICAgdGFnLnJlcGxhY2UoLzwvLCcmbHQ7JykucmVwbGFjZSgvPi8sJyZndDsnKSk7DQotICAgIH0NCi0NCi0gICAgbW9kdWxlcyA9IG1vZHVsZXMgfHwgW107DQotICAgIG1vZHVsZXMudW5zaGlmdChbJyRwcm92aWRlJywgZnVuY3Rpb24oJHByb3ZpZGUpIHsNCi0gICAgICAkcHJvdmlkZS52YWx1ZSgnJHJvb3RFbGVtZW50JywgZWxlbWVudCk7DQotICAgIH1dKTsNCi0NCi0gICAgaWYgKGNvbmZpZy5kZWJ1Z0luZm9FbmFibGVkKSB7DQotICAgICAgLy8gUHVzaGluZyBzbyB0aGF0IHRoaXMgb3ZlcnJpZGVzIGBkZWJ1Z0luZm9FbmFibGVkYCBzZXR0aW5nIGRlZmluZWQgaW4gdXNlcidzIGBtb2R1bGVzYC4NCi0gICAgICBtb2R1bGVzLnB1c2goWyckY29tcGlsZVByb3ZpZGVyJywgZnVuY3Rpb24oJGNvbXBpbGVQcm92aWRlcikgew0KLSAgICAgICAgJGNvbXBpbGVQcm92aWRlci5kZWJ1Z0luZm9FbmFibGVkKHRydWUpOw0KLSAgICAgIH1dKTsNCi0gICAgfQ0KLQ0KLSAgICBtb2R1bGVzLnVuc2hpZnQoJ25nJyk7DQotICAgIHZhciBpbmplY3RvciA9IGNyZWF0ZUluamVjdG9yKG1vZHVsZXMsIGNvbmZpZy5zdHJpY3REaSk7DQotICAgIGluamVjdG9yLmludm9rZShbJyRyb290U2NvcGUnLCAnJHJvb3RFbGVtZW50JywgJyRjb21waWxlJywgJyRpbmplY3RvcicsDQotICAgICAgIGZ1bmN0aW9uIGJvb3RzdHJhcEFwcGx5KHNjb3BlLCBlbGVtZW50LCBjb21waWxlLCBpbmplY3Rvcikgew0KLSAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICBlbGVtZW50LmRhdGEoJyRpbmplY3RvcicsIGluamVjdG9yKTsNCi0gICAgICAgICAgY29tcGlsZShlbGVtZW50KShzY29wZSk7DQotICAgICAgICB9KTsNCi0gICAgICB9XQ0KLSAgICApOw0KLSAgICByZXR1cm4gaW5qZWN0b3I7DQotICB9Ow0KLQ0KLSAgdmFyIE5HX0VOQUJMRV9ERUJVR19JTkZPID0gL15OR19FTkFCTEVfREVCVUdfSU5GTyEvOw0KLSAgdmFyIE5HX0RFRkVSX0JPT1RTVFJBUCA9IC9eTkdfREVGRVJfQk9PVFNUUkFQIS87DQotDQotICBpZiAod2luZG93ICYmIE5HX0VOQUJMRV9ERUJVR19JTkZPLnRlc3Qod2luZG93Lm5hbWUpKSB7DQotICAgIGNvbmZpZy5kZWJ1Z0luZm9FbmFibGVkID0gdHJ1ZTsNCi0gICAgd2luZG93Lm5hbWUgPSB3aW5kb3cubmFtZS5yZXBsYWNlKE5HX0VOQUJMRV9ERUJVR19JTkZPLCAnJyk7DQotICB9DQotDQotICBpZiAod2luZG93ICYmICFOR19ERUZFUl9CT09UU1RSQVAudGVzdCh3aW5kb3cubmFtZSkpIHsNCi0gICAgcmV0dXJuIGRvQm9vdHN0cmFwKCk7DQotICB9DQotDQotICB3aW5kb3cubmFtZSA9IHdpbmRvdy5uYW1lLnJlcGxhY2UoTkdfREVGRVJfQk9PVFNUUkFQLCAnJyk7DQotICBhbmd1bGFyLnJlc3VtZUJvb3RzdHJhcCA9IGZ1bmN0aW9uKGV4dHJhTW9kdWxlcykgew0KLSAgICBmb3JFYWNoKGV4dHJhTW9kdWxlcywgZnVuY3Rpb24obW9kdWxlKSB7DQotICAgICAgbW9kdWxlcy5wdXNoKG1vZHVsZSk7DQotICAgIH0pOw0KLSAgICBkb0Jvb3RzdHJhcCgpOw0KLSAgfTsNCi19DQotDQotLyoqDQotICogQG5nZG9jIGZ1bmN0aW9uDQotICogQG5hbWUgYW5ndWxhci5yZWxvYWRXaXRoRGVidWdJbmZvDQotICogQG1vZHVsZSBuZw0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIHJlbG9hZCB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiB3aXRoIGRlYnVnIGluZm9ybWF0aW9uIHR1cm5lZCBvbi4NCi0gKiBUaGlzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBhIGNhbGwgdG8gYCRjb21waWxlUHJvdmlkZXIuZGVidWdJbmZvRW5hYmxlZChmYWxzZSlgLg0KLSAqDQotICogU2VlIHtAbGluayBuZy4kY29tcGlsZVByb3ZpZGVyI2RlYnVnSW5mb0VuYWJsZWR9IGZvciBtb3JlLg0KLSAqLw0KLWZ1bmN0aW9uIHJlbG9hZFdpdGhEZWJ1Z0luZm8oKSB7DQotICB3aW5kb3cubmFtZSA9ICdOR19FTkFCTEVfREVCVUdfSU5GTyEnICsgd2luZG93Lm5hbWU7DQotICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBuYW1lIGFuZ3VsYXIuZ2V0VGVzdGFiaWxpdHkNCi0gKiBAbW9kdWxlIG5nDQotICogQGRlc2NyaXB0aW9uDQotICogR2V0IHRoZSB0ZXN0YWJpbGl0eSBzZXJ2aWNlIGZvciB0aGUgaW5zdGFuY2Ugb2YgQW5ndWxhciBvbiB0aGUgZ2l2ZW4NCi0gKiBlbGVtZW50Lg0KLSAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCBET00gZWxlbWVudCB3aGljaCBpcyB0aGUgcm9vdCBvZiBhbmd1bGFyIGFwcGxpY2F0aW9uLg0KLSAqLw0KLWZ1bmN0aW9uIGdldFRlc3RhYmlsaXR5KHJvb3RFbGVtZW50KSB7DQotICB2YXIgaW5qZWN0b3IgPSBhbmd1bGFyLmVsZW1lbnQocm9vdEVsZW1lbnQpLmluamVjdG9yKCk7DQotICBpZiAoIWluamVjdG9yKSB7DQotICAgIHRocm93IG5nTWluRXJyKCd0ZXN0JywNCi0gICAgICAnbm8gaW5qZWN0b3IgZm91bmQgZm9yIGVsZW1lbnQgYXJndW1lbnQgdG8gZ2V0VGVzdGFiaWxpdHknKTsNCi0gIH0NCi0gIHJldHVybiBpbmplY3Rvci5nZXQoJyQkdGVzdGFiaWxpdHknKTsNCi19DQotDQotdmFyIFNOQUtFX0NBU0VfUkVHRVhQID0gL1tBLVpdL2c7DQotZnVuY3Rpb24gc25ha2VfY2FzZShuYW1lLCBzZXBhcmF0b3IpIHsNCi0gIHNlcGFyYXRvciA9IHNlcGFyYXRvciB8fCAnXyc7DQotICByZXR1cm4gbmFtZS5yZXBsYWNlKFNOQUtFX0NBU0VfUkVHRVhQLCBmdW5jdGlvbihsZXR0ZXIsIHBvcykgew0KLSAgICByZXR1cm4gKHBvcyA/IHNlcGFyYXRvciA6ICcnKSArIGxldHRlci50b0xvd2VyQ2FzZSgpOw0KLSAgfSk7DQotfQ0KLQ0KLXZhciBiaW5kSlF1ZXJ5RmlyZWQgPSBmYWxzZTsNCi12YXIgc2tpcERlc3Ryb3lPbk5leHRKUXVlcnlDbGVhbkRhdGE7DQotZnVuY3Rpb24gYmluZEpRdWVyeSgpIHsNCi0gIHZhciBvcmlnaW5hbENsZWFuRGF0YTsNCi0NCi0gIGlmIChiaW5kSlF1ZXJ5RmlyZWQpIHsNCi0gICAgcmV0dXJuOw0KLSAgfQ0KLQ0KLSAgLy8gYmluZCB0byBqUXVlcnkgaWYgcHJlc2VudDsNCi0gIGpRdWVyeSA9IHdpbmRvdy5qUXVlcnk7DQotICAvLyBVc2UgalF1ZXJ5IGlmIGl0IGV4aXN0cyB3aXRoIHByb3BlciBmdW5jdGlvbmFsaXR5LCBvdGhlcndpc2UgZGVmYXVsdCB0byB1cy4NCi0gIC8vIEFuZ3VsYXIgMS4yKyByZXF1aXJlcyBqUXVlcnkgMS43KyBmb3Igb24oKS9vZmYoKSBzdXBwb3J0Lg0KLSAgLy8gQW5ndWxhciAxLjMrIHRlY2huaWNhbGx5IHJlcXVpcmVzIGF0IGxlYXN0IGpRdWVyeSAyLjErIGJ1dCBpdCBtYXkgd29yayB3aXRoIG9sZGVyDQotICAvLyB2ZXJzaW9ucy4gSXQgd2lsbCBub3Qgd29yayBmb3Igc3VyZSB3aXRoIGpRdWVyeSA8MS43LCB0aG91Z2guDQotICBpZiAoalF1ZXJ5ICYmIGpRdWVyeS5mbi5vbikgew0KLSAgICBqcUxpdGUgPSBqUXVlcnk7DQotICAgIGV4dGVuZChqUXVlcnkuZm4sIHsNCi0gICAgICBzY29wZTogSlFMaXRlUHJvdG90eXBlLnNjb3BlLA0KLSAgICAgIGlzb2xhdGVTY29wZTogSlFMaXRlUHJvdG90eXBlLmlzb2xhdGVTY29wZSwNCi0gICAgICBjb250cm9sbGVyOiBKUUxpdGVQcm90b3R5cGUuY29udHJvbGxlciwNCi0gICAgICBpbmplY3RvcjogSlFMaXRlUHJvdG90eXBlLmluamVjdG9yLA0KLSAgICAgIGluaGVyaXRlZERhdGE6IEpRTGl0ZVByb3RvdHlwZS5pbmhlcml0ZWREYXRhDQotICAgIH0pOw0KLQ0KLSAgICAvLyBBbGwgbm9kZXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gdmlhIHZhcmlvdXMgalF1ZXJ5IEFQSXMgbGlrZSAucmVtb3ZlKCkNCi0gICAgLy8gYXJlIHBhc3NlZCB0aHJvdWdoIGpRdWVyeS5jbGVhbkRhdGEuIE1vbmtleS1wYXRjaCB0aGlzIG1ldGhvZCB0byBmaXJlDQotICAgIC8vIHRoZSAkZGVzdHJveSBldmVudCBvbiBhbGwgcmVtb3ZlZCBub2Rlcy4NCi0gICAgb3JpZ2luYWxDbGVhbkRhdGEgPSBqUXVlcnkuY2xlYW5EYXRhOw0KLSAgICBqUXVlcnkuY2xlYW5EYXRhID0gZnVuY3Rpb24oZWxlbXMpIHsNCi0gICAgICB2YXIgZXZlbnRzOw0KLSAgICAgIGlmICghc2tpcERlc3Ryb3lPbk5leHRKUXVlcnlDbGVhbkRhdGEpIHsNCi0gICAgICAgIGZvciAodmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKyspIHsNCi0gICAgICAgICAgZXZlbnRzID0galF1ZXJ5Ll9kYXRhKGVsZW0sICJldmVudHMiKTsNCi0gICAgICAgICAgaWYgKGV2ZW50cyAmJiBldmVudHMuJGRlc3Ryb3kpIHsNCi0gICAgICAgICAgICBqUXVlcnkoZWxlbSkudHJpZ2dlckhhbmRsZXIoJyRkZXN0cm95Jyk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgc2tpcERlc3Ryb3lPbk5leHRKUXVlcnlDbGVhbkRhdGEgPSBmYWxzZTsNCi0gICAgICB9DQotICAgICAgb3JpZ2luYWxDbGVhbkRhdGEoZWxlbXMpOw0KLSAgICB9Ow0KLSAgfSBlbHNlIHsNCi0gICAganFMaXRlID0gSlFMaXRlOw0KLSAgfQ0KLQ0KLSAgYW5ndWxhci5lbGVtZW50ID0ganFMaXRlOw0KLQ0KLSAgLy8gUHJldmVudCBkb3VibGUtcHJveHlpbmcuDQotICBiaW5kSlF1ZXJ5RmlyZWQgPSB0cnVlOw0KLX0NCi0NCi0vKioNCi0gKiB0aHJvdyBlcnJvciBpZiB0aGUgYXJndW1lbnQgaXMgZmFsc3kuDQotICovDQotZnVuY3Rpb24gYXNzZXJ0QXJnKGFyZywgbmFtZSwgcmVhc29uKSB7DQotICBpZiAoIWFyZykgew0KLSAgICB0aHJvdyBuZ01pbkVycignYXJlcScsICJBcmd1bWVudCAnezB9JyBpcyB7MX0iLCAobmFtZSB8fCAnPycpLCAocmVhc29uIHx8ICJyZXF1aXJlZCIpKTsNCi0gIH0NCi0gIHJldHVybiBhcmc7DQotfQ0KLQ0KLWZ1bmN0aW9uIGFzc2VydEFyZ0ZuKGFyZywgbmFtZSwgYWNjZXB0QXJyYXlBbm5vdGF0aW9uKSB7DQotICBpZiAoYWNjZXB0QXJyYXlBbm5vdGF0aW9uICYmIGlzQXJyYXkoYXJnKSkgew0KLSAgICAgIGFyZyA9IGFyZ1thcmcubGVuZ3RoIC0gMV07DQotICB9DQotDQotICBhc3NlcnRBcmcoaXNGdW5jdGlvbihhcmcpLCBuYW1lLCAnbm90IGEgZnVuY3Rpb24sIGdvdCAnICsNCi0gICAgICAoYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnID8gYXJnLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCcgOiB0eXBlb2YgYXJnKSk7DQotICByZXR1cm4gYXJnOw0KLX0NCi0NCi0vKioNCi0gKiB0aHJvdyBlcnJvciBpZiB0aGUgbmFtZSBnaXZlbiBpcyBoYXNPd25Qcm9wZXJ0eQ0KLSAqIEBwYXJhbSAge1N0cmluZ30gbmFtZSAgICB0aGUgbmFtZSB0byB0ZXN0DQotICogQHBhcmFtICB7U3RyaW5nfSBjb250ZXh0IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBuYW1lIGlzIHVzZWQsIHN1Y2ggYXMgbW9kdWxlIG9yIGRpcmVjdGl2ZQ0KLSAqLw0KLWZ1bmN0aW9uIGFzc2VydE5vdEhhc093blByb3BlcnR5KG5hbWUsIGNvbnRleHQpIHsNCi0gIGlmIChuYW1lID09PSAnaGFzT3duUHJvcGVydHknKSB7DQotICAgIHRocm93IG5nTWluRXJyKCdiYWRuYW1lJywgImhhc093blByb3BlcnR5IGlzIG5vdCBhIHZhbGlkIHswfSBuYW1lIiwgY29udGV4dCk7DQotICB9DQotfQ0KLQ0KLS8qKg0KLSAqIFJldHVybiB0aGUgdmFsdWUgYWNjZXNzaWJsZSBmcm9tIHRoZSBvYmplY3QgYnkgcGF0aC4gQW55IHVuZGVmaW5lZCB0cmF2ZXJzYWxzIGFyZSBpZ25vcmVkDQotICogQHBhcmFtIHtPYmplY3R9IG9iaiBzdGFydGluZyBvYmplY3QNCi0gKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBwYXRoIHRvIHRyYXZlcnNlDQotICogQHBhcmFtIHtib29sZWFufSBbYmluZEZuVG9TY29wZT10cnVlXQ0KLSAqIEByZXR1cm5zIHtPYmplY3R9IHZhbHVlIGFzIGFjY2Vzc2libGUgYnkgcGF0aA0KLSAqLw0KLS8vVE9ETyhtaXNrbyk6IHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmVtb3ZlZA0KLWZ1bmN0aW9uIGdldHRlcihvYmosIHBhdGgsIGJpbmRGblRvU2NvcGUpIHsNCi0gIGlmICghcGF0aCkgcmV0dXJuIG9iajsNCi0gIHZhciBrZXlzID0gcGF0aC5zcGxpdCgnLicpOw0KLSAgdmFyIGtleTsNCi0gIHZhciBsYXN0SW5zdGFuY2UgPSBvYmo7DQotICB2YXIgbGVuID0ga2V5cy5sZW5ndGg7DQotDQotICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQotICAgIGtleSA9IGtleXNbaV07DQotICAgIGlmIChvYmopIHsNCi0gICAgICBvYmogPSAobGFzdEluc3RhbmNlID0gb2JqKVtrZXldOw0KLSAgICB9DQotICB9DQotICBpZiAoIWJpbmRGblRvU2NvcGUgJiYgaXNGdW5jdGlvbihvYmopKSB7DQotICAgIHJldHVybiBiaW5kKGxhc3RJbnN0YW5jZSwgb2JqKTsNCi0gIH0NCi0gIHJldHVybiBvYmo7DQotfQ0KLQ0KLS8qKg0KLSAqIFJldHVybiB0aGUgRE9NIHNpYmxpbmdzIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgaW4gdGhlIGdpdmVuIGFycmF5Lg0KLSAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IGxpa2Ugb2JqZWN0DQotICogQHJldHVybnMge2pxTGl0ZX0ganFMaXRlIGNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgbm9kZXMNCi0gKi8NCi1mdW5jdGlvbiBnZXRCbG9ja05vZGVzKG5vZGVzKSB7DQotICAvLyBUT0RPKHBlcmYpOiBqdXN0IGNoZWNrIGlmIGFsbCBpdGVtcyBpbiBgbm9kZXNgIGFyZSBzaWJsaW5ncyBhbmQgaWYgdGhleSBhcmUgcmV0dXJuIHRoZSBvcmlnaW5hbA0KLSAgLy8gICAgICAgICAgICAgY29sbGVjdGlvbiwgb3RoZXJ3aXNlIHVwZGF0ZSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4NCi0gIHZhciBub2RlID0gbm9kZXNbMF07DQotICB2YXIgZW5kTm9kZSA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdOw0KLSAgdmFyIGJsb2NrTm9kZXMgPSBbbm9kZV07DQotDQotICBkbyB7DQotICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOw0KLSAgICBpZiAoIW5vZGUpIGJyZWFrOw0KLSAgICBibG9ja05vZGVzLnB1c2gobm9kZSk7DQotICB9IHdoaWxlIChub2RlICE9PSBlbmROb2RlKTsNCi0NCi0gIHJldHVybiBqcUxpdGUoYmxvY2tOb2Rlcyk7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGhvdXQgYSBwcm90b3R5cGUuIFRoaXMgb2JqZWN0IGlzIHVzZWZ1bCBmb3IgbG9va3VwIHdpdGhvdXQgaGF2aW5nIHRvDQotICogZ3VhcmQgYWdhaW5zdCBwcm90b3R5cGljYWxseSBpbmhlcml0ZWQgcHJvcGVydGllcyB2aWEgaGFzT3duUHJvcGVydHkuDQotICoNCi0gKiBSZWxhdGVkIG1pY3JvLWJlbmNobWFya3M6DQotICogLSBodHRwOi8vanNwZXJmLmNvbS9vYmplY3QtY3JlYXRlMg0KLSAqIC0gaHR0cDovL2pzcGVyZi5jb20vcHJvdG8tbWFwLWxvb2t1cC8yDQotICogLSBodHRwOi8vanNwZXJmLmNvbS9mb3ItaW4tdnMtb2JqZWN0LWtleXMyDQotICoNCi0gKiBAcmV0dXJucyB7T2JqZWN0fQ0KLSAqLw0KLWZ1bmN0aW9uIGNyZWF0ZU1hcCgpIHsNCi0gIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpOw0KLX0NCi0NCi12YXIgTk9ERV9UWVBFX0VMRU1FTlQgPSAxOw0KLXZhciBOT0RFX1RZUEVfVEVYVCA9IDM7DQotdmFyIE5PREVfVFlQRV9DT01NRU5UID0gODsNCi12YXIgTk9ERV9UWVBFX0RPQ1VNRU5UID0gOTsNCi12YXIgTk9ERV9UWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UID0gMTE7DQotDQotLyoqDQotICogQG5nZG9jIHR5cGUNCi0gKiBAbmFtZSBhbmd1bGFyLk1vZHVsZQ0KLSAqIEBtb2R1bGUgbmcNCi0gKiBAZGVzY3JpcHRpb24NCi0gKg0KLSAqIEludGVyZmFjZSBmb3IgY29uZmlndXJpbmcgYW5ndWxhciB7QGxpbmsgYW5ndWxhci5tb2R1bGUgbW9kdWxlc30uDQotICovDQotDQotZnVuY3Rpb24gc2V0dXBNb2R1bGVMb2FkZXIod2luZG93KSB7DQotDQotICB2YXIgJGluamVjdG9yTWluRXJyID0gbWluRXJyKCckaW5qZWN0b3InKTsNCi0gIHZhciBuZ01pbkVyciA9IG1pbkVycignbmcnKTsNCi0NCi0gIGZ1bmN0aW9uIGVuc3VyZShvYmosIG5hbWUsIGZhY3RvcnkpIHsNCi0gICAgcmV0dXJuIG9ialtuYW1lXSB8fCAob2JqW25hbWVdID0gZmFjdG9yeSgpKTsNCi0gIH0NCi0NCi0gIHZhciBhbmd1bGFyID0gZW5zdXJlKHdpbmRvdywgJ2FuZ3VsYXInLCBPYmplY3QpOw0KLQ0KLSAgLy8gV2UgbmVlZCB0byBleHBvc2UgYGFuZ3VsYXIuJCRtaW5FcnJgIHRvIG1vZHVsZXMgc3VjaCBhcyBgbmdSZXNvdXJjZWAgdGhhdCByZWZlcmVuY2UgaXQgZHVyaW5nIGJvb3RzdHJhcA0KLSAgYW5ndWxhci4kJG1pbkVyciA9IGFuZ3VsYXIuJCRtaW5FcnIgfHwgbWluRXJyOw0KLQ0KLSAgcmV0dXJuIGVuc3VyZShhbmd1bGFyLCAnbW9kdWxlJywgZnVuY3Rpb24oKSB7DQotICAgIC8qKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsIGFuZ3VsYXIuTW9kdWxlPn0gKi8NCi0gICAgdmFyIG1vZHVsZXMgPSB7fTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBmdW5jdGlvbg0KLSAgICAgKiBAbmFtZSBhbmd1bGFyLm1vZHVsZQ0KLSAgICAgKiBAbW9kdWxlIG5nDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKg0KLSAgICAgKiBUaGUgYGFuZ3VsYXIubW9kdWxlYCBpcyBhIGdsb2JhbCBwbGFjZSBmb3IgY3JlYXRpbmcsIHJlZ2lzdGVyaW5nIGFuZCByZXRyaWV2aW5nIEFuZ3VsYXINCi0gICAgICogbW9kdWxlcy4NCi0gICAgICogQWxsIG1vZHVsZXMgKGFuZ3VsYXIgY29yZSBvciAzcmQgcGFydHkpIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSB0byBhbiBhcHBsaWNhdGlvbiBtdXN0IGJlDQotICAgICAqIHJlZ2lzdGVyZWQgdXNpbmcgdGhpcyBtZWNoYW5pc20uDQotICAgICAqDQotICAgICAqIFdoZW4gcGFzc2VkIHR3byBvciBtb3JlIGFyZ3VtZW50cywgYSBuZXcgbW9kdWxlIGlzIGNyZWF0ZWQuICBJZiBwYXNzZWQgb25seSBvbmUgYXJndW1lbnQsIGFuDQotICAgICAqIGV4aXN0aW5nIG1vZHVsZSAodGhlIG5hbWUgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBgbW9kdWxlYCkgaXMgcmV0cmlldmVkLg0KLSAgICAgKg0KLSAgICAgKg0KLSAgICAgKiAjIE1vZHVsZQ0KLSAgICAgKg0KLSAgICAgKiBBIG1vZHVsZSBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VydmljZXMsIGRpcmVjdGl2ZXMsIGNvbnRyb2xsZXJzLCBmaWx0ZXJzLCBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4NCi0gICAgICogYGFuZ3VsYXIubW9kdWxlYCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uDQotICAgICAqDQotICAgICAqIGBgYGpzDQotICAgICAqIC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUNCi0gICAgICogdmFyIG15TW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ215TW9kdWxlJywgW10pOw0KLSAgICAgKg0KLSAgICAgKiAvLyByZWdpc3RlciBhIG5ldyBzZXJ2aWNlDQotICAgICAqIG15TW9kdWxlLnZhbHVlKCdhcHBOYW1lJywgJ015Q29vbEFwcCcpOw0KLSAgICAgKg0KLSAgICAgKiAvLyBjb25maWd1cmUgZXhpc3Rpbmcgc2VydmljZXMgaW5zaWRlIGluaXRpYWxpemF0aW9uIGJsb2Nrcy4NCi0gICAgICogbXlNb2R1bGUuY29uZmlnKFsnJGxvY2F0aW9uUHJvdmlkZXInLCBmdW5jdGlvbigkbG9jYXRpb25Qcm92aWRlcikgew0KLSAgICAgKiAgIC8vIENvbmZpZ3VyZSBleGlzdGluZyBwcm92aWRlcnMNCi0gICAgICogICAkbG9jYXRpb25Qcm92aWRlci5oYXNoUHJlZml4KCchJyk7DQotICAgICAqIH1dKTsNCi0gICAgICogYGBgDQotICAgICAqDQotICAgICAqIFRoZW4geW91IGNhbiBjcmVhdGUgYW4gaW5qZWN0b3IgYW5kIGxvYWQgeW91ciBtb2R1bGVzIGxpa2UgdGhpczoNCi0gICAgICoNCi0gICAgICogYGBganMNCi0gICAgICogdmFyIGluamVjdG9yID0gYW5ndWxhci5pbmplY3RvcihbJ25nJywgJ215TW9kdWxlJ10pDQotICAgICAqIGBgYA0KLSAgICAgKg0KLSAgICAgKiBIb3dldmVyIGl0J3MgbW9yZSBsaWtlbHkgdGhhdCB5b3UnbGwganVzdCB1c2UNCi0gICAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0FwcCBuZ0FwcH0gb3INCi0gICAgICoge0BsaW5rIGFuZ3VsYXIuYm9vdHN0cmFwfSB0byBzaW1wbGlmeSB0aGlzIHByb2Nlc3MgZm9yIHlvdS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHshc3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gY3JlYXRlIG9yIHJldHJpZXZlLg0KLSAgICAgKiBAcGFyYW0geyFBcnJheS48c3RyaW5nPj19IHJlcXVpcmVzIElmIHNwZWNpZmllZCB0aGVuIG5ldyBtb2R1bGUgaXMgYmVpbmcgY3JlYXRlZC4gSWYNCi0gICAgICogICAgICAgIHVuc3BlY2lmaWVkIHRoZW4gdGhlIG1vZHVsZSBpcyBiZWluZyByZXRyaWV2ZWQgZm9yIGZ1cnRoZXIgY29uZmlndXJhdGlvbi4NCi0gICAgICogQHBhcmFtIHtGdW5jdGlvbj19IGNvbmZpZ0ZuIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBtb2R1bGUuIFNhbWUgYXMNCi0gICAgICogICAgICAgIHtAbGluayBhbmd1bGFyLk1vZHVsZSNjb25maWcgTW9kdWxlI2NvbmZpZygpfS4NCi0gICAgICogQHJldHVybnMge21vZHVsZX0gbmV3IG1vZHVsZSB3aXRoIHRoZSB7QGxpbmsgYW5ndWxhci5Nb2R1bGV9IGFwaS4NCi0gICAgICovDQotICAgIHJldHVybiBmdW5jdGlvbiBtb2R1bGUobmFtZSwgcmVxdWlyZXMsIGNvbmZpZ0ZuKSB7DQotICAgICAgdmFyIGFzc2VydE5vdEhhc093blByb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgY29udGV4dCkgew0KLSAgICAgICAgaWYgKG5hbWUgPT09ICdoYXNPd25Qcm9wZXJ0eScpIHsNCi0gICAgICAgICAgdGhyb3cgbmdNaW5FcnIoJ2JhZG5hbWUnLCAnaGFzT3duUHJvcGVydHkgaXMgbm90IGEgdmFsaWQgezB9IG5hbWUnLCBjb250ZXh0KTsNCi0gICAgICAgIH0NCi0gICAgICB9Ow0KLQ0KLSAgICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KG5hbWUsICdtb2R1bGUnKTsNCi0gICAgICBpZiAocmVxdWlyZXMgJiYgbW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgew0KLSAgICAgICAgbW9kdWxlc1tuYW1lXSA9IG51bGw7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBlbnN1cmUobW9kdWxlcywgbmFtZSwgZnVuY3Rpb24oKSB7DQotICAgICAgICBpZiAoIXJlcXVpcmVzKSB7DQotICAgICAgICAgIHRocm93ICRpbmplY3Rvck1pbkVycignbm9tb2QnLCAiTW9kdWxlICd7MH0nIGlzIG5vdCBhdmFpbGFibGUhIFlvdSBlaXRoZXIgbWlzc3BlbGxlZCAiICsNCi0gICAgICAgICAgICAgInRoZSBtb2R1bGUgbmFtZSBvciBmb3Jnb3QgdG8gbG9hZCBpdC4gSWYgcmVnaXN0ZXJpbmcgYSBtb2R1bGUgZW5zdXJlIHRoYXQgeW91ICIgKw0KLSAgICAgICAgICAgICAic3BlY2lmeSB0aGUgZGVwZW5kZW5jaWVzIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuIiwgbmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvKiogQHR5cGUgeyFBcnJheS48QXJyYXkuPCo+Pn0gKi8NCi0gICAgICAgIHZhciBpbnZva2VRdWV1ZSA9IFtdOw0KLQ0KLSAgICAgICAgLyoqIEB0eXBlIHshQXJyYXkuPEZ1bmN0aW9uPn0gKi8NCi0gICAgICAgIHZhciBjb25maWdCbG9ja3MgPSBbXTsNCi0NCi0gICAgICAgIC8qKiBAdHlwZSB7IUFycmF5LjxGdW5jdGlvbj59ICovDQotICAgICAgICB2YXIgcnVuQmxvY2tzID0gW107DQotDQotICAgICAgICB2YXIgY29uZmlnID0gaW52b2tlTGF0ZXIoJyRpbmplY3RvcicsICdpbnZva2UnLCAncHVzaCcsIGNvbmZpZ0Jsb2Nrcyk7DQotDQotICAgICAgICAvKiogQHR5cGUge2FuZ3VsYXIuTW9kdWxlfSAqLw0KLSAgICAgICAgdmFyIG1vZHVsZUluc3RhbmNlID0gew0KLSAgICAgICAgICAvLyBQcml2YXRlIHN0YXRlDQotICAgICAgICAgIF9pbnZva2VRdWV1ZTogaW52b2tlUXVldWUsDQotICAgICAgICAgIF9jb25maWdCbG9ja3M6IGNvbmZpZ0Jsb2NrcywNCi0gICAgICAgICAgX3J1bkJsb2NrczogcnVuQmxvY2tzLA0KLQ0KLSAgICAgICAgICAvKioNCi0gICAgICAgICAgICogQG5nZG9jIHByb3BlcnR5DQotICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI3JlcXVpcmVzDQotICAgICAgICAgICAqIEBtb2R1bGUgbmcNCi0gICAgICAgICAgICoNCi0gICAgICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICAgICAqIEhvbGRzIHRoZSBsaXN0IG9mIG1vZHVsZXMgd2hpY2ggdGhlIGluamVjdG9yIHdpbGwgbG9hZCBiZWZvcmUgdGhlIGN1cnJlbnQgbW9kdWxlIGlzDQotICAgICAgICAgICAqIGxvYWRlZC4NCi0gICAgICAgICAgICovDQotICAgICAgICAgIHJlcXVpcmVzOiByZXF1aXJlcywNCi0NCi0gICAgICAgICAgLyoqDQotICAgICAgICAgICAqIEBuZ2RvYyBwcm9wZXJ0eQ0KLSAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNuYW1lDQotICAgICAgICAgICAqIEBtb2R1bGUgbmcNCi0gICAgICAgICAgICoNCi0gICAgICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICAgICAqIE5hbWUgb2YgdGhlIG1vZHVsZS4NCi0gICAgICAgICAgICovDQotICAgICAgICAgIG5hbWU6IG5hbWUsDQotDQotDQotICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI3Byb3ZpZGVyDQotICAgICAgICAgICAqIEBtb2R1bGUgbmcNCi0gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgc2VydmljZSBuYW1lDQotICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByb3ZpZGVyVHlwZSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZiB0aGUNCi0gICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuDQotICAgICAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAgICAgKiBTZWUge0BsaW5rIGF1dG8uJHByb3ZpZGUjcHJvdmlkZXIgJHByb3ZpZGUucHJvdmlkZXIoKX0uDQotICAgICAgICAgICAqLw0KLSAgICAgICAgICBwcm92aWRlcjogaW52b2tlTGF0ZXIoJyRwcm92aWRlJywgJ3Byb3ZpZGVyJyksDQotDQotICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI2ZhY3RvcnkNCi0gICAgICAgICAgICogQG1vZHVsZSBuZw0KLSAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBzZXJ2aWNlIG5hbWUNCi0gICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJvdmlkZXJGdW5jdGlvbiBGdW5jdGlvbiBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlLg0KLSAgICAgICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgICAgICogU2VlIHtAbGluayBhdXRvLiRwcm92aWRlI2ZhY3RvcnkgJHByb3ZpZGUuZmFjdG9yeSgpfS4NCi0gICAgICAgICAgICovDQotICAgICAgICAgIGZhY3Rvcnk6IGludm9rZUxhdGVyKCckcHJvdmlkZScsICdmYWN0b3J5JyksDQotDQotICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI3NlcnZpY2UNCi0gICAgICAgICAgICogQG1vZHVsZSBuZw0KLSAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBzZXJ2aWNlIG5hbWUNCi0gICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW5zdGFudGlhdGVkLg0KLSAgICAgICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgICAgICogU2VlIHtAbGluayBhdXRvLiRwcm92aWRlI3NlcnZpY2UgJHByb3ZpZGUuc2VydmljZSgpfS4NCi0gICAgICAgICAgICovDQotICAgICAgICAgIHNlcnZpY2U6IGludm9rZUxhdGVyKCckcHJvdmlkZScsICdzZXJ2aWNlJyksDQotDQotICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI3ZhbHVlDQotICAgICAgICAgICAqIEBtb2R1bGUgbmcNCi0gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgc2VydmljZSBuYW1lDQotICAgICAgICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0IFNlcnZpY2UgaW5zdGFuY2Ugb2JqZWN0Lg0KLSAgICAgICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgICAgICogU2VlIHtAbGluayBhdXRvLiRwcm92aWRlI3ZhbHVlICRwcm92aWRlLnZhbHVlKCl9Lg0KLSAgICAgICAgICAgKi8NCi0gICAgICAgICAgdmFsdWU6IGludm9rZUxhdGVyKCckcHJvdmlkZScsICd2YWx1ZScpLA0KLQ0KLSAgICAgICAgICAvKioNCi0gICAgICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNjb25zdGFudA0KLSAgICAgICAgICAgKiBAbW9kdWxlIG5nDQotICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIGNvbnN0YW50IG5hbWUNCi0gICAgICAgICAgICogQHBhcmFtIHsqfSBvYmplY3QgQ29uc3RhbnQgdmFsdWUuDQotICAgICAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAgICAgKiBCZWNhdXNlIHRoZSBjb25zdGFudCBhcmUgZml4ZWQsIHRoZXkgZ2V0IGFwcGxpZWQgYmVmb3JlIG90aGVyIHByb3ZpZGUgbWV0aG9kcy4NCi0gICAgICAgICAgICogU2VlIHtAbGluayBhdXRvLiRwcm92aWRlI2NvbnN0YW50ICRwcm92aWRlLmNvbnN0YW50KCl9Lg0KLSAgICAgICAgICAgKi8NCi0gICAgICAgICAgY29uc3RhbnQ6IGludm9rZUxhdGVyKCckcHJvdmlkZScsICdjb25zdGFudCcsICd1bnNoaWZ0JyksDQotDQotICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI2FuaW1hdGlvbg0KLSAgICAgICAgICAgKiBAbW9kdWxlIG5nDQotICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIGFuaW1hdGlvbiBuYW1lDQotICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFuaW1hdGlvbkZhY3RvcnkgRmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlIG9mIGFuDQotICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLg0KLSAgICAgICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgICAgICoNCi0gICAgICAgICAgICogKipOT1RFKio6IGFuaW1hdGlvbnMgdGFrZSBlZmZlY3Qgb25seSBpZiB0aGUgKipuZ0FuaW1hdGUqKiBtb2R1bGUgaXMgbG9hZGVkLg0KLSAgICAgICAgICAgKg0KLSAgICAgICAgICAgKg0KLSAgICAgICAgICAgKiBEZWZpbmVzIGFuIGFuaW1hdGlvbiBob29rIHRoYXQgY2FuIGJlIGxhdGVyIHVzZWQgd2l0aA0KLSAgICAgICAgICAgKiB7QGxpbmsgbmdBbmltYXRlLiRhbmltYXRlICRhbmltYXRlfSBzZXJ2aWNlIGFuZCBkaXJlY3RpdmVzIHRoYXQgdXNlIHRoaXMgc2VydmljZS4NCi0gICAgICAgICAgICoNCi0gICAgICAgICAgICogYGBganMNCi0gICAgICAgICAgICogbW9kdWxlLmFuaW1hdGlvbignLmFuaW1hdGlvbi1uYW1lJywgZnVuY3Rpb24oJGluamVjdDEsICRpbmplY3QyKSB7DQotICAgICAgICAgICAqICAgcmV0dXJuIHsNCi0gICAgICAgICAgICogICAgIGV2ZW50TmFtZSA6IGZ1bmN0aW9uKGVsZW1lbnQsIGRvbmUpIHsNCi0gICAgICAgICAgICogICAgICAgLy9jb2RlIHRvIHJ1biB0aGUgYW5pbWF0aW9uDQotICAgICAgICAgICAqICAgICAgIC8vb25jZSBjb21wbGV0ZSwgdGhlbiBydW4gZG9uZSgpDQotICAgICAgICAgICAqICAgICAgIHJldHVybiBmdW5jdGlvbiBjYW5jZWxsYXRpb25GdW5jdGlvbihlbGVtZW50KSB7DQotICAgICAgICAgICAqICAgICAgICAgLy9jb2RlIHRvIGNhbmNlbCB0aGUgYW5pbWF0aW9uDQotICAgICAgICAgICAqICAgICAgIH0NCi0gICAgICAgICAgICogICAgIH0NCi0gICAgICAgICAgICogICB9DQotICAgICAgICAgICAqIH0pDQotICAgICAgICAgICAqIGBgYA0KLSAgICAgICAgICAgKg0KLSAgICAgICAgICAgKiBTZWUge0BsaW5rIG5nLiRhbmltYXRlUHJvdmlkZXIjcmVnaXN0ZXIgJGFuaW1hdGVQcm92aWRlci5yZWdpc3RlcigpfSBhbmQNCi0gICAgICAgICAgICoge0BsaW5rIG5nQW5pbWF0ZSBuZ0FuaW1hdGUgbW9kdWxlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCi0gICAgICAgICAgICovDQotICAgICAgICAgIGFuaW1hdGlvbjogaW52b2tlTGF0ZXIoJyRhbmltYXRlUHJvdmlkZXInLCAncmVnaXN0ZXInKSwNCi0NCi0gICAgICAgICAgLyoqDQotICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjZmlsdGVyDQotICAgICAgICAgICAqIEBtb2R1bGUgbmcNCi0gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgRmlsdGVyIG5hbWUuDQotICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlckZhY3RvcnkgRmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlIG9mIGZpbHRlci4NCi0gICAgICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICAgICAqIFNlZSB7QGxpbmsgbmcuJGZpbHRlclByb3ZpZGVyI3JlZ2lzdGVyICRmaWx0ZXJQcm92aWRlci5yZWdpc3RlcigpfS4NCi0gICAgICAgICAgICovDQotICAgICAgICAgIGZpbHRlcjogaW52b2tlTGF0ZXIoJyRmaWx0ZXJQcm92aWRlcicsICdyZWdpc3RlcicpLA0KLQ0KLSAgICAgICAgICAvKioNCi0gICAgICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNjb250cm9sbGVyDQotICAgICAgICAgICAqIEBtb2R1bGUgbmcNCi0gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBuYW1lIENvbnRyb2xsZXIgbmFtZSwgb3IgYW4gb2JqZWN0IG1hcCBvZiBjb250cm9sbGVycyB3aGVyZSB0aGUNCi0gICAgICAgICAgICogICAga2V5cyBhcmUgdGhlIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgY29uc3RydWN0b3JzLg0KLSAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvciBDb250cm9sbGVyIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLg0KLSAgICAgICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgICAgICogU2VlIHtAbGluayBuZy4kY29udHJvbGxlclByb3ZpZGVyI3JlZ2lzdGVyICRjb250cm9sbGVyUHJvdmlkZXIucmVnaXN0ZXIoKX0uDQotICAgICAgICAgICAqLw0KLSAgICAgICAgICBjb250cm9sbGVyOiBpbnZva2VMYXRlcignJGNvbnRyb2xsZXJQcm92aWRlcicsICdyZWdpc3RlcicpLA0KLQ0KLSAgICAgICAgICAvKioNCi0gICAgICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNkaXJlY3RpdmUNCi0gICAgICAgICAgICogQG1vZHVsZSBuZw0KLSAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWUgRGlyZWN0aXZlIG5hbWUsIG9yIGFuIG9iamVjdCBtYXAgb2YgZGlyZWN0aXZlcyB3aGVyZSB0aGUNCi0gICAgICAgICAgICogICAga2V5cyBhcmUgdGhlIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgZmFjdG9yaWVzLg0KLSAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkaXJlY3RpdmVGYWN0b3J5IEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZg0KLSAgICAgICAgICAgKiBkaXJlY3RpdmVzLg0KLSAgICAgICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgICAgICogU2VlIHtAbGluayBuZy4kY29tcGlsZVByb3ZpZGVyI2RpcmVjdGl2ZSAkY29tcGlsZVByb3ZpZGVyLmRpcmVjdGl2ZSgpfS4NCi0gICAgICAgICAgICovDQotICAgICAgICAgIGRpcmVjdGl2ZTogaW52b2tlTGF0ZXIoJyRjb21waWxlUHJvdmlkZXInLCAnZGlyZWN0aXZlJyksDQotDQotICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI2NvbmZpZw0KLSAgICAgICAgICAgKiBAbW9kdWxlIG5nDQotICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbmZpZ0ZuIEV4ZWN1dGUgdGhpcyBmdW5jdGlvbiBvbiBtb2R1bGUgbG9hZC4gVXNlZnVsIGZvciBzZXJ2aWNlDQotICAgICAgICAgICAqICAgIGNvbmZpZ3VyYXRpb24uDQotICAgICAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gcmVnaXN0ZXIgd29yayB3aGljaCBuZWVkcyB0byBiZSBwZXJmb3JtZWQgb24gbW9kdWxlIGxvYWRpbmcuDQotICAgICAgICAgICAqIEZvciBtb3JlIGFib3V0IGhvdyB0byBjb25maWd1cmUgc2VydmljZXMsIHNlZQ0KLSAgICAgICAgICAgKiB7QGxpbmsgcHJvdmlkZXJzI3Byb3ZpZGVyLXJlY2lwZSBQcm92aWRlciBSZWNpcGV9Lg0KLSAgICAgICAgICAgKi8NCi0gICAgICAgICAgY29uZmlnOiBjb25maWcsDQotDQotICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI3J1bg0KLSAgICAgICAgICAgKiBAbW9kdWxlIG5nDQotICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGluaXRpYWxpemF0aW9uRm4gRXhlY3V0ZSB0aGlzIGZ1bmN0aW9uIGFmdGVyIGluamVjdG9yIGNyZWF0aW9uLg0KLSAgICAgICAgICAgKiAgICBVc2VmdWwgZm9yIGFwcGxpY2F0aW9uIGluaXRpYWxpemF0aW9uLg0KLSAgICAgICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHdvcmsgd2hpY2ggc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBpbmplY3RvciBpcyBkb25lDQotICAgICAgICAgICAqIGxvYWRpbmcgYWxsIG1vZHVsZXMuDQotICAgICAgICAgICAqLw0KLSAgICAgICAgICBydW46IGZ1bmN0aW9uKGJsb2NrKSB7DQotICAgICAgICAgICAgcnVuQmxvY2tzLnB1c2goYmxvY2spOw0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOw0KLSAgICAgICAgICB9DQotICAgICAgICB9Ow0KLQ0KLSAgICAgICAgaWYgKGNvbmZpZ0ZuKSB7DQotICAgICAgICAgIGNvbmZpZyhjb25maWdGbik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbW9kdWxlSW5zdGFuY2U7DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcg0KLSAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZA0KLSAgICAgICAgICogQHBhcmFtIHtTdHJpbmc9fSBpbnNlcnRNZXRob2QNCi0gICAgICAgICAqIEByZXR1cm5zIHthbmd1bGFyLk1vZHVsZX0NCi0gICAgICAgICAqLw0KLSAgICAgICAgZnVuY3Rpb24gaW52b2tlTGF0ZXIocHJvdmlkZXIsIG1ldGhvZCwgaW5zZXJ0TWV0aG9kLCBxdWV1ZSkgew0KLSAgICAgICAgICBpZiAoIXF1ZXVlKSBxdWV1ZSA9IGludm9rZVF1ZXVlOw0KLSAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgcXVldWVbaW5zZXJ0TWV0aG9kIHx8ICdwdXNoJ10oW3Byb3ZpZGVyLCBtZXRob2QsIGFyZ3VtZW50c10pOw0KLSAgICAgICAgICAgIHJldHVybiBtb2R1bGVJbnN0YW5jZTsNCi0gICAgICAgICAgfTsNCi0gICAgICAgIH0NCi0gICAgICB9KTsNCi0gICAgfTsNCi0gIH0pOw0KLQ0KLX0NCi0NCi0vKiBnbG9iYWw6IHRvRGVidWdTdHJpbmc6IHRydWUgKi8NCi0NCi1mdW5jdGlvbiBzZXJpYWxpemVPYmplY3Qob2JqKSB7DQotICB2YXIgc2VlbiA9IFtdOw0KLQ0KLSAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgZnVuY3Rpb24oa2V5LCB2YWwpIHsNCi0gICAgdmFsID0gdG9Kc29uUmVwbGFjZXIoa2V5LCB2YWwpOw0KLSAgICBpZiAoaXNPYmplY3QodmFsKSkgew0KLQ0KLSAgICAgIGlmIChzZWVuLmluZGV4T2YodmFsKSA+PSAwKSByZXR1cm4gJzw8YWxyZWFkeSBzZWVuPj4nOw0KLQ0KLSAgICAgIHNlZW4ucHVzaCh2YWwpOw0KLSAgICB9DQotICAgIHJldHVybiB2YWw7DQotICB9KTsNCi19DQotDQotZnVuY3Rpb24gdG9EZWJ1Z1N0cmluZyhvYmopIHsNCi0gIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7DQotICAgIHJldHVybiBvYmoudG9TdHJpbmcoKS5yZXBsYWNlKC8gXHtbXHNcU10qJC8sICcnKTsNCi0gIH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHsNCi0gICAgcmV0dXJuICd1bmRlZmluZWQnOw0KLSAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqICE9PSAnc3RyaW5nJykgew0KLSAgICByZXR1cm4gc2VyaWFsaXplT2JqZWN0KG9iaik7DQotICB9DQotICByZXR1cm4gb2JqOw0KLX0NCi0NCi0vKiBnbG9iYWwgYW5ndWxhck1vZHVsZTogdHJ1ZSwNCi0gIHZlcnNpb246IHRydWUsDQotDQotICAkTG9jYWxlUHJvdmlkZXIsDQotICAkQ29tcGlsZVByb3ZpZGVyLA0KLQ0KLSAgaHRtbEFuY2hvckRpcmVjdGl2ZSwNCi0gIGlucHV0RGlyZWN0aXZlLA0KLSAgaW5wdXREaXJlY3RpdmUsDQotICBmb3JtRGlyZWN0aXZlLA0KLSAgc2NyaXB0RGlyZWN0aXZlLA0KLSAgc2VsZWN0RGlyZWN0aXZlLA0KLSAgc3R5bGVEaXJlY3RpdmUsDQotICBvcHRpb25EaXJlY3RpdmUsDQotICBuZ0JpbmREaXJlY3RpdmUsDQotICBuZ0JpbmRIdG1sRGlyZWN0aXZlLA0KLSAgbmdCaW5kVGVtcGxhdGVEaXJlY3RpdmUsDQotICBuZ0NsYXNzRGlyZWN0aXZlLA0KLSAgbmdDbGFzc0V2ZW5EaXJlY3RpdmUsDQotICBuZ0NsYXNzT2RkRGlyZWN0aXZlLA0KLSAgbmdDc3BEaXJlY3RpdmUsDQotICBuZ0Nsb2FrRGlyZWN0aXZlLA0KLSAgbmdDb250cm9sbGVyRGlyZWN0aXZlLA0KLSAgbmdGb3JtRGlyZWN0aXZlLA0KLSAgbmdIaWRlRGlyZWN0aXZlLA0KLSAgbmdJZkRpcmVjdGl2ZSwNCi0gIG5nSW5jbHVkZURpcmVjdGl2ZSwNCi0gIG5nSW5jbHVkZUZpbGxDb250ZW50RGlyZWN0aXZlLA0KLSAgbmdJbml0RGlyZWN0aXZlLA0KLSAgbmdOb25CaW5kYWJsZURpcmVjdGl2ZSwNCi0gIG5nUGx1cmFsaXplRGlyZWN0aXZlLA0KLSAgbmdSZXBlYXREaXJlY3RpdmUsDQotICBuZ1Nob3dEaXJlY3RpdmUsDQotICBuZ1N0eWxlRGlyZWN0aXZlLA0KLSAgbmdTd2l0Y2hEaXJlY3RpdmUsDQotICBuZ1N3aXRjaFdoZW5EaXJlY3RpdmUsDQotICBuZ1N3aXRjaERlZmF1bHREaXJlY3RpdmUsDQotICBuZ09wdGlvbnNEaXJlY3RpdmUsDQotICBuZ1RyYW5zY2x1ZGVEaXJlY3RpdmUsDQotICBuZ01vZGVsRGlyZWN0aXZlLA0KLSAgbmdMaXN0RGlyZWN0aXZlLA0KLSAgbmdDaGFuZ2VEaXJlY3RpdmUsDQotICBwYXR0ZXJuRGlyZWN0aXZlLA0KLSAgcGF0dGVybkRpcmVjdGl2ZSwNCi0gIHJlcXVpcmVkRGlyZWN0aXZlLA0KLSAgcmVxdWlyZWREaXJlY3RpdmUsDQotICBtaW5sZW5ndGhEaXJlY3RpdmUsDQotICBtaW5sZW5ndGhEaXJlY3RpdmUsDQotICBtYXhsZW5ndGhEaXJlY3RpdmUsDQotICBtYXhsZW5ndGhEaXJlY3RpdmUsDQotICBuZ1ZhbHVlRGlyZWN0aXZlLA0KLSAgbmdNb2RlbE9wdGlvbnNEaXJlY3RpdmUsDQotICBuZ0F0dHJpYnV0ZUFsaWFzRGlyZWN0aXZlcywNCi0gIG5nRXZlbnREaXJlY3RpdmVzLA0KLQ0KLSAgJEFuY2hvclNjcm9sbFByb3ZpZGVyLA0KLSAgJEFuaW1hdGVQcm92aWRlciwNCi0gICRCcm93c2VyUHJvdmlkZXIsDQotICAkQ2FjaGVGYWN0b3J5UHJvdmlkZXIsDQotICAkQ29udHJvbGxlclByb3ZpZGVyLA0KLSAgJERvY3VtZW50UHJvdmlkZXIsDQotICAkRXhjZXB0aW9uSGFuZGxlclByb3ZpZGVyLA0KLSAgJEZpbHRlclByb3ZpZGVyLA0KLSAgJEludGVycG9sYXRlUHJvdmlkZXIsDQotICAkSW50ZXJ2YWxQcm92aWRlciwNCi0gICRIdHRwUHJvdmlkZXIsDQotICAkSHR0cEJhY2tlbmRQcm92aWRlciwNCi0gICRMb2NhdGlvblByb3ZpZGVyLA0KLSAgJExvZ1Byb3ZpZGVyLA0KLSAgJFBhcnNlUHJvdmlkZXIsDQotICAkUm9vdFNjb3BlUHJvdmlkZXIsDQotICAkUVByb3ZpZGVyLA0KLSAgJCRRUHJvdmlkZXIsDQotICAkJFNhbml0aXplVXJpUHJvdmlkZXIsDQotICAkU2NlUHJvdmlkZXIsDQotICAkU2NlRGVsZWdhdGVQcm92aWRlciwNCi0gICRTbmlmZmVyUHJvdmlkZXIsDQotICAkVGVtcGxhdGVDYWNoZVByb3ZpZGVyLA0KLSAgJFRlbXBsYXRlUmVxdWVzdFByb3ZpZGVyLA0KLSAgJCRUZXN0YWJpbGl0eVByb3ZpZGVyLA0KLSAgJFRpbWVvdXRQcm92aWRlciwNCi0gICQkUkFGUHJvdmlkZXIsDQotICAkJEFzeW5jQ2FsbGJhY2tQcm92aWRlciwNCi0gICRXaW5kb3dQcm92aWRlciwNCi0gICQkanFMaXRlUHJvdmlkZXINCi0qLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBvYmplY3QNCi0gKiBAbmFtZSBhbmd1bGFyLnZlcnNpb24NCi0gKiBAbW9kdWxlIG5nDQotICogQGRlc2NyaXB0aW9uDQotICogQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgQW5ndWxhckpTIHZlcnNpb24uIFRoaXMgb2JqZWN0IGhhcyB0aGUNCi0gKiBmb2xsb3dpbmcgcHJvcGVydGllczoNCi0gKg0KLSAqIC0gYGZ1bGxgIOKAPyBge3N0cmluZ31gIOKAPyBGdWxsIHZlcnNpb24gc3RyaW5nLCBzdWNoIGFzICIwLjkuMTgiLg0KLSAqIC0gYG1ham9yYCDigD8gYHtudW1iZXJ9YCDigD8gTWFqb3IgdmVyc2lvbiBudW1iZXIsIHN1Y2ggYXMgIjAiLg0KLSAqIC0gYG1pbm9yYCDigD8gYHtudW1iZXJ9YCDigD8gTWlub3IgdmVyc2lvbiBudW1iZXIsIHN1Y2ggYXMgIjkiLg0KLSAqIC0gYGRvdGAg4oA/IGB7bnVtYmVyfWAg4oA/IERvdCB2ZXJzaW9uIG51bWJlciwgc3VjaCBhcyAiMTgiLg0KLSAqIC0gYGNvZGVOYW1lYCDigD8gYHtzdHJpbmd9YCDigD8gQ29kZSBuYW1lIG9mIHRoZSByZWxlYXNlLCBzdWNoIGFzICJqaWdnbGluZy1hcm1mYXQiLg0KLSAqLw0KLXZhciB2ZXJzaW9uID0gew0KLSAgZnVsbDogJzEuMy44JywgICAgLy8gYWxsIG9mIHRoZXNlIHBsYWNlaG9sZGVyIHN0cmluZ3Mgd2lsbCBiZSByZXBsYWNlZCBieSBncnVudCdzDQotICBtYWpvcjogMSwgICAgLy8gcGFja2FnZSB0YXNrDQotICBtaW5vcjogMywNCi0gIGRvdDogOCwNCi0gIGNvZGVOYW1lOiAncHJvcGhldGljLW5hcndoYWwnDQotfTsNCi0NCi0NCi1mdW5jdGlvbiBwdWJsaXNoRXh0ZXJuYWxBUEkoYW5ndWxhcikgew0KLSAgZXh0ZW5kKGFuZ3VsYXIsIHsNCi0gICAgJ2Jvb3RzdHJhcCc6IGJvb3RzdHJhcCwNCi0gICAgJ2NvcHknOiBjb3B5LA0KLSAgICAnZXh0ZW5kJzogZXh0ZW5kLA0KLSAgICAnZXF1YWxzJzogZXF1YWxzLA0KLSAgICAnZWxlbWVudCc6IGpxTGl0ZSwNCi0gICAgJ2ZvckVhY2gnOiBmb3JFYWNoLA0KLSAgICAnaW5qZWN0b3InOiBjcmVhdGVJbmplY3RvciwNCi0gICAgJ25vb3AnOiBub29wLA0KLSAgICAnYmluZCc6IGJpbmQsDQotICAgICd0b0pzb24nOiB0b0pzb24sDQotICAgICdmcm9tSnNvbic6IGZyb21Kc29uLA0KLSAgICAnaWRlbnRpdHknOiBpZGVudGl0eSwNCi0gICAgJ2lzVW5kZWZpbmVkJzogaXNVbmRlZmluZWQsDQotICAgICdpc0RlZmluZWQnOiBpc0RlZmluZWQsDQotICAgICdpc1N0cmluZyc6IGlzU3RyaW5nLA0KLSAgICAnaXNGdW5jdGlvbic6IGlzRnVuY3Rpb24sDQotICAgICdpc09iamVjdCc6IGlzT2JqZWN0LA0KLSAgICAnaXNOdW1iZXInOiBpc051bWJlciwNCi0gICAgJ2lzRWxlbWVudCc6IGlzRWxlbWVudCwNCi0gICAgJ2lzQXJyYXknOiBpc0FycmF5LA0KLSAgICAndmVyc2lvbic6IHZlcnNpb24sDQotICAgICdpc0RhdGUnOiBpc0RhdGUsDQotICAgICdsb3dlcmNhc2UnOiBsb3dlcmNhc2UsDQotICAgICd1cHBlcmNhc2UnOiB1cHBlcmNhc2UsDQotICAgICdjYWxsYmFja3MnOiB7Y291bnRlcjogMH0sDQotICAgICdnZXRUZXN0YWJpbGl0eSc6IGdldFRlc3RhYmlsaXR5LA0KLSAgICAnJCRtaW5FcnInOiBtaW5FcnIsDQotICAgICckJGNzcCc6IGNzcCwNCi0gICAgJ3JlbG9hZFdpdGhEZWJ1Z0luZm8nOiByZWxvYWRXaXRoRGVidWdJbmZvDQotICB9KTsNCi0NCi0gIGFuZ3VsYXJNb2R1bGUgPSBzZXR1cE1vZHVsZUxvYWRlcih3aW5kb3cpOw0KLSAgdHJ5IHsNCi0gICAgYW5ndWxhck1vZHVsZSgnbmdMb2NhbGUnKTsNCi0gIH0gY2F0Y2ggKGUpIHsNCi0gICAgYW5ndWxhck1vZHVsZSgnbmdMb2NhbGUnLCBbXSkucHJvdmlkZXIoJyRsb2NhbGUnLCAkTG9jYWxlUHJvdmlkZXIpOw0KLSAgfQ0KLQ0KLSAgYW5ndWxhck1vZHVsZSgnbmcnLCBbJ25nTG9jYWxlJ10sIFsnJHByb3ZpZGUnLA0KLSAgICBmdW5jdGlvbiBuZ01vZHVsZSgkcHJvdmlkZSkgew0KLSAgICAgIC8vICQkc2FuaXRpemVVcmlQcm92aWRlciBuZWVkcyB0byBiZSBiZWZvcmUgJGNvbXBpbGVQcm92aWRlciBhcyBpdCBpcyB1c2VkIGJ5IGl0Lg0KLSAgICAgICRwcm92aWRlLnByb3ZpZGVyKHsNCi0gICAgICAgICQkc2FuaXRpemVVcmk6ICQkU2FuaXRpemVVcmlQcm92aWRlcg0KLSAgICAgIH0pOw0KLSAgICAgICRwcm92aWRlLnByb3ZpZGVyKCckY29tcGlsZScsICRDb21waWxlUHJvdmlkZXIpLg0KLSAgICAgICAgZGlyZWN0aXZlKHsNCi0gICAgICAgICAgICBhOiBodG1sQW5jaG9yRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIGlucHV0OiBpbnB1dERpcmVjdGl2ZSwNCi0gICAgICAgICAgICB0ZXh0YXJlYTogaW5wdXREaXJlY3RpdmUsDQotICAgICAgICAgICAgZm9ybTogZm9ybURpcmVjdGl2ZSwNCi0gICAgICAgICAgICBzY3JpcHQ6IHNjcmlwdERpcmVjdGl2ZSwNCi0gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdERpcmVjdGl2ZSwNCi0gICAgICAgICAgICBzdHlsZTogc3R5bGVEaXJlY3RpdmUsDQotICAgICAgICAgICAgb3B0aW9uOiBvcHRpb25EaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdCaW5kOiBuZ0JpbmREaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdCaW5kSHRtbDogbmdCaW5kSHRtbERpcmVjdGl2ZSwNCi0gICAgICAgICAgICBuZ0JpbmRUZW1wbGF0ZTogbmdCaW5kVGVtcGxhdGVEaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdDbGFzczogbmdDbGFzc0RpcmVjdGl2ZSwNCi0gICAgICAgICAgICBuZ0NsYXNzRXZlbjogbmdDbGFzc0V2ZW5EaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdDbGFzc09kZDogbmdDbGFzc09kZERpcmVjdGl2ZSwNCi0gICAgICAgICAgICBuZ0Nsb2FrOiBuZ0Nsb2FrRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG5nQ29udHJvbGxlcjogbmdDb250cm9sbGVyRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG5nRm9ybTogbmdGb3JtRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG5nSGlkZTogbmdIaWRlRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG5nSWY6IG5nSWZEaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdJbmNsdWRlOiBuZ0luY2x1ZGVEaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdJbml0OiBuZ0luaXREaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdOb25CaW5kYWJsZTogbmdOb25CaW5kYWJsZURpcmVjdGl2ZSwNCi0gICAgICAgICAgICBuZ1BsdXJhbGl6ZTogbmdQbHVyYWxpemVEaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdSZXBlYXQ6IG5nUmVwZWF0RGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG5nU2hvdzogbmdTaG93RGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG5nU3R5bGU6IG5nU3R5bGVEaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdTd2l0Y2g6IG5nU3dpdGNoRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG5nU3dpdGNoV2hlbjogbmdTd2l0Y2hXaGVuRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG5nU3dpdGNoRGVmYXVsdDogbmdTd2l0Y2hEZWZhdWx0RGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG5nT3B0aW9uczogbmdPcHRpb25zRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG5nVHJhbnNjbHVkZTogbmdUcmFuc2NsdWRlRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG5nTW9kZWw6IG5nTW9kZWxEaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdMaXN0OiBuZ0xpc3REaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdDaGFuZ2U6IG5nQ2hhbmdlRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIHBhdHRlcm46IHBhdHRlcm5EaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdQYXR0ZXJuOiBwYXR0ZXJuRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZERpcmVjdGl2ZSwNCi0gICAgICAgICAgICBuZ1JlcXVpcmVkOiByZXF1aXJlZERpcmVjdGl2ZSwNCi0gICAgICAgICAgICBtaW5sZW5ndGg6IG1pbmxlbmd0aERpcmVjdGl2ZSwNCi0gICAgICAgICAgICBuZ01pbmxlbmd0aDogbWlubGVuZ3RoRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG1heGxlbmd0aDogbWF4bGVuZ3RoRGlyZWN0aXZlLA0KLSAgICAgICAgICAgIG5nTWF4bGVuZ3RoOiBtYXhsZW5ndGhEaXJlY3RpdmUsDQotICAgICAgICAgICAgbmdWYWx1ZTogbmdWYWx1ZURpcmVjdGl2ZSwNCi0gICAgICAgICAgICBuZ01vZGVsT3B0aW9uczogbmdNb2RlbE9wdGlvbnNEaXJlY3RpdmUNCi0gICAgICAgIH0pLg0KLSAgICAgICAgZGlyZWN0aXZlKHsNCi0gICAgICAgICAgbmdJbmNsdWRlOiBuZ0luY2x1ZGVGaWxsQ29udGVudERpcmVjdGl2ZQ0KLSAgICAgICAgfSkuDQotICAgICAgICBkaXJlY3RpdmUobmdBdHRyaWJ1dGVBbGlhc0RpcmVjdGl2ZXMpLg0KLSAgICAgICAgZGlyZWN0aXZlKG5nRXZlbnREaXJlY3RpdmVzKTsNCi0gICAgICAkcHJvdmlkZS5wcm92aWRlcih7DQotICAgICAgICAkYW5jaG9yU2Nyb2xsOiAkQW5jaG9yU2Nyb2xsUHJvdmlkZXIsDQotICAgICAgICAkYW5pbWF0ZTogJEFuaW1hdGVQcm92aWRlciwNCi0gICAgICAgICRicm93c2VyOiAkQnJvd3NlclByb3ZpZGVyLA0KLSAgICAgICAgJGNhY2hlRmFjdG9yeTogJENhY2hlRmFjdG9yeVByb3ZpZGVyLA0KLSAgICAgICAgJGNvbnRyb2xsZXI6ICRDb250cm9sbGVyUHJvdmlkZXIsDQotICAgICAgICAkZG9jdW1lbnQ6ICREb2N1bWVudFByb3ZpZGVyLA0KLSAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXI6ICRFeGNlcHRpb25IYW5kbGVyUHJvdmlkZXIsDQotICAgICAgICAkZmlsdGVyOiAkRmlsdGVyUHJvdmlkZXIsDQotICAgICAgICAkaW50ZXJwb2xhdGU6ICRJbnRlcnBvbGF0ZVByb3ZpZGVyLA0KLSAgICAgICAgJGludGVydmFsOiAkSW50ZXJ2YWxQcm92aWRlciwNCi0gICAgICAgICRodHRwOiAkSHR0cFByb3ZpZGVyLA0KLSAgICAgICAgJGh0dHBCYWNrZW5kOiAkSHR0cEJhY2tlbmRQcm92aWRlciwNCi0gICAgICAgICRsb2NhdGlvbjogJExvY2F0aW9uUHJvdmlkZXIsDQotICAgICAgICAkbG9nOiAkTG9nUHJvdmlkZXIsDQotICAgICAgICAkcGFyc2U6ICRQYXJzZVByb3ZpZGVyLA0KLSAgICAgICAgJHJvb3RTY29wZTogJFJvb3RTY29wZVByb3ZpZGVyLA0KLSAgICAgICAgJHE6ICRRUHJvdmlkZXIsDQotICAgICAgICAkJHE6ICQkUVByb3ZpZGVyLA0KLSAgICAgICAgJHNjZTogJFNjZVByb3ZpZGVyLA0KLSAgICAgICAgJHNjZURlbGVnYXRlOiAkU2NlRGVsZWdhdGVQcm92aWRlciwNCi0gICAgICAgICRzbmlmZmVyOiAkU25pZmZlclByb3ZpZGVyLA0KLSAgICAgICAgJHRlbXBsYXRlQ2FjaGU6ICRUZW1wbGF0ZUNhY2hlUHJvdmlkZXIsDQotICAgICAgICAkdGVtcGxhdGVSZXF1ZXN0OiAkVGVtcGxhdGVSZXF1ZXN0UHJvdmlkZXIsDQotICAgICAgICAkJHRlc3RhYmlsaXR5OiAkJFRlc3RhYmlsaXR5UHJvdmlkZXIsDQotICAgICAgICAkdGltZW91dDogJFRpbWVvdXRQcm92aWRlciwNCi0gICAgICAgICR3aW5kb3c6ICRXaW5kb3dQcm92aWRlciwNCi0gICAgICAgICQkckFGOiAkJFJBRlByb3ZpZGVyLA0KLSAgICAgICAgJCRhc3luY0NhbGxiYWNrOiAkJEFzeW5jQ2FsbGJhY2tQcm92aWRlciwNCi0gICAgICAgICQkanFMaXRlOiAkJGpxTGl0ZVByb3ZpZGVyDQotICAgICAgfSk7DQotICAgIH0NCi0gIF0pOw0KLX0NCi0NCi0vKiBnbG9iYWwgSlFMaXRlUHJvdG90eXBlOiB0cnVlLA0KLSAgYWRkRXZlbnRMaXN0ZW5lckZuOiB0cnVlLA0KLSAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZuOiB0cnVlLA0KLSAgQk9PTEVBTl9BVFRSOiB0cnVlLA0KLSAgQUxJQVNFRF9BVFRSOiB0cnVlLA0KLSovDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vSlFMaXRlDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBmdW5jdGlvbg0KLSAqIEBuYW1lIGFuZ3VsYXIuZWxlbWVudA0KLSAqIEBtb2R1bGUgbmcNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogV3JhcHMgYSByYXcgRE9NIGVsZW1lbnQgb3IgSFRNTCBzdHJpbmcgYXMgYSBbalF1ZXJ5XShodHRwOi8vanF1ZXJ5LmNvbSkgZWxlbWVudC4NCi0gKg0KLSAqIElmIGpRdWVyeSBpcyBhdmFpbGFibGUsIGBhbmd1bGFyLmVsZW1lbnRgIGlzIGFuIGFsaWFzIGZvciB0aGUNCi0gKiBbalF1ZXJ5XShodHRwOi8vYXBpLmpxdWVyeS5jb20valF1ZXJ5LykgZnVuY3Rpb24uIElmIGpRdWVyeSBpcyBub3QgYXZhaWxhYmxlLCBgYW5ndWxhci5lbGVtZW50YA0KLSAqIGRlbGVnYXRlcyB0byBBbmd1bGFyJ3MgYnVpbHQtaW4gc3Vic2V0IG9mIGpRdWVyeSwgY2FsbGVkICJqUXVlcnkgbGl0ZSIgb3IgImpxTGl0ZS4iDQotICoNCi0gKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1zdWNjZXNzIj5qcUxpdGUgaXMgYSB0aW55LCBBUEktY29tcGF0aWJsZSBzdWJzZXQgb2YgalF1ZXJ5IHRoYXQgYWxsb3dzDQotICogQW5ndWxhciB0byBtYW5pcHVsYXRlIHRoZSBET00gaW4gYSBjcm9zcy1icm93c2VyIGNvbXBhdGlibGUgd2F5LiAqKmpxTGl0ZSoqIGltcGxlbWVudHMgb25seSB0aGUgbW9zdA0KLSAqIGNvbW1vbmx5IG5lZWRlZCBmdW5jdGlvbmFsaXR5IHdpdGggdGhlIGdvYWwgb2YgaGF2aW5nIGEgdmVyeSBzbWFsbCBmb290cHJpbnQuPC9kaXY+DQotICoNCi0gKiBUbyB1c2UgalF1ZXJ5LCBzaW1wbHkgbG9hZCBpdCBiZWZvcmUgYERPTUNvbnRlbnRMb2FkZWRgIGV2ZW50IGZpcmVkLg0KLSAqDQotICogPGRpdiBjbGFzcz0iYWxlcnQiPioqTm90ZToqKiBhbGwgZWxlbWVudCByZWZlcmVuY2VzIGluIEFuZ3VsYXIgYXJlIGFsd2F5cyB3cmFwcGVkIHdpdGggalF1ZXJ5IG9yDQotICoganFMaXRlOyB0aGV5IGFyZSBuZXZlciByYXcgRE9NIHJlZmVyZW5jZXMuPC9kaXY+DQotICoNCi0gKiAjIyBBbmd1bGFyJ3MganFMaXRlDQotICoganFMaXRlIHByb3ZpZGVzIG9ubHkgdGhlIGZvbGxvd2luZyBqUXVlcnkgbWV0aG9kczoNCi0gKg0KLSAqIC0gW2BhZGRDbGFzcygpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2FkZENsYXNzLykNCi0gKiAtIFtgYWZ0ZXIoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9hZnRlci8pDQotICogLSBbYGFwcGVuZCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2FwcGVuZC8pDQotICogLSBbYGF0dHIoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9hdHRyLykgLSBEb2VzIG5vdCBzdXBwb3J0IGZ1bmN0aW9ucyBhcyBwYXJhbWV0ZXJzDQotICogLSBbYGJpbmQoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9iaW5kLykgLSBEb2VzIG5vdCBzdXBwb3J0IG5hbWVzcGFjZXMsIHNlbGVjdG9ycyBvciBldmVudERhdGENCi0gKiAtIFtgY2hpbGRyZW4oKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jaGlsZHJlbi8pIC0gRG9lcyBub3Qgc3VwcG9ydCBzZWxlY3RvcnMNCi0gKiAtIFtgY2xvbmUoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jbG9uZS8pDQotICogLSBbYGNvbnRlbnRzKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vY29udGVudHMvKQ0KLSAqIC0gW2Bjc3MoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jc3MvKSAtIE9ubHkgcmV0cmlldmVzIGlubGluZS1zdHlsZXMsIGRvZXMgbm90IGNhbGwgYGdldENvbXB1dGVkU3R5bGUoKWANCi0gKiAtIFtgZGF0YSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2RhdGEvKQ0KLSAqIC0gW2BkZXRhY2goKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9kZXRhY2gvKQ0KLSAqIC0gW2BlbXB0eSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2VtcHR5LykNCi0gKiAtIFtgZXEoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9lcS8pDQotICogLSBbYGZpbmQoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9maW5kLykgLSBMaW1pdGVkIHRvIGxvb2t1cHMgYnkgdGFnIG5hbWUNCi0gKiAtIFtgaGFzQ2xhc3MoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9oYXNDbGFzcy8pDQotICogLSBbYGh0bWwoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9odG1sLykNCi0gKiAtIFtgbmV4dCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL25leHQvKSAtIERvZXMgbm90IHN1cHBvcnQgc2VsZWN0b3JzDQotICogLSBbYG9uKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vb24vKSAtIERvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcywgc2VsZWN0b3JzIG9yIGV2ZW50RGF0YQ0KLSAqIC0gW2BvZmYoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9vZmYvKSAtIERvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcyBvciBzZWxlY3RvcnMNCi0gKiAtIFtgb25lKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vb25lLykgLSBEb2VzIG5vdCBzdXBwb3J0IG5hbWVzcGFjZXMgb3Igc2VsZWN0b3JzDQotICogLSBbYHBhcmVudCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3BhcmVudC8pIC0gRG9lcyBub3Qgc3VwcG9ydCBzZWxlY3RvcnMNCi0gKiAtIFtgcHJlcGVuZCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3ByZXBlbmQvKQ0KLSAqIC0gW2Bwcm9wKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcHJvcC8pDQotICogLSBbYHJlYWR5KClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVhZHkvKQ0KLSAqIC0gW2ByZW1vdmUoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9yZW1vdmUvKQ0KLSAqIC0gW2ByZW1vdmVBdHRyKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVtb3ZlQXR0ci8pDQotICogLSBbYHJlbW92ZUNsYXNzKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVtb3ZlQ2xhc3MvKQ0KLSAqIC0gW2ByZW1vdmVEYXRhKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVtb3ZlRGF0YS8pDQotICogLSBbYHJlcGxhY2VXaXRoKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVwbGFjZVdpdGgvKQ0KLSAqIC0gW2B0ZXh0KClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vdGV4dC8pDQotICogLSBbYHRvZ2dsZUNsYXNzKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vdG9nZ2xlQ2xhc3MvKQ0KLSAqIC0gW2B0cmlnZ2VySGFuZGxlcigpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3RyaWdnZXJIYW5kbGVyLykgLSBQYXNzZXMgYSBkdW1teSBldmVudCBvYmplY3QgdG8gaGFuZGxlcnMuDQotICogLSBbYHVuYmluZCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3VuYmluZC8pIC0gRG9lcyBub3Qgc3VwcG9ydCBuYW1lc3BhY2VzDQotICogLSBbYHZhbCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3ZhbC8pDQotICogLSBbYHdyYXAoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS93cmFwLykNCi0gKg0KLSAqICMjIGpRdWVyeS9qcUxpdGUgRXh0cmFzDQotICogQW5ndWxhciBhbHNvIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBtZXRob2RzIGFuZCBldmVudHMgdG8gYm90aCBqUXVlcnkgYW5kIGpxTGl0ZToNCi0gKg0KLSAqICMjIyBFdmVudHMNCi0gKiAtIGAkZGVzdHJveWAgLSBBbmd1bGFySlMgaW50ZXJjZXB0cyBhbGwganFMaXRlL2pRdWVyeSdzIERPTSBkZXN0cnVjdGlvbiBhcGlzIGFuZCBmaXJlcyB0aGlzIGV2ZW50DQotICogICAgb24gYWxsIERPTSBub2RlcyBiZWluZyByZW1vdmVkLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBjbGVhbiB1cCBhbnkgM3JkIHBhcnR5IGJpbmRpbmdzIHRvIHRoZSBET00NCi0gKiAgICBlbGVtZW50IGJlZm9yZSBpdCBpcyByZW1vdmVkLg0KLSAqDQotICogIyMjIE1ldGhvZHMNCi0gKiAtIGBjb250cm9sbGVyKG5hbWUpYCAtIHJldHJpZXZlcyB0aGUgY29udHJvbGxlciBvZiB0aGUgY3VycmVudCBlbGVtZW50IG9yIGl0cyBwYXJlbnQuIEJ5IGRlZmF1bHQNCi0gKiAgIHJldHJpZXZlcyBjb250cm9sbGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgYG5nQ29udHJvbGxlcmAgZGlyZWN0aXZlLiBJZiBgbmFtZWAgaXMgcHJvdmlkZWQgYXMNCi0gKiAgIGNhbWVsQ2FzZSBkaXJlY3RpdmUgbmFtZSwgdGhlbiB0aGUgY29udHJvbGxlciBmb3IgdGhpcyBkaXJlY3RpdmUgd2lsbCBiZSByZXRyaWV2ZWQgKGUuZy4NCi0gKiAgIGAnbmdNb2RlbCdgKS4NCi0gKiAtIGBpbmplY3RvcigpYCAtIHJldHJpZXZlcyB0aGUgaW5qZWN0b3Igb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBvciBpdHMgcGFyZW50Lg0KLSAqIC0gYHNjb3BlKClgIC0gcmV0cmlldmVzIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBzY29wZX0gb2YgdGhlIGN1cnJlbnQNCi0gKiAgIGVsZW1lbnQgb3IgaXRzIHBhcmVudC4gUmVxdWlyZXMge0BsaW5rIGd1aWRlL3Byb2R1Y3Rpb24jZGlzYWJsaW5nLWRlYnVnLWRhdGEgRGVidWcgRGF0YX0gdG8NCi0gKiAgIGJlIGVuYWJsZWQuDQotICogLSBgaXNvbGF0ZVNjb3BlKClgIC0gcmV0cmlldmVzIGFuIGlzb2xhdGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUgc2NvcGV9IGlmIG9uZSBpcyBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUNCi0gKiAgIGN1cnJlbnQgZWxlbWVudC4gVGhpcyBnZXR0ZXIgc2hvdWxkIGJlIHVzZWQgb25seSBvbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gYSBkaXJlY3RpdmUgd2hpY2ggc3RhcnRzIGEgbmV3IGlzb2xhdGUNCi0gKiAgIHNjb3BlLiBDYWxsaW5nIGBzY29wZSgpYCBvbiB0aGlzIGVsZW1lbnQgYWx3YXlzIHJldHVybnMgdGhlIG9yaWdpbmFsIG5vbi1pc29sYXRlIHNjb3BlLg0KLSAqICAgUmVxdWlyZXMge0BsaW5rIGd1aWRlL3Byb2R1Y3Rpb24jZGlzYWJsaW5nLWRlYnVnLWRhdGEgRGVidWcgRGF0YX0gdG8gYmUgZW5hYmxlZC4NCi0gKiAtIGBpbmhlcml0ZWREYXRhKClgIC0gc2FtZSBhcyBgZGF0YSgpYCwgYnV0IHdhbGtzIHVwIHRoZSBET00gdW50aWwgYSB2YWx1ZSBpcyBmb3VuZCBvciB0aGUgdG9wDQotICogICBwYXJlbnQgZWxlbWVudCBpcyByZWFjaGVkLg0KLSAqDQotICogQHBhcmFtIHtzdHJpbmd8RE9NRWxlbWVudH0gZWxlbWVudCBIVE1MIHN0cmluZyBvciBET01FbGVtZW50IHRvIGJlIHdyYXBwZWQgaW50byBqUXVlcnkuDQotICogQHJldHVybnMge09iamVjdH0galF1ZXJ5IG9iamVjdC4NCi0gKi8NCi0NCi1KUUxpdGUuZXhwYW5kbyA9ICduZzMzOSc7DQotDQotdmFyIGpxQ2FjaGUgPSBKUUxpdGUuY2FjaGUgPSB7fSwNCi0gICAganFJZCA9IDEsDQotICAgIGFkZEV2ZW50TGlzdGVuZXJGbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIHR5cGUsIGZuKSB7DQotICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGZuLCBmYWxzZSk7DQotICAgIH0sDQotICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJGbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIHR5cGUsIGZuKSB7DQotICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGZuLCBmYWxzZSk7DQotICAgIH07DQotDQotLyoNCi0gKiAhISEgVGhpcyBpcyBhbiB1bmRvY3VtZW50ZWQgInByaXZhdGUiIGZ1bmN0aW9uICEhIQ0KLSAqLw0KLUpRTGl0ZS5fZGF0YSA9IGZ1bmN0aW9uKG5vZGUpIHsNCi0gIC8valF1ZXJ5IGFsd2F5cyByZXR1cm5zIGFuIG9iamVjdCBvbiBjYWNoZSBtaXNzDQotICByZXR1cm4gdGhpcy5jYWNoZVtub2RlW3RoaXMuZXhwYW5kb11dIHx8IHt9Ow0KLX07DQotDQotZnVuY3Rpb24ganFOZXh0SWQoKSB7IHJldHVybiArK2pxSWQ7IH0NCi0NCi0NCi12YXIgU1BFQ0lBTF9DSEFSU19SRUdFWFAgPSAvKFtcOlwtXF9dKyguKSkvZzsNCi12YXIgTU9aX0hBQ0tfUkVHRVhQID0gL15tb3ooW0EtWl0pLzsNCi12YXIgTU9VU0VfRVZFTlRfTUFQPSB7IG1vdXNlbGVhdmU6ICJtb3VzZW91dCIsIG1vdXNlZW50ZXI6ICJtb3VzZW92ZXIifTsNCi12YXIganFMaXRlTWluRXJyID0gbWluRXJyKCdqcUxpdGUnKTsNCi0NCi0vKioNCi0gKiBDb252ZXJ0cyBzbmFrZV9jYXNlIHRvIGNhbWVsQ2FzZS4NCi0gKiBBbHNvIHRoZXJlIGlzIHNwZWNpYWwgY2FzZSBmb3IgTW96IHByZWZpeCBzdGFydGluZyB3aXRoIHVwcGVyIGNhc2UgbGV0dGVyLg0KLSAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gbm9ybWFsaXplDQotICovDQotZnVuY3Rpb24gY2FtZWxDYXNlKG5hbWUpIHsNCi0gIHJldHVybiBuYW1lLg0KLSAgICByZXBsYWNlKFNQRUNJQUxfQ0hBUlNfUkVHRVhQLCBmdW5jdGlvbihfLCBzZXBhcmF0b3IsIGxldHRlciwgb2Zmc2V0KSB7DQotICAgICAgcmV0dXJuIG9mZnNldCA/IGxldHRlci50b1VwcGVyQ2FzZSgpIDogbGV0dGVyOw0KLSAgICB9KS4NCi0gICAgcmVwbGFjZShNT1pfSEFDS19SRUdFWFAsICdNb3okMScpOw0KLX0NCi0NCi12YXIgU0lOR0xFX1RBR19SRUdFWFAgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvOw0KLXZhciBIVE1MX1JFR0VYUCA9IC88fCYjP1x3KzsvOw0KLXZhciBUQUdfTkFNRV9SRUdFWFAgPSAvPChbXHc6XSspLzsNCi12YXIgWEhUTUxfVEFHX1JFR0VYUCA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2k7DQotDQotdmFyIHdyYXBNYXAgPSB7DQotICAnb3B0aW9uJzogWzEsICc8c2VsZWN0IG11bHRpcGxlPSJtdWx0aXBsZSI+JywgJzwvc2VsZWN0PiddLA0KLQ0KLSAgJ3RoZWFkJzogWzEsICc8dGFibGU+JywgJzwvdGFibGU+J10sDQotICAnY29sJzogWzIsICc8dGFibGU+PGNvbGdyb3VwPicsICc8L2NvbGdyb3VwPjwvdGFibGU+J10sDQotICAndHInOiBbMiwgJzx0YWJsZT48dGJvZHk+JywgJzwvdGJvZHk+PC90YWJsZT4nXSwNCi0gICd0ZCc6IFszLCAnPHRhYmxlPjx0Ym9keT48dHI+JywgJzwvdHI+PC90Ym9keT48L3RhYmxlPiddLA0KLSAgJ19kZWZhdWx0JzogWzAsICIiLCAiIl0NCi19Ow0KLQ0KLXdyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjsNCi13cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOw0KLXdyYXBNYXAudGggPSB3cmFwTWFwLnRkOw0KLQ0KLQ0KLWZ1bmN0aW9uIGpxTGl0ZUlzVGV4dE5vZGUoaHRtbCkgew0KLSAgcmV0dXJuICFIVE1MX1JFR0VYUC50ZXN0KGh0bWwpOw0KLX0NCi0NCi1mdW5jdGlvbiBqcUxpdGVBY2NlcHRzRGF0YShub2RlKSB7DQotICAvLyBUaGUgd2luZG93IG9iamVjdCBjYW4gYWNjZXB0IGRhdGEgYnV0IGhhcyBubyBub2RlVHlwZQ0KLSAgLy8gT3RoZXJ3aXNlIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZWxlbWVudHMgKDEpIGFuZCBkb2N1bWVudHMgKDkpDQotICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlOw0KLSAgcmV0dXJuIG5vZGVUeXBlID09PSBOT0RFX1RZUEVfRUxFTUVOVCB8fCAhbm9kZVR5cGUgfHwgbm9kZVR5cGUgPT09IE5PREVfVFlQRV9ET0NVTUVOVDsNCi19DQotDQotZnVuY3Rpb24ganFMaXRlQnVpbGRGcmFnbWVudChodG1sLCBjb250ZXh0KSB7DQotICB2YXIgdG1wLCB0YWcsIHdyYXAsDQotICAgICAgZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwNCi0gICAgICBub2RlcyA9IFtdLCBpOw0KLQ0KLSAgaWYgKGpxTGl0ZUlzVGV4dE5vZGUoaHRtbCkpIHsNCi0gICAgLy8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlDQotICAgIG5vZGVzLnB1c2goY29udGV4dC5jcmVhdGVUZXh0Tm9kZShodG1sKSk7DQotICB9IGVsc2Ugew0KLSAgICAvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMNCi0gICAgdG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2IikpOw0KLSAgICB0YWcgPSAoVEFHX05BTUVfUkVHRVhQLmV4ZWMoaHRtbCkgfHwgWyIiLCAiIl0pWzFdLnRvTG93ZXJDYXNlKCk7DQotICAgIHdyYXAgPSB3cmFwTWFwW3RhZ10gfHwgd3JhcE1hcC5fZGVmYXVsdDsNCi0gICAgdG1wLmlubmVySFRNTCA9IHdyYXBbMV0gKyBodG1sLnJlcGxhY2UoWEhUTUxfVEFHX1JFR0VYUCwgIjwkMT48LyQyPiIpICsgd3JhcFsyXTsNCi0NCi0gICAgLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50DQotICAgIGkgPSB3cmFwWzBdOw0KLSAgICB3aGlsZSAoaS0tKSB7DQotICAgICAgdG1wID0gdG1wLmxhc3RDaGlsZDsNCi0gICAgfQ0KLQ0KLSAgICBub2RlcyA9IGNvbmNhdChub2RlcywgdG1wLmNoaWxkTm9kZXMpOw0KLQ0KLSAgICB0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkOw0KLSAgICB0bXAudGV4dENvbnRlbnQgPSAiIjsNCi0gIH0NCi0NCi0gIC8vIFJlbW92ZSB3cmFwcGVyIGZyb20gZnJhZ21lbnQNCi0gIGZyYWdtZW50LnRleHRDb250ZW50ID0gIiI7DQotICBmcmFnbWVudC5pbm5lckhUTUwgPSAiIjsgLy8gQ2xlYXIgaW5uZXIgSFRNTA0KLSAgZm9yRWFjaChub2RlcywgZnVuY3Rpb24obm9kZSkgew0KLSAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKTsNCi0gIH0pOw0KLQ0KLSAgcmV0dXJuIGZyYWdtZW50Ow0KLX0NCi0NCi1mdW5jdGlvbiBqcUxpdGVQYXJzZUhUTUwoaHRtbCwgY29udGV4dCkgew0KLSAgY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7DQotICB2YXIgcGFyc2VkOw0KLQ0KLSAgaWYgKChwYXJzZWQgPSBTSU5HTEVfVEFHX1JFR0VYUC5leGVjKGh0bWwpKSkgew0KLSAgICByZXR1cm4gW2NvbnRleHQuY3JlYXRlRWxlbWVudChwYXJzZWRbMV0pXTsNCi0gIH0NCi0NCi0gIGlmICgocGFyc2VkID0ganFMaXRlQnVpbGRGcmFnbWVudChodG1sLCBjb250ZXh0KSkpIHsNCi0gICAgcmV0dXJuIHBhcnNlZC5jaGlsZE5vZGVzOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIFtdOw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1mdW5jdGlvbiBKUUxpdGUoZWxlbWVudCkgew0KLSAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBKUUxpdGUpIHsNCi0gICAgcmV0dXJuIGVsZW1lbnQ7DQotICB9DQotDQotICB2YXIgYXJnSXNTdHJpbmc7DQotDQotICBpZiAoaXNTdHJpbmcoZWxlbWVudCkpIHsNCi0gICAgZWxlbWVudCA9IHRyaW0oZWxlbWVudCk7DQotICAgIGFyZ0lzU3RyaW5nID0gdHJ1ZTsNCi0gIH0NCi0gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBKUUxpdGUpKSB7DQotICAgIGlmIChhcmdJc1N0cmluZyAmJiBlbGVtZW50LmNoYXJBdCgwKSAhPSAnPCcpIHsNCi0gICAgICB0aHJvdyBqcUxpdGVNaW5FcnIoJ25vc2VsJywgJ0xvb2tpbmcgdXAgZWxlbWVudHMgdmlhIHNlbGVjdG9ycyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGpxTGl0ZSEgU2VlOiBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9hbmd1bGFyLmVsZW1lbnQnKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbmV3IEpRTGl0ZShlbGVtZW50KTsNCi0gIH0NCi0NCi0gIGlmIChhcmdJc1N0cmluZykgew0KLSAgICBqcUxpdGVBZGROb2Rlcyh0aGlzLCBqcUxpdGVQYXJzZUhUTUwoZWxlbWVudCkpOw0KLSAgfSBlbHNlIHsNCi0gICAganFMaXRlQWRkTm9kZXModGhpcywgZWxlbWVudCk7DQotICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGpxTGl0ZUNsb25lKGVsZW1lbnQpIHsNCi0gIHJldHVybiBlbGVtZW50LmNsb25lTm9kZSh0cnVlKTsNCi19DQotDQotZnVuY3Rpb24ganFMaXRlRGVhbG9jKGVsZW1lbnQsIG9ubHlEZXNjZW5kYW50cykgew0KLSAgaWYgKCFvbmx5RGVzY2VuZGFudHMpIGpxTGl0ZVJlbW92ZURhdGEoZWxlbWVudCk7DQotDQotICBpZiAoZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKSB7DQotICAgIHZhciBkZXNjZW5kYW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpOw0KLSAgICBmb3IgKHZhciBpID0gMCwgbCA9IGRlc2NlbmRhbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KLSAgICAgIGpxTGl0ZVJlbW92ZURhdGEoZGVzY2VuZGFudHNbaV0pOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGpxTGl0ZU9mZihlbGVtZW50LCB0eXBlLCBmbiwgdW5zdXBwb3J0ZWQpIHsNCi0gIGlmIChpc0RlZmluZWQodW5zdXBwb3J0ZWQpKSB0aHJvdyBqcUxpdGVNaW5FcnIoJ29mZmFyZ3MnLCAnanFMaXRlI29mZigpIGRvZXMgbm90IHN1cHBvcnQgdGhlIGBzZWxlY3RvcmAgYXJndW1lbnQnKTsNCi0NCi0gIHZhciBleHBhbmRvU3RvcmUgPSBqcUxpdGVFeHBhbmRvU3RvcmUoZWxlbWVudCk7DQotICB2YXIgZXZlbnRzID0gZXhwYW5kb1N0b3JlICYmIGV4cGFuZG9TdG9yZS5ldmVudHM7DQotICB2YXIgaGFuZGxlID0gZXhwYW5kb1N0b3JlICYmIGV4cGFuZG9TdG9yZS5oYW5kbGU7DQotDQotICBpZiAoIWhhbmRsZSkgcmV0dXJuOyAvL25vIGxpc3RlbmVycyByZWdpc3RlcmVkDQotDQotICBpZiAoIXR5cGUpIHsNCi0gICAgZm9yICh0eXBlIGluIGV2ZW50cykgew0KLSAgICAgIGlmICh0eXBlICE9PSAnJGRlc3Ryb3knKSB7DQotICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyRm4oZWxlbWVudCwgdHlwZSwgaGFuZGxlKTsNCi0gICAgICB9DQotICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTsNCi0gICAgfQ0KLSAgfSBlbHNlIHsNCi0gICAgZm9yRWFjaCh0eXBlLnNwbGl0KCcgJyksIGZ1bmN0aW9uKHR5cGUpIHsNCi0gICAgICBpZiAoaXNEZWZpbmVkKGZuKSkgew0KLSAgICAgICAgdmFyIGxpc3RlbmVyRm5zID0gZXZlbnRzW3R5cGVdOw0KLSAgICAgICAgYXJyYXlSZW1vdmUobGlzdGVuZXJGbnMgfHwgW10sIGZuKTsNCi0gICAgICAgIGlmIChsaXN0ZW5lckZucyAmJiBsaXN0ZW5lckZucy5sZW5ndGggPiAwKSB7DQotICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZuKGVsZW1lbnQsIHR5cGUsIGhhbmRsZSk7DQotICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTsNCi0gICAgfSk7DQotICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGpxTGl0ZVJlbW92ZURhdGEoZWxlbWVudCwgbmFtZSkgew0KLSAgdmFyIGV4cGFuZG9JZCA9IGVsZW1lbnQubmczMzk7DQotICB2YXIgZXhwYW5kb1N0b3JlID0gZXhwYW5kb0lkICYmIGpxQ2FjaGVbZXhwYW5kb0lkXTsNCi0NCi0gIGlmIChleHBhbmRvU3RvcmUpIHsNCi0gICAgaWYgKG5hbWUpIHsNCi0gICAgICBkZWxldGUgZXhwYW5kb1N0b3JlLmRhdGFbbmFtZV07DQotICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotICAgIGlmIChleHBhbmRvU3RvcmUuaGFuZGxlKSB7DQotICAgICAgaWYgKGV4cGFuZG9TdG9yZS5ldmVudHMuJGRlc3Ryb3kpIHsNCi0gICAgICAgIGV4cGFuZG9TdG9yZS5oYW5kbGUoe30sICckZGVzdHJveScpOw0KLSAgICAgIH0NCi0gICAgICBqcUxpdGVPZmYoZWxlbWVudCk7DQotICAgIH0NCi0gICAgZGVsZXRlIGpxQ2FjaGVbZXhwYW5kb0lkXTsNCi0gICAgZWxlbWVudC5uZzMzOSA9IHVuZGVmaW5lZDsgLy8gZG9uJ3QgZGVsZXRlIERPTSBleHBhbmRvcy4gSUUgYW5kIENocm9tZSBkb24ndCBsaWtlIGl0DQotICB9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGpxTGl0ZUV4cGFuZG9TdG9yZShlbGVtZW50LCBjcmVhdGVJZk5lY2Vzc2FyeSkgew0KLSAgdmFyIGV4cGFuZG9JZCA9IGVsZW1lbnQubmczMzksDQotICAgICAgZXhwYW5kb1N0b3JlID0gZXhwYW5kb0lkICYmIGpxQ2FjaGVbZXhwYW5kb0lkXTsNCi0NCi0gIGlmIChjcmVhdGVJZk5lY2Vzc2FyeSAmJiAhZXhwYW5kb1N0b3JlKSB7DQotICAgIGVsZW1lbnQubmczMzkgPSBleHBhbmRvSWQgPSBqcU5leHRJZCgpOw0KLSAgICBleHBhbmRvU3RvcmUgPSBqcUNhY2hlW2V4cGFuZG9JZF0gPSB7ZXZlbnRzOiB7fSwgZGF0YToge30sIGhhbmRsZTogdW5kZWZpbmVkfTsNCi0gIH0NCi0NCi0gIHJldHVybiBleHBhbmRvU3RvcmU7DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGpxTGl0ZURhdGEoZWxlbWVudCwga2V5LCB2YWx1ZSkgew0KLSAgaWYgKGpxTGl0ZUFjY2VwdHNEYXRhKGVsZW1lbnQpKSB7DQotDQotICAgIHZhciBpc1NpbXBsZVNldHRlciA9IGlzRGVmaW5lZCh2YWx1ZSk7DQotICAgIHZhciBpc1NpbXBsZUdldHRlciA9ICFpc1NpbXBsZVNldHRlciAmJiBrZXkgJiYgIWlzT2JqZWN0KGtleSk7DQotICAgIHZhciBtYXNzR2V0dGVyID0gIWtleTsNCi0gICAgdmFyIGV4cGFuZG9TdG9yZSA9IGpxTGl0ZUV4cGFuZG9TdG9yZShlbGVtZW50LCAhaXNTaW1wbGVHZXR0ZXIpOw0KLSAgICB2YXIgZGF0YSA9IGV4cGFuZG9TdG9yZSAmJiBleHBhbmRvU3RvcmUuZGF0YTsNCi0NCi0gICAgaWYgKGlzU2ltcGxlU2V0dGVyKSB7IC8vIGRhdGEoJ2tleScsIHZhbHVlKQ0KLSAgICAgIGRhdGFba2V5XSA9IHZhbHVlOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGlmIChtYXNzR2V0dGVyKSB7ICAvLyBkYXRhKCkNCi0gICAgICAgIHJldHVybiBkYXRhOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAoaXNTaW1wbGVHZXR0ZXIpIHsgLy8gZGF0YSgna2V5JykNCi0gICAgICAgICAgLy8gZG9uJ3QgZm9yY2UgY3JlYXRpb24gb2YgZXhwYW5kb1N0b3JlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0DQotICAgICAgICAgIHJldHVybiBkYXRhICYmIGRhdGFba2V5XTsNCi0gICAgICAgIH0gZWxzZSB7IC8vIG1hc3Mtc2V0dGVyOiBkYXRhKHtrZXkxOiB2YWwxLCBrZXkyOiB2YWwyfSkNCi0gICAgICAgICAgZXh0ZW5kKGRhdGEsIGtleSk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGpxTGl0ZUhhc0NsYXNzKGVsZW1lbnQsIHNlbGVjdG9yKSB7DQotICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKSByZXR1cm4gZmFsc2U7DQotICByZXR1cm4gKCgiICIgKyAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgIiAiKS5yZXBsYWNlKC9bXG5cdF0vZywgIiAiKS4NCi0gICAgICBpbmRleE9mKCIgIiArIHNlbGVjdG9yICsgIiAiKSA+IC0xKTsNCi19DQotDQotZnVuY3Rpb24ganFMaXRlUmVtb3ZlQ2xhc3MoZWxlbWVudCwgY3NzQ2xhc3Nlcykgew0KLSAgaWYgKGNzc0NsYXNzZXMgJiYgZWxlbWVudC5zZXRBdHRyaWJ1dGUpIHsNCi0gICAgZm9yRWFjaChjc3NDbGFzc2VzLnNwbGl0KCcgJyksIGZ1bmN0aW9uKGNzc0NsYXNzKSB7DQotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgdHJpbSgNCi0gICAgICAgICAgKCIgIiArIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyAiICIpDQotICAgICAgICAgIC5yZXBsYWNlKC9bXG5cdF0vZywgIiAiKQ0KLSAgICAgICAgICAucmVwbGFjZSgiICIgKyB0cmltKGNzc0NsYXNzKSArICIgIiwgIiAiKSkNCi0gICAgICApOw0KLSAgICB9KTsNCi0gIH0NCi19DQotDQotZnVuY3Rpb24ganFMaXRlQWRkQ2xhc3MoZWxlbWVudCwgY3NzQ2xhc3Nlcykgew0KLSAgaWYgKGNzc0NsYXNzZXMgJiYgZWxlbWVudC5zZXRBdHRyaWJ1dGUpIHsNCi0gICAgdmFyIGV4aXN0aW5nQ2xhc3NlcyA9ICgnICcgKyAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgJyAnKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvW1xuXHRdL2csICIgIik7DQotDQotICAgIGZvckVhY2goY3NzQ2xhc3Nlcy5zcGxpdCgnICcpLCBmdW5jdGlvbihjc3NDbGFzcykgew0KLSAgICAgIGNzc0NsYXNzID0gdHJpbShjc3NDbGFzcyk7DQotICAgICAgaWYgKGV4aXN0aW5nQ2xhc3Nlcy5pbmRleE9mKCcgJyArIGNzc0NsYXNzICsgJyAnKSA9PT0gLTEpIHsNCi0gICAgICAgIGV4aXN0aW5nQ2xhc3NlcyArPSBjc3NDbGFzcyArICcgJzsNCi0gICAgICB9DQotICAgIH0pOw0KLQ0KLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCB0cmltKGV4aXN0aW5nQ2xhc3NlcykpOw0KLSAgfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBqcUxpdGVBZGROb2Rlcyhyb290LCBlbGVtZW50cykgew0KLSAgLy8gVEhJUyBDT0RFIElTIFZFUlkgSE9ULiBEb24ndCBtYWtlIGNoYW5nZXMgd2l0aG91dCBiZW5jaG1hcmtpbmcuDQotDQotICBpZiAoZWxlbWVudHMpIHsNCi0NCi0gICAgLy8gaWYgYSBOb2RlICh0aGUgbW9zdCBjb21tb24gY2FzZSkNCi0gICAgaWYgKGVsZW1lbnRzLm5vZGVUeXBlKSB7DQotICAgICAgcm9vdFtyb290Lmxlbmd0aCsrXSA9IGVsZW1lbnRzOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHZhciBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7DQotDQotICAgICAgLy8gaWYgYW4gQXJyYXkgb3IgTm9kZUxpc3QgYW5kIG5vdCBhIFdpbmRvdw0KLSAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJyAmJiBlbGVtZW50cy53aW5kb3cgIT09IGVsZW1lbnRzKSB7DQotICAgICAgICBpZiAobGVuZ3RoKSB7DQotICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICByb290W3Jvb3QubGVuZ3RoKytdID0gZWxlbWVudHNbaV07DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgcm9vdFtyb290Lmxlbmd0aCsrXSA9IGVsZW1lbnRzOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0NCi1mdW5jdGlvbiBqcUxpdGVDb250cm9sbGVyKGVsZW1lbnQsIG5hbWUpIHsNCi0gIHJldHVybiBqcUxpdGVJbmhlcml0ZWREYXRhKGVsZW1lbnQsICckJyArIChuYW1lIHx8ICduZ0NvbnRyb2xsZXInKSArICdDb250cm9sbGVyJyk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGpxTGl0ZUluaGVyaXRlZERhdGEoZWxlbWVudCwgbmFtZSwgdmFsdWUpIHsNCi0gIC8vIGlmIGVsZW1lbnQgaXMgdGhlIGRvY3VtZW50IG9iamVjdCB3b3JrIHdpdGggdGhlIGh0bWwgZWxlbWVudCBpbnN0ZWFkDQotICAvLyB0aGlzIG1ha2VzICQoZG9jdW1lbnQpLnNjb3BlKCkgcG9zc2libGUNCi0gIGlmIChlbGVtZW50Lm5vZGVUeXBlID09IE5PREVfVFlQRV9ET0NVTUVOVCkgew0KLSAgICBlbGVtZW50ID0gZWxlbWVudC5kb2N1bWVudEVsZW1lbnQ7DQotICB9DQotICB2YXIgbmFtZXMgPSBpc0FycmF5KG5hbWUpID8gbmFtZSA6IFtuYW1lXTsNCi0NCi0gIHdoaWxlIChlbGVtZW50KSB7DQotICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG5hbWVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsNCi0gICAgICBpZiAoKHZhbHVlID0ganFMaXRlLmRhdGEoZWxlbWVudCwgbmFtZXNbaV0pKSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgLy8gSWYgZGVhbGluZyB3aXRoIGEgZG9jdW1lbnQgZnJhZ21lbnQgbm9kZSB3aXRoIGEgaG9zdCBlbGVtZW50LCBhbmQgbm8gcGFyZW50LCB1c2UgdGhlIGhvc3QNCi0gICAgLy8gZWxlbWVudCBhcyB0aGUgcGFyZW50LiBUaGlzIGVuYWJsZXMgZGlyZWN0aXZlcyB3aXRoaW4gYSBTaGFkb3cgRE9NIG9yIHBvbHlmaWxsZWQgU2hhZG93IERPTQ0KLSAgICAvLyB0byBsb29rdXAgcGFyZW50IGNvbnRyb2xsZXJzLg0KLSAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlIHx8IChlbGVtZW50Lm5vZGVUeXBlID09PSBOT0RFX1RZUEVfRE9DVU1FTlRfRlJBR01FTlQgJiYgZWxlbWVudC5ob3N0KTsNCi0gIH0NCi19DQotDQotZnVuY3Rpb24ganFMaXRlRW1wdHkoZWxlbWVudCkgew0KLSAganFMaXRlRGVhbG9jKGVsZW1lbnQsIHRydWUpOw0KLSAgd2hpbGUgKGVsZW1lbnQuZmlyc3RDaGlsZCkgew0KLSAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7DQotICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGpxTGl0ZVJlbW92ZShlbGVtZW50LCBrZWVwRGF0YSkgew0KLSAgaWYgKCFrZWVwRGF0YSkganFMaXRlRGVhbG9jKGVsZW1lbnQpOw0KLSAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsNCi0gIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZChlbGVtZW50KTsNCi19DQotDQotDQotZnVuY3Rpb24ganFMaXRlRG9jdW1lbnRMb2FkZWQoYWN0aW9uLCB3aW4pIHsNCi0gIHdpbiA9IHdpbiB8fCB3aW5kb3c7DQotICBpZiAod2luLmRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsNCi0gICAgLy8gRm9yY2UgdGhlIGFjdGlvbiB0byBiZSBydW4gYXN5bmMgZm9yIGNvbnNpc3RlbnQgYmVoYXZpb3VyDQotICAgIC8vIGZyb20gdGhlIGFjdGlvbidzIHBvaW50IG9mIHZpZXcNCi0gICAgLy8gaS5lLiBpdCB3aWxsIGRlZmluaXRlbHkgbm90IGJlIGluIGEgJGFwcGx5DQotICAgIHdpbi5zZXRUaW1lb3V0KGFjdGlvbik7DQotICB9IGVsc2Ugew0KLSAgICAvLyBObyBuZWVkIHRvIHVuYmluZCB0aGlzIGhhbmRsZXIgYXMgbG9hZCBpcyBvbmx5IGV2ZXIgY2FsbGVkIG9uY2UNCi0gICAganFMaXRlKHdpbikub24oJ2xvYWQnLCBhY3Rpb24pOw0KLSAgfQ0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBGdW5jdGlvbnMgd2hpY2ggYXJlIGRlY2xhcmVkIGRpcmVjdGx5Lg0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZhciBKUUxpdGVQcm90b3R5cGUgPSBKUUxpdGUucHJvdG90eXBlID0gew0KLSAgcmVhZHk6IGZ1bmN0aW9uKGZuKSB7DQotICAgIHZhciBmaXJlZCA9IGZhbHNlOw0KLQ0KLSAgICBmdW5jdGlvbiB0cmlnZ2VyKCkgew0KLSAgICAgIGlmIChmaXJlZCkgcmV0dXJuOw0KLSAgICAgIGZpcmVkID0gdHJ1ZTsNCi0gICAgICBmbigpOw0KLSAgICB9DQotDQotICAgIC8vIGNoZWNrIGlmIGRvY3VtZW50IGlzIGFscmVhZHkgbG9hZGVkDQotICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7DQotICAgICAgc2V0VGltZW91dCh0cmlnZ2VyKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICB0aGlzLm9uKCdET01Db250ZW50TG9hZGVkJywgdHJpZ2dlcik7IC8vIHdvcmtzIGZvciBtb2Rlcm4gYnJvd3NlcnMgYW5kIElFOQ0KLSAgICAgIC8vIHdlIGNhbiBub3QgdXNlIGpxTGl0ZSBzaW5jZSB3ZSBhcmUgbm90IGRvbmUgbG9hZGluZyBhbmQgalF1ZXJ5IGNvdWxkIGJlIGxvYWRlZCBsYXRlci4NCi0gICAgICAvLyBqc2hpbnQgLVcwNjQNCi0gICAgICBKUUxpdGUod2luZG93KS5vbignbG9hZCcsIHRyaWdnZXIpOyAvLyBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkIGZvciBvdGhlcnMNCi0gICAgICAvLyBqc2hpbnQgK1cwNjQNCi0gICAgfQ0KLSAgfSwNCi0gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsNCi0gICAgdmFyIHZhbHVlID0gW107DQotICAgIGZvckVhY2godGhpcywgZnVuY3Rpb24oZSkgeyB2YWx1ZS5wdXNoKCcnICsgZSk7fSk7DQotICAgIHJldHVybiAnWycgKyB2YWx1ZS5qb2luKCcsICcpICsgJ10nOw0KLSAgfSwNCi0NCi0gIGVxOiBmdW5jdGlvbihpbmRleCkgew0KLSAgICAgIHJldHVybiAoaW5kZXggPj0gMCkgPyBqcUxpdGUodGhpc1tpbmRleF0pIDoganFMaXRlKHRoaXNbdGhpcy5sZW5ndGggKyBpbmRleF0pOw0KLSAgfSwNCi0NCi0gIGxlbmd0aDogMCwNCi0gIHB1c2g6IHB1c2gsDQotICBzb3J0OiBbXS5zb3J0LA0KLSAgc3BsaWNlOiBbXS5zcGxpY2UNCi19Ow0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEZ1bmN0aW9ucyBpdGVyYXRpbmcgZ2V0dGVyL3NldHRlcnMuDQotLy8gdGhlc2UgZnVuY3Rpb25zIHJldHVybiBzZWxmIG9uIHNldHRlciBhbmQNCi0vLyB2YWx1ZSBvbiBnZXQuDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdmFyIEJPT0xFQU5fQVRUUiA9IHt9Ow0KLWZvckVhY2goJ211bHRpcGxlLHNlbGVjdGVkLGNoZWNrZWQsZGlzYWJsZWQscmVhZE9ubHkscmVxdWlyZWQsb3Blbicuc3BsaXQoJywnKSwgZnVuY3Rpb24odmFsdWUpIHsNCi0gIEJPT0xFQU5fQVRUUltsb3dlcmNhc2UodmFsdWUpXSA9IHZhbHVlOw0KLX0pOw0KLXZhciBCT09MRUFOX0VMRU1FTlRTID0ge307DQotZm9yRWFjaCgnaW5wdXQsc2VsZWN0LG9wdGlvbix0ZXh0YXJlYSxidXR0b24sZm9ybSxkZXRhaWxzJy5zcGxpdCgnLCcpLCBmdW5jdGlvbih2YWx1ZSkgew0KLSAgQk9PTEVBTl9FTEVNRU5UU1t2YWx1ZV0gPSB0cnVlOw0KLX0pOw0KLXZhciBBTElBU0VEX0FUVFIgPSB7DQotICAnbmdNaW5sZW5ndGgnOiAnbWlubGVuZ3RoJywNCi0gICduZ01heGxlbmd0aCc6ICdtYXhsZW5ndGgnLA0KLSAgJ25nTWluJzogJ21pbicsDQotICAnbmdNYXgnOiAnbWF4JywNCi0gICduZ1BhdHRlcm4nOiAncGF0dGVybicNCi19Ow0KLQ0KLWZ1bmN0aW9uIGdldEJvb2xlYW5BdHRyTmFtZShlbGVtZW50LCBuYW1lKSB7DQotICAvLyBjaGVjayBkb20gbGFzdCBzaW5jZSB3ZSB3aWxsIG1vc3QgbGlrZWx5IGZhaWwgb24gbmFtZQ0KLSAgdmFyIGJvb2xlYW5BdHRyID0gQk9PTEVBTl9BVFRSW25hbWUudG9Mb3dlckNhc2UoKV07DQotDQotICAvLyBib29sZWFuQXR0ciBpcyBoZXJlIHR3aWNlIHRvIG1pbmltaXplIERPTSBhY2Nlc3MNCi0gIHJldHVybiBib29sZWFuQXR0ciAmJiBCT09MRUFOX0VMRU1FTlRTW25vZGVOYW1lXyhlbGVtZW50KV0gJiYgYm9vbGVhbkF0dHI7DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldEFsaWFzZWRBdHRyTmFtZShlbGVtZW50LCBuYW1lKSB7DQotICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lOw0KLSAgcmV0dXJuIChub2RlTmFtZSA9PT0gJ0lOUFVUJyB8fCBub2RlTmFtZSA9PT0gJ1RFWFRBUkVBJykgJiYgQUxJQVNFRF9BVFRSW25hbWVdOw0KLX0NCi0NCi1mb3JFYWNoKHsNCi0gIGRhdGE6IGpxTGl0ZURhdGEsDQotICByZW1vdmVEYXRhOiBqcUxpdGVSZW1vdmVEYXRhDQotfSwgZnVuY3Rpb24oZm4sIG5hbWUpIHsNCi0gIEpRTGl0ZVtuYW1lXSA9IGZuOw0KLX0pOw0KLQ0KLWZvckVhY2goew0KLSAgZGF0YToganFMaXRlRGF0YSwNCi0gIGluaGVyaXRlZERhdGE6IGpxTGl0ZUluaGVyaXRlZERhdGEsDQotDQotICBzY29wZTogZnVuY3Rpb24oZWxlbWVudCkgew0KLSAgICAvLyBDYW4ndCB1c2UganFMaXRlRGF0YSBoZXJlIGRpcmVjdGx5IHNvIHdlIHN0YXkgY29tcGF0aWJsZSB3aXRoIGpRdWVyeSENCi0gICAgcmV0dXJuIGpxTGl0ZS5kYXRhKGVsZW1lbnQsICckc2NvcGUnKSB8fCBqcUxpdGVJbmhlcml0ZWREYXRhKGVsZW1lbnQucGFyZW50Tm9kZSB8fCBlbGVtZW50LCBbJyRpc29sYXRlU2NvcGUnLCAnJHNjb3BlJ10pOw0KLSAgfSwNCi0NCi0gIGlzb2xhdGVTY29wZTogZnVuY3Rpb24oZWxlbWVudCkgew0KLSAgICAvLyBDYW4ndCB1c2UganFMaXRlRGF0YSBoZXJlIGRpcmVjdGx5IHNvIHdlIHN0YXkgY29tcGF0aWJsZSB3aXRoIGpRdWVyeSENCi0gICAgcmV0dXJuIGpxTGl0ZS5kYXRhKGVsZW1lbnQsICckaXNvbGF0ZVNjb3BlJykgfHwganFMaXRlLmRhdGEoZWxlbWVudCwgJyRpc29sYXRlU2NvcGVOb1RlbXBsYXRlJyk7DQotICB9LA0KLQ0KLSAgY29udHJvbGxlcjoganFMaXRlQ29udHJvbGxlciwNCi0NCi0gIGluamVjdG9yOiBmdW5jdGlvbihlbGVtZW50KSB7DQotICAgIHJldHVybiBqcUxpdGVJbmhlcml0ZWREYXRhKGVsZW1lbnQsICckaW5qZWN0b3InKTsNCi0gIH0sDQotDQotICByZW1vdmVBdHRyOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lKSB7DQotICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpOw0KLSAgfSwNCi0NCi0gIGhhc0NsYXNzOiBqcUxpdGVIYXNDbGFzcywNCi0NCi0gIGNzczogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgdmFsdWUpIHsNCi0gICAgbmFtZSA9IGNhbWVsQ2FzZShuYW1lKTsNCi0NCi0gICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHsNCi0gICAgICBlbGVtZW50LnN0eWxlW25hbWVdID0gdmFsdWU7DQotICAgIH0gZWxzZSB7DQotICAgICAgcmV0dXJuIGVsZW1lbnQuc3R5bGVbbmFtZV07DQotICAgIH0NCi0gIH0sDQotDQotICBhdHRyOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lLCB2YWx1ZSkgew0KLSAgICB2YXIgbG93ZXJjYXNlZE5hbWUgPSBsb3dlcmNhc2UobmFtZSk7DQotICAgIGlmIChCT09MRUFOX0FUVFJbbG93ZXJjYXNlZE5hbWVdKSB7DQotICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHsNCi0gICAgICAgIGlmICghIXZhbHVlKSB7DQotICAgICAgICAgIGVsZW1lbnRbbmFtZV0gPSB0cnVlOw0KLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCBsb3dlcmNhc2VkTmFtZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBlbGVtZW50W25hbWVdID0gZmFsc2U7DQotICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGxvd2VyY2FzZWROYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIChlbGVtZW50W25hbWVdIHx8DQotICAgICAgICAgICAgICAgICAoZWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShuYW1lKSB8fCBub29wKS5zcGVjaWZpZWQpDQotICAgICAgICAgICAgICAgPyBsb3dlcmNhc2VkTmFtZQ0KLSAgICAgICAgICAgICAgIDogdW5kZWZpbmVkOw0KLSAgICAgIH0NCi0gICAgfSBlbHNlIGlmIChpc0RlZmluZWQodmFsdWUpKSB7DQotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOw0KLSAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7DQotICAgICAgLy8gdGhlIGV4dHJhIGFyZ3VtZW50ICIyIiBpcyB0byBnZXQgdGhlIHJpZ2h0IHRoaW5nIGZvciBhLmhyZWYgaW4gSUUsIHNlZSBqUXVlcnkgY29kZQ0KLSAgICAgIC8vIHNvbWUgZWxlbWVudHMgKGUuZy4gRG9jdW1lbnQpIGRvbid0IGhhdmUgZ2V0IGF0dHJpYnV0ZSwgc28gcmV0dXJuIHVuZGVmaW5lZA0KLSAgICAgIHZhciByZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lLCAyKTsNCi0gICAgICAvLyBub3JtYWxpemUgbm9uLWV4aXN0aW5nIGF0dHJpYnV0ZXMgdG8gdW5kZWZpbmVkIChhcyBqUXVlcnkpDQotICAgICAgcmV0dXJuIHJldCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDsNCi0gICAgfQ0KLSAgfSwNCi0NCi0gIHByb3A6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7DQotICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7DQotICAgICAgZWxlbWVudFtuYW1lXSA9IHZhbHVlOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHJldHVybiBlbGVtZW50W25hbWVdOw0KLSAgICB9DQotICB9LA0KLQ0KLSAgdGV4dDogKGZ1bmN0aW9uKCkgew0KLSAgICBnZXRUZXh0LiRkdiA9ICcnOw0KLSAgICByZXR1cm4gZ2V0VGV4dDsNCi0NCi0gICAgZnVuY3Rpb24gZ2V0VGV4dChlbGVtZW50LCB2YWx1ZSkgew0KLSAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHsNCi0gICAgICAgIHZhciBub2RlVHlwZSA9IGVsZW1lbnQubm9kZVR5cGU7DQotICAgICAgICByZXR1cm4gKG5vZGVUeXBlID09PSBOT0RFX1RZUEVfRUxFTUVOVCB8fCBub2RlVHlwZSA9PT0gTk9ERV9UWVBFX1RFWFQpID8gZWxlbWVudC50ZXh0Q29udGVudCA6ICcnOw0KLSAgICAgIH0NCi0gICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdmFsdWU7DQotICAgIH0NCi0gIH0pKCksDQotDQotICB2YWw6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7DQotICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHsNCi0gICAgICBpZiAoZWxlbWVudC5tdWx0aXBsZSAmJiBub2RlTmFtZV8oZWxlbWVudCkgPT09ICdzZWxlY3QnKSB7DQotICAgICAgICB2YXIgcmVzdWx0ID0gW107DQotICAgICAgICBmb3JFYWNoKGVsZW1lbnQub3B0aW9ucywgZnVuY3Rpb24ob3B0aW9uKSB7DQotICAgICAgICAgIGlmIChvcHRpb24uc2VsZWN0ZWQpIHsNCi0gICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24udmFsdWUgfHwgb3B0aW9uLnRleHQpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0gICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09PSAwID8gbnVsbCA6IHJlc3VsdDsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7DQotICAgIH0NCi0gICAgZWxlbWVudC52YWx1ZSA9IHZhbHVlOw0KLSAgfSwNCi0NCi0gIGh0bWw6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7DQotICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHsNCi0gICAgICByZXR1cm4gZWxlbWVudC5pbm5lckhUTUw7DQotICAgIH0NCi0gICAganFMaXRlRGVhbG9jKGVsZW1lbnQsIHRydWUpOw0KLSAgICBlbGVtZW50LmlubmVySFRNTCA9IHZhbHVlOw0KLSAgfSwNCi0NCi0gIGVtcHR5OiBqcUxpdGVFbXB0eQ0KLX0sIGZ1bmN0aW9uKGZuLCBuYW1lKSB7DQotICAvKioNCi0gICAqIFByb3BlcnRpZXM6IHdyaXRlcyByZXR1cm4gc2VsZWN0aW9uLCByZWFkcyByZXR1cm4gZmlyc3QgdmFsdWUNCi0gICAqLw0KLSAgSlFMaXRlLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKGFyZzEsIGFyZzIpIHsNCi0gICAgdmFyIGksIGtleTsNCi0gICAgdmFyIG5vZGVDb3VudCA9IHRoaXMubGVuZ3RoOw0KLQ0KLSAgICAvLyBqcUxpdGVIYXNDbGFzcyBoYXMgb25seSB0d28gYXJndW1lbnRzLCBidXQgaXMgYSBnZXR0ZXItb25seSBmbiwgc28gd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgaXQNCi0gICAgLy8gaW4gYSB3YXkgdGhhdCBzdXJ2aXZlcyBtaW5pZmljYXRpb24uDQotICAgIC8vIGpxTGl0ZUVtcHR5IHRha2VzIG5vIGFyZ3VtZW50cyBidXQgaXMgYSBzZXR0ZXIuDQotICAgIGlmIChmbiAhPT0ganFMaXRlRW1wdHkgJiYNCi0gICAgICAgICgoKGZuLmxlbmd0aCA9PSAyICYmIChmbiAhPT0ganFMaXRlSGFzQ2xhc3MgJiYgZm4gIT09IGpxTGl0ZUNvbnRyb2xsZXIpKSA/IGFyZzEgOiBhcmcyKSA9PT0gdW5kZWZpbmVkKSkgew0KLSAgICAgIGlmIChpc09iamVjdChhcmcxKSkgew0KLQ0KLSAgICAgICAgLy8gd2UgYXJlIGEgd3JpdGUsIGJ1dCB0aGUgb2JqZWN0IHByb3BlcnRpZXMgYXJlIHRoZSBrZXkvdmFsdWVzDQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZUNvdW50OyBpKyspIHsNCi0gICAgICAgICAgaWYgKGZuID09PSBqcUxpdGVEYXRhKSB7DQotICAgICAgICAgICAgLy8gZGF0YSgpIHRha2VzIHRoZSB3aG9sZSBvYmplY3QgaW4galF1ZXJ5DQotICAgICAgICAgICAgZm4odGhpc1tpXSwgYXJnMSk7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZm9yIChrZXkgaW4gYXJnMSkgew0KLSAgICAgICAgICAgICAgZm4odGhpc1tpXSwga2V5LCBhcmcxW2tleV0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gcmV0dXJuIHNlbGYgZm9yIGNoYWluaW5nDQotICAgICAgICByZXR1cm4gdGhpczsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLy8gd2UgYXJlIGEgcmVhZCwgc28gcmVhZCB0aGUgZmlyc3QgY2hpbGQuDQotICAgICAgICAvLyBUT0RPOiBkbyB3ZSBzdGlsbCBuZWVkIHRoaXM/DQotICAgICAgICB2YXIgdmFsdWUgPSBmbi4kZHY7DQotICAgICAgICAvLyBPbmx5IGlmIHdlIGhhdmUgJGR2IGRvIHdlIGl0ZXJhdGUgb3ZlciBhbGwsIG90aGVyd2lzZSBpdCBpcyBqdXN0IHRoZSBmaXJzdCBlbGVtZW50Lg0KLSAgICAgICAgdmFyIGpqID0gKHZhbHVlID09PSB1bmRlZmluZWQpID8gTWF0aC5taW4obm9kZUNvdW50LCAxKSA6IG5vZGVDb3VudDsNCi0gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgamo7IGorKykgew0KLSAgICAgICAgICB2YXIgbm9kZVZhbHVlID0gZm4odGhpc1tqXSwgYXJnMSwgYXJnMik7DQotICAgICAgICAgIHZhbHVlID0gdmFsdWUgPyB2YWx1ZSArIG5vZGVWYWx1ZSA6IG5vZGVWYWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgLy8gd2UgYXJlIGEgd3JpdGUsIHNvIGFwcGx5IHRvIGFsbCBjaGlsZHJlbg0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBub2RlQ291bnQ7IGkrKykgew0KLSAgICAgICAgZm4odGhpc1tpXSwgYXJnMSwgYXJnMik7DQotICAgICAgfQ0KLSAgICAgIC8vIHJldHVybiBzZWxmIGZvciBjaGFpbmluZw0KLSAgICAgIHJldHVybiB0aGlzOw0KLSAgICB9DQotICB9Ow0KLX0pOw0KLQ0KLWZ1bmN0aW9uIGNyZWF0ZUV2ZW50SGFuZGxlcihlbGVtZW50LCBldmVudHMpIHsNCi0gIHZhciBldmVudEhhbmRsZXIgPSBmdW5jdGlvbihldmVudCwgdHlwZSkgew0KLSAgICAvLyBqUXVlcnkgc3BlY2lmaWMgYXBpDQotICAgIGV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHJldHVybiBldmVudC5kZWZhdWx0UHJldmVudGVkOw0KLSAgICB9Ow0KLQ0KLSAgICB2YXIgZXZlbnRGbnMgPSBldmVudHNbdHlwZSB8fCBldmVudC50eXBlXTsNCi0gICAgdmFyIGV2ZW50Rm5zTGVuZ3RoID0gZXZlbnRGbnMgPyBldmVudEZucy5sZW5ndGggOiAwOw0KLQ0KLSAgICBpZiAoIWV2ZW50Rm5zTGVuZ3RoKSByZXR1cm47DQotDQotICAgIGlmIChpc1VuZGVmaW5lZChldmVudC5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQpKSB7DQotICAgICAgdmFyIG9yaWdpbmFsU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOw0KLSAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgZXZlbnQuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHsNCi0gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAob3JpZ2luYWxTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pIHsNCi0gICAgICAgICAgb3JpZ2luYWxTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24uY2FsbChldmVudCk7DQotICAgICAgICB9DQotICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHJldHVybiBldmVudC5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPT09IHRydWU7DQotICAgIH07DQotDQotICAgIC8vIENvcHkgZXZlbnQgaGFuZGxlcnMgaW4gY2FzZSBldmVudCBoYW5kbGVycyBhcnJheSBpcyBtb2RpZmllZCBkdXJpbmcgZXhlY3V0aW9uLg0KLSAgICBpZiAoKGV2ZW50Rm5zTGVuZ3RoID4gMSkpIHsNCi0gICAgICBldmVudEZucyA9IHNoYWxsb3dDb3B5KGV2ZW50Rm5zKTsNCi0gICAgfQ0KLQ0KLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50Rm5zTGVuZ3RoOyBpKyspIHsNCi0gICAgICBpZiAoIWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpIHsNCi0gICAgICAgIGV2ZW50Rm5zW2ldLmNhbGwoZWxlbWVudCwgZXZlbnQpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfTsNCi0NCi0gIC8vIFRPRE86IHRoaXMgaXMgYSBoYWNrIGZvciBhbmd1bGFyTW9ja3MvY2xlYXJEYXRhQ2FjaGUgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBkZXJlZ2lzdGVyIGFsbA0KLSAgLy8gICAgICAgZXZlbnRzIG9uIGBlbGVtZW50YA0KLSAgZXZlbnRIYW5kbGVyLmVsZW0gPSBlbGVtZW50Ow0KLSAgcmV0dXJuIGV2ZW50SGFuZGxlcjsNCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gRnVuY3Rpb25zIGl0ZXJhdGluZyB0cmF2ZXJzYWwuDQotLy8gVGhlc2UgZnVuY3Rpb25zIGNoYWluIHJlc3VsdHMgaW50byBhIHNpbmdsZQ0KLS8vIHNlbGVjdG9yLg0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLWZvckVhY2goew0KLSAgcmVtb3ZlRGF0YToganFMaXRlUmVtb3ZlRGF0YSwNCi0NCi0gIG9uOiBmdW5jdGlvbiBqcUxpdGVPbihlbGVtZW50LCB0eXBlLCBmbiwgdW5zdXBwb3J0ZWQpIHsNCi0gICAgaWYgKGlzRGVmaW5lZCh1bnN1cHBvcnRlZCkpIHRocm93IGpxTGl0ZU1pbkVycignb25hcmdzJywgJ2pxTGl0ZSNvbigpIGRvZXMgbm90IHN1cHBvcnQgdGhlIGBzZWxlY3RvcmAgb3IgYGV2ZW50RGF0YWAgcGFyYW1ldGVycycpOw0KLQ0KLSAgICAvLyBEbyBub3QgYWRkIGV2ZW50IGhhbmRsZXJzIHRvIG5vbi1lbGVtZW50cyBiZWNhdXNlIHRoZXkgd2lsbCBub3QgYmUgY2xlYW5lZCB1cC4NCi0gICAgaWYgKCFqcUxpdGVBY2NlcHRzRGF0YShlbGVtZW50KSkgew0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICB2YXIgZXhwYW5kb1N0b3JlID0ganFMaXRlRXhwYW5kb1N0b3JlKGVsZW1lbnQsIHRydWUpOw0KLSAgICB2YXIgZXZlbnRzID0gZXhwYW5kb1N0b3JlLmV2ZW50czsNCi0gICAgdmFyIGhhbmRsZSA9IGV4cGFuZG9TdG9yZS5oYW5kbGU7DQotDQotICAgIGlmICghaGFuZGxlKSB7DQotICAgICAgaGFuZGxlID0gZXhwYW5kb1N0b3JlLmhhbmRsZSA9IGNyZWF0ZUV2ZW50SGFuZGxlcihlbGVtZW50LCBldmVudHMpOw0KLSAgICB9DQotDQotICAgIC8vIGh0dHA6Ly9qc3BlcmYuY29tL3N0cmluZy1pbmRleG9mLXZzLXNwbGl0DQotICAgIHZhciB0eXBlcyA9IHR5cGUuaW5kZXhPZignICcpID49IDAgPyB0eXBlLnNwbGl0KCcgJykgOiBbdHlwZV07DQotICAgIHZhciBpID0gdHlwZXMubGVuZ3RoOw0KLQ0KLSAgICB3aGlsZSAoaS0tKSB7DQotICAgICAgdHlwZSA9IHR5cGVzW2ldOw0KLSAgICAgIHZhciBldmVudEZucyA9IGV2ZW50c1t0eXBlXTsNCi0NCi0gICAgICBpZiAoIWV2ZW50Rm5zKSB7DQotICAgICAgICBldmVudHNbdHlwZV0gPSBbXTsNCi0NCi0gICAgICAgIGlmICh0eXBlID09PSAnbW91c2VlbnRlcicgfHwgdHlwZSA9PT0gJ21vdXNlbGVhdmUnKSB7DQotICAgICAgICAgIC8vIFJlZmVyIHRvIGpRdWVyeSdzIGltcGxlbWVudGF0aW9uIG9mIG1vdXNlZW50ZXIgJiBtb3VzZWxlYXZlDQotICAgICAgICAgIC8vIFJlYWQgYWJvdXQgbW91c2VlbnRlciBhbmQgbW91c2VsZWF2ZToNCi0gICAgICAgICAgLy8gaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfbW91c2UuaHRtbCNsaW5rOA0KLQ0KLSAgICAgICAgICBqcUxpdGVPbihlbGVtZW50LCBNT1VTRV9FVkVOVF9NQVBbdHlwZV0sIGZ1bmN0aW9uKGV2ZW50KSB7DQotICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMsIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0Ow0KLSAgICAgICAgICAgIC8vIEZvciBtb3VzZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4NCi0gICAgICAgICAgICAvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvdw0KLSAgICAgICAgICAgIGlmICghcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGFyZ2V0ICYmICF0YXJnZXQuY29udGFpbnMocmVsYXRlZCkpKSB7DQotICAgICAgICAgICAgICBoYW5kbGUoZXZlbnQsIHR5cGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSk7DQotDQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBpZiAodHlwZSAhPT0gJyRkZXN0cm95Jykgew0KLSAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXJGbihlbGVtZW50LCB0eXBlLCBoYW5kbGUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBldmVudEZucyA9IGV2ZW50c1t0eXBlXTsNCi0gICAgICB9DQotICAgICAgZXZlbnRGbnMucHVzaChmbik7DQotICAgIH0NCi0gIH0sDQotDQotICBvZmY6IGpxTGl0ZU9mZiwNCi0NCi0gIG9uZTogZnVuY3Rpb24oZWxlbWVudCwgdHlwZSwgZm4pIHsNCi0gICAgZWxlbWVudCA9IGpxTGl0ZShlbGVtZW50KTsNCi0NCi0gICAgLy9hZGQgdGhlIGxpc3RlbmVyIHR3aWNlIHNvIHRoYXQgd2hlbiBpdCBpcyBjYWxsZWQNCi0gICAgLy95b3UgY2FuIHJlbW92ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gYW5kIHN0aWxsIGJlDQotICAgIC8vYWJsZSB0byBjYWxsIGVsZW1lbnQub2ZmKGV2LCBmbikgbm9ybWFsbHkNCi0gICAgZWxlbWVudC5vbih0eXBlLCBmdW5jdGlvbiBvbkZuKCkgew0KLSAgICAgIGVsZW1lbnQub2ZmKHR5cGUsIGZuKTsNCi0gICAgICBlbGVtZW50Lm9mZih0eXBlLCBvbkZuKTsNCi0gICAgfSk7DQotICAgIGVsZW1lbnQub24odHlwZSwgZm4pOw0KLSAgfSwNCi0NCi0gIHJlcGxhY2VXaXRoOiBmdW5jdGlvbihlbGVtZW50LCByZXBsYWNlTm9kZSkgew0KLSAgICB2YXIgaW5kZXgsIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsNCi0gICAganFMaXRlRGVhbG9jKGVsZW1lbnQpOw0KLSAgICBmb3JFYWNoKG5ldyBKUUxpdGUocmVwbGFjZU5vZGUpLCBmdW5jdGlvbihub2RlKSB7DQotICAgICAgaWYgKGluZGV4KSB7DQotICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIGluZGV4Lm5leHRTaWJsaW5nKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZChub2RlLCBlbGVtZW50KTsNCi0gICAgICB9DQotICAgICAgaW5kZXggPSBub2RlOw0KLSAgICB9KTsNCi0gIH0sDQotDQotICBjaGlsZHJlbjogZnVuY3Rpb24oZWxlbWVudCkgew0KLSAgICB2YXIgY2hpbGRyZW4gPSBbXTsNCi0gICAgZm9yRWFjaChlbGVtZW50LmNoaWxkTm9kZXMsIGZ1bmN0aW9uKGVsZW1lbnQpIHsNCi0gICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0VMRU1FTlQpDQotICAgICAgICBjaGlsZHJlbi5wdXNoKGVsZW1lbnQpOw0KLSAgICB9KTsNCi0gICAgcmV0dXJuIGNoaWxkcmVuOw0KLSAgfSwNCi0NCi0gIGNvbnRlbnRzOiBmdW5jdGlvbihlbGVtZW50KSB7DQotICAgIHJldHVybiBlbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBlbGVtZW50LmNoaWxkTm9kZXMgfHwgW107DQotICB9LA0KLQ0KLSAgYXBwZW5kOiBmdW5jdGlvbihlbGVtZW50LCBub2RlKSB7DQotICAgIHZhciBub2RlVHlwZSA9IGVsZW1lbnQubm9kZVR5cGU7DQotICAgIGlmIChub2RlVHlwZSAhPT0gTk9ERV9UWVBFX0VMRU1FTlQgJiYgbm9kZVR5cGUgIT09IE5PREVfVFlQRV9ET0NVTUVOVF9GUkFHTUVOVCkgcmV0dXJuOw0KLQ0KLSAgICBub2RlID0gbmV3IEpRTGl0ZShub2RlKTsNCi0NCi0gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbm9kZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7DQotICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTsNCi0gICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsNCi0gICAgfQ0KLSAgfSwNCi0NCi0gIHByZXBlbmQ6IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsNCi0gICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5PREVfVFlQRV9FTEVNRU5UKSB7DQotICAgICAgdmFyIGluZGV4ID0gZWxlbWVudC5maXJzdENoaWxkOw0KLSAgICAgIGZvckVhY2gobmV3IEpRTGl0ZShub2RlKSwgZnVuY3Rpb24oY2hpbGQpIHsNCi0gICAgICAgIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbmRleCk7DQotICAgICAgfSk7DQotICAgIH0NCi0gIH0sDQotDQotICB3cmFwOiBmdW5jdGlvbihlbGVtZW50LCB3cmFwTm9kZSkgew0KLSAgICB3cmFwTm9kZSA9IGpxTGl0ZSh3cmFwTm9kZSkuZXEoMCkuY2xvbmUoKVswXTsNCi0gICAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsNCi0gICAgaWYgKHBhcmVudCkgew0KLSAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQod3JhcE5vZGUsIGVsZW1lbnQpOw0KLSAgICB9DQotICAgIHdyYXBOb2RlLmFwcGVuZENoaWxkKGVsZW1lbnQpOw0KLSAgfSwNCi0NCi0gIHJlbW92ZToganFMaXRlUmVtb3ZlLA0KLQ0KLSAgZGV0YWNoOiBmdW5jdGlvbihlbGVtZW50KSB7DQotICAgIGpxTGl0ZVJlbW92ZShlbGVtZW50LCB0cnVlKTsNCi0gIH0sDQotDQotICBhZnRlcjogZnVuY3Rpb24oZWxlbWVudCwgbmV3RWxlbWVudCkgew0KLSAgICB2YXIgaW5kZXggPSBlbGVtZW50LCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7DQotICAgIG5ld0VsZW1lbnQgPSBuZXcgSlFMaXRlKG5ld0VsZW1lbnQpOw0KLQ0KLSAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBuZXdFbGVtZW50Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsNCi0gICAgICB2YXIgbm9kZSA9IG5ld0VsZW1lbnRbaV07DQotICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBpbmRleC5uZXh0U2libGluZyk7DQotICAgICAgaW5kZXggPSBub2RlOw0KLSAgICB9DQotICB9LA0KLQ0KLSAgYWRkQ2xhc3M6IGpxTGl0ZUFkZENsYXNzLA0KLSAgcmVtb3ZlQ2xhc3M6IGpxTGl0ZVJlbW92ZUNsYXNzLA0KLQ0KLSAgdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIHNlbGVjdG9yLCBjb25kaXRpb24pIHsNCi0gICAgaWYgKHNlbGVjdG9yKSB7DQotICAgICAgZm9yRWFjaChzZWxlY3Rvci5zcGxpdCgnICcpLCBmdW5jdGlvbihjbGFzc05hbWUpIHsNCi0gICAgICAgIHZhciBjbGFzc0NvbmRpdGlvbiA9IGNvbmRpdGlvbjsNCi0gICAgICAgIGlmIChpc1VuZGVmaW5lZChjbGFzc0NvbmRpdGlvbikpIHsNCi0gICAgICAgICAgY2xhc3NDb25kaXRpb24gPSAhanFMaXRlSGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIChjbGFzc0NvbmRpdGlvbiA/IGpxTGl0ZUFkZENsYXNzIDoganFMaXRlUmVtb3ZlQ2xhc3MpKGVsZW1lbnQsIGNsYXNzTmFtZSk7DQotICAgICAgfSk7DQotICAgIH0NCi0gIH0sDQotDQotICBwYXJlbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCi0gICAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsNCi0gICAgcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IE5PREVfVFlQRV9ET0NVTUVOVF9GUkFHTUVOVCA/IHBhcmVudCA6IG51bGw7DQotICB9LA0KLQ0KLSAgbmV4dDogZnVuY3Rpb24oZWxlbWVudCkgew0KLSAgICByZXR1cm4gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7DQotICB9LA0KLQ0KLSAgZmluZDogZnVuY3Rpb24oZWxlbWVudCwgc2VsZWN0b3IpIHsNCi0gICAgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsNCi0gICAgICByZXR1cm4gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShzZWxlY3Rvcik7DQotICAgIH0gZWxzZSB7DQotICAgICAgcmV0dXJuIFtdOw0KLSAgICB9DQotICB9LA0KLQ0KLSAgY2xvbmU6IGpxTGl0ZUNsb25lLA0KLQ0KLSAgdHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50LCBleHRyYVBhcmFtZXRlcnMpIHsNCi0NCi0gICAgdmFyIGR1bW15RXZlbnQsIGV2ZW50Rm5zQ29weSwgaGFuZGxlckFyZ3M7DQotICAgIHZhciBldmVudE5hbWUgPSBldmVudC50eXBlIHx8IGV2ZW50Ow0KLSAgICB2YXIgZXhwYW5kb1N0b3JlID0ganFMaXRlRXhwYW5kb1N0b3JlKGVsZW1lbnQpOw0KLSAgICB2YXIgZXZlbnRzID0gZXhwYW5kb1N0b3JlICYmIGV4cGFuZG9TdG9yZS5ldmVudHM7DQotICAgIHZhciBldmVudEZucyA9IGV2ZW50cyAmJiBldmVudHNbZXZlbnROYW1lXTsNCi0NCi0gICAgaWYgKGV2ZW50Rm5zKSB7DQotICAgICAgLy8gQ3JlYXRlIGEgZHVtbXkgZXZlbnQgdG8gcGFzcyB0byB0aGUgaGFuZGxlcnMNCi0gICAgICBkdW1teUV2ZW50ID0gew0KLSAgICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeyB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOyB9LA0KLSAgICAgICAgaXNEZWZhdWx0UHJldmVudGVkOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdHJ1ZTsgfSwNCi0gICAgICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7IHRoaXMuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsgfSwNCi0gICAgICAgIGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID09PSB0cnVlOyB9LA0KLSAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBub29wLA0KLSAgICAgICAgdHlwZTogZXZlbnROYW1lLA0KLSAgICAgICAgdGFyZ2V0OiBlbGVtZW50DQotICAgICAgfTsNCi0NCi0gICAgICAvLyBJZiBhIGN1c3RvbSBldmVudCB3YXMgcHJvdmlkZWQgdGhlbiBleHRlbmQgb3VyIGR1bW15IGV2ZW50IHdpdGggaXQNCi0gICAgICBpZiAoZXZlbnQudHlwZSkgew0KLSAgICAgICAgZHVtbXlFdmVudCA9IGV4dGVuZChkdW1teUV2ZW50LCBldmVudCk7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8vIENvcHkgZXZlbnQgaGFuZGxlcnMgaW4gY2FzZSBldmVudCBoYW5kbGVycyBhcnJheSBpcyBtb2RpZmllZCBkdXJpbmcgZXhlY3V0aW9uLg0KLSAgICAgIGV2ZW50Rm5zQ29weSA9IHNoYWxsb3dDb3B5KGV2ZW50Rm5zKTsNCi0gICAgICBoYW5kbGVyQXJncyA9IGV4dHJhUGFyYW1ldGVycyA/IFtkdW1teUV2ZW50XS5jb25jYXQoZXh0cmFQYXJhbWV0ZXJzKSA6IFtkdW1teUV2ZW50XTsNCi0NCi0gICAgICBmb3JFYWNoKGV2ZW50Rm5zQ29weSwgZnVuY3Rpb24oZm4pIHsNCi0gICAgICAgIGlmICghZHVtbXlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSB7DQotICAgICAgICAgIGZuLmFwcGx5KGVsZW1lbnQsIGhhbmRsZXJBcmdzKTsNCi0gICAgICAgIH0NCi0gICAgICB9KTsNCi0gICAgfQ0KLSAgfQ0KLX0sIGZ1bmN0aW9uKGZuLCBuYW1lKSB7DQotICAvKioNCi0gICAqIGNoYWluaW5nIGZ1bmN0aW9ucw0KLSAgICovDQotICBKUUxpdGUucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oYXJnMSwgYXJnMiwgYXJnMykgew0KLSAgICB2YXIgdmFsdWU7DQotDQotICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KLSAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHsNCi0gICAgICAgIHZhbHVlID0gZm4odGhpc1tpXSwgYXJnMSwgYXJnMiwgYXJnMyk7DQotICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkgew0KLSAgICAgICAgICAvLyBhbnkgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIHZhbHVlIG5lZWRzIHRvIGJlIHdyYXBwZWQNCi0gICAgICAgICAgdmFsdWUgPSBqcUxpdGUodmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBqcUxpdGVBZGROb2Rlcyh2YWx1ZSwgZm4odGhpc1tpXSwgYXJnMSwgYXJnMiwgYXJnMykpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gaXNEZWZpbmVkKHZhbHVlKSA/IHZhbHVlIDogdGhpczsNCi0gIH07DQotDQotICAvLyBiaW5kIGxlZ2FjeSBiaW5kL3VuYmluZCB0byBvbi9vZmYNCi0gIEpRTGl0ZS5wcm90b3R5cGUuYmluZCA9IEpRTGl0ZS5wcm90b3R5cGUub247DQotICBKUUxpdGUucHJvdG90eXBlLnVuYmluZCA9IEpRTGl0ZS5wcm90b3R5cGUub2ZmOw0KLX0pOw0KLQ0KLQ0KLS8vIFByb3ZpZGVyIGZvciBwcml2YXRlICQkanFMaXRlIHNlcnZpY2UNCi1mdW5jdGlvbiAkJGpxTGl0ZVByb3ZpZGVyKCkgew0KLSAgdGhpcy4kZ2V0ID0gZnVuY3Rpb24gJCRqcUxpdGUoKSB7DQotICAgIHJldHVybiBleHRlbmQoSlFMaXRlLCB7DQotICAgICAgaGFzQ2xhc3M6IGZ1bmN0aW9uKG5vZGUsIGNsYXNzZXMpIHsNCi0gICAgICAgIGlmIChub2RlLmF0dHIpIG5vZGUgPSBub2RlWzBdOw0KLSAgICAgICAgcmV0dXJuIGpxTGl0ZUhhc0NsYXNzKG5vZGUsIGNsYXNzZXMpOw0KLSAgICAgIH0sDQotICAgICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKG5vZGUsIGNsYXNzZXMpIHsNCi0gICAgICAgIGlmIChub2RlLmF0dHIpIG5vZGUgPSBub2RlWzBdOw0KLSAgICAgICAgcmV0dXJuIGpxTGl0ZUFkZENsYXNzKG5vZGUsIGNsYXNzZXMpOw0KLSAgICAgIH0sDQotICAgICAgcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKG5vZGUsIGNsYXNzZXMpIHsNCi0gICAgICAgIGlmIChub2RlLmF0dHIpIG5vZGUgPSBub2RlWzBdOw0KLSAgICAgICAgcmV0dXJuIGpxTGl0ZVJlbW92ZUNsYXNzKG5vZGUsIGNsYXNzZXMpOw0KLSAgICAgIH0NCi0gICAgfSk7DQotICB9Ow0KLX0NCi0NCi0vKioNCi0gKiBDb21wdXRlcyBhIGhhc2ggb2YgYW4gJ29iaicuDQotICogSGFzaCBvZiBhOg0KLSAqICBzdHJpbmcgaXMgc3RyaW5nDQotICogIG51bWJlciBpcyBudW1iZXIgYXMgc3RyaW5nDQotICogIG9iamVjdCBpcyBlaXRoZXIgcmVzdWx0IG9mIGNhbGxpbmcgJCRoYXNoS2V5IGZ1bmN0aW9uIG9uIHRoZSBvYmplY3Qgb3IgdW5pcXVlbHkgZ2VuZXJhdGVkIGlkLA0KLSAqICAgICAgICAgdGhhdCBpcyBhbHNvIGFzc2lnbmVkIHRvIHRoZSAkJGhhc2hLZXkgcHJvcGVydHkgb2YgdGhlIG9iamVjdC4NCi0gKg0KLSAqIEBwYXJhbSBvYmoNCi0gKiBAcmV0dXJucyB7c3RyaW5nfSBoYXNoIHN0cmluZyBzdWNoIHRoYXQgdGhlIHNhbWUgaW5wdXQgd2lsbCBoYXZlIHRoZSBzYW1lIGhhc2ggc3RyaW5nLg0KLSAqICAgICAgICAgVGhlIHJlc3VsdGluZyBzdHJpbmcga2V5IGlzIGluICd0eXBlOmhhc2hLZXknIGZvcm1hdC4NCi0gKi8NCi1mdW5jdGlvbiBoYXNoS2V5KG9iaiwgbmV4dFVpZEZuKSB7DQotICB2YXIga2V5ID0gb2JqICYmIG9iai4kJGhhc2hLZXk7DQotDQotICBpZiAoa2V5KSB7DQotICAgIGlmICh0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSB7DQotICAgICAga2V5ID0gb2JqLiQkaGFzaEtleSgpOw0KLSAgICB9DQotICAgIHJldHVybiBrZXk7DQotICB9DQotDQotICB2YXIgb2JqVHlwZSA9IHR5cGVvZiBvYmo7DQotICBpZiAob2JqVHlwZSA9PSAnZnVuY3Rpb24nIHx8IChvYmpUeXBlID09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkpIHsNCi0gICAga2V5ID0gb2JqLiQkaGFzaEtleSA9IG9ialR5cGUgKyAnOicgKyAobmV4dFVpZEZuIHx8IG5leHRVaWQpKCk7DQotICB9IGVsc2Ugew0KLSAgICBrZXkgPSBvYmpUeXBlICsgJzonICsgb2JqOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGtleTsNCi19DQotDQotLyoqDQotICogSGFzaE1hcCB3aGljaCBjYW4gdXNlIG9iamVjdHMgYXMga2V5cw0KLSAqLw0KLWZ1bmN0aW9uIEhhc2hNYXAoYXJyYXksIGlzb2xhdGVkVWlkKSB7DQotICBpZiAoaXNvbGF0ZWRVaWQpIHsNCi0gICAgdmFyIHVpZCA9IDA7DQotICAgIHRoaXMubmV4dFVpZCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHJldHVybiArK3VpZDsNCi0gICAgfTsNCi0gIH0NCi0gIGZvckVhY2goYXJyYXksIHRoaXMucHV0LCB0aGlzKTsNCi19DQotSGFzaE1hcC5wcm90b3R5cGUgPSB7DQotICAvKioNCi0gICAqIFN0b3JlIGtleSB2YWx1ZSBwYWlyDQotICAgKiBAcGFyYW0ga2V5IGtleSB0byBzdG9yZSBjYW4gYmUgYW55IHR5cGUNCi0gICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBzdG9yZSBjYW4gYmUgYW55IHR5cGUNCi0gICAqLw0KLSAgcHV0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7DQotICAgIHRoaXNbaGFzaEtleShrZXksIHRoaXMubmV4dFVpZCldID0gdmFsdWU7DQotICB9LA0KLQ0KLSAgLyoqDQotICAgKiBAcGFyYW0ga2V5DQotICAgKiBAcmV0dXJucyB7T2JqZWN0fSB0aGUgdmFsdWUgZm9yIHRoZSBrZXkNCi0gICAqLw0KLSAgZ2V0OiBmdW5jdGlvbihrZXkpIHsNCi0gICAgcmV0dXJuIHRoaXNbaGFzaEtleShrZXksIHRoaXMubmV4dFVpZCldOw0KLSAgfSwNCi0NCi0gIC8qKg0KLSAgICogUmVtb3ZlIHRoZSBrZXkvdmFsdWUgcGFpcg0KLSAgICogQHBhcmFtIGtleQ0KLSAgICovDQotICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgew0KLSAgICB2YXIgdmFsdWUgPSB0aGlzW2tleSA9IGhhc2hLZXkoa2V5LCB0aGlzLm5leHRVaWQpXTsNCi0gICAgZGVsZXRlIHRoaXNba2V5XTsNCi0gICAgcmV0dXJuIHZhbHVlOw0KLSAgfQ0KLX07DQotDQotLyoqDQotICogQG5nZG9jIGZ1bmN0aW9uDQotICogQG1vZHVsZSBuZw0KLSAqIEBuYW1lIGFuZ3VsYXIuaW5qZWN0b3INCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogQ3JlYXRlcyBhbiBpbmplY3RvciBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBmb3IgcmV0cmlldmluZyBzZXJ2aWNlcyBhcyB3ZWxsIGFzIGZvcg0KLSAqIGRlcGVuZGVuY3kgaW5qZWN0aW9uIChzZWUge0BsaW5rIGd1aWRlL2RpIGRlcGVuZGVuY3kgaW5qZWN0aW9ufSkuDQotICoNCi0gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmd8RnVuY3Rpb24+fSBtb2R1bGVzIEEgbGlzdCBvZiBtb2R1bGUgZnVuY3Rpb25zIG9yIHRoZWlyIGFsaWFzZXMuIFNlZQ0KLSAqICAgICB7QGxpbmsgYW5ndWxhci5tb2R1bGV9LiBUaGUgYG5nYCBtb2R1bGUgbXVzdCBiZSBleHBsaWNpdGx5IGFkZGVkLg0KLSAqIEBwYXJhbSB7Ym9vbGVhbj19IFtzdHJpY3REaT1mYWxzZV0gV2hldGhlciB0aGUgaW5qZWN0b3Igc2hvdWxkIGJlIGluIHN0cmljdCBtb2RlLCB3aGljaA0KLSAqICAgICBkaXNhbGxvd3MgYXJndW1lbnQgbmFtZSBhbm5vdGF0aW9uIGluZmVyZW5jZS4NCi0gKiBAcmV0dXJucyB7aW5qZWN0b3J9IEluamVjdG9yIG9iamVjdC4gU2VlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9Lg0KLSAqDQotICogQGV4YW1wbGUNCi0gKiBUeXBpY2FsIHVzYWdlDQotICogYGBganMNCi0gKiAgIC8vIGNyZWF0ZSBhbiBpbmplY3Rvcg0KLSAqICAgdmFyICRpbmplY3RvciA9IGFuZ3VsYXIuaW5qZWN0b3IoWyduZyddKTsNCi0gKg0KLSAqICAgLy8gdXNlIHRoZSBpbmplY3RvciB0byBraWNrIG9mZiB5b3VyIGFwcGxpY2F0aW9uDQotICogICAvLyB1c2UgdGhlIHR5cGUgaW5mZXJlbmNlIHRvIGF1dG8gaW5qZWN0IGFyZ3VtZW50cywgb3IgdXNlIGltcGxpY2l0IGluamVjdGlvbg0KLSAqICAgJGluamVjdG9yLmludm9rZShmdW5jdGlvbigkcm9vdFNjb3BlLCAkY29tcGlsZSwgJGRvY3VtZW50KSB7DQotICogICAgICRjb21waWxlKCRkb2N1bWVudCkoJHJvb3RTY29wZSk7DQotICogICAgICRyb290U2NvcGUuJGRpZ2VzdCgpOw0KLSAqICAgfSk7DQotICogYGBgDQotICoNCi0gKiBTb21ldGltZXMgeW91IHdhbnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgaW5qZWN0b3Igb2YgYSBjdXJyZW50bHkgcnVubmluZyBBbmd1bGFyIGFwcA0KLSAqIGZyb20gb3V0c2lkZSBBbmd1bGFyLiBQZXJoYXBzLCB5b3Ugd2FudCB0byBpbmplY3QgYW5kIGNvbXBpbGUgc29tZSBtYXJrdXAgYWZ0ZXIgdGhlDQotICogYXBwbGljYXRpb24gaGFzIGJlZW4gYm9vdHN0cmFwcGVkLiBZb3UgY2FuIGRvIHRoaXMgdXNpbmcgdGhlIGV4dHJhIGBpbmplY3RvcigpYCBhZGRlZA0KLSAqIHRvIEpRdWVyeS9qcUxpdGUgZWxlbWVudHMuIFNlZSB7QGxpbmsgYW5ndWxhci5lbGVtZW50fS4NCi0gKg0KLSAqICpUaGlzIGlzIGZhaXJseSByYXJlIGJ1dCBjb3VsZCBiZSB0aGUgY2FzZSBpZiBhIHRoaXJkIHBhcnR5IGxpYnJhcnkgaXMgaW5qZWN0aW5nIHRoZQ0KLSAqIG1hcmt1cC4qDQotICoNCi0gKiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYSBuZXcgYmxvY2sgb2YgSFRNTCBjb250YWluaW5nIGEgYG5nLWNvbnRyb2xsZXJgDQotICogZGlyZWN0aXZlIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50IGJvZHkgYnkgSlF1ZXJ5LiBXZSB0aGVuIGNvbXBpbGUgYW5kIGxpbmsNCi0gKiBpdCBpbnRvIHRoZSBjdXJyZW50IEFuZ3VsYXJKUyBzY29wZS4NCi0gKg0KLSAqIGBgYGpzDQotICogdmFyICRkaXYgPSAkKCc8ZGl2IG5nLWNvbnRyb2xsZXI9Ik15Q3RybCI+e3tjb250ZW50LmxhYmVsfX08L2Rpdj4nKTsNCi0gKiAkKGRvY3VtZW50LmJvZHkpLmFwcGVuZCgkZGl2KTsNCi0gKg0KLSAqIGFuZ3VsYXIuZWxlbWVudChkb2N1bWVudCkuaW5qZWN0b3IoKS5pbnZva2UoZnVuY3Rpb24oJGNvbXBpbGUpIHsNCi0gKiAgIHZhciBzY29wZSA9IGFuZ3VsYXIuZWxlbWVudCgkZGl2KS5zY29wZSgpOw0KLSAqICAgJGNvbXBpbGUoJGRpdikoc2NvcGUpOw0KLSAqIH0pOw0KLSAqIGBgYA0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBtb2R1bGUNCi0gKiBAbmFtZSBhdXRvDQotICogQGRlc2NyaXB0aW9uDQotICoNCi0gKiBJbXBsaWNpdCBtb2R1bGUgd2hpY2ggZ2V0cyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGVhY2gge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uDQotICovDQotDQotdmFyIEZOX0FSR1MgPSAvXmZ1bmN0aW9uXHMqW15cKF0qXChccyooW15cKV0qKVwpL207DQotdmFyIEZOX0FSR19TUExJVCA9IC8sLzsNCi12YXIgRk5fQVJHID0gL15ccyooXz8pKFxTKz8pXDFccyokLzsNCi12YXIgU1RSSVBfQ09NTUVOVFMgPSAvKChcL1wvLiokKXwoXC9cKltcc1xTXSo/XCpcLykpL21nOw0KLXZhciAkaW5qZWN0b3JNaW5FcnIgPSBtaW5FcnIoJyRpbmplY3RvcicpOw0KLQ0KLWZ1bmN0aW9uIGFub25Gbihmbikgew0KLSAgLy8gRm9yIGFub255bW91cyBmdW5jdGlvbnMsIHNob3dpbmcgYXQgdGhlIHZlcnkgbGVhc3QgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBjYW4gaGVscCBpbg0KLSAgLy8gZGVidWdnaW5nLg0KLSAgdmFyIGZuVGV4dCA9IGZuLnRvU3RyaW5nKCkucmVwbGFjZShTVFJJUF9DT01NRU5UUywgJycpLA0KLSAgICAgIGFyZ3MgPSBmblRleHQubWF0Y2goRk5fQVJHUyk7DQotICBpZiAoYXJncykgew0KLSAgICByZXR1cm4gJ2Z1bmN0aW9uKCcgKyAoYXJnc1sxXSB8fCAnJykucmVwbGFjZSgvW1xzXHJcbl0rLywgJyAnKSArICcpJzsNCi0gIH0NCi0gIHJldHVybiAnZm4nOw0KLX0NCi0NCi1mdW5jdGlvbiBhbm5vdGF0ZShmbiwgc3RyaWN0RGksIG5hbWUpIHsNCi0gIHZhciAkaW5qZWN0LA0KLSAgICAgIGZuVGV4dCwNCi0gICAgICBhcmdEZWNsLA0KLSAgICAgIGxhc3Q7DQotDQotICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7DQotICAgIGlmICghKCRpbmplY3QgPSBmbi4kaW5qZWN0KSkgew0KLSAgICAgICRpbmplY3QgPSBbXTsNCi0gICAgICBpZiAoZm4ubGVuZ3RoKSB7DQotICAgICAgICBpZiAoc3RyaWN0RGkpIHsNCi0gICAgICAgICAgaWYgKCFpc1N0cmluZyhuYW1lKSB8fCAhbmFtZSkgew0KLSAgICAgICAgICAgIG5hbWUgPSBmbi5uYW1lIHx8IGFub25Gbihmbik7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCdzdHJpY3RkaScsDQotICAgICAgICAgICAgJ3swfSBpcyBub3QgdXNpbmcgZXhwbGljaXQgYW5ub3RhdGlvbiBhbmQgY2Fubm90IGJlIGludm9rZWQgaW4gc3RyaWN0IG1vZGUnLCBuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZuVGV4dCA9IGZuLnRvU3RyaW5nKCkucmVwbGFjZShTVFJJUF9DT01NRU5UUywgJycpOw0KLSAgICAgICAgYXJnRGVjbCA9IGZuVGV4dC5tYXRjaChGTl9BUkdTKTsNCi0gICAgICAgIGZvckVhY2goYXJnRGVjbFsxXS5zcGxpdChGTl9BUkdfU1BMSVQpLCBmdW5jdGlvbihhcmcpIHsNCi0gICAgICAgICAgYXJnLnJlcGxhY2UoRk5fQVJHLCBmdW5jdGlvbihhbGwsIHVuZGVyc2NvcmUsIG5hbWUpIHsNCi0gICAgICAgICAgICAkaW5qZWN0LnB1c2gobmFtZSk7DQotICAgICAgICAgIH0pOw0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLSAgICAgIGZuLiRpbmplY3QgPSAkaW5qZWN0Ow0KLSAgICB9DQotICB9IGVsc2UgaWYgKGlzQXJyYXkoZm4pKSB7DQotICAgIGxhc3QgPSBmbi5sZW5ndGggLSAxOw0KLSAgICBhc3NlcnRBcmdGbihmbltsYXN0XSwgJ2ZuJyk7DQotICAgICRpbmplY3QgPSBmbi5zbGljZSgwLCBsYXN0KTsNCi0gIH0gZWxzZSB7DQotICAgIGFzc2VydEFyZ0ZuKGZuLCAnZm4nLCB0cnVlKTsNCi0gIH0NCi0gIHJldHVybiAkaW5qZWN0Ow0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICRpbmplY3Rvcg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICoNCi0gKiBgJGluamVjdG9yYCBpcyB1c2VkIHRvIHJldHJpZXZlIG9iamVjdCBpbnN0YW5jZXMgYXMgZGVmaW5lZCBieQ0KLSAqIHtAbGluayBhdXRvLiRwcm92aWRlIHByb3ZpZGVyfSwgaW5zdGFudGlhdGUgdHlwZXMsIGludm9rZSBtZXRob2RzLA0KLSAqIGFuZCBsb2FkIG1vZHVsZXMuDQotICoNCi0gKiBUaGUgZm9sbG93aW5nIGFsd2F5cyBob2xkcyB0cnVlOg0KLSAqDQotICogYGBganMNCi0gKiAgIHZhciAkaW5qZWN0b3IgPSBhbmd1bGFyLmluamVjdG9yKCk7DQotICogICBleHBlY3QoJGluamVjdG9yLmdldCgnJGluamVjdG9yJykpLnRvQmUoJGluamVjdG9yKTsNCi0gKiAgIGV4cGVjdCgkaW5qZWN0b3IuaW52b2tlKGZ1bmN0aW9uKCRpbmplY3Rvcikgew0KLSAqICAgICByZXR1cm4gJGluamVjdG9yOw0KLSAqICAgfSkpLnRvQmUoJGluamVjdG9yKTsNCi0gKiBgYGANCi0gKg0KLSAqICMgSW5qZWN0aW9uIEZ1bmN0aW9uIEFubm90YXRpb24NCi0gKg0KLSAqIEphdmFTY3JpcHQgZG9lcyBub3QgaGF2ZSBhbm5vdGF0aW9ucywgYW5kIGFubm90YXRpb25zIGFyZSBuZWVkZWQgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLiBUaGUNCi0gKiBmb2xsb3dpbmcgYXJlIGFsbCB2YWxpZCB3YXlzIG9mIGFubm90YXRpbmcgZnVuY3Rpb24gd2l0aCBpbmplY3Rpb24gYXJndW1lbnRzIGFuZCBhcmUgZXF1aXZhbGVudC4NCi0gKg0KLSAqIGBgYGpzDQotICogICAvLyBpbmZlcnJlZCAob25seSB3b3JrcyBpZiBjb2RlIG5vdCBtaW5pZmllZC9vYmZ1c2NhdGVkKQ0KLSAqICAgJGluamVjdG9yLmludm9rZShmdW5jdGlvbihzZXJ2aWNlQSl7fSk7DQotICoNCi0gKiAgIC8vIGFubm90YXRlZA0KLSAqICAgZnVuY3Rpb24gZXhwbGljaXQoc2VydmljZUEpIHt9Ow0KLSAqICAgZXhwbGljaXQuJGluamVjdCA9IFsnc2VydmljZUEnXTsNCi0gKiAgICRpbmplY3Rvci5pbnZva2UoZXhwbGljaXQpOw0KLSAqDQotICogICAvLyBpbmxpbmUNCi0gKiAgICRpbmplY3Rvci5pbnZva2UoWydzZXJ2aWNlQScsIGZ1bmN0aW9uKHNlcnZpY2VBKXt9XSk7DQotICogYGBgDQotICoNCi0gKiAjIyBJbmZlcmVuY2UNCi0gKg0KLSAqIEluIEphdmFTY3JpcHQgY2FsbGluZyBgdG9TdHJpbmcoKWAgb24gYSBmdW5jdGlvbiByZXR1cm5zIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiBUaGUgZGVmaW5pdGlvbg0KLSAqIGNhbiB0aGVuIGJlIHBhcnNlZCBhbmQgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBjYW4gYmUgZXh0cmFjdGVkLiBUaGlzIG1ldGhvZCBvZiBkaXNjb3ZlcmluZw0KLSAqIGFubm90YXRpb25zIGlzIGRpc2FsbG93ZWQgd2hlbiB0aGUgaW5qZWN0b3IgaXMgaW4gc3RyaWN0IG1vZGUuDQotICogKk5PVEU6KiBUaGlzIGRvZXMgbm90IHdvcmsgd2l0aCBtaW5pZmljYXRpb24sIGFuZCBvYmZ1c2NhdGlvbiB0b29scyBzaW5jZSB0aGVzZSB0b29scyBjaGFuZ2UgdGhlDQotICogYXJndW1lbnQgbmFtZXMuDQotICoNCi0gKiAjIyBgJGluamVjdGAgQW5ub3RhdGlvbg0KLSAqIEJ5IGFkZGluZyBhbiBgJGluamVjdGAgcHJvcGVydHkgb250byBhIGZ1bmN0aW9uIHRoZSBpbmplY3Rpb24gcGFyYW1ldGVycyBjYW4gYmUgc3BlY2lmaWVkLg0KLSAqDQotICogIyMgSW5saW5lDQotICogQXMgYW4gYXJyYXkgb2YgaW5qZWN0aW9uIG5hbWVzLCB3aGVyZSB0aGUgbGFzdCBpdGVtIGluIHRoZSBhcnJheSBpcyB0aGUgZnVuY3Rpb24gdG8gY2FsbC4NCi0gKi8NCi0NCi0vKioNCi0gKiBAbmdkb2MgbWV0aG9kDQotICogQG5hbWUgJGluamVjdG9yI2dldA0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlLg0KLSAqDQotICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIHRvIHJldHJpZXZlLg0KLSAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsZXIgQW4gb3B0aW9uYWwgc3RyaW5nIHRvIHByb3ZpZGUgdGhlIG9yaWdpbiBvZiB0aGUgZnVuY3Rpb24gY2FsbCBmb3IgZXJyb3IgbWVzc2FnZXMuDQotICogQHJldHVybiB7Kn0gVGhlIGluc3RhbmNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBtZXRob2QNCi0gKiBAbmFtZSAkaW5qZWN0b3IjaW52b2tlDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBJbnZva2UgdGhlIG1ldGhvZCBhbmQgc3VwcGx5IHRoZSBtZXRob2QgYXJndW1lbnRzIGZyb20gdGhlIGAkaW5qZWN0b3JgLg0KLSAqDQotICogQHBhcmFtIHshRnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuIEZ1bmN0aW9uIHBhcmFtZXRlcnMgYXJlIGluamVjdGVkIGFjY29yZGluZyB0byB0aGUNCi0gKiAgIHtAbGluayBndWlkZS9kaSAkaW5qZWN0IEFubm90YXRpb259IHJ1bGVzLg0KLSAqIEBwYXJhbSB7T2JqZWN0PX0gc2VsZiBUaGUgYHRoaXNgIGZvciB0aGUgaW52b2tlZCBtZXRob2QuDQotICogQHBhcmFtIHtPYmplY3Q9fSBsb2NhbHMgT3B0aW9uYWwgb2JqZWN0LiBJZiBwcmVzZXQgdGhlbiBhbnkgYXJndW1lbnQgbmFtZXMgYXJlIHJlYWQgZnJvbSB0aGlzDQotICogICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZpcnN0LCBiZWZvcmUgdGhlIGAkaW5qZWN0b3JgIGlzIGNvbnN1bHRlZC4NCi0gKiBAcmV0dXJucyB7Kn0gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBpbnZva2VkIGBmbmAgZnVuY3Rpb24uDQotICovDQotDQotLyoqDQotICogQG5nZG9jIG1ldGhvZA0KLSAqIEBuYW1lICRpbmplY3RvciNoYXMNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEFsbG93cyB0aGUgdXNlciB0byBxdWVyeSBpZiB0aGUgcGFydGljdWxhciBzZXJ2aWNlIGV4aXN0cy4NCi0gKg0KLSAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gcXVlcnkuDQotICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBpbmplY3RvciBoYXMgZ2l2ZW4gc2VydmljZS4NCi0gKi8NCi0NCi0vKioNCi0gKiBAbmdkb2MgbWV0aG9kDQotICogQG5hbWUgJGluamVjdG9yI2luc3RhbnRpYXRlDQotICogQGRlc2NyaXB0aW9uDQotICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEpTIHR5cGUuIFRoZSBtZXRob2QgdGFrZXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgaW52b2tlcyB0aGUgbmV3DQotICogb3BlcmF0b3IsIGFuZCBzdXBwbGllcyBhbGwgb2YgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24gYXMgc3BlY2lmaWVkIGJ5IHRoZQ0KLSAqIGNvbnN0cnVjdG9yIGFubm90YXRpb24uDQotICoNCi0gKiBAcGFyYW0ge0Z1bmN0aW9ufSBUeXBlIEFubm90YXRlZCBjb25zdHJ1Y3RvciBmdW5jdGlvbi4NCi0gKiBAcGFyYW0ge09iamVjdD19IGxvY2FscyBPcHRpb25hbCBvYmplY3QuIElmIHByZXNldCB0aGVuIGFueSBhcmd1bWVudCBuYW1lcyBhcmUgcmVhZCBmcm9tIHRoaXMNCi0gKiBvYmplY3QgZmlyc3QsIGJlZm9yZSB0aGUgYCRpbmplY3RvcmAgaXMgY29uc3VsdGVkLg0KLSAqIEByZXR1cm5zIHtPYmplY3R9IG5ldyBpbnN0YW5jZSBvZiBgVHlwZWAuDQotICovDQotDQotLyoqDQotICogQG5nZG9jIG1ldGhvZA0KLSAqIEBuYW1lICRpbmplY3RvciNhbm5vdGF0ZQ0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogUmV0dXJucyBhbiBhcnJheSBvZiBzZXJ2aWNlIG5hbWVzIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyByZXF1ZXN0aW5nIGZvciBpbmplY3Rpb24uIFRoaXMgQVBJIGlzDQotICogdXNlZCBieSB0aGUgaW5qZWN0b3IgdG8gZGV0ZXJtaW5lIHdoaWNoIHNlcnZpY2VzIG5lZWQgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgZnVuY3Rpb24gd2hlbiB0aGUNCi0gKiBmdW5jdGlvbiBpcyBpbnZva2VkLiBUaGVyZSBhcmUgdGhyZWUgd2F5cyBpbiB3aGljaCB0aGUgZnVuY3Rpb24gY2FuIGJlIGFubm90YXRlZCB3aXRoIHRoZSBuZWVkZWQNCi0gKiBkZXBlbmRlbmNpZXMuDQotICoNCi0gKiAjIEFyZ3VtZW50IG5hbWVzDQotICoNCi0gKiBUaGUgc2ltcGxlc3QgZm9ybSBpcyB0byBleHRyYWN0IHRoZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgYXJndW1lbnRzIG9mIHRoZSBmdW5jdGlvbi4gVGhpcyBpcyBkb25lDQotICogYnkgY29udmVydGluZyB0aGUgZnVuY3Rpb24gaW50byBhIHN0cmluZyB1c2luZyBgdG9TdHJpbmcoKWAgbWV0aG9kIGFuZCBleHRyYWN0aW5nIHRoZSBhcmd1bWVudA0KLSAqIG5hbWVzLg0KLSAqIGBgYGpzDQotICogICAvLyBHaXZlbg0KLSAqICAgZnVuY3Rpb24gTXlDb250cm9sbGVyKCRzY29wZSwgJHJvdXRlKSB7DQotICogICAgIC8vIC4uLg0KLSAqICAgfQ0KLSAqDQotICogICAvLyBUaGVuDQotICogICBleHBlY3QoaW5qZWN0b3IuYW5ub3RhdGUoTXlDb250cm9sbGVyKSkudG9FcXVhbChbJyRzY29wZScsICckcm91dGUnXSk7DQotICogYGBgDQotICoNCi0gKiBZb3UgY2FuIGRpc2FsbG93IHRoaXMgbWV0aG9kIGJ5IHVzaW5nIHN0cmljdCBpbmplY3Rpb24gbW9kZS4NCi0gKg0KLSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBjb2RlIG1pbmlmaWNhdGlvbiAvIG9iZnVzY2F0aW9uLiBGb3IgdGhpcyByZWFzb24gdGhlIGZvbGxvd2luZw0KLSAqIGFubm90YXRpb24gc3RyYXRlZ2llcyBhcmUgc3VwcG9ydGVkLg0KLSAqDQotICogIyBUaGUgYCRpbmplY3RgIHByb3BlcnR5DQotICoNCi0gKiBJZiBhIGZ1bmN0aW9uIGhhcyBhbiBgJGluamVjdGAgcHJvcGVydHkgYW5kIGl0cyB2YWx1ZSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzLCB0aGVuIHRoZSBzdHJpbmdzDQotICogcmVwcmVzZW50IG5hbWVzIG9mIHNlcnZpY2VzIHRvIGJlIGluamVjdGVkIGludG8gdGhlIGZ1bmN0aW9uLg0KLSAqIGBgYGpzDQotICogICAvLyBHaXZlbg0KLSAqICAgdmFyIE15Q29udHJvbGxlciA9IGZ1bmN0aW9uKG9iZnVzY2F0ZWRTY29wZSwgb2JmdXNjYXRlZFJvdXRlKSB7DQotICogICAgIC8vIC4uLg0KLSAqICAgfQ0KLSAqICAgLy8gRGVmaW5lIGZ1bmN0aW9uIGRlcGVuZGVuY2llcw0KLSAqICAgTXlDb250cm9sbGVyWyckaW5qZWN0J10gPSBbJyRzY29wZScsICckcm91dGUnXTsNCi0gKg0KLSAqICAgLy8gVGhlbg0KLSAqICAgZXhwZWN0KGluamVjdG9yLmFubm90YXRlKE15Q29udHJvbGxlcikpLnRvRXF1YWwoWyckc2NvcGUnLCAnJHJvdXRlJ10pOw0KLSAqIGBgYA0KLSAqDQotICogIyBUaGUgYXJyYXkgbm90YXRpb24NCi0gKg0KLSAqIEl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBpbmxpbmUgSW5qZWN0ZWQgZnVuY3Rpb25zIGFuZCB0aGF0J3Mgd2hlbiBzZXR0aW5nIHRoZSBgJGluamVjdGAgcHJvcGVydHkNCi0gKiBpcyB2ZXJ5IGluY29udmVuaWVudC4gSW4gdGhlc2Ugc2l0dWF0aW9ucyB1c2luZyB0aGUgYXJyYXkgbm90YXRpb24gdG8gc3BlY2lmeSB0aGUgZGVwZW5kZW5jaWVzIGluDQotICogYSB3YXkgdGhhdCBzdXJ2aXZlcyBtaW5pZmljYXRpb24gaXMgYSBiZXR0ZXIgY2hvaWNlOg0KLSAqDQotICogYGBganMNCi0gKiAgIC8vIFdlIHdpc2ggdG8gd3JpdGUgdGhpcyAobm90IG1pbmlmaWNhdGlvbiAvIG9iZnVzY2F0aW9uIHNhZmUpDQotICogICBpbmplY3Rvci5pbnZva2UoZnVuY3Rpb24oJGNvbXBpbGUsICRyb290U2NvcGUpIHsNCi0gKiAgICAgLy8gLi4uDQotICogICB9KTsNCi0gKg0KLSAqICAgLy8gV2UgYXJlIGZvcmNlZCB0byB3cml0ZSBicmVhayBpbmxpbmluZw0KLSAqICAgdmFyIHRtcEZuID0gZnVuY3Rpb24ob2JmdXNjYXRlZENvbXBpbGUsIG9iZnVzY2F0ZWRSb290U2NvcGUpIHsNCi0gKiAgICAgLy8gLi4uDQotICogICB9Ow0KLSAqICAgdG1wRm4uJGluamVjdCA9IFsnJGNvbXBpbGUnLCAnJHJvb3RTY29wZSddOw0KLSAqICAgaW5qZWN0b3IuaW52b2tlKHRtcEZuKTsNCi0gKg0KLSAqICAgLy8gVG8gYmV0dGVyIHN1cHBvcnQgaW5saW5lIGZ1bmN0aW9uIHRoZSBpbmxpbmUgYW5ub3RhdGlvbiBpcyBzdXBwb3J0ZWQNCi0gKiAgIGluamVjdG9yLmludm9rZShbJyRjb21waWxlJywgJyRyb290U2NvcGUnLCBmdW5jdGlvbihvYmZDb21waWxlLCBvYmZSb290U2NvcGUpIHsNCi0gKiAgICAgLy8gLi4uDQotICogICB9XSk7DQotICoNCi0gKiAgIC8vIFRoZXJlZm9yZQ0KLSAqICAgZXhwZWN0KGluamVjdG9yLmFubm90YXRlKA0KLSAqICAgICAgWyckY29tcGlsZScsICckcm9vdFNjb3BlJywgZnVuY3Rpb24ob2JmdXNfJGNvbXBpbGUsIG9iZnVzXyRyb290U2NvcGUpIHt9XSkNCi0gKiAgICApLnRvRXF1YWwoWyckY29tcGlsZScsICckcm9vdFNjb3BlJ10pOw0KLSAqIGBgYA0KLSAqDQotICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheS48c3RyaW5nfEZ1bmN0aW9uPn0gZm4gRnVuY3Rpb24gZm9yIHdoaWNoIGRlcGVuZGVudCBzZXJ2aWNlIG5hbWVzIG5lZWQgdG8NCi0gKiBiZSByZXRyaWV2ZWQgYXMgZGVzY3JpYmVkIGFib3ZlLg0KLSAqDQotICogQHBhcmFtIHtib29sZWFuPX0gW3N0cmljdERpPWZhbHNlXSBEaXNhbGxvdyBhcmd1bWVudCBuYW1lIGFubm90YXRpb24gaW5mZXJlbmNlLg0KLSAqDQotICogQHJldHVybnMge0FycmF5LjxzdHJpbmc+fSBUaGUgbmFtZXMgb2YgdGhlIHNlcnZpY2VzIHdoaWNoIHRoZSBmdW5jdGlvbiByZXF1aXJlcy4NCi0gKi8NCi0NCi0NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICRwcm92aWRlDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKg0KLSAqIFRoZSB7QGxpbmsgYXV0by4kcHJvdmlkZSAkcHJvdmlkZX0gc2VydmljZSBoYXMgYSBudW1iZXIgb2YgbWV0aG9kcyBmb3IgcmVnaXN0ZXJpbmcgY29tcG9uZW50cw0KLSAqIHdpdGggdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LiBNYW55IG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgYWxzbyBleHBvc2VkIG9uDQotICoge0BsaW5rIGFuZ3VsYXIuTW9kdWxlfS4NCi0gKg0KLSAqIEFuIEFuZ3VsYXIgKipzZXJ2aWNlKiogaXMgYSBzaW5nbGV0b24gb2JqZWN0IGNyZWF0ZWQgYnkgYSAqKnNlcnZpY2UgZmFjdG9yeSoqLiAgVGhlc2UgKipzZXJ2aWNlDQotICogZmFjdG9yaWVzKiogYXJlIGZ1bmN0aW9ucyB3aGljaCwgaW4gdHVybiwgYXJlIGNyZWF0ZWQgYnkgYSAqKnNlcnZpY2UgcHJvdmlkZXIqKi4NCi0gKiBUaGUgKipzZXJ2aWNlIHByb3ZpZGVycyoqIGFyZSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMuIFdoZW4gaW5zdGFudGlhdGVkIHRoZXkgbXVzdCBjb250YWluIGENCi0gKiBwcm9wZXJ0eSBjYWxsZWQgYCRnZXRgLCB3aGljaCBob2xkcyB0aGUgKipzZXJ2aWNlIGZhY3RvcnkqKiBmdW5jdGlvbi4NCi0gKg0KLSAqIFdoZW4geW91IHJlcXVlc3QgYSBzZXJ2aWNlLCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgdGhlDQotICogY29ycmVjdCAqKnNlcnZpY2UgcHJvdmlkZXIqKiwgaW5zdGFudGlhdGluZyBpdCBhbmQgdGhlbiBjYWxsaW5nIGl0cyBgJGdldGAgKipzZXJ2aWNlIGZhY3RvcnkqKg0KLSAqIGZ1bmN0aW9uIHRvIGdldCB0aGUgaW5zdGFuY2Ugb2YgdGhlICoqc2VydmljZSoqLg0KLSAqDQotICogT2Z0ZW4gc2VydmljZXMgaGF2ZSBubyBjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kIHRoZXJlIGlzIG5vIG5lZWQgdG8gYWRkIG1ldGhvZHMgdG8gdGhlIHNlcnZpY2UNCi0gKiBwcm92aWRlci4gIFRoZSBwcm92aWRlciB3aWxsIGJlIG5vIG1vcmUgdGhhbiBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpdGggYSBgJGdldGAgcHJvcGVydHkuIEZvcg0KLSAqIHRoZXNlIGNhc2VzIHRoZSB7QGxpbmsgYXV0by4kcHJvdmlkZSAkcHJvdmlkZX0gc2VydmljZSBoYXMgYWRkaXRpb25hbCBoZWxwZXIgbWV0aG9kcyB0byByZWdpc3Rlcg0KLSAqIHNlcnZpY2VzIHdpdGhvdXQgc3BlY2lmeWluZyBhIHByb3ZpZGVyLg0KLSAqDQotICogKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNwcm92aWRlciBwcm92aWRlcihwcm92aWRlcil9IC0gcmVnaXN0ZXJzIGEgKipzZXJ2aWNlIHByb3ZpZGVyKiogd2l0aCB0aGUNCi0gKiAgICAge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0NCi0gKiAqIHtAbGluayBhdXRvLiRwcm92aWRlI2NvbnN0YW50IGNvbnN0YW50KG9iail9IC0gcmVnaXN0ZXJzIGEgdmFsdWUvb2JqZWN0IHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGJ5DQotICogICAgIHByb3ZpZGVycyBhbmQgc2VydmljZXMuDQotICogKiB7QGxpbmsgYXV0by4kcHJvdmlkZSN2YWx1ZSB2YWx1ZShvYmopfSAtIHJlZ2lzdGVycyBhIHZhbHVlL29iamVjdCB0aGF0IGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5DQotICogICAgIHNlcnZpY2VzLCBub3QgcHJvdmlkZXJzLg0KLSAqICoge0BsaW5rIGF1dG8uJHByb3ZpZGUjZmFjdG9yeSBmYWN0b3J5KGZuKX0gLSByZWdpc3RlcnMgYSBzZXJ2aWNlICoqZmFjdG9yeSBmdW5jdGlvbioqLCBgZm5gLA0KLSAqICAgICB0aGF0IHdpbGwgYmUgd3JhcHBlZCBpbiBhICoqc2VydmljZSBwcm92aWRlcioqIG9iamVjdCwgd2hvc2UgYCRnZXRgIHByb3BlcnR5IHdpbGwgY29udGFpbiB0aGUNCi0gKiAgICAgZ2l2ZW4gZmFjdG9yeSBmdW5jdGlvbi4NCi0gKiAqIHtAbGluayBhdXRvLiRwcm92aWRlI3NlcnZpY2Ugc2VydmljZShjbGFzcyl9IC0gcmVnaXN0ZXJzIGEgKipjb25zdHJ1Y3RvciBmdW5jdGlvbioqLCBgY2xhc3NgDQotICogICAgIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGluIGEgKipzZXJ2aWNlIHByb3ZpZGVyKiogb2JqZWN0LCB3aG9zZSBgJGdldGAgcHJvcGVydHkgd2lsbCBpbnN0YW50aWF0ZQ0KLSAqICAgICAgYSBuZXcgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBjb25zdHJ1Y3RvciBmdW5jdGlvbi4NCi0gKg0KLSAqIFNlZSB0aGUgaW5kaXZpZHVhbCBtZXRob2RzIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlcy4NCi0gKi8NCi0NCi0vKioNCi0gKiBAbmdkb2MgbWV0aG9kDQotICogQG5hbWUgJHByb3ZpZGUjcHJvdmlkZXINCi0gKiBAZGVzY3JpcHRpb24NCi0gKg0KLSAqIFJlZ2lzdGVyIGEgKipwcm92aWRlciBmdW5jdGlvbioqIHdpdGggdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LiBQcm92aWRlciBmdW5jdGlvbnMNCi0gKiBhcmUgY29uc3RydWN0b3IgZnVuY3Rpb25zLCB3aG9zZSBpbnN0YW5jZXMgYXJlIHJlc3BvbnNpYmxlIGZvciAicHJvdmlkaW5nIiBhIGZhY3RvcnkgZm9yIGENCi0gKiBzZXJ2aWNlLg0KLSAqDQotICogU2VydmljZSBwcm92aWRlciBuYW1lcyBzdGFydCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoZXkgcHJvdmlkZSBmb2xsb3dlZCBieSBgUHJvdmlkZXJgLg0KLSAqIEZvciBleGFtcGxlLCB0aGUge0BsaW5rIG5nLiRsb2cgJGxvZ30gc2VydmljZSBoYXMgYSBwcm92aWRlciBjYWxsZWQNCi0gKiB7QGxpbmsgbmcuJGxvZ1Byb3ZpZGVyICRsb2dQcm92aWRlcn0uDQotICoNCi0gKiBTZXJ2aWNlIHByb3ZpZGVyIG9iamVjdHMgY2FuIGhhdmUgYWRkaXRpb25hbCBtZXRob2RzIHdoaWNoIGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHByb3ZpZGVyDQotICogYW5kIGl0cyBzZXJ2aWNlLiBJbXBvcnRhbnRseSwgeW91IGNhbiBjb25maWd1cmUgd2hhdCBraW5kIG9mIHNlcnZpY2UgaXMgY3JlYXRlZCBieSB0aGUgYCRnZXRgDQotICogbWV0aG9kLCBvciBob3cgdGhhdCBzZXJ2aWNlIHdpbGwgYWN0LiBGb3IgZXhhbXBsZSwgdGhlIHtAbGluayBuZy4kbG9nUHJvdmlkZXIgJGxvZ1Byb3ZpZGVyfSBoYXMgYQ0KLSAqIG1ldGhvZCB7QGxpbmsgbmcuJGxvZ1Byb3ZpZGVyI2RlYnVnRW5hYmxlZCBkZWJ1Z0VuYWJsZWR9DQotICogd2hpY2ggbGV0cyB5b3Ugc3BlY2lmeSB3aGV0aGVyIHRoZSB7QGxpbmsgbmcuJGxvZyAkbG9nfSBzZXJ2aWNlIHdpbGwgbG9nIGRlYnVnIG1lc3NhZ2VzIHRvIHRoZQ0KLSAqIGNvbnNvbGUgb3Igbm90Lg0KLSAqDQotICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlLiBOT1RFOiB0aGUgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgdW5kZXIgYG5hbWUgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICdQcm92aWRlcidgIGtleS4NCi0gKiBAcGFyYW0geyhPYmplY3R8ZnVuY3Rpb24oKSl9IHByb3ZpZGVyIElmIHRoZSBwcm92aWRlciBpczoNCi0gKg0KLSAqICAgLSBgT2JqZWN0YDogdGhlbiBpdCBzaG91bGQgaGF2ZSBhIGAkZ2V0YCBtZXRob2QuIFRoZSBgJGdldGAgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCB1c2luZw0KLSAqICAgICB7QGxpbmsgYXV0by4kaW5qZWN0b3IjaW52b2tlICRpbmplY3Rvci5pbnZva2UoKX0gd2hlbiBhbiBpbnN0YW5jZSBuZWVkcyB0byBiZSBjcmVhdGVkLg0KLSAqICAgLSBgQ29uc3RydWN0b3JgOiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgd2lsbCBiZSBjcmVhdGVkIHVzaW5nDQotICogICAgIHtAbGluayBhdXRvLiRpbmplY3RvciNpbnN0YW50aWF0ZSAkaW5qZWN0b3IuaW5zdGFudGlhdGUoKX0sIHRoZW4gdHJlYXRlZCBhcyBgb2JqZWN0YC4NCi0gKg0KLSAqIEByZXR1cm5zIHtPYmplY3R9IHJlZ2lzdGVyZWQgcHJvdmlkZXIgaW5zdGFuY2UNCi0NCi0gKiBAZXhhbXBsZQ0KLSAqDQotICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBjcmVhdGUgYSBzaW1wbGUgZXZlbnQgdHJhY2tpbmcgc2VydmljZSBhbmQgcmVnaXN0ZXIgaXQgdXNpbmcNCi0gKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNwcm92aWRlciAkcHJvdmlkZS5wcm92aWRlcigpfS4NCi0gKg0KLSAqIGBgYGpzDQotICogIC8vIERlZmluZSB0aGUgZXZlbnRUcmFja2VyIHByb3ZpZGVyDQotICogIGZ1bmN0aW9uIEV2ZW50VHJhY2tlclByb3ZpZGVyKCkgew0KLSAqICAgIHZhciB0cmFja2luZ1VybCA9ICcvdHJhY2snOw0KLSAqDQotICogICAgLy8gQSBwcm92aWRlciBtZXRob2QgZm9yIGNvbmZpZ3VyaW5nIHdoZXJlIHRoZSB0cmFja2VkIGV2ZW50cyBzaG91bGQgYmVlbiBzYXZlZA0KLSAqICAgIHRoaXMuc2V0VHJhY2tpbmdVcmwgPSBmdW5jdGlvbih1cmwpIHsNCi0gKiAgICAgIHRyYWNraW5nVXJsID0gdXJsOw0KLSAqICAgIH07DQotICoNCi0gKiAgICAvLyBUaGUgc2VydmljZSBmYWN0b3J5IGZ1bmN0aW9uDQotICogICAgdGhpcy4kZ2V0ID0gWyckaHR0cCcsIGZ1bmN0aW9uKCRodHRwKSB7DQotICogICAgICB2YXIgdHJhY2tlZEV2ZW50cyA9IHt9Ow0KLSAqICAgICAgcmV0dXJuIHsNCi0gKiAgICAgICAgLy8gQ2FsbCB0aGlzIHRvIHRyYWNrIGFuIGV2ZW50DQotICogICAgICAgIGV2ZW50OiBmdW5jdGlvbihldmVudCkgew0KLSAqICAgICAgICAgIHZhciBjb3VudCA9IHRyYWNrZWRFdmVudHNbZXZlbnRdIHx8IDA7DQotICogICAgICAgICAgY291bnQgKz0gMTsNCi0gKiAgICAgICAgICB0cmFja2VkRXZlbnRzW2V2ZW50XSA9IGNvdW50Ow0KLSAqICAgICAgICAgIHJldHVybiBjb3VudDsNCi0gKiAgICAgICAgfSwNCi0gKiAgICAgICAgLy8gQ2FsbCB0aGlzIHRvIHNhdmUgdGhlIHRyYWNrZWQgZXZlbnRzIHRvIHRoZSB0cmFja2luZ1VybA0KLSAqICAgICAgICBzYXZlOiBmdW5jdGlvbigpIHsNCi0gKiAgICAgICAgICAkaHR0cC5wb3N0KHRyYWNraW5nVXJsLCB0cmFja2VkRXZlbnRzKTsNCi0gKiAgICAgICAgfQ0KLSAqICAgICAgfTsNCi0gKiAgICB9XTsNCi0gKiAgfQ0KLSAqDQotICogIGRlc2NyaWJlKCdldmVudFRyYWNrZXInLCBmdW5jdGlvbigpIHsNCi0gKiAgICB2YXIgcG9zdFNweTsNCi0gKg0KLSAqICAgIGJlZm9yZUVhY2gobW9kdWxlKGZ1bmN0aW9uKCRwcm92aWRlKSB7DQotICogICAgICAvLyBSZWdpc3RlciB0aGUgZXZlbnRUcmFja2VyIHByb3ZpZGVyDQotICogICAgICAkcHJvdmlkZS5wcm92aWRlcignZXZlbnRUcmFja2VyJywgRXZlbnRUcmFja2VyUHJvdmlkZXIpOw0KLSAqICAgIH0pKTsNCi0gKg0KLSAqICAgIGJlZm9yZUVhY2gobW9kdWxlKGZ1bmN0aW9uKGV2ZW50VHJhY2tlclByb3ZpZGVyKSB7DQotICogICAgICAvLyBDb25maWd1cmUgZXZlbnRUcmFja2VyIHByb3ZpZGVyDQotICogICAgICBldmVudFRyYWNrZXJQcm92aWRlci5zZXRUcmFja2luZ1VybCgnL2N1c3RvbS10cmFjaycpOw0KLSAqICAgIH0pKTsNCi0gKg0KLSAqICAgIGl0KCd0cmFja3MgZXZlbnRzJywgaW5qZWN0KGZ1bmN0aW9uKGV2ZW50VHJhY2tlcikgew0KLSAqICAgICAgZXhwZWN0KGV2ZW50VHJhY2tlci5ldmVudCgnbG9naW4nKSkudG9FcXVhbCgxKTsNCi0gKiAgICAgIGV4cGVjdChldmVudFRyYWNrZXIuZXZlbnQoJ2xvZ2luJykpLnRvRXF1YWwoMik7DQotICogICAgfSkpOw0KLSAqDQotICogICAgaXQoJ3NhdmVzIHRvIHRoZSB0cmFja2luZyB1cmwnLCBpbmplY3QoZnVuY3Rpb24oZXZlbnRUcmFja2VyLCAkaHR0cCkgew0KLSAqICAgICAgcG9zdFNweSA9IHNweU9uKCRodHRwLCAncG9zdCcpOw0KLSAqICAgICAgZXZlbnRUcmFja2VyLmV2ZW50KCdsb2dpbicpOw0KLSAqICAgICAgZXZlbnRUcmFja2VyLnNhdmUoKTsNCi0gKiAgICAgIGV4cGVjdChwb3N0U3B5KS50b0hhdmVCZWVuQ2FsbGVkKCk7DQotICogICAgICBleHBlY3QocG9zdFNweS5tb3N0UmVjZW50Q2FsbC5hcmdzWzBdKS5ub3QudG9FcXVhbCgnL3RyYWNrJyk7DQotICogICAgICBleHBlY3QocG9zdFNweS5tb3N0UmVjZW50Q2FsbC5hcmdzWzBdKS50b0VxdWFsKCcvY3VzdG9tLXRyYWNrJyk7DQotICogICAgICBleHBlY3QocG9zdFNweS5tb3N0UmVjZW50Q2FsbC5hcmdzWzFdKS50b0VxdWFsKHsgJ2xvZ2luJzogMSB9KTsNCi0gKiAgICB9KSk7DQotICogIH0pOw0KLSAqIGBgYA0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBtZXRob2QNCi0gKiBAbmFtZSAkcHJvdmlkZSNmYWN0b3J5DQotICogQGRlc2NyaXB0aW9uDQotICoNCi0gKiBSZWdpc3RlciBhICoqc2VydmljZSBmYWN0b3J5KiosIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHRvIHJldHVybiB0aGUgc2VydmljZSBpbnN0YW5jZS4NCi0gKiBUaGlzIGlzIHNob3J0IGZvciByZWdpc3RlcmluZyBhIHNlcnZpY2Ugd2hlcmUgaXRzIHByb3ZpZGVyIGNvbnNpc3RzIG9mIG9ubHkgYSBgJGdldGAgcHJvcGVydHksDQotICogd2hpY2ggaXMgdGhlIGdpdmVuIHNlcnZpY2UgZmFjdG9yeSBmdW5jdGlvbi4NCi0gKiBZb3Ugc2hvdWxkIHVzZSB7QGxpbmsgYXV0by4kcHJvdmlkZSNmYWN0b3J5ICRwcm92aWRlLmZhY3RvcnkoZ2V0Rm4pfSBpZiB5b3UgZG8gbm90IG5lZWQgdG8NCi0gKiBjb25maWd1cmUgeW91ciBzZXJ2aWNlIGluIGEgcHJvdmlkZXIuDQotICoNCi0gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UuDQotICogQHBhcmFtIHtmdW5jdGlvbigpfSAkZ2V0Rm4gVGhlICRnZXRGbiBmb3IgdGhlIGluc3RhbmNlIGNyZWF0aW9uLiBJbnRlcm5hbGx5IHRoaXMgaXMgYSBzaG9ydCBoYW5kDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGAkcHJvdmlkZS5wcm92aWRlcihuYW1lLCB7JGdldDogJGdldEZufSlgLg0KLSAqIEByZXR1cm5zIHtPYmplY3R9IHJlZ2lzdGVyZWQgcHJvdmlkZXIgaW5zdGFuY2UNCi0gKg0KLSAqIEBleGFtcGxlDQotICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIHJlZ2lzdGVyaW5nIGEgc2VydmljZQ0KLSAqIGBgYGpzDQotICogICAkcHJvdmlkZS5mYWN0b3J5KCdwaW5nJywgWyckaHR0cCcsIGZ1bmN0aW9uKCRodHRwKSB7DQotICogICAgIHJldHVybiBmdW5jdGlvbiBwaW5nKCkgew0KLSAqICAgICAgIHJldHVybiAkaHR0cC5zZW5kKCcvcGluZycpOw0KLSAqICAgICB9Ow0KLSAqICAgfV0pOw0KLSAqIGBgYA0KLSAqIFlvdSB3b3VsZCB0aGVuIGluamVjdCBhbmQgdXNlIHRoaXMgc2VydmljZSBsaWtlIHRoaXM6DQotICogYGBganMNCi0gKiAgIHNvbWVNb2R1bGUuY29udHJvbGxlcignQ3RybCcsIFsncGluZycsIGZ1bmN0aW9uKHBpbmcpIHsNCi0gKiAgICAgcGluZygpOw0KLSAqICAgfV0pOw0KLSAqIGBgYA0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBtZXRob2QNCi0gKiBAbmFtZSAkcHJvdmlkZSNzZXJ2aWNlDQotICogQGRlc2NyaXB0aW9uDQotICoNCi0gKiBSZWdpc3RlciBhICoqc2VydmljZSBjb25zdHJ1Y3RvcioqLCB3aGljaCB3aWxsIGJlIGludm9rZWQgd2l0aCBgbmV3YCB0byBjcmVhdGUgdGhlIHNlcnZpY2UNCi0gKiBpbnN0YW5jZS4NCi0gKiBUaGlzIGlzIHNob3J0IGZvciByZWdpc3RlcmluZyBhIHNlcnZpY2Ugd2hlcmUgaXRzIHByb3ZpZGVyJ3MgYCRnZXRgIHByb3BlcnR5IGlzIHRoZSBzZXJ2aWNlDQotICogY29uc3RydWN0b3IgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIHNlcnZpY2UgaW5zdGFuY2UuDQotICoNCi0gKiBZb3Ugc2hvdWxkIHVzZSB7QGxpbmsgYXV0by4kcHJvdmlkZSNzZXJ2aWNlICRwcm92aWRlLnNlcnZpY2UoY2xhc3MpfSBpZiB5b3UgZGVmaW5lIHlvdXIgc2VydmljZQ0KLSAqIGFzIGEgdHlwZS9jbGFzcy4NCi0gKg0KLSAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZS4NCi0gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvciBBIGNsYXNzIChjb25zdHJ1Y3RvciBmdW5jdGlvbikgdGhhdCB3aWxsIGJlIGluc3RhbnRpYXRlZC4NCi0gKiBAcmV0dXJucyB7T2JqZWN0fSByZWdpc3RlcmVkIHByb3ZpZGVyIGluc3RhbmNlDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiByZWdpc3RlcmluZyBhIHNlcnZpY2UgdXNpbmcNCi0gKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNzZXJ2aWNlICRwcm92aWRlLnNlcnZpY2UoY2xhc3MpfS4NCi0gKiBgYGBqcw0KLSAqICAgdmFyIFBpbmcgPSBmdW5jdGlvbigkaHR0cCkgew0KLSAqICAgICB0aGlzLiRodHRwID0gJGh0dHA7DQotICogICB9Ow0KLSAqDQotICogICBQaW5nLiRpbmplY3QgPSBbJyRodHRwJ107DQotICoNCi0gKiAgIFBpbmcucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbigpIHsNCi0gKiAgICAgcmV0dXJuIHRoaXMuJGh0dHAuZ2V0KCcvcGluZycpOw0KLSAqICAgfTsNCi0gKiAgICRwcm92aWRlLnNlcnZpY2UoJ3BpbmcnLCBQaW5nKTsNCi0gKiBgYGANCi0gKiBZb3Ugd291bGQgdGhlbiBpbmplY3QgYW5kIHVzZSB0aGlzIHNlcnZpY2UgbGlrZSB0aGlzOg0KLSAqIGBgYGpzDQotICogICBzb21lTW9kdWxlLmNvbnRyb2xsZXIoJ0N0cmwnLCBbJ3BpbmcnLCBmdW5jdGlvbihwaW5nKSB7DQotICogICAgIHBpbmcuc2VuZCgpOw0KLSAqICAgfV0pOw0KLSAqIGBgYA0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBtZXRob2QNCi0gKiBAbmFtZSAkcHJvdmlkZSN2YWx1ZQ0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqDQotICogUmVnaXN0ZXIgYSAqKnZhbHVlIHNlcnZpY2UqKiB3aXRoIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfSwgc3VjaCBhcyBhIHN0cmluZywgYQ0KLSAqIG51bWJlciwgYW4gYXJyYXksIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLiAgVGhpcyBpcyBzaG9ydCBmb3IgcmVnaXN0ZXJpbmcgYSBzZXJ2aWNlIHdoZXJlIGl0cw0KLSAqIHByb3ZpZGVyJ3MgYCRnZXRgIHByb3BlcnR5IGlzIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgKip2YWx1ZQ0KLSAqIHNlcnZpY2UqKi4NCi0gKg0KLSAqIFZhbHVlIHNlcnZpY2VzIGFyZSBzaW1pbGFyIHRvIGNvbnN0YW50IHNlcnZpY2VzLCBleGNlcHQgdGhhdCB0aGV5IGNhbm5vdCBiZSBpbmplY3RlZCBpbnRvIGENCi0gKiBtb2R1bGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAoc2VlIHtAbGluayBhbmd1bGFyLk1vZHVsZSNjb25maWd9KSBidXQgdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBieQ0KLSAqIGFuIEFuZ3VsYXINCi0gKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNkZWNvcmF0b3IgZGVjb3JhdG9yfS4NCi0gKg0KLSAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZS4NCi0gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZS4NCi0gKiBAcmV0dXJucyB7T2JqZWN0fSByZWdpc3RlcmVkIHByb3ZpZGVyIGluc3RhbmNlDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAqIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgY3JlYXRpbmcgdmFsdWUgc2VydmljZXMuDQotICogYGBganMNCi0gKiAgICRwcm92aWRlLnZhbHVlKCdBRE1JTl9VU0VSJywgJ2FkbWluJyk7DQotICoNCi0gKiAgICRwcm92aWRlLnZhbHVlKCdSb2xlTG9va3VwJywgeyBhZG1pbjogMCwgd3JpdGVyOiAxLCByZWFkZXI6IDIgfSk7DQotICoNCi0gKiAgICRwcm92aWRlLnZhbHVlKCdoYWxmT2YnLCBmdW5jdGlvbih2YWx1ZSkgew0KLSAqICAgICByZXR1cm4gdmFsdWUgLyAyOw0KLSAqICAgfSk7DQotICogYGBgDQotICovDQotDQotDQotLyoqDQotICogQG5nZG9jIG1ldGhvZA0KLSAqIEBuYW1lICRwcm92aWRlI2NvbnN0YW50DQotICogQGRlc2NyaXB0aW9uDQotICoNCi0gKiBSZWdpc3RlciBhICoqY29uc3RhbnQgc2VydmljZSoqLCBzdWNoIGFzIGEgc3RyaW5nLCBhIG51bWJlciwgYW4gYXJyYXksIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLA0KLSAqIHdpdGggdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LiBVbmxpa2Uge0BsaW5rIGF1dG8uJHByb3ZpZGUjdmFsdWUgdmFsdWV9IGl0IGNhbiBiZQ0KLSAqIGluamVjdGVkIGludG8gYSBtb2R1bGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAoc2VlIHtAbGluayBhbmd1bGFyLk1vZHVsZSNjb25maWd9KSBhbmQgaXQgY2Fubm90DQotICogYmUgb3ZlcnJpZGRlbiBieSBhbiBBbmd1bGFyIHtAbGluayBhdXRvLiRwcm92aWRlI2RlY29yYXRvciBkZWNvcmF0b3J9Lg0KLSAqDQotICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50Lg0KLSAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIGNvbnN0YW50IHZhbHVlLg0KLSAqIEByZXR1cm5zIHtPYmplY3R9IHJlZ2lzdGVyZWQgaW5zdGFuY2UNCi0gKg0KLSAqIEBleGFtcGxlDQotICogSGVyZSBhIHNvbWUgZXhhbXBsZXMgb2YgY3JlYXRpbmcgY29uc3RhbnRzOg0KLSAqIGBgYGpzDQotICogICAkcHJvdmlkZS5jb25zdGFudCgnU0hBUkRfSEVJR0hUJywgMzA2KTsNCi0gKg0KLSAqICAgJHByb3ZpZGUuY29uc3RhbnQoJ01ZX0NPTE9VUlMnLCBbJ3JlZCcsICdibHVlJywgJ2dyZXknXSk7DQotICoNCi0gKiAgICRwcm92aWRlLmNvbnN0YW50KCdkb3VibGUnLCBmdW5jdGlvbih2YWx1ZSkgew0KLSAqICAgICByZXR1cm4gdmFsdWUgKiAyOw0KLSAqICAgfSk7DQotICogYGBgDQotICovDQotDQotDQotLyoqDQotICogQG5nZG9jIG1ldGhvZA0KLSAqIEBuYW1lICRwcm92aWRlI2RlY29yYXRvcg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqDQotICogUmVnaXN0ZXIgYSAqKnNlcnZpY2UgZGVjb3JhdG9yKiogd2l0aCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uIEEgc2VydmljZSBkZWNvcmF0b3INCi0gKiBpbnRlcmNlcHRzIHRoZSBjcmVhdGlvbiBvZiBhIHNlcnZpY2UsIGFsbG93aW5nIGl0IHRvIG92ZXJyaWRlIG9yIG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZQ0KLSAqIHNlcnZpY2UuIFRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIGRlY29yYXRvciBtYXkgYmUgdGhlIG9yaWdpbmFsIHNlcnZpY2UsIG9yIGEgbmV3IHNlcnZpY2UNCi0gKiBvYmplY3Qgd2hpY2ggcmVwbGFjZXMgb3Igd3JhcHMgYW5kIGRlbGVnYXRlcyB0byB0aGUgb3JpZ2luYWwgc2VydmljZS4NCi0gKg0KLSAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGRlY29yYXRlLg0KLSAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gZGVjb3JhdG9yIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHNlcnZpY2UgbmVlZHMgdG8gYmUNCi0gKiAgICBpbnN0YW50aWF0ZWQgYW5kIHNob3VsZCByZXR1cm4gdGhlIGRlY29yYXRlZCBzZXJ2aWNlIGluc3RhbmNlLiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHVzaW5nDQotICogICAgdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciNpbnZva2UgaW5qZWN0b3IuaW52b2tlfSBtZXRob2QgYW5kIGlzIHRoZXJlZm9yZSBmdWxseSBpbmplY3RhYmxlLg0KLSAqICAgIExvY2FsIGluamVjdGlvbiBhcmd1bWVudHM6DQotICoNCi0gKiAgICAqIGAkZGVsZWdhdGVgIC0gVGhlIG9yaWdpbmFsIHNlcnZpY2UgaW5zdGFuY2UsIHdoaWNoIGNhbiBiZSBtb25rZXkgcGF0Y2hlZCwgY29uZmlndXJlZCwNCi0gKiAgICAgIGRlY29yYXRlZCBvciBkZWxlZ2F0ZWQgdG8uDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAqIEhlcmUgd2UgZGVjb3JhdGUgdGhlIHtAbGluayBuZy4kbG9nICRsb2d9IHNlcnZpY2UgdG8gY29udmVydCB3YXJuaW5ncyB0byBlcnJvcnMgYnkgaW50ZXJjZXB0aW5nDQotICogY2FsbHMgdG8ge0BsaW5rIG5nLiRsb2cjZXJyb3IgJGxvZy53YXJuKCl9Lg0KLSAqIGBgYGpzDQotICogICAkcHJvdmlkZS5kZWNvcmF0b3IoJyRsb2cnLCBbJyRkZWxlZ2F0ZScsIGZ1bmN0aW9uKCRkZWxlZ2F0ZSkgew0KLSAqICAgICAkZGVsZWdhdGUud2FybiA9ICRkZWxlZ2F0ZS5lcnJvcjsNCi0gKiAgICAgcmV0dXJuICRkZWxlZ2F0ZTsNCi0gKiAgIH1dKTsNCi0gKiBgYGANCi0gKi8NCi0NCi0NCi1mdW5jdGlvbiBjcmVhdGVJbmplY3Rvcihtb2R1bGVzVG9Mb2FkLCBzdHJpY3REaSkgew0KLSAgc3RyaWN0RGkgPSAoc3RyaWN0RGkgPT09IHRydWUpOw0KLSAgdmFyIElOU1RBTlRJQVRJTkcgPSB7fSwNCi0gICAgICBwcm92aWRlclN1ZmZpeCA9ICdQcm92aWRlcicsDQotICAgICAgcGF0aCA9IFtdLA0KLSAgICAgIGxvYWRlZE1vZHVsZXMgPSBuZXcgSGFzaE1hcChbXSwgdHJ1ZSksDQotICAgICAgcHJvdmlkZXJDYWNoZSA9IHsNCi0gICAgICAgICRwcm92aWRlOiB7DQotICAgICAgICAgICAgcHJvdmlkZXI6IHN1cHBvcnRPYmplY3QocHJvdmlkZXIpLA0KLSAgICAgICAgICAgIGZhY3Rvcnk6IHN1cHBvcnRPYmplY3QoZmFjdG9yeSksDQotICAgICAgICAgICAgc2VydmljZTogc3VwcG9ydE9iamVjdChzZXJ2aWNlKSwNCi0gICAgICAgICAgICB2YWx1ZTogc3VwcG9ydE9iamVjdCh2YWx1ZSksDQotICAgICAgICAgICAgY29uc3RhbnQ6IHN1cHBvcnRPYmplY3QoY29uc3RhbnQpLA0KLSAgICAgICAgICAgIGRlY29yYXRvcjogZGVjb3JhdG9yDQotICAgICAgICAgIH0NCi0gICAgICB9LA0KLSAgICAgIHByb3ZpZGVySW5qZWN0b3IgPSAocHJvdmlkZXJDYWNoZS4kaW5qZWN0b3IgPQ0KLSAgICAgICAgICBjcmVhdGVJbnRlcm5hbEluamVjdG9yKHByb3ZpZGVyQ2FjaGUsIGZ1bmN0aW9uKHNlcnZpY2VOYW1lLCBjYWxsZXIpIHsNCi0gICAgICAgICAgICBpZiAoYW5ndWxhci5pc1N0cmluZyhjYWxsZXIpKSB7DQotICAgICAgICAgICAgICBwYXRoLnB1c2goY2FsbGVyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCd1bnByJywgIlVua25vd24gcHJvdmlkZXI6IHswfSIsIHBhdGguam9pbignIDwtICcpKTsNCi0gICAgICAgICAgfSkpLA0KLSAgICAgIGluc3RhbmNlQ2FjaGUgPSB7fSwNCi0gICAgICBpbnN0YW5jZUluamVjdG9yID0gKGluc3RhbmNlQ2FjaGUuJGluamVjdG9yID0NCi0gICAgICAgICAgY3JlYXRlSW50ZXJuYWxJbmplY3RvcihpbnN0YW5jZUNhY2hlLCBmdW5jdGlvbihzZXJ2aWNlTmFtZSwgY2FsbGVyKSB7DQotICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gcHJvdmlkZXJJbmplY3Rvci5nZXQoc2VydmljZU5hbWUgKyBwcm92aWRlclN1ZmZpeCwgY2FsbGVyKTsNCi0gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VJbmplY3Rvci5pbnZva2UocHJvdmlkZXIuJGdldCwgcHJvdmlkZXIsIHVuZGVmaW5lZCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgICB9KSk7DQotDQotDQotICBmb3JFYWNoKGxvYWRNb2R1bGVzKG1vZHVsZXNUb0xvYWQpLCBmdW5jdGlvbihmbikgeyBpbnN0YW5jZUluamVjdG9yLmludm9rZShmbiB8fCBub29wKTsgfSk7DQotDQotICByZXR1cm4gaW5zdGFuY2VJbmplY3RvcjsNCi0NCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLSAgLy8gJHByb3ZpZGVyDQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi0gIGZ1bmN0aW9uIHN1cHBvcnRPYmplY3QoZGVsZWdhdGUpIHsNCi0gICAgcmV0dXJuIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsNCi0gICAgICBpZiAoaXNPYmplY3Qoa2V5KSkgew0KLSAgICAgICAgZm9yRWFjaChrZXksIHJldmVyc2VQYXJhbXMoZGVsZWdhdGUpKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlKGtleSwgdmFsdWUpOw0KLSAgICAgIH0NCi0gICAgfTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHByb3ZpZGVyKG5hbWUsIHByb3ZpZGVyXykgew0KLSAgICBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eShuYW1lLCAnc2VydmljZScpOw0KLSAgICBpZiAoaXNGdW5jdGlvbihwcm92aWRlcl8pIHx8IGlzQXJyYXkocHJvdmlkZXJfKSkgew0KLSAgICAgIHByb3ZpZGVyXyA9IHByb3ZpZGVySW5qZWN0b3IuaW5zdGFudGlhdGUocHJvdmlkZXJfKTsNCi0gICAgfQ0KLSAgICBpZiAoIXByb3ZpZGVyXy4kZ2V0KSB7DQotICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCdwZ2V0JywgIlByb3ZpZGVyICd7MH0nIG11c3QgZGVmaW5lICRnZXQgZmFjdG9yeSBtZXRob2QuIiwgbmFtZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHByb3ZpZGVyQ2FjaGVbbmFtZSArIHByb3ZpZGVyU3VmZml4XSA9IHByb3ZpZGVyXzsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGVuZm9yY2VSZXR1cm5WYWx1ZShuYW1lLCBmYWN0b3J5KSB7DQotICAgIHJldHVybiBmdW5jdGlvbiBlbmZvcmNlZFJldHVyblZhbHVlKCkgew0KLSAgICAgIHZhciByZXN1bHQgPSBpbnN0YW5jZUluamVjdG9yLmludm9rZShmYWN0b3J5LCB0aGlzKTsNCi0gICAgICBpZiAoaXNVbmRlZmluZWQocmVzdWx0KSkgew0KLSAgICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCd1bmRlZicsICJQcm92aWRlciAnezB9JyBtdXN0IHJldHVybiBhIHZhbHVlIGZyb20gJGdldCBmYWN0b3J5IG1ldGhvZC4iLCBuYW1lKTsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGZhY3RvcnkobmFtZSwgZmFjdG9yeUZuLCBlbmZvcmNlKSB7DQotICAgIHJldHVybiBwcm92aWRlcihuYW1lLCB7DQotICAgICAgJGdldDogZW5mb3JjZSAhPT0gZmFsc2UgPyBlbmZvcmNlUmV0dXJuVmFsdWUobmFtZSwgZmFjdG9yeUZuKSA6IGZhY3RvcnlGbg0KLSAgICB9KTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNlcnZpY2UobmFtZSwgY29uc3RydWN0b3IpIHsNCi0gICAgcmV0dXJuIGZhY3RvcnkobmFtZSwgWyckaW5qZWN0b3InLCBmdW5jdGlvbigkaW5qZWN0b3IpIHsNCi0gICAgICByZXR1cm4gJGluamVjdG9yLmluc3RhbnRpYXRlKGNvbnN0cnVjdG9yKTsNCi0gICAgfV0pOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gdmFsdWUobmFtZSwgdmFsKSB7IHJldHVybiBmYWN0b3J5KG5hbWUsIHZhbHVlRm4odmFsKSwgZmFsc2UpOyB9DQotDQotICBmdW5jdGlvbiBjb25zdGFudChuYW1lLCB2YWx1ZSkgew0KLSAgICBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eShuYW1lLCAnY29uc3RhbnQnKTsNCi0gICAgcHJvdmlkZXJDYWNoZVtuYW1lXSA9IHZhbHVlOw0KLSAgICBpbnN0YW5jZUNhY2hlW25hbWVdID0gdmFsdWU7DQotICB9DQotDQotICBmdW5jdGlvbiBkZWNvcmF0b3Ioc2VydmljZU5hbWUsIGRlY29yRm4pIHsNCi0gICAgdmFyIG9yaWdQcm92aWRlciA9IHByb3ZpZGVySW5qZWN0b3IuZ2V0KHNlcnZpY2VOYW1lICsgcHJvdmlkZXJTdWZmaXgpLA0KLSAgICAgICAgb3JpZyRnZXQgPSBvcmlnUHJvdmlkZXIuJGdldDsNCi0NCi0gICAgb3JpZ1Byb3ZpZGVyLiRnZXQgPSBmdW5jdGlvbigpIHsNCi0gICAgICB2YXIgb3JpZ0luc3RhbmNlID0gaW5zdGFuY2VJbmplY3Rvci5pbnZva2Uob3JpZyRnZXQsIG9yaWdQcm92aWRlcik7DQotICAgICAgcmV0dXJuIGluc3RhbmNlSW5qZWN0b3IuaW52b2tlKGRlY29yRm4sIG51bGwsIHskZGVsZWdhdGU6IG9yaWdJbnN0YW5jZX0pOw0KLSAgICB9Ow0KLSAgfQ0KLQ0KLSAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotICAvLyBNb2R1bGUgTG9hZGluZw0KLSAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotICBmdW5jdGlvbiBsb2FkTW9kdWxlcyhtb2R1bGVzVG9Mb2FkKSB7DQotICAgIHZhciBydW5CbG9ja3MgPSBbXSwgbW9kdWxlRm47DQotICAgIGZvckVhY2gobW9kdWxlc1RvTG9hZCwgZnVuY3Rpb24obW9kdWxlKSB7DQotICAgICAgaWYgKGxvYWRlZE1vZHVsZXMuZ2V0KG1vZHVsZSkpIHJldHVybjsNCi0gICAgICBsb2FkZWRNb2R1bGVzLnB1dChtb2R1bGUsIHRydWUpOw0KLQ0KLSAgICAgIGZ1bmN0aW9uIHJ1bkludm9rZVF1ZXVlKHF1ZXVlKSB7DQotICAgICAgICB2YXIgaSwgaWk7DQotICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHF1ZXVlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsNCi0gICAgICAgICAgdmFyIGludm9rZUFyZ3MgPSBxdWV1ZVtpXSwNCi0gICAgICAgICAgICAgIHByb3ZpZGVyID0gcHJvdmlkZXJJbmplY3Rvci5nZXQoaW52b2tlQXJnc1swXSk7DQotDQotICAgICAgICAgIHByb3ZpZGVyW2ludm9rZUFyZ3NbMV1dLmFwcGx5KHByb3ZpZGVyLCBpbnZva2VBcmdzWzJdKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotICAgICAgdHJ5IHsNCi0gICAgICAgIGlmIChpc1N0cmluZyhtb2R1bGUpKSB7DQotICAgICAgICAgIG1vZHVsZUZuID0gYW5ndWxhck1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgICBydW5CbG9ja3MgPSBydW5CbG9ja3MuY29uY2F0KGxvYWRNb2R1bGVzKG1vZHVsZUZuLnJlcXVpcmVzKSkuY29uY2F0KG1vZHVsZUZuLl9ydW5CbG9ja3MpOw0KLSAgICAgICAgICBydW5JbnZva2VRdWV1ZShtb2R1bGVGbi5faW52b2tlUXVldWUpOw0KLSAgICAgICAgICBydW5JbnZva2VRdWV1ZShtb2R1bGVGbi5fY29uZmlnQmxvY2tzKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihtb2R1bGUpKSB7DQotICAgICAgICAgICAgcnVuQmxvY2tzLnB1c2gocHJvdmlkZXJJbmplY3Rvci5pbnZva2UobW9kdWxlKSk7DQotICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkobW9kdWxlKSkgew0KLSAgICAgICAgICAgIHJ1bkJsb2Nrcy5wdXNoKHByb3ZpZGVySW5qZWN0b3IuaW52b2tlKG1vZHVsZSkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgYXNzZXJ0QXJnRm4obW9kdWxlLCAnbW9kdWxlJyk7DQotICAgICAgICB9DQotICAgICAgfSBjYXRjaCAoZSkgew0KLSAgICAgICAgaWYgKGlzQXJyYXkobW9kdWxlKSkgew0KLSAgICAgICAgICBtb2R1bGUgPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGUubWVzc2FnZSAmJiBlLnN0YWNrICYmIGUuc3RhY2suaW5kZXhPZihlLm1lc3NhZ2UpID09IC0xKSB7DQotICAgICAgICAgIC8vIFNhZmFyaSAmIEZGJ3Mgc3RhY2sgdHJhY2VzIGRvbid0IGNvbnRhaW4gZXJyb3IubWVzc2FnZSBjb250ZW50DQotICAgICAgICAgIC8vIHVubGlrZSB0aG9zZSBvZiBDaHJvbWUgYW5kIElFDQotICAgICAgICAgIC8vIFNvIGlmIHN0YWNrIGRvZXNuJ3QgY29udGFpbiBtZXNzYWdlLCB3ZSBjcmVhdGUgYSBuZXcgc3RyaW5nIHRoYXQgY29udGFpbnMgYm90aC4NCi0gICAgICAgICAgLy8gU2luY2UgZXJyb3Iuc3RhY2sgaXMgcmVhZC1vbmx5IGluIFNhZmFyaSwgSSdtIG92ZXJyaWRpbmcgZSBhbmQgbm90IGUuc3RhY2sgaGVyZS4NCi0gICAgICAgICAgLyoganNoaW50IC1XMDIyICovDQotICAgICAgICAgIGUgPSBlLm1lc3NhZ2UgKyAnXG4nICsgZS5zdGFjazsNCi0gICAgICAgIH0NCi0gICAgICAgIHRocm93ICRpbmplY3Rvck1pbkVycignbW9kdWxlcnInLCAiRmFpbGVkIHRvIGluc3RhbnRpYXRlIG1vZHVsZSB7MH0gZHVlIHRvOlxuezF9IiwNCi0gICAgICAgICAgICAgICAgICBtb2R1bGUsIGUuc3RhY2sgfHwgZS5tZXNzYWdlIHx8IGUpOw0KLSAgICAgIH0NCi0gICAgfSk7DQotICAgIHJldHVybiBydW5CbG9ja3M7DQotICB9DQotDQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0gIC8vIGludGVybmFsIEluamVjdG9yDQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi0gIGZ1bmN0aW9uIGNyZWF0ZUludGVybmFsSW5qZWN0b3IoY2FjaGUsIGZhY3RvcnkpIHsNCi0NCi0gICAgZnVuY3Rpb24gZ2V0U2VydmljZShzZXJ2aWNlTmFtZSwgY2FsbGVyKSB7DQotICAgICAgaWYgKGNhY2hlLmhhc093blByb3BlcnR5KHNlcnZpY2VOYW1lKSkgew0KLSAgICAgICAgaWYgKGNhY2hlW3NlcnZpY2VOYW1lXSA9PT0gSU5TVEFOVElBVElORykgew0KLSAgICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ2NkZXAnLCAnQ2lyY3VsYXIgZGVwZW5kZW5jeSBmb3VuZDogezB9JywNCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lICsgJyA8LSAnICsgcGF0aC5qb2luKCcgPC0gJykpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNhY2hlW3NlcnZpY2VOYW1lXTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgcGF0aC51bnNoaWZ0KHNlcnZpY2VOYW1lKTsNCi0gICAgICAgICAgY2FjaGVbc2VydmljZU5hbWVdID0gSU5TVEFOVElBVElORzsNCi0gICAgICAgICAgcmV0dXJuIGNhY2hlW3NlcnZpY2VOYW1lXSA9IGZhY3Rvcnkoc2VydmljZU5hbWUsIGNhbGxlcik7DQotICAgICAgICB9IGNhdGNoIChlcnIpIHsNCi0gICAgICAgICAgaWYgKGNhY2hlW3NlcnZpY2VOYW1lXSA9PT0gSU5TVEFOVElBVElORykgew0KLSAgICAgICAgICAgIGRlbGV0ZSBjYWNoZVtzZXJ2aWNlTmFtZV07DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgZXJyOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgcGF0aC5zaGlmdCgpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBpbnZva2UoZm4sIHNlbGYsIGxvY2Fscywgc2VydmljZU5hbWUpIHsNCi0gICAgICBpZiAodHlwZW9mIGxvY2FscyA9PT0gJ3N0cmluZycpIHsNCi0gICAgICAgIHNlcnZpY2VOYW1lID0gbG9jYWxzOw0KLSAgICAgICAgbG9jYWxzID0gbnVsbDsNCi0gICAgICB9DQotDQotICAgICAgdmFyIGFyZ3MgPSBbXSwNCi0gICAgICAgICAgJGluamVjdCA9IGFubm90YXRlKGZuLCBzdHJpY3REaSwgc2VydmljZU5hbWUpLA0KLSAgICAgICAgICBsZW5ndGgsIGksDQotICAgICAgICAgIGtleTsNCi0NCi0gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSAkaW5qZWN0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotICAgICAgICBrZXkgPSAkaW5qZWN0W2ldOw0KLSAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7DQotICAgICAgICAgIHRocm93ICRpbmplY3Rvck1pbkVycignaXRrbicsDQotICAgICAgICAgICAgICAgICAgJ0luY29ycmVjdCBpbmplY3Rpb24gdG9rZW4hIEV4cGVjdGVkIHNlcnZpY2UgbmFtZSBhcyBzdHJpbmcsIGdvdCB7MH0nLCBrZXkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYXJncy5wdXNoKA0KLSAgICAgICAgICBsb2NhbHMgJiYgbG9jYWxzLmhhc093blByb3BlcnR5KGtleSkNCi0gICAgICAgICAgPyBsb2NhbHNba2V5XQ0KLSAgICAgICAgICA6IGdldFNlcnZpY2Uoa2V5LCBzZXJ2aWNlTmFtZSkNCi0gICAgICAgICk7DQotICAgICAgfQ0KLSAgICAgIGlmIChpc0FycmF5KGZuKSkgew0KLSAgICAgICAgZm4gPSBmbltsZW5ndGhdOw0KLSAgICAgIH0NCi0NCi0gICAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9hbmd1bGFyanMtaW52b2tlLWFwcGx5LXZzLXN3aXRjaA0KLSAgICAgIC8vICM1Mzg4DQotICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGYsIGFyZ3MpOw0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlKFR5cGUsIGxvY2Fscywgc2VydmljZU5hbWUpIHsNCi0gICAgICAvLyBDaGVjayBpZiBUeXBlIGlzIGFubm90YXRlZCBhbmQgdXNlIGp1c3QgdGhlIGdpdmVuIGZ1bmN0aW9uIGF0IG4tMSBhcyBwYXJhbWV0ZXINCi0gICAgICAvLyBlLmcuIHNvbWVNb2R1bGUuZmFjdG9yeSgnZ3JlZXRlcicsIFsnJHdpbmRvdycsIGZ1bmN0aW9uKHJlbmFtZWQkd2luZG93KSB7fV0pOw0KLSAgICAgIC8vIE9iamVjdCBjcmVhdGlvbjogaHR0cDovL2pzcGVyZi5jb20vY3JlYXRlLWNvbnN0cnVjdG9yLzINCi0gICAgICB2YXIgaW5zdGFuY2UgPSBPYmplY3QuY3JlYXRlKChpc0FycmF5KFR5cGUpID8gVHlwZVtUeXBlLmxlbmd0aCAtIDFdIDogVHlwZSkucHJvdG90eXBlKTsNCi0gICAgICB2YXIgcmV0dXJuZWRWYWx1ZSA9IGludm9rZShUeXBlLCBpbnN0YW5jZSwgbG9jYWxzLCBzZXJ2aWNlTmFtZSk7DQotDQotICAgICAgcmV0dXJuIGlzT2JqZWN0KHJldHVybmVkVmFsdWUpIHx8IGlzRnVuY3Rpb24ocmV0dXJuZWRWYWx1ZSkgPyByZXR1cm5lZFZhbHVlIDogaW5zdGFuY2U7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIHsNCi0gICAgICBpbnZva2U6IGludm9rZSwNCi0gICAgICBpbnN0YW50aWF0ZTogaW5zdGFudGlhdGUsDQotICAgICAgZ2V0OiBnZXRTZXJ2aWNlLA0KLSAgICAgIGFubm90YXRlOiBhbm5vdGF0ZSwNCi0gICAgICBoYXM6IGZ1bmN0aW9uKG5hbWUpIHsNCi0gICAgICAgIHJldHVybiBwcm92aWRlckNhY2hlLmhhc093blByb3BlcnR5KG5hbWUgKyBwcm92aWRlclN1ZmZpeCkgfHwgY2FjaGUuaGFzT3duUHJvcGVydHkobmFtZSk7DQotICAgICAgfQ0KLSAgICB9Ow0KLSAgfQ0KLX0NCi0NCi1jcmVhdGVJbmplY3Rvci4kJGFubm90YXRlID0gYW5ub3RhdGU7DQotDQotLyoqDQotICogQG5nZG9jIHByb3ZpZGVyDQotICogQG5hbWUgJGFuY2hvclNjcm9sbFByb3ZpZGVyDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBVc2UgYCRhbmNob3JTY3JvbGxQcm92aWRlcmAgdG8gZGlzYWJsZSBhdXRvbWF0aWMgc2Nyb2xsaW5nIHdoZW5ldmVyDQotICoge0BsaW5rIG5nLiRsb2NhdGlvbiNoYXNoICRsb2NhdGlvbi5oYXNoKCl9IGNoYW5nZXMuDQotICovDQotZnVuY3Rpb24gJEFuY2hvclNjcm9sbFByb3ZpZGVyKCkgew0KLQ0KLSAgdmFyIGF1dG9TY3JvbGxpbmdFbmFibGVkID0gdHJ1ZTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJGFuY2hvclNjcm9sbFByb3ZpZGVyI2Rpc2FibGVBdXRvU2Nyb2xsaW5nDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBCeSBkZWZhdWx0LCB7QGxpbmsgbmcuJGFuY2hvclNjcm9sbCAkYW5jaG9yU2Nyb2xsKCl9IHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgY2hhbmdlcyB0bw0KLSAgICoge0BsaW5rIG5nLiRsb2NhdGlvbiNoYXNoICRsb2NhdGlvbi5oYXNoKCl9IGFuZCBzY3JvbGwgdG8gdGhlIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIG5ldyBoYXNoLjxiciAvPg0KLSAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGRpc2FibGUgYXV0b21hdGljIHNjcm9sbGluZy4NCi0gICAqDQotICAgKiBJZiBhdXRvbWF0aWMgc2Nyb2xsaW5nIGlzIGRpc2FibGVkLCBvbmUgbXVzdCBleHBsaWNpdGx5IGNhbGwNCi0gICAqIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsICRhbmNob3JTY3JvbGwoKX0gaW4gb3JkZXIgdG8gc2Nyb2xsIHRvIHRoZSBlbGVtZW50IHJlbGF0ZWQgdG8gdGhlDQotICAgKiBjdXJyZW50IGhhc2guDQotICAgKi8NCi0gIHRoaXMuZGlzYWJsZUF1dG9TY3JvbGxpbmcgPSBmdW5jdGlvbigpIHsNCi0gICAgYXV0b1Njcm9sbGluZ0VuYWJsZWQgPSBmYWxzZTsNCi0gIH07DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBzZXJ2aWNlDQotICAgKiBAbmFtZSAkYW5jaG9yU2Nyb2xsDQotICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICogQHJlcXVpcmVzICR3aW5kb3cNCi0gICAqIEByZXF1aXJlcyAkbG9jYXRpb24NCi0gICAqIEByZXF1aXJlcyAkcm9vdFNjb3BlDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBXaGVuIGNhbGxlZCwgaXQgY2hlY2tzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHtAbGluayBuZy4kbG9jYXRpb24jaGFzaCAkbG9jYXRpb24uaGFzaCgpfSBhbmQNCi0gICAqIHNjcm9sbHMgdG8gdGhlIHJlbGF0ZWQgZWxlbWVudCwgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gdGhlDQotICAgKiBbSHRtbDUgc3BlY10oaHR0cDovL2Rldi53My5vcmcvaHRtbDUvc3BlYy9PdmVydmlldy5odG1sI3RoZS1pbmRpY2F0ZWQtcGFydC1vZi10aGUtZG9jdW1lbnQpLg0KLSAgICoNCi0gICAqIEl0IGFsc28gd2F0Y2hlcyB0aGUge0BsaW5rIG5nLiRsb2NhdGlvbiNoYXNoICRsb2NhdGlvbi5oYXNoKCl9IGFuZCBhdXRvbWF0aWNhbGx5IHNjcm9sbHMgdG8NCi0gICAqIG1hdGNoIGFueSBhbmNob3Igd2hlbmV2ZXIgaXQgY2hhbmdlcy4gVGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgY2FsbGluZw0KLSAgICoge0BsaW5rIG5nLiRhbmNob3JTY3JvbGxQcm92aWRlciNkaXNhYmxlQXV0b1Njcm9sbGluZyAkYW5jaG9yU2Nyb2xsUHJvdmlkZXIuZGlzYWJsZUF1dG9TY3JvbGxpbmcoKX0uDQotICAgKg0KLSAgICogQWRkaXRpb25hbGx5LCB5b3UgY2FuIHVzZSBpdHMge0BsaW5rIG5nLiRhbmNob3JTY3JvbGwjeU9mZnNldCB5T2Zmc2V0fSBwcm9wZXJ0eSB0byBzcGVjaWZ5IGENCi0gICAqIHZlcnRpY2FsIHNjcm9sbC1vZmZzZXQgKGVpdGhlciBmaXhlZCBvciBkeW5hbWljKS4NCi0gICAqDQotICAgKiBAcHJvcGVydHkgeyhudW1iZXJ8ZnVuY3Rpb258anFMaXRlKX0geU9mZnNldA0KLSAgICogSWYgc2V0LCBzcGVjaWZpZXMgYSB2ZXJ0aWNhbCBzY3JvbGwtb2Zmc2V0LiBUaGlzIGlzIG9mdGVuIHVzZWZ1bCB3aGVuIHRoZXJlIGFyZSBmaXhlZA0KLSAgICogcG9zaXRpb25lZCBlbGVtZW50cyBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlLCBzdWNoIGFzIG5hdmJhcnMsIGhlYWRlcnMgZXRjLg0KLSAgICoNCi0gICAqIGB5T2Zmc2V0YCBjYW4gYmUgc3BlY2lmaWVkIGluIHZhcmlvdXMgd2F5czoNCi0gICAqIC0gKipudW1iZXIqKjogQSBmaXhlZCBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIHVzZWQgYXMgb2Zmc2V0LjxiciAvPjxiciAvPg0KLSAgICogLSAqKmZ1bmN0aW9uKio6IEEgZ2V0dGVyIGZ1bmN0aW9uIGNhbGxlZCBldmVyeXRpbWUgYCRhbmNob3JTY3JvbGwoKWAgaXMgZXhlY3V0ZWQuIE11c3QgcmV0dXJuDQotICAgKiAgIGEgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgb2Zmc2V0IChpbiBwaXhlbHMpLjxiciAvPjxiciAvPg0KLSAgICogLSAqKmpxTGl0ZSoqOiBBIGpxTGl0ZS9qUXVlcnkgZWxlbWVudCB0byBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBvZmZzZXQuIFRoZSBkaXN0YW5jZSBmcm9tDQotICAgKiAgIHRoZSB0b3Agb2YgdGhlIHBhZ2UgdG8gdGhlIGVsZW1lbnQncyBib3R0b20gd2lsbCBiZSB1c2VkIGFzIG9mZnNldC48YnIgLz4NCi0gICAqICAgKipOb3RlKio6IFRoZSBlbGVtZW50IHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IG9ubHkgYXMgbG9uZyBhcyBpdHMgYHBvc2l0aW9uYCBpcyBzZXQgdG8NCi0gICAqICAgYGZpeGVkYC4gVGhpcyBvcHRpb24gaXMgdXNlZnVsLCB3aGVuIGRlYWxpbmcgd2l0aCByZXNwb25zaXZlIG5hdmJhcnMvaGVhZGVycyB0aGF0IGFkanVzdA0KLSAgICogICB0aGVpciBoZWlnaHQgYW5kL29yIHBvc2l0aW9uaW5nIGFjY29yZGluZyB0byB0aGUgdmlld3BvcnQncyBzaXplLg0KLSAgICoNCi0gICAqIDxiciAvPg0KLSAgICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+DQotICAgKiBJbiBvcmRlciBmb3IgYHlPZmZzZXRgIHRvIHdvcmsgcHJvcGVybHksIHNjcm9sbGluZyBzaG91bGQgdGFrZSBwbGFjZSBvbiB0aGUgZG9jdW1lbnQncyByb290IGFuZA0KLSAgICogbm90IHNvbWUgY2hpbGQgZWxlbWVudC4NCi0gICAqIDwvZGl2Pg0KLSAgICoNCi0gICAqIEBleGFtcGxlDQotICAgICA8ZXhhbXBsZSBtb2R1bGU9ImFuY2hvclNjcm9sbEV4YW1wbGUiPg0KLSAgICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgICA8ZGl2IGlkPSJzY3JvbGxBcmVhIiBuZy1jb250cm9sbGVyPSJTY3JvbGxDb250cm9sbGVyIj4NCi0gICAgICAgICAgIDxhIG5nLWNsaWNrPSJnb3RvQm90dG9tKCkiPkdvIHRvIGJvdHRvbTwvYT4NCi0gICAgICAgICAgIDxhIGlkPSJib3R0b20iPjwvYT4gWW91J3JlIGF0IHRoZSBib3R0b20hDQotICAgICAgICAgPC9kaXY+DQotICAgICAgIDwvZmlsZT4NCi0gICAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4NCi0gICAgICAgICBhbmd1bGFyLm1vZHVsZSgnYW5jaG9yU2Nyb2xsRXhhbXBsZScsIFtdKQ0KLSAgICAgICAgICAgLmNvbnRyb2xsZXIoJ1Njcm9sbENvbnRyb2xsZXInLCBbJyRzY29wZScsICckbG9jYXRpb24nLCAnJGFuY2hvclNjcm9sbCcsDQotICAgICAgICAgICAgIGZ1bmN0aW9uICgkc2NvcGUsICRsb2NhdGlvbiwgJGFuY2hvclNjcm9sbCkgew0KLSAgICAgICAgICAgICAgICRzY29wZS5nb3RvQm90dG9tID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGxvY2F0aW9uLmhhc2ggdG8gdGhlIGlkIG9mDQotICAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudCB5b3Ugd2lzaCB0byBzY3JvbGwgdG8uDQotICAgICAgICAgICAgICAgICAkbG9jYXRpb24uaGFzaCgnYm90dG9tJyk7DQotDQotICAgICAgICAgICAgICAgICAvLyBjYWxsICRhbmNob3JTY3JvbGwoKQ0KLSAgICAgICAgICAgICAgICAgJGFuY2hvclNjcm9sbCgpOw0KLSAgICAgICAgICAgICAgIH07DQotICAgICAgICAgICAgIH1dKTsNCi0gICAgICAgPC9maWxlPg0KLSAgICAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPg0KLSAgICAgICAgICNzY3JvbGxBcmVhIHsNCi0gICAgICAgICAgIGhlaWdodDogMjgwcHg7DQotICAgICAgICAgICBvdmVyZmxvdzogYXV0bzsNCi0gICAgICAgICB9DQotDQotICAgICAgICAgI2JvdHRvbSB7DQotICAgICAgICAgICBkaXNwbGF5OiBibG9jazsNCi0gICAgICAgICAgIG1hcmdpbi10b3A6IDIwMDBweDsNCi0gICAgICAgICB9DQotICAgICAgIDwvZmlsZT4NCi0gICAgIDwvZXhhbXBsZT4NCi0gICAqDQotICAgKiA8aHIgLz4NCi0gICAqIFRoZSBleGFtcGxlIGJlbG93IGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgYSB2ZXJ0aWNhbCBzY3JvbGwtb2Zmc2V0IChzcGVjaWZpZWQgYXMgYSBmaXhlZCB2YWx1ZSkuDQotICAgKiBTZWUge0BsaW5rIG5nLiRhbmNob3JTY3JvbGwjeU9mZnNldCAkYW5jaG9yU2Nyb2xsLnlPZmZzZXR9IGZvciBtb3JlIGRldGFpbHMuDQotICAgKg0KLSAgICogQGV4YW1wbGUNCi0gICAgIDxleGFtcGxlIG1vZHVsZT0iYW5jaG9yU2Nyb2xsT2Zmc2V0RXhhbXBsZSI+DQotICAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICAgIDxkaXYgY2xhc3M9ImZpeGVkLWhlYWRlciIgbmctY29udHJvbGxlcj0iaGVhZGVyQ3RybCI+DQotICAgICAgICAgICA8YSBocmVmPSIiIG5nLWNsaWNrPSJnb3RvQW5jaG9yKHgpIiBuZy1yZXBlYXQ9InggaW4gWzEsMiwzLDQsNV0iPg0KLSAgICAgICAgICAgICBHbyB0byBhbmNob3Ige3t4fX0NCi0gICAgICAgICAgIDwvYT4NCi0gICAgICAgICA8L2Rpdj4NCi0gICAgICAgICA8ZGl2IGlkPSJhbmNob3J7e3h9fSIgY2xhc3M9ImFuY2hvciIgbmctcmVwZWF0PSJ4IGluIFsxLDIsMyw0LDVdIj4NCi0gICAgICAgICAgIEFuY2hvciB7e3h9fSBvZiA1DQotICAgICAgICAgPC9kaXY+DQotICAgICAgIDwvZmlsZT4NCi0gICAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4NCi0gICAgICAgICBhbmd1bGFyLm1vZHVsZSgnYW5jaG9yU2Nyb2xsT2Zmc2V0RXhhbXBsZScsIFtdKQ0KLSAgICAgICAgICAgLnJ1bihbJyRhbmNob3JTY3JvbGwnLCBmdW5jdGlvbigkYW5jaG9yU2Nyb2xsKSB7DQotICAgICAgICAgICAgICRhbmNob3JTY3JvbGwueU9mZnNldCA9IDUwOyAgIC8vIGFsd2F5cyBzY3JvbGwgYnkgNTAgZXh0cmEgcGl4ZWxzDQotICAgICAgICAgICB9XSkNCi0gICAgICAgICAgIC5jb250cm9sbGVyKCdoZWFkZXJDdHJsJywgWyckYW5jaG9yU2Nyb2xsJywgJyRsb2NhdGlvbicsICckc2NvcGUnLA0KLSAgICAgICAgICAgICBmdW5jdGlvbiAoJGFuY2hvclNjcm9sbCwgJGxvY2F0aW9uLCAkc2NvcGUpIHsNCi0gICAgICAgICAgICAgICAkc2NvcGUuZ290b0FuY2hvciA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgICAgICAgICAgICAgIHZhciBuZXdIYXNoID0gJ2FuY2hvcicgKyB4Ow0KLSAgICAgICAgICAgICAgICAgaWYgKCRsb2NhdGlvbi5oYXNoKCkgIT09IG5ld0hhc2gpIHsNCi0gICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSAkbG9jYXRpb24uaGFzaCB0byBgbmV3SGFzaGAgYW5kDQotICAgICAgICAgICAgICAgICAgIC8vICRhbmNob3JTY3JvbGwgd2lsbCBhdXRvbWF0aWNhbGx5IHNjcm9sbCB0byBpdA0KLSAgICAgICAgICAgICAgICAgICAkbG9jYXRpb24uaGFzaCgnYW5jaG9yJyArIHgpOw0KLSAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgLy8gY2FsbCAkYW5jaG9yU2Nyb2xsKCkgZXhwbGljaXRseSwNCi0gICAgICAgICAgICAgICAgICAgLy8gc2luY2UgJGxvY2F0aW9uLmhhc2ggaGFzbid0IGNoYW5nZWQNCi0gICAgICAgICAgICAgICAgICAgJGFuY2hvclNjcm9sbCgpOw0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgIH07DQotICAgICAgICAgICAgIH0NCi0gICAgICAgICAgIF0pOw0KLSAgICAgICA8L2ZpbGU+DQotICAgICAgIDxmaWxlIG5hbWU9InN0eWxlLmNzcyI+DQotICAgICAgICAgYm9keSB7DQotICAgICAgICAgICBwYWRkaW5nLXRvcDogNTBweDsNCi0gICAgICAgICB9DQotDQotICAgICAgICAgLmFuY2hvciB7DQotICAgICAgICAgICBib3JkZXI6IDJweCBkYXNoZWQgRGFya09yY2hpZDsNCi0gICAgICAgICAgIHBhZGRpbmc6IDEwcHggMTBweCAyMDBweCAxMHB4Ow0KLSAgICAgICAgIH0NCi0NCi0gICAgICAgICAuZml4ZWQtaGVhZGVyIHsNCi0gICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKTsNCi0gICAgICAgICAgIGhlaWdodDogNTBweDsNCi0gICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsNCi0gICAgICAgICAgIHRvcDogMDsgbGVmdDogMDsgcmlnaHQ6IDA7DQotICAgICAgICAgfQ0KLQ0KLSAgICAgICAgIC5maXhlZC1oZWFkZXIgPiBhIHsNCi0gICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCi0gICAgICAgICAgIG1hcmdpbjogNXB4IDE1cHg7DQotICAgICAgICAgfQ0KLSAgICAgICA8L2ZpbGU+DQotICAgICA8L2V4YW1wbGU+DQotICAgKi8NCi0gIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsICckbG9jYXRpb24nLCAnJHJvb3RTY29wZScsIGZ1bmN0aW9uKCR3aW5kb3csICRsb2NhdGlvbiwgJHJvb3RTY29wZSkgew0KLSAgICB2YXIgZG9jdW1lbnQgPSAkd2luZG93LmRvY3VtZW50Ow0KLQ0KLSAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGZpcnN0IGFuY2hvciBmcm9tIGEgTm9kZUxpc3QNCi0gICAgLy8gKHVzaW5nIGBBcnJheSNzb21lKClgIGluc3RlYWQgb2YgYGFuZ3VsYXIjZm9yRWFjaCgpYCBzaW5jZSBpdCdzIG1vcmUgcGVyZm9ybWFudA0KLSAgICAvLyAgYW5kIHdvcmtpbmcgaW4gYWxsIHN1cHBvcnRlZCBicm93c2Vycy4pDQotICAgIGZ1bmN0aW9uIGdldEZpcnN0QW5jaG9yKGxpc3QpIHsNCi0gICAgICB2YXIgcmVzdWx0ID0gbnVsbDsNCi0gICAgICBBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKGxpc3QsIGZ1bmN0aW9uKGVsZW1lbnQpIHsNCi0gICAgICAgIGlmIChub2RlTmFtZV8oZWxlbWVudCkgPT09ICdhJykgew0KLSAgICAgICAgICByZXN1bHQgPSBlbGVtZW50Ow0KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICB9KTsNCi0gICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGdldFlPZmZzZXQoKSB7DQotDQotICAgICAgdmFyIG9mZnNldCA9IHNjcm9sbC55T2Zmc2V0Ow0KLQ0KLSAgICAgIGlmIChpc0Z1bmN0aW9uKG9mZnNldCkpIHsNCi0gICAgICAgIG9mZnNldCA9IG9mZnNldCgpOw0KLSAgICAgIH0gZWxzZSBpZiAoaXNFbGVtZW50KG9mZnNldCkpIHsNCi0gICAgICAgIHZhciBlbGVtID0gb2Zmc2V0WzBdOw0KLSAgICAgICAgdmFyIHN0eWxlID0gJHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pOw0KLSAgICAgICAgaWYgKHN0eWxlLnBvc2l0aW9uICE9PSAnZml4ZWQnKSB7DQotICAgICAgICAgIG9mZnNldCA9IDA7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBvZmZzZXQgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTsNCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2UgaWYgKCFpc051bWJlcihvZmZzZXQpKSB7DQotICAgICAgICBvZmZzZXQgPSAwOw0KLSAgICAgIH0NCi0NCi0gICAgICByZXR1cm4gb2Zmc2V0Ow0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIHNjcm9sbFRvKGVsZW0pIHsNCi0gICAgICBpZiAoZWxlbSkgew0KLSAgICAgICAgZWxlbS5zY3JvbGxJbnRvVmlldygpOw0KLQ0KLSAgICAgICAgdmFyIG9mZnNldCA9IGdldFlPZmZzZXQoKTsNCi0NCi0gICAgICAgIGlmIChvZmZzZXQpIHsNCi0gICAgICAgICAgLy8gYG9mZnNldGAgaXMgdGhlIG51bWJlciBvZiBwaXhlbHMgd2Ugc2hvdWxkIHNjcm9sbCBVUCBpbiBvcmRlciB0byBhbGlnbiBgZWxlbWAgcHJvcGVybHkuDQotICAgICAgICAgIC8vIFRoaXMgaXMgdHJ1ZSBPTkxZIGlmIHRoZSBjYWxsIHRvIGBlbGVtLnNjcm9sbEludG9WaWV3KClgIGluaXRpYWxseSBhbGlnbnMgYGVsZW1gIGF0IHRoZQ0KLSAgICAgICAgICAvLyB0b3Agb2YgdGhlIHZpZXdwb3J0Lg0KLSAgICAgICAgICAvLw0KLSAgICAgICAgICAvLyBJRiB0aGUgbnVtYmVyIG9mIHBpeGVscyBmcm9tIHRoZSB0b3Agb2YgYGVsZW1gIHRvIHRoZSBlbmQgb2YgdGhlIHBhZ2UncyBjb250ZW50IGlzIGxlc3MNCi0gICAgICAgICAgLy8gdGhhbiB0aGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCwgdGhlbiBgZWxlbS5zY3JvbGxJbnRvVmlldygpYCB3aWxsIGFsaWduIHRoZSBgZWxlbWAgc29tZQ0KLSAgICAgICAgICAvLyB3YXkgZG93biB0aGUgcGFnZS4NCi0gICAgICAgICAgLy8NCi0gICAgICAgICAgLy8gVGhpcyBpcyBvZnRlbiB0aGUgY2FzZSBmb3IgZWxlbWVudHMgbmVhciB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLg0KLSAgICAgICAgICAvLw0KLSAgICAgICAgICAvLyBJbiBzdWNoIGNhc2VzIHdlIGRvIG5vdCBuZWVkIHRvIHNjcm9sbCB0aGUgd2hvbGUgYG9mZnNldGAgdXAsIGp1c3QgdGhlIGRpZmZlcmVuY2UgYmV0d2Vlbg0KLSAgICAgICAgICAvLyB0aGUgdG9wIG9mIHRoZSBlbGVtZW50IGFuZCB0aGUgb2Zmc2V0LCB3aGljaCBpcyBlbm91Z2ggdG8gYWxpZ24gdGhlIHRvcCBvZiBgZWxlbWAgYXQgdGhlDQotICAgICAgICAgIC8vIGRlc2lyZWQgcG9zaXRpb24uDQotICAgICAgICAgIHZhciBlbGVtVG9wID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7DQotICAgICAgICAgICR3aW5kb3cuc2Nyb2xsQnkoMCwgZWxlbVRvcCAtIG9mZnNldCk7DQotICAgICAgICB9DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgICR3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIHNjcm9sbCgpIHsNCi0gICAgICB2YXIgaGFzaCA9ICRsb2NhdGlvbi5oYXNoKCksIGVsbTsNCi0NCi0gICAgICAvLyBlbXB0eSBoYXNoLCBzY3JvbGwgdG8gdGhlIHRvcCBvZiB0aGUgcGFnZQ0KLSAgICAgIGlmICghaGFzaCkgc2Nyb2xsVG8obnVsbCk7DQotDQotICAgICAgLy8gZWxlbWVudCB3aXRoIGdpdmVuIGlkDQotICAgICAgZWxzZSBpZiAoKGVsbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGhhc2gpKSkgc2Nyb2xsVG8oZWxtKTsNCi0NCi0gICAgICAvLyBmaXJzdCBhbmNob3Igd2l0aCBnaXZlbiBuYW1lIDotRA0KLSAgICAgIGVsc2UgaWYgKChlbG0gPSBnZXRGaXJzdEFuY2hvcihkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShoYXNoKSkpKSBzY3JvbGxUbyhlbG0pOw0KLQ0KLSAgICAgIC8vIG5vIGVsZW1lbnQgYW5kIGhhc2ggPT0gJ3RvcCcsIHNjcm9sbCB0byB0aGUgdG9wIG9mIHRoZSBwYWdlDQotICAgICAgZWxzZSBpZiAoaGFzaCA9PT0gJ3RvcCcpIHNjcm9sbFRvKG51bGwpOw0KLSAgICB9DQotDQotICAgIC8vIGRvZXMgbm90IHNjcm9sbCB3aGVuIHVzZXIgY2xpY2tzIG9uIGFuY2hvciBsaW5rIHRoYXQgaXMgY3VycmVudGx5IG9uDQotICAgIC8vIChubyB1cmwgY2hhbmdlLCBubyAkbG9jYXRpb24uaGFzaCgpIGNoYW5nZSksIGJyb3dzZXIgbmF0aXZlIGRvZXMgc2Nyb2xsDQotICAgIGlmIChhdXRvU2Nyb2xsaW5nRW5hYmxlZCkgew0KLSAgICAgICRyb290U2NvcGUuJHdhdGNoKGZ1bmN0aW9uIGF1dG9TY3JvbGxXYXRjaCgpIHtyZXR1cm4gJGxvY2F0aW9uLmhhc2goKTt9LA0KLSAgICAgICAgZnVuY3Rpb24gYXV0b1Njcm9sbFdhdGNoQWN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7DQotICAgICAgICAgIC8vIHNraXAgdGhlIGluaXRpYWwgc2Nyb2xsIGlmICRsb2NhdGlvbi5oYXNoIGlzIGVtcHR5DQotICAgICAgICAgIGlmIChuZXdWYWwgPT09IG9sZFZhbCAmJiBuZXdWYWwgPT09ICcnKSByZXR1cm47DQotDQotICAgICAgICAgIGpxTGl0ZURvY3VtZW50TG9hZGVkKGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgICRyb290U2NvcGUuJGV2YWxBc3luYyhzY3JvbGwpOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH0pOw0KLSAgICB9DQotDQotICAgIHJldHVybiBzY3JvbGw7DQotICB9XTsNCi19DQotDQotdmFyICRhbmltYXRlTWluRXJyID0gbWluRXJyKCckYW5pbWF0ZScpOw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBwcm92aWRlcg0KLSAqIEBuYW1lICRhbmltYXRlUHJvdmlkZXINCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgJGFuaW1hdGUgdGhhdCBkb2Vzbid0IHBlcmZvcm0gYW55IGFuaW1hdGlvbnMsIGluc3RlYWQganVzdA0KLSAqIHN5bmNocm9ub3VzbHkgcGVyZm9ybXMgRE9NDQotICogdXBkYXRlcyBhbmQgY2FsbHMgZG9uZSgpIGNhbGxiYWNrcy4NCi0gKg0KLSAqIEluIG9yZGVyIHRvIGVuYWJsZSBhbmltYXRpb25zIHRoZSBuZ0FuaW1hdGUgbW9kdWxlIGhhcyB0byBiZSBsb2FkZWQuDQotICoNCi0gKiBUbyBzZWUgdGhlIGZ1bmN0aW9uYWwgaW1wbGVtZW50YXRpb24gY2hlY2sgb3V0IHNyYy9uZ0FuaW1hdGUvYW5pbWF0ZS5qcw0KLSAqLw0KLXZhciAkQW5pbWF0ZVByb3ZpZGVyID0gWyckcHJvdmlkZScsIGZ1bmN0aW9uKCRwcm92aWRlKSB7DQotDQotDQotICB0aGlzLiQkc2VsZWN0b3JzID0ge307DQotDQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lICRhbmltYXRlUHJvdmlkZXIjcmVnaXN0ZXINCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFJlZ2lzdGVycyBhIG5ldyBpbmplY3RhYmxlIGFuaW1hdGlvbiBmYWN0b3J5IGZ1bmN0aW9uLiBUaGUgZmFjdG9yeSBmdW5jdGlvbiBwcm9kdWNlcyB0aGUNCi0gICAqIGFuaW1hdGlvbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgY2FsbGJhY2sgZnVuY3Rpb25zIGZvciBlYWNoIGV2ZW50IHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUNCi0gICAqIGFuaW1hdGVkLg0KLSAgICoNCi0gICAqICAgKiBgZXZlbnRGbmA6IGBmdW5jdGlvbihFbGVtZW50LCBkb25lRnVuY3Rpb24pYCBUaGUgZWxlbWVudCB0byBhbmltYXRlLCB0aGUgYGRvbmVGdW5jdGlvbmANCi0gICAqICAgbXVzdCBiZSBjYWxsZWQgb25jZSB0aGUgZWxlbWVudCBhbmltYXRpb24gaXMgY29tcGxldGUuIElmIGEgZnVuY3Rpb24gaXMgcmV0dXJuZWQgdGhlbiB0aGUNCi0gICAqICAgYW5pbWF0aW9uIHNlcnZpY2Ugd2lsbCB1c2UgdGhpcyBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGFuaW1hdGlvbiB3aGVuZXZlciBhIGNhbmNlbCBldmVudCBpcw0KLSAgICogICB0cmlnZ2VyZWQuDQotICAgKg0KLSAgICoNCi0gICAqIGBgYGpzDQotICAgKiAgIHJldHVybiB7DQotICAgICAqICAgICBldmVudEZuIDogZnVuY3Rpb24oZWxlbWVudCwgZG9uZSkgew0KLSAgICAgKiAgICAgICAvL2NvZGUgdG8gcnVuIHRoZSBhbmltYXRpb24NCi0gICAgICogICAgICAgLy9vbmNlIGNvbXBsZXRlLCB0aGVuIHJ1biBkb25lKCkNCi0gICAgICogICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNhbmNlbGxhdGlvbkZ1bmN0aW9uKCkgew0KLSAgICAgKiAgICAgICAgIC8vY29kZSB0byBjYW5jZWwgdGhlIGFuaW1hdGlvbg0KLSAgICAgKiAgICAgICB9DQotICAgICAqICAgICB9DQotICAgICAqICAgfQ0KLSAgICogYGBgDQotICAgKg0KLSAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGFuaW1hdGlvbi4NCi0gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZhY3RvcnkgVGhlIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHRvIHJldHVybiB0aGUgYW5pbWF0aW9uDQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC4NCi0gICAqLw0KLSAgdGhpcy5yZWdpc3RlciA9IGZ1bmN0aW9uKG5hbWUsIGZhY3RvcnkpIHsNCi0gICAgdmFyIGtleSA9IG5hbWUgKyAnLWFuaW1hdGlvbic7DQotICAgIGlmIChuYW1lICYmIG5hbWUuY2hhckF0KDApICE9ICcuJykgdGhyb3cgJGFuaW1hdGVNaW5FcnIoJ25vdGNzZWwnLA0KLSAgICAgICAgIkV4cGVjdGluZyBjbGFzcyBzZWxlY3RvciBzdGFydGluZyB3aXRoICcuJyBnb3QgJ3swfScuIiwgbmFtZSk7DQotICAgIHRoaXMuJCRzZWxlY3RvcnNbbmFtZS5zdWJzdHIoMSldID0ga2V5Ow0KLSAgICAkcHJvdmlkZS5mYWN0b3J5KGtleSwgZmFjdG9yeSk7DQotICB9Ow0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSAkYW5pbWF0ZVByb3ZpZGVyI2NsYXNzTmFtZUZpbHRlcg0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogU2V0cyBhbmQvb3IgcmV0dXJucyB0aGUgQ1NTIGNsYXNzIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGlzIGNoZWNrZWQgd2hlbiBwZXJmb3JtaW5nDQotICAgKiBhbiBhbmltYXRpb24uIFVwb24gYm9vdHN0cmFwIHRoZSBjbGFzc05hbWVGaWx0ZXIgdmFsdWUgaXMgbm90IHNldCBhdCBhbGwgYW5kIHdpbGwNCi0gICAqIHRoZXJlZm9yZSBlbmFibGUgJGFuaW1hdGUgdG8gYXR0ZW1wdCB0byBwZXJmb3JtIGFuIGFuaW1hdGlvbiBvbiBhbnkgZWxlbWVudC4NCi0gICAqIFdoZW4gc2V0dGluZyB0aGUgY2xhc3NOYW1lRmlsdGVyIHZhbHVlLCBhbmltYXRpb25zIHdpbGwgb25seSBiZSBwZXJmb3JtZWQgb24gZWxlbWVudHMNCi0gICAqIHRoYXQgc3VjY2Vzc2Z1bGx5IG1hdGNoIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbi4gVGhpcyBpbiB0dXJuIGNhbiBib29zdCBwZXJmb3JtYW5jZQ0KLSAgICogZm9yIGxvdy1wb3dlcmVkIGRldmljZXMgYXMgd2VsbCBhcyBhcHBsaWNhdGlvbnMgY29udGFpbmluZyBhIGxvdCBvZiBzdHJ1Y3R1cmFsIG9wZXJhdGlvbnMuDQotICAgKiBAcGFyYW0ge1JlZ0V4cD19IGV4cHJlc3Npb24gVGhlIGNsYXNzTmFtZSBleHByZXNzaW9uIHdoaWNoIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCBhbmltYXRpb25zDQotICAgKiBAcmV0dXJuIHtSZWdFeHB9IFRoZSBjdXJyZW50IENTUyBjbGFzc05hbWUgZXhwcmVzc2lvbiB2YWx1ZS4gSWYgbnVsbCB0aGVuIHRoZXJlIGlzIG5vIGV4cHJlc3Npb24gdmFsdWUNCi0gICAqLw0KLSAgdGhpcy5jbGFzc05hbWVGaWx0ZXIgPSBmdW5jdGlvbihleHByZXNzaW9uKSB7DQotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7DQotICAgICAgdGhpcy4kJGNsYXNzTmFtZUZpbHRlciA9IChleHByZXNzaW9uIGluc3RhbmNlb2YgUmVnRXhwKSA/IGV4cHJlc3Npb24gOiBudWxsOw0KLSAgICB9DQotICAgIHJldHVybiB0aGlzLiQkY2xhc3NOYW1lRmlsdGVyOw0KLSAgfTsNCi0NCi0gIHRoaXMuJGdldCA9IFsnJCRxJywgJyQkYXN5bmNDYWxsYmFjaycsICckcm9vdFNjb3BlJywgZnVuY3Rpb24oJCRxLCAkJGFzeW5jQ2FsbGJhY2ssICRyb290U2NvcGUpIHsNCi0NCi0gICAgdmFyIGN1cnJlbnREZWZlcjsNCi0NCi0gICAgZnVuY3Rpb24gcnVuQW5pbWF0aW9uUG9zdERpZ2VzdChmbikgew0KLSAgICAgIHZhciBjYW5jZWxGbiwgZGVmZXIgPSAkJHEuZGVmZXIoKTsNCi0gICAgICBkZWZlci5wcm9taXNlLiQkY2FuY2VsRm4gPSBmdW5jdGlvbiBuZ0FuaW1hdGVNYXliZUNhbmNlbCgpIHsNCi0gICAgICAgIGNhbmNlbEZuICYmIGNhbmNlbEZuKCk7DQotICAgICAgfTsNCi0NCi0gICAgICAkcm9vdFNjb3BlLiQkcG9zdERpZ2VzdChmdW5jdGlvbiBuZ0FuaW1hdGVQb3N0RGlnZXN0KCkgew0KLSAgICAgICAgY2FuY2VsRm4gPSBmbihmdW5jdGlvbiBuZ0FuaW1hdGVOb3RpZnlDb21wbGV0ZSgpIHsNCi0gICAgICAgICAgZGVmZXIucmVzb2x2ZSgpOw0KLSAgICAgICAgfSk7DQotICAgICAgfSk7DQotDQotICAgICAgcmV0dXJuIGRlZmVyLnByb21pc2U7DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gcmVzb2x2ZUVsZW1lbnRDbGFzc2VzKGVsZW1lbnQsIGNsYXNzZXMpIHsNCi0gICAgICB2YXIgdG9BZGQgPSBbXSwgdG9SZW1vdmUgPSBbXTsNCi0NCi0gICAgICB2YXIgaGFzQ2xhc3NlcyA9IGNyZWF0ZU1hcCgpOw0KLSAgICAgIGZvckVhY2goKGVsZW1lbnQuYXR0cignY2xhc3MnKSB8fCAnJykuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihjbGFzc05hbWUpIHsNCi0gICAgICAgIGhhc0NsYXNzZXNbY2xhc3NOYW1lXSA9IHRydWU7DQotICAgICAgfSk7DQotDQotICAgICAgZm9yRWFjaChjbGFzc2VzLCBmdW5jdGlvbihzdGF0dXMsIGNsYXNzTmFtZSkgew0KLSAgICAgICAgdmFyIGhhc0NsYXNzID0gaGFzQ2xhc3Nlc1tjbGFzc05hbWVdOw0KLQ0KLSAgICAgICAgLy8gSWYgdGhlIG1vc3QgcmVjZW50IGNsYXNzIG1hbmlwdWxhdGlvbiAodmlhICRhbmltYXRlKSB3YXMgdG8gcmVtb3ZlIHRoZSBjbGFzcywgYW5kIHRoZQ0KLSAgICAgICAgLy8gZWxlbWVudCBjdXJyZW50bHkgaGFzIHRoZSBjbGFzcywgdGhlIGNsYXNzIGlzIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbC4gT3RoZXJ3aXNlLCBpZg0KLSAgICAgICAgLy8gdGhlIG1vc3QgcmVjZW50IGNsYXNzIG1hbmlwdWxhdGlvbiAodmlhICRhbmltYXRlKSB3YXMgdG8gYWRkIHRoZSBjbGFzcywgYW5kIHRoZQ0KLSAgICAgICAgLy8gZWxlbWVudCBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZSB0aGUgY2xhc3MsIHRoZSBjbGFzcyBpcyBzY2hlZHVsZWQgdG8gYmUgYWRkZWQuDQotICAgICAgICBpZiAoc3RhdHVzID09PSBmYWxzZSAmJiBoYXNDbGFzcykgew0KLSAgICAgICAgICB0b1JlbW92ZS5wdXNoKGNsYXNzTmFtZSk7DQotICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gdHJ1ZSAmJiAhaGFzQ2xhc3MpIHsNCi0gICAgICAgICAgdG9BZGQucHVzaChjbGFzc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0pOw0KLQ0KLSAgICAgIHJldHVybiAodG9BZGQubGVuZ3RoICsgdG9SZW1vdmUubGVuZ3RoKSA+IDAgJiYNCi0gICAgICAgIFt0b0FkZC5sZW5ndGggPyB0b0FkZCA6IG51bGwsIHRvUmVtb3ZlLmxlbmd0aCA/IHRvUmVtb3ZlIDogbnVsbF07DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gY2FjaGVkQ2xhc3NNYW5pcHVsYXRpb24oY2FjaGUsIGNsYXNzZXMsIG9wKSB7DQotICAgICAgZm9yICh2YXIgaT0wLCBpaSA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkgew0KLSAgICAgICAgdmFyIGNsYXNzTmFtZSA9IGNsYXNzZXNbaV07DQotICAgICAgICBjYWNoZVtjbGFzc05hbWVdID0gb3A7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGFzeW5jUHJvbWlzZSgpIHsNCi0gICAgICAvLyBvbmx5IHNlcnZlIG9uZSBpbnN0YW5jZSBvZiBhIHByb21pc2UgaW4gb3JkZXIgdG8gc2F2ZSBDUFUgY3ljbGVzDQotICAgICAgaWYgKCFjdXJyZW50RGVmZXIpIHsNCi0gICAgICAgIGN1cnJlbnREZWZlciA9ICQkcS5kZWZlcigpOw0KLSAgICAgICAgJCRhc3luY0NhbGxiYWNrKGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICBjdXJyZW50RGVmZXIucmVzb2x2ZSgpOw0KLSAgICAgICAgICBjdXJyZW50RGVmZXIgPSBudWxsOw0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBjdXJyZW50RGVmZXIucHJvbWlzZTsNCi0gICAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBhcHBseVN0eWxlcyhlbGVtZW50LCBvcHRpb25zKSB7DQotICAgICAgaWYgKGFuZ3VsYXIuaXNPYmplY3Qob3B0aW9ucykpIHsNCi0gICAgICAgIHZhciBzdHlsZXMgPSBleHRlbmQob3B0aW9ucy5mcm9tIHx8IHt9LCBvcHRpb25zLnRvIHx8IHt9KTsNCi0gICAgICAgIGVsZW1lbnQuY3NzKHN0eWxlcyk7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKg0KLSAgICAgKiBAbmdkb2Mgc2VydmljZQ0KLSAgICAgKiBAbmFtZSAkYW5pbWF0ZQ0KLSAgICAgKiBAZGVzY3JpcHRpb24gVGhlICRhbmltYXRlIHNlcnZpY2UgcHJvdmlkZXMgcnVkaW1lbnRhcnkgRE9NIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgdG8NCi0gICAgICogaW5zZXJ0LCByZW1vdmUgYW5kIG1vdmUgZWxlbWVudHMgd2l0aGluIHRoZSBET00sIGFzIHdlbGwgYXMgYWRkaW5nIGFuZCByZW1vdmluZyBjbGFzc2VzLg0KLSAgICAgKiBUaGlzIHNlcnZpY2UgaXMgdGhlIGNvcmUgc2VydmljZSB1c2VkIGJ5IHRoZSBuZ0FuaW1hdGUgJGFuaW1hdG9yIHNlcnZpY2Ugd2hpY2ggcHJvdmlkZXMNCi0gICAgICogaGlnaC1sZXZlbCBhbmltYXRpb24gaG9va3MgZm9yIENTUyBhbmQgSmF2YVNjcmlwdC4NCi0gICAgICoNCi0gICAgICogJGFuaW1hdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBBbmd1bGFySlMgY29yZSwgaG93ZXZlciwgdGhlIG5nQW5pbWF0ZSBtb2R1bGUgbXVzdCBiZSBpbmNsdWRlZA0KLSAgICAgKiB0byBlbmFibGUgZnVsbCBvdXQgYW5pbWF0aW9uIHN1cHBvcnQuIE90aGVyd2lzZSwgJGFuaW1hdGUgd2lsbCBvbmx5IHBlcmZvcm0gc2ltcGxlIERPTQ0KLSAgICAgKiBtYW5pcHVsYXRpb24gb3BlcmF0aW9ucy4NCi0gICAgICoNCi0gICAgICogVG8gbGVhcm4gbW9yZSBhYm91dCBlbmFibGluZyBhbmltYXRpb24gc3VwcG9ydCwgY2xpY2sgaGVyZSB0byB2aXNpdCB0aGUge0BsaW5rIG5nQW5pbWF0ZQ0KLSAgICAgKiBuZ0FuaW1hdGUgbW9kdWxlIHBhZ2V9IGFzIHdlbGwgYXMgdGhlIHtAbGluayBuZ0FuaW1hdGUuJGFuaW1hdGUgbmdBbmltYXRlICRhbmltYXRlIHNlcnZpY2UNCi0gICAgICogcGFnZX0uDQotICAgICAqLw0KLSAgICByZXR1cm4gew0KLSAgICAgIGFuaW1hdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGZyb20sIHRvKSB7DQotICAgICAgICBhcHBseVN0eWxlcyhlbGVtZW50LCB7IGZyb206IGZyb20sIHRvOiB0byB9KTsNCi0gICAgICAgIHJldHVybiBhc3luY1Byb21pc2UoKTsNCi0gICAgICB9LA0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqDQotICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAqIEBuYW1lICRhbmltYXRlI2VudGVyDQotICAgICAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAgICAgKiBAZGVzY3JpcHRpb24gSW5zZXJ0cyB0aGUgZWxlbWVudCBpbnRvIHRoZSBET00gZWl0aGVyIGFmdGVyIHRoZSBgYWZ0ZXJgIGVsZW1lbnQgb3INCi0gICAgICAgKiBhcyB0aGUgZmlyc3QgY2hpbGQgd2l0aGluIHRoZSBgcGFyZW50YCBlbGVtZW50LiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYSBwcm9taXNlDQotICAgICAgICogaXMgcmV0dXJuZWQgdGhhdCB3aWxsIGJlIHJlc29sdmVkIGF0IGEgbGF0ZXIgdGltZS4NCi0gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgdGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00NCi0gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHBhcmVudCB0aGUgcGFyZW50IGVsZW1lbnQgd2hpY2ggd2lsbCBhcHBlbmQgdGhlIGVsZW1lbnQgYXMNCi0gICAgICAgKiAgIGEgY2hpbGQgKGlmIHRoZSBhZnRlciBlbGVtZW50IGlzIG5vdCBwcmVzZW50KQ0KLSAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gYWZ0ZXIgdGhlIHNpYmxpbmcgZWxlbWVudCB3aGljaCB3aWxsIGFwcGVuZCB0aGUgZWxlbWVudA0KLSAgICAgICAqICAgYWZ0ZXIgaXRzZWxmDQotICAgICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRpb25zIGFuIG9wdGlvbmFsIGNvbGxlY3Rpb24gb2Ygc3R5bGVzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50Lg0KLSAgICAgICAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSBhbmltYXRpb24gY2FsbGJhY2sgcHJvbWlzZQ0KLSAgICAgICAqLw0KLSAgICAgIGVudGVyOiBmdW5jdGlvbihlbGVtZW50LCBwYXJlbnQsIGFmdGVyLCBvcHRpb25zKSB7DQotICAgICAgICBhcHBseVN0eWxlcyhlbGVtZW50LCBvcHRpb25zKTsNCi0gICAgICAgIGFmdGVyID8gYWZ0ZXIuYWZ0ZXIoZWxlbWVudCkNCi0gICAgICAgICAgICAgIDogcGFyZW50LnByZXBlbmQoZWxlbWVudCk7DQotICAgICAgICByZXR1cm4gYXN5bmNQcm9taXNlKCk7DQotICAgICAgfSwNCi0NCi0gICAgICAvKioNCi0gICAgICAgKg0KLSAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNsZWF2ZQ0KLSAgICAgICAqIEBraW5kIGZ1bmN0aW9uDQotICAgICAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgdGhlIGVsZW1lbnQgZnJvbSB0aGUgRE9NLiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYSBwcm9taXNlDQotICAgICAgICogaXMgcmV0dXJuZWQgdGhhdCB3aWxsIGJlIHJlc29sdmVkIGF0IGEgbGF0ZXIgdGltZS4NCi0gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgdGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIERPTQ0KLSAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIG9wdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuDQotICAgICAgICogQHJldHVybiB7UHJvbWlzZX0gdGhlIGFuaW1hdGlvbiBjYWxsYmFjayBwcm9taXNlDQotICAgICAgICovDQotICAgICAgbGVhdmU6IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMpIHsNCi0gICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7DQotICAgICAgICByZXR1cm4gYXN5bmNQcm9taXNlKCk7DQotICAgICAgfSwNCi0NCi0gICAgICAvKioNCi0gICAgICAgKg0KLSAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNtb3ZlDQotICAgICAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAgICAgKiBAZGVzY3JpcHRpb24gTW92ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBwcm92aWRlZCBlbGVtZW50IHdpdGhpbiB0aGUgRE9NIHRvIGJlIHBsYWNlZA0KLSAgICAgICAqIGVpdGhlciBhZnRlciB0aGUgYGFmdGVyYCBlbGVtZW50IG9yIGluc2lkZSBvZiB0aGUgYHBhcmVudGAgZWxlbWVudC4gV2hlbiB0aGUgZnVuY3Rpb24NCi0gICAgICAgKiBpcyBjYWxsZWQgYSBwcm9taXNlIGlzIHJldHVybmVkIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBhdCBhIGxhdGVyIHRpbWUuDQotICAgICAgICoNCi0gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgdGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBtb3ZlZCBhcm91bmQgd2l0aGluIHRoZQ0KLSAgICAgICAqICAgRE9NDQotICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBwYXJlbnQgdGhlIHBhcmVudCBlbGVtZW50IHdoZXJlIHRoZSBlbGVtZW50IHdpbGwgYmUNCi0gICAgICAgKiAgIGluc2VydGVkIGludG8gKGlmIHRoZSBhZnRlciBlbGVtZW50IGlzIG5vdCBwcmVzZW50KQ0KLSAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gYWZ0ZXIgdGhlIHNpYmxpbmcgZWxlbWVudCB3aGVyZSB0aGUgZWxlbWVudCB3aWxsIGJlDQotICAgICAgICogICBwb3NpdGlvbmVkIG5leHQgdG8NCi0gICAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgYW4gb3B0aW9uYWwgY29sbGVjdGlvbiBvZiBvcHRpb25zIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50Lg0KLSAgICAgICAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSBhbmltYXRpb24gY2FsbGJhY2sgcHJvbWlzZQ0KLSAgICAgICAqLw0KLSAgICAgIG1vdmU6IGZ1bmN0aW9uKGVsZW1lbnQsIHBhcmVudCwgYWZ0ZXIsIG9wdGlvbnMpIHsNCi0gICAgICAgIC8vIERvIG5vdCByZW1vdmUgZWxlbWVudCBiZWZvcmUgaW5zZXJ0LiBSZW1vdmluZyB3aWxsIGNhdXNlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZQ0KLSAgICAgICAgLy8gZWxlbWVudCB0byBiZSBkcm9wcGVkLiBJbnNlcnQgd2lsbCBpbXBsaWNpdGx5IGRvIHRoZSByZW1vdmUuDQotICAgICAgICByZXR1cm4gdGhpcy5lbnRlcihlbGVtZW50LCBwYXJlbnQsIGFmdGVyLCBvcHRpb25zKTsNCi0gICAgICB9LA0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqDQotICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAqIEBuYW1lICRhbmltYXRlI2FkZENsYXNzDQotICAgICAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAgICAgKiBAZGVzY3JpcHRpb24gQWRkcyB0aGUgcHJvdmlkZWQgY2xhc3NOYW1lIENTUyBjbGFzcyB2YWx1ZSB0byB0aGUgcHJvdmlkZWQgZWxlbWVudC4NCi0gICAgICAgKiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYSBwcm9taXNlIGlzIHJldHVybmVkIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBhdCBhIGxhdGVyIHRpbWUuDQotICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IHRoZSBlbGVtZW50IHdoaWNoIHdpbGwgaGF2ZSB0aGUgY2xhc3NOYW1lIHZhbHVlDQotICAgICAgICogICBhZGRlZCB0byBpdA0KLSAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgdGhlIENTUyBjbGFzcyB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbGVtZW50DQotICAgICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRpb25zIGFuIG9wdGlvbmFsIGNvbGxlY3Rpb24gb2Ygb3B0aW9ucyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudC4NCi0gICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2UNCi0gICAgICAgKi8NCi0gICAgICBhZGRDbGFzczogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lLCBvcHRpb25zKSB7DQotICAgICAgICByZXR1cm4gdGhpcy5zZXRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUsIFtdLCBvcHRpb25zKTsNCi0gICAgICB9LA0KLQ0KLSAgICAgICQkYWRkQ2xhc3NJbW1lZGlhdGVseTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lLCBvcHRpb25zKSB7DQotICAgICAgICBlbGVtZW50ID0ganFMaXRlKGVsZW1lbnQpOw0KLSAgICAgICAgY2xhc3NOYW1lID0gIWlzU3RyaW5nKGNsYXNzTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICA/IChpc0FycmF5KGNsYXNzTmFtZSkgPyBjbGFzc05hbWUuam9pbignICcpIDogJycpDQotICAgICAgICAgICAgICAgICAgICAgICAgOiBjbGFzc05hbWU7DQotICAgICAgICBmb3JFYWNoKGVsZW1lbnQsIGZ1bmN0aW9uKGVsZW1lbnQpIHsNCi0gICAgICAgICAganFMaXRlQWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKTsNCi0gICAgICAgIH0pOw0KLSAgICAgICAgYXBwbHlTdHlsZXMoZWxlbWVudCwgb3B0aW9ucyk7DQotICAgICAgICByZXR1cm4gYXN5bmNQcm9taXNlKCk7DQotICAgICAgfSwNCi0NCi0gICAgICAvKioNCi0gICAgICAgKg0KLSAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNyZW1vdmVDbGFzcw0KLSAgICAgICAqIEBraW5kIGZ1bmN0aW9uDQotICAgICAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgdGhlIHByb3ZpZGVkIGNsYXNzTmFtZSBDU1MgY2xhc3MgdmFsdWUgZnJvbSB0aGUgcHJvdmlkZWQgZWxlbWVudC4NCi0gICAgICAgKiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYSBwcm9taXNlIGlzIHJldHVybmVkIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBhdCBhIGxhdGVyIHRpbWUuDQotICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IHRoZSBlbGVtZW50IHdoaWNoIHdpbGwgaGF2ZSB0aGUgY2xhc3NOYW1lIHZhbHVlDQotICAgICAgICogICByZW1vdmVkIGZyb20gaXQNCi0gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIHRoZSBDU1MgY2xhc3Mgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnQNCi0gICAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgYW4gb3B0aW9uYWwgY29sbGVjdGlvbiBvZiBvcHRpb25zIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50Lg0KLSAgICAgICAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSBhbmltYXRpb24gY2FsbGJhY2sgcHJvbWlzZQ0KLSAgICAgICAqLw0KLSAgICAgIHJlbW92ZUNsYXNzOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUsIG9wdGlvbnMpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnNldENsYXNzKGVsZW1lbnQsIFtdLCBjbGFzc05hbWUsIG9wdGlvbnMpOw0KLSAgICAgIH0sDQotDQotICAgICAgJCRyZW1vdmVDbGFzc0ltbWVkaWF0ZWx5OiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUsIG9wdGlvbnMpIHsNCi0gICAgICAgIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCk7DQotICAgICAgICBjbGFzc05hbWUgPSAhaXNTdHJpbmcoY2xhc3NOYW1lKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgID8gKGlzQXJyYXkoY2xhc3NOYW1lKSA/IGNsYXNzTmFtZS5qb2luKCcgJykgOiAnJykNCi0gICAgICAgICAgICAgICAgICAgICAgICA6IGNsYXNzTmFtZTsNCi0gICAgICAgIGZvckVhY2goZWxlbWVudCwgZnVuY3Rpb24oZWxlbWVudCkgew0KLSAgICAgICAgICBqcUxpdGVSZW1vdmVDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpOw0KLSAgICAgICAgfSk7DQotICAgICAgICBhcHBseVN0eWxlcyhlbGVtZW50LCBvcHRpb25zKTsNCi0gICAgICAgIHJldHVybiBhc3luY1Byb21pc2UoKTsNCi0gICAgICB9LA0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqDQotICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAqIEBuYW1lICRhbmltYXRlI3NldENsYXNzDQotICAgICAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAgICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhbmQvb3IgcmVtb3ZlcyB0aGUgZ2l2ZW4gQ1NTIGNsYXNzZXMgdG8gYW5kIGZyb20gdGhlIGVsZW1lbnQuDQotICAgICAgICogV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGEgcHJvbWlzZSBpcyByZXR1cm5lZCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgYXQgYSBsYXRlciB0aW1lLg0KLSAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZWxlbWVudCB3aGljaCB3aWxsIGhhdmUgaXRzIENTUyBjbGFzc2VzIGNoYW5nZWQNCi0gICAgICAgKiAgIHJlbW92ZWQgZnJvbSBpdA0KLSAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhZGQgdGhlIENTUyBjbGFzc2VzIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVsZW1lbnQNCi0gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVtb3ZlIHRoZSBDU1MgY2xhc3Mgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnQNCi0gICAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgYW4gb3B0aW9uYWwgY29sbGVjdGlvbiBvZiBvcHRpb25zIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50Lg0KLSAgICAgICAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSBhbmltYXRpb24gY2FsbGJhY2sgcHJvbWlzZQ0KLSAgICAgICAqLw0KLSAgICAgIHNldENsYXNzOiBmdW5jdGlvbihlbGVtZW50LCBhZGQsIHJlbW92ZSwgb3B0aW9ucykgew0KLSAgICAgICAgdmFyIHNlbGYgPSB0aGlzOw0KLSAgICAgICAgdmFyIFNUT1JBR0VfS0VZID0gJyQkYW5pbWF0ZUNsYXNzZXMnOw0KLSAgICAgICAgdmFyIGNyZWF0ZWRDYWNoZSA9IGZhbHNlOw0KLSAgICAgICAgZWxlbWVudCA9IGpxTGl0ZShlbGVtZW50KTsNCi0NCi0gICAgICAgIHZhciBjYWNoZSA9IGVsZW1lbnQuZGF0YShTVE9SQUdFX0tFWSk7DQotICAgICAgICBpZiAoIWNhY2hlKSB7DQotICAgICAgICAgIGNhY2hlID0gew0KLSAgICAgICAgICAgIGNsYXNzZXM6IHt9LA0KLSAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMNCi0gICAgICAgICAgfTsNCi0gICAgICAgICAgY3JlYXRlZENhY2hlID0gdHJ1ZTsNCi0gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucyAmJiBjYWNoZS5vcHRpb25zKSB7DQotICAgICAgICAgIGNhY2hlLm9wdGlvbnMgPSBhbmd1bGFyLmV4dGVuZChjYWNoZS5vcHRpb25zIHx8IHt9LCBvcHRpb25zKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZhciBjbGFzc2VzID0gY2FjaGUuY2xhc3NlczsNCi0NCi0gICAgICAgIGFkZCA9IGlzQXJyYXkoYWRkKSA/IGFkZCA6IGFkZC5zcGxpdCgnICcpOw0KLSAgICAgICAgcmVtb3ZlID0gaXNBcnJheShyZW1vdmUpID8gcmVtb3ZlIDogcmVtb3ZlLnNwbGl0KCcgJyk7DQotICAgICAgICBjYWNoZWRDbGFzc01hbmlwdWxhdGlvbihjbGFzc2VzLCBhZGQsIHRydWUpOw0KLSAgICAgICAgY2FjaGVkQ2xhc3NNYW5pcHVsYXRpb24oY2xhc3NlcywgcmVtb3ZlLCBmYWxzZSk7DQotDQotICAgICAgICBpZiAoY3JlYXRlZENhY2hlKSB7DQotICAgICAgICAgIGNhY2hlLnByb21pc2UgPSBydW5BbmltYXRpb25Qb3N0RGlnZXN0KGZ1bmN0aW9uKGRvbmUpIHsNCi0gICAgICAgICAgICB2YXIgY2FjaGUgPSBlbGVtZW50LmRhdGEoU1RPUkFHRV9LRVkpOw0KLSAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRGF0YShTVE9SQUdFX0tFWSk7DQotDQotICAgICAgICAgICAgLy8gaW4gdGhlIGV2ZW50IHRoYXQgdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZCBiZWZvcmUgcG9zdERpZ2VzdA0KLSAgICAgICAgICAgIC8vIGlzIHJ1biB0aGVuIHRoZSBjYWNoZSB3aWxsIGJlIHVuZGVmaW5lZCBhbmQgdGhlcmUgd2lsbCBiZQ0KLSAgICAgICAgICAgIC8vIG5vIG5lZWQgYW55bW9yZSB0byBhZGQgb3IgcmVtb3ZlIGFuZCBvZiB0aGUgZWxlbWVudCBjbGFzc2VzDQotICAgICAgICAgICAgaWYgKGNhY2hlKSB7DQotICAgICAgICAgICAgICB2YXIgY2xhc3NlcyA9IHJlc29sdmVFbGVtZW50Q2xhc3NlcyhlbGVtZW50LCBjYWNoZS5jbGFzc2VzKTsNCi0gICAgICAgICAgICAgIGlmIChjbGFzc2VzKSB7DQotICAgICAgICAgICAgICAgIHNlbGYuJCRzZXRDbGFzc0ltbWVkaWF0ZWx5KGVsZW1lbnQsIGNsYXNzZXNbMF0sIGNsYXNzZXNbMV0sIGNhY2hlLm9wdGlvbnMpOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBkb25lKCk7DQotICAgICAgICAgIH0pOw0KLSAgICAgICAgICBlbGVtZW50LmRhdGEoU1RPUkFHRV9LRVksIGNhY2hlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjYWNoZS5wcm9taXNlOw0KLSAgICAgIH0sDQotDQotICAgICAgJCRzZXRDbGFzc0ltbWVkaWF0ZWx5OiBmdW5jdGlvbihlbGVtZW50LCBhZGQsIHJlbW92ZSwgb3B0aW9ucykgew0KLSAgICAgICAgYWRkICYmIHRoaXMuJCRhZGRDbGFzc0ltbWVkaWF0ZWx5KGVsZW1lbnQsIGFkZCk7DQotICAgICAgICByZW1vdmUgJiYgdGhpcy4kJHJlbW92ZUNsYXNzSW1tZWRpYXRlbHkoZWxlbWVudCwgcmVtb3ZlKTsNCi0gICAgICAgIGFwcGx5U3R5bGVzKGVsZW1lbnQsIG9wdGlvbnMpOw0KLSAgICAgICAgcmV0dXJuIGFzeW5jUHJvbWlzZSgpOw0KLSAgICAgIH0sDQotDQotICAgICAgZW5hYmxlZDogbm9vcCwNCi0gICAgICBjYW5jZWw6IG5vb3ANCi0gICAgfTsNCi0gIH1dOw0KLX1dOw0KLQ0KLWZ1bmN0aW9uICQkQXN5bmNDYWxsYmFja1Byb3ZpZGVyKCkgew0KLSAgdGhpcy4kZ2V0ID0gWyckJHJBRicsICckdGltZW91dCcsIGZ1bmN0aW9uKCQkckFGLCAkdGltZW91dCkgew0KLSAgICByZXR1cm4gJCRyQUYuc3VwcG9ydGVkDQotICAgICAgPyBmdW5jdGlvbihmbikgeyByZXR1cm4gJCRyQUYoZm4pOyB9DQotICAgICAgOiBmdW5jdGlvbihmbikgew0KLSAgICAgICAgcmV0dXJuICR0aW1lb3V0KGZuLCAwLCBmYWxzZSk7DQotICAgICAgfTsNCi0gIH1dOw0KLX0NCi0NCi0vKiBnbG9iYWwgc3RyaXBIYXNoOiB0cnVlICovDQotDQotLyoqDQotICogISBUaGlzIGlzIGEgcHJpdmF0ZSB1bmRvY3VtZW50ZWQgc2VydmljZSAhDQotICoNCi0gKiBAbmFtZSAkYnJvd3Nlcg0KLSAqIEByZXF1aXJlcyAkbG9nDQotICogQGRlc2NyaXB0aW9uDQotICogVGhpcyBvYmplY3QgaGFzIHR3byBnb2FsczoNCi0gKg0KLSAqIC0gaGlkZSBhbGwgdGhlIGdsb2JhbCBzdGF0ZSBpbiB0aGUgYnJvd3NlciBjYXVzZWQgYnkgdGhlIHdpbmRvdyBvYmplY3QNCi0gKiAtIGFic3RyYWN0IGF3YXkgYWxsIHRoZSBicm93c2VyIHNwZWNpZmljIGZlYXR1cmVzIGFuZCBpbmNvbnNpc3RlbmNpZXMNCi0gKg0KLSAqIEZvciB0ZXN0cyB3ZSBwcm92aWRlIHtAbGluayBuZ01vY2suJGJyb3dzZXIgbW9jayBpbXBsZW1lbnRhdGlvbn0gb2YgdGhlIGAkYnJvd3NlcmANCi0gKiBzZXJ2aWNlLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgY29udmVuaWVudCB0ZXN0aW5nIG9mIHRoZSBhcHBsaWNhdGlvbiB3aXRob3V0IHRoZSBpbnRlcmFjdGlvbiB3aXRoDQotICogdGhlIHJlYWwgYnJvd3NlciBhcGlzLg0KLSAqLw0KLS8qKg0KLSAqIEBwYXJhbSB7b2JqZWN0fSB3aW5kb3cgVGhlIGdsb2JhbCB3aW5kb3cgb2JqZWN0Lg0KLSAqIEBwYXJhbSB7b2JqZWN0fSBkb2N1bWVudCBqUXVlcnkgd3JhcHBlZCBkb2N1bWVudC4NCi0gKiBAcGFyYW0ge29iamVjdH0gJGxvZyB3aW5kb3cuY29uc29sZSBvciBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBpbnRlcmZhY2UuDQotICogQHBhcmFtIHtvYmplY3R9ICRzbmlmZmVyICRzbmlmZmVyIHNlcnZpY2UNCi0gKi8NCi1mdW5jdGlvbiBCcm93c2VyKHdpbmRvdywgZG9jdW1lbnQsICRsb2csICRzbmlmZmVyKSB7DQotICB2YXIgc2VsZiA9IHRoaXMsDQotICAgICAgcmF3RG9jdW1lbnQgPSBkb2N1bWVudFswXSwNCi0gICAgICBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbiwNCi0gICAgICBoaXN0b3J5ID0gd2luZG93Lmhpc3RvcnksDQotICAgICAgc2V0VGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0LA0KLSAgICAgIGNsZWFyVGltZW91dCA9IHdpbmRvdy5jbGVhclRpbWVvdXQsDQotICAgICAgcGVuZGluZ0RlZmVySWRzID0ge307DQotDQotICBzZWxmLmlzTW9jayA9IGZhbHNlOw0KLQ0KLSAgdmFyIG91dHN0YW5kaW5nUmVxdWVzdENvdW50ID0gMDsNCi0gIHZhciBvdXRzdGFuZGluZ1JlcXVlc3RDYWxsYmFja3MgPSBbXTsNCi0NCi0gIC8vIFRPRE8odm9qdGEpOiByZW1vdmUgdGhpcyB0ZW1wb3JhcnkgYXBpDQotICBzZWxmLiQkY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3QgPSBjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdDsNCi0gIHNlbGYuJCRpbmNPdXRzdGFuZGluZ1JlcXVlc3RDb3VudCA9IGZ1bmN0aW9uKCkgeyBvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCsrOyB9Ow0KLQ0KLSAgLyoqDQotICAgKiBFeGVjdXRlcyB0aGUgYGZuYCBmdW5jdGlvbihzdXBwb3J0cyBjdXJyeWluZykgYW5kIGRlY3JlbWVudHMgdGhlIGBvdXRzdGFuZGluZ1JlcXVlc3RDYWxsYmFja3NgDQotICAgKiBjb3VudGVyLiBJZiB0aGUgY291bnRlciByZWFjaGVzIDAsIGFsbCB0aGUgYG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrc2AgYXJlIGV4ZWN1dGVkLg0KLSAgICovDQotICBmdW5jdGlvbiBjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdChmbikgew0KLSAgICB0cnkgew0KLSAgICAgIGZuLmFwcGx5KG51bGwsIHNsaWNlQXJncyhhcmd1bWVudHMsIDEpKTsNCi0gICAgfSBmaW5hbGx5IHsNCi0gICAgICBvdXRzdGFuZGluZ1JlcXVlc3RDb3VudC0tOw0KLSAgICAgIGlmIChvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCA9PT0gMCkgew0KLSAgICAgICAgd2hpbGUgKG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrcy5sZW5ndGgpIHsNCi0gICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBvdXRzdGFuZGluZ1JlcXVlc3RDYWxsYmFja3MucG9wKCkoKTsNCi0gICAgICAgICAgfSBjYXRjaCAoZSkgew0KLSAgICAgICAgICAgICRsb2cuZXJyb3IoZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGdldEhhc2godXJsKSB7DQotICAgIHZhciBpbmRleCA9IHVybC5pbmRleE9mKCcjJyk7DQotICAgIHJldHVybiBpbmRleCA9PT0gLTEgPyAnJyA6IHVybC5zdWJzdHIoaW5kZXggKyAxKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogQHByaXZhdGUNCi0gICAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIHVzZWQgb25seSBieSBzY2VuYXJpbyBydW5uZXINCi0gICAqIFRPRE8odm9qdGEpOiBwcmVmaXggdGhpcyBtZXRob2Qgd2l0aCAkJCA/DQotICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBubyBvdXRzdGFuZGluZyByZXF1ZXN0DQotICAgKi8NCi0gIHNlbGYubm90aWZ5V2hlbk5vT3V0c3RhbmRpbmdSZXF1ZXN0cyA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQotICAgIC8vIGZvcmNlIGJyb3dzZXIgdG8gZXhlY3V0ZSBhbGwgcG9sbEZucyAtIHRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgY29va2llcyBhbmQgb3RoZXIgcG9sbGVycyBmaXJlDQotICAgIC8vIGF0IHNvbWUgZGV0ZXJtaW5pc3RpYyB0aW1lIGluIHJlc3BlY3QgdG8gdGhlIHRlc3QgcnVubmVyJ3MgYWN0aW9ucy4gTGVhdmluZyB0aGluZ3MgdXAgdG8gdGhlDQotICAgIC8vIHJlZ3VsYXIgcG9sbGVyIHdvdWxkIHJlc3VsdCBpbiBmbGFreSB0ZXN0cy4NCi0gICAgZm9yRWFjaChwb2xsRm5zLCBmdW5jdGlvbihwb2xsRm4pIHsgcG9sbEZuKCk7IH0pOw0KLQ0KLSAgICBpZiAob3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPT09IDApIHsNCi0gICAgICBjYWxsYmFjaygpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotICAvLyBQb2xsIFdhdGNoZXIgQVBJDQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLSAgdmFyIHBvbGxGbnMgPSBbXSwNCi0gICAgICBwb2xsVGltZW91dDsNCi0NCi0gIC8qKg0KLSAgICogQG5hbWUgJGJyb3dzZXIjYWRkUG9sbEZuDQotICAgKg0KLSAgICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBQb2xsIGZ1bmN0aW9uIHRvIGFkZA0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogQWRkcyBhIGZ1bmN0aW9uIHRvIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IHBvbGxlciBwZXJpb2RpY2FsbHkgZXhlY3V0ZXMsDQotICAgKiBhbmQgc3RhcnRzIHBvbGxpbmcgaWYgbm90IHN0YXJ0ZWQgeWV0Lg0KLSAgICoNCi0gICAqIEByZXR1cm5zIHtmdW5jdGlvbigpfSB0aGUgYWRkZWQgZnVuY3Rpb24NCi0gICAqLw0KLSAgc2VsZi5hZGRQb2xsRm4gPSBmdW5jdGlvbihmbikgew0KLSAgICBpZiAoaXNVbmRlZmluZWQocG9sbFRpbWVvdXQpKSBzdGFydFBvbGxlcigxMDAsIHNldFRpbWVvdXQpOw0KLSAgICBwb2xsRm5zLnB1c2goZm4pOw0KLSAgICByZXR1cm4gZm47DQotICB9Ow0KLQ0KLSAgLyoqDQotICAgKiBAcGFyYW0ge251bWJlcn0gaW50ZXJ2YWwgSG93IG9mdGVuIHNob3VsZCBicm93c2VyIGNhbGwgcG9sbCBmdW5jdGlvbnMgKG1zKQ0KLSAgICogQHBhcmFtIHtmdW5jdGlvbigpfSBzZXRUaW1lb3V0IFJlZmVyZW5jZSB0byBhIHJlYWwgb3IgZmFrZSBgc2V0VGltZW91dGAgZnVuY3Rpb24uDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBDb25maWd1cmVzIHRoZSBwb2xsZXIgdG8gcnVuIGluIHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWxzLCB1c2luZyB0aGUgc3BlY2lmaWVkDQotICAgKiBzZXRUaW1lb3V0IGZuIGFuZCBraWNrcyBpdCBvZmYuDQotICAgKi8NCi0gIGZ1bmN0aW9uIHN0YXJ0UG9sbGVyKGludGVydmFsLCBzZXRUaW1lb3V0KSB7DQotICAgIChmdW5jdGlvbiBjaGVjaygpIHsNCi0gICAgICBmb3JFYWNoKHBvbGxGbnMsIGZ1bmN0aW9uKHBvbGxGbikgeyBwb2xsRm4oKTsgfSk7DQotICAgICAgcG9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrLCBpbnRlcnZhbCk7DQotICAgIH0pKCk7DQotICB9DQotDQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLSAgLy8gVVJMIEFQSQ0KLSAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi0gIHZhciBjYWNoZWRTdGF0ZSwgbGFzdEhpc3RvcnlTdGF0ZSwNCi0gICAgICBsYXN0QnJvd3NlclVybCA9IGxvY2F0aW9uLmhyZWYsDQotICAgICAgYmFzZUVsZW1lbnQgPSBkb2N1bWVudC5maW5kKCdiYXNlJyksDQotICAgICAgcmVsb2FkTG9jYXRpb24gPSBudWxsOw0KLQ0KLSAgY2FjaGVTdGF0ZSgpOw0KLSAgbGFzdEhpc3RvcnlTdGF0ZSA9IGNhY2hlZFN0YXRlOw0KLQ0KLSAgLyoqDQotICAgKiBAbmFtZSAkYnJvd3NlciN1cmwNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIEdFVFRFUjoNCi0gICAqIFdpdGhvdXQgYW55IGFyZ3VtZW50LCB0aGlzIG1ldGhvZCBqdXN0IHJldHVybnMgY3VycmVudCB2YWx1ZSBvZiBsb2NhdGlvbi5ocmVmLg0KLSAgICoNCi0gICAqIFNFVFRFUjoNCi0gICAqIFdpdGggYXQgbGVhc3Qgb25lIGFyZ3VtZW50LCB0aGlzIG1ldGhvZCBzZXRzIHVybCB0byBuZXcgdmFsdWUuDQotICAgKiBJZiBodG1sNSBoaXN0b3J5IGFwaSBzdXBwb3J0ZWQsIHB1c2hTdGF0ZS9yZXBsYWNlU3RhdGUgaXMgdXNlZCwgb3RoZXJ3aXNlDQotICAgKiBsb2NhdGlvbi5ocmVmL2xvY2F0aW9uLnJlcGxhY2UgaXMgdXNlZC4NCi0gICAqIFJldHVybnMgaXRzIG93biBpbnN0YW5jZSB0byBhbGxvdyBjaGFpbmluZw0KLSAgICoNCi0gICAqIE5PVEU6IHRoaXMgYXBpIGlzIGludGVuZGVkIGZvciB1c2Ugb25seSBieSB0aGUgJGxvY2F0aW9uIHNlcnZpY2UuIFBsZWFzZSB1c2UgdGhlDQotICAgKiB7QGxpbmsgbmcuJGxvY2F0aW9uICRsb2NhdGlvbiBzZXJ2aWNlfSB0byBjaGFuZ2UgdXJsLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgTmV3IHVybCAod2hlbiB1c2VkIGFzIHNldHRlcikNCi0gICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlcGxhY2UgU2hvdWxkIG5ldyB1cmwgcmVwbGFjZSBjdXJyZW50IGhpc3RvcnkgcmVjb3JkPw0KLSAgICogQHBhcmFtIHtvYmplY3Q9fSBzdGF0ZSBvYmplY3QgdG8gdXNlIHdpdGggcHVzaFN0YXRlL3JlcGxhY2VTdGF0ZQ0KLSAgICovDQotICBzZWxmLnVybCA9IGZ1bmN0aW9uKHVybCwgcmVwbGFjZSwgc3RhdGUpIHsNCi0gICAgLy8gSW4gbW9kZXJuIGJyb3dzZXJzIGBoaXN0b3J5LnN0YXRlYCBpcyBgbnVsbGAgYnkgZGVmYXVsdDsgdHJlYXRpbmcgaXQgc2VwYXJhdGVseQ0KLSAgICAvLyBmcm9tIGB1bmRlZmluZWRgIHdvdWxkIGNhdXNlIGAkYnJvd3Nlci51cmwoJy9mb28nKWAgdG8gY2hhbmdlIGBoaXN0b3J5LnN0YXRlYA0KLSAgICAvLyB0byB1bmRlZmluZWQgdmlhIGBwdXNoU3RhdGVgLiBJbnN0ZWFkLCBsZXQncyBjaGFuZ2UgYHVuZGVmaW5lZGAgdG8gYG51bGxgIGhlcmUuDQotICAgIGlmIChpc1VuZGVmaW5lZChzdGF0ZSkpIHsNCi0gICAgICBzdGF0ZSA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgLy8gQW5kcm9pZCBCcm93c2VyIEJGQ2FjaGUgY2F1c2VzIGxvY2F0aW9uLCBoaXN0b3J5IHJlZmVyZW5jZSB0byBiZWNvbWUgc3RhbGUuDQotICAgIGlmIChsb2NhdGlvbiAhPT0gd2luZG93LmxvY2F0aW9uKSBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjsNCi0gICAgaWYgKGhpc3RvcnkgIT09IHdpbmRvdy5oaXN0b3J5KSBoaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7DQotDQotICAgIC8vIHNldHRlcg0KLSAgICBpZiAodXJsKSB7DQotICAgICAgdmFyIHNhbWVTdGF0ZSA9IGxhc3RIaXN0b3J5U3RhdGUgPT09IHN0YXRlOw0KLQ0KLSAgICAgIC8vIERvbid0IGNoYW5nZSBhbnl0aGluZyBpZiBwcmV2aW91cyBhbmQgY3VycmVudCBVUkxzIGFuZCBzdGF0ZXMgbWF0Y2guIFRoaXMgYWxzbyBwcmV2ZW50cw0KLSAgICAgIC8vIElFPDEwIGZyb20gZ2V0dGluZyBpbnRvIHJlZGlyZWN0IGxvb3Agd2hlbiBpbiBMb2NhdGlvbkhhc2hiYW5nSW5IdG1sNVVybCBtb2RlLg0KLSAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2NvbW1pdC9mZmIyNzAxDQotICAgICAgaWYgKGxhc3RCcm93c2VyVXJsID09PSB1cmwgJiYgKCEkc25pZmZlci5oaXN0b3J5IHx8IHNhbWVTdGF0ZSkpIHsNCi0gICAgICAgIHJldHVybiBzZWxmOw0KLSAgICAgIH0NCi0gICAgICB2YXIgc2FtZUJhc2UgPSBsYXN0QnJvd3NlclVybCAmJiBzdHJpcEhhc2gobGFzdEJyb3dzZXJVcmwpID09PSBzdHJpcEhhc2godXJsKTsNCi0gICAgICBsYXN0QnJvd3NlclVybCA9IHVybDsNCi0gICAgICBsYXN0SGlzdG9yeVN0YXRlID0gc3RhdGU7DQotICAgICAgLy8gRG9uJ3QgdXNlIGhpc3RvcnkgQVBJIGlmIG9ubHkgdGhlIGhhc2ggY2hhbmdlZA0KLSAgICAgIC8vIGR1ZSB0byBhIGJ1ZyBpbiBJRTEwL0lFMTEgd2hpY2ggbGVhZHMNCi0gICAgICAvLyB0byBub3QgZmlyaW5nIGEgYGhhc2hjaGFuZ2VgIG5vciBgcG9wc3RhdGVgIGV2ZW50DQotICAgICAgLy8gaW4gc29tZSBjYXNlcyAoc2VlICM5MTQzKS4NCi0gICAgICBpZiAoJHNuaWZmZXIuaGlzdG9yeSAmJiAoIXNhbWVCYXNlIHx8ICFzYW1lU3RhdGUpKSB7DQotICAgICAgICBoaXN0b3J5W3JlcGxhY2UgPyAncmVwbGFjZVN0YXRlJyA6ICdwdXNoU3RhdGUnXShzdGF0ZSwgJycsIHVybCk7DQotICAgICAgICBjYWNoZVN0YXRlKCk7DQotICAgICAgICAvLyBEbyB0aGUgYXNzaWdubWVudCBhZ2FpbiBzbyB0aGF0IHRob3NlIHR3byB2YXJpYWJsZXMgYXJlIHJlZmVyZW50aWFsbHkgaWRlbnRpY2FsLg0KLSAgICAgICAgbGFzdEhpc3RvcnlTdGF0ZSA9IGNhY2hlZFN0YXRlOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAoIXNhbWVCYXNlKSB7DQotICAgICAgICAgIHJlbG9hZExvY2F0aW9uID0gdXJsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHJlcGxhY2UpIHsNCi0gICAgICAgICAgbG9jYXRpb24ucmVwbGFjZSh1cmwpOw0KLSAgICAgICAgfSBlbHNlIGlmICghc2FtZUJhc2UpIHsNCi0gICAgICAgICAgbG9jYXRpb24uaHJlZiA9IHVybDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIGxvY2F0aW9uLmhhc2ggPSBnZXRIYXNoKHVybCk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBzZWxmOw0KLSAgICAvLyBnZXR0ZXINCi0gICAgfSBlbHNlIHsNCi0gICAgICAvLyAtIHJlbG9hZExvY2F0aW9uIGlzIG5lZWRlZCBhcyBicm93c2VycyBkb24ndCBhbGxvdyB0byByZWFkIG91dA0KLSAgICAgIC8vICAgdGhlIG5ldyBsb2NhdGlvbi5ocmVmIGlmIGEgcmVsb2FkIGhhcHBlbmVkLg0KLSAgICAgIC8vIC0gdGhlIHJlcGxhY2VtZW50IGlzIGEgd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDA3MTcyDQotICAgICAgcmV0dXJuIHJlbG9hZExvY2F0aW9uIHx8IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvJTI3L2csIiciKTsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQG5hbWUgJGJyb3dzZXIjc3RhdGUNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFRoaXMgbWV0aG9kIGlzIGEgZ2V0dGVyLg0KLSAgICoNCi0gICAqIFJldHVybiBoaXN0b3J5LnN0YXRlIG9yIG51bGwgaWYgaGlzdG9yeS5zdGF0ZSBpcyB1bmRlZmluZWQuDQotICAgKg0KLSAgICogQHJldHVybnMge29iamVjdH0gc3RhdGUNCi0gICAqLw0KLSAgc2VsZi5zdGF0ZSA9IGZ1bmN0aW9uKCkgew0KLSAgICByZXR1cm4gY2FjaGVkU3RhdGU7DQotICB9Ow0KLQ0KLSAgdmFyIHVybENoYW5nZUxpc3RlbmVycyA9IFtdLA0KLSAgICAgIHVybENoYW5nZUluaXQgPSBmYWxzZTsNCi0NCi0gIGZ1bmN0aW9uIGNhY2hlU3RhdGVBbmRGaXJlVXJsQ2hhbmdlKCkgew0KLSAgICBjYWNoZVN0YXRlKCk7DQotICAgIGZpcmVVcmxDaGFuZ2UoKTsNCi0gIH0NCi0NCi0gIC8vIFRoaXMgdmFyaWFibGUgc2hvdWxkIGJlIHVzZWQgKm9ubHkqIGluc2lkZSB0aGUgY2FjaGVTdGF0ZSBmdW5jdGlvbi4NCi0gIHZhciBsYXN0Q2FjaGVkU3RhdGUgPSBudWxsOw0KLSAgZnVuY3Rpb24gY2FjaGVTdGF0ZSgpIHsNCi0gICAgLy8gVGhpcyBzaG91bGQgYmUgdGhlIG9ubHkgcGxhY2UgaW4gJGJyb3dzZXIgd2hlcmUgYGhpc3Rvcnkuc3RhdGVgIGlzIHJlYWQuDQotICAgIGNhY2hlZFN0YXRlID0gd2luZG93Lmhpc3Rvcnkuc3RhdGU7DQotICAgIGNhY2hlZFN0YXRlID0gaXNVbmRlZmluZWQoY2FjaGVkU3RhdGUpID8gbnVsbCA6IGNhY2hlZFN0YXRlOw0KLQ0KLSAgICAvLyBQcmV2ZW50IGNhbGxiYWNrcyBmbyBmaXJlIHR3aWNlIGlmIGJvdGggaGFzaGNoYW5nZSAmIHBvcHN0YXRlIHdlcmUgZmlyZWQuDQotICAgIGlmIChlcXVhbHMoY2FjaGVkU3RhdGUsIGxhc3RDYWNoZWRTdGF0ZSkpIHsNCi0gICAgICBjYWNoZWRTdGF0ZSA9IGxhc3RDYWNoZWRTdGF0ZTsNCi0gICAgfQ0KLSAgICBsYXN0Q2FjaGVkU3RhdGUgPSBjYWNoZWRTdGF0ZTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGZpcmVVcmxDaGFuZ2UoKSB7DQotICAgIGlmIChsYXN0QnJvd3NlclVybCA9PT0gc2VsZi51cmwoKSAmJiBsYXN0SGlzdG9yeVN0YXRlID09PSBjYWNoZWRTdGF0ZSkgew0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICBsYXN0QnJvd3NlclVybCA9IHNlbGYudXJsKCk7DQotICAgIGxhc3RIaXN0b3J5U3RhdGUgPSBjYWNoZWRTdGF0ZTsNCi0gICAgZm9yRWFjaCh1cmxDaGFuZ2VMaXN0ZW5lcnMsIGZ1bmN0aW9uKGxpc3RlbmVyKSB7DQotICAgICAgbGlzdGVuZXIoc2VsZi51cmwoKSwgY2FjaGVkU3RhdGUpOw0KLSAgICB9KTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogQG5hbWUgJGJyb3dzZXIjb25VcmxDaGFuZ2UNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFJlZ2lzdGVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQsIHdoZW4gdXJsIGNoYW5nZXMuDQotICAgKg0KLSAgICogSXQncyBvbmx5IGNhbGxlZCB3aGVuIHRoZSB1cmwgaXMgY2hhbmdlZCBmcm9tIG91dHNpZGUgb2YgYW5ndWxhcjoNCi0gICAqIC0gdXNlciB0eXBlcyBkaWZmZXJlbnQgdXJsIGludG8gYWRkcmVzcyBiYXINCi0gICAqIC0gdXNlciBjbGlja3Mgb24gaGlzdG9yeSAoZm9yd2FyZC9iYWNrKSBidXR0b24NCi0gICAqIC0gdXNlciBjbGlja3Mgb24gYSBsaW5rDQotICAgKg0KLSAgICogSXQncyBub3QgY2FsbGVkIHdoZW4gdXJsIGlzIGNoYW5nZWQgYnkgJGJyb3dzZXIudXJsKCkgbWV0aG9kDQotICAgKg0KLSAgICogVGhlIGxpc3RlbmVyIGdldHMgY2FsbGVkIHdpdGggbmV3IHVybCBhcyBwYXJhbWV0ZXIuDQotICAgKg0KLSAgICogTk9URTogdGhpcyBhcGkgaXMgaW50ZW5kZWQgZm9yIHVzZSBvbmx5IGJ5IHRoZSAkbG9jYXRpb24gc2VydmljZS4gUGxlYXNlIHVzZSB0aGUNCi0gICAqIHtAbGluayBuZy4kbG9jYXRpb24gJGxvY2F0aW9uIHNlcnZpY2V9IHRvIG1vbml0b3IgdXJsIGNoYW5nZXMgaW4gYW5ndWxhciBhcHBzLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKX0gbGlzdGVuZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdXJsIGNoYW5nZXMuDQotICAgKiBAcmV0dXJuIHtmdW5jdGlvbihzdHJpbmcpfSBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVyIGZuIC0gaGFuZHkgaWYgdGhlIGZuIGlzIGFub255bW91cy4NCi0gICAqLw0KLSAgc2VsZi5vblVybENoYW5nZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQotICAgIC8vIFRPRE8odm9qdGEpOiByZWZhY3RvciB0byB1c2Ugbm9kZSdzIHN5bnRheCBmb3IgZXZlbnRzDQotICAgIGlmICghdXJsQ2hhbmdlSW5pdCkgew0KLSAgICAgIC8vIFdlIGxpc3RlbiBvbiBib3RoIChoYXNoY2hhbmdlL3BvcHN0YXRlKSB3aGVuIGF2YWlsYWJsZSwgYXMgc29tZSBicm93c2VycyAoZS5nLiBPcGVyYSkNCi0gICAgICAvLyBkb24ndCBmaXJlIHBvcHN0YXRlIHdoZW4gdXNlciBjaGFuZ2UgdGhlIGFkZHJlc3MgYmFyIGFuZCBkb24ndCBmaXJlIGhhc2hjaGFuZ2Ugd2hlbiB1cmwNCi0gICAgICAvLyBjaGFuZ2VkIGJ5IHB1c2gvcmVwbGFjZVN0YXRlDQotDQotICAgICAgLy8gaHRtbDUgaGlzdG9yeSBhcGkgLSBwb3BzdGF0ZSBldmVudA0KLSAgICAgIGlmICgkc25pZmZlci5oaXN0b3J5KSBqcUxpdGUod2luZG93KS5vbigncG9wc3RhdGUnLCBjYWNoZVN0YXRlQW5kRmlyZVVybENoYW5nZSk7DQotICAgICAgLy8gaGFzaGNoYW5nZSBldmVudA0KLSAgICAgIGpxTGl0ZSh3aW5kb3cpLm9uKCdoYXNoY2hhbmdlJywgY2FjaGVTdGF0ZUFuZEZpcmVVcmxDaGFuZ2UpOw0KLQ0KLSAgICAgIHVybENoYW5nZUluaXQgPSB0cnVlOw0KLSAgICB9DQotDQotICAgIHVybENoYW5nZUxpc3RlbmVycy5wdXNoKGNhbGxiYWNrKTsNCi0gICAgcmV0dXJuIGNhbGxiYWNrOw0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHVybCBoYXMgY2hhbmdlZCBvdXRzaWRlIG9mIEFuZ3VsYXIuDQotICAgKiBOZWVkcyB0byBiZSBleHBvcnRlZCB0byBiZSBhYmxlIHRvIGNoZWNrIGZvciBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGRvbmUgaW4gc3luYywNCi0gICAqIGFzIGhhc2hjaGFuZ2UvcG9wc3RhdGUgZXZlbnRzIGZpcmUgaW4gYXN5bmMuDQotICAgKi8NCi0gIHNlbGYuJCRjaGVja1VybENoYW5nZSA9IGZpcmVVcmxDaGFuZ2U7DQotDQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLSAgLy8gTWlzYyBBUEkNCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotDQotICAvKioNCi0gICAqIEBuYW1lICRicm93c2VyI2Jhc2VIcmVmDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBSZXR1cm5zIGN1cnJlbnQgPGJhc2UgaHJlZj4NCi0gICAqIChhbHdheXMgcmVsYXRpdmUgLSB3aXRob3V0IGRvbWFpbikNCi0gICAqDQotICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY3VycmVudCBiYXNlIGhyZWYNCi0gICAqLw0KLSAgc2VsZi5iYXNlSHJlZiA9IGZ1bmN0aW9uKCkgew0KLSAgICB2YXIgaHJlZiA9IGJhc2VFbGVtZW50LmF0dHIoJ2hyZWYnKTsNCi0gICAgcmV0dXJuIGhyZWYgPyBocmVmLnJlcGxhY2UoL14oaHR0cHM/XDopP1wvXC9bXlwvXSovLCAnJykgOiAnJzsNCi0gIH07DQotDQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLSAgLy8gQ29va2llcyBBUEkNCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotICB2YXIgbGFzdENvb2tpZXMgPSB7fTsNCi0gIHZhciBsYXN0Q29va2llU3RyaW5nID0gJyc7DQotICB2YXIgY29va2llUGF0aCA9IHNlbGYuYmFzZUhyZWYoKTsNCi0NCi0gIGZ1bmN0aW9uIHNhZmVEZWNvZGVVUklDb21wb25lbnQoc3RyKSB7DQotICAgIHRyeSB7DQotICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIpOw0KLSAgICB9IGNhdGNoIChlKSB7DQotICAgICAgcmV0dXJuIHN0cjsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBAbmFtZSAkYnJvd3NlciNjb29raWVzDQotICAgKg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIENvb2tpZSBuYW1lDQotICAgKiBAcGFyYW0ge3N0cmluZz19IHZhbHVlIENvb2tpZSB2YWx1ZQ0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogVGhlIGNvb2tpZXMgbWV0aG9kIHByb3ZpZGVzIGEgJ3ByaXZhdGUnIGxvdyBsZXZlbCBhY2Nlc3MgdG8gYnJvd3NlciBjb29raWVzLg0KLSAgICogSXQgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgZGlyZWN0bHksIHVzZSB0aGUgJGNvb2tpZSBzZXJ2aWNlIGluc3RlYWQuDQotICAgKg0KLSAgICogVGhlIHJldHVybiB2YWx1ZXMgdmFyeSBkZXBlbmRpbmcgb24gdGhlIGFyZ3VtZW50cyB0aGF0IHRoZSBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIGFzIGZvbGxvd3M6DQotICAgKg0KLSAgICogLSBjb29raWVzKCkgLT4gaGFzaCBvZiBhbGwgY29va2llcywgdGhpcyBpcyBOT1QgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbCBzdGF0ZSwgc28gZG8gbm90IG1vZGlmeQ0KLSAgICogICBpdA0KLSAgICogLSBjb29raWVzKG5hbWUsIHZhbHVlKSAtPiBzZXQgbmFtZSB0byB2YWx1ZSwgaWYgdmFsdWUgaXMgdW5kZWZpbmVkIGRlbGV0ZSB0aGUgY29va2llDQotICAgKiAtIGNvb2tpZXMobmFtZSkgLT4gdGhlIHNhbWUgYXMgKG5hbWUsIHVuZGVmaW5lZCkgPT0gREVMRVRFUyAobm8gb25lIGNhbGxzIGl0IHJpZ2h0IG5vdyB0aGF0DQotICAgKiAgIHdheSkNCi0gICAqDQotICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIYXNoIG9mIGFsbCBjb29raWVzIChpZiBjYWxsZWQgd2l0aG91dCBhbnkgcGFyYW1ldGVyKQ0KLSAgICovDQotICBzZWxmLmNvb2tpZXMgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KLSAgICB2YXIgY29va2llTGVuZ3RoLCBjb29raWVBcnJheSwgY29va2llLCBpLCBpbmRleDsNCi0NCi0gICAgaWYgKG5hbWUpIHsNCi0gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgew0KLSAgICAgICAgcmF3RG9jdW1lbnQuY29va2llID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgIj07cGF0aD0iICsgY29va2llUGF0aCArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiO2V4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQiOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7DQotICAgICAgICAgIGNvb2tpZUxlbmd0aCA9IChyYXdEb2N1bWVudC5jb29raWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7cGF0aD0nICsgY29va2llUGF0aCkubGVuZ3RoICsgMTsNCi0NCi0gICAgICAgICAgLy8gcGVyIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIxMDkudHh0IGJyb3dzZXIgbXVzdCBhbGxvdyBhdCBtaW5pbXVtOg0KLSAgICAgICAgICAvLyAtIDMwMCBjb29raWVzDQotICAgICAgICAgIC8vIC0gMjAgY29va2llcyBwZXIgdW5pcXVlIGRvbWFpbg0KLSAgICAgICAgICAvLyAtIDQwOTYgYnl0ZXMgcGVyIGNvb2tpZQ0KLSAgICAgICAgICBpZiAoY29va2llTGVuZ3RoID4gNDA5Nikgew0KLSAgICAgICAgICAgICRsb2cud2FybigiQ29va2llICciICsgbmFtZSArDQotICAgICAgICAgICAgICAiJyBwb3NzaWJseSBub3Qgc2V0IG9yIG92ZXJmbG93ZWQgYmVjYXVzZSBpdCB3YXMgdG9vIGxhcmdlICgiICsNCi0gICAgICAgICAgICAgIGNvb2tpZUxlbmd0aCArICIgPiA0MDk2IGJ5dGVzKSEiKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICBpZiAocmF3RG9jdW1lbnQuY29va2llICE9PSBsYXN0Q29va2llU3RyaW5nKSB7DQotICAgICAgICBsYXN0Q29va2llU3RyaW5nID0gcmF3RG9jdW1lbnQuY29va2llOw0KLSAgICAgICAgY29va2llQXJyYXkgPSBsYXN0Q29va2llU3RyaW5nLnNwbGl0KCI7ICIpOw0KLSAgICAgICAgbGFzdENvb2tpZXMgPSB7fTsNCi0NCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29raWVBcnJheS5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICBjb29raWUgPSBjb29raWVBcnJheVtpXTsNCi0gICAgICAgICAgaW5kZXggPSBjb29raWUuaW5kZXhPZignPScpOw0KLSAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7IC8vaWdub3JlIG5hbWVsZXNzIGNvb2tpZXMNCi0gICAgICAgICAgICBuYW1lID0gc2FmZURlY29kZVVSSUNvbXBvbmVudChjb29raWUuc3Vic3RyaW5nKDAsIGluZGV4KSk7DQotICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHZhbHVlIHRoYXQgaXMgc2VlbiBmb3IgYSBjb29raWUgaXMgdGhlIG1vc3QNCi0gICAgICAgICAgICAvLyBzcGVjaWZpYyBvbmUuICB2YWx1ZXMgZm9yIHRoZSBzYW1lIGNvb2tpZSBuYW1lIHRoYXQNCi0gICAgICAgICAgICAvLyBmb2xsb3cgYXJlIGZvciBsZXNzIHNwZWNpZmljIHBhdGhzLg0KLSAgICAgICAgICAgIGlmIChsYXN0Q29va2llc1tuYW1lXSA9PT0gdW5kZWZpbmVkKSB7DQotICAgICAgICAgICAgICBsYXN0Q29va2llc1tuYW1lXSA9IHNhZmVEZWNvZGVVUklDb21wb25lbnQoY29va2llLnN1YnN0cmluZyhpbmRleCArIDEpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgcmV0dXJuIGxhc3RDb29raWVzOw0KLSAgICB9DQotICB9Ow0KLQ0KLQ0KLSAgLyoqDQotICAgKiBAbmFtZSAkYnJvd3NlciNkZWZlcg0KLSAgICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBBIGZ1bmN0aW9uLCB3aG8ncyBleGVjdXRpb24gc2hvdWxkIGJlIGRlZmVycmVkLg0KLSAgICogQHBhcmFtIHtudW1iZXI9fSBbZGVsYXk9MF0gb2YgbWlsbGlzZWNvbmRzIHRvIGRlZmVyIHRoZSBmdW5jdGlvbiBleGVjdXRpb24uDQotICAgKiBAcmV0dXJucyB7Kn0gRGVmZXJJZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNhbmNlbCB0aGUgdGFzayB2aWEgYCRicm93c2VyLmRlZmVyLmNhbmNlbCgpYC4NCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIEV4ZWN1dGVzIGEgZm4gYXN5bmNocm9ub3VzbHkgdmlhIGBzZXRUaW1lb3V0KGZuLCBkZWxheSlgLg0KLSAgICoNCi0gICAqIFVubGlrZSB3aGVuIGNhbGxpbmcgYHNldFRpbWVvdXRgIGRpcmVjdGx5LCBpbiB0ZXN0IHRoaXMgZnVuY3Rpb24gaXMgbW9ja2VkIGFuZCBpbnN0ZWFkIG9mIHVzaW5nDQotICAgKiBgc2V0VGltZW91dGAgaW4gdGVzdHMsIHRoZSBmbnMgYXJlIHF1ZXVlZCBpbiBhbiBhcnJheSwgd2hpY2ggY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZmx1c2hlZA0KLSAgICogdmlhIGAkYnJvd3Nlci5kZWZlci5mbHVzaCgpYC4NCi0gICAqDQotICAgKi8NCi0gIHNlbGYuZGVmZXIgPSBmdW5jdGlvbihmbiwgZGVsYXkpIHsNCi0gICAgdmFyIHRpbWVvdXRJZDsNCi0gICAgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQrKzsNCi0gICAgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCi0gICAgICBkZWxldGUgcGVuZGluZ0RlZmVySWRzW3RpbWVvdXRJZF07DQotICAgICAgY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3QoZm4pOw0KLSAgICB9LCBkZWxheSB8fCAwKTsNCi0gICAgcGVuZGluZ0RlZmVySWRzW3RpbWVvdXRJZF0gPSB0cnVlOw0KLSAgICByZXR1cm4gdGltZW91dElkOw0KLSAgfTsNCi0NCi0NCi0gIC8qKg0KLSAgICogQG5hbWUgJGJyb3dzZXIjZGVmZXIuY2FuY2VsDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBDYW5jZWxzIGEgZGVmZXJyZWQgdGFzayBpZGVudGlmaWVkIHdpdGggYGRlZmVySWRgLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7Kn0gZGVmZXJJZCBUb2tlbiByZXR1cm5lZCBieSB0aGUgYCRicm93c2VyLmRlZmVyYCBmdW5jdGlvbi4NCi0gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdGFzayBoYXNuJ3QgZXhlY3V0ZWQgeWV0IGFuZCB3YXMgc3VjY2Vzc2Z1bGx5DQotICAgKiAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQuDQotICAgKi8NCi0gIHNlbGYuZGVmZXIuY2FuY2VsID0gZnVuY3Rpb24oZGVmZXJJZCkgew0KLSAgICBpZiAocGVuZGluZ0RlZmVySWRzW2RlZmVySWRdKSB7DQotICAgICAgZGVsZXRlIHBlbmRpbmdEZWZlcklkc1tkZWZlcklkXTsNCi0gICAgICBjbGVhclRpbWVvdXQoZGVmZXJJZCk7DQotICAgICAgY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3Qobm9vcCk7DQotICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgfTsNCi0NCi19DQotDQotZnVuY3Rpb24gJEJyb3dzZXJQcm92aWRlcigpIHsNCi0gIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsICckbG9nJywgJyRzbmlmZmVyJywgJyRkb2N1bWVudCcsDQotICAgICAgZnVuY3Rpb24oJHdpbmRvdywgJGxvZywgJHNuaWZmZXIsICRkb2N1bWVudCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBCcm93c2VyKCR3aW5kb3csICRkb2N1bWVudCwgJGxvZywgJHNuaWZmZXIpOw0KLSAgICAgIH1dOw0KLX0NCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICRjYWNoZUZhY3RvcnkNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEZhY3RvcnkgdGhhdCBjb25zdHJ1Y3RzIHtAbGluayAkY2FjaGVGYWN0b3J5LkNhY2hlIENhY2hlfSBvYmplY3RzIGFuZCBnaXZlcyBhY2Nlc3MgdG8NCi0gKiB0aGVtLg0KLSAqDQotICogYGBganMNCi0gKg0KLSAqICB2YXIgY2FjaGUgPSAkY2FjaGVGYWN0b3J5KCdjYWNoZUlkJyk7DQotICogIGV4cGVjdCgkY2FjaGVGYWN0b3J5LmdldCgnY2FjaGVJZCcpKS50b0JlKGNhY2hlKTsNCi0gKiAgZXhwZWN0KCRjYWNoZUZhY3RvcnkuZ2V0KCdub1N1Y2hDYWNoZUlkJykpLm5vdC50b0JlRGVmaW5lZCgpOw0KLSAqDQotICogIGNhY2hlLnB1dCgia2V5IiwgInZhbHVlIik7DQotICogIGNhY2hlLnB1dCgiYW5vdGhlciBrZXkiLCAiYW5vdGhlciB2YWx1ZSIpOw0KLSAqDQotICogIC8vIFdlJ3ZlIHNwZWNpZmllZCBubyBvcHRpb25zIG9uIGNyZWF0aW9uDQotICogIGV4cGVjdChjYWNoZS5pbmZvKCkpLnRvRXF1YWwoe2lkOiAnY2FjaGVJZCcsIHNpemU6IDJ9KTsNCi0gKg0KLSAqIGBgYA0KLSAqDQotICoNCi0gKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVJZCBOYW1lIG9yIGlkIG9mIHRoZSBuZXdseSBjcmVhdGVkIGNhY2hlLg0KLSAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBPcHRpb25zIG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgY2FjaGUgYmVoYXZpb3IuIFByb3BlcnRpZXM6DQotICoNCi0gKiAgIC0gYHtudW1iZXI9fWAgYGNhcGFjaXR5YCDigD8gdHVybnMgdGhlIGNhY2hlIGludG8gTFJVIGNhY2hlLg0KLSAqDQotICogQHJldHVybnMge29iamVjdH0gTmV3bHkgY3JlYXRlZCBjYWNoZSBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHNldCBvZiBtZXRob2RzOg0KLSAqDQotICogLSBge29iamVjdH1gIGBpbmZvKClgIOKAPyBSZXR1cm5zIGlkLCBzaXplLCBhbmQgb3B0aW9ucyBvZiBjYWNoZS4NCi0gKiAtIGB7eyp9fWAgYHB1dCh7c3RyaW5nfSBrZXksIHsqfSB2YWx1ZSlgIOKAPyBQdXRzIGEgbmV3IGtleS12YWx1ZSBwYWlyIGludG8gdGhlIGNhY2hlIGFuZCByZXR1cm5zDQotICogICBpdC4NCi0gKiAtIGB7eyp9fWAgYGdldCh7c3RyaW5nfSBrZXkpYCDigD8gUmV0dXJucyBjYWNoZWQgdmFsdWUgZm9yIGBrZXlgIG9yIHVuZGVmaW5lZCBmb3IgY2FjaGUgbWlzcy4NCi0gKiAtIGB7dm9pZH1gIGByZW1vdmUoe3N0cmluZ30ga2V5KWAg4oA/IFJlbW92ZXMgYSBrZXktdmFsdWUgcGFpciBmcm9tIHRoZSBjYWNoZS4NCi0gKiAtIGB7dm9pZH1gIGByZW1vdmVBbGwoKWAg4oA/IFJlbW92ZXMgYWxsIGNhY2hlZCB2YWx1ZXMuDQotICogLSBge3ZvaWR9YCBgZGVzdHJveSgpYCDigD8gUmVtb3ZlcyByZWZlcmVuY2VzIHRvIHRoaXMgY2FjaGUgZnJvbSAkY2FjaGVGYWN0b3J5Lg0KLSAqDQotICogQGV4YW1wbGUNCi0gICA8ZXhhbXBsZSBtb2R1bGU9ImNhY2hlRXhhbXBsZUFwcCI+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJDYWNoZUNvbnRyb2xsZXIiPg0KLSAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD0ibmV3Q2FjaGVLZXkiIHBsYWNlaG9sZGVyPSJLZXkiPg0KLSAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD0ibmV3Q2FjaGVWYWx1ZSIgcGxhY2Vob2xkZXI9IlZhbHVlIj4NCi0gICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPSJwdXQobmV3Q2FjaGVLZXksIG5ld0NhY2hlVmFsdWUpIj5DYWNoZTwvYnV0dG9uPg0KLQ0KLSAgICAgICAgIDxwIG5nLWlmPSJrZXlzLmxlbmd0aCI+Q2FjaGVkIFZhbHVlczwvcD4NCi0gICAgICAgICA8ZGl2IG5nLXJlcGVhdD0ia2V5IGluIGtleXMiPg0KLSAgICAgICAgICAgPHNwYW4gbmctYmluZD0ia2V5Ij48L3NwYW4+DQotICAgICAgICAgICA8c3Bhbj46IDwvc3Bhbj4NCi0gICAgICAgICAgIDxiIG5nLWJpbmQ9ImNhY2hlLmdldChrZXkpIj48L2I+DQotICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgPHA+Q2FjaGUgSW5mbzwvcD4NCi0gICAgICAgICA8ZGl2IG5nLXJlcGVhdD0iKGtleSwgdmFsdWUpIGluIGNhY2hlLmluZm8oKSI+DQotICAgICAgICAgICA8c3BhbiBuZy1iaW5kPSJrZXkiPjwvc3Bhbj4NCi0gICAgICAgICAgIDxzcGFuPjogPC9zcGFuPg0KLSAgICAgICAgICAgPGIgbmctYmluZD0idmFsdWUiPjwvYj4NCi0gICAgICAgICA8L2Rpdj4NCi0gICAgICAgPC9kaXY+DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPg0KLSAgICAgICBhbmd1bGFyLm1vZHVsZSgnY2FjaGVFeGFtcGxlQXBwJywgW10pLg0KLSAgICAgICAgIGNvbnRyb2xsZXIoJ0NhY2hlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRjYWNoZUZhY3RvcnknLCBmdW5jdGlvbigkc2NvcGUsICRjYWNoZUZhY3RvcnkpIHsNCi0gICAgICAgICAgICRzY29wZS5rZXlzID0gW107DQotICAgICAgICAgICAkc2NvcGUuY2FjaGUgPSAkY2FjaGVGYWN0b3J5KCdjYWNoZUlkJyk7DQotICAgICAgICAgICAkc2NvcGUucHV0ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkgew0KLSAgICAgICAgICAgICBpZiAoJHNjb3BlLmNhY2hlLmdldChrZXkpID09PSB1bmRlZmluZWQpIHsNCi0gICAgICAgICAgICAgICAkc2NvcGUua2V5cy5wdXNoKGtleSk7DQotICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgJHNjb3BlLmNhY2hlLnB1dChrZXksIHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogdmFsdWUpOw0KLSAgICAgICAgICAgfTsNCi0gICAgICAgICB9XSk7DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPg0KLSAgICAgICBwIHsNCi0gICAgICAgICBtYXJnaW46IDEwcHggMCAzcHg7DQotICAgICAgIH0NCi0gICAgIDwvZmlsZT4NCi0gICA8L2V4YW1wbGU+DQotICovDQotZnVuY3Rpb24gJENhY2hlRmFjdG9yeVByb3ZpZGVyKCkgew0KLQ0KLSAgdGhpcy4kZ2V0ID0gZnVuY3Rpb24oKSB7DQotICAgIHZhciBjYWNoZXMgPSB7fTsNCi0NCi0gICAgZnVuY3Rpb24gY2FjaGVGYWN0b3J5KGNhY2hlSWQsIG9wdGlvbnMpIHsNCi0gICAgICBpZiAoY2FjaGVJZCBpbiBjYWNoZXMpIHsNCi0gICAgICAgIHRocm93IG1pbkVycignJGNhY2hlRmFjdG9yeScpKCdpaWQnLCAiQ2FjaGVJZCAnezB9JyBpcyBhbHJlYWR5IHRha2VuISIsIGNhY2hlSWQpOw0KLSAgICAgIH0NCi0NCi0gICAgICB2YXIgc2l6ZSA9IDAsDQotICAgICAgICAgIHN0YXRzID0gZXh0ZW5kKHt9LCBvcHRpb25zLCB7aWQ6IGNhY2hlSWR9KSwNCi0gICAgICAgICAgZGF0YSA9IHt9LA0KLSAgICAgICAgICBjYXBhY2l0eSA9IChvcHRpb25zICYmIG9wdGlvbnMuY2FwYWNpdHkpIHx8IE51bWJlci5NQVhfVkFMVUUsDQotICAgICAgICAgIGxydUhhc2ggPSB7fSwNCi0gICAgICAgICAgZnJlc2hFbmQgPSBudWxsLA0KLSAgICAgICAgICBzdGFsZUVuZCA9IG51bGw7DQotDQotICAgICAgLyoqDQotICAgICAgICogQG5nZG9jIHR5cGUNCi0gICAgICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5LkNhY2hlDQotICAgICAgICoNCi0gICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgKiBBIGNhY2hlIG9iamVjdCB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBkYXRhLCBwcmltYXJpbHkgdXNlZCBieQ0KLSAgICAgICAqIHtAbGluayAkaHR0cCAkaHR0cH0gYW5kIHRoZSB7QGxpbmsgbmcuZGlyZWN0aXZlOnNjcmlwdCBzY3JpcHR9IGRpcmVjdGl2ZSB0byBjYWNoZQ0KLSAgICAgICAqIHRlbXBsYXRlcyBhbmQgb3RoZXIgZGF0YS4NCi0gICAgICAgKg0KLSAgICAgICAqIGBgYGpzDQotICAgICAgICogIGFuZ3VsYXIubW9kdWxlKCdzdXBlckNhY2hlJykNCi0gICAgICAgKiAgICAuZmFjdG9yeSgnc3VwZXJDYWNoZScsIFsnJGNhY2hlRmFjdG9yeScsIGZ1bmN0aW9uKCRjYWNoZUZhY3RvcnkpIHsNCi0gICAgICAgKiAgICAgIHJldHVybiAkY2FjaGVGYWN0b3J5KCdzdXBlci1jYWNoZScpOw0KLSAgICAgICAqICAgIH1dKTsNCi0gICAgICAgKiBgYGANCi0gICAgICAgKg0KLSAgICAgICAqIEV4YW1wbGUgdGVzdDoNCi0gICAgICAgKg0KLSAgICAgICAqIGBgYGpzDQotICAgICAgICogIGl0KCdzaG91bGQgYmVoYXZlIGxpa2UgYSBjYWNoZScsIGluamVjdChmdW5jdGlvbihzdXBlckNhY2hlKSB7DQotICAgICAgICogICAgc3VwZXJDYWNoZS5wdXQoJ2tleScsICd2YWx1ZScpOw0KLSAgICAgICAqICAgIHN1cGVyQ2FjaGUucHV0KCdhbm90aGVyIGtleScsICdhbm90aGVyIHZhbHVlJyk7DQotICAgICAgICoNCi0gICAgICAgKiAgICBleHBlY3Qoc3VwZXJDYWNoZS5pbmZvKCkpLnRvRXF1YWwoew0KLSAgICAgICAqICAgICAgaWQ6ICdzdXBlci1jYWNoZScsDQotICAgICAgICogICAgICBzaXplOiAyDQotICAgICAgICogICAgfSk7DQotICAgICAgICoNCi0gICAgICAgKiAgICBzdXBlckNhY2hlLnJlbW92ZSgnYW5vdGhlciBrZXknKTsNCi0gICAgICAgKiAgICBleHBlY3Qoc3VwZXJDYWNoZS5nZXQoJ2Fub3RoZXIga2V5JykpLnRvQmVVbmRlZmluZWQoKTsNCi0gICAgICAgKg0KLSAgICAgICAqICAgIHN1cGVyQ2FjaGUucmVtb3ZlQWxsKCk7DQotICAgICAgICogICAgZXhwZWN0KHN1cGVyQ2FjaGUuaW5mbygpKS50b0VxdWFsKHsNCi0gICAgICAgKiAgICAgIGlkOiAnc3VwZXItY2FjaGUnLA0KLSAgICAgICAqICAgICAgc2l6ZTogMA0KLSAgICAgICAqICAgIH0pOw0KLSAgICAgICAqICB9KSk7DQotICAgICAgICogYGBgDQotICAgICAgICovDQotICAgICAgcmV0dXJuIGNhY2hlc1tjYWNoZUlkXSA9IHsNCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAgICogQG5hbWUgJGNhY2hlRmFjdG9yeS5DYWNoZSNwdXQNCi0gICAgICAgICAqIEBraW5kIGZ1bmN0aW9uDQotICAgICAgICAgKg0KLSAgICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICAgKiBJbnNlcnRzIGEgbmFtZWQgZW50cnkgaW50byB0aGUge0BsaW5rICRjYWNoZUZhY3RvcnkuQ2FjaGUgQ2FjaGV9IG9iamVjdCB0byBiZQ0KLSAgICAgICAgICogcmV0cmlldmVkIGxhdGVyLCBhbmQgaW5jcmVtZW50aW5nIHRoZSBzaXplIG9mIHRoZSBjYWNoZSBpZiB0aGUga2V5IHdhcyBub3QgYWxyZWFkeQ0KLSAgICAgICAgICogcHJlc2VudCBpbiB0aGUgY2FjaGUuIElmIGJlaGF2aW5nIGxpa2UgYW4gTFJVIGNhY2hlLCBpdCB3aWxsIGFsc28gcmVtb3ZlIHN0YWxlDQotICAgICAgICAgKiBlbnRyaWVzIGZyb20gdGhlIHNldC4NCi0gICAgICAgICAqDQotICAgICAgICAgKiBJdCB3aWxsIG5vdCBpbnNlcnQgdW5kZWZpbmVkIHZhbHVlcyBpbnRvIHRoZSBjYWNoZS4NCi0gICAgICAgICAqDQotICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRoZSBrZXkgdW5kZXIgd2hpY2ggdGhlIGNhY2hlZCBkYXRhIGlzIHN0b3JlZC4NCi0gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgdGhlIHZhbHVlIHRvIHN0b3JlIGFsb25nc2lkZSB0aGUga2V5LiBJZiBpdCBpcyB1bmRlZmluZWQsIHRoZSBrZXkNCi0gICAgICAgICAqICAgIHdpbGwgbm90IGJlIHN0b3JlZC4NCi0gICAgICAgICAqIEByZXR1cm5zIHsqfSB0aGUgdmFsdWUgc3RvcmVkLg0KLSAgICAgICAgICovDQotICAgICAgICBwdXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsNCi0gICAgICAgICAgaWYgKGNhcGFjaXR5IDwgTnVtYmVyLk1BWF9WQUxVRSkgew0KLSAgICAgICAgICAgIHZhciBscnVFbnRyeSA9IGxydUhhc2hba2V5XSB8fCAobHJ1SGFzaFtrZXldID0ge2tleToga2V5fSk7DQotDQotICAgICAgICAgICAgcmVmcmVzaChscnVFbnRyeSk7DQotICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuOw0KLSAgICAgICAgICBpZiAoIShrZXkgaW4gZGF0YSkpIHNpemUrKzsNCi0gICAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7DQotDQotICAgICAgICAgIGlmIChzaXplID4gY2FwYWNpdHkpIHsNCi0gICAgICAgICAgICB0aGlzLnJlbW92ZShzdGFsZUVuZC5rZXkpOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgICAgIH0sDQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGUjZ2V0DQotICAgICAgICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICAgICAgICoNCi0gICAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAgICogUmV0cmlldmVzIG5hbWVkIGRhdGEgc3RvcmVkIGluIHRoZSB7QGxpbmsgJGNhY2hlRmFjdG9yeS5DYWNoZSBDYWNoZX0gb2JqZWN0Lg0KLSAgICAgICAgICoNCi0gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdGhlIGtleSBvZiB0aGUgZGF0YSB0byBiZSByZXRyaWV2ZWQNCi0gICAgICAgICAqIEByZXR1cm5zIHsqfSB0aGUgdmFsdWUgc3RvcmVkLg0KLSAgICAgICAgICovDQotICAgICAgICBnZXQ6IGZ1bmN0aW9uKGtleSkgew0KLSAgICAgICAgICBpZiAoY2FwYWNpdHkgPCBOdW1iZXIuTUFYX1ZBTFVFKSB7DQotICAgICAgICAgICAgdmFyIGxydUVudHJ5ID0gbHJ1SGFzaFtrZXldOw0KLQ0KLSAgICAgICAgICAgIGlmICghbHJ1RW50cnkpIHJldHVybjsNCi0NCi0gICAgICAgICAgICByZWZyZXNoKGxydUVudHJ5KTsNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICByZXR1cm4gZGF0YVtrZXldOw0KLSAgICAgICAgfSwNCi0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAgICogQG5hbWUgJGNhY2hlRmFjdG9yeS5DYWNoZSNyZW1vdmUNCi0gICAgICAgICAqIEBraW5kIGZ1bmN0aW9uDQotICAgICAgICAgKg0KLSAgICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICAgKiBSZW1vdmVzIGFuIGVudHJ5IGZyb20gdGhlIHtAbGluayAkY2FjaGVGYWN0b3J5LkNhY2hlIENhY2hlfSBvYmplY3QuDQotICAgICAgICAgKg0KLSAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSB0aGUga2V5IG9mIHRoZSBlbnRyeSB0byBiZSByZW1vdmVkDQotICAgICAgICAgKi8NCi0gICAgICAgIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7DQotICAgICAgICAgIGlmIChjYXBhY2l0eSA8IE51bWJlci5NQVhfVkFMVUUpIHsNCi0gICAgICAgICAgICB2YXIgbHJ1RW50cnkgPSBscnVIYXNoW2tleV07DQotDQotICAgICAgICAgICAgaWYgKCFscnVFbnRyeSkgcmV0dXJuOw0KLQ0KLSAgICAgICAgICAgIGlmIChscnVFbnRyeSA9PSBmcmVzaEVuZCkgZnJlc2hFbmQgPSBscnVFbnRyeS5wOw0KLSAgICAgICAgICAgIGlmIChscnVFbnRyeSA9PSBzdGFsZUVuZCkgc3RhbGVFbmQgPSBscnVFbnRyeS5uOw0KLSAgICAgICAgICAgIGxpbmsobHJ1RW50cnkubixscnVFbnRyeS5wKTsNCi0NCi0gICAgICAgICAgICBkZWxldGUgbHJ1SGFzaFtrZXldOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIGRlbGV0ZSBkYXRhW2tleV07DQotICAgICAgICAgIHNpemUtLTsNCi0gICAgICAgIH0sDQotDQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGUjcmVtb3ZlQWxsDQotICAgICAgICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICAgICAgICoNCi0gICAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAgICogQ2xlYXJzIHRoZSBjYWNoZSBvYmplY3Qgb2YgYW55IGVudHJpZXMuDQotICAgICAgICAgKi8NCi0gICAgICAgIHJlbW92ZUFsbDogZnVuY3Rpb24oKSB7DQotICAgICAgICAgIGRhdGEgPSB7fTsNCi0gICAgICAgICAgc2l6ZSA9IDA7DQotICAgICAgICAgIGxydUhhc2ggPSB7fTsNCi0gICAgICAgICAgZnJlc2hFbmQgPSBzdGFsZUVuZCA9IG51bGw7DQotICAgICAgICB9LA0KLQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5LkNhY2hlI2Rlc3Ryb3kNCi0gICAgICAgICAqIEBraW5kIGZ1bmN0aW9uDQotICAgICAgICAgKg0KLSAgICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICAgKiBEZXN0cm95cyB0aGUge0BsaW5rICRjYWNoZUZhY3RvcnkuQ2FjaGUgQ2FjaGV9IG9iamVjdCBlbnRpcmVseSwNCi0gICAgICAgICAqIHJlbW92aW5nIGl0IGZyb20gdGhlIHtAbGluayAkY2FjaGVGYWN0b3J5ICRjYWNoZUZhY3Rvcnl9IHNldC4NCi0gICAgICAgICAqLw0KLSAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7DQotICAgICAgICAgIGRhdGEgPSBudWxsOw0KLSAgICAgICAgICBzdGF0cyA9IG51bGw7DQotICAgICAgICAgIGxydUhhc2ggPSBudWxsOw0KLSAgICAgICAgICBkZWxldGUgY2FjaGVzW2NhY2hlSWRdOw0KLSAgICAgICAgfSwNCi0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAgICogQG5hbWUgJGNhY2hlRmFjdG9yeS5DYWNoZSNpbmZvDQotICAgICAgICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICAgICAgICoNCi0gICAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGEgcGFydGljdWxhciB7QGxpbmsgJGNhY2hlRmFjdG9yeS5DYWNoZSBDYWNoZX0uDQotICAgICAgICAgKg0KLSAgICAgICAgICogQHJldHVybnMge29iamVjdH0gYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOg0KLSAgICAgICAgICogICA8dWw+DQotICAgICAgICAgKiAgICAgPGxpPioqaWQqKjogdGhlIGlkIG9mIHRoZSBjYWNoZSBpbnN0YW5jZTwvbGk+DQotICAgICAgICAgKiAgICAgPGxpPioqc2l6ZSoqOiB0aGUgbnVtYmVyIG9mIGVudHJpZXMga2VwdCBpbiB0aGUgY2FjaGUgaW5zdGFuY2U8L2xpPg0KLSAgICAgICAgICogICAgIDxsaT4qKi4uLioqOiBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZyb20gdGhlIG9wdGlvbnMgb2JqZWN0IHdoZW4gY3JlYXRpbmcgdGhlDQotICAgICAgICAgKiAgICAgICBjYWNoZS48L2xpPg0KLSAgICAgICAgICogICA8L3VsPg0KLSAgICAgICAgICovDQotICAgICAgICBpbmZvOiBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgc3RhdHMsIHtzaXplOiBzaXplfSk7DQotICAgICAgICB9DQotICAgICAgfTsNCi0NCi0NCi0gICAgICAvKioNCi0gICAgICAgKiBtYWtlcyB0aGUgYGVudHJ5YCB0aGUgZnJlc2hFbmQgb2YgdGhlIExSVSBsaW5rZWQgbGlzdA0KLSAgICAgICAqLw0KLSAgICAgIGZ1bmN0aW9uIHJlZnJlc2goZW50cnkpIHsNCi0gICAgICAgIGlmIChlbnRyeSAhPSBmcmVzaEVuZCkgew0KLSAgICAgICAgICBpZiAoIXN0YWxlRW5kKSB7DQotICAgICAgICAgICAgc3RhbGVFbmQgPSBlbnRyeTsNCi0gICAgICAgICAgfSBlbHNlIGlmIChzdGFsZUVuZCA9PSBlbnRyeSkgew0KLSAgICAgICAgICAgIHN0YWxlRW5kID0gZW50cnkubjsNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICBsaW5rKGVudHJ5Lm4sIGVudHJ5LnApOw0KLSAgICAgICAgICBsaW5rKGVudHJ5LCBmcmVzaEVuZCk7DQotICAgICAgICAgIGZyZXNoRW5kID0gZW50cnk7DQotICAgICAgICAgIGZyZXNoRW5kLm4gPSBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0NCi0gICAgICAvKioNCi0gICAgICAgKiBiaWRpcmVjdGlvbmFsbHkgbGlua3MgdHdvIGVudHJpZXMgb2YgdGhlIExSVSBsaW5rZWQgbGlzdA0KLSAgICAgICAqLw0KLSAgICAgIGZ1bmN0aW9uIGxpbmsobmV4dEVudHJ5LCBwcmV2RW50cnkpIHsNCi0gICAgICAgIGlmIChuZXh0RW50cnkgIT0gcHJldkVudHJ5KSB7DQotICAgICAgICAgIGlmIChuZXh0RW50cnkpIG5leHRFbnRyeS5wID0gcHJldkVudHJ5OyAvL3Agc3RhbmRzIGZvciBwcmV2aW91cywgJ3ByZXYnIGRpZG4ndCBtaW5pZnkNCi0gICAgICAgICAgaWYgKHByZXZFbnRyeSkgcHJldkVudHJ5Lm4gPSBuZXh0RW50cnk7IC8vbiBzdGFuZHMgZm9yIG5leHQsICduZXh0JyBkaWRuJ3QgbWluaWZ5DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotDQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lICRjYWNoZUZhY3RvcnkjaW5mbw0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGFsbCB0aGUgY2FjaGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQNCi0gICAqDQotICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIGtleS12YWx1ZSBtYXAgb2YgYGNhY2hlSWRgIHRvIHRoZSByZXN1bHQgb2YgY2FsbGluZyBgY2FjaGUjaW5mb2ANCi0gICAqLw0KLSAgICBjYWNoZUZhY3RvcnkuaW5mbyA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHZhciBpbmZvID0ge307DQotICAgICAgZm9yRWFjaChjYWNoZXMsIGZ1bmN0aW9uKGNhY2hlLCBjYWNoZUlkKSB7DQotICAgICAgICBpbmZvW2NhY2hlSWRdID0gY2FjaGUuaW5mbygpOw0KLSAgICAgIH0pOw0KLSAgICAgIHJldHVybiBpbmZvOw0KLSAgICB9Ow0KLQ0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5I2dldA0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogR2V0IGFjY2VzcyB0byBhIGNhY2hlIG9iamVjdCBieSB0aGUgYGNhY2hlSWRgIHVzZWQgd2hlbiBpdCB3YXMgY3JlYXRlZC4NCi0gICAqDQotICAgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVJZCBOYW1lIG9yIGlkIG9mIGEgY2FjaGUgdG8gYWNjZXNzLg0KLSAgICogQHJldHVybnMge29iamVjdH0gQ2FjaGUgb2JqZWN0IGlkZW50aWZpZWQgYnkgdGhlIGNhY2hlSWQgb3IgdW5kZWZpbmVkIGlmIG5vIHN1Y2ggY2FjaGUuDQotICAgKi8NCi0gICAgY2FjaGVGYWN0b3J5LmdldCA9IGZ1bmN0aW9uKGNhY2hlSWQpIHsNCi0gICAgICByZXR1cm4gY2FjaGVzW2NhY2hlSWRdOw0KLSAgICB9Ow0KLQ0KLQ0KLSAgICByZXR1cm4gY2FjaGVGYWN0b3J5Ow0KLSAgfTsNCi19DQotDQotLyoqDQotICogQG5nZG9jIHNlcnZpY2UNCi0gKiBAbmFtZSAkdGVtcGxhdGVDYWNoZQ0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogVGhlIGZpcnN0IHRpbWUgYSB0ZW1wbGF0ZSBpcyB1c2VkLCBpdCBpcyBsb2FkZWQgaW4gdGhlIHRlbXBsYXRlIGNhY2hlIGZvciBxdWljayByZXRyaWV2YWwuIFlvdQ0KLSAqIGNhbiBsb2FkIHRlbXBsYXRlcyBkaXJlY3RseSBpbnRvIHRoZSBjYWNoZSBpbiBhIGBzY3JpcHRgIHRhZywgb3IgYnkgY29uc3VtaW5nIHRoZQ0KLSAqIGAkdGVtcGxhdGVDYWNoZWAgc2VydmljZSBkaXJlY3RseS4NCi0gKg0KLSAqIEFkZGluZyB2aWEgdGhlIGBzY3JpcHRgIHRhZzoNCi0gKg0KLSAqIGBgYGh0bWwNCi0gKiAgIDxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9InRlbXBsYXRlSWQuaHRtbCI+DQotICogICAgIDxwPlRoaXMgaXMgdGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlPC9wPg0KLSAqICAgPC9zY3JpcHQ+DQotICogYGBgDQotICoNCi0gKiAqKk5vdGU6KiogdGhlIGBzY3JpcHRgIHRhZyBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBgaGVhZGAgb2YNCi0gKiB0aGUgZG9jdW1lbnQsIGJ1dCBpdCBtdXN0IGJlIGEgZGVzY2VuZGVudCBvZiB0aGUge0BsaW5rIG5nLiRyb290RWxlbWVudCAkcm9vdEVsZW1lbnR9IChJRSwNCi0gKiBlbGVtZW50IHdpdGggbmctYXBwIGF0dHJpYnV0ZSksIG90aGVyd2lzZSB0aGUgdGVtcGxhdGUgd2lsbCBiZSBpZ25vcmVkLg0KLSAqDQotICogQWRkaW5nIHZpYSB0aGUgJHRlbXBsYXRlQ2FjaGUgc2VydmljZToNCi0gKg0KLSAqIGBgYGpzDQotICogdmFyIG15QXBwID0gYW5ndWxhci5tb2R1bGUoJ215QXBwJywgW10pOw0KLSAqIG15QXBwLnJ1bihmdW5jdGlvbigkdGVtcGxhdGVDYWNoZSkgew0KLSAqICAgJHRlbXBsYXRlQ2FjaGUucHV0KCd0ZW1wbGF0ZUlkLmh0bWwnLCAnVGhpcyBpcyB0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUnKTsNCi0gKiB9KTsNCi0gKiBgYGANCi0gKg0KLSAqIFRvIHJldHJpZXZlIHRoZSB0ZW1wbGF0ZSBsYXRlciwgc2ltcGx5IHVzZSBpdCBpbiB5b3VyIEhUTUw6DQotICogYGBgaHRtbA0KLSAqIDxkaXYgbmctaW5jbHVkZT0iICd0ZW1wbGF0ZUlkLmh0bWwnICI+PC9kaXY+DQotICogYGBgDQotICoNCi0gKiBvciBnZXQgaXQgdmlhIEphdmFzY3JpcHQ6DQotICogYGBganMNCi0gKiAkdGVtcGxhdGVDYWNoZS5nZXQoJ3RlbXBsYXRlSWQuaHRtbCcpDQotICogYGBgDQotICoNCi0gKiBTZWUge0BsaW5rIG5nLiRjYWNoZUZhY3RvcnkgJGNhY2hlRmFjdG9yeX0uDQotICoNCi0gKi8NCi1mdW5jdGlvbiAkVGVtcGxhdGVDYWNoZVByb3ZpZGVyKCkgew0KLSAgdGhpcy4kZ2V0ID0gWyckY2FjaGVGYWN0b3J5JywgZnVuY3Rpb24oJGNhY2hlRmFjdG9yeSkgew0KLSAgICByZXR1cm4gJGNhY2hlRmFjdG9yeSgndGVtcGxhdGVzJyk7DQotICB9XTsNCi19DQotDQotLyogISBWQVJJQUJMRS9GVU5DVElPTiBOQU1JTkcgQ09OVkVOVElPTlMgVEhBVCBBUFBMWSBUTyBUSElTIEZJTEUhDQotICoNCi0gKiBET00tcmVsYXRlZCB2YXJpYWJsZXM6DQotICoNCi0gKiAtICJub2RlIiAtIERPTSBOb2RlDQotICogLSAiZWxlbWVudCIgLSBET00gRWxlbWVudCBvciBOb2RlDQotICogLSAiJG5vZGUiIG9yICIkZWxlbWVudCIgLSBqcUxpdGUtd3JhcHBlZCBub2RlIG9yIGVsZW1lbnQNCi0gKg0KLSAqDQotICogQ29tcGlsZXIgcmVsYXRlZCBzdHVmZjoNCi0gKg0KLSAqIC0gImxpbmtGbiIgLSBsaW5raW5nIGZuIG9mIGEgc2luZ2xlIGRpcmVjdGl2ZQ0KLSAqIC0gIm5vZGVMaW5rRm4iIC0gZnVuY3Rpb24gdGhhdCBhZ2dyZWdhdGVzIGFsbCBsaW5raW5nIGZucyBmb3IgYSBwYXJ0aWN1bGFyIG5vZGUNCi0gKiAtICJjaGlsZExpbmtGbiIgLSAgZnVuY3Rpb24gdGhhdCBhZ2dyZWdhdGVzIGFsbCBsaW5raW5nIGZucyBmb3IgY2hpbGQgbm9kZXMgb2YgYSBwYXJ0aWN1bGFyIG5vZGUNCi0gKiAtICJjb21wb3NpdGVMaW5rRm4iIC0gZnVuY3Rpb24gdGhhdCBhZ2dyZWdhdGVzIGFsbCBsaW5raW5nIGZucyBmb3IgYSBjb21waWxhdGlvbiByb290IChub2RlTGlzdCkNCi0gKi8NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICRjb21waWxlDQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIENvbXBpbGVzIGFuIEhUTUwgc3RyaW5nIG9yIERPTSBpbnRvIGEgdGVtcGxhdGUgYW5kIHByb2R1Y2VzIGEgdGVtcGxhdGUgZnVuY3Rpb24sIHdoaWNoDQotICogY2FuIHRoZW4gYmUgdXNlZCB0byBsaW5rIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIGBzY29wZWB9IGFuZCB0aGUgdGVtcGxhdGUgdG9nZXRoZXIuDQotICoNCi0gKiBUaGUgY29tcGlsYXRpb24gaXMgYSBwcm9jZXNzIG9mIHdhbGtpbmcgdGhlIERPTSB0cmVlIGFuZCBtYXRjaGluZyBET00gZWxlbWVudHMgdG8NCi0gKiB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmUgZGlyZWN0aXZlc30uDQotICoNCi0gKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC13YXJuaW5nIj4NCi0gKiAqKk5vdGU6KiogVGhpcyBkb2N1bWVudCBpcyBhbiBpbi1kZXB0aCByZWZlcmVuY2Ugb2YgYWxsIGRpcmVjdGl2ZSBvcHRpb25zLg0KLSAqIEZvciBhIGdlbnRsZSBpbnRyb2R1Y3Rpb24gdG8gZGlyZWN0aXZlcyB3aXRoIGV4YW1wbGVzIG9mIGNvbW1vbiB1c2UgY2FzZXMsDQotICogc2VlIHRoZSB7QGxpbmsgZ3VpZGUvZGlyZWN0aXZlIGRpcmVjdGl2ZSBndWlkZX0uDQotICogPC9kaXY+DQotICoNCi0gKiAjIyBDb21wcmVoZW5zaXZlIERpcmVjdGl2ZSBBUEkNCi0gKg0KLSAqIFRoZXJlIGFyZSBtYW55IGRpZmZlcmVudCBvcHRpb25zIGZvciBhIGRpcmVjdGl2ZS4NCi0gKg0KLSAqIFRoZSBkaWZmZXJlbmNlIHJlc2lkZXMgaW4gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmFjdG9yeSBmdW5jdGlvbi4NCi0gKiBZb3UgY2FuIGVpdGhlciByZXR1cm4gYSAiRGlyZWN0aXZlIERlZmluaXRpb24gT2JqZWN0IiAoc2VlIGJlbG93KSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGl2ZSBwcm9wZXJ0aWVzLA0KLSAqIG9yIGp1c3QgdGhlIGBwb3N0TGlua2AgZnVuY3Rpb24gKGFsbCBvdGhlciBwcm9wZXJ0aWVzIHdpbGwgaGF2ZSB0aGUgZGVmYXVsdCB2YWx1ZXMpLg0KLSAqDQotICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtc3VjY2VzcyI+DQotICogKipCZXN0IFByYWN0aWNlOioqIEl0J3MgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSAiZGlyZWN0aXZlIGRlZmluaXRpb24gb2JqZWN0IiBmb3JtLg0KLSAqIDwvZGl2Pg0KLSAqDQotICogSGVyZSdzIGFuIGV4YW1wbGUgZGlyZWN0aXZlIGRlY2xhcmVkIHdpdGggYSBEaXJlY3RpdmUgRGVmaW5pdGlvbiBPYmplY3Q6DQotICoNCi0gKiBgYGBqcw0KLSAqICAgdmFyIG15TW9kdWxlID0gYW5ndWxhci5tb2R1bGUoLi4uKTsNCi0gKg0KLSAqICAgbXlNb2R1bGUuZGlyZWN0aXZlKCdkaXJlY3RpdmVOYW1lJywgZnVuY3Rpb24gZmFjdG9yeShpbmplY3RhYmxlcykgew0KLSAqICAgICB2YXIgZGlyZWN0aXZlRGVmaW5pdGlvbk9iamVjdCA9IHsNCi0gKiAgICAgICBwcmlvcml0eTogMCwNCi0gKiAgICAgICB0ZW1wbGF0ZTogJzxkaXY+PC9kaXY+JywgLy8gb3IgLy8gZnVuY3Rpb24odEVsZW1lbnQsIHRBdHRycykgeyAuLi4gfSwNCi0gKiAgICAgICAvLyBvcg0KLSAqICAgICAgIC8vIHRlbXBsYXRlVXJsOiAnZGlyZWN0aXZlLmh0bWwnLCAvLyBvciAvLyBmdW5jdGlvbih0RWxlbWVudCwgdEF0dHJzKSB7IC4uLiB9LA0KLSAqICAgICAgIHRyYW5zY2x1ZGU6IGZhbHNlLA0KLSAqICAgICAgIHJlc3RyaWN0OiAnQScsDQotICogICAgICAgdGVtcGxhdGVOYW1lc3BhY2U6ICdodG1sJywNCi0gKiAgICAgICBzY29wZTogZmFsc2UsDQotICogICAgICAgY29udHJvbGxlcjogZnVuY3Rpb24oJHNjb3BlLCAkZWxlbWVudCwgJGF0dHJzLCAkdHJhbnNjbHVkZSwgb3RoZXJJbmplY3RhYmxlcykgeyAuLi4gfSwNCi0gKiAgICAgICBjb250cm9sbGVyQXM6ICdzdHJpbmdBbGlhcycsDQotICogICAgICAgcmVxdWlyZTogJ3NpYmxpbmdEaXJlY3RpdmVOYW1lJywgLy8gb3IgLy8gWydecGFyZW50RGlyZWN0aXZlTmFtZScsICc/b3B0aW9uYWxEaXJlY3RpdmVOYW1lJywgJz9eb3B0aW9uYWxQYXJlbnQnXSwNCi0gKiAgICAgICBjb21waWxlOiBmdW5jdGlvbiBjb21waWxlKHRFbGVtZW50LCB0QXR0cnMsIHRyYW5zY2x1ZGUpIHsNCi0gKiAgICAgICAgIHJldHVybiB7DQotICogICAgICAgICAgIHByZTogZnVuY3Rpb24gcHJlTGluayhzY29wZSwgaUVsZW1lbnQsIGlBdHRycywgY29udHJvbGxlcikgeyAuLi4gfSwNCi0gKiAgICAgICAgICAgcG9zdDogZnVuY3Rpb24gcG9zdExpbmsoc2NvcGUsIGlFbGVtZW50LCBpQXR0cnMsIGNvbnRyb2xsZXIpIHsgLi4uIH0NCi0gKiAgICAgICAgIH0NCi0gKiAgICAgICAgIC8vIG9yDQotICogICAgICAgICAvLyByZXR1cm4gZnVuY3Rpb24gcG9zdExpbmsoIC4uLiApIHsgLi4uIH0NCi0gKiAgICAgICB9LA0KLSAqICAgICAgIC8vIG9yDQotICogICAgICAgLy8gbGluazogew0KLSAqICAgICAgIC8vICBwcmU6IGZ1bmN0aW9uIHByZUxpbmsoc2NvcGUsIGlFbGVtZW50LCBpQXR0cnMsIGNvbnRyb2xsZXIpIHsgLi4uIH0sDQotICogICAgICAgLy8gIHBvc3Q6IGZ1bmN0aW9uIHBvc3RMaW5rKHNjb3BlLCBpRWxlbWVudCwgaUF0dHJzLCBjb250cm9sbGVyKSB7IC4uLiB9DQotICogICAgICAgLy8gfQ0KLSAqICAgICAgIC8vIG9yDQotICogICAgICAgLy8gbGluazogZnVuY3Rpb24gcG9zdExpbmsoIC4uLiApIHsgLi4uIH0NCi0gKiAgICAgfTsNCi0gKiAgICAgcmV0dXJuIGRpcmVjdGl2ZURlZmluaXRpb25PYmplY3Q7DQotICogICB9KTsNCi0gKiBgYGANCi0gKg0KLSAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPg0KLSAqICoqTm90ZToqKiBBbnkgdW5zcGVjaWZpZWQgb3B0aW9ucyB3aWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBzZWUgdGhlIGRlZmF1bHQgdmFsdWVzIGJlbG93Lg0KLSAqIDwvZGl2Pg0KLSAqDQotICogVGhlcmVmb3JlIHRoZSBhYm92ZSBjYW4gYmUgc2ltcGxpZmllZCBhczoNCi0gKg0KLSAqIGBgYGpzDQotICogICB2YXIgbXlNb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSguLi4pOw0KLSAqDQotICogICBteU1vZHVsZS5kaXJlY3RpdmUoJ2RpcmVjdGl2ZU5hbWUnLCBmdW5jdGlvbiBmYWN0b3J5KGluamVjdGFibGVzKSB7DQotICogICAgIHZhciBkaXJlY3RpdmVEZWZpbml0aW9uT2JqZWN0ID0gew0KLSAqICAgICAgIGxpbms6IGZ1bmN0aW9uIHBvc3RMaW5rKHNjb3BlLCBpRWxlbWVudCwgaUF0dHJzKSB7IC4uLiB9DQotICogICAgIH07DQotICogICAgIHJldHVybiBkaXJlY3RpdmVEZWZpbml0aW9uT2JqZWN0Ow0KLSAqICAgICAvLyBvcg0KLSAqICAgICAvLyByZXR1cm4gZnVuY3Rpb24gcG9zdExpbmsoc2NvcGUsIGlFbGVtZW50LCBpQXR0cnMpIHsgLi4uIH0NCi0gKiAgIH0pOw0KLSAqIGBgYA0KLSAqDQotICoNCi0gKg0KLSAqICMjIyBEaXJlY3RpdmUgRGVmaW5pdGlvbiBPYmplY3QNCi0gKg0KLSAqIFRoZSBkaXJlY3RpdmUgZGVmaW5pdGlvbiBvYmplY3QgcHJvdmlkZXMgaW5zdHJ1Y3Rpb25zIHRvIHRoZSB7QGxpbmsgbmcuJGNvbXBpbGUNCi0gKiBjb21waWxlcn0uIFRoZSBhdHRyaWJ1dGVzIGFyZToNCi0gKg0KLSAqICMjIyMgYG11bHRpRWxlbWVudGANCi0gKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIHRydWUsIHRoZSBIVE1MIGNvbXBpbGVyIHdpbGwgY29sbGVjdCBET00gbm9kZXMgYmV0d2Vlbg0KLSAqIG5vZGVzIHdpdGggdGhlIGF0dHJpYnV0ZXMgYGRpcmVjdGl2ZS1uYW1lLXN0YXJ0YCBhbmQgYGRpcmVjdGl2ZS1uYW1lLWVuZGAsIGFuZCBncm91cCB0aGVtDQotICogdG9nZXRoZXIgYXMgdGhlIGRpcmVjdGl2ZSBlbGVtZW50cy4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGlzIGZlYXR1cmUgYmUgdXNlZCBvbiBkaXJlY3RpdmVzDQotICogd2hpY2ggYXJlIG5vdCBzdHJpY3RseSBiZWhhdmlvdXJhbCAoc3VjaCBhcyB7QGxpbmsgbmdDbGlja30pLCBhbmQgd2hpY2gNCi0gKiBkbyBub3QgbWFuaXB1bGF0ZSBvciByZXBsYWNlIGNoaWxkIG5vZGVzIChzdWNoIGFzIHtAbGluayBuZ0luY2x1ZGV9KS4NCi0gKg0KLSAqICMjIyMgYHByaW9yaXR5YA0KLSAqIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGRpcmVjdGl2ZXMgZGVmaW5lZCBvbiBhIHNpbmdsZSBET00gZWxlbWVudCwgc29tZXRpbWVzIGl0DQotICogaXMgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXJlY3RpdmVzIGFyZSBhcHBsaWVkLiBUaGUgYHByaW9yaXR5YCBpcyB1c2VkDQotICogdG8gc29ydCB0aGUgZGlyZWN0aXZlcyBiZWZvcmUgdGhlaXIgYGNvbXBpbGVgIGZ1bmN0aW9ucyBnZXQgY2FsbGVkLiBQcmlvcml0eSBpcyBkZWZpbmVkIGFzIGENCi0gKiBudW1iZXIuIERpcmVjdGl2ZXMgd2l0aCBncmVhdGVyIG51bWVyaWNhbCBgcHJpb3JpdHlgIGFyZSBjb21waWxlZCBmaXJzdC4gUHJlLWxpbmsgZnVuY3Rpb25zDQotICogYXJlIGFsc28gcnVuIGluIHByaW9yaXR5IG9yZGVyLCBidXQgcG9zdC1saW5rIGZ1bmN0aW9ucyBhcmUgcnVuIGluIHJldmVyc2Ugb3JkZXIuIFRoZSBvcmRlcg0KLSAqIG9mIGRpcmVjdGl2ZXMgd2l0aCB0aGUgc2FtZSBwcmlvcml0eSBpcyB1bmRlZmluZWQuIFRoZSBkZWZhdWx0IHByaW9yaXR5IGlzIGAwYC4NCi0gKg0KLSAqICMjIyMgYHRlcm1pbmFsYA0KLSAqIElmIHNldCB0byB0cnVlIHRoZW4gdGhlIGN1cnJlbnQgYHByaW9yaXR5YCB3aWxsIGJlIHRoZSBsYXN0IHNldCBvZiBkaXJlY3RpdmVzDQotICogd2hpY2ggd2lsbCBleGVjdXRlIChhbnkgZGlyZWN0aXZlcyBhdCB0aGUgY3VycmVudCBwcmlvcml0eSB3aWxsIHN0aWxsIGV4ZWN1dGUNCi0gKiBhcyB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uIG9uIHNhbWUgYHByaW9yaXR5YCBpcyB1bmRlZmluZWQpLiBOb3RlIHRoYXQgZXhwcmVzc2lvbnMNCi0gKiBhbmQgb3RoZXIgZGlyZWN0aXZlcyB1c2VkIGluIHRoZSBkaXJlY3RpdmUncyB0ZW1wbGF0ZSB3aWxsIGFsc28gYmUgZXhjbHVkZWQgZnJvbSBleGVjdXRpb24uDQotICoNCi0gKiAjIyMjIGBzY29wZWANCi0gKiAqKklmIHNldCB0byBgdHJ1ZWAsKiogdGhlbiBhIG5ldyBzY29wZSB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoaXMgZGlyZWN0aXZlLiBJZiBtdWx0aXBsZSBkaXJlY3RpdmVzIG9uIHRoZQ0KLSAqIHNhbWUgZWxlbWVudCByZXF1ZXN0IGEgbmV3IHNjb3BlLCBvbmx5IG9uZSBuZXcgc2NvcGUgaXMgY3JlYXRlZC4gVGhlIG5ldyBzY29wZSBydWxlIGRvZXMgbm90DQotICogYXBwbHkgZm9yIHRoZSByb290IG9mIHRoZSB0ZW1wbGF0ZSBzaW5jZSB0aGUgcm9vdCBvZiB0aGUgdGVtcGxhdGUgYWx3YXlzIGdldHMgYSBuZXcgc2NvcGUuDQotICoNCi0gKiAqKklmIHNldCB0byBge31gIChvYmplY3QgaGFzaCksKiogdGhlbiBhIG5ldyAiaXNvbGF0ZSIgc2NvcGUgaXMgY3JlYXRlZC4gVGhlICdpc29sYXRlJyBzY29wZSBkaWZmZXJzIGZyb20NCi0gKiBub3JtYWwgc2NvcGUgaW4gdGhhdCBpdCBkb2VzIG5vdCBwcm90b3R5cGljYWxseSBpbmhlcml0IGZyb20gdGhlIHBhcmVudCBzY29wZS4gVGhpcyBpcyB1c2VmdWwNCi0gKiB3aGVuIGNyZWF0aW5nIHJldXNhYmxlIGNvbXBvbmVudHMsIHdoaWNoIHNob3VsZCBub3QgYWNjaWRlbnRhbGx5IHJlYWQgb3IgbW9kaWZ5IGRhdGEgaW4gdGhlDQotICogcGFyZW50IHNjb3BlLg0KLSAqDQotICogVGhlICdpc29sYXRlJyBzY29wZSB0YWtlcyBhbiBvYmplY3QgaGFzaCB3aGljaCBkZWZpbmVzIGEgc2V0IG9mIGxvY2FsIHNjb3BlIHByb3BlcnRpZXMNCi0gKiBkZXJpdmVkIGZyb20gdGhlIHBhcmVudCBzY29wZS4gVGhlc2UgbG9jYWwgcHJvcGVydGllcyBhcmUgdXNlZnVsIGZvciBhbGlhc2luZyB2YWx1ZXMgZm9yDQotICogdGVtcGxhdGVzLiBMb2NhbHMgZGVmaW5pdGlvbiBpcyBhIGhhc2ggb2YgbG9jYWwgc2NvcGUgcHJvcGVydHkgdG8gaXRzIHNvdXJjZToNCi0gKg0KLSAqICogYEBgIG9yIGBAYXR0cmAgLSBiaW5kIGEgbG9jYWwgc2NvcGUgcHJvcGVydHkgdG8gdGhlIHZhbHVlIG9mIERPTSBhdHRyaWJ1dGUuIFRoZSByZXN1bHQgaXMNCi0gKiAgIGFsd2F5cyBhIHN0cmluZyBzaW5jZSBET00gYXR0cmlidXRlcyBhcmUgc3RyaW5ncy4gSWYgbm8gYGF0dHJgIG5hbWUgaXMgc3BlY2lmaWVkICB0aGVuIHRoZQ0KLSAqICAgYXR0cmlidXRlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgbG9jYWwgbmFtZS4NCi0gKiAgIEdpdmVuIGA8d2lkZ2V0IG15LWF0dHI9ImhlbGxvIHt7bmFtZX19Ij5gIGFuZCB3aWRnZXQgZGVmaW5pdGlvbg0KLSAqICAgb2YgYHNjb3BlOiB7IGxvY2FsTmFtZTonQG15QXR0cicgfWAsIHRoZW4gd2lkZ2V0IHNjb3BlIHByb3BlcnR5IGBsb2NhbE5hbWVgIHdpbGwgcmVmbGVjdA0KLSAqICAgdGhlIGludGVycG9sYXRlZCB2YWx1ZSBvZiBgaGVsbG8ge3tuYW1lfX1gLiBBcyB0aGUgYG5hbWVgIGF0dHJpYnV0ZSBjaGFuZ2VzIHNvIHdpbGwgdGhlDQotICogICBgbG9jYWxOYW1lYCBwcm9wZXJ0eSBvbiB0aGUgd2lkZ2V0IHNjb3BlLiBUaGUgYG5hbWVgIGlzIHJlYWQgZnJvbSB0aGUgcGFyZW50IHNjb3BlIChub3QNCi0gKiAgIGNvbXBvbmVudCBzY29wZSkuDQotICoNCi0gKiAqIGA9YCBvciBgPWF0dHJgIC0gc2V0IHVwIGJpLWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIGxvY2FsIHNjb3BlIHByb3BlcnR5IGFuZCB0aGUNCi0gKiAgIHBhcmVudCBzY29wZSBwcm9wZXJ0eSBvZiBuYW1lIGRlZmluZWQgdmlhIHRoZSB2YWx1ZSBvZiB0aGUgYGF0dHJgIGF0dHJpYnV0ZS4gSWYgbm8gYGF0dHJgDQotICogICBuYW1lIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBsb2NhbCBuYW1lLg0KLSAqICAgR2l2ZW4gYDx3aWRnZXQgbXktYXR0cj0icGFyZW50TW9kZWwiPmAgYW5kIHdpZGdldCBkZWZpbml0aW9uIG9mDQotICogICBgc2NvcGU6IHsgbG9jYWxNb2RlbDonPW15QXR0cicgfWAsIHRoZW4gd2lkZ2V0IHNjb3BlIHByb3BlcnR5IGBsb2NhbE1vZGVsYCB3aWxsIHJlZmxlY3QgdGhlDQotICogICB2YWx1ZSBvZiBgcGFyZW50TW9kZWxgIG9uIHRoZSBwYXJlbnQgc2NvcGUuIEFueSBjaGFuZ2VzIHRvIGBwYXJlbnRNb2RlbGAgd2lsbCBiZSByZWZsZWN0ZWQNCi0gKiAgIGluIGBsb2NhbE1vZGVsYCBhbmQgYW55IGNoYW5nZXMgaW4gYGxvY2FsTW9kZWxgIHdpbGwgcmVmbGVjdCBpbiBgcGFyZW50TW9kZWxgLiBJZiB0aGUgcGFyZW50DQotICogICBzY29wZSBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0LCBpdCB3aWxsIHRocm93IGEgTk9OX0FTU0lHTkFCTEVfTU9ERUxfRVhQUkVTU0lPTiBleGNlcHRpb24uIFlvdQ0KLSAqICAgY2FuIGF2b2lkIHRoaXMgYmVoYXZpb3IgdXNpbmcgYD0/YCBvciBgPT9hdHRyYCBpbiBvcmRlciB0byBmbGFnIHRoZSBwcm9wZXJ0eSBhcyBvcHRpb25hbC4gSWYNCi0gKiAgIHlvdSB3YW50IHRvIHNoYWxsb3cgd2F0Y2ggZm9yIGNoYW5nZXMgKGkuZS4gJHdhdGNoQ29sbGVjdGlvbiBpbnN0ZWFkIG9mICR3YXRjaCkgeW91IGNhbiB1c2UNCi0gKiAgIGA9KmAgb3IgYD0qYXR0cmAgKGA9Kj9gIG9yIGA9Kj9hdHRyYCBpZiB0aGUgcHJvcGVydHkgaXMgb3B0aW9uYWwpLg0KLSAqDQotICogKiBgJmAgb3IgYCZhdHRyYCAtIHByb3ZpZGVzIGEgd2F5IHRvIGV4ZWN1dGUgYW4gZXhwcmVzc2lvbiBpbiB0aGUgY29udGV4dCBvZiB0aGUgcGFyZW50IHNjb3BlLg0KLSAqICAgSWYgbm8gYGF0dHJgIG5hbWUgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlDQotICogICBsb2NhbCBuYW1lLiBHaXZlbiBgPHdpZGdldCBteS1hdHRyPSJjb3VudCA9IGNvdW50ICsgdmFsdWUiPmAgYW5kIHdpZGdldCBkZWZpbml0aW9uIG9mDQotICogICBgc2NvcGU6IHsgbG9jYWxGbjonJm15QXR0cicgfWAsIHRoZW4gaXNvbGF0ZSBzY29wZSBwcm9wZXJ0eSBgbG9jYWxGbmAgd2lsbCBwb2ludCB0bw0KLSAqICAgYSBmdW5jdGlvbiB3cmFwcGVyIGZvciB0aGUgYGNvdW50ID0gY291bnQgKyB2YWx1ZWAgZXhwcmVzc2lvbi4gT2Z0ZW4gaXQncyBkZXNpcmFibGUgdG8NCi0gKiAgIHBhc3MgZGF0YSBmcm9tIHRoZSBpc29sYXRlZCBzY29wZSB2aWEgYW4gZXhwcmVzc2lvbiB0byB0aGUgcGFyZW50IHNjb3BlLCB0aGlzIGNhbiBiZQ0KLSAqICAgZG9uZSBieSBwYXNzaW5nIGEgbWFwIG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzIGFuZCB2YWx1ZXMgaW50byB0aGUgZXhwcmVzc2lvbiB3cmFwcGVyIGZuLg0KLSAqICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBleHByZXNzaW9uIGlzIGBpbmNyZW1lbnQoYW1vdW50KWAgdGhlbiB3ZSBjYW4gc3BlY2lmeSB0aGUgYW1vdW50IHZhbHVlDQotICogICBieSBjYWxsaW5nIHRoZSBgbG9jYWxGbmAgYXMgYGxvY2FsRm4oe2Ftb3VudDogMjJ9KWAuDQotICoNCi0gKg0KLSAqICMjIyMgYGJpbmRUb0NvbnRyb2xsZXJgDQotICogV2hlbiBhbiBpc29sYXRlIHNjb3BlIGlzIHVzZWQgZm9yIGEgY29tcG9uZW50IChzZWUgYWJvdmUpLCBhbmQgYGNvbnRyb2xsZXJBc2AgaXMgdXNlZCwgYGJpbmRUb0NvbnRyb2xsZXI6IHRydWVgIHdpbGwNCi0gKiBhbGxvdyBhIGNvbXBvbmVudCB0byBoYXZlIGl0cyBwcm9wZXJ0aWVzIGJvdW5kIHRvIHRoZSBjb250cm9sbGVyLCByYXRoZXIgdGhhbiB0byBzY29wZS4gV2hlbiB0aGUgY29udHJvbGxlcg0KLSAqIGlzIGluc3RhbnRpYXRlZCwgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBpc29sYXRlIHNjb3BlIGJpbmRpbmdzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZS4NCi0gKg0KLSAqICMjIyMgYGNvbnRyb2xsZXJgDQotICogQ29udHJvbGxlciBjb25zdHJ1Y3RvciBmdW5jdGlvbi4gVGhlIGNvbnRyb2xsZXIgaXMgaW5zdGFudGlhdGVkIGJlZm9yZSB0aGUNCi0gKiBwcmUtbGlua2luZyBwaGFzZSBhbmQgaXQgaXMgc2hhcmVkIHdpdGggb3RoZXIgZGlyZWN0aXZlcyAoc2VlDQotICogYHJlcXVpcmVgIGF0dHJpYnV0ZSkuIFRoaXMgYWxsb3dzIHRoZSBkaXJlY3RpdmVzIHRvIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlciBhbmQgYXVnbWVudA0KLSAqIGVhY2ggb3RoZXIncyBiZWhhdmlvci4gVGhlIGNvbnRyb2xsZXIgaXMgaW5qZWN0YWJsZSAoYW5kIHN1cHBvcnRzIGJyYWNrZXQgbm90YXRpb24pIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhbHM6DQotICoNCi0gKiAqIGAkc2NvcGVgIC0gQ3VycmVudCBzY29wZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQNCi0gKiAqIGAkZWxlbWVudGAgLSBDdXJyZW50IGVsZW1lbnQNCi0gKiAqIGAkYXR0cnNgIC0gQ3VycmVudCBhdHRyaWJ1dGVzIG9iamVjdCBmb3IgdGhlIGVsZW1lbnQNCi0gKiAqIGAkdHJhbnNjbHVkZWAgLSBBIHRyYW5zY2x1ZGUgbGlua2luZyBmdW5jdGlvbiBwcmUtYm91bmQgdG8gdGhlIGNvcnJlY3QgdHJhbnNjbHVzaW9uIHNjb3BlOg0KLSAqICAgYGZ1bmN0aW9uKFtzY29wZV0sIGNsb25lTGlua2luZ0ZuLCBmdXR1cmVQYXJlbnRFbGVtZW50KWAuDQotICogICAgKiBgc2NvcGVgOiBvcHRpb25hbCBhcmd1bWVudCB0byBvdmVycmlkZSB0aGUgc2NvcGUuDQotICogICAgKiBgY2xvbmVMaW5raW5nRm5gOiBvcHRpb25hbCBhcmd1bWVudCB0byBjcmVhdGUgY2xvbmVzIG9mIHRoZSBvcmlnaW5hbCB0cmFuc2NsdWRlZCBjb250ZW50Lg0KLSAqICAgICogYGZ1dHVyZVBhcmVudEVsZW1lbnRgOg0KLSAqICAgICAgICAqIGRlZmluZXMgdGhlIHBhcmVudCB0byB3aGljaCB0aGUgYGNsb25lTGlua2luZ0ZuYCB3aWxsIGFkZCB0aGUgY2xvbmVkIGVsZW1lbnRzLg0KLSAqICAgICAgICAqIGRlZmF1bHQ6IGAkZWxlbWVudC5wYXJlbnQoKWAgcmVzcC4gYCRlbGVtZW50YCBmb3IgYHRyYW5zY2x1ZGU6J2VsZW1lbnQnYCByZXNwLiBgdHJhbnNjbHVkZTp0cnVlYC4NCi0gKiAgICAgICAgKiBvbmx5IG5lZWRlZCBmb3IgdHJhbnNjbHVkZXMgdGhhdCBhcmUgYWxsb3dlZCB0byBjb250YWluIG5vbiBodG1sIGVsZW1lbnRzIChlLmcuIFNWRyBlbGVtZW50cykNCi0gKiAgICAgICAgICBhbmQgd2hlbiB0aGUgYGNsb25lTGlua2luRm5gIGlzIHBhc3NlZCwNCi0gKiAgICAgICAgICBhcyB0aG9zZSBlbGVtZW50cyBuZWVkIHRvIGNyZWF0ZWQgYW5kIGNsb25lZCBpbiBhIHNwZWNpYWwgd2F5IHdoZW4gdGhleSBhcmUgZGVmaW5lZCBvdXRzaWRlIHRoZWlyDQotICogICAgICAgICAgdXN1YWwgY29udGFpbmVycyAoZS5nLiBsaWtlIGA8c3ZnPmApLg0KLSAqICAgICAgICAqIFNlZSBhbHNvIHRoZSBgZGlyZWN0aXZlLnRlbXBsYXRlTmFtZXNwYWNlYCBwcm9wZXJ0eS4NCi0gKg0KLSAqDQotICogIyMjIyBgcmVxdWlyZWANCi0gKiBSZXF1aXJlIGFub3RoZXIgZGlyZWN0aXZlIGFuZCBpbmplY3QgaXRzIGNvbnRyb2xsZXIgYXMgdGhlIGZvdXJ0aCBhcmd1bWVudCB0byB0aGUgbGlua2luZyBmdW5jdGlvbi4gVGhlDQotICogYHJlcXVpcmVgIHRha2VzIGEgc3RyaW5nIG5hbWUgKG9yIGFycmF5IG9mIHN0cmluZ3MpIG9mIHRoZSBkaXJlY3RpdmUocykgdG8gcGFzcyBpbi4gSWYgYW4gYXJyYXkgaXMgdXNlZCwgdGhlDQotICogaW5qZWN0ZWQgYXJndW1lbnQgd2lsbCBiZSBhbiBhcnJheSBpbiBjb3JyZXNwb25kaW5nIG9yZGVyLiBJZiBubyBzdWNoIGRpcmVjdGl2ZSBjYW4gYmUNCi0gKiBmb3VuZCwgb3IgaWYgdGhlIGRpcmVjdGl2ZSBkb2VzIG5vdCBoYXZlIGEgY29udHJvbGxlciwgdGhlbiBhbiBlcnJvciBpcyByYWlzZWQuIFRoZSBuYW1lIGNhbiBiZSBwcmVmaXhlZCB3aXRoOg0KLSAqDQotICogKiAobm8gcHJlZml4KSAtIExvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBvbiB0aGUgY3VycmVudCBlbGVtZW50LiBUaHJvdyBhbiBlcnJvciBpZiBub3QgZm91bmQuDQotICogKiBgP2AgLSBBdHRlbXB0IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBvciBwYXNzIGBudWxsYCB0byB0aGUgYGxpbmtgIGZuIGlmIG5vdCBmb3VuZC4NCi0gKiAqIGBeYCAtIExvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBieSBzZWFyY2hpbmcgdGhlIGVsZW1lbnQgYW5kIGl0cyBwYXJlbnRzLiBUaHJvdyBhbiBlcnJvciBpZiBub3QgZm91bmQuDQotICogKiBgXl5gIC0gTG9jYXRlIHRoZSByZXF1aXJlZCBjb250cm9sbGVyIGJ5IHNlYXJjaGluZyB0aGUgZWxlbWVudCdzIHBhcmVudHMuIFRocm93IGFuIGVycm9yIGlmIG5vdCBmb3VuZC4NCi0gKiAqIGA/XmAgLSBBdHRlbXB0IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBieSBzZWFyY2hpbmcgdGhlIGVsZW1lbnQgYW5kIGl0cyBwYXJlbnRzIG9yIHBhc3MNCi0gKiAgIGBudWxsYCB0byB0aGUgYGxpbmtgIGZuIGlmIG5vdCBmb3VuZC4NCi0gKiAqIGA/Xl5gIC0gQXR0ZW1wdCB0byBsb2NhdGUgdGhlIHJlcXVpcmVkIGNvbnRyb2xsZXIgYnkgc2VhcmNoaW5nIHRoZSBlbGVtZW50J3MgcGFyZW50cywgb3IgcGFzcw0KLSAqICAgYG51bGxgIHRvIHRoZSBgbGlua2AgZm4gaWYgbm90IGZvdW5kLg0KLSAqDQotICoNCi0gKiAjIyMjIGBjb250cm9sbGVyQXNgDQotICogQ29udHJvbGxlciBhbGlhcyBhdCB0aGUgZGlyZWN0aXZlIHNjb3BlLiBBbiBhbGlhcyBmb3IgdGhlIGNvbnRyb2xsZXIgc28gaXQNCi0gKiBjYW4gYmUgcmVmZXJlbmNlZCBhdCB0aGUgZGlyZWN0aXZlIHRlbXBsYXRlLiBUaGUgZGlyZWN0aXZlIG5lZWRzIHRvIGRlZmluZSBhIHNjb3BlIGZvciB0aGlzDQotICogY29uZmlndXJhdGlvbiB0byBiZSB1c2VkLiBVc2VmdWwgaW4gdGhlIGNhc2Ugd2hlbiBkaXJlY3RpdmUgaXMgdXNlZCBhcyBjb21wb25lbnQuDQotICoNCi0gKg0KLSAqICMjIyMgYHJlc3RyaWN0YA0KLSAqIFN0cmluZyBvZiBzdWJzZXQgb2YgYEVBQ01gIHdoaWNoIHJlc3RyaWN0cyB0aGUgZGlyZWN0aXZlIHRvIGEgc3BlY2lmaWMgZGlyZWN0aXZlDQotICogZGVjbGFyYXRpb24gc3R5bGUuIElmIG9taXR0ZWQsIHRoZSBkZWZhdWx0cyAoZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMpIGFyZSB1c2VkLg0KLSAqDQotICogKiBgRWAgLSBFbGVtZW50IG5hbWUgKGRlZmF1bHQpOiBgPG15LWRpcmVjdGl2ZT48L215LWRpcmVjdGl2ZT5gDQotICogKiBgQWAgLSBBdHRyaWJ1dGUgKGRlZmF1bHQpOiBgPGRpdiBteS1kaXJlY3RpdmU9ImV4cCI+PC9kaXY+YA0KLSAqICogYENgIC0gQ2xhc3M6IGA8ZGl2IGNsYXNzPSJteS1kaXJlY3RpdmU6IGV4cDsiPjwvZGl2PmANCi0gKiAqIGBNYCAtIENvbW1lbnQ6IGA8IS0tIGRpcmVjdGl2ZTogbXktZGlyZWN0aXZlIGV4cCAtLT5gDQotICoNCi0gKg0KLSAqICMjIyMgYHRlbXBsYXRlTmFtZXNwYWNlYA0KLSAqIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRvY3VtZW50IHR5cGUgdXNlZCBieSB0aGUgbWFya3VwIGluIHRoZSB0ZW1wbGF0ZS4NCi0gKiBBbmd1bGFySlMgbmVlZHMgdGhpcyBpbmZvcm1hdGlvbiBhcyB0aG9zZSBlbGVtZW50cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYW5kIGNsb25lZA0KLSAqIGluIGEgc3BlY2lhbCB3YXkgd2hlbiB0aGV5IGFyZSBkZWZpbmVkIG91dHNpZGUgdGhlaXIgdXN1YWwgY29udGFpbmVycyBsaWtlIGA8c3ZnPmAgYW5kIGA8bWF0aD5gLg0KLSAqDQotICogKiBgaHRtbGAgLSBBbGwgcm9vdCBub2RlcyBpbiB0aGUgdGVtcGxhdGUgYXJlIEhUTUwuIFJvb3Qgbm9kZXMgbWF5IGFsc28gYmUNCi0gKiAgIHRvcC1sZXZlbCBlbGVtZW50cyBzdWNoIGFzIGA8c3ZnPmAgb3IgYDxtYXRoPmAuDQotICogKiBgc3ZnYCAtIFRoZSByb290IG5vZGVzIGluIHRoZSB0ZW1wbGF0ZSBhcmUgU1ZHIGVsZW1lbnRzIChleGNsdWRpbmcgYDxtYXRoPmApLg0KLSAqICogYG1hdGhgIC0gVGhlIHJvb3Qgbm9kZXMgaW4gdGhlIHRlbXBsYXRlIGFyZSBNYXRoTUwgZWxlbWVudHMgKGV4Y2x1ZGluZyBgPHN2Zz5gKS4NCi0gKg0KLSAqIElmIG5vIGB0ZW1wbGF0ZU5hbWVzcGFjZWAgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBuYW1lc3BhY2UgaXMgY29uc2lkZXJlZCB0byBiZSBgaHRtbGAuDQotICoNCi0gKiAjIyMjIGB0ZW1wbGF0ZWANCi0gKiBIVE1MIG1hcmt1cCB0aGF0IG1heToNCi0gKiAqIFJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50IChkZWZhdWx0KS4NCi0gKiAqIFJlcGxhY2UgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQgaXRzZWxmIChpZiBgcmVwbGFjZWAgaXMgdHJ1ZSAtIERFUFJFQ0FURUQpLg0KLSAqICogV3JhcCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQgKGlmIGB0cmFuc2NsdWRlYCBpcyB0cnVlKS4NCi0gKg0KLSAqIFZhbHVlIG1heSBiZToNCi0gKg0KLSAqICogQSBzdHJpbmcuIEZvciBleGFtcGxlIGA8ZGl2IHJlZC1vbi1ob3Zlcj57e2RlbGV0ZV9zdHJ9fTwvZGl2PmAuDQotICogKiBBIGZ1bmN0aW9uIHdoaWNoIHRha2VzIHR3byBhcmd1bWVudHMgYHRFbGVtZW50YCBhbmQgYHRBdHRyc2AgKGRlc2NyaWJlZCBpbiB0aGUgYGNvbXBpbGVgDQotICogICBmdW5jdGlvbiBhcGkgYmVsb3cpIGFuZCByZXR1cm5zIGEgc3RyaW5nIHZhbHVlLg0KLSAqDQotICoNCi0gKiAjIyMjIGB0ZW1wbGF0ZVVybGANCi0gKiBUaGlzIGlzIHNpbWlsYXIgdG8gYHRlbXBsYXRlYCBidXQgdGhlIHRlbXBsYXRlIGlzIGxvYWRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMLCBhc3luY2hyb25vdXNseS4NCi0gKg0KLSAqIEJlY2F1c2UgdGVtcGxhdGUgbG9hZGluZyBpcyBhc3luY2hyb25vdXMgdGhlIGNvbXBpbGVyIHdpbGwgc3VzcGVuZCBjb21waWxhdGlvbiBvZiBkaXJlY3RpdmVzIG9uIHRoYXQgZWxlbWVudA0KLSAqIGZvciBsYXRlciB3aGVuIHRoZSB0ZW1wbGF0ZSBoYXMgYmVlbiByZXNvbHZlZC4gIEluIHRoZSBtZWFudGltZSBpdCB3aWxsIGNvbnRpbnVlIHRvIGNvbXBpbGUgYW5kIGxpbmsNCi0gKiBzaWJsaW5nIGFuZCBwYXJlbnQgZWxlbWVudHMgYXMgdGhvdWdoIHRoaXMgZWxlbWVudCBoYWQgbm90IGNvbnRhaW5lZCBhbnkgZGlyZWN0aXZlcy4NCi0gKg0KLSAqIFRoZSBjb21waWxlciBkb2VzIG5vdCBzdXNwZW5kIHRoZSBlbnRpcmUgY29tcGlsYXRpb24gdG8gd2FpdCBmb3IgdGVtcGxhdGVzIHRvIGJlIGxvYWRlZCBiZWNhdXNlIHRoaXMNCi0gKiB3b3VsZCByZXN1bHQgaW4gdGhlIHdob2xlIGFwcCAic3RhbGxpbmciIHVudGlsIGFsbCB0ZW1wbGF0ZXMgYXJlIGxvYWRlZCBhc3luY2hyb25vdXNseSAtIGV2ZW4gaW4gdGhlDQotICogY2FzZSB3aGVuIG9ubHkgb25lIGRlZXBseSBuZXN0ZWQgZGlyZWN0aXZlIGhhcyBgdGVtcGxhdGVVcmxgLg0KLSAqDQotICogVGVtcGxhdGUgbG9hZGluZyBpcyBhc3luY2hyb25vdXMgZXZlbiBpZiB0aGUgdGVtcGxhdGUgaGFzIGJlZW4gcHJlbG9hZGVkIGludG8gdGhlIHtAbGluayAkdGVtcGxhdGVDYWNoZX0NCi0gKg0KLSAqIFlvdSBjYW4gc3BlY2lmeSBgdGVtcGxhdGVVcmxgIGFzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgVVJMIG9yIGFzIGEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvDQotICogYXJndW1lbnRzIGB0RWxlbWVudGAgYW5kIGB0QXR0cnNgIChkZXNjcmliZWQgaW4gdGhlIGBjb21waWxlYCBmdW5jdGlvbiBhcGkgYmVsb3cpIGFuZCByZXR1cm5zDQotICogYSBzdHJpbmcgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSB1cmwuICBJbiBlaXRoZXIgY2FzZSwgdGhlIHRlbXBsYXRlIFVSTCBpcyBwYXNzZWQgdGhyb3VnaCB7QGxpbmsNCi0gKiAkc2NlI2dldFRydXN0ZWRSZXNvdXJjZVVybCAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybH0uDQotICoNCi0gKg0KLSAqICMjIyMgYHJlcGxhY2VgIChbKkRFUFJFQ0FURUQqIV0sIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIHJlbGVhc2UgLSBpLmUuIHYyLjApDQotICogc3BlY2lmeSB3aGF0IHRoZSB0ZW1wbGF0ZSBzaG91bGQgcmVwbGFjZS4gRGVmYXVsdHMgdG8gYGZhbHNlYC4NCi0gKg0KLSAqICogYHRydWVgIC0gdGhlIHRlbXBsYXRlIHdpbGwgcmVwbGFjZSB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudC4NCi0gKiAqIGBmYWxzZWAgLSB0aGUgdGVtcGxhdGUgd2lsbCByZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudC4NCi0gKg0KLSAqIFRoZSByZXBsYWNlbWVudCBwcm9jZXNzIG1pZ3JhdGVzIGFsbCBvZiB0aGUgYXR0cmlidXRlcyAvIGNsYXNzZXMgZnJvbSB0aGUgb2xkIGVsZW1lbnQgdG8gdGhlIG5ldw0KLSAqIG9uZS4gU2VlIHRoZSB7QGxpbmsgZ3VpZGUvZGlyZWN0aXZlI3RlbXBsYXRlLWV4cGFuZGluZy1kaXJlY3RpdmUNCi0gKiBEaXJlY3RpdmVzIEd1aWRlfSBmb3IgYW4gZXhhbXBsZS4NCi0gKg0KLSAqIFRoZXJlIGFyZSB2ZXJ5IGZldyBzY2VuYXJpb3Mgd2hlcmUgZWxlbWVudCByZXBsYWNlbWVudCBpcyByZXF1aXJlZCBmb3IgdGhlIGFwcGxpY2F0aW9uIGZ1bmN0aW9uLA0KLSAqIHRoZSBtYWluIG9uZSBiZWluZyByZXVzYWJsZSBjdXN0b20gY29tcG9uZW50cyB0aGF0IGFyZSB1c2VkIHdpdGhpbiBTVkcgY29udGV4dHMNCi0gKiAoYmVjYXVzZSBTVkcgZG9lc24ndCB3b3JrIHdpdGggY3VzdG9tIGVsZW1lbnRzIGluIHRoZSBET00gdHJlZSkuDQotICoNCi0gKiAjIyMjIGB0cmFuc2NsdWRlYA0KLSAqIEV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbGVtZW50IHdoZXJlIHRoZSBkaXJlY3RpdmUgYXBwZWFycyBhbmQgbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIGRpcmVjdGl2ZS4NCi0gKiBUaGUgY29udGVudHMgYXJlIGNvbXBpbGVkIGFuZCBwcm92aWRlZCB0byB0aGUgZGlyZWN0aXZlIGFzIGEgKip0cmFuc2NsdXNpb24gZnVuY3Rpb24qKi4gU2VlIHRoZQ0KLSAqIHtAbGluayAkY29tcGlsZSN0cmFuc2NsdXNpb24gVHJhbnNjbHVzaW9ufSBzZWN0aW9uIGJlbG93Lg0KLSAqDQotICogVGhlcmUgYXJlIHR3byBraW5kcyBvZiB0cmFuc2NsdXNpb24gZGVwZW5kaW5nIHVwb24gd2hldGhlciB5b3Ugd2FudCB0byB0cmFuc2NsdWRlIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZQ0KLSAqIGRpcmVjdGl2ZSdzIGVsZW1lbnQgb3IgdGhlIGVudGlyZSBlbGVtZW50Og0KLSAqDQotICogKiBgdHJ1ZWAgLSB0cmFuc2NsdWRlIHRoZSBjb250ZW50IChpLmUuIHRoZSBjaGlsZCBub2Rlcykgb2YgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQuDQotICogKiBgJ2VsZW1lbnQnYCAtIHRyYW5zY2x1ZGUgdGhlIHdob2xlIG9mIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50IGluY2x1ZGluZyBhbnkgZGlyZWN0aXZlcyBvbiB0aGlzDQotICogICBlbGVtZW50IHRoYXQgZGVmaW5lZCBhdCBhIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhpcyBkaXJlY3RpdmUuIFdoZW4gdXNlZCwgdGhlIGB0ZW1wbGF0ZWANCi0gKiAgIHByb3BlcnR5IGlzIGlnbm9yZWQuDQotICoNCi0gKg0KLSAqICMjIyMgYGNvbXBpbGVgDQotICoNCi0gKiBgYGBqcw0KLSAqICAgZnVuY3Rpb24gY29tcGlsZSh0RWxlbWVudCwgdEF0dHJzLCB0cmFuc2NsdWRlKSB7IC4uLiB9DQotICogYGBgDQotICoNCi0gKiBUaGUgY29tcGlsZSBmdW5jdGlvbiBkZWFscyB3aXRoIHRyYW5zZm9ybWluZyB0aGUgdGVtcGxhdGUgRE9NLiBTaW5jZSBtb3N0IGRpcmVjdGl2ZXMgZG8gbm90IGRvDQotICogdGVtcGxhdGUgdHJhbnNmb3JtYXRpb24sIGl0IGlzIG5vdCB1c2VkIG9mdGVuLiBUaGUgY29tcGlsZSBmdW5jdGlvbiB0YWtlcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoNCi0gKg0KLSAqICAgKiBgdEVsZW1lbnRgIC0gdGVtcGxhdGUgZWxlbWVudCAtIFRoZSBlbGVtZW50IHdoZXJlIHRoZSBkaXJlY3RpdmUgaGFzIGJlZW4gZGVjbGFyZWQuIEl0IGlzDQotICogICAgIHNhZmUgdG8gZG8gdGVtcGxhdGUgdHJhbnNmb3JtYXRpb24gb24gdGhlIGVsZW1lbnQgYW5kIGNoaWxkIGVsZW1lbnRzIG9ubHkuDQotICoNCi0gKiAgICogYHRBdHRyc2AgLSB0ZW1wbGF0ZSBhdHRyaWJ1dGVzIC0gTm9ybWFsaXplZCBsaXN0IG9mIGF0dHJpYnV0ZXMgZGVjbGFyZWQgb24gdGhpcyBlbGVtZW50IHNoYXJlZA0KLSAqICAgICBiZXR3ZWVuIGFsbCBkaXJlY3RpdmUgY29tcGlsZSBmdW5jdGlvbnMuDQotICoNCi0gKiAgICogYHRyYW5zY2x1ZGVgIC0gIFsqREVQUkVDQVRFRCohXSBBIHRyYW5zY2x1ZGUgbGlua2luZyBmdW5jdGlvbjogYGZ1bmN0aW9uKHNjb3BlLCBjbG9uZUxpbmtpbmdGbilgDQotICoNCi0gKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC13YXJuaW5nIj4NCi0gKiAqKk5vdGU6KiogVGhlIHRlbXBsYXRlIGluc3RhbmNlIGFuZCB0aGUgbGluayBpbnN0YW5jZSBtYXkgYmUgZGlmZmVyZW50IG9iamVjdHMgaWYgdGhlIHRlbXBsYXRlIGhhcw0KLSAqIGJlZW4gY2xvbmVkLiBGb3IgdGhpcyByZWFzb24gaXQgaXMgKipub3QqKiBzYWZlIHRvIGRvIGFueXRoaW5nIG90aGVyIHRoYW4gRE9NIHRyYW5zZm9ybWF0aW9ucyB0aGF0DQotICogYXBwbHkgdG8gYWxsIGNsb25lZCBET00gbm9kZXMgd2l0aGluIHRoZSBjb21waWxlIGZ1bmN0aW9uLiBTcGVjaWZpY2FsbHksIERPTSBsaXN0ZW5lciByZWdpc3RyYXRpb24NCi0gKiBzaG91bGQgYmUgZG9uZSBpbiBhIGxpbmtpbmcgZnVuY3Rpb24gcmF0aGVyIHRoYW4gaW4gYSBjb21waWxlIGZ1bmN0aW9uLg0KLSAqIDwvZGl2Pg0KLQ0KLSAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPg0KLSAqICoqTm90ZToqKiBUaGUgY29tcGlsZSBmdW5jdGlvbiBjYW5ub3QgaGFuZGxlIGRpcmVjdGl2ZXMgdGhhdCByZWN1cnNpdmVseSB1c2UgdGhlbXNlbHZlcyBpbiB0aGVpcg0KLSAqIG93biB0ZW1wbGF0ZXMgb3IgY29tcGlsZSBmdW5jdGlvbnMuIENvbXBpbGluZyB0aGVzZSBkaXJlY3RpdmVzIHJlc3VsdHMgaW4gYW4gaW5maW5pdGUgbG9vcCBhbmQgYQ0KLSAqIHN0YWNrIG92ZXJmbG93IGVycm9ycy4NCi0gKg0KLSAqIFRoaXMgY2FuIGJlIGF2b2lkZWQgYnkgbWFudWFsbHkgdXNpbmcgJGNvbXBpbGUgaW4gdGhlIHBvc3RMaW5rIGZ1bmN0aW9uIHRvIGltcGVyYXRpdmVseSBjb21waWxlDQotICogYSBkaXJlY3RpdmUncyB0ZW1wbGF0ZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYXV0b21hdGljIHRlbXBsYXRlIGNvbXBpbGF0aW9uIHZpYSBgdGVtcGxhdGVgIG9yDQotICogYHRlbXBsYXRlVXJsYCBkZWNsYXJhdGlvbiBvciBtYW51YWwgY29tcGlsYXRpb24gaW5zaWRlIHRoZSBjb21waWxlIGZ1bmN0aW9uLg0KLSAqIDwvZGl2Pg0KLSAqDQotICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtZXJyb3IiPg0KLSAqICoqTm90ZToqKiBUaGUgYHRyYW5zY2x1ZGVgIGZ1bmN0aW9uIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBjb21waWxlIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQsIGFzIGl0DQotICogICBlLmcuIGRvZXMgbm90IGtub3cgYWJvdXQgdGhlIHJpZ2h0IG91dGVyIHNjb3BlLiBQbGVhc2UgdXNlIHRoZSB0cmFuc2NsdWRlIGZ1bmN0aW9uIHRoYXQgaXMgcGFzc2VkDQotICogICB0byB0aGUgbGluayBmdW5jdGlvbiBpbnN0ZWFkLg0KLSAqIDwvZGl2Pg0KLQ0KLSAqIEEgY29tcGlsZSBmdW5jdGlvbiBjYW4gaGF2ZSBhIHJldHVybiB2YWx1ZSB3aGljaCBjYW4gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0Lg0KLSAqDQotICogKiByZXR1cm5pbmcgYSAocG9zdC1saW5rKSBmdW5jdGlvbiAtIGlzIGVxdWl2YWxlbnQgdG8gcmVnaXN0ZXJpbmcgdGhlIGxpbmtpbmcgZnVuY3Rpb24gdmlhIHRoZQ0KLSAqICAgYGxpbmtgIHByb3BlcnR5IG9mIHRoZSBjb25maWcgb2JqZWN0IHdoZW4gdGhlIGNvbXBpbGUgZnVuY3Rpb24gaXMgZW1wdHkuDQotICoNCi0gKiAqIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBmdW5jdGlvbihzKSByZWdpc3RlcmVkIHZpYSBgcHJlYCBhbmQgYHBvc3RgIHByb3BlcnRpZXMgLSBhbGxvd3MgeW91IHRvDQotICogICBjb250cm9sIHdoZW4gYSBsaW5raW5nIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIHRoZSBsaW5raW5nIHBoYXNlLiBTZWUgaW5mbyBhYm91dA0KLSAqICAgcHJlLWxpbmtpbmcgYW5kIHBvc3QtbGlua2luZyBmdW5jdGlvbnMgYmVsb3cuDQotICoNCi0gKg0KLSAqICMjIyMgYGxpbmtgDQotICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIG9ubHkgaWYgdGhlIGBjb21waWxlYCBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZC4NCi0gKg0KLSAqIGBgYGpzDQotICogICBmdW5jdGlvbiBsaW5rKHNjb3BlLCBpRWxlbWVudCwgaUF0dHJzLCBjb250cm9sbGVyLCB0cmFuc2NsdWRlRm4pIHsgLi4uIH0NCi0gKiBgYGANCi0gKg0KLSAqIFRoZSBsaW5rIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyBET00gbGlzdGVuZXJzIGFzIHdlbGwgYXMgdXBkYXRpbmcgdGhlIERPTS4gSXQgaXMNCi0gKiBleGVjdXRlZCBhZnRlciB0aGUgdGVtcGxhdGUgaGFzIGJlZW4gY2xvbmVkLiBUaGlzIGlzIHdoZXJlIG1vc3Qgb2YgdGhlIGRpcmVjdGl2ZSBsb2dpYyB3aWxsIGJlDQotICogcHV0Lg0KLSAqDQotICogICAqIGBzY29wZWAgLSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBTY29wZX0gLSBUaGUgc2NvcGUgdG8gYmUgdXNlZCBieSB0aGUNCi0gKiAgICAgZGlyZWN0aXZlIGZvciByZWdpc3RlcmluZyB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggd2F0Y2hlc30uDQotICoNCi0gKiAgICogYGlFbGVtZW50YCAtIGluc3RhbmNlIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB3aGVyZSB0aGUgZGlyZWN0aXZlIGlzIHRvIGJlIHVzZWQuIEl0IGlzIHNhZmUgdG8NCi0gKiAgICAgbWFuaXB1bGF0ZSB0aGUgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnQgb25seSBpbiBgcG9zdExpbmtgIGZ1bmN0aW9uIHNpbmNlIHRoZSBjaGlsZHJlbiBoYXZlDQotICogICAgIGFscmVhZHkgYmVlbiBsaW5rZWQuDQotICoNCi0gKiAgICogYGlBdHRyc2AgLSBpbnN0YW5jZSBhdHRyaWJ1dGVzIC0gTm9ybWFsaXplZCBsaXN0IG9mIGF0dHJpYnV0ZXMgZGVjbGFyZWQgb24gdGhpcyBlbGVtZW50IHNoYXJlZA0KLSAqICAgICBiZXR3ZWVuIGFsbCBkaXJlY3RpdmUgbGlua2luZyBmdW5jdGlvbnMuDQotICoNCi0gKiAgICogYGNvbnRyb2xsZXJgIC0gYSBjb250cm9sbGVyIGluc3RhbmNlIC0gQSBjb250cm9sbGVyIGluc3RhbmNlIGlmIGF0IGxlYXN0IG9uZSBkaXJlY3RpdmUgb24gdGhlDQotICogICAgIGVsZW1lbnQgZGVmaW5lcyBhIGNvbnRyb2xsZXIuIFRoZSBjb250cm9sbGVyIGlzIHNoYXJlZCBhbW9uZyBhbGwgdGhlIGRpcmVjdGl2ZXMsIHdoaWNoIGFsbG93cw0KLSAqICAgICB0aGUgZGlyZWN0aXZlcyB0byB1c2UgdGhlIGNvbnRyb2xsZXJzIGFzIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsLg0KLSAqDQotICogICAqIGB0cmFuc2NsdWRlRm5gIC0gQSB0cmFuc2NsdWRlIGxpbmtpbmcgZnVuY3Rpb24gcHJlLWJvdW5kIHRvIHRoZSBjb3JyZWN0IHRyYW5zY2x1c2lvbiBzY29wZS4NCi0gKiAgICAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgYCR0cmFuc2NsdWRlYA0KLSAqICAgICBwYXJhbWV0ZXIgb2YgZGlyZWN0aXZlIGNvbnRyb2xsZXJzLCBzZWUgdGhlcmUgZm9yIGRldGFpbHMuDQotICogICAgIGBmdW5jdGlvbihbc2NvcGVdLCBjbG9uZUxpbmtpbmdGbiwgZnV0dXJlUGFyZW50RWxlbWVudClgLg0KLSAqDQotICogIyMjIyBQcmUtbGlua2luZyBmdW5jdGlvbg0KLSAqDQotICogRXhlY3V0ZWQgYmVmb3JlIHRoZSBjaGlsZCBlbGVtZW50cyBhcmUgbGlua2VkLiBOb3Qgc2FmZSB0byBkbyBET00gdHJhbnNmb3JtYXRpb24gc2luY2UgdGhlDQotICogY29tcGlsZXIgbGlua2luZyBmdW5jdGlvbiB3aWxsIGZhaWwgdG8gbG9jYXRlIHRoZSBjb3JyZWN0IGVsZW1lbnRzIGZvciBsaW5raW5nLg0KLSAqDQotICogIyMjIyBQb3N0LWxpbmtpbmcgZnVuY3Rpb24NCi0gKg0KLSAqIEV4ZWN1dGVkIGFmdGVyIHRoZSBjaGlsZCBlbGVtZW50cyBhcmUgbGlua2VkLg0KLSAqDQotICogTm90ZSB0aGF0IGNoaWxkIGVsZW1lbnRzIHRoYXQgY29udGFpbiBgdGVtcGxhdGVVcmxgIGRpcmVjdGl2ZXMgd2lsbCBub3QgaGF2ZSBiZWVuIGNvbXBpbGVkDQotICogYW5kIGxpbmtlZCBzaW5jZSB0aGV5IGFyZSB3YWl0aW5nIGZvciB0aGVpciB0ZW1wbGF0ZSB0byBsb2FkIGFzeW5jaHJvbm91c2x5IGFuZCB0aGVpciBvd24NCi0gKiBjb21waWxhdGlvbiBhbmQgbGlua2luZyBoYXMgYmVlbiBzdXNwZW5kZWQgdW50aWwgdGhhdCBvY2N1cnMuDQotICoNCi0gKiBJdCBpcyBzYWZlIHRvIGRvIERPTSB0cmFuc2Zvcm1hdGlvbiBpbiB0aGUgcG9zdC1saW5raW5nIGZ1bmN0aW9uIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB3YWl0aW5nDQotICogZm9yIHRoZWlyIGFzeW5jIHRlbXBsYXRlcyB0byBiZSByZXNvbHZlZC4NCi0gKg0KLSAqDQotICogIyMjIFRyYW5zY2x1c2lvbg0KLSAqDQotICogVHJhbnNjbHVzaW9uIGlzIHRoZSBwcm9jZXNzIG9mIGV4dHJhY3RpbmcgYSBjb2xsZWN0aW9uIG9mIERPTSBlbGVtZW50IGZyb20gb25lIHBhcnQgb2YgdGhlIERPTSBhbmQNCi0gKiBjb3B5aW5nIHRoZW0gdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSBET00sIHdoaWxlIG1haW50YWluaW5nIHRoZWlyIGNvbm5lY3Rpb24gdG8gdGhlIG9yaWdpbmFsIEFuZ3VsYXJKUw0KLSAqIHNjb3BlIGZyb20gd2hlcmUgdGhleSB3ZXJlIHRha2VuLg0KLSAqDQotICogVHJhbnNjbHVzaW9uIGlzIHVzZWQgKG9mdGVuIHdpdGgge0BsaW5rIG5nVHJhbnNjbHVkZX0pIHRvIGluc2VydCB0aGUNCi0gKiBvcmlnaW5hbCBjb250ZW50cyBvZiBhIGRpcmVjdGl2ZSdzIGVsZW1lbnQgaW50byBhIHNwZWNpZmllZCBwbGFjZSBpbiB0aGUgdGVtcGxhdGUgb2YgdGhlIGRpcmVjdGl2ZS4NCi0gKiBUaGUgYmVuZWZpdCBvZiB0cmFuc2NsdXNpb24sIG92ZXIgc2ltcGx5IG1vdmluZyB0aGUgRE9NIGVsZW1lbnRzIG1hbnVhbGx5LCBpcyB0aGF0IHRoZSB0cmFuc2NsdWRlZA0KLSAqIGNvbnRlbnQgaGFzIGFjY2VzcyB0byB0aGUgcHJvcGVydGllcyBvbiB0aGUgc2NvcGUgZnJvbSB3aGljaCBpdCB3YXMgdGFrZW4sIGV2ZW4gaWYgdGhlIGRpcmVjdGl2ZQ0KLSAqIGhhcyBpc29sYXRlZCBzY29wZS4NCi0gKiBTZWUgdGhlIHtAbGluayBndWlkZS9kaXJlY3RpdmUjY3JlYXRpbmctYS1kaXJlY3RpdmUtdGhhdC13cmFwcy1vdGhlci1lbGVtZW50cyBEaXJlY3RpdmVzIEd1aWRlfS4NCi0gKg0KLSAqIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIHRoZSB3aWRnZXQgdG8gaGF2ZSBwcml2YXRlIHN0YXRlIGZvciBpdHMgdGVtcGxhdGUsIHdoaWxlIHRoZSB0cmFuc2NsdWRlZA0KLSAqIGNvbnRlbnQgaGFzIGFjY2VzcyB0byBpdHMgb3JpZ2luYXRpbmcgc2NvcGUuDQotICoNCi0gKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC13YXJuaW5nIj4NCi0gKiAqKk5vdGU6KiogV2hlbiB0ZXN0aW5nIGFuIGVsZW1lbnQgdHJhbnNjbHVkZSBkaXJlY3RpdmUgeW91IG11c3Qgbm90IHBsYWNlIHRoZSBkaXJlY3RpdmUgYXQgdGhlIHJvb3Qgb2YgdGhlDQotICogRE9NIGZyYWdtZW50IHRoYXQgaXMgYmVpbmcgY29tcGlsZWQuIFNlZSB7QGxpbmsgZ3VpZGUvdW5pdC10ZXN0aW5nI3Rlc3RpbmctdHJhbnNjbHVzaW9uLWRpcmVjdGl2ZXMNCi0gKiBUZXN0aW5nIFRyYW5zY2x1c2lvbiBEaXJlY3RpdmVzfS4NCi0gKiA8L2Rpdj4NCi0gKg0KLSAqICMjIyMgVHJhbnNjbHVzaW9uIEZ1bmN0aW9ucw0KLSAqDQotICogV2hlbiBhIGRpcmVjdGl2ZSByZXF1ZXN0cyB0cmFuc2NsdXNpb24sIHRoZSBjb21waWxlciBleHRyYWN0cyBpdHMgY29udGVudHMgYW5kIHByb3ZpZGVzIGEgKip0cmFuc2NsdXNpb24NCi0gKiBmdW5jdGlvbioqIHRvIHRoZSBkaXJlY3RpdmUncyBgbGlua2AgZnVuY3Rpb24gYW5kIGBjb250cm9sbGVyYC4gVGhpcyB0cmFuc2NsdXNpb24gZnVuY3Rpb24gaXMgYSBzcGVjaWFsDQotICogKipsaW5raW5nIGZ1bmN0aW9uKiogdGhhdCB3aWxsIHJldHVybiB0aGUgY29tcGlsZWQgY29udGVudHMgbGlua2VkIHRvIGEgbmV3IHRyYW5zY2x1c2lvbiBzY29wZS4NCi0gKg0KLSAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPg0KLSAqIElmIHlvdSBhcmUganVzdCB1c2luZyB7QGxpbmsgbmdUcmFuc2NsdWRlfSB0aGVuIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgZnVuY3Rpb24sIHNpbmNlDQotICogbmdUcmFuc2NsdWRlIHdpbGwgZGVhbCB3aXRoIGl0IGZvciB1cy4NCi0gKiA8L2Rpdj4NCi0gKg0KLSAqIElmIHlvdSB3YW50IHRvIG1hbnVhbGx5IGNvbnRyb2wgdGhlIGluc2VydGlvbiBhbmQgcmVtb3ZhbCBvZiB0aGUgdHJhbnNjbHVkZWQgY29udGVudCBpbiB5b3VyIGRpcmVjdGl2ZQ0KLSAqIHRoZW4geW91IG11c3QgdXNlIHRoaXMgdHJhbnNjbHVkZSBmdW5jdGlvbi4gV2hlbiB5b3UgY2FsbCBhIHRyYW5zY2x1ZGUgZnVuY3Rpb24gaXQgcmV0dXJucyBhIGEganFMaXRlL0pRdWVyeQ0KLSAqIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBjb21waWxlZCBET00sIHdoaWNoIGlzIGxpbmtlZCB0byB0aGUgY29ycmVjdCB0cmFuc2NsdXNpb24gc2NvcGUuDQotICoNCi0gKiBXaGVuIHlvdSBjYWxsIGEgdHJhbnNjbHVzaW9uIGZ1bmN0aW9uIHlvdSBjYW4gcGFzcyBpbiBhICoqY2xvbmUgYXR0YWNoIGZ1bmN0aW9uKiouIFRoaXMgZnVuY3Rpb24gYWNjZXB0cw0KLSAqIHR3byBwYXJhbWV0ZXJzLCBgZnVuY3Rpb24oY2xvbmUsIHNjb3BlKSB7IC4uLiB9YCwgd2hlcmUgdGhlIGBjbG9uZWAgaXMgYSBmcmVzaCBjb21waWxlZCBjb3B5IG9mIHlvdXIgdHJhbnNjbHVkZWQNCi0gKiBjb250ZW50IGFuZCB0aGUgYHNjb3BlYCBpcyB0aGUgbmV3bHkgY3JlYXRlZCB0cmFuc2NsdXNpb24gc2NvcGUsIHRvIHdoaWNoIHRoZSBjbG9uZSBpcyBib3VuZC4NCi0gKg0KLSAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPg0KLSAqICoqQmVzdCBQcmFjdGljZSoqOiBBbHdheXMgcHJvdmlkZSBhIGBjbG9uZUZuYCAoY2xvbmUgYXR0YWNoIGZ1bmN0aW9uKSB3aGVuIHlvdSBjYWxsIGEgdHJhbnNsdWRlIGZ1bmN0aW9uDQotICogc2luY2UgeW91IHRoZW4gZ2V0IGEgZnJlc2ggY2xvbmUgb2YgdGhlIG9yaWdpbmFsIERPTSBhbmQgYWxzbyBoYXZlIGFjY2VzcyB0byB0aGUgbmV3IHRyYW5zY2x1c2lvbiBzY29wZS4NCi0gKiA8L2Rpdj4NCi0gKg0KLSAqIEl0IGlzIG5vcm1hbCBwcmFjdGljZSB0byBhdHRhY2ggeW91ciB0cmFuc2NsdWRlZCBjb250ZW50IChgY2xvbmVgKSB0byB0aGUgRE9NIGluc2lkZSB5b3VyICoqY2xvbmUNCi0gKiBhdHRhY2ggZnVuY3Rpb24qKjoNCi0gKg0KLSAqIGBgYGpzDQotICogdmFyIHRyYW5zY2x1ZGVkQ29udGVudCwgdHJhbnNjbHVzaW9uU2NvcGU7DQotICoNCi0gKiAkdHJhbnNjbHVkZShmdW5jdGlvbihjbG9uZSwgc2NvcGUpIHsNCi0gKiAgIGVsZW1lbnQuYXBwZW5kKGNsb25lKTsNCi0gKiAgIHRyYW5zY2x1ZGVkQ29udGVudCA9IGNsb25lOw0KLSAqICAgdHJhbnNjbHVzaW9uU2NvcGUgPSBzY29wZTsNCi0gKiB9KTsNCi0gKiBgYGANCi0gKg0KLSAqIExhdGVyLCBpZiB5b3Ugd2FudCB0byByZW1vdmUgdGhlIHRyYW5zY2x1ZGVkIGNvbnRlbnQgZnJvbSB5b3VyIERPTSB0aGVuIHlvdSBzaG91bGQgYWxzbyBkZXN0cm95IHRoZQ0KLSAqIGFzc29jaWF0ZWQgdHJhbnNjbHVzaW9uIHNjb3BlOg0KLSAqDQotICogYGBganMNCi0gKiB0cmFuc2NsdWRlZENvbnRlbnQucmVtb3ZlKCk7DQotICogdHJhbnNjbHVzaW9uU2NvcGUuJGRlc3Ryb3koKTsNCi0gKiBgYGANCi0gKg0KLSAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPg0KLSAqICoqQmVzdCBQcmFjdGljZSoqOiBpZiB5b3UgaW50ZW5kIHRvIGFkZCBhbmQgcmVtb3ZlIHRyYW5zY2x1ZGVkIGNvbnRlbnQgbWFudWFsbHkgaW4geW91ciBkaXJlY3RpdmUNCi0gKiAoYnkgY2FsbGluZyB0aGUgdHJhbnNjbHVkZSBmdW5jdGlvbiB0byBnZXQgdGhlIERPTSBhbmQgYW5kIGNhbGxpbmcgYGVsZW1lbnQucmVtb3ZlKClgIHRvIHJlbW92ZSBpdCksDQotICogdGhlbiB5b3UgYXJlIGFsc28gcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgYCRkZXN0cm95YCBvbiB0aGUgdHJhbnNjbHVzaW9uIHNjb3BlLg0KLSAqIDwvZGl2Pg0KLSAqDQotICogVGhlIGJ1aWx0LWluIERPTSBtYW5pcHVsYXRpb24gZGlyZWN0aXZlcywgc3VjaCBhcyB7QGxpbmsgbmdJZn0sIHtAbGluayBuZ1N3aXRjaH0gYW5kIHtAbGluayBuZ1JlcGVhdH0NCi0gKiBhdXRvbWF0aWNhbGx5IGRlc3Ryb3kgdGhlaXIgdHJhbnNsdWRlZCBjbG9uZXMgYXMgbmVjZXNzYXJ5IHNvIHlvdSBkbyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIGlmDQotICogeW91IGFyZSBzaW1wbHkgdXNpbmcge0BsaW5rIG5nVHJhbnNjbHVkZX0gdG8gaW5qZWN0IHRoZSB0cmFuc2NsdXNpb24gaW50byB5b3VyIGRpcmVjdGl2ZS4NCi0gKg0KLSAqDQotICogIyMjIyBUcmFuc2NsdXNpb24gU2NvcGVzDQotICoNCi0gKiBXaGVuIHlvdSBjYWxsIGEgdHJhbnNjbHVkZSBmdW5jdGlvbiBpdCByZXR1cm5zIGEgRE9NIGZyYWdtZW50IHRoYXQgaXMgcHJlLWJvdW5kIHRvIGEgKip0cmFuc2NsdXNpb24NCi0gKiBzY29wZSoqLiBUaGlzIHNjb3BlIGlzIHNwZWNpYWwsIGluIHRoYXQgaXQgaXMgYSBjaGlsZCBvZiB0aGUgZGlyZWN0aXZlJ3Mgc2NvcGUgKGFuZCBzbyBnZXRzIGRlc3Ryb3llZA0KLSAqIHdoZW4gdGhlIGRpcmVjdGl2ZSdzIHNjb3BlIGdldHMgZGVzdHJveWVkKSBidXQgaXQgaW5oZXJpdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNjb3BlIGZyb20gd2hpY2ggaXQNCi0gKiB3YXMgdGFrZW4uDQotICoNCi0gKiBGb3IgZXhhbXBsZSBjb25zaWRlciBhIGRpcmVjdGl2ZSB0aGF0IHVzZXMgdHJhbnNjbHVzaW9uIGFuZCBpc29sYXRlZCBzY29wZS4gVGhlIERPTSBoaWVyYXJjaHkgbWlnaHQgbG9vaw0KLSAqIGxpa2UgdGhpczoNCi0gKg0KLSAqIGBgYGh0bWwNCi0gKiA8ZGl2IG5nLWFwcD4NCi0gKiAgIDxkaXYgaXNvbGF0ZT4NCi0gKiAgICAgPGRpdiB0cmFuc2NsdXNpb24+DQotICogICAgIDwvZGl2Pg0KLSAqICAgPC9kaXY+DQotICogPC9kaXY+DQotICogYGBgDQotICoNCi0gKiBUaGUgYCRwYXJlbnRgIHNjb3BlIGhpZXJhcmNoeSB3aWxsIGxvb2sgbGlrZSB0aGlzOg0KLSAqDQotICogYGBgDQotICogLSAkcm9vdFNjb3BlDQotICogICAtIGlzb2xhdGUNCi0gKiAgICAgLSB0cmFuc2NsdXNpb24NCi0gKiBgYGANCi0gKg0KLSAqIGJ1dCB0aGUgc2NvcGVzIHdpbGwgaW5oZXJpdCBwcm90b3R5cGljYWxseSBmcm9tIGRpZmZlcmVudCBzY29wZXMgdG8gdGhlaXIgYCRwYXJlbnRgLg0KLSAqDQotICogYGBgDQotICogLSAkcm9vdFNjb3BlDQotICogICAtIHRyYW5zY2x1c2lvbg0KLSAqIC0gaXNvbGF0ZQ0KLSAqIGBgYA0KLSAqDQotICoNCi0gKiAjIyMgQXR0cmlidXRlcw0KLSAqDQotICogVGhlIHtAbGluayBuZy4kY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyBBdHRyaWJ1dGVzfSBvYmplY3QgLSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgaW4gdGhlDQotICogYGxpbmsoKWAgb3IgYGNvbXBpbGUoKWAgZnVuY3Rpb25zLiBJdCBoYXMgYSB2YXJpZXR5IG9mIHVzZXMuDQotICoNCi0gKiBhY2Nlc3NpbmcgKk5vcm1hbGl6ZWQgYXR0cmlidXRlIG5hbWVzOioNCi0gKiBEaXJlY3RpdmVzIGxpa2UgJ25nQmluZCcgY2FuIGJlIGV4cHJlc3NlZCBpbiBtYW55IHdheXM6ICduZzpiaW5kJywgYGRhdGEtbmctYmluZGAsIG9yICd4LW5nLWJpbmQnLg0KLSAqIHRoZSBhdHRyaWJ1dGVzIG9iamVjdCBhbGxvd3MgZm9yIG5vcm1hbGl6ZWQgYWNjZXNzIHRvDQotICogICB0aGUgYXR0cmlidXRlcy4NCi0gKg0KLSAqICogKkRpcmVjdGl2ZSBpbnRlci1jb21tdW5pY2F0aW9uOiogQWxsIGRpcmVjdGl2ZXMgc2hhcmUgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgdGhlIGF0dHJpYnV0ZXMNCi0gKiAgIG9iamVjdCB3aGljaCBhbGxvd3MgdGhlIGRpcmVjdGl2ZXMgdG8gdXNlIHRoZSBhdHRyaWJ1dGVzIG9iamVjdCBhcyBpbnRlciBkaXJlY3RpdmUNCi0gKiAgIGNvbW11bmljYXRpb24uDQotICoNCi0gKiAqICpTdXBwb3J0cyBpbnRlcnBvbGF0aW9uOiogSW50ZXJwb2xhdGlvbiBhdHRyaWJ1dGVzIGFyZSBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlIG9iamVjdA0KLSAqICAgYWxsb3dpbmcgb3RoZXIgZGlyZWN0aXZlcyB0byByZWFkIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuDQotICoNCi0gKiAqICpPYnNlcnZpbmcgaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZXM6KiBVc2UgYCRvYnNlcnZlYCB0byBvYnNlcnZlIHRoZSB2YWx1ZSBjaGFuZ2VzIG9mIGF0dHJpYnV0ZXMNCi0gKiAgIHRoYXQgY29udGFpbiBpbnRlcnBvbGF0aW9uIChlLmcuIGBzcmM9Int7YmFyfX0iYCkuIE5vdCBvbmx5IGlzIHRoaXMgdmVyeSBlZmZpY2llbnQgYnV0IGl0J3MgYWxzbw0KLSAqICAgdGhlIG9ubHkgd2F5IHRvIGVhc2lseSBnZXQgdGhlIGFjdHVhbCB2YWx1ZSBiZWNhdXNlIGR1cmluZyB0aGUgbGlua2luZyBwaGFzZSB0aGUgaW50ZXJwb2xhdGlvbg0KLSAqICAgaGFzbid0IGJlZW4gZXZhbHVhdGVkIHlldCBhbmQgc28gdGhlIHZhbHVlIGlzIGF0IHRoaXMgdGltZSBzZXQgdG8gYHVuZGVmaW5lZGAuDQotICoNCi0gKiBgYGBqcw0KLSAqIGZ1bmN0aW9uIGxpbmtpbmdGbihzY29wZSwgZWxtLCBhdHRycywgY3RybCkgew0KLSAqICAgLy8gZ2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUNCi0gKiAgIGNvbnNvbGUubG9nKGF0dHJzLm5nTW9kZWwpOw0KLSAqDQotICogICAvLyBjaGFuZ2UgdGhlIGF0dHJpYnV0ZQ0KLSAqICAgYXR0cnMuJHNldCgnbmdNb2RlbCcsICduZXcgdmFsdWUnKTsNCi0gKg0KLSAqICAgLy8gb2JzZXJ2ZSBjaGFuZ2VzIHRvIGludGVycG9sYXRlZCBhdHRyaWJ1dGUNCi0gKiAgIGF0dHJzLiRvYnNlcnZlKCduZ01vZGVsJywgZnVuY3Rpb24odmFsdWUpIHsNCi0gKiAgICAgY29uc29sZS5sb2coJ25nTW9kZWwgaGFzIGNoYW5nZWQgdmFsdWUgdG8gJyArIHZhbHVlKTsNCi0gKiAgIH0pOw0KLSAqIH0NCi0gKiBgYGANCi0gKg0KLSAqICMjIEV4YW1wbGUNCi0gKg0KLSAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPg0KLSAqICoqTm90ZSoqOiBUeXBpY2FsbHkgZGlyZWN0aXZlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIGBtb2R1bGUuZGlyZWN0aXZlYC4gVGhlIGV4YW1wbGUgYmVsb3cgaXMNCi0gKiB0byBpbGx1c3RyYXRlIGhvdyBgJGNvbXBpbGVgIHdvcmtzLg0KLSAqIDwvZGl2Pg0KLSAqDQotIDxleGFtcGxlIG1vZHVsZT0iY29tcGlsZUV4YW1wbGUiPg0KLSAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICA8c2NyaXB0Pg0KLSAgICAgIGFuZ3VsYXIubW9kdWxlKCdjb21waWxlRXhhbXBsZScsIFtdLCBmdW5jdGlvbigkY29tcGlsZVByb3ZpZGVyKSB7DQotICAgICAgICAvLyBjb25maWd1cmUgbmV3ICdjb21waWxlJyBkaXJlY3RpdmUgYnkgcGFzc2luZyBhIGRpcmVjdGl2ZQ0KLSAgICAgICAgLy8gZmFjdG9yeSBmdW5jdGlvbi4gVGhlIGZhY3RvcnkgZnVuY3Rpb24gaW5qZWN0cyB0aGUgJyRjb21waWxlJw0KLSAgICAgICAgJGNvbXBpbGVQcm92aWRlci5kaXJlY3RpdmUoJ2NvbXBpbGUnLCBmdW5jdGlvbigkY29tcGlsZSkgew0KLSAgICAgICAgICAvLyBkaXJlY3RpdmUgZmFjdG9yeSBjcmVhdGVzIGEgbGluayBmdW5jdGlvbg0KLSAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7DQotICAgICAgICAgICAgc2NvcGUuJHdhdGNoKA0KLSAgICAgICAgICAgICAgZnVuY3Rpb24oc2NvcGUpIHsNCi0gICAgICAgICAgICAgICAgIC8vIHdhdGNoIHRoZSAnY29tcGlsZScgZXhwcmVzc2lvbiBmb3IgY2hhbmdlcw0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2NvcGUuJGV2YWwoYXR0cnMuY29tcGlsZSk7DQotICAgICAgICAgICAgICB9LA0KLSAgICAgICAgICAgICAgZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgJ2NvbXBpbGUnIGV4cHJlc3Npb24gY2hhbmdlcw0KLSAgICAgICAgICAgICAgICAvLyBhc3NpZ24gaXQgaW50byB0aGUgY3VycmVudCBET00NCi0gICAgICAgICAgICAgICAgZWxlbWVudC5odG1sKHZhbHVlKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gY29tcGlsZSB0aGUgbmV3IERPTSBhbmQgbGluayBpdCB0byB0aGUgY3VycmVudA0KLSAgICAgICAgICAgICAgICAvLyBzY29wZS4NCi0gICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugb25seSBjb21waWxlIC5jaGlsZE5vZGVzIHNvIHRoYXQNCi0gICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgZ2V0IGludG8gaW5maW5pdGUgbG9vcCBjb21waWxpbmcgb3Vyc2VsdmVzDQotICAgICAgICAgICAgICAgICRjb21waWxlKGVsZW1lbnQuY29udGVudHMoKSkoc2NvcGUpOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICk7DQotICAgICAgICAgIH07DQotICAgICAgICB9KTsNCi0gICAgICB9KQ0KLSAgICAgIC5jb250cm9sbGVyKCdHcmVldGVyQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAkc2NvcGUubmFtZSA9ICdBbmd1bGFyJzsNCi0gICAgICAgICRzY29wZS5odG1sID0gJ0hlbGxvIHt7bmFtZX19JzsNCi0gICAgICB9XSk7DQotICAgIDwvc2NyaXB0Pg0KLSAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkdyZWV0ZXJDb250cm9sbGVyIj4NCi0gICAgICA8aW5wdXQgbmctbW9kZWw9Im5hbWUiPiA8YnI+DQotICAgICAgPHRleHRhcmVhIG5nLW1vZGVsPSJodG1sIj48L3RleHRhcmVhPiA8YnI+DQotICAgICAgPGRpdiBjb21waWxlPSJodG1sIj48L2Rpdj4NCi0gICAgPC9kaXY+DQotICAgPC9maWxlPg0KLSAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgaXQoJ3Nob3VsZCBhdXRvIGNvbXBpbGUnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgdmFyIHRleHRhcmVhID0gJCgndGV4dGFyZWEnKTsNCi0gICAgICAgdmFyIG91dHB1dCA9ICQoJ2Rpdltjb21waWxlXScpOw0KLSAgICAgICAvLyBUaGUgaW5pdGlhbCBzdGF0ZSByZWFkcyAnSGVsbG8gQW5ndWxhcicuDQotICAgICAgIGV4cGVjdChvdXRwdXQuZ2V0VGV4dCgpKS50b0JlKCdIZWxsbyBBbmd1bGFyJyk7DQotICAgICAgIHRleHRhcmVhLmNsZWFyKCk7DQotICAgICAgIHRleHRhcmVhLnNlbmRLZXlzKCd7e25hbWV9fSEnKTsNCi0gICAgICAgZXhwZWN0KG91dHB1dC5nZXRUZXh0KCkpLnRvQmUoJ0FuZ3VsYXIhJyk7DQotICAgICB9KTsNCi0gICA8L2ZpbGU+DQotIDwvZXhhbXBsZT4NCi0NCi0gKg0KLSAqDQotICogQHBhcmFtIHtzdHJpbmd8RE9NRWxlbWVudH0gZWxlbWVudCBFbGVtZW50IG9yIEhUTUwgc3RyaW5nIHRvIGNvbXBpbGUgaW50byBhIHRlbXBsYXRlIGZ1bmN0aW9uLg0KLSAqIEBwYXJhbSB7ZnVuY3Rpb24oYW5ndWxhci5TY29wZSwgY2xvbmVBdHRhY2hGbj0pfSB0cmFuc2NsdWRlIGZ1bmN0aW9uIGF2YWlsYWJsZSB0byBkaXJlY3RpdmVzIC0gREVQUkVDQVRFRC4NCi0gKg0KLSAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWVycm9yIj4NCi0gKiAqKk5vdGU6KiogUGFzc2luZyBhIGB0cmFuc2NsdWRlYCBmdW5jdGlvbiB0byB0aGUgJGNvbXBpbGUgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCwgYXMgaXQNCi0gKiAgIGUuZy4gd2lsbCBub3QgdXNlIHRoZSByaWdodCBvdXRlciBzY29wZS4gUGxlYXNlIHBhc3MgdGhlIHRyYW5zY2x1ZGUgZnVuY3Rpb24gYXMgYQ0KLSAqICAgYHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuYCB0byB0aGUgbGluayBmdW5jdGlvbiBpbnN0ZWFkLg0KLSAqIDwvZGl2Pg0KLSAqDQotICogQHBhcmFtIHtudW1iZXJ9IG1heFByaW9yaXR5IG9ubHkgYXBwbHkgZGlyZWN0aXZlcyBsb3dlciB0aGFuIGdpdmVuIHByaW9yaXR5IChPbmx5IGVmZmVjdHMgdGhlDQotICogICAgICAgICAgICAgICAgIHJvb3QgZWxlbWVudChzKSwgbm90IHRoZWlyIGNoaWxkcmVuKQ0KLSAqIEByZXR1cm5zIHtmdW5jdGlvbihzY29wZSwgY2xvbmVBdHRhY2hGbj0sIG9wdGlvbnM9KX0gYSBsaW5rIGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gYmluZCB0ZW1wbGF0ZQ0KLSAqIChhIERPTSBlbGVtZW50L3RyZWUpIHRvIGEgc2NvcGUuIFdoZXJlOg0KLSAqDQotICogICogYHNjb3BlYCAtIEEge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUgU2NvcGV9IHRvIGJpbmQgdG8uDQotICogICogYGNsb25lQXR0YWNoRm5gIC0gSWYgYGNsb25lQXR0YWNoRm5gIGlzIHByb3ZpZGVkLCB0aGVuIHRoZSBsaW5rIGZ1bmN0aW9uIHdpbGwgY2xvbmUgdGhlDQotICogIGB0ZW1wbGF0ZWAgYW5kIGNhbGwgdGhlIGBjbG9uZUF0dGFjaEZuYCBmdW5jdGlvbiBhbGxvd2luZyB0aGUgY2FsbGVyIHRvIGF0dGFjaCB0aGUNCi0gKiAgY2xvbmVkIGVsZW1lbnRzIHRvIHRoZSBET00gZG9jdW1lbnQgYXQgdGhlIGFwcHJvcHJpYXRlIHBsYWNlLiBUaGUgYGNsb25lQXR0YWNoRm5gIGlzDQotICogIGNhbGxlZCBhczogPGJyPiBgY2xvbmVBdHRhY2hGbihjbG9uZWRFbGVtZW50LCBzY29wZSlgIHdoZXJlOg0KLSAqDQotICogICAgICAqIGBjbG9uZWRFbGVtZW50YCAtIGlzIGEgY2xvbmUgb2YgdGhlIG9yaWdpbmFsIGBlbGVtZW50YCBwYXNzZWQgaW50byB0aGUgY29tcGlsZXIuDQotICogICAgICAqIGBzY29wZWAgLSBpcyB0aGUgY3VycmVudCBzY29wZSB3aXRoIHdoaWNoIHRoZSBsaW5raW5nIGZ1bmN0aW9uIGlzIHdvcmtpbmcgd2l0aC4NCi0gKg0KLSAqICAqIGBvcHRpb25zYCAtIEFuIG9wdGlvbmFsIG9iamVjdCBoYXNoIHdpdGggbGlua2luZyBvcHRpb25zLiBJZiBgb3B0aW9uc2AgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIGZvbGxvd2luZw0KLSAqICBrZXlzIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgbGlua2luZyBiZWhhdmlvcjoNCi0gKg0KLSAqICAgICAgKiBgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm5gIC0gdGhlIHRyYW5zY2x1ZGUgZnVuY3Rpb24gbWFkZSBhdmFpbGFibGUgdG8NCi0gKiAgICAgICAgZGlyZWN0aXZlczsgaWYgZ2l2ZW4sIGl0IHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGxpbmsgZnVuY3Rpb25zIG9mDQotICogICAgICAgIGRpcmVjdGl2ZXMgZm91bmQgaW4gYGVsZW1lbnRgIGR1cmluZyBjb21waWxhdGlvbi4NCi0gKiAgICAgICogYHRyYW5zY2x1ZGVDb250cm9sbGVyc2AgLSBhbiBvYmplY3QgaGFzaCB3aXRoIGtleXMgdGhhdCBtYXAgY29udHJvbGxlciBuYW1lcw0KLSAqICAgICAgICB0byBjb250cm9sbGVyIGluc3RhbmNlczsgaWYgZ2l2ZW4sIGl0IHdpbGwgbWFrZSB0aGUgY29udHJvbGxlcnMNCi0gKiAgICAgICAgYXZhaWxhYmxlIHRvIGRpcmVjdGl2ZXMuDQotICogICAgICAqIGBmdXR1cmVQYXJlbnRFbGVtZW50YCAtIGRlZmluZXMgdGhlIHBhcmVudCB0byB3aGljaCB0aGUgYGNsb25lQXR0YWNoRm5gIHdpbGwgYWRkDQotICogICAgICAgIHRoZSBjbG9uZWQgZWxlbWVudHM7IG9ubHkgbmVlZGVkIGZvciB0cmFuc2NsdWRlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGNvbnRhaW4gbm9uIGh0bWwNCi0gKiAgICAgICAgZWxlbWVudHMgKGUuZy4gU1ZHIGVsZW1lbnRzKS4gU2VlIGFsc28gdGhlIGRpcmVjdGl2ZS5jb250cm9sbGVyIHByb3BlcnR5Lg0KLSAqDQotICogQ2FsbGluZyB0aGUgbGlua2luZyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlbGVtZW50IG9mIHRoZSB0ZW1wbGF0ZS4gSXQgaXMgZWl0aGVyIHRoZSBvcmlnaW5hbA0KLSAqIGVsZW1lbnQgcGFzc2VkIGluLCBvciB0aGUgY2xvbmUgb2YgdGhlIGVsZW1lbnQgaWYgdGhlIGBjbG9uZUF0dGFjaEZuYCBpcyBwcm92aWRlZC4NCi0gKg0KLSAqIEFmdGVyIGxpbmtpbmcgdGhlIHZpZXcgaXMgbm90IHVwZGF0ZWQgdW50aWwgYWZ0ZXIgYSBjYWxsIHRvICRkaWdlc3Qgd2hpY2ggdHlwaWNhbGx5IGlzIGRvbmUgYnkNCi0gKiBBbmd1bGFyIGF1dG9tYXRpY2FsbHkuDQotICoNCi0gKiBJZiB5b3UgbmVlZCBhY2Nlc3MgdG8gdGhlIGJvdW5kIHZpZXcsIHRoZXJlIGFyZSB0d28gd2F5cyB0byBkbyBpdDoNCi0gKg0KLSAqIC0gSWYgeW91IGFyZSBub3QgYXNraW5nIHRoZSBsaW5raW5nIGZ1bmN0aW9uIHRvIGNsb25lIHRoZSB0ZW1wbGF0ZSwgY3JlYXRlIHRoZSBET00gZWxlbWVudChzKQ0KLSAqICAgYmVmb3JlIHlvdSBzZW5kIHRoZW0gdG8gdGhlIGNvbXBpbGVyIGFuZCBrZWVwIHRoaXMgcmVmZXJlbmNlIGFyb3VuZC4NCi0gKiAgIGBgYGpzDQotICogICAgIHZhciBlbGVtZW50ID0gJGNvbXBpbGUoJzxwPnt7dG90YWx9fTwvcD4nKShzY29wZSk7DQotICogICBgYGANCi0gKg0KLSAqIC0gaWYgb24gdGhlIG90aGVyIGhhbmQsIHlvdSBuZWVkIHRoZSBlbGVtZW50IHRvIGJlIGNsb25lZCwgdGhlIHZpZXcgcmVmZXJlbmNlIGZyb20gdGhlIG9yaWdpbmFsDQotICogICBleGFtcGxlIHdvdWxkIG5vdCBwb2ludCB0byB0aGUgY2xvbmUsIGJ1dCByYXRoZXIgdG8gdGhlIG9yaWdpbmFsIHRlbXBsYXRlIHRoYXQgd2FzIGNsb25lZC4gSW4NCi0gKiAgIHRoaXMgY2FzZSwgeW91IGNhbiBhY2Nlc3MgdGhlIGNsb25lIHZpYSB0aGUgY2xvbmVBdHRhY2hGbjoNCi0gKiAgIGBgYGpzDQotICogICAgIHZhciB0ZW1wbGF0ZUVsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoJzxwPnt7dG90YWx9fTwvcD4nKSwNCi0gKiAgICAgICAgIHNjb3BlID0gLi4uLjsNCi0gKg0KLSAqICAgICB2YXIgY2xvbmVkRWxlbWVudCA9ICRjb21waWxlKHRlbXBsYXRlRWxlbWVudCkoc2NvcGUsIGZ1bmN0aW9uKGNsb25lZEVsZW1lbnQsIHNjb3BlKSB7DQotICogICAgICAgLy9hdHRhY2ggdGhlIGNsb25lIHRvIERPTSBkb2N1bWVudCBhdCB0aGUgcmlnaHQgcGxhY2UNCi0gKiAgICAgfSk7DQotICoNCi0gKiAgICAgLy9ub3cgd2UgaGF2ZSByZWZlcmVuY2UgdG8gdGhlIGNsb25lZCBET00gdmlhIGBjbG9uZWRFbGVtZW50YA0KLSAqICAgYGBgDQotICoNCi0gKg0KLSAqIEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdGhlIGNvbXBpbGVyIHdvcmtzLCBzZWUgdGhlDQotICoge0BsaW5rIGd1aWRlL2NvbXBpbGVyIEFuZ3VsYXIgSFRNTCBDb21waWxlcn0gc2VjdGlvbiBvZiB0aGUgRGV2ZWxvcGVyIEd1aWRlLg0KLSAqLw0KLQ0KLXZhciAkY29tcGlsZU1pbkVyciA9IG1pbkVycignJGNvbXBpbGUnKTsNCi0NCi0vKioNCi0gKiBAbmdkb2MgcHJvdmlkZXINCi0gKiBAbmFtZSAkY29tcGlsZVByb3ZpZGVyDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKi8NCi0kQ29tcGlsZVByb3ZpZGVyLiRpbmplY3QgPSBbJyRwcm92aWRlJywgJyQkc2FuaXRpemVVcmlQcm92aWRlciddOw0KLWZ1bmN0aW9uICRDb21waWxlUHJvdmlkZXIoJHByb3ZpZGUsICQkc2FuaXRpemVVcmlQcm92aWRlcikgew0KLSAgdmFyIGhhc0RpcmVjdGl2ZXMgPSB7fSwNCi0gICAgICBTdWZmaXggPSAnRGlyZWN0aXZlJywNCi0gICAgICBDT01NRU5UX0RJUkVDVElWRV9SRUdFWFAgPSAvXlxzKmRpcmVjdGl2ZVw6XHMqKFtcd1wtXSspXHMrKC4qKSQvLA0KLSAgICAgIENMQVNTX0RJUkVDVElWRV9SRUdFWFAgPSAvKChbXHdcLV0rKSg/Olw6KFteO10rKSk/Oz8pLywNCi0gICAgICBBTExfT1JfTk9USElOR19BVFRSUyA9IG1ha2VNYXAoJ25nU3JjLG5nU3Jjc2V0LHNyYyxzcmNzZXQnKSwNCi0gICAgICBSRVFVSVJFX1BSRUZJWF9SRUdFWFAgPSAvXig/OihcXlxePyk/KFw/KT8oXF5cXj8pPyk/LzsNCi0NCi0gIC8vIFJlZjogaHR0cDovL2RldmVsb3BlcnMud2hhdHdnLm9yZy93ZWJhcHBhcGlzLmh0bWwjZXZlbnQtaGFuZGxlci1pZGwtYXR0cmlidXRlcw0KLSAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCBmdXR1cmUgRE9NIGV2ZW50IGF0dHJpYnV0ZSBuYW1lcyB3aWxsIGJlZ2luIHdpdGgNCi0gIC8vICdvbicgYW5kIGJlIGNvbXBvc2VkIG9mIG9ubHkgRW5nbGlzaCBsZXR0ZXJzLg0KLSAgdmFyIEVWRU5UX0hBTkRMRVJfQVRUUl9SRUdFWFAgPSAvXihvblthLXpdK3xmb3JtYWN0aW9uKSQvOw0KLQ0KLSAgZnVuY3Rpb24gcGFyc2VJc29sYXRlQmluZGluZ3Moc2NvcGUsIGRpcmVjdGl2ZU5hbWUpIHsNCi0gICAgdmFyIExPQ0FMX1JFR0VYUCA9IC9eXHMqKFtAJl18PShcKj8pKShcPz8pXHMqKFx3KilccyokLzsNCi0NCi0gICAgdmFyIGJpbmRpbmdzID0ge307DQotDQotICAgIGZvckVhY2goc2NvcGUsIGZ1bmN0aW9uKGRlZmluaXRpb24sIHNjb3BlTmFtZSkgew0KLSAgICAgIHZhciBtYXRjaCA9IGRlZmluaXRpb24ubWF0Y2goTE9DQUxfUkVHRVhQKTsNCi0NCi0gICAgICBpZiAoIW1hdGNoKSB7DQotICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignaXNjcCcsDQotICAgICAgICAgICAgIkludmFsaWQgaXNvbGF0ZSBzY29wZSBkZWZpbml0aW9uIGZvciBkaXJlY3RpdmUgJ3swfScuIiArDQotICAgICAgICAgICAgIiBEZWZpbml0aW9uOiB7Li4uIHsxfTogJ3syfScgLi4ufSIsDQotICAgICAgICAgICAgZGlyZWN0aXZlTmFtZSwgc2NvcGVOYW1lLCBkZWZpbml0aW9uKTsNCi0gICAgICB9DQotDQotICAgICAgYmluZGluZ3Nbc2NvcGVOYW1lXSA9IHsNCi0gICAgICAgIG1vZGU6IG1hdGNoWzFdWzBdLA0KLSAgICAgICAgY29sbGVjdGlvbjogbWF0Y2hbMl0gPT09ICcqJywNCi0gICAgICAgIG9wdGlvbmFsOiBtYXRjaFszXSA9PT0gJz8nLA0KLSAgICAgICAgYXR0ck5hbWU6IG1hdGNoWzRdIHx8IHNjb3BlTmFtZQ0KLSAgICAgIH07DQotICAgIH0pOw0KLQ0KLSAgICByZXR1cm4gYmluZGluZ3M7DQotICB9DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lICRjb21waWxlUHJvdmlkZXIjZGlyZWN0aXZlDQotICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogUmVnaXN0ZXIgYSBuZXcgZGlyZWN0aXZlIHdpdGggdGhlIGNvbXBpbGVyLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gbmFtZSBOYW1lIG9mIHRoZSBkaXJlY3RpdmUgaW4gY2FtZWwtY2FzZSAoaS5lLiA8Y29kZT5uZ0JpbmQ8L2NvZGU+IHdoaWNoDQotICAgKiAgICB3aWxsIG1hdGNoIGFzIDxjb2RlPm5nLWJpbmQ8L2NvZGU+KSwgb3IgYW4gb2JqZWN0IG1hcCBvZiBkaXJlY3RpdmVzIHdoZXJlIHRoZSBrZXlzIGFyZSB0aGUNCi0gICAqICAgIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgZmFjdG9yaWVzLg0KLSAgICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheX0gZGlyZWN0aXZlRmFjdG9yeSBBbiBpbmplY3RhYmxlIGRpcmVjdGl2ZSBmYWN0b3J5IGZ1bmN0aW9uLiBTZWUNCi0gICAqICAgIHtAbGluayBndWlkZS9kaXJlY3RpdmV9IGZvciBtb3JlIGluZm8uDQotICAgKiBAcmV0dXJucyB7bmcuJGNvbXBpbGVQcm92aWRlcn0gU2VsZiBmb3IgY2hhaW5pbmcuDQotICAgKi8NCi0gICB0aGlzLmRpcmVjdGl2ZSA9IGZ1bmN0aW9uIHJlZ2lzdGVyRGlyZWN0aXZlKG5hbWUsIGRpcmVjdGl2ZUZhY3RvcnkpIHsNCi0gICAgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkobmFtZSwgJ2RpcmVjdGl2ZScpOw0KLSAgICBpZiAoaXNTdHJpbmcobmFtZSkpIHsNCi0gICAgICBhc3NlcnRBcmcoZGlyZWN0aXZlRmFjdG9yeSwgJ2RpcmVjdGl2ZUZhY3RvcnknKTsNCi0gICAgICBpZiAoIWhhc0RpcmVjdGl2ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsNCi0gICAgICAgIGhhc0RpcmVjdGl2ZXNbbmFtZV0gPSBbXTsNCi0gICAgICAgICRwcm92aWRlLmZhY3RvcnkobmFtZSArIFN1ZmZpeCwgWyckaW5qZWN0b3InLCAnJGV4Y2VwdGlvbkhhbmRsZXInLA0KLSAgICAgICAgICBmdW5jdGlvbigkaW5qZWN0b3IsICRleGNlcHRpb25IYW5kbGVyKSB7DQotICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZXMgPSBbXTsNCi0gICAgICAgICAgICBmb3JFYWNoKGhhc0RpcmVjdGl2ZXNbbmFtZV0sIGZ1bmN0aW9uKGRpcmVjdGl2ZUZhY3RvcnksIGluZGV4KSB7DQotICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aXZlID0gJGluamVjdG9yLmludm9rZShkaXJlY3RpdmVGYWN0b3J5KTsNCi0gICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZGlyZWN0aXZlKSkgew0KLSAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZSA9IHsgY29tcGlsZTogdmFsdWVGbihkaXJlY3RpdmUpIH07DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRpcmVjdGl2ZS5jb21waWxlICYmIGRpcmVjdGl2ZS5saW5rKSB7DQotICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlLmNvbXBpbGUgPSB2YWx1ZUZuKGRpcmVjdGl2ZS5saW5rKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBkaXJlY3RpdmUucHJpb3JpdHkgPSBkaXJlY3RpdmUucHJpb3JpdHkgfHwgMDsNCi0gICAgICAgICAgICAgICAgZGlyZWN0aXZlLmluZGV4ID0gaW5kZXg7DQotICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5uYW1lID0gZGlyZWN0aXZlLm5hbWUgfHwgbmFtZTsNCi0gICAgICAgICAgICAgICAgZGlyZWN0aXZlLnJlcXVpcmUgPSBkaXJlY3RpdmUucmVxdWlyZSB8fCAoZGlyZWN0aXZlLmNvbnRyb2xsZXIgJiYgZGlyZWN0aXZlLm5hbWUpOw0KLSAgICAgICAgICAgICAgICBkaXJlY3RpdmUucmVzdHJpY3QgPSBkaXJlY3RpdmUucmVzdHJpY3QgfHwgJ0VBJzsNCi0gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGRpcmVjdGl2ZS5zY29wZSkpIHsNCi0gICAgICAgICAgICAgICAgICBkaXJlY3RpdmUuJCRpc29sYXRlQmluZGluZ3MgPSBwYXJzZUlzb2xhdGVCaW5kaW5ncyhkaXJlY3RpdmUuc2NvcGUsIGRpcmVjdGl2ZS5uYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBkaXJlY3RpdmVzLnB1c2goZGlyZWN0aXZlKTsNCi0gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCi0gICAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZXM7DQotICAgICAgICAgIH1dKTsNCi0gICAgICB9DQotICAgICAgaGFzRGlyZWN0aXZlc1tuYW1lXS5wdXNoKGRpcmVjdGl2ZUZhY3RvcnkpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGZvckVhY2gobmFtZSwgcmV2ZXJzZVBhcmFtcyhyZWdpc3RlckRpcmVjdGl2ZSkpOw0KLSAgICB9DQotICAgIHJldHVybiB0aGlzOw0KLSAgfTsNCi0NCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJGNvbXBpbGVQcm92aWRlciNhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdA0KLSAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFJldHJpZXZlcyBvciBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcmVndWxhciBleHByZXNzaW9uIHRoYXQgaXMgdXNlZCBmb3Igd2hpdGVsaXN0aW5nIG9mIHNhZmUNCi0gICAqIHVybHMgZHVyaW5nIGFbaHJlZl0gc2FuaXRpemF0aW9uLg0KLSAgICoNCi0gICAqIFRoZSBzYW5pdGl6YXRpb24gaXMgYSBzZWN1cml0eSBtZWFzdXJlIGFpbWVkIGF0IHByZXZlbnRpbmcgWFNTIGF0dGFja3MgdmlhIGh0bWwgbGlua3MuDQotICAgKg0KLSAgICogQW55IHVybCBhYm91dCB0byBiZSBhc3NpZ25lZCB0byBhW2hyZWZdIHZpYSBkYXRhLWJpbmRpbmcgaXMgZmlyc3Qgbm9ybWFsaXplZCBhbmQgdHVybmVkIGludG8NCi0gICAqIGFuIGFic29sdXRlIHVybC4gQWZ0ZXJ3YXJkcywgdGhlIHVybCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdGANCi0gICAqIHJlZ3VsYXIgZXhwcmVzc2lvbi4gSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhlIG9yaWdpbmFsIHVybCBpcyB3cml0dGVuIGludG8gdGhlIGRvbS4gT3RoZXJ3aXNlLA0KLSAgICogdGhlIGFic29sdXRlIHVybCBpcyBwcmVmaXhlZCB3aXRoIGAndW5zYWZlOidgIHN0cmluZyBhbmQgb25seSB0aGVuIGlzIGl0IHdyaXR0ZW4gaW50byB0aGUgRE9NLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7UmVnRXhwPX0gcmVnZXhwIE5ldyByZWdleHAgdG8gd2hpdGVsaXN0IHVybHMgd2l0aC4NCi0gICAqIEByZXR1cm5zIHtSZWdFeHB8bmcuJGNvbXBpbGVQcm92aWRlcn0gQ3VycmVudCBSZWdFeHAgaWYgY2FsbGVkIHdpdGhvdXQgdmFsdWUgb3Igc2VsZiBmb3INCi0gICAqICAgIGNoYWluaW5nIG90aGVyd2lzZS4NCi0gICAqLw0KLSAgdGhpcy5hSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdCA9IGZ1bmN0aW9uKHJlZ2V4cCkgew0KLSAgICBpZiAoaXNEZWZpbmVkKHJlZ2V4cCkpIHsNCi0gICAgICAkJHNhbml0aXplVXJpUHJvdmlkZXIuYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QocmVnZXhwKTsNCi0gICAgICByZXR1cm4gdGhpczsNCi0gICAgfSBlbHNlIHsNCi0gICAgICByZXR1cm4gJCRzYW5pdGl6ZVVyaVByb3ZpZGVyLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0KCk7DQotICAgIH0NCi0gIH07DQotDQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lICRjb21waWxlUHJvdmlkZXIjaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0DQotICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogUmV0cmlldmVzIG9yIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIGZvciB3aGl0ZWxpc3Rpbmcgb2Ygc2FmZQ0KLSAgICogdXJscyBkdXJpbmcgaW1nW3NyY10gc2FuaXRpemF0aW9uLg0KLSAgICoNCi0gICAqIFRoZSBzYW5pdGl6YXRpb24gaXMgYSBzZWN1cml0eSBtZWFzdXJlIGFpbWVkIGF0IHByZXZlbnQgWFNTIGF0dGFja3MgdmlhIGh0bWwgbGlua3MuDQotICAgKg0KLSAgICogQW55IHVybCBhYm91dCB0byBiZSBhc3NpZ25lZCB0byBpbWdbc3JjXSB2aWEgZGF0YS1iaW5kaW5nIGlzIGZpcnN0IG5vcm1hbGl6ZWQgYW5kIHR1cm5lZCBpbnRvDQotICAgKiBhbiBhYnNvbHV0ZSB1cmwuIEFmdGVyd2FyZHMsIHRoZSB1cmwgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBgaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0YA0KLSAgICogcmVndWxhciBleHByZXNzaW9uLiBJZiBhIG1hdGNoIGlzIGZvdW5kLCB0aGUgb3JpZ2luYWwgdXJsIGlzIHdyaXR0ZW4gaW50byB0aGUgZG9tLiBPdGhlcndpc2UsDQotICAgKiB0aGUgYWJzb2x1dGUgdXJsIGlzIHByZWZpeGVkIHdpdGggYCd1bnNhZmU6J2Agc3RyaW5nIGFuZCBvbmx5IHRoZW4gaXMgaXQgd3JpdHRlbiBpbnRvIHRoZSBET00uDQotICAgKg0KLSAgICogQHBhcmFtIHtSZWdFeHA9fSByZWdleHAgTmV3IHJlZ2V4cCB0byB3aGl0ZWxpc3QgdXJscyB3aXRoLg0KLSAgICogQHJldHVybnMge1JlZ0V4cHxuZy4kY29tcGlsZVByb3ZpZGVyfSBDdXJyZW50IFJlZ0V4cCBpZiBjYWxsZWQgd2l0aG91dCB2YWx1ZSBvciBzZWxmIGZvcg0KLSAgICogICAgY2hhaW5pbmcgb3RoZXJ3aXNlLg0KLSAgICovDQotICB0aGlzLmltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCA9IGZ1bmN0aW9uKHJlZ2V4cCkgew0KLSAgICBpZiAoaXNEZWZpbmVkKHJlZ2V4cCkpIHsNCi0gICAgICAkJHNhbml0aXplVXJpUHJvdmlkZXIuaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0KHJlZ2V4cCk7DQotICAgICAgcmV0dXJuIHRoaXM7DQotICAgIH0gZWxzZSB7DQotICAgICAgcmV0dXJuICQkc2FuaXRpemVVcmlQcm92aWRlci5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QoKTsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgICRjb21waWxlUHJvdmlkZXIjZGVidWdJbmZvRW5hYmxlZA0KLSAgICoNCi0gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGVuYWJsZWQgdXBkYXRlIHRoZSBkZWJ1Z0luZm9FbmFibGVkIHN0YXRlIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UganVzdCByZXR1cm4gdGhlDQotICAgKiBjdXJyZW50IGRlYnVnSW5mb0VuYWJsZWQgc3RhdGUNCi0gICAqIEByZXR1cm5zIHsqfSBjdXJyZW50IHZhbHVlIGlmIHVzZWQgYXMgZ2V0dGVyIG9yIGl0c2VsZiAoY2hhaW5pbmcpIGlmIHVzZWQgYXMgc2V0dGVyDQotICAgKg0KLSAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIENhbGwgdGhpcyBtZXRob2QgdG8gZW5hYmxlL2Rpc2FibGUgdmFyaW91cyBkZWJ1ZyBydW50aW1lIGluZm9ybWF0aW9uIGluIHRoZSBjb21waWxlciBzdWNoIGFzIGFkZGluZw0KLSAgICogYmluZGluZyBpbmZvcm1hdGlvbiBhbmQgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgc2NvcGUgb24gdG8gRE9NIGVsZW1lbnRzLg0KLSAgICogSWYgZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgYWRkIHRoZSBmb2xsb3dpbmcgdG8gRE9NIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGJvdW5kIHRvIHRoZSBzY29wZQ0KLSAgICogKiBgbmctYmluZGluZ2AgQ1NTIGNsYXNzDQotICAgKiAqIGAkYmluZGluZ2AgZGF0YSBwcm9wZXJ0eSBjb250YWluaW5nIGFuIGFycmF5IG9mIHRoZSBiaW5kaW5nIGV4cHJlc3Npb25zDQotICAgKg0KLSAgICogWW91IG1heSB3YW50IHRvIGRpc2FibGUgdGhpcyBpbiBwcm9kdWN0aW9uIGZvciBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGJvb3N0LiBTZWUNCi0gICAqIHtAbGluayBndWlkZS9wcm9kdWN0aW9uI2Rpc2FibGluZy1kZWJ1Zy1kYXRhIERpc2FibGluZyBEZWJ1ZyBEYXRhfSBmb3IgbW9yZS4NCi0gICAqDQotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLg0KLSAgICovDQotICB2YXIgZGVidWdJbmZvRW5hYmxlZCA9IHRydWU7DQotICB0aGlzLmRlYnVnSW5mb0VuYWJsZWQgPSBmdW5jdGlvbihlbmFibGVkKSB7DQotICAgIGlmIChpc0RlZmluZWQoZW5hYmxlZCkpIHsNCi0gICAgICBkZWJ1Z0luZm9FbmFibGVkID0gZW5hYmxlZDsNCi0gICAgICByZXR1cm4gdGhpczsNCi0gICAgfQ0KLSAgICByZXR1cm4gZGVidWdJbmZvRW5hYmxlZDsNCi0gIH07DQotDQotICB0aGlzLiRnZXQgPSBbDQotICAgICAgICAgICAgJyRpbmplY3RvcicsICckaW50ZXJwb2xhdGUnLCAnJGV4Y2VwdGlvbkhhbmRsZXInLCAnJHRlbXBsYXRlUmVxdWVzdCcsICckcGFyc2UnLA0KLSAgICAgICAgICAgICckY29udHJvbGxlcicsICckcm9vdFNjb3BlJywgJyRkb2N1bWVudCcsICckc2NlJywgJyRhbmltYXRlJywgJyQkc2FuaXRpemVVcmknLA0KLSAgICBmdW5jdGlvbigkaW5qZWN0b3IsICAgJGludGVycG9sYXRlLCAgICRleGNlcHRpb25IYW5kbGVyLCAgICR0ZW1wbGF0ZVJlcXVlc3QsICAgJHBhcnNlLA0KLSAgICAgICAgICAgICAkY29udHJvbGxlciwgICAkcm9vdFNjb3BlLCAgICRkb2N1bWVudCwgICAkc2NlLCAgICRhbmltYXRlLCAgICQkc2FuaXRpemVVcmkpIHsNCi0NCi0gICAgdmFyIEF0dHJpYnV0ZXMgPSBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGVzVG9Db3B5KSB7DQotICAgICAgaWYgKGF0dHJpYnV0ZXNUb0NvcHkpIHsNCi0gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlc1RvQ29weSk7DQotICAgICAgICB2YXIgaSwgbCwga2V5Ow0KLQ0KLSAgICAgICAgZm9yIChpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7DQotICAgICAgICAgIGtleSA9IGtleXNbaV07DQotICAgICAgICAgIHRoaXNba2V5XSA9IGF0dHJpYnV0ZXNUb0NvcHlba2V5XTsNCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgdGhpcy4kYXR0ciA9IHt9Ow0KLSAgICAgIH0NCi0NCi0gICAgICB0aGlzLiQkZWxlbWVudCA9IGVsZW1lbnQ7DQotICAgIH07DQotDQotICAgIEF0dHJpYnV0ZXMucHJvdG90eXBlID0gew0KLSAgICAgIC8qKg0KLSAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkbm9ybWFsaXplDQotICAgICAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAgICAgKg0KLSAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAqIENvbnZlcnRzIGFuIGF0dHJpYnV0ZSBuYW1lIChlLmcuIGRhc2gvY29sb24vdW5kZXJzY29yZS1kZWxpbWl0ZWQgc3RyaW5nLCBvcHRpb25hbGx5IHByZWZpeGVkIHdpdGggYHgtYCBvcg0KLSAgICAgICAqIGBkYXRhLWApIHRvIGl0cyBub3JtYWxpemVkLCBjYW1lbENhc2UgZm9ybS4NCi0gICAgICAgKg0KLSAgICAgICAqIEFsc28gdGhlcmUgaXMgc3BlY2lhbCBjYXNlIGZvciBNb3ogcHJlZml4IHN0YXJ0aW5nIHdpdGggdXBwZXIgY2FzZSBsZXR0ZXIuDQotICAgICAgICoNCi0gICAgICAgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBjaGVjayBvdXQgdGhlIGd1aWRlIG9uIHtAbGluayBndWlkZS9kaXJlY3RpdmUjbWF0Y2hpbmctZGlyZWN0aXZlcyBNYXRjaGluZyBEaXJlY3RpdmVzfQ0KLSAgICAgICAqDQotICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSB0byBub3JtYWxpemUNCi0gICAgICAgKi8NCi0gICAgICAkbm9ybWFsaXplOiBkaXJlY3RpdmVOb3JtYWxpemUsDQotDQotDQotICAgICAgLyoqDQotICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRhZGRDbGFzcw0KLSAgICAgICAqIEBraW5kIGZ1bmN0aW9uDQotICAgICAgICoNCi0gICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgKiBBZGRzIHRoZSBDU1MgY2xhc3MgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSBjbGFzc1ZhbCBwYXJhbWV0ZXIgdG8gdGhlIGVsZW1lbnQuIElmIGFuaW1hdGlvbnMNCi0gICAgICAgKiBhcmUgZW5hYmxlZCB0aGVuIGFuIGFuaW1hdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCBmb3IgdGhlIGNsYXNzIGFkZGl0aW9uLg0KLSAgICAgICAqDQotICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzVmFsIFRoZSBjbGFzc05hbWUgdmFsdWUgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbGVtZW50DQotICAgICAgICovDQotICAgICAgJGFkZENsYXNzOiBmdW5jdGlvbihjbGFzc1ZhbCkgew0KLSAgICAgICAgaWYgKGNsYXNzVmFsICYmIGNsYXNzVmFsLmxlbmd0aCA+IDApIHsNCi0gICAgICAgICAgJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsIGNsYXNzVmFsKTsNCi0gICAgICAgIH0NCi0gICAgICB9LA0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkcmVtb3ZlQ2xhc3MNCi0gICAgICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICAgICAqDQotICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICogUmVtb3ZlcyB0aGUgQ1NTIGNsYXNzIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgY2xhc3NWYWwgcGFyYW1ldGVyIGZyb20gdGhlIGVsZW1lbnQuIElmDQotICAgICAgICogYW5pbWF0aW9ucyBhcmUgZW5hYmxlZCB0aGVuIGFuIGFuaW1hdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCBmb3IgdGhlIGNsYXNzIHJlbW92YWwuDQotICAgICAgICoNCi0gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NWYWwgVGhlIGNsYXNzTmFtZSB2YWx1ZSB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBlbGVtZW50DQotICAgICAgICovDQotICAgICAgJHJlbW92ZUNsYXNzOiBmdW5jdGlvbihjbGFzc1ZhbCkgew0KLSAgICAgICAgaWYgKGNsYXNzVmFsICYmIGNsYXNzVmFsLmxlbmd0aCA+IDApIHsNCi0gICAgICAgICAgJGFuaW1hdGUucmVtb3ZlQ2xhc3ModGhpcy4kJGVsZW1lbnQsIGNsYXNzVmFsKTsNCi0gICAgICAgIH0NCi0gICAgICB9LA0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkdXBkYXRlQ2xhc3MNCi0gICAgICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICAgICAqDQotICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICogQWRkcyBhbmQgcmVtb3ZlcyB0aGUgYXBwcm9wcmlhdGUgQ1NTIGNsYXNzIHZhbHVlcyB0byB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZQ0KLSAgICAgICAqIGJldHdlZW4gdGhlIG5ldyBhbmQgb2xkIENTUyBjbGFzcyB2YWx1ZXMgKHNwZWNpZmllZCBhcyBuZXdDbGFzc2VzIGFuZCBvbGRDbGFzc2VzKS4NCi0gICAgICAgKg0KLSAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdDbGFzc2VzIFRoZSBjdXJyZW50IENTUyBjbGFzc05hbWUgdmFsdWUNCi0gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkQ2xhc3NlcyBUaGUgZm9ybWVyIENTUyBjbGFzc05hbWUgdmFsdWUNCi0gICAgICAgKi8NCi0gICAgICAkdXBkYXRlQ2xhc3M6IGZ1bmN0aW9uKG5ld0NsYXNzZXMsIG9sZENsYXNzZXMpIHsNCi0gICAgICAgIHZhciB0b0FkZCA9IHRva2VuRGlmZmVyZW5jZShuZXdDbGFzc2VzLCBvbGRDbGFzc2VzKTsNCi0gICAgICAgIGlmICh0b0FkZCAmJiB0b0FkZC5sZW5ndGgpIHsNCi0gICAgICAgICAgJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsIHRvQWRkKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZhciB0b1JlbW92ZSA9IHRva2VuRGlmZmVyZW5jZShvbGRDbGFzc2VzLCBuZXdDbGFzc2VzKTsNCi0gICAgICAgIGlmICh0b1JlbW92ZSAmJiB0b1JlbW92ZS5sZW5ndGgpIHsNCi0gICAgICAgICAgJGFuaW1hdGUucmVtb3ZlQ2xhc3ModGhpcy4kJGVsZW1lbnQsIHRvUmVtb3ZlKTsNCi0gICAgICAgIH0NCi0gICAgICB9LA0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqIFNldCBhIG5vcm1hbGl6ZWQgYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGluIGEgd2F5IHN1Y2ggdGhhdCBhbGwgZGlyZWN0aXZlcw0KLSAgICAgICAqIGNhbiBzaGFyZSB0aGUgYXR0cmlidXRlLiBUaGlzIGZ1bmN0aW9uIHByb3Blcmx5IGhhbmRsZXMgYm9vbGVhbiBhdHRyaWJ1dGVzLg0KLSAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTm9ybWFsaXplZCBrZXkuIChpZSBuZ0F0dHJpYnV0ZSkNCi0gICAgICAgKiBAcGFyYW0ge3N0cmluZ3xib29sZWFufSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LiBJZiBgbnVsbGAgYXR0cmlidXRlIHdpbGwgYmUgZGVsZXRlZC4NCi0gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB3cml0ZUF0dHIgSWYgZmFsc2UsIGRvZXMgbm90IHdyaXRlIHRoZSB2YWx1ZSB0byBET00gZWxlbWVudCBhdHRyaWJ1dGUuDQotICAgICAgICogICAgIERlZmF1bHRzIHRvIHRydWUuDQotICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBhdHRyTmFtZSBPcHRpb25hbCBub25lIG5vcm1hbGl6ZWQgbmFtZS4gRGVmYXVsdHMgdG8ga2V5Lg0KLSAgICAgICAqLw0KLSAgICAgICRzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUsIHdyaXRlQXR0ciwgYXR0ck5hbWUpIHsNCi0gICAgICAgIC8vIFRPRE86IGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byB0aHJvdyBhbiBlcnJvciBpZiAiY2xhc3MiDQotICAgICAgICAvL2lzIHNldCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc2luY2UgaXQgbWF5IGNhdXNlICR1cGRhdGVDbGFzcyB0bw0KLSAgICAgICAgLy9iZWNvbWUgdW5zdGFibGUuDQotDQotICAgICAgICB2YXIgbm9kZSA9IHRoaXMuJCRlbGVtZW50WzBdLA0KLSAgICAgICAgICAgIGJvb2xlYW5LZXkgPSBnZXRCb29sZWFuQXR0ck5hbWUobm9kZSwga2V5KSwNCi0gICAgICAgICAgICBhbGlhc2VkS2V5ID0gZ2V0QWxpYXNlZEF0dHJOYW1lKG5vZGUsIGtleSksDQotICAgICAgICAgICAgb2JzZXJ2ZXIgPSBrZXksDQotICAgICAgICAgICAgbm9kZU5hbWU7DQotDQotICAgICAgICBpZiAoYm9vbGVhbktleSkgew0KLSAgICAgICAgICB0aGlzLiQkZWxlbWVudC5wcm9wKGtleSwgdmFsdWUpOw0KLSAgICAgICAgICBhdHRyTmFtZSA9IGJvb2xlYW5LZXk7DQotICAgICAgICB9IGVsc2UgaWYgKGFsaWFzZWRLZXkpIHsNCi0gICAgICAgICAgdGhpc1thbGlhc2VkS2V5XSA9IHZhbHVlOw0KLSAgICAgICAgICBvYnNlcnZlciA9IGFsaWFzZWRLZXk7DQotICAgICAgICB9DQotDQotICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZTsNCi0NCi0gICAgICAgIC8vIHRyYW5zbGF0ZSBub3JtYWxpemVkIGtleSB0byBhY3R1YWwga2V5DQotICAgICAgICBpZiAoYXR0ck5hbWUpIHsNCi0gICAgICAgICAgdGhpcy4kYXR0cltrZXldID0gYXR0ck5hbWU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBhdHRyTmFtZSA9IHRoaXMuJGF0dHJba2V5XTsNCi0gICAgICAgICAgaWYgKCFhdHRyTmFtZSkgew0KLSAgICAgICAgICAgIHRoaXMuJGF0dHJba2V5XSA9IGF0dHJOYW1lID0gc25ha2VfY2FzZShrZXksICctJyk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5vZGVOYW1lID0gbm9kZU5hbWVfKHRoaXMuJCRlbGVtZW50KTsNCi0NCi0gICAgICAgIGlmICgobm9kZU5hbWUgPT09ICdhJyAmJiBrZXkgPT09ICdocmVmJykgfHwNCi0gICAgICAgICAgICAobm9kZU5hbWUgPT09ICdpbWcnICYmIGtleSA9PT0gJ3NyYycpKSB7DQotICAgICAgICAgIC8vIHNhbml0aXplIGFbaHJlZl0gYW5kIGltZ1tzcmNdIHZhbHVlcw0KLSAgICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZSA9ICQkc2FuaXRpemVVcmkodmFsdWUsIGtleSA9PT0gJ3NyYycpOw0KLSAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gJ2ltZycgJiYga2V5ID09PSAnc3Jjc2V0Jykgew0KLSAgICAgICAgICAvLyBzYW5pdGl6ZSBpbWdbc3Jjc2V0XSB2YWx1ZXMNCi0gICAgICAgICAgdmFyIHJlc3VsdCA9ICIiOw0KLQ0KLSAgICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiB0aGVyZSBhcmUgc3BhY2VzIGJlY2F1c2UgaXQncyBub3QgdGhlIHNhbWUgcGF0dGVybg0KLSAgICAgICAgICB2YXIgdHJpbW1lZFNyY3NldCA9IHRyaW0odmFsdWUpOw0KLSAgICAgICAgICAvLyAgICAgICAgICAgICAgICAoICAgOTk5eCAgICx8ICAgOTk5dyAgICx8ICAgLHwsICAgKQ0KLSAgICAgICAgICB2YXIgc3JjUGF0dGVybiA9IC8oXHMrXGQreFxzKix8XHMrXGQrd1xzKix8XHMrLHwsXHMrKS87DQotICAgICAgICAgIHZhciBwYXR0ZXJuID0gL1xzLy50ZXN0KHRyaW1tZWRTcmNzZXQpID8gc3JjUGF0dGVybiA6IC8oLCkvOw0KLQ0KLSAgICAgICAgICAvLyBzcGxpdCBzcmNzZXQgaW50byB0dXBsZSBvZiB1cmkgYW5kIGRlc2NyaXB0b3IgZXhjZXB0IGZvciB0aGUgbGFzdCBpdGVtDQotICAgICAgICAgIHZhciByYXdVcmlzID0gdHJpbW1lZFNyY3NldC5zcGxpdChwYXR0ZXJuKTsNCi0NCi0gICAgICAgICAgLy8gZm9yIGVhY2ggdHVwbGVzDQotICAgICAgICAgIHZhciBuYnJVcmlzV2l0aDJwYXJ0cyA9IE1hdGguZmxvb3IocmF3VXJpcy5sZW5ndGggLyAyKTsNCi0gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYnJVcmlzV2l0aDJwYXJ0czsgaSsrKSB7DQotICAgICAgICAgICAgdmFyIGlubmVySWR4ID0gaSAqIDI7DQotICAgICAgICAgICAgLy8gc2FuaXRpemUgdGhlIHVyaQ0KLSAgICAgICAgICAgIHJlc3VsdCArPSAkJHNhbml0aXplVXJpKHRyaW0ocmF3VXJpc1tpbm5lcklkeF0pLCB0cnVlKTsNCi0gICAgICAgICAgICAvLyBhZGQgdGhlIGRlc2NyaXB0b3INCi0gICAgICAgICAgICByZXN1bHQgKz0gKCIgIiArIHRyaW0ocmF3VXJpc1tpbm5lcklkeCArIDFdKSk7DQotICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgLy8gc3BsaXQgdGhlIGxhc3QgaXRlbSBpbnRvIHVyaSBhbmQgZGVzY3JpcHRvcg0KLSAgICAgICAgICB2YXIgbGFzdFR1cGxlID0gdHJpbShyYXdVcmlzW2kgKiAyXSkuc3BsaXQoL1xzLyk7DQotDQotICAgICAgICAgIC8vIHNhbml0aXplIHRoZSBsYXN0IHVyaQ0KLSAgICAgICAgICByZXN1bHQgKz0gJCRzYW5pdGl6ZVVyaSh0cmltKGxhc3RUdXBsZVswXSksIHRydWUpOw0KLQ0KLSAgICAgICAgICAvLyBhbmQgYWRkIHRoZSBsYXN0IGRlc2NyaXB0b3IgaWYgYW55DQotICAgICAgICAgIGlmIChsYXN0VHVwbGUubGVuZ3RoID09PSAyKSB7DQotICAgICAgICAgICAgcmVzdWx0ICs9ICgiICIgKyB0cmltKGxhc3RUdXBsZVsxXSkpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRoaXNba2V5XSA9IHZhbHVlID0gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHdyaXRlQXR0ciAhPT0gZmFsc2UpIHsNCi0gICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHsNCi0gICAgICAgICAgICB0aGlzLiQkZWxlbWVudC5yZW1vdmVBdHRyKGF0dHJOYW1lKTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB0aGlzLiQkZWxlbWVudC5hdHRyKGF0dHJOYW1lLCB2YWx1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGZpcmUgb2JzZXJ2ZXJzDQotICAgICAgICB2YXIgJCRvYnNlcnZlcnMgPSB0aGlzLiQkb2JzZXJ2ZXJzOw0KLSAgICAgICAgJCRvYnNlcnZlcnMgJiYgZm9yRWFjaCgkJG9ic2VydmVyc1tvYnNlcnZlcl0sIGZ1bmN0aW9uKGZuKSB7DQotICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZm4odmFsdWUpOw0KLSAgICAgICAgICB9IGNhdGNoIChlKSB7DQotICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICAgIH0sDQotDQotDQotICAgICAgLyoqDQotICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRvYnNlcnZlDQotICAgICAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAgICAgKg0KLSAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAqIE9ic2VydmVzIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUuDQotICAgICAgICoNCi0gICAgICAgKiBUaGUgb2JzZXJ2ZXIgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIG9uY2UgZHVyaW5nIHRoZSBuZXh0IGAkZGlnZXN0YCBmb2xsb3dpbmcNCi0gICAgICAgKiBjb21waWxhdGlvbi4gVGhlIG9ic2VydmVyIGlzIHRoZW4gaW52b2tlZCB3aGVuZXZlciB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlDQotICAgICAgICogY2hhbmdlcy4NCi0gICAgICAgKg0KLSAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTm9ybWFsaXplZCBrZXkuIChpZSBuZ0F0dHJpYnV0ZSkgLg0KLSAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oaW50ZXJwb2xhdGVkVmFsdWUpfSBmbiBGdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyDQotICAgICAgICAgICAgICAgIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBjaGFuZ2VzLg0KLSAgICAgICAqICAgICAgICBTZWUgdGhlIHtAbGluayBndWlkZS9kaXJlY3RpdmUjdGV4dC1hbmQtYXR0cmlidXRlLWJpbmRpbmdzIERpcmVjdGl2ZXN9IGd1aWRlIGZvciBtb3JlIGluZm8uDQotICAgICAgICogQHJldHVybnMge2Z1bmN0aW9uKCl9IFJldHVybnMgYSBkZXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyBvYnNlcnZlci4NCi0gICAgICAgKi8NCi0gICAgICAkb2JzZXJ2ZTogZnVuY3Rpb24oa2V5LCBmbikgew0KLSAgICAgICAgdmFyIGF0dHJzID0gdGhpcywNCi0gICAgICAgICAgICAkJG9ic2VydmVycyA9IChhdHRycy4kJG9ic2VydmVycyB8fCAoYXR0cnMuJCRvYnNlcnZlcnMgPSBjcmVhdGVNYXAoKSkpLA0KLSAgICAgICAgICAgIGxpc3RlbmVycyA9ICgkJG9ic2VydmVyc1trZXldIHx8ICgkJG9ic2VydmVyc1trZXldID0gW10pKTsNCi0NCi0gICAgICAgIGxpc3RlbmVycy5wdXNoKGZuKTsNCi0gICAgICAgICRyb290U2NvcGUuJGV2YWxBc3luYyhmdW5jdGlvbigpIHsNCi0gICAgICAgICAgaWYgKCFsaXN0ZW5lcnMuJCRpbnRlciAmJiBhdHRycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7DQotICAgICAgICAgICAgLy8gbm8gb25lIHJlZ2lzdGVyZWQgYXR0cmlidXRlIGludGVycG9sYXRpb24gZnVuY3Rpb24sIHNvIGxldHMgY2FsbCBpdCBtYW51YWxseQ0KLSAgICAgICAgICAgIGZuKGF0dHJzW2tleV0pOw0KLSAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgYXJyYXlSZW1vdmUobGlzdGVuZXJzLCBmbik7DQotICAgICAgICB9Ow0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0NCi0gICAgZnVuY3Rpb24gc2FmZUFkZENsYXNzKCRlbGVtZW50LCBjbGFzc05hbWUpIHsNCi0gICAgICB0cnkgew0KLSAgICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoY2xhc3NOYW1lKTsNCi0gICAgICB9IGNhdGNoIChlKSB7DQotICAgICAgICAvLyBpZ25vcmUsIHNpbmNlIGl0IG1lYW5zIHRoYXQgd2UgYXJlIHRyeWluZyB0byBzZXQgY2xhc3Mgb24NCi0gICAgICAgIC8vIFNWRyBlbGVtZW50LCB3aGVyZSBjbGFzcyBuYW1lIGlzIHJlYWQtb25seS4NCi0gICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgdmFyIHN0YXJ0U3ltYm9sID0gJGludGVycG9sYXRlLnN0YXJ0U3ltYm9sKCksDQotICAgICAgICBlbmRTeW1ib2wgPSAkaW50ZXJwb2xhdGUuZW5kU3ltYm9sKCksDQotICAgICAgICBkZW5vcm1hbGl6ZVRlbXBsYXRlID0gKHN0YXJ0U3ltYm9sID09ICd7eycgfHwgZW5kU3ltYm9sICA9PSAnfX0nKQ0KLSAgICAgICAgICAgID8gaWRlbnRpdHkNCi0gICAgICAgICAgICA6IGZ1bmN0aW9uIGRlbm9ybWFsaXplVGVtcGxhdGUodGVtcGxhdGUpIHsNCi0gICAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC9ce1x7L2csIHN0YXJ0U3ltYm9sKS5yZXBsYWNlKC99fS9nLCBlbmRTeW1ib2wpOw0KLSAgICAgICAgfSwNCi0gICAgICAgIE5HX0FUVFJfQklORElORyA9IC9ebmdBdHRyW0EtWl0vOw0KLQ0KLSAgICBjb21waWxlLiQkYWRkQmluZGluZ0luZm8gPSBkZWJ1Z0luZm9FbmFibGVkID8gZnVuY3Rpb24gJCRhZGRCaW5kaW5nSW5mbygkZWxlbWVudCwgYmluZGluZykgew0KLSAgICAgIHZhciBiaW5kaW5ncyA9ICRlbGVtZW50LmRhdGEoJyRiaW5kaW5nJykgfHwgW107DQotDQotICAgICAgaWYgKGlzQXJyYXkoYmluZGluZykpIHsNCi0gICAgICAgIGJpbmRpbmdzID0gYmluZGluZ3MuY29uY2F0KGJpbmRpbmcpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBiaW5kaW5ncy5wdXNoKGJpbmRpbmcpOw0KLSAgICAgIH0NCi0NCi0gICAgICAkZWxlbWVudC5kYXRhKCckYmluZGluZycsIGJpbmRpbmdzKTsNCi0gICAgfSA6IG5vb3A7DQotDQotICAgIGNvbXBpbGUuJCRhZGRCaW5kaW5nQ2xhc3MgPSBkZWJ1Z0luZm9FbmFibGVkID8gZnVuY3Rpb24gJCRhZGRCaW5kaW5nQ2xhc3MoJGVsZW1lbnQpIHsNCi0gICAgICBzYWZlQWRkQ2xhc3MoJGVsZW1lbnQsICduZy1iaW5kaW5nJyk7DQotICAgIH0gOiBub29wOw0KLQ0KLSAgICBjb21waWxlLiQkYWRkU2NvcGVJbmZvID0gZGVidWdJbmZvRW5hYmxlZCA/IGZ1bmN0aW9uICQkYWRkU2NvcGVJbmZvKCRlbGVtZW50LCBzY29wZSwgaXNvbGF0ZWQsIG5vVGVtcGxhdGUpIHsNCi0gICAgICB2YXIgZGF0YU5hbWUgPSBpc29sYXRlZCA/IChub1RlbXBsYXRlID8gJyRpc29sYXRlU2NvcGVOb1RlbXBsYXRlJyA6ICckaXNvbGF0ZVNjb3BlJykgOiAnJHNjb3BlJzsNCi0gICAgICAkZWxlbWVudC5kYXRhKGRhdGFOYW1lLCBzY29wZSk7DQotICAgIH0gOiBub29wOw0KLQ0KLSAgICBjb21waWxlLiQkYWRkU2NvcGVDbGFzcyA9IGRlYnVnSW5mb0VuYWJsZWQgPyBmdW5jdGlvbiAkJGFkZFNjb3BlQ2xhc3MoJGVsZW1lbnQsIGlzb2xhdGVkKSB7DQotICAgICAgc2FmZUFkZENsYXNzKCRlbGVtZW50LCBpc29sYXRlZCA/ICduZy1pc29sYXRlLXNjb3BlJyA6ICduZy1zY29wZScpOw0KLSAgICB9IDogbm9vcDsNCi0NCi0gICAgcmV0dXJuIGNvbXBpbGU7DQotDQotICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0gICAgZnVuY3Rpb24gY29tcGlsZSgkY29tcGlsZU5vZGVzLCB0cmFuc2NsdWRlRm4sIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUsDQotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCkgew0KLSAgICAgIGlmICghKCRjb21waWxlTm9kZXMgaW5zdGFuY2VvZiBqcUxpdGUpKSB7DQotICAgICAgICAvLyBqcXVlcnkgYWx3YXlzIHJld3JhcHMsIHdoZXJlYXMgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc2VsZWN0b3Igc28gdGhhdCB3ZSBjYW4NCi0gICAgICAgIC8vIG1vZGlmeSBpdC4NCi0gICAgICAgICRjb21waWxlTm9kZXMgPSBqcUxpdGUoJGNvbXBpbGVOb2Rlcyk7DQotICAgICAgfQ0KLSAgICAgIC8vIFdlIGNhbiBub3QgY29tcGlsZSB0b3AgbGV2ZWwgdGV4dCBlbGVtZW50cyBzaW5jZSB0ZXh0IG5vZGVzIGNhbiBiZSBtZXJnZWQgYW5kIHdlIHdpbGwNCi0gICAgICAvLyBub3QgYmUgYWJsZSB0byBhdHRhY2ggc2NvcGUgZGF0YSB0byB0aGVtLCBzbyB3ZSB3aWxsIHdyYXAgdGhlbSBpbiA8c3Bhbj4NCi0gICAgICBmb3JFYWNoKCRjb21waWxlTm9kZXMsIGZ1bmN0aW9uKG5vZGUsIGluZGV4KSB7DQotICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOT0RFX1RZUEVfVEVYVCAmJiBub2RlLm5vZGVWYWx1ZS5tYXRjaCgvXFMrLykgLyogbm9uLWVtcHR5ICovICkgew0KLSAgICAgICAgICAkY29tcGlsZU5vZGVzW2luZGV4XSA9IGpxTGl0ZShub2RlKS53cmFwKCc8c3Bhbj48L3NwYW4+JykucGFyZW50KClbMF07DQotICAgICAgICB9DQotICAgICAgfSk7DQotICAgICAgdmFyIGNvbXBvc2l0ZUxpbmtGbiA9DQotICAgICAgICAgICAgICBjb21waWxlTm9kZXMoJGNvbXBpbGVOb2RlcywgdHJhbnNjbHVkZUZuLCAkY29tcGlsZU5vZGVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUsIHByZXZpb3VzQ29tcGlsZUNvbnRleHQpOw0KLSAgICAgIGNvbXBpbGUuJCRhZGRTY29wZUNsYXNzKCRjb21waWxlTm9kZXMpOw0KLSAgICAgIHZhciBuYW1lc3BhY2UgPSBudWxsOw0KLSAgICAgIHJldHVybiBmdW5jdGlvbiBwdWJsaWNMaW5rRm4oc2NvcGUsIGNsb25lQ29ubmVjdEZuLCBvcHRpb25zKSB7DQotICAgICAgICBhc3NlcnRBcmcoc2NvcGUsICdzY29wZScpOw0KLQ0KLSAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307DQotICAgICAgICB2YXIgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4gPSBvcHRpb25zLnBhcmVudEJvdW5kVHJhbnNjbHVkZUZuLA0KLSAgICAgICAgICB0cmFuc2NsdWRlQ29udHJvbGxlcnMgPSBvcHRpb25zLnRyYW5zY2x1ZGVDb250cm9sbGVycywNCi0gICAgICAgICAgZnV0dXJlUGFyZW50RWxlbWVudCA9IG9wdGlvbnMuZnV0dXJlUGFyZW50RWxlbWVudDsNCi0NCi0gICAgICAgIC8vIFdoZW4gYHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuYCBpcyBwYXNzZWQsIGl0IGlzIGENCi0gICAgICAgIC8vIGBjb250cm9sbGVyc0JvdW5kVHJhbnNjbHVkZWAgZnVuY3Rpb24gKGl0IHdhcyBwcmV2aW91c2x5IHBhc3NlZA0KLSAgICAgICAgLy8gYXMgYHRyYW5zY2x1ZGVgIHRvIGRpcmVjdGl2ZS5saW5rKSBzbyB3ZSBtdXN0IHVud3JhcCBpdCB0byBnZXQNCi0gICAgICAgIC8vIGl0cyBgYm91bmRUcmFuc2NsdWRlRm5gDQotICAgICAgICBpZiAocGFyZW50Qm91bmRUcmFuc2NsdWRlRm4gJiYgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4uJCRib3VuZFRyYW5zY2x1ZGUpIHsNCi0gICAgICAgICAgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4gPSBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbi4kJGJvdW5kVHJhbnNjbHVkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICghbmFtZXNwYWNlKSB7DQotICAgICAgICAgIG5hbWVzcGFjZSA9IGRldGVjdE5hbWVzcGFjZUZvckNoaWxkRWxlbWVudHMoZnV0dXJlUGFyZW50RWxlbWVudCk7DQotICAgICAgICB9DQotICAgICAgICB2YXIgJGxpbmtOb2RlOw0KLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPT0gJ2h0bWwnKSB7DQotICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBkaXJlY3RpdmUgd2l0aCByZXBsYWNlOnRydWUgYW5kIHRlbXBsYXRlVXJsIHRoZSAkY29tcGlsZU5vZGVzDQotICAgICAgICAgIC8vIChvciBhIGNoaWxkIGVsZW1lbnQgaW5zaWRlIG9mIHRoZW0pDQotICAgICAgICAgIC8vIG1pZ2h0IGNoYW5nZSwgc28gd2UgbmVlZCB0byByZWNyZWF0ZSB0aGUgbmFtZXNwYWNlIGFkYXB0ZWQgY29tcGlsZU5vZGVzDQotICAgICAgICAgIC8vIGZvciBjYWxsIHRvIHRoZSBsaW5rIGZ1bmN0aW9uLg0KLSAgICAgICAgICAvLyBOb3RlOiBUaGlzIHdpbGwgYWxyZWFkeSBjbG9uZSB0aGUgbm9kZXMuLi4NCi0gICAgICAgICAgJGxpbmtOb2RlID0ganFMaXRlKA0KLSAgICAgICAgICAgIHdyYXBUZW1wbGF0ZShuYW1lc3BhY2UsIGpxTGl0ZSgnPGRpdj4nKS5hcHBlbmQoJGNvbXBpbGVOb2RlcykuaHRtbCgpKQ0KLSAgICAgICAgICApOw0KLSAgICAgICAgfSBlbHNlIGlmIChjbG9uZUNvbm5lY3RGbikgew0KLSAgICAgICAgICAvLyBpbXBvcnRhbnQhITogd2UgbXVzdCBjYWxsIG91ciBqcUxpdGUuY2xvbmUoKSBzaW5jZSB0aGUgalF1ZXJ5IG9uZSBpcyB0cnlpbmcgdG8gYmUgc21hcnQNCi0gICAgICAgICAgLy8gYW5kIHNvbWV0aW1lcyBjaGFuZ2VzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIERPTS4NCi0gICAgICAgICAgJGxpbmtOb2RlID0gSlFMaXRlUHJvdG90eXBlLmNsb25lLmNhbGwoJGNvbXBpbGVOb2Rlcyk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAkbGlua05vZGUgPSAkY29tcGlsZU5vZGVzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHRyYW5zY2x1ZGVDb250cm9sbGVycykgew0KLSAgICAgICAgICBmb3IgKHZhciBjb250cm9sbGVyTmFtZSBpbiB0cmFuc2NsdWRlQ29udHJvbGxlcnMpIHsNCi0gICAgICAgICAgICAkbGlua05vZGUuZGF0YSgnJCcgKyBjb250cm9sbGVyTmFtZSArICdDb250cm9sbGVyJywgdHJhbnNjbHVkZUNvbnRyb2xsZXJzW2NvbnRyb2xsZXJOYW1lXS5pbnN0YW5jZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNvbXBpbGUuJCRhZGRTY29wZUluZm8oJGxpbmtOb2RlLCBzY29wZSk7DQotDQotICAgICAgICBpZiAoY2xvbmVDb25uZWN0Rm4pIGNsb25lQ29ubmVjdEZuKCRsaW5rTm9kZSwgc2NvcGUpOw0KLSAgICAgICAgaWYgKGNvbXBvc2l0ZUxpbmtGbikgY29tcG9zaXRlTGlua0ZuKHNjb3BlLCAkbGlua05vZGUsICRsaW5rTm9kZSwgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4pOw0KLSAgICAgICAgcmV0dXJuICRsaW5rTm9kZTsNCi0gICAgICB9Ow0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGRldGVjdE5hbWVzcGFjZUZvckNoaWxkRWxlbWVudHMocGFyZW50RWxlbWVudCkgew0KLSAgICAgIC8vIFRPRE86IE1ha2UgdGhpcyBkZXRlY3QgTWF0aE1MIGFzIHdlbGwuLi4NCi0gICAgICB2YXIgbm9kZSA9IHBhcmVudEVsZW1lbnQgJiYgcGFyZW50RWxlbWVudFswXTsNCi0gICAgICBpZiAoIW5vZGUpIHsNCi0gICAgICAgIHJldHVybiAnaHRtbCc7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBub2RlTmFtZV8obm9kZSkgIT09ICdmb3JlaWdub2JqZWN0JyAmJiBub2RlLnRvU3RyaW5nKCkubWF0Y2goL1NWRy8pID8gJ3N2ZycgOiAnaHRtbCc7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDb21waWxlIGZ1bmN0aW9uIG1hdGNoZXMgZWFjaCBub2RlIGluIG5vZGVMaXN0IGFnYWluc3QgdGhlIGRpcmVjdGl2ZXMuIE9uY2UgYWxsIGRpcmVjdGl2ZXMNCi0gICAgICogZm9yIGEgcGFydGljdWxhciBub2RlIGFyZSBjb2xsZWN0ZWQgdGhlaXIgY29tcGlsZSBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkLiBUaGUgY29tcGlsZQ0KLSAgICAgKiBmdW5jdGlvbnMgcmV0dXJuIHZhbHVlcyAtIHRoZSBsaW5raW5nIGZ1bmN0aW9ucyAtIGFyZSBjb21iaW5lZCBpbnRvIGEgY29tcG9zaXRlIGxpbmtpbmcNCi0gICAgICogZnVuY3Rpb24sIHdoaWNoIGlzIHRoZSBhIGxpbmtpbmcgZnVuY3Rpb24gZm9yIHRoZSBub2RlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge05vZGVMaXN0fSBub2RlTGlzdCBhbiBhcnJheSBvZiBub2RlcyBvciBOb2RlTGlzdCB0byBjb21waWxlDQotICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oYW5ndWxhci5TY29wZSwgY2xvbmVBdHRhY2hGbj0pfSB0cmFuc2NsdWRlRm4gQSBsaW5raW5nIGZ1bmN0aW9uLCB3aGVyZSB0aGUNCi0gICAgICogICAgICAgIHNjb3BlIGFyZ3VtZW50IGlzIGF1dG8tZ2VuZXJhdGVkIHRvIHRoZSBuZXcgY2hpbGQgb2YgdGhlIHRyYW5zY2x1ZGVkIHBhcmVudCBzY29wZS4NCi0gICAgICogQHBhcmFtIHtET01FbGVtZW50PX0gJHJvb3RFbGVtZW50IElmIHRoZSBub2RlTGlzdCBpcyB0aGUgcm9vdCBvZiB0aGUgY29tcGlsYXRpb24gdHJlZSB0aGVuDQotICAgICAqICAgICAgICB0aGUgcm9vdEVsZW1lbnQgbXVzdCBiZSBzZXQgdGhlIGpxTGl0ZSBjb2xsZWN0aW9uIG9mIHRoZSBjb21waWxlIHJvb3QuIFRoaXMgaXMNCi0gICAgICogICAgICAgIG5lZWRlZCBzbyB0aGF0IHRoZSBqcUxpdGUgY29sbGVjdGlvbiBpdGVtcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCB3aWRnZXRzLg0KLSAgICAgKiBAcGFyYW0ge251bWJlcj19IG1heFByaW9yaXR5IE1heCBkaXJlY3RpdmUgcHJpb3JpdHkuDQotICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBjb21wb3NpdGUgbGlua2luZyBmdW5jdGlvbiBvZiBhbGwgb2YgdGhlIG1hdGNoZWQgZGlyZWN0aXZlcyBvciBudWxsLg0KLSAgICAgKi8NCi0gICAgZnVuY3Rpb24gY29tcGlsZU5vZGVzKG5vZGVMaXN0LCB0cmFuc2NsdWRlRm4sICRyb290RWxlbWVudCwgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCkgew0KLSAgICAgIHZhciBsaW5rRm5zID0gW10sDQotICAgICAgICAgIGF0dHJzLCBkaXJlY3RpdmVzLCBub2RlTGlua0ZuLCBjaGlsZE5vZGVzLCBjaGlsZExpbmtGbiwgbGlua0ZuRm91bmQsIG5vZGVMaW5rRm5Gb3VuZDsNCi0NCi0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVMaXN0Lmxlbmd0aDsgaSsrKSB7DQotICAgICAgICBhdHRycyA9IG5ldyBBdHRyaWJ1dGVzKCk7DQotDQotICAgICAgICAvLyB3ZSBtdXN0IGFsd2F5cyByZWZlciB0byBub2RlTGlzdFtpXSBzaW5jZSB0aGUgbm9kZXMgY2FuIGJlIHJlcGxhY2VkIHVuZGVybmVhdGggdXMuDQotICAgICAgICBkaXJlY3RpdmVzID0gY29sbGVjdERpcmVjdGl2ZXMobm9kZUxpc3RbaV0sIFtdLCBhdHRycywgaSA9PT0gMCA/IG1heFByaW9yaXR5IDogdW5kZWZpbmVkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVEaXJlY3RpdmUpOw0KLQ0KLSAgICAgICAgbm9kZUxpbmtGbiA9IChkaXJlY3RpdmVzLmxlbmd0aCkNCi0gICAgICAgICAgICA/IGFwcGx5RGlyZWN0aXZlc1RvTm9kZShkaXJlY3RpdmVzLCBub2RlTGlzdFtpXSwgYXR0cnMsIHRyYW5zY2x1ZGVGbiwgJHJvb3RFbGVtZW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgW10sIFtdLCBwcmV2aW91c0NvbXBpbGVDb250ZXh0KQ0KLSAgICAgICAgICAgIDogbnVsbDsNCi0NCi0gICAgICAgIGlmIChub2RlTGlua0ZuICYmIG5vZGVMaW5rRm4uc2NvcGUpIHsNCi0gICAgICAgICAgY29tcGlsZS4kJGFkZFNjb3BlQ2xhc3MoYXR0cnMuJCRlbGVtZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNoaWxkTGlua0ZuID0gKG5vZGVMaW5rRm4gJiYgbm9kZUxpbmtGbi50ZXJtaW5hbCB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAhKGNoaWxkTm9kZXMgPSBub2RlTGlzdFtpXS5jaGlsZE5vZGVzKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAhY2hpbGROb2Rlcy5sZW5ndGgpDQotICAgICAgICAgICAgPyBudWxsDQotICAgICAgICAgICAgOiBjb21waWxlTm9kZXMoY2hpbGROb2RlcywNCi0gICAgICAgICAgICAgICAgIG5vZGVMaW5rRm4gPyAoDQotICAgICAgICAgICAgICAgICAgKG5vZGVMaW5rRm4udHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQgfHwgIW5vZGVMaW5rRm4udGVtcGxhdGVPblRoaXNFbGVtZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgICYmIG5vZGVMaW5rRm4udHJhbnNjbHVkZSkgOiB0cmFuc2NsdWRlRm4pOw0KLQ0KLSAgICAgICAgaWYgKG5vZGVMaW5rRm4gfHwgY2hpbGRMaW5rRm4pIHsNCi0gICAgICAgICAgbGlua0Zucy5wdXNoKGksIG5vZGVMaW5rRm4sIGNoaWxkTGlua0ZuKTsNCi0gICAgICAgICAgbGlua0ZuRm91bmQgPSB0cnVlOw0KLSAgICAgICAgICBub2RlTGlua0ZuRm91bmQgPSBub2RlTGlua0ZuRm91bmQgfHwgbm9kZUxpbmtGbjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vdXNlIHRoZSBwcmV2aW91cyBjb250ZXh0IG9ubHkgZm9yIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSB2aXJ0dWFsIGdyb3VwDQotICAgICAgICBwcmV2aW91c0NvbXBpbGVDb250ZXh0ID0gbnVsbDsNCi0gICAgICB9DQotDQotICAgICAgLy8gcmV0dXJuIGEgbGlua2luZyBmdW5jdGlvbiBpZiB3ZSBoYXZlIGZvdW5kIGFueXRoaW5nLCBudWxsIG90aGVyd2lzZQ0KLSAgICAgIHJldHVybiBsaW5rRm5Gb3VuZCA/IGNvbXBvc2l0ZUxpbmtGbiA6IG51bGw7DQotDQotICAgICAgZnVuY3Rpb24gY29tcG9zaXRlTGlua0ZuKHNjb3BlLCBub2RlTGlzdCwgJHJvb3RFbGVtZW50LCBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbikgew0KLSAgICAgICAgdmFyIG5vZGVMaW5rRm4sIGNoaWxkTGlua0ZuLCBub2RlLCBjaGlsZFNjb3BlLCBpLCBpaSwgaWR4LCBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuOw0KLSAgICAgICAgdmFyIHN0YWJsZU5vZGVMaXN0Ow0KLQ0KLQ0KLSAgICAgICAgaWYgKG5vZGVMaW5rRm5Gb3VuZCkgew0KLSAgICAgICAgICAvLyBjb3B5IG5vZGVMaXN0IHNvIHRoYXQgaWYgYSBub2RlTGlua0ZuIHJlbW92ZXMgb3IgYWRkcyBhbiBlbGVtZW50IGF0IHRoaXMgRE9NIGxldmVsIG91cg0KLSAgICAgICAgICAvLyBvZmZzZXRzIGRvbid0IGdldCBzY3Jld2VkIHVwDQotICAgICAgICAgIHZhciBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0Lmxlbmd0aDsNCi0gICAgICAgICAgc3RhYmxlTm9kZUxpc3QgPSBuZXcgQXJyYXkobm9kZUxpc3RMZW5ndGgpOw0KLQ0KLSAgICAgICAgICAvLyBjcmVhdGUgYSBzcGFyc2UgYXJyYXkgYnkgb25seSBjb3B5aW5nIHRoZSBlbGVtZW50cyB3aGljaCBoYXZlIGEgbGlua0ZuDQotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5rRm5zLmxlbmd0aDsgaSs9Mykgew0KLSAgICAgICAgICAgIGlkeCA9IGxpbmtGbnNbaV07DQotICAgICAgICAgICAgc3RhYmxlTm9kZUxpc3RbaWR4XSA9IG5vZGVMaXN0W2lkeF07DQotICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIHN0YWJsZU5vZGVMaXN0ID0gbm9kZUxpc3Q7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGxpbmtGbnMubGVuZ3RoOyBpIDwgaWk7KSB7DQotICAgICAgICAgIG5vZGUgPSBzdGFibGVOb2RlTGlzdFtsaW5rRm5zW2krK11dOw0KLSAgICAgICAgICBub2RlTGlua0ZuID0gbGlua0Zuc1tpKytdOw0KLSAgICAgICAgICBjaGlsZExpbmtGbiA9IGxpbmtGbnNbaSsrXTsNCi0NCi0gICAgICAgICAgaWYgKG5vZGVMaW5rRm4pIHsNCi0gICAgICAgICAgICBpZiAobm9kZUxpbmtGbi5zY29wZSkgew0KLSAgICAgICAgICAgICAgY2hpbGRTY29wZSA9IHNjb3BlLiRuZXcoKTsNCi0gICAgICAgICAgICAgIGNvbXBpbGUuJCRhZGRTY29wZUluZm8oanFMaXRlKG5vZGUpLCBjaGlsZFNjb3BlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgY2hpbGRTY29wZSA9IHNjb3BlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAobm9kZUxpbmtGbi50cmFuc2NsdWRlT25UaGlzRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IGNyZWF0ZUJvdW5kVHJhbnNjbHVkZUZuKA0KLSAgICAgICAgICAgICAgICAgIHNjb3BlLCBub2RlTGlua0ZuLnRyYW5zY2x1ZGUsIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuLA0KLSAgICAgICAgICAgICAgICAgIG5vZGVMaW5rRm4uZWxlbWVudFRyYW5zY2x1ZGVPblRoaXNFbGVtZW50KTsNCi0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCFub2RlTGlua0ZuLnRlbXBsYXRlT25UaGlzRWxlbWVudCAmJiBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbikgew0KLSAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuOw0KLQ0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXBhcmVudEJvdW5kVHJhbnNjbHVkZUZuICYmIHRyYW5zY2x1ZGVGbikgew0KLSAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IGNyZWF0ZUJvdW5kVHJhbnNjbHVkZUZuKHNjb3BlLCB0cmFuc2NsdWRlRm4pOw0KLQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuID0gbnVsbDsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbm9kZUxpbmtGbihjaGlsZExpbmtGbiwgY2hpbGRTY29wZSwgbm9kZSwgJHJvb3RFbGVtZW50LCBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuKTsNCi0NCi0gICAgICAgICAgfSBlbHNlIGlmIChjaGlsZExpbmtGbikgew0KLSAgICAgICAgICAgIGNoaWxkTGlua0ZuKHNjb3BlLCBub2RlLmNoaWxkTm9kZXMsIHVuZGVmaW5lZCwgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4pOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGNyZWF0ZUJvdW5kVHJhbnNjbHVkZUZuKHNjb3BlLCB0cmFuc2NsdWRlRm4sIHByZXZpb3VzQm91bmRUcmFuc2NsdWRlRm4sIGVsZW1lbnRUcmFuc2NsdXNpb24pIHsNCi0NCi0gICAgICB2YXIgYm91bmRUcmFuc2NsdWRlRm4gPSBmdW5jdGlvbih0cmFuc2NsdWRlZFNjb3BlLCBjbG9uZUZuLCBjb250cm9sbGVycywgZnV0dXJlUGFyZW50RWxlbWVudCwgY29udGFpbmluZ1Njb3BlKSB7DQotDQotICAgICAgICBpZiAoIXRyYW5zY2x1ZGVkU2NvcGUpIHsNCi0gICAgICAgICAgdHJhbnNjbHVkZWRTY29wZSA9IHNjb3BlLiRuZXcoZmFsc2UsIGNvbnRhaW5pbmdTY29wZSk7DQotICAgICAgICAgIHRyYW5zY2x1ZGVkU2NvcGUuJCR0cmFuc2NsdWRlZCA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJhbnNjbHVkZUZuKHRyYW5zY2x1ZGVkU2NvcGUsIGNsb25lRm4sIHsNCi0gICAgICAgICAgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm46IHByZXZpb3VzQm91bmRUcmFuc2NsdWRlRm4sDQotICAgICAgICAgIHRyYW5zY2x1ZGVDb250cm9sbGVyczogY29udHJvbGxlcnMsDQotICAgICAgICAgIGZ1dHVyZVBhcmVudEVsZW1lbnQ6IGZ1dHVyZVBhcmVudEVsZW1lbnQNCi0gICAgICAgIH0pOw0KLSAgICAgIH07DQotDQotICAgICAgcmV0dXJuIGJvdW5kVHJhbnNjbHVkZUZuOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBMb29rcyBmb3IgZGlyZWN0aXZlcyBvbiB0aGUgZ2l2ZW4gbm9kZSBhbmQgYWRkcyB0aGVtIHRvIHRoZSBkaXJlY3RpdmUgY29sbGVjdGlvbiB3aGljaCBpcw0KLSAgICAgKiBzb3J0ZWQuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBub2RlIE5vZGUgdG8gc2VhcmNoLg0KLSAgICAgKiBAcGFyYW0gZGlyZWN0aXZlcyBBbiBhcnJheSB0byB3aGljaCB0aGUgZGlyZWN0aXZlcyBhcmUgYWRkZWQgdG8uIFRoaXMgYXJyYXkgaXMgc29ydGVkIGJlZm9yZQ0KLSAgICAgKiAgICAgICAgdGhlIGZ1bmN0aW9uIHJldHVybnMuDQotICAgICAqIEBwYXJhbSBhdHRycyBUaGUgc2hhcmVkIGF0dHJzIG9iamVjdCB3aGljaCBpcyB1c2VkIHRvIHBvcHVsYXRlIHRoZSBub3JtYWxpemVkIGF0dHJpYnV0ZXMuDQotICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gbWF4UHJpb3JpdHkgTWF4IGRpcmVjdGl2ZSBwcmlvcml0eS4NCi0gICAgICovDQotICAgIGZ1bmN0aW9uIGNvbGxlY3REaXJlY3RpdmVzKG5vZGUsIGRpcmVjdGl2ZXMsIGF0dHJzLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlKSB7DQotICAgICAgdmFyIG5vZGVUeXBlID0gbm9kZS5ub2RlVHlwZSwNCi0gICAgICAgICAgYXR0cnNNYXAgPSBhdHRycy4kYXR0ciwNCi0gICAgICAgICAgbWF0Y2gsDQotICAgICAgICAgIGNsYXNzTmFtZTsNCi0NCi0gICAgICBzd2l0Y2ggKG5vZGVUeXBlKSB7DQotICAgICAgICBjYXNlIE5PREVfVFlQRV9FTEVNRU5UOiAvKiBFbGVtZW50ICovDQotICAgICAgICAgIC8vIHVzZSB0aGUgbm9kZSBuYW1lOiA8ZGlyZWN0aXZlPg0KLSAgICAgICAgICBhZGREaXJlY3RpdmUoZGlyZWN0aXZlcywNCi0gICAgICAgICAgICAgIGRpcmVjdGl2ZU5vcm1hbGl6ZShub2RlTmFtZV8obm9kZSkpLCAnRScsIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUpOw0KLQ0KLSAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGF0dHJpYnV0ZXMNCi0gICAgICAgICAgZm9yICh2YXIgYXR0ciwgbmFtZSwgbk5hbWUsIG5nQXR0ck5hbWUsIHZhbHVlLCBpc05nQXR0ciwgbkF0dHJzID0gbm9kZS5hdHRyaWJ1dGVzLA0KLSAgICAgICAgICAgICAgICAgICBqID0gMCwgamogPSBuQXR0cnMgJiYgbkF0dHJzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsNCi0gICAgICAgICAgICB2YXIgYXR0clN0YXJ0TmFtZSA9IGZhbHNlOw0KLSAgICAgICAgICAgIHZhciBhdHRyRW5kTmFtZSA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgIGF0dHIgPSBuQXR0cnNbal07DQotICAgICAgICAgICAgbmFtZSA9IGF0dHIubmFtZTsNCi0gICAgICAgICAgICB2YWx1ZSA9IHRyaW0oYXR0ci52YWx1ZSk7DQotDQotICAgICAgICAgICAgLy8gc3VwcG9ydCBuZ0F0dHIgYXR0cmlidXRlIGJpbmRpbmcNCi0gICAgICAgICAgICBuZ0F0dHJOYW1lID0gZGlyZWN0aXZlTm9ybWFsaXplKG5hbWUpOw0KLSAgICAgICAgICAgIGlmIChpc05nQXR0ciA9IE5HX0FUVFJfQklORElORy50ZXN0KG5nQXR0ck5hbWUpKSB7DQotICAgICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKFBSRUZJWF9SRUdFWFAsICcnKQ0KLSAgICAgICAgICAgICAgICAuc3Vic3RyKDgpLnJlcGxhY2UoL18oLikvZywgZnVuY3Rpb24obWF0Y2gsIGxldHRlcikgew0KLSAgICAgICAgICAgICAgICAgIHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsNCi0gICAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhciBkaXJlY3RpdmVOTmFtZSA9IG5nQXR0ck5hbWUucmVwbGFjZSgvKFN0YXJ0fEVuZCkkLywgJycpOw0KLSAgICAgICAgICAgIGlmIChkaXJlY3RpdmVJc011bHRpRWxlbWVudChkaXJlY3RpdmVOTmFtZSkpIHsNCi0gICAgICAgICAgICAgIGlmIChuZ0F0dHJOYW1lID09PSBkaXJlY3RpdmVOTmFtZSArICdTdGFydCcpIHsNCi0gICAgICAgICAgICAgICAgYXR0clN0YXJ0TmFtZSA9IG5hbWU7DQotICAgICAgICAgICAgICAgIGF0dHJFbmROYW1lID0gbmFtZS5zdWJzdHIoMCwgbmFtZS5sZW5ndGggLSA1KSArICdlbmQnOw0KLSAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMCwgbmFtZS5sZW5ndGggLSA2KTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbk5hbWUgPSBkaXJlY3RpdmVOb3JtYWxpemUobmFtZS50b0xvd2VyQ2FzZSgpKTsNCi0gICAgICAgICAgICBhdHRyc01hcFtuTmFtZV0gPSBuYW1lOw0KLSAgICAgICAgICAgIGlmIChpc05nQXR0ciB8fCAhYXR0cnMuaGFzT3duUHJvcGVydHkobk5hbWUpKSB7DQotICAgICAgICAgICAgICAgIGF0dHJzW25OYW1lXSA9IHZhbHVlOw0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0Qm9vbGVhbkF0dHJOYW1lKG5vZGUsIG5OYW1lKSkgew0KLSAgICAgICAgICAgICAgICAgIGF0dHJzW25OYW1lXSA9IHRydWU7IC8vIHByZXNlbmNlIG1lYW5zIHRydWUNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBhZGRBdHRySW50ZXJwb2xhdGVEaXJlY3RpdmUobm9kZSwgZGlyZWN0aXZlcywgdmFsdWUsIG5OYW1lLCBpc05nQXR0cik7DQotICAgICAgICAgICAgYWRkRGlyZWN0aXZlKGRpcmVjdGl2ZXMsIG5OYW1lLCAnQScsIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUsIGF0dHJTdGFydE5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyRW5kTmFtZSk7DQotICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgLy8gdXNlIGNsYXNzIGFzIGRpcmVjdGl2ZQ0KLSAgICAgICAgICBjbGFzc05hbWUgPSBub2RlLmNsYXNzTmFtZTsNCi0gICAgICAgICAgaWYgKGlzU3RyaW5nKGNsYXNzTmFtZSkgJiYgY2xhc3NOYW1lICE9PSAnJykgew0KLSAgICAgICAgICAgIHdoaWxlIChtYXRjaCA9IENMQVNTX0RJUkVDVElWRV9SRUdFWFAuZXhlYyhjbGFzc05hbWUpKSB7DQotICAgICAgICAgICAgICBuTmFtZSA9IGRpcmVjdGl2ZU5vcm1hbGl6ZShtYXRjaFsyXSk7DQotICAgICAgICAgICAgICBpZiAoYWRkRGlyZWN0aXZlKGRpcmVjdGl2ZXMsIG5OYW1lLCAnQycsIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUpKSB7DQotICAgICAgICAgICAgICAgIGF0dHJzW25OYW1lXSA9IHRyaW0obWF0Y2hbM10pOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9DQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBOT0RFX1RZUEVfVEVYVDogLyogVGV4dCBOb2RlICovDQotICAgICAgICAgIGFkZFRleHRJbnRlcnBvbGF0ZURpcmVjdGl2ZShkaXJlY3RpdmVzLCBub2RlLm5vZGVWYWx1ZSk7DQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBOT0RFX1RZUEVfQ09NTUVOVDogLyogQ29tbWVudCAqLw0KLSAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIG1hdGNoID0gQ09NTUVOVF9ESVJFQ1RJVkVfUkVHRVhQLmV4ZWMobm9kZS5ub2RlVmFsdWUpOw0KLSAgICAgICAgICAgIGlmIChtYXRjaCkgew0KLSAgICAgICAgICAgICAgbk5hbWUgPSBkaXJlY3RpdmVOb3JtYWxpemUobWF0Y2hbMV0pOw0KLSAgICAgICAgICAgICAgaWYgKGFkZERpcmVjdGl2ZShkaXJlY3RpdmVzLCBuTmFtZSwgJ00nLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlKSkgew0KLSAgICAgICAgICAgICAgICBhdHRyc1tuTmFtZV0gPSB0cmltKG1hdGNoWzJdKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCi0gICAgICAgICAgICAvLyB0dXJucyBvdXQgdGhhdCB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMgSUU5IHRocm93cyBlcnJvcnMgd2hlbiBvbmUgYXR0ZW1wdHMgdG8gcmVhZA0KLSAgICAgICAgICAgIC8vIGNvbW1lbnQncyBub2RlIHZhbHVlLg0KLSAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIGl0IGFuZCBjb250aW51ZS4gKENhbid0IHNlZW0gdG8gcmVwcm9kdWNlIGluIHRlc3QgY2FzZS4pDQotICAgICAgICAgIH0NCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLQ0KLSAgICAgIGRpcmVjdGl2ZXMuc29ydChieVByaW9yaXR5KTsNCi0gICAgICByZXR1cm4gZGlyZWN0aXZlczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2l2ZW4gYSBub2RlIHdpdGggYW4gZGlyZWN0aXZlLXN0YXJ0IGl0IGNvbGxlY3RzIGFsbCBvZiB0aGUgc2libGluZ3MgdW50aWwgaXQgZmluZHMNCi0gICAgICogZGlyZWN0aXZlLWVuZC4NCi0gICAgICogQHBhcmFtIG5vZGUNCi0gICAgICogQHBhcmFtIGF0dHJTdGFydA0KLSAgICAgKiBAcGFyYW0gYXR0ckVuZA0KLSAgICAgKiBAcmV0dXJucyB7Kn0NCi0gICAgICovDQotICAgIGZ1bmN0aW9uIGdyb3VwU2Nhbihub2RlLCBhdHRyU3RhcnQsIGF0dHJFbmQpIHsNCi0gICAgICB2YXIgbm9kZXMgPSBbXTsNCi0gICAgICB2YXIgZGVwdGggPSAwOw0KLSAgICAgIGlmIChhdHRyU3RhcnQgJiYgbm9kZS5oYXNBdHRyaWJ1dGUgJiYgbm9kZS5oYXNBdHRyaWJ1dGUoYXR0clN0YXJ0KSkgew0KLSAgICAgICAgZG8gew0KLSAgICAgICAgICBpZiAoIW5vZGUpIHsNCi0gICAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycigndXRlcmRpcicsDQotICAgICAgICAgICAgICAgICAgICAgICJVbnRlcm1pbmF0ZWQgYXR0cmlidXRlLCBmb3VuZCAnezB9JyBidXQgbm8gbWF0Y2hpbmcgJ3sxfScgZm91bmQuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgYXR0clN0YXJ0LCBhdHRyRW5kKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOT0RFX1RZUEVfRUxFTUVOVCkgew0KLSAgICAgICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyU3RhcnQpKSBkZXB0aCsrOw0KLSAgICAgICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyRW5kKSkgZGVwdGgtLTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBub2Rlcy5wdXNoKG5vZGUpOw0KLSAgICAgICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZzsNCi0gICAgICAgIH0gd2hpbGUgKGRlcHRoID4gMCk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIG5vZGVzLnB1c2gobm9kZSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIHJldHVybiBqcUxpdGUobm9kZXMpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBXcmFwcGVyIGZvciBsaW5raW5nIGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIG5vcm1hbCBsaW5raW5nIGZ1bmN0aW9uIGludG8gYSBncm91cGVkDQotICAgICAqIGxpbmtpbmcgZnVuY3Rpb24uDQotICAgICAqIEBwYXJhbSBsaW5rRm4NCi0gICAgICogQHBhcmFtIGF0dHJTdGFydA0KLSAgICAgKiBAcGFyYW0gYXR0ckVuZA0KLSAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259DQotICAgICAqLw0KLSAgICBmdW5jdGlvbiBncm91cEVsZW1lbnRzTGlua0ZuV3JhcHBlcihsaW5rRm4sIGF0dHJTdGFydCwgYXR0ckVuZCkgew0KLSAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXJzLCB0cmFuc2NsdWRlRm4pIHsNCi0gICAgICAgIGVsZW1lbnQgPSBncm91cFNjYW4oZWxlbWVudFswXSwgYXR0clN0YXJ0LCBhdHRyRW5kKTsNCi0gICAgICAgIHJldHVybiBsaW5rRm4oc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBjb250cm9sbGVycywgdHJhbnNjbHVkZUZuKTsNCi0gICAgICB9Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBPbmNlIHRoZSBkaXJlY3RpdmVzIGhhdmUgYmVlbiBjb2xsZWN0ZWQsIHRoZWlyIGNvbXBpbGUgZnVuY3Rpb25zIGFyZSBleGVjdXRlZC4gVGhpcyBtZXRob2QNCi0gICAgICogaXMgcmVzcG9uc2libGUgZm9yIGlubGluaW5nIGRpcmVjdGl2ZSB0ZW1wbGF0ZXMgYXMgd2VsbCBhcyB0ZXJtaW5hdGluZyB0aGUgYXBwbGljYXRpb24NCi0gICAgICogb2YgdGhlIGRpcmVjdGl2ZXMgaWYgdGhlIHRlcm1pbmFsIGRpcmVjdGl2ZSBoYXMgYmVlbiByZWFjaGVkLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge0FycmF5fSBkaXJlY3RpdmVzIEFycmF5IG9mIGNvbGxlY3RlZCBkaXJlY3RpdmVzIHRvIGV4ZWN1dGUgdGhlaXIgY29tcGlsZSBmdW5jdGlvbi4NCi0gICAgICogICAgICAgIHRoaXMgbmVlZHMgdG8gYmUgcHJlLXNvcnRlZCBieSBwcmlvcml0eSBvcmRlci4NCi0gICAgICogQHBhcmFtIHtOb2RlfSBjb21waWxlTm9kZSBUaGUgcmF3IERPTSBub2RlIHRvIGFwcGx5IHRoZSBjb21waWxlIGZ1bmN0aW9ucyB0bw0KLSAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGVBdHRycyBUaGUgc2hhcmVkIGF0dHJpYnV0ZSBmdW5jdGlvbg0KLSAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGFuZ3VsYXIuU2NvcGUsIGNsb25lQXR0YWNoRm49KX0gdHJhbnNjbHVkZUZuIEEgbGlua2luZyBmdW5jdGlvbiwgd2hlcmUgdGhlDQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZSBhcmd1bWVudCBpcyBhdXRvLWdlbmVyYXRlZCB0byB0aGUgbmV3DQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCBvZiB0aGUgdHJhbnNjbHVkZWQgcGFyZW50IHNjb3BlLg0KLSAgICAgKiBAcGFyYW0ge0pRTGl0ZX0ganFDb2xsZWN0aW9uIElmIHdlIGFyZSB3b3JraW5nIG9uIHRoZSByb290IG9mIHRoZSBjb21waWxlIHRyZWUgdGhlbiB0aGlzDQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQgaGFzIHRoZSByb290IGpxTGl0ZSBhcnJheSBzbyB0aGF0IHdlIGNhbiByZXBsYWNlIG5vZGVzDQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gaXQuDQotICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gb3JpZ2luYWxSZXBsYWNlRGlyZWN0aXZlIEFuIG9wdGlvbmFsIGRpcmVjdGl2ZSB0aGF0IHdpbGwgYmUgaWdub3JlZCB3aGVuDQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGluZyB0aGUgdHJhbnNjbHVzaW9uLg0KLSAgICAgKiBAcGFyYW0ge0FycmF5LjxGdW5jdGlvbj59IHByZUxpbmtGbnMNCi0gICAgICogQHBhcmFtIHtBcnJheS48RnVuY3Rpb24+fSBwb3N0TGlua0Zucw0KLSAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJldmlvdXNDb21waWxlQ29udGV4dCBDb250ZXh0IHVzZWQgZm9yIHByZXZpb3VzIGNvbXBpbGF0aW9uIG9mIHRoZSBjdXJyZW50DQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUNCi0gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBsaW5rRm4NCi0gICAgICovDQotICAgIGZ1bmN0aW9uIGFwcGx5RGlyZWN0aXZlc1RvTm9kZShkaXJlY3RpdmVzLCBjb21waWxlTm9kZSwgdGVtcGxhdGVBdHRycywgdHJhbnNjbHVkZUZuLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganFDb2xsZWN0aW9uLCBvcmlnaW5hbFJlcGxhY2VEaXJlY3RpdmUsIHByZUxpbmtGbnMsIHBvc3RMaW5rRm5zLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCkgew0KLSAgICAgIHByZXZpb3VzQ29tcGlsZUNvbnRleHQgPSBwcmV2aW91c0NvbXBpbGVDb250ZXh0IHx8IHt9Ow0KLQ0KLSAgICAgIHZhciB0ZXJtaW5hbFByaW9yaXR5ID0gLU51bWJlci5NQVhfVkFMVUUsDQotICAgICAgICAgIG5ld1Njb3BlRGlyZWN0aXZlLA0KLSAgICAgICAgICBjb250cm9sbGVyRGlyZWN0aXZlcyA9IHByZXZpb3VzQ29tcGlsZUNvbnRleHQuY29udHJvbGxlckRpcmVjdGl2ZXMsDQotICAgICAgICAgIGNvbnRyb2xsZXJzLA0KLSAgICAgICAgICBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgPSBwcmV2aW91c0NvbXBpbGVDb250ZXh0Lm5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSwNCi0gICAgICAgICAgdGVtcGxhdGVEaXJlY3RpdmUgPSBwcmV2aW91c0NvbXBpbGVDb250ZXh0LnRlbXBsYXRlRGlyZWN0aXZlLA0KLSAgICAgICAgICBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlID0gcHJldmlvdXNDb21waWxlQ29udGV4dC5ub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlLA0KLSAgICAgICAgICBoYXNUcmFuc2NsdWRlRGlyZWN0aXZlID0gZmFsc2UsDQotICAgICAgICAgIGhhc1RlbXBsYXRlID0gZmFsc2UsDQotICAgICAgICAgIGhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlID0gcHJldmlvdXNDb21waWxlQ29udGV4dC5oYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSwNCi0gICAgICAgICAgJGNvbXBpbGVOb2RlID0gdGVtcGxhdGVBdHRycy4kJGVsZW1lbnQgPSBqcUxpdGUoY29tcGlsZU5vZGUpLA0KLSAgICAgICAgICBkaXJlY3RpdmUsDQotICAgICAgICAgIGRpcmVjdGl2ZU5hbWUsDQotICAgICAgICAgICR0ZW1wbGF0ZSwNCi0gICAgICAgICAgcmVwbGFjZURpcmVjdGl2ZSA9IG9yaWdpbmFsUmVwbGFjZURpcmVjdGl2ZSwNCi0gICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4gPSB0cmFuc2NsdWRlRm4sDQotICAgICAgICAgIGxpbmtGbiwNCi0gICAgICAgICAgZGlyZWN0aXZlVmFsdWU7DQotDQotICAgICAgLy8gZXhlY3V0ZXMgYWxsIGRpcmVjdGl2ZXMgb24gdGhlIGN1cnJlbnQgZWxlbWVudA0KLSAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KLSAgICAgICAgZGlyZWN0aXZlID0gZGlyZWN0aXZlc1tpXTsNCi0gICAgICAgIHZhciBhdHRyU3RhcnQgPSBkaXJlY3RpdmUuJCRzdGFydDsNCi0gICAgICAgIHZhciBhdHRyRW5kID0gZGlyZWN0aXZlLiQkZW5kOw0KLQ0KLSAgICAgICAgLy8gY29sbGVjdCBtdWx0aWJsb2NrIHNlY3Rpb25zDQotICAgICAgICBpZiAoYXR0clN0YXJ0KSB7DQotICAgICAgICAgICRjb21waWxlTm9kZSA9IGdyb3VwU2Nhbihjb21waWxlTm9kZSwgYXR0clN0YXJ0LCBhdHRyRW5kKTsNCi0gICAgICAgIH0NCi0gICAgICAgICR0ZW1wbGF0ZSA9IHVuZGVmaW5lZDsNCi0NCi0gICAgICAgIGlmICh0ZXJtaW5hbFByaW9yaXR5ID4gZGlyZWN0aXZlLnByaW9yaXR5KSB7DQotICAgICAgICAgIGJyZWFrOyAvLyBwcmV2ZW50IGZ1cnRoZXIgcHJvY2Vzc2luZyBvZiBkaXJlY3RpdmVzDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZGlyZWN0aXZlVmFsdWUgPSBkaXJlY3RpdmUuc2NvcGUpIHsNCi0NCi0gICAgICAgICAgLy8gc2tpcCB0aGUgY2hlY2sgZm9yIGRpcmVjdGl2ZXMgd2l0aCBhc3luYyB0ZW1wbGF0ZXMsIHdlJ2xsIGNoZWNrIHRoZSBkZXJpdmVkIHN5bmMNCi0gICAgICAgICAgLy8gZGlyZWN0aXZlIHdoZW4gdGhlIHRlbXBsYXRlIGFycml2ZXMNCi0gICAgICAgICAgaWYgKCFkaXJlY3RpdmUudGVtcGxhdGVVcmwpIHsNCi0gICAgICAgICAgICBpZiAoaXNPYmplY3QoZGlyZWN0aXZlVmFsdWUpKSB7DQotICAgICAgICAgICAgICAvLyBUaGlzIGRpcmVjdGl2ZSBpcyB0cnlpbmcgdG8gYWRkIGFuIGlzb2xhdGVkIHNjb3BlLg0KLSAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBubyBzY29wZSBvZiBhbnkga2luZCBhbHJlYWR5DQotICAgICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZSgnbmV3L2lzb2xhdGVkIHNjb3BlJywgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlIHx8IG5ld1Njb3BlRGlyZWN0aXZlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlLCAkY29tcGlsZU5vZGUpOw0KLSAgICAgICAgICAgICAgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlID0gZGlyZWN0aXZlOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAvLyBUaGlzIGRpcmVjdGl2ZSBpcyB0cnlpbmcgdG8gYWRkIGEgY2hpbGQgc2NvcGUuDQotICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGlzIG5vIGlzb2xhdGVkIHNjb3BlIGFscmVhZHkNCi0gICAgICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlKCduZXcvaXNvbGF0ZWQgc2NvcGUnLCBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUsIGRpcmVjdGl2ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21waWxlTm9kZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIG5ld1Njb3BlRGlyZWN0aXZlID0gbmV3U2NvcGVEaXJlY3RpdmUgfHwgZGlyZWN0aXZlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZGlyZWN0aXZlTmFtZSA9IGRpcmVjdGl2ZS5uYW1lOw0KLQ0KLSAgICAgICAgaWYgKCFkaXJlY3RpdmUudGVtcGxhdGVVcmwgJiYgZGlyZWN0aXZlLmNvbnRyb2xsZXIpIHsNCi0gICAgICAgICAgZGlyZWN0aXZlVmFsdWUgPSBkaXJlY3RpdmUuY29udHJvbGxlcjsNCi0gICAgICAgICAgY29udHJvbGxlckRpcmVjdGl2ZXMgPSBjb250cm9sbGVyRGlyZWN0aXZlcyB8fCB7fTsNCi0gICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGUoIiciICsgZGlyZWN0aXZlTmFtZSArICInIGNvbnRyb2xsZXIiLA0KLSAgICAgICAgICAgICAgY29udHJvbGxlckRpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0sIGRpcmVjdGl2ZSwgJGNvbXBpbGVOb2RlKTsNCi0gICAgICAgICAgY29udHJvbGxlckRpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0gPSBkaXJlY3RpdmU7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZGlyZWN0aXZlVmFsdWUgPSBkaXJlY3RpdmUudHJhbnNjbHVkZSkgew0KLSAgICAgICAgICBoYXNUcmFuc2NsdWRlRGlyZWN0aXZlID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIG5nSWYgYW5kIG5nUmVwZWF0IHNvIHRoYXQgd2UgZG9uJ3QgY29tcGxhaW4gYWJvdXQgZHVwbGljYXRlIHRyYW5zY2x1c2lvbi4NCi0gICAgICAgICAgLy8gVGhpcyBvcHRpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBkaXJlY3RpdmVzIHRoYXQga25vdyBob3cgdG8gc2FmZWx5IGhhbmRsZSBlbGVtZW50IHRyYW5zY2x1c2lvbiwNCi0gICAgICAgICAgLy8gd2hlcmUgdGhlIHRyYW5zY2x1ZGVkIG5vZGVzIGFyZSBhZGRlZCBvciByZXBsYWNlZCBhZnRlciBsaW5raW5nLg0KLSAgICAgICAgICBpZiAoIWRpcmVjdGl2ZS4kJHRsYikgew0KLSAgICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlKCd0cmFuc2NsdXNpb24nLCBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlLCBkaXJlY3RpdmUsICRjb21waWxlTm9kZSk7DQotICAgICAgICAgICAgbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZSA9IGRpcmVjdGl2ZTsNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICBpZiAoZGlyZWN0aXZlVmFsdWUgPT0gJ2VsZW1lbnQnKSB7DQotICAgICAgICAgICAgaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmUgPSB0cnVlOw0KLSAgICAgICAgICAgIHRlcm1pbmFsUHJpb3JpdHkgPSBkaXJlY3RpdmUucHJpb3JpdHk7DQotICAgICAgICAgICAgJHRlbXBsYXRlID0gJGNvbXBpbGVOb2RlOw0KLSAgICAgICAgICAgICRjb21waWxlTm9kZSA9IHRlbXBsYXRlQXR0cnMuJCRlbGVtZW50ID0NCi0gICAgICAgICAgICAgICAganFMaXRlKGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJyAnICsgZGlyZWN0aXZlTmFtZSArICc6ICcgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUF0dHJzW2RpcmVjdGl2ZU5hbWVdICsgJyAnKSk7DQotICAgICAgICAgICAgY29tcGlsZU5vZGUgPSAkY29tcGlsZU5vZGVbMF07DQotICAgICAgICAgICAgcmVwbGFjZVdpdGgoanFDb2xsZWN0aW9uLCBzbGljZUFyZ3MoJHRlbXBsYXRlKSwgY29tcGlsZU5vZGUpOw0KLQ0KLSAgICAgICAgICAgIGNoaWxkVHJhbnNjbHVkZUZuID0gY29tcGlsZSgkdGVtcGxhdGUsIHRyYW5zY2x1ZGVGbiwgdGVybWluYWxQcmlvcml0eSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZURpcmVjdGl2ZSAmJiByZXBsYWNlRGlyZWN0aXZlLm5hbWUsIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBwYXNzIGluOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gY29udHJvbGxlckRpcmVjdGl2ZXMgLSBvdGhlcndpc2Ugd2UnbGwgY3JlYXRlIGR1cGxpY2F0ZXMgY29udHJvbGxlcnMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSBvciB0ZW1wbGF0ZURpcmVjdGl2ZSAtIGNvbWJpbmluZyB0ZW1wbGF0ZXMgd2l0aA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZWxlbWVudCB0cmFuc2NsdXNpb24gZG9lc24ndCBtYWtlIHNlbnNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCBvbmx5IG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmUgc28gdGhhdCB3ZSBwcmV2ZW50IHB1dHRpbmcgdHJhbnNjbHVzaW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gdGhlIHNhbWUgZWxlbWVudCBtb3JlIHRoYW4gb25jZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlOiBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICR0ZW1wbGF0ZSA9IGpxTGl0ZShqcUxpdGVDbG9uZShjb21waWxlTm9kZSkpLmNvbnRlbnRzKCk7DQotICAgICAgICAgICAgJGNvbXBpbGVOb2RlLmVtcHR5KCk7IC8vIGNsZWFyIGNvbnRlbnRzDQotICAgICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4gPSBjb21waWxlKCR0ZW1wbGF0ZSwgdHJhbnNjbHVkZUZuKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGRpcmVjdGl2ZS50ZW1wbGF0ZSkgew0KLSAgICAgICAgICBoYXNUZW1wbGF0ZSA9IHRydWU7DQotICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlKCd0ZW1wbGF0ZScsIHRlbXBsYXRlRGlyZWN0aXZlLCBkaXJlY3RpdmUsICRjb21waWxlTm9kZSk7DQotICAgICAgICAgIHRlbXBsYXRlRGlyZWN0aXZlID0gZGlyZWN0aXZlOw0KLQ0KLSAgICAgICAgICBkaXJlY3RpdmVWYWx1ZSA9IChpc0Z1bmN0aW9uKGRpcmVjdGl2ZS50ZW1wbGF0ZSkpDQotICAgICAgICAgICAgICA/IGRpcmVjdGl2ZS50ZW1wbGF0ZSgkY29tcGlsZU5vZGUsIHRlbXBsYXRlQXR0cnMpDQotICAgICAgICAgICAgICA6IGRpcmVjdGl2ZS50ZW1wbGF0ZTsNCi0NCi0gICAgICAgICAgZGlyZWN0aXZlVmFsdWUgPSBkZW5vcm1hbGl6ZVRlbXBsYXRlKGRpcmVjdGl2ZVZhbHVlKTsNCi0NCi0gICAgICAgICAgaWYgKGRpcmVjdGl2ZS5yZXBsYWNlKSB7DQotICAgICAgICAgICAgcmVwbGFjZURpcmVjdGl2ZSA9IGRpcmVjdGl2ZTsNCi0gICAgICAgICAgICBpZiAoanFMaXRlSXNUZXh0Tm9kZShkaXJlY3RpdmVWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICR0ZW1wbGF0ZSA9IFtdOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAkdGVtcGxhdGUgPSByZW1vdmVDb21tZW50cyh3cmFwVGVtcGxhdGUoZGlyZWN0aXZlLnRlbXBsYXRlTmFtZXNwYWNlLCB0cmltKGRpcmVjdGl2ZVZhbHVlKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb21waWxlTm9kZSA9ICR0ZW1wbGF0ZVswXTsNCi0NCi0gICAgICAgICAgICBpZiAoJHRlbXBsYXRlLmxlbmd0aCAhPSAxIHx8IGNvbXBpbGVOb2RlLm5vZGVUeXBlICE9PSBOT0RFX1RZUEVfRUxFTUVOVCkgew0KLSAgICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ3RwbHJ0JywNCi0gICAgICAgICAgICAgICAgICAiVGVtcGxhdGUgZm9yIGRpcmVjdGl2ZSAnezB9JyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcm9vdCBlbGVtZW50LiB7MX0iLA0KLSAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZU5hbWUsICcnKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmVwbGFjZVdpdGgoanFDb2xsZWN0aW9uLCAkY29tcGlsZU5vZGUsIGNvbXBpbGVOb2RlKTsNCi0NCi0gICAgICAgICAgICB2YXIgbmV3VGVtcGxhdGVBdHRycyA9IHskYXR0cjoge319Ow0KLQ0KLSAgICAgICAgICAgIC8vIGNvbWJpbmUgZGlyZWN0aXZlcyBmcm9tIHRoZSBvcmlnaW5hbCBub2RlIGFuZCBmcm9tIHRoZSB0ZW1wbGF0ZToNCi0gICAgICAgICAgICAvLyAtIHRha2UgdGhlIGFycmF5IG9mIGRpcmVjdGl2ZXMgZm9yIHRoaXMgZWxlbWVudA0KLSAgICAgICAgICAgIC8vIC0gc3BsaXQgaXQgaW50byB0d28gcGFydHMsIHRob3NlIHRoYXQgYWxyZWFkeSBhcHBsaWVkIChwcm9jZXNzZWQpIGFuZCB0aG9zZSB0aGF0IHdlcmVuJ3QgKHVucHJvY2Vzc2VkKQ0KLSAgICAgICAgICAgIC8vIC0gY29sbGVjdCBkaXJlY3RpdmVzIGZyb20gdGhlIHRlbXBsYXRlIGFuZCBzb3J0IHRoZW0gYnkgcHJpb3JpdHkNCi0gICAgICAgICAgICAvLyAtIGNvbWJpbmUgZGlyZWN0aXZlcyBhczogcHJvY2Vzc2VkICsgdGVtcGxhdGUgKyB1bnByb2Nlc3NlZA0KLSAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURpcmVjdGl2ZXMgPSBjb2xsZWN0RGlyZWN0aXZlcyhjb21waWxlTm9kZSwgW10sIG5ld1RlbXBsYXRlQXR0cnMpOw0KLSAgICAgICAgICAgIHZhciB1bnByb2Nlc3NlZERpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzLnNwbGljZShpICsgMSwgZGlyZWN0aXZlcy5sZW5ndGggLSAoaSArIDEpKTsNCi0NCi0gICAgICAgICAgICBpZiAobmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlKSB7DQotICAgICAgICAgICAgICBtYXJrRGlyZWN0aXZlc0FzSXNvbGF0ZSh0ZW1wbGF0ZURpcmVjdGl2ZXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkaXJlY3RpdmVzID0gZGlyZWN0aXZlcy5jb25jYXQodGVtcGxhdGVEaXJlY3RpdmVzKS5jb25jYXQodW5wcm9jZXNzZWREaXJlY3RpdmVzKTsNCi0gICAgICAgICAgICBtZXJnZVRlbXBsYXRlQXR0cmlidXRlcyh0ZW1wbGF0ZUF0dHJzLCBuZXdUZW1wbGF0ZUF0dHJzKTsNCi0NCi0gICAgICAgICAgICBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICRjb21waWxlTm9kZS5odG1sKGRpcmVjdGl2ZVZhbHVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGRpcmVjdGl2ZS50ZW1wbGF0ZVVybCkgew0KLSAgICAgICAgICBoYXNUZW1wbGF0ZSA9IHRydWU7DQotICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlKCd0ZW1wbGF0ZScsIHRlbXBsYXRlRGlyZWN0aXZlLCBkaXJlY3RpdmUsICRjb21waWxlTm9kZSk7DQotICAgICAgICAgIHRlbXBsYXRlRGlyZWN0aXZlID0gZGlyZWN0aXZlOw0KLQ0KLSAgICAgICAgICBpZiAoZGlyZWN0aXZlLnJlcGxhY2UpIHsNCi0gICAgICAgICAgICByZXBsYWNlRGlyZWN0aXZlID0gZGlyZWN0aXZlOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIG5vZGVMaW5rRm4gPSBjb21waWxlVGVtcGxhdGVVcmwoZGlyZWN0aXZlcy5zcGxpY2UoaSwgZGlyZWN0aXZlcy5sZW5ndGggLSBpKSwgJGNvbXBpbGVOb2RlLA0KLSAgICAgICAgICAgICAgdGVtcGxhdGVBdHRycywganFDb2xsZWN0aW9uLCBoYXNUcmFuc2NsdWRlRGlyZWN0aXZlICYmIGNoaWxkVHJhbnNjbHVkZUZuLCBwcmVMaW5rRm5zLCBwb3N0TGlua0Zucywgew0KLSAgICAgICAgICAgICAgICBjb250cm9sbGVyRGlyZWN0aXZlczogY29udHJvbGxlckRpcmVjdGl2ZXMsDQotICAgICAgICAgICAgICAgIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZTogbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLA0KLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZURpcmVjdGl2ZTogdGVtcGxhdGVEaXJlY3RpdmUsDQotICAgICAgICAgICAgICAgIG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmU6IG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmUNCi0gICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOw0KLSAgICAgICAgfSBlbHNlIGlmIChkaXJlY3RpdmUuY29tcGlsZSkgew0KLSAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGxpbmtGbiA9IGRpcmVjdGl2ZS5jb21waWxlKCRjb21waWxlTm9kZSwgdGVtcGxhdGVBdHRycywgY2hpbGRUcmFuc2NsdWRlRm4pOw0KLSAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGxpbmtGbikpIHsNCi0gICAgICAgICAgICAgIGFkZExpbmtGbnMobnVsbCwgbGlua0ZuLCBhdHRyU3RhcnQsIGF0dHJFbmQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGlua0ZuKSB7DQotICAgICAgICAgICAgICBhZGRMaW5rRm5zKGxpbmtGbi5wcmUsIGxpbmtGbi5wb3N0LCBhdHRyU3RhcnQsIGF0dHJFbmQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSBjYXRjaCAoZSkgew0KLSAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUsIHN0YXJ0aW5nVGFnKCRjb21waWxlTm9kZSkpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZGlyZWN0aXZlLnRlcm1pbmFsKSB7DQotICAgICAgICAgIG5vZGVMaW5rRm4udGVybWluYWwgPSB0cnVlOw0KLSAgICAgICAgICB0ZXJtaW5hbFByaW9yaXR5ID0gTWF0aC5tYXgodGVybWluYWxQcmlvcml0eSwgZGlyZWN0aXZlLnByaW9yaXR5KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICB9DQotDQotICAgICAgbm9kZUxpbmtGbi5zY29wZSA9IG5ld1Njb3BlRGlyZWN0aXZlICYmIG5ld1Njb3BlRGlyZWN0aXZlLnNjb3BlID09PSB0cnVlOw0KLSAgICAgIG5vZGVMaW5rRm4udHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQgPSBoYXNUcmFuc2NsdWRlRGlyZWN0aXZlOw0KLSAgICAgIG5vZGVMaW5rRm4uZWxlbWVudFRyYW5zY2x1ZGVPblRoaXNFbGVtZW50ID0gaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmU7DQotICAgICAgbm9kZUxpbmtGbi50ZW1wbGF0ZU9uVGhpc0VsZW1lbnQgPSBoYXNUZW1wbGF0ZTsNCi0gICAgICBub2RlTGlua0ZuLnRyYW5zY2x1ZGUgPSBjaGlsZFRyYW5zY2x1ZGVGbjsNCi0NCi0gICAgICBwcmV2aW91c0NvbXBpbGVDb250ZXh0Lmhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlID0gaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmU7DQotDQotICAgICAgLy8gbWlnaHQgYmUgbm9ybWFsIG9yIGRlbGF5ZWQgbm9kZUxpbmtGbiBkZXBlbmRpbmcgb24gaWYgdGVtcGxhdGVVcmwgaXMgcHJlc2VudA0KLSAgICAgIHJldHVybiBub2RlTGlua0ZuOw0KLQ0KLSAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vDQotDQotICAgICAgZnVuY3Rpb24gYWRkTGlua0ZucyhwcmUsIHBvc3QsIGF0dHJTdGFydCwgYXR0ckVuZCkgew0KLSAgICAgICAgaWYgKHByZSkgew0KLSAgICAgICAgICBpZiAoYXR0clN0YXJ0KSBwcmUgPSBncm91cEVsZW1lbnRzTGlua0ZuV3JhcHBlcihwcmUsIGF0dHJTdGFydCwgYXR0ckVuZCk7DQotICAgICAgICAgIHByZS5yZXF1aXJlID0gZGlyZWN0aXZlLnJlcXVpcmU7DQotICAgICAgICAgIHByZS5kaXJlY3RpdmVOYW1lID0gZGlyZWN0aXZlTmFtZTsNCi0gICAgICAgICAgaWYgKG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSA9PT0gZGlyZWN0aXZlIHx8IGRpcmVjdGl2ZS4kJGlzb2xhdGVTY29wZSkgew0KLSAgICAgICAgICAgIHByZSA9IGNsb25lQW5kQW5ub3RhdGVGbihwcmUsIHtpc29sYXRlU2NvcGU6IHRydWV9KTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBwcmVMaW5rRm5zLnB1c2gocHJlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwb3N0KSB7DQotICAgICAgICAgIGlmIChhdHRyU3RhcnQpIHBvc3QgPSBncm91cEVsZW1lbnRzTGlua0ZuV3JhcHBlcihwb3N0LCBhdHRyU3RhcnQsIGF0dHJFbmQpOw0KLSAgICAgICAgICBwb3N0LnJlcXVpcmUgPSBkaXJlY3RpdmUucmVxdWlyZTsNCi0gICAgICAgICAgcG9zdC5kaXJlY3RpdmVOYW1lID0gZGlyZWN0aXZlTmFtZTsNCi0gICAgICAgICAgaWYgKG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSA9PT0gZGlyZWN0aXZlIHx8IGRpcmVjdGl2ZS4kJGlzb2xhdGVTY29wZSkgew0KLSAgICAgICAgICAgIHBvc3QgPSBjbG9uZUFuZEFubm90YXRlRm4ocG9zdCwge2lzb2xhdGVTY29wZTogdHJ1ZX0pOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHBvc3RMaW5rRm5zLnB1c2gocG9zdCk7DQotICAgICAgICB9DQotICAgICAgfQ0KLQ0KLQ0KLSAgICAgIGZ1bmN0aW9uIGdldENvbnRyb2xsZXJzKGRpcmVjdGl2ZU5hbWUsIHJlcXVpcmUsICRlbGVtZW50LCBlbGVtZW50Q29udHJvbGxlcnMpIHsNCi0gICAgICAgIHZhciB2YWx1ZSwgcmV0cmlldmFsTWV0aG9kID0gJ2RhdGEnLCBvcHRpb25hbCA9IGZhbHNlOw0KLSAgICAgICAgdmFyICRzZWFyY2hFbGVtZW50ID0gJGVsZW1lbnQ7DQotICAgICAgICB2YXIgbWF0Y2g7DQotICAgICAgICBpZiAoaXNTdHJpbmcocmVxdWlyZSkpIHsNCi0gICAgICAgICAgbWF0Y2ggPSByZXF1aXJlLm1hdGNoKFJFUVVJUkVfUFJFRklYX1JFR0VYUCk7DQotICAgICAgICAgIHJlcXVpcmUgPSByZXF1aXJlLnN1YnN0cmluZyhtYXRjaFswXS5sZW5ndGgpOw0KLQ0KLSAgICAgICAgICBpZiAobWF0Y2hbM10pIHsNCi0gICAgICAgICAgICBpZiAobWF0Y2hbMV0pIG1hdGNoWzNdID0gbnVsbDsNCi0gICAgICAgICAgICBlbHNlIG1hdGNoWzFdID0gbWF0Y2hbM107DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKG1hdGNoWzFdID09PSAnXicpIHsNCi0gICAgICAgICAgICByZXRyaWV2YWxNZXRob2QgPSAnaW5oZXJpdGVkRGF0YSc7DQotICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbMV0gPT09ICdeXicpIHsNCi0gICAgICAgICAgICByZXRyaWV2YWxNZXRob2QgPSAnaW5oZXJpdGVkRGF0YSc7DQotICAgICAgICAgICAgJHNlYXJjaEVsZW1lbnQgPSAkZWxlbWVudC5wYXJlbnQoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAobWF0Y2hbMl0gPT09ICc/Jykgew0KLSAgICAgICAgICAgIG9wdGlvbmFsID0gdHJ1ZTsNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICB2YWx1ZSA9IG51bGw7DQotDQotICAgICAgICAgIGlmIChlbGVtZW50Q29udHJvbGxlcnMgJiYgcmV0cmlldmFsTWV0aG9kID09PSAnZGF0YScpIHsNCi0gICAgICAgICAgICBpZiAodmFsdWUgPSBlbGVtZW50Q29udHJvbGxlcnNbcmVxdWlyZV0pIHsNCi0gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuaW5zdGFuY2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9DQotICAgICAgICAgIHZhbHVlID0gdmFsdWUgfHwgJHNlYXJjaEVsZW1lbnRbcmV0cmlldmFsTWV0aG9kXSgnJCcgKyByZXF1aXJlICsgJ0NvbnRyb2xsZXInKTsNCi0NCi0gICAgICAgICAgaWYgKCF2YWx1ZSAmJiAhb3B0aW9uYWwpIHsNCi0gICAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignY3RyZXEnLA0KLSAgICAgICAgICAgICAgICAiQ29udHJvbGxlciAnezB9JywgcmVxdWlyZWQgYnkgZGlyZWN0aXZlICd7MX0nLCBjYW4ndCBiZSBmb3VuZCEiLA0KLSAgICAgICAgICAgICAgICByZXF1aXJlLCBkaXJlY3RpdmVOYW1lKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICByZXR1cm4gdmFsdWUgfHwgbnVsbDsNCi0gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShyZXF1aXJlKSkgew0KLSAgICAgICAgICB2YWx1ZSA9IFtdOw0KLSAgICAgICAgICBmb3JFYWNoKHJlcXVpcmUsIGZ1bmN0aW9uKHJlcXVpcmUpIHsNCi0gICAgICAgICAgICB2YWx1ZS5wdXNoKGdldENvbnRyb2xsZXJzKGRpcmVjdGl2ZU5hbWUsIHJlcXVpcmUsICRlbGVtZW50LCBlbGVtZW50Q29udHJvbGxlcnMpKTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgICAgfQ0KLQ0KLQ0KLSAgICAgIGZ1bmN0aW9uIG5vZGVMaW5rRm4oY2hpbGRMaW5rRm4sIHNjb3BlLCBsaW5rTm9kZSwgJHJvb3RFbGVtZW50LCBib3VuZFRyYW5zY2x1ZGVGbikgew0KLSAgICAgICAgdmFyIGksIGlpLCBsaW5rRm4sIGNvbnRyb2xsZXIsIGlzb2xhdGVTY29wZSwgZWxlbWVudENvbnRyb2xsZXJzLCB0cmFuc2NsdWRlRm4sICRlbGVtZW50LA0KLSAgICAgICAgICAgIGF0dHJzOw0KLQ0KLSAgICAgICAgaWYgKGNvbXBpbGVOb2RlID09PSBsaW5rTm9kZSkgew0KLSAgICAgICAgICBhdHRycyA9IHRlbXBsYXRlQXR0cnM7DQotICAgICAgICAgICRlbGVtZW50ID0gdGVtcGxhdGVBdHRycy4kJGVsZW1lbnQ7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAkZWxlbWVudCA9IGpxTGl0ZShsaW5rTm9kZSk7DQotICAgICAgICAgIGF0dHJzID0gbmV3IEF0dHJpYnV0ZXMoJGVsZW1lbnQsIHRlbXBsYXRlQXR0cnMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSkgew0KLSAgICAgICAgICBpc29sYXRlU2NvcGUgPSBzY29wZS4kbmV3KHRydWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJvdW5kVHJhbnNjbHVkZUZuKSB7DQotICAgICAgICAgIC8vIHRyYWNrIGBib3VuZFRyYW5zY2x1ZGVGbmAgc28gaXQgY2FuIGJlIHVud3JhcHBlZCBpZiBgdHJhbnNjbHVkZUZuYA0KLSAgICAgICAgICAvLyBpcyBsYXRlciBwYXNzZWQgYXMgYHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuYCB0byBgcHVibGljTGlua0ZuYA0KLSAgICAgICAgICB0cmFuc2NsdWRlRm4gPSBjb250cm9sbGVyc0JvdW5kVHJhbnNjbHVkZTsNCi0gICAgICAgICAgdHJhbnNjbHVkZUZuLiQkYm91bmRUcmFuc2NsdWRlID0gYm91bmRUcmFuc2NsdWRlRm47DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY29udHJvbGxlckRpcmVjdGl2ZXMpIHsNCi0gICAgICAgICAgLy8gVE9ETzogbWVyZ2UgYGNvbnRyb2xsZXJzYCBhbmQgYGVsZW1lbnRDb250cm9sbGVyc2AgaW50byBzaW5nbGUgb2JqZWN0Lg0KLSAgICAgICAgICBjb250cm9sbGVycyA9IHt9Ow0KLSAgICAgICAgICBlbGVtZW50Q29udHJvbGxlcnMgPSB7fTsNCi0gICAgICAgICAgZm9yRWFjaChjb250cm9sbGVyRGlyZWN0aXZlcywgZnVuY3Rpb24oZGlyZWN0aXZlKSB7DQotICAgICAgICAgICAgdmFyIGxvY2FscyA9IHsNCi0gICAgICAgICAgICAgICRzY29wZTogZGlyZWN0aXZlID09PSBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgfHwgZGlyZWN0aXZlLiQkaXNvbGF0ZVNjb3BlID8gaXNvbGF0ZVNjb3BlIDogc2NvcGUsDQotICAgICAgICAgICAgICAkZWxlbWVudDogJGVsZW1lbnQsDQotICAgICAgICAgICAgICAkYXR0cnM6IGF0dHJzLA0KLSAgICAgICAgICAgICAgJHRyYW5zY2x1ZGU6IHRyYW5zY2x1ZGVGbg0KLSAgICAgICAgICAgIH0sIGNvbnRyb2xsZXJJbnN0YW5jZTsNCi0NCi0gICAgICAgICAgICBjb250cm9sbGVyID0gZGlyZWN0aXZlLmNvbnRyb2xsZXI7DQotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gJ0AnKSB7DQotICAgICAgICAgICAgICBjb250cm9sbGVyID0gYXR0cnNbZGlyZWN0aXZlLm5hbWVdOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjb250cm9sbGVySW5zdGFuY2UgPSAkY29udHJvbGxlcihjb250cm9sbGVyLCBsb2NhbHMsIHRydWUsIGRpcmVjdGl2ZS5jb250cm9sbGVyQXMpOw0KLQ0KLSAgICAgICAgICAgIC8vIEZvciBkaXJlY3RpdmVzIHdpdGggZWxlbWVudCB0cmFuc2NsdXNpb24gdGhlIGVsZW1lbnQgaXMgYSBjb21tZW50LA0KLSAgICAgICAgICAgIC8vIGJ1dCBqUXVlcnkgLmRhdGEgZG9lc24ndCBzdXBwb3J0IGF0dGFjaGluZyBkYXRhIHRvIGNvbW1lbnQgbm9kZXMgYXMgaXQncyBoYXJkIHRvDQotICAgICAgICAgICAgLy8gY2xlYW4gdXAgKGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzgzMzUpLg0KLSAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlIHNhdmUgdGhlIGNvbnRyb2xsZXJzIGZvciB0aGUgZWxlbWVudCBpbiBhIGxvY2FsIGhhc2ggYW5kIGF0dGFjaCB0byAuZGF0YQ0KLSAgICAgICAgICAgIC8vIGxhdGVyLCBvbmNlIHdlIGhhdmUgdGhlIGFjdHVhbCBlbGVtZW50Lg0KLSAgICAgICAgICAgIGVsZW1lbnRDb250cm9sbGVyc1tkaXJlY3RpdmUubmFtZV0gPSBjb250cm9sbGVySW5zdGFuY2U7DQotICAgICAgICAgICAgaWYgKCFoYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSkgew0KLSAgICAgICAgICAgICAgJGVsZW1lbnQuZGF0YSgnJCcgKyBkaXJlY3RpdmUubmFtZSArICdDb250cm9sbGVyJywgY29udHJvbGxlckluc3RhbmNlLmluc3RhbmNlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY29udHJvbGxlcnNbZGlyZWN0aXZlLm5hbWVdID0gY29udHJvbGxlckluc3RhbmNlOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUpIHsNCi0gICAgICAgICAgY29tcGlsZS4kJGFkZFNjb3BlSW5mbygkZWxlbWVudCwgaXNvbGF0ZVNjb3BlLCB0cnVlLCAhKHRlbXBsYXRlRGlyZWN0aXZlICYmICh0ZW1wbGF0ZURpcmVjdGl2ZSA9PT0gbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlIHx8DQotICAgICAgICAgICAgICB0ZW1wbGF0ZURpcmVjdGl2ZSA9PT0gbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLiQkb3JpZ2luYWxEaXJlY3RpdmUpKSk7DQotICAgICAgICAgIGNvbXBpbGUuJCRhZGRTY29wZUNsYXNzKCRlbGVtZW50LCB0cnVlKTsNCi0NCi0gICAgICAgICAgdmFyIGlzb2xhdGVTY29wZUNvbnRyb2xsZXIgPSBjb250cm9sbGVycyAmJiBjb250cm9sbGVyc1tuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUubmFtZV07DQotICAgICAgICAgIHZhciBpc29sYXRlQmluZGluZ0NvbnRleHQgPSBpc29sYXRlU2NvcGU7DQotICAgICAgICAgIGlmIChpc29sYXRlU2NvcGVDb250cm9sbGVyICYmIGlzb2xhdGVTY29wZUNvbnRyb2xsZXIuaWRlbnRpZmllciAmJg0KLSAgICAgICAgICAgICAgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLmJpbmRUb0NvbnRyb2xsZXIgPT09IHRydWUpIHsNCi0gICAgICAgICAgICBpc29sYXRlQmluZGluZ0NvbnRleHQgPSBpc29sYXRlU2NvcGVDb250cm9sbGVyLmluc3RhbmNlOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIGZvckVhY2goaXNvbGF0ZVNjb3BlLiQkaXNvbGF0ZUJpbmRpbmdzID0gbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLiQkaXNvbGF0ZUJpbmRpbmdzLCBmdW5jdGlvbihkZWZpbml0aW9uLCBzY29wZU5hbWUpIHsNCi0gICAgICAgICAgICB2YXIgYXR0ck5hbWUgPSBkZWZpbml0aW9uLmF0dHJOYW1lLA0KLSAgICAgICAgICAgICAgICBvcHRpb25hbCA9IGRlZmluaXRpb24ub3B0aW9uYWwsDQotICAgICAgICAgICAgICAgIG1vZGUgPSBkZWZpbml0aW9uLm1vZGUsIC8vIEAsID0sIG9yICYNCi0gICAgICAgICAgICAgICAgbGFzdFZhbHVlLA0KLSAgICAgICAgICAgICAgICBwYXJlbnRHZXQsIHBhcmVudFNldCwgY29tcGFyZTsNCi0NCi0gICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsNCi0NCi0gICAgICAgICAgICAgIGNhc2UgJ0AnOg0KLSAgICAgICAgICAgICAgICBhdHRycy4kb2JzZXJ2ZShhdHRyTmFtZSwgZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICBpc29sYXRlQmluZGluZ0NvbnRleHRbc2NvcGVOYW1lXSA9IHZhbHVlOw0KLSAgICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICAgICAgYXR0cnMuJCRvYnNlcnZlcnNbYXR0ck5hbWVdLiQkc2NvcGUgPSBzY29wZTsNCi0gICAgICAgICAgICAgICAgaWYgKGF0dHJzW2F0dHJOYW1lXSkgew0KLSAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUgaGFzIGJlZW4gcHJvdmlkZWQgdGhlbiB3ZSB0cmlnZ2VyIGFuIGludGVycG9sYXRpb24gdG8gZW5zdXJlDQotICAgICAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlIGlzIHRoZXJlIGZvciB1c2UgaW4gdGhlIGxpbmsgZm4NCi0gICAgICAgICAgICAgICAgICBpc29sYXRlQmluZGluZ0NvbnRleHRbc2NvcGVOYW1lXSA9ICRpbnRlcnBvbGF0ZShhdHRyc1thdHRyTmFtZV0pKHNjb3BlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICAgIGNhc2UgJz0nOg0KLSAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWwgJiYgIWF0dHJzW2F0dHJOYW1lXSkgew0KLSAgICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwYXJlbnRHZXQgPSAkcGFyc2UoYXR0cnNbYXR0ck5hbWVdKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBhcmVudEdldC5saXRlcmFsKSB7DQotICAgICAgICAgICAgICAgICAgY29tcGFyZSA9IGVxdWFsczsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICBjb21wYXJlID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYSA9PT0gYiB8fCAoYSAhPT0gYSAmJiBiICE9PSBiKTsgfTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwYXJlbnRTZXQgPSBwYXJlbnRHZXQuYXNzaWduIHx8IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBjaGFuZ2UsIG9yIHdlIHdpbGwgdGhyb3cgdGhpcyBleGNlcHRpb24gb24gZXZlcnkgJGRpZ2VzdA0KLSAgICAgICAgICAgICAgICAgIGxhc3RWYWx1ZSA9IGlzb2xhdGVCaW5kaW5nQ29udGV4dFtzY29wZU5hbWVdID0gcGFyZW50R2V0KHNjb3BlKTsNCi0gICAgICAgICAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignbm9uYXNzaWduJywNCi0gICAgICAgICAgICAgICAgICAgICAgIkV4cHJlc3Npb24gJ3swfScgdXNlZCB3aXRoIGRpcmVjdGl2ZSAnezF9JyBpcyBub24tYXNzaWduYWJsZSEiLA0KLSAgICAgICAgICAgICAgICAgICAgICBhdHRyc1thdHRyTmFtZV0sIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZS5uYW1lKTsNCi0gICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgbGFzdFZhbHVlID0gaXNvbGF0ZUJpbmRpbmdDb250ZXh0W3Njb3BlTmFtZV0gPSBwYXJlbnRHZXQoc2NvcGUpOw0KLSAgICAgICAgICAgICAgICB2YXIgcGFyZW50VmFsdWVXYXRjaCA9IGZ1bmN0aW9uIHBhcmVudFZhbHVlV2F0Y2gocGFyZW50VmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICBpZiAoIWNvbXBhcmUocGFyZW50VmFsdWUsIGlzb2xhdGVCaW5kaW5nQ29udGV4dFtzY29wZU5hbWVdKSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIG91dCBvZiBzeW5jIGFuZCBuZWVkIHRvIGNvcHkNCi0gICAgICAgICAgICAgICAgICAgIGlmICghY29tcGFyZShwYXJlbnRWYWx1ZSwgbGFzdFZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgY2hhbmdlZCBhbmQgaXQgaGFzIHByZWNlZGVuY2UNCi0gICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZUJpbmRpbmdDb250ZXh0W3Njb3BlTmFtZV0gPSBwYXJlbnRWYWx1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgY2FuIGJlIGFzc2lnbmVkIHRoZW4gZG8gc28NCi0gICAgICAgICAgICAgICAgICAgICAgcGFyZW50U2V0KHNjb3BlLCBwYXJlbnRWYWx1ZSA9IGlzb2xhdGVCaW5kaW5nQ29udGV4dFtzY29wZU5hbWVdKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RWYWx1ZSA9IHBhcmVudFZhbHVlOw0KLSAgICAgICAgICAgICAgICB9Ow0KLSAgICAgICAgICAgICAgICBwYXJlbnRWYWx1ZVdhdGNoLiRzdGF0ZWZ1bCA9IHRydWU7DQotICAgICAgICAgICAgICAgIHZhciB1bndhdGNoOw0KLSAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbi5jb2xsZWN0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgdW53YXRjaCA9IHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oYXR0cnNbYXR0ck5hbWVdLCBwYXJlbnRWYWx1ZVdhdGNoKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICB1bndhdGNoID0gc2NvcGUuJHdhdGNoKCRwYXJzZShhdHRyc1thdHRyTmFtZV0sIHBhcmVudFZhbHVlV2F0Y2gpLCBudWxsLCBwYXJlbnRHZXQubGl0ZXJhbCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaXNvbGF0ZVNjb3BlLiRvbignJGRlc3Ryb3knLCB1bndhdGNoKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgICBjYXNlICcmJzoNCi0gICAgICAgICAgICAgICAgcGFyZW50R2V0ID0gJHBhcnNlKGF0dHJzW2F0dHJOYW1lXSk7DQotICAgICAgICAgICAgICAgIGlzb2xhdGVCaW5kaW5nQ29udGV4dFtzY29wZU5hbWVdID0gZnVuY3Rpb24obG9jYWxzKSB7DQotICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudEdldChzY29wZSwgbG9jYWxzKTsNCi0gICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChjb250cm9sbGVycykgew0KLSAgICAgICAgICBmb3JFYWNoKGNvbnRyb2xsZXJzLCBmdW5jdGlvbihjb250cm9sbGVyKSB7DQotICAgICAgICAgICAgY29udHJvbGxlcigpOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgICAgY29udHJvbGxlcnMgPSBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gUFJFTElOS0lORw0KLSAgICAgICAgZm9yIChpID0gMCwgaWkgPSBwcmVMaW5rRm5zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsNCi0gICAgICAgICAgbGlua0ZuID0gcHJlTGlua0Zuc1tpXTsNCi0gICAgICAgICAgaW52b2tlTGlua0ZuKGxpbmtGbiwNCi0gICAgICAgICAgICAgIGxpbmtGbi5pc29sYXRlU2NvcGUgPyBpc29sYXRlU2NvcGUgOiBzY29wZSwNCi0gICAgICAgICAgICAgICRlbGVtZW50LA0KLSAgICAgICAgICAgICAgYXR0cnMsDQotICAgICAgICAgICAgICBsaW5rRm4ucmVxdWlyZSAmJiBnZXRDb250cm9sbGVycyhsaW5rRm4uZGlyZWN0aXZlTmFtZSwgbGlua0ZuLnJlcXVpcmUsICRlbGVtZW50LCBlbGVtZW50Q29udHJvbGxlcnMpLA0KLSAgICAgICAgICAgICAgdHJhbnNjbHVkZUZuDQotICAgICAgICAgICk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBSRUNVUlNJT04NCi0gICAgICAgIC8vIFdlIG9ubHkgcGFzcyB0aGUgaXNvbGF0ZSBzY29wZSwgaWYgdGhlIGlzb2xhdGUgZGlyZWN0aXZlIGhhcyBhIHRlbXBsYXRlLA0KLSAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBjaGlsZCBlbGVtZW50cyBkbyBub3QgYmVsb25nIHRvIHRoZSBpc29sYXRlIGRpcmVjdGl2ZS4NCi0gICAgICAgIHZhciBzY29wZVRvQ2hpbGQgPSBzY29wZTsNCi0gICAgICAgIGlmIChuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgJiYgKG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZS50ZW1wbGF0ZSB8fCBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUudGVtcGxhdGVVcmwgPT09IG51bGwpKSB7DQotICAgICAgICAgIHNjb3BlVG9DaGlsZCA9IGlzb2xhdGVTY29wZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNoaWxkTGlua0ZuICYmIGNoaWxkTGlua0ZuKHNjb3BlVG9DaGlsZCwgbGlua05vZGUuY2hpbGROb2RlcywgdW5kZWZpbmVkLCBib3VuZFRyYW5zY2x1ZGVGbik7DQotDQotICAgICAgICAvLyBQT1NUTElOS0lORw0KLSAgICAgICAgZm9yIChpID0gcG9zdExpbmtGbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCi0gICAgICAgICAgbGlua0ZuID0gcG9zdExpbmtGbnNbaV07DQotICAgICAgICAgIGludm9rZUxpbmtGbihsaW5rRm4sDQotICAgICAgICAgICAgICBsaW5rRm4uaXNvbGF0ZVNjb3BlID8gaXNvbGF0ZVNjb3BlIDogc2NvcGUsDQotICAgICAgICAgICAgICAkZWxlbWVudCwNCi0gICAgICAgICAgICAgIGF0dHJzLA0KLSAgICAgICAgICAgICAgbGlua0ZuLnJlcXVpcmUgJiYgZ2V0Q29udHJvbGxlcnMobGlua0ZuLmRpcmVjdGl2ZU5hbWUsIGxpbmtGbi5yZXF1aXJlLCAkZWxlbWVudCwgZWxlbWVudENvbnRyb2xsZXJzKSwNCi0gICAgICAgICAgICAgIHRyYW5zY2x1ZGVGbg0KLSAgICAgICAgICApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBpcyBpbmplY3RlZCBhcyBgJHRyYW5zY2x1ZGVgLg0KLSAgICAgICAgLy8gTm90ZTogYWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwhDQotICAgICAgICBmdW5jdGlvbiBjb250cm9sbGVyc0JvdW5kVHJhbnNjbHVkZShzY29wZSwgY2xvbmVBdHRhY2hGbiwgZnV0dXJlUGFyZW50RWxlbWVudCkgew0KLSAgICAgICAgICB2YXIgdHJhbnNjbHVkZUNvbnRyb2xsZXJzOw0KLQ0KLSAgICAgICAgICAvLyBObyBzY29wZSBwYXNzZWQgaW46DQotICAgICAgICAgIGlmICghaXNTY29wZShzY29wZSkpIHsNCi0gICAgICAgICAgICBmdXR1cmVQYXJlbnRFbGVtZW50ID0gY2xvbmVBdHRhY2hGbjsNCi0gICAgICAgICAgICBjbG9uZUF0dGFjaEZuID0gc2NvcGU7DQotICAgICAgICAgICAgc2NvcGUgPSB1bmRlZmluZWQ7DQotICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgaWYgKGhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlKSB7DQotICAgICAgICAgICAgdHJhbnNjbHVkZUNvbnRyb2xsZXJzID0gZWxlbWVudENvbnRyb2xsZXJzOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmICghZnV0dXJlUGFyZW50RWxlbWVudCkgew0KLSAgICAgICAgICAgIGZ1dHVyZVBhcmVudEVsZW1lbnQgPSBoYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSA/ICRlbGVtZW50LnBhcmVudCgpIDogJGVsZW1lbnQ7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgcmV0dXJuIGJvdW5kVHJhbnNjbHVkZUZuKHNjb3BlLCBjbG9uZUF0dGFjaEZuLCB0cmFuc2NsdWRlQ29udHJvbGxlcnMsIGZ1dHVyZVBhcmVudEVsZW1lbnQsIHNjb3BlVG9DaGlsZCk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIG1hcmtEaXJlY3RpdmVzQXNJc29sYXRlKGRpcmVjdGl2ZXMpIHsNCi0gICAgICAvLyBtYXJrIGFsbCBkaXJlY3RpdmVzIGFzIG5lZWRpbmcgaXNvbGF0ZSBzY29wZS4NCi0gICAgICBmb3IgKHZhciBqID0gMCwgamogPSBkaXJlY3RpdmVzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsNCi0gICAgICAgIGRpcmVjdGl2ZXNbal0gPSBpbmhlcml0KGRpcmVjdGl2ZXNbal0sIHskJGlzb2xhdGVTY29wZTogdHJ1ZX0pOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogbG9va3MgdXAgdGhlIGRpcmVjdGl2ZSBhbmQgZGVjb3JhdGVzIGl0IHdpdGggZXhjZXB0aW9uIGhhbmRsaW5nIGFuZCBwcm9wZXIgcGFyYW1ldGVycy4gV2UNCi0gICAgICogY2FsbCB0aGlzIHRoZSBib3VuZERpcmVjdGl2ZS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlIHRvIGxvb2sgdXAuDQotICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBUaGUgZGlyZWN0aXZlIG11c3QgYmUgZm91bmQgaW4gc3BlY2lmaWMgZm9ybWF0Lg0KLSAgICAgKiAgIFN0cmluZyBjb250YWluaW5nIGFueSBvZiB0aGVzZXMgY2hhcmFjdGVyczoNCi0gICAgICoNCi0gICAgICogICAqIGBFYDogZWxlbWVudCBuYW1lDQotICAgICAqICAgKiBgQSc6IGF0dHJpYnV0ZQ0KLSAgICAgKiAgICogYENgOiBjbGFzcw0KLSAgICAgKiAgICogYE1gOiBjb21tZW50DQotICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGRpcmVjdGl2ZSB3YXMgYWRkZWQuDQotICAgICAqLw0KLSAgICBmdW5jdGlvbiBhZGREaXJlY3RpdmUodERpcmVjdGl2ZXMsIG5hbWUsIGxvY2F0aW9uLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLCBzdGFydEF0dHJOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kQXR0ck5hbWUpIHsNCi0gICAgICBpZiAobmFtZSA9PT0gaWdub3JlRGlyZWN0aXZlKSByZXR1cm4gbnVsbDsNCi0gICAgICB2YXIgbWF0Y2ggPSBudWxsOw0KLSAgICAgIGlmIChoYXNEaXJlY3RpdmVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7DQotICAgICAgICBmb3IgKHZhciBkaXJlY3RpdmUsIGRpcmVjdGl2ZXMgPSAkaW5qZWN0b3IuZ2V0KG5hbWUgKyBTdWZmaXgpLA0KLSAgICAgICAgICAgIGkgPSAwLCBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KLSAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZXNbaV07DQotICAgICAgICAgICAgaWYgKChtYXhQcmlvcml0eSA9PT0gdW5kZWZpbmVkIHx8IG1heFByaW9yaXR5ID4gZGlyZWN0aXZlLnByaW9yaXR5KSAmJg0KLSAgICAgICAgICAgICAgICAgZGlyZWN0aXZlLnJlc3RyaWN0LmluZGV4T2YobG9jYXRpb24pICE9IC0xKSB7DQotICAgICAgICAgICAgICBpZiAoc3RhcnRBdHRyTmFtZSkgew0KLSAgICAgICAgICAgICAgICBkaXJlY3RpdmUgPSBpbmhlcml0KGRpcmVjdGl2ZSwgeyQkc3RhcnQ6IHN0YXJ0QXR0ck5hbWUsICQkZW5kOiBlbmRBdHRyTmFtZX0pOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgdERpcmVjdGl2ZXMucHVzaChkaXJlY3RpdmUpOw0KLSAgICAgICAgICAgICAgbWF0Y2ggPSBkaXJlY3RpdmU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9IGNhdGNoIChlKSB7ICRleGNlcHRpb25IYW5kbGVyKGUpOyB9DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBtYXRjaDsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogbG9va3MgdXAgdGhlIGRpcmVjdGl2ZSBhbmQgcmV0dXJucyB0cnVlIGlmIGl0IGlzIGEgbXVsdGktZWxlbWVudCBkaXJlY3RpdmUsDQotICAgICAqIGFuZCB0aGVyZWZvcmUgcmVxdWlyZXMgRE9NIG5vZGVzIGJldHdlZW4gLXN0YXJ0IGFuZCAtZW5kIG1hcmtlcnMgdG8gYmUgZ3JvdXBlZA0KLSAgICAgKiB0b2dldGhlci4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlIHRvIGxvb2sgdXAuDQotICAgICAqIEByZXR1cm5zIHRydWUgaWYgZGlyZWN0aXZlIHdhcyByZWdpc3RlcmVkIGFzIG11bHRpLWVsZW1lbnQuDQotICAgICAqLw0KLSAgICBmdW5jdGlvbiBkaXJlY3RpdmVJc011bHRpRWxlbWVudChuYW1lKSB7DQotICAgICAgaWYgKGhhc0RpcmVjdGl2ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsNCi0gICAgICAgIGZvciAodmFyIGRpcmVjdGl2ZSwgZGlyZWN0aXZlcyA9ICRpbmplY3Rvci5nZXQobmFtZSArIFN1ZmZpeCksDQotICAgICAgICAgICAgaSA9IDAsIGlpID0gZGlyZWN0aXZlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7DQotICAgICAgICAgIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZXNbaV07DQotICAgICAgICAgIGlmIChkaXJlY3RpdmUubXVsdGlFbGVtZW50KSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBXaGVuIHRoZSBlbGVtZW50IGlzIHJlcGxhY2VkIHdpdGggSFRNTCB0ZW1wbGF0ZSB0aGVuIHRoZSBuZXcgYXR0cmlidXRlcw0KLSAgICAgKiBvbiB0aGUgdGVtcGxhdGUgbmVlZCB0byBiZSBtZXJnZWQgd2l0aCB0aGUgZXhpc3RpbmcgYXR0cmlidXRlcyBpbiB0aGUgRE9NLg0KLSAgICAgKiBUaGUgZGVzaXJlZCBlZmZlY3QgaXMgdG8gaGF2ZSBib3RoIG9mIHRoZSBhdHRyaWJ1dGVzIHByZXNlbnQuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkc3QgZGVzdGluYXRpb24gYXR0cmlidXRlcyAob3JpZ2luYWwgRE9NKQ0KLSAgICAgKiBAcGFyYW0ge29iamVjdH0gc3JjIHNvdXJjZSBhdHRyaWJ1dGVzIChmcm9tIHRoZSBkaXJlY3RpdmUgdGVtcGxhdGUpDQotICAgICAqLw0KLSAgICBmdW5jdGlvbiBtZXJnZVRlbXBsYXRlQXR0cmlidXRlcyhkc3QsIHNyYykgew0KLSAgICAgIHZhciBzcmNBdHRyID0gc3JjLiRhdHRyLA0KLSAgICAgICAgICBkc3RBdHRyID0gZHN0LiRhdHRyLA0KLSAgICAgICAgICAkZWxlbWVudCA9IGRzdC4kJGVsZW1lbnQ7DQotDQotICAgICAgLy8gcmVhcHBseSB0aGUgb2xkIGF0dHJpYnV0ZXMgdG8gdGhlIG5ldyBlbGVtZW50DQotICAgICAgZm9yRWFjaChkc3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsNCi0gICAgICAgIGlmIChrZXkuY2hhckF0KDApICE9ICckJykgew0KLSAgICAgICAgICBpZiAoc3JjW2tleV0gJiYgc3JjW2tleV0gIT09IHZhbHVlKSB7DQotICAgICAgICAgICAgdmFsdWUgKz0gKGtleSA9PT0gJ3N0eWxlJyA/ICc7JyA6ICcgJykgKyBzcmNba2V5XTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBkc3QuJHNldChrZXksIHZhbHVlLCB0cnVlLCBzcmNBdHRyW2tleV0pOw0KLSAgICAgICAgfQ0KLSAgICAgIH0pOw0KLQ0KLSAgICAgIC8vIGNvcHkgdGhlIG5ldyBhdHRyaWJ1dGVzIG9uIHRoZSBvbGQgYXR0cnMgb2JqZWN0DQotICAgICAgZm9yRWFjaChzcmMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsNCi0gICAgICAgIGlmIChrZXkgPT0gJ2NsYXNzJykgew0KLSAgICAgICAgICBzYWZlQWRkQ2xhc3MoJGVsZW1lbnQsIHZhbHVlKTsNCi0gICAgICAgICAgZHN0WydjbGFzcyddID0gKGRzdFsnY2xhc3MnXSA/IGRzdFsnY2xhc3MnXSArICcgJyA6ICcnKSArIHZhbHVlOw0KLSAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gJ3N0eWxlJykgew0KLSAgICAgICAgICAkZWxlbWVudC5hdHRyKCdzdHlsZScsICRlbGVtZW50LmF0dHIoJ3N0eWxlJykgKyAnOycgKyB2YWx1ZSk7DQotICAgICAgICAgIGRzdFsnc3R5bGUnXSA9IChkc3RbJ3N0eWxlJ10gPyBkc3RbJ3N0eWxlJ10gKyAnOycgOiAnJykgKyB2YWx1ZTsNCi0gICAgICAgICAgLy8gYGRzdGAgd2lsbCBuZXZlciBjb250YWluIGhhc093blByb3BlcnR5IGFzIERPTSBwYXJzZXIgd29uJ3QgbGV0IGl0Lg0KLSAgICAgICAgICAvLyBZb3Ugd2lsbCBnZXQgYW4gIkludmFsaWRDaGFyYWN0ZXJFcnJvcjogRE9NIEV4Y2VwdGlvbiA1IiBlcnJvciBpZiB5b3UNCi0gICAgICAgICAgLy8gaGF2ZSBhbiBhdHRyaWJ1dGUgbGlrZSAiaGFzLW93bi1wcm9wZXJ0eSIgb3IgImRhdGEtaGFzLW93bi1wcm9wZXJ0eSIsIGV0Yy4NCi0gICAgICAgIH0gZWxzZSBpZiAoa2V5LmNoYXJBdCgwKSAhPSAnJCcgJiYgIWRzdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7DQotICAgICAgICAgIGRzdFtrZXldID0gdmFsdWU7DQotICAgICAgICAgIGRzdEF0dHJba2V5XSA9IHNyY0F0dHJba2V5XTsNCi0gICAgICAgIH0NCi0gICAgICB9KTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBjb21waWxlVGVtcGxhdGVVcmwoZGlyZWN0aXZlcywgJGNvbXBpbGVOb2RlLCB0QXR0cnMsDQotICAgICAgICAkcm9vdEVsZW1lbnQsIGNoaWxkVHJhbnNjbHVkZUZuLCBwcmVMaW5rRm5zLCBwb3N0TGlua0ZucywgcHJldmlvdXNDb21waWxlQ29udGV4dCkgew0KLSAgICAgIHZhciBsaW5rUXVldWUgPSBbXSwNCi0gICAgICAgICAgYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4sDQotICAgICAgICAgIGFmdGVyVGVtcGxhdGVDaGlsZExpbmtGbiwNCi0gICAgICAgICAgYmVmb3JlVGVtcGxhdGVDb21waWxlTm9kZSA9ICRjb21waWxlTm9kZVswXSwNCi0gICAgICAgICAgb3JpZ0FzeW5jRGlyZWN0aXZlID0gZGlyZWN0aXZlcy5zaGlmdCgpLA0KLSAgICAgICAgICAvLyBUaGUgZmFjdCB0aGF0IHdlIGhhdmUgdG8gY29weSBhbmQgcGF0Y2ggdGhlIGRpcmVjdGl2ZSBzZWVtcyB3cm9uZyENCi0gICAgICAgICAgZGVyaXZlZFN5bmNEaXJlY3RpdmUgPSBleHRlbmQoe30sIG9yaWdBc3luY0RpcmVjdGl2ZSwgew0KLSAgICAgICAgICAgIHRlbXBsYXRlVXJsOiBudWxsLCB0cmFuc2NsdWRlOiBudWxsLCByZXBsYWNlOiBudWxsLCAkJG9yaWdpbmFsRGlyZWN0aXZlOiBvcmlnQXN5bmNEaXJlY3RpdmUNCi0gICAgICAgICAgfSksDQotICAgICAgICAgIHRlbXBsYXRlVXJsID0gKGlzRnVuY3Rpb24ob3JpZ0FzeW5jRGlyZWN0aXZlLnRlbXBsYXRlVXJsKSkNCi0gICAgICAgICAgICAgID8gb3JpZ0FzeW5jRGlyZWN0aXZlLnRlbXBsYXRlVXJsKCRjb21waWxlTm9kZSwgdEF0dHJzKQ0KLSAgICAgICAgICAgICAgOiBvcmlnQXN5bmNEaXJlY3RpdmUudGVtcGxhdGVVcmwsDQotICAgICAgICAgIHRlbXBsYXRlTmFtZXNwYWNlID0gb3JpZ0FzeW5jRGlyZWN0aXZlLnRlbXBsYXRlTmFtZXNwYWNlOw0KLQ0KLSAgICAgICRjb21waWxlTm9kZS5lbXB0eSgpOw0KLQ0KLSAgICAgICR0ZW1wbGF0ZVJlcXVlc3QoJHNjZS5nZXRUcnVzdGVkUmVzb3VyY2VVcmwodGVtcGxhdGVVcmwpKQ0KLSAgICAgICAgLnRoZW4oZnVuY3Rpb24oY29udGVudCkgew0KLSAgICAgICAgICB2YXIgY29tcGlsZU5vZGUsIHRlbXBUZW1wbGF0ZUF0dHJzLCAkdGVtcGxhdGUsIGNoaWxkQm91bmRUcmFuc2NsdWRlRm47DQotDQotICAgICAgICAgIGNvbnRlbnQgPSBkZW5vcm1hbGl6ZVRlbXBsYXRlKGNvbnRlbnQpOw0KLQ0KLSAgICAgICAgICBpZiAob3JpZ0FzeW5jRGlyZWN0aXZlLnJlcGxhY2UpIHsNCi0gICAgICAgICAgICBpZiAoanFMaXRlSXNUZXh0Tm9kZShjb250ZW50KSkgew0KLSAgICAgICAgICAgICAgJHRlbXBsYXRlID0gW107DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICR0ZW1wbGF0ZSA9IHJlbW92ZUNvbW1lbnRzKHdyYXBUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWVzcGFjZSwgdHJpbShjb250ZW50KSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb21waWxlTm9kZSA9ICR0ZW1wbGF0ZVswXTsNCi0NCi0gICAgICAgICAgICBpZiAoJHRlbXBsYXRlLmxlbmd0aCAhPSAxIHx8IGNvbXBpbGVOb2RlLm5vZGVUeXBlICE9PSBOT0RFX1RZUEVfRUxFTUVOVCkgew0KLSAgICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ3RwbHJ0JywNCi0gICAgICAgICAgICAgICAgICAiVGVtcGxhdGUgZm9yIGRpcmVjdGl2ZSAnezB9JyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcm9vdCBlbGVtZW50LiB7MX0iLA0KLSAgICAgICAgICAgICAgICAgIG9yaWdBc3luY0RpcmVjdGl2ZS5uYW1lLCB0ZW1wbGF0ZVVybCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRlbXBUZW1wbGF0ZUF0dHJzID0geyRhdHRyOiB7fX07DQotICAgICAgICAgICAgcmVwbGFjZVdpdGgoJHJvb3RFbGVtZW50LCAkY29tcGlsZU5vZGUsIGNvbXBpbGVOb2RlKTsNCi0gICAgICAgICAgICB2YXIgdGVtcGxhdGVEaXJlY3RpdmVzID0gY29sbGVjdERpcmVjdGl2ZXMoY29tcGlsZU5vZGUsIFtdLCB0ZW1wVGVtcGxhdGVBdHRycyk7DQotDQotICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG9yaWdBc3luY0RpcmVjdGl2ZS5zY29wZSkpIHsNCi0gICAgICAgICAgICAgIG1hcmtEaXJlY3RpdmVzQXNJc29sYXRlKHRlbXBsYXRlRGlyZWN0aXZlcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGRpcmVjdGl2ZXMgPSB0ZW1wbGF0ZURpcmVjdGl2ZXMuY29uY2F0KGRpcmVjdGl2ZXMpOw0KLSAgICAgICAgICAgIG1lcmdlVGVtcGxhdGVBdHRyaWJ1dGVzKHRBdHRycywgdGVtcFRlbXBsYXRlQXR0cnMpOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGNvbXBpbGVOb2RlID0gYmVmb3JlVGVtcGxhdGVDb21waWxlTm9kZTsNCi0gICAgICAgICAgICAkY29tcGlsZU5vZGUuaHRtbChjb250ZW50KTsNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICBkaXJlY3RpdmVzLnVuc2hpZnQoZGVyaXZlZFN5bmNEaXJlY3RpdmUpOw0KLQ0KLSAgICAgICAgICBhZnRlclRlbXBsYXRlTm9kZUxpbmtGbiA9IGFwcGx5RGlyZWN0aXZlc1RvTm9kZShkaXJlY3RpdmVzLCBjb21waWxlTm9kZSwgdEF0dHJzLA0KLSAgICAgICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4sICRjb21waWxlTm9kZSwgb3JpZ0FzeW5jRGlyZWN0aXZlLCBwcmVMaW5rRm5zLCBwb3N0TGlua0ZucywNCi0gICAgICAgICAgICAgIHByZXZpb3VzQ29tcGlsZUNvbnRleHQpOw0KLSAgICAgICAgICBmb3JFYWNoKCRyb290RWxlbWVudCwgZnVuY3Rpb24obm9kZSwgaSkgew0KLSAgICAgICAgICAgIGlmIChub2RlID09IGNvbXBpbGVOb2RlKSB7DQotICAgICAgICAgICAgICAkcm9vdEVsZW1lbnRbaV0gPSAkY29tcGlsZU5vZGVbMF07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9KTsNCi0gICAgICAgICAgYWZ0ZXJUZW1wbGF0ZUNoaWxkTGlua0ZuID0gY29tcGlsZU5vZGVzKCRjb21waWxlTm9kZVswXS5jaGlsZE5vZGVzLCBjaGlsZFRyYW5zY2x1ZGVGbik7DQotDQotICAgICAgICAgIHdoaWxlIChsaW5rUXVldWUubGVuZ3RoKSB7DQotICAgICAgICAgICAgdmFyIHNjb3BlID0gbGlua1F1ZXVlLnNoaWZ0KCksDQotICAgICAgICAgICAgICAgIGJlZm9yZVRlbXBsYXRlTGlua05vZGUgPSBsaW5rUXVldWUuc2hpZnQoKSwNCi0gICAgICAgICAgICAgICAgbGlua1Jvb3RFbGVtZW50ID0gbGlua1F1ZXVlLnNoaWZ0KCksDQotICAgICAgICAgICAgICAgIGJvdW5kVHJhbnNjbHVkZUZuID0gbGlua1F1ZXVlLnNoaWZ0KCksDQotICAgICAgICAgICAgICAgIGxpbmtOb2RlID0gJGNvbXBpbGVOb2RlWzBdOw0KLQ0KLSAgICAgICAgICAgIGlmIChzY29wZS4kJGRlc3Ryb3llZCkgY29udGludWU7DQotDQotICAgICAgICAgICAgaWYgKGJlZm9yZVRlbXBsYXRlTGlua05vZGUgIT09IGJlZm9yZVRlbXBsYXRlQ29tcGlsZU5vZGUpIHsNCi0gICAgICAgICAgICAgIHZhciBvbGRDbGFzc2VzID0gYmVmb3JlVGVtcGxhdGVMaW5rTm9kZS5jbGFzc05hbWU7DQotDQotICAgICAgICAgICAgICBpZiAoIShwcmV2aW91c0NvbXBpbGVDb250ZXh0Lmhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlICYmDQotICAgICAgICAgICAgICAgICAgb3JpZ0FzeW5jRGlyZWN0aXZlLnJlcGxhY2UpKSB7DQotICAgICAgICAgICAgICAgIC8vIGl0IHdhcyBjbG9uZWQgdGhlcmVmb3JlIHdlIGhhdmUgdG8gY2xvbmUgYXMgd2VsbC4NCi0gICAgICAgICAgICAgICAgbGlua05vZGUgPSBqcUxpdGVDbG9uZShjb21waWxlTm9kZSk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICByZXBsYWNlV2l0aChsaW5rUm9vdEVsZW1lbnQsIGpxTGl0ZShiZWZvcmVUZW1wbGF0ZUxpbmtOb2RlKSwgbGlua05vZGUpOw0KLQ0KLSAgICAgICAgICAgICAgLy8gQ29weSBpbiBDU1MgY2xhc3NlcyBmcm9tIG9yaWdpbmFsIG5vZGUNCi0gICAgICAgICAgICAgIHNhZmVBZGRDbGFzcyhqcUxpdGUobGlua05vZGUpLCBvbGRDbGFzc2VzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50KSB7DQotICAgICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuID0gY3JlYXRlQm91bmRUcmFuc2NsdWRlRm4oc2NvcGUsIGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuLnRyYW5zY2x1ZGUsIGJvdW5kVHJhbnNjbHVkZUZuKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IGJvdW5kVHJhbnNjbHVkZUZuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBhZnRlclRlbXBsYXRlTm9kZUxpbmtGbihhZnRlclRlbXBsYXRlQ2hpbGRMaW5rRm4sIHNjb3BlLCBsaW5rTm9kZSwgJHJvb3RFbGVtZW50LA0KLSAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbik7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgbGlua1F1ZXVlID0gbnVsbDsNCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgIHJldHVybiBmdW5jdGlvbiBkZWxheWVkTm9kZUxpbmtGbihpZ25vcmVDaGlsZExpbmtGbiwgc2NvcGUsIG5vZGUsIHJvb3RFbGVtZW50LCBib3VuZFRyYW5zY2x1ZGVGbikgew0KLSAgICAgICAgdmFyIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4gPSBib3VuZFRyYW5zY2x1ZGVGbjsNCi0gICAgICAgIGlmIChzY29wZS4kJGRlc3Ryb3llZCkgcmV0dXJuOw0KLSAgICAgICAgaWYgKGxpbmtRdWV1ZSkgew0KLSAgICAgICAgICBsaW5rUXVldWUucHVzaChzY29wZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4pOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgaWYgKGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50KSB7DQotICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IGNyZWF0ZUJvdW5kVHJhbnNjbHVkZUZuKHNjb3BlLCBhZnRlclRlbXBsYXRlTm9kZUxpbmtGbi50cmFuc2NsdWRlLCBib3VuZFRyYW5zY2x1ZGVGbik7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4oYWZ0ZXJUZW1wbGF0ZUNoaWxkTGlua0ZuLCBzY29wZSwgbm9kZSwgcm9vdEVsZW1lbnQsIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4pOw0KLSAgICAgICAgfQ0KLSAgICAgIH07DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFNvcnRpbmcgZnVuY3Rpb24gZm9yIGJvdW5kIGRpcmVjdGl2ZXMuDQotICAgICAqLw0KLSAgICBmdW5jdGlvbiBieVByaW9yaXR5KGEsIGIpIHsNCi0gICAgICB2YXIgZGlmZiA9IGIucHJpb3JpdHkgLSBhLnByaW9yaXR5Ow0KLSAgICAgIGlmIChkaWZmICE9PSAwKSByZXR1cm4gZGlmZjsNCi0gICAgICBpZiAoYS5uYW1lICE9PSBiLm5hbWUpIHJldHVybiAoYS5uYW1lIDwgYi5uYW1lKSA/IC0xIDogMTsNCi0gICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7DQotICAgIH0NCi0NCi0NCi0gICAgZnVuY3Rpb24gYXNzZXJ0Tm9EdXBsaWNhdGUod2hhdCwgcHJldmlvdXNEaXJlY3RpdmUsIGRpcmVjdGl2ZSwgZWxlbWVudCkgew0KLSAgICAgIGlmIChwcmV2aW91c0RpcmVjdGl2ZSkgew0KLSAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ211bHRpZGlyJywgJ011bHRpcGxlIGRpcmVjdGl2ZXMgW3swfSwgezF9XSBhc2tpbmcgZm9yIHsyfSBvbjogezN9JywNCi0gICAgICAgICAgICBwcmV2aW91c0RpcmVjdGl2ZS5uYW1lLCBkaXJlY3RpdmUubmFtZSwgd2hhdCwgc3RhcnRpbmdUYWcoZWxlbWVudCkpOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBhZGRUZXh0SW50ZXJwb2xhdGVEaXJlY3RpdmUoZGlyZWN0aXZlcywgdGV4dCkgew0KLSAgICAgIHZhciBpbnRlcnBvbGF0ZUZuID0gJGludGVycG9sYXRlKHRleHQsIHRydWUpOw0KLSAgICAgIGlmIChpbnRlcnBvbGF0ZUZuKSB7DQotICAgICAgICBkaXJlY3RpdmVzLnB1c2goew0KLSAgICAgICAgICBwcmlvcml0eTogMCwNCi0gICAgICAgICAgY29tcGlsZTogZnVuY3Rpb24gdGV4dEludGVycG9sYXRlQ29tcGlsZUZuKHRlbXBsYXRlTm9kZSkgew0KLSAgICAgICAgICAgIHZhciB0ZW1wbGF0ZU5vZGVQYXJlbnQgPSB0ZW1wbGF0ZU5vZGUucGFyZW50KCksDQotICAgICAgICAgICAgICAgIGhhc0NvbXBpbGVQYXJlbnQgPSAhIXRlbXBsYXRlTm9kZVBhcmVudC5sZW5ndGg7DQotDQotICAgICAgICAgICAgLy8gV2hlbiB0cmFuc2NsdWRpbmcgYSB0ZW1wbGF0ZSB0aGF0IGhhcyBiaW5kaW5ncyBpbiB0aGUgcm9vdA0KLSAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgYSBwYXJlbnQgYW5kIHRodXMgbmVlZCB0byBhZGQgdGhlIGNsYXNzIGR1cmluZyBsaW5raW5nIGZuLg0KLSAgICAgICAgICAgIGlmIChoYXNDb21waWxlUGFyZW50KSBjb21waWxlLiQkYWRkQmluZGluZ0NsYXNzKHRlbXBsYXRlTm9kZVBhcmVudCk7DQotDQotICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZUxpbmtGbihzY29wZSwgbm9kZSkgew0KLSAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50KCk7DQotICAgICAgICAgICAgICBpZiAoIWhhc0NvbXBpbGVQYXJlbnQpIGNvbXBpbGUuJCRhZGRCaW5kaW5nQ2xhc3MocGFyZW50KTsNCi0gICAgICAgICAgICAgIGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyhwYXJlbnQsIGludGVycG9sYXRlRm4uZXhwcmVzc2lvbnMpOw0KLSAgICAgICAgICAgICAgc2NvcGUuJHdhdGNoKGludGVycG9sYXRlRm4sIGZ1bmN0aW9uIGludGVycG9sYXRlRm5XYXRjaEFjdGlvbih2YWx1ZSkgew0KLSAgICAgICAgICAgICAgICBub2RlWzBdLm5vZGVWYWx1ZSA9IHZhbHVlOw0KLSAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgfTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIGZ1bmN0aW9uIHdyYXBUZW1wbGF0ZSh0eXBlLCB0ZW1wbGF0ZSkgew0KLSAgICAgIHR5cGUgPSBsb3dlcmNhc2UodHlwZSB8fCAnaHRtbCcpOw0KLSAgICAgIHN3aXRjaCAodHlwZSkgew0KLSAgICAgIGNhc2UgJ3N2Zyc6DQotICAgICAgY2FzZSAnbWF0aCc6DQotICAgICAgICB2YXIgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KLSAgICAgICAgd3JhcHBlci5pbm5lckhUTUwgPSAnPCcgKyB0eXBlICsgJz4nICsgdGVtcGxhdGUgKyAnPC8nICsgdHlwZSArICc+JzsNCi0gICAgICAgIHJldHVybiB3cmFwcGVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2RlczsNCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgcmV0dXJuIHRlbXBsYXRlOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBnZXRUcnVzdGVkQ29udGV4dChub2RlLCBhdHRyTm9ybWFsaXplZE5hbWUpIHsNCi0gICAgICBpZiAoYXR0ck5vcm1hbGl6ZWROYW1lID09ICJzcmNkb2MiKSB7DQotICAgICAgICByZXR1cm4gJHNjZS5IVE1MOw0KLSAgICAgIH0NCi0gICAgICB2YXIgdGFnID0gbm9kZU5hbWVfKG5vZGUpOw0KLSAgICAgIC8vIG1hY3Rpb25beGxpbms6aHJlZl0gY2FuIHNvdXJjZSBTVkcuICBJdCdzIG5vdCBsaW1pdGVkIHRvIDxtYWN0aW9uPi4NCi0gICAgICBpZiAoYXR0ck5vcm1hbGl6ZWROYW1lID09ICJ4bGlua0hyZWYiIHx8DQotICAgICAgICAgICh0YWcgPT0gImZvcm0iICYmIGF0dHJOb3JtYWxpemVkTmFtZSA9PSAiYWN0aW9uIikgfHwNCi0gICAgICAgICAgKHRhZyAhPSAiaW1nIiAmJiAoYXR0ck5vcm1hbGl6ZWROYW1lID09ICJzcmMiIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOb3JtYWxpemVkTmFtZSA9PSAibmdTcmMiKSkpIHsNCi0gICAgICAgIHJldHVybiAkc2NlLlJFU09VUkNFX1VSTDsNCi0gICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgZnVuY3Rpb24gYWRkQXR0ckludGVycG9sYXRlRGlyZWN0aXZlKG5vZGUsIGRpcmVjdGl2ZXMsIHZhbHVlLCBuYW1lLCBhbGxPck5vdGhpbmcpIHsNCi0gICAgICB2YXIgdHJ1c3RlZENvbnRleHQgPSBnZXRUcnVzdGVkQ29udGV4dChub2RlLCBuYW1lKTsNCi0gICAgICBhbGxPck5vdGhpbmcgPSBBTExfT1JfTk9USElOR19BVFRSU1tuYW1lXSB8fCBhbGxPck5vdGhpbmc7DQotDQotICAgICAgdmFyIGludGVycG9sYXRlRm4gPSAkaW50ZXJwb2xhdGUodmFsdWUsIHRydWUsIHRydXN0ZWRDb250ZXh0LCBhbGxPck5vdGhpbmcpOw0KLQ0KLSAgICAgIC8vIG5vIGludGVycG9sYXRpb24gZm91bmQgLT4gaWdub3JlDQotICAgICAgaWYgKCFpbnRlcnBvbGF0ZUZuKSByZXR1cm47DQotDQotDQotICAgICAgaWYgKG5hbWUgPT09ICJtdWx0aXBsZSIgJiYgbm9kZU5hbWVfKG5vZGUpID09PSAic2VsZWN0Iikgew0KLSAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoInNlbG11bHRpIiwNCi0gICAgICAgICAgICAiQmluZGluZyB0byB0aGUgJ211bHRpcGxlJyBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZC4gRWxlbWVudDogezB9IiwNCi0gICAgICAgICAgICBzdGFydGluZ1RhZyhub2RlKSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIGRpcmVjdGl2ZXMucHVzaCh7DQotICAgICAgICBwcmlvcml0eTogMTAwLA0KLSAgICAgICAgY29tcGlsZTogZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgcmV0dXJuIHsNCi0gICAgICAgICAgICAgIHByZTogZnVuY3Rpb24gYXR0ckludGVycG9sYXRlUHJlTGlua0ZuKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7DQotICAgICAgICAgICAgICAgIHZhciAkJG9ic2VydmVycyA9IChhdHRyLiQkb2JzZXJ2ZXJzIHx8IChhdHRyLiQkb2JzZXJ2ZXJzID0ge30pKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKEVWRU5UX0hBTkRMRVJfQVRUUl9SRUdFWFAudGVzdChuYW1lKSkgew0KLSAgICAgICAgICAgICAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCdub2RvbWV2ZW50cycsDQotICAgICAgICAgICAgICAgICAgICAgICJJbnRlcnBvbGF0aW9ucyBmb3IgSFRNTCBET00gZXZlbnQgYXR0cmlidXRlcyBhcmUgZGlzYWxsb3dlZC4gIFBsZWFzZSB1c2UgdGhlICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm5nLSB2ZXJzaW9ucyAoc3VjaCBhcyBuZy1jbGljayBpbnN0ZWFkIG9mIG9uY2xpY2spIGluc3RlYWQuIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0ICRpbnRlcnBvbGF0ZSgpZWQNCi0gICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gYXR0cltuYW1lXTsNCi0gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSB2YWx1ZSkgew0KLSAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gaW50ZXJwb2xhdGUgYWdhaW4gc2luY2UgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgYmVlbiB1cGRhdGVkDQotICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gYnkgYW5vdGhlciBkaXJlY3RpdmUncyBjb21waWxlIGZ1bmN0aW9uKQ0KLSAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB1bnNldC9lbXB0eSB2YWx1ZXMgbWFrZSBpbnRlcnBvbGF0ZUZuIGZhbHN5DQotICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGVGbiA9IG5ld1ZhbHVlICYmICRpbnRlcnBvbGF0ZShuZXdWYWx1ZSwgdHJ1ZSwgdHJ1c3RlZENvbnRleHQsIGFsbE9yTm90aGluZyk7DQotICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvLyBpZiBhdHRyaWJ1dGUgd2FzIHVwZGF0ZWQgc28gdGhhdCB0aGVyZSBpcyBubyBpbnRlcnBvbGF0aW9uIGdvaW5nIG9uIHdlIGRvbid0IHdhbnQgdG8NCi0gICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgYW55IG9ic2VydmVycw0KLSAgICAgICAgICAgICAgICBpZiAoIWludGVycG9sYXRlRm4pIHJldHVybjsNCi0NCi0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBhdHRyIG9iamVjdCBzbyB0aGF0IGl0J3MgcmVhZHkgaW4gY2FzZSB3ZSBuZWVkIHRoZSB2YWx1ZSBmb3IgaXNvbGF0ZQ0KLSAgICAgICAgICAgICAgICAvLyBzY29wZSBpbml0aWFsaXphdGlvbiwgb3RoZXJ3aXNlIHRoZSB2YWx1ZSB3b3VsZCBub3QgYmUgYXZhaWxhYmxlIGZyb20gaXNvbGF0ZQ0KLSAgICAgICAgICAgICAgICAvLyBkaXJlY3RpdmUncyBsaW5raW5nIGZuIGR1cmluZyBsaW5raW5nIHBoYXNlDQotICAgICAgICAgICAgICAgIGF0dHJbbmFtZV0gPSBpbnRlcnBvbGF0ZUZuKHNjb3BlKTsNCi0NCi0gICAgICAgICAgICAgICAgKCQkb2JzZXJ2ZXJzW25hbWVdIHx8ICgkJG9ic2VydmVyc1tuYW1lXSA9IFtdKSkuJCRpbnRlciA9IHRydWU7DQotICAgICAgICAgICAgICAgIChhdHRyLiQkb2JzZXJ2ZXJzICYmIGF0dHIuJCRvYnNlcnZlcnNbbmFtZV0uJCRzY29wZSB8fCBzY29wZSkuDQotICAgICAgICAgICAgICAgICAgJHdhdGNoKGludGVycG9sYXRlRm4sIGZ1bmN0aW9uIGludGVycG9sYXRlRm5XYXRjaEFjdGlvbihuZXdWYWx1ZSwgb2xkVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vc3BlY2lhbCBjYXNlIGZvciBjbGFzcyBhdHRyaWJ1dGUgYWRkaXRpb24gKyByZW1vdmFsDQotICAgICAgICAgICAgICAgICAgICAvL3NvIHRoYXQgY2xhc3MgY2hhbmdlcyBjYW4gdGFwIGludG8gdGhlIGFuaW1hdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgLy9ob29rcyBwcm92aWRlZCBieSB0aGUgJGFuaW1hdGUgc2VydmljZS4gQmUgc3VyZSB0bw0KLSAgICAgICAgICAgICAgICAgICAgLy9za2lwIGFuaW1hdGlvbnMgd2hlbiB0aGUgZmlyc3QgZGlnZXN0IG9jY3VycyAod2hlbg0KLSAgICAgICAgICAgICAgICAgICAgLy9ib3RoIHRoZSBuZXcgYW5kIHRoZSBvbGQgdmFsdWVzIGFyZSB0aGUgc2FtZSkgc2luY2UNCi0gICAgICAgICAgICAgICAgICAgIC8vdGhlIENTUyBjbGFzc2VzIGFyZSB0aGUgbm9uLWludGVycG9sYXRlZCB2YWx1ZXMNCi0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAnY2xhc3MnICYmIG5ld1ZhbHVlICE9IG9sZFZhbHVlKSB7DQotICAgICAgICAgICAgICAgICAgICAgIGF0dHIuJHVwZGF0ZUNsYXNzKG5ld1ZhbHVlLCBvbGRWYWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICBhdHRyLiRzZXQobmFtZSwgbmV3VmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH07DQotICAgICAgICAgIH0NCi0gICAgICB9KTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGhpcyBpcyBhIHNwZWNpYWwganFMaXRlLnJlcGxhY2VXaXRoLCB3aGljaCBjYW4gcmVwbGFjZSBpdGVtcyB3aGljaA0KLSAgICAgKiBoYXZlIG5vIHBhcmVudHMsIHByb3ZpZGVkIHRoYXQgdGhlIGNvbnRhaW5pbmcganFMaXRlIGNvbGxlY3Rpb24gaXMgcHJvdmlkZWQuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB7SnFMaXRlPX0gJHJvb3RFbGVtZW50IFRoZSByb290IG9mIHRoZSBjb21waWxlIHRyZWUuIFVzZWQgc28gdGhhdCB3ZSBjYW4gcmVwbGFjZSBub2Rlcw0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcm9vdCBvZiB0aGUgdHJlZS4NCi0gICAgICogQHBhcmFtIHtKcUxpdGV9IGVsZW1lbnRzVG9SZW1vdmUgVGhlIGpxTGl0ZSBlbGVtZW50IHdoaWNoIHdlIGFyZSBnb2luZyB0byByZXBsYWNlLiBXZSBrZWVwDQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzaGVsbCwgYnV0IHJlcGxhY2UgaXRzIERPTSBub2RlIHJlZmVyZW5jZS4NCi0gICAgICogQHBhcmFtIHtOb2RlfSBuZXdOb2RlIFRoZSBuZXcgRE9NIG5vZGUuDQotICAgICAqLw0KLSAgICBmdW5jdGlvbiByZXBsYWNlV2l0aCgkcm9vdEVsZW1lbnQsIGVsZW1lbnRzVG9SZW1vdmUsIG5ld05vZGUpIHsNCi0gICAgICB2YXIgZmlyc3RFbGVtZW50VG9SZW1vdmUgPSBlbGVtZW50c1RvUmVtb3ZlWzBdLA0KLSAgICAgICAgICByZW1vdmVDb3VudCA9IGVsZW1lbnRzVG9SZW1vdmUubGVuZ3RoLA0KLSAgICAgICAgICBwYXJlbnQgPSBmaXJzdEVsZW1lbnRUb1JlbW92ZS5wYXJlbnROb2RlLA0KLSAgICAgICAgICBpLCBpaTsNCi0NCi0gICAgICBpZiAoJHJvb3RFbGVtZW50KSB7DQotICAgICAgICBmb3IgKGkgPSAwLCBpaSA9ICRyb290RWxlbWVudC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7DQotICAgICAgICAgIGlmICgkcm9vdEVsZW1lbnRbaV0gPT0gZmlyc3RFbGVtZW50VG9SZW1vdmUpIHsNCi0gICAgICAgICAgICAkcm9vdEVsZW1lbnRbaSsrXSA9IG5ld05vZGU7DQotICAgICAgICAgICAgZm9yICh2YXIgaiA9IGksIGoyID0gaiArIHJlbW92ZUNvdW50IC0gMSwNCi0gICAgICAgICAgICAgICAgICAgICBqaiA9ICRyb290RWxlbWVudC5sZW5ndGg7DQotICAgICAgICAgICAgICAgICBqIDwgamo7IGorKywgajIrKykgew0KLSAgICAgICAgICAgICAgaWYgKGoyIDwgamopIHsNCi0gICAgICAgICAgICAgICAgJHJvb3RFbGVtZW50W2pdID0gJHJvb3RFbGVtZW50W2oyXTsNCi0gICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSAkcm9vdEVsZW1lbnRbal07DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICRyb290RWxlbWVudC5sZW5ndGggLT0gcmVtb3ZlQ291bnQgLSAxOw0KLQ0KLSAgICAgICAgICAgIC8vIElmIHRoZSByZXBsYWNlZCBlbGVtZW50IGlzIGFsc28gdGhlIGpRdWVyeSAuY29udGV4dCB0aGVuIHJlcGxhY2UgaXQNCi0gICAgICAgICAgICAvLyAuY29udGV4dCBpcyBhIGRlcHJlY2F0ZWQgalF1ZXJ5IGFwaSwgc28gd2Ugc2hvdWxkIHNldCBpdCBvbmx5IHdoZW4galF1ZXJ5IHNldCBpdA0KLSAgICAgICAgICAgIC8vIGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jb250ZXh0Lw0KLSAgICAgICAgICAgIGlmICgkcm9vdEVsZW1lbnQuY29udGV4dCA9PT0gZmlyc3RFbGVtZW50VG9SZW1vdmUpIHsNCi0gICAgICAgICAgICAgICRyb290RWxlbWVudC5jb250ZXh0ID0gbmV3Tm9kZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotICAgICAgaWYgKHBhcmVudCkgew0KLSAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBmaXJzdEVsZW1lbnRUb1JlbW92ZSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8vIFRPRE8ocGVyZik6IHdoYXQncyB0aGlzIGRvY3VtZW50IGZyYWdtZW50IGZvcj8gaXMgaXQgbmVlZGVkPyBjYW4gd2UgYXQgbGVhc3QgcmV1c2UgaXQ/DQotICAgICAgdmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOw0KLSAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGZpcnN0RWxlbWVudFRvUmVtb3ZlKTsNCi0NCi0gICAgICAvLyBDb3B5IG92ZXIgdXNlciBkYXRhICh0aGF0IGluY2x1ZGVzIEFuZ3VsYXIncyAkc2NvcGUgZXRjLikuIERvbid0IGNvcHkgcHJpdmF0ZQ0KLSAgICAgIC8vIGRhdGEgaGVyZSBiZWNhdXNlIHRoZXJlJ3Mgbm8gcHVibGljIGludGVyZmFjZSBpbiBqUXVlcnkgdG8gZG8gdGhhdCBhbmQgY29weWluZyBvdmVyDQotICAgICAgLy8gZXZlbnQgbGlzdGVuZXJzICh3aGljaCBpcyB0aGUgbWFpbiB1c2Ugb2YgcHJpdmF0ZSBkYXRhKSB3b3VsZG4ndCB3b3JrIGFueXdheS4NCi0gICAgICBqcUxpdGUobmV3Tm9kZSkuZGF0YShqcUxpdGUoZmlyc3RFbGVtZW50VG9SZW1vdmUpLmRhdGEoKSk7DQotDQotICAgICAgLy8gUmVtb3ZlIGRhdGEgb2YgdGhlIHJlcGxhY2VkIGVsZW1lbnQuIFdlIGNhbm5vdCBqdXN0IGNhbGwgLnJlbW92ZSgpDQotICAgICAgLy8gb24gdGhlIGVsZW1lbnQgaXQgc2luY2UgdGhhdCB3b3VsZCBkZWFsbG9jYXRlIHNjb3BlIHRoYXQgaXMgbmVlZGVkDQotICAgICAgLy8gZm9yIHRoZSBuZXcgbm9kZS4gSW5zdGVhZCwgcmVtb3ZlIHRoZSBkYXRhICJtYW51YWxseSIuDQotICAgICAgaWYgKCFqUXVlcnkpIHsNCi0gICAgICAgIGRlbGV0ZSBqcUxpdGUuY2FjaGVbZmlyc3RFbGVtZW50VG9SZW1vdmVbanFMaXRlLmV4cGFuZG9dXTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLy8galF1ZXJ5IDIueCBkb2Vzbid0IGV4cG9zZSB0aGUgZGF0YSBzdG9yYWdlLiBVc2UgalF1ZXJ5LmNsZWFuRGF0YSB0byBjbGVhbiB1cCBhZnRlcg0KLSAgICAgICAgLy8gdGhlIHJlcGxhY2VkIGVsZW1lbnQuIFRoZSBjbGVhbkRhdGEgdmVyc2lvbiBtb25rZXktcGF0Y2hlZCBieSBBbmd1bGFyIHdvdWxkIGNhdXNlDQotICAgICAgICAvLyB0aGUgc2NvcGUgdG8gYmUgdHJhc2hlZCBhbmQgd2UgZG8gbmVlZCB0aGUgdmVyeSBzYW1lIHNjb3BlIHRvIHdvcmsgd2l0aCB0aGUgbmV3DQotICAgICAgICAvLyBlbGVtZW50LiBIb3dldmVyLCB3ZSBjYW5ub3QganVzdCBjYWNoZSB0aGUgbm9uLXBhdGNoZWQgdmVyc2lvbiBhbmQgdXNlIGl0IGhlcmUgYXMNCi0gICAgICAgIC8vIHRoYXQgd291bGQgYnJlYWsgaWYgYW5vdGhlciBsaWJyYXJ5IHBhdGNoZXMgdGhlIG1ldGhvZCBhZnRlciBBbmd1bGFyIGRvZXMgKG9uZQ0KLSAgICAgICAgLy8gZXhhbXBsZSBpcyBqUXVlcnkgVUkpLiBJbnN0ZWFkLCBzZXQgYSBmbGFnIGluZGljYXRpbmcgc2NvcGUgZGVzdHJveWluZyBzaG91bGQgYmUNCi0gICAgICAgIC8vIHNraXBwZWQgdGhpcyBvbmUgdGltZS4NCi0gICAgICAgIHNraXBEZXN0cm95T25OZXh0SlF1ZXJ5Q2xlYW5EYXRhID0gdHJ1ZTsNCi0gICAgICAgIGpRdWVyeS5jbGVhbkRhdGEoW2ZpcnN0RWxlbWVudFRvUmVtb3ZlXSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIGZvciAodmFyIGsgPSAxLCBrayA9IGVsZW1lbnRzVG9SZW1vdmUubGVuZ3RoOyBrIDwga2s7IGsrKykgew0KLSAgICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50c1RvUmVtb3ZlW2tdOw0KLSAgICAgICAganFMaXRlKGVsZW1lbnQpLnJlbW92ZSgpOyAvLyBtdXN0IGRvIHRoaXMgd2F5IHRvIGNsZWFuIHVwIGV4cGFuZG8NCi0gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpOw0KLSAgICAgICAgZGVsZXRlIGVsZW1lbnRzVG9SZW1vdmVba107DQotICAgICAgfQ0KLQ0KLSAgICAgIGVsZW1lbnRzVG9SZW1vdmVbMF0gPSBuZXdOb2RlOw0KLSAgICAgIGVsZW1lbnRzVG9SZW1vdmUubGVuZ3RoID0gMTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBjbG9uZUFuZEFubm90YXRlRm4oZm4sIGFubm90YXRpb24pIHsNCi0gICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uKCkgeyByZXR1cm4gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfSwgZm4sIGFubm90YXRpb24pOw0KLSAgICB9DQotDQotDQotICAgIGZ1bmN0aW9uIGludm9rZUxpbmtGbihsaW5rRm4sIHNjb3BlLCAkZWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXJzLCB0cmFuc2NsdWRlRm4pIHsNCi0gICAgICB0cnkgew0KLSAgICAgICAgbGlua0ZuKHNjb3BlLCAkZWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXJzLCB0cmFuc2NsdWRlRm4pOw0KLSAgICAgIH0gY2F0Y2ggKGUpIHsNCi0gICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUsIHN0YXJ0aW5nVGFnKCRlbGVtZW50KSk7DQotICAgICAgfQ0KLSAgICB9DQotICB9XTsNCi19DQotDQotdmFyIFBSRUZJWF9SRUdFWFAgPSAvXigoPzp4fGRhdGEpW1w6XC1fXSkvaTsNCi0vKioNCi0gKiBDb252ZXJ0cyBhbGwgYWNjZXB0ZWQgZGlyZWN0aXZlcyBmb3JtYXQgaW50byBwcm9wZXIgZGlyZWN0aXZlIG5hbWUuDQotICogQHBhcmFtIG5hbWUgTmFtZSB0byBub3JtYWxpemUNCi0gKi8NCi1mdW5jdGlvbiBkaXJlY3RpdmVOb3JtYWxpemUobmFtZSkgew0KLSAgcmV0dXJuIGNhbWVsQ2FzZShuYW1lLnJlcGxhY2UoUFJFRklYX1JFR0VYUCwgJycpKTsNCi19DQotDQotLyoqDQotICogQG5nZG9jIHR5cGUNCi0gKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcw0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogQSBzaGFyZWQgb2JqZWN0IGJldHdlZW4gZGlyZWN0aXZlIGNvbXBpbGUgLyBsaW5raW5nIGZ1bmN0aW9ucyB3aGljaCBjb250YWlucyBub3JtYWxpemVkIERPTQ0KLSAqIGVsZW1lbnQgYXR0cmlidXRlcy4gVGhlIHZhbHVlcyByZWZsZWN0IGN1cnJlbnQgYmluZGluZyBzdGF0ZSBge3sgfX1gLiBUaGUgbm9ybWFsaXphdGlvbiBpcw0KLSAqIG5lZWRlZCBzaW5jZSBhbGwgb2YgdGhlc2UgYXJlIHRyZWF0ZWQgYXMgZXF1aXZhbGVudCBpbiBBbmd1bGFyOg0KLSAqDQotICogYGBgDQotICogICAgPHNwYW4gbmc6YmluZD0iYSIgbmctYmluZD0iYSIgZGF0YS1uZy1iaW5kPSJhIiB4LW5nLWJpbmQ9ImEiPg0KLSAqIGBgYA0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBwcm9wZXJ0eQ0KLSAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRhdHRyDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBBIG1hcCBvZiBET00gZWxlbWVudCBhdHRyaWJ1dGUgbmFtZXMgdG8gdGhlIG5vcm1hbGl6ZWQgbmFtZS4gVGhpcyBpcw0KLSAqIG5lZWRlZCB0byBkbyByZXZlcnNlIGxvb2t1cCBmcm9tIG5vcm1hbGl6ZWQgbmFtZSBiYWNrIHRvIGFjdHVhbCBuYW1lLg0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBtZXRob2QNCi0gKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkc2V0DQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFNldCBET00gZWxlbWVudCBhdHRyaWJ1dGUgdmFsdWUuDQotICoNCi0gKg0KLSAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5vcm1hbGl6ZWQgZWxlbWVudCBhdHRyaWJ1dGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gbW9kaWZ5LiBUaGUgbmFtZSBpcw0KLSAqICAgICAgICAgIHJldmVyc2UtdHJhbnNsYXRlZCB1c2luZyB0aGUge0BsaW5rIG5nLiRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRhdHRyICRhdHRyfQ0KLSAqICAgICAgICAgIHByb3BlcnR5IHRvIHRoZSBvcmlnaW5hbCBuYW1lLg0KLSAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byBzZXQgdGhlIGF0dHJpYnV0ZSB0by4gVGhlIHZhbHVlIGNhbiBiZSBhbiBpbnRlcnBvbGF0ZWQgc3RyaW5nLg0KLSAqLw0KLQ0KLQ0KLQ0KLS8qKg0KLSAqIENsb3N1cmUgY29tcGlsZXIgdHlwZSBpbmZvcm1hdGlvbg0KLSAqLw0KLQ0KLWZ1bmN0aW9uIG5vZGVzZXRMaW5raW5nRm4oDQotICAvKiBhbmd1bGFyLlNjb3BlICovIHNjb3BlLA0KLSAgLyogTm9kZUxpc3QgKi8gbm9kZUxpc3QsDQotICAvKiBFbGVtZW50ICovIHJvb3RFbGVtZW50LA0KLSAgLyogZnVuY3Rpb24oRnVuY3Rpb24pICovIGJvdW5kVHJhbnNjbHVkZUZuDQotKSB7fQ0KLQ0KLWZ1bmN0aW9uIGRpcmVjdGl2ZUxpbmtpbmdGbigNCi0gIC8qIG5vZGVzZXRMaW5raW5nRm4gKi8gbm9kZXNldExpbmtpbmdGbiwNCi0gIC8qIGFuZ3VsYXIuU2NvcGUgKi8gc2NvcGUsDQotICAvKiBOb2RlICovIG5vZGUsDQotICAvKiBFbGVtZW50ICovIHJvb3RFbGVtZW50LA0KLSAgLyogZnVuY3Rpb24oRnVuY3Rpb24pICovIGJvdW5kVHJhbnNjbHVkZUZuDQotKSB7fQ0KLQ0KLWZ1bmN0aW9uIHRva2VuRGlmZmVyZW5jZShzdHIxLCBzdHIyKSB7DQotICB2YXIgdmFsdWVzID0gJycsDQotICAgICAgdG9rZW5zMSA9IHN0cjEuc3BsaXQoL1xzKy8pLA0KLSAgICAgIHRva2VuczIgPSBzdHIyLnNwbGl0KC9ccysvKTsNCi0NCi0gIG91dGVyOg0KLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMxLmxlbmd0aDsgaSsrKSB7DQotICAgIHZhciB0b2tlbiA9IHRva2VuczFbaV07DQotICAgIGZvciAodmFyIGogPSAwOyBqIDwgdG9rZW5zMi5sZW5ndGg7IGorKykgew0KLSAgICAgIGlmICh0b2tlbiA9PSB0b2tlbnMyW2pdKSBjb250aW51ZSBvdXRlcjsNCi0gICAgfQ0KLSAgICB2YWx1ZXMgKz0gKHZhbHVlcy5sZW5ndGggPiAwID8gJyAnIDogJycpICsgdG9rZW47DQotICB9DQotICByZXR1cm4gdmFsdWVzOw0KLX0NCi0NCi1mdW5jdGlvbiByZW1vdmVDb21tZW50cyhqcU5vZGVzKSB7DQotICBqcU5vZGVzID0ganFMaXRlKGpxTm9kZXMpOw0KLSAgdmFyIGkgPSBqcU5vZGVzLmxlbmd0aDsNCi0NCi0gIGlmIChpIDw9IDEpIHsNCi0gICAgcmV0dXJuIGpxTm9kZXM7DQotICB9DQotDQotICB3aGlsZSAoaS0tKSB7DQotICAgIHZhciBub2RlID0ganFOb2Rlc1tpXTsNCi0gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5PREVfVFlQRV9DT01NRU5UKSB7DQotICAgICAgc3BsaWNlLmNhbGwoanFOb2RlcywgaSwgMSk7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBqcU5vZGVzOw0KLX0NCi0NCi0vKioNCi0gKiBAbmdkb2MgcHJvdmlkZXINCi0gKiBAbmFtZSAkY29udHJvbGxlclByb3ZpZGVyDQotICogQGRlc2NyaXB0aW9uDQotICogVGhlIHtAbGluayBuZy4kY29udHJvbGxlciAkY29udHJvbGxlciBzZXJ2aWNlfSBpcyB1c2VkIGJ5IEFuZ3VsYXIgdG8gY3JlYXRlIG5ldw0KLSAqIGNvbnRyb2xsZXJzLg0KLSAqDQotICogVGhpcyBwcm92aWRlciBhbGxvd3MgY29udHJvbGxlciByZWdpc3RyYXRpb24gdmlhIHRoZQ0KLSAqIHtAbGluayBuZy4kY29udHJvbGxlclByb3ZpZGVyI3JlZ2lzdGVyIHJlZ2lzdGVyfSBtZXRob2QuDQotICovDQotZnVuY3Rpb24gJENvbnRyb2xsZXJQcm92aWRlcigpIHsNCi0gIHZhciBjb250cm9sbGVycyA9IHt9LA0KLSAgICAgIGdsb2JhbHMgPSBmYWxzZSwNCi0gICAgICBDTlRSTF9SRUcgPSAvXihcUyspKFxzK2FzXHMrKFx3KykpPyQvOw0KLQ0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSAkY29udHJvbGxlclByb3ZpZGVyI3JlZ2lzdGVyDQotICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWUgQ29udHJvbGxlciBuYW1lLCBvciBhbiBvYmplY3QgbWFwIG9mIGNvbnRyb2xsZXJzIHdoZXJlIHRoZSBrZXlzIGFyZQ0KLSAgICogICAgdGhlIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgY29uc3RydWN0b3JzLg0KLSAgICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheX0gY29uc3RydWN0b3IgQ29udHJvbGxlciBjb25zdHJ1Y3RvciBmbiAob3B0aW9uYWxseSBkZWNvcmF0ZWQgd2l0aCBESQ0KLSAgICogICAgYW5ub3RhdGlvbnMgaW4gdGhlIGFycmF5IG5vdGF0aW9uKS4NCi0gICAqLw0KLSAgdGhpcy5yZWdpc3RlciA9IGZ1bmN0aW9uKG5hbWUsIGNvbnN0cnVjdG9yKSB7DQotICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KG5hbWUsICdjb250cm9sbGVyJyk7DQotICAgIGlmIChpc09iamVjdChuYW1lKSkgew0KLSAgICAgIGV4dGVuZChjb250cm9sbGVycywgbmFtZSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgY29udHJvbGxlcnNbbmFtZV0gPSBjb25zdHJ1Y3RvcjsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJGNvbnRyb2xsZXJQcm92aWRlciNhbGxvd0dsb2JhbHMNCi0gICAqIEBkZXNjcmlwdGlvbiBJZiBjYWxsZWQsIGFsbG93cyBgJGNvbnRyb2xsZXJgIHRvIGZpbmQgY29udHJvbGxlciBjb25zdHJ1Y3RvcnMgb24gYHdpbmRvd2ANCi0gICAqLw0KLSAgdGhpcy5hbGxvd0dsb2JhbHMgPSBmdW5jdGlvbigpIHsNCi0gICAgZ2xvYmFscyA9IHRydWU7DQotICB9Ow0KLQ0KLQ0KLSAgdGhpcy4kZ2V0ID0gWyckaW5qZWN0b3InLCAnJHdpbmRvdycsIGZ1bmN0aW9uKCRpbmplY3RvciwgJHdpbmRvdykgew0KLQ0KLSAgICAvKioNCi0gICAgICogQG5nZG9jIHNlcnZpY2UNCi0gICAgICogQG5hbWUgJGNvbnRyb2xsZXINCi0gICAgICogQHJlcXVpcmVzICRpbmplY3Rvcg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gY29uc3RydWN0b3IgSWYgY2FsbGVkIHdpdGggYSBmdW5jdGlvbiB0aGVuIGl0J3MgY29uc2lkZXJlZCB0byBiZSB0aGUNCi0gICAgICogICAgY29udHJvbGxlciBjb25zdHJ1Y3RvciBmdW5jdGlvbi4gT3RoZXJ3aXNlIGl0J3MgY29uc2lkZXJlZCB0byBiZSBhIHN0cmluZyB3aGljaCBpcyB1c2VkDQotICAgICAqICAgIHRvIHJldHJpZXZlIHRoZSBjb250cm9sbGVyIGNvbnN0cnVjdG9yIHVzaW5nIHRoZSBmb2xsb3dpbmcgc3RlcHM6DQotICAgICAqDQotICAgICAqICAgICogY2hlY2sgaWYgYSBjb250cm9sbGVyIHdpdGggZ2l2ZW4gbmFtZSBpcyByZWdpc3RlcmVkIHZpYSBgJGNvbnRyb2xsZXJQcm92aWRlcmANCi0gICAgICogICAgKiBjaGVjayBpZiBldmFsdWF0aW5nIHRoZSBzdHJpbmcgb24gdGhlIGN1cnJlbnQgc2NvcGUgcmV0dXJucyBhIGNvbnN0cnVjdG9yDQotICAgICAqICAgICogaWYgJGNvbnRyb2xsZXJQcm92aWRlciNhbGxvd0dsb2JhbHMsIGNoZWNrIGB3aW5kb3dbY29uc3RydWN0b3JdYCBvbiB0aGUgZ2xvYmFsDQotICAgICAqICAgICAgYHdpbmRvd2Agb2JqZWN0IChub3QgcmVjb21tZW5kZWQpDQotICAgICAqDQotICAgICAqICAgIFRoZSBzdHJpbmcgY2FuIHVzZSB0aGUgYGNvbnRyb2xsZXIgYXMgcHJvcGVydHlgIHN5bnRheCwgd2hlcmUgdGhlIGNvbnRyb2xsZXIgaW5zdGFuY2UgaXMgcHVibGlzaGVkDQotICAgICAqICAgIGFzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgb24gdGhlIGBzY29wZWA7IHRoZSBgc2NvcGVgIG11c3QgYmUgaW5qZWN0ZWQgaW50byBgbG9jYWxzYCBwYXJhbSBmb3IgdGhpcw0KLSAgICAgKiAgICB0byB3b3JrIGNvcnJlY3RseS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHtPYmplY3R9IGxvY2FscyBJbmplY3Rpb24gbG9jYWxzIGZvciBDb250cm9sbGVyLg0KLSAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEluc3RhbmNlIG9mIGdpdmVuIGNvbnRyb2xsZXIuDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBgJGNvbnRyb2xsZXJgIHNlcnZpY2UgaXMgcmVzcG9uc2libGUgZm9yIGluc3RhbnRpYXRpbmcgY29udHJvbGxlcnMuDQotICAgICAqDQotICAgICAqIEl0J3MganVzdCBhIHNpbXBsZSBjYWxsIHRvIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LCBidXQgZXh0cmFjdGVkIGludG8NCi0gICAgICogYSBzZXJ2aWNlLCBzbyB0aGF0IG9uZSBjYW4gb3ZlcnJpZGUgdGhpcyBzZXJ2aWNlIHdpdGggW0JDIHZlcnNpb25dKGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLzE2NDk3ODgpLg0KLSAgICAgKi8NCi0gICAgcmV0dXJuIGZ1bmN0aW9uKGV4cHJlc3Npb24sIGxvY2FscywgbGF0ZXIsIGlkZW50KSB7DQotICAgICAgLy8gUFJJVkFURSBBUEk6DQotICAgICAgLy8gICBwYXJhbSBgbGF0ZXJgIC0tLSBpbmRpY2F0ZXMgdGhhdCB0aGUgY29udHJvbGxlcidzIGNvbnN0cnVjdG9yIGlzIGludm9rZWQgYXQgYSBsYXRlciB0aW1lLg0KLSAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgSWYgdHJ1ZSwgJGNvbnRyb2xsZXIgd2lsbCBhbGxvY2F0ZSB0aGUgb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QNCi0gICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZSBjaGFpbiwgYnV0IHdpbGwgbm90IGludm9rZSB0aGUgY29udHJvbGxlciB1bnRpbCBhIHJldHVybmVkDQotICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayBpcyBpbnZva2VkLg0KLSAgICAgIC8vICAgcGFyYW0gYGlkZW50YCAtLS0gQW4gb3B0aW9uYWwgbGFiZWwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBsYWJlbCBwYXJzZWQgZnJvbSB0aGUgY29udHJvbGxlcg0KLSAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwgaWYgYW55Lg0KLSAgICAgIHZhciBpbnN0YW5jZSwgbWF0Y2gsIGNvbnN0cnVjdG9yLCBpZGVudGlmaWVyOw0KLSAgICAgIGxhdGVyID0gbGF0ZXIgPT09IHRydWU7DQotICAgICAgaWYgKGlkZW50ICYmIGlzU3RyaW5nKGlkZW50KSkgew0KLSAgICAgICAgaWRlbnRpZmllciA9IGlkZW50Ow0KLSAgICAgIH0NCi0NCi0gICAgICBpZiAoaXNTdHJpbmcoZXhwcmVzc2lvbikpIHsNCi0gICAgICAgIG1hdGNoID0gZXhwcmVzc2lvbi5tYXRjaChDTlRSTF9SRUcpLA0KLSAgICAgICAgY29uc3RydWN0b3IgPSBtYXRjaFsxXSwNCi0gICAgICAgIGlkZW50aWZpZXIgPSBpZGVudGlmaWVyIHx8IG1hdGNoWzNdOw0KLSAgICAgICAgZXhwcmVzc2lvbiA9IGNvbnRyb2xsZXJzLmhhc093blByb3BlcnR5KGNvbnN0cnVjdG9yKQ0KLSAgICAgICAgICAgID8gY29udHJvbGxlcnNbY29uc3RydWN0b3JdDQotICAgICAgICAgICAgOiBnZXR0ZXIobG9jYWxzLiRzY29wZSwgY29uc3RydWN0b3IsIHRydWUpIHx8DQotICAgICAgICAgICAgICAgIChnbG9iYWxzID8gZ2V0dGVyKCR3aW5kb3csIGNvbnN0cnVjdG9yLCB0cnVlKSA6IHVuZGVmaW5lZCk7DQotDQotICAgICAgICBhc3NlcnRBcmdGbihleHByZXNzaW9uLCBjb25zdHJ1Y3RvciwgdHJ1ZSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmIChsYXRlcikgew0KLSAgICAgICAgLy8gSW5zdGFudGlhdGUgY29udHJvbGxlciBsYXRlcjoNCi0gICAgICAgIC8vIFRoaXMgbWFjaGluZXJ5IGlzIHVzZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBvYmplY3QgYmVmb3JlIGNhbGxpbmcgdGhlDQotICAgICAgICAvLyBjb250cm9sbGVyJ3MgY29uc3RydWN0b3IgaXRzZWxmLg0KLSAgICAgICAgLy8NCi0gICAgICAgIC8vIFRoaXMgYWxsb3dzIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbnRyb2xsZXIgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBpcw0KLSAgICAgICAgLy8gaW52b2tlZC4gUHJpbWFyaWx5LCB0aGlzIGlzIHVzZWQgZm9yIGlzb2xhdGUgc2NvcGUgYmluZGluZ3MgaW4gJGNvbXBpbGUuDQotICAgICAgICAvLw0KLSAgICAgICAgLy8gVGhpcyBmZWF0dXJlIGlzIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucywgYW5kIGlzIHRodXMgbm90IGRvY3VtZW50ZWQNCi0gICAgICAgIC8vIHB1YmxpY2x5Lg0KLSAgICAgICAgLy8gT2JqZWN0IGNyZWF0aW9uOiBodHRwOi8vanNwZXJmLmNvbS9jcmVhdGUtY29uc3RydWN0b3IvMg0KLSAgICAgICAgdmFyIGNvbnRyb2xsZXJQcm90b3R5cGUgPSAoaXNBcnJheShleHByZXNzaW9uKSA/DQotICAgICAgICAgIGV4cHJlc3Npb25bZXhwcmVzc2lvbi5sZW5ndGggLSAxXSA6IGV4cHJlc3Npb24pLnByb3RvdHlwZTsNCi0gICAgICAgIGluc3RhbmNlID0gT2JqZWN0LmNyZWF0ZShjb250cm9sbGVyUHJvdG90eXBlKTsNCi0NCi0gICAgICAgIGlmIChpZGVudGlmaWVyKSB7DQotICAgICAgICAgIGFkZElkZW50aWZpZXIobG9jYWxzLCBpZGVudGlmaWVyLCBpbnN0YW5jZSwgY29uc3RydWN0b3IgfHwgZXhwcmVzc2lvbi5uYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24oKSB7DQotICAgICAgICAgICRpbmplY3Rvci5pbnZva2UoZXhwcmVzc2lvbiwgaW5zdGFuY2UsIGxvY2FscywgY29uc3RydWN0b3IpOw0KLSAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7DQotICAgICAgICB9LCB7DQotICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSwNCi0gICAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcg0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIGluc3RhbmNlID0gJGluamVjdG9yLmluc3RhbnRpYXRlKGV4cHJlc3Npb24sIGxvY2FscywgY29uc3RydWN0b3IpOw0KLQ0KLSAgICAgIGlmIChpZGVudGlmaWVyKSB7DQotICAgICAgICBhZGRJZGVudGlmaWVyKGxvY2FscywgaWRlbnRpZmllciwgaW5zdGFuY2UsIGNvbnN0cnVjdG9yIHx8IGV4cHJlc3Npb24ubmFtZSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIHJldHVybiBpbnN0YW5jZTsNCi0gICAgfTsNCi0NCi0gICAgZnVuY3Rpb24gYWRkSWRlbnRpZmllcihsb2NhbHMsIGlkZW50aWZpZXIsIGluc3RhbmNlLCBuYW1lKSB7DQotICAgICAgaWYgKCEobG9jYWxzICYmIGlzT2JqZWN0KGxvY2Fscy4kc2NvcGUpKSkgew0KLSAgICAgICAgdGhyb3cgbWluRXJyKCckY29udHJvbGxlcicpKCdub3NjcCcsDQotICAgICAgICAgICJDYW5ub3QgZXhwb3J0IGNvbnRyb2xsZXIgJ3swfScgYXMgJ3sxfSchIE5vICRzY29wZSBvYmplY3QgcHJvdmlkZWQgdmlhIGBsb2NhbHNgLiIsDQotICAgICAgICAgIG5hbWUsIGlkZW50aWZpZXIpOw0KLSAgICAgIH0NCi0NCi0gICAgICBsb2NhbHMuJHNjb3BlW2lkZW50aWZpZXJdID0gaW5zdGFuY2U7DQotICAgIH0NCi0gIH1dOw0KLX0NCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICRkb2N1bWVudA0KLSAqIEByZXF1aXJlcyAkd2luZG93DQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBBIHtAbGluayBhbmd1bGFyLmVsZW1lbnQgalF1ZXJ5IG9yIGpxTGl0ZX0gd3JhcHBlciBmb3IgdGhlIGJyb3dzZXIncyBgd2luZG93LmRvY3VtZW50YCBvYmplY3QuDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgIDxleGFtcGxlIG1vZHVsZT0iZG9jdW1lbnRFeGFtcGxlIj4NCi0gICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgICAgICA8cD4kZG9jdW1lbnQgdGl0bGU6IDxiIG5nLWJpbmQ9InRpdGxlIj48L2I+PC9wPg0KLSAgICAgICAgIDxwPndpbmRvdy5kb2N1bWVudCB0aXRsZTogPGIgbmctYmluZD0id2luZG93VGl0bGUiPjwvYj48L3A+DQotICAgICAgIDwvZGl2Pg0KLSAgICAgPC9maWxlPg0KLSAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4NCi0gICAgICAgYW5ndWxhci5tb2R1bGUoJ2RvY3VtZW50RXhhbXBsZScsIFtdKQ0KLSAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRkb2N1bWVudCcsIGZ1bmN0aW9uKCRzY29wZSwgJGRvY3VtZW50KSB7DQotICAgICAgICAgICAkc2NvcGUudGl0bGUgPSAkZG9jdW1lbnRbMF0udGl0bGU7DQotICAgICAgICAgICAkc2NvcGUud2luZG93VGl0bGUgPSBhbmd1bGFyLmVsZW1lbnQod2luZG93LmRvY3VtZW50KVswXS50aXRsZTsNCi0gICAgICAgICB9XSk7DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLWZ1bmN0aW9uICREb2N1bWVudFByb3ZpZGVyKCkgew0KLSAgdGhpcy4kZ2V0ID0gWyckd2luZG93JywgZnVuY3Rpb24od2luZG93KSB7DQotICAgIHJldHVybiBqcUxpdGUod2luZG93LmRvY3VtZW50KTsNCi0gIH1dOw0KLX0NCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICRleGNlcHRpb25IYW5kbGVyDQotICogQHJlcXVpcmVzIG5nLiRsb2cNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEFueSB1bmNhdWdodCBleGNlcHRpb24gaW4gYW5ndWxhciBleHByZXNzaW9ucyBpcyBkZWxlZ2F0ZWQgdG8gdGhpcyBzZXJ2aWNlLg0KLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBkZWxlZ2F0ZXMgdG8gYCRsb2cuZXJyb3JgIHdoaWNoIGxvZ3MgaXQgaW50bw0KLSAqIHRoZSBicm93c2VyIGNvbnNvbGUuDQotICoNCi0gKiBJbiB1bml0IHRlc3RzLCBpZiBgYW5ndWxhci1tb2Nrcy5qc2AgaXMgbG9hZGVkLCB0aGlzIHNlcnZpY2UgaXMgb3ZlcnJpZGRlbiBieQ0KLSAqIHtAbGluayBuZ01vY2suJGV4Y2VwdGlvbkhhbmRsZXIgbW9jayAkZXhjZXB0aW9uSGFuZGxlcn0gd2hpY2ggYWlkcyBpbiB0ZXN0aW5nLg0KLSAqDQotICogIyMgRXhhbXBsZToNCi0gKg0KLSAqIGBgYGpzDQotICogICBhbmd1bGFyLm1vZHVsZSgnZXhjZXB0aW9uT3ZlcnJpZGUnLCBbXSkuZmFjdG9yeSgnJGV4Y2VwdGlvbkhhbmRsZXInLCBmdW5jdGlvbigpIHsNCi0gKiAgICAgcmV0dXJuIGZ1bmN0aW9uKGV4Y2VwdGlvbiwgY2F1c2UpIHsNCi0gKiAgICAgICBleGNlcHRpb24ubWVzc2FnZSArPSAnIChjYXVzZWQgYnkgIicgKyBjYXVzZSArICciKSc7DQotICogICAgICAgdGhyb3cgZXhjZXB0aW9uOw0KLSAqICAgICB9Ow0KLSAqICAgfSk7DQotICogYGBgDQotICoNCi0gKiBUaGlzIGV4YW1wbGUgd2lsbCBvdmVycmlkZSB0aGUgbm9ybWFsIGFjdGlvbiBvZiBgJGV4Y2VwdGlvbkhhbmRsZXJgLCB0byBtYWtlIGFuZ3VsYXINCi0gKiBleGNlcHRpb25zIGZhaWwgaGFyZCB3aGVuIHRoZXkgaGFwcGVuLCBpbnN0ZWFkIG9mIGp1c3QgbG9nZ2luZyB0byB0aGUgY29uc29sZS4NCi0gKg0KLSAqIDxociAvPg0KLSAqIE5vdGUsIHRoYXQgY29kZSBleGVjdXRlZCBpbiBldmVudC1saXN0ZW5lcnMgKGV2ZW4gdGhvc2UgcmVnaXN0ZXJlZCB1c2luZyBqcUxpdGUncyBgb25gL2BiaW5kYA0KLSAqIG1ldGhvZHMpIGRvZXMgbm90IGRlbGVnYXRlIGV4Y2VwdGlvbnMgdG8gdGhlIHtAbGluayBuZy4kZXhjZXB0aW9uSGFuZGxlciAkZXhjZXB0aW9uSGFuZGxlcn0NCi0gKiAodW5sZXNzIGV4ZWN1dGVkIGR1cmluZyBhIGRpZ2VzdCkuDQotICoNCi0gKiBJZiB5b3Ugd2lzaCwgeW91IGNhbiBtYW51YWxseSBkZWxlZ2F0ZSBleGNlcHRpb25zLCBlLmcuDQotICogYHRyeSB7IC4uLiB9IGNhdGNoKGUpIHsgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7IH1gDQotICoNCi0gKiBAcGFyYW0ge0Vycm9yfSBleGNlcHRpb24gRXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuDQotICogQHBhcmFtIHtzdHJpbmc9fSBjYXVzZSBvcHRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udGV4dCBpbiB3aGljaA0KLSAqICAgICAgIHRoZSBlcnJvciB3YXMgdGhyb3duLg0KLSAqDQotICovDQotZnVuY3Rpb24gJEV4Y2VwdGlvbkhhbmRsZXJQcm92aWRlcigpIHsNCi0gIHRoaXMuJGdldCA9IFsnJGxvZycsIGZ1bmN0aW9uKCRsb2cpIHsNCi0gICAgcmV0dXJuIGZ1bmN0aW9uKGV4Y2VwdGlvbiwgY2F1c2UpIHsNCi0gICAgICAkbG9nLmVycm9yLmFwcGx5KCRsb2csIGFyZ3VtZW50cyk7DQotICAgIH07DQotICB9XTsNCi19DQotDQotdmFyIEFQUExJQ0FUSU9OX0pTT04gPSAnYXBwbGljYXRpb24vanNvbic7DQotdmFyIENPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9KU09OID0geydDb250ZW50LVR5cGUnOiBBUFBMSUNBVElPTl9KU09OICsgJztjaGFyc2V0PXV0Zi04J307DQotdmFyIEpTT05fU1RBUlQgPSAvXlxbfF5ceyg/IVx7KS87DQotdmFyIEpTT05fRU5EUyA9IHsNCi0gICdbJzogL10kLywNCi0gICd7JzogL30kLw0KLX07DQotdmFyIEpTT05fUFJPVEVDVElPTl9QUkVGSVggPSAvXlwpXF1cfScsP1xuLzsNCi0NCi1mdW5jdGlvbiBkZWZhdWx0SHR0cFJlc3BvbnNlVHJhbnNmb3JtKGRhdGEsIGhlYWRlcnMpIHsNCi0gIGlmIChpc1N0cmluZyhkYXRhKSkgew0KLSAgICAvLyBTdHJpcCBqc29uIHZ1bG5lcmFiaWxpdHkgcHJvdGVjdGlvbiBwcmVmaXggYW5kIHRyaW0gd2hpdGVzcGFjZQ0KLSAgICB2YXIgdGVtcERhdGEgPSBkYXRhLnJlcGxhY2UoSlNPTl9QUk9URUNUSU9OX1BSRUZJWCwgJycpLnRyaW0oKTsNCi0NCi0gICAgaWYgKHRlbXBEYXRhKSB7DQotICAgICAgdmFyIGNvbnRlbnRUeXBlID0gaGVhZGVycygnQ29udGVudC1UeXBlJyk7DQotICAgICAgaWYgKChjb250ZW50VHlwZSAmJiAoY29udGVudFR5cGUuaW5kZXhPZihBUFBMSUNBVElPTl9KU09OKSA9PT0gMCkpIHx8IGlzSnNvbkxpa2UodGVtcERhdGEpKSB7DQotICAgICAgICBkYXRhID0gZnJvbUpzb24odGVtcERhdGEpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGRhdGE7DQotfQ0KLQ0KLWZ1bmN0aW9uIGlzSnNvbkxpa2Uoc3RyKSB7DQotICAgIHZhciBqc29uU3RhcnQgPSBzdHIubWF0Y2goSlNPTl9TVEFSVCk7DQotICAgIHJldHVybiBqc29uU3RhcnQgJiYgSlNPTl9FTkRTW2pzb25TdGFydFswXV0udGVzdChzdHIpOw0KLX0NCi0NCi0vKioNCi0gKiBQYXJzZSBoZWFkZXJzIGludG8ga2V5IHZhbHVlIG9iamVjdA0KLSAqDQotICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlcnMgUmF3IGhlYWRlcnMgYXMgYSBzdHJpbmcNCi0gKiBAcmV0dXJucyB7T2JqZWN0fSBQYXJzZWQgaGVhZGVycyBhcyBrZXkgdmFsdWUgb2JqZWN0DQotICovDQotZnVuY3Rpb24gcGFyc2VIZWFkZXJzKGhlYWRlcnMpIHsNCi0gIHZhciBwYXJzZWQgPSBjcmVhdGVNYXAoKSwga2V5LCB2YWwsIGk7DQotDQotICBpZiAoIWhlYWRlcnMpIHJldHVybiBwYXJzZWQ7DQotDQotICBmb3JFYWNoKGhlYWRlcnMuc3BsaXQoJ1xuJyksIGZ1bmN0aW9uKGxpbmUpIHsNCi0gICAgaSA9IGxpbmUuaW5kZXhPZignOicpOw0KLSAgICBrZXkgPSBsb3dlcmNhc2UodHJpbShsaW5lLnN1YnN0cigwLCBpKSkpOw0KLSAgICB2YWwgPSB0cmltKGxpbmUuc3Vic3RyKGkgKyAxKSk7DQotDQotICAgIGlmIChrZXkpIHsNCi0gICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsOw0KLSAgICB9DQotICB9KTsNCi0NCi0gIHJldHVybiBwYXJzZWQ7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBwYXJzZWQgaGVhZGVycy4NCi0gKg0KLSAqIEhlYWRlcnMgYXJlIGxhenkgcGFyc2VkIHdoZW4gZmlyc3QgcmVxdWVzdGVkLg0KLSAqIEBzZWUgcGFyc2VIZWFkZXJzDQotICoNCi0gKiBAcGFyYW0geyhzdHJpbmd8T2JqZWN0KX0gaGVhZGVycyBIZWFkZXJzIHRvIHByb3ZpZGUgYWNjZXNzIHRvLg0KLSAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmc9KX0gUmV0dXJucyBhIGdldHRlciBmdW5jdGlvbiB3aGljaCBpZiBjYWxsZWQgd2l0aDoNCi0gKg0KLSAqICAgLSBpZiBjYWxsZWQgd2l0aCBzaW5nbGUgYW4gYXJndW1lbnQgcmV0dXJucyBhIHNpbmdsZSBoZWFkZXIgdmFsdWUgb3IgbnVsbA0KLSAqICAgLSBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgaGVhZGVycy4NCi0gKi8NCi1mdW5jdGlvbiBoZWFkZXJzR2V0dGVyKGhlYWRlcnMpIHsNCi0gIHZhciBoZWFkZXJzT2JqID0gaXNPYmplY3QoaGVhZGVycykgPyBoZWFkZXJzIDogdW5kZWZpbmVkOw0KLQ0KLSAgcmV0dXJuIGZ1bmN0aW9uKG5hbWUpIHsNCi0gICAgaWYgKCFoZWFkZXJzT2JqKSBoZWFkZXJzT2JqID0gIHBhcnNlSGVhZGVycyhoZWFkZXJzKTsNCi0NCi0gICAgaWYgKG5hbWUpIHsNCi0gICAgICB2YXIgdmFsdWUgPSBoZWFkZXJzT2JqW2xvd2VyY2FzZShuYW1lKV07DQotICAgICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHsNCi0gICAgICAgIHZhbHVlID0gbnVsbDsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHJldHVybiBoZWFkZXJzT2JqOw0KLSAgfTsNCi19DQotDQotDQotLyoqDQotICogQ2hhaW4gYWxsIGdpdmVuIGZ1bmN0aW9ucw0KLSAqDQotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBib3RoIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRyYW5zZm9ybWluZw0KLSAqDQotICogQHBhcmFtIHsqfSBkYXRhIERhdGEgdG8gdHJhbnNmb3JtLg0KLSAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nPSl9IGhlYWRlcnMgSFRUUCBoZWFkZXJzIGdldHRlciBmbi4NCi0gKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlLg0KLSAqIEBwYXJhbSB7KEZ1bmN0aW9ufEFycmF5LjxGdW5jdGlvbj4pfSBmbnMgRnVuY3Rpb24gb3IgYW4gYXJyYXkgb2YgZnVuY3Rpb25zLg0KLSAqIEByZXR1cm5zIHsqfSBUcmFuc2Zvcm1lZCBkYXRhLg0KLSAqLw0KLWZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZGF0YSwgaGVhZGVycywgc3RhdHVzLCBmbnMpIHsNCi0gIGlmIChpc0Z1bmN0aW9uKGZucykpDQotICAgIHJldHVybiBmbnMoZGF0YSwgaGVhZGVycywgc3RhdHVzKTsNCi0NCi0gIGZvckVhY2goZm5zLCBmdW5jdGlvbihmbikgew0KLSAgICBkYXRhID0gZm4oZGF0YSwgaGVhZGVycywgc3RhdHVzKTsNCi0gIH0pOw0KLQ0KLSAgcmV0dXJuIGRhdGE7DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGlzU3VjY2VzcyhzdGF0dXMpIHsNCi0gIHJldHVybiAyMDAgPD0gc3RhdHVzICYmIHN0YXR1cyA8IDMwMDsNCi19DQotDQotDQotLyoqDQotICogQG5nZG9jIHByb3ZpZGVyDQotICogQG5hbWUgJGh0dHBQcm92aWRlcg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFVzZSBgJGh0dHBQcm92aWRlcmAgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSB7QGxpbmsgbmcuJGh0dHAgJGh0dHB9IHNlcnZpY2UuDQotICogKi8NCi1mdW5jdGlvbiAkSHR0cFByb3ZpZGVyKCkgew0KLSAgLyoqDQotICAgKiBAbmdkb2MgcHJvcGVydHkNCi0gICAqIEBuYW1lICRodHRwUHJvdmlkZXIjZGVmYXVsdHMNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICoNCi0gICAqIE9iamVjdCBjb250YWluaW5nIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwge0BsaW5rIG5nLiRodHRwICRodHRwfSByZXF1ZXN0cy4NCi0gICAqDQotICAgKiAtICoqYGRlZmF1bHRzLmNhY2hlYCoqIC0ge09iamVjdH0gLSBhbiBvYmplY3QgYnVpbHQgd2l0aCB7QGxpbmsgbmcuJGNhY2hlRmFjdG9yeSBgJGNhY2hlRmFjdG9yeWB9DQotICAgKiB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgY2FjaGUgZm9yIGFsbCByZXF1ZXN0cyB3aG8gc2V0IHRoZWlyIGBjYWNoZWAgcHJvcGVydHkgdG8gYHRydWVgLg0KLSAgICogSWYgeW91IHNldCB0aGUgYGRlZmF1bHQuY2FjaGUgPSBmYWxzZWAgdGhlbiBvbmx5IHJlcXVlc3RzIHRoYXQgc3BlY2lmeSB0aGVpciBvd24gY3VzdG9tDQotICAgKiBjYWNoZSBvYmplY3Qgd2lsbCBiZSBjYWNoZWQuIFNlZSB7QGxpbmsgJGh0dHAjY2FjaGluZyAkaHR0cCBDYWNoaW5nfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCi0gICAqDQotICAgKiAtICoqYGRlZmF1bHRzLnhzcmZDb29raWVOYW1lYCoqIC0ge3N0cmluZ30gLSBOYW1lIG9mIGNvb2tpZSBjb250YWluaW5nIHRoZSBYU1JGIHRva2VuLg0KLSAgICogRGVmYXVsdHMgdmFsdWUgaXMgYCdYU1JGLVRPS0VOJ2AuDQotICAgKg0KLSAgICogLSAqKmBkZWZhdWx0cy54c3JmSGVhZGVyTmFtZWAqKiAtIHtzdHJpbmd9IC0gTmFtZSBvZiBIVFRQIGhlYWRlciB0byBwb3B1bGF0ZSB3aXRoIHRoZQ0KLSAgICogWFNSRiB0b2tlbi4gRGVmYXVsdHMgdmFsdWUgaXMgYCdYLVhTUkYtVE9LRU4nYC4NCi0gICAqDQotICAgKiAtICoqYGRlZmF1bHRzLmhlYWRlcnNgKiogLSB7T2JqZWN0fSAtIERlZmF1bHQgaGVhZGVycyBmb3IgYWxsICRodHRwIHJlcXVlc3RzLg0KLSAgICogUmVmZXIgdG8ge0BsaW5rIG5nLiRodHRwI3NldHRpbmctaHR0cC1oZWFkZXJzICRodHRwfSBmb3IgZG9jdW1lbnRhdGlvbiBvbg0KLSAgICogc2V0dGluZyBkZWZhdWx0IGhlYWRlcnMuDQotICAgKiAgICAgLSAqKmBkZWZhdWx0cy5oZWFkZXJzLmNvbW1vbmAqKg0KLSAgICogICAgIC0gKipgZGVmYXVsdHMuaGVhZGVycy5wb3N0YCoqDQotICAgKiAgICAgLSAqKmBkZWZhdWx0cy5oZWFkZXJzLnB1dGAqKg0KLSAgICogICAgIC0gKipgZGVmYXVsdHMuaGVhZGVycy5wYXRjaGAqKg0KLSAgICoNCi0gICAqKi8NCi0gIHZhciBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdHMgPSB7DQotICAgIC8vIHRyYW5zZm9ybSBpbmNvbWluZyByZXNwb25zZSBkYXRhDQotICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBbZGVmYXVsdEh0dHBSZXNwb25zZVRyYW5zZm9ybV0sDQotDQotICAgIC8vIHRyYW5zZm9ybSBvdXRnb2luZyByZXF1ZXN0IGRhdGENCi0gICAgdHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uKGQpIHsNCi0gICAgICByZXR1cm4gaXNPYmplY3QoZCkgJiYgIWlzRmlsZShkKSAmJiAhaXNCbG9iKGQpICYmICFpc0Zvcm1EYXRhKGQpID8gdG9Kc29uKGQpIDogZDsNCi0gICAgfV0sDQotDQotICAgIC8vIGRlZmF1bHQgaGVhZGVycw0KLSAgICBoZWFkZXJzOiB7DQotICAgICAgY29tbW9uOiB7DQotICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicNCi0gICAgICB9LA0KLSAgICAgIHBvc3Q6ICAgc2hhbGxvd0NvcHkoQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0pTT04pLA0KLSAgICAgIHB1dDogICAgc2hhbGxvd0NvcHkoQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0pTT04pLA0KLSAgICAgIHBhdGNoOiAgc2hhbGxvd0NvcHkoQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0pTT04pDQotICAgIH0sDQotDQotICAgIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsDQotICAgIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJw0KLSAgfTsNCi0NCi0gIHZhciB1c2VBcHBseUFzeW5jID0gZmFsc2U7DQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lICRodHRwUHJvdmlkZXIjdXNlQXBwbHlBc3luYw0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKg0KLSAgICogQ29uZmlndXJlICRodHRwIHNlcnZpY2UgdG8gY29tYmluZSBwcm9jZXNzaW5nIG9mIG11bHRpcGxlIGh0dHAgcmVzcG9uc2VzIHJlY2VpdmVkIGF0IGFyb3VuZA0KLSAgICogdGhlIHNhbWUgdGltZSB2aWEge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGFwcGx5QXN5bmMgJHJvb3RTY29wZS4kYXBwbHlBc3luY30uIFRoaXMgY2FuIHJlc3VsdCBpbg0KLSAgICogc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZm9yIGJpZ2dlciBhcHBsaWNhdGlvbnMgdGhhdCBtYWtlIG1hbnkgSFRUUCByZXF1ZXN0cw0KLSAgICogY29uY3VycmVudGx5IChjb21tb24gZHVyaW5nIGFwcGxpY2F0aW9uIGJvb3RzdHJhcCkuDQotICAgKg0KLSAgICogRGVmYXVsdHMgdG8gZmFsc2UuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmVkLCByZXR1cm5zIHRoZSBjdXJyZW50IGNvbmZpZ3VyZWQgdmFsdWUuDQotICAgKg0KLSAgICogQHBhcmFtIHtib29sZWFuPX0gdmFsdWUgSWYgdHJ1ZSwgd2hlbiByZXF1ZXN0cyBhcmUgbG9hZGVkLCB0aGV5IHdpbGwgc2NoZWR1bGUgYSBkZWZlcnJlZA0KLSAgICogICAgImFwcGx5IiBvbiB0aGUgbmV4dCB0aWNrLCBnaXZpbmcgdGltZSBmb3Igc3Vic2VxdWVudCByZXF1ZXN0cyBpbiBhIHJvdWdobHkgfjEwbXMgd2luZG93DQotICAgKiAgICB0byBsb2FkIGFuZCBzaGFyZSB0aGUgc2FtZSBkaWdlc3QgY3ljbGUuDQotICAgKg0KLSAgICogQHJldHVybnMge2Jvb2xlYW58T2JqZWN0fSBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJucyB0aGUgJGh0dHBQcm92aWRlciBmb3IgY2hhaW5pbmcuDQotICAgKiAgICBvdGhlcndpc2UsIHJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJlZCB2YWx1ZS4NCi0gICAqKi8NCi0gIHRoaXMudXNlQXBwbHlBc3luYyA9IGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7DQotICAgICAgdXNlQXBwbHlBc3luYyA9ICEhdmFsdWU7DQotICAgICAgcmV0dXJuIHRoaXM7DQotICAgIH0NCi0gICAgcmV0dXJuIHVzZUFwcGx5QXN5bmM7DQotICB9Ow0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgcHJvcGVydHkNCi0gICAqIEBuYW1lICRodHRwUHJvdmlkZXIjaW50ZXJjZXB0b3JzDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqDQotICAgKiBBcnJheSBjb250YWluaW5nIHNlcnZpY2UgZmFjdG9yaWVzIGZvciBhbGwgc3luY2hyb25vdXMgb3IgYXN5bmNocm9ub3VzIHtAbGluayBuZy4kaHR0cCAkaHR0cH0NCi0gICAqIHByZS1wcm9jZXNzaW5nIG9mIHJlcXVlc3Qgb3IgcG9zdHByb2Nlc3Npbmcgb2YgcmVzcG9uc2VzLg0KLSAgICoNCi0gICAqIFRoZXNlIHNlcnZpY2UgZmFjdG9yaWVzIGFyZSBvcmRlcmVkIGJ5IHJlcXVlc3QsIGkuZS4gdGhleSBhcmUgYXBwbGllZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUNCi0gICAqIGFycmF5LCBvbiByZXF1ZXN0LCBidXQgcmV2ZXJzZSBvcmRlciwgb24gcmVzcG9uc2UuDQotICAgKg0KLSAgICoge0BsaW5rIG5nLiRodHRwI2ludGVyY2VwdG9ycyBJbnRlcmNlcHRvcnMgZGV0YWlsZWQgaW5mb30NCi0gICAqKi8NCi0gIHZhciBpbnRlcmNlcHRvckZhY3RvcmllcyA9IHRoaXMuaW50ZXJjZXB0b3JzID0gW107DQotDQotICB0aGlzLiRnZXQgPSBbJyRodHRwQmFja2VuZCcsICckYnJvd3NlcicsICckY2FjaGVGYWN0b3J5JywgJyRyb290U2NvcGUnLCAnJHEnLCAnJGluamVjdG9yJywNCi0gICAgICBmdW5jdGlvbigkaHR0cEJhY2tlbmQsICRicm93c2VyLCAkY2FjaGVGYWN0b3J5LCAkcm9vdFNjb3BlLCAkcSwgJGluamVjdG9yKSB7DQotDQotICAgIHZhciBkZWZhdWx0Q2FjaGUgPSAkY2FjaGVGYWN0b3J5KCckaHR0cCcpOw0KLQ0KLSAgICAvKioNCi0gICAgICogSW50ZXJjZXB0b3JzIHN0b3JlZCBpbiByZXZlcnNlIG9yZGVyLiBJbm5lciBpbnRlcmNlcHRvcnMgYmVmb3JlIG91dGVyIGludGVyY2VwdG9ycy4NCi0gICAgICogVGhlIHJldmVyc2FsIGlzIG5lZWRlZCBzbyB0aGF0IHdlIGNhbiBidWlsZCB1cCB0aGUgaW50ZXJjZXB0aW9uIGNoYWluIGFyb3VuZCB0aGUNCi0gICAgICogc2VydmVyIHJlcXVlc3QuDQotICAgICAqLw0KLSAgICB2YXIgcmV2ZXJzZWRJbnRlcmNlcHRvcnMgPSBbXTsNCi0NCi0gICAgZm9yRWFjaChpbnRlcmNlcHRvckZhY3RvcmllcywgZnVuY3Rpb24oaW50ZXJjZXB0b3JGYWN0b3J5KSB7DQotICAgICAgcmV2ZXJzZWRJbnRlcmNlcHRvcnMudW5zaGlmdChpc1N0cmluZyhpbnRlcmNlcHRvckZhY3RvcnkpDQotICAgICAgICAgID8gJGluamVjdG9yLmdldChpbnRlcmNlcHRvckZhY3RvcnkpIDogJGluamVjdG9yLmludm9rZShpbnRlcmNlcHRvckZhY3RvcnkpKTsNCi0gICAgfSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2Mgc2VydmljZQ0KLSAgICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICAgKiBAbmFtZSAkaHR0cA0KLSAgICAgKiBAcmVxdWlyZXMgbmcuJGh0dHBCYWNrZW5kDQotICAgICAqIEByZXF1aXJlcyAkY2FjaGVGYWN0b3J5DQotICAgICAqIEByZXF1aXJlcyAkcm9vdFNjb3BlDQotICAgICAqIEByZXF1aXJlcyAkcQ0KLSAgICAgKiBAcmVxdWlyZXMgJGluamVjdG9yDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBUaGUgYCRodHRwYCBzZXJ2aWNlIGlzIGEgY29yZSBBbmd1bGFyIHNlcnZpY2UgdGhhdCBmYWNpbGl0YXRlcyBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHJlbW90ZQ0KLSAgICAgKiBIVFRQIHNlcnZlcnMgdmlhIHRoZSBicm93c2VyJ3MgW1hNTEh0dHBSZXF1ZXN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi94bWxodHRwcmVxdWVzdCkNCi0gICAgICogb2JqZWN0IG9yIHZpYSBbSlNPTlBdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSlNPTlApLg0KLSAgICAgKg0KLSAgICAgKiBGb3IgdW5pdCB0ZXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBgJGh0dHBgIHNlcnZpY2UsIHNlZQ0KLSAgICAgKiB7QGxpbmsgbmdNb2NrLiRodHRwQmFja2VuZCAkaHR0cEJhY2tlbmQgbW9ja30uDQotICAgICAqDQotICAgICAqIEZvciBhIGhpZ2hlciBsZXZlbCBvZiBhYnN0cmFjdGlvbiwgcGxlYXNlIGNoZWNrIG91dCB0aGUge0BsaW5rIG5nUmVzb3VyY2UuJHJlc291cmNlDQotICAgICAqICRyZXNvdXJjZX0gc2VydmljZS4NCi0gICAgICoNCi0gICAgICogVGhlICRodHRwIEFQSSBpcyBiYXNlZCBvbiB0aGUge0BsaW5rIG5nLiRxIGRlZmVycmVkL3Byb21pc2UgQVBJc30gZXhwb3NlZCBieQ0KLSAgICAgKiB0aGUgJHEgc2VydmljZS4gV2hpbGUgZm9yIHNpbXBsZSB1c2FnZSBwYXR0ZXJucyB0aGlzIGRvZXNuJ3QgbWF0dGVyIG11Y2gsIGZvciBhZHZhbmNlZCB1c2FnZQ0KLSAgICAgKiBpdCBpcyBpbXBvcnRhbnQgdG8gZmFtaWxpYXJpemUgeW91cnNlbGYgd2l0aCB0aGVzZSBBUElzIGFuZCB0aGUgZ3VhcmFudGVlcyB0aGV5IHByb3ZpZGUuDQotICAgICAqDQotICAgICAqDQotICAgICAqICMjIEdlbmVyYWwgdXNhZ2UNCi0gICAgICogVGhlIGAkaHR0cGAgc2VydmljZSBpcyBhIGZ1bmN0aW9uIHdoaWNoIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IOKAPyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IOKAPw0KLSAgICAgKiB0aGF0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgYW4gSFRUUCByZXF1ZXN0IGFuZCByZXR1cm5zICBhIHtAbGluayBuZy4kcSBwcm9taXNlfQ0KLSAgICAgKiB3aXRoIHR3byAkaHR0cCBzcGVjaWZpYyBtZXRob2RzOiBgc3VjY2Vzc2AgYW5kIGBlcnJvcmAuDQotICAgICAqDQotICAgICAqIGBgYGpzDQotICAgICAqICAgLy8gU2ltcGxlIEdFVCByZXF1ZXN0IGV4YW1wbGUgOg0KLSAgICAgKiAgICRodHRwLmdldCgnL3NvbWVVcmwnKS4NCi0gICAgICogICAgIHN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHsNCi0gICAgICogICAgICAgLy8gdGhpcyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBhc3luY2hyb25vdXNseQ0KLSAgICAgKiAgICAgICAvLyB3aGVuIHRoZSByZXNwb25zZSBpcyBhdmFpbGFibGUNCi0gICAgICogICAgIH0pLg0KLSAgICAgKiAgICAgZXJyb3IoZnVuY3Rpb24oZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHsNCi0gICAgICogICAgICAgLy8gY2FsbGVkIGFzeW5jaHJvbm91c2x5IGlmIGFuIGVycm9yIG9jY3Vycw0KLSAgICAgKiAgICAgICAvLyBvciBzZXJ2ZXIgcmV0dXJucyByZXNwb25zZSB3aXRoIGFuIGVycm9yIHN0YXR1cy4NCi0gICAgICogICAgIH0pOw0KLSAgICAgKiBgYGANCi0gICAgICoNCi0gICAgICogYGBganMNCi0gICAgICogICAvLyBTaW1wbGUgUE9TVCByZXF1ZXN0IGV4YW1wbGUgKHBhc3NpbmcgZGF0YSkgOg0KLSAgICAgKiAgICRodHRwLnBvc3QoJy9zb21lVXJsJywge21zZzonaGVsbG8gd29yZCEnfSkuDQotICAgICAqICAgICBzdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7DQotICAgICAqICAgICAgIC8vIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkNCi0gICAgICogICAgICAgLy8gd2hlbiB0aGUgcmVzcG9uc2UgaXMgYXZhaWxhYmxlDQotICAgICAqICAgICB9KS4NCi0gICAgICogICAgIGVycm9yKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7DQotICAgICAqICAgICAgIC8vIGNhbGxlZCBhc3luY2hyb25vdXNseSBpZiBhbiBlcnJvciBvY2N1cnMNCi0gICAgICogICAgICAgLy8gb3Igc2VydmVyIHJldHVybnMgcmVzcG9uc2Ugd2l0aCBhbiBlcnJvciBzdGF0dXMuDQotICAgICAqICAgICB9KTsNCi0gICAgICogYGBgDQotICAgICAqDQotICAgICAqDQotICAgICAqIFNpbmNlIHRoZSByZXR1cm5lZCB2YWx1ZSBvZiBjYWxsaW5nIHRoZSAkaHR0cCBmdW5jdGlvbiBpcyBhIGBwcm9taXNlYCwgeW91IGNhbiBhbHNvIHVzZQ0KLSAgICAgKiB0aGUgYHRoZW5gIG1ldGhvZCB0byByZWdpc3RlciBjYWxsYmFja3MsIGFuZCB0aGVzZSBjYWxsYmFja3Mgd2lsbCByZWNlaXZlIGEgc2luZ2xlIGFyZ3VtZW50IOKAPw0KLSAgICAgKiBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZS4gU2VlIHRoZSBBUEkgc2lnbmF0dXJlIGFuZCB0eXBlIGluZm8gYmVsb3cgZm9yIG1vcmUNCi0gICAgICogZGV0YWlscy4NCi0gICAgICoNCi0gICAgICogQSByZXNwb25zZSBzdGF0dXMgY29kZSBiZXR3ZWVuIDIwMCBhbmQgMjk5IGlzIGNvbnNpZGVyZWQgYSBzdWNjZXNzIHN0YXR1cyBhbmQNCi0gICAgICogd2lsbCByZXN1bHQgaW4gdGhlIHN1Y2Nlc3MgY2FsbGJhY2sgYmVpbmcgY2FsbGVkLiBOb3RlIHRoYXQgaWYgdGhlIHJlc3BvbnNlIGlzIGEgcmVkaXJlY3QsDQotICAgICAqIFhNTEh0dHBSZXF1ZXN0IHdpbGwgdHJhbnNwYXJlbnRseSBmb2xsb3cgaXQsIG1lYW5pbmcgdGhhdCB0aGUgZXJyb3IgY2FsbGJhY2sgd2lsbCBub3QgYmUNCi0gICAgICogY2FsbGVkIGZvciBzdWNoIHJlc3BvbnNlcy4NCi0gICAgICoNCi0gICAgICogIyMgV3JpdGluZyBVbml0IFRlc3RzIHRoYXQgdXNlICRodHRwDQotICAgICAqIFdoZW4gdW5pdCB0ZXN0aW5nICh1c2luZyB7QGxpbmsgbmdNb2NrIG5nTW9ja30pLCBpdCBpcyBuZWNlc3NhcnkgdG8gY2FsbA0KLSAgICAgKiB7QGxpbmsgbmdNb2NrLiRodHRwQmFja2VuZCNmbHVzaCAkaHR0cEJhY2tlbmQuZmx1c2goKX0gdG8gZmx1c2ggZWFjaCBwZW5kaW5nDQotICAgICAqIHJlcXVlc3QgdXNpbmcgdHJhaW5lZCByZXNwb25zZXMuDQotICAgICAqDQotICAgICAqIGBgYA0KLSAgICAgKiAkaHR0cEJhY2tlbmQuZXhwZWN0R0VUKC4uLik7DQotICAgICAqICRodHRwLmdldCguLi4pOw0KLSAgICAgKiAkaHR0cEJhY2tlbmQuZmx1c2goKTsNCi0gICAgICogYGBgDQotICAgICAqDQotICAgICAqICMjIFNob3J0Y3V0IG1ldGhvZHMNCi0gICAgICoNCi0gICAgICogU2hvcnRjdXQgbWV0aG9kcyBhcmUgYWxzbyBhdmFpbGFibGUuIEFsbCBzaG9ydGN1dCBtZXRob2RzIHJlcXVpcmUgcGFzc2luZyBpbiB0aGUgVVJMLCBhbmQNCi0gICAgICogcmVxdWVzdCBkYXRhIG11c3QgYmUgcGFzc2VkIGluIGZvciBQT1NUL1BVVCByZXF1ZXN0cy4NCi0gICAgICoNCi0gICAgICogYGBganMNCi0gICAgICogICAkaHR0cC5nZXQoJy9zb21lVXJsJykuc3VjY2VzcyhzdWNjZXNzQ2FsbGJhY2spOw0KLSAgICAgKiAgICRodHRwLnBvc3QoJy9zb21lVXJsJywgZGF0YSkuc3VjY2VzcyhzdWNjZXNzQ2FsbGJhY2spOw0KLSAgICAgKiBgYGANCi0gICAgICoNCi0gICAgICogQ29tcGxldGUgbGlzdCBvZiBzaG9ydGN1dCBtZXRob2RzOg0KLSAgICAgKg0KLSAgICAgKiAtIHtAbGluayBuZy4kaHR0cCNnZXQgJGh0dHAuZ2V0fQ0KLSAgICAgKiAtIHtAbGluayBuZy4kaHR0cCNoZWFkICRodHRwLmhlYWR9DQotICAgICAqIC0ge0BsaW5rIG5nLiRodHRwI3Bvc3QgJGh0dHAucG9zdH0NCi0gICAgICogLSB7QGxpbmsgbmcuJGh0dHAjcHV0ICRodHRwLnB1dH0NCi0gICAgICogLSB7QGxpbmsgbmcuJGh0dHAjZGVsZXRlICRodHRwLmRlbGV0ZX0NCi0gICAgICogLSB7QGxpbmsgbmcuJGh0dHAjanNvbnAgJGh0dHAuanNvbnB9DQotICAgICAqIC0ge0BsaW5rIG5nLiRodHRwI3BhdGNoICRodHRwLnBhdGNofQ0KLSAgICAgKg0KLSAgICAgKg0KLSAgICAgKiAjIyBTZXR0aW5nIEhUVFAgSGVhZGVycw0KLSAgICAgKg0KLSAgICAgKiBUaGUgJGh0dHAgc2VydmljZSB3aWxsIGF1dG9tYXRpY2FsbHkgYWRkIGNlcnRhaW4gSFRUUCBoZWFkZXJzIHRvIGFsbCByZXF1ZXN0cy4gVGhlc2UgZGVmYXVsdHMNCi0gICAgICogY2FuIGJlIGZ1bGx5IGNvbmZpZ3VyZWQgYnkgYWNjZXNzaW5nIHRoZSBgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzYCBjb25maWd1cmF0aW9uDQotICAgICAqIG9iamVjdCwgd2hpY2ggY3VycmVudGx5IGNvbnRhaW5zIHRoaXMgZGVmYXVsdCBjb25maWd1cmF0aW9uOg0KLSAgICAgKg0KLSAgICAgKiAtIGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uYCAoaGVhZGVycyB0aGF0IGFyZSBjb21tb24gZm9yIGFsbCByZXF1ZXN0cyk6DQotICAgICAqICAgLSBgQWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqIC8gKmANCi0gICAgICogLSBgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzLnBvc3RgOiAoaGVhZGVyIGRlZmF1bHRzIGZvciBQT1NUIHJlcXVlc3RzKQ0KLSAgICAgKiAgIC0gYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbmANCi0gICAgICogLSBgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzLnB1dGAgKGhlYWRlciBkZWZhdWx0cyBmb3IgUFVUIHJlcXVlc3RzKQ0KLSAgICAgKiAgIC0gYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbmANCi0gICAgICoNCi0gICAgICogVG8gYWRkIG9yIG92ZXJ3cml0ZSB0aGVzZSBkZWZhdWx0cywgc2ltcGx5IGFkZCBvciByZW1vdmUgYSBwcm9wZXJ0eSBmcm9tIHRoZXNlIGNvbmZpZ3VyYXRpb24NCi0gICAgICogb2JqZWN0cy4gVG8gYWRkIGhlYWRlcnMgZm9yIGFuIEhUVFAgbWV0aG9kIG90aGVyIHRoYW4gUE9TVCBvciBQVVQsIHNpbXBseSBhZGQgYSBuZXcgb2JqZWN0DQotICAgICAqIHdpdGggdGhlIGxvd2VyY2FzZWQgSFRUUCBtZXRob2QgbmFtZSBhcyB0aGUga2V5LCBlLmcuDQotICAgICAqIGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmhlYWRlcnMuZ2V0ID0geyAnTXktSGVhZGVyJyA6ICd2YWx1ZScgfS4NCi0gICAgICoNCi0gICAgICogVGhlIGRlZmF1bHRzIGNhbiBhbHNvIGJlIHNldCBhdCBydW50aW1lIHZpYSB0aGUgYCRodHRwLmRlZmF1bHRzYCBvYmplY3QgaW4gdGhlIHNhbWUNCi0gICAgICogZmFzaGlvbi4gRm9yIGV4YW1wbGU6DQotICAgICAqDQotICAgICAqIGBgYA0KLSAgICAgKiBtb2R1bGUucnVuKGZ1bmN0aW9uKCRodHRwKSB7DQotICAgICAqICAgJGh0dHAuZGVmYXVsdHMuaGVhZGVycy5jb21tb24uQXV0aG9yaXphdGlvbiA9ICdCYXNpYyBZbVZsY0RwaWIyOXcnDQotICAgICAqIH0pOw0KLSAgICAgKiBgYGANCi0gICAgICoNCi0gICAgICogSW4gYWRkaXRpb24sIHlvdSBjYW4gc3VwcGx5IGEgYGhlYWRlcnNgIHByb3BlcnR5IGluIHRoZSBjb25maWcgb2JqZWN0IHBhc3NlZCB3aGVuDQotICAgICAqIGNhbGxpbmcgYCRodHRwKGNvbmZpZylgLCB3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHRzIHdpdGhvdXQgY2hhbmdpbmcgdGhlbSBnbG9iYWxseS4NCi0gICAgICoNCi0gICAgICogVG8gZXhwbGljaXRseSByZW1vdmUgYSBoZWFkZXIgYXV0b21hdGljYWxseSBhZGRlZCB2aWEgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzIG9uIGEgcGVyIHJlcXVlc3QgYmFzaXMsDQotICAgICAqIFVzZSB0aGUgYGhlYWRlcnNgIHByb3BlcnR5LCBzZXR0aW5nIHRoZSBkZXNpcmVkIGhlYWRlciB0byBgdW5kZWZpbmVkYC4gRm9yIGV4YW1wbGU6DQotICAgICAqDQotICAgICAqIGBgYGpzDQotICAgICAqIHZhciByZXEgPSB7DQotICAgICAqICBtZXRob2Q6ICdQT1NUJywNCi0gICAgICogIHVybDogJ2h0dHA6Ly9leGFtcGxlLmNvbScsDQotICAgICAqICBoZWFkZXJzOiB7DQotICAgICAqICAgICdDb250ZW50LVR5cGUnOiB1bmRlZmluZWQNCi0gICAgICogIH0sDQotICAgICAqICBkYXRhOiB7IHRlc3Q6ICd0ZXN0JyB9LA0KLSAgICAgKiB9DQotICAgICAqDQotICAgICAqICRodHRwKHJlcSkuc3VjY2VzcyhmdW5jdGlvbigpey4uLn0pLmVycm9yKGZ1bmN0aW9uKCl7Li4ufSk7DQotICAgICAqIGBgYA0KLSAgICAgKg0KLSAgICAgKiAjIyBUcmFuc2Zvcm1pbmcgUmVxdWVzdHMgYW5kIFJlc3BvbnNlcw0KLSAgICAgKg0KLSAgICAgKiBCb3RoIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgY2FuIGJlIHRyYW5zZm9ybWVkIHVzaW5nIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uczogYHRyYW5zZm9ybVJlcXVlc3RgDQotICAgICAqIGFuZCBgdHJhbnNmb3JtUmVzcG9uc2VgLiBUaGVzZSBwcm9wZXJ0aWVzIGNhbiBiZSBhIHNpbmdsZSBmdW5jdGlvbiB0aGF0IHJldHVybnMNCi0gICAgICogdGhlIHRyYW5zZm9ybWVkIHZhbHVlIChge2Z1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIsIHN0YXR1cylgKSBvciBhbiBhcnJheSBvZiBzdWNoIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucywNCi0gICAgICogd2hpY2ggYWxsb3dzIHlvdSB0byBgcHVzaGAgb3IgYHVuc2hpZnRgIGEgbmV3IHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGludG8gdGhlIHRyYW5zZm9ybWF0aW9uIGNoYWluLg0KLSAgICAgKg0KLSAgICAgKiAjIyMgRGVmYXVsdCBUcmFuc2Zvcm1hdGlvbnMNCi0gICAgICoNCi0gICAgICogVGhlIGAkaHR0cFByb3ZpZGVyYCBwcm92aWRlciBhbmQgYCRodHRwYCBzZXJ2aWNlIGV4cG9zZSBgZGVmYXVsdHMudHJhbnNmb3JtUmVxdWVzdGAgYW5kDQotICAgICAqIGBkZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZWAgcHJvcGVydGllcy4gSWYgYSByZXF1ZXN0IGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biB0cmFuc2Zvcm1hdGlvbnMNCi0gICAgICogdGhlbiB0aGVzZSB3aWxsIGJlIGFwcGxpZWQuDQotICAgICAqDQotICAgICAqIFlvdSBjYW4gYXVnbWVudCBvciByZXBsYWNlIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWF0aW9ucyBieSBtb2RpZnlpbmcgdGhlc2UgcHJvcGVydGllcyBieSBhZGRpbmcgdG8gb3INCi0gICAgICogcmVwbGFjaW5nIHRoZSBhcnJheS4NCi0gICAgICoNCi0gICAgICogQW5ndWxhciBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGRlZmF1bHQgdHJhbnNmb3JtYXRpb25zOg0KLSAgICAgKg0KLSAgICAgKiBSZXF1ZXN0IHRyYW5zZm9ybWF0aW9ucyAoYCRodHRwUHJvdmlkZXIuZGVmYXVsdHMudHJhbnNmb3JtUmVxdWVzdGAgYW5kIGAkaHR0cC5kZWZhdWx0cy50cmFuc2Zvcm1SZXF1ZXN0YCk6DQotICAgICAqDQotICAgICAqIC0gSWYgdGhlIGBkYXRhYCBwcm9wZXJ0eSBvZiB0aGUgcmVxdWVzdCBjb25maWd1cmF0aW9uIG9iamVjdCBjb250YWlucyBhbiBvYmplY3QsIHNlcmlhbGl6ZSBpdA0KLSAgICAgKiAgIGludG8gSlNPTiBmb3JtYXQuDQotICAgICAqDQotICAgICAqIFJlc3BvbnNlIHRyYW5zZm9ybWF0aW9ucyAoYCRodHRwUHJvdmlkZXIuZGVmYXVsdHMudHJhbnNmb3JtUmVzcG9uc2VgIGFuZCBgJGh0dHAuZGVmYXVsdHMudHJhbnNmb3JtUmVzcG9uc2VgKToNCi0gICAgICoNCi0gICAgICogIC0gSWYgWFNSRiBwcmVmaXggaXMgZGV0ZWN0ZWQsIHN0cmlwIGl0IChzZWUgU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMgc2VjdGlvbiBiZWxvdykuDQotICAgICAqICAtIElmIEpTT04gcmVzcG9uc2UgaXMgZGV0ZWN0ZWQsIGRlc2VyaWFsaXplIGl0IHVzaW5nIGEgSlNPTiBwYXJzZXIuDQotICAgICAqDQotICAgICAqDQotICAgICAqICMjIyBPdmVycmlkaW5nIHRoZSBEZWZhdWx0IFRyYW5zZm9ybWF0aW9ucyBQZXIgUmVxdWVzdA0KLSAgICAgKg0KLSAgICAgKiBJZiB5b3Ugd2lzaCBvdmVycmlkZSB0aGUgcmVxdWVzdC9yZXNwb25zZSB0cmFuc2Zvcm1hdGlvbnMgb25seSBmb3IgYSBzaW5nbGUgcmVxdWVzdCB0aGVuIHByb3ZpZGUNCi0gICAgICogYHRyYW5zZm9ybVJlcXVlc3RgIGFuZC9vciBgdHJhbnNmb3JtUmVzcG9uc2VgIHByb3BlcnRpZXMgb24gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHBhc3NlZA0KLSAgICAgKiBpbnRvIGAkaHR0cGAuDQotICAgICAqDQotICAgICAqIE5vdGUgdGhhdCBpZiB5b3UgcHJvdmlkZSB0aGVzZSBwcm9wZXJ0aWVzIG9uIHRoZSBjb25maWcgb2JqZWN0IHRoZSBkZWZhdWx0IHRyYW5zZm9ybWF0aW9ucyB3aWxsIGJlDQotICAgICAqIG92ZXJ3cml0dGVuLiBJZiB5b3Ugd2lzaCB0byBhdWdtZW50IHRoZSBkZWZhdWx0IHRyYW5zZm9ybWF0aW9ucyB0aGVuIHlvdSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB5b3VyDQotICAgICAqIGxvY2FsIHRyYW5zZm9ybWF0aW9uIGFycmF5Lg0KLSAgICAgKg0KLSAgICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgZGVtb25zdHJhdGVzIGFkZGluZyBhIG5ldyByZXNwb25zZSB0cmFuc2Zvcm1hdGlvbiB0byBiZSBydW4gYWZ0ZXIgdGhlIGRlZmF1bHQgcmVzcG9uc2UNCi0gICAgICogdHJhbnNmb3JtYXRpb25zIGhhdmUgYmVlbiBydW4uDQotICAgICAqDQotICAgICAqIGBgYGpzDQotICAgICAqIGZ1bmN0aW9uIGFwcGVuZFRyYW5zZm9ybShkZWZhdWx0cywgdHJhbnNmb3JtKSB7DQotICAgICAqDQotICAgICAqICAgLy8gV2UgY2FuJ3QgZ3VhcmFudGVlIHRoYXQgdGhlIGRlZmF1bHQgdHJhbnNmb3JtYXRpb24gaXMgYW4gYXJyYXkNCi0gICAgICogICBkZWZhdWx0cyA9IGFuZ3VsYXIuaXNBcnJheShkZWZhdWx0cykgPyBkZWZhdWx0cyA6IFtkZWZhdWx0c107DQotICAgICAqDQotICAgICAqICAgLy8gQXBwZW5kIHRoZSBuZXcgdHJhbnNmb3JtYXRpb24gdG8gdGhlIGRlZmF1bHRzDQotICAgICAqICAgcmV0dXJuIGRlZmF1bHRzLmNvbmNhdCh0cmFuc2Zvcm0pOw0KLSAgICAgKiB9DQotICAgICAqDQotICAgICAqICRodHRwKHsNCi0gICAgICogICB1cmw6ICcuLi4nLA0KLSAgICAgKiAgIG1ldGhvZDogJ0dFVCcsDQotICAgICAqICAgdHJhbnNmb3JtUmVzcG9uc2U6IGFwcGVuZFRyYW5zZm9ybSgkaHR0cC5kZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZSwgZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICogICAgIHJldHVybiBkb1RyYW5zZm9ybSh2YWx1ZSk7DQotICAgICAqICAgfSkNCi0gICAgICogfSk7DQotICAgICAqIGBgYA0KLSAgICAgKg0KLSAgICAgKg0KLSAgICAgKiAjIyBDYWNoaW5nDQotICAgICAqDQotICAgICAqIFRvIGVuYWJsZSBjYWNoaW5nLCBzZXQgdGhlIHJlcXVlc3QgY29uZmlndXJhdGlvbiBgY2FjaGVgIHByb3BlcnR5IHRvIGB0cnVlYCAodG8gdXNlIGRlZmF1bHQNCi0gICAgICogY2FjaGUpIG9yIHRvIGEgY3VzdG9tIGNhY2hlIG9iamVjdCAoYnVpbHQgd2l0aCB7QGxpbmsgbmcuJGNhY2hlRmFjdG9yeSBgJGNhY2hlRmFjdG9yeWB9KS4NCi0gICAgICogV2hlbiB0aGUgY2FjaGUgaXMgZW5hYmxlZCwgYCRodHRwYCBzdG9yZXMgdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBpbiB0aGUgc3BlY2lmaWVkDQotICAgICAqIGNhY2hlLiBUaGUgbmV4dCB0aW1lIHRoZSBzYW1lIHJlcXVlc3QgaXMgbWFkZSwgdGhlIHJlc3BvbnNlIGlzIHNlcnZlZCBmcm9tIHRoZSBjYWNoZSB3aXRob3V0DQotICAgICAqIHNlbmRpbmcgYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIuDQotICAgICAqDQotICAgICAqIE5vdGUgdGhhdCBldmVuIGlmIHRoZSByZXNwb25zZSBpcyBzZXJ2ZWQgZnJvbSBjYWNoZSwgZGVsaXZlcnkgb2YgdGhlIGRhdGEgaXMgYXN5bmNocm9ub3VzIGluDQotICAgICAqIHRoZSBzYW1lIHdheSB0aGF0IHJlYWwgcmVxdWVzdHMgYXJlLg0KLSAgICAgKg0KLSAgICAgKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgR0VUIHJlcXVlc3RzIGZvciB0aGUgc2FtZSBVUkwgdGhhdCBzaG91bGQgYmUgY2FjaGVkIHVzaW5nIHRoZSBzYW1lDQotICAgICAqIGNhY2hlLCBidXQgdGhlIGNhY2hlIGlzIG5vdCBwb3B1bGF0ZWQgeWV0LCBvbmx5IG9uZSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgd2lsbCBiZSBtYWRlIGFuZA0KLSAgICAgKiB0aGUgcmVtYWluaW5nIHJlcXVlc3RzIHdpbGwgYmUgZnVsZmlsbGVkIHVzaW5nIHRoZSByZXNwb25zZSBmcm9tIHRoZSBmaXJzdCByZXF1ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBZb3UgY2FuIGNoYW5nZSB0aGUgZGVmYXVsdCBjYWNoZSB0byBhIG5ldyBvYmplY3QgKGJ1aWx0IHdpdGgNCi0gICAgICoge0BsaW5rIG5nLiRjYWNoZUZhY3RvcnkgYCRjYWNoZUZhY3RvcnlgfSkgYnkgdXBkYXRpbmcgdGhlDQotICAgICAqIHtAbGluayBuZy4kaHR0cCNkZWZhdWx0cyBgJGh0dHAuZGVmYXVsdHMuY2FjaGVgfSBwcm9wZXJ0eS4gQWxsIHJlcXVlc3RzIHdobyBzZXQNCi0gICAgICogdGhlaXIgYGNhY2hlYCBwcm9wZXJ0eSB0byBgdHJ1ZWAgd2lsbCBub3cgdXNlIHRoaXMgY2FjaGUgb2JqZWN0Lg0KLSAgICAgKg0KLSAgICAgKiBJZiB5b3Ugc2V0IHRoZSBkZWZhdWx0IGNhY2hlIHRvIGBmYWxzZWAgdGhlbiBvbmx5IHJlcXVlc3RzIHRoYXQgc3BlY2lmeSB0aGVpciBvd24gY3VzdG9tDQotICAgICAqIGNhY2hlIG9iamVjdCB3aWxsIGJlIGNhY2hlZC4NCi0gICAgICoNCi0gICAgICogIyMgSW50ZXJjZXB0b3JzDQotICAgICAqDQotICAgICAqIEJlZm9yZSB5b3Ugc3RhcnQgY3JlYXRpbmcgaW50ZXJjZXB0b3JzLCBiZSBzdXJlIHRvIHVuZGVyc3RhbmQgdGhlDQotICAgICAqIHtAbGluayBuZy4kcSAkcSBhbmQgZGVmZXJyZWQvcHJvbWlzZSBBUElzfS4NCi0gICAgICoNCi0gICAgICogRm9yIHB1cnBvc2VzIG9mIGdsb2JhbCBlcnJvciBoYW5kbGluZywgYXV0aGVudGljYXRpb24sIG9yIGFueSBraW5kIG9mIHN5bmNocm9ub3VzIG9yDQotICAgICAqIGFzeW5jaHJvbm91cyBwcmUtcHJvY2Vzc2luZyBvZiByZXF1ZXN0IG9yIHBvc3Rwcm9jZXNzaW5nIG9mIHJlc3BvbnNlcywgaXQgaXMgZGVzaXJhYmxlIHRvIGJlDQotICAgICAqIGFibGUgdG8gaW50ZXJjZXB0IHJlcXVlc3RzIGJlZm9yZSB0aGV5IGFyZSBoYW5kZWQgdG8gdGhlIHNlcnZlciBhbmQNCi0gICAgICogcmVzcG9uc2VzIGJlZm9yZSB0aGV5IGFyZSBoYW5kZWQgb3ZlciB0byB0aGUgYXBwbGljYXRpb24gY29kZSB0aGF0DQotICAgICAqIGluaXRpYXRlZCB0aGVzZSByZXF1ZXN0cy4gVGhlIGludGVyY2VwdG9ycyBsZXZlcmFnZSB0aGUge0BsaW5rIG5nLiRxDQotICAgICAqIHByb21pc2UgQVBJc30gdG8gZnVsZmlsbCB0aGlzIG5lZWQgZm9yIGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBwcmUtcHJvY2Vzc2luZy4NCi0gICAgICoNCi0gICAgICogVGhlIGludGVyY2VwdG9ycyBhcmUgc2VydmljZSBmYWN0b3JpZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgJGh0dHBQcm92aWRlcmAgYnkNCi0gICAgICogYWRkaW5nIHRoZW0gdG8gdGhlIGAkaHR0cFByb3ZpZGVyLmludGVyY2VwdG9yc2AgYXJyYXkuIFRoZSBmYWN0b3J5IGlzIGNhbGxlZCBhbmQNCi0gICAgICogaW5qZWN0ZWQgd2l0aCBkZXBlbmRlbmNpZXMgKGlmIHNwZWNpZmllZCkgYW5kIHJldHVybnMgdGhlIGludGVyY2VwdG9yLg0KLSAgICAgKg0KLSAgICAgKiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGludGVyY2VwdG9ycyAoYW5kIHR3byBraW5kcyBvZiByZWplY3Rpb24gaW50ZXJjZXB0b3JzKToNCi0gICAgICoNCi0gICAgICogICAqIGByZXF1ZXN0YDogaW50ZXJjZXB0b3JzIGdldCBjYWxsZWQgd2l0aCBhIGh0dHAgYGNvbmZpZ2Agb2JqZWN0LiBUaGUgZnVuY3Rpb24gaXMgZnJlZSB0bw0KLSAgICAgKiAgICAgbW9kaWZ5IHRoZSBgY29uZmlnYCBvYmplY3Qgb3IgY3JlYXRlIGEgbmV3IG9uZS4gVGhlIGZ1bmN0aW9uIG5lZWRzIHRvIHJldHVybiB0aGUgYGNvbmZpZ2ANCi0gICAgICogICAgIG9iamVjdCBkaXJlY3RseSwgb3IgYSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIGBjb25maWdgIG9yIGEgbmV3IGBjb25maWdgIG9iamVjdC4NCi0gICAgICogICAqIGByZXF1ZXN0RXJyb3JgOiBpbnRlcmNlcHRvciBnZXRzIGNhbGxlZCB3aGVuIGEgcHJldmlvdXMgaW50ZXJjZXB0b3IgdGhyZXcgYW4gZXJyb3Igb3INCi0gICAgICogICAgIHJlc29sdmVkIHdpdGggYSByZWplY3Rpb24uDQotICAgICAqICAgKiBgcmVzcG9uc2VgOiBpbnRlcmNlcHRvcnMgZ2V0IGNhbGxlZCB3aXRoIGh0dHAgYHJlc3BvbnNlYCBvYmplY3QuIFRoZSBmdW5jdGlvbiBpcyBmcmVlIHRvDQotICAgICAqICAgICBtb2RpZnkgdGhlIGByZXNwb25zZWAgb2JqZWN0IG9yIGNyZWF0ZSBhIG5ldyBvbmUuIFRoZSBmdW5jdGlvbiBuZWVkcyB0byByZXR1cm4gdGhlIGByZXNwb25zZWANCi0gICAgICogICAgIG9iamVjdCBkaXJlY3RseSwgb3IgYXMgYSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIGByZXNwb25zZWAgb3IgYSBuZXcgYHJlc3BvbnNlYCBvYmplY3QuDQotICAgICAqICAgKiBgcmVzcG9uc2VFcnJvcmA6IGludGVyY2VwdG9yIGdldHMgY2FsbGVkIHdoZW4gYSBwcmV2aW91cyBpbnRlcmNlcHRvciB0aHJldyBhbiBlcnJvciBvcg0KLSAgICAgKiAgICAgcmVzb2x2ZWQgd2l0aCBhIHJlamVjdGlvbi4NCi0gICAgICoNCi0gICAgICoNCi0gICAgICogYGBganMNCi0gICAgICogICAvLyByZWdpc3RlciB0aGUgaW50ZXJjZXB0b3IgYXMgYSBzZXJ2aWNlDQotICAgICAqICAgJHByb3ZpZGUuZmFjdG9yeSgnbXlIdHRwSW50ZXJjZXB0b3InLCBmdW5jdGlvbigkcSwgZGVwZW5kZW5jeTEsIGRlcGVuZGVuY3kyKSB7DQotICAgICAqICAgICByZXR1cm4gew0KLSAgICAgKiAgICAgICAvLyBvcHRpb25hbCBtZXRob2QNCi0gICAgICogICAgICAgJ3JlcXVlc3QnOiBmdW5jdGlvbihjb25maWcpIHsNCi0gICAgICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgb24gc3VjY2Vzcw0KLSAgICAgKiAgICAgICAgIHJldHVybiBjb25maWc7DQotICAgICAqICAgICAgIH0sDQotICAgICAqDQotICAgICAqICAgICAgIC8vIG9wdGlvbmFsIG1ldGhvZA0KLSAgICAgKiAgICAgICdyZXF1ZXN0RXJyb3InOiBmdW5jdGlvbihyZWplY3Rpb24pIHsNCi0gICAgICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgb24gZXJyb3INCi0gICAgICogICAgICAgICBpZiAoY2FuUmVjb3ZlcihyZWplY3Rpb24pKSB7DQotICAgICAqICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VPck5ld1Byb21pc2UNCi0gICAgICogICAgICAgICB9DQotICAgICAqICAgICAgICAgcmV0dXJuICRxLnJlamVjdChyZWplY3Rpb24pOw0KLSAgICAgKiAgICAgICB9LA0KLSAgICAgKg0KLSAgICAgKg0KLSAgICAgKg0KLSAgICAgKiAgICAgICAvLyBvcHRpb25hbCBtZXRob2QNCi0gICAgICogICAgICAgJ3Jlc3BvbnNlJzogZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgb24gc3VjY2Vzcw0KLSAgICAgKiAgICAgICAgIHJldHVybiByZXNwb25zZTsNCi0gICAgICogICAgICAgfSwNCi0gICAgICoNCi0gICAgICogICAgICAgLy8gb3B0aW9uYWwgbWV0aG9kDQotICAgICAqICAgICAgJ3Jlc3BvbnNlRXJyb3InOiBmdW5jdGlvbihyZWplY3Rpb24pIHsNCi0gICAgICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgb24gZXJyb3INCi0gICAgICogICAgICAgICBpZiAoY2FuUmVjb3ZlcihyZWplY3Rpb24pKSB7DQotICAgICAqICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VPck5ld1Byb21pc2UNCi0gICAgICogICAgICAgICB9DQotICAgICAqICAgICAgICAgcmV0dXJuICRxLnJlamVjdChyZWplY3Rpb24pOw0KLSAgICAgKiAgICAgICB9DQotICAgICAqICAgICB9Ow0KLSAgICAgKiAgIH0pOw0KLSAgICAgKg0KLSAgICAgKiAgICRodHRwUHJvdmlkZXIuaW50ZXJjZXB0b3JzLnB1c2goJ215SHR0cEludGVyY2VwdG9yJyk7DQotICAgICAqDQotICAgICAqDQotICAgICAqICAgLy8gYWx0ZXJuYXRpdmVseSwgcmVnaXN0ZXIgdGhlIGludGVyY2VwdG9yIHZpYSBhbiBhbm9ueW1vdXMgZmFjdG9yeQ0KLSAgICAgKiAgICRodHRwUHJvdmlkZXIuaW50ZXJjZXB0b3JzLnB1c2goZnVuY3Rpb24oJHEsIGRlcGVuZGVuY3kxLCBkZXBlbmRlbmN5Mikgew0KLSAgICAgKiAgICAgcmV0dXJuIHsNCi0gICAgICogICAgICAncmVxdWVzdCc6IGZ1bmN0aW9uKGNvbmZpZykgew0KLSAgICAgKiAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlDQotICAgICAqICAgICAgIH0sDQotICAgICAqDQotICAgICAqICAgICAgICdyZXNwb25zZSc6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQotICAgICAqICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUNCi0gICAgICogICAgICAgfQ0KLSAgICAgKiAgICAgfTsNCi0gICAgICogICB9KTsNCi0gICAgICogYGBgDQotICAgICAqDQotICAgICAqICMjIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zDQotICAgICAqDQotICAgICAqIFdoZW4gZGVzaWduaW5nIHdlYiBhcHBsaWNhdGlvbnMsIGNvbnNpZGVyIHNlY3VyaXR5IHRocmVhdHMgZnJvbToNCi0gICAgICoNCi0gICAgICogLSBbSlNPTiB2dWxuZXJhYmlsaXR5XShodHRwOi8vaGFhY2tlZC5jb20vYXJjaGl2ZS8yMDA4LzExLzIwL2FuYXRvbXktb2YtYS1zdWJ0bGUtanNvbi12dWxuZXJhYmlsaXR5LmFzcHgpDQotICAgICAqIC0gW1hTUkZdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3Jvc3Mtc2l0ZV9yZXF1ZXN0X2ZvcmdlcnkpDQotICAgICAqDQotICAgICAqIEJvdGggc2VydmVyIGFuZCB0aGUgY2xpZW50IG11c3QgY29vcGVyYXRlIGluIG9yZGVyIHRvIGVsaW1pbmF0ZSB0aGVzZSB0aHJlYXRzLiBBbmd1bGFyIGNvbWVzDQotICAgICAqIHByZS1jb25maWd1cmVkIHdpdGggc3RyYXRlZ2llcyB0aGF0IGFkZHJlc3MgdGhlc2UgaXNzdWVzLCBidXQgZm9yIHRoaXMgdG8gd29yayBiYWNrZW5kIHNlcnZlcg0KLSAgICAgKiBjb29wZXJhdGlvbiBpcyByZXF1aXJlZC4NCi0gICAgICoNCi0gICAgICogIyMjIEpTT04gVnVsbmVyYWJpbGl0eSBQcm90ZWN0aW9uDQotICAgICAqDQotICAgICAqIEEgW0pTT04gdnVsbmVyYWJpbGl0eV0oaHR0cDovL2hhYWNrZWQuY29tL2FyY2hpdmUvMjAwOC8xMS8yMC9hbmF0b215LW9mLWEtc3VidGxlLWpzb24tdnVsbmVyYWJpbGl0eS5hc3B4KQ0KLSAgICAgKiBhbGxvd3MgdGhpcmQgcGFydHkgd2Vic2l0ZSB0byB0dXJuIHlvdXIgSlNPTiByZXNvdXJjZSBVUkwgaW50bw0KLSAgICAgKiBbSlNPTlBdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSlNPTlApIHJlcXVlc3QgdW5kZXIgc29tZSBjb25kaXRpb25zLiBUbw0KLSAgICAgKiBjb3VudGVyIHRoaXMgeW91ciBzZXJ2ZXIgY2FuIHByZWZpeCBhbGwgSlNPTiByZXF1ZXN0cyB3aXRoIGZvbGxvd2luZyBzdHJpbmcgYCIpXX0nLFxuImAuDQotICAgICAqIEFuZ3VsYXIgd2lsbCBhdXRvbWF0aWNhbGx5IHN0cmlwIHRoZSBwcmVmaXggYmVmb3JlIHByb2Nlc3NpbmcgaXQgYXMgSlNPTi4NCi0gICAgICoNCi0gICAgICogRm9yIGV4YW1wbGUgaWYgeW91ciBzZXJ2ZXIgbmVlZHMgdG8gcmV0dXJuOg0KLSAgICAgKiBgYGBqcw0KLSAgICAgKiBbJ29uZScsJ3R3byddDQotICAgICAqIGBgYA0KLSAgICAgKg0KLSAgICAgKiB3aGljaCBpcyB2dWxuZXJhYmxlIHRvIGF0dGFjaywgeW91ciBzZXJ2ZXIgY2FuIHJldHVybjoNCi0gICAgICogYGBganMNCi0gICAgICogKV19JywNCi0gICAgICogWydvbmUnLCd0d28nXQ0KLSAgICAgKiBgYGANCi0gICAgICoNCi0gICAgICogQW5ndWxhciB3aWxsIHN0cmlwIHRoZSBwcmVmaXgsIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBKU09OLg0KLSAgICAgKg0KLSAgICAgKg0KLSAgICAgKiAjIyMgQ3Jvc3MgU2l0ZSBSZXF1ZXN0IEZvcmdlcnkgKFhTUkYpIFByb3RlY3Rpb24NCi0gICAgICoNCi0gICAgICogW1hTUkZdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3Jvc3Mtc2l0ZV9yZXF1ZXN0X2ZvcmdlcnkpIGlzIGEgdGVjaG5pcXVlIGJ5IHdoaWNoDQotICAgICAqIGFuIHVuYXV0aG9yaXplZCBzaXRlIGNhbiBnYWluIHlvdXIgdXNlcidzIHByaXZhdGUgZGF0YS4gQW5ndWxhciBwcm92aWRlcyBhIG1lY2hhbmlzbQ0KLSAgICAgKiB0byBjb3VudGVyIFhTUkYuIFdoZW4gcGVyZm9ybWluZyBYSFIgcmVxdWVzdHMsIHRoZSAkaHR0cCBzZXJ2aWNlIHJlYWRzIGEgdG9rZW4gZnJvbSBhIGNvb2tpZQ0KLSAgICAgKiAoYnkgZGVmYXVsdCwgYFhTUkYtVE9LRU5gKSBhbmQgc2V0cyBpdCBhcyBhbiBIVFRQIGhlYWRlciAoYFgtWFNSRi1UT0tFTmApLiBTaW5jZSBvbmx5DQotICAgICAqIEphdmFTY3JpcHQgdGhhdCBydW5zIG9uIHlvdXIgZG9tYWluIGNvdWxkIHJlYWQgdGhlIGNvb2tpZSwgeW91ciBzZXJ2ZXIgY2FuIGJlIGFzc3VyZWQgdGhhdA0KLSAgICAgKiB0aGUgWEhSIGNhbWUgZnJvbSBKYXZhU2NyaXB0IHJ1bm5pbmcgb24geW91ciBkb21haW4uIFRoZSBoZWFkZXIgd2lsbCBub3QgYmUgc2V0IGZvcg0KLSAgICAgKiBjcm9zcy1kb21haW4gcmVxdWVzdHMuDQotICAgICAqDQotICAgICAqIFRvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMsIHlvdXIgc2VydmVyIG5lZWRzIHRvIHNldCBhIHRva2VuIGluIGEgSmF2YVNjcmlwdCByZWFkYWJsZSBzZXNzaW9uDQotICAgICAqIGNvb2tpZSBjYWxsZWQgYFhTUkYtVE9LRU5gIG9uIHRoZSBmaXJzdCBIVFRQIEdFVCByZXF1ZXN0LiBPbiBzdWJzZXF1ZW50IFhIUiByZXF1ZXN0cyB0aGUNCi0gICAgICogc2VydmVyIGNhbiB2ZXJpZnkgdGhhdCB0aGUgY29va2llIG1hdGNoZXMgYFgtWFNSRi1UT0tFTmAgSFRUUCBoZWFkZXIsIGFuZCB0aGVyZWZvcmUgYmUgc3VyZQ0KLSAgICAgKiB0aGF0IG9ubHkgSmF2YVNjcmlwdCBydW5uaW5nIG9uIHlvdXIgZG9tYWluIGNvdWxkIGhhdmUgc2VudCB0aGUgcmVxdWVzdC4gVGhlIHRva2VuIG11c3QgYmUNCi0gICAgICogdW5pcXVlIGZvciBlYWNoIHVzZXIgYW5kIG11c3QgYmUgdmVyaWZpYWJsZSBieSB0aGUgc2VydmVyICh0byBwcmV2ZW50IHRoZSBKYXZhU2NyaXB0IGZyb20NCi0gICAgICogbWFraW5nIHVwIGl0cyBvd24gdG9rZW5zKS4gV2UgcmVjb21tZW5kIHRoYXQgdGhlIHRva2VuIGlzIGEgZGlnZXN0IG9mIHlvdXIgc2l0ZSdzDQotICAgICAqIGF1dGhlbnRpY2F0aW9uIGNvb2tpZSB3aXRoIGEgW3NhbHRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NhbHRfKGNyeXB0b2dyYXBoeSYjNDE7KQ0KLSAgICAgKiBmb3IgYWRkZWQgc2VjdXJpdHkuDQotICAgICAqDQotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXJzIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIHhzcmZIZWFkZXJOYW1lIGFuZCB4c3JmQ29va2llTmFtZQ0KLSAgICAgKiBwcm9wZXJ0aWVzIG9mIGVpdGhlciAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzIGF0IGNvbmZpZy10aW1lLCAkaHR0cC5kZWZhdWx0cyBhdCBydW4tdGltZSwNCi0gICAgICogb3IgdGhlIHBlci1yZXF1ZXN0IGNvbmZpZyBvYmplY3QuDQotICAgICAqDQotICAgICAqDQotICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgT2JqZWN0IGRlc2NyaWJpbmcgdGhlIHJlcXVlc3QgdG8gYmUgbWFkZSBhbmQgaG93IGl0IHNob3VsZCBiZQ0KLSAgICAgKiAgICBwcm9jZXNzZWQuIFRoZSBvYmplY3QgaGFzIGZvbGxvd2luZyBwcm9wZXJ0aWVzOg0KLSAgICAgKg0KLSAgICAgKiAgICAtICoqbWV0aG9kKiog4oA/IGB7c3RyaW5nfWAg4oA/IEhUVFAgbWV0aG9kIChlLmcuICdHRVQnLCAnUE9TVCcsIGV0YykNCi0gICAgICogICAgLSAqKnVybCoqIOKAPyBge3N0cmluZ31gIOKAPyBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgb2YgdGhlIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLg0KLSAgICAgKiAgICAtICoqcGFyYW1zKiog4oA/IGB7T2JqZWN0LjxzdHJpbmd8T2JqZWN0Pn1gIOKAPyBNYXAgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdoaWNoIHdpbGwgYmUgdHVybmVkDQotICAgICAqICAgICAgdG8gYD9rZXkxPXZhbHVlMSZrZXkyPXZhbHVlMmAgYWZ0ZXIgdGhlIHVybC4gSWYgdGhlIHZhbHVlIGlzIG5vdCBhIHN0cmluZywgaXQgd2lsbCBiZQ0KLSAgICAgKiAgICAgIEpTT05pZmllZC4NCi0gICAgICogICAgLSAqKmRhdGEqKiDigD8gYHtzdHJpbmd8T2JqZWN0fWAg4oA/IERhdGEgdG8gYmUgc2VudCBhcyB0aGUgcmVxdWVzdCBtZXNzYWdlIGRhdGEuDQotICAgICAqICAgIC0gKipoZWFkZXJzKiog4oA/IGB7T2JqZWN0fWAg4oA/IE1hcCBvZiBzdHJpbmdzIG9yIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gc3RyaW5ncyByZXByZXNlbnRpbmcNCi0gICAgICogICAgICBIVFRQIGhlYWRlcnMgdG8gc2VuZCB0byB0aGUgc2VydmVyLiBJZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gaXMgbnVsbCwgdGhlDQotICAgICAqICAgICAgaGVhZGVyIHdpbGwgbm90IGJlIHNlbnQuDQotICAgICAqICAgIC0gKip4c3JmSGVhZGVyTmFtZSoqIOKAPyBge3N0cmluZ31gIOKAPyBOYW1lIG9mIEhUVFAgaGVhZGVyIHRvIHBvcHVsYXRlIHdpdGggdGhlIFhTUkYgdG9rZW4uDQotICAgICAqICAgIC0gKip4c3JmQ29va2llTmFtZSoqIOKAPyBge3N0cmluZ31gIOKAPyBOYW1lIG9mIGNvb2tpZSBjb250YWluaW5nIHRoZSBYU1JGIHRva2VuLg0KLSAgICAgKiAgICAtICoqdHJhbnNmb3JtUmVxdWVzdCoqIOKAPw0KLSAgICAgKiAgICAgIGB7ZnVuY3Rpb24oZGF0YSwgaGVhZGVyc0dldHRlcil8QXJyYXkuPGZ1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIpPn1gIOKAPw0KLSAgICAgKiAgICAgIHRyYW5zZm9ybSBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiBzdWNoIGZ1bmN0aW9ucy4gVGhlIHRyYW5zZm9ybSBmdW5jdGlvbiB0YWtlcyB0aGUgaHR0cA0KLSAgICAgKiAgICAgIHJlcXVlc3QgYm9keSBhbmQgaGVhZGVycyBhbmQgcmV0dXJucyBpdHMgdHJhbnNmb3JtZWQgKHR5cGljYWxseSBzZXJpYWxpemVkKSB2ZXJzaW9uLg0KLSAgICAgKiAgICAgIFNlZSB7QGxpbmsgbmcuJGh0dHAjb3ZlcnJpZGluZy10aGUtZGVmYXVsdC10cmFuc2Zvcm1hdGlvbnMtcGVyLXJlcXVlc3QNCi0gICAgICogICAgICBPdmVycmlkaW5nIHRoZSBEZWZhdWx0IFRyYW5zZm9ybWF0aW9uc30NCi0gICAgICogICAgLSAqKnRyYW5zZm9ybVJlc3BvbnNlKiog4oA/DQotICAgICAqICAgICAgYHtmdW5jdGlvbihkYXRhLCBoZWFkZXJzR2V0dGVyLCBzdGF0dXMpfEFycmF5LjxmdW5jdGlvbihkYXRhLCBoZWFkZXJzR2V0dGVyLCBzdGF0dXMpPn1gIOKAPw0KLSAgICAgKiAgICAgIHRyYW5zZm9ybSBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiBzdWNoIGZ1bmN0aW9ucy4gVGhlIHRyYW5zZm9ybSBmdW5jdGlvbiB0YWtlcyB0aGUgaHR0cA0KLSAgICAgKiAgICAgIHJlc3BvbnNlIGJvZHksIGhlYWRlcnMgYW5kIHN0YXR1cyBhbmQgcmV0dXJucyBpdHMgdHJhbnNmb3JtZWQgKHR5cGljYWxseSBkZXNlcmlhbGl6ZWQpIHZlcnNpb24uDQotICAgICAqICAgICAgU2VlIHtAbGluayBuZy4kaHR0cCNvdmVycmlkaW5nLXRoZS1kZWZhdWx0LXRyYW5zZm9ybWF0aW9ucy1wZXItcmVxdWVzdA0KLSAgICAgKiAgICAgIE92ZXJyaWRpbmcgdGhlIERlZmF1bHQgVHJhbnNmb3JtYXRpb25zfQ0KLSAgICAgKiAgICAtICoqY2FjaGUqKiDigD8gYHtib29sZWFufENhY2hlfWAg4oA/IElmIHRydWUsIGEgZGVmYXVsdCAkaHR0cCBjYWNoZSB3aWxsIGJlIHVzZWQgdG8gY2FjaGUgdGhlDQotICAgICAqICAgICAgR0VUIHJlcXVlc3QsIG90aGVyd2lzZSBpZiBhIGNhY2hlIGluc3RhbmNlIGJ1aWx0IHdpdGgNCi0gICAgICogICAgICB7QGxpbmsgbmcuJGNhY2hlRmFjdG9yeSAkY2FjaGVGYWN0b3J5fSwgdGhpcyBjYWNoZSB3aWxsIGJlIHVzZWQgZm9yDQotICAgICAqICAgICAgY2FjaGluZy4NCi0gICAgICogICAgLSAqKnRpbWVvdXQqKiDigD8gYHtudW1iZXJ8UHJvbWlzZX1gIOKAPyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcywgb3Ige0BsaW5rIG5nLiRxIHByb21pc2V9DQotICAgICAqICAgICAgdGhhdCBzaG91bGQgYWJvcnQgdGhlIHJlcXVlc3Qgd2hlbiByZXNvbHZlZC4NCi0gICAgICogICAgLSAqKndpdGhDcmVkZW50aWFscyoqIC0gYHtib29sZWFufWAgLSB3aGV0aGVyIHRvIHNldCB0aGUgYHdpdGhDcmVkZW50aWFsc2AgZmxhZyBvbiB0aGUNCi0gICAgICogICAgICBYSFIgb2JqZWN0LiBTZWUgW3JlcXVlc3RzIHdpdGggY3JlZGVudGlhbHNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUVFAvQWNjZXNzX2NvbnRyb2xfQ09SUyNSZXF1ZXN0c193aXRoX2NyZWRlbnRpYWxzKQ0KLSAgICAgKiAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KLSAgICAgKiAgICAtICoqcmVzcG9uc2VUeXBlKiogLSBge3N0cmluZ31gIC0gc2VlDQotICAgICAqICAgICAgW3JlcXVlc3RUeXBlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0RPTS9YTUxIdHRwUmVxdWVzdCNyZXNwb25zZVR5cGUpLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IFJldHVybnMgYSB7QGxpbmsgbmcuJHEgcHJvbWlzZX0gb2JqZWN0IHdpdGggdGhlDQotICAgICAqICAgc3RhbmRhcmQgYHRoZW5gIG1ldGhvZCBhbmQgdHdvIGh0dHAgc3BlY2lmaWMgbWV0aG9kczogYHN1Y2Nlc3NgIGFuZCBgZXJyb3JgLiBUaGUgYHRoZW5gDQotICAgICAqICAgbWV0aG9kIHRha2VzIHR3byBhcmd1bWVudHMgYSBzdWNjZXNzIGFuZCBhbiBlcnJvciBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aXRoIGENCi0gICAgICogICByZXNwb25zZSBvYmplY3QuIFRoZSBgc3VjY2Vzc2AgYW5kIGBlcnJvcmAgbWV0aG9kcyB0YWtlIGEgc2luZ2xlIGFyZ3VtZW50IC0gYSBmdW5jdGlvbiB0aGF0DQotICAgICAqICAgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcmVxdWVzdCBzdWNjZWVkcyBvciBmYWlscyByZXNwZWN0aXZlbHkuIFRoZSBhcmd1bWVudHMgcGFzc2VkIGludG8NCi0gICAgICogICB0aGVzZSBmdW5jdGlvbnMgYXJlIGRlc3RydWN0dXJlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVzcG9uc2Ugb2JqZWN0IHBhc3NlZCBpbnRvIHRoZQ0KLSAgICAgKiAgIGB0aGVuYCBtZXRob2QuIFRoZSByZXNwb25zZSBvYmplY3QgaGFzIHRoZXNlIHByb3BlcnRpZXM6DQotICAgICAqDQotICAgICAqICAgLSAqKmRhdGEqKiDigD8gYHtzdHJpbmd8T2JqZWN0fWAg4oA/IFRoZSByZXNwb25zZSBib2R5IHRyYW5zZm9ybWVkIHdpdGggdGhlIHRyYW5zZm9ybQ0KLSAgICAgKiAgICAgZnVuY3Rpb25zLg0KLSAgICAgKiAgIC0gKipzdGF0dXMqKiDigD8gYHtudW1iZXJ9YCDigD8gSFRUUCBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2UuDQotICAgICAqICAgLSAqKmhlYWRlcnMqKiDigD8gYHtmdW5jdGlvbihbaGVhZGVyTmFtZV0pfWAg4oA/IEhlYWRlciBnZXR0ZXIgZnVuY3Rpb24uDQotICAgICAqICAgLSAqKmNvbmZpZyoqIOKAPyBge09iamVjdH1gIOKAPyBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCB3YXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcmVxdWVzdC4NCi0gICAgICogICAtICoqc3RhdHVzVGV4dCoqIOKAPyBge3N0cmluZ31gIOKAPyBIVFRQIHN0YXR1cyB0ZXh0IG9mIHRoZSByZXNwb25zZS4NCi0gICAgICoNCi0gICAgICogQHByb3BlcnR5IHtBcnJheS48T2JqZWN0Pn0gcGVuZGluZ1JlcXVlc3RzIEFycmF5IG9mIGNvbmZpZyBvYmplY3RzIGZvciBjdXJyZW50bHkgcGVuZGluZw0KLSAgICAgKiAgIHJlcXVlc3RzLiBUaGlzIGlzIHByaW1hcmlseSBtZWFudCB0byBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuDQotICAgICAqDQotICAgICAqDQotICAgICAqIEBleGFtcGxlDQotPGV4YW1wbGUgbW9kdWxlPSJodHRwRXhhbXBsZSI+DQotPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkZldGNoQ29udHJvbGxlciI+DQotICAgIDxzZWxlY3QgbmctbW9kZWw9Im1ldGhvZCI+DQotICAgICAgPG9wdGlvbj5HRVQ8L29wdGlvbj4NCi0gICAgICA8b3B0aW9uPkpTT05QPC9vcHRpb24+DQotICAgIDwvc2VsZWN0Pg0KLSAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InVybCIgc2l6ZT0iODAiLz4NCi0gICAgPGJ1dHRvbiBpZD0iZmV0Y2hidG4iIG5nLWNsaWNrPSJmZXRjaCgpIj5mZXRjaDwvYnV0dG9uPjxicj4NCi0gICAgPGJ1dHRvbiBpZD0ic2FtcGxlZ2V0YnRuIiBuZy1jbGljaz0idXBkYXRlTW9kZWwoJ0dFVCcsICdodHRwLWhlbGxvLmh0bWwnKSI+U2FtcGxlIEdFVDwvYnV0dG9uPg0KLSAgICA8YnV0dG9uIGlkPSJzYW1wbGVqc29ucGJ0biINCi0gICAgICBuZy1jbGljaz0idXBkYXRlTW9kZWwoJ0pTT05QJywNCi0gICAgICAgICAgICAgICAgICAgICdodHRwczovL2FuZ3VsYXJqcy5vcmcvZ3JlZXQucGhwP2NhbGxiYWNrPUpTT05fQ0FMTEJBQ0smbmFtZT1TdXBlciUyMEhlcm8nKSI+DQotICAgICAgU2FtcGxlIEpTT05QDQotICAgIDwvYnV0dG9uPg0KLSAgICA8YnV0dG9uIGlkPSJpbnZhbGlkanNvbnBidG4iDQotICAgICAgbmctY2xpY2s9InVwZGF0ZU1vZGVsKCdKU09OUCcsICdodHRwczovL2FuZ3VsYXJqcy5vcmcvZG9lc250ZXhpc3QmY2FsbGJhY2s9SlNPTl9DQUxMQkFDSycpIj4NCi0gICAgICAgIEludmFsaWQgSlNPTlANCi0gICAgICA8L2J1dHRvbj4NCi0gICAgPHByZT5odHRwIHN0YXR1cyBjb2RlOiB7e3N0YXR1c319PC9wcmU+DQotICAgIDxwcmU+aHR0cCByZXNwb25zZSBkYXRhOiB7e2RhdGF9fTwvcHJlPg0KLSAgPC9kaXY+DQotPC9maWxlPg0KLTxmaWxlIG5hbWU9InNjcmlwdC5qcyI+DQotICBhbmd1bGFyLm1vZHVsZSgnaHR0cEV4YW1wbGUnLCBbXSkNCi0gICAgLmNvbnRyb2xsZXIoJ0ZldGNoQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRodHRwJywgJyR0ZW1wbGF0ZUNhY2hlJywNCi0gICAgICBmdW5jdGlvbigkc2NvcGUsICRodHRwLCAkdGVtcGxhdGVDYWNoZSkgew0KLSAgICAgICAgJHNjb3BlLm1ldGhvZCA9ICdHRVQnOw0KLSAgICAgICAgJHNjb3BlLnVybCA9ICdodHRwLWhlbGxvLmh0bWwnOw0KLQ0KLSAgICAgICAgJHNjb3BlLmZldGNoID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICRzY29wZS5jb2RlID0gbnVsbDsNCi0gICAgICAgICAgJHNjb3BlLnJlc3BvbnNlID0gbnVsbDsNCi0NCi0gICAgICAgICAgJGh0dHAoe21ldGhvZDogJHNjb3BlLm1ldGhvZCwgdXJsOiAkc2NvcGUudXJsLCBjYWNoZTogJHRlbXBsYXRlQ2FjaGV9KS4NCi0gICAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cykgew0KLSAgICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9IHN0YXR1czsNCi0gICAgICAgICAgICAgICRzY29wZS5kYXRhID0gZGF0YTsNCi0gICAgICAgICAgICB9KS4NCi0gICAgICAgICAgICBlcnJvcihmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHsNCi0gICAgICAgICAgICAgICRzY29wZS5kYXRhID0gZGF0YSB8fCAiUmVxdWVzdCBmYWlsZWQiOw0KLSAgICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9IHN0YXR1czsNCi0gICAgICAgICAgfSk7DQotICAgICAgICB9Ow0KLQ0KLSAgICAgICAgJHNjb3BlLnVwZGF0ZU1vZGVsID0gZnVuY3Rpb24obWV0aG9kLCB1cmwpIHsNCi0gICAgICAgICAgJHNjb3BlLm1ldGhvZCA9IG1ldGhvZDsNCi0gICAgICAgICAgJHNjb3BlLnVybCA9IHVybDsNCi0gICAgICAgIH07DQotICAgICAgfV0pOw0KLTwvZmlsZT4NCi08ZmlsZSBuYW1lPSJodHRwLWhlbGxvLmh0bWwiPg0KLSAgSGVsbG8sICRodHRwIQ0KLTwvZmlsZT4NCi08ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gIHZhciBzdGF0dXMgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3N0YXR1cycpKTsNCi0gIHZhciBkYXRhID0gZWxlbWVudChieS5iaW5kaW5nKCdkYXRhJykpOw0KLSAgdmFyIGZldGNoQnRuID0gZWxlbWVudChieS5pZCgnZmV0Y2hidG4nKSk7DQotICB2YXIgc2FtcGxlR2V0QnRuID0gZWxlbWVudChieS5pZCgnc2FtcGxlZ2V0YnRuJykpOw0KLSAgdmFyIHNhbXBsZUpzb25wQnRuID0gZWxlbWVudChieS5pZCgnc2FtcGxlanNvbnBidG4nKSk7DQotICB2YXIgaW52YWxpZEpzb25wQnRuID0gZWxlbWVudChieS5pZCgnaW52YWxpZGpzb25wYnRuJykpOw0KLQ0KLSAgaXQoJ3Nob3VsZCBtYWtlIGFuIHhociBHRVQgcmVxdWVzdCcsIGZ1bmN0aW9uKCkgew0KLSAgICBzYW1wbGVHZXRCdG4uY2xpY2soKTsNCi0gICAgZmV0Y2hCdG4uY2xpY2soKTsNCi0gICAgZXhwZWN0KHN0YXR1cy5nZXRUZXh0KCkpLnRvTWF0Y2goJzIwMCcpOw0KLSAgICBleHBlY3QoZGF0YS5nZXRUZXh0KCkpLnRvTWF0Y2goL0hlbGxvLCBcJGh0dHAhLyk7DQotICB9KTsNCi0NCi0vLyBDb21tZW50ZWQgb3V0IGR1ZSB0byBmbGFrZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2lzc3Vlcy85MTg1DQotLy8gaXQoJ3Nob3VsZCBtYWtlIGEgSlNPTlAgcmVxdWVzdCB0byBhbmd1bGFyanMub3JnJywgZnVuY3Rpb24oKSB7DQotLy8gICBzYW1wbGVKc29ucEJ0bi5jbGljaygpOw0KLS8vICAgZmV0Y2hCdG4uY2xpY2soKTsNCi0vLyAgIGV4cGVjdChzdGF0dXMuZ2V0VGV4dCgpKS50b01hdGNoKCcyMDAnKTsNCi0vLyAgIGV4cGVjdChkYXRhLmdldFRleHQoKSkudG9NYXRjaCgvU3VwZXIgSGVybyEvKTsNCi0vLyB9KTsNCi0NCi0gIGl0KCdzaG91bGQgbWFrZSBKU09OUCByZXF1ZXN0IHRvIGludmFsaWQgVVJMIGFuZCBpbnZva2UgdGhlIGVycm9yIGhhbmRsZXInLA0KLSAgICAgIGZ1bmN0aW9uKCkgew0KLSAgICBpbnZhbGlkSnNvbnBCdG4uY2xpY2soKTsNCi0gICAgZmV0Y2hCdG4uY2xpY2soKTsNCi0gICAgZXhwZWN0KHN0YXR1cy5nZXRUZXh0KCkpLnRvTWF0Y2goJzAnKTsNCi0gICAgZXhwZWN0KGRhdGEuZ2V0VGV4dCgpKS50b01hdGNoKCdSZXF1ZXN0IGZhaWxlZCcpOw0KLSAgfSk7DQotPC9maWxlPg0KLTwvZXhhbXBsZT4NCi0gICAgICovDQotICAgIGZ1bmN0aW9uICRodHRwKHJlcXVlc3RDb25maWcpIHsNCi0NCi0gICAgICBpZiAoIWFuZ3VsYXIuaXNPYmplY3QocmVxdWVzdENvbmZpZykpIHsNCi0gICAgICAgIHRocm93IG1pbkVycignJGh0dHAnKSgnYmFkcmVxJywgJ0h0dHAgcmVxdWVzdCBjb25maWd1cmF0aW9uIG11c3QgYmUgYW4gb2JqZWN0LiAgUmVjZWl2ZWQ6IHswfScsIHJlcXVlc3RDb25maWcpOw0KLSAgICAgIH0NCi0NCi0gICAgICB2YXIgY29uZmlnID0gZXh0ZW5kKHsNCi0gICAgICAgIG1ldGhvZDogJ2dldCcsDQotICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBkZWZhdWx0cy50cmFuc2Zvcm1SZXF1ZXN0LA0KLSAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlDQotICAgICAgfSwgcmVxdWVzdENvbmZpZyk7DQotDQotICAgICAgY29uZmlnLmhlYWRlcnMgPSBtZXJnZUhlYWRlcnMocmVxdWVzdENvbmZpZyk7DQotICAgICAgY29uZmlnLm1ldGhvZCA9IHVwcGVyY2FzZShjb25maWcubWV0aG9kKTsNCi0NCi0gICAgICB2YXIgc2VydmVyUmVxdWVzdCA9IGZ1bmN0aW9uKGNvbmZpZykgew0KLSAgICAgICAgdmFyIGhlYWRlcnMgPSBjb25maWcuaGVhZGVyczsNCi0gICAgICAgIHZhciByZXFEYXRhID0gdHJhbnNmb3JtRGF0YShjb25maWcuZGF0YSwgaGVhZGVyc0dldHRlcihoZWFkZXJzKSwgdW5kZWZpbmVkLCBjb25maWcudHJhbnNmb3JtUmVxdWVzdCk7DQotDQotICAgICAgICAvLyBzdHJpcCBjb250ZW50LXR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWQNCi0gICAgICAgIGlmIChpc1VuZGVmaW5lZChyZXFEYXRhKSkgew0KLSAgICAgICAgICBmb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uKHZhbHVlLCBoZWFkZXIpIHsNCi0gICAgICAgICAgICBpZiAobG93ZXJjYXNlKGhlYWRlcikgPT09ICdjb250ZW50LXR5cGUnKSB7DQotICAgICAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzW2hlYWRlcl07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChpc1VuZGVmaW5lZChjb25maWcud2l0aENyZWRlbnRpYWxzKSAmJiAhaXNVbmRlZmluZWQoZGVmYXVsdHMud2l0aENyZWRlbnRpYWxzKSkgew0KLSAgICAgICAgICBjb25maWcud2l0aENyZWRlbnRpYWxzID0gZGVmYXVsdHMud2l0aENyZWRlbnRpYWxzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gc2VuZCByZXF1ZXN0DQotICAgICAgICByZXR1cm4gc2VuZFJlcShjb25maWcsIHJlcURhdGEpLnRoZW4odHJhbnNmb3JtUmVzcG9uc2UsIHRyYW5zZm9ybVJlc3BvbnNlKTsNCi0gICAgICB9Ow0KLQ0KLSAgICAgIHZhciBjaGFpbiA9IFtzZXJ2ZXJSZXF1ZXN0LCB1bmRlZmluZWRdOw0KLSAgICAgIHZhciBwcm9taXNlID0gJHEud2hlbihjb25maWcpOw0KLQ0KLSAgICAgIC8vIGFwcGx5IGludGVyY2VwdG9ycw0KLSAgICAgIGZvckVhY2gocmV2ZXJzZWRJbnRlcmNlcHRvcnMsIGZ1bmN0aW9uKGludGVyY2VwdG9yKSB7DQotICAgICAgICBpZiAoaW50ZXJjZXB0b3IucmVxdWVzdCB8fCBpbnRlcmNlcHRvci5yZXF1ZXN0RXJyb3IpIHsNCi0gICAgICAgICAgY2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5yZXF1ZXN0LCBpbnRlcmNlcHRvci5yZXF1ZXN0RXJyb3IpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGludGVyY2VwdG9yLnJlc3BvbnNlIHx8IGludGVyY2VwdG9yLnJlc3BvbnNlRXJyb3IpIHsNCi0gICAgICAgICAgY2hhaW4ucHVzaChpbnRlcmNlcHRvci5yZXNwb25zZSwgaW50ZXJjZXB0b3IucmVzcG9uc2VFcnJvcik7DQotICAgICAgICB9DQotICAgICAgfSk7DQotDQotICAgICAgd2hpbGUgKGNoYWluLmxlbmd0aCkgew0KLSAgICAgICAgdmFyIHRoZW5GbiA9IGNoYWluLnNoaWZ0KCk7DQotICAgICAgICB2YXIgcmVqZWN0Rm4gPSBjaGFpbi5zaGlmdCgpOw0KLQ0KLSAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbih0aGVuRm4sIHJlamVjdEZuKTsNCi0gICAgICB9DQotDQotICAgICAgcHJvbWlzZS5zdWNjZXNzID0gZnVuY3Rpb24oZm4pIHsNCi0gICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICAgICAgICBmbihyZXNwb25zZS5kYXRhLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMsIGNvbmZpZyk7DQotICAgICAgICB9KTsNCi0gICAgICAgIHJldHVybiBwcm9taXNlOw0KLSAgICAgIH07DQotDQotICAgICAgcHJvbWlzZS5lcnJvciA9IGZ1bmN0aW9uKGZuKSB7DQotICAgICAgICBwcm9taXNlLnRoZW4obnVsbCwgZnVuY3Rpb24ocmVzcG9uc2UpIHsNCi0gICAgICAgICAgZm4ocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLCBjb25maWcpOw0KLSAgICAgICAgfSk7DQotICAgICAgICByZXR1cm4gcHJvbWlzZTsNCi0gICAgICB9Ow0KLQ0KLSAgICAgIHJldHVybiBwcm9taXNlOw0KLQ0KLSAgICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKHJlc3BvbnNlKSB7DQotICAgICAgICAvLyBtYWtlIGEgY29weSBzaW5jZSB0aGUgcmVzcG9uc2UgbXVzdCBiZSBjYWNoZWFibGUNCi0gICAgICAgIHZhciByZXNwID0gZXh0ZW5kKHt9LCByZXNwb25zZSk7DQotICAgICAgICBpZiAoIXJlc3BvbnNlLmRhdGEpIHsNCi0gICAgICAgICAgcmVzcC5kYXRhID0gcmVzcG9uc2UuZGF0YTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIHJlc3AuZGF0YSA9IHRyYW5zZm9ybURhdGEocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2UuaGVhZGVycywgcmVzcG9uc2Uuc3RhdHVzLCBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIChpc1N1Y2Nlc3MocmVzcG9uc2Uuc3RhdHVzKSkNCi0gICAgICAgICAgPyByZXNwDQotICAgICAgICAgIDogJHEucmVqZWN0KHJlc3ApOw0KLSAgICAgIH0NCi0NCi0gICAgICBmdW5jdGlvbiBleGVjdXRlSGVhZGVyRm5zKGhlYWRlcnMpIHsNCi0gICAgICAgIHZhciBoZWFkZXJDb250ZW50LCBwcm9jZXNzZWRIZWFkZXJzID0ge307DQotDQotICAgICAgICBmb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uKGhlYWRlckZuLCBoZWFkZXIpIHsNCi0gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oaGVhZGVyRm4pKSB7DQotICAgICAgICAgICAgaGVhZGVyQ29udGVudCA9IGhlYWRlckZuKCk7DQotICAgICAgICAgICAgaWYgKGhlYWRlckNvbnRlbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgcHJvY2Vzc2VkSGVhZGVyc1toZWFkZXJdID0gaGVhZGVyQ29udGVudDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcHJvY2Vzc2VkSGVhZGVyc1toZWFkZXJdID0gaGVhZGVyRm47DQotICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEhlYWRlcnM7DQotICAgICAgfQ0KLQ0KLSAgICAgIGZ1bmN0aW9uIG1lcmdlSGVhZGVycyhjb25maWcpIHsNCi0gICAgICAgIHZhciBkZWZIZWFkZXJzID0gZGVmYXVsdHMuaGVhZGVycywNCi0gICAgICAgICAgICByZXFIZWFkZXJzID0gZXh0ZW5kKHt9LCBjb25maWcuaGVhZGVycyksDQotICAgICAgICAgICAgZGVmSGVhZGVyTmFtZSwgbG93ZXJjYXNlRGVmSGVhZGVyTmFtZSwgcmVxSGVhZGVyTmFtZTsNCi0NCi0gICAgICAgIGRlZkhlYWRlcnMgPSBleHRlbmQoe30sIGRlZkhlYWRlcnMuY29tbW9uLCBkZWZIZWFkZXJzW2xvd2VyY2FzZShjb25maWcubWV0aG9kKV0pOw0KLQ0KLSAgICAgICAgLy8gdXNpbmcgZm9yLWluIGluc3RlYWQgb2YgZm9yRWFjaCB0byBhdm9pZCB1bmVjZXNzYXJ5IGl0ZXJhdGlvbiBhZnRlciBoZWFkZXIgaGFzIGJlZW4gZm91bmQNCi0gICAgICAgIGRlZmF1bHRIZWFkZXJzSXRlcmF0aW9uOg0KLSAgICAgICAgZm9yIChkZWZIZWFkZXJOYW1lIGluIGRlZkhlYWRlcnMpIHsNCi0gICAgICAgICAgbG93ZXJjYXNlRGVmSGVhZGVyTmFtZSA9IGxvd2VyY2FzZShkZWZIZWFkZXJOYW1lKTsNCi0NCi0gICAgICAgICAgZm9yIChyZXFIZWFkZXJOYW1lIGluIHJlcUhlYWRlcnMpIHsNCi0gICAgICAgICAgICBpZiAobG93ZXJjYXNlKHJlcUhlYWRlck5hbWUpID09PSBsb3dlcmNhc2VEZWZIZWFkZXJOYW1lKSB7DQotICAgICAgICAgICAgICBjb250aW51ZSBkZWZhdWx0SGVhZGVyc0l0ZXJhdGlvbjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgcmVxSGVhZGVyc1tkZWZIZWFkZXJOYW1lXSA9IGRlZkhlYWRlcnNbZGVmSGVhZGVyTmFtZV07DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBleGVjdXRlIGlmIGhlYWRlciB2YWx1ZSBpcyBhIGZ1bmN0aW9uIGZvciBtZXJnZWQgaGVhZGVycw0KLSAgICAgICAgcmV0dXJuIGV4ZWN1dGVIZWFkZXJGbnMocmVxSGVhZGVycyk7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgICRodHRwLnBlbmRpbmdSZXF1ZXN0cyA9IFtdOw0KLQ0KLSAgICAvKioNCi0gICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgKiBAbmFtZSAkaHR0cCNnZXQNCi0gICAgICoNCi0gICAgICogQGRlc2NyaXB0aW9uDQotICAgICAqIFNob3J0Y3V0IG1ldGhvZCB0byBwZXJmb3JtIGBHRVRgIHJlcXVlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0DQotICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gRnV0dXJlIG9iamVjdA0KLSAgICAgKi8NCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICogQG5hbWUgJGh0dHAjZGVsZXRlDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgREVMRVRFYCByZXF1ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFJlbGF0aXZlIG9yIGFic29sdXRlIFVSTCBzcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdA0KLSAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IEZ1dHVyZSBvYmplY3QNCi0gICAgICovDQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRodHRwI2hlYWQNCi0gICAgICoNCi0gICAgICogQGRlc2NyaXB0aW9uDQotICAgICAqIFNob3J0Y3V0IG1ldGhvZCB0byBwZXJmb3JtIGBIRUFEYCByZXF1ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFJlbGF0aXZlIG9yIGFic29sdXRlIFVSTCBzcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdA0KLSAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IEZ1dHVyZSBvYmplY3QNCi0gICAgICovDQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRodHRwI2pzb25wDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgSlNPTlBgIHJlcXVlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0Lg0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgdGhlIHN0cmluZyBgSlNPTl9DQUxMQkFDS2AuDQotICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0DQotICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gRnV0dXJlIG9iamVjdA0KLSAgICAgKi8NCi0gICAgY3JlYXRlU2hvcnRNZXRob2RzKCdnZXQnLCAnZGVsZXRlJywgJ2hlYWQnLCAnanNvbnAnKTsNCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICogQG5hbWUgJGh0dHAjcG9zdA0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gYFBPU1RgIHJlcXVlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBSZXF1ZXN0IGNvbnRlbnQNCi0gICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QNCi0gICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBGdXR1cmUgb2JqZWN0DQotICAgICAqLw0KLQ0KLSAgICAvKioNCi0gICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgKiBAbmFtZSAkaHR0cCNwdXQNCi0gICAgICoNCi0gICAgICogQGRlc2NyaXB0aW9uDQotICAgICAqIFNob3J0Y3V0IG1ldGhvZCB0byBwZXJmb3JtIGBQVVRgIHJlcXVlc3QuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBSZXF1ZXN0IGNvbnRlbnQNCi0gICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QNCi0gICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBGdXR1cmUgb2JqZWN0DQotICAgICAqLw0KLQ0KLSAgICAgLyoqDQotICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgKiBAbmFtZSAkaHR0cCNwYXRjaA0KLSAgICAgICoNCi0gICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gYFBBVENIYCByZXF1ZXN0Lg0KLSAgICAgICoNCi0gICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0DQotICAgICAgKiBAcGFyYW0geyp9IGRhdGEgUmVxdWVzdCBjb250ZW50DQotICAgICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdA0KLSAgICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBGdXR1cmUgb2JqZWN0DQotICAgICAgKi8NCi0gICAgY3JlYXRlU2hvcnRNZXRob2RzV2l0aERhdGEoJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJyk7DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIEBuZ2RvYyBwcm9wZXJ0eQ0KLSAgICAgICAgICogQG5hbWUgJGh0dHAjZGVmYXVsdHMNCi0gICAgICAgICAqDQotICAgICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgICAqIFJ1bnRpbWUgZXF1aXZhbGVudCBvZiB0aGUgYCRodHRwUHJvdmlkZXIuZGVmYXVsdHNgIHByb3BlcnR5LiBBbGxvd3MgY29uZmlndXJhdGlvbiBvZg0KLSAgICAgICAgICogZGVmYXVsdCBoZWFkZXJzLCB3aXRoQ3JlZGVudGlhbHMgYXMgd2VsbCBhcyByZXF1ZXN0IGFuZCByZXNwb25zZSB0cmFuc2Zvcm1hdGlvbnMuDQotICAgICAgICAgKg0KLSAgICAgICAgICogU2VlICJTZXR0aW5nIEhUVFAgSGVhZGVycyIgYW5kICJUcmFuc2Zvcm1pbmcgUmVxdWVzdHMgYW5kIFJlc3BvbnNlcyIgc2VjdGlvbnMgYWJvdmUuDQotICAgICAgICAgKi8NCi0gICAgJGh0dHAuZGVmYXVsdHMgPSBkZWZhdWx0czsNCi0NCi0NCi0gICAgcmV0dXJuICRodHRwOw0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBjcmVhdGVTaG9ydE1ldGhvZHMobmFtZXMpIHsNCi0gICAgICBmb3JFYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24obmFtZSkgew0KLSAgICAgICAgJGh0dHBbbmFtZV0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykgew0KLSAgICAgICAgICByZXR1cm4gJGh0dHAoZXh0ZW5kKGNvbmZpZyB8fCB7fSwgew0KLSAgICAgICAgICAgIG1ldGhvZDogbmFtZSwNCi0gICAgICAgICAgICB1cmw6IHVybA0KLSAgICAgICAgICB9KSk7DQotICAgICAgICB9Ow0KLSAgICAgIH0pOw0KLSAgICB9DQotDQotDQotICAgIGZ1bmN0aW9uIGNyZWF0ZVNob3J0TWV0aG9kc1dpdGhEYXRhKG5hbWUpIHsNCi0gICAgICBmb3JFYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24obmFtZSkgew0KLSAgICAgICAgJGh0dHBbbmFtZV0gPSBmdW5jdGlvbih1cmwsIGRhdGEsIGNvbmZpZykgew0KLSAgICAgICAgICByZXR1cm4gJGh0dHAoZXh0ZW5kKGNvbmZpZyB8fCB7fSwgew0KLSAgICAgICAgICAgIG1ldGhvZDogbmFtZSwNCi0gICAgICAgICAgICB1cmw6IHVybCwNCi0gICAgICAgICAgICBkYXRhOiBkYXRhDQotICAgICAgICAgIH0pKTsNCi0gICAgICAgIH07DQotICAgICAgfSk7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIE1ha2VzIHRoZSByZXF1ZXN0Lg0KLSAgICAgKg0KLSAgICAgKiAhISEgQUNDRVNTRVMgQ0xPU1VSRSBWQVJTOg0KLSAgICAgKiAkaHR0cEJhY2tlbmQsIGRlZmF1bHRzLCAkbG9nLCAkcm9vdFNjb3BlLCBkZWZhdWx0Q2FjaGUsICRodHRwLnBlbmRpbmdSZXF1ZXN0cw0KLSAgICAgKi8NCi0gICAgZnVuY3Rpb24gc2VuZFJlcShjb25maWcsIHJlcURhdGEpIHsNCi0gICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpLA0KLSAgICAgICAgICBwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZSwNCi0gICAgICAgICAgY2FjaGUsDQotICAgICAgICAgIGNhY2hlZFJlc3AsDQotICAgICAgICAgIHJlcUhlYWRlcnMgPSBjb25maWcuaGVhZGVycywNCi0gICAgICAgICAgdXJsID0gYnVpbGRVcmwoY29uZmlnLnVybCwgY29uZmlnLnBhcmFtcyk7DQotDQotICAgICAgJGh0dHAucGVuZGluZ1JlcXVlc3RzLnB1c2goY29uZmlnKTsNCi0gICAgICBwcm9taXNlLnRoZW4ocmVtb3ZlUGVuZGluZ1JlcSwgcmVtb3ZlUGVuZGluZ1JlcSk7DQotDQotDQotICAgICAgaWYgKChjb25maWcuY2FjaGUgfHwgZGVmYXVsdHMuY2FjaGUpICYmIGNvbmZpZy5jYWNoZSAhPT0gZmFsc2UgJiYNCi0gICAgICAgICAgKGNvbmZpZy5tZXRob2QgPT09ICdHRVQnIHx8IGNvbmZpZy5tZXRob2QgPT09ICdKU09OUCcpKSB7DQotICAgICAgICBjYWNoZSA9IGlzT2JqZWN0KGNvbmZpZy5jYWNoZSkgPyBjb25maWcuY2FjaGUNCi0gICAgICAgICAgICAgIDogaXNPYmplY3QoZGVmYXVsdHMuY2FjaGUpID8gZGVmYXVsdHMuY2FjaGUNCi0gICAgICAgICAgICAgIDogZGVmYXVsdENhY2hlOw0KLSAgICAgIH0NCi0NCi0gICAgICBpZiAoY2FjaGUpIHsNCi0gICAgICAgIGNhY2hlZFJlc3AgPSBjYWNoZS5nZXQodXJsKTsNCi0gICAgICAgIGlmIChpc0RlZmluZWQoY2FjaGVkUmVzcCkpIHsNCi0gICAgICAgICAgaWYgKGlzUHJvbWlzZUxpa2UoY2FjaGVkUmVzcCkpIHsNCi0gICAgICAgICAgICAvLyBjYWNoZWQgcmVxdWVzdCBoYXMgYWxyZWFkeSBiZWVuIHNlbnQsIGJ1dCB0aGVyZSBpcyBubyByZXNwb25zZSB5ZXQNCi0gICAgICAgICAgICBjYWNoZWRSZXNwLnRoZW4ocmVzb2x2ZVByb21pc2VXaXRoUmVzdWx0LCByZXNvbHZlUHJvbWlzZVdpdGhSZXN1bHQpOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIHNlcnZpbmcgZnJvbSBjYWNoZQ0KLSAgICAgICAgICAgIGlmIChpc0FycmF5KGNhY2hlZFJlc3ApKSB7DQotICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShjYWNoZWRSZXNwWzFdLCBjYWNoZWRSZXNwWzBdLCBzaGFsbG93Q29weShjYWNoZWRSZXNwWzJdKSwgY2FjaGVkUmVzcFszXSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKGNhY2hlZFJlc3AsIDIwMCwge30sICdPSycpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgLy8gcHV0IHRoZSBwcm9taXNlIGZvciB0aGUgbm9uLXRyYW5zZm9ybWVkIHJlc3BvbnNlIGludG8gY2FjaGUgYXMgYSBwbGFjZWhvbGRlcg0KLSAgICAgICAgICBjYWNoZS5wdXQodXJsLCBwcm9taXNlKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotDQotICAgICAgLy8gaWYgd2Ugd29uJ3QgaGF2ZSB0aGUgcmVzcG9uc2UgaW4gY2FjaGUsIHNldCB0aGUgeHNyZiBoZWFkZXJzIGFuZA0KLSAgICAgIC8vIHNlbmQgdGhlIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQNCi0gICAgICBpZiAoaXNVbmRlZmluZWQoY2FjaGVkUmVzcCkpIHsNCi0gICAgICAgIHZhciB4c3JmVmFsdWUgPSB1cmxJc1NhbWVPcmlnaW4oY29uZmlnLnVybCkNCi0gICAgICAgICAgICA/ICRicm93c2VyLmNvb2tpZXMoKVtjb25maWcueHNyZkNvb2tpZU5hbWUgfHwgZGVmYXVsdHMueHNyZkNvb2tpZU5hbWVdDQotICAgICAgICAgICAgOiB1bmRlZmluZWQ7DQotICAgICAgICBpZiAoeHNyZlZhbHVlKSB7DQotICAgICAgICAgIHJlcUhlYWRlcnNbKGNvbmZpZy54c3JmSGVhZGVyTmFtZSB8fCBkZWZhdWx0cy54c3JmSGVhZGVyTmFtZSldID0geHNyZlZhbHVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgJGh0dHBCYWNrZW5kKGNvbmZpZy5tZXRob2QsIHVybCwgcmVxRGF0YSwgZG9uZSwgcmVxSGVhZGVycywgY29uZmlnLnRpbWVvdXQsDQotICAgICAgICAgICAgY29uZmlnLndpdGhDcmVkZW50aWFscywgY29uZmlnLnJlc3BvbnNlVHlwZSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIHJldHVybiBwcm9taXNlOw0KLQ0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqIENhbGxiYWNrIHJlZ2lzdGVyZWQgdG8gJGh0dHBCYWNrZW5kKCk6DQotICAgICAgICogIC0gY2FjaGVzIHRoZSByZXNwb25zZSBpZiBkZXNpcmVkDQotICAgICAgICogIC0gcmVzb2x2ZXMgdGhlIHJhdyAkaHR0cCBwcm9taXNlDQotICAgICAgICogIC0gY2FsbHMgJGFwcGx5DQotICAgICAgICovDQotICAgICAgZnVuY3Rpb24gZG9uZShzdGF0dXMsIHJlc3BvbnNlLCBoZWFkZXJzU3RyaW5nLCBzdGF0dXNUZXh0KSB7DQotICAgICAgICBpZiAoY2FjaGUpIHsNCi0gICAgICAgICAgaWYgKGlzU3VjY2VzcyhzdGF0dXMpKSB7DQotICAgICAgICAgICAgY2FjaGUucHV0KHVybCwgW3N0YXR1cywgcmVzcG9uc2UsIHBhcnNlSGVhZGVycyhoZWFkZXJzU3RyaW5nKSwgc3RhdHVzVGV4dF0pOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIHJlbW92ZSBwcm9taXNlIGZyb20gdGhlIGNhY2hlDQotICAgICAgICAgICAgY2FjaGUucmVtb3ZlKHVybCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZ1bmN0aW9uIHJlc29sdmVIdHRwUHJvbWlzZSgpIHsNCi0gICAgICAgICAgcmVzb2x2ZVByb21pc2UocmVzcG9uc2UsIHN0YXR1cywgaGVhZGVyc1N0cmluZywgc3RhdHVzVGV4dCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodXNlQXBwbHlBc3luYykgew0KLSAgICAgICAgICAkcm9vdFNjb3BlLiRhcHBseUFzeW5jKHJlc29sdmVIdHRwUHJvbWlzZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICByZXNvbHZlSHR0cFByb21pc2UoKTsNCi0gICAgICAgICAgaWYgKCEkcm9vdFNjb3BlLiQkcGhhc2UpICRyb290U2NvcGUuJGFwcGx5KCk7DQotICAgICAgICB9DQotICAgICAgfQ0KLQ0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqIFJlc29sdmVzIHRoZSByYXcgJGh0dHAgcHJvbWlzZS4NCi0gICAgICAgKi8NCi0gICAgICBmdW5jdGlvbiByZXNvbHZlUHJvbWlzZShyZXNwb25zZSwgc3RhdHVzLCBoZWFkZXJzLCBzdGF0dXNUZXh0KSB7DQotICAgICAgICAvLyBub3JtYWxpemUgaW50ZXJuYWwgc3RhdHVzZXMgdG8gMA0KLSAgICAgICAgc3RhdHVzID0gTWF0aC5tYXgoc3RhdHVzLCAwKTsNCi0NCi0gICAgICAgIChpc1N1Y2Nlc3Moc3RhdHVzKSA/IGRlZmVycmVkLnJlc29sdmUgOiBkZWZlcnJlZC5yZWplY3QpKHsNCi0gICAgICAgICAgZGF0YTogcmVzcG9uc2UsDQotICAgICAgICAgIHN0YXR1czogc3RhdHVzLA0KLSAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzR2V0dGVyKGhlYWRlcnMpLA0KLSAgICAgICAgICBjb25maWc6IGNvbmZpZywNCi0gICAgICAgICAgc3RhdHVzVGV4dDogc3RhdHVzVGV4dA0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlV2l0aFJlc3VsdChyZXN1bHQpIHsNCi0gICAgICAgIHJlc29sdmVQcm9taXNlKHJlc3VsdC5kYXRhLCByZXN1bHQuc3RhdHVzLCBzaGFsbG93Q29weShyZXN1bHQuaGVhZGVycygpKSwgcmVzdWx0LnN0YXR1c1RleHQpOw0KLSAgICAgIH0NCi0NCi0gICAgICBmdW5jdGlvbiByZW1vdmVQZW5kaW5nUmVxKCkgew0KLSAgICAgICAgdmFyIGlkeCA9ICRodHRwLnBlbmRpbmdSZXF1ZXN0cy5pbmRleE9mKGNvbmZpZyk7DQotICAgICAgICBpZiAoaWR4ICE9PSAtMSkgJGh0dHAucGVuZGluZ1JlcXVlc3RzLnNwbGljZShpZHgsIDEpOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBidWlsZFVybCh1cmwsIHBhcmFtcykgew0KLSAgICAgIGlmICghcGFyYW1zKSByZXR1cm4gdXJsOw0KLSAgICAgIHZhciBwYXJ0cyA9IFtdOw0KLSAgICAgIGZvckVhY2hTb3J0ZWQocGFyYW1zLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7DQotICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm47DQotICAgICAgICBpZiAoIWlzQXJyYXkodmFsdWUpKSB2YWx1ZSA9IFt2YWx1ZV07DQotDQotICAgICAgICBmb3JFYWNoKHZhbHVlLCBmdW5jdGlvbih2KSB7DQotICAgICAgICAgIGlmIChpc09iamVjdCh2KSkgew0KLSAgICAgICAgICAgIGlmIChpc0RhdGUodikpIHsNCi0gICAgICAgICAgICAgIHYgPSB2LnRvSVNPU3RyaW5nKCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgIHYgPSB0b0pzb24odik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9DQotICAgICAgICAgIHBhcnRzLnB1c2goZW5jb2RlVXJpUXVlcnkoa2V5KSArICc9JyArDQotICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVXJpUXVlcnkodikpOw0KLSAgICAgICAgfSk7DQotICAgICAgfSk7DQotICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDApIHsNCi0gICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCc/JykgPT0gLTEpID8gJz8nIDogJyYnKSArIHBhcnRzLmpvaW4oJyYnKTsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHVybDsNCi0gICAgfQ0KLSAgfV07DQotfQ0KLQ0KLWZ1bmN0aW9uIGNyZWF0ZVhocigpIHsNCi0gICAgcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsNCi19DQotDQotLyoqDQotICogQG5nZG9jIHNlcnZpY2UNCi0gKiBAbmFtZSAkaHR0cEJhY2tlbmQNCi0gKiBAcmVxdWlyZXMgJHdpbmRvdw0KLSAqIEByZXF1aXJlcyAkZG9jdW1lbnQNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEhUVFAgYmFja2VuZCB1c2VkIGJ5IHRoZSB7QGxpbmsgbmcuJGh0dHAgc2VydmljZX0gdGhhdCBkZWxlZ2F0ZXMgdG8NCi0gKiBYTUxIdHRwUmVxdWVzdCBvYmplY3Qgb3IgSlNPTlAgYW5kIGRlYWxzIHdpdGggYnJvd3NlciBpbmNvbXBhdGliaWxpdGllcy4NCi0gKg0KLSAqIFlvdSBzaG91bGQgbmV2ZXIgbmVlZCB0byB1c2UgdGhpcyBzZXJ2aWNlIGRpcmVjdGx5LCBpbnN0ZWFkIHVzZSB0aGUgaGlnaGVyLWxldmVsIGFic3RyYWN0aW9uczoNCi0gKiB7QGxpbmsgbmcuJGh0dHAgJGh0dHB9IG9yIHtAbGluayBuZ1Jlc291cmNlLiRyZXNvdXJjZSAkcmVzb3VyY2V9Lg0KLSAqDQotICogRHVyaW5nIHRlc3RpbmcgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzd2FwcGVkIHdpdGgge0BsaW5rIG5nTW9jay4kaHR0cEJhY2tlbmQgbW9jaw0KLSAqICRodHRwQmFja2VuZH0gd2hpY2ggY2FuIGJlIHRyYWluZWQgd2l0aCByZXNwb25zZXMuDQotICovDQotZnVuY3Rpb24gJEh0dHBCYWNrZW5kUHJvdmlkZXIoKSB7DQotICB0aGlzLiRnZXQgPSBbJyRicm93c2VyJywgJyR3aW5kb3cnLCAnJGRvY3VtZW50JywgZnVuY3Rpb24oJGJyb3dzZXIsICR3aW5kb3csICRkb2N1bWVudCkgew0KLSAgICByZXR1cm4gY3JlYXRlSHR0cEJhY2tlbmQoJGJyb3dzZXIsIGNyZWF0ZVhociwgJGJyb3dzZXIuZGVmZXIsICR3aW5kb3cuYW5ndWxhci5jYWxsYmFja3MsICRkb2N1bWVudFswXSk7DQotICB9XTsNCi19DQotDQotZnVuY3Rpb24gY3JlYXRlSHR0cEJhY2tlbmQoJGJyb3dzZXIsIGNyZWF0ZVhociwgJGJyb3dzZXJEZWZlciwgY2FsbGJhY2tzLCByYXdEb2N1bWVudCkgew0KLSAgLy8gVE9ETyh2b2p0YSk6IGZpeCB0aGUgc2lnbmF0dXJlDQotICByZXR1cm4gZnVuY3Rpb24obWV0aG9kLCB1cmwsIHBvc3QsIGNhbGxiYWNrLCBoZWFkZXJzLCB0aW1lb3V0LCB3aXRoQ3JlZGVudGlhbHMsIHJlc3BvbnNlVHlwZSkgew0KLSAgICAkYnJvd3Nlci4kJGluY091dHN0YW5kaW5nUmVxdWVzdENvdW50KCk7DQotICAgIHVybCA9IHVybCB8fCAkYnJvd3Nlci51cmwoKTsNCi0NCi0gICAgaWYgKGxvd2VyY2FzZShtZXRob2QpID09ICdqc29ucCcpIHsNCi0gICAgICB2YXIgY2FsbGJhY2tJZCA9ICdfJyArIChjYWxsYmFja3MuY291bnRlcisrKS50b1N0cmluZygzNik7DQotICAgICAgY2FsbGJhY2tzW2NhbGxiYWNrSWRdID0gZnVuY3Rpb24oZGF0YSkgew0KLSAgICAgICAgY2FsbGJhY2tzW2NhbGxiYWNrSWRdLmRhdGEgPSBkYXRhOw0KLSAgICAgICAgY2FsbGJhY2tzW2NhbGxiYWNrSWRdLmNhbGxlZCA9IHRydWU7DQotICAgICAgfTsNCi0NCi0gICAgICB2YXIganNvbnBEb25lID0ganNvbnBSZXEodXJsLnJlcGxhY2UoJ0pTT05fQ0FMTEJBQ0snLCAnYW5ndWxhci5jYWxsYmFja3MuJyArIGNhbGxiYWNrSWQpLA0KLSAgICAgICAgICBjYWxsYmFja0lkLCBmdW5jdGlvbihzdGF0dXMsIHRleHQpIHsNCi0gICAgICAgIGNvbXBsZXRlUmVxdWVzdChjYWxsYmFjaywgc3RhdHVzLCBjYWxsYmFja3NbY2FsbGJhY2tJZF0uZGF0YSwgIiIsIHRleHQpOw0KLSAgICAgICAgY2FsbGJhY2tzW2NhbGxiYWNrSWRdID0gbm9vcDsNCi0gICAgICB9KTsNCi0gICAgfSBlbHNlIHsNCi0NCi0gICAgICB2YXIgeGhyID0gY3JlYXRlWGhyKCk7DQotDQotICAgICAgeGhyLm9wZW4obWV0aG9kLCB1cmwsIHRydWUpOw0KLSAgICAgIGZvckVhY2goaGVhZGVycywgZnVuY3Rpb24odmFsdWUsIGtleSkgew0KLSAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHsNCi0gICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICB9KTsNCi0NCi0gICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gcmVxdWVzdExvYWRlZCgpIHsNCi0gICAgICAgIHZhciBzdGF0dXNUZXh0ID0geGhyLnN0YXR1c1RleHQgfHwgJyc7DQotDQotICAgICAgICAvLyByZXNwb25zZVRleHQgaXMgdGhlIG9sZC1zY2hvb2wgd2F5IG9mIHJldHJpZXZpbmcgcmVzcG9uc2UgKHN1cHBvcnRlZCBieSBJRTggJiA5KQ0KLSAgICAgICAgLy8gcmVzcG9uc2UvcmVzcG9uc2VUeXBlIHByb3BlcnRpZXMgd2VyZSBpbnRyb2R1Y2VkIGluIFhIUiBMZXZlbDIgc3BlYyAoc3VwcG9ydGVkIGJ5IElFMTApDQotICAgICAgICB2YXIgcmVzcG9uc2UgPSAoJ3Jlc3BvbnNlJyBpbiB4aHIpID8geGhyLnJlc3BvbnNlIDogeGhyLnJlc3BvbnNlVGV4dDsNCi0NCi0gICAgICAgIC8vIG5vcm1hbGl6ZSBJRTkgYnVnIChodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xNDUwKQ0KLSAgICAgICAgdmFyIHN0YXR1cyA9IHhoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiB4aHIuc3RhdHVzOw0KLQ0KLSAgICAgICAgLy8gZml4IHN0YXR1cyBjb2RlIHdoZW4gaXQgaXMgMCAoMCBzdGF0dXMgaXMgdW5kb2N1bWVudGVkKS4NCi0gICAgICAgIC8vIE9jY3VycyB3aGVuIGFjY2Vzc2luZyBmaWxlIHJlc291cmNlcyBvciBvbiBBbmRyb2lkIDQuMSBzdG9jayBicm93c2VyDQotICAgICAgICAvLyB3aGlsZSByZXRyaWV2aW5nIGZpbGVzIGZyb20gYXBwbGljYXRpb24gY2FjaGUuDQotICAgICAgICBpZiAoc3RhdHVzID09PSAwKSB7DQotICAgICAgICAgIHN0YXR1cyA9IHJlc3BvbnNlID8gMjAwIDogdXJsUmVzb2x2ZSh1cmwpLnByb3RvY29sID09ICdmaWxlJyA/IDQwNCA6IDA7DQotICAgICAgICB9DQotDQotICAgICAgICBjb21wbGV0ZVJlcXVlc3QoY2FsbGJhY2ssDQotICAgICAgICAgICAgc3RhdHVzLA0KLSAgICAgICAgICAgIHJlc3BvbnNlLA0KLSAgICAgICAgICAgIHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSwNCi0gICAgICAgICAgICBzdGF0dXNUZXh0KTsNCi0gICAgICB9Ow0KLQ0KLSAgICAgIHZhciByZXF1ZXN0RXJyb3IgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgIC8vIFRoZSByZXNwb25zZSBpcyBhbHdheXMgZW1wdHkNCi0gICAgICAgIC8vIFNlZSBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3QtZXJyb3Itc3RlcHMgYW5kIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LW5ldHdvcmstZXJyb3INCi0gICAgICAgIGNvbXBsZXRlUmVxdWVzdChjYWxsYmFjaywgLTEsIG51bGwsIG51bGwsICcnKTsNCi0gICAgICB9Ow0KLQ0KLSAgICAgIHhoci5vbmVycm9yID0gcmVxdWVzdEVycm9yOw0KLSAgICAgIHhoci5vbmFib3J0ID0gcmVxdWVzdEVycm9yOw0KLQ0KLSAgICAgIGlmICh3aXRoQ3JlZGVudGlhbHMpIHsNCi0gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlOw0KLSAgICAgIH0NCi0NCi0gICAgICBpZiAocmVzcG9uc2VUeXBlKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlOw0KLSAgICAgICAgfSBjYXRjaCAoZSkgew0KLSAgICAgICAgICAvLyBXZWJLaXQgYWRkZWQgc3VwcG9ydCBmb3IgdGhlIGpzb24gcmVzcG9uc2VUeXBlIHZhbHVlIG9uIDA5LzAzLzIwMTMNCi0gICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNjQ4LiBWZXJzaW9ucyBvZiBTYWZhcmkgcHJpb3IgdG8gNyBhcmUNCi0gICAgICAgICAgLy8ga25vd24gdG8gdGhyb3cgd2hlbiBzZXR0aW5nIHRoZSB2YWx1ZSAianNvbiIgYXMgdGhlIHJlc3BvbnNlIHR5cGUuIE90aGVyIG9sZGVyDQotICAgICAgICAgIC8vIGJyb3dzZXJzIGltcGxlbWVudGluZyB0aGUgcmVzcG9uc2VUeXBlDQotICAgICAgICAgIC8vDQotICAgICAgICAgIC8vIFRoZSBqc29uIHJlc3BvbnNlIHR5cGUgY2FuIGJlIGlnbm9yZWQgaWYgbm90IHN1cHBvcnRlZCwgYmVjYXVzZSBKU09OIHBheWxvYWRzIGFyZQ0KLSAgICAgICAgICAvLyBwYXJzZWQgb24gdGhlIGNsaWVudC1zaWRlIHJlZ2FyZGxlc3MuDQotICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgIT09ICdqc29uJykgew0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotICAgICAgeGhyLnNlbmQocG9zdCB8fCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBpZiAodGltZW91dCA+IDApIHsNCi0gICAgICB2YXIgdGltZW91dElkID0gJGJyb3dzZXJEZWZlcih0aW1lb3V0UmVxdWVzdCwgdGltZW91dCk7DQotICAgIH0gZWxzZSBpZiAoaXNQcm9taXNlTGlrZSh0aW1lb3V0KSkgew0KLSAgICAgIHRpbWVvdXQudGhlbih0aW1lb3V0UmVxdWVzdCk7DQotICAgIH0NCi0NCi0NCi0gICAgZnVuY3Rpb24gdGltZW91dFJlcXVlc3QoKSB7DQotICAgICAganNvbnBEb25lICYmIGpzb25wRG9uZSgpOw0KLSAgICAgIHhociAmJiB4aHIuYWJvcnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoY2FsbGJhY2ssIHN0YXR1cywgcmVzcG9uc2UsIGhlYWRlcnNTdHJpbmcsIHN0YXR1c1RleHQpIHsNCi0gICAgICAvLyBjYW5jZWwgdGltZW91dCBhbmQgc3Vic2VxdWVudCB0aW1lb3V0IHByb21pc2UgcmVzb2x1dGlvbg0KLSAgICAgIGlmICh0aW1lb3V0SWQgIT09IHVuZGVmaW5lZCkgew0KLSAgICAgICAgJGJyb3dzZXJEZWZlci5jYW5jZWwodGltZW91dElkKTsNCi0gICAgICB9DQotICAgICAganNvbnBEb25lID0geGhyID0gbnVsbDsNCi0NCi0gICAgICBjYWxsYmFjayhzdGF0dXMsIHJlc3BvbnNlLCBoZWFkZXJzU3RyaW5nLCBzdGF0dXNUZXh0KTsNCi0gICAgICAkYnJvd3Nlci4kJGNvbXBsZXRlT3V0c3RhbmRpbmdSZXF1ZXN0KG5vb3ApOw0KLSAgICB9DQotICB9Ow0KLQ0KLSAgZnVuY3Rpb24ganNvbnBSZXEodXJsLCBjYWxsYmFja0lkLCBkb25lKSB7DQotICAgIC8vIHdlIGNhbid0IHVzZSBqUXVlcnkvanFMaXRlIGhlcmUgYmVjYXVzZSBqUXVlcnkgZG9lcyBjcmF6eSBzaGl0IHdpdGggc2NyaXB0IGVsZW1lbnRzLCBlLmcuOg0KLSAgICAvLyAtIGZldGNoZXMgbG9jYWwgc2NyaXB0cyB2aWEgWEhSIGFuZCBldmFscyB0aGVtDQotICAgIC8vIC0gYWRkcyBhbmQgaW1tZWRpYXRlbHkgcmVtb3ZlcyBzY3JpcHQgZWxlbWVudHMgZnJvbSB0aGUgZG9jdW1lbnQNCi0gICAgdmFyIHNjcmlwdCA9IHJhd0RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpLCBjYWxsYmFjayA9IG51bGw7DQotICAgIHNjcmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7DQotICAgIHNjcmlwdC5zcmMgPSB1cmw7DQotICAgIHNjcmlwdC5hc3luYyA9IHRydWU7DQotDQotICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oZXZlbnQpIHsNCi0gICAgICByZW1vdmVFdmVudExpc3RlbmVyRm4oc2NyaXB0LCAibG9hZCIsIGNhbGxiYWNrKTsNCi0gICAgICByZW1vdmVFdmVudExpc3RlbmVyRm4oc2NyaXB0LCAiZXJyb3IiLCBjYWxsYmFjayk7DQotICAgICAgcmF3RG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzY3JpcHQpOw0KLSAgICAgIHNjcmlwdCA9IG51bGw7DQotICAgICAgdmFyIHN0YXR1cyA9IC0xOw0KLSAgICAgIHZhciB0ZXh0ID0gInVua25vd24iOw0KLQ0KLSAgICAgIGlmIChldmVudCkgew0KLSAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICJsb2FkIiAmJiAhY2FsbGJhY2tzW2NhbGxiYWNrSWRdLmNhbGxlZCkgew0KLSAgICAgICAgICBldmVudCA9IHsgdHlwZTogImVycm9yIiB9Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgdGV4dCA9IGV2ZW50LnR5cGU7DQotICAgICAgICBzdGF0dXMgPSBldmVudC50eXBlID09PSAiZXJyb3IiID8gNDA0IDogMjAwOw0KLSAgICAgIH0NCi0NCi0gICAgICBpZiAoZG9uZSkgew0KLSAgICAgICAgZG9uZShzdGF0dXMsIHRleHQpOw0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgYWRkRXZlbnRMaXN0ZW5lckZuKHNjcmlwdCwgImxvYWQiLCBjYWxsYmFjayk7DQotICAgIGFkZEV2ZW50TGlzdGVuZXJGbihzY3JpcHQsICJlcnJvciIsIGNhbGxiYWNrKTsNCi0gICAgcmF3RG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpOw0KLSAgICByZXR1cm4gY2FsbGJhY2s7DQotICB9DQotfQ0KLQ0KLXZhciAkaW50ZXJwb2xhdGVNaW5FcnIgPSBtaW5FcnIoJyRpbnRlcnBvbGF0ZScpOw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBwcm92aWRlcg0KLSAqIEBuYW1lICRpbnRlcnBvbGF0ZVByb3ZpZGVyDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKg0KLSAqIFVzZWQgZm9yIGNvbmZpZ3VyaW5nIHRoZSBpbnRlcnBvbGF0aW9uIG1hcmt1cC4gRGVmYXVsdHMgdG8gYHt7YCBhbmQgYH19YC4NCi0gKg0KLSAqIEBleGFtcGxlDQotPGV4YW1wbGUgbW9kdWxlPSJjdXN0b21JbnRlcnBvbGF0aW9uQXBwIj4NCi08ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi08c2NyaXB0Pg0KLSAgdmFyIGN1c3RvbUludGVycG9sYXRpb25BcHAgPSBhbmd1bGFyLm1vZHVsZSgnY3VzdG9tSW50ZXJwb2xhdGlvbkFwcCcsIFtdKTsNCi0NCi0gIGN1c3RvbUludGVycG9sYXRpb25BcHAuY29uZmlnKGZ1bmN0aW9uKCRpbnRlcnBvbGF0ZVByb3ZpZGVyKSB7DQotICAgICRpbnRlcnBvbGF0ZVByb3ZpZGVyLnN0YXJ0U3ltYm9sKCcvLycpOw0KLSAgICAkaW50ZXJwb2xhdGVQcm92aWRlci5lbmRTeW1ib2woJy8vJyk7DQotICB9KTsNCi0NCi0NCi0gIGN1c3RvbUludGVycG9sYXRpb25BcHAuY29udHJvbGxlcignRGVtb0NvbnRyb2xsZXInLCBmdW5jdGlvbigpIHsNCi0gICAgICB0aGlzLmxhYmVsID0gIlRoaXMgYmluZGluZyBpcyBicm91Z2h0IHlvdSBieSAvLyBpbnRlcnBvbGF0aW9uIHN5bWJvbHMuIjsNCi0gIH0pOw0KLTwvc2NyaXB0Pg0KLTxkaXYgbmctYXBwPSJBcHAiIG5nLWNvbnRyb2xsZXI9IkRlbW9Db250cm9sbGVyIGFzIGRlbW8iPg0KLSAgICAvL2RlbW8ubGFiZWwvLw0KLTwvZGl2Pg0KLTwvZmlsZT4NCi08ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gIGl0KCdzaG91bGQgaW50ZXJwb2xhdGUgYmluZGluZyB3aXRoIGN1c3RvbSBzeW1ib2xzJywgZnVuY3Rpb24oKSB7DQotICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ2RlbW8ubGFiZWwnKSkuZ2V0VGV4dCgpKS50b0JlKCdUaGlzIGJpbmRpbmcgaXMgYnJvdWdodCB5b3UgYnkgLy8gaW50ZXJwb2xhdGlvbiBzeW1ib2xzLicpOw0KLSAgfSk7DQotPC9maWxlPg0KLTwvZXhhbXBsZT4NCi0gKi8NCi1mdW5jdGlvbiAkSW50ZXJwb2xhdGVQcm92aWRlcigpIHsNCi0gIHZhciBzdGFydFN5bWJvbCA9ICd7eyc7DQotICB2YXIgZW5kU3ltYm9sID0gJ319JzsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJGludGVycG9sYXRlUHJvdmlkZXIjc3RhcnRTeW1ib2wNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogU3ltYm9sIHRvIGRlbm90ZSBzdGFydCBvZiBleHByZXNzaW9uIGluIHRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nLiBEZWZhdWx0cyB0byBge3tgLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gdmFsdWUgbmV3IHZhbHVlIHRvIHNldCB0aGUgc3RhcnRpbmcgc3ltYm9sIHRvLg0KLSAgICogQHJldHVybnMge3N0cmluZ3xzZWxmfSBSZXR1cm5zIHRoZSBzeW1ib2wgd2hlbiB1c2VkIGFzIGdldHRlciBhbmQgc2VsZiBpZiB1c2VkIGFzIHNldHRlci4NCi0gICAqLw0KLSAgdGhpcy5zdGFydFN5bWJvbCA9IGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgIGlmICh2YWx1ZSkgew0KLSAgICAgIHN0YXJ0U3ltYm9sID0gdmFsdWU7DQotICAgICAgcmV0dXJuIHRoaXM7DQotICAgIH0gZWxzZSB7DQotICAgICAgcmV0dXJuIHN0YXJ0U3ltYm9sOw0KLSAgICB9DQotICB9Ow0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSAkaW50ZXJwb2xhdGVQcm92aWRlciNlbmRTeW1ib2wNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogU3ltYm9sIHRvIGRlbm90ZSB0aGUgZW5kIG9mIGV4cHJlc3Npb24gaW4gdGhlIGludGVycG9sYXRlZCBzdHJpbmcuIERlZmF1bHRzIHRvIGB9fWAuDQotICAgKg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSB2YWx1ZSBuZXcgdmFsdWUgdG8gc2V0IHRoZSBlbmRpbmcgc3ltYm9sIHRvLg0KLSAgICogQHJldHVybnMge3N0cmluZ3xzZWxmfSBSZXR1cm5zIHRoZSBzeW1ib2wgd2hlbiB1c2VkIGFzIGdldHRlciBhbmQgc2VsZiBpZiB1c2VkIGFzIHNldHRlci4NCi0gICAqLw0KLSAgdGhpcy5lbmRTeW1ib2wgPSBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICBpZiAodmFsdWUpIHsNCi0gICAgICBlbmRTeW1ib2wgPSB2YWx1ZTsNCi0gICAgICByZXR1cm4gdGhpczsNCi0gICAgfSBlbHNlIHsNCi0gICAgICByZXR1cm4gZW5kU3ltYm9sOw0KLSAgICB9DQotICB9Ow0KLQ0KLQ0KLSAgdGhpcy4kZ2V0ID0gWyckcGFyc2UnLCAnJGV4Y2VwdGlvbkhhbmRsZXInLCAnJHNjZScsIGZ1bmN0aW9uKCRwYXJzZSwgJGV4Y2VwdGlvbkhhbmRsZXIsICRzY2UpIHsNCi0gICAgdmFyIHN0YXJ0U3ltYm9sTGVuZ3RoID0gc3RhcnRTeW1ib2wubGVuZ3RoLA0KLSAgICAgICAgZW5kU3ltYm9sTGVuZ3RoID0gZW5kU3ltYm9sLmxlbmd0aCwNCi0gICAgICAgIGVzY2FwZWRTdGFydFJlZ2V4cCA9IG5ldyBSZWdFeHAoc3RhcnRTeW1ib2wucmVwbGFjZSgvLi9nLCBlc2NhcGUpLCAnZycpLA0KLSAgICAgICAgZXNjYXBlZEVuZFJlZ2V4cCA9IG5ldyBSZWdFeHAoZW5kU3ltYm9sLnJlcGxhY2UoLy4vZywgZXNjYXBlKSwgJ2cnKTsNCi0NCi0gICAgZnVuY3Rpb24gZXNjYXBlKGNoKSB7DQotICAgICAgcmV0dXJuICdcXFxcXFwnICsgY2g7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBzZXJ2aWNlDQotICAgICAqIEBuYW1lICRpbnRlcnBvbGF0ZQ0KLSAgICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICAgKg0KLSAgICAgKiBAcmVxdWlyZXMgJHBhcnNlDQotICAgICAqIEByZXF1aXJlcyAkc2NlDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKg0KLSAgICAgKiBDb21waWxlcyBhIHN0cmluZyB3aXRoIG1hcmt1cCBpbnRvIGFuIGludGVycG9sYXRpb24gZnVuY3Rpb24uIFRoaXMgc2VydmljZSBpcyB1c2VkIGJ5IHRoZQ0KLSAgICAgKiBIVE1MIHtAbGluayBuZy4kY29tcGlsZSAkY29tcGlsZX0gc2VydmljZSBmb3IgZGF0YSBiaW5kaW5nLiBTZWUNCi0gICAgICoge0BsaW5rIG5nLiRpbnRlcnBvbGF0ZVByb3ZpZGVyICRpbnRlcnBvbGF0ZVByb3ZpZGVyfSBmb3IgY29uZmlndXJpbmcgdGhlDQotICAgICAqIGludGVycG9sYXRpb24gbWFya3VwLg0KLSAgICAgKg0KLSAgICAgKg0KLSAgICAgKiBgYGBqcw0KLSAgICAgKiAgIHZhciAkaW50ZXJwb2xhdGUgPSAuLi47IC8vIGluamVjdGVkDQotICAgICAqICAgdmFyIGV4cCA9ICRpbnRlcnBvbGF0ZSgnSGVsbG8ge3tuYW1lIHwgdXBwZXJjYXNlfX0hJyk7DQotICAgICAqICAgZXhwZWN0KGV4cCh7bmFtZTonQW5ndWxhcid9KS50b0VxdWFsKCdIZWxsbyBBTkdVTEFSIScpOw0KLSAgICAgKiBgYGANCi0gICAgICoNCi0gICAgICogYCRpbnRlcnBvbGF0ZWAgdGFrZXMgYW4gb3B0aW9uYWwgZm91cnRoIGFyZ3VtZW50LCBgYWxsT3JOb3RoaW5nYC4gSWYgYGFsbE9yTm90aGluZ2AgaXMNCi0gICAgICogYHRydWVgLCB0aGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbiB3aWxsIHJldHVybiBgdW5kZWZpbmVkYCB1bmxlc3MgYWxsIGVtYmVkZGVkIGV4cHJlc3Npb25zDQotICAgICAqIGV2YWx1YXRlIHRvIGEgdmFsdWUgb3RoZXIgdGhhbiBgdW5kZWZpbmVkYC4NCi0gICAgICoNCi0gICAgICogYGBganMNCi0gICAgICogICB2YXIgJGludGVycG9sYXRlID0gLi4uOyAvLyBpbmplY3RlZA0KLSAgICAgKiAgIHZhciBjb250ZXh0ID0ge2dyZWV0aW5nOiAnSGVsbG8nLCBuYW1lOiB1bmRlZmluZWQgfTsNCi0gICAgICoNCi0gICAgICogICAvLyBkZWZhdWx0ICJmb3JnaXZpbmciIG1vZGUNCi0gICAgICogICB2YXIgZXhwID0gJGludGVycG9sYXRlKCd7e2dyZWV0aW5nfX0ge3tuYW1lfX0hJyk7DQotICAgICAqICAgZXhwZWN0KGV4cChjb250ZXh0KSkudG9FcXVhbCgnSGVsbG8gIScpOw0KLSAgICAgKg0KLSAgICAgKiAgIC8vICJhbGxPck5vdGhpbmciIG1vZGUNCi0gICAgICogICBleHAgPSAkaW50ZXJwb2xhdGUoJ3t7Z3JlZXRpbmd9fSB7e25hbWV9fSEnLCBmYWxzZSwgbnVsbCwgdHJ1ZSk7DQotICAgICAqICAgZXhwZWN0KGV4cChjb250ZXh0KSkudG9CZVVuZGVmaW5lZCgpOw0KLSAgICAgKiAgIGNvbnRleHQubmFtZSA9ICdBbmd1bGFyJzsNCi0gICAgICogICBleHBlY3QoZXhwKGNvbnRleHQpKS50b0VxdWFsKCdIZWxsbyBBbmd1bGFyIScpOw0KLSAgICAgKiBgYGANCi0gICAgICoNCi0gICAgICogYGFsbE9yTm90aGluZ2AgaXMgdXNlZnVsIGZvciBpbnRlcnBvbGF0aW5nIFVSTHMuIGBuZ1NyY2AgYW5kIGBuZ1NyY3NldGAgdXNlIHRoaXMgYmVoYXZpb3IuDQotICAgICAqDQotICAgICAqICMjIyNFc2NhcGVkIEludGVycG9sYXRpb24NCi0gICAgICogJGludGVycG9sYXRlIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBlc2NhcGluZyBpbnRlcnBvbGF0aW9uIG1hcmtlcnMuIFN0YXJ0IGFuZCBlbmQgbWFya2Vycw0KLSAgICAgKiBjYW4gYmUgZXNjYXBlZCBieSBwcmVjZWRpbmcgZWFjaCBvZiB0aGVpciBjaGFyYWN0ZXJzIHdpdGggYSBSRVZFUlNFIFNPTElEVVMgVSswMDVDIChiYWNrc2xhc2gpLg0KLSAgICAgKiBJdCB3aWxsIGJlIHJlbmRlcmVkIGFzIGEgcmVndWxhciBzdGFydC9lbmQgbWFya2VyLCBhbmQgd2lsbCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gZXhwcmVzc2lvbg0KLSAgICAgKiBvciBiaW5kaW5nLg0KLSAgICAgKg0KLSAgICAgKiBUaGlzIGVuYWJsZXMgd2ViLXNlcnZlcnMgdG8gcHJldmVudCBzY3JpcHQgaW5qZWN0aW9uIGF0dGFja3MgYW5kIGRlZmFjaW5nIGF0dGFja3MsIHRvIHNvbWUNCi0gICAgICogZGVncmVlLCB3aGlsZSBhbHNvIGVuYWJsaW5nIGNvZGUgZXhhbXBsZXMgdG8gd29yayB3aXRob3V0IHJlbHlpbmcgb24gdGhlDQotICAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdOb25CaW5kYWJsZSBuZ05vbkJpbmRhYmxlfSBkaXJlY3RpdmUuDQotICAgICAqDQotICAgICAqICoqRm9yIHNlY3VyaXR5IHB1cnBvc2VzLCBpdCBpcyBzdHJvbmdseSBlbmNvdXJhZ2VkIHRoYXQgd2ViIHNlcnZlcnMgZXNjYXBlIHVzZXItc3VwcGxpZWQgZGF0YSwNCi0gICAgICogcmVwbGFjaW5nIGFuZ2xlIGJyYWNrZXRzICgmbHQ7LCAmZ3Q7KSB3aXRoICZhbXA7bHQ7IGFuZCAmYW1wO2d0OyByZXNwZWN0aXZlbHksIGFuZCByZXBsYWNpbmcgYWxsDQotICAgICAqIGludGVycG9sYXRpb24gc3RhcnQvZW5kIG1hcmtlcnMgd2l0aCB0aGVpciBlc2NhcGVkIGNvdW50ZXJwYXJ0cy4qKg0KLSAgICAgKg0KLSAgICAgKiBFc2NhcGVkIGludGVycG9sYXRpb24gbWFya2VycyBhcmUgb25seSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgaW50ZXJwb2xhdGlvbiBtYXJrZXJzIGluIHJlbmRlcmVkDQotICAgICAqIG91dHB1dCB3aGVuIHRoZSAkaW50ZXJwb2xhdGUgc2VydmljZSBwcm9jZXNzZXMgdGhlIHRleHQuIFNvLCBmb3IgSFRNTCBlbGVtZW50cyBpbnRlcnBvbGF0ZWQNCi0gICAgICogYnkge0BsaW5rIG5nLiRjb21waWxlICRjb21waWxlfSwgb3Igb3RoZXJ3aXNlIGludGVycG9sYXRlZCB3aXRoIHRoZSBgbXVzdEhhdmVFeHByZXNzaW9uYCBwYXJhbWV0ZXINCi0gICAgICogc2V0IHRvIGB0cnVlYCwgdGhlIGludGVycG9sYXRlZCB0ZXh0IG11c3QgY29udGFpbiBhbiB1bmVzY2FwZWQgaW50ZXJwb2xhdGlvbiBleHByZXNzaW9uLiBBcyBzdWNoLA0KLSAgICAgKiB0aGlzIGlzIHR5cGljYWxseSB1c2VmdWwgb25seSB3aGVuIHVzZXItZGF0YSBpcyB1c2VkIGluIHJlbmRlcmluZyBhIHRlbXBsYXRlIGZyb20gdGhlIHNlcnZlciwgb3INCi0gICAgICogd2hlbiBvdGhlcndpc2UgdW50cnVzdGVkIGRhdGEgaXMgdXNlZCBieSBhIGRpcmVjdGl2ZS4NCi0gICAgICoNCi0gICAgICogPGV4YW1wbGU+DQotICAgICAqICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICogICAgPGRpdiBuZy1pbml0PSJ1c2VybmFtZT0nQSB1c2VyJyI+DQotICAgICAqICAgICAgPHAgbmctaW5pdD0iYXBwdGl0bGU9J0VzY2FwaW5nIGRlbW8nIj57e2FwcHRpdGxlfX06IFx7XHsgdXNlcm5hbWUgPSAiZGVmYWNlZCB2YWx1ZSI7IFx9XH0NCi0gICAgICogICAgICAgIDwvcD4NCi0gICAgICogICAgICA8cD48c3Ryb25nPnt7dXNlcm5hbWV9fTwvc3Ryb25nPiBhdHRlbXB0cyB0byBpbmplY3QgY29kZSB3aGljaCB3aWxsIGRlZmFjZSB0aGUNCi0gICAgICogICAgICAgIGFwcGxpY2F0aW9uLCBidXQgZmFpbHMgdG8gYWNjb21wbGlzaCB0aGVpciB0YXNrLCBiZWNhdXNlIHRoZSBzZXJ2ZXIgaGFzIGNvcnJlY3RseQ0KLSAgICAgKiAgICAgICAgZXNjYXBlZCB0aGUgaW50ZXJwb2xhdGlvbiBzdGFydC9lbmQgbWFya2VycyB3aXRoIFJFVkVSU0UgU09MSURVUyBVKzAwNUMgKGJhY2tzbGFzaCkNCi0gICAgICogICAgICAgIGNoYXJhY3RlcnMuPC9wPg0KLSAgICAgKiAgICAgIDxwPkluc3RlYWQsIHRoZSByZXN1bHQgb2YgdGhlIGF0dGVtcHRlZCBzY3JpcHQgaW5qZWN0aW9uIGlzIHZpc2libGUsIGFuZCBjYW4gYmUgcmVtb3ZlZA0KLSAgICAgKiAgICAgICAgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYW4gYWRtaW5pc3RyYXRvci48L3A+DQotICAgICAqICAgIDwvZGl2Pg0KLSAgICAgKiAgPC9maWxlPg0KLSAgICAgKiA8L2V4YW1wbGU+DQotICAgICAqDQotICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHdpdGggbWFya3VwIHRvIGludGVycG9sYXRlLg0KLSAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBtdXN0SGF2ZUV4cHJlc3Npb24gaWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgaW50ZXJwb2xhdGlvbiBzdHJpbmcgbXVzdCBoYXZlDQotICAgICAqICAgIGVtYmVkZGVkIGV4cHJlc3Npb24gaW4gb3JkZXIgdG8gcmV0dXJuIGFuIGludGVycG9sYXRpb24gZnVuY3Rpb24uIFN0cmluZ3Mgd2l0aCBubw0KLSAgICAgKiAgICBlbWJlZGRlZCBleHByZXNzaW9uIHdpbGwgcmV0dXJuIG51bGwgZm9yIHRoZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLg0KLSAgICAgKiBAcGFyYW0ge3N0cmluZz19IHRydXN0ZWRDb250ZXh0IHdoZW4gcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBwYXNzZXMgdGhlIGludGVycG9sYXRlZA0KLSAgICAgKiAgICByZXN1bHQgdGhyb3VnaCB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkICRzY2UuZ2V0VHJ1c3RlZChpbnRlcnBvbGF0ZWRSZXN1bHQsDQotICAgICAqICAgIHRydXN0ZWRDb250ZXh0KX0gYmVmb3JlIHJldHVybmluZyBpdC4gIFJlZmVyIHRvIHRoZSB7QGxpbmsgbmcuJHNjZSAkc2NlfSBzZXJ2aWNlIHRoYXQNCi0gICAgICogICAgcHJvdmlkZXMgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgZm9yIGRldGFpbHMuDQotICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGFsbE9yTm90aGluZyBpZiBgdHJ1ZWAsIHRoZW4gdGhlIHJldHVybmVkIGZ1bmN0aW9uIHJldHVybnMgdW5kZWZpbmVkDQotICAgICAqICAgIHVubGVzcyBhbGwgZW1iZWRkZWQgZXhwcmVzc2lvbnMgZXZhbHVhdGUgdG8gYSB2YWx1ZSBvdGhlciB0aGFuIGB1bmRlZmluZWRgLg0KLSAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCl9IGFuIGludGVycG9sYXRpb24gZnVuY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBjb21wdXRlIHRoZQ0KLSAgICAgKiAgICBpbnRlcnBvbGF0ZWQgc3RyaW5nLiBUaGUgZnVuY3Rpb24gaGFzIHRoZXNlIHBhcmFtZXRlcnM6DQotICAgICAqDQotICAgICAqIC0gYGNvbnRleHRgOiBldmFsdWF0aW9uIGNvbnRleHQgZm9yIGFsbCBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgaW50ZXJwb2xhdGVkIHRleHQNCi0gICAgICovDQotICAgIGZ1bmN0aW9uICRpbnRlcnBvbGF0ZSh0ZXh0LCBtdXN0SGF2ZUV4cHJlc3Npb24sIHRydXN0ZWRDb250ZXh0LCBhbGxPck5vdGhpbmcpIHsNCi0gICAgICBhbGxPck5vdGhpbmcgPSAhIWFsbE9yTm90aGluZzsNCi0gICAgICB2YXIgc3RhcnRJbmRleCwNCi0gICAgICAgICAgZW5kSW5kZXgsDQotICAgICAgICAgIGluZGV4ID0gMCwNCi0gICAgICAgICAgZXhwcmVzc2lvbnMgPSBbXSwNCi0gICAgICAgICAgcGFyc2VGbnMgPSBbXSwNCi0gICAgICAgICAgdGV4dExlbmd0aCA9IHRleHQubGVuZ3RoLA0KLSAgICAgICAgICBleHAsDQotICAgICAgICAgIGNvbmNhdCA9IFtdLA0KLSAgICAgICAgICBleHByZXNzaW9uUG9zaXRpb25zID0gW107DQotDQotICAgICAgd2hpbGUgKGluZGV4IDwgdGV4dExlbmd0aCkgew0KLSAgICAgICAgaWYgKCgoc3RhcnRJbmRleCA9IHRleHQuaW5kZXhPZihzdGFydFN5bWJvbCwgaW5kZXgpKSAhPSAtMSkgJiYNCi0gICAgICAgICAgICAgKChlbmRJbmRleCA9IHRleHQuaW5kZXhPZihlbmRTeW1ib2wsIHN0YXJ0SW5kZXggKyBzdGFydFN5bWJvbExlbmd0aCkpICE9IC0xKSkgew0KLSAgICAgICAgICBpZiAoaW5kZXggIT09IHN0YXJ0SW5kZXgpIHsNCi0gICAgICAgICAgICBjb25jYXQucHVzaCh1bmVzY2FwZVRleHQodGV4dC5zdWJzdHJpbmcoaW5kZXgsIHN0YXJ0SW5kZXgpKSk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgZXhwID0gdGV4dC5zdWJzdHJpbmcoc3RhcnRJbmRleCArIHN0YXJ0U3ltYm9sTGVuZ3RoLCBlbmRJbmRleCk7DQotICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2goZXhwKTsNCi0gICAgICAgICAgcGFyc2VGbnMucHVzaCgkcGFyc2UoZXhwLCBwYXJzZVN0cmluZ2lmeUludGVyY2VwdG9yKSk7DQotICAgICAgICAgIGluZGV4ID0gZW5kSW5kZXggKyBlbmRTeW1ib2xMZW5ndGg7DQotICAgICAgICAgIGV4cHJlc3Npb25Qb3NpdGlvbnMucHVzaChjb25jYXQubGVuZ3RoKTsNCi0gICAgICAgICAgY29uY2F0LnB1c2goJycpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgLy8gd2UgZGlkIG5vdCBmaW5kIGFuIGludGVycG9sYXRpb24sIHNvIHdlIGhhdmUgdG8gYWRkIHRoZSByZW1haW5kZXIgdG8gdGhlIHNlcGFyYXRvcnMgYXJyYXkNCi0gICAgICAgICAgaWYgKGluZGV4ICE9PSB0ZXh0TGVuZ3RoKSB7DQotICAgICAgICAgICAgY29uY2F0LnB1c2godW5lc2NhcGVUZXh0KHRleHQuc3Vic3RyaW5nKGluZGV4KSkpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICAvLyBDb25jYXRlbmF0aW5nIGV4cHJlc3Npb25zIG1ha2VzIGl0IGhhcmQgdG8gcmVhc29uIGFib3V0IHdoZXRoZXIgc29tZSBjb21iaW5hdGlvbiBvZg0KLSAgICAgIC8vIGNvbmNhdGVuYXRlZCB2YWx1ZXMgYXJlIHVuc2FmZSB0byB1c2UgYW5kIGNvdWxkIGVhc2lseSBsZWFkIHRvIFhTUy4gIEJ5IHJlcXVpcmluZyB0aGF0IGENCi0gICAgICAvLyBzaW5nbGUgZXhwcmVzc2lvbiBiZSB1c2VkIGZvciBpZnJhbWVbc3JjXSwgb2JqZWN0W3NyY10sIGV0Yy4sIHdlIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZQ0KLSAgICAgIC8vIHRoYXQncyB1c2VkIGlzIGFzc2lnbmVkIG9yIGNvbnN0cnVjdGVkIGJ5IHNvbWUgSlMgY29kZSBzb21ld2hlcmUgdGhhdCBpcyBtb3JlIHRlc3RhYmxlIG9yDQotICAgICAgLy8gbWFrZSBpdCBvYnZpb3VzIHRoYXQgeW91IGJvdW5kIHRoZSB2YWx1ZSB0byBzb21lIHVzZXIgY29udHJvbGxlZCB2YWx1ZS4gIFRoaXMgaGVscHMgcmVkdWNlDQotICAgICAgLy8gdGhlIGxvYWQgd2hlbiBhdWRpdGluZyBmb3IgWFNTIGlzc3Vlcy4NCi0gICAgICBpZiAodHJ1c3RlZENvbnRleHQgJiYgY29uY2F0Lmxlbmd0aCA+IDEpIHsNCi0gICAgICAgICAgdGhyb3cgJGludGVycG9sYXRlTWluRXJyKCdub2NvbmNhdCcsDQotICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgaW50ZXJwb2xhdGluZzogezB9XG5TdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyBkaXNhbGxvd3MgIiArDQotICAgICAgICAgICAgICAiaW50ZXJwb2xhdGlvbnMgdGhhdCBjb25jYXRlbmF0ZSBtdWx0aXBsZSBleHByZXNzaW9ucyB3aGVuIGEgdHJ1c3RlZCB2YWx1ZSBpcyAiICsNCi0gICAgICAgICAgICAgICJyZXF1aXJlZC4gIFNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy4kc2NlIiwgdGV4dCk7DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmICghbXVzdEhhdmVFeHByZXNzaW9uIHx8IGV4cHJlc3Npb25zLmxlbmd0aCkgew0KLSAgICAgICAgdmFyIGNvbXB1dGUgPSBmdW5jdGlvbih2YWx1ZXMpIHsNCi0gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZXhwcmVzc2lvbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KLSAgICAgICAgICAgIGlmIChhbGxPck5vdGhpbmcgJiYgaXNVbmRlZmluZWQodmFsdWVzW2ldKSkgcmV0dXJuOw0KLSAgICAgICAgICAgIGNvbmNhdFtleHByZXNzaW9uUG9zaXRpb25zW2ldXSA9IHZhbHVlc1tpXTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICByZXR1cm4gY29uY2F0LmpvaW4oJycpOw0KLSAgICAgICAgfTsNCi0NCi0gICAgICAgIHZhciBnZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgICAgIHJldHVybiB0cnVzdGVkQ29udGV4dCA/DQotICAgICAgICAgICAgJHNjZS5nZXRUcnVzdGVkKHRydXN0ZWRDb250ZXh0LCB2YWx1ZSkgOg0KLSAgICAgICAgICAgICRzY2UudmFsdWVPZih2YWx1ZSk7DQotICAgICAgICB9Ow0KLQ0KLSAgICAgICAgdmFyIHN0cmluZ2lmeSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7IC8vIG51bGwgfHwgdW5kZWZpbmVkDQotICAgICAgICAgICAgcmV0dXJuICcnOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7DQotICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzoNCi0gICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgJ251bWJlcic6DQotICAgICAgICAgICAgICB2YWx1ZSA9ICcnICsgdmFsdWU7DQotICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgdmFsdWUgPSB0b0pzb24odmFsdWUpOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgICAgIH07DQotDQotICAgICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uIGludGVycG9sYXRpb25Gbihjb250ZXh0KSB7DQotICAgICAgICAgICAgdmFyIGkgPSAwOw0KLSAgICAgICAgICAgIHZhciBpaSA9IGV4cHJlc3Npb25zLmxlbmd0aDsNCi0gICAgICAgICAgICB2YXIgdmFsdWVzID0gbmV3IEFycmF5KGlpKTsNCi0NCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgZm9yICg7IGkgPCBpaTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IHBhcnNlRm5zW2ldKGNvbnRleHQpOw0KLSAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGUodmFsdWVzKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsNCi0gICAgICAgICAgICAgIHZhciBuZXdFcnIgPSAkaW50ZXJwb2xhdGVNaW5FcnIoJ2ludGVycicsICJDYW4ndCBpbnRlcnBvbGF0ZTogezB9XG57MX0iLCB0ZXh0LA0KLSAgICAgICAgICAgICAgICAgIGVyci50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKG5ld0Vycik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICB9LCB7DQotICAgICAgICAgIC8vIGFsbCBvZiB0aGVzZSBwcm9wZXJ0aWVzIGFyZSB1bmRvY3VtZW50ZWQgZm9yIG5vdw0KLSAgICAgICAgICBleHA6IHRleHQsIC8vanVzdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHJlZ3VsYXIgd2F0Y2hlcnMgY3JlYXRlZCB2aWEgJHdhdGNoDQotICAgICAgICAgIGV4cHJlc3Npb25zOiBleHByZXNzaW9ucywNCi0gICAgICAgICAgJCR3YXRjaERlbGVnYXRlOiBmdW5jdGlvbihzY29wZSwgbGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5KSB7DQotICAgICAgICAgICAgdmFyIGxhc3RWYWx1ZTsNCi0gICAgICAgICAgICByZXR1cm4gc2NvcGUuJHdhdGNoR3JvdXAocGFyc2VGbnMsIGZ1bmN0aW9uIGludGVycG9sYXRlRm5XYXRjaGVyKHZhbHVlcywgb2xkVmFsdWVzKSB7DQotICAgICAgICAgICAgICB2YXIgY3VyclZhbHVlID0gY29tcHV0ZSh2YWx1ZXMpOw0KLSAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXIpKSB7DQotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgY3VyclZhbHVlLCB2YWx1ZXMgIT09IG9sZFZhbHVlcyA/IGxhc3RWYWx1ZSA6IGN1cnJWYWx1ZSwgc2NvcGUpOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgbGFzdFZhbHVlID0gY3VyclZhbHVlOw0KLSAgICAgICAgICAgIH0sIG9iamVjdEVxdWFsaXR5KTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIGZ1bmN0aW9uIHVuZXNjYXBlVGV4dCh0ZXh0KSB7DQotICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKGVzY2FwZWRTdGFydFJlZ2V4cCwgc3RhcnRTeW1ib2wpLg0KLSAgICAgICAgICByZXBsYWNlKGVzY2FwZWRFbmRSZWdleHAsIGVuZFN5bWJvbCk7DQotICAgICAgfQ0KLQ0KLSAgICAgIGZ1bmN0aW9uIHBhcnNlU3RyaW5naWZ5SW50ZXJjZXB0b3IodmFsdWUpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgIHZhbHVlID0gZ2V0VmFsdWUodmFsdWUpOw0KLSAgICAgICAgICByZXR1cm4gYWxsT3JOb3RoaW5nICYmICFpc0RlZmluZWQodmFsdWUpID8gdmFsdWUgOiBzdHJpbmdpZnkodmFsdWUpOw0KLSAgICAgICAgfSBjYXRjaCAoZXJyKSB7DQotICAgICAgICAgIHZhciBuZXdFcnIgPSAkaW50ZXJwb2xhdGVNaW5FcnIoJ2ludGVycicsICJDYW4ndCBpbnRlcnBvbGF0ZTogezB9XG57MX0iLCB0ZXh0LA0KLSAgICAgICAgICAgIGVyci50b1N0cmluZygpKTsNCi0gICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIobmV3RXJyKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICogQG5hbWUgJGludGVycG9sYXRlI3N0YXJ0U3ltYm9sDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBTeW1ib2wgdG8gZGVub3RlIHRoZSBzdGFydCBvZiBleHByZXNzaW9uIGluIHRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nLiBEZWZhdWx0cyB0byBge3tgLg0KLSAgICAgKg0KLSAgICAgKiBVc2Uge0BsaW5rIG5nLiRpbnRlcnBvbGF0ZVByb3ZpZGVyI3N0YXJ0U3ltYm9sIGAkaW50ZXJwb2xhdGVQcm92aWRlci5zdGFydFN5bWJvbGB9IHRvIGNoYW5nZQ0KLSAgICAgKiB0aGUgc3ltYm9sLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBzdGFydCBzeW1ib2wuDQotICAgICAqLw0KLSAgICAkaW50ZXJwb2xhdGUuc3RhcnRTeW1ib2wgPSBmdW5jdGlvbigpIHsNCi0gICAgICByZXR1cm4gc3RhcnRTeW1ib2w7DQotICAgIH07DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRpbnRlcnBvbGF0ZSNlbmRTeW1ib2wNCi0gICAgICogQGRlc2NyaXB0aW9uDQotICAgICAqIFN5bWJvbCB0byBkZW5vdGUgdGhlIGVuZCBvZiBleHByZXNzaW9uIGluIHRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nLiBEZWZhdWx0cyB0byBgfX1gLg0KLSAgICAgKg0KLSAgICAgKiBVc2Uge0BsaW5rIG5nLiRpbnRlcnBvbGF0ZVByb3ZpZGVyI2VuZFN5bWJvbCBgJGludGVycG9sYXRlUHJvdmlkZXIuZW5kU3ltYm9sYH0gdG8gY2hhbmdlDQotICAgICAqIHRoZSBzeW1ib2wuDQotICAgICAqDQotICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IGVuZCBzeW1ib2wuDQotICAgICAqLw0KLSAgICAkaW50ZXJwb2xhdGUuZW5kU3ltYm9sID0gZnVuY3Rpb24oKSB7DQotICAgICAgcmV0dXJuIGVuZFN5bWJvbDsNCi0gICAgfTsNCi0NCi0gICAgcmV0dXJuICRpbnRlcnBvbGF0ZTsNCi0gIH1dOw0KLX0NCi0NCi1mdW5jdGlvbiAkSW50ZXJ2YWxQcm92aWRlcigpIHsNCi0gIHRoaXMuJGdldCA9IFsnJHJvb3RTY29wZScsICckd2luZG93JywgJyRxJywgJyQkcScsDQotICAgICAgIGZ1bmN0aW9uKCRyb290U2NvcGUsICAgJHdpbmRvdywgICAkcSwgICAkJHEpIHsNCi0gICAgdmFyIGludGVydmFscyA9IHt9Ow0KLQ0KLQ0KLSAgICAgLyoqDQotICAgICAgKiBAbmdkb2Mgc2VydmljZQ0KLSAgICAgICogQG5hbWUgJGludGVydmFsDQotICAgICAgKg0KLSAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgKiBBbmd1bGFyJ3Mgd3JhcHBlciBmb3IgYHdpbmRvdy5zZXRJbnRlcnZhbGAuIFRoZSBgZm5gIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGV2ZXJ5IGBkZWxheWANCi0gICAgICAqIG1pbGxpc2Vjb25kcy4NCi0gICAgICAqDQotICAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHJlZ2lzdGVyaW5nIGFuIGludGVydmFsIGZ1bmN0aW9uIGlzIGEgcHJvbWlzZS4gVGhpcyBwcm9taXNlIHdpbGwgYmUNCi0gICAgICAqIG5vdGlmaWVkIHVwb24gZWFjaCB0aWNrIG9mIHRoZSBpbnRlcnZhbCwgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgYWZ0ZXIgYGNvdW50YCBpdGVyYXRpb25zLCBvcg0KLSAgICAgICogcnVuIGluZGVmaW5pdGVseSBpZiBgY291bnRgIGlzIG5vdCBkZWZpbmVkLiBUaGUgdmFsdWUgb2YgdGhlIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHRoZQ0KLSAgICAgICogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhhdCBoYXZlIHJ1bi4NCi0gICAgICAqIFRvIGNhbmNlbCBhbiBpbnRlcnZhbCwgY2FsbCBgJGludGVydmFsLmNhbmNlbChwcm9taXNlKWAuDQotICAgICAgKg0KLSAgICAgICogSW4gdGVzdHMgeW91IGNhbiB1c2Uge0BsaW5rIG5nTW9jay4kaW50ZXJ2YWwjZmx1c2ggYCRpbnRlcnZhbC5mbHVzaChtaWxsaXMpYH0gdG8NCi0gICAgICAqIG1vdmUgZm9yd2FyZCBieSBgbWlsbGlzYCBtaWxsaXNlY29uZHMgYW5kIHRyaWdnZXIgYW55IGZ1bmN0aW9ucyBzY2hlZHVsZWQgdG8gcnVuIGluIHRoYXQNCi0gICAgICAqIHRpbWUuDQotICAgICAgKg0KLSAgICAgICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+DQotICAgICAgKiAqKk5vdGUqKjogSW50ZXJ2YWxzIGNyZWF0ZWQgYnkgdGhpcyBzZXJ2aWNlIG11c3QgYmUgZXhwbGljaXRseSBkZXN0cm95ZWQgd2hlbiB5b3UgYXJlIGZpbmlzaGVkDQotICAgICAgKiB3aXRoIHRoZW0uICBJbiBwYXJ0aWN1bGFyIHRoZXkgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IGRlc3Ryb3llZCB3aGVuIGEgY29udHJvbGxlcidzIHNjb3BlIG9yIGENCi0gICAgICAqIGRpcmVjdGl2ZSdzIGVsZW1lbnQgYXJlIGRlc3Ryb3llZC4NCi0gICAgICAqIFlvdSBzaG91bGQgdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbiBhbmQgbWFrZSBzdXJlIHRvIGFsd2F5cyBjYW5jZWwgdGhlIGludGVydmFsIGF0IHRoZQ0KLSAgICAgICogYXBwcm9wcmlhdGUgbW9tZW50LiAgU2VlIHRoZSBleGFtcGxlIGJlbG93IGZvciBtb3JlIGRldGFpbHMgb24gaG93IGFuZCB3aGVuIHRvIGRvIHRoaXMuDQotICAgICAgKiA8L2Rpdj4NCi0gICAgICAqDQotICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGZuIEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIHJlcGVhdGVkbHkuDQotICAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGVhY2ggZnVuY3Rpb24gY2FsbC4NCi0gICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gW2NvdW50PTBdIE51bWJlciBvZiB0aW1lcyB0byByZXBlYXQuIElmIG5vdCBzZXQsIG9yIDAsIHdpbGwgcmVwZWF0DQotICAgICAgKiAgIGluZGVmaW5pdGVseS4NCi0gICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IFtpbnZva2VBcHBseT10cnVlXSBJZiBzZXQgdG8gYGZhbHNlYCBza2lwcyBtb2RlbCBkaXJ0eSBjaGVja2luZywgb3RoZXJ3aXNlDQotICAgICAgKiAgIHdpbGwgaW52b2tlIGBmbmAgd2l0aGluIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkYXBwbHkgJGFwcGx5fSBibG9jay4NCi0gICAgICAqIEByZXR1cm5zIHtwcm9taXNlfSBBIHByb21pc2Ugd2hpY2ggd2lsbCBiZSBub3RpZmllZCBvbiBlYWNoIGl0ZXJhdGlvbi4NCi0gICAgICAqDQotICAgICAgKiBAZXhhbXBsZQ0KLSAgICAgICogPGV4YW1wbGUgbW9kdWxlPSJpbnRlcnZhbEV4YW1wbGUiPg0KLSAgICAgICogPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgKiAgIDxzY3JpcHQ+DQotICAgICAgKiAgICAgYW5ndWxhci5tb2R1bGUoJ2ludGVydmFsRXhhbXBsZScsIFtdKQ0KLSAgICAgICogICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGludGVydmFsJywNCi0gICAgICAqICAgICAgICAgZnVuY3Rpb24oJHNjb3BlLCAkaW50ZXJ2YWwpIHsNCi0gICAgICAqICAgICAgICAgICAkc2NvcGUuZm9ybWF0ID0gJ00vZC95eSBoOm1tOnNzIGEnOw0KLSAgICAgICogICAgICAgICAgICRzY29wZS5ibG9vZF8xID0gMTAwOw0KLSAgICAgICogICAgICAgICAgICRzY29wZS5ibG9vZF8yID0gMTIwOw0KLSAgICAgICoNCi0gICAgICAqICAgICAgICAgICB2YXIgc3RvcDsNCi0gICAgICAqICAgICAgICAgICAkc2NvcGUuZmlnaHQgPSBmdW5jdGlvbigpIHsNCi0gICAgICAqICAgICAgICAgICAgIC8vIERvbid0IHN0YXJ0IGEgbmV3IGZpZ2h0IGlmIHdlIGFyZSBhbHJlYWR5IGZpZ2h0aW5nDQotICAgICAgKiAgICAgICAgICAgICBpZiAoIGFuZ3VsYXIuaXNEZWZpbmVkKHN0b3ApICkgcmV0dXJuOw0KLSAgICAgICoNCi0gICAgICAqICAgICAgICAgICAgIHN0b3AgPSAkaW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQotICAgICAgKiAgICAgICAgICAgICAgIGlmICgkc2NvcGUuYmxvb2RfMSA+IDAgJiYgJHNjb3BlLmJsb29kXzIgPiAwKSB7DQotICAgICAgKiAgICAgICAgICAgICAgICAgJHNjb3BlLmJsb29kXzEgPSAkc2NvcGUuYmxvb2RfMSAtIDM7DQotICAgICAgKiAgICAgICAgICAgICAgICAgJHNjb3BlLmJsb29kXzIgPSAkc2NvcGUuYmxvb2RfMiAtIDQ7DQotICAgICAgKiAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgKiAgICAgICAgICAgICAgICAgJHNjb3BlLnN0b3BGaWdodCgpOw0KLSAgICAgICogICAgICAgICAgICAgICB9DQotICAgICAgKiAgICAgICAgICAgICB9LCAxMDApOw0KLSAgICAgICogICAgICAgICAgIH07DQotICAgICAgKg0KLSAgICAgICogICAgICAgICAgICRzY29wZS5zdG9wRmlnaHQgPSBmdW5jdGlvbigpIHsNCi0gICAgICAqICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChzdG9wKSkgew0KLSAgICAgICogICAgICAgICAgICAgICAkaW50ZXJ2YWwuY2FuY2VsKHN0b3ApOw0KLSAgICAgICogICAgICAgICAgICAgICBzdG9wID0gdW5kZWZpbmVkOw0KLSAgICAgICogICAgICAgICAgICAgfQ0KLSAgICAgICogICAgICAgICAgIH07DQotICAgICAgKg0KLSAgICAgICogICAgICAgICAgICRzY29wZS5yZXNldEZpZ2h0ID0gZnVuY3Rpb24oKSB7DQotICAgICAgKiAgICAgICAgICAgICAkc2NvcGUuYmxvb2RfMSA9IDEwMDsNCi0gICAgICAqICAgICAgICAgICAgICRzY29wZS5ibG9vZF8yID0gMTIwOw0KLSAgICAgICogICAgICAgICAgIH07DQotICAgICAgKg0KLSAgICAgICogICAgICAgICAgICRzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7DQotICAgICAgKiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaW50ZXJ2YWwgaXMgZGVzdHJveWVkIHRvbw0KLSAgICAgICogICAgICAgICAgICAgJHNjb3BlLnN0b3BGaWdodCgpOw0KLSAgICAgICogICAgICAgICAgIH0pOw0KLSAgICAgICogICAgICAgICB9XSkNCi0gICAgICAqICAgICAgIC8vIFJlZ2lzdGVyIHRoZSAnbXlDdXJyZW50VGltZScgZGlyZWN0aXZlIGZhY3RvcnkgbWV0aG9kLg0KLSAgICAgICogICAgICAgLy8gV2UgaW5qZWN0ICRpbnRlcnZhbCBhbmQgZGF0ZUZpbHRlciBzZXJ2aWNlIHNpbmNlIHRoZSBmYWN0b3J5IG1ldGhvZCBpcyBESS4NCi0gICAgICAqICAgICAgIC5kaXJlY3RpdmUoJ215Q3VycmVudFRpbWUnLCBbJyRpbnRlcnZhbCcsICdkYXRlRmlsdGVyJywNCi0gICAgICAqICAgICAgICAgZnVuY3Rpb24oJGludGVydmFsLCBkYXRlRmlsdGVyKSB7DQotICAgICAgKiAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBkaXJlY3RpdmUgbGluayBmdW5jdGlvbi4gKGNvbXBpbGUgZnVuY3Rpb24gbm90IG5lZWRlZCkNCi0gICAgICAqICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7DQotICAgICAgKiAgICAgICAgICAgICB2YXIgZm9ybWF0LCAgLy8gZGF0ZSBmb3JtYXQNCi0gICAgICAqICAgICAgICAgICAgICAgICBzdG9wVGltZTsgLy8gc28gdGhhdCB3ZSBjYW4gY2FuY2VsIHRoZSB0aW1lIHVwZGF0ZXMNCi0gICAgICAqDQotICAgICAgKiAgICAgICAgICAgICAvLyB1c2VkIHRvIHVwZGF0ZSB0aGUgVUkNCi0gICAgICAqICAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVRpbWUoKSB7DQotICAgICAgKiAgICAgICAgICAgICAgIGVsZW1lbnQudGV4dChkYXRlRmlsdGVyKG5ldyBEYXRlKCksIGZvcm1hdCkpOw0KLSAgICAgICogICAgICAgICAgICAgfQ0KLSAgICAgICoNCi0gICAgICAqICAgICAgICAgICAgIC8vIHdhdGNoIHRoZSBleHByZXNzaW9uLCBhbmQgdXBkYXRlIHRoZSBVSSBvbiBjaGFuZ2UuDQotICAgICAgKiAgICAgICAgICAgICBzY29wZS4kd2F0Y2goYXR0cnMubXlDdXJyZW50VGltZSwgZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICAqICAgICAgICAgICAgICAgZm9ybWF0ID0gdmFsdWU7DQotICAgICAgKiAgICAgICAgICAgICAgIHVwZGF0ZVRpbWUoKTsNCi0gICAgICAqICAgICAgICAgICAgIH0pOw0KLSAgICAgICoNCi0gICAgICAqICAgICAgICAgICAgIHN0b3BUaW1lID0gJGludGVydmFsKHVwZGF0ZVRpbWUsIDEwMDApOw0KLSAgICAgICoNCi0gICAgICAqICAgICAgICAgICAgIC8vIGxpc3RlbiBvbiBET00gZGVzdHJveSAocmVtb3ZhbCkgZXZlbnQsIGFuZCBjYW5jZWwgdGhlIG5leHQgVUkgdXBkYXRlDQotICAgICAgKiAgICAgICAgICAgICAvLyB0byBwcmV2ZW50IHVwZGF0aW5nIHRpbWUgYWZ0ZXIgdGhlIERPTSBlbGVtZW50IHdhcyByZW1vdmVkLg0KLSAgICAgICogICAgICAgICAgICAgZWxlbWVudC5vbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHsNCi0gICAgICAqICAgICAgICAgICAgICAgJGludGVydmFsLmNhbmNlbChzdG9wVGltZSk7DQotICAgICAgKiAgICAgICAgICAgICB9KTsNCi0gICAgICAqICAgICAgICAgICB9DQotICAgICAgKiAgICAgICAgIH1dKTsNCi0gICAgICAqICAgPC9zY3JpcHQ+DQotICAgICAgKg0KLSAgICAgICogICA8ZGl2Pg0KLSAgICAgICogICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAgICAgICogICAgICAgRGF0ZSBmb3JtYXQ6IDxpbnB1dCBuZy1tb2RlbD0iZm9ybWF0Ij4gPGhyLz4NCi0gICAgICAqICAgICAgIEN1cnJlbnQgdGltZSBpczogPHNwYW4gbXktY3VycmVudC10aW1lPSJmb3JtYXQiPjwvc3Bhbj4NCi0gICAgICAqICAgICAgIDxoci8+DQotICAgICAgKiAgICAgICBCbG9vZCAxIDogPGZvbnQgY29sb3I9J3JlZCc+e3tibG9vZF8xfX08L2ZvbnQ+DQotICAgICAgKiAgICAgICBCbG9vZCAyIDogPGZvbnQgY29sb3I9J3JlZCc+e3tibG9vZF8yfX08L2ZvbnQ+DQotICAgICAgKiAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1uZy1jbGljaz0iZmlnaHQoKSI+RmlnaHQ8L2J1dHRvbj4NCi0gICAgICAqICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLW5nLWNsaWNrPSJzdG9wRmlnaHQoKSI+U3RvcEZpZ2h0PC9idXR0b24+DQotICAgICAgKiAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1uZy1jbGljaz0icmVzZXRGaWdodCgpIj5yZXNldEZpZ2h0PC9idXR0b24+DQotICAgICAgKiAgICAgPC9kaXY+DQotICAgICAgKiAgIDwvZGl2Pg0KLSAgICAgICoNCi0gICAgICAqIDwvZmlsZT4NCi0gICAgICAqIDwvZXhhbXBsZT4NCi0gICAgICAqLw0KLSAgICBmdW5jdGlvbiBpbnRlcnZhbChmbiwgZGVsYXksIGNvdW50LCBpbnZva2VBcHBseSkgew0KLSAgICAgIHZhciBzZXRJbnRlcnZhbCA9ICR3aW5kb3cuc2V0SW50ZXJ2YWwsDQotICAgICAgICAgIGNsZWFySW50ZXJ2YWwgPSAkd2luZG93LmNsZWFySW50ZXJ2YWwsDQotICAgICAgICAgIGl0ZXJhdGlvbiA9IDAsDQotICAgICAgICAgIHNraXBBcHBseSA9IChpc0RlZmluZWQoaW52b2tlQXBwbHkpICYmICFpbnZva2VBcHBseSksDQotICAgICAgICAgIGRlZmVycmVkID0gKHNraXBBcHBseSA/ICQkcSA6ICRxKS5kZWZlcigpLA0KLSAgICAgICAgICBwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZTsNCi0NCi0gICAgICBjb3VudCA9IGlzRGVmaW5lZChjb3VudCkgPyBjb3VudCA6IDA7DQotDQotICAgICAgcHJvbWlzZS50aGVuKG51bGwsIG51bGwsIGZuKTsNCi0NCi0gICAgICBwcm9taXNlLiQkaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGZ1bmN0aW9uIHRpY2soKSB7DQotICAgICAgICBkZWZlcnJlZC5ub3RpZnkoaXRlcmF0aW9uKyspOw0KLQ0KLSAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBpdGVyYXRpb24gPj0gY291bnQpIHsNCi0gICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShpdGVyYXRpb24pOw0KLSAgICAgICAgICBjbGVhckludGVydmFsKHByb21pc2UuJCRpbnRlcnZhbElkKTsNCi0gICAgICAgICAgZGVsZXRlIGludGVydmFsc1twcm9taXNlLiQkaW50ZXJ2YWxJZF07DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoIXNraXBBcHBseSkgJHJvb3RTY29wZS4kYXBwbHkoKTsNCi0NCi0gICAgICB9LCBkZWxheSk7DQotDQotICAgICAgaW50ZXJ2YWxzW3Byb21pc2UuJCRpbnRlcnZhbElkXSA9IGRlZmVycmVkOw0KLQ0KLSAgICAgIHJldHVybiBwcm9taXNlOw0KLSAgICB9DQotDQotDQotICAgICAvKioNCi0gICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAqIEBuYW1lICRpbnRlcnZhbCNjYW5jZWwNCi0gICAgICAqDQotICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAqIENhbmNlbHMgYSB0YXNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHByb21pc2VgLg0KLSAgICAgICoNCi0gICAgICAqIEBwYXJhbSB7cHJvbWlzZX0gcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgYCRpbnRlcnZhbGAgZnVuY3Rpb24uDQotICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRhc2sgd2FzIHN1Y2Nlc3NmdWxseSBjYW5jZWxlZC4NCi0gICAgICAqLw0KLSAgICBpbnRlcnZhbC5jYW5jZWwgPSBmdW5jdGlvbihwcm9taXNlKSB7DQotICAgICAgaWYgKHByb21pc2UgJiYgcHJvbWlzZS4kJGludGVydmFsSWQgaW4gaW50ZXJ2YWxzKSB7DQotICAgICAgICBpbnRlcnZhbHNbcHJvbWlzZS4kJGludGVydmFsSWRdLnJlamVjdCgnY2FuY2VsZWQnKTsNCi0gICAgICAgICR3aW5kb3cuY2xlYXJJbnRlcnZhbChwcm9taXNlLiQkaW50ZXJ2YWxJZCk7DQotICAgICAgICBkZWxldGUgaW50ZXJ2YWxzW3Byb21pc2UuJCRpbnRlcnZhbElkXTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gZmFsc2U7DQotICAgIH07DQotDQotICAgIHJldHVybiBpbnRlcnZhbDsNCi0gIH1dOw0KLX0NCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICRsb2NhbGUNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqICRsb2NhbGUgc2VydmljZSBwcm92aWRlcyBsb2NhbGl6YXRpb24gcnVsZXMgZm9yIHZhcmlvdXMgQW5ndWxhciBjb21wb25lbnRzLiBBcyBvZiByaWdodCBub3cgdGhlDQotICogb25seSBwdWJsaWMgYXBpIGlzOg0KLSAqDQotICogKiBgaWRgIOKAPyBge3N0cmluZ31gIOKAPyBsb2NhbGUgaWQgZm9ybWF0dGVkIGFzIGBsYW5ndWFnZUlkLWNvdW50cnlJZGAgKGUuZy4gYGVuLXVzYCkNCi0gKi8NCi1mdW5jdGlvbiAkTG9jYWxlUHJvdmlkZXIoKSB7DQotICB0aGlzLiRnZXQgPSBmdW5jdGlvbigpIHsNCi0gICAgcmV0dXJuIHsNCi0gICAgICBpZDogJ2VuLXVzJywNCi0NCi0gICAgICBOVU1CRVJfRk9STUFUUzogew0KLSAgICAgICAgREVDSU1BTF9TRVA6ICcuJywNCi0gICAgICAgIEdST1VQX1NFUDogJywnLA0KLSAgICAgICAgUEFUVEVSTlM6IFsNCi0gICAgICAgICAgeyAvLyBEZWNpbWFsIFBhdHRlcm4NCi0gICAgICAgICAgICBtaW5JbnQ6IDEsDQotICAgICAgICAgICAgbWluRnJhYzogMCwNCi0gICAgICAgICAgICBtYXhGcmFjOiAzLA0KLSAgICAgICAgICAgIHBvc1ByZTogJycsDQotICAgICAgICAgICAgcG9zU3VmOiAnJywNCi0gICAgICAgICAgICBuZWdQcmU6ICctJywNCi0gICAgICAgICAgICBuZWdTdWY6ICcnLA0KLSAgICAgICAgICAgIGdTaXplOiAzLA0KLSAgICAgICAgICAgIGxnU2l6ZTogMw0KLSAgICAgICAgICB9LHsgLy9DdXJyZW5jeSBQYXR0ZXJuDQotICAgICAgICAgICAgbWluSW50OiAxLA0KLSAgICAgICAgICAgIG1pbkZyYWM6IDIsDQotICAgICAgICAgICAgbWF4RnJhYzogMiwNCi0gICAgICAgICAgICBwb3NQcmU6ICdcdTAwQTQnLA0KLSAgICAgICAgICAgIHBvc1N1ZjogJycsDQotICAgICAgICAgICAgbmVnUHJlOiAnKFx1MDBBNCcsDQotICAgICAgICAgICAgbmVnU3VmOiAnKScsDQotICAgICAgICAgICAgZ1NpemU6IDMsDQotICAgICAgICAgICAgbGdTaXplOiAzDQotICAgICAgICAgIH0NCi0gICAgICAgIF0sDQotICAgICAgICBDVVJSRU5DWV9TWU06ICckJw0KLSAgICAgIH0sDQotDQotICAgICAgREFURVRJTUVfRk9STUFUUzogew0KLSAgICAgICAgTU9OVEg6DQotICAgICAgICAgICAgJ0phbnVhcnksRmVicnVhcnksTWFyY2gsQXByaWwsTWF5LEp1bmUsSnVseSxBdWd1c3QsU2VwdGVtYmVyLE9jdG9iZXIsTm92ZW1iZXIsRGVjZW1iZXInDQotICAgICAgICAgICAgLnNwbGl0KCcsJyksDQotICAgICAgICBTSE9SVE1PTlRIOiAgJ0phbixGZWIsTWFyLEFwcixNYXksSnVuLEp1bCxBdWcsU2VwLE9jdCxOb3YsRGVjJy5zcGxpdCgnLCcpLA0KLSAgICAgICAgREFZOiAnU3VuZGF5LE1vbmRheSxUdWVzZGF5LFdlZG5lc2RheSxUaHVyc2RheSxGcmlkYXksU2F0dXJkYXknLnNwbGl0KCcsJyksDQotICAgICAgICBTSE9SVERBWTogJ1N1bixNb24sVHVlLFdlZCxUaHUsRnJpLFNhdCcuc3BsaXQoJywnKSwNCi0gICAgICAgIEFNUE1TOiBbJ0FNJywnUE0nXSwNCi0gICAgICAgIG1lZGl1bTogJ01NTSBkLCB5IGg6bW06c3MgYScsDQotICAgICAgICAnc2hvcnQnOiAnTS9kL3l5IGg6bW0gYScsDQotICAgICAgICBmdWxsRGF0ZTogJ0VFRUUsIE1NTU0gZCwgeScsDQotICAgICAgICBsb25nRGF0ZTogJ01NTU0gZCwgeScsDQotICAgICAgICBtZWRpdW1EYXRlOiAnTU1NIGQsIHknLA0KLSAgICAgICAgc2hvcnREYXRlOiAnTS9kL3l5JywNCi0gICAgICAgIG1lZGl1bVRpbWU6ICdoOm1tOnNzIGEnLA0KLSAgICAgICAgc2hvcnRUaW1lOiAnaDptbSBhJw0KLSAgICAgIH0sDQotDQotICAgICAgcGx1cmFsQ2F0OiBmdW5jdGlvbihudW0pIHsNCi0gICAgICAgIGlmIChudW0gPT09IDEpIHsNCi0gICAgICAgICAgcmV0dXJuICdvbmUnOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICdvdGhlcic7DQotICAgICAgfQ0KLSAgICB9Ow0KLSAgfTsNCi19DQotDQotdmFyIFBBVEhfTUFUQ0ggPSAvXihbXlw/I10qKShcPyhbXiNdKikpPygjKC4qKSk/JC8sDQotICAgIERFRkFVTFRfUE9SVFMgPSB7J2h0dHAnOiA4MCwgJ2h0dHBzJzogNDQzLCAnZnRwJzogMjF9Ow0KLXZhciAkbG9jYXRpb25NaW5FcnIgPSBtaW5FcnIoJyRsb2NhdGlvbicpOw0KLQ0KLQ0KLS8qKg0KLSAqIEVuY29kZSBwYXRoIHVzaW5nIGVuY29kZVVyaVNlZ21lbnQsIGlnbm9yaW5nIGZvcndhcmQgc2xhc2hlcw0KLSAqDQotICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0byBlbmNvZGUNCi0gKiBAcmV0dXJucyB7c3RyaW5nfQ0KLSAqLw0KLWZ1bmN0aW9uIGVuY29kZVBhdGgocGF0aCkgew0KLSAgdmFyIHNlZ21lbnRzID0gcGF0aC5zcGxpdCgnLycpLA0KLSAgICAgIGkgPSBzZWdtZW50cy5sZW5ndGg7DQotDQotICB3aGlsZSAoaS0tKSB7DQotICAgIHNlZ21lbnRzW2ldID0gZW5jb2RlVXJpU2VnbWVudChzZWdtZW50c1tpXSk7DQotICB9DQotDQotICByZXR1cm4gc2VnbWVudHMuam9pbignLycpOw0KLX0NCi0NCi1mdW5jdGlvbiBwYXJzZUFic29sdXRlVXJsKGFic29sdXRlVXJsLCBsb2NhdGlvbk9iaikgew0KLSAgdmFyIHBhcnNlZFVybCA9IHVybFJlc29sdmUoYWJzb2x1dGVVcmwpOw0KLQ0KLSAgbG9jYXRpb25PYmouJCRwcm90b2NvbCA9IHBhcnNlZFVybC5wcm90b2NvbDsNCi0gIGxvY2F0aW9uT2JqLiQkaG9zdCA9IHBhcnNlZFVybC5ob3N0bmFtZTsNCi0gIGxvY2F0aW9uT2JqLiQkcG9ydCA9IGludChwYXJzZWRVcmwucG9ydCkgfHwgREVGQVVMVF9QT1JUU1twYXJzZWRVcmwucHJvdG9jb2xdIHx8IG51bGw7DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHBhcnNlQXBwVXJsKHJlbGF0aXZlVXJsLCBsb2NhdGlvbk9iaikgew0KLSAgdmFyIHByZWZpeGVkID0gKHJlbGF0aXZlVXJsLmNoYXJBdCgwKSAhPT0gJy8nKTsNCi0gIGlmIChwcmVmaXhlZCkgew0KLSAgICByZWxhdGl2ZVVybCA9ICcvJyArIHJlbGF0aXZlVXJsOw0KLSAgfQ0KLSAgdmFyIG1hdGNoID0gdXJsUmVzb2x2ZShyZWxhdGl2ZVVybCk7DQotICBsb2NhdGlvbk9iai4kJHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQocHJlZml4ZWQgJiYgbWF0Y2gucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycgPw0KLSAgICAgIG1hdGNoLnBhdGhuYW1lLnN1YnN0cmluZygxKSA6IG1hdGNoLnBhdGhuYW1lKTsNCi0gIGxvY2F0aW9uT2JqLiQkc2VhcmNoID0gcGFyc2VLZXlWYWx1ZShtYXRjaC5zZWFyY2gpOw0KLSAgbG9jYXRpb25PYmouJCRoYXNoID0gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoLmhhc2gpOw0KLQ0KLSAgLy8gbWFrZSBzdXJlIHBhdGggc3RhcnRzIHdpdGggJy8nOw0KLSAgaWYgKGxvY2F0aW9uT2JqLiQkcGF0aCAmJiBsb2NhdGlvbk9iai4kJHBhdGguY2hhckF0KDApICE9ICcvJykgew0KLSAgICBsb2NhdGlvbk9iai4kJHBhdGggPSAnLycgKyBsb2NhdGlvbk9iai4kJHBhdGg7DQotICB9DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqDQotICogQHBhcmFtIHtzdHJpbmd9IGJlZ2luDQotICogQHBhcmFtIHtzdHJpbmd9IHdob2xlDQotICogQHJldHVybnMge3N0cmluZ30gcmV0dXJucyB0ZXh0IGZyb20gd2hvbGUgYWZ0ZXIgYmVnaW4gb3IgdW5kZWZpbmVkIGlmIGl0IGRvZXMgbm90IGJlZ2luIHdpdGgNCi0gKiAgICAgICAgICAgICAgICAgICBleHBlY3RlZCBzdHJpbmcuDQotICovDQotZnVuY3Rpb24gYmVnaW5zV2l0aChiZWdpbiwgd2hvbGUpIHsNCi0gIGlmICh3aG9sZS5pbmRleE9mKGJlZ2luKSA9PT0gMCkgew0KLSAgICByZXR1cm4gd2hvbGUuc3Vic3RyKGJlZ2luLmxlbmd0aCk7DQotICB9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIHN0cmlwSGFzaCh1cmwpIHsNCi0gIHZhciBpbmRleCA9IHVybC5pbmRleE9mKCcjJyk7DQotICByZXR1cm4gaW5kZXggPT0gLTEgPyB1cmwgOiB1cmwuc3Vic3RyKDAsIGluZGV4KTsNCi19DQotDQotZnVuY3Rpb24gdHJpbUVtcHR5SGFzaCh1cmwpIHsNCi0gIHJldHVybiB1cmwucmVwbGFjZSgvKCMuKyl8IyQvLCAnJDEnKTsNCi19DQotDQotDQotZnVuY3Rpb24gc3RyaXBGaWxlKHVybCkgew0KLSAgcmV0dXJuIHVybC5zdWJzdHIoMCwgc3RyaXBIYXNoKHVybCkubGFzdEluZGV4T2YoJy8nKSArIDEpOw0KLX0NCi0NCi0vKiByZXR1cm4gdGhlIHNlcnZlciBvbmx5IChzY2hlbWU6Ly9ob3N0OnBvcnQpICovDQotZnVuY3Rpb24gc2VydmVyQmFzZSh1cmwpIHsNCi0gIHJldHVybiB1cmwuc3Vic3RyaW5nKDAsIHVybC5pbmRleE9mKCcvJywgdXJsLmluZGV4T2YoJy8vJykgKyAyKSk7DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIExvY2F0aW9uSHRtbDVVcmwgcmVwcmVzZW50cyBhbiB1cmwNCi0gKiBUaGlzIG9iamVjdCBpcyBleHBvc2VkIGFzICRsb2NhdGlvbiBzZXJ2aWNlIHdoZW4gSFRNTDUgbW9kZSBpcyBlbmFibGVkIGFuZCBzdXBwb3J0ZWQNCi0gKg0KLSAqIEBjb25zdHJ1Y3Rvcg0KLSAqIEBwYXJhbSB7c3RyaW5nfSBhcHBCYXNlIGFwcGxpY2F0aW9uIGJhc2UgVVJMDQotICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQcmVmaXggdXJsIHBhdGggcHJlZml4DQotICovDQotZnVuY3Rpb24gTG9jYXRpb25IdG1sNVVybChhcHBCYXNlLCBiYXNlUHJlZml4KSB7DQotICB0aGlzLiQkaHRtbDUgPSB0cnVlOw0KLSAgYmFzZVByZWZpeCA9IGJhc2VQcmVmaXggfHwgJyc7DQotICB2YXIgYXBwQmFzZU5vRmlsZSA9IHN0cmlwRmlsZShhcHBCYXNlKTsNCi0gIHBhcnNlQWJzb2x1dGVVcmwoYXBwQmFzZSwgdGhpcyk7DQotDQotDQotICAvKioNCi0gICAqIFBhcnNlIGdpdmVuIGh0bWw1IChyZWd1bGFyKSB1cmwgc3RyaW5nIGludG8gcHJvcGVydGllcw0KLSAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBIVE1MNSB1cmwNCi0gICAqIEBwcml2YXRlDQotICAgKi8NCi0gIHRoaXMuJCRwYXJzZSA9IGZ1bmN0aW9uKHVybCkgew0KLSAgICB2YXIgcGF0aFVybCA9IGJlZ2luc1dpdGgoYXBwQmFzZU5vRmlsZSwgdXJsKTsNCi0gICAgaWYgKCFpc1N0cmluZyhwYXRoVXJsKSkgew0KLSAgICAgIHRocm93ICRsb2NhdGlvbk1pbkVycignaXB0aHByZngnLCAnSW52YWxpZCB1cmwgInswfSIsIG1pc3NpbmcgcGF0aCBwcmVmaXggInsxfSIuJywgdXJsLA0KLSAgICAgICAgICBhcHBCYXNlTm9GaWxlKTsNCi0gICAgfQ0KLQ0KLSAgICBwYXJzZUFwcFVybChwYXRoVXJsLCB0aGlzKTsNCi0NCi0gICAgaWYgKCF0aGlzLiQkcGF0aCkgew0KLSAgICAgIHRoaXMuJCRwYXRoID0gJy8nOw0KLSAgICB9DQotDQotICAgIHRoaXMuJCRjb21wb3NlKCk7DQotICB9Ow0KLQ0KLSAgLyoqDQotICAgKiBDb21wb3NlIHVybCBhbmQgdXBkYXRlIGBhYnNVcmxgIHByb3BlcnR5DQotICAgKiBAcHJpdmF0ZQ0KLSAgICovDQotICB0aGlzLiQkY29tcG9zZSA9IGZ1bmN0aW9uKCkgew0KLSAgICB2YXIgc2VhcmNoID0gdG9LZXlWYWx1ZSh0aGlzLiQkc2VhcmNoKSwNCi0gICAgICAgIGhhc2ggPSB0aGlzLiQkaGFzaCA/ICcjJyArIGVuY29kZVVyaVNlZ21lbnQodGhpcy4kJGhhc2gpIDogJyc7DQotDQotICAgIHRoaXMuJCR1cmwgPSBlbmNvZGVQYXRoKHRoaXMuJCRwYXRoKSArIChzZWFyY2ggPyAnPycgKyBzZWFyY2ggOiAnJykgKyBoYXNoOw0KLSAgICB0aGlzLiQkYWJzVXJsID0gYXBwQmFzZU5vRmlsZSArIHRoaXMuJCR1cmwuc3Vic3RyKDEpOyAvLyBmaXJzdCBjaGFyIGlzIGFsd2F5cyAnLycNCi0gIH07DQotDQotICB0aGlzLiQkcGFyc2VMaW5rVXJsID0gZnVuY3Rpb24odXJsLCByZWxIcmVmKSB7DQotICAgIGlmIChyZWxIcmVmICYmIHJlbEhyZWZbMF0gPT09ICcjJykgew0KLSAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbGlua3MgdG8gaGFzaCBmcmFnbWVudHM6DQotICAgICAgLy8ga2VlcCB0aGUgb2xkIHVybCBhbmQgb25seSByZXBsYWNlIHRoZSBoYXNoIGZyYWdtZW50DQotICAgICAgdGhpcy5oYXNoKHJlbEhyZWYuc2xpY2UoMSkpOw0KLSAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIHZhciBhcHBVcmwsIHByZXZBcHBVcmw7DQotICAgIHZhciByZXdyaXR0ZW5Vcmw7DQotDQotICAgIGlmICgoYXBwVXJsID0gYmVnaW5zV2l0aChhcHBCYXNlLCB1cmwpKSAhPT0gdW5kZWZpbmVkKSB7DQotICAgICAgcHJldkFwcFVybCA9IGFwcFVybDsNCi0gICAgICBpZiAoKGFwcFVybCA9IGJlZ2luc1dpdGgoYmFzZVByZWZpeCwgYXBwVXJsKSkgIT09IHVuZGVmaW5lZCkgew0KLSAgICAgICAgcmV3cml0dGVuVXJsID0gYXBwQmFzZU5vRmlsZSArIChiZWdpbnNXaXRoKCcvJywgYXBwVXJsKSB8fCBhcHBVcmwpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlICsgcHJldkFwcFVybDsNCi0gICAgICB9DQotICAgIH0gZWxzZSBpZiAoKGFwcFVybCA9IGJlZ2luc1dpdGgoYXBwQmFzZU5vRmlsZSwgdXJsKSkgIT09IHVuZGVmaW5lZCkgew0KLSAgICAgIHJld3JpdHRlblVybCA9IGFwcEJhc2VOb0ZpbGUgKyBhcHBVcmw7DQotICAgIH0gZWxzZSBpZiAoYXBwQmFzZU5vRmlsZSA9PSB1cmwgKyAnLycpIHsNCi0gICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlTm9GaWxlOw0KLSAgICB9DQotICAgIGlmIChyZXdyaXR0ZW5VcmwpIHsNCi0gICAgICB0aGlzLiQkcGFyc2UocmV3cml0dGVuVXJsKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gISFyZXdyaXR0ZW5Vcmw7DQotICB9Ow0KLX0NCi0NCi0NCi0vKioNCi0gKiBMb2NhdGlvbkhhc2hiYW5nVXJsIHJlcHJlc2VudHMgdXJsDQotICogVGhpcyBvYmplY3QgaXMgZXhwb3NlZCBhcyAkbG9jYXRpb24gc2VydmljZSB3aGVuIGRldmVsb3BlciBkb2Vzbid0IG9wdCBpbnRvIGh0bWw1IG1vZGUuDQotICogSXQgYWxzbyBzZXJ2ZXMgYXMgdGhlIGJhc2UgY2xhc3MgZm9yIGh0bWw1IG1vZGUgZmFsbGJhY2sgb24gbGVnYWN5IGJyb3dzZXJzLg0KLSAqDQotICogQGNvbnN0cnVjdG9yDQotICogQHBhcmFtIHtzdHJpbmd9IGFwcEJhc2UgYXBwbGljYXRpb24gYmFzZSBVUkwNCi0gKiBAcGFyYW0ge3N0cmluZ30gaGFzaFByZWZpeCBoYXNoYmFuZyBwcmVmaXgNCi0gKi8NCi1mdW5jdGlvbiBMb2NhdGlvbkhhc2hiYW5nVXJsKGFwcEJhc2UsIGhhc2hQcmVmaXgpIHsNCi0gIHZhciBhcHBCYXNlTm9GaWxlID0gc3RyaXBGaWxlKGFwcEJhc2UpOw0KLQ0KLSAgcGFyc2VBYnNvbHV0ZVVybChhcHBCYXNlLCB0aGlzKTsNCi0NCi0NCi0gIC8qKg0KLSAgICogUGFyc2UgZ2l2ZW4gaGFzaGJhbmcgdXJsIGludG8gcHJvcGVydGllcw0KLSAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBIYXNoYmFuZyB1cmwNCi0gICAqIEBwcml2YXRlDQotICAgKi8NCi0gIHRoaXMuJCRwYXJzZSA9IGZ1bmN0aW9uKHVybCkgew0KLSAgICB2YXIgd2l0aG91dEJhc2VVcmwgPSBiZWdpbnNXaXRoKGFwcEJhc2UsIHVybCkgfHwgYmVnaW5zV2l0aChhcHBCYXNlTm9GaWxlLCB1cmwpOw0KLSAgICB2YXIgd2l0aG91dEhhc2hVcmw7DQotDQotICAgIGlmICh3aXRob3V0QmFzZVVybC5jaGFyQXQoMCkgPT09ICcjJykgew0KLQ0KLSAgICAgIC8vIFRoZSByZXN0IG9mIHRoZSB1cmwgc3RhcnRzIHdpdGggYSBoYXNoIHNvIHdlIGhhdmUNCi0gICAgICAvLyBnb3QgZWl0aGVyIGEgaGFzaGJhbmcgcGF0aCBvciBhIHBsYWluIGhhc2ggZnJhZ21lbnQNCi0gICAgICB3aXRob3V0SGFzaFVybCA9IGJlZ2luc1dpdGgoaGFzaFByZWZpeCwgd2l0aG91dEJhc2VVcmwpOw0KLSAgICAgIGlmIChpc1VuZGVmaW5lZCh3aXRob3V0SGFzaFVybCkpIHsNCi0gICAgICAgIC8vIFRoZXJlIHdhcyBubyBoYXNoYmFuZyBwcmVmaXggc28gd2UganVzdCBoYXZlIGEgaGFzaCBmcmFnbWVudA0KLSAgICAgICAgd2l0aG91dEhhc2hVcmwgPSB3aXRob3V0QmFzZVVybDsNCi0gICAgICB9DQotDQotICAgIH0gZWxzZSB7DQotICAgICAgLy8gVGhlcmUgd2FzIG5vIGhhc2hiYW5nIHBhdGggbm9yIGhhc2ggZnJhZ21lbnQ6DQotICAgICAgLy8gSWYgd2UgYXJlIGluIEhUTUw1IG1vZGUgd2UgdXNlIHdoYXQgaXMgbGVmdCBhcyB0aGUgcGF0aDsNCi0gICAgICAvLyBPdGhlcndpc2Ugd2UgaWdub3JlIHdoYXQgaXMgbGVmdA0KLSAgICAgIHdpdGhvdXRIYXNoVXJsID0gdGhpcy4kJGh0bWw1ID8gd2l0aG91dEJhc2VVcmwgOiAnJzsNCi0gICAgfQ0KLQ0KLSAgICBwYXJzZUFwcFVybCh3aXRob3V0SGFzaFVybCwgdGhpcyk7DQotDQotICAgIHRoaXMuJCRwYXRoID0gcmVtb3ZlV2luZG93c0RyaXZlTmFtZSh0aGlzLiQkcGF0aCwgd2l0aG91dEhhc2hVcmwsIGFwcEJhc2UpOw0KLQ0KLSAgICB0aGlzLiQkY29tcG9zZSgpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBJbiBXaW5kb3dzLCBvbiBhbiBhbmNob3Igbm9kZSBvbiBkb2N1bWVudHMgbG9hZGVkIGZyb20NCi0gICAgICogdGhlIGZpbGVzeXN0ZW0sIHRoZSBicm93c2VyIHdpbGwgcmV0dXJuIGEgcGF0aG5hbWUNCi0gICAgICogcHJlZml4ZWQgd2l0aCB0aGUgZHJpdmUgbmFtZSAoJy9DOi9wYXRoJykgd2hlbiBhDQotICAgICAqIHBhdGhuYW1lIHdpdGhvdXQgYSBkcml2ZSBpcyBzZXQ6DQotICAgICAqICAqIGEuc2V0QXR0cmlidXRlKCdocmVmJywgJy9mb28nKQ0KLSAgICAgKiAgICogYS5wYXRobmFtZSA9PT0gJy9DOi9mb28nIC8vdHJ1ZQ0KLSAgICAgKg0KLSAgICAgKiBJbnNpZGUgb2YgQW5ndWxhciwgd2UncmUgYWx3YXlzIHVzaW5nIHBhdGhuYW1lcyB0aGF0DQotICAgICAqIGRvIG5vdCBpbmNsdWRlIGRyaXZlIG5hbWVzIGZvciByb3V0aW5nLg0KLSAgICAgKi8NCi0gICAgZnVuY3Rpb24gcmVtb3ZlV2luZG93c0RyaXZlTmFtZShwYXRoLCB1cmwsIGJhc2UpIHsNCi0gICAgICAvKg0KLSAgICAgIE1hdGNoZXMgcGF0aHMgZm9yIGZpbGUgcHJvdG9jb2wgb24gd2luZG93cywNCi0gICAgICBzdWNoIGFzIC9DOi9mb28vYmFyLCBhbmQgY2FwdHVyZXMgb25seSAvZm9vL2Jhci4NCi0gICAgICAqLw0KLSAgICAgIHZhciB3aW5kb3dzRmlsZVBhdGhFeHAgPSAvXlwvW0EtWl06KFwvLiopLzsNCi0NCi0gICAgICB2YXIgZmlyc3RQYXRoU2VnbWVudE1hdGNoOw0KLQ0KLSAgICAgIC8vR2V0IHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGlucHV0IFVSTC4NCi0gICAgICBpZiAodXJsLmluZGV4T2YoYmFzZSkgPT09IDApIHsNCi0gICAgICAgIHVybCA9IHVybC5yZXBsYWNlKGJhc2UsICcnKTsNCi0gICAgICB9DQotDQotICAgICAgLy8gVGhlIGlucHV0IFVSTCBpbnRlbnRpb25hbGx5IGNvbnRhaW5zIGEgZmlyc3QgcGF0aCBzZWdtZW50IHRoYXQgZW5kcyB3aXRoIGEgY29sb24uDQotICAgICAgaWYgKHdpbmRvd3NGaWxlUGF0aEV4cC5leGVjKHVybCkpIHsNCi0gICAgICAgIHJldHVybiBwYXRoOw0KLSAgICAgIH0NCi0NCi0gICAgICBmaXJzdFBhdGhTZWdtZW50TWF0Y2ggPSB3aW5kb3dzRmlsZVBhdGhFeHAuZXhlYyhwYXRoKTsNCi0gICAgICByZXR1cm4gZmlyc3RQYXRoU2VnbWVudE1hdGNoID8gZmlyc3RQYXRoU2VnbWVudE1hdGNoWzFdIDogcGF0aDsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQ29tcG9zZSBoYXNoYmFuZyB1cmwgYW5kIHVwZGF0ZSBgYWJzVXJsYCBwcm9wZXJ0eQ0KLSAgICogQHByaXZhdGUNCi0gICAqLw0KLSAgdGhpcy4kJGNvbXBvc2UgPSBmdW5jdGlvbigpIHsNCi0gICAgdmFyIHNlYXJjaCA9IHRvS2V5VmFsdWUodGhpcy4kJHNlYXJjaCksDQotICAgICAgICBoYXNoID0gdGhpcy4kJGhhc2ggPyAnIycgKyBlbmNvZGVVcmlTZWdtZW50KHRoaXMuJCRoYXNoKSA6ICcnOw0KLQ0KLSAgICB0aGlzLiQkdXJsID0gZW5jb2RlUGF0aCh0aGlzLiQkcGF0aCkgKyAoc2VhcmNoID8gJz8nICsgc2VhcmNoIDogJycpICsgaGFzaDsNCi0gICAgdGhpcy4kJGFic1VybCA9IGFwcEJhc2UgKyAodGhpcy4kJHVybCA/IGhhc2hQcmVmaXggKyB0aGlzLiQkdXJsIDogJycpOw0KLSAgfTsNCi0NCi0gIHRoaXMuJCRwYXJzZUxpbmtVcmwgPSBmdW5jdGlvbih1cmwsIHJlbEhyZWYpIHsNCi0gICAgaWYgKHN0cmlwSGFzaChhcHBCYXNlKSA9PSBzdHJpcEhhc2godXJsKSkgew0KLSAgICAgIHRoaXMuJCRwYXJzZSh1cmwpOw0KLSAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIHJldHVybiBmYWxzZTsNCi0gIH07DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIExvY2F0aW9uSGFzaGJhbmdVcmwgcmVwcmVzZW50cyB1cmwNCi0gKiBUaGlzIG9iamVjdCBpcyBleHBvc2VkIGFzICRsb2NhdGlvbiBzZXJ2aWNlIHdoZW4gaHRtbDUgaGlzdG9yeSBhcGkgaXMgZW5hYmxlZCBidXQgdGhlIGJyb3dzZXINCi0gKiBkb2VzIG5vdCBzdXBwb3J0IGl0Lg0KLSAqDQotICogQGNvbnN0cnVjdG9yDQotICogQHBhcmFtIHtzdHJpbmd9IGFwcEJhc2UgYXBwbGljYXRpb24gYmFzZSBVUkwNCi0gKiBAcGFyYW0ge3N0cmluZ30gaGFzaFByZWZpeCBoYXNoYmFuZyBwcmVmaXgNCi0gKi8NCi1mdW5jdGlvbiBMb2NhdGlvbkhhc2hiYW5nSW5IdG1sNVVybChhcHBCYXNlLCBoYXNoUHJlZml4KSB7DQotICB0aGlzLiQkaHRtbDUgPSB0cnVlOw0KLSAgTG9jYXRpb25IYXNoYmFuZ1VybC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KLQ0KLSAgdmFyIGFwcEJhc2VOb0ZpbGUgPSBzdHJpcEZpbGUoYXBwQmFzZSk7DQotDQotICB0aGlzLiQkcGFyc2VMaW5rVXJsID0gZnVuY3Rpb24odXJsLCByZWxIcmVmKSB7DQotICAgIGlmIChyZWxIcmVmICYmIHJlbEhyZWZbMF0gPT09ICcjJykgew0KLSAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbGlua3MgdG8gaGFzaCBmcmFnbWVudHM6DQotICAgICAgLy8ga2VlcCB0aGUgb2xkIHVybCBhbmQgb25seSByZXBsYWNlIHRoZSBoYXNoIGZyYWdtZW50DQotICAgICAgdGhpcy5oYXNoKHJlbEhyZWYuc2xpY2UoMSkpOw0KLSAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHZhciByZXdyaXR0ZW5Vcmw7DQotICAgIHZhciBhcHBVcmw7DQotDQotICAgIGlmIChhcHBCYXNlID09IHN0cmlwSGFzaCh1cmwpKSB7DQotICAgICAgcmV3cml0dGVuVXJsID0gdXJsOw0KLSAgICB9IGVsc2UgaWYgKChhcHBVcmwgPSBiZWdpbnNXaXRoKGFwcEJhc2VOb0ZpbGUsIHVybCkpKSB7DQotICAgICAgcmV3cml0dGVuVXJsID0gYXBwQmFzZSArIGhhc2hQcmVmaXggKyBhcHBVcmw7DQotICAgIH0gZWxzZSBpZiAoYXBwQmFzZU5vRmlsZSA9PT0gdXJsICsgJy8nKSB7DQotICAgICAgcmV3cml0dGVuVXJsID0gYXBwQmFzZU5vRmlsZTsNCi0gICAgfQ0KLSAgICBpZiAocmV3cml0dGVuVXJsKSB7DQotICAgICAgdGhpcy4kJHBhcnNlKHJld3JpdHRlblVybCk7DQotICAgIH0NCi0gICAgcmV0dXJuICEhcmV3cml0dGVuVXJsOw0KLSAgfTsNCi0NCi0gIHRoaXMuJCRjb21wb3NlID0gZnVuY3Rpb24oKSB7DQotICAgIHZhciBzZWFyY2ggPSB0b0tleVZhbHVlKHRoaXMuJCRzZWFyY2gpLA0KLSAgICAgICAgaGFzaCA9IHRoaXMuJCRoYXNoID8gJyMnICsgZW5jb2RlVXJpU2VnbWVudCh0aGlzLiQkaGFzaCkgOiAnJzsNCi0NCi0gICAgdGhpcy4kJHVybCA9IGVuY29kZVBhdGgodGhpcy4kJHBhdGgpICsgKHNlYXJjaCA/ICc/JyArIHNlYXJjaCA6ICcnKSArIGhhc2g7DQotICAgIC8vIGluY2x1ZGUgaGFzaFByZWZpeCBpbiAkJGFic1VybCB3aGVuICQkdXJsIGlzIGVtcHR5IHNvIElFOCAmIDkgZG8gbm90IHJlbG9hZCBwYWdlIGJlY2F1c2Ugb2YgcmVtb3ZhbCBvZiAnIycNCi0gICAgdGhpcy4kJGFic1VybCA9IGFwcEJhc2UgKyBoYXNoUHJlZml4ICsgdGhpcy4kJHVybDsNCi0gIH07DQotDQotfQ0KLQ0KLQ0KLXZhciBsb2NhdGlvblByb3RvdHlwZSA9IHsNCi0NCi0gIC8qKg0KLSAgICogQXJlIHdlIGluIGh0bWw1IG1vZGU/DQotICAgKiBAcHJpdmF0ZQ0KLSAgICovDQotICAkJGh0bWw1OiBmYWxzZSwNCi0NCi0gIC8qKg0KLSAgICogSGFzIGFueSBjaGFuZ2UgYmVlbiByZXBsYWNpbmc/DQotICAgKiBAcHJpdmF0ZQ0KLSAgICovDQotICAkJHJlcGxhY2U6IGZhbHNlLA0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSAkbG9jYXRpb24jYWJzVXJsDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgb25seS4NCi0gICAqDQotICAgKiBSZXR1cm4gZnVsbCB1cmwgcmVwcmVzZW50YXRpb24gd2l0aCBhbGwgc2VnbWVudHMgZW5jb2RlZCBhY2NvcmRpbmcgdG8gcnVsZXMgc3BlY2lmaWVkIGluDQotICAgKiBbUkZDIDM5ODZdKGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzM5ODYudHh0KS4NCi0gICAqDQotICAgKg0KLSAgICogYGBganMNCi0gICAqIC8vIGdpdmVuIHVybCBodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94bw0KLSAgICogdmFyIGFic1VybCA9ICRsb2NhdGlvbi5hYnNVcmwoKTsNCi0gICAqIC8vID0+ICJodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94byINCi0gICAqIGBgYA0KLSAgICoNCi0gICAqIEByZXR1cm4ge3N0cmluZ30gZnVsbCB1cmwNCi0gICAqLw0KLSAgYWJzVXJsOiBsb2NhdGlvbkdldHRlcignJCRhYnNVcmwnKSwNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJGxvY2F0aW9uI3VybA0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIC8gc2V0dGVyLg0KLSAgICoNCi0gICAqIFJldHVybiB1cmwgKGUuZy4gYC9wYXRoP2E9YiNoYXNoYCkgd2hlbiBjYWxsZWQgd2l0aG91dCBhbnkgcGFyYW1ldGVyLg0KLSAgICoNCi0gICAqIENoYW5nZSBwYXRoLCBzZWFyY2ggYW5kIGhhc2gsIHdoZW4gY2FsbGVkIHdpdGggcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuDQotICAgKg0KLSAgICoNCi0gICAqIGBgYGpzDQotICAgKiAvLyBnaXZlbiB1cmwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8NCi0gICAqIHZhciB1cmwgPSAkbG9jYXRpb24udXJsKCk7DQotICAgKiAvLyA9PiAiL3NvbWUvcGF0aD9mb289YmFyJmJhej14b3hvIg0KLSAgICogYGBgDQotICAgKg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSB1cmwgTmV3IHVybCB3aXRob3V0IGJhc2UgcHJlZml4IChlLmcuIGAvcGF0aD9hPWIjaGFzaGApDQotICAgKiBAcmV0dXJuIHtzdHJpbmd9IHVybA0KLSAgICovDQotICB1cmw6IGZ1bmN0aW9uKHVybCkgew0KLSAgICBpZiAoaXNVbmRlZmluZWQodXJsKSkNCi0gICAgICByZXR1cm4gdGhpcy4kJHVybDsNCi0NCi0gICAgdmFyIG1hdGNoID0gUEFUSF9NQVRDSC5leGVjKHVybCk7DQotICAgIGlmIChtYXRjaFsxXSB8fCB1cmwgPT09ICcnKSB0aGlzLnBhdGgoZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzFdKSk7DQotICAgIGlmIChtYXRjaFsyXSB8fCBtYXRjaFsxXSB8fCB1cmwgPT09ICcnKSB0aGlzLnNlYXJjaChtYXRjaFszXSB8fCAnJyk7DQotICAgIHRoaXMuaGFzaChtYXRjaFs1XSB8fCAnJyk7DQotDQotICAgIHJldHVybiB0aGlzOw0KLSAgfSwNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJGxvY2F0aW9uI3Byb3RvY29sDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgb25seS4NCi0gICAqDQotICAgKiBSZXR1cm4gcHJvdG9jb2wgb2YgY3VycmVudCB1cmwuDQotICAgKg0KLSAgICoNCi0gICAqIGBgYGpzDQotICAgKiAvLyBnaXZlbiB1cmwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8NCi0gICAqIHZhciBwcm90b2NvbCA9ICRsb2NhdGlvbi5wcm90b2NvbCgpOw0KLSAgICogLy8gPT4gImh0dHAiDQotICAgKiBgYGANCi0gICAqDQotICAgKiBAcmV0dXJuIHtzdHJpbmd9IHByb3RvY29sIG9mIGN1cnJlbnQgdXJsDQotICAgKi8NCi0gIHByb3RvY29sOiBsb2NhdGlvbkdldHRlcignJCRwcm90b2NvbCcpLA0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSAkbG9jYXRpb24jaG9zdA0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIG9ubHkuDQotICAgKg0KLSAgICogUmV0dXJuIGhvc3Qgb2YgY3VycmVudCB1cmwuDQotICAgKg0KLSAgICoNCi0gICAqIGBgYGpzDQotICAgKiAvLyBnaXZlbiB1cmwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8NCi0gICAqIHZhciBob3N0ID0gJGxvY2F0aW9uLmhvc3QoKTsNCi0gICAqIC8vID0+ICJleGFtcGxlLmNvbSINCi0gICAqIGBgYA0KLSAgICoNCi0gICAqIEByZXR1cm4ge3N0cmluZ30gaG9zdCBvZiBjdXJyZW50IHVybC4NCi0gICAqLw0KLSAgaG9zdDogbG9jYXRpb25HZXR0ZXIoJyQkaG9zdCcpLA0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSAkbG9jYXRpb24jcG9ydA0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIG9ubHkuDQotICAgKg0KLSAgICogUmV0dXJuIHBvcnQgb2YgY3VycmVudCB1cmwuDQotICAgKg0KLSAgICoNCi0gICAqIGBgYGpzDQotICAgKiAvLyBnaXZlbiB1cmwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8NCi0gICAqIHZhciBwb3J0ID0gJGxvY2F0aW9uLnBvcnQoKTsNCi0gICAqIC8vID0+IDgwDQotICAgKiBgYGANCi0gICAqDQotICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHBvcnQNCi0gICAqLw0KLSAgcG9ydDogbG9jYXRpb25HZXR0ZXIoJyQkcG9ydCcpLA0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSAkbG9jYXRpb24jcGF0aA0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIC8gc2V0dGVyLg0KLSAgICoNCi0gICAqIFJldHVybiBwYXRoIG9mIGN1cnJlbnQgdXJsIHdoZW4gY2FsbGVkIHdpdGhvdXQgYW55IHBhcmFtZXRlci4NCi0gICAqDQotICAgKiBDaGFuZ2UgcGF0aCB3aGVuIGNhbGxlZCB3aXRoIHBhcmFtZXRlciBhbmQgcmV0dXJuIGAkbG9jYXRpb25gLg0KLSAgICoNCi0gICAqIE5vdGU6IFBhdGggc2hvdWxkIGFsd2F5cyBiZWdpbiB3aXRoIGZvcndhcmQgc2xhc2ggKC8pLCB0aGlzIG1ldGhvZCB3aWxsIGFkZCB0aGUgZm9yd2FyZCBzbGFzaA0KLSAgICogaWYgaXQgaXMgbWlzc2luZy4NCi0gICAqDQotICAgKg0KLSAgICogYGBganMNCi0gICAqIC8vIGdpdmVuIHVybCBodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94bw0KLSAgICogdmFyIHBhdGggPSAkbG9jYXRpb24ucGF0aCgpOw0KLSAgICogLy8gPT4gIi9zb21lL3BhdGgiDQotICAgKiBgYGANCi0gICAqDQotICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKT19IHBhdGggTmV3IHBhdGgNCi0gICAqIEByZXR1cm4ge3N0cmluZ30gcGF0aA0KLSAgICovDQotICBwYXRoOiBsb2NhdGlvbkdldHRlclNldHRlcignJCRwYXRoJywgZnVuY3Rpb24ocGF0aCkgew0KLSAgICBwYXRoID0gcGF0aCAhPT0gbnVsbCA/IHBhdGgudG9TdHJpbmcoKSA6ICcnOw0KLSAgICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT0gJy8nID8gcGF0aCA6ICcvJyArIHBhdGg7DQotICB9KSwNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJGxvY2F0aW9uI3NlYXJjaA0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIC8gc2V0dGVyLg0KLSAgICoNCi0gICAqIFJldHVybiBzZWFyY2ggcGFydCAoYXMgb2JqZWN0KSBvZiBjdXJyZW50IHVybCB3aGVuIGNhbGxlZCB3aXRob3V0IGFueSBwYXJhbWV0ZXIuDQotICAgKg0KLSAgICogQ2hhbmdlIHNlYXJjaCBwYXJ0IHdoZW4gY2FsbGVkIHdpdGggcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuDQotICAgKg0KLSAgICoNCi0gICAqIGBgYGpzDQotICAgKiAvLyBnaXZlbiB1cmwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8NCi0gICAqIHZhciBzZWFyY2hPYmplY3QgPSAkbG9jYXRpb24uc2VhcmNoKCk7DQotICAgKiAvLyA9PiB7Zm9vOiAnYmFyJywgYmF6OiAneG94byd9DQotICAgKg0KLSAgICogLy8gc2V0IGZvbyB0byAneWlwZWUnDQotICAgKiAkbG9jYXRpb24uc2VhcmNoKCdmb28nLCAneWlwZWUnKTsNCi0gICAqIC8vICRsb2NhdGlvbi5zZWFyY2goKSA9PiB7Zm9vOiAneWlwZWUnLCBiYXo6ICd4b3hvJ30NCi0gICAqIGBgYA0KLSAgICoNCi0gICAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdC48c3RyaW5nPnxPYmplY3QuPEFycmF5LjxzdHJpbmc+Pn0gc2VhcmNoIE5ldyBzZWFyY2ggcGFyYW1zIC0gc3RyaW5nIG9yDQotICAgKiBoYXNoIG9iamVjdC4NCi0gICAqDQotICAgKiBXaGVuIGNhbGxlZCB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50IHRoZSBtZXRob2QgYWN0cyBhcyBhIHNldHRlciwgc2V0dGluZyB0aGUgYHNlYXJjaGAgY29tcG9uZW50DQotICAgKiBvZiBgJGxvY2F0aW9uYCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLg0KLSAgICoNCi0gICAqIElmIHRoZSBhcmd1bWVudCBpcyBhIGhhc2ggb2JqZWN0IGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgdmFsdWVzLCB0aGVzZSB2YWx1ZXMgd2lsbCBiZSBlbmNvZGVkDQotICAgKiBhcyBkdXBsaWNhdGUgc2VhcmNoIHBhcmFtZXRlcnMgaW4gdGhlIHVybC4NCi0gICAqDQotICAgKiBAcGFyYW0geyhzdHJpbmd8TnVtYmVyfEFycmF5PHN0cmluZz58Ym9vbGVhbik9fSBwYXJhbVZhbHVlIElmIGBzZWFyY2hgIGlzIGEgc3RyaW5nIG9yIG51bWJlciwgdGhlbiBgcGFyYW1WYWx1ZWANCi0gICAqIHdpbGwgb3ZlcnJpZGUgb25seSBhIHNpbmdsZSBzZWFyY2ggcHJvcGVydHkuDQotICAgKg0KLSAgICogSWYgYHBhcmFtVmFsdWVgIGlzIGFuIGFycmF5LCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBwcm9wZXJ0eSBvZiB0aGUgYHNlYXJjaGAgY29tcG9uZW50IG9mDQotICAgKiBgJGxvY2F0aW9uYCBzcGVjaWZpZWQgdmlhIHRoZSBmaXJzdCBhcmd1bWVudC4NCi0gICAqDQotICAgKiBJZiBgcGFyYW1WYWx1ZWAgaXMgYG51bGxgLCB0aGUgcHJvcGVydHkgc3BlY2lmaWVkIHZpYSB0aGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSBkZWxldGVkLg0KLSAgICoNCi0gICAqIElmIGBwYXJhbVZhbHVlYCBpcyBgdHJ1ZWAsIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgdmlhIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIGFkZGVkIHdpdGggbm8NCi0gICAqIHZhbHVlIG5vciB0cmFpbGluZyBlcXVhbCBzaWduLg0KLSAgICoNCi0gICAqIEByZXR1cm4ge09iamVjdH0gSWYgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzIHJldHVybnMgdGhlIHBhcnNlZCBgc2VhcmNoYCBvYmplY3QuIElmIGNhbGxlZCB3aXRoDQotICAgKiBvbmUgb3IgbW9yZSBhcmd1bWVudHMgcmV0dXJucyBgJGxvY2F0aW9uYCBvYmplY3QgaXRzZWxmLg0KLSAgICovDQotICBzZWFyY2g6IGZ1bmN0aW9uKHNlYXJjaCwgcGFyYW1WYWx1ZSkgew0KLSAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHsNCi0gICAgICBjYXNlIDA6DQotICAgICAgICByZXR1cm4gdGhpcy4kJHNlYXJjaDsNCi0gICAgICBjYXNlIDE6DQotICAgICAgICBpZiAoaXNTdHJpbmcoc2VhcmNoKSB8fCBpc051bWJlcihzZWFyY2gpKSB7DQotICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC50b1N0cmluZygpOw0KLSAgICAgICAgICB0aGlzLiQkc2VhcmNoID0gcGFyc2VLZXlWYWx1ZShzZWFyY2gpOw0KLSAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChzZWFyY2gpKSB7DQotICAgICAgICAgIHNlYXJjaCA9IGNvcHkoc2VhcmNoLCB7fSk7DQotICAgICAgICAgIC8vIHJlbW92ZSBvYmplY3QgdW5kZWZpbmVkIG9yIG51bGwgcHJvcGVydGllcw0KLSAgICAgICAgICBmb3JFYWNoKHNlYXJjaCwgZnVuY3Rpb24odmFsdWUsIGtleSkgew0KLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSBkZWxldGUgc2VhcmNoW2tleV07DQotICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgICB0aGlzLiQkc2VhcmNoID0gc2VhcmNoOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgdGhyb3cgJGxvY2F0aW9uTWluRXJyKCdpc3JjaGFyZycsDQotICAgICAgICAgICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBgJGxvY2F0aW9uI3NlYXJjaCgpYCBjYWxsIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gb2JqZWN0LicpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotICAgICAgZGVmYXVsdDoNCi0gICAgICAgIGlmIChpc1VuZGVmaW5lZChwYXJhbVZhbHVlKSB8fCBwYXJhbVZhbHVlID09PSBudWxsKSB7DQotICAgICAgICAgIGRlbGV0ZSB0aGlzLiQkc2VhcmNoW3NlYXJjaF07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICB0aGlzLiQkc2VhcmNoW3NlYXJjaF0gPSBwYXJhbVZhbHVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHRoaXMuJCRjb21wb3NlKCk7DQotICAgIHJldHVybiB0aGlzOw0KLSAgfSwNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJGxvY2F0aW9uI2hhc2gNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciAvIHNldHRlci4NCi0gICAqDQotICAgKiBSZXR1cm4gaGFzaCBmcmFnbWVudCB3aGVuIGNhbGxlZCB3aXRob3V0IGFueSBwYXJhbWV0ZXIuDQotICAgKg0KLSAgICogQ2hhbmdlIGhhc2ggZnJhZ21lbnQgd2hlbiBjYWxsZWQgd2l0aCBwYXJhbWV0ZXIgYW5kIHJldHVybiBgJGxvY2F0aW9uYC4NCi0gICAqDQotICAgKg0KLSAgICogYGBganMNCi0gICAqIC8vIGdpdmVuIHVybCBodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94byNoYXNoVmFsdWUNCi0gICAqIHZhciBoYXNoID0gJGxvY2F0aW9uLmhhc2goKTsNCi0gICAqIC8vID0+ICJoYXNoVmFsdWUiDQotICAgKiBgYGANCi0gICAqDQotICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKT19IGhhc2ggTmV3IGhhc2ggZnJhZ21lbnQNCi0gICAqIEByZXR1cm4ge3N0cmluZ30gaGFzaA0KLSAgICovDQotICBoYXNoOiBsb2NhdGlvbkdldHRlclNldHRlcignJCRoYXNoJywgZnVuY3Rpb24oaGFzaCkgew0KLSAgICByZXR1cm4gaGFzaCAhPT0gbnVsbCA/IGhhc2gudG9TdHJpbmcoKSA6ICcnOw0KLSAgfSksDQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lICRsb2NhdGlvbiNyZXBsYWNlDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBJZiBjYWxsZWQsIGFsbCBjaGFuZ2VzIHRvICRsb2NhdGlvbiBkdXJpbmcgY3VycmVudCBgJGRpZ2VzdGAgd2lsbCBiZSByZXBsYWNpbmcgY3VycmVudCBoaXN0b3J5DQotICAgKiByZWNvcmQsIGluc3RlYWQgb2YgYWRkaW5nIG5ldyBvbmUuDQotICAgKi8NCi0gIHJlcGxhY2U6IGZ1bmN0aW9uKCkgew0KLSAgICB0aGlzLiQkcmVwbGFjZSA9IHRydWU7DQotICAgIHJldHVybiB0aGlzOw0KLSAgfQ0KLX07DQotDQotZm9yRWFjaChbTG9jYXRpb25IYXNoYmFuZ0luSHRtbDVVcmwsIExvY2F0aW9uSGFzaGJhbmdVcmwsIExvY2F0aW9uSHRtbDVVcmxdLCBmdW5jdGlvbihMb2NhdGlvbikgew0KLSAgTG9jYXRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShsb2NhdGlvblByb3RvdHlwZSk7DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lICRsb2NhdGlvbiNzdGF0ZQ0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIC8gc2V0dGVyLg0KLSAgICoNCi0gICAqIFJldHVybiB0aGUgaGlzdG9yeSBzdGF0ZSBvYmplY3Qgd2hlbiBjYWxsZWQgd2l0aG91dCBhbnkgcGFyYW1ldGVyLg0KLSAgICoNCi0gICAqIENoYW5nZSB0aGUgaGlzdG9yeSBzdGF0ZSBvYmplY3Qgd2hlbiBjYWxsZWQgd2l0aCBvbmUgcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuDQotICAgKiBUaGUgc3RhdGUgb2JqZWN0IGlzIGxhdGVyIHBhc3NlZCB0byBgcHVzaFN0YXRlYCBvciBgcmVwbGFjZVN0YXRlYC4NCi0gICAqDQotICAgKiBOT1RFOiBUaGlzIG1ldGhvZCBpcyBzdXBwb3J0ZWQgb25seSBpbiBIVE1MNSBtb2RlIGFuZCBvbmx5IGluIGJyb3dzZXJzIHN1cHBvcnRpbmcNCi0gICAqIHRoZSBIVE1MNSBIaXN0b3J5IEFQSSAoaS5lLiBtZXRob2RzIGBwdXNoU3RhdGVgIGFuZCBgcmVwbGFjZVN0YXRlYCkuIElmIHlvdSBuZWVkIHRvIHN1cHBvcnQNCi0gICAqIG9sZGVyIGJyb3dzZXJzIChsaWtlIElFOSBvciBBbmRyb2lkIDwgNC4wKSwgZG9uJ3QgdXNlIHRoaXMgbWV0aG9kLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7b2JqZWN0PX0gc3RhdGUgU3RhdGUgb2JqZWN0IGZvciBwdXNoU3RhdGUgb3IgcmVwbGFjZVN0YXRlDQotICAgKiBAcmV0dXJuIHtvYmplY3R9IHN0YXRlDQotICAgKi8NCi0gIExvY2F0aW9uLnByb3RvdHlwZS5zdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlKSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkNCi0gICAgICByZXR1cm4gdGhpcy4kJHN0YXRlOw0KLQ0KLSAgICBpZiAoTG9jYXRpb24gIT09IExvY2F0aW9uSHRtbDVVcmwgfHwgIXRoaXMuJCRodG1sNSkgew0KLSAgICAgIHRocm93ICRsb2NhdGlvbk1pbkVycignbm9zdGF0ZScsICdIaXN0b3J5IEFQSSBzdGF0ZSBzdXBwb3J0IGlzIGF2YWlsYWJsZSBvbmx5ICcgKw0KLSAgICAgICAgJ2luIEhUTUw1IG1vZGUgYW5kIG9ubHkgaW4gYnJvd3NlcnMgc3VwcG9ydGluZyBIVE1MNSBIaXN0b3J5IEFQSScpOw0KLSAgICB9DQotICAgIC8vIFRoZSB1c2VyIG1pZ2h0IG1vZGlmeSBgc3RhdGVPYmplY3RgIGFmdGVyIGludm9raW5nIGAkbG9jYXRpb24uc3RhdGUoc3RhdGVPYmplY3QpYA0KLSAgICAvLyBidXQgd2UncmUgY2hhbmdpbmcgdGhlICQkc3RhdGUgcmVmZXJlbmNlIHRvICRicm93c2VyLnN0YXRlKCkgZHVyaW5nIHRoZSAkZGlnZXN0DQotICAgIC8vIHNvIHRoZSBtb2RpZmljYXRpb24gd2luZG93IGlzIG5hcnJvdy4NCi0gICAgdGhpcy4kJHN0YXRlID0gaXNVbmRlZmluZWQoc3RhdGUpID8gbnVsbCA6IHN0YXRlOw0KLQ0KLSAgICByZXR1cm4gdGhpczsNCi0gIH07DQotfSk7DQotDQotDQotZnVuY3Rpb24gbG9jYXRpb25HZXR0ZXIocHJvcGVydHkpIHsNCi0gIHJldHVybiBmdW5jdGlvbigpIHsNCi0gICAgcmV0dXJuIHRoaXNbcHJvcGVydHldOw0KLSAgfTsNCi19DQotDQotDQotZnVuY3Rpb24gbG9jYXRpb25HZXR0ZXJTZXR0ZXIocHJvcGVydHksIHByZXByb2Nlc3MpIHsNCi0gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKQ0KLSAgICAgIHJldHVybiB0aGlzW3Byb3BlcnR5XTsNCi0NCi0gICAgdGhpc1twcm9wZXJ0eV0gPSBwcmVwcm9jZXNzKHZhbHVlKTsNCi0gICAgdGhpcy4kJGNvbXBvc2UoKTsNCi0NCi0gICAgcmV0dXJuIHRoaXM7DQotICB9Ow0KLX0NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICRsb2NhdGlvbg0KLSAqDQotICogQHJlcXVpcmVzICRyb290RWxlbWVudA0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogVGhlICRsb2NhdGlvbiBzZXJ2aWNlIHBhcnNlcyB0aGUgVVJMIGluIHRoZSBicm93c2VyIGFkZHJlc3MgYmFyIChiYXNlZCBvbiB0aGUNCi0gKiBbd2luZG93LmxvY2F0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi93aW5kb3cubG9jYXRpb24pKSBhbmQgbWFrZXMgdGhlIFVSTA0KLSAqIGF2YWlsYWJsZSB0byB5b3VyIGFwcGxpY2F0aW9uLiBDaGFuZ2VzIHRvIHRoZSBVUkwgaW4gdGhlIGFkZHJlc3MgYmFyIGFyZSByZWZsZWN0ZWQgaW50bw0KLSAqICRsb2NhdGlvbiBzZXJ2aWNlIGFuZCBjaGFuZ2VzIHRvICRsb2NhdGlvbiBhcmUgcmVmbGVjdGVkIGludG8gdGhlIGJyb3dzZXIgYWRkcmVzcyBiYXIuDQotICoNCi0gKiAqKlRoZSAkbG9jYXRpb24gc2VydmljZToqKg0KLSAqDQotICogLSBFeHBvc2VzIHRoZSBjdXJyZW50IFVSTCBpbiB0aGUgYnJvd3NlciBhZGRyZXNzIGJhciwgc28geW91IGNhbg0KLSAqICAgLSBXYXRjaCBhbmQgb2JzZXJ2ZSB0aGUgVVJMLg0KLSAqICAgLSBDaGFuZ2UgdGhlIFVSTC4NCi0gKiAtIFN5bmNocm9uaXplcyB0aGUgVVJMIHdpdGggdGhlIGJyb3dzZXIgd2hlbiB0aGUgdXNlcg0KLSAqICAgLSBDaGFuZ2VzIHRoZSBhZGRyZXNzIGJhci4NCi0gKiAgIC0gQ2xpY2tzIHRoZSBiYWNrIG9yIGZvcndhcmQgYnV0dG9uIChvciBjbGlja3MgYSBIaXN0b3J5IGxpbmspLg0KLSAqICAgLSBDbGlja3Mgb24gYSBsaW5rLg0KLSAqIC0gUmVwcmVzZW50cyB0aGUgVVJMIG9iamVjdCBhcyBhIHNldCBvZiBtZXRob2RzIChwcm90b2NvbCwgaG9zdCwgcG9ydCwgcGF0aCwgc2VhcmNoLCBoYXNoKS4NCi0gKg0KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB7QGxpbmsgZ3VpZGUvJGxvY2F0aW9uIERldmVsb3BlciBHdWlkZTogVXNpbmcgJGxvY2F0aW9ufQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBwcm92aWRlcg0KLSAqIEBuYW1lICRsb2NhdGlvblByb3ZpZGVyDQotICogQGRlc2NyaXB0aW9uDQotICogVXNlIHRoZSBgJGxvY2F0aW9uUHJvdmlkZXJgIHRvIGNvbmZpZ3VyZSBob3cgdGhlIGFwcGxpY2F0aW9uIGRlZXAgbGlua2luZyBwYXRocyBhcmUgc3RvcmVkLg0KLSAqLw0KLWZ1bmN0aW9uICRMb2NhdGlvblByb3ZpZGVyKCkgew0KLSAgdmFyIGhhc2hQcmVmaXggPSAnJywNCi0gICAgICBodG1sNU1vZGUgPSB7DQotICAgICAgICBlbmFibGVkOiBmYWxzZSwNCi0gICAgICAgIHJlcXVpcmVCYXNlOiB0cnVlLA0KLSAgICAgICAgcmV3cml0ZUxpbmtzOiB0cnVlDQotICAgICAgfTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJGxvY2F0aW9uUHJvdmlkZXIjaGFzaFByZWZpeA0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBAcGFyYW0ge3N0cmluZz19IHByZWZpeCBQcmVmaXggZm9yIGhhc2ggcGFydCAoY29udGFpbmluZyBwYXRoIGFuZCBzZWFyY2gpDQotICAgKiBAcmV0dXJucyB7Kn0gY3VycmVudCB2YWx1ZSBpZiB1c2VkIGFzIGdldHRlciBvciBpdHNlbGYgKGNoYWluaW5nKSBpZiB1c2VkIGFzIHNldHRlcg0KLSAgICovDQotICB0aGlzLmhhc2hQcmVmaXggPSBmdW5jdGlvbihwcmVmaXgpIHsNCi0gICAgaWYgKGlzRGVmaW5lZChwcmVmaXgpKSB7DQotICAgICAgaGFzaFByZWZpeCA9IHByZWZpeDsNCi0gICAgICByZXR1cm4gdGhpczsNCi0gICAgfSBlbHNlIHsNCi0gICAgICByZXR1cm4gaGFzaFByZWZpeDsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJGxvY2F0aW9uUHJvdmlkZXIjaHRtbDVNb2RlDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIEBwYXJhbSB7KGJvb2xlYW58T2JqZWN0KT19IG1vZGUgSWYgYm9vbGVhbiwgc2V0cyBgaHRtbDVNb2RlLmVuYWJsZWRgIHRvIHZhbHVlLg0KLSAgICogICBJZiBvYmplY3QsIHNldHMgYGVuYWJsZWRgLCBgcmVxdWlyZUJhc2VgIGFuZCBgcmV3cml0ZUxpbmtzYCB0byByZXNwZWN0aXZlIHZhbHVlcy4gU3VwcG9ydGVkDQotICAgKiAgIHByb3BlcnRpZXM6DQotICAgKiAgIC0gKiplbmFibGVkKiog4oA/IGB7Ym9vbGVhbn1gIOKAPyAoZGVmYXVsdDogZmFsc2UpIElmIHRydWUsIHdpbGwgcmVseSBvbiBgaGlzdG9yeS5wdXNoU3RhdGVgIHRvDQotICAgKiAgICAgY2hhbmdlIHVybHMgd2hlcmUgc3VwcG9ydGVkLiBXaWxsIGZhbGwgYmFjayB0byBoYXNoLXByZWZpeGVkIHBhdGhzIGluIGJyb3dzZXJzIHRoYXQgZG8gbm90DQotICAgKiAgICAgc3VwcG9ydCBgcHVzaFN0YXRlYC4NCi0gICAqICAgLSAqKnJlcXVpcmVCYXNlKiogLSBge2Jvb2xlYW59YCAtIChkZWZhdWx0OiBgdHJ1ZWApIFdoZW4gaHRtbDVNb2RlIGlzIGVuYWJsZWQsIHNwZWNpZmllcw0KLSAgICogICAgIHdoZXRoZXIgb3Igbm90IGEgPGJhc2U+IHRhZyBpcyByZXF1aXJlZCB0byBiZSBwcmVzZW50LiBJZiBgZW5hYmxlZGAgYW5kIGByZXF1aXJlQmFzZWAgYXJlDQotICAgKiAgICAgdHJ1ZSwgYW5kIGEgYmFzZSB0YWcgaXMgbm90IHByZXNlbnQsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIHdoZW4gYCRsb2NhdGlvbmAgaXMgaW5qZWN0ZWQuDQotICAgKiAgICAgU2VlIHRoZSB7QGxpbmsgZ3VpZGUvJGxvY2F0aW9uICRsb2NhdGlvbiBndWlkZSBmb3IgbW9yZSBpbmZvcm1hdGlvbn0NCi0gICAqICAgLSAqKnJld3JpdGVMaW5rcyoqIC0gYHtib29sZWFufWAgLSAoZGVmYXVsdDogYHRydWVgKSBXaGVuIGh0bWw1TW9kZSBpcyBlbmFibGVkLA0KLSAgICogICAgIGVuYWJsZXMvZGlzYWJsZXMgdXJsIHJld3JpdGluZyBmb3IgcmVsYXRpdmUgbGlua3MuDQotICAgKg0KLSAgICogQHJldHVybnMge09iamVjdH0gaHRtbDVNb2RlIG9iamVjdCBpZiB1c2VkIGFzIGdldHRlciBvciBpdHNlbGYgKGNoYWluaW5nKSBpZiB1c2VkIGFzIHNldHRlcg0KLSAgICovDQotICB0aGlzLmh0bWw1TW9kZSA9IGZ1bmN0aW9uKG1vZGUpIHsNCi0gICAgaWYgKGlzQm9vbGVhbihtb2RlKSkgew0KLSAgICAgIGh0bWw1TW9kZS5lbmFibGVkID0gbW9kZTsNCi0gICAgICByZXR1cm4gdGhpczsNCi0gICAgfSBlbHNlIGlmIChpc09iamVjdChtb2RlKSkgew0KLQ0KLSAgICAgIGlmIChpc0Jvb2xlYW4obW9kZS5lbmFibGVkKSkgew0KLSAgICAgICAgaHRtbDVNb2RlLmVuYWJsZWQgPSBtb2RlLmVuYWJsZWQ7DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmIChpc0Jvb2xlYW4obW9kZS5yZXF1aXJlQmFzZSkpIHsNCi0gICAgICAgIGh0bWw1TW9kZS5yZXF1aXJlQmFzZSA9IG1vZGUucmVxdWlyZUJhc2U7DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmIChpc0Jvb2xlYW4obW9kZS5yZXdyaXRlTGlua3MpKSB7DQotICAgICAgICBodG1sNU1vZGUucmV3cml0ZUxpbmtzID0gbW9kZS5yZXdyaXRlTGlua3M7DQotICAgICAgfQ0KLQ0KLSAgICAgIHJldHVybiB0aGlzOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHJldHVybiBodG1sNU1vZGU7DQotICAgIH0NCi0gIH07DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBldmVudA0KLSAgICogQG5hbWUgJGxvY2F0aW9uIyRsb2NhdGlvbkNoYW5nZVN0YXJ0DQotICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIEJyb2FkY2FzdGVkIGJlZm9yZSBhIFVSTCB3aWxsIGNoYW5nZS4NCi0gICAqDQotICAgKiBUaGlzIGNoYW5nZSBjYW4gYmUgcHJldmVudGVkIGJ5IGNhbGxpbmcNCi0gICAqIGBwcmV2ZW50RGVmYXVsdGAgbWV0aG9kIG9mIHRoZSBldmVudC4gU2VlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbn0gZm9yIG1vcmUNCi0gICAqIGRldGFpbHMgYWJvdXQgZXZlbnQgb2JqZWN0LiBVcG9uIHN1Y2Nlc3NmdWwgY2hhbmdlDQotICAgKiB7QGxpbmsgbmcuJGxvY2F0aW9uIyRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MgJGxvY2F0aW9uQ2hhbmdlU3VjY2Vzc30gaXMgZmlyZWQuDQotICAgKg0KLSAgICogVGhlIGBuZXdTdGF0ZWAgYW5kIGBvbGRTdGF0ZWAgcGFyYW1ldGVycyBtYXkgYmUgZGVmaW5lZCBvbmx5IGluIEhUTUw1IG1vZGUgYW5kIHdoZW4NCi0gICAqIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBIVE1MNSBIaXN0b3J5IEFQSS4NCi0gICAqDQotICAgKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuDQotICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3VXJsIE5ldyBVUkwNCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gb2xkVXJsIFVSTCB0aGF0IHdhcyBiZWZvcmUgaXQgd2FzIGNoYW5nZWQuDQotICAgKiBAcGFyYW0ge3N0cmluZz19IG5ld1N0YXRlIE5ldyBoaXN0b3J5IHN0YXRlIG9iamVjdA0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBvbGRTdGF0ZSBIaXN0b3J5IHN0YXRlIG9iamVjdCB0aGF0IHdhcyBiZWZvcmUgaXQgd2FzIGNoYW5nZWQuDQotICAgKi8NCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIGV2ZW50DQotICAgKiBAbmFtZSAkbG9jYXRpb24jJGxvY2F0aW9uQ2hhbmdlU3VjY2Vzcw0KLSAgICogQGV2ZW50VHlwZSBicm9hZGNhc3Qgb24gcm9vdCBzY29wZQ0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBCcm9hZGNhc3RlZCBhZnRlciBhIFVSTCB3YXMgY2hhbmdlZC4NCi0gICAqDQotICAgKiBUaGUgYG5ld1N0YXRlYCBhbmQgYG9sZFN0YXRlYCBwYXJhbWV0ZXJzIG1heSBiZSBkZWZpbmVkIG9ubHkgaW4gSFRNTDUgbW9kZSBhbmQgd2hlbg0KLSAgICogdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7T2JqZWN0fSBhbmd1bGFyRXZlbnQgU3ludGhldGljIGV2ZW50IG9iamVjdC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdVcmwgTmV3IFVSTA0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBvbGRVcmwgVVJMIHRoYXQgd2FzIGJlZm9yZSBpdCB3YXMgY2hhbmdlZC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmV3U3RhdGUgTmV3IGhpc3Rvcnkgc3RhdGUgb2JqZWN0DQotICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFN0YXRlIEhpc3Rvcnkgc3RhdGUgb2JqZWN0IHRoYXQgd2FzIGJlZm9yZSBpdCB3YXMgY2hhbmdlZC4NCi0gICAqLw0KLQ0KLSAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywgJyRicm93c2VyJywgJyRzbmlmZmVyJywgJyRyb290RWxlbWVudCcsICckd2luZG93JywNCi0gICAgICBmdW5jdGlvbigkcm9vdFNjb3BlLCAkYnJvd3NlciwgJHNuaWZmZXIsICRyb290RWxlbWVudCwgJHdpbmRvdykgew0KLSAgICB2YXIgJGxvY2F0aW9uLA0KLSAgICAgICAgTG9jYXRpb25Nb2RlLA0KLSAgICAgICAgYmFzZUhyZWYgPSAkYnJvd3Nlci5iYXNlSHJlZigpLCAvLyBpZiBiYXNlW2hyZWZdIGlzIHVuZGVmaW5lZCwgaXQgZGVmYXVsdHMgdG8gJycNCi0gICAgICAgIGluaXRpYWxVcmwgPSAkYnJvd3Nlci51cmwoKSwNCi0gICAgICAgIGFwcEJhc2U7DQotDQotICAgIGlmIChodG1sNU1vZGUuZW5hYmxlZCkgew0KLSAgICAgIGlmICghYmFzZUhyZWYgJiYgaHRtbDVNb2RlLnJlcXVpcmVCYXNlKSB7DQotICAgICAgICB0aHJvdyAkbG9jYXRpb25NaW5FcnIoJ25vYmFzZScsDQotICAgICAgICAgICIkbG9jYXRpb24gaW4gSFRNTDUgbW9kZSByZXF1aXJlcyBhIDxiYXNlPiB0YWcgdG8gYmUgcHJlc2VudCEiKTsNCi0gICAgICB9DQotICAgICAgYXBwQmFzZSA9IHNlcnZlckJhc2UoaW5pdGlhbFVybCkgKyAoYmFzZUhyZWYgfHwgJy8nKTsNCi0gICAgICBMb2NhdGlvbk1vZGUgPSAkc25pZmZlci5oaXN0b3J5ID8gTG9jYXRpb25IdG1sNVVybCA6IExvY2F0aW9uSGFzaGJhbmdJbkh0bWw1VXJsOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGFwcEJhc2UgPSBzdHJpcEhhc2goaW5pdGlhbFVybCk7DQotICAgICAgTG9jYXRpb25Nb2RlID0gTG9jYXRpb25IYXNoYmFuZ1VybDsNCi0gICAgfQ0KLSAgICAkbG9jYXRpb24gPSBuZXcgTG9jYXRpb25Nb2RlKGFwcEJhc2UsICcjJyArIGhhc2hQcmVmaXgpOw0KLSAgICAkbG9jYXRpb24uJCRwYXJzZUxpbmtVcmwoaW5pdGlhbFVybCwgaW5pdGlhbFVybCk7DQotDQotICAgICRsb2NhdGlvbi4kJHN0YXRlID0gJGJyb3dzZXIuc3RhdGUoKTsNCi0NCi0gICAgdmFyIElHTk9SRV9VUklfUkVHRVhQID0gL15ccyooamF2YXNjcmlwdHxtYWlsdG8pOi9pOw0KLQ0KLSAgICBmdW5jdGlvbiBzZXRCcm93c2VyVXJsV2l0aEZhbGxiYWNrKHVybCwgcmVwbGFjZSwgc3RhdGUpIHsNCi0gICAgICB2YXIgb2xkVXJsID0gJGxvY2F0aW9uLnVybCgpOw0KLSAgICAgIHZhciBvbGRTdGF0ZSA9ICRsb2NhdGlvbi4kJHN0YXRlOw0KLSAgICAgIHRyeSB7DQotICAgICAgICAkYnJvd3Nlci51cmwodXJsLCByZXBsYWNlLCBzdGF0ZSk7DQotDQotICAgICAgICAvLyBNYWtlIHN1cmUgJGxvY2F0aW9uLnN0YXRlKCkgcmV0dXJucyByZWZlcmVudGlhbGx5IGlkZW50aWNhbCAobm90IGp1c3QgZGVlcGx5IGVxdWFsKQ0KLSAgICAgICAgLy8gc3RhdGUgb2JqZWN0OyB0aGlzIG1ha2VzIHBvc3NpYmxlIHF1aWNrIGNoZWNraW5nIGlmIHRoZSBzdGF0ZSBjaGFuZ2VkIGluIHRoZSBkaWdlc3QNCi0gICAgICAgIC8vIGxvb3AuIENoZWNraW5nIGRlZXAgZXF1YWxpdHkgd291bGQgYmUgdG9vIGV4cGVuc2l2ZS4NCi0gICAgICAgICRsb2NhdGlvbi4kJHN0YXRlID0gJGJyb3dzZXIuc3RhdGUoKTsNCi0gICAgICB9IGNhdGNoIChlKSB7DQotICAgICAgICAvLyBSZXN0b3JlIG9sZCB2YWx1ZXMgaWYgcHVzaFN0YXRlIGZhaWxzDQotICAgICAgICAkbG9jYXRpb24udXJsKG9sZFVybCk7DQotICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9IG9sZFN0YXRlOw0KLQ0KLSAgICAgICAgdGhyb3cgZTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgJHJvb3RFbGVtZW50Lm9uKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7DQotICAgICAgLy8gVE9ETyh2b2p0YSk6IHJld3JpdGUgbGluayB3aGVuIG9wZW5pbmcgaW4gbmV3IHRhYi93aW5kb3cgKGluIGxlZ2FjeSBicm93c2VyKQ0KLSAgICAgIC8vIGN1cnJlbnRseSB3ZSBvcGVuIG5pY2UgdXJsIGxpbmsgYW5kIHJlZGlyZWN0IHRoZW4NCi0NCi0gICAgICBpZiAoIWh0bWw1TW9kZS5yZXdyaXRlTGlua3MgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LndoaWNoID09IDIpIHJldHVybjsNCi0NCi0gICAgICB2YXIgZWxtID0ganFMaXRlKGV2ZW50LnRhcmdldCk7DQotDQotICAgICAgLy8gdHJhdmVyc2UgdGhlIERPTSB1cCB0byBmaW5kIGZpcnN0IEEgdGFnDQotICAgICAgd2hpbGUgKG5vZGVOYW1lXyhlbG1bMF0pICE9PSAnYScpIHsNCi0gICAgICAgIC8vIGlnbm9yZSByZXdyaXRpbmcgaWYgbm8gQSB0YWcgKHJlYWNoZWQgcm9vdCBlbGVtZW50LCBvciBubyBwYXJlbnQgLSByZW1vdmVkIGZyb20gZG9jdW1lbnQpDQotICAgICAgICBpZiAoZWxtWzBdID09PSAkcm9vdEVsZW1lbnRbMF0gfHwgIShlbG0gPSBlbG0ucGFyZW50KCkpWzBdKSByZXR1cm47DQotICAgICAgfQ0KLQ0KLSAgICAgIHZhciBhYnNIcmVmID0gZWxtLnByb3AoJ2hyZWYnKTsNCi0gICAgICAvLyBnZXQgdGhlIGFjdHVhbCBocmVmIGF0dHJpYnV0ZSAtIHNlZQ0KLSAgICAgIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kZDM0NzE0OCh2PXZzLjg1KS5hc3B4DQotICAgICAgdmFyIHJlbEhyZWYgPSBlbG0uYXR0cignaHJlZicpIHx8IGVsbS5hdHRyKCd4bGluazpocmVmJyk7DQotDQotICAgICAgaWYgKGlzT2JqZWN0KGFic0hyZWYpICYmIGFic0hyZWYudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgU1ZHQW5pbWF0ZWRTdHJpbmddJykgew0KLSAgICAgICAgLy8gU1ZHQW5pbWF0ZWRTdHJpbmcuYW5pbVZhbCBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIFNWR0FuaW1hdGVkU3RyaW5nLmJhc2VWYWwsIHVubGVzcyBkdXJpbmcNCi0gICAgICAgIC8vIGFuIGFuaW1hdGlvbi4NCi0gICAgICAgIGFic0hyZWYgPSB1cmxSZXNvbHZlKGFic0hyZWYuYW5pbVZhbCkuaHJlZjsNCi0gICAgICB9DQotDQotICAgICAgLy8gSWdub3JlIHdoZW4gdXJsIGlzIHN0YXJ0ZWQgd2l0aCBqYXZhc2NyaXB0OiBvciBtYWlsdG86DQotICAgICAgaWYgKElHTk9SRV9VUklfUkVHRVhQLnRlc3QoYWJzSHJlZikpIHJldHVybjsNCi0NCi0gICAgICBpZiAoYWJzSHJlZiAmJiAhZWxtLmF0dHIoJ3RhcmdldCcpICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgew0KLSAgICAgICAgaWYgKCRsb2NhdGlvbi4kJHBhcnNlTGlua1VybChhYnNIcmVmLCByZWxIcmVmKSkgew0KLSAgICAgICAgICAvLyBXZSBkbyBhIHByZXZlbnREZWZhdWx0IGZvciBhbGwgdXJscyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBhbmd1bGFyIGFwcGxpY2F0aW9uLA0KLSAgICAgICAgICAvLyBpbiBodG1sNW1vZGUgYW5kIGFsc28gd2l0aG91dCwgc28gdGhhdCB3ZSBhcmUgYWJsZSB0byBhYm9ydCBuYXZpZ2F0aW9uIHdpdGhvdXQNCi0gICAgICAgICAgLy8gZ2V0dGluZyBkb3VibGUgZW50cmllcyBpbiB0aGUgbG9jYXRpb24gaGlzdG9yeS4NCi0gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCi0gICAgICAgICAgLy8gdXBkYXRlIGxvY2F0aW9uIG1hbnVhbGx5DQotICAgICAgICAgIGlmICgkbG9jYXRpb24uYWJzVXJsKCkgIT0gJGJyb3dzZXIudXJsKCkpIHsNCi0gICAgICAgICAgICAkcm9vdFNjb3BlLiRhcHBseSgpOw0KLSAgICAgICAgICAgIC8vIGhhY2sgdG8gd29yayBhcm91bmQgRkY2IGJ1ZyA2ODQyMDggd2hlbiBzY2VuYXJpbyBydW5uZXIgY2xpY2tzIG9uIGxpbmtzDQotICAgICAgICAgICAgJHdpbmRvdy5hbmd1bGFyWydmZi02ODQyMDgtcHJldmVudERlZmF1bHQnXSA9IHRydWU7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0pOw0KLQ0KLQ0KLSAgICAvLyByZXdyaXRlIGhhc2hiYW5nIHVybCA8PiBodG1sNSB1cmwNCi0gICAgaWYgKCRsb2NhdGlvbi5hYnNVcmwoKSAhPSBpbml0aWFsVXJsKSB7DQotICAgICAgJGJyb3dzZXIudXJsKCRsb2NhdGlvbi5hYnNVcmwoKSwgdHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgdmFyIGluaXRpYWxpemluZyA9IHRydWU7DQotDQotICAgIC8vIHVwZGF0ZSAkbG9jYXRpb24gd2hlbiAkYnJvd3NlciB1cmwgY2hhbmdlcw0KLSAgICAkYnJvd3Nlci5vblVybENoYW5nZShmdW5jdGlvbihuZXdVcmwsIG5ld1N0YXRlKSB7DQotICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkgew0KLSAgICAgICAgdmFyIG9sZFVybCA9ICRsb2NhdGlvbi5hYnNVcmwoKTsNCi0gICAgICAgIHZhciBvbGRTdGF0ZSA9ICRsb2NhdGlvbi4kJHN0YXRlOw0KLSAgICAgICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQ7DQotDQotICAgICAgICAkbG9jYXRpb24uJCRwYXJzZShuZXdVcmwpOw0KLSAgICAgICAgJGxvY2F0aW9uLiQkc3RhdGUgPSBuZXdTdGF0ZTsNCi0NCi0gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQgPSAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRsb2NhdGlvbkNoYW5nZVN0YXJ0JywgbmV3VXJsLCBvbGRVcmwsDQotICAgICAgICAgICAgbmV3U3RhdGUsIG9sZFN0YXRlKS5kZWZhdWx0UHJldmVudGVkOw0KLQ0KLSAgICAgICAgLy8gaWYgdGhlIGxvY2F0aW9uIHdhcyBjaGFuZ2VkIGJ5IGEgYCRsb2NhdGlvbkNoYW5nZVN0YXJ0YCBoYW5kbGVyIHRoZW4gc3RvcA0KLSAgICAgICAgLy8gcHJvY2Vzc2luZyB0aGlzIGxvY2F0aW9uIGNoYW5nZQ0KLSAgICAgICAgaWYgKCRsb2NhdGlvbi5hYnNVcmwoKSAhPT0gbmV3VXJsKSByZXR1cm47DQotDQotICAgICAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkgew0KLSAgICAgICAgICAkbG9jYXRpb24uJCRwYXJzZShvbGRVcmwpOw0KLSAgICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9IG9sZFN0YXRlOw0KLSAgICAgICAgICBzZXRCcm93c2VyVXJsV2l0aEZhbGxiYWNrKG9sZFVybCwgZmFsc2UsIG9sZFN0YXRlKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIGluaXRpYWxpemluZyA9IGZhbHNlOw0KLSAgICAgICAgICBhZnRlckxvY2F0aW9uQ2hhbmdlKG9sZFVybCwgb2xkU3RhdGUpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0pOw0KLSAgICAgIGlmICghJHJvb3RTY29wZS4kJHBoYXNlKSAkcm9vdFNjb3BlLiRkaWdlc3QoKTsNCi0gICAgfSk7DQotDQotICAgIC8vIHVwZGF0ZSBicm93c2VyDQotICAgICRyb290U2NvcGUuJHdhdGNoKGZ1bmN0aW9uICRsb2NhdGlvbldhdGNoKCkgew0KLSAgICAgIHZhciBvbGRVcmwgPSB0cmltRW1wdHlIYXNoKCRicm93c2VyLnVybCgpKTsNCi0gICAgICB2YXIgbmV3VXJsID0gdHJpbUVtcHR5SGFzaCgkbG9jYXRpb24uYWJzVXJsKCkpOw0KLSAgICAgIHZhciBvbGRTdGF0ZSA9ICRicm93c2VyLnN0YXRlKCk7DQotICAgICAgdmFyIGN1cnJlbnRSZXBsYWNlID0gJGxvY2F0aW9uLiQkcmVwbGFjZTsNCi0gICAgICB2YXIgdXJsT3JTdGF0ZUNoYW5nZWQgPSBvbGRVcmwgIT09IG5ld1VybCB8fA0KLSAgICAgICAgKCRsb2NhdGlvbi4kJGh0bWw1ICYmICRzbmlmZmVyLmhpc3RvcnkgJiYgb2xkU3RhdGUgIT09ICRsb2NhdGlvbi4kJHN0YXRlKTsNCi0NCi0gICAgICBpZiAoaW5pdGlhbGl6aW5nIHx8IHVybE9yU3RhdGVDaGFuZ2VkKSB7DQotICAgICAgICBpbml0aWFsaXppbmcgPSBmYWxzZTsNCi0NCi0gICAgICAgICRyb290U2NvcGUuJGV2YWxBc3luYyhmdW5jdGlvbigpIHsNCi0gICAgICAgICAgdmFyIG5ld1VybCA9ICRsb2NhdGlvbi5hYnNVcmwoKTsNCi0gICAgICAgICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRsb2NhdGlvbkNoYW5nZVN0YXJ0JywgbmV3VXJsLCBvbGRVcmwsDQotICAgICAgICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSwgb2xkU3RhdGUpLmRlZmF1bHRQcmV2ZW50ZWQ7DQotDQotICAgICAgICAgIC8vIGlmIHRoZSBsb2NhdGlvbiB3YXMgY2hhbmdlZCBieSBhIGAkbG9jYXRpb25DaGFuZ2VTdGFydGAgaGFuZGxlciB0aGVuIHN0b3ANCi0gICAgICAgICAgLy8gcHJvY2Vzc2luZyB0aGlzIGxvY2F0aW9uIGNoYW5nZQ0KLSAgICAgICAgICBpZiAoJGxvY2F0aW9uLmFic1VybCgpICE9PSBuZXdVcmwpIHJldHVybjsNCi0NCi0gICAgICAgICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHsNCi0gICAgICAgICAgICAkbG9jYXRpb24uJCRwYXJzZShvbGRVcmwpOw0KLSAgICAgICAgICAgICRsb2NhdGlvbi4kJHN0YXRlID0gb2xkU3RhdGU7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKHVybE9yU3RhdGVDaGFuZ2VkKSB7DQotICAgICAgICAgICAgICBzZXRCcm93c2VyVXJsV2l0aEZhbGxiYWNrKG5ld1VybCwgY3VycmVudFJlcGxhY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFN0YXRlID09PSAkbG9jYXRpb24uJCRzdGF0ZSA/IG51bGwgOiAkbG9jYXRpb24uJCRzdGF0ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGFmdGVyTG9jYXRpb25DaGFuZ2Uob2xkVXJsLCBvbGRTdGF0ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICAgIH0NCi0NCi0gICAgICAkbG9jYXRpb24uJCRyZXBsYWNlID0gZmFsc2U7DQotDQotICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byByZXR1cm4gYW55dGhpbmcgYmVjYXVzZSAkZXZhbEFzeW5jIHdpbGwgbWFrZSB0aGUgZGlnZXN0IGxvb3AgZGlydHkgd2hlbg0KLSAgICAgIC8vIHRoZXJlIGlzIGEgY2hhbmdlDQotICAgIH0pOw0KLQ0KLSAgICByZXR1cm4gJGxvY2F0aW9uOw0KLQ0KLSAgICBmdW5jdGlvbiBhZnRlckxvY2F0aW9uQ2hhbmdlKG9sZFVybCwgb2xkU3RhdGUpIHsNCi0gICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MnLCAkbG9jYXRpb24uYWJzVXJsKCksIG9sZFVybCwNCi0gICAgICAgICRsb2NhdGlvbi4kJHN0YXRlLCBvbGRTdGF0ZSk7DQotICAgIH0NCi19XTsNCi19DQotDQotLyoqDQotICogQG5nZG9jIHNlcnZpY2UNCi0gKiBAbmFtZSAkbG9nDQotICogQHJlcXVpcmVzICR3aW5kb3cNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFNpbXBsZSBzZXJ2aWNlIGZvciBsb2dnaW5nLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHNhZmVseSB3cml0ZXMgdGhlIG1lc3NhZ2UNCi0gKiBpbnRvIHRoZSBicm93c2VyJ3MgY29uc29sZSAoaWYgcHJlc2VudCkuDQotICoNCi0gKiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgc2VydmljZSBpcyB0byBzaW1wbGlmeSBkZWJ1Z2dpbmcgYW5kIHRyb3VibGVzaG9vdGluZy4NCi0gKg0KLSAqIFRoZSBkZWZhdWx0IGlzIHRvIGxvZyBgZGVidWdgIG1lc3NhZ2VzLiBZb3UgY2FuIHVzZQ0KLSAqIHtAbGluayBuZy4kbG9nUHJvdmlkZXIgbmcuJGxvZ1Byb3ZpZGVyI2RlYnVnRW5hYmxlZH0gdG8gY2hhbmdlIHRoaXMuDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgIDxleGFtcGxlIG1vZHVsZT0ibG9nRXhhbXBsZSI+DQotICAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPg0KLSAgICAgICBhbmd1bGFyLm1vZHVsZSgnbG9nRXhhbXBsZScsIFtdKQ0KLSAgICAgICAgIC5jb250cm9sbGVyKCdMb2dDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGxvZycsIGZ1bmN0aW9uKCRzY29wZSwgJGxvZykgew0KLSAgICAgICAgICAgJHNjb3BlLiRsb2cgPSAkbG9nOw0KLSAgICAgICAgICAgJHNjb3BlLm1lc3NhZ2UgPSAnSGVsbG8gV29ybGQhJzsNCi0gICAgICAgICB9XSk7DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJMb2dDb250cm9sbGVyIj4NCi0gICAgICAgICA8cD5SZWxvYWQgdGhpcyBwYWdlIHdpdGggb3BlbiBjb25zb2xlLCBlbnRlciB0ZXh0IGFuZCBoaXQgdGhlIGxvZyBidXR0b24uLi48L3A+DQotICAgICAgICAgTWVzc2FnZToNCi0gICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9Im1lc3NhZ2UiLz4NCi0gICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPSIkbG9nLmxvZyhtZXNzYWdlKSI+bG9nPC9idXR0b24+DQotICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0iJGxvZy53YXJuKG1lc3NhZ2UpIj53YXJuPC9idXR0b24+DQotICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0iJGxvZy5pbmZvKG1lc3NhZ2UpIj5pbmZvPC9idXR0b24+DQotICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0iJGxvZy5lcnJvcihtZXNzYWdlKSI+ZXJyb3I8L2J1dHRvbj4NCi0gICAgICAgPC9kaXY+DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBwcm92aWRlcg0KLSAqIEBuYW1lICRsb2dQcm92aWRlcg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFVzZSB0aGUgYCRsb2dQcm92aWRlcmAgdG8gY29uZmlndXJlIGhvdyB0aGUgYXBwbGljYXRpb24gbG9ncyBtZXNzYWdlcw0KLSAqLw0KLWZ1bmN0aW9uICRMb2dQcm92aWRlcigpIHsNCi0gIHZhciBkZWJ1ZyA9IHRydWUsDQotICAgICAgc2VsZiA9IHRoaXM7DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lICRsb2dQcm92aWRlciNkZWJ1Z0VuYWJsZWQNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogQHBhcmFtIHtib29sZWFuPX0gZmxhZyBlbmFibGUgb3IgZGlzYWJsZSBkZWJ1ZyBsZXZlbCBtZXNzYWdlcw0KLSAgICogQHJldHVybnMgeyp9IGN1cnJlbnQgdmFsdWUgaWYgdXNlZCBhcyBnZXR0ZXIgb3IgaXRzZWxmIChjaGFpbmluZykgaWYgdXNlZCBhcyBzZXR0ZXINCi0gICAqLw0KLSAgdGhpcy5kZWJ1Z0VuYWJsZWQgPSBmdW5jdGlvbihmbGFnKSB7DQotICAgIGlmIChpc0RlZmluZWQoZmxhZykpIHsNCi0gICAgICBkZWJ1ZyA9IGZsYWc7DQotICAgIHJldHVybiB0aGlzOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHJldHVybiBkZWJ1ZzsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsIGZ1bmN0aW9uKCR3aW5kb3cpIHsNCi0gICAgcmV0dXJuIHsNCi0gICAgICAvKioNCi0gICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICogQG5hbWUgJGxvZyNsb2cNCi0gICAgICAgKg0KLSAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAqIFdyaXRlIGEgbG9nIG1lc3NhZ2UNCi0gICAgICAgKi8NCi0gICAgICBsb2c6IGNvbnNvbGVMb2coJ2xvZycpLA0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgKiBAbmFtZSAkbG9nI2luZm8NCi0gICAgICAgKg0KLSAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAqIFdyaXRlIGFuIGluZm9ybWF0aW9uIG1lc3NhZ2UNCi0gICAgICAgKi8NCi0gICAgICBpbmZvOiBjb25zb2xlTG9nKCdpbmZvJyksDQotDQotICAgICAgLyoqDQotICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAqIEBuYW1lICRsb2cjd2Fybg0KLSAgICAgICAqDQotICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICogV3JpdGUgYSB3YXJuaW5nIG1lc3NhZ2UNCi0gICAgICAgKi8NCi0gICAgICB3YXJuOiBjb25zb2xlTG9nKCd3YXJuJyksDQotDQotICAgICAgLyoqDQotICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAqIEBuYW1lICRsb2cjZXJyb3INCi0gICAgICAgKg0KLSAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAqIFdyaXRlIGFuIGVycm9yIG1lc3NhZ2UNCi0gICAgICAgKi8NCi0gICAgICBlcnJvcjogY29uc29sZUxvZygnZXJyb3InKSwNCi0NCi0gICAgICAvKioNCi0gICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICogQG5hbWUgJGxvZyNkZWJ1Zw0KLSAgICAgICAqDQotICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICogV3JpdGUgYSBkZWJ1ZyBtZXNzYWdlDQotICAgICAgICovDQotICAgICAgZGVidWc6IChmdW5jdGlvbigpIHsNCi0gICAgICAgIHZhciBmbiA9IGNvbnNvbGVMb2coJ2RlYnVnJyk7DQotDQotICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQotICAgICAgICAgIGlmIChkZWJ1Zykgew0KLSAgICAgICAgICAgIGZuLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH07DQotICAgICAgfSgpKQ0KLSAgICB9Ow0KLQ0KLSAgICBmdW5jdGlvbiBmb3JtYXRFcnJvcihhcmcpIHsNCi0gICAgICBpZiAoYXJnIGluc3RhbmNlb2YgRXJyb3IpIHsNCi0gICAgICAgIGlmIChhcmcuc3RhY2spIHsNCi0gICAgICAgICAgYXJnID0gKGFyZy5tZXNzYWdlICYmIGFyZy5zdGFjay5pbmRleE9mKGFyZy5tZXNzYWdlKSA9PT0gLTEpDQotICAgICAgICAgICAgICA/ICdFcnJvcjogJyArIGFyZy5tZXNzYWdlICsgJ1xuJyArIGFyZy5zdGFjaw0KLSAgICAgICAgICAgICAgOiBhcmcuc3RhY2s7DQotICAgICAgICB9IGVsc2UgaWYgKGFyZy5zb3VyY2VVUkwpIHsNCi0gICAgICAgICAgYXJnID0gYXJnLm1lc3NhZ2UgKyAnXG4nICsgYXJnLnNvdXJjZVVSTCArICc6JyArIGFyZy5saW5lOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gYXJnOw0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGNvbnNvbGVMb2codHlwZSkgew0KLSAgICAgIHZhciBjb25zb2xlID0gJHdpbmRvdy5jb25zb2xlIHx8IHt9LA0KLSAgICAgICAgICBsb2dGbiA9IGNvbnNvbGVbdHlwZV0gfHwgY29uc29sZS5sb2cgfHwgbm9vcCwNCi0gICAgICAgICAgaGFzQXBwbHkgPSBmYWxzZTsNCi0NCi0gICAgICAvLyBOb3RlOiByZWFkaW5nIGxvZ0ZuLmFwcGx5IHRocm93cyBhbiBlcnJvciBpbiBJRTExIGluIElFOCBkb2N1bWVudCBtb2RlLg0KLSAgICAgIC8vIFRoZSByZWFzb24gYmVoaW5kIHRoaXMgaXMgdGhhdCBjb25zb2xlLmxvZyBoYXMgdHlwZSAib2JqZWN0IiBpbiBJRTguLi4NCi0gICAgICB0cnkgew0KLSAgICAgICAgaGFzQXBwbHkgPSAhIWxvZ0ZuLmFwcGx5Ow0KLSAgICAgIH0gY2F0Y2ggKGUpIHt9DQotDQotICAgICAgaWYgKGhhc0FwcGx5KSB7DQotICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQotICAgICAgICAgIHZhciBhcmdzID0gW107DQotICAgICAgICAgIGZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbihhcmcpIHsNCi0gICAgICAgICAgICBhcmdzLnB1c2goZm9ybWF0RXJyb3IoYXJnKSk7DQotICAgICAgICAgIH0pOw0KLSAgICAgICAgICByZXR1cm4gbG9nRm4uYXBwbHkoY29uc29sZSwgYXJncyk7DQotICAgICAgICB9Ow0KLSAgICAgIH0NCi0NCi0gICAgICAvLyB3ZSBhcmUgSUUgd2hpY2ggZWl0aGVyIGRvZXNuJ3QgaGF2ZSB3aW5kb3cuY29uc29sZSA9PiB0aGlzIGlzIG5vb3AgYW5kIHdlIGRvIG5vdGhpbmcsDQotICAgICAgLy8gb3Igd2UgYXJlIElFIHdoZXJlIGNvbnNvbGUubG9nIGRvZXNuJ3QgaGF2ZSBhcHBseSBzbyB3ZSBsb2cgYXQgbGVhc3QgZmlyc3QgMiBhcmdzDQotICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFyZzEsIGFyZzIpIHsNCi0gICAgICAgIGxvZ0ZuKGFyZzEsIGFyZzIgPT0gbnVsbCA/ICcnIDogYXJnMik7DQotICAgICAgfTsNCi0gICAgfQ0KLSAgfV07DQotfQ0KLQ0KLXZhciAkcGFyc2VNaW5FcnIgPSBtaW5FcnIoJyRwYXJzZScpOw0KLQ0KLS8vIFNhbmRib3hpbmcgQW5ndWxhciBFeHByZXNzaW9ucw0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS8vIEFuZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIGdlbmVyYWxseSBjb25zaWRlcmVkIHNhZmUgYmVjYXVzZSB0aGVzZSBleHByZXNzaW9ucyBvbmx5IGhhdmUgZGlyZWN0DQotLy8gYWNjZXNzIHRvIGAkc2NvcGVgIGFuZCBsb2NhbHMuIEhvd2V2ZXIsIG9uZSBjYW4gb2J0YWluIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IEpTIGNvZGUgYnkNCi0vLyBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gbmF0aXZlIEpTIGZ1bmN0aW9ucyBzdWNoIGFzIHRoZSBGdW5jdGlvbiBjb25zdHJ1Y3Rvci4NCi0vLw0KLS8vIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgQW5ndWxhciBleHByZXNzaW9uOg0KLS8vDQotLy8gICB7fS50b1N0cmluZy5jb25zdHJ1Y3RvcignYWxlcnQoImV2aWwgSlMgY29kZSIpJykNCi0vLw0KLS8vIFRoaXMgc2FuZGJveGluZyB0ZWNobmlxdWUgaXMgbm90IHBlcmZlY3QgYW5kIGRvZXNuJ3QgYWltIHRvIGJlLiBUaGUgZ29hbCBpcyB0byBwcmV2ZW50IGV4cGxvaXRzDQotLy8gYWdhaW5zdCB0aGUgZXhwcmVzc2lvbiBsYW5ndWFnZSwgYnV0IG5vdCB0byBwcmV2ZW50IGV4cGxvaXRzIHRoYXQgd2VyZSBlbmFibGVkIGJ5IGV4cG9zaW5nDQotLy8gc2Vuc2l0aXZlIEphdmFTY3JpcHQgb3IgYnJvd3NlciBBUElzIG9uIFNjb3BlLiBFeHBvc2luZyBzdWNoIG9iamVjdHMgb24gYSBTY29wZSBpcyBuZXZlciBhIGdvb2QNCi0vLyBwcmFjdGljZSBhbmQgdGhlcmVmb3JlIHdlIGFyZSBub3QgZXZlbiB0cnlpbmcgdG8gcHJvdGVjdCBhZ2FpbnN0IGludGVyYWN0aW9uIHdpdGggYW4gb2JqZWN0DQotLy8gZXhwbGljaXRseSBleHBvc2VkIGluIHRoaXMgd2F5Lg0KLS8vDQotLy8gSW4gZ2VuZXJhbCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGFjY2VzcyBhIFdpbmRvdyBvYmplY3QgZnJvbSBhbiBhbmd1bGFyIGV4cHJlc3Npb24gdW5sZXNzIGENCi0vLyB3aW5kb3cgb3Igc29tZSBET00gb2JqZWN0IHRoYXQgaGFzIGEgcmVmZXJlbmNlIHRvIHdpbmRvdyBpcyBwdWJsaXNoZWQgb250byBhIFNjb3BlLg0KLS8vIFNpbWlsYXJseSB3ZSBwcmV2ZW50IGludm9jYXRpb25zIG9mIGZ1bmN0aW9uIGtub3duIHRvIGJlIGRhbmdlcm91cywgYXMgd2VsbCBhcyBhc3NpZ25tZW50cyB0bw0KLS8vIG5hdGl2ZSBvYmplY3RzLg0KLS8vDQotLy8gU2VlIGh0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2d1aWRlL3NlY3VyaXR5DQotDQotDQotZnVuY3Rpb24gZW5zdXJlU2FmZU1lbWJlck5hbWUobmFtZSwgZnVsbEV4cHJlc3Npb24pIHsNCi0gIGlmIChuYW1lID09PSAiX19kZWZpbmVHZXR0ZXJfXyIgfHwgbmFtZSA9PT0gIl9fZGVmaW5lU2V0dGVyX18iDQotICAgICAgfHwgbmFtZSA9PT0gIl9fbG9va3VwR2V0dGVyX18iIHx8IG5hbWUgPT09ICJfX2xvb2t1cFNldHRlcl9fIg0KLSAgICAgIHx8IG5hbWUgPT09ICJfX3Byb3RvX18iKSB7DQotICAgIHRocm93ICRwYXJzZU1pbkVycignaXNlY2ZsZCcsDQotICAgICAgICAnQXR0ZW1wdGluZyB0byBhY2Nlc3MgYSBkaXNhbGxvd2VkIGZpZWxkIGluIEFuZ3VsYXIgZXhwcmVzc2lvbnMhICcNCi0gICAgICAgICsgJ0V4cHJlc3Npb246IHswfScsIGZ1bGxFeHByZXNzaW9uKTsNCi0gIH0NCi0gIHJldHVybiBuYW1lOw0KLX0NCi0NCi1mdW5jdGlvbiBlbnN1cmVTYWZlT2JqZWN0KG9iaiwgZnVsbEV4cHJlc3Npb24pIHsNCi0gIC8vIG5pZnR5IGNoZWNrIGlmIG9iaiBpcyBGdW5jdGlvbiB0aGF0IGlzIGZhc3QgYW5kIHdvcmtzIGFjcm9zcyBpZnJhbWVzIGFuZCBvdGhlciBjb250ZXh0cw0KLSAgaWYgKG9iaikgew0KLSAgICBpZiAob2JqLmNvbnN0cnVjdG9yID09PSBvYmopIHsNCi0gICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2lzZWNmbicsDQotICAgICAgICAgICdSZWZlcmVuY2luZyBGdW5jdGlvbiBpbiBBbmd1bGFyIGV4cHJlc3Npb25zIGlzIGRpc2FsbG93ZWQhIEV4cHJlc3Npb246IHswfScsDQotICAgICAgICAgIGZ1bGxFeHByZXNzaW9uKTsNCi0gICAgfSBlbHNlIGlmICgvLyBpc1dpbmRvdyhvYmopDQotICAgICAgICBvYmoud2luZG93ID09PSBvYmopIHsNCi0gICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2lzZWN3aW5kb3cnLA0KLSAgICAgICAgICAnUmVmZXJlbmNpbmcgdGhlIFdpbmRvdyBpbiBBbmd1bGFyIGV4cHJlc3Npb25zIGlzIGRpc2FsbG93ZWQhIEV4cHJlc3Npb246IHswfScsDQotICAgICAgICAgIGZ1bGxFeHByZXNzaW9uKTsNCi0gICAgfSBlbHNlIGlmICgvLyBpc0VsZW1lbnQob2JqKQ0KLSAgICAgICAgb2JqLmNoaWxkcmVuICYmIChvYmoubm9kZU5hbWUgfHwgKG9iai5wcm9wICYmIG9iai5hdHRyICYmIG9iai5maW5kKSkpIHsNCi0gICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2lzZWNkb20nLA0KLSAgICAgICAgICAnUmVmZXJlbmNpbmcgRE9NIG5vZGVzIGluIEFuZ3VsYXIgZXhwcmVzc2lvbnMgaXMgZGlzYWxsb3dlZCEgRXhwcmVzc2lvbjogezB9JywNCi0gICAgICAgICAgZnVsbEV4cHJlc3Npb24pOw0KLSAgICB9IGVsc2UgaWYgKC8vIGJsb2NrIE9iamVjdCBzbyB0aGF0IHdlIGNhbid0IGdldCBob2xkIG9mIGRhbmdlcm91cyBPYmplY3QuKiBtZXRob2RzDQotICAgICAgICBvYmogPT09IE9iamVjdCkgew0KLSAgICAgIHRocm93ICRwYXJzZU1pbkVycignaXNlY29iaicsDQotICAgICAgICAgICdSZWZlcmVuY2luZyBPYmplY3QgaW4gQW5ndWxhciBleHByZXNzaW9ucyBpcyBkaXNhbGxvd2VkISBFeHByZXNzaW9uOiB7MH0nLA0KLSAgICAgICAgICBmdWxsRXhwcmVzc2lvbik7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBvYmo7DQotfQ0KLQ0KLXZhciBDQUxMID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7DQotdmFyIEFQUExZID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5Ow0KLXZhciBCSU5EID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ7DQotDQotZnVuY3Rpb24gZW5zdXJlU2FmZUZ1bmN0aW9uKG9iaiwgZnVsbEV4cHJlc3Npb24pIHsNCi0gIGlmIChvYmopIHsNCi0gICAgaWYgKG9iai5jb25zdHJ1Y3RvciA9PT0gb2JqKSB7DQotICAgICAgdGhyb3cgJHBhcnNlTWluRXJyKCdpc2VjZm4nLA0KLSAgICAgICAgJ1JlZmVyZW5jaW5nIEZ1bmN0aW9uIGluIEFuZ3VsYXIgZXhwcmVzc2lvbnMgaXMgZGlzYWxsb3dlZCEgRXhwcmVzc2lvbjogezB9JywNCi0gICAgICAgIGZ1bGxFeHByZXNzaW9uKTsNCi0gICAgfSBlbHNlIGlmIChvYmogPT09IENBTEwgfHwgb2JqID09PSBBUFBMWSB8fCBvYmogPT09IEJJTkQpIHsNCi0gICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2lzZWNmZicsDQotICAgICAgICAnUmVmZXJlbmNpbmcgY2FsbCwgYXBwbHkgb3IgYmluZCBpbiBBbmd1bGFyIGV4cHJlc3Npb25zIGlzIGRpc2FsbG93ZWQhIEV4cHJlc3Npb246IHswfScsDQotICAgICAgICBmdWxsRXhwcmVzc2lvbik7DQotICAgIH0NCi0gIH0NCi19DQotDQotLy9LZXl3b3JkIGNvbnN0YW50cw0KLXZhciBDT05TVEFOVFMgPSBjcmVhdGVNYXAoKTsNCi1mb3JFYWNoKHsNCi0gICdudWxsJzogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsOyB9LA0KLSAgJ3RydWUnOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0sDQotICAnZmFsc2UnOiBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9LA0KLSAgJ3VuZGVmaW5lZCc6IGZ1bmN0aW9uKCkge30NCi19LCBmdW5jdGlvbihjb25zdGFudEdldHRlciwgbmFtZSkgew0KLSAgY29uc3RhbnRHZXR0ZXIuY29uc3RhbnQgPSBjb25zdGFudEdldHRlci5saXRlcmFsID0gY29uc3RhbnRHZXR0ZXIuc2hhcmVkR2V0dGVyID0gdHJ1ZTsNCi0gIENPTlNUQU5UU1tuYW1lXSA9IGNvbnN0YW50R2V0dGVyOw0KLX0pOw0KLQ0KLS8vTm90IHF1aXRlIGEgY29uc3RhbnQsIGJ1dCBjYW4gYmUgbGV4L3BhcnNlZCB0aGUgc2FtZQ0KLUNPTlNUQU5UU1sndGhpcyddID0gZnVuY3Rpb24oc2VsZikgeyByZXR1cm4gc2VsZjsgfTsNCi1DT05TVEFOVFNbJ3RoaXMnXS5zaGFyZWRHZXR0ZXIgPSB0cnVlOw0KLQ0KLQ0KLS8vT3BlcmF0b3JzIC0gd2lsbCBiZSB3cmFwcGVkIGJ5IGJpbmFyeUZuL3VuYXJ5Rm4vYXNzaWdubWVudC9maWx0ZXINCi12YXIgT1BFUkFUT1JTID0gZXh0ZW5kKGNyZWF0ZU1hcCgpLCB7DQotICAgICcrJzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHsNCi0gICAgICBhPWEoc2VsZiwgbG9jYWxzKTsgYj1iKHNlbGYsIGxvY2Fscyk7DQotICAgICAgaWYgKGlzRGVmaW5lZChhKSkgew0KLSAgICAgICAgaWYgKGlzRGVmaW5lZChiKSkgew0KLSAgICAgICAgICByZXR1cm4gYSArIGI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYTsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIGlzRGVmaW5lZChiKSA/IGIgOiB1bmRlZmluZWQ7fSwNCi0gICAgJy0nOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikgew0KLSAgICAgICAgICBhPWEoc2VsZiwgbG9jYWxzKTsgYj1iKHNlbGYsIGxvY2Fscyk7DQotICAgICAgICAgIHJldHVybiAoaXNEZWZpbmVkKGEpID8gYSA6IDApIC0gKGlzRGVmaW5lZChiKSA/IGIgOiAwKTsNCi0gICAgICAgIH0sDQotICAgICcqJzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpICogYihzZWxmLCBsb2NhbHMpO30sDQotICAgICcvJzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpIC8gYihzZWxmLCBsb2NhbHMpO30sDQotICAgICclJzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpICUgYihzZWxmLCBsb2NhbHMpO30sDQotICAgICc9PT0nOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikge3JldHVybiBhKHNlbGYsIGxvY2FscykgPT09IGIoc2VsZiwgbG9jYWxzKTt9LA0KLSAgICAnIT09JzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpICE9PSBiKHNlbGYsIGxvY2Fscyk7fSwNCi0gICAgJz09JzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpID09IGIoc2VsZiwgbG9jYWxzKTt9LA0KLSAgICAnIT0nOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikge3JldHVybiBhKHNlbGYsIGxvY2FscykgIT0gYihzZWxmLCBsb2NhbHMpO30sDQotICAgICc8JzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpIDwgYihzZWxmLCBsb2NhbHMpO30sDQotICAgICc+JzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpID4gYihzZWxmLCBsb2NhbHMpO30sDQotICAgICc8PSc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSA8PSBiKHNlbGYsIGxvY2Fscyk7fSwNCi0gICAgJz49JzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpID49IGIoc2VsZiwgbG9jYWxzKTt9LA0KLSAgICAnJiYnOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikge3JldHVybiBhKHNlbGYsIGxvY2FscykgJiYgYihzZWxmLCBsb2NhbHMpO30sDQotICAgICd8fCc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSB8fCBiKHNlbGYsIGxvY2Fscyk7fSwNCi0gICAgJyEnOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSkge3JldHVybiAhYShzZWxmLCBsb2NhbHMpO30sDQotDQotICAgIC8vVG9rZW5pemVkIGFzIG9wZXJhdG9ycyBidXQgcGFyc2VkIGFzIGFzc2lnbm1lbnQvZmlsdGVycw0KLSAgICAnPSc6dHJ1ZSwNCi0gICAgJ3wnOnRydWUNCi19KTsNCi12YXIgRVNDQVBFID0geyJuIjoiXG4iLCAiZiI6IlxmIiwgInIiOiJcciIsICJ0IjoiXHQiLCAidiI6Ilx2IiwgIiciOiInIiwgJyInOiciJ307DQotDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi0NCi0vKioNCi0gKiBAY29uc3RydWN0b3INCi0gKi8NCi12YXIgTGV4ZXIgPSBmdW5jdGlvbihvcHRpb25zKSB7DQotICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOw0KLX07DQotDQotTGV4ZXIucHJvdG90eXBlID0gew0KLSAgY29uc3RydWN0b3I6IExleGVyLA0KLQ0KLSAgbGV4OiBmdW5jdGlvbih0ZXh0KSB7DQotICAgIHRoaXMudGV4dCA9IHRleHQ7DQotICAgIHRoaXMuaW5kZXggPSAwOw0KLSAgICB0aGlzLnRva2VucyA9IFtdOw0KLQ0KLSAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMudGV4dC5sZW5ndGgpIHsNCi0gICAgICB2YXIgY2ggPSB0aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpOw0KLSAgICAgIGlmIChjaCA9PT0gJyInIHx8IGNoID09PSAiJyIpIHsNCi0gICAgICAgIHRoaXMucmVhZFN0cmluZyhjaCk7DQotICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTnVtYmVyKGNoKSB8fCBjaCA9PT0gJy4nICYmIHRoaXMuaXNOdW1iZXIodGhpcy5wZWVrKCkpKSB7DQotICAgICAgICB0aGlzLnJlYWROdW1iZXIoKTsNCi0gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJZGVudChjaCkpIHsNCi0gICAgICAgIHRoaXMucmVhZElkZW50KCk7DQotICAgICAgfSBlbHNlIGlmICh0aGlzLmlzKGNoLCAnKCl7fVtdLiw7Oj8nKSkgew0KLSAgICAgICAgdGhpcy50b2tlbnMucHVzaCh7aW5kZXg6IHRoaXMuaW5kZXgsIHRleHQ6IGNofSk7DQotICAgICAgICB0aGlzLmluZGV4Kys7DQotICAgICAgfSBlbHNlIGlmICh0aGlzLmlzV2hpdGVzcGFjZShjaCkpIHsNCi0gICAgICAgIHRoaXMuaW5kZXgrKzsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgdmFyIGNoMiA9IGNoICsgdGhpcy5wZWVrKCk7DQotICAgICAgICB2YXIgY2gzID0gY2gyICsgdGhpcy5wZWVrKDIpOw0KLSAgICAgICAgdmFyIG9wMSA9IE9QRVJBVE9SU1tjaF07DQotICAgICAgICB2YXIgb3AyID0gT1BFUkFUT1JTW2NoMl07DQotICAgICAgICB2YXIgb3AzID0gT1BFUkFUT1JTW2NoM107DQotICAgICAgICBpZiAob3AxIHx8IG9wMiB8fCBvcDMpIHsNCi0gICAgICAgICAgdmFyIHRva2VuID0gb3AzID8gY2gzIDogKG9wMiA/IGNoMiA6IGNoKTsNCi0gICAgICAgICAgdGhpcy50b2tlbnMucHVzaCh7aW5kZXg6IHRoaXMuaW5kZXgsIHRleHQ6IHRva2VuLCBvcGVyYXRvcjogdHJ1ZX0pOw0KLSAgICAgICAgICB0aGlzLmluZGV4ICs9IHRva2VuLmxlbmd0aDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIHRoaXMudGhyb3dFcnJvcignVW5leHBlY3RlZCBuZXh0IGNoYXJhY3RlciAnLCB0aGlzLmluZGV4LCB0aGlzLmluZGV4ICsgMSk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiB0aGlzLnRva2VuczsNCi0gIH0sDQotDQotICBpczogZnVuY3Rpb24oY2gsIGNoYXJzKSB7DQotICAgIHJldHVybiBjaGFycy5pbmRleE9mKGNoKSAhPT0gLTE7DQotICB9LA0KLQ0KLSAgcGVlazogZnVuY3Rpb24oaSkgew0KLSAgICB2YXIgbnVtID0gaSB8fCAxOw0KLSAgICByZXR1cm4gKHRoaXMuaW5kZXggKyBudW0gPCB0aGlzLnRleHQubGVuZ3RoKSA/IHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCArIG51bSkgOiBmYWxzZTsNCi0gIH0sDQotDQotICBpc051bWJlcjogZnVuY3Rpb24oY2gpIHsNCi0gICAgcmV0dXJuICgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSAmJiB0eXBlb2YgY2ggPT09ICJzdHJpbmciOw0KLSAgfSwNCi0NCi0gIGlzV2hpdGVzcGFjZTogZnVuY3Rpb24oY2gpIHsNCi0gICAgLy8gSUUgdHJlYXRzIG5vbi1icmVha2luZyBzcGFjZSBhcyBcdTAwQTANCi0gICAgcmV0dXJuIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXHInIHx8IGNoID09PSAnXHQnIHx8DQotICAgICAgICAgICAgY2ggPT09ICdcbicgfHwgY2ggPT09ICdcdicgfHwgY2ggPT09ICdcdTAwQTAnKTsNCi0gIH0sDQotDQotICBpc0lkZW50OiBmdW5jdGlvbihjaCkgew0KLSAgICByZXR1cm4gKCdhJyA8PSBjaCAmJiBjaCA8PSAneicgfHwNCi0gICAgICAgICAgICAnQScgPD0gY2ggJiYgY2ggPD0gJ1onIHx8DQotICAgICAgICAgICAgJ18nID09PSBjaCB8fCBjaCA9PT0gJyQnKTsNCi0gIH0sDQotDQotICBpc0V4cE9wZXJhdG9yOiBmdW5jdGlvbihjaCkgew0KLSAgICByZXR1cm4gKGNoID09PSAnLScgfHwgY2ggPT09ICcrJyB8fCB0aGlzLmlzTnVtYmVyKGNoKSk7DQotICB9LA0KLQ0KLSAgdGhyb3dFcnJvcjogZnVuY3Rpb24oZXJyb3IsIHN0YXJ0LCBlbmQpIHsNCi0gICAgZW5kID0gZW5kIHx8IHRoaXMuaW5kZXg7DQotICAgIHZhciBjb2xTdHIgPSAoaXNEZWZpbmVkKHN0YXJ0KQ0KLSAgICAgICAgICAgID8gJ3MgJyArIHN0YXJ0ICsgICctJyArIHRoaXMuaW5kZXggKyAnIFsnICsgdGhpcy50ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKSArICddJw0KLSAgICAgICAgICAgIDogJyAnICsgZW5kKTsNCi0gICAgdGhyb3cgJHBhcnNlTWluRXJyKCdsZXhlcnInLCAnTGV4ZXIgRXJyb3I6IHswfSBhdCBjb2x1bW57MX0gaW4gZXhwcmVzc2lvbiBbezJ9XS4nLA0KLSAgICAgICAgZXJyb3IsIGNvbFN0ciwgdGhpcy50ZXh0KTsNCi0gIH0sDQotDQotICByZWFkTnVtYmVyOiBmdW5jdGlvbigpIHsNCi0gICAgdmFyIG51bWJlciA9ICcnOw0KLSAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4Ow0KLSAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMudGV4dC5sZW5ndGgpIHsNCi0gICAgICB2YXIgY2ggPSBsb3dlcmNhc2UodGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4KSk7DQotICAgICAgaWYgKGNoID09ICcuJyB8fCB0aGlzLmlzTnVtYmVyKGNoKSkgew0KLSAgICAgICAgbnVtYmVyICs9IGNoOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICB2YXIgcGVla0NoID0gdGhpcy5wZWVrKCk7DQotICAgICAgICBpZiAoY2ggPT0gJ2UnICYmIHRoaXMuaXNFeHBPcGVyYXRvcihwZWVrQ2gpKSB7DQotICAgICAgICAgIG51bWJlciArPSBjaDsNCi0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0V4cE9wZXJhdG9yKGNoKSAmJg0KLSAgICAgICAgICAgIHBlZWtDaCAmJiB0aGlzLmlzTnVtYmVyKHBlZWtDaCkgJiYNCi0gICAgICAgICAgICBudW1iZXIuY2hhckF0KG51bWJlci5sZW5ndGggLSAxKSA9PSAnZScpIHsNCi0gICAgICAgICAgbnVtYmVyICs9IGNoOw0KLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRXhwT3BlcmF0b3IoY2gpICYmDQotICAgICAgICAgICAgKCFwZWVrQ2ggfHwgIXRoaXMuaXNOdW1iZXIocGVla0NoKSkgJiYNCi0gICAgICAgICAgICBudW1iZXIuY2hhckF0KG51bWJlci5sZW5ndGggLSAxKSA9PSAnZScpIHsNCi0gICAgICAgICAgdGhpcy50aHJvd0Vycm9yKCdJbnZhbGlkIGV4cG9uZW50Jyk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgdGhpcy5pbmRleCsrOw0KLSAgICB9DQotICAgIHRoaXMudG9rZW5zLnB1c2goew0KLSAgICAgIGluZGV4OiBzdGFydCwNCi0gICAgICB0ZXh0OiBudW1iZXIsDQotICAgICAgY29uc3RhbnQ6IHRydWUsDQotICAgICAgdmFsdWU6IE51bWJlcihudW1iZXIpDQotICAgIH0pOw0KLSAgfSwNCi0NCi0gIHJlYWRJZGVudDogZnVuY3Rpb24oKSB7DQotICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXg7DQotICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50ZXh0Lmxlbmd0aCkgew0KLSAgICAgIHZhciBjaCA9IHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCk7DQotICAgICAgaWYgKCEodGhpcy5pc0lkZW50KGNoKSB8fCB0aGlzLmlzTnVtYmVyKGNoKSkpIHsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgICB0aGlzLmluZGV4Kys7DQotICAgIH0NCi0gICAgdGhpcy50b2tlbnMucHVzaCh7DQotICAgICAgaW5kZXg6IHN0YXJ0LA0KLSAgICAgIHRleHQ6IHRoaXMudGV4dC5zbGljZShzdGFydCwgdGhpcy5pbmRleCksDQotICAgICAgaWRlbnRpZmllcjogdHJ1ZQ0KLSAgICB9KTsNCi0gIH0sDQotDQotICByZWFkU3RyaW5nOiBmdW5jdGlvbihxdW90ZSkgew0KLSAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4Ow0KLSAgICB0aGlzLmluZGV4Kys7DQotICAgIHZhciBzdHJpbmcgPSAnJzsNCi0gICAgdmFyIHJhd1N0cmluZyA9IHF1b3RlOw0KLSAgICB2YXIgZXNjYXBlID0gZmFsc2U7DQotICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50ZXh0Lmxlbmd0aCkgew0KLSAgICAgIHZhciBjaCA9IHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCk7DQotICAgICAgcmF3U3RyaW5nICs9IGNoOw0KLSAgICAgIGlmIChlc2NhcGUpIHsNCi0gICAgICAgIGlmIChjaCA9PT0gJ3UnKSB7DQotICAgICAgICAgIHZhciBoZXggPSB0aGlzLnRleHQuc3Vic3RyaW5nKHRoaXMuaW5kZXggKyAxLCB0aGlzLmluZGV4ICsgNSk7DQotICAgICAgICAgIGlmICghaGV4Lm1hdGNoKC9bXGRhLWZdezR9L2kpKQ0KLSAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcignSW52YWxpZCB1bmljb2RlIGVzY2FwZSBbXFx1JyArIGhleCArICddJyk7DQotICAgICAgICAgIHRoaXMuaW5kZXggKz0gNDsNCi0gICAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaGV4LCAxNikpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgdmFyIHJlcCA9IEVTQ0FQRVtjaF07DQotICAgICAgICAgIHN0cmluZyA9IHN0cmluZyArIChyZXAgfHwgY2gpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZXNjYXBlID0gZmFsc2U7DQotICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgew0KLSAgICAgICAgZXNjYXBlID0gdHJ1ZTsNCi0gICAgICB9IGVsc2UgaWYgKGNoID09PSBxdW90ZSkgew0KLSAgICAgICAgdGhpcy5pbmRleCsrOw0KLSAgICAgICAgdGhpcy50b2tlbnMucHVzaCh7DQotICAgICAgICAgIGluZGV4OiBzdGFydCwNCi0gICAgICAgICAgdGV4dDogcmF3U3RyaW5nLA0KLSAgICAgICAgICBjb25zdGFudDogdHJ1ZSwNCi0gICAgICAgICAgdmFsdWU6IHN0cmluZw0KLSAgICAgICAgfSk7DQotICAgICAgICByZXR1cm47DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHN0cmluZyArPSBjaDsNCi0gICAgICB9DQotICAgICAgdGhpcy5pbmRleCsrOw0KLSAgICB9DQotICAgIHRoaXMudGhyb3dFcnJvcignVW50ZXJtaW5hdGVkIHF1b3RlJywgc3RhcnQpOw0KLSAgfQ0KLX07DQotDQotDQotZnVuY3Rpb24gaXNDb25zdGFudChleHApIHsNCi0gIHJldHVybiBleHAuY29uc3RhbnQ7DQotfQ0KLQ0KLS8qKg0KLSAqIEBjb25zdHJ1Y3Rvcg0KLSAqLw0KLXZhciBQYXJzZXIgPSBmdW5jdGlvbihsZXhlciwgJGZpbHRlciwgb3B0aW9ucykgew0KLSAgdGhpcy5sZXhlciA9IGxleGVyOw0KLSAgdGhpcy4kZmlsdGVyID0gJGZpbHRlcjsNCi0gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7DQotfTsNCi0NCi1QYXJzZXIuWkVSTyA9IGV4dGVuZChmdW5jdGlvbigpIHsNCi0gIHJldHVybiAwOw0KLX0sIHsNCi0gIHNoYXJlZEdldHRlcjogdHJ1ZSwNCi0gIGNvbnN0YW50OiB0cnVlDQotfSk7DQotDQotUGFyc2VyLnByb3RvdHlwZSA9IHsNCi0gIGNvbnN0cnVjdG9yOiBQYXJzZXIsDQotDQotICBwYXJzZTogZnVuY3Rpb24odGV4dCkgew0KLSAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KLSAgICB0aGlzLnRva2VucyA9IHRoaXMubGV4ZXIubGV4KHRleHQpOw0KLQ0KLSAgICB2YXIgdmFsdWUgPSB0aGlzLnN0YXRlbWVudHMoKTsNCi0NCi0gICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCAhPT0gMCkgew0KLSAgICAgIHRoaXMudGhyb3dFcnJvcignaXMgYW4gdW5leHBlY3RlZCB0b2tlbicsIHRoaXMudG9rZW5zWzBdKTsNCi0gICAgfQ0KLQ0KLSAgICB2YWx1ZS5saXRlcmFsID0gISF2YWx1ZS5saXRlcmFsOw0KLSAgICB2YWx1ZS5jb25zdGFudCA9ICEhdmFsdWUuY29uc3RhbnQ7DQotDQotICAgIHJldHVybiB2YWx1ZTsNCi0gIH0sDQotDQotICBwcmltYXJ5OiBmdW5jdGlvbigpIHsNCi0gICAgdmFyIHByaW1hcnk7DQotICAgIGlmICh0aGlzLmV4cGVjdCgnKCcpKSB7DQotICAgICAgcHJpbWFyeSA9IHRoaXMuZmlsdGVyQ2hhaW4oKTsNCi0gICAgICB0aGlzLmNvbnN1bWUoJyknKTsNCi0gICAgfSBlbHNlIGlmICh0aGlzLmV4cGVjdCgnWycpKSB7DQotICAgICAgcHJpbWFyeSA9IHRoaXMuYXJyYXlEZWNsYXJhdGlvbigpOw0KLSAgICB9IGVsc2UgaWYgKHRoaXMuZXhwZWN0KCd7JykpIHsNCi0gICAgICBwcmltYXJ5ID0gdGhpcy5vYmplY3QoKTsNCi0gICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoKS5pZGVudGlmaWVyICYmIHRoaXMucGVlaygpLnRleHQgaW4gQ09OU1RBTlRTKSB7DQotICAgICAgcHJpbWFyeSA9IENPTlNUQU5UU1t0aGlzLmNvbnN1bWUoKS50ZXh0XTsNCi0gICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoKS5pZGVudGlmaWVyKSB7DQotICAgICAgcHJpbWFyeSA9IHRoaXMuaWRlbnRpZmllcigpOw0KLSAgICB9IGVsc2UgaWYgKHRoaXMucGVlaygpLmNvbnN0YW50KSB7DQotICAgICAgcHJpbWFyeSA9IHRoaXMuY29uc3RhbnQoKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICB0aGlzLnRocm93RXJyb3IoJ25vdCBhIHByaW1hcnkgZXhwcmVzc2lvbicsIHRoaXMucGVlaygpKTsNCi0gICAgfQ0KLQ0KLSAgICB2YXIgbmV4dCwgY29udGV4dDsNCi0gICAgd2hpbGUgKChuZXh0ID0gdGhpcy5leHBlY3QoJygnLCAnWycsICcuJykpKSB7DQotICAgICAgaWYgKG5leHQudGV4dCA9PT0gJygnKSB7DQotICAgICAgICBwcmltYXJ5ID0gdGhpcy5mdW5jdGlvbkNhbGwocHJpbWFyeSwgY29udGV4dCk7DQotICAgICAgICBjb250ZXh0ID0gbnVsbDsNCi0gICAgICB9IGVsc2UgaWYgKG5leHQudGV4dCA9PT0gJ1snKSB7DQotICAgICAgICBjb250ZXh0ID0gcHJpbWFyeTsNCi0gICAgICAgIHByaW1hcnkgPSB0aGlzLm9iamVjdEluZGV4KHByaW1hcnkpOw0KLSAgICAgIH0gZWxzZSBpZiAobmV4dC50ZXh0ID09PSAnLicpIHsNCi0gICAgICAgIGNvbnRleHQgPSBwcmltYXJ5Ow0KLSAgICAgICAgcHJpbWFyeSA9IHRoaXMuZmllbGRBY2Nlc3MocHJpbWFyeSk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHRoaXMudGhyb3dFcnJvcignSU1QT1NTSUJMRScpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gcHJpbWFyeTsNCi0gIH0sDQotDQotICB0aHJvd0Vycm9yOiBmdW5jdGlvbihtc2csIHRva2VuKSB7DQotICAgIHRocm93ICRwYXJzZU1pbkVycignc3ludGF4JywNCi0gICAgICAgICdTeW50YXggRXJyb3I6IFRva2VuIFwnezB9XCcgezF9IGF0IGNvbHVtbiB7Mn0gb2YgdGhlIGV4cHJlc3Npb24gW3szfV0gc3RhcnRpbmcgYXQgW3s0fV0uJywNCi0gICAgICAgICAgdG9rZW4udGV4dCwgbXNnLCAodG9rZW4uaW5kZXggKyAxKSwgdGhpcy50ZXh0LCB0aGlzLnRleHQuc3Vic3RyaW5nKHRva2VuLmluZGV4KSk7DQotICB9LA0KLQ0KLSAgcGVla1Rva2VuOiBmdW5jdGlvbigpIHsNCi0gICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCA9PT0gMCkNCi0gICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ3Vlb2UnLCAnVW5leHBlY3RlZCBlbmQgb2YgZXhwcmVzc2lvbjogezB9JywgdGhpcy50ZXh0KTsNCi0gICAgcmV0dXJuIHRoaXMudG9rZW5zWzBdOw0KLSAgfSwNCi0NCi0gIHBlZWs6IGZ1bmN0aW9uKGUxLCBlMiwgZTMsIGU0KSB7DQotICAgIHJldHVybiB0aGlzLnBlZWtBaGVhZCgwLCBlMSwgZTIsIGUzLCBlNCk7DQotICB9LA0KLSAgcGVla0FoZWFkOiBmdW5jdGlvbihpLCBlMSwgZTIsIGUzLCBlNCkgew0KLSAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID4gaSkgew0KLSAgICAgIHZhciB0b2tlbiA9IHRoaXMudG9rZW5zW2ldOw0KLSAgICAgIHZhciB0ID0gdG9rZW4udGV4dDsNCi0gICAgICBpZiAodCA9PT0gZTEgfHwgdCA9PT0gZTIgfHwgdCA9PT0gZTMgfHwgdCA9PT0gZTQgfHwNCi0gICAgICAgICAgKCFlMSAmJiAhZTIgJiYgIWUzICYmICFlNCkpIHsNCi0gICAgICAgIHJldHVybiB0b2tlbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgfSwNCi0NCi0gIGV4cGVjdDogZnVuY3Rpb24oZTEsIGUyLCBlMywgZTQpIHsNCi0gICAgdmFyIHRva2VuID0gdGhpcy5wZWVrKGUxLCBlMiwgZTMsIGU0KTsNCi0gICAgaWYgKHRva2VuKSB7DQotICAgICAgdGhpcy50b2tlbnMuc2hpZnQoKTsNCi0gICAgICByZXR1cm4gdG9rZW47DQotICAgIH0NCi0gICAgcmV0dXJuIGZhbHNlOw0KLSAgfSwNCi0NCi0gIGNvbnN1bWU6IGZ1bmN0aW9uKGUxKSB7DQotICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggPT09IDApIHsNCi0gICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ3Vlb2UnLCAnVW5leHBlY3RlZCBlbmQgb2YgZXhwcmVzc2lvbjogezB9JywgdGhpcy50ZXh0KTsNCi0gICAgfQ0KLQ0KLSAgICB2YXIgdG9rZW4gPSB0aGlzLmV4cGVjdChlMSk7DQotICAgIGlmICghdG9rZW4pIHsNCi0gICAgICB0aGlzLnRocm93RXJyb3IoJ2lzIHVuZXhwZWN0ZWQsIGV4cGVjdGluZyBbJyArIGUxICsgJ10nLCB0aGlzLnBlZWsoKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHRva2VuOw0KLSAgfSwNCi0NCi0gIHVuYXJ5Rm46IGZ1bmN0aW9uKG9wLCByaWdodCkgew0KLSAgICB2YXIgZm4gPSBPUEVSQVRPUlNbb3BdOw0KLSAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRwYXJzZVVuYXJ5Rm4oc2VsZiwgbG9jYWxzKSB7DQotICAgICAgcmV0dXJuIGZuKHNlbGYsIGxvY2FscywgcmlnaHQpOw0KLSAgICB9LCB7DQotICAgICAgY29uc3RhbnQ6cmlnaHQuY29uc3RhbnQsDQotICAgICAgaW5wdXRzOiBbcmlnaHRdDQotICAgIH0pOw0KLSAgfSwNCi0NCi0gIGJpbmFyeUZuOiBmdW5jdGlvbihsZWZ0LCBvcCwgcmlnaHQsIGlzQnJhbmNoaW5nKSB7DQotICAgIHZhciBmbiA9IE9QRVJBVE9SU1tvcF07DQotICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gJHBhcnNlQmluYXJ5Rm4oc2VsZiwgbG9jYWxzKSB7DQotICAgICAgcmV0dXJuIGZuKHNlbGYsIGxvY2FscywgbGVmdCwgcmlnaHQpOw0KLSAgICB9LCB7DQotICAgICAgY29uc3RhbnQ6IGxlZnQuY29uc3RhbnQgJiYgcmlnaHQuY29uc3RhbnQsDQotICAgICAgaW5wdXRzOiAhaXNCcmFuY2hpbmcgJiYgW2xlZnQsIHJpZ2h0XQ0KLSAgICB9KTsNCi0gIH0sDQotDQotICBpZGVudGlmaWVyOiBmdW5jdGlvbigpIHsNCi0gICAgdmFyIGlkID0gdGhpcy5jb25zdW1lKCkudGV4dDsNCi0NCi0gICAgLy9Db250aW51ZSByZWFkaW5nIGVhY2ggYC5pZGVudGlmaWVyYCB1bmxlc3MgaXQgaXMgYSBtZXRob2QgaW52b2NhdGlvbg0KLSAgICB3aGlsZSAodGhpcy5wZWVrKCcuJykgJiYgdGhpcy5wZWVrQWhlYWQoMSkuaWRlbnRpZmllciAmJiAhdGhpcy5wZWVrQWhlYWQoMiwgJygnKSkgew0KLSAgICAgIGlkICs9IHRoaXMuY29uc3VtZSgpLnRleHQgKyB0aGlzLmNvbnN1bWUoKS50ZXh0Ow0KLSAgICB9DQotDQotICAgIHJldHVybiBnZXR0ZXJGbihpZCwgdGhpcy5vcHRpb25zLCB0aGlzLnRleHQpOw0KLSAgfSwNCi0NCi0gIGNvbnN0YW50OiBmdW5jdGlvbigpIHsNCi0gICAgdmFyIHZhbHVlID0gdGhpcy5jb25zdW1lKCkudmFsdWU7DQotDQotICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gJHBhcnNlQ29uc3RhbnQoKSB7DQotICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9LCB7DQotICAgICAgY29uc3RhbnQ6IHRydWUsDQotICAgICAgbGl0ZXJhbDogdHJ1ZQ0KLSAgICB9KTsNCi0gIH0sDQotDQotICBzdGF0ZW1lbnRzOiBmdW5jdGlvbigpIHsNCi0gICAgdmFyIHN0YXRlbWVudHMgPSBbXTsNCi0gICAgd2hpbGUgKHRydWUpIHsNCi0gICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID4gMCAmJiAhdGhpcy5wZWVrKCd9JywgJyknLCAnOycsICddJykpDQotICAgICAgICBzdGF0ZW1lbnRzLnB1c2godGhpcy5maWx0ZXJDaGFpbigpKTsNCi0gICAgICBpZiAoIXRoaXMuZXhwZWN0KCc7JykpIHsNCi0gICAgICAgIC8vIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgdGhlcmUgaXMgb25seSBvbmUgc3RhdGVtZW50Lg0KLSAgICAgICAgLy8gVE9ETyhzaXplKTogbWF5YmUgd2Ugc2hvdWxkIG5vdCBzdXBwb3J0IG11bHRpcGxlIHN0YXRlbWVudHM/DQotICAgICAgICByZXR1cm4gKHN0YXRlbWVudHMubGVuZ3RoID09PSAxKQ0KLSAgICAgICAgICAgID8gc3RhdGVtZW50c1swXQ0KLSAgICAgICAgICAgIDogZnVuY3Rpb24gJHBhcnNlU3RhdGVtZW50cyhzZWxmLCBsb2NhbHMpIHsNCi0gICAgICAgICAgICAgICAgdmFyIHZhbHVlOw0KLSAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBzdGF0ZW1lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0YXRlbWVudHNbaV0oc2VsZiwgbG9jYWxzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgICAgICAgICAgICB9Ow0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfSwNCi0NCi0gIGZpbHRlckNoYWluOiBmdW5jdGlvbigpIHsNCi0gICAgdmFyIGxlZnQgPSB0aGlzLmV4cHJlc3Npb24oKTsNCi0gICAgdmFyIHRva2VuOw0KLSAgICB3aGlsZSAoKHRva2VuID0gdGhpcy5leHBlY3QoJ3wnKSkpIHsNCi0gICAgICBsZWZ0ID0gdGhpcy5maWx0ZXIobGVmdCk7DQotICAgIH0NCi0gICAgcmV0dXJuIGxlZnQ7DQotICB9LA0KLQ0KLSAgZmlsdGVyOiBmdW5jdGlvbihpbnB1dEZuKSB7DQotICAgIHZhciBmbiA9IHRoaXMuJGZpbHRlcih0aGlzLmNvbnN1bWUoKS50ZXh0KTsNCi0gICAgdmFyIGFyZ3NGbjsNCi0gICAgdmFyIGFyZ3M7DQotDQotICAgIGlmICh0aGlzLnBlZWsoJzonKSkgew0KLSAgICAgIGFyZ3NGbiA9IFtdOw0KLSAgICAgIGFyZ3MgPSBbXTsgLy8gd2UgY2FuIHNhZmVseSByZXVzZSB0aGUgYXJyYXkNCi0gICAgICB3aGlsZSAodGhpcy5leHBlY3QoJzonKSkgew0KLSAgICAgICAgYXJnc0ZuLnB1c2godGhpcy5leHByZXNzaW9uKCkpOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICB2YXIgaW5wdXRzID0gW2lucHV0Rm5dLmNvbmNhdChhcmdzRm4gfHwgW10pOw0KLQ0KLSAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRwYXJzZUZpbHRlcihzZWxmLCBsb2NhbHMpIHsNCi0gICAgICB2YXIgaW5wdXQgPSBpbnB1dEZuKHNlbGYsIGxvY2Fscyk7DQotICAgICAgaWYgKGFyZ3MpIHsNCi0gICAgICAgIGFyZ3NbMF0gPSBpbnB1dDsNCi0NCi0gICAgICAgIHZhciBpID0gYXJnc0ZuLmxlbmd0aDsNCi0gICAgICAgIHdoaWxlIChpLS0pIHsNCi0gICAgICAgICAgYXJnc1tpICsgMV0gPSBhcmdzRm5baV0oc2VsZiwgbG9jYWxzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmbi5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOw0KLSAgICAgIH0NCi0NCi0gICAgICByZXR1cm4gZm4oaW5wdXQpOw0KLSAgICB9LCB7DQotICAgICAgY29uc3RhbnQ6ICFmbi4kc3RhdGVmdWwgJiYgaW5wdXRzLmV2ZXJ5KGlzQ29uc3RhbnQpLA0KLSAgICAgIGlucHV0czogIWZuLiRzdGF0ZWZ1bCAmJiBpbnB1dHMNCi0gICAgfSk7DQotICB9LA0KLQ0KLSAgZXhwcmVzc2lvbjogZnVuY3Rpb24oKSB7DQotICAgIHJldHVybiB0aGlzLmFzc2lnbm1lbnQoKTsNCi0gIH0sDQotDQotICBhc3NpZ25tZW50OiBmdW5jdGlvbigpIHsNCi0gICAgdmFyIGxlZnQgPSB0aGlzLnRlcm5hcnkoKTsNCi0gICAgdmFyIHJpZ2h0Ow0KLSAgICB2YXIgdG9rZW47DQotICAgIGlmICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnPScpKSkgew0KLSAgICAgIGlmICghbGVmdC5hc3NpZ24pIHsNCi0gICAgICAgIHRoaXMudGhyb3dFcnJvcignaW1wbGllcyBhc3NpZ25tZW50IGJ1dCBbJyArDQotICAgICAgICAgICAgdGhpcy50ZXh0LnN1YnN0cmluZygwLCB0b2tlbi5pbmRleCkgKyAnXSBjYW4gbm90IGJlIGFzc2lnbmVkIHRvJywgdG9rZW4pOw0KLSAgICAgIH0NCi0gICAgICByaWdodCA9IHRoaXMudGVybmFyeSgpOw0KLSAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gJHBhcnNlQXNzaWdubWVudChzY29wZSwgbG9jYWxzKSB7DQotICAgICAgICByZXR1cm4gbGVmdC5hc3NpZ24oc2NvcGUsIHJpZ2h0KHNjb3BlLCBsb2NhbHMpLCBsb2NhbHMpOw0KLSAgICAgIH0sIHsNCi0gICAgICAgIGlucHV0czogW2xlZnQsIHJpZ2h0XQ0KLSAgICAgIH0pOw0KLSAgICB9DQotICAgIHJldHVybiBsZWZ0Ow0KLSAgfSwNCi0NCi0gIHRlcm5hcnk6IGZ1bmN0aW9uKCkgew0KLSAgICB2YXIgbGVmdCA9IHRoaXMubG9naWNhbE9SKCk7DQotICAgIHZhciBtaWRkbGU7DQotICAgIHZhciB0b2tlbjsNCi0gICAgaWYgKCh0b2tlbiA9IHRoaXMuZXhwZWN0KCc/JykpKSB7DQotICAgICAgbWlkZGxlID0gdGhpcy5hc3NpZ25tZW50KCk7DQotICAgICAgaWYgKHRoaXMuY29uc3VtZSgnOicpKSB7DQotICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLmFzc2lnbm1lbnQoKTsNCi0NCi0gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gJHBhcnNlVGVybmFyeShzZWxmLCBsb2NhbHMpIHsNCi0gICAgICAgICAgcmV0dXJuIGxlZnQoc2VsZiwgbG9jYWxzKSA/IG1pZGRsZShzZWxmLCBsb2NhbHMpIDogcmlnaHQoc2VsZiwgbG9jYWxzKTsNCi0gICAgICAgIH0sIHsNCi0gICAgICAgICAgY29uc3RhbnQ6IGxlZnQuY29uc3RhbnQgJiYgbWlkZGxlLmNvbnN0YW50ICYmIHJpZ2h0LmNvbnN0YW50DQotICAgICAgICB9KTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIGxlZnQ7DQotICB9LA0KLQ0KLSAgbG9naWNhbE9SOiBmdW5jdGlvbigpIHsNCi0gICAgdmFyIGxlZnQgPSB0aGlzLmxvZ2ljYWxBTkQoKTsNCi0gICAgdmFyIHRva2VuOw0KLSAgICB3aGlsZSAoKHRva2VuID0gdGhpcy5leHBlY3QoJ3x8JykpKSB7DQotICAgICAgbGVmdCA9IHRoaXMuYmluYXJ5Rm4obGVmdCwgdG9rZW4udGV4dCwgdGhpcy5sb2dpY2FsQU5EKCksIHRydWUpOw0KLSAgICB9DQotICAgIHJldHVybiBsZWZ0Ow0KLSAgfSwNCi0NCi0gIGxvZ2ljYWxBTkQ6IGZ1bmN0aW9uKCkgew0KLSAgICB2YXIgbGVmdCA9IHRoaXMuZXF1YWxpdHkoKTsNCi0gICAgdmFyIHRva2VuOw0KLSAgICB3aGlsZSAoKHRva2VuID0gdGhpcy5leHBlY3QoJyYmJykpKSB7DQotICAgICAgbGVmdCA9IHRoaXMuYmluYXJ5Rm4obGVmdCwgdG9rZW4udGV4dCwgdGhpcy5lcXVhbGl0eSgpLCB0cnVlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbGVmdDsNCi0gIH0sDQotDQotICBlcXVhbGl0eTogZnVuY3Rpb24oKSB7DQotICAgIHZhciBsZWZ0ID0gdGhpcy5yZWxhdGlvbmFsKCk7DQotICAgIHZhciB0b2tlbjsNCi0gICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZXhwZWN0KCc9PScsJyE9JywnPT09JywnIT09JykpKSB7DQotICAgICAgbGVmdCA9IHRoaXMuYmluYXJ5Rm4obGVmdCwgdG9rZW4udGV4dCwgdGhpcy5yZWxhdGlvbmFsKCkpOw0KLSAgICB9DQotICAgIHJldHVybiBsZWZ0Ow0KLSAgfSwNCi0NCi0gIHJlbGF0aW9uYWw6IGZ1bmN0aW9uKCkgew0KLSAgICB2YXIgbGVmdCA9IHRoaXMuYWRkaXRpdmUoKTsNCi0gICAgdmFyIHRva2VuOw0KLSAgICB3aGlsZSAoKHRva2VuID0gdGhpcy5leHBlY3QoJzwnLCAnPicsICc8PScsICc+PScpKSkgew0KLSAgICAgIGxlZnQgPSB0aGlzLmJpbmFyeUZuKGxlZnQsIHRva2VuLnRleHQsIHRoaXMuYWRkaXRpdmUoKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIGxlZnQ7DQotICB9LA0KLQ0KLSAgYWRkaXRpdmU6IGZ1bmN0aW9uKCkgew0KLSAgICB2YXIgbGVmdCA9IHRoaXMubXVsdGlwbGljYXRpdmUoKTsNCi0gICAgdmFyIHRva2VuOw0KLSAgICB3aGlsZSAoKHRva2VuID0gdGhpcy5leHBlY3QoJysnLCctJykpKSB7DQotICAgICAgbGVmdCA9IHRoaXMuYmluYXJ5Rm4obGVmdCwgdG9rZW4udGV4dCwgdGhpcy5tdWx0aXBsaWNhdGl2ZSgpKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbGVmdDsNCi0gIH0sDQotDQotICBtdWx0aXBsaWNhdGl2ZTogZnVuY3Rpb24oKSB7DQotICAgIHZhciBsZWZ0ID0gdGhpcy51bmFyeSgpOw0KLSAgICB2YXIgdG9rZW47DQotICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnKicsJy8nLCclJykpKSB7DQotICAgICAgbGVmdCA9IHRoaXMuYmluYXJ5Rm4obGVmdCwgdG9rZW4udGV4dCwgdGhpcy51bmFyeSgpKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbGVmdDsNCi0gIH0sDQotDQotICB1bmFyeTogZnVuY3Rpb24oKSB7DQotICAgIHZhciB0b2tlbjsNCi0gICAgaWYgKHRoaXMuZXhwZWN0KCcrJykpIHsNCi0gICAgICByZXR1cm4gdGhpcy5wcmltYXJ5KCk7DQotICAgIH0gZWxzZSBpZiAoKHRva2VuID0gdGhpcy5leHBlY3QoJy0nKSkpIHsNCi0gICAgICByZXR1cm4gdGhpcy5iaW5hcnlGbihQYXJzZXIuWkVSTywgdG9rZW4udGV4dCwgdGhpcy51bmFyeSgpKTsNCi0gICAgfSBlbHNlIGlmICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnIScpKSkgew0KLSAgICAgIHJldHVybiB0aGlzLnVuYXJ5Rm4odG9rZW4udGV4dCwgdGhpcy51bmFyeSgpKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICByZXR1cm4gdGhpcy5wcmltYXJ5KCk7DQotICAgIH0NCi0gIH0sDQotDQotICBmaWVsZEFjY2VzczogZnVuY3Rpb24ob2JqZWN0KSB7DQotICAgIHZhciBnZXR0ZXIgPSB0aGlzLmlkZW50aWZpZXIoKTsNCi0NCi0gICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAkcGFyc2VGaWVsZEFjY2VzcyhzY29wZSwgbG9jYWxzLCBzZWxmKSB7DQotICAgICAgdmFyIG8gPSBzZWxmIHx8IG9iamVjdChzY29wZSwgbG9jYWxzKTsNCi0gICAgICByZXR1cm4gKG8gPT0gbnVsbCkgPyB1bmRlZmluZWQgOiBnZXR0ZXIobyk7DQotICAgIH0sIHsNCi0gICAgICBhc3NpZ246IGZ1bmN0aW9uKHNjb3BlLCB2YWx1ZSwgbG9jYWxzKSB7DQotICAgICAgICB2YXIgbyA9IG9iamVjdChzY29wZSwgbG9jYWxzKTsNCi0gICAgICAgIGlmICghbykgb2JqZWN0LmFzc2lnbihzY29wZSwgbyA9IHt9KTsNCi0gICAgICAgIHJldHVybiBnZXR0ZXIuYXNzaWduKG8sIHZhbHVlKTsNCi0gICAgICB9DQotICAgIH0pOw0KLSAgfSwNCi0NCi0gIG9iamVjdEluZGV4OiBmdW5jdGlvbihvYmopIHsNCi0gICAgdmFyIGV4cHJlc3Npb24gPSB0aGlzLnRleHQ7DQotDQotICAgIHZhciBpbmRleEZuID0gdGhpcy5leHByZXNzaW9uKCk7DQotICAgIHRoaXMuY29uc3VtZSgnXScpOw0KLQ0KLSAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRwYXJzZU9iamVjdEluZGV4KHNlbGYsIGxvY2Fscykgew0KLSAgICAgIHZhciBvID0gb2JqKHNlbGYsIGxvY2FscyksDQotICAgICAgICAgIGkgPSBpbmRleEZuKHNlbGYsIGxvY2FscyksDQotICAgICAgICAgIHY7DQotDQotICAgICAgZW5zdXJlU2FmZU1lbWJlck5hbWUoaSwgZXhwcmVzc2lvbik7DQotICAgICAgaWYgKCFvKSByZXR1cm4gdW5kZWZpbmVkOw0KLSAgICAgIHYgPSBlbnN1cmVTYWZlT2JqZWN0KG9baV0sIGV4cHJlc3Npb24pOw0KLSAgICAgIHJldHVybiB2Ow0KLSAgICB9LCB7DQotICAgICAgYXNzaWduOiBmdW5jdGlvbihzZWxmLCB2YWx1ZSwgbG9jYWxzKSB7DQotICAgICAgICB2YXIga2V5ID0gZW5zdXJlU2FmZU1lbWJlck5hbWUoaW5kZXhGbihzZWxmLCBsb2NhbHMpLCBleHByZXNzaW9uKTsNCi0gICAgICAgIC8vIHByZXZlbnQgb3ZlcndyaXRpbmcgb2YgRnVuY3Rpb24uY29uc3RydWN0b3Igd2hpY2ggd291bGQgYnJlYWsgZW5zdXJlU2FmZU9iamVjdCBjaGVjaw0KLSAgICAgICAgdmFyIG8gPSBlbnN1cmVTYWZlT2JqZWN0KG9iaihzZWxmLCBsb2NhbHMpLCBleHByZXNzaW9uKTsNCi0gICAgICAgIGlmICghbykgb2JqLmFzc2lnbihzZWxmLCBvID0ge30pOw0KLSAgICAgICAgcmV0dXJuIG9ba2V5XSA9IHZhbHVlOw0KLSAgICAgIH0NCi0gICAgfSk7DQotICB9LA0KLQ0KLSAgZnVuY3Rpb25DYWxsOiBmdW5jdGlvbihmbkdldHRlciwgY29udGV4dEdldHRlcikgew0KLSAgICB2YXIgYXJnc0ZuID0gW107DQotICAgIGlmICh0aGlzLnBlZWtUb2tlbigpLnRleHQgIT09ICcpJykgew0KLSAgICAgIGRvIHsNCi0gICAgICAgIGFyZ3NGbi5wdXNoKHRoaXMuZXhwcmVzc2lvbigpKTsNCi0gICAgICB9IHdoaWxlICh0aGlzLmV4cGVjdCgnLCcpKTsNCi0gICAgfQ0KLSAgICB0aGlzLmNvbnN1bWUoJyknKTsNCi0NCi0gICAgdmFyIGV4cHJlc3Npb25UZXh0ID0gdGhpcy50ZXh0Ow0KLSAgICAvLyB3ZSBjYW4gc2FmZWx5IHJldXNlIHRoZSBhcnJheSBhY3Jvc3MgaW52b2NhdGlvbnMNCi0gICAgdmFyIGFyZ3MgPSBhcmdzRm4ubGVuZ3RoID8gW10gOiBudWxsOw0KLQ0KLSAgICByZXR1cm4gZnVuY3Rpb24gJHBhcnNlRnVuY3Rpb25DYWxsKHNjb3BlLCBsb2NhbHMpIHsNCi0gICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRHZXR0ZXIgPyBjb250ZXh0R2V0dGVyKHNjb3BlLCBsb2NhbHMpIDogaXNEZWZpbmVkKGNvbnRleHRHZXR0ZXIpID8gdW5kZWZpbmVkIDogc2NvcGU7DQotICAgICAgdmFyIGZuID0gZm5HZXR0ZXIoc2NvcGUsIGxvY2FscywgY29udGV4dCkgfHwgbm9vcDsNCi0NCi0gICAgICBpZiAoYXJncykgew0KLSAgICAgICAgdmFyIGkgPSBhcmdzRm4ubGVuZ3RoOw0KLSAgICAgICAgd2hpbGUgKGktLSkgew0KLSAgICAgICAgICBhcmdzW2ldID0gZW5zdXJlU2FmZU9iamVjdChhcmdzRm5baV0oc2NvcGUsIGxvY2FscyksIGV4cHJlc3Npb25UZXh0KTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotICAgICAgZW5zdXJlU2FmZU9iamVjdChjb250ZXh0LCBleHByZXNzaW9uVGV4dCk7DQotICAgICAgZW5zdXJlU2FmZUZ1bmN0aW9uKGZuLCBleHByZXNzaW9uVGV4dCk7DQotDQotICAgICAgLy8gSUUgZG9lc24ndCBoYXZlIGFwcGx5IGZvciBzb21lIG5hdGl2ZSBmdW5jdGlvbnMNCi0gICAgICB2YXIgdiA9IGZuLmFwcGx5DQotICAgICAgICAgICAgPyBmbi5hcHBseShjb250ZXh0LCBhcmdzKQ0KLSAgICAgICAgICAgIDogZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7DQotDQotICAgICAgcmV0dXJuIGVuc3VyZVNhZmVPYmplY3QodiwgZXhwcmVzc2lvblRleHQpOw0KLSAgICAgIH07DQotICB9LA0KLQ0KLSAgLy8gVGhpcyBpcyB1c2VkIHdpdGgganNvbiBhcnJheSBkZWNsYXJhdGlvbg0KLSAgYXJyYXlEZWNsYXJhdGlvbjogZnVuY3Rpb24oKSB7DQotICAgIHZhciBlbGVtZW50Rm5zID0gW107DQotICAgIGlmICh0aGlzLnBlZWtUb2tlbigpLnRleHQgIT09ICddJykgew0KLSAgICAgIGRvIHsNCi0gICAgICAgIGlmICh0aGlzLnBlZWsoJ10nKSkgew0KLSAgICAgICAgICAvLyBTdXBwb3J0IHRyYWlsaW5nIGNvbW1hcyBwZXIgRVM1LjEuDQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxlbWVudEZucy5wdXNoKHRoaXMuZXhwcmVzc2lvbigpKTsNCi0gICAgICB9IHdoaWxlICh0aGlzLmV4cGVjdCgnLCcpKTsNCi0gICAgfQ0KLSAgICB0aGlzLmNvbnN1bWUoJ10nKTsNCi0NCi0gICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAkcGFyc2VBcnJheUxpdGVyYWwoc2VsZiwgbG9jYWxzKSB7DQotICAgICAgdmFyIGFycmF5ID0gW107DQotICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZWxlbWVudEZucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7DQotICAgICAgICBhcnJheS5wdXNoKGVsZW1lbnRGbnNbaV0oc2VsZiwgbG9jYWxzKSk7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBhcnJheTsNCi0gICAgfSwgew0KLSAgICAgIGxpdGVyYWw6IHRydWUsDQotICAgICAgY29uc3RhbnQ6IGVsZW1lbnRGbnMuZXZlcnkoaXNDb25zdGFudCksDQotICAgICAgaW5wdXRzOiBlbGVtZW50Rm5zDQotICAgIH0pOw0KLSAgfSwNCi0NCi0gIG9iamVjdDogZnVuY3Rpb24oKSB7DQotICAgIHZhciBrZXlzID0gW10sIHZhbHVlRm5zID0gW107DQotICAgIGlmICh0aGlzLnBlZWtUb2tlbigpLnRleHQgIT09ICd9Jykgew0KLSAgICAgIGRvIHsNCi0gICAgICAgIGlmICh0aGlzLnBlZWsoJ30nKSkgew0KLSAgICAgICAgICAvLyBTdXBwb3J0IHRyYWlsaW5nIGNvbW1hcyBwZXIgRVM1LjEuDQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdmFyIHRva2VuID0gdGhpcy5jb25zdW1lKCk7DQotICAgICAgICBpZiAodG9rZW4uY29uc3RhbnQpIHsNCi0gICAgICAgICAga2V5cy5wdXNoKHRva2VuLnZhbHVlKTsNCi0gICAgICAgIH0gZWxzZSBpZiAodG9rZW4uaWRlbnRpZmllcikgew0KLSAgICAgICAgICBrZXlzLnB1c2godG9rZW4udGV4dCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICB0aGlzLnRocm93RXJyb3IoImludmFsaWQga2V5IiwgdG9rZW4pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy5jb25zdW1lKCc6Jyk7DQotICAgICAgICB2YWx1ZUZucy5wdXNoKHRoaXMuZXhwcmVzc2lvbigpKTsNCi0gICAgICB9IHdoaWxlICh0aGlzLmV4cGVjdCgnLCcpKTsNCi0gICAgfQ0KLSAgICB0aGlzLmNvbnN1bWUoJ30nKTsNCi0NCi0gICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAkcGFyc2VPYmplY3RMaXRlcmFsKHNlbGYsIGxvY2Fscykgew0KLSAgICAgIHZhciBvYmplY3QgPSB7fTsNCi0gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB2YWx1ZUZucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7DQotICAgICAgICBvYmplY3Rba2V5c1tpXV0gPSB2YWx1ZUZuc1tpXShzZWxmLCBsb2NhbHMpOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gb2JqZWN0Ow0KLSAgICB9LCB7DQotICAgICAgbGl0ZXJhbDogdHJ1ZSwNCi0gICAgICBjb25zdGFudDogdmFsdWVGbnMuZXZlcnkoaXNDb25zdGFudCksDQotICAgICAgaW5wdXRzOiB2YWx1ZUZucw0KLSAgICB9KTsNCi0gIH0NCi19Ow0KLQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUGFyc2VyIGhlbHBlciBmdW5jdGlvbnMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLWZ1bmN0aW9uIHNldHRlcihvYmosIHBhdGgsIHNldFZhbHVlLCBmdWxsRXhwKSB7DQotICBlbnN1cmVTYWZlT2JqZWN0KG9iaiwgZnVsbEV4cCk7DQotDQotICB2YXIgZWxlbWVudCA9IHBhdGguc3BsaXQoJy4nKSwga2V5Ow0KLSAgZm9yICh2YXIgaSA9IDA7IGVsZW1lbnQubGVuZ3RoID4gMTsgaSsrKSB7DQotICAgIGtleSA9IGVuc3VyZVNhZmVNZW1iZXJOYW1lKGVsZW1lbnQuc2hpZnQoKSwgZnVsbEV4cCk7DQotICAgIHZhciBwcm9wZXJ0eU9iaiA9IGVuc3VyZVNhZmVPYmplY3Qob2JqW2tleV0sIGZ1bGxFeHApOw0KLSAgICBpZiAoIXByb3BlcnR5T2JqKSB7DQotICAgICAgcHJvcGVydHlPYmogPSB7fTsNCi0gICAgICBvYmpba2V5XSA9IHByb3BlcnR5T2JqOw0KLSAgICB9DQotICAgIG9iaiA9IHByb3BlcnR5T2JqOw0KLSAgfQ0KLSAga2V5ID0gZW5zdXJlU2FmZU1lbWJlck5hbWUoZWxlbWVudC5zaGlmdCgpLCBmdWxsRXhwKTsNCi0gIGVuc3VyZVNhZmVPYmplY3Qob2JqW2tleV0sIGZ1bGxFeHApOw0KLSAgb2JqW2tleV0gPSBzZXRWYWx1ZTsNCi0gIHJldHVybiBzZXRWYWx1ZTsNCi19DQotDQotdmFyIGdldHRlckZuQ2FjaGVEZWZhdWx0ID0gY3JlYXRlTWFwKCk7DQotdmFyIGdldHRlckZuQ2FjaGVFeHBlbnNpdmUgPSBjcmVhdGVNYXAoKTsNCi0NCi1mdW5jdGlvbiBpc1Bvc3NpYmx5RGFuZ2Vyb3VzTWVtYmVyTmFtZShuYW1lKSB7DQotICByZXR1cm4gbmFtZSA9PSAnY29uc3RydWN0b3InOw0KLX0NCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgIkJsYWNrIEhvbGUiIHZhcmlhbnQgZnJvbToNCi0gKiAtIGh0dHA6Ly9qc3BlcmYuY29tL2FuZ3VsYXJqcy1wYXJzZS1nZXR0ZXIvNA0KLSAqIC0gaHR0cDovL2pzcGVyZi5jb20vcGF0aC1ldmFsdWF0aW9uLXNpbXBsaWZpZWQvNw0KLSAqLw0KLWZ1bmN0aW9uIGNzcFNhZmVHZXR0ZXJGbihrZXkwLCBrZXkxLCBrZXkyLCBrZXkzLCBrZXk0LCBmdWxsRXhwLCBleHBlbnNpdmVDaGVja3MpIHsNCi0gIGVuc3VyZVNhZmVNZW1iZXJOYW1lKGtleTAsIGZ1bGxFeHApOw0KLSAgZW5zdXJlU2FmZU1lbWJlck5hbWUoa2V5MSwgZnVsbEV4cCk7DQotICBlbnN1cmVTYWZlTWVtYmVyTmFtZShrZXkyLCBmdWxsRXhwKTsNCi0gIGVuc3VyZVNhZmVNZW1iZXJOYW1lKGtleTMsIGZ1bGxFeHApOw0KLSAgZW5zdXJlU2FmZU1lbWJlck5hbWUoa2V5NCwgZnVsbEV4cCk7DQotICB2YXIgZXNvID0gZnVuY3Rpb24obykgew0KLSAgICByZXR1cm4gZW5zdXJlU2FmZU9iamVjdChvLCBmdWxsRXhwKTsNCi0gIH07DQotICB2YXIgZXNvMCA9IChleHBlbnNpdmVDaGVja3MgfHwgaXNQb3NzaWJseURhbmdlcm91c01lbWJlck5hbWUoa2V5MCkpID8gZXNvIDogaWRlbnRpdHk7DQotICB2YXIgZXNvMSA9IChleHBlbnNpdmVDaGVja3MgfHwgaXNQb3NzaWJseURhbmdlcm91c01lbWJlck5hbWUoa2V5MSkpID8gZXNvIDogaWRlbnRpdHk7DQotICB2YXIgZXNvMiA9IChleHBlbnNpdmVDaGVja3MgfHwgaXNQb3NzaWJseURhbmdlcm91c01lbWJlck5hbWUoa2V5MikpID8gZXNvIDogaWRlbnRpdHk7DQotICB2YXIgZXNvMyA9IChleHBlbnNpdmVDaGVja3MgfHwgaXNQb3NzaWJseURhbmdlcm91c01lbWJlck5hbWUoa2V5MykpID8gZXNvIDogaWRlbnRpdHk7DQotICB2YXIgZXNvNCA9IChleHBlbnNpdmVDaGVja3MgfHwgaXNQb3NzaWJseURhbmdlcm91c01lbWJlck5hbWUoa2V5NCkpID8gZXNvIDogaWRlbnRpdHk7DQotDQotICByZXR1cm4gZnVuY3Rpb24gY3NwU2FmZUdldHRlcihzY29wZSwgbG9jYWxzKSB7DQotICAgIHZhciBwYXRoVmFsID0gKGxvY2FscyAmJiBsb2NhbHMuaGFzT3duUHJvcGVydHkoa2V5MCkpID8gbG9jYWxzIDogc2NvcGU7DQotDQotICAgIGlmIChwYXRoVmFsID09IG51bGwpIHJldHVybiBwYXRoVmFsOw0KLSAgICBwYXRoVmFsID0gZXNvMChwYXRoVmFsW2tleTBdKTsNCi0NCi0gICAgaWYgKCFrZXkxKSByZXR1cm4gcGF0aFZhbDsNCi0gICAgaWYgKHBhdGhWYWwgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDsNCi0gICAgcGF0aFZhbCA9IGVzbzEocGF0aFZhbFtrZXkxXSk7DQotDQotICAgIGlmICgha2V5MikgcmV0dXJuIHBhdGhWYWw7DQotICAgIGlmIChwYXRoVmFsID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7DQotICAgIHBhdGhWYWwgPSBlc28yKHBhdGhWYWxba2V5Ml0pOw0KLQ0KLSAgICBpZiAoIWtleTMpIHJldHVybiBwYXRoVmFsOw0KLSAgICBpZiAocGF0aFZhbCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkOw0KLSAgICBwYXRoVmFsID0gZXNvMyhwYXRoVmFsW2tleTNdKTsNCi0NCi0gICAgaWYgKCFrZXk0KSByZXR1cm4gcGF0aFZhbDsNCi0gICAgaWYgKHBhdGhWYWwgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDsNCi0gICAgcGF0aFZhbCA9IGVzbzQocGF0aFZhbFtrZXk0XSk7DQotDQotICAgIHJldHVybiBwYXRoVmFsOw0KLSAgfTsNCi19DQotDQotZnVuY3Rpb24gZ2V0dGVyRm5XaXRoRW5zdXJlU2FmZU9iamVjdChmbiwgZnVsbEV4cHJlc3Npb24pIHsNCi0gIHJldHVybiBmdW5jdGlvbihzLCBsKSB7DQotICAgIHJldHVybiBmbihzLCBsLCBlbnN1cmVTYWZlT2JqZWN0LCBmdWxsRXhwcmVzc2lvbik7DQotICB9Ow0KLX0NCi0NCi1mdW5jdGlvbiBnZXR0ZXJGbihwYXRoLCBvcHRpb25zLCBmdWxsRXhwKSB7DQotICB2YXIgZXhwZW5zaXZlQ2hlY2tzID0gb3B0aW9ucy5leHBlbnNpdmVDaGVja3M7DQotICB2YXIgZ2V0dGVyRm5DYWNoZSA9IChleHBlbnNpdmVDaGVja3MgPyBnZXR0ZXJGbkNhY2hlRXhwZW5zaXZlIDogZ2V0dGVyRm5DYWNoZURlZmF1bHQpOw0KLSAgdmFyIGZuID0gZ2V0dGVyRm5DYWNoZVtwYXRoXTsNCi0gIGlmIChmbikgcmV0dXJuIGZuOw0KLQ0KLQ0KLSAgdmFyIHBhdGhLZXlzID0gcGF0aC5zcGxpdCgnLicpLA0KLSAgICAgIHBhdGhLZXlzTGVuZ3RoID0gcGF0aEtleXMubGVuZ3RoOw0KLQ0KLSAgLy8gaHR0cDovL2pzcGVyZi5jb20vYW5ndWxhcmpzLXBhcnNlLWdldHRlci82DQotICBpZiAob3B0aW9ucy5jc3ApIHsNCi0gICAgaWYgKHBhdGhLZXlzTGVuZ3RoIDwgNikgew0KLSAgICAgIGZuID0gY3NwU2FmZUdldHRlckZuKHBhdGhLZXlzWzBdLCBwYXRoS2V5c1sxXSwgcGF0aEtleXNbMl0sIHBhdGhLZXlzWzNdLCBwYXRoS2V5c1s0XSwgZnVsbEV4cCwgZXhwZW5zaXZlQ2hlY2tzKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBmbiA9IGZ1bmN0aW9uIGNzcFNhZmVHZXR0ZXIoc2NvcGUsIGxvY2Fscykgew0KLSAgICAgICAgdmFyIGkgPSAwLCB2YWw7DQotICAgICAgICBkbyB7DQotICAgICAgICAgIHZhbCA9IGNzcFNhZmVHZXR0ZXJGbihwYXRoS2V5c1tpKytdLCBwYXRoS2V5c1tpKytdLCBwYXRoS2V5c1tpKytdLCBwYXRoS2V5c1tpKytdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEtleXNbaSsrXSwgZnVsbEV4cCwgZXhwZW5zaXZlQ2hlY2tzKShzY29wZSwgbG9jYWxzKTsNCi0NCi0gICAgICAgICAgbG9jYWxzID0gdW5kZWZpbmVkOyAvLyBjbGVhciBhZnRlciBmaXJzdCBpdGVyYXRpb24NCi0gICAgICAgICAgc2NvcGUgPSB2YWw7DQotICAgICAgICB9IHdoaWxlIChpIDwgcGF0aEtleXNMZW5ndGgpOw0KLSAgICAgICAgcmV0dXJuIHZhbDsNCi0gICAgICB9Ow0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICB2YXIgY29kZSA9ICcnOw0KLSAgICBpZiAoZXhwZW5zaXZlQ2hlY2tzKSB7DQotICAgICAgY29kZSArPSAncyA9IGVzbyhzLCBmZSk7XG5sID0gZXNvKGwsIGZlKTtcbic7DQotICAgIH0NCi0gICAgdmFyIG5lZWRzRW5zdXJlU2FmZU9iamVjdCA9IGV4cGVuc2l2ZUNoZWNrczsNCi0gICAgZm9yRWFjaChwYXRoS2V5cywgZnVuY3Rpb24oa2V5LCBpbmRleCkgew0KLSAgICAgIGVuc3VyZVNhZmVNZW1iZXJOYW1lKGtleSwgZnVsbEV4cCk7DQotICAgICAgdmFyIGxvb2t1cEpzID0gKGluZGV4DQotICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHNpbXBseSBkZXJlZmVyZW5jZSAncycgb24gYW55IC5kb3Qgbm90YXRpb24NCi0gICAgICAgICAgICAgICAgICAgICAgPyAncycNCi0gICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGlmIHdlIGFyZSBmaXJzdCB0aGVuIHdlIGNoZWNrIGxvY2FscyBmaXJzdCwgYW5kIGlmIHNvIHJlYWQgaXQgZmlyc3QNCi0gICAgICAgICAgICAgICAgICAgICAgOiAnKChsJiZsLmhhc093blByb3BlcnR5KCInICsga2V5ICsgJyIpKT9sOnMpJykgKyAnLicgKyBrZXk7DQotICAgICAgaWYgKGV4cGVuc2l2ZUNoZWNrcyB8fCBpc1Bvc3NpYmx5RGFuZ2Vyb3VzTWVtYmVyTmFtZShrZXkpKSB7DQotICAgICAgICBsb29rdXBKcyA9ICdlc28oJyArIGxvb2t1cEpzICsgJywgZmUpJzsNCi0gICAgICAgIG5lZWRzRW5zdXJlU2FmZU9iamVjdCA9IHRydWU7DQotICAgICAgfQ0KLSAgICAgIGNvZGUgKz0gJ2lmKHMgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbicgKw0KLSAgICAgICAgICAgICAgJ3M9JyArIGxvb2t1cEpzICsgJztcbic7DQotICAgIH0pOw0KLSAgICBjb2RlICs9ICdyZXR1cm4gczsnOw0KLQ0KLSAgICAvKiBqc2hpbnQgLVcwNTQgKi8NCi0gICAgdmFyIGV2YWxlZEZuR2V0dGVyID0gbmV3IEZ1bmN0aW9uKCdzJywgJ2wnLCAnZXNvJywgJ2ZlJywgY29kZSk7IC8vIHM9c2NvcGUsIGw9bG9jYWxzLCBlc289ZW5zdXJlU2FmZU9iamVjdA0KLSAgICAvKiBqc2hpbnQgK1cwNTQgKi8NCi0gICAgZXZhbGVkRm5HZXR0ZXIudG9TdHJpbmcgPSB2YWx1ZUZuKGNvZGUpOw0KLSAgICBpZiAobmVlZHNFbnN1cmVTYWZlT2JqZWN0KSB7DQotICAgICAgZXZhbGVkRm5HZXR0ZXIgPSBnZXR0ZXJGbldpdGhFbnN1cmVTYWZlT2JqZWN0KGV2YWxlZEZuR2V0dGVyLCBmdWxsRXhwKTsNCi0gICAgfQ0KLSAgICBmbiA9IGV2YWxlZEZuR2V0dGVyOw0KLSAgfQ0KLQ0KLSAgZm4uc2hhcmVkR2V0dGVyID0gdHJ1ZTsNCi0gIGZuLmFzc2lnbiA9IGZ1bmN0aW9uKHNlbGYsIHZhbHVlKSB7DQotICAgIHJldHVybiBzZXR0ZXIoc2VsZiwgcGF0aCwgdmFsdWUsIHBhdGgpOw0KLSAgfTsNCi0gIGdldHRlckZuQ2FjaGVbcGF0aF0gPSBmbjsNCi0gIHJldHVybiBmbjsNCi19DQotDQotdmFyIG9iamVjdFZhbHVlT2YgPSBPYmplY3QucHJvdG90eXBlLnZhbHVlT2Y7DQotDQotZnVuY3Rpb24gZ2V0VmFsdWVPZih2YWx1ZSkgew0KLSAgcmV0dXJuIGlzRnVuY3Rpb24odmFsdWUudmFsdWVPZikgPyB2YWx1ZS52YWx1ZU9mKCkgOiBvYmplY3RWYWx1ZU9mLmNhbGwodmFsdWUpOw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBzZXJ2aWNlDQotICogQG5hbWUgJHBhcnNlDQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqDQotICogQ29udmVydHMgQW5ndWxhciB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpbnRvIGEgZnVuY3Rpb24uDQotICoNCi0gKiBgYGBqcw0KLSAqICAgdmFyIGdldHRlciA9ICRwYXJzZSgndXNlci5uYW1lJyk7DQotICogICB2YXIgc2V0dGVyID0gZ2V0dGVyLmFzc2lnbjsNCi0gKiAgIHZhciBjb250ZXh0ID0ge3VzZXI6e25hbWU6J2FuZ3VsYXInfX07DQotICogICB2YXIgbG9jYWxzID0ge3VzZXI6e25hbWU6J2xvY2FsJ319Ow0KLSAqDQotICogICBleHBlY3QoZ2V0dGVyKGNvbnRleHQpKS50b0VxdWFsKCdhbmd1bGFyJyk7DQotICogICBzZXR0ZXIoY29udGV4dCwgJ25ld1ZhbHVlJyk7DQotICogICBleHBlY3QoY29udGV4dC51c2VyLm5hbWUpLnRvRXF1YWwoJ25ld1ZhbHVlJyk7DQotICogICBleHBlY3QoZ2V0dGVyKGNvbnRleHQsIGxvY2FscykpLnRvRXF1YWwoJ2xvY2FsJyk7DQotICogYGBgDQotICoNCi0gKg0KLSAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFN0cmluZyBleHByZXNzaW9uIHRvIGNvbXBpbGUuDQotICogQHJldHVybnMge2Z1bmN0aW9uKGNvbnRleHQsIGxvY2Fscyl9IGEgZnVuY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbjoNCi0gKg0KLSAqICAgICogYGNvbnRleHRgIOKAPyBge29iamVjdH1gIOKAPyBhbiBvYmplY3QgYWdhaW5zdCB3aGljaCBhbnkgZXhwcmVzc2lvbnMgZW1iZWRkZWQgaW4gdGhlIHN0cmluZ3MNCi0gKiAgICAgIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCAodHlwaWNhbGx5IGEgc2NvcGUgb2JqZWN0KS4NCi0gKiAgICAqIGBsb2NhbHNgIOKAPyBge29iamVjdD19YCDigD8gbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluDQotICogICAgICBgY29udGV4dGAuDQotICoNCi0gKiAgICBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gYWxzbyBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOg0KLSAqICAgICAgKiBgbGl0ZXJhbGAg4oA/IGB7Ym9vbGVhbn1gIOKAPyB3aGV0aGVyIHRoZSBleHByZXNzaW9uJ3MgdG9wLWxldmVsIG5vZGUgaXMgYSBKYXZhU2NyaXB0DQotICogICAgICAgIGxpdGVyYWwuDQotICogICAgICAqIGBjb25zdGFudGAg4oA/IGB7Ym9vbGVhbn1gIOKAPyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIGlzIG1hZGUgZW50aXJlbHkgb2YgSmF2YVNjcmlwdA0KLSAqICAgICAgICBjb25zdGFudCBsaXRlcmFscy4NCi0gKiAgICAgICogYGFzc2lnbmAg4oA/IGB7P2Z1bmN0aW9uKGNvbnRleHQsIHZhbHVlKX1gIOKAPyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBhc3NpZ25hYmxlLCB0aGlzIHdpbGwgYmUNCi0gKiAgICAgICAgc2V0IHRvIGEgZnVuY3Rpb24gdG8gY2hhbmdlIGl0cyB2YWx1ZSBvbiB0aGUgZ2l2ZW4gY29udGV4dC4NCi0gKg0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBwcm92aWRlcg0KLSAqIEBuYW1lICRwYXJzZVByb3ZpZGVyDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBgJHBhcnNlUHJvdmlkZXJgIGNhbiBiZSB1c2VkIGZvciBjb25maWd1cmluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUge0BsaW5rIG5nLiRwYXJzZSAkcGFyc2V9DQotICogIHNlcnZpY2UuDQotICovDQotZnVuY3Rpb24gJFBhcnNlUHJvdmlkZXIoKSB7DQotICB2YXIgY2FjaGVEZWZhdWx0ID0gY3JlYXRlTWFwKCk7DQotICB2YXIgY2FjaGVFeHBlbnNpdmUgPSBjcmVhdGVNYXAoKTsNCi0NCi0NCi0NCi0gIHRoaXMuJGdldCA9IFsnJGZpbHRlcicsICckc25pZmZlcicsIGZ1bmN0aW9uKCRmaWx0ZXIsICRzbmlmZmVyKSB7DQotICAgIHZhciAkcGFyc2VPcHRpb25zID0gew0KLSAgICAgICAgICBjc3A6ICRzbmlmZmVyLmNzcCwNCi0gICAgICAgICAgZXhwZW5zaXZlQ2hlY2tzOiBmYWxzZQ0KLSAgICAgICAgfSwNCi0gICAgICAgICRwYXJzZU9wdGlvbnNFeHBlbnNpdmUgPSB7DQotICAgICAgICAgIGNzcDogJHNuaWZmZXIuY3NwLA0KLSAgICAgICAgICBleHBlbnNpdmVDaGVja3M6IHRydWUNCi0gICAgICAgIH07DQotDQotICAgIGZ1bmN0aW9uIHdyYXBTaGFyZWRFeHByZXNzaW9uKGV4cCkgew0KLSAgICAgIHZhciB3cmFwcGVkID0gZXhwOw0KLQ0KLSAgICAgIGlmIChleHAuc2hhcmVkR2V0dGVyKSB7DQotICAgICAgICB3cmFwcGVkID0gZnVuY3Rpb24gJHBhcnNlV3JhcHBlcihzZWxmLCBsb2NhbHMpIHsNCi0gICAgICAgICAgcmV0dXJuIGV4cChzZWxmLCBsb2NhbHMpOw0KLSAgICAgICAgfTsNCi0gICAgICAgIHdyYXBwZWQubGl0ZXJhbCA9IGV4cC5saXRlcmFsOw0KLSAgICAgICAgd3JhcHBlZC5jb25zdGFudCA9IGV4cC5jb25zdGFudDsNCi0gICAgICAgIHdyYXBwZWQuYXNzaWduID0gZXhwLmFzc2lnbjsNCi0gICAgICB9DQotDQotICAgICAgcmV0dXJuIHdyYXBwZWQ7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIGZ1bmN0aW9uICRwYXJzZShleHAsIGludGVyY2VwdG9yRm4sIGV4cGVuc2l2ZUNoZWNrcykgew0KLSAgICAgIHZhciBwYXJzZWRFeHByZXNzaW9uLCBvbmVUaW1lLCBjYWNoZUtleTsNCi0NCi0gICAgICBzd2l0Y2ggKHR5cGVvZiBleHApIHsNCi0gICAgICAgIGNhc2UgJ3N0cmluZyc6DQotICAgICAgICAgIGNhY2hlS2V5ID0gZXhwID0gZXhwLnRyaW0oKTsNCi0NCi0gICAgICAgICAgdmFyIGNhY2hlID0gKGV4cGVuc2l2ZUNoZWNrcyA/IGNhY2hlRXhwZW5zaXZlIDogY2FjaGVEZWZhdWx0KTsNCi0gICAgICAgICAgcGFyc2VkRXhwcmVzc2lvbiA9IGNhY2hlW2NhY2hlS2V5XTsNCi0NCi0gICAgICAgICAgaWYgKCFwYXJzZWRFeHByZXNzaW9uKSB7DQotICAgICAgICAgICAgaWYgKGV4cC5jaGFyQXQoMCkgPT09ICc6JyAmJiBleHAuY2hhckF0KDEpID09PSAnOicpIHsNCi0gICAgICAgICAgICAgIG9uZVRpbWUgPSB0cnVlOw0KLSAgICAgICAgICAgICAgZXhwID0gZXhwLnN1YnN0cmluZygyKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdmFyIHBhcnNlT3B0aW9ucyA9IGV4cGVuc2l2ZUNoZWNrcyA/ICRwYXJzZU9wdGlvbnNFeHBlbnNpdmUgOiAkcGFyc2VPcHRpb25zOw0KLSAgICAgICAgICAgIHZhciBsZXhlciA9IG5ldyBMZXhlcihwYXJzZU9wdGlvbnMpOw0KLSAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgUGFyc2VyKGxleGVyLCAkZmlsdGVyLCBwYXJzZU9wdGlvbnMpOw0KLSAgICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24gPSBwYXJzZXIucGFyc2UoZXhwKTsNCi0NCi0gICAgICAgICAgICBpZiAocGFyc2VkRXhwcmVzc2lvbi5jb25zdGFudCkgew0KLSAgICAgICAgICAgICAgcGFyc2VkRXhwcmVzc2lvbi4kJHdhdGNoRGVsZWdhdGUgPSBjb25zdGFudFdhdGNoRGVsZWdhdGU7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChvbmVUaW1lKSB7DQotICAgICAgICAgICAgICAvL29uZVRpbWUgaXMgbm90IHBhcnQgb2YgdGhlIGV4cCBwYXNzZWQgdG8gdGhlIFBhcnNlciBzbyB3ZSBtYXkgaGF2ZSB0bw0KLSAgICAgICAgICAgICAgLy93cmFwIHRoZSBwYXJzZWRFeHByZXNzaW9uIGJlZm9yZSBhZGRpbmcgYSAkJHdhdGNoRGVsZWdhdGUNCi0gICAgICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24gPSB3cmFwU2hhcmVkRXhwcmVzc2lvbihwYXJzZWRFeHByZXNzaW9uKTsNCi0gICAgICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlID0gcGFyc2VkRXhwcmVzc2lvbi5saXRlcmFsID8NCi0gICAgICAgICAgICAgICAgb25lVGltZUxpdGVyYWxXYXRjaERlbGVnYXRlIDogb25lVGltZVdhdGNoRGVsZWdhdGU7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJzZWRFeHByZXNzaW9uLmlucHV0cykgew0KLSAgICAgICAgICAgICAgcGFyc2VkRXhwcmVzc2lvbi4kJHdhdGNoRGVsZWdhdGUgPSBpbnB1dHNXYXRjaERlbGVnYXRlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBjYWNoZVtjYWNoZUtleV0gPSBwYXJzZWRFeHByZXNzaW9uOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHJldHVybiBhZGRJbnRlcmNlcHRvcihwYXJzZWRFeHByZXNzaW9uLCBpbnRlcmNlcHRvckZuKTsNCi0NCi0gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoNCi0gICAgICAgICAgcmV0dXJuIGFkZEludGVyY2VwdG9yKGV4cCwgaW50ZXJjZXB0b3JGbik7DQotDQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICByZXR1cm4gYWRkSW50ZXJjZXB0b3Iobm9vcCwgaW50ZXJjZXB0b3JGbik7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBmdW5jdGlvbiBjb2xsZWN0RXhwcmVzc2lvbklucHV0cyhpbnB1dHMsIGxpc3QpIHsNCi0gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpbnB1dHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KLSAgICAgICAgdmFyIGlucHV0ID0gaW5wdXRzW2ldOw0KLSAgICAgICAgaWYgKCFpbnB1dC5jb25zdGFudCkgew0KLSAgICAgICAgICBpZiAoaW5wdXQuaW5wdXRzKSB7DQotICAgICAgICAgICAgY29sbGVjdEV4cHJlc3Npb25JbnB1dHMoaW5wdXQuaW5wdXRzLCBsaXN0KTsNCi0gICAgICAgICAgfSBlbHNlIGlmIChsaXN0LmluZGV4T2YoaW5wdXQpID09PSAtMSkgeyAvLyBUT0RPKHBlcmYpIGNhbiB3ZSBkbyBiZXR0ZXI/DQotICAgICAgICAgICAgbGlzdC5wdXNoKGlucHV0KTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICByZXR1cm4gbGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBleHByZXNzaW9uSW5wdXREaXJ0eUNoZWNrKG5ld1ZhbHVlLCBvbGRWYWx1ZU9mVmFsdWUpIHsNCi0NCi0gICAgICBpZiAobmV3VmFsdWUgPT0gbnVsbCB8fCBvbGRWYWx1ZU9mVmFsdWUgPT0gbnVsbCkgeyAvLyBudWxsL3VuZGVmaW5lZA0KLSAgICAgICAgcmV0dXJuIG5ld1ZhbHVlID09PSBvbGRWYWx1ZU9mVmFsdWU7DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmICh0eXBlb2YgbmV3VmFsdWUgPT09ICdvYmplY3QnKSB7DQotDQotICAgICAgICAvLyBhdHRlbXB0IHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgcHJpbWl0aXZlIHR5cGUNCi0gICAgICAgIC8vIFRPRE8oZG9jcyk6IGFkZCBhIG5vdGUgdG8gZG9jcyB0aGF0IGJ5IGltcGxlbWVudGluZyB2YWx1ZU9mIGV2ZW4gb2JqZWN0cyBhbmQgYXJyYXlzIGNhbg0KLSAgICAgICAgLy8gICAgICAgICAgICAgYmUgY2hlYXBseSBkaXJ0eS1jaGVja2VkDQotICAgICAgICBuZXdWYWx1ZSA9IGdldFZhbHVlT2YobmV3VmFsdWUpOw0KLQ0KLSAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ29iamVjdCcpIHsNCi0gICAgICAgICAgLy8gb2JqZWN0cy9hcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgLSBkZWVwLXdhdGNoaW5nIHRoZW0gd291bGQgYmUgdG9vIGV4cGVuc2l2ZQ0KLSAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBmYWxsLXRocm91Z2ggdG8gdGhlIHByaW1pdGl2ZSBlcXVhbGl0eSBjaGVjaw0KLSAgICAgIH0NCi0NCi0gICAgICAvL1ByaW1pdGl2ZSBvciBOYU4NCi0gICAgICByZXR1cm4gbmV3VmFsdWUgPT09IG9sZFZhbHVlT2ZWYWx1ZSB8fCAobmV3VmFsdWUgIT09IG5ld1ZhbHVlICYmIG9sZFZhbHVlT2ZWYWx1ZSAhPT0gb2xkVmFsdWVPZlZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBpbnB1dHNXYXRjaERlbGVnYXRlKHNjb3BlLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIHBhcnNlZEV4cHJlc3Npb24pIHsNCi0gICAgICB2YXIgaW5wdXRFeHByZXNzaW9ucyA9IHBhcnNlZEV4cHJlc3Npb24uJCRpbnB1dHMgfHwNCi0gICAgICAgICAgICAgICAgICAgIChwYXJzZWRFeHByZXNzaW9uLiQkaW5wdXRzID0gY29sbGVjdEV4cHJlc3Npb25JbnB1dHMocGFyc2VkRXhwcmVzc2lvbi5pbnB1dHMsIFtdKSk7DQotDQotICAgICAgdmFyIGxhc3RSZXN1bHQ7DQotDQotICAgICAgaWYgKGlucHV0RXhwcmVzc2lvbnMubGVuZ3RoID09PSAxKSB7DQotICAgICAgICB2YXIgb2xkSW5wdXRWYWx1ZSA9IGV4cHJlc3Npb25JbnB1dERpcnR5Q2hlY2s7IC8vIGluaXQgdG8gc29tZXRoaW5nIHVuaXF1ZSBzbyB0aGF0IGVxdWFscyBjaGVjayBmYWlscw0KLSAgICAgICAgaW5wdXRFeHByZXNzaW9ucyA9IGlucHV0RXhwcmVzc2lvbnNbMF07DQotICAgICAgICByZXR1cm4gc2NvcGUuJHdhdGNoKGZ1bmN0aW9uIGV4cHJlc3Npb25JbnB1dFdhdGNoKHNjb3BlKSB7DQotICAgICAgICAgIHZhciBuZXdJbnB1dFZhbHVlID0gaW5wdXRFeHByZXNzaW9ucyhzY29wZSk7DQotICAgICAgICAgIGlmICghZXhwcmVzc2lvbklucHV0RGlydHlDaGVjayhuZXdJbnB1dFZhbHVlLCBvbGRJbnB1dFZhbHVlKSkgew0KLSAgICAgICAgICAgIGxhc3RSZXN1bHQgPSBwYXJzZWRFeHByZXNzaW9uKHNjb3BlKTsNCi0gICAgICAgICAgICBvbGRJbnB1dFZhbHVlID0gbmV3SW5wdXRWYWx1ZSAmJiBnZXRWYWx1ZU9mKG5ld0lucHV0VmFsdWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHJldHVybiBsYXN0UmVzdWx0Ow0KLSAgICAgICAgfSwgbGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5KTsNCi0gICAgICB9DQotDQotICAgICAgdmFyIG9sZElucHV0VmFsdWVPZlZhbHVlcyA9IFtdOw0KLSAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGlucHV0RXhwcmVzc2lvbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KLSAgICAgICAgb2xkSW5wdXRWYWx1ZU9mVmFsdWVzW2ldID0gZXhwcmVzc2lvbklucHV0RGlydHlDaGVjazsgLy8gaW5pdCB0byBzb21ldGhpbmcgdW5pcXVlIHNvIHRoYXQgZXF1YWxzIGNoZWNrIGZhaWxzDQotICAgICAgfQ0KLQ0KLSAgICAgIHJldHVybiBzY29wZS4kd2F0Y2goZnVuY3Rpb24gZXhwcmVzc2lvbklucHV0c1dhdGNoKHNjb3BlKSB7DQotICAgICAgICB2YXIgY2hhbmdlZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW5wdXRFeHByZXNzaW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7DQotICAgICAgICAgIHZhciBuZXdJbnB1dFZhbHVlID0gaW5wdXRFeHByZXNzaW9uc1tpXShzY29wZSk7DQotICAgICAgICAgIGlmIChjaGFuZ2VkIHx8IChjaGFuZ2VkID0gIWV4cHJlc3Npb25JbnB1dERpcnR5Q2hlY2sobmV3SW5wdXRWYWx1ZSwgb2xkSW5wdXRWYWx1ZU9mVmFsdWVzW2ldKSkpIHsNCi0gICAgICAgICAgICBvbGRJbnB1dFZhbHVlT2ZWYWx1ZXNbaV0gPSBuZXdJbnB1dFZhbHVlICYmIGdldFZhbHVlT2YobmV3SW5wdXRWYWx1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjaGFuZ2VkKSB7DQotICAgICAgICAgIGxhc3RSZXN1bHQgPSBwYXJzZWRFeHByZXNzaW9uKHNjb3BlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBsYXN0UmVzdWx0Ow0KLSAgICAgIH0sIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSk7DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gb25lVGltZVdhdGNoRGVsZWdhdGUoc2NvcGUsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSwgcGFyc2VkRXhwcmVzc2lvbikgew0KLSAgICAgIHZhciB1bndhdGNoLCBsYXN0VmFsdWU7DQotICAgICAgcmV0dXJuIHVud2F0Y2ggPSBzY29wZS4kd2F0Y2goZnVuY3Rpb24gb25lVGltZVdhdGNoKHNjb3BlKSB7DQotICAgICAgICByZXR1cm4gcGFyc2VkRXhwcmVzc2lvbihzY29wZSk7DQotICAgICAgfSwgZnVuY3Rpb24gb25lVGltZUxpc3RlbmVyKHZhbHVlLCBvbGQsIHNjb3BlKSB7DQotICAgICAgICBsYXN0VmFsdWUgPSB2YWx1ZTsNCi0gICAgICAgIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVyKSkgew0KLSAgICAgICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHsNCi0gICAgICAgICAgc2NvcGUuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIGlmIChpc0RlZmluZWQobGFzdFZhbHVlKSkgew0KLSAgICAgICAgICAgICAgdW53YXRjaCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSk7DQotICAgICAgICB9DQotICAgICAgfSwgb2JqZWN0RXF1YWxpdHkpOw0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIG9uZVRpbWVMaXRlcmFsV2F0Y2hEZWxlZ2F0ZShzY29wZSwgbGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5LCBwYXJzZWRFeHByZXNzaW9uKSB7DQotICAgICAgdmFyIHVud2F0Y2gsIGxhc3RWYWx1ZTsNCi0gICAgICByZXR1cm4gdW53YXRjaCA9IHNjb3BlLiR3YXRjaChmdW5jdGlvbiBvbmVUaW1lV2F0Y2goc2NvcGUpIHsNCi0gICAgICAgIHJldHVybiBwYXJzZWRFeHByZXNzaW9uKHNjb3BlKTsNCi0gICAgICB9LCBmdW5jdGlvbiBvbmVUaW1lTGlzdGVuZXIodmFsdWUsIG9sZCwgc2NvcGUpIHsNCi0gICAgICAgIGxhc3RWYWx1ZSA9IHZhbHVlOw0KLSAgICAgICAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXIpKSB7DQotICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgdmFsdWUsIG9sZCwgc2NvcGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlzQWxsRGVmaW5lZCh2YWx1ZSkpIHsNCi0gICAgICAgICAgc2NvcGUuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIGlmIChpc0FsbERlZmluZWQobGFzdFZhbHVlKSkgdW53YXRjaCgpOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0gICAgICB9LCBvYmplY3RFcXVhbGl0eSk7DQotDQotICAgICAgZnVuY3Rpb24gaXNBbGxEZWZpbmVkKHZhbHVlKSB7DQotICAgICAgICB2YXIgYWxsRGVmaW5lZCA9IHRydWU7DQotICAgICAgICBmb3JFYWNoKHZhbHVlLCBmdW5jdGlvbih2YWwpIHsNCi0gICAgICAgICAgaWYgKCFpc0RlZmluZWQodmFsKSkgYWxsRGVmaW5lZCA9IGZhbHNlOw0KLSAgICAgICAgfSk7DQotICAgICAgICByZXR1cm4gYWxsRGVmaW5lZDsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gY29uc3RhbnRXYXRjaERlbGVnYXRlKHNjb3BlLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIHBhcnNlZEV4cHJlc3Npb24pIHsNCi0gICAgICB2YXIgdW53YXRjaDsNCi0gICAgICByZXR1cm4gdW53YXRjaCA9IHNjb3BlLiR3YXRjaChmdW5jdGlvbiBjb25zdGFudFdhdGNoKHNjb3BlKSB7DQotICAgICAgICByZXR1cm4gcGFyc2VkRXhwcmVzc2lvbihzY29wZSk7DQotICAgICAgfSwgZnVuY3Rpb24gY29uc3RhbnRMaXN0ZW5lcih2YWx1ZSwgb2xkLCBzY29wZSkgew0KLSAgICAgICAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXIpKSB7DQotICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQotICAgICAgICB9DQotICAgICAgICB1bndhdGNoKCk7DQotICAgICAgfSwgb2JqZWN0RXF1YWxpdHkpOw0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGFkZEludGVyY2VwdG9yKHBhcnNlZEV4cHJlc3Npb24sIGludGVyY2VwdG9yRm4pIHsNCi0gICAgICBpZiAoIWludGVyY2VwdG9yRm4pIHJldHVybiBwYXJzZWRFeHByZXNzaW9uOw0KLSAgICAgIHZhciB3YXRjaERlbGVnYXRlID0gcGFyc2VkRXhwcmVzc2lvbi4kJHdhdGNoRGVsZWdhdGU7DQotDQotICAgICAgdmFyIHJlZ3VsYXJXYXRjaCA9DQotICAgICAgICAgIHdhdGNoRGVsZWdhdGUgIT09IG9uZVRpbWVMaXRlcmFsV2F0Y2hEZWxlZ2F0ZSAmJg0KLSAgICAgICAgICB3YXRjaERlbGVnYXRlICE9PSBvbmVUaW1lV2F0Y2hEZWxlZ2F0ZTsNCi0NCi0gICAgICB2YXIgZm4gPSByZWd1bGFyV2F0Y2ggPyBmdW5jdGlvbiByZWd1bGFySW50ZXJjZXB0ZWRFeHByZXNzaW9uKHNjb3BlLCBsb2NhbHMpIHsNCi0gICAgICAgIHZhciB2YWx1ZSA9IHBhcnNlZEV4cHJlc3Npb24oc2NvcGUsIGxvY2Fscyk7DQotICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3JGbih2YWx1ZSwgc2NvcGUsIGxvY2Fscyk7DQotICAgICAgfSA6IGZ1bmN0aW9uIG9uZVRpbWVJbnRlcmNlcHRlZEV4cHJlc3Npb24oc2NvcGUsIGxvY2Fscykgew0KLSAgICAgICAgdmFyIHZhbHVlID0gcGFyc2VkRXhwcmVzc2lvbihzY29wZSwgbG9jYWxzKTsNCi0gICAgICAgIHZhciByZXN1bHQgPSBpbnRlcmNlcHRvckZuKHZhbHVlLCBzY29wZSwgbG9jYWxzKTsNCi0gICAgICAgIC8vIHdlIG9ubHkgcmV0dXJuIHRoZSBpbnRlcmNlcHRvcidzIHJlc3VsdCBpZiB0aGUNCi0gICAgICAgIC8vIGluaXRpYWwgdmFsdWUgaXMgZGVmaW5lZCAoZm9yIGJpbmQtb25jZSkNCi0gICAgICAgIHJldHVybiBpc0RlZmluZWQodmFsdWUpID8gcmVzdWx0IDogdmFsdWU7DQotICAgICAgfTsNCi0NCi0gICAgICAvLyBQcm9wYWdhdGUgJCR3YXRjaERlbGVnYXRlcyBvdGhlciB0aGVuIGlucHV0c1dhdGNoRGVsZWdhdGUNCi0gICAgICBpZiAocGFyc2VkRXhwcmVzc2lvbi4kJHdhdGNoRGVsZWdhdGUgJiYNCi0gICAgICAgICAgcGFyc2VkRXhwcmVzc2lvbi4kJHdhdGNoRGVsZWdhdGUgIT09IGlucHV0c1dhdGNoRGVsZWdhdGUpIHsNCi0gICAgICAgIGZuLiQkd2F0Y2hEZWxlZ2F0ZSA9IHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlOw0KLSAgICAgIH0gZWxzZSBpZiAoIWludGVyY2VwdG9yRm4uJHN0YXRlZnVsKSB7DQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBpbnRlcmNlcHRvciwgYnV0IG5vIHdhdGNoRGVsZWdhdGUgdGhlbiB0cmVhdCB0aGUgaW50ZXJjZXB0b3IgbGlrZQ0KLSAgICAgICAgLy8gd2UgdHJlYXQgZmlsdGVycyAtIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBwdXJlIGZ1bmN0aW9uIHVubGVzcyBmbGFnZ2VkIHdpdGggJHN0YXRlZnVsDQotICAgICAgICBmbi4kJHdhdGNoRGVsZWdhdGUgPSBpbnB1dHNXYXRjaERlbGVnYXRlOw0KLSAgICAgICAgZm4uaW5wdXRzID0gW3BhcnNlZEV4cHJlc3Npb25dOw0KLSAgICAgIH0NCi0NCi0gICAgICByZXR1cm4gZm47DQotICAgIH0NCi0gIH1dOw0KLX0NCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICRxDQotICogQHJlcXVpcmVzICRyb290U2NvcGUNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEEgc2VydmljZSB0aGF0IGhlbHBzIHlvdSBydW4gZnVuY3Rpb25zIGFzeW5jaHJvbm91c2x5LCBhbmQgdXNlIHRoZWlyIHJldHVybiB2YWx1ZXMgKG9yIGV4Y2VwdGlvbnMpDQotICogd2hlbiB0aGV5IGFyZSBkb25lIHByb2Nlc3NpbmcuDQotICoNCi0gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHByb21pc2VzL2RlZmVycmVkIG9iamVjdHMgaW5zcGlyZWQgYnkNCi0gKiBbS3JpcyBLb3dhbCdzIFFdKGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvcSkuDQotICoNCi0gKiAkcSBjYW4gYmUgdXNlZCBpbiB0d28gZmFzaGlvbnMgLS0tIG9uZSB3aGljaCBpcyBtb3JlIHNpbWlsYXIgdG8gS3JpcyBLb3dhbCdzIFEgb3IgalF1ZXJ5J3MgRGVmZXJyZWQNCi0gKiBpbXBsZW1lbnRhdGlvbnMsIGFuZCB0aGUgb3RoZXIgd2hpY2ggcmVzZW1ibGVzIEVTNiBwcm9taXNlcyB0byBzb21lIGRlZ3JlZS4NCi0gKg0KLSAqICMgJHEgY29uc3RydWN0b3INCi0gKg0KLSAqIFRoZSBzdHJlYW1saW5lZCBFUzYgc3R5bGUgcHJvbWlzZSBpcyBlc3NlbnRpYWxseSBqdXN0IHVzaW5nICRxIGFzIGEgY29uc3RydWN0b3Igd2hpY2ggdGFrZXMgYSBgcmVzb2x2ZXJgDQotICogZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIG5hdGl2ZSBQcm9taXNlIGltcGxlbWVudGF0aW9uIGZyb20gRVM2IEhhcm1vbnksDQotICogc2VlIFtNRE5dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb21pc2UpLg0KLSAqDQotICogV2hpbGUgdGhlIGNvbnN0cnVjdG9yLXN0eWxlIHVzZSBpcyBzdXBwb3J0ZWQsIG5vdCBhbGwgb2YgdGhlIHN1cHBvcnRpbmcgbWV0aG9kcyBmcm9tIEVTNiBIYXJtb255IHByb21pc2VzIGFyZQ0KLSAqIGF2YWlsYWJsZSB5ZXQuDQotICoNCi0gKiBJdCBjYW4gYmUgdXNlZCBsaWtlIHNvOg0KLSAqDQotICogYGBganMNCi0gKiAgIC8vIGZvciB0aGUgcHVycG9zZSBvZiB0aGlzIGV4YW1wbGUgbGV0J3MgYXNzdW1lIHRoYXQgdmFyaWFibGVzIGAkcWAgYW5kIGBva1RvR3JlZXRgDQotICogICAvLyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGUgKHRoZXkgY291bGQgaGF2ZSBiZWVuIGluamVjdGVkIG9yIHBhc3NlZCBpbikuDQotICoNCi0gKiAgIGZ1bmN0aW9uIGFzeW5jR3JlZXQobmFtZSkgew0KLSAqICAgICAvLyBwZXJmb3JtIHNvbWUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiwgcmVzb2x2ZSBvciByZWplY3QgdGhlIHByb21pc2Ugd2hlbiBhcHByb3ByaWF0ZS4NCi0gKiAgICAgcmV0dXJuICRxKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgew0KLSAqICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQotICogICAgICAgICBpZiAob2tUb0dyZWV0KG5hbWUpKSB7DQotICogICAgICAgICAgIHJlc29sdmUoJ0hlbGxvLCAnICsgbmFtZSArICchJyk7DQotICogICAgICAgICB9IGVsc2Ugew0KLSAqICAgICAgICAgICByZWplY3QoJ0dyZWV0aW5nICcgKyBuYW1lICsgJyBpcyBub3QgYWxsb3dlZC4nKTsNCi0gKiAgICAgICAgIH0NCi0gKiAgICAgICB9LCAxMDAwKTsNCi0gKiAgICAgfSk7DQotICogICB9DQotICoNCi0gKiAgIHZhciBwcm9taXNlID0gYXN5bmNHcmVldCgnUm9iaW4gSG9vZCcpOw0KLSAqICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGdyZWV0aW5nKSB7DQotICogICAgIGFsZXJ0KCdTdWNjZXNzOiAnICsgZ3JlZXRpbmcpOw0KLSAqICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7DQotICogICAgIGFsZXJ0KCdGYWlsZWQ6ICcgKyByZWFzb24pOw0KLSAqICAgfSk7DQotICogYGBgDQotICoNCi0gKiBOb3RlOiBwcm9ncmVzcy9ub3RpZnkgY2FsbGJhY2tzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCB2aWEgdGhlIEVTNi1zdHlsZSBpbnRlcmZhY2UuDQotICoNCi0gKiBIb3dldmVyLCB0aGUgbW9yZSB0cmFkaXRpb25hbCBDb21tb25KUy1zdHlsZSB1c2FnZSBpcyBzdGlsbCBhdmFpbGFibGUsIGFuZCBkb2N1bWVudGVkIGJlbG93Lg0KLSAqDQotICogW1RoZSBDb21tb25KUyBQcm9taXNlIHByb3Bvc2FsXShodHRwOi8vd2lraS5jb21tb25qcy5vcmcvd2lraS9Qcm9taXNlcykgZGVzY3JpYmVzIGEgcHJvbWlzZSBhcyBhbg0KLSAqIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYW4gYWN0aW9uIHRoYXQgaXMNCi0gKiBwZXJmb3JtZWQgYXN5bmNocm9ub3VzbHksIGFuZCBtYXkgb3IgbWF5IG5vdCBiZSBmaW5pc2hlZCBhdCBhbnkgZ2l2ZW4gcG9pbnQgaW4gdGltZS4NCi0gKg0KLSAqIEZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGRlYWxpbmcgd2l0aCBlcnJvciBoYW5kbGluZywgZGVmZXJyZWQgYW5kIHByb21pc2UgQVBJcyBhcmUgdG8NCi0gKiBhc3luY2hyb25vdXMgcHJvZ3JhbW1pbmcgd2hhdCBgdHJ5YCwgYGNhdGNoYCBhbmQgYHRocm93YCBrZXl3b3JkcyBhcmUgdG8gc3luY2hyb25vdXMgcHJvZ3JhbW1pbmcuDQotICoNCi0gKiBgYGBqcw0KLSAqICAgLy8gZm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgZXhhbXBsZSBsZXQncyBhc3N1bWUgdGhhdCB2YXJpYWJsZXMgYCRxYCBhbmQgYG9rVG9HcmVldGANCi0gKiAgIC8vIGFyZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgbGV4aWNhbCBzY29wZSAodGhleSBjb3VsZCBoYXZlIGJlZW4gaW5qZWN0ZWQgb3IgcGFzc2VkIGluKS4NCi0gKg0KLSAqICAgZnVuY3Rpb24gYXN5bmNHcmVldChuYW1lKSB7DQotICogICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7DQotICoNCi0gKiAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCi0gKiAgICAgICBkZWZlcnJlZC5ub3RpZnkoJ0Fib3V0IHRvIGdyZWV0ICcgKyBuYW1lICsgJy4nKTsNCi0gKg0KLSAqICAgICAgIGlmIChva1RvR3JlZXQobmFtZSkpIHsNCi0gKiAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoJ0hlbGxvLCAnICsgbmFtZSArICchJyk7DQotICogICAgICAgfSBlbHNlIHsNCi0gKiAgICAgICAgIGRlZmVycmVkLnJlamVjdCgnR3JlZXRpbmcgJyArIG5hbWUgKyAnIGlzIG5vdCBhbGxvd2VkLicpOw0KLSAqICAgICAgIH0NCi0gKiAgICAgfSwgMTAwMCk7DQotICoNCi0gKiAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7DQotICogICB9DQotICoNCi0gKiAgIHZhciBwcm9taXNlID0gYXN5bmNHcmVldCgnUm9iaW4gSG9vZCcpOw0KLSAqICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGdyZWV0aW5nKSB7DQotICogICAgIGFsZXJ0KCdTdWNjZXNzOiAnICsgZ3JlZXRpbmcpOw0KLSAqICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7DQotICogICAgIGFsZXJ0KCdGYWlsZWQ6ICcgKyByZWFzb24pOw0KLSAqICAgfSwgZnVuY3Rpb24odXBkYXRlKSB7DQotICogICAgIGFsZXJ0KCdHb3Qgbm90aWZpY2F0aW9uOiAnICsgdXBkYXRlKTsNCi0gKiAgIH0pOw0KLSAqIGBgYA0KLSAqDQotICogQXQgZmlyc3QgaXQgbWlnaHQgbm90IGJlIG9idmlvdXMgd2h5IHRoaXMgZXh0cmEgY29tcGxleGl0eSBpcyB3b3J0aCB0aGUgdHJvdWJsZS4gVGhlIHBheW9mZg0KLSAqIGNvbWVzIGluIHRoZSB3YXkgb2YgZ3VhcmFudGVlcyB0aGF0IHByb21pc2UgYW5kIGRlZmVycmVkIEFQSXMgbWFrZSwgc2VlDQotICogaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC91bmNvbW1vbmpzL2Jsb2IvbWFzdGVyL3Byb21pc2VzL3NwZWNpZmljYXRpb24ubWQuDQotICoNCi0gKiBBZGRpdGlvbmFsbHkgdGhlIHByb21pc2UgYXBpIGFsbG93cyBmb3IgY29tcG9zaXRpb24gdGhhdCBpcyB2ZXJ5IGhhcmQgdG8gZG8gd2l0aCB0aGUNCi0gKiB0cmFkaXRpb25hbCBjYWxsYmFjayAoW0NQU10oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db250aW51YXRpb24tcGFzc2luZ19zdHlsZSkpIGFwcHJvYWNoLg0KLSAqIEZvciBtb3JlIG9uIHRoaXMgcGxlYXNlIHNlZSB0aGUgW1EgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xKSBlc3BlY2lhbGx5IHRoZQ0KLSAqIHNlY3Rpb24gb24gc2VyaWFsIG9yIHBhcmFsbGVsIGpvaW5pbmcgb2YgcHJvbWlzZXMuDQotICoNCi0gKiAjIFRoZSBEZWZlcnJlZCBBUEkNCi0gKg0KLSAqIEEgbmV3IGluc3RhbmNlIG9mIGRlZmVycmVkIGlzIGNvbnN0cnVjdGVkIGJ5IGNhbGxpbmcgYCRxLmRlZmVyKClgLg0KLSAqDQotICogVGhlIHB1cnBvc2Ugb2YgdGhlIGRlZmVycmVkIG9iamVjdCBpcyB0byBleHBvc2UgdGhlIGFzc29jaWF0ZWQgUHJvbWlzZSBpbnN0YW5jZSBhcyB3ZWxsIGFzIEFQSXMNCi0gKiB0aGF0IGNhbiBiZSB1c2VkIGZvciBzaWduYWxpbmcgdGhlIHN1Y2Nlc3NmdWwgb3IgdW5zdWNjZXNzZnVsIGNvbXBsZXRpb24sIGFzIHdlbGwgYXMgdGhlIHN0YXR1cw0KLSAqIG9mIHRoZSB0YXNrLg0KLSAqDQotICogKipNZXRob2RzKioNCi0gKg0KLSAqIC0gYHJlc29sdmUodmFsdWUpYCDigD8gcmVzb2x2ZXMgdGhlIGRlcml2ZWQgcHJvbWlzZSB3aXRoIHRoZSBgdmFsdWVgLiBJZiB0aGUgdmFsdWUgaXMgYSByZWplY3Rpb24NCi0gKiAgIGNvbnN0cnVjdGVkIHZpYSBgJHEucmVqZWN0YCwgdGhlIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZCBpbnN0ZWFkLg0KLSAqIC0gYHJlamVjdChyZWFzb24pYCDigD8gcmVqZWN0cyB0aGUgZGVyaXZlZCBwcm9taXNlIHdpdGggdGhlIGByZWFzb25gLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8NCi0gKiAgIHJlc29sdmluZyBpdCB3aXRoIGEgcmVqZWN0aW9uIGNvbnN0cnVjdGVkIHZpYSBgJHEucmVqZWN0YC4NCi0gKiAtIGBub3RpZnkodmFsdWUpYCAtIHByb3ZpZGVzIHVwZGF0ZXMgb24gdGhlIHN0YXR1cyBvZiB0aGUgcHJvbWlzZSdzIGV4ZWN1dGlvbi4gVGhpcyBtYXkgYmUgY2FsbGVkDQotICogICBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgdGhlIHByb21pc2UgaXMgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkLg0KLSAqDQotICogKipQcm9wZXJ0aWVzKioNCi0gKg0KLSAqIC0gcHJvbWlzZSDigD8gYHtQcm9taXNlfWAg4oA/IHByb21pc2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRlZmVycmVkLg0KLSAqDQotICoNCi0gKiAjIFRoZSBQcm9taXNlIEFQSQ0KLSAqDQotICogQSBuZXcgcHJvbWlzZSBpbnN0YW5jZSBpcyBjcmVhdGVkIHdoZW4gYSBkZWZlcnJlZCBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5DQotICogY2FsbGluZyBgZGVmZXJyZWQucHJvbWlzZWAuDQotICoNCi0gKiBUaGUgcHVycG9zZSBvZiB0aGUgcHJvbWlzZSBvYmplY3QgaXMgdG8gYWxsb3cgZm9yIGludGVyZXN0ZWQgcGFydGllcyB0byBnZXQgYWNjZXNzIHRvIHRoZSByZXN1bHQNCi0gKiBvZiB0aGUgZGVmZXJyZWQgdGFzayB3aGVuIGl0IGNvbXBsZXRlcy4NCi0gKg0KLSAqICoqTWV0aG9kcyoqDQotICoNCi0gKiAtIGB0aGVuKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaywgbm90aWZ5Q2FsbGJhY2spYCDigD8gcmVnYXJkbGVzcyBvZiB3aGVuIHRoZSBwcm9taXNlIHdhcyBvcg0KLSAqICAgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCwgYHRoZW5gIGNhbGxzIG9uZSBvZiB0aGUgc3VjY2VzcyBvciBlcnJvciBjYWxsYmFja3MgYXN5bmNocm9ub3VzbHkNCi0gKiAgIGFzIHNvb24gYXMgdGhlIHJlc3VsdCBpcyBhdmFpbGFibGUuIFRoZSBjYWxsYmFja3MgYXJlIGNhbGxlZCB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50OiB0aGUgcmVzdWx0DQotICogICBvciByZWplY3Rpb24gcmVhc29uLiBBZGRpdGlvbmFsbHksIHRoZSBub3RpZnkgY2FsbGJhY2sgbWF5IGJlIGNhbGxlZCB6ZXJvIG9yIG1vcmUgdGltZXMgdG8NCi0gKiAgIHByb3ZpZGUgYSBwcm9ncmVzcyBpbmRpY2F0aW9uLCBiZWZvcmUgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuDQotICoNCi0gKiAgIFRoaXMgbWV0aG9kICpyZXR1cm5zIGEgbmV3IHByb21pc2UqIHdoaWNoIGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZQ0KLSAqICAgYHN1Y2Nlc3NDYWxsYmFja2AsIGBlcnJvckNhbGxiYWNrYC4gSXQgYWxzbyBub3RpZmllcyB2aWEgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUNCi0gKiAgIGBub3RpZnlDYWxsYmFja2AgbWV0aG9kLiBUaGUgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgZnJvbSB0aGUgbm90aWZ5Q2FsbGJhY2sNCi0gKiAgIG1ldGhvZC4NCi0gKg0KLSAqIC0gYGNhdGNoKGVycm9yQ2FsbGJhY2spYCDigD8gc2hvcnRoYW5kIGZvciBgcHJvbWlzZS50aGVuKG51bGwsIGVycm9yQ2FsbGJhY2spYA0KLSAqDQotICogLSBgZmluYWxseShjYWxsYmFjaywgbm90aWZ5Q2FsbGJhY2spYCDigD8gYWxsb3dzIHlvdSB0byBvYnNlcnZlIGVpdGhlciB0aGUgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIG9mIGEgcHJvbWlzZSwNCi0gKiAgIGJ1dCB0byBkbyBzbyB3aXRob3V0IG1vZGlmeWluZyB0aGUgZmluYWwgdmFsdWUuIFRoaXMgaXMgdXNlZnVsIHRvIHJlbGVhc2UgcmVzb3VyY2VzIG9yIGRvIHNvbWUNCi0gKiAgIGNsZWFuLXVwIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB3aGV0aGVyIHRoZSBwcm9taXNlIHdhcyByZWplY3RlZCBvciByZXNvbHZlZC4gU2VlIHRoZSBbZnVsbA0KLSAqICAgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xL3dpa2kvQVBJLVJlZmVyZW5jZSNwcm9taXNlZmluYWxseWNhbGxiYWNrKSBmb3INCi0gKiAgIG1vcmUgaW5mb3JtYXRpb24uDQotICoNCi0gKiAjIENoYWluaW5nIHByb21pc2VzDQotICoNCi0gKiBCZWNhdXNlIGNhbGxpbmcgdGhlIGB0aGVuYCBtZXRob2Qgb2YgYSBwcm9taXNlIHJldHVybnMgYSBuZXcgZGVyaXZlZCBwcm9taXNlLCBpdCBpcyBlYXNpbHkNCi0gKiBwb3NzaWJsZSB0byBjcmVhdGUgYSBjaGFpbiBvZiBwcm9taXNlczoNCi0gKg0KLSAqIGBgYGpzDQotICogICBwcm9taXNlQiA9IHByb21pc2VBLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7DQotICogICAgIHJldHVybiByZXN1bHQgKyAxOw0KLSAqICAgfSk7DQotICoNCi0gKiAgIC8vIHByb21pc2VCIHdpbGwgYmUgcmVzb2x2ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcHJvbWlzZUEgaXMgcmVzb2x2ZWQgYW5kIGl0cyB2YWx1ZQ0KLSAqICAgLy8gd2lsbCBiZSB0aGUgcmVzdWx0IG9mIHByb21pc2VBIGluY3JlbWVudGVkIGJ5IDENCi0gKiBgYGANCi0gKg0KLSAqIEl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBjaGFpbnMgb2YgYW55IGxlbmd0aCBhbmQgc2luY2UgYSBwcm9taXNlIGNhbiBiZSByZXNvbHZlZCB3aXRoIGFub3RoZXINCi0gKiBwcm9taXNlICh3aGljaCB3aWxsIGRlZmVyIGl0cyByZXNvbHV0aW9uIGZ1cnRoZXIpLCBpdCBpcyBwb3NzaWJsZSB0byBwYXVzZS9kZWZlciByZXNvbHV0aW9uIG9mDQotICogdGhlIHByb21pc2VzIGF0IGFueSBwb2ludCBpbiB0aGUgY2hhaW4uIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gaW1wbGVtZW50IHBvd2VyZnVsIEFQSXMgbGlrZQ0KLSAqICRodHRwJ3MgcmVzcG9uc2UgaW50ZXJjZXB0b3JzLg0KLSAqDQotICoNCi0gKiAjIERpZmZlcmVuY2VzIGJldHdlZW4gS3JpcyBLb3dhbCdzIFEgYW5kICRxDQotICoNCi0gKiAgVGhlcmUgYXJlIHR3byBtYWluIGRpZmZlcmVuY2VzOg0KLSAqDQotICogLSAkcSBpcyBpbnRlZ3JhdGVkIHdpdGggdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlfSBTY29wZSBtb2RlbCBvYnNlcnZhdGlvbg0KLSAqICAgbWVjaGFuaXNtIGluIGFuZ3VsYXIsIHdoaWNoIG1lYW5zIGZhc3RlciBwcm9wYWdhdGlvbiBvZiByZXNvbHV0aW9uIG9yIHJlamVjdGlvbiBpbnRvIHlvdXINCi0gKiAgIG1vZGVscyBhbmQgYXZvaWRpbmcgdW5uZWNlc3NhcnkgYnJvd3NlciByZXBhaW50cywgd2hpY2ggd291bGQgcmVzdWx0IGluIGZsaWNrZXJpbmcgVUkuDQotICogLSBRIGhhcyBtYW55IG1vcmUgZmVhdHVyZXMgdGhhbiAkcSwgYnV0IHRoYXQgY29tZXMgYXQgYSBjb3N0IG9mIGJ5dGVzLiAkcSBpcyB0aW55LCBidXQgY29udGFpbnMNCi0gKiAgIGFsbCB0aGUgaW1wb3J0YW50IGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGZvciBjb21tb24gYXN5bmMgdGFza3MuDQotICoNCi0gKiAgIyBUZXN0aW5nDQotICoNCi0gKiAgYGBganMNCi0gKiAgICBpdCgnc2hvdWxkIHNpbXVsYXRlIHByb21pc2UnLCBpbmplY3QoZnVuY3Rpb24oJHEsICRyb290U2NvcGUpIHsNCi0gKiAgICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7DQotICogICAgICB2YXIgcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2U7DQotICogICAgICB2YXIgcmVzb2x2ZWRWYWx1ZTsNCi0gKg0KLSAqICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7IHJlc29sdmVkVmFsdWUgPSB2YWx1ZTsgfSk7DQotICogICAgICBleHBlY3QocmVzb2x2ZWRWYWx1ZSkudG9CZVVuZGVmaW5lZCgpOw0KLSAqDQotICogICAgICAvLyBTaW11bGF0ZSByZXNvbHZpbmcgb2YgcHJvbWlzZQ0KLSAqICAgICAgZGVmZXJyZWQucmVzb2x2ZSgxMjMpOw0KLSAqICAgICAgLy8gTm90ZSB0aGF0IHRoZSAndGhlbicgZnVuY3Rpb24gZG9lcyBub3QgZ2V0IGNhbGxlZCBzeW5jaHJvbm91c2x5Lg0KLSAqICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHdlIHdhbnQgdGhlIHByb21pc2UgQVBJIHRvIGFsd2F5cyBiZSBhc3luYywgd2hldGhlciBvciBub3QNCi0gKiAgICAgIC8vIGl0IGdvdCBjYWxsZWQgc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseS4NCi0gKiAgICAgIGV4cGVjdChyZXNvbHZlZFZhbHVlKS50b0JlVW5kZWZpbmVkKCk7DQotICoNCi0gKiAgICAgIC8vIFByb3BhZ2F0ZSBwcm9taXNlIHJlc29sdXRpb24gdG8gJ3RoZW4nIGZ1bmN0aW9ucyB1c2luZyAkYXBwbHkoKS4NCi0gKiAgICAgICRyb290U2NvcGUuJGFwcGx5KCk7DQotICogICAgICBleHBlY3QocmVzb2x2ZWRWYWx1ZSkudG9FcXVhbCgxMjMpOw0KLSAqICAgIH0pKTsNCi0gKiAgYGBgDQotICoNCi0gKiBAcGFyYW0ge2Z1bmN0aW9uKGZ1bmN0aW9uLCBmdW5jdGlvbil9IHJlc29sdmVyIEZ1bmN0aW9uIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciByZXNvbHZpbmcgb3INCi0gKiAgIHJlamVjdGluZyB0aGUgbmV3bHkgY3JlYXRlZCBwcm9taXNlLiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIGEgZnVuY3Rpb24gd2hpY2ggcmVzb2x2ZXMgdGhlDQotICogICBwcm9taXNlLCB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIGZ1bmN0aW9uIHdoaWNoIHJlamVjdHMgdGhlIHByb21pc2UuDQotICoNCi0gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIG5ld2x5IGNyZWF0ZWQgcHJvbWlzZS4NCi0gKi8NCi1mdW5jdGlvbiAkUVByb3ZpZGVyKCkgew0KLQ0KLSAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywgJyRleGNlcHRpb25IYW5kbGVyJywgZnVuY3Rpb24oJHJvb3RTY29wZSwgJGV4Y2VwdGlvbkhhbmRsZXIpIHsNCi0gICAgcmV0dXJuIHFGYWN0b3J5KGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQotICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGNhbGxiYWNrKTsNCi0gICAgfSwgJGV4Y2VwdGlvbkhhbmRsZXIpOw0KLSAgfV07DQotfQ0KLQ0KLWZ1bmN0aW9uICQkUVByb3ZpZGVyKCkgew0KLSAgdGhpcy4kZ2V0ID0gWyckYnJvd3NlcicsICckZXhjZXB0aW9uSGFuZGxlcicsIGZ1bmN0aW9uKCRicm93c2VyLCAkZXhjZXB0aW9uSGFuZGxlcikgew0KLSAgICByZXR1cm4gcUZhY3RvcnkoZnVuY3Rpb24oY2FsbGJhY2spIHsNCi0gICAgICAkYnJvd3Nlci5kZWZlcihjYWxsYmFjayk7DQotICAgIH0sICRleGNlcHRpb25IYW5kbGVyKTsNCi0gIH1dOw0KLX0NCi0NCi0vKioNCi0gKiBDb25zdHJ1Y3RzIGEgcHJvbWlzZSBtYW5hZ2VyLg0KLSAqDQotICogQHBhcmFtIHtmdW5jdGlvbihmdW5jdGlvbil9IG5leHRUaWNrIEZ1bmN0aW9uIGZvciBleGVjdXRpbmcgZnVuY3Rpb25zIGluIHRoZSBuZXh0IHR1cm4uDQotICogQHBhcmFtIHtmdW5jdGlvbiguLi4qKX0gZXhjZXB0aW9uSGFuZGxlciBGdW5jdGlvbiBpbnRvIHdoaWNoIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBhcmUgcGFzc2VkIGZvcg0KLSAqICAgICBkZWJ1Z2dpbmcgcHVycG9zZXMuDQotICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSBtYW5hZ2VyLg0KLSAqLw0KLWZ1bmN0aW9uIHFGYWN0b3J5KG5leHRUaWNrLCBleGNlcHRpb25IYW5kbGVyKSB7DQotICB2YXIgJHFNaW5FcnIgPSBtaW5FcnIoJyRxJywgVHlwZUVycm9yKTsNCi0gIGZ1bmN0aW9uIGNhbGxPbmNlKHNlbGYsIHJlc29sdmVGbiwgcmVqZWN0Rm4pIHsNCi0gICAgdmFyIGNhbGxlZCA9IGZhbHNlOw0KLSAgICBmdW5jdGlvbiB3cmFwKGZuKSB7DQotICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgICBpZiAoY2FsbGVkKSByZXR1cm47DQotICAgICAgICBjYWxsZWQgPSB0cnVlOw0KLSAgICAgICAgZm4uY2FsbChzZWxmLCB2YWx1ZSk7DQotICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gW3dyYXAocmVzb2x2ZUZuKSwgd3JhcChyZWplY3RGbildOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSBuZy4kcSNkZWZlcg0KLSAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIENyZWF0ZXMgYSBgRGVmZXJyZWRgIG9iamVjdCB3aGljaCByZXByZXNlbnRzIGEgdGFzayB3aGljaCB3aWxsIGZpbmlzaCBpbiB0aGUgZnV0dXJlLg0KLSAgICoNCi0gICAqIEByZXR1cm5zIHtEZWZlcnJlZH0gUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBkZWZlcnJlZC4NCi0gICAqLw0KLSAgdmFyIGRlZmVyID0gZnVuY3Rpb24oKSB7DQotICAgIHJldHVybiBuZXcgRGVmZXJyZWQoKTsNCi0gIH07DQotDQotICBmdW5jdGlvbiBQcm9taXNlKCkgew0KLSAgICB0aGlzLiQkc3RhdGUgPSB7IHN0YXR1czogMCB9Ow0KLSAgfQ0KLQ0KLSAgUHJvbWlzZS5wcm90b3R5cGUgPSB7DQotICAgIHRoZW46IGZ1bmN0aW9uKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBwcm9ncmVzc0JhY2spIHsNCi0gICAgICB2YXIgcmVzdWx0ID0gbmV3IERlZmVycmVkKCk7DQotDQotICAgICAgdGhpcy4kJHN0YXRlLnBlbmRpbmcgPSB0aGlzLiQkc3RhdGUucGVuZGluZyB8fCBbXTsNCi0gICAgICB0aGlzLiQkc3RhdGUucGVuZGluZy5wdXNoKFtyZXN1bHQsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBwcm9ncmVzc0JhY2tdKTsNCi0gICAgICBpZiAodGhpcy4kJHN0YXRlLnN0YXR1cyA+IDApIHNjaGVkdWxlUHJvY2Vzc1F1ZXVlKHRoaXMuJCRzdGF0ZSk7DQotDQotICAgICAgcmV0dXJuIHJlc3VsdC5wcm9taXNlOw0KLSAgICB9LA0KLQ0KLSAgICAiY2F0Y2giOiBmdW5jdGlvbihjYWxsYmFjaykgew0KLSAgICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgY2FsbGJhY2spOw0KLSAgICB9LA0KLQ0KLSAgICAiZmluYWxseSI6IGZ1bmN0aW9uKGNhbGxiYWNrLCBwcm9ncmVzc0JhY2spIHsNCi0gICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgICByZXR1cm4gaGFuZGxlQ2FsbGJhY2sodmFsdWUsIHRydWUsIGNhbGxiYWNrKTsNCi0gICAgICB9LCBmdW5jdGlvbihlcnJvcikgew0KLSAgICAgICAgcmV0dXJuIGhhbmRsZUNhbGxiYWNrKGVycm9yLCBmYWxzZSwgY2FsbGJhY2spOw0KLSAgICAgIH0sIHByb2dyZXNzQmFjayk7DQotICAgIH0NCi0gIH07DQotDQotICAvL0Zhc3RlciwgbW9yZSBiYXNpYyB0aGFuIGFuZ3VsYXIuYmluZCBodHRwOi8vanNwZXJmLmNvbS9hbmd1bGFyLWJpbmQtdnMtY3VzdG9tLXZzLW5hdGl2ZQ0KLSAgZnVuY3Rpb24gc2ltcGxlQmluZChjb250ZXh0LCBmbikgew0KLSAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICBmbi5jYWxsKGNvbnRleHQsIHZhbHVlKTsNCi0gICAgfTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHByb2Nlc3NRdWV1ZShzdGF0ZSkgew0KLSAgICB2YXIgZm4sIHByb21pc2UsIHBlbmRpbmc7DQotDQotICAgIHBlbmRpbmcgPSBzdGF0ZS5wZW5kaW5nOw0KLSAgICBzdGF0ZS5wcm9jZXNzU2NoZWR1bGVkID0gZmFsc2U7DQotICAgIHN0YXRlLnBlbmRpbmcgPSB1bmRlZmluZWQ7DQotICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBlbmRpbmcubGVuZ3RoOyBpIDwgaWk7ICsraSkgew0KLSAgICAgIHByb21pc2UgPSBwZW5kaW5nW2ldWzBdOw0KLSAgICAgIGZuID0gcGVuZGluZ1tpXVtzdGF0ZS5zdGF0dXNdOw0KLSAgICAgIHRyeSB7DQotICAgICAgICBpZiAoaXNGdW5jdGlvbihmbikpIHsNCi0gICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKGZuKHN0YXRlLnZhbHVlKSk7DQotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnN0YXR1cyA9PT0gMSkgew0KLSAgICAgICAgICBwcm9taXNlLnJlc29sdmUoc3RhdGUudmFsdWUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgcHJvbWlzZS5yZWplY3Qoc3RhdGUudmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0gY2F0Y2ggKGUpIHsNCi0gICAgICAgIHByb21pc2UucmVqZWN0KGUpOw0KLSAgICAgICAgZXhjZXB0aW9uSGFuZGxlcihlKTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNjaGVkdWxlUHJvY2Vzc1F1ZXVlKHN0YXRlKSB7DQotICAgIGlmIChzdGF0ZS5wcm9jZXNzU2NoZWR1bGVkIHx8ICFzdGF0ZS5wZW5kaW5nKSByZXR1cm47DQotICAgIHN0YXRlLnByb2Nlc3NTY2hlZHVsZWQgPSB0cnVlOw0KLSAgICBuZXh0VGljayhmdW5jdGlvbigpIHsgcHJvY2Vzc1F1ZXVlKHN0YXRlKTsgfSk7DQotICB9DQotDQotICBmdW5jdGlvbiBEZWZlcnJlZCgpIHsNCi0gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKTsNCi0gICAgLy9OZWNlc3NhcnkgdG8gc3VwcG9ydCB1bmJvdW5kIGV4ZWN1dGlvbiA6Lw0KLSAgICB0aGlzLnJlc29sdmUgPSBzaW1wbGVCaW5kKHRoaXMsIHRoaXMucmVzb2x2ZSk7DQotICAgIHRoaXMucmVqZWN0ID0gc2ltcGxlQmluZCh0aGlzLCB0aGlzLnJlamVjdCk7DQotICAgIHRoaXMubm90aWZ5ID0gc2ltcGxlQmluZCh0aGlzLCB0aGlzLm5vdGlmeSk7DQotICB9DQotDQotICBEZWZlcnJlZC5wcm90b3R5cGUgPSB7DQotICAgIHJlc29sdmU6IGZ1bmN0aW9uKHZhbCkgew0KLSAgICAgIGlmICh0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXMpIHJldHVybjsNCi0gICAgICBpZiAodmFsID09PSB0aGlzLnByb21pc2UpIHsNCi0gICAgICAgIHRoaXMuJCRyZWplY3QoJHFNaW5FcnIoDQotICAgICAgICAgICdxY3ljbGUnLA0KLSAgICAgICAgICAiRXhwZWN0ZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCB3aXRoIHZhbHVlIG90aGVyIHRoYW4gaXRzZWxmICd7MH0nIiwNCi0gICAgICAgICAgdmFsKSk7DQotICAgICAgfQ0KLSAgICAgIGVsc2Ugew0KLSAgICAgICAgdGhpcy4kJHJlc29sdmUodmFsKTsNCi0gICAgICB9DQotDQotICAgIH0sDQotDQotICAgICQkcmVzb2x2ZTogZnVuY3Rpb24odmFsKSB7DQotICAgICAgdmFyIHRoZW4sIGZuczsNCi0NCi0gICAgICBmbnMgPSBjYWxsT25jZSh0aGlzLCB0aGlzLiQkcmVzb2x2ZSwgdGhpcy4kJHJlamVjdCk7DQotICAgICAgdHJ5IHsNCi0gICAgICAgIGlmICgoaXNPYmplY3QodmFsKSB8fCBpc0Z1bmN0aW9uKHZhbCkpKSB0aGVuID0gdmFsICYmIHZhbC50aGVuOw0KLSAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhlbikpIHsNCi0gICAgICAgICAgdGhpcy5wcm9taXNlLiQkc3RhdGUuc3RhdHVzID0gLTE7DQotICAgICAgICAgIHRoZW4uY2FsbCh2YWwsIGZuc1swXSwgZm5zWzFdLCB0aGlzLm5vdGlmeSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICB0aGlzLnByb21pc2UuJCRzdGF0ZS52YWx1ZSA9IHZhbDsNCi0gICAgICAgICAgdGhpcy5wcm9taXNlLiQkc3RhdGUuc3RhdHVzID0gMTsNCi0gICAgICAgICAgc2NoZWR1bGVQcm9jZXNzUXVldWUodGhpcy5wcm9taXNlLiQkc3RhdGUpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0gY2F0Y2ggKGUpIHsNCi0gICAgICAgIGZuc1sxXShlKTsNCi0gICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIoZSk7DQotICAgICAgfQ0KLSAgICB9LA0KLQ0KLSAgICByZWplY3Q6IGZ1bmN0aW9uKHJlYXNvbikgew0KLSAgICAgIGlmICh0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXMpIHJldHVybjsNCi0gICAgICB0aGlzLiQkcmVqZWN0KHJlYXNvbik7DQotICAgIH0sDQotDQotICAgICQkcmVqZWN0OiBmdW5jdGlvbihyZWFzb24pIHsNCi0gICAgICB0aGlzLnByb21pc2UuJCRzdGF0ZS52YWx1ZSA9IHJlYXNvbjsNCi0gICAgICB0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXMgPSAyOw0KLSAgICAgIHNjaGVkdWxlUHJvY2Vzc1F1ZXVlKHRoaXMucHJvbWlzZS4kJHN0YXRlKTsNCi0gICAgfSwNCi0NCi0gICAgbm90aWZ5OiBmdW5jdGlvbihwcm9ncmVzcykgew0KLSAgICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLnByb21pc2UuJCRzdGF0ZS5wZW5kaW5nOw0KLQ0KLSAgICAgIGlmICgodGhpcy5wcm9taXNlLiQkc3RhdGUuc3RhdHVzIDw9IDApICYmIGNhbGxiYWNrcyAmJiBjYWxsYmFja3MubGVuZ3RoKSB7DQotICAgICAgICBuZXh0VGljayhmdW5jdGlvbigpIHsNCi0gICAgICAgICAgdmFyIGNhbGxiYWNrLCByZXN1bHQ7DQotICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7DQotICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2tzW2ldWzBdOw0KLSAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2tzW2ldWzNdOw0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICByZXN1bHQubm90aWZ5KGlzRnVuY3Rpb24oY2FsbGJhY2spID8gY2FsbGJhY2socHJvZ3Jlc3MpIDogcHJvZ3Jlc3MpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCi0gICAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIoZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0gICAgICB9DQotICAgIH0NCi0gIH07DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lICRxI3JlamVjdA0KLSAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgYXMgcmVqZWN0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGByZWFzb25gLiBUaGlzIGFwaSBzaG91bGQgYmUNCi0gICAqIHVzZWQgdG8gZm9yd2FyZCByZWplY3Rpb24gaW4gYSBjaGFpbiBvZiBwcm9taXNlcy4gSWYgeW91IGFyZSBkZWFsaW5nIHdpdGggdGhlIGxhc3QgcHJvbWlzZSBpbg0KLSAgICogYSBwcm9taXNlIGNoYWluLCB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBpdC4NCi0gICAqDQotICAgKiBXaGVuIGNvbXBhcmluZyBkZWZlcnJlZHMvcHJvbWlzZXMgdG8gdGhlIGZhbWlsaWFyIGJlaGF2aW9yIG9mIHRyeS9jYXRjaC90aHJvdywgdGhpbmsgb2YNCi0gICAqIGByZWplY3RgIGFzIHRoZSBgdGhyb3dgIGtleXdvcmQgaW4gSmF2YVNjcmlwdC4gVGhpcyBhbHNvIG1lYW5zIHRoYXQgaWYgeW91ICJjYXRjaCIgYW4gZXJyb3IgdmlhDQotICAgKiBhIHByb21pc2UgZXJyb3IgY2FsbGJhY2sgYW5kIHlvdSB3YW50IHRvIGZvcndhcmQgdGhlIGVycm9yIHRvIHRoZSBwcm9taXNlIGRlcml2ZWQgZnJvbSB0aGUNCi0gICAqIGN1cnJlbnQgcHJvbWlzZSwgeW91IGhhdmUgdG8gInJldGhyb3ciIHRoZSBlcnJvciBieSByZXR1cm5pbmcgYSByZWplY3Rpb24gY29uc3RydWN0ZWQgdmlhDQotICAgKiBgcmVqZWN0YC4NCi0gICAqDQotICAgKiBgYGBqcw0KLSAgICogICBwcm9taXNlQiA9IHByb21pc2VBLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7DQotICAgKiAgICAgLy8gc3VjY2VzczogZG8gc29tZXRoaW5nIGFuZCByZXNvbHZlIHByb21pc2VCDQotICAgKiAgICAgLy8gICAgICAgICAgd2l0aCB0aGUgb2xkIG9yIGEgbmV3IHJlc3VsdA0KLSAgICogICAgIHJldHVybiByZXN1bHQ7DQotICAgKiAgIH0sIGZ1bmN0aW9uKHJlYXNvbikgew0KLSAgICogICAgIC8vIGVycm9yOiBoYW5kbGUgdGhlIGVycm9yIGlmIHBvc3NpYmxlIGFuZA0KLSAgICogICAgIC8vICAgICAgICByZXNvbHZlIHByb21pc2VCIHdpdGggbmV3UHJvbWlzZU9yVmFsdWUsDQotICAgKiAgICAgLy8gICAgICAgIG90aGVyd2lzZSBmb3J3YXJkIHRoZSByZWplY3Rpb24gdG8gcHJvbWlzZUINCi0gICAqICAgICBpZiAoY2FuSGFuZGxlKHJlYXNvbikpIHsNCi0gICAqICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcmVjb3Zlcg0KLSAgICogICAgICByZXR1cm4gbmV3UHJvbWlzZU9yVmFsdWU7DQotICAgKiAgICAgfQ0KLSAgICogICAgIHJldHVybiAkcS5yZWplY3QocmVhc29uKTsNCi0gICAqICAgfSk7DQotICAgKiBgYGANCi0gICAqDQotICAgKiBAcGFyYW0geyp9IHJlYXNvbiBDb25zdGFudCwgbWVzc2FnZSwgZXhjZXB0aW9uIG9yIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlamVjdGlvbiByZWFzb24uDQotICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJucyBhIHByb21pc2UgdGhhdCB3YXMgYWxyZWFkeSByZXNvbHZlZCBhcyByZWplY3RlZCB3aXRoIHRoZSBgcmVhc29uYC4NCi0gICAqLw0KLSAgdmFyIHJlamVjdCA9IGZ1bmN0aW9uKHJlYXNvbikgew0KLSAgICB2YXIgcmVzdWx0ID0gbmV3IERlZmVycmVkKCk7DQotICAgIHJlc3VsdC5yZWplY3QocmVhc29uKTsNCi0gICAgcmV0dXJuIHJlc3VsdC5wcm9taXNlOw0KLSAgfTsNCi0NCi0gIHZhciBtYWtlUHJvbWlzZSA9IGZ1bmN0aW9uIG1ha2VQcm9taXNlKHZhbHVlLCByZXNvbHZlZCkgew0KLSAgICB2YXIgcmVzdWx0ID0gbmV3IERlZmVycmVkKCk7DQotICAgIGlmIChyZXNvbHZlZCkgew0KLSAgICAgIHJlc3VsdC5yZXNvbHZlKHZhbHVlKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICByZXN1bHQucmVqZWN0KHZhbHVlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcmVzdWx0LnByb21pc2U7DQotICB9Ow0KLQ0KLSAgdmFyIGhhbmRsZUNhbGxiYWNrID0gZnVuY3Rpb24gaGFuZGxlQ2FsbGJhY2sodmFsdWUsIGlzUmVzb2x2ZWQsIGNhbGxiYWNrKSB7DQotICAgIHZhciBjYWxsYmFja091dHB1dCA9IG51bGw7DQotICAgIHRyeSB7DQotICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSBjYWxsYmFja091dHB1dCA9IGNhbGxiYWNrKCk7DQotICAgIH0gY2F0Y2ggKGUpIHsNCi0gICAgICByZXR1cm4gbWFrZVByb21pc2UoZSwgZmFsc2UpOw0KLSAgICB9DQotICAgIGlmIChpc1Byb21pc2VMaWtlKGNhbGxiYWNrT3V0cHV0KSkgew0KLSAgICAgIHJldHVybiBjYWxsYmFja091dHB1dC50aGVuKGZ1bmN0aW9uKCkgew0KLSAgICAgICAgcmV0dXJuIG1ha2VQcm9taXNlKHZhbHVlLCBpc1Jlc29sdmVkKTsNCi0gICAgICB9LCBmdW5jdGlvbihlcnJvcikgew0KLSAgICAgICAgcmV0dXJuIG1ha2VQcm9taXNlKGVycm9yLCBmYWxzZSk7DQotICAgICAgfSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgcmV0dXJuIG1ha2VQcm9taXNlKHZhbHVlLCBpc1Jlc29sdmVkKTsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJHEjd2hlbg0KLSAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFdyYXBzIGFuIG9iamVjdCB0aGF0IG1pZ2h0IGJlIGEgdmFsdWUgb3IgYSAoM3JkIHBhcnR5KSB0aGVuLWFibGUgcHJvbWlzZSBpbnRvIGEgJHEgcHJvbWlzZS4NCi0gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IGFyZSBkZWFsaW5nIHdpdGggYW4gb2JqZWN0IHRoYXQgbWlnaHQgb3IgbWlnaHQgbm90IGJlIGEgcHJvbWlzZSwgb3IgaWYNCi0gICAqIHRoZSBwcm9taXNlIGNvbWVzIGZyb20gYSBzb3VyY2UgdGhhdCBjYW4ndCBiZSB0cnVzdGVkLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb3IgYSBwcm9taXNlDQotICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJucyBhIHByb21pc2Ugb2YgdGhlIHBhc3NlZCB2YWx1ZSBvciBwcm9taXNlDQotICAgKi8NCi0NCi0NCi0gIHZhciB3aGVuID0gZnVuY3Rpb24odmFsdWUsIGNhbGxiYWNrLCBlcnJiYWNrLCBwcm9ncmVzc0JhY2spIHsNCi0gICAgdmFyIHJlc3VsdCA9IG5ldyBEZWZlcnJlZCgpOw0KLSAgICByZXN1bHQucmVzb2x2ZSh2YWx1ZSk7DQotICAgIHJldHVybiByZXN1bHQucHJvbWlzZS50aGVuKGNhbGxiYWNrLCBlcnJiYWNrLCBwcm9ncmVzc0JhY2spOw0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJHEjYWxsDQotICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogQ29tYmluZXMgbXVsdGlwbGUgcHJvbWlzZXMgaW50byBhIHNpbmdsZSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBhbGwgb2YgdGhlIGlucHV0DQotICAgKiBwcm9taXNlcyBhcmUgcmVzb2x2ZWQuDQotICAgKg0KLSAgICogQHBhcmFtIHtBcnJheS48UHJvbWlzZT58T2JqZWN0LjxQcm9taXNlPn0gcHJvbWlzZXMgQW4gYXJyYXkgb3IgaGFzaCBvZiBwcm9taXNlcy4NCi0gICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIGEgc2luZ2xlIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggYW4gYXJyYXkvaGFzaCBvZiB2YWx1ZXMsDQotICAgKiAgIGVhY2ggdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvbWlzZSBhdCB0aGUgc2FtZSBpbmRleC9rZXkgaW4gdGhlIGBwcm9taXNlc2AgYXJyYXkvaGFzaC4NCi0gICAqICAgSWYgYW55IG9mIHRoZSBwcm9taXNlcyBpcyByZXNvbHZlZCB3aXRoIGEgcmVqZWN0aW9uLCB0aGlzIHJlc3VsdGluZyBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQNCi0gICAqICAgd2l0aCB0aGUgc2FtZSByZWplY3Rpb24gdmFsdWUuDQotICAgKi8NCi0NCi0gIGZ1bmN0aW9uIGFsbChwcm9taXNlcykgew0KLSAgICB2YXIgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKSwNCi0gICAgICAgIGNvdW50ZXIgPSAwLA0KLSAgICAgICAgcmVzdWx0cyA9IGlzQXJyYXkocHJvbWlzZXMpID8gW10gOiB7fTsNCi0NCi0gICAgZm9yRWFjaChwcm9taXNlcywgZnVuY3Rpb24ocHJvbWlzZSwga2V5KSB7DQotICAgICAgY291bnRlcisrOw0KLSAgICAgIHdoZW4ocHJvbWlzZSkudGhlbihmdW5jdGlvbih2YWx1ZSkgew0KLSAgICAgICAgaWYgKHJlc3VsdHMuaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuOw0KLSAgICAgICAgcmVzdWx0c1trZXldID0gdmFsdWU7DQotICAgICAgICBpZiAoISgtLWNvdW50ZXIpKSBkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdHMpOw0KLSAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikgew0KLSAgICAgICAgaWYgKHJlc3VsdHMuaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuOw0KLSAgICAgICAgZGVmZXJyZWQucmVqZWN0KHJlYXNvbik7DQotICAgICAgfSk7DQotICAgIH0pOw0KLQ0KLSAgICBpZiAoY291bnRlciA9PT0gMCkgew0KLSAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzdWx0cyk7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7DQotICB9DQotDQotICB2YXIgJFEgPSBmdW5jdGlvbiBRKHJlc29sdmVyKSB7DQotICAgIGlmICghaXNGdW5jdGlvbihyZXNvbHZlcikpIHsNCi0gICAgICB0aHJvdyAkcU1pbkVycignbm9yc2x2cicsICJFeHBlY3RlZCByZXNvbHZlckZuLCBnb3QgJ3swfSciLCByZXNvbHZlcik7DQotICAgIH0NCi0NCi0gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFEpKSB7DQotICAgICAgLy8gTW9yZSB1c2VmdWwgd2hlbiAkUSBpcyB0aGUgUHJvbWlzZSBpdHNlbGYuDQotICAgICAgcmV0dXJuIG5ldyBRKHJlc29sdmVyKTsNCi0gICAgfQ0KLQ0KLSAgICB2YXIgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTsNCi0NCi0gICAgZnVuY3Rpb24gcmVzb2x2ZUZuKHZhbHVlKSB7DQotICAgICAgZGVmZXJyZWQucmVzb2x2ZSh2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gcmVqZWN0Rm4ocmVhc29uKSB7DQotICAgICAgZGVmZXJyZWQucmVqZWN0KHJlYXNvbik7DQotICAgIH0NCi0NCi0gICAgcmVzb2x2ZXIocmVzb2x2ZUZuLCByZWplY3RGbik7DQotDQotICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOw0KLSAgfTsNCi0NCi0gICRRLmRlZmVyID0gZGVmZXI7DQotICAkUS5yZWplY3QgPSByZWplY3Q7DQotICAkUS53aGVuID0gd2hlbjsNCi0gICRRLmFsbCA9IGFsbDsNCi0NCi0gIHJldHVybiAkUTsNCi19DQotDQotZnVuY3Rpb24gJCRSQUZQcm92aWRlcigpIHsgLy9yQUYNCi0gIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsICckdGltZW91dCcsIGZ1bmN0aW9uKCR3aW5kb3csICR0aW1lb3V0KSB7DQotICAgIHZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSAkd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7DQotDQotICAgIHZhciBjYW5jZWxBbmltYXRpb25GcmFtZSA9ICR3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2luZG93LndlYmtpdENhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZTsNCi0NCi0gICAgdmFyIHJhZlN1cHBvcnRlZCA9ICEhcmVxdWVzdEFuaW1hdGlvbkZyYW1lOw0KLSAgICB2YXIgcmFmID0gcmFmU3VwcG9ydGVkDQotICAgICAgPyBmdW5jdGlvbihmbikgew0KLSAgICAgICAgICB2YXIgaWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOw0KLSAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOw0KLSAgICAgICAgICB9Ow0KLSAgICAgICAgfQ0KLSAgICAgIDogZnVuY3Rpb24oZm4pIHsNCi0gICAgICAgICAgdmFyIHRpbWVyID0gJHRpbWVvdXQoZm4sIDE2LjY2LCBmYWxzZSk7IC8vIDEwMDAgLyA2MCA9IDE2LjY2Ng0KLSAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKHRpbWVyKTsNCi0gICAgICAgICAgfTsNCi0gICAgICAgIH07DQotDQotICAgIHJhZi5zdXBwb3J0ZWQgPSByYWZTdXBwb3J0ZWQ7DQotDQotICAgIHJldHVybiByYWY7DQotICB9XTsNCi19DQotDQotLyoqDQotICogREVTSUdOIE5PVEVTDQotICoNCi0gKiBUaGUgZGVzaWduIGRlY2lzaW9ucyBiZWhpbmQgdGhlIHNjb3BlIGFyZSBoZWF2aWx5IGZhdm9yZWQgZm9yIHNwZWVkIGFuZCBtZW1vcnkgY29uc3VtcHRpb24uDQotICoNCi0gKiBUaGUgdHlwaWNhbCB1c2Ugb2Ygc2NvcGUgaXMgdG8gd2F0Y2ggdGhlIGV4cHJlc3Npb25zLCB3aGljaCBtb3N0IG9mIHRoZSB0aW1lIHJldHVybiB0aGUgc2FtZQ0KLSAqIHZhbHVlIGFzIGxhc3QgdGltZSBzbyB3ZSBvcHRpbWl6ZSB0aGUgb3BlcmF0aW9uLg0KLSAqDQotICogQ2xvc3VyZXMgY29uc3RydWN0aW9uIGlzIGV4cGVuc2l2ZSBpbiB0ZXJtcyBvZiBzcGVlZCBhcyB3ZWxsIGFzIG1lbW9yeToNCi0gKiAgIC0gTm8gY2xvc3VyZXMsIGluc3RlYWQgdXNlIHByb3RvdHlwaWNhbCBpbmhlcml0YW5jZSBmb3IgQVBJDQotICogICAtIEludGVybmFsIHN0YXRlIG5lZWRzIHRvIGJlIHN0b3JlZCBvbiBzY29wZSBkaXJlY3RseSwgd2hpY2ggbWVhbnMgdGhhdCBwcml2YXRlIHN0YXRlIGlzDQotICogICAgIGV4cG9zZWQgYXMgJCRfX19fIHByb3BlcnRpZXMNCi0gKg0KLSAqIExvb3Agb3BlcmF0aW9ucyBhcmUgb3B0aW1pemVkIGJ5IHVzaW5nIHdoaWxlKGNvdW50LS0pIHsgLi4uIH0NCi0gKiAgIC0gdGhpcyBtZWFucyB0aGF0IGluIG9yZGVyIHRvIGtlZXAgdGhlIHNhbWUgb3JkZXIgb2YgZXhlY3V0aW9uIGFzIGFkZGl0aW9uIHdlIGhhdmUgdG8gYWRkDQotICogICAgIGl0ZW1zIHRvIHRoZSBhcnJheSBhdCB0aGUgYmVnaW5uaW5nICh1bnNoaWZ0KSBpbnN0ZWFkIG9mIGF0IHRoZSBlbmQgKHB1c2gpDQotICoNCi0gKiBDaGlsZCBzY29wZXMgYXJlIGNyZWF0ZWQgYW5kIHJlbW92ZWQgb2Z0ZW4NCi0gKiAgIC0gVXNpbmcgYW4gYXJyYXkgd291bGQgYmUgc2xvdyBzaW5jZSBpbnNlcnRzIGluIG1pZGRsZSBhcmUgZXhwZW5zaXZlIHNvIHdlIHVzZSBsaW5rZWQgbGlzdA0KLSAqDQotICogVGhlcmUgYXJlIGZldyB3YXRjaGVzIHRoZW4gYSBsb3Qgb2Ygb2JzZXJ2ZXJzLiBUaGlzIGlzIHdoeSB5b3UgZG9uJ3Qgd2FudCB0aGUgb2JzZXJ2ZXIgdG8gYmUNCi0gKiBpbXBsZW1lbnRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2F0Y2guIFdhdGNoIHJlcXVpcmVzIHJldHVybiBvZiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB3aGljaA0KLSAqIGFyZSBleHBlbnNpdmUgdG8gY29uc3RydWN0Lg0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBwcm92aWRlcg0KLSAqIEBuYW1lICRyb290U2NvcGVQcm92aWRlcg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqDQotICogUHJvdmlkZXIgZm9yIHRoZSAkcm9vdFNjb3BlIHNlcnZpY2UuDQotICovDQotDQotLyoqDQotICogQG5nZG9jIG1ldGhvZA0KLSAqIEBuYW1lICRyb290U2NvcGVQcm92aWRlciNkaWdlc3RUdGwNCi0gKiBAZGVzY3JpcHRpb24NCi0gKg0KLSAqIFNldHMgdGhlIG51bWJlciBvZiBgJGRpZ2VzdGAgaXRlcmF0aW9ucyB0aGUgc2NvcGUgc2hvdWxkIGF0dGVtcHQgdG8gZXhlY3V0ZSBiZWZvcmUgZ2l2aW5nIHVwIGFuZA0KLSAqIGFzc3VtaW5nIHRoYXQgdGhlIG1vZGVsIGlzIHVuc3RhYmxlLg0KLSAqDQotICogVGhlIGN1cnJlbnQgZGVmYXVsdCBpcyAxMCBpdGVyYXRpb25zLg0KLSAqDQotICogSW4gY29tcGxleCBhcHBsaWNhdGlvbnMgaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiBgJHdhdGNoYHMgd2lsbCByZXN1bHQgaW4NCi0gKiBzZXZlcmFsIGRpZ2VzdCBpdGVyYXRpb25zLiBIb3dldmVyIGlmIGFuIGFwcGxpY2F0aW9uIG5lZWRzIG1vcmUgdGhhbiB0aGUgZGVmYXVsdCAxMCBkaWdlc3QNCi0gKiBpdGVyYXRpb25zIGZvciBpdHMgbW9kZWwgdG8gc3RhYmlsaXplIHRoZW4geW91IHNob3VsZCBpbnZlc3RpZ2F0ZSB3aGF0IGlzIGNhdXNpbmcgdGhlIG1vZGVsIHRvDQotICogY29udGludW91c2x5IGNoYW5nZSBkdXJpbmcgdGhlIGRpZ2VzdC4NCi0gKg0KLSAqIEluY3JlYXNpbmcgdGhlIFRUTCBjb3VsZCBoYXZlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucywgc28geW91IHNob3VsZCBub3QgY2hhbmdlIGl0IHdpdGhvdXQNCi0gKiBwcm9wZXIganVzdGlmaWNhdGlvbi4NCi0gKg0KLSAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCBUaGUgbnVtYmVyIG9mIGRpZ2VzdCBpdGVyYXRpb25zLg0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBzZXJ2aWNlDQotICogQG5hbWUgJHJvb3RTY29wZQ0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqDQotICogRXZlcnkgYXBwbGljYXRpb24gaGFzIGEgc2luZ2xlIHJvb3Qge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUgc2NvcGV9Lg0KLSAqIEFsbCBvdGhlciBzY29wZXMgYXJlIGRlc2NlbmRhbnQgc2NvcGVzIG9mIHRoZSByb290IHNjb3BlLiBTY29wZXMgcHJvdmlkZSBzZXBhcmF0aW9uDQotICogYmV0d2VlbiB0aGUgbW9kZWwgYW5kIHRoZSB2aWV3LCB2aWEgYSBtZWNoYW5pc20gZm9yIHdhdGNoaW5nIHRoZSBtb2RlbCBmb3IgY2hhbmdlcy4NCi0gKiBUaGV5IGFsc28gcHJvdmlkZSBhbiBldmVudCBlbWlzc2lvbi9icm9hZGNhc3QgYW5kIHN1YnNjcmlwdGlvbiBmYWNpbGl0eS4gU2VlIHRoZQ0KLSAqIHtAbGluayBndWlkZS9zY29wZSBkZXZlbG9wZXIgZ3VpZGUgb24gc2NvcGVzfS4NCi0gKi8NCi1mdW5jdGlvbiAkUm9vdFNjb3BlUHJvdmlkZXIoKSB7DQotICB2YXIgVFRMID0gMTA7DQotICB2YXIgJHJvb3RTY29wZU1pbkVyciA9IG1pbkVycignJHJvb3RTY29wZScpOw0KLSAgdmFyIGxhc3REaXJ0eVdhdGNoID0gbnVsbDsNCi0gIHZhciBhcHBseUFzeW5jSWQgPSBudWxsOw0KLQ0KLSAgdGhpcy5kaWdlc3RUdGwgPSBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkgew0KLSAgICAgIFRUTCA9IHZhbHVlOw0KLSAgICB9DQotICAgIHJldHVybiBUVEw7DQotICB9Ow0KLQ0KLSAgdGhpcy4kZ2V0ID0gWyckaW5qZWN0b3InLCAnJGV4Y2VwdGlvbkhhbmRsZXInLCAnJHBhcnNlJywgJyRicm93c2VyJywNCi0gICAgICBmdW5jdGlvbigkaW5qZWN0b3IsICRleGNlcHRpb25IYW5kbGVyLCAkcGFyc2UsICRicm93c2VyKSB7DQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgdHlwZQ0KLSAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBBIHJvb3Qgc2NvcGUgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUgJHJvb3RTY29wZX0ga2V5IGZyb20gdGhlDQotICAgICAqIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LiBDaGlsZCBzY29wZXMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlDQotICAgICAqIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRuZXcgJG5ldygpfSBtZXRob2QuIChNb3N0IHNjb3BlcyBhcmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4NCi0gICAgICogY29tcGlsZWQgSFRNTCB0ZW1wbGF0ZSBpcyBleGVjdXRlZC4pDQotICAgICAqDQotICAgICAqIEhlcmUgaXMgYSBzaW1wbGUgc2NvcGUgc25pcHBldCB0byBzaG93IGhvdyB5b3UgY2FuIGludGVyYWN0IHdpdGggdGhlIHNjb3BlLg0KLSAgICAgKiBgYGBodG1sDQotICAgICAqIDxmaWxlIHNyYz0iLi90ZXN0L25nL3Jvb3RTY29wZVNwZWMuanMiIHRhZz0iZG9jczEiIC8+DQotICAgICAqIGBgYA0KLSAgICAgKg0KLSAgICAgKiAjIEluaGVyaXRhbmNlDQotICAgICAqIEEgc2NvcGUgY2FuIGluaGVyaXQgZnJvbSBhIHBhcmVudCBzY29wZSwgYXMgaW4gdGhpcyBleGFtcGxlOg0KLSAgICAgKiBgYGBqcw0KLSAgICAgICAgIHZhciBwYXJlbnQgPSAkcm9vdFNjb3BlOw0KLSAgICAgICAgIHZhciBjaGlsZCA9IHBhcmVudC4kbmV3KCk7DQotDQotICAgICAgICAgcGFyZW50LnNhbHV0YXRpb24gPSAiSGVsbG8iOw0KLSAgICAgICAgIGV4cGVjdChjaGlsZC5zYWx1dGF0aW9uKS50b0VxdWFsKCdIZWxsbycpOw0KLQ0KLSAgICAgICAgIGNoaWxkLnNhbHV0YXRpb24gPSAiV2VsY29tZSI7DQotICAgICAgICAgZXhwZWN0KGNoaWxkLnNhbHV0YXRpb24pLnRvRXF1YWwoJ1dlbGNvbWUnKTsNCi0gICAgICAgICBleHBlY3QocGFyZW50LnNhbHV0YXRpb24pLnRvRXF1YWwoJ0hlbGxvJyk7DQotICAgICAqIGBgYA0KLSAgICAgKg0KLSAgICAgKiBXaGVuIGludGVyYWN0aW5nIHdpdGggYFNjb3BlYCBpbiB0ZXN0cywgYWRkaXRpb25hbCBoZWxwZXIgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIG9uIHRoZQ0KLSAgICAgKiBpbnN0YW5jZXMgb2YgYFNjb3BlYCB0eXBlLiBTZWUge0BsaW5rIG5nTW9jay4kcm9vdFNjb3BlLlNjb3BlIG5nTW9jayBTY29wZX0gZm9yIGFkZGl0aW9uYWwNCi0gICAgICogZGV0YWlscy4NCi0gICAgICoNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywgZnVuY3Rpb24oKT49fSBwcm92aWRlcnMgTWFwIG9mIHNlcnZpY2UgZmFjdG9yeSB3aGljaCBuZWVkIHRvIGJlDQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgZm9yIHRoZSBjdXJyZW50IHNjb3BlLiBEZWZhdWx0cyB0byB7QGxpbmsgbmd9Lg0KLSAgICAgKiBAcGFyYW0ge09iamVjdC48c3RyaW5nLCAqPj19IGluc3RhbmNlQ2FjaGUgUHJvdmlkZXMgcHJlLWluc3RhbnRpYXRlZCBzZXJ2aWNlcyB3aGljaCBzaG91bGQNCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQvb3ZlcnJpZGUgc2VydmljZXMgcHJvdmlkZWQgYnkgYHByb3ZpZGVyc2AuIFRoaXMgaXMgaGFuZHkNCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHVuaXQtdGVzdGluZyBhbmQgaGF2aW5nIHRoZSBuZWVkIHRvIG92ZXJyaWRlIGEgZGVmYXVsdA0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuDQotICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ld2x5IGNyZWF0ZWQgc2NvcGUuDQotICAgICAqDQotICAgICAqLw0KLSAgICBmdW5jdGlvbiBTY29wZSgpIHsNCi0gICAgICB0aGlzLiRpZCA9IG5leHRVaWQoKTsNCi0gICAgICB0aGlzLiQkcGhhc2UgPSB0aGlzLiRwYXJlbnQgPSB0aGlzLiQkd2F0Y2hlcnMgPQ0KLSAgICAgICAgICAgICAgICAgICAgIHRoaXMuJCRuZXh0U2libGluZyA9IHRoaXMuJCRwcmV2U2libGluZyA9DQotICAgICAgICAgICAgICAgICAgICAgdGhpcy4kJGNoaWxkSGVhZCA9IHRoaXMuJCRjaGlsZFRhaWwgPSBudWxsOw0KLSAgICAgIHRoaXMuJHJvb3QgPSB0aGlzOw0KLSAgICAgIHRoaXMuJCRkZXN0cm95ZWQgPSBmYWxzZTsNCi0gICAgICB0aGlzLiQkbGlzdGVuZXJzID0ge307DQotICAgICAgdGhpcy4kJGxpc3RlbmVyQ291bnQgPSB7fTsNCi0gICAgICB0aGlzLiQkaXNvbGF0ZUJpbmRpbmdzID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQG5nZG9jIHByb3BlcnR5DQotICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGlkDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBVbmlxdWUgc2NvcGUgSUQgKG1vbm90b25pY2FsbHkgaW5jcmVhc2luZykgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuDQotICAgICAqLw0KLQ0KLSAgICAgLyoqDQotICAgICAgKiBAbmdkb2MgcHJvcGVydHkNCi0gICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJHBhcmVudA0KLSAgICAgICoNCi0gICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICogUmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgc2NvcGUuDQotICAgICAgKi8NCi0NCi0gICAgICAvKioNCi0gICAgICAgKiBAbmdkb2MgcHJvcGVydHkNCi0gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRyb290DQotICAgICAgICoNCi0gICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIHJvb3Qgc2NvcGUuDQotICAgICAgICovDQotDQotICAgIFNjb3BlLnByb3RvdHlwZSA9IHsNCi0gICAgICBjb25zdHJ1Y3RvcjogU2NvcGUsDQotICAgICAgLyoqDQotICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJG5ldw0KLSAgICAgICAqIEBraW5kIGZ1bmN0aW9uDQotICAgICAgICoNCi0gICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgKiBDcmVhdGVzIGEgbmV3IGNoaWxkIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIHNjb3BlfS4NCi0gICAgICAgKg0KLSAgICAgICAqIFRoZSBwYXJlbnQgc2NvcGUgd2lsbCBwcm9wYWdhdGUgdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdCgpfSBldmVudC4NCi0gICAgICAgKiBUaGUgc2NvcGUgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2NvcGUgaGllcmFyY2h5IHVzaW5nIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkZXN0cm95ICRkZXN0cm95KCl9Lg0KLSAgICAgICAqDQotICAgICAgICoge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRlc3Ryb3kgJGRlc3Ryb3koKX0gbXVzdCBiZSBjYWxsZWQgb24gYSBzY29wZSB3aGVuIGl0IGlzDQotICAgICAgICogZGVzaXJlZCBmb3IgdGhlIHNjb3BlIGFuZCBpdHMgY2hpbGQgc2NvcGVzIHRvIGJlIHBlcm1hbmVudGx5IGRldGFjaGVkIGZyb20gdGhlIHBhcmVudCBhbmQNCi0gICAgICAgKiB0aHVzIHN0b3AgcGFydGljaXBhdGluZyBpbiBtb2RlbCBjaGFuZ2UgZGV0ZWN0aW9uIGFuZCBsaXN0ZW5lciBub3RpZmljYXRpb24gYnkgaW52b2tpbmcuDQotICAgICAgICoNCi0gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzb2xhdGUgSWYgdHJ1ZSwgdGhlbiB0aGUgc2NvcGUgZG9lcyBub3QgcHJvdG90eXBpY2FsbHkgaW5oZXJpdCBmcm9tIHRoZQ0KLSAgICAgICAqICAgICAgICAgcGFyZW50IHNjb3BlLiBUaGUgc2NvcGUgaXMgaXNvbGF0ZWQsIGFzIGl0IGNhbiBub3Qgc2VlIHBhcmVudCBzY29wZSBwcm9wZXJ0aWVzLg0KLSAgICAgICAqICAgICAgICAgV2hlbiBjcmVhdGluZyB3aWRnZXRzLCBpdCBpcyB1c2VmdWwgZm9yIHRoZSB3aWRnZXQgdG8gbm90IGFjY2lkZW50YWxseSByZWFkIHBhcmVudA0KLSAgICAgICAqICAgICAgICAgc3RhdGUuDQotICAgICAgICoNCi0gICAgICAgKiBAcGFyYW0ge1Njb3BlfSBbcGFyZW50PXRoaXNdIFRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBgU2NvcGVgfSB0aGF0IHdpbGwgYmUgdGhlIGAkcGFyZW50YA0KLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgc2NvcGUuIERlZmF1bHRzIHRvIGB0aGlzYCBzY29wZSBpZiBub3QgcHJvdmlkZWQuDQotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRyYW5zY2x1ZGUgc2NvcGUgdG8gY29ycmVjdGx5IHBsYWNlIGl0DQotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgc2NvcGUgaGllcmFyY2h5IHdoaWxlIG1haW50YWluaW5nIHRoZSBjb3JyZWN0IHByb3RvdHlwaWNhbA0KLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGFuY2UuDQotICAgICAgICoNCi0gICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgbmV3bHkgY3JlYXRlZCBjaGlsZCBzY29wZS4NCi0gICAgICAgKg0KLSAgICAgICAqLw0KLSAgICAgICRuZXc6IGZ1bmN0aW9uKGlzb2xhdGUsIHBhcmVudCkgew0KLSAgICAgICAgdmFyIGNoaWxkOw0KLQ0KLSAgICAgICAgcGFyZW50ID0gcGFyZW50IHx8IHRoaXM7DQotDQotICAgICAgICBpZiAoaXNvbGF0ZSkgew0KLSAgICAgICAgICBjaGlsZCA9IG5ldyBTY29wZSgpOw0KLSAgICAgICAgICBjaGlsZC4kcm9vdCA9IHRoaXMuJHJvb3Q7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAvLyBPbmx5IGNyZWF0ZSBhIGNoaWxkIHNjb3BlIGNsYXNzIGlmIHNvbWVib2R5IGFza3MgZm9yIG9uZSwNCi0gICAgICAgICAgLy8gYnV0IGNhY2hlIGl0IHRvIGFsbG93IHRoZSBWTSB0byBvcHRpbWl6ZSBsb29rdXBzLg0KLSAgICAgICAgICBpZiAoIXRoaXMuJCRDaGlsZFNjb3BlKSB7DQotICAgICAgICAgICAgdGhpcy4kJENoaWxkU2NvcGUgPSBmdW5jdGlvbiBDaGlsZFNjb3BlKCkgew0KLSAgICAgICAgICAgICAgdGhpcy4kJHdhdGNoZXJzID0gdGhpcy4kJG5leHRTaWJsaW5nID0NCi0gICAgICAgICAgICAgICAgICB0aGlzLiQkY2hpbGRIZWFkID0gdGhpcy4kJGNoaWxkVGFpbCA9IG51bGw7DQotICAgICAgICAgICAgICB0aGlzLiQkbGlzdGVuZXJzID0ge307DQotICAgICAgICAgICAgICB0aGlzLiQkbGlzdGVuZXJDb3VudCA9IHt9Ow0KLSAgICAgICAgICAgICAgdGhpcy4kaWQgPSBuZXh0VWlkKCk7DQotICAgICAgICAgICAgICB0aGlzLiQkQ2hpbGRTY29wZSA9IG51bGw7DQotICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICB0aGlzLiQkQ2hpbGRTY29wZS5wcm90b3R5cGUgPSB0aGlzOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGNoaWxkID0gbmV3IHRoaXMuJCRDaGlsZFNjb3BlKCk7DQotICAgICAgICB9DQotICAgICAgICBjaGlsZC4kcGFyZW50ID0gcGFyZW50Ow0KLSAgICAgICAgY2hpbGQuJCRwcmV2U2libGluZyA9IHBhcmVudC4kJGNoaWxkVGFpbDsNCi0gICAgICAgIGlmIChwYXJlbnQuJCRjaGlsZEhlYWQpIHsNCi0gICAgICAgICAgcGFyZW50LiQkY2hpbGRUYWlsLiQkbmV4dFNpYmxpbmcgPSBjaGlsZDsNCi0gICAgICAgICAgcGFyZW50LiQkY2hpbGRUYWlsID0gY2hpbGQ7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBwYXJlbnQuJCRjaGlsZEhlYWQgPSBwYXJlbnQuJCRjaGlsZFRhaWwgPSBjaGlsZDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFdoZW4gdGhlIG5ldyBzY29wZSBpcyBub3QgaXNvbGF0ZWQgb3Igd2UgaW5oZXJpdCBmcm9tIGB0aGlzYCwgYW5kDQotICAgICAgICAvLyB0aGUgcGFyZW50IHNjb3BlIGlzIGRlc3Ryb3llZCwgdGhlIHByb3BlcnR5IGAkJGRlc3Ryb3llZGAgaXMgaW5oZXJpdGVkDQotICAgICAgICAvLyBwcm90b3R5cGljYWxseS4gSW4gYWxsIG90aGVyIGNhc2VzLCB0aGlzIHByb3BlcnR5IG5lZWRzIHRvIGJlIHNldA0KLSAgICAgICAgLy8gd2hlbiB0aGUgcGFyZW50IHNjb3BlIGlzIGRlc3Ryb3llZC4NCi0gICAgICAgIC8vIFRoZSBsaXN0ZW5lciBuZWVkcyB0byBiZSBhZGRlZCBhZnRlciB0aGUgcGFyZW50IGlzIHNldA0KLSAgICAgICAgaWYgKGlzb2xhdGUgfHwgcGFyZW50ICE9IHRoaXMpIGNoaWxkLiRvbignJGRlc3Ryb3knLCBkZXN0cm95Q2hpbGQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGNoaWxkOw0KLQ0KLSAgICAgICAgZnVuY3Rpb24gZGVzdHJveUNoaWxkKCkgew0KLSAgICAgICAgICBjaGlsZC4kJGRlc3Ryb3llZCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgfSwNCi0NCi0gICAgICAvKioNCi0gICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkd2F0Y2gNCi0gICAgICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICAgICAqDQotICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICogUmVnaXN0ZXJzIGEgYGxpc3RlbmVyYCBjYWxsYmFjayB0byBiZSBleGVjdXRlZCB3aGVuZXZlciB0aGUgYHdhdGNoRXhwcmVzc2lvbmAgY2hhbmdlcy4NCi0gICAgICAgKg0KLSAgICAgICAqIC0gVGhlIGB3YXRjaEV4cHJlc3Npb25gIGlzIGNhbGxlZCBvbiBldmVyeSBjYWxsIHRvIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QNCi0gICAgICAgKiAgICRkaWdlc3QoKX0gYW5kIHNob3VsZCByZXR1cm4gdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB3YXRjaGVkLiAoU2luY2UNCi0gICAgICAgKiAgIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdCgpfSByZXJ1bnMgd2hlbiBpdCBkZXRlY3RzIGNoYW5nZXMgdGhlDQotICAgICAgICogICBgd2F0Y2hFeHByZXNzaW9uYCBjYW4gZXhlY3V0ZSBtdWx0aXBsZSB0aW1lcyBwZXINCi0gICAgICAgKiAgIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdCgpfSBhbmQgc2hvdWxkIGJlIGlkZW1wb3RlbnQuKQ0KLSAgICAgICAqIC0gVGhlIGBsaXN0ZW5lcmAgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCBgd2F0Y2hFeHByZXNzaW9uYCBhbmQgdGhlDQotICAgICAgICogICBwcmV2aW91cyBjYWxsIHRvIGB3YXRjaEV4cHJlc3Npb25gIGFyZSBub3QgZXF1YWwgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgaW5pdGlhbCBydW4sDQotICAgICAgICogICBzZWUgYmVsb3cpLiBJbmVxdWFsaXR5IGlzIGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHJlZmVyZW5jZSBpbmVxdWFsaXR5LA0KLSAgICAgICAqICAgW3N0cmljdCBjb21wYXJpc29uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvQ29tcGFyaXNvbl9PcGVyYXRvcnMpDQotICAgICAgICogICAgdmlhIHRoZSBgIT09YCBKYXZhc2NyaXB0IG9wZXJhdG9yLCB1bmxlc3MgYG9iamVjdEVxdWFsaXR5ID09IHRydWVgDQotICAgICAgICogICAoc2VlIG5leHQgcG9pbnQpDQotICAgICAgICogLSBXaGVuIGBvYmplY3RFcXVhbGl0eSA9PSB0cnVlYCwgaW5lcXVhbGl0eSBvZiB0aGUgYHdhdGNoRXhwcmVzc2lvbmAgaXMgZGV0ZXJtaW5lZA0KLSAgICAgICAqICAgYWNjb3JkaW5nIHRvIHRoZSB7QGxpbmsgYW5ndWxhci5lcXVhbHN9IGZ1bmN0aW9uLiBUbyBzYXZlIHRoZSB2YWx1ZSBvZiB0aGUgb2JqZWN0IGZvcg0KLSAgICAgICAqICAgbGF0ZXIgY29tcGFyaXNvbiwgdGhlIHtAbGluayBhbmd1bGFyLmNvcHl9IGZ1bmN0aW9uIGlzIHVzZWQuIFRoaXMgdGhlcmVmb3JlIG1lYW5zIHRoYXQNCi0gICAgICAgKiAgIHdhdGNoaW5nIGNvbXBsZXggb2JqZWN0cyB3aWxsIGhhdmUgYWR2ZXJzZSBtZW1vcnkgYW5kIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucy4NCi0gICAgICAgKiAtIFRoZSB3YXRjaCBgbGlzdGVuZXJgIG1heSBjaGFuZ2UgdGhlIG1vZGVsLCB3aGljaCBtYXkgdHJpZ2dlciBvdGhlciBgbGlzdGVuZXJgcyB0byBmaXJlLg0KLSAgICAgICAqICAgVGhpcyBpcyBhY2hpZXZlZCBieSByZXJ1bm5pbmcgdGhlIHdhdGNoZXJzIHVudGlsIG5vIGNoYW5nZXMgYXJlIGRldGVjdGVkLiBUaGUgcmVydW4NCi0gICAgICAgKiAgIGl0ZXJhdGlvbiBsaW1pdCBpcyAxMCB0byBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3AgZGVhZGxvY2suDQotICAgICAgICoNCi0gICAgICAgKg0KLSAgICAgICAqIElmIHlvdSB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdH0gaXMgY2FsbGVkLA0KLSAgICAgICAqIHlvdSBjYW4gcmVnaXN0ZXIgYSBgd2F0Y2hFeHByZXNzaW9uYCBmdW5jdGlvbiB3aXRoIG5vIGBsaXN0ZW5lcmAuIChTaW5jZSBgd2F0Y2hFeHByZXNzaW9uYA0KLSAgICAgICAqIGNhbiBleGVjdXRlIG11bHRpcGxlIHRpbWVzIHBlciB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3R9IGN5Y2xlIHdoZW4gYQ0KLSAgICAgICAqIGNoYW5nZSBpcyBkZXRlY3RlZCwgYmUgcHJlcGFyZWQgZm9yIG11bHRpcGxlIGNhbGxzIHRvIHlvdXIgbGlzdGVuZXIuKQ0KLSAgICAgICAqDQotICAgICAgICogQWZ0ZXIgYSB3YXRjaGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2NvcGUsIHRoZSBgbGlzdGVuZXJgIGZuIGlzIGNhbGxlZCBhc3luY2hyb25vdXNseQ0KLSAgICAgICAqICh2aWEge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGV2YWxBc3luYyAkZXZhbEFzeW5jfSkgdG8gaW5pdGlhbGl6ZSB0aGUNCi0gICAgICAgKiB3YXRjaGVyLiBJbiByYXJlIGNhc2VzLCB0aGlzIGlzIHVuZGVzaXJhYmxlIGJlY2F1c2UgdGhlIGxpc3RlbmVyIGlzIGNhbGxlZCB3aGVuIHRoZSByZXN1bHQNCi0gICAgICAgKiBvZiBgd2F0Y2hFeHByZXNzaW9uYCBkaWRuJ3QgY2hhbmdlLiBUbyBkZXRlY3QgdGhpcyBzY2VuYXJpbyB3aXRoaW4gdGhlIGBsaXN0ZW5lcmAgZm4sIHlvdQ0KLSAgICAgICAqIGNhbiBjb21wYXJlIHRoZSBgbmV3VmFsYCBhbmQgYG9sZFZhbGAuIElmIHRoZXNlIHR3byB2YWx1ZXMgYXJlIGlkZW50aWNhbCAoYD09PWApIHRoZW4gdGhlDQotICAgICAgICogbGlzdGVuZXIgd2FzIGNhbGxlZCBkdWUgdG8gaW5pdGlhbGl6YXRpb24uDQotICAgICAgICoNCi0gICAgICAgKg0KLSAgICAgICAqDQotICAgICAgICogIyBFeGFtcGxlDQotICAgICAgICogYGBganMNCi0gICAgICAgICAgIC8vIGxldCdzIGFzc3VtZSB0aGF0IHNjb3BlIHdhcyBkZXBlbmRlbmN5IGluamVjdGVkIGFzIHRoZSAkcm9vdFNjb3BlDQotICAgICAgICAgICB2YXIgc2NvcGUgPSAkcm9vdFNjb3BlOw0KLSAgICAgICAgICAgc2NvcGUubmFtZSA9ICdtaXNrbyc7DQotICAgICAgICAgICBzY29wZS5jb3VudGVyID0gMDsNCi0NCi0gICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDApOw0KLSAgICAgICAgICAgc2NvcGUuJHdhdGNoKCduYW1lJywgZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7DQotICAgICAgICAgICAgIHNjb3BlLmNvdW50ZXIgPSBzY29wZS5jb3VudGVyICsgMTsNCi0gICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMCk7DQotDQotICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7DQotICAgICAgICAgICAvLyB0aGUgbGlzdGVuZXIgaXMgYWx3YXlzIGNhbGxlZCBkdXJpbmcgdGhlIGZpcnN0ICRkaWdlc3QgbG9vcCBhZnRlciBpdCB3YXMgcmVnaXN0ZXJlZA0KLSAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMSk7DQotDQotICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7DQotICAgICAgICAgICAvLyBidXQgbm93IGl0IHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgdGhlIHZhbHVlIGNoYW5nZXMNCi0gICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDEpOw0KLQ0KLSAgICAgICAgICAgc2NvcGUubmFtZSA9ICdhZGFtJzsNCi0gICAgICAgICAgIHNjb3BlLiRkaWdlc3QoKTsNCi0gICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDIpOw0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgLy8gVXNpbmcgYSBmdW5jdGlvbiBhcyBhIHdhdGNoRXhwcmVzc2lvbg0KLSAgICAgICAgICAgdmFyIGZvb2Q7DQotICAgICAgICAgICBzY29wZS5mb29kQ291bnRlciA9IDA7DQotICAgICAgICAgICBleHBlY3Qoc2NvcGUuZm9vZENvdW50ZXIpLnRvRXF1YWwoMCk7DQotICAgICAgICAgICBzY29wZS4kd2F0Y2goDQotICAgICAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgYmVpbmcgd2F0Y2hlZC4gSXQgaXMgY2FsbGVkIGZvciBlYWNoIHR1cm4gb2YgdGhlICRkaWdlc3QgbG9vcA0KLSAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIGZvb2Q7IH0sDQotICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNoYW5nZSBsaXN0ZW5lciwgY2FsbGVkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGFib3ZlIGZ1bmN0aW9uIGNoYW5nZXMNCi0gICAgICAgICAgICAgZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7DQotICAgICAgICAgICAgICAgaWYgKCBuZXdWYWx1ZSAhPT0gb2xkVmFsdWUgKSB7DQotICAgICAgICAgICAgICAgICAvLyBPbmx5IGluY3JlbWVudCB0aGUgY291bnRlciBpZiB0aGUgdmFsdWUgY2hhbmdlZA0KLSAgICAgICAgICAgICAgICAgc2NvcGUuZm9vZENvdW50ZXIgPSBzY29wZS5mb29kQ291bnRlciArIDE7DQotICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgICApOw0KLSAgICAgICAgICAgLy8gTm8gZGlnZXN0IGhhcyBiZWVuIHJ1biBzbyB0aGUgY291bnRlciB3aWxsIGJlIHplcm8NCi0gICAgICAgICAgIGV4cGVjdChzY29wZS5mb29kQ291bnRlcikudG9FcXVhbCgwKTsNCi0NCi0gICAgICAgICAgIC8vIFJ1biB0aGUgZGlnZXN0IGJ1dCBzaW5jZSBmb29kIGhhcyBub3QgY2hhbmdlZCBjb3VudCB3aWxsIHN0aWxsIGJlIHplcm8NCi0gICAgICAgICAgIHNjb3BlLiRkaWdlc3QoKTsNCi0gICAgICAgICAgIGV4cGVjdChzY29wZS5mb29kQ291bnRlcikudG9FcXVhbCgwKTsNCi0NCi0gICAgICAgICAgIC8vIFVwZGF0ZSBmb29kIGFuZCBydW4gZGlnZXN0LiAgTm93IHRoZSBjb3VudGVyIHdpbGwgaW5jcmVtZW50DQotICAgICAgICAgICBmb29kID0gJ2NoZWVzZWJ1cmdlcic7DQotICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7DQotICAgICAgICAgICBleHBlY3Qoc2NvcGUuZm9vZENvdW50ZXIpLnRvRXF1YWwoMSk7DQotDQotICAgICAgICogYGBgDQotICAgICAgICoNCi0gICAgICAgKg0KLSAgICAgICAqDQotICAgICAgICogQHBhcmFtIHsoZnVuY3Rpb24oKXxzdHJpbmcpfSB3YXRjaEV4cHJlc3Npb24gRXhwcmVzc2lvbiB0aGF0IGlzIGV2YWx1YXRlZCBvbiBlYWNoDQotICAgICAgICogICAge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0fSBjeWNsZS4gQSBjaGFuZ2UgaW4gdGhlIHJldHVybiB2YWx1ZSB0cmlnZ2Vycw0KLSAgICAgICAqICAgIGEgY2FsbCB0byB0aGUgYGxpc3RlbmVyYC4NCi0gICAgICAgKg0KLSAgICAgICAqICAgIC0gYHN0cmluZ2A6IEV2YWx1YXRlZCBhcyB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufQ0KLSAgICAgICAqICAgIC0gYGZ1bmN0aW9uKHNjb3BlKWA6IGNhbGxlZCB3aXRoIGN1cnJlbnQgYHNjb3BlYCBhcyBhIHBhcmFtZXRlci4NCi0gICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG5ld1ZhbCwgb2xkVmFsLCBzY29wZSl9IGxpc3RlbmVyIENhbGxiYWNrIGNhbGxlZCB3aGVuZXZlciB0aGUgdmFsdWUNCi0gICAgICAgKiAgICBvZiBgd2F0Y2hFeHByZXNzaW9uYCBjaGFuZ2VzLg0KLSAgICAgICAqDQotICAgICAgICogICAgLSBgbmV3VmFsYCBjb250YWlucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYHdhdGNoRXhwcmVzc2lvbmANCi0gICAgICAgKiAgICAtIGBvbGRWYWxgIGNvbnRhaW5zIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgYHdhdGNoRXhwcmVzc2lvbmANCi0gICAgICAgKiAgICAtIGBzY29wZWAgcmVmZXJzIHRvIHRoZSBjdXJyZW50IHNjb3BlDQotICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gb2JqZWN0RXF1YWxpdHkgQ29tcGFyZSBmb3Igb2JqZWN0IGVxdWFsaXR5IHVzaW5nIHtAbGluayBhbmd1bGFyLmVxdWFsc30gaW5zdGVhZCBvZg0KLSAgICAgICAqICAgICBjb21wYXJpbmcgZm9yIHJlZmVyZW5jZSBlcXVhbGl0eS4NCi0gICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gUmV0dXJucyBhIGRlcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIGxpc3RlbmVyLg0KLSAgICAgICAqLw0KLSAgICAgICR3YXRjaDogZnVuY3Rpb24od2F0Y2hFeHAsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSkgew0KLSAgICAgICAgdmFyIGdldCA9ICRwYXJzZSh3YXRjaEV4cCk7DQotDQotICAgICAgICBpZiAoZ2V0LiQkd2F0Y2hEZWxlZ2F0ZSkgew0KLSAgICAgICAgICByZXR1cm4gZ2V0LiQkd2F0Y2hEZWxlZ2F0ZSh0aGlzLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIGdldCk7DQotICAgICAgICB9DQotICAgICAgICB2YXIgc2NvcGUgPSB0aGlzLA0KLSAgICAgICAgICAgIGFycmF5ID0gc2NvcGUuJCR3YXRjaGVycywNCi0gICAgICAgICAgICB3YXRjaGVyID0gew0KLSAgICAgICAgICAgICAgZm46IGxpc3RlbmVyLA0KLSAgICAgICAgICAgICAgbGFzdDogaW5pdFdhdGNoVmFsLA0KLSAgICAgICAgICAgICAgZ2V0OiBnZXQsDQotICAgICAgICAgICAgICBleHA6IHdhdGNoRXhwLA0KLSAgICAgICAgICAgICAgZXE6ICEhb2JqZWN0RXF1YWxpdHkNCi0gICAgICAgICAgICB9Ow0KLQ0KLSAgICAgICAgbGFzdERpcnR5V2F0Y2ggPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSkgew0KLSAgICAgICAgICB3YXRjaGVyLmZuID0gbm9vcDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICghYXJyYXkpIHsNCi0gICAgICAgICAgYXJyYXkgPSBzY29wZS4kJHdhdGNoZXJzID0gW107DQotICAgICAgICB9DQotICAgICAgICAvLyB3ZSB1c2UgdW5zaGlmdCBzaW5jZSB3ZSB1c2UgYSB3aGlsZSBsb29wIGluICRkaWdlc3QgZm9yIHNwZWVkLg0KLSAgICAgICAgLy8gdGhlIHdoaWxlIGxvb3AgcmVhZHMgaW4gcmV2ZXJzZSBvcmRlci4NCi0gICAgICAgIGFycmF5LnVuc2hpZnQod2F0Y2hlcik7DQotDQotICAgICAgICByZXR1cm4gZnVuY3Rpb24gZGVyZWdpc3RlcldhdGNoKCkgew0KLSAgICAgICAgICBhcnJheVJlbW92ZShhcnJheSwgd2F0Y2hlcik7DQotICAgICAgICAgIGxhc3REaXJ0eVdhdGNoID0gbnVsbDsNCi0gICAgICAgIH07DQotICAgICAgfSwNCi0NCi0gICAgICAvKioNCi0gICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkd2F0Y2hHcm91cA0KLSAgICAgICAqIEBraW5kIGZ1bmN0aW9uDQotICAgICAgICoNCi0gICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgKiBBIHZhcmlhbnQgb2Yge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoICR3YXRjaCgpfSB3aGVyZSBpdCB3YXRjaGVzIGFuIGFycmF5IG9mIGB3YXRjaEV4cHJlc3Npb25zYC4NCi0gICAgICAgKiBJZiBhbnkgb25lIGV4cHJlc3Npb24gaW4gdGhlIGNvbGxlY3Rpb24gY2hhbmdlcyB0aGUgYGxpc3RlbmVyYCBpcyBleGVjdXRlZC4NCi0gICAgICAgKg0KLSAgICAgICAqIC0gVGhlIGl0ZW1zIGluIHRoZSBgd2F0Y2hFeHByZXNzaW9uc2AgYXJyYXkgYXJlIG9ic2VydmVkIHZpYSBzdGFuZGFyZCAkd2F0Y2ggb3BlcmF0aW9uIGFuZCBhcmUgZXhhbWluZWQgb24gZXZlcnkNCi0gICAgICAgKiAgIGNhbGwgdG8gJGRpZ2VzdCgpIHRvIHNlZSBpZiBhbnkgaXRlbXMgY2hhbmdlcy4NCi0gICAgICAgKiAtIFRoZSBgbGlzdGVuZXJgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgZXhwcmVzc2lvbiBpbiB0aGUgYHdhdGNoRXhwcmVzc2lvbnNgIGFycmF5IGNoYW5nZXMuDQotICAgICAgICoNCi0gICAgICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmd8RnVuY3Rpb24oc2NvcGUpPn0gd2F0Y2hFeHByZXNzaW9ucyBBcnJheSBvZiBleHByZXNzaW9ucyB0aGF0IHdpbGwgYmUgaW5kaXZpZHVhbGx5DQotICAgICAgICogd2F0Y2hlZCB1c2luZyB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggJHdhdGNoKCl9DQotICAgICAgICoNCi0gICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG5ld1ZhbHVlcywgb2xkVmFsdWVzLCBzY29wZSl9IGxpc3RlbmVyIENhbGxiYWNrIGNhbGxlZCB3aGVuZXZlciB0aGUgcmV0dXJuIHZhbHVlIG9mIGFueQ0KLSAgICAgICAqICAgIGV4cHJlc3Npb24gaW4gYHdhdGNoRXhwcmVzc2lvbnNgIGNoYW5nZXMNCi0gICAgICAgKiAgICBUaGUgYG5ld1ZhbHVlc2AgYXJyYXkgY29udGFpbnMgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBgd2F0Y2hFeHByZXNzaW9uc2AsIHdpdGggdGhlIGluZGV4ZXMgbWF0Y2hpbmcNCi0gICAgICAgKiAgICB0aG9zZSBvZiBgd2F0Y2hFeHByZXNzaW9uYA0KLSAgICAgICAqICAgIGFuZCB0aGUgYG9sZFZhbHVlc2AgYXJyYXkgY29udGFpbnMgdGhlIHByZXZpb3VzIHZhbHVlcyBvZiB0aGUgYHdhdGNoRXhwcmVzc2lvbnNgLCB3aXRoIHRoZSBpbmRleGVzIG1hdGNoaW5nDQotICAgICAgICogICAgdGhvc2Ugb2YgYHdhdGNoRXhwcmVzc2lvbmANCi0gICAgICAgKiAgICBUaGUgYHNjb3BlYCByZWZlcnMgdG8gdGhlIGN1cnJlbnQgc2NvcGUuDQotICAgICAgICogQHJldHVybnMge2Z1bmN0aW9uKCl9IFJldHVybnMgYSBkZS1yZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIGFsbCBsaXN0ZW5lcnMuDQotICAgICAgICovDQotICAgICAgJHdhdGNoR3JvdXA6IGZ1bmN0aW9uKHdhdGNoRXhwcmVzc2lvbnMsIGxpc3RlbmVyKSB7DQotICAgICAgICB2YXIgb2xkVmFsdWVzID0gbmV3IEFycmF5KHdhdGNoRXhwcmVzc2lvbnMubGVuZ3RoKTsNCi0gICAgICAgIHZhciBuZXdWYWx1ZXMgPSBuZXcgQXJyYXkod2F0Y2hFeHByZXNzaW9ucy5sZW5ndGgpOw0KLSAgICAgICAgdmFyIGRlcmVnaXN0ZXJGbnMgPSBbXTsNCi0gICAgICAgIHZhciBzZWxmID0gdGhpczsNCi0gICAgICAgIHZhciBjaGFuZ2VSZWFjdGlvblNjaGVkdWxlZCA9IGZhbHNlOw0KLSAgICAgICAgdmFyIGZpcnN0UnVuID0gdHJ1ZTsNCi0NCi0gICAgICAgIGlmICghd2F0Y2hFeHByZXNzaW9ucy5sZW5ndGgpIHsNCi0gICAgICAgICAgLy8gTm8gZXhwcmVzc2lvbnMgbWVhbnMgd2UgY2FsbCB0aGUgbGlzdGVuZXIgQVNBUA0KLSAgICAgICAgICB2YXIgc2hvdWxkQ2FsbCA9IHRydWU7DQotICAgICAgICAgIHNlbGYuJGV2YWxBc3luYyhmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBpZiAoc2hvdWxkQ2FsbCkgbGlzdGVuZXIobmV3VmFsdWVzLCBuZXdWYWx1ZXMsIHNlbGYpOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGRlcmVnaXN0ZXJXYXRjaEdyb3VwKCkgew0KLSAgICAgICAgICAgIHNob3VsZENhbGwgPSBmYWxzZTsNCi0gICAgICAgICAgfTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh3YXRjaEV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMSkgew0KLSAgICAgICAgICAvLyBTcGVjaWFsIGNhc2Ugc2l6ZSBvZiBvbmUNCi0gICAgICAgICAgcmV0dXJuIHRoaXMuJHdhdGNoKHdhdGNoRXhwcmVzc2lvbnNbMF0sIGZ1bmN0aW9uIHdhdGNoR3JvdXBBY3Rpb24odmFsdWUsIG9sZFZhbHVlLCBzY29wZSkgew0KLSAgICAgICAgICAgIG5ld1ZhbHVlc1swXSA9IHZhbHVlOw0KLSAgICAgICAgICAgIG9sZFZhbHVlc1swXSA9IG9sZFZhbHVlOw0KLSAgICAgICAgICAgIGxpc3RlbmVyKG5ld1ZhbHVlcywgKHZhbHVlID09PSBvbGRWYWx1ZSkgPyBuZXdWYWx1ZXMgOiBvbGRWYWx1ZXMsIHNjb3BlKTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3JFYWNoKHdhdGNoRXhwcmVzc2lvbnMsIGZ1bmN0aW9uKGV4cHIsIGkpIHsNCi0gICAgICAgICAgdmFyIHVud2F0Y2hGbiA9IHNlbGYuJHdhdGNoKGV4cHIsIGZ1bmN0aW9uIHdhdGNoR3JvdXBTdWJBY3Rpb24odmFsdWUsIG9sZFZhbHVlKSB7DQotICAgICAgICAgICAgbmV3VmFsdWVzW2ldID0gdmFsdWU7DQotICAgICAgICAgICAgb2xkVmFsdWVzW2ldID0gb2xkVmFsdWU7DQotICAgICAgICAgICAgaWYgKCFjaGFuZ2VSZWFjdGlvblNjaGVkdWxlZCkgew0KLSAgICAgICAgICAgICAgY2hhbmdlUmVhY3Rpb25TY2hlZHVsZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgc2VsZi4kZXZhbEFzeW5jKHdhdGNoR3JvdXBBY3Rpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSk7DQotICAgICAgICAgIGRlcmVnaXN0ZXJGbnMucHVzaCh1bndhdGNoRm4pOw0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBmdW5jdGlvbiB3YXRjaEdyb3VwQWN0aW9uKCkgew0KLSAgICAgICAgICBjaGFuZ2VSZWFjdGlvblNjaGVkdWxlZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICBpZiAoZmlyc3RSdW4pIHsNCi0gICAgICAgICAgICBmaXJzdFJ1biA9IGZhbHNlOw0KLSAgICAgICAgICAgIGxpc3RlbmVyKG5ld1ZhbHVlcywgbmV3VmFsdWVzLCBzZWxmKTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZXMsIG9sZFZhbHVlcywgc2VsZik7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmdW5jdGlvbiBkZXJlZ2lzdGVyV2F0Y2hHcm91cCgpIHsNCi0gICAgICAgICAgd2hpbGUgKGRlcmVnaXN0ZXJGbnMubGVuZ3RoKSB7DQotICAgICAgICAgICAgZGVyZWdpc3RlckZucy5zaGlmdCgpKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH07DQotICAgICAgfSwNCi0NCi0NCi0gICAgICAvKioNCi0gICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkd2F0Y2hDb2xsZWN0aW9uDQotICAgICAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAgICAgKg0KLSAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAqIFNoYWxsb3cgd2F0Y2hlcyB0aGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgYW5kIGZpcmVzIHdoZW5ldmVyIGFueSBvZiB0aGUgcHJvcGVydGllcyBjaGFuZ2UNCi0gICAgICAgKiAoZm9yIGFycmF5cywgdGhpcyBpbXBsaWVzIHdhdGNoaW5nIHRoZSBhcnJheSBpdGVtczsgZm9yIG9iamVjdCBtYXBzLCB0aGlzIGltcGxpZXMgd2F0Y2hpbmcNCi0gICAgICAgKiB0aGUgcHJvcGVydGllcykuIElmIGEgY2hhbmdlIGlzIGRldGVjdGVkLCB0aGUgYGxpc3RlbmVyYCBjYWxsYmFjayBpcyBmaXJlZC4NCi0gICAgICAgKg0KLSAgICAgICAqIC0gVGhlIGBvYmpgIGNvbGxlY3Rpb24gaXMgb2JzZXJ2ZWQgdmlhIHN0YW5kYXJkICR3YXRjaCBvcGVyYXRpb24gYW5kIGlzIGV4YW1pbmVkIG9uIGV2ZXJ5DQotICAgICAgICogICBjYWxsIHRvICRkaWdlc3QoKSB0byBzZWUgaWYgYW55IGl0ZW1zIGhhdmUgYmVlbiBhZGRlZCwgcmVtb3ZlZCwgb3IgbW92ZWQuDQotICAgICAgICogLSBUaGUgYGxpc3RlbmVyYCBpcyBjYWxsZWQgd2hlbmV2ZXIgYW55dGhpbmcgd2l0aGluIHRoZSBgb2JqYCBoYXMgY2hhbmdlZC4gRXhhbXBsZXMgaW5jbHVkZQ0KLSAgICAgICAqICAgYWRkaW5nLCByZW1vdmluZywgYW5kIG1vdmluZyBpdGVtcyBiZWxvbmdpbmcgdG8gYW4gb2JqZWN0IG9yIGFycmF5Lg0KLSAgICAgICAqDQotICAgICAgICoNCi0gICAgICAgKiAjIEV4YW1wbGUNCi0gICAgICAgKiBgYGBqcw0KLSAgICAgICAgICAkc2NvcGUubmFtZXMgPSBbJ2lnb3InLCAnbWF0aWFzJywgJ21pc2tvJywgJ2phbWVzJ107DQotICAgICAgICAgICRzY29wZS5kYXRhQ291bnQgPSA0Ow0KLQ0KLSAgICAgICAgICAkc2NvcGUuJHdhdGNoQ29sbGVjdGlvbignbmFtZXMnLCBmdW5jdGlvbihuZXdOYW1lcywgb2xkTmFtZXMpIHsNCi0gICAgICAgICAgICAkc2NvcGUuZGF0YUNvdW50ID0gbmV3TmFtZXMubGVuZ3RoOw0KLSAgICAgICAgICB9KTsNCi0NCi0gICAgICAgICAgZXhwZWN0KCRzY29wZS5kYXRhQ291bnQpLnRvRXF1YWwoNCk7DQotICAgICAgICAgICRzY29wZS4kZGlnZXN0KCk7DQotDQotICAgICAgICAgIC8vc3RpbGwgYXQgNCAuLi4gbm8gY2hhbmdlcw0KLSAgICAgICAgICBleHBlY3QoJHNjb3BlLmRhdGFDb3VudCkudG9FcXVhbCg0KTsNCi0NCi0gICAgICAgICAgJHNjb3BlLm5hbWVzLnBvcCgpOw0KLSAgICAgICAgICAkc2NvcGUuJGRpZ2VzdCgpOw0KLQ0KLSAgICAgICAgICAvL25vdyB0aGVyZSdzIGJlZW4gYSBjaGFuZ2UNCi0gICAgICAgICAgZXhwZWN0KCRzY29wZS5kYXRhQ291bnQpLnRvRXF1YWwoMyk7DQotICAgICAgICogYGBgDQotICAgICAgICoNCi0gICAgICAgKg0KLSAgICAgICAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9uKHNjb3BlKX0gb2JqIEV2YWx1YXRlZCBhcyB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufS4gVGhlDQotICAgICAgICogICAgZXhwcmVzc2lvbiB2YWx1ZSBzaG91bGQgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IG9yIGFuIGFycmF5IHdoaWNoIGlzIG9ic2VydmVkIG9uIGVhY2gNCi0gICAgICAgKiAgICB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3R9IGN5Y2xlLiBBbnkgc2hhbGxvdyBjaGFuZ2Ugd2l0aGluIHRoZQ0KLSAgICAgICAqICAgIGNvbGxlY3Rpb24gd2lsbCB0cmlnZ2VyIGEgY2FsbCB0byB0aGUgYGxpc3RlbmVyYC4NCi0gICAgICAgKg0KLSAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3Q29sbGVjdGlvbiwgb2xkQ29sbGVjdGlvbiwgc2NvcGUpfSBsaXN0ZW5lciBhIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZA0KLSAgICAgICAqICAgIHdoZW4gYSBjaGFuZ2UgaXMgZGV0ZWN0ZWQuDQotICAgICAgICogICAgLSBUaGUgYG5ld0NvbGxlY3Rpb25gIG9iamVjdCBpcyB0aGUgbmV3bHkgbW9kaWZpZWQgZGF0YSBvYnRhaW5lZCBmcm9tIHRoZSBgb2JqYCBleHByZXNzaW9uDQotICAgICAgICogICAgLSBUaGUgYG9sZENvbGxlY3Rpb25gIG9iamVjdCBpcyBhIGNvcHkgb2YgdGhlIGZvcm1lciBjb2xsZWN0aW9uIGRhdGEuDQotICAgICAgICogICAgICBEdWUgdG8gcGVyZm9ybWFuY2UgY29uc2lkZXJhdGlvbnMsIHRoZWBvbGRDb2xsZWN0aW9uYCB2YWx1ZSBpcyBjb21wdXRlZCBvbmx5IGlmIHRoZQ0KLSAgICAgICAqICAgICAgYGxpc3RlbmVyYCBmdW5jdGlvbiBkZWNsYXJlcyB0d28gb3IgbW9yZSBhcmd1bWVudHMuDQotICAgICAgICogICAgLSBUaGUgYHNjb3BlYCBhcmd1bWVudCByZWZlcnMgdG8gdGhlIGN1cnJlbnQgc2NvcGUuDQotICAgICAgICoNCi0gICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gUmV0dXJucyBhIGRlLXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyBsaXN0ZW5lci4gV2hlbiB0aGUNCi0gICAgICAgKiAgICBkZS1yZWdpc3RyYXRpb24gZnVuY3Rpb24gaXMgZXhlY3V0ZWQsIHRoZSBpbnRlcm5hbCB3YXRjaCBvcGVyYXRpb24gaXMgdGVybWluYXRlZC4NCi0gICAgICAgKi8NCi0gICAgICAkd2F0Y2hDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmosIGxpc3RlbmVyKSB7DQotICAgICAgICAkd2F0Y2hDb2xsZWN0aW9uSW50ZXJjZXB0b3IuJHN0YXRlZnVsID0gdHJ1ZTsNCi0NCi0gICAgICAgIHZhciBzZWxmID0gdGhpczsNCi0gICAgICAgIC8vIHRoZSBjdXJyZW50IHZhbHVlLCB1cGRhdGVkIG9uIGVhY2ggZGlydHktY2hlY2sgcnVuDQotICAgICAgICB2YXIgbmV3VmFsdWU7DQotICAgICAgICAvLyBhIHNoYWxsb3cgY29weSBvZiB0aGUgbmV3VmFsdWUgZnJvbSB0aGUgbGFzdCBkaXJ0eS1jaGVjayBydW4sDQotICAgICAgICAvLyB1cGRhdGVkIHRvIG1hdGNoIG5ld1ZhbHVlIGR1cmluZyBkaXJ0eS1jaGVjayBydW4NCi0gICAgICAgIHZhciBvbGRWYWx1ZTsNCi0gICAgICAgIC8vIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBuZXdWYWx1ZSBmcm9tIHdoZW4gdGhlIGxhc3QgY2hhbmdlIGhhcHBlbmVkDQotICAgICAgICB2YXIgdmVyeU9sZFZhbHVlOw0KLSAgICAgICAgLy8gb25seSB0cmFjayB2ZXJ5T2xkVmFsdWUgaWYgdGhlIGxpc3RlbmVyIGlzIGFza2luZyBmb3IgaXQNCi0gICAgICAgIHZhciB0cmFja1ZlcnlPbGRWYWx1ZSA9IChsaXN0ZW5lci5sZW5ndGggPiAxKTsNCi0gICAgICAgIHZhciBjaGFuZ2VEZXRlY3RlZCA9IDA7DQotICAgICAgICB2YXIgY2hhbmdlRGV0ZWN0b3IgPSAkcGFyc2Uob2JqLCAkd2F0Y2hDb2xsZWN0aW9uSW50ZXJjZXB0b3IpOw0KLSAgICAgICAgdmFyIGludGVybmFsQXJyYXkgPSBbXTsNCi0gICAgICAgIHZhciBpbnRlcm5hbE9iamVjdCA9IHt9Ow0KLSAgICAgICAgdmFyIGluaXRSdW4gPSB0cnVlOw0KLSAgICAgICAgdmFyIG9sZExlbmd0aCA9IDA7DQotDQotICAgICAgICBmdW5jdGlvbiAkd2F0Y2hDb2xsZWN0aW9uSW50ZXJjZXB0b3IoX3ZhbHVlKSB7DQotICAgICAgICAgIG5ld1ZhbHVlID0gX3ZhbHVlOw0KLSAgICAgICAgICB2YXIgbmV3TGVuZ3RoLCBrZXksIGJvdGhOYU4sIG5ld0l0ZW0sIG9sZEl0ZW07DQotDQotICAgICAgICAgIC8vIElmIHRoZSBuZXcgdmFsdWUgaXMgdW5kZWZpbmVkLCB0aGVuIHJldHVybiB1bmRlZmluZWQgYXMgdGhlIHdhdGNoIG1heSBiZSBhIG9uZS10aW1lIHdhdGNoDQotICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChuZXdWYWx1ZSkpIHJldHVybjsNCi0NCi0gICAgICAgICAgaWYgKCFpc09iamVjdChuZXdWYWx1ZSkpIHsgLy8gaWYgcHJpbWl0aXZlDQotICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkgew0KLSAgICAgICAgICAgICAgb2xkVmFsdWUgPSBuZXdWYWx1ZTsNCi0gICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXlMaWtlKG5ld1ZhbHVlKSkgew0KLSAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gaW50ZXJuYWxBcnJheSkgew0KLSAgICAgICAgICAgICAgLy8gd2UgYXJlIHRyYW5zaXRpb25pbmcgZnJvbSBzb21ldGhpbmcgd2hpY2ggd2FzIG5vdCBhbiBhcnJheSBpbnRvIGFycmF5Lg0KLSAgICAgICAgICAgICAgb2xkVmFsdWUgPSBpbnRlcm5hbEFycmF5Ow0KLSAgICAgICAgICAgICAgb2xkTGVuZ3RoID0gb2xkVmFsdWUubGVuZ3RoID0gMDsNCi0gICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG5ld0xlbmd0aCA9IG5ld1ZhbHVlLmxlbmd0aDsNCi0NCi0gICAgICAgICAgICBpZiAob2xkTGVuZ3RoICE9PSBuZXdMZW5ndGgpIHsNCi0gICAgICAgICAgICAgIC8vIGlmIGxlbmd0aHMgZG8gbm90IG1hdGNoIHdlIG5lZWQgdG8gdHJpZ2dlciBjaGFuZ2Ugbm90aWZpY2F0aW9uDQotICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrOw0KLSAgICAgICAgICAgICAgb2xkVmFsdWUubGVuZ3RoID0gb2xkTGVuZ3RoID0gbmV3TGVuZ3RoOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyBjb3B5IHRoZSBpdGVtcyB0byBvbGRWYWx1ZSBhbmQgbG9vayBmb3IgY2hhbmdlcy4NCi0gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0xlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICBvbGRJdGVtID0gb2xkVmFsdWVbaV07DQotICAgICAgICAgICAgICBuZXdJdGVtID0gbmV3VmFsdWVbaV07DQotDQotICAgICAgICAgICAgICBib3RoTmFOID0gKG9sZEl0ZW0gIT09IG9sZEl0ZW0pICYmIChuZXdJdGVtICE9PSBuZXdJdGVtKTsNCi0gICAgICAgICAgICAgIGlmICghYm90aE5hTiAmJiAob2xkSXRlbSAhPT0gbmV3SXRlbSkpIHsNCi0gICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQrKzsNCi0gICAgICAgICAgICAgICAgb2xkVmFsdWVbaV0gPSBuZXdJdGVtOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IGludGVybmFsT2JqZWN0KSB7DQotICAgICAgICAgICAgICAvLyB3ZSBhcmUgdHJhbnNpdGlvbmluZyBmcm9tIHNvbWV0aGluZyB3aGljaCB3YXMgbm90IGFuIG9iamVjdCBpbnRvIG9iamVjdC4NCi0gICAgICAgICAgICAgIG9sZFZhbHVlID0gaW50ZXJuYWxPYmplY3QgPSB7fTsNCi0gICAgICAgICAgICAgIG9sZExlbmd0aCA9IDA7DQotICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyBjb3B5IHRoZSBpdGVtcyB0byBvbGRWYWx1ZSBhbmQgbG9vayBmb3IgY2hhbmdlcy4NCi0gICAgICAgICAgICBuZXdMZW5ndGggPSAwOw0KLSAgICAgICAgICAgIGZvciAoa2V5IGluIG5ld1ZhbHVlKSB7DQotICAgICAgICAgICAgICBpZiAobmV3VmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSkgew0KLSAgICAgICAgICAgICAgICBuZXdMZW5ndGgrKzsNCi0gICAgICAgICAgICAgICAgbmV3SXRlbSA9IG5ld1ZhbHVlW2tleV07DQotICAgICAgICAgICAgICAgIG9sZEl0ZW0gPSBvbGRWYWx1ZVtrZXldOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG9sZFZhbHVlKSB7DQotICAgICAgICAgICAgICAgICAgYm90aE5hTiA9IChvbGRJdGVtICE9PSBvbGRJdGVtKSAmJiAobmV3SXRlbSAhPT0gbmV3SXRlbSk7DQotICAgICAgICAgICAgICAgICAgaWYgKCFib3RoTmFOICYmIChvbGRJdGVtICE9PSBuZXdJdGVtKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQrKzsNCi0gICAgICAgICAgICAgICAgICAgIG9sZFZhbHVlW2tleV0gPSBuZXdJdGVtOw0KLSAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICBvbGRMZW5ndGgrKzsNCi0gICAgICAgICAgICAgICAgICBvbGRWYWx1ZVtrZXldID0gbmV3SXRlbTsNCi0gICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChvbGRMZW5ndGggPiBuZXdMZW5ndGgpIHsNCi0gICAgICAgICAgICAgIC8vIHdlIHVzZWQgdG8gaGF2ZSBtb3JlIGtleXMsIG5lZWQgdG8gZmluZCB0aGVtIGFuZCBkZXN0cm95IHRoZW0uDQotICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrOw0KLSAgICAgICAgICAgICAgZm9yIChrZXkgaW4gb2xkVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFuZXdWYWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7DQotICAgICAgICAgICAgICAgICAgb2xkTGVuZ3RoLS07DQotICAgICAgICAgICAgICAgICAgZGVsZXRlIG9sZFZhbHVlW2tleV07DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgICAgcmV0dXJuIGNoYW5nZURldGVjdGVkOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZnVuY3Rpb24gJHdhdGNoQ29sbGVjdGlvbkFjdGlvbigpIHsNCi0gICAgICAgICAgaWYgKGluaXRSdW4pIHsNCi0gICAgICAgICAgICBpbml0UnVuID0gZmFsc2U7DQotICAgICAgICAgICAgbGlzdGVuZXIobmV3VmFsdWUsIG5ld1ZhbHVlLCBzZWxmKTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZSwgdmVyeU9sZFZhbHVlLCBzZWxmKTsNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAvLyBtYWtlIGEgY29weSBmb3IgdGhlIG5leHQgdGltZSBhIGNvbGxlY3Rpb24gaXMgY2hhbmdlZA0KLSAgICAgICAgICBpZiAodHJhY2tWZXJ5T2xkVmFsdWUpIHsNCi0gICAgICAgICAgICBpZiAoIWlzT2JqZWN0KG5ld1ZhbHVlKSkgew0KLSAgICAgICAgICAgICAgLy9wcmltaXRpdmUNCi0gICAgICAgICAgICAgIHZlcnlPbGRWYWx1ZSA9IG5ld1ZhbHVlOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheUxpa2UobmV3VmFsdWUpKSB7DQotICAgICAgICAgICAgICB2ZXJ5T2xkVmFsdWUgPSBuZXcgQXJyYXkobmV3VmFsdWUubGVuZ3RoKTsNCi0gICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3VmFsdWUubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgdmVyeU9sZFZhbHVlW2ldID0gbmV3VmFsdWVbaV07DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsgLy8gaWYgb2JqZWN0DQotICAgICAgICAgICAgICB2ZXJ5T2xkVmFsdWUgPSB7fTsNCi0gICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBuZXdWYWx1ZSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChuZXdWYWx1ZSwga2V5KSkgew0KLSAgICAgICAgICAgICAgICAgIHZlcnlPbGRWYWx1ZVtrZXldID0gbmV3VmFsdWVba2V5XTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuJHdhdGNoKGNoYW5nZURldGVjdG9yLCAkd2F0Y2hDb2xsZWN0aW9uQWN0aW9uKTsNCi0gICAgICB9LA0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QNCi0gICAgICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICAgICAqDQotICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICogUHJvY2Vzc2VzIGFsbCBvZiB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIHdhdGNoZXJzfSBvZiB0aGUgY3VycmVudCBzY29wZSBhbmQNCi0gICAgICAgKiBpdHMgY2hpbGRyZW4uIEJlY2F1c2UgYSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggd2F0Y2hlcn0ncyBsaXN0ZW5lciBjYW4gY2hhbmdlDQotICAgICAgICogdGhlIG1vZGVsLCB0aGUgYCRkaWdlc3QoKWAga2VlcHMgY2FsbGluZyB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIHdhdGNoZXJzfQ0KLSAgICAgICAqIHVudGlsIG5vIG1vcmUgbGlzdGVuZXJzIGFyZSBmaXJpbmcuIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBnZXQgaW50byBhbiBpbmZpbml0ZQ0KLSAgICAgICAqIGxvb3AuIFRoaXMgZnVuY3Rpb24gd2lsbCB0aHJvdyBgJ01heGltdW0gaXRlcmF0aW9uIGxpbWl0IGV4Y2VlZGVkLidgIGlmIHRoZSBudW1iZXIgb2YNCi0gICAgICAgKiBpdGVyYXRpb25zIGV4Y2VlZHMgMTAuDQotICAgICAgICoNCi0gICAgICAgKiBVc3VhbGx5LCB5b3UgZG9uJ3QgY2FsbCBgJGRpZ2VzdCgpYCBkaXJlY3RseSBpbg0KLSAgICAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDb250cm9sbGVyIGNvbnRyb2xsZXJzfSBvciBpbg0KLSAgICAgICAqIHtAbGluayBuZy4kY29tcGlsZVByb3ZpZGVyI2RpcmVjdGl2ZSBkaXJlY3RpdmVzfS4NCi0gICAgICAgKiBJbnN0ZWFkLCB5b3Ugc2hvdWxkIGNhbGwge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGFwcGx5ICRhcHBseSgpfSAodHlwaWNhbGx5IGZyb20gd2l0aGluDQotICAgICAgICogYSB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmUgZGlyZWN0aXZlfSksIHdoaWNoIHdpbGwgZm9yY2UgYSBgJGRpZ2VzdCgpYC4NCi0gICAgICAgKg0KLSAgICAgICAqIElmIHlvdSB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIGAkZGlnZXN0KClgIGlzIGNhbGxlZCwNCi0gICAgICAgKiB5b3UgY2FuIHJlZ2lzdGVyIGEgYHdhdGNoRXhwcmVzc2lvbmAgZnVuY3Rpb24gd2l0aA0KLSAgICAgICAqIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyR3YXRjaCAkd2F0Y2goKX0gd2l0aCBubyBgbGlzdGVuZXJgLg0KLSAgICAgICAqDQotICAgICAgICogSW4gdW5pdCB0ZXN0cywgeW91IG1heSBuZWVkIHRvIGNhbGwgYCRkaWdlc3QoKWAgdG8gc2ltdWxhdGUgdGhlIHNjb3BlIGxpZmUgY3ljbGUuDQotICAgICAgICoNCi0gICAgICAgKiAjIEV4YW1wbGUNCi0gICAgICAgKiBgYGBqcw0KLSAgICAgICAgICAgdmFyIHNjb3BlID0gLi4uOw0KLSAgICAgICAgICAgc2NvcGUubmFtZSA9ICdtaXNrbyc7DQotICAgICAgICAgICBzY29wZS5jb3VudGVyID0gMDsNCi0NCi0gICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDApOw0KLSAgICAgICAgICAgc2NvcGUuJHdhdGNoKCduYW1lJywgZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7DQotICAgICAgICAgICAgIHNjb3BlLmNvdW50ZXIgPSBzY29wZS5jb3VudGVyICsgMTsNCi0gICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMCk7DQotDQotICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7DQotICAgICAgICAgICAvLyB0aGUgbGlzdGVuZXIgaXMgYWx3YXlzIGNhbGxlZCBkdXJpbmcgdGhlIGZpcnN0ICRkaWdlc3QgbG9vcCBhZnRlciBpdCB3YXMgcmVnaXN0ZXJlZA0KLSAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMSk7DQotDQotICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7DQotICAgICAgICAgICAvLyBidXQgbm93IGl0IHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgdGhlIHZhbHVlIGNoYW5nZXMNCi0gICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDEpOw0KLQ0KLSAgICAgICAgICAgc2NvcGUubmFtZSA9ICdhZGFtJzsNCi0gICAgICAgICAgIHNjb3BlLiRkaWdlc3QoKTsNCi0gICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDIpOw0KLSAgICAgICAqIGBgYA0KLSAgICAgICAqDQotICAgICAgICovDQotICAgICAgJGRpZ2VzdDogZnVuY3Rpb24oKSB7DQotICAgICAgICB2YXIgd2F0Y2gsIHZhbHVlLCBsYXN0LA0KLSAgICAgICAgICAgIHdhdGNoZXJzLA0KLSAgICAgICAgICAgIGxlbmd0aCwNCi0gICAgICAgICAgICBkaXJ0eSwgdHRsID0gVFRMLA0KLSAgICAgICAgICAgIG5leHQsIGN1cnJlbnQsIHRhcmdldCA9IHRoaXMsDQotICAgICAgICAgICAgd2F0Y2hMb2cgPSBbXSwNCi0gICAgICAgICAgICBsb2dJZHgsIGxvZ01zZywgYXN5bmNUYXNrOw0KLQ0KLSAgICAgICAgYmVnaW5QaGFzZSgnJGRpZ2VzdCcpOw0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIGNoYW5nZXMgdG8gYnJvd3NlciB1cmwgdGhhdCBoYXBwZW5lZCBpbiBzeW5jIGJlZm9yZSB0aGUgY2FsbCB0byAkZGlnZXN0DQotICAgICAgICAkYnJvd3Nlci4kJGNoZWNrVXJsQ2hhbmdlKCk7DQotDQotICAgICAgICBpZiAodGhpcyA9PT0gJHJvb3RTY29wZSAmJiBhcHBseUFzeW5jSWQgIT09IG51bGwpIHsNCi0gICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBzY29wZSwgYW5kICRhcHBseUFzeW5jIGhhcyBzY2hlZHVsZWQgYSBkZWZlcnJlZCAkYXBwbHkoKSwgdGhlbg0KLSAgICAgICAgICAvLyBjYW5jZWwgdGhlIHNjaGVkdWxlZCAkYXBwbHkgYW5kIGZsdXNoIHRoZSBxdWV1ZSBvZiBleHByZXNzaW9ucyB0byBiZSBldmFsdWF0ZWQuDQotICAgICAgICAgICRicm93c2VyLmRlZmVyLmNhbmNlbChhcHBseUFzeW5jSWQpOw0KLSAgICAgICAgICBmbHVzaEFwcGx5QXN5bmMoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxhc3REaXJ0eVdhdGNoID0gbnVsbDsNCi0NCi0gICAgICAgIGRvIHsgLy8gIndoaWxlIGRpcnR5IiBsb29wDQotICAgICAgICAgIGRpcnR5ID0gZmFsc2U7DQotICAgICAgICAgIGN1cnJlbnQgPSB0YXJnZXQ7DQotDQotICAgICAgICAgIHdoaWxlIChhc3luY1F1ZXVlLmxlbmd0aCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICBhc3luY1Rhc2sgPSBhc3luY1F1ZXVlLnNoaWZ0KCk7DQotICAgICAgICAgICAgICBhc3luY1Rhc2suc2NvcGUuJGV2YWwoYXN5bmNUYXNrLmV4cHJlc3Npb24sIGFzeW5jVGFzay5sb2NhbHMpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCi0gICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBsYXN0RGlydHlXYXRjaCA9IG51bGw7DQotICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgdHJhdmVyc2VTY29wZXNMb29wOg0KLSAgICAgICAgICBkbyB7IC8vICJ0cmF2ZXJzZSB0aGUgc2NvcGVzIiBsb29wDQotICAgICAgICAgICAgaWYgKCh3YXRjaGVycyA9IGN1cnJlbnQuJCR3YXRjaGVycykpIHsNCi0gICAgICAgICAgICAgIC8vIHByb2Nlc3Mgb3VyIHdhdGNoZXMNCi0gICAgICAgICAgICAgIGxlbmd0aCA9IHdhdGNoZXJzLmxlbmd0aDsNCi0gICAgICAgICAgICAgIHdoaWxlIChsZW5ndGgtLSkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgIHdhdGNoID0gd2F0Y2hlcnNbbGVuZ3RoXTsNCi0gICAgICAgICAgICAgICAgICAvLyBNb3N0IGNvbW1vbiB3YXRjaGVzIGFyZSBvbiBwcmltaXRpdmVzLCBpbiB3aGljaCBjYXNlIHdlIGNhbiBzaG9ydA0KLSAgICAgICAgICAgICAgICAgIC8vIGNpcmN1aXQgaXQgd2l0aCA9PT0gb3BlcmF0b3IsIG9ubHkgd2hlbiA9PT0gZmFpbHMgZG8gd2UgdXNlIC5lcXVhbHMNCi0gICAgICAgICAgICAgICAgICBpZiAod2F0Y2gpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPSB3YXRjaC5nZXQoY3VycmVudCkpICE9PSAobGFzdCA9IHdhdGNoLmxhc3QpICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgISh3YXRjaC5lcQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVxdWFscyh2YWx1ZSwgbGFzdCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgbGFzdCA9PT0gJ251bWJlcicNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNOYU4odmFsdWUpICYmIGlzTmFOKGxhc3QpKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICBsYXN0RGlydHlXYXRjaCA9IHdhdGNoOw0KLSAgICAgICAgICAgICAgICAgICAgICB3YXRjaC5sYXN0ID0gd2F0Y2guZXEgPyBjb3B5KHZhbHVlLCBudWxsKSA6IHZhbHVlOw0KLSAgICAgICAgICAgICAgICAgICAgICB3YXRjaC5mbih2YWx1ZSwgKChsYXN0ID09PSBpbml0V2F0Y2hWYWwpID8gdmFsdWUgOiBsYXN0KSwgY3VycmVudCk7DQotICAgICAgICAgICAgICAgICAgICAgIGlmICh0dGwgPCA1KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nSWR4ID0gNCAtIHR0bDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdhdGNoTG9nW2xvZ0lkeF0pIHdhdGNoTG9nW2xvZ0lkeF0gPSBbXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3YXRjaExvZ1tsb2dJZHhdLnB1c2goew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnOiBpc0Z1bmN0aW9uKHdhdGNoLmV4cCkgPyAnZm46ICcgKyAod2F0Y2guZXhwLm5hbWUgfHwgd2F0Y2guZXhwLnRvU3RyaW5nKCkpIDogd2F0Y2guZXhwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsOiB2YWx1ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFZhbDogbGFzdA0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdhdGNoID09PSBsYXN0RGlydHlXYXRjaCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbW9zdCByZWNlbnRseSBkaXJ0eSB3YXRjaGVyIGlzIG5vdyBjbGVhbiwgc2hvcnQgY2lyY3VpdCBzaW5jZSB0aGUgcmVtYWluaW5nIHdhdGNoZXJzDQotICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgYWxyZWFkeSBiZWVuIHRlc3RlZC4NCi0gICAgICAgICAgICAgICAgICAgICAgZGlydHkgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdHJhdmVyc2VTY29wZXNMb29wOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgew0KLSAgICAgICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIEluc2FuaXR5IFdhcm5pbmc6IHNjb3BlIGRlcHRoLWZpcnN0IHRyYXZlcnNhbA0KLSAgICAgICAgICAgIC8vIHllcywgdGhpcyBjb2RlIGlzIGEgYml0IGNyYXp5LCBidXQgaXQgd29ya3MgYW5kIHdlIGhhdmUgdGVzdHMgdG8gcHJvdmUgaXQhDQotICAgICAgICAgICAgLy8gdGhpcyBwaWVjZSBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHRyYXZlcnNhbCBpbiAkYnJvYWRjYXN0DQotICAgICAgICAgICAgaWYgKCEobmV4dCA9IChjdXJyZW50LiQkY2hpbGRIZWFkIHx8DQotICAgICAgICAgICAgICAgIChjdXJyZW50ICE9PSB0YXJnZXQgJiYgY3VycmVudC4kJG5leHRTaWJsaW5nKSkpKSB7DQotICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPT0gdGFyZ2V0ICYmICEobmV4dCA9IGN1cnJlbnQuJCRuZXh0U2libGluZykpIHsNCi0gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuJHBhcmVudDsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0gd2hpbGUgKChjdXJyZW50ID0gbmV4dCkpOw0KLQ0KLSAgICAgICAgICAvLyBgYnJlYWsgdHJhdmVyc2VTY29wZXNMb29wO2AgdGFrZXMgdXMgdG8gaGVyZQ0KLQ0KLSAgICAgICAgICBpZiAoKGRpcnR5IHx8IGFzeW5jUXVldWUubGVuZ3RoKSAmJiAhKHR0bC0tKSkgew0KLSAgICAgICAgICAgIGNsZWFyUGhhc2UoKTsNCi0gICAgICAgICAgICB0aHJvdyAkcm9vdFNjb3BlTWluRXJyKCdpbmZkaWcnLA0KLSAgICAgICAgICAgICAgICAnezB9ICRkaWdlc3QoKSBpdGVyYXRpb25zIHJlYWNoZWQuIEFib3J0aW5nIVxuJyArDQotICAgICAgICAgICAgICAgICdXYXRjaGVycyBmaXJlZCBpbiB0aGUgbGFzdCA1IGl0ZXJhdGlvbnM6IHsxfScsDQotICAgICAgICAgICAgICAgIFRUTCwgd2F0Y2hMb2cpOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICB9IHdoaWxlIChkaXJ0eSB8fCBhc3luY1F1ZXVlLmxlbmd0aCk7DQotDQotICAgICAgICBjbGVhclBoYXNlKCk7DQotDQotICAgICAgICB3aGlsZSAocG9zdERpZ2VzdFF1ZXVlLmxlbmd0aCkgew0KLSAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHBvc3REaWdlc3RRdWV1ZS5zaGlmdCgpKCk7DQotICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCi0gICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0sDQotDQotDQotICAgICAgLyoqDQotICAgICAgICogQG5nZG9jIGV2ZW50DQotICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkZGVzdHJveQ0KLSAgICAgICAqIEBldmVudFR5cGUgYnJvYWRjYXN0IG9uIHNjb3BlIGJlaW5nIGRlc3Ryb3llZA0KLSAgICAgICAqDQotICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICogQnJvYWRjYXN0ZWQgd2hlbiBhIHNjb3BlIGFuZCBpdHMgY2hpbGRyZW4gYXJlIGJlaW5nIGRlc3Ryb3llZC4NCi0gICAgICAgKg0KLSAgICAgICAqIE5vdGUgdGhhdCwgaW4gQW5ndWxhckpTLCB0aGVyZSBpcyBhbHNvIGEgYCRkZXN0cm95YCBqUXVlcnkgZXZlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvDQotICAgICAgICogY2xlYW4gdXAgRE9NIGJpbmRpbmdzIGJlZm9yZSBhbiBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLg0KLSAgICAgICAqLw0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRkZXN0cm95DQotICAgICAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAgICAgKg0KLSAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAqIFJlbW92ZXMgdGhlIGN1cnJlbnQgc2NvcGUgKGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuKSBmcm9tIHRoZSBwYXJlbnQgc2NvcGUuIFJlbW92YWwgaW1wbGllcw0KLSAgICAgICAqIHRoYXQgY2FsbHMgdG8ge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0KCl9IHdpbGwgbm8gbG9uZ2VyDQotICAgICAgICogcHJvcGFnYXRlIHRvIHRoZSBjdXJyZW50IHNjb3BlIGFuZCBpdHMgY2hpbGRyZW4uIFJlbW92YWwgYWxzbyBpbXBsaWVzIHRoYXQgdGhlIGN1cnJlbnQNCi0gICAgICAgKiBzY29wZSBpcyBlbGlnaWJsZSBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uLg0KLSAgICAgICAqDQotICAgICAgICogVGhlIGAkZGVzdHJveSgpYCBpcyB1c3VhbGx5IHVzZWQgYnkgZGlyZWN0aXZlcyBzdWNoIGFzDQotICAgICAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ1JlcGVhdCBuZ1JlcGVhdH0gZm9yIG1hbmFnaW5nIHRoZQ0KLSAgICAgICAqIHVucm9sbGluZyBvZiB0aGUgbG9vcC4NCi0gICAgICAgKg0KLSAgICAgICAqIEp1c3QgYmVmb3JlIGEgc2NvcGUgaXMgZGVzdHJveWVkLCBhIGAkZGVzdHJveWAgZXZlbnQgaXMgYnJvYWRjYXN0ZWQgb24gdGhpcyBzY29wZS4NCi0gICAgICAgKiBBcHBsaWNhdGlvbiBjb2RlIGNhbiByZWdpc3RlciBhIGAkZGVzdHJveWAgZXZlbnQgaGFuZGxlciB0aGF0IHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0bw0KLSAgICAgICAqIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSBjbGVhbnVwLg0KLSAgICAgICAqDQotICAgICAgICogTm90ZSB0aGF0LCBpbiBBbmd1bGFySlMsIHRoZXJlIGlzIGFsc28gYSBgJGRlc3Ryb3lgIGpRdWVyeSBldmVudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8NCi0gICAgICAgKiBjbGVhbiB1cCBET00gYmluZGluZ3MgYmVmb3JlIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00uDQotICAgICAgICovDQotICAgICAgJGRlc3Ryb3k6IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgLy8gd2UgY2FuJ3QgZGVzdHJveSB0aGUgcm9vdCBzY29wZSBvciBhIHNjb3BlIHRoYXQgaGFzIGJlZW4gYWxyZWFkeSBkZXN0cm95ZWQNCi0gICAgICAgIGlmICh0aGlzLiQkZGVzdHJveWVkKSByZXR1cm47DQotICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50Ow0KLQ0KLSAgICAgICAgdGhpcy4kYnJvYWRjYXN0KCckZGVzdHJveScpOw0KLSAgICAgICAgdGhpcy4kJGRlc3Ryb3llZCA9IHRydWU7DQotICAgICAgICBpZiAodGhpcyA9PT0gJHJvb3RTY29wZSkgcmV0dXJuOw0KLQ0KLSAgICAgICAgZm9yICh2YXIgZXZlbnROYW1lIGluIHRoaXMuJCRsaXN0ZW5lckNvdW50KSB7DQotICAgICAgICAgIGRlY3JlbWVudExpc3RlbmVyQ291bnQodGhpcywgdGhpcy4kJGxpc3RlbmVyQ291bnRbZXZlbnROYW1lXSwgZXZlbnROYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHNldmVyIGFsbCB0aGUgcmVmZXJlbmNlcyB0byBwYXJlbnQgc2NvcGVzIChhZnRlciB0aGlzIGNsZWFudXAsIHRoZSBjdXJyZW50IHNjb3BlIHNob3VsZA0KLSAgICAgICAgLy8gbm90IGJlIHJldGFpbmVkIGJ5IGFueSBvZiBvdXIgcmVmZXJlbmNlcyBhbmQgc2hvdWxkIGJlIGVsaWdpYmxlIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24pDQotICAgICAgICBpZiAocGFyZW50LiQkY2hpbGRIZWFkID09IHRoaXMpIHBhcmVudC4kJGNoaWxkSGVhZCA9IHRoaXMuJCRuZXh0U2libGluZzsNCi0gICAgICAgIGlmIChwYXJlbnQuJCRjaGlsZFRhaWwgPT0gdGhpcykgcGFyZW50LiQkY2hpbGRUYWlsID0gdGhpcy4kJHByZXZTaWJsaW5nOw0KLSAgICAgICAgaWYgKHRoaXMuJCRwcmV2U2libGluZykgdGhpcy4kJHByZXZTaWJsaW5nLiQkbmV4dFNpYmxpbmcgPSB0aGlzLiQkbmV4dFNpYmxpbmc7DQotICAgICAgICBpZiAodGhpcy4kJG5leHRTaWJsaW5nKSB0aGlzLiQkbmV4dFNpYmxpbmcuJCRwcmV2U2libGluZyA9IHRoaXMuJCRwcmV2U2libGluZzsNCi0NCi0gICAgICAgIC8vIERpc2FibGUgbGlzdGVuZXJzLCB3YXRjaGVycyBhbmQgYXBwbHkvZGlnZXN0IG1ldGhvZHMNCi0gICAgICAgIHRoaXMuJGRlc3Ryb3kgPSB0aGlzLiRkaWdlc3QgPSB0aGlzLiRhcHBseSA9IHRoaXMuJGV2YWxBc3luYyA9IHRoaXMuJGFwcGx5QXN5bmMgPSBub29wOw0KLSAgICAgICAgdGhpcy4kb24gPSB0aGlzLiR3YXRjaCA9IHRoaXMuJHdhdGNoR3JvdXAgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5vb3A7IH07DQotICAgICAgICB0aGlzLiQkbGlzdGVuZXJzID0ge307DQotDQotICAgICAgICAvLyBBbGwgb2YgdGhlIGNvZGUgYmVsb3cgaXMgYm9ndXMgY29kZSB0aGF0IHdvcmtzIGFyb3VuZCBWOCdzIG1lbW9yeSBsZWFrIHZpYSBvcHRpbWl6ZWQgY29kZQ0KLSAgICAgICAgLy8gYW5kIGlubGluZSBjYWNoZXMuDQotICAgICAgICAvLw0KLSAgICAgICAgLy8gc2VlOg0KLSAgICAgICAgLy8gLSBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MjA3MyNjMjYNCi0gICAgICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvNjc5NCNpc3N1ZWNvbW1lbnQtMzg2NDg5MDkNCi0gICAgICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvMTMxMyNpc3N1ZWNvbW1lbnQtMTAzNzg0NTENCi0NCi0gICAgICAgIHRoaXMuJHBhcmVudCA9IHRoaXMuJCRuZXh0U2libGluZyA9IHRoaXMuJCRwcmV2U2libGluZyA9IHRoaXMuJCRjaGlsZEhlYWQgPQ0KLSAgICAgICAgICAgIHRoaXMuJCRjaGlsZFRhaWwgPSB0aGlzLiRyb290ID0gdGhpcy4kJHdhdGNoZXJzID0gbnVsbDsNCi0gICAgICB9LA0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRldmFsDQotICAgICAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAgICAgKg0KLSAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAqIEV4ZWN1dGVzIHRoZSBgZXhwcmVzc2lvbmAgb24gdGhlIGN1cnJlbnQgc2NvcGUgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gQW55IGV4Y2VwdGlvbnMgaW4NCi0gICAgICAgKiB0aGUgZXhwcmVzc2lvbiBhcmUgcHJvcGFnYXRlZCAodW5jYXVnaHQpLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGV2YWx1YXRpbmcgQW5ndWxhcg0KLSAgICAgICAqIGV4cHJlc3Npb25zLg0KLSAgICAgICAqDQotICAgICAgICogIyBFeGFtcGxlDQotICAgICAgICogYGBganMNCi0gICAgICAgICAgIHZhciBzY29wZSA9IG5nLiRyb290U2NvcGUuU2NvcGUoKTsNCi0gICAgICAgICAgIHNjb3BlLmEgPSAxOw0KLSAgICAgICAgICAgc2NvcGUuYiA9IDI7DQotDQotICAgICAgICAgICBleHBlY3Qoc2NvcGUuJGV2YWwoJ2ErYicpKS50b0VxdWFsKDMpOw0KLSAgICAgICAgICAgZXhwZWN0KHNjb3BlLiRldmFsKGZ1bmN0aW9uKHNjb3BlKXsgcmV0dXJuIHNjb3BlLmEgKyBzY29wZS5iOyB9KSkudG9FcXVhbCgzKTsNCi0gICAgICAgKiBgYGANCi0gICAgICAgKg0KLSAgICAgICAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbigpKT19IGV4cHJlc3Npb24gQW4gYW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkLg0KLSAgICAgICAqDQotICAgICAgICogICAgLSBgc3RyaW5nYDogZXhlY3V0ZSB1c2luZyB0aGUgcnVsZXMgYXMgZGVmaW5lZCBpbiAge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0uDQotICAgICAgICogICAgLSBgZnVuY3Rpb24oc2NvcGUpYDogZXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBgc2NvcGVgIHBhcmFtZXRlci4NCi0gICAgICAgKg0KLSAgICAgICAqIEBwYXJhbSB7KG9iamVjdCk9fSBsb2NhbHMgTG9jYWwgdmFyaWFibGVzIG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpbiBzY29wZS4NCi0gICAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uLg0KLSAgICAgICAqLw0KLSAgICAgICRldmFsOiBmdW5jdGlvbihleHByLCBsb2NhbHMpIHsNCi0gICAgICAgIHJldHVybiAkcGFyc2UoZXhwcikodGhpcywgbG9jYWxzKTsNCi0gICAgICB9LA0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRldmFsQXN5bmMNCi0gICAgICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICAgICAqDQotICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICogRXhlY3V0ZXMgdGhlIGV4cHJlc3Npb24gb24gdGhlIGN1cnJlbnQgc2NvcGUgYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLg0KLSAgICAgICAqDQotICAgICAgICogVGhlIGAkZXZhbEFzeW5jYCBtYWtlcyBubyBndWFyYW50ZWVzIGFzIHRvIHdoZW4gdGhlIGBleHByZXNzaW9uYCB3aWxsIGJlIGV4ZWN1dGVkLCBvbmx5DQotICAgICAgICogdGhhdDoNCi0gICAgICAgKg0KLSAgICAgICAqICAgLSBpdCB3aWxsIGV4ZWN1dGUgYWZ0ZXIgdGhlIGZ1bmN0aW9uIHRoYXQgc2NoZWR1bGVkIHRoZSBldmFsdWF0aW9uIChwcmVmZXJhYmx5IGJlZm9yZSBET00NCi0gICAgICAgKiAgICAgcmVuZGVyaW5nKS4NCi0gICAgICAgKiAgIC0gYXQgbGVhc3Qgb25lIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdCBjeWNsZX0gd2lsbCBiZSBwZXJmb3JtZWQgYWZ0ZXINCi0gICAgICAgKiAgICAgYGV4cHJlc3Npb25gIGV4ZWN1dGlvbi4NCi0gICAgICAgKg0KLSAgICAgICAqIEFueSBleGNlcHRpb25zIGZyb20gdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBhcmUgZm9yd2FyZGVkIHRvIHRoZQ0KLSAgICAgICAqIHtAbGluayBuZy4kZXhjZXB0aW9uSGFuZGxlciAkZXhjZXB0aW9uSGFuZGxlcn0gc2VydmljZS4NCi0gICAgICAgKg0KLSAgICAgICAqIF9fTm90ZTpfXyBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvdXRzaWRlIG9mIGEgYCRkaWdlc3RgIGN5Y2xlLCBhIG5ldyBgJGRpZ2VzdGAgY3ljbGUNCi0gICAgICAgKiB3aWxsIGJlIHNjaGVkdWxlZC4gSG93ZXZlciwgaXQgaXMgZW5jb3VyYWdlZCB0byBhbHdheXMgY2FsbCBjb2RlIHRoYXQgY2hhbmdlcyB0aGUgbW9kZWwNCi0gICAgICAgKiBmcm9tIHdpdGhpbiBhbiBgJGFwcGx5YCBjYWxsLiBUaGF0IGluY2x1ZGVzIGNvZGUgZXZhbHVhdGVkIHZpYSBgJGV2YWxBc3luY2AuDQotICAgICAgICoNCi0gICAgICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24oKSk9fSBleHByZXNzaW9uIEFuIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZC4NCi0gICAgICAgKg0KLSAgICAgICAqICAgIC0gYHN0cmluZ2A6IGV4ZWN1dGUgdXNpbmcgdGhlIHJ1bGVzIGFzIGRlZmluZWQgaW4ge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0uDQotICAgICAgICogICAgLSBgZnVuY3Rpb24oc2NvcGUpYDogZXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBgc2NvcGVgIHBhcmFtZXRlci4NCi0gICAgICAgKg0KLSAgICAgICAqIEBwYXJhbSB7KG9iamVjdCk9fSBsb2NhbHMgTG9jYWwgdmFyaWFibGVzIG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpbiBzY29wZS4NCi0gICAgICAgKi8NCi0gICAgICAkZXZhbEFzeW5jOiBmdW5jdGlvbihleHByLCBsb2NhbHMpIHsNCi0gICAgICAgIC8vIGlmIHdlIGFyZSBvdXRzaWRlIG9mIGFuICRkaWdlc3QgbG9vcCBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgc2NoZWR1bGluZyBhc3luYw0KLSAgICAgICAgLy8gdGFzayBhbHNvIHNjaGVkdWxlIGFzeW5jIGF1dG8tZmx1c2gNCi0gICAgICAgIGlmICghJHJvb3RTY29wZS4kJHBoYXNlICYmICFhc3luY1F1ZXVlLmxlbmd0aCkgew0KLSAgICAgICAgICAkYnJvd3Nlci5kZWZlcihmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBpZiAoYXN5bmNRdWV1ZS5sZW5ndGgpIHsNCi0gICAgICAgICAgICAgICRyb290U2NvcGUuJGRpZ2VzdCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSk7DQotICAgICAgICB9DQotDQotICAgICAgICBhc3luY1F1ZXVlLnB1c2goe3Njb3BlOiB0aGlzLCBleHByZXNzaW9uOiBleHByLCBsb2NhbHM6IGxvY2Fsc30pOw0KLSAgICAgIH0sDQotDQotICAgICAgJCRwb3N0RGlnZXN0OiBmdW5jdGlvbihmbikgew0KLSAgICAgICAgcG9zdERpZ2VzdFF1ZXVlLnB1c2goZm4pOw0KLSAgICAgIH0sDQotDQotICAgICAgLyoqDQotICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGFwcGx5DQotICAgICAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAgICAgKg0KLSAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAqIGAkYXBwbHkoKWAgaXMgdXNlZCB0byBleGVjdXRlIGFuIGV4cHJlc3Npb24gaW4gYW5ndWxhciBmcm9tIG91dHNpZGUgb2YgdGhlIGFuZ3VsYXINCi0gICAgICAgKiBmcmFtZXdvcmsuIChGb3IgZXhhbXBsZSBmcm9tIGJyb3dzZXIgRE9NIGV2ZW50cywgc2V0VGltZW91dCwgWEhSIG9yIHRoaXJkIHBhcnR5IGxpYnJhcmllcykuDQotICAgICAgICogQmVjYXVzZSB3ZSBhcmUgY2FsbGluZyBpbnRvIHRoZSBhbmd1bGFyIGZyYW1ld29yayB3ZSBuZWVkIHRvIHBlcmZvcm0gcHJvcGVyIHNjb3BlIGxpZmUNCi0gICAgICAgKiBjeWNsZSBvZiB7QGxpbmsgbmcuJGV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uIGhhbmRsaW5nfSwNCi0gICAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0IGV4ZWN1dGluZyB3YXRjaGVzfS4NCi0gICAgICAgKg0KLSAgICAgICAqICMjIExpZmUgY3ljbGUNCi0gICAgICAgKg0KLSAgICAgICAqICMgUHNldWRvLUNvZGUgb2YgYCRhcHBseSgpYA0KLSAgICAgICAqIGBgYGpzDQotICAgICAgICAgICBmdW5jdGlvbiAkYXBwbHkoZXhwcikgew0KLSAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgIHJldHVybiAkZXZhbChleHByKTsNCi0gICAgICAgICAgICAgfSBjYXRjaCAoZSkgew0KLSAgICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOw0KLSAgICAgICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgICAgICRyb290LiRkaWdlc3QoKTsNCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgfQ0KLSAgICAgICAqIGBgYA0KLSAgICAgICAqDQotICAgICAgICoNCi0gICAgICAgKiBTY29wZSdzIGAkYXBwbHkoKWAgbWV0aG9kIHRyYW5zaXRpb25zIHRocm91Z2ggdGhlIGZvbGxvd2luZyBzdGFnZXM6DQotICAgICAgICoNCi0gICAgICAgKiAxLiBUaGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgZXhlY3V0ZWQgdXNpbmcgdGhlDQotICAgICAgICogICAge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGV2YWwgJGV2YWwoKX0gbWV0aG9kLg0KLSAgICAgICAqIDIuIEFueSBleGNlcHRpb25zIGZyb20gdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBhcmUgZm9yd2FyZGVkIHRvIHRoZQ0KLSAgICAgICAqICAgIHtAbGluayBuZy4kZXhjZXB0aW9uSGFuZGxlciAkZXhjZXB0aW9uSGFuZGxlcn0gc2VydmljZS4NCi0gICAgICAgKiAzLiBUaGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIHdhdGNofSBsaXN0ZW5lcnMgYXJlIGZpcmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQ0KLSAgICAgICAqICAgIGV4cHJlc3Npb24gd2FzIGV4ZWN1dGVkIHVzaW5nIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3QoKX0gbWV0aG9kLg0KLSAgICAgICAqDQotICAgICAgICoNCi0gICAgICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24oKSk9fSBleHAgQW4gYW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkLg0KLSAgICAgICAqDQotICAgICAgICogICAgLSBgc3RyaW5nYDogZXhlY3V0ZSB1c2luZyB0aGUgcnVsZXMgYXMgZGVmaW5lZCBpbiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufS4NCi0gICAgICAgKiAgICAtIGBmdW5jdGlvbihzY29wZSlgOiBleGVjdXRlIHRoZSBmdW5jdGlvbiB3aXRoIGN1cnJlbnQgYHNjb3BlYCBwYXJhbWV0ZXIuDQotICAgICAgICoNCi0gICAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uLg0KLSAgICAgICAqLw0KLSAgICAgICRhcHBseTogZnVuY3Rpb24oZXhwcikgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgYmVnaW5QaGFzZSgnJGFwcGx5Jyk7DQotICAgICAgICAgIHJldHVybiB0aGlzLiRldmFsKGV4cHIpOw0KLSAgICAgICAgfSBjYXRjaCAoZSkgew0KLSAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGNsZWFyUGhhc2UoKTsNCi0gICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAkcm9vdFNjb3BlLiRkaWdlc3QoKTsNCi0gICAgICAgICAgfSBjYXRjaCAoZSkgew0KLSAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOw0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9LA0KLQ0KLSAgICAgIC8qKg0KLSAgICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRhcHBseUFzeW5jDQotICAgICAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAgICAgKg0KLSAgICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgICAqIFNjaGVkdWxlIHRoZSBpbnZva2F0aW9uIG9mICRhcHBseSB0byBvY2N1ciBhdCBhIGxhdGVyIHRpbWUuIFRoZSBhY3R1YWwgdGltZSBkaWZmZXJlbmNlDQotICAgICAgICogdmFyaWVzIGFjcm9zcyBicm93c2VycywgYnV0IGlzIHR5cGljYWxseSBhcm91bmQgfjEwIG1pbGxpc2Vjb25kcy4NCi0gICAgICAgKg0KLSAgICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcXVldWUgdXAgbXVsdGlwbGUgZXhwcmVzc2lvbnMgd2hpY2ggbmVlZCB0byBiZSBldmFsdWF0ZWQgaW4gdGhlIHNhbWUNCi0gICAgICAgKiBkaWdlc3QuDQotICAgICAgICoNCi0gICAgICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24oKSk9fSBleHAgQW4gYW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkLg0KLSAgICAgICAqDQotICAgICAgICogICAgLSBgc3RyaW5nYDogZXhlY3V0ZSB1c2luZyB0aGUgcnVsZXMgYXMgZGVmaW5lZCBpbiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufS4NCi0gICAgICAgKiAgICAtIGBmdW5jdGlvbihzY29wZSlgOiBleGVjdXRlIHRoZSBmdW5jdGlvbiB3aXRoIGN1cnJlbnQgYHNjb3BlYCBwYXJhbWV0ZXIuDQotICAgICAgICovDQotICAgICAgJGFwcGx5QXN5bmM6IGZ1bmN0aW9uKGV4cHIpIHsNCi0gICAgICAgIHZhciBzY29wZSA9IHRoaXM7DQotICAgICAgICBleHByICYmIGFwcGx5QXN5bmNRdWV1ZS5wdXNoKCRhcHBseUFzeW5jRXhwcmVzc2lvbik7DQotICAgICAgICBzY2hlZHVsZUFwcGx5QXN5bmMoKTsNCi0NCi0gICAgICAgIGZ1bmN0aW9uICRhcHBseUFzeW5jRXhwcmVzc2lvbigpIHsNCi0gICAgICAgICAgc2NvcGUuJGV2YWwoZXhwcik7DQotICAgICAgICB9DQotICAgICAgfSwNCi0NCi0gICAgICAvKioNCi0gICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkb24NCi0gICAgICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICAgICAqDQotICAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgICogTGlzdGVucyBvbiBldmVudHMgb2YgYSBnaXZlbiB0eXBlLiBTZWUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGVtaXQgJGVtaXR9IGZvcg0KLSAgICAgICAqIGRpc2N1c3Npb24gb2YgZXZlbnQgbGlmZSBjeWNsZS4NCi0gICAgICAgKg0KLSAgICAgICAqIFRoZSBldmVudCBsaXN0ZW5lciBmdW5jdGlvbiBmb3JtYXQgaXM6IGBmdW5jdGlvbihldmVudCwgYXJncy4uLilgLiBUaGUgYGV2ZW50YCBvYmplY3QNCi0gICAgICAgKiBwYXNzZWQgaW50byB0aGUgbGlzdGVuZXIgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoNCi0gICAgICAgKg0KLSAgICAgICAqICAgLSBgdGFyZ2V0U2NvcGVgIC0gYHtTY29wZX1gOiB0aGUgc2NvcGUgb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBgJGVtaXRgLWVkIG9yDQotICAgICAgICogICAgIGAkYnJvYWRjYXN0YC1lZC4NCi0gICAgICAgKiAgIC0gYGN1cnJlbnRTY29wZWAgLSBge1Njb3BlfWA6IHRoZSBzY29wZSB0aGF0IGlzIGN1cnJlbnRseSBoYW5kbGluZyB0aGUgZXZlbnQuIE9uY2UgdGhlDQotICAgICAgICogICAgIGV2ZW50IHByb3BhZ2F0ZXMgdGhyb3VnaCB0aGUgc2NvcGUgaGllcmFyY2h5LCB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBudWxsLg0KLSAgICAgICAqICAgLSBgbmFtZWAgLSBge3N0cmluZ31gOiBuYW1lIG9mIHRoZSBldmVudC4NCi0gICAgICAgKiAgIC0gYHN0b3BQcm9wYWdhdGlvbmAgLSBge2Z1bmN0aW9uPX1gOiBjYWxsaW5nIGBzdG9wUHJvcGFnYXRpb25gIGZ1bmN0aW9uIHdpbGwgY2FuY2VsDQotICAgICAgICogICAgIGZ1cnRoZXIgZXZlbnQgcHJvcGFnYXRpb24gKGF2YWlsYWJsZSBvbmx5IGZvciBldmVudHMgdGhhdCB3ZXJlIGAkZW1pdGAtZWQpLg0KLSAgICAgICAqICAgLSBgcHJldmVudERlZmF1bHRgIC0gYHtmdW5jdGlvbn1gOiBjYWxsaW5nIGBwcmV2ZW50RGVmYXVsdGAgc2V0cyBgZGVmYXVsdFByZXZlbnRlZGAgZmxhZw0KLSAgICAgICAqICAgICB0byB0cnVlLg0KLSAgICAgICAqICAgLSBgZGVmYXVsdFByZXZlbnRlZGAgLSBge2Jvb2xlYW59YDogdHJ1ZSBpZiBgcHJldmVudERlZmF1bHRgIHdhcyBjYWxsZWQuDQotICAgICAgICoNCi0gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBFdmVudCBuYW1lIHRvIGxpc3RlbiBvbi4NCi0gICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50LCAuLi5hcmdzKX0gbGlzdGVuZXIgRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyBlbWl0dGVkLg0KLSAgICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbigpfSBSZXR1cm5zIGEgZGVyZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHRoaXMgbGlzdGVuZXIuDQotICAgICAgICovDQotICAgICAgJG9uOiBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikgew0KLSAgICAgICAgdmFyIG5hbWVkTGlzdGVuZXJzID0gdGhpcy4kJGxpc3RlbmVyc1tuYW1lXTsNCi0gICAgICAgIGlmICghbmFtZWRMaXN0ZW5lcnMpIHsNCi0gICAgICAgICAgdGhpcy4kJGxpc3RlbmVyc1tuYW1lXSA9IG5hbWVkTGlzdGVuZXJzID0gW107DQotICAgICAgICB9DQotICAgICAgICBuYW1lZExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsNCi0NCi0gICAgICAgIHZhciBjdXJyZW50ID0gdGhpczsNCi0gICAgICAgIGRvIHsNCi0gICAgICAgICAgaWYgKCFjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSkgew0KLSAgICAgICAgICAgIGN1cnJlbnQuJCRsaXN0ZW5lckNvdW50W25hbWVdID0gMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSsrOw0KLSAgICAgICAgfSB3aGlsZSAoKGN1cnJlbnQgPSBjdXJyZW50LiRwYXJlbnQpKTsNCi0NCi0gICAgICAgIHZhciBzZWxmID0gdGhpczsNCi0gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgdmFyIGluZGV4T2ZMaXN0ZW5lciA9IG5hbWVkTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpOw0KLSAgICAgICAgICBpZiAoaW5kZXhPZkxpc3RlbmVyICE9PSAtMSkgew0KLSAgICAgICAgICAgIG5hbWVkTGlzdGVuZXJzW2luZGV4T2ZMaXN0ZW5lcl0gPSBudWxsOw0KLSAgICAgICAgICAgIGRlY3JlbWVudExpc3RlbmVyQ291bnQoc2VsZiwgMSwgbmFtZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH07DQotICAgICAgfSwNCi0NCi0NCi0gICAgICAvKioNCi0gICAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkZW1pdA0KLSAgICAgICAqIEBraW5kIGZ1bmN0aW9uDQotICAgICAgICoNCi0gICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IGBuYW1lYCB1cHdhcmRzIHRocm91Z2ggdGhlIHNjb3BlIGhpZXJhcmNoeSBub3RpZnlpbmcgdGhlDQotICAgICAgICogcmVnaXN0ZXJlZCB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb259IGxpc3RlbmVycy4NCi0gICAgICAgKg0KLSAgICAgICAqIFRoZSBldmVudCBsaWZlIGN5Y2xlIHN0YXJ0cyBhdCB0aGUgc2NvcGUgb24gd2hpY2ggYCRlbWl0YCB3YXMgY2FsbGVkLiBBbGwNCi0gICAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb24gbGlzdGVuZXJzfSBsaXN0ZW5pbmcgZm9yIGBuYW1lYCBldmVudCBvbiB0aGlzIHNjb3BlIGdldA0KLSAgICAgICAqIG5vdGlmaWVkLiBBZnRlcndhcmRzLCB0aGUgZXZlbnQgdHJhdmVyc2VzIHVwd2FyZHMgdG93YXJkIHRoZSByb290IHNjb3BlIGFuZCBjYWxscyBhbGwNCi0gICAgICAgKiByZWdpc3RlcmVkIGxpc3RlbmVycyBhbG9uZyB0aGUgd2F5LiBUaGUgZXZlbnQgd2lsbCBzdG9wIHByb3BhZ2F0aW5nIGlmIG9uZSBvZiB0aGUgbGlzdGVuZXJzDQotICAgICAgICogY2FuY2VscyBpdC4NCi0gICAgICAgKg0KLSAgICAgICAqIEFueSBleGNlcHRpb24gZW1pdHRlZCBmcm9tIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb24gbGlzdGVuZXJzfSB3aWxsIGJlIHBhc3NlZA0KLSAgICAgICAqIG9udG8gdGhlIHtAbGluayBuZy4kZXhjZXB0aW9uSGFuZGxlciAkZXhjZXB0aW9uSGFuZGxlcn0gc2VydmljZS4NCi0gICAgICAgKg0KLSAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEV2ZW50IG5hbWUgdG8gZW1pdC4NCi0gICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgT3B0aW9uYWwgb25lIG9yIG1vcmUgYXJndW1lbnRzIHdoaWNoIHdpbGwgYmUgcGFzc2VkIG9udG8gdGhlIGV2ZW50IGxpc3RlbmVycy4NCi0gICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEV2ZW50IG9iamVjdCAoc2VlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbn0pLg0KLSAgICAgICAqLw0KLSAgICAgICRlbWl0OiBmdW5jdGlvbihuYW1lLCBhcmdzKSB7DQotICAgICAgICB2YXIgZW1wdHkgPSBbXSwNCi0gICAgICAgICAgICBuYW1lZExpc3RlbmVycywNCi0gICAgICAgICAgICBzY29wZSA9IHRoaXMsDQotICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uID0gZmFsc2UsDQotICAgICAgICAgICAgZXZlbnQgPSB7DQotICAgICAgICAgICAgICBuYW1lOiBuYW1lLA0KLSAgICAgICAgICAgICAgdGFyZ2V0U2NvcGU6IHNjb3BlLA0KLSAgICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtzdG9wUHJvcGFnYXRpb24gPSB0cnVlO30sDQotICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgfSwNCi0gICAgICAgICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlDQotICAgICAgICAgICAgfSwNCi0gICAgICAgICAgICBsaXN0ZW5lckFyZ3MgPSBjb25jYXQoW2V2ZW50XSwgYXJndW1lbnRzLCAxKSwNCi0gICAgICAgICAgICBpLCBsZW5ndGg7DQotDQotICAgICAgICBkbyB7DQotICAgICAgICAgIG5hbWVkTGlzdGVuZXJzID0gc2NvcGUuJCRsaXN0ZW5lcnNbbmFtZV0gfHwgZW1wdHk7DQotICAgICAgICAgIGV2ZW50LmN1cnJlbnRTY29wZSA9IHNjb3BlOw0KLSAgICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBuYW1lZExpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KLQ0KLSAgICAgICAgICAgIC8vIGlmIGxpc3RlbmVycyB3ZXJlIGRlcmVnaXN0ZXJlZCwgZGVmcmFnbWVudCB0aGUgYXJyYXkNCi0gICAgICAgICAgICBpZiAoIW5hbWVkTGlzdGVuZXJzW2ldKSB7DQotICAgICAgICAgICAgICBuYW1lZExpc3RlbmVycy5zcGxpY2UoaSwgMSk7DQotICAgICAgICAgICAgICBpLS07DQotICAgICAgICAgICAgICBsZW5ndGgtLTsNCi0gICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgLy9hbGxvdyBhbGwgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50IHNjb3BlIHRvIHJ1bg0KLSAgICAgICAgICAgICAgbmFtZWRMaXN0ZW5lcnNbaV0uYXBwbHkobnVsbCwgbGlzdGVuZXJBcmdzKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChlKSB7DQotICAgICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgICAgLy9pZiBhbnkgbGlzdGVuZXIgb24gdGhlIGN1cnJlbnQgc2NvcGUgc3RvcHMgcHJvcGFnYXRpb24sIHByZXZlbnQgYnViYmxpbmcNCi0gICAgICAgICAgaWYgKHN0b3BQcm9wYWdhdGlvbikgew0KLSAgICAgICAgICAgIGV2ZW50LmN1cnJlbnRTY29wZSA9IG51bGw7DQotICAgICAgICAgICAgcmV0dXJuIGV2ZW50Ow0KLSAgICAgICAgICB9DQotICAgICAgICAgIC8vdHJhdmVyc2UgdXB3YXJkcw0KLSAgICAgICAgICBzY29wZSA9IHNjb3BlLiRwYXJlbnQ7DQotICAgICAgICB9IHdoaWxlIChzY29wZSk7DQotDQotICAgICAgICBldmVudC5jdXJyZW50U2NvcGUgPSBudWxsOw0KLQ0KLSAgICAgICAgcmV0dXJuIGV2ZW50Ow0KLSAgICAgIH0sDQotDQotDQotICAgICAgLyoqDQotICAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGJyb2FkY2FzdA0KLSAgICAgICAqIEBraW5kIGZ1bmN0aW9uDQotICAgICAgICoNCi0gICAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IGBuYW1lYCBkb3dud2FyZHMgdG8gYWxsIGNoaWxkIHNjb3BlcyAoYW5kIHRoZWlyIGNoaWxkcmVuKSBub3RpZnlpbmcgdGhlDQotICAgICAgICogcmVnaXN0ZXJlZCB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb259IGxpc3RlbmVycy4NCi0gICAgICAgKg0KLSAgICAgICAqIFRoZSBldmVudCBsaWZlIGN5Y2xlIHN0YXJ0cyBhdCB0aGUgc2NvcGUgb24gd2hpY2ggYCRicm9hZGNhc3RgIHdhcyBjYWxsZWQuIEFsbA0KLSAgICAgICAqIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbiBsaXN0ZW5lcnN9IGxpc3RlbmluZyBmb3IgYG5hbWVgIGV2ZW50IG9uIHRoaXMgc2NvcGUgZ2V0DQotICAgICAgICogbm90aWZpZWQuIEFmdGVyd2FyZHMsIHRoZSBldmVudCBwcm9wYWdhdGVzIHRvIGFsbCBkaXJlY3QgYW5kIGluZGlyZWN0IHNjb3BlcyBvZiB0aGUgY3VycmVudA0KLSAgICAgICAqIHNjb3BlIGFuZCBjYWxscyBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgYWxvbmcgdGhlIHdheS4gVGhlIGV2ZW50IGNhbm5vdCBiZSBjYW5jZWxlZC4NCi0gICAgICAgKg0KLSAgICAgICAqIEFueSBleGNlcHRpb24gZW1pdHRlZCBmcm9tIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb24gbGlzdGVuZXJzfSB3aWxsIGJlIHBhc3NlZA0KLSAgICAgICAqIG9udG8gdGhlIHtAbGluayBuZy4kZXhjZXB0aW9uSGFuZGxlciAkZXhjZXB0aW9uSGFuZGxlcn0gc2VydmljZS4NCi0gICAgICAgKg0KLSAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEV2ZW50IG5hbWUgdG8gYnJvYWRjYXN0Lg0KLSAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBPcHRpb25hbCBvbmUgb3IgbW9yZSBhcmd1bWVudHMgd2hpY2ggd2lsbCBiZSBwYXNzZWQgb250byB0aGUgZXZlbnQgbGlzdGVuZXJzLg0KLSAgICAgICAqIEByZXR1cm4ge09iamVjdH0gRXZlbnQgb2JqZWN0LCBzZWUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJG9ufQ0KLSAgICAgICAqLw0KLSAgICAgICRicm9hZGNhc3Q6IGZ1bmN0aW9uKG5hbWUsIGFyZ3MpIHsNCi0gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLA0KLSAgICAgICAgICAgIGN1cnJlbnQgPSB0YXJnZXQsDQotICAgICAgICAgICAgbmV4dCA9IHRhcmdldCwNCi0gICAgICAgICAgICBldmVudCA9IHsNCi0gICAgICAgICAgICAgIG5hbWU6IG5hbWUsDQotICAgICAgICAgICAgICB0YXJnZXRTY29wZTogdGFyZ2V0LA0KLSAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZQ0KLSAgICAgICAgICAgIH07DQotDQotICAgICAgICBpZiAoIXRhcmdldC4kJGxpc3RlbmVyQ291bnRbbmFtZV0pIHJldHVybiBldmVudDsNCi0NCi0gICAgICAgIHZhciBsaXN0ZW5lckFyZ3MgPSBjb25jYXQoW2V2ZW50XSwgYXJndW1lbnRzLCAxKSwNCi0gICAgICAgICAgICBsaXN0ZW5lcnMsIGksIGxlbmd0aDsNCi0NCi0gICAgICAgIC8vZG93biB3aGlsZSB5b3UgY2FuLCB0aGVuIHVwIGFuZCBuZXh0IHNpYmxpbmcgb3IgdXAgYW5kIG5leHQgc2libGluZyB1bnRpbCBiYWNrIGF0IHJvb3QNCi0gICAgICAgIHdoaWxlICgoY3VycmVudCA9IG5leHQpKSB7DQotICAgICAgICAgIGV2ZW50LmN1cnJlbnRTY29wZSA9IGN1cnJlbnQ7DQotICAgICAgICAgIGxpc3RlbmVycyA9IGN1cnJlbnQuJCRsaXN0ZW5lcnNbbmFtZV0gfHwgW107DQotICAgICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIC8vIGlmIGxpc3RlbmVycyB3ZXJlIGRlcmVnaXN0ZXJlZCwgZGVmcmFnbWVudCB0aGUgYXJyYXkNCi0gICAgICAgICAgICBpZiAoIWxpc3RlbmVyc1tpXSkgew0KLSAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTsNCi0gICAgICAgICAgICAgIGktLTsNCi0gICAgICAgICAgICAgIGxlbmd0aC0tOw0KLSAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkobnVsbCwgbGlzdGVuZXJBcmdzKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChlKSB7DQotICAgICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgLy8gSW5zYW5pdHkgV2FybmluZzogc2NvcGUgZGVwdGgtZmlyc3QgdHJhdmVyc2FsDQotICAgICAgICAgIC8vIHllcywgdGhpcyBjb2RlIGlzIGEgYml0IGNyYXp5LCBidXQgaXQgd29ya3MgYW5kIHdlIGhhdmUgdGVzdHMgdG8gcHJvdmUgaXQhDQotICAgICAgICAgIC8vIHRoaXMgcGllY2Ugc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB0cmF2ZXJzYWwgaW4gJGRpZ2VzdA0KLSAgICAgICAgICAvLyAodGhvdWdoIGl0IGRpZmZlcnMgZHVlIHRvIGhhdmluZyB0aGUgZXh0cmEgY2hlY2sgZm9yICQkbGlzdGVuZXJDb3VudCkNCi0gICAgICAgICAgaWYgKCEobmV4dCA9ICgoY3VycmVudC4kJGxpc3RlbmVyQ291bnRbbmFtZV0gJiYgY3VycmVudC4kJGNoaWxkSGVhZCkgfHwNCi0gICAgICAgICAgICAgIChjdXJyZW50ICE9PSB0YXJnZXQgJiYgY3VycmVudC4kJG5leHRTaWJsaW5nKSkpKSB7DQotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT09IHRhcmdldCAmJiAhKG5leHQgPSBjdXJyZW50LiQkbmV4dFNpYmxpbmcpKSB7DQotICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC4kcGFyZW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZXZlbnQuY3VycmVudFNjb3BlID0gbnVsbDsNCi0gICAgICAgIHJldHVybiBldmVudDsNCi0gICAgICB9DQotICAgIH07DQotDQotICAgIHZhciAkcm9vdFNjb3BlID0gbmV3IFNjb3BlKCk7DQotDQotICAgIC8vVGhlIGludGVybmFsIHF1ZXVlcy4gRXhwb3NlIHRoZW0gb24gdGhlICRyb290U2NvcGUgZm9yIGRlYnVnZ2luZy90ZXN0aW5nIHB1cnBvc2VzLg0KLSAgICB2YXIgYXN5bmNRdWV1ZSA9ICRyb290U2NvcGUuJCRhc3luY1F1ZXVlID0gW107DQotICAgIHZhciBwb3N0RGlnZXN0UXVldWUgPSAkcm9vdFNjb3BlLiQkcG9zdERpZ2VzdFF1ZXVlID0gW107DQotICAgIHZhciBhcHBseUFzeW5jUXVldWUgPSAkcm9vdFNjb3BlLiQkYXBwbHlBc3luY1F1ZXVlID0gW107DQotDQotICAgIHJldHVybiAkcm9vdFNjb3BlOw0KLQ0KLQ0KLSAgICBmdW5jdGlvbiBiZWdpblBoYXNlKHBoYXNlKSB7DQotICAgICAgaWYgKCRyb290U2NvcGUuJCRwaGFzZSkgew0KLSAgICAgICAgdGhyb3cgJHJvb3RTY29wZU1pbkVycignaW5wcm9nJywgJ3swfSBhbHJlYWR5IGluIHByb2dyZXNzJywgJHJvb3RTY29wZS4kJHBoYXNlKTsNCi0gICAgICB9DQotDQotICAgICAgJHJvb3RTY29wZS4kJHBoYXNlID0gcGhhc2U7DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gY2xlYXJQaGFzZSgpIHsNCi0gICAgICAkcm9vdFNjb3BlLiQkcGhhc2UgPSBudWxsOw0KLSAgICB9DQotDQotDQotICAgIGZ1bmN0aW9uIGRlY3JlbWVudExpc3RlbmVyQ291bnQoY3VycmVudCwgY291bnQsIG5hbWUpIHsNCi0gICAgICBkbyB7DQotICAgICAgICBjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSAtPSBjb3VudDsNCi0NCi0gICAgICAgIGlmIChjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSA9PT0gMCkgew0KLSAgICAgICAgICBkZWxldGUgY3VycmVudC4kJGxpc3RlbmVyQ291bnRbbmFtZV07DQotICAgICAgICB9DQotICAgICAgfSB3aGlsZSAoKGN1cnJlbnQgPSBjdXJyZW50LiRwYXJlbnQpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogZnVuY3Rpb24gdXNlZCBhcyBhbiBpbml0aWFsIHZhbHVlIGZvciB3YXRjaGVycy4NCi0gICAgICogYmVjYXVzZSBpdCdzIHVuaXF1ZSB3ZSBjYW4gZWFzaWx5IHRlbGwgaXQgYXBhcnQgZnJvbSBvdGhlciB2YWx1ZXMNCi0gICAgICovDQotICAgIGZ1bmN0aW9uIGluaXRXYXRjaFZhbCgpIHt9DQotDQotICAgIGZ1bmN0aW9uIGZsdXNoQXBwbHlBc3luYygpIHsNCi0gICAgICB3aGlsZSAoYXBwbHlBc3luY1F1ZXVlLmxlbmd0aCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgYXBwbHlBc3luY1F1ZXVlLnNoaWZ0KCkoKTsNCi0gICAgICAgIH0gY2F0Y2ggKGUpIHsNCi0gICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIGFwcGx5QXN5bmNJZCA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gc2NoZWR1bGVBcHBseUFzeW5jKCkgew0KLSAgICAgIGlmIChhcHBseUFzeW5jSWQgPT09IG51bGwpIHsNCi0gICAgICAgIGFwcGx5QXN5bmNJZCA9ICRicm93c2VyLmRlZmVyKGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAkcm9vdFNjb3BlLiRhcHBseShmbHVzaEFwcGx5QXN5bmMpOw0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLSAgICB9DQotICB9XTsNCi19DQotDQotLyoqDQotICogQGRlc2NyaXB0aW9uDQotICogUHJpdmF0ZSBzZXJ2aWNlIHRvIHNhbml0aXplIHVyaXMgZm9yIGxpbmtzIGFuZCBpbWFnZXMuIFVzZWQgYnkgJGNvbXBpbGUgYW5kICRzYW5pdGl6ZS4NCi0gKi8NCi1mdW5jdGlvbiAkJFNhbml0aXplVXJpUHJvdmlkZXIoKSB7DQotICB2YXIgYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSAvXlxzKihodHRwcz98ZnRwfG1haWx0b3x0ZWx8ZmlsZSk6LywNCi0gICAgaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0ID0gL15ccyooKGh0dHBzP3xmdHB8ZmlsZXxibG9iKTp8ZGF0YTppbWFnZVwvKS87DQotDQotICAvKioNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogUmV0cmlldmVzIG9yIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIGZvciB3aGl0ZWxpc3Rpbmcgb2Ygc2FmZQ0KLSAgICogdXJscyBkdXJpbmcgYVtocmVmXSBzYW5pdGl6YXRpb24uDQotICAgKg0KLSAgICogVGhlIHNhbml0aXphdGlvbiBpcyBhIHNlY3VyaXR5IG1lYXN1cmUgYWltZWQgYXQgcHJldmVudCBYU1MgYXR0YWNrcyB2aWEgaHRtbCBsaW5rcy4NCi0gICAqDQotICAgKiBBbnkgdXJsIGFib3V0IHRvIGJlIGFzc2lnbmVkIHRvIGFbaHJlZl0gdmlhIGRhdGEtYmluZGluZyBpcyBmaXJzdCBub3JtYWxpemVkIGFuZCB0dXJuZWQgaW50bw0KLSAgICogYW4gYWJzb2x1dGUgdXJsLiBBZnRlcndhcmRzLCB0aGUgdXJsIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgYGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0YA0KLSAgICogcmVndWxhciBleHByZXNzaW9uLiBJZiBhIG1hdGNoIGlzIGZvdW5kLCB0aGUgb3JpZ2luYWwgdXJsIGlzIHdyaXR0ZW4gaW50byB0aGUgZG9tLiBPdGhlcndpc2UsDQotICAgKiB0aGUgYWJzb2x1dGUgdXJsIGlzIHByZWZpeGVkIHdpdGggYCd1bnNhZmU6J2Agc3RyaW5nIGFuZCBvbmx5IHRoZW4gaXMgaXQgd3JpdHRlbiBpbnRvIHRoZSBET00uDQotICAgKg0KLSAgICogQHBhcmFtIHtSZWdFeHA9fSByZWdleHAgTmV3IHJlZ2V4cCB0byB3aGl0ZWxpc3QgdXJscyB3aXRoLg0KLSAgICogQHJldHVybnMge1JlZ0V4cHxuZy4kY29tcGlsZVByb3ZpZGVyfSBDdXJyZW50IFJlZ0V4cCBpZiBjYWxsZWQgd2l0aG91dCB2YWx1ZSBvciBzZWxmIGZvcg0KLSAgICogICAgY2hhaW5pbmcgb3RoZXJ3aXNlLg0KLSAgICovDQotICB0aGlzLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0ID0gZnVuY3Rpb24ocmVnZXhwKSB7DQotICAgIGlmIChpc0RlZmluZWQocmVnZXhwKSkgew0KLSAgICAgIGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0ID0gcmVnZXhwOw0KLSAgICAgIHJldHVybiB0aGlzOw0KLSAgICB9DQotICAgIHJldHVybiBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdDsNCi0gIH07DQotDQotDQotICAvKioNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogUmV0cmlldmVzIG9yIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIGZvciB3aGl0ZWxpc3Rpbmcgb2Ygc2FmZQ0KLSAgICogdXJscyBkdXJpbmcgaW1nW3NyY10gc2FuaXRpemF0aW9uLg0KLSAgICoNCi0gICAqIFRoZSBzYW5pdGl6YXRpb24gaXMgYSBzZWN1cml0eSBtZWFzdXJlIGFpbWVkIGF0IHByZXZlbnQgWFNTIGF0dGFja3MgdmlhIGh0bWwgbGlua3MuDQotICAgKg0KLSAgICogQW55IHVybCBhYm91dCB0byBiZSBhc3NpZ25lZCB0byBpbWdbc3JjXSB2aWEgZGF0YS1iaW5kaW5nIGlzIGZpcnN0IG5vcm1hbGl6ZWQgYW5kIHR1cm5lZCBpbnRvDQotICAgKiBhbiBhYnNvbHV0ZSB1cmwuIEFmdGVyd2FyZHMsIHRoZSB1cmwgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBgaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0YA0KLSAgICogcmVndWxhciBleHByZXNzaW9uLiBJZiBhIG1hdGNoIGlzIGZvdW5kLCB0aGUgb3JpZ2luYWwgdXJsIGlzIHdyaXR0ZW4gaW50byB0aGUgZG9tLiBPdGhlcndpc2UsDQotICAgKiB0aGUgYWJzb2x1dGUgdXJsIGlzIHByZWZpeGVkIHdpdGggYCd1bnNhZmU6J2Agc3RyaW5nIGFuZCBvbmx5IHRoZW4gaXMgaXQgd3JpdHRlbiBpbnRvIHRoZSBET00uDQotICAgKg0KLSAgICogQHBhcmFtIHtSZWdFeHA9fSByZWdleHAgTmV3IHJlZ2V4cCB0byB3aGl0ZWxpc3QgdXJscyB3aXRoLg0KLSAgICogQHJldHVybnMge1JlZ0V4cHxuZy4kY29tcGlsZVByb3ZpZGVyfSBDdXJyZW50IFJlZ0V4cCBpZiBjYWxsZWQgd2l0aG91dCB2YWx1ZSBvciBzZWxmIGZvcg0KLSAgICogICAgY2hhaW5pbmcgb3RoZXJ3aXNlLg0KLSAgICovDQotICB0aGlzLmltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCA9IGZ1bmN0aW9uKHJlZ2V4cCkgew0KLSAgICBpZiAoaXNEZWZpbmVkKHJlZ2V4cCkpIHsNCi0gICAgICBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSByZWdleHA7DQotICAgICAgcmV0dXJuIHRoaXM7DQotICAgIH0NCi0gICAgcmV0dXJuIGltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdDsNCi0gIH07DQotDQotICB0aGlzLiRnZXQgPSBmdW5jdGlvbigpIHsNCi0gICAgcmV0dXJuIGZ1bmN0aW9uIHNhbml0aXplVXJpKHVyaSwgaXNJbWFnZSkgew0KLSAgICAgIHZhciByZWdleCA9IGlzSW1hZ2UgPyBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QgOiBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdDsNCi0gICAgICB2YXIgbm9ybWFsaXplZFZhbDsNCi0gICAgICBub3JtYWxpemVkVmFsID0gdXJsUmVzb2x2ZSh1cmkpLmhyZWY7DQotICAgICAgaWYgKG5vcm1hbGl6ZWRWYWwgIT09ICcnICYmICFub3JtYWxpemVkVmFsLm1hdGNoKHJlZ2V4KSkgew0KLSAgICAgICAgcmV0dXJuICd1bnNhZmU6JyArIG5vcm1hbGl6ZWRWYWw7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB1cmk7DQotICAgIH07DQotICB9Ow0KLX0NCi0NCi12YXIgJHNjZU1pbkVyciA9IG1pbkVycignJHNjZScpOw0KLQ0KLXZhciBTQ0VfQ09OVEVYVFMgPSB7DQotICBIVE1MOiAnaHRtbCcsDQotICBDU1M6ICdjc3MnLA0KLSAgVVJMOiAndXJsJywNCi0gIC8vIFJFU09VUkNFX1VSTCBpcyBhIHN1YnR5cGUgb2YgVVJMIHVzZWQgaW4gY29udGV4dHMgd2hlcmUgYSBwcml2aWxlZ2VkIHJlc291cmNlIGlzIHNvdXJjZWQgZnJvbSBhDQotICAvLyB1cmwuICAoZS5nLiBuZy1pbmNsdWRlLCBzY3JpcHQgc3JjLCB0ZW1wbGF0ZVVybCkNCi0gIFJFU09VUkNFX1VSTDogJ3Jlc291cmNlVXJsJywNCi0gIEpTOiAnanMnDQotfTsNCi0NCi0vLyBIZWxwZXIgZnVuY3Rpb25zIGZvbGxvdy4NCi0NCi1mdW5jdGlvbiBhZGp1c3RNYXRjaGVyKG1hdGNoZXIpIHsNCi0gIGlmIChtYXRjaGVyID09PSAnc2VsZicpIHsNCi0gICAgcmV0dXJuIG1hdGNoZXI7DQotICB9IGVsc2UgaWYgKGlzU3RyaW5nKG1hdGNoZXIpKSB7DQotICAgIC8vIFN0cmluZ3MgbWF0Y2ggZXhhY3RseSBleGNlcHQgZm9yIDIgd2lsZGNhcmRzIC0gJyonIGFuZCAnKionLg0KLSAgICAvLyAnKicgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGV4Y2VwdCB0aG9zZSBmcm9tIHRoZSBzZXQgJzovLj8mJy4NCi0gICAgLy8gJyoqJyBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgKGxpa2UgLiogaW4gYSBSZWdFeHApLg0KLSAgICAvLyBNb3JlIHRoYW4gMiAqJ3MgcmFpc2VzIGFuIGVycm9yIGFzIGl0J3MgaWxsIGRlZmluZWQuDQotICAgIGlmIChtYXRjaGVyLmluZGV4T2YoJyoqKicpID4gLTEpIHsNCi0gICAgICB0aHJvdyAkc2NlTWluRXJyKCdpd2NhcmQnLA0KLSAgICAgICAgICAnSWxsZWdhbCBzZXF1ZW5jZSAqKiogaW4gc3RyaW5nIG1hdGNoZXIuICBTdHJpbmc6IHswfScsIG1hdGNoZXIpOw0KLSAgICB9DQotICAgIG1hdGNoZXIgPSBlc2NhcGVGb3JSZWdleHAobWF0Y2hlcikuDQotICAgICAgICAgICAgICAgICAgcmVwbGFjZSgnXFwqXFwqJywgJy4qJykuDQotICAgICAgICAgICAgICAgICAgcmVwbGFjZSgnXFwqJywgJ1teOi8uPyY7XSonKTsNCi0gICAgcmV0dXJuIG5ldyBSZWdFeHAoJ14nICsgbWF0Y2hlciArICckJyk7DQotICB9IGVsc2UgaWYgKGlzUmVnRXhwKG1hdGNoZXIpKSB7DQotICAgIC8vIFRoZSBvbmx5IG90aGVyIHR5cGUgb2YgbWF0Y2hlciBhbGxvd2VkIGlzIGEgUmVnZXhwLg0KLSAgICAvLyBNYXRjaCBlbnRpcmUgVVJMIC8gZGlzYWxsb3cgcGFydGlhbCBtYXRjaGVzLg0KLSAgICAvLyBGbGFncyBhcmUgcmVzZXQgKGkuZS4gbm8gZ2xvYmFsLCBpZ25vcmVDYXNlIG9yIG11bHRpbGluZSkNCi0gICAgcmV0dXJuIG5ldyBSZWdFeHAoJ14nICsgbWF0Y2hlci5zb3VyY2UgKyAnJCcpOw0KLSAgfSBlbHNlIHsNCi0gICAgdGhyb3cgJHNjZU1pbkVycignaW1hdGNoZXInLA0KLSAgICAgICAgJ01hdGNoZXJzIG1heSBvbmx5IGJlICJzZWxmIiwgc3RyaW5nIHBhdHRlcm5zIG9yIFJlZ0V4cCBvYmplY3RzJyk7DQotICB9DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGFkanVzdE1hdGNoZXJzKG1hdGNoZXJzKSB7DQotICB2YXIgYWRqdXN0ZWRNYXRjaGVycyA9IFtdOw0KLSAgaWYgKGlzRGVmaW5lZChtYXRjaGVycykpIHsNCi0gICAgZm9yRWFjaChtYXRjaGVycywgZnVuY3Rpb24obWF0Y2hlcikgew0KLSAgICAgIGFkanVzdGVkTWF0Y2hlcnMucHVzaChhZGp1c3RNYXRjaGVyKG1hdGNoZXIpKTsNCi0gICAgfSk7DQotICB9DQotICByZXR1cm4gYWRqdXN0ZWRNYXRjaGVyczsNCi19DQotDQotDQotLyoqDQotICogQG5nZG9jIHNlcnZpY2UNCi0gKiBAbmFtZSAkc2NlRGVsZWdhdGUNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICoNCi0gKiBgJHNjZURlbGVnYXRlYCBpcyBhIHNlcnZpY2UgdGhhdCBpcyB1c2VkIGJ5IHRoZSBgJHNjZWAgc2VydmljZSB0byBwcm92aWRlIHtAbGluayBuZy4kc2NlIFN0cmljdA0KLSAqIENvbnRleHR1YWwgRXNjYXBpbmcgKFNDRSl9IHNlcnZpY2VzIHRvIEFuZ3VsYXJKUy4NCi0gKg0KLSAqIFR5cGljYWxseSwgeW91IHdvdWxkIGNvbmZpZ3VyZSBvciBvdmVycmlkZSB0aGUge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSAkc2NlRGVsZWdhdGV9IGluc3RlYWQgb2YNCi0gKiB0aGUgYCRzY2VgIHNlcnZpY2UgdG8gY3VzdG9taXplIHRoZSB3YXkgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgd29ya3MgaW4gQW5ndWxhckpTLiAgVGhpcyBpcw0KLSAqIGJlY2F1c2UsIHdoaWxlIHRoZSBgJHNjZWAgcHJvdmlkZXMgbnVtZXJvdXMgc2hvcnRoYW5kIG1ldGhvZHMsIGV0Yy4sIHlvdSByZWFsbHkgb25seSBuZWVkIHRvDQotICogb3ZlcnJpZGUgMyBjb3JlIGZ1bmN0aW9ucyAoYHRydXN0QXNgLCBgZ2V0VHJ1c3RlZGAgYW5kIGB2YWx1ZU9mYCkgdG8gcmVwbGFjZSB0aGUgd2F5IHRoaW5ncw0KLSAqIHdvcmsgYmVjYXVzZSBgJHNjZWAgZGVsZWdhdGVzIHRvIGAkc2NlRGVsZWdhdGVgIGZvciB0aGVzZSBvcGVyYXRpb25zLg0KLSAqDQotICogUmVmZXIge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyICRzY2VEZWxlZ2F0ZVByb3ZpZGVyfSB0byBjb25maWd1cmUgdGhpcyBzZXJ2aWNlLg0KLSAqDQotICogVGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgYCRzY2VEZWxlZ2F0ZWAgc2hvdWxkIHdvcmsgb3V0IG9mIHRoZSBib3ggd2l0aCBsaXR0bGUgcGFpbi4gIFdoaWxlIHlvdQ0KLSAqIGNhbiBvdmVycmlkZSBpdCBjb21wbGV0ZWx5IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgYCRzY2VgLCB0aGUgY29tbW9uIGNhc2Ugd291bGQNCi0gKiBpbnZvbHZlIGNvbmZpZ3VyaW5nIHRoZSB7QGxpbmsgbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIgJHNjZURlbGVnYXRlUHJvdmlkZXJ9IGluc3RlYWQgYnkgc2V0dGluZw0KLSAqIHlvdXIgb3duIHdoaXRlbGlzdHMgYW5kIGJsYWNrbGlzdHMgZm9yIHRydXN0aW5nIFVSTHMgdXNlZCBmb3IgbG9hZGluZyBBbmd1bGFySlMgcmVzb3VyY2VzIHN1Y2ggYXMNCi0gKiB0ZW1wbGF0ZXMuICBSZWZlciB7QGxpbmsgbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxXaGl0ZWxpc3QNCi0gKiAkc2NlRGVsZWdhdGVQcm92aWRlci5yZXNvdXJjZVVybFdoaXRlbGlzdH0gYW5kIHtAbGluaw0KLSAqIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsQmxhY2tsaXN0ICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsQmxhY2tsaXN0fQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBwcm92aWRlcg0KLSAqIEBuYW1lICRzY2VEZWxlZ2F0ZVByb3ZpZGVyDQotICogQGRlc2NyaXB0aW9uDQotICoNCi0gKiBUaGUgYCRzY2VEZWxlZ2F0ZVByb3ZpZGVyYCBwcm92aWRlciBhbGxvd3MgZGV2ZWxvcGVycyB0byBjb25maWd1cmUgdGhlIHtAbGluayBuZy4kc2NlRGVsZWdhdGUNCi0gKiAkc2NlRGVsZWdhdGV9IHNlcnZpY2UuICBUaGlzIGFsbG93cyBvbmUgdG8gZ2V0L3NldCB0aGUgd2hpdGVsaXN0cyBhbmQgYmxhY2tsaXN0cyB1c2VkIHRvIGVuc3VyZQ0KLSAqIHRoYXQgdGhlIFVSTHMgdXNlZCBmb3Igc291cmNpbmcgQW5ndWxhciB0ZW1wbGF0ZXMgYXJlIHNhZmUuICBSZWZlciB7QGxpbmsNCi0gKiBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybFdoaXRlbGlzdCAkc2NlRGVsZWdhdGVQcm92aWRlci5yZXNvdXJjZVVybFdoaXRlbGlzdH0gYW5kDQotICoge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsQmxhY2tsaXN0ICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsQmxhY2tsaXN0fQ0KLSAqDQotICogRm9yIHRoZSBnZW5lcmFsIGRldGFpbHMgYWJvdXQgdGhpcyBzZXJ2aWNlIGluIEFuZ3VsYXIsIHJlYWQgdGhlIG1haW4gcGFnZSBmb3Ige0BsaW5rIG5nLiRzY2UNCi0gKiBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKX0uDQotICoNCi0gKiAqKkV4YW1wbGUqKjogIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY2FzZS4gPGEgbmFtZT0iZXhhbXBsZSI+PC9hPg0KLSAqDQotICogLSB5b3VyIGFwcCBpcyBob3N0ZWQgYXQgdXJsIGBodHRwOi8vbXlhcHAuZXhhbXBsZS5jb20vYA0KLSAqIC0gYnV0IHNvbWUgb2YgeW91ciB0ZW1wbGF0ZXMgYXJlIGhvc3RlZCBvbiBvdGhlciBkb21haW5zIHlvdSBjb250cm9sIHN1Y2ggYXMNCi0gKiAgIGBodHRwOi8vc3J2MDEuYXNzZXRzLmV4YW1wbGUuY29tL2AswqAgYGh0dHA6Ly9zcnYwMi5hc3NldHMuZXhhbXBsZS5jb20vYCwgZXRjLg0KLSAqIC0gYW5kIHlvdSBoYXZlIGFuIG9wZW4gcmVkaXJlY3QgYXQgYGh0dHA6Ly9teWFwcC5leGFtcGxlLmNvbS9jbGlja1RocnU/Li4uYC4NCi0gKg0KLSAqIEhlcmUgaXMgd2hhdCBhIHNlY3VyZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHNjZW5hcmlvIG1pZ2h0IGxvb2sgbGlrZToNCi0gKg0KLSAqIGBgYA0KLSAqICBhbmd1bGFyLm1vZHVsZSgnbXlBcHAnLCBbXSkuY29uZmlnKGZ1bmN0aW9uKCRzY2VEZWxlZ2F0ZVByb3ZpZGVyKSB7DQotICogICAgJHNjZURlbGVnYXRlUHJvdmlkZXIucmVzb3VyY2VVcmxXaGl0ZWxpc3QoWw0KLSAqICAgICAgLy8gQWxsb3cgc2FtZSBvcmlnaW4gcmVzb3VyY2UgbG9hZHMuDQotICogICAgICAnc2VsZicsDQotICogICAgICAvLyBBbGxvdyBsb2FkaW5nIGZyb20gb3VyIGFzc2V0cyBkb21haW4uICBOb3RpY2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAqIGFuZCAqKi4NCi0gKiAgICAgICdodHRwOi8vc3J2Ki5hc3NldHMuZXhhbXBsZS5jb20vKionDQotICogICAgXSk7DQotICoNCi0gKiAgICAvLyBUaGUgYmxhY2tsaXN0IG92ZXJyaWRlcyB0aGUgd2hpdGVsaXN0IHNvIHRoZSBvcGVuIHJlZGlyZWN0IGhlcmUgaXMgYmxvY2tlZC4NCi0gKiAgICAkc2NlRGVsZWdhdGVQcm92aWRlci5yZXNvdXJjZVVybEJsYWNrbGlzdChbDQotICogICAgICAnaHR0cDovL215YXBwLmV4YW1wbGUuY29tL2NsaWNrVGhydSoqJw0KLSAqICAgIF0pOw0KLSAqICB9KTsNCi0gKiBgYGANCi0gKi8NCi0NCi1mdW5jdGlvbiAkU2NlRGVsZWdhdGVQcm92aWRlcigpIHsNCi0gIHRoaXMuU0NFX0NPTlRFWFRTID0gU0NFX0NPTlRFWFRTOw0KLQ0KLSAgLy8gUmVzb3VyY2UgVVJMcyBjYW4gYWxzbyBiZSB0cnVzdGVkIGJ5IHBvbGljeS4NCi0gIHZhciByZXNvdXJjZVVybFdoaXRlbGlzdCA9IFsnc2VsZiddLA0KLSAgICAgIHJlc291cmNlVXJsQmxhY2tsaXN0ID0gW107DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lICRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0DQotICAgKiBAa2luZCBmdW5jdGlvbg0KLSAgICoNCi0gICAqIEBwYXJhbSB7QXJyYXk9fSB3aGl0ZWxpc3QgV2hlbiBwcm92aWRlZCwgcmVwbGFjZXMgdGhlIHJlc291cmNlVXJsV2hpdGVsaXN0IHdpdGggdGhlIHZhbHVlDQotICAgKiAgICAgcHJvdmlkZWQuICBUaGlzIG11c3QgYmUgYW4gYXJyYXkgb3IgbnVsbC4gIEEgc25hcHNob3Qgb2YgdGhpcyBhcnJheSBpcyB1c2VkIHNvIGZ1cnRoZXINCi0gICAqICAgICBjaGFuZ2VzIHRvIHRoZSBhcnJheSBhcmUgaWdub3JlZC4NCi0gICAqDQotICAgKiAgICAgRm9sbG93IHtAbGluayBuZy4kc2NlI3Jlc291cmNlVXJsUGF0dGVybkl0ZW0gdGhpcyBsaW5rfSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaXRlbXMNCi0gICAqICAgICBhbGxvd2VkIGluIHRoaXMgYXJyYXkuDQotICAgKg0KLSAgICogICAgIE5vdGU6ICoqYW4gZW1wdHkgd2hpdGVsaXN0IGFycmF5IHdpbGwgYmxvY2sgYWxsIFVSTHMqKiENCi0gICAqDQotICAgKiBAcmV0dXJuIHtBcnJheX0gdGhlIGN1cnJlbnRseSBzZXQgd2hpdGVsaXN0IGFycmF5Lg0KLSAgICoNCi0gICAqIFRoZSAqKmRlZmF1bHQgdmFsdWUqKiB3aGVuIG5vIHdoaXRlbGlzdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldCBpcyBgWydzZWxmJ11gIGFsbG93aW5nIG9ubHkNCi0gICAqIHNhbWUgb3JpZ2luIHJlc291cmNlIHJlcXVlc3RzLg0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogU2V0cy9HZXRzIHRoZSB3aGl0ZWxpc3Qgb2YgdHJ1c3RlZCByZXNvdXJjZSBVUkxzLg0KLSAgICovDQotICB0aGlzLnJlc291cmNlVXJsV2hpdGVsaXN0ID0gZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHsNCi0gICAgICByZXNvdXJjZVVybFdoaXRlbGlzdCA9IGFkanVzdE1hdGNoZXJzKHZhbHVlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcmVzb3VyY2VVcmxXaGl0ZWxpc3Q7DQotICB9Ow0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSAkc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybEJsYWNrbGlzdA0KLSAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAqDQotICAgKiBAcGFyYW0ge0FycmF5PX0gYmxhY2tsaXN0IFdoZW4gcHJvdmlkZWQsIHJlcGxhY2VzIHRoZSByZXNvdXJjZVVybEJsYWNrbGlzdCB3aXRoIHRoZSB2YWx1ZQ0KLSAgICogICAgIHByb3ZpZGVkLiAgVGhpcyBtdXN0IGJlIGFuIGFycmF5IG9yIG51bGwuICBBIHNuYXBzaG90IG9mIHRoaXMgYXJyYXkgaXMgdXNlZCBzbyBmdXJ0aGVyDQotICAgKiAgICAgY2hhbmdlcyB0byB0aGUgYXJyYXkgYXJlIGlnbm9yZWQuDQotICAgKg0KLSAgICogICAgIEZvbGxvdyB7QGxpbmsgbmcuJHNjZSNyZXNvdXJjZVVybFBhdHRlcm5JdGVtIHRoaXMgbGlua30gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGl0ZW1zDQotICAgKiAgICAgYWxsb3dlZCBpbiB0aGlzIGFycmF5Lg0KLSAgICoNCi0gICAqICAgICBUaGUgdHlwaWNhbCB1c2FnZSBmb3IgdGhlIGJsYWNrbGlzdCBpcyB0byAqKmJsb2NrDQotICAgKiAgICAgW29wZW4gcmVkaXJlY3RzXShodHRwOi8vY3dlLm1pdHJlLm9yZy9kYXRhL2RlZmluaXRpb25zLzYwMS5odG1sKSoqIHNlcnZlZCBieSB5b3VyIGRvbWFpbiBhcw0KLSAgICogICAgIHRoZXNlIHdvdWxkIG90aGVyd2lzZSBiZSB0cnVzdGVkIGJ1dCBhY3R1YWxseSByZXR1cm4gY29udGVudCBmcm9tIHRoZSByZWRpcmVjdGVkIGRvbWFpbi4NCi0gICAqDQotICAgKiAgICAgRmluYWxseSwgKip0aGUgYmxhY2tsaXN0IG92ZXJyaWRlcyB0aGUgd2hpdGVsaXN0KiogYW5kIGhhcyB0aGUgZmluYWwgc2F5Lg0KLSAgICoNCi0gICAqIEByZXR1cm4ge0FycmF5fSB0aGUgY3VycmVudGx5IHNldCBibGFja2xpc3QgYXJyYXkuDQotICAgKg0KLSAgICogVGhlICoqZGVmYXVsdCB2YWx1ZSoqIHdoZW4gbm8gd2hpdGVsaXN0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IGlzIHRoZSBlbXB0eSBhcnJheSAoaS5lLiB0aGVyZQ0KLSAgICogaXMgbm8gYmxhY2tsaXN0LikNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFNldHMvR2V0cyB0aGUgYmxhY2tsaXN0IG9mIHRydXN0ZWQgcmVzb3VyY2UgVVJMcy4NCi0gICAqLw0KLQ0KLSAgdGhpcy5yZXNvdXJjZVVybEJsYWNrbGlzdCA9IGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7DQotICAgICAgcmVzb3VyY2VVcmxCbGFja2xpc3QgPSBhZGp1c3RNYXRjaGVycyh2YWx1ZSk7DQotICAgIH0NCi0gICAgcmV0dXJuIHJlc291cmNlVXJsQmxhY2tsaXN0Ow0KLSAgfTsNCi0NCi0gIHRoaXMuJGdldCA9IFsnJGluamVjdG9yJywgZnVuY3Rpb24oJGluamVjdG9yKSB7DQotDQotICAgIHZhciBodG1sU2FuaXRpemVyID0gZnVuY3Rpb24gaHRtbFNhbml0aXplcihodG1sKSB7DQotICAgICAgdGhyb3cgJHNjZU1pbkVycigndW5zYWZlJywgJ0F0dGVtcHRpbmcgdG8gdXNlIGFuIHVuc2FmZSB2YWx1ZSBpbiBhIHNhZmUgY29udGV4dC4nKTsNCi0gICAgfTsNCi0NCi0gICAgaWYgKCRpbmplY3Rvci5oYXMoJyRzYW5pdGl6ZScpKSB7DQotICAgICAgaHRtbFNhbml0aXplciA9ICRpbmplY3Rvci5nZXQoJyRzYW5pdGl6ZScpOw0KLSAgICB9DQotDQotDQotICAgIGZ1bmN0aW9uIG1hdGNoVXJsKG1hdGNoZXIsIHBhcnNlZFVybCkgew0KLSAgICAgIGlmIChtYXRjaGVyID09PSAnc2VsZicpIHsNCi0gICAgICAgIHJldHVybiB1cmxJc1NhbWVPcmlnaW4ocGFyc2VkVXJsKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgLy8gZGVmaW5pdGVseSBhIHJlZ2V4LiAgU2VlIGFkanVzdE1hdGNoZXJzKCkNCi0gICAgICAgIHJldHVybiAhIW1hdGNoZXIuZXhlYyhwYXJzZWRVcmwuaHJlZik7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGlzUmVzb3VyY2VVcmxBbGxvd2VkQnlQb2xpY3kodXJsKSB7DQotICAgICAgdmFyIHBhcnNlZFVybCA9IHVybFJlc29sdmUodXJsLnRvU3RyaW5nKCkpOw0KLSAgICAgIHZhciBpLCBuLCBhbGxvd2VkID0gZmFsc2U7DQotICAgICAgLy8gRW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIGl0ZW0gZnJvbSB0aGUgd2hpdGVsaXN0IGFsbG93cyB0aGlzIHVybC4NCi0gICAgICBmb3IgKGkgPSAwLCBuID0gcmVzb3VyY2VVcmxXaGl0ZWxpc3QubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQotICAgICAgICBpZiAobWF0Y2hVcmwocmVzb3VyY2VVcmxXaGl0ZWxpc3RbaV0sIHBhcnNlZFVybCkpIHsNCi0gICAgICAgICAgYWxsb3dlZCA9IHRydWU7DQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICBpZiAoYWxsb3dlZCkgew0KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgbm8gaXRlbSBmcm9tIHRoZSBibGFja2xpc3QgYmxvY2tlZCB0aGlzIHVybC4NCi0gICAgICAgIGZvciAoaSA9IDAsIG4gPSByZXNvdXJjZVVybEJsYWNrbGlzdC5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCi0gICAgICAgICAgaWYgKG1hdGNoVXJsKHJlc291cmNlVXJsQmxhY2tsaXN0W2ldLCBwYXJzZWRVcmwpKSB7DQotICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBhbGxvd2VkOw0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGdlbmVyYXRlSG9sZGVyVHlwZShCYXNlKSB7DQotICAgICAgdmFyIGhvbGRlclR5cGUgPSBmdW5jdGlvbiBUcnVzdGVkVmFsdWVIb2xkZXJUeXBlKHRydXN0ZWRWYWx1ZSkgew0KLSAgICAgICAgdGhpcy4kJHVud3JhcFRydXN0ZWRWYWx1ZSA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICByZXR1cm4gdHJ1c3RlZFZhbHVlOw0KLSAgICAgICAgfTsNCi0gICAgICB9Ow0KLSAgICAgIGlmIChCYXNlKSB7DQotICAgICAgICBob2xkZXJUeXBlLnByb3RvdHlwZSA9IG5ldyBCYXNlKCk7DQotICAgICAgfQ0KLSAgICAgIGhvbGRlclR5cGUucHJvdG90eXBlLnZhbHVlT2YgPSBmdW5jdGlvbiBzY2VWYWx1ZU9mKCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuJCR1bndyYXBUcnVzdGVkVmFsdWUoKTsNCi0gICAgICB9Ow0KLSAgICAgIGhvbGRlclR5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gc2NlVG9TdHJpbmcoKSB7DQotICAgICAgICByZXR1cm4gdGhpcy4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpLnRvU3RyaW5nKCk7DQotICAgICAgfTsNCi0gICAgICByZXR1cm4gaG9sZGVyVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICB2YXIgdHJ1c3RlZFZhbHVlSG9sZGVyQmFzZSA9IGdlbmVyYXRlSG9sZGVyVHlwZSgpLA0KLSAgICAgICAgYnlUeXBlID0ge307DQotDQotICAgIGJ5VHlwZVtTQ0VfQ09OVEVYVFMuSFRNTF0gPSBnZW5lcmF0ZUhvbGRlclR5cGUodHJ1c3RlZFZhbHVlSG9sZGVyQmFzZSk7DQotICAgIGJ5VHlwZVtTQ0VfQ09OVEVYVFMuQ1NTXSA9IGdlbmVyYXRlSG9sZGVyVHlwZSh0cnVzdGVkVmFsdWVIb2xkZXJCYXNlKTsNCi0gICAgYnlUeXBlW1NDRV9DT05URVhUUy5VUkxdID0gZ2VuZXJhdGVIb2xkZXJUeXBlKHRydXN0ZWRWYWx1ZUhvbGRlckJhc2UpOw0KLSAgICBieVR5cGVbU0NFX0NPTlRFWFRTLkpTXSA9IGdlbmVyYXRlSG9sZGVyVHlwZSh0cnVzdGVkVmFsdWVIb2xkZXJCYXNlKTsNCi0gICAgYnlUeXBlW1NDRV9DT05URVhUUy5SRVNPVVJDRV9VUkxdID0gZ2VuZXJhdGVIb2xkZXJUeXBlKGJ5VHlwZVtTQ0VfQ09OVEVYVFMuVVJMXSk7DQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRzY2VEZWxlZ2F0ZSN0cnVzdEFzDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGlzIHRydXN0ZWQgYnkgYW5ndWxhciBmb3IgdXNlIGluIHNwZWNpZmllZCBzdHJpY3QNCi0gICAgICogY29udGV4dHVhbCBlc2NhcGluZyBjb250ZXh0cyAoc3VjaCBhcyBuZy1iaW5kLWh0bWwsIG5nLWluY2x1ZGUsIGFueSBzcmMNCi0gICAgICogYXR0cmlidXRlIGludGVycG9sYXRpb24sIGFueSBkb20gZXZlbnQgYmluZGluZyBhdHRyaWJ1dGUgaW50ZXJwb2xhdGlvbg0KLSAgICAgKiBzdWNoIGFzIGZvciBvbmNsaWNrLCAgZXRjLikgdGhhdCB1c2VzIHRoZSBwcm92aWRlZCB2YWx1ZS4NCi0gICAgICogU2VlIHtAbGluayBuZy4kc2NlICRzY2V9IGZvciBlbmFibGluZyBzdHJpY3QgY29udGV4dHVhbCBlc2NhcGluZy4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGtpbmQgb2YgY29udGV4dCBpbiB3aGljaCB0aGlzIHZhbHVlIGlzIHNhZmUgZm9yIHVzZS4gIGUuZy4gdXJsLA0KLSAgICAgKiAgIHJlc291cmNlVXJsLCBodG1sLCBqcyBhbmQgY3NzLg0KLSAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdHJ1c3RlZC9zYWZlLg0KLSAgICAgKiBAcmV0dXJucyB7Kn0gQSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0YW5kIGluIGZvciB0aGUgcHJvdmlkZWQgYHZhbHVlYCBpbiBwbGFjZXMNCi0gICAgICogd2hlcmUgQW5ndWxhciBleHBlY3RzIGEgJHNjZS50cnVzdEFzKCkgcmV0dXJuIHZhbHVlLg0KLSAgICAgKi8NCi0gICAgZnVuY3Rpb24gdHJ1c3RBcyh0eXBlLCB0cnVzdGVkVmFsdWUpIHsNCi0gICAgICB2YXIgQ29uc3RydWN0b3IgPSAoYnlUeXBlLmhhc093blByb3BlcnR5KHR5cGUpID8gYnlUeXBlW3R5cGVdIDogbnVsbCk7DQotICAgICAgaWYgKCFDb25zdHJ1Y3Rvcikgew0KLSAgICAgICAgdGhyb3cgJHNjZU1pbkVycignaWNvbnRleHQnLA0KLSAgICAgICAgICAgICdBdHRlbXB0ZWQgdG8gdHJ1c3QgYSB2YWx1ZSBpbiBpbnZhbGlkIGNvbnRleHQuIENvbnRleHQ6IHswfTsgVmFsdWU6IHsxfScsDQotICAgICAgICAgICAgdHlwZSwgdHJ1c3RlZFZhbHVlKTsNCi0gICAgICB9DQotICAgICAgaWYgKHRydXN0ZWRWYWx1ZSA9PT0gbnVsbCB8fCB0cnVzdGVkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0cnVzdGVkVmFsdWUgPT09ICcnKSB7DQotICAgICAgICByZXR1cm4gdHJ1c3RlZFZhbHVlOw0KLSAgICAgIH0NCi0gICAgICAvLyBBbGwgdGhlIGN1cnJlbnQgY29udGV4dHMgaW4gU0NFX0NPTlRFWFRTIGhhcHBlbiB0byBiZSBzdHJpbmdzLiAgSW4gb3JkZXIgdG8gYXZvaWQgdHJ1c3RpbmcNCi0gICAgICAvLyBtdXRhYmxlIG9iamVjdHMsIHdlIGVuc3VyZSBoZXJlIHRoYXQgdGhlIHZhbHVlIHBhc3NlZCBpbiBpcyBhY3R1YWxseSBhIHN0cmluZy4NCi0gICAgICBpZiAodHlwZW9mIHRydXN0ZWRWYWx1ZSAhPT0gJ3N0cmluZycpIHsNCi0gICAgICAgIHRocm93ICRzY2VNaW5FcnIoJ2l0eXBlJywNCi0gICAgICAgICAgICAnQXR0ZW1wdGVkIHRvIHRydXN0IGEgbm9uLXN0cmluZyB2YWx1ZSBpbiBhIGNvbnRlbnQgcmVxdWlyaW5nIGEgc3RyaW5nOiBDb250ZXh0OiB7MH0nLA0KLSAgICAgICAgICAgIHR5cGUpOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRydXN0ZWRWYWx1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICogQG5hbWUgJHNjZURlbGVnYXRlI3ZhbHVlT2YNCi0gICAgICoNCi0gICAgICogQGRlc2NyaXB0aW9uDQotICAgICAqIElmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGhhZCBiZWVuIHJldHVybmVkIGJ5IGEgcHJpb3IgY2FsbCB0byB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMNCi0gICAgICogYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0sIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgaGFkIGJlZW4gcGFzc2VkIHRvIHtAbGluaw0KLSAgICAgKiBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXNgfS4NCi0gICAgICoNCi0gICAgICogSWYgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaXMgbm90IGEgdmFsdWUgdGhhdCBoYWQgYmVlbiByZXR1cm5lZCBieSB7QGxpbmsNCi0gICAgICogbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0sIHJldHVybnMgaXQgYXMtaXMuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHJlc3VsdCBvZiBhIHByaW9yIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXNgfQ0KLSAgICAgKiAgICAgIGNhbGwgb3IgYW55dGhpbmcgZWxzZS4NCi0gICAgICogQHJldHVybnMgeyp9IFRoZSBgdmFsdWVgIHRoYXQgd2FzIG9yaWdpbmFsbHkgcHJvdmlkZWQgdG8ge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzDQotICAgICAqICAgICBgJHNjZURlbGVnYXRlLnRydXN0QXNgfSBpZiBgdmFsdWVgIGlzIHRoZSByZXN1bHQgb2Ygc3VjaCBhIGNhbGwuICBPdGhlcndpc2UsIHJldHVybnMNCi0gICAgICogICAgIGB2YWx1ZWAgdW5jaGFuZ2VkLg0KLSAgICAgKi8NCi0gICAgZnVuY3Rpb24gdmFsdWVPZihtYXliZVRydXN0ZWQpIHsNCi0gICAgICBpZiAobWF5YmVUcnVzdGVkIGluc3RhbmNlb2YgdHJ1c3RlZFZhbHVlSG9sZGVyQmFzZSkgew0KLSAgICAgICAgcmV0dXJuIG1heWJlVHJ1c3RlZC4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gbWF5YmVUcnVzdGVkOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgKiBAbmFtZSAkc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZA0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogVGFrZXMgdGhlIHJlc3VsdCBvZiBhIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXNgfSBjYWxsIGFuZA0KLSAgICAgKiByZXR1cm5zIHRoZSBvcmlnaW5hbGx5IHN1cHBsaWVkIHZhbHVlIGlmIHRoZSBxdWVyaWVkIGNvbnRleHQgdHlwZSBpcyBhIHN1cGVydHlwZSBvZiB0aGUNCi0gICAgICogY3JlYXRlZCB0eXBlLiAgSWYgdGhpcyBjb25kaXRpb24gaXNuJ3Qgc2F0aXNmaWVkLCB0aHJvd3MgYW4gZXhjZXB0aW9uLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUga2luZCBvZiBjb250ZXh0IGluIHdoaWNoIHRoaXMgdmFsdWUgaXMgdG8gYmUgdXNlZC4NCi0gICAgICogQHBhcmFtIHsqfSBtYXliZVRydXN0ZWQgVGhlIHJlc3VsdCBvZiBhIHByaW9yIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcw0KLSAgICAgKiAgICAgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0gY2FsbC4NCi0gICAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSB0aGUgd2FzIG9yaWdpbmFsbHkgcHJvdmlkZWQgdG8ge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzDQotICAgICAqICAgICBgJHNjZURlbGVnYXRlLnRydXN0QXNgfSBpZiB2YWxpZCBpbiB0aGlzIGNvbnRleHQuICBPdGhlcndpc2UsIHRocm93cyBhbiBleGNlcHRpb24uDQotICAgICAqLw0KLSAgICBmdW5jdGlvbiBnZXRUcnVzdGVkKHR5cGUsIG1heWJlVHJ1c3RlZCkgew0KLSAgICAgIGlmIChtYXliZVRydXN0ZWQgPT09IG51bGwgfHwgbWF5YmVUcnVzdGVkID09PSB1bmRlZmluZWQgfHwgbWF5YmVUcnVzdGVkID09PSAnJykgew0KLSAgICAgICAgcmV0dXJuIG1heWJlVHJ1c3RlZDsNCi0gICAgICB9DQotICAgICAgdmFyIGNvbnN0cnVjdG9yID0gKGJ5VHlwZS5oYXNPd25Qcm9wZXJ0eSh0eXBlKSA/IGJ5VHlwZVt0eXBlXSA6IG51bGwpOw0KLSAgICAgIGlmIChjb25zdHJ1Y3RvciAmJiBtYXliZVRydXN0ZWQgaW5zdGFuY2VvZiBjb25zdHJ1Y3Rvcikgew0KLSAgICAgICAgcmV0dXJuIG1heWJlVHJ1c3RlZC4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpOw0KLSAgICAgIH0NCi0gICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgdGhlbiB3ZSBtYXkgb25seSB0YWtlIG9uZSBvZiB0d28gYWN0aW9ucy4NCi0gICAgICAvLyAxLiBzYW5pdGl6ZSB0aGUgdmFsdWUgZm9yIHRoZSByZXF1ZXN0ZWQgdHlwZSwgb3INCi0gICAgICAvLyAyLiB0aHJvdyBhbiBleGNlcHRpb24uDQotICAgICAgaWYgKHR5cGUgPT09IFNDRV9DT05URVhUUy5SRVNPVVJDRV9VUkwpIHsNCi0gICAgICAgIGlmIChpc1Jlc291cmNlVXJsQWxsb3dlZEJ5UG9saWN5KG1heWJlVHJ1c3RlZCkpIHsNCi0gICAgICAgICAgcmV0dXJuIG1heWJlVHJ1c3RlZDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIHRocm93ICRzY2VNaW5FcnIoJ2luc2VjdXJsJywNCi0gICAgICAgICAgICAgICdCbG9ja2VkIGxvYWRpbmcgcmVzb3VyY2UgZnJvbSB1cmwgbm90IGFsbG93ZWQgYnkgJHNjZURlbGVnYXRlIHBvbGljeS4gIFVSTDogezB9JywNCi0gICAgICAgICAgICAgIG1heWJlVHJ1c3RlZC50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFNDRV9DT05URVhUUy5IVE1MKSB7DQotICAgICAgICByZXR1cm4gaHRtbFNhbml0aXplcihtYXliZVRydXN0ZWQpOw0KLSAgICAgIH0NCi0gICAgICB0aHJvdyAkc2NlTWluRXJyKCd1bnNhZmUnLCAnQXR0ZW1wdGluZyB0byB1c2UgYW4gdW5zYWZlIHZhbHVlIGluIGEgc2FmZSBjb250ZXh0LicpOw0KLSAgICB9DQotDQotICAgIHJldHVybiB7IHRydXN0QXM6IHRydXN0QXMsDQotICAgICAgICAgICAgIGdldFRydXN0ZWQ6IGdldFRydXN0ZWQsDQotICAgICAgICAgICAgIHZhbHVlT2Y6IHZhbHVlT2YgfTsNCi0gIH1dOw0KLX0NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgcHJvdmlkZXINCi0gKiBAbmFtZSAkc2NlUHJvdmlkZXINCi0gKiBAZGVzY3JpcHRpb24NCi0gKg0KLSAqIFRoZSAkc2NlUHJvdmlkZXIgcHJvdmlkZXIgYWxsb3dzIGRldmVsb3BlcnMgdG8gY29uZmlndXJlIHRoZSB7QGxpbmsgbmcuJHNjZSAkc2NlfSBzZXJ2aWNlLg0KLSAqIC0gICBlbmFibGUvZGlzYWJsZSBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKSBpbiBhIG1vZHVsZQ0KLSAqIC0gICBvdmVycmlkZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aXRoIGEgY3VzdG9tIGRlbGVnYXRlDQotICoNCi0gKiBSZWFkIG1vcmUgYWJvdXQge0BsaW5rIG5nLiRzY2UgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgKFNDRSl9Lg0KLSAqLw0KLQ0KLS8qIGpzaGludCBtYXhsZW46IGZhbHNlKi8NCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICRzY2UNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICoNCi0gKiBgJHNjZWAgaXMgYSBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgc2VydmljZXMgdG8gQW5ndWxhckpTLg0KLSAqDQotICogIyBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZw0KLSAqDQotICogU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgKFNDRSkgaXMgYSBtb2RlIGluIHdoaWNoIEFuZ3VsYXJKUyByZXF1aXJlcyBiaW5kaW5ncyBpbiBjZXJ0YWluDQotICogY29udGV4dHMgdG8gcmVzdWx0IGluIGEgdmFsdWUgdGhhdCBpcyBtYXJrZWQgYXMgc2FmZSB0byB1c2UgZm9yIHRoYXQgY29udGV4dC4gIE9uZSBleGFtcGxlIG9mDQotICogc3VjaCBhIGNvbnRleHQgaXMgYmluZGluZyBhcmJpdHJhcnkgaHRtbCBjb250cm9sbGVkIGJ5IHRoZSB1c2VyIHZpYSBgbmctYmluZC1odG1sYC4gIFdlIHJlZmVyDQotICogdG8gdGhlc2UgY29udGV4dHMgYXMgcHJpdmlsZWdlZCBvciBTQ0UgY29udGV4dHMuDQotICoNCi0gKiBBcyBvZiB2ZXJzaW9uIDEuMiwgQW5ndWxhciBzaGlwcyB3aXRoIFNDRSBlbmFibGVkIGJ5IGRlZmF1bHQuDQotICoNCi0gKiBOb3RlOiAgV2hlbiBlbmFibGVkICh0aGUgZGVmYXVsdCksIElFPDExIGluIHF1aXJrcyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQuICBJbiB0aGlzIG1vZGUsIElFPDExIGFsbG93DQotICogb25lIHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGphdmFzY3JpcHQgYnkgdGhlIHVzZSBvZiB0aGUgZXhwcmVzc2lvbigpIHN5bnRheC4gIFJlZmVyDQotICogPGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9iL2llL2FyY2hpdmUvMjAwOC8xMC8xNi9lbmRpbmctZXhwcmVzc2lvbnMuYXNweD4gdG8gbGVhcm4gbW9yZSBhYm91dCB0aGVtLg0KLSAqIFlvdSBjYW4gZW5zdXJlIHlvdXIgZG9jdW1lbnQgaXMgaW4gc3RhbmRhcmRzIG1vZGUgYW5kIG5vdCBxdWlya3MgbW9kZSBieSBhZGRpbmcgYDwhZG9jdHlwZSBodG1sPmANCi0gKiB0byB0aGUgdG9wIG9mIHlvdXIgSFRNTCBkb2N1bWVudC4NCi0gKg0KLSAqIFNDRSBhc3Npc3RzIGluIHdyaXRpbmcgY29kZSBpbiB3YXkgdGhhdCAoYSkgaXMgc2VjdXJlIGJ5IGRlZmF1bHQgYW5kIChiKSBtYWtlcyBhdWRpdGluZyBmb3INCi0gKiBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMgc3VjaCBhcyBYU1MsIGNsaWNramFja2luZywgZXRjLiBhIGxvdCBlYXNpZXIuDQotICoNCi0gKiBIZXJlJ3MgYW4gZXhhbXBsZSBvZiBhIGJpbmRpbmcgaW4gYSBwcml2aWxlZ2VkIGNvbnRleHQ6DQotICoNCi0gKiBgYGANCi0gKiA8aW5wdXQgbmctbW9kZWw9InVzZXJIdG1sIj4NCi0gKiA8ZGl2IG5nLWJpbmQtaHRtbD0idXNlckh0bWwiPjwvZGl2Pg0KLSAqIGBgYA0KLSAqDQotICogTm90aWNlIHRoYXQgYG5nLWJpbmQtaHRtbGAgaXMgYm91bmQgdG8gYHVzZXJIdG1sYCBjb250cm9sbGVkIGJ5IHRoZSB1c2VyLiAgV2l0aCBTQ0UNCi0gKiBkaXNhYmxlZCwgdGhpcyBhcHBsaWNhdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gcmVuZGVyIGFyYml0cmFyeSBIVE1MIGludG8gdGhlIERJVi4NCi0gKiBJbiBhIG1vcmUgcmVhbGlzdGljIGV4YW1wbGUsIG9uZSBtYXkgYmUgcmVuZGVyaW5nIHVzZXIgY29tbWVudHMsIGJsb2cgYXJ0aWNsZXMsIGV0Yy4gdmlhDQotICogYmluZGluZ3MuICAoSFRNTCBpcyBqdXN0IG9uZSBleGFtcGxlIG9mIGEgY29udGV4dCB3aGVyZSByZW5kZXJpbmcgdXNlciBjb250cm9sbGVkIGlucHV0IGNyZWF0ZXMNCi0gKiBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuKQ0KLSAqDQotICogRm9yIHRoZSBjYXNlIG9mIEhUTUwsIHlvdSBtaWdodCB1c2UgYSBsaWJyYXJ5LCBlaXRoZXIgb24gdGhlIGNsaWVudCBzaWRlLCBvciBvbiB0aGUgc2VydmVyIHNpZGUsDQotICogdG8gc2FuaXRpemUgdW5zYWZlIEhUTUwgYmVmb3JlIGJpbmRpbmcgdG8gdGhlIHZhbHVlIGFuZCByZW5kZXJpbmcgaXQgaW4gdGhlIGRvY3VtZW50Lg0KLSAqDQotICogSG93IHdvdWxkIHlvdSBlbnN1cmUgdGhhdCBldmVyeSBwbGFjZSB0aGF0IHVzZWQgdGhlc2UgdHlwZXMgb2YgYmluZGluZ3Mgd2FzIGJvdW5kIHRvIGEgdmFsdWUgdGhhdA0KLSAqIHdhcyBzYW5pdGl6ZWQgYnkgeW91ciBsaWJyYXJ5IChvciByZXR1cm5lZCBhcyBzYWZlIGZvciByZW5kZXJpbmcgYnkgeW91ciBzZXJ2ZXI/KSAgSG93IGNhbiB5b3UNCi0gKiBlbnN1cmUgdGhhdCB5b3UgZGlkbid0IGFjY2lkZW50YWxseSBkZWxldGUgdGhlIGxpbmUgdGhhdCBzYW5pdGl6ZWQgdGhlIHZhbHVlLCBvciByZW5hbWVkIHNvbWUNCi0gKiBwcm9wZXJ0aWVzL2ZpZWxkcyBhbmQgZm9yZ290IHRvIHVwZGF0ZSB0aGUgYmluZGluZyB0byB0aGUgc2FuaXRpemVkIHZhbHVlPw0KLSAqDQotICogVG8gYmUgc2VjdXJlIGJ5IGRlZmF1bHQsIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IGFueSBzdWNoIGJpbmRpbmdzIGFyZSBkaXNhbGxvd2VkIHVubGVzcyB5b3UgY2FuDQotICogZGV0ZXJtaW5lIHRoYXQgc29tZXRoaW5nIGV4cGxpY2l0bHkgc2F5cyBpdCdzIHNhZmUgdG8gdXNlIGEgdmFsdWUgZm9yIGJpbmRpbmcgaW4gdGhhdA0KLSAqIGNvbnRleHQuICBZb3UgY2FuIHRoZW4gYXVkaXQgeW91ciBjb2RlIChhIHNpbXBsZSBncmVwIHdvdWxkIGRvKSB0byBlbnN1cmUgdGhhdCB0aGlzIGlzIG9ubHkgZG9uZQ0KLSAqIGZvciB0aG9zZSB2YWx1ZXMgdGhhdCB5b3UgY2FuIGVhc2lseSB0ZWxsIGFyZSBzYWZlIC0gYmVjYXVzZSB0aGV5IHdlcmUgcmVjZWl2ZWQgZnJvbSB5b3VyIHNlcnZlciwNCi0gKiBzYW5pdGl6ZWQgYnkgeW91ciBsaWJyYXJ5LCBldGMuICBZb3UgY2FuIG9yZ2FuaXplIHlvdXIgY29kZWJhc2UgdG8gaGVscCB3aXRoIHRoaXMgLSBwZXJoYXBzDQotICogYWxsb3dpbmcgb25seSB0aGUgZmlsZXMgaW4gYSBzcGVjaWZpYyBkaXJlY3RvcnkgdG8gZG8gdGhpcy4gIEVuc3VyaW5nIHRoYXQgdGhlIGludGVybmFsIEFQSQ0KLSAqIGV4cG9zZWQgYnkgdGhhdCBjb2RlIGRvZXNuJ3QgbWFya3VwIGFyYml0cmFyeSB2YWx1ZXMgYXMgc2FmZSB0aGVuIGJlY29tZXMgYSBtb3JlIG1hbmFnZWFibGUgdGFzay4NCi0gKg0KLSAqIEluIHRoZSBjYXNlIG9mIEFuZ3VsYXJKUycgU0NFIHNlcnZpY2UsIG9uZSB1c2VzIHtAbGluayBuZy4kc2NlI3RydXN0QXMgJHNjZS50cnVzdEFzfQ0KLSAqIChhbmQgc2hvcnRoYW5kIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzSHRtbCAkc2NlLnRydXN0QXNIdG1sfSwgZXRjLikgdG8NCi0gKiBvYnRhaW4gdmFsdWVzIHRoYXQgd2lsbCBiZSBhY2NlcHRlZCBieSBTQ0UgLyBwcml2aWxlZ2VkIGNvbnRleHRzLg0KLSAqDQotICoNCi0gKiAjIyBIb3cgZG9lcyBpdCB3b3JrPw0KLSAqDQotICogSW4gcHJpdmlsZWdlZCBjb250ZXh0cywgZGlyZWN0aXZlcyBhbmQgY29kZSB3aWxsIGJpbmQgdG8gdGhlIHJlc3VsdCBvZiB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkDQotICogJHNjZS5nZXRUcnVzdGVkKGNvbnRleHQsIHZhbHVlKX0gcmF0aGVyIHRoYW4gdG8gdGhlIHZhbHVlIGRpcmVjdGx5LiAgRGlyZWN0aXZlcyB1c2Uge0BsaW5rDQotICogbmcuJHNjZSNwYXJzZUFzICRzY2UucGFyc2VBc30gcmF0aGVyIHRoYW4gYCRwYXJzZWAgdG8gd2F0Y2ggYXR0cmlidXRlIGJpbmRpbmdzLCB3aGljaCBwZXJmb3JtcyB0aGUNCi0gKiB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkICRzY2UuZ2V0VHJ1c3RlZH0gYmVoaW5kIHRoZSBzY2VuZXMgb24gbm9uLWNvbnN0YW50IGxpdGVyYWxzLg0KLSAqDQotICogQXMgYW4gZXhhbXBsZSwge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0JpbmRIdG1sIG5nQmluZEh0bWx9IHVzZXMge0BsaW5rDQotICogbmcuJHNjZSNwYXJzZUFzSHRtbCAkc2NlLnBhcnNlQXNIdG1sKGJpbmRpbmcgZXhwcmVzc2lvbil9LiAgSGVyZSdzIHRoZSBhY3R1YWwgY29kZSAoc2xpZ2h0bHkNCi0gKiBzaW1wbGlmaWVkKToNCi0gKg0KLSAqIGBgYA0KLSAqIHZhciBuZ0JpbmRIdG1sRGlyZWN0aXZlID0gWyckc2NlJywgZnVuY3Rpb24oJHNjZSkgew0KLSAqICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7DQotICogICAgIHNjb3BlLiR3YXRjaCgkc2NlLnBhcnNlQXNIdG1sKGF0dHIubmdCaW5kSHRtbCksIGZ1bmN0aW9uKHZhbHVlKSB7DQotICogICAgICAgZWxlbWVudC5odG1sKHZhbHVlIHx8ICcnKTsNCi0gKiAgICAgfSk7DQotICogICB9Ow0KLSAqIH1dOw0KLSAqIGBgYA0KLSAqDQotICogIyMgSW1wYWN0IG9uIGxvYWRpbmcgdGVtcGxhdGVzDQotICoNCi0gKiBUaGlzIGFwcGxpZXMgYm90aCB0byB0aGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0luY2x1ZGUgYG5nLWluY2x1ZGVgfSBkaXJlY3RpdmUgYXMgd2VsbCBhcw0KLSAqIGB0ZW1wbGF0ZVVybGAncyBzcGVjaWZpZWQgYnkge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSBkaXJlY3RpdmVzfS4NCi0gKg0KLSAqIEJ5IGRlZmF1bHQsIEFuZ3VsYXIgb25seSBsb2FkcyB0ZW1wbGF0ZXMgZnJvbSB0aGUgc2FtZSBkb21haW4gYW5kIHByb3RvY29sIGFzIHRoZSBhcHBsaWNhdGlvbg0KLSAqIGRvY3VtZW50LiAgVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZFJlc291cmNlVXJsDQotICogJHNjZS5nZXRUcnVzdGVkUmVzb3VyY2VVcmx9IG9uIHRoZSB0ZW1wbGF0ZSBVUkwuICBUbyBsb2FkIHRlbXBsYXRlcyBmcm9tIG90aGVyIGRvbWFpbnMgYW5kL29yDQotICogcHJvdG9jb2xzLCB5b3UgbWF5IGVpdGhlciBlaXRoZXIge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0IHdoaXRlbGlzdA0KLSAqIHRoZW19IG9yIHtAbGluayBuZy4kc2NlI3RydXN0QXNSZXNvdXJjZVVybCB3cmFwIGl0fSBpbnRvIGEgdHJ1c3RlZCB2YWx1ZS4NCi0gKg0KLSAqICpQbGVhc2Ugbm90ZSo6DQotICogVGhlIGJyb3dzZXIncw0KLSAqIFtTYW1lIE9yaWdpbiBQb2xpY3ldKGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYnJvd3NlcnNlYy93aWtpL1BhcnQyI1NhbWUtb3JpZ2luX3BvbGljeV9mb3JfWE1MSHR0cFJlcXVlc3QpDQotICogYW5kIFtDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZyAoQ09SUyldKGh0dHA6Ly93d3cudzMub3JnL1RSL2NvcnMvKQ0KLSAqIHBvbGljeSBhcHBseSBpbiBhZGRpdGlvbiB0byB0aGlzIGFuZCBtYXkgZnVydGhlciByZXN0cmljdCB3aGV0aGVyIHRoZSB0ZW1wbGF0ZSBpcyBzdWNjZXNzZnVsbHkNCi0gKiBsb2FkZWQuICBUaGlzIG1lYW5zIHRoYXQgd2l0aG91dCB0aGUgcmlnaHQgQ09SUyBwb2xpY3ksIGxvYWRpbmcgdGVtcGxhdGVzIGZyb20gYSBkaWZmZXJlbnQgZG9tYWluDQotICogd29uJ3Qgd29yayBvbiBhbGwgYnJvd3NlcnMuICBBbHNvLCBsb2FkaW5nIHRlbXBsYXRlcyBmcm9tIGBmaWxlOi8vYCBVUkwgZG9lcyBub3Qgd29yayBvbiBzb21lDQotICogYnJvd3NlcnMuDQotICoNCi0gKiAjIyBUaGlzIGZlZWxzIGxpa2UgdG9vIG11Y2ggb3ZlcmhlYWQNCi0gKg0KLSAqIEl0J3MgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgU0NFIG9ubHkgYXBwbGllcyB0byBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb25zLg0KLSAqDQotICogSWYgeW91ciBleHByZXNzaW9ucyBhcmUgY29uc3RhbnQgbGl0ZXJhbHMsIHRoZXkncmUgYXV0b21hdGljYWxseSB0cnVzdGVkIGFuZCB5b3UgZG9uJ3QgbmVlZCB0bw0KLSAqIGNhbGwgYCRzY2UudHJ1c3RBc2Agb24gdGhlbSAocmVtZW1iZXIgdG8gaW5jbHVkZSB0aGUgYG5nU2FuaXRpemVgIG1vZHVsZSkgKGUuZy4NCi0gKiBgPGRpdiBuZy1iaW5kLWh0bWw9Iic8Yj5pbXBsaWNpdGx5IHRydXN0ZWQ8L2I+JyI+PC9kaXY+YCkganVzdCB3b3Jrcy4NCi0gKg0KLSAqIEFkZGl0aW9uYWxseSwgYGFbaHJlZl1gIGFuZCBgaW1nW3NyY11gIGF1dG9tYXRpY2FsbHkgc2FuaXRpemUgdGhlaXIgVVJMcyBhbmQgZG8gbm90IHBhc3MgdGhlbQ0KLSAqIHRocm91Z2gge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZCAkc2NlLmdldFRydXN0ZWR9LiAgU0NFIGRvZXNuJ3QgcGxheSBhIHJvbGUgaGVyZS4NCi0gKg0KLSAqIFRoZSBpbmNsdWRlZCB7QGxpbmsgbmcuJHNjZURlbGVnYXRlICRzY2VEZWxlZ2F0ZX0gY29tZXMgd2l0aCBzYW5lIGRlZmF1bHRzIHRvIGFsbG93IHlvdSB0byBsb2FkDQotICogdGVtcGxhdGVzIGluIGBuZy1pbmNsdWRlYCBmcm9tIHlvdXIgYXBwbGljYXRpb24ncyBkb21haW4gd2l0aG91dCBoYXZpbmcgdG8gZXZlbiBrbm93IGFib3V0IFNDRS4NCi0gKiBJdCBibG9ja3MgbG9hZGluZyB0ZW1wbGF0ZXMgZnJvbSBvdGhlciBkb21haW5zIG9yIGxvYWRpbmcgdGVtcGxhdGVzIG92ZXIgaHR0cCBmcm9tIGFuIGh0dHBzDQotICogc2VydmVkIGRvY3VtZW50LiAgWW91IGNhbiBjaGFuZ2UgdGhlc2UgYnkgc2V0dGluZyB5b3VyIG93biBjdXN0b20ge0BsaW5rDQotICogbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxXaGl0ZWxpc3Qgd2hpdGVsaXN0c30gYW5kIHtAbGluaw0KLSAqIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsQmxhY2tsaXN0IGJsYWNrbGlzdHN9IGZvciBtYXRjaGluZyBzdWNoIFVSTHMuDQotICoNCi0gKiBUaGlzIHNpZ25pZmljYW50bHkgcmVkdWNlcyB0aGUgb3ZlcmhlYWQuICBJdCBpcyBmYXIgZWFzaWVyIHRvIHBheSB0aGUgc21hbGwgb3ZlcmhlYWQgYW5kIGhhdmUgYW4NCi0gKiBhcHBsaWNhdGlvbiB0aGF0J3Mgc2VjdXJlIGFuZCBjYW4gYmUgYXVkaXRlZCB0byB2ZXJpZnkgdGhhdCB3aXRoIG11Y2ggbW9yZSBlYXNlIHRoYW4gYm9sdGluZw0KLSAqIHNlY3VyaXR5IG9udG8gYW4gYXBwbGljYXRpb24gbGF0ZXIuDQotICoNCi0gKiA8YSBuYW1lPSJjb250ZXh0cyI+PC9hPg0KLSAqICMjIFdoYXQgdHJ1c3RlZCBjb250ZXh0IHR5cGVzIGFyZSBzdXBwb3J0ZWQ/DQotICoNCi0gKiB8IENvbnRleHQgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICB8DQotICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfA0KLSAqIHwgYCRzY2UuSFRNTGAgICAgICAgICB8IEZvciBIVE1MIHRoYXQncyBzYWZlIHRvIHNvdXJjZSBpbnRvIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQmluZEh0bWwgbmdCaW5kSHRtbH0gZGlyZWN0aXZlIHVzZXMgdGhpcyBjb250ZXh0IGZvciBiaW5kaW5ncy4gSWYgYW4gdW5zYWZlIHZhbHVlIGlzIGVuY291bnRlcmVkIGFuZCB0aGUge0BsaW5rIG5nU2FuaXRpemUgJHNhbml0aXplfSBtb2R1bGUgaXMgcHJlc2VudCB0aGlzIHdpbGwgc2FuaXRpemUgdGhlIHZhbHVlIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IuIHwNCi0gKiB8IGAkc2NlLkNTU2AgICAgICAgICAgfCBGb3IgQ1NTIHRoYXQncyBzYWZlIHRvIHNvdXJjZSBpbnRvIHRoZSBhcHBsaWNhdGlvbi4gIEN1cnJlbnRseSB1bnVzZWQuICBGZWVsIGZyZWUgdG8gdXNlIGl0IGluIHlvdXIgb3duIGRpcmVjdGl2ZXMuIHwNCi0gKiB8IGAkc2NlLlVSTGAgICAgICAgICAgfCBGb3IgVVJMcyB0aGF0IGFyZSBzYWZlIHRvIGZvbGxvdyBhcyBsaW5rcy4gIEN1cnJlbnRseSB1bnVzZWQgKGA8YSBocmVmPWAgYW5kIGA8aW1nIHNyYz1gIHNhbml0aXplIHRoZWlyIHVybHMgYW5kIGRvbid0IGNvbnN0aXR1dGUgYW4gU0NFIGNvbnRleHQuIHwNCi0gKiB8IGAkc2NlLlJFU09VUkNFX1VSTGAgfCBGb3IgVVJMcyB0aGF0IGFyZSBub3Qgb25seSBzYWZlIHRvIGZvbGxvdyBhcyBsaW5rcywgYnV0IHdob3NlIGNvbnRlbnRzIGFyZSBhbHNvIHNhZmUgdG8gaW5jbHVkZSBpbiB5b3VyIGFwcGxpY2F0aW9uLiAgRXhhbXBsZXMgaW5jbHVkZSBgbmctaW5jbHVkZWAsIGBzcmNgIC8gYG5nU3JjYCBiaW5kaW5ncyBmb3IgdGFncyBvdGhlciB0aGFuIGBJTUdgIChlLmcuIGBJRlJBTUVgLCBgT0JKRUNUYCwgZXRjLikgIDxicj48YnI+Tm90ZSB0aGF0IGAkc2NlLlJFU09VUkNFX1VSTGAgbWFrZXMgYSBzdHJvbmdlciBzdGF0ZW1lbnQgYWJvdXQgdGhlIFVSTCB0aGFuIGAkc2NlLlVSTGAgZG9lcyBhbmQgdGhlcmVmb3JlIGNvbnRleHRzIHJlcXVpcmluZyB2YWx1ZXMgdHJ1c3RlZCBmb3IgYCRzY2UuUkVTT1VSQ0VfVVJMYCBjYW4gYmUgdXNlZCBhbnl3aGVyZSB0aGF0IHZhbHVlcyB0cnVzdGVkIGZvciBgJHNjZS5VUkxgIGFyZSByZXF1aXJlZC4gfA0KLSAqIHwgYCRzY2UuSlNgICAgICAgICAgICB8IEZvciBKYXZhU2NyaXB0IHRoYXQgaXMgc2FmZSB0byBleGVjdXRlIGluIHlvdXIgYXBwbGljYXRpb24ncyBjb250ZXh0LiAgQ3VycmVudGx5IHVudXNlZC4gIEZlZWwgZnJlZSB0byB1c2UgaXQgaW4geW91ciBvd24gZGlyZWN0aXZlcy4gfA0KLSAqDQotICogIyMgRm9ybWF0IG9mIGl0ZW1zIGluIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybFdoaXRlbGlzdCByZXNvdXJjZVVybFdoaXRlbGlzdH0ve0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsQmxhY2tsaXN0IEJsYWNrbGlzdH0gPGEgbmFtZT0icmVzb3VyY2VVcmxQYXR0ZXJuSXRlbSI+PC9hPg0KLSAqDQotICogIEVhY2ggZWxlbWVudCBpbiB0aGVzZSBhcnJheXMgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoNCi0gKg0KLSAqICAtICoqJ3NlbGYnKioNCi0gKiAgICAtIFRoZSBzcGVjaWFsICoqc3RyaW5nKiosIGAnc2VsZidgLCBjYW4gYmUgdXNlZCB0byBtYXRjaCBhZ2FpbnN0IGFsbCBVUkxzIG9mIHRoZSAqKnNhbWUNCi0gKiAgICAgIGRvbWFpbioqIGFzIHRoZSBhcHBsaWNhdGlvbiBkb2N1bWVudCB1c2luZyB0aGUgKipzYW1lIHByb3RvY29sKiouDQotICogIC0gKipTdHJpbmcqKiAoZXhjZXB0IHRoZSBzcGVjaWFsIHZhbHVlIGAnc2VsZidgKQ0KLSAqICAgIC0gVGhlIHN0cmluZyBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGZ1bGwgKm5vcm1hbGl6ZWQgLyBhYnNvbHV0ZSBVUkwqIG9mIHRoZSByZXNvdXJjZQ0KLSAqICAgICAgYmVpbmcgdGVzdGVkIChzdWJzdHJpbmcgbWF0Y2hlcyBhcmUgbm90IGdvb2QgZW5vdWdoLikNCi0gKiAgICAtIFRoZXJlIGFyZSBleGFjdGx5ICoqdHdvIHdpbGRjYXJkIHNlcXVlbmNlcyoqIC0gYCpgIGFuZCBgKipgLiAgQWxsIG90aGVyIGNoYXJhY3RlcnMNCi0gKiAgICAgIG1hdGNoIHRoZW1zZWx2ZXMuDQotICogICAgLSBgKmA6IG1hdGNoZXMgemVybyBvciBtb3JlIG9jY3VycmVuY2VzIG9mIGFueSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBvbmUgb2YgdGhlIGZvbGxvd2luZyA2DQotICogICAgICBjaGFyYWN0ZXJzOiAnYDpgJywgJ2AvYCcsICdgLmAnLCAnYD9gJywgJ2AmYCcgYW5kICc7Jy4gIEl0J3MgYSB1c2VmdWwgd2lsZGNhcmQgZm9yIHVzZQ0KLSAqICAgICAgaW4gYSB3aGl0ZWxpc3QuDQotICogICAgLSBgKipgOiBtYXRjaGVzIHplcm8gb3IgbW9yZSBvY2N1cnJlbmNlcyBvZiAqYW55KiBjaGFyYWN0ZXIuICBBcyBzdWNoLCBpdCdzIG5vdA0KLSAqICAgICAgbm90IGFwcHJvcHJpYXRlIHRvIHVzZSBpbiBmb3IgYSBzY2hlbWUsIGRvbWFpbiwgZXRjLiBhcyBpdCB3b3VsZCBtYXRjaCB0b28gbXVjaC4gIChlLmcuDQotICogICAgICBodHRwOi8vKiouZXhhbXBsZS5jb20vIHdvdWxkIG1hdGNoIGh0dHA6Ly9ldmlsLmNvbS8/aWdub3JlPS5leGFtcGxlLmNvbS8gYW5kIHRoYXQgbWlnaHQNCi0gKiAgICAgIG5vdCBoYXZlIGJlZW4gdGhlIGludGVudGlvbi4pICBJdHMgdXNhZ2UgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBwYXRoIGlzIG9rLiAgKGUuZy4NCi0gKiAgICAgIGh0dHA6Ly9mb28uZXhhbXBsZS5jb20vdGVtcGxhdGVzLyoqKS4NCi0gKiAgLSAqKlJlZ0V4cCoqICgqc2VlIGNhdmVhdCBiZWxvdyopDQotICogICAgLSAqQ2F2ZWF0KjogIFdoaWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHBvd2VyZnVsIGFuZCBvZmZlciBncmVhdCBmbGV4aWJpbGl0eSwgIHRoZWlyIHN5bnRheA0KLSAqICAgICAgKGFuZCBhbGwgdGhlIGluZXZpdGFibGUgZXNjYXBpbmcpIG1ha2VzIHRoZW0gKmhhcmRlciB0byBtYWludGFpbiouICBJdCdzIGVhc3kgdG8NCi0gKiAgICAgIGFjY2lkZW50YWxseSBpbnRyb2R1Y2UgYSBidWcgd2hlbiBvbmUgdXBkYXRlcyBhIGNvbXBsZXggZXhwcmVzc2lvbiAoaW1obywgYWxsIHJlZ2V4ZXMgc2hvdWxkDQotICogICAgICBoYXZlIGdvb2QgdGVzdCBjb3ZlcmFnZS4pLiAgRm9yIGluc3RhbmNlLCB0aGUgdXNlIG9mIGAuYCBpbiB0aGUgcmVnZXggaXMgY29ycmVjdCBvbmx5IGluIGENCi0gKiAgICAgIHNtYWxsIG51bWJlciBvZiBjYXNlcy4gIEEgYC5gIGNoYXJhY3RlciBpbiB0aGUgcmVnZXggdXNlZCB3aGVuIG1hdGNoaW5nIHRoZSBzY2hlbWUgb3IgYQ0KLSAqICAgICAgc3ViZG9tYWluIGNvdWxkIGJlIG1hdGNoZWQgYWdhaW5zdCBhIGA6YCBvciBsaXRlcmFsIGAuYCB0aGF0IHdhcyBsaWtlbHkgbm90IGludGVuZGVkLiAgIEl0DQotICogICAgICBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBzdHJpbmcgcGF0dGVybnMgYW5kIG9ubHkgZmFsbCBiYWNrIHRvIHJlZ3VsYXIgZXhwcmVzc2lvbnMNCi0gKiAgICAgIGlmIHRoZXkgYXMgYSBsYXN0IHJlc29ydC4NCi0gKiAgICAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBSZWdFeHAgKGkuZS4gbm90IGEgc3RyaW5nLikgIEl0IGlzDQotICogICAgICBtYXRjaGVkIGFnYWluc3QgdGhlICoqZW50aXJlKiogKm5vcm1hbGl6ZWQgLyBhYnNvbHV0ZSBVUkwqIG9mIHRoZSByZXNvdXJjZSBiZWluZyB0ZXN0ZWQNCi0gKiAgICAgIChldmVuIHdoZW4gdGhlIFJlZ0V4cCBkaWQgbm90IGhhdmUgdGhlIGBeYCBhbmQgYCRgIGNvZGVzLikgIEluIGFkZGl0aW9uLCBhbnkgZmxhZ3MNCi0gKiAgICAgIHByZXNlbnQgb24gdGhlIFJlZ0V4cCAoc3VjaCBhcyBtdWx0aWxpbmUsIGdsb2JhbCwgaWdub3JlQ2FzZSkgYXJlIGlnbm9yZWQuDQotICogICAgLSBJZiB5b3UgYXJlIGdlbmVyYXRpbmcgeW91ciBKYXZhU2NyaXB0IGZyb20gc29tZSBvdGhlciB0ZW1wbGF0aW5nIGVuZ2luZSAobm90DQotICogICAgICByZWNvbW1lbmRlZCwgZS5nLiBpbiBpc3N1ZSBbIzQwMDZdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzQwMDYpKSwNCi0gKiAgICAgIHJlbWVtYmVyIHRvIGVzY2FwZSB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiAoYW5kIGJlIGF3YXJlIHRoYXQgeW91IG1pZ2h0IG5lZWQgbW9yZSB0aGFuDQotICogICAgICBvbmUgbGV2ZWwgb2YgZXNjYXBpbmcgZGVwZW5kaW5nIG9uIHlvdXIgdGVtcGxhdGluZyBlbmdpbmUgYW5kIHRoZSB3YXkgeW91IGludGVycG9sYXRlZA0KLSAqICAgICAgdGhlIHZhbHVlLikgIERvIG1ha2UgdXNlIG9mIHlvdXIgcGxhdGZvcm0ncyBlc2NhcGluZyBtZWNoYW5pc20gYXMgaXQgbWlnaHQgYmUgZ29vZA0KLSAqICAgICAgZW5vdWdoIGJlZm9yZSBjb2RpbmcgeW91ciBvd24uICBlLmcuIFJ1YnkgaGFzDQotICogICAgICBbUmVnZXhwLmVzY2FwZShzdHIpXShodHRwOi8vd3d3LnJ1YnktZG9jLm9yZy9jb3JlLTIuMC4wL1JlZ2V4cC5odG1sI21ldGhvZC1jLWVzY2FwZSkNCi0gKiAgICAgIGFuZCBQeXRob24gaGFzIFtyZS5lc2NhcGVdKGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS9yZS5odG1sI3JlLmVzY2FwZSkuDQotICogICAgICBKYXZhc2NyaXB0IGxhY2tzIGEgc2ltaWxhciBidWlsdCBpbiBmdW5jdGlvbiBmb3IgZXNjYXBpbmcuICBUYWtlIGEgbG9vayBhdCBHb29nbGUNCi0gKiAgICAgIENsb3N1cmUgbGlicmFyeSdzIFtnb29nLnN0cmluZy5yZWdFeHBFc2NhcGUocyldKA0KLSAqICAgICAgaHR0cDovL2RvY3MuY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL2dpdC9jbG9zdXJlX2dvb2dfc3RyaW5nX3N0cmluZy5qcy5zb3VyY2UuaHRtbCNsaW5lOTYyKS4NCi0gKg0KLSAqIFJlZmVyIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciAkc2NlRGVsZWdhdGVQcm92aWRlcn0gZm9yIGFuIGV4YW1wbGUuDQotICoNCi0gKiAjIyBTaG93IG1lIGFuIGV4YW1wbGUgdXNpbmcgU0NFLg0KLSAqDQotICogPGV4YW1wbGUgbW9kdWxlPSJteVNjZUFwcCIgZGVwcz0iYW5ndWxhci1zYW5pdGl6ZS5qcyI+DQotICogPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICogICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkFwcENvbnRyb2xsZXIgYXMgbXlDdHJsIj4NCi0gKiAgICAgPGkgbmctYmluZC1odG1sPSJteUN0cmwuZXhwbGljaXRseVRydXN0ZWRIdG1sIiBpZD0iZXhwbGljaXRseVRydXN0ZWRIdG1sIj48L2k+PGJyPjxicj4NCi0gKiAgICAgPGI+VXNlciBjb21tZW50czwvYj48YnI+DQotICogICAgIEJ5IGRlZmF1bHQsIEhUTUwgdGhhdCBpc24ndCBleHBsaWNpdGx5IHRydXN0ZWQgKGUuZy4gQWxpY2UncyBjb21tZW50KSBpcyBzYW5pdGl6ZWQgd2hlbg0KLSAqICAgICAkc2FuaXRpemUgaXMgYXZhaWxhYmxlLiAgSWYgJHNhbml0aXplIGlzbid0IGF2YWlsYWJsZSwgdGhpcyByZXN1bHRzIGluIGFuIGVycm9yIGluc3RlYWQgb2YgYW4NCi0gKiAgICAgZXhwbG9pdC4NCi0gKiAgICAgPGRpdiBjbGFzcz0id2VsbCI+DQotICogICAgICAgPGRpdiBuZy1yZXBlYXQ9InVzZXJDb21tZW50IGluIG15Q3RybC51c2VyQ29tbWVudHMiPg0KLSAqICAgICAgICAgPGI+e3t1c2VyQ29tbWVudC5uYW1lfX08L2I+Og0KLSAqICAgICAgICAgPHNwYW4gbmctYmluZC1odG1sPSJ1c2VyQ29tbWVudC5odG1sQ29tbWVudCIgY2xhc3M9Imh0bWxDb21tZW50Ij48L3NwYW4+DQotICogICAgICAgICA8YnI+DQotICogICAgICAgPC9kaXY+DQotICogICAgIDwvZGl2Pg0KLSAqICAgPC9kaXY+DQotICogPC9maWxlPg0KLSAqDQotICogPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4NCi0gKiAgIGFuZ3VsYXIubW9kdWxlKCdteVNjZUFwcCcsIFsnbmdTYW5pdGl6ZSddKQ0KLSAqICAgICAuY29udHJvbGxlcignQXBwQ29udHJvbGxlcicsIFsnJGh0dHAnLCAnJHRlbXBsYXRlQ2FjaGUnLCAnJHNjZScsDQotICogICAgICAgZnVuY3Rpb24oJGh0dHAsICR0ZW1wbGF0ZUNhY2hlLCAkc2NlKSB7DQotICogICAgICAgICB2YXIgc2VsZiA9IHRoaXM7DQotICogICAgICAgICAkaHR0cC5nZXQoInRlc3RfZGF0YS5qc29uIiwge2NhY2hlOiAkdGVtcGxhdGVDYWNoZX0pLnN1Y2Nlc3MoZnVuY3Rpb24odXNlckNvbW1lbnRzKSB7DQotICogICAgICAgICAgIHNlbGYudXNlckNvbW1lbnRzID0gdXNlckNvbW1lbnRzOw0KLSAqICAgICAgICAgfSk7DQotICogICAgICAgICBzZWxmLmV4cGxpY2l0bHlUcnVzdGVkSHRtbCA9ICRzY2UudHJ1c3RBc0h0bWwoDQotICogICAgICAgICAgICAgJzxzcGFuIG9ubW91c2VvdmVyPSJ0aGlzLnRleHRDb250ZW50PSZxdW90O0V4cGxpY2l0bHkgdHJ1c3RlZCBIVE1MIGJ5cGFzc2VzICcgKw0KLSAqICAgICAgICAgICAgICdzYW5pdGl6YXRpb24uJnF1b3Q7Ij5Ib3ZlciBvdmVyIHRoaXMgdGV4dC48L3NwYW4+Jyk7DQotICogICAgICAgfV0pOw0KLSAqIDwvZmlsZT4NCi0gKg0KLSAqIDxmaWxlIG5hbWU9InRlc3RfZGF0YS5qc29uIj4NCi0gKiBbDQotICogICB7ICJuYW1lIjogIkFsaWNlIiwNCi0gKiAgICAgImh0bWxDb21tZW50IjoNCi0gKiAgICAgICAgICI8c3BhbiBvbm1vdXNlb3Zlcj0ndGhpcy50ZXh0Q29udGVudD1cIlBXTjNEIVwiJz5JcyA8aT5hbnlvbmU8L2k+IHJlYWRpbmcgdGhpcz88L3NwYW4+Ig0KLSAqICAgfSwNCi0gKiAgIHsgIm5hbWUiOiAiQm9iIiwNCi0gKiAgICAgImh0bWxDb21tZW50IjogIjxpPlllcyE8L2k+ICBBbSBJIHRoZSBvbmx5IG90aGVyIG9uZT8iDQotICogICB9DQotICogXQ0KLSAqIDwvZmlsZT4NCi0gKg0KLSAqIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAqICAgZGVzY3JpYmUoJ1NDRSBkb2MgZGVtbycsIGZ1bmN0aW9uKCkgew0KLSAqICAgICBpdCgnc2hvdWxkIHNhbml0aXplIHVudHJ1c3RlZCB2YWx1ZXMnLCBmdW5jdGlvbigpIHsNCi0gKiAgICAgICBleHBlY3QoZWxlbWVudC5hbGwoYnkuY3NzKCcuaHRtbENvbW1lbnQnKSkuZmlyc3QoKS5nZXRJbm5lckh0bWwoKSkNCi0gKiAgICAgICAgICAgLnRvQmUoJzxzcGFuPklzIDxpPmFueW9uZTwvaT4gcmVhZGluZyB0aGlzPzwvc3Bhbj4nKTsNCi0gKiAgICAgfSk7DQotICoNCi0gKiAgICAgaXQoJ3Nob3VsZCBOT1Qgc2FuaXRpemUgZXhwbGljaXRseSB0cnVzdGVkIHZhbHVlcycsIGZ1bmN0aW9uKCkgew0KLSAqICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdleHBsaWNpdGx5VHJ1c3RlZEh0bWwnKSkuZ2V0SW5uZXJIdG1sKCkpLnRvQmUoDQotICogICAgICAgICAgICc8c3BhbiBvbm1vdXNlb3Zlcj0idGhpcy50ZXh0Q29udGVudD0mcXVvdDtFeHBsaWNpdGx5IHRydXN0ZWQgSFRNTCBieXBhc3NlcyAnICsNCi0gKiAgICAgICAgICAgJ3Nhbml0aXphdGlvbi4mcXVvdDsiPkhvdmVyIG92ZXIgdGhpcyB0ZXh0Ljwvc3Bhbj4nKTsNCi0gKiAgICAgfSk7DQotICogICB9KTsNCi0gKiA8L2ZpbGU+DQotICogPC9leGFtcGxlPg0KLSAqDQotICoNCi0gKg0KLSAqICMjIENhbiBJIGRpc2FibGUgU0NFIGNvbXBsZXRlbHk/DQotICoNCi0gKiBZZXMsIHlvdSBjYW4uICBIb3dldmVyLCB0aGlzIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkLiAgU0NFIGdpdmVzIHlvdSBhIGxvdCBvZiBzZWN1cml0eSBiZW5lZml0cw0KLSAqIGZvciBsaXR0bGUgY29kaW5nIG92ZXJoZWFkLiAgSXQgd2lsbCBiZSBtdWNoIGhhcmRlciB0byB0YWtlIGFuIFNDRSBkaXNhYmxlZCBhcHBsaWNhdGlvbiBhbmQNCi0gKiBlaXRoZXIgc2VjdXJlIGl0IG9uIHlvdXIgb3duIG9yIGVuYWJsZSBTQ0UgYXQgYSBsYXRlciBzdGFnZS4gIEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gZGlzYWJsZSBTQ0UNCi0gKiBmb3IgY2FzZXMgd2hlcmUgeW91IGhhdmUgYSBsb3Qgb2YgZXhpc3RpbmcgY29kZSB0aGF0IHdhcyB3cml0dGVuIGJlZm9yZSBTQ0Ugd2FzIGludHJvZHVjZWQgYW5kDQotICogeW91J3JlIG1pZ3JhdGluZyB0aGVtIGEgbW9kdWxlIGF0IGEgdGltZS4NCi0gKg0KLSAqIFRoYXQgc2FpZCwgaGVyZSdzIGhvdyB5b3UgY2FuIGNvbXBsZXRlbHkgZGlzYWJsZSBTQ0U6DQotICoNCi0gKiBgYGANCi0gKiBhbmd1bGFyLm1vZHVsZSgnbXlBcHBXaXRoU2NlRGlzYWJsZWRteUFwcCcsIFtdKS5jb25maWcoZnVuY3Rpb24oJHNjZVByb3ZpZGVyKSB7DQotICogICAvLyBDb21wbGV0ZWx5IGRpc2FibGUgU0NFLiAgRm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMgb25seSENCi0gKiAgIC8vIERvIG5vdCB1c2UgaW4gbmV3IHByb2plY3RzLg0KLSAqICAgJHNjZVByb3ZpZGVyLmVuYWJsZWQoZmFsc2UpOw0KLSAqIH0pOw0KLSAqIGBgYA0KLSAqDQotICovDQotLyoganNoaW50IG1heGxlbjogMTAwICovDQotDQotZnVuY3Rpb24gJFNjZVByb3ZpZGVyKCkgew0KLSAgdmFyIGVuYWJsZWQgPSB0cnVlOw0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSAkc2NlUHJvdmlkZXIjZW5hYmxlZA0KLSAgICogQGtpbmQgZnVuY3Rpb24NCi0gICAqDQotICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB2YWx1ZSBJZiBwcm92aWRlZCwgdGhlbiBlbmFibGVzL2Rpc2FibGVzIFNDRS4NCi0gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgU0NFIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4NCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIEVuYWJsZXMvZGlzYWJsZXMgU0NFIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlLg0KLSAgICovDQotICB0aGlzLmVuYWJsZWQgPSBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkgew0KLSAgICAgIGVuYWJsZWQgPSAhIXZhbHVlOw0KLSAgICB9DQotICAgIHJldHVybiBlbmFibGVkOw0KLSAgfTsNCi0NCi0NCi0gIC8qIERlc2lnbiBub3RlcyBvbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgU0NFLg0KLSAgICoNCi0gICAqIFRoZSBBUEkgY29udHJhY3QgZm9yIHRoZSBTQ0UgZGVsZWdhdGUNCi0gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAqIFRoZSBTQ0UgZGVsZWdhdGUgb2JqZWN0IG11c3QgcHJvdmlkZSB0aGUgZm9sbG93aW5nIDMgbWV0aG9kczoNCi0gICAqDQotICAgKiAtIHRydXN0QXMoY29udGV4dEVudW0sIHZhbHVlKQ0KLSAgICogICAgIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdGVsbCB0aGUgU0NFIHNlcnZpY2UgdGhhdCB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgT0sgdG8gdXNlIGluIHRoZQ0KLSAgICogICAgIGNvbnRleHRzIHNwZWNpZmllZCBieSBjb250ZXh0RW51bS4gIEl0IG11c3QgcmV0dXJuIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgYWNjZXB0ZWQgYnkNCi0gICAqICAgICBnZXRUcnVzdGVkKCkgZm9yIGEgY29tcGF0aWJsZSBjb250ZXh0RW51bSBhbmQgcmV0dXJuIHRoaXMgdmFsdWUuDQotICAgKg0KLSAgICogLSB2YWx1ZU9mKHZhbHVlKQ0KLSAgICogICAgIEZvciB2YWx1ZXMgdGhhdCB3ZXJlIG5vdCBwcm9kdWNlZCBieSB0cnVzdEFzKCksIHJldHVybiB0aGVtIGFzIGlzLiAgRm9yIHZhbHVlcyB0aGF0IHdlcmUNCi0gICAqICAgICBwcm9kdWNlZCBieSB0cnVzdEFzKCksIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBpbnB1dCB2YWx1ZSB0byB0cnVzdEFzLiAgQmFzaWNhbGx5LCBpZg0KLSAgICogICAgIHRydXN0QXMgaXMgd3JhcHBpbmcgdGhlIGdpdmVuIHZhbHVlcyBpbnRvIHNvbWUgdHlwZSwgdGhpcyBvcGVyYXRpb24gdW53cmFwcyBpdCB3aGVuIGdpdmVuDQotICAgKiAgICAgc3VjaCBhIHZhbHVlLg0KLSAgICoNCi0gICAqIC0gZ2V0VHJ1c3RlZChjb250ZXh0RW51bSwgdmFsdWUpDQotICAgKiAgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBhIHZhbHVlIHRoYXQgaXMgc2FmZSB0byB1c2UgaW4gdGhlIGNvbnRleHQgc3BlY2lmaWVkIGJ5DQotICAgKiAgICAgY29udGV4dEVudW0gb3IgdGhyb3cgYW5kIGV4Y2VwdGlvbiBvdGhlcndpc2UuDQotICAgKg0KLSAgICogTk9URTogVGhpcyBjb250cmFjdCBkZWxpYmVyYXRlbHkgZG9lcyBOT1Qgc3RhdGUgdGhhdCB2YWx1ZXMgcmV0dXJuZWQgYnkgdHJ1c3RBcygpIG11c3QgYmUNCi0gICAqIG9wYXF1ZSBvciB3cmFwcGVkIGluIHNvbWUgaG9sZGVyIG9iamVjdC4gIFRoYXQgaGFwcGVucyB0byBiZSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuICBGb3INCi0gICAqIGluc3RhbmNlLCBhbiBpbXBsZW1lbnRhdGlvbiBjb3VsZCBtYWludGFpbiBhIHJlZ2lzdHJ5IG9mIGFsbCB0cnVzdGVkIG9iamVjdHMgYnkgY29udGV4dC4gIEluDQotICAgKiBzdWNoIGEgY2FzZSwgdHJ1c3RBcygpIHdvdWxkIHJldHVybiB0aGUgc2FtZSBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGluLiAgZ2V0VHJ1c3RlZCgpIHdvdWxkDQotICAgKiByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IHBhc3NlZCBpbiBpZiBpdCB3YXMgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5IHVuZGVyIGEgY29tcGF0aWJsZSBjb250ZXh0IG9yDQotICAgKiB0aHJvdyBhbiBleGNlcHRpb24gb3RoZXJ3aXNlLiAgQW4gaW1wbGVtZW50YXRpb24gbWlnaHQgb25seSB3cmFwIHZhbHVlcyBzb21lIG9mIHRoZSB0aW1lIGJhc2VkDQotICAgKiBvbiBzb21lIGNyaXRlcmlhLiAgZ2V0VHJ1c3RlZCgpIG1pZ2h0IHJldHVybiBhIHZhbHVlIGFuZCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciBzcGVjaWFsDQotICAgKiBjb25zdGFudHMgb3Igb2JqZWN0cyBldmVuIGlmIG5vdCB3cmFwcGVkLiAgQWxsIHN1Y2ggaW1wbGVtZW50YXRpb25zIGZ1bGZpbGwgdGhpcyBjb250cmFjdC4NCi0gICAqDQotICAgKg0KLSAgICogQSBub3RlIG9uIHRoZSBpbmhlcml0YW5jZSBtb2RlbCBmb3IgU0NFIGNvbnRleHRzDQotICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAqIEkndmUgdXNlZCBpbmhlcml0YW5jZSBhbmQgbWFkZSBSRVNPVVJDRV9VUkwgd3JhcHBlZCB0eXBlcyBhIHN1YnR5cGUgb2YgVVJMIHdyYXBwZWQgdHlwZXMuICBUaGlzDQotICAgKiBpcyBwdXJlbHkgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlscy4NCi0gICAqDQotICAgKiBUaGUgY29udHJhY3QgaXMgc2ltcGx5IHRoaXM6DQotICAgKg0KLSAgICogICAgIGdldFRydXN0ZWQoJHNjZS5SRVNPVVJDRV9VUkwsIHZhbHVlKSBzdWNjZWVkaW5nIGltcGxpZXMgdGhhdCBnZXRUcnVzdGVkKCRzY2UuVVJMLCB2YWx1ZSkNCi0gICAqICAgICB3aWxsIGFsc28gc3VjY2VlZC4NCi0gICAqDQotICAgKiBJbmhlcml0YW5jZSBoYXBwZW5zIHRvIGNhcHR1cmUgdGhpcyBpbiBhIG5hdHVyYWwgd2F5LiAgSW4gc29tZSBmdXR1cmUsIHdlDQotICAgKiBtYXkgbm90IHVzZSBpbmhlcml0YW5jZSBhbnltb3JlLiAgVGhhdCBpcyBPSyBiZWNhdXNlIG5vIGNvZGUgb3V0c2lkZSBvZg0KLSAgICogc2NlLmpzIGFuZCBzY2VTcGVjcy5qcyB3b3VsZCBuZWVkIHRvIGJlIGF3YXJlIG9mIHRoaXMgZGV0YWlsLg0KLSAgICovDQotDQotICB0aGlzLiRnZXQgPSBbJyRwYXJzZScsICckc2NlRGVsZWdhdGUnLCBmdW5jdGlvbigNCi0gICAgICAgICAgICAgICAgJHBhcnNlLCAgICRzY2VEZWxlZ2F0ZSkgew0KLSAgICAvLyBQcmVyZXE6IEVuc3VyZSB0aGF0IHdlJ3JlIG5vdCBydW5uaW5nIGluIElFPDExIHF1aXJrcyBtb2RlLiAgSW4gdGhhdCBtb2RlLCBJRSA8IDExIGFsbG93DQotICAgIC8vIHRoZSAiZXhwcmVzc2lvbihqYXZhc2NyaXB0IGV4cHJlc3Npb24pIiBzeW50YXggd2hpY2ggaXMgaW5zZWN1cmUuDQotICAgIGlmIChlbmFibGVkICYmIG1zaWUgPCA4KSB7DQotICAgICAgdGhyb3cgJHNjZU1pbkVycignaWVxdWlya3MnLA0KLSAgICAgICAgJ1N0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nIGRvZXMgbm90IHN1cHBvcnQgSW50ZXJuZXQgRXhwbG9yZXIgdmVyc2lvbiA8IDExIGluIHF1aXJrcyAnICsNCi0gICAgICAgICdtb2RlLiAgWW91IGNhbiBmaXggdGhpcyBieSBhZGRpbmcgdGhlIHRleHQgPCFkb2N0eXBlIGh0bWw+IHRvIHRoZSB0b3Agb2YgeW91ciBIVE1MICcgKw0KLSAgICAgICAgJ2RvY3VtZW50LiAgU2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRzY2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7DQotICAgIH0NCi0NCi0gICAgdmFyIHNjZSA9IHNoYWxsb3dDb3B5KFNDRV9DT05URVhUUyk7DQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRzY2UjaXNFbmFibGVkDQotICAgICAqIEBraW5kIGZ1bmN0aW9uDQotICAgICAqDQotICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgU0NFIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4gIElmIHlvdSB3YW50IHRvIHNldCB0aGUgdmFsdWUsIHlvdQ0KLSAgICAgKiBoYXZlIHRvIGRvIGl0IGF0IG1vZHVsZSBjb25maWcgdGltZSBvbiB7QGxpbmsgbmcuJHNjZVByb3ZpZGVyICRzY2VQcm92aWRlcn0uDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIFNDRSBpcyBlbmFibGVkLg0KLSAgICAgKi8NCi0gICAgc2NlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHJldHVybiBlbmFibGVkOw0KLSAgICB9Ow0KLSAgICBzY2UudHJ1c3RBcyA9ICRzY2VEZWxlZ2F0ZS50cnVzdEFzOw0KLSAgICBzY2UuZ2V0VHJ1c3RlZCA9ICRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkOw0KLSAgICBzY2UudmFsdWVPZiA9ICRzY2VEZWxlZ2F0ZS52YWx1ZU9mOw0KLQ0KLSAgICBpZiAoIWVuYWJsZWQpIHsNCi0gICAgICBzY2UudHJ1c3RBcyA9IHNjZS5nZXRUcnVzdGVkID0gZnVuY3Rpb24odHlwZSwgdmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9Ow0KLSAgICAgIHNjZS52YWx1ZU9mID0gaWRlbnRpdHk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICogQG5hbWUgJHNjZSNwYXJzZUFzDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBDb252ZXJ0cyBBbmd1bGFyIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGludG8gYSBmdW5jdGlvbi4gIFRoaXMgaXMgbGlrZSB7QGxpbmsNCi0gICAgICogbmcuJHBhcnNlICRwYXJzZX0gYW5kIGlzIGlkZW50aWNhbCB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGEgbGl0ZXJhbCBjb25zdGFudC4gIE90aGVyd2lzZSwgaXQNCi0gICAgICogd3JhcHMgdGhlIGV4cHJlc3Npb24gaW4gYSBjYWxsIHRvIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWQgJHNjZS5nZXRUcnVzdGVkKCp0eXBlKiwNCi0gICAgICogKnJlc3VsdCopfQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUga2luZCBvZiBTQ0UgY29udGV4dCBpbiB3aGljaCB0aGlzIHJlc3VsdCB3aWxsIGJlIHVzZWQuDQotICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFN0cmluZyBleHByZXNzaW9uIHRvIGNvbXBpbGUuDQotICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0LCBsb2NhbHMpfSBhIGZ1bmN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb246DQotICAgICAqDQotICAgICAqICAgICogYGNvbnRleHRgIOKAPyBge29iamVjdH1gIOKAPyBhbiBvYmplY3QgYWdhaW5zdCB3aGljaCBhbnkgZXhwcmVzc2lvbnMgZW1iZWRkZWQgaW4gdGhlIHN0cmluZ3MNCi0gICAgICogICAgICBhcmUgZXZhbHVhdGVkIGFnYWluc3QgKHR5cGljYWxseSBhIHNjb3BlIG9iamVjdCkuDQotICAgICAqICAgICogYGxvY2Fsc2Ag4oA/IGB7b2JqZWN0PX1gIOKAPyBsb2NhbCB2YXJpYWJsZXMgY29udGV4dCBvYmplY3QsIHVzZWZ1bCBmb3Igb3ZlcnJpZGluZyB2YWx1ZXMgaW4NCi0gICAgICogICAgICBgY29udGV4dGAuDQotICAgICAqLw0KLSAgICBzY2UucGFyc2VBcyA9IGZ1bmN0aW9uIHNjZVBhcnNlQXModHlwZSwgZXhwcikgew0KLSAgICAgIHZhciBwYXJzZWQgPSAkcGFyc2UoZXhwcik7DQotICAgICAgaWYgKHBhcnNlZC5saXRlcmFsICYmIHBhcnNlZC5jb25zdGFudCkgew0KLSAgICAgICAgcmV0dXJuIHBhcnNlZDsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuICRwYXJzZShleHByLCBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICAgICAgICByZXR1cm4gc2NlLmdldFRydXN0ZWQodHlwZSwgdmFsdWUpOw0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICAvKioNCi0gICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgKiBAbmFtZSAkc2NlI3RydXN0QXMNCi0gICAgICoNCi0gICAgICogQGRlc2NyaXB0aW9uDQotICAgICAqIERlbGVnYXRlcyB0byB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0uICBBcyBzdWNoLA0KLSAgICAgKiByZXR1cm5zIGFuIG9iamVjdCB0aGF0IGlzIHRydXN0ZWQgYnkgYW5ndWxhciBmb3IgdXNlIGluIHNwZWNpZmllZCBzdHJpY3QgY29udGV4dHVhbA0KLSAgICAgKiBlc2NhcGluZyBjb250ZXh0cyAoc3VjaCBhcyBuZy1iaW5kLWh0bWwsIG5nLWluY2x1ZGUsIGFueSBzcmMgYXR0cmlidXRlDQotICAgICAqIGludGVycG9sYXRpb24sIGFueSBkb20gZXZlbnQgYmluZGluZyBhdHRyaWJ1dGUgaW50ZXJwb2xhdGlvbiBzdWNoIGFzIGZvciBvbmNsaWNrLCAgZXRjLikNCi0gICAgICogdGhhdCB1c2VzIHRoZSBwcm92aWRlZCB2YWx1ZS4gIFNlZSAqIHtAbGluayBuZy4kc2NlICRzY2V9IGZvciBlbmFibGluZyBzdHJpY3QgY29udGV4dHVhbA0KLSAgICAgKiBlc2NhcGluZy4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGtpbmQgb2YgY29udGV4dCBpbiB3aGljaCB0aGlzIHZhbHVlIGlzIHNhZmUgZm9yIHVzZS4gIGUuZy4gdXJsLA0KLSAgICAgKiAgIHJlc291cmNlX3VybCwgaHRtbCwganMgYW5kIGNzcy4NCi0gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIHRydXN0ZWQvc2FmZS4NCi0gICAgICogQHJldHVybnMgeyp9IEEgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byBzdGFuZCBpbiBmb3IgdGhlIHByb3ZpZGVkIGB2YWx1ZWAgaW4gcGxhY2VzDQotICAgICAqIHdoZXJlIEFuZ3VsYXIgZXhwZWN0cyBhICRzY2UudHJ1c3RBcygpIHJldHVybiB2YWx1ZS4NCi0gICAgICovDQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRzY2UjdHJ1c3RBc0h0bWwNCi0gICAgICoNCi0gICAgICogQGRlc2NyaXB0aW9uDQotICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS50cnVzdEFzSHRtbCh2YWx1ZSlgIOKGPw0KLSAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBcygkc2NlLkhUTUwsIHZhbHVlKWB9DQotICAgICAqDQotICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRydXN0QXMuDQotICAgICAqIEByZXR1cm5zIHsqfSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWRIdG1sDQotICAgICAqICAgICAkc2NlLmdldFRydXN0ZWRIdG1sKHZhbHVlKX0gdG8gb2J0YWluIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIChwcml2aWxlZ2VkIGRpcmVjdGl2ZXMNCi0gICAgICogICAgIG9ubHkgYWNjZXB0IGV4cHJlc3Npb25zIHRoYXQgYXJlIGVpdGhlciBsaXRlcmFsIGNvbnN0YW50cyBvciBhcmUgdGhlDQotICAgICAqICAgICByZXR1cm4gdmFsdWUgb2Yge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyAkc2NlLnRydXN0QXN9LikNCi0gICAgICovDQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRzY2UjdHJ1c3RBc1VybA0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnRydXN0QXNVcmwodmFsdWUpYCDihj8NCi0gICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXMoJHNjZS5VUkwsIHZhbHVlKWB9DQotICAgICAqDQotICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRydXN0QXMuDQotICAgICAqIEByZXR1cm5zIHsqfSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWRVcmwNCi0gICAgICogICAgICRzY2UuZ2V0VHJ1c3RlZFVybCh2YWx1ZSl9IHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgdmFsdWUuICAocHJpdmlsZWdlZCBkaXJlY3RpdmVzDQotICAgICAqICAgICBvbmx5IGFjY2VwdCBleHByZXNzaW9ucyB0aGF0IGFyZSBlaXRoZXIgbGl0ZXJhbCBjb25zdGFudHMgb3IgYXJlIHRoZQ0KLSAgICAgKiAgICAgcmV0dXJuIHZhbHVlIG9mIHtAbGluayBuZy4kc2NlI3RydXN0QXMgJHNjZS50cnVzdEFzfS4pDQotICAgICAqLw0KLQ0KLSAgICAvKioNCi0gICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgKiBAbmFtZSAkc2NlI3RydXN0QXNSZXNvdXJjZVVybA0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnRydXN0QXNSZXNvdXJjZVVybCh2YWx1ZSlgIOKGPw0KLSAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBcygkc2NlLlJFU09VUkNFX1VSTCwgdmFsdWUpYH0NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHJ1c3RBcy4NCi0gICAgICogQHJldHVybnMgeyp9IEFuIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8ge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZFJlc291cmNlVXJsDQotICAgICAqICAgICAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybCh2YWx1ZSl9IHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgdmFsdWUuICAocHJpdmlsZWdlZCBkaXJlY3RpdmVzDQotICAgICAqICAgICBvbmx5IGFjY2VwdCBleHByZXNzaW9ucyB0aGF0IGFyZSBlaXRoZXIgbGl0ZXJhbCBjb25zdGFudHMgb3IgYXJlIHRoZSByZXR1cm4NCi0gICAgICogICAgIHZhbHVlIG9mIHtAbGluayBuZy4kc2NlI3RydXN0QXMgJHNjZS50cnVzdEFzfS4pDQotICAgICAqLw0KLQ0KLSAgICAvKioNCi0gICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgKiBAbmFtZSAkc2NlI3RydXN0QXNKcw0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnRydXN0QXNKcyh2YWx1ZSlgIOKGPw0KLSAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBcygkc2NlLkpTLCB2YWx1ZSlgfQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB0cnVzdEFzLg0KLSAgICAgKiBAcmV0dXJucyB7Kn0gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkSnMNCi0gICAgICogICAgICRzY2UuZ2V0VHJ1c3RlZEpzKHZhbHVlKX0gdG8gb2J0YWluIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIChwcml2aWxlZ2VkIGRpcmVjdGl2ZXMNCi0gICAgICogICAgIG9ubHkgYWNjZXB0IGV4cHJlc3Npb25zIHRoYXQgYXJlIGVpdGhlciBsaXRlcmFsIGNvbnN0YW50cyBvciBhcmUgdGhlDQotICAgICAqICAgICByZXR1cm4gdmFsdWUgb2Yge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyAkc2NlLnRydXN0QXN9LikNCi0gICAgICovDQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRzY2UjZ2V0VHJ1c3RlZA0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogRGVsZWdhdGVzIHRvIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZCBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWRgfS4gIEFzIHN1Y2gsDQotICAgICAqIHRha2VzIHRoZSByZXN1bHQgb2YgYSB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzIGAkc2NlLnRydXN0QXNgfSgpIGNhbGwgYW5kIHJldHVybnMgdGhlDQotICAgICAqIG9yaWdpbmFsbHkgc3VwcGxpZWQgdmFsdWUgaWYgdGhlIHF1ZXJpZWQgY29udGV4dCB0eXBlIGlzIGEgc3VwZXJ0eXBlIG9mIHRoZSBjcmVhdGVkIHR5cGUuDQotICAgICAqIElmIHRoaXMgY29uZGl0aW9uIGlzbid0IHNhdGlzZmllZCwgdGhyb3dzIGFuIGV4Y2VwdGlvbi4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGtpbmQgb2YgY29udGV4dCBpbiB3aGljaCB0aGlzIHZhbHVlIGlzIHRvIGJlIHVzZWQuDQotICAgICAqIEBwYXJhbSB7Kn0gbWF5YmVUcnVzdGVkIFRoZSByZXN1bHQgb2YgYSBwcmlvciB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzIGAkc2NlLnRydXN0QXNgfQ0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsLg0KLSAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIHRoZSB3YXMgb3JpZ2luYWxseSBwcm92aWRlZCB0bw0KLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyBgJHNjZS50cnVzdEFzYH0gaWYgdmFsaWQgaW4gdGhpcyBjb250ZXh0Lg0KLSAgICAgKiAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aHJvd3MgYW4gZXhjZXB0aW9uLg0KLSAgICAgKi8NCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICogQG5hbWUgJHNjZSNnZXRUcnVzdGVkSHRtbA0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLmdldFRydXN0ZWRIdG1sKHZhbHVlKWAg4oY/DQotICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI2dldFRydXN0ZWQgYCRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkKCRzY2UuSFRNTCwgdmFsdWUpYH0NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFzcyB0byBgJHNjZS5nZXRUcnVzdGVkYC4NCi0gICAgICogQHJldHVybnMgeyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgYCRzY2UuZ2V0VHJ1c3RlZCgkc2NlLkhUTUwsIHZhbHVlKWANCi0gICAgICovDQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRzY2UjZ2V0VHJ1c3RlZENzcw0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLmdldFRydXN0ZWRDc3ModmFsdWUpYCDihj8NCi0gICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZCBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWQoJHNjZS5DU1MsIHZhbHVlKWB9DQotICAgICAqDQotICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBhc3MgdG8gYCRzY2UuZ2V0VHJ1c3RlZGAuDQotICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcmV0dXJuIHZhbHVlIG9mIGAkc2NlLmdldFRydXN0ZWQoJHNjZS5DU1MsIHZhbHVlKWANCi0gICAgICovDQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRzY2UjZ2V0VHJ1c3RlZFVybA0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLmdldFRydXN0ZWRVcmwodmFsdWUpYCDihj8NCi0gICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZCBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWQoJHNjZS5VUkwsIHZhbHVlKWB9DQotICAgICAqDQotICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBhc3MgdG8gYCRzY2UuZ2V0VHJ1c3RlZGAuDQotICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcmV0dXJuIHZhbHVlIG9mIGAkc2NlLmdldFRydXN0ZWQoJHNjZS5VUkwsIHZhbHVlKWANCi0gICAgICovDQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRzY2UjZ2V0VHJ1c3RlZFJlc291cmNlVXJsDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UuZ2V0VHJ1c3RlZFJlc291cmNlVXJsKHZhbHVlKWAg4oY/DQotICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI2dldFRydXN0ZWQgYCRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkKCRzY2UuUkVTT1VSQ0VfVVJMLCB2YWx1ZSlgfQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXNzIHRvIGAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZGAuDQotICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcmV0dXJuIHZhbHVlIG9mIGAkc2NlLmdldFRydXN0ZWQoJHNjZS5SRVNPVVJDRV9VUkwsIHZhbHVlKWANCi0gICAgICovDQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRzY2UjZ2V0VHJ1c3RlZEpzDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UuZ2V0VHJ1c3RlZEpzKHZhbHVlKWAg4oY/DQotICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI2dldFRydXN0ZWQgYCRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkKCRzY2UuSlMsIHZhbHVlKWB9DQotICAgICAqDQotICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBhc3MgdG8gYCRzY2UuZ2V0VHJ1c3RlZGAuDQotICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcmV0dXJuIHZhbHVlIG9mIGAkc2NlLmdldFRydXN0ZWQoJHNjZS5KUywgdmFsdWUpYA0KLSAgICAgKi8NCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICogQG5hbWUgJHNjZSNwYXJzZUFzSHRtbA0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnBhcnNlQXNIdG1sKGV4cHJlc3Npb24gc3RyaW5nKWAg4oY/DQotICAgICAqICAgICB7QGxpbmsgbmcuJHNjZSNwYXJzZUFzIGAkc2NlLnBhcnNlQXMoJHNjZS5IVE1MLCB2YWx1ZSlgfQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBTdHJpbmcgZXhwcmVzc2lvbiB0byBjb21waWxlLg0KLSAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCwgbG9jYWxzKX0gYSBmdW5jdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb21waWxlZCBleHByZXNzaW9uOg0KLSAgICAgKg0KLSAgICAgKiAgICAqIGBjb250ZXh0YCDigD8gYHtvYmplY3R9YCDigD8gYW4gb2JqZWN0IGFnYWluc3Qgd2hpY2ggYW55IGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBzdHJpbmdzDQotICAgICAqICAgICAgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0ICh0eXBpY2FsbHkgYSBzY29wZSBvYmplY3QpLg0KLSAgICAgKiAgICAqIGBsb2NhbHNgIOKAPyBge29iamVjdD19YCDigD8gbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluDQotICAgICAqICAgICAgYGNvbnRleHRgLg0KLSAgICAgKi8NCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICogQG5hbWUgJHNjZSNwYXJzZUFzQ3NzDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UucGFyc2VBc0Nzcyh2YWx1ZSlgIOKGPw0KLSAgICAgKiAgICAge0BsaW5rIG5nLiRzY2UjcGFyc2VBcyBgJHNjZS5wYXJzZUFzKCRzY2UuQ1NTLCB2YWx1ZSlgfQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBTdHJpbmcgZXhwcmVzc2lvbiB0byBjb21waWxlLg0KLSAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCwgbG9jYWxzKX0gYSBmdW5jdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb21waWxlZCBleHByZXNzaW9uOg0KLSAgICAgKg0KLSAgICAgKiAgICAqIGBjb250ZXh0YCDigD8gYHtvYmplY3R9YCDigD8gYW4gb2JqZWN0IGFnYWluc3Qgd2hpY2ggYW55IGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBzdHJpbmdzDQotICAgICAqICAgICAgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0ICh0eXBpY2FsbHkgYSBzY29wZSBvYmplY3QpLg0KLSAgICAgKiAgICAqIGBsb2NhbHNgIOKAPyBge29iamVjdD19YCDigD8gbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluDQotICAgICAqICAgICAgYGNvbnRleHRgLg0KLSAgICAgKi8NCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICogQG5hbWUgJHNjZSNwYXJzZUFzVXJsDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UucGFyc2VBc1VybCh2YWx1ZSlgIOKGPw0KLSAgICAgKiAgICAge0BsaW5rIG5nLiRzY2UjcGFyc2VBcyBgJHNjZS5wYXJzZUFzKCRzY2UuVVJMLCB2YWx1ZSlgfQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBTdHJpbmcgZXhwcmVzc2lvbiB0byBjb21waWxlLg0KLSAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCwgbG9jYWxzKX0gYSBmdW5jdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb21waWxlZCBleHByZXNzaW9uOg0KLSAgICAgKg0KLSAgICAgKiAgICAqIGBjb250ZXh0YCDigD8gYHtvYmplY3R9YCDigD8gYW4gb2JqZWN0IGFnYWluc3Qgd2hpY2ggYW55IGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBzdHJpbmdzDQotICAgICAqICAgICAgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0ICh0eXBpY2FsbHkgYSBzY29wZSBvYmplY3QpLg0KLSAgICAgKiAgICAqIGBsb2NhbHNgIOKAPyBge29iamVjdD19YCDigD8gbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluDQotICAgICAqICAgICAgYGNvbnRleHRgLg0KLSAgICAgKi8NCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBtZXRob2QNCi0gICAgICogQG5hbWUgJHNjZSNwYXJzZUFzUmVzb3VyY2VVcmwNCi0gICAgICoNCi0gICAgICogQGRlc2NyaXB0aW9uDQotICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5wYXJzZUFzUmVzb3VyY2VVcmwodmFsdWUpYCDihj8NCi0gICAgICogICAgIHtAbGluayBuZy4kc2NlI3BhcnNlQXMgYCRzY2UucGFyc2VBcygkc2NlLlJFU09VUkNFX1VSTCwgdmFsdWUpYH0NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS4NCi0gICAgICogQHJldHVybnMge2Z1bmN0aW9uKGNvbnRleHQsIGxvY2Fscyl9IGEgZnVuY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbjoNCi0gICAgICoNCi0gICAgICogICAgKiBgY29udGV4dGAg4oA/IGB7b2JqZWN0fWAg4oA/IGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5ncw0KLSAgICAgKiAgICAgIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCAodHlwaWNhbGx5IGEgc2NvcGUgb2JqZWN0KS4NCi0gICAgICogICAgKiBgbG9jYWxzYCDigD8gYHtvYmplY3Q9fWAg4oA/IGxvY2FsIHZhcmlhYmxlcyBjb250ZXh0IG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpbg0KLSAgICAgKiAgICAgIGBjb250ZXh0YC4NCi0gICAgICovDQotDQotICAgIC8qKg0KLSAgICAgKiBAbmdkb2MgbWV0aG9kDQotICAgICAqIEBuYW1lICRzY2UjcGFyc2VBc0pzDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UucGFyc2VBc0pzKHZhbHVlKWAg4oY/DQotICAgICAqICAgICB7QGxpbmsgbmcuJHNjZSNwYXJzZUFzIGAkc2NlLnBhcnNlQXMoJHNjZS5KUywgdmFsdWUpYH0NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS4NCi0gICAgICogQHJldHVybnMge2Z1bmN0aW9uKGNvbnRleHQsIGxvY2Fscyl9IGEgZnVuY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbjoNCi0gICAgICoNCi0gICAgICogICAgKiBgY29udGV4dGAg4oA/IGB7b2JqZWN0fWAg4oA/IGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5ncw0KLSAgICAgKiAgICAgIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCAodHlwaWNhbGx5IGEgc2NvcGUgb2JqZWN0KS4NCi0gICAgICogICAgKiBgbG9jYWxzYCDigD8gYHtvYmplY3Q9fWAg4oA/IGxvY2FsIHZhcmlhYmxlcyBjb250ZXh0IG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpbg0KLSAgICAgKiAgICAgIGBjb250ZXh0YC4NCi0gICAgICovDQotDQotICAgIC8vIFNob3J0aGFuZCBkZWxlZ2F0aW9ucy4NCi0gICAgdmFyIHBhcnNlID0gc2NlLnBhcnNlQXMsDQotICAgICAgICBnZXRUcnVzdGVkID0gc2NlLmdldFRydXN0ZWQsDQotICAgICAgICB0cnVzdEFzID0gc2NlLnRydXN0QXM7DQotDQotICAgIGZvckVhY2goU0NFX0NPTlRFWFRTLCBmdW5jdGlvbihlbnVtVmFsdWUsIG5hbWUpIHsNCi0gICAgICB2YXIgbE5hbWUgPSBsb3dlcmNhc2UobmFtZSk7DQotICAgICAgc2NlW2NhbWVsQ2FzZSgicGFyc2VfYXNfIiArIGxOYW1lKV0gPSBmdW5jdGlvbihleHByKSB7DQotICAgICAgICByZXR1cm4gcGFyc2UoZW51bVZhbHVlLCBleHByKTsNCi0gICAgICB9Ow0KLSAgICAgIHNjZVtjYW1lbENhc2UoImdldF90cnVzdGVkXyIgKyBsTmFtZSldID0gZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBnZXRUcnVzdGVkKGVudW1WYWx1ZSwgdmFsdWUpOw0KLSAgICAgIH07DQotICAgICAgc2NlW2NhbWVsQ2FzZSgidHJ1c3RfYXNfIiArIGxOYW1lKV0gPSBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIHRydXN0QXMoZW51bVZhbHVlLCB2YWx1ZSk7DQotICAgICAgfTsNCi0gICAgfSk7DQotDQotICAgIHJldHVybiBzY2U7DQotICB9XTsNCi19DQotDQotLyoqDQotICogISEhIFRoaXMgaXMgYW4gdW5kb2N1bWVudGVkICJwcml2YXRlIiBzZXJ2aWNlICEhIQ0KLSAqDQotICogQG5hbWUgJHNuaWZmZXINCi0gKiBAcmVxdWlyZXMgJHdpbmRvdw0KLSAqIEByZXF1aXJlcyAkZG9jdW1lbnQNCi0gKg0KLSAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaGlzdG9yeSBEb2VzIHRoZSBicm93c2VyIHN1cHBvcnQgaHRtbDUgaGlzdG9yeSBhcGkgPw0KLSAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdHJhbnNpdGlvbnMgRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IENTUyB0cmFuc2l0aW9uIGV2ZW50cyA/DQotICogQHByb3BlcnR5IHtib29sZWFufSBhbmltYXRpb25zIERvZXMgdGhlIGJyb3dzZXIgc3VwcG9ydCBDU1MgYW5pbWF0aW9uIGV2ZW50cyA/DQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBUaGlzIGlzIHZlcnkgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRlc3RpbmcgYnJvd3NlcidzIGZlYXR1cmVzLg0KLSAqLw0KLWZ1bmN0aW9uICRTbmlmZmVyUHJvdmlkZXIoKSB7DQotICB0aGlzLiRnZXQgPSBbJyR3aW5kb3cnLCAnJGRvY3VtZW50JywgZnVuY3Rpb24oJHdpbmRvdywgJGRvY3VtZW50KSB7DQotICAgIHZhciBldmVudFN1cHBvcnQgPSB7fSwNCi0gICAgICAgIGFuZHJvaWQgPQ0KLSAgICAgICAgICBpbnQoKC9hbmRyb2lkIChcZCspLy5leGVjKGxvd2VyY2FzZSgoJHdpbmRvdy5uYXZpZ2F0b3IgfHwge30pLnVzZXJBZ2VudCkpIHx8IFtdKVsxXSksDQotICAgICAgICBib3hlZSA9IC9Cb3hlZS9pLnRlc3QoKCR3aW5kb3cubmF2aWdhdG9yIHx8IHt9KS51c2VyQWdlbnQpLA0KLSAgICAgICAgZG9jdW1lbnQgPSAkZG9jdW1lbnRbMF0gfHwge30sDQotICAgICAgICB2ZW5kb3JQcmVmaXgsDQotICAgICAgICB2ZW5kb3JSZWdleCA9IC9eKE1venx3ZWJraXR8bXMpKD89W0EtWl0pLywNCi0gICAgICAgIGJvZHlTdHlsZSA9IGRvY3VtZW50LmJvZHkgJiYgZG9jdW1lbnQuYm9keS5zdHlsZSwNCi0gICAgICAgIHRyYW5zaXRpb25zID0gZmFsc2UsDQotICAgICAgICBhbmltYXRpb25zID0gZmFsc2UsDQotICAgICAgICBtYXRjaDsNCi0NCi0gICAgaWYgKGJvZHlTdHlsZSkgew0KLSAgICAgIGZvciAodmFyIHByb3AgaW4gYm9keVN0eWxlKSB7DQotICAgICAgICBpZiAobWF0Y2ggPSB2ZW5kb3JSZWdleC5leGVjKHByb3ApKSB7DQotICAgICAgICAgIHZlbmRvclByZWZpeCA9IG1hdGNoWzBdOw0KLSAgICAgICAgICB2ZW5kb3JQcmVmaXggPSB2ZW5kb3JQcmVmaXguc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB2ZW5kb3JQcmVmaXguc3Vic3RyKDEpOw0KLSAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotICAgICAgaWYgKCF2ZW5kb3JQcmVmaXgpIHsNCi0gICAgICAgIHZlbmRvclByZWZpeCA9ICgnV2Via2l0T3BhY2l0eScgaW4gYm9keVN0eWxlKSAmJiAnd2Via2l0JzsNCi0gICAgICB9DQotDQotICAgICAgdHJhbnNpdGlvbnMgPSAhISgoJ3RyYW5zaXRpb24nIGluIGJvZHlTdHlsZSkgfHwgKHZlbmRvclByZWZpeCArICdUcmFuc2l0aW9uJyBpbiBib2R5U3R5bGUpKTsNCi0gICAgICBhbmltYXRpb25zICA9ICEhKCgnYW5pbWF0aW9uJyBpbiBib2R5U3R5bGUpIHx8ICh2ZW5kb3JQcmVmaXggKyAnQW5pbWF0aW9uJyBpbiBib2R5U3R5bGUpKTsNCi0NCi0gICAgICBpZiAoYW5kcm9pZCAmJiAoIXRyYW5zaXRpb25zIHx8ICAhYW5pbWF0aW9ucykpIHsNCi0gICAgICAgIHRyYW5zaXRpb25zID0gaXNTdHJpbmcoZG9jdW1lbnQuYm9keS5zdHlsZS53ZWJraXRUcmFuc2l0aW9uKTsNCi0gICAgICAgIGFuaW1hdGlvbnMgPSBpc1N0cmluZyhkb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdEFuaW1hdGlvbik7DQotICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIHJldHVybiB7DQotICAgICAgLy8gQW5kcm9pZCBoYXMgaGlzdG9yeS5wdXNoU3RhdGUsIGJ1dCBpdCBkb2VzIG5vdCB1cGRhdGUgbG9jYXRpb24gY29ycmVjdGx5DQotICAgICAgLy8gc28gbGV0J3Mgbm90IHVzZSB0aGUgaGlzdG9yeSBBUEkgYXQgYWxsLg0KLSAgICAgIC8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9MTc0NzENCi0gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2lzc3Vlcy85MDQNCi0NCi0gICAgICAvLyBvbGRlciB3ZWJraXQgYnJvd3NlciAoNTMzLjkpIG9uIEJveGVlIGJveCBoYXMgZXhhY3RseSB0aGUgc2FtZSBwcm9ibGVtIGFzIEFuZHJvaWQgaGFzDQotICAgICAgLy8gc28gbGV0J3Mgbm90IHVzZSB0aGUgaGlzdG9yeSBBUEkgYWxzbw0KLSAgICAgIC8vIFdlIGFyZSBwdXJwb3NlZnVsbHkgdXNpbmcgYCEoYW5kcm9pZCA8IDQpYCB0byBjb3ZlciB0aGUgY2FzZSB3aGVuIGBhbmRyb2lkYCBpcyB1bmRlZmluZWQNCi0gICAgICAvLyBqc2hpbnQgLVcwMTgNCi0gICAgICBoaXN0b3J5OiAhISgkd2luZG93Lmhpc3RvcnkgJiYgJHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSAmJiAhKGFuZHJvaWQgPCA0KSAmJiAhYm94ZWUpLA0KLSAgICAgIC8vIGpzaGludCArVzAxOA0KLSAgICAgIGhhc0V2ZW50OiBmdW5jdGlvbihldmVudCkgew0KLSAgICAgICAgLy8gSUU5IGltcGxlbWVudHMgJ2lucHV0JyBldmVudCBpdCdzIHNvIGZ1YmFyZWQgdGhhdCB3ZSByYXRoZXIgcHJldGVuZCB0aGF0IGl0IGRvZXNuJ3QgaGF2ZQ0KLSAgICAgICAgLy8gaXQuIEluIHBhcnRpY3VsYXIgdGhlIGV2ZW50IGlzIG5vdCBmaXJlZCB3aGVuIGJhY2tzcGFjZSBvciBkZWxldGUga2V5IGFyZSBwcmVzc2VkIG9yDQotICAgICAgICAvLyB3aGVuIGN1dCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLg0KLSAgICAgICAgLy8gSUUxMCsgaW1wbGVtZW50cyAnaW5wdXQnIGV2ZW50IGJ1dCBpdCBlcnJvbmVvdXNseSBmaXJlcyB1bmRlciB2YXJpb3VzIHNpdHVhdGlvbnMsDQotICAgICAgICAvLyBlLmcuIHdoZW4gcGxhY2Vob2xkZXIgY2hhbmdlcywgb3IgYSBmb3JtIGlzIGZvY3VzZWQuDQotICAgICAgICBpZiAoZXZlbnQgPT09ICdpbnB1dCcgJiYgbXNpZSA8PSAxMSkgcmV0dXJuIGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGV2ZW50U3VwcG9ydFtldmVudF0pKSB7DQotICAgICAgICAgIHZhciBkaXZFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCi0gICAgICAgICAgZXZlbnRTdXBwb3J0W2V2ZW50XSA9ICdvbicgKyBldmVudCBpbiBkaXZFbG07DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZXZlbnRTdXBwb3J0W2V2ZW50XTsNCi0gICAgICB9LA0KLSAgICAgIGNzcDogY3NwKCksDQotICAgICAgdmVuZG9yUHJlZml4OiB2ZW5kb3JQcmVmaXgsDQotICAgICAgdHJhbnNpdGlvbnM6IHRyYW5zaXRpb25zLA0KLSAgICAgIGFuaW1hdGlvbnM6IGFuaW1hdGlvbnMsDQotICAgICAgYW5kcm9pZDogYW5kcm9pZA0KLSAgICB9Ow0KLSAgfV07DQotfQ0KLQ0KLXZhciAkY29tcGlsZU1pbkVyciA9IG1pbkVycignJGNvbXBpbGUnKTsNCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICR0ZW1wbGF0ZVJlcXVlc3QNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRoZSBgJHRlbXBsYXRlUmVxdWVzdGAgc2VydmljZSBkb3dubG9hZHMgdGhlIHByb3ZpZGVkIHRlbXBsYXRlIHVzaW5nIGAkaHR0cGAgYW5kLCB1cG9uIHN1Y2Nlc3MsDQotICogc3RvcmVzIHRoZSBjb250ZW50cyBpbnNpZGUgb2YgYCR0ZW1wbGF0ZUNhY2hlYC4gSWYgdGhlIEhUVFAgcmVxdWVzdCBmYWlscyBvciB0aGUgcmVzcG9uc2UgZGF0YQ0KLSAqIG9mIHRoZSBIVFRQIHJlcXVlc3QgaXMgZW1wdHksIGEgYCRjb21waWxlYCBlcnJvciB3aWxsIGJlIHRocm93biAodGhlIGV4Y2VwdGlvbiBjYW4gYmUgdGh3YXJ0ZWQNCi0gKiBieSBzZXR0aW5nIHRoZSAybmQgcGFyYW1ldGVyIG9mIHRoZSBmdW5jdGlvbiB0byB0cnVlKS4NCi0gKg0KLSAqIEBwYXJhbSB7c3RyaW5nfSB0cGwgVGhlIEhUVFAgcmVxdWVzdCB0ZW1wbGF0ZSBVUkwNCi0gKiBAcGFyYW0ge2Jvb2xlYW49fSBpZ25vcmVSZXF1ZXN0RXJyb3IgV2hldGhlciBvciBub3QgdG8gaWdub3JlIHRoZSBleGNlcHRpb24gd2hlbiB0aGUgcmVxdWVzdCBmYWlscyBvciB0aGUgdGVtcGxhdGUgaXMgZW1wdHkNCi0gKg0KLSAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSBIVFRQIFByb21pc2UgZm9yIHRoZSBnaXZlbi4NCi0gKg0KLSAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3RhbFBlbmRpbmdSZXF1ZXN0cyB0b3RhbCBhbW91bnQgb2YgcGVuZGluZyB0ZW1wbGF0ZSByZXF1ZXN0cyBiZWluZyBkb3dubG9hZGVkLg0KLSAqLw0KLWZ1bmN0aW9uICRUZW1wbGF0ZVJlcXVlc3RQcm92aWRlcigpIHsNCi0gIHRoaXMuJGdldCA9IFsnJHRlbXBsYXRlQ2FjaGUnLCAnJGh0dHAnLCAnJHEnLCBmdW5jdGlvbigkdGVtcGxhdGVDYWNoZSwgJGh0dHAsICRxKSB7DQotICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3RGbih0cGwsIGlnbm9yZVJlcXVlc3RFcnJvcikgew0KLSAgICAgIHZhciBzZWxmID0gaGFuZGxlUmVxdWVzdEZuOw0KLSAgICAgIHNlbGYudG90YWxQZW5kaW5nUmVxdWVzdHMrKzsNCi0NCi0gICAgICB2YXIgdHJhbnNmb3JtUmVzcG9uc2UgPSAkaHR0cC5kZWZhdWx0cyAmJiAkaHR0cC5kZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZTsNCi0NCi0gICAgICBpZiAoaXNBcnJheSh0cmFuc2Zvcm1SZXNwb25zZSkpIHsNCi0gICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlID0gdHJhbnNmb3JtUmVzcG9uc2UuZmlsdGVyKGZ1bmN0aW9uKHRyYW5zZm9ybWVyKSB7DQotICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lciAhPT0gZGVmYXVsdEh0dHBSZXNwb25zZVRyYW5zZm9ybTsNCi0gICAgICAgIH0pOw0KLSAgICAgIH0gZWxzZSBpZiAodHJhbnNmb3JtUmVzcG9uc2UgPT09IGRlZmF1bHRIdHRwUmVzcG9uc2VUcmFuc2Zvcm0pIHsNCi0gICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlID0gbnVsbDsNCi0gICAgICB9DQotDQotICAgICAgdmFyIGh0dHBPcHRpb25zID0gew0KLSAgICAgICAgY2FjaGU6ICR0ZW1wbGF0ZUNhY2hlLA0KLSAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IHRyYW5zZm9ybVJlc3BvbnNlDQotICAgICAgfTsNCi0NCi0gICAgICByZXR1cm4gJGh0dHAuZ2V0KHRwbCwgaHR0cE9wdGlvbnMpDQotICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgew0KLSAgICAgICAgICBzZWxmLnRvdGFsUGVuZGluZ1JlcXVlc3RzLS07DQotICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhOw0KLSAgICAgICAgfSwgaGFuZGxlRXJyb3IpOw0KLQ0KLSAgICAgIGZ1bmN0aW9uIGhhbmRsZUVycm9yKHJlc3ApIHsNCi0gICAgICAgIHNlbGYudG90YWxQZW5kaW5nUmVxdWVzdHMtLTsNCi0gICAgICAgIGlmICghaWdub3JlUmVxdWVzdEVycm9yKSB7DQotICAgICAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCd0cGxvYWQnLCAnRmFpbGVkIHRvIGxvYWQgdGVtcGxhdGU6IHswfScsIHRwbCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gJHEucmVqZWN0KHJlc3ApOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBoYW5kbGVSZXF1ZXN0Rm4udG90YWxQZW5kaW5nUmVxdWVzdHMgPSAwOw0KLQ0KLSAgICByZXR1cm4gaGFuZGxlUmVxdWVzdEZuOw0KLSAgfV07DQotfQ0KLQ0KLWZ1bmN0aW9uICQkVGVzdGFiaWxpdHlQcm92aWRlcigpIHsNCi0gIHRoaXMuJGdldCA9IFsnJHJvb3RTY29wZScsICckYnJvd3NlcicsICckbG9jYXRpb24nLA0KLSAgICAgICBmdW5jdGlvbigkcm9vdFNjb3BlLCAgICRicm93c2VyLCAgICRsb2NhdGlvbikgew0KLQ0KLSAgICAvKioNCi0gICAgICogQG5hbWUgJHRlc3RhYmlsaXR5DQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBUaGUgcHJpdmF0ZSAkJHRlc3RhYmlsaXR5IHNlcnZpY2UgcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIG1ldGhvZHMgZm9yIHVzZSB3aGVuIGRlYnVnZ2luZw0KLSAgICAgKiBvciBieSBhdXRvbWF0ZWQgdGVzdCBhbmQgZGVidWdnaW5nIHRvb2xzLg0KLSAgICAgKi8NCi0gICAgdmFyIHRlc3RhYmlsaXR5ID0ge307DQotDQotICAgIC8qKg0KLSAgICAgKiBAbmFtZSAkJHRlc3RhYmlsaXR5I2ZpbmRCaW5kaW5ncw0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSBib3VuZCAodmlhIG5nLWJpbmQgb3Ige3t9fSkNCi0gICAgICogdG8gZXhwcmVzc2lvbnMgbWF0Y2hpbmcgdGhlIGlucHV0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnQgcm9vdCB0byBzZWFyY2ggZnJvbS4NCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0byBtYXRjaC4NCi0gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRfZXhhY3RNYXRjaCBJZiB0cnVlLCBvbmx5IHJldHVybnMgZXhhY3QgbWF0Y2hlcw0KLSAgICAgKiAgICAgZm9yIHRoZSBleHByZXNzaW9uLiBGaWx0ZXJzIGFuZCB3aGl0ZXNwYWNlIGFyZSBpZ25vcmVkLg0KLSAgICAgKi8NCi0gICAgdGVzdGFiaWxpdHkuZmluZEJpbmRpbmdzID0gZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgb3B0X2V4YWN0TWF0Y2gpIHsNCi0gICAgICB2YXIgYmluZGluZ3MgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ25nLWJpbmRpbmcnKTsNCi0gICAgICB2YXIgbWF0Y2hlcyA9IFtdOw0KLSAgICAgIGZvckVhY2goYmluZGluZ3MsIGZ1bmN0aW9uKGJpbmRpbmcpIHsNCi0gICAgICAgIHZhciBkYXRhQmluZGluZyA9IGFuZ3VsYXIuZWxlbWVudChiaW5kaW5nKS5kYXRhKCckYmluZGluZycpOw0KLSAgICAgICAgaWYgKGRhdGFCaW5kaW5nKSB7DQotICAgICAgICAgIGZvckVhY2goZGF0YUJpbmRpbmcsIGZ1bmN0aW9uKGJpbmRpbmdOYW1lKSB7DQotICAgICAgICAgICAgaWYgKG9wdF9leGFjdE1hdGNoKSB7DQotICAgICAgICAgICAgICB2YXIgbWF0Y2hlciA9IG5ldyBSZWdFeHAoJyhefFxccyknICsgZXNjYXBlRm9yUmVnZXhwKGV4cHJlc3Npb24pICsgJyhcXHN8XFx8fCQpJyk7DQotICAgICAgICAgICAgICBpZiAobWF0Y2hlci50ZXN0KGJpbmRpbmdOYW1lKSkgew0KLSAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goYmluZGluZyk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgIGlmIChiaW5kaW5nTmFtZS5pbmRleE9mKGV4cHJlc3Npb24pICE9IC0xKSB7DQotICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChiaW5kaW5nKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0pOw0KLSAgICAgICAgfQ0KLSAgICAgIH0pOw0KLSAgICAgIHJldHVybiBtYXRjaGVzOw0KLSAgICB9Ow0KLQ0KLSAgICAvKioNCi0gICAgICogQG5hbWUgJCR0ZXN0YWJpbGl0eSNmaW5kTW9kZWxzDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHR3by13YXkgZm91bmQgdmlhIG5nLW1vZGVsIHRvDQotICAgICAqIGV4cHJlc3Npb25zIG1hdGNoaW5nIHRoZSBpbnB1dC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHJvb3QgdG8gc2VhcmNoIGZyb20uDQotICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFRoZSBtb2RlbCBleHByZXNzaW9uIHRvIG1hdGNoLg0KLSAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdF9leGFjdE1hdGNoIElmIHRydWUsIG9ubHkgcmV0dXJucyBleGFjdCBtYXRjaGVzDQotICAgICAqICAgICBmb3IgdGhlIGV4cHJlc3Npb24uDQotICAgICAqLw0KLSAgICB0ZXN0YWJpbGl0eS5maW5kTW9kZWxzID0gZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgb3B0X2V4YWN0TWF0Y2gpIHsNCi0gICAgICB2YXIgcHJlZml4ZXMgPSBbJ25nLScsICdkYXRhLW5nLScsICduZ1xcOiddOw0KLSAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgcHJlZml4ZXMubGVuZ3RoOyArK3ApIHsNCi0gICAgICAgIHZhciBhdHRyaWJ1dGVFcXVhbHMgPSBvcHRfZXhhY3RNYXRjaCA/ICc9JyA6ICcqPSc7DQotICAgICAgICB2YXIgc2VsZWN0b3IgPSAnWycgKyBwcmVmaXhlc1twXSArICdtb2RlbCcgKyBhdHRyaWJ1dGVFcXVhbHMgKyAnIicgKyBleHByZXNzaW9uICsgJyJdJzsNCi0gICAgICAgIHZhciBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7DQotICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7DQotICAgICAgICAgIHJldHVybiBlbGVtZW50czsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH07DQotDQotICAgIC8qKg0KLSAgICAgKiBAbmFtZSAkJHRlc3RhYmlsaXR5I2dldExvY2F0aW9uDQotICAgICAqDQotICAgICAqIEBkZXNjcmlwdGlvbg0KLSAgICAgKiBTaG9ydGN1dCBmb3IgZ2V0dGluZyB0aGUgbG9jYXRpb24gaW4gYSBicm93c2VyIGFnbm9zdGljIHdheS4gUmV0dXJucw0KLSAgICAgKiAgICAgdGhlIHBhdGgsIHNlYXJjaCwgYW5kIGhhc2guIChlLmcuIC9wYXRoP2E9YiNoYXNoKQ0KLSAgICAgKi8NCi0gICAgdGVzdGFiaWxpdHkuZ2V0TG9jYXRpb24gPSBmdW5jdGlvbigpIHsNCi0gICAgICByZXR1cm4gJGxvY2F0aW9uLnVybCgpOw0KLSAgICB9Ow0KLQ0KLSAgICAvKioNCi0gICAgICogQG5hbWUgJCR0ZXN0YWJpbGl0eSNzZXRMb2NhdGlvbg0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogU2hvcnRjdXQgZm9yIG5hdmlnYXRpbmcgdG8gYSBsb2NhdGlvbiB3aXRob3V0IGRvaW5nIGEgZnVsbCBwYWdlIHJlbG9hZC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgbG9jYXRpb24gdXJsIChwYXRoLCBzZWFyY2ggYW5kIGhhc2gsDQotICAgICAqICAgICBlLmcuIC9wYXRoP2E9YiNoYXNoKSB0byBnbyB0by4NCi0gICAgICovDQotICAgIHRlc3RhYmlsaXR5LnNldExvY2F0aW9uID0gZnVuY3Rpb24odXJsKSB7DQotICAgICAgaWYgKHVybCAhPT0gJGxvY2F0aW9uLnVybCgpKSB7DQotICAgICAgICAkbG9jYXRpb24udXJsKHVybCk7DQotICAgICAgICAkcm9vdFNjb3BlLiRkaWdlc3QoKTsNCi0gICAgICB9DQotICAgIH07DQotDQotICAgIC8qKg0KLSAgICAgKiBAbmFtZSAkJHRlc3RhYmlsaXR5I3doZW5TdGFibGUNCi0gICAgICoNCi0gICAgICogQGRlc2NyaXB0aW9uDQotICAgICAqIENhbGxzIHRoZSBjYWxsYmFjayB3aGVuICR0aW1lb3V0IGFuZCAkaHR0cCByZXF1ZXN0cyBhcmUgY29tcGxldGVkLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjaw0KLSAgICAgKi8NCi0gICAgdGVzdGFiaWxpdHkud2hlblN0YWJsZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQotICAgICAgJGJyb3dzZXIubm90aWZ5V2hlbk5vT3V0c3RhbmRpbmdSZXF1ZXN0cyhjYWxsYmFjayk7DQotICAgIH07DQotDQotICAgIHJldHVybiB0ZXN0YWJpbGl0eTsNCi0gIH1dOw0KLX0NCi0NCi1mdW5jdGlvbiAkVGltZW91dFByb3ZpZGVyKCkgew0KLSAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywgJyRicm93c2VyJywgJyRxJywgJyQkcScsICckZXhjZXB0aW9uSGFuZGxlcicsDQotICAgICAgIGZ1bmN0aW9uKCRyb290U2NvcGUsICAgJGJyb3dzZXIsICAgJHEsICAgJCRxLCAgICRleGNlcHRpb25IYW5kbGVyKSB7DQotICAgIHZhciBkZWZlcnJlZHMgPSB7fTsNCi0NCi0NCi0gICAgIC8qKg0KLSAgICAgICogQG5nZG9jIHNlcnZpY2UNCi0gICAgICAqIEBuYW1lICR0aW1lb3V0DQotICAgICAgKg0KLSAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgKiBBbmd1bGFyJ3Mgd3JhcHBlciBmb3IgYHdpbmRvdy5zZXRUaW1lb3V0YC4gVGhlIGBmbmAgZnVuY3Rpb24gaXMgd3JhcHBlZCBpbnRvIGEgdHJ5L2NhdGNoDQotICAgICAgKiBibG9jayBhbmQgZGVsZWdhdGVzIGFueSBleGNlcHRpb25zIHRvDQotICAgICAgKiB7QGxpbmsgbmcuJGV4Y2VwdGlvbkhhbmRsZXIgJGV4Y2VwdGlvbkhhbmRsZXJ9IHNlcnZpY2UuDQotICAgICAgKg0KLSAgICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiByZWdpc3RlcmluZyBhIHRpbWVvdXQgZnVuY3Rpb24gaXMgYSBwcm9taXNlLCB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHdoZW4NCi0gICAgICAqIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQgYW5kIHRoZSB0aW1lb3V0IGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLg0KLSAgICAgICoNCi0gICAgICAqIFRvIGNhbmNlbCBhIHRpbWVvdXQgcmVxdWVzdCwgY2FsbCBgJHRpbWVvdXQuY2FuY2VsKHByb21pc2UpYC4NCi0gICAgICAqDQotICAgICAgKiBJbiB0ZXN0cyB5b3UgY2FuIHVzZSB7QGxpbmsgbmdNb2NrLiR0aW1lb3V0IGAkdGltZW91dC5mbHVzaCgpYH0gdG8NCi0gICAgICAqIHN5bmNocm9ub3VzbHkgZmx1c2ggdGhlIHF1ZXVlIG9mIGRlZmVycmVkIGZ1bmN0aW9ucy4NCi0gICAgICAqDQotICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGZuIEEgZnVuY3Rpb24sIHdob3NlIGV4ZWN1dGlvbiBzaG91bGQgYmUgZGVsYXllZC4NCi0gICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gW2RlbGF5PTBdIERlbGF5IGluIG1pbGxpc2Vjb25kcy4NCi0gICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IFtpbnZva2VBcHBseT10cnVlXSBJZiBzZXQgdG8gYGZhbHNlYCBza2lwcyBtb2RlbCBkaXJ0eSBjaGVja2luZywgb3RoZXJ3aXNlDQotICAgICAgKiAgIHdpbGwgaW52b2tlIGBmbmAgd2l0aGluIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkYXBwbHkgJGFwcGx5fSBibG9jay4NCi0gICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuIFRoZSB2YWx1ZSB0aGlzDQotICAgICAgKiAgIHByb21pc2Ugd2lsbCBiZSByZXNvbHZlZCB3aXRoIGlzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGBmbmAgZnVuY3Rpb24uDQotICAgICAgKg0KLSAgICAgICovDQotICAgIGZ1bmN0aW9uIHRpbWVvdXQoZm4sIGRlbGF5LCBpbnZva2VBcHBseSkgew0KLSAgICAgIHZhciBza2lwQXBwbHkgPSAoaXNEZWZpbmVkKGludm9rZUFwcGx5KSAmJiAhaW52b2tlQXBwbHkpLA0KLSAgICAgICAgICBkZWZlcnJlZCA9IChza2lwQXBwbHkgPyAkJHEgOiAkcSkuZGVmZXIoKSwNCi0gICAgICAgICAgcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2UsDQotICAgICAgICAgIHRpbWVvdXRJZDsNCi0NCi0gICAgICB0aW1lb3V0SWQgPSAkYnJvd3Nlci5kZWZlcihmdW5jdGlvbigpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoZm4oKSk7DQotICAgICAgICB9IGNhdGNoIChlKSB7DQotICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlKTsNCi0gICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7DQotICAgICAgICB9DQotICAgICAgICBmaW5hbGx5IHsNCi0gICAgICAgICAgZGVsZXRlIGRlZmVycmVkc1twcm9taXNlLiQkdGltZW91dElkXTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICghc2tpcEFwcGx5KSAkcm9vdFNjb3BlLiRhcHBseSgpOw0KLSAgICAgIH0sIGRlbGF5KTsNCi0NCi0gICAgICBwcm9taXNlLiQkdGltZW91dElkID0gdGltZW91dElkOw0KLSAgICAgIGRlZmVycmVkc1t0aW1lb3V0SWRdID0gZGVmZXJyZWQ7DQotDQotICAgICAgcmV0dXJuIHByb21pc2U7DQotICAgIH0NCi0NCi0NCi0gICAgIC8qKg0KLSAgICAgICogQG5nZG9jIG1ldGhvZA0KLSAgICAgICogQG5hbWUgJHRpbWVvdXQjY2FuY2VsDQotICAgICAgKg0KLSAgICAgICogQGRlc2NyaXB0aW9uDQotICAgICAgKiBDYW5jZWxzIGEgdGFzayBhc3NvY2lhdGVkIHdpdGggdGhlIGBwcm9taXNlYC4gQXMgYSByZXN1bHQgb2YgdGhpcywgdGhlIHByb21pc2Ugd2lsbCBiZQ0KLSAgICAgICogcmVzb2x2ZWQgd2l0aCBhIHJlamVjdGlvbi4NCi0gICAgICAqDQotICAgICAgKiBAcGFyYW0ge1Byb21pc2U9fSBwcm9taXNlIFByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGAkdGltZW91dGAgZnVuY3Rpb24uDQotICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRhc2sgaGFzbid0IGV4ZWN1dGVkIHlldCBhbmQgd2FzIHN1Y2Nlc3NmdWxseQ0KLSAgICAgICogICBjYW5jZWxlZC4NCi0gICAgICAqLw0KLSAgICB0aW1lb3V0LmNhbmNlbCA9IGZ1bmN0aW9uKHByb21pc2UpIHsNCi0gICAgICBpZiAocHJvbWlzZSAmJiBwcm9taXNlLiQkdGltZW91dElkIGluIGRlZmVycmVkcykgew0KLSAgICAgICAgZGVmZXJyZWRzW3Byb21pc2UuJCR0aW1lb3V0SWRdLnJlamVjdCgnY2FuY2VsZWQnKTsNCi0gICAgICAgIGRlbGV0ZSBkZWZlcnJlZHNbcHJvbWlzZS4kJHRpbWVvdXRJZF07DQotICAgICAgICByZXR1cm4gJGJyb3dzZXIuZGVmZXIuY2FuY2VsKHByb21pc2UuJCR0aW1lb3V0SWQpOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gZmFsc2U7DQotICAgIH07DQotDQotICAgIHJldHVybiB0aW1lb3V0Ow0KLSAgfV07DQotfQ0KLQ0KLS8vIE5PVEU6ICBUaGUgdXNhZ2Ugb2Ygd2luZG93IGFuZCBkb2N1bWVudCBpbnN0ZWFkIG9mICR3aW5kb3cgYW5kICRkb2N1bWVudCBoZXJlIGlzDQotLy8gZGVsaWJlcmF0ZS4gIFRoaXMgc2VydmljZSBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyBiZWhhdmlvciBvZiBhbmNob3Igbm9kZXMgY3JlYXRlZCBieSB0aGUNCi0vLyBicm93c2VyIChyZXNvbHZpbmcgYW5kIHBhcnNpbmcgVVJMcykgdGhhdCBpcyB1bmxpa2VseSB0byBiZSBwcm92aWRlZCBieSBtb2NrIG9iamVjdHMgYW5kDQotLy8gY2F1c2UgdXMgdG8gYnJlYWsgdGVzdHMuICBJbiBhZGRpdGlvbiwgd2hlbiB0aGUgYnJvd3NlciByZXNvbHZlcyBhIFVSTCBmb3IgWEhSLCBpdA0KLS8vIGRvZXNuJ3Qga25vdyBhYm91dCBtb2NrZWQgbG9jYXRpb25zIGFuZCByZXNvbHZlcyBVUkxzIHRvIHRoZSByZWFsIGRvY3VtZW50IC0gd2hpY2ggaXMNCi0vLyBleGFjdGx5IHRoZSBiZWhhdmlvciBuZWVkZWQgaGVyZS4gIFRoZXJlIGlzIGxpdHRsZSB2YWx1ZSBpcyBtb2NraW5nIHRoZXNlIG91dCBmb3IgdGhpcw0KLS8vIHNlcnZpY2UuDQotdmFyIHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOw0KLXZhciBvcmlnaW5VcmwgPSB1cmxSZXNvbHZlKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsNCi0NCi0NCi0vKioNCi0gKg0KLSAqIEltcGxlbWVudGF0aW9uIE5vdGVzIGZvciBub24tSUUgYnJvd3NlcnMNCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICogQXNzaWduaW5nIGEgVVJMIHRvIHRoZSBocmVmIHByb3BlcnR5IG9mIGFuIGFuY2hvciBET00gbm9kZSwgZXZlbiBvbmUgYXR0YWNoZWQgdG8gdGhlIERPTSwNCi0gKiByZXN1bHRzIGJvdGggaW4gdGhlIG5vcm1hbGl6aW5nIGFuZCBwYXJzaW5nIG9mIHRoZSBVUkwuICBOb3JtYWxpemluZyBtZWFucyB0aGF0IGEgcmVsYXRpdmUNCi0gKiBVUkwgd2lsbCBiZSByZXNvbHZlZCBpbnRvIGFuIGFic29sdXRlIFVSTCBpbiB0aGUgY29udGV4dCBvZiB0aGUgYXBwbGljYXRpb24gZG9jdW1lbnQuDQotICogUGFyc2luZyBtZWFucyB0aGF0IHRoZSBhbmNob3Igbm9kZSdzIGhvc3QsIGhvc3RuYW1lLCBwcm90b2NvbCwgcG9ydCwgcGF0aG5hbWUgYW5kIHJlbGF0ZWQNCi0gKiBwcm9wZXJ0aWVzIGFyZSBhbGwgcG9wdWxhdGVkIHRvIHJlZmxlY3QgdGhlIG5vcm1hbGl6ZWQgVVJMLiAgVGhpcyBhcHByb2FjaCBoYXMgd2lkZQ0KLSAqIGNvbXBhdGliaWxpdHkgLSBTYWZhcmkgMSssIE1vemlsbGEgMSssIE9wZXJhIDcrLGUgZXRjLiAgU2VlDQotICogaHR0cDovL3d3dy5hcHRhbmEuY29tL3JlZmVyZW5jZS9odG1sL2FwaS9IVE1MQW5jaG9yRWxlbWVudC5odG1sDQotICoNCi0gKiBJbXBsZW1lbnRhdGlvbiBOb3RlcyBmb3IgSUUNCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gKiBJRSA+PSA4IGFuZCA8PSAxMCBub3JtYWxpemVzIHRoZSBVUkwgd2hlbiBhc3NpZ25lZCB0byB0aGUgYW5jaG9yIG5vZGUgc2ltaWxhciB0byB0aGUgb3RoZXINCi0gKiBicm93c2Vycy4gIEhvd2V2ZXIsIHRoZSBwYXJzZWQgY29tcG9uZW50cyB3aWxsIG5vdCBiZSBzZXQgaWYgdGhlIFVSTCBhc3NpZ25lZCBkaWQgbm90IHNwZWNpZnkNCi0gKiB0aGVtLiAgKGUuZy4gaWYgeW91IGFzc2lnbiBhLmhyZWYgPSAiZm9vIiwgdGhlbiBhLnByb3RvY29sLCBhLmhvc3QsIGV0Yy4gd2lsbCBiZSBlbXB0eS4pICBXZQ0KLSAqIHdvcmsgYXJvdW5kIHRoYXQgYnkgcGVyZm9ybWluZyB0aGUgcGFyc2luZyBpbiBhIDJuZCBzdGVwIGJ5IHRha2luZyBhIHByZXZpb3VzbHkgbm9ybWFsaXplZA0KLSAqIFVSTCAoZS5nLiBieSBhc3NpZ25pbmcgdG8gYS5ocmVmKSBhbmQgYXNzaWduaW5nIGl0IGEuaHJlZiBhZ2Fpbi4gIFRoaXMgY29ycmVjdGx5IHBvcHVsYXRlcyB0aGUNCi0gKiBwcm9wZXJ0aWVzIHN1Y2ggYXMgcHJvdG9jb2wsIGhvc3RuYW1lLCBwb3J0LCBldGMuDQotICoNCi0gKiBJRTcgZG9lcyBub3Qgbm9ybWFsaXplIHRoZSBVUkwgd2hlbiBhc3NpZ25lZCB0byBhbiBhbmNob3Igbm9kZS4gIChBcHBhcmVudGx5LCBpdCBkb2VzLCBpZiBvbmUNCi0gKiB1c2VzIHRoZSBpbm5lciBIVE1MIGFwcHJvYWNoIHRvIGFzc2lnbiB0aGUgVVJMIGFzIHBhcnQgb2YgYW4gSFRNTCBzbmlwcGV0IC0NCi0gKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NzI3MjkpICBIb3dldmVyLCBzZXR0aW5nIGltZ1tzcmNdIGRvZXMgbm9ybWFsaXplIHRoZSBVUkwuDQotICogVW5mb3J0dW5hdGVseSwgc2V0dGluZyBpbWdbc3JjXSB0byBzb21ldGhpbmcgbGlrZSAiamF2YXNjcmlwdDpmb28iIG9uIElFIHRocm93cyBhbiBleGNlcHRpb24uDQotICogU2luY2UgdGhlIHByaW1hcnkgdXNhZ2UgZm9yIG5vcm1hbGl6aW5nIFVSTHMgaXMgdG8gc2FuaXRpemUgc3VjaCBVUkxzLCB3ZSBjYW4ndCB1c2UgdGhhdA0KLSAqIG1ldGhvZCBhbmQgSUUgPCA4IGlzIHVuc3VwcG9ydGVkLg0KLSAqDQotICogUmVmZXJlbmNlczoNCi0gKiAgIGh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxBbmNob3JFbGVtZW50DQotICogICBodHRwOi8vd3d3LmFwdGFuYS5jb20vcmVmZXJlbmNlL2h0bWwvYXBpL0hUTUxBbmNob3JFbGVtZW50Lmh0bWwNCi0gKiAgIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlscw0KLSAqICAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9wdWxsLzI5MDINCi0gKiAgIGh0dHA6Ly9qYW1lcy5wYWRvbHNleS5jb20vamF2YXNjcmlwdC9wYXJzaW5nLXVybHMtd2l0aC10aGUtZG9tLw0KLSAqDQotICogQGtpbmQgZnVuY3Rpb24NCi0gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkLg0KLSAqIEBkZXNjcmlwdGlvbiBOb3JtYWxpemVzIGFuZCBwYXJzZXMgYSBVUkwuDQotICogQHJldHVybnMge29iamVjdH0gUmV0dXJucyB0aGUgbm9ybWFsaXplZCBVUkwgYXMgYSBkaWN0aW9uYXJ5Lg0KLSAqDQotICogICB8IG1lbWJlciBuYW1lICAgfCBEZXNjcmlwdGlvbiAgICB8DQotICogICB8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18DQotICogICB8IGhyZWYgICAgICAgICAgfCBBIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgcHJvdmlkZWQgVVJMIGlmIGl0IHdhcyBub3QgYW4gYWJzb2x1dGUgVVJMIHwNCi0gKiAgIHwgcHJvdG9jb2wgICAgICB8IFRoZSBwcm90b2NvbCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIGNvbG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAqICAgfCBob3N0ICAgICAgICAgIHwgVGhlIGhvc3QgYW5kIHBvcnQgKGlmIHRoZSBwb3J0IGlzIG5vbi1kZWZhdWx0KSBvZiB0aGUgbm9ybWFsaXplZFVybCAgICB8DQotICogICB8IHNlYXJjaCAgICAgICAgfCBUaGUgc2VhcmNoIHBhcmFtcywgbWludXMgdGhlIHF1ZXN0aW9uIG1hcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gKiAgIHwgaGFzaCAgICAgICAgICB8IFRoZSBoYXNoIHN0cmluZywgbWludXMgdGhlIGhhc2ggc3ltYm9sDQotICogICB8IGhvc3RuYW1lICAgICAgfCBUaGUgaG9zdG5hbWUNCi0gKiAgIHwgcG9ydCAgICAgICAgICB8IFRoZSBwb3J0LCB3aXRob3V0ICI6Ig0KLSAqICAgfCBwYXRobmFtZSAgICAgIHwgVGhlIHBhdGhuYW1lLCBiZWdpbm5pbmcgd2l0aCAiLyINCi0gKg0KLSAqLw0KLWZ1bmN0aW9uIHVybFJlc29sdmUodXJsKSB7DQotICB2YXIgaHJlZiA9IHVybDsNCi0NCi0gIGlmIChtc2llKSB7DQotICAgIC8vIE5vcm1hbGl6ZSBiZWZvcmUgcGFyc2UuICBSZWZlciBJbXBsZW1lbnRhdGlvbiBOb3RlcyBvbiB3aHkgdGhpcyBpcw0KLSAgICAvLyBkb25lIGluIHR3byBzdGVwcyBvbiBJRS4NCi0gICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCJocmVmIiwgaHJlZik7DQotICAgIGhyZWYgPSB1cmxQYXJzaW5nTm9kZS5ocmVmOw0KLSAgfQ0KLQ0KLSAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7DQotDQotICAvLyB1cmxQYXJzaW5nTm9kZSBwcm92aWRlcyB0aGUgVXJsVXRpbHMgaW50ZXJmYWNlIC0gaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzDQotICByZXR1cm4gew0KLSAgICBocmVmOiB1cmxQYXJzaW5nTm9kZS5ocmVmLA0KLSAgICBwcm90b2NvbDogdXJsUGFyc2luZ05vZGUucHJvdG9jb2wgPyB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLA0KLSAgICBob3N0OiB1cmxQYXJzaW5nTm9kZS5ob3N0LA0KLSAgICBzZWFyY2g6IHVybFBhcnNpbmdOb2RlLnNlYXJjaCA/IHVybFBhcnNpbmdOb2RlLnNlYXJjaC5yZXBsYWNlKC9eXD8vLCAnJykgOiAnJywNCi0gICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJywNCi0gICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLA0KLSAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LA0KLSAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKQ0KLSAgICAgID8gdXJsUGFyc2luZ05vZGUucGF0aG5hbWUNCi0gICAgICA6ICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lDQotICB9Ow0KLX0NCi0NCi0vKioNCi0gKiBQYXJzZSBhIHJlcXVlc3QgVVJMIGFuZCBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgc2FtZS1vcmlnaW4gcmVxdWVzdCBhcyB0aGUgYXBwbGljYXRpb24gZG9jdW1lbnQuDQotICoNCi0gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlcXVlc3RVcmwgVGhlIHVybCBvZiB0aGUgcmVxdWVzdCBhcyBhIHN0cmluZyB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQNCi0gKiBvciBhIHBhcnNlZCBVUkwgb2JqZWN0Lg0KLSAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIGZvciB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGFwcGxpY2F0aW9uIGRvY3VtZW50Lg0KLSAqLw0KLWZ1bmN0aW9uIHVybElzU2FtZU9yaWdpbihyZXF1ZXN0VXJsKSB7DQotICB2YXIgcGFyc2VkID0gKGlzU3RyaW5nKHJlcXVlc3RVcmwpKSA/IHVybFJlc29sdmUocmVxdWVzdFVybCkgOiByZXF1ZXN0VXJsOw0KLSAgcmV0dXJuIChwYXJzZWQucHJvdG9jb2wgPT09IG9yaWdpblVybC5wcm90b2NvbCAmJg0KLSAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVXJsLmhvc3QpOw0KLX0NCi0NCi0vKioNCi0gKiBAbmdkb2Mgc2VydmljZQ0KLSAqIEBuYW1lICR3aW5kb3cNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEEgcmVmZXJlbmNlIHRvIHRoZSBicm93c2VyJ3MgYHdpbmRvd2Agb2JqZWN0LiBXaGlsZSBgd2luZG93YA0KLSAqIGlzIGdsb2JhbGx5IGF2YWlsYWJsZSBpbiBKYXZhU2NyaXB0LCBpdCBjYXVzZXMgdGVzdGFiaWxpdHkgcHJvYmxlbXMsIGJlY2F1c2UNCi0gKiBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gSW4gYW5ndWxhciB3ZSBhbHdheXMgcmVmZXIgdG8gaXQgdGhyb3VnaCB0aGUNCi0gKiBgJHdpbmRvd2Agc2VydmljZSwgc28gaXQgbWF5IGJlIG92ZXJyaWRkZW4sIHJlbW92ZWQgb3IgbW9ja2VkIGZvciB0ZXN0aW5nLg0KLSAqDQotICogRXhwcmVzc2lvbnMsIGxpa2UgdGhlIG9uZSBkZWZpbmVkIGZvciB0aGUgYG5nQ2xpY2tgIGRpcmVjdGl2ZSBpbiB0aGUgZXhhbXBsZQ0KLSAqIGJlbG93LCBhcmUgZXZhbHVhdGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudCBzY29wZS4gIFRoZXJlZm9yZSwgdGhlcmUgaXMNCi0gKiBubyByaXNrIG9mIGluYWR2ZXJ0ZW50bHkgY29kaW5nIGluIGEgZGVwZW5kZW5jeSBvbiBhIGdsb2JhbCB2YWx1ZSBpbiBzdWNoIGFuDQotICogZXhwcmVzc2lvbi4NCi0gKg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGUgbW9kdWxlPSJ3aW5kb3dFeGFtcGxlIj4NCi0gICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICA8c2NyaXB0Pg0KLSAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCd3aW5kb3dFeGFtcGxlJywgW10pDQotICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsICckd2luZG93JywgZnVuY3Rpb24oJHNjb3BlLCAkd2luZG93KSB7DQotICAgICAgICAgICAgICRzY29wZS5ncmVldGluZyA9ICdIZWxsbywgV29ybGQhJzsNCi0gICAgICAgICAgICAgJHNjb3BlLmRvR3JlZXRpbmcgPSBmdW5jdGlvbihncmVldGluZykgew0KLSAgICAgICAgICAgICAgICR3aW5kb3cuYWxlcnQoZ3JlZXRpbmcpOw0KLSAgICAgICAgICAgICB9Ow0KLSAgICAgICAgICAgfV0pOw0KLSAgICAgICA8L3NjcmlwdD4NCi0gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+DQotICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJncmVldGluZyIgLz4NCi0gICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPSJkb0dyZWV0aW5nKGdyZWV0aW5nKSI+QUxFUlQ8L2J1dHRvbj4NCi0gICAgICAgPC9kaXY+DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICBpdCgnc2hvdWxkIGRpc3BsYXkgdGhlIGdyZWV0aW5nIGluIHRoZSBpbnB1dCBib3gnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgZWxlbWVudChieS5tb2RlbCgnZ3JlZXRpbmcnKSkuc2VuZEtleXMoJ0hlbGxvLCBFMkUgVGVzdHMnKTsNCi0gICAgICAgLy8gSWYgd2UgY2xpY2sgdGhlIGJ1dHRvbiBpdCB3aWxsIGJsb2NrIHRoZSB0ZXN0IHJ1bm5lcg0KLSAgICAgICAvLyBlbGVtZW50KCc6YnV0dG9uJykuY2xpY2soKTsNCi0gICAgICB9KTsNCi0gICAgIDwvZmlsZT4NCi0gICA8L2V4YW1wbGU+DQotICovDQotZnVuY3Rpb24gJFdpbmRvd1Byb3ZpZGVyKCkgew0KLSAgdGhpcy4kZ2V0ID0gdmFsdWVGbih3aW5kb3cpOw0KLX0NCi0NCi0vKiBnbG9iYWwgY3VycmVuY3lGaWx0ZXI6IHRydWUsDQotIGRhdGVGaWx0ZXI6IHRydWUsDQotIGZpbHRlckZpbHRlcjogdHJ1ZSwNCi0ganNvbkZpbHRlcjogdHJ1ZSwNCi0gbGltaXRUb0ZpbHRlcjogdHJ1ZSwNCi0gbG93ZXJjYXNlRmlsdGVyOiB0cnVlLA0KLSBudW1iZXJGaWx0ZXI6IHRydWUsDQotIG9yZGVyQnlGaWx0ZXI6IHRydWUsDQotIHVwcGVyY2FzZUZpbHRlcjogdHJ1ZSwNCi0gKi8NCi0NCi0vKioNCi0gKiBAbmdkb2MgcHJvdmlkZXINCi0gKiBAbmFtZSAkZmlsdGVyUHJvdmlkZXINCi0gKiBAZGVzY3JpcHRpb24NCi0gKg0KLSAqIEZpbHRlcnMgYXJlIGp1c3QgZnVuY3Rpb25zIHdoaWNoIHRyYW5zZm9ybSBpbnB1dCB0byBhbiBvdXRwdXQuIEhvd2V2ZXIgZmlsdGVycyBuZWVkIHRvIGJlDQotICogRGVwZW5kZW5jeSBJbmplY3RlZC4gVG8gYWNoaWV2ZSB0aGlzIGEgZmlsdGVyIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYSBmYWN0b3J5IGZ1bmN0aW9uIHdoaWNoIGlzDQotICogYW5ub3RhdGVkIHdpdGggZGVwZW5kZW5jaWVzIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYSBmaWx0ZXIgZnVuY3Rpb24uDQotICoNCi0gKiBgYGBqcw0KLSAqICAgLy8gRmlsdGVyIHJlZ2lzdHJhdGlvbg0KLSAqICAgZnVuY3Rpb24gTXlNb2R1bGUoJHByb3ZpZGUsICRmaWx0ZXJQcm92aWRlcikgew0KLSAqICAgICAvLyBjcmVhdGUgYSBzZXJ2aWNlIHRvIGRlbW9uc3RyYXRlIGluamVjdGlvbiAobm90IGFsd2F5cyBuZWVkZWQpDQotICogICAgICRwcm92aWRlLnZhbHVlKCdncmVldCcsIGZ1bmN0aW9uKG5hbWUpew0KLSAqICAgICAgIHJldHVybiAnSGVsbG8gJyArIG5hbWUgKyAnISc7DQotICogICAgIH0pOw0KLSAqDQotICogICAgIC8vIHJlZ2lzdGVyIGEgZmlsdGVyIGZhY3Rvcnkgd2hpY2ggdXNlcyB0aGUNCi0gKiAgICAgLy8gZ3JlZXQgc2VydmljZSB0byBkZW1vbnN0cmF0ZSBESS4NCi0gKiAgICAgJGZpbHRlclByb3ZpZGVyLnJlZ2lzdGVyKCdncmVldCcsIGZ1bmN0aW9uKGdyZWV0KXsNCi0gKiAgICAgICAvLyByZXR1cm4gdGhlIGZpbHRlciBmdW5jdGlvbiB3aGljaCB1c2VzIHRoZSBncmVldCBzZXJ2aWNlDQotICogICAgICAgLy8gdG8gZ2VuZXJhdGUgc2FsdXRhdGlvbg0KLSAqICAgICAgIHJldHVybiBmdW5jdGlvbih0ZXh0KSB7DQotICogICAgICAgICAvLyBmaWx0ZXJzIG5lZWQgdG8gYmUgZm9yZ2l2aW5nIHNvIGNoZWNrIGlucHV0IHZhbGlkaXR5DQotICogICAgICAgICByZXR1cm4gdGV4dCAmJiBncmVldCh0ZXh0KSB8fCB0ZXh0Ow0KLSAqICAgICAgIH07DQotICogICAgIH0pOw0KLSAqICAgfQ0KLSAqIGBgYA0KLSAqDQotICogVGhlIGZpbHRlciBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGAkaW5qZWN0b3JgIHVuZGVyIHRoZSBmaWx0ZXIgbmFtZSBzdWZmaXggd2l0aA0KLSAqIGBGaWx0ZXJgLg0KLSAqDQotICogYGBganMNCi0gKiAgIGl0KCdzaG91bGQgYmUgdGhlIHNhbWUgaW5zdGFuY2UnLCBpbmplY3QoDQotICogICAgIGZ1bmN0aW9uKCRmaWx0ZXJQcm92aWRlcikgew0KLSAqICAgICAgICRmaWx0ZXJQcm92aWRlci5yZWdpc3RlcigncmV2ZXJzZScsIGZ1bmN0aW9uKCl7DQotICogICAgICAgICByZXR1cm4gLi4uOw0KLSAqICAgICAgIH0pOw0KLSAqICAgICB9LA0KLSAqICAgICBmdW5jdGlvbigkZmlsdGVyLCByZXZlcnNlRmlsdGVyKSB7DQotICogICAgICAgZXhwZWN0KCRmaWx0ZXIoJ3JldmVyc2UnKSkudG9CZShyZXZlcnNlRmlsdGVyKTsNCi0gKiAgICAgfSk7DQotICogYGBgDQotICoNCi0gKg0KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyBhbmd1bGFyIGZpbHRlcnMgd29yaywgYW5kIGhvdyB0byBjcmVhdGUgeW91ciBvd24gZmlsdGVycywgc2VlDQotICoge0BsaW5rIGd1aWRlL2ZpbHRlciBGaWx0ZXJzfSBpbiB0aGUgQW5ndWxhciBEZXZlbG9wZXIgR3VpZGUuDQotICovDQotDQotLyoqDQotICogQG5nZG9jIHNlcnZpY2UNCi0gKiBAbmFtZSAkZmlsdGVyDQotICogQGtpbmQgZnVuY3Rpb24NCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBGaWx0ZXJzIGFyZSB1c2VkIGZvciBmb3JtYXR0aW5nIGRhdGEgZGlzcGxheWVkIHRvIHRoZSB1c2VyLg0KLSAqDQotICogVGhlIGdlbmVyYWwgc3ludGF4IGluIHRlbXBsYXRlcyBpcyBhcyBmb2xsb3dzOg0KLSAqDQotICogICAgICAgICB7eyBleHByZXNzaW9uIFt8IGZpbHRlcl9uYW1lWzpwYXJhbWV0ZXJfdmFsdWVdIC4uLiBdIH19DQotICoNCi0gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWx0ZXIgZnVuY3Rpb24gdG8gcmV0cmlldmUNCi0gKiBAcmV0dXJuIHtGdW5jdGlvbn0gdGhlIGZpbHRlciBmdW5jdGlvbg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGUgbmFtZT0iJGZpbHRlciIgbW9kdWxlPSJmaWx0ZXJFeGFtcGxlIj4NCi0gICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9Ik1haW5DdHJsIj4NCi0gICAgICAgIDxoMz57eyBvcmlnaW5hbFRleHQgfX08L2gzPg0KLSAgICAgICAgPGgzPnt7IGZpbHRlcmVkVGV4dCB9fTwvaDM+DQotICAgICAgIDwvZGl2Pg0KLSAgICAgPC9maWxlPg0KLQ0KLSAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4NCi0gICAgICBhbmd1bGFyLm1vZHVsZSgnZmlsdGVyRXhhbXBsZScsIFtdKQ0KLSAgICAgIC5jb250cm9sbGVyKCdNYWluQ3RybCcsIGZ1bmN0aW9uKCRzY29wZSwgJGZpbHRlcikgew0KLSAgICAgICAgJHNjb3BlLm9yaWdpbmFsVGV4dCA9ICdoZWxsbyc7DQotICAgICAgICAkc2NvcGUuZmlsdGVyZWRUZXh0ID0gJGZpbHRlcigndXBwZXJjYXNlJykoJHNjb3BlLm9yaWdpbmFsVGV4dCk7DQotICAgICAgfSk7DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAgKi8NCi0kRmlsdGVyUHJvdmlkZXIuJGluamVjdCA9IFsnJHByb3ZpZGUnXTsNCi1mdW5jdGlvbiAkRmlsdGVyUHJvdmlkZXIoJHByb3ZpZGUpIHsNCi0gIHZhciBzdWZmaXggPSAnRmlsdGVyJzsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgJGZpbHRlclByb3ZpZGVyI3JlZ2lzdGVyDQotICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWUgTmFtZSBvZiB0aGUgZmlsdGVyIGZ1bmN0aW9uLCBvciBhbiBvYmplY3QgbWFwIG9mIGZpbHRlcnMgd2hlcmUNCi0gICAqICAgIHRoZSBrZXlzIGFyZSB0aGUgZmlsdGVyIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgZmlsdGVyIGZhY3Rvcmllcy4NCi0gICAqIEByZXR1cm5zIHtPYmplY3R9IFJlZ2lzdGVyZWQgZmlsdGVyIGluc3RhbmNlLCBvciBpZiBhIG1hcCBvZiBmaWx0ZXJzIHdhcyBwcm92aWRlZCB0aGVuIGEgbWFwDQotICAgKiAgICBvZiB0aGUgcmVnaXN0ZXJlZCBmaWx0ZXIgaW5zdGFuY2VzLg0KLSAgICovDQotICBmdW5jdGlvbiByZWdpc3RlcihuYW1lLCBmYWN0b3J5KSB7DQotICAgIGlmIChpc09iamVjdChuYW1lKSkgew0KLSAgICAgIHZhciBmaWx0ZXJzID0ge307DQotICAgICAgZm9yRWFjaChuYW1lLCBmdW5jdGlvbihmaWx0ZXIsIGtleSkgew0KLSAgICAgICAgZmlsdGVyc1trZXldID0gcmVnaXN0ZXIoa2V5LCBmaWx0ZXIpOw0KLSAgICAgIH0pOw0KLSAgICAgIHJldHVybiBmaWx0ZXJzOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHJldHVybiAkcHJvdmlkZS5mYWN0b3J5KG5hbWUgKyBzdWZmaXgsIGZhY3RvcnkpOw0KLSAgICB9DQotICB9DQotICB0aGlzLnJlZ2lzdGVyID0gcmVnaXN0ZXI7DQotDQotICB0aGlzLiRnZXQgPSBbJyRpbmplY3RvcicsIGZ1bmN0aW9uKCRpbmplY3Rvcikgew0KLSAgICByZXR1cm4gZnVuY3Rpb24obmFtZSkgew0KLSAgICAgIHJldHVybiAkaW5qZWN0b3IuZ2V0KG5hbWUgKyBzdWZmaXgpOw0KLSAgICB9Ow0KLSAgfV07DQotDQotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotDQotICAvKiBnbG9iYWwNCi0gICAgY3VycmVuY3lGaWx0ZXI6IGZhbHNlLA0KLSAgICBkYXRlRmlsdGVyOiBmYWxzZSwNCi0gICAgZmlsdGVyRmlsdGVyOiBmYWxzZSwNCi0gICAganNvbkZpbHRlcjogZmFsc2UsDQotICAgIGxpbWl0VG9GaWx0ZXI6IGZhbHNlLA0KLSAgICBsb3dlcmNhc2VGaWx0ZXI6IGZhbHNlLA0KLSAgICBudW1iZXJGaWx0ZXI6IGZhbHNlLA0KLSAgICBvcmRlckJ5RmlsdGVyOiBmYWxzZSwNCi0gICAgdXBwZXJjYXNlRmlsdGVyOiBmYWxzZSwNCi0gICovDQotDQotICByZWdpc3RlcignY3VycmVuY3knLCBjdXJyZW5jeUZpbHRlcik7DQotICByZWdpc3RlcignZGF0ZScsIGRhdGVGaWx0ZXIpOw0KLSAgcmVnaXN0ZXIoJ2ZpbHRlcicsIGZpbHRlckZpbHRlcik7DQotICByZWdpc3RlcignanNvbicsIGpzb25GaWx0ZXIpOw0KLSAgcmVnaXN0ZXIoJ2xpbWl0VG8nLCBsaW1pdFRvRmlsdGVyKTsNCi0gIHJlZ2lzdGVyKCdsb3dlcmNhc2UnLCBsb3dlcmNhc2VGaWx0ZXIpOw0KLSAgcmVnaXN0ZXIoJ251bWJlcicsIG51bWJlckZpbHRlcik7DQotICByZWdpc3Rlcignb3JkZXJCeScsIG9yZGVyQnlGaWx0ZXIpOw0KLSAgcmVnaXN0ZXIoJ3VwcGVyY2FzZScsIHVwcGVyY2FzZUZpbHRlcik7DQotfQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBmaWx0ZXINCi0gKiBAbmFtZSBmaWx0ZXINCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogU2VsZWN0cyBhIHN1YnNldCBvZiBpdGVtcyBmcm9tIGBhcnJheWAgYW5kIHJldHVybnMgaXQgYXMgYSBuZXcgYXJyYXkuDQotICoNCi0gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc291cmNlIGFycmF5Lg0KLSAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdHxmdW5jdGlvbigpfSBleHByZXNzaW9uIFRoZSBwcmVkaWNhdGUgdG8gYmUgdXNlZCBmb3Igc2VsZWN0aW5nIGl0ZW1zIGZyb20NCi0gKiAgIGBhcnJheWAuDQotICoNCi0gKiAgIENhbiBiZSBvbmUgb2Y6DQotICoNCi0gKiAgIC0gYHN0cmluZ2A6IFRoZSBzdHJpbmcgaXMgdXNlZCBmb3IgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgY29udGVudHMgb2YgdGhlIGBhcnJheWAuIEFsbCBzdHJpbmdzIG9yDQotICogICAgIG9iamVjdHMgd2l0aCBzdHJpbmcgcHJvcGVydGllcyBpbiBgYXJyYXlgIHRoYXQgbWF0Y2ggdGhpcyBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4gVGhpcyBhbHNvDQotICogICAgIGFwcGxpZXMgdG8gbmVzdGVkIG9iamVjdCBwcm9wZXJ0aWVzLg0KLSAqICAgICBUaGUgcHJlZGljYXRlIGNhbiBiZSBuZWdhdGVkIGJ5IHByZWZpeGluZyB0aGUgc3RyaW5nIHdpdGggYCFgLg0KLSAqDQotICogICAtIGBPYmplY3RgOiBBIHBhdHRlcm4gb2JqZWN0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBzcGVjaWZpYyBwcm9wZXJ0aWVzIG9uIG9iamVjdHMgY29udGFpbmVkDQotICogICAgIGJ5IGBhcnJheWAuIEZvciBleGFtcGxlIGB7bmFtZToiTSIsIHBob25lOiIxIn1gIHByZWRpY2F0ZSB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBpdGVtcw0KLSAqICAgICB3aGljaCBoYXZlIHByb3BlcnR5IGBuYW1lYCBjb250YWluaW5nICJNIiBhbmQgcHJvcGVydHkgYHBob25lYCBjb250YWluaW5nICIxIi4gQSBzcGVjaWFsDQotICogICAgIHByb3BlcnR5IG5hbWUgYCRgIGNhbiBiZSB1c2VkIChhcyBpbiBgeyQ6InRleHQifWApIHRvIGFjY2VwdCBhIG1hdGNoIGFnYWluc3QgYW55DQotICogICAgIHByb3BlcnR5IG9mIHRoZSBvYmplY3Qgb3IgaXRzIG5lc3RlZCBvYmplY3QgcHJvcGVydGllcy4gVGhhdCdzIGVxdWl2YWxlbnQgdG8gdGhlIHNpbXBsZQ0KLSAqICAgICBzdWJzdHJpbmcgbWF0Y2ggd2l0aCBhIGBzdHJpbmdgIGFzIGRlc2NyaWJlZCBhYm92ZS4gVGhlIHByZWRpY2F0ZSBjYW4gYmUgbmVnYXRlZCBieSBwcmVmaXhpbmcNCi0gKiAgICAgdGhlIHN0cmluZyB3aXRoIGAhYC4NCi0gKiAgICAgRm9yIGV4YW1wbGUgYHtuYW1lOiAiIU0ifWAgcHJlZGljYXRlIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGl0ZW1zIHdoaWNoIGhhdmUgcHJvcGVydHkgYG5hbWVgDQotICogICAgIG5vdCBjb250YWluaW5nICJNIi4NCi0gKg0KLSAqICAgICBOb3RlIHRoYXQgYSBuYW1lZCBwcm9wZXJ0eSB3aWxsIG1hdGNoIHByb3BlcnRpZXMgb24gdGhlIHNhbWUgbGV2ZWwgb25seSwgd2hpbGUgdGhlIHNwZWNpYWwNCi0gKiAgICAgYCRgIHByb3BlcnR5IHdpbGwgbWF0Y2ggcHJvcGVydGllcyBvbiB0aGUgc2FtZSBsZXZlbCBvciBkZWVwZXIuIEUuZy4gYW4gYXJyYXkgaXRlbSBsaWtlDQotICogICAgIGB7bmFtZToge2ZpcnN0OiAnSm9obicsIGxhc3Q6ICdEb2UnfX1gIHdpbGwgKipub3QqKiBiZSBtYXRjaGVkIGJ5IGB7bmFtZTogJ0pvaG4nfWAsIGJ1dA0KLSAqICAgICAqKndpbGwqKiBiZSBtYXRjaGVkIGJ5IGB7JDogJ0pvaG4nfWAuDQotICoNCi0gKiAgIC0gYGZ1bmN0aW9uKHZhbHVlLCBpbmRleClgOiBBIHByZWRpY2F0ZSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB3cml0ZSBhcmJpdHJhcnkgZmlsdGVycy4gVGhlDQotICogICAgIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAuIFRoZSBmaW5hbCByZXN1bHQgaXMgYW4gYXJyYXkgb2YgdGhvc2UNCi0gKiAgICAgZWxlbWVudHMgdGhhdCB0aGUgcHJlZGljYXRlIHJldHVybmVkIHRydWUgZm9yLg0KLSAqDQotICogQHBhcmFtIHtmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkKXx0cnVlfHVuZGVmaW5lZH0gY29tcGFyYXRvciBDb21wYXJhdG9yIHdoaWNoIGlzIHVzZWQgaW4NCi0gKiAgICAgZGV0ZXJtaW5pbmcgaWYgdGhlIGV4cGVjdGVkIHZhbHVlIChmcm9tIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbikgYW5kIGFjdHVhbCB2YWx1ZSAoZnJvbQ0KLSAqICAgICB0aGUgb2JqZWN0IGluIHRoZSBhcnJheSkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBtYXRjaC4NCi0gKg0KLSAqICAgQ2FuIGJlIG9uZSBvZjoNCi0gKg0KLSAqICAgLSBgZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZClgOg0KLSAqICAgICBUaGUgZnVuY3Rpb24gd2lsbCBiZSBnaXZlbiB0aGUgb2JqZWN0IHZhbHVlIGFuZCB0aGUgcHJlZGljYXRlIHZhbHVlIHRvIGNvbXBhcmUgYW5kDQotICogICAgIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiBib3RoIHZhbHVlcyBzaG91bGQgYmUgY29uc2lkZXJlZCBlcXVhbC4NCi0gKg0KLSAqICAgLSBgdHJ1ZWA6IEEgc2hvcnRoYW5kIGZvciBgZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCkgeyByZXR1cm4gYW5ndWxhci5lcXVhbHMoYWN0dWFsLCBleHBlY3RlZCl9YC4NCi0gKiAgICAgVGhpcyBpcyBlc3NlbnRpYWxseSBzdHJpY3QgY29tcGFyaXNvbiBvZiBleHBlY3RlZCBhbmQgYWN0dWFsLg0KLSAqDQotICogICAtIGBmYWxzZXx1bmRlZmluZWRgOiBBIHNob3J0IGhhbmQgZm9yIGEgZnVuY3Rpb24gd2hpY2ggd2lsbCBsb29rIGZvciBhIHN1YnN0cmluZyBtYXRjaCBpbiBjYXNlDQotICogICAgIGluc2Vuc2l0aXZlIHdheS4NCi0gKg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGU+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgPGRpdiBuZy1pbml0PSJmcmllbmRzID0gW3tuYW1lOidKb2huJywgcGhvbmU6JzU1NS0xMjc2J30sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTonTWFyeScsIHBob25lOic4MDAtQklHLU1BUlknfSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOidNaWtlJywgcGhvbmU6JzU1NS00MzIxJ30sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTonQWRhbScsIHBob25lOic1NTUtNTY3OCd9LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6J0p1bGllJywgcGhvbmU6JzU1NS04NzY1J30sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTonSnVsaWV0dGUnLCBwaG9uZTonNTU1LTU2NzgnfV0iPjwvZGl2Pg0KLQ0KLSAgICAgICBTZWFyY2g6IDxpbnB1dCBuZy1tb2RlbD0ic2VhcmNoVGV4dCI+DQotICAgICAgIDx0YWJsZSBpZD0ic2VhcmNoVGV4dFJlc3VsdHMiPg0KLSAgICAgICAgIDx0cj48dGg+TmFtZTwvdGg+PHRoPlBob25lPC90aD48L3RyPg0KLSAgICAgICAgIDx0ciBuZy1yZXBlYXQ9ImZyaWVuZCBpbiBmcmllbmRzIHwgZmlsdGVyOnNlYXJjaFRleHQiPg0KLSAgICAgICAgICAgPHRkPnt7ZnJpZW5kLm5hbWV9fTwvdGQ+DQotICAgICAgICAgICA8dGQ+e3tmcmllbmQucGhvbmV9fTwvdGQ+DQotICAgICAgICAgPC90cj4NCi0gICAgICAgPC90YWJsZT4NCi0gICAgICAgPGhyPg0KLSAgICAgICBBbnk6IDxpbnB1dCBuZy1tb2RlbD0ic2VhcmNoLiQiPiA8YnI+DQotICAgICAgIE5hbWUgb25seSA8aW5wdXQgbmctbW9kZWw9InNlYXJjaC5uYW1lIj48YnI+DQotICAgICAgIFBob25lIG9ubHkgPGlucHV0IG5nLW1vZGVsPSJzZWFyY2gucGhvbmUiPjxicj4NCi0gICAgICAgRXF1YWxpdHkgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ic3RyaWN0Ij48YnI+DQotICAgICAgIDx0YWJsZSBpZD0ic2VhcmNoT2JqUmVzdWx0cyI+DQotICAgICAgICAgPHRyPjx0aD5OYW1lPC90aD48dGg+UGhvbmU8L3RoPjwvdHI+DQotICAgICAgICAgPHRyIG5nLXJlcGVhdD0iZnJpZW5kT2JqIGluIGZyaWVuZHMgfCBmaWx0ZXI6c2VhcmNoOnN0cmljdCI+DQotICAgICAgICAgICA8dGQ+e3tmcmllbmRPYmoubmFtZX19PC90ZD4NCi0gICAgICAgICAgIDx0ZD57e2ZyaWVuZE9iai5waG9uZX19PC90ZD4NCi0gICAgICAgICA8L3RyPg0KLSAgICAgICA8L3RhYmxlPg0KLSAgICAgPC9maWxlPg0KLSAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgIHZhciBleHBlY3RGcmllbmROYW1lcyA9IGZ1bmN0aW9uKGV4cGVjdGVkTmFtZXMsIGtleSkgew0KLSAgICAgICAgIGVsZW1lbnQuYWxsKGJ5LnJlcGVhdGVyKGtleSArICcgaW4gZnJpZW5kcycpLmNvbHVtbihrZXkgKyAnLm5hbWUnKSkudGhlbihmdW5jdGlvbihhcnIpIHsNCi0gICAgICAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uKHdkLCBpKSB7DQotICAgICAgICAgICAgIGV4cGVjdCh3ZC5nZXRUZXh0KCkpLnRvTWF0Y2goZXhwZWN0ZWROYW1lc1tpXSk7DQotICAgICAgICAgICB9KTsNCi0gICAgICAgICB9KTsNCi0gICAgICAgfTsNCi0NCi0gICAgICAgaXQoJ3Nob3VsZCBzZWFyY2ggYWNyb3NzIGFsbCBmaWVsZHMgd2hlbiBmaWx0ZXJpbmcgd2l0aCBhIHN0cmluZycsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgIHZhciBzZWFyY2hUZXh0ID0gZWxlbWVudChieS5tb2RlbCgnc2VhcmNoVGV4dCcpKTsNCi0gICAgICAgICBzZWFyY2hUZXh0LmNsZWFyKCk7DQotICAgICAgICAgc2VhcmNoVGV4dC5zZW5kS2V5cygnbScpOw0KLSAgICAgICAgIGV4cGVjdEZyaWVuZE5hbWVzKFsnTWFyeScsICdNaWtlJywgJ0FkYW0nXSwgJ2ZyaWVuZCcpOw0KLQ0KLSAgICAgICAgIHNlYXJjaFRleHQuY2xlYXIoKTsNCi0gICAgICAgICBzZWFyY2hUZXh0LnNlbmRLZXlzKCc3NicpOw0KLSAgICAgICAgIGV4cGVjdEZyaWVuZE5hbWVzKFsnSm9obicsICdKdWxpZSddLCAnZnJpZW5kJyk7DQotICAgICAgIH0pOw0KLQ0KLSAgICAgICBpdCgnc2hvdWxkIHNlYXJjaCBpbiBzcGVjaWZpYyBmaWVsZHMgd2hlbiBmaWx0ZXJpbmcgd2l0aCBhIHByZWRpY2F0ZSBvYmplY3QnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICB2YXIgc2VhcmNoQW55ID0gZWxlbWVudChieS5tb2RlbCgnc2VhcmNoLiQnKSk7DQotICAgICAgICAgc2VhcmNoQW55LmNsZWFyKCk7DQotICAgICAgICAgc2VhcmNoQW55LnNlbmRLZXlzKCdpJyk7DQotICAgICAgICAgZXhwZWN0RnJpZW5kTmFtZXMoWydNYXJ5JywgJ01pa2UnLCAnSnVsaWUnLCAnSnVsaWV0dGUnXSwgJ2ZyaWVuZE9iaicpOw0KLSAgICAgICB9KTsNCi0gICAgICAgaXQoJ3Nob3VsZCB1c2UgYSBlcXVhbCBjb21wYXJpc29uIHdoZW4gY29tcGFyYXRvciBpcyB0cnVlJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgdmFyIHNlYXJjaE5hbWUgPSBlbGVtZW50KGJ5Lm1vZGVsKCdzZWFyY2gubmFtZScpKTsNCi0gICAgICAgICB2YXIgc3RyaWN0ID0gZWxlbWVudChieS5tb2RlbCgnc3RyaWN0JykpOw0KLSAgICAgICAgIHNlYXJjaE5hbWUuY2xlYXIoKTsNCi0gICAgICAgICBzZWFyY2hOYW1lLnNlbmRLZXlzKCdKdWxpZScpOw0KLSAgICAgICAgIHN0cmljdC5jbGljaygpOw0KLSAgICAgICAgIGV4cGVjdEZyaWVuZE5hbWVzKFsnSnVsaWUnXSwgJ2ZyaWVuZE9iaicpOw0KLSAgICAgICB9KTsNCi0gICAgIDwvZmlsZT4NCi0gICA8L2V4YW1wbGU+DQotICovDQotZnVuY3Rpb24gZmlsdGVyRmlsdGVyKCkgew0KLSAgcmV0dXJuIGZ1bmN0aW9uKGFycmF5LCBleHByZXNzaW9uLCBjb21wYXJhdG9yKSB7DQotICAgIGlmICghaXNBcnJheShhcnJheSkpIHJldHVybiBhcnJheTsNCi0NCi0gICAgdmFyIHByZWRpY2F0ZUZuOw0KLSAgICB2YXIgbWF0Y2hBZ2FpbnN0QW55UHJvcDsNCi0NCi0gICAgc3dpdGNoICh0eXBlb2YgZXhwcmVzc2lvbikgew0KLSAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoNCi0gICAgICAgIHByZWRpY2F0ZUZuID0gZXhwcmVzc2lvbjsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgIGNhc2UgJ2Jvb2xlYW4nOg0KLSAgICAgIGNhc2UgJ251bWJlcic6DQotICAgICAgY2FzZSAnc3RyaW5nJzoNCi0gICAgICAgIG1hdGNoQWdhaW5zdEFueVByb3AgPSB0cnVlOw0KLSAgICAgICAgLy9qc2hpbnQgLVcwODYNCi0gICAgICBjYXNlICdvYmplY3QnOg0KLSAgICAgICAgLy9qc2hpbnQgK1cwODYNCi0gICAgICAgIHByZWRpY2F0ZUZuID0gY3JlYXRlUHJlZGljYXRlRm4oZXhwcmVzc2lvbiwgY29tcGFyYXRvciwgbWF0Y2hBZ2FpbnN0QW55UHJvcCk7DQotICAgICAgICBicmVhazsNCi0gICAgICBkZWZhdWx0Og0KLSAgICAgICAgcmV0dXJuIGFycmF5Ow0KLSAgICB9DQotDQotICAgIHJldHVybiBhcnJheS5maWx0ZXIocHJlZGljYXRlRm4pOw0KLSAgfTsNCi19DQotDQotLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYGZpbHRlckZpbHRlcmANCi1mdW5jdGlvbiBjcmVhdGVQcmVkaWNhdGVGbihleHByZXNzaW9uLCBjb21wYXJhdG9yLCBtYXRjaEFnYWluc3RBbnlQcm9wKSB7DQotICB2YXIgc2hvdWxkTWF0Y2hQcmltaXRpdmVzID0gaXNPYmplY3QoZXhwcmVzc2lvbikgJiYgKCckJyBpbiBleHByZXNzaW9uKTsNCi0gIHZhciBwcmVkaWNhdGVGbjsNCi0NCi0gIGlmIChjb21wYXJhdG9yID09PSB0cnVlKSB7DQotICAgIGNvbXBhcmF0b3IgPSBlcXVhbHM7DQotICB9IGVsc2UgaWYgKCFpc0Z1bmN0aW9uKGNvbXBhcmF0b3IpKSB7DQotICAgIGNvbXBhcmF0b3IgPSBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7DQotICAgICAgaWYgKGlzT2JqZWN0KGFjdHVhbCkgfHwgaXNPYmplY3QoZXhwZWN0ZWQpKSB7DQotICAgICAgICAvLyBQcmV2ZW50IGFuIG9iamVjdCB0byBiZSBjb25zaWRlcmVkIGVxdWFsIHRvIGEgc3RyaW5nIGxpa2UgYCdbb2JqZWN0J2ANCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICB9DQotDQotICAgICAgYWN0dWFsID0gbG93ZXJjYXNlKCcnICsgYWN0dWFsKTsNCi0gICAgICBleHBlY3RlZCA9IGxvd2VyY2FzZSgnJyArIGV4cGVjdGVkKTsNCi0gICAgICByZXR1cm4gYWN0dWFsLmluZGV4T2YoZXhwZWN0ZWQpICE9PSAtMTsNCi0gICAgfTsNCi0gIH0NCi0NCi0gIHByZWRpY2F0ZUZuID0gZnVuY3Rpb24oaXRlbSkgew0KLSAgICBpZiAoc2hvdWxkTWF0Y2hQcmltaXRpdmVzICYmICFpc09iamVjdChpdGVtKSkgew0KLSAgICAgIHJldHVybiBkZWVwQ29tcGFyZShpdGVtLCBleHByZXNzaW9uLiQsIGNvbXBhcmF0b3IsIGZhbHNlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gZGVlcENvbXBhcmUoaXRlbSwgZXhwcmVzc2lvbiwgY29tcGFyYXRvciwgbWF0Y2hBZ2FpbnN0QW55UHJvcCk7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIHByZWRpY2F0ZUZuOw0KLX0NCi0NCi1mdW5jdGlvbiBkZWVwQ29tcGFyZShhY3R1YWwsIGV4cGVjdGVkLCBjb21wYXJhdG9yLCBtYXRjaEFnYWluc3RBbnlQcm9wLCBkb250TWF0Y2hXaG9sZU9iamVjdCkgew0KLSAgdmFyIGFjdHVhbFR5cGUgPSB0eXBlb2YgYWN0dWFsOw0KLSAgdmFyIGV4cGVjdGVkVHlwZSA9IHR5cGVvZiBleHBlY3RlZDsNCi0NCi0gIGlmICgoZXhwZWN0ZWRUeXBlID09PSAnc3RyaW5nJykgJiYgKGV4cGVjdGVkLmNoYXJBdCgwKSA9PT0gJyEnKSkgew0KLSAgICByZXR1cm4gIWRlZXBDb21wYXJlKGFjdHVhbCwgZXhwZWN0ZWQuc3Vic3RyaW5nKDEpLCBjb21wYXJhdG9yLCBtYXRjaEFnYWluc3RBbnlQcm9wKTsNCi0gIH0gZWxzZSBpZiAoYWN0dWFsVHlwZSA9PT0gJ2FycmF5Jykgew0KLSAgICAvLyBJbiBjYXNlIGBhY3R1YWxgIGlzIGFuIGFycmF5LCBjb25zaWRlciBpdCBhIG1hdGNoDQotICAgIC8vIGlmIEFOWSBvZiBpdCdzIGl0ZW1zIG1hdGNoZXMgYGV4cGVjdGVkYA0KLSAgICByZXR1cm4gYWN0dWFsLnNvbWUoZnVuY3Rpb24oaXRlbSkgew0KLSAgICAgIHJldHVybiBkZWVwQ29tcGFyZShpdGVtLCBleHBlY3RlZCwgY29tcGFyYXRvciwgbWF0Y2hBZ2FpbnN0QW55UHJvcCk7DQotICAgIH0pOw0KLSAgfQ0KLQ0KLSAgc3dpdGNoIChhY3R1YWxUeXBlKSB7DQotICAgIGNhc2UgJ29iamVjdCc6DQotICAgICAgdmFyIGtleTsNCi0gICAgICBpZiAobWF0Y2hBZ2FpbnN0QW55UHJvcCkgew0KLSAgICAgICAgZm9yIChrZXkgaW4gYWN0dWFsKSB7DQotICAgICAgICAgIGlmICgoa2V5LmNoYXJBdCgwKSAhPT0gJyQnKSAmJiBkZWVwQ29tcGFyZShhY3R1YWxba2V5XSwgZXhwZWN0ZWQsIGNvbXBhcmF0b3IsIHRydWUpKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBkb250TWF0Y2hXaG9sZU9iamVjdCA/IGZhbHNlIDogZGVlcENvbXBhcmUoYWN0dWFsLCBleHBlY3RlZCwgY29tcGFyYXRvciwgZmFsc2UpOw0KLSAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnb2JqZWN0Jykgew0KLSAgICAgICAgZm9yIChrZXkgaW4gZXhwZWN0ZWQpIHsNCi0gICAgICAgICAgdmFyIGV4cGVjdGVkVmFsID0gZXhwZWN0ZWRba2V5XTsNCi0gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZXhwZWN0ZWRWYWwpKSB7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgdmFyIG1hdGNoQW55UHJvcGVydHkgPSBrZXkgPT09ICckJzsNCi0gICAgICAgICAgdmFyIGFjdHVhbFZhbCA9IG1hdGNoQW55UHJvcGVydHkgPyBhY3R1YWwgOiBhY3R1YWxba2V5XTsNCi0gICAgICAgICAgaWYgKCFkZWVwQ29tcGFyZShhY3R1YWxWYWwsIGV4cGVjdGVkVmFsLCBjb21wYXJhdG9yLCBtYXRjaEFueVByb3BlcnR5LCBtYXRjaEFueVByb3BlcnR5KSkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGFjdHVhbCwgZXhwZWN0ZWQpOw0KLSAgICAgIH0NCi0gICAgICBicmVhazsNCi0gICAgY2FzZSAnZnVuY3Rpb24nOg0KLSAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgZGVmYXVsdDoNCi0gICAgICByZXR1cm4gY29tcGFyYXRvcihhY3R1YWwsIGV4cGVjdGVkKTsNCi0gIH0NCi19DQotDQotLyoqDQotICogQG5nZG9jIGZpbHRlcg0KLSAqIEBuYW1lIGN1cnJlbmN5DQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEZvcm1hdHMgYSBudW1iZXIgYXMgYSBjdXJyZW5jeSAoaWUgJDEsMjM0LjU2KS4gV2hlbiBubyBjdXJyZW5jeSBzeW1ib2wgaXMgcHJvdmlkZWQsIGRlZmF1bHQNCi0gKiBzeW1ib2wgZm9yIGN1cnJlbnQgbG9jYWxlIGlzIHVzZWQuDQotICoNCi0gKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IElucHV0IHRvIGZpbHRlci4NCi0gKiBAcGFyYW0ge3N0cmluZz19IHN5bWJvbCBDdXJyZW5jeSBzeW1ib2wgb3IgaWRlbnRpZmllciB0byBiZSBkaXNwbGF5ZWQuDQotICogQHBhcmFtIHtudW1iZXI9fSBmcmFjdGlvblNpemUgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHJvdW5kIHRoZSBhbW91bnQgdG8sIGRlZmF1bHRzIHRvIGRlZmF1bHQgbWF4IGZyYWN0aW9uIHNpemUgZm9yIGN1cnJlbnQgbG9jYWxlDQotICogQHJldHVybnMge3N0cmluZ30gRm9ybWF0dGVkIG51bWJlci4NCi0gKg0KLSAqDQotICogQGV4YW1wbGUNCi0gICA8ZXhhbXBsZSBtb2R1bGU9ImN1cnJlbmN5RXhhbXBsZSI+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgPHNjcmlwdD4NCi0gICAgICAgICBhbmd1bGFyLm1vZHVsZSgnY3VycmVuY3lFeGFtcGxlJywgW10pDQotICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAgICAkc2NvcGUuYW1vdW50ID0gMTIzNC41NjsNCi0gICAgICAgICAgIH1dKTsNCi0gICAgICAgPC9zY3JpcHQ+DQotICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIG5nLW1vZGVsPSJhbW91bnQiPiA8YnI+DQotICAgICAgICAgZGVmYXVsdCBjdXJyZW5jeSBzeW1ib2wgKCQpOiA8c3BhbiBpZD0iY3VycmVuY3ktZGVmYXVsdCI+e3thbW91bnQgfCBjdXJyZW5jeX19PC9zcGFuPjxicj4NCi0gICAgICAgICBjdXN0b20gY3VycmVuY3kgaWRlbnRpZmllciAoVVNEJCk6IDxzcGFuIGlkPSJjdXJyZW5jeS1jdXN0b20iPnt7YW1vdW50IHwgY3VycmVuY3k6IlVTRCQifX08L3NwYW4+DQotICAgICAgICAgbm8gZnJhY3Rpb25zICgwKTogPHNwYW4gaWQ9ImN1cnJlbmN5LW5vLWZyYWN0aW9ucyI+e3thbW91bnQgfCBjdXJyZW5jeToiVVNEJCI6MH19PC9zcGFuPg0KLSAgICAgICA8L2Rpdj4NCi0gICAgIDwvZmlsZT4NCi0gICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICBpdCgnc2hvdWxkIGluaXQgd2l0aCAxMjM0LjU2JywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2N1cnJlbmN5LWRlZmF1bHQnKSkuZ2V0VGV4dCgpKS50b0JlKCckMSwyMzQuNTYnKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktY3VzdG9tJykpLmdldFRleHQoKSkudG9CZSgnVVNEJDEsMjM0LjU2Jyk7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2N1cnJlbmN5LW5vLWZyYWN0aW9ucycpKS5nZXRUZXh0KCkpLnRvQmUoJ1VTRCQxLDIzNScpOw0KLSAgICAgICB9KTsNCi0gICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICBpZiAoYnJvd3Nlci5wYXJhbXMuYnJvd3NlciA9PSAnc2FmYXJpJykgew0KLSAgICAgICAgICAgLy8gU2FmYXJpIGRvZXMgbm90IHVuZGVyc3RhbmQgdGhlIG1pbnVzIGtleS4gU2VlDQotICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9wcm90cmFjdG9yL2lzc3Vlcy80ODENCi0gICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICB9DQotICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnYW1vdW50JykpLmNsZWFyKCk7DQotICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnYW1vdW50JykpLnNlbmRLZXlzKCctMTIzNCcpOw0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjdXJyZW5jeS1kZWZhdWx0JykpLmdldFRleHQoKSkudG9CZSgnKCQxLDIzNC4wMCknKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktY3VzdG9tJykpLmdldFRleHQoKSkudG9CZSgnKFVTRCQxLDIzNC4wMCknKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktbm8tZnJhY3Rpb25zJykpLmdldFRleHQoKSkudG9CZSgnKFVTRCQxLDIzNCknKTsNCi0gICAgICAgfSk7DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLWN1cnJlbmN5RmlsdGVyLiRpbmplY3QgPSBbJyRsb2NhbGUnXTsNCi1mdW5jdGlvbiBjdXJyZW5jeUZpbHRlcigkbG9jYWxlKSB7DQotICB2YXIgZm9ybWF0cyA9ICRsb2NhbGUuTlVNQkVSX0ZPUk1BVFM7DQotICByZXR1cm4gZnVuY3Rpb24oYW1vdW50LCBjdXJyZW5jeVN5bWJvbCwgZnJhY3Rpb25TaXplKSB7DQotICAgIGlmIChpc1VuZGVmaW5lZChjdXJyZW5jeVN5bWJvbCkpIHsNCi0gICAgICBjdXJyZW5jeVN5bWJvbCA9IGZvcm1hdHMuQ1VSUkVOQ1lfU1lNOw0KLSAgICB9DQotDQotICAgIGlmIChpc1VuZGVmaW5lZChmcmFjdGlvblNpemUpKSB7DQotICAgICAgZnJhY3Rpb25TaXplID0gZm9ybWF0cy5QQVRURVJOU1sxXS5tYXhGcmFjOw0KLSAgICB9DQotDQotICAgIC8vIGlmIG51bGwgb3IgdW5kZWZpbmVkIHBhc3MgaXQgdGhyb3VnaA0KLSAgICByZXR1cm4gKGFtb3VudCA9PSBudWxsKQ0KLSAgICAgICAgPyBhbW91bnQNCi0gICAgICAgIDogZm9ybWF0TnVtYmVyKGFtb3VudCwgZm9ybWF0cy5QQVRURVJOU1sxXSwgZm9ybWF0cy5HUk9VUF9TRVAsIGZvcm1hdHMuREVDSU1BTF9TRVAsIGZyYWN0aW9uU2l6ZSkuDQotICAgICAgICAgICAgcmVwbGFjZSgvXHUwMEE0L2csIGN1cnJlbmN5U3ltYm9sKTsNCi0gIH07DQotfQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBmaWx0ZXINCi0gKiBAbmFtZSBudW1iZXINCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogRm9ybWF0cyBhIG51bWJlciBhcyB0ZXh0Lg0KLSAqDQotICogSWYgdGhlIGlucHV0IGlzIG5vdCBhIG51bWJlciBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuDQotICoNCi0gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IG51bWJlciBOdW1iZXIgdG8gZm9ybWF0Lg0KLSAqIEBwYXJhbSB7KG51bWJlcnxzdHJpbmcpPX0gZnJhY3Rpb25TaXplIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZCB0aGUgbnVtYmVyIHRvLg0KLSAqIElmIHRoaXMgaXMgbm90IHByb3ZpZGVkIHRoZW4gdGhlIGZyYWN0aW9uIHNpemUgaXMgY29tcHV0ZWQgZnJvbSB0aGUgY3VycmVudCBsb2NhbGUncyBudW1iZXINCi0gKiBmb3JtYXR0aW5nIHBhdHRlcm4uIEluIHRoZSBjYXNlIG9mIHRoZSBkZWZhdWx0IGxvY2FsZSwgaXQgd2lsbCBiZSAzLg0KLSAqIEByZXR1cm5zIHtzdHJpbmd9IE51bWJlciByb3VuZGVkIHRvIGRlY2ltYWxQbGFjZXMgYW5kIHBsYWNlcyBhIOKAPyzigD8gYWZ0ZXIgZWFjaCB0aGlyZCBkaWdpdC4NCi0gKg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGUgbW9kdWxlPSJudW1iZXJGaWx0ZXJFeGFtcGxlIj4NCi0gICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICA8c2NyaXB0Pg0KLSAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdudW1iZXJGaWx0ZXJFeGFtcGxlJywgW10pDQotICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAgICAkc2NvcGUudmFsID0gMTIzNC41Njc4OTsNCi0gICAgICAgICAgIH1dKTsNCi0gICAgICAgPC9zY3JpcHQ+DQotICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAgICAgICAgIEVudGVyIG51bWJlcjogPGlucHV0IG5nLW1vZGVsPSd2YWwnPjxicj4NCi0gICAgICAgICBEZWZhdWx0IGZvcm1hdHRpbmc6IDxzcGFuIGlkPSdudW1iZXItZGVmYXVsdCc+e3t2YWwgfCBudW1iZXJ9fTwvc3Bhbj48YnI+DQotICAgICAgICAgTm8gZnJhY3Rpb25zOiA8c3Bhbj57e3ZhbCB8IG51bWJlcjowfX08L3NwYW4+PGJyPg0KLSAgICAgICAgIE5lZ2F0aXZlIG51bWJlcjogPHNwYW4+e3stdmFsIHwgbnVtYmVyOjR9fTwvc3Bhbj4NCi0gICAgICAgPC9kaXY+DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgaXQoJ3Nob3VsZCBmb3JtYXQgbnVtYmVycycsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdudW1iZXItZGVmYXVsdCcpKS5nZXRUZXh0KCkpLnRvQmUoJzEsMjM0LjU2OCcpOw0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3ZhbCB8IG51bWJlcjowJykpLmdldFRleHQoKSkudG9CZSgnMSwyMzUnKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCctdmFsIHwgbnVtYmVyOjQnKSkuZ2V0VGV4dCgpKS50b0JlKCctMSwyMzQuNTY3OScpOw0KLSAgICAgICB9KTsNCi0NCi0gICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCd2YWwnKSkuY2xlYXIoKTsNCi0gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCd2YWwnKSkuc2VuZEtleXMoJzMzNzQuMzMzJyk7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ251bWJlci1kZWZhdWx0JykpLmdldFRleHQoKSkudG9CZSgnMywzNzQuMzMzJyk7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygndmFsIHwgbnVtYmVyOjAnKSkuZ2V0VGV4dCgpKS50b0JlKCczLDM3NCcpOw0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJy12YWwgfCBudW1iZXI6NCcpKS5nZXRUZXh0KCkpLnRvQmUoJy0zLDM3NC4zMzMwJyk7DQotICAgICAgfSk7DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLQ0KLQ0KLW51bWJlckZpbHRlci4kaW5qZWN0ID0gWyckbG9jYWxlJ107DQotZnVuY3Rpb24gbnVtYmVyRmlsdGVyKCRsb2NhbGUpIHsNCi0gIHZhciBmb3JtYXRzID0gJGxvY2FsZS5OVU1CRVJfRk9STUFUUzsNCi0gIHJldHVybiBmdW5jdGlvbihudW1iZXIsIGZyYWN0aW9uU2l6ZSkgew0KLQ0KLSAgICAvLyBpZiBudWxsIG9yIHVuZGVmaW5lZCBwYXNzIGl0IHRocm91Z2gNCi0gICAgcmV0dXJuIChudW1iZXIgPT0gbnVsbCkNCi0gICAgICAgID8gbnVtYmVyDQotICAgICAgICA6IGZvcm1hdE51bWJlcihudW1iZXIsIGZvcm1hdHMuUEFUVEVSTlNbMF0sIGZvcm1hdHMuR1JPVVBfU0VQLCBmb3JtYXRzLkRFQ0lNQUxfU0VQLA0KLSAgICAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25TaXplKTsNCi0gIH07DQotfQ0KLQ0KLXZhciBERUNJTUFMX1NFUCA9ICcuJzsNCi1mdW5jdGlvbiBmb3JtYXROdW1iZXIobnVtYmVyLCBwYXR0ZXJuLCBncm91cFNlcCwgZGVjaW1hbFNlcCwgZnJhY3Rpb25TaXplKSB7DQotICBpZiAoIWlzRmluaXRlKG51bWJlcikgfHwgaXNPYmplY3QobnVtYmVyKSkgcmV0dXJuICcnOw0KLQ0KLSAgdmFyIGlzTmVnYXRpdmUgPSBudW1iZXIgPCAwOw0KLSAgbnVtYmVyID0gTWF0aC5hYnMobnVtYmVyKTsNCi0gIHZhciBudW1TdHIgPSBudW1iZXIgKyAnJywNCi0gICAgICBmb3JtYXRlZFRleHQgPSAnJywNCi0gICAgICBwYXJ0cyA9IFtdOw0KLQ0KLSAgdmFyIGhhc0V4cG9uZW50ID0gZmFsc2U7DQotICBpZiAobnVtU3RyLmluZGV4T2YoJ2UnKSAhPT0gLTEpIHsNCi0gICAgdmFyIG1hdGNoID0gbnVtU3RyLm1hdGNoKC8oW1xkXC5dKyllKC0/KShcZCspLyk7DQotICAgIGlmIChtYXRjaCAmJiBtYXRjaFsyXSA9PSAnLScgJiYgbWF0Y2hbM10gPiBmcmFjdGlvblNpemUgKyAxKSB7DQotICAgICAgbnVtYmVyID0gMDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBmb3JtYXRlZFRleHQgPSBudW1TdHI7DQotICAgICAgaGFzRXhwb25lbnQgPSB0cnVlOw0KLSAgICB9DQotICB9DQotDQotICBpZiAoIWhhc0V4cG9uZW50KSB7DQotICAgIHZhciBmcmFjdGlvbkxlbiA9IChudW1TdHIuc3BsaXQoREVDSU1BTF9TRVApWzFdIHx8ICcnKS5sZW5ndGg7DQotDQotICAgIC8vIGRldGVybWluZSBmcmFjdGlvblNpemUgaWYgaXQgaXMgbm90IHNwZWNpZmllZA0KLSAgICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb25TaXplKSkgew0KLSAgICAgIGZyYWN0aW9uU2l6ZSA9IE1hdGgubWluKE1hdGgubWF4KHBhdHRlcm4ubWluRnJhYywgZnJhY3Rpb25MZW4pLCBwYXR0ZXJuLm1heEZyYWMpOw0KLSAgICB9DQotDQotICAgIC8vIHNhZmVseSByb3VuZCBudW1iZXJzIGluIEpTIHdpdGhvdXQgaGl0dGluZyBpbXByZWNpc2lvbnMgb2YgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpY3MNCi0gICAgLy8gaW5zcGlyZWQgYnk6DQotICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvcm91bmQNCi0gICAgbnVtYmVyID0gKyhNYXRoLnJvdW5kKCsobnVtYmVyLnRvU3RyaW5nKCkgKyAnZScgKyBmcmFjdGlvblNpemUpKS50b1N0cmluZygpICsgJ2UnICsgLWZyYWN0aW9uU2l6ZSk7DQotDQotICAgIHZhciBmcmFjdGlvbiA9ICgnJyArIG51bWJlcikuc3BsaXQoREVDSU1BTF9TRVApOw0KLSAgICB2YXIgd2hvbGUgPSBmcmFjdGlvblswXTsNCi0gICAgZnJhY3Rpb24gPSBmcmFjdGlvblsxXSB8fCAnJzsNCi0NCi0gICAgdmFyIGksIHBvcyA9IDAsDQotICAgICAgICBsZ3JvdXAgPSBwYXR0ZXJuLmxnU2l6ZSwNCi0gICAgICAgIGdyb3VwID0gcGF0dGVybi5nU2l6ZTsNCi0NCi0gICAgaWYgKHdob2xlLmxlbmd0aCA+PSAobGdyb3VwICsgZ3JvdXApKSB7DQotICAgICAgcG9zID0gd2hvbGUubGVuZ3RoIC0gbGdyb3VwOw0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwb3M7IGkrKykgew0KLSAgICAgICAgaWYgKChwb3MgLSBpKSAlIGdyb3VwID09PSAwICYmIGkgIT09IDApIHsNCi0gICAgICAgICAgZm9ybWF0ZWRUZXh0ICs9IGdyb3VwU2VwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9ybWF0ZWRUZXh0ICs9IHdob2xlLmNoYXJBdChpKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgZm9yIChpID0gcG9zOyBpIDwgd2hvbGUubGVuZ3RoOyBpKyspIHsNCi0gICAgICBpZiAoKHdob2xlLmxlbmd0aCAtIGkpICUgbGdyb3VwID09PSAwICYmIGkgIT09IDApIHsNCi0gICAgICAgIGZvcm1hdGVkVGV4dCArPSBncm91cFNlcDsNCi0gICAgICB9DQotICAgICAgZm9ybWF0ZWRUZXh0ICs9IHdob2xlLmNoYXJBdChpKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBmb3JtYXQgZnJhY3Rpb24gcGFydC4NCi0gICAgd2hpbGUgKGZyYWN0aW9uLmxlbmd0aCA8IGZyYWN0aW9uU2l6ZSkgew0KLSAgICAgIGZyYWN0aW9uICs9ICcwJzsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoZnJhY3Rpb25TaXplICYmIGZyYWN0aW9uU2l6ZSAhPT0gIjAiKSBmb3JtYXRlZFRleHQgKz0gZGVjaW1hbFNlcCArIGZyYWN0aW9uLnN1YnN0cigwLCBmcmFjdGlvblNpemUpOw0KLSAgfSBlbHNlIHsNCi0gICAgaWYgKGZyYWN0aW9uU2l6ZSA+IDAgJiYgbnVtYmVyIDwgMSkgew0KLSAgICAgIGZvcm1hdGVkVGV4dCA9IG51bWJlci50b0ZpeGVkKGZyYWN0aW9uU2l6ZSk7DQotICAgICAgbnVtYmVyID0gcGFyc2VGbG9hdChmb3JtYXRlZFRleHQpOw0KLSAgICB9DQotICB9DQotDQotICBpZiAobnVtYmVyID09PSAwKSB7DQotICAgIGlzTmVnYXRpdmUgPSBmYWxzZTsNCi0gIH0NCi0NCi0gIHBhcnRzLnB1c2goaXNOZWdhdGl2ZSA/IHBhdHRlcm4ubmVnUHJlIDogcGF0dGVybi5wb3NQcmUsDQotICAgICAgICAgICAgIGZvcm1hdGVkVGV4dCwNCi0gICAgICAgICAgICAgaXNOZWdhdGl2ZSA/IHBhdHRlcm4ubmVnU3VmIDogcGF0dGVybi5wb3NTdWYpOw0KLSAgcmV0dXJuIHBhcnRzLmpvaW4oJycpOw0KLX0NCi0NCi1mdW5jdGlvbiBwYWROdW1iZXIobnVtLCBkaWdpdHMsIHRyaW0pIHsNCi0gIHZhciBuZWcgPSAnJzsNCi0gIGlmIChudW0gPCAwKSB7DQotICAgIG5lZyA9ICAnLSc7DQotICAgIG51bSA9IC1udW07DQotICB9DQotICBudW0gPSAnJyArIG51bTsNCi0gIHdoaWxlIChudW0ubGVuZ3RoIDwgZGlnaXRzKSBudW0gPSAnMCcgKyBudW07DQotICBpZiAodHJpbSkNCi0gICAgbnVtID0gbnVtLnN1YnN0cihudW0ubGVuZ3RoIC0gZGlnaXRzKTsNCi0gIHJldHVybiBuZWcgKyBudW07DQotfQ0KLQ0KLQ0KLWZ1bmN0aW9uIGRhdGVHZXR0ZXIobmFtZSwgc2l6ZSwgb2Zmc2V0LCB0cmltKSB7DQotICBvZmZzZXQgPSBvZmZzZXQgfHwgMDsNCi0gIHJldHVybiBmdW5jdGlvbihkYXRlKSB7DQotICAgIHZhciB2YWx1ZSA9IGRhdGVbJ2dldCcgKyBuYW1lXSgpOw0KLSAgICBpZiAob2Zmc2V0ID4gMCB8fCB2YWx1ZSA+IC1vZmZzZXQpDQotICAgICAgdmFsdWUgKz0gb2Zmc2V0Ow0KLSAgICBpZiAodmFsdWUgPT09IDAgJiYgb2Zmc2V0ID09IC0xMikgdmFsdWUgPSAxMjsNCi0gICAgcmV0dXJuIHBhZE51bWJlcih2YWx1ZSwgc2l6ZSwgdHJpbSk7DQotICB9Ow0KLX0NCi0NCi1mdW5jdGlvbiBkYXRlU3RyR2V0dGVyKG5hbWUsIHNob3J0Rm9ybSkgew0KLSAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUsIGZvcm1hdHMpIHsNCi0gICAgdmFyIHZhbHVlID0gZGF0ZVsnZ2V0JyArIG5hbWVdKCk7DQotICAgIHZhciBnZXQgPSB1cHBlcmNhc2Uoc2hvcnRGb3JtID8gKCdTSE9SVCcgKyBuYW1lKSA6IG5hbWUpOw0KLQ0KLSAgICByZXR1cm4gZm9ybWF0c1tnZXRdW3ZhbHVlXTsNCi0gIH07DQotfQ0KLQ0KLWZ1bmN0aW9uIHRpbWVab25lR2V0dGVyKGRhdGUpIHsNCi0gIHZhciB6b25lID0gLTEgKiBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7DQotICB2YXIgcGFkZGVkWm9uZSA9ICh6b25lID49IDApID8gIisiIDogIiI7DQotDQotICBwYWRkZWRab25lICs9IHBhZE51bWJlcihNYXRoW3pvbmUgPiAwID8gJ2Zsb29yJyA6ICdjZWlsJ10oem9uZSAvIDYwKSwgMikgKw0KLSAgICAgICAgICAgICAgICBwYWROdW1iZXIoTWF0aC5hYnMoem9uZSAlIDYwKSwgMik7DQotDQotICByZXR1cm4gcGFkZGVkWm9uZTsNCi19DQotDQotZnVuY3Rpb24gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcih5ZWFyKSB7DQotICAgIC8vIDAgPSBpbmRleCBvZiBKYW51YXJ5DQotICAgIHZhciBkYXlPZldlZWtPbkZpcnN0ID0gKG5ldyBEYXRlKHllYXIsIDAsIDEpKS5nZXREYXkoKTsNCi0gICAgLy8gNCA9IGluZGV4IG9mIFRodXJzZGF5ICgrMSB0byBhY2NvdW50IGZvciAxc3QgPSA1KQ0KLSAgICAvLyAxMSA9IGluZGV4IG9mICpuZXh0KiBUaHVyc2RheSAoKzEgYWNjb3VudCBmb3IgMXN0ID0gMTIpDQotICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwLCAoKGRheU9mV2Vla09uRmlyc3QgPD0gNCkgPyA1IDogMTIpIC0gZGF5T2ZXZWVrT25GaXJzdCk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldFRodXJzZGF5VGhpc1dlZWsoZGF0ZXRpbWUpIHsNCi0gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGV0aW1lLmdldEZ1bGxZZWFyKCksIGRhdGV0aW1lLmdldE1vbnRoKCksDQotICAgICAgLy8gNCA9IGluZGV4IG9mIFRodXJzZGF5DQotICAgICAgZGF0ZXRpbWUuZ2V0RGF0ZSgpICsgKDQgLSBkYXRldGltZS5nZXREYXkoKSkpOw0KLX0NCi0NCi1mdW5jdGlvbiB3ZWVrR2V0dGVyKHNpemUpIHsNCi0gICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkgew0KLSAgICAgIHZhciBmaXJzdFRodXJzID0gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkpLA0KLSAgICAgICAgIHRoaXNUaHVycyA9IGdldFRodXJzZGF5VGhpc1dlZWsoZGF0ZSk7DQotDQotICAgICAgdmFyIGRpZmYgPSArdGhpc1RodXJzIC0gK2ZpcnN0VGh1cnMsDQotICAgICAgICAgcmVzdWx0ID0gMSArIE1hdGgucm91bmQoZGlmZiAvIDYuMDQ4ZTgpOyAvLyA2LjA0OGU4IG1zIHBlciB3ZWVrDQotDQotICAgICAgcmV0dXJuIHBhZE51bWJlcihyZXN1bHQsIHNpemUpOw0KLSAgIH07DQotfQ0KLQ0KLWZ1bmN0aW9uIGFtcG1HZXR0ZXIoZGF0ZSwgZm9ybWF0cykgew0KLSAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKSA8IDEyID8gZm9ybWF0cy5BTVBNU1swXSA6IGZvcm1hdHMuQU1QTVNbMV07DQotfQ0KLQ0KLXZhciBEQVRFX0ZPUk1BVFMgPSB7DQotICB5eXl5OiBkYXRlR2V0dGVyKCdGdWxsWWVhcicsIDQpLA0KLSAgICB5eTogZGF0ZUdldHRlcignRnVsbFllYXInLCAyLCAwLCB0cnVlKSwNCi0gICAgIHk6IGRhdGVHZXR0ZXIoJ0Z1bGxZZWFyJywgMSksDQotICBNTU1NOiBkYXRlU3RyR2V0dGVyKCdNb250aCcpLA0KLSAgIE1NTTogZGF0ZVN0ckdldHRlcignTW9udGgnLCB0cnVlKSwNCi0gICAgTU06IGRhdGVHZXR0ZXIoJ01vbnRoJywgMiwgMSksDQotICAgICBNOiBkYXRlR2V0dGVyKCdNb250aCcsIDEsIDEpLA0KLSAgICBkZDogZGF0ZUdldHRlcignRGF0ZScsIDIpLA0KLSAgICAgZDogZGF0ZUdldHRlcignRGF0ZScsIDEpLA0KLSAgICBISDogZGF0ZUdldHRlcignSG91cnMnLCAyKSwNCi0gICAgIEg6IGRhdGVHZXR0ZXIoJ0hvdXJzJywgMSksDQotICAgIGhoOiBkYXRlR2V0dGVyKCdIb3VycycsIDIsIC0xMiksDQotICAgICBoOiBkYXRlR2V0dGVyKCdIb3VycycsIDEsIC0xMiksDQotICAgIG1tOiBkYXRlR2V0dGVyKCdNaW51dGVzJywgMiksDQotICAgICBtOiBkYXRlR2V0dGVyKCdNaW51dGVzJywgMSksDQotICAgIHNzOiBkYXRlR2V0dGVyKCdTZWNvbmRzJywgMiksDQotICAgICBzOiBkYXRlR2V0dGVyKCdTZWNvbmRzJywgMSksDQotICAgICAvLyB3aGlsZSBJU08gODYwMSByZXF1aXJlcyBmcmFjdGlvbnMgdG8gYmUgcHJlZml4ZWQgd2l0aCBgLmAgb3IgYCxgDQotICAgICAvLyB3ZSBjYW4gYmUganVzdCBzYWZlbHkgcmVseSBvbiB1c2luZyBgc3NzYCBzaW5jZSB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBzaW5nbGUgb3IgdHdvIGRpZ2l0IGZyYWN0aW9ucw0KLSAgIHNzczogZGF0ZUdldHRlcignTWlsbGlzZWNvbmRzJywgMyksDQotICBFRUVFOiBkYXRlU3RyR2V0dGVyKCdEYXknKSwNCi0gICBFRUU6IGRhdGVTdHJHZXR0ZXIoJ0RheScsIHRydWUpLA0KLSAgICAgYTogYW1wbUdldHRlciwNCi0gICAgIFo6IHRpbWVab25lR2V0dGVyLA0KLSAgICB3dzogd2Vla0dldHRlcigyKSwNCi0gICAgIHc6IHdlZWtHZXR0ZXIoMSkNCi19Ow0KLQ0KLXZhciBEQVRFX0ZPUk1BVFNfU1BMSVQgPSAvKCg/OlteeU1kSGhtc2FaRXcnXSspfCg/OicoPzpbXiddfCcnKSonKXwoPzpFK3x5K3xNK3xkK3xIK3xoK3xtK3xzK3xhfFp8dyspKSguKikvLA0KLSAgICBOVU1CRVJfU1RSSU5HID0gL15cLT9cZCskLzsNCi0NCi0vKioNCi0gKiBAbmdkb2MgZmlsdGVyDQotICogQG5hbWUgZGF0ZQ0KLSAqIEBraW5kIGZ1bmN0aW9uDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiAgIEZvcm1hdHMgYGRhdGVgIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgYGZvcm1hdGAuDQotICoNCi0gKiAgIGBmb3JtYXRgIHN0cmluZyBjYW4gYmUgY29tcG9zZWQgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50czoNCi0gKg0KLSAqICAgKiBgJ3l5eXknYDogNCBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB5ZWFyIChlLmcuIEFEIDEgPT4gMDAwMSwgQUQgMjAxMCA9PiAyMDEwKQ0KLSAqICAgKiBgJ3l5J2A6IDIgZGlnaXQgcmVwcmVzZW50YXRpb24gb2YgeWVhciwgcGFkZGVkICgwMC05OSkuIChlLmcuIEFEIDIwMDEgPT4gMDEsIEFEIDIwMTAgPT4gMTApDQotICogICAqIGAneSdgOiAxIGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHllYXIsIGUuZy4gKEFEIDEgPT4gMSwgQUQgMTk5ID0+IDE5OSkNCi0gKiAgICogYCdNTU1NJ2A6IE1vbnRoIGluIHllYXIgKEphbnVhcnktRGVjZW1iZXIpDQotICogICAqIGAnTU1NJ2A6IE1vbnRoIGluIHllYXIgKEphbi1EZWMpDQotICogICAqIGAnTU0nYDogTW9udGggaW4geWVhciwgcGFkZGVkICgwMS0xMikNCi0gKiAgICogYCdNJ2A6IE1vbnRoIGluIHllYXIgKDEtMTIpDQotICogICAqIGAnZGQnYDogRGF5IGluIG1vbnRoLCBwYWRkZWQgKDAxLTMxKQ0KLSAqICAgKiBgJ2QnYDogRGF5IGluIG1vbnRoICgxLTMxKQ0KLSAqICAgKiBgJ0VFRUUnYDogRGF5IGluIFdlZWssKFN1bmRheS1TYXR1cmRheSkNCi0gKiAgICogYCdFRUUnYDogRGF5IGluIFdlZWssIChTdW4tU2F0KQ0KLSAqICAgKiBgJ0hIJ2A6IEhvdXIgaW4gZGF5LCBwYWRkZWQgKDAwLTIzKQ0KLSAqICAgKiBgJ0gnYDogSG91ciBpbiBkYXkgKDAtMjMpDQotICogICAqIGAnaGgnYDogSG91ciBpbiBBTS9QTSwgcGFkZGVkICgwMS0xMikNCi0gKiAgICogYCdoJ2A6IEhvdXIgaW4gQU0vUE0sICgxLTEyKQ0KLSAqICAgKiBgJ21tJ2A6IE1pbnV0ZSBpbiBob3VyLCBwYWRkZWQgKDAwLTU5KQ0KLSAqICAgKiBgJ20nYDogTWludXRlIGluIGhvdXIgKDAtNTkpDQotICogICAqIGAnc3MnYDogU2Vjb25kIGluIG1pbnV0ZSwgcGFkZGVkICgwMC01OSkNCi0gKiAgICogYCdzJ2A6IFNlY29uZCBpbiBtaW51dGUgKDAtNTkpDQotICogICAqIGAnLnNzcycgb3IgJyxzc3MnYDogTWlsbGlzZWNvbmQgaW4gc2Vjb25kLCBwYWRkZWQgKDAwMC05OTkpDQotICogICAqIGAnYSdgOiBBTS9QTSBtYXJrZXINCi0gKiAgICogYCdaJ2A6IDQgZGlnaXQgKCtzaWduKSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGltZXpvbmUgb2Zmc2V0ICgtMTIwMC0rMTIwMCkNCi0gKiAgICogYCd3dydgOiBXZWVrIG9mIHllYXIsIHBhZGRlZCAoMDAtNTMpLiBXZWVrIDAxIGlzIHRoZSB3ZWVrIHdpdGggdGhlIGZpcnN0IFRodXJzZGF5IG9mIHRoZSB5ZWFyDQotICogICAqIGAndydgOiBXZWVrIG9mIHllYXIgKDAtNTMpLiBXZWVrIDEgaXMgdGhlIHdlZWsgd2l0aCB0aGUgZmlyc3QgVGh1cnNkYXkgb2YgdGhlIHllYXINCi0gKg0KLSAqICAgYGZvcm1hdGAgc3RyaW5nIGNhbiBhbHNvIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHByZWRlZmluZWQNCi0gKiAgIHtAbGluayBndWlkZS9pMThuIGxvY2FsaXphYmxlIGZvcm1hdHN9Og0KLSAqDQotICogICAqIGAnbWVkaXVtJ2A6IGVxdWl2YWxlbnQgdG8gYCdNTU0gZCwgeSBoOm1tOnNzIGEnYCBmb3IgZW5fVVMgbG9jYWxlDQotICogICAgIChlLmcuIFNlcCAzLCAyMDEwIDEyOjA1OjA4IFBNKQ0KLSAqICAgKiBgJ3Nob3J0J2A6IGVxdWl2YWxlbnQgdG8gYCdNL2QveXkgaDptbSBhJ2AgZm9yIGVuX1VTICBsb2NhbGUgKGUuZy4gOS8zLzEwIDEyOjA1IFBNKQ0KLSAqICAgKiBgJ2Z1bGxEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdFRUVFLCBNTU1NIGQsIHknYCBmb3IgZW5fVVMgIGxvY2FsZQ0KLSAqICAgICAoZS5nLiBGcmlkYXksIFNlcHRlbWJlciAzLCAyMDEwKQ0KLSAqICAgKiBgJ2xvbmdEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdNTU1NIGQsIHknYCBmb3IgZW5fVVMgIGxvY2FsZSAoZS5nLiBTZXB0ZW1iZXIgMywgMjAxMCkNCi0gKiAgICogYCdtZWRpdW1EYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdNTU0gZCwgeSdgIGZvciBlbl9VUyAgbG9jYWxlIChlLmcuIFNlcCAzLCAyMDEwKQ0KLSAqICAgKiBgJ3Nob3J0RGF0ZSdgOiBlcXVpdmFsZW50IHRvIGAnTS9kL3l5J2AgZm9yIGVuX1VTIGxvY2FsZSAoZS5nLiA5LzMvMTApDQotICogICAqIGAnbWVkaXVtVGltZSdgOiBlcXVpdmFsZW50IHRvIGAnaDptbTpzcyBhJ2AgZm9yIGVuX1VTIGxvY2FsZSAoZS5nLiAxMjowNTowOCBQTSkNCi0gKiAgICogYCdzaG9ydFRpbWUnYDogZXF1aXZhbGVudCB0byBgJ2g6bW0gYSdgIGZvciBlbl9VUyBsb2NhbGUgKGUuZy4gMTI6MDUgUE0pDQotICoNCi0gKiAgIGBmb3JtYXRgIHN0cmluZyBjYW4gY29udGFpbiBsaXRlcmFsIHZhbHVlcy4gVGhlc2UgbmVlZCB0byBiZSBlc2NhcGVkIGJ5IHN1cnJvdW5kaW5nIHdpdGggc2luZ2xlIHF1b3RlcyAoZS5nLg0KLSAqICAgYCJoICdpbiB0aGUgbW9ybmluZyciYCkuIEluIG9yZGVyIHRvIG91dHB1dCBhIHNpbmdsZSBxdW90ZSwgZXNjYXBlIGl0IC0gaS5lLiwgdHdvIHNpbmdsZSBxdW90ZXMgaW4gYSBzZXF1ZW5jZQ0KLSAqICAgKGUuZy4gYCJoICdvJydjbG9jayciYCkuDQotICoNCi0gKiBAcGFyYW0geyhEYXRlfG51bWJlcnxzdHJpbmcpfSBkYXRlIERhdGUgdG8gZm9ybWF0IGVpdGhlciBhcyBEYXRlIG9iamVjdCwgbWlsbGlzZWNvbmRzIChzdHJpbmcgb3INCi0gKiAgICBudW1iZXIpIG9yIHZhcmlvdXMgSVNPIDg2MDEgZGF0ZXRpbWUgc3RyaW5nIGZvcm1hdHMgKGUuZy4geXl5eS1NTS1kZFRISDptbTpzcy5zc3NaIGFuZCBpdHMNCi0gKiAgICBzaG9ydGVyIHZlcnNpb25zIGxpa2UgeXl5eS1NTS1kZFRISDptbVosIHl5eXktTU0tZGQgb3IgeXl5eU1NZGRUSEhtbXNzWikuIElmIG5vIHRpbWV6b25lIGlzDQotICogICAgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaW5wdXQsIHRoZSB0aW1lIGlzIGNvbnNpZGVyZWQgdG8gYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLg0KLSAqIEBwYXJhbSB7c3RyaW5nPX0gZm9ybWF0IEZvcm1hdHRpbmcgcnVsZXMgKHNlZSBEZXNjcmlwdGlvbikuIElmIG5vdCBzcGVjaWZpZWQsDQotICogICAgYG1lZGl1bURhdGVgIGlzIHVzZWQuDQotICogQHBhcmFtIHtzdHJpbmc9fSB0aW1lem9uZSBUaW1lem9uZSB0byBiZSB1c2VkIGZvciBmb3JtYXR0aW5nLiBSaWdodCBub3csIG9ubHkgYCdVVEMnYCBpcyBzdXBwb3J0ZWQuDQotICogICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyIHdpbGwgYmUgdXNlZC4NCi0gKiBAcmV0dXJucyB7c3RyaW5nfSBGb3JtYXR0ZWQgc3RyaW5nIG9yIHRoZSBpbnB1dCBpZiBpbnB1dCBpcyBub3QgcmVjb2duaXplZCBhcyBkYXRlL21pbGxpcy4NCi0gKg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGU+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgPHNwYW4gbmctbm9uLWJpbmRhYmxlPnt7MTI4ODMyMzYyMzAwNiB8IGRhdGU6J21lZGl1bSd9fTwvc3Bhbj46DQotICAgICAgICAgICA8c3Bhbj57ezEyODgzMjM2MjMwMDYgfCBkYXRlOidtZWRpdW0nfX08L3NwYW4+PGJyPg0KLSAgICAgICA8c3BhbiBuZy1ub24tYmluZGFibGU+e3sxMjg4MzIzNjIzMDA2IHwgZGF0ZToneXl5eS1NTS1kZCBISDptbTpzcyBaJ319PC9zcGFuPjoNCi0gICAgICAgICAgPHNwYW4+e3sxMjg4MzIzNjIzMDA2IHwgZGF0ZToneXl5eS1NTS1kZCBISDptbTpzcyBaJ319PC9zcGFuPjxicj4NCi0gICAgICAgPHNwYW4gbmctbm9uLWJpbmRhYmxlPnt7MTI4ODMyMzYyMzAwNiB8IGRhdGU6J01NL2RkL3l5eXkgQCBoOm1tYSd9fTwvc3Bhbj46DQotICAgICAgICAgIDxzcGFuPnt7JzEyODgzMjM2MjMwMDYnIHwgZGF0ZTonTU0vZGQveXl5eSBAIGg6bW1hJ319PC9zcGFuPjxicj4NCi0gICAgICAgPHNwYW4gbmctbm9uLWJpbmRhYmxlPnt7MTI4ODMyMzYyMzAwNiB8IGRhdGU6Ik1NL2RkL3l5eXkgJ2F0JyBoOm1tYSJ9fTwvc3Bhbj46DQotICAgICAgICAgIDxzcGFuPnt7JzEyODgzMjM2MjMwMDYnIHwgZGF0ZToiTU0vZGQveXl5eSAnYXQnIGg6bW1hIn19PC9zcGFuPjxicj4NCi0gICAgIDwvZmlsZT4NCi0gICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICBpdCgnc2hvdWxkIGZvcm1hdCBkYXRlJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygiMTI4ODMyMzYyMzAwNiB8IGRhdGU6J21lZGl1bSciKSkuZ2V0VGV4dCgpKS4NCi0gICAgICAgICAgICB0b01hdGNoKC9PY3QgMlxkLCAyMDEwIFxkezEsMn06XGR7Mn06XGR7Mn0gKEFNfFBNKS8pOw0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoIjEyODgzMjM2MjMwMDYgfCBkYXRlOid5eXl5LU1NLWRkIEhIOm1tOnNzIFonIikpLmdldFRleHQoKSkuDQotICAgICAgICAgICAgdG9NYXRjaCgvMjAxMFwtMTBcLTJcZCBcZHsyfTpcZHsyfTpcZHsyfSAoXC18XCspP1xkezR9Lyk7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygiJzEyODgzMjM2MjMwMDYnIHwgZGF0ZTonTU0vZGQveXl5eSBAIGg6bW1hJyIpKS5nZXRUZXh0KCkpLg0KLSAgICAgICAgICAgIHRvTWF0Y2goLzEwXC8yXGRcLzIwMTAgQCBcZHsxLDJ9OlxkezJ9KEFNfFBNKS8pOw0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoIicxMjg4MzIzNjIzMDA2JyB8IGRhdGU6XCJNTS9kZC95eXl5ICdhdCcgaDptbWFcIiIpKS5nZXRUZXh0KCkpLg0KLSAgICAgICAgICAgIHRvTWF0Y2goLzEwXC8yXGRcLzIwMTAgYXQgXGR7MSwyfTpcZHsyfShBTXxQTSkvKTsNCi0gICAgICAgfSk7DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLWRhdGVGaWx0ZXIuJGluamVjdCA9IFsnJGxvY2FsZSddOw0KLWZ1bmN0aW9uIGRhdGVGaWx0ZXIoJGxvY2FsZSkgew0KLQ0KLQ0KLSAgdmFyIFJfSVNPODYwMV9TVFIgPSAvXihcZHs0fSktPyhcZFxkKS0/KFxkXGQpKD86VChcZFxkKSg/Ojo/KFxkXGQpKD86Oj8oXGRcZCkoPzpcLihcZCspKT8pPyk/KFp8KFsrLV0pKFxkXGQpOj8oXGRcZCkpPyk/JC87DQotICAgICAgICAgICAgICAgICAgICAgLy8gMSAgICAgICAgMiAgICAgICAzICAgICAgICAgNCAgICAgICAgICA1ICAgICAgICAgIDYgICAgICAgICAgNyAgICAgICAgICA4ICA5ICAgICAxMCAgICAgIDExDQotICBmdW5jdGlvbiBqc29uU3RyaW5nVG9EYXRlKHN0cmluZykgew0KLSAgICB2YXIgbWF0Y2g7DQotICAgIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChSX0lTTzg2MDFfU1RSKSkgew0KLSAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoMCksDQotICAgICAgICAgIHR6SG91ciA9IDAsDQotICAgICAgICAgIHR6TWluICA9IDAsDQotICAgICAgICAgIGRhdGVTZXR0ZXIgPSBtYXRjaFs4XSA/IGRhdGUuc2V0VVRDRnVsbFllYXIgOiBkYXRlLnNldEZ1bGxZZWFyLA0KLSAgICAgICAgICB0aW1lU2V0dGVyID0gbWF0Y2hbOF0gPyBkYXRlLnNldFVUQ0hvdXJzIDogZGF0ZS5zZXRIb3VyczsNCi0NCi0gICAgICBpZiAobWF0Y2hbOV0pIHsNCi0gICAgICAgIHR6SG91ciA9IGludChtYXRjaFs5XSArIG1hdGNoWzEwXSk7DQotICAgICAgICB0ek1pbiA9IGludChtYXRjaFs5XSArIG1hdGNoWzExXSk7DQotICAgICAgfQ0KLSAgICAgIGRhdGVTZXR0ZXIuY2FsbChkYXRlLCBpbnQobWF0Y2hbMV0pLCBpbnQobWF0Y2hbMl0pIC0gMSwgaW50KG1hdGNoWzNdKSk7DQotICAgICAgdmFyIGggPSBpbnQobWF0Y2hbNF0gfHwgMCkgLSB0ekhvdXI7DQotICAgICAgdmFyIG0gPSBpbnQobWF0Y2hbNV0gfHwgMCkgLSB0ek1pbjsNCi0gICAgICB2YXIgcyA9IGludChtYXRjaFs2XSB8fCAwKTsNCi0gICAgICB2YXIgbXMgPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoJzAuJyArIChtYXRjaFs3XSB8fCAwKSkgKiAxMDAwKTsNCi0gICAgICB0aW1lU2V0dGVyLmNhbGwoZGF0ZSwgaCwgbSwgcywgbXMpOw0KLSAgICAgIHJldHVybiBkYXRlOw0KLSAgICB9DQotICAgIHJldHVybiBzdHJpbmc7DQotICB9DQotDQotDQotICByZXR1cm4gZnVuY3Rpb24oZGF0ZSwgZm9ybWF0LCB0aW1lem9uZSkgew0KLSAgICB2YXIgdGV4dCA9ICcnLA0KLSAgICAgICAgcGFydHMgPSBbXSwNCi0gICAgICAgIGZuLCBtYXRjaDsNCi0NCi0gICAgZm9ybWF0ID0gZm9ybWF0IHx8ICdtZWRpdW1EYXRlJzsNCi0gICAgZm9ybWF0ID0gJGxvY2FsZS5EQVRFVElNRV9GT1JNQVRTW2Zvcm1hdF0gfHwgZm9ybWF0Ow0KLSAgICBpZiAoaXNTdHJpbmcoZGF0ZSkpIHsNCi0gICAgICBkYXRlID0gTlVNQkVSX1NUUklORy50ZXN0KGRhdGUpID8gaW50KGRhdGUpIDoganNvblN0cmluZ1RvRGF0ZShkYXRlKTsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoaXNOdW1iZXIoZGF0ZSkpIHsNCi0gICAgICBkYXRlID0gbmV3IERhdGUoZGF0ZSk7DQotICAgIH0NCi0NCi0gICAgaWYgKCFpc0RhdGUoZGF0ZSkpIHsNCi0gICAgICByZXR1cm4gZGF0ZTsNCi0gICAgfQ0KLQ0KLSAgICB3aGlsZSAoZm9ybWF0KSB7DQotICAgICAgbWF0Y2ggPSBEQVRFX0ZPUk1BVFNfU1BMSVQuZXhlYyhmb3JtYXQpOw0KLSAgICAgIGlmIChtYXRjaCkgew0KLSAgICAgICAgcGFydHMgPSBjb25jYXQocGFydHMsIG1hdGNoLCAxKTsNCi0gICAgICAgIGZvcm1hdCA9IHBhcnRzLnBvcCgpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBwYXJ0cy5wdXNoKGZvcm1hdCk7DQotICAgICAgICBmb3JtYXQgPSBudWxsOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZiAodGltZXpvbmUgJiYgdGltZXpvbmUgPT09ICdVVEMnKSB7DQotICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTsNCi0gICAgICBkYXRlLnNldE1pbnV0ZXMoZGF0ZS5nZXRNaW51dGVzKCkgKyBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkpOw0KLSAgICB9DQotICAgIGZvckVhY2gocGFydHMsIGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgZm4gPSBEQVRFX0ZPUk1BVFNbdmFsdWVdOw0KLSAgICAgIHRleHQgKz0gZm4gPyBmbihkYXRlLCAkbG9jYWxlLkRBVEVUSU1FX0ZPUk1BVFMpDQotICAgICAgICAgICAgICAgICA6IHZhbHVlLnJlcGxhY2UoLyheJ3wnJCkvZywgJycpLnJlcGxhY2UoLycnL2csICInIik7DQotICAgIH0pOw0KLQ0KLSAgICByZXR1cm4gdGV4dDsNCi0gIH07DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBmaWx0ZXINCi0gKiBAbmFtZSBqc29uDQotICogQGtpbmQgZnVuY3Rpb24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqICAgQWxsb3dzIHlvdSB0byBjb252ZXJ0IGEgSmF2YVNjcmlwdCBvYmplY3QgaW50byBKU09OIHN0cmluZy4NCi0gKg0KLSAqICAgVGhpcyBmaWx0ZXIgaXMgbW9zdGx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nLiBXaGVuIHVzaW5nIHRoZSBkb3VibGUgY3VybHkge3t2YWx1ZX19IG5vdGF0aW9uDQotICogICB0aGUgYmluZGluZyBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBKU09OLg0KLSAqDQotICogQHBhcmFtIHsqfSBvYmplY3QgQW55IEphdmFTY3JpcHQgb2JqZWN0IChpbmNsdWRpbmcgYXJyYXlzIGFuZCBwcmltaXRpdmUgdHlwZXMpIHRvIGZpbHRlci4NCi0gKiBAcGFyYW0ge251bWJlcj19IHNwYWNpbmcgVGhlIG51bWJlciBvZiBzcGFjZXMgdG8gdXNlIHBlciBpbmRlbnRhdGlvbiwgZGVmYXVsdHMgdG8gMi4NCi0gKiBAcmV0dXJucyB7c3RyaW5nfSBKU09OIHN0cmluZy4NCi0gKg0KLSAqDQotICogQGV4YW1wbGUNCi0gICA8ZXhhbXBsZT4NCi0gICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICA8cHJlIGlkPSJkZWZhdWx0LXNwYWNpbmciPnt7IHsnbmFtZSc6J3ZhbHVlJ30gfCBqc29uIH19PC9wcmU+DQotICAgICAgIDxwcmUgaWQ9ImN1c3RvbS1zcGFjaW5nIj57eyB7J25hbWUnOid2YWx1ZSd9IHwganNvbjo0IH19PC9wcmU+DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgaXQoJ3Nob3VsZCBqc29uaWZ5IGZpbHRlcmVkIG9iamVjdHMnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZGVmYXVsdC1zcGFjaW5nJykpLmdldFRleHQoKSkudG9NYXRjaCgvXHtcbiAgIm5hbWUiOiA/InZhbHVlIlxufS8pOw0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjdXN0b20tc3BhY2luZycpKS5nZXRUZXh0KCkpLnRvTWF0Y2goL1x7XG4gICAgIm5hbWUiOiA/InZhbHVlIlxufS8pOw0KLSAgICAgICB9KTsNCi0gICAgIDwvZmlsZT4NCi0gICA8L2V4YW1wbGU+DQotICoNCi0gKi8NCi1mdW5jdGlvbiBqc29uRmlsdGVyKCkgew0KLSAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgc3BhY2luZykgew0KLSAgICBpZiAoaXNVbmRlZmluZWQoc3BhY2luZykpIHsNCi0gICAgICAgIHNwYWNpbmcgPSAyOw0KLSAgICB9DQotICAgIHJldHVybiB0b0pzb24ob2JqZWN0LCBzcGFjaW5nKTsNCi0gIH07DQotfQ0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBmaWx0ZXINCi0gKiBAbmFtZSBsb3dlcmNhc2UNCi0gKiBAa2luZCBmdW5jdGlvbg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIENvbnZlcnRzIHN0cmluZyB0byBsb3dlcmNhc2UuDQotICogQHNlZSBhbmd1bGFyLmxvd2VyY2FzZQ0KLSAqLw0KLXZhciBsb3dlcmNhc2VGaWx0ZXIgPSB2YWx1ZUZuKGxvd2VyY2FzZSk7DQotDQotDQotLyoqDQotICogQG5nZG9jIGZpbHRlcg0KLSAqIEBuYW1lIHVwcGVyY2FzZQ0KLSAqIEBraW5kIGZ1bmN0aW9uDQotICogQGRlc2NyaXB0aW9uDQotICogQ29udmVydHMgc3RyaW5nIHRvIHVwcGVyY2FzZS4NCi0gKiBAc2VlIGFuZ3VsYXIudXBwZXJjYXNlDQotICovDQotdmFyIHVwcGVyY2FzZUZpbHRlciA9IHZhbHVlRm4odXBwZXJjYXNlKTsNCi0NCi0vKioNCi0gKiBAbmdkb2MgZmlsdGVyDQotICogQG5hbWUgbGltaXRUbw0KLSAqIEBraW5kIGZ1bmN0aW9uDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBDcmVhdGVzIGEgbmV3IGFycmF5IG9yIHN0cmluZyBjb250YWluaW5nIG9ubHkgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLiBUaGUgZWxlbWVudHMNCi0gKiBhcmUgdGFrZW4gZnJvbSBlaXRoZXIgdGhlIGJlZ2lubmluZyBvciB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgYXJyYXksIHN0cmluZyBvciBudW1iZXIsIGFzIHNwZWNpZmllZCBieQ0KLSAqIHRoZSB2YWx1ZSBhbmQgc2lnbiAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIG9mIGBsaW1pdGAuIElmIGEgbnVtYmVyIGlzIHVzZWQgYXMgaW5wdXQsIGl0IGlzDQotICogY29udmVydGVkIHRvIGEgc3RyaW5nLg0KLSAqDQotICogQHBhcmFtIHtBcnJheXxzdHJpbmd8bnVtYmVyfSBpbnB1dCBTb3VyY2UgYXJyYXksIHN0cmluZyBvciBudW1iZXIgdG8gYmUgbGltaXRlZC4NCi0gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxpbWl0IFRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkIGFycmF5IG9yIHN0cmluZy4gSWYgdGhlIGBsaW1pdGAgbnVtYmVyDQotICogICAgIGlzIHBvc2l0aXZlLCBgbGltaXRgIG51bWJlciBvZiBpdGVtcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNvdXJjZSBhcnJheS9zdHJpbmcgYXJlIGNvcGllZC4NCi0gKiAgICAgSWYgdGhlIG51bWJlciBpcyBuZWdhdGl2ZSwgYGxpbWl0YCBudW1iZXIgIG9mIGl0ZW1zIGZyb20gdGhlIGVuZCBvZiB0aGUgc291cmNlIGFycmF5L3N0cmluZw0KLSAqICAgICBhcmUgY29waWVkLiBUaGUgYGxpbWl0YCB3aWxsIGJlIHRyaW1tZWQgaWYgaXQgZXhjZWVkcyBgYXJyYXkubGVuZ3RoYA0KLSAqIEByZXR1cm5zIHtBcnJheXxzdHJpbmd9IEEgbmV3IHN1Yi1hcnJheSBvciBzdWJzdHJpbmcgb2YgbGVuZ3RoIGBsaW1pdGAgb3IgbGVzcyBpZiBpbnB1dCBhcnJheQ0KLSAqICAgICBoYWQgbGVzcyB0aGFuIGBsaW1pdGAgZWxlbWVudHMuDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgIDxleGFtcGxlIG1vZHVsZT0ibGltaXRUb0V4YW1wbGUiPg0KLSAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgIDxzY3JpcHQ+DQotICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2xpbWl0VG9FeGFtcGxlJywgW10pDQotICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAgICAkc2NvcGUubnVtYmVycyA9IFsxLDIsMyw0LDUsNiw3LDgsOV07DQotICAgICAgICAgICAgICRzY29wZS5sZXR0ZXJzID0gImFiY2RlZmdoaSI7DQotICAgICAgICAgICAgICRzY29wZS5sb25nTnVtYmVyID0gMjM0NTQzMjM0MjsNCi0gICAgICAgICAgICAgJHNjb3BlLm51bUxpbWl0ID0gMzsNCi0gICAgICAgICAgICAgJHNjb3BlLmxldHRlckxpbWl0ID0gMzsNCi0gICAgICAgICAgICAgJHNjb3BlLmxvbmdOdW1iZXJMaW1pdCA9IDM7DQotICAgICAgICAgICB9XSk7DQotICAgICAgIDwvc2NyaXB0Pg0KLSAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgICAgICBMaW1pdCB7e251bWJlcnN9fSB0bzogPGlucHV0IHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbmctbW9kZWw9Im51bUxpbWl0Ij4NCi0gICAgICAgICA8cD5PdXRwdXQgbnVtYmVyczoge3sgbnVtYmVycyB8IGxpbWl0VG86bnVtTGltaXQgfX08L3A+DQotICAgICAgICAgTGltaXQge3tsZXR0ZXJzfX0gdG86IDxpbnB1dCB0eXBlPSJudW1iZXIiIHN0ZXA9IjEiIG5nLW1vZGVsPSJsZXR0ZXJMaW1pdCI+DQotICAgICAgICAgPHA+T3V0cHV0IGxldHRlcnM6IHt7IGxldHRlcnMgfCBsaW1pdFRvOmxldHRlckxpbWl0IH19PC9wPg0KLSAgICAgICAgIExpbWl0IHt7bG9uZ051bWJlcn19IHRvOiA8aW5wdXQgdHlwZT0ibnVtYmVyIiBzdGVwPSIxIiBuZy1tb2RlbD0ibG9uZ051bWJlckxpbWl0Ij4NCi0gICAgICAgICA8cD5PdXRwdXQgbG9uZyBudW1iZXI6IHt7IGxvbmdOdW1iZXIgfCBsaW1pdFRvOmxvbmdOdW1iZXJMaW1pdCB9fTwvcD4NCi0gICAgICAgPC9kaXY+DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgdmFyIG51bUxpbWl0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdudW1MaW1pdCcpKTsNCi0gICAgICAgdmFyIGxldHRlckxpbWl0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdsZXR0ZXJMaW1pdCcpKTsNCi0gICAgICAgdmFyIGxvbmdOdW1iZXJMaW1pdElucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbG9uZ051bWJlckxpbWl0JykpOw0KLSAgICAgICB2YXIgbGltaXRlZE51bWJlcnMgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ251bWJlcnMgfCBsaW1pdFRvOm51bUxpbWl0JykpOw0KLSAgICAgICB2YXIgbGltaXRlZExldHRlcnMgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2xldHRlcnMgfCBsaW1pdFRvOmxldHRlckxpbWl0JykpOw0KLSAgICAgICB2YXIgbGltaXRlZExvbmdOdW1iZXIgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2xvbmdOdW1iZXIgfCBsaW1pdFRvOmxvbmdOdW1iZXJMaW1pdCcpKTsNCi0NCi0gICAgICAgaXQoJ3Nob3VsZCBsaW1pdCB0aGUgbnVtYmVyIGFycmF5IHRvIGZpcnN0IHRocmVlIGl0ZW1zJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgZXhwZWN0KG51bUxpbWl0SW5wdXQuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0JlKCczJyk7DQotICAgICAgICAgZXhwZWN0KGxldHRlckxpbWl0SW5wdXQuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0JlKCczJyk7DQotICAgICAgICAgZXhwZWN0KGxvbmdOdW1iZXJMaW1pdElucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9CZSgnMycpOw0KLSAgICAgICAgIGV4cGVjdChsaW1pdGVkTnVtYmVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBudW1iZXJzOiBbMSwyLDNdJyk7DQotICAgICAgICAgZXhwZWN0KGxpbWl0ZWRMZXR0ZXJzLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IGxldHRlcnM6IGFiYycpOw0KLSAgICAgICAgIGV4cGVjdChsaW1pdGVkTG9uZ051bWJlci5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsb25nIG51bWJlcjogMjM0Jyk7DQotICAgICAgIH0pOw0KLQ0KLSAgICAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBzYWZhcmkgYW5kIHByb3RyYWN0b3IgdGhhdCBkb2Vzbid0IGxpa2UgdGhlIG1pbnVzIGtleQ0KLSAgICAgICAvLyBpdCgnc2hvdWxkIHVwZGF0ZSB0aGUgb3V0cHV0IHdoZW4gLTMgaXMgZW50ZXJlZCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAvLyAgIG51bUxpbWl0SW5wdXQuY2xlYXIoKTsNCi0gICAgICAgLy8gICBudW1MaW1pdElucHV0LnNlbmRLZXlzKCctMycpOw0KLSAgICAgICAvLyAgIGxldHRlckxpbWl0SW5wdXQuY2xlYXIoKTsNCi0gICAgICAgLy8gICBsZXR0ZXJMaW1pdElucHV0LnNlbmRLZXlzKCctMycpOw0KLSAgICAgICAvLyAgIGxvbmdOdW1iZXJMaW1pdElucHV0LmNsZWFyKCk7DQotICAgICAgIC8vICAgbG9uZ051bWJlckxpbWl0SW5wdXQuc2VuZEtleXMoJy0zJyk7DQotICAgICAgIC8vICAgZXhwZWN0KGxpbWl0ZWROdW1iZXJzLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IG51bWJlcnM6IFs3LDgsOV0nKTsNCi0gICAgICAgLy8gICBleHBlY3QobGltaXRlZExldHRlcnMuZ2V0VGV4dCgpKS50b0VxdWFsKCdPdXRwdXQgbGV0dGVyczogZ2hpJyk7DQotICAgICAgIC8vICAgZXhwZWN0KGxpbWl0ZWRMb25nTnVtYmVyLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IGxvbmcgbnVtYmVyOiAzNDInKTsNCi0gICAgICAgLy8gfSk7DQotDQotICAgICAgIGl0KCdzaG91bGQgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBzaXplIG9mIGlucHV0IGFycmF5JywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgbnVtTGltaXRJbnB1dC5jbGVhcigpOw0KLSAgICAgICAgIG51bUxpbWl0SW5wdXQuc2VuZEtleXMoJzEwMCcpOw0KLSAgICAgICAgIGxldHRlckxpbWl0SW5wdXQuY2xlYXIoKTsNCi0gICAgICAgICBsZXR0ZXJMaW1pdElucHV0LnNlbmRLZXlzKCcxMDAnKTsNCi0gICAgICAgICBsb25nTnVtYmVyTGltaXRJbnB1dC5jbGVhcigpOw0KLSAgICAgICAgIGxvbmdOdW1iZXJMaW1pdElucHV0LnNlbmRLZXlzKCcxMDAnKTsNCi0gICAgICAgICBleHBlY3QobGltaXRlZE51bWJlcnMuZ2V0VGV4dCgpKS50b0VxdWFsKCdPdXRwdXQgbnVtYmVyczogWzEsMiwzLDQsNSw2LDcsOCw5XScpOw0KLSAgICAgICAgIGV4cGVjdChsaW1pdGVkTGV0dGVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsZXR0ZXJzOiBhYmNkZWZnaGknKTsNCi0gICAgICAgICBleHBlY3QobGltaXRlZExvbmdOdW1iZXIuZ2V0VGV4dCgpKS50b0VxdWFsKCdPdXRwdXQgbG9uZyBudW1iZXI6IDIzNDU0MzIzNDInKTsNCi0gICAgICAgfSk7DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSovDQotZnVuY3Rpb24gbGltaXRUb0ZpbHRlcigpIHsNCi0gIHJldHVybiBmdW5jdGlvbihpbnB1dCwgbGltaXQpIHsNCi0gICAgaWYgKGlzTnVtYmVyKGlucHV0KSkgaW5wdXQgPSBpbnB1dC50b1N0cmluZygpOw0KLSAgICBpZiAoIWlzQXJyYXkoaW5wdXQpICYmICFpc1N0cmluZyhpbnB1dCkpIHJldHVybiBpbnB1dDsNCi0NCi0gICAgaWYgKE1hdGguYWJzKE51bWJlcihsaW1pdCkpID09PSBJbmZpbml0eSkgew0KLSAgICAgIGxpbWl0ID0gTnVtYmVyKGxpbWl0KTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBsaW1pdCA9IGludChsaW1pdCk7DQotICAgIH0NCi0NCi0gICAgaWYgKGlzU3RyaW5nKGlucHV0KSkgew0KLSAgICAgIC8vTmFOIGNoZWNrIG9uIGxpbWl0DQotICAgICAgaWYgKGxpbWl0KSB7DQotICAgICAgICByZXR1cm4gbGltaXQgPj0gMCA/IGlucHV0LnNsaWNlKDAsIGxpbWl0KSA6IGlucHV0LnNsaWNlKGxpbWl0LCBpbnB1dC5sZW5ndGgpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gIiI7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIHZhciBpLCBuOw0KLQ0KLSAgICAvLyBpZiBhYnMobGltaXQpIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGgsIHRyaW0gaXQNCi0gICAgaWYgKGxpbWl0ID4gaW5wdXQubGVuZ3RoKQ0KLSAgICAgIGxpbWl0ID0gaW5wdXQubGVuZ3RoOw0KLSAgICBlbHNlIGlmIChsaW1pdCA8IC1pbnB1dC5sZW5ndGgpDQotICAgICAgbGltaXQgPSAtaW5wdXQubGVuZ3RoOw0KLQ0KLSAgICBpZiAobGltaXQgPiAwKSB7DQotICAgICAgaSA9IDA7DQotICAgICAgbiA9IGxpbWl0Ow0KLSAgICB9IGVsc2Ugew0KLSAgICAgIC8vIHplcm8gYW5kIE5hTiBjaGVjayBvbiBsaW1pdCAtIHJldHVybiBlbXB0eSBhcnJheQ0KLSAgICAgIGlmICghbGltaXQpIHJldHVybiBbXTsNCi0NCi0gICAgICBpID0gaW5wdXQubGVuZ3RoICsgbGltaXQ7DQotICAgICAgbiA9IGlucHV0Lmxlbmd0aDsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gaW5wdXQuc2xpY2UoaSwgbik7DQotICB9Ow0KLX0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZmlsdGVyDQotICogQG5hbWUgb3JkZXJCeQ0KLSAqIEBraW5kIGZ1bmN0aW9uDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBPcmRlcnMgYSBzcGVjaWZpZWQgYGFycmF5YCBieSB0aGUgYGV4cHJlc3Npb25gIHByZWRpY2F0ZS4gSXQgaXMgb3JkZXJlZCBhbHBoYWJldGljYWxseQ0KLSAqIGZvciBzdHJpbmdzIGFuZCBudW1lcmljYWxseSBmb3IgbnVtYmVycy4gTm90ZTogaWYgeW91IG5vdGljZSBudW1iZXJzIGFyZSBub3QgYmVpbmcgc29ydGVkDQotICogY29ycmVjdGx5LCBtYWtlIHN1cmUgdGhleSBhcmUgYWN0dWFsbHkgYmVpbmcgc2F2ZWQgYXMgbnVtYmVycyBhbmQgbm90IHN0cmluZ3MuDQotICoNCi0gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc29ydC4NCi0gKiBAcGFyYW0ge2Z1bmN0aW9uKCopfHN0cmluZ3xBcnJheS48KGZ1bmN0aW9uKCopfHN0cmluZyk+PX0gZXhwcmVzc2lvbiBBIHByZWRpY2F0ZSB0byBiZQ0KLSAqICAgIHVzZWQgYnkgdGhlIGNvbXBhcmF0b3IgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBvZiBlbGVtZW50cy4NCi0gKg0KLSAqICAgIENhbiBiZSBvbmUgb2Y6DQotICoNCi0gKiAgICAtIGBmdW5jdGlvbmA6IEdldHRlciBmdW5jdGlvbi4gVGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgc29ydGVkIHVzaW5nIHRoZQ0KLSAqICAgICAgYDxgLCBgPWAsIGA+YCBvcGVyYXRvci4NCi0gKiAgICAtIGBzdHJpbmdgOiBBbiBBbmd1bGFyIGV4cHJlc3Npb24uIFRoZSByZXN1bHQgb2YgdGhpcyBleHByZXNzaW9uIGlzIHVzZWQgdG8gY29tcGFyZSBlbGVtZW50cw0KLSAqICAgICAgKGZvciBleGFtcGxlIGBuYW1lYCB0byBzb3J0IGJ5IGEgcHJvcGVydHkgY2FsbGVkIGBuYW1lYCBvciBgbmFtZS5zdWJzdHIoMCwgMylgIHRvIHNvcnQgYnkNCi0gKiAgICAgIDMgZmlyc3QgY2hhcmFjdGVycyBvZiBhIHByb3BlcnR5IGNhbGxlZCBgbmFtZWApLiBUaGUgcmVzdWx0IG9mIGEgY29uc3RhbnQgZXhwcmVzc2lvbg0KLSAqICAgICAgaXMgaW50ZXJwcmV0ZWQgYXMgYSBwcm9wZXJ0eSBuYW1lIHRvIGJlIHVzZWQgaW4gY29tcGFyaXNvbnMgKGZvciBleGFtcGxlIGAic3BlY2lhbCBuYW1lImANCi0gKiAgICAgIHRvIHNvcnQgb2JqZWN0IGJ5IHRoZSB2YWx1ZSBvZiB0aGVpciBgc3BlY2lhbCBuYW1lYCBwcm9wZXJ0eSkuIEFuIGV4cHJlc3Npb24gY2FuIGJlDQotICogICAgICBvcHRpb25hbGx5IHByZWZpeGVkIHdpdGggYCtgIG9yIGAtYCB0byBjb250cm9sIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIHNvcnQgb3JkZXINCi0gKiAgICAgIChmb3IgZXhhbXBsZSwgYCtuYW1lYCBvciBgLW5hbWVgKS4gSWYgbm8gcHJvcGVydHkgaXMgcHJvdmlkZWQsIChlLmcuIGAnKydgKSB0aGVuIHRoZSBhcnJheQ0KLSAqICAgICAgZWxlbWVudCBpdHNlbGYgaXMgdXNlZCB0byBjb21wYXJlIHdoZXJlIHNvcnRpbmcuDQotICogICAgLSBgQXJyYXlgOiBBbiBhcnJheSBvZiBmdW5jdGlvbiBvciBzdHJpbmcgcHJlZGljYXRlcy4gVGhlIGZpcnN0IHByZWRpY2F0ZSBpbiB0aGUgYXJyYXkNCi0gKiAgICAgIGlzIHVzZWQgZm9yIHNvcnRpbmcsIGJ1dCB3aGVuIHR3byBpdGVtcyBhcmUgZXF1aXZhbGVudCwgdGhlIG5leHQgcHJlZGljYXRlIGlzIHVzZWQuDQotICoNCi0gKiAgICBJZiB0aGUgcHJlZGljYXRlIGlzIG1pc3Npbmcgb3IgZW1wdHkgdGhlbiBpdCBkZWZhdWx0cyB0byBgJysnYC4NCi0gKg0KLSAqIEBwYXJhbSB7Ym9vbGVhbj19IHJldmVyc2UgUmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIGFycmF5Lg0KLSAqIEByZXR1cm5zIHtBcnJheX0gU29ydGVkIGNvcHkgb2YgdGhlIHNvdXJjZSBhcnJheS4NCi0gKg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGUgbW9kdWxlPSJvcmRlckJ5RXhhbXBsZSI+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgPHNjcmlwdD4NCi0gICAgICAgICBhbmd1bGFyLm1vZHVsZSgnb3JkZXJCeUV4YW1wbGUnLCBbXSkNCi0gICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgICAgICRzY29wZS5mcmllbmRzID0NCi0gICAgICAgICAgICAgICAgIFt7bmFtZTonSm9obicsIHBob25lOic1NTUtMTIxMicsIGFnZToxMH0sDQotICAgICAgICAgICAgICAgICAge25hbWU6J01hcnknLCBwaG9uZTonNTU1LTk4NzYnLCBhZ2U6MTl9LA0KLSAgICAgICAgICAgICAgICAgIHtuYW1lOidNaWtlJywgcGhvbmU6JzU1NS00MzIxJywgYWdlOjIxfSwNCi0gICAgICAgICAgICAgICAgICB7bmFtZTonQWRhbScsIHBob25lOic1NTUtNTY3OCcsIGFnZTozNX0sDQotICAgICAgICAgICAgICAgICAge25hbWU6J0p1bGllJywgcGhvbmU6JzU1NS04NzY1JywgYWdlOjI5fV07DQotICAgICAgICAgICAgICRzY29wZS5wcmVkaWNhdGUgPSAnLWFnZSc7DQotICAgICAgICAgICB9XSk7DQotICAgICAgIDwvc2NyaXB0Pg0KLSAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgICAgICA8cHJlPlNvcnRpbmcgcHJlZGljYXRlID0ge3twcmVkaWNhdGV9fTsgcmV2ZXJzZSA9IHt7cmV2ZXJzZX19PC9wcmU+DQotICAgICAgICAgPGhyLz4NCi0gICAgICAgICBbIDxhIGhyZWY9IiIgbmctY2xpY2s9InByZWRpY2F0ZT0nJyI+dW5zb3J0ZWQ8L2E+IF0NCi0gICAgICAgICA8dGFibGUgY2xhc3M9ImZyaWVuZCI+DQotICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgIDx0aD48YSBocmVmPSIiIG5nLWNsaWNrPSJwcmVkaWNhdGUgPSAnbmFtZSc7IHJldmVyc2U9ZmFsc2UiPk5hbWU8L2E+DQotICAgICAgICAgICAgICAgICAoPGEgaHJlZj0iIiBuZy1jbGljaz0icHJlZGljYXRlID0gJy1uYW1lJzsgcmV2ZXJzZT1mYWxzZSI+XjwvYT4pPC90aD4NCi0gICAgICAgICAgICAgPHRoPjxhIGhyZWY9IiIgbmctY2xpY2s9InByZWRpY2F0ZSA9ICdwaG9uZSc7IHJldmVyc2U9IXJldmVyc2UiPlBob25lIE51bWJlcjwvYT48L3RoPg0KLSAgICAgICAgICAgICA8dGg+PGEgaHJlZj0iIiBuZy1jbGljaz0icHJlZGljYXRlID0gJ2FnZSc7IHJldmVyc2U9IXJldmVyc2UiPkFnZTwvYT48L3RoPg0KLSAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgIDx0ciBuZy1yZXBlYXQ9ImZyaWVuZCBpbiBmcmllbmRzIHwgb3JkZXJCeTpwcmVkaWNhdGU6cmV2ZXJzZSI+DQotICAgICAgICAgICAgIDx0ZD57e2ZyaWVuZC5uYW1lfX08L3RkPg0KLSAgICAgICAgICAgICA8dGQ+e3tmcmllbmQucGhvbmV9fTwvdGQ+DQotICAgICAgICAgICAgIDx0ZD57e2ZyaWVuZC5hZ2V9fTwvdGQ+DQotICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgIDwvdGFibGU+DQotICAgICAgIDwvZGl2Pg0KLSAgICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gKg0KLSAqIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBjYWxsIHRoZSBvcmRlckJ5IGZpbHRlciBtYW51YWxseSwgYnkgaW5qZWN0aW5nIGAkZmlsdGVyYCwgcmV0cmlldmluZyB0aGUNCi0gKiBmaWx0ZXIgcm91dGluZSB3aXRoIGAkZmlsdGVyKCdvcmRlckJ5JylgLCBhbmQgY2FsbGluZyB0aGUgcmV0dXJuZWQgZmlsdGVyIHJvdXRpbmUgd2l0aCB0aGUNCi0gKiBkZXNpcmVkIHBhcmFtZXRlcnMuDQotICoNCi0gKiBFeGFtcGxlOg0KLSAqDQotICogQGV4YW1wbGUNCi0gIDxleGFtcGxlIG1vZHVsZT0ib3JkZXJCeUV4YW1wbGUiPg0KLSAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgICAgIDx0YWJsZSBjbGFzcz0iZnJpZW5kIj4NCi0gICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0aD48YSBocmVmPSIiIG5nLWNsaWNrPSJyZXZlcnNlPWZhbHNlO29yZGVyKCduYW1lJywgZmFsc2UpIj5OYW1lPC9hPg0KLSAgICAgICAgICAgICAgKDxhIGhyZWY9IiIgbmctY2xpY2s9Im9yZGVyKCctbmFtZScsZmFsc2UpIj5ePC9hPik8L3RoPg0KLSAgICAgICAgICAgIDx0aD48YSBocmVmPSIiIG5nLWNsaWNrPSJyZXZlcnNlPSFyZXZlcnNlO29yZGVyKCdwaG9uZScsIHJldmVyc2UpIj5QaG9uZSBOdW1iZXI8L2E+PC90aD4NCi0gICAgICAgICAgICA8dGg+PGEgaHJlZj0iIiBuZy1jbGljaz0icmV2ZXJzZT0hcmV2ZXJzZTtvcmRlcignYWdlJyxyZXZlcnNlKSI+QWdlPC9hPjwvdGg+DQotICAgICAgICAgIDwvdHI+DQotICAgICAgICAgIDx0ciBuZy1yZXBlYXQ9ImZyaWVuZCBpbiBmcmllbmRzIj4NCi0gICAgICAgICAgICA8dGQ+e3tmcmllbmQubmFtZX19PC90ZD4NCi0gICAgICAgICAgICA8dGQ+e3tmcmllbmQucGhvbmV9fTwvdGQ+DQotICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLmFnZX19PC90ZD4NCi0gICAgICAgICAgPC90cj4NCi0gICAgICAgIDwvdGFibGU+DQotICAgICAgPC9kaXY+DQotICAgIDwvZmlsZT4NCi0NCi0gICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4NCi0gICAgICBhbmd1bGFyLm1vZHVsZSgnb3JkZXJCeUV4YW1wbGUnLCBbXSkNCi0gICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRmaWx0ZXInLCBmdW5jdGlvbigkc2NvcGUsICRmaWx0ZXIpIHsNCi0gICAgICAgICAgdmFyIG9yZGVyQnkgPSAkZmlsdGVyKCdvcmRlckJ5Jyk7DQotICAgICAgICAgICRzY29wZS5mcmllbmRzID0gWw0KLSAgICAgICAgICAgIHsgbmFtZTogJ0pvaG4nLCAgICBwaG9uZTogJzU1NS0xMjEyJywgICAgYWdlOiAxMCB9LA0KLSAgICAgICAgICAgIHsgbmFtZTogJ01hcnknLCAgICBwaG9uZTogJzU1NS05ODc2JywgICAgYWdlOiAxOSB9LA0KLSAgICAgICAgICAgIHsgbmFtZTogJ01pa2UnLCAgICBwaG9uZTogJzU1NS00MzIxJywgICAgYWdlOiAyMSB9LA0KLSAgICAgICAgICAgIHsgbmFtZTogJ0FkYW0nLCAgICBwaG9uZTogJzU1NS01Njc4JywgICAgYWdlOiAzNSB9LA0KLSAgICAgICAgICAgIHsgbmFtZTogJ0p1bGllJywgICBwaG9uZTogJzU1NS04NzY1JywgICAgYWdlOiAyOSB9DQotICAgICAgICAgIF07DQotICAgICAgICAgICRzY29wZS5vcmRlciA9IGZ1bmN0aW9uKHByZWRpY2F0ZSwgcmV2ZXJzZSkgew0KLSAgICAgICAgICAgICRzY29wZS5mcmllbmRzID0gb3JkZXJCeSgkc2NvcGUuZnJpZW5kcywgcHJlZGljYXRlLCByZXZlcnNlKTsNCi0gICAgICAgICAgfTsNCi0gICAgICAgICAgJHNjb3BlLm9yZGVyKCctYWdlJyxmYWxzZSk7DQotICAgICAgICB9XSk7DQotICAgIDwvZmlsZT4NCi08L2V4YW1wbGU+DQotICovDQotb3JkZXJCeUZpbHRlci4kaW5qZWN0ID0gWyckcGFyc2UnXTsNCi1mdW5jdGlvbiBvcmRlckJ5RmlsdGVyKCRwYXJzZSkgew0KLSAgcmV0dXJuIGZ1bmN0aW9uKGFycmF5LCBzb3J0UHJlZGljYXRlLCByZXZlcnNlT3JkZXIpIHsNCi0gICAgaWYgKCEoaXNBcnJheUxpa2UoYXJyYXkpKSkgcmV0dXJuIGFycmF5Ow0KLSAgICBzb3J0UHJlZGljYXRlID0gaXNBcnJheShzb3J0UHJlZGljYXRlKSA/IHNvcnRQcmVkaWNhdGUgOiBbc29ydFByZWRpY2F0ZV07DQotICAgIGlmIChzb3J0UHJlZGljYXRlLmxlbmd0aCA9PT0gMCkgeyBzb3J0UHJlZGljYXRlID0gWycrJ107IH0NCi0gICAgc29ydFByZWRpY2F0ZSA9IHNvcnRQcmVkaWNhdGUubWFwKGZ1bmN0aW9uKHByZWRpY2F0ZSkgew0KLSAgICAgIHZhciBkZXNjZW5kaW5nID0gZmFsc2UsIGdldCA9IHByZWRpY2F0ZSB8fCBpZGVudGl0eTsNCi0gICAgICBpZiAoaXNTdHJpbmcocHJlZGljYXRlKSkgew0KLSAgICAgICAgaWYgKChwcmVkaWNhdGUuY2hhckF0KDApID09ICcrJyB8fCBwcmVkaWNhdGUuY2hhckF0KDApID09ICctJykpIHsNCi0gICAgICAgICAgZGVzY2VuZGluZyA9IHByZWRpY2F0ZS5jaGFyQXQoMCkgPT0gJy0nOw0KLSAgICAgICAgICBwcmVkaWNhdGUgPSBwcmVkaWNhdGUuc3Vic3RyaW5nKDEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHByZWRpY2F0ZSA9PT0gJycpIHsNCi0gICAgICAgICAgLy8gRWZmZWN0aXZlbHkgbm8gcHJlZGljYXRlIHdhcyBwYXNzZWQgc28gd2UgY29tcGFyZSBpZGVudGl0eQ0KLSAgICAgICAgICByZXR1cm4gcmV2ZXJzZUNvbXBhcmF0b3IoY29tcGFyZSwgZGVzY2VuZGluZyk7DQotICAgICAgICB9DQotICAgICAgICBnZXQgPSAkcGFyc2UocHJlZGljYXRlKTsNCi0gICAgICAgIGlmIChnZXQuY29uc3RhbnQpIHsNCi0gICAgICAgICAgdmFyIGtleSA9IGdldCgpOw0KLSAgICAgICAgICByZXR1cm4gcmV2ZXJzZUNvbXBhcmF0b3IoZnVuY3Rpb24oYSwgYikgew0KLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlKGFba2V5XSwgYltrZXldKTsNCi0gICAgICAgICAgfSwgZGVzY2VuZGluZyk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIHJldHVybiByZXZlcnNlQ29tcGFyYXRvcihmdW5jdGlvbihhLCBiKSB7DQotICAgICAgICByZXR1cm4gY29tcGFyZShnZXQoYSksZ2V0KGIpKTsNCi0gICAgICB9LCBkZXNjZW5kaW5nKTsNCi0gICAgfSk7DQotICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5KS5zb3J0KHJldmVyc2VDb21wYXJhdG9yKGNvbXBhcmF0b3IsIHJldmVyc2VPcmRlcikpOw0KLQ0KLSAgICBmdW5jdGlvbiBjb21wYXJhdG9yKG8xLCBvMikgew0KLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc29ydFByZWRpY2F0ZS5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgdmFyIGNvbXAgPSBzb3J0UHJlZGljYXRlW2ldKG8xLCBvMik7DQotICAgICAgICBpZiAoY29tcCAhPT0gMCkgcmV0dXJuIGNvbXA7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiAwOw0KLSAgICB9DQotICAgIGZ1bmN0aW9uIHJldmVyc2VDb21wYXJhdG9yKGNvbXAsIGRlc2NlbmRpbmcpIHsNCi0gICAgICByZXR1cm4gZGVzY2VuZGluZw0KLSAgICAgICAgICA/IGZ1bmN0aW9uKGEsIGIpIHtyZXR1cm4gY29tcChiLGEpO30NCi0gICAgICAgICAgOiBjb21wOw0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7DQotICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsNCi0gICAgICAgIGNhc2UgJ251bWJlcic6IC8qIGZhbGxzIHRocm91Z2ggKi8NCi0gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOiAvKiBmYWxscyB0aHJvdWdoICovDQotICAgICAgICBjYXNlICdzdHJpbmcnOg0KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHsNCi0gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAnbnVsbCc7DQotICAgICAgaWYgKHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09PSAnZnVuY3Rpb24nKSB7DQotICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlT2YoKTsNCi0gICAgICAgIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZTsNCi0gICAgICB9DQotICAgICAgaWYgKHR5cGVvZiB2YWx1ZS50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykgew0KLSAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOw0KLSAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkgcmV0dXJuIHZhbHVlOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gJyc7DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gY29tcGFyZSh2MSwgdjIpIHsNCi0gICAgICB2YXIgdDEgPSB0eXBlb2YgdjE7DQotICAgICAgdmFyIHQyID0gdHlwZW9mIHYyOw0KLSAgICAgIGlmICh0MSA9PT0gdDIgJiYgdDEgPT09ICJvYmplY3QiKSB7DQotICAgICAgICB2MSA9IG9iamVjdFRvU3RyaW5nKHYxKTsNCi0gICAgICAgIHYyID0gb2JqZWN0VG9TdHJpbmcodjIpOw0KLSAgICAgIH0NCi0gICAgICBpZiAodDEgPT09IHQyKSB7DQotICAgICAgICBpZiAodDEgPT09ICJzdHJpbmciKSB7DQotICAgICAgICAgICB2MSA9IHYxLnRvTG93ZXJDYXNlKCk7DQotICAgICAgICAgICB2MiA9IHYyLnRvTG93ZXJDYXNlKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAodjEgPT09IHYyKSByZXR1cm4gMDsNCi0gICAgICAgIHJldHVybiB2MSA8IHYyID8gLTEgOiAxOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gdDEgPCB0MiA/IC0xIDogMTsNCi0gICAgICB9DQotICAgIH0NCi0gIH07DQotfQ0KLQ0KLWZ1bmN0aW9uIG5nRGlyZWN0aXZlKGRpcmVjdGl2ZSkgew0KLSAgaWYgKGlzRnVuY3Rpb24oZGlyZWN0aXZlKSkgew0KLSAgICBkaXJlY3RpdmUgPSB7DQotICAgICAgbGluazogZGlyZWN0aXZlDQotICAgIH07DQotICB9DQotICBkaXJlY3RpdmUucmVzdHJpY3QgPSBkaXJlY3RpdmUucmVzdHJpY3QgfHwgJ0FDJzsNCi0gIHJldHVybiB2YWx1ZUZuKGRpcmVjdGl2ZSk7DQotfQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBhDQotICogQHJlc3RyaWN0IEUNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIE1vZGlmaWVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBodG1sIEEgdGFnIHNvIHRoYXQgdGhlIGRlZmF1bHQgYWN0aW9uIGlzIHByZXZlbnRlZCB3aGVuDQotICogdGhlIGhyZWYgYXR0cmlidXRlIGlzIGVtcHR5Lg0KLSAqDQotICogVGhpcyBjaGFuZ2UgcGVybWl0cyB0aGUgZWFzeSBjcmVhdGlvbiBvZiBhY3Rpb24gbGlua3Mgd2l0aCB0aGUgYG5nQ2xpY2tgIGRpcmVjdGl2ZQ0KLSAqIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGxvY2F0aW9uIG9yIGNhdXNpbmcgcGFnZSByZWxvYWRzLCBlLmcuOg0KLSAqIGA8YSBocmVmPSIiIG5nLWNsaWNrPSJsaXN0LmFkZEl0ZW0oKSI+QWRkIEl0ZW08L2E+YA0KLSAqLw0KLXZhciBodG1sQW5jaG9yRGlyZWN0aXZlID0gdmFsdWVGbih7DQotICByZXN0cmljdDogJ0UnLA0KLSAgY29tcGlsZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cikgew0KLSAgICBpZiAoIWF0dHIuaHJlZiAmJiAhYXR0ci54bGlua0hyZWYgJiYgIWF0dHIubmFtZSkgew0KLSAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCkgew0KLSAgICAgICAgLy8gU1ZHQUVsZW1lbnQgZG9lcyBub3QgdXNlIHRoZSBocmVmIGF0dHJpYnV0ZSwgYnV0IHJhdGhlciB0aGUgJ3hsaW5rSHJlZicgYXR0cmlidXRlLg0KLSAgICAgICAgdmFyIGhyZWYgPSB0b1N0cmluZy5jYWxsKGVsZW1lbnQucHJvcCgnaHJlZicpKSA9PT0gJ1tvYmplY3QgU1ZHQW5pbWF0ZWRTdHJpbmddJyA/DQotICAgICAgICAgICAgICAgICAgICd4bGluazpocmVmJyA6ICdocmVmJzsNCi0gICAgICAgIGVsZW1lbnQub24oJ2NsaWNrJywgZnVuY3Rpb24oZXZlbnQpIHsNCi0gICAgICAgICAgLy8gaWYgd2UgaGF2ZSBubyBocmVmIHVybCwgdGhlbiBkb24ndCBuYXZpZ2F0ZSBhbnl3aGVyZS4NCi0gICAgICAgICAgaWYgKCFlbGVtZW50LmF0dHIoaHJlZikpIHsNCi0gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0gICAgICB9Ow0KLSAgICB9DQotICB9DQotfSk7DQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nSHJlZg0KLSAqIEByZXN0cmljdCBBDQotICogQHByaW9yaXR5IDk5DQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBVc2luZyBBbmd1bGFyIG1hcmt1cCBsaWtlIGB7e2hhc2h9fWAgaW4gYW4gaHJlZiBhdHRyaWJ1dGUgd2lsbA0KLSAqIG1ha2UgdGhlIGxpbmsgZ28gdG8gdGhlIHdyb25nIFVSTCBpZiB0aGUgdXNlciBjbGlja3MgaXQgYmVmb3JlDQotICogQW5ndWxhciBoYXMgYSBjaGFuY2UgdG8gcmVwbGFjZSB0aGUgYHt7aGFzaH19YCBtYXJrdXAgd2l0aCBpdHMNCi0gKiB2YWx1ZS4gVW50aWwgQW5ndWxhciByZXBsYWNlcyB0aGUgbWFya3VwIHRoZSBsaW5rIHdpbGwgYmUgYnJva2VuDQotICogYW5kIHdpbGwgbW9zdCBsaWtlbHkgcmV0dXJuIGEgNDA0IGVycm9yLiBUaGUgYG5nSHJlZmAgZGlyZWN0aXZlDQotICogc29sdmVzIHRoaXMgcHJvYmxlbS4NCi0gKg0KLSAqIFRoZSB3cm9uZyB3YXkgdG8gd3JpdGUgaXQ6DQotICogYGBgaHRtbA0KLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fSI+bGluazE8L2E+DQotICogYGBgDQotICoNCi0gKiBUaGUgY29ycmVjdCB3YXkgdG8gd3JpdGUgaXQ6DQotICogYGBgaHRtbA0KLSAqIDxhIG5nLWhyZWY9Imh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fSI+bGluazE8L2E+DQotICogYGBgDQotICoNCi0gKiBAZWxlbWVudCBBDQotICogQHBhcmFtIHt0ZW1wbGF0ZX0gbmdIcmVmIGFueSBzdHJpbmcgd2hpY2ggY2FuIGNvbnRhaW4gYHt7fX1gIG1hcmt1cC4NCi0gKg0KLSAqIEBleGFtcGxlDQotICogVGhpcyBleGFtcGxlIHNob3dzIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIGBocmVmYCwgYG5nLWhyZWZgIGFuZCBgbmctY2xpY2tgIGF0dHJpYnV0ZXMNCi0gKiBpbiBsaW5rcyBhbmQgdGhlaXIgZGlmZmVyZW50IGJlaGF2aW9yczoNCi0gICAgPGV4YW1wbGU+DQotICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgICA8aW5wdXQgbmctbW9kZWw9InZhbHVlIiAvPjxiciAvPg0KLSAgICAgICAgPGEgaWQ9ImxpbmstMSIgaHJlZiBuZy1jbGljaz0idmFsdWUgPSAxIj5saW5rIDE8L2E+IChsaW5rLCBkb24ndCByZWxvYWQpPGJyIC8+DQotICAgICAgICA8YSBpZD0ibGluay0yIiBocmVmPSIiIG5nLWNsaWNrPSJ2YWx1ZSA9IDIiPmxpbmsgMjwvYT4gKGxpbmssIGRvbid0IHJlbG9hZCk8YnIgLz4NCi0gICAgICAgIDxhIGlkPSJsaW5rLTMiIG5nLWhyZWY9Ii97eycxMjMnfX0iPmxpbmsgMzwvYT4gKGxpbmssIHJlbG9hZCEpPGJyIC8+DQotICAgICAgICA8YSBpZD0ibGluay00IiBocmVmPSIiIG5hbWU9Inh4IiBuZy1jbGljaz0idmFsdWUgPSA0Ij5hbmNob3I8L2E+IChsaW5rLCBkb24ndCByZWxvYWQpPGJyIC8+DQotICAgICAgICA8YSBpZD0ibGluay01IiBuYW1lPSJ4eHgiIG5nLWNsaWNrPSJ2YWx1ZSA9IDUiPmFuY2hvcjwvYT4gKG5vIGxpbmspPGJyIC8+DQotICAgICAgICA8YSBpZD0ibGluay02IiBuZy1ocmVmPSJ7e3ZhbHVlfX0iPmxpbms8L2E+IChsaW5rLCBjaGFuZ2UgbG9jYXRpb24pDQotICAgICAgPC9maWxlPg0KLSAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICAgaXQoJ3Nob3VsZCBleGVjdXRlIG5nLWNsaWNrIGJ1dCBub3QgcmVsb2FkIHdoZW4gaHJlZiB3aXRob3V0IHZhbHVlJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ2xpbmstMScpKS5jbGljaygpOw0KLSAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0VxdWFsKCcxJyk7DQotICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTEnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvQmUoJycpOw0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgbmctY2xpY2sgYnV0IG5vdCByZWxvYWQgd2hlbiBocmVmIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICBlbGVtZW50KGJ5LmlkKCdsaW5rLTInKSkuY2xpY2soKTsNCi0gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnMicpOw0KLSAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGluay0yJykpLmdldEF0dHJpYnV0ZSgnaHJlZicpKS50b0JlKCcnKTsNCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgaXQoJ3Nob3VsZCBleGVjdXRlIG5nLWNsaWNrIGFuZCBjaGFuZ2UgdXJsIHdoZW4gbmctaHJlZiBzcGVjaWZpZWQnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2xpbmstMycpKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkudG9NYXRjaCgvXC8xMjMkLyk7DQotDQotICAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ2xpbmstMycpKS5jbGljaygpOw0KLQ0KLSAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBuYXZpZ2F0ZSBhd2F5IGZyb20gYW4gQW5ndWxhciBwYWdlLCBzbyB3ZSBuZWVkDQotICAgICAgICAgIC8vIHRvIHVzZSBicm93c2VyLmRyaXZlciB0byBnZXQgdGhlIGJhc2Ugd2ViZHJpdmVyLg0KLQ0KLSAgICAgICAgICBicm93c2VyLndhaXQoZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIuZHJpdmVyLmdldEN1cnJlbnRVcmwoKS50aGVuKGZ1bmN0aW9uKHVybCkgew0KLSAgICAgICAgICAgICAgcmV0dXJuIHVybC5tYXRjaCgvXC8xMjMkLyk7DQotICAgICAgICAgICAgfSk7DQotICAgICAgICAgIH0sIDUwMDAsICdwYWdlIHNob3VsZCBuYXZpZ2F0ZSB0byAvMTIzJyk7DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIHhpdCgnc2hvdWxkIGV4ZWN1dGUgbmctY2xpY2sgYnV0IG5vdCByZWxvYWQgd2hlbiBocmVmIGVtcHR5IHN0cmluZyBhbmQgbmFtZSBzcGVjaWZpZWQnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgZWxlbWVudChieS5pZCgnbGluay00JykpLmNsaWNrKCk7DQotICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvRXF1YWwoJzQnKTsNCi0gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2xpbmstNCcpKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkudG9CZSgnJyk7DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIGl0KCdzaG91bGQgZXhlY3V0ZSBuZy1jbGljayBidXQgbm90IHJlbG9hZCB3aGVuIG5vIGhyZWYgYnV0IG5hbWUgc3BlY2lmaWVkJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ2xpbmstNScpKS5jbGljaygpOw0KLSAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0VxdWFsKCc1Jyk7DQotICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTUnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvQmUobnVsbCk7DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIGl0KCdzaG91bGQgb25seSBjaGFuZ2UgdXJsIHdoZW4gb25seSBuZy1ocmVmJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpLmNsZWFyKCk7DQotICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpLnNlbmRLZXlzKCc2Jyk7DQotICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTYnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvTWF0Y2goL1wvNiQvKTsNCi0NCi0gICAgICAgICAgZWxlbWVudChieS5pZCgnbGluay02JykpLmNsaWNrKCk7DQotDQotICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIG5hdmlnYXRlIGF3YXkgZnJvbSBhbiBBbmd1bGFyIHBhZ2UsIHNvIHdlIG5lZWQNCi0gICAgICAgICAgLy8gdG8gdXNlIGJyb3dzZXIuZHJpdmVyIHRvIGdldCB0aGUgYmFzZSB3ZWJkcml2ZXIuDQotICAgICAgICAgIGJyb3dzZXIud2FpdChmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gYnJvd3Nlci5kcml2ZXIuZ2V0Q3VycmVudFVybCgpLnRoZW4oZnVuY3Rpb24odXJsKSB7DQotICAgICAgICAgICAgICByZXR1cm4gdXJsLm1hdGNoKC9cLzYkLyk7DQotICAgICAgICAgICAgfSk7DQotICAgICAgICAgIH0sIDUwMDAsICdwYWdlIHNob3VsZCBuYXZpZ2F0ZSB0byAvNicpOw0KLSAgICAgICAgfSk7DQotICAgICAgPC9maWxlPg0KLSAgICA8L2V4YW1wbGU+DQotICovDQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nU3JjDQotICogQHJlc3RyaWN0IEENCi0gKiBAcHJpb3JpdHkgOTkNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFVzaW5nIEFuZ3VsYXIgbWFya3VwIGxpa2UgYHt7aGFzaH19YCBpbiBhIGBzcmNgIGF0dHJpYnV0ZSBkb2Vzbid0DQotICogd29yayByaWdodDogVGhlIGJyb3dzZXIgd2lsbCBmZXRjaCBmcm9tIHRoZSBVUkwgd2l0aCB0aGUgbGl0ZXJhbA0KLSAqIHRleHQgYHt7aGFzaH19YCB1bnRpbCBBbmd1bGFyIHJlcGxhY2VzIHRoZSBleHByZXNzaW9uIGluc2lkZQ0KLSAqIGB7e2hhc2h9fWAuIFRoZSBgbmdTcmNgIGRpcmVjdGl2ZSBzb2x2ZXMgdGhpcyBwcm9ibGVtLg0KLSAqDQotICogVGhlIGJ1Z2d5IHdheSB0byB3cml0ZSBpdDoNCi0gKiBgYGBodG1sDQotICogPGltZyBzcmM9Imh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fSIvPg0KLSAqIGBgYA0KLSAqDQotICogVGhlIGNvcnJlY3Qgd2F5IHRvIHdyaXRlIGl0Og0KLSAqIGBgYGh0bWwNCi0gKiA8aW1nIG5nLXNyYz0iaHR0cDovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyL3t7aGFzaH19Ii8+DQotICogYGBgDQotICoNCi0gKiBAZWxlbWVudCBJTUcNCi0gKiBAcGFyYW0ge3RlbXBsYXRlfSBuZ1NyYyBhbnkgc3RyaW5nIHdoaWNoIGNhbiBjb250YWluIGB7e319YCBtYXJrdXAuDQotICovDQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nU3Jjc2V0DQotICogQHJlc3RyaWN0IEENCi0gKiBAcHJpb3JpdHkgOTkNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFVzaW5nIEFuZ3VsYXIgbWFya3VwIGxpa2UgYHt7aGFzaH19YCBpbiBhIGBzcmNzZXRgIGF0dHJpYnV0ZSBkb2Vzbid0DQotICogd29yayByaWdodDogVGhlIGJyb3dzZXIgd2lsbCBmZXRjaCBmcm9tIHRoZSBVUkwgd2l0aCB0aGUgbGl0ZXJhbA0KLSAqIHRleHQgYHt7aGFzaH19YCB1bnRpbCBBbmd1bGFyIHJlcGxhY2VzIHRoZSBleHByZXNzaW9uIGluc2lkZQ0KLSAqIGB7e2hhc2h9fWAuIFRoZSBgbmdTcmNzZXRgIGRpcmVjdGl2ZSBzb2x2ZXMgdGhpcyBwcm9ibGVtLg0KLSAqDQotICogVGhlIGJ1Z2d5IHdheSB0byB3cml0ZSBpdDoNCi0gKiBgYGBodG1sDQotICogPGltZyBzcmNzZXQ9Imh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fSAyeCIvPg0KLSAqIGBgYA0KLSAqDQotICogVGhlIGNvcnJlY3Qgd2F5IHRvIHdyaXRlIGl0Og0KLSAqIGBgYGh0bWwNCi0gKiA8aW1nIG5nLXNyY3NldD0iaHR0cDovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyL3t7aGFzaH19IDJ4Ii8+DQotICogYGBgDQotICoNCi0gKiBAZWxlbWVudCBJTUcNCi0gKiBAcGFyYW0ge3RlbXBsYXRlfSBuZ1NyY3NldCBhbnkgc3RyaW5nIHdoaWNoIGNhbiBjb250YWluIGB7e319YCBtYXJrdXAuDQotICovDQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nRGlzYWJsZWQNCi0gKiBAcmVzdHJpY3QgQQ0KLSAqIEBwcmlvcml0eSAxMDANCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqDQotICogV2Ugc2hvdWxkbid0IGRvIHRoaXMsIGJlY2F1c2UgaXQgd2lsbCBtYWtlIHRoZSBidXR0b24gZW5hYmxlZCBvbiBDaHJvbWUvRmlyZWZveCBidXQgbm90IG9uIElFOCBhbmQgb2xkZXIgSUVzOg0KLSAqIGBgYGh0bWwNCi0gKiA8ZGl2IG5nLWluaXQ9InNjb3BlID0geyBpc0Rpc2FibGVkOiBmYWxzZSB9Ij4NCi0gKiAgPGJ1dHRvbiBkaXNhYmxlZD0ie3tzY29wZS5pc0Rpc2FibGVkfX0iPkRpc2FibGVkPC9idXR0b24+DQotICogPC9kaXY+DQotICogYGBgDQotICoNCi0gKiBUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYnJvd3NlcnMgdG8gcHJlc2VydmUgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMNCi0gKiBzdWNoIGFzIGRpc2FibGVkLiAoVGhlaXIgcHJlc2VuY2UgbWVhbnMgdHJ1ZSBhbmQgdGhlaXIgYWJzZW5jZSBtZWFucyBmYWxzZS4pDQotICogSWYgd2UgcHV0IGFuIEFuZ3VsYXIgaW50ZXJwb2xhdGlvbiBleHByZXNzaW9uIGludG8gc3VjaCBhbiBhdHRyaWJ1dGUgdGhlbiB0aGUNCi0gKiBiaW5kaW5nIGluZm9ybWF0aW9uIHdvdWxkIGJlIGxvc3Qgd2hlbiB0aGUgYnJvd3NlciByZW1vdmVzIHRoZSBhdHRyaWJ1dGUuDQotICogVGhlIGBuZ0Rpc2FibGVkYCBkaXJlY3RpdmUgc29sdmVzIHRoaXMgcHJvYmxlbSBmb3IgdGhlIGBkaXNhYmxlZGAgYXR0cmlidXRlLg0KLSAqIFRoaXMgY29tcGxlbWVudGFyeSBkaXJlY3RpdmUgaXMgbm90IHJlbW92ZWQgYnkgdGhlIGJyb3dzZXIgYW5kIHNvIHByb3ZpZGVzDQotICogYSBwZXJtYW5lbnQgcmVsaWFibGUgcGxhY2UgdG8gc3RvcmUgdGhlIGJpbmRpbmcgaW5mb3JtYXRpb24uDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgICA8ZXhhbXBsZT4NCi0gICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgIENsaWNrIG1lIHRvIHRvZ2dsZTogPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iY2hlY2tlZCI+PGJyLz4NCi0gICAgICAgIDxidXR0b24gbmctbW9kZWw9ImJ1dHRvbiIgbmctZGlzYWJsZWQ9ImNoZWNrZWQiPkJ1dHRvbjwvYnV0dG9uPg0KLSAgICAgIDwvZmlsZT4NCi0gICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgIGl0KCdzaG91bGQgdG9nZ2xlIGJ1dHRvbicsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJ2J1dHRvbicpKS5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpLnRvQmVGYWxzeSgpOw0KLSAgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdjaGVja2VkJykpLmNsaWNrKCk7DQotICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnYnV0dG9uJykpLmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSkudG9CZVRydXRoeSgpOw0KLSAgICAgICAgfSk7DQotICAgICAgPC9maWxlPg0KLSAgICA8L2V4YW1wbGU+DQotICoNCi0gKiBAZWxlbWVudCBJTlBVVA0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdEaXNhYmxlZCBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LA0KLSAqICAgICB0aGVuIHNwZWNpYWwgYXR0cmlidXRlICJkaXNhYmxlZCIgd2lsbCBiZSBzZXQgb24gdGhlIGVsZW1lbnQNCi0gKi8NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZGlyZWN0aXZlDQotICogQG5hbWUgbmdDaGVja2VkDQotICogQHJlc3RyaWN0IEENCi0gKiBAcHJpb3JpdHkgMTAwDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYnJvd3NlcnMgdG8gcHJlc2VydmUgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMNCi0gKiBzdWNoIGFzIGNoZWNrZWQuIChUaGVpciBwcmVzZW5jZSBtZWFucyB0cnVlIGFuZCB0aGVpciBhYnNlbmNlIG1lYW5zIGZhbHNlLikNCi0gKiBJZiB3ZSBwdXQgYW4gQW5ndWxhciBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb24gaW50byBzdWNoIGFuIGF0dHJpYnV0ZSB0aGVuIHRoZQ0KLSAqIGJpbmRpbmcgaW5mb3JtYXRpb24gd291bGQgYmUgbG9zdCB3aGVuIHRoZSBicm93c2VyIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZS4NCi0gKiBUaGUgYG5nQ2hlY2tlZGAgZGlyZWN0aXZlIHNvbHZlcyB0aGlzIHByb2JsZW0gZm9yIHRoZSBgY2hlY2tlZGAgYXR0cmlidXRlLg0KLSAqIFRoaXMgY29tcGxlbWVudGFyeSBkaXJlY3RpdmUgaXMgbm90IHJlbW92ZWQgYnkgdGhlIGJyb3dzZXIgYW5kIHNvIHByb3ZpZGVzDQotICogYSBwZXJtYW5lbnQgcmVsaWFibGUgcGxhY2UgdG8gc3RvcmUgdGhlIGJpbmRpbmcgaW5mb3JtYXRpb24uDQotICogQGV4YW1wbGUNCi0gICAgPGV4YW1wbGU+DQotICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgICBDaGVjayBtZSB0byBjaGVjayBib3RoOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJtYXN0ZXIiPjxici8+DQotICAgICAgICA8aW5wdXQgaWQ9ImNoZWNrU2xhdmUiIHR5cGU9ImNoZWNrYm94IiBuZy1jaGVja2VkPSJtYXN0ZXIiPg0KLSAgICAgIDwvZmlsZT4NCi0gICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgIGl0KCdzaG91bGQgY2hlY2sgYm90aCBjaGVja0JveGVzJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjaGVja1NsYXZlJykpLmdldEF0dHJpYnV0ZSgnY2hlY2tlZCcpKS50b0JlRmFsc3koKTsNCi0gICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnbWFzdGVyJykpLmNsaWNrKCk7DQotICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjaGVja1NsYXZlJykpLmdldEF0dHJpYnV0ZSgnY2hlY2tlZCcpKS50b0JlVHJ1dGh5KCk7DQotICAgICAgICB9KTsNCi0gICAgICA8L2ZpbGU+DQotICAgIDwvZXhhbXBsZT4NCi0gKg0KLSAqIEBlbGVtZW50IElOUFVUDQotICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NoZWNrZWQgSWYgdGhlIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGlzIHRydXRoeSwNCi0gKiAgICAgdGhlbiBzcGVjaWFsIGF0dHJpYnV0ZSAiY2hlY2tlZCIgd2lsbCBiZSBzZXQgb24gdGhlIGVsZW1lbnQNCi0gKi8NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZGlyZWN0aXZlDQotICogQG5hbWUgbmdSZWFkb25seQ0KLSAqIEByZXN0cmljdCBBDQotICogQHByaW9yaXR5IDEwMA0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogVGhlIEhUTUwgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGJyb3dzZXJzIHRvIHByZXNlcnZlIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzDQotICogc3VjaCBhcyByZWFkb25seS4gKFRoZWlyIHByZXNlbmNlIG1lYW5zIHRydWUgYW5kIHRoZWlyIGFic2VuY2UgbWVhbnMgZmFsc2UuKQ0KLSAqIElmIHdlIHB1dCBhbiBBbmd1bGFyIGludGVycG9sYXRpb24gZXhwcmVzc2lvbiBpbnRvIHN1Y2ggYW4gYXR0cmlidXRlIHRoZW4gdGhlDQotICogYmluZGluZyBpbmZvcm1hdGlvbiB3b3VsZCBiZSBsb3N0IHdoZW4gdGhlIGJyb3dzZXIgcmVtb3ZlcyB0aGUgYXR0cmlidXRlLg0KLSAqIFRoZSBgbmdSZWFkb25seWAgZGlyZWN0aXZlIHNvbHZlcyB0aGlzIHByb2JsZW0gZm9yIHRoZSBgcmVhZG9ubHlgIGF0dHJpYnV0ZS4NCi0gKiBUaGlzIGNvbXBsZW1lbnRhcnkgZGlyZWN0aXZlIGlzIG5vdCByZW1vdmVkIGJ5IHRoZSBicm93c2VyIGFuZCBzbyBwcm92aWRlcw0KLSAqIGEgcGVybWFuZW50IHJlbGlhYmxlIHBsYWNlIHRvIHN0b3JlIHRoZSBiaW5kaW5nIGluZm9ybWF0aW9uLg0KLSAqIEBleGFtcGxlDQotICAgIDxleGFtcGxlPg0KLSAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICAgQ2hlY2sgbWUgdG8gbWFrZSB0ZXh0IHJlYWRvbmx5OiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJjaGVja2VkIj48YnIvPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLXJlYWRvbmx5PSJjaGVja2VkIiB2YWx1ZT0iSSdtIEFuZ3VsYXIiLz4NCi0gICAgICA8L2ZpbGU+DQotICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgICBpdCgnc2hvdWxkIHRvZ2dsZSByZWFkb25seSBhdHRyJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnW3R5cGU9InRleHQiXScpKS5nZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JykpLnRvQmVGYWxzeSgpOw0KLSAgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdjaGVja2VkJykpLmNsaWNrKCk7DQotICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnW3R5cGU9InRleHQiXScpKS5nZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JykpLnRvQmVUcnV0aHkoKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIDwvZmlsZT4NCi0gICAgPC9leGFtcGxlPg0KLSAqDQotICogQGVsZW1lbnQgSU5QVVQNCi0gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nUmVhZG9ubHkgSWYgdGhlIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGlzIHRydXRoeSwNCi0gKiAgICAgdGhlbiBzcGVjaWFsIGF0dHJpYnV0ZSAicmVhZG9ubHkiIHdpbGwgYmUgc2V0IG9uIHRoZSBlbGVtZW50DQotICovDQotDQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nU2VsZWN0ZWQNCi0gKiBAcmVzdHJpY3QgQQ0KLSAqIEBwcmlvcml0eSAxMDANCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRoZSBIVE1MIHNwZWNpZmljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBicm93c2VycyB0byBwcmVzZXJ2ZSB0aGUgdmFsdWVzIG9mIGJvb2xlYW4gYXR0cmlidXRlcw0KLSAqIHN1Y2ggYXMgc2VsZWN0ZWQuIChUaGVpciBwcmVzZW5jZSBtZWFucyB0cnVlIGFuZCB0aGVpciBhYnNlbmNlIG1lYW5zIGZhbHNlLikNCi0gKiBJZiB3ZSBwdXQgYW4gQW5ndWxhciBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb24gaW50byBzdWNoIGFuIGF0dHJpYnV0ZSB0aGVuIHRoZQ0KLSAqIGJpbmRpbmcgaW5mb3JtYXRpb24gd291bGQgYmUgbG9zdCB3aGVuIHRoZSBicm93c2VyIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZS4NCi0gKiBUaGUgYG5nU2VsZWN0ZWRgIGRpcmVjdGl2ZSBzb2x2ZXMgdGhpcyBwcm9ibGVtIGZvciB0aGUgYHNlbGVjdGVkYCBhdHRyaWJ1dGUuDQotICogVGhpcyBjb21wbGVtZW50YXJ5IGRpcmVjdGl2ZSBpcyBub3QgcmVtb3ZlZCBieSB0aGUgYnJvd3NlciBhbmQgc28gcHJvdmlkZXMNCi0gKiBhIHBlcm1hbmVudCByZWxpYWJsZSBwbGFjZSB0byBzdG9yZSB0aGUgYmluZGluZyBpbmZvcm1hdGlvbi4NCi0gKg0KLSAqIEBleGFtcGxlDQotICAgIDxleGFtcGxlPg0KLSAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICAgQ2hlY2sgbWUgdG8gc2VsZWN0OiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJzZWxlY3RlZCI+PGJyLz4NCi0gICAgICAgIDxzZWxlY3Q+DQotICAgICAgICAgIDxvcHRpb24+SGVsbG8hPC9vcHRpb24+DQotICAgICAgICAgIDxvcHRpb24gaWQ9ImdyZWV0IiBuZy1zZWxlY3RlZD0ic2VsZWN0ZWQiPkdyZWV0aW5ncyE8L29wdGlvbj4NCi0gICAgICAgIDwvc2VsZWN0Pg0KLSAgICAgIDwvZmlsZT4NCi0gICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgIGl0KCdzaG91bGQgc2VsZWN0IEdyZWV0aW5ncyEnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2dyZWV0JykpLmdldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnKSkudG9CZUZhbHN5KCk7DQotICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3NlbGVjdGVkJykpLmNsaWNrKCk7DQotICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdncmVldCcpKS5nZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJykpLnRvQmVUcnV0aHkoKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIDwvZmlsZT4NCi0gICAgPC9leGFtcGxlPg0KLSAqDQotICogQGVsZW1lbnQgT1BUSU9ODQotICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ1NlbGVjdGVkIElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyB0cnV0aHksDQotICogICAgIHRoZW4gc3BlY2lhbCBhdHRyaWJ1dGUgInNlbGVjdGVkIiB3aWxsIGJlIHNldCBvbiB0aGUgZWxlbWVudA0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ09wZW4NCi0gKiBAcmVzdHJpY3QgQQ0KLSAqIEBwcmlvcml0eSAxMDANCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRoZSBIVE1MIHNwZWNpZmljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBicm93c2VycyB0byBwcmVzZXJ2ZSB0aGUgdmFsdWVzIG9mIGJvb2xlYW4gYXR0cmlidXRlcw0KLSAqIHN1Y2ggYXMgb3Blbi4gKFRoZWlyIHByZXNlbmNlIG1lYW5zIHRydWUgYW5kIHRoZWlyIGFic2VuY2UgbWVhbnMgZmFsc2UuKQ0KLSAqIElmIHdlIHB1dCBhbiBBbmd1bGFyIGludGVycG9sYXRpb24gZXhwcmVzc2lvbiBpbnRvIHN1Y2ggYW4gYXR0cmlidXRlIHRoZW4gdGhlDQotICogYmluZGluZyBpbmZvcm1hdGlvbiB3b3VsZCBiZSBsb3N0IHdoZW4gdGhlIGJyb3dzZXIgcmVtb3ZlcyB0aGUgYXR0cmlidXRlLg0KLSAqIFRoZSBgbmdPcGVuYCBkaXJlY3RpdmUgc29sdmVzIHRoaXMgcHJvYmxlbSBmb3IgdGhlIGBvcGVuYCBhdHRyaWJ1dGUuDQotICogVGhpcyBjb21wbGVtZW50YXJ5IGRpcmVjdGl2ZSBpcyBub3QgcmVtb3ZlZCBieSB0aGUgYnJvd3NlciBhbmQgc28gcHJvdmlkZXMNCi0gKiBhIHBlcm1hbmVudCByZWxpYWJsZSBwbGFjZSB0byBzdG9yZSB0aGUgYmluZGluZyBpbmZvcm1hdGlvbi4NCi0gKiBAZXhhbXBsZQ0KLSAgICAgPGV4YW1wbGU+DQotICAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICAgIENoZWNrIG1lIGNoZWNrIG11bHRpcGxlOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJvcGVuIj48YnIvPg0KLSAgICAgICAgIDxkZXRhaWxzIGlkPSJkZXRhaWxzIiBuZy1vcGVuPSJvcGVuIj4NCi0gICAgICAgICAgICA8c3VtbWFyeT5TaG93L0hpZGUgbWU8L3N1bW1hcnk+DQotICAgICAgICAgPC9kZXRhaWxzPg0KLSAgICAgICA8L2ZpbGU+DQotICAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICAgIGl0KCdzaG91bGQgdG9nZ2xlIG9wZW4nLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdkZXRhaWxzJykpLmdldEF0dHJpYnV0ZSgnb3BlbicpKS50b0JlRmFsc3koKTsNCi0gICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ29wZW4nKSkuY2xpY2soKTsNCi0gICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdkZXRhaWxzJykpLmdldEF0dHJpYnV0ZSgnb3BlbicpKS50b0JlVHJ1dGh5KCk7DQotICAgICAgICAgfSk7DQotICAgICAgIDwvZmlsZT4NCi0gICAgIDwvZXhhbXBsZT4NCi0gKg0KLSAqIEBlbGVtZW50IERFVEFJTFMNCi0gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nT3BlbiBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LA0KLSAqICAgICB0aGVuIHNwZWNpYWwgYXR0cmlidXRlICJvcGVuIiB3aWxsIGJlIHNldCBvbiB0aGUgZWxlbWVudA0KLSAqLw0KLQ0KLXZhciBuZ0F0dHJpYnV0ZUFsaWFzRGlyZWN0aXZlcyA9IHt9Ow0KLQ0KLQ0KLS8vIGJvb2xlYW4gYXR0cnMgYXJlIGV2YWx1YXRlZA0KLWZvckVhY2goQk9PTEVBTl9BVFRSLCBmdW5jdGlvbihwcm9wTmFtZSwgYXR0ck5hbWUpIHsNCi0gIC8vIGJpbmRpbmcgdG8gbXVsdGlwbGUgaXMgbm90IHN1cHBvcnRlZA0KLSAgaWYgKHByb3BOYW1lID09ICJtdWx0aXBsZSIpIHJldHVybjsNCi0NCi0gIHZhciBub3JtYWxpemVkID0gZGlyZWN0aXZlTm9ybWFsaXplKCduZy0nICsgYXR0ck5hbWUpOw0KLSAgbmdBdHRyaWJ1dGVBbGlhc0RpcmVjdGl2ZXNbbm9ybWFsaXplZF0gPSBmdW5jdGlvbigpIHsNCi0gICAgcmV0dXJuIHsNCi0gICAgICByZXN0cmljdDogJ0EnLA0KLSAgICAgIHByaW9yaXR5OiAxMDAsDQotICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsNCi0gICAgICAgIHNjb3BlLiR3YXRjaChhdHRyW25vcm1hbGl6ZWRdLCBmdW5jdGlvbiBuZ0Jvb2xlYW5BdHRyV2F0Y2hBY3Rpb24odmFsdWUpIHsNCi0gICAgICAgICAgYXR0ci4kc2V0KGF0dHJOYW1lLCAhIXZhbHVlKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIH0NCi0gICAgfTsNCi0gIH07DQotfSk7DQotDQotLy8gYWxpYXNlZCBpbnB1dCBhdHRycyBhcmUgZXZhbHVhdGVkDQotZm9yRWFjaChBTElBU0VEX0FUVFIsIGZ1bmN0aW9uKGh0bWxBdHRyLCBuZ0F0dHIpIHsNCi0gIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzW25nQXR0cl0gPSBmdW5jdGlvbigpIHsNCi0gICAgcmV0dXJuIHsNCi0gICAgICBwcmlvcml0eTogMTAwLA0KLSAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7DQotICAgICAgICAvL3NwZWNpYWwgY2FzZSBuZ1BhdHRlcm4gd2hlbiBhIGxpdGVyYWwgcmVndWxhciBleHByZXNzaW9uIHZhbHVlDQotICAgICAgICAvL2lzIHVzZWQgYXMgdGhlIGV4cHJlc3Npb24gKHRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gd2F0Y2ggYW55dGhpbmcpLg0KLSAgICAgICAgaWYgKG5nQXR0ciA9PT0gIm5nUGF0dGVybiIgJiYgYXR0ci5uZ1BhdHRlcm4uY2hhckF0KDApID09ICIvIikgew0KLSAgICAgICAgICB2YXIgbWF0Y2ggPSBhdHRyLm5nUGF0dGVybi5tYXRjaChSRUdFWF9TVFJJTkdfUkVHRVhQKTsNCi0gICAgICAgICAgaWYgKG1hdGNoKSB7DQotICAgICAgICAgICAgYXR0ci4kc2V0KCJuZ1BhdHRlcm4iLCBuZXcgUmVnRXhwKG1hdGNoWzFdLCBtYXRjaFsyXSkpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2NvcGUuJHdhdGNoKGF0dHJbbmdBdHRyXSwgZnVuY3Rpb24gbmdBdHRyQWxpYXNXYXRjaEFjdGlvbih2YWx1ZSkgew0KLSAgICAgICAgICBhdHRyLiRzZXQobmdBdHRyLCB2YWx1ZSk7DQotICAgICAgICB9KTsNCi0gICAgICB9DQotICAgIH07DQotICB9Ow0KLX0pOw0KLQ0KLS8vIG5nLXNyYywgbmctc3Jjc2V0LCBuZy1ocmVmIGFyZSBpbnRlcnBvbGF0ZWQNCi1mb3JFYWNoKFsnc3JjJywgJ3NyY3NldCcsICdocmVmJ10sIGZ1bmN0aW9uKGF0dHJOYW1lKSB7DQotICB2YXIgbm9ybWFsaXplZCA9IGRpcmVjdGl2ZU5vcm1hbGl6ZSgnbmctJyArIGF0dHJOYW1lKTsNCi0gIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzW25vcm1hbGl6ZWRdID0gZnVuY3Rpb24oKSB7DQotICAgIHJldHVybiB7DQotICAgICAgcHJpb3JpdHk6IDk5LCAvLyBpdCBuZWVkcyB0byBydW4gYWZ0ZXIgdGhlIGF0dHJpYnV0ZXMgYXJlIGludGVycG9sYXRlZA0KLSAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7DQotICAgICAgICB2YXIgcHJvcE5hbWUgPSBhdHRyTmFtZSwNCi0gICAgICAgICAgICBuYW1lID0gYXR0ck5hbWU7DQotDQotICAgICAgICBpZiAoYXR0ck5hbWUgPT09ICdocmVmJyAmJg0KLSAgICAgICAgICAgIHRvU3RyaW5nLmNhbGwoZWxlbWVudC5wcm9wKCdocmVmJykpID09PSAnW29iamVjdCBTVkdBbmltYXRlZFN0cmluZ10nKSB7DQotICAgICAgICAgIG5hbWUgPSAneGxpbmtIcmVmJzsNCi0gICAgICAgICAgYXR0ci4kYXR0cltuYW1lXSA9ICd4bGluazpocmVmJzsNCi0gICAgICAgICAgcHJvcE5hbWUgPSBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYXR0ci4kb2JzZXJ2ZShub3JtYWxpemVkLCBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICAgICAgICBpZiAoIXZhbHVlKSB7DQotICAgICAgICAgICAgaWYgKGF0dHJOYW1lID09PSAnaHJlZicpIHsNCi0gICAgICAgICAgICAgIGF0dHIuJHNldChuYW1lLCBudWxsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIGF0dHIuJHNldChuYW1lLCB2YWx1ZSk7DQotDQotICAgICAgICAgIC8vIG9uIElFLCBpZiAibmc6c3JjIiBkaXJlY3RpdmUgZGVjbGFyYXRpb24gaXMgdXNlZCBhbmQgInNyYyIgYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3QNCi0gICAgICAgICAgLy8gdGhlbiBjYWxsaW5nIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzcmMnLCAnZm9vJykgZG9lc24ndCBkbyBhbnl0aGluZywgc28gd2UgbmVlZA0KLSAgICAgICAgICAvLyB0byBzZXQgdGhlIHByb3BlcnR5IGFzIHdlbGwgdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCBlZmZlY3QuDQotICAgICAgICAgIC8vIHdlIHVzZSBhdHRyW2F0dHJOYW1lXSB2YWx1ZSBzaW5jZSAkc2V0IGNhbiBzYW5pdGl6ZSB0aGUgdXJsLg0KLSAgICAgICAgICBpZiAobXNpZSAmJiBwcm9wTmFtZSkgZWxlbWVudC5wcm9wKHByb3BOYW1lLCBhdHRyW25hbWVdKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIH0NCi0gICAgfTsNCi0gIH07DQotfSk7DQotDQotLyogZ2xvYmFsIC1udWxsRm9ybUN0cmwsIC1TVUJNSVRURURfQ0xBU1MsIGFkZFNldFZhbGlkaXR5TWV0aG9kOiB0cnVlDQotICovDQotdmFyIG51bGxGb3JtQ3RybCA9IHsNCi0gICRhZGRDb250cm9sOiBub29wLA0KLSAgJCRyZW5hbWVDb250cm9sOiBudWxsRm9ybVJlbmFtZUNvbnRyb2wsDQotICAkcmVtb3ZlQ29udHJvbDogbm9vcCwNCi0gICRzZXRWYWxpZGl0eTogbm9vcCwNCi0gICRzZXREaXJ0eTogbm9vcCwNCi0gICRzZXRQcmlzdGluZTogbm9vcCwNCi0gICRzZXRTdWJtaXR0ZWQ6IG5vb3ANCi19LA0KLVNVQk1JVFRFRF9DTEFTUyA9ICduZy1zdWJtaXR0ZWQnOw0KLQ0KLWZ1bmN0aW9uIG51bGxGb3JtUmVuYW1lQ29udHJvbChjb250cm9sLCBuYW1lKSB7DQotICBjb250cm9sLiRuYW1lID0gbmFtZTsNCi19DQotDQotLyoqDQotICogQG5nZG9jIHR5cGUNCi0gKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyDQotICoNCi0gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRwcmlzdGluZSBUcnVlIGlmIHVzZXIgaGFzIG5vdCBpbnRlcmFjdGVkIHdpdGggdGhlIGZvcm0geWV0Lg0KLSAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJGRpcnR5IFRydWUgaWYgdXNlciBoYXMgYWxyZWFkeSBpbnRlcmFjdGVkIHdpdGggdGhlIGZvcm0uDQotICogQHByb3BlcnR5IHtib29sZWFufSAkdmFsaWQgVHJ1ZSBpZiBhbGwgb2YgdGhlIGNvbnRhaW5pbmcgZm9ybXMgYW5kIGNvbnRyb2xzIGFyZSB2YWxpZC4NCi0gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRpbnZhbGlkIFRydWUgaWYgYXQgbGVhc3Qgb25lIGNvbnRhaW5pbmcgY29udHJvbCBvciBmb3JtIGlzIGludmFsaWQuDQotICogQHByb3BlcnR5IHtib29sZWFufSAkc3VibWl0dGVkIFRydWUgaWYgdXNlciBoYXMgc3VibWl0dGVkIHRoZSBmb3JtIGV2ZW4gaWYgaXRzIGludmFsaWQuDQotICoNCi0gKiBAcHJvcGVydHkge09iamVjdH0gJGVycm9yIElzIGFuIG9iamVjdCBoYXNoLCBjb250YWluaW5nIHJlZmVyZW5jZXMgdG8gY29udHJvbHMgb3INCi0gKiAgZm9ybXMgd2l0aCBmYWlsaW5nIHZhbGlkYXRvcnMsIHdoZXJlOg0KLSAqDQotICogIC0ga2V5cyBhcmUgdmFsaWRhdGlvbiB0b2tlbnMgKGVycm9yIG5hbWVzKSwNCi0gKiAgLSB2YWx1ZXMgYXJlIGFycmF5cyBvZiBjb250cm9scyBvciBmb3JtcyB0aGF0IGhhdmUgYSBmYWlsaW5nIHZhbGlkYXRvciBmb3IgZ2l2ZW4gZXJyb3IgbmFtZS4NCi0gKg0KLSAqICBCdWlsdC1pbiB2YWxpZGF0aW9uIHRva2VuczoNCi0gKg0KLSAqICAtIGBlbWFpbGANCi0gKiAgLSBgbWF4YA0KLSAqICAtIGBtYXhsZW5ndGhgDQotICogIC0gYG1pbmANCi0gKiAgLSBgbWlubGVuZ3RoYA0KLSAqICAtIGBudW1iZXJgDQotICogIC0gYHBhdHRlcm5gDQotICogIC0gYHJlcXVpcmVkYA0KLSAqICAtIGB1cmxgDQotICogIC0gYGRhdGVgDQotICogIC0gYGRhdGV0aW1lbG9jYWxgDQotICogIC0gYHRpbWVgDQotICogIC0gYHdlZWtgDQotICogIC0gYG1vbnRoYA0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogYEZvcm1Db250cm9sbGVyYCBrZWVwcyB0cmFjayBvZiBhbGwgaXRzIGNvbnRyb2xzIGFuZCBuZXN0ZWQgZm9ybXMgYXMgd2VsbCBhcyB0aGUgc3RhdGUgb2YgdGhlbSwNCi0gKiBzdWNoIGFzIGJlaW5nIHZhbGlkL2ludmFsaWQgb3IgZGlydHkvcHJpc3RpbmUuDQotICoNCi0gKiBFYWNoIHtAbGluayBuZy5kaXJlY3RpdmU6Zm9ybSBmb3JtfSBkaXJlY3RpdmUgY3JlYXRlcyBhbiBpbnN0YW5jZQ0KLSAqIG9mIGBGb3JtQ29udHJvbGxlcmAuDQotICoNCi0gKi8NCi0vL2Fza3MgZm9yICRzY29wZSB0byBmb29sIHRoZSBCQyBjb250cm9sbGVyIG1vZHVsZQ0KLUZvcm1Db250cm9sbGVyLiRpbmplY3QgPSBbJyRlbGVtZW50JywgJyRhdHRycycsICckc2NvcGUnLCAnJGFuaW1hdGUnLCAnJGludGVycG9sYXRlJ107DQotZnVuY3Rpb24gRm9ybUNvbnRyb2xsZXIoZWxlbWVudCwgYXR0cnMsICRzY29wZSwgJGFuaW1hdGUsICRpbnRlcnBvbGF0ZSkgew0KLSAgdmFyIGZvcm0gPSB0aGlzLA0KLSAgICAgIGNvbnRyb2xzID0gW107DQotDQotICB2YXIgcGFyZW50Rm9ybSA9IGZvcm0uJCRwYXJlbnRGb3JtID0gZWxlbWVudC5wYXJlbnQoKS5jb250cm9sbGVyKCdmb3JtJykgfHwgbnVsbEZvcm1DdHJsOw0KLQ0KLSAgLy8gaW5pdCBzdGF0ZQ0KLSAgZm9ybS4kZXJyb3IgPSB7fTsNCi0gIGZvcm0uJCRzdWNjZXNzID0ge307DQotICBmb3JtLiRwZW5kaW5nID0gdW5kZWZpbmVkOw0KLSAgZm9ybS4kbmFtZSA9ICRpbnRlcnBvbGF0ZShhdHRycy5uYW1lIHx8IGF0dHJzLm5nRm9ybSB8fCAnJykoJHNjb3BlKTsNCi0gIGZvcm0uJGRpcnR5ID0gZmFsc2U7DQotICBmb3JtLiRwcmlzdGluZSA9IHRydWU7DQotICBmb3JtLiR2YWxpZCA9IHRydWU7DQotICBmb3JtLiRpbnZhbGlkID0gZmFsc2U7DQotICBmb3JtLiRzdWJtaXR0ZWQgPSBmYWxzZTsNCi0NCi0gIHBhcmVudEZvcm0uJGFkZENvbnRyb2woZm9ybSk7DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHJvbGxiYWNrVmlld1ZhbHVlDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBSb2xsYmFjayBhbGwgZm9ybSBjb250cm9scyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGAkbW9kZWxWYWx1ZWAuDQotICAgKg0KLSAgICogVXBkYXRlcyBtYXkgYmUgcGVuZGluZyBieSBhIGRlYm91bmNlZCBldmVudCBvciBiZWNhdXNlIHRoZSBpbnB1dCBpcyB3YWl0aW5nIGZvciBhIHNvbWUgZnV0dXJlDQotICAgKiBldmVudCBkZWZpbmVkIGluIGBuZy1tb2RlbC1vcHRpb25zYC4gVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IG5lZWRlZCBieSB0aGUgcmVzZXQgYnV0dG9uIG9mDQotICAgKiBhIGZvcm0gdGhhdCB1c2VzIGBuZy1tb2RlbC1vcHRpb25zYCB0byBwZW5kIHVwZGF0ZXMuDQotICAgKi8NCi0gIGZvcm0uJHJvbGxiYWNrVmlld1ZhbHVlID0gZnVuY3Rpb24oKSB7DQotICAgIGZvckVhY2goY29udHJvbHMsIGZ1bmN0aW9uKGNvbnRyb2wpIHsNCi0gICAgICBjb250cm9sLiRyb2xsYmFja1ZpZXdWYWx1ZSgpOw0KLSAgICB9KTsNCi0gIH07DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJGNvbW1pdFZpZXdWYWx1ZQ0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogQ29tbWl0IGFsbCBmb3JtIGNvbnRyb2xzIHBlbmRpbmcgdXBkYXRlcyB0byB0aGUgYCRtb2RlbFZhbHVlYC4NCi0gICAqDQotICAgKiBVcGRhdGVzIG1heSBiZSBwZW5kaW5nIGJ5IGEgZGVib3VuY2VkIGV2ZW50IG9yIGJlY2F1c2UgdGhlIGlucHV0IGlzIHdhaXRpbmcgZm9yIGEgc29tZSBmdXR1cmUNCi0gICAqIGV2ZW50IGRlZmluZWQgaW4gYG5nLW1vZGVsLW9wdGlvbnNgLiBUaGlzIG1ldGhvZCBpcyByYXJlbHkgbmVlZGVkIGFzIGBOZ01vZGVsQ29udHJvbGxlcmANCi0gICAqIHVzdWFsbHkgaGFuZGxlcyBjYWxsaW5nIHRoaXMgaW4gcmVzcG9uc2UgdG8gaW5wdXQgZXZlbnRzLg0KLSAgICovDQotICBmb3JtLiRjb21taXRWaWV3VmFsdWUgPSBmdW5jdGlvbigpIHsNCi0gICAgZm9yRWFjaChjb250cm9scywgZnVuY3Rpb24oY29udHJvbCkgew0KLSAgICAgIGNvbnRyb2wuJGNvbW1pdFZpZXdWYWx1ZSgpOw0KLSAgICB9KTsNCi0gIH07DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJGFkZENvbnRyb2wNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFJlZ2lzdGVyIGEgY29udHJvbCB3aXRoIHRoZSBmb3JtLg0KLSAgICoNCi0gICAqIElucHV0IGVsZW1lbnRzIHVzaW5nIG5nTW9kZWxDb250cm9sbGVyIGRvIHRoaXMgYXV0b21hdGljYWxseSB3aGVuIHRoZXkgYXJlIGxpbmtlZC4NCi0gICAqLw0KLSAgZm9ybS4kYWRkQ29udHJvbCA9IGZ1bmN0aW9uKGNvbnRyb2wpIHsNCi0gICAgLy8gQnJlYWtpbmcgY2hhbmdlIC0gYmVmb3JlLCBpbnB1dHMgd2hvc2UgbmFtZSB3YXMgImhhc093blByb3BlcnR5IiB3ZXJlIHF1aWV0bHkgaWdub3JlZA0KLSAgICAvLyBhbmQgbm90IGFkZGVkIHRvIHRoZSBzY29wZS4gIE5vdyB3ZSB0aHJvdyBhbiBlcnJvci4NCi0gICAgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkoY29udHJvbC4kbmFtZSwgJ2lucHV0Jyk7DQotICAgIGNvbnRyb2xzLnB1c2goY29udHJvbCk7DQotDQotICAgIGlmIChjb250cm9sLiRuYW1lKSB7DQotICAgICAgZm9ybVtjb250cm9sLiRuYW1lXSA9IGNvbnRyb2w7DQotICAgIH0NCi0gIH07DQotDQotICAvLyBQcml2YXRlIEFQSTogcmVuYW1lIGEgZm9ybSBjb250cm9sDQotICBmb3JtLiQkcmVuYW1lQ29udHJvbCA9IGZ1bmN0aW9uKGNvbnRyb2wsIG5ld05hbWUpIHsNCi0gICAgdmFyIG9sZE5hbWUgPSBjb250cm9sLiRuYW1lOw0KLQ0KLSAgICBpZiAoZm9ybVtvbGROYW1lXSA9PT0gY29udHJvbCkgew0KLSAgICAgIGRlbGV0ZSBmb3JtW29sZE5hbWVdOw0KLSAgICB9DQotICAgIGZvcm1bbmV3TmFtZV0gPSBjb250cm9sOw0KLSAgICBjb250cm9sLiRuYW1lID0gbmV3TmFtZTsNCi0gIH07DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHJlbW92ZUNvbnRyb2wNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIERlcmVnaXN0ZXIgYSBjb250cm9sIGZyb20gdGhlIGZvcm0uDQotICAgKg0KLSAgICogSW5wdXQgZWxlbWVudHMgdXNpbmcgbmdNb2RlbENvbnRyb2xsZXIgZG8gdGhpcyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhleSBhcmUgZGVzdHJveWVkLg0KLSAgICovDQotICBmb3JtLiRyZW1vdmVDb250cm9sID0gZnVuY3Rpb24oY29udHJvbCkgew0KLSAgICBpZiAoY29udHJvbC4kbmFtZSAmJiBmb3JtW2NvbnRyb2wuJG5hbWVdID09PSBjb250cm9sKSB7DQotICAgICAgZGVsZXRlIGZvcm1bY29udHJvbC4kbmFtZV07DQotICAgIH0NCi0gICAgZm9yRWFjaChmb3JtLiRwZW5kaW5nLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkgew0KLSAgICAgIGZvcm0uJHNldFZhbGlkaXR5KG5hbWUsIG51bGwsIGNvbnRyb2wpOw0KLSAgICB9KTsNCi0gICAgZm9yRWFjaChmb3JtLiRlcnJvciwgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsNCi0gICAgICBmb3JtLiRzZXRWYWxpZGl0eShuYW1lLCBudWxsLCBjb250cm9sKTsNCi0gICAgfSk7DQotDQotICAgIGFycmF5UmVtb3ZlKGNvbnRyb2xzLCBjb250cm9sKTsNCi0gIH07DQotDQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHNldFZhbGlkaXR5DQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBTZXRzIHRoZSB2YWxpZGl0eSBvZiBhIGZvcm0gY29udHJvbC4NCi0gICAqDQotICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gcHJvcGFnYXRlIHRvIHBhcmVudCBmb3Jtcy4NCi0gICAqLw0KLSAgYWRkU2V0VmFsaWRpdHlNZXRob2Qoew0KLSAgICBjdHJsOiB0aGlzLA0KLSAgICAkZWxlbWVudDogZWxlbWVudCwNCi0gICAgc2V0OiBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5LCBjb250cm9sKSB7DQotICAgICAgdmFyIGxpc3QgPSBvYmplY3RbcHJvcGVydHldOw0KLSAgICAgIGlmICghbGlzdCkgew0KLSAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IFtjb250cm9sXTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgdmFyIGluZGV4ID0gbGlzdC5pbmRleE9mKGNvbnRyb2wpOw0KLSAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgew0KLSAgICAgICAgICBsaXN0LnB1c2goY29udHJvbCk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9LA0KLSAgICB1bnNldDogZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSwgY29udHJvbCkgew0KLSAgICAgIHZhciBsaXN0ID0gb2JqZWN0W3Byb3BlcnR5XTsNCi0gICAgICBpZiAoIWxpc3QpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgICB9DQotICAgICAgYXJyYXlSZW1vdmUobGlzdCwgY29udHJvbCk7DQotICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7DQotICAgICAgICBkZWxldGUgb2JqZWN0W3Byb3BlcnR5XTsNCi0gICAgICB9DQotICAgIH0sDQotICAgIHBhcmVudEZvcm06IHBhcmVudEZvcm0sDQotICAgICRhbmltYXRlOiAkYW5pbWF0ZQ0KLSAgfSk7DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHNldERpcnR5DQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBTZXRzIHRoZSBmb3JtIHRvIGEgZGlydHkgc3RhdGUuDQotICAgKg0KLSAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBhZGQgdGhlICduZy1kaXJ0eScgY2xhc3MgYW5kIHNldCB0aGUgZm9ybSB0byBhIGRpcnR5DQotICAgKiBzdGF0ZSAobmctZGlydHkgY2xhc3MpLiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gcHJvcGFnYXRlIHRvIHBhcmVudCBmb3Jtcy4NCi0gICAqLw0KLSAgZm9ybS4kc2V0RGlydHkgPSBmdW5jdGlvbigpIHsNCi0gICAgJGFuaW1hdGUucmVtb3ZlQ2xhc3MoZWxlbWVudCwgUFJJU1RJTkVfQ0xBU1MpOw0KLSAgICAkYW5pbWF0ZS5hZGRDbGFzcyhlbGVtZW50LCBESVJUWV9DTEFTUyk7DQotICAgIGZvcm0uJGRpcnR5ID0gdHJ1ZTsNCi0gICAgZm9ybS4kcHJpc3RpbmUgPSBmYWxzZTsNCi0gICAgcGFyZW50Rm9ybS4kc2V0RGlydHkoKTsNCi0gIH07DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHNldFByaXN0aW5lDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBTZXRzIHRoZSBmb3JtIHRvIGl0cyBwcmlzdGluZSBzdGF0ZS4NCi0gICAqDQotICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHJlbW92ZSB0aGUgJ25nLWRpcnR5JyBjbGFzcyBhbmQgc2V0IHRoZSBmb3JtIHRvIGl0cyBwcmlzdGluZQ0KLSAgICogc3RhdGUgKG5nLXByaXN0aW5lIGNsYXNzKS4gVGhpcyBtZXRob2Qgd2lsbCBhbHNvIHByb3BhZ2F0ZSB0byBhbGwgdGhlIGNvbnRyb2xzIGNvbnRhaW5lZA0KLSAgICogaW4gdGhpcyBmb3JtLg0KLSAgICoNCi0gICAqIFNldHRpbmcgYSBmb3JtIGJhY2sgdG8gYSBwcmlzdGluZSBzdGF0ZSBpcyBvZnRlbiB1c2VmdWwgd2hlbiB3ZSB3YW50IHRvICdyZXVzZScgYSBmb3JtIGFmdGVyDQotICAgKiBzYXZpbmcgb3IgcmVzZXR0aW5nIGl0Lg0KLSAgICovDQotICBmb3JtLiRzZXRQcmlzdGluZSA9IGZ1bmN0aW9uKCkgew0KLSAgICAkYW5pbWF0ZS5zZXRDbGFzcyhlbGVtZW50LCBQUklTVElORV9DTEFTUywgRElSVFlfQ0xBU1MgKyAnICcgKyBTVUJNSVRURURfQ0xBU1MpOw0KLSAgICBmb3JtLiRkaXJ0eSA9IGZhbHNlOw0KLSAgICBmb3JtLiRwcmlzdGluZSA9IHRydWU7DQotICAgIGZvcm0uJHN1Ym1pdHRlZCA9IGZhbHNlOw0KLSAgICBmb3JFYWNoKGNvbnRyb2xzLCBmdW5jdGlvbihjb250cm9sKSB7DQotICAgICAgY29udHJvbC4kc2V0UHJpc3RpbmUoKTsNCi0gICAgfSk7DQotICB9Ow0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRzZXRVbnRvdWNoZWQNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFNldHMgdGhlIGZvcm0gdG8gaXRzIHVudG91Y2hlZCBzdGF0ZS4NCi0gICAqDQotICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHJlbW92ZSB0aGUgJ25nLXRvdWNoZWQnIGNsYXNzIGFuZCBzZXQgdGhlIGZvcm0gY29udHJvbHMgdG8gdGhlaXINCi0gICAqIHVudG91Y2hlZCBzdGF0ZSAobmctdW50b3VjaGVkIGNsYXNzKS4NCi0gICAqDQotICAgKiBTZXR0aW5nIGEgZm9ybSBjb250cm9scyBiYWNrIHRvIHRoZWlyIHVudG91Y2hlZCBzdGF0ZSBpcyBvZnRlbiB1c2VmdWwgd2hlbiBzZXR0aW5nIHRoZSBmb3JtDQotICAgKiBiYWNrIHRvIGl0cyBwcmlzdGluZSBzdGF0ZS4NCi0gICAqLw0KLSAgZm9ybS4kc2V0VW50b3VjaGVkID0gZnVuY3Rpb24oKSB7DQotICAgIGZvckVhY2goY29udHJvbHMsIGZ1bmN0aW9uKGNvbnRyb2wpIHsNCi0gICAgICBjb250cm9sLiRzZXRVbnRvdWNoZWQoKTsNCi0gICAgfSk7DQotICB9Ow0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRzZXRTdWJtaXR0ZWQNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFNldHMgdGhlIGZvcm0gdG8gaXRzIHN1Ym1pdHRlZCBzdGF0ZS4NCi0gICAqLw0KLSAgZm9ybS4kc2V0U3VibWl0dGVkID0gZnVuY3Rpb24oKSB7DQotICAgICRhbmltYXRlLmFkZENsYXNzKGVsZW1lbnQsIFNVQk1JVFRFRF9DTEFTUyk7DQotICAgIGZvcm0uJHN1Ym1pdHRlZCA9IHRydWU7DQotICAgIHBhcmVudEZvcm0uJHNldFN1Ym1pdHRlZCgpOw0KLSAgfTsNCi19DQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nRm9ybQ0KLSAqIEByZXN0cmljdCBFQUMNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIE5lc3RhYmxlIGFsaWFzIG9mIHtAbGluayBuZy5kaXJlY3RpdmU6Zm9ybSBgZm9ybWB9IGRpcmVjdGl2ZS4gSFRNTA0KLSAqIGRvZXMgbm90IGFsbG93IG5lc3Rpbmcgb2YgZm9ybSBlbGVtZW50cy4gSXQgaXMgdXNlZnVsIHRvIG5lc3QgZm9ybXMsIGZvciBleGFtcGxlIGlmIHRoZSB2YWxpZGl0eSBvZiBhDQotICogc3ViLWdyb3VwIG9mIGNvbnRyb2xzIG5lZWRzIHRvIGJlIGRldGVybWluZWQuDQotICoNCi0gKiBOb3RlOiB0aGUgcHVycG9zZSBvZiBgbmdGb3JtYCBpcyB0byBncm91cCBjb250cm9scywNCi0gKiBidXQgbm90IHRvIGJlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBgPGZvcm0+YCB0YWcgd2l0aCBhbGwgb2YgaXRzIGNhcGFiaWxpdGllcw0KLSAqIChlLmcuIHBvc3RpbmcgdG8gdGhlIHNlcnZlciwgLi4uKS4NCi0gKg0KLSAqIEBwYXJhbSB7c3RyaW5nPX0gbmdGb3JtfG5hbWUgTmFtZSBvZiB0aGUgZm9ybS4gSWYgc3BlY2lmaWVkLCB0aGUgZm9ybSBjb250cm9sbGVyIHdpbGwgYmUgcHVibGlzaGVkIGludG8NCi0gKiAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZCBzY29wZSwgdW5kZXIgdGhpcyBuYW1lLg0KLSAqDQotICovDQotDQotIC8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBmb3JtDQotICogQHJlc3RyaWN0IEUNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIERpcmVjdGl2ZSB0aGF0IGluc3RhbnRpYXRlcw0KLSAqIHtAbGluayBmb3JtLkZvcm1Db250cm9sbGVyIEZvcm1Db250cm9sbGVyfS4NCi0gKg0KLSAqIElmIHRoZSBgbmFtZWAgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGZvcm0gY29udHJvbGxlciBpcyBwdWJsaXNoZWQgb250byB0aGUgY3VycmVudCBzY29wZSB1bmRlcg0KLSAqIHRoaXMgbmFtZS4NCi0gKg0KLSAqICMgQWxpYXM6IHtAbGluayBuZy5kaXJlY3RpdmU6bmdGb3JtIGBuZ0Zvcm1gfQ0KLSAqDQotICogSW4gQW5ndWxhciBmb3JtcyBjYW4gYmUgbmVzdGVkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG91dGVyIGZvcm0gaXMgdmFsaWQgd2hlbiBhbGwgb2YgdGhlIGNoaWxkDQotICogZm9ybXMgYXJlIHZhbGlkIGFzIHdlbGwuIEhvd2V2ZXIsIGJyb3dzZXJzIGRvIG5vdCBhbGxvdyBuZXN0aW5nIG9mIGA8Zm9ybT5gIGVsZW1lbnRzLCBzbw0KLSAqIEFuZ3VsYXIgcHJvdmlkZXMgdGhlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdGb3JtIGBuZ0Zvcm1gfSBkaXJlY3RpdmUgd2hpY2ggYmVoYXZlcyBpZGVudGljYWxseSB0bw0KLSAqIGA8Zm9ybT5gIGJ1dCBjYW4gYmUgbmVzdGVkLiAgVGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgbmVzdGVkIGZvcm1zLCB3aGljaCBpcyB2ZXJ5IHVzZWZ1bCB3aGVuDQotICogdXNpbmcgQW5ndWxhciB2YWxpZGF0aW9uIGRpcmVjdGl2ZXMgaW4gZm9ybXMgdGhhdCBhcmUgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIHVzaW5nIHRoZQ0KLSAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdSZXBlYXQgYG5nUmVwZWF0YH0gZGlyZWN0aXZlLiBTaW5jZSB5b3UgY2Fubm90IGR5bmFtaWNhbGx5IGdlbmVyYXRlIHRoZSBgbmFtZWANCi0gKiBhdHRyaWJ1dGUgb2YgaW5wdXQgZWxlbWVudHMgdXNpbmcgaW50ZXJwb2xhdGlvbiwgeW91IGhhdmUgdG8gd3JhcCBlYWNoIHNldCBvZiByZXBlYXRlZCBpbnB1dHMgaW4gYW4NCi0gKiBgbmdGb3JtYCBkaXJlY3RpdmUgYW5kIG5lc3QgdGhlc2UgaW4gYW4gb3V0ZXIgYGZvcm1gIGVsZW1lbnQuDQotICoNCi0gKg0KLSAqICMgQ1NTIGNsYXNzZXMNCi0gKiAgLSBgbmctdmFsaWRgIGlzIHNldCBpZiB0aGUgZm9ybSBpcyB2YWxpZC4NCi0gKiAgLSBgbmctaW52YWxpZGAgaXMgc2V0IGlmIHRoZSBmb3JtIGlzIGludmFsaWQuDQotICogIC0gYG5nLXByaXN0aW5lYCBpcyBzZXQgaWYgdGhlIGZvcm0gaXMgcHJpc3RpbmUuDQotICogIC0gYG5nLWRpcnR5YCBpcyBzZXQgaWYgdGhlIGZvcm0gaXMgZGlydHkuDQotICogIC0gYG5nLXN1Ym1pdHRlZGAgaXMgc2V0IGlmIHRoZSBmb3JtIHdhcyBzdWJtaXR0ZWQuDQotICoNCi0gKiBLZWVwIGluIG1pbmQgdGhhdCBuZ0FuaW1hdGUgY2FuIGRldGVjdCBlYWNoIG9mIHRoZXNlIGNsYXNzZXMgd2hlbiBhZGRlZCBhbmQgcmVtb3ZlZC4NCi0gKg0KLSAqDQotICogIyBTdWJtaXR0aW5nIGEgZm9ybSBhbmQgcHJldmVudGluZyB0aGUgZGVmYXVsdCBhY3Rpb24NCi0gKg0KLSAqIFNpbmNlIHRoZSByb2xlIG9mIGZvcm1zIGluIGNsaWVudC1zaWRlIEFuZ3VsYXIgYXBwbGljYXRpb25zIGlzIGRpZmZlcmVudCB0aGFuIGluIGNsYXNzaWNhbA0KLSAqIHJvdW5kdHJpcCBhcHBzLCBpdCBpcyBkZXNpcmFibGUgZm9yIHRoZSBicm93c2VyIG5vdCB0byB0cmFuc2xhdGUgdGhlIGZvcm0gc3VibWlzc2lvbiBpbnRvIGEgZnVsbA0KLSAqIHBhZ2UgcmVsb2FkIHRoYXQgc2VuZHMgdGhlIGRhdGEgdG8gdGhlIHNlcnZlci4gSW5zdGVhZCBzb21lIGphdmFzY3JpcHQgbG9naWMgc2hvdWxkIGJlIHRyaWdnZXJlZA0KLSAqIHRvIGhhbmRsZSB0aGUgZm9ybSBzdWJtaXNzaW9uIGluIGFuIGFwcGxpY2F0aW9uLXNwZWNpZmljIHdheS4NCi0gKg0KLSAqIEZvciB0aGlzIHJlYXNvbiwgQW5ndWxhciBwcmV2ZW50cyB0aGUgZGVmYXVsdCBhY3Rpb24gKGZvcm0gc3VibWlzc2lvbiB0byB0aGUgc2VydmVyKSB1bmxlc3MgdGhlDQotICogYDxmb3JtPmAgZWxlbWVudCBoYXMgYW4gYGFjdGlvbmAgYXR0cmlidXRlIHNwZWNpZmllZC4NCi0gKg0KLSAqIFlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byB3YXlzIHRvIHNwZWNpZnkgd2hhdCBqYXZhc2NyaXB0IG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW4NCi0gKiBhIGZvcm0gaXMgc3VibWl0dGVkOg0KLSAqDQotICogLSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nU3VibWl0IG5nU3VibWl0fSBkaXJlY3RpdmUgb24gdGhlIGZvcm0gZWxlbWVudA0KLSAqIC0ge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NsaWNrIG5nQ2xpY2t9IGRpcmVjdGl2ZSBvbiB0aGUgZmlyc3QNCi0gICogIGJ1dHRvbiBvciBpbnB1dCBmaWVsZCBvZiB0eXBlIHN1Ym1pdCAoaW5wdXRbdHlwZT1zdWJtaXRdKQ0KLSAqDQotICogVG8gcHJldmVudCBkb3VibGUgZXhlY3V0aW9uIG9mIHRoZSBoYW5kbGVyLCB1c2Ugb25seSBvbmUgb2YgdGhlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdTdWJtaXQgbmdTdWJtaXR9DQotICogb3Ige0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NsaWNrIG5nQ2xpY2t9IGRpcmVjdGl2ZXMuDQotICogVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZm9ybSBzdWJtaXNzaW9uIHJ1bGVzIGluIHRoZSBIVE1MIHNwZWNpZmljYXRpb246DQotICoNCi0gKiAtIElmIGEgZm9ybSBoYXMgb25seSBvbmUgaW5wdXQgZmllbGQgdGhlbiBoaXR0aW5nIGVudGVyIGluIHRoaXMgZmllbGQgdHJpZ2dlcnMgZm9ybSBzdWJtaXQNCi0gKiAoYG5nU3VibWl0YCkNCi0gKiAtIGlmIGEgZm9ybSBoYXMgMisgaW5wdXQgZmllbGRzIGFuZCBubyBidXR0b25zIG9yIGlucHV0W3R5cGU9c3VibWl0XSB0aGVuIGhpdHRpbmcgZW50ZXINCi0gKiBkb2Vzbid0IHRyaWdnZXIgc3VibWl0DQotICogLSBpZiBhIGZvcm0gaGFzIG9uZSBvciBtb3JlIGlucHV0IGZpZWxkcyBhbmQgb25lIG9yIG1vcmUgYnV0dG9ucyBvciBpbnB1dFt0eXBlPXN1Ym1pdF0gdGhlbg0KLSAqIGhpdHRpbmcgZW50ZXIgaW4gYW55IG9mIHRoZSBpbnB1dCBmaWVsZHMgd2lsbCB0cmlnZ2VyIHRoZSBjbGljayBoYW5kbGVyIG9uIHRoZSAqZmlyc3QqIGJ1dHRvbiBvcg0KLSAqIGlucHV0W3R5cGU9c3VibWl0XSAoYG5nQ2xpY2tgKSAqYW5kKiBhIHN1Ym1pdCBoYW5kbGVyIG9uIHRoZSBlbmNsb3NpbmcgZm9ybSAoYG5nU3VibWl0YCkNCi0gKg0KLSAqIEFueSBwZW5kaW5nIGBuZ01vZGVsT3B0aW9uc2AgY2hhbmdlcyB3aWxsIHRha2UgcGxhY2UgaW1tZWRpYXRlbHkgd2hlbiBhbiBlbmNsb3NpbmcgZm9ybSBpcw0KLSAqIHN1Ym1pdHRlZC4gTm90ZSB0aGF0IGBuZ0NsaWNrYCBldmVudHMgd2lsbCBvY2N1ciBiZWZvcmUgdGhlIG1vZGVsIGlzIHVwZGF0ZWQuIFVzZSBgbmdTdWJtaXRgDQotICogdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIHVwZGF0ZWQgbW9kZWwuDQotICoNCi0gKiAjIyBBbmltYXRpb24gSG9va3MNCi0gKg0KLSAqIEFuaW1hdGlvbnMgaW4gbmdGb3JtIGFyZSB0cmlnZ2VyZWQgd2hlbiBhbnkgb2YgdGhlIGFzc29jaWF0ZWQgQ1NTIGNsYXNzZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkLg0KLSAqIFRoZXNlIGNsYXNzZXMgYXJlOiBgLm5nLXByaXN0aW5lYCwgYC5uZy1kaXJ0eWAsIGAubmctaW52YWxpZGAgYW5kIGAubmctdmFsaWRgIGFzIHdlbGwgYXMgYW55DQotICogb3RoZXIgdmFsaWRhdGlvbnMgdGhhdCBhcmUgcGVyZm9ybWVkIHdpdGhpbiB0aGUgZm9ybS4gQW5pbWF0aW9ucyBpbiBuZ0Zvcm0gYXJlIHNpbWlsYXIgdG8gaG93DQotICogdGhleSB3b3JrIGluIG5nQ2xhc3MgYW5kIGFuaW1hdGlvbnMgY2FuIGJlIGhvb2tlZCBpbnRvIHVzaW5nIENTUyB0cmFuc2l0aW9ucywga2V5ZnJhbWVzIGFzIHdlbGwNCi0gKiBhcyBKUyBhbmltYXRpb25zLg0KLSAqDQotICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGEgc2ltcGxlIHdheSB0byB1dGlsaXplIENTUyB0cmFuc2l0aW9ucyB0byBzdHlsZSBhIGZvcm0gZWxlbWVudA0KLSAqIHRoYXQgaGFzIGJlZW4gcmVuZGVyZWQgYXMgaW52YWxpZCBhZnRlciBpdCBoYXMgYmVlbiB2YWxpZGF0ZWQ6DQotICoNCi0gKiA8cHJlPg0KLSAqIC8vYmUgc3VyZSB0byBpbmNsdWRlIG5nQW5pbWF0ZSBhcyBhIG1vZHVsZSB0byBob29rIGludG8gbW9yZQ0KLSAqIC8vYWR2YW5jZWQgYW5pbWF0aW9ucw0KLSAqIC5teS1mb3JtIHsNCi0gKiAgIHRyYW5zaXRpb246MC41cyBsaW5lYXIgYWxsOw0KLSAqICAgYmFja2dyb3VuZDogd2hpdGU7DQotICogfQ0KLSAqIC5teS1mb3JtLm5nLWludmFsaWQgew0KLSAqICAgYmFja2dyb3VuZDogcmVkOw0KLSAqICAgY29sb3I6d2hpdGU7DQotICogfQ0KLSAqIDwvcHJlPg0KLSAqDQotICogQGV4YW1wbGUNCi0gICAgPGV4YW1wbGUgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIiBmaXhCYXNlPSJ0cnVlIiBtb2R1bGU9ImZvcm1FeGFtcGxlIj4NCi0gICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgPHNjcmlwdD4NCi0gICAgICAgICBhbmd1bGFyLm1vZHVsZSgnZm9ybUV4YW1wbGUnLCBbXSkNCi0gICAgICAgICAgIC5jb250cm9sbGVyKCdGb3JtQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgICAgICRzY29wZS51c2VyVHlwZSA9ICdndWVzdCc7DQotICAgICAgICAgICB9XSk7DQotICAgICAgIDwvc2NyaXB0Pg0KLSAgICAgICA8c3R5bGU+DQotICAgICAgICAubXktZm9ybSB7DQotICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgbGluZWFyIDAuNXM7DQotICAgICAgICAgIHRyYW5zaXRpb246YWxsIGxpbmVhciAwLjVzOw0KLSAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsNCi0gICAgICAgIH0NCi0gICAgICAgIC5teS1mb3JtLm5nLWludmFsaWQgew0KLSAgICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7DQotICAgICAgICB9DQotICAgICAgIDwvc3R5bGU+DQotICAgICAgIDxmb3JtIG5hbWU9Im15Rm9ybSIgbmctY29udHJvbGxlcj0iRm9ybUNvbnRyb2xsZXIiIGNsYXNzPSJteS1mb3JtIj4NCi0gICAgICAgICB1c2VyVHlwZTogPGlucHV0IG5hbWU9ImlucHV0IiBuZy1tb2RlbD0idXNlclR5cGUiIHJlcXVpcmVkPg0KLSAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZCI+UmVxdWlyZWQhPC9zcGFuPjxicj4NCi0gICAgICAgICA8dHQ+dXNlclR5cGUgPSB7e3VzZXJUeXBlfX08L3R0Pjxicj4NCi0gICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiR2YWxpZCA9IHt7bXlGb3JtLmlucHV0LiR2YWxpZH19PC90dD48YnI+DQotICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyPg0KLSAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxicj4NCi0gICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxicj4NCi0gICAgICAgIDwvZm9ybT4NCi0gICAgICA8L2ZpbGU+DQotICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgdmFyIHVzZXJUeXBlID0gZWxlbWVudChieS5iaW5kaW5nKCd1c2VyVHlwZScpKTsNCi0gICAgICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOw0KLQ0KLSAgICAgICAgICBleHBlY3QodXNlclR5cGUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2d1ZXN0Jyk7DQotICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOw0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgdmFyIHVzZXJUeXBlID0gZWxlbWVudChieS5iaW5kaW5nKCd1c2VyVHlwZScpKTsNCi0gICAgICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOw0KLSAgICAgICAgICB2YXIgdXNlcklucHV0ID0gZWxlbWVudChieS5tb2RlbCgndXNlclR5cGUnKSk7DQotDQotICAgICAgICAgIHVzZXJJbnB1dC5jbGVhcigpOw0KLSAgICAgICAgICB1c2VySW5wdXQuc2VuZEtleXMoJycpOw0KLQ0KLSAgICAgICAgICBleHBlY3QodXNlclR5cGUuZ2V0VGV4dCgpKS50b0VxdWFsKCd1c2VyVHlwZSA9Jyk7DQotICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIDwvZmlsZT4NCi0gICAgPC9leGFtcGxlPg0KLSAqDQotICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIE5hbWUgb2YgdGhlIGZvcm0uIElmIHNwZWNpZmllZCwgdGhlIGZvcm0gY29udHJvbGxlciB3aWxsIGJlIHB1Ymxpc2hlZCBpbnRvDQotICogICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgc2NvcGUsIHVuZGVyIHRoaXMgbmFtZS4NCi0gKi8NCi12YXIgZm9ybURpcmVjdGl2ZUZhY3RvcnkgPSBmdW5jdGlvbihpc05nRm9ybSkgew0KLSAgcmV0dXJuIFsnJHRpbWVvdXQnLCBmdW5jdGlvbigkdGltZW91dCkgew0KLSAgICB2YXIgZm9ybURpcmVjdGl2ZSA9IHsNCi0gICAgICBuYW1lOiAnZm9ybScsDQotICAgICAgcmVzdHJpY3Q6IGlzTmdGb3JtID8gJ0VBQycgOiAnRScsDQotICAgICAgY29udHJvbGxlcjogRm9ybUNvbnRyb2xsZXIsDQotICAgICAgY29tcGlsZTogZnVuY3Rpb24gbmdGb3JtQ29tcGlsZShmb3JtRWxlbWVudCkgew0KLSAgICAgICAgLy8gU2V0dXAgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY29udHJvbA0KLSAgICAgICAgZm9ybUVsZW1lbnQuYWRkQ2xhc3MoUFJJU1RJTkVfQ0xBU1MpLmFkZENsYXNzKFZBTElEX0NMQVNTKTsNCi0NCi0gICAgICAgIHJldHVybiB7DQotICAgICAgICAgIHByZTogZnVuY3Rpb24gbmdGb3JtUHJlTGluayhzY29wZSwgZm9ybUVsZW1lbnQsIGF0dHIsIGNvbnRyb2xsZXIpIHsNCi0gICAgICAgICAgICAvLyBpZiBgYWN0aW9uYCBhdHRyIGlzIG5vdCBwcmVzZW50IG9uIHRoZSBmb3JtLCBwcmV2ZW50IHRoZSBkZWZhdWx0IGFjdGlvbiAoc3VibWlzc2lvbikNCi0gICAgICAgICAgICBpZiAoISgnYWN0aW9uJyBpbiBhdHRyKSkgew0KLSAgICAgICAgICAgICAgLy8gd2UgY2FuJ3QgdXNlIGpxIGV2ZW50cyBiZWNhdXNlIGlmIGEgZm9ybSBpcyBkZXN0cm95ZWQgZHVyaW5nIHN1Ym1pc3Npb24gdGhlIGRlZmF1bHQNCi0gICAgICAgICAgICAgIC8vIGFjdGlvbiBpcyBub3QgcHJldmVudGVkLiBzZWUgIzEyMzgNCi0gICAgICAgICAgICAgIC8vDQotICAgICAgICAgICAgICAvLyBJRSA5IGlzIG5vdCBhZmZlY3RlZCBiZWNhdXNlIGl0IGRvZXNuJ3QgZmlyZSBhIHN1Ym1pdCBldmVudCBhbmQgdHJ5IHRvIGRvIGEgZnVsbA0KLSAgICAgICAgICAgICAgLy8gcGFnZSByZWxvYWQgaWYgdGhlIGZvcm0gd2FzIGRlc3Ryb3llZCBieSBzdWJtaXNzaW9uIG9mIHRoZSBmb3JtIHZpYSBhIGNsaWNrIGhhbmRsZXINCi0gICAgICAgICAgICAgIC8vIG9uIGEgYnV0dG9uIGluIHRoZSBmb3JtLiBMb29rcyBsaWtlIGFuIElFOSBzcGVjaWZpYyBidWcuDQotICAgICAgICAgICAgICB2YXIgaGFuZGxlRm9ybVN1Ym1pc3Npb24gPSBmdW5jdGlvbihldmVudCkgew0KLSAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgY29udHJvbGxlci4kY29tbWl0Vmlld1ZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgY29udHJvbGxlci4kc2V0U3VibWl0dGVkKCk7DQotICAgICAgICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KLSAgICAgICAgICAgICAgfTsNCi0NCi0gICAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXJGbihmb3JtRWxlbWVudFswXSwgJ3N1Ym1pdCcsIGhhbmRsZUZvcm1TdWJtaXNzaW9uKTsNCi0NCi0gICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIHByZXZlbnREZWZhdWx0IGxpc3RlbmVyIHNvIHRoYXQgd2UgZG9uJ3Qgbm90IGxlYWsgbWVtb3J5IGJ1dCBpbiBhDQotICAgICAgICAgICAgICAvLyB3YXkgdGhhdCB3aWxsIGFjaGlldmUgdGhlIHByZXZlbnRpb24gb2YgdGhlIGRlZmF1bHQgYWN0aW9uLg0KLSAgICAgICAgICAgICAgZm9ybUVsZW1lbnQub24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJGbihmb3JtRWxlbWVudFswXSwgJ3N1Ym1pdCcsIGhhbmRsZUZvcm1TdWJtaXNzaW9uKTsNCi0gICAgICAgICAgICAgICAgfSwgMCwgZmFsc2UpOw0KLSAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHZhciBwYXJlbnRGb3JtQ3RybCA9IGNvbnRyb2xsZXIuJCRwYXJlbnRGb3JtLA0KLSAgICAgICAgICAgICAgICBhbGlhcyA9IGNvbnRyb2xsZXIuJG5hbWU7DQotDQotICAgICAgICAgICAgaWYgKGFsaWFzKSB7DQotICAgICAgICAgICAgICBzZXR0ZXIoc2NvcGUsIGFsaWFzLCBjb250cm9sbGVyLCBhbGlhcyk7DQotICAgICAgICAgICAgICBhdHRyLiRvYnNlcnZlKGF0dHIubmFtZSA/ICduYW1lJyA6ICduZ0Zvcm0nLCBmdW5jdGlvbihuZXdWYWx1ZSkgew0KLSAgICAgICAgICAgICAgICBpZiAoYWxpYXMgPT09IG5ld1ZhbHVlKSByZXR1cm47DQotICAgICAgICAgICAgICAgIHNldHRlcihzY29wZSwgYWxpYXMsIHVuZGVmaW5lZCwgYWxpYXMpOw0KLSAgICAgICAgICAgICAgICBhbGlhcyA9IG5ld1ZhbHVlOw0KLSAgICAgICAgICAgICAgICBzZXR0ZXIoc2NvcGUsIGFsaWFzLCBjb250cm9sbGVyLCBhbGlhcyk7DQotICAgICAgICAgICAgICAgIHBhcmVudEZvcm1DdHJsLiQkcmVuYW1lQ29udHJvbChjb250cm9sbGVyLCBhbGlhcyk7DQotICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZm9ybUVsZW1lbnQub24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICBwYXJlbnRGb3JtQ3RybC4kcmVtb3ZlQ29udHJvbChjb250cm9sbGVyKTsNCi0gICAgICAgICAgICAgIGlmIChhbGlhcykgew0KLSAgICAgICAgICAgICAgICBzZXR0ZXIoc2NvcGUsIGFsaWFzLCB1bmRlZmluZWQsIGFsaWFzKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIGV4dGVuZChjb250cm9sbGVyLCBudWxsRm9ybUN0cmwpOyAvL3N0b3AgcHJvcGFnYXRpbmcgY2hpbGQgZGVzdHJ1Y3Rpb24gaGFuZGxlcnMgdXB3YXJkcw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgcmV0dXJuIGZvcm1EaXJlY3RpdmU7DQotICB9XTsNCi19Ow0KLQ0KLXZhciBmb3JtRGlyZWN0aXZlID0gZm9ybURpcmVjdGl2ZUZhY3RvcnkoKTsNCi12YXIgbmdGb3JtRGlyZWN0aXZlID0gZm9ybURpcmVjdGl2ZUZhY3RvcnkodHJ1ZSk7DQotDQotLyogZ2xvYmFsIFZBTElEX0NMQVNTOiB0cnVlLA0KLSAgSU5WQUxJRF9DTEFTUzogdHJ1ZSwNCi0gIFBSSVNUSU5FX0NMQVNTOiB0cnVlLA0KLSAgRElSVFlfQ0xBU1M6IHRydWUsDQotICBVTlRPVUNIRURfQ0xBU1M6IHRydWUsDQotICBUT1VDSEVEX0NMQVNTOiB0cnVlLA0KLSovDQotDQotLy8gUmVnZXggY29kZSBpcyBvYnRhaW5lZCBmcm9tIFNPOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMTQzMDcwL2phdmFzY3JpcHQtcmVnZXgtaXNvLWRhdGV0aW1lI2Fuc3dlci0zMTQzMjMxDQotdmFyIElTT19EQVRFX1JFR0VYUCA9IC9cZHs0fS1bMDFdXGQtWzAtM11cZFRbMC0yXVxkOlswLTVdXGQ6WzAtNV1cZFwuXGQrKFsrLV1bMC0yXVxkOlswLTVdXGR8WikvOw0KLXZhciBVUkxfUkVHRVhQID0gL14oZnRwfGh0dHB8aHR0cHMpOlwvXC8oXHcrOnswLDF9XHcqQCk/KFxTKykoOlswLTldKyk/KFwvfFwvKFtcdyMhOi4/Kz0mJUAhXC1cL10pKT8kLzsNCi12YXIgRU1BSUxfUkVHRVhQID0gL15bYS16MC05ISMkJSYnKitcLz0/Xl9ge3x9fi4tXStAW2EtejAtOV0oW2EtejAtOS1dKlthLXowLTldKT8oXC5bYS16MC05XShbYS16MC05LV0qW2EtejAtOV0pPykqJC9pOw0KLXZhciBOVU1CRVJfUkVHRVhQID0gL15ccyooXC18XCspPyhcZCt8KFxkKihcLlxkKikpKVxzKiQvOw0KLXZhciBEQVRFX1JFR0VYUCA9IC9eKFxkezR9KS0oXGR7Mn0pLShcZHsyfSkkLzsNCi12YXIgREFURVRJTUVMT0NBTF9SRUdFWFAgPSAvXihcZHs0fSktKFxkXGQpLShcZFxkKVQoXGRcZCk6KFxkXGQpKD86OihcZFxkKShcLlxkezEsM30pPyk/JC87DQotdmFyIFdFRUtfUkVHRVhQID0gL14oXGR7NH0pLVcoXGRcZCkkLzsNCi12YXIgTU9OVEhfUkVHRVhQID0gL14oXGR7NH0pLShcZFxkKSQvOw0KLXZhciBUSU1FX1JFR0VYUCA9IC9eKFxkXGQpOihcZFxkKSg/OjooXGRcZCkoXC5cZHsxLDN9KT8pPyQvOw0KLXZhciBERUZBVUxUX1JFR0VYUCA9IC8oXHMrfF4pZGVmYXVsdChccyt8JCkvOw0KLQ0KLXZhciAkbmdNb2RlbE1pbkVyciA9IG5ldyBtaW5FcnIoJ25nTW9kZWwnKTsNCi0NCi12YXIgaW5wdXRUeXBlID0gew0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgaW5wdXQNCi0gICAqIEBuYW1lIGlucHV0W3RleHRdDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBTdGFuZGFyZCBIVE1MIHRleHQgaW5wdXQgd2l0aCBhbmd1bGFyIGRhdGEgYmluZGluZywgaW5oZXJpdGVkIGJ5IG1vc3Qgb2YgdGhlIGBpbnB1dGAgZWxlbWVudHMuDQotICAgKg0KLSAgICoNCi0gICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0bw0KLSAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2YNCi0gICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLg0KLSAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW4NCi0gICAqICAgIG1pbmxlbmd0aC4NCi0gICAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNYXhsZW5ndGggU2V0cyBgbWF4bGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbG9uZ2VyIHRoYW4NCi0gICAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZg0KLSAgICogICAgYW55IGxlbmd0aC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gcGF0dGVybiBTaW1pbGFyIHRvIGBuZ1BhdHRlcm5gIGV4Y2VwdCB0aGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgdGhlIGFjdHVhbCBzdHJpbmcNCi0gICAqICAgIHRoYXQgY29udGFpbnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBib2R5IHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24NCi0gICAqICAgIGFzIGluIHRoZSBuZ1BhdHRlcm4gZGlyZWN0aXZlLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1BhdHRlcm4gU2V0cyBgcGF0dGVybmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIG5nTW9kZWwgdmFsdWUgZG9lcyBub3QgbWF0Y2gNCi0gICAqICAgIGEgUmVnRXhwIGZvdW5kIGJ5IGV2YWx1YXRpbmcgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgYXR0cmlidXRlIHZhbHVlLg0KLSAgICogICAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgUmVnRXhwIG9iamVjdCB0aGVuIHRoaXMgaXMgdXNlZCBkaXJlY3RseS4NCi0gICAqICAgIElmIHRoZSBleHByZXNzaW9uIGlzIGEgc3RyaW5nIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBSZWdFeHAgYWZ0ZXIgd3JhcHBpbmcgaXQgaW4gYF5gIGFuZCBgJGANCi0gICAqICAgIGNoYXJhY3RlcnMuIEZvciBpbnN0YW5jZSwgYCJhYmMiYCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgbmV3IFJlZ0V4cCgnXmFiYyQnKWAuDQotICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXINCi0gICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuDQotICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBbbmdUcmltPXRydWVdIElmIHNldCB0byBmYWxzZSBBbmd1bGFyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgdHJpbSB0aGUgaW5wdXQuDQotICAgKiAgICBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvciBpbnB1dFt0eXBlPXBhc3N3b3JkXSBjb250cm9scywgd2hpY2ggd2lsbCBuZXZlciB0cmltIHRoZQ0KLSAgICogICAgaW5wdXQuDQotICAgKg0KLSAgICogQGV4YW1wbGUNCi0gICAgICA8ZXhhbXBsZSBuYW1lPSJ0ZXh0LWlucHV0LWRpcmVjdGl2ZSIgbW9kdWxlPSJ0ZXh0SW5wdXRFeGFtcGxlIj4NCi0gICAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICAgIDxzY3JpcHQ+DQotICAgICAgICAgICBhbmd1bGFyLm1vZHVsZSgndGV4dElucHV0RXhhbXBsZScsIFtdKQ0KLSAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAgICAgICRzY29wZS50ZXh0ID0gJ2d1ZXN0JzsNCi0gICAgICAgICAgICAgICAkc2NvcGUud29yZCA9IC9eXHMqXHcqXHMqJC87DQotICAgICAgICAgICAgIH1dKTsNCi0gICAgICAgICA8L3NjcmlwdD4NCi0gICAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgICAgICAgIFNpbmdsZSB3b3JkOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iaW5wdXQiIG5nLW1vZGVsPSJ0ZXh0Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1wYXR0ZXJuPSJ3b3JkIiByZXF1aXJlZCBuZy10cmltPSJmYWxzZSI+DQotICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQiPg0KLSAgICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+DQotICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucGF0dGVybiI+DQotICAgICAgICAgICAgIFNpbmdsZSB3b3JkIG9ubHkhPC9zcGFuPg0KLQ0KLSAgICAgICAgICAgPHR0PnRleHQgPSB7e3RleHR9fTwvdHQ+PGJyLz4NCi0gICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+DQotICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPg0KLSAgICAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz4NCi0gICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4NCi0gICAgICAgICAgPC9mb3JtPg0KLSAgICAgICAgPC9maWxlPg0KLSAgICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgICAgIHZhciB0ZXh0ID0gZWxlbWVudChieS5iaW5kaW5nKCd0ZXh0JykpOw0KLSAgICAgICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7DQotICAgICAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3RleHQnKSk7DQotDQotICAgICAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9Db250YWluKCdndWVzdCcpOw0KLSAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOw0KLSAgICAgICAgICB9KTsNCi0NCi0gICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTsNCi0gICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnJyk7DQotDQotICAgICAgICAgICAgZXhwZWN0KHRleHQuZ2V0VGV4dCgpKS50b0VxdWFsKCd0ZXh0ID0nKTsNCi0gICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7DQotICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgbXVsdGkgd29yZCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7DQotICAgICAgICAgICAgaW5wdXQuc2VuZEtleXMoJ2hlbGxvIHdvcmxkJyk7DQotDQotICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIDwvZmlsZT4NCi0gICAgICA8L2V4YW1wbGU+DQotICAgKi8NCi0gICd0ZXh0JzogdGV4dElucHV0VHlwZSwNCi0NCi0gICAgLyoqDQotICAgICAqIEBuZ2RvYyBpbnB1dA0KLSAgICAgKiBAbmFtZSBpbnB1dFtkYXRlXQ0KLSAgICAgKg0KLSAgICAgKiBAZGVzY3JpcHRpb24NCi0gICAgICogSW5wdXQgd2l0aCBkYXRlIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uLiBJbiBicm93c2VycyB0aGF0IGRvIG5vdCB5ZXQgc3VwcG9ydA0KLSAgICAgKiB0aGUgSFRNTDUgZGF0ZSBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRleHQgbXVzdCBiZSBlbnRlcmVkIGluIGEgdmFsaWQgSVNPLTg2MDENCi0gICAgICogZGF0ZSBmb3JtYXQgKHl5eXktTU0tZGQpLCBmb3IgZXhhbXBsZTogYDIwMDktMDEtMDZgLiBTaW5jZSBtYW55DQotICAgICAqIG1vZGVybiBicm93c2VycyBkbyBub3QgeWV0IHN1cHBvcnQgdGhpcyBpbnB1dCB0eXBlLCBpdCBpcyBpbXBvcnRhbnQgdG8gcHJvdmlkZSBjdWVzIHRvIHVzZXJzIG9uIHRoZQ0KLSAgICAgKiBleHBlY3RlZCBpbnB1dCBmb3JtYXQgdmlhIGEgcGxhY2Vob2xkZXIgb3IgbGFiZWwuDQotICAgICAqDQotICAgICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLg0KLSAgICAgKiBJbnZhbGlkIGBEYXRlYCBvYmplY3RzIChkYXRlcyB3aG9zZSBgZ2V0VGltZSgpYCBpcyBgTmFOYCkgd2lsbCBiZSByZW5kZXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuDQotICAgICAqDQotICAgICAqIFRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgY2FuIGJlIGRlZmluZWQgdXNpbmcNCi0gICAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30uIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uDQotICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4NCi0gICAgICogQHBhcmFtIHtzdHJpbmc9fSBtaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgbGVzcyB0aGFuIGBtaW5gLiBUaGlzIG11c3QgYmUgYQ0KLSAgICAgKiB2YWxpZCBJU08gZGF0ZSBzdHJpbmcgKHl5eXktTU0tZGQpLg0KLSAgICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuIFRoaXMgbXVzdCBiZQ0KLSAgICAgKiBhIHZhbGlkIElTTyBkYXRlIHN0cmluZyAoeXl5eS1NTS1kZCkuDQotICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC4NCi0gICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvDQotICAgICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mDQotICAgICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLg0KLSAgICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXINCi0gICAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC4NCi0gICAgICoNCi0gICAgICogQGV4YW1wbGUNCi0gICAgIDxleGFtcGxlIG5hbWU9ImRhdGUtaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9ImRhdGVJbnB1dEV4YW1wbGUiPg0KLSAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgIDxzY3JpcHQ+DQotICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdkYXRlSW5wdXRFeGFtcGxlJywgW10pDQotICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0RhdGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsNCi0gICAgICAgICAgICAgICRzY29wZS52YWx1ZSA9IG5ldyBEYXRlKDIwMTMsIDksIDIyKTsNCi0gICAgICAgICAgICB9XSk7DQotICAgICAgIDwvc2NyaXB0Pg0KLSAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkRhdGVDb250cm9sbGVyIGFzIGRhdGVDdHJsIj4NCi0gICAgICAgICAgUGljayBhIGRhdGUgaW4gMjAxMzoNCi0gICAgICAgICAgPGlucHV0IHR5cGU9ImRhdGUiIGlkPSJleGFtcGxlSW5wdXQiIG5hbWU9ImlucHV0IiBuZy1tb2RlbD0idmFsdWUiDQotICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0ieXl5eS1NTS1kZCIgbWluPSIyMDEzLTAxLTAxIiBtYXg9IjIwMTMtMTItMzEiIHJlcXVpcmVkIC8+DQotICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZCI+DQotICAgICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+DQotICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci5kYXRlIj4NCi0gICAgICAgICAgICAgIE5vdCBhIHZhbGlkIGRhdGUhPC9zcGFuPg0KLSAgICAgICAgICAgPHR0PnZhbHVlID0ge3t2YWx1ZSB8IGRhdGU6ICJ5eXl5LU1NLWRkIn19PC90dD48YnIvPg0KLSAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz4NCi0gICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+DQotICAgICAgICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnIvPg0KLSAgICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPg0KLSAgICAgICA8L2Zvcm0+DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQoYnkuYmluZGluZygndmFsdWUgfCBkYXRlOiAieXl5eS1NTS1kZCInKSk7DQotICAgICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7DQotICAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKTsNCi0NCi0gICAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0DQotICAgICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzDQotICAgICAgICAvLyBmb3IgdmFyaW91cyBicm93c2VycyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3Byb3RyYWN0b3IvaXNzdWVzLzU2MikuDQotICAgICAgICBmdW5jdGlvbiBzZXRJbnB1dCh2YWwpIHsNCi0gICAgICAgICAgLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhbmQgZm9yY2UgdmFsaWRhdGlvbi4NCi0gICAgICAgICAgdmFyIHNjciA9ICJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyAiICsNCi0gICAgICAgICAgImlwdC52YWx1ZSA9ICciICsgdmFsICsgIic7IiArDQotICAgICAgICAgICJhbmd1bGFyLmVsZW1lbnQoaXB0KS5zY29wZSgpLiRhcHBseShmdW5jdGlvbihzKSB7IHMubXlGb3JtW2lwdC5uYW1lXS4kc2V0Vmlld1ZhbHVlKCciICsgdmFsICsgIicpOyB9KTsiOw0KLSAgICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzIwMTMtMTAtMjInKTsNCi0gICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gdHJ1ZScpOw0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgc2V0SW5wdXQoJycpOw0KLSAgICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0VxdWFsKCd2YWx1ZSA9Jyk7DQotICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBvdmVyIG1heCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICBzZXRJbnB1dCgnMjAxNS0wMS0wMScpOw0KLSAgICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJycpOw0KLSAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpOw0KLSAgICAgICAgfSk7DQotICAgICA8L2ZpbGU+DQotICAgICA8L2V4YW1wbGU+DQotICAgICAqLw0KLSAgJ2RhdGUnOiBjcmVhdGVEYXRlSW5wdXRUeXBlKCdkYXRlJywgREFURV9SRUdFWFAsDQotICAgICAgICAgY3JlYXRlRGF0ZVBhcnNlcihEQVRFX1JFR0VYUCwgWyd5eXl5JywgJ01NJywgJ2RkJ10pLA0KLSAgICAgICAgICd5eXl5LU1NLWRkJyksDQotDQotICAgLyoqDQotICAgICogQG5nZG9jIGlucHV0DQotICAgICogQG5hbWUgaW5wdXRbZGF0ZXRpbWUtbG9jYWxdDQotICAgICoNCi0gICAgKiBAZGVzY3JpcHRpb24NCi0gICAgKiBJbnB1dCB3aXRoIGRhdGV0aW1lIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uLiBJbiBicm93c2VycyB0aGF0IGRvIG5vdCB5ZXQgc3VwcG9ydA0KLSAgICAqIHRoZSBIVE1MNSBkYXRlIGlucHV0LCBhIHRleHQgZWxlbWVudCB3aWxsIGJlIHVzZWQuIEluIHRoYXQgY2FzZSwgdGhlIHRleHQgbXVzdCBiZSBlbnRlcmVkIGluIGEgdmFsaWQgSVNPLTg2MDENCi0gICAgKiBsb2NhbCBkYXRldGltZSBmb3JtYXQgKHl5eXktTU0tZGRUSEg6bW06c3MpLCBmb3IgZXhhbXBsZTogYDIwMTAtMTItMjhUMTQ6NTc6MDBgLg0KLSAgICAqDQotICAgICogVGhlIG1vZGVsIG11c3QgYWx3YXlzIGJlIGEgRGF0ZSBvYmplY3QsIG90aGVyd2lzZSBBbmd1bGFyIHdpbGwgdGhyb3cgYW4gZXJyb3IuDQotICAgICogSW52YWxpZCBgRGF0ZWAgb2JqZWN0cyAoZGF0ZXMgd2hvc2UgYGdldFRpbWUoKWAgaXMgYE5hTmApIHdpbGwgYmUgcmVuZGVyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLg0KLSAgICAqDQotICAgICogVGhlIHRpbWV6b25lIHRvIGJlIHVzZWQgdG8gcmVhZC93cml0ZSB0aGUgYERhdGVgIGluc3RhbmNlIGluIHRoZSBtb2RlbCBjYW4gYmUgZGVmaW5lZCB1c2luZw0KLSAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9LiBCeSBkZWZhdWx0LCB0aGlzIGlzIHRoZSB0aW1lem9uZSBvZiB0aGUgYnJvd3Nlci4NCi0gICAgKg0KLSAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4NCi0gICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuDQotICAgICogQHBhcmFtIHtzdHJpbmc9fSBtaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgbGVzcyB0aGFuIGBtaW5gLiBUaGlzIG11c3QgYmUgYQ0KLSAgICAqIHZhbGlkIElTTyBkYXRldGltZSBmb3JtYXQgKHl5eXktTU0tZGRUSEg6bW06c3MpLg0KLSAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbWF4IFNldHMgdGhlIGBtYXhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGdyZWF0ZXIgdGhhbiBgbWF4YC4gVGhpcyBtdXN0IGJlDQotICAgICogYSB2YWxpZCBJU08gZGF0ZXRpbWUgZm9ybWF0ICh5eXl5LU1NLWRkVEhIOm1tOnNzKS4NCi0gICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuDQotICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvDQotICAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2YNCi0gICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4NCi0gICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXINCi0gICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50Lg0KLSAgICAqDQotICAgICogQGV4YW1wbGUNCi0gICAgPGV4YW1wbGUgbmFtZT0iZGF0ZXRpbWVsb2NhbC1pbnB1dC1kaXJlY3RpdmUiIG1vZHVsZT0iZGF0ZUV4YW1wbGUiPg0KLSAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8c2NyaXB0Pg0KLSAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2RhdGVFeGFtcGxlJywgW10pDQotICAgICAgICAgIC5jb250cm9sbGVyKCdEYXRlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgICAgJHNjb3BlLnZhbHVlID0gbmV3IERhdGUoMjAxMCwgMTEsIDI4LCAxNCwgNTcpOw0KLSAgICAgICAgICB9XSk7DQotICAgICAgPC9zY3JpcHQ+DQotICAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJEYXRlQ29udHJvbGxlciBhcyBkYXRlQ3RybCI+DQotICAgICAgICBQaWNrIGEgZGF0ZSBiZXR3ZWVuIGluIDIwMTM6DQotICAgICAgICA8aW5wdXQgdHlwZT0iZGF0ZXRpbWUtbG9jYWwiIGlkPSJleGFtcGxlSW5wdXQiIG5hbWU9ImlucHV0IiBuZy1tb2RlbD0idmFsdWUiDQotICAgICAgICAgICAgcGxhY2Vob2xkZXI9Inl5eXktTU0tZGRUSEg6bW06c3MiIG1pbj0iMjAwMS0wMS0wMVQwMDowMDowMCIgbWF4PSIyMDEzLTEyLTMxVDAwOjAwOjAwIiByZXF1aXJlZCAvPg0KLSAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkIj4NCi0gICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+DQotICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IuZGF0ZXRpbWVsb2NhbCI+DQotICAgICAgICAgICAgTm90IGEgdmFsaWQgZGF0ZSE8L3NwYW4+DQotICAgICAgICA8dHQ+dmFsdWUgPSB7e3ZhbHVlIHwgZGF0ZTogInl5eXktTU0tZGRUSEg6bW06c3MifX08L3R0Pjxici8+DQotICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiR2YWxpZCA9IHt7bXlGb3JtLmlucHV0LiR2YWxpZH19PC90dD48YnIvPg0KLSAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz4NCi0gICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+DQotICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxici8+DQotICAgICAgPC9mb3JtPg0KLSAgICA8L2ZpbGU+DQotICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQoYnkuYmluZGluZygndmFsdWUgfCBkYXRlOiAieXl5eS1NTS1kZFRISDptbTpzcyInKSk7DQotICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOw0KLSAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpOw0KLQ0KLSAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0DQotICAgICAgLy8gc2VuZGluZyBrZXlzIHRvIGFsbCBrbm93biBIVE1MNSBpbnB1dCBjb250cm9scw0KLSAgICAgIC8vIGZvciB2YXJpb3VzIGJyb3dzZXJzIChodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9wcm90cmFjdG9yL2lzc3Vlcy81NjIpLg0KLSAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkgew0KLSAgICAgICAgLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhbmQgZm9yY2UgdmFsaWRhdGlvbi4NCi0gICAgICAgIHZhciBzY3IgPSAidmFyIGlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlSW5wdXQnKTsgIiArDQotICAgICAgICAiaXB0LnZhbHVlID0gJyIgKyB2YWwgKyAiJzsiICsNCi0gICAgICAgICJhbmd1bGFyLmVsZW1lbnQoaXB0KS5zY29wZSgpLiRhcHBseShmdW5jdGlvbihzKSB7IHMubXlGb3JtW2lwdC5uYW1lXS4kc2V0Vmlld1ZhbHVlKCciICsgdmFsICsgIicpOyB9KTsiOw0KLSAgICAgICAgYnJvd3Nlci5leGVjdXRlU2NyaXB0KHNjcik7DQotICAgICAgfQ0KLQ0KLSAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9Db250YWluKCcyMDEwLTEyLTI4VDE0OjU3OjAwJyk7DQotICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSB0cnVlJyk7DQotICAgICAgfSk7DQotDQotICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7DQotICAgICAgICBzZXRJbnB1dCgnJyk7DQotICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0VxdWFsKCd2YWx1ZSA9Jyk7DQotICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpOw0KLSAgICAgIH0pOw0KLQ0KLSAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBvdmVyIG1heCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgc2V0SW5wdXQoJzIwMTUtMDEtMDFUMjM6NTk6MDAnKTsNCi0gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7DQotICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpOw0KLSAgICAgIH0pOw0KLSAgICA8L2ZpbGU+DQotICAgIDwvZXhhbXBsZT4NCi0gICAgKi8NCi0gICdkYXRldGltZS1sb2NhbCc6IGNyZWF0ZURhdGVJbnB1dFR5cGUoJ2RhdGV0aW1lbG9jYWwnLCBEQVRFVElNRUxPQ0FMX1JFR0VYUCwNCi0gICAgICBjcmVhdGVEYXRlUGFyc2VyKERBVEVUSU1FTE9DQUxfUkVHRVhQLCBbJ3l5eXknLCAnTU0nLCAnZGQnLCAnSEgnLCAnbW0nLCAnc3MnLCAnc3NzJ10pLA0KLSAgICAgICd5eXl5LU1NLWRkVEhIOm1tOnNzLnNzcycpLA0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgaW5wdXQNCi0gICAqIEBuYW1lIGlucHV0W3RpbWVdDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBJbnB1dCB3aXRoIHRpbWUgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHlldCBzdXBwb3J0DQotICAgKiB0aGUgSFRNTDUgZGF0ZSBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxDQotICAgKiBsb2NhbCB0aW1lIGZvcm1hdCAoSEg6bW06c3MpLCBmb3IgZXhhbXBsZTogYDE0OjU3OjAwYC4gTW9kZWwgbXVzdCBiZSBhIERhdGUgb2JqZWN0LiBUaGlzIGJpbmRpbmcgd2lsbCBhbHdheXMgb3V0cHV0IGENCi0gICAqIERhdGUgb2JqZWN0IHRvIHRoZSBtb2RlbCBvZiBKYW51YXJ5IDEsIDE5NzAsIG9yIGxvY2FsIGRhdGUgYG5ldyBEYXRlKDE5NzAsIDAsIDEsIEhILCBtbSwgc3MpYC4NCi0gICAqDQotICAgKiBUaGUgbW9kZWwgbXVzdCBhbHdheXMgYmUgYSBEYXRlIG9iamVjdCwgb3RoZXJ3aXNlIEFuZ3VsYXIgd2lsbCB0aHJvdyBhbiBlcnJvci4NCi0gICAqIEludmFsaWQgYERhdGVgIG9iamVjdHMgKGRhdGVzIHdob3NlIGBnZXRUaW1lKClgIGlzIGBOYU5gKSB3aWxsIGJlIHJlbmRlcmVkIGFzIGFuIGVtcHR5IHN0cmluZy4NCi0gICAqDQotICAgKiBUaGUgdGltZXpvbmUgdG8gYmUgdXNlZCB0byByZWFkL3dyaXRlIHRoZSBgRGF0ZWAgaW5zdGFuY2UgaW4gdGhlIG1vZGVsIGNhbiBiZSBkZWZpbmVkIHVzaW5nDQotICAgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nTW9kZWxPcHRpb25zIG5nTW9kZWxPcHRpb25zfS4gQnkgZGVmYXVsdCwgdGhpcyBpcyB0aGUgdGltZXpvbmUgb2YgdGhlIGJyb3dzZXIuDQotICAgKg0KLSAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBtaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgbGVzcyB0aGFuIGBtaW5gLiBUaGlzIG11c3QgYmUgYQ0KLSAgICogdmFsaWQgSVNPIHRpbWUgZm9ybWF0IChISDptbTpzcykuDQotICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuIFRoaXMgbXVzdCBiZSBhDQotICAgKiB2YWxpZCBJU08gdGltZSBmb3JtYXQgKEhIOm1tOnNzKS4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0bw0KLSAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2YNCi0gICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyDQotICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50Lg0KLSAgICoNCi0gICAqIEBleGFtcGxlDQotICAgPGV4YW1wbGUgbmFtZT0idGltZS1pbnB1dC1kaXJlY3RpdmUiIG1vZHVsZT0idGltZUV4YW1wbGUiPg0KLSAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgPHNjcmlwdD4NCi0gICAgICBhbmd1bGFyLm1vZHVsZSgndGltZUV4YW1wbGUnLCBbXSkNCi0gICAgICAgIC5jb250cm9sbGVyKCdEYXRlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgICRzY29wZS52YWx1ZSA9IG5ldyBEYXRlKDE5NzAsIDAsIDEsIDE0LCA1NywgMCk7DQotICAgICAgICB9XSk7DQotICAgICA8L3NjcmlwdD4NCi0gICAgIDxmb3JtIG5hbWU9Im15Rm9ybSIgbmctY29udHJvbGxlcj0iRGF0ZUNvbnRyb2xsZXIgYXMgZGF0ZUN0cmwiPg0KLSAgICAgICAgUGljayBhIGJldHdlZW4gOGFtIGFuZCA1cG06DQotICAgICAgICA8aW5wdXQgdHlwZT0idGltZSIgaWQ9ImV4YW1wbGVJbnB1dCIgbmFtZT0iaW5wdXQiIG5nLW1vZGVsPSJ2YWx1ZSINCi0gICAgICAgICAgICBwbGFjZWhvbGRlcj0iSEg6bW06c3MiIG1pbj0iMDg6MDA6MDAiIG1heD0iMTc6MDA6MDAiIHJlcXVpcmVkIC8+DQotICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQiPg0KLSAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4NCi0gICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci50aW1lIj4NCi0gICAgICAgICAgICBOb3QgYSB2YWxpZCBkYXRlITwvc3Bhbj4NCi0gICAgICAgIDx0dD52YWx1ZSA9IHt7dmFsdWUgfCBkYXRlOiAiSEg6bW06c3MifX08L3R0Pjxici8+DQotICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiR2YWxpZCA9IHt7bXlGb3JtLmlucHV0LiR2YWxpZH19PC90dD48YnIvPg0KLSAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz4NCi0gICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+DQotICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxici8+DQotICAgICA8L2Zvcm0+DQotICAgPC9maWxlPg0KLSAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQoYnkuYmluZGluZygndmFsdWUgfCBkYXRlOiAiSEg6bW06c3MiJykpOw0KLSAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTsNCi0gICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKTsNCi0NCi0gICAgICAvLyBjdXJyZW50bHkgcHJvdHJhY3Rvci93ZWJkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydA0KLSAgICAgIC8vIHNlbmRpbmcga2V5cyB0byBhbGwga25vd24gSFRNTDUgaW5wdXQgY29udHJvbHMNCi0gICAgICAvLyBmb3IgdmFyaW91cyBicm93c2VycyAoaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNTYyKS4NCi0gICAgICBmdW5jdGlvbiBzZXRJbnB1dCh2YWwpIHsNCi0gICAgICAgIC8vIHNldCB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgYW5kIGZvcmNlIHZhbGlkYXRpb24uDQotICAgICAgICB2YXIgc2NyID0gInZhciBpcHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhhbXBsZUlucHV0Jyk7ICIgKw0KLSAgICAgICAgImlwdC52YWx1ZSA9ICciICsgdmFsICsgIic7IiArDQotICAgICAgICAiYW5ndWxhci5lbGVtZW50KGlwdCkuc2NvcGUoKS4kYXBwbHkoZnVuY3Rpb24ocykgeyBzLm15Rm9ybVtpcHQubmFtZV0uJHNldFZpZXdWYWx1ZSgnIiArIHZhbCArICInKTsgfSk7IjsNCi0gICAgICAgIGJyb3dzZXIuZXhlY3V0ZVNjcmlwdChzY3IpOw0KLSAgICAgIH0NCi0NCi0gICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMTQ6NTc6MDAnKTsNCi0gICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IHRydWUnKTsNCi0gICAgICB9KTsNCi0NCi0gICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHsNCi0gICAgICAgIHNldElucHV0KCcnKTsNCi0gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTsNCi0gICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7DQotICAgICAgfSk7DQotDQotICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG92ZXIgbWF4JywgZnVuY3Rpb24oKSB7DQotICAgICAgICBzZXRJbnB1dCgnMjM6NTk6MDAnKTsNCi0gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7DQotICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpOw0KLSAgICAgIH0pOw0KLSAgIDwvZmlsZT4NCi0gICA8L2V4YW1wbGU+DQotICAgKi8NCi0gICd0aW1lJzogY3JlYXRlRGF0ZUlucHV0VHlwZSgndGltZScsIFRJTUVfUkVHRVhQLA0KLSAgICAgIGNyZWF0ZURhdGVQYXJzZXIoVElNRV9SRUdFWFAsIFsnSEgnLCAnbW0nLCAnc3MnLCAnc3NzJ10pLA0KLSAgICAgJ0hIOm1tOnNzLnNzcycpLA0KLQ0KLSAgIC8qKg0KLSAgICAqIEBuZ2RvYyBpbnB1dA0KLSAgICAqIEBuYW1lIGlucHV0W3dlZWtdDQotICAgICoNCi0gICAgKiBAZGVzY3JpcHRpb24NCi0gICAgKiBJbnB1dCB3aXRoIHdlZWstb2YtdGhlLXllYXIgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24gdG8gRGF0ZS4gSW4gYnJvd3NlcnMgdGhhdCBkbyBub3QgeWV0IHN1cHBvcnQNCi0gICAgKiB0aGUgSFRNTDUgd2VlayBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxDQotICAgICogd2VlayBmb3JtYXQgKHl5eXktVyMjKSwgZm9yIGV4YW1wbGU6IGAyMDEzLVcwMmAuDQotICAgICoNCi0gICAgKiBUaGUgbW9kZWwgbXVzdCBhbHdheXMgYmUgYSBEYXRlIG9iamVjdCwgb3RoZXJ3aXNlIEFuZ3VsYXIgd2lsbCB0aHJvdyBhbiBlcnJvci4NCi0gICAgKiBJbnZhbGlkIGBEYXRlYCBvYmplY3RzIChkYXRlcyB3aG9zZSBgZ2V0VGltZSgpYCBpcyBgTmFOYCkgd2lsbCBiZSByZW5kZXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuDQotICAgICoNCi0gICAgKiBUaGUgdGltZXpvbmUgdG8gYmUgdXNlZCB0byByZWFkL3dyaXRlIHRoZSBgRGF0ZWAgaW5zdGFuY2UgaW4gdGhlIG1vZGVsIGNhbiBiZSBkZWZpbmVkIHVzaW5nDQotICAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30uIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyLg0KLSAgICAqDQotICAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLg0KLSAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4NCi0gICAgKiBAcGFyYW0ge3N0cmluZz19IG1pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBsZXNzIHRoYW4gYG1pbmAuIFRoaXMgbXVzdCBiZSBhDQotICAgICogdmFsaWQgSVNPIHdlZWsgZm9ybWF0ICh5eXl5LVcjIykuDQotICAgICogQHBhcmFtIHtzdHJpbmc9fSBtYXggU2V0cyB0aGUgYG1heGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgZ3JlYXRlciB0aGFuIGBtYXhgLiBUaGlzIG11c3QgYmUNCi0gICAgKiBhIHZhbGlkIElTTyB3ZWVrIGZvcm1hdCAoeXl5eS1XIyMpLg0KLSAgICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC4NCi0gICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG8NCi0gICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZg0KLSAgICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLg0KLSAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcg0KLSAgICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuDQotICAgICoNCi0gICAgKiBAZXhhbXBsZQ0KLSAgICA8ZXhhbXBsZSBuYW1lPSJ3ZWVrLWlucHV0LWRpcmVjdGl2ZSIgbW9kdWxlPSJ3ZWVrRXhhbXBsZSI+DQotICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgIDxzY3JpcHQ+DQotICAgICAgYW5ndWxhci5tb2R1bGUoJ3dlZWtFeGFtcGxlJywgW10pDQotICAgICAgICAuY29udHJvbGxlcignRGF0ZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAkc2NvcGUudmFsdWUgPSBuZXcgRGF0ZSgyMDEzLCAwLCAzKTsNCi0gICAgICAgIH1dKTsNCi0gICAgICA8L3NjcmlwdD4NCi0gICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkRhdGVDb250cm9sbGVyIGFzIGRhdGVDdHJsIj4NCi0gICAgICAgIFBpY2sgYSBkYXRlIGJldHdlZW4gaW4gMjAxMzoNCi0gICAgICAgIDxpbnB1dCBpZD0iZXhhbXBsZUlucHV0IiB0eXBlPSJ3ZWVrIiBuYW1lPSJpbnB1dCIgbmctbW9kZWw9InZhbHVlIg0KLSAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJZWVlZLVcjIyIgbWluPSIyMDEyLVczMiIgbWF4PSIyMDEzLVc1MiIgcmVxdWlyZWQgLz4NCi0gICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZCI+DQotICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPg0KLSAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLndlZWsiPg0KLSAgICAgICAgICAgIE5vdCBhIHZhbGlkIGRhdGUhPC9zcGFuPg0KLSAgICAgICAgPHR0PnZhbHVlID0ge3t2YWx1ZSB8IGRhdGU6ICJ5eXl5LVd3dyJ9fTwvdHQ+PGJyLz4NCi0gICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+DQotICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPg0KLSAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz4NCi0gICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4NCi0gICAgICA8L2Zvcm0+DQotICAgIDwvZmlsZT4NCi0gICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCd2YWx1ZSB8IGRhdGU6ICJ5eXl5LVd3dyInKSk7DQotICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOw0KLSAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpOw0KLQ0KLSAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0DQotICAgICAgLy8gc2VuZGluZyBrZXlzIHRvIGFsbCBrbm93biBIVE1MNSBpbnB1dCBjb250cm9scw0KLSAgICAgIC8vIGZvciB2YXJpb3VzIGJyb3dzZXJzIChodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9wcm90cmFjdG9yL2lzc3Vlcy81NjIpLg0KLSAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkgew0KLSAgICAgICAgLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhbmQgZm9yY2UgdmFsaWRhdGlvbi4NCi0gICAgICAgIHZhciBzY3IgPSAidmFyIGlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlSW5wdXQnKTsgIiArDQotICAgICAgICAiaXB0LnZhbHVlID0gJyIgKyB2YWwgKyAiJzsiICsNCi0gICAgICAgICJhbmd1bGFyLmVsZW1lbnQoaXB0KS5zY29wZSgpLiRhcHBseShmdW5jdGlvbihzKSB7IHMubXlGb3JtW2lwdC5uYW1lXS4kc2V0Vmlld1ZhbHVlKCciICsgdmFsICsgIicpOyB9KTsiOw0KLSAgICAgICAgYnJvd3Nlci5leGVjdXRlU2NyaXB0KHNjcik7DQotICAgICAgfQ0KLQ0KLSAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9Db250YWluKCcyMDEzLVcwMScpOw0KLSAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gdHJ1ZScpOw0KLSAgICAgIH0pOw0KLQ0KLSAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgc2V0SW5wdXQoJycpOw0KLSAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpOw0KLSAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTsNCi0gICAgICB9KTsNCi0NCi0gICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgb3ZlciBtYXgnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgIHNldElucHV0KCcyMDE1LVcwMScpOw0KLSAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9Db250YWluKCcnKTsNCi0gICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7DQotICAgICAgfSk7DQotICAgIDwvZmlsZT4NCi0gICAgPC9leGFtcGxlPg0KLSAgICAqLw0KLSAgJ3dlZWsnOiBjcmVhdGVEYXRlSW5wdXRUeXBlKCd3ZWVrJywgV0VFS19SRUdFWFAsIHdlZWtQYXJzZXIsICd5eXl5LVd3dycpLA0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgaW5wdXQNCi0gICAqIEBuYW1lIGlucHV0W21vbnRoXQ0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogSW5wdXQgd2l0aCBtb250aCB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbi4gSW4gYnJvd3NlcnMgdGhhdCBkbyBub3QgeWV0IHN1cHBvcnQNCi0gICAqIHRoZSBIVE1MNSBtb250aCBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxDQotICAgKiBtb250aCBmb3JtYXQgKHl5eXktTU0pLCBmb3IgZXhhbXBsZTogYDIwMDktMDFgLg0KLSAgICoNCi0gICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLg0KLSAgICogSW52YWxpZCBgRGF0ZWAgb2JqZWN0cyAoZGF0ZXMgd2hvc2UgYGdldFRpbWUoKWAgaXMgYE5hTmApIHdpbGwgYmUgcmVuZGVyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLg0KLSAgICogSWYgdGhlIG1vZGVsIGlzIG5vdCBzZXQgdG8gdGhlIGZpcnN0IG9mIHRoZSBtb250aCwgdGhlIG5leHQgdmlldyB0byBtb2RlbCB1cGRhdGUgd2lsbCBzZXQgaXQNCi0gICAqIHRvIHRoZSBmaXJzdCBvZiB0aGUgbW9udGguDQotICAgKg0KLSAgICogVGhlIHRpbWV6b25lIHRvIGJlIHVzZWQgdG8gcmVhZC93cml0ZSB0aGUgYERhdGVgIGluc3RhbmNlIGluIHRoZSBtb2RlbCBjYW4gYmUgZGVmaW5lZCB1c2luZw0KLSAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30uIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbWluYC4gVGhpcyBtdXN0IGJlDQotICAgKiBhIHZhbGlkIElTTyBtb250aCBmb3JtYXQgKHl5eXktTU0pLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBtYXggU2V0cyB0aGUgYG1heGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgZ3JlYXRlciB0aGFuIGBtYXhgLiBUaGlzIG11c3QNCi0gICAqIGJlIGEgdmFsaWQgSVNPIG1vbnRoIGZvcm1hdCAoeXl5eS1NTSkuDQotICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuDQotICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG8NCi0gICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mDQotICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcg0KLSAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC4NCi0gICAqDQotICAgKiBAZXhhbXBsZQ0KLSAgIDxleGFtcGxlIG5hbWU9Im1vbnRoLWlucHV0LWRpcmVjdGl2ZSIgbW9kdWxlPSJtb250aEV4YW1wbGUiPg0KLSAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgPHNjcmlwdD4NCi0gICAgICBhbmd1bGFyLm1vZHVsZSgnbW9udGhFeGFtcGxlJywgW10pDQotICAgICAgICAuY29udHJvbGxlcignRGF0ZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAkc2NvcGUudmFsdWUgPSBuZXcgRGF0ZSgyMDEzLCA5LCAxKTsNCi0gICAgICAgIH1dKTsNCi0gICAgIDwvc2NyaXB0Pg0KLSAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJEYXRlQ29udHJvbGxlciBhcyBkYXRlQ3RybCI+DQotICAgICAgIFBpY2sgYSBtb250aCBpbnQgMjAxMzoNCi0gICAgICAgPGlucHV0IGlkPSJleGFtcGxlSW5wdXQiIHR5cGU9Im1vbnRoIiBuYW1lPSJpbnB1dCIgbmctbW9kZWw9InZhbHVlIg0KLSAgICAgICAgICBwbGFjZWhvbGRlcj0ieXl5eS1NTSIgbWluPSIyMDEzLTAxIiBtYXg9IjIwMTMtMTIiIHJlcXVpcmVkIC8+DQotICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZCI+DQotICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4NCi0gICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLm1vbnRoIj4NCi0gICAgICAgICAgTm90IGEgdmFsaWQgbW9udGghPC9zcGFuPg0KLSAgICAgICA8dHQ+dmFsdWUgPSB7e3ZhbHVlIHwgZGF0ZTogInl5eXktTU0ifX08L3R0Pjxici8+DQotICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+DQotICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+DQotICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+DQotICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4NCi0gICAgIDwvZm9ybT4NCi0gICA8L2ZpbGU+DQotICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCd2YWx1ZSB8IGRhdGU6ICJ5eXl5LU1NIicpKTsNCi0gICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7DQotICAgICAgdmFyIGlucHV0ID0gZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSk7DQotDQotICAgICAgLy8gY3VycmVudGx5IHByb3RyYWN0b3Ivd2ViZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQNCi0gICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzDQotICAgICAgLy8gZm9yIHZhcmlvdXMgYnJvd3NlcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3Byb3RyYWN0b3IvaXNzdWVzLzU2MikuDQotICAgICAgZnVuY3Rpb24gc2V0SW5wdXQodmFsKSB7DQotICAgICAgICAvLyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFuZCBmb3JjZSB2YWxpZGF0aW9uLg0KLSAgICAgICAgdmFyIHNjciA9ICJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyAiICsNCi0gICAgICAgICJpcHQudmFsdWUgPSAnIiArIHZhbCArICInOyIgKw0KLSAgICAgICAgImFuZ3VsYXIuZWxlbWVudChpcHQpLnNjb3BlKCkuJGFwcGx5KGZ1bmN0aW9uKHMpIHsgcy5teUZvcm1baXB0Lm5hbWVdLiRzZXRWaWV3VmFsdWUoJyIgKyB2YWwgKyAiJyk7IH0pOyI7DQotICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTsNCi0gICAgICB9DQotDQotICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7DQotICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzIwMTMtMTAnKTsNCi0gICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IHRydWUnKTsNCi0gICAgICB9KTsNCi0NCi0gICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHsNCi0gICAgICAgIHNldElucHV0KCcnKTsNCi0gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTsNCi0gICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7DQotICAgICAgfSk7DQotDQotICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG92ZXIgbWF4JywgZnVuY3Rpb24oKSB7DQotICAgICAgICBzZXRJbnB1dCgnMjAxNS0wMScpOw0KLSAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9Db250YWluKCcnKTsNCi0gICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7DQotICAgICAgfSk7DQotICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gICAqLw0KLSAgJ21vbnRoJzogY3JlYXRlRGF0ZUlucHV0VHlwZSgnbW9udGgnLCBNT05USF9SRUdFWFAsDQotICAgICBjcmVhdGVEYXRlUGFyc2VyKE1PTlRIX1JFR0VYUCwgWyd5eXl5JywgJ01NJ10pLA0KLSAgICAgJ3l5eXktTU0nKSwNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIGlucHV0DQotICAgKiBAbmFtZSBpbnB1dFtudW1iZXJdDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBUZXh0IGlucHV0IHdpdGggbnVtYmVyIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uLiBTZXRzIHRoZSBgbnVtYmVyYCB2YWxpZGF0aW9uDQotICAgKiBlcnJvciBpZiBub3QgYSB2YWxpZCBudW1iZXIuDQotICAgKg0KLSAgICogVGhlIG1vZGVsIG11c3QgYWx3YXlzIGJlIGEgbnVtYmVyLCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbWluYC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbWF4IFNldHMgdGhlIGBtYXhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGdyZWF0ZXIgdGhhbiBgbWF4YC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0bw0KLSAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2YNCi0gICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLg0KLSAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW4NCi0gICAqICAgIG1pbmxlbmd0aC4NCi0gICAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNYXhsZW5ndGggU2V0cyBgbWF4bGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbG9uZ2VyIHRoYW4NCi0gICAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZg0KLSAgICogICAgYW55IGxlbmd0aC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gcGF0dGVybiBTaW1pbGFyIHRvIGBuZ1BhdHRlcm5gIGV4Y2VwdCB0aGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgdGhlIGFjdHVhbCBzdHJpbmcNCi0gICAqICAgIHRoYXQgY29udGFpbnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBib2R5IHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24NCi0gICAqICAgIGFzIGluIHRoZSBuZ1BhdHRlcm4gZGlyZWN0aXZlLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1BhdHRlcm4gU2V0cyBgcGF0dGVybmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIG5nTW9kZWwgdmFsdWUgZG9lcyBub3QgbWF0Y2gNCi0gICAqICAgIGEgUmVnRXhwIGZvdW5kIGJ5IGV2YWx1YXRpbmcgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgYXR0cmlidXRlIHZhbHVlLg0KLSAgICogICAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgUmVnRXhwIG9iamVjdCB0aGVuIHRoaXMgaXMgdXNlZCBkaXJlY3RseS4NCi0gICAqICAgIElmIHRoZSBleHByZXNzaW9uIGlzIGEgc3RyaW5nIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBSZWdFeHAgYWZ0ZXIgd3JhcHBpbmcgaXQgaW4gYF5gIGFuZCBgJGANCi0gICAqICAgIGNoYXJhY3RlcnMuIEZvciBpbnN0YW5jZSwgYCJhYmMiYCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgbmV3IFJlZ0V4cCgnXmFiYyQnKWAuDQotICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXINCi0gICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuDQotICAgKg0KLSAgICogQGV4YW1wbGUNCi0gICAgICA8ZXhhbXBsZSBuYW1lPSJudW1iZXItaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9Im51bWJlckV4YW1wbGUiPg0KLSAgICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgICAgPHNjcmlwdD4NCi0gICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdudW1iZXJFeGFtcGxlJywgW10pDQotICAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgICAgICAgJHNjb3BlLnZhbHVlID0gMTI7DQotICAgICAgICAgICAgIH1dKTsNCi0gICAgICAgICA8L3NjcmlwdD4NCi0gICAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgICAgICAgIE51bWJlcjogPGlucHV0IHR5cGU9Im51bWJlciIgbmFtZT0iaW5wdXQiIG5nLW1vZGVsPSJ2YWx1ZSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj0iMCIgbWF4PSI5OSIgcmVxdWlyZWQ+DQotICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQiPg0KLSAgICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+DQotICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IubnVtYmVyIj4NCi0gICAgICAgICAgICAgTm90IHZhbGlkIG51bWJlciE8L3NwYW4+DQotICAgICAgICAgICA8dHQ+dmFsdWUgPSB7e3ZhbHVlfX08L3R0Pjxici8+DQotICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiR2YWxpZCA9IHt7bXlGb3JtLmlucHV0LiR2YWxpZH19PC90dD48YnIvPg0KLSAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz4NCi0gICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+DQotICAgICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxici8+DQotICAgICAgICAgIDwvZm9ybT4NCi0gICAgICAgIDwvZmlsZT4NCi0gICAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICAgICB2YXIgdmFsdWUgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3ZhbHVlJykpOw0KLSAgICAgICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7DQotICAgICAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpOw0KLQ0KLSAgICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzEyJyk7DQotICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7DQotICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBpbnB1dC5jbGVhcigpOw0KLSAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCcnKTsNCi0gICAgICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0VxdWFsKCd2YWx1ZSA9Jyk7DQotICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOw0KLSAgICAgICAgICB9KTsNCi0NCi0gICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG92ZXIgbWF4JywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTsNCi0gICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnMTIzJyk7DQotICAgICAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpOw0KLSAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICA8L2ZpbGU+DQotICAgICAgPC9leGFtcGxlPg0KLSAgICovDQotICAnbnVtYmVyJzogbnVtYmVySW5wdXRUeXBlLA0KLQ0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgaW5wdXQNCi0gICAqIEBuYW1lIGlucHV0W3VybF0NCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFRleHQgaW5wdXQgd2l0aCBVUkwgdmFsaWRhdGlvbi4gU2V0cyB0aGUgYHVybGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIGNvbnRlbnQgaXMgbm90IGENCi0gICAqIHZhbGlkIFVSTC4NCi0gICAqDQotICAgKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC13YXJuaW5nIj4NCi0gICAqICoqTm90ZToqKiBgaW5wdXRbdXJsXWAgdXNlcyBhIHJlZ2V4IHRvIHZhbGlkYXRlIHVybHMgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIHJlZ2V4DQotICAgKiB1c2VkIGluIENocm9taXVtLiBJZiB5b3UgbmVlZCBzdHJpY3RlciB2YWxpZGF0aW9uLCB5b3UgY2FuIHVzZSBgbmctcGF0dGVybmAgb3IgbW9kaWZ5DQotICAgKiB0aGUgYnVpbHQtaW4gdmFsaWRhdG9ycyAoc2VlIHRoZSB7QGxpbmsgZ3VpZGUvZm9ybXMgRm9ybXMgZ3VpZGV9KQ0KLSAgICogPC9kaXY+DQotICAgKg0KLSAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvDQotICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZg0KLSAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuDQotICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWlubGVuZ3RoIFNldHMgYG1pbmxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIHNob3J0ZXIgdGhhbg0KLSAgICogICAgbWlubGVuZ3RoLg0KLSAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01heGxlbmd0aCBTZXRzIGBtYXhsZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBsb25nZXIgdGhhbg0KLSAgICogICAgbWF4bGVuZ3RoLiBTZXR0aW5nIHRoZSBhdHRyaWJ1dGUgdG8gYSBuZWdhdGl2ZSBvciBub24tbnVtZXJpYyB2YWx1ZSwgYWxsb3dzIHZpZXcgdmFsdWVzIG9mDQotICAgKiAgICBhbnkgbGVuZ3RoLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBwYXR0ZXJuIFNpbWlsYXIgdG8gYG5nUGF0dGVybmAgZXhjZXB0IHRoYXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyB0aGUgYWN0dWFsIHN0cmluZw0KLSAgICogICAgdGhhdCBjb250YWlucyB0aGUgcmVndWxhciBleHByZXNzaW9uIGJvZHkgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbg0KLSAgICogICAgYXMgaW4gdGhlIG5nUGF0dGVybiBkaXJlY3RpdmUuDQotICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUGF0dGVybiBTZXRzIGBwYXR0ZXJuYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgbmdNb2RlbCB2YWx1ZSBkb2VzIG5vdCBtYXRjaA0KLSAgICogICAgYSBSZWdFeHAgZm91bmQgYnkgZXZhbHVhdGluZyB0aGUgQW5ndWxhciBleHByZXNzaW9uIGdpdmVuIGluIHRoZSBhdHRyaWJ1dGUgdmFsdWUuDQotICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBSZWdFeHAgb2JqZWN0IHRoZW4gdGhpcyBpcyB1c2VkIGRpcmVjdGx5Lg0KLSAgICogICAgSWYgdGhlIGV4cHJlc3Npb24gaXMgYSBzdHJpbmcgdGhlbiBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFJlZ0V4cCBhZnRlciB3cmFwcGluZyBpdCBpbiBgXmAgYW5kIGAkYA0KLSAgICogICAgY2hhcmFjdGVycy4gRm9yIGluc3RhbmNlLCBgImFiYyJgIHdpbGwgYmUgY29udmVydGVkIHRvIGBuZXcgUmVnRXhwKCdeYWJjJCcpYC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcg0KLSAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC4NCi0gICAqDQotICAgKiBAZXhhbXBsZQ0KLSAgICAgIDxleGFtcGxlIG5hbWU9InVybC1pbnB1dC1kaXJlY3RpdmUiIG1vZHVsZT0idXJsRXhhbXBsZSI+DQotICAgICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgICA8c2NyaXB0Pg0KLSAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3VybEV4YW1wbGUnLCBbXSkNCi0gICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsNCi0gICAgICAgICAgICAgICAkc2NvcGUudGV4dCA9ICdodHRwOi8vZ29vZ2xlLmNvbSc7DQotICAgICAgICAgICAgIH1dKTsNCi0gICAgICAgICA8L3NjcmlwdD4NCi0gICAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgICAgICAgIFVSTDogPGlucHV0IHR5cGU9InVybCIgbmFtZT0iaW5wdXQiIG5nLW1vZGVsPSJ0ZXh0IiByZXF1aXJlZD4NCi0gICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZCI+DQotICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4NCi0gICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci51cmwiPg0KLSAgICAgICAgICAgICBOb3QgdmFsaWQgdXJsITwvc3Bhbj4NCi0gICAgICAgICAgIDx0dD50ZXh0ID0ge3t0ZXh0fX08L3R0Pjxici8+DQotICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiR2YWxpZCA9IHt7bXlGb3JtLmlucHV0LiR2YWxpZH19PC90dD48YnIvPg0KLSAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz4NCi0gICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+DQotICAgICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxici8+DQotICAgICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci51cmwgPSB7eyEhbXlGb3JtLiRlcnJvci51cmx9fTwvdHQ+PGJyLz4NCi0gICAgICAgICAgPC9mb3JtPg0KLSAgICAgICAgPC9maWxlPg0KLSAgICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgICAgIHZhciB0ZXh0ID0gZWxlbWVudChieS5iaW5kaW5nKCd0ZXh0JykpOw0KLSAgICAgICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7DQotICAgICAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3RleHQnKSk7DQotDQotICAgICAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9Db250YWluKCdodHRwOi8vZ29vZ2xlLmNvbScpOw0KLSAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOw0KLSAgICAgICAgICB9KTsNCi0NCi0gICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTsNCi0gICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnJyk7DQotDQotICAgICAgICAgICAgZXhwZWN0KHRleHQuZ2V0VGV4dCgpKS50b0VxdWFsKCd0ZXh0ID0nKTsNCi0gICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7DQotICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgbm90IHVybCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7DQotICAgICAgICAgICAgaW5wdXQuc2VuZEtleXMoJ2JveCcpOw0KLQ0KLSAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICA8L2ZpbGU+DQotICAgICAgPC9leGFtcGxlPg0KLSAgICovDQotICAndXJsJzogdXJsSW5wdXRUeXBlLA0KLQ0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgaW5wdXQNCi0gICAqIEBuYW1lIGlucHV0W2VtYWlsXQ0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogVGV4dCBpbnB1dCB3aXRoIGVtYWlsIHZhbGlkYXRpb24uIFNldHMgdGhlIGBlbWFpbGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgbm90IGEgdmFsaWQgZW1haWwNCi0gICAqIGFkZHJlc3MuDQotICAgKg0KLSAgICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+DQotICAgKiAqKk5vdGU6KiogYGlucHV0W2VtYWlsXWAgdXNlcyBhIHJlZ2V4IHRvIHZhbGlkYXRlIGVtYWlsIGFkZHJlc3NlcyB0aGF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgcmVnZXgNCi0gICAqIHVzZWQgaW4gQ2hyb21pdW0uIElmIHlvdSBuZWVkIHN0cmljdGVyIHZhbGlkYXRpb24gKGUuZy4gcmVxdWlyaW5nIGEgdG9wLWxldmVsIGRvbWFpbiksIHlvdSBjYW4NCi0gICAqIHVzZSBgbmctcGF0dGVybmAgb3IgbW9kaWZ5IHRoZSBidWlsdC1pbiB2YWxpZGF0b3JzIChzZWUgdGhlIHtAbGluayBndWlkZS9mb3JtcyBGb3JtcyBndWlkZX0pDQotICAgKiA8L2Rpdj4NCi0gICAqDQotICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uDQotICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuDQotICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuDQotICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG8NCi0gICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mDQotICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4NCi0gICAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNaW5sZW5ndGggU2V0cyBgbWlubGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgc2hvcnRlciB0aGFuDQotICAgKiAgICBtaW5sZW5ndGguDQotICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuDQotICAgKiAgICBtYXhsZW5ndGguIFNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0byBhIG5lZ2F0aXZlIG9yIG5vbi1udW1lcmljIHZhbHVlLCBhbGxvd3MgdmlldyB2YWx1ZXMgb2YNCi0gICAqICAgIGFueSBsZW5ndGguDQotICAgKiBAcGFyYW0ge3N0cmluZz19IHBhdHRlcm4gU2ltaWxhciB0byBgbmdQYXR0ZXJuYCBleGNlcHQgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBhY3R1YWwgc3RyaW5nDQotICAgKiAgICB0aGF0IGNvbnRhaW5zIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYm9keSB0aGF0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgcmVndWxhciBleHByZXNzaW9uDQotICAgKiAgICBhcyBpbiB0aGUgbmdQYXR0ZXJuIGRpcmVjdGl2ZS4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdQYXR0ZXJuIFNldHMgYHBhdHRlcm5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSBuZ01vZGVsIHZhbHVlIGRvZXMgbm90IG1hdGNoDQotICAgKiAgICBhIFJlZ0V4cCBmb3VuZCBieSBldmFsdWF0aW5nIHRoZSBBbmd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlIGF0dHJpYnV0ZSB2YWx1ZS4NCi0gICAqICAgIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIFJlZ0V4cCBvYmplY3QgdGhlbiB0aGlzIGlzIHVzZWQgZGlyZWN0bHkuDQotICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIHN0cmluZyB0aGVuIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgUmVnRXhwIGFmdGVyIHdyYXBwaW5nIGl0IGluIGBeYCBhbmQgYCRgDQotICAgKiAgICBjaGFyYWN0ZXJzLiBGb3IgaW5zdGFuY2UsIGAiYWJjImAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYG5ldyBSZWdFeHAoJ15hYmMkJylgLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyDQotICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50Lg0KLSAgICoNCi0gICAqIEBleGFtcGxlDQotICAgICAgPGV4YW1wbGUgbmFtZT0iZW1haWwtaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9ImVtYWlsRXhhbXBsZSI+DQotICAgICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgICA8c2NyaXB0Pg0KLSAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2VtYWlsRXhhbXBsZScsIFtdKQ0KLSAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAgICAgICRzY29wZS50ZXh0ID0gJ21lQGV4YW1wbGUuY29tJzsNCi0gICAgICAgICAgICAgfV0pOw0KLSAgICAgICAgIDwvc2NyaXB0Pg0KLSAgICAgICAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+DQotICAgICAgICAgICAgIEVtYWlsOiA8aW5wdXQgdHlwZT0iZW1haWwiIG5hbWU9ImlucHV0IiBuZy1tb2RlbD0idGV4dCIgcmVxdWlyZWQ+DQotICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZCI+DQotICAgICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPg0KLSAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IuZW1haWwiPg0KLSAgICAgICAgICAgICAgIE5vdCB2YWxpZCBlbWFpbCE8L3NwYW4+DQotICAgICAgICAgICAgIDx0dD50ZXh0ID0ge3t0ZXh0fX08L3R0Pjxici8+DQotICAgICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+DQotICAgICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+DQotICAgICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+DQotICAgICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4NCi0gICAgICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IuZW1haWwgPSB7eyEhbXlGb3JtLiRlcnJvci5lbWFpbH19PC90dD48YnIvPg0KLSAgICAgICAgICAgPC9mb3JtPg0KLSAgICAgICAgIDwvZmlsZT4NCi0gICAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICAgICB2YXIgdGV4dCA9IGVsZW1lbnQoYnkuYmluZGluZygndGV4dCcpKTsNCi0gICAgICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOw0KLSAgICAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd0ZXh0JykpOw0KLQ0KLSAgICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBleHBlY3QodGV4dC5nZXRUZXh0KCkpLnRvQ29udGFpbignbWVAZXhhbXBsZS5jb20nKTsNCi0gICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTsNCi0gICAgICAgICAgfSk7DQotDQotICAgICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7DQotICAgICAgICAgICAgaW5wdXQuc2VuZEtleXMoJycpOw0KLSAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9FcXVhbCgndGV4dCA9Jyk7DQotICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOw0KLSAgICAgICAgICB9KTsNCi0NCi0gICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG5vdCBlbWFpbCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7DQotICAgICAgICAgICAgaW5wdXQuc2VuZEtleXMoJ3h4eCcpOw0KLQ0KLSAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICA8L2ZpbGU+DQotICAgICAgPC9leGFtcGxlPg0KLSAgICovDQotICAnZW1haWwnOiBlbWFpbElucHV0VHlwZSwNCi0NCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIGlucHV0DQotICAgKiBAbmFtZSBpbnB1dFtyYWRpb10NCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIEhUTUwgcmFkaW8gYnV0dG9uLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4NCi0gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIHNldCB3aGVuIHNlbGVjdGVkLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyDQotICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50Lg0KLSAgICogQHBhcmFtIHtzdHJpbmd9IG5nVmFsdWUgQW5ndWxhciBleHByZXNzaW9uIHdoaWNoIHNldHMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBleHByZXNzaW9uIHNob3VsZA0KLSAgICogICAgYmUgc2V0IHdoZW4gc2VsZWN0ZWQuDQotICAgKg0KLSAgICogQGV4YW1wbGUNCi0gICAgICA8ZXhhbXBsZSBuYW1lPSJyYWRpby1pbnB1dC1kaXJlY3RpdmUiIG1vZHVsZT0icmFkaW9FeGFtcGxlIj4NCi0gICAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICAgIDxzY3JpcHQ+DQotICAgICAgICAgICBhbmd1bGFyLm1vZHVsZSgncmFkaW9FeGFtcGxlJywgW10pDQotICAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgICAgICAgJHNjb3BlLmNvbG9yID0gJ2JsdWUnOw0KLSAgICAgICAgICAgICAgICRzY29wZS5zcGVjaWFsVmFsdWUgPSB7DQotICAgICAgICAgICAgICAgICAiaWQiOiAiMTIzNDUiLA0KLSAgICAgICAgICAgICAgICAgInZhbHVlIjogImdyZWVuIg0KLSAgICAgICAgICAgICAgIH07DQotICAgICAgICAgICAgIH1dKTsNCi0gICAgICAgICA8L3NjcmlwdD4NCi0gICAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmctbW9kZWw9ImNvbG9yIiB2YWx1ZT0icmVkIj4gIFJlZCA8YnIvPg0KLSAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuZy1tb2RlbD0iY29sb3IiIG5nLXZhbHVlPSJzcGVjaWFsVmFsdWUiPiBHcmVlbiA8YnIvPg0KLSAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuZy1tb2RlbD0iY29sb3IiIHZhbHVlPSJibHVlIj4gQmx1ZSA8YnIvPg0KLSAgICAgICAgICAgPHR0PmNvbG9yID0ge3tjb2xvciB8IGpzb259fTwvdHQ+PGJyLz4NCi0gICAgICAgICAgPC9mb3JtPg0KLSAgICAgICAgICBOb3RlIHRoYXQgYG5nLXZhbHVlPSJzcGVjaWFsVmFsdWUiYCBzZXRzIHJhZGlvIGl0ZW0ncyB2YWx1ZSB0byBiZSB0aGUgdmFsdWUgb2YgYCRzY29wZS5zcGVjaWFsVmFsdWVgLg0KLSAgICAgICAgPC9maWxlPg0KLSAgICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgICAgIGl0KCdzaG91bGQgY2hhbmdlIHN0YXRlJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgdmFyIGNvbG9yID0gZWxlbWVudChieS5iaW5kaW5nKCdjb2xvcicpKTsNCi0NCi0gICAgICAgICAgICBleHBlY3QoY29sb3IuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2JsdWUnKTsNCi0NCi0gICAgICAgICAgICBlbGVtZW50LmFsbChieS5tb2RlbCgnY29sb3InKSkuZ2V0KDApLmNsaWNrKCk7DQotDQotICAgICAgICAgICAgZXhwZWN0KGNvbG9yLmdldFRleHQoKSkudG9Db250YWluKCdyZWQnKTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICA8L2ZpbGU+DQotICAgICAgPC9leGFtcGxlPg0KLSAgICovDQotICAncmFkaW8nOiByYWRpb0lucHV0VHlwZSwNCi0NCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIGlucHV0DQotICAgKiBAbmFtZSBpbnB1dFtjaGVja2JveF0NCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIEhUTUwgY2hlY2tib3guDQotICAgKg0KLSAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLg0KLSAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLg0KLSAgICogQHBhcmFtIHtleHByZXNzaW9uPX0gbmdUcnVlVmFsdWUgVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBleHByZXNzaW9uIHNob3VsZCBiZSBzZXQgd2hlbiBzZWxlY3RlZC4NCi0gICAqIEBwYXJhbSB7ZXhwcmVzc2lvbj19IG5nRmFsc2VWYWx1ZSBUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIHNldCB3aGVuIG5vdCBzZWxlY3RlZC4NCi0gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcg0KLSAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC4NCi0gICAqDQotICAgKiBAZXhhbXBsZQ0KLSAgICAgIDxleGFtcGxlIG5hbWU9ImNoZWNrYm94LWlucHV0LWRpcmVjdGl2ZSIgbW9kdWxlPSJjaGVja2JveEV4YW1wbGUiPg0KLSAgICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgICAgPHNjcmlwdD4NCi0gICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdjaGVja2JveEV4YW1wbGUnLCBbXSkNCi0gICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsNCi0gICAgICAgICAgICAgICAkc2NvcGUudmFsdWUxID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAkc2NvcGUudmFsdWUyID0gJ1lFUycNCi0gICAgICAgICAgICAgfV0pOw0KLSAgICAgICAgIDwvc2NyaXB0Pg0KLSAgICAgICAgIDxmb3JtIG5hbWU9Im15Rm9ybSIgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAgICAgICAgICAgVmFsdWUxOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJ2YWx1ZTEiPiA8YnIvPg0KLSAgICAgICAgICAgVmFsdWUyOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJ2YWx1ZTIiDQotICAgICAgICAgICAgICAgICAgICAgICAgICBuZy10cnVlLXZhbHVlPSInWUVTJyIgbmctZmFsc2UtdmFsdWU9IidOTyciPiA8YnIvPg0KLSAgICAgICAgICAgPHR0PnZhbHVlMSA9IHt7dmFsdWUxfX08L3R0Pjxici8+DQotICAgICAgICAgICA8dHQ+dmFsdWUyID0ge3t2YWx1ZTJ9fTwvdHQ+PGJyLz4NCi0gICAgICAgICAgPC9mb3JtPg0KLSAgICAgICAgPC9maWxlPg0KLSAgICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgICAgIGl0KCdzaG91bGQgY2hhbmdlIHN0YXRlJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgdmFyIHZhbHVlMSA9IGVsZW1lbnQoYnkuYmluZGluZygndmFsdWUxJykpOw0KLSAgICAgICAgICAgIHZhciB2YWx1ZTIgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3ZhbHVlMicpKTsNCi0NCi0gICAgICAgICAgICBleHBlY3QodmFsdWUxLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7DQotICAgICAgICAgICAgZXhwZWN0KHZhbHVlMi5nZXRUZXh0KCkpLnRvQ29udGFpbignWUVTJyk7DQotDQotICAgICAgICAgICAgZWxlbWVudChieS5tb2RlbCgndmFsdWUxJykpLmNsaWNrKCk7DQotICAgICAgICAgICAgZWxlbWVudChieS5tb2RlbCgndmFsdWUyJykpLmNsaWNrKCk7DQotDQotICAgICAgICAgICAgZXhwZWN0KHZhbHVlMS5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsNCi0gICAgICAgICAgICBleHBlY3QodmFsdWUyLmdldFRleHQoKSkudG9Db250YWluKCdOTycpOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIDwvZmlsZT4NCi0gICAgICA8L2V4YW1wbGU+DQotICAgKi8NCi0gICdjaGVja2JveCc6IGNoZWNrYm94SW5wdXRUeXBlLA0KLQ0KLSAgJ2hpZGRlbic6IG5vb3AsDQotICAnYnV0dG9uJzogbm9vcCwNCi0gICdzdWJtaXQnOiBub29wLA0KLSAgJ3Jlc2V0Jzogbm9vcCwNCi0gICdmaWxlJzogbm9vcA0KLX07DQotDQotZnVuY3Rpb24gc3RyaW5nQmFzZWRJbnB1dFR5cGUoY3RybCkgew0KLSAgY3RybC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZhbHVlKSA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTsNCi0gIH0pOw0KLX0NCi0NCi1mdW5jdGlvbiB0ZXh0SW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHsNCi0gIGJhc2VJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcik7DQotICBzdHJpbmdCYXNlZElucHV0VHlwZShjdHJsKTsNCi19DQotDQotZnVuY3Rpb24gYmFzZUlucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKSB7DQotICB2YXIgdHlwZSA9IGxvd2VyY2FzZShlbGVtZW50WzBdLnR5cGUpOw0KLQ0KLSAgLy8gSW4gY29tcG9zaXRpb24gbW9kZSwgdXNlcnMgYXJlIHN0aWxsIGlucHV0aW5nIGludGVybWVkaWF0ZSB0ZXh0IGJ1ZmZlciwNCi0gIC8vIGhvbGQgdGhlIGxpc3RlbmVyIHVudGlsIGNvbXBvc2l0aW9uIGlzIGRvbmUuDQotICAvLyBNb3JlIGFib3V0IGNvbXBvc2l0aW9uIGV2ZW50czogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NvbXBvc2l0aW9uRXZlbnQNCi0gIGlmICghJHNuaWZmZXIuYW5kcm9pZCkgew0KLSAgICB2YXIgY29tcG9zaW5nID0gZmFsc2U7DQotDQotICAgIGVsZW1lbnQub24oJ2NvbXBvc2l0aW9uc3RhcnQnLCBmdW5jdGlvbihkYXRhKSB7DQotICAgICAgY29tcG9zaW5nID0gdHJ1ZTsNCi0gICAgfSk7DQotDQotICAgIGVsZW1lbnQub24oJ2NvbXBvc2l0aW9uZW5kJywgZnVuY3Rpb24oKSB7DQotICAgICAgY29tcG9zaW5nID0gZmFsc2U7DQotICAgICAgbGlzdGVuZXIoKTsNCi0gICAgfSk7DQotICB9DQotDQotICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihldikgew0KLSAgICBpZiAodGltZW91dCkgew0KLSAgICAgICRicm93c2VyLmRlZmVyLmNhbmNlbCh0aW1lb3V0KTsNCi0gICAgICB0aW1lb3V0ID0gbnVsbDsNCi0gICAgfQ0KLSAgICBpZiAoY29tcG9zaW5nKSByZXR1cm47DQotICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQudmFsKCksDQotICAgICAgICBldmVudCA9IGV2ICYmIGV2LnR5cGU7DQotDQotICAgIC8vIEJ5IGRlZmF1bHQgd2Ugd2lsbCB0cmltIHRoZSB2YWx1ZQ0KLSAgICAvLyBJZiB0aGUgYXR0cmlidXRlIG5nLXRyaW0gZXhpc3RzIHdlIHdpbGwgYXZvaWQgdHJpbW1pbmcNCi0gICAgLy8gSWYgaW5wdXQgdHlwZSBpcyAncGFzc3dvcmQnLCB0aGUgdmFsdWUgaXMgbmV2ZXIgdHJpbW1lZA0KLSAgICBpZiAodHlwZSAhPT0gJ3Bhc3N3b3JkJyAmJiAoIWF0dHIubmdUcmltIHx8IGF0dHIubmdUcmltICE9PSAnZmFsc2UnKSkgew0KLSAgICAgIHZhbHVlID0gdHJpbSh2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgLy8gSWYgYSBjb250cm9sIGlzIHN1ZmZlcmluZyBmcm9tIGJhZCBpbnB1dCAoZHVlIHRvIG5hdGl2ZSB2YWxpZGF0b3JzKSwgYnJvd3NlcnMgZGlzY2FyZCBpdHMNCi0gICAgLy8gdmFsdWUsIHNvIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gcmV2YWxpZGF0ZSAoYnkgY2FsbGluZyAkc2V0Vmlld1ZhbHVlIGFnYWluKSBldmVuIGlmIHRoZQ0KLSAgICAvLyBjb250cm9sJ3MgdmFsdWUgaXMgdGhlIHNhbWUgZW1wdHkgdmFsdWUgdHdpY2UgaW4gYSByb3cuDQotICAgIGlmIChjdHJsLiR2aWV3VmFsdWUgIT09IHZhbHVlIHx8ICh2YWx1ZSA9PT0gJycgJiYgY3RybC4kJGhhc05hdGl2ZVZhbGlkYXRvcnMpKSB7DQotICAgICAgY3RybC4kc2V0Vmlld1ZhbHVlKHZhbHVlLCBldmVudCk7DQotICAgIH0NCi0gIH07DQotDQotICAvLyBpZiB0aGUgYnJvd3NlciBkb2VzIHN1cHBvcnQgImlucHV0IiBldmVudCwgd2UgYXJlIGZpbmUgLSBleGNlcHQgb24gSUU5IHdoaWNoIGRvZXNuJ3QgZmlyZSB0aGUNCi0gIC8vIGlucHV0IGV2ZW50IG9uIGJhY2tzcGFjZSwgZGVsZXRlIG9yIGN1dA0KLSAgaWYgKCRzbmlmZmVyLmhhc0V2ZW50KCdpbnB1dCcpKSB7DQotICAgIGVsZW1lbnQub24oJ2lucHV0JywgbGlzdGVuZXIpOw0KLSAgfSBlbHNlIHsNCi0gICAgdmFyIHRpbWVvdXQ7DQotDQotICAgIHZhciBkZWZlckxpc3RlbmVyID0gZnVuY3Rpb24oZXYsIGlucHV0LCBvcmlnVmFsdWUpIHsNCi0gICAgICBpZiAoIXRpbWVvdXQpIHsNCi0gICAgICAgIHRpbWVvdXQgPSAkYnJvd3Nlci5kZWZlcihmdW5jdGlvbigpIHsNCi0gICAgICAgICAgdGltZW91dCA9IG51bGw7DQotICAgICAgICAgIGlmICghaW5wdXQgfHwgaW5wdXQudmFsdWUgIT09IG9yaWdWYWx1ZSkgew0KLSAgICAgICAgICAgIGxpc3RlbmVyKGV2KTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBlbGVtZW50Lm9uKCdrZXlkb3duJywgZnVuY3Rpb24oZXZlbnQpIHsNCi0gICAgICB2YXIga2V5ID0gZXZlbnQua2V5Q29kZTsNCi0NCi0gICAgICAvLyBpZ25vcmUNCi0gICAgICAvLyAgICBjb21tYW5kICAgICAgICAgICAgbW9kaWZpZXJzICAgICAgICAgICAgICAgICAgIGFycm93cw0KLSAgICAgIGlmIChrZXkgPT09IDkxIHx8ICgxNSA8IGtleSAmJiBrZXkgPCAxOSkgfHwgKDM3IDw9IGtleSAmJiBrZXkgPD0gNDApKSByZXR1cm47DQotDQotICAgICAgZGVmZXJMaXN0ZW5lcihldmVudCwgdGhpcywgdGhpcy52YWx1ZSk7DQotICAgIH0pOw0KLQ0KLSAgICAvLyBpZiB1c2VyIG1vZGlmaWVzIGlucHV0IHZhbHVlIHVzaW5nIGNvbnRleHQgbWVudSBpbiBJRSwgd2UgbmVlZCAicGFzdGUiIGFuZCAiY3V0IiBldmVudHMgdG8gY2F0Y2ggaXQNCi0gICAgaWYgKCRzbmlmZmVyLmhhc0V2ZW50KCdwYXN0ZScpKSB7DQotICAgICAgZWxlbWVudC5vbigncGFzdGUgY3V0JywgZGVmZXJMaXN0ZW5lcik7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8vIGlmIHVzZXIgcGFzdGUgaW50byBpbnB1dCB1c2luZyBtb3VzZSBvbiBvbGRlciBicm93c2VyDQotICAvLyBvciBmb3JtIGF1dG9jb21wbGV0ZSBvbiBuZXdlciBicm93c2VyLCB3ZSBuZWVkICJjaGFuZ2UiIGV2ZW50IHRvIGNhdGNoIGl0DQotICBlbGVtZW50Lm9uKCdjaGFuZ2UnLCBsaXN0ZW5lcik7DQotDQotICBjdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHsNCi0gICAgZWxlbWVudC52YWwoY3RybC4kaXNFbXB0eShjdHJsLiR2aWV3VmFsdWUpID8gJycgOiBjdHJsLiR2aWV3VmFsdWUpOw0KLSAgfTsNCi19DQotDQotZnVuY3Rpb24gd2Vla1BhcnNlcihpc29XZWVrLCBleGlzdGluZ0RhdGUpIHsNCi0gIGlmIChpc0RhdGUoaXNvV2VlaykpIHsNCi0gICAgcmV0dXJuIGlzb1dlZWs7DQotICB9DQotDQotICBpZiAoaXNTdHJpbmcoaXNvV2VlaykpIHsNCi0gICAgV0VFS19SRUdFWFAubGFzdEluZGV4ID0gMDsNCi0gICAgdmFyIHBhcnRzID0gV0VFS19SRUdFWFAuZXhlYyhpc29XZWVrKTsNCi0gICAgaWYgKHBhcnRzKSB7DQotICAgICAgdmFyIHllYXIgPSArcGFydHNbMV0sDQotICAgICAgICAgIHdlZWsgPSArcGFydHNbMl0sDQotICAgICAgICAgIGhvdXJzID0gMCwNCi0gICAgICAgICAgbWludXRlcyA9IDAsDQotICAgICAgICAgIHNlY29uZHMgPSAwLA0KLSAgICAgICAgICBtaWxsaXNlY29uZHMgPSAwLA0KLSAgICAgICAgICBmaXJzdFRodXJzID0gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcih5ZWFyKSwNCi0gICAgICAgICAgYWRkRGF5cyA9ICh3ZWVrIC0gMSkgKiA3Ow0KLQ0KLSAgICAgIGlmIChleGlzdGluZ0RhdGUpIHsNCi0gICAgICAgIGhvdXJzID0gZXhpc3RpbmdEYXRlLmdldEhvdXJzKCk7DQotICAgICAgICBtaW51dGVzID0gZXhpc3RpbmdEYXRlLmdldE1pbnV0ZXMoKTsNCi0gICAgICAgIHNlY29uZHMgPSBleGlzdGluZ0RhdGUuZ2V0U2Vjb25kcygpOw0KLSAgICAgICAgbWlsbGlzZWNvbmRzID0gZXhpc3RpbmdEYXRlLmdldE1pbGxpc2Vjb25kcygpOw0KLSAgICAgIH0NCi0NCi0gICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgMCwgZmlyc3RUaHVycy5nZXREYXRlKCkgKyBhZGREYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIE5hTjsNCi19DQotDQotZnVuY3Rpb24gY3JlYXRlRGF0ZVBhcnNlcihyZWdleHAsIG1hcHBpbmcpIHsNCi0gIHJldHVybiBmdW5jdGlvbihpc28sIGRhdGUpIHsNCi0gICAgdmFyIHBhcnRzLCBtYXA7DQotDQotICAgIGlmIChpc0RhdGUoaXNvKSkgew0KLSAgICAgIHJldHVybiBpc287DQotICAgIH0NCi0NCi0gICAgaWYgKGlzU3RyaW5nKGlzbykpIHsNCi0gICAgICAvLyBXaGVuIGEgZGF0ZSBpcyBKU09OJ2lmaWVkIHRvIHdyYXBzIGl0c2VsZiBpbnNpZGUgb2YgYW4gZXh0cmENCi0gICAgICAvLyBzZXQgb2YgZG91YmxlIHF1b3Rlcy4gVGhpcyBtYWtlcyB0aGUgZGF0ZSBwYXJzaW5nIGNvZGUgdW5hYmxlDQotICAgICAgLy8gdG8gbWF0Y2ggdGhlIGRhdGUgc3RyaW5nIGFuZCBwYXJzZSBpdCBhcyBhIGRhdGUuDQotICAgICAgaWYgKGlzby5jaGFyQXQoMCkgPT0gJyInICYmIGlzby5jaGFyQXQoaXNvLmxlbmd0aCAtIDEpID09ICciJykgew0KLSAgICAgICAgaXNvID0gaXNvLnN1YnN0cmluZygxLCBpc28ubGVuZ3RoIC0gMSk7DQotICAgICAgfQ0KLSAgICAgIGlmIChJU09fREFURV9SRUdFWFAudGVzdChpc28pKSB7DQotICAgICAgICByZXR1cm4gbmV3IERhdGUoaXNvKTsNCi0gICAgICB9DQotICAgICAgcmVnZXhwLmxhc3RJbmRleCA9IDA7DQotICAgICAgcGFydHMgPSByZWdleHAuZXhlYyhpc28pOw0KLQ0KLSAgICAgIGlmIChwYXJ0cykgew0KLSAgICAgICAgcGFydHMuc2hpZnQoKTsNCi0gICAgICAgIGlmIChkYXRlKSB7DQotICAgICAgICAgIG1hcCA9IHsNCi0gICAgICAgICAgICB5eXl5OiBkYXRlLmdldEZ1bGxZZWFyKCksDQotICAgICAgICAgICAgTU06IGRhdGUuZ2V0TW9udGgoKSArIDEsDQotICAgICAgICAgICAgZGQ6IGRhdGUuZ2V0RGF0ZSgpLA0KLSAgICAgICAgICAgIEhIOiBkYXRlLmdldEhvdXJzKCksDQotICAgICAgICAgICAgbW06IGRhdGUuZ2V0TWludXRlcygpLA0KLSAgICAgICAgICAgIHNzOiBkYXRlLmdldFNlY29uZHMoKSwNCi0gICAgICAgICAgICBzc3M6IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLyAxMDAwDQotICAgICAgICAgIH07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBtYXAgPSB7IHl5eXk6IDE5NzAsIE1NOiAxLCBkZDogMSwgSEg6IDAsIG1tOiAwLCBzczogMCwgc3NzOiAwIH07DQotICAgICAgICB9DQotDQotICAgICAgICBmb3JFYWNoKHBhcnRzLCBmdW5jdGlvbihwYXJ0LCBpbmRleCkgew0KLSAgICAgICAgICBpZiAoaW5kZXggPCBtYXBwaW5nLmxlbmd0aCkgew0KLSAgICAgICAgICAgIG1hcFttYXBwaW5nW2luZGV4XV0gPSArcGFydDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgICAgICByZXR1cm4gbmV3IERhdGUobWFwLnl5eXksIG1hcC5NTSAtIDEsIG1hcC5kZCwgbWFwLkhILCBtYXAubW0sIG1hcC5zcyB8fCAwLCBtYXAuc3NzICogMTAwMCB8fCAwKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIE5hTjsNCi0gIH07DQotfQ0KLQ0KLWZ1bmN0aW9uIGNyZWF0ZURhdGVJbnB1dFR5cGUodHlwZSwgcmVnZXhwLCBwYXJzZURhdGUsIGZvcm1hdCkgew0KLSAgcmV0dXJuIGZ1bmN0aW9uIGR5bmFtaWNEYXRlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIsICRmaWx0ZXIpIHsNCi0gICAgYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKTsNCi0gICAgYmFzZUlucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKTsNCi0gICAgdmFyIHRpbWV6b25lID0gY3RybCAmJiBjdHJsLiRvcHRpb25zICYmIGN0cmwuJG9wdGlvbnMudGltZXpvbmU7DQotICAgIHZhciBwcmV2aW91c0RhdGU7DQotDQotICAgIGN0cmwuJCRwYXJzZXJOYW1lID0gdHlwZTsNCi0gICAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgaWYgKGN0cmwuJGlzRW1wdHkodmFsdWUpKSByZXR1cm4gbnVsbDsNCi0gICAgICBpZiAocmVnZXhwLnRlc3QodmFsdWUpKSB7DQotICAgICAgICAvLyBOb3RlOiBXZSBjYW5ub3QgcmVhZCBjdHJsLiRtb2RlbFZhbHVlLCBhcyB0aGVyZSBtaWdodCBiZSBhIGRpZmZlcmVudA0KLSAgICAgICAgLy8gcGFyc2VyL2Zvcm1hdHRlciBpbiB0aGUgcHJvY2Vzc2luZyBjaGFpbiBzbyB0aGF0IHRoZSBtb2RlbA0KLSAgICAgICAgLy8gY29udGFpbnMgc29tZSBkaWZmZXJlbnQgZGF0YSBmb3JtYXQhDQotICAgICAgICB2YXIgcGFyc2VkRGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgcHJldmlvdXNEYXRlKTsNCi0gICAgICAgIGlmICh0aW1lem9uZSA9PT0gJ1VUQycpIHsNCi0gICAgICAgICAgcGFyc2VkRGF0ZS5zZXRNaW51dGVzKHBhcnNlZERhdGUuZ2V0TWludXRlcygpIC0gcGFyc2VkRGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwYXJzZWREYXRlOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gdW5kZWZpbmVkOw0KLSAgICB9KTsNCi0NCi0gICAgY3RybC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgaWYgKHZhbHVlICYmICFpc0RhdGUodmFsdWUpKSB7DQotICAgICAgICB0aHJvdyAkbmdNb2RlbE1pbkVycignZGF0ZWZtdCcsICdFeHBlY3RlZCBgezB9YCB0byBiZSBhIGRhdGUnLCB2YWx1ZSk7DQotICAgICAgfQ0KLSAgICAgIGlmIChpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHsNCi0gICAgICAgIHByZXZpb3VzRGF0ZSA9IHZhbHVlOw0KLSAgICAgICAgaWYgKHByZXZpb3VzRGF0ZSAmJiB0aW1lem9uZSA9PT0gJ1VUQycpIHsNCi0gICAgICAgICAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gNjAwMDAgKiBwcmV2aW91c0RhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTsNCi0gICAgICAgICAgcHJldmlvdXNEYXRlID0gbmV3IERhdGUocHJldmlvdXNEYXRlLmdldFRpbWUoKSArIHRpbWV6b25lT2Zmc2V0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAkZmlsdGVyKCdkYXRlJykodmFsdWUsIGZvcm1hdCwgdGltZXpvbmUpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBwcmV2aW91c0RhdGUgPSBudWxsOw0KLSAgICAgICAgcmV0dXJuICcnOw0KLSAgICAgIH0NCi0gICAgfSk7DQotDQotICAgIGlmIChpc0RlZmluZWQoYXR0ci5taW4pIHx8IGF0dHIubmdNaW4pIHsNCi0gICAgICB2YXIgbWluVmFsOw0KLSAgICAgIGN0cmwuJHZhbGlkYXRvcnMubWluID0gZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICAgIHJldHVybiAhaXNWYWxpZERhdGUodmFsdWUpIHx8IGlzVW5kZWZpbmVkKG1pblZhbCkgfHwgcGFyc2VEYXRlKHZhbHVlKSA+PSBtaW5WYWw7DQotICAgICAgfTsNCi0gICAgICBhdHRyLiRvYnNlcnZlKCdtaW4nLCBmdW5jdGlvbih2YWwpIHsNCi0gICAgICAgIG1pblZhbCA9IHBhcnNlT2JzZXJ2ZWREYXRlVmFsdWUodmFsKTsNCi0gICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7DQotICAgICAgfSk7DQotICAgIH0NCi0NCi0gICAgaWYgKGlzRGVmaW5lZChhdHRyLm1heCkgfHwgYXR0ci5uZ01heCkgew0KLSAgICAgIHZhciBtYXhWYWw7DQotICAgICAgY3RybC4kdmFsaWRhdG9ycy5tYXggPSBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuICFpc1ZhbGlkRGF0ZSh2YWx1ZSkgfHwgaXNVbmRlZmluZWQobWF4VmFsKSB8fCBwYXJzZURhdGUodmFsdWUpIDw9IG1heFZhbDsNCi0gICAgICB9Ow0KLSAgICAgIGF0dHIuJG9ic2VydmUoJ21heCcsIGZ1bmN0aW9uKHZhbCkgew0KLSAgICAgICAgbWF4VmFsID0gcGFyc2VPYnNlcnZlZERhdGVWYWx1ZSh2YWwpOw0KLSAgICAgICAgY3RybC4kdmFsaWRhdGUoKTsNCi0gICAgICB9KTsNCi0gICAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBpc1ZhbGlkRGF0ZSh2YWx1ZSkgew0KLSAgICAgIC8vIEludmFsaWQgRGF0ZTogZ2V0VGltZSgpIHJldHVybnMgTmFODQotICAgICAgcmV0dXJuIHZhbHVlICYmICEodmFsdWUuZ2V0VGltZSAmJiB2YWx1ZS5nZXRUaW1lKCkgIT09IHZhbHVlLmdldFRpbWUoKSk7DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gcGFyc2VPYnNlcnZlZERhdGVWYWx1ZSh2YWwpIHsNCi0gICAgICByZXR1cm4gaXNEZWZpbmVkKHZhbCkgPyAoaXNEYXRlKHZhbCkgPyB2YWwgOiBwYXJzZURhdGUodmFsKSkgOiB1bmRlZmluZWQ7DQotICAgIH0NCi0gIH07DQotfQ0KLQ0KLWZ1bmN0aW9uIGJhZElucHV0Q2hlY2tlcihzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCkgew0KLSAgdmFyIG5vZGUgPSBlbGVtZW50WzBdOw0KLSAgdmFyIG5hdGl2ZVZhbGlkYXRpb24gPSBjdHJsLiQkaGFzTmF0aXZlVmFsaWRhdG9ycyA9IGlzT2JqZWN0KG5vZGUudmFsaWRpdHkpOw0KLSAgaWYgKG5hdGl2ZVZhbGlkYXRpb24pIHsNCi0gICAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgdmFyIHZhbGlkaXR5ID0gZWxlbWVudC5wcm9wKFZBTElESVRZX1NUQVRFX1BST1BFUlRZKSB8fCB7fTsNCi0gICAgICAvLyBEZXRlY3QgYnVnIGluIEZGMzUgZm9yIGlucHV0W2VtYWlsXSAoaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NDQzMCk6DQotICAgICAgLy8gLSBhbHNvIHNldHMgdmFsaWRpdHkuYmFkSW5wdXQgKHNob3VsZCBvbmx5IGJlIHZhbGlkaXR5LnR5cGVNaXNtYXRjaCkuDQotICAgICAgLy8gLSBzZWUgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNlLW1haWwtc3RhdGUtKHR5cGU9ZW1haWwpDQotICAgICAgLy8gLSBjYW4gaWdub3JlIHRoaXMgY2FzZSBhcyB3ZSBjYW4gc3RpbGwgcmVhZCBvdXQgdGhlIGVycm9uZW91cyBlbWFpbC4uLg0KLSAgICAgIHJldHVybiB2YWxpZGl0eS5iYWRJbnB1dCAmJiAhdmFsaWRpdHkudHlwZU1pc21hdGNoID8gdW5kZWZpbmVkIDogdmFsdWU7DQotICAgIH0pOw0KLSAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBudW1iZXJJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcikgew0KLSAgYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKTsNCi0gIGJhc2VJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcik7DQotDQotICBjdHJsLiQkcGFyc2VyTmFtZSA9ICdudW1iZXInOw0KLSAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgIGlmIChjdHJsLiRpc0VtcHR5KHZhbHVlKSkgICAgICByZXR1cm4gbnVsbDsNCi0gICAgaWYgKE5VTUJFUl9SRUdFWFAudGVzdCh2YWx1ZSkpIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTsNCi0gICAgcmV0dXJuIHVuZGVmaW5lZDsNCi0gIH0pOw0KLQ0KLSAgY3RybC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgIGlmICghY3RybC4kaXNFbXB0eSh2YWx1ZSkpIHsNCi0gICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkgew0KLSAgICAgICAgdGhyb3cgJG5nTW9kZWxNaW5FcnIoJ251bWZtdCcsICdFeHBlY3RlZCBgezB9YCB0byBiZSBhIG51bWJlcicsIHZhbHVlKTsNCi0gICAgICB9DQotICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOw0KLSAgICB9DQotICAgIHJldHVybiB2YWx1ZTsNCi0gIH0pOw0KLQ0KLSAgaWYgKGF0dHIubWluIHx8IGF0dHIubmdNaW4pIHsNCi0gICAgdmFyIG1pblZhbDsNCi0gICAgY3RybC4kdmFsaWRhdG9ycy5taW4gPSBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZhbHVlKSB8fCBpc1VuZGVmaW5lZChtaW5WYWwpIHx8IHZhbHVlID49IG1pblZhbDsNCi0gICAgfTsNCi0NCi0gICAgYXR0ci4kb2JzZXJ2ZSgnbWluJywgZnVuY3Rpb24odmFsKSB7DQotICAgICAgaWYgKGlzRGVmaW5lZCh2YWwpICYmICFpc051bWJlcih2YWwpKSB7DQotICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbCwgMTApOw0KLSAgICAgIH0NCi0gICAgICBtaW5WYWwgPSBpc051bWJlcih2YWwpICYmICFpc05hTih2YWwpID8gdmFsIDogdW5kZWZpbmVkOw0KLSAgICAgIC8vIFRPRE8obWF0c2tvKTogaW1wbGVtZW50IHZhbGlkYXRlTGF0ZXIgdG8gcmVkdWNlIG51bWJlciBvZiB2YWxpZGF0aW9ucw0KLSAgICAgIGN0cmwuJHZhbGlkYXRlKCk7DQotICAgIH0pOw0KLSAgfQ0KLQ0KLSAgaWYgKGF0dHIubWF4IHx8IGF0dHIubmdNYXgpIHsNCi0gICAgdmFyIG1heFZhbDsNCi0gICAgY3RybC4kdmFsaWRhdG9ycy5tYXggPSBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZhbHVlKSB8fCBpc1VuZGVmaW5lZChtYXhWYWwpIHx8IHZhbHVlIDw9IG1heFZhbDsNCi0gICAgfTsNCi0NCi0gICAgYXR0ci4kb2JzZXJ2ZSgnbWF4JywgZnVuY3Rpb24odmFsKSB7DQotICAgICAgaWYgKGlzRGVmaW5lZCh2YWwpICYmICFpc051bWJlcih2YWwpKSB7DQotICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbCwgMTApOw0KLSAgICAgIH0NCi0gICAgICBtYXhWYWwgPSBpc051bWJlcih2YWwpICYmICFpc05hTih2YWwpID8gdmFsIDogdW5kZWZpbmVkOw0KLSAgICAgIC8vIFRPRE8obWF0c2tvKTogaW1wbGVtZW50IHZhbGlkYXRlTGF0ZXIgdG8gcmVkdWNlIG51bWJlciBvZiB2YWxpZGF0aW9ucw0KLSAgICAgIGN0cmwuJHZhbGlkYXRlKCk7DQotICAgIH0pOw0KLSAgfQ0KLX0NCi0NCi1mdW5jdGlvbiB1cmxJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcikgew0KLSAgLy8gTm90ZTogbm8gYmFkSW5wdXRDaGVja2VyIGhlcmUgYnkgcHVycG9zZSBhcyBgdXJsYCBpcyBvbmx5IGEgdmFsaWRhdGlvbg0KLSAgLy8gaW4gYnJvd3NlcnMsIGkuZS4gd2UgY2FuIGFsd2F5cyByZWFkIG91dCBpbnB1dC52YWx1ZSBldmVuIGlmIGl0IGlzIG5vdCB2YWxpZCENCi0gIGJhc2VJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcik7DQotICBzdHJpbmdCYXNlZElucHV0VHlwZShjdHJsKTsNCi0NCi0gIGN0cmwuJCRwYXJzZXJOYW1lID0gJ3VybCc7DQotICBjdHJsLiR2YWxpZGF0b3JzLnVybCA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkgew0KLSAgICB2YXIgdmFsdWUgPSBtb2RlbFZhbHVlIHx8IHZpZXdWYWx1ZTsNCi0gICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmFsdWUpIHx8IFVSTF9SRUdFWFAudGVzdCh2YWx1ZSk7DQotICB9Ow0KLX0NCi0NCi1mdW5jdGlvbiBlbWFpbElucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKSB7DQotICAvLyBOb3RlOiBubyBiYWRJbnB1dENoZWNrZXIgaGVyZSBieSBwdXJwb3NlIGFzIGB1cmxgIGlzIG9ubHkgYSB2YWxpZGF0aW9uDQotICAvLyBpbiBicm93c2VycywgaS5lLiB3ZSBjYW4gYWx3YXlzIHJlYWQgb3V0IGlucHV0LnZhbHVlIGV2ZW4gaWYgaXQgaXMgbm90IHZhbGlkIQ0KLSAgYmFzZUlucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKTsNCi0gIHN0cmluZ0Jhc2VkSW5wdXRUeXBlKGN0cmwpOw0KLQ0KLSAgY3RybC4kJHBhcnNlck5hbWUgPSAnZW1haWwnOw0KLSAgY3RybC4kdmFsaWRhdG9ycy5lbWFpbCA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkgew0KLSAgICB2YXIgdmFsdWUgPSBtb2RlbFZhbHVlIHx8IHZpZXdWYWx1ZTsNCi0gICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmFsdWUpIHx8IEVNQUlMX1JFR0VYUC50ZXN0KHZhbHVlKTsNCi0gIH07DQotfQ0KLQ0KLWZ1bmN0aW9uIHJhZGlvSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKSB7DQotICAvLyBtYWtlIHRoZSBuYW1lIHVuaXF1ZSwgaWYgbm90IGRlZmluZWQNCi0gIGlmIChpc1VuZGVmaW5lZChhdHRyLm5hbWUpKSB7DQotICAgIGVsZW1lbnQuYXR0cignbmFtZScsIG5leHRVaWQoKSk7DQotICB9DQotDQotICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihldikgew0KLSAgICBpZiAoZWxlbWVudFswXS5jaGVja2VkKSB7DQotICAgICAgY3RybC4kc2V0Vmlld1ZhbHVlKGF0dHIudmFsdWUsIGV2ICYmIGV2LnR5cGUpOw0KLSAgICB9DQotICB9Ow0KLQ0KLSAgZWxlbWVudC5vbignY2xpY2snLCBsaXN0ZW5lcik7DQotDQotICBjdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHsNCi0gICAgdmFyIHZhbHVlID0gYXR0ci52YWx1ZTsNCi0gICAgZWxlbWVudFswXS5jaGVja2VkID0gKHZhbHVlID09IGN0cmwuJHZpZXdWYWx1ZSk7DQotICB9Ow0KLQ0KLSAgYXR0ci4kb2JzZXJ2ZSgndmFsdWUnLCBjdHJsLiRyZW5kZXIpOw0KLX0NCi0NCi1mdW5jdGlvbiBwYXJzZUNvbnN0YW50RXhwcigkcGFyc2UsIGNvbnRleHQsIG5hbWUsIGV4cHJlc3Npb24sIGZhbGxiYWNrKSB7DQotICB2YXIgcGFyc2VGbjsNCi0gIGlmIChpc0RlZmluZWQoZXhwcmVzc2lvbikpIHsNCi0gICAgcGFyc2VGbiA9ICRwYXJzZShleHByZXNzaW9uKTsNCi0gICAgaWYgKCFwYXJzZUZuLmNvbnN0YW50KSB7DQotICAgICAgdGhyb3cgbWluRXJyKCduZ01vZGVsJykoJ2NvbnN0ZXhwcicsICdFeHBlY3RlZCBjb25zdGFudCBleHByZXNzaW9uIGZvciBgezB9YCwgYnV0IHNhdyAnICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdgezF9YC4nLCBuYW1lLCBleHByZXNzaW9uKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcGFyc2VGbihjb250ZXh0KTsNCi0gIH0NCi0gIHJldHVybiBmYWxsYmFjazsNCi19DQotDQotZnVuY3Rpb24gY2hlY2tib3hJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3NlciwgJGZpbHRlciwgJHBhcnNlKSB7DQotICB2YXIgdHJ1ZVZhbHVlID0gcGFyc2VDb25zdGFudEV4cHIoJHBhcnNlLCBzY29wZSwgJ25nVHJ1ZVZhbHVlJywgYXR0ci5uZ1RydWVWYWx1ZSwgdHJ1ZSk7DQotICB2YXIgZmFsc2VWYWx1ZSA9IHBhcnNlQ29uc3RhbnRFeHByKCRwYXJzZSwgc2NvcGUsICduZ0ZhbHNlVmFsdWUnLCBhdHRyLm5nRmFsc2VWYWx1ZSwgZmFsc2UpOw0KLQ0KLSAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXYpIHsNCi0gICAgY3RybC4kc2V0Vmlld1ZhbHVlKGVsZW1lbnRbMF0uY2hlY2tlZCwgZXYgJiYgZXYudHlwZSk7DQotICB9Ow0KLQ0KLSAgZWxlbWVudC5vbignY2xpY2snLCBsaXN0ZW5lcik7DQotDQotICBjdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHsNCi0gICAgZWxlbWVudFswXS5jaGVja2VkID0gY3RybC4kdmlld1ZhbHVlOw0KLSAgfTsNCi0NCi0gIC8vIE92ZXJyaWRlIHRoZSBzdGFuZGFyZCBgJGlzRW1wdHlgIGJlY2F1c2UgdGhlICR2aWV3VmFsdWUgb2YgYW4gZW1wdHkgY2hlY2tib3ggaXMgYWx3YXlzIHNldCB0byBgZmFsc2VgDQotICAvLyBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHBhcnNlciBiZWxvdywgd2hpY2ggY29tcGFyZXMgdGhlIGAkbW9kZWxWYWx1ZWAgd2l0aCBgdHJ1ZVZhbHVlYCB0byBjb252ZXJ0DQotICAvLyBpdCB0byBhIGJvb2xlYW4uDQotICBjdHJsLiRpc0VtcHR5ID0gZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZTsNCi0gIH07DQotDQotICBjdHJsLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgcmV0dXJuIGVxdWFscyh2YWx1ZSwgdHJ1ZVZhbHVlKTsNCi0gIH0pOw0KLQ0KLSAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgIHJldHVybiB2YWx1ZSA/IHRydWVWYWx1ZSA6IGZhbHNlVmFsdWU7DQotICB9KTsNCi19DQotDQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIHRleHRhcmVhDQotICogQHJlc3RyaWN0IEUNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEhUTUwgdGV4dGFyZWEgZWxlbWVudCBjb250cm9sIHdpdGggYW5ndWxhciBkYXRhLWJpbmRpbmcuIFRoZSBkYXRhLWJpbmRpbmcgYW5kIHZhbGlkYXRpb24NCi0gKiBwcm9wZXJ0aWVzIG9mIHRoaXMgZWxlbWVudCBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aG9zZSBvZiB0aGUNCi0gKiB7QGxpbmsgbmcuZGlyZWN0aXZlOmlucHV0IGlucHV0IGVsZW1lbnR9Lg0KLSAqDQotICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLg0KLSAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4NCi0gKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuDQotICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvDQotICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2YNCi0gKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4NCi0gKiBAcGFyYW0ge251bWJlcj19IG5nTWlubGVuZ3RoIFNldHMgYG1pbmxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIHNob3J0ZXIgdGhhbg0KLSAqICAgIG1pbmxlbmd0aC4NCi0gKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuDQotICogICAgbWF4bGVuZ3RoLiBTZXR0aW5nIHRoZSBhdHRyaWJ1dGUgdG8gYSBuZWdhdGl2ZSBvciBub24tbnVtZXJpYyB2YWx1ZSwgYWxsb3dzIHZpZXcgdmFsdWVzIG9mIGFueQ0KLSAqICAgIGxlbmd0aC4NCi0gKiBAcGFyYW0ge3N0cmluZz19IG5nUGF0dGVybiBTZXRzIGBwYXR0ZXJuYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlDQotICogICAgUmVnRXhwIHBhdHRlcm4gZXhwcmVzc2lvbi4gRXhwZWN0ZWQgdmFsdWUgaXMgYC9yZWdleHAvYCBmb3IgaW5saW5lIHBhdHRlcm5zIG9yIGByZWdleHBgIGZvcg0KLSAqICAgIHBhdHRlcm5zIGRlZmluZWQgYXMgc2NvcGUgZXhwcmVzc2lvbnMuDQotICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyDQotICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC4NCi0gKiBAcGFyYW0ge2Jvb2xlYW49fSBbbmdUcmltPXRydWVdIElmIHNldCB0byBmYWxzZSBBbmd1bGFyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgdHJpbSB0aGUgaW5wdXQuDQotICovDQotDQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIGlucHV0DQotICogQHJlc3RyaWN0IEUNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEhUTUwgaW5wdXQgZWxlbWVudCBjb250cm9sLiBXaGVuIHVzZWQgdG9nZXRoZXIgd2l0aCB7QGxpbmsgbmdNb2RlbCBgbmdNb2RlbGB9LCBpdCBwcm92aWRlcyBkYXRhLWJpbmRpbmcsDQotICogaW5wdXQgc3RhdGUgY29udHJvbCwgYW5kIHZhbGlkYXRpb24uDQotICogSW5wdXQgY29udHJvbCBmb2xsb3dzIEhUTUw1IGlucHV0IHR5cGVzIGFuZCBwb2x5ZmlsbHMgdGhlIEhUTUw1IHZhbGlkYXRpb24gYmVoYXZpb3IgZm9yIG9sZGVyIGJyb3dzZXJzLg0KLSAqDQotICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+DQotICogKipOb3RlOioqIE5vdCBldmVyeSBmZWF0dXJlIG9mZmVyZWQgaXMgYXZhaWxhYmxlIGZvciBhbGwgaW5wdXQgdHlwZXMuDQotICogU3BlY2lmaWNhbGx5LCBkYXRhIGJpbmRpbmcgYW5kIGV2ZW50IGhhbmRsaW5nIHZpYSBgbmctbW9kZWxgIGlzIHVuc3VwcG9ydGVkIGZvciBgaW5wdXRbZmlsZV1gLg0KLSAqIDwvZGl2Pg0KLSAqDQotICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLg0KLSAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4NCi0gKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuDQotICogQHBhcmFtIHtib29sZWFuPX0gbmdSZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGlmIHNldCB0byB0cnVlDQotICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW4NCi0gKiAgICBtaW5sZW5ndGguDQotICogQHBhcmFtIHtudW1iZXI9fSBuZ01heGxlbmd0aCBTZXRzIGBtYXhsZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBsb25nZXIgdGhhbg0KLSAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZiBhbnkNCi0gKiAgICBsZW5ndGguDQotICogQHBhcmFtIHtzdHJpbmc9fSBuZ1BhdHRlcm4gU2V0cyBgcGF0dGVybmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZQ0KLSAqICAgIFJlZ0V4cCBwYXR0ZXJuIGV4cHJlc3Npb24uIEV4cGVjdGVkIHZhbHVlIGlzIGAvcmVnZXhwL2AgZm9yIGlubGluZSBwYXR0ZXJucyBvciBgcmVnZXhwYCBmb3INCi0gKiAgICBwYXR0ZXJucyBkZWZpbmVkIGFzIHNjb3BlIGV4cHJlc3Npb25zLg0KLSAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcg0KLSAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuDQotICogQHBhcmFtIHtib29sZWFuPX0gW25nVHJpbT10cnVlXSBJZiBzZXQgdG8gZmFsc2UgQW5ndWxhciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IHRyaW0gdGhlIGlucHV0Lg0KLSAqICAgIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQgZm9yIGlucHV0W3R5cGU9cGFzc3dvcmRdIGNvbnRyb2xzLCB3aGljaCB3aWxsIG5ldmVyIHRyaW0gdGhlDQotICogICAgaW5wdXQuDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgICA8ZXhhbXBsZSBuYW1lPSJpbnB1dC1kaXJlY3RpdmUiIG1vZHVsZT0iaW5wdXRFeGFtcGxlIj4NCi0gICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgPHNjcmlwdD4NCi0gICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2lucHV0RXhhbXBsZScsIFtdKQ0KLSAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgICAgICAkc2NvcGUudXNlciA9IHtuYW1lOiAnZ3Vlc3QnLCBsYXN0OiAndmlzaXRvcid9Ow0KLSAgICAgICAgICAgIH1dKTsNCi0gICAgICAgPC9zY3JpcHQ+DQotICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAgICAgICAgIDxmb3JtIG5hbWU9Im15Rm9ybSI+DQotICAgICAgICAgICBVc2VyIG5hbWU6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VyTmFtZSIgbmctbW9kZWw9InVzZXIubmFtZSIgcmVxdWlyZWQ+DQotICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS51c2VyTmFtZS4kZXJyb3IucmVxdWlyZWQiPg0KLSAgICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+PGJyPg0KLSAgICAgICAgICAgTGFzdCBuYW1lOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGFzdE5hbWUiIG5nLW1vZGVsPSJ1c2VyLmxhc3QiDQotICAgICAgICAgICAgIG5nLW1pbmxlbmd0aD0iMyIgbmctbWF4bGVuZ3RoPSIxMCI+DQotICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5sYXN0TmFtZS4kZXJyb3IubWlubGVuZ3RoIj4NCi0gICAgICAgICAgICAgVG9vIHNob3J0ITwvc3Bhbj4NCi0gICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmxhc3ROYW1lLiRlcnJvci5tYXhsZW5ndGgiPg0KLSAgICAgICAgICAgICBUb28gbG9uZyE8L3NwYW4+PGJyPg0KLSAgICAgICAgIDwvZm9ybT4NCi0gICAgICAgICA8aHI+DQotICAgICAgICAgPHR0PnVzZXIgPSB7e3VzZXJ9fTwvdHQ+PGJyLz4NCi0gICAgICAgICA8dHQ+bXlGb3JtLnVzZXJOYW1lLiR2YWxpZCA9IHt7bXlGb3JtLnVzZXJOYW1lLiR2YWxpZH19PC90dD48YnI+DQotICAgICAgICAgPHR0Pm15Rm9ybS51c2VyTmFtZS4kZXJyb3IgPSB7e215Rm9ybS51c2VyTmFtZS4kZXJyb3J9fTwvdHQ+PGJyPg0KLSAgICAgICAgIDx0dD5teUZvcm0ubGFzdE5hbWUuJHZhbGlkID0ge3tteUZvcm0ubGFzdE5hbWUuJHZhbGlkfX08L3R0Pjxicj4NCi0gICAgICAgICA8dHQ+bXlGb3JtLmxhc3ROYW1lLiRlcnJvciA9IHt7bXlGb3JtLmxhc3ROYW1lLiRlcnJvcn19PC90dD48YnI+DQotICAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyPg0KLSAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyPg0KLSAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLm1pbmxlbmd0aCA9IHt7ISFteUZvcm0uJGVycm9yLm1pbmxlbmd0aH19PC90dD48YnI+DQotICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IubWF4bGVuZ3RoID0ge3shIW15Rm9ybS4kZXJyb3IubWF4bGVuZ3RofX08L3R0Pjxicj4NCi0gICAgICAgPC9kaXY+DQotICAgICAgPC9maWxlPg0KLSAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICAgdmFyIHVzZXIgPSBlbGVtZW50KGJ5LmV4YWN0QmluZGluZygndXNlcicpKTsNCi0gICAgICAgIHZhciB1c2VyTmFtZVZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0udXNlck5hbWUuJHZhbGlkJykpOw0KLSAgICAgICAgdmFyIGxhc3ROYW1lVmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5sYXN0TmFtZS4kdmFsaWQnKSk7DQotICAgICAgICB2YXIgbGFzdE5hbWVFcnJvciA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmxhc3ROYW1lLiRlcnJvcicpKTsNCi0gICAgICAgIHZhciBmb3JtVmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS4kdmFsaWQnKSk7DQotICAgICAgICB2YXIgdXNlck5hbWVJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3VzZXIubmFtZScpKTsNCi0gICAgICAgIHZhciB1c2VyTGFzdElucHV0ID0gZWxlbWVudChieS5tb2RlbCgndXNlci5sYXN0JykpOw0KLQ0KLSAgICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgIGV4cGVjdCh1c2VyLmdldFRleHQoKSkudG9Db250YWluKCd7Im5hbWUiOiJndWVzdCIsImxhc3QiOiJ2aXNpdG9yIn0nKTsNCi0gICAgICAgICAgZXhwZWN0KHVzZXJOYW1lVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTsNCi0gICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOw0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHkgd2hlbiByZXF1aXJlZCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICB1c2VyTmFtZUlucHV0LmNsZWFyKCk7DQotICAgICAgICAgIHVzZXJOYW1lSW5wdXQuc2VuZEtleXMoJycpOw0KLQ0KLSAgICAgICAgICBleHBlY3QodXNlci5nZXRUZXh0KCkpLnRvQ29udGFpbigneyJsYXN0IjoidmlzaXRvciJ9Jyk7DQotICAgICAgICAgIGV4cGVjdCh1c2VyTmFtZVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOw0KLSAgICAgICAgICBleHBlY3QoZm9ybVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOw0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBpdCgnc2hvdWxkIGJlIHZhbGlkIGlmIGVtcHR5IHdoZW4gbWluIGxlbmd0aCBpcyBzZXQnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgdXNlckxhc3RJbnB1dC5jbGVhcigpOw0KLSAgICAgICAgICB1c2VyTGFzdElucHV0LnNlbmRLZXlzKCcnKTsNCi0NCi0gICAgICAgICAgZXhwZWN0KHVzZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3sibmFtZSI6Imd1ZXN0IiwibGFzdCI6IiJ9Jyk7DQotICAgICAgICAgIGV4cGVjdChsYXN0TmFtZVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7DQotICAgICAgICAgIGV4cGVjdChmb3JtVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTsNCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGxlc3MgdGhhbiByZXF1aXJlZCBtaW4gbGVuZ3RoJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgIHVzZXJMYXN0SW5wdXQuY2xlYXIoKTsNCi0gICAgICAgICAgdXNlckxhc3RJbnB1dC5zZW5kS2V5cygneHgnKTsNCi0NCi0gICAgICAgICAgZXhwZWN0KHVzZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3sibmFtZSI6Imd1ZXN0In0nKTsNCi0gICAgICAgICAgZXhwZWN0KGxhc3ROYW1lVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7DQotICAgICAgICAgIGV4cGVjdChsYXN0TmFtZUVycm9yLmdldFRleHQoKSkudG9Db250YWluKCdtaW5sZW5ndGgnKTsNCi0gICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsNCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGxvbmdlciB0aGFuIG1heCBsZW5ndGgnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgdXNlckxhc3RJbnB1dC5jbGVhcigpOw0KLSAgICAgICAgICB1c2VyTGFzdElucHV0LnNlbmRLZXlzKCdzb21lIHJpZGljdWxvdXNseSBsb25nIG5hbWUnKTsNCi0NCi0gICAgICAgICAgZXhwZWN0KHVzZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3sibmFtZSI6Imd1ZXN0In0nKTsNCi0gICAgICAgICAgZXhwZWN0KGxhc3ROYW1lVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7DQotICAgICAgICAgIGV4cGVjdChsYXN0TmFtZUVycm9yLmdldFRleHQoKSkudG9Db250YWluKCdtYXhsZW5ndGgnKTsNCi0gICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIDwvZmlsZT4NCi0gICAgPC9leGFtcGxlPg0KLSAqLw0KLXZhciBpbnB1dERpcmVjdGl2ZSA9IFsnJGJyb3dzZXInLCAnJHNuaWZmZXInLCAnJGZpbHRlcicsICckcGFyc2UnLA0KLSAgICBmdW5jdGlvbigkYnJvd3NlciwgJHNuaWZmZXIsICRmaWx0ZXIsICRwYXJzZSkgew0KLSAgcmV0dXJuIHsNCi0gICAgcmVzdHJpY3Q6ICdFJywNCi0gICAgcmVxdWlyZTogWyc/bmdNb2RlbCddLA0KLSAgICBsaW5rOiB7DQotICAgICAgcHJlOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybHMpIHsNCi0gICAgICAgIGlmIChjdHJsc1swXSkgew0KLSAgICAgICAgICAoaW5wdXRUeXBlW2xvd2VyY2FzZShhdHRyLnR5cGUpXSB8fCBpbnB1dFR5cGUudGV4dCkoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmxzWzBdLCAkc25pZmZlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRicm93c2VyLCAkZmlsdGVyLCAkcGFyc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfTsNCi19XTsNCi0NCi12YXIgVkFMSURfQ0xBU1MgPSAnbmctdmFsaWQnLA0KLSAgICBJTlZBTElEX0NMQVNTID0gJ25nLWludmFsaWQnLA0KLSAgICBQUklTVElORV9DTEFTUyA9ICduZy1wcmlzdGluZScsDQotICAgIERJUlRZX0NMQVNTID0gJ25nLWRpcnR5JywNCi0gICAgVU5UT1VDSEVEX0NMQVNTID0gJ25nLXVudG91Y2hlZCcsDQotICAgIFRPVUNIRURfQ0xBU1MgPSAnbmctdG91Y2hlZCcsDQotICAgIFBFTkRJTkdfQ0xBU1MgPSAnbmctcGVuZGluZyc7DQotDQotLyoqDQotICogQG5nZG9jIHR5cGUNCi0gKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyDQotICoNCi0gKiBAcHJvcGVydHkge3N0cmluZ30gJHZpZXdWYWx1ZSBBY3R1YWwgc3RyaW5nIHZhbHVlIGluIHRoZSB2aWV3Lg0KLSAqIEBwcm9wZXJ0eSB7Kn0gJG1vZGVsVmFsdWUgVGhlIHZhbHVlIGluIHRoZSBtb2RlbCB0aGF0IHRoZSBjb250cm9sIGlzIGJvdW5kIHRvLg0KLSAqIEBwcm9wZXJ0eSB7QXJyYXkuPEZ1bmN0aW9uPn0gJHBhcnNlcnMgQXJyYXkgb2YgZnVuY3Rpb25zIHRvIGV4ZWN1dGUsIGFzIGEgcGlwZWxpbmUsIHdoZW5ldmVyDQotICAgICAgIHRoZSBjb250cm9sIHJlYWRzIHZhbHVlIGZyb20gdGhlIERPTS4gVGhlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGluIGFycmF5IG9yZGVyLCBlYWNoIHBhc3NpbmcNCi0gICAgICAgaXRzIHJldHVybiB2YWx1ZSB0aHJvdWdoIHRvIHRoZSBuZXh0LiBUaGUgbGFzdCByZXR1cm4gdmFsdWUgaXMgZm9yd2FyZGVkIHRvIHRoZQ0KLSAgICAgICB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmFsaWRhdG9ycyBgJHZhbGlkYXRvcnNgfSBjb2xsZWN0aW9uLg0KLQ0KLVBhcnNlcnMgYXJlIHVzZWQgdG8gc2FuaXRpemUgLyBjb252ZXJ0IHRoZSB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmlld1ZhbHVlDQotYCR2aWV3VmFsdWVgfS4NCi0NCi1SZXR1cm5pbmcgYHVuZGVmaW5lZGAgZnJvbSBhIHBhcnNlciBtZWFucyBhIHBhcnNlIGVycm9yIG9jY3VycmVkLiBJbiB0aGF0IGNhc2UsDQotbm8ge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZhbGlkYXRvcnMgYCR2YWxpZGF0b3JzYH0gd2lsbCBydW4gYW5kIHRoZSBgbmdNb2RlbGANCi13aWxsIGJlIHNldCB0byBgdW5kZWZpbmVkYCB1bmxlc3Mge0BsaW5rIG5nTW9kZWxPcHRpb25zIGBuZ01vZGVsT3B0aW9ucy5hbGxvd0ludmFsaWRgfQ0KLWlzIHNldCB0byBgdHJ1ZWAuIFRoZSBwYXJzZSBlcnJvciBpcyBzdG9yZWQgaW4gYG5nTW9kZWwuJGVycm9yLnBhcnNlYC4NCi0NCi0gKg0KLSAqIEBwcm9wZXJ0eSB7QXJyYXkuPEZ1bmN0aW9uPn0gJGZvcm1hdHRlcnMgQXJyYXkgb2YgZnVuY3Rpb25zIHRvIGV4ZWN1dGUsIGFzIGEgcGlwZWxpbmUsIHdoZW5ldmVyDQotICAgICAgIHRoZSBtb2RlbCB2YWx1ZSBjaGFuZ2VzLiBUaGUgZnVuY3Rpb25zIGFyZSBjYWxsZWQgaW4gcmV2ZXJzZSBhcnJheSBvcmRlciwgZWFjaCBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIHRvIHRoZQ0KLSAgICAgICBuZXh0LiBUaGUgbGFzdCByZXR1cm4gdmFsdWUgaXMgdXNlZCBhcyB0aGUgYWN0dWFsIERPTSB2YWx1ZS4NCi0gICAgICAgVXNlZCB0byBmb3JtYXQgLyBjb252ZXJ0IHZhbHVlcyBmb3IgZGlzcGxheSBpbiB0aGUgY29udHJvbC4NCi0gKiBgYGBqcw0KLSAqIGZ1bmN0aW9uIGZvcm1hdHRlcih2YWx1ZSkgew0KLSAqICAgaWYgKHZhbHVlKSB7DQotICogICAgIHJldHVybiB2YWx1ZS50b1VwcGVyQ2FzZSgpOw0KLSAqICAgfQ0KLSAqIH0NCi0gKiBuZ01vZGVsLiRmb3JtYXR0ZXJzLnB1c2goZm9ybWF0dGVyKTsNCi0gKiBgYGANCi0gKg0KLSAqIEBwcm9wZXJ0eSB7T2JqZWN0LjxzdHJpbmcsIGZ1bmN0aW9uPn0gJHZhbGlkYXRvcnMgQSBjb2xsZWN0aW9uIG9mIHZhbGlkYXRvcnMgdGhhdCBhcmUgYXBwbGllZA0KLSAqICAgICAgd2hlbmV2ZXIgdGhlIG1vZGVsIHZhbHVlIGNoYW5nZXMuIFRoZSBrZXkgdmFsdWUgd2l0aGluIHRoZSBvYmplY3QgcmVmZXJzIHRvIHRoZSBuYW1lIG9mIHRoZQ0KLSAqICAgICAgdmFsaWRhdG9yIHdoaWxlIHRoZSBmdW5jdGlvbiByZWZlcnMgdG8gdGhlIHZhbGlkYXRpb24gb3BlcmF0aW9uLiBUaGUgdmFsaWRhdGlvbiBvcGVyYXRpb24gaXMNCi0gKiAgICAgIHByb3ZpZGVkIHdpdGggdGhlIG1vZGVsIHZhbHVlIGFzIGFuIGFyZ3VtZW50IGFuZCBtdXN0IHJldHVybiBhIHRydWUgb3IgZmFsc2UgdmFsdWUgZGVwZW5kaW5nDQotICogICAgICBvbiB0aGUgcmVzcG9uc2Ugb2YgdGhhdCB2YWxpZGF0aW9uLg0KLSAqDQotICogYGBganMNCi0gKiBuZ01vZGVsLiR2YWxpZGF0b3JzLnZhbGlkQ2hhcmFjdGVycyA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkgew0KLSAqICAgdmFyIHZhbHVlID0gbW9kZWxWYWx1ZSB8fCB2aWV3VmFsdWU7DQotICogICByZXR1cm4gL1swLTldKy8udGVzdCh2YWx1ZSkgJiYNCi0gKiAgICAgICAgICAvW2Etel0rLy50ZXN0KHZhbHVlKSAmJg0KLSAqICAgICAgICAgIC9bQS1aXSsvLnRlc3QodmFsdWUpICYmDQotICogICAgICAgICAgL1xXKy8udGVzdCh2YWx1ZSk7DQotICogfTsNCi0gKiBgYGANCi0gKg0KLSAqIEBwcm9wZXJ0eSB7T2JqZWN0LjxzdHJpbmcsIGZ1bmN0aW9uPn0gJGFzeW5jVmFsaWRhdG9ycyBBIGNvbGxlY3Rpb24gb2YgdmFsaWRhdGlvbnMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8NCi0gKiAgICAgIHBlcmZvcm0gYW4gYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gKGUuZy4gYSBIVFRQIHJlcXVlc3QpLiBUaGUgdmFsaWRhdGlvbiBmdW5jdGlvbiB0aGF0IGlzIHByb3ZpZGVkDQotICogICAgICBpcyBleHBlY3RlZCB0byByZXR1cm4gYSBwcm9taXNlIHdoZW4gaXQgaXMgcnVuIGR1cmluZyB0aGUgbW9kZWwgdmFsaWRhdGlvbiBwcm9jZXNzLiBPbmNlIHRoZSBwcm9taXNlDQotICogICAgICBpcyBkZWxpdmVyZWQgdGhlbiB0aGUgdmFsaWRhdGlvbiBzdGF0dXMgd2lsbCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIGZ1bGZpbGxlZCBhbmQgZmFsc2Ugd2hlbiByZWplY3RlZC4NCi0gKiAgICAgIFdoZW4gdGhlIGFzeW5jaHJvbm91cyB2YWxpZGF0b3JzIGFyZSB0cmlnZ2VyZWQsIGVhY2ggb2YgdGhlIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gcGFyYWxsZWwgYW5kIHRoZSBtb2RlbA0KLSAqICAgICAgdmFsdWUgd2lsbCBvbmx5IGJlIHVwZGF0ZWQgb25jZSBhbGwgdmFsaWRhdG9ycyBoYXZlIGJlZW4gZnVsZmlsbGVkLiBBcyBsb25nIGFzIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0b3INCi0gKiAgICAgIGlzIHVuZnVsZmlsbGVkLCBpdHMga2V5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbnRyb2xsZXJzIGAkcGVuZGluZ2AgcHJvcGVydHkuIEFsc28sIGFsbCBhc3luY2hyb25vdXMgdmFsaWRhdG9ycw0KLSAqICAgICAgd2lsbCBvbmx5IHJ1biBvbmNlIGFsbCBzeW5jaHJvbm91cyB2YWxpZGF0b3JzIGhhdmUgcGFzc2VkLg0KLSAqDQotICogUGxlYXNlIG5vdGUgdGhhdCBpZiAkaHR0cCBpcyB1c2VkIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIHNlcnZlciByZXR1cm5zIGEgc3VjY2VzcyBIVFRQIHJlc3BvbnNlIGNvZGUNCi0gKiBpbiBvcmRlciB0byBmdWxmaWxsIHRoZSB2YWxpZGF0aW9uIGFuZCBhIHN0YXR1cyBsZXZlbCBvZiBgNHh4YCBpbiBvcmRlciB0byByZWplY3QgdGhlIHZhbGlkYXRpb24uDQotICoNCi0gKiBgYGBqcw0KLSAqIG5nTW9kZWwuJGFzeW5jVmFsaWRhdG9ycy51bmlxdWVVc2VybmFtZSA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkgew0KLSAqICAgdmFyIHZhbHVlID0gbW9kZWxWYWx1ZSB8fCB2aWV3VmFsdWU7DQotICoNCi0gKiAgIC8vIExvb2t1cCB1c2VyIGJ5IHVzZXJuYW1lDQotICogICByZXR1cm4gJGh0dHAuZ2V0KCcvYXBpL3VzZXJzLycgKyB2YWx1ZSkuDQotICogICAgICB0aGVuKGZ1bmN0aW9uIHJlc29sdmVkKCkgew0KLSAqICAgICAgICAvL3VzZXJuYW1lIGV4aXN0cywgdGhpcyBtZWFucyB2YWxpZGF0aW9uIGZhaWxzDQotICogICAgICAgIHJldHVybiAkcS5yZWplY3QoJ2V4aXN0cycpOw0KLSAqICAgICAgfSwgZnVuY3Rpb24gcmVqZWN0ZWQoKSB7DQotICogICAgICAgIC8vdXNlcm5hbWUgZG9lcyBub3QgZXhpc3QsIHRoZXJlZm9yZSB0aGlzIHZhbGlkYXRpb24gcGFzc2VzDQotICogICAgICAgIHJldHVybiB0cnVlOw0KLSAqICAgICAgfSk7DQotICogfTsNCi0gKiBgYGANCi0gKg0KLSAqIEBwcm9wZXJ0eSB7QXJyYXkuPEZ1bmN0aW9uPn0gJHZpZXdDaGFuZ2VMaXN0ZW5lcnMgQXJyYXkgb2YgZnVuY3Rpb25zIHRvIGV4ZWN1dGUgd2hlbmV2ZXIgdGhlDQotICogICAgIHZpZXcgdmFsdWUgaGFzIGNoYW5nZWQuIEl0IGlzIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgYW5kIGl0cyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4NCi0gKiAgICAgVGhpcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhZGRpdGlvbmFsICR3YXRjaGVzIGFnYWluc3QgdGhlIG1vZGVsIHZhbHVlLg0KLSAqDQotICogQHByb3BlcnR5IHtPYmplY3R9ICRlcnJvciBBbiBvYmplY3QgaGFzaCB3aXRoIGFsbCBmYWlsaW5nIHZhbGlkYXRvciBpZHMgYXMga2V5cy4NCi0gKiBAcHJvcGVydHkge09iamVjdH0gJHBlbmRpbmcgQW4gb2JqZWN0IGhhc2ggd2l0aCBhbGwgcGVuZGluZyB2YWxpZGF0b3IgaWRzIGFzIGtleXMuDQotICoNCi0gKiBAcHJvcGVydHkge2Jvb2xlYW59ICR1bnRvdWNoZWQgVHJ1ZSBpZiBjb250cm9sIGhhcyBub3QgbG9zdCBmb2N1cyB5ZXQuDQotICogQHByb3BlcnR5IHtib29sZWFufSAkdG91Y2hlZCBUcnVlIGlmIGNvbnRyb2wgaGFzIGxvc3QgZm9jdXMuDQotICogQHByb3BlcnR5IHtib29sZWFufSAkcHJpc3RpbmUgVHJ1ZSBpZiB1c2VyIGhhcyBub3QgaW50ZXJhY3RlZCB3aXRoIHRoZSBjb250cm9sIHlldC4NCi0gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRkaXJ0eSBUcnVlIGlmIHVzZXIgaGFzIGFscmVhZHkgaW50ZXJhY3RlZCB3aXRoIHRoZSBjb250cm9sLg0KLSAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHZhbGlkIFRydWUgaWYgdGhlcmUgaXMgbm8gZXJyb3IuDQotICogQHByb3BlcnR5IHtib29sZWFufSAkaW52YWxpZCBUcnVlIGlmIGF0IGxlYXN0IG9uZSBlcnJvciBvbiB0aGUgY29udHJvbC4NCi0gKiBAcHJvcGVydHkge3N0cmluZ30gJG5hbWUgVGhlIG5hbWUgYXR0cmlidXRlIG9mIHRoZSBjb250cm9sLg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICoNCi0gKiBgTmdNb2RlbENvbnRyb2xsZXJgIHByb3ZpZGVzIEFQSSBmb3IgdGhlIHtAbGluayBuZ01vZGVsIGBuZ01vZGVsYH0gZGlyZWN0aXZlLg0KLSAqIFRoZSBjb250cm9sbGVyIGNvbnRhaW5zIHNlcnZpY2VzIGZvciBkYXRhLWJpbmRpbmcsIHZhbGlkYXRpb24sIENTUyB1cGRhdGVzLCBhbmQgdmFsdWUgZm9ybWF0dGluZw0KLSAqIGFuZCBwYXJzaW5nLiBJdCBwdXJwb3NlZnVsbHkgZG9lcyBub3QgY29udGFpbiBhbnkgbG9naWMgd2hpY2ggZGVhbHMgd2l0aCBET00gcmVuZGVyaW5nIG9yDQotICogbGlzdGVuaW5nIHRvIERPTSBldmVudHMuDQotICogU3VjaCBET00gcmVsYXRlZCBsb2dpYyBzaG91bGQgYmUgcHJvdmlkZWQgYnkgb3RoZXIgZGlyZWN0aXZlcyB3aGljaCBtYWtlIHVzZSBvZg0KLSAqIGBOZ01vZGVsQ29udHJvbGxlcmAgZm9yIGRhdGEtYmluZGluZyB0byBjb250cm9sIGVsZW1lbnRzLg0KLSAqIEFuZ3VsYXIgcHJvdmlkZXMgdGhpcyBET00gbG9naWMgZm9yIG1vc3Qge0BsaW5rIGlucHV0IGBpbnB1dGB9IGVsZW1lbnRzLg0KLSAqIEF0IHRoZSBlbmQgb2YgdGhpcyBwYWdlIHlvdSBjYW4gZmluZCBhIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyI2N1c3RvbS1jb250cm9sLWV4YW1wbGUNCi0gKiBjdXN0b20gY29udHJvbCBleGFtcGxlfSB0aGF0IHVzZXMgYG5nTW9kZWxDb250cm9sbGVyYCB0byBiaW5kIHRvIGBjb250ZW50ZWRpdGFibGVgIGVsZW1lbnRzLg0KLSAqDQotICogQGV4YW1wbGUNCi0gKiAjIyMgQ3VzdG9tIENvbnRyb2wgRXhhbXBsZQ0KLSAqIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGBOZ01vZGVsQ29udHJvbGxlcmAgd2l0aCBhIGN1c3RvbSBjb250cm9sIHRvIGFjaGlldmUNCi0gKiBkYXRhLWJpbmRpbmcuIE5vdGljZSBob3cgZGlmZmVyZW50IGRpcmVjdGl2ZXMgKGBjb250ZW50ZWRpdGFibGVgLCBgbmctbW9kZWxgLCBhbmQgYHJlcXVpcmVkYCkNCi0gKiBjb2xsYWJvcmF0ZSB0b2dldGhlciB0byBhY2hpZXZlIHRoZSBkZXNpcmVkIHJlc3VsdC4NCi0gKg0KLSAqIE5vdGUgdGhhdCBgY29udGVudGVkaXRhYmxlYCBpcyBhbiBIVE1MNSBhdHRyaWJ1dGUsIHdoaWNoIHRlbGxzIHRoZSBicm93c2VyIHRvIGxldCB0aGUgZWxlbWVudA0KLSAqIGNvbnRlbnRzIGJlIGVkaXRlZCBpbiBwbGFjZSBieSB0aGUgdXNlci4gIFRoaXMgd2lsbCBub3Qgd29yayBvbiBvbGRlciBicm93c2Vycy4NCi0gKg0KLSAqIFdlIGFyZSB1c2luZyB0aGUge0BsaW5rIG5nLnNlcnZpY2U6JHNjZSAkc2NlfSBzZXJ2aWNlIGhlcmUgYW5kIGluY2x1ZGUgdGhlIHtAbGluayBuZ1Nhbml0aXplICRzYW5pdGl6ZX0NCi0gKiBtb2R1bGUgdG8gYXV0b21hdGljYWxseSByZW1vdmUgImJhZCIgY29udGVudCBsaWtlIGlubGluZSBldmVudCBsaXN0ZW5lciAoZS5nLiBgPHNwYW4gb25jbGljaz0iLi4uIj5gKS4NCi0gKiBIb3dldmVyLCBhcyB3ZSBhcmUgdXNpbmcgYCRzY2VgIHRoZSBtb2RlbCBjYW4gc3RpbGwgZGVjaWRlIHRvIHByb3ZpZGUgdW5zYWZlIGNvbnRlbnQgaWYgaXQgbWFya3MNCi0gKiB0aGF0IGNvbnRlbnQgdXNpbmcgdGhlIGAkc2NlYCBzZXJ2aWNlLg0KLSAqDQotICogPGV4YW1wbGUgbmFtZT0iTmdNb2RlbENvbnRyb2xsZXIiIG1vZHVsZT0iY3VzdG9tQ29udHJvbCIgZGVwcz0iYW5ndWxhci1zYW5pdGl6ZS5qcyI+DQotICAgIDxmaWxlIG5hbWU9InN0eWxlLmNzcyI+DQotICAgICAgW2NvbnRlbnRlZGl0YWJsZV0gew0KLSAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7DQotICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsNCi0gICAgICAgIG1pbi1oZWlnaHQ6IDIwcHg7DQotICAgICAgfQ0KLQ0KLSAgICAgIC5uZy1pbnZhbGlkIHsNCi0gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJlZDsNCi0gICAgICB9DQotDQotICAgIDwvZmlsZT4NCi0gICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4NCi0gICAgICBhbmd1bGFyLm1vZHVsZSgnY3VzdG9tQ29udHJvbCcsIFsnbmdTYW5pdGl6ZSddKS4NCi0gICAgICAgIGRpcmVjdGl2ZSgnY29udGVudGVkaXRhYmxlJywgWyckc2NlJywgZnVuY3Rpb24oJHNjZSkgew0KLSAgICAgICAgICByZXR1cm4gew0KLSAgICAgICAgICAgIHJlc3RyaWN0OiAnQScsIC8vIG9ubHkgYWN0aXZhdGUgb24gZWxlbWVudCBhdHRyaWJ1dGUNCi0gICAgICAgICAgICByZXF1aXJlOiAnP25nTW9kZWwnLCAvLyBnZXQgYSBob2xkIG9mIE5nTW9kZWxDb250cm9sbGVyDQotICAgICAgICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBuZ01vZGVsKSB7DQotICAgICAgICAgICAgICBpZiAoIW5nTW9kZWwpIHJldHVybjsgLy8gZG8gbm90aGluZyBpZiBubyBuZy1tb2RlbA0KLQ0KLSAgICAgICAgICAgICAgLy8gU3BlY2lmeSBob3cgVUkgc2hvdWxkIGJlIHVwZGF0ZWQNCi0gICAgICAgICAgICAgIG5nTW9kZWwuJHJlbmRlciA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICBlbGVtZW50Lmh0bWwoJHNjZS5nZXRUcnVzdGVkSHRtbChuZ01vZGVsLiR2aWV3VmFsdWUgfHwgJycpKTsNCi0gICAgICAgICAgICAgIH07DQotDQotICAgICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIGNoYW5nZSBldmVudHMgdG8gZW5hYmxlIGJpbmRpbmcNCi0gICAgICAgICAgICAgIGVsZW1lbnQub24oJ2JsdXIga2V5dXAgY2hhbmdlJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgIHNjb3BlLiRldmFsQXN5bmMocmVhZCk7DQotICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICAgIHJlYWQoKTsgLy8gaW5pdGlhbGl6ZQ0KLQ0KLSAgICAgICAgICAgICAgLy8gV3JpdGUgZGF0YSB0byB0aGUgbW9kZWwNCi0gICAgICAgICAgICAgIGZ1bmN0aW9uIHJlYWQoKSB7DQotICAgICAgICAgICAgICAgIHZhciBodG1sID0gZWxlbWVudC5odG1sKCk7DQotICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UgY2xlYXIgdGhlIGNvbnRlbnQgZWRpdGFibGUgdGhlIGJyb3dzZXIgbGVhdmVzIGEgPGJyPiBiZWhpbmQNCi0gICAgICAgICAgICAgICAgLy8gSWYgc3RyaXAtYnIgYXR0cmlidXRlIGlzIHByb3ZpZGVkIHRoZW4gd2Ugc3RyaXAgdGhpcyBvdXQNCi0gICAgICAgICAgICAgICAgaWYgKCBhdHRycy5zdHJpcEJyICYmIGh0bWwgPT0gJzxicj4nICkgew0KLSAgICAgICAgICAgICAgICAgIGh0bWwgPSAnJzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBuZ01vZGVsLiRzZXRWaWV3VmFsdWUoaHRtbCk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9Ow0KLSAgICAgICAgfV0pOw0KLSAgICA8L2ZpbGU+DQotICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgIDxmb3JtIG5hbWU9Im15Rm9ybSI+DQotICAgICAgIDxkaXYgY29udGVudGVkaXRhYmxlDQotICAgICAgICAgICAgbmFtZT0ibXlXaWRnZXQiIG5nLW1vZGVsPSJ1c2VyQ29udGVudCINCi0gICAgICAgICAgICBzdHJpcC1icj0idHJ1ZSINCi0gICAgICAgICAgICByZXF1aXJlZD5DaGFuZ2UgbWUhPC9kaXY+DQotICAgICAgICA8c3BhbiBuZy1zaG93PSJteUZvcm0ubXlXaWRnZXQuJGVycm9yLnJlcXVpcmVkIj5SZXF1aXJlZCE8L3NwYW4+DQotICAgICAgIDxocj4NCi0gICAgICAgPHRleHRhcmVhIG5nLW1vZGVsPSJ1c2VyQ29udGVudCI+PC90ZXh0YXJlYT4NCi0gICAgICA8L2Zvcm0+DQotICAgIDwvZmlsZT4NCi0gICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgIGl0KCdzaG91bGQgZGF0YS1iaW5kIGFuZCBiZWNvbWUgaW52YWxpZCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgIGlmIChicm93c2VyLnBhcmFtcy5icm93c2VyID09ICdzYWZhcmknIHx8IGJyb3dzZXIucGFyYW1zLmJyb3dzZXIgPT0gJ2ZpcmVmb3gnKSB7DQotICAgICAgICAvLyBTYWZhcmlEcml2ZXIgY2FuJ3QgaGFuZGxlIGNvbnRlbnRlZGl0YWJsZQ0KLSAgICAgICAgLy8gYW5kIEZpcmVmb3ggZHJpdmVyIGNhbid0IGNsZWFyIGNvbnRlbnRlZGl0YWJsZXMgdmVyeSB3ZWxsDQotICAgICAgICByZXR1cm47DQotICAgICAgfQ0KLSAgICAgIHZhciBjb250ZW50RWRpdGFibGUgPSBlbGVtZW50KGJ5LmNzcygnW2NvbnRlbnRlZGl0YWJsZV0nKSk7DQotICAgICAgdmFyIGNvbnRlbnQgPSAnQ2hhbmdlIG1lISc7DQotDQotICAgICAgZXhwZWN0KGNvbnRlbnRFZGl0YWJsZS5nZXRUZXh0KCkpLnRvRXF1YWwoY29udGVudCk7DQotDQotICAgICAgY29udGVudEVkaXRhYmxlLmNsZWFyKCk7DQotICAgICAgY29udGVudEVkaXRhYmxlLnNlbmRLZXlzKHByb3RyYWN0b3IuS2V5LkJBQ0tfU1BBQ0UpOw0KLSAgICAgIGV4cGVjdChjb250ZW50RWRpdGFibGUuZ2V0VGV4dCgpKS50b0VxdWFsKCcnKTsNCi0gICAgICBleHBlY3QoY29udGVudEVkaXRhYmxlLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG9NYXRjaCgvbmctaW52YWxpZC1yZXF1aXJlZC8pOw0KLSAgICB9KTsNCi0gICAgPC9maWxlPg0KLSAqIDwvZXhhbXBsZT4NCi0gKg0KLSAqDQotICovDQotdmFyIE5nTW9kZWxDb250cm9sbGVyID0gWyckc2NvcGUnLCAnJGV4Y2VwdGlvbkhhbmRsZXInLCAnJGF0dHJzJywgJyRlbGVtZW50JywgJyRwYXJzZScsICckYW5pbWF0ZScsICckdGltZW91dCcsICckcm9vdFNjb3BlJywgJyRxJywgJyRpbnRlcnBvbGF0ZScsDQotICAgIGZ1bmN0aW9uKCRzY29wZSwgJGV4Y2VwdGlvbkhhbmRsZXIsICRhdHRyLCAkZWxlbWVudCwgJHBhcnNlLCAkYW5pbWF0ZSwgJHRpbWVvdXQsICRyb290U2NvcGUsICRxLCAkaW50ZXJwb2xhdGUpIHsNCi0gIHRoaXMuJHZpZXdWYWx1ZSA9IE51bWJlci5OYU47DQotICB0aGlzLiRtb2RlbFZhbHVlID0gTnVtYmVyLk5hTjsNCi0gIHRoaXMuJCRyYXdNb2RlbFZhbHVlID0gdW5kZWZpbmVkOyAvLyBzdG9yZXMgdGhlIHBhcnNlZCBtb2RlbFZhbHVlIC8gbW9kZWwgc2V0IGZyb20gc2NvcGUgcmVnYXJkbGVzcyBvZiB2YWxpZGl0eS4NCi0gIHRoaXMuJHZhbGlkYXRvcnMgPSB7fTsNCi0gIHRoaXMuJGFzeW5jVmFsaWRhdG9ycyA9IHt9Ow0KLSAgdGhpcy4kcGFyc2VycyA9IFtdOw0KLSAgdGhpcy4kZm9ybWF0dGVycyA9IFtdOw0KLSAgdGhpcy4kdmlld0NoYW5nZUxpc3RlbmVycyA9IFtdOw0KLSAgdGhpcy4kdW50b3VjaGVkID0gdHJ1ZTsNCi0gIHRoaXMuJHRvdWNoZWQgPSBmYWxzZTsNCi0gIHRoaXMuJHByaXN0aW5lID0gdHJ1ZTsNCi0gIHRoaXMuJGRpcnR5ID0gZmFsc2U7DQotICB0aGlzLiR2YWxpZCA9IHRydWU7DQotICB0aGlzLiRpbnZhbGlkID0gZmFsc2U7DQotICB0aGlzLiRlcnJvciA9IHt9OyAvLyBrZWVwIGludmFsaWQga2V5cyBoZXJlDQotICB0aGlzLiQkc3VjY2VzcyA9IHt9OyAvLyBrZWVwIHZhbGlkIGtleXMgaGVyZQ0KLSAgdGhpcy4kcGVuZGluZyA9IHVuZGVmaW5lZDsgLy8ga2VlcCBwZW5kaW5nIGtleXMgaGVyZQ0KLSAgdGhpcy4kbmFtZSA9ICRpbnRlcnBvbGF0ZSgkYXR0ci5uYW1lIHx8ICcnLCBmYWxzZSkoJHNjb3BlKTsNCi0NCi0NCi0gIHZhciBwYXJzZWROZ01vZGVsID0gJHBhcnNlKCRhdHRyLm5nTW9kZWwpLA0KLSAgICAgIHBhcnNlZE5nTW9kZWxBc3NpZ24gPSBwYXJzZWROZ01vZGVsLmFzc2lnbiwNCi0gICAgICBuZ01vZGVsR2V0ID0gcGFyc2VkTmdNb2RlbCwNCi0gICAgICBuZ01vZGVsU2V0ID0gcGFyc2VkTmdNb2RlbEFzc2lnbiwNCi0gICAgICBwZW5kaW5nRGVib3VuY2UgPSBudWxsLA0KLSAgICAgIGN0cmwgPSB0aGlzOw0KLQ0KLSAgdGhpcy4kJHNldE9wdGlvbnMgPSBmdW5jdGlvbihvcHRpb25zKSB7DQotICAgIGN0cmwuJG9wdGlvbnMgPSBvcHRpb25zOw0KLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmdldHRlclNldHRlcikgew0KLSAgICAgIHZhciBpbnZva2VNb2RlbEdldHRlciA9ICRwYXJzZSgkYXR0ci5uZ01vZGVsICsgJygpJyksDQotICAgICAgICAgIGludm9rZU1vZGVsU2V0dGVyID0gJHBhcnNlKCRhdHRyLm5nTW9kZWwgKyAnKCQkJHApJyk7DQotDQotICAgICAgbmdNb2RlbEdldCA9IGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgdmFyIG1vZGVsVmFsdWUgPSBwYXJzZWROZ01vZGVsKCRzY29wZSk7DQotICAgICAgICBpZiAoaXNGdW5jdGlvbihtb2RlbFZhbHVlKSkgew0KLSAgICAgICAgICBtb2RlbFZhbHVlID0gaW52b2tlTW9kZWxHZXR0ZXIoJHNjb3BlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtb2RlbFZhbHVlOw0KLSAgICAgIH07DQotICAgICAgbmdNb2RlbFNldCA9IGZ1bmN0aW9uKCRzY29wZSwgbmV3VmFsdWUpIHsNCi0gICAgICAgIGlmIChpc0Z1bmN0aW9uKHBhcnNlZE5nTW9kZWwoJHNjb3BlKSkpIHsNCi0gICAgICAgICAgaW52b2tlTW9kZWxTZXR0ZXIoJHNjb3BlLCB7JCQkcDogY3RybC4kbW9kZWxWYWx1ZX0pOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgcGFyc2VkTmdNb2RlbEFzc2lnbigkc2NvcGUsIGN0cmwuJG1vZGVsVmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgIH07DQotICAgIH0gZWxzZSBpZiAoIXBhcnNlZE5nTW9kZWwuYXNzaWduKSB7DQotICAgICAgdGhyb3cgJG5nTW9kZWxNaW5FcnIoJ25vbmFzc2lnbicsICJFeHByZXNzaW9uICd7MH0nIGlzIG5vbi1hc3NpZ25hYmxlLiBFbGVtZW50OiB7MX0iLA0KLSAgICAgICAgICAkYXR0ci5uZ01vZGVsLCBzdGFydGluZ1RhZygkZWxlbWVudCkpOw0KLSAgICB9DQotICB9Ow0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRyZW5kZXINCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIENhbGxlZCB3aGVuIHRoZSB2aWV3IG5lZWRzIHRvIGJlIHVwZGF0ZWQuIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHVzZXIgb2YgdGhlIG5nLW1vZGVsDQotICAgKiBkaXJlY3RpdmUgd2lsbCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuDQotICAgKg0KLSAgICogVGhlIGAkcmVuZGVyKClgIG1ldGhvZCBpcyBpbnZva2VkIGluIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uczoNCi0gICAqDQotICAgKiAqIGAkcm9sbGJhY2tWaWV3VmFsdWUoKWAgaXMgY2FsbGVkLiAgSWYgd2UgYXJlIHJvbGxpbmcgYmFjayB0aGUgdmlldyB2YWx1ZSB0byB0aGUgbGFzdA0KLSAgICogICBjb21taXR0ZWQgdmFsdWUgdGhlbiBgJHJlbmRlcigpYCBpcyBjYWxsZWQgdG8gdXBkYXRlIHRoZSBpbnB1dCBjb250cm9sLg0KLSAgICogKiBUaGUgdmFsdWUgcmVmZXJlbmNlZCBieSBgbmctbW9kZWxgIGlzIGNoYW5nZWQgcHJvZ3JhbW1hdGljYWxseSBhbmQgYm90aCB0aGUgYCRtb2RlbFZhbHVlYCBhbmQNCi0gICAqICAgdGhlIGAkdmlld1ZhbHVlYCBhcmUgZGlmZmVyZW50IHRvIGxhc3QgdGltZS4NCi0gICAqDQotICAgKiBTaW5jZSBgbmctbW9kZWxgIGRvZXMgbm90IGRvIGEgZGVlcCB3YXRjaCwgYCRyZW5kZXIoKWAgaXMgb25seSBpbnZva2VkIGlmIHRoZSB2YWx1ZXMgb2YNCi0gICAqIGAkbW9kZWxWYWx1ZWAgYW5kIGAkdmlld1ZhbHVlYCBhcmUgYWN0dWFsbHkgZGlmZmVyZW50IHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlLiBJZiBgJG1vZGVsVmFsdWVgDQotICAgKiBvciBgJHZpZXdWYWx1ZWAgYXJlIG9iamVjdHMgKHJhdGhlciB0aGFuIGEgc3RyaW5nIG9yIG51bWJlcikgdGhlbiBgJHJlbmRlcigpYCB3aWxsIG5vdCBiZQ0KLSAgICogaW52b2tlZCBpZiB5b3Ugb25seSBjaGFuZ2UgYSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0cy4NCi0gICAqLw0KLSAgdGhpcy4kcmVuZGVyID0gbm9vcDsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkaXNFbXB0eQ0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGUgdmFsdWUgb2YgYW4gaW5wdXQgaXMgZW1wdHkuDQotICAgKg0KLSAgICogRm9yIGluc3RhbmNlLCB0aGUgcmVxdWlyZWQgZGlyZWN0aXZlIGRvZXMgdGhpcyB0byB3b3JrIG91dCBpZiB0aGUgaW5wdXQgaGFzIGRhdGEgb3Igbm90Lg0KLSAgICoNCi0gICAqIFRoZSBkZWZhdWx0IGAkaXNFbXB0eWAgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIHZhbHVlIGlzIGB1bmRlZmluZWRgLCBgJydgLCBgbnVsbGAgb3IgYE5hTmAuDQotICAgKg0KLSAgICogWW91IGNhbiBvdmVycmlkZSB0aGlzIGZvciBpbnB1dCBkaXJlY3RpdmVzIHdob3NlIGNvbmNlcHQgb2YgYmVpbmcgZW1wdHkgaXMgZGlmZmVyZW50IHRvIHRoZQ0KLSAgICogZGVmYXVsdC4gVGhlIGBjaGVja2JveElucHV0VHlwZWAgZGlyZWN0aXZlIGRvZXMgdGhpcyBiZWNhdXNlIGluIGl0cyBjYXNlIGEgdmFsdWUgb2YgYGZhbHNlYA0KLSAgICogaW1wbGllcyBlbXB0eS4NCi0gICAqDQotICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgdG8gY2hlY2sgZm9yIGVtcHRpbmVzcy4NCi0gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgImVtcHR5Ii4NCi0gICAqLw0KLSAgdGhpcy4kaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgIHJldHVybiBpc1VuZGVmaW5lZCh2YWx1ZSkgfHwgdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZTsNCi0gIH07DQotDQotICB2YXIgcGFyZW50Rm9ybSA9ICRlbGVtZW50LmluaGVyaXRlZERhdGEoJyRmb3JtQ29udHJvbGxlcicpIHx8IG51bGxGb3JtQ3RybCwNCi0gICAgICBjdXJyZW50VmFsaWRhdGlvblJ1bklkID0gMDsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkc2V0VmFsaWRpdHkNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIENoYW5nZSB0aGUgdmFsaWRpdHkgc3RhdGUsIGFuZCBub3RpZnkgdGhlIGZvcm0uDQotICAgKg0KLSAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB3aXRoaW4gJHBhcnNlcnMvJGZvcm1hdHRlcnMgb3IgYSBjdXN0b20gdmFsaWRhdGlvbiBpbXBsZW1lbnRhdGlvbi4NCi0gICAqIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgaXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gdXNlIHRoZSBgbmdNb2RlbC4kdmFsaWRhdG9yc2AgYW5kDQotICAgKiBgbmdNb2RlbC4kYXN5bmNWYWxpZGF0b3JzYCBjb2xsZWN0aW9ucyB3aGljaCB3aWxsIGNhbGwgYCRzZXRWYWxpZGl0eWAgYXV0b21hdGljYWxseS4NCi0gICAqDQotICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsaWRhdGlvbkVycm9yS2V5IE5hbWUgb2YgdGhlIHZhbGlkYXRvci4gVGhlIGB2YWxpZGF0aW9uRXJyb3JLZXlgIHdpbGwgYmUgYXNzaWduZWQNCi0gICAqICAgICAgICB0byBlaXRoZXIgYCRlcnJvclt2YWxpZGF0aW9uRXJyb3JLZXldYCBvciBgJHBlbmRpbmdbdmFsaWRhdGlvbkVycm9yS2V5XWANCi0gICAqICAgICAgICAoZm9yIHVuZnVsZmlsbGVkIGAkYXN5bmNWYWxpZGF0b3JzYCksIHNvIHRoYXQgaXQgaXMgYXZhaWxhYmxlIGZvciBkYXRhLWJpbmRpbmcuDQotICAgKiAgICAgICAgVGhlIGB2YWxpZGF0aW9uRXJyb3JLZXlgIHNob3VsZCBiZSBpbiBjYW1lbENhc2UgYW5kIHdpbGwgZ2V0IGNvbnZlcnRlZCBpbnRvIGRhc2gtY2FzZQ0KLSAgICogICAgICAgIGZvciBjbGFzcyBuYW1lLiBFeGFtcGxlOiBgbXlFcnJvcmAgd2lsbCByZXN1bHQgaW4gYG5nLXZhbGlkLW15LWVycm9yYCBhbmQgYG5nLWludmFsaWQtbXktZXJyb3JgDQotICAgKiAgICAgICAgY2xhc3MgYW5kIGNhbiBiZSBib3VuZCB0byBhcyAgYHt7c29tZUZvcm0uc29tZUNvbnRyb2wuJGVycm9yLm15RXJyb3J9fWAgLg0KLSAgICogQHBhcmFtIHtib29sZWFufSBpc1ZhbGlkIFdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgaXMgdmFsaWQgKHRydWUpLCBpbnZhbGlkIChmYWxzZSksIHBlbmRpbmcgKHVuZGVmaW5lZCksDQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc2tpcHBlZCAobnVsbCkuIFBlbmRpbmcgaXMgdXNlZCBmb3IgdW5mdWxmaWxsZWQgYCRhc3luY1ZhbGlkYXRvcnNgLg0KLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFNraXBwZWQgaXMgdXNlZCBieSBBbmd1bGFyIHdoZW4gdmFsaWRhdG9ycyBkbyBub3QgcnVuIGJlY2F1c2Ugb2YgcGFyc2UgZXJyb3JzIGFuZA0KLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYCRhc3luY1ZhbGlkYXRvcnNgIGRvIG5vdCBydW4gYmVjYXVzZSBhbnkgb2YgdGhlIGAkdmFsaWRhdG9yc2AgZmFpbGVkLg0KLSAgICovDQotICBhZGRTZXRWYWxpZGl0eU1ldGhvZCh7DQotICAgIGN0cmw6IHRoaXMsDQotICAgICRlbGVtZW50OiAkZWxlbWVudCwNCi0gICAgc2V0OiBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7DQotICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IHRydWU7DQotICAgIH0sDQotICAgIHVuc2V0OiBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7DQotICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07DQotICAgIH0sDQotICAgIHBhcmVudEZvcm06IHBhcmVudEZvcm0sDQotICAgICRhbmltYXRlOiAkYW5pbWF0ZQ0KLSAgfSk7DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHNldFByaXN0aW5lDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBTZXRzIHRoZSBjb250cm9sIHRvIGl0cyBwcmlzdGluZSBzdGF0ZS4NCi0gICAqDQotICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHJlbW92ZSB0aGUgYG5nLWRpcnR5YCBjbGFzcyBhbmQgc2V0IHRoZSBjb250cm9sIHRvIGl0cyBwcmlzdGluZQ0KLSAgICogc3RhdGUgKGBuZy1wcmlzdGluZWAgY2xhc3MpLiBBIG1vZGVsIGlzIGNvbnNpZGVyZWQgdG8gYmUgcHJpc3RpbmUgd2hlbiB0aGUgY29udHJvbA0KLSAgICogaGFzIG5vdCBiZWVuIGNoYW5nZWQgZnJvbSB3aGVuIGZpcnN0IGNvbXBpbGVkLg0KLSAgICovDQotICB0aGlzLiRzZXRQcmlzdGluZSA9IGZ1bmN0aW9uKCkgew0KLSAgICBjdHJsLiRkaXJ0eSA9IGZhbHNlOw0KLSAgICBjdHJsLiRwcmlzdGluZSA9IHRydWU7DQotICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKCRlbGVtZW50LCBESVJUWV9DTEFTUyk7DQotICAgICRhbmltYXRlLmFkZENsYXNzKCRlbGVtZW50LCBQUklTVElORV9DTEFTUyk7DQotICB9Ow0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXREaXJ0eQ0KLSAgICoNCi0gICAqIEBkZXNjcmlwdGlvbg0KLSAgICogU2V0cyB0aGUgY29udHJvbCB0byBpdHMgZGlydHkgc3RhdGUuDQotICAgKg0KLSAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlIGBuZy1wcmlzdGluZWAgY2xhc3MgYW5kIHNldCB0aGUgY29udHJvbCB0byBpdHMgZGlydHkNCi0gICAqIHN0YXRlIChgbmctZGlydHlgIGNsYXNzKS4gQSBtb2RlbCBpcyBjb25zaWRlcmVkIHRvIGJlIGRpcnR5IHdoZW4gdGhlIGNvbnRyb2wgaGFzIGJlZW4gY2hhbmdlZA0KLSAgICogZnJvbSB3aGVuIGZpcnN0IGNvbXBpbGVkLg0KLSAgICovDQotICB0aGlzLiRzZXREaXJ0eSA9IGZ1bmN0aW9uKCkgew0KLSAgICBjdHJsLiRkaXJ0eSA9IHRydWU7DQotICAgIGN0cmwuJHByaXN0aW5lID0gZmFsc2U7DQotICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKCRlbGVtZW50LCBQUklTVElORV9DTEFTUyk7DQotICAgICRhbmltYXRlLmFkZENsYXNzKCRlbGVtZW50LCBESVJUWV9DTEFTUyk7DQotICAgIHBhcmVudEZvcm0uJHNldERpcnR5KCk7DQotICB9Ow0KLQ0KLSAgLyoqDQotICAgKiBAbmdkb2MgbWV0aG9kDQotICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXRVbnRvdWNoZWQNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFNldHMgdGhlIGNvbnRyb2wgdG8gaXRzIHVudG91Y2hlZCBzdGF0ZS4NCi0gICAqDQotICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHJlbW92ZSB0aGUgYG5nLXRvdWNoZWRgIGNsYXNzIGFuZCBzZXQgdGhlIGNvbnRyb2wgdG8gaXRzDQotICAgKiB1bnRvdWNoZWQgc3RhdGUgKGBuZy11bnRvdWNoZWRgIGNsYXNzKS4gVXBvbiBjb21waWxhdGlvbiwgYSBtb2RlbCBpcyBzZXQgYXMgdW50b3VjaGVkDQotICAgKiBieSBkZWZhdWx0LCBob3dldmVyIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdG9yZSB0aGF0IHN0YXRlIGlmIHRoZSBtb2RlbCBoYXMNCi0gICAqIGFscmVhZHkgYmVlbiB0b3VjaGVkIGJ5IHRoZSB1c2VyLg0KLSAgICovDQotICB0aGlzLiRzZXRVbnRvdWNoZWQgPSBmdW5jdGlvbigpIHsNCi0gICAgY3RybC4kdG91Y2hlZCA9IGZhbHNlOw0KLSAgICBjdHJsLiR1bnRvdWNoZWQgPSB0cnVlOw0KLSAgICAkYW5pbWF0ZS5zZXRDbGFzcygkZWxlbWVudCwgVU5UT1VDSEVEX0NMQVNTLCBUT1VDSEVEX0NMQVNTKTsNCi0gIH07DQotDQotICAvKioNCi0gICAqIEBuZ2RvYyBtZXRob2QNCi0gICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHNldFRvdWNoZWQNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFNldHMgdGhlIGNvbnRyb2wgdG8gaXRzIHRvdWNoZWQgc3RhdGUuDQotICAgKg0KLSAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlIGBuZy11bnRvdWNoZWRgIGNsYXNzIGFuZCBzZXQgdGhlIGNvbnRyb2wgdG8gaXRzDQotICAgKiB0b3VjaGVkIHN0YXRlIChgbmctdG91Y2hlZGAgY2xhc3MpLiBBIG1vZGVsIGlzIGNvbnNpZGVyZWQgdG8gYmUgdG91Y2hlZCB3aGVuIHRoZSB1c2VyIGhhcw0KLSAgICogZmlyc3QgZm9jdXNlZCB0aGUgY29udHJvbCBlbGVtZW50IGFuZCB0aGVuIHNoaWZ0ZWQgZm9jdXMgYXdheSBmcm9tIHRoZSBjb250cm9sIChibHVyIGV2ZW50KS4NCi0gICAqLw0KLSAgdGhpcy4kc2V0VG91Y2hlZCA9IGZ1bmN0aW9uKCkgew0KLSAgICBjdHJsLiR0b3VjaGVkID0gdHJ1ZTsNCi0gICAgY3RybC4kdW50b3VjaGVkID0gZmFsc2U7DQotICAgICRhbmltYXRlLnNldENsYXNzKCRlbGVtZW50LCBUT1VDSEVEX0NMQVNTLCBVTlRPVUNIRURfQ0xBU1MpOw0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkcm9sbGJhY2tWaWV3VmFsdWUNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIENhbmNlbCBhbiB1cGRhdGUgYW5kIHJlc2V0IHRoZSBpbnB1dCBlbGVtZW50J3MgdmFsdWUgdG8gcHJldmVudCBhbiB1cGRhdGUgdG8gdGhlIGAkbW9kZWxWYWx1ZWAsDQotICAgKiB3aGljaCBtYXkgYmUgY2F1c2VkIGJ5IGEgcGVuZGluZyBkZWJvdW5jZWQgZXZlbnQgb3IgYmVjYXVzZSB0aGUgaW5wdXQgaXMgd2FpdGluZyBmb3IgYSBzb21lDQotICAgKiBmdXR1cmUgZXZlbnQuDQotICAgKg0KLSAgICogSWYgeW91IGhhdmUgYW4gaW5wdXQgdGhhdCB1c2VzIGBuZy1tb2RlbC1vcHRpb25zYCB0byBzZXQgdXAgZGVib3VuY2VkIGV2ZW50cyBvciBldmVudHMgc3VjaA0KLSAgICogYXMgYmx1ciB5b3UgY2FuIGhhdmUgYSBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgYSBwZXJpb2Qgd2hlbiB0aGUgYCR2aWV3VmFsdWVgDQotICAgKiBpcyBvdXQgb2Ygc3luY2ggd2l0aCB0aGUgbmdNb2RlbCdzIGAkbW9kZWxWYWx1ZWAuDQotICAgKg0KLSAgICogSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHJ1biBpbnRvIGRpZmZpY3VsdGllcyBpZiB5b3UgdHJ5IHRvIHVwZGF0ZSB0aGUgbmdNb2RlbCdzIGAkbW9kZWxWYWx1ZWANCi0gICAqIHByb2dyYW1tYXRpY2FsbHkgYmVmb3JlIHRoZXNlIGRlYm91bmNlZC9mdXR1cmUgZXZlbnRzIGhhdmUgcmVzb2x2ZWQvb2NjdXJyZWQsIGJlY2F1c2UgQW5ndWxhcidzDQotICAgKiBkaXJ0eSBjaGVja2luZyBtZWNoYW5pc20gaXMgbm90IGFibGUgdG8gdGVsbCB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgYWN0dWFsbHkgY2hhbmdlZCBvciBub3QuDQotICAgKg0KLSAgICogVGhlIGAkcm9sbGJhY2tWaWV3VmFsdWUoKWAgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHByb2dyYW1tYXRpY2FsbHkgY2hhbmdpbmcgdGhlIG1vZGVsIG9mIGFuDQotICAgKiBpbnB1dCB3aGljaCBtYXkgaGF2ZSBzdWNoIGV2ZW50cyBwZW5kaW5nLiBUaGlzIGlzIGltcG9ydGFudCBpbiBvcmRlciB0byBtYWtlIHN1cmUgdGhhdCB0aGUNCi0gICAqIGlucHV0IGZpZWxkIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBuZXcgbW9kZWwgdmFsdWUgYW5kIGFueSBwZW5kaW5nIG9wZXJhdGlvbnMgYXJlIGNhbmNlbGxlZC4NCi0gICAqDQotICAgKiA8ZXhhbXBsZSBuYW1lPSJuZy1tb2RlbC1jYW5jZWwtdXBkYXRlIiBtb2R1bGU9ImNhbmNlbC11cGRhdGUtZXhhbXBsZSI+DQotICAgKiAgIDxmaWxlIG5hbWU9ImFwcC5qcyI+DQotICAgKiAgICAgYW5ndWxhci5tb2R1bGUoJ2NhbmNlbC11cGRhdGUtZXhhbXBsZScsIFtdKQ0KLSAgICoNCi0gICAqICAgICAuY29udHJvbGxlcignQ2FuY2VsVXBkYXRlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgKiAgICAgICAkc2NvcGUucmVzZXRXaXRoQ2FuY2VsID0gZnVuY3Rpb24oZSkgew0KLSAgICogICAgICAgICBpZiAoZS5rZXlDb2RlID09IDI3KSB7DQotICAgKiAgICAgICAgICAgJHNjb3BlLm15Rm9ybS5teUlucHV0MS4kcm9sbGJhY2tWaWV3VmFsdWUoKTsNCi0gICAqICAgICAgICAgICAkc2NvcGUubXlWYWx1ZSA9ICcnOw0KLSAgICogICAgICAgICB9DQotICAgKiAgICAgICB9Ow0KLSAgICogICAgICAgJHNjb3BlLnJlc2V0V2l0aG91dENhbmNlbCA9IGZ1bmN0aW9uKGUpIHsNCi0gICAqICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAyNykgew0KLSAgICogICAgICAgICAgICRzY29wZS5teVZhbHVlID0gJyc7DQotICAgKiAgICAgICAgIH0NCi0gICAqICAgICAgIH07DQotICAgKiAgICAgfV0pOw0KLSAgICogICA8L2ZpbGU+DQotICAgKiAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICogICAgIDxkaXYgbmctY29udHJvbGxlcj0iQ2FuY2VsVXBkYXRlQ29udHJvbGxlciI+DQotICAgKiAgICAgICA8cD5UcnkgdHlwaW5nIHNvbWV0aGluZyBpbiBlYWNoIGlucHV0LiAgU2VlIHRoYXQgdGhlIG1vZGVsIG9ubHkgdXBkYXRlcyB3aGVuIHlvdQ0KLSAgICogICAgICAgICAgYmx1ciBvZmYgdGhlIGlucHV0Lg0KLSAgICogICAgICAgIDwvcD4NCi0gICAqICAgICAgICA8cD5Ob3cgc2VlIHdoYXQgaGFwcGVucyBpZiB5b3Ugc3RhcnQgdHlwaW5nIHRoZW4gcHJlc3MgdGhlIEVzY2FwZSBrZXk8L3A+DQotICAgKg0KLSAgICogICAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1tb2RlbC1vcHRpb25zPSJ7IHVwZGF0ZU9uOiAnYmx1cicgfSI+DQotICAgKiAgICAgICAgIDxwPldpdGggJHJvbGxiYWNrVmlld1ZhbHVlKCk8L3A+DQotICAgKiAgICAgICAgIDxpbnB1dCBuYW1lPSJteUlucHV0MSIgbmctbW9kZWw9Im15VmFsdWUiIG5nLWtleWRvd249InJlc2V0V2l0aENhbmNlbCgkZXZlbnQpIj48YnIvPg0KLSAgICogICAgICAgICBteVZhbHVlOiAie3sgbXlWYWx1ZSB9fSINCi0gICAqDQotICAgKiAgICAgICAgIDxwPldpdGhvdXQgJHJvbGxiYWNrVmlld1ZhbHVlKCk8L3A+DQotICAgKiAgICAgICAgIDxpbnB1dCBuYW1lPSJteUlucHV0MiIgbmctbW9kZWw9Im15VmFsdWUiIG5nLWtleWRvd249InJlc2V0V2l0aG91dENhbmNlbCgkZXZlbnQpIj48YnIvPg0KLSAgICogICAgICAgICBteVZhbHVlOiAie3sgbXlWYWx1ZSB9fSINCi0gICAqICAgICAgIDwvZm9ybT4NCi0gICAqICAgICA8L2Rpdj4NCi0gICAqICAgPC9maWxlPg0KLSAgICogPC9leGFtcGxlPg0KLSAgICovDQotICB0aGlzLiRyb2xsYmFja1ZpZXdWYWx1ZSA9IGZ1bmN0aW9uKCkgew0KLSAgICAkdGltZW91dC5jYW5jZWwocGVuZGluZ0RlYm91bmNlKTsNCi0gICAgY3RybC4kdmlld1ZhbHVlID0gY3RybC4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWU7DQotICAgIGN0cmwuJHJlbmRlcigpOw0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmFsaWRhdGUNCi0gICAqDQotICAgKiBAZGVzY3JpcHRpb24NCi0gICAqIFJ1bnMgZWFjaCBvZiB0aGUgcmVnaXN0ZXJlZCB2YWxpZGF0b3JzIChmaXJzdCBzeW5jaHJvbm91cyB2YWxpZGF0b3JzIGFuZCB0aGVuDQotICAgKiBhc3luY2hyb25vdXMgdmFsaWRhdG9ycykuDQotICAgKiBJZiB0aGUgdmFsaWRpdHkgY2hhbmdlcyB0byBpbnZhbGlkLCB0aGUgbW9kZWwgd2lsbCBiZSBzZXQgdG8gYHVuZGVmaW5lZGAsDQotICAgKiB1bmxlc3Mge0BsaW5rIG5nTW9kZWxPcHRpb25zIGBuZ01vZGVsT3B0aW9ucy5hbGxvd0ludmFsaWRgfSBpcyBgdHJ1ZWAuDQotICAgKiBJZiB0aGUgdmFsaWRpdHkgY2hhbmdlcyB0byB2YWxpZCwgaXQgd2lsbCBzZXQgdGhlIG1vZGVsIHRvIHRoZSBsYXN0IGF2YWlsYWJsZSB2YWxpZA0KLSAgICogbW9kZWxWYWx1ZSwgaS5lLiBlaXRoZXIgdGhlIGxhc3QgcGFyc2VkIHZhbHVlIG9yIHRoZSBsYXN0IHZhbHVlIHNldCBmcm9tIHRoZSBzY29wZS4NCi0gICAqLw0KLSAgdGhpcy4kdmFsaWRhdGUgPSBmdW5jdGlvbigpIHsNCi0gICAgLy8gaWdub3JlICR2YWxpZGF0ZSBiZWZvcmUgbW9kZWwgaXMgaW5pdGlhbGl6ZWQNCi0gICAgaWYgKGlzTnVtYmVyKGN0cmwuJG1vZGVsVmFsdWUpICYmIGlzTmFOKGN0cmwuJG1vZGVsVmFsdWUpKSB7DQotICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotICAgIHZhciB2aWV3VmFsdWUgPSBjdHJsLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZTsNCi0gICAgLy8gTm90ZTogd2UgdXNlIHRoZSAkJHJhd01vZGVsVmFsdWUgYXMgJG1vZGVsVmFsdWUgbWlnaHQgaGF2ZSBiZWVuDQotICAgIC8vIHNldCB0byB1bmRlZmluZWQgZHVyaW5nIGEgdmlldyAtPiBtb2RlbCB1cGRhdGUgdGhhdCBmb3VuZCB2YWxpZGF0aW9uDQotICAgIC8vIGVycm9ycy4gV2UgY2FuJ3QgcGFyc2UgdGhlIHZpZXcgaGVyZSwgc2luY2UgdGhhdCBjb3VsZCBjaGFuZ2UNCi0gICAgLy8gdGhlIG1vZGVsIGFsdGhvdWdoIG5laXRoZXIgdmlld1ZhbHVlIG5vciB0aGUgbW9kZWwgb24gdGhlIHNjb3BlIGNoYW5nZWQNCi0gICAgdmFyIG1vZGVsVmFsdWUgPSBjdHJsLiQkcmF3TW9kZWxWYWx1ZTsNCi0NCi0gICAgLy8gQ2hlY2sgaWYgdGhlIHRoZXJlJ3MgYSBwYXJzZSBlcnJvciwgc28gd2UgZG9uJ3QgdW5zZXQgaXQgYWNjaWRlbnRpYWxseQ0KLSAgICB2YXIgcGFyc2VyTmFtZSA9IGN0cmwuJCRwYXJzZXJOYW1lIHx8ICdwYXJzZSc7DQotICAgIHZhciBwYXJzZXJWYWxpZCA9IGN0cmwuJGVycm9yW3BhcnNlck5hbWVdID8gZmFsc2UgOiB1bmRlZmluZWQ7DQotDQotICAgIHZhciBwcmV2VmFsaWQgPSBjdHJsLiR2YWxpZDsNCi0gICAgdmFyIHByZXZNb2RlbFZhbHVlID0gY3RybC4kbW9kZWxWYWx1ZTsNCi0NCi0gICAgdmFyIGFsbG93SW52YWxpZCA9IGN0cmwuJG9wdGlvbnMgJiYgY3RybC4kb3B0aW9ucy5hbGxvd0ludmFsaWQ7DQotDQotICAgIGN0cmwuJCRydW5WYWxpZGF0b3JzKHBhcnNlclZhbGlkLCBtb2RlbFZhbHVlLCB2aWV3VmFsdWUsIGZ1bmN0aW9uKGFsbFZhbGlkKSB7DQotICAgICAgLy8gSWYgdGhlcmUgd2FzIG5vIGNoYW5nZSBpbiB2YWxpZGl0eSwgZG9uJ3QgdXBkYXRlIHRoZSBtb2RlbA0KLSAgICAgIC8vIFRoaXMgcHJldmVudHMgY2hhbmdpbmcgYW4gaW52YWxpZCBtb2RlbFZhbHVlIHRvIHVuZGVmaW5lZA0KLSAgICAgIGlmICghYWxsb3dJbnZhbGlkICYmIHByZXZWYWxpZCAhPT0gYWxsVmFsaWQpIHsNCi0gICAgICAgIC8vIE5vdGU6IERvbid0IGNoZWNrIGN0cmwuJHZhbGlkIGhlcmUsIGFzIHdlIGNvdWxkIGhhdmUNCi0gICAgICAgIC8vIGV4dGVybmFsIHZhbGlkYXRvcnMgKGUuZy4gY2FsY3VsYXRlZCBvbiB0aGUgc2VydmVyKSwNCi0gICAgICAgIC8vIHRoYXQganVzdCBjYWxsICRzZXRWYWxpZGl0eSBhbmQgbmVlZCB0aGUgbW9kZWwgdmFsdWUNCi0gICAgICAgIC8vIHRvIGNhbGN1bGF0ZSB0aGVpciB2YWxpZGl0eS4NCi0gICAgICAgIGN0cmwuJG1vZGVsVmFsdWUgPSBhbGxWYWxpZCA/IG1vZGVsVmFsdWUgOiB1bmRlZmluZWQ7DQotDQotICAgICAgICBpZiAoY3RybC4kbW9kZWxWYWx1ZSAhPT0gcHJldk1vZGVsVmFsdWUpIHsNCi0gICAgICAgICAgY3RybC4kJHdyaXRlTW9kZWxUb1Njb3BlKCk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9KTsNCi0NCi0gIH07DQotDQotICB0aGlzLiQkcnVuVmFsaWRhdG9ycyA9IGZ1bmN0aW9uKHBhcnNlVmFsaWQsIG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSwgZG9uZUNhbGxiYWNrKSB7DQotICAgIGN1cnJlbnRWYWxpZGF0aW9uUnVuSWQrKzsNCi0gICAgdmFyIGxvY2FsVmFsaWRhdGlvblJ1bklkID0gY3VycmVudFZhbGlkYXRpb25SdW5JZDsNCi0NCi0gICAgLy8gY2hlY2sgcGFyc2VyIGVycm9yDQotICAgIGlmICghcHJvY2Vzc1BhcnNlRXJyb3JzKHBhcnNlVmFsaWQpKSB7DQotICAgICAgdmFsaWRhdGlvbkRvbmUoZmFsc2UpOw0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBpZiAoIXByb2Nlc3NTeW5jVmFsaWRhdG9ycygpKSB7DQotICAgICAgdmFsaWRhdGlvbkRvbmUoZmFsc2UpOw0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBwcm9jZXNzQXN5bmNWYWxpZGF0b3JzKCk7DQotDQotICAgIGZ1bmN0aW9uIHByb2Nlc3NQYXJzZUVycm9ycyhwYXJzZVZhbGlkKSB7DQotICAgICAgdmFyIGVycm9yS2V5ID0gY3RybC4kJHBhcnNlck5hbWUgfHwgJ3BhcnNlJzsNCi0gICAgICBpZiAocGFyc2VWYWxpZCA9PT0gdW5kZWZpbmVkKSB7DQotICAgICAgICBzZXRWYWxpZGl0eShlcnJvcktleSwgbnVsbCk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHNldFZhbGlkaXR5KGVycm9yS2V5LCBwYXJzZVZhbGlkKTsNCi0gICAgICAgIGlmICghcGFyc2VWYWxpZCkgew0KLSAgICAgICAgICBmb3JFYWNoKGN0cmwuJHZhbGlkYXRvcnMsIGZ1bmN0aW9uKHYsIG5hbWUpIHsNCi0gICAgICAgICAgICBzZXRWYWxpZGl0eShuYW1lLCBudWxsKTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICAgIGZvckVhY2goY3RybC4kYXN5bmNWYWxpZGF0b3JzLCBmdW5jdGlvbih2LCBuYW1lKSB7DQotICAgICAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgbnVsbCk7DQotICAgICAgICAgIH0pOw0KLSAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIHByb2Nlc3NTeW5jVmFsaWRhdG9ycygpIHsNCi0gICAgICB2YXIgc3luY1ZhbGlkYXRvcnNWYWxpZCA9IHRydWU7DQotICAgICAgZm9yRWFjaChjdHJsLiR2YWxpZGF0b3JzLCBmdW5jdGlvbih2YWxpZGF0b3IsIG5hbWUpIHsNCi0gICAgICAgIHZhciByZXN1bHQgPSB2YWxpZGF0b3IobW9kZWxWYWx1ZSwgdmlld1ZhbHVlKTsNCi0gICAgICAgIHN5bmNWYWxpZGF0b3JzVmFsaWQgPSBzeW5jVmFsaWRhdG9yc1ZhbGlkICYmIHJlc3VsdDsNCi0gICAgICAgIHNldFZhbGlkaXR5KG5hbWUsIHJlc3VsdCk7DQotICAgICAgfSk7DQotICAgICAgaWYgKCFzeW5jVmFsaWRhdG9yc1ZhbGlkKSB7DQotICAgICAgICBmb3JFYWNoKGN0cmwuJGFzeW5jVmFsaWRhdG9ycywgZnVuY3Rpb24odiwgbmFtZSkgew0KLSAgICAgICAgICBzZXRWYWxpZGl0eShuYW1lLCBudWxsKTsNCi0gICAgICAgIH0pOw0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBwcm9jZXNzQXN5bmNWYWxpZGF0b3JzKCkgew0KLSAgICAgIHZhciB2YWxpZGF0b3JQcm9taXNlcyA9IFtdOw0KLSAgICAgIHZhciBhbGxWYWxpZCA9IHRydWU7DQotICAgICAgZm9yRWFjaChjdHJsLiRhc3luY1ZhbGlkYXRvcnMsIGZ1bmN0aW9uKHZhbGlkYXRvciwgbmFtZSkgew0KLSAgICAgICAgdmFyIHByb21pc2UgPSB2YWxpZGF0b3IobW9kZWxWYWx1ZSwgdmlld1ZhbHVlKTsNCi0gICAgICAgIGlmICghaXNQcm9taXNlTGlrZShwcm9taXNlKSkgew0KLSAgICAgICAgICB0aHJvdyAkbmdNb2RlbE1pbkVycigiJGFzeW5jVmFsaWRhdG9ycyIsDQotICAgICAgICAgICAgIkV4cGVjdGVkIGFzeW5jaHJvbm91cyB2YWxpZGF0b3IgdG8gcmV0dXJuIGEgcHJvbWlzZSBidXQgZ290ICd7MH0nIGluc3RlYWQuIiwgcHJvbWlzZSk7DQotICAgICAgICB9DQotICAgICAgICBzZXRWYWxpZGl0eShuYW1lLCB1bmRlZmluZWQpOw0KLSAgICAgICAgdmFsaWRhdG9yUHJvbWlzZXMucHVzaChwcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7DQotICAgICAgICAgIHNldFZhbGlkaXR5KG5hbWUsIHRydWUpOw0KLSAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHsNCi0gICAgICAgICAgYWxsVmFsaWQgPSBmYWxzZTsNCi0gICAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgZmFsc2UpOw0KLSAgICAgICAgfSkpOw0KLSAgICAgIH0pOw0KLSAgICAgIGlmICghdmFsaWRhdG9yUHJvbWlzZXMubGVuZ3RoKSB7DQotICAgICAgICB2YWxpZGF0aW9uRG9uZSh0cnVlKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgJHEuYWxsKHZhbGlkYXRvclByb21pc2VzKS50aGVuKGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICB2YWxpZGF0aW9uRG9uZShhbGxWYWxpZCk7DQotICAgICAgICB9LCBub29wKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gc2V0VmFsaWRpdHkobmFtZSwgaXNWYWxpZCkgew0KLSAgICAgIGlmIChsb2NhbFZhbGlkYXRpb25SdW5JZCA9PT0gY3VycmVudFZhbGlkYXRpb25SdW5JZCkgew0KLSAgICAgICAgY3RybC4kc2V0VmFsaWRpdHkobmFtZSwgaXNWYWxpZCk7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIHZhbGlkYXRpb25Eb25lKGFsbFZhbGlkKSB7DQotICAgICAgaWYgKGxvY2FsVmFsaWRhdGlvblJ1bklkID09PSBjdXJyZW50VmFsaWRhdGlvblJ1bklkKSB7DQotDQotICAgICAgICBkb25lQ2FsbGJhY2soYWxsVmFsaWQpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkY29tbWl0Vmlld1ZhbHVlDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBDb21taXQgYSBwZW5kaW5nIHVwZGF0ZSB0byB0aGUgYCRtb2RlbFZhbHVlYC4NCi0gICAqDQotICAgKiBVcGRhdGVzIG1heSBiZSBwZW5kaW5nIGJ5IGEgZGVib3VuY2VkIGV2ZW50IG9yIGJlY2F1c2UgdGhlIGlucHV0IGlzIHdhaXRpbmcgZm9yIGEgc29tZSBmdXR1cmUNCi0gICAqIGV2ZW50IGRlZmluZWQgaW4gYG5nLW1vZGVsLW9wdGlvbnNgLiB0aGlzIG1ldGhvZCBpcyByYXJlbHkgbmVlZGVkIGFzIGBOZ01vZGVsQ29udHJvbGxlcmANCi0gICAqIHVzdWFsbHkgaGFuZGxlcyBjYWxsaW5nIHRoaXMgaW4gcmVzcG9uc2UgdG8gaW5wdXQgZXZlbnRzLg0KLSAgICovDQotICB0aGlzLiRjb21taXRWaWV3VmFsdWUgPSBmdW5jdGlvbigpIHsNCi0gICAgdmFyIHZpZXdWYWx1ZSA9IGN0cmwuJHZpZXdWYWx1ZTsNCi0NCi0gICAgJHRpbWVvdXQuY2FuY2VsKHBlbmRpbmdEZWJvdW5jZSk7DQotDQotICAgIC8vIElmIHRoZSB2aWV3IHZhbHVlIGhhcyBub3QgY2hhbmdlZCB0aGVuIHdlIHNob3VsZCBqdXN0IGV4aXQsIGV4Y2VwdCBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcw0KLSAgICAvLyBhIG5hdGl2ZSB2YWxpZGF0b3Igb24gdGhlIGVsZW1lbnQuIEluIHRoaXMgY2FzZSB0aGUgdmFsaWRhdGlvbiBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkIGV2ZW4gdGhvdWdoDQotICAgIC8vIHRoZSB2aWV3VmFsdWUgaGFzIHN0YXllZCBlbXB0eS4NCi0gICAgaWYgKGN0cmwuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlID09PSB2aWV3VmFsdWUgJiYgKHZpZXdWYWx1ZSAhPT0gJycgfHwgIWN0cmwuJCRoYXNOYXRpdmVWYWxpZGF0b3JzKSkgew0KLSAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBjdHJsLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZSA9IHZpZXdWYWx1ZTsNCi0NCi0gICAgLy8gY2hhbmdlIHRvIGRpcnR5DQotICAgIGlmIChjdHJsLiRwcmlzdGluZSkgew0KLSAgICAgIHRoaXMuJHNldERpcnR5KCk7DQotICAgIH0NCi0gICAgdGhpcy4kJHBhcnNlQW5kVmFsaWRhdGUoKTsNCi0gIH07DQotDQotICB0aGlzLiQkcGFyc2VBbmRWYWxpZGF0ZSA9IGZ1bmN0aW9uKCkgew0KLSAgICB2YXIgdmlld1ZhbHVlID0gY3RybC4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWU7DQotICAgIHZhciBtb2RlbFZhbHVlID0gdmlld1ZhbHVlOw0KLSAgICB2YXIgcGFyc2VyVmFsaWQgPSBpc1VuZGVmaW5lZChtb2RlbFZhbHVlKSA/IHVuZGVmaW5lZCA6IHRydWU7DQotDQotICAgIGlmIChwYXJzZXJWYWxpZCkgew0KLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3RybC4kcGFyc2Vycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgbW9kZWxWYWx1ZSA9IGN0cmwuJHBhcnNlcnNbaV0obW9kZWxWYWx1ZSk7DQotICAgICAgICBpZiAoaXNVbmRlZmluZWQobW9kZWxWYWx1ZSkpIHsNCi0gICAgICAgICAgcGFyc2VyVmFsaWQgPSBmYWxzZTsNCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChpc051bWJlcihjdHJsLiRtb2RlbFZhbHVlKSAmJiBpc05hTihjdHJsLiRtb2RlbFZhbHVlKSkgew0KLSAgICAgIC8vIGN0cmwuJG1vZGVsVmFsdWUgaGFzIG5vdCBiZWVuIHRvdWNoZWQgeWV0Li4uDQotICAgICAgY3RybC4kbW9kZWxWYWx1ZSA9IG5nTW9kZWxHZXQoJHNjb3BlKTsNCi0gICAgfQ0KLSAgICB2YXIgcHJldk1vZGVsVmFsdWUgPSBjdHJsLiRtb2RlbFZhbHVlOw0KLSAgICB2YXIgYWxsb3dJbnZhbGlkID0gY3RybC4kb3B0aW9ucyAmJiBjdHJsLiRvcHRpb25zLmFsbG93SW52YWxpZDsNCi0gICAgY3RybC4kJHJhd01vZGVsVmFsdWUgPSBtb2RlbFZhbHVlOw0KLQ0KLSAgICBpZiAoYWxsb3dJbnZhbGlkKSB7DQotICAgICAgY3RybC4kbW9kZWxWYWx1ZSA9IG1vZGVsVmFsdWU7DQotICAgICAgd3JpdGVUb01vZGVsSWZOZWVkZWQoKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBQYXNzIHRoZSAkJGxhc3RDb21taXR0ZWRWaWV3VmFsdWUgaGVyZSwgYmVjYXVzZSB0aGUgY2FjaGVkIHZpZXdWYWx1ZSBtaWdodCBiZSBvdXQgb2YgZGF0ZS4NCi0gICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGUuZy4gJHNldFZpZXdWYWx1ZSBpcyBjYWxsZWQgZnJvbSBpbnNpZGUgYSBwYXJzZXINCi0gICAgY3RybC4kJHJ1blZhbGlkYXRvcnMocGFyc2VyVmFsaWQsIG1vZGVsVmFsdWUsIGN0cmwuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlLCBmdW5jdGlvbihhbGxWYWxpZCkgew0KLSAgICAgIGlmICghYWxsb3dJbnZhbGlkKSB7DQotICAgICAgICAvLyBOb3RlOiBEb24ndCBjaGVjayBjdHJsLiR2YWxpZCBoZXJlLCBhcyB3ZSBjb3VsZCBoYXZlDQotICAgICAgICAvLyBleHRlcm5hbCB2YWxpZGF0b3JzIChlLmcuIGNhbGN1bGF0ZWQgb24gdGhlIHNlcnZlciksDQotICAgICAgICAvLyB0aGF0IGp1c3QgY2FsbCAkc2V0VmFsaWRpdHkgYW5kIG5lZWQgdGhlIG1vZGVsIHZhbHVlDQotICAgICAgICAvLyB0byBjYWxjdWxhdGUgdGhlaXIgdmFsaWRpdHkuDQotICAgICAgICBjdHJsLiRtb2RlbFZhbHVlID0gYWxsVmFsaWQgPyBtb2RlbFZhbHVlIDogdW5kZWZpbmVkOw0KLSAgICAgICAgd3JpdGVUb01vZGVsSWZOZWVkZWQoKTsNCi0gICAgICB9DQotICAgIH0pOw0KLQ0KLSAgICBmdW5jdGlvbiB3cml0ZVRvTW9kZWxJZk5lZWRlZCgpIHsNCi0gICAgICBpZiAoY3RybC4kbW9kZWxWYWx1ZSAhPT0gcHJldk1vZGVsVmFsdWUpIHsNCi0gICAgICAgIGN0cmwuJCR3cml0ZU1vZGVsVG9TY29wZSgpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfTsNCi0NCi0gIHRoaXMuJCR3cml0ZU1vZGVsVG9TY29wZSA9IGZ1bmN0aW9uKCkgew0KLSAgICBuZ01vZGVsU2V0KCRzY29wZSwgY3RybC4kbW9kZWxWYWx1ZSk7DQotICAgIGZvckVhY2goY3RybC4kdmlld0NoYW5nZUxpc3RlbmVycywgZnVuY3Rpb24obGlzdGVuZXIpIHsNCi0gICAgICB0cnkgew0KLSAgICAgICAgbGlzdGVuZXIoKTsNCi0gICAgICB9IGNhdGNoIChlKSB7DQotICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTsNCi0gICAgICB9DQotICAgIH0pOw0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogQG5nZG9jIG1ldGhvZA0KLSAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkc2V0Vmlld1ZhbHVlDQotICAgKg0KLSAgICogQGRlc2NyaXB0aW9uDQotICAgKiBVcGRhdGUgdGhlIHZpZXcgdmFsdWUuDQotICAgKg0KLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGFuIGlucHV0IGRpcmVjdGl2ZSB3YW50IHRvIGNoYW5nZSB0aGUgdmlldyB2YWx1ZTsgdHlwaWNhbGx5LA0KLSAgICogdGhpcyBpcyBkb25lIGZyb20gd2l0aGluIGEgRE9NIGV2ZW50IGhhbmRsZXIuDQotICAgKg0KLSAgICogRm9yIGV4YW1wbGUge0BsaW5rIG5nLmRpcmVjdGl2ZTppbnB1dCBpbnB1dH0gY2FsbHMgaXQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IGNoYW5nZXMgYW5kDQotICAgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOnNlbGVjdCBzZWxlY3R9IGNhbGxzIGl0IHdoZW4gYW4gb3B0aW9uIGlzIHNlbGVjdGVkLg0KLSAgICoNCi0gICAqIElmIHRoZSBuZXcgYHZhbHVlYCBpcyBhbiBvYmplY3QgKHJhdGhlciB0aGFuIGEgc3RyaW5nIG9yIGEgbnVtYmVyKSwgd2Ugc2hvdWxkIG1ha2UgYSBjb3B5IG9mIHRoZQ0KLSAgICogb2JqZWN0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIGAkc2V0Vmlld1ZhbHVlYC4gIFRoaXMgaXMgYmVjYXVzZSBgbmdNb2RlbGAgZG9lcyBub3QgcGVyZm9ybSBhIGRlZXANCi0gICAqIHdhdGNoIG9mIG9iamVjdHMsIGl0IG9ubHkgbG9va3MgZm9yIGEgY2hhbmdlIG9mIGlkZW50aXR5LiBJZiB5b3Ugb25seSBjaGFuZ2UgdGhlIHByb3BlcnR5IG9mDQotICAgKiB0aGUgb2JqZWN0IHRoZW4gbmdNb2RlbCB3aWxsIG5vdCByZWFsaXNlIHRoYXQgdGhlIG9iamVjdCBoYXMgY2hhbmdlZCBhbmQgd2lsbCBub3QgaW52b2tlIHRoZQ0KLSAgICogYCRwYXJzZXJzYCBhbmQgYCR2YWxpZGF0b3JzYCBwaXBlbGluZXMuDQotICAgKg0KLSAgICogRm9yIHRoaXMgcmVhc29uLCB5b3Ugc2hvdWxkIG5vdCBjaGFuZ2UgcHJvcGVydGllcyBvZiB0aGUgY29weSBvbmNlIGl0IGhhcyBiZWVuIHBhc3NlZCB0bw0KLSAgICogYCRzZXRWaWV3VmFsdWVgLiBPdGhlcndpc2UgeW91IG1heSBjYXVzZSB0aGUgbW9kZWwgdmFsdWUgb24gdGhlIHNjb3BlIHRvIGNoYW5nZSBpbmNvcnJlY3RseS4NCi0gICAqDQotICAgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIG5ldyBgdmFsdWVgIHdpbGwgYmUgc3RhZ2VkIGZvciBjb21taXR0aW5nIHRocm91Z2ggdGhlIGAkcGFyc2Vyc2ANCi0gICAqIGFuZCBgJHZhbGlkYXRvcnNgIHBpcGVsaW5lcy4gSWYgdGhlcmUgYXJlIG5vIHNwZWNpYWwge0BsaW5rIG5nTW9kZWxPcHRpb25zfSBzcGVjaWZpZWQgdGhlbiB0aGUgc3RhZ2VkDQotICAgKiB2YWx1ZSBzZW50IGRpcmVjdGx5IGZvciBwcm9jZXNzaW5nLCBmaW5hbGx5IHRvIGJlIGFwcGxpZWQgdG8gYCRtb2RlbFZhbHVlYCBhbmQgdGhlbiB0aGUNCi0gICAqICoqZXhwcmVzc2lvbioqIHNwZWNpZmllZCBpbiB0aGUgYG5nLW1vZGVsYCBhdHRyaWJ1dGUuDQotICAgKg0KLSAgICogTGFzdGx5LCBhbGwgdGhlIHJlZ2lzdGVyZWQgY2hhbmdlIGxpc3RlbmVycywgaW4gdGhlIGAkdmlld0NoYW5nZUxpc3RlbmVyc2AgbGlzdCwgYXJlIGNhbGxlZC4NCi0gICAqDQotICAgKiBJbiBjYXNlIHRoZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nTW9kZWxPcHRpb25zIG5nTW9kZWxPcHRpb25zfSBkaXJlY3RpdmUgaXMgdXNlZCB3aXRoIGB1cGRhdGVPbmANCi0gICAqIGFuZCB0aGUgYGRlZmF1bHRgIHRyaWdnZXIgaXMgbm90IGxpc3RlZCwgYWxsIHRob3NlIGFjdGlvbnMgd2lsbCByZW1haW4gcGVuZGluZyB1bnRpbCBvbmUgb2YgdGhlDQotICAgKiBgdXBkYXRlT25gIGV2ZW50cyBpcyB0cmlnZ2VyZWQgb24gdGhlIERPTSBlbGVtZW50Lg0KLSAgICogQWxsIHRoZXNlIGFjdGlvbnMgd2lsbCBiZSBkZWJvdW5jZWQgaWYgdGhlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9DQotICAgKiBkaXJlY3RpdmUgaXMgdXNlZCB3aXRoIGEgY3VzdG9tIGRlYm91bmNlIGZvciB0aGlzIHBhcnRpY3VsYXIgZXZlbnQuDQotICAgKg0KLSAgICogTm90ZSB0aGF0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0cmlnZ2VyIGEgYCRkaWdlc3RgLg0KLSAgICoNCi0gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBWYWx1ZSBmcm9tIHRoZSB2aWV3Lg0KLSAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXIgRXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHVwZGF0ZS4NCi0gICAqLw0KLSAgdGhpcy4kc2V0Vmlld1ZhbHVlID0gZnVuY3Rpb24odmFsdWUsIHRyaWdnZXIpIHsNCi0gICAgY3RybC4kdmlld1ZhbHVlID0gdmFsdWU7DQotICAgIGlmICghY3RybC4kb3B0aW9ucyB8fCBjdHJsLiRvcHRpb25zLnVwZGF0ZU9uRGVmYXVsdCkgew0KLSAgICAgIGN0cmwuJCRkZWJvdW5jZVZpZXdWYWx1ZUNvbW1pdCh0cmlnZ2VyKTsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gIHRoaXMuJCRkZWJvdW5jZVZpZXdWYWx1ZUNvbW1pdCA9IGZ1bmN0aW9uKHRyaWdnZXIpIHsNCi0gICAgdmFyIGRlYm91bmNlRGVsYXkgPSAwLA0KLSAgICAgICAgb3B0aW9ucyA9IGN0cmwuJG9wdGlvbnMsDQotICAgICAgICBkZWJvdW5jZTsNCi0NCi0gICAgaWYgKG9wdGlvbnMgJiYgaXNEZWZpbmVkKG9wdGlvbnMuZGVib3VuY2UpKSB7DQotICAgICAgZGVib3VuY2UgPSBvcHRpb25zLmRlYm91bmNlOw0KLSAgICAgIGlmIChpc051bWJlcihkZWJvdW5jZSkpIHsNCi0gICAgICAgIGRlYm91bmNlRGVsYXkgPSBkZWJvdW5jZTsNCi0gICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGRlYm91bmNlW3RyaWdnZXJdKSkgew0KLSAgICAgICAgZGVib3VuY2VEZWxheSA9IGRlYm91bmNlW3RyaWdnZXJdOw0KLSAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoZGVib3VuY2VbJ2RlZmF1bHQnXSkpIHsNCi0gICAgICAgIGRlYm91bmNlRGVsYXkgPSBkZWJvdW5jZVsnZGVmYXVsdCddOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAkdGltZW91dC5jYW5jZWwocGVuZGluZ0RlYm91bmNlKTsNCi0gICAgaWYgKGRlYm91bmNlRGVsYXkpIHsNCi0gICAgICBwZW5kaW5nRGVib3VuY2UgPSAkdGltZW91dChmdW5jdGlvbigpIHsNCi0gICAgICAgIGN0cmwuJGNvbW1pdFZpZXdWYWx1ZSgpOw0KLSAgICAgIH0sIGRlYm91bmNlRGVsYXkpOw0KLSAgICB9IGVsc2UgaWYgKCRyb290U2NvcGUuJCRwaGFzZSkgew0KLSAgICAgIGN0cmwuJGNvbW1pdFZpZXdWYWx1ZSgpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgICRzY29wZS4kYXBwbHkoZnVuY3Rpb24oKSB7DQotICAgICAgICBjdHJsLiRjb21taXRWaWV3VmFsdWUoKTsNCi0gICAgICB9KTsNCi0gICAgfQ0KLSAgfTsNCi0NCi0gIC8vIG1vZGVsIC0+IHZhbHVlDQotICAvLyBOb3RlOiB3ZSBjYW5ub3QgdXNlIGEgbm9ybWFsIHNjb3BlLiR3YXRjaCBhcyB3ZSB3YW50IHRvIGRldGVjdCB0aGUgZm9sbG93aW5nOg0KLSAgLy8gMS4gc2NvcGUgdmFsdWUgaXMgJ2EnDQotICAvLyAyLiB1c2VyIGVudGVycyAnYicNCi0gIC8vIDMuIG5nLWNoYW5nZSBraWNrcyBpbiBhbmQgcmV2ZXJ0cyBzY29wZSB2YWx1ZSB0byAnYScNCi0gIC8vICAgIC0+IHNjb3BlIHZhbHVlIGRpZCBub3QgY2hhbmdlIHNpbmNlIHRoZSBsYXN0IGRpZ2VzdCBhcw0KLSAgLy8gICAgICAgbmctY2hhbmdlIGV4ZWN1dGVzIGluIGFwcGx5IHBoYXNlDQotICAvLyA0LiB2aWV3IHNob3VsZCBiZSBjaGFuZ2VkIGJhY2sgdG8gJ2EnDQotICAkc2NvcGUuJHdhdGNoKGZ1bmN0aW9uIG5nTW9kZWxXYXRjaCgpIHsNCi0gICAgdmFyIG1vZGVsVmFsdWUgPSBuZ01vZGVsR2V0KCRzY29wZSk7DQotDQotICAgIC8vIGlmIHNjb3BlIG1vZGVsIHZhbHVlIGFuZCBuZ01vZGVsIHZhbHVlIGFyZSBvdXQgb2Ygc3luYw0KLSAgICAvLyBUT0RPKHBlcmYpOiB3aHkgbm90IG1vdmUgdGhpcyB0byB0aGUgYWN0aW9uIGZuPw0KLSAgICBpZiAobW9kZWxWYWx1ZSAhPT0gY3RybC4kbW9kZWxWYWx1ZSkgew0KLSAgICAgIGN0cmwuJG1vZGVsVmFsdWUgPSBjdHJsLiQkcmF3TW9kZWxWYWx1ZSA9IG1vZGVsVmFsdWU7DQotDQotICAgICAgdmFyIGZvcm1hdHRlcnMgPSBjdHJsLiRmb3JtYXR0ZXJzLA0KLSAgICAgICAgICBpZHggPSBmb3JtYXR0ZXJzLmxlbmd0aDsNCi0NCi0gICAgICB2YXIgdmlld1ZhbHVlID0gbW9kZWxWYWx1ZTsNCi0gICAgICB3aGlsZSAoaWR4LS0pIHsNCi0gICAgICAgIHZpZXdWYWx1ZSA9IGZvcm1hdHRlcnNbaWR4XSh2aWV3VmFsdWUpOw0KLSAgICAgIH0NCi0gICAgICBpZiAoY3RybC4kdmlld1ZhbHVlICE9PSB2aWV3VmFsdWUpIHsNCi0gICAgICAgIGN0cmwuJHZpZXdWYWx1ZSA9IGN0cmwuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlID0gdmlld1ZhbHVlOw0KLSAgICAgICAgY3RybC4kcmVuZGVyKCk7DQotDQotICAgICAgICBjdHJsLiQkcnVuVmFsaWRhdG9ycyh1bmRlZmluZWQsIG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSwgbm9vcCk7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIHJldHVybiBtb2RlbFZhbHVlOw0KLSAgfSk7DQotfV07DQotDQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nTW9kZWwNCi0gKg0KLSAqIEBlbGVtZW50IGlucHV0DQotICogQHByaW9yaXR5IDENCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRoZSBgbmdNb2RlbGAgZGlyZWN0aXZlIGJpbmRzIGFuIGBpbnB1dGAsYHNlbGVjdGAsIGB0ZXh0YXJlYWAgKG9yIGN1c3RvbSBmb3JtIGNvbnRyb2wpIHRvIGENCi0gKiBwcm9wZXJ0eSBvbiB0aGUgc2NvcGUgdXNpbmcge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIgTmdNb2RlbENvbnRyb2xsZXJ9LA0KLSAqIHdoaWNoIGlzIGNyZWF0ZWQgYW5kIGV4cG9zZWQgYnkgdGhpcyBkaXJlY3RpdmUuDQotICoNCi0gKiBgbmdNb2RlbGAgaXMgcmVzcG9uc2libGUgZm9yOg0KLSAqDQotICogLSBCaW5kaW5nIHRoZSB2aWV3IGludG8gdGhlIG1vZGVsLCB3aGljaCBvdGhlciBkaXJlY3RpdmVzIHN1Y2ggYXMgYGlucHV0YCwgYHRleHRhcmVhYCBvciBgc2VsZWN0YA0KLSAqICAgcmVxdWlyZS4NCi0gKiAtIFByb3ZpZGluZyB2YWxpZGF0aW9uIGJlaGF2aW9yIChpLmUuIHJlcXVpcmVkLCBudW1iZXIsIGVtYWlsLCB1cmwpLg0KLSAqIC0gS2VlcGluZyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wgKHZhbGlkL2ludmFsaWQsIGRpcnR5L3ByaXN0aW5lLCB0b3VjaGVkL3VudG91Y2hlZCwgdmFsaWRhdGlvbiBlcnJvcnMpLg0KLSAqIC0gU2V0dGluZyByZWxhdGVkIGNzcyBjbGFzc2VzIG9uIHRoZSBlbGVtZW50IChgbmctdmFsaWRgLCBgbmctaW52YWxpZGAsIGBuZy1kaXJ0eWAsIGBuZy1wcmlzdGluZWAsIGBuZy10b3VjaGVkYCwgYG5nLXVudG91Y2hlZGApIGluY2x1ZGluZyBhbmltYXRpb25zLg0KLSAqIC0gUmVnaXN0ZXJpbmcgdGhlIGNvbnRyb2wgd2l0aCBpdHMgcGFyZW50IHtAbGluayBuZy5kaXJlY3RpdmU6Zm9ybSBmb3JtfS4NCi0gKg0KLSAqIE5vdGU6IGBuZ01vZGVsYCB3aWxsIHRyeSB0byBiaW5kIHRvIHRoZSBwcm9wZXJ0eSBnaXZlbiBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uIG9uIHRoZQ0KLSAqIGN1cnJlbnQgc2NvcGUuIElmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGFscmVhZHkgZXhpc3Qgb24gdGhpcyBzY29wZSwgaXQgd2lsbCBiZSBjcmVhdGVkDQotICogaW1wbGljaXRseSBhbmQgYWRkZWQgdG8gdGhlIHNjb3BlLg0KLSAqDQotICogRm9yIGJlc3QgcHJhY3RpY2VzIG9uIHVzaW5nIGBuZ01vZGVsYCwgc2VlOg0KLSAqDQotICogIC0gW1VuZGVyc3RhbmRpbmcgU2NvcGVzXShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL3dpa2kvVW5kZXJzdGFuZGluZy1TY29wZXMpDQotICoNCi0gKiBGb3IgYmFzaWMgZXhhbXBsZXMsIGhvdyB0byB1c2UgYG5nTW9kZWxgLCBzZWU6DQotICoNCi0gKiAgLSB7QGxpbmsgbmcuZGlyZWN0aXZlOmlucHV0IGlucHV0fQ0KLSAqICAgIC0ge0BsaW5rIGlucHV0W3RleHRdIHRleHR9DQotICogICAgLSB7QGxpbmsgaW5wdXRbY2hlY2tib3hdIGNoZWNrYm94fQ0KLSAqICAgIC0ge0BsaW5rIGlucHV0W3JhZGlvXSByYWRpb30NCi0gKiAgICAtIHtAbGluayBpbnB1dFtudW1iZXJdIG51bWJlcn0NCi0gKiAgICAtIHtAbGluayBpbnB1dFtlbWFpbF0gZW1haWx9DQotICogICAgLSB7QGxpbmsgaW5wdXRbdXJsXSB1cmx9DQotICogICAgLSB7QGxpbmsgaW5wdXRbZGF0ZV0gZGF0ZX0NCi0gKiAgICAtIHtAbGluayBpbnB1dFtkYXRldGltZS1sb2NhbF0gZGF0ZXRpbWUtbG9jYWx9DQotICogICAgLSB7QGxpbmsgaW5wdXRbdGltZV0gdGltZX0NCi0gKiAgICAtIHtAbGluayBpbnB1dFttb250aF0gbW9udGh9DQotICogICAgLSB7QGxpbmsgaW5wdXRbd2Vla10gd2Vla30NCi0gKiAgLSB7QGxpbmsgbmcuZGlyZWN0aXZlOnNlbGVjdCBzZWxlY3R9DQotICogIC0ge0BsaW5rIG5nLmRpcmVjdGl2ZTp0ZXh0YXJlYSB0ZXh0YXJlYX0NCi0gKg0KLSAqICMgQ1NTIGNsYXNzZXMNCi0gKiBUaGUgZm9sbG93aW5nIENTUyBjbGFzc2VzIGFyZSBhZGRlZCBhbmQgcmVtb3ZlZCBvbiB0aGUgYXNzb2NpYXRlZCBpbnB1dC9zZWxlY3QvdGV4dGFyZWEgZWxlbWVudA0KLSAqIGRlcGVuZGluZyBvbiB0aGUgdmFsaWRpdHkgb2YgdGhlIG1vZGVsLg0KLSAqDQotICogIC0gYG5nLXZhbGlkYDogdGhlIG1vZGVsIGlzIHZhbGlkDQotICogIC0gYG5nLWludmFsaWRgOiB0aGUgbW9kZWwgaXMgaW52YWxpZA0KLSAqICAtIGBuZy12YWxpZC1ba2V5XWA6IGZvciBlYWNoIHZhbGlkIGtleSBhZGRlZCBieSBgJHNldFZhbGlkaXR5YA0KLSAqICAtIGBuZy1pbnZhbGlkLVtrZXldYDogZm9yIGVhY2ggaW52YWxpZCBrZXkgYWRkZWQgYnkgYCRzZXRWYWxpZGl0eWANCi0gKiAgLSBgbmctcHJpc3RpbmVgOiB0aGUgY29udHJvbCBoYXNuJ3QgYmVlbiBpbnRlcmFjdGVkIHdpdGggeWV0DQotICogIC0gYG5nLWRpcnR5YDogdGhlIGNvbnRyb2wgaGFzIGJlZW4gaW50ZXJhY3RlZCB3aXRoDQotICogIC0gYG5nLXRvdWNoZWRgOiB0aGUgY29udHJvbCBoYXMgYmVlbiBibHVycmVkDQotICogIC0gYG5nLXVudG91Y2hlZGA6IHRoZSBjb250cm9sIGhhc24ndCBiZWVuIGJsdXJyZWQNCi0gKiAgLSBgbmctcGVuZGluZ2A6IGFueSBgJGFzeW5jVmFsaWRhdG9yc2AgYXJlIHVuZnVsZmlsbGVkDQotICoNCi0gKiBLZWVwIGluIG1pbmQgdGhhdCBuZ0FuaW1hdGUgY2FuIGRldGVjdCBlYWNoIG9mIHRoZXNlIGNsYXNzZXMgd2hlbiBhZGRlZCBhbmQgcmVtb3ZlZC4NCi0gKg0KLSAqICMjIEFuaW1hdGlvbiBIb29rcw0KLSAqDQotICogQW5pbWF0aW9ucyB3aXRoaW4gbW9kZWxzIGFyZSB0cmlnZ2VyZWQgd2hlbiBhbnkgb2YgdGhlIGFzc29jaWF0ZWQgQ1NTIGNsYXNzZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkDQotICogb24gdGhlIGlucHV0IGVsZW1lbnQgd2hpY2ggaXMgYXR0YWNoZWQgdG8gdGhlIG1vZGVsLiBUaGVzZSBjbGFzc2VzIGFyZTogYC5uZy1wcmlzdGluZWAsIGAubmctZGlydHlgLA0KLSAqIGAubmctaW52YWxpZGAgYW5kIGAubmctdmFsaWRgIGFzIHdlbGwgYXMgYW55IG90aGVyIHZhbGlkYXRpb25zIHRoYXQgYXJlIHBlcmZvcm1lZCBvbiB0aGUgbW9kZWwgaXRzZWxmLg0KLSAqIFRoZSBhbmltYXRpb25zIHRoYXQgYXJlIHRyaWdnZXJlZCB3aXRoaW4gbmdNb2RlbCBhcmUgc2ltaWxhciB0byBob3cgdGhleSB3b3JrIGluIG5nQ2xhc3MgYW5kDQotICogYW5pbWF0aW9ucyBjYW4gYmUgaG9va2VkIGludG8gdXNpbmcgQ1NTIHRyYW5zaXRpb25zLCBrZXlmcmFtZXMgYXMgd2VsbCBhcyBKUyBhbmltYXRpb25zLg0KLSAqDQotICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGEgc2ltcGxlIHdheSB0byB1dGlsaXplIENTUyB0cmFuc2l0aW9ucyB0byBzdHlsZSBhbiBpbnB1dCBlbGVtZW50DQotICogdGhhdCBoYXMgYmVlbiByZW5kZXJlZCBhcyBpbnZhbGlkIGFmdGVyIGl0IGhhcyBiZWVuIHZhbGlkYXRlZDoNCi0gKg0KLSAqIDxwcmU+DQotICogLy9iZSBzdXJlIHRvIGluY2x1ZGUgbmdBbmltYXRlIGFzIGEgbW9kdWxlIHRvIGhvb2sgaW50byBtb3JlDQotICogLy9hZHZhbmNlZCBhbmltYXRpb25zDQotICogLm15LWlucHV0IHsNCi0gKiAgIHRyYW5zaXRpb246MC41cyBsaW5lYXIgYWxsOw0KLSAqICAgYmFja2dyb3VuZDogd2hpdGU7DQotICogfQ0KLSAqIC5teS1pbnB1dC5uZy1pbnZhbGlkIHsNCi0gKiAgIGJhY2tncm91bmQ6IHJlZDsNCi0gKiAgIGNvbG9yOndoaXRlOw0KLSAqIH0NCi0gKiA8L3ByZT4NCi0gKg0KLSAqIEBleGFtcGxlDQotICogPGV4YW1wbGUgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIiBmaXhCYXNlPSJ0cnVlIiBtb2R1bGU9ImlucHV0RXhhbXBsZSI+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgPHNjcmlwdD4NCi0gICAgICAgIGFuZ3VsYXIubW9kdWxlKCdpbnB1dEV4YW1wbGUnLCBbXSkNCi0gICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsNCi0gICAgICAgICAgICAkc2NvcGUudmFsID0gJzEnOw0KLSAgICAgICAgICB9XSk7DQotICAgICAgIDwvc2NyaXB0Pg0KLSAgICAgICA8c3R5bGU+DQotICAgICAgICAgLm15LWlucHV0IHsNCi0gICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgbGluZWFyIDAuNXM7DQotICAgICAgICAgICB0cmFuc2l0aW9uOmFsbCBsaW5lYXIgMC41czsNCi0gICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Ow0KLSAgICAgICAgIH0NCi0gICAgICAgICAubXktaW5wdXQubmctaW52YWxpZCB7DQotICAgICAgICAgICBjb2xvcjp3aGl0ZTsNCi0gICAgICAgICAgIGJhY2tncm91bmQ6IHJlZDsNCi0gICAgICAgICB9DQotICAgICAgIDwvc3R5bGU+DQotICAgICAgIFVwZGF0ZSBpbnB1dCB0byBzZWUgdHJhbnNpdGlvbnMgd2hlbiB2YWxpZC9pbnZhbGlkLg0KLSAgICAgICBJbnRlZ2VyIGlzIGEgdmFsaWQgdmFsdWUuDQotICAgICAgIDxmb3JtIG5hbWU9InRlc3RGb3JtIiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+DQotICAgICAgICAgPGlucHV0IG5nLW1vZGVsPSJ2YWwiIG5nLXBhdHRlcm49Ii9eXGQrJC8iIG5hbWU9ImFuaW0iIGNsYXNzPSJteS1pbnB1dCIgLz4NCi0gICAgICAgPC9mb3JtPg0KLSAgICAgPC9maWxlPg0KLSAqIDwvZXhhbXBsZT4NCi0gKg0KLSAqICMjIEJpbmRpbmcgdG8gYSBnZXR0ZXIvc2V0dGVyDQotICoNCi0gKiBTb21ldGltZXMgaXQncyBoZWxwZnVsIHRvIGJpbmQgYG5nTW9kZWxgIHRvIGEgZ2V0dGVyL3NldHRlciBmdW5jdGlvbi4gIEEgZ2V0dGVyL3NldHRlciBpcyBhDQotICogZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIHdoZW4gY2FsbGVkIHdpdGggemVybyBhcmd1bWVudHMsIGFuZCBzZXRzDQotICogdGhlIGludGVybmFsIHN0YXRlIG9mIGEgbW9kZWwgd2hlbiBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudC4gSXQncyBzb21ldGltZXMgdXNlZnVsIHRvIHVzZSB0aGlzDQotICogZm9yIG1vZGVscyB0aGF0IGhhdmUgYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gdGhhdCdzIGRpZmZlcmVudCB0aGFuIHdoYXQgdGhlIG1vZGVsIGV4cG9zZXMNCi0gKiB0byB0aGUgdmlldy4NCi0gKg0KLSAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXN1Y2Nlc3MiPg0KLSAqICoqQmVzdCBQcmFjdGljZToqKiBJdCdzIGJlc3QgdG8ga2VlcCBnZXR0ZXJzIGZhc3QgYmVjYXVzZSBBbmd1bGFyIGlzIGxpa2VseSB0byBjYWxsIHRoZW0gbW9yZQ0KLSAqIGZyZXF1ZW50bHkgdGhhbiBvdGhlciBwYXJ0cyBvZiB5b3VyIGNvZGUuDQotICogPC9kaXY+DQotICoNCi0gKiBZb3UgdXNlIHRoaXMgYmVoYXZpb3IgYnkgYWRkaW5nIGBuZy1tb2RlbC1vcHRpb25zPSJ7IGdldHRlclNldHRlcjogdHJ1ZSB9ImAgdG8gYW4gZWxlbWVudCB0aGF0DQotICogaGFzIGBuZy1tb2RlbGAgYXR0YWNoZWQgdG8gaXQuIFlvdSBjYW4gYWxzbyBhZGQgYG5nLW1vZGVsLW9wdGlvbnM9InsgZ2V0dGVyU2V0dGVyOiB0cnVlIH0iYCB0bw0KLSAqIGEgYDxmb3JtPmAsIHdoaWNoIHdpbGwgZW5hYmxlIHRoaXMgYmVoYXZpb3IgZm9yIGFsbCBgPGlucHV0PmBzIHdpdGhpbiBpdC4gU2VlDQotICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBgbmdNb2RlbE9wdGlvbnNgfSBmb3IgbW9yZS4NCi0gKg0KLSAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGBuZ01vZGVsYCB3aXRoIGEgZ2V0dGVyL3NldHRlcjoNCi0gKg0KLSAqIEBleGFtcGxlDQotICogPGV4YW1wbGUgbmFtZT0ibmdNb2RlbC1nZXR0ZXItc2V0dGVyIiBtb2R1bGU9ImdldHRlclNldHRlckV4YW1wbGUiPg0KLSAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAgICAgICAgIDxmb3JtIG5hbWU9InVzZXJGb3JtIj4NCi0gICAgICAgICAgIE5hbWU6DQotICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idXNlck5hbWUiDQotICAgICAgICAgICAgICAgICAgbmctbW9kZWw9InVzZXIubmFtZSINCi0gICAgICAgICAgICAgICAgICBuZy1tb2RlbC1vcHRpb25zPSJ7IGdldHRlclNldHRlcjogdHJ1ZSB9IiAvPg0KLSAgICAgICAgIDwvZm9ybT4NCi0gICAgICAgICA8cHJlPnVzZXIubmFtZSA9IDxzcGFuIG5nLWJpbmQ9InVzZXIubmFtZSgpIj48L3NwYW4+PC9wcmU+DQotICAgICAgIDwvZGl2Pg0KLSAgICAgPC9maWxlPg0KLSAgICAgPGZpbGUgbmFtZT0iYXBwLmpzIj4NCi0gICAgICAgYW5ndWxhci5tb2R1bGUoJ2dldHRlclNldHRlckV4YW1wbGUnLCBbXSkNCi0gICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAgdmFyIF9uYW1lID0gJ0JyaWFuJzsNCi0gICAgICAgICAgICRzY29wZS51c2VyID0gew0KLSAgICAgICAgICAgICBuYW1lOiBmdW5jdGlvbihuZXdOYW1lKSB7DQotICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKG5ld05hbWUpKSB7DQotICAgICAgICAgICAgICAgICBfbmFtZSA9IG5ld05hbWU7DQotICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsNCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgfTsNCi0gICAgICAgICB9XSk7DQotICAgICA8L2ZpbGU+DQotICogPC9leGFtcGxlPg0KLSAqLw0KLXZhciBuZ01vZGVsRGlyZWN0aXZlID0gWyckcm9vdFNjb3BlJywgZnVuY3Rpb24oJHJvb3RTY29wZSkgew0KLSAgcmV0dXJuIHsNCi0gICAgcmVzdHJpY3Q6ICdBJywNCi0gICAgcmVxdWlyZTogWyduZ01vZGVsJywgJ14/Zm9ybScsICdeP25nTW9kZWxPcHRpb25zJ10sDQotICAgIGNvbnRyb2xsZXI6IE5nTW9kZWxDb250cm9sbGVyLA0KLSAgICAvLyBQcmVsaW5rIG5lZWRzIHRvIHJ1biBiZWZvcmUgYW55IGlucHV0IGRpcmVjdGl2ZQ0KLSAgICAvLyBzbyB0aGF0IHdlIGNhbiBzZXQgdGhlIE5nTW9kZWxPcHRpb25zIGluIE5nTW9kZWxDb250cm9sbGVyDQotICAgIC8vIGJlZm9yZSBhbnlvbmUgZWxzZSB1c2VzIGl0Lg0KLSAgICBwcmlvcml0eTogMSwNCi0gICAgY29tcGlsZTogZnVuY3Rpb24gbmdNb2RlbENvbXBpbGUoZWxlbWVudCkgew0KLSAgICAgIC8vIFNldHVwIGluaXRpYWwgc3RhdGUgb2YgdGhlIGNvbnRyb2wNCi0gICAgICBlbGVtZW50LmFkZENsYXNzKFBSSVNUSU5FX0NMQVNTKS5hZGRDbGFzcyhVTlRPVUNIRURfQ0xBU1MpLmFkZENsYXNzKFZBTElEX0NMQVNTKTsNCi0NCi0gICAgICByZXR1cm4gew0KLSAgICAgICAgcHJlOiBmdW5jdGlvbiBuZ01vZGVsUHJlTGluayhzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybHMpIHsNCi0gICAgICAgICAgdmFyIG1vZGVsQ3RybCA9IGN0cmxzWzBdLA0KLSAgICAgICAgICAgICAgZm9ybUN0cmwgPSBjdHJsc1sxXSB8fCBudWxsRm9ybUN0cmw7DQotDQotICAgICAgICAgIG1vZGVsQ3RybC4kJHNldE9wdGlvbnMoY3RybHNbMl0gJiYgY3RybHNbMl0uJG9wdGlvbnMpOw0KLQ0KLSAgICAgICAgICAvLyBub3RpZnkgb3RoZXJzLCBlc3BlY2lhbGx5IHBhcmVudCBmb3Jtcw0KLSAgICAgICAgICBmb3JtQ3RybC4kYWRkQ29udHJvbChtb2RlbEN0cmwpOw0KLQ0KLSAgICAgICAgICBhdHRyLiRvYnNlcnZlKCduYW1lJywgZnVuY3Rpb24obmV3VmFsdWUpIHsNCi0gICAgICAgICAgICBpZiAobW9kZWxDdHJsLiRuYW1lICE9PSBuZXdWYWx1ZSkgew0KLSAgICAgICAgICAgICAgZm9ybUN0cmwuJCRyZW5hbWVDb250cm9sKG1vZGVsQ3RybCwgbmV3VmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSk7DQotDQotICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBmb3JtQ3RybC4kcmVtb3ZlQ29udHJvbChtb2RlbEN0cmwpOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH0sDQotICAgICAgICBwb3N0OiBmdW5jdGlvbiBuZ01vZGVsUG9zdExpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmxzKSB7DQotICAgICAgICAgIHZhciBtb2RlbEN0cmwgPSBjdHJsc1swXTsNCi0gICAgICAgICAgaWYgKG1vZGVsQ3RybC4kb3B0aW9ucyAmJiBtb2RlbEN0cmwuJG9wdGlvbnMudXBkYXRlT24pIHsNCi0gICAgICAgICAgICBlbGVtZW50Lm9uKG1vZGVsQ3RybC4kb3B0aW9ucy51cGRhdGVPbiwgZnVuY3Rpb24oZXYpIHsNCi0gICAgICAgICAgICAgIG1vZGVsQ3RybC4kJGRlYm91bmNlVmlld1ZhbHVlQ29tbWl0KGV2ICYmIGV2LnR5cGUpOw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIGVsZW1lbnQub24oJ2JsdXInLCBmdW5jdGlvbihldikgew0KLSAgICAgICAgICAgIGlmIChtb2RlbEN0cmwuJHRvdWNoZWQpIHJldHVybjsNCi0NCi0gICAgICAgICAgICBpZiAoJHJvb3RTY29wZS4kJHBoYXNlKSB7DQotICAgICAgICAgICAgICBzY29wZS4kZXZhbEFzeW5jKG1vZGVsQ3RybC4kc2V0VG91Y2hlZCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgIHNjb3BlLiRhcHBseShtb2RlbEN0cmwuJHNldFRvdWNoZWQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSk7DQotICAgICAgICB9DQotICAgICAgfTsNCi0gICAgfQ0KLSAgfTsNCi19XTsNCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZGlyZWN0aXZlDQotICogQG5hbWUgbmdDaGFuZ2UNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEV2YWx1YXRlIHRoZSBnaXZlbiBleHByZXNzaW9uIHdoZW4gdGhlIHVzZXIgY2hhbmdlcyB0aGUgaW5wdXQuDQotICogVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGltbWVkaWF0ZWx5LCB1bmxpa2UgdGhlIEphdmFTY3JpcHQgb25jaGFuZ2UgZXZlbnQNCi0gKiB3aGljaCBvbmx5IHRyaWdnZXJzIGF0IHRoZSBlbmQgb2YgYSBjaGFuZ2UgKHVzdWFsbHksIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZQ0KLSAqIGZvcm0gZWxlbWVudCBvciBwcmVzc2VzIHRoZSByZXR1cm4ga2V5KS4NCi0gKg0KLSAqIFRoZSBgbmdDaGFuZ2VgIGV4cHJlc3Npb24gaXMgb25seSBldmFsdWF0ZWQgd2hlbiBhIGNoYW5nZSBpbiB0aGUgaW5wdXQgdmFsdWUgY2F1c2VzDQotICogYSBuZXcgdmFsdWUgdG8gYmUgY29tbWl0dGVkIHRvIHRoZSBtb2RlbC4NCi0gKg0KLSAqIEl0IHdpbGwgbm90IGJlIGV2YWx1YXRlZDoNCi0gKiAqIGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBgJHBhcnNlcnNgIHRyYW5zZm9ybWF0aW9uIHBpcGVsaW5lIGhhcyBub3QgY2hhbmdlZA0KLSAqICogaWYgdGhlIGlucHV0IGhhcyBjb250aW51ZWQgdG8gYmUgaW52YWxpZCBzaW5jZSB0aGUgbW9kZWwgd2lsbCBzdGF5IGBudWxsYA0KLSAqICogaWYgdGhlIG1vZGVsIGlzIGNoYW5nZWQgcHJvZ3JhbW1hdGljYWxseSBhbmQgbm90IGJ5IGEgY2hhbmdlIHRvIHRoZSBpbnB1dCB2YWx1ZQ0KLSAqDQotICoNCi0gKiBOb3RlLCB0aGlzIGRpcmVjdGl2ZSByZXF1aXJlcyBgbmdNb2RlbGAgdG8gYmUgcHJlc2VudC4NCi0gKg0KLSAqIEBlbGVtZW50IGlucHV0DQotICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NoYW5nZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uIGNoYW5nZQ0KLSAqIGluIGlucHV0IHZhbHVlLg0KLSAqDQotICogQGV4YW1wbGUNCi0gKiA8ZXhhbXBsZSBuYW1lPSJuZ0NoYW5nZS1kaXJlY3RpdmUiIG1vZHVsZT0iY2hhbmdlRXhhbXBsZSI+DQotICogICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gKiAgICAgPHNjcmlwdD4NCi0gKiAgICAgICBhbmd1bGFyLm1vZHVsZSgnY2hhbmdlRXhhbXBsZScsIFtdKQ0KLSAqICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsNCi0gKiAgICAgICAgICAgJHNjb3BlLmNvdW50ZXIgPSAwOw0KLSAqICAgICAgICAgICAkc2NvcGUuY2hhbmdlID0gZnVuY3Rpb24oKSB7DQotICogICAgICAgICAgICAgJHNjb3BlLmNvdW50ZXIrKzsNCi0gKiAgICAgICAgICAgfTsNCi0gKiAgICAgICAgIH1dKTsNCi0gKiAgICAgPC9zY3JpcHQ+DQotICogICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAqICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImNvbmZpcm1lZCIgbmctY2hhbmdlPSJjaGFuZ2UoKSIgaWQ9Im5nLWNoYW5nZS1leGFtcGxlMSIgLz4NCi0gKiAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJjb25maXJtZWQiIGlkPSJuZy1jaGFuZ2UtZXhhbXBsZTIiIC8+DQotICogICAgICAgPGxhYmVsIGZvcj0ibmctY2hhbmdlLWV4YW1wbGUyIj5Db25maXJtZWQ8L2xhYmVsPjxiciAvPg0KLSAqICAgICAgIDx0dD5kZWJ1ZyA9IHt7Y29uZmlybWVkfX08L3R0Pjxici8+DQotICogICAgICAgPHR0PmNvdW50ZXIgPSB7e2NvdW50ZXJ9fTwvdHQ+PGJyLz4NCi0gKiAgICAgPC9kaXY+DQotICogICA8L2ZpbGU+DQotICogICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gKiAgICAgdmFyIGNvdW50ZXIgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2NvdW50ZXInKSk7DQotICogICAgIHZhciBkZWJ1ZyA9IGVsZW1lbnQoYnkuYmluZGluZygnY29uZmlybWVkJykpOw0KLSAqDQotICogICAgIGl0KCdzaG91bGQgZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gaWYgY2hhbmdpbmcgZnJvbSB2aWV3JywgZnVuY3Rpb24oKSB7DQotICogICAgICAgZXhwZWN0KGNvdW50ZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzAnKTsNCi0gKg0KLSAqICAgICAgIGVsZW1lbnQoYnkuaWQoJ25nLWNoYW5nZS1leGFtcGxlMScpKS5jbGljaygpOw0KLSAqDQotICogICAgICAgZXhwZWN0KGNvdW50ZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzEnKTsNCi0gKiAgICAgICBleHBlY3QoZGVidWcuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTsNCi0gKiAgICAgfSk7DQotICoNCi0gKiAgICAgaXQoJ3Nob3VsZCBub3QgZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gaWYgY2hhbmdpbmcgZnJvbSBtb2RlbCcsIGZ1bmN0aW9uKCkgew0KLSAqICAgICAgIGVsZW1lbnQoYnkuaWQoJ25nLWNoYW5nZS1leGFtcGxlMicpKS5jbGljaygpOw0KLQ0KLSAqICAgICAgIGV4cGVjdChjb3VudGVyLmdldFRleHQoKSkudG9Db250YWluKCcwJyk7DQotICogICAgICAgZXhwZWN0KGRlYnVnLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7DQotICogICAgIH0pOw0KLSAqICAgPC9maWxlPg0KLSAqIDwvZXhhbXBsZT4NCi0gKi8NCi12YXIgbmdDaGFuZ2VEaXJlY3RpdmUgPSB2YWx1ZUZuKHsNCi0gIHJlc3RyaWN0OiAnQScsDQotICByZXF1aXJlOiAnbmdNb2RlbCcsDQotICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCkgew0KLSAgICBjdHJsLiR2aWV3Q2hhbmdlTGlzdGVuZXJzLnB1c2goZnVuY3Rpb24oKSB7DQotICAgICAgc2NvcGUuJGV2YWwoYXR0ci5uZ0NoYW5nZSk7DQotICAgIH0pOw0KLSAgfQ0KLX0pOw0KLQ0KLQ0KLXZhciByZXF1aXJlZERpcmVjdGl2ZSA9IGZ1bmN0aW9uKCkgew0KLSAgcmV0dXJuIHsNCi0gICAgcmVzdHJpY3Q6ICdBJywNCi0gICAgcmVxdWlyZTogJz9uZ01vZGVsJywNCi0gICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsbSwgYXR0ciwgY3RybCkgew0KLSAgICAgIGlmICghY3RybCkgcmV0dXJuOw0KLSAgICAgIGF0dHIucmVxdWlyZWQgPSB0cnVlOyAvLyBmb3JjZSB0cnV0aHkgaW4gY2FzZSB3ZSBhcmUgb24gbm9uIGlucHV0IGVsZW1lbnQNCi0NCi0gICAgICBjdHJsLiR2YWxpZGF0b3JzLnJlcXVpcmVkID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7DQotICAgICAgICByZXR1cm4gIWF0dHIucmVxdWlyZWQgfHwgIWN0cmwuJGlzRW1wdHkodmlld1ZhbHVlKTsNCi0gICAgICB9Ow0KLQ0KLSAgICAgIGF0dHIuJG9ic2VydmUoJ3JlcXVpcmVkJywgZnVuY3Rpb24oKSB7DQotICAgICAgICBjdHJsLiR2YWxpZGF0ZSgpOw0KLSAgICAgIH0pOw0KLSAgICB9DQotICB9Ow0KLX07DQotDQotDQotdmFyIHBhdHRlcm5EaXJlY3RpdmUgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiB7DQotICAgIHJlc3RyaWN0OiAnQScsDQotICAgIHJlcXVpcmU6ICc/bmdNb2RlbCcsDQotICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbG0sIGF0dHIsIGN0cmwpIHsNCi0gICAgICBpZiAoIWN0cmwpIHJldHVybjsNCi0NCi0gICAgICB2YXIgcmVnZXhwLCBwYXR0ZXJuRXhwID0gYXR0ci5uZ1BhdHRlcm4gfHwgYXR0ci5wYXR0ZXJuOw0KLSAgICAgIGF0dHIuJG9ic2VydmUoJ3BhdHRlcm4nLCBmdW5jdGlvbihyZWdleCkgew0KLSAgICAgICAgaWYgKGlzU3RyaW5nKHJlZ2V4KSAmJiByZWdleC5sZW5ndGggPiAwKSB7DQotICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnXicgKyByZWdleCArICckJyk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocmVnZXggJiYgIXJlZ2V4LnRlc3QpIHsNCi0gICAgICAgICAgdGhyb3cgbWluRXJyKCduZ1BhdHRlcm4nKSgnbm9yZWdleHAnLA0KLSAgICAgICAgICAgICdFeHBlY3RlZCB7MH0gdG8gYmUgYSBSZWdFeHAgYnV0IHdhcyB7MX0uIEVsZW1lbnQ6IHsyfScsIHBhdHRlcm5FeHAsDQotICAgICAgICAgICAgcmVnZXgsIHN0YXJ0aW5nVGFnKGVsbSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVnZXhwID0gcmVnZXggfHwgdW5kZWZpbmVkOw0KLSAgICAgICAgY3RybC4kdmFsaWRhdGUoKTsNCi0gICAgICB9KTsNCi0NCi0gICAgICBjdHJsLiR2YWxpZGF0b3JzLnBhdHRlcm4gPSBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmFsdWUpIHx8IGlzVW5kZWZpbmVkKHJlZ2V4cCkgfHwgcmVnZXhwLnRlc3QodmFsdWUpOw0KLSAgICAgIH07DQotICAgIH0NCi0gIH07DQotfTsNCi0NCi0NCi12YXIgbWF4bGVuZ3RoRGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7DQotICByZXR1cm4gew0KLSAgICByZXN0cmljdDogJ0EnLA0KLSAgICByZXF1aXJlOiAnP25nTW9kZWwnLA0KLSAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxtLCBhdHRyLCBjdHJsKSB7DQotICAgICAgaWYgKCFjdHJsKSByZXR1cm47DQotDQotICAgICAgdmFyIG1heGxlbmd0aCA9IC0xOw0KLSAgICAgIGF0dHIuJG9ic2VydmUoJ21heGxlbmd0aCcsIGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgICB2YXIgaW50VmFsID0gaW50KHZhbHVlKTsNCi0gICAgICAgIG1heGxlbmd0aCA9IGlzTmFOKGludFZhbCkgPyAtMSA6IGludFZhbDsNCi0gICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7DQotICAgICAgfSk7DQotICAgICAgY3RybC4kdmFsaWRhdG9ycy5tYXhsZW5ndGggPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHsNCi0gICAgICAgIHJldHVybiAobWF4bGVuZ3RoIDwgMCkgfHwgY3RybC4kaXNFbXB0eShtb2RlbFZhbHVlKSB8fCAodmlld1ZhbHVlLmxlbmd0aCA8PSBtYXhsZW5ndGgpOw0KLSAgICAgIH07DQotICAgIH0NCi0gIH07DQotfTsNCi0NCi12YXIgbWlubGVuZ3RoRGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7DQotICByZXR1cm4gew0KLSAgICByZXN0cmljdDogJ0EnLA0KLSAgICByZXF1aXJlOiAnP25nTW9kZWwnLA0KLSAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxtLCBhdHRyLCBjdHJsKSB7DQotICAgICAgaWYgKCFjdHJsKSByZXR1cm47DQotDQotICAgICAgdmFyIG1pbmxlbmd0aCA9IDA7DQotICAgICAgYXR0ci4kb2JzZXJ2ZSgnbWlubGVuZ3RoJywgZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICAgIG1pbmxlbmd0aCA9IGludCh2YWx1ZSkgfHwgMDsNCi0gICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7DQotICAgICAgfSk7DQotICAgICAgY3RybC4kdmFsaWRhdG9ycy5taW5sZW5ndGggPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZpZXdWYWx1ZSkgfHwgdmlld1ZhbHVlLmxlbmd0aCA+PSBtaW5sZW5ndGg7DQotICAgICAgfTsNCi0gICAgfQ0KLSAgfTsNCi19Ow0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ0xpc3QNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRleHQgaW5wdXQgdGhhdCBjb252ZXJ0cyBiZXR3ZWVuIGEgZGVsaW1pdGVkIHN0cmluZyBhbmQgYW4gYXJyYXkgb2Ygc3RyaW5ncy4gVGhlIGRlZmF1bHQNCi0gKiBkZWxpbWl0ZXIgaXMgYSBjb21tYSBmb2xsb3dlZCBieSBhIHNwYWNlIC0gZXF1aXZhbGVudCB0byBgbmctbGlzdD0iLCAiYC4gWW91IGNhbiBzcGVjaWZ5IGEgY3VzdG9tDQotICogZGVsaW1pdGVyIGFzIHRoZSB2YWx1ZSBvZiB0aGUgYG5nTGlzdGAgYXR0cmlidXRlIC0gZm9yIGV4YW1wbGUsIGBuZy1saXN0PSIgfCAiYC4NCi0gKg0KLSAqIFRoZSBiZWhhdmlvdXIgb2YgdGhlIGRpcmVjdGl2ZSBpcyBhZmZlY3RlZCBieSB0aGUgdXNlIG9mIHRoZSBgbmdUcmltYCBhdHRyaWJ1dGUuDQotICogKiBJZiBgbmdUcmltYCBpcyBzZXQgdG8gYCJmYWxzZSJgIHRoZW4gd2hpdGVzcGFjZSBhcm91bmQgYm90aCB0aGUgc2VwYXJhdG9yIGFuZCBlYWNoDQotICogICBsaXN0IGl0ZW0gaXMgcmVzcGVjdGVkLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgdXNlciBvZiB0aGUgZGlyZWN0aXZlIGlzIHJlc3BvbnNpYmxlIGZvcg0KLSAqICAgZGVhbGluZyB3aXRoIHdoaXRlc3BhY2UgYnV0IGFsc28gYWxsb3dzIHlvdSB0byB1c2Ugd2hpdGVzcGFjZSBhcyBhIGRlbGltaXRlciwgc3VjaCBhcyBhDQotICogICB0YWIgb3IgbmV3bGluZSBjaGFyYWN0ZXIuDQotICogKiBPdGhlcndpc2Ugd2hpdGVzcGFjZSBhcm91bmQgdGhlIGRlbGltaXRlciBpcyBpZ25vcmVkIHdoZW4gc3BsaXR0aW5nIChhbHRob3VnaCBpdCBpcyByZXNwZWN0ZWQNCi0gKiAgIHdoZW4gam9pbmluZyB0aGUgbGlzdCBpdGVtcyBiYWNrIHRvZ2V0aGVyKSBhbmQgd2hpdGVzcGFjZSBhcm91bmQgZWFjaCBsaXN0IGl0ZW0gaXMgc3RyaXBwZWQNCi0gKiAgIGJlZm9yZSBpdCBpcyBhZGRlZCB0byB0aGUgbW9kZWwuDQotICoNCi0gKiAjIyMgRXhhbXBsZSB3aXRoIFZhbGlkYXRpb24NCi0gKg0KLSAqIDxleGFtcGxlIG5hbWU9Im5nTGlzdC1kaXJlY3RpdmUiIG1vZHVsZT0ibGlzdEV4YW1wbGUiPg0KLSAqICAgPGZpbGUgbmFtZT0iYXBwLmpzIj4NCi0gKiAgICAgIGFuZ3VsYXIubW9kdWxlKCdsaXN0RXhhbXBsZScsIFtdKQ0KLSAqICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAqICAgICAgICAgICRzY29wZS5uYW1lcyA9IFsnbW9ycGhldXMnLCAnbmVvJywgJ3RyaW5pdHknXTsNCi0gKiAgICAgICAgfV0pOw0KLSAqICAgPC9maWxlPg0KLSAqICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICogICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+DQotICogICAgICBMaXN0OiA8aW5wdXQgbmFtZT0ibmFtZXNJbnB1dCIgbmctbW9kZWw9Im5hbWVzIiBuZy1saXN0IHJlcXVpcmVkPg0KLSAqICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0ubmFtZXNJbnB1dC4kZXJyb3IucmVxdWlyZWQiPg0KLSAqICAgICAgICBSZXF1aXJlZCE8L3NwYW4+DQotICogICAgICA8YnI+DQotICogICAgICA8dHQ+bmFtZXMgPSB7e25hbWVzfX08L3R0Pjxici8+DQotICogICAgICA8dHQ+bXlGb3JtLm5hbWVzSW5wdXQuJHZhbGlkID0ge3tteUZvcm0ubmFtZXNJbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz4NCi0gKiAgICAgIDx0dD5teUZvcm0ubmFtZXNJbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5uYW1lc0lucHV0LiRlcnJvcn19PC90dD48YnIvPg0KLSAqICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz4NCi0gKiAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4NCi0gKiAgICAgPC9mb3JtPg0KLSAqICAgPC9maWxlPg0KLSAqICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICogICAgIHZhciBsaXN0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCduYW1lcycpKTsNCi0gKiAgICAgdmFyIG5hbWVzID0gZWxlbWVudChieS5leGFjdEJpbmRpbmcoJ25hbWVzJykpOw0KLSAqICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5uYW1lc0lucHV0LiR2YWxpZCcpKTsNCi0gKiAgICAgdmFyIGVycm9yID0gZWxlbWVudChieS5jc3MoJ3NwYW4uZXJyb3InKSk7DQotICoNCi0gKiAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7DQotICogICAgICAgZXhwZWN0KG5hbWVzLmdldFRleHQoKSkudG9Db250YWluKCdbIm1vcnBoZXVzIiwibmVvIiwidHJpbml0eSJdJyk7DQotICogICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7DQotICogICAgICAgZXhwZWN0KGVycm9yLmdldENzc1ZhbHVlKCdkaXNwbGF5JykpLnRvQmUoJ25vbmUnKTsNCi0gKiAgICAgfSk7DQotICoNCi0gKiAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7DQotICogICAgICAgbGlzdElucHV0LmNsZWFyKCk7DQotICogICAgICAgbGlzdElucHV0LnNlbmRLZXlzKCcnKTsNCi0gKg0KLSAqICAgICAgIGV4cGVjdChuYW1lcy5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7DQotICogICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOw0KLSAqICAgICAgIGV4cGVjdChlcnJvci5nZXRDc3NWYWx1ZSgnZGlzcGxheScpKS5ub3QudG9CZSgnbm9uZScpOw0KLSAqICAgICB9KTsNCi0gKiAgIDwvZmlsZT4NCi0gKiA8L2V4YW1wbGU+DQotICoNCi0gKiAjIyMgRXhhbXBsZSAtIHNwbGl0dGluZyBvbiB3aGl0ZXNwYWNlDQotICogPGV4YW1wbGUgbmFtZT0ibmdMaXN0LWRpcmVjdGl2ZS1uZXdsaW5lcyI+DQotICogICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gKiAgICA8dGV4dGFyZWEgbmctbW9kZWw9Imxpc3QiIG5nLWxpc3Q9IiYjMTA7IiBuZy10cmltPSJmYWxzZSI+PC90ZXh0YXJlYT4NCi0gKiAgICA8cHJlPnt7IGxpc3QgfCBqc29uIH19PC9wcmU+DQotICogICA8L2ZpbGU+DQotICogICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gKiAgICAgaXQoInNob3VsZCBzcGxpdCB0aGUgdGV4dCBieSBuZXdsaW5lcyIsIGZ1bmN0aW9uKCkgew0KLSAqICAgICAgIHZhciBsaXN0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdsaXN0JykpOw0KLSAqICAgICAgIHZhciBvdXRwdXQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2xpc3QgfCBqc29uJykpOw0KLSAqICAgICAgIGxpc3RJbnB1dC5zZW5kS2V5cygnYWJjXG5kZWZcbmdoaScpOw0KLSAqICAgICAgIGV4cGVjdChvdXRwdXQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ1tcbiAgImFiYyIsXG4gICJkZWYiLFxuICAiZ2hpIlxuXScpOw0KLSAqICAgICB9KTsNCi0gKiAgIDwvZmlsZT4NCi0gKiA8L2V4YW1wbGU+DQotICoNCi0gKiBAZWxlbWVudCBpbnB1dA0KLSAqIEBwYXJhbSB7c3RyaW5nPX0gbmdMaXN0IG9wdGlvbmFsIGRlbGltaXRlciB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHNwbGl0IHRoZSB2YWx1ZS4NCi0gKi8NCi12YXIgbmdMaXN0RGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7DQotICByZXR1cm4gew0KLSAgICByZXN0cmljdDogJ0EnLA0KLSAgICBwcmlvcml0eTogMTAwLA0KLSAgICByZXF1aXJlOiAnbmdNb2RlbCcsDQotICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKSB7DQotICAgICAgLy8gV2Ugd2FudCB0byBjb250cm9sIHdoaXRlc3BhY2UgdHJpbW1pbmcgc28gd2UgdXNlIHRoaXMgY29udm9sdXRlZCBhcHByb2FjaA0KLSAgICAgIC8vIHRvIGFjY2VzcyB0aGUgbmdMaXN0IGF0dHJpYnV0ZSwgd2hpY2ggZG9lc24ndCBwcmUtdHJpbSB0aGUgYXR0cmlidXRlDQotICAgICAgdmFyIG5nTGlzdCA9IGVsZW1lbnQuYXR0cihhdHRyLiRhdHRyLm5nTGlzdCkgfHwgJywgJzsNCi0gICAgICB2YXIgdHJpbVZhbHVlcyA9IGF0dHIubmdUcmltICE9PSAnZmFsc2UnOw0KLSAgICAgIHZhciBzZXBhcmF0b3IgPSB0cmltVmFsdWVzID8gdHJpbShuZ0xpc3QpIDogbmdMaXN0Ow0KLQ0KLSAgICAgIHZhciBwYXJzZSA9IGZ1bmN0aW9uKHZpZXdWYWx1ZSkgew0KLSAgICAgICAgLy8gSWYgdGhlIHZpZXdWYWx1ZSBpcyBpbnZhbGlkIChzYXkgcmVxdWlyZWQgYnV0IGVtcHR5KSBpdCB3aWxsIGJlIGB1bmRlZmluZWRgDQotICAgICAgICBpZiAoaXNVbmRlZmluZWQodmlld1ZhbHVlKSkgcmV0dXJuOw0KLQ0KLSAgICAgICAgdmFyIGxpc3QgPSBbXTsNCi0NCi0gICAgICAgIGlmICh2aWV3VmFsdWUpIHsNCi0gICAgICAgICAgZm9yRWFjaCh2aWV3VmFsdWUuc3BsaXQoc2VwYXJhdG9yKSwgZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICAgICAgICBpZiAodmFsdWUpIGxpc3QucHVzaCh0cmltVmFsdWVzID8gdHJpbSh2YWx1ZSkgOiB2YWx1ZSk7DQotICAgICAgICAgIH0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGxpc3Q7DQotICAgICAgfTsNCi0NCi0gICAgICBjdHJsLiRwYXJzZXJzLnB1c2gocGFyc2UpOw0KLSAgICAgIGN0cmwuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbih2YWx1ZSkgew0KLSAgICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7DQotICAgICAgICAgIHJldHVybiB2YWx1ZS5qb2luKG5nTGlzdCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdW5kZWZpbmVkOw0KLSAgICAgIH0pOw0KLQ0KLSAgICAgIC8vIE92ZXJyaWRlIHRoZSBzdGFuZGFyZCAkaXNFbXB0eSBiZWNhdXNlIGFuIGVtcHR5IGFycmF5IG1lYW5zIHRoZSBpbnB1dCBpcyBlbXB0eS4NCi0gICAgICBjdHJsLiRpc0VtcHR5ID0gZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICAgIHJldHVybiAhdmFsdWUgfHwgIXZhbHVlLmxlbmd0aDsNCi0gICAgICB9Ow0KLSAgICB9DQotICB9Ow0KLX07DQotDQotDQotdmFyIENPTlNUQU5UX1ZBTFVFX1JFR0VYUCA9IC9eKHRydWV8ZmFsc2V8XGQrKSQvOw0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ1ZhbHVlDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBCaW5kcyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiB0byB0aGUgdmFsdWUgb2YgYDxvcHRpb24+YCBvciB7QGxpbmsgaW5wdXRbcmFkaW9dIGBpbnB1dFtyYWRpb11gfSwNCi0gKiBzbyB0aGF0IHdoZW4gdGhlIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHRoZSB7QGxpbmsgbmdNb2RlbCBgbmdNb2RlbGB9IG9mIHRoYXQgZWxlbWVudCBpcyBzZXQgdG8NCi0gKiB0aGUgYm91bmQgdmFsdWUuDQotICoNCi0gKiBgbmdWYWx1ZWAgaXMgdXNlZnVsIHdoZW4gZHluYW1pY2FsbHkgZ2VuZXJhdGluZyBsaXN0cyBvZiByYWRpbyBidXR0b25zIHVzaW5nDQotICoge0BsaW5rIG5nUmVwZWF0IGBuZ1JlcGVhdGB9LCBhcyBzaG93biBiZWxvdy4NCi0gKg0KLSAqIExpa2V3aXNlLCBgbmdWYWx1ZWAgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYDxvcHRpb24+YCBlbGVtZW50cyBmb3INCi0gKiB0aGUge0BsaW5rIHNlbGVjdCBgc2VsZWN0YH0gZWxlbWVudC4gSW4gdGhhdCBjYXNlIGhvd2V2ZXIsIG9ubHkgc3RyaW5ncyBhcmUgc3VwcG9ydGVkDQotICogZm9yIHRoZSBgdmFsdWUgYGF0dHJpYnV0ZSwgc28gdGhlIHJlc3VsdGluZyBgbmdNb2RlbGAgd2lsbCBhbHdheXMgYmUgYSBzdHJpbmcuDQotICogU3VwcG9ydCBmb3IgYHNlbGVjdGAgbW9kZWxzIHdpdGggbm9uLXN0cmluZyB2YWx1ZXMgaXMgYXZhaWxhYmxlIHZpYSBgbmdPcHRpb25zYC4NCi0gKg0KLSAqIEBlbGVtZW50IGlucHV0DQotICogQHBhcmFtIHtzdHJpbmc9fSBuZ1ZhbHVlIGFuZ3VsYXIgZXhwcmVzc2lvbiwgd2hvc2UgdmFsdWUgd2lsbCBiZSBib3VuZCB0byB0aGUgYHZhbHVlYCBhdHRyaWJ1dGUNCi0gKiAgIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQNCi0gKg0KLSAqIEBleGFtcGxlDQotICAgIDxleGFtcGxlIG5hbWU9Im5nVmFsdWUtZGlyZWN0aXZlIiBtb2R1bGU9InZhbHVlRXhhbXBsZSI+DQotICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgIDxzY3JpcHQ+DQotICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCd2YWx1ZUV4YW1wbGUnLCBbXSkNCi0gICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAgICAgJHNjb3BlLm5hbWVzID0gWydwaXp6YScsICd1bmljb3JucycsICdyb2JvdHMnXTsNCi0gICAgICAgICAgICAgICRzY29wZS5teSA9IHsgZmF2b3JpdGU6ICd1bmljb3JucycgfTsNCi0gICAgICAgICAgICB9XSk7DQotICAgICAgIDwvc2NyaXB0Pg0KLSAgICAgICAgPGZvcm0gbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAgICAgICAgICA8aDI+V2hpY2ggaXMgeW91ciBmYXZvcml0ZT88L2gyPg0KLSAgICAgICAgICAgIDxsYWJlbCBuZy1yZXBlYXQ9Im5hbWUgaW4gbmFtZXMiIGZvcj0ie3tuYW1lfX0iPg0KLSAgICAgICAgICAgICAge3tuYW1lfX0NCi0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyINCi0gICAgICAgICAgICAgICAgICAgICBuZy1tb2RlbD0ibXkuZmF2b3JpdGUiDQotICAgICAgICAgICAgICAgICAgICAgbmctdmFsdWU9Im5hbWUiDQotICAgICAgICAgICAgICAgICAgICAgaWQ9Int7bmFtZX19Ig0KLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImZhdm9yaXRlIj4NCi0gICAgICAgICAgICA8L2xhYmVsPg0KLSAgICAgICAgICA8ZGl2PllvdSBjaG9zZSB7e215LmZhdm9yaXRlfX08L2Rpdj4NCi0gICAgICAgIDwvZm9ybT4NCi0gICAgICA8L2ZpbGU+DQotICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgICB2YXIgZmF2b3JpdGUgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215LmZhdm9yaXRlJykpOw0KLQ0KLSAgICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgIGV4cGVjdChmYXZvcml0ZS5nZXRUZXh0KCkpLnRvQ29udGFpbigndW5pY29ybnMnKTsNCi0gICAgICAgIH0pOw0KLSAgICAgICAgaXQoJ3Nob3VsZCBiaW5kIHRoZSB2YWx1ZXMgdG8gdGhlIGlucHV0cycsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICBlbGVtZW50LmFsbChieS5tb2RlbCgnbXkuZmF2b3JpdGUnKSkuZ2V0KDApLmNsaWNrKCk7DQotICAgICAgICAgIGV4cGVjdChmYXZvcml0ZS5nZXRUZXh0KCkpLnRvQ29udGFpbigncGl6emEnKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIDwvZmlsZT4NCi0gICAgPC9leGFtcGxlPg0KLSAqLw0KLXZhciBuZ1ZhbHVlRGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7DQotICByZXR1cm4gew0KLSAgICByZXN0cmljdDogJ0EnLA0KLSAgICBwcmlvcml0eTogMTAwLA0KLSAgICBjb21waWxlOiBmdW5jdGlvbih0cGwsIHRwbEF0dHIpIHsNCi0gICAgICBpZiAoQ09OU1RBTlRfVkFMVUVfUkVHRVhQLnRlc3QodHBsQXR0ci5uZ1ZhbHVlKSkgew0KLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5nVmFsdWVDb25zdGFudExpbmsoc2NvcGUsIGVsbSwgYXR0cikgew0KLSAgICAgICAgICBhdHRyLiRzZXQoJ3ZhbHVlJywgc2NvcGUuJGV2YWwoYXR0ci5uZ1ZhbHVlKSk7DQotICAgICAgICB9Ow0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmdWYWx1ZUxpbmsoc2NvcGUsIGVsbSwgYXR0cikgew0KLSAgICAgICAgICBzY29wZS4kd2F0Y2goYXR0ci5uZ1ZhbHVlLCBmdW5jdGlvbiB2YWx1ZVdhdGNoQWN0aW9uKHZhbHVlKSB7DQotICAgICAgICAgICAgYXR0ci4kc2V0KCd2YWx1ZScsIHZhbHVlKTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICB9Ow0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfTsNCi19Ow0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ01vZGVsT3B0aW9ucw0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogQWxsb3dzIHR1bmluZyBob3cgbW9kZWwgdXBkYXRlcyBhcmUgZG9uZS4gVXNpbmcgYG5nTW9kZWxPcHRpb25zYCB5b3UgY2FuIHNwZWNpZnkgYSBjdXN0b20gbGlzdCBvZg0KLSAqIGV2ZW50cyB0aGF0IHdpbGwgdHJpZ2dlciBhIG1vZGVsIHVwZGF0ZSBhbmQvb3IgYSBkZWJvdW5jaW5nIGRlbGF5IHNvIHRoYXQgdGhlIGFjdHVhbCB1cGRhdGUgb25seQ0KLSAqIHRha2VzIHBsYWNlIHdoZW4gYSB0aW1lciBleHBpcmVzOyB0aGlzIHRpbWVyIHdpbGwgYmUgcmVzZXQgYWZ0ZXIgYW5vdGhlciBjaGFuZ2UgdGFrZXMgcGxhY2UuDQotICoNCi0gKiBHaXZlbiB0aGUgbmF0dXJlIG9mIGBuZ01vZGVsT3B0aW9uc2AsIHRoZSB2YWx1ZSBkaXNwbGF5ZWQgaW5zaWRlIGlucHV0IGZpZWxkcyBpbiB0aGUgdmlldyBtaWdodA0KLSAqIGJlIGRpZmZlcmVudCB0aGFuIHRoZSB2YWx1ZSBpbiB0aGUgYWN0dWFsIG1vZGVsLiBUaGlzIG1lYW5zIHRoYXQgaWYgeW91IHVwZGF0ZSB0aGUgbW9kZWwgeW91DQotICogc2hvdWxkIGFsc28gaW52b2tlIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIGAkcm9sbGJhY2tWaWV3VmFsdWVgfSBvbiB0aGUgcmVsZXZhbnQgaW5wdXQgZmllbGQgaW4NCi0gKiBvcmRlciB0byBtYWtlIHN1cmUgaXQgaXMgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGFuZCB0aGF0IGFueSBkZWJvdW5jZWQgYWN0aW9uIGlzIGNhbmNlbGVkLg0KLSAqDQotICogVGhlIGVhc2llc3Qgd2F5IHRvIHJlZmVyZW5jZSB0aGUgY29udHJvbCdzIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIGAkcm9sbGJhY2tWaWV3VmFsdWVgfQ0KLSAqIG1ldGhvZCBpcyBieSBtYWtpbmcgc3VyZSB0aGUgaW5wdXQgaXMgcGxhY2VkIGluc2lkZSBhIGZvcm0gdGhhdCBoYXMgYSBgbmFtZWAgYXR0cmlidXRlLiBUaGlzIGlzDQotICogaW1wb3J0YW50IGJlY2F1c2UgYGZvcm1gIGNvbnRyb2xsZXJzIGFyZSBwdWJsaXNoZWQgdG8gdGhlIHJlbGF0ZWQgc2NvcGUgdW5kZXIgdGhlIG5hbWUgaW4gdGhlaXINCi0gKiBgbmFtZWAgYXR0cmlidXRlLg0KLSAqDQotICogQW55IHBlbmRpbmcgY2hhbmdlcyB3aWxsIHRha2UgcGxhY2UgaW1tZWRpYXRlbHkgd2hlbiBhbiBlbmNsb3NpbmcgZm9ybSBpcyBzdWJtaXR0ZWQgdmlhIHRoZQ0KLSAqIGBzdWJtaXRgIGV2ZW50LiBOb3RlIHRoYXQgYG5nQ2xpY2tgIGV2ZW50cyB3aWxsIG9jY3VyIGJlZm9yZSB0aGUgbW9kZWwgaXMgdXBkYXRlZC4gVXNlIGBuZ1N1Ym1pdGANCi0gKiB0byBoYXZlIGFjY2VzcyB0byB0aGUgdXBkYXRlZCBtb2RlbC4NCi0gKg0KLSAqIGBuZ01vZGVsT3B0aW9uc2AgaGFzIGFuIGVmZmVjdCBvbiB0aGUgZWxlbWVudCBpdCdzIGRlY2xhcmVkIG9uIGFuZCBpdHMgZGVzY2VuZGFudHMuDQotICoNCi0gKiBAcGFyYW0ge09iamVjdH0gbmdNb2RlbE9wdGlvbnMgb3B0aW9ucyB0byBhcHBseSB0byB0aGUgY3VycmVudCBtb2RlbC4gVmFsaWQga2V5cyBhcmU6DQotICogICAtIGB1cGRhdGVPbmA6IHN0cmluZyBzcGVjaWZ5aW5nIHdoaWNoIGV2ZW50IHNob3VsZCB0aGUgaW5wdXQgYmUgYm91bmQgdG8uIFlvdSBjYW4gc2V0IHNldmVyYWwNCi0gKiAgICAgZXZlbnRzIHVzaW5nIGFuIHNwYWNlIGRlbGltaXRlZCBsaXN0LiBUaGVyZSBpcyBhIHNwZWNpYWwgZXZlbnQgY2FsbGVkIGBkZWZhdWx0YCB0aGF0DQotICogICAgIG1hdGNoZXMgdGhlIGRlZmF1bHQgZXZlbnRzIGJlbG9uZ2luZyBvZiB0aGUgY29udHJvbC4NCi0gKiAgIC0gYGRlYm91bmNlYDogaW50ZWdlciB2YWx1ZSB3aGljaCBjb250YWlucyB0aGUgZGVib3VuY2UgbW9kZWwgdXBkYXRlIHZhbHVlIGluIG1pbGxpc2Vjb25kcy4gQQ0KLSAqICAgICB2YWx1ZSBvZiAwIHRyaWdnZXJzIGFuIGltbWVkaWF0ZSB1cGRhdGUuIElmIGFuIG9iamVjdCBpcyBzdXBwbGllZCBpbnN0ZWFkLCB5b3UgY2FuIHNwZWNpZnkgYQ0KLSAqICAgICBjdXN0b20gdmFsdWUgZm9yIGVhY2ggZXZlbnQuIEZvciBleGFtcGxlOg0KLSAqICAgICBgbmctbW9kZWwtb3B0aW9ucz0ieyB1cGRhdGVPbjogJ2RlZmF1bHQgYmx1cicsIGRlYm91bmNlOiB7J2RlZmF1bHQnOiA1MDAsICdibHVyJzogMH0gfSJgDQotICogICAtIGBhbGxvd0ludmFsaWRgOiBib29sZWFuIHZhbHVlIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBtb2RlbCBjYW4gYmUgc2V0IHdpdGggdmFsdWVzIHRoYXQgZGlkDQotICogICAgIG5vdCB2YWxpZGF0ZSBjb3JyZWN0bHkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBzZXR0aW5nIHRoZSBtb2RlbCB0byB1bmRlZmluZWQuDQotICogICAtIGBnZXR0ZXJTZXR0ZXJgOiBib29sZWFuIHZhbHVlIHdoaWNoIGRldGVybWluZXMgd2hldGhlciBvciBub3QgdG8gdHJlYXQgZnVuY3Rpb25zIGJvdW5kIHRvDQotICAgICAgIGBuZ01vZGVsYCBhcyBnZXR0ZXJzL3NldHRlcnMuDQotICogICAtIGB0aW1lem9uZWA6IERlZmluZXMgdGhlIHRpbWV6b25lIHRvIGJlIHVzZWQgdG8gcmVhZC93cml0ZSB0aGUgYERhdGVgIGluc3RhbmNlIGluIHRoZSBtb2RlbCBmb3INCi0gKiAgICAgYDxpbnB1dCB0eXBlPSJkYXRlIj5gLCBgPGlucHV0IHR5cGU9InRpbWUiPmAsIC4uLiAuIFJpZ2h0IG5vdywgdGhlIG9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIGAnVVRDJ2AsDQotICogICAgIG90aGVyd2lzZSB0aGUgZGVmYXVsdCB0aW1lem9uZSBvZiB0aGUgYnJvd3NlciB3aWxsIGJlIHVzZWQuDQotICoNCi0gKiBAZXhhbXBsZQ0KLQ0KLSAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBvdmVycmlkZSBpbW1lZGlhdGUgdXBkYXRlcy4gQ2hhbmdlcyBvbiB0aGUgaW5wdXRzIHdpdGhpbiB0aGUNCi0gIGZvcm0gd2lsbCB1cGRhdGUgdGhlIG1vZGVsIG9ubHkgd2hlbiB0aGUgY29udHJvbCBsb3NlcyBmb2N1cyAoYmx1ciBldmVudCkuIElmIGBlc2NhcGVgIGtleSBpcw0KLSAgcHJlc3NlZCB3aGlsZSB0aGUgaW5wdXQgZmllbGQgaXMgZm9jdXNlZCwgdGhlIHZhbHVlIGlzIHJlc2V0IHRvIHRoZSB2YWx1ZSBpbiB0aGUgY3VycmVudCBtb2RlbC4NCi0NCi0gIDxleGFtcGxlIG5hbWU9Im5nTW9kZWxPcHRpb25zLWRpcmVjdGl2ZS1ibHVyIiBtb2R1bGU9Im9wdGlvbnNFeGFtcGxlIj4NCi0gICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+DQotICAgICAgICA8Zm9ybSBuYW1lPSJ1c2VyRm9ybSI+DQotICAgICAgICAgIE5hbWU6DQotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VyTmFtZSINCi0gICAgICAgICAgICAgICAgIG5nLW1vZGVsPSJ1c2VyLm5hbWUiDQotICAgICAgICAgICAgICAgICBuZy1tb2RlbC1vcHRpb25zPSJ7IHVwZGF0ZU9uOiAnYmx1cicgfSINCi0gICAgICAgICAgICAgICAgIG5nLWtleXVwPSJjYW5jZWwoJGV2ZW50KSIgLz48YnIgLz4NCi0NCi0gICAgICAgICAgT3RoZXIgZGF0YToNCi0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJ1c2VyLmRhdGEiIC8+PGJyIC8+DQotICAgICAgICA8L2Zvcm0+DQotICAgICAgICA8cHJlPnVzZXIubmFtZSA9IDxzcGFuIG5nLWJpbmQ9InVzZXIubmFtZSI+PC9zcGFuPjwvcHJlPg0KLSAgICAgIDwvZGl2Pg0KLSAgICA8L2ZpbGU+DQotICAgIDxmaWxlIG5hbWU9ImFwcC5qcyI+DQotICAgICAgYW5ndWxhci5tb2R1bGUoJ29wdGlvbnNFeGFtcGxlJywgW10pDQotICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAkc2NvcGUudXNlciA9IHsgbmFtZTogJ3NheScsIGRhdGE6ICcnIH07DQotDQotICAgICAgICAgICRzY29wZS5jYW5jZWwgPSBmdW5jdGlvbihlKSB7DQotICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAyNykgew0KLSAgICAgICAgICAgICAgJHNjb3BlLnVzZXJGb3JtLnVzZXJOYW1lLiRyb2xsYmFja1ZpZXdWYWx1ZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfTsNCi0gICAgICAgIH1dKTsNCi0gICAgPC9maWxlPg0KLSAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICB2YXIgbW9kZWwgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3VzZXIubmFtZScpKTsNCi0gICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd1c2VyLm5hbWUnKSk7DQotICAgICAgdmFyIG90aGVyID0gZWxlbWVudChieS5tb2RlbCgndXNlci5kYXRhJykpOw0KLQ0KLSAgICAgIGl0KCdzaG91bGQgYWxsb3cgY3VzdG9tIGV2ZW50cycsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgaW5wdXQuc2VuZEtleXMoJyBoZWxsbycpOw0KLSAgICAgICAgaW5wdXQuY2xpY2soKTsNCi0gICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3NheScpOw0KLSAgICAgICAgb3RoZXIuY2xpY2soKTsNCi0gICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3NheSBoZWxsbycpOw0KLSAgICAgIH0pOw0KLQ0KLSAgICAgIGl0KCdzaG91bGQgJHJvbGxiYWNrVmlld1ZhbHVlIHdoZW4gbW9kZWwgY2hhbmdlcycsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgaW5wdXQuc2VuZEtleXMoJyBoZWxsbycpOw0KLSAgICAgICAgZXhwZWN0KGlucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnc2F5IGhlbGxvJyk7DQotICAgICAgICBpbnB1dC5zZW5kS2V5cyhwcm90cmFjdG9yLktleS5FU0NBUEUpOw0KLSAgICAgICAgZXhwZWN0KGlucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnc2F5Jyk7DQotICAgICAgICBvdGhlci5jbGljaygpOw0KLSAgICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkudG9FcXVhbCgnc2F5Jyk7DQotICAgICAgfSk7DQotICAgIDwvZmlsZT4NCi0gIDwvZXhhbXBsZT4NCi0NCi0gIFRoaXMgb25lIHNob3dzIGhvdyB0byBkZWJvdW5jZSBtb2RlbCBjaGFuZ2VzLiBNb2RlbCB3aWxsIGJlIHVwZGF0ZWQgb25seSAxIHNlYyBhZnRlciBsYXN0IGNoYW5nZS4NCi0gIElmIHRoZSBgQ2xlYXJgIGJ1dHRvbiBpcyBwcmVzc2VkLCBhbnkgZGVib3VuY2VkIGFjdGlvbiBpcyBjYW5jZWxlZCBhbmQgdGhlIHZhbHVlIGJlY29tZXMgZW1wdHkuDQotDQotICA8ZXhhbXBsZSBuYW1lPSJuZ01vZGVsT3B0aW9ucy1kaXJlY3RpdmUtZGVib3VuY2UiIG1vZHVsZT0ib3B0aW9uc0V4YW1wbGUiPg0KLSAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgICAgIDxmb3JtIG5hbWU9InVzZXJGb3JtIj4NCi0gICAgICAgICAgTmFtZToNCi0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzZXJOYW1lIg0KLSAgICAgICAgICAgICAgICAgbmctbW9kZWw9InVzZXIubmFtZSINCi0gICAgICAgICAgICAgICAgIG5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDEwMDAgfSIgLz4NCi0gICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0idXNlckZvcm0udXNlck5hbWUuJHJvbGxiYWNrVmlld1ZhbHVlKCk7IHVzZXIubmFtZT0nJyI+Q2xlYXI8L2J1dHRvbj48YnIgLz4NCi0gICAgICAgIDwvZm9ybT4NCi0gICAgICAgIDxwcmU+dXNlci5uYW1lID0gPHNwYW4gbmctYmluZD0idXNlci5uYW1lIj48L3NwYW4+PC9wcmU+DQotICAgICAgPC9kaXY+DQotICAgIDwvZmlsZT4NCi0gICAgPGZpbGUgbmFtZT0iYXBwLmpzIj4NCi0gICAgICBhbmd1bGFyLm1vZHVsZSgnb3B0aW9uc0V4YW1wbGUnLCBbXSkNCi0gICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgICRzY29wZS51c2VyID0geyBuYW1lOiAnc2F5JyB9Ow0KLSAgICAgICAgfV0pOw0KLSAgICA8L2ZpbGU+DQotICA8L2V4YW1wbGU+DQotDQotICBUaGlzIG9uZSBzaG93cyBob3cgdG8gYmluZCB0byBnZXR0ZXIvc2V0dGVyczoNCi0NCi0gIDxleGFtcGxlIG5hbWU9Im5nTW9kZWxPcHRpb25zLWRpcmVjdGl2ZS1nZXR0ZXItc2V0dGVyIiBtb2R1bGU9ImdldHRlclNldHRlckV4YW1wbGUiPg0KLSAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgICAgIDxmb3JtIG5hbWU9InVzZXJGb3JtIj4NCi0gICAgICAgICAgTmFtZToNCi0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzZXJOYW1lIg0KLSAgICAgICAgICAgICAgICAgbmctbW9kZWw9InVzZXIubmFtZSINCi0gICAgICAgICAgICAgICAgIG5nLW1vZGVsLW9wdGlvbnM9InsgZ2V0dGVyU2V0dGVyOiB0cnVlIH0iIC8+DQotICAgICAgICA8L2Zvcm0+DQotICAgICAgICA8cHJlPnVzZXIubmFtZSA9IDxzcGFuIG5nLWJpbmQ9InVzZXIubmFtZSgpIj48L3NwYW4+PC9wcmU+DQotICAgICAgPC9kaXY+DQotICAgIDwvZmlsZT4NCi0gICAgPGZpbGUgbmFtZT0iYXBwLmpzIj4NCi0gICAgICBhbmd1bGFyLm1vZHVsZSgnZ2V0dGVyU2V0dGVyRXhhbXBsZScsIFtdKQ0KLSAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsNCi0gICAgICAgICAgdmFyIF9uYW1lID0gJ0JyaWFuJzsNCi0gICAgICAgICAgJHNjb3BlLnVzZXIgPSB7DQotICAgICAgICAgICAgbmFtZTogZnVuY3Rpb24obmV3TmFtZSkgew0KLSAgICAgICAgICAgICAgcmV0dXJuIGFuZ3VsYXIuaXNEZWZpbmVkKG5ld05hbWUpID8gKF9uYW1lID0gbmV3TmFtZSkgOiBfbmFtZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH07DQotICAgICAgICB9XSk7DQotICAgIDwvZmlsZT4NCi0gIDwvZXhhbXBsZT4NCi0gKi8NCi12YXIgbmdNb2RlbE9wdGlvbnNEaXJlY3RpdmUgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiB7DQotICAgIHJlc3RyaWN0OiAnQScsDQotICAgIGNvbnRyb2xsZXI6IFsnJHNjb3BlJywgJyRhdHRycycsIGZ1bmN0aW9uKCRzY29wZSwgJGF0dHJzKSB7DQotICAgICAgdmFyIHRoYXQgPSB0aGlzOw0KLSAgICAgIHRoaXMuJG9wdGlvbnMgPSAkc2NvcGUuJGV2YWwoJGF0dHJzLm5nTW9kZWxPcHRpb25zKTsNCi0gICAgICAvLyBBbGxvdyBhZGRpbmcvb3ZlcnJpZGluZyBib3VuZCBldmVudHMNCi0gICAgICBpZiAodGhpcy4kb3B0aW9ucy51cGRhdGVPbiAhPT0gdW5kZWZpbmVkKSB7DQotICAgICAgICB0aGlzLiRvcHRpb25zLnVwZGF0ZU9uRGVmYXVsdCA9IGZhbHNlOw0KLSAgICAgICAgLy8gZXh0cmFjdCAiZGVmYXVsdCIgcHNldWRvLWV2ZW50IGZyb20gbGlzdCBvZiBldmVudHMgdGhhdCBjYW4gdHJpZ2dlciBhIG1vZGVsIHVwZGF0ZQ0KLSAgICAgICAgdGhpcy4kb3B0aW9ucy51cGRhdGVPbiA9IHRyaW0odGhpcy4kb3B0aW9ucy51cGRhdGVPbi5yZXBsYWNlKERFRkFVTFRfUkVHRVhQLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgdGhhdC4kb3B0aW9ucy51cGRhdGVPbkRlZmF1bHQgPSB0cnVlOw0KLSAgICAgICAgICByZXR1cm4gJyAnOw0KLSAgICAgICAgfSkpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICB0aGlzLiRvcHRpb25zLnVwZGF0ZU9uRGVmYXVsdCA9IHRydWU7DQotICAgICAgfQ0KLSAgICB9XQ0KLSAgfTsNCi19Ow0KLQ0KLS8vIGhlbHBlciBtZXRob2RzDQotZnVuY3Rpb24gYWRkU2V0VmFsaWRpdHlNZXRob2QoY29udGV4dCkgew0KLSAgdmFyIGN0cmwgPSBjb250ZXh0LmN0cmwsDQotICAgICAgJGVsZW1lbnQgPSBjb250ZXh0LiRlbGVtZW50LA0KLSAgICAgIGNsYXNzQ2FjaGUgPSB7fSwNCi0gICAgICBzZXQgPSBjb250ZXh0LnNldCwNCi0gICAgICB1bnNldCA9IGNvbnRleHQudW5zZXQsDQotICAgICAgcGFyZW50Rm9ybSA9IGNvbnRleHQucGFyZW50Rm9ybSwNCi0gICAgICAkYW5pbWF0ZSA9IGNvbnRleHQuJGFuaW1hdGU7DQotDQotICBjbGFzc0NhY2hlW0lOVkFMSURfQ0xBU1NdID0gIShjbGFzc0NhY2hlW1ZBTElEX0NMQVNTXSA9ICRlbGVtZW50Lmhhc0NsYXNzKFZBTElEX0NMQVNTKSk7DQotDQotICBjdHJsLiRzZXRWYWxpZGl0eSA9IHNldFZhbGlkaXR5Ow0KLQ0KLSAgZnVuY3Rpb24gc2V0VmFsaWRpdHkodmFsaWRhdGlvbkVycm9yS2V5LCBzdGF0ZSwgb3B0aW9ucykgew0KLSAgICBpZiAoc3RhdGUgPT09IHVuZGVmaW5lZCkgew0KLSAgICAgIGNyZWF0ZUFuZFNldCgnJHBlbmRpbmcnLCB2YWxpZGF0aW9uRXJyb3JLZXksIG9wdGlvbnMpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHVuc2V0QW5kQ2xlYW51cCgnJHBlbmRpbmcnLCB2YWxpZGF0aW9uRXJyb3JLZXksIG9wdGlvbnMpOw0KLSAgICB9DQotICAgIGlmICghaXNCb29sZWFuKHN0YXRlKSkgew0KLSAgICAgIHVuc2V0KGN0cmwuJGVycm9yLCB2YWxpZGF0aW9uRXJyb3JLZXksIG9wdGlvbnMpOw0KLSAgICAgIHVuc2V0KGN0cmwuJCRzdWNjZXNzLCB2YWxpZGF0aW9uRXJyb3JLZXksIG9wdGlvbnMpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGlmIChzdGF0ZSkgew0KLSAgICAgICAgdW5zZXQoY3RybC4kZXJyb3IsIHZhbGlkYXRpb25FcnJvcktleSwgb3B0aW9ucyk7DQotICAgICAgICBzZXQoY3RybC4kJHN1Y2Nlc3MsIHZhbGlkYXRpb25FcnJvcktleSwgb3B0aW9ucyk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHNldChjdHJsLiRlcnJvciwgdmFsaWRhdGlvbkVycm9yS2V5LCBvcHRpb25zKTsNCi0gICAgICAgIHVuc2V0KGN0cmwuJCRzdWNjZXNzLCB2YWxpZGF0aW9uRXJyb3JLZXksIG9wdGlvbnMpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoY3RybC4kcGVuZGluZykgew0KLSAgICAgIGNhY2hlZFRvZ2dsZUNsYXNzKFBFTkRJTkdfQ0xBU1MsIHRydWUpOw0KLSAgICAgIGN0cmwuJHZhbGlkID0gY3RybC4kaW52YWxpZCA9IHVuZGVmaW5lZDsNCi0gICAgICB0b2dnbGVWYWxpZGF0aW9uQ3NzKCcnLCBudWxsKTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBjYWNoZWRUb2dnbGVDbGFzcyhQRU5ESU5HX0NMQVNTLCBmYWxzZSk7DQotICAgICAgY3RybC4kdmFsaWQgPSBpc09iamVjdEVtcHR5KGN0cmwuJGVycm9yKTsNCi0gICAgICBjdHJsLiRpbnZhbGlkID0gIWN0cmwuJHZhbGlkOw0KLSAgICAgIHRvZ2dsZVZhbGlkYXRpb25Dc3MoJycsIGN0cmwuJHZhbGlkKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyByZS1yZWFkIHRoZSBzdGF0ZSBhcyB0aGUgc2V0L3Vuc2V0IG1ldGhvZHMgY291bGQgaGF2ZQ0KLSAgICAvLyBjb21iaW5lZCBzdGF0ZSBpbiBjdHJsLiRlcnJvclt2YWxpZGF0aW9uRXJyb3JdICh1c2VkIGZvciBmb3JtcyksDQotICAgIC8vIHdoZXJlIHNldHRpbmcvdW5zZXR0aW5nIG9ubHkgaW5jcmVtZW50cy9kZWNyZW1lbnRzIHRoZSB2YWx1ZSwNCi0gICAgLy8gYW5kIGRvZXMgbm90IHJlcGxhY2UgaXQuDQotICAgIHZhciBjb21iaW5lZFN0YXRlOw0KLSAgICBpZiAoY3RybC4kcGVuZGluZyAmJiBjdHJsLiRwZW5kaW5nW3ZhbGlkYXRpb25FcnJvcktleV0pIHsNCi0gICAgICBjb21iaW5lZFN0YXRlID0gdW5kZWZpbmVkOw0KLSAgICB9IGVsc2UgaWYgKGN0cmwuJGVycm9yW3ZhbGlkYXRpb25FcnJvcktleV0pIHsNCi0gICAgICBjb21iaW5lZFN0YXRlID0gZmFsc2U7DQotICAgIH0gZWxzZSBpZiAoY3RybC4kJHN1Y2Nlc3NbdmFsaWRhdGlvbkVycm9yS2V5XSkgew0KLSAgICAgIGNvbWJpbmVkU3RhdGUgPSB0cnVlOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGNvbWJpbmVkU3RhdGUgPSBudWxsOw0KLSAgICB9DQotICAgIHRvZ2dsZVZhbGlkYXRpb25Dc3ModmFsaWRhdGlvbkVycm9yS2V5LCBjb21iaW5lZFN0YXRlKTsNCi0gICAgcGFyZW50Rm9ybS4kc2V0VmFsaWRpdHkodmFsaWRhdGlvbkVycm9yS2V5LCBjb21iaW5lZFN0YXRlLCBjdHJsKTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGNyZWF0ZUFuZFNldChuYW1lLCB2YWx1ZSwgb3B0aW9ucykgew0KLSAgICBpZiAoIWN0cmxbbmFtZV0pIHsNCi0gICAgICBjdHJsW25hbWVdID0ge307DQotICAgIH0NCi0gICAgc2V0KGN0cmxbbmFtZV0sIHZhbHVlLCBvcHRpb25zKTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHVuc2V0QW5kQ2xlYW51cChuYW1lLCB2YWx1ZSwgb3B0aW9ucykgew0KLSAgICBpZiAoY3RybFtuYW1lXSkgew0KLSAgICAgIHVuc2V0KGN0cmxbbmFtZV0sIHZhbHVlLCBvcHRpb25zKTsNCi0gICAgfQ0KLSAgICBpZiAoaXNPYmplY3RFbXB0eShjdHJsW25hbWVdKSkgew0KLSAgICAgIGN0cmxbbmFtZV0gPSB1bmRlZmluZWQ7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGNhY2hlZFRvZ2dsZUNsYXNzKGNsYXNzTmFtZSwgc3dpdGNoVmFsdWUpIHsNCi0gICAgaWYgKHN3aXRjaFZhbHVlICYmICFjbGFzc0NhY2hlW2NsYXNzTmFtZV0pIHsNCi0gICAgICAkYW5pbWF0ZS5hZGRDbGFzcygkZWxlbWVudCwgY2xhc3NOYW1lKTsNCi0gICAgICBjbGFzc0NhY2hlW2NsYXNzTmFtZV0gPSB0cnVlOw0KLSAgICB9IGVsc2UgaWYgKCFzd2l0Y2hWYWx1ZSAmJiBjbGFzc0NhY2hlW2NsYXNzTmFtZV0pIHsNCi0gICAgICAkYW5pbWF0ZS5yZW1vdmVDbGFzcygkZWxlbWVudCwgY2xhc3NOYW1lKTsNCi0gICAgICBjbGFzc0NhY2hlW2NsYXNzTmFtZV0gPSBmYWxzZTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gdG9nZ2xlVmFsaWRhdGlvbkNzcyh2YWxpZGF0aW9uRXJyb3JLZXksIGlzVmFsaWQpIHsNCi0gICAgdmFsaWRhdGlvbkVycm9yS2V5ID0gdmFsaWRhdGlvbkVycm9yS2V5ID8gJy0nICsgc25ha2VfY2FzZSh2YWxpZGF0aW9uRXJyb3JLZXksICctJykgOiAnJzsNCi0NCi0gICAgY2FjaGVkVG9nZ2xlQ2xhc3MoVkFMSURfQ0xBU1MgKyB2YWxpZGF0aW9uRXJyb3JLZXksIGlzVmFsaWQgPT09IHRydWUpOw0KLSAgICBjYWNoZWRUb2dnbGVDbGFzcyhJTlZBTElEX0NMQVNTICsgdmFsaWRhdGlvbkVycm9yS2V5LCBpc1ZhbGlkID09PSBmYWxzZSk7DQotICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGlzT2JqZWN0RW1wdHkob2JqKSB7DQotICBpZiAob2JqKSB7DQotICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7DQotICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gdHJ1ZTsNCi19DQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nQmluZA0KLSAqIEByZXN0cmljdCBBQw0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogVGhlIGBuZ0JpbmRgIGF0dHJpYnV0ZSB0ZWxscyBBbmd1bGFyIHRvIHJlcGxhY2UgdGhlIHRleHQgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIEhUTUwgZWxlbWVudA0KLSAqIHdpdGggdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gZXhwcmVzc2lvbiwgYW5kIHRvIHVwZGF0ZSB0aGUgdGV4dCBjb250ZW50IHdoZW4gdGhlIHZhbHVlIG9mIHRoYXQNCi0gKiBleHByZXNzaW9uIGNoYW5nZXMuDQotICoNCi0gKiBUeXBpY2FsbHksIHlvdSBkb24ndCB1c2UgYG5nQmluZGAgZGlyZWN0bHksIGJ1dCBpbnN0ZWFkIHlvdSB1c2UgdGhlIGRvdWJsZSBjdXJseSBtYXJrdXAgbGlrZQ0KLSAqIGB7eyBleHByZXNzaW9uIH19YCB3aGljaCBpcyBzaW1pbGFyIGJ1dCBsZXNzIHZlcmJvc2UuDQotICoNCi0gKiBJdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSBgbmdCaW5kYCBpbnN0ZWFkIG9mIGB7eyBleHByZXNzaW9uIH19YCBpZiBhIHRlbXBsYXRlIGlzIG1vbWVudGFyaWx5DQotICogZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyIGluIGl0cyByYXcgc3RhdGUgYmVmb3JlIEFuZ3VsYXIgY29tcGlsZXMgaXQuIFNpbmNlIGBuZ0JpbmRgIGlzIGFuDQotICogZWxlbWVudCBhdHRyaWJ1dGUsIGl0IG1ha2VzIHRoZSBiaW5kaW5ncyBpbnZpc2libGUgdG8gdGhlIHVzZXIgd2hpbGUgdGhlIHBhZ2UgaXMgbG9hZGluZy4NCi0gKg0KLSAqIEFuIGFsdGVybmF0aXZlIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbSB3b3VsZCBiZSB1c2luZyB0aGUNCi0gKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ2xvYWsgbmdDbG9ha30gZGlyZWN0aXZlLg0KLSAqDQotICoNCi0gKiBAZWxlbWVudCBBTlkNCi0gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQmluZCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZS4NCi0gKg0KLSAqIEBleGFtcGxlDQotICogRW50ZXIgYSBuYW1lIGluIHRoZSBMaXZlIFByZXZpZXcgdGV4dCBib3g7IHRoZSBncmVldGluZyBiZWxvdyB0aGUgdGV4dCBib3ggY2hhbmdlcyBpbnN0YW50bHkuDQotICAgPGV4YW1wbGUgbW9kdWxlPSJiaW5kRXhhbXBsZSI+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgPHNjcmlwdD4NCi0gICAgICAgICBhbmd1bGFyLm1vZHVsZSgnYmluZEV4YW1wbGUnLCBbXSkNCi0gICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgICAgICRzY29wZS5uYW1lID0gJ1doaXJsZWQnOw0KLSAgICAgICAgICAgfV0pOw0KLSAgICAgICA8L3NjcmlwdD4NCi0gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+DQotICAgICAgICAgRW50ZXIgbmFtZTogPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJuYW1lIj48YnI+DQotICAgICAgICAgSGVsbG8gPHNwYW4gbmctYmluZD0ibmFtZSI+PC9zcGFuPiENCi0gICAgICAgPC9kaXY+DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1iaW5kJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgdmFyIG5hbWVJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ25hbWUnKSk7DQotDQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbmFtZScpKS5nZXRUZXh0KCkpLnRvQmUoJ1doaXJsZWQnKTsNCi0gICAgICAgICBuYW1lSW5wdXQuY2xlYXIoKTsNCi0gICAgICAgICBuYW1lSW5wdXQuc2VuZEtleXMoJ3dvcmxkJyk7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbmFtZScpKS5nZXRUZXh0KCkpLnRvQmUoJ3dvcmxkJyk7DQotICAgICAgIH0pOw0KLSAgICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gKi8NCi12YXIgbmdCaW5kRGlyZWN0aXZlID0gWyckY29tcGlsZScsIGZ1bmN0aW9uKCRjb21waWxlKSB7DQotICByZXR1cm4gew0KLSAgICByZXN0cmljdDogJ0FDJywNCi0gICAgY29tcGlsZTogZnVuY3Rpb24gbmdCaW5kQ29tcGlsZSh0ZW1wbGF0ZUVsZW1lbnQpIHsNCi0gICAgICAkY29tcGlsZS4kJGFkZEJpbmRpbmdDbGFzcyh0ZW1wbGF0ZUVsZW1lbnQpOw0KLSAgICAgIHJldHVybiBmdW5jdGlvbiBuZ0JpbmRMaW5rKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7DQotICAgICAgICAkY29tcGlsZS4kJGFkZEJpbmRpbmdJbmZvKGVsZW1lbnQsIGF0dHIubmdCaW5kKTsNCi0gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50WzBdOw0KLSAgICAgICAgc2NvcGUuJHdhdGNoKGF0dHIubmdCaW5kLCBmdW5jdGlvbiBuZ0JpbmRXYXRjaEFjdGlvbih2YWx1ZSkgew0KLSAgICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdmFsdWUgPT09IHVuZGVmaW5lZCA/ICcnIDogdmFsdWU7DQotICAgICAgICB9KTsNCi0gICAgICB9Ow0KLSAgICB9DQotICB9Ow0KLX1dOw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ0JpbmRUZW1wbGF0ZQ0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogVGhlIGBuZ0JpbmRUZW1wbGF0ZWAgZGlyZWN0aXZlIHNwZWNpZmllcyB0aGF0IHRoZSBlbGVtZW50DQotICogdGV4dCBjb250ZW50IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBpbnRlcnBvbGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZQ0KLSAqIGluIHRoZSBgbmdCaW5kVGVtcGxhdGVgIGF0dHJpYnV0ZS4NCi0gKiBVbmxpa2UgYG5nQmluZGAsIHRoZSBgbmdCaW5kVGVtcGxhdGVgIGNhbiBjb250YWluIG11bHRpcGxlIGB7e2AgYH19YA0KLSAqIGV4cHJlc3Npb25zLiBUaGlzIGRpcmVjdGl2ZSBpcyBuZWVkZWQgc2luY2Ugc29tZSBIVE1MIGVsZW1lbnRzDQotICogKHN1Y2ggYXMgVElUTEUgYW5kIE9QVElPTikgY2Fubm90IGNvbnRhaW4gU1BBTiBlbGVtZW50cy4NCi0gKg0KLSAqIEBlbGVtZW50IEFOWQ0KLSAqIEBwYXJhbSB7c3RyaW5nfSBuZ0JpbmRUZW1wbGF0ZSB0ZW1wbGF0ZSBvZiBmb3JtDQotICogICA8dHQ+e3s8L3R0PiA8dHQ+ZXhwcmVzc2lvbjwvdHQ+IDx0dD59fTwvdHQ+IHRvIGV2YWwuDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAqIFRyeSBpdCBoZXJlOiBlbnRlciB0ZXh0IGluIHRleHQgYm94IGFuZCB3YXRjaCB0aGUgZ3JlZXRpbmcgY2hhbmdlLg0KLSAgIDxleGFtcGxlIG1vZHVsZT0iYmluZEV4YW1wbGUiPg0KLSAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgIDxzY3JpcHQ+DQotICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2JpbmRFeGFtcGxlJywgW10pDQotICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAgICAkc2NvcGUuc2FsdXRhdGlvbiA9ICdIZWxsbyc7DQotICAgICAgICAgICAgICRzY29wZS5uYW1lID0gJ1dvcmxkJzsNCi0gICAgICAgICAgIH1dKTsNCi0gICAgICAgPC9zY3JpcHQ+DQotICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAgICAgICAgU2FsdXRhdGlvbjogPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJzYWx1dGF0aW9uIj48YnI+DQotICAgICAgICBOYW1lOiA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9Im5hbWUiPjxicj4NCi0gICAgICAgIDxwcmUgbmctYmluZC10ZW1wbGF0ZT0ie3tzYWx1dGF0aW9ufX0ge3tuYW1lfX0hIj48L3ByZT4NCi0gICAgICAgPC9kaXY+DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1iaW5kJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgdmFyIHNhbHV0YXRpb25FbGVtID0gZWxlbWVudChieS5iaW5kaW5nKCdzYWx1dGF0aW9uJykpOw0KLSAgICAgICAgIHZhciBzYWx1dGF0aW9uSW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdzYWx1dGF0aW9uJykpOw0KLSAgICAgICAgIHZhciBuYW1lSW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCduYW1lJykpOw0KLQ0KLSAgICAgICAgIGV4cGVjdChzYWx1dGF0aW9uRWxlbS5nZXRUZXh0KCkpLnRvQmUoJ0hlbGxvIFdvcmxkIScpOw0KLQ0KLSAgICAgICAgIHNhbHV0YXRpb25JbnB1dC5jbGVhcigpOw0KLSAgICAgICAgIHNhbHV0YXRpb25JbnB1dC5zZW5kS2V5cygnR3JlZXRpbmdzJyk7DQotICAgICAgICAgbmFtZUlucHV0LmNsZWFyKCk7DQotICAgICAgICAgbmFtZUlucHV0LnNlbmRLZXlzKCd1c2VyJyk7DQotDQotICAgICAgICAgZXhwZWN0KHNhbHV0YXRpb25FbGVtLmdldFRleHQoKSkudG9CZSgnR3JlZXRpbmdzIHVzZXIhJyk7DQotICAgICAgIH0pOw0KLSAgICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gKi8NCi12YXIgbmdCaW5kVGVtcGxhdGVEaXJlY3RpdmUgPSBbJyRpbnRlcnBvbGF0ZScsICckY29tcGlsZScsIGZ1bmN0aW9uKCRpbnRlcnBvbGF0ZSwgJGNvbXBpbGUpIHsNCi0gIHJldHVybiB7DQotICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nQmluZFRlbXBsYXRlQ29tcGlsZSh0ZW1wbGF0ZUVsZW1lbnQpIHsNCi0gICAgICAkY29tcGlsZS4kJGFkZEJpbmRpbmdDbGFzcyh0ZW1wbGF0ZUVsZW1lbnQpOw0KLSAgICAgIHJldHVybiBmdW5jdGlvbiBuZ0JpbmRUZW1wbGF0ZUxpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsNCi0gICAgICAgIHZhciBpbnRlcnBvbGF0ZUZuID0gJGludGVycG9sYXRlKGVsZW1lbnQuYXR0cihhdHRyLiRhdHRyLm5nQmluZFRlbXBsYXRlKSk7DQotICAgICAgICAkY29tcGlsZS4kJGFkZEJpbmRpbmdJbmZvKGVsZW1lbnQsIGludGVycG9sYXRlRm4uZXhwcmVzc2lvbnMpOw0KLSAgICAgICAgZWxlbWVudCA9IGVsZW1lbnRbMF07DQotICAgICAgICBhdHRyLiRvYnNlcnZlKCduZ0JpbmRUZW1wbGF0ZScsIGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJycgOiB2YWx1ZTsNCi0gICAgICAgIH0pOw0KLSAgICAgIH07DQotICAgIH0NCi0gIH07DQotfV07DQotDQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nQmluZEh0bWwNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBhbmQgaW5zZXJ0cyB0aGUgcmVzdWx0aW5nIEhUTUwgaW50byB0aGUgZWxlbWVudCBpbiBhIHNlY3VyZSB3YXkuIEJ5IGRlZmF1bHQsDQotICogdGhlIHJlc3VsdGluZyBIVE1MIGNvbnRlbnQgd2lsbCBiZSBzYW5pdGl6ZWQgdXNpbmcgdGhlIHtAbGluayBuZ1Nhbml0aXplLiRzYW5pdGl6ZSAkc2FuaXRpemV9IHNlcnZpY2UuDQotICogVG8gdXRpbGl6ZSB0aGlzIGZ1bmN0aW9uYWxpdHksIGVuc3VyZSB0aGF0IGAkc2FuaXRpemVgIGlzIGF2YWlsYWJsZSwgZm9yIGV4YW1wbGUsIGJ5IGluY2x1ZGluZyB7QGxpbmsNCi0gKiBuZ1Nhbml0aXplfSBpbiB5b3VyIG1vZHVsZSdzIGRlcGVuZGVuY2llcyAobm90IGluIGNvcmUgQW5ndWxhcikuIEluIG9yZGVyIHRvIHVzZSB7QGxpbmsgbmdTYW5pdGl6ZX0NCi0gKiBpbiB5b3VyIG1vZHVsZSdzIGRlcGVuZGVuY2llcywgeW91IG5lZWQgdG8gaW5jbHVkZSAiYW5ndWxhci1zYW5pdGl6ZS5qcyIgaW4geW91ciBhcHBsaWNhdGlvbi4NCi0gKg0KLSAqIFlvdSBtYXkgYWxzbyBieXBhc3Mgc2FuaXRpemF0aW9uIGZvciB2YWx1ZXMgeW91IGtub3cgYXJlIHNhZmUuIFRvIGRvIHNvLCBiaW5kIHRvDQotICogYW4gZXhwbGljaXRseSB0cnVzdGVkIHZhbHVlIHZpYSB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzSHRtbCAkc2NlLnRydXN0QXNIdG1sfS4gIFNlZSB0aGUgZXhhbXBsZQ0KLSAqIHVuZGVyIHtAbGluayBuZy4kc2NlI3Nob3ctbWUtYW4tZXhhbXBsZS11c2luZy1zY2UtIFN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nIChTQ0UpfS4NCi0gKg0KLSAqIE5vdGU6IElmIGEgYCRzYW5pdGl6ZWAgc2VydmljZSBpcyB1bmF2YWlsYWJsZSBhbmQgdGhlIGJvdW5kIHZhbHVlIGlzbid0IGV4cGxpY2l0bHkgdHJ1c3RlZCwgeW91DQotICogd2lsbCBoYXZlIGFuIGV4Y2VwdGlvbiAoaW5zdGVhZCBvZiBhbiBleHBsb2l0LikNCi0gKg0KLSAqIEBlbGVtZW50IEFOWQ0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdCaW5kSHRtbCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZS4NCi0gKg0KLSAqIEBleGFtcGxlDQotDQotICAgPGV4YW1wbGUgbW9kdWxlPSJiaW5kSHRtbEV4YW1wbGUiIGRlcHM9ImFuZ3VsYXItc2FuaXRpemUuanMiPg0KLSAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAgICAgICAgPHAgbmctYmluZC1odG1sPSJteUhUTUwiPjwvcD4NCi0gICAgICAgPC9kaXY+DQotICAgICA8L2ZpbGU+DQotDQotICAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPg0KLSAgICAgICBhbmd1bGFyLm1vZHVsZSgnYmluZEh0bWxFeGFtcGxlJywgWyduZ1Nhbml0aXplJ10pDQotICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsNCi0gICAgICAgICAgICRzY29wZS5teUhUTUwgPQ0KLSAgICAgICAgICAgICAgJ0kgYW0gYW4gPGNvZGU+SFRNTDwvY29kZT5zdHJpbmcgd2l0aCAnICsNCi0gICAgICAgICAgICAgICc8YSBocmVmPSIjIj5saW5rcyE8L2E+IGFuZCBvdGhlciA8ZW0+c3R1ZmY8L2VtPic7DQotICAgICAgICAgfV0pOw0KLSAgICAgPC9maWxlPg0KLQ0KLSAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctYmluZC1odG1sJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbXlIVE1MJykpLmdldFRleHQoKSkudG9CZSgNCi0gICAgICAgICAgICAgJ0kgYW0gYW4gSFRNTHN0cmluZyB3aXRoIGxpbmtzISBhbmQgb3RoZXIgc3R1ZmYnKTsNCi0gICAgICAgfSk7DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLXZhciBuZ0JpbmRIdG1sRGlyZWN0aXZlID0gWyckc2NlJywgJyRwYXJzZScsICckY29tcGlsZScsIGZ1bmN0aW9uKCRzY2UsICRwYXJzZSwgJGNvbXBpbGUpIHsNCi0gIHJldHVybiB7DQotICAgIHJlc3RyaWN0OiAnQScsDQotICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nQmluZEh0bWxDb21waWxlKHRFbGVtZW50LCB0QXR0cnMpIHsNCi0gICAgICB2YXIgbmdCaW5kSHRtbEdldHRlciA9ICRwYXJzZSh0QXR0cnMubmdCaW5kSHRtbCk7DQotICAgICAgdmFyIG5nQmluZEh0bWxXYXRjaCA9ICRwYXJzZSh0QXR0cnMubmdCaW5kSHRtbCwgZnVuY3Rpb24gZ2V0U3RyaW5nVmFsdWUodmFsdWUpIHsNCi0gICAgICAgIHJldHVybiAodmFsdWUgfHwgJycpLnRvU3RyaW5nKCk7DQotICAgICAgfSk7DQotICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nQ2xhc3ModEVsZW1lbnQpOw0KLQ0KLSAgICAgIHJldHVybiBmdW5jdGlvbiBuZ0JpbmRIdG1sTGluayhzY29wZSwgZWxlbWVudCwgYXR0cikgew0KLSAgICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyhlbGVtZW50LCBhdHRyLm5nQmluZEh0bWwpOw0KLQ0KLSAgICAgICAgc2NvcGUuJHdhdGNoKG5nQmluZEh0bWxXYXRjaCwgZnVuY3Rpb24gbmdCaW5kSHRtbFdhdGNoQWN0aW9uKCkgew0KLSAgICAgICAgICAvLyB3ZSByZS1ldmFsdWF0ZSB0aGUgZXhwciBiZWNhdXNlIHdlIHdhbnQgYSBUcnVzdGVkVmFsdWVIb2xkZXJUeXBlDQotICAgICAgICAgIC8vIGZvciAkc2NlLCBub3QgYSBzdHJpbmcNCi0gICAgICAgICAgZWxlbWVudC5odG1sKCRzY2UuZ2V0VHJ1c3RlZEh0bWwobmdCaW5kSHRtbEdldHRlcihzY29wZSkpIHx8ICcnKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIH07DQotICAgIH0NCi0gIH07DQotfV07DQotDQotZnVuY3Rpb24gY2xhc3NEaXJlY3RpdmUobmFtZSwgc2VsZWN0b3IpIHsNCi0gIG5hbWUgPSAnbmdDbGFzcycgKyBuYW1lOw0KLSAgcmV0dXJuIFsnJGFuaW1hdGUnLCBmdW5jdGlvbigkYW5pbWF0ZSkgew0KLSAgICByZXR1cm4gew0KLSAgICAgIHJlc3RyaWN0OiAnQUMnLA0KLSAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7DQotICAgICAgICB2YXIgb2xkVmFsOw0KLQ0KLSAgICAgICAgc2NvcGUuJHdhdGNoKGF0dHJbbmFtZV0sIG5nQ2xhc3NXYXRjaEFjdGlvbiwgdHJ1ZSk7DQotDQotICAgICAgICBhdHRyLiRvYnNlcnZlKCdjbGFzcycsIGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgICAgIG5nQ2xhc3NXYXRjaEFjdGlvbihzY29wZS4kZXZhbChhdHRyW25hbWVdKSk7DQotICAgICAgICB9KTsNCi0NCi0NCi0gICAgICAgIGlmIChuYW1lICE9PSAnbmdDbGFzcycpIHsNCi0gICAgICAgICAgc2NvcGUuJHdhdGNoKCckaW5kZXgnLCBmdW5jdGlvbigkaW5kZXgsIG9sZCRpbmRleCkgew0KLSAgICAgICAgICAgIC8vIGpzaGludCBiaXR3aXNlOiBmYWxzZQ0KLSAgICAgICAgICAgIHZhciBtb2QgPSAkaW5kZXggJiAxOw0KLSAgICAgICAgICAgIGlmIChtb2QgIT09IChvbGQkaW5kZXggJiAxKSkgew0KLSAgICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSBhcnJheUNsYXNzZXMoc2NvcGUuJGV2YWwoYXR0cltuYW1lXSkpOw0KLSAgICAgICAgICAgICAgbW9kID09PSBzZWxlY3RvciA/DQotICAgICAgICAgICAgICAgIGFkZENsYXNzZXMoY2xhc3NlcykgOg0KLSAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKGNsYXNzZXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSk7DQotICAgICAgICB9DQotDQotICAgICAgICBmdW5jdGlvbiBhZGRDbGFzc2VzKGNsYXNzZXMpIHsNCi0gICAgICAgICAgdmFyIG5ld0NsYXNzZXMgPSBkaWdlc3RDbGFzc0NvdW50cyhjbGFzc2VzLCAxKTsNCi0gICAgICAgICAgYXR0ci4kYWRkQ2xhc3MobmV3Q2xhc3Nlcyk7DQotICAgICAgICB9DQotDQotICAgICAgICBmdW5jdGlvbiByZW1vdmVDbGFzc2VzKGNsYXNzZXMpIHsNCi0gICAgICAgICAgdmFyIG5ld0NsYXNzZXMgPSBkaWdlc3RDbGFzc0NvdW50cyhjbGFzc2VzLCAtMSk7DQotICAgICAgICAgIGF0dHIuJHJlbW92ZUNsYXNzKG5ld0NsYXNzZXMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZnVuY3Rpb24gZGlnZXN0Q2xhc3NDb3VudHMoY2xhc3NlcywgY291bnQpIHsNCi0gICAgICAgICAgdmFyIGNsYXNzQ291bnRzID0gZWxlbWVudC5kYXRhKCckY2xhc3NDb3VudHMnKSB8fCB7fTsNCi0gICAgICAgICAgdmFyIGNsYXNzZXNUb1VwZGF0ZSA9IFtdOw0KLSAgICAgICAgICBmb3JFYWNoKGNsYXNzZXMsIGZ1bmN0aW9uKGNsYXNzTmFtZSkgew0KLSAgICAgICAgICAgIGlmIChjb3VudCA+IDAgfHwgY2xhc3NDb3VudHNbY2xhc3NOYW1lXSkgew0KLSAgICAgICAgICAgICAgY2xhc3NDb3VudHNbY2xhc3NOYW1lXSA9IChjbGFzc0NvdW50c1tjbGFzc05hbWVdIHx8IDApICsgY291bnQ7DQotICAgICAgICAgICAgICBpZiAoY2xhc3NDb3VudHNbY2xhc3NOYW1lXSA9PT0gKyhjb3VudCA+IDApKSB7DQotICAgICAgICAgICAgICAgIGNsYXNzZXNUb1VwZGF0ZS5wdXNoKGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9KTsNCi0gICAgICAgICAgZWxlbWVudC5kYXRhKCckY2xhc3NDb3VudHMnLCBjbGFzc0NvdW50cyk7DQotICAgICAgICAgIHJldHVybiBjbGFzc2VzVG9VcGRhdGUuam9pbignICcpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ2xhc3NlcyhvbGRDbGFzc2VzLCBuZXdDbGFzc2VzKSB7DQotICAgICAgICAgIHZhciB0b0FkZCA9IGFycmF5RGlmZmVyZW5jZShuZXdDbGFzc2VzLCBvbGRDbGFzc2VzKTsNCi0gICAgICAgICAgdmFyIHRvUmVtb3ZlID0gYXJyYXlEaWZmZXJlbmNlKG9sZENsYXNzZXMsIG5ld0NsYXNzZXMpOw0KLSAgICAgICAgICB0b0FkZCA9IGRpZ2VzdENsYXNzQ291bnRzKHRvQWRkLCAxKTsNCi0gICAgICAgICAgdG9SZW1vdmUgPSBkaWdlc3RDbGFzc0NvdW50cyh0b1JlbW92ZSwgLTEpOw0KLSAgICAgICAgICBpZiAodG9BZGQgJiYgdG9BZGQubGVuZ3RoKSB7DQotICAgICAgICAgICAgJGFuaW1hdGUuYWRkQ2xhc3MoZWxlbWVudCwgdG9BZGQpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmICh0b1JlbW92ZSAmJiB0b1JlbW92ZS5sZW5ndGgpIHsNCi0gICAgICAgICAgICAkYW5pbWF0ZS5yZW1vdmVDbGFzcyhlbGVtZW50LCB0b1JlbW92ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZ1bmN0aW9uIG5nQ2xhc3NXYXRjaEFjdGlvbihuZXdWYWwpIHsNCi0gICAgICAgICAgaWYgKHNlbGVjdG9yID09PSB0cnVlIHx8IHNjb3BlLiRpbmRleCAlIDIgPT09IHNlbGVjdG9yKSB7DQotICAgICAgICAgICAgdmFyIG5ld0NsYXNzZXMgPSBhcnJheUNsYXNzZXMobmV3VmFsIHx8IFtdKTsNCi0gICAgICAgICAgICBpZiAoIW9sZFZhbCkgew0KLSAgICAgICAgICAgICAgYWRkQ2xhc3NlcyhuZXdDbGFzc2VzKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCFlcXVhbHMobmV3VmFsLG9sZFZhbCkpIHsNCi0gICAgICAgICAgICAgIHZhciBvbGRDbGFzc2VzID0gYXJyYXlDbGFzc2VzKG9sZFZhbCk7DQotICAgICAgICAgICAgICB1cGRhdGVDbGFzc2VzKG9sZENsYXNzZXMsIG5ld0NsYXNzZXMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBvbGRWYWwgPSBzaGFsbG93Q29weShuZXdWYWwpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgZnVuY3Rpb24gYXJyYXlEaWZmZXJlbmNlKHRva2VuczEsIHRva2VuczIpIHsNCi0gICAgICB2YXIgdmFsdWVzID0gW107DQotDQotICAgICAgb3V0ZXI6DQotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMxLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnMxW2ldOw0KLSAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0b2tlbnMyLmxlbmd0aDsgaisrKSB7DQotICAgICAgICAgIGlmICh0b2tlbiA9PSB0b2tlbnMyW2pdKSBjb250aW51ZSBvdXRlcjsNCi0gICAgICAgIH0NCi0gICAgICAgIHZhbHVlcy5wdXNoKHRva2VuKTsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHZhbHVlczsNCi0gICAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBhcnJheUNsYXNzZXMoY2xhc3NWYWwpIHsNCi0gICAgICBpZiAoaXNBcnJheShjbGFzc1ZhbCkpIHsNCi0gICAgICAgIHJldHVybiBjbGFzc1ZhbDsNCi0gICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKGNsYXNzVmFsKSkgew0KLSAgICAgICAgcmV0dXJuIGNsYXNzVmFsLnNwbGl0KCcgJyk7DQotICAgICAgfSBlbHNlIGlmIChpc09iamVjdChjbGFzc1ZhbCkpIHsNCi0gICAgICAgIHZhciBjbGFzc2VzID0gW107DQotICAgICAgICBmb3JFYWNoKGNsYXNzVmFsLCBmdW5jdGlvbih2LCBrKSB7DQotICAgICAgICAgIGlmICh2KSB7DQotICAgICAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuY29uY2F0KGsuc3BsaXQoJyAnKSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICAgICAgcmV0dXJuIGNsYXNzZXM7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBjbGFzc1ZhbDsNCi0gICAgfQ0KLSAgfV07DQotfQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ0NsYXNzDQotICogQHJlc3RyaWN0IEFDDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBUaGUgYG5nQ2xhc3NgIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIGR5bmFtaWNhbGx5IHNldCBDU1MgY2xhc3NlcyBvbiBhbiBIVE1MIGVsZW1lbnQgYnkgZGF0YWJpbmRpbmcNCi0gKiBhbiBleHByZXNzaW9uIHRoYXQgcmVwcmVzZW50cyBhbGwgY2xhc3NlcyB0byBiZSBhZGRlZC4NCi0gKg0KLSAqIFRoZSBkaXJlY3RpdmUgb3BlcmF0ZXMgaW4gdGhyZWUgZGlmZmVyZW50IHdheXMsIGRlcGVuZGluZyBvbiB3aGljaCBvZiB0aHJlZSB0eXBlcyB0aGUgZXhwcmVzc2lvbg0KLSAqIGV2YWx1YXRlcyB0bzoNCi0gKg0KLSAqIDEuIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHN0cmluZywgdGhlIHN0cmluZyBzaG91bGQgYmUgb25lIG9yIG1vcmUgc3BhY2UtZGVsaW1pdGVkIGNsYXNzDQotICogbmFtZXMuDQotICoNCi0gKiAyLiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYW4gYXJyYXksIGVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgc2hvdWxkIGJlIGEgc3RyaW5nIHRoYXQgaXMNCi0gKiBvbmUgb3IgbW9yZSBzcGFjZS1kZWxpbWl0ZWQgY2xhc3MgbmFtZXMuDQotICoNCi0gKiAzLiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYW4gb2JqZWN0LCB0aGVuIGZvciBlYWNoIGtleS12YWx1ZSBwYWlyIG9mIHRoZQ0KLSAqIG9iamVjdCB3aXRoIGEgdHJ1dGh5IHZhbHVlIHRoZSBjb3JyZXNwb25kaW5nIGtleSBpcyB1c2VkIGFzIGEgY2xhc3MgbmFtZS4NCi0gKg0KLSAqIFRoZSBkaXJlY3RpdmUgd29uJ3QgYWRkIGR1cGxpY2F0ZSBjbGFzc2VzIGlmIGEgcGFydGljdWxhciBjbGFzcyB3YXMgYWxyZWFkeSBzZXQuDQotICoNCi0gKiBXaGVuIHRoZSBleHByZXNzaW9uIGNoYW5nZXMsIHRoZSBwcmV2aW91c2x5IGFkZGVkIGNsYXNzZXMgYXJlIHJlbW92ZWQgYW5kIG9ubHkgdGhlbiB0aGUNCi0gKiBuZXcgY2xhc3NlcyBhcmUgYWRkZWQuDQotICoNCi0gKiBAYW5pbWF0aW9ucw0KLSAqIGFkZCAtIGhhcHBlbnMganVzdCBiZWZvcmUgdGhlIGNsYXNzIGlzIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQNCi0gKiByZW1vdmUgLSBoYXBwZW5zIGp1c3QgYmVmb3JlIHRoZSBjbGFzcyBpcyByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnQNCi0gKg0KLSAqIEBlbGVtZW50IEFOWQ0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDbGFzcyB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsLiBUaGUgcmVzdWx0DQotICogICBvZiB0aGUgZXZhbHVhdGlvbiBjYW4gYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHNwYWNlIGRlbGltaXRlZCBjbGFzcw0KLSAqICAgbmFtZXMsIGFuIGFycmF5LCBvciBhIG1hcCBvZiBjbGFzcyBuYW1lcyB0byBib29sZWFuIHZhbHVlcy4gSW4gdGhlIGNhc2Ugb2YgYSBtYXAsIHRoZQ0KLSAqICAgbmFtZXMgb2YgdGhlIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzIGFyZSB0cnV0aHkgd2lsbCBiZSBhZGRlZCBhcyBjc3MgY2xhc3NlcyB0byB0aGUNCi0gKiAgIGVsZW1lbnQuDQotICoNCi0gKiBAZXhhbXBsZSBFeGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIGJhc2ljIGJpbmRpbmdzIHZpYSBuZ0NsYXNzIGRpcmVjdGl2ZS4NCi0gICA8ZXhhbXBsZT4NCi0gICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICA8cCBuZy1jbGFzcz0ie3N0cmlrZTogZGVsZXRlZCwgYm9sZDogaW1wb3J0YW50LCByZWQ6IGVycm9yfSI+TWFwIFN5bnRheCBFeGFtcGxlPC9wPg0KLSAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJkZWxldGVkIj4gZGVsZXRlZCAoYXBwbHkgInN0cmlrZSIgY2xhc3MpPGJyPg0KLSAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJpbXBvcnRhbnQiPiBpbXBvcnRhbnQgKGFwcGx5ICJib2xkIiBjbGFzcyk8YnI+DQotICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImVycm9yIj4gZXJyb3IgKGFwcGx5ICJyZWQiIGNsYXNzKQ0KLSAgICAgICA8aHI+DQotICAgICAgIDxwIG5nLWNsYXNzPSJzdHlsZSI+VXNpbmcgU3RyaW5nIFN5bnRheDwvcD4NCi0gICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJzdHlsZSIgcGxhY2Vob2xkZXI9IlR5cGU6IGJvbGQgc3RyaWtlIHJlZCI+DQotICAgICAgIDxocj4NCi0gICAgICAgPHAgbmctY2xhc3M9IltzdHlsZTEsIHN0eWxlMiwgc3R5bGUzXSI+VXNpbmcgQXJyYXkgU3ludGF4PC9wPg0KLSAgICAgICA8aW5wdXQgbmctbW9kZWw9InN0eWxlMSIgcGxhY2Vob2xkZXI9IlR5cGU6IGJvbGQsIHN0cmlrZSBvciByZWQiPjxicj4NCi0gICAgICAgPGlucHV0IG5nLW1vZGVsPSJzdHlsZTIiIHBsYWNlaG9sZGVyPSJUeXBlOiBib2xkLCBzdHJpa2Ugb3IgcmVkIj48YnI+DQotICAgICAgIDxpbnB1dCBuZy1tb2RlbD0ic3R5bGUzIiBwbGFjZWhvbGRlcj0iVHlwZTogYm9sZCwgc3RyaWtlIG9yIHJlZCI+PGJyPg0KLSAgICAgPC9maWxlPg0KLSAgICAgPGZpbGUgbmFtZT0ic3R5bGUuY3NzIj4NCi0gICAgICAgLnN0cmlrZSB7DQotICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7DQotICAgICAgIH0NCi0gICAgICAgLmJvbGQgew0KLSAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgICAgIH0NCi0gICAgICAgLnJlZCB7DQotICAgICAgICAgICBjb2xvcjogcmVkOw0KLSAgICAgICB9DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgdmFyIHBzID0gZWxlbWVudC5hbGwoYnkuY3NzKCdwJykpOw0KLQ0KLSAgICAgICBpdCgnc2hvdWxkIGxldCB5b3UgdG9nZ2xlIHRoZSBjbGFzcycsIGZ1bmN0aW9uKCkgew0KLQ0KLSAgICAgICAgIGV4cGVjdChwcy5maXJzdCgpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkubm90LnRvTWF0Y2goL2JvbGQvKTsNCi0gICAgICAgICBleHBlY3QocHMuZmlyc3QoKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLm5vdC50b01hdGNoKC9yZWQvKTsNCi0NCi0gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdpbXBvcnRhbnQnKSkuY2xpY2soKTsNCi0gICAgICAgICBleHBlY3QocHMuZmlyc3QoKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvTWF0Y2goL2JvbGQvKTsNCi0NCi0gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdlcnJvcicpKS5jbGljaygpOw0KLSAgICAgICAgIGV4cGVjdChwcy5maXJzdCgpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG9NYXRjaCgvcmVkLyk7DQotICAgICAgIH0pOw0KLQ0KLSAgICAgICBpdCgnc2hvdWxkIGxldCB5b3UgdG9nZ2xlIHN0cmluZyBleGFtcGxlJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgZXhwZWN0KHBzLmdldCgxKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvQmUoJycpOw0KLSAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3N0eWxlJykpLmNsZWFyKCk7DQotICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnc3R5bGUnKSkuc2VuZEtleXMoJ3JlZCcpOw0KLSAgICAgICAgIGV4cGVjdChwcy5nZXQoMSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b0JlKCdyZWQnKTsNCi0gICAgICAgfSk7DQotDQotICAgICAgIGl0KCdhcnJheSBleGFtcGxlIHNob3VsZCBoYXZlIDMgY2xhc3NlcycsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgIGV4cGVjdChwcy5sYXN0KCkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b0JlKCcnKTsNCi0gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzdHlsZTEnKSkuc2VuZEtleXMoJ2JvbGQnKTsNCi0gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzdHlsZTInKSkuc2VuZEtleXMoJ3N0cmlrZScpOw0KLSAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3N0eWxlMycpKS5zZW5kS2V5cygncmVkJyk7DQotICAgICAgICAgZXhwZWN0KHBzLmxhc3QoKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvQmUoJ2JvbGQgc3RyaWtlIHJlZCcpOw0KLSAgICAgICB9KTsNCi0gICAgIDwvZmlsZT4NCi0gICA8L2V4YW1wbGU+DQotDQotICAgIyMgQW5pbWF0aW9ucw0KLQ0KLSAgIFRoZSBleGFtcGxlIGJlbG93IGRlbW9uc3RyYXRlcyBob3cgdG8gcGVyZm9ybSBhbmltYXRpb25zIHVzaW5nIG5nQ2xhc3MuDQotDQotICAgPGV4YW1wbGUgbW9kdWxlPSJuZ0FuaW1hdGUiIGRlcHM9ImFuZ3VsYXItYW5pbWF0ZS5qcyIgYW5pbWF0aW9ucz0idHJ1ZSI+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8aW5wdXQgaWQ9InNldGJ0biIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0ic2V0IiBuZy1jbGljaz0ibXlWYXI9J215LWNsYXNzJyI+DQotICAgICAgPGlucHV0IGlkPSJjbGVhcmJ0biIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iY2xlYXIiIG5nLWNsaWNrPSJteVZhcj0nJyI+DQotICAgICAgPGJyPg0KLSAgICAgIDxzcGFuIGNsYXNzPSJiYXNlLWNsYXNzIiBuZy1jbGFzcz0ibXlWYXIiPlNhbXBsZSBUZXh0PC9zcGFuPg0KLSAgICAgPC9maWxlPg0KLSAgICAgPGZpbGUgbmFtZT0ic3R5bGUuY3NzIj4NCi0gICAgICAgLmJhc2UtY2xhc3Mgew0KLSAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzOw0KLSAgICAgICAgIHRyYW5zaXRpb246YWxsIGN1YmljLWJlemllcigwLjI1MCwgMC40NjAsIDAuNDUwLCAwLjk0MCkgMC41czsNCi0gICAgICAgfQ0KLQ0KLSAgICAgICAuYmFzZS1jbGFzcy5teS1jbGFzcyB7DQotICAgICAgICAgY29sb3I6IHJlZDsNCi0gICAgICAgICBmb250LXNpemU6M2VtOw0KLSAgICAgICB9DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1jbGFzcycsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnLmJhc2UtY2xhc3MnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5ub3QuDQotICAgICAgICAgICB0b01hdGNoKC9teS1jbGFzcy8pOw0KLQ0KLSAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ3NldGJ0bicpKS5jbGljaygpOw0KLQ0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnLmJhc2UtY2xhc3MnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS4NCi0gICAgICAgICAgIHRvTWF0Y2goL215LWNsYXNzLyk7DQotDQotICAgICAgICAgZWxlbWVudChieS5pZCgnY2xlYXJidG4nKSkuY2xpY2soKTsNCi0NCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJy5iYXNlLWNsYXNzJykpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkubm90Lg0KLSAgICAgICAgICAgdG9NYXRjaCgvbXktY2xhc3MvKTsNCi0gICAgICAgfSk7DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLQ0KLQ0KLSAgICMjIG5nQ2xhc3MgYW5kIHByZS1leGlzdGluZyBDU1MzIFRyYW5zaXRpb25zL0FuaW1hdGlvbnMNCi0gICBUaGUgbmdDbGFzcyBkaXJlY3RpdmUgc3RpbGwgc3VwcG9ydHMgQ1NTMyBUcmFuc2l0aW9ucy9BbmltYXRpb25zIGV2ZW4gaWYgdGhleSBkbyBub3QgZm9sbG93IHRoZSBuZ0FuaW1hdGUgQ1NTIG5hbWluZyBzdHJ1Y3R1cmUuDQotICAgVXBvbiBhbmltYXRpb24gbmdBbmltYXRlIHdpbGwgYXBwbHkgc3VwcGxlbWVudGFyeSBDU1MgY2xhc3NlcyB0byB0cmFjayB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhbiBhbmltYXRpb24sIGJ1dCB0aGlzIHdpbGwgbm90IGhpbmRlcg0KLSAgIGFueSBwcmUtZXhpc3RpbmcgQ1NTIHRyYW5zaXRpb25zIGFscmVhZHkgb24gdGhlIGVsZW1lbnQuIFRvIGdldCBhbiBpZGVhIG9mIHdoYXQgaGFwcGVucyBkdXJpbmcgYSBjbGFzcy1iYXNlZCBhbmltYXRpb24sIGJlIHN1cmUNCi0gICB0byB2aWV3IHRoZSBzdGVwIGJ5IHN0ZXAgZGV0YWlscyBvZiB7QGxpbmsgbmcuJGFuaW1hdGUjYWRkQ2xhc3MgJGFuaW1hdGUuYWRkQ2xhc3N9IGFuZA0KLSAgIHtAbGluayBuZy4kYW5pbWF0ZSNyZW1vdmVDbGFzcyAkYW5pbWF0ZS5yZW1vdmVDbGFzc30uDQotICovDQotdmFyIG5nQ2xhc3NEaXJlY3RpdmUgPSBjbGFzc0RpcmVjdGl2ZSgnJywgdHJ1ZSk7DQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nQ2xhc3NPZGQNCi0gKiBAcmVzdHJpY3QgQUMNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRoZSBgbmdDbGFzc09kZGAgYW5kIGBuZ0NsYXNzRXZlbmAgZGlyZWN0aXZlcyB3b3JrIGV4YWN0bHkgYXMNCi0gKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ2xhc3MgbmdDbGFzc30sIGV4Y2VwdCB0aGV5IHdvcmsgaW4NCi0gKiBjb25qdW5jdGlvbiB3aXRoIGBuZ1JlcGVhdGAgYW5kIHRha2UgZWZmZWN0IG9ubHkgb24gb2RkIChldmVuKSByb3dzLg0KLSAqDQotICogVGhpcyBkaXJlY3RpdmUgY2FuIGJlIGFwcGxpZWQgb25seSB3aXRoaW4gdGhlIHNjb3BlIG9mIGFuDQotICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ1JlcGVhdCBuZ1JlcGVhdH0uDQotICoNCi0gKiBAZWxlbWVudCBBTlkNCi0gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2xhc3NPZGQge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbC4gVGhlIHJlc3VsdA0KLSAqICAgb2YgdGhlIGV2YWx1YXRpb24gY2FuIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBzcGFjZSBkZWxpbWl0ZWQgY2xhc3MgbmFtZXMgb3IgYW4gYXJyYXkuDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgIDxleGFtcGxlPg0KLSAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgICA8b2wgbmctaW5pdD0ibmFtZXM9WydKb2huJywgJ01hcnknLCAnQ2F0ZScsICdTdXonXSI+DQotICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9Im5hbWUgaW4gbmFtZXMiPg0KLSAgICAgICAgICAgPHNwYW4gbmctY2xhc3Mtb2RkPSInb2RkJyIgbmctY2xhc3MtZXZlbj0iJ2V2ZW4nIj4NCi0gICAgICAgICAgICAge3tuYW1lfX0NCi0gICAgICAgICAgIDwvc3Bhbj4NCi0gICAgICAgICAgPC9saT4NCi0gICAgICAgIDwvb2w+DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPg0KLSAgICAgICAub2RkIHsNCi0gICAgICAgICBjb2xvcjogcmVkOw0KLSAgICAgICB9DQotICAgICAgIC5ldmVuIHsNCi0gICAgICAgICBjb2xvcjogYmx1ZTsNCi0gICAgICAgfQ0KLSAgICAgPC9maWxlPg0KLSAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctY2xhc3Mtb2RkIGFuZCBuZy1jbGFzcy1ldmVuJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkucmVwZWF0ZXIoJ25hbWUgaW4gbmFtZXMnKS5yb3coMCkuY29sdW1uKCduYW1lJykpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkuDQotICAgICAgICAgICB0b01hdGNoKC9vZGQvKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5yZXBlYXRlcignbmFtZSBpbiBuYW1lcycpLnJvdygxKS5jb2x1bW4oJ25hbWUnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS4NCi0gICAgICAgICAgIHRvTWF0Y2goL2V2ZW4vKTsNCi0gICAgICAgfSk7DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLXZhciBuZ0NsYXNzT2RkRGlyZWN0aXZlID0gY2xhc3NEaXJlY3RpdmUoJ09kZCcsIDApOw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ0NsYXNzRXZlbg0KLSAqIEByZXN0cmljdCBBQw0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogVGhlIGBuZ0NsYXNzT2RkYCBhbmQgYG5nQ2xhc3NFdmVuYCBkaXJlY3RpdmVzIHdvcmsgZXhhY3RseSBhcw0KLSAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDbGFzcyBuZ0NsYXNzfSwgZXhjZXB0IHRoZXkgd29yayBpbg0KLSAqIGNvbmp1bmN0aW9uIHdpdGggYG5nUmVwZWF0YCBhbmQgdGFrZSBlZmZlY3Qgb25seSBvbiBvZGQgKGV2ZW4pIHJvd3MuDQotICoNCi0gKiBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgYXBwbGllZCBvbmx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgYW4NCi0gKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nUmVwZWF0IG5nUmVwZWF0fS4NCi0gKg0KLSAqIEBlbGVtZW50IEFOWQ0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDbGFzc0V2ZW4ge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbC4gVGhlDQotICogICByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24gY2FuIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBzcGFjZSBkZWxpbWl0ZWQgY2xhc3MgbmFtZXMgb3IgYW4gYXJyYXkuDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgIDxleGFtcGxlPg0KLSAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgICA8b2wgbmctaW5pdD0ibmFtZXM9WydKb2huJywgJ01hcnknLCAnQ2F0ZScsICdTdXonXSI+DQotICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9Im5hbWUgaW4gbmFtZXMiPg0KLSAgICAgICAgICAgPHNwYW4gbmctY2xhc3Mtb2RkPSInb2RkJyIgbmctY2xhc3MtZXZlbj0iJ2V2ZW4nIj4NCi0gICAgICAgICAgICAge3tuYW1lfX0gJm5ic3A7ICZuYnNwOyAmbmJzcDsNCi0gICAgICAgICAgIDwvc3Bhbj4NCi0gICAgICAgICAgPC9saT4NCi0gICAgICAgIDwvb2w+DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPg0KLSAgICAgICAub2RkIHsNCi0gICAgICAgICBjb2xvcjogcmVkOw0KLSAgICAgICB9DQotICAgICAgIC5ldmVuIHsNCi0gICAgICAgICBjb2xvcjogYmx1ZTsNCi0gICAgICAgfQ0KLSAgICAgPC9maWxlPg0KLSAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctY2xhc3Mtb2RkIGFuZCBuZy1jbGFzcy1ldmVuJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkucmVwZWF0ZXIoJ25hbWUgaW4gbmFtZXMnKS5yb3coMCkuY29sdW1uKCduYW1lJykpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkuDQotICAgICAgICAgICB0b01hdGNoKC9vZGQvKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5yZXBlYXRlcignbmFtZSBpbiBuYW1lcycpLnJvdygxKS5jb2x1bW4oJ25hbWUnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS4NCi0gICAgICAgICAgIHRvTWF0Y2goL2V2ZW4vKTsNCi0gICAgICAgfSk7DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLXZhciBuZ0NsYXNzRXZlbkRpcmVjdGl2ZSA9IGNsYXNzRGlyZWN0aXZlKCdFdmVuJywgMSk7DQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nQ2xvYWsNCi0gKiBAcmVzdHJpY3QgQUMNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRoZSBgbmdDbG9ha2AgZGlyZWN0aXZlIGlzIHVzZWQgdG8gcHJldmVudCB0aGUgQW5ndWxhciBodG1sIHRlbXBsYXRlIGZyb20gYmVpbmcgYnJpZWZseQ0KLSAqIGRpc3BsYXllZCBieSB0aGUgYnJvd3NlciBpbiBpdHMgcmF3ICh1bmNvbXBpbGVkKSBmb3JtIHdoaWxlIHlvdXIgYXBwbGljYXRpb24gaXMgbG9hZGluZy4gVXNlIHRoaXMNCi0gKiBkaXJlY3RpdmUgdG8gYXZvaWQgdGhlIHVuZGVzaXJhYmxlIGZsaWNrZXIgZWZmZWN0IGNhdXNlZCBieSB0aGUgaHRtbCB0ZW1wbGF0ZSBkaXNwbGF5Lg0KLSAqDQotICogVGhlIGRpcmVjdGl2ZSBjYW4gYmUgYXBwbGllZCB0byB0aGUgYDxib2R5PmAgZWxlbWVudCwgYnV0IHRoZSBwcmVmZXJyZWQgdXNhZ2UgaXMgdG8gYXBwbHkNCi0gKiBtdWx0aXBsZSBgbmdDbG9ha2AgZGlyZWN0aXZlcyB0byBzbWFsbCBwb3J0aW9ucyBvZiB0aGUgcGFnZSB0byBwZXJtaXQgcHJvZ3Jlc3NpdmUgcmVuZGVyaW5nDQotICogb2YgdGhlIGJyb3dzZXIgdmlldy4NCi0gKg0KLSAqIGBuZ0Nsb2FrYCB3b3JrcyBpbiBjb29wZXJhdGlvbiB3aXRoIHRoZSBmb2xsb3dpbmcgY3NzIHJ1bGUgZW1iZWRkZWQgd2l0aGluIGBhbmd1bGFyLmpzYCBhbmQNCi0gKiBgYW5ndWxhci5taW4uanNgLg0KLSAqIEZvciBDU1AgbW9kZSBwbGVhc2UgYWRkIGBhbmd1bGFyLWNzcC5jc3NgIHRvIHlvdXIgaHRtbCBmaWxlIChzZWUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NzcCBuZ0NzcH0pLg0KLSAqDQotICogYGBgY3NzDQotICogW25nXDpjbG9ha10sIFtuZy1jbG9ha10sIFtkYXRhLW5nLWNsb2FrXSwgW3gtbmctY2xvYWtdLCAubmctY2xvYWssIC54LW5nLWNsb2FrIHsNCi0gKiAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsNCi0gKiB9DQotICogYGBgDQotICoNCi0gKiBXaGVuIHRoaXMgY3NzIHJ1bGUgaXMgbG9hZGVkIGJ5IHRoZSBicm93c2VyLCBhbGwgaHRtbCBlbGVtZW50cyAoaW5jbHVkaW5nIHRoZWlyIGNoaWxkcmVuKSB0aGF0DQotICogYXJlIHRhZ2dlZCB3aXRoIHRoZSBgbmdDbG9ha2AgZGlyZWN0aXZlIGFyZSBoaWRkZW4uIFdoZW4gQW5ndWxhciBlbmNvdW50ZXJzIHRoaXMgZGlyZWN0aXZlDQotICogZHVyaW5nIHRoZSBjb21waWxhdGlvbiBvZiB0aGUgdGVtcGxhdGUgaXQgZGVsZXRlcyB0aGUgYG5nQ2xvYWtgIGVsZW1lbnQgYXR0cmlidXRlLCBtYWtpbmcNCi0gKiB0aGUgY29tcGlsZWQgZWxlbWVudCB2aXNpYmxlLg0KLSAqDQotICogRm9yIHRoZSBiZXN0IHJlc3VsdCwgdGhlIGBhbmd1bGFyLmpzYCBzY3JpcHQgbXVzdCBiZSBsb2FkZWQgaW4gdGhlIGhlYWQgc2VjdGlvbiBvZiB0aGUgaHRtbA0KLSAqIGRvY3VtZW50OyBhbHRlcm5hdGl2ZWx5LCB0aGUgY3NzIHJ1bGUgYWJvdmUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgZXh0ZXJuYWwgc3R5bGVzaGVldCBvZiB0aGUNCi0gKiBhcHBsaWNhdGlvbi4NCi0gKg0KLSAqIExlZ2FjeSBicm93c2VycywgbGlrZSBJRTcsIGRvIG5vdCBwcm92aWRlIGF0dHJpYnV0ZSBzZWxlY3RvciBzdXBwb3J0IChhZGRlZCBpbiBDU1MgMi4xKSBzbyB0aGV5DQotICogY2Fubm90IG1hdGNoIHRoZSBgW25nXDpjbG9ha11gIHNlbGVjdG9yLiBUbyB3b3JrIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHlvdSBtdXN0IGFkZCB0aGUgY3NzDQotICogY2xhc3MgYG5nLWNsb2FrYCBpbiBhZGRpdGlvbiB0byB0aGUgYG5nQ2xvYWtgIGRpcmVjdGl2ZSBhcyBzaG93biBpbiB0aGUgZXhhbXBsZSBiZWxvdy4NCi0gKg0KLSAqIEBlbGVtZW50IEFOWQ0KLSAqDQotICogQGV4YW1wbGUNCi0gICA8ZXhhbXBsZT4NCi0gICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICAgPGRpdiBpZD0idGVtcGxhdGUxIiBuZy1jbG9haz57eyAnaGVsbG8nIH19PC9kaXY+DQotICAgICAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZTIiIG5nLWNsb2FrIGNsYXNzPSJuZy1jbG9hayI+e3sgJ2hlbGxvIElFNycgfX08L2Rpdj4NCi0gICAgIDwvZmlsZT4NCi0gICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICBpdCgnc2hvdWxkIHJlbW92ZSB0aGUgdGVtcGxhdGUgZGlyZWN0aXZlIGFuZCBjc3MgY2xhc3MnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICBleHBlY3QoJCgnI3RlbXBsYXRlMScpLmdldEF0dHJpYnV0ZSgnbmctY2xvYWsnKSkuDQotICAgICAgICAgICB0b0JlTnVsbCgpOw0KLSAgICAgICAgIGV4cGVjdCgkKCcjdGVtcGxhdGUyJykuZ2V0QXR0cmlidXRlKCduZy1jbG9haycpKS4NCi0gICAgICAgICAgIHRvQmVOdWxsKCk7DQotICAgICAgIH0pOw0KLSAgICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gKg0KLSAqLw0KLXZhciBuZ0Nsb2FrRGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoew0KLSAgY29tcGlsZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cikgew0KLSAgICBhdHRyLiRzZXQoJ25nQ2xvYWsnLCB1bmRlZmluZWQpOw0KLSAgICBlbGVtZW50LnJlbW92ZUNsYXNzKCduZy1jbG9haycpOw0KLSAgfQ0KLX0pOw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ0NvbnRyb2xsZXINCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRoZSBgbmdDb250cm9sbGVyYCBkaXJlY3RpdmUgYXR0YWNoZXMgYSBjb250cm9sbGVyIGNsYXNzIHRvIHRoZSB2aWV3LiBUaGlzIGlzIGEga2V5IGFzcGVjdCBvZiBob3cgYW5ndWxhcg0KLSAqIHN1cHBvcnRzIHRoZSBwcmluY2lwbGVzIGJlaGluZCB0aGUgTW9kZWwtVmlldy1Db250cm9sbGVyIGRlc2lnbiBwYXR0ZXJuLg0KLSAqDQotICogTVZDIGNvbXBvbmVudHMgaW4gYW5ndWxhcjoNCi0gKg0KLSAqICogTW9kZWwg4oA/IE1vZGVscyBhcmUgdGhlIHByb3BlcnRpZXMgb2YgYSBzY29wZTsgc2NvcGVzIGFyZSBhdHRhY2hlZCB0byB0aGUgRE9NIHdoZXJlIHNjb3BlIHByb3BlcnRpZXMNCi0gKiAgIGFyZSBhY2Nlc3NlZCB0aHJvdWdoIGJpbmRpbmdzLg0KLSAqICogVmlldyDigD8gVGhlIHRlbXBsYXRlIChIVE1MIHdpdGggZGF0YSBiaW5kaW5ncykgdGhhdCBpcyByZW5kZXJlZCBpbnRvIHRoZSBWaWV3Lg0KLSAqICogQ29udHJvbGxlciDigD8gVGhlIGBuZ0NvbnRyb2xsZXJgIGRpcmVjdGl2ZSBzcGVjaWZpZXMgYSBDb250cm9sbGVyIGNsYXNzOyB0aGUgY2xhc3MgY29udGFpbnMgYnVzaW5lc3MNCi0gKiAgIGxvZ2ljIGJlaGluZCB0aGUgYXBwbGljYXRpb24gdG8gZGVjb3JhdGUgdGhlIHNjb3BlIHdpdGggZnVuY3Rpb25zIGFuZCB2YWx1ZXMNCi0gKg0KLSAqIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gYXR0YWNoIGNvbnRyb2xsZXJzIHRvIHRoZSBET00gYnkgZGVjbGFyaW5nIGl0IGluIGEgcm91dGUgZGVmaW5pdGlvbg0KLSAqIHZpYSB0aGUge0BsaW5rIG5nUm91dGUuJHJvdXRlICRyb3V0ZX0gc2VydmljZS4gQSBjb21tb24gbWlzdGFrZSBpcyB0byBkZWNsYXJlIHRoZSBjb250cm9sbGVyDQotICogYWdhaW4gdXNpbmcgYG5nLWNvbnRyb2xsZXJgIGluIHRoZSB0ZW1wbGF0ZSBpdHNlbGYuICBUaGlzIHdpbGwgY2F1c2UgdGhlIGNvbnRyb2xsZXIgdG8gYmUgYXR0YWNoZWQNCi0gKiBhbmQgZXhlY3V0ZWQgdHdpY2UuDQotICoNCi0gKiBAZWxlbWVudCBBTlkNCi0gKiBAc2NvcGUNCi0gKiBAcHJpb3JpdHkgNTAwDQotICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NvbnRyb2xsZXIgTmFtZSBvZiBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY3VycmVudA0KLSAqIHtAbGluayBuZy4kY29udHJvbGxlclByb3ZpZGVyICRjb250cm9sbGVyUHJvdmlkZXJ9IG9yIGFuIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259DQotICogdGhhdCBvbiB0aGUgY3VycmVudCBzY29wZSBldmFsdWF0ZXMgdG8gYSBjb25zdHJ1Y3RvciBmdW5jdGlvbi4NCi0gKg0KLSAqIFRoZSBjb250cm9sbGVyIGluc3RhbmNlIGNhbiBiZSBwdWJsaXNoZWQgaW50byBhIHNjb3BlIHByb3BlcnR5IGJ5IHNwZWNpZnlpbmcNCi0gKiBgbmctY29udHJvbGxlcj0iYXMgcHJvcGVydHlOYW1lImAuDQotICoNCi0gKiBJZiB0aGUgY3VycmVudCBgJGNvbnRyb2xsZXJQcm92aWRlcmAgaXMgY29uZmlndXJlZCB0byB1c2UgZ2xvYmFscyAodmlhDQotICoge0BsaW5rIG5nLiRjb250cm9sbGVyUHJvdmlkZXIjYWxsb3dHbG9iYWxzIGAkY29udHJvbGxlclByb3ZpZGVyLmFsbG93R2xvYmFscygpYCB9KSwgdGhpcyBtYXkNCi0gKiBhbHNvIGJlIHRoZSBuYW1lIG9mIGEgZ2xvYmFsbHkgYWNjZXNzaWJsZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiAobm90IHJlY29tbWVuZGVkKS4NCi0gKg0KLSAqIEBleGFtcGxlDQotICogSGVyZSBpcyBhIHNpbXBsZSBmb3JtIGZvciBlZGl0aW5nIHVzZXIgY29udGFjdCBpbmZvcm1hdGlvbi4gQWRkaW5nLCByZW1vdmluZywgY2xlYXJpbmcsIGFuZA0KLSAqIGdyZWV0aW5nIGFyZSBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZSBjb250cm9sbGVyIChzZWUgc291cmNlIHRhYikuIFRoZXNlIG1ldGhvZHMgY2FuDQotICogZWFzaWx5IGJlIGNhbGxlZCBmcm9tIHRoZSBhbmd1bGFyIG1hcmt1cC4gQW55IGNoYW5nZXMgdG8gdGhlIGRhdGEgYXJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkDQotICogaW4gdGhlIFZpZXcgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBtYW51YWwgdXBkYXRlLg0KLSAqDQotICogVHdvIGRpZmZlcmVudCBkZWNsYXJhdGlvbiBzdHlsZXMgYXJlIGluY2x1ZGVkIGJlbG93Og0KLSAqDQotICogKiBvbmUgYmluZHMgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBkaXJlY3RseSBvbnRvIHRoZSBjb250cm9sbGVyIHVzaW5nIGB0aGlzYDoNCi0gKiBgbmctY29udHJvbGxlcj0iU2V0dGluZ3NDb250cm9sbGVyMSBhcyBzZXR0aW5ncyJgDQotICogKiBvbmUgaW5qZWN0cyBgJHNjb3BlYCBpbnRvIHRoZSBjb250cm9sbGVyOg0KLSAqIGBuZy1jb250cm9sbGVyPSJTZXR0aW5nc0NvbnRyb2xsZXIyImANCi0gKg0KLSAqIFRoZSBzZWNvbmQgb3B0aW9uIGlzIG1vcmUgY29tbW9uIGluIHRoZSBBbmd1bGFyIGNvbW11bml0eSwgYW5kIGlzIGdlbmVyYWxseSB1c2VkIGluIGJvaWxlcnBsYXRlcw0KLSAqIGFuZCBpbiB0aGlzIGd1aWRlLiBIb3dldmVyLCB0aGVyZSBhcmUgYWR2YW50YWdlcyB0byBiaW5kaW5nIHByb3BlcnRpZXMgZGlyZWN0bHkgdG8gdGhlIGNvbnRyb2xsZXINCi0gKiBhbmQgYXZvaWRpbmcgc2NvcGUuDQotICoNCi0gKiAqIFVzaW5nIGBjb250cm9sbGVyIGFzYCBtYWtlcyBpdCBvYnZpb3VzIHdoaWNoIGNvbnRyb2xsZXIgeW91IGFyZSBhY2Nlc3NpbmcgaW4gdGhlIHRlbXBsYXRlIHdoZW4NCi0gKiBtdWx0aXBsZSBjb250cm9sbGVycyBhcHBseSB0byBhbiBlbGVtZW50Lg0KLSAqICogSWYgeW91IGFyZSB3cml0aW5nIHlvdXIgY29udHJvbGxlcnMgYXMgY2xhc3NlcyB5b3UgaGF2ZSBlYXNpZXIgYWNjZXNzIHRvIHRoZSBwcm9wZXJ0aWVzIGFuZA0KLSAqIG1ldGhvZHMsIHdoaWNoIHdpbGwgYXBwZWFyIG9uIHRoZSBzY29wZSwgZnJvbSBpbnNpZGUgdGhlIGNvbnRyb2xsZXIgY29kZS4NCi0gKiAqIFNpbmNlIHRoZXJlIGlzIGFsd2F5cyBhIGAuYCBpbiB0aGUgYmluZGluZ3MsIHlvdSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHByb3RvdHlwYWwNCi0gKiBpbmhlcml0YW5jZSBtYXNraW5nIHByaW1pdGl2ZXMuDQotICoNCi0gKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSBgY29udHJvbGxlciBhc2Agc3ludGF4Lg0KLSAqDQotICogPGV4YW1wbGUgbmFtZT0ibmdDb250cm9sbGVyQXMiIG1vZHVsZT0iY29udHJvbGxlckFzRXhhbXBsZSI+DQotICogICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gKiAgICA8ZGl2IGlkPSJjdHJsLWFzLWV4bXBsIiBuZy1jb250cm9sbGVyPSJTZXR0aW5nc0NvbnRyb2xsZXIxIGFzIHNldHRpbmdzIj4NCi0gKiAgICAgIE5hbWU6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic2V0dGluZ3MubmFtZSIvPg0KLSAqICAgICAgWyA8YSBocmVmPSIiIG5nLWNsaWNrPSJzZXR0aW5ncy5ncmVldCgpIj5ncmVldDwvYT4gXTxici8+DQotICogICAgICBDb250YWN0Og0KLSAqICAgICAgPHVsPg0KLSAqICAgICAgICA8bGkgbmctcmVwZWF0PSJjb250YWN0IGluIHNldHRpbmdzLmNvbnRhY3RzIj4NCi0gKiAgICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPSJjb250YWN0LnR5cGUiPg0KLSAqICAgICAgICAgICAgIDxvcHRpb24+cGhvbmU8L29wdGlvbj4NCi0gKiAgICAgICAgICAgICA8b3B0aW9uPmVtYWlsPC9vcHRpb24+DQotICogICAgICAgICAgPC9zZWxlY3Q+DQotICogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJjb250YWN0LnZhbHVlIi8+DQotICogICAgICAgICAgWyA8YSBocmVmPSIiIG5nLWNsaWNrPSJzZXR0aW5ncy5jbGVhckNvbnRhY3QoY29udGFjdCkiPmNsZWFyPC9hPg0KLSAqICAgICAgICAgIHwgPGEgaHJlZj0iIiBuZy1jbGljaz0ic2V0dGluZ3MucmVtb3ZlQ29udGFjdChjb250YWN0KSI+WDwvYT4gXQ0KLSAqICAgICAgICA8L2xpPg0KLSAqICAgICAgICA8bGk+WyA8YSBocmVmPSIiIG5nLWNsaWNrPSJzZXR0aW5ncy5hZGRDb250YWN0KCkiPmFkZDwvYT4gXTwvbGk+DQotICogICAgIDwvdWw+DQotICogICAgPC9kaXY+DQotICogICA8L2ZpbGU+DQotICogICA8ZmlsZSBuYW1lPSJhcHAuanMiPg0KLSAqICAgIGFuZ3VsYXIubW9kdWxlKCdjb250cm9sbGVyQXNFeGFtcGxlJywgW10pDQotICogICAgICAuY29udHJvbGxlcignU2V0dGluZ3NDb250cm9sbGVyMScsIFNldHRpbmdzQ29udHJvbGxlcjEpOw0KLSAqDQotICogICAgZnVuY3Rpb24gU2V0dGluZ3NDb250cm9sbGVyMSgpIHsNCi0gKiAgICAgIHRoaXMubmFtZSA9ICJKb2huIFNtaXRoIjsNCi0gKiAgICAgIHRoaXMuY29udGFjdHMgPSBbDQotICogICAgICAgIHt0eXBlOiAncGhvbmUnLCB2YWx1ZTogJzQwOCA1NTUgMTIxMid9LA0KLSAqICAgICAgICB7dHlwZTogJ2VtYWlsJywgdmFsdWU6ICdqb2huLnNtaXRoQGV4YW1wbGUub3JnJ30gXTsNCi0gKiAgICB9DQotICoNCi0gKiAgICBTZXR0aW5nc0NvbnRyb2xsZXIxLnByb3RvdHlwZS5ncmVldCA9IGZ1bmN0aW9uKCkgew0KLSAqICAgICAgYWxlcnQodGhpcy5uYW1lKTsNCi0gKiAgICB9Ow0KLSAqDQotICogICAgU2V0dGluZ3NDb250cm9sbGVyMS5wcm90b3R5cGUuYWRkQ29udGFjdCA9IGZ1bmN0aW9uKCkgew0KLSAqICAgICAgdGhpcy5jb250YWN0cy5wdXNoKHt0eXBlOiAnZW1haWwnLCB2YWx1ZTogJ3lvdXJuYW1lQGV4YW1wbGUub3JnJ30pOw0KLSAqICAgIH07DQotICoNCi0gKiAgICBTZXR0aW5nc0NvbnRyb2xsZXIxLnByb3RvdHlwZS5yZW1vdmVDb250YWN0ID0gZnVuY3Rpb24oY29udGFjdFRvUmVtb3ZlKSB7DQotICogICAgIHZhciBpbmRleCA9IHRoaXMuY29udGFjdHMuaW5kZXhPZihjb250YWN0VG9SZW1vdmUpOw0KLSAqICAgICAgdGhpcy5jb250YWN0cy5zcGxpY2UoaW5kZXgsIDEpOw0KLSAqICAgIH07DQotICoNCi0gKiAgICBTZXR0aW5nc0NvbnRyb2xsZXIxLnByb3RvdHlwZS5jbGVhckNvbnRhY3QgPSBmdW5jdGlvbihjb250YWN0KSB7DQotICogICAgICBjb250YWN0LnR5cGUgPSAncGhvbmUnOw0KLSAqICAgICAgY29udGFjdC52YWx1ZSA9ICcnOw0KLSAqICAgIH07DQotICogICA8L2ZpbGU+DQotICogICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gKiAgICAgaXQoJ3Nob3VsZCBjaGVjayBjb250cm9sbGVyIGFzJywgZnVuY3Rpb24oKSB7DQotICogICAgICAgdmFyIGNvbnRhaW5lciA9IGVsZW1lbnQoYnkuaWQoJ2N0cmwtYXMtZXhtcGwnKSk7DQotICogICAgICAgICBleHBlY3QoY29udGFpbmVyLmVsZW1lbnQoYnkubW9kZWwoJ3NldHRpbmdzLm5hbWUnKSkNCi0gKiAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9CZSgnSm9obiBTbWl0aCcpOw0KLSAqDQotICogICAgICAgdmFyIGZpcnN0UmVwZWF0ID0NCi0gKiAgICAgICAgICAgY29udGFpbmVyLmVsZW1lbnQoYnkucmVwZWF0ZXIoJ2NvbnRhY3QgaW4gc2V0dGluZ3MuY29udGFjdHMnKS5yb3coMCkpOw0KLSAqICAgICAgIHZhciBzZWNvbmRSZXBlYXQgPQ0KLSAqICAgICAgICAgICBjb250YWluZXIuZWxlbWVudChieS5yZXBlYXRlcignY29udGFjdCBpbiBzZXR0aW5ncy5jb250YWN0cycpLnJvdygxKSk7DQotICoNCi0gKiAgICAgICBleHBlY3QoZmlyc3RSZXBlYXQuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpDQotICogICAgICAgICAgIC50b0JlKCc0MDggNTU1IDEyMTInKTsNCi0gKg0KLSAqICAgICAgIGV4cGVjdChzZWNvbmRSZXBlYXQuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpDQotICogICAgICAgICAgIC50b0JlKCdqb2huLnNtaXRoQGV4YW1wbGUub3JnJyk7DQotICoNCi0gKiAgICAgICBmaXJzdFJlcGVhdC5lbGVtZW50KGJ5LmxpbmtUZXh0KCdjbGVhcicpKS5jbGljaygpOw0KLSAqDQotICogICAgICAgZXhwZWN0KGZpcnN0UmVwZWF0LmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKQ0KLSAqICAgICAgICAgICAudG9CZSgnJyk7DQotICoNCi0gKiAgICAgICBjb250YWluZXIuZWxlbWVudChieS5saW5rVGV4dCgnYWRkJykpLmNsaWNrKCk7DQotICoNCi0gKiAgICAgICBleHBlY3QoY29udGFpbmVyLmVsZW1lbnQoYnkucmVwZWF0ZXIoJ2NvbnRhY3QgaW4gc2V0dGluZ3MuY29udGFjdHMnKS5yb3coMikpDQotICogICAgICAgICAgIC5lbGVtZW50KGJ5Lm1vZGVsKCdjb250YWN0LnZhbHVlJykpDQotICogICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpDQotICogICAgICAgICAgIC50b0JlKCd5b3VybmFtZUBleGFtcGxlLm9yZycpOw0KLSAqICAgICB9KTsNCi0gKiAgIDwvZmlsZT4NCi0gKiA8L2V4YW1wbGU+DQotICoNCi0gKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSAiYXR0YWNoIHRvIGAkc2NvcGVgIiBzdHlsZSBvZiBjb250cm9sbGVyLg0KLSAqDQotICogPGV4YW1wbGUgbmFtZT0ibmdDb250cm9sbGVyIiBtb2R1bGU9ImNvbnRyb2xsZXJFeGFtcGxlIj4NCi0gKiAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICogICA8ZGl2IGlkPSJjdHJsLWV4bXBsIiBuZy1jb250cm9sbGVyPSJTZXR0aW5nc0NvbnRyb2xsZXIyIj4NCi0gKiAgICAgTmFtZTogPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJuYW1lIi8+DQotICogICAgIFsgPGEgaHJlZj0iIiBuZy1jbGljaz0iZ3JlZXQoKSI+Z3JlZXQ8L2E+IF08YnIvPg0KLSAqICAgICBDb250YWN0Og0KLSAqICAgICA8dWw+DQotICogICAgICAgPGxpIG5nLXJlcGVhdD0iY29udGFjdCBpbiBjb250YWN0cyI+DQotICogICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPSJjb250YWN0LnR5cGUiPg0KLSAqICAgICAgICAgICAgPG9wdGlvbj5waG9uZTwvb3B0aW9uPg0KLSAqICAgICAgICAgICAgPG9wdGlvbj5lbWFpbDwvb3B0aW9uPg0KLSAqICAgICAgICAgPC9zZWxlY3Q+DQotICogICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImNvbnRhY3QudmFsdWUiLz4NCi0gKiAgICAgICAgIFsgPGEgaHJlZj0iIiBuZy1jbGljaz0iY2xlYXJDb250YWN0KGNvbnRhY3QpIj5jbGVhcjwvYT4NCi0gKiAgICAgICAgIHwgPGEgaHJlZj0iIiBuZy1jbGljaz0icmVtb3ZlQ29udGFjdChjb250YWN0KSI+WDwvYT4gXQ0KLSAqICAgICAgIDwvbGk+DQotICogICAgICAgPGxpPlsgPGEgaHJlZj0iIiBuZy1jbGljaz0iYWRkQ29udGFjdCgpIj5hZGQ8L2E+IF08L2xpPg0KLSAqICAgIDwvdWw+DQotICogICA8L2Rpdj4NCi0gKiAgPC9maWxlPg0KLSAqICA8ZmlsZSBuYW1lPSJhcHAuanMiPg0KLSAqICAgYW5ndWxhci5tb2R1bGUoJ2NvbnRyb2xsZXJFeGFtcGxlJywgW10pDQotICogICAgIC5jb250cm9sbGVyKCdTZXR0aW5nc0NvbnRyb2xsZXIyJywgWyckc2NvcGUnLCBTZXR0aW5nc0NvbnRyb2xsZXIyXSk7DQotICoNCi0gKiAgIGZ1bmN0aW9uIFNldHRpbmdzQ29udHJvbGxlcjIoJHNjb3BlKSB7DQotICogICAgICRzY29wZS5uYW1lID0gIkpvaG4gU21pdGgiOw0KLSAqICAgICAkc2NvcGUuY29udGFjdHMgPSBbDQotICogICAgICAge3R5cGU6J3Bob25lJywgdmFsdWU6JzQwOCA1NTUgMTIxMid9LA0KLSAqICAgICAgIHt0eXBlOidlbWFpbCcsIHZhbHVlOidqb2huLnNtaXRoQGV4YW1wbGUub3JnJ30gXTsNCi0gKg0KLSAqICAgICAkc2NvcGUuZ3JlZXQgPSBmdW5jdGlvbigpIHsNCi0gKiAgICAgICBhbGVydCgkc2NvcGUubmFtZSk7DQotICogICAgIH07DQotICoNCi0gKiAgICAgJHNjb3BlLmFkZENvbnRhY3QgPSBmdW5jdGlvbigpIHsNCi0gKiAgICAgICAkc2NvcGUuY29udGFjdHMucHVzaCh7dHlwZTonZW1haWwnLCB2YWx1ZToneW91cm5hbWVAZXhhbXBsZS5vcmcnfSk7DQotICogICAgIH07DQotICoNCi0gKiAgICAgJHNjb3BlLnJlbW92ZUNvbnRhY3QgPSBmdW5jdGlvbihjb250YWN0VG9SZW1vdmUpIHsNCi0gKiAgICAgICB2YXIgaW5kZXggPSAkc2NvcGUuY29udGFjdHMuaW5kZXhPZihjb250YWN0VG9SZW1vdmUpOw0KLSAqICAgICAgICRzY29wZS5jb250YWN0cy5zcGxpY2UoaW5kZXgsIDEpOw0KLSAqICAgICB9Ow0KLSAqDQotICogICAgICRzY29wZS5jbGVhckNvbnRhY3QgPSBmdW5jdGlvbihjb250YWN0KSB7DQotICogICAgICAgY29udGFjdC50eXBlID0gJ3Bob25lJzsNCi0gKiAgICAgICBjb250YWN0LnZhbHVlID0gJyc7DQotICogICAgIH07DQotICogICB9DQotICogIDwvZmlsZT4NCi0gKiAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICogICAgaXQoJ3Nob3VsZCBjaGVjayBjb250cm9sbGVyJywgZnVuY3Rpb24oKSB7DQotICogICAgICB2YXIgY29udGFpbmVyID0gZWxlbWVudChieS5pZCgnY3RybC1leG1wbCcpKTsNCi0gKg0KLSAqICAgICAgZXhwZWN0KGNvbnRhaW5lci5lbGVtZW50KGJ5Lm1vZGVsKCduYW1lJykpDQotICogICAgICAgICAgLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9CZSgnSm9obiBTbWl0aCcpOw0KLSAqDQotICogICAgICB2YXIgZmlyc3RSZXBlYXQgPQ0KLSAqICAgICAgICAgIGNvbnRhaW5lci5lbGVtZW50KGJ5LnJlcGVhdGVyKCdjb250YWN0IGluIGNvbnRhY3RzJykucm93KDApKTsNCi0gKiAgICAgIHZhciBzZWNvbmRSZXBlYXQgPQ0KLSAqICAgICAgICAgIGNvbnRhaW5lci5lbGVtZW50KGJ5LnJlcGVhdGVyKCdjb250YWN0IGluIGNvbnRhY3RzJykucm93KDEpKTsNCi0gKg0KLSAqICAgICAgZXhwZWN0KGZpcnN0UmVwZWF0LmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKQ0KLSAqICAgICAgICAgIC50b0JlKCc0MDggNTU1IDEyMTInKTsNCi0gKiAgICAgIGV4cGVjdChzZWNvbmRSZXBlYXQuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpDQotICogICAgICAgICAgLnRvQmUoJ2pvaG4uc21pdGhAZXhhbXBsZS5vcmcnKTsNCi0gKg0KLSAqICAgICAgZmlyc3RSZXBlYXQuZWxlbWVudChieS5saW5rVGV4dCgnY2xlYXInKSkuY2xpY2soKTsNCi0gKg0KLSAqICAgICAgZXhwZWN0KGZpcnN0UmVwZWF0LmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKQ0KLSAqICAgICAgICAgIC50b0JlKCcnKTsNCi0gKg0KLSAqICAgICAgY29udGFpbmVyLmVsZW1lbnQoYnkubGlua1RleHQoJ2FkZCcpKS5jbGljaygpOw0KLSAqDQotICogICAgICBleHBlY3QoY29udGFpbmVyLmVsZW1lbnQoYnkucmVwZWF0ZXIoJ2NvbnRhY3QgaW4gY29udGFjdHMnKS5yb3coMikpDQotICogICAgICAgICAgLmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSkNCi0gKiAgICAgICAgICAuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKQ0KLSAqICAgICAgICAgIC50b0JlKCd5b3VybmFtZUBleGFtcGxlLm9yZycpOw0KLSAqICAgIH0pOw0KLSAqICA8L2ZpbGU+DQotICo8L2V4YW1wbGU+DQotDQotICovDQotdmFyIG5nQ29udHJvbGxlckRpcmVjdGl2ZSA9IFtmdW5jdGlvbigpIHsNCi0gIHJldHVybiB7DQotICAgIHJlc3RyaWN0OiAnQScsDQotICAgIHNjb3BlOiB0cnVlLA0KLSAgICBjb250cm9sbGVyOiAnQCcsDQotICAgIHByaW9yaXR5OiA1MDANCi0gIH07DQotfV07DQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nQ3NwDQotICoNCi0gKiBAZWxlbWVudCBodG1sDQotICogQGRlc2NyaXB0aW9uDQotICogRW5hYmxlcyBbQ1NQIChDb250ZW50IFNlY3VyaXR5IFBvbGljeSldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL1NlY3VyaXR5L0NTUCkgc3VwcG9ydC4NCi0gKg0KLSAqIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gZGV2ZWxvcGluZyB0aGluZ3MgbGlrZSBHb29nbGUgQ2hyb21lIEV4dGVuc2lvbnMgb3IgVW5pdmVyc2FsIFdpbmRvd3MgQXBwcy4NCi0gKg0KLSAqIENTUCBmb3JiaWRzIGFwcHMgdG8gdXNlIGBldmFsYCBvciBgRnVuY3Rpb24oc3RyaW5nKWAgZ2VuZXJhdGVkIGZ1bmN0aW9ucyAoYW1vbmcgb3RoZXIgdGhpbmdzKS4NCi0gKiBGb3IgQW5ndWxhciB0byBiZSBDU1AgY29tcGF0aWJsZSB0aGVyZSBhcmUgb25seSB0d28gdGhpbmdzIHRoYXQgd2UgbmVlZCB0byBkbyBkaWZmZXJlbnRseToNCi0gKg0KLSAqIC0gZG9uJ3QgdXNlIGBGdW5jdGlvbmAgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgb3B0aW1pemVkIHZhbHVlIGdldHRlcnMNCi0gKiAtIGRvbid0IGluamVjdCBjdXN0b20gc3R5bGVzaGVldCBpbnRvIHRoZSBkb2N1bWVudA0KLSAqDQotICogQW5ndWxhckpTIHVzZXMgYEZ1bmN0aW9uKHN0cmluZylgIGdlbmVyYXRlZCBmdW5jdGlvbnMgYXMgYSBzcGVlZCBvcHRpbWl6YXRpb24uIEFwcGx5aW5nIHRoZSBgbmdDc3BgDQotICogZGlyZWN0aXZlIHdpbGwgY2F1c2UgQW5ndWxhciB0byB1c2UgQ1NQIGNvbXBhdGliaWxpdHkgbW9kZS4gV2hlbiB0aGlzIG1vZGUgaXMgb24gQW5ndWxhckpTIHdpbGwNCi0gKiBldmFsdWF0ZSBhbGwgZXhwcmVzc2lvbnMgdXAgdG8gMzAlIHNsb3dlciB0aGFuIGluIG5vbi1DU1AgbW9kZSwgYnV0IG5vIHNlY3VyaXR5IHZpb2xhdGlvbnMgd2lsbA0KLSAqIGJlIHJhaXNlZC4NCi0gKg0KLSAqIENTUCBmb3JiaWRzIEphdmFTY3JpcHQgdG8gaW5saW5lIHN0eWxlc2hlZXQgcnVsZXMuIEluIG5vbiBDU1AgbW9kZSBBbmd1bGFyIGF1dG9tYXRpY2FsbHkNCi0gKiBpbmNsdWRlcyBzb21lIENTUyBydWxlcyAoZS5nLiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ2xvYWsgbmdDbG9ha30pLg0KLSAqIFRvIG1ha2UgdGhvc2UgZGlyZWN0aXZlcyB3b3JrIGluIENTUCBtb2RlLCBpbmNsdWRlIHRoZSBgYW5ndWxhci1jc3AuY3NzYCBtYW51YWxseS4NCi0gKg0KLSAqIEFuZ3VsYXIgdHJpZXMgdG8gYXV0b2RldGVjdCBpZiBDU1AgaXMgYWN0aXZlIGFuZCBhdXRvbWF0aWNhbGx5IHR1cm4gb24gdGhlIENTUC1zYWZlIG1vZGUuIFRoaXMNCi0gKiBhdXRvZGV0ZWN0aW9uIGhvd2V2ZXIgdHJpZ2dlcnMgYSBDU1AgZXJyb3IgdG8gYmUgbG9nZ2VkIGluIHRoZSBjb25zb2xlOg0KLSAqDQotICogYGBgDQotICogUmVmdXNlZCB0byBldmFsdWF0ZSBhIHN0cmluZyBhcyBKYXZhU2NyaXB0IGJlY2F1c2UgJ3Vuc2FmZS1ldmFsJyBpcyBub3QgYW4gYWxsb3dlZCBzb3VyY2Ugb2YNCi0gKiBzY3JpcHQgaW4gdGhlIGZvbGxvd2luZyBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBkaXJlY3RpdmU6ICJkZWZhdWx0LXNyYyAnc2VsZiciLiBOb3RlIHRoYXQNCi0gKiAnc2NyaXB0LXNyYycgd2FzIG5vdCBleHBsaWNpdGx5IHNldCwgc28gJ2RlZmF1bHQtc3JjJyBpcyB1c2VkIGFzIGEgZmFsbGJhY2suDQotICogYGBgDQotICoNCi0gKiBUaGlzIGVycm9yIGlzIGhhcm1sZXNzIGJ1dCBhbm5veWluZy4gVG8gcHJldmVudCB0aGUgZXJyb3IgZnJvbSBzaG93aW5nIHVwLCBwdXQgdGhlIGBuZ0NzcGANCi0gKiBkaXJlY3RpdmUgb24gdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgYXBwbGljYXRpb24gb3Igb24gdGhlIGBhbmd1bGFyLmpzYCBzY3JpcHQgdGFnLCB3aGljaGV2ZXINCi0gKiBhcHBlYXJzIGZpcnN0IGluIHRoZSBodG1sIGRvY3VtZW50Lg0KLSAqDQotICogKk5vdGU6IFRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBgbmctY3NwYCBhbmQgYGRhdGEtbmctY3NwYCBhdHRyaWJ1dGUgZm9ybS4qDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAqIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gYXBwbHkgdGhlIGBuZ0NzcGAgZGlyZWN0aXZlIHRvIHRoZSBgaHRtbGAgdGFnLg0KLSAgIGBgYGh0bWwNCi0gICAgIDwhZG9jdHlwZSBodG1sPg0KLSAgICAgPGh0bWwgbmctYXBwIG5nLWNzcD4NCi0gICAgIC4uLg0KLSAgICAgLi4uDQotICAgICA8L2h0bWw+DQotICAgYGBgDQotICAqIEBleGFtcGxlDQotICAgICAgLy8gTm90ZTogdGhlIHN1ZmZpeCBgLmNzcGAgaW4gdGhlIGV4YW1wbGUgbmFtZSB0cmlnZ2Vycw0KLSAgICAgIC8vIGNzcCBtb2RlIGluIG91ciBodHRwIHNlcnZlciENCi0gICAgICA8ZXhhbXBsZSBuYW1lPSJleGFtcGxlLmNzcCIgbW9kdWxlPSJjc3BFeGFtcGxlIiBuZy1jc3A9InRydWUiPg0KLSAgICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iTWFpbkNvbnRyb2xsZXIgYXMgY3RybCI+DQotICAgICAgICAgICAgPGRpdj4NCi0gICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9ImN0cmwuaW5jKCkiIGlkPSJpbmMiPkluY3JlbWVudDwvYnV0dG9uPg0KLSAgICAgICAgICAgICAgPHNwYW4gaWQ9ImNvdW50ZXIiPg0KLSAgICAgICAgICAgICAgICB7e2N0cmwuY291bnRlcn19DQotICAgICAgICAgICAgICA8L3NwYW4+DQotICAgICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgICAgPGRpdj4NCi0gICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9ImN0cmwuZXZpbCgpIiBpZD0iZXZpbCI+RXZpbDwvYnV0dG9uPg0KLSAgICAgICAgICAgICAgPHNwYW4gaWQ9ImV2aWxFcnJvciI+DQotICAgICAgICAgICAgICAgIHt7Y3RybC5ldmlsRXJyb3J9fQ0KLSAgICAgICAgICAgICAgPC9zcGFuPg0KLSAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgIDwvZmlsZT4NCi0gICAgICAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+DQotICAgICAgICAgICBhbmd1bGFyLm1vZHVsZSgnY3NwRXhhbXBsZScsIFtdKQ0KLSAgICAgICAgICAgICAuY29udHJvbGxlcignTWFpbkNvbnRyb2xsZXInLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5jb3VudGVyID0gMDsNCi0gICAgICAgICAgICAgICAgdGhpcy5pbmMgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICB0aGlzLmNvdW50ZXIrKzsNCi0gICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgICAgdGhpcy5ldmlsID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgLy8ganNoaW50IGV2aWw6dHJ1ZQ0KLSAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBldmFsKCcxKzInKTsNCi0gICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7DQotICAgICAgICAgICAgICAgICAgICB0aGlzLmV2aWxFcnJvciA9IGUubWVzc2FnZTsNCi0gICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH07DQotICAgICAgICAgICAgICB9KTsNCi0gICAgICAgIDwvZmlsZT4NCi0gICAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICAgICB2YXIgdXRpbCwgd2ViZHJpdmVyOw0KLQ0KLSAgICAgICAgICB2YXIgaW5jQnRuID0gZWxlbWVudChieS5pZCgnaW5jJykpOw0KLSAgICAgICAgICB2YXIgY291bnRlciA9IGVsZW1lbnQoYnkuaWQoJ2NvdW50ZXInKSk7DQotICAgICAgICAgIHZhciBldmlsQnRuID0gZWxlbWVudChieS5pZCgnZXZpbCcpKTsNCi0gICAgICAgICAgdmFyIGV2aWxFcnJvciA9IGVsZW1lbnQoYnkuaWQoJ2V2aWxFcnJvcicpKTsNCi0NCi0gICAgICAgICAgZnVuY3Rpb24gZ2V0QW5kQ2xlYXJTZXZlcmVFcnJvcnMoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIubWFuYWdlKCkubG9ncygpLmdldCgnYnJvd3NlcicpLnRoZW4oZnVuY3Rpb24oYnJvd3NlckxvZykgew0KLSAgICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXJMb2cuZmlsdGVyKGZ1bmN0aW9uKGxvZ0VudHJ5KSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBsb2dFbnRyeS5sZXZlbC52YWx1ZSA+IHdlYmRyaXZlci5sb2dnaW5nLkxldmVsLldBUk5JTkcudmFsdWU7DQotICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICBmdW5jdGlvbiBjbGVhckVycm9ycygpIHsNCi0gICAgICAgICAgICBnZXRBbmRDbGVhclNldmVyZUVycm9ycygpOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIGZ1bmN0aW9uIGV4cGVjdE5vRXJyb3JzKCkgew0KLSAgICAgICAgICAgIGdldEFuZENsZWFyU2V2ZXJlRXJyb3JzKCkudGhlbihmdW5jdGlvbihmaWx0ZXJlZExvZykgew0KLSAgICAgICAgICAgICAgZXhwZWN0KGZpbHRlcmVkTG9nLmxlbmd0aCkudG9FcXVhbCgwKTsNCi0gICAgICAgICAgICAgIGlmIChmaWx0ZXJlZExvZy5sZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Jyb3dzZXIgY29uc29sZSBlcnJvcnM6ICcgKyB1dGlsLmluc3BlY3QoZmlsdGVyZWRMb2cpKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICBmdW5jdGlvbiBleHBlY3RFcnJvcihyZWdleCkgew0KLSAgICAgICAgICAgIGdldEFuZENsZWFyU2V2ZXJlRXJyb3JzKCkudGhlbihmdW5jdGlvbihmaWx0ZXJlZExvZykgew0KLSAgICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7DQotICAgICAgICAgICAgICBmaWx0ZXJlZExvZy5mb3JFYWNoKGZ1bmN0aW9uKGxvZykgew0KLSAgICAgICAgICAgICAgICBpZiAobG9nLm1lc3NhZ2UubWF0Y2gocmVnZXgpKSB7DQotICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICAgIGlmICghZm91bmQpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBhbiBlcnJvciB0aGF0IG1hdGNoZXMgJyArIHJlZ2V4KTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7DQotICAgICAgICAgICAgd2ViZHJpdmVyID0gcmVxdWlyZSgncHJvdHJhY3Rvci9ub2RlX21vZHVsZXMvc2VsZW5pdW0td2ViZHJpdmVyJyk7DQotICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgICAvLyBGb3Igbm93LCB3ZSBvbmx5IHRlc3Qgb24gQ2hyb21lLA0KLSAgICAgICAgICAvLyBhcyBTYWZhcmkgZG9lcyBub3QgbG9hZCB0aGUgcGFnZSB3aXRoIFByb3RyYWN0b3IncyBpbmplY3RlZCBzY3JpcHRzLA0KLSAgICAgICAgICAvLyBhbmQgRmlyZWZveCB3ZWJkcml2ZXIgYWx3YXlzIGRpc2FibGVzIGNvbnRlbnQgc2VjdXJpdHkgcG9saWN5ICgjNjM1OCkNCi0gICAgICAgICAgaWYgKGJyb3dzZXIucGFyYW1zLmJyb3dzZXIgIT09ICdjaHJvbWUnKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIGl0KCdzaG91bGQgbm90IHJlcG9ydCBlcnJvcnMgd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAvLyBjbGVhciBlcnJvcnMgc28gd2UgYXJlIG5vdCBkZXBlbmRlbnQgb24gcHJldmlvdXMgdGVzdHMNCi0gICAgICAgICAgICBjbGVhckVycm9ycygpOw0KLSAgICAgICAgICAgIC8vIE5lZWQgdG8gcmVsb2FkIHRoZSBwYWdlIGFzIHRoZSBwYWdlIGlzIGFscmVhZHkgbG9hZGVkIHdoZW4NCi0gICAgICAgICAgICAvLyB3ZSBjb21lIGhlcmUNCi0gICAgICAgICAgICBicm93c2VyLmRyaXZlci5nZXRDdXJyZW50VXJsKCkudGhlbihmdW5jdGlvbih1cmwpIHsNCi0gICAgICAgICAgICAgIGJyb3dzZXIuZ2V0KHVybCk7DQotICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgZXhwZWN0Tm9FcnJvcnMoKTsNCi0gICAgICAgICAgfSk7DQotDQotICAgICAgICAgIGl0KCdzaG91bGQgZXZhbHVhdGUgZXhwcmVzc2lvbnMnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICBleHBlY3QoY291bnRlci5nZXRUZXh0KCkpLnRvRXF1YWwoJzAnKTsNCi0gICAgICAgICAgICBpbmNCdG4uY2xpY2soKTsNCi0gICAgICAgICAgICBleHBlY3QoY291bnRlci5nZXRUZXh0KCkpLnRvRXF1YWwoJzEnKTsNCi0gICAgICAgICAgICBleHBlY3ROb0Vycm9ycygpOw0KLSAgICAgICAgICB9KTsNCi0NCi0gICAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBhbmQgcmVwb3J0IGFuIGVycm9yIHdoZW4gdXNpbmcgImV2YWwiJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgZXZpbEJ0bi5jbGljaygpOw0KLSAgICAgICAgICAgIGV4cGVjdChldmlsRXJyb3IuZ2V0VGV4dCgpKS50b01hdGNoKC9Db250ZW50IFNlY3VyaXR5IFBvbGljeS8pOw0KLSAgICAgICAgICAgIGV4cGVjdEVycm9yKC9Db250ZW50IFNlY3VyaXR5IFBvbGljeS8pOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIDwvZmlsZT4NCi0gICAgICA8L2V4YW1wbGU+DQotICAqLw0KLQ0KLS8vIG5nQ3NwIGlzIG5vdCBpbXBsZW1lbnRlZCBhcyBhIHByb3BlciBkaXJlY3RpdmUgYW55IG1vcmUsIGJlY2F1c2Ugd2UgbmVlZCBpdCBiZSBwcm9jZXNzZWQgd2hpbGUgd2UNCi0vLyBib290c3RyYXAgdGhlIHN5c3RlbSAoYmVmb3JlICRwYXJzZSBpcyBpbnN0YW50aWF0ZWQpLCBmb3IgdGhpcyByZWFzb24gd2UganVzdCBoYXZlDQotLy8gdGhlIGNzcC5pc0FjdGl2ZSgpIGZuIHRoYXQgbG9va3MgZm9yIG5nLWNzcCBhdHRyaWJ1dGUgYW55d2hlcmUgaW4gdGhlIGN1cnJlbnQgZG9jDQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nQ2xpY2sNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRoZSBuZ0NsaWNrIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW4NCi0gKiBhbiBlbGVtZW50IGlzIGNsaWNrZWQuDQotICoNCi0gKiBAZWxlbWVudCBBTlkNCi0gKiBAcHJpb3JpdHkgMA0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDbGljayB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uDQotICogY2xpY2suICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQ0KLSAqDQotICogQGV4YW1wbGUNCi0gICA8ZXhhbXBsZT4NCi0gICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgIDxidXR0b24gbmctY2xpY2s9ImNvdW50ID0gY291bnQgKyAxIiBuZy1pbml0PSJjb3VudD0wIj4NCi0gICAgICAgIEluY3JlbWVudA0KLSAgICAgIDwvYnV0dG9uPg0KLSAgICAgIDxzcGFuPg0KLSAgICAgICAgY291bnQ6IHt7Y291bnR9fQ0KLSAgICAgIDwvc3Bhbj4NCi0gICAgIDwvZmlsZT4NCi0gICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLWNsaWNrJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnY291bnQnKSkuZ2V0VGV4dCgpKS50b01hdGNoKCcwJyk7DQotICAgICAgICAgZWxlbWVudChieS5jc3MoJ2J1dHRvbicpKS5jbGljaygpOw0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ2NvdW50JykpLmdldFRleHQoKSkudG9NYXRjaCgnMScpOw0KLSAgICAgICB9KTsNCi0gICAgIDwvZmlsZT4NCi0gICA8L2V4YW1wbGU+DQotICovDQotLyoNCi0gKiBBIGNvbGxlY3Rpb24gb2YgZGlyZWN0aXZlcyB0aGF0IGFsbG93cyBjcmVhdGlvbiBvZiBjdXN0b20gZXZlbnQgaGFuZGxlcnMgdGhhdCBhcmUgZGVmaW5lZCBhcw0KLSAqIGFuZ3VsYXIgZXhwcmVzc2lvbnMgYW5kIGFyZSBjb21waWxlZCBhbmQgZXhlY3V0ZWQgd2l0aGluIHRoZSBjdXJyZW50IHNjb3BlLg0KLSAqLw0KLXZhciBuZ0V2ZW50RGlyZWN0aXZlcyA9IHt9Ow0KLQ0KLS8vIEZvciBldmVudHMgdGhhdCBtaWdodCBmaXJlIHN5bmNocm9ub3VzbHkgZHVyaW5nIERPTSBtYW5pcHVsYXRpb24NCi0vLyB3ZSBuZWVkIHRvIGV4ZWN1dGUgdGhlaXIgZXZlbnQgaGFuZGxlcnMgYXN5bmNocm9ub3VzbHkgdXNpbmcgJGV2YWxBc3luYywNCi0vLyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBleGVjdXRlZCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuDQotdmFyIGZvcmNlQXN5bmNFdmVudHMgPSB7DQotICAnYmx1cic6IHRydWUsDQotICAnZm9jdXMnOiB0cnVlDQotfTsNCi1mb3JFYWNoKA0KLSAgJ2NsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZW1vdmUgbW91c2VlbnRlciBtb3VzZWxlYXZlIGtleWRvd24ga2V5dXAga2V5cHJlc3Mgc3VibWl0IGZvY3VzIGJsdXIgY29weSBjdXQgcGFzdGUnLnNwbGl0KCcgJyksDQotICBmdW5jdGlvbihldmVudE5hbWUpIHsNCi0gICAgdmFyIGRpcmVjdGl2ZU5hbWUgPSBkaXJlY3RpdmVOb3JtYWxpemUoJ25nLScgKyBldmVudE5hbWUpOw0KLSAgICBuZ0V2ZW50RGlyZWN0aXZlc1tkaXJlY3RpdmVOYW1lXSA9IFsnJHBhcnNlJywgJyRyb290U2NvcGUnLCBmdW5jdGlvbigkcGFyc2UsICRyb290U2NvcGUpIHsNCi0gICAgICByZXR1cm4gew0KLSAgICAgICAgcmVzdHJpY3Q6ICdBJywNCi0gICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKCRlbGVtZW50LCBhdHRyKSB7DQotICAgICAgICAgIC8vIFdlIGV4cG9zZSB0aGUgcG93ZXJmdWwgJGV2ZW50IG9iamVjdCBvbiB0aGUgc2NvcGUgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFdpbmRvdywNCi0gICAgICAgICAgLy8gZXRjLiB0aGF0IGlzbid0IHByb3RlY3RlZCBieSB0aGUgZmFzdCBwYXRocyBpbiAkcGFyc2UuICBXZSBleHBsaWNpdGx5IHJlcXVlc3QgYmV0dGVyDQotICAgICAgICAgIC8vIGNoZWNrcyBhdCB0aGUgY29zdCBvZiBzcGVlZCBzaW5jZSBldmVudCBoYW5kbGVyIGV4cHJlc3Npb25zIGFyZSBub3QgZXhlY3V0ZWQgYXMNCi0gICAgICAgICAgLy8gZnJlcXVlbnRseSBhcyByZWd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uDQotICAgICAgICAgIHZhciBmbiA9ICRwYXJzZShhdHRyW2RpcmVjdGl2ZU5hbWVdLCAvKiBpbnRlcmNlcHRvckZuICovIG51bGwsIC8qIGV4cGVuc2l2ZUNoZWNrcyAqLyB0cnVlKTsNCi0gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5nRXZlbnRIYW5kbGVyKHNjb3BlLCBlbGVtZW50KSB7DQotICAgICAgICAgICAgZWxlbWVudC5vbihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7DQotICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgZm4oc2NvcGUsIHskZXZlbnQ6ZXZlbnR9KTsNCi0gICAgICAgICAgICAgIH07DQotICAgICAgICAgICAgICBpZiAoZm9yY2VBc3luY0V2ZW50c1tldmVudE5hbWVdICYmICRyb290U2NvcGUuJCRwaGFzZSkgew0KLSAgICAgICAgICAgICAgICBzY29wZS4kZXZhbEFzeW5jKGNhbGxiYWNrKTsNCi0gICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseShjYWxsYmFjayk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICAgIH07DQotICAgICAgICB9DQotICAgICAgfTsNCi0gICAgfV07DQotICB9DQotKTsNCi0NCi0vKioNCi0gKiBAbmdkb2MgZGlyZWN0aXZlDQotICogQG5hbWUgbmdEYmxjbGljaw0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogVGhlIGBuZ0RibGNsaWNrYCBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBhIGRibGNsaWNrIGV2ZW50Lg0KLSAqDQotICogQGVsZW1lbnQgQU5ZDQotICogQHByaW9yaXR5IDANCi0gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nRGJsY2xpY2sge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbg0KLSAqIGEgZGJsY2xpY2suIChUaGUgRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YCkNCi0gKg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGU+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8YnV0dG9uIG5nLWRibGNsaWNrPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+DQotICAgICAgICBJbmNyZW1lbnQgKG9uIGRvdWJsZSBjbGljaykNCi0gICAgICA8L2J1dHRvbj4NCi0gICAgICBjb3VudDoge3tjb3VudH19DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ01vdXNlZG93bg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogVGhlIG5nTW91c2Vkb3duIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIG1vdXNlZG93biBldmVudC4NCi0gKg0KLSAqIEBlbGVtZW50IEFOWQ0KLSAqIEBwcmlvcml0eSAwDQotICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ01vdXNlZG93biB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uDQotICogbW91c2Vkb3duLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSkNCi0gKg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGU+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8YnV0dG9uIG5nLW1vdXNlZG93bj0iY291bnQgPSBjb3VudCArIDEiIG5nLWluaXQ9ImNvdW50PTAiPg0KLSAgICAgICAgSW5jcmVtZW50IChvbiBtb3VzZSBkb3duKQ0KLSAgICAgIDwvYnV0dG9uPg0KLSAgICAgIGNvdW50OiB7e2NvdW50fX0NCi0gICAgIDwvZmlsZT4NCi0gICA8L2V4YW1wbGU+DQotICovDQotDQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nTW91c2V1cA0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gbW91c2V1cCBldmVudC4NCi0gKg0KLSAqIEBlbGVtZW50IEFOWQ0KLSAqIEBwcmlvcml0eSAwDQotICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ01vdXNldXAge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbg0KLSAqIG1vdXNldXAuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQ0KLSAqDQotICogQGV4YW1wbGUNCi0gICA8ZXhhbXBsZT4NCi0gICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgIDxidXR0b24gbmctbW91c2V1cD0iY291bnQgPSBjb3VudCArIDEiIG5nLWluaXQ9ImNvdW50PTAiPg0KLSAgICAgICAgSW5jcmVtZW50IChvbiBtb3VzZSB1cCkNCi0gICAgICA8L2J1dHRvbj4NCi0gICAgICBjb3VudDoge3tjb3VudH19DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ01vdXNlb3Zlcg0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gbW91c2VvdmVyIGV2ZW50Lg0KLSAqDQotICogQGVsZW1lbnQgQU5ZDQotICogQHByaW9yaXR5IDANCi0gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2VvdmVyIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24NCi0gKiBtb3VzZW92ZXIuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQ0KLSAqDQotICogQGV4YW1wbGUNCi0gICA8ZXhhbXBsZT4NCi0gICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgIDxidXR0b24gbmctbW91c2VvdmVyPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+DQotICAgICAgICBJbmNyZW1lbnQgKHdoZW4gbW91c2UgaXMgb3ZlcikNCi0gICAgICA8L2J1dHRvbj4NCi0gICAgICBjb3VudDoge3tjb3VudH19DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ01vdXNlZW50ZXINCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIG1vdXNlZW50ZXIgZXZlbnQuDQotICoNCi0gKiBAZWxlbWVudCBBTlkNCi0gKiBAcHJpb3JpdHkgMA0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdNb3VzZWVudGVyIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24NCi0gKiBtb3VzZWVudGVyLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSkNCi0gKg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGU+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8YnV0dG9uIG5nLW1vdXNlZW50ZXI9ImNvdW50ID0gY291bnQgKyAxIiBuZy1pbml0PSJjb3VudD0wIj4NCi0gICAgICAgIEluY3JlbWVudCAod2hlbiBtb3VzZSBlbnRlcnMpDQotICAgICAgPC9idXR0b24+DQotICAgICAgY291bnQ6IHt7Y291bnR9fQ0KLSAgICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gKi8NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZGlyZWN0aXZlDQotICogQG5hbWUgbmdNb3VzZWxlYXZlDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBtb3VzZWxlYXZlIGV2ZW50Lg0KLSAqDQotICogQGVsZW1lbnQgQU5ZDQotICogQHByaW9yaXR5IDANCi0gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2VsZWF2ZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uDQotICogbW91c2VsZWF2ZS4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgIDxleGFtcGxlPg0KLSAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgPGJ1dHRvbiBuZy1tb3VzZWxlYXZlPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+DQotICAgICAgICBJbmNyZW1lbnQgKHdoZW4gbW91c2UgbGVhdmVzKQ0KLSAgICAgIDwvYnV0dG9uPg0KLSAgICAgIGNvdW50OiB7e2NvdW50fX0NCi0gICAgIDwvZmlsZT4NCi0gICA8L2V4YW1wbGU+DQotICovDQotDQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nTW91c2Vtb3ZlDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBtb3VzZW1vdmUgZXZlbnQuDQotICoNCi0gKiBAZWxlbWVudCBBTlkNCi0gKiBAcHJpb3JpdHkgMA0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdNb3VzZW1vdmUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbg0KLSAqIG1vdXNlbW92ZS4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgIDxleGFtcGxlPg0KLSAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgPGJ1dHRvbiBuZy1tb3VzZW1vdmU9ImNvdW50ID0gY291bnQgKyAxIiBuZy1pbml0PSJjb3VudD0wIj4NCi0gICAgICAgIEluY3JlbWVudCAod2hlbiBtb3VzZSBtb3ZlcykNCi0gICAgICA8L2J1dHRvbj4NCi0gICAgICBjb3VudDoge3tjb3VudH19DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ0tleWRvd24NCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGtleWRvd24gZXZlbnQuDQotICoNCi0gKiBAZWxlbWVudCBBTlkNCi0gKiBAcHJpb3JpdHkgMA0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdLZXlkb3duIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24NCi0gKiBrZXlkb3duLiAoRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YCBhbmQgY2FuIGJlIGludGVycm9nYXRlZCBmb3Iga2V5Q29kZSwgYWx0S2V5LCBldGMuKQ0KLSAqDQotICogQGV4YW1wbGUNCi0gICA8ZXhhbXBsZT4NCi0gICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgIDxpbnB1dCBuZy1rZXlkb3duPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+DQotICAgICAga2V5IGRvd24gY291bnQ6IHt7Y291bnR9fQ0KLSAgICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gKi8NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZGlyZWN0aXZlDQotICogQG5hbWUgbmdLZXl1cA0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24ga2V5dXAgZXZlbnQuDQotICoNCi0gKiBAZWxlbWVudCBBTlkNCi0gKiBAcHJpb3JpdHkgMA0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdLZXl1cCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uDQotICoga2V5dXAuIChFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgIGFuZCBjYW4gYmUgaW50ZXJyb2dhdGVkIGZvciBrZXlDb2RlLCBhbHRLZXksIGV0Yy4pDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgIDxleGFtcGxlPg0KLSAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgIDxwPlR5cGluZyBpbiB0aGUgaW5wdXQgYm94IGJlbG93IHVwZGF0ZXMgdGhlIGtleSBjb3VudDwvcD4NCi0gICAgICAgPGlucHV0IG5nLWtleXVwPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+IGtleSB1cCBjb3VudDoge3tjb3VudH19DQotDQotICAgICAgIDxwPlR5cGluZyBpbiB0aGUgaW5wdXQgYm94IGJlbG93IHVwZGF0ZXMgdGhlIGtleWNvZGU8L3A+DQotICAgICAgIDxpbnB1dCBuZy1rZXl1cD0iZXZlbnQ9JGV2ZW50Ij4NCi0gICAgICAgPHA+ZXZlbnQga2V5Q29kZToge3sgZXZlbnQua2V5Q29kZSB9fTwvcD4NCi0gICAgICAgPHA+ZXZlbnQgYWx0S2V5OiB7eyBldmVudC5hbHRLZXkgfX08L3A+DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ0tleXByZXNzDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBrZXlwcmVzcyBldmVudC4NCi0gKg0KLSAqIEBlbGVtZW50IEFOWQ0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdLZXlwcmVzcyB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uDQotICoga2V5cHJlc3MuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9DQotICogYW5kIGNhbiBiZSBpbnRlcnJvZ2F0ZWQgZm9yIGtleUNvZGUsIGFsdEtleSwgZXRjLikNCi0gKg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGU+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8aW5wdXQgbmcta2V5cHJlc3M9ImNvdW50ID0gY291bnQgKyAxIiBuZy1pbml0PSJjb3VudD0wIj4NCi0gICAgICBrZXkgcHJlc3MgY291bnQ6IHt7Y291bnR9fQ0KLSAgICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gKi8NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZGlyZWN0aXZlDQotICogQG5hbWUgbmdTdWJtaXQNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEVuYWJsZXMgYmluZGluZyBhbmd1bGFyIGV4cHJlc3Npb25zIHRvIG9uc3VibWl0IGV2ZW50cy4NCi0gKg0KLSAqIEFkZGl0aW9uYWxseSBpdCBwcmV2ZW50cyB0aGUgZGVmYXVsdCBhY3Rpb24gKHdoaWNoIGZvciBmb3JtIG1lYW5zIHNlbmRpbmcgdGhlIHJlcXVlc3QgdG8gdGhlDQotICogc2VydmVyIGFuZCByZWxvYWRpbmcgdGhlIGN1cnJlbnQgcGFnZSksIGJ1dCBvbmx5IGlmIHRoZSBmb3JtIGRvZXMgbm90IGNvbnRhaW4gYGFjdGlvbmAsDQotICogYGRhdGEtYWN0aW9uYCwgb3IgYHgtYWN0aW9uYCBhdHRyaWJ1dGVzLg0KLSAqDQotICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+DQotICogKipXYXJuaW5nOioqIEJlIGNhcmVmdWwgbm90IHRvIGNhdXNlICJkb3VibGUtc3VibWlzc2lvbiIgYnkgdXNpbmcgYm90aCB0aGUgYG5nQ2xpY2tgIGFuZA0KLSAqIGBuZ1N1Ym1pdGAgaGFuZGxlcnMgdG9nZXRoZXIuIFNlZSB0aGUNCi0gKiB7QGxpbmsgZm9ybSNzdWJtaXR0aW5nLWEtZm9ybS1hbmQtcHJldmVudGluZy10aGUtZGVmYXVsdC1hY3Rpb24gYGZvcm1gIGRpcmVjdGl2ZSBkb2N1bWVudGF0aW9ufQ0KLSAqIGZvciBhIGRldGFpbGVkIGRpc2N1c3Npb24gb2Ygd2hlbiBgbmdTdWJtaXRgIG1heSBiZSB0cmlnZ2VyZWQuDQotICogPC9kaXY+DQotICoNCi0gKiBAZWxlbWVudCBmb3JtDQotICogQHByaW9yaXR5IDANCi0gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nU3VibWl0IHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWwuDQotICogKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgIDxleGFtcGxlIG1vZHVsZT0ic3VibWl0RXhhbXBsZSI+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8c2NyaXB0Pg0KLSAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3N1Ym1pdEV4YW1wbGUnLCBbXSkNCi0gICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsNCi0gICAgICAgICAgICAkc2NvcGUubGlzdCA9IFtdOw0KLSAgICAgICAgICAgICRzY29wZS50ZXh0ID0gJ2hlbGxvJzsNCi0gICAgICAgICAgICAkc2NvcGUuc3VibWl0ID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICBpZiAoJHNjb3BlLnRleHQpIHsNCi0gICAgICAgICAgICAgICAgJHNjb3BlLmxpc3QucHVzaCh0aGlzLnRleHQpOw0KLSAgICAgICAgICAgICAgICAkc2NvcGUudGV4dCA9ICcnOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH07DQotICAgICAgICAgIH1dKTsNCi0gICAgICA8L3NjcmlwdD4NCi0gICAgICA8Zm9ybSBuZy1zdWJtaXQ9InN1Ym1pdCgpIiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+DQotICAgICAgICBFbnRlciB0ZXh0IGFuZCBoaXQgZW50ZXI6DQotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InRleHQiIG5hbWU9InRleHQiIC8+DQotICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBpZD0ic3VibWl0IiB2YWx1ZT0iU3VibWl0IiAvPg0KLSAgICAgICAgPHByZT5saXN0PXt7bGlzdH19PC9wcmU+DQotICAgICAgPC9mb3JtPg0KLSAgICAgPC9maWxlPg0KLSAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctc3VibWl0JywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbGlzdCcpKS5nZXRUZXh0KCkpLnRvQmUoJ2xpc3Q9W10nKTsNCi0gICAgICAgICBlbGVtZW50KGJ5LmNzcygnI3N1Ym1pdCcpKS5jbGljaygpOw0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ2xpc3QnKSkuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2hlbGxvJyk7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkubW9kZWwoJ3RleHQnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0JlKCcnKTsNCi0gICAgICAgfSk7DQotICAgICAgIGl0KCdzaG91bGQgaWdub3JlIGVtcHR5IHN0cmluZ3MnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdsaXN0JykpLmdldFRleHQoKSkudG9CZSgnbGlzdD1bXScpOw0KLSAgICAgICAgIGVsZW1lbnQoYnkuY3NzKCcjc3VibWl0JykpLmNsaWNrKCk7DQotICAgICAgICAgZWxlbWVudChieS5jc3MoJyNzdWJtaXQnKSkuY2xpY2soKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdsaXN0JykpLmdldFRleHQoKSkudG9Db250YWluKCdoZWxsbycpOw0KLSAgICAgICAgfSk7DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ0ZvY3VzDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBmb2N1cyBldmVudC4NCi0gKg0KLSAqIE5vdGU6IEFzIHRoZSBgZm9jdXNgIGV2ZW50IGlzIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkgd2hlbiBjYWxsaW5nIGBpbnB1dC5mb2N1cygpYA0KLSAqIEFuZ3VsYXJKUyBleGVjdXRlcyB0aGUgZXhwcmVzc2lvbiB1c2luZyBgc2NvcGUuJGV2YWxBc3luY2AgaWYgdGhlIGV2ZW50IGlzIGZpcmVkDQotICogZHVyaW5nIGFuIGAkYXBwbHlgIHRvIGVuc3VyZSBhIGNvbnNpc3RlbnQgc3RhdGUuDQotICoNCi0gKiBAZWxlbWVudCB3aW5kb3csIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBhDQotICogQHByaW9yaXR5IDANCi0gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nRm9jdXMge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbg0KLSAqIGZvY3VzLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSkNCi0gKg0KLSAqIEBleGFtcGxlDQotICogU2VlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDbGljayBuZ0NsaWNrfQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ0JsdXINCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGJsdXIgZXZlbnQuDQotICoNCi0gKiBBIFtibHVyIGV2ZW50XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvYmx1cikgZmlyZXMgd2hlbg0KLSAqIGFuIGVsZW1lbnQgaGFzIGxvc3QgZm9jdXMuDQotICoNCi0gKiBOb3RlOiBBcyB0aGUgYGJsdXJgIGV2ZW50IGlzIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkgYWxzbyBkdXJpbmcgRE9NIG1hbmlwdWxhdGlvbnMNCi0gKiAoZS5nLiByZW1vdmluZyBhIGZvY3Vzc2VkIGlucHV0KSwNCi0gKiBBbmd1bGFySlMgZXhlY3V0ZXMgdGhlIGV4cHJlc3Npb24gdXNpbmcgYHNjb3BlLiRldmFsQXN5bmNgIGlmIHRoZSBldmVudCBpcyBmaXJlZA0KLSAqIGR1cmluZyBhbiBgJGFwcGx5YCB0byBlbnN1cmUgYSBjb25zaXN0ZW50IHN0YXRlLg0KLSAqDQotICogQGVsZW1lbnQgd2luZG93LCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYQ0KLSAqIEBwcmlvcml0eSAwDQotICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0JsdXIge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbg0KLSAqIGJsdXIuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQ0KLSAqDQotICogQGV4YW1wbGUNCi0gKiBTZWUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NsaWNrIG5nQ2xpY2t9DQotICovDQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nQ29weQ0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gY29weSBldmVudC4NCi0gKg0KLSAqIEBlbGVtZW50IHdpbmRvdywgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGENCi0gKiBAcHJpb3JpdHkgMA0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDb3B5IHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24NCi0gKiBjb3B5LiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSkNCi0gKg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGU+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8aW5wdXQgbmctY29weT0iY29waWVkPXRydWUiIG5nLWluaXQ9ImNvcGllZD1mYWxzZTsgdmFsdWU9J2NvcHkgbWUnIiBuZy1tb2RlbD0idmFsdWUiPg0KLSAgICAgIGNvcGllZDoge3tjb3BpZWR9fQ0KLSAgICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gKi8NCi0NCi0vKioNCi0gKiBAbmdkb2MgZGlyZWN0aXZlDQotICogQG5hbWUgbmdDdXQNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGN1dCBldmVudC4NCi0gKg0KLSAqIEBlbGVtZW50IHdpbmRvdywgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGENCi0gKiBAcHJpb3JpdHkgMA0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDdXQge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbg0KLSAqIGN1dC4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgIDxleGFtcGxlPg0KLSAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgPGlucHV0IG5nLWN1dD0iY3V0PXRydWUiIG5nLWluaXQ9ImN1dD1mYWxzZTsgdmFsdWU9J2N1dCBtZSciIG5nLW1vZGVsPSJ2YWx1ZSI+DQotICAgICAgY3V0OiB7e2N1dH19DQotICAgICA8L2ZpbGU+DQotICAgPC9leGFtcGxlPg0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ1Bhc3RlDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBwYXN0ZSBldmVudC4NCi0gKg0KLSAqIEBlbGVtZW50IHdpbmRvdywgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGENCi0gKiBAcHJpb3JpdHkgMA0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdQYXN0ZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uDQotICogcGFzdGUuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQ0KLSAqDQotICogQGV4YW1wbGUNCi0gICA8ZXhhbXBsZT4NCi0gICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgIDxpbnB1dCBuZy1wYXN0ZT0icGFzdGU9dHJ1ZSIgbmctaW5pdD0icGFzdGU9ZmFsc2UiIHBsYWNlaG9sZGVyPSdwYXN0ZSBoZXJlJz4NCi0gICAgICBwYXN0ZWQ6IHt7cGFzdGV9fQ0KLSAgICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gKi8NCi0NCi0vKioNCi0gKiBAbmdkb2MgZGlyZWN0aXZlDQotICogQG5hbWUgbmdJZg0KLSAqIEByZXN0cmljdCBBDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBUaGUgYG5nSWZgIGRpcmVjdGl2ZSByZW1vdmVzIG9yIHJlY3JlYXRlcyBhIHBvcnRpb24gb2YgdGhlIERPTSB0cmVlIGJhc2VkIG9uIGFuDQotICoge2V4cHJlc3Npb259LiBJZiB0aGUgZXhwcmVzc2lvbiBhc3NpZ25lZCB0byBgbmdJZmAgZXZhbHVhdGVzIHRvIGEgZmFsc2UNCi0gKiB2YWx1ZSB0aGVuIHRoZSBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBvdGhlcndpc2UgYSBjbG9uZSBvZiB0aGUNCi0gKiBlbGVtZW50IGlzIHJlaW5zZXJ0ZWQgaW50byB0aGUgRE9NLg0KLSAqDQotICogYG5nSWZgIGRpZmZlcnMgZnJvbSBgbmdTaG93YCBhbmQgYG5nSGlkZWAgaW4gdGhhdCBgbmdJZmAgY29tcGxldGVseSByZW1vdmVzIGFuZCByZWNyZWF0ZXMgdGhlDQotICogZWxlbWVudCBpbiB0aGUgRE9NIHJhdGhlciB0aGFuIGNoYW5naW5nIGl0cyB2aXNpYmlsaXR5IHZpYSB0aGUgYGRpc3BsYXlgIGNzcyBwcm9wZXJ0eS4gIEEgY29tbW9uDQotICogY2FzZSB3aGVuIHRoaXMgZGlmZmVyZW5jZSBpcyBzaWduaWZpY2FudCBpcyB3aGVuIHVzaW5nIGNzcyBzZWxlY3RvcnMgdGhhdCByZWx5IG9uIGFuIGVsZW1lbnQncw0KLSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgRE9NLCBzdWNoIGFzIHRoZSBgOmZpcnN0LWNoaWxkYCBvciBgOmxhc3QtY2hpbGRgIHBzZXVkby1jbGFzc2VzLg0KLSAqDQotICogTm90ZSB0aGF0IHdoZW4gYW4gZWxlbWVudCBpcyByZW1vdmVkIHVzaW5nIGBuZ0lmYCBpdHMgc2NvcGUgaXMgZGVzdHJveWVkIGFuZCBhIG5ldyBzY29wZQ0KLSAqIGlzIGNyZWF0ZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZXN0b3JlZC4gIFRoZSBzY29wZSBjcmVhdGVkIHdpdGhpbiBgbmdJZmAgaW5oZXJpdHMgZnJvbQ0KLSAqIGl0cyBwYXJlbnQgc2NvcGUgdXNpbmcNCi0gKiBbcHJvdG90eXBhbCBpbmhlcml0YW5jZV0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy93aWtpL1VuZGVyc3RhbmRpbmctU2NvcGVzI2phdmFzY3JpcHQtcHJvdG90eXBhbC1pbmhlcml0YW5jZSkuDQotICogQW4gaW1wb3J0YW50IGltcGxpY2F0aW9uIG9mIHRoaXMgaXMgaWYgYG5nTW9kZWxgIGlzIHVzZWQgd2l0aGluIGBuZ0lmYCB0byBiaW5kIHRvDQotICogYSBqYXZhc2NyaXB0IHByaW1pdGl2ZSBkZWZpbmVkIGluIHRoZSBwYXJlbnQgc2NvcGUuIEluIHRoaXMgY2FzZSBhbnkgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZQ0KLSAqIHZhcmlhYmxlIHdpdGhpbiB0aGUgY2hpbGQgc2NvcGUgd2lsbCBvdmVycmlkZSAoaGlkZSkgdGhlIHZhbHVlIGluIHRoZSBwYXJlbnQgc2NvcGUuDQotICoNCi0gKiBBbHNvLCBgbmdJZmAgcmVjcmVhdGVzIGVsZW1lbnRzIHVzaW5nIHRoZWlyIGNvbXBpbGVkIHN0YXRlLiBBbiBleGFtcGxlIG9mIHRoaXMgYmVoYXZpb3INCi0gKiBpcyBpZiBhbiBlbGVtZW50J3MgY2xhc3MgYXR0cmlidXRlIGlzIGRpcmVjdGx5IG1vZGlmaWVkIGFmdGVyIGl0J3MgY29tcGlsZWQsIHVzaW5nIHNvbWV0aGluZyBsaWtlDQotICogalF1ZXJ5J3MgYC5hZGRDbGFzcygpYCBtZXRob2QsIGFuZCB0aGUgZWxlbWVudCBpcyBsYXRlciByZW1vdmVkLiBXaGVuIGBuZ0lmYCByZWNyZWF0ZXMgdGhlIGVsZW1lbnQNCi0gKiB0aGUgYWRkZWQgY2xhc3Mgd2lsbCBiZSBsb3N0IGJlY2F1c2UgdGhlIG9yaWdpbmFsIGNvbXBpbGVkIHN0YXRlIGlzIHVzZWQgdG8gcmVnZW5lcmF0ZSB0aGUgZWxlbWVudC4NCi0gKg0KLSAqIEFkZGl0aW9uYWxseSwgeW91IGNhbiBwcm92aWRlIGFuaW1hdGlvbnMgdmlhIHRoZSBgbmdBbmltYXRlYCBtb2R1bGUgdG8gYW5pbWF0ZSB0aGUgYGVudGVyYA0KLSAqIGFuZCBgbGVhdmVgIGVmZmVjdHMuDQotICoNCi0gKiBAYW5pbWF0aW9ucw0KLSAqIGVudGVyIC0gaGFwcGVucyBqdXN0IGFmdGVyIHRoZSBgbmdJZmAgY29udGVudHMgY2hhbmdlIGFuZCBhIG5ldyBET00gZWxlbWVudCBpcyBjcmVhdGVkIGFuZCBpbmplY3RlZCBpbnRvIHRoZSBgbmdJZmAgY29udGFpbmVyDQotICogbGVhdmUgLSBoYXBwZW5zIGp1c3QgYmVmb3JlIHRoZSBgbmdJZmAgY29udGVudHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NDQotICoNCi0gKiBAZWxlbWVudCBBTlkNCi0gKiBAc2NvcGUNCi0gKiBAcHJpb3JpdHkgNjAwDQotICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0lmIElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyBmYWxzeSB0aGVuDQotICogICAgIHRoZSBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NIHRyZWUuIElmIGl0IGlzIHRydXRoeSBhIGNvcHkgb2YgdGhlIGNvbXBpbGVkDQotICogICAgIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIERPTSB0cmVlLg0KLSAqDQotICogQGV4YW1wbGUNCi0gIDxleGFtcGxlIG1vZHVsZT0ibmdBbmltYXRlIiBkZXBzPSJhbmd1bGFyLWFuaW1hdGUuanMiIGFuaW1hdGlvbnM9InRydWUiPg0KLSAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICBDbGljayBtZTogPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iY2hlY2tlZCIgbmctaW5pdD0iY2hlY2tlZD10cnVlIiAvPjxici8+DQotICAgICAgU2hvdyB3aGVuIGNoZWNrZWQ6DQotICAgICAgPHNwYW4gbmctaWY9ImNoZWNrZWQiIGNsYXNzPSJhbmltYXRlLWlmIj4NCi0gICAgICAgIFRoaXMgaXMgcmVtb3ZlZCB3aGVuIHRoZSBjaGVja2JveCBpcyB1bmNoZWNrZWQuDQotICAgICAgPC9zcGFuPg0KLSAgICA8L2ZpbGU+DQotICAgIDxmaWxlIG5hbWU9ImFuaW1hdGlvbnMuY3NzIj4NCi0gICAgICAuYW5pbWF0ZS1pZiB7DQotICAgICAgICBiYWNrZ3JvdW5kOndoaXRlOw0KLSAgICAgICAgYm9yZGVyOjFweCBzb2xpZCBibGFjazsNCi0gICAgICAgIHBhZGRpbmc6MTBweDsNCi0gICAgICB9DQotDQotICAgICAgLmFuaW1hdGUtaWYubmctZW50ZXIsIC5hbmltYXRlLWlmLm5nLWxlYXZlIHsNCi0gICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzOw0KLSAgICAgICAgdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzOw0KLSAgICAgIH0NCi0NCi0gICAgICAuYW5pbWF0ZS1pZi5uZy1lbnRlciwNCi0gICAgICAuYW5pbWF0ZS1pZi5uZy1sZWF2ZS5uZy1sZWF2ZS1hY3RpdmUgew0KLSAgICAgICAgb3BhY2l0eTowOw0KLSAgICAgIH0NCi0NCi0gICAgICAuYW5pbWF0ZS1pZi5uZy1sZWF2ZSwNCi0gICAgICAuYW5pbWF0ZS1pZi5uZy1lbnRlci5uZy1lbnRlci1hY3RpdmUgew0KLSAgICAgICAgb3BhY2l0eToxOw0KLSAgICAgIH0NCi0gICAgPC9maWxlPg0KLSAgPC9leGFtcGxlPg0KLSAqLw0KLXZhciBuZ0lmRGlyZWN0aXZlID0gWyckYW5pbWF0ZScsIGZ1bmN0aW9uKCRhbmltYXRlKSB7DQotICByZXR1cm4gew0KLSAgICBtdWx0aUVsZW1lbnQ6IHRydWUsDQotICAgIHRyYW5zY2x1ZGU6ICdlbGVtZW50JywNCi0gICAgcHJpb3JpdHk6IDYwMCwNCi0gICAgdGVybWluYWw6IHRydWUsDQotICAgIHJlc3RyaWN0OiAnQScsDQotICAgICQkdGxiOiB0cnVlLA0KLSAgICBsaW5rOiBmdW5jdGlvbigkc2NvcGUsICRlbGVtZW50LCAkYXR0ciwgY3RybCwgJHRyYW5zY2x1ZGUpIHsNCi0gICAgICAgIHZhciBibG9jaywgY2hpbGRTY29wZSwgcHJldmlvdXNFbGVtZW50czsNCi0gICAgICAgICRzY29wZS4kd2F0Y2goJGF0dHIubmdJZiwgZnVuY3Rpb24gbmdJZldhdGNoQWN0aW9uKHZhbHVlKSB7DQotDQotICAgICAgICAgIGlmICh2YWx1ZSkgew0KLSAgICAgICAgICAgIGlmICghY2hpbGRTY29wZSkgew0KLSAgICAgICAgICAgICAgJHRyYW5zY2x1ZGUoZnVuY3Rpb24oY2xvbmUsIG5ld1Njb3BlKSB7DQotICAgICAgICAgICAgICAgIGNoaWxkU2NvcGUgPSBuZXdTY29wZTsNCi0gICAgICAgICAgICAgICAgY2xvbmVbY2xvbmUubGVuZ3RoKytdID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnIGVuZCBuZ0lmOiAnICsgJGF0dHIubmdJZiArICcgJyk7DQotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIG9ubHkgbmVlZCB0aGUgZmlyc3QvbGFzdCBub2RlIG9mIHRoZSBjbG9uZWQgbm9kZXMuDQotICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIG5lZWQgdG8ga2VlcCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBqcWxpdGUgd3JhcHBlciBhcyBpdCBtaWdodCBiZSBjaGFuZ2VkIGxhdGVyDQotICAgICAgICAgICAgICAgIC8vIGJ5IGEgZGlyZWN0aXZlIHdpdGggdGVtcGxhdGVVcmwgd2hlbiBpdHMgdGVtcGxhdGUgYXJyaXZlcy4NCi0gICAgICAgICAgICAgICAgYmxvY2sgPSB7DQotICAgICAgICAgICAgICAgICAgY2xvbmU6IGNsb25lDQotICAgICAgICAgICAgICAgIH07DQotICAgICAgICAgICAgICAgICRhbmltYXRlLmVudGVyKGNsb25lLCAkZWxlbWVudC5wYXJlbnQoKSwgJGVsZW1lbnQpOw0KLSAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnRzKSB7DQotICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRzLnJlbW92ZSgpOw0KLSAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50cyA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChjaGlsZFNjb3BlKSB7DQotICAgICAgICAgICAgICBjaGlsZFNjb3BlLiRkZXN0cm95KCk7DQotICAgICAgICAgICAgICBjaGlsZFNjb3BlID0gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGJsb2NrKSB7DQotICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRzID0gZ2V0QmxvY2tOb2RlcyhibG9jay5jbG9uZSk7DQotICAgICAgICAgICAgICAkYW5pbWF0ZS5sZWF2ZShwcmV2aW91c0VsZW1lbnRzKS50aGVuKGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRzID0gbnVsbDsNCi0gICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgICAgYmxvY2sgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi0gIH07DQotfV07DQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nSW5jbHVkZQ0KLSAqIEByZXN0cmljdCBFQ0ENCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEZldGNoZXMsIGNvbXBpbGVzIGFuZCBpbmNsdWRlcyBhbiBleHRlcm5hbCBIVE1MIGZyYWdtZW50Lg0KLSAqDQotICogQnkgZGVmYXVsdCwgdGhlIHRlbXBsYXRlIFVSTCBpcyByZXN0cmljdGVkIHRvIHRoZSBzYW1lIGRvbWFpbiBhbmQgcHJvdG9jb2wgYXMgdGhlDQotICogYXBwbGljYXRpb24gZG9jdW1lbnQuIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nIHtAbGluayAkc2NlI2dldFRydXN0ZWRSZXNvdXJjZVVybA0KLSAqICRzY2UuZ2V0VHJ1c3RlZFJlc291cmNlVXJsfSBvbiBpdC4gVG8gbG9hZCB0ZW1wbGF0ZXMgZnJvbSBvdGhlciBkb21haW5zIG9yIHByb3RvY29scw0KLSAqIHlvdSBtYXkgZWl0aGVyIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybFdoaXRlbGlzdCB3aGl0ZWxpc3QgdGhlbX0gb3INCi0gKiB7QGxpbmsgJHNjZSN0cnVzdEFzUmVzb3VyY2VVcmwgd3JhcCB0aGVtfSBhcyB0cnVzdGVkIHZhbHVlcy4gUmVmZXIgdG8gQW5ndWxhcidzIHtAbGluaw0KLSAqIG5nLiRzY2UgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmd9Lg0KLSAqDQotICogSW4gYWRkaXRpb24sIHRoZSBicm93c2VyJ3MNCi0gKiBbU2FtZSBPcmlnaW4gUG9saWN5XShodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Jyb3dzZXJzZWMvd2lraS9QYXJ0MiNTYW1lLW9yaWdpbl9wb2xpY3lfZm9yX1hNTEh0dHBSZXF1ZXN0KQ0KLSAqIGFuZCBbQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpXShodHRwOi8vd3d3LnczLm9yZy9UUi9jb3JzLykNCi0gKiBwb2xpY3kgbWF5IGZ1cnRoZXIgcmVzdHJpY3Qgd2hldGhlciB0aGUgdGVtcGxhdGUgaXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZC4NCi0gKiBGb3IgZXhhbXBsZSwgYG5nSW5jbHVkZWAgd29uJ3Qgd29yayBmb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzIG9uIGFsbCBicm93c2VycyBhbmQgZm9yIGBmaWxlOi8vYA0KLSAqIGFjY2VzcyBvbiBzb21lIGJyb3dzZXJzLg0KLSAqDQotICogQGFuaW1hdGlvbnMNCi0gKiBlbnRlciAtIGFuaW1hdGlvbiBpcyB1c2VkIHRvIGJyaW5nIG5ldyBjb250ZW50IGludG8gdGhlIGJyb3dzZXIuDQotICogbGVhdmUgLSBhbmltYXRpb24gaXMgdXNlZCB0byBhbmltYXRlIGV4aXN0aW5nIGNvbnRlbnQgYXdheS4NCi0gKg0KLSAqIFRoZSBlbnRlciBhbmQgbGVhdmUgYW5pbWF0aW9uIG9jY3VyIGNvbmN1cnJlbnRseS4NCi0gKg0KLSAqIEBzY29wZQ0KLSAqIEBwcmlvcml0eSA0MDANCi0gKg0KLSAqIEBwYXJhbSB7c3RyaW5nfSBuZ0luY2x1ZGV8c3JjIGFuZ3VsYXIgZXhwcmVzc2lvbiBldmFsdWF0aW5nIHRvIFVSTC4gSWYgdGhlIHNvdXJjZSBpcyBhIHN0cmluZyBjb25zdGFudCwNCi0gKiAgICAgICAgICAgICAgICAgbWFrZSBzdXJlIHlvdSB3cmFwIGl0IGluICoqc2luZ2xlKiogcXVvdGVzLCBlLmcuIGBzcmM9IidteVBhcnRpYWxUZW1wbGF0ZS5odG1sJyJgLg0KLSAqIEBwYXJhbSB7c3RyaW5nPX0gb25sb2FkIEV4cHJlc3Npb24gdG8gZXZhbHVhdGUgd2hlbiBhIG5ldyBwYXJ0aWFsIGlzIGxvYWRlZC4NCi0gKg0KLSAqIEBwYXJhbSB7c3RyaW5nPX0gYXV0b3Njcm9sbCBXaGV0aGVyIGBuZ0luY2x1ZGVgIHNob3VsZCBjYWxsIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsDQotICogICAgICAgICAgICAgICAgICAkYW5jaG9yU2Nyb2xsfSB0byBzY3JvbGwgdGhlIHZpZXdwb3J0IGFmdGVyIHRoZSBjb250ZW50IGlzIGxvYWRlZC4NCi0gKg0KLSAqICAgICAgICAgICAgICAgICAgLSBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBzZXQsIGRpc2FibGUgc2Nyb2xsaW5nLg0KLSAqICAgICAgICAgICAgICAgICAgLSBJZiB0aGUgYXR0cmlidXRlIGlzIHNldCB3aXRob3V0IHZhbHVlLCBlbmFibGUgc2Nyb2xsaW5nLg0KLSAqICAgICAgICAgICAgICAgICAgLSBPdGhlcndpc2UgZW5hYmxlIHNjcm9sbGluZyBvbmx5IGlmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnV0aHkgdmFsdWUuDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgPGV4YW1wbGUgbW9kdWxlPSJpbmNsdWRlRXhhbXBsZSIgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIj4NCi0gICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgICAgPHNlbGVjdCBuZy1tb2RlbD0idGVtcGxhdGUiIG5nLW9wdGlvbnM9InQubmFtZSBmb3IgdCBpbiB0ZW1wbGF0ZXMiPg0KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj4oYmxhbmspPC9vcHRpb24+DQotICAgICAgIDwvc2VsZWN0Pg0KLSAgICAgICB1cmwgb2YgdGhlIHRlbXBsYXRlOiA8dHQ+e3t0ZW1wbGF0ZS51cmx9fTwvdHQ+DQotICAgICAgIDxoci8+DQotICAgICAgIDxkaXYgY2xhc3M9InNsaWRlLWFuaW1hdGUtY29udGFpbmVyIj4NCi0gICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZS1hbmltYXRlIiBuZy1pbmNsdWRlPSJ0ZW1wbGF0ZS51cmwiPjwvZGl2Pg0KLSAgICAgICA8L2Rpdj4NCi0gICAgIDwvZGl2Pg0KLSAgICA8L2ZpbGU+DQotICAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+DQotICAgICAgYW5ndWxhci5tb2R1bGUoJ2luY2x1ZGVFeGFtcGxlJywgWyduZ0FuaW1hdGUnXSkNCi0gICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgICRzY29wZS50ZW1wbGF0ZXMgPQ0KLSAgICAgICAgICAgIFsgeyBuYW1lOiAndGVtcGxhdGUxLmh0bWwnLCB1cmw6ICd0ZW1wbGF0ZTEuaHRtbCd9LA0KLSAgICAgICAgICAgICAgeyBuYW1lOiAndGVtcGxhdGUyLmh0bWwnLCB1cmw6ICd0ZW1wbGF0ZTIuaHRtbCd9IF07DQotICAgICAgICAgICRzY29wZS50ZW1wbGF0ZSA9ICRzY29wZS50ZW1wbGF0ZXNbMF07DQotICAgICAgICB9XSk7DQotICAgICA8L2ZpbGU+DQotICAgIDxmaWxlIG5hbWU9InRlbXBsYXRlMS5odG1sIj4NCi0gICAgICBDb250ZW50IG9mIHRlbXBsYXRlMS5odG1sDQotICAgIDwvZmlsZT4NCi0gICAgPGZpbGUgbmFtZT0idGVtcGxhdGUyLmh0bWwiPg0KLSAgICAgIENvbnRlbnQgb2YgdGVtcGxhdGUyLmh0bWwNCi0gICAgPC9maWxlPg0KLSAgICA8ZmlsZSBuYW1lPSJhbmltYXRpb25zLmNzcyI+DQotICAgICAgLnNsaWRlLWFuaW1hdGUtY29udGFpbmVyIHsNCi0gICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlOw0KLSAgICAgICAgYmFja2dyb3VuZDp3aGl0ZTsNCi0gICAgICAgIGJvcmRlcjoxcHggc29saWQgYmxhY2s7DQotICAgICAgICBoZWlnaHQ6NDBweDsNCi0gICAgICAgIG92ZXJmbG93OmhpZGRlbjsNCi0gICAgICB9DQotDQotICAgICAgLnNsaWRlLWFuaW1hdGUgew0KLSAgICAgICAgcGFkZGluZzoxMHB4Ow0KLSAgICAgIH0NCi0NCi0gICAgICAuc2xpZGUtYW5pbWF0ZS5uZy1lbnRlciwgLnNsaWRlLWFuaW1hdGUubmctbGVhdmUgew0KLSAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDAuNXM7DQotICAgICAgICB0cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDAuNXM7DQotDQotICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTsNCi0gICAgICAgIHRvcDowOw0KLSAgICAgICAgbGVmdDowOw0KLSAgICAgICAgcmlnaHQ6MDsNCi0gICAgICAgIGJvdHRvbTowOw0KLSAgICAgICAgZGlzcGxheTpibG9jazsNCi0gICAgICAgIHBhZGRpbmc6MTBweDsNCi0gICAgICB9DQotDQotICAgICAgLnNsaWRlLWFuaW1hdGUubmctZW50ZXIgew0KLSAgICAgICAgdG9wOi01MHB4Ow0KLSAgICAgIH0NCi0gICAgICAuc2xpZGUtYW5pbWF0ZS5uZy1lbnRlci5uZy1lbnRlci1hY3RpdmUgew0KLSAgICAgICAgdG9wOjA7DQotICAgICAgfQ0KLQ0KLSAgICAgIC5zbGlkZS1hbmltYXRlLm5nLWxlYXZlIHsNCi0gICAgICAgIHRvcDowOw0KLSAgICAgIH0NCi0gICAgICAuc2xpZGUtYW5pbWF0ZS5uZy1sZWF2ZS5uZy1sZWF2ZS1hY3RpdmUgew0KLSAgICAgICAgdG9wOjUwcHg7DQotICAgICAgfQ0KLSAgICA8L2ZpbGU+DQotICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgIHZhciB0ZW1wbGF0ZVNlbGVjdCA9IGVsZW1lbnQoYnkubW9kZWwoJ3RlbXBsYXRlJykpOw0KLSAgICAgIHZhciBpbmNsdWRlRWxlbSA9IGVsZW1lbnQoYnkuY3NzKCdbbmctaW5jbHVkZV0nKSk7DQotDQotICAgICAgaXQoJ3Nob3VsZCBsb2FkIHRlbXBsYXRlMS5odG1sJywgZnVuY3Rpb24oKSB7DQotICAgICAgICBleHBlY3QoaW5jbHVkZUVsZW0uZ2V0VGV4dCgpKS50b01hdGNoKC9Db250ZW50IG9mIHRlbXBsYXRlMS5odG1sLyk7DQotICAgICAgfSk7DQotDQotICAgICAgaXQoJ3Nob3VsZCBsb2FkIHRlbXBsYXRlMi5odG1sJywgZnVuY3Rpb24oKSB7DQotICAgICAgICBpZiAoYnJvd3Nlci5wYXJhbXMuYnJvd3NlciA9PSAnZmlyZWZveCcpIHsNCi0gICAgICAgICAgLy8gRmlyZWZveCBjYW4ndCBoYW5kbGUgdXNpbmcgc2VsZWN0cw0KLSAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNDgwDQotICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHRlbXBsYXRlU2VsZWN0LmNsaWNrKCk7DQotICAgICAgICB0ZW1wbGF0ZVNlbGVjdC5hbGwoYnkuY3NzKCdvcHRpb24nKSkuZ2V0KDIpLmNsaWNrKCk7DQotICAgICAgICBleHBlY3QoaW5jbHVkZUVsZW0uZ2V0VGV4dCgpKS50b01hdGNoKC9Db250ZW50IG9mIHRlbXBsYXRlMi5odG1sLyk7DQotICAgICAgfSk7DQotDQotICAgICAgaXQoJ3Nob3VsZCBjaGFuZ2UgdG8gYmxhbmsnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgIGlmIChicm93c2VyLnBhcmFtcy5icm93c2VyID09ICdmaXJlZm94Jykgew0KLSAgICAgICAgICAvLyBGaXJlZm94IGNhbid0IGhhbmRsZSB1c2luZyBzZWxlY3RzDQotICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHRlbXBsYXRlU2VsZWN0LmNsaWNrKCk7DQotICAgICAgICB0ZW1wbGF0ZVNlbGVjdC5hbGwoYnkuY3NzKCdvcHRpb24nKSkuZ2V0KDApLmNsaWNrKCk7DQotICAgICAgICBleHBlY3QoaW5jbHVkZUVsZW0uaXNQcmVzZW50KCkpLnRvQmUoZmFsc2UpOw0KLSAgICAgIH0pOw0KLSAgICA8L2ZpbGU+DQotICA8L2V4YW1wbGU+DQotICovDQotDQotDQotLyoqDQotICogQG5nZG9jIGV2ZW50DQotICogQG5hbWUgbmdJbmNsdWRlIyRpbmNsdWRlQ29udGVudFJlcXVlc3RlZA0KLSAqIEBldmVudFR5cGUgZW1pdCBvbiB0aGUgc2NvcGUgbmdJbmNsdWRlIHdhcyBkZWNsYXJlZCBpbg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEVtaXR0ZWQgZXZlcnkgdGltZSB0aGUgbmdJbmNsdWRlIGNvbnRlbnQgaXMgcmVxdWVzdGVkLg0KLSAqDQotICogQHBhcmFtIHtPYmplY3R9IGFuZ3VsYXJFdmVudCBTeW50aGV0aWMgZXZlbnQgb2JqZWN0Lg0KLSAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgVVJMIG9mIGNvbnRlbnQgdG8gbG9hZC4NCi0gKi8NCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZXZlbnQNCi0gKiBAbmFtZSBuZ0luY2x1ZGUjJGluY2x1ZGVDb250ZW50TG9hZGVkDQotICogQGV2ZW50VHlwZSBlbWl0IG9uIHRoZSBjdXJyZW50IG5nSW5jbHVkZSBzY29wZQ0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEVtaXR0ZWQgZXZlcnkgdGltZSB0aGUgbmdJbmNsdWRlIGNvbnRlbnQgaXMgcmVsb2FkZWQuDQotICoNCi0gKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuDQotICogQHBhcmFtIHtTdHJpbmd9IHNyYyBVUkwgb2YgY29udGVudCB0byBsb2FkLg0KLSAqLw0KLQ0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBldmVudA0KLSAqIEBuYW1lIG5nSW5jbHVkZSMkaW5jbHVkZUNvbnRlbnRFcnJvcg0KLSAqIEBldmVudFR5cGUgZW1pdCBvbiB0aGUgc2NvcGUgbmdJbmNsdWRlIHdhcyBkZWNsYXJlZCBpbg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIEVtaXR0ZWQgd2hlbiBhIHRlbXBsYXRlIEhUVFAgcmVxdWVzdCB5aWVsZHMgYW4gZXJyb25vdXMgcmVzcG9uc2UgKHN0YXR1cyA8IDIwMCB8fCBzdGF0dXMgPiAyOTkpDQotICoNCi0gKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuDQotICogQHBhcmFtIHtTdHJpbmd9IHNyYyBVUkwgb2YgY29udGVudCB0byBsb2FkLg0KLSAqLw0KLXZhciBuZ0luY2x1ZGVEaXJlY3RpdmUgPSBbJyR0ZW1wbGF0ZVJlcXVlc3QnLCAnJGFuY2hvclNjcm9sbCcsICckYW5pbWF0ZScsICckc2NlJywNCi0gICAgICAgICAgICAgICAgICBmdW5jdGlvbigkdGVtcGxhdGVSZXF1ZXN0LCAgICRhbmNob3JTY3JvbGwsICAgJGFuaW1hdGUsICAgJHNjZSkgew0KLSAgcmV0dXJuIHsNCi0gICAgcmVzdHJpY3Q6ICdFQ0EnLA0KLSAgICBwcmlvcml0eTogNDAwLA0KLSAgICB0ZXJtaW5hbDogdHJ1ZSwNCi0gICAgdHJhbnNjbHVkZTogJ2VsZW1lbnQnLA0KLSAgICBjb250cm9sbGVyOiBhbmd1bGFyLm5vb3AsDQotICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHsNCi0gICAgICB2YXIgc3JjRXhwID0gYXR0ci5uZ0luY2x1ZGUgfHwgYXR0ci5zcmMsDQotICAgICAgICAgIG9ubG9hZEV4cCA9IGF0dHIub25sb2FkIHx8ICcnLA0KLSAgICAgICAgICBhdXRvU2Nyb2xsRXhwID0gYXR0ci5hdXRvc2Nyb2xsOw0KLQ0KLSAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgJGVsZW1lbnQsICRhdHRyLCBjdHJsLCAkdHJhbnNjbHVkZSkgew0KLSAgICAgICAgdmFyIGNoYW5nZUNvdW50ZXIgPSAwLA0KLSAgICAgICAgICAgIGN1cnJlbnRTY29wZSwNCi0gICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQsDQotICAgICAgICAgICAgY3VycmVudEVsZW1lbnQ7DQotDQotICAgICAgICB2YXIgY2xlYW51cExhc3RJbmNsdWRlQ29udGVudCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50KSB7DQotICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50LnJlbW92ZSgpOw0KLSAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudCA9IG51bGw7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGN1cnJlbnRTY29wZSkgew0KLSAgICAgICAgICAgIGN1cnJlbnRTY29wZS4kZGVzdHJveSgpOw0KLSAgICAgICAgICAgIGN1cnJlbnRTY29wZSA9IG51bGw7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50KSB7DQotICAgICAgICAgICAgJGFuaW1hdGUubGVhdmUoY3VycmVudEVsZW1lbnQpLnRoZW4oZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQgPSBudWxsOw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudCA9IGN1cnJlbnRFbGVtZW50Ow0KLSAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gbnVsbDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0NCi0gICAgICAgIHNjb3BlLiR3YXRjaCgkc2NlLnBhcnNlQXNSZXNvdXJjZVVybChzcmNFeHApLCBmdW5jdGlvbiBuZ0luY2x1ZGVXYXRjaEFjdGlvbihzcmMpIHsNCi0gICAgICAgICAgdmFyIGFmdGVyQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgaWYgKGlzRGVmaW5lZChhdXRvU2Nyb2xsRXhwKSAmJiAoIWF1dG9TY3JvbGxFeHAgfHwgc2NvcGUuJGV2YWwoYXV0b1Njcm9sbEV4cCkpKSB7DQotICAgICAgICAgICAgICAkYW5jaG9yU2Nyb2xsKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9Ow0KLSAgICAgICAgICB2YXIgdGhpc0NoYW5nZUlkID0gKytjaGFuZ2VDb3VudGVyOw0KLQ0KLSAgICAgICAgICBpZiAoc3JjKSB7DQotICAgICAgICAgICAgLy9zZXQgdGhlIDJuZCBwYXJhbSB0byB0cnVlIHRvIGlnbm9yZSB0aGUgdGVtcGxhdGUgcmVxdWVzdCBlcnJvciBzbyB0aGF0IHRoZSBpbm5lcg0KLSAgICAgICAgICAgIC8vY29udGVudHMgYW5kIHNjb3BlIGNhbiBiZSBjbGVhbmVkIHVwLg0KLSAgICAgICAgICAgICR0ZW1wbGF0ZVJlcXVlc3Qoc3JjLCB0cnVlKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQotICAgICAgICAgICAgICBpZiAodGhpc0NoYW5nZUlkICE9PSBjaGFuZ2VDb3VudGVyKSByZXR1cm47DQotICAgICAgICAgICAgICB2YXIgbmV3U2NvcGUgPSBzY29wZS4kbmV3KCk7DQotICAgICAgICAgICAgICBjdHJsLnRlbXBsYXRlID0gcmVzcG9uc2U7DQotDQotICAgICAgICAgICAgICAvLyBOb3RlOiBUaGlzIHdpbGwgYWxzbyBsaW5rIGFsbCBjaGlsZHJlbiBvZiBuZy1pbmNsdWRlIHRoYXQgd2VyZSBjb250YWluZWQgaW4gdGhlIG9yaWdpbmFsDQotICAgICAgICAgICAgICAvLyBodG1sLiBJZiB0aGF0IGNvbnRlbnQgY29udGFpbnMgY29udHJvbGxlcnMsIC4uLiB0aGV5IGNvdWxkIHBvbGx1dGUvY2hhbmdlIHRoZSBzY29wZS4NCi0gICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHVzaW5nIG5nLWluY2x1ZGUgb24gYW4gZWxlbWVudCB3aXRoIGFkZGl0aW9uYWwgY29udGVudCBkb2VzIG5vdCBtYWtlIHNlbnNlLi4uDQotICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBjYW4ndCByZW1vdmUgdGhlbSBpbiB0aGUgY2xvbmVBdHRjaEZuIG9mICR0cmFuc2NsdWRlIGFzIHRoYXQNCi0gICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgbGlua2luZyB0aGUgY29udGVudCwgd2hpY2ggd291bGQgYXBwbHkgY2hpbGQNCi0gICAgICAgICAgICAgIC8vIGRpcmVjdGl2ZXMgdG8gbm9uIGV4aXN0aW5nIGVsZW1lbnRzLg0KLSAgICAgICAgICAgICAgdmFyIGNsb25lID0gJHRyYW5zY2x1ZGUobmV3U2NvcGUsIGZ1bmN0aW9uKGNsb25lKSB7DQotICAgICAgICAgICAgICAgIGNsZWFudXBMYXN0SW5jbHVkZUNvbnRlbnQoKTsNCi0gICAgICAgICAgICAgICAgJGFuaW1hdGUuZW50ZXIoY2xvbmUsIG51bGwsICRlbGVtZW50KS50aGVuKGFmdGVyQW5pbWF0aW9uKTsNCi0gICAgICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgICAgICAgY3VycmVudFNjb3BlID0gbmV3U2NvcGU7DQotICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGNsb25lOw0KLQ0KLSAgICAgICAgICAgICAgY3VycmVudFNjb3BlLiRlbWl0KCckaW5jbHVkZUNvbnRlbnRMb2FkZWQnLCBzcmMpOw0KLSAgICAgICAgICAgICAgc2NvcGUuJGV2YWwob25sb2FkRXhwKTsNCi0gICAgICAgICAgICB9LCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICAgIGlmICh0aGlzQ2hhbmdlSWQgPT09IGNoYW5nZUNvdW50ZXIpIHsNCi0gICAgICAgICAgICAgICAgY2xlYW51cExhc3RJbmNsdWRlQ29udGVudCgpOw0KLSAgICAgICAgICAgICAgICBzY29wZS4kZW1pdCgnJGluY2x1ZGVDb250ZW50RXJyb3InLCBzcmMpOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIHNjb3BlLiRlbWl0KCckaW5jbHVkZUNvbnRlbnRSZXF1ZXN0ZWQnLCBzcmMpOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGNsZWFudXBMYXN0SW5jbHVkZUNvbnRlbnQoKTsNCi0gICAgICAgICAgICBjdHJsLnRlbXBsYXRlID0gbnVsbDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgICAgfTsNCi0gICAgfQ0KLSAgfTsNCi19XTsNCi0NCi0vLyBUaGlzIGRpcmVjdGl2ZSBpcyBjYWxsZWQgZHVyaW5nIHRoZSAkdHJhbnNjbHVkZSBjYWxsIG9mIHRoZSBmaXJzdCBgbmdJbmNsdWRlYCBkaXJlY3RpdmUuDQotLy8gSXQgd2lsbCByZXBsYWNlIGFuZCBjb21waWxlIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50IHdpdGggdGhlIGxvYWRlZCB0ZW1wbGF0ZS4NCi0vLyBXZSBuZWVkIHRoaXMgZGlyZWN0aXZlIHNvIHRoYXQgdGhlIGVsZW1lbnQgY29udGVudCBpcyBhbHJlYWR5IGZpbGxlZCB3aGVuDQotLy8gdGhlIGxpbmsgZnVuY3Rpb24gb2YgYW5vdGhlciBkaXJlY3RpdmUgb24gdGhlIHNhbWUgZWxlbWVudCBhcyBuZ0luY2x1ZGUNCi0vLyBpcyBjYWxsZWQuDQotdmFyIG5nSW5jbHVkZUZpbGxDb250ZW50RGlyZWN0aXZlID0gWyckY29tcGlsZScsDQotICBmdW5jdGlvbigkY29tcGlsZSkgew0KLSAgICByZXR1cm4gew0KLSAgICAgIHJlc3RyaWN0OiAnRUNBJywNCi0gICAgICBwcmlvcml0eTogLTQwMCwNCi0gICAgICByZXF1aXJlOiAnbmdJbmNsdWRlJywNCi0gICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgJGVsZW1lbnQsICRhdHRyLCBjdHJsKSB7DQotICAgICAgICBpZiAoL1NWRy8udGVzdCgkZWxlbWVudFswXS50b1N0cmluZygpKSkgew0KLSAgICAgICAgICAvLyBXZWJLaXQ6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzU2OTggLS0tIFNWRyBlbGVtZW50cyBkbyBub3QNCi0gICAgICAgICAgLy8gc3VwcG9ydCBpbm5lckhUTUwsIHNvIGRldGVjdCB0aGlzIGhlcmUgYW5kIHRyeSB0byBnZW5lcmF0ZSB0aGUgY29udGVudHMNCi0gICAgICAgICAgLy8gc3BlY2lhbGx5Lg0KLSAgICAgICAgICAkZWxlbWVudC5lbXB0eSgpOw0KLSAgICAgICAgICAkY29tcGlsZShqcUxpdGVCdWlsZEZyYWdtZW50KGN0cmwudGVtcGxhdGUsIGRvY3VtZW50KS5jaGlsZE5vZGVzKShzY29wZSwNCi0gICAgICAgICAgICAgIGZ1bmN0aW9uIG5hbWVzcGFjZUFkYXB0ZWRDbG9uZShjbG9uZSkgew0KLSAgICAgICAgICAgICRlbGVtZW50LmFwcGVuZChjbG9uZSk7DQotICAgICAgICAgIH0sIHtmdXR1cmVQYXJlbnRFbGVtZW50OiAkZWxlbWVudH0pOw0KLSAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAkZWxlbWVudC5odG1sKGN0cmwudGVtcGxhdGUpOw0KLSAgICAgICAgJGNvbXBpbGUoJGVsZW1lbnQuY29udGVudHMoKSkoc2NvcGUpOw0KLSAgICAgIH0NCi0gICAgfTsNCi0gIH1dOw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ0luaXQNCi0gKiBAcmVzdHJpY3QgQUMNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRoZSBgbmdJbml0YCBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBldmFsdWF0ZSBhbiBleHByZXNzaW9uIGluIHRoZQ0KLSAqIGN1cnJlbnQgc2NvcGUuDQotICoNCi0gKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1lcnJvciI+DQotICogVGhlIG9ubHkgYXBwcm9wcmlhdGUgdXNlIG9mIGBuZ0luaXRgIGlzIGZvciBhbGlhc2luZyBzcGVjaWFsIHByb3BlcnRpZXMgb2YNCi0gKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nUmVwZWF0IGBuZ1JlcGVhdGB9LCBhcyBzZWVuIGluIHRoZSBkZW1vIGJlbG93LiBCZXNpZGVzIHRoaXMgY2FzZSwgeW91DQotICogc2hvdWxkIHVzZSB7QGxpbmsgZ3VpZGUvY29udHJvbGxlciBjb250cm9sbGVyc30gcmF0aGVyIHRoYW4gYG5nSW5pdGANCi0gKiB0byBpbml0aWFsaXplIHZhbHVlcyBvbiBhIHNjb3BlLg0KLSAqIDwvZGl2Pg0KLSAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPg0KLSAqICoqTm90ZSoqOiBJZiB5b3UgaGF2ZSBhc3NpZ25tZW50IGluIGBuZ0luaXRgIGFsb25nIHdpdGgge0BsaW5rIG5nLiRmaWx0ZXIgYCRmaWx0ZXJgfSwgbWFrZQ0KLSAqIHN1cmUgeW91IGhhdmUgcGFyZW50aGVzaXMgZm9yIGNvcnJlY3QgcHJlY2VkZW5jZToNCi0gKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+DQotICogICA8ZGl2IG5nLWluaXQ9InRlc3QxID0gKGRhdGEgfCBvcmRlckJ5OiduYW1lJykiPjwvZGl2Pg0KLSAqIDwvcHJlPg0KLSAqIDwvZGl2Pg0KLSAqDQotICogQHByaW9yaXR5IDQ1MA0KLSAqDQotICogQGVsZW1lbnQgQU5ZDQotICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0luaXQge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbC4NCi0gKg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGUgbW9kdWxlPSJpbml0RXhhbXBsZSI+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICA8c2NyaXB0Pg0KLSAgICAgYW5ndWxhci5tb2R1bGUoJ2luaXRFeGFtcGxlJywgW10pDQotICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgJHNjb3BlLmxpc3QgPSBbWydhJywgJ2InXSwgWydjJywgJ2QnXV07DQotICAgICAgIH1dKTsNCi0gICA8L3NjcmlwdD4NCi0gICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgIDxkaXYgbmctcmVwZWF0PSJpbm5lckxpc3QgaW4gbGlzdCIgbmctaW5pdD0ib3V0ZXJJbmRleCA9ICRpbmRleCI+DQotICAgICAgIDxkaXYgbmctcmVwZWF0PSJ2YWx1ZSBpbiBpbm5lckxpc3QiIG5nLWluaXQ9ImlubmVySW5kZXggPSAkaW5kZXgiPg0KLSAgICAgICAgICA8c3BhbiBjbGFzcz0iZXhhbXBsZS1pbml0Ij5saXN0WyB7e291dGVySW5kZXh9fSBdWyB7e2lubmVySW5kZXh9fSBdID0ge3t2YWx1ZX19Ozwvc3Bhbj4NCi0gICAgICAgPC9kaXY+DQotICAgICA8L2Rpdj4NCi0gICA8L2Rpdj4NCi0gICAgIDwvZmlsZT4NCi0gICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICBpdCgnc2hvdWxkIGFsaWFzIGluZGV4IHBvc2l0aW9ucycsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgIHZhciBlbGVtZW50cyA9IGVsZW1lbnQuYWxsKGJ5LmNzcygnLmV4YW1wbGUtaW5pdCcpKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudHMuZ2V0KDApLmdldFRleHQoKSkudG9CZSgnbGlzdFsgMCBdWyAwIF0gPSBhOycpOw0KLSAgICAgICAgIGV4cGVjdChlbGVtZW50cy5nZXQoMSkuZ2V0VGV4dCgpKS50b0JlKCdsaXN0WyAwIF1bIDEgXSA9IGI7Jyk7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnRzLmdldCgyKS5nZXRUZXh0KCkpLnRvQmUoJ2xpc3RbIDEgXVsgMCBdID0gYzsnKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudHMuZ2V0KDMpLmdldFRleHQoKSkudG9CZSgnbGlzdFsgMSBdWyAxIF0gPSBkOycpOw0KLSAgICAgICB9KTsNCi0gICAgIDwvZmlsZT4NCi0gICA8L2V4YW1wbGU+DQotICovDQotdmFyIG5nSW5pdERpcmVjdGl2ZSA9IG5nRGlyZWN0aXZlKHsNCi0gIHByaW9yaXR5OiA0NTAsDQotICBjb21waWxlOiBmdW5jdGlvbigpIHsNCi0gICAgcmV0dXJuIHsNCi0gICAgICBwcmU6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykgew0KLSAgICAgICAgc2NvcGUuJGV2YWwoYXR0cnMubmdJbml0KTsNCi0gICAgICB9DQotICAgIH07DQotICB9DQotfSk7DQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nTm9uQmluZGFibGUNCi0gKiBAcmVzdHJpY3QgQUMNCi0gKiBAcHJpb3JpdHkgMTAwMA0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogVGhlIGBuZ05vbkJpbmRhYmxlYCBkaXJlY3RpdmUgdGVsbHMgQW5ndWxhciBub3QgdG8gY29tcGlsZSBvciBiaW5kIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudA0KLSAqIERPTSBlbGVtZW50LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgZWxlbWVudCBjb250YWlucyB3aGF0IGFwcGVhcnMgdG8gYmUgQW5ndWxhciBkaXJlY3RpdmVzIGFuZA0KLSAqIGJpbmRpbmdzIGJ1dCB3aGljaCBzaG91bGQgYmUgaWdub3JlZCBieSBBbmd1bGFyLiBUaGlzIGNvdWxkIGJlIHRoZSBjYXNlIGlmIHlvdSBoYXZlIGEgc2l0ZSB0aGF0DQotICogZGlzcGxheXMgc25pcHBldHMgb2YgY29kZSwgZm9yIGluc3RhbmNlLg0KLSAqDQotICogQGVsZW1lbnQgQU5ZDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAqIEluIHRoaXMgZXhhbXBsZSB0aGVyZSBhcmUgdHdvIGxvY2F0aW9ucyB3aGVyZSBhIHNpbXBsZSBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgKGB7e319YCkgaXMgcHJlc2VudCwNCi0gKiBidXQgdGhlIG9uZSB3cmFwcGVkIGluIGBuZ05vbkJpbmRhYmxlYCBpcyBsZWZ0IGFsb25lLg0KLSAqDQotICogQGV4YW1wbGUNCi0gICAgPGV4YW1wbGU+DQotICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgICA8ZGl2Pk5vcm1hbDoge3sxICsgMn19PC9kaXY+DQotICAgICAgICA8ZGl2IG5nLW5vbi1iaW5kYWJsZT5JZ25vcmVkOiB7ezEgKyAyfX08L2Rpdj4NCi0gICAgICA8L2ZpbGU+DQotICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctbm9uLWJpbmRhYmxlJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnMSArIDInKSkuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzMnKTsNCi0gICAgICAgICBleHBlY3QoZWxlbWVudC5hbGwoYnkuY3NzKCdkaXYnKSkubGFzdCgpLmdldFRleHQoKSkudG9NYXRjaCgvMSBcKyAyLyk7DQotICAgICAgIH0pOw0KLSAgICAgIDwvZmlsZT4NCi0gICAgPC9leGFtcGxlPg0KLSAqLw0KLXZhciBuZ05vbkJpbmRhYmxlRGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoeyB0ZXJtaW5hbDogdHJ1ZSwgcHJpb3JpdHk6IDEwMDAgfSk7DQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nUGx1cmFsaXplDQotICogQHJlc3RyaWN0IEVBDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBgbmdQbHVyYWxpemVgIGlzIGEgZGlyZWN0aXZlIHRoYXQgZGlzcGxheXMgbWVzc2FnZXMgYWNjb3JkaW5nIHRvIGVuLVVTIGxvY2FsaXphdGlvbiBydWxlcy4NCi0gKiBUaGVzZSBydWxlcyBhcmUgYnVuZGxlZCB3aXRoIGFuZ3VsYXIuanMsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbg0KLSAqIChzZWUge0BsaW5rIGd1aWRlL2kxOG4gQW5ndWxhciBpMThufSBkZXYgZ3VpZGUpLiBZb3UgY29uZmlndXJlIG5nUGx1cmFsaXplIGRpcmVjdGl2ZQ0KLSAqIGJ5IHNwZWNpZnlpbmcgdGhlIG1hcHBpbmdzIGJldHdlZW4NCi0gKiBbcGx1cmFsIGNhdGVnb3JpZXNdKGh0dHA6Ly91bmljb2RlLm9yZy9yZXBvcy9jbGRyLXRtcC90cnVuay9kaWZmL3N1cHBsZW1lbnRhbC9sYW5ndWFnZV9wbHVyYWxfcnVsZXMuaHRtbCkNCi0gKiBhbmQgdGhlIHN0cmluZ3MgdG8gYmUgZGlzcGxheWVkLg0KLSAqDQotICogIyBQbHVyYWwgY2F0ZWdvcmllcyBhbmQgZXhwbGljaXQgbnVtYmVyIHJ1bGVzDQotICogVGhlcmUgYXJlIHR3bw0KLSAqIFtwbHVyYWwgY2F0ZWdvcmllc10oaHR0cDovL3VuaWNvZGUub3JnL3JlcG9zL2NsZHItdG1wL3RydW5rL2RpZmYvc3VwcGxlbWVudGFsL2xhbmd1YWdlX3BsdXJhbF9ydWxlcy5odG1sKQ0KLSAqIGluIEFuZ3VsYXIncyBkZWZhdWx0IGVuLVVTIGxvY2FsZTogIm9uZSIgYW5kICJvdGhlciIuDQotICoNCi0gKiBXaGlsZSBhIHBsdXJhbCBjYXRlZ29yeSBtYXkgbWF0Y2ggbWFueSBudW1iZXJzIChmb3IgZXhhbXBsZSwgaW4gZW4tVVMgbG9jYWxlLCAib3RoZXIiIGNhbiBtYXRjaA0KLSAqIGFueSBudW1iZXIgdGhhdCBpcyBub3QgMSksIGFuIGV4cGxpY2l0IG51bWJlciBydWxlIGNhbiBvbmx5IG1hdGNoIG9uZSBudW1iZXIuIEZvciBleGFtcGxlLCB0aGUNCi0gKiBleHBsaWNpdCBudW1iZXIgcnVsZSBmb3IgIjMiIG1hdGNoZXMgdGhlIG51bWJlciAzLiBUaGVyZSBhcmUgZXhhbXBsZXMgb2YgcGx1cmFsIGNhdGVnb3JpZXMNCi0gKiBhbmQgZXhwbGljaXQgbnVtYmVyIHJ1bGVzIHRocm91Z2hvdXQgdGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudGF0aW9uLg0KLSAqDQotICogIyBDb25maWd1cmluZyBuZ1BsdXJhbGl6ZQ0KLSAqIFlvdSBjb25maWd1cmUgbmdQbHVyYWxpemUgYnkgcHJvdmlkaW5nIDIgYXR0cmlidXRlczogYGNvdW50YCBhbmQgYHdoZW5gLg0KLSAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSwgYG9mZnNldGAuDQotICoNCi0gKiBUaGUgdmFsdWUgb2YgdGhlIGBjb3VudGAgYXR0cmlidXRlIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4ge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24NCi0gKiBBbmd1bGFyIGV4cHJlc3Npb259OyB0aGVzZSBhcmUgZXZhbHVhdGVkIG9uIHRoZSBjdXJyZW50IHNjb3BlIGZvciBpdHMgYm91bmQgdmFsdWUuDQotICoNCi0gKiBUaGUgYHdoZW5gIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIG1hcHBpbmdzIGJldHdlZW4gcGx1cmFsIGNhdGVnb3JpZXMgYW5kIHRoZSBhY3R1YWwNCi0gKiBzdHJpbmcgdG8gYmUgZGlzcGxheWVkLiBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgYSBKU09OIG9iamVjdC4NCi0gKg0KLSAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gY29uZmlndXJlIG5nUGx1cmFsaXplOg0KLSAqDQotICogYGBgaHRtbA0KLSAqIDxuZy1wbHVyYWxpemUgY291bnQ9InBlcnNvbkNvdW50Ig0KLSAgICAgICAgICAgICAgICAgd2hlbj0ieycwJzogJ05vYm9keSBpcyB2aWV3aW5nLicsDQotICogICAgICAgICAgICAgICAgICAgICAgJ29uZSc6ICcxIHBlcnNvbiBpcyB2aWV3aW5nLicsDQotICogICAgICAgICAgICAgICAgICAgICAgJ290aGVyJzogJ3t9IHBlb3BsZSBhcmUgdmlld2luZy4nfSI+DQotICogPC9uZy1wbHVyYWxpemU+DQotICpgYGANCi0gKg0KLSAqIEluIHRoZSBleGFtcGxlLCBgIjA6IE5vYm9keSBpcyB2aWV3aW5nLiJgIGlzIGFuIGV4cGxpY2l0IG51bWJlciBydWxlLiBJZiB5b3UgZGlkIG5vdA0KLSAqIHNwZWNpZnkgdGhpcyBydWxlLCAwIHdvdWxkIGJlIG1hdGNoZWQgdG8gdGhlICJvdGhlciIgY2F0ZWdvcnkgYW5kICIwIHBlb3BsZSBhcmUgdmlld2luZyINCi0gKiB3b3VsZCBiZSBzaG93biBpbnN0ZWFkIG9mICJOb2JvZHkgaXMgdmlld2luZyIuIFlvdSBjYW4gc3BlY2lmeSBhbiBleHBsaWNpdCBudW1iZXIgcnVsZSBmb3INCi0gKiBvdGhlciBudW1iZXJzLCBmb3IgZXhhbXBsZSAxMiwgc28gdGhhdCBpbnN0ZWFkIG9mIHNob3dpbmcgIjEyIHBlb3BsZSBhcmUgdmlld2luZyIsIHlvdSBjYW4NCi0gKiBzaG93ICJhIGRvemVuIHBlb3BsZSBhcmUgdmlld2luZyIuDQotICoNCi0gKiBZb3UgY2FuIHVzZSBhIHNldCBvZiBjbG9zZWQgYnJhY2VzIChge31gKSBhcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgbnVtYmVyIHRoYXQgeW91IHdhbnQgc3Vic3RpdHV0ZWQNCi0gKiBpbnRvIHBsdXJhbGl6ZWQgc3RyaW5ncy4gSW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIEFuZ3VsYXIgd2lsbCByZXBsYWNlIGB7fWAgd2l0aA0KLSAqIDxzcGFuIG5nLW5vbi1iaW5kYWJsZT5ge3twZXJzb25Db3VudH19YDwvc3Bhbj4uIFRoZSBjbG9zZWQgYnJhY2VzIGB7fWAgaXMgYSBwbGFjZWhvbGRlcg0KLSAqIGZvciA8c3BhbiBuZy1ub24tYmluZGFibGU+e3tudW1iZXJFeHByZXNzaW9ufX08L3NwYW4+Lg0KLSAqDQotICogIyBDb25maWd1cmluZyBuZ1BsdXJhbGl6ZSB3aXRoIG9mZnNldA0KLSAqIFRoZSBgb2Zmc2V0YCBhdHRyaWJ1dGUgYWxsb3dzIGZ1cnRoZXIgY3VzdG9taXphdGlvbiBvZiBwbHVyYWxpemVkIHRleHQsIHdoaWNoIGNhbiByZXN1bHQgaW4NCi0gKiBhIGJldHRlciB1c2VyIGV4cGVyaWVuY2UuIEZvciBleGFtcGxlLCBpbnN0ZWFkIG9mIHRoZSBtZXNzYWdlICI0IHBlb3BsZSBhcmUgdmlld2luZyB0aGlzIGRvY3VtZW50IiwNCi0gKiB5b3UgbWlnaHQgZGlzcGxheSAiSm9obiwgS2F0ZSBhbmQgMiBvdGhlcnMgYXJlIHZpZXdpbmcgdGhpcyBkb2N1bWVudCIuDQotICogVGhlIG9mZnNldCBhdHRyaWJ1dGUgYWxsb3dzIHlvdSB0byBvZmZzZXQgYSBudW1iZXIgYnkgYW55IGRlc2lyZWQgdmFsdWUuDQotICogTGV0J3MgdGFrZSBhIGxvb2sgYXQgYW4gZXhhbXBsZToNCi0gKg0KLSAqIGBgYGh0bWwNCi0gKiA8bmctcGx1cmFsaXplIGNvdW50PSJwZXJzb25Db3VudCIgb2Zmc2V0PTINCi0gKiAgICAgICAgICAgICAgIHdoZW49InsnMCc6ICdOb2JvZHkgaXMgdmlld2luZy4nLA0KLSAqICAgICAgICAgICAgICAgICAgICAgICcxJzogJ3t7cGVyc29uMX19IGlzIHZpZXdpbmcuJywNCi0gKiAgICAgICAgICAgICAgICAgICAgICAnMic6ICd7e3BlcnNvbjF9fSBhbmQge3twZXJzb24yfX0gYXJlIHZpZXdpbmcuJywNCi0gKiAgICAgICAgICAgICAgICAgICAgICAnb25lJzogJ3t7cGVyc29uMX19LCB7e3BlcnNvbjJ9fSBhbmQgb25lIG90aGVyIHBlcnNvbiBhcmUgdmlld2luZy4nLA0KLSAqICAgICAgICAgICAgICAgICAgICAgICdvdGhlcic6ICd7e3BlcnNvbjF9fSwge3twZXJzb24yfX0gYW5kIHt9IG90aGVyIHBlb3BsZSBhcmUgdmlld2luZy4nfSI+DQotICogPC9uZy1wbHVyYWxpemU+DQotICogYGBgDQotICoNCi0gKiBOb3RpY2UgdGhhdCB3ZSBhcmUgc3RpbGwgdXNpbmcgdHdvIHBsdXJhbCBjYXRlZ29yaWVzKG9uZSwgb3RoZXIpLCBidXQgd2UgYWRkZWQNCi0gKiB0aHJlZSBleHBsaWNpdCBudW1iZXIgcnVsZXMgMCwgMSBhbmQgMi4NCi0gKiBXaGVuIG9uZSBwZXJzb24sIHBlcmhhcHMgSm9obiwgdmlld3MgdGhlIGRvY3VtZW50LCAiSm9obiBpcyB2aWV3aW5nIiB3aWxsIGJlIHNob3duLg0KLSAqIFdoZW4gdGhyZWUgcGVvcGxlIHZpZXcgdGhlIGRvY3VtZW50LCBubyBleHBsaWNpdCBudW1iZXIgcnVsZSBpcyBmb3VuZCwgc28NCi0gKiBhbiBvZmZzZXQgb2YgMiBpcyB0YWtlbiBvZmYgMywgYW5kIEFuZ3VsYXIgdXNlcyAxIHRvIGRlY2lkZSB0aGUgcGx1cmFsIGNhdGVnb3J5Lg0KLSAqIEluIHRoaXMgY2FzZSwgcGx1cmFsIGNhdGVnb3J5ICdvbmUnIGlzIG1hdGNoZWQgYW5kICJKb2huLCBNYXJ5IGFuZCBvbmUgb3RoZXIgcGVyc29uIGFyZSB2aWV3aW5nIg0KLSAqIGlzIHNob3duLg0KLSAqDQotICogTm90ZSB0aGF0IHdoZW4geW91IHNwZWNpZnkgb2Zmc2V0cywgeW91IG11c3QgcHJvdmlkZSBleHBsaWNpdCBudW1iZXIgcnVsZXMgZm9yDQotICogbnVtYmVycyBmcm9tIDAgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgb2Zmc2V0LiBJZiB5b3UgdXNlIGFuIG9mZnNldCBvZiAzLCBmb3IgZXhhbXBsZSwNCi0gKiB5b3UgbXVzdCBwcm92aWRlIGV4cGxpY2l0IG51bWJlciBydWxlcyBmb3IgMCwgMSwgMiBhbmQgMy4gWW91IG11c3QgYWxzbyBwcm92aWRlIHBsdXJhbCBzdHJpbmdzIGZvcg0KLSAqIHBsdXJhbCBjYXRlZ29yaWVzICJvbmUiIGFuZCAib3RoZXIiLg0KLSAqDQotICogQHBhcmFtIHtzdHJpbmd8ZXhwcmVzc2lvbn0gY291bnQgVGhlIHZhcmlhYmxlIHRvIGJlIGJvdW5kIHRvLg0KLSAqIEBwYXJhbSB7c3RyaW5nfSB3aGVuIFRoZSBtYXBwaW5nIGJldHdlZW4gcGx1cmFsIGNhdGVnb3J5IHRvIGl0cyBjb3JyZXNwb25kaW5nIHN0cmluZ3MuDQotICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXQgT2Zmc2V0IHRvIGRlZHVjdCBmcm9tIHRoZSB0b3RhbCBudW1iZXIuDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgICA8ZXhhbXBsZSBtb2R1bGU9InBsdXJhbGl6ZUV4YW1wbGUiPg0KLSAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICAgPHNjcmlwdD4NCi0gICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3BsdXJhbGl6ZUV4YW1wbGUnLCBbXSkNCi0gICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAgICAgJHNjb3BlLnBlcnNvbjEgPSAnSWdvcic7DQotICAgICAgICAgICAgICAkc2NvcGUucGVyc29uMiA9ICdNaXNrbyc7DQotICAgICAgICAgICAgICAkc2NvcGUucGVyc29uQ291bnQgPSAxOw0KLSAgICAgICAgICAgIH1dKTsNCi0gICAgICAgIDwvc2NyaXB0Pg0KLSAgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+DQotICAgICAgICAgIFBlcnNvbiAxOjxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0icGVyc29uMSIgdmFsdWU9Iklnb3IiIC8+PGJyLz4NCi0gICAgICAgICAgUGVyc29uIDI6PGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJwZXJzb24yIiB2YWx1ZT0iTWlza28iIC8+PGJyLz4NCi0gICAgICAgICAgTnVtYmVyIG9mIFBlb3BsZTo8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InBlcnNvbkNvdW50IiB2YWx1ZT0iMSIgLz48YnIvPg0KLQ0KLSAgICAgICAgICA8IS0tLSBFeGFtcGxlIHdpdGggc2ltcGxlIHBsdXJhbGl6YXRpb24gcnVsZXMgZm9yIGVuIGxvY2FsZSAtLS0+DQotICAgICAgICAgIFdpdGhvdXQgT2Zmc2V0Og0KLSAgICAgICAgICA8bmctcGx1cmFsaXplIGNvdW50PSJwZXJzb25Db3VudCINCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGVuPSJ7JzAnOiAnTm9ib2R5IGlzIHZpZXdpbmcuJywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uZSc6ICcxIHBlcnNvbiBpcyB2aWV3aW5nLicsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvdGhlcic6ICd7fSBwZW9wbGUgYXJlIHZpZXdpbmcuJ30iPg0KLSAgICAgICAgICA8L25nLXBsdXJhbGl6ZT48YnI+DQotDQotICAgICAgICAgIDwhLS0tIEV4YW1wbGUgd2l0aCBvZmZzZXQgLS0tPg0KLSAgICAgICAgICBXaXRoIE9mZnNldCgyKToNCi0gICAgICAgICAgPG5nLXBsdXJhbGl6ZSBjb3VudD0icGVyc29uQ291bnQiIG9mZnNldD0yDQotICAgICAgICAgICAgICAgICAgICAgICAgd2hlbj0ieycwJzogJ05vYm9keSBpcyB2aWV3aW5nLicsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxJzogJ3t7cGVyc29uMX19IGlzIHZpZXdpbmcuJywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzInOiAne3twZXJzb24xfX0gYW5kIHt7cGVyc29uMn19IGFyZSB2aWV3aW5nLicsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmUnOiAne3twZXJzb24xfX0sIHt7cGVyc29uMn19IGFuZCBvbmUgb3RoZXIgcGVyc29uIGFyZSB2aWV3aW5nLicsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvdGhlcic6ICd7e3BlcnNvbjF9fSwge3twZXJzb24yfX0gYW5kIHt9IG90aGVyIHBlb3BsZSBhcmUgdmlld2luZy4nfSI+DQotICAgICAgICAgIDwvbmctcGx1cmFsaXplPg0KLSAgICAgICAgPC9kaXY+DQotICAgICAgPC9maWxlPg0KLSAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICAgaXQoJ3Nob3VsZCBzaG93IGNvcnJlY3QgcGx1cmFsaXplZCBzdHJpbmcnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgdmFyIHdpdGhvdXRPZmZzZXQgPSBlbGVtZW50LmFsbChieS5jc3MoJ25nLXBsdXJhbGl6ZScpKS5nZXQoMCk7DQotICAgICAgICAgIHZhciB3aXRoT2Zmc2V0ID0gZWxlbWVudC5hbGwoYnkuY3NzKCduZy1wbHVyYWxpemUnKSkuZ2V0KDEpOw0KLSAgICAgICAgICB2YXIgY291bnRJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3BlcnNvbkNvdW50JykpOw0KLQ0KLSAgICAgICAgICBleHBlY3Qod2l0aG91dE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJzEgcGVyc29uIGlzIHZpZXdpbmcuJyk7DQotICAgICAgICAgIGV4cGVjdCh3aXRoT2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnSWdvciBpcyB2aWV3aW5nLicpOw0KLQ0KLSAgICAgICAgICBjb3VudElucHV0LmNsZWFyKCk7DQotICAgICAgICAgIGNvdW50SW5wdXQuc2VuZEtleXMoJzAnKTsNCi0NCi0gICAgICAgICAgZXhwZWN0KHdpdGhvdXRPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdOb2JvZHkgaXMgdmlld2luZy4nKTsNCi0gICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdOb2JvZHkgaXMgdmlld2luZy4nKTsNCi0NCi0gICAgICAgICAgY291bnRJbnB1dC5jbGVhcigpOw0KLSAgICAgICAgICBjb3VudElucHV0LnNlbmRLZXlzKCcyJyk7DQotDQotICAgICAgICAgIGV4cGVjdCh3aXRob3V0T2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnMiBwZW9wbGUgYXJlIHZpZXdpbmcuJyk7DQotICAgICAgICAgIGV4cGVjdCh3aXRoT2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnSWdvciBhbmQgTWlza28gYXJlIHZpZXdpbmcuJyk7DQotDQotICAgICAgICAgIGNvdW50SW5wdXQuY2xlYXIoKTsNCi0gICAgICAgICAgY291bnRJbnB1dC5zZW5kS2V5cygnMycpOw0KLQ0KLSAgICAgICAgICBleHBlY3Qod2l0aG91dE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJzMgcGVvcGxlIGFyZSB2aWV3aW5nLicpOw0KLSAgICAgICAgICBleHBlY3Qod2l0aE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJ0lnb3IsIE1pc2tvIGFuZCBvbmUgb3RoZXIgcGVyc29uIGFyZSB2aWV3aW5nLicpOw0KLQ0KLSAgICAgICAgICBjb3VudElucHV0LmNsZWFyKCk7DQotICAgICAgICAgIGNvdW50SW5wdXQuc2VuZEtleXMoJzQnKTsNCi0NCi0gICAgICAgICAgZXhwZWN0KHdpdGhvdXRPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCc0IHBlb3BsZSBhcmUgdmlld2luZy4nKTsNCi0gICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdJZ29yLCBNaXNrbyBhbmQgMiBvdGhlciBwZW9wbGUgYXJlIHZpZXdpbmcuJyk7DQotICAgICAgICB9KTsNCi0gICAgICAgIGl0KCdzaG91bGQgc2hvdyBkYXRhLWJvdW5kIG5hbWVzJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgIHZhciB3aXRoT2Zmc2V0ID0gZWxlbWVudC5hbGwoYnkuY3NzKCduZy1wbHVyYWxpemUnKSkuZ2V0KDEpOw0KLSAgICAgICAgICB2YXIgcGVyc29uQ291bnQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdwZXJzb25Db3VudCcpKTsNCi0gICAgICAgICAgdmFyIHBlcnNvbjEgPSBlbGVtZW50KGJ5Lm1vZGVsKCdwZXJzb24xJykpOw0KLSAgICAgICAgICB2YXIgcGVyc29uMiA9IGVsZW1lbnQoYnkubW9kZWwoJ3BlcnNvbjInKSk7DQotICAgICAgICAgIHBlcnNvbkNvdW50LmNsZWFyKCk7DQotICAgICAgICAgIHBlcnNvbkNvdW50LnNlbmRLZXlzKCc0Jyk7DQotICAgICAgICAgIHBlcnNvbjEuY2xlYXIoKTsNCi0gICAgICAgICAgcGVyc29uMS5zZW5kS2V5cygnRGknKTsNCi0gICAgICAgICAgcGVyc29uMi5jbGVhcigpOw0KLSAgICAgICAgICBwZXJzb24yLnNlbmRLZXlzKCdWb2p0YScpOw0KLSAgICAgICAgICBleHBlY3Qod2l0aE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJ0RpLCBWb2p0YSBhbmQgMiBvdGhlciBwZW9wbGUgYXJlIHZpZXdpbmcuJyk7DQotICAgICAgICB9KTsNCi0gICAgICA8L2ZpbGU+DQotICAgIDwvZXhhbXBsZT4NCi0gKi8NCi12YXIgbmdQbHVyYWxpemVEaXJlY3RpdmUgPSBbJyRsb2NhbGUnLCAnJGludGVycG9sYXRlJywgZnVuY3Rpb24oJGxvY2FsZSwgJGludGVycG9sYXRlKSB7DQotICB2YXIgQlJBQ0UgPSAve30vZywNCi0gICAgICBJU19XSEVOID0gL153aGVuKE1pbnVzKT8oLispJC87DQotDQotICByZXR1cm4gew0KLSAgICByZXN0cmljdDogJ0VBJywNCi0gICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsNCi0gICAgICB2YXIgbnVtYmVyRXhwID0gYXR0ci5jb3VudCwNCi0gICAgICAgICAgd2hlbkV4cCA9IGF0dHIuJGF0dHIud2hlbiAmJiBlbGVtZW50LmF0dHIoYXR0ci4kYXR0ci53aGVuKSwgLy8gd2UgaGF2ZSB7e319IGluIGF0dHJzDQotICAgICAgICAgIG9mZnNldCA9IGF0dHIub2Zmc2V0IHx8IDAsDQotICAgICAgICAgIHdoZW5zID0gc2NvcGUuJGV2YWwod2hlbkV4cCkgfHwge30sDQotICAgICAgICAgIHdoZW5zRXhwRm5zID0ge30sDQotICAgICAgICAgIHN0YXJ0U3ltYm9sID0gJGludGVycG9sYXRlLnN0YXJ0U3ltYm9sKCksDQotICAgICAgICAgIGVuZFN5bWJvbCA9ICRpbnRlcnBvbGF0ZS5lbmRTeW1ib2woKSwNCi0gICAgICAgICAgYnJhY2VSZXBsYWNlbWVudCA9IHN0YXJ0U3ltYm9sICsgbnVtYmVyRXhwICsgJy0nICsgb2Zmc2V0ICsgZW5kU3ltYm9sLA0KLSAgICAgICAgICB3YXRjaFJlbW92ZXIgPSBhbmd1bGFyLm5vb3AsDQotICAgICAgICAgIGxhc3RDb3VudDsNCi0NCi0gICAgICBmb3JFYWNoKGF0dHIsIGZ1bmN0aW9uKGV4cHJlc3Npb24sIGF0dHJpYnV0ZU5hbWUpIHsNCi0gICAgICAgIHZhciB0bXBNYXRjaCA9IElTX1dIRU4uZXhlYyhhdHRyaWJ1dGVOYW1lKTsNCi0gICAgICAgIGlmICh0bXBNYXRjaCkgew0KLSAgICAgICAgICB2YXIgd2hlbktleSA9ICh0bXBNYXRjaFsxXSA/ICctJyA6ICcnKSArIGxvd2VyY2FzZSh0bXBNYXRjaFsyXSk7DQotICAgICAgICAgIHdoZW5zW3doZW5LZXldID0gZWxlbWVudC5hdHRyKGF0dHIuJGF0dHJbYXR0cmlidXRlTmFtZV0pOw0KLSAgICAgICAgfQ0KLSAgICAgIH0pOw0KLSAgICAgIGZvckVhY2god2hlbnMsIGZ1bmN0aW9uKGV4cHJlc3Npb24sIGtleSkgew0KLSAgICAgICAgd2hlbnNFeHBGbnNba2V5XSA9ICRpbnRlcnBvbGF0ZShleHByZXNzaW9uLnJlcGxhY2UoQlJBQ0UsIGJyYWNlUmVwbGFjZW1lbnQpKTsNCi0NCi0gICAgICB9KTsNCi0NCi0gICAgICBzY29wZS4kd2F0Y2gobnVtYmVyRXhwLCBmdW5jdGlvbiBuZ1BsdXJhbGl6ZVdhdGNoQWN0aW9uKG5ld1ZhbCkgew0KLSAgICAgICAgdmFyIGNvdW50ID0gcGFyc2VGbG9hdChuZXdWYWwpOw0KLSAgICAgICAgdmFyIGNvdW50SXNOYU4gPSBpc05hTihjb3VudCk7DQotDQotICAgICAgICBpZiAoIWNvdW50SXNOYU4gJiYgIShjb3VudCBpbiB3aGVucykpIHsNCi0gICAgICAgICAgLy8gSWYgYW4gZXhwbGljaXQgbnVtYmVyIHJ1bGUgc3VjaCBhcyAxLCAyLCAzLi4uIGlzIGRlZmluZWQsIGp1c3QgdXNlIGl0Lg0KLSAgICAgICAgICAvLyBPdGhlcndpc2UsIGNoZWNrIGl0IGFnYWluc3QgcGx1cmFsaXphdGlvbiBydWxlcyBpbiAkbG9jYWxlIHNlcnZpY2UuDQotICAgICAgICAgIGNvdW50ID0gJGxvY2FsZS5wbHVyYWxDYXQoY291bnQgLSBvZmZzZXQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gSWYgYm90aCBgY291bnRgIGFuZCBgbGFzdENvdW50YCBhcmUgTmFOLCB3ZSBkb24ndCBuZWVkIHRvIHJlLXJlZ2lzdGVyIGEgd2F0Y2guDQotICAgICAgICAvLyBJbiBKUyBgTmFOICE9PSBOYU5gLCBzbyB3ZSBoYXZlIHRvIGV4bGljaXRseSBjaGVjay4NCi0gICAgICAgIGlmICgoY291bnQgIT09IGxhc3RDb3VudCkgJiYgIShjb3VudElzTmFOICYmIGlzTmFOKGxhc3RDb3VudCkpKSB7DQotICAgICAgICAgIHdhdGNoUmVtb3ZlcigpOw0KLSAgICAgICAgICB3YXRjaFJlbW92ZXIgPSBzY29wZS4kd2F0Y2god2hlbnNFeHBGbnNbY291bnRdLCB1cGRhdGVFbGVtZW50VGV4dCk7DQotICAgICAgICAgIGxhc3RDb3VudCA9IGNvdW50Ow0KLSAgICAgICAgfQ0KLSAgICAgIH0pOw0KLQ0KLSAgICAgIGZ1bmN0aW9uIHVwZGF0ZUVsZW1lbnRUZXh0KG5ld1RleHQpIHsNCi0gICAgICAgIGVsZW1lbnQudGV4dChuZXdUZXh0IHx8ICcnKTsNCi0gICAgICB9DQotICAgIH0NCi0gIH07DQotfV07DQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nUmVwZWF0DQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBUaGUgYG5nUmVwZWF0YCBkaXJlY3RpdmUgaW5zdGFudGlhdGVzIGEgdGVtcGxhdGUgb25jZSBwZXIgaXRlbSBmcm9tIGEgY29sbGVjdGlvbi4gRWFjaCB0ZW1wbGF0ZQ0KLSAqIGluc3RhbmNlIGdldHMgaXRzIG93biBzY29wZSwgd2hlcmUgdGhlIGdpdmVuIGxvb3AgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gaXRlbSwNCi0gKiBhbmQgYCRpbmRleGAgaXMgc2V0IHRvIHRoZSBpdGVtIGluZGV4IG9yIGtleS4NCi0gKg0KLSAqIFNwZWNpYWwgcHJvcGVydGllcyBhcmUgZXhwb3NlZCBvbiB0aGUgbG9jYWwgc2NvcGUgb2YgZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZSwgaW5jbHVkaW5nOg0KLSAqDQotICogfCBWYXJpYWJsZSAgfCBUeXBlICAgICAgICAgICAgfCBEZXRhaWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAqIHwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCi0gKiB8IGAkaW5kZXhgICB8IHtAdHlwZSBudW1iZXJ9ICB8IGl0ZXJhdG9yIG9mZnNldCBvZiB0aGUgcmVwZWF0ZWQgZWxlbWVudCAoMC4ubGVuZ3RoLTEpICAgICAgICAgICAgICAgICAgICAgICB8DQotICogfCBgJGZpcnN0YCAgfCB7QHR5cGUgYm9vbGVhbn0gfCB0cnVlIGlmIHRoZSByZXBlYXRlZCBlbGVtZW50IGlzIGZpcnN0IGluIHRoZSBpdGVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgfA0KLSAqIHwgYCRtaWRkbGVgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgcmVwZWF0ZWQgZWxlbWVudCBpcyBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBpbiB0aGUgaXRlcmF0b3IuIHwNCi0gKiB8IGAkbGFzdGAgICB8IHtAdHlwZSBib29sZWFufSB8IHRydWUgaWYgdGhlIHJlcGVhdGVkIGVsZW1lbnQgaXMgbGFzdCBpbiB0aGUgaXRlcmF0b3IuICAgICAgICAgICAgICAgICAgICAgICB8DQotICogfCBgJGV2ZW5gICAgfCB7QHR5cGUgYm9vbGVhbn0gfCB0cnVlIGlmIHRoZSBpdGVyYXRvciBwb3NpdGlvbiBgJGluZGV4YCBpcyBldmVuIChvdGhlcndpc2UgZmFsc2UpLiAgICAgICAgICAgfA0KLSAqIHwgYCRvZGRgICAgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgaXRlcmF0b3IgcG9zaXRpb24gYCRpbmRleGAgaXMgb2RkIChvdGhlcndpc2UgZmFsc2UpLiAgICAgICAgICAgIHwNCi0gKg0KLSAqIENyZWF0aW5nIGFsaWFzZXMgZm9yIHRoZXNlIHByb3BlcnRpZXMgaXMgcG9zc2libGUgd2l0aCB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nSW5pdCBgbmdJbml0YH0uDQotICogVGhpcyBtYXkgYmUgdXNlZnVsIHdoZW4sIGZvciBpbnN0YW5jZSwgbmVzdGluZyBuZ1JlcGVhdHMuDQotICoNCi0gKiAjIFNwZWNpYWwgcmVwZWF0IHN0YXJ0IGFuZCBlbmQgcG9pbnRzDQotICogVG8gcmVwZWF0IGEgc2VyaWVzIG9mIGVsZW1lbnRzIGluc3RlYWQgb2YganVzdCBvbmUgcGFyZW50IGVsZW1lbnQsIG5nUmVwZWF0IChhcyB3ZWxsIGFzIG90aGVyIG5nIGRpcmVjdGl2ZXMpIHN1cHBvcnRzIGV4dGVuZGluZw0KLSAqIHRoZSByYW5nZSBvZiB0aGUgcmVwZWF0ZXIgYnkgZGVmaW5pbmcgZXhwbGljaXQgc3RhcnQgYW5kIGVuZCBwb2ludHMgYnkgdXNpbmcgKipuZy1yZXBlYXQtc3RhcnQqKiBhbmQgKipuZy1yZXBlYXQtZW5kKiogcmVzcGVjdGl2ZWx5Lg0KLSAqIFRoZSAqKm5nLXJlcGVhdC1zdGFydCoqIGRpcmVjdGl2ZSB3b3JrcyB0aGUgc2FtZSBhcyAqKm5nLXJlcGVhdCoqLCBidXQgd2lsbCByZXBlYXQgYWxsIHRoZSBIVE1MIGNvZGUgKGluY2x1ZGluZyB0aGUgdGFnIGl0J3MgZGVmaW5lZCBvbikNCi0gKiB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBlbmRpbmcgSFRNTCB0YWcgd2hlcmUgKipuZy1yZXBlYXQtZW5kKiogaXMgcGxhY2VkLg0KLSAqDQotICogVGhlIGV4YW1wbGUgYmVsb3cgbWFrZXMgdXNlIG9mIHRoaXMgZmVhdHVyZToNCi0gKiBgYGBodG1sDQotICogICA8aGVhZGVyIG5nLXJlcGVhdC1zdGFydD0iaXRlbSBpbiBpdGVtcyI+DQotICogICAgIEhlYWRlciB7eyBpdGVtIH19DQotICogICA8L2hlYWRlcj4NCi0gKiAgIDxkaXYgY2xhc3M9ImJvZHkiPg0KLSAqICAgICBCb2R5IHt7IGl0ZW0gfX0NCi0gKiAgIDwvZGl2Pg0KLSAqICAgPGZvb3RlciBuZy1yZXBlYXQtZW5kPg0KLSAqICAgICBGb290ZXIge3sgaXRlbSB9fQ0KLSAqICAgPC9mb290ZXI+DQotICogYGBgDQotICoNCi0gKiBBbmQgd2l0aCBhbiBpbnB1dCBvZiB7QHR5cGUgWydBJywnQiddfSBmb3IgdGhlIGl0ZW1zIHZhcmlhYmxlIGluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgb3V0cHV0IHdpbGwgZXZhbHVhdGUgdG86DQotICogYGBgaHRtbA0KLSAqICAgPGhlYWRlcj4NCi0gKiAgICAgSGVhZGVyIEENCi0gKiAgIDwvaGVhZGVyPg0KLSAqICAgPGRpdiBjbGFzcz0iYm9keSI+DQotICogICAgIEJvZHkgQQ0KLSAqICAgPC9kaXY+DQotICogICA8Zm9vdGVyPg0KLSAqICAgICBGb290ZXIgQQ0KLSAqICAgPC9mb290ZXI+DQotICogICA8aGVhZGVyPg0KLSAqICAgICBIZWFkZXIgQg0KLSAqICAgPC9oZWFkZXI+DQotICogICA8ZGl2IGNsYXNzPSJib2R5Ij4NCi0gKiAgICAgQm9keSBCDQotICogICA8L2Rpdj4NCi0gKiAgIDxmb290ZXI+DQotICogICAgIEZvb3RlciBCDQotICogICA8L2Zvb3Rlcj4NCi0gKiBgYGANCi0gKg0KLSAqIFRoZSBjdXN0b20gc3RhcnQgYW5kIGVuZCBwb2ludHMgZm9yIG5nUmVwZWF0IGFsc28gc3VwcG9ydCBhbGwgb3RoZXIgSFRNTCBkaXJlY3RpdmUgc3ludGF4IGZsYXZvcnMgcHJvdmlkZWQgaW4gQW5ndWxhckpTIChzdWNoDQotICogYXMgKipkYXRhLW5nLXJlcGVhdC1zdGFydCoqLCAqKngtbmctcmVwZWF0LXN0YXJ0KiogYW5kICoqbmc6cmVwZWF0LXN0YXJ0KiopLg0KLSAqDQotICogQGFuaW1hdGlvbnMNCi0gKiAqKi5lbnRlcioqIC0gd2hlbiBhIG5ldyBpdGVtIGlzIGFkZGVkIHRvIHRoZSBsaXN0IG9yIHdoZW4gYW4gaXRlbSBpcyByZXZlYWxlZCBhZnRlciBhIGZpbHRlcg0KLSAqDQotICogKioubGVhdmUqKiAtIHdoZW4gYW4gaXRlbSBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb3Igd2hlbiBhbiBpdGVtIGlzIGZpbHRlcmVkIG91dA0KLSAqDQotICogKioubW92ZSoqIC0gd2hlbiBhbiBhZGphY2VudCBpdGVtIGlzIGZpbHRlcmVkIG91dCBjYXVzaW5nIGEgcmVvcmRlciBvciB3aGVuIHRoZSBpdGVtIGNvbnRlbnRzIGFyZSByZW9yZGVyZWQNCi0gKg0KLSAqIEBlbGVtZW50IEFOWQ0KLSAqIEBzY29wZQ0KLSAqIEBwcmlvcml0eSAxMDAwDQotICogQHBhcmFtIHtyZXBlYXRfZXhwcmVzc2lvbn0gbmdSZXBlYXQgVGhlIGV4cHJlc3Npb24gaW5kaWNhdGluZyBob3cgdG8gZW51bWVyYXRlIGEgY29sbGVjdGlvbi4gVGhlc2UNCi0gKiAgIGZvcm1hdHMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6DQotICoNCi0gKiAgICogYHZhcmlhYmxlIGluIGV4cHJlc3Npb25gIOKAPyB3aGVyZSB2YXJpYWJsZSBpcyB0aGUgdXNlciBkZWZpbmVkIGxvb3AgdmFyaWFibGUgYW5kIGBleHByZXNzaW9uYA0KLSAqICAgICBpcyBhIHNjb3BlIGV4cHJlc3Npb24gZ2l2aW5nIHRoZSBjb2xsZWN0aW9uIHRvIGVudW1lcmF0ZS4NCi0gKg0KLSAqICAgICBGb3IgZXhhbXBsZTogYGFsYnVtIGluIGFydGlzdC5hbGJ1bXNgLg0KLSAqDQotICogICAqIGAoa2V5LCB2YWx1ZSkgaW4gZXhwcmVzc2lvbmAg4oA/IHdoZXJlIGBrZXlgIGFuZCBgdmFsdWVgIGNhbiBiZSBhbnkgdXNlciBkZWZpbmVkIGlkZW50aWZpZXJzLA0KLSAqICAgICBhbmQgYGV4cHJlc3Npb25gIGlzIHRoZSBzY29wZSBleHByZXNzaW9uIGdpdmluZyB0aGUgY29sbGVjdGlvbiB0byBlbnVtZXJhdGUuDQotICoNCi0gKiAgICAgRm9yIGV4YW1wbGU6IGAobmFtZSwgYWdlKSBpbiB7J2FkYW0nOjEwLCAnYW1hbGllJzoxMn1gLg0KLSAqDQotICogICAqIGB2YXJpYWJsZSBpbiBleHByZXNzaW9uIHRyYWNrIGJ5IHRyYWNraW5nX2V4cHJlc3Npb25gIOKAPyBZb3UgY2FuIGFsc28gcHJvdmlkZSBhbiBvcHRpb25hbCB0cmFja2luZyBmdW5jdGlvbg0KLSAqICAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBhc3NvY2lhdGUgdGhlIG9iamVjdHMgaW4gdGhlIGNvbGxlY3Rpb24gd2l0aCB0aGUgRE9NIGVsZW1lbnRzLiBJZiBubyB0cmFja2luZyBmdW5jdGlvbg0KLSAqICAgICBpcyBzcGVjaWZpZWQgdGhlIG5nLXJlcGVhdCBhc3NvY2lhdGVzIGVsZW1lbnRzIGJ5IGlkZW50aXR5IGluIHRoZSBjb2xsZWN0aW9uLiBJdCBpcyBhbiBlcnJvciB0byBoYXZlDQotICogICAgIG1vcmUgdGhhbiBvbmUgdHJhY2tpbmcgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0byB0aGUgc2FtZSBrZXkuIChUaGlzIHdvdWxkIG1lYW4gdGhhdCB0d28gZGlzdGluY3Qgb2JqZWN0cyBhcmUNCi0gKiAgICAgbWFwcGVkIHRvIHRoZSBzYW1lIERPTSBlbGVtZW50LCB3aGljaCBpcyBub3QgcG9zc2libGUuKSAgRmlsdGVycyBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgZXhwcmVzc2lvbiwNCi0gKiAgICAgYmVmb3JlIHNwZWNpZnlpbmcgYSB0cmFja2luZyBleHByZXNzaW9uLg0KLSAqDQotICogICAgIEZvciBleGFtcGxlOiBgaXRlbSBpbiBpdGVtc2AgaXMgZXF1aXZhbGVudCB0byBgaXRlbSBpbiBpdGVtcyB0cmFjayBieSAkaWQoaXRlbSlgLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgRE9NIGVsZW1lbnRzDQotICogICAgIHdpbGwgYmUgYXNzb2NpYXRlZCBieSBpdGVtIGlkZW50aXR5IGluIHRoZSBhcnJheS4NCi0gKg0KLSAqICAgICBGb3IgZXhhbXBsZTogYGl0ZW0gaW4gaXRlbXMgdHJhY2sgYnkgJGlkKGl0ZW0pYC4gQSBidWlsdCBpbiBgJGlkKClgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFzc2lnbiBhIHVuaXF1ZQ0KLSAqICAgICBgJCRoYXNoS2V5YCBwcm9wZXJ0eSB0byBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiBUaGlzIHByb3BlcnR5IGlzIHRoZW4gdXNlZCBhcyBhIGtleSB0byBhc3NvY2lhdGVkIERPTSBlbGVtZW50cw0KLSAqICAgICB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0gaW4gdGhlIGFycmF5IGJ5IGlkZW50aXR5LiBNb3ZpbmcgdGhlIHNhbWUgb2JqZWN0IGluIGFycmF5IHdvdWxkIG1vdmUgdGhlIERPTQ0KLSAqICAgICBlbGVtZW50IGluIHRoZSBzYW1lIHdheSBpbiB0aGUgRE9NLg0KLSAqDQotICogICAgIEZvciBleGFtcGxlOiBgaXRlbSBpbiBpdGVtcyB0cmFjayBieSBpdGVtLmlkYCBpcyBhIHR5cGljYWwgcGF0dGVybiB3aGVuIHRoZSBpdGVtcyBjb21lIGZyb20gdGhlIGRhdGFiYXNlLiBJbiB0aGlzDQotICogICAgIGNhc2UgdGhlIG9iamVjdCBpZGVudGl0eSBkb2VzIG5vdCBtYXR0ZXIuIFR3byBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgYXMgbG9uZyBhcyB0aGVpciBgaWRgDQotICogICAgIHByb3BlcnR5IGlzIHNhbWUuDQotICoNCi0gKiAgICAgRm9yIGV4YW1wbGU6IGBpdGVtIGluIGl0ZW1zIHwgZmlsdGVyOnNlYXJjaFRleHQgdHJhY2sgYnkgaXRlbS5pZGAgaXMgYSBwYXR0ZXJuIHRoYXQgbWlnaHQgYmUgdXNlZCB0byBhcHBseSBhIGZpbHRlcg0KLSAqICAgICB0byBpdGVtcyBpbiBjb25qdW5jdGlvbiB3aXRoIGEgdHJhY2tpbmcgZXhwcmVzc2lvbi4NCi0gKg0KLSAqICAgKiBgdmFyaWFibGUgaW4gZXhwcmVzc2lvbiBhcyBhbGlhc19leHByZXNzaW9uYCDigD8gWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gb3B0aW9uYWwgYWxpYXMgZXhwcmVzc2lvbiB3aGljaCB3aWxsIHRoZW4gc3RvcmUgdGhlDQotICogICAgIGludGVybWVkaWF0ZSByZXN1bHRzIG9mIHRoZSByZXBlYXRlciBhZnRlciB0aGUgZmlsdGVycyBoYXZlIGJlZW4gYXBwbGllZC4gVHlwaWNhbGx5IHRoaXMgaXMgdXNlZCB0byByZW5kZXIgYSBzcGVjaWFsIG1lc3NhZ2UNCi0gKiAgICAgd2hlbiBhIGZpbHRlciBpcyBhY3RpdmUgb24gdGhlIHJlcGVhdGVyLCBidXQgdGhlIGZpbHRlcmVkIHJlc3VsdCBzZXQgaXMgZW1wdHkuDQotICoNCi0gKiAgICAgRm9yIGV4YW1wbGU6IGBpdGVtIGluIGl0ZW1zIHwgZmlsdGVyOnggYXMgcmVzdWx0c2Agd2lsbCBzdG9yZSB0aGUgZnJhZ21lbnQgb2YgdGhlIHJlcGVhdGVkIGl0ZW1zIGFzIGByZXN1bHRzYCwgYnV0IG9ubHkgYWZ0ZXINCi0gKiAgICAgdGhlIGl0ZW1zIGhhdmUgYmVlbiBwcm9jZXNzZWQgdGhyb3VnaCB0aGUgZmlsdGVyLg0KLSAqDQotICogQGV4YW1wbGUNCi0gKiBUaGlzIGV4YW1wbGUgaW5pdGlhbGl6ZXMgdGhlIHNjb3BlIHRvIGEgbGlzdCBvZiBuYW1lcyBhbmQNCi0gKiB0aGVuIHVzZXMgYG5nUmVwZWF0YCB0byBkaXNwbGF5IGV2ZXJ5IHBlcnNvbjoNCi0gIDxleGFtcGxlIG1vZHVsZT0ibmdBbmltYXRlIiBkZXBzPSJhbmd1bGFyLWFuaW1hdGUuanMiIGFuaW1hdGlvbnM9InRydWUiPg0KLSAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8ZGl2IG5nLWluaXQ9ImZyaWVuZHMgPSBbDQotICAgICAgICB7bmFtZTonSm9obicsIGFnZToyNSwgZ2VuZGVyOidib3knfSwNCi0gICAgICAgIHtuYW1lOidKZXNzaWUnLCBhZ2U6MzAsIGdlbmRlcjonZ2lybCd9LA0KLSAgICAgICAge25hbWU6J0pvaGFubmEnLCBhZ2U6MjgsIGdlbmRlcjonZ2lybCd9LA0KLSAgICAgICAge25hbWU6J0pveScsIGFnZToxNSwgZ2VuZGVyOidnaXJsJ30sDQotICAgICAgICB7bmFtZTonTWFyeScsIGFnZToyOCwgZ2VuZGVyOidnaXJsJ30sDQotICAgICAgICB7bmFtZTonUGV0ZXInLCBhZ2U6OTUsIGdlbmRlcjonYm95J30sDQotICAgICAgICB7bmFtZTonU2ViYXN0aWFuJywgYWdlOjUwLCBnZW5kZXI6J2JveSd9LA0KLSAgICAgICAge25hbWU6J0VyaWthJywgYWdlOjI3LCBnZW5kZXI6J2dpcmwnfSwNCi0gICAgICAgIHtuYW1lOidQYXRyaWNrJywgYWdlOjQwLCBnZW5kZXI6J2JveSd9LA0KLSAgICAgICAge25hbWU6J1NhbWFudGhhJywgYWdlOjYwLCBnZW5kZXI6J2dpcmwnfQ0KLSAgICAgIF0iPg0KLSAgICAgICAgSSBoYXZlIHt7ZnJpZW5kcy5sZW5ndGh9fSBmcmllbmRzLiBUaGV5IGFyZToNCi0gICAgICAgIDxpbnB1dCB0eXBlPSJzZWFyY2giIG5nLW1vZGVsPSJxIiBwbGFjZWhvbGRlcj0iZmlsdGVyIGZyaWVuZHMuLi4iIC8+DQotICAgICAgICA8dWwgY2xhc3M9ImV4YW1wbGUtYW5pbWF0ZS1jb250YWluZXIiPg0KLSAgICAgICAgICA8bGkgY2xhc3M9ImFuaW1hdGUtcmVwZWF0IiBuZy1yZXBlYXQ9ImZyaWVuZCBpbiBmcmllbmRzIHwgZmlsdGVyOnEgYXMgcmVzdWx0cyI+DQotICAgICAgICAgICAgW3t7JGluZGV4ICsgMX19XSB7e2ZyaWVuZC5uYW1lfX0gd2hvIGlzIHt7ZnJpZW5kLmFnZX19IHllYXJzIG9sZC4NCi0gICAgICAgICAgPC9saT4NCi0gICAgICAgICAgPGxpIGNsYXNzPSJhbmltYXRlLXJlcGVhdCIgbmctaWY9InJlc3VsdHMubGVuZ3RoID09IDAiPg0KLSAgICAgICAgICAgIDxzdHJvbmc+Tm8gcmVzdWx0cyBmb3VuZC4uLjwvc3Ryb25nPg0KLSAgICAgICAgICA8L2xpPg0KLSAgICAgICAgPC91bD4NCi0gICAgICA8L2Rpdj4NCi0gICAgPC9maWxlPg0KLSAgICA8ZmlsZSBuYW1lPSJhbmltYXRpb25zLmNzcyI+DQotICAgICAgLmV4YW1wbGUtYW5pbWF0ZS1jb250YWluZXIgew0KLSAgICAgICAgYmFja2dyb3VuZDp3aGl0ZTsNCi0gICAgICAgIGJvcmRlcjoxcHggc29saWQgYmxhY2s7DQotICAgICAgICBsaXN0LXN0eWxlOm5vbmU7DQotICAgICAgICBtYXJnaW46MDsNCi0gICAgICAgIHBhZGRpbmc6MCAxMHB4Ow0KLSAgICAgIH0NCi0NCi0gICAgICAuYW5pbWF0ZS1yZXBlYXQgew0KLSAgICAgICAgbGluZS1oZWlnaHQ6NDBweDsNCi0gICAgICAgIGxpc3Qtc3R5bGU6bm9uZTsNCi0gICAgICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDsNCi0gICAgICB9DQotDQotICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLW1vdmUsDQotICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLWVudGVyLA0KLSAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1sZWF2ZSB7DQotICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246YWxsIGxpbmVhciAwLjVzOw0KLSAgICAgICAgdHJhbnNpdGlvbjphbGwgbGluZWFyIDAuNXM7DQotICAgICAgfQ0KLQ0KLSAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1sZWF2ZS5uZy1sZWF2ZS1hY3RpdmUsDQotICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLW1vdmUsDQotICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLWVudGVyIHsNCi0gICAgICAgIG9wYWNpdHk6MDsNCi0gICAgICAgIG1heC1oZWlnaHQ6MDsNCi0gICAgICB9DQotDQotICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLWxlYXZlLA0KLSAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1tb3ZlLm5nLW1vdmUtYWN0aXZlLA0KLSAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1lbnRlci5uZy1lbnRlci1hY3RpdmUgew0KLSAgICAgICAgb3BhY2l0eToxOw0KLSAgICAgICAgbWF4LWhlaWdodDo0MHB4Ow0KLSAgICAgIH0NCi0gICAgPC9maWxlPg0KLSAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICB2YXIgZnJpZW5kcyA9IGVsZW1lbnQuYWxsKGJ5LnJlcGVhdGVyKCdmcmllbmQgaW4gZnJpZW5kcycpKTsNCi0NCi0gICAgICBpdCgnc2hvdWxkIHJlbmRlciBpbml0aWFsIGRhdGEgc2V0JywgZnVuY3Rpb24oKSB7DQotICAgICAgICBleHBlY3QoZnJpZW5kcy5jb3VudCgpKS50b0JlKDEwKTsNCi0gICAgICAgIGV4cGVjdChmcmllbmRzLmdldCgwKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1sxXSBKb2huIHdobyBpcyAyNSB5ZWFycyBvbGQuJyk7DQotICAgICAgICBleHBlY3QoZnJpZW5kcy5nZXQoMSkuZ2V0VGV4dCgpKS50b0VxdWFsKCdbMl0gSmVzc2llIHdobyBpcyAzMCB5ZWFycyBvbGQuJyk7DQotICAgICAgICBleHBlY3QoZnJpZW5kcy5sYXN0KCkuZ2V0VGV4dCgpKS50b0VxdWFsKCdbMTBdIFNhbWFudGhhIHdobyBpcyA2MCB5ZWFycyBvbGQuJyk7DQotICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdmcmllbmRzLmxlbmd0aCcpKS5nZXRUZXh0KCkpDQotICAgICAgICAgICAgLnRvTWF0Y2goIkkgaGF2ZSAxMCBmcmllbmRzLiBUaGV5IGFyZToiKTsNCi0gICAgICB9KTsNCi0NCi0gICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUgcmVwZWF0ZXIgd2hlbiBmaWx0ZXIgcHJlZGljYXRlIGNoYW5nZXMnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICBleHBlY3QoZnJpZW5kcy5jb3VudCgpKS50b0JlKDEwKTsNCi0NCi0gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdxJykpLnNlbmRLZXlzKCdtYScpOw0KLQ0KLSAgICAgICAgIGV4cGVjdChmcmllbmRzLmNvdW50KCkpLnRvQmUoMik7DQotICAgICAgICAgZXhwZWN0KGZyaWVuZHMuZ2V0KDApLmdldFRleHQoKSkudG9FcXVhbCgnWzFdIE1hcnkgd2hvIGlzIDI4IHllYXJzIG9sZC4nKTsNCi0gICAgICAgICBleHBlY3QoZnJpZW5kcy5sYXN0KCkuZ2V0VGV4dCgpKS50b0VxdWFsKCdbMl0gU2FtYW50aGEgd2hvIGlzIDYwIHllYXJzIG9sZC4nKTsNCi0gICAgICAgfSk7DQotICAgICAgPC9maWxlPg0KLSAgICA8L2V4YW1wbGU+DQotICovDQotdmFyIG5nUmVwZWF0RGlyZWN0aXZlID0gWyckcGFyc2UnLCAnJGFuaW1hdGUnLCBmdW5jdGlvbigkcGFyc2UsICRhbmltYXRlKSB7DQotICB2YXIgTkdfUkVNT1ZFRCA9ICckJE5HX1JFTU9WRUQnOw0KLSAgdmFyIG5nUmVwZWF0TWluRXJyID0gbWluRXJyKCduZ1JlcGVhdCcpOw0KLQ0KLSAgdmFyIHVwZGF0ZVNjb3BlID0gZnVuY3Rpb24oc2NvcGUsIGluZGV4LCB2YWx1ZUlkZW50aWZpZXIsIHZhbHVlLCBrZXlJZGVudGlmaWVyLCBrZXksIGFycmF5TGVuZ3RoKSB7DQotICAgIC8vIFRPRE8ocGVyZik6IGdlbmVyYXRlIHNldHRlcnMgdG8gc2hhdmUgb2ZmIH40MG1zIG9yIDEtMS41JQ0KLSAgICBzY29wZVt2YWx1ZUlkZW50aWZpZXJdID0gdmFsdWU7DQotICAgIGlmIChrZXlJZGVudGlmaWVyKSBzY29wZVtrZXlJZGVudGlmaWVyXSA9IGtleTsNCi0gICAgc2NvcGUuJGluZGV4ID0gaW5kZXg7DQotICAgIHNjb3BlLiRmaXJzdCA9IChpbmRleCA9PT0gMCk7DQotICAgIHNjb3BlLiRsYXN0ID0gKGluZGV4ID09PSAoYXJyYXlMZW5ndGggLSAxKSk7DQotICAgIHNjb3BlLiRtaWRkbGUgPSAhKHNjb3BlLiRmaXJzdCB8fCBzY29wZS4kbGFzdCk7DQotICAgIC8vIGpzaGludCBiaXR3aXNlOiBmYWxzZQ0KLSAgICBzY29wZS4kb2RkID0gIShzY29wZS4kZXZlbiA9IChpbmRleCYxKSA9PT0gMCk7DQotICAgIC8vIGpzaGludCBiaXR3aXNlOiB0cnVlDQotICB9Ow0KLQ0KLSAgdmFyIGdldEJsb2NrU3RhcnQgPSBmdW5jdGlvbihibG9jaykgew0KLSAgICByZXR1cm4gYmxvY2suY2xvbmVbMF07DQotICB9Ow0KLQ0KLSAgdmFyIGdldEJsb2NrRW5kID0gZnVuY3Rpb24oYmxvY2spIHsNCi0gICAgcmV0dXJuIGJsb2NrLmNsb25lW2Jsb2NrLmNsb25lLmxlbmd0aCAtIDFdOw0KLSAgfTsNCi0NCi0NCi0gIHJldHVybiB7DQotICAgIHJlc3RyaWN0OiAnQScsDQotICAgIG11bHRpRWxlbWVudDogdHJ1ZSwNCi0gICAgdHJhbnNjbHVkZTogJ2VsZW1lbnQnLA0KLSAgICBwcmlvcml0eTogMTAwMCwNCi0gICAgdGVybWluYWw6IHRydWUsDQotICAgICQkdGxiOiB0cnVlLA0KLSAgICBjb21waWxlOiBmdW5jdGlvbiBuZ1JlcGVhdENvbXBpbGUoJGVsZW1lbnQsICRhdHRyKSB7DQotICAgICAgdmFyIGV4cHJlc3Npb24gPSAkYXR0ci5uZ1JlcGVhdDsNCi0gICAgICB2YXIgbmdSZXBlYXRFbmRDb21tZW50ID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnIGVuZCBuZ1JlcGVhdDogJyArIGV4cHJlc3Npb24gKyAnICcpOw0KLQ0KLSAgICAgIHZhciBtYXRjaCA9IGV4cHJlc3Npb24ubWF0Y2goL15ccyooW1xzXFNdKz8pXHMraW5ccysoW1xzXFNdKz8pKD86XHMrYXNccysoW1xzXFNdKz8pKT8oPzpccyt0cmFja1xzK2J5XHMrKFtcc1xTXSs/KSk/XHMqJC8pOw0KLQ0KLSAgICAgIGlmICghbWF0Y2gpIHsNCi0gICAgICAgIHRocm93IG5nUmVwZWF0TWluRXJyKCdpZXhwJywgIkV4cGVjdGVkIGV4cHJlc3Npb24gaW4gZm9ybSBvZiAnX2l0ZW1fIGluIF9jb2xsZWN0aW9uX1sgdHJhY2sgYnkgX2lkX10nIGJ1dCBnb3QgJ3swfScuIiwNCi0gICAgICAgICAgICBleHByZXNzaW9uKTsNCi0gICAgICB9DQotDQotICAgICAgdmFyIGxocyA9IG1hdGNoWzFdOw0KLSAgICAgIHZhciByaHMgPSBtYXRjaFsyXTsNCi0gICAgICB2YXIgYWxpYXNBcyA9IG1hdGNoWzNdOw0KLSAgICAgIHZhciB0cmFja0J5RXhwID0gbWF0Y2hbNF07DQotDQotICAgICAgbWF0Y2ggPSBsaHMubWF0Y2goL14oPzooXHMqW1wkXHddKyl8XChccyooW1wkXHddKylccyosXHMqKFtcJFx3XSspXHMqXCkpJC8pOw0KLQ0KLSAgICAgIGlmICghbWF0Y2gpIHsNCi0gICAgICAgIHRocm93IG5nUmVwZWF0TWluRXJyKCdpaWRleHAnLCAiJ19pdGVtXycgaW4gJ19pdGVtXyBpbiBfY29sbGVjdGlvbl8nIHNob3VsZCBiZSBhbiBpZGVudGlmaWVyIG9yICcoX2tleV8sIF92YWx1ZV8pJyBleHByZXNzaW9uLCBidXQgZ290ICd7MH0nLiIsDQotICAgICAgICAgICAgbGhzKTsNCi0gICAgICB9DQotICAgICAgdmFyIHZhbHVlSWRlbnRpZmllciA9IG1hdGNoWzNdIHx8IG1hdGNoWzFdOw0KLSAgICAgIHZhciBrZXlJZGVudGlmaWVyID0gbWF0Y2hbMl07DQotDQotICAgICAgaWYgKGFsaWFzQXMgJiYgKCEvXlskYS16QS1aX11bJGEtekEtWjAtOV9dKiQvLnRlc3QoYWxpYXNBcykgfHwNCi0gICAgICAgICAgL14obnVsbHx1bmRlZmluZWR8dGhpc3xcJGluZGV4fFwkZmlyc3R8XCRtaWRkbGV8XCRsYXN0fFwkZXZlbnxcJG9kZHxcJHBhcmVudCkkLy50ZXN0KGFsaWFzQXMpKSkgew0KLSAgICAgICAgdGhyb3cgbmdSZXBlYXRNaW5FcnIoJ2JhZGlkZW50JywgImFsaWFzICd7MH0nIGlzIGludmFsaWQgLS0tIG11c3QgYmUgYSB2YWxpZCBKUyBpZGVudGlmaWVyIHdoaWNoIGlzIG5vdCBhIHJlc2VydmVkIG5hbWUuIiwNCi0gICAgICAgICAgYWxpYXNBcyk7DQotICAgICAgfQ0KLQ0KLSAgICAgIHZhciB0cmFja0J5RXhwR2V0dGVyLCB0cmFja0J5SWRFeHBGbiwgdHJhY2tCeUlkQXJyYXlGbiwgdHJhY2tCeUlkT2JqRm47DQotICAgICAgdmFyIGhhc2hGbkxvY2FscyA9IHskaWQ6IGhhc2hLZXl9Ow0KLQ0KLSAgICAgIGlmICh0cmFja0J5RXhwKSB7DQotICAgICAgICB0cmFja0J5RXhwR2V0dGVyID0gJHBhcnNlKHRyYWNrQnlFeHApOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICB0cmFja0J5SWRBcnJheUZuID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkgew0KLSAgICAgICAgICByZXR1cm4gaGFzaEtleSh2YWx1ZSk7DQotICAgICAgICB9Ow0KLSAgICAgICAgdHJhY2tCeUlkT2JqRm4gPSBmdW5jdGlvbihrZXkpIHsNCi0gICAgICAgICAgcmV0dXJuIGtleTsNCi0gICAgICAgIH07DQotICAgICAgfQ0KLQ0KLSAgICAgIHJldHVybiBmdW5jdGlvbiBuZ1JlcGVhdExpbmsoJHNjb3BlLCAkZWxlbWVudCwgJGF0dHIsIGN0cmwsICR0cmFuc2NsdWRlKSB7DQotDQotICAgICAgICBpZiAodHJhY2tCeUV4cEdldHRlcikgew0KLSAgICAgICAgICB0cmFja0J5SWRFeHBGbiA9IGZ1bmN0aW9uKGtleSwgdmFsdWUsIGluZGV4KSB7DQotICAgICAgICAgICAgLy8gYXNzaWduIGtleSwgdmFsdWUsIGFuZCAkaW5kZXggdG8gdGhlIGxvY2FscyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgaW4gaGFzaCBmdW5jdGlvbnMNCi0gICAgICAgICAgICBpZiAoa2V5SWRlbnRpZmllcikgaGFzaEZuTG9jYWxzW2tleUlkZW50aWZpZXJdID0ga2V5Ow0KLSAgICAgICAgICAgIGhhc2hGbkxvY2Fsc1t2YWx1ZUlkZW50aWZpZXJdID0gdmFsdWU7DQotICAgICAgICAgICAgaGFzaEZuTG9jYWxzLiRpbmRleCA9IGluZGV4Ow0KLSAgICAgICAgICAgIHJldHVybiB0cmFja0J5RXhwR2V0dGVyKCRzY29wZSwgaGFzaEZuTG9jYWxzKTsNCi0gICAgICAgICAgfTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFN0b3JlIGEgbGlzdCBvZiBlbGVtZW50cyBmcm9tIHByZXZpb3VzIHJ1bi4gVGhpcyBpcyBhIGhhc2ggd2hlcmUga2V5IGlzIHRoZSBpdGVtIGZyb20gdGhlDQotICAgICAgICAvLyBpdGVyYXRvciwgYW5kIHRoZSB2YWx1ZSBpcyBvYmplY3RzIHdpdGggZm9sbG93aW5nIHByb3BlcnRpZXMuDQotICAgICAgICAvLyAgIC0gc2NvcGU6IGJvdW5kIHNjb3BlDQotICAgICAgICAvLyAgIC0gZWxlbWVudDogcHJldmlvdXMgZWxlbWVudC4NCi0gICAgICAgIC8vICAgLSBpbmRleDogcG9zaXRpb24NCi0gICAgICAgIC8vDQotICAgICAgICAvLyBXZSBhcmUgdXNpbmcgbm8tcHJvdG8gb2JqZWN0IHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBndWFyZCBhZ2FpbnN0IGluaGVyaXRlZCBwcm9wcyB2aWENCi0gICAgICAgIC8vIGhhc093blByb3BlcnR5Lg0KLSAgICAgICAgdmFyIGxhc3RCbG9ja01hcCA9IGNyZWF0ZU1hcCgpOw0KLQ0KLSAgICAgICAgLy93YXRjaCBwcm9wcw0KLSAgICAgICAgJHNjb3BlLiR3YXRjaENvbGxlY3Rpb24ocmhzLCBmdW5jdGlvbiBuZ1JlcGVhdEFjdGlvbihjb2xsZWN0aW9uKSB7DQotICAgICAgICAgIHZhciBpbmRleCwgbGVuZ3RoLA0KLSAgICAgICAgICAgICAgcHJldmlvdXNOb2RlID0gJGVsZW1lbnRbMF0sICAgICAvLyBub2RlIHRoYXQgY2xvbmVkIG5vZGVzIHNob3VsZCBiZSBpbnNlcnRlZCBhZnRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCB0byB0aGUgY29tbWVudCBub2RlIGFuY2hvcg0KLSAgICAgICAgICAgICAgbmV4dE5vZGUsDQotICAgICAgICAgICAgICAvLyBTYW1lIGFzIGxhc3RCbG9ja01hcCBidXQgaXQgaGFzIHRoZSBjdXJyZW50IHN0YXRlLiBJdCB3aWxsIGJlY29tZSB0aGUNCi0gICAgICAgICAgICAgIC8vIGxhc3RCbG9ja01hcCBvbiB0aGUgbmV4dCBpdGVyYXRpb24uDQotICAgICAgICAgICAgICBuZXh0QmxvY2tNYXAgPSBjcmVhdGVNYXAoKSwNCi0gICAgICAgICAgICAgIGNvbGxlY3Rpb25MZW5ndGgsDQotICAgICAgICAgICAgICBrZXksIHZhbHVlLCAvLyBrZXkvdmFsdWUgb2YgaXRlcmF0aW9uDQotICAgICAgICAgICAgICB0cmFja0J5SWQsDQotICAgICAgICAgICAgICB0cmFja0J5SWRGbiwNCi0gICAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzLA0KLSAgICAgICAgICAgICAgYmxvY2ssICAgICAgIC8vIGxhc3Qgb2JqZWN0IGluZm9ybWF0aW9uIHtzY29wZSwgZWxlbWVudCwgaWR9DQotICAgICAgICAgICAgICBuZXh0QmxvY2tPcmRlciwNCi0gICAgICAgICAgICAgIGVsZW1lbnRzVG9SZW1vdmU7DQotDQotICAgICAgICAgIGlmIChhbGlhc0FzKSB7DQotICAgICAgICAgICAgJHNjb3BlW2FsaWFzQXNdID0gY29sbGVjdGlvbjsNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHsNCi0gICAgICAgICAgICBjb2xsZWN0aW9uS2V5cyA9IGNvbGxlY3Rpb247DQotICAgICAgICAgICAgdHJhY2tCeUlkRm4gPSB0cmFja0J5SWRFeHBGbiB8fCB0cmFja0J5SWRBcnJheUZuOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHRyYWNrQnlJZEZuID0gdHJhY2tCeUlkRXhwRm4gfHwgdHJhY2tCeUlkT2JqRm47DQotICAgICAgICAgICAgLy8gaWYgb2JqZWN0LCBleHRyYWN0IGtleXMsIHNvcnQgdGhlbSBhbmQgdXNlIHRvIGRldGVybWluZSBvcmRlciBvZiBpdGVyYXRpb24gb3ZlciBvYmogcHJvcHMNCi0gICAgICAgICAgICBjb2xsZWN0aW9uS2V5cyA9IFtdOw0KLSAgICAgICAgICAgIGZvciAodmFyIGl0ZW1LZXkgaW4gY29sbGVjdGlvbikgew0KLSAgICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24uaGFzT3duUHJvcGVydHkoaXRlbUtleSkgJiYgaXRlbUtleS5jaGFyQXQoMCkgIT0gJyQnKSB7DQotICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzLnB1c2goaXRlbUtleSk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzLnNvcnQoKTsNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICBjb2xsZWN0aW9uTGVuZ3RoID0gY29sbGVjdGlvbktleXMubGVuZ3RoOw0KLSAgICAgICAgICBuZXh0QmxvY2tPcmRlciA9IG5ldyBBcnJheShjb2xsZWN0aW9uTGVuZ3RoKTsNCi0NCi0gICAgICAgICAgLy8gbG9jYXRlIGV4aXN0aW5nIGl0ZW1zDQotICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvbGxlY3Rpb25MZW5ndGg7IGluZGV4KyspIHsNCi0gICAgICAgICAgICBrZXkgPSAoY29sbGVjdGlvbiA9PT0gY29sbGVjdGlvbktleXMpID8gaW5kZXggOiBjb2xsZWN0aW9uS2V5c1tpbmRleF07DQotICAgICAgICAgICAgdmFsdWUgPSBjb2xsZWN0aW9uW2tleV07DQotICAgICAgICAgICAgdHJhY2tCeUlkID0gdHJhY2tCeUlkRm4oa2V5LCB2YWx1ZSwgaW5kZXgpOw0KLSAgICAgICAgICAgIGlmIChsYXN0QmxvY2tNYXBbdHJhY2tCeUlkXSkgew0KLSAgICAgICAgICAgICAgLy8gZm91bmQgcHJldmlvdXNseSBzZWVuIGJsb2NrDQotICAgICAgICAgICAgICBibG9jayA9IGxhc3RCbG9ja01hcFt0cmFja0J5SWRdOw0KLSAgICAgICAgICAgICAgZGVsZXRlIGxhc3RCbG9ja01hcFt0cmFja0J5SWRdOw0KLSAgICAgICAgICAgICAgbmV4dEJsb2NrTWFwW3RyYWNrQnlJZF0gPSBibG9jazsNCi0gICAgICAgICAgICAgIG5leHRCbG9ja09yZGVyW2luZGV4XSA9IGJsb2NrOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dEJsb2NrTWFwW3RyYWNrQnlJZF0pIHsNCi0gICAgICAgICAgICAgIC8vIGlmIGNvbGxpc2lvbiBkZXRlY3RlZC4gcmVzdG9yZSBsYXN0QmxvY2tNYXAgYW5kIHRocm93IGFuIGVycm9yDQotICAgICAgICAgICAgICBmb3JFYWNoKG5leHRCbG9ja09yZGVyLCBmdW5jdGlvbihibG9jaykgew0KLSAgICAgICAgICAgICAgICBpZiAoYmxvY2sgJiYgYmxvY2suc2NvcGUpIGxhc3RCbG9ja01hcFtibG9jay5pZF0gPSBibG9jazsNCi0gICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgICAgdGhyb3cgbmdSZXBlYXRNaW5FcnIoJ2R1cGVzJywNCi0gICAgICAgICAgICAgICAgICAiRHVwbGljYXRlcyBpbiBhIHJlcGVhdGVyIGFyZSBub3QgYWxsb3dlZC4gVXNlICd0cmFjayBieScgZXhwcmVzc2lvbiB0byBzcGVjaWZ5IHVuaXF1ZSBrZXlzLiBSZXBlYXRlcjogezB9LCBEdXBsaWNhdGUga2V5OiB7MX0sIER1cGxpY2F0ZSB2YWx1ZTogezJ9IiwNCi0gICAgICAgICAgICAgICAgICBleHByZXNzaW9uLCB0cmFja0J5SWQsIHZhbHVlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgLy8gbmV3IG5ldmVyIGJlZm9yZSBzZWVuIGJsb2NrDQotICAgICAgICAgICAgICBuZXh0QmxvY2tPcmRlcltpbmRleF0gPSB7aWQ6IHRyYWNrQnlJZCwgc2NvcGU6IHVuZGVmaW5lZCwgY2xvbmU6IHVuZGVmaW5lZH07DQotICAgICAgICAgICAgICBuZXh0QmxvY2tNYXBbdHJhY2tCeUlkXSA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIC8vIHJlbW92ZSBsZWZ0b3ZlciBpdGVtcw0KLSAgICAgICAgICBmb3IgKHZhciBibG9ja0tleSBpbiBsYXN0QmxvY2tNYXApIHsNCi0gICAgICAgICAgICBibG9jayA9IGxhc3RCbG9ja01hcFtibG9ja0tleV07DQotICAgICAgICAgICAgZWxlbWVudHNUb1JlbW92ZSA9IGdldEJsb2NrTm9kZXMoYmxvY2suY2xvbmUpOw0KLSAgICAgICAgICAgICRhbmltYXRlLmxlYXZlKGVsZW1lbnRzVG9SZW1vdmUpOw0KLSAgICAgICAgICAgIGlmIChlbGVtZW50c1RvUmVtb3ZlWzBdLnBhcmVudE5vZGUpIHsNCi0gICAgICAgICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgcmVtb3ZlZCB5ZXQgYmVjYXVzZSBvZiBwZW5kaW5nIGFuaW1hdGlvbiwgbWFyayBpdCBhcyBkZWxldGVkDQotICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBpZ25vcmUgaXQgbGF0ZXINCi0gICAgICAgICAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBlbGVtZW50c1RvUmVtb3ZlLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsNCi0gICAgICAgICAgICAgICAgZWxlbWVudHNUb1JlbW92ZVtpbmRleF1bTkdfUkVNT1ZFRF0gPSB0cnVlOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBibG9jay5zY29wZS4kZGVzdHJveSgpOw0KLSAgICAgICAgICB9DQotDQotICAgICAgICAgIC8vIHdlIGFyZSBub3QgdXNpbmcgZm9yRWFjaCBmb3IgcGVyZiByZWFzb25zICh0cnlpbmcgdG8gYXZvaWQgI2NhbGwpDQotICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvbGxlY3Rpb25MZW5ndGg7IGluZGV4KyspIHsNCi0gICAgICAgICAgICBrZXkgPSAoY29sbGVjdGlvbiA9PT0gY29sbGVjdGlvbktleXMpID8gaW5kZXggOiBjb2xsZWN0aW9uS2V5c1tpbmRleF07DQotICAgICAgICAgICAgdmFsdWUgPSBjb2xsZWN0aW9uW2tleV07DQotICAgICAgICAgICAgYmxvY2sgPSBuZXh0QmxvY2tPcmRlcltpbmRleF07DQotDQotICAgICAgICAgICAgaWYgKGJsb2NrLnNjb3BlKSB7DQotICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFscmVhZHkgc2VlbiB0aGlzIG9iamVjdCwgdGhlbiB3ZSBuZWVkIHRvIHJldXNlIHRoZQ0KLSAgICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCBzY29wZS9lbGVtZW50DQotDQotICAgICAgICAgICAgICBuZXh0Tm9kZSA9IHByZXZpb3VzTm9kZTsNCi0NCi0gICAgICAgICAgICAgIC8vIHNraXAgbm9kZXMgdGhhdCBhcmUgYWxyZWFkeSBwZW5kaW5nIHJlbW92YWwgdmlhIGxlYXZlIGFuaW1hdGlvbg0KLSAgICAgICAgICAgICAgZG8gew0KLSAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHROb2RlLm5leHRTaWJsaW5nOw0KLSAgICAgICAgICAgICAgfSB3aGlsZSAobmV4dE5vZGUgJiYgbmV4dE5vZGVbTkdfUkVNT1ZFRF0pOw0KLQ0KLSAgICAgICAgICAgICAgaWYgKGdldEJsb2NrU3RhcnQoYmxvY2spICE9IG5leHROb2RlKSB7DQotICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGl0ZW0gd2hpY2ggZ290IG1vdmVkDQotICAgICAgICAgICAgICAgICRhbmltYXRlLm1vdmUoZ2V0QmxvY2tOb2RlcyhibG9jay5jbG9uZSksIG51bGwsIGpxTGl0ZShwcmV2aW91c05vZGUpKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIHByZXZpb3VzTm9kZSA9IGdldEJsb2NrRW5kKGJsb2NrKTsNCi0gICAgICAgICAgICAgIHVwZGF0ZVNjb3BlKGJsb2NrLnNjb3BlLCBpbmRleCwgdmFsdWVJZGVudGlmaWVyLCB2YWx1ZSwga2V5SWRlbnRpZmllciwga2V5LCBjb2xsZWN0aW9uTGVuZ3RoKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgLy8gbmV3IGl0ZW0gd2hpY2ggd2UgZG9uJ3Qga25vdyBhYm91dA0KLSAgICAgICAgICAgICAgJHRyYW5zY2x1ZGUoZnVuY3Rpb24gbmdSZXBlYXRUcmFuc2NsdWRlKGNsb25lLCBzY29wZSkgew0KLSAgICAgICAgICAgICAgICBibG9jay5zY29wZSA9IHNjb3BlOw0KLSAgICAgICAgICAgICAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9jbG9uZS12cy1jcmVhdGVjb21tZW50DQotICAgICAgICAgICAgICAgIHZhciBlbmROb2RlID0gbmdSZXBlYXRFbmRDb21tZW50LmNsb25lTm9kZShmYWxzZSk7DQotICAgICAgICAgICAgICAgIGNsb25lW2Nsb25lLmxlbmd0aCsrXSA9IGVuZE5vZGU7DQotDQotICAgICAgICAgICAgICAgIC8vIFRPRE8ocGVyZik6IHN1cHBvcnQgbmFrZWQgcHJldmlvdXNOb2RlIGluIGBlbnRlcmAgdG8gYXZvaWQgY3JlYXRpb24gb2YganFMaXRlIHdyYXBwZXI/DQotICAgICAgICAgICAgICAgICRhbmltYXRlLmVudGVyKGNsb25lLCBudWxsLCBqcUxpdGUocHJldmlvdXNOb2RlKSk7DQotICAgICAgICAgICAgICAgIHByZXZpb3VzTm9kZSA9IGVuZE5vZGU7DQotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIG9ubHkgbmVlZCB0aGUgZmlyc3QvbGFzdCBub2RlIG9mIHRoZSBjbG9uZWQgbm9kZXMuDQotICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIG5lZWQgdG8ga2VlcCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBqcWxpdGUgd3JhcHBlciBhcyBpdCBtaWdodCBiZSBjaGFuZ2VkIGxhdGVyDQotICAgICAgICAgICAgICAgIC8vIGJ5IGEgZGlyZWN0aXZlIHdpdGggdGVtcGxhdGVVcmwgd2hlbiBpdHMgdGVtcGxhdGUgYXJyaXZlcy4NCi0gICAgICAgICAgICAgICAgYmxvY2suY2xvbmUgPSBjbG9uZTsNCi0gICAgICAgICAgICAgICAgbmV4dEJsb2NrTWFwW2Jsb2NrLmlkXSA9IGJsb2NrOw0KLSAgICAgICAgICAgICAgICB1cGRhdGVTY29wZShibG9jay5zY29wZSwgaW5kZXgsIHZhbHVlSWRlbnRpZmllciwgdmFsdWUsIGtleUlkZW50aWZpZXIsIGtleSwgY29sbGVjdGlvbkxlbmd0aCk7DQotICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgICAgbGFzdEJsb2NrTWFwID0gbmV4dEJsb2NrTWFwOw0KLSAgICAgICAgfSk7DQotICAgICAgfTsNCi0gICAgfQ0KLSAgfTsNCi19XTsNCi0NCi12YXIgTkdfSElERV9DTEFTUyA9ICduZy1oaWRlJzsNCi12YXIgTkdfSElERV9JTl9QUk9HUkVTU19DTEFTUyA9ICduZy1oaWRlLWFuaW1hdGUnOw0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ1Nob3cNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRoZSBgbmdTaG93YCBkaXJlY3RpdmUgc2hvd3Mgb3IgaGlkZXMgdGhlIGdpdmVuIEhUTUwgZWxlbWVudCBiYXNlZCBvbiB0aGUgZXhwcmVzc2lvbg0KLSAqIHByb3ZpZGVkIHRvIHRoZSBgbmdTaG93YCBhdHRyaWJ1dGUuIFRoZSBlbGVtZW50IGlzIHNob3duIG9yIGhpZGRlbiBieSByZW1vdmluZyBvciBhZGRpbmcNCi0gKiB0aGUgYC5uZy1oaWRlYCBDU1MgY2xhc3Mgb250byB0aGUgZWxlbWVudC4gVGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzIGlzIHByZWRlZmluZWQNCi0gKiBpbiBBbmd1bGFySlMgYW5kIHNldHMgdGhlIGRpc3BsYXkgc3R5bGUgdG8gbm9uZSAodXNpbmcgYW4gIWltcG9ydGFudCBmbGFnKS4NCi0gKiBGb3IgQ1NQIG1vZGUgcGxlYXNlIGFkZCBgYW5ndWxhci1jc3AuY3NzYCB0byB5b3VyIGh0bWwgZmlsZSAoc2VlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDc3AgbmdDc3B9KS4NCi0gKg0KLSAqIGBgYGh0bWwNCi0gKiA8IS0tIHdoZW4gJHNjb3BlLm15VmFsdWUgaXMgdHJ1dGh5IChlbGVtZW50IGlzIHZpc2libGUpIC0tPg0KLSAqIDxkaXYgbmctc2hvdz0ibXlWYWx1ZSI+PC9kaXY+DQotICoNCi0gKiA8IS0tIHdoZW4gJHNjb3BlLm15VmFsdWUgaXMgZmFsc3kgKGVsZW1lbnQgaXMgaGlkZGVuKSAtLT4NCi0gKiA8ZGl2IG5nLXNob3c9Im15VmFsdWUiIGNsYXNzPSJuZy1oaWRlIj48L2Rpdj4NCi0gKiBgYGANCi0gKg0KLSAqIFdoZW4gdGhlIGBuZ1Nob3dgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgZmFsc3kgdmFsdWUgdGhlbiB0aGUgYC5uZy1oaWRlYCBDU1MgY2xhc3MgaXMgYWRkZWQgdG8gdGhlIGNsYXNzDQotICogYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGNhdXNpbmcgaXQgdG8gYmVjb21lIGhpZGRlbi4gV2hlbiB0cnV0aHksIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBpcyByZW1vdmVkDQotICogZnJvbSB0aGUgZWxlbWVudCBjYXVzaW5nIHRoZSBlbGVtZW50IG5vdCB0byBhcHBlYXIgaGlkZGVuLg0KLSAqDQotICogIyMgV2h5IGlzICFpbXBvcnRhbnQgdXNlZD8NCi0gKg0KLSAqIFlvdSBtYXkgYmUgd29uZGVyaW5nIHdoeSAhaW1wb3J0YW50IGlzIHVzZWQgZm9yIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBgLm5nLWhpZGVgIHNlbGVjdG9yDQotICogY2FuIGJlIGVhc2lseSBvdmVycmlkZGVuIGJ5IGhlYXZpZXIgc2VsZWN0b3JzLiBGb3IgZXhhbXBsZSwgc29tZXRoaW5nIGFzIHNpbXBsZQ0KLSAqIGFzIGNoYW5naW5nIHRoZSBkaXNwbGF5IHN0eWxlIG9uIGEgSFRNTCBsaXN0IGl0ZW0gd291bGQgbWFrZSBoaWRkZW4gZWxlbWVudHMgYXBwZWFyIHZpc2libGUuDQotICogVGhpcyBhbHNvIGJlY29tZXMgYSBiaWdnZXIgaXNzdWUgd2hlbiBkZWFsaW5nIHdpdGggQ1NTIGZyYW1ld29ya3MuDQotICoNCi0gKiBCeSB1c2luZyAhaW1wb3J0YW50LCB0aGUgc2hvdyBhbmQgaGlkZSBiZWhhdmlvciB3aWxsIHdvcmsgYXMgZXhwZWN0ZWQgZGVzcGl0ZSBhbnkgY2xhc2ggYmV0d2VlbiBDU1Mgc2VsZWN0b3INCi0gKiBzcGVjaWZpY2l0eSAod2hlbiAhaW1wb3J0YW50IGlzbid0IHVzZWQgd2l0aCBhbnkgY29uZmxpY3Rpbmcgc3R5bGVzKS4gSWYgYSBkZXZlbG9wZXIgY2hvb3NlcyB0byBvdmVycmlkZSB0aGUNCi0gKiBzdHlsaW5nIHRvIGNoYW5nZSBob3cgdG8gaGlkZSBhbiBlbGVtZW50IHRoZW4gaXQgaXMganVzdCBhIG1hdHRlciBvZiB1c2luZyAhaW1wb3J0YW50IGluIHRoZWlyIG93biBDU1MgY29kZS4NCi0gKg0KLSAqICMjIyBPdmVycmlkaW5nIGAubmctaGlkZWANCi0gKg0KLSAqIEJ5IGRlZmF1bHQsIHRoZSBgLm5nLWhpZGVgIGNsYXNzIHdpbGwgc3R5bGUgdGhlIGVsZW1lbnQgd2l0aCBgZGlzcGxheTogbm9uZSFpbXBvcnRhbnRgLiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UNCi0gKiB0aGUgaGlkZSBiZWhhdmlvciB3aXRoIG5nU2hvdy9uZ0hpZGUgdGhlbiB0aGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXN0YXRpbmcgdGhlIHN0eWxlcyBmb3IgdGhlIGAubmctaGlkZWANCi0gKiBjbGFzcyBpbiBDU1M6DQotICoNCi0gKiBgYGBjc3MNCi0gKiAubmctaGlkZSB7DQotICogICAvJiM0MjsgdGhpcyBpcyBqdXN0IGFub3RoZXIgZm9ybSBvZiBoaWRpbmcgYW4gZWxlbWVudCAmIzQyOy8NCi0gKiAgIGRpc3BsYXk6IGJsb2NrIWltcG9ydGFudDsNCi0gKiAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gKiAgIHRvcDogLTk5OTlweDsNCi0gKiAgIGxlZnQ6IC05OTk5cHg7DQotICogfQ0KLSAqIGBgYA0KLSAqDQotICogQnkgZGVmYXVsdCB5b3UgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSBpbiBDU1MgYW55dGhpbmcgYW5kIHRoZSBhbmltYXRpb25zIHdpbGwgd29yayBhcm91bmQgdGhlIGRpc3BsYXkgc3R5bGUuDQotICoNCi0gKiAjIyBBIG5vdGUgYWJvdXQgYW5pbWF0aW9ucyB3aXRoIGBuZ1Nob3dgDQotICoNCi0gKiBBbmltYXRpb25zIGluIG5nU2hvdy9uZ0hpZGUgd29yayB3aXRoIHRoZSBzaG93IGFuZCBoaWRlIGV2ZW50cyB0aGF0IGFyZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGlyZWN0aXZlIGV4cHJlc3Npb24NCi0gKiBpcyB0cnVlIGFuZCBmYWxzZS4gVGhpcyBzeXN0ZW0gd29ya3MgbGlrZSB0aGUgYW5pbWF0aW9uIHN5c3RlbSBwcmVzZW50IHdpdGggbmdDbGFzcyBleGNlcHQgdGhhdA0KLSAqIHlvdSBtdXN0IGFsc28gaW5jbHVkZSB0aGUgIWltcG9ydGFudCBmbGFnIHRvIG92ZXJyaWRlIHRoZSBkaXNwbGF5IHByb3BlcnR5DQotICogc28gdGhhdCB5b3UgY2FuIHBlcmZvcm0gYW4gYW5pbWF0aW9uIHdoZW4gdGhlIGVsZW1lbnQgaXMgaGlkZGVuIGR1cmluZyB0aGUgdGltZSBvZiB0aGUgYW5pbWF0aW9uLg0KLSAqDQotICogYGBgY3NzDQotICogLy8NCi0gKiAvL2Egd29ya2luZyBleGFtcGxlIGNhbiBiZSBmb3VuZCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgcGFnZQ0KLSAqIC8vDQotICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQsIC5teS1lbGVtZW50Lm5nLWhpZGUtcmVtb3ZlIHsNCi0gKiAgIC8mIzQyOyB0aGlzIGlzIHJlcXVpcmVkIGFzIG9mIDEuM3ggdG8gcHJvcGVybHkNCi0gKiAgICAgIGFwcGx5IGFsbCBzdHlsaW5nIGluIGEgc2hvdy9oaWRlIGFuaW1hdGlvbiAmIzQyOy8NCi0gKiAgIHRyYW5zaXRpb246IDBzIGxpbmVhciBhbGw7DQotICogfQ0KLSAqDQotICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQtYWN0aXZlLA0KLSAqIC5teS1lbGVtZW50Lm5nLWhpZGUtcmVtb3ZlLWFjdGl2ZSB7DQotICogICAvJiM0MjsgdGhlIHRyYW5zaXRpb24gaXMgZGVmaW5lZCBpbiB0aGUgYWN0aXZlIGNsYXNzICYjNDI7Lw0KLSAqICAgdHJhbnNpdGlvbjogMXMgbGluZWFyIGFsbDsNCi0gKiB9DQotICoNCi0gKiAubXktZWxlbWVudC5uZy1oaWRlLWFkZCB7IC4uLiB9DQotICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQubmctaGlkZS1hZGQtYWN0aXZlIHsgLi4uIH0NCi0gKiAubXktZWxlbWVudC5uZy1oaWRlLXJlbW92ZSB7IC4uLiB9DQotICogLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUubmctaGlkZS1yZW1vdmUtYWN0aXZlIHsgLi4uIH0NCi0gKiBgYGANCi0gKg0KLSAqIEtlZXAgaW4gbWluZCB0aGF0LCBhcyBvZiBBbmd1bGFySlMgdmVyc2lvbiAxLjMuMC1iZXRhLjExLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNoYW5nZSB0aGUgZGlzcGxheQ0KLSAqIHByb3BlcnR5IHRvIGJsb2NrIGR1cmluZyBhbmltYXRpb24gc3RhdGVzLS1uZ0FuaW1hdGUgd2lsbCBoYW5kbGUgdGhlIHN0eWxlIHRvZ2dsaW5nIGF1dG9tYXRpY2FsbHkgZm9yIHlvdS4NCi0gKg0KLSAqIEBhbmltYXRpb25zDQotICogYWRkQ2xhc3M6IGAubmctaGlkZWAgLSBoYXBwZW5zIGFmdGVyIHRoZSBgbmdTaG93YCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHRydXRoeSB2YWx1ZSBhbmQgdGhlIGp1c3QgYmVmb3JlIGNvbnRlbnRzIGFyZSBzZXQgdG8gdmlzaWJsZQ0KLSAqIHJlbW92ZUNsYXNzOiBgLm5nLWhpZGVgIC0gaGFwcGVucyBhZnRlciB0aGUgYG5nU2hvd2AgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBub24gdHJ1dGh5IHZhbHVlIGFuZCBqdXN0IGJlZm9yZSB0aGUgY29udGVudHMgYXJlIHNldCB0byBoaWRkZW4NCi0gKg0KLSAqIEBlbGVtZW50IEFOWQ0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdTaG93IElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyB0cnV0aHkNCi0gKiAgICAgdGhlbiB0aGUgZWxlbWVudCBpcyBzaG93biBvciBoaWRkZW4gcmVzcGVjdGl2ZWx5Lg0KLSAqDQotICogQGV4YW1wbGUNCi0gIDxleGFtcGxlIG1vZHVsZT0ibmdBbmltYXRlIiBkZXBzPSJhbmd1bGFyLWFuaW1hdGUuanMiIGFuaW1hdGlvbnM9InRydWUiPg0KLSAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICBDbGljayBtZTogPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iY2hlY2tlZCI+PGJyLz4NCi0gICAgICA8ZGl2Pg0KLSAgICAgICAgU2hvdzoNCi0gICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrLWVsZW1lbnQgYW5pbWF0ZS1zaG93IiBuZy1zaG93PSJjaGVja2VkIj4NCi0gICAgICAgICAgPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGh1bWJzLXVwIj48L3NwYW4+IEkgc2hvdyB1cCB3aGVuIHlvdXIgY2hlY2tib3ggaXMgY2hlY2tlZC4NCi0gICAgICAgIDwvZGl2Pg0KLSAgICAgIDwvZGl2Pg0KLSAgICAgIDxkaXY+DQotICAgICAgICBIaWRlOg0KLSAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2stZWxlbWVudCBhbmltYXRlLXNob3ciIG5nLWhpZGU9ImNoZWNrZWQiPg0KLSAgICAgICAgICA8c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi10aHVtYnMtZG93biI+PC9zcGFuPiBJIGhpZGUgd2hlbiB5b3VyIGNoZWNrYm94IGlzIGNoZWNrZWQuDQotICAgICAgICA8L2Rpdj4NCi0gICAgICA8L2Rpdj4NCi0gICAgPC9maWxlPg0KLSAgICA8ZmlsZSBuYW1lPSJnbHlwaGljb25zLmNzcyI+DQotICAgICAgQGltcG9ydCB1cmwoLi4vLi4vY29tcG9uZW50cy9ib290c3RyYXAtMy4xLjEvY3NzL2Jvb3RzdHJhcC5jc3MpOw0KLSAgICA8L2ZpbGU+DQotICAgIDxmaWxlIG5hbWU9ImFuaW1hdGlvbnMuY3NzIj4NCi0gICAgICAuYW5pbWF0ZS1zaG93IHsNCi0gICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4Ow0KLSAgICAgICAgb3BhY2l0eTogMTsNCi0gICAgICAgIHBhZGRpbmc6IDEwcHg7DQotICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsNCi0gICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOw0KLSAgICAgIH0NCi0NCi0gICAgICAuYW5pbWF0ZS1zaG93Lm5nLWhpZGUtYWRkLm5nLWhpZGUtYWRkLWFjdGl2ZSwNCi0gICAgICAuYW5pbWF0ZS1zaG93Lm5nLWhpZGUtcmVtb3ZlLm5nLWhpZGUtcmVtb3ZlLWFjdGl2ZSB7DQotICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCBsaW5lYXIgMC41czsNCi0gICAgICAgIHRyYW5zaXRpb246IGFsbCBsaW5lYXIgMC41czsNCi0gICAgICB9DQotDQotICAgICAgLmFuaW1hdGUtc2hvdy5uZy1oaWRlIHsNCi0gICAgICAgIGxpbmUtaGVpZ2h0OiAwOw0KLSAgICAgICAgb3BhY2l0eTogMDsNCi0gICAgICAgIHBhZGRpbmc6IDAgMTBweDsNCi0gICAgICB9DQotDQotICAgICAgLmNoZWNrLWVsZW1lbnQgew0KLSAgICAgICAgcGFkZGluZzogMTBweDsNCi0gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOw0KLSAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7DQotICAgICAgfQ0KLSAgICA8L2ZpbGU+DQotICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgIHZhciB0aHVtYnNVcCA9IGVsZW1lbnQoYnkuY3NzKCdzcGFuLmdseXBoaWNvbi10aHVtYnMtdXAnKSk7DQotICAgICAgdmFyIHRodW1ic0Rvd24gPSBlbGVtZW50KGJ5LmNzcygnc3Bhbi5nbHlwaGljb24tdGh1bWJzLWRvd24nKSk7DQotDQotICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1zaG93IC8gbmctaGlkZScsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgZXhwZWN0KHRodW1ic1VwLmlzRGlzcGxheWVkKCkpLnRvQmVGYWxzeSgpOw0KLSAgICAgICAgZXhwZWN0KHRodW1ic0Rvd24uaXNEaXNwbGF5ZWQoKSkudG9CZVRydXRoeSgpOw0KLQ0KLSAgICAgICAgZWxlbWVudChieS5tb2RlbCgnY2hlY2tlZCcpKS5jbGljaygpOw0KLQ0KLSAgICAgICAgZXhwZWN0KHRodW1ic1VwLmlzRGlzcGxheWVkKCkpLnRvQmVUcnV0aHkoKTsNCi0gICAgICAgIGV4cGVjdCh0aHVtYnNEb3duLmlzRGlzcGxheWVkKCkpLnRvQmVGYWxzeSgpOw0KLSAgICAgIH0pOw0KLSAgICA8L2ZpbGU+DQotICA8L2V4YW1wbGU+DQotICovDQotdmFyIG5nU2hvd0RpcmVjdGl2ZSA9IFsnJGFuaW1hdGUnLCBmdW5jdGlvbigkYW5pbWF0ZSkgew0KLSAgcmV0dXJuIHsNCi0gICAgcmVzdHJpY3Q6ICdBJywNCi0gICAgbXVsdGlFbGVtZW50OiB0cnVlLA0KLSAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cikgew0KLSAgICAgIHNjb3BlLiR3YXRjaChhdHRyLm5nU2hvdywgZnVuY3Rpb24gbmdTaG93V2F0Y2hBY3Rpb24odmFsdWUpIHsNCi0gICAgICAgIC8vIHdlJ3JlIGFkZGluZyBhIHRlbXBvcmFyeSwgYW5pbWF0aW9uLXNwZWNpZmljIGNsYXNzIGZvciBuZy1oaWRlIHNpbmNlIHRoaXMgd2F5DQotICAgICAgICAvLyB3ZSBjYW4gY29udHJvbCB3aGVuIHRoZSBlbGVtZW50IGlzIGFjdHVhbGx5IGRpc3BsYXllZCBvbiBzY3JlZW4gd2l0aG91dCBoYXZpbmcNCi0gICAgICAgIC8vIHRvIGhhdmUgYSBnbG9iYWwvZ3JlZWR5IENTUyBzZWxlY3RvciB0aGF0IGJyZWFrcyB3aGVuIG90aGVyIGFuaW1hdGlvbnMgYXJlIHJ1bi4NCi0gICAgICAgIC8vIFJlYWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzkxMDMjaXNzdWVjb21tZW50LTU4MzM1ODQ1DQotICAgICAgICAkYW5pbWF0ZVt2YWx1ZSA/ICdyZW1vdmVDbGFzcycgOiAnYWRkQ2xhc3MnXShlbGVtZW50LCBOR19ISURFX0NMQVNTLCB7DQotICAgICAgICAgIHRlbXBDbGFzc2VzOiBOR19ISURFX0lOX1BST0dSRVNTX0NMQVNTDQotICAgICAgICB9KTsNCi0gICAgICB9KTsNCi0gICAgfQ0KLSAgfTsNCi19XTsNCi0NCi0NCi0vKioNCi0gKiBAbmdkb2MgZGlyZWN0aXZlDQotICogQG5hbWUgbmdIaWRlDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBUaGUgYG5nSGlkZWAgZGlyZWN0aXZlIHNob3dzIG9yIGhpZGVzIHRoZSBnaXZlbiBIVE1MIGVsZW1lbnQgYmFzZWQgb24gdGhlIGV4cHJlc3Npb24NCi0gKiBwcm92aWRlZCB0byB0aGUgYG5nSGlkZWAgYXR0cmlidXRlLiBUaGUgZWxlbWVudCBpcyBzaG93biBvciBoaWRkZW4gYnkgcmVtb3Zpbmcgb3IgYWRkaW5nDQotICogdGhlIGBuZy1oaWRlYCBDU1MgY2xhc3Mgb250byB0aGUgZWxlbWVudC4gVGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzIGlzIHByZWRlZmluZWQNCi0gKiBpbiBBbmd1bGFySlMgYW5kIHNldHMgdGhlIGRpc3BsYXkgc3R5bGUgdG8gbm9uZSAodXNpbmcgYW4gIWltcG9ydGFudCBmbGFnKS4NCi0gKiBGb3IgQ1NQIG1vZGUgcGxlYXNlIGFkZCBgYW5ndWxhci1jc3AuY3NzYCB0byB5b3VyIGh0bWwgZmlsZSAoc2VlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDc3AgbmdDc3B9KS4NCi0gKg0KLSAqIGBgYGh0bWwNCi0gKiA8IS0tIHdoZW4gJHNjb3BlLm15VmFsdWUgaXMgdHJ1dGh5IChlbGVtZW50IGlzIGhpZGRlbikgLS0+DQotICogPGRpdiBuZy1oaWRlPSJteVZhbHVlIiBjbGFzcz0ibmctaGlkZSI+PC9kaXY+DQotICoNCi0gKiA8IS0tIHdoZW4gJHNjb3BlLm15VmFsdWUgaXMgZmFsc3kgKGVsZW1lbnQgaXMgdmlzaWJsZSkgLS0+DQotICogPGRpdiBuZy1oaWRlPSJteVZhbHVlIj48L2Rpdj4NCi0gKiBgYGANCi0gKg0KLSAqIFdoZW4gdGhlIGBuZ0hpZGVgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgdHJ1dGh5IHZhbHVlIHRoZW4gdGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzIGlzIGFkZGVkIHRvIHRoZSBjbGFzcw0KLSAqIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCBjYXVzaW5nIGl0IHRvIGJlY29tZSBoaWRkZW4uIFdoZW4gZmFsc3ksIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBpcyByZW1vdmVkDQotICogZnJvbSB0aGUgZWxlbWVudCBjYXVzaW5nIHRoZSBlbGVtZW50IG5vdCB0byBhcHBlYXIgaGlkZGVuLg0KLSAqDQotICogIyMgV2h5IGlzICFpbXBvcnRhbnQgdXNlZD8NCi0gKg0KLSAqIFlvdSBtYXkgYmUgd29uZGVyaW5nIHdoeSAhaW1wb3J0YW50IGlzIHVzZWQgZm9yIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBgLm5nLWhpZGVgIHNlbGVjdG9yDQotICogY2FuIGJlIGVhc2lseSBvdmVycmlkZGVuIGJ5IGhlYXZpZXIgc2VsZWN0b3JzLiBGb3IgZXhhbXBsZSwgc29tZXRoaW5nIGFzIHNpbXBsZQ0KLSAqIGFzIGNoYW5naW5nIHRoZSBkaXNwbGF5IHN0eWxlIG9uIGEgSFRNTCBsaXN0IGl0ZW0gd291bGQgbWFrZSBoaWRkZW4gZWxlbWVudHMgYXBwZWFyIHZpc2libGUuDQotICogVGhpcyBhbHNvIGJlY29tZXMgYSBiaWdnZXIgaXNzdWUgd2hlbiBkZWFsaW5nIHdpdGggQ1NTIGZyYW1ld29ya3MuDQotICoNCi0gKiBCeSB1c2luZyAhaW1wb3J0YW50LCB0aGUgc2hvdyBhbmQgaGlkZSBiZWhhdmlvciB3aWxsIHdvcmsgYXMgZXhwZWN0ZWQgZGVzcGl0ZSBhbnkgY2xhc2ggYmV0d2VlbiBDU1Mgc2VsZWN0b3INCi0gKiBzcGVjaWZpY2l0eSAod2hlbiAhaW1wb3J0YW50IGlzbid0IHVzZWQgd2l0aCBhbnkgY29uZmxpY3Rpbmcgc3R5bGVzKS4gSWYgYSBkZXZlbG9wZXIgY2hvb3NlcyB0byBvdmVycmlkZSB0aGUNCi0gKiBzdHlsaW5nIHRvIGNoYW5nZSBob3cgdG8gaGlkZSBhbiBlbGVtZW50IHRoZW4gaXQgaXMganVzdCBhIG1hdHRlciBvZiB1c2luZyAhaW1wb3J0YW50IGluIHRoZWlyIG93biBDU1MgY29kZS4NCi0gKg0KLSAqICMjIyBPdmVycmlkaW5nIGAubmctaGlkZWANCi0gKg0KLSAqIEJ5IGRlZmF1bHQsIHRoZSBgLm5nLWhpZGVgIGNsYXNzIHdpbGwgc3R5bGUgdGhlIGVsZW1lbnQgd2l0aCBgZGlzcGxheTogbm9uZSFpbXBvcnRhbnRgLiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UNCi0gKiB0aGUgaGlkZSBiZWhhdmlvciB3aXRoIG5nU2hvdy9uZ0hpZGUgdGhlbiB0aGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXN0YXRpbmcgdGhlIHN0eWxlcyBmb3IgdGhlIGAubmctaGlkZWANCi0gKiBjbGFzcyBpbiBDU1M6DQotICoNCi0gKiBgYGBjc3MNCi0gKiAubmctaGlkZSB7DQotICogICAvJiM0MjsgdGhpcyBpcyBqdXN0IGFub3RoZXIgZm9ybSBvZiBoaWRpbmcgYW4gZWxlbWVudCAmIzQyOy8NCi0gKiAgIGRpc3BsYXk6IGJsb2NrIWltcG9ydGFudDsNCi0gKiAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gKiAgIHRvcDogLTk5OTlweDsNCi0gKiAgIGxlZnQ6IC05OTk5cHg7DQotICogfQ0KLSAqIGBgYA0KLSAqDQotICogQnkgZGVmYXVsdCB5b3UgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSBpbiBDU1MgYW55dGhpbmcgYW5kIHRoZSBhbmltYXRpb25zIHdpbGwgd29yayBhcm91bmQgdGhlIGRpc3BsYXkgc3R5bGUuDQotICoNCi0gKiAjIyBBIG5vdGUgYWJvdXQgYW5pbWF0aW9ucyB3aXRoIGBuZ0hpZGVgDQotICoNCi0gKiBBbmltYXRpb25zIGluIG5nU2hvdy9uZ0hpZGUgd29yayB3aXRoIHRoZSBzaG93IGFuZCBoaWRlIGV2ZW50cyB0aGF0IGFyZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGlyZWN0aXZlIGV4cHJlc3Npb24NCi0gKiBpcyB0cnVlIGFuZCBmYWxzZS4gVGhpcyBzeXN0ZW0gd29ya3MgbGlrZSB0aGUgYW5pbWF0aW9uIHN5c3RlbSBwcmVzZW50IHdpdGggbmdDbGFzcywgZXhjZXB0IHRoYXQgdGhlIGAubmctaGlkZWANCi0gKiBDU1MgY2xhc3MgaXMgYWRkZWQgYW5kIHJlbW92ZWQgZm9yIHlvdSBpbnN0ZWFkIG9mIHlvdXIgb3duIENTUyBjbGFzcy4NCi0gKg0KLSAqIGBgYGNzcw0KLSAqIC8vDQotICogLy9hIHdvcmtpbmcgZXhhbXBsZSBjYW4gYmUgZm91bmQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIHBhZ2UNCi0gKiAvLw0KLSAqIC5teS1lbGVtZW50Lm5nLWhpZGUtYWRkLCAubXktZWxlbWVudC5uZy1oaWRlLXJlbW92ZSB7DQotICogICB0cmFuc2l0aW9uOiAwLjVzIGxpbmVhciBhbGw7DQotICogfQ0KLSAqDQotICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQgeyAuLi4gfQ0KLSAqIC5teS1lbGVtZW50Lm5nLWhpZGUtYWRkLm5nLWhpZGUtYWRkLWFjdGl2ZSB7IC4uLiB9DQotICogLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUgeyAuLi4gfQ0KLSAqIC5teS1lbGVtZW50Lm5nLWhpZGUtcmVtb3ZlLm5nLWhpZGUtcmVtb3ZlLWFjdGl2ZSB7IC4uLiB9DQotICogYGBgDQotICoNCi0gKiBLZWVwIGluIG1pbmQgdGhhdCwgYXMgb2YgQW5ndWxhckpTIHZlcnNpb24gMS4zLjAtYmV0YS4xMSwgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgdGhlIGRpc3BsYXkNCi0gKiBwcm9wZXJ0eSB0byBibG9jayBkdXJpbmcgYW5pbWF0aW9uIHN0YXRlcy0tbmdBbmltYXRlIHdpbGwgaGFuZGxlIHRoZSBzdHlsZSB0b2dnbGluZyBhdXRvbWF0aWNhbGx5IGZvciB5b3UuDQotICoNCi0gKiBAYW5pbWF0aW9ucw0KLSAqIHJlbW92ZUNsYXNzOiBgLm5nLWhpZGVgIC0gaGFwcGVucyBhZnRlciB0aGUgYG5nSGlkZWAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSB0cnV0aHkgdmFsdWUgYW5kIGp1c3QgYmVmb3JlIHRoZSBjb250ZW50cyBhcmUgc2V0IHRvIGhpZGRlbg0KLSAqIGFkZENsYXNzOiBgLm5nLWhpZGVgIC0gaGFwcGVucyBhZnRlciB0aGUgYG5nSGlkZWAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBub24gdHJ1dGh5IHZhbHVlIGFuZCBqdXN0IGJlZm9yZSB0aGUgY29udGVudHMgYXJlIHNldCB0byB2aXNpYmxlDQotICoNCi0gKiBAZWxlbWVudCBBTlkNCi0gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nSGlkZSBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5IHRoZW4NCi0gKiAgICAgdGhlIGVsZW1lbnQgaXMgc2hvd24gb3IgaGlkZGVuIHJlc3BlY3RpdmVseS4NCi0gKg0KLSAqIEBleGFtcGxlDQotICA8ZXhhbXBsZSBtb2R1bGU9Im5nQW5pbWF0ZSIgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIj4NCi0gICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgQ2xpY2sgbWU6IDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImNoZWNrZWQiPjxici8+DQotICAgICAgPGRpdj4NCi0gICAgICAgIFNob3c6DQotICAgICAgICA8ZGl2IGNsYXNzPSJjaGVjay1lbGVtZW50IGFuaW1hdGUtaGlkZSIgbmctc2hvdz0iY2hlY2tlZCI+DQotICAgICAgICAgIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXRodW1icy11cCI+PC9zcGFuPiBJIHNob3cgdXAgd2hlbiB5b3VyIGNoZWNrYm94IGlzIGNoZWNrZWQuDQotICAgICAgICA8L2Rpdj4NCi0gICAgICA8L2Rpdj4NCi0gICAgICA8ZGl2Pg0KLSAgICAgICAgSGlkZToNCi0gICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrLWVsZW1lbnQgYW5pbWF0ZS1oaWRlIiBuZy1oaWRlPSJjaGVja2VkIj4NCi0gICAgICAgICAgPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGh1bWJzLWRvd24iPjwvc3Bhbj4gSSBoaWRlIHdoZW4geW91ciBjaGVja2JveCBpcyBjaGVja2VkLg0KLSAgICAgICAgPC9kaXY+DQotICAgICAgPC9kaXY+DQotICAgIDwvZmlsZT4NCi0gICAgPGZpbGUgbmFtZT0iZ2x5cGhpY29ucy5jc3MiPg0KLSAgICAgIEBpbXBvcnQgdXJsKC4uLy4uL2NvbXBvbmVudHMvYm9vdHN0cmFwLTMuMS4xL2Nzcy9ib290c3RyYXAuY3NzKTsNCi0gICAgPC9maWxlPg0KLSAgICA8ZmlsZSBuYW1lPSJhbmltYXRpb25zLmNzcyI+DQotICAgICAgLmFuaW1hdGUtaGlkZSB7DQotICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCBsaW5lYXIgMC41czsNCi0gICAgICAgIHRyYW5zaXRpb246IGFsbCBsaW5lYXIgMC41czsNCi0gICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4Ow0KLSAgICAgICAgb3BhY2l0eTogMTsNCi0gICAgICAgIHBhZGRpbmc6IDEwcHg7DQotICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsNCi0gICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOw0KLSAgICAgIH0NCi0NCi0gICAgICAuYW5pbWF0ZS1oaWRlLm5nLWhpZGUgew0KLSAgICAgICAgbGluZS1oZWlnaHQ6IDA7DQotICAgICAgICBvcGFjaXR5OiAwOw0KLSAgICAgICAgcGFkZGluZzogMCAxMHB4Ow0KLSAgICAgIH0NCi0NCi0gICAgICAuY2hlY2stZWxlbWVudCB7DQotICAgICAgICBwYWRkaW5nOiAxMHB4Ow0KLSAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7DQotICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsNCi0gICAgICB9DQotICAgIDwvZmlsZT4NCi0gICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgdmFyIHRodW1ic1VwID0gZWxlbWVudChieS5jc3MoJ3NwYW4uZ2x5cGhpY29uLXRodW1icy11cCcpKTsNCi0gICAgICB2YXIgdGh1bWJzRG93biA9IGVsZW1lbnQoYnkuY3NzKCdzcGFuLmdseXBoaWNvbi10aHVtYnMtZG93bicpKTsNCi0NCi0gICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLXNob3cgLyBuZy1oaWRlJywgZnVuY3Rpb24oKSB7DQotICAgICAgICBleHBlY3QodGh1bWJzVXAuaXNEaXNwbGF5ZWQoKSkudG9CZUZhbHN5KCk7DQotICAgICAgICBleHBlY3QodGh1bWJzRG93bi5pc0Rpc3BsYXllZCgpKS50b0JlVHJ1dGh5KCk7DQotDQotICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdjaGVja2VkJykpLmNsaWNrKCk7DQotDQotICAgICAgICBleHBlY3QodGh1bWJzVXAuaXNEaXNwbGF5ZWQoKSkudG9CZVRydXRoeSgpOw0KLSAgICAgICAgZXhwZWN0KHRodW1ic0Rvd24uaXNEaXNwbGF5ZWQoKSkudG9CZUZhbHN5KCk7DQotICAgICAgfSk7DQotICAgIDwvZmlsZT4NCi0gIDwvZXhhbXBsZT4NCi0gKi8NCi12YXIgbmdIaWRlRGlyZWN0aXZlID0gWyckYW5pbWF0ZScsIGZ1bmN0aW9uKCRhbmltYXRlKSB7DQotICByZXR1cm4gew0KLSAgICByZXN0cmljdDogJ0EnLA0KLSAgICBtdWx0aUVsZW1lbnQ6IHRydWUsDQotICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7DQotICAgICAgc2NvcGUuJHdhdGNoKGF0dHIubmdIaWRlLCBmdW5jdGlvbiBuZ0hpZGVXYXRjaEFjdGlvbih2YWx1ZSkgew0KLSAgICAgICAgLy8gVGhlIGNvbW1lbnQgaW5zaWRlIG9mIHRoZSBuZ1Nob3dEaXJlY3RpdmUgZXhwbGFpbnMgd2h5IHdlIGFkZCBhbmQNCi0gICAgICAgIC8vIHJlbW92ZSBhIHRlbXBvcmFyeSBjbGFzcyBmb3IgdGhlIHNob3cvaGlkZSBhbmltYXRpb24NCi0gICAgICAgICRhbmltYXRlW3ZhbHVlID8gJ2FkZENsYXNzJyA6ICdyZW1vdmVDbGFzcyddKGVsZW1lbnQsTkdfSElERV9DTEFTUywgew0KLSAgICAgICAgICB0ZW1wQ2xhc3NlczogTkdfSElERV9JTl9QUk9HUkVTU19DTEFTUw0KLSAgICAgICAgfSk7DQotICAgICAgfSk7DQotICAgIH0NCi0gIH07DQotfV07DQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nU3R5bGUNCi0gKiBAcmVzdHJpY3QgQUMNCi0gKg0KLSAqIEBkZXNjcmlwdGlvbg0KLSAqIFRoZSBgbmdTdHlsZWAgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gc2V0IENTUyBzdHlsZSBvbiBhbiBIVE1MIGVsZW1lbnQgY29uZGl0aW9uYWxseS4NCi0gKg0KLSAqIEBlbGVtZW50IEFOWQ0KLSAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdTdHlsZQ0KLSAqDQotICoge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gd2hpY2ggZXZhbHMgdG8gYW4NCi0gKiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgQ1NTIHN0eWxlIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aG9zZSBDU1MNCi0gKiBrZXlzLg0KLSAqDQotICogU2luY2Ugc29tZSBDU1Mgc3R5bGUgbmFtZXMgYXJlIG5vdCB2YWxpZCBrZXlzIGZvciBhbiBvYmplY3QsIHRoZXkgbXVzdCBiZSBxdW90ZWQuDQotICogU2VlIHRoZSAnYmFja2dyb3VuZC1jb2xvcicgc3R5bGUgaW4gdGhlIGV4YW1wbGUgYmVsb3cuDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgIDxleGFtcGxlPg0KLSAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+DQotICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0ic2V0IGNvbG9yIiBuZy1jbGljaz0ibXlTdHlsZT17Y29sb3I6J3JlZCd9Ij4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJzZXQgYmFja2dyb3VuZCIgbmctY2xpY2s9Im15U3R5bGU9eydiYWNrZ3JvdW5kLWNvbG9yJzonYmx1ZSd9Ij4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJjbGVhciIgbmctY2xpY2s9Im15U3R5bGU9e30iPg0KLSAgICAgICAgPGJyLz4NCi0gICAgICAgIDxzcGFuIG5nLXN0eWxlPSJteVN0eWxlIj5TYW1wbGUgVGV4dDwvc3Bhbj4NCi0gICAgICAgIDxwcmU+bXlTdHlsZT17e215U3R5bGV9fTwvcHJlPg0KLSAgICAgPC9maWxlPg0KLSAgICAgPGZpbGUgbmFtZT0ic3R5bGUuY3NzIj4NCi0gICAgICAgc3BhbiB7DQotICAgICAgICAgY29sb3I6IGJsYWNrOw0KLSAgICAgICB9DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgdmFyIGNvbG9yU3BhbiA9IGVsZW1lbnQoYnkuY3NzKCdzcGFuJykpOw0KLQ0KLSAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLXN0eWxlJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgZXhwZWN0KGNvbG9yU3Bhbi5nZXRDc3NWYWx1ZSgnY29sb3InKSkudG9CZSgncmdiYSgwLCAwLCAwLCAxKScpOw0KLSAgICAgICAgIGVsZW1lbnQoYnkuY3NzKCdpbnB1dFt2YWx1ZT1cJ3NldCBjb2xvclwnXScpKS5jbGljaygpOw0KLSAgICAgICAgIGV4cGVjdChjb2xvclNwYW4uZ2V0Q3NzVmFsdWUoJ2NvbG9yJykpLnRvQmUoJ3JnYmEoMjU1LCAwLCAwLCAxKScpOw0KLSAgICAgICAgIGVsZW1lbnQoYnkuY3NzKCdpbnB1dFt2YWx1ZT1jbGVhcl0nKSkuY2xpY2soKTsNCi0gICAgICAgICBleHBlY3QoY29sb3JTcGFuLmdldENzc1ZhbHVlKCdjb2xvcicpKS50b0JlKCdyZ2JhKDAsIDAsIDAsIDEpJyk7DQotICAgICAgIH0pOw0KLSAgICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gKi8NCi12YXIgbmdTdHlsZURpcmVjdGl2ZSA9IG5nRGlyZWN0aXZlKGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7DQotICBzY29wZS4kd2F0Y2goYXR0ci5uZ1N0eWxlLCBmdW5jdGlvbiBuZ1N0eWxlV2F0Y2hBY3Rpb24obmV3U3R5bGVzLCBvbGRTdHlsZXMpIHsNCi0gICAgaWYgKG9sZFN0eWxlcyAmJiAobmV3U3R5bGVzICE9PSBvbGRTdHlsZXMpKSB7DQotICAgICAgZm9yRWFjaChvbGRTdHlsZXMsIGZ1bmN0aW9uKHZhbCwgc3R5bGUpIHsgZWxlbWVudC5jc3Moc3R5bGUsICcnKTt9KTsNCi0gICAgfQ0KLSAgICBpZiAobmV3U3R5bGVzKSBlbGVtZW50LmNzcyhuZXdTdHlsZXMpOw0KLSAgfSwgdHJ1ZSk7DQotfSk7DQotDQotLyoqDQotICogQG5nZG9jIGRpcmVjdGl2ZQ0KLSAqIEBuYW1lIG5nU3dpdGNoDQotICogQHJlc3RyaWN0IEVBDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBUaGUgYG5nU3dpdGNoYCBkaXJlY3RpdmUgaXMgdXNlZCB0byBjb25kaXRpb25hbGx5IHN3YXAgRE9NIHN0cnVjdHVyZSBvbiB5b3VyIHRlbXBsYXRlIGJhc2VkIG9uIGEgc2NvcGUgZXhwcmVzc2lvbi4NCi0gKiBFbGVtZW50cyB3aXRoaW4gYG5nU3dpdGNoYCBidXQgd2l0aG91dCBgbmdTd2l0Y2hXaGVuYCBvciBgbmdTd2l0Y2hEZWZhdWx0YCBkaXJlY3RpdmVzIHdpbGwgYmUgcHJlc2VydmVkIGF0IHRoZSBsb2NhdGlvbg0KLSAqIGFzIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUuDQotICoNCi0gKiBUaGUgZGlyZWN0aXZlIGl0c2VsZiB3b3JrcyBzaW1pbGFyIHRvIG5nSW5jbHVkZSwgaG93ZXZlciwgaW5zdGVhZCBvZiBkb3dubG9hZGluZyB0ZW1wbGF0ZSBjb2RlIChvciBsb2FkaW5nIGl0DQotICogZnJvbSB0aGUgdGVtcGxhdGUgY2FjaGUpLCBgbmdTd2l0Y2hgIHNpbXBseSBjaG9vc2VzIG9uZSBvZiB0aGUgbmVzdGVkIGVsZW1lbnRzIGFuZCBtYWtlcyBpdCB2aXNpYmxlIGJhc2VkIG9uIHdoaWNoIGVsZW1lbnQNCi0gKiBtYXRjaGVzIHRoZSB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBldmFsdWF0ZWQgZXhwcmVzc2lvbi4gSW4gb3RoZXIgd29yZHMsIHlvdSBkZWZpbmUgYSBjb250YWluZXIgZWxlbWVudA0KLSAqICh3aGVyZSB5b3UgcGxhY2UgdGhlIGRpcmVjdGl2ZSksIHBsYWNlIGFuIGV4cHJlc3Npb24gb24gdGhlICoqYG9uPSIuLi4iYCBhdHRyaWJ1dGUqKg0KLSAqIChvciB0aGUgKipgbmctc3dpdGNoPSIuLi4iYCBhdHRyaWJ1dGUqKiksIGRlZmluZSBhbnkgaW5uZXIgZWxlbWVudHMgaW5zaWRlIG9mIHRoZSBkaXJlY3RpdmUgYW5kIHBsYWNlDQotICogYSB3aGVuIGF0dHJpYnV0ZSBwZXIgZWxlbWVudC4gVGhlIHdoZW4gYXR0cmlidXRlIGlzIHVzZWQgdG8gaW5mb3JtIG5nU3dpdGNoIHdoaWNoIGVsZW1lbnQgdG8gZGlzcGxheSB3aGVuIHRoZSBvbg0KLSAqIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLiBJZiBhIG1hdGNoaW5nIGV4cHJlc3Npb24gaXMgbm90IGZvdW5kIHZpYSBhIHdoZW4gYXR0cmlidXRlIHRoZW4gYW4gZWxlbWVudCB3aXRoIHRoZSBkZWZhdWx0DQotICogYXR0cmlidXRlIGlzIGRpc3BsYXllZC4NCi0gKg0KLSAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPg0KLSAqIEJlIGF3YXJlIHRoYXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbWF0Y2ggYWdhaW5zdCBjYW5ub3QgYmUgZXhwcmVzc2lvbnMuIFRoZXkgYXJlIGludGVycHJldGVkDQotICogYXMgbGl0ZXJhbCBzdHJpbmcgdmFsdWVzIHRvIG1hdGNoIGFnYWluc3QuDQotICogRm9yIGV4YW1wbGUsICoqYG5nLXN3aXRjaC13aGVuPSJzb21lVmFsImAqKiB3aWxsIG1hdGNoIGFnYWluc3QgdGhlIHN0cmluZyBgInNvbWVWYWwiYCBub3QgYWdhaW5zdCB0aGUNCi0gKiB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBgJHNjb3BlLnNvbWVWYWxgLg0KLSAqIDwvZGl2Pg0KLQ0KLSAqIEBhbmltYXRpb25zDQotICogZW50ZXIgLSBoYXBwZW5zIGFmdGVyIHRoZSBuZ1N3aXRjaCBjb250ZW50cyBjaGFuZ2UgYW5kIHRoZSBtYXRjaGVkIGNoaWxkIGVsZW1lbnQgaXMgcGxhY2VkIGluc2lkZSB0aGUgY29udGFpbmVyDQotICogbGVhdmUgLSBoYXBwZW5zIGp1c3QgYWZ0ZXIgdGhlIG5nU3dpdGNoIGNvbnRlbnRzIGNoYW5nZSBhbmQganVzdCBiZWZvcmUgdGhlIGZvcm1lciBjb250ZW50cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBET00NCi0gKg0KLSAqIEB1c2FnZQ0KLSAqDQotICogYGBgDQotICogPEFOWSBuZy1zd2l0Y2g9ImV4cHJlc3Npb24iPg0KLSAqICAgPEFOWSBuZy1zd2l0Y2gtd2hlbj0ibWF0Y2hWYWx1ZTEiPi4uLjwvQU5ZPg0KLSAqICAgPEFOWSBuZy1zd2l0Y2gtd2hlbj0ibWF0Y2hWYWx1ZTIiPi4uLjwvQU5ZPg0KLSAqICAgPEFOWSBuZy1zd2l0Y2gtZGVmYXVsdD4uLi48L0FOWT4NCi0gKiA8L0FOWT4NCi0gKiBgYGANCi0gKg0KLSAqDQotICogQHNjb3BlDQotICogQHByaW9yaXR5IDEyMDANCi0gKiBAcGFyYW0geyp9IG5nU3dpdGNofG9uIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdCA8dHQ+bmctc3dpdGNoLXdoZW48L3R0Pi4NCi0gKiBPbiBjaGlsZCBlbGVtZW50cyBhZGQ6DQotICoNCi0gKiAqIGBuZ1N3aXRjaFdoZW5gOiB0aGUgY2FzZSBzdGF0ZW1lbnQgdG8gbWF0Y2ggYWdhaW5zdC4gSWYgbWF0Y2ggdGhlbiB0aGlzDQotICogICBjYXNlIHdpbGwgYmUgZGlzcGxheWVkLiBJZiB0aGUgc2FtZSBtYXRjaCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzLCBhbGwgdGhlDQotICogICBlbGVtZW50cyB3aWxsIGJlIGRpc3BsYXllZC4NCi0gKiAqIGBuZ1N3aXRjaERlZmF1bHRgOiB0aGUgZGVmYXVsdCBjYXNlIHdoZW4gbm8gb3RoZXIgY2FzZSBtYXRjaC4gSWYgdGhlcmUNCi0gKiAgIGFyZSBtdWx0aXBsZSBkZWZhdWx0IGNhc2VzLCBhbGwgb2YgdGhlbSB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIG5vIG90aGVyDQotICogICBjYXNlIG1hdGNoLg0KLSAqDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgPGV4YW1wbGUgbW9kdWxlPSJzd2l0Y2hFeGFtcGxlIiBkZXBzPSJhbmd1bGFyLWFuaW1hdGUuanMiIGFuaW1hdGlvbnM9InRydWUiPg0KLSAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4NCi0gICAgICAgIDxzZWxlY3QgbmctbW9kZWw9InNlbGVjdGlvbiIgbmctb3B0aW9ucz0iaXRlbSBmb3IgaXRlbSBpbiBpdGVtcyI+DQotICAgICAgICA8L3NlbGVjdD4NCi0gICAgICAgIDx0dD5zZWxlY3Rpb249e3tzZWxlY3Rpb259fTwvdHQ+DQotICAgICAgICA8aHIvPg0KLSAgICAgICAgPGRpdiBjbGFzcz0iYW5pbWF0ZS1zd2l0Y2gtY29udGFpbmVyIg0KLSAgICAgICAgICBuZy1zd2l0Y2ggb249InNlbGVjdGlvbiI+DQotICAgICAgICAgICAgPGRpdiBjbGFzcz0iYW5pbWF0ZS1zd2l0Y2giIG5nLXN3aXRjaC13aGVuPSJzZXR0aW5ncyI+U2V0dGluZ3MgRGl2PC9kaXY+DQotICAgICAgICAgICAgPGRpdiBjbGFzcz0iYW5pbWF0ZS1zd2l0Y2giIG5nLXN3aXRjaC13aGVuPSJob21lIj5Ib21lIFNwYW48L2Rpdj4NCi0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJhbmltYXRlLXN3aXRjaCIgbmctc3dpdGNoLWRlZmF1bHQ+ZGVmYXVsdDwvZGl2Pg0KLSAgICAgICAgPC9kaXY+DQotICAgICAgPC9kaXY+DQotICAgIDwvZmlsZT4NCi0gICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4NCi0gICAgICBhbmd1bGFyLm1vZHVsZSgnc3dpdGNoRXhhbXBsZScsIFsnbmdBbmltYXRlJ10pDQotICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgew0KLSAgICAgICAgICAkc2NvcGUuaXRlbXMgPSBbJ3NldHRpbmdzJywgJ2hvbWUnLCAnb3RoZXInXTsNCi0gICAgICAgICAgJHNjb3BlLnNlbGVjdGlvbiA9ICRzY29wZS5pdGVtc1swXTsNCi0gICAgICAgIH1dKTsNCi0gICAgPC9maWxlPg0KLSAgICA8ZmlsZSBuYW1lPSJhbmltYXRpb25zLmNzcyI+DQotICAgICAgLmFuaW1hdGUtc3dpdGNoLWNvbnRhaW5lciB7DQotICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTsNCi0gICAgICAgIGJhY2tncm91bmQ6d2hpdGU7DQotICAgICAgICBib3JkZXI6MXB4IHNvbGlkIGJsYWNrOw0KLSAgICAgICAgaGVpZ2h0OjQwcHg7DQotICAgICAgICBvdmVyZmxvdzpoaWRkZW47DQotICAgICAgfQ0KLQ0KLSAgICAgIC5hbmltYXRlLXN3aXRjaCB7DQotICAgICAgICBwYWRkaW5nOjEwcHg7DQotICAgICAgfQ0KLQ0KLSAgICAgIC5hbmltYXRlLXN3aXRjaC5uZy1hbmltYXRlIHsNCi0gICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzOw0KLSAgICAgICAgdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzOw0KLQ0KLSAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7DQotICAgICAgICB0b3A6MDsNCi0gICAgICAgIGxlZnQ6MDsNCi0gICAgICAgIHJpZ2h0OjA7DQotICAgICAgICBib3R0b206MDsNCi0gICAgICB9DQotDQotICAgICAgLmFuaW1hdGUtc3dpdGNoLm5nLWxlYXZlLm5nLWxlYXZlLWFjdGl2ZSwNCi0gICAgICAuYW5pbWF0ZS1zd2l0Y2gubmctZW50ZXIgew0KLSAgICAgICAgdG9wOi01MHB4Ow0KLSAgICAgIH0NCi0gICAgICAuYW5pbWF0ZS1zd2l0Y2gubmctbGVhdmUsDQotICAgICAgLmFuaW1hdGUtc3dpdGNoLm5nLWVudGVyLm5nLWVudGVyLWFjdGl2ZSB7DQotICAgICAgICB0b3A6MDsNCi0gICAgICB9DQotICAgIDwvZmlsZT4NCi0gICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgdmFyIHN3aXRjaEVsZW0gPSBlbGVtZW50KGJ5LmNzcygnW25nLXN3aXRjaF0nKSk7DQotICAgICAgdmFyIHNlbGVjdCA9IGVsZW1lbnQoYnkubW9kZWwoJ3NlbGVjdGlvbicpKTsNCi0NCi0gICAgICBpdCgnc2hvdWxkIHN0YXJ0IGluIHNldHRpbmdzJywgZnVuY3Rpb24oKSB7DQotICAgICAgICBleHBlY3Qoc3dpdGNoRWxlbS5nZXRUZXh0KCkpLnRvTWF0Y2goL1NldHRpbmdzIERpdi8pOw0KLSAgICAgIH0pOw0KLSAgICAgIGl0KCdzaG91bGQgY2hhbmdlIHRvIGhvbWUnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgIHNlbGVjdC5hbGwoYnkuY3NzKCdvcHRpb24nKSkuZ2V0KDEpLmNsaWNrKCk7DQotICAgICAgICBleHBlY3Qoc3dpdGNoRWxlbS5nZXRUZXh0KCkpLnRvTWF0Y2goL0hvbWUgU3Bhbi8pOw0KLSAgICAgIH0pOw0KLSAgICAgIGl0KCdzaG91bGQgc2VsZWN0IGRlZmF1bHQnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgIHNlbGVjdC5hbGwoYnkuY3NzKCdvcHRpb24nKSkuZ2V0KDIpLmNsaWNrKCk7DQotICAgICAgICBleHBlY3Qoc3dpdGNoRWxlbS5nZXRUZXh0KCkpLnRvTWF0Y2goL2RlZmF1bHQvKTsNCi0gICAgICB9KTsNCi0gICAgPC9maWxlPg0KLSAgPC9leGFtcGxlPg0KLSAqLw0KLXZhciBuZ1N3aXRjaERpcmVjdGl2ZSA9IFsnJGFuaW1hdGUnLCBmdW5jdGlvbigkYW5pbWF0ZSkgew0KLSAgcmV0dXJuIHsNCi0gICAgcmVzdHJpY3Q6ICdFQScsDQotICAgIHJlcXVpcmU6ICduZ1N3aXRjaCcsDQotDQotICAgIC8vIGFza3MgZm9yICRzY29wZSB0byBmb29sIHRoZSBCQyBjb250cm9sbGVyIG1vZHVsZQ0KLSAgICBjb250cm9sbGVyOiBbJyRzY29wZScsIGZ1bmN0aW9uIG5nU3dpdGNoQ29udHJvbGxlcigpIHsNCi0gICAgIHRoaXMuY2FzZXMgPSB7fTsNCi0gICAgfV0sDQotICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBuZ1N3aXRjaENvbnRyb2xsZXIpIHsNCi0gICAgICB2YXIgd2F0Y2hFeHByID0gYXR0ci5uZ1N3aXRjaCB8fCBhdHRyLm9uLA0KLSAgICAgICAgICBzZWxlY3RlZFRyYW5zY2x1ZGVzID0gW10sDQotICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMgPSBbXSwNCi0gICAgICAgICAgcHJldmlvdXNMZWF2ZUFuaW1hdGlvbnMgPSBbXSwNCi0gICAgICAgICAgc2VsZWN0ZWRTY29wZXMgPSBbXTsNCi0NCi0gICAgICB2YXIgc3BsaWNlRmFjdG9yeSA9IGZ1bmN0aW9uKGFycmF5LCBpbmRleCkgew0KLSAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7IGFycmF5LnNwbGljZShpbmRleCwgMSk7IH07DQotICAgICAgfTsNCi0NCi0gICAgICBzY29wZS4kd2F0Y2god2F0Y2hFeHByLCBmdW5jdGlvbiBuZ1N3aXRjaFdhdGNoQWN0aW9uKHZhbHVlKSB7DQotICAgICAgICB2YXIgaSwgaWk7DQotICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHByZXZpb3VzTGVhdmVBbmltYXRpb25zLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsNCi0gICAgICAgICAgJGFuaW1hdGUuY2FuY2VsKHByZXZpb3VzTGVhdmVBbmltYXRpb25zW2ldKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByZXZpb3VzTGVhdmVBbmltYXRpb25zLmxlbmd0aCA9IDA7DQotDQotICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHNlbGVjdGVkU2NvcGVzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsNCi0gICAgICAgICAgdmFyIHNlbGVjdGVkID0gZ2V0QmxvY2tOb2RlcyhzZWxlY3RlZEVsZW1lbnRzW2ldLmNsb25lKTsNCi0gICAgICAgICAgc2VsZWN0ZWRTY29wZXNbaV0uJGRlc3Ryb3koKTsNCi0gICAgICAgICAgdmFyIHByb21pc2UgPSBwcmV2aW91c0xlYXZlQW5pbWF0aW9uc1tpXSA9ICRhbmltYXRlLmxlYXZlKHNlbGVjdGVkKTsNCi0gICAgICAgICAgcHJvbWlzZS50aGVuKHNwbGljZUZhY3RvcnkocHJldmlvdXNMZWF2ZUFuaW1hdGlvbnMsIGkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID0gMDsNCi0gICAgICAgIHNlbGVjdGVkU2NvcGVzLmxlbmd0aCA9IDA7DQotDQotICAgICAgICBpZiAoKHNlbGVjdGVkVHJhbnNjbHVkZXMgPSBuZ1N3aXRjaENvbnRyb2xsZXIuY2FzZXNbJyEnICsgdmFsdWVdIHx8IG5nU3dpdGNoQ29udHJvbGxlci5jYXNlc1snPyddKSkgew0KLSAgICAgICAgICBmb3JFYWNoKHNlbGVjdGVkVHJhbnNjbHVkZXMsIGZ1bmN0aW9uKHNlbGVjdGVkVHJhbnNjbHVkZSkgew0KLSAgICAgICAgICAgIHNlbGVjdGVkVHJhbnNjbHVkZS50cmFuc2NsdWRlKGZ1bmN0aW9uKGNhc2VFbGVtZW50LCBzZWxlY3RlZFNjb3BlKSB7DQotICAgICAgICAgICAgICBzZWxlY3RlZFNjb3Blcy5wdXNoKHNlbGVjdGVkU2NvcGUpOw0KLSAgICAgICAgICAgICAgdmFyIGFuY2hvciA9IHNlbGVjdGVkVHJhbnNjbHVkZS5lbGVtZW50Ow0KLSAgICAgICAgICAgICAgY2FzZUVsZW1lbnRbY2FzZUVsZW1lbnQubGVuZ3RoKytdID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnIGVuZCBuZ1N3aXRjaFdoZW46ICcpOw0KLSAgICAgICAgICAgICAgdmFyIGJsb2NrID0geyBjbG9uZTogY2FzZUVsZW1lbnQgfTsNCi0NCi0gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMucHVzaChibG9jayk7DQotICAgICAgICAgICAgICAkYW5pbWF0ZS5lbnRlcihjYXNlRWxlbWVudCwgYW5jaG9yLnBhcmVudCgpLCBhbmNob3IpOw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0gICAgICB9KTsNCi0gICAgfQ0KLSAgfTsNCi19XTsNCi0NCi12YXIgbmdTd2l0Y2hXaGVuRGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoew0KLSAgdHJhbnNjbHVkZTogJ2VsZW1lbnQnLA0KLSAgcHJpb3JpdHk6IDEyMDAsDQotICByZXF1aXJlOiAnXm5nU3dpdGNoJywNCi0gIG11bHRpRWxlbWVudDogdHJ1ZSwNCi0gIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY3RybCwgJHRyYW5zY2x1ZGUpIHsNCi0gICAgY3RybC5jYXNlc1snIScgKyBhdHRycy5uZ1N3aXRjaFdoZW5dID0gKGN0cmwuY2FzZXNbJyEnICsgYXR0cnMubmdTd2l0Y2hXaGVuXSB8fCBbXSk7DQotICAgIGN0cmwuY2FzZXNbJyEnICsgYXR0cnMubmdTd2l0Y2hXaGVuXS5wdXNoKHsgdHJhbnNjbHVkZTogJHRyYW5zY2x1ZGUsIGVsZW1lbnQ6IGVsZW1lbnQgfSk7DQotICB9DQotfSk7DQotDQotdmFyIG5nU3dpdGNoRGVmYXVsdERpcmVjdGl2ZSA9IG5nRGlyZWN0aXZlKHsNCi0gIHRyYW5zY2x1ZGU6ICdlbGVtZW50JywNCi0gIHByaW9yaXR5OiAxMjAwLA0KLSAgcmVxdWlyZTogJ15uZ1N3aXRjaCcsDQotICBtdWx0aUVsZW1lbnQ6IHRydWUsDQotICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHRyYW5zY2x1ZGUpIHsNCi0gICAgY3RybC5jYXNlc1snPyddID0gKGN0cmwuY2FzZXNbJz8nXSB8fCBbXSk7DQotICAgIGN0cmwuY2FzZXNbJz8nXS5wdXNoKHsgdHJhbnNjbHVkZTogJHRyYW5zY2x1ZGUsIGVsZW1lbnQ6IGVsZW1lbnQgfSk7DQotICAgfQ0KLX0pOw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBuZ1RyYW5zY2x1ZGUNCi0gKiBAcmVzdHJpY3QgRUFDDQotICoNCi0gKiBAZGVzY3JpcHRpb24NCi0gKiBEaXJlY3RpdmUgdGhhdCBtYXJrcyB0aGUgaW5zZXJ0aW9uIHBvaW50IGZvciB0aGUgdHJhbnNjbHVkZWQgRE9NIG9mIHRoZSBuZWFyZXN0IHBhcmVudCBkaXJlY3RpdmUgdGhhdCB1c2VzIHRyYW5zY2x1c2lvbi4NCi0gKg0KLSAqIEFueSBleGlzdGluZyBjb250ZW50IG9mIHRoZSBlbGVtZW50IHRoYXQgdGhpcyBkaXJlY3RpdmUgaXMgcGxhY2VkIG9uIHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIHRyYW5zY2x1ZGVkIGNvbnRlbnQgaXMgaW5zZXJ0ZWQuDQotICoNCi0gKiBAZWxlbWVudCBBTlkNCi0gKg0KLSAqIEBleGFtcGxlDQotICAgPGV4YW1wbGUgbW9kdWxlPSJ0cmFuc2NsdWRlRXhhbXBsZSI+DQotICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICAgPHNjcmlwdD4NCi0gICAgICAgICBhbmd1bGFyLm1vZHVsZSgndHJhbnNjbHVkZUV4YW1wbGUnLCBbXSkNCi0gICAgICAgICAgLmRpcmVjdGl2ZSgncGFuZScsIGZ1bmN0aW9uKCl7DQotICAgICAgICAgICAgIHJldHVybiB7DQotICAgICAgICAgICAgICAgcmVzdHJpY3Q6ICdFJywNCi0gICAgICAgICAgICAgICB0cmFuc2NsdWRlOiB0cnVlLA0KLSAgICAgICAgICAgICAgIHNjb3BlOiB7IHRpdGxlOidAJyB9LA0KLSAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnPGRpdiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4nICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogZ3JheSI+e3t0aXRsZX19PC9kaXY+JyArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxuZy10cmFuc2NsdWRlPjwvbmctdHJhbnNjbHVkZT4nICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicNCi0gICAgICAgICAgICAgfTsNCi0gICAgICAgICB9KQ0KLSAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgICAkc2NvcGUudGl0bGUgPSAnTG9yZW0gSXBzdW0nOw0KLSAgICAgICAgICAgJHNjb3BlLnRleHQgPSAnTmVxdWUgcG9ycm8gcXVpc3F1YW0gZXN0IHF1aSBkb2xvcmVtIGlwc3VtIHF1aWEgZG9sb3IuLi4nOw0KLSAgICAgICAgIH1dKTsNCi0gICAgICAgPC9zY3JpcHQ+DQotICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD0idGl0bGUiPiA8YnIvPg0KLSAgICAgICAgIDx0ZXh0YXJlYSBuZy1tb2RlbD0idGV4dCI+PC90ZXh0YXJlYT4gPGJyLz4NCi0gICAgICAgICA8cGFuZSB0aXRsZT0ie3t0aXRsZX19Ij57e3RleHR9fTwvcGFuZT4NCi0gICAgICAgPC9kaXY+DQotICAgICA8L2ZpbGU+DQotICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4NCi0gICAgICAgIGl0KCdzaG91bGQgaGF2ZSB0cmFuc2NsdWRlZCcsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZWxlbWVudChieS5tb2RlbCgndGl0bGUnKSk7DQotICAgICAgICAgIHRpdGxlRWxlbWVudC5jbGVhcigpOw0KLSAgICAgICAgICB0aXRsZUVsZW1lbnQuc2VuZEtleXMoJ1RJVExFJyk7DQotICAgICAgICAgIHZhciB0ZXh0RWxlbWVudCA9IGVsZW1lbnQoYnkubW9kZWwoJ3RleHQnKSk7DQotICAgICAgICAgIHRleHRFbGVtZW50LmNsZWFyKCk7DQotICAgICAgICAgIHRleHRFbGVtZW50LnNlbmRLZXlzKCdURVhUJyk7DQotICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3RpdGxlJykpLmdldFRleHQoKSkudG9FcXVhbCgnVElUTEUnKTsNCi0gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygndGV4dCcpKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1RFWFQnKTsNCi0gICAgICAgIH0pOw0KLSAgICAgPC9maWxlPg0KLSAgIDwvZXhhbXBsZT4NCi0gKg0KLSAqLw0KLXZhciBuZ1RyYW5zY2x1ZGVEaXJlY3RpdmUgPSBuZ0RpcmVjdGl2ZSh7DQotICByZXN0cmljdDogJ0VBQycsDQotICBsaW5rOiBmdW5jdGlvbigkc2NvcGUsICRlbGVtZW50LCAkYXR0cnMsIGNvbnRyb2xsZXIsICR0cmFuc2NsdWRlKSB7DQotICAgIGlmICghJHRyYW5zY2x1ZGUpIHsNCi0gICAgICB0aHJvdyBtaW5FcnIoJ25nVHJhbnNjbHVkZScpKCdvcnBoYW4nLA0KLSAgICAgICAnSWxsZWdhbCB1c2Ugb2YgbmdUcmFuc2NsdWRlIGRpcmVjdGl2ZSBpbiB0aGUgdGVtcGxhdGUhICcgKw0KLSAgICAgICAnTm8gcGFyZW50IGRpcmVjdGl2ZSB0aGF0IHJlcXVpcmVzIGEgdHJhbnNjbHVzaW9uIGZvdW5kLiAnICsNCi0gICAgICAgJ0VsZW1lbnQ6IHswfScsDQotICAgICAgIHN0YXJ0aW5nVGFnKCRlbGVtZW50KSk7DQotICAgIH0NCi0NCi0gICAgJHRyYW5zY2x1ZGUoZnVuY3Rpb24oY2xvbmUpIHsNCi0gICAgICAkZWxlbWVudC5lbXB0eSgpOw0KLSAgICAgICRlbGVtZW50LmFwcGVuZChjbG9uZSk7DQotICAgIH0pOw0KLSAgfQ0KLX0pOw0KLQ0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBzY3JpcHQNCi0gKiBAcmVzdHJpY3QgRQ0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogTG9hZCB0aGUgY29udGVudCBvZiBhIGA8c2NyaXB0PmAgZWxlbWVudCBpbnRvIHtAbGluayBuZy4kdGVtcGxhdGVDYWNoZSBgJHRlbXBsYXRlQ2FjaGVgfSwgc28gdGhhdCB0aGUNCi0gKiB0ZW1wbGF0ZSBjYW4gYmUgdXNlZCBieSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nSW5jbHVkZSBgbmdJbmNsdWRlYH0sDQotICoge0BsaW5rIG5nUm91dGUuZGlyZWN0aXZlOm5nVmlldyBgbmdWaWV3YH0sIG9yIHtAbGluayBndWlkZS9kaXJlY3RpdmUgZGlyZWN0aXZlc30uIFRoZSB0eXBlIG9mIHRoZQ0KLSAqIGA8c2NyaXB0PmAgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBhcyBgdGV4dC9uZy10ZW1wbGF0ZWAsIGFuZCBhIGNhY2hlIG5hbWUgZm9yIHRoZSB0ZW1wbGF0ZSBtdXN0IGJlDQotICogYXNzaWduZWQgdGhyb3VnaCB0aGUgZWxlbWVudCdzIGBpZGAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgYXMgYSBkaXJlY3RpdmUncyBgdGVtcGxhdGVVcmxgLg0KLSAqDQotICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgTXVzdCBiZSBzZXQgdG8gYCd0ZXh0L25nLXRlbXBsYXRlJ2AuDQotICogQHBhcmFtIHtzdHJpbmd9IGlkIENhY2hlIG5hbWUgb2YgdGhlIHRlbXBsYXRlLg0KLSAqDQotICogQGV4YW1wbGUNCi0gIDxleGFtcGxlPg0KLSAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4NCi0gICAgICA8c2NyaXB0IHR5cGU9InRleHQvbmctdGVtcGxhdGUiIGlkPSIvdHBsLmh0bWwiPg0KLSAgICAgICAgQ29udGVudCBvZiB0aGUgdGVtcGxhdGUuDQotICAgICAgPC9zY3JpcHQ+DQotDQotICAgICAgPGEgbmctY2xpY2s9ImN1cnJlbnRUcGw9Jy90cGwuaHRtbCciIGlkPSJ0cGwtbGluayI+TG9hZCBpbmxpbmVkIHRlbXBsYXRlPC9hPg0KLSAgICAgIDxkaXYgaWQ9InRwbC1jb250ZW50IiBuZy1pbmNsdWRlIHNyYz0iY3VycmVudFRwbCI+PC9kaXY+DQotICAgIDwvZmlsZT4NCi0gICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+DQotICAgICAgaXQoJ3Nob3VsZCBsb2FkIHRlbXBsYXRlIGRlZmluZWQgaW5zaWRlIHNjcmlwdCB0YWcnLCBmdW5jdGlvbigpIHsNCi0gICAgICAgIGVsZW1lbnQoYnkuY3NzKCcjdHBsLWxpbmsnKSkuY2xpY2soKTsNCi0gICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnI3RwbC1jb250ZW50JykpLmdldFRleHQoKSkudG9NYXRjaCgvQ29udGVudCBvZiB0aGUgdGVtcGxhdGUvKTsNCi0gICAgICB9KTsNCi0gICAgPC9maWxlPg0KLSAgPC9leGFtcGxlPg0KLSAqLw0KLXZhciBzY3JpcHREaXJlY3RpdmUgPSBbJyR0ZW1wbGF0ZUNhY2hlJywgZnVuY3Rpb24oJHRlbXBsYXRlQ2FjaGUpIHsNCi0gIHJldHVybiB7DQotICAgIHJlc3RyaWN0OiAnRScsDQotICAgIHRlcm1pbmFsOiB0cnVlLA0KLSAgICBjb21waWxlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyKSB7DQotICAgICAgaWYgKGF0dHIudHlwZSA9PSAndGV4dC9uZy10ZW1wbGF0ZScpIHsNCi0gICAgICAgIHZhciB0ZW1wbGF0ZVVybCA9IGF0dHIuaWQsDQotICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRbMF0udGV4dDsNCi0NCi0gICAgICAgICR0ZW1wbGF0ZUNhY2hlLnB1dCh0ZW1wbGF0ZVVybCwgdGV4dCk7DQotICAgICAgfQ0KLSAgICB9DQotICB9Ow0KLX1dOw0KLQ0KLXZhciBuZ09wdGlvbnNNaW5FcnIgPSBtaW5FcnIoJ25nT3B0aW9ucycpOw0KLS8qKg0KLSAqIEBuZ2RvYyBkaXJlY3RpdmUNCi0gKiBAbmFtZSBzZWxlY3QNCi0gKiBAcmVzdHJpY3QgRQ0KLSAqDQotICogQGRlc2NyaXB0aW9uDQotICogSFRNTCBgU0VMRUNUYCBlbGVtZW50IHdpdGggYW5ndWxhciBkYXRhLWJpbmRpbmcuDQotICoNCi0gKiAjIGBuZ09wdGlvbnNgDQotICoNCi0gKiBUaGUgYG5nT3B0aW9uc2AgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIGR5bmFtaWNhbGx5IGdlbmVyYXRlIGEgbGlzdCBvZiBgPG9wdGlvbj5gDQotICogZWxlbWVudHMgZm9yIHRoZSBgPHNlbGVjdD5gIGVsZW1lbnQgdXNpbmcgdGhlIGFycmF5IG9yIG9iamVjdCBvYnRhaW5lZCBieSBldmFsdWF0aW5nIHRoZQ0KLSAqIGBuZ09wdGlvbnNgIGNvbXByZWhlbnNpb24gZXhwcmVzc2lvbi4NCi0gKg0KLSAqIEluIG1hbnkgY2FzZXMsIGBuZ1JlcGVhdGAgY2FuIGJlIHVzZWQgb24gYDxvcHRpb24+YCBlbGVtZW50cyBpbnN0ZWFkIG9mIGBuZ09wdGlvbnNgIHRvIGFjaGlldmUgYQ0KLSAqIHNpbWlsYXIgcmVzdWx0LiBIb3dldmVyLCBgbmdPcHRpb25zYCBwcm92aWRlcyBzb21lIGJlbmVmaXRzIHN1Y2ggYXMgcmVkdWNpbmcgbWVtb3J5IGFuZA0KLSAqIGluY3JlYXNpbmcgc3BlZWQgYnkgbm90IGNyZWF0aW5nIGEgbmV3IHNjb3BlIGZvciBlYWNoIHJlcGVhdGVkIGluc3RhbmNlLCBhcyB3ZWxsIGFzIHByb3ZpZGluZw0KLSAqIG1vcmUgZmxleGliaWxpdHkgaW4gaG93IHRoZSBgPHNlbGVjdD5gJ3MgbW9kZWwgaXMgYXNzaWduZWQgdmlhIHRoZSBgc2VsZWN0YCAqKmBhc2AqKiBwYXJ0IG9mIHRoZQ0KLSAqIGNvbXByZWhlbnNpb24gZXhwcmVzc2lvbi4gYG5nT3B0aW9uc2Agc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgYDxzZWxlY3Q+YCBtb2RlbCBuZWVkcyB0byBiZSBib3VuZA0KLSAqICB0byBhIG5vbi1zdHJpbmcgdmFsdWUuIFRoaXMgaXMgYmVjYXVzZSBhbiBvcHRpb24gZWxlbWVudCBjYW4gb25seSBiZSBib3VuZCB0byBzdHJpbmcgdmFsdWVzIGF0DQotICogcHJlc2VudC4NCi0gKg0KLSAqIFdoZW4gYW4gaXRlbSBpbiB0aGUgYDxzZWxlY3Q+YCBtZW51IGlzIHNlbGVjdGVkLCB0aGUgYXJyYXkgZWxlbWVudCBvciBvYmplY3QgcHJvcGVydHkNCi0gKiByZXByZXNlbnRlZCBieSB0aGUgc2VsZWN0ZWQgb3B0aW9uIHdpbGwgYmUgYm91bmQgdG8gdGhlIG1vZGVsIGlkZW50aWZpZWQgYnkgdGhlIGBuZ01vZGVsYA0KLSAqIGRpcmVjdGl2ZS4NCi0gKg0KLSAqIE9wdGlvbmFsbHksIGEgc2luZ2xlIGhhcmQtY29kZWQgYDxvcHRpb24+YCBlbGVtZW50LCB3aXRoIHRoZSB2YWx1ZSBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLCBjYW4NCi0gKiBiZSBuZXN0ZWQgaW50byB0aGUgYDxzZWxlY3Q+YCBlbGVtZW50LiBUaGlzIGVsZW1lbnQgd2lsbCB0aGVuIHJlcHJlc2VudCB0aGUgYG51bGxgIG9yICJub3Qgc2VsZWN0ZWQiDQotICogb3B0aW9uLiBTZWUgZXhhbXBsZSBiZWxvdyBmb3IgZGVtb25zdHJhdGlvbi4NCi0gKg0KLSAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPg0KLSAqICoqTm90ZToqKiBgbmdNb2RlbGAgY29tcGFyZXMgYnkgcmVmZXJlbmNlLCBub3QgdmFsdWUuIFRoaXMgaXMgaW1wb3J0YW50IHdoZW4gYmluZGluZyB0byBhbg0KLSAqIGFycmF5IG9mIG9iamVjdHMuIFNlZSBhbiBleGFtcGxlIFtpbiB0aGlzIGpzZmlkZGxlXShodHRwOi8vanNmaWRkbGUubmV0L3FXelRiLykuDQotICogPC9kaXY+DQotICoNCi0gKiAjIyBgc2VsZWN0YCAqKmBhc2AqKg0KLSAqDQotICogVXNpbmcgYHNlbGVjdGAgKipgYXNgKiogd2lsbCBiaW5kIHRoZSByZXN1bHQgb2YgdGhlIGBzZWxlY3RgIGV4cHJlc3Npb24gdG8gdGhlIG1vZGVsLCBidXQNCi0gKiB0aGUgdmFsdWUgb2YgdGhlIGA8c2VsZWN0PmAgYW5kIGA8b3B0aW9uPmAgaHRtbCBlbGVtZW50cyB3aWxsIGJlIGVpdGhlciB0aGUgaW5kZXggKGZvciBhcnJheSBkYXRhIHNvdXJjZXMpDQotICogb3IgcHJvcGVydHkgbmFtZSAoZm9yIG9iamVjdCBkYXRhIHNvdXJjZXMpIG9mIHRoZSB2YWx1ZSB3aXRoaW4gdGhlIGNvbGxlY3Rpb24uIElmIGEgKipgdHJhY2sgYnlgKiogZXhwcmVzc2lvbg0KLSAqIGlzIHVzZWQsIHRoZSByZXN1bHQgb2YgdGhhdCBleHByZXNzaW9uIHdpbGwgYmUgc2V0IGFzIHRoZSB2YWx1ZSBvZiB0aGUgYG9wdGlvbmAgYW5kIGBzZWxlY3RgIGVsZW1lbnRzLg0KLSAqDQotICoNCi0gKiAjIyMgYHNlbGVjdGAgKipgYXNgKiogYW5kICoqYHRyYWNrIGJ5YCoqDQotICoNCi0gKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC13YXJuaW5nIj4NCi0gKiBEbyBub3QgdXNlIGBzZWxlY3RgICoqYGFzYCoqIGFuZCAqKmB0cmFjayBieWAqKiBpbiB0aGUgc2FtZSBleHByZXNzaW9uLiBUaGV5IGFyZSBub3QgZGVzaWduZWQgdG8gd29yayB0b2dldGhlci4NCi0gKiA8L2Rpdj4NCi0gKg0KLSAqIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToNCi0gKg0KLSAqIGBgYGh0bWwNCi0gKiA8c2VsZWN0IG5nLW9wdGlvbnM9Iml0ZW0uc3ViSXRlbSBhcyBpdGVtLmxhYmVsIGZvciBpdGVtIGluIHZhbHVlcyB0cmFjayBieSBpdGVtLmlkIiBuZy1tb2RlbD0ic2VsZWN0ZWQiPg0KLSAqIGBgYA0KLSAqDQotICogYGBganMNCi0gKiAkc2NvcGUudmFsdWVzID0gW3sNCi0gKiAgIGlkOiAxLA0KLSAqICAgbGFiZWw6ICdhTGFiZWwnLA0KLSAqICAgc3ViSXRlbTogeyBuYW1lOiAnYVN1Ykl0ZW0nIH0NCi0gKiB9LCB7DQotICogICBpZDogMiwNCi0gKiAgIGxhYmVsOiAnYkxhYmVsJywNCi0gKiAgIHN1Ykl0ZW06IHsgbmFtZTogJ2JTdWJJdGVtJyB9DQotICogfV07DQotICoNCi0gKiAkc2NvcGUuc2VsZWN0ZWQgPSB7IG5hbWU6ICdhU3ViSXRlbScgfTsNCi0gKiBgYGANCi0gKg0KLSAqIFdpdGggdGhlIHB1cnBvc2Ugb2YgcHJlc2VydmluZyB0aGUgc2VsZWN0aW9uLCB0aGUgKipgdHJhY2sgYnlgKiogZXhwcmVzc2lvbiBpcyBhbHdheXMgYXBwbGllZCB0byB0aGUgZWxlbWVudA0KLSAqIG9mIHRoZSBkYXRhIHNvdXJjZSAodG8gYGl0ZW1gIGluIHRoaXMgZXhhbXBsZSkuIFRvIGNhbGN1bGF0ZSB3aGV0aGVyIGFuIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHdlIGRvIHRoZQ0KLSAqIGZvbGxvd2luZzoNCi0gKg0KLSAqIDEuIEFwcGx5ICoqYHRyYWNrIGJ5YCoqIHRvIHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkuIEluIHRoZSBleGFtcGxlOiBgWzEsIDJdYA0KLSAqIDIuIEFwcGx5ICoqYHRyYWNrIGJ5YCoqIHRvIHRoZSBhbHJlYWR5IHNlbGVjdGVkIHZhbHVlIGluIGBuZ01vZGVsYC4NCi0gKiAgICBJbiB0aGUgZXhhbXBsZTogdGhpcyBpcyBub3QgcG9zc2libGUgYXMgKipgdHJhY2sgYnlgKiogcmVmZXJzIHRvIGBpdGVtLmlkYCwgYnV0IHRoZSBzZWxlY3RlZA0KLSAqICAgIHZhbHVlIGZyb20gYG5nTW9kZWxgIGlzIGB7bmFtZTogJ2FTdWJJdGVtJ31gLCBzbyB0aGUgKipgdHJhY2sgYnlgKiogZXhwcmVzc2lvbiBpcyBhcHBsaWVkIHRvDQotICogICAgYSB3cm9uZyBvYmplY3QsIHRoZSBzZWxlY3RlZCBlbGVtZW50IGNhbid0IGJlIGZvdW5kLCBgPHNlbGVjdD5gIGlzIGFsd2F5cyByZXNldCB0byB0aGUgIm5vdA0KLSAqICAgIHNlbGVjdGVkIiBvcHRpb24uDQotICoNCi0gKg0KLSAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4NCi0gKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuDQotICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBUaGUgY29udHJvbCBpcyBjb25zaWRlcmVkIHZhbGlkIG9ubHkgaWYgdmFsdWUgaXMgZW50ZXJlZC4NCi0gKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG8NCi0gKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZg0KLSAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLg0KLSAqIEBwYXJhbSB7Y29tcHJlaGVuc2lvbl9leHByZXNzaW9uPX0gbmdPcHRpb25zIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOg0KLSAqDQotICogICAqIGZvciBhcnJheSBkYXRhIHNvdXJjZXM6DQotICogICAgICogYGxhYmVsYCAqKmBmb3JgKiogYHZhbHVlYCAqKmBpbmAqKiBgYXJyYXlgDQotICogICAgICogYHNlbGVjdGAgKipgYXNgKiogYGxhYmVsYCAqKmBmb3JgKiogYHZhbHVlYCAqKmBpbmAqKiBgYXJyYXlgDQotICogICAgICogYGxhYmVsYCAqKmBncm91cCBieWAqKiBgZ3JvdXBgICoqYGZvcmAqKiBgdmFsdWVgICoqYGluYCoqIGBhcnJheWANCi0gKiAgICAgKiBgbGFiZWxgICoqYGdyb3VwIGJ5YCoqIGBncm91cGAgKipgZm9yYCoqIGB2YWx1ZWAgKipgaW5gKiogYGFycmF5YCAqKmB0cmFjayBieWAqKiBgdHJhY2tleHByYA0KLSAqICAgICAqIGBsYWJlbGAgKipgZm9yYCoqIGB2YWx1ZWAgKipgaW5gKiogYGFycmF5YCB8IG9yZGVyQnk6YG9yZGVyZXhwcmAgKipgdHJhY2sgYnlgKiogYHRyYWNrZXhwcmANCi0gKiAgICAgICAgKGZvciBpbmNsdWRpbmcgYSBmaWx0ZXIgd2l0aCBgdHJhY2sgYnlgKQ0KLSAqICAgKiBmb3Igb2JqZWN0IGRhdGEgc291cmNlczoNCi0gKiAgICAgKiBgbGFiZWxgICoqYGZvciAoYCoqYGtleWAgKipgLGAqKiBgdmFsdWVgKipgKSBpbmAqKiBgb2JqZWN0YA0KLSAqICAgICAqIGBzZWxlY3RgICoqYGFzYCoqIGBsYWJlbGAgKipgZm9yIChgKipga2V5YCAqKmAsYCoqIGB2YWx1ZWAqKmApIGluYCoqIGBvYmplY3RgDQotICogICAgICogYGxhYmVsYCAqKmBncm91cCBieWAqKiBgZ3JvdXBgICoqYGZvciAoYCoqYGtleWAqKmAsYCoqIGB2YWx1ZWAqKmApIGluYCoqIGBvYmplY3RgDQotICogICAgICogYHNlbGVjdGAgKipgYXNgKiogYGxhYmVsYCAqKmBncm91cCBieWAqKiBgZ3JvdXBgDQotICogICAgICAgICAqKmBmb3JgIGAoYCoqYGtleWAqKmAsYCoqIGB2YWx1ZWAqKmApIGluYCoqIGBvYmplY3RgDQotICoNCi0gKiBXaGVyZToNCi0gKg0KLSAqICAgKiBgYXJyYXlgIC8gYG9iamVjdGA6IGFuIGV4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGVzIHRvIGFuIGFycmF5IC8gb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4NCi0gKiAgICogYHZhbHVlYDogbG9jYWwgdmFyaWFibGUgd2hpY2ggd2lsbCByZWZlciB0byBlYWNoIGl0ZW0gaW4gdGhlIGBhcnJheWAgb3IgZWFjaCBwcm9wZXJ0eSB2YWx1ZQ0KLSAqICAgICAgb2YgYG9iamVjdGAgZHVyaW5nIGl0ZXJhdGlvbi4NCi0gKiAgICogYGtleWA6IGxvY2FsIHZhcmlhYmxlIHdoaWNoIHdpbGwgcmVmZXIgdG8gYSBwcm9wZXJ0eSBuYW1lIGluIGBvYmplY3RgIGR1cmluZyBpdGVyYXRpb24uDQotICogICAqIGBsYWJlbGA6IFRoZSByZXN1bHQgb2YgdGhpcyBleHByZXNzaW9uIHdpbGwgYmUgdGhlIGxhYmVsIGZvciBgPG9wdGlvbj5gIGVsZW1lbnQuIFRoZQ0KLSAqICAgICBgZXhwcmVzc2lvbmAgd2lsbCBtb3N0IGxpa2VseSByZWZlciB0byB0aGUgYHZhbHVlYCB2YXJpYWJsZSAoZS5nLiBgdmFsdWUucHJvcGVydHlOYW1lYCkuDQotICogICAqIGBzZWxlY3RgOiBUaGUgcmVzdWx0IG9mIHRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlIGJvdW5kIHRvIHRoZSBtb2RlbCBvZiB0aGUgcGFyZW50IGA8c2VsZWN0PmANCi0gKiAgICAgIGVsZW1lbnQuIElmIG5vdCBzcGVjaWZpZWQsIGBzZWxlY3RgIGV4cHJlc3Npb24gd2lsbCBkZWZhdWx0IHRvIGB2YWx1ZWAuDQotICogICAqIGBncm91cGA6IFRoZSByZXN1bHQgb2YgdGhpcyBleHByZXNzaW9uIHdpbGwgYmUgdXNlZCB0byBncm91cCBvcHRpb25zIHVzaW5nIHRoZSBgPG9wdGdyb3VwPmANCi0gKiAgICAgIERPTSBlbGVtZW50Lg0KLSAqICAgKiBgdHJhY2tleHByYDogVXNlZCB3aGVuIHdvcmtpbmcgd2l0aCBhbiBhcnJheSBvZiBvYmplY3RzLiBUaGUgcmVzdWx0IG9mIHRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlDQotICogICAgICB1c2VkIHRvIGlkZW50aWZ5IHRoZSBvYmplY3RzIGluIHRoZSBhcnJheS4gVGhlIGB0cmFja2V4cHJgIHdpbGwgbW9zdCBsaWtlbHkgcmVmZXIgdG8gdGhlDQotICogICAgIGB2YWx1ZWAgdmFyaWFibGUgKGUuZy4gYHZhbHVlLnByb3BlcnR5TmFtZWApLiBXaXRoIHRoaXMgdGhlIHNlbGVjdGlvbiBpcyBwcmVzZXJ2ZWQNCi0gKiAgICAgIGV2ZW4gd2hlbiB0aGUgb3B0aW9ucyBhcmUgcmVjcmVhdGVkIChlLmcuIHJlbG9hZGVkIGZyb20gdGhlIHNlcnZlcikuDQotICoNCi0gKiBAZXhhbXBsZQ0KLSAgICA8ZXhhbXBsZSBtb2R1bGU9InNlbGVjdEV4YW1wbGUiPg0KLSAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPg0KLSAgICAgICAgPHNjcmlwdD4NCi0gICAgICAgIGFuZ3VsYXIubW9kdWxlKCdzZWxlY3RFeGFtcGxlJywgW10pDQotICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7DQotICAgICAgICAgICAgJHNjb3BlLmNvbG9ycyA9IFsNCi0gICAgICAgICAgICAgIHtuYW1lOidibGFjaycsIHNoYWRlOidkYXJrJ30sDQotICAgICAgICAgICAgICB7bmFtZTond2hpdGUnLCBzaGFkZTonbGlnaHQnfSwNCi0gICAgICAgICAgICAgIHtuYW1lOidyZWQnLCBzaGFkZTonZGFyayd9LA0KLSAgICAgICAgICAgICAge25hbWU6J2JsdWUnLCBzaGFkZTonZGFyayd9LA0KLSAgICAgICAgICAgICAge25hbWU6J3llbGxvdycsIHNoYWRlOidsaWdodCd9DQotICAgICAgICAgICAgXTsNCi0gICAgICAgICAgICAkc2NvcGUubXlDb2xvciA9ICRzY29wZS5jb2xvcnNbMl07IC8vIHJlZA0KLSAgICAgICAgICB9XSk7DQotICAgICAgICA8L3NjcmlwdD4NCi0gICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPg0KLSAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgPGxpIG5nLXJlcGVhdD0iY29sb3IgaW4gY29sb3JzIj4NCi0gICAgICAgICAgICAgIE5hbWU6IDxpbnB1dCBuZy1tb2RlbD0iY29sb3IubmFtZSI+DQotICAgICAgICAgICAgICBbPGEgaHJlZiBuZy1jbGljaz0iY29sb3JzLnNwbGljZSgkaW5kZXgsIDEpIj5YPC9hPl0NCi0gICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgIDxsaT4NCi0gICAgICAgICAgICAgIFs8YSBocmVmIG5nLWNsaWNrPSJjb2xvcnMucHVzaCh7fSkiPmFkZDwvYT5dDQotICAgICAgICAgICAgPC9saT4NCi0gICAgICAgICAgPC91bD4NCi0gICAgICAgICAgPGhyLz4NCi0gICAgICAgICAgQ29sb3IgKG51bGwgbm90IGFsbG93ZWQpOg0KLSAgICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPSJteUNvbG9yIiBuZy1vcHRpb25zPSJjb2xvci5uYW1lIGZvciBjb2xvciBpbiBjb2xvcnMiPjwvc2VsZWN0Pjxicj4NCi0NCi0gICAgICAgICAgQ29sb3IgKG51bGwgYWxsb3dlZCk6DQotICAgICAgICAgIDxzcGFuICBjbGFzcz0ibnVsbGFibGUiPg0KLSAgICAgICAgICAgIDxzZWxlY3QgbmctbW9kZWw9Im15Q29sb3IiIG5nLW9wdGlvbnM9ImNvbG9yLm5hbWUgZm9yIGNvbG9yIGluIGNvbG9ycyI+DQotICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPi0tIGNob29zZSBjb2xvciAtLTwvb3B0aW9uPg0KLSAgICAgICAgICAgIDwvc2VsZWN0Pg0KLSAgICAgICAgICA8L3NwYW4+PGJyLz4NCi0NCi0gICAgICAgICAgQ29sb3IgZ3JvdXBlZCBieSBzaGFkZToNCi0gICAgICAgICAgPHNlbGVjdCBuZy1tb2RlbD0ibXlDb2xvciIgbmctb3B0aW9ucz0iY29sb3IubmFtZSBncm91cCBieSBjb2xvci5zaGFkZSBmb3IgY29sb3IgaW4gY29sb3JzIj4NCi0gICAgICAgICAgPC9zZWxlY3Q+PGJyLz4NCi0NCi0NCi0gICAgICAgICAgU2VsZWN0IDxhIGhyZWYgbmctY2xpY2s9Im15Q29sb3IgPSB7IG5hbWU6J25vdCBpbiBsaXN0Jywgc2hhZGU6ICdvdGhlcicgfSI+Ym9ndXM8L2E+Ljxicj4NCi0gICAgICAgICAgPGhyLz4NCi0gICAgICAgICAgQ3VycmVudGx5IHNlbGVjdGVkOiB7eyB7c2VsZWN0ZWRfY29sb3I6bXlDb2xvcn0gfX0NCi0gICAgICAgICAgPGRpdiBzdHlsZT0iYm9yZGVyOnNvbGlkIDFweCBibGFjazsgaGVpZ2h0OjIwcHgiDQotICAgICAgICAgICAgICAgbmctc3R5bGU9InsnYmFja2dyb3VuZC1jb2xvcic6bXlDb2xvci5uYW1lfSI+DQotICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgPC9kaXY+DQotICAgICAgPC9maWxlPg0KLSAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPg0KLSAgICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctb3B0aW9ucycsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygne3NlbGVjdGVkX2NvbG9yOm15Q29sb3J9JykpLmdldFRleHQoKSkudG9NYXRjaCgncmVkJyk7DQotICAgICAgICAgICBlbGVtZW50LmFsbChieS5tb2RlbCgnbXlDb2xvcicpKS5maXJzdCgpLmNsaWNrKCk7DQotICAgICAgICAgICBlbGVtZW50LmFsbChieS5jc3MoJ3NlbGVjdFtuZy1tb2RlbD0ibXlDb2xvciJdIG9wdGlvbicpKS5maXJzdCgpLmNsaWNrKCk7DQotICAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCd7c2VsZWN0ZWRfY29sb3I6bXlDb2xvcn0nKSkuZ2V0VGV4dCgpKS50b01hdGNoKCdibGFjaycpOw0KLSAgICAgICAgICAgZWxlbWVudChieS5jc3MoJy5udWxsYWJsZSBzZWxlY3RbbmctbW9kZWw9Im15Q29sb3IiXScpKS5jbGljaygpOw0KLSAgICAgICAgICAgZWxlbWVudC5hbGwoYnkuY3NzKCcubnVsbGFibGUgc2VsZWN0W25nLW1vZGVsPSJteUNvbG9yIl0gb3B0aW9uJykpLmZpcnN0KCkuY2xpY2soKTsNCi0gICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3tzZWxlY3RlZF9jb2xvcjpteUNvbG9yfScpKS5nZXRUZXh0KCkpLnRvTWF0Y2goJ251bGwnKTsNCi0gICAgICAgICB9KTsNCi0gICAgICA8L2ZpbGU+DQotICAgIDwvZXhhbXBsZT4NCi0gKi8NCi0NCi12YXIgbmdPcHRpb25zRGlyZWN0aXZlID0gdmFsdWVGbih7DQotICByZXN0cmljdDogJ0EnLA0KLSAgdGVybWluYWw6IHRydWUNCi19KTsNCi0NCi0vLyBqc2hpbnQgbWF4bGVuOiBmYWxzZQ0KLXZhciBzZWxlY3REaXJlY3RpdmUgPSBbJyRjb21waWxlJywgJyRwYXJzZScsIGZ1bmN0aW9uKCRjb21waWxlLCAgICRwYXJzZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAvLzAwMDAxMTExMTExMTExMDAwMDAwMDAwMDAyMjIyMjIyMjIyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzMzMzMzMzMzMzAwMDAwMDAwMDAwMDAwNDQ0NDQ0NDQ0NDQ0NDQ0MDAwMDAwMDAwNTU1NTU1NTU1NTU1NTU1MDAwMDAwMDY2NjY2NjY2NjY2NjY2NjAwMDAwMDAwMDAwMDAwMDc3Nzc3Nzc3NzcwMDAwMDAwMDAwMDAwMDAwMDAwODg4ODg4ODg4OA0KLSAgdmFyIE5HX09QVElPTlNfUkVHRVhQID0gL15ccyooW1xzXFNdKz8pKD86XHMrYXNccysoW1xzXFNdKz8pKT8oPzpccytncm91cFxzK2J5XHMrKFtcc1xTXSs/KSk/XHMrZm9yXHMrKD86KFtcJFx3XVtcJFx3XSopfCg/OlwoXHMqKFtcJFx3XVtcJFx3XSopXHMqLFxzKihbXCRcd11bXCRcd10qKVxzKlwpKSlccytpblxzKyhbXHNcU10rPykoPzpccyt0cmFja1xzK2J5XHMrKFtcc1xTXSs/KSk/JC8sDQotICAgICAgbnVsbE1vZGVsQ3RybCA9IHskc2V0Vmlld1ZhbHVlOiBub29wfTsNCi0vLyBqc2hpbnQgbWF4bGVuOiAxMDANCi0NCi0gIHJldHVybiB7DQotICAgIHJlc3RyaWN0OiAnRScsDQotICAgIHJlcXVpcmU6IFsnc2VsZWN0JywgJz9uZ01vZGVsJ10sDQotICAgIGNvbnRyb2xsZXI6IFsnJGVsZW1lbnQnLCAnJHNjb3BlJywgJyRhdHRycycsIGZ1bmN0aW9uKCRlbGVtZW50LCAkc2NvcGUsICRhdHRycykgew0KLSAgICAgIHZhciBzZWxmID0gdGhpcywNCi0gICAgICAgICAgb3B0aW9uc01hcCA9IHt9LA0KLSAgICAgICAgICBuZ01vZGVsQ3RybCA9IG51bGxNb2RlbEN0cmwsDQotICAgICAgICAgIG51bGxPcHRpb24sDQotICAgICAgICAgIHVua25vd25PcHRpb247DQotDQotDQotICAgICAgc2VsZi5kYXRhYm91bmQgPSAkYXR0cnMubmdNb2RlbDsNCi0NCi0NCi0gICAgICBzZWxmLmluaXQgPSBmdW5jdGlvbihuZ01vZGVsQ3RybF8sIG51bGxPcHRpb25fLCB1bmtub3duT3B0aW9uXykgew0KLSAgICAgICAgbmdNb2RlbEN0cmwgPSBuZ01vZGVsQ3RybF87DQotICAgICAgICBudWxsT3B0aW9uID0gbnVsbE9wdGlvbl87DQotICAgICAgICB1bmtub3duT3B0aW9uID0gdW5rbm93bk9wdGlvbl87DQotICAgICAgfTsNCi0NCi0NCi0gICAgICBzZWxmLmFkZE9wdGlvbiA9IGZ1bmN0aW9uKHZhbHVlLCBlbGVtZW50KSB7DQotICAgICAgICBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgJyJvcHRpb24gdmFsdWUiJyk7DQotICAgICAgICBvcHRpb25zTWFwW3ZhbHVlXSA9IHRydWU7DQotDQotICAgICAgICBpZiAobmdNb2RlbEN0cmwuJHZpZXdWYWx1ZSA9PSB2YWx1ZSkgew0KLSAgICAgICAgICAkZWxlbWVudC52YWwodmFsdWUpOw0KLSAgICAgICAgICBpZiAodW5rbm93bk9wdGlvbi5wYXJlbnQoKSkgdW5rbm93bk9wdGlvbi5yZW1vdmUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zODE0NTkNCi0gICAgICAgIC8vIEFkZGluZyBhbiA8b3B0aW9uIHNlbGVjdGVkPSJzZWxlY3RlZCI+IGVsZW1lbnQgdG8gYSA8c2VsZWN0IHJlcXVpcmVkPSJyZXF1aXJlZCI+IHNob3VsZA0KLSAgICAgICAgLy8gYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIG5ldyBlbGVtZW50DQotICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50WzBdLmhhc0F0dHJpYnV0ZSgnc2VsZWN0ZWQnKSkgew0KLSAgICAgICAgICBlbGVtZW50WzBdLnNlbGVjdGVkID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICB9Ow0KLQ0KLQ0KLSAgICAgIHNlbGYucmVtb3ZlT3B0aW9uID0gZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICAgIGlmICh0aGlzLmhhc09wdGlvbih2YWx1ZSkpIHsNCi0gICAgICAgICAgZGVsZXRlIG9wdGlvbnNNYXBbdmFsdWVdOw0KLSAgICAgICAgICBpZiAobmdNb2RlbEN0cmwuJHZpZXdWYWx1ZSA9PT0gdmFsdWUpIHsNCi0gICAgICAgICAgICB0aGlzLnJlbmRlclVua25vd25PcHRpb24odmFsdWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfTsNCi0NCi0NCi0gICAgICBzZWxmLnJlbmRlclVua25vd25PcHRpb24gPSBmdW5jdGlvbih2YWwpIHsNCi0gICAgICAgIHZhciB1bmtub3duVmFsID0gJz8gJyArIGhhc2hLZXkodmFsKSArICcgPyc7DQotICAgICAgICB1bmtub3duT3B0aW9uLnZhbCh1bmtub3duVmFsKTsNCi0gICAgICAgICRlbGVtZW50LnByZXBlbmQodW5rbm93bk9wdGlvbik7DQotICAgICAgICAkZWxlbWVudC52YWwodW5rbm93blZhbCk7DQotICAgICAgICB1bmtub3duT3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7IC8vIG5lZWRlZCBmb3IgSUUNCi0gICAgICB9Ow0KLQ0KLQ0KLSAgICAgIHNlbGYuaGFzT3B0aW9uID0gZnVuY3Rpb24odmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBvcHRpb25zTWFwLmhhc093blByb3BlcnR5KHZhbHVlKTsNCi0gICAgICB9Ow0KLQ0KLSAgICAgICRzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7DQotICAgICAgICAvLyBkaXNhYmxlIHVua25vd24gb3B0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgZG8gd29yayB3aGVuIHRoZSB3aG9sZSBzZWxlY3QgaXMgYmVpbmcgZGVzdHJveWVkDQotICAgICAgICBzZWxmLnJlbmRlclVua25vd25PcHRpb24gPSBub29wOw0KLSAgICAgIH0pOw0KLSAgICB9XSwNCi0NCi0gICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmxzKSB7DQotICAgICAgLy8gaWYgbmdNb2RlbCBpcyBub3QgZGVmaW5lZCwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZw0KLSAgICAgIGlmICghY3RybHNbMV0pIHJldHVybjsNCi0NCi0gICAgICB2YXIgc2VsZWN0Q3RybCA9IGN0cmxzWzBdLA0KLSAgICAgICAgICBuZ01vZGVsQ3RybCA9IGN0cmxzWzFdLA0KLSAgICAgICAgICBtdWx0aXBsZSA9IGF0dHIubXVsdGlwbGUsDQotICAgICAgICAgIG9wdGlvbnNFeHAgPSBhdHRyLm5nT3B0aW9ucywNCi0gICAgICAgICAgbnVsbE9wdGlvbiA9IGZhbHNlLCAvLyBpZiBmYWxzZSwgdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHNlbGVjdCBpdCAodXNlZCBieSBuZ09wdGlvbnMpDQotICAgICAgICAgIGVtcHR5T3B0aW9uLA0KLSAgICAgICAgICByZW5kZXJTY2hlZHVsZWQgPSBmYWxzZSwNCi0gICAgICAgICAgLy8gd2UgY2FuJ3QganVzdCBqcUxpdGUoJzxvcHRpb24+Jykgc2luY2UganFMaXRlIGlzIG5vdCBzbWFydCBlbm91Z2gNCi0gICAgICAgICAgLy8gdG8gY3JlYXRlIGl0IGluIDxzZWxlY3Q+IGFuZCBJRSBiYXJmcyBvdGhlcndpc2UuDQotICAgICAgICAgIG9wdGlvblRlbXBsYXRlID0ganFMaXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpKSwNCi0gICAgICAgICAgb3B0R3JvdXBUZW1wbGF0ZSA9anFMaXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGdyb3VwJykpLA0KLSAgICAgICAgICB1bmtub3duT3B0aW9uID0gb3B0aW9uVGVtcGxhdGUuY2xvbmUoKTsNCi0NCi0gICAgICAvLyBmaW5kICJudWxsIiBvcHRpb24NCi0gICAgICBmb3IgKHZhciBpID0gMCwgY2hpbGRyZW4gPSBlbGVtZW50LmNoaWxkcmVuKCksIGlpID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KLSAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnZhbHVlID09PSAnJykgew0KLSAgICAgICAgICBlbXB0eU9wdGlvbiA9IG51bGxPcHRpb24gPSBjaGlsZHJlbi5lcShpKTsNCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgfQ0KLQ0KLSAgICAgIHNlbGVjdEN0cmwuaW5pdChuZ01vZGVsQ3RybCwgbnVsbE9wdGlvbiwgdW5rbm93bk9wdGlvbik7DQotDQotICAgICAgLy8gcmVxdWlyZWQgdmFsaWRhdG9yDQotICAgICAgaWYgKG11bHRpcGxlKSB7DQotICAgICAgICBuZ01vZGVsQ3RybC4kaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQotICAgICAgICAgIHJldHVybiAhdmFsdWUgfHwgdmFsdWUubGVuZ3RoID09PSAwOw0KLSAgICAgICAgfTsNCi0gICAgICB9DQotDQotICAgICAgaWYgKG9wdGlvbnNFeHApIHNldHVwQXNPcHRpb25zKHNjb3BlLCBlbGVtZW50LCBuZ01vZGVsQ3RybCk7DQotICAgICAgZWxzZSBpZiAobXVsdGlwbGUpIHNldHVwQXNNdWx0aXBsZShzY29wZSwgZWxlbWVudCwgbmdNb2RlbEN0cmwpOw0KLSAgICAgIGVsc2Ugc2V0dXBBc1NpbmdsZShzY29wZSwgZWxlbWVudCwgbmdNb2RlbEN0cmwsIHNlbGVjdEN0cmwpOw0KLQ0KLQ0KLSAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi0NCi0NCi0gICAgICBmdW5jdGlvbiBzZXR1cEFzU2luZ2xlKHNjb3BlLCBzZWxlY3RFbGVtZW50LCBuZ01vZGVsQ3RybCwgc2VsZWN0Q3RybCkgew0KLSAgICAgICAgbmdNb2RlbEN0cmwuJHJlbmRlciA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICB2YXIgdmlld1ZhbHVlID0gbmdNb2RlbEN0cmwuJHZpZXdWYWx1ZTsNCi0NCi0gICAgICAgICAgaWYgKHNlbGVjdEN0cmwuaGFzT3B0aW9uKHZpZXdWYWx1ZSkpIHsNCi0gICAgICAgICAgICBpZiAodW5rbm93bk9wdGlvbi5wYXJlbnQoKSkgdW5rbm93bk9wdGlvbi5yZW1vdmUoKTsNCi0gICAgICAgICAgICBzZWxlY3RFbGVtZW50LnZhbCh2aWV3VmFsdWUpOw0KLSAgICAgICAgICAgIGlmICh2aWV3VmFsdWUgPT09ICcnKSBlbXB0eU9wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOyAvLyB0byBtYWtlIElFOSBoYXBweQ0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2aWV3VmFsdWUpICYmIGVtcHR5T3B0aW9uKSB7DQotICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnZhbCgnJyk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgIHNlbGVjdEN0cmwucmVuZGVyVW5rbm93bk9wdGlvbih2aWV3VmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0NCi0gICAgICAgIHNlbGVjdEVsZW1lbnQub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgaWYgKHVua25vd25PcHRpb24ucGFyZW50KCkpIHVua25vd25PcHRpb24ucmVtb3ZlKCk7DQotICAgICAgICAgICAgbmdNb2RlbEN0cmwuJHNldFZpZXdWYWx1ZShzZWxlY3RFbGVtZW50LnZhbCgpKTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICB9KTsNCi0gICAgICB9DQotDQotICAgICAgZnVuY3Rpb24gc2V0dXBBc011bHRpcGxlKHNjb3BlLCBzZWxlY3RFbGVtZW50LCBjdHJsKSB7DQotICAgICAgICB2YXIgbGFzdFZpZXc7DQotICAgICAgICBjdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgdmFyIGl0ZW1zID0gbmV3IEhhc2hNYXAoY3RybC4kdmlld1ZhbHVlKTsNCi0gICAgICAgICAgZm9yRWFjaChzZWxlY3RFbGVtZW50LmZpbmQoJ29wdGlvbicpLCBmdW5jdGlvbihvcHRpb24pIHsNCi0gICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBpc0RlZmluZWQoaXRlbXMuZ2V0KG9wdGlvbi52YWx1ZSkpOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH07DQotDQotICAgICAgICAvLyB3ZSBoYXZlIHRvIGRvIGl0IG9uIGVhY2ggd2F0Y2ggc2luY2UgbmdNb2RlbCB3YXRjaGVzIHJlZmVyZW5jZSwgYnV0DQotICAgICAgICAvLyB3ZSBuZWVkIHRvIHdvcmsgb2YgYW4gYXJyYXksIHNvIHdlIG5lZWQgdG8gc2VlIGlmIGFueXRoaW5nIHdhcyBpbnNlcnRlZC9yZW1vdmVkDQotICAgICAgICBzY29wZS4kd2F0Y2goZnVuY3Rpb24gc2VsZWN0TXVsdGlwbGVXYXRjaCgpIHsNCi0gICAgICAgICAgaWYgKCFlcXVhbHMobGFzdFZpZXcsIGN0cmwuJHZpZXdWYWx1ZSkpIHsNCi0gICAgICAgICAgICBsYXN0VmlldyA9IHNoYWxsb3dDb3B5KGN0cmwuJHZpZXdWYWx1ZSk7DQotICAgICAgICAgICAgY3RybC4kcmVuZGVyKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgc2VsZWN0RWxlbWVudC5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7DQotICAgICAgICAgIHNjb3BlLiRhcHBseShmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTsNCi0gICAgICAgICAgICBmb3JFYWNoKHNlbGVjdEVsZW1lbnQuZmluZCgnb3B0aW9uJyksIGZ1bmN0aW9uKG9wdGlvbikgew0KLSAgICAgICAgICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCkgew0KLSAgICAgICAgICAgICAgICBhcnJheS5wdXNoKG9wdGlvbi52YWx1ZSk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgY3RybC4kc2V0Vmlld1ZhbHVlKGFycmF5KTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICB9KTsNCi0gICAgICB9DQotDQotICAgICAgZnVuY3Rpb24gc2V0dXBBc09wdGlvbnMoc2NvcGUsIHNlbGVjdEVsZW1lbnQsIGN0cmwpIHsNCi0gICAgICAgIHZhciBtYXRjaDsNCi0NCi0gICAgICAgIGlmICghKG1hdGNoID0gb3B0aW9uc0V4cC5tYXRjaChOR19PUFRJT05TX1JFR0VYUCkpKSB7DQotICAgICAgICAgIHRocm93IG5nT3B0aW9uc01pbkVycignaWV4cCcsDQotICAgICAgICAgICAgIkV4cGVjdGVkIGV4cHJlc3Npb24gaW4gZm9ybSBvZiAiICsNCi0gICAgICAgICAgICAiJ19zZWxlY3RfIChhcyBfbGFiZWxfKT8gZm9yIChfa2V5XywpP192YWx1ZV8gaW4gX2NvbGxlY3Rpb25fJyIgKw0KLSAgICAgICAgICAgICIgYnV0IGdvdCAnezB9Jy4gRWxlbWVudDogezF9IiwNCi0gICAgICAgICAgICBvcHRpb25zRXhwLCBzdGFydGluZ1RhZyhzZWxlY3RFbGVtZW50KSk7DQotICAgICAgICB9DQotDQotICAgICAgICB2YXIgZGlzcGxheUZuID0gJHBhcnNlKG1hdGNoWzJdIHx8IG1hdGNoWzFdKSwNCi0gICAgICAgICAgICB2YWx1ZU5hbWUgPSBtYXRjaFs0XSB8fCBtYXRjaFs2XSwNCi0gICAgICAgICAgICBzZWxlY3RBcyA9IC8gYXMgLy50ZXN0KG1hdGNoWzBdKSAmJiBtYXRjaFsxXSwNCi0gICAgICAgICAgICBzZWxlY3RBc0ZuID0gc2VsZWN0QXMgPyAkcGFyc2Uoc2VsZWN0QXMpIDogbnVsbCwNCi0gICAgICAgICAgICBrZXlOYW1lID0gbWF0Y2hbNV0sDQotICAgICAgICAgICAgZ3JvdXBCeUZuID0gJHBhcnNlKG1hdGNoWzNdIHx8ICcnKSwNCi0gICAgICAgICAgICB2YWx1ZUZuID0gJHBhcnNlKG1hdGNoWzJdID8gbWF0Y2hbMV0gOiB2YWx1ZU5hbWUpLA0KLSAgICAgICAgICAgIHZhbHVlc0ZuID0gJHBhcnNlKG1hdGNoWzddKSwNCi0gICAgICAgICAgICB0cmFjayA9IG1hdGNoWzhdLA0KLSAgICAgICAgICAgIHRyYWNrRm4gPSB0cmFjayA/ICRwYXJzZShtYXRjaFs4XSkgOiBudWxsLA0KLSAgICAgICAgICAgIHRyYWNrS2V5c0NhY2hlID0ge30sDQotICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBhcnJheSBvZiBhcnJheSBvZiBleGlzdGluZyBvcHRpb24gZ3JvdXBzIGluIERPTS4NCi0gICAgICAgICAgICAvLyBXZSB0cnkgdG8gcmV1c2UgdGhlc2UgaWYgcG9zc2libGUNCi0gICAgICAgICAgICAvLyAtIG9wdGlvbkdyb3Vwc0NhY2hlWzBdIGlzIHRoZSBvcHRpb25zIHdpdGggbm8gb3B0aW9uIGdyb3VwDQotICAgICAgICAgICAgLy8gLSBvcHRpb25Hcm91cHNDYWNoZVs/XVswXSBpcyB0aGUgcGFyZW50OiBlaXRoZXIgdGhlIFNFTEVDVCBvciBPUFRHUk9VUCBlbGVtZW50DQotICAgICAgICAgICAgb3B0aW9uR3JvdXBzQ2FjaGUgPSBbW3tlbGVtZW50OiBzZWxlY3RFbGVtZW50LCBsYWJlbDonJ31dXSwNCi0gICAgICAgICAgICAvL3JlLXVzYWJsZSBvYmplY3QgdG8gcmVwcmVzZW50IG9wdGlvbidzIGxvY2Fscw0KLSAgICAgICAgICAgIGxvY2FscyA9IHt9Ow0KLQ0KLSAgICAgICAgaWYgKG51bGxPcHRpb24pIHsNCi0gICAgICAgICAgLy8gY29tcGlsZSB0aGUgZWxlbWVudCBzaW5jZSB0aGVyZSBtaWdodCBiZSBiaW5kaW5ncyBpbiBpdA0KLSAgICAgICAgICAkY29tcGlsZShudWxsT3B0aW9uKShzY29wZSk7DQotDQotICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY2xhc3MsIHdoaWNoIGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkgYmVjYXVzZSB3ZSByZWNvbXBpbGUgdGhlIGVsZW1lbnQgYW5kIGl0DQotICAgICAgICAgIC8vIGJlY29tZXMgdGhlIGNvbXBpbGF0aW9uIHJvb3QNCi0gICAgICAgICAgbnVsbE9wdGlvbi5yZW1vdmVDbGFzcygnbmctc2NvcGUnKTsNCi0NCi0gICAgICAgICAgLy8gd2UgbmVlZCB0byByZW1vdmUgaXQgYmVmb3JlIGNhbGxpbmcgc2VsZWN0RWxlbWVudC5lbXB0eSgpIGJlY2F1c2Ugb3RoZXJ3aXNlIElFIHdpbGwNCi0gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBsYWJlbCBmcm9tIHRoZSBlbGVtZW50LiB3dGY/DQotICAgICAgICAgIG51bGxPcHRpb24ucmVtb3ZlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBjbGVhciBjb250ZW50cywgd2UnbGwgYWRkIHdoYXQncyBuZWVkZWQgYmFzZWQgb24gdGhlIG1vZGVsDQotICAgICAgICBzZWxlY3RFbGVtZW50LmVtcHR5KCk7DQotDQotICAgICAgICBzZWxlY3RFbGVtZW50Lm9uKCdjaGFuZ2UnLCBzZWxlY3Rpb25DaGFuZ2VkKTsNCi0NCi0gICAgICAgIGN0cmwuJHJlbmRlciA9IHJlbmRlcjsNCi0NCi0gICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24odmFsdWVzRm4sIHNjaGVkdWxlUmVuZGVyaW5nKTsNCi0gICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oZ2V0TGFiZWxzLCBzY2hlZHVsZVJlbmRlcmluZyk7DQotDQotICAgICAgICBpZiAobXVsdGlwbGUpIHsNCi0gICAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbihmdW5jdGlvbigpIHsgcmV0dXJuIGN0cmwuJG1vZGVsVmFsdWU7IH0sIHNjaGVkdWxlUmVuZGVyaW5nKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvLw0KLQ0KLSAgICAgICAgZnVuY3Rpb24gY2FsbEV4cHJlc3Npb24oZXhwckZuLCBrZXksIHZhbHVlKSB7DQotICAgICAgICAgIGxvY2Fsc1t2YWx1ZU5hbWVdID0gdmFsdWU7DQotICAgICAgICAgIGlmIChrZXlOYW1lKSBsb2NhbHNba2V5TmFtZV0gPSBrZXk7DQotICAgICAgICAgIHJldHVybiBleHByRm4oc2NvcGUsIGxvY2Fscyk7DQotICAgICAgICB9DQotDQotICAgICAgICBmdW5jdGlvbiBzZWxlY3Rpb25DaGFuZ2VkKCkgew0KLSAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24oKSB7DQotICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSB2YWx1ZXNGbihzY29wZSkgfHwgW107DQotICAgICAgICAgICAgdmFyIHZpZXdWYWx1ZTsNCi0gICAgICAgICAgICBpZiAobXVsdGlwbGUpIHsNCi0gICAgICAgICAgICAgIHZpZXdWYWx1ZSA9IFtdOw0KLSAgICAgICAgICAgICAgZm9yRWFjaChzZWxlY3RFbGVtZW50LnZhbCgpLCBmdW5jdGlvbihzZWxlY3RlZEtleSkgew0KLSAgICAgICAgICAgICAgICAgIHNlbGVjdGVkS2V5ID0gdHJhY2tGbiA/IHRyYWNrS2V5c0NhY2hlW3NlbGVjdGVkS2V5XSA6IHNlbGVjdGVkS2V5Ow0KLSAgICAgICAgICAgICAgICB2aWV3VmFsdWUucHVzaChnZXRWaWV3VmFsdWUoc2VsZWN0ZWRLZXksIGNvbGxlY3Rpb25bc2VsZWN0ZWRLZXldKSk7DQotICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkS2V5ID0gdHJhY2tGbiA/IHRyYWNrS2V5c0NhY2hlW3NlbGVjdEVsZW1lbnQudmFsKCldIDogc2VsZWN0RWxlbWVudC52YWwoKTsNCi0gICAgICAgICAgICAgIHZpZXdWYWx1ZSA9IGdldFZpZXdWYWx1ZShzZWxlY3RlZEtleSwgY29sbGVjdGlvbltzZWxlY3RlZEtleV0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjdHJsLiRzZXRWaWV3VmFsdWUodmlld1ZhbHVlKTsNCi0gICAgICAgICAgICByZW5kZXIoKTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICB9DQotDQotICAgICAgICBmdW5jdGlvbiBnZXRWaWV3VmFsdWUoa2V5LCB2YWx1ZSkgew0KLSAgICAgICAgICBpZiAoa2V5ID09PSAnPycpIHsNCi0gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOw0KLSAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJycpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB2YXIgdmlld1ZhbHVlRm4gPSBzZWxlY3RBc0ZuID8gc2VsZWN0QXNGbiA6IHZhbHVlRm47DQotICAgICAgICAgICAgcmV0dXJuIGNhbGxFeHByZXNzaW9uKHZpZXdWYWx1ZUZuLCBrZXksIHZhbHVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZnVuY3Rpb24gZ2V0TGFiZWxzKCkgew0KLSAgICAgICAgICB2YXIgdmFsdWVzID0gdmFsdWVzRm4oc2NvcGUpOw0KLSAgICAgICAgICB2YXIgdG9EaXNwbGF5Ow0KLSAgICAgICAgICBpZiAodmFsdWVzICYmIGlzQXJyYXkodmFsdWVzKSkgew0KLSAgICAgICAgICAgIHRvRGlzcGxheSA9IG5ldyBBcnJheSh2YWx1ZXMubGVuZ3RoKTsNCi0gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB2YWx1ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgew0KLSAgICAgICAgICAgICAgdG9EaXNwbGF5W2ldID0gY2FsbEV4cHJlc3Npb24oZGlzcGxheUZuLCBpLCB2YWx1ZXNbaV0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gdG9EaXNwbGF5Ow0KLSAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlcykgew0KLSAgICAgICAgICAgIC8vIFRPRE86IEFkZCBhIHRlc3QgZm9yIHRoaXMgY2FzZQ0KLSAgICAgICAgICAgIHRvRGlzcGxheSA9IHt9Ow0KLSAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gdmFsdWVzKSB7DQotICAgICAgICAgICAgICBpZiAodmFsdWVzLmhhc093blByb3BlcnR5KHByb3ApKSB7DQotICAgICAgICAgICAgICAgIHRvRGlzcGxheVtwcm9wXSA9IGNhbGxFeHByZXNzaW9uKGRpc3BsYXlGbiwgcHJvcCwgdmFsdWVzW3Byb3BdKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgICAgcmV0dXJuIHRvRGlzcGxheTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUlzU2VsZWN0ZWRGbih2aWV3VmFsdWUpIHsNCi0gICAgICAgICAgdmFyIHNlbGVjdGVkU2V0Ow0KLSAgICAgICAgICBpZiAobXVsdGlwbGUpIHsNCi0gICAgICAgICAgICBpZiAodHJhY2tGbiAmJiBpc0FycmF5KHZpZXdWYWx1ZSkpIHsNCi0NCi0gICAgICAgICAgICAgIHNlbGVjdGVkU2V0ID0gbmV3IEhhc2hNYXAoW10pOw0KLSAgICAgICAgICAgICAgZm9yICh2YXIgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCB2aWV3VmFsdWUubGVuZ3RoOyB0cmFja0luZGV4KyspIHsNCi0gICAgICAgICAgICAgICAgLy8gdHJhY2tpbmcgYnkga2V5DQotICAgICAgICAgICAgICAgIHNlbGVjdGVkU2V0LnB1dChjYWxsRXhwcmVzc2lvbih0cmFja0ZuLCBudWxsLCB2aWV3VmFsdWVbdHJhY2tJbmRleF0pLCB0cnVlKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgc2VsZWN0ZWRTZXQgPSBuZXcgSGFzaE1hcCh2aWV3VmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSBlbHNlIGlmICh0cmFja0ZuKSB7DQotICAgICAgICAgICAgdmlld1ZhbHVlID0gY2FsbEV4cHJlc3Npb24odHJhY2tGbiwgbnVsbCwgdmlld1ZhbHVlKTsNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gaXNTZWxlY3RlZChrZXksIHZhbHVlKSB7DQotICAgICAgICAgICAgdmFyIGNvbXBhcmVWYWx1ZUZuOw0KLSAgICAgICAgICAgIGlmICh0cmFja0ZuKSB7DQotICAgICAgICAgICAgICBjb21wYXJlVmFsdWVGbiA9IHRyYWNrRm47DQotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RBc0ZuKSB7DQotICAgICAgICAgICAgICBjb21wYXJlVmFsdWVGbiA9IHNlbGVjdEFzRm47DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgIGNvbXBhcmVWYWx1ZUZuID0gdmFsdWVGbjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKG11bHRpcGxlKSB7DQotICAgICAgICAgICAgICByZXR1cm4gaXNEZWZpbmVkKHNlbGVjdGVkU2V0LnJlbW92ZShjYWxsRXhwcmVzc2lvbihjb21wYXJlVmFsdWVGbiwga2V5LCB2YWx1ZSkpKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgcmV0dXJuIHZpZXdWYWx1ZSA9PT0gY2FsbEV4cHJlc3Npb24oY29tcGFyZVZhbHVlRm4sIGtleSwgdmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVuZGVyaW5nKCkgew0KLSAgICAgICAgICBpZiAoIXJlbmRlclNjaGVkdWxlZCkgew0KLSAgICAgICAgICAgIHNjb3BlLiQkcG9zdERpZ2VzdChyZW5kZXIpOw0KLSAgICAgICAgICAgIHJlbmRlclNjaGVkdWxlZCA9IHRydWU7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQSBuZXcgbGFiZWxNYXAgaXMgY3JlYXRlZCB3aXRoIGVhY2ggcmVuZGVyLg0KLSAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggZXhpc3Rpbmcgb3B0aW9uIHdpdGggYWRkZWQ9ZmFsc2UsDQotICAgICAgICAgKiBhbmQgZWFjaCBuZXcgb3B0aW9uIHdpdGggYWRkZWQ9dHJ1ZS4NCi0gICAgICAgICAqIC0gTGFiZWxzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZCB0d2ljZSwNCi0gICAgICAgICAqIChvbmNlIHdpdGggYWRkZWQ9dHJ1ZSBhbmQgb25jZSB3aXRoIGFkZGVkPWZhbHNlKSB3aWxsIGVuZCB1cCB3aXRoIGEgdmFsdWUgb2YgMCwgYW5kDQotICAgICAgICAgKiB3aWxsIGNhdXNlIG5vIGNoYW5nZSB0byBoYXBwZW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcgb3B0aW9uLg0KLSAgICAgICAgICogLSBMYWJlbHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIG9ubHkgb25jZSB3aXRoIGFkZGVkPWZhbHNlIHdpbGwgZW5kIHVwIHdpdGggYQ0KLSAgICAgICAgICogdmFsdWUgb2YgLTEgYW5kIHdpbGwgZXZlbnR1YWxseSBiZSBwYXNzZWQgdG8gc2VsZWN0Q3RybC5yZW1vdmVPcHRpb24oKQ0KLSAgICAgICAgICogLSBMYWJlbHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIG9ubHkgb25jZSB3aXRoIGFkZGVkPXRydWUgd2lsbCBlbmQgdXAgd2l0aCBhDQotICAgICAgICAgKiB2YWx1ZSBvZiAxIGFuZCB3aWxsIGV2ZW50dWFsbHkgYmUgcGFzc2VkIHRvIHNlbGVjdEN0cmwuYWRkT3B0aW9uKCkNCi0gICAgICAgICovDQotICAgICAgICBmdW5jdGlvbiB1cGRhdGVMYWJlbE1hcChsYWJlbE1hcCwgbGFiZWwsIGFkZGVkKSB7DQotICAgICAgICAgIGxhYmVsTWFwW2xhYmVsXSA9IGxhYmVsTWFwW2xhYmVsXSB8fCAwOw0KLSAgICAgICAgICBsYWJlbE1hcFtsYWJlbF0gKz0gKGFkZGVkID8gMSA6IC0xKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsNCi0gICAgICAgICAgcmVuZGVyU2NoZWR1bGVkID0gZmFsc2U7DQotDQotICAgICAgICAgIC8vIFRlbXBvcmFyeSBsb2NhdGlvbiBmb3IgdGhlIG9wdGlvbiBncm91cHMgYmVmb3JlIHdlIHJlbmRlciB0aGVtDQotICAgICAgICAgIHZhciBvcHRpb25Hcm91cHMgPSB7Jyc6W119LA0KLSAgICAgICAgICAgICAgb3B0aW9uR3JvdXBOYW1lcyA9IFsnJ10sDQotICAgICAgICAgICAgICBvcHRpb25Hcm91cE5hbWUsDQotICAgICAgICAgICAgICBvcHRpb25Hcm91cCwNCi0gICAgICAgICAgICAgIG9wdGlvbiwNCi0gICAgICAgICAgICAgIGV4aXN0aW5nUGFyZW50LCBleGlzdGluZ09wdGlvbnMsIGV4aXN0aW5nT3B0aW9uLA0KLSAgICAgICAgICAgICAgdmlld1ZhbHVlID0gY3RybC4kdmlld1ZhbHVlLA0KLSAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzRm4oc2NvcGUpIHx8IFtdLA0KLSAgICAgICAgICAgICAga2V5cyA9IGtleU5hbWUgPyBzb3J0ZWRLZXlzKHZhbHVlcykgOiB2YWx1ZXMsDQotICAgICAgICAgICAgICBrZXksDQotICAgICAgICAgICAgICB2YWx1ZSwNCi0gICAgICAgICAgICAgIGdyb3VwTGVuZ3RoLCBsZW5ndGgsDQotICAgICAgICAgICAgICBncm91cEluZGV4LCBpbmRleCwNCi0gICAgICAgICAgICAgIGxhYmVsTWFwID0ge30sDQotICAgICAgICAgICAgICBzZWxlY3RlZCwNCi0gICAgICAgICAgICAgIGlzU2VsZWN0ZWQgPSBjcmVhdGVJc1NlbGVjdGVkRm4odmlld1ZhbHVlKSwNCi0gICAgICAgICAgICAgIGFueVNlbGVjdGVkID0gZmFsc2UsDQotICAgICAgICAgICAgICBsYXN0RWxlbWVudCwNCi0gICAgICAgICAgICAgIGVsZW1lbnQsDQotICAgICAgICAgICAgICBsYWJlbCwNCi0gICAgICAgICAgICAgIG9wdGlvbklkOw0KLQ0KLSAgICAgICAgICB0cmFja0tleXNDYWNoZSA9IHt9Ow0KLQ0KLSAgICAgICAgICAvLyBXZSBub3cgYnVpbGQgdXAgdGhlIGxpc3Qgb2Ygb3B0aW9ucyB3ZSBuZWVkICh3ZSBtZXJnZSBsYXRlcikNCi0gICAgICAgICAgZm9yIChpbmRleCA9IDA7IGxlbmd0aCA9IGtleXMubGVuZ3RoLCBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgew0KLSAgICAgICAgICAgIGtleSA9IGluZGV4Ow0KLSAgICAgICAgICAgIGlmIChrZXlOYW1lKSB7DQotICAgICAgICAgICAgICBrZXkgPSBrZXlzW2luZGV4XTsNCi0gICAgICAgICAgICAgIGlmIChrZXkuY2hhckF0KDApID09PSAnJCcpIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1trZXldOw0KLQ0KLSAgICAgICAgICAgIG9wdGlvbkdyb3VwTmFtZSA9IGNhbGxFeHByZXNzaW9uKGdyb3VwQnlGbiwga2V5LCB2YWx1ZSkgfHwgJyc7DQotICAgICAgICAgICAgaWYgKCEob3B0aW9uR3JvdXAgPSBvcHRpb25Hcm91cHNbb3B0aW9uR3JvdXBOYW1lXSkpIHsNCi0gICAgICAgICAgICAgIG9wdGlvbkdyb3VwID0gb3B0aW9uR3JvdXBzW29wdGlvbkdyb3VwTmFtZV0gPSBbXTsNCi0gICAgICAgICAgICAgIG9wdGlvbkdyb3VwTmFtZXMucHVzaChvcHRpb25Hcm91cE5hbWUpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBzZWxlY3RlZCA9IGlzU2VsZWN0ZWQoa2V5LCB2YWx1ZSk7DQotICAgICAgICAgICAgYW55U2VsZWN0ZWQgPSBhbnlTZWxlY3RlZCB8fCBzZWxlY3RlZDsNCi0NCi0gICAgICAgICAgICBsYWJlbCA9IGNhbGxFeHByZXNzaW9uKGRpc3BsYXlGbiwga2V5LCB2YWx1ZSk7IC8vIHdoYXQgd2lsbCBiZSBzZWVuIGJ5IHRoZSB1c2VyDQotDQotICAgICAgICAgICAgLy8gZG9pbmcgZGlzcGxheUZuKHNjb3BlLCBsb2NhbHMpIHx8ICcnIG92ZXJ3cml0ZXMgemVybyB2YWx1ZXMNCi0gICAgICAgICAgICBsYWJlbCA9IGlzRGVmaW5lZChsYWJlbCkgPyBsYWJlbCA6ICcnOw0KLSAgICAgICAgICAgIG9wdGlvbklkID0gdHJhY2tGbiA/IHRyYWNrRm4oc2NvcGUsIGxvY2FscykgOiAoa2V5TmFtZSA/IGtleXNbaW5kZXhdIDogaW5kZXgpOw0KLSAgICAgICAgICAgIGlmICh0cmFja0ZuKSB7DQotICAgICAgICAgICAgICB0cmFja0tleXNDYWNoZVtvcHRpb25JZF0gPSBrZXk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIG9wdGlvbkdyb3VwLnB1c2goew0KLSAgICAgICAgICAgICAgLy8gZWl0aGVyIHRoZSBpbmRleCBpbnRvIGFycmF5IG9yIGtleSBmcm9tIG9iamVjdA0KLSAgICAgICAgICAgICAgaWQ6IG9wdGlvbklkLA0KLSAgICAgICAgICAgICAgbGFiZWw6IGxhYmVsLA0KLSAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHNlbGVjdGVkICAgICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBpZiB3ZSBzaG91bGQgYmUgc2VsZWN0ZWQNCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoIW11bHRpcGxlKSB7DQotICAgICAgICAgICAgaWYgKG51bGxPcHRpb24gfHwgdmlld1ZhbHVlID09PSBudWxsKSB7DQotICAgICAgICAgICAgICAvLyBpbnNlcnQgbnVsbCBvcHRpb24gaWYgd2UgaGF2ZSBhIHBsYWNlaG9sZGVyLCBvciB0aGUgbW9kZWwgaXMgbnVsbA0KLSAgICAgICAgICAgICAgb3B0aW9uR3JvdXBzWycnXS51bnNoaWZ0KHtpZDonJywgbGFiZWw6JycsIHNlbGVjdGVkOiFhbnlTZWxlY3RlZH0pOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFueVNlbGVjdGVkKSB7DQotICAgICAgICAgICAgICAvLyBvcHRpb24gY291bGQgbm90IGJlIGZvdW5kLCB3ZSBoYXZlIHRvIGluc2VydCB0aGUgdW5kZWZpbmVkIGl0ZW0NCi0gICAgICAgICAgICAgIG9wdGlvbkdyb3Vwc1snJ10udW5zaGlmdCh7aWQ6Jz8nLCBsYWJlbDonJywgc2VsZWN0ZWQ6dHJ1ZX0pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAvLyBOb3cgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGxpc3Qgb2YgRE9NIG5vZGVzIHRvIG1hdGNoIHRoZSBvcHRpb25Hcm91cHMgd2UgY29tcHV0ZWQgYWJvdmUNCi0gICAgICAgICAgZm9yIChncm91cEluZGV4ID0gMCwgZ3JvdXBMZW5ndGggPSBvcHRpb25Hcm91cE5hbWVzLmxlbmd0aDsNCi0gICAgICAgICAgICAgICBncm91cEluZGV4IDwgZ3JvdXBMZW5ndGg7DQotICAgICAgICAgICAgICAgZ3JvdXBJbmRleCsrKSB7DQotICAgICAgICAgICAgLy8gY3VycmVudCBvcHRpb24gZ3JvdXAgbmFtZSBvciAnJyBpZiBubyBncm91cA0KLSAgICAgICAgICAgIG9wdGlvbkdyb3VwTmFtZSA9IG9wdGlvbkdyb3VwTmFtZXNbZ3JvdXBJbmRleF07DQotDQotICAgICAgICAgICAgLy8gbGlzdCBvZiBvcHRpb25zIGZvciB0aGF0IGdyb3VwLiAoZmlyc3QgaXRlbSBoYXMgdGhlIHBhcmVudCkNCi0gICAgICAgICAgICBvcHRpb25Hcm91cCA9IG9wdGlvbkdyb3Vwc1tvcHRpb25Hcm91cE5hbWVdOw0KLQ0KLSAgICAgICAgICAgIGlmIChvcHRpb25Hcm91cHNDYWNoZS5sZW5ndGggPD0gZ3JvdXBJbmRleCkgew0KLSAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBncm93IHRoZSBvcHRpb25Hcm91cHMNCi0gICAgICAgICAgICAgIGV4aXN0aW5nUGFyZW50ID0gew0KLSAgICAgICAgICAgICAgICBlbGVtZW50OiBvcHRHcm91cFRlbXBsYXRlLmNsb25lKCkuYXR0cignbGFiZWwnLCBvcHRpb25Hcm91cE5hbWUpLA0KLSAgICAgICAgICAgICAgICBsYWJlbDogb3B0aW9uR3JvdXAubGFiZWwNCi0gICAgICAgICAgICAgIH07DQotICAgICAgICAgICAgICBleGlzdGluZ09wdGlvbnMgPSBbZXhpc3RpbmdQYXJlbnRdOw0KLSAgICAgICAgICAgICAgb3B0aW9uR3JvdXBzQ2FjaGUucHVzaChleGlzdGluZ09wdGlvbnMpOw0KLSAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5hcHBlbmQoZXhpc3RpbmdQYXJlbnQuZWxlbWVudCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgIGV4aXN0aW5nT3B0aW9ucyA9IG9wdGlvbkdyb3Vwc0NhY2hlW2dyb3VwSW5kZXhdOw0KLSAgICAgICAgICAgICAgZXhpc3RpbmdQYXJlbnQgPSBleGlzdGluZ09wdGlvbnNbMF07ICAvLyBlaXRoZXIgU0VMRUNUIChubyBncm91cCkgb3IgT1BUR1JPVVAgZWxlbWVudA0KLQ0KLSAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBPUFRHUk9VUCBsYWJlbCBpZiBub3QgdGhlIHNhbWUuDQotICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQYXJlbnQubGFiZWwgIT0gb3B0aW9uR3JvdXBOYW1lKSB7DQotICAgICAgICAgICAgICAgIGV4aXN0aW5nUGFyZW50LmVsZW1lbnQuYXR0cignbGFiZWwnLCBleGlzdGluZ1BhcmVudC5sYWJlbCA9IG9wdGlvbkdyb3VwTmFtZSk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGxhc3RFbGVtZW50ID0gbnVsbDsgIC8vIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcNCi0gICAgICAgICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb3B0aW9uR3JvdXAubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgew0KLSAgICAgICAgICAgICAgb3B0aW9uID0gb3B0aW9uR3JvdXBbaW5kZXhdOw0KLSAgICAgICAgICAgICAgaWYgKChleGlzdGluZ09wdGlvbiA9IGV4aXN0aW5nT3B0aW9uc1tpbmRleCArIDFdKSkgew0KLSAgICAgICAgICAgICAgICAvLyByZXVzZSBlbGVtZW50cw0KLSAgICAgICAgICAgICAgICBsYXN0RWxlbWVudCA9IGV4aXN0aW5nT3B0aW9uLmVsZW1lbnQ7DQotICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ09wdGlvbi5sYWJlbCAhPT0gb3B0aW9uLmxhYmVsKSB7DQotICAgICAgICAgICAgICAgICAgdXBkYXRlTGFiZWxNYXAobGFiZWxNYXAsIGV4aXN0aW5nT3B0aW9uLmxhYmVsLCBmYWxzZSk7DQotICAgICAgICAgICAgICAgICAgdXBkYXRlTGFiZWxNYXAobGFiZWxNYXAsIG9wdGlvbi5sYWJlbCwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgICAgbGFzdEVsZW1lbnQudGV4dChleGlzdGluZ09wdGlvbi5sYWJlbCA9IG9wdGlvbi5sYWJlbCk7DQotICAgICAgICAgICAgICAgICAgbGFzdEVsZW1lbnQucHJvcCgnbGFiZWwnLCBleGlzdGluZ09wdGlvbi5sYWJlbCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nT3B0aW9uLmlkICE9PSBvcHRpb24uaWQpIHsNCi0gICAgICAgICAgICAgICAgICBsYXN0RWxlbWVudC52YWwoZXhpc3RpbmdPcHRpb24uaWQgPSBvcHRpb24uaWQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIC8vIGxhc3RFbGVtZW50LnByb3AoJ3NlbGVjdGVkJykgcHJvdmlkZWQgYnkgalF1ZXJ5IGhhcyBzaWRlLWVmZmVjdHMNCi0gICAgICAgICAgICAgICAgaWYgKGxhc3RFbGVtZW50WzBdLnNlbGVjdGVkICE9PSBvcHRpb24uc2VsZWN0ZWQpIHsNCi0gICAgICAgICAgICAgICAgICBsYXN0RWxlbWVudC5wcm9wKCdzZWxlY3RlZCcsIChleGlzdGluZ09wdGlvbi5zZWxlY3RlZCA9IG9wdGlvbi5zZWxlY3RlZCkpOw0KLSAgICAgICAgICAgICAgICAgIGlmIChtc2llKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBTZWUgIzc2OTINCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZWxlY3RlZCBpdGVtIHdvdWxkbid0IHZpc3VhbGx5IHVwZGF0ZSBvbiBJRSB3aXRob3V0IHRoaXMuDQotICAgICAgICAgICAgICAgICAgICAvLyBUZXN0ZWQgb24gV2luNzogSUU5LCBJRTEwIGFuZCBJRTExLiBGdXR1cmUgSUVzIHNob3VsZCBiZSB0ZXN0ZWQgYXMgd2VsbA0KLSAgICAgICAgICAgICAgICAgICAgbGFzdEVsZW1lbnQucHJvcCgnc2VsZWN0ZWQnLCBleGlzdGluZ09wdGlvbi5zZWxlY3RlZCk7DQotICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAvLyBncm93IGVsZW1lbnRzDQotDQotICAgICAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBudWxsIG9wdGlvbg0KLSAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmlkID09PSAnJyAmJiBudWxsT3B0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgLy8gcHV0IGJhY2sgdGhlIHByZS1jb21waWxlZCBlbGVtZW50DQotICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG51bGxPcHRpb247DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgLy8galF1ZXJ5KHYxLjQuMikgQnVnOiBXZSBzaG91bGQgYmUgYWJsZSB0byBjaGFpbiB0aGUgbWV0aG9kIGNhbGxzLCBidXQNCi0gICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5IG9uIHNvbWUgYnJvd3NlciB0aGUgLnRleHQoKSByZXR1cm5zIGEgc3RyaW5nDQotICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoZW4gdGhlIGVsZW1lbnQuDQotICAgICAgICAgICAgICAgICAgKGVsZW1lbnQgPSBvcHRpb25UZW1wbGF0ZS5jbG9uZSgpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAudmFsKG9wdGlvbi5pZCkNCi0gICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NlbGVjdGVkJywgb3B0aW9uLnNlbGVjdGVkKQ0KLSAgICAgICAgICAgICAgICAgICAgICAuYXR0cignc2VsZWN0ZWQnLCBvcHRpb24uc2VsZWN0ZWQpDQotICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdsYWJlbCcsIG9wdGlvbi5sYWJlbCkNCi0gICAgICAgICAgICAgICAgICAgICAgLnRleHQob3B0aW9uLmxhYmVsKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBleGlzdGluZ09wdGlvbnMucHVzaChleGlzdGluZ09wdGlvbiA9IHsNCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsDQotICAgICAgICAgICAgICAgICAgICBsYWJlbDogb3B0aW9uLmxhYmVsLA0KLSAgICAgICAgICAgICAgICAgICAgaWQ6IG9wdGlvbi5pZCwNCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBvcHRpb24uc2VsZWN0ZWQNCi0gICAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgICAgIHVwZGF0ZUxhYmVsTWFwKGxhYmVsTWFwLCBvcHRpb24ubGFiZWwsIHRydWUpOw0KLSAgICAgICAgICAgICAgICBpZiAobGFzdEVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgICBsYXN0RWxlbWVudC5hZnRlcihlbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICBleGlzdGluZ1BhcmVudC5lbGVtZW50LmFwcGVuZChlbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBsYXN0RWxlbWVudCA9IGVsZW1lbnQ7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgZXhjZXNzaXZlIE9QVElPTnMgaW4gYSBncm91cA0KLSAgICAgICAgICAgIGluZGV4Kys7IC8vIGluY3JlbWVudCBzaW5jZSB0aGUgZXhpc3RpbmdPcHRpb25zWzBdIGlzIHBhcmVudCBlbGVtZW50IG5vdCBPUFRJT04NCi0gICAgICAgICAgICB3aGlsZSAoZXhpc3RpbmdPcHRpb25zLmxlbmd0aCA+IGluZGV4KSB7DQotICAgICAgICAgICAgICBvcHRpb24gPSBleGlzdGluZ09wdGlvbnMucG9wKCk7DQotICAgICAgICAgICAgICB1cGRhdGVMYWJlbE1hcChsYWJlbE1hcCwgb3B0aW9uLmxhYmVsLCBmYWxzZSk7DQotICAgICAgICAgICAgICBvcHRpb24uZWxlbWVudC5yZW1vdmUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgICAgLy8gcmVtb3ZlIGFueSBleGNlc3NpdmUgT1BUR1JPVVBzIGZyb20gc2VsZWN0DQotICAgICAgICAgIHdoaWxlIChvcHRpb25Hcm91cHNDYWNoZS5sZW5ndGggPiBncm91cEluZGV4KSB7DQotICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgbGFiZWxzIGluIHRoZSBvcHRpb24gZ3JvdXANCi0gICAgICAgICAgICBvcHRpb25Hcm91cCA9IG9wdGlvbkdyb3Vwc0NhY2hlLnBvcCgpOw0KLSAgICAgICAgICAgIGZvciAoaW5kZXggPSAxOyBpbmRleCA8IG9wdGlvbkdyb3VwLmxlbmd0aDsgKytpbmRleCkgew0KLSAgICAgICAgICAgICAgdXBkYXRlTGFiZWxNYXAobGFiZWxNYXAsIG9wdGlvbkdyb3VwW2luZGV4XS5sYWJlbCwgZmFsc2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBvcHRpb25Hcm91cFswXS5lbGVtZW50LnJlbW92ZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGZvckVhY2gobGFiZWxNYXAsIGZ1bmN0aW9uKGNvdW50LCBsYWJlbCkgew0KLSAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsNCi0gICAgICAgICAgICAgIHNlbGVjdEN0cmwuYWRkT3B0aW9uKGxhYmVsKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDwgMCkgew0KLSAgICAgICAgICAgICAgc2VsZWN0Q3RybC5yZW1vdmVPcHRpb24obGFiZWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9Ow0KLX1dOw0KLQ0KLXZhciBvcHRpb25EaXJlY3RpdmUgPSBbJyRpbnRlcnBvbGF0ZScsIGZ1bmN0aW9uKCRpbnRlcnBvbGF0ZSkgew0KLSAgdmFyIG51bGxTZWxlY3RDdHJsID0gew0KLSAgICBhZGRPcHRpb246IG5vb3AsDQotICAgIHJlbW92ZU9wdGlvbjogbm9vcA0KLSAgfTsNCi0NCi0gIHJldHVybiB7DQotICAgIHJlc3RyaWN0OiAnRScsDQotICAgIHByaW9yaXR5OiAxMDAsDQotICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHsNCi0gICAgICBpZiAoaXNVbmRlZmluZWQoYXR0ci52YWx1ZSkpIHsNCi0gICAgICAgIHZhciBpbnRlcnBvbGF0ZUZuID0gJGludGVycG9sYXRlKGVsZW1lbnQudGV4dCgpLCB0cnVlKTsNCi0gICAgICAgIGlmICghaW50ZXJwb2xhdGVGbikgew0KLSAgICAgICAgICBhdHRyLiRzZXQoJ3ZhbHVlJywgZWxlbWVudC50ZXh0KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0gICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsNCi0gICAgICAgIHZhciBzZWxlY3RDdHJsTmFtZSA9ICckc2VsZWN0Q29udHJvbGxlcicsDQotICAgICAgICAgICAgcGFyZW50ID0gZWxlbWVudC5wYXJlbnQoKSwNCi0gICAgICAgICAgICBzZWxlY3RDdHJsID0gcGFyZW50LmRhdGEoc2VsZWN0Q3RybE5hbWUpIHx8DQotICAgICAgICAgICAgICBwYXJlbnQucGFyZW50KCkuZGF0YShzZWxlY3RDdHJsTmFtZSk7IC8vIGluIGNhc2Ugd2UgYXJlIGluIG9wdGdyb3VwDQotDQotICAgICAgICBpZiAoIXNlbGVjdEN0cmwgfHwgIXNlbGVjdEN0cmwuZGF0YWJvdW5kKSB7DQotICAgICAgICAgIHNlbGVjdEN0cmwgPSBudWxsU2VsZWN0Q3RybDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChpbnRlcnBvbGF0ZUZuKSB7DQotICAgICAgICAgIHNjb3BlLiR3YXRjaChpbnRlcnBvbGF0ZUZuLCBmdW5jdGlvbiBpbnRlcnBvbGF0ZVdhdGNoQWN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7DQotICAgICAgICAgICAgYXR0ci4kc2V0KCd2YWx1ZScsIG5ld1ZhbCk7DQotICAgICAgICAgICAgaWYgKG9sZFZhbCAhPT0gbmV3VmFsKSB7DQotICAgICAgICAgICAgICBzZWxlY3RDdHJsLnJlbW92ZU9wdGlvbihvbGRWYWwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBzZWxlY3RDdHJsLmFkZE9wdGlvbihuZXdWYWwsIGVsZW1lbnQpOw0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIHNlbGVjdEN0cmwuYWRkT3B0aW9uKGF0dHIudmFsdWUsIGVsZW1lbnQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZWxlbWVudC5vbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHsNCi0gICAgICAgICAgc2VsZWN0Q3RybC5yZW1vdmVPcHRpb24oYXR0ci52YWx1ZSk7DQotICAgICAgICB9KTsNCi0gICAgICB9Ow0KLSAgICB9DQotICB9Ow0KLX1dOw0KLQ0KLXZhciBzdHlsZURpcmVjdGl2ZSA9IHZhbHVlRm4oew0KLSAgcmVzdHJpY3Q6ICdFJywNCi0gIHRlcm1pbmFsOiBmYWxzZQ0KLX0pOw0KLQ0KLSAgaWYgKHdpbmRvdy5hbmd1bGFyLmJvb3RzdHJhcCkgew0KLSAgICAvL0FuZ3VsYXJKUyBpcyBhbHJlYWR5IGxvYWRlZCwgc28gd2UgY2FuIHJldHVybiBoZXJlLi4uDQotICAgIGNvbnNvbGUubG9nKCdXQVJOSU5HOiBUcmllZCB0byBsb2FkIGFuZ3VsYXIgbW9yZSB0aGFuIG9uY2UuJyk7DQotICAgIHJldHVybjsNCi0gIH0NCi0NCi0gIC8vdHJ5IHRvIGJpbmQgdG8ganF1ZXJ5IG5vdyBzbyB0aGF0IG9uZSBjYW4gd3JpdGUganFMaXRlKGRvY3VtZW50KS5yZWFkeSgpDQotICAvL2J1dCB3ZSB3aWxsIHJlYmluZCBvbiBib290c3RyYXAgYWdhaW4uDQotICBiaW5kSlF1ZXJ5KCk7DQotDQotICBwdWJsaXNoRXh0ZXJuYWxBUEkoYW5ndWxhcik7DQotDQotICBqcUxpdGUoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgew0KLSAgICBhbmd1bGFySW5pdChkb2N1bWVudCwgYm9vdHN0cmFwKTsNCi0gIH0pOw0KLQ0KLX0pKHdpbmRvdywgZG9jdW1lbnQpOw0KLQ0KLSF3aW5kb3cuYW5ndWxhci4kJGNzcCgpICYmIHdpbmRvdy5hbmd1bGFyLmVsZW1lbnQoZG9jdW1lbnQpLmZpbmQoJ2hlYWQnKS5wcmVwZW5kKCc8c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBjaGFyc2V0ICJVVEYtOCI7W25nXFw6Y2xvYWtdLFtuZy1jbG9ha10sW2RhdGEtbmctY2xvYWtdLFt4LW5nLWNsb2FrXSwubmctY2xvYWssLngtbmctY2xvYWssLm5nLWhpZGU6bm90KC5uZy1oaWRlLWFuaW1hdGUpe2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50O31uZ1xcOmZvcm17ZGlzcGxheTpibG9jazt9PC9zdHlsZT4nKTsNCisvKgorVGhlIE1JVCBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKyovCisvKioKKyAqIEBsaWNlbnNlIEFuZ3VsYXJKUyB2MS4zLjgKKyAqIChjKSAyMDEwLTIwMTQgR29vZ2xlLCBJbmMuIGh0dHA6Ly9hbmd1bGFyanMub3JnCisgKiBMaWNlbnNlOiBNSVQKKyAqLworKGZ1bmN0aW9uKHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkgeyd1c2Ugc3RyaWN0JzsKKworLyoqCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBUaGlzIG9iamVjdCBwcm92aWRlcyBhIHV0aWxpdHkgZm9yIHByb2R1Y2luZyByaWNoIEVycm9yIG1lc3NhZ2VzIHdpdGhpbgorICogQW5ndWxhci4gSXQgY2FuIGJlIGNhbGxlZCBhcyBmb2xsb3dzOgorICoKKyAqIHZhciBleGFtcGxlTWluRXJyID0gbWluRXJyKCdleGFtcGxlJyk7CisgKiB0aHJvdyBleGFtcGxlTWluRXJyKCdvbmUnLCAnVGhpcyB7MH0gaXMgezF9JywgZm9vLCBiYXIpOworICoKKyAqIFRoZSBhYm92ZSBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIG1pbkVyciBpbiB0aGUgZXhhbXBsZSBuYW1lc3BhY2UuIFRoZQorICogcmVzdWx0aW5nIGVycm9yIHdpbGwgaGF2ZSBhIG5hbWVzcGFjZWQgZXJyb3IgY29kZSBvZiBleGFtcGxlLm9uZS4gIFRoZQorICogcmVzdWx0aW5nIGVycm9yIHdpbGwgcmVwbGFjZSB7MH0gd2l0aCB0aGUgdmFsdWUgb2YgZm9vLCBhbmQgezF9IHdpdGggdGhlCisgKiB2YWx1ZSBvZiBiYXIuIFRoZSBvYmplY3QgaXMgbm90IHJlc3RyaWN0ZWQgaW4gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaXQgY2FuCisgKiB0YWtlLgorICoKKyAqIElmIGZld2VyIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIHRoYW4gbmVjZXNzYXJ5IGZvciBpbnRlcnBvbGF0aW9uLCB0aGUgZXh0cmEKKyAqIGludGVycG9sYXRpb24gbWFya2VycyB3aWxsIGJlIHByZXNlcnZlZCBpbiB0aGUgZmluYWwgc3RyaW5nLgorICoKKyAqIFNpbmNlIGRhdGEgd2lsbCBiZSBwYXJzZWQgc3RhdGljYWxseSBkdXJpbmcgYSBidWlsZCBzdGVwLCBzb21lIHJlc3RyaWN0aW9ucworICogYXJlIGFwcGxpZWQgd2l0aCByZXNwZWN0IHRvIGhvdyBtaW5FcnIgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGFuZCBjYWxsZWQuCisgKiBJbnN0YW5jZXMgc2hvdWxkIGhhdmUgbmFtZXMgb2YgdGhlIGZvcm0gbmFtZXNwYWNlTWluRXJyIGZvciBhIG1pbkVyciBjcmVhdGVkCisgKiB1c2luZyBtaW5FcnIoJ25hbWVzcGFjZScpIC4gRXJyb3IgY29kZXMsIG5hbWVzcGFjZXMgYW5kIHRlbXBsYXRlIHN0cmluZ3MKKyAqIHNob3VsZCBhbGwgYmUgc3RhdGljIHN0cmluZ3MsIG5vdCB2YXJpYWJsZXMgb3IgZ2VuZXJhbCBleHByZXNzaW9ucy4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlIFRoZSBuYW1lc3BhY2UgdG8gdXNlIGZvciB0aGUgbmV3IG1pbkVyciBpbnN0YW5jZS4KKyAqIEBwYXJhbSB7ZnVuY3Rpb259IEVycm9yQ29uc3RydWN0b3IgQ3VzdG9tIGVycm9yIGNvbnN0cnVjdG9yIHRvIGJlIGluc3RhbnRpYXRlZCB3aGVuIHJldHVybmluZworICogICBlcnJvciBmcm9tIHJldHVybmVkIGZ1bmN0aW9uLCBmb3IgY2FzZXMgd2hlbiBhIHBhcnRpY3VsYXIgdHlwZSBvZiBlcnJvciBpcyB1c2VmdWwuCisgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29kZTpzdHJpbmcsIHRlbXBsYXRlOnN0cmluZywgLi4udGVtcGxhdGVBcmdzKTogRXJyb3J9IG1pbkVyciBpbnN0YW5jZQorICovCisKK2Z1bmN0aW9uIG1pbkVycihtb2R1bGUsIEVycm9yQ29uc3RydWN0b3IpIHsKKyAgRXJyb3JDb25zdHJ1Y3RvciA9IEVycm9yQ29uc3RydWN0b3IgfHwgRXJyb3I7CisgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICB2YXIgY29kZSA9IGFyZ3VtZW50c1swXSwKKyAgICAgIHByZWZpeCA9ICdbJyArIChtb2R1bGUgPyBtb2R1bGUgKyAnOicgOiAnJykgKyBjb2RlICsgJ10gJywKKyAgICAgIHRlbXBsYXRlID0gYXJndW1lbnRzWzFdLAorICAgICAgdGVtcGxhdGVBcmdzID0gYXJndW1lbnRzLAorCisgICAgICBtZXNzYWdlLCBpOworCisgICAgbWVzc2FnZSA9IHByZWZpeCArIHRlbXBsYXRlLnJlcGxhY2UoL1x7XGQrXH0vZywgZnVuY3Rpb24obWF0Y2gpIHsKKyAgICAgIHZhciBpbmRleCA9ICttYXRjaC5zbGljZSgxLCAtMSksIGFyZzsKKworICAgICAgaWYgKGluZGV4ICsgMiA8IHRlbXBsYXRlQXJncy5sZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIHRvRGVidWdTdHJpbmcodGVtcGxhdGVBcmdzW2luZGV4ICsgMl0pOworICAgICAgfQorICAgICAgcmV0dXJuIG1hdGNoOworICAgIH0pOworCisgICAgbWVzc2FnZSA9IG1lc3NhZ2UgKyAnXG5odHRwOi8vZXJyb3JzLmFuZ3VsYXJqcy5vcmcvMS4zLjgvJyArCisgICAgICAobW9kdWxlID8gbW9kdWxlICsgJy8nIDogJycpICsgY29kZTsKKyAgICBmb3IgKGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICBtZXNzYWdlID0gbWVzc2FnZSArIChpID09IDIgPyAnPycgOiAnJicpICsgJ3AnICsgKGkgLSAyKSArICc9JyArCisgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCh0b0RlYnVnU3RyaW5nKGFyZ3VtZW50c1tpXSkpOworICAgIH0KKyAgICByZXR1cm4gbmV3IEVycm9yQ29uc3RydWN0b3IobWVzc2FnZSk7CisgIH07Cit9CisKKy8qIFdlIG5lZWQgdG8gdGVsbCBqc2hpbnQgd2hhdCB2YXJpYWJsZXMgYXJlIGJlaW5nIGV4cG9ydGVkICovCisvKiBnbG9iYWwgYW5ndWxhcjogdHJ1ZSwKKyAgbXNpZTogdHJ1ZSwKKyAganFMaXRlOiB0cnVlLAorICBqUXVlcnk6IHRydWUsCisgIHNsaWNlOiB0cnVlLAorICBzcGxpY2U6IHRydWUsCisgIHB1c2g6IHRydWUsCisgIHRvU3RyaW5nOiB0cnVlLAorICBuZ01pbkVycjogdHJ1ZSwKKyAgYW5ndWxhck1vZHVsZTogdHJ1ZSwKKyAgdWlkOiB0cnVlLAorICBSRUdFWF9TVFJJTkdfUkVHRVhQOiB0cnVlLAorICBWQUxJRElUWV9TVEFURV9QUk9QRVJUWTogdHJ1ZSwKKworICBsb3dlcmNhc2U6IHRydWUsCisgIHVwcGVyY2FzZTogdHJ1ZSwKKyAgbWFudWFsTG93ZXJjYXNlOiB0cnVlLAorICBtYW51YWxVcHBlcmNhc2U6IHRydWUsCisgIG5vZGVOYW1lXzogdHJ1ZSwKKyAgaXNBcnJheUxpa2U6IHRydWUsCisgIGZvckVhY2g6IHRydWUsCisgIHNvcnRlZEtleXM6IHRydWUsCisgIGZvckVhY2hTb3J0ZWQ6IHRydWUsCisgIHJldmVyc2VQYXJhbXM6IHRydWUsCisgIG5leHRVaWQ6IHRydWUsCisgIHNldEhhc2hLZXk6IHRydWUsCisgIGV4dGVuZDogdHJ1ZSwKKyAgaW50OiB0cnVlLAorICBpbmhlcml0OiB0cnVlLAorICBub29wOiB0cnVlLAorICBpZGVudGl0eTogdHJ1ZSwKKyAgdmFsdWVGbjogdHJ1ZSwKKyAgaXNVbmRlZmluZWQ6IHRydWUsCisgIGlzRGVmaW5lZDogdHJ1ZSwKKyAgaXNPYmplY3Q6IHRydWUsCisgIGlzU3RyaW5nOiB0cnVlLAorICBpc051bWJlcjogdHJ1ZSwKKyAgaXNEYXRlOiB0cnVlLAorICBpc0FycmF5OiB0cnVlLAorICBpc0Z1bmN0aW9uOiB0cnVlLAorICBpc1JlZ0V4cDogdHJ1ZSwKKyAgaXNXaW5kb3c6IHRydWUsCisgIGlzU2NvcGU6IHRydWUsCisgIGlzRmlsZTogdHJ1ZSwKKyAgaXNGb3JtRGF0YTogdHJ1ZSwKKyAgaXNCbG9iOiB0cnVlLAorICBpc0Jvb2xlYW46IHRydWUsCisgIGlzUHJvbWlzZUxpa2U6IHRydWUsCisgIHRyaW06IHRydWUsCisgIGVzY2FwZUZvclJlZ2V4cDogdHJ1ZSwKKyAgaXNFbGVtZW50OiB0cnVlLAorICBtYWtlTWFwOiB0cnVlLAorICBpbmNsdWRlczogdHJ1ZSwKKyAgYXJyYXlSZW1vdmU6IHRydWUsCisgIGNvcHk6IHRydWUsCisgIHNoYWxsb3dDb3B5OiB0cnVlLAorICBlcXVhbHM6IHRydWUsCisgIGNzcDogdHJ1ZSwKKyAgY29uY2F0OiB0cnVlLAorICBzbGljZUFyZ3M6IHRydWUsCisgIGJpbmQ6IHRydWUsCisgIHRvSnNvblJlcGxhY2VyOiB0cnVlLAorICB0b0pzb246IHRydWUsCisgIGZyb21Kc29uOiB0cnVlLAorICBzdGFydGluZ1RhZzogdHJ1ZSwKKyAgdHJ5RGVjb2RlVVJJQ29tcG9uZW50OiB0cnVlLAorICBwYXJzZUtleVZhbHVlOiB0cnVlLAorICB0b0tleVZhbHVlOiB0cnVlLAorICBlbmNvZGVVcmlTZWdtZW50OiB0cnVlLAorICBlbmNvZGVVcmlRdWVyeTogdHJ1ZSwKKyAgYW5ndWxhckluaXQ6IHRydWUsCisgIGJvb3RzdHJhcDogdHJ1ZSwKKyAgZ2V0VGVzdGFiaWxpdHk6IHRydWUsCisgIHNuYWtlX2Nhc2U6IHRydWUsCisgIGJpbmRKUXVlcnk6IHRydWUsCisgIGFzc2VydEFyZzogdHJ1ZSwKKyAgYXNzZXJ0QXJnRm46IHRydWUsCisgIGFzc2VydE5vdEhhc093blByb3BlcnR5OiB0cnVlLAorICBnZXR0ZXI6IHRydWUsCisgIGdldEJsb2NrTm9kZXM6IHRydWUsCisgIGhhc093blByb3BlcnR5OiB0cnVlLAorICBjcmVhdGVNYXA6IHRydWUsCisKKyAgTk9ERV9UWVBFX0VMRU1FTlQ6IHRydWUsCisgIE5PREVfVFlQRV9URVhUOiB0cnVlLAorICBOT0RFX1RZUEVfQ09NTUVOVDogdHJ1ZSwKKyAgTk9ERV9UWVBFX0RPQ1VNRU5UOiB0cnVlLAorICBOT0RFX1RZUEVfRE9DVU1FTlRfRlJBR01FTlQ6IHRydWUsCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBAbmdkb2MgbW9kdWxlCisgKiBAbmFtZSBuZworICogQG1vZHVsZSBuZworICogQGRlc2NyaXB0aW9uCisgKgorICogIyBuZyAoY29yZSBtb2R1bGUpCisgKiBUaGUgbmcgbW9kdWxlIGlzIGxvYWRlZCBieSBkZWZhdWx0IHdoZW4gYW4gQW5ndWxhckpTIGFwcGxpY2F0aW9uIGlzIHN0YXJ0ZWQuIFRoZSBtb2R1bGUgaXRzZWxmCisgKiBjb250YWlucyB0aGUgZXNzZW50aWFsIGNvbXBvbmVudHMgZm9yIGFuIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbiB0byBmdW5jdGlvbi4gVGhlIHRhYmxlIGJlbG93CisgKiBsaXN0cyBhIGhpZ2ggbGV2ZWwgYnJlYWtkb3duIG9mIGVhY2ggb2YgdGhlIHNlcnZpY2VzL2ZhY3RvcmllcywgZmlsdGVycywgZGlyZWN0aXZlcyBhbmQgdGVzdGluZworICogY29tcG9uZW50cyBhdmFpbGFibGUgd2l0aGluIHRoaXMgY29yZSBtb2R1bGUuCisgKgorICogPGRpdiBkb2MtbW9kdWxlLWNvbXBvbmVudHM9Im5nIj48L2Rpdj4KKyAqLworCit2YXIgUkVHRVhfU1RSSU5HX1JFR0VYUCA9IC9eXC8oLispXC8oW2Etel0qKSQvOworCisvLyBUaGUgbmFtZSBvZiBhIGZvcm0gY29udHJvbCdzIFZhbGlkaXR5U3RhdGUgcHJvcGVydHkuCisvLyBUaGlzIGlzIHVzZWQgc28gdGhhdCBpdCdzIHBvc3NpYmxlIGZvciBpbnRlcm5hbCB0ZXN0cyB0byBjcmVhdGUgbW9jayBWYWxpZGl0eVN0YXRlcy4KK3ZhciBWQUxJRElUWV9TVEFURV9QUk9QRVJUWSA9ICd2YWxpZGl0eSc7CisKKy8qKgorICogQG5nZG9jIGZ1bmN0aW9uCisgKiBAbmFtZSBhbmd1bGFyLmxvd2VyY2FzZQorICogQG1vZHVsZSBuZworICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gbG93ZXJjYXNlLgorICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBTdHJpbmcgdG8gYmUgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IExvd2VyY2FzZWQgc3RyaW5nLgorICovCit2YXIgbG93ZXJjYXNlID0gZnVuY3Rpb24oc3RyaW5nKSB7cmV0dXJuIGlzU3RyaW5nKHN0cmluZykgPyBzdHJpbmcudG9Mb3dlckNhc2UoKSA6IHN0cmluZzt9OwordmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKKworLyoqCisgKiBAbmdkb2MgZnVuY3Rpb24KKyAqIEBuYW1lIGFuZ3VsYXIudXBwZXJjYXNlCisgKiBAbW9kdWxlIG5nCisgKiBAa2luZCBmdW5jdGlvbgorICoKKyAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB1cHBlcmNhc2UuCisgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLgorICogQHJldHVybnMge3N0cmluZ30gVXBwZXJjYXNlZCBzdHJpbmcuCisgKi8KK3ZhciB1cHBlcmNhc2UgPSBmdW5jdGlvbihzdHJpbmcpIHtyZXR1cm4gaXNTdHJpbmcoc3RyaW5nKSA/IHN0cmluZy50b1VwcGVyQ2FzZSgpIDogc3RyaW5nO307CisKKwordmFyIG1hbnVhbExvd2VyY2FzZSA9IGZ1bmN0aW9uKHMpIHsKKyAgLyoganNoaW50IGJpdHdpc2U6IGZhbHNlICovCisgIHJldHVybiBpc1N0cmluZyhzKQorICAgICAgPyBzLnJlcGxhY2UoL1tBLVpdL2csIGZ1bmN0aW9uKGNoKSB7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2guY2hhckNvZGVBdCgwKSB8IDMyKTt9KQorICAgICAgOiBzOworfTsKK3ZhciBtYW51YWxVcHBlcmNhc2UgPSBmdW5jdGlvbihzKSB7CisgIC8qIGpzaGludCBiaXR3aXNlOiBmYWxzZSAqLworICByZXR1cm4gaXNTdHJpbmcocykKKyAgICAgID8gcy5yZXBsYWNlKC9bYS16XS9nLCBmdW5jdGlvbihjaCkge3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCkgJiB+MzIpO30pCisgICAgICA6IHM7Cit9OworCisKKy8vIFN0cmluZyN0b0xvd2VyQ2FzZSBhbmQgU3RyaW5nI3RvVXBwZXJDYXNlIGRvbid0IHByb2R1Y2UgY29ycmVjdCByZXN1bHRzIGluIGJyb3dzZXJzIHdpdGggVHVya2lzaAorLy8gbG9jYWxlLCBmb3IgdGhpcyByZWFzb24gd2UgbmVlZCB0byBkZXRlY3QgdGhpcyBjYXNlIGFuZCByZWRlZmluZSBsb3dlcmNhc2UvdXBwZXJjYXNlIG1ldGhvZHMKKy8vIHdpdGggY29ycmVjdCBidXQgc2xvd2VyIGFsdGVybmF0aXZlcy4KK2lmICgnaScgIT09ICdJJy50b0xvd2VyQ2FzZSgpKSB7CisgIGxvd2VyY2FzZSA9IG1hbnVhbExvd2VyY2FzZTsKKyAgdXBwZXJjYXNlID0gbWFudWFsVXBwZXJjYXNlOworfQorCisKK3ZhcgorICAgIG1zaWUsICAgICAgICAgICAgIC8vIGhvbGRzIG1ham9yIHZlcnNpb24gbnVtYmVyIGZvciBJRSwgb3IgTmFOIGlmIFVBIGlzIG5vdCBJRS4KKyAgICBqcUxpdGUsICAgICAgICAgICAvLyBkZWxheSBiaW5kaW5nIHNpbmNlIGpRdWVyeSBjb3VsZCBiZSBsb2FkZWQgYWZ0ZXIgdXMuCisgICAgalF1ZXJ5LCAgICAgICAgICAgLy8gZGVsYXkgYmluZGluZworICAgIHNsaWNlICAgICAgICAgICAgID0gW10uc2xpY2UsCisgICAgc3BsaWNlICAgICAgICAgICAgPSBbXS5zcGxpY2UsCisgICAgcHVzaCAgICAgICAgICAgICAgPSBbXS5wdXNoLAorICAgIHRvU3RyaW5nICAgICAgICAgID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKKyAgICBuZ01pbkVyciAgICAgICAgICA9IG1pbkVycignbmcnKSwKKworICAgIC8qKiBAbmFtZSBhbmd1bGFyICovCisgICAgYW5ndWxhciAgICAgICAgICAgPSB3aW5kb3cuYW5ndWxhciB8fCAod2luZG93LmFuZ3VsYXIgPSB7fSksCisgICAgYW5ndWxhck1vZHVsZSwKKyAgICB1aWQgICAgICAgICAgICAgICA9IDA7CisKKy8qKgorICogZG9jdW1lbnRNb2RlIGlzIGFuIElFLW9ubHkgcHJvcGVydHkKKyAqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9jYzE5Njk4OCh2PXZzLjg1KS5hc3B4CisgKi8KK21zaWUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7CisKKworLyoqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHsqfSBvYmoKKyAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBgb2JqYCBpcyBhbiBhcnJheSBvciBhcnJheS1saWtlIG9iamVjdCAoTm9kZUxpc3QsIEFyZ3VtZW50cywKKyAqICAgICAgICAgICAgICAgICAgIFN0cmluZyAuLi4pCisgKi8KK2Z1bmN0aW9uIGlzQXJyYXlMaWtlKG9iaikgeworICBpZiAob2JqID09IG51bGwgfHwgaXNXaW5kb3cob2JqKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZhciBsZW5ndGggPSBvYmoubGVuZ3RoOworCisgIGlmIChvYmoubm9kZVR5cGUgPT09IE5PREVfVFlQRV9FTEVNRU5UICYmIGxlbmd0aCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGlzU3RyaW5nKG9iaikgfHwgaXNBcnJheShvYmopIHx8IGxlbmd0aCA9PT0gMCB8fAorICAgICAgICAgdHlwZW9mIGxlbmd0aCA9PT0gJ251bWJlcicgJiYgbGVuZ3RoID4gMCAmJiAobGVuZ3RoIC0gMSkgaW4gb2JqOworfQorCisvKioKKyAqIEBuZ2RvYyBmdW5jdGlvbgorICogQG5hbWUgYW5ndWxhci5mb3JFYWNoCisgKiBAbW9kdWxlIG5nCisgKiBAa2luZCBmdW5jdGlvbgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogSW52b2tlcyB0aGUgYGl0ZXJhdG9yYCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGl0ZW0gaW4gYG9iamAgY29sbGVjdGlvbiwgd2hpY2ggY2FuIGJlIGVpdGhlciBhbgorICogb2JqZWN0IG9yIGFuIGFycmF5LiBUaGUgYGl0ZXJhdG9yYCBmdW5jdGlvbiBpcyBpbnZva2VkIHdpdGggYGl0ZXJhdG9yKHZhbHVlLCBrZXksIG9iailgLCB3aGVyZSBgdmFsdWVgCisgKiBpcyB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IHByb3BlcnR5IG9yIGFuIGFycmF5IGVsZW1lbnQsIGBrZXlgIGlzIHRoZSBvYmplY3QgcHJvcGVydHkga2V5IG9yCisgKiBhcnJheSBlbGVtZW50IGluZGV4IGFuZCBvYmogaXMgdGhlIGBvYmpgIGl0c2VsZi4gU3BlY2lmeWluZyBhIGBjb250ZXh0YCBmb3IgdGhlIGZ1bmN0aW9uIGlzIG9wdGlvbmFsLgorICoKKyAqIEl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IGAuZm9yRWFjaGAgZG9lcyBub3QgaXRlcmF0ZSBvdmVyIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGJlY2F1c2UgaXQgZmlsdGVycworICogdXNpbmcgdGhlIGBoYXNPd25Qcm9wZXJ0eWAgbWV0aG9kLgorICoKKyAqIFVubGlrZSBFUzI2MidzCisgKiBbQXJyYXkucHJvdG90eXBlLmZvckVhY2hdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS40LjQuMTgpLAorICogUHJvdmlkaW5nICd1bmRlZmluZWQnIG9yICdudWxsJyB2YWx1ZXMgZm9yIGBvYmpgIHdpbGwgbm90IHRocm93IGEgVHlwZUVycm9yLCBidXQgcmF0aGVyIGp1c3QKKyAqIHJldHVybiB0aGUgdmFsdWUgcHJvdmlkZWQuCisgKgorICAgYGBganMKKyAgICAgdmFyIHZhbHVlcyA9IHtuYW1lOiAnbWlza28nLCBnZW5kZXI6ICdtYWxlJ307CisgICAgIHZhciBsb2cgPSBbXTsKKyAgICAgYW5ndWxhci5mb3JFYWNoKHZhbHVlcywgZnVuY3Rpb24odmFsdWUsIGtleSkgeworICAgICAgIHRoaXMucHVzaChrZXkgKyAnOiAnICsgdmFsdWUpOworICAgICB9LCBsb2cpOworICAgICBleHBlY3QobG9nKS50b0VxdWFsKFsnbmFtZTogbWlza28nLCAnZ2VuZGVyOiBtYWxlJ10pOworICAgYGBgCisgKgorICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBPYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgorICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0b3IgSXRlcmF0b3IgZnVuY3Rpb24uCisgKiBAcGFyYW0ge09iamVjdD19IGNvbnRleHQgT2JqZWN0IHRvIGJlY29tZSBjb250ZXh0IChgdGhpc2ApIGZvciB0aGUgaXRlcmF0b3IgZnVuY3Rpb24uCisgKiBAcmV0dXJucyB7T2JqZWN0fEFycmF5fSBSZWZlcmVuY2UgdG8gYG9iamAuCisgKi8KKworZnVuY3Rpb24gZm9yRWFjaChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgIHZhciBrZXksIGxlbmd0aDsKKyAgaWYgKG9iaikgeworICAgIGlmIChpc0Z1bmN0aW9uKG9iaikpIHsKKyAgICAgIGZvciAoa2V5IGluIG9iaikgeworICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIGhhc093blByb3BlcnR5IGV4aXN0cywKKyAgICAgICAgLy8gYXMgb24gSUU4IHRoZSByZXN1bHQgb2YgcXVlcnlTZWxlY3RvckFsbCBpcyBhbiBvYmplY3Qgd2l0aG91dCBhIGhhc093blByb3BlcnR5IGZ1bmN0aW9uCisgICAgICAgIGlmIChrZXkgIT0gJ3Byb3RvdHlwZScgJiYga2V5ICE9ICdsZW5ndGgnICYmIGtleSAhPSAnbmFtZScgJiYgKCFvYmouaGFzT3duUHJvcGVydHkgfHwgb2JqLmhhc093blByb3BlcnR5KGtleSkpKSB7CisgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpc0FycmF5KG9iaikgfHwgaXNBcnJheUxpa2Uob2JqKSkgeworICAgICAgdmFyIGlzUHJpbWl0aXZlID0gdHlwZW9mIG9iaiAhPT0gJ29iamVjdCc7CisgICAgICBmb3IgKGtleSA9IDAsIGxlbmd0aCA9IG9iai5sZW5ndGg7IGtleSA8IGxlbmd0aDsga2V5KyspIHsKKyAgICAgICAgaWYgKGlzUHJpbWl0aXZlIHx8IGtleSBpbiBvYmopIHsKKyAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtrZXldLCBrZXksIG9iaik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG9iai5mb3JFYWNoICYmIG9iai5mb3JFYWNoICE9PSBmb3JFYWNoKSB7CisgICAgICAgIG9iai5mb3JFYWNoKGl0ZXJhdG9yLCBjb250ZXh0LCBvYmopOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGtleSBpbiBvYmopIHsKKyAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBvYmo7Cit9CisKK2Z1bmN0aW9uIHNvcnRlZEtleXMob2JqKSB7CisgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLnNvcnQoKTsKK30KKworZnVuY3Rpb24gZm9yRWFjaFNvcnRlZChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgIHZhciBrZXlzID0gc29ydGVkS2V5cyhvYmopOworICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtrZXlzW2ldXSwga2V5c1tpXSk7CisgIH0KKyAgcmV0dXJuIGtleXM7Cit9CisKKworLyoqCisgKiB3aGVuIHVzaW5nIGZvckVhY2ggdGhlIHBhcmFtcyBhcmUgdmFsdWUsIGtleSwgYnV0IGl0IGlzIG9mdGVuIHVzZWZ1bCB0byBoYXZlIGtleSwgdmFsdWUuCisgKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZywgKil9IGl0ZXJhdG9yRm4KKyAqIEByZXR1cm5zIHtmdW5jdGlvbigqLCBzdHJpbmcpfQorICovCitmdW5jdGlvbiByZXZlcnNlUGFyYW1zKGl0ZXJhdG9yRm4pIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsgaXRlcmF0b3JGbihrZXksIHZhbHVlKTsgfTsKK30KKworLyoqCisgKiBBIGNvbnNpc3RlbnQgd2F5IG9mIGNyZWF0aW5nIHVuaXF1ZSBJRHMgaW4gYW5ndWxhci4KKyAqCisgKiBVc2luZyBzaW1wbGUgbnVtYmVycyBhbGxvd3MgdXMgdG8gZ2VuZXJhdGUgMjguNiBtaWxsaW9uIHVuaXF1ZSBpZHMgcGVyIHNlY29uZCBmb3IgMTAgeWVhcnMgYmVmb3JlCisgKiB3ZSBoaXQgbnVtYmVyIHByZWNpc2lvbiBpc3N1ZXMgaW4gSmF2YVNjcmlwdC4KKyAqCisgKiBNYXRoLnBvdygyLDUzKSAvIDYwIC8gNjAgLyAyNCAvIDM2NSAvIDEwID0gMjguNk0KKyAqCisgKiBAcmV0dXJucyB7bnVtYmVyfSBhbiB1bmlxdWUgYWxwaGEtbnVtZXJpYyBzdHJpbmcKKyAqLworZnVuY3Rpb24gbmV4dFVpZCgpIHsKKyAgcmV0dXJuICsrdWlkOworfQorCisKKy8qKgorICogU2V0IG9yIGNsZWFyIHRoZSBoYXNoa2V5IGZvciBhbiBvYmplY3QuCisgKiBAcGFyYW0gb2JqIG9iamVjdAorICogQHBhcmFtIGggdGhlIGhhc2hrZXkgKCF0cnV0aHkgdG8gZGVsZXRlIHRoZSBoYXNoa2V5KQorICovCitmdW5jdGlvbiBzZXRIYXNoS2V5KG9iaiwgaCkgeworICBpZiAoaCkgeworICAgIG9iai4kJGhhc2hLZXkgPSBoOworICB9CisgIGVsc2UgeworICAgIGRlbGV0ZSBvYmouJCRoYXNoS2V5OworICB9Cit9CisKKy8qKgorICogQG5nZG9jIGZ1bmN0aW9uCisgKiBAbmFtZSBhbmd1bGFyLmV4dGVuZAorICogQG1vZHVsZSBuZworICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIEV4dGVuZHMgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBgZHN0YCBieSBjb3B5aW5nIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgZnJvbSB0aGUgYHNyY2Agb2JqZWN0KHMpCisgKiB0byBgZHN0YC4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIGBzcmNgIG9iamVjdHMuIElmIHlvdSB3YW50IHRvIHByZXNlcnZlIG9yaWdpbmFsIG9iamVjdHMsIHlvdSBjYW4gZG8gc28KKyAqIGJ5IHBhc3NpbmcgYW4gZW1wdHkgb2JqZWN0IGFzIHRoZSB0YXJnZXQ6IGB2YXIgb2JqZWN0ID0gYW5ndWxhci5leHRlbmQoe30sIG9iamVjdDEsIG9iamVjdDIpYC4KKyAqIE5vdGU6IEtlZXAgaW4gbWluZCB0aGF0IGBhbmd1bGFyLmV4dGVuZGAgZG9lcyBub3Qgc3VwcG9ydCByZWN1cnNpdmUgbWVyZ2UgKGRlZXAgY29weSkuCisgKgorICogQHBhcmFtIHtPYmplY3R9IGRzdCBEZXN0aW5hdGlvbiBvYmplY3QuCisgKiBAcGFyYW0gey4uLk9iamVjdH0gc3JjIFNvdXJjZSBvYmplY3QocykuCisgKiBAcmV0dXJucyB7T2JqZWN0fSBSZWZlcmVuY2UgdG8gYGRzdGAuCisgKi8KK2Z1bmN0aW9uIGV4dGVuZChkc3QpIHsKKyAgdmFyIGggPSBkc3QuJCRoYXNoS2V5OworCisgIGZvciAodmFyIGkgPSAxLCBpaSA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgdmFyIG9iaiA9IGFyZ3VtZW50c1tpXTsKKyAgICBpZiAob2JqKSB7CisgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7CisgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBrZXlzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgdmFyIGtleSA9IGtleXNbal07CisgICAgICAgIGRzdFtrZXldID0gb2JqW2tleV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2V0SGFzaEtleShkc3QsIGgpOworICByZXR1cm4gZHN0OworfQorCitmdW5jdGlvbiBpbnQoc3RyKSB7CisgIHJldHVybiBwYXJzZUludChzdHIsIDEwKTsKK30KKworCitmdW5jdGlvbiBpbmhlcml0KHBhcmVudCwgZXh0cmEpIHsKKyAgcmV0dXJuIGV4dGVuZChPYmplY3QuY3JlYXRlKHBhcmVudCksIGV4dHJhKTsKK30KKworLyoqCisgKiBAbmdkb2MgZnVuY3Rpb24KKyAqIEBuYW1lIGFuZ3VsYXIubm9vcAorICogQG1vZHVsZSBuZworICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIEEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBubyBvcGVyYXRpb25zLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiB3cml0aW5nIGNvZGUgaW4gdGhlCisgKiBmdW5jdGlvbmFsIHN0eWxlLgorICAgYGBganMKKyAgICAgZnVuY3Rpb24gZm9vKGNhbGxiYWNrKSB7CisgICAgICAgdmFyIHJlc3VsdCA9IGNhbGN1bGF0ZVJlc3VsdCgpOworICAgICAgIChjYWxsYmFjayB8fCBhbmd1bGFyLm5vb3ApKHJlc3VsdCk7CisgICAgIH0KKyAgIGBgYAorICovCitmdW5jdGlvbiBub29wKCkge30KK25vb3AuJGluamVjdCA9IFtdOworCisKKy8qKgorICogQG5nZG9jIGZ1bmN0aW9uCisgKiBAbmFtZSBhbmd1bGFyLmlkZW50aXR5CisgKiBAbW9kdWxlIG5nCisgKiBAa2luZCBmdW5jdGlvbgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgaXRzIGZpcnN0IGFyZ3VtZW50LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHdyaXRpbmcgY29kZSBpbiB0aGUKKyAqIGZ1bmN0aW9uYWwgc3R5bGUuCisgKgorICAgYGBganMKKyAgICAgZnVuY3Rpb24gdHJhbnNmb3JtZXIodHJhbnNmb3JtYXRpb25GbiwgdmFsdWUpIHsKKyAgICAgICByZXR1cm4gKHRyYW5zZm9ybWF0aW9uRm4gfHwgYW5ndWxhci5pZGVudGl0eSkodmFsdWUpOworICAgICB9OworICAgYGBgCisgICogQHBhcmFtIHsqfSB2YWx1ZSB0byBiZSByZXR1cm5lZC4KKyAgKiBAcmV0dXJucyB7Kn0gdGhlIHZhbHVlIHBhc3NlZCBpbi4KKyAqLworZnVuY3Rpb24gaWRlbnRpdHkoJCkge3JldHVybiAkO30KK2lkZW50aXR5LiRpbmplY3QgPSBbXTsKKworCitmdW5jdGlvbiB2YWx1ZUZuKHZhbHVlKSB7cmV0dXJuIGZ1bmN0aW9uKCkge3JldHVybiB2YWx1ZTt9O30KKworLyoqCisgKiBAbmdkb2MgZnVuY3Rpb24KKyAqIEBuYW1lIGFuZ3VsYXIuaXNVbmRlZmluZWQKKyAqIEBtb2R1bGUgbmcKKyAqIEBraW5kIGZ1bmN0aW9uCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIHVuZGVmaW5lZC4KKyAqCisgKiBAcGFyYW0geyp9IHZhbHVlIFJlZmVyZW5jZSB0byBjaGVjay4KKyAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgdW5kZWZpbmVkLgorICovCitmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge3JldHVybiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnO30KKworCisvKioKKyAqIEBuZ2RvYyBmdW5jdGlvbgorICogQG5hbWUgYW5ndWxhci5pc0RlZmluZWQKKyAqIEBtb2R1bGUgbmcKKyAqIEBraW5kIGZ1bmN0aW9uCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGRlZmluZWQuCisgKgorICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suCisgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGRlZmluZWQuCisgKi8KK2Z1bmN0aW9uIGlzRGVmaW5lZCh2YWx1ZSkge3JldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnO30KKworCisvKioKKyAqIEBuZ2RvYyBmdW5jdGlvbgorICogQG5hbWUgYW5ndWxhci5pc09iamVjdAorICogQG1vZHVsZSBuZworICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIERldGVybWluZXMgaWYgYSByZWZlcmVuY2UgaXMgYW4gYE9iamVjdGAuIFVubGlrZSBgdHlwZW9mYCBpbiBKYXZhU2NyaXB0LCBgbnVsbGBzIGFyZSBub3QKKyAqIGNvbnNpZGVyZWQgdG8gYmUgb2JqZWN0cy4gTm90ZSB0aGF0IEphdmFTY3JpcHQgYXJyYXlzIGFyZSBvYmplY3RzLgorICoKKyAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLgorICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhbiBgT2JqZWN0YCBidXQgbm90IGBudWxsYC4KKyAqLworZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHsKKyAgLy8gaHR0cDovL2pzcGVyZi5jb20vaXNvYmplY3Q0CisgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnOworfQorCisKKy8qKgorICogQG5nZG9jIGZ1bmN0aW9uCisgKiBAbmFtZSBhbmd1bGFyLmlzU3RyaW5nCisgKiBAbW9kdWxlIG5nCisgKiBAa2luZCBmdW5jdGlvbgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBhIGBTdHJpbmdgLgorICoKKyAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLgorICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhIGBTdHJpbmdgLgorICovCitmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge3JldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO30KKworCisvKioKKyAqIEBuZ2RvYyBmdW5jdGlvbgorICogQG5hbWUgYW5ndWxhci5pc051bWJlcgorICogQG1vZHVsZSBuZworICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIERldGVybWluZXMgaWYgYSByZWZlcmVuY2UgaXMgYSBgTnVtYmVyYC4KKyAqCisgKiBAcGFyYW0geyp9IHZhbHVlIFJlZmVyZW5jZSB0byBjaGVjay4KKyAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYSBgTnVtYmVyYC4KKyAqLworZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJzt9CisKKworLyoqCisgKiBAbmdkb2MgZnVuY3Rpb24KKyAqIEBuYW1lIGFuZ3VsYXIuaXNEYXRlCisgKiBAbW9kdWxlIG5nCisgKiBAa2luZCBmdW5jdGlvbgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogRGV0ZXJtaW5lcyBpZiBhIHZhbHVlIGlzIGEgZGF0ZS4KKyAqCisgKiBAcGFyYW0geyp9IHZhbHVlIFJlZmVyZW5jZSB0byBjaGVjay4KKyAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYSBgRGF0ZWAuCisgKi8KK2Z1bmN0aW9uIGlzRGF0ZSh2YWx1ZSkgeworICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IERhdGVdJzsKK30KKworCisvKioKKyAqIEBuZ2RvYyBmdW5jdGlvbgorICogQG5hbWUgYW5ndWxhci5pc0FycmF5CisgKiBAbW9kdWxlIG5nCisgKiBAa2luZCBmdW5jdGlvbgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBhbiBgQXJyYXlgLgorICoKKyAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLgorICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhbiBgQXJyYXlgLgorICovCit2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7CisKKy8qKgorICogQG5nZG9jIGZ1bmN0aW9uCisgKiBAbmFtZSBhbmd1bGFyLmlzRnVuY3Rpb24KKyAqIEBtb2R1bGUgbmcKKyAqIEBraW5kIGZ1bmN0aW9uCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGEgYEZ1bmN0aW9uYC4KKyAqCisgKiBAcGFyYW0geyp9IHZhbHVlIFJlZmVyZW5jZSB0byBjaGVjay4KKyAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYSBgRnVuY3Rpb25gLgorICovCitmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJzt9CisKKworLyoqCisgKiBEZXRlcm1pbmVzIGlmIGEgdmFsdWUgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LgorICoKKyAqIEBwcml2YXRlCisgKiBAcGFyYW0geyp9IHZhbHVlIFJlZmVyZW5jZSB0byBjaGVjay4KKyAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYSBgUmVnRXhwYC4KKyAqLworZnVuY3Rpb24gaXNSZWdFeHAodmFsdWUpIHsKKyAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBSZWdFeHBdJzsKK30KKworCisvKioKKyAqIENoZWNrcyBpZiBgb2JqYCBpcyBhIHdpbmRvdyBvYmplY3QuCisgKgorICogQHByaXZhdGUKKyAqIEBwYXJhbSB7Kn0gb2JqIE9iamVjdCB0byBjaGVjaworICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYG9iamAgaXMgYSB3aW5kb3cgb2JqLgorICovCitmdW5jdGlvbiBpc1dpbmRvdyhvYmopIHsKKyAgcmV0dXJuIG9iaiAmJiBvYmoud2luZG93ID09PSBvYmo7Cit9CisKKworZnVuY3Rpb24gaXNTY29wZShvYmopIHsKKyAgcmV0dXJuIG9iaiAmJiBvYmouJGV2YWxBc3luYyAmJiBvYmouJHdhdGNoOworfQorCisKK2Z1bmN0aW9uIGlzRmlsZShvYmopIHsKKyAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgRmlsZV0nOworfQorCisKK2Z1bmN0aW9uIGlzRm9ybURhdGEob2JqKSB7CisgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEZvcm1EYXRhXSc7Cit9CisKKworZnVuY3Rpb24gaXNCbG9iKG9iaikgeworICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBCbG9iXSc7Cit9CisKKworZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7CisgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJzsKK30KKworCitmdW5jdGlvbiBpc1Byb21pc2VMaWtlKG9iaikgeworICByZXR1cm4gb2JqICYmIGlzRnVuY3Rpb24ob2JqLnRoZW4pOworfQorCisKK3ZhciB0cmltID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlLnRyaW0oKSA6IHZhbHVlOworfTsKKworLy8gQ29waWVkIGZyb206CisvLyBodHRwOi8vZG9jcy5jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vZ2l0L2xvY2FsX2Nsb3N1cmVfZ29vZ19zdHJpbmdfc3RyaW5nLmpzLnNvdXJjZS5odG1sI2xpbmUxMDIxCisvLyBQcmVyZXE6IHMgaXMgYSBzdHJpbmcuCit2YXIgZXNjYXBlRm9yUmVnZXhwID0gZnVuY3Rpb24ocykgeworICByZXR1cm4gcy5yZXBsYWNlKC8oWy0oKVxbXF17fSs/Ki4kXF58LDojPCFcXF0pL2csICdcXCQxJykuCisgICAgICAgICAgIHJlcGxhY2UoL1x4MDgvZywgJ1xceDA4Jyk7Cit9OworCisKKy8qKgorICogQG5nZG9jIGZ1bmN0aW9uCisgKiBAbmFtZSBhbmd1bGFyLmlzRWxlbWVudAorICogQG1vZHVsZSBuZworICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIERldGVybWluZXMgaWYgYSByZWZlcmVuY2UgaXMgYSBET00gZWxlbWVudCAob3Igd3JhcHBlZCBqUXVlcnkgZWxlbWVudCkuCisgKgorICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suCisgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGEgRE9NIGVsZW1lbnQgKG9yIHdyYXBwZWQgalF1ZXJ5IGVsZW1lbnQpLgorICovCitmdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkgeworICByZXR1cm4gISEobm9kZSAmJgorICAgIChub2RlLm5vZGVOYW1lICAvLyB3ZSBhcmUgYSBkaXJlY3QgZWxlbWVudAorICAgIHx8IChub2RlLnByb3AgJiYgbm9kZS5hdHRyICYmIG5vZGUuZmluZCkpKTsgIC8vIHdlIGhhdmUgYW4gb24gYW5kIGZpbmQgbWV0aG9kIHBhcnQgb2YgalF1ZXJ5IEFQSQorfQorCisvKioKKyAqIEBwYXJhbSBzdHIgJ2tleTEsa2V5MiwuLi4nCisgKiBAcmV0dXJucyB7b2JqZWN0fSBpbiB0aGUgZm9ybSBvZiB7a2V5MTp0cnVlLCBrZXkyOnRydWUsIC4uLn0KKyAqLworZnVuY3Rpb24gbWFrZU1hcChzdHIpIHsKKyAgdmFyIG9iaiA9IHt9LCBpdGVtcyA9IHN0ci5zcGxpdCgiLCIpLCBpOworICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCisgICAgb2JqWyBpdGVtc1tpXSBdID0gdHJ1ZTsKKyAgcmV0dXJuIG9iajsKK30KKworCitmdW5jdGlvbiBub2RlTmFtZV8oZWxlbWVudCkgeworICByZXR1cm4gbG93ZXJjYXNlKGVsZW1lbnQubm9kZU5hbWUgfHwgKGVsZW1lbnRbMF0gJiYgZWxlbWVudFswXS5ub2RlTmFtZSkpOworfQorCitmdW5jdGlvbiBpbmNsdWRlcyhhcnJheSwgb2JqKSB7CisgIHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGFycmF5LCBvYmopICE9IC0xOworfQorCitmdW5jdGlvbiBhcnJheVJlbW92ZShhcnJheSwgdmFsdWUpIHsKKyAgdmFyIGluZGV4ID0gYXJyYXkuaW5kZXhPZih2YWx1ZSk7CisgIGlmIChpbmRleCA+PSAwKQorICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7CisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBAbmdkb2MgZnVuY3Rpb24KKyAqIEBuYW1lIGFuZ3VsYXIuY29weQorICogQG1vZHVsZSBuZworICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgYHNvdXJjZWAsIHdoaWNoIHNob3VsZCBiZSBhbiBvYmplY3Qgb3IgYW4gYXJyYXkuCisgKgorICogKiBJZiBubyBkZXN0aW5hdGlvbiBpcyBzdXBwbGllZCwgYSBjb3B5IG9mIHRoZSBvYmplY3Qgb3IgYXJyYXkgaXMgY3JlYXRlZC4KKyAqICogSWYgYSBkZXN0aW5hdGlvbiBpcyBwcm92aWRlZCwgYWxsIG9mIGl0cyBlbGVtZW50cyAoZm9yIGFycmF5cykgb3IgcHJvcGVydGllcyAoZm9yIG9iamVjdHMpCisgKiAgIGFyZSBkZWxldGVkIGFuZCB0aGVuIGFsbCBlbGVtZW50cy9wcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZSBhcmUgY29waWVkIHRvIGl0LgorICogKiBJZiBgc291cmNlYCBpcyBub3QgYW4gb2JqZWN0IG9yIGFycmF5IChpbmMuIGBudWxsYCBhbmQgYHVuZGVmaW5lZGApLCBgc291cmNlYCBpcyByZXR1cm5lZC4KKyAqICogSWYgYHNvdXJjZWAgaXMgaWRlbnRpY2FsIHRvICdkZXN0aW5hdGlvbicgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICoKKyAqIEBwYXJhbSB7Kn0gc291cmNlIFRoZSBzb3VyY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbWFrZSBhIGNvcHkuCisgKiAgICAgICAgICAgICAgICAgICBDYW4gYmUgYW55IHR5cGUsIGluY2x1ZGluZyBwcmltaXRpdmVzLCBgbnVsbGAsIGFuZCBgdW5kZWZpbmVkYC4KKyAqIEBwYXJhbSB7KE9iamVjdHxBcnJheSk9fSBkZXN0aW5hdGlvbiBEZXN0aW5hdGlvbiBpbnRvIHdoaWNoIHRoZSBzb3VyY2UgaXMgY29waWVkLiBJZgorICogICAgIHByb3ZpZGVkLCBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgYHNvdXJjZWAuCisgKiBAcmV0dXJucyB7Kn0gVGhlIGNvcHkgb3IgdXBkYXRlZCBgZGVzdGluYXRpb25gLCBpZiBgZGVzdGluYXRpb25gIHdhcyBzcGVjaWZpZWQuCisgKgorICogQGV4YW1wbGUKKyA8ZXhhbXBsZSBtb2R1bGU9ImNvcHlFeGFtcGxlIj4KKyA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KKyA8Zm9ybSBub3ZhbGlkYXRlIGNsYXNzPSJzaW1wbGUtZm9ybSI+CisgTmFtZTogPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJ1c2VyLm5hbWUiIC8+PGJyIC8+CisgRS1tYWlsOiA8aW5wdXQgdHlwZT0iZW1haWwiIG5nLW1vZGVsPSJ1c2VyLmVtYWlsIiAvPjxiciAvPgorIEdlbmRlcjogPGlucHV0IHR5cGU9InJhZGlvIiBuZy1tb2RlbD0idXNlci5nZW5kZXIiIHZhbHVlPSJtYWxlIiAvPm1hbGUKKyA8aW5wdXQgdHlwZT0icmFkaW8iIG5nLW1vZGVsPSJ1c2VyLmdlbmRlciIgdmFsdWU9ImZlbWFsZSIgLz5mZW1hbGU8YnIgLz4KKyA8YnV0dG9uIG5nLWNsaWNrPSJyZXNldCgpIj5SRVNFVDwvYnV0dG9uPgorIDxidXR0b24gbmctY2xpY2s9InVwZGF0ZSh1c2VyKSI+U0FWRTwvYnV0dG9uPgorIDwvZm9ybT4KKyA8cHJlPmZvcm0gPSB7e3VzZXIgfCBqc29ufX08L3ByZT4KKyA8cHJlPm1hc3RlciA9IHt7bWFzdGVyIHwganNvbn19PC9wcmU+CisgPC9kaXY+CisKKyA8c2NyaXB0PgorICBhbmd1bGFyLm1vZHVsZSgnY29weUV4YW1wbGUnLCBbXSkKKyAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgJHNjb3BlLm1hc3Rlcj0ge307CisKKyAgICAgICRzY29wZS51cGRhdGUgPSBmdW5jdGlvbih1c2VyKSB7CisgICAgICAgIC8vIEV4YW1wbGUgd2l0aCAxIGFyZ3VtZW50CisgICAgICAgICRzY29wZS5tYXN0ZXI9IGFuZ3VsYXIuY29weSh1c2VyKTsKKyAgICAgIH07CisKKyAgICAgICRzY29wZS5yZXNldCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAvLyBFeGFtcGxlIHdpdGggMiBhcmd1bWVudHMKKyAgICAgICAgYW5ndWxhci5jb3B5KCRzY29wZS5tYXN0ZXIsICRzY29wZS51c2VyKTsKKyAgICAgIH07CisKKyAgICAgICRzY29wZS5yZXNldCgpOworICAgIH1dKTsKKyA8L3NjcmlwdD4KKyA8L2ZpbGU+CisgPC9leGFtcGxlPgorICovCitmdW5jdGlvbiBjb3B5KHNvdXJjZSwgZGVzdGluYXRpb24sIHN0YWNrU291cmNlLCBzdGFja0Rlc3QpIHsKKyAgaWYgKGlzV2luZG93KHNvdXJjZSkgfHwgaXNTY29wZShzb3VyY2UpKSB7CisgICAgdGhyb3cgbmdNaW5FcnIoJ2Nwd3MnLAorICAgICAgIkNhbid0IGNvcHkhIE1ha2luZyBjb3BpZXMgb2YgV2luZG93IG9yIFNjb3BlIGluc3RhbmNlcyBpcyBub3Qgc3VwcG9ydGVkLiIpOworICB9CisKKyAgaWYgKCFkZXN0aW5hdGlvbikgeworICAgIGRlc3RpbmF0aW9uID0gc291cmNlOworICAgIGlmIChzb3VyY2UpIHsKKyAgICAgIGlmIChpc0FycmF5KHNvdXJjZSkpIHsKKyAgICAgICAgZGVzdGluYXRpb24gPSBjb3B5KHNvdXJjZSwgW10sIHN0YWNrU291cmNlLCBzdGFja0Rlc3QpOworICAgICAgfSBlbHNlIGlmIChpc0RhdGUoc291cmNlKSkgeworICAgICAgICBkZXN0aW5hdGlvbiA9IG5ldyBEYXRlKHNvdXJjZS5nZXRUaW1lKCkpOworICAgICAgfSBlbHNlIGlmIChpc1JlZ0V4cChzb3VyY2UpKSB7CisgICAgICAgIGRlc3RpbmF0aW9uID0gbmV3IFJlZ0V4cChzb3VyY2Uuc291cmNlLCBzb3VyY2UudG9TdHJpbmcoKS5tYXRjaCgvW15cL10qJC8pWzBdKTsKKyAgICAgICAgZGVzdGluYXRpb24ubGFzdEluZGV4ID0gc291cmNlLmxhc3RJbmRleDsKKyAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkgeworICAgICAgICB2YXIgZW1wdHlPYmplY3QgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpKTsKKyAgICAgICAgZGVzdGluYXRpb24gPSBjb3B5KHNvdXJjZSwgZW1wdHlPYmplY3QsIHN0YWNrU291cmNlLCBzdGFja0Rlc3QpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoc291cmNlID09PSBkZXN0aW5hdGlvbikgdGhyb3cgbmdNaW5FcnIoJ2NwaScsCisgICAgICAiQ2FuJ3QgY29weSEgU291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgaWRlbnRpY2FsLiIpOworCisgICAgc3RhY2tTb3VyY2UgPSBzdGFja1NvdXJjZSB8fCBbXTsKKyAgICBzdGFja0Rlc3QgPSBzdGFja0Rlc3QgfHwgW107CisKKyAgICBpZiAoaXNPYmplY3Qoc291cmNlKSkgeworICAgICAgdmFyIGluZGV4ID0gc3RhY2tTb3VyY2UuaW5kZXhPZihzb3VyY2UpOworICAgICAgaWYgKGluZGV4ICE9PSAtMSkgcmV0dXJuIHN0YWNrRGVzdFtpbmRleF07CisKKyAgICAgIHN0YWNrU291cmNlLnB1c2goc291cmNlKTsKKyAgICAgIHN0YWNrRGVzdC5wdXNoKGRlc3RpbmF0aW9uKTsKKyAgICB9CisKKyAgICB2YXIgcmVzdWx0OworICAgIGlmIChpc0FycmF5KHNvdXJjZSkpIHsKKyAgICAgIGRlc3RpbmF0aW9uLmxlbmd0aCA9IDA7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgeworICAgICAgICByZXN1bHQgPSBjb3B5KHNvdXJjZVtpXSwgbnVsbCwgc3RhY2tTb3VyY2UsIHN0YWNrRGVzdCk7CisgICAgICAgIGlmIChpc09iamVjdChzb3VyY2VbaV0pKSB7CisgICAgICAgICAgc3RhY2tTb3VyY2UucHVzaChzb3VyY2VbaV0pOworICAgICAgICAgIHN0YWNrRGVzdC5wdXNoKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdGluYXRpb24ucHVzaChyZXN1bHQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2YXIgaCA9IGRlc3RpbmF0aW9uLiQkaGFzaEtleTsKKyAgICAgIGlmIChpc0FycmF5KGRlc3RpbmF0aW9uKSkgeworICAgICAgICBkZXN0aW5hdGlvbi5sZW5ndGggPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yRWFjaChkZXN0aW5hdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSkgeworICAgICAgICAgIGRlbGV0ZSBkZXN0aW5hdGlvbltrZXldOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsKKyAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgcmVzdWx0ID0gY29weShzb3VyY2Vba2V5XSwgbnVsbCwgc3RhY2tTb3VyY2UsIHN0YWNrRGVzdCk7CisgICAgICAgICAgaWYgKGlzT2JqZWN0KHNvdXJjZVtrZXldKSkgeworICAgICAgICAgICAgc3RhY2tTb3VyY2UucHVzaChzb3VyY2Vba2V5XSk7CisgICAgICAgICAgICBzdGFja0Rlc3QucHVzaChyZXN1bHQpOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0aW5hdGlvbltrZXldID0gcmVzdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgICBzZXRIYXNoS2V5KGRlc3RpbmF0aW9uLGgpOworICAgIH0KKworICB9CisgIHJldHVybiBkZXN0aW5hdGlvbjsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mIGFuIG9iamVjdCwgYW4gYXJyYXkgb3IgYSBwcmltaXRpdmUuCisgKgorICogQXNzdW1lcyB0aGF0IHRoZXJlIGFyZSBubyBwcm90byBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLgorICovCitmdW5jdGlvbiBzaGFsbG93Q29weShzcmMsIGRzdCkgeworICBpZiAoaXNBcnJheShzcmMpKSB7CisgICAgZHN0ID0gZHN0IHx8IFtdOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGRzdFtpXSA9IHNyY1tpXTsKKyAgICB9CisgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc3JjKSkgeworICAgIGRzdCA9IGRzdCB8fCB7fTsKKworICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHsKKyAgICAgIGlmICghKGtleS5jaGFyQXQoMCkgPT09ICckJyAmJiBrZXkuY2hhckF0KDEpID09PSAnJCcpKSB7CisgICAgICAgIGRzdFtrZXldID0gc3JjW2tleV07CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGRzdCB8fCBzcmM7Cit9CisKKworLyoqCisgKiBAbmdkb2MgZnVuY3Rpb24KKyAqIEBuYW1lIGFuZ3VsYXIuZXF1YWxzCisgKiBAbW9kdWxlIG5nCisgKiBAa2luZCBmdW5jdGlvbgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogRGV0ZXJtaW5lcyBpZiB0d28gb2JqZWN0cyBvciB0d28gdmFsdWVzIGFyZSBlcXVpdmFsZW50LiBTdXBwb3J0cyB2YWx1ZSB0eXBlcywgcmVndWxhcgorICogZXhwcmVzc2lvbnMsIGFycmF5cyBhbmQgb2JqZWN0cy4KKyAqCisgKiBUd28gb2JqZWN0cyBvciB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOgorICoKKyAqICogQm90aCBvYmplY3RzIG9yIHZhbHVlcyBwYXNzIGA9PT1gIGNvbXBhcmlzb24uCisgKiAqIEJvdGggb2JqZWN0cyBvciB2YWx1ZXMgYXJlIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGFsbCBvZiB0aGVpciBwcm9wZXJ0aWVzIGFyZSBlcXVhbCBieQorICogICBjb21wYXJpbmcgdGhlbSB3aXRoIGBhbmd1bGFyLmVxdWFsc2AuCisgKiAqIEJvdGggdmFsdWVzIGFyZSBOYU4uIChJbiBKYXZhU2NyaXB0LCBOYU4gPT0gTmFOID0+IGZhbHNlLiBCdXQgd2UgY29uc2lkZXIgdHdvIE5hTiBhcyBlcXVhbCkKKyAqICogQm90aCB2YWx1ZXMgcmVwcmVzZW50IHRoZSBzYW1lIHJlZ3VsYXIgZXhwcmVzc2lvbiAoSW4gSmF2YVNjcmlwdCwKKyAqICAgL2FiYy8gPT0gL2FiYy8gPT4gZmFsc2UuIEJ1dCB3ZSBjb25zaWRlciB0d28gcmVndWxhciBleHByZXNzaW9ucyBhcyBlcXVhbCB3aGVuIHRoZWlyIHRleHR1YWwKKyAqICAgcmVwcmVzZW50YXRpb24gbWF0Y2hlcykuCisgKgorICogRHVyaW5nIGEgcHJvcGVydHkgY29tcGFyaXNvbiwgcHJvcGVydGllcyBvZiBgZnVuY3Rpb25gIHR5cGUgYW5kIHByb3BlcnRpZXMgd2l0aCBuYW1lcworICogdGhhdCBiZWdpbiB3aXRoIGAkYCBhcmUgaWdub3JlZC4KKyAqCisgKiBTY29wZSBhbmQgRE9NV2luZG93IG9iamVjdHMgYXJlIGJlaW5nIGNvbXBhcmVkIG9ubHkgYnkgaWRlbnRpZnkgKGA9PT1gKS4KKyAqCisgKiBAcGFyYW0geyp9IG8xIE9iamVjdCBvciB2YWx1ZSB0byBjb21wYXJlLgorICogQHBhcmFtIHsqfSBvMiBPYmplY3Qgb3IgdmFsdWUgdG8gY29tcGFyZS4KKyAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGFyZ3VtZW50cyBhcmUgZXF1YWwuCisgKi8KK2Z1bmN0aW9uIGVxdWFscyhvMSwgbzIpIHsKKyAgaWYgKG8xID09PSBvMikgcmV0dXJuIHRydWU7CisgIGlmIChvMSA9PT0gbnVsbCB8fCBvMiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICBpZiAobzEgIT09IG8xICYmIG8yICE9PSBvMikgcmV0dXJuIHRydWU7IC8vIE5hTiA9PT0gTmFOCisgIHZhciB0MSA9IHR5cGVvZiBvMSwgdDIgPSB0eXBlb2YgbzIsIGxlbmd0aCwga2V5LCBrZXlTZXQ7CisgIGlmICh0MSA9PSB0MikgeworICAgIGlmICh0MSA9PSAnb2JqZWN0JykgeworICAgICAgaWYgKGlzQXJyYXkobzEpKSB7CisgICAgICAgIGlmICghaXNBcnJheShvMikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKChsZW5ndGggPSBvMS5sZW5ndGgpID09IG8yLmxlbmd0aCkgeworICAgICAgICAgIGZvciAoa2V5ID0gMDsga2V5IDwgbGVuZ3RoOyBrZXkrKykgeworICAgICAgICAgICAgaWYgKCFlcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKG8xKSkgeworICAgICAgICBpZiAoIWlzRGF0ZShvMikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGVxdWFscyhvMS5nZXRUaW1lKCksIG8yLmdldFRpbWUoKSk7CisgICAgICB9IGVsc2UgaWYgKGlzUmVnRXhwKG8xKSAmJiBpc1JlZ0V4cChvMikpIHsKKyAgICAgICAgcmV0dXJuIG8xLnRvU3RyaW5nKCkgPT0gbzIudG9TdHJpbmcoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc1Njb3BlKG8xKSB8fCBpc1Njb3BlKG8yKSB8fCBpc1dpbmRvdyhvMSkgfHwgaXNXaW5kb3cobzIpIHx8IGlzQXJyYXkobzIpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGtleVNldCA9IHt9OworICAgICAgICBmb3IgKGtleSBpbiBvMSkgeworICAgICAgICAgIGlmIChrZXkuY2hhckF0KDApID09PSAnJCcgfHwgaXNGdW5jdGlvbihvMVtrZXldKSkgY29udGludWU7CisgICAgICAgICAgaWYgKCFlcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBrZXlTZXRba2V5XSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChrZXkgaW4gbzIpIHsKKyAgICAgICAgICBpZiAoIWtleVNldC5oYXNPd25Qcm9wZXJ0eShrZXkpICYmCisgICAgICAgICAgICAgIGtleS5jaGFyQXQoMCkgIT09ICckJyAmJgorICAgICAgICAgICAgICBvMltrZXldICE9PSB1bmRlZmluZWQgJiYKKyAgICAgICAgICAgICAgIWlzRnVuY3Rpb24obzJba2V5XSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2YXIgY3NwID0gZnVuY3Rpb24oKSB7CisgIGlmIChpc0RlZmluZWQoY3NwLmlzQWN0aXZlXykpIHJldHVybiBjc3AuaXNBY3RpdmVfOworCisgIHZhciBhY3RpdmUgPSAhIShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmctY3NwXScpIHx8CisgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1uZy1jc3BdJykpOworCisgIGlmICghYWN0aXZlKSB7CisgICAgdHJ5IHsKKyAgICAgIC8qIGpzaGludCAtVzAzMSwgLVcwNTQgKi8KKyAgICAgIG5ldyBGdW5jdGlvbignJyk7CisgICAgICAvKiBqc2hpbnQgK1cwMzEsICtXMDU0ICovCisgICAgfSBjYXRjaCAoZSkgeworICAgICAgYWN0aXZlID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gKGNzcC5pc0FjdGl2ZV8gPSBhY3RpdmUpOworfTsKKworCisKK2Z1bmN0aW9uIGNvbmNhdChhcnJheTEsIGFycmF5MiwgaW5kZXgpIHsKKyAgcmV0dXJuIGFycmF5MS5jb25jYXQoc2xpY2UuY2FsbChhcnJheTIsIGluZGV4KSk7Cit9CisKK2Z1bmN0aW9uIHNsaWNlQXJncyhhcmdzLCBzdGFydEluZGV4KSB7CisgIHJldHVybiBzbGljZS5jYWxsKGFyZ3MsIHN0YXJ0SW5kZXggfHwgMCk7Cit9CisKKworLyoganNoaW50IC1XMTAxICovCisvKioKKyAqIEBuZ2RvYyBmdW5jdGlvbgorICogQG5hbWUgYW5ndWxhci5iaW5kCisgKiBAbW9kdWxlIG5nCisgKiBAa2luZCBmdW5jdGlvbgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIGNhbGxzIGZ1bmN0aW9uIGBmbmAgYm91bmQgdG8gYHNlbGZgIChgc2VsZmAgYmVjb21lcyB0aGUgYHRoaXNgIGZvcgorICogYGZuYCkuIFlvdSBjYW4gc3VwcGx5IG9wdGlvbmFsIGBhcmdzYCB0aGF0IGFyZSBwcmVib3VuZCB0byB0aGUgZnVuY3Rpb24uIFRoaXMgZmVhdHVyZSBpcyBhbHNvCisgKiBrbm93biBhcyBbcGFydGlhbCBhcHBsaWNhdGlvbl0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJ0aWFsX2FwcGxpY2F0aW9uKSwgYXMKKyAqIGRpc3Rpbmd1aXNoZWQgZnJvbSBbZnVuY3Rpb24gY3VycnlpbmddKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3VycnlpbmcjQ29udHJhc3Rfd2l0aF9wYXJ0aWFsX2Z1bmN0aW9uX2FwcGxpY2F0aW9uKS4KKyAqCisgKiBAcGFyYW0ge09iamVjdH0gc2VsZiBDb250ZXh0IHdoaWNoIGBmbmAgc2hvdWxkIGJlIGV2YWx1YXRlZCBpbi4KKyAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gZm4gRnVuY3Rpb24gdG8gYmUgYm91bmQuCisgKiBAcGFyYW0gey4uLip9IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHByZWJvdW5kIHRvIHRoZSBgZm5gIGZ1bmN0aW9uIGNhbGwuCisgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gRnVuY3Rpb24gdGhhdCB3cmFwcyB0aGUgYGZuYCB3aXRoIGFsbCB0aGUgc3BlY2lmaWVkIGJpbmRpbmdzLgorICovCisvKiBqc2hpbnQgK1cxMDEgKi8KK2Z1bmN0aW9uIGJpbmQoc2VsZiwgZm4pIHsKKyAgdmFyIGN1cnJ5QXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gc2xpY2VBcmdzKGFyZ3VtZW50cywgMikgOiBbXTsKKyAgaWYgKGlzRnVuY3Rpb24oZm4pICYmICEoZm4gaW5zdGFuY2VvZiBSZWdFeHApKSB7CisgICAgcmV0dXJuIGN1cnJ5QXJncy5sZW5ndGgKKyAgICAgID8gZnVuY3Rpb24oKSB7CisgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKKyAgICAgICAgICAgID8gZm4uYXBwbHkoc2VsZiwgY29uY2F0KGN1cnJ5QXJncywgYXJndW1lbnRzLCAwKSkKKyAgICAgICAgICAgIDogZm4uYXBwbHkoc2VsZiwgY3VycnlBcmdzKTsKKyAgICAgICAgfQorICAgICAgOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAorICAgICAgICAgICAgPyBmbi5hcHBseShzZWxmLCBhcmd1bWVudHMpCisgICAgICAgICAgICA6IGZuLmNhbGwoc2VsZik7CisgICAgICAgIH07CisgIH0gZWxzZSB7CisgICAgLy8gaW4gSUUsIG5hdGl2ZSBtZXRob2RzIGFyZSBub3QgZnVuY3Rpb25zIHNvIHRoZXkgY2Fubm90IGJlIGJvdW5kIChub3RlOiB0aGV5IGRvbid0IG5lZWQgdG8gYmUpCisgICAgcmV0dXJuIGZuOworICB9Cit9CisKKworZnVuY3Rpb24gdG9Kc29uUmVwbGFjZXIoa2V5LCB2YWx1ZSkgeworICB2YXIgdmFsID0gdmFsdWU7CisKKyAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIGtleS5jaGFyQXQoMCkgPT09ICckJyAmJiBrZXkuY2hhckF0KDEpID09PSAnJCcpIHsKKyAgICB2YWwgPSB1bmRlZmluZWQ7CisgIH0gZWxzZSBpZiAoaXNXaW5kb3codmFsdWUpKSB7CisgICAgdmFsID0gJyRXSU5ET1cnOworICB9IGVsc2UgaWYgKHZhbHVlICYmICBkb2N1bWVudCA9PT0gdmFsdWUpIHsKKyAgICB2YWwgPSAnJERPQ1VNRU5UJzsKKyAgfSBlbHNlIGlmIChpc1Njb3BlKHZhbHVlKSkgeworICAgIHZhbCA9ICckU0NPUEUnOworICB9CisKKyAgcmV0dXJuIHZhbDsKK30KKworCisvKioKKyAqIEBuZ2RvYyBmdW5jdGlvbgorICogQG5hbWUgYW5ndWxhci50b0pzb24KKyAqIEBtb2R1bGUgbmcKKyAqIEBraW5kIGZ1bmN0aW9uCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBTZXJpYWxpemVzIGlucHV0IGludG8gYSBKU09OLWZvcm1hdHRlZCBzdHJpbmcuIFByb3BlcnRpZXMgd2l0aCBsZWFkaW5nICQkIGNoYXJhY3RlcnMgd2lsbCBiZQorICogc3RyaXBwZWQgc2luY2UgYW5ndWxhciB1c2VzIHRoaXMgbm90YXRpb24gaW50ZXJuYWxseS4KKyAqCisgKiBAcGFyYW0ge09iamVjdHxBcnJheXxEYXRlfHN0cmluZ3xudW1iZXJ9IG9iaiBJbnB1dCB0byBiZSBzZXJpYWxpemVkIGludG8gSlNPTi4KKyAqIEBwYXJhbSB7Ym9vbGVhbnxudW1iZXI9fSBwcmV0dHkgSWYgc2V0IHRvIHRydWUsIHRoZSBKU09OIG91dHB1dCB3aWxsIGNvbnRhaW4gbmV3bGluZXMgYW5kIHdoaXRlc3BhY2UuCisgKiAgICBJZiBzZXQgdG8gYW4gaW50ZWdlciwgdGhlIEpTT04gb3V0cHV0IHdpbGwgY29udGFpbiB0aGF0IG1hbnkgc3BhY2VzIHBlciBpbmRlbnRhdGlvbiAodGhlIGRlZmF1bHQgaXMgMikuCisgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gSlNPTi1pZmllZCBzdHJpbmcgcmVwcmVzZW50aW5nIGBvYmpgLgorICovCitmdW5jdGlvbiB0b0pzb24ob2JqLCBwcmV0dHkpIHsKKyAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSByZXR1cm4gdW5kZWZpbmVkOworICBpZiAoIWlzTnVtYmVyKHByZXR0eSkpIHsKKyAgICBwcmV0dHkgPSBwcmV0dHkgPyAyIDogbnVsbDsKKyAgfQorICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCB0b0pzb25SZXBsYWNlciwgcHJldHR5KTsKK30KKworCisvKioKKyAqIEBuZ2RvYyBmdW5jdGlvbgorICogQG5hbWUgYW5ndWxhci5mcm9tSnNvbgorICogQG1vZHVsZSBuZworICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIERlc2VyaWFsaXplcyBhIEpTT04gc3RyaW5nLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBqc29uIEpTT04gc3RyaW5nIHRvIGRlc2VyaWFsaXplLgorICogQHJldHVybnMge09iamVjdHxBcnJheXxzdHJpbmd8bnVtYmVyfSBEZXNlcmlhbGl6ZWQgSlNPTiBzdHJpbmcuCisgKi8KK2Z1bmN0aW9uIGZyb21Kc29uKGpzb24pIHsKKyAgcmV0dXJuIGlzU3RyaW5nKGpzb24pCisgICAgICA/IEpTT04ucGFyc2UoanNvbikKKyAgICAgIDoganNvbjsKK30KKworCisvKioKKyAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4KKyAqLworZnVuY3Rpb24gc3RhcnRpbmdUYWcoZWxlbWVudCkgeworICBlbGVtZW50ID0ganFMaXRlKGVsZW1lbnQpLmNsb25lKCk7CisgIHRyeSB7CisgICAgLy8gdHVybnMgb3V0IElFIGRvZXMgbm90IGxldCB5b3Ugc2V0IC5odG1sKCkgb24gZWxlbWVudHMgd2hpY2gKKyAgICAvLyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBjaGlsZHJlbi4gU28gd2UganVzdCBpZ25vcmUgaXQuCisgICAgZWxlbWVudC5lbXB0eSgpOworICB9IGNhdGNoIChlKSB7fQorICB2YXIgZWxlbUh0bWwgPSBqcUxpdGUoJzxkaXY+JykuYXBwZW5kKGVsZW1lbnQpLmh0bWwoKTsKKyAgdHJ5IHsKKyAgICByZXR1cm4gZWxlbWVudFswXS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX1RFWFQgPyBsb3dlcmNhc2UoZWxlbUh0bWwpIDoKKyAgICAgICAgZWxlbUh0bWwuCisgICAgICAgICAgbWF0Y2goL14oPFtePl0rPikvKVsxXS4KKyAgICAgICAgICByZXBsYWNlKC9ePChbXHdcLV0rKS8sIGZ1bmN0aW9uKG1hdGNoLCBub2RlTmFtZSkgeyByZXR1cm4gJzwnICsgbG93ZXJjYXNlKG5vZGVOYW1lKTsgfSk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXR1cm4gbG93ZXJjYXNlKGVsZW1IdG1sKTsKKyAgfQorCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIFRyaWVzIHRvIGRlY29kZSB0aGUgVVJJIGNvbXBvbmVudCB3aXRob3V0IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KKyAqCisgKiBAcHJpdmF0ZQorICogQHBhcmFtIHN0ciB2YWx1ZSBwb3RlbnRpYWwgVVJJIGNvbXBvbmVudCB0byBjaGVjay4KKyAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgY2FuIGJlIGRlY29kZWQKKyAqIHdpdGggdGhlIGRlY29kZVVSSUNvbXBvbmVudCBmdW5jdGlvbi4KKyAqLworZnVuY3Rpb24gdHJ5RGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSB7CisgIHRyeSB7CisgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICAvLyBJZ25vcmUgYW55IGludmFsaWQgdXJpIGNvbXBvbmVudAorICB9Cit9CisKKworLyoqCisgKiBQYXJzZXMgYW4gZXNjYXBlZCB1cmwgcXVlcnkgc3RyaW5nIGludG8ga2V5LXZhbHVlIHBhaXJzLgorICogQHJldHVybnMge09iamVjdC48c3RyaW5nLGJvb2xlYW58QXJyYXk+fQorICovCitmdW5jdGlvbiBwYXJzZUtleVZhbHVlKC8qKnN0cmluZyova2V5VmFsdWUpIHsKKyAgdmFyIG9iaiA9IHt9LCBrZXlfdmFsdWUsIGtleTsKKyAgZm9yRWFjaCgoa2V5VmFsdWUgfHwgIiIpLnNwbGl0KCcmJyksIGZ1bmN0aW9uKGtleVZhbHVlKSB7CisgICAgaWYgKGtleVZhbHVlKSB7CisgICAgICBrZXlfdmFsdWUgPSBrZXlWYWx1ZS5yZXBsYWNlKC9cKy9nLCclMjAnKS5zcGxpdCgnPScpOworICAgICAga2V5ID0gdHJ5RGVjb2RlVVJJQ29tcG9uZW50KGtleV92YWx1ZVswXSk7CisgICAgICBpZiAoaXNEZWZpbmVkKGtleSkpIHsKKyAgICAgICAgdmFyIHZhbCA9IGlzRGVmaW5lZChrZXlfdmFsdWVbMV0pID8gdHJ5RGVjb2RlVVJJQ29tcG9uZW50KGtleV92YWx1ZVsxXSkgOiB0cnVlOworICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7CisgICAgICAgICAgb2JqW2tleV0gPSB2YWw7CisgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmpba2V5XSkpIHsKKyAgICAgICAgICBvYmpba2V5XS5wdXNoKHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb2JqW2tleV0gPSBbb2JqW2tleV0sdmFsXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSk7CisgIHJldHVybiBvYmo7Cit9CisKK2Z1bmN0aW9uIHRvS2V5VmFsdWUob2JqKSB7CisgIHZhciBwYXJ0cyA9IFtdOworICBmb3JFYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGtleSkgeworICAgIGlmIChpc0FycmF5KHZhbHVlKSkgeworICAgICAgZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24oYXJyYXlWYWx1ZSkgeworICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZVVyaVF1ZXJ5KGtleSwgdHJ1ZSkgKworICAgICAgICAgICAgICAgICAgIChhcnJheVZhbHVlID09PSB0cnVlID8gJycgOiAnPScgKyBlbmNvZGVVcmlRdWVyeShhcnJheVZhbHVlLCB0cnVlKSkpOworICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICBwYXJ0cy5wdXNoKGVuY29kZVVyaVF1ZXJ5KGtleSwgdHJ1ZSkgKworICAgICAgICAgICAgICAgKHZhbHVlID09PSB0cnVlID8gJycgOiAnPScgKyBlbmNvZGVVcmlRdWVyeSh2YWx1ZSwgdHJ1ZSkpKTsKKyAgICB9CisgIH0pOworICByZXR1cm4gcGFydHMubGVuZ3RoID8gcGFydHMuam9pbignJicpIDogJyc7Cit9CisKKworLyoqCisgKiBXZSBuZWVkIG91ciBjdXN0b20gbWV0aG9kIGJlY2F1c2UgZW5jb2RlVVJJQ29tcG9uZW50IGlzIHRvbyBhZ2dyZXNzaXZlIGFuZCBkb2Vzbid0IGZvbGxvdworICogaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzk4Ni50eHQgd2l0aCByZWdhcmRzIHRvIHRoZSBjaGFyYWN0ZXIgc2V0IChwY2hhcikgYWxsb3dlZCBpbiBwYXRoCisgKiBzZWdtZW50czoKKyAqICAgIHNlZ21lbnQgICAgICAgPSAqcGNoYXIKKyAqICAgIHBjaGFyICAgICAgICAgPSB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zIC8gIjoiIC8gIkAiCisgKiAgICBwY3QtZW5jb2RlZCAgID0gIiUiIEhFWERJRyBIRVhESUcKKyAqICAgIHVucmVzZXJ2ZWQgICAgPSBBTFBIQSAvIERJR0lUIC8gIi0iIC8gIi4iIC8gIl8iIC8gIn4iCisgKiAgICBzdWItZGVsaW1zICAgID0gIiEiIC8gIiQiIC8gIiYiIC8gIiciIC8gIigiIC8gIikiCisgKiAgICAgICAgICAgICAgICAgICAgIC8gIioiIC8gIisiIC8gIiwiIC8gIjsiIC8gIj0iCisgKi8KK2Z1bmN0aW9uIGVuY29kZVVyaVNlZ21lbnQodmFsKSB7CisgIHJldHVybiBlbmNvZGVVcmlRdWVyeSh2YWwsIHRydWUpLgorICAgICAgICAgICAgIHJlcGxhY2UoLyUyNi9naSwgJyYnKS4KKyAgICAgICAgICAgICByZXBsYWNlKC8lM0QvZ2ksICc9JykuCisgICAgICAgICAgICAgcmVwbGFjZSgvJTJCL2dpLCAnKycpOworfQorCisKKy8qKgorICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGVuY29kaW5nICprZXkqIG9yICp2YWx1ZSogcGFydHMgb2YgcXVlcnkgY29tcG9uZW50LiBXZSBuZWVkIGEgY3VzdG9tCisgKiBtZXRob2QgYmVjYXVzZSBlbmNvZGVVUklDb21wb25lbnQgaXMgdG9vIGFnZ3Jlc3NpdmUgYW5kIGVuY29kZXMgc3R1ZmYgdGhhdCBkb2Vzbid0IGhhdmUgdG8gYmUKKyAqIGVuY29kZWQgcGVyIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODY6CisgKiAgICBxdWVyeSAgICAgICA9ICooIHBjaGFyIC8gIi8iIC8gIj8iICkKKyAqICAgIHBjaGFyICAgICAgICAgPSB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zIC8gIjoiIC8gIkAiCisgKiAgICB1bnJlc2VydmVkICAgID0gQUxQSEEgLyBESUdJVCAvICItIiAvICIuIiAvICJfIiAvICJ+IgorICogICAgcGN0LWVuY29kZWQgICA9ICIlIiBIRVhESUcgSEVYRElHCisgKiAgICBzdWItZGVsaW1zICAgID0gIiEiIC8gIiQiIC8gIiYiIC8gIiciIC8gIigiIC8gIikiCisgKiAgICAgICAgICAgICAgICAgICAgIC8gIioiIC8gIisiIC8gIiwiIC8gIjsiIC8gIj0iCisgKi8KK2Z1bmN0aW9uIGVuY29kZVVyaVF1ZXJ5KHZhbCwgcGN0RW5jb2RlU3BhY2VzKSB7CisgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS4KKyAgICAgICAgICAgICByZXBsYWNlKC8lNDAvZ2ksICdAJykuCisgICAgICAgICAgICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLgorICAgICAgICAgICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLgorICAgICAgICAgICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS4KKyAgICAgICAgICAgICByZXBsYWNlKC8lM0IvZ2ksICc7JykuCisgICAgICAgICAgICAgcmVwbGFjZSgvJTIwL2csIChwY3RFbmNvZGVTcGFjZXMgPyAnJTIwJyA6ICcrJykpOworfQorCit2YXIgbmdBdHRyUHJlZml4ZXMgPSBbJ25nLScsICdkYXRhLW5nLScsICduZzonLCAneC1uZy0nXTsKKworZnVuY3Rpb24gZ2V0TmdBdHRyaWJ1dGUoZWxlbWVudCwgbmdBdHRyKSB7CisgIHZhciBhdHRyLCBpLCBpaSA9IG5nQXR0clByZWZpeGVzLmxlbmd0aDsKKyAgZWxlbWVudCA9IGpxTGl0ZShlbGVtZW50KTsKKyAgZm9yIChpID0gMDsgaSA8IGlpOyArK2kpIHsKKyAgICBhdHRyID0gbmdBdHRyUHJlZml4ZXNbaV0gKyBuZ0F0dHI7CisgICAgaWYgKGlzU3RyaW5nKGF0dHIgPSBlbGVtZW50LmF0dHIoYXR0cikpKSB7CisgICAgICByZXR1cm4gYXR0cjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bGw7Cit9CisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdBcHAKKyAqIEBtb2R1bGUgbmcKKyAqCisgKiBAZWxlbWVudCBBTlkKKyAqIEBwYXJhbSB7YW5ndWxhci5Nb2R1bGV9IG5nQXBwIGFuIG9wdGlvbmFsIGFwcGxpY2F0aW9uCisgKiAgIHtAbGluayBhbmd1bGFyLm1vZHVsZSBtb2R1bGV9IG5hbWUgdG8gbG9hZC4KKyAqIEBwYXJhbSB7Ym9vbGVhbj19IG5nU3RyaWN0RGkgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgcHJlc2VudCBvbiB0aGUgYXBwIGVsZW1lbnQsIHRoZSBpbmplY3RvciB3aWxsIGJlCisgKiAgIGNyZWF0ZWQgaW4gInN0cmljdC1kaSIgbW9kZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aWxsIGZhaWwgdG8gaW52b2tlIGZ1bmN0aW9ucyB3aGljaAorICogICBkbyBub3QgdXNlIGV4cGxpY2l0IGZ1bmN0aW9uIGFubm90YXRpb24gKGFuZCBhcmUgdGh1cyB1bnN1aXRhYmxlIGZvciBtaW5pZmljYXRpb24pLCBhcyBkZXNjcmliZWQKKyAqICAgaW4ge0BsaW5rIGd1aWRlL2RpIHRoZSBEZXBlbmRlbmN5IEluamVjdGlvbiBndWlkZX0sIGFuZCB1c2VmdWwgZGVidWdnaW5nIGluZm8gd2lsbCBhc3Npc3QgaW4KKyAqICAgdHJhY2tpbmcgZG93biB0aGUgcm9vdCBvZiB0aGVzZSBidWdzLgorICoKKyAqIEBkZXNjcmlwdGlvbgorICoKKyAqIFVzZSB0aGlzIGRpcmVjdGl2ZSB0byAqKmF1dG8tYm9vdHN0cmFwKiogYW4gQW5ndWxhckpTIGFwcGxpY2F0aW9uLiBUaGUgYG5nQXBwYCBkaXJlY3RpdmUKKyAqIGRlc2lnbmF0ZXMgdGhlICoqcm9vdCBlbGVtZW50Kiogb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCBpcyB0eXBpY2FsbHkgcGxhY2VkIG5lYXIgdGhlIHJvb3QgZWxlbWVudAorICogb2YgdGhlIHBhZ2UgLSBlLmcuIG9uIHRoZSBgPGJvZHk+YCBvciBgPGh0bWw+YCB0YWdzLgorICoKKyAqIE9ubHkgb25lIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbiBjYW4gYmUgYXV0by1ib290c3RyYXBwZWQgcGVyIEhUTUwgZG9jdW1lbnQuIFRoZSBmaXJzdCBgbmdBcHBgCisgKiBmb3VuZCBpbiB0aGUgZG9jdW1lbnQgd2lsbCBiZSB1c2VkIHRvIGRlZmluZSB0aGUgcm9vdCBlbGVtZW50IHRvIGF1dG8tYm9vdHN0cmFwIGFzIGFuCisgKiBhcHBsaWNhdGlvbi4gVG8gcnVuIG11bHRpcGxlIGFwcGxpY2F0aW9ucyBpbiBhbiBIVE1MIGRvY3VtZW50IHlvdSBtdXN0IG1hbnVhbGx5IGJvb3RzdHJhcCB0aGVtIHVzaW5nCisgKiB7QGxpbmsgYW5ndWxhci5ib290c3RyYXB9IGluc3RlYWQuIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbnMgY2Fubm90IGJlIG5lc3RlZCB3aXRoaW4gZWFjaCBvdGhlci4KKyAqCisgKiBZb3UgY2FuIHNwZWNpZnkgYW4gKipBbmd1bGFySlMgbW9kdWxlKiogdG8gYmUgdXNlZCBhcyB0aGUgcm9vdCBtb2R1bGUgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMKKyAqIG1vZHVsZSB3aWxsIGJlIGxvYWRlZCBpbnRvIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3J9IHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGJvb3RzdHJhcHBlZC4gSXQKKyAqIHNob3VsZCBjb250YWluIHRoZSBhcHBsaWNhdGlvbiBjb2RlIG5lZWRlZCBvciBoYXZlIGRlcGVuZGVuY2llcyBvbiBvdGhlciBtb2R1bGVzIHRoYXQgd2lsbAorICogY29udGFpbiB0aGUgY29kZS4gU2VlIHtAbGluayBhbmd1bGFyLm1vZHVsZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogSW4gdGhlIGV4YW1wbGUgYmVsb3cgaWYgdGhlIGBuZ0FwcGAgZGlyZWN0aXZlIHdlcmUgbm90IHBsYWNlZCBvbiB0aGUgYGh0bWxgIGVsZW1lbnQgdGhlbiB0aGUKKyAqIGRvY3VtZW50IHdvdWxkIG5vdCBiZSBjb21waWxlZCwgdGhlIGBBcHBDb250cm9sbGVyYCB3b3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGFuZCB0aGUgYHt7IGErYiB9fWAKKyAqIHdvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBgM2AuCisgKgorICogYG5nQXBwYCBpcyB0aGUgZWFzaWVzdCwgYW5kIG1vc3QgY29tbW9uIHdheSB0byBib290c3RyYXAgYW4gYXBwbGljYXRpb24uCisgKgorIDxleGFtcGxlIG1vZHVsZT0ibmdBcHBEZW1vIj4KKyAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgPGRpdiBuZy1jb250cm9sbGVyPSJuZ0FwcERlbW9Db250cm9sbGVyIj4KKyAgICAgSSBjYW4gYWRkOiB7e2F9fSArIHt7Yn19ID0gIHt7IGErYiB9fQorICAgPC9kaXY+CisgICA8L2ZpbGU+CisgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgorICAgYW5ndWxhci5tb2R1bGUoJ25nQXBwRGVtbycsIFtdKS5jb250cm9sbGVyKCduZ0FwcERlbW9Db250cm9sbGVyJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICRzY29wZS5hID0gMTsKKyAgICAgJHNjb3BlLmIgPSAyOworICAgfSk7CisgICA8L2ZpbGU+CisgPC9leGFtcGxlPgorICoKKyAqIFVzaW5nIGBuZ1N0cmljdERpYCwgeW91IHdvdWxkIHNlZSBzb21ldGhpbmcgbGlrZSB0aGlzOgorICoKKyA8ZXhhbXBsZSBuZy1hcHAtaW5jbHVkZWQ9InRydWUiPgorICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICA8ZGl2IG5nLWFwcD0ibmdBcHBTdHJpY3REZW1vIiBuZy1zdHJpY3QtZGk+CisgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJHb29kQ29udHJvbGxlcjEiPgorICAgICAgICAgICBJIGNhbiBhZGQ6IHt7YX19ICsge3tifX0gPSAge3sgYStiIH19CisKKyAgICAgICAgICAgPHA+VGhpcyByZW5kZXJzIGJlY2F1c2UgdGhlIGNvbnRyb2xsZXIgZG9lcyBub3QgZmFpbCB0bworICAgICAgICAgICAgICBpbnN0YW50aWF0ZSwgYnkgdXNpbmcgZXhwbGljaXQgYW5ub3RhdGlvbiBzdHlsZSAoc2VlCisgICAgICAgICAgICAgIHNjcmlwdC5qcyBmb3IgZGV0YWlscykKKyAgICAgICAgICAgPC9wPgorICAgICAgIDwvZGl2PgorCisgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJHb29kQ29udHJvbGxlcjIiPgorICAgICAgICAgICBOYW1lOiA8aW5wdXQgbmctbW9kZWw9Im5hbWUiPjxiciAvPgorICAgICAgICAgICBIZWxsbywge3tuYW1lfX0hCisKKyAgICAgICAgICAgPHA+VGhpcyByZW5kZXJzIGJlY2F1c2UgdGhlIGNvbnRyb2xsZXIgZG9lcyBub3QgZmFpbCB0bworICAgICAgICAgICAgICBpbnN0YW50aWF0ZSwgYnkgdXNpbmcgZXhwbGljaXQgYW5ub3RhdGlvbiBzdHlsZQorICAgICAgICAgICAgICAoc2VlIHNjcmlwdC5qcyBmb3IgZGV0YWlscykKKyAgICAgICAgICAgPC9wPgorICAgICAgIDwvZGl2PgorCisgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJCYWRDb250cm9sbGVyIj4KKyAgICAgICAgICAgSSBjYW4gYWRkOiB7e2F9fSArIHt7Yn19ID0gIHt7IGErYiB9fQorCisgICAgICAgICAgIDxwPlRoZSBjb250cm9sbGVyIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQsIGR1ZSB0byByZWx5aW5nCisgICAgICAgICAgICAgIG9uIGF1dG9tYXRpYyBmdW5jdGlvbiBhbm5vdGF0aW9ucyAod2hpY2ggYXJlIGRpc2FibGVkIGluCisgICAgICAgICAgICAgIHN0cmljdCBtb2RlKS4gQXMgc3VjaCwgdGhlIGNvbnRlbnQgb2YgdGhpcyBzZWN0aW9uIGlzIG5vdAorICAgICAgICAgICAgICBpbnRlcnBvbGF0ZWQsIGFuZCB0aGVyZSBzaG91bGQgYmUgYW4gZXJyb3IgaW4geW91ciB3ZWIgY29uc29sZS4KKyAgICAgICAgICAgPC9wPgorICAgICAgIDwvZGl2PgorICAgPC9kaXY+CisgICA8L2ZpbGU+CisgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgorICAgYW5ndWxhci5tb2R1bGUoJ25nQXBwU3RyaWN0RGVtbycsIFtdKQorICAgICAvLyBCYWRDb250cm9sbGVyIHdpbGwgZmFpbCB0byBpbnN0YW50aWF0ZSwgZHVlIHRvIHJlbHlpbmcgb24gYXV0b21hdGljIGZ1bmN0aW9uIGFubm90YXRpb24sCisgICAgIC8vIHJhdGhlciB0aGFuIGFuIGV4cGxpY2l0IGFubm90YXRpb24KKyAgICAgLmNvbnRyb2xsZXIoJ0JhZENvbnRyb2xsZXInLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAgICAgICAkc2NvcGUuYSA9IDE7CisgICAgICAgJHNjb3BlLmIgPSAyOworICAgICB9KQorICAgICAvLyBVbmxpa2UgQmFkQ29udHJvbGxlciwgR29vZENvbnRyb2xsZXIxIGFuZCBHb29kQ29udHJvbGxlcjIgd2lsbCBub3QgZmFpbCB0byBiZSBpbnN0YW50aWF0ZWQsCisgICAgIC8vIGR1ZSB0byB1c2luZyBleHBsaWNpdCBhbm5vdGF0aW9ucyB1c2luZyB0aGUgYXJyYXkgc3R5bGUgYW5kICRpbmplY3QgcHJvcGVydHksIHJlc3BlY3RpdmVseS4KKyAgICAgLmNvbnRyb2xsZXIoJ0dvb2RDb250cm9sbGVyMScsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgJHNjb3BlLmEgPSAxOworICAgICAgICRzY29wZS5iID0gMjsKKyAgICAgfV0pCisgICAgIC5jb250cm9sbGVyKCdHb29kQ29udHJvbGxlcjInLCBHb29kQ29udHJvbGxlcjIpOworICAgICBmdW5jdGlvbiBHb29kQ29udHJvbGxlcjIoJHNjb3BlKSB7CisgICAgICAgJHNjb3BlLm5hbWUgPSAiV29ybGQiOworICAgICB9CisgICAgIEdvb2RDb250cm9sbGVyMi4kaW5qZWN0ID0gWyckc2NvcGUnXTsKKyAgIDwvZmlsZT4KKyAgIDxmaWxlIG5hbWU9InN0eWxlLmNzcyI+CisgICBkaXZbbmctY29udHJvbGxlcl0geworICAgICAgIG1hcmdpbi1ib3R0b206IDFlbTsKKyAgICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CisgICAgICAgYm9yZGVyOiAxcHggc29saWQ7CisgICAgICAgcGFkZGluZzogLjVlbTsKKyAgIH0KKyAgIGRpdltuZy1jb250cm9sbGVyXj1Hb29kXSB7CisgICAgICAgYm9yZGVyLWNvbG9yOiAjZDZlOWM2OworICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkZmYwZDg7CisgICAgICAgY29sb3I6ICMzYzc2M2Q7CisgICB9CisgICBkaXZbbmctY29udHJvbGxlcl49QmFkXSB7CisgICAgICAgYm9yZGVyLWNvbG9yOiAjZWJjY2QxOworICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7CisgICAgICAgY29sb3I6ICNhOTQ0NDI7CisgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgIH0KKyAgIDwvZmlsZT4KKyA8L2V4YW1wbGU+CisgKi8KK2Z1bmN0aW9uIGFuZ3VsYXJJbml0KGVsZW1lbnQsIGJvb3RzdHJhcCkgeworICB2YXIgYXBwRWxlbWVudCwKKyAgICAgIG1vZHVsZSwKKyAgICAgIGNvbmZpZyA9IHt9OworCisgIC8vIFRoZSBlbGVtZW50IGBlbGVtZW50YCBoYXMgcHJpb3JpdHkgb3ZlciBhbnkgb3RoZXIgZWxlbWVudAorICBmb3JFYWNoKG5nQXR0clByZWZpeGVzLCBmdW5jdGlvbihwcmVmaXgpIHsKKyAgICB2YXIgbmFtZSA9IHByZWZpeCArICdhcHAnOworCisgICAgaWYgKCFhcHBFbGVtZW50ICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKG5hbWUpKSB7CisgICAgICBhcHBFbGVtZW50ID0gZWxlbWVudDsKKyAgICAgIG1vZHVsZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpOworICAgIH0KKyAgfSk7CisgIGZvckVhY2gobmdBdHRyUHJlZml4ZXMsIGZ1bmN0aW9uKHByZWZpeCkgeworICAgIHZhciBuYW1lID0gcHJlZml4ICsgJ2FwcCc7CisgICAgdmFyIGNhbmRpZGF0ZTsKKworICAgIGlmICghYXBwRWxlbWVudCAmJiAoY2FuZGlkYXRlID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbJyArIG5hbWUucmVwbGFjZSgnOicsICdcXDonKSArICddJykpKSB7CisgICAgICBhcHBFbGVtZW50ID0gY2FuZGlkYXRlOworICAgICAgbW9kdWxlID0gY2FuZGlkYXRlLmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgICB9CisgIH0pOworICBpZiAoYXBwRWxlbWVudCkgeworICAgIGNvbmZpZy5zdHJpY3REaSA9IGdldE5nQXR0cmlidXRlKGFwcEVsZW1lbnQsICJzdHJpY3QtZGkiKSAhPT0gbnVsbDsKKyAgICBib290c3RyYXAoYXBwRWxlbWVudCwgbW9kdWxlID8gW21vZHVsZV0gOiBbXSwgY29uZmlnKTsKKyAgfQorfQorCisvKioKKyAqIEBuZ2RvYyBmdW5jdGlvbgorICogQG5hbWUgYW5ndWxhci5ib290c3RyYXAKKyAqIEBtb2R1bGUgbmcKKyAqIEBkZXNjcmlwdGlvbgorICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFudWFsbHkgc3RhcnQgdXAgYW5ndWxhciBhcHBsaWNhdGlvbi4KKyAqCisgKiBTZWU6IHtAbGluayBndWlkZS9ib290c3RyYXAgQm9vdHN0cmFwfQorICoKKyAqIE5vdGUgdGhhdCBQcm90cmFjdG9yIGJhc2VkIGVuZC10by1lbmQgdGVzdHMgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGJvb3RzdHJhcCBtYW51YWxseS4KKyAqIFRoZXkgbXVzdCB1c2Uge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0FwcCBuZ0FwcH0uCisgKgorICogQW5ndWxhciB3aWxsIGRldGVjdCBpZiBpdCBoYXMgYmVlbiBsb2FkZWQgaW50byB0aGUgYnJvd3NlciBtb3JlIHRoYW4gb25jZSBhbmQgb25seSBhbGxvdyB0aGUKKyAqIGZpcnN0IGxvYWRlZCBzY3JpcHQgdG8gYmUgYm9vdHN0cmFwcGVkIGFuZCB3aWxsIHJlcG9ydCBhIHdhcm5pbmcgdG8gdGhlIGJyb3dzZXIgY29uc29sZSBmb3IKKyAqIGVhY2ggb2YgdGhlIHN1YnNlcXVlbnQgc2NyaXB0cy4gVGhpcyBwcmV2ZW50cyBzdHJhbmdlIHJlc3VsdHMgaW4gYXBwbGljYXRpb25zLCB3aGVyZSBvdGhlcndpc2UKKyAqIG11bHRpcGxlIGluc3RhbmNlcyBvZiBBbmd1bGFyIHRyeSB0byB3b3JrIG9uIHRoZSBET00uCisgKgorICogYGBgaHRtbAorICogPCFkb2N0eXBlIGh0bWw+CisgKiA8aHRtbD4KKyAqIDxib2R5PgorICogPGRpdiBuZy1jb250cm9sbGVyPSJXZWxjb21lQ29udHJvbGxlciI+CisgKiAgIHt7Z3JlZXRpbmd9fQorICogPC9kaXY+CisgKgorICogPHNjcmlwdCBzcmM9ImFuZ3VsYXIuanMiPjwvc2NyaXB0PgorICogPHNjcmlwdD4KKyAqICAgdmFyIGFwcCA9IGFuZ3VsYXIubW9kdWxlKCdkZW1vJywgW10pCisgKiAgIC5jb250cm9sbGVyKCdXZWxjb21lQ29udHJvbGxlcicsIGZ1bmN0aW9uKCRzY29wZSkgeworICogICAgICAgJHNjb3BlLmdyZWV0aW5nID0gJ1dlbGNvbWUhJzsKKyAqICAgfSk7CisgKiAgIGFuZ3VsYXIuYm9vdHN0cmFwKGRvY3VtZW50LCBbJ2RlbW8nXSk7CisgKiA8L3NjcmlwdD4KKyAqIDwvYm9keT4KKyAqIDwvaHRtbD4KKyAqIGBgYAorICoKKyAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCBET00gZWxlbWVudCB3aGljaCBpcyB0aGUgcm9vdCBvZiBhbmd1bGFyIGFwcGxpY2F0aW9uLgorICogQHBhcmFtIHtBcnJheTxTdHJpbmd8RnVuY3Rpb258QXJyYXk+PX0gbW9kdWxlcyBhbiBhcnJheSBvZiBtb2R1bGVzIHRvIGxvYWQgaW50byB0aGUgYXBwbGljYXRpb24uCisgKiAgICAgRWFjaCBpdGVtIGluIHRoZSBhcnJheSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkIG1vZHVsZSBvciBhIChESSBhbm5vdGF0ZWQpCisgKiAgICAgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGludm9rZWQgYnkgdGhlIGluamVjdG9yIGFzIGEgcnVuIGJsb2NrLgorICogICAgIFNlZToge0BsaW5rIGFuZ3VsYXIubW9kdWxlIG1vZHVsZXN9CisgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBhbiBvYmplY3QgZm9yIGRlZmluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGUKKyAqICAgICBmb2xsb3dpbmcga2V5cyBhcmUgc3VwcG9ydGVkOgorICoKKyAqICogYHN0cmljdERpYCAtIGRpc2FibGUgYXV0b21hdGljIGZ1bmN0aW9uIGFubm90YXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBpcyBtZWFudCB0bworICogICBhc3Npc3QgaW4gZmluZGluZyBidWdzIHdoaWNoIGJyZWFrIG1pbmlmaWVkIGNvZGUuIERlZmF1bHRzIHRvIGBmYWxzZWAuCisgKgorICogQHJldHVybnMge2F1dG8uJGluamVjdG9yfSBSZXR1cm5zIHRoZSBuZXdseSBjcmVhdGVkIGluamVjdG9yIGZvciB0aGlzIGFwcC4KKyAqLworZnVuY3Rpb24gYm9vdHN0cmFwKGVsZW1lbnQsIG1vZHVsZXMsIGNvbmZpZykgeworICBpZiAoIWlzT2JqZWN0KGNvbmZpZykpIGNvbmZpZyA9IHt9OworICB2YXIgZGVmYXVsdENvbmZpZyA9IHsKKyAgICBzdHJpY3REaTogZmFsc2UKKyAgfTsKKyAgY29uZmlnID0gZXh0ZW5kKGRlZmF1bHRDb25maWcsIGNvbmZpZyk7CisgIHZhciBkb0Jvb3RzdHJhcCA9IGZ1bmN0aW9uKCkgeworICAgIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCk7CisKKyAgICBpZiAoZWxlbWVudC5pbmplY3RvcigpKSB7CisgICAgICB2YXIgdGFnID0gKGVsZW1lbnRbMF0gPT09IGRvY3VtZW50KSA/ICdkb2N1bWVudCcgOiBzdGFydGluZ1RhZyhlbGVtZW50KTsKKyAgICAgIC8vRW5jb2RlIGFuZ2xlIGJyYWNrZXRzIHRvIHByZXZlbnQgaW5wdXQgZnJvbSBiZWluZyBzYW5pdGl6ZWQgdG8gZW1wdHkgc3RyaW5nICM4NjgzCisgICAgICB0aHJvdyBuZ01pbkVycigKKyAgICAgICAgICAnYnRzdHJwZCcsCisgICAgICAgICAgIkFwcCBBbHJlYWR5IEJvb3RzdHJhcHBlZCB3aXRoIHRoaXMgRWxlbWVudCAnezB9JyIsCisgICAgICAgICAgdGFnLnJlcGxhY2UoLzwvLCcmbHQ7JykucmVwbGFjZSgvPi8sJyZndDsnKSk7CisgICAgfQorCisgICAgbW9kdWxlcyA9IG1vZHVsZXMgfHwgW107CisgICAgbW9kdWxlcy51bnNoaWZ0KFsnJHByb3ZpZGUnLCBmdW5jdGlvbigkcHJvdmlkZSkgeworICAgICAgJHByb3ZpZGUudmFsdWUoJyRyb290RWxlbWVudCcsIGVsZW1lbnQpOworICAgIH1dKTsKKworICAgIGlmIChjb25maWcuZGVidWdJbmZvRW5hYmxlZCkgeworICAgICAgLy8gUHVzaGluZyBzbyB0aGF0IHRoaXMgb3ZlcnJpZGVzIGBkZWJ1Z0luZm9FbmFibGVkYCBzZXR0aW5nIGRlZmluZWQgaW4gdXNlcidzIGBtb2R1bGVzYC4KKyAgICAgIG1vZHVsZXMucHVzaChbJyRjb21waWxlUHJvdmlkZXInLCBmdW5jdGlvbigkY29tcGlsZVByb3ZpZGVyKSB7CisgICAgICAgICRjb21waWxlUHJvdmlkZXIuZGVidWdJbmZvRW5hYmxlZCh0cnVlKTsKKyAgICAgIH1dKTsKKyAgICB9CisKKyAgICBtb2R1bGVzLnVuc2hpZnQoJ25nJyk7CisgICAgdmFyIGluamVjdG9yID0gY3JlYXRlSW5qZWN0b3IobW9kdWxlcywgY29uZmlnLnN0cmljdERpKTsKKyAgICBpbmplY3Rvci5pbnZva2UoWyckcm9vdFNjb3BlJywgJyRyb290RWxlbWVudCcsICckY29tcGlsZScsICckaW5qZWN0b3InLAorICAgICAgIGZ1bmN0aW9uIGJvb3RzdHJhcEFwcGx5KHNjb3BlLCBlbGVtZW50LCBjb21waWxlLCBpbmplY3RvcikgeworICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24oKSB7CisgICAgICAgICAgZWxlbWVudC5kYXRhKCckaW5qZWN0b3InLCBpbmplY3Rvcik7CisgICAgICAgICAgY29tcGlsZShlbGVtZW50KShzY29wZSk7CisgICAgICAgIH0pOworICAgICAgfV0KKyAgICApOworICAgIHJldHVybiBpbmplY3RvcjsKKyAgfTsKKworICB2YXIgTkdfRU5BQkxFX0RFQlVHX0lORk8gPSAvXk5HX0VOQUJMRV9ERUJVR19JTkZPIS87CisgIHZhciBOR19ERUZFUl9CT09UU1RSQVAgPSAvXk5HX0RFRkVSX0JPT1RTVFJBUCEvOworCisgIGlmICh3aW5kb3cgJiYgTkdfRU5BQkxFX0RFQlVHX0lORk8udGVzdCh3aW5kb3cubmFtZSkpIHsKKyAgICBjb25maWcuZGVidWdJbmZvRW5hYmxlZCA9IHRydWU7CisgICAgd2luZG93Lm5hbWUgPSB3aW5kb3cubmFtZS5yZXBsYWNlKE5HX0VOQUJMRV9ERUJVR19JTkZPLCAnJyk7CisgIH0KKworICBpZiAod2luZG93ICYmICFOR19ERUZFUl9CT09UU1RSQVAudGVzdCh3aW5kb3cubmFtZSkpIHsKKyAgICByZXR1cm4gZG9Cb290c3RyYXAoKTsKKyAgfQorCisgIHdpbmRvdy5uYW1lID0gd2luZG93Lm5hbWUucmVwbGFjZShOR19ERUZFUl9CT09UU1RSQVAsICcnKTsKKyAgYW5ndWxhci5yZXN1bWVCb290c3RyYXAgPSBmdW5jdGlvbihleHRyYU1vZHVsZXMpIHsKKyAgICBmb3JFYWNoKGV4dHJhTW9kdWxlcywgZnVuY3Rpb24obW9kdWxlKSB7CisgICAgICBtb2R1bGVzLnB1c2gobW9kdWxlKTsKKyAgICB9KTsKKyAgICBkb0Jvb3RzdHJhcCgpOworICB9OworfQorCisvKioKKyAqIEBuZ2RvYyBmdW5jdGlvbgorICogQG5hbWUgYW5ndWxhci5yZWxvYWRXaXRoRGVidWdJbmZvCisgKiBAbW9kdWxlIG5nCisgKiBAZGVzY3JpcHRpb24KKyAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIHJlbG9hZCB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiB3aXRoIGRlYnVnIGluZm9ybWF0aW9uIHR1cm5lZCBvbi4KKyAqIFRoaXMgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGEgY2FsbCB0byBgJGNvbXBpbGVQcm92aWRlci5kZWJ1Z0luZm9FbmFibGVkKGZhbHNlKWAuCisgKgorICogU2VlIHtAbGluayBuZy4kY29tcGlsZVByb3ZpZGVyI2RlYnVnSW5mb0VuYWJsZWR9IGZvciBtb3JlLgorICovCitmdW5jdGlvbiByZWxvYWRXaXRoRGVidWdJbmZvKCkgeworICB3aW5kb3cubmFtZSA9ICdOR19FTkFCTEVfREVCVUdfSU5GTyEnICsgd2luZG93Lm5hbWU7CisgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKK30KKworLyoqCisgKiBAbmFtZSBhbmd1bGFyLmdldFRlc3RhYmlsaXR5CisgKiBAbW9kdWxlIG5nCisgKiBAZGVzY3JpcHRpb24KKyAqIEdldCB0aGUgdGVzdGFiaWxpdHkgc2VydmljZSBmb3IgdGhlIGluc3RhbmNlIG9mIEFuZ3VsYXIgb24gdGhlIGdpdmVuCisgKiBlbGVtZW50LgorICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IERPTSBlbGVtZW50IHdoaWNoIGlzIHRoZSByb290IG9mIGFuZ3VsYXIgYXBwbGljYXRpb24uCisgKi8KK2Z1bmN0aW9uIGdldFRlc3RhYmlsaXR5KHJvb3RFbGVtZW50KSB7CisgIHZhciBpbmplY3RvciA9IGFuZ3VsYXIuZWxlbWVudChyb290RWxlbWVudCkuaW5qZWN0b3IoKTsKKyAgaWYgKCFpbmplY3RvcikgeworICAgIHRocm93IG5nTWluRXJyKCd0ZXN0JywKKyAgICAgICdubyBpbmplY3RvciBmb3VuZCBmb3IgZWxlbWVudCBhcmd1bWVudCB0byBnZXRUZXN0YWJpbGl0eScpOworICB9CisgIHJldHVybiBpbmplY3Rvci5nZXQoJyQkdGVzdGFiaWxpdHknKTsKK30KKwordmFyIFNOQUtFX0NBU0VfUkVHRVhQID0gL1tBLVpdL2c7CitmdW5jdGlvbiBzbmFrZV9jYXNlKG5hbWUsIHNlcGFyYXRvcikgeworICBzZXBhcmF0b3IgPSBzZXBhcmF0b3IgfHwgJ18nOworICByZXR1cm4gbmFtZS5yZXBsYWNlKFNOQUtFX0NBU0VfUkVHRVhQLCBmdW5jdGlvbihsZXR0ZXIsIHBvcykgeworICAgIHJldHVybiAocG9zID8gc2VwYXJhdG9yIDogJycpICsgbGV0dGVyLnRvTG93ZXJDYXNlKCk7CisgIH0pOworfQorCit2YXIgYmluZEpRdWVyeUZpcmVkID0gZmFsc2U7Cit2YXIgc2tpcERlc3Ryb3lPbk5leHRKUXVlcnlDbGVhbkRhdGE7CitmdW5jdGlvbiBiaW5kSlF1ZXJ5KCkgeworICB2YXIgb3JpZ2luYWxDbGVhbkRhdGE7CisKKyAgaWYgKGJpbmRKUXVlcnlGaXJlZCkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGJpbmQgdG8galF1ZXJ5IGlmIHByZXNlbnQ7CisgIGpRdWVyeSA9IHdpbmRvdy5qUXVlcnk7CisgIC8vIFVzZSBqUXVlcnkgaWYgaXQgZXhpc3RzIHdpdGggcHJvcGVyIGZ1bmN0aW9uYWxpdHksIG90aGVyd2lzZSBkZWZhdWx0IHRvIHVzLgorICAvLyBBbmd1bGFyIDEuMisgcmVxdWlyZXMgalF1ZXJ5IDEuNysgZm9yIG9uKCkvb2ZmKCkgc3VwcG9ydC4KKyAgLy8gQW5ndWxhciAxLjMrIHRlY2huaWNhbGx5IHJlcXVpcmVzIGF0IGxlYXN0IGpRdWVyeSAyLjErIGJ1dCBpdCBtYXkgd29yayB3aXRoIG9sZGVyCisgIC8vIHZlcnNpb25zLiBJdCB3aWxsIG5vdCB3b3JrIGZvciBzdXJlIHdpdGggalF1ZXJ5IDwxLjcsIHRob3VnaC4KKyAgaWYgKGpRdWVyeSAmJiBqUXVlcnkuZm4ub24pIHsKKyAgICBqcUxpdGUgPSBqUXVlcnk7CisgICAgZXh0ZW5kKGpRdWVyeS5mbiwgeworICAgICAgc2NvcGU6IEpRTGl0ZVByb3RvdHlwZS5zY29wZSwKKyAgICAgIGlzb2xhdGVTY29wZTogSlFMaXRlUHJvdG90eXBlLmlzb2xhdGVTY29wZSwKKyAgICAgIGNvbnRyb2xsZXI6IEpRTGl0ZVByb3RvdHlwZS5jb250cm9sbGVyLAorICAgICAgaW5qZWN0b3I6IEpRTGl0ZVByb3RvdHlwZS5pbmplY3RvciwKKyAgICAgIGluaGVyaXRlZERhdGE6IEpRTGl0ZVByb3RvdHlwZS5pbmhlcml0ZWREYXRhCisgICAgfSk7CisKKyAgICAvLyBBbGwgbm9kZXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gdmlhIHZhcmlvdXMgalF1ZXJ5IEFQSXMgbGlrZSAucmVtb3ZlKCkKKyAgICAvLyBhcmUgcGFzc2VkIHRocm91Z2ggalF1ZXJ5LmNsZWFuRGF0YS4gTW9ua2V5LXBhdGNoIHRoaXMgbWV0aG9kIHRvIGZpcmUKKyAgICAvLyB0aGUgJGRlc3Ryb3kgZXZlbnQgb24gYWxsIHJlbW92ZWQgbm9kZXMuCisgICAgb3JpZ2luYWxDbGVhbkRhdGEgPSBqUXVlcnkuY2xlYW5EYXRhOworICAgIGpRdWVyeS5jbGVhbkRhdGEgPSBmdW5jdGlvbihlbGVtcykgeworICAgICAgdmFyIGV2ZW50czsKKyAgICAgIGlmICghc2tpcERlc3Ryb3lPbk5leHRKUXVlcnlDbGVhbkRhdGEpIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKykgeworICAgICAgICAgIGV2ZW50cyA9IGpRdWVyeS5fZGF0YShlbGVtLCAiZXZlbnRzIik7CisgICAgICAgICAgaWYgKGV2ZW50cyAmJiBldmVudHMuJGRlc3Ryb3kpIHsKKyAgICAgICAgICAgIGpRdWVyeShlbGVtKS50cmlnZ2VySGFuZGxlcignJGRlc3Ryb3knKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNraXBEZXN0cm95T25OZXh0SlF1ZXJ5Q2xlYW5EYXRhID0gZmFsc2U7CisgICAgICB9CisgICAgICBvcmlnaW5hbENsZWFuRGF0YShlbGVtcyk7CisgICAgfTsKKyAgfSBlbHNlIHsKKyAgICBqcUxpdGUgPSBKUUxpdGU7CisgIH0KKworICBhbmd1bGFyLmVsZW1lbnQgPSBqcUxpdGU7CisKKyAgLy8gUHJldmVudCBkb3VibGUtcHJveHlpbmcuCisgIGJpbmRKUXVlcnlGaXJlZCA9IHRydWU7Cit9CisKKy8qKgorICogdGhyb3cgZXJyb3IgaWYgdGhlIGFyZ3VtZW50IGlzIGZhbHN5LgorICovCitmdW5jdGlvbiBhc3NlcnRBcmcoYXJnLCBuYW1lLCByZWFzb24pIHsKKyAgaWYgKCFhcmcpIHsKKyAgICB0aHJvdyBuZ01pbkVycignYXJlcScsICJBcmd1bWVudCAnezB9JyBpcyB7MX0iLCAobmFtZSB8fCAnPycpLCAocmVhc29uIHx8ICJyZXF1aXJlZCIpKTsKKyAgfQorICByZXR1cm4gYXJnOworfQorCitmdW5jdGlvbiBhc3NlcnRBcmdGbihhcmcsIG5hbWUsIGFjY2VwdEFycmF5QW5ub3RhdGlvbikgeworICBpZiAoYWNjZXB0QXJyYXlBbm5vdGF0aW9uICYmIGlzQXJyYXkoYXJnKSkgeworICAgICAgYXJnID0gYXJnW2FyZy5sZW5ndGggLSAxXTsKKyAgfQorCisgIGFzc2VydEFyZyhpc0Z1bmN0aW9uKGFyZyksIG5hbWUsICdub3QgYSBmdW5jdGlvbiwgZ290ICcgKworICAgICAgKGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyA/IGFyZy5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnIDogdHlwZW9mIGFyZykpOworICByZXR1cm4gYXJnOworfQorCisvKioKKyAqIHRocm93IGVycm9yIGlmIHRoZSBuYW1lIGdpdmVuIGlzIGhhc093blByb3BlcnR5CisgKiBAcGFyYW0gIHtTdHJpbmd9IG5hbWUgICAgdGhlIG5hbWUgdG8gdGVzdAorICogQHBhcmFtICB7U3RyaW5nfSBjb250ZXh0IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBuYW1lIGlzIHVzZWQsIHN1Y2ggYXMgbW9kdWxlIG9yIGRpcmVjdGl2ZQorICovCitmdW5jdGlvbiBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eShuYW1lLCBjb250ZXh0KSB7CisgIGlmIChuYW1lID09PSAnaGFzT3duUHJvcGVydHknKSB7CisgICAgdGhyb3cgbmdNaW5FcnIoJ2JhZG5hbWUnLCAiaGFzT3duUHJvcGVydHkgaXMgbm90IGEgdmFsaWQgezB9IG5hbWUiLCBjb250ZXh0KTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybiB0aGUgdmFsdWUgYWNjZXNzaWJsZSBmcm9tIHRoZSBvYmplY3QgYnkgcGF0aC4gQW55IHVuZGVmaW5lZCB0cmF2ZXJzYWxzIGFyZSBpZ25vcmVkCisgKiBAcGFyYW0ge09iamVjdH0gb2JqIHN0YXJ0aW5nIG9iamVjdAorICogQHBhcmFtIHtTdHJpbmd9IHBhdGggcGF0aCB0byB0cmF2ZXJzZQorICogQHBhcmFtIHtib29sZWFufSBbYmluZEZuVG9TY29wZT10cnVlXQorICogQHJldHVybnMge09iamVjdH0gdmFsdWUgYXMgYWNjZXNzaWJsZSBieSBwYXRoCisgKi8KKy8vVE9ETyhtaXNrbyk6IHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmVtb3ZlZAorZnVuY3Rpb24gZ2V0dGVyKG9iaiwgcGF0aCwgYmluZEZuVG9TY29wZSkgeworICBpZiAoIXBhdGgpIHJldHVybiBvYmo7CisgIHZhciBrZXlzID0gcGF0aC5zcGxpdCgnLicpOworICB2YXIga2V5OworICB2YXIgbGFzdEluc3RhbmNlID0gb2JqOworICB2YXIgbGVuID0ga2V5cy5sZW5ndGg7CisKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGtleSA9IGtleXNbaV07CisgICAgaWYgKG9iaikgeworICAgICAgb2JqID0gKGxhc3RJbnN0YW5jZSA9IG9iailba2V5XTsKKyAgICB9CisgIH0KKyAgaWYgKCFiaW5kRm5Ub1Njb3BlICYmIGlzRnVuY3Rpb24ob2JqKSkgeworICAgIHJldHVybiBiaW5kKGxhc3RJbnN0YW5jZSwgb2JqKTsKKyAgfQorICByZXR1cm4gb2JqOworfQorCisvKioKKyAqIFJldHVybiB0aGUgRE9NIHNpYmxpbmdzIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgaW4gdGhlIGdpdmVuIGFycmF5LgorICogQHBhcmFtIHtBcnJheX0gYXJyYXkgbGlrZSBvYmplY3QKKyAqIEByZXR1cm5zIHtqcUxpdGV9IGpxTGl0ZSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgdGhlIG5vZGVzCisgKi8KK2Z1bmN0aW9uIGdldEJsb2NrTm9kZXMobm9kZXMpIHsKKyAgLy8gVE9ETyhwZXJmKToganVzdCBjaGVjayBpZiBhbGwgaXRlbXMgaW4gYG5vZGVzYCBhcmUgc2libGluZ3MgYW5kIGlmIHRoZXkgYXJlIHJldHVybiB0aGUgb3JpZ2luYWwKKyAgLy8gICAgICAgICAgICAgY29sbGVjdGlvbiwgb3RoZXJ3aXNlIHVwZGF0ZSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KKyAgdmFyIG5vZGUgPSBub2Rlc1swXTsKKyAgdmFyIGVuZE5vZGUgPSBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXTsKKyAgdmFyIGJsb2NrTm9kZXMgPSBbbm9kZV07CisKKyAgZG8geworICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOworICAgIGlmICghbm9kZSkgYnJlYWs7CisgICAgYmxvY2tOb2Rlcy5wdXNoKG5vZGUpOworICB9IHdoaWxlIChub2RlICE9PSBlbmROb2RlKTsKKworICByZXR1cm4ganFMaXRlKGJsb2NrTm9kZXMpOworfQorCisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aG91dCBhIHByb3RvdHlwZS4gVGhpcyBvYmplY3QgaXMgdXNlZnVsIGZvciBsb29rdXAgd2l0aG91dCBoYXZpbmcgdG8KKyAqIGd1YXJkIGFnYWluc3QgcHJvdG90eXBpY2FsbHkgaW5oZXJpdGVkIHByb3BlcnRpZXMgdmlhIGhhc093blByb3BlcnR5LgorICoKKyAqIFJlbGF0ZWQgbWljcm8tYmVuY2htYXJrczoKKyAqIC0gaHR0cDovL2pzcGVyZi5jb20vb2JqZWN0LWNyZWF0ZTIKKyAqIC0gaHR0cDovL2pzcGVyZi5jb20vcHJvdG8tbWFwLWxvb2t1cC8yCisgKiAtIGh0dHA6Ly9qc3BlcmYuY29tL2Zvci1pbi12cy1vYmplY3Qta2V5czIKKyAqCisgKiBAcmV0dXJucyB7T2JqZWN0fQorICovCitmdW5jdGlvbiBjcmVhdGVNYXAoKSB7CisgIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpOworfQorCit2YXIgTk9ERV9UWVBFX0VMRU1FTlQgPSAxOwordmFyIE5PREVfVFlQRV9URVhUID0gMzsKK3ZhciBOT0RFX1RZUEVfQ09NTUVOVCA9IDg7Cit2YXIgTk9ERV9UWVBFX0RPQ1VNRU5UID0gOTsKK3ZhciBOT0RFX1RZUEVfRE9DVU1FTlRfRlJBR01FTlQgPSAxMTsKKworLyoqCisgKiBAbmdkb2MgdHlwZQorICogQG5hbWUgYW5ndWxhci5Nb2R1bGUKKyAqIEBtb2R1bGUgbmcKKyAqIEBkZXNjcmlwdGlvbgorICoKKyAqIEludGVyZmFjZSBmb3IgY29uZmlndXJpbmcgYW5ndWxhciB7QGxpbmsgYW5ndWxhci5tb2R1bGUgbW9kdWxlc30uCisgKi8KKworZnVuY3Rpb24gc2V0dXBNb2R1bGVMb2FkZXIod2luZG93KSB7CisKKyAgdmFyICRpbmplY3Rvck1pbkVyciA9IG1pbkVycignJGluamVjdG9yJyk7CisgIHZhciBuZ01pbkVyciA9IG1pbkVycignbmcnKTsKKworICBmdW5jdGlvbiBlbnN1cmUob2JqLCBuYW1lLCBmYWN0b3J5KSB7CisgICAgcmV0dXJuIG9ialtuYW1lXSB8fCAob2JqW25hbWVdID0gZmFjdG9yeSgpKTsKKyAgfQorCisgIHZhciBhbmd1bGFyID0gZW5zdXJlKHdpbmRvdywgJ2FuZ3VsYXInLCBPYmplY3QpOworCisgIC8vIFdlIG5lZWQgdG8gZXhwb3NlIGBhbmd1bGFyLiQkbWluRXJyYCB0byBtb2R1bGVzIHN1Y2ggYXMgYG5nUmVzb3VyY2VgIHRoYXQgcmVmZXJlbmNlIGl0IGR1cmluZyBib290c3RyYXAKKyAgYW5ndWxhci4kJG1pbkVyciA9IGFuZ3VsYXIuJCRtaW5FcnIgfHwgbWluRXJyOworCisgIHJldHVybiBlbnN1cmUoYW5ndWxhciwgJ21vZHVsZScsIGZ1bmN0aW9uKCkgeworICAgIC8qKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsIGFuZ3VsYXIuTW9kdWxlPn0gKi8KKyAgICB2YXIgbW9kdWxlcyA9IHt9OworCisgICAgLyoqCisgICAgICogQG5nZG9jIGZ1bmN0aW9uCisgICAgICogQG5hbWUgYW5ndWxhci5tb2R1bGUKKyAgICAgKiBAbW9kdWxlIG5nCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICoKKyAgICAgKiBUaGUgYGFuZ3VsYXIubW9kdWxlYCBpcyBhIGdsb2JhbCBwbGFjZSBmb3IgY3JlYXRpbmcsIHJlZ2lzdGVyaW5nIGFuZCByZXRyaWV2aW5nIEFuZ3VsYXIKKyAgICAgKiBtb2R1bGVzLgorICAgICAqIEFsbCBtb2R1bGVzIChhbmd1bGFyIGNvcmUgb3IgM3JkIHBhcnR5KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUgdG8gYW4gYXBwbGljYXRpb24gbXVzdCBiZQorICAgICAqIHJlZ2lzdGVyZWQgdXNpbmcgdGhpcyBtZWNoYW5pc20uCisgICAgICoKKyAgICAgKiBXaGVuIHBhc3NlZCB0d28gb3IgbW9yZSBhcmd1bWVudHMsIGEgbmV3IG1vZHVsZSBpcyBjcmVhdGVkLiAgSWYgcGFzc2VkIG9ubHkgb25lIGFyZ3VtZW50LCBhbgorICAgICAqIGV4aXN0aW5nIG1vZHVsZSAodGhlIG5hbWUgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBgbW9kdWxlYCkgaXMgcmV0cmlldmVkLgorICAgICAqCisgICAgICoKKyAgICAgKiAjIE1vZHVsZQorICAgICAqCisgICAgICogQSBtb2R1bGUgaXMgYSBjb2xsZWN0aW9uIG9mIHNlcnZpY2VzLCBkaXJlY3RpdmVzLCBjb250cm9sbGVycywgZmlsdGVycywgYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICAgICogYGFuZ3VsYXIubW9kdWxlYCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uCisgICAgICoKKyAgICAgKiBgYGBqcworICAgICAqIC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUKKyAgICAgKiB2YXIgbXlNb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnbXlNb2R1bGUnLCBbXSk7CisgICAgICoKKyAgICAgKiAvLyByZWdpc3RlciBhIG5ldyBzZXJ2aWNlCisgICAgICogbXlNb2R1bGUudmFsdWUoJ2FwcE5hbWUnLCAnTXlDb29sQXBwJyk7CisgICAgICoKKyAgICAgKiAvLyBjb25maWd1cmUgZXhpc3Rpbmcgc2VydmljZXMgaW5zaWRlIGluaXRpYWxpemF0aW9uIGJsb2Nrcy4KKyAgICAgKiBteU1vZHVsZS5jb25maWcoWyckbG9jYXRpb25Qcm92aWRlcicsIGZ1bmN0aW9uKCRsb2NhdGlvblByb3ZpZGVyKSB7CisgICAgICogICAvLyBDb25maWd1cmUgZXhpc3RpbmcgcHJvdmlkZXJzCisgICAgICogICAkbG9jYXRpb25Qcm92aWRlci5oYXNoUHJlZml4KCchJyk7CisgICAgICogfV0pOworICAgICAqIGBgYAorICAgICAqCisgICAgICogVGhlbiB5b3UgY2FuIGNyZWF0ZSBhbiBpbmplY3RvciBhbmQgbG9hZCB5b3VyIG1vZHVsZXMgbGlrZSB0aGlzOgorICAgICAqCisgICAgICogYGBganMKKyAgICAgKiB2YXIgaW5qZWN0b3IgPSBhbmd1bGFyLmluamVjdG9yKFsnbmcnLCAnbXlNb2R1bGUnXSkKKyAgICAgKiBgYGAKKyAgICAgKgorICAgICAqIEhvd2V2ZXIgaXQncyBtb3JlIGxpa2VseSB0aGF0IHlvdSdsbCBqdXN0IHVzZQorICAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdBcHAgbmdBcHB9IG9yCisgICAgICoge0BsaW5rIGFuZ3VsYXIuYm9vdHN0cmFwfSB0byBzaW1wbGlmeSB0aGlzIHByb2Nlc3MgZm9yIHlvdS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7IXN0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGNyZWF0ZSBvciByZXRyaWV2ZS4KKyAgICAgKiBAcGFyYW0geyFBcnJheS48c3RyaW5nPj19IHJlcXVpcmVzIElmIHNwZWNpZmllZCB0aGVuIG5ldyBtb2R1bGUgaXMgYmVpbmcgY3JlYXRlZC4gSWYKKyAgICAgKiAgICAgICAgdW5zcGVjaWZpZWQgdGhlbiB0aGUgbW9kdWxlIGlzIGJlaW5nIHJldHJpZXZlZCBmb3IgZnVydGhlciBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb249fSBjb25maWdGbiBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlLiBTYW1lIGFzCisgICAgICogICAgICAgIHtAbGluayBhbmd1bGFyLk1vZHVsZSNjb25maWcgTW9kdWxlI2NvbmZpZygpfS4KKyAgICAgKiBAcmV0dXJucyB7bW9kdWxlfSBuZXcgbW9kdWxlIHdpdGggdGhlIHtAbGluayBhbmd1bGFyLk1vZHVsZX0gYXBpLgorICAgICAqLworICAgIHJldHVybiBmdW5jdGlvbiBtb2R1bGUobmFtZSwgcmVxdWlyZXMsIGNvbmZpZ0ZuKSB7CisgICAgICB2YXIgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkgPSBmdW5jdGlvbihuYW1lLCBjb250ZXh0KSB7CisgICAgICAgIGlmIChuYW1lID09PSAnaGFzT3duUHJvcGVydHknKSB7CisgICAgICAgICAgdGhyb3cgbmdNaW5FcnIoJ2JhZG5hbWUnLCAnaGFzT3duUHJvcGVydHkgaXMgbm90IGEgdmFsaWQgezB9IG5hbWUnLCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkobmFtZSwgJ21vZHVsZScpOworICAgICAgaWYgKHJlcXVpcmVzICYmIG1vZHVsZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgbW9kdWxlc1tuYW1lXSA9IG51bGw7CisgICAgICB9CisgICAgICByZXR1cm4gZW5zdXJlKG1vZHVsZXMsIG5hbWUsIGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAoIXJlcXVpcmVzKSB7CisgICAgICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCdub21vZCcsICJNb2R1bGUgJ3swfScgaXMgbm90IGF2YWlsYWJsZSEgWW91IGVpdGhlciBtaXNzcGVsbGVkICIgKworICAgICAgICAgICAgICJ0aGUgbW9kdWxlIG5hbWUgb3IgZm9yZ290IHRvIGxvYWQgaXQuIElmIHJlZ2lzdGVyaW5nIGEgbW9kdWxlIGVuc3VyZSB0aGF0IHlvdSAiICsKKyAgICAgICAgICAgICAic3BlY2lmeSB0aGUgZGVwZW5kZW5jaWVzIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuIiwgbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogQHR5cGUgeyFBcnJheS48QXJyYXkuPCo+Pn0gKi8KKyAgICAgICAgdmFyIGludm9rZVF1ZXVlID0gW107CisKKyAgICAgICAgLyoqIEB0eXBlIHshQXJyYXkuPEZ1bmN0aW9uPn0gKi8KKyAgICAgICAgdmFyIGNvbmZpZ0Jsb2NrcyA9IFtdOworCisgICAgICAgIC8qKiBAdHlwZSB7IUFycmF5LjxGdW5jdGlvbj59ICovCisgICAgICAgIHZhciBydW5CbG9ja3MgPSBbXTsKKworICAgICAgICB2YXIgY29uZmlnID0gaW52b2tlTGF0ZXIoJyRpbmplY3RvcicsICdpbnZva2UnLCAncHVzaCcsIGNvbmZpZ0Jsb2Nrcyk7CisKKyAgICAgICAgLyoqIEB0eXBlIHthbmd1bGFyLk1vZHVsZX0gKi8KKyAgICAgICAgdmFyIG1vZHVsZUluc3RhbmNlID0geworICAgICAgICAgIC8vIFByaXZhdGUgc3RhdGUKKyAgICAgICAgICBfaW52b2tlUXVldWU6IGludm9rZVF1ZXVlLAorICAgICAgICAgIF9jb25maWdCbG9ja3M6IGNvbmZpZ0Jsb2NrcywKKyAgICAgICAgICBfcnVuQmxvY2tzOiBydW5CbG9ja3MsCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBAbmdkb2MgcHJvcGVydHkKKyAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNyZXF1aXJlcworICAgICAgICAgICAqIEBtb2R1bGUgbmcKKyAgICAgICAgICAgKgorICAgICAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICAgICAqIEhvbGRzIHRoZSBsaXN0IG9mIG1vZHVsZXMgd2hpY2ggdGhlIGluamVjdG9yIHdpbGwgbG9hZCBiZWZvcmUgdGhlIGN1cnJlbnQgbW9kdWxlIGlzCisgICAgICAgICAgICogbG9hZGVkLgorICAgICAgICAgICAqLworICAgICAgICAgIHJlcXVpcmVzOiByZXF1aXJlcywKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIEBuZ2RvYyBwcm9wZXJ0eQorICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI25hbWUKKyAgICAgICAgICAgKiBAbW9kdWxlIG5nCisgICAgICAgICAgICoKKyAgICAgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAgICAgKiBOYW1lIG9mIHRoZSBtb2R1bGUuCisgICAgICAgICAgICovCisgICAgICAgICAgbmFtZTogbmFtZSwKKworCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI3Byb3ZpZGVyCisgICAgICAgICAgICogQG1vZHVsZSBuZworICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHNlcnZpY2UgbmFtZQorICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByb3ZpZGVyVHlwZSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZiB0aGUKKyAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS4KKyAgICAgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAgICAgKiBTZWUge0BsaW5rIGF1dG8uJHByb3ZpZGUjcHJvdmlkZXIgJHByb3ZpZGUucHJvdmlkZXIoKX0uCisgICAgICAgICAgICovCisgICAgICAgICAgcHJvdmlkZXI6IGludm9rZUxhdGVyKCckcHJvdmlkZScsICdwcm92aWRlcicpLAorCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI2ZhY3RvcnkKKyAgICAgICAgICAgKiBAbW9kdWxlIG5nCisgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgc2VydmljZSBuYW1lCisgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJvdmlkZXJGdW5jdGlvbiBGdW5jdGlvbiBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlLgorICAgICAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICAgICAqIFNlZSB7QGxpbmsgYXV0by4kcHJvdmlkZSNmYWN0b3J5ICRwcm92aWRlLmZhY3RvcnkoKX0uCisgICAgICAgICAgICovCisgICAgICAgICAgZmFjdG9yeTogaW52b2tlTGF0ZXIoJyRwcm92aWRlJywgJ2ZhY3RvcnknKSwKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNzZXJ2aWNlCisgICAgICAgICAgICogQG1vZHVsZSBuZworICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHNlcnZpY2UgbmFtZQorICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIEEgY29uc3RydWN0b3IgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGluc3RhbnRpYXRlZC4KKyAgICAgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAgICAgKiBTZWUge0BsaW5rIGF1dG8uJHByb3ZpZGUjc2VydmljZSAkcHJvdmlkZS5zZXJ2aWNlKCl9LgorICAgICAgICAgICAqLworICAgICAgICAgIHNlcnZpY2U6IGludm9rZUxhdGVyKCckcHJvdmlkZScsICdzZXJ2aWNlJyksCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjdmFsdWUKKyAgICAgICAgICAgKiBAbW9kdWxlIG5nCisgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgc2VydmljZSBuYW1lCisgICAgICAgICAgICogQHBhcmFtIHsqfSBvYmplY3QgU2VydmljZSBpbnN0YW5jZSBvYmplY3QuCisgICAgICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgICAgICogU2VlIHtAbGluayBhdXRvLiRwcm92aWRlI3ZhbHVlICRwcm92aWRlLnZhbHVlKCl9LgorICAgICAgICAgICAqLworICAgICAgICAgIHZhbHVlOiBpbnZva2VMYXRlcignJHByb3ZpZGUnLCAndmFsdWUnKSwKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNjb25zdGFudAorICAgICAgICAgICAqIEBtb2R1bGUgbmcKKyAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBjb25zdGFudCBuYW1lCisgICAgICAgICAgICogQHBhcmFtIHsqfSBvYmplY3QgQ29uc3RhbnQgdmFsdWUuCisgICAgICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgICAgICogQmVjYXVzZSB0aGUgY29uc3RhbnQgYXJlIGZpeGVkLCB0aGV5IGdldCBhcHBsaWVkIGJlZm9yZSBvdGhlciBwcm92aWRlIG1ldGhvZHMuCisgICAgICAgICAgICogU2VlIHtAbGluayBhdXRvLiRwcm92aWRlI2NvbnN0YW50ICRwcm92aWRlLmNvbnN0YW50KCl9LgorICAgICAgICAgICAqLworICAgICAgICAgIGNvbnN0YW50OiBpbnZva2VMYXRlcignJHByb3ZpZGUnLCAnY29uc3RhbnQnLCAndW5zaGlmdCcpLAorCisgICAgICAgICAgLyoqCisgICAgICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI2FuaW1hdGlvbgorICAgICAgICAgICAqIEBtb2R1bGUgbmcKKyAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBhbmltYXRpb24gbmFtZQorICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFuaW1hdGlvbkZhY3RvcnkgRmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlIG9mIGFuCisgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24uCisgICAgICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgICAgICoKKyAgICAgICAgICAgKiAqKk5PVEUqKjogYW5pbWF0aW9ucyB0YWtlIGVmZmVjdCBvbmx5IGlmIHRoZSAqKm5nQW5pbWF0ZSoqIG1vZHVsZSBpcyBsb2FkZWQuCisgICAgICAgICAgICoKKyAgICAgICAgICAgKgorICAgICAgICAgICAqIERlZmluZXMgYW4gYW5pbWF0aW9uIGhvb2sgdGhhdCBjYW4gYmUgbGF0ZXIgdXNlZCB3aXRoCisgICAgICAgICAgICoge0BsaW5rIG5nQW5pbWF0ZS4kYW5pbWF0ZSAkYW5pbWF0ZX0gc2VydmljZSBhbmQgZGlyZWN0aXZlcyB0aGF0IHVzZSB0aGlzIHNlcnZpY2UuCisgICAgICAgICAgICoKKyAgICAgICAgICAgKiBgYGBqcworICAgICAgICAgICAqIG1vZHVsZS5hbmltYXRpb24oJy5hbmltYXRpb24tbmFtZScsIGZ1bmN0aW9uKCRpbmplY3QxLCAkaW5qZWN0MikgeworICAgICAgICAgICAqICAgcmV0dXJuIHsKKyAgICAgICAgICAgKiAgICAgZXZlbnROYW1lIDogZnVuY3Rpb24oZWxlbWVudCwgZG9uZSkgeworICAgICAgICAgICAqICAgICAgIC8vY29kZSB0byBydW4gdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAqICAgICAgIC8vb25jZSBjb21wbGV0ZSwgdGhlbiBydW4gZG9uZSgpCisgICAgICAgICAgICogICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNhbmNlbGxhdGlvbkZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAgICAgICAgKiAgICAgICAgIC8vY29kZSB0byBjYW5jZWwgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAqICAgICAgIH0KKyAgICAgICAgICAgKiAgICAgfQorICAgICAgICAgICAqICAgfQorICAgICAgICAgICAqIH0pCisgICAgICAgICAgICogYGBgCisgICAgICAgICAgICoKKyAgICAgICAgICAgKiBTZWUge0BsaW5rIG5nLiRhbmltYXRlUHJvdmlkZXIjcmVnaXN0ZXIgJGFuaW1hdGVQcm92aWRlci5yZWdpc3RlcigpfSBhbmQKKyAgICAgICAgICAgKiB7QGxpbmsgbmdBbmltYXRlIG5nQW5pbWF0ZSBtb2R1bGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAqLworICAgICAgICAgIGFuaW1hdGlvbjogaW52b2tlTGF0ZXIoJyRhbmltYXRlUHJvdmlkZXInLCAncmVnaXN0ZXInKSwKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNmaWx0ZXIKKyAgICAgICAgICAgKiBAbW9kdWxlIG5nCisgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgRmlsdGVyIG5hbWUuCisgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsdGVyRmFjdG9yeSBGYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2Ugb2YgZmlsdGVyLgorICAgICAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICAgICAqIFNlZSB7QGxpbmsgbmcuJGZpbHRlclByb3ZpZGVyI3JlZ2lzdGVyICRmaWx0ZXJQcm92aWRlci5yZWdpc3RlcigpfS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBmaWx0ZXI6IGludm9rZUxhdGVyKCckZmlsdGVyUHJvdmlkZXInLCAncmVnaXN0ZXInKSwKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNjb250cm9sbGVyCisgICAgICAgICAgICogQG1vZHVsZSBuZworICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gbmFtZSBDb250cm9sbGVyIG5hbWUsIG9yIGFuIG9iamVjdCBtYXAgb2YgY29udHJvbGxlcnMgd2hlcmUgdGhlCisgICAgICAgICAgICogICAga2V5cyBhcmUgdGhlIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgY29uc3RydWN0b3JzLgorICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIENvbnRyb2xsZXIgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgICAgICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgICAgICogU2VlIHtAbGluayBuZy4kY29udHJvbGxlclByb3ZpZGVyI3JlZ2lzdGVyICRjb250cm9sbGVyUHJvdmlkZXIucmVnaXN0ZXIoKX0uCisgICAgICAgICAgICovCisgICAgICAgICAgY29udHJvbGxlcjogaW52b2tlTGF0ZXIoJyRjb250cm9sbGVyUHJvdmlkZXInLCAncmVnaXN0ZXInKSwKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNkaXJlY3RpdmUKKyAgICAgICAgICAgKiBAbW9kdWxlIG5nCisgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBuYW1lIERpcmVjdGl2ZSBuYW1lLCBvciBhbiBvYmplY3QgbWFwIG9mIGRpcmVjdGl2ZXMgd2hlcmUgdGhlCisgICAgICAgICAgICogICAga2V5cyBhcmUgdGhlIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgZmFjdG9yaWVzLgorICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRpcmVjdGl2ZUZhY3RvcnkgRmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlIG9mCisgICAgICAgICAgICogZGlyZWN0aXZlcy4KKyAgICAgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAgICAgKiBTZWUge0BsaW5rIG5nLiRjb21waWxlUHJvdmlkZXIjZGlyZWN0aXZlICRjb21waWxlUHJvdmlkZXIuZGlyZWN0aXZlKCl9LgorICAgICAgICAgICAqLworICAgICAgICAgIGRpcmVjdGl2ZTogaW52b2tlTGF0ZXIoJyRjb21waWxlUHJvdmlkZXInLCAnZGlyZWN0aXZlJyksCisKKyAgICAgICAgICAvKioKKyAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjY29uZmlnCisgICAgICAgICAgICogQG1vZHVsZSBuZworICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbmZpZ0ZuIEV4ZWN1dGUgdGhpcyBmdW5jdGlvbiBvbiBtb2R1bGUgbG9hZC4gVXNlZnVsIGZvciBzZXJ2aWNlCisgICAgICAgICAgICogICAgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gcmVnaXN0ZXIgd29yayB3aGljaCBuZWVkcyB0byBiZSBwZXJmb3JtZWQgb24gbW9kdWxlIGxvYWRpbmcuCisgICAgICAgICAgICogRm9yIG1vcmUgYWJvdXQgaG93IHRvIGNvbmZpZ3VyZSBzZXJ2aWNlcywgc2VlCisgICAgICAgICAgICoge0BsaW5rIHByb3ZpZGVycyNwcm92aWRlci1yZWNpcGUgUHJvdmlkZXIgUmVjaXBlfS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBjb25maWc6IGNvbmZpZywKKworICAgICAgICAgIC8qKgorICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNydW4KKyAgICAgICAgICAgKiBAbW9kdWxlIG5nCisgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW5pdGlhbGl6YXRpb25GbiBFeGVjdXRlIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgaW5qZWN0b3IgY3JlYXRpb24uCisgICAgICAgICAgICogICAgVXNlZnVsIGZvciBhcHBsaWNhdGlvbiBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gcmVnaXN0ZXIgd29yayB3aGljaCBzaG91bGQgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIGluamVjdG9yIGlzIGRvbmUKKyAgICAgICAgICAgKiBsb2FkaW5nIGFsbCBtb2R1bGVzLgorICAgICAgICAgICAqLworICAgICAgICAgIHJ1bjogZnVuY3Rpb24oYmxvY2spIHsKKyAgICAgICAgICAgIHJ1bkJsb2Nrcy5wdXNoKGJsb2NrKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBpZiAoY29uZmlnRm4pIHsKKyAgICAgICAgICBjb25maWcoY29uZmlnRm4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1vZHVsZUluc3RhbmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXIKKyAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZAorICAgICAgICAgKiBAcGFyYW0ge1N0cmluZz19IGluc2VydE1ldGhvZAorICAgICAgICAgKiBAcmV0dXJucyB7YW5ndWxhci5Nb2R1bGV9CisgICAgICAgICAqLworICAgICAgICBmdW5jdGlvbiBpbnZva2VMYXRlcihwcm92aWRlciwgbWV0aG9kLCBpbnNlcnRNZXRob2QsIHF1ZXVlKSB7CisgICAgICAgICAgaWYgKCFxdWV1ZSkgcXVldWUgPSBpbnZva2VRdWV1ZTsKKyAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBxdWV1ZVtpbnNlcnRNZXRob2QgfHwgJ3B1c2gnXShbcHJvdmlkZXIsIG1ldGhvZCwgYXJndW1lbnRzXSk7CisgICAgICAgICAgICByZXR1cm4gbW9kdWxlSW5zdGFuY2U7CisgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfTsKKyAgfSk7CisKK30KKworLyogZ2xvYmFsOiB0b0RlYnVnU3RyaW5nOiB0cnVlICovCisKK2Z1bmN0aW9uIHNlcmlhbGl6ZU9iamVjdChvYmopIHsKKyAgdmFyIHNlZW4gPSBbXTsKKworICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBmdW5jdGlvbihrZXksIHZhbCkgeworICAgIHZhbCA9IHRvSnNvblJlcGxhY2VyKGtleSwgdmFsKTsKKyAgICBpZiAoaXNPYmplY3QodmFsKSkgeworCisgICAgICBpZiAoc2Vlbi5pbmRleE9mKHZhbCkgPj0gMCkgcmV0dXJuICc8PGFscmVhZHkgc2Vlbj4+JzsKKworICAgICAgc2Vlbi5wdXNoKHZhbCk7CisgICAgfQorICAgIHJldHVybiB2YWw7CisgIH0pOworfQorCitmdW5jdGlvbiB0b0RlYnVnU3RyaW5nKG9iaikgeworICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykgeworICAgIHJldHVybiBvYmoudG9TdHJpbmcoKS5yZXBsYWNlKC8gXHtbXHNcU10qJC8sICcnKTsKKyAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykgeworICAgIHJldHVybiAndW5kZWZpbmVkJzsKKyAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqICE9PSAnc3RyaW5nJykgeworICAgIHJldHVybiBzZXJpYWxpemVPYmplY3Qob2JqKTsKKyAgfQorICByZXR1cm4gb2JqOworfQorCisvKiBnbG9iYWwgYW5ndWxhck1vZHVsZTogdHJ1ZSwKKyAgdmVyc2lvbjogdHJ1ZSwKKworICAkTG9jYWxlUHJvdmlkZXIsCisgICRDb21waWxlUHJvdmlkZXIsCisKKyAgaHRtbEFuY2hvckRpcmVjdGl2ZSwKKyAgaW5wdXREaXJlY3RpdmUsCisgIGlucHV0RGlyZWN0aXZlLAorICBmb3JtRGlyZWN0aXZlLAorICBzY3JpcHREaXJlY3RpdmUsCisgIHNlbGVjdERpcmVjdGl2ZSwKKyAgc3R5bGVEaXJlY3RpdmUsCisgIG9wdGlvbkRpcmVjdGl2ZSwKKyAgbmdCaW5kRGlyZWN0aXZlLAorICBuZ0JpbmRIdG1sRGlyZWN0aXZlLAorICBuZ0JpbmRUZW1wbGF0ZURpcmVjdGl2ZSwKKyAgbmdDbGFzc0RpcmVjdGl2ZSwKKyAgbmdDbGFzc0V2ZW5EaXJlY3RpdmUsCisgIG5nQ2xhc3NPZGREaXJlY3RpdmUsCisgIG5nQ3NwRGlyZWN0aXZlLAorICBuZ0Nsb2FrRGlyZWN0aXZlLAorICBuZ0NvbnRyb2xsZXJEaXJlY3RpdmUsCisgIG5nRm9ybURpcmVjdGl2ZSwKKyAgbmdIaWRlRGlyZWN0aXZlLAorICBuZ0lmRGlyZWN0aXZlLAorICBuZ0luY2x1ZGVEaXJlY3RpdmUsCisgIG5nSW5jbHVkZUZpbGxDb250ZW50RGlyZWN0aXZlLAorICBuZ0luaXREaXJlY3RpdmUsCisgIG5nTm9uQmluZGFibGVEaXJlY3RpdmUsCisgIG5nUGx1cmFsaXplRGlyZWN0aXZlLAorICBuZ1JlcGVhdERpcmVjdGl2ZSwKKyAgbmdTaG93RGlyZWN0aXZlLAorICBuZ1N0eWxlRGlyZWN0aXZlLAorICBuZ1N3aXRjaERpcmVjdGl2ZSwKKyAgbmdTd2l0Y2hXaGVuRGlyZWN0aXZlLAorICBuZ1N3aXRjaERlZmF1bHREaXJlY3RpdmUsCisgIG5nT3B0aW9uc0RpcmVjdGl2ZSwKKyAgbmdUcmFuc2NsdWRlRGlyZWN0aXZlLAorICBuZ01vZGVsRGlyZWN0aXZlLAorICBuZ0xpc3REaXJlY3RpdmUsCisgIG5nQ2hhbmdlRGlyZWN0aXZlLAorICBwYXR0ZXJuRGlyZWN0aXZlLAorICBwYXR0ZXJuRGlyZWN0aXZlLAorICByZXF1aXJlZERpcmVjdGl2ZSwKKyAgcmVxdWlyZWREaXJlY3RpdmUsCisgIG1pbmxlbmd0aERpcmVjdGl2ZSwKKyAgbWlubGVuZ3RoRGlyZWN0aXZlLAorICBtYXhsZW5ndGhEaXJlY3RpdmUsCisgIG1heGxlbmd0aERpcmVjdGl2ZSwKKyAgbmdWYWx1ZURpcmVjdGl2ZSwKKyAgbmdNb2RlbE9wdGlvbnNEaXJlY3RpdmUsCisgIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzLAorICBuZ0V2ZW50RGlyZWN0aXZlcywKKworICAkQW5jaG9yU2Nyb2xsUHJvdmlkZXIsCisgICRBbmltYXRlUHJvdmlkZXIsCisgICRCcm93c2VyUHJvdmlkZXIsCisgICRDYWNoZUZhY3RvcnlQcm92aWRlciwKKyAgJENvbnRyb2xsZXJQcm92aWRlciwKKyAgJERvY3VtZW50UHJvdmlkZXIsCisgICRFeGNlcHRpb25IYW5kbGVyUHJvdmlkZXIsCisgICRGaWx0ZXJQcm92aWRlciwKKyAgJEludGVycG9sYXRlUHJvdmlkZXIsCisgICRJbnRlcnZhbFByb3ZpZGVyLAorICAkSHR0cFByb3ZpZGVyLAorICAkSHR0cEJhY2tlbmRQcm92aWRlciwKKyAgJExvY2F0aW9uUHJvdmlkZXIsCisgICRMb2dQcm92aWRlciwKKyAgJFBhcnNlUHJvdmlkZXIsCisgICRSb290U2NvcGVQcm92aWRlciwKKyAgJFFQcm92aWRlciwKKyAgJCRRUHJvdmlkZXIsCisgICQkU2FuaXRpemVVcmlQcm92aWRlciwKKyAgJFNjZVByb3ZpZGVyLAorICAkU2NlRGVsZWdhdGVQcm92aWRlciwKKyAgJFNuaWZmZXJQcm92aWRlciwKKyAgJFRlbXBsYXRlQ2FjaGVQcm92aWRlciwKKyAgJFRlbXBsYXRlUmVxdWVzdFByb3ZpZGVyLAorICAkJFRlc3RhYmlsaXR5UHJvdmlkZXIsCisgICRUaW1lb3V0UHJvdmlkZXIsCisgICQkUkFGUHJvdmlkZXIsCisgICQkQXN5bmNDYWxsYmFja1Byb3ZpZGVyLAorICAkV2luZG93UHJvdmlkZXIsCisgICQkanFMaXRlUHJvdmlkZXIKKyovCisKKworLyoqCisgKiBAbmdkb2Mgb2JqZWN0CisgKiBAbmFtZSBhbmd1bGFyLnZlcnNpb24KKyAqIEBtb2R1bGUgbmcKKyAqIEBkZXNjcmlwdGlvbgorICogQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgQW5ndWxhckpTIHZlcnNpb24uIFRoaXMgb2JqZWN0IGhhcyB0aGUKKyAqIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICoKKyAqIC0gYGZ1bGxgIOKAPyBge3N0cmluZ31gIOKAPyBGdWxsIHZlcnNpb24gc3RyaW5nLCBzdWNoIGFzICIwLjkuMTgiLgorICogLSBgbWFqb3JgIOKAPyBge251bWJlcn1gIOKAPyBNYWpvciB2ZXJzaW9uIG51bWJlciwgc3VjaCBhcyAiMCIuCisgKiAtIGBtaW5vcmAg4oA/IGB7bnVtYmVyfWAg4oA/IE1pbm9yIHZlcnNpb24gbnVtYmVyLCBzdWNoIGFzICI5Ii4KKyAqIC0gYGRvdGAg4oA/IGB7bnVtYmVyfWAg4oA/IERvdCB2ZXJzaW9uIG51bWJlciwgc3VjaCBhcyAiMTgiLgorICogLSBgY29kZU5hbWVgIOKAPyBge3N0cmluZ31gIOKAPyBDb2RlIG5hbWUgb2YgdGhlIHJlbGVhc2UsIHN1Y2ggYXMgImppZ2dsaW5nLWFybWZhdCIuCisgKi8KK3ZhciB2ZXJzaW9uID0geworICBmdWxsOiAnMS4zLjgnLCAgICAvLyBhbGwgb2YgdGhlc2UgcGxhY2Vob2xkZXIgc3RyaW5ncyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGdydW50J3MKKyAgbWFqb3I6IDEsICAgIC8vIHBhY2thZ2UgdGFzaworICBtaW5vcjogMywKKyAgZG90OiA4LAorICBjb2RlTmFtZTogJ3Byb3BoZXRpYy1uYXJ3aGFsJworfTsKKworCitmdW5jdGlvbiBwdWJsaXNoRXh0ZXJuYWxBUEkoYW5ndWxhcikgeworICBleHRlbmQoYW5ndWxhciwgeworICAgICdib290c3RyYXAnOiBib290c3RyYXAsCisgICAgJ2NvcHknOiBjb3B5LAorICAgICdleHRlbmQnOiBleHRlbmQsCisgICAgJ2VxdWFscyc6IGVxdWFscywKKyAgICAnZWxlbWVudCc6IGpxTGl0ZSwKKyAgICAnZm9yRWFjaCc6IGZvckVhY2gsCisgICAgJ2luamVjdG9yJzogY3JlYXRlSW5qZWN0b3IsCisgICAgJ25vb3AnOiBub29wLAorICAgICdiaW5kJzogYmluZCwKKyAgICAndG9Kc29uJzogdG9Kc29uLAorICAgICdmcm9tSnNvbic6IGZyb21Kc29uLAorICAgICdpZGVudGl0eSc6IGlkZW50aXR5LAorICAgICdpc1VuZGVmaW5lZCc6IGlzVW5kZWZpbmVkLAorICAgICdpc0RlZmluZWQnOiBpc0RlZmluZWQsCisgICAgJ2lzU3RyaW5nJzogaXNTdHJpbmcsCisgICAgJ2lzRnVuY3Rpb24nOiBpc0Z1bmN0aW9uLAorICAgICdpc09iamVjdCc6IGlzT2JqZWN0LAorICAgICdpc051bWJlcic6IGlzTnVtYmVyLAorICAgICdpc0VsZW1lbnQnOiBpc0VsZW1lbnQsCisgICAgJ2lzQXJyYXknOiBpc0FycmF5LAorICAgICd2ZXJzaW9uJzogdmVyc2lvbiwKKyAgICAnaXNEYXRlJzogaXNEYXRlLAorICAgICdsb3dlcmNhc2UnOiBsb3dlcmNhc2UsCisgICAgJ3VwcGVyY2FzZSc6IHVwcGVyY2FzZSwKKyAgICAnY2FsbGJhY2tzJzoge2NvdW50ZXI6IDB9LAorICAgICdnZXRUZXN0YWJpbGl0eSc6IGdldFRlc3RhYmlsaXR5LAorICAgICckJG1pbkVycic6IG1pbkVyciwKKyAgICAnJCRjc3AnOiBjc3AsCisgICAgJ3JlbG9hZFdpdGhEZWJ1Z0luZm8nOiByZWxvYWRXaXRoRGVidWdJbmZvCisgIH0pOworCisgIGFuZ3VsYXJNb2R1bGUgPSBzZXR1cE1vZHVsZUxvYWRlcih3aW5kb3cpOworICB0cnkgeworICAgIGFuZ3VsYXJNb2R1bGUoJ25nTG9jYWxlJyk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICBhbmd1bGFyTW9kdWxlKCduZ0xvY2FsZScsIFtdKS5wcm92aWRlcignJGxvY2FsZScsICRMb2NhbGVQcm92aWRlcik7CisgIH0KKworICBhbmd1bGFyTW9kdWxlKCduZycsIFsnbmdMb2NhbGUnXSwgWyckcHJvdmlkZScsCisgICAgZnVuY3Rpb24gbmdNb2R1bGUoJHByb3ZpZGUpIHsKKyAgICAgIC8vICQkc2FuaXRpemVVcmlQcm92aWRlciBuZWVkcyB0byBiZSBiZWZvcmUgJGNvbXBpbGVQcm92aWRlciBhcyBpdCBpcyB1c2VkIGJ5IGl0LgorICAgICAgJHByb3ZpZGUucHJvdmlkZXIoeworICAgICAgICAkJHNhbml0aXplVXJpOiAkJFNhbml0aXplVXJpUHJvdmlkZXIKKyAgICAgIH0pOworICAgICAgJHByb3ZpZGUucHJvdmlkZXIoJyRjb21waWxlJywgJENvbXBpbGVQcm92aWRlcikuCisgICAgICAgIGRpcmVjdGl2ZSh7CisgICAgICAgICAgICBhOiBodG1sQW5jaG9yRGlyZWN0aXZlLAorICAgICAgICAgICAgaW5wdXQ6IGlucHV0RGlyZWN0aXZlLAorICAgICAgICAgICAgdGV4dGFyZWE6IGlucHV0RGlyZWN0aXZlLAorICAgICAgICAgICAgZm9ybTogZm9ybURpcmVjdGl2ZSwKKyAgICAgICAgICAgIHNjcmlwdDogc2NyaXB0RGlyZWN0aXZlLAorICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3REaXJlY3RpdmUsCisgICAgICAgICAgICBzdHlsZTogc3R5bGVEaXJlY3RpdmUsCisgICAgICAgICAgICBvcHRpb246IG9wdGlvbkRpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nQmluZDogbmdCaW5kRGlyZWN0aXZlLAorICAgICAgICAgICAgbmdCaW5kSHRtbDogbmdCaW5kSHRtbERpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nQmluZFRlbXBsYXRlOiBuZ0JpbmRUZW1wbGF0ZURpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nQ2xhc3M6IG5nQ2xhc3NEaXJlY3RpdmUsCisgICAgICAgICAgICBuZ0NsYXNzRXZlbjogbmdDbGFzc0V2ZW5EaXJlY3RpdmUsCisgICAgICAgICAgICBuZ0NsYXNzT2RkOiBuZ0NsYXNzT2RkRGlyZWN0aXZlLAorICAgICAgICAgICAgbmdDbG9hazogbmdDbG9ha0RpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nQ29udHJvbGxlcjogbmdDb250cm9sbGVyRGlyZWN0aXZlLAorICAgICAgICAgICAgbmdGb3JtOiBuZ0Zvcm1EaXJlY3RpdmUsCisgICAgICAgICAgICBuZ0hpZGU6IG5nSGlkZURpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nSWY6IG5nSWZEaXJlY3RpdmUsCisgICAgICAgICAgICBuZ0luY2x1ZGU6IG5nSW5jbHVkZURpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nSW5pdDogbmdJbml0RGlyZWN0aXZlLAorICAgICAgICAgICAgbmdOb25CaW5kYWJsZTogbmdOb25CaW5kYWJsZURpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nUGx1cmFsaXplOiBuZ1BsdXJhbGl6ZURpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nUmVwZWF0OiBuZ1JlcGVhdERpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nU2hvdzogbmdTaG93RGlyZWN0aXZlLAorICAgICAgICAgICAgbmdTdHlsZTogbmdTdHlsZURpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nU3dpdGNoOiBuZ1N3aXRjaERpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nU3dpdGNoV2hlbjogbmdTd2l0Y2hXaGVuRGlyZWN0aXZlLAorICAgICAgICAgICAgbmdTd2l0Y2hEZWZhdWx0OiBuZ1N3aXRjaERlZmF1bHREaXJlY3RpdmUsCisgICAgICAgICAgICBuZ09wdGlvbnM6IG5nT3B0aW9uc0RpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nVHJhbnNjbHVkZTogbmdUcmFuc2NsdWRlRGlyZWN0aXZlLAorICAgICAgICAgICAgbmdNb2RlbDogbmdNb2RlbERpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nTGlzdDogbmdMaXN0RGlyZWN0aXZlLAorICAgICAgICAgICAgbmdDaGFuZ2U6IG5nQ2hhbmdlRGlyZWN0aXZlLAorICAgICAgICAgICAgcGF0dGVybjogcGF0dGVybkRpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nUGF0dGVybjogcGF0dGVybkRpcmVjdGl2ZSwKKyAgICAgICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZERpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nUmVxdWlyZWQ6IHJlcXVpcmVkRGlyZWN0aXZlLAorICAgICAgICAgICAgbWlubGVuZ3RoOiBtaW5sZW5ndGhEaXJlY3RpdmUsCisgICAgICAgICAgICBuZ01pbmxlbmd0aDogbWlubGVuZ3RoRGlyZWN0aXZlLAorICAgICAgICAgICAgbWF4bGVuZ3RoOiBtYXhsZW5ndGhEaXJlY3RpdmUsCisgICAgICAgICAgICBuZ01heGxlbmd0aDogbWF4bGVuZ3RoRGlyZWN0aXZlLAorICAgICAgICAgICAgbmdWYWx1ZTogbmdWYWx1ZURpcmVjdGl2ZSwKKyAgICAgICAgICAgIG5nTW9kZWxPcHRpb25zOiBuZ01vZGVsT3B0aW9uc0RpcmVjdGl2ZQorICAgICAgICB9KS4KKyAgICAgICAgZGlyZWN0aXZlKHsKKyAgICAgICAgICBuZ0luY2x1ZGU6IG5nSW5jbHVkZUZpbGxDb250ZW50RGlyZWN0aXZlCisgICAgICAgIH0pLgorICAgICAgICBkaXJlY3RpdmUobmdBdHRyaWJ1dGVBbGlhc0RpcmVjdGl2ZXMpLgorICAgICAgICBkaXJlY3RpdmUobmdFdmVudERpcmVjdGl2ZXMpOworICAgICAgJHByb3ZpZGUucHJvdmlkZXIoeworICAgICAgICAkYW5jaG9yU2Nyb2xsOiAkQW5jaG9yU2Nyb2xsUHJvdmlkZXIsCisgICAgICAgICRhbmltYXRlOiAkQW5pbWF0ZVByb3ZpZGVyLAorICAgICAgICAkYnJvd3NlcjogJEJyb3dzZXJQcm92aWRlciwKKyAgICAgICAgJGNhY2hlRmFjdG9yeTogJENhY2hlRmFjdG9yeVByb3ZpZGVyLAorICAgICAgICAkY29udHJvbGxlcjogJENvbnRyb2xsZXJQcm92aWRlciwKKyAgICAgICAgJGRvY3VtZW50OiAkRG9jdW1lbnRQcm92aWRlciwKKyAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXI6ICRFeGNlcHRpb25IYW5kbGVyUHJvdmlkZXIsCisgICAgICAgICRmaWx0ZXI6ICRGaWx0ZXJQcm92aWRlciwKKyAgICAgICAgJGludGVycG9sYXRlOiAkSW50ZXJwb2xhdGVQcm92aWRlciwKKyAgICAgICAgJGludGVydmFsOiAkSW50ZXJ2YWxQcm92aWRlciwKKyAgICAgICAgJGh0dHA6ICRIdHRwUHJvdmlkZXIsCisgICAgICAgICRodHRwQmFja2VuZDogJEh0dHBCYWNrZW5kUHJvdmlkZXIsCisgICAgICAgICRsb2NhdGlvbjogJExvY2F0aW9uUHJvdmlkZXIsCisgICAgICAgICRsb2c6ICRMb2dQcm92aWRlciwKKyAgICAgICAgJHBhcnNlOiAkUGFyc2VQcm92aWRlciwKKyAgICAgICAgJHJvb3RTY29wZTogJFJvb3RTY29wZVByb3ZpZGVyLAorICAgICAgICAkcTogJFFQcm92aWRlciwKKyAgICAgICAgJCRxOiAkJFFQcm92aWRlciwKKyAgICAgICAgJHNjZTogJFNjZVByb3ZpZGVyLAorICAgICAgICAkc2NlRGVsZWdhdGU6ICRTY2VEZWxlZ2F0ZVByb3ZpZGVyLAorICAgICAgICAkc25pZmZlcjogJFNuaWZmZXJQcm92aWRlciwKKyAgICAgICAgJHRlbXBsYXRlQ2FjaGU6ICRUZW1wbGF0ZUNhY2hlUHJvdmlkZXIsCisgICAgICAgICR0ZW1wbGF0ZVJlcXVlc3Q6ICRUZW1wbGF0ZVJlcXVlc3RQcm92aWRlciwKKyAgICAgICAgJCR0ZXN0YWJpbGl0eTogJCRUZXN0YWJpbGl0eVByb3ZpZGVyLAorICAgICAgICAkdGltZW91dDogJFRpbWVvdXRQcm92aWRlciwKKyAgICAgICAgJHdpbmRvdzogJFdpbmRvd1Byb3ZpZGVyLAorICAgICAgICAkJHJBRjogJCRSQUZQcm92aWRlciwKKyAgICAgICAgJCRhc3luY0NhbGxiYWNrOiAkJEFzeW5jQ2FsbGJhY2tQcm92aWRlciwKKyAgICAgICAgJCRqcUxpdGU6ICQkanFMaXRlUHJvdmlkZXIKKyAgICAgIH0pOworICAgIH0KKyAgXSk7Cit9CisKKy8qIGdsb2JhbCBKUUxpdGVQcm90b3R5cGU6IHRydWUsCisgIGFkZEV2ZW50TGlzdGVuZXJGbjogdHJ1ZSwKKyAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZuOiB0cnVlLAorICBCT09MRUFOX0FUVFI6IHRydWUsCisgIEFMSUFTRURfQVRUUjogdHJ1ZSwKKyovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vSlFMaXRlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogQG5nZG9jIGZ1bmN0aW9uCisgKiBAbmFtZSBhbmd1bGFyLmVsZW1lbnQKKyAqIEBtb2R1bGUgbmcKKyAqIEBraW5kIGZ1bmN0aW9uCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBXcmFwcyBhIHJhdyBET00gZWxlbWVudCBvciBIVE1MIHN0cmluZyBhcyBhIFtqUXVlcnldKGh0dHA6Ly9qcXVlcnkuY29tKSBlbGVtZW50LgorICoKKyAqIElmIGpRdWVyeSBpcyBhdmFpbGFibGUsIGBhbmd1bGFyLmVsZW1lbnRgIGlzIGFuIGFsaWFzIGZvciB0aGUKKyAqIFtqUXVlcnldKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9qUXVlcnkvKSBmdW5jdGlvbi4gSWYgalF1ZXJ5IGlzIG5vdCBhdmFpbGFibGUsIGBhbmd1bGFyLmVsZW1lbnRgCisgKiBkZWxlZ2F0ZXMgdG8gQW5ndWxhcidzIGJ1aWx0LWluIHN1YnNldCBvZiBqUXVlcnksIGNhbGxlZCAialF1ZXJ5IGxpdGUiIG9yICJqcUxpdGUuIgorICoKKyAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXN1Y2Nlc3MiPmpxTGl0ZSBpcyBhIHRpbnksIEFQSS1jb21wYXRpYmxlIHN1YnNldCBvZiBqUXVlcnkgdGhhdCBhbGxvd3MKKyAqIEFuZ3VsYXIgdG8gbWFuaXB1bGF0ZSB0aGUgRE9NIGluIGEgY3Jvc3MtYnJvd3NlciBjb21wYXRpYmxlIHdheS4gKipqcUxpdGUqKiBpbXBsZW1lbnRzIG9ubHkgdGhlIG1vc3QKKyAqIGNvbW1vbmx5IG5lZWRlZCBmdW5jdGlvbmFsaXR5IHdpdGggdGhlIGdvYWwgb2YgaGF2aW5nIGEgdmVyeSBzbWFsbCBmb290cHJpbnQuPC9kaXY+CisgKgorICogVG8gdXNlIGpRdWVyeSwgc2ltcGx5IGxvYWQgaXQgYmVmb3JlIGBET01Db250ZW50TG9hZGVkYCBldmVudCBmaXJlZC4KKyAqCisgKiA8ZGl2IGNsYXNzPSJhbGVydCI+KipOb3RlOioqIGFsbCBlbGVtZW50IHJlZmVyZW5jZXMgaW4gQW5ndWxhciBhcmUgYWx3YXlzIHdyYXBwZWQgd2l0aCBqUXVlcnkgb3IKKyAqIGpxTGl0ZTsgdGhleSBhcmUgbmV2ZXIgcmF3IERPTSByZWZlcmVuY2VzLjwvZGl2PgorICoKKyAqICMjIEFuZ3VsYXIncyBqcUxpdGUKKyAqIGpxTGl0ZSBwcm92aWRlcyBvbmx5IHRoZSBmb2xsb3dpbmcgalF1ZXJ5IG1ldGhvZHM6CisgKgorICogLSBbYGFkZENsYXNzKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vYWRkQ2xhc3MvKQorICogLSBbYGFmdGVyKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vYWZ0ZXIvKQorICogLSBbYGFwcGVuZCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2FwcGVuZC8pCisgKiAtIFtgYXR0cigpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2F0dHIvKSAtIERvZXMgbm90IHN1cHBvcnQgZnVuY3Rpb25zIGFzIHBhcmFtZXRlcnMKKyAqIC0gW2BiaW5kKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vYmluZC8pIC0gRG9lcyBub3Qgc3VwcG9ydCBuYW1lc3BhY2VzLCBzZWxlY3RvcnMgb3IgZXZlbnREYXRhCisgKiAtIFtgY2hpbGRyZW4oKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jaGlsZHJlbi8pIC0gRG9lcyBub3Qgc3VwcG9ydCBzZWxlY3RvcnMKKyAqIC0gW2BjbG9uZSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2Nsb25lLykKKyAqIC0gW2Bjb250ZW50cygpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2NvbnRlbnRzLykKKyAqIC0gW2Bjc3MoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jc3MvKSAtIE9ubHkgcmV0cmlldmVzIGlubGluZS1zdHlsZXMsIGRvZXMgbm90IGNhbGwgYGdldENvbXB1dGVkU3R5bGUoKWAKKyAqIC0gW2BkYXRhKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vZGF0YS8pCisgKiAtIFtgZGV0YWNoKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vZGV0YWNoLykKKyAqIC0gW2BlbXB0eSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2VtcHR5LykKKyAqIC0gW2BlcSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2VxLykKKyAqIC0gW2BmaW5kKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vZmluZC8pIC0gTGltaXRlZCB0byBsb29rdXBzIGJ5IHRhZyBuYW1lCisgKiAtIFtgaGFzQ2xhc3MoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9oYXNDbGFzcy8pCisgKiAtIFtgaHRtbCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2h0bWwvKQorICogLSBbYG5leHQoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9uZXh0LykgLSBEb2VzIG5vdCBzdXBwb3J0IHNlbGVjdG9ycworICogLSBbYG9uKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vb24vKSAtIERvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcywgc2VsZWN0b3JzIG9yIGV2ZW50RGF0YQorICogLSBbYG9mZigpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL29mZi8pIC0gRG9lcyBub3Qgc3VwcG9ydCBuYW1lc3BhY2VzIG9yIHNlbGVjdG9ycworICogLSBbYG9uZSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL29uZS8pIC0gRG9lcyBub3Qgc3VwcG9ydCBuYW1lc3BhY2VzIG9yIHNlbGVjdG9ycworICogLSBbYHBhcmVudCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3BhcmVudC8pIC0gRG9lcyBub3Qgc3VwcG9ydCBzZWxlY3RvcnMKKyAqIC0gW2BwcmVwZW5kKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcHJlcGVuZC8pCisgKiAtIFtgcHJvcCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3Byb3AvKQorICogLSBbYHJlYWR5KClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVhZHkvKQorICogLSBbYHJlbW92ZSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3JlbW92ZS8pCisgKiAtIFtgcmVtb3ZlQXR0cigpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3JlbW92ZUF0dHIvKQorICogLSBbYHJlbW92ZUNsYXNzKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVtb3ZlQ2xhc3MvKQorICogLSBbYHJlbW92ZURhdGEoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9yZW1vdmVEYXRhLykKKyAqIC0gW2ByZXBsYWNlV2l0aCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3JlcGxhY2VXaXRoLykKKyAqIC0gW2B0ZXh0KClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vdGV4dC8pCisgKiAtIFtgdG9nZ2xlQ2xhc3MoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS90b2dnbGVDbGFzcy8pCisgKiAtIFtgdHJpZ2dlckhhbmRsZXIoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS90cmlnZ2VySGFuZGxlci8pIC0gUGFzc2VzIGEgZHVtbXkgZXZlbnQgb2JqZWN0IHRvIGhhbmRsZXJzLgorICogLSBbYHVuYmluZCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3VuYmluZC8pIC0gRG9lcyBub3Qgc3VwcG9ydCBuYW1lc3BhY2VzCisgKiAtIFtgdmFsKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vdmFsLykKKyAqIC0gW2B3cmFwKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vd3JhcC8pCisgKgorICogIyMgalF1ZXJ5L2pxTGl0ZSBFeHRyYXMKKyAqIEFuZ3VsYXIgYWxzbyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgbWV0aG9kcyBhbmQgZXZlbnRzIHRvIGJvdGggalF1ZXJ5IGFuZCBqcUxpdGU6CisgKgorICogIyMjIEV2ZW50cworICogLSBgJGRlc3Ryb3lgIC0gQW5ndWxhckpTIGludGVyY2VwdHMgYWxsIGpxTGl0ZS9qUXVlcnkncyBET00gZGVzdHJ1Y3Rpb24gYXBpcyBhbmQgZmlyZXMgdGhpcyBldmVudAorICogICAgb24gYWxsIERPTSBub2RlcyBiZWluZyByZW1vdmVkLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBjbGVhbiB1cCBhbnkgM3JkIHBhcnR5IGJpbmRpbmdzIHRvIHRoZSBET00KKyAqICAgIGVsZW1lbnQgYmVmb3JlIGl0IGlzIHJlbW92ZWQuCisgKgorICogIyMjIE1ldGhvZHMKKyAqIC0gYGNvbnRyb2xsZXIobmFtZSlgIC0gcmV0cmlldmVzIHRoZSBjb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgb3IgaXRzIHBhcmVudC4gQnkgZGVmYXVsdAorICogICByZXRyaWV2ZXMgY29udHJvbGxlciBhc3NvY2lhdGVkIHdpdGggdGhlIGBuZ0NvbnRyb2xsZXJgIGRpcmVjdGl2ZS4gSWYgYG5hbWVgIGlzIHByb3ZpZGVkIGFzCisgKiAgIGNhbWVsQ2FzZSBkaXJlY3RpdmUgbmFtZSwgdGhlbiB0aGUgY29udHJvbGxlciBmb3IgdGhpcyBkaXJlY3RpdmUgd2lsbCBiZSByZXRyaWV2ZWQgKGUuZy4KKyAqICAgYCduZ01vZGVsJ2ApLgorICogLSBgaW5qZWN0b3IoKWAgLSByZXRyaWV2ZXMgdGhlIGluamVjdG9yIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgb3IgaXRzIHBhcmVudC4KKyAqIC0gYHNjb3BlKClgIC0gcmV0cmlldmVzIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBzY29wZX0gb2YgdGhlIGN1cnJlbnQKKyAqICAgZWxlbWVudCBvciBpdHMgcGFyZW50LiBSZXF1aXJlcyB7QGxpbmsgZ3VpZGUvcHJvZHVjdGlvbiNkaXNhYmxpbmctZGVidWctZGF0YSBEZWJ1ZyBEYXRhfSB0bworICogICBiZSBlbmFibGVkLgorICogLSBgaXNvbGF0ZVNjb3BlKClgIC0gcmV0cmlldmVzIGFuIGlzb2xhdGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUgc2NvcGV9IGlmIG9uZSBpcyBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUKKyAqICAgY3VycmVudCBlbGVtZW50LiBUaGlzIGdldHRlciBzaG91bGQgYmUgdXNlZCBvbmx5IG9uIGVsZW1lbnRzIHRoYXQgY29udGFpbiBhIGRpcmVjdGl2ZSB3aGljaCBzdGFydHMgYSBuZXcgaXNvbGF0ZQorICogICBzY29wZS4gQ2FsbGluZyBgc2NvcGUoKWAgb24gdGhpcyBlbGVtZW50IGFsd2F5cyByZXR1cm5zIHRoZSBvcmlnaW5hbCBub24taXNvbGF0ZSBzY29wZS4KKyAqICAgUmVxdWlyZXMge0BsaW5rIGd1aWRlL3Byb2R1Y3Rpb24jZGlzYWJsaW5nLWRlYnVnLWRhdGEgRGVidWcgRGF0YX0gdG8gYmUgZW5hYmxlZC4KKyAqIC0gYGluaGVyaXRlZERhdGEoKWAgLSBzYW1lIGFzIGBkYXRhKClgLCBidXQgd2Fsa3MgdXAgdGhlIERPTSB1bnRpbCBhIHZhbHVlIGlzIGZvdW5kIG9yIHRoZSB0b3AKKyAqICAgcGFyZW50IGVsZW1lbnQgaXMgcmVhY2hlZC4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ3xET01FbGVtZW50fSBlbGVtZW50IEhUTUwgc3RyaW5nIG9yIERPTUVsZW1lbnQgdG8gYmUgd3JhcHBlZCBpbnRvIGpRdWVyeS4KKyAqIEByZXR1cm5zIHtPYmplY3R9IGpRdWVyeSBvYmplY3QuCisgKi8KKworSlFMaXRlLmV4cGFuZG8gPSAnbmczMzknOworCit2YXIganFDYWNoZSA9IEpRTGl0ZS5jYWNoZSA9IHt9LAorICAgIGpxSWQgPSAxLAorICAgIGFkZEV2ZW50TGlzdGVuZXJGbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIHR5cGUsIGZuKSB7CisgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZm4sIGZhbHNlKTsKKyAgICB9LAorICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJGbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIHR5cGUsIGZuKSB7CisgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZm4sIGZhbHNlKTsKKyAgICB9OworCisvKgorICogISEhIFRoaXMgaXMgYW4gdW5kb2N1bWVudGVkICJwcml2YXRlIiBmdW5jdGlvbiAhISEKKyAqLworSlFMaXRlLl9kYXRhID0gZnVuY3Rpb24obm9kZSkgeworICAvL2pRdWVyeSBhbHdheXMgcmV0dXJucyBhbiBvYmplY3Qgb24gY2FjaGUgbWlzcworICByZXR1cm4gdGhpcy5jYWNoZVtub2RlW3RoaXMuZXhwYW5kb11dIHx8IHt9OworfTsKKworZnVuY3Rpb24ganFOZXh0SWQoKSB7IHJldHVybiArK2pxSWQ7IH0KKworCit2YXIgU1BFQ0lBTF9DSEFSU19SRUdFWFAgPSAvKFtcOlwtXF9dKyguKSkvZzsKK3ZhciBNT1pfSEFDS19SRUdFWFAgPSAvXm1veihbQS1aXSkvOwordmFyIE1PVVNFX0VWRU5UX01BUD0geyBtb3VzZWxlYXZlOiAibW91c2VvdXQiLCBtb3VzZWVudGVyOiAibW91c2VvdmVyIn07Cit2YXIganFMaXRlTWluRXJyID0gbWluRXJyKCdqcUxpdGUnKTsKKworLyoqCisgKiBDb252ZXJ0cyBzbmFrZV9jYXNlIHRvIGNhbWVsQ2FzZS4KKyAqIEFsc28gdGhlcmUgaXMgc3BlY2lhbCBjYXNlIGZvciBNb3ogcHJlZml4IHN0YXJ0aW5nIHdpdGggdXBwZXIgY2FzZSBsZXR0ZXIuCisgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIG5vcm1hbGl6ZQorICovCitmdW5jdGlvbiBjYW1lbENhc2UobmFtZSkgeworICByZXR1cm4gbmFtZS4KKyAgICByZXBsYWNlKFNQRUNJQUxfQ0hBUlNfUkVHRVhQLCBmdW5jdGlvbihfLCBzZXBhcmF0b3IsIGxldHRlciwgb2Zmc2V0KSB7CisgICAgICByZXR1cm4gb2Zmc2V0ID8gbGV0dGVyLnRvVXBwZXJDYXNlKCkgOiBsZXR0ZXI7CisgICAgfSkuCisgICAgcmVwbGFjZShNT1pfSEFDS19SRUdFWFAsICdNb3okMScpOworfQorCit2YXIgU0lOR0xFX1RBR19SRUdFWFAgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvOwordmFyIEhUTUxfUkVHRVhQID0gLzx8JiM/XHcrOy87Cit2YXIgVEFHX05BTUVfUkVHRVhQID0gLzwoW1x3Ol0rKS87Cit2YXIgWEhUTUxfVEFHX1JFR0VYUCA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2k7CisKK3ZhciB3cmFwTWFwID0geworICAnb3B0aW9uJzogWzEsICc8c2VsZWN0IG11bHRpcGxlPSJtdWx0aXBsZSI+JywgJzwvc2VsZWN0PiddLAorCisgICd0aGVhZCc6IFsxLCAnPHRhYmxlPicsICc8L3RhYmxlPiddLAorICAnY29sJzogWzIsICc8dGFibGU+PGNvbGdyb3VwPicsICc8L2NvbGdyb3VwPjwvdGFibGU+J10sCisgICd0cic6IFsyLCAnPHRhYmxlPjx0Ym9keT4nLCAnPC90Ym9keT48L3RhYmxlPiddLAorICAndGQnOiBbMywgJzx0YWJsZT48dGJvZHk+PHRyPicsICc8L3RyPjwvdGJvZHk+PC90YWJsZT4nXSwKKyAgJ19kZWZhdWx0JzogWzAsICIiLCAiIl0KK307CisKK3dyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjsKK3dyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7Cit3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKKworCitmdW5jdGlvbiBqcUxpdGVJc1RleHROb2RlKGh0bWwpIHsKKyAgcmV0dXJuICFIVE1MX1JFR0VYUC50ZXN0KGh0bWwpOworfQorCitmdW5jdGlvbiBqcUxpdGVBY2NlcHRzRGF0YShub2RlKSB7CisgIC8vIFRoZSB3aW5kb3cgb2JqZWN0IGNhbiBhY2NlcHQgZGF0YSBidXQgaGFzIG5vIG5vZGVUeXBlCisgIC8vIE90aGVyd2lzZSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGVsZW1lbnRzICgxKSBhbmQgZG9jdW1lbnRzICg5KQorICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlOworICByZXR1cm4gbm9kZVR5cGUgPT09IE5PREVfVFlQRV9FTEVNRU5UIHx8ICFub2RlVHlwZSB8fCBub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0RPQ1VNRU5UOworfQorCitmdW5jdGlvbiBqcUxpdGVCdWlsZEZyYWdtZW50KGh0bWwsIGNvbnRleHQpIHsKKyAgdmFyIHRtcCwgdGFnLCB3cmFwLAorICAgICAgZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKKyAgICAgIG5vZGVzID0gW10sIGk7CisKKyAgaWYgKGpxTGl0ZUlzVGV4dE5vZGUoaHRtbCkpIHsKKyAgICAvLyBDb252ZXJ0IG5vbi1odG1sIGludG8gYSB0ZXh0IG5vZGUKKyAgICBub2Rlcy5wdXNoKGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoaHRtbCkpOworICB9IGVsc2UgeworICAgIC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2RlcworICAgIHRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZChjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTsKKyAgICB0YWcgPSAoVEFHX05BTUVfUkVHRVhQLmV4ZWMoaHRtbCkgfHwgWyIiLCAiIl0pWzFdLnRvTG93ZXJDYXNlKCk7CisgICAgd3JhcCA9IHdyYXBNYXBbdGFnXSB8fCB3cmFwTWFwLl9kZWZhdWx0OworICAgIHRtcC5pbm5lckhUTUwgPSB3cmFwWzFdICsgaHRtbC5yZXBsYWNlKFhIVE1MX1RBR19SRUdFWFAsICI8JDE+PC8kMj4iKSArIHdyYXBbMl07CisKKyAgICAvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnQKKyAgICBpID0gd3JhcFswXTsKKyAgICB3aGlsZSAoaS0tKSB7CisgICAgICB0bXAgPSB0bXAubGFzdENoaWxkOworICAgIH0KKworICAgIG5vZGVzID0gY29uY2F0KG5vZGVzLCB0bXAuY2hpbGROb2Rlcyk7CisKKyAgICB0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkOworICAgIHRtcC50ZXh0Q29udGVudCA9ICIiOworICB9CisKKyAgLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAorICBmcmFnbWVudC50ZXh0Q29udGVudCA9ICIiOworICBmcmFnbWVudC5pbm5lckhUTUwgPSAiIjsgLy8gQ2xlYXIgaW5uZXIgSFRNTAorICBmb3JFYWNoKG5vZGVzLCBmdW5jdGlvbihub2RlKSB7CisgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSk7CisgIH0pOworCisgIHJldHVybiBmcmFnbWVudDsKK30KKworZnVuY3Rpb24ganFMaXRlUGFyc2VIVE1MKGh0bWwsIGNvbnRleHQpIHsKKyAgY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CisgIHZhciBwYXJzZWQ7CisKKyAgaWYgKChwYXJzZWQgPSBTSU5HTEVfVEFHX1JFR0VYUC5leGVjKGh0bWwpKSkgeworICAgIHJldHVybiBbY29udGV4dC5jcmVhdGVFbGVtZW50KHBhcnNlZFsxXSldOworICB9CisKKyAgaWYgKChwYXJzZWQgPSBqcUxpdGVCdWlsZEZyYWdtZW50KGh0bWwsIGNvbnRleHQpKSkgeworICAgIHJldHVybiBwYXJzZWQuY2hpbGROb2RlczsKKyAgfQorCisgIHJldHVybiBbXTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitmdW5jdGlvbiBKUUxpdGUoZWxlbWVudCkgeworICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEpRTGl0ZSkgeworICAgIHJldHVybiBlbGVtZW50OworICB9CisKKyAgdmFyIGFyZ0lzU3RyaW5nOworCisgIGlmIChpc1N0cmluZyhlbGVtZW50KSkgeworICAgIGVsZW1lbnQgPSB0cmltKGVsZW1lbnQpOworICAgIGFyZ0lzU3RyaW5nID0gdHJ1ZTsKKyAgfQorICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSlFMaXRlKSkgeworICAgIGlmIChhcmdJc1N0cmluZyAmJiBlbGVtZW50LmNoYXJBdCgwKSAhPSAnPCcpIHsKKyAgICAgIHRocm93IGpxTGl0ZU1pbkVycignbm9zZWwnLCAnTG9va2luZyB1cCBlbGVtZW50cyB2aWEgc2VsZWN0b3JzIGlzIG5vdCBzdXBwb3J0ZWQgYnkganFMaXRlISBTZWU6IGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL2FuZ3VsYXIuZWxlbWVudCcpOworICAgIH0KKyAgICByZXR1cm4gbmV3IEpRTGl0ZShlbGVtZW50KTsKKyAgfQorCisgIGlmIChhcmdJc1N0cmluZykgeworICAgIGpxTGl0ZUFkZE5vZGVzKHRoaXMsIGpxTGl0ZVBhcnNlSFRNTChlbGVtZW50KSk7CisgIH0gZWxzZSB7CisgICAganFMaXRlQWRkTm9kZXModGhpcywgZWxlbWVudCk7CisgIH0KK30KKworZnVuY3Rpb24ganFMaXRlQ2xvbmUoZWxlbWVudCkgeworICByZXR1cm4gZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7Cit9CisKK2Z1bmN0aW9uIGpxTGl0ZURlYWxvYyhlbGVtZW50LCBvbmx5RGVzY2VuZGFudHMpIHsKKyAgaWYgKCFvbmx5RGVzY2VuZGFudHMpIGpxTGl0ZVJlbW92ZURhdGEoZWxlbWVudCk7CisKKyAgaWYgKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCkgeworICAgIHZhciBkZXNjZW5kYW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpOworICAgIGZvciAodmFyIGkgPSAwLCBsID0gZGVzY2VuZGFudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CisgICAgICBqcUxpdGVSZW1vdmVEYXRhKGRlc2NlbmRhbnRzW2ldKTsKKyAgICB9CisgIH0KK30KKworZnVuY3Rpb24ganFMaXRlT2ZmKGVsZW1lbnQsIHR5cGUsIGZuLCB1bnN1cHBvcnRlZCkgeworICBpZiAoaXNEZWZpbmVkKHVuc3VwcG9ydGVkKSkgdGhyb3cganFMaXRlTWluRXJyKCdvZmZhcmdzJywgJ2pxTGl0ZSNvZmYoKSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgc2VsZWN0b3JgIGFyZ3VtZW50Jyk7CisKKyAgdmFyIGV4cGFuZG9TdG9yZSA9IGpxTGl0ZUV4cGFuZG9TdG9yZShlbGVtZW50KTsKKyAgdmFyIGV2ZW50cyA9IGV4cGFuZG9TdG9yZSAmJiBleHBhbmRvU3RvcmUuZXZlbnRzOworICB2YXIgaGFuZGxlID0gZXhwYW5kb1N0b3JlICYmIGV4cGFuZG9TdG9yZS5oYW5kbGU7CisKKyAgaWYgKCFoYW5kbGUpIHJldHVybjsgLy9ubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZAorCisgIGlmICghdHlwZSkgeworICAgIGZvciAodHlwZSBpbiBldmVudHMpIHsKKyAgICAgIGlmICh0eXBlICE9PSAnJGRlc3Ryb3knKSB7CisgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJGbihlbGVtZW50LCB0eXBlLCBoYW5kbGUpOworICAgICAgfQorICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yRWFjaCh0eXBlLnNwbGl0KCcgJyksIGZ1bmN0aW9uKHR5cGUpIHsKKyAgICAgIGlmIChpc0RlZmluZWQoZm4pKSB7CisgICAgICAgIHZhciBsaXN0ZW5lckZucyA9IGV2ZW50c1t0eXBlXTsKKyAgICAgICAgYXJyYXlSZW1vdmUobGlzdGVuZXJGbnMgfHwgW10sIGZuKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyRm5zICYmIGxpc3RlbmVyRm5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZuKGVsZW1lbnQsIHR5cGUsIGhhbmRsZSk7CisgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdOworICAgIH0pOworICB9Cit9CisKK2Z1bmN0aW9uIGpxTGl0ZVJlbW92ZURhdGEoZWxlbWVudCwgbmFtZSkgeworICB2YXIgZXhwYW5kb0lkID0gZWxlbWVudC5uZzMzOTsKKyAgdmFyIGV4cGFuZG9TdG9yZSA9IGV4cGFuZG9JZCAmJiBqcUNhY2hlW2V4cGFuZG9JZF07CisKKyAgaWYgKGV4cGFuZG9TdG9yZSkgeworICAgIGlmIChuYW1lKSB7CisgICAgICBkZWxldGUgZXhwYW5kb1N0b3JlLmRhdGFbbmFtZV07CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGV4cGFuZG9TdG9yZS5oYW5kbGUpIHsKKyAgICAgIGlmIChleHBhbmRvU3RvcmUuZXZlbnRzLiRkZXN0cm95KSB7CisgICAgICAgIGV4cGFuZG9TdG9yZS5oYW5kbGUoe30sICckZGVzdHJveScpOworICAgICAgfQorICAgICAganFMaXRlT2ZmKGVsZW1lbnQpOworICAgIH0KKyAgICBkZWxldGUganFDYWNoZVtleHBhbmRvSWRdOworICAgIGVsZW1lbnQubmczMzkgPSB1bmRlZmluZWQ7IC8vIGRvbid0IGRlbGV0ZSBET00gZXhwYW5kb3MuIElFIGFuZCBDaHJvbWUgZG9uJ3QgbGlrZSBpdAorICB9Cit9CisKKworZnVuY3Rpb24ganFMaXRlRXhwYW5kb1N0b3JlKGVsZW1lbnQsIGNyZWF0ZUlmTmVjZXNzYXJ5KSB7CisgIHZhciBleHBhbmRvSWQgPSBlbGVtZW50Lm5nMzM5LAorICAgICAgZXhwYW5kb1N0b3JlID0gZXhwYW5kb0lkICYmIGpxQ2FjaGVbZXhwYW5kb0lkXTsKKworICBpZiAoY3JlYXRlSWZOZWNlc3NhcnkgJiYgIWV4cGFuZG9TdG9yZSkgeworICAgIGVsZW1lbnQubmczMzkgPSBleHBhbmRvSWQgPSBqcU5leHRJZCgpOworICAgIGV4cGFuZG9TdG9yZSA9IGpxQ2FjaGVbZXhwYW5kb0lkXSA9IHtldmVudHM6IHt9LCBkYXRhOiB7fSwgaGFuZGxlOiB1bmRlZmluZWR9OworICB9CisKKyAgcmV0dXJuIGV4cGFuZG9TdG9yZTsKK30KKworCitmdW5jdGlvbiBqcUxpdGVEYXRhKGVsZW1lbnQsIGtleSwgdmFsdWUpIHsKKyAgaWYgKGpxTGl0ZUFjY2VwdHNEYXRhKGVsZW1lbnQpKSB7CisKKyAgICB2YXIgaXNTaW1wbGVTZXR0ZXIgPSBpc0RlZmluZWQodmFsdWUpOworICAgIHZhciBpc1NpbXBsZUdldHRlciA9ICFpc1NpbXBsZVNldHRlciAmJiBrZXkgJiYgIWlzT2JqZWN0KGtleSk7CisgICAgdmFyIG1hc3NHZXR0ZXIgPSAha2V5OworICAgIHZhciBleHBhbmRvU3RvcmUgPSBqcUxpdGVFeHBhbmRvU3RvcmUoZWxlbWVudCwgIWlzU2ltcGxlR2V0dGVyKTsKKyAgICB2YXIgZGF0YSA9IGV4cGFuZG9TdG9yZSAmJiBleHBhbmRvU3RvcmUuZGF0YTsKKworICAgIGlmIChpc1NpbXBsZVNldHRlcikgeyAvLyBkYXRhKCdrZXknLCB2YWx1ZSkKKyAgICAgIGRhdGFba2V5XSA9IHZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobWFzc0dldHRlcikgeyAgLy8gZGF0YSgpCisgICAgICAgIHJldHVybiBkYXRhOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlzU2ltcGxlR2V0dGVyKSB7IC8vIGRhdGEoJ2tleScpCisgICAgICAgICAgLy8gZG9uJ3QgZm9yY2UgY3JlYXRpb24gb2YgZXhwYW5kb1N0b3JlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0CisgICAgICAgICAgcmV0dXJuIGRhdGEgJiYgZGF0YVtrZXldOworICAgICAgICB9IGVsc2UgeyAvLyBtYXNzLXNldHRlcjogZGF0YSh7a2V5MTogdmFsMSwga2V5MjogdmFsMn0pCisgICAgICAgICAgZXh0ZW5kKGRhdGEsIGtleSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworZnVuY3Rpb24ganFMaXRlSGFzQ2xhc3MoZWxlbWVudCwgc2VsZWN0b3IpIHsKKyAgaWYgKCFlbGVtZW50LmdldEF0dHJpYnV0ZSkgcmV0dXJuIGZhbHNlOworICByZXR1cm4gKCgiICIgKyAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgIiAiKS5yZXBsYWNlKC9bXG5cdF0vZywgIiAiKS4KKyAgICAgIGluZGV4T2YoIiAiICsgc2VsZWN0b3IgKyAiICIpID4gLTEpOworfQorCitmdW5jdGlvbiBqcUxpdGVSZW1vdmVDbGFzcyhlbGVtZW50LCBjc3NDbGFzc2VzKSB7CisgIGlmIChjc3NDbGFzc2VzICYmIGVsZW1lbnQuc2V0QXR0cmlidXRlKSB7CisgICAgZm9yRWFjaChjc3NDbGFzc2VzLnNwbGl0KCcgJyksIGZ1bmN0aW9uKGNzc0NsYXNzKSB7CisgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCB0cmltKAorICAgICAgICAgICgiICIgKyAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgIiAiKQorICAgICAgICAgIC5yZXBsYWNlKC9bXG5cdF0vZywgIiAiKQorICAgICAgICAgIC5yZXBsYWNlKCIgIiArIHRyaW0oY3NzQ2xhc3MpICsgIiAiLCAiICIpKQorICAgICAgKTsKKyAgICB9KTsKKyAgfQorfQorCitmdW5jdGlvbiBqcUxpdGVBZGRDbGFzcyhlbGVtZW50LCBjc3NDbGFzc2VzKSB7CisgIGlmIChjc3NDbGFzc2VzICYmIGVsZW1lbnQuc2V0QXR0cmlidXRlKSB7CisgICAgdmFyIGV4aXN0aW5nQ2xhc3NlcyA9ICgnICcgKyAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgJyAnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXG5cdF0vZywgIiAiKTsKKworICAgIGZvckVhY2goY3NzQ2xhc3Nlcy5zcGxpdCgnICcpLCBmdW5jdGlvbihjc3NDbGFzcykgeworICAgICAgY3NzQ2xhc3MgPSB0cmltKGNzc0NsYXNzKTsKKyAgICAgIGlmIChleGlzdGluZ0NsYXNzZXMuaW5kZXhPZignICcgKyBjc3NDbGFzcyArICcgJykgPT09IC0xKSB7CisgICAgICAgIGV4aXN0aW5nQ2xhc3NlcyArPSBjc3NDbGFzcyArICcgJzsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIHRyaW0oZXhpc3RpbmdDbGFzc2VzKSk7CisgIH0KK30KKworCitmdW5jdGlvbiBqcUxpdGVBZGROb2Rlcyhyb290LCBlbGVtZW50cykgeworICAvLyBUSElTIENPREUgSVMgVkVSWSBIT1QuIERvbid0IG1ha2UgY2hhbmdlcyB3aXRob3V0IGJlbmNobWFya2luZy4KKworICBpZiAoZWxlbWVudHMpIHsKKworICAgIC8vIGlmIGEgTm9kZSAodGhlIG1vc3QgY29tbW9uIGNhc2UpCisgICAgaWYgKGVsZW1lbnRzLm5vZGVUeXBlKSB7CisgICAgICByb290W3Jvb3QubGVuZ3RoKytdID0gZWxlbWVudHM7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7CisKKyAgICAgIC8vIGlmIGFuIEFycmF5IG9yIE5vZGVMaXN0IGFuZCBub3QgYSBXaW5kb3cKKyAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJyAmJiBlbGVtZW50cy53aW5kb3cgIT09IGVsZW1lbnRzKSB7CisgICAgICAgIGlmIChsZW5ndGgpIHsKKyAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByb290W3Jvb3QubGVuZ3RoKytdID0gZWxlbWVudHNbaV07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByb290W3Jvb3QubGVuZ3RoKytdID0gZWxlbWVudHM7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworZnVuY3Rpb24ganFMaXRlQ29udHJvbGxlcihlbGVtZW50LCBuYW1lKSB7CisgIHJldHVybiBqcUxpdGVJbmhlcml0ZWREYXRhKGVsZW1lbnQsICckJyArIChuYW1lIHx8ICduZ0NvbnRyb2xsZXInKSArICdDb250cm9sbGVyJyk7Cit9CisKK2Z1bmN0aW9uIGpxTGl0ZUluaGVyaXRlZERhdGEoZWxlbWVudCwgbmFtZSwgdmFsdWUpIHsKKyAgLy8gaWYgZWxlbWVudCBpcyB0aGUgZG9jdW1lbnQgb2JqZWN0IHdvcmsgd2l0aCB0aGUgaHRtbCBlbGVtZW50IGluc3RlYWQKKyAgLy8gdGhpcyBtYWtlcyAkKGRvY3VtZW50KS5zY29wZSgpIHBvc3NpYmxlCisgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09IE5PREVfVFlQRV9ET0NVTUVOVCkgeworICAgIGVsZW1lbnQgPSBlbGVtZW50LmRvY3VtZW50RWxlbWVudDsKKyAgfQorICB2YXIgbmFtZXMgPSBpc0FycmF5KG5hbWUpID8gbmFtZSA6IFtuYW1lXTsKKworICB3aGlsZSAoZWxlbWVudCkgeworICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG5hbWVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGlmICgodmFsdWUgPSBqcUxpdGUuZGF0YShlbGVtZW50LCBuYW1lc1tpXSkpICE9PSB1bmRlZmluZWQpIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBJZiBkZWFsaW5nIHdpdGggYSBkb2N1bWVudCBmcmFnbWVudCBub2RlIHdpdGggYSBob3N0IGVsZW1lbnQsIGFuZCBubyBwYXJlbnQsIHVzZSB0aGUgaG9zdAorICAgIC8vIGVsZW1lbnQgYXMgdGhlIHBhcmVudC4gVGhpcyBlbmFibGVzIGRpcmVjdGl2ZXMgd2l0aGluIGEgU2hhZG93IERPTSBvciBwb2x5ZmlsbGVkIFNoYWRvdyBET00KKyAgICAvLyB0byBsb29rdXAgcGFyZW50IGNvbnRyb2xsZXJzLgorICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgfHwgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5PREVfVFlQRV9ET0NVTUVOVF9GUkFHTUVOVCAmJiBlbGVtZW50Lmhvc3QpOworICB9Cit9CisKK2Z1bmN0aW9uIGpxTGl0ZUVtcHR5KGVsZW1lbnQpIHsKKyAganFMaXRlRGVhbG9jKGVsZW1lbnQsIHRydWUpOworICB3aGlsZSAoZWxlbWVudC5maXJzdENoaWxkKSB7CisgICAgZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpOworICB9Cit9CisKK2Z1bmN0aW9uIGpxTGl0ZVJlbW92ZShlbGVtZW50LCBrZWVwRGF0YSkgeworICBpZiAoIWtlZXBEYXRhKSBqcUxpdGVEZWFsb2MoZWxlbWVudCk7CisgIHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7CisgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZChlbGVtZW50KTsKK30KKworCitmdW5jdGlvbiBqcUxpdGVEb2N1bWVudExvYWRlZChhY3Rpb24sIHdpbikgeworICB3aW4gPSB3aW4gfHwgd2luZG93OworICBpZiAod2luLmRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsKKyAgICAvLyBGb3JjZSB0aGUgYWN0aW9uIHRvIGJlIHJ1biBhc3luYyBmb3IgY29uc2lzdGVudCBiZWhhdmlvdXIKKyAgICAvLyBmcm9tIHRoZSBhY3Rpb24ncyBwb2ludCBvZiB2aWV3CisgICAgLy8gaS5lLiBpdCB3aWxsIGRlZmluaXRlbHkgbm90IGJlIGluIGEgJGFwcGx5CisgICAgd2luLnNldFRpbWVvdXQoYWN0aW9uKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBObyBuZWVkIHRvIHVuYmluZCB0aGlzIGhhbmRsZXIgYXMgbG9hZCBpcyBvbmx5IGV2ZXIgY2FsbGVkIG9uY2UKKyAgICBqcUxpdGUod2luKS5vbignbG9hZCcsIGFjdGlvbik7CisgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGdW5jdGlvbnMgd2hpY2ggYXJlIGRlY2xhcmVkIGRpcmVjdGx5LgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit2YXIgSlFMaXRlUHJvdG90eXBlID0gSlFMaXRlLnByb3RvdHlwZSA9IHsKKyAgcmVhZHk6IGZ1bmN0aW9uKGZuKSB7CisgICAgdmFyIGZpcmVkID0gZmFsc2U7CisKKyAgICBmdW5jdGlvbiB0cmlnZ2VyKCkgeworICAgICAgaWYgKGZpcmVkKSByZXR1cm47CisgICAgICBmaXJlZCA9IHRydWU7CisgICAgICBmbigpOworICAgIH0KKworICAgIC8vIGNoZWNrIGlmIGRvY3VtZW50IGlzIGFscmVhZHkgbG9hZGVkCisgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsKKyAgICAgIHNldFRpbWVvdXQodHJpZ2dlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMub24oJ0RPTUNvbnRlbnRMb2FkZWQnLCB0cmlnZ2VyKTsgLy8gd29ya3MgZm9yIG1vZGVybiBicm93c2VycyBhbmQgSUU5CisgICAgICAvLyB3ZSBjYW4gbm90IHVzZSBqcUxpdGUgc2luY2Ugd2UgYXJlIG5vdCBkb25lIGxvYWRpbmcgYW5kIGpRdWVyeSBjb3VsZCBiZSBsb2FkZWQgbGF0ZXIuCisgICAgICAvLyBqc2hpbnQgLVcwNjQKKyAgICAgIEpRTGl0ZSh3aW5kb3cpLm9uKCdsb2FkJywgdHJpZ2dlcik7IC8vIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQgZm9yIG90aGVycworICAgICAgLy8ganNoaW50ICtXMDY0CisgICAgfQorICB9LAorICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgdmFyIHZhbHVlID0gW107CisgICAgZm9yRWFjaCh0aGlzLCBmdW5jdGlvbihlKSB7IHZhbHVlLnB1c2goJycgKyBlKTt9KTsKKyAgICByZXR1cm4gJ1snICsgdmFsdWUuam9pbignLCAnKSArICddJzsKKyAgfSwKKworICBlcTogZnVuY3Rpb24oaW5kZXgpIHsKKyAgICAgIHJldHVybiAoaW5kZXggPj0gMCkgPyBqcUxpdGUodGhpc1tpbmRleF0pIDoganFMaXRlKHRoaXNbdGhpcy5sZW5ndGggKyBpbmRleF0pOworICB9LAorCisgIGxlbmd0aDogMCwKKyAgcHVzaDogcHVzaCwKKyAgc29ydDogW10uc29ydCwKKyAgc3BsaWNlOiBbXS5zcGxpY2UKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRnVuY3Rpb25zIGl0ZXJhdGluZyBnZXR0ZXIvc2V0dGVycy4KKy8vIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gc2VsZiBvbiBzZXR0ZXIgYW5kCisvLyB2YWx1ZSBvbiBnZXQuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3ZhciBCT09MRUFOX0FUVFIgPSB7fTsKK2ZvckVhY2goJ211bHRpcGxlLHNlbGVjdGVkLGNoZWNrZWQsZGlzYWJsZWQscmVhZE9ubHkscmVxdWlyZWQsb3Blbicuc3BsaXQoJywnKSwgZnVuY3Rpb24odmFsdWUpIHsKKyAgQk9PTEVBTl9BVFRSW2xvd2VyY2FzZSh2YWx1ZSldID0gdmFsdWU7Cit9KTsKK3ZhciBCT09MRUFOX0VMRU1FTlRTID0ge307Citmb3JFYWNoKCdpbnB1dCxzZWxlY3Qsb3B0aW9uLHRleHRhcmVhLGJ1dHRvbixmb3JtLGRldGFpbHMnLnNwbGl0KCcsJyksIGZ1bmN0aW9uKHZhbHVlKSB7CisgIEJPT0xFQU5fRUxFTUVOVFNbdmFsdWVdID0gdHJ1ZTsKK30pOwordmFyIEFMSUFTRURfQVRUUiA9IHsKKyAgJ25nTWlubGVuZ3RoJzogJ21pbmxlbmd0aCcsCisgICduZ01heGxlbmd0aCc6ICdtYXhsZW5ndGgnLAorICAnbmdNaW4nOiAnbWluJywKKyAgJ25nTWF4JzogJ21heCcsCisgICduZ1BhdHRlcm4nOiAncGF0dGVybicKK307CisKK2Z1bmN0aW9uIGdldEJvb2xlYW5BdHRyTmFtZShlbGVtZW50LCBuYW1lKSB7CisgIC8vIGNoZWNrIGRvbSBsYXN0IHNpbmNlIHdlIHdpbGwgbW9zdCBsaWtlbHkgZmFpbCBvbiBuYW1lCisgIHZhciBib29sZWFuQXR0ciA9IEJPT0xFQU5fQVRUUltuYW1lLnRvTG93ZXJDYXNlKCldOworCisgIC8vIGJvb2xlYW5BdHRyIGlzIGhlcmUgdHdpY2UgdG8gbWluaW1pemUgRE9NIGFjY2VzcworICByZXR1cm4gYm9vbGVhbkF0dHIgJiYgQk9PTEVBTl9FTEVNRU5UU1tub2RlTmFtZV8oZWxlbWVudCldICYmIGJvb2xlYW5BdHRyOworfQorCitmdW5jdGlvbiBnZXRBbGlhc2VkQXR0ck5hbWUoZWxlbWVudCwgbmFtZSkgeworICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lOworICByZXR1cm4gKG5vZGVOYW1lID09PSAnSU5QVVQnIHx8IG5vZGVOYW1lID09PSAnVEVYVEFSRUEnKSAmJiBBTElBU0VEX0FUVFJbbmFtZV07Cit9CisKK2ZvckVhY2goeworICBkYXRhOiBqcUxpdGVEYXRhLAorICByZW1vdmVEYXRhOiBqcUxpdGVSZW1vdmVEYXRhCit9LCBmdW5jdGlvbihmbiwgbmFtZSkgeworICBKUUxpdGVbbmFtZV0gPSBmbjsKK30pOworCitmb3JFYWNoKHsKKyAgZGF0YToganFMaXRlRGF0YSwKKyAgaW5oZXJpdGVkRGF0YToganFMaXRlSW5oZXJpdGVkRGF0YSwKKworICBzY29wZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIC8vIENhbid0IHVzZSBqcUxpdGVEYXRhIGhlcmUgZGlyZWN0bHkgc28gd2Ugc3RheSBjb21wYXRpYmxlIHdpdGggalF1ZXJ5IQorICAgIHJldHVybiBqcUxpdGUuZGF0YShlbGVtZW50LCAnJHNjb3BlJykgfHwganFMaXRlSW5oZXJpdGVkRGF0YShlbGVtZW50LnBhcmVudE5vZGUgfHwgZWxlbWVudCwgWyckaXNvbGF0ZVNjb3BlJywgJyRzY29wZSddKTsKKyAgfSwKKworICBpc29sYXRlU2NvcGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAvLyBDYW4ndCB1c2UganFMaXRlRGF0YSBoZXJlIGRpcmVjdGx5IHNvIHdlIHN0YXkgY29tcGF0aWJsZSB3aXRoIGpRdWVyeSEKKyAgICByZXR1cm4ganFMaXRlLmRhdGEoZWxlbWVudCwgJyRpc29sYXRlU2NvcGUnKSB8fCBqcUxpdGUuZGF0YShlbGVtZW50LCAnJGlzb2xhdGVTY29wZU5vVGVtcGxhdGUnKTsKKyAgfSwKKworICBjb250cm9sbGVyOiBqcUxpdGVDb250cm9sbGVyLAorCisgIGluamVjdG9yOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuIGpxTGl0ZUluaGVyaXRlZERhdGEoZWxlbWVudCwgJyRpbmplY3RvcicpOworICB9LAorCisgIHJlbW92ZUF0dHI6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUpIHsKKyAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgfSwKKworICBoYXNDbGFzczoganFMaXRlSGFzQ2xhc3MsCisKKyAgY3NzOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lLCB2YWx1ZSkgeworICAgIG5hbWUgPSBjYW1lbENhc2UobmFtZSk7CisKKyAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkgeworICAgICAgZWxlbWVudC5zdHlsZVtuYW1lXSA9IHZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZWxlbWVudC5zdHlsZVtuYW1lXTsKKyAgICB9CisgIH0sCisKKyAgYXR0cjogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgdmFsdWUpIHsKKyAgICB2YXIgbG93ZXJjYXNlZE5hbWUgPSBsb3dlcmNhc2UobmFtZSk7CisgICAgaWYgKEJPT0xFQU5fQVRUUltsb3dlcmNhc2VkTmFtZV0pIHsKKyAgICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7CisgICAgICAgIGlmICghIXZhbHVlKSB7CisgICAgICAgICAgZWxlbWVudFtuYW1lXSA9IHRydWU7CisgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgbG93ZXJjYXNlZE5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGVsZW1lbnRbbmFtZV0gPSBmYWxzZTsKKyAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShsb3dlcmNhc2VkTmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAoZWxlbWVudFtuYW1lXSB8fAorICAgICAgICAgICAgICAgICAoZWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShuYW1lKSB8fCBub29wKS5zcGVjaWZpZWQpCisgICAgICAgICAgICAgICA/IGxvd2VyY2FzZWROYW1lCisgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHsKKyAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7CisgICAgICAvLyB0aGUgZXh0cmEgYXJndW1lbnQgIjIiIGlzIHRvIGdldCB0aGUgcmlnaHQgdGhpbmcgZm9yIGEuaHJlZiBpbiBJRSwgc2VlIGpRdWVyeSBjb2RlCisgICAgICAvLyBzb21lIGVsZW1lbnRzIChlLmcuIERvY3VtZW50KSBkb24ndCBoYXZlIGdldCBhdHRyaWJ1dGUsIHNvIHJldHVybiB1bmRlZmluZWQKKyAgICAgIHZhciByZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lLCAyKTsKKyAgICAgIC8vIG5vcm1hbGl6ZSBub24tZXhpc3RpbmcgYXR0cmlidXRlcyB0byB1bmRlZmluZWQgKGFzIGpRdWVyeSkKKyAgICAgIHJldHVybiByZXQgPT09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7CisgICAgfQorICB9LAorCisgIHByb3A6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7CisgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHsKKyAgICAgIGVsZW1lbnRbbmFtZV0gPSB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGVsZW1lbnRbbmFtZV07CisgICAgfQorICB9LAorCisgIHRleHQ6IChmdW5jdGlvbigpIHsKKyAgICBnZXRUZXh0LiRkdiA9ICcnOworICAgIHJldHVybiBnZXRUZXh0OworCisgICAgZnVuY3Rpb24gZ2V0VGV4dChlbGVtZW50LCB2YWx1ZSkgeworICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgeworICAgICAgICB2YXIgbm9kZVR5cGUgPSBlbGVtZW50Lm5vZGVUeXBlOworICAgICAgICByZXR1cm4gKG5vZGVUeXBlID09PSBOT0RFX1RZUEVfRUxFTUVOVCB8fCBub2RlVHlwZSA9PT0gTk9ERV9UWVBFX1RFWFQpID8gZWxlbWVudC50ZXh0Q29udGVudCA6ICcnOworICAgICAgfQorICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHZhbHVlOworICAgIH0KKyAgfSkoKSwKKworICB2YWw6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgeworICAgICAgaWYgKGVsZW1lbnQubXVsdGlwbGUgJiYgbm9kZU5hbWVfKGVsZW1lbnQpID09PSAnc2VsZWN0JykgeworICAgICAgICB2YXIgcmVzdWx0ID0gW107CisgICAgICAgIGZvckVhY2goZWxlbWVudC5vcHRpb25zLCBmdW5jdGlvbihvcHRpb24pIHsKKyAgICAgICAgICBpZiAob3B0aW9uLnNlbGVjdGVkKSB7CisgICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24udmFsdWUgfHwgb3B0aW9uLnRleHQpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09PSAwID8gbnVsbCA6IHJlc3VsdDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlOworICAgIH0KKyAgICBlbGVtZW50LnZhbHVlID0gdmFsdWU7CisgIH0sCisKKyAgaHRtbDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKSB7CisgICAgICByZXR1cm4gZWxlbWVudC5pbm5lckhUTUw7CisgICAgfQorICAgIGpxTGl0ZURlYWxvYyhlbGVtZW50LCB0cnVlKTsKKyAgICBlbGVtZW50LmlubmVySFRNTCA9IHZhbHVlOworICB9LAorCisgIGVtcHR5OiBqcUxpdGVFbXB0eQorfSwgZnVuY3Rpb24oZm4sIG5hbWUpIHsKKyAgLyoqCisgICAqIFByb3BlcnRpZXM6IHdyaXRlcyByZXR1cm4gc2VsZWN0aW9uLCByZWFkcyByZXR1cm4gZmlyc3QgdmFsdWUKKyAgICovCisgIEpRTGl0ZS5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbihhcmcxLCBhcmcyKSB7CisgICAgdmFyIGksIGtleTsKKyAgICB2YXIgbm9kZUNvdW50ID0gdGhpcy5sZW5ndGg7CisKKyAgICAvLyBqcUxpdGVIYXNDbGFzcyBoYXMgb25seSB0d28gYXJndW1lbnRzLCBidXQgaXMgYSBnZXR0ZXItb25seSBmbiwgc28gd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgaXQKKyAgICAvLyBpbiBhIHdheSB0aGF0IHN1cnZpdmVzIG1pbmlmaWNhdGlvbi4KKyAgICAvLyBqcUxpdGVFbXB0eSB0YWtlcyBubyBhcmd1bWVudHMgYnV0IGlzIGEgc2V0dGVyLgorICAgIGlmIChmbiAhPT0ganFMaXRlRW1wdHkgJiYKKyAgICAgICAgKCgoZm4ubGVuZ3RoID09IDIgJiYgKGZuICE9PSBqcUxpdGVIYXNDbGFzcyAmJiBmbiAhPT0ganFMaXRlQ29udHJvbGxlcikpID8gYXJnMSA6IGFyZzIpID09PSB1bmRlZmluZWQpKSB7CisgICAgICBpZiAoaXNPYmplY3QoYXJnMSkpIHsKKworICAgICAgICAvLyB3ZSBhcmUgYSB3cml0ZSwgYnV0IHRoZSBvYmplY3QgcHJvcGVydGllcyBhcmUgdGhlIGtleS92YWx1ZXMKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5vZGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgaWYgKGZuID09PSBqcUxpdGVEYXRhKSB7CisgICAgICAgICAgICAvLyBkYXRhKCkgdGFrZXMgdGhlIHdob2xlIG9iamVjdCBpbiBqUXVlcnkKKyAgICAgICAgICAgIGZuKHRoaXNbaV0sIGFyZzEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGtleSBpbiBhcmcxKSB7CisgICAgICAgICAgICAgIGZuKHRoaXNbaV0sIGtleSwgYXJnMVtrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gcmV0dXJuIHNlbGYgZm9yIGNoYWluaW5nCisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gd2UgYXJlIGEgcmVhZCwgc28gcmVhZCB0aGUgZmlyc3QgY2hpbGQuCisgICAgICAgIC8vIFRPRE86IGRvIHdlIHN0aWxsIG5lZWQgdGhpcz8KKyAgICAgICAgdmFyIHZhbHVlID0gZm4uJGR2OworICAgICAgICAvLyBPbmx5IGlmIHdlIGhhdmUgJGR2IGRvIHdlIGl0ZXJhdGUgb3ZlciBhbGwsIG90aGVyd2lzZSBpdCBpcyBqdXN0IHRoZSBmaXJzdCBlbGVtZW50LgorICAgICAgICB2YXIgamogPSAodmFsdWUgPT09IHVuZGVmaW5lZCkgPyBNYXRoLm1pbihub2RlQ291bnQsIDEpIDogbm9kZUNvdW50OworICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgICB2YXIgbm9kZVZhbHVlID0gZm4odGhpc1tqXSwgYXJnMSwgYXJnMik7CisgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA/IHZhbHVlICsgbm9kZVZhbHVlIDogbm9kZVZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gd2UgYXJlIGEgd3JpdGUsIHNvIGFwcGx5IHRvIGFsbCBjaGlsZHJlbgorICAgICAgZm9yIChpID0gMDsgaSA8IG5vZGVDb3VudDsgaSsrKSB7CisgICAgICAgIGZuKHRoaXNbaV0sIGFyZzEsIGFyZzIpOworICAgICAgfQorICAgICAgLy8gcmV0dXJuIHNlbGYgZm9yIGNoYWluaW5nCisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgIH07Cit9KTsKKworZnVuY3Rpb24gY3JlYXRlRXZlbnRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cykgeworICB2YXIgZXZlbnRIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQsIHR5cGUpIHsKKyAgICAvLyBqUXVlcnkgc3BlY2lmaWMgYXBpCisgICAgZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gZXZlbnQuZGVmYXVsdFByZXZlbnRlZDsKKyAgICB9OworCisgICAgdmFyIGV2ZW50Rm5zID0gZXZlbnRzW3R5cGUgfHwgZXZlbnQudHlwZV07CisgICAgdmFyIGV2ZW50Rm5zTGVuZ3RoID0gZXZlbnRGbnMgPyBldmVudEZucy5sZW5ndGggOiAwOworCisgICAgaWYgKCFldmVudEZuc0xlbmd0aCkgcmV0dXJuOworCisgICAgaWYgKGlzVW5kZWZpbmVkKGV2ZW50LmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCkpIHsKKyAgICAgIHZhciBvcmlnaW5hbFN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjsKKyAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uKCkgeworICAgICAgICBldmVudC5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSB0cnVlOworCisgICAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHsKKyAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvcmlnaW5hbFN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikgeworICAgICAgICAgIG9yaWdpbmFsU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uLmNhbGwoZXZlbnQpOworICAgICAgICB9CisgICAgICB9OworICAgIH0KKworICAgIGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gZXZlbnQuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID09PSB0cnVlOworICAgIH07CisKKyAgICAvLyBDb3B5IGV2ZW50IGhhbmRsZXJzIGluIGNhc2UgZXZlbnQgaGFuZGxlcnMgYXJyYXkgaXMgbW9kaWZpZWQgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICBpZiAoKGV2ZW50Rm5zTGVuZ3RoID4gMSkpIHsKKyAgICAgIGV2ZW50Rm5zID0gc2hhbGxvd0NvcHkoZXZlbnRGbnMpOworICAgIH0KKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRGbnNMZW5ndGg7IGkrKykgeworICAgICAgaWYgKCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSB7CisgICAgICAgIGV2ZW50Rm5zW2ldLmNhbGwoZWxlbWVudCwgZXZlbnQpOworICAgICAgfQorICAgIH0KKyAgfTsKKworICAvLyBUT0RPOiB0aGlzIGlzIGEgaGFjayBmb3IgYW5ndWxhck1vY2tzL2NsZWFyRGF0YUNhY2hlIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gZGVyZWdpc3RlciBhbGwKKyAgLy8gICAgICAgZXZlbnRzIG9uIGBlbGVtZW50YAorICBldmVudEhhbmRsZXIuZWxlbSA9IGVsZW1lbnQ7CisgIHJldHVybiBldmVudEhhbmRsZXI7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRnVuY3Rpb25zIGl0ZXJhdGluZyB0cmF2ZXJzYWwuCisvLyBUaGVzZSBmdW5jdGlvbnMgY2hhaW4gcmVzdWx0cyBpbnRvIGEgc2luZ2xlCisvLyBzZWxlY3Rvci4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworZm9yRWFjaCh7CisgIHJlbW92ZURhdGE6IGpxTGl0ZVJlbW92ZURhdGEsCisKKyAgb246IGZ1bmN0aW9uIGpxTGl0ZU9uKGVsZW1lbnQsIHR5cGUsIGZuLCB1bnN1cHBvcnRlZCkgeworICAgIGlmIChpc0RlZmluZWQodW5zdXBwb3J0ZWQpKSB0aHJvdyBqcUxpdGVNaW5FcnIoJ29uYXJncycsICdqcUxpdGUjb24oKSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgc2VsZWN0b3JgIG9yIGBldmVudERhdGFgIHBhcmFtZXRlcnMnKTsKKworICAgIC8vIERvIG5vdCBhZGQgZXZlbnQgaGFuZGxlcnMgdG8gbm9uLWVsZW1lbnRzIGJlY2F1c2UgdGhleSB3aWxsIG5vdCBiZSBjbGVhbmVkIHVwLgorICAgIGlmICghanFMaXRlQWNjZXB0c0RhdGEoZWxlbWVudCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgZXhwYW5kb1N0b3JlID0ganFMaXRlRXhwYW5kb1N0b3JlKGVsZW1lbnQsIHRydWUpOworICAgIHZhciBldmVudHMgPSBleHBhbmRvU3RvcmUuZXZlbnRzOworICAgIHZhciBoYW5kbGUgPSBleHBhbmRvU3RvcmUuaGFuZGxlOworCisgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgIGhhbmRsZSA9IGV4cGFuZG9TdG9yZS5oYW5kbGUgPSBjcmVhdGVFdmVudEhhbmRsZXIoZWxlbWVudCwgZXZlbnRzKTsKKyAgICB9CisKKyAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9zdHJpbmctaW5kZXhvZi12cy1zcGxpdAorICAgIHZhciB0eXBlcyA9IHR5cGUuaW5kZXhPZignICcpID49IDAgPyB0eXBlLnNwbGl0KCcgJykgOiBbdHlwZV07CisgICAgdmFyIGkgPSB0eXBlcy5sZW5ndGg7CisKKyAgICB3aGlsZSAoaS0tKSB7CisgICAgICB0eXBlID0gdHlwZXNbaV07CisgICAgICB2YXIgZXZlbnRGbnMgPSBldmVudHNbdHlwZV07CisKKyAgICAgIGlmICghZXZlbnRGbnMpIHsKKyAgICAgICAgZXZlbnRzW3R5cGVdID0gW107CisKKyAgICAgICAgaWYgKHR5cGUgPT09ICdtb3VzZWVudGVyJyB8fCB0eXBlID09PSAnbW91c2VsZWF2ZScpIHsKKyAgICAgICAgICAvLyBSZWZlciB0byBqUXVlcnkncyBpbXBsZW1lbnRhdGlvbiBvZiBtb3VzZWVudGVyICYgbW91c2VsZWF2ZQorICAgICAgICAgIC8vIFJlYWQgYWJvdXQgbW91c2VlbnRlciBhbmQgbW91c2VsZWF2ZToKKyAgICAgICAgICAvLyBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2pzL2V2ZW50c19tb3VzZS5odG1sI2xpbms4CisKKyAgICAgICAgICBqcUxpdGVPbihlbGVtZW50LCBNT1VTRV9FVkVOVF9NQVBbdHlwZV0sIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcywgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CisgICAgICAgICAgICAvLyBGb3IgbW91c2VudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuCisgICAgICAgICAgICAvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvdworICAgICAgICAgICAgaWYgKCFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0YXJnZXQgJiYgIXRhcmdldC5jb250YWlucyhyZWxhdGVkKSkpIHsKKyAgICAgICAgICAgICAgaGFuZGxlKGV2ZW50LCB0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICh0eXBlICE9PSAnJGRlc3Ryb3knKSB7CisgICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyRm4oZWxlbWVudCwgdHlwZSwgaGFuZGxlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZXZlbnRGbnMgPSBldmVudHNbdHlwZV07CisgICAgICB9CisgICAgICBldmVudEZucy5wdXNoKGZuKTsKKyAgICB9CisgIH0sCisKKyAgb2ZmOiBqcUxpdGVPZmYsCisKKyAgb25lOiBmdW5jdGlvbihlbGVtZW50LCB0eXBlLCBmbikgeworICAgIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCk7CisKKyAgICAvL2FkZCB0aGUgbGlzdGVuZXIgdHdpY2Ugc28gdGhhdCB3aGVuIGl0IGlzIGNhbGxlZAorICAgIC8veW91IGNhbiByZW1vdmUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGFuZCBzdGlsbCBiZQorICAgIC8vYWJsZSB0byBjYWxsIGVsZW1lbnQub2ZmKGV2LCBmbikgbm9ybWFsbHkKKyAgICBlbGVtZW50Lm9uKHR5cGUsIGZ1bmN0aW9uIG9uRm4oKSB7CisgICAgICBlbGVtZW50Lm9mZih0eXBlLCBmbik7CisgICAgICBlbGVtZW50Lm9mZih0eXBlLCBvbkZuKTsKKyAgICB9KTsKKyAgICBlbGVtZW50Lm9uKHR5cGUsIGZuKTsKKyAgfSwKKworICByZXBsYWNlV2l0aDogZnVuY3Rpb24oZWxlbWVudCwgcmVwbGFjZU5vZGUpIHsKKyAgICB2YXIgaW5kZXgsIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKKyAgICBqcUxpdGVEZWFsb2MoZWxlbWVudCk7CisgICAgZm9yRWFjaChuZXcgSlFMaXRlKHJlcGxhY2VOb2RlKSwgZnVuY3Rpb24obm9kZSkgeworICAgICAgaWYgKGluZGV4KSB7CisgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgaW5kZXgubmV4dFNpYmxpbmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZChub2RlLCBlbGVtZW50KTsKKyAgICAgIH0KKyAgICAgIGluZGV4ID0gbm9kZTsKKyAgICB9KTsKKyAgfSwKKworICBjaGlsZHJlbjogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHZhciBjaGlsZHJlbiA9IFtdOworICAgIGZvckVhY2goZWxlbWVudC5jaGlsZE5vZGVzLCBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0VMRU1FTlQpCisgICAgICAgIGNoaWxkcmVuLnB1c2goZWxlbWVudCk7CisgICAgfSk7CisgICAgcmV0dXJuIGNoaWxkcmVuOworICB9LAorCisgIGNvbnRlbnRzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuIGVsZW1lbnQuY29udGVudERvY3VtZW50IHx8IGVsZW1lbnQuY2hpbGROb2RlcyB8fCBbXTsKKyAgfSwKKworICBhcHBlbmQ6IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsKKyAgICB2YXIgbm9kZVR5cGUgPSBlbGVtZW50Lm5vZGVUeXBlOworICAgIGlmIChub2RlVHlwZSAhPT0gTk9ERV9UWVBFX0VMRU1FTlQgJiYgbm9kZVR5cGUgIT09IE5PREVfVFlQRV9ET0NVTUVOVF9GUkFHTUVOVCkgcmV0dXJuOworCisgICAgbm9kZSA9IG5ldyBKUUxpdGUobm9kZSk7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBub2RlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07CisgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKKyAgICB9CisgIH0sCisKKyAgcHJlcGVuZDogZnVuY3Rpb24oZWxlbWVudCwgbm9kZSkgeworICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOT0RFX1RZUEVfRUxFTUVOVCkgeworICAgICAgdmFyIGluZGV4ID0gZWxlbWVudC5maXJzdENoaWxkOworICAgICAgZm9yRWFjaChuZXcgSlFMaXRlKG5vZGUpLCBmdW5jdGlvbihjaGlsZCkgeworICAgICAgICBlbGVtZW50Lmluc2VydEJlZm9yZShjaGlsZCwgaW5kZXgpOworICAgICAgfSk7CisgICAgfQorICB9LAorCisgIHdyYXA6IGZ1bmN0aW9uKGVsZW1lbnQsIHdyYXBOb2RlKSB7CisgICAgd3JhcE5vZGUgPSBqcUxpdGUod3JhcE5vZGUpLmVxKDApLmNsb25lKClbMF07CisgICAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKKyAgICBpZiAocGFyZW50KSB7CisgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKHdyYXBOb2RlLCBlbGVtZW50KTsKKyAgICB9CisgICAgd3JhcE5vZGUuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CisgIH0sCisKKyAgcmVtb3ZlOiBqcUxpdGVSZW1vdmUsCisKKyAgZGV0YWNoOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAganFMaXRlUmVtb3ZlKGVsZW1lbnQsIHRydWUpOworICB9LAorCisgIGFmdGVyOiBmdW5jdGlvbihlbGVtZW50LCBuZXdFbGVtZW50KSB7CisgICAgdmFyIGluZGV4ID0gZWxlbWVudCwgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOworICAgIG5ld0VsZW1lbnQgPSBuZXcgSlFMaXRlKG5ld0VsZW1lbnQpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbmV3RWxlbWVudC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICB2YXIgbm9kZSA9IG5ld0VsZW1lbnRbaV07CisgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIGluZGV4Lm5leHRTaWJsaW5nKTsKKyAgICAgIGluZGV4ID0gbm9kZTsKKyAgICB9CisgIH0sCisKKyAgYWRkQ2xhc3M6IGpxTGl0ZUFkZENsYXNzLAorICByZW1vdmVDbGFzczoganFMaXRlUmVtb3ZlQ2xhc3MsCisKKyAgdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIHNlbGVjdG9yLCBjb25kaXRpb24pIHsKKyAgICBpZiAoc2VsZWN0b3IpIHsKKyAgICAgIGZvckVhY2goc2VsZWN0b3Iuc3BsaXQoJyAnKSwgZnVuY3Rpb24oY2xhc3NOYW1lKSB7CisgICAgICAgIHZhciBjbGFzc0NvbmRpdGlvbiA9IGNvbmRpdGlvbjsKKyAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGNsYXNzQ29uZGl0aW9uKSkgeworICAgICAgICAgIGNsYXNzQ29uZGl0aW9uID0gIWpxTGl0ZUhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgKGNsYXNzQ29uZGl0aW9uID8ganFMaXRlQWRkQ2xhc3MgOiBqcUxpdGVSZW1vdmVDbGFzcykoZWxlbWVudCwgY2xhc3NOYW1lKTsKKyAgICAgIH0pOworICAgIH0KKyAgfSwKKworICBwYXJlbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOworICAgIHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSBOT0RFX1RZUEVfRE9DVU1FTlRfRlJBR01FTlQgPyBwYXJlbnQgOiBudWxsOworICB9LAorCisgIG5leHQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7CisgIH0sCisKKyAgZmluZDogZnVuY3Rpb24oZWxlbWVudCwgc2VsZWN0b3IpIHsKKyAgICBpZiAoZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgeworICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoc2VsZWN0b3IpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gW107CisgICAgfQorICB9LAorCisgIGNsb25lOiBqcUxpdGVDbG9uZSwKKworICB0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oZWxlbWVudCwgZXZlbnQsIGV4dHJhUGFyYW1ldGVycykgeworCisgICAgdmFyIGR1bW15RXZlbnQsIGV2ZW50Rm5zQ29weSwgaGFuZGxlckFyZ3M7CisgICAgdmFyIGV2ZW50TmFtZSA9IGV2ZW50LnR5cGUgfHwgZXZlbnQ7CisgICAgdmFyIGV4cGFuZG9TdG9yZSA9IGpxTGl0ZUV4cGFuZG9TdG9yZShlbGVtZW50KTsKKyAgICB2YXIgZXZlbnRzID0gZXhwYW5kb1N0b3JlICYmIGV4cGFuZG9TdG9yZS5ldmVudHM7CisgICAgdmFyIGV2ZW50Rm5zID0gZXZlbnRzICYmIGV2ZW50c1tldmVudE5hbWVdOworCisgICAgaWYgKGV2ZW50Rm5zKSB7CisgICAgICAvLyBDcmVhdGUgYSBkdW1teSBldmVudCB0byBwYXNzIHRvIHRoZSBoYW5kbGVycworICAgICAgZHVtbXlFdmVudCA9IHsKKyAgICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeyB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOyB9LAorICAgICAgICBpc0RlZmF1bHRQcmV2ZW50ZWQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5kZWZhdWx0UHJldmVudGVkID09PSB0cnVlOyB9LAorICAgICAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeyB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7IH0sCisgICAgICAgIGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID09PSB0cnVlOyB9LAorICAgICAgICBzdG9wUHJvcGFnYXRpb246IG5vb3AsCisgICAgICAgIHR5cGU6IGV2ZW50TmFtZSwKKyAgICAgICAgdGFyZ2V0OiBlbGVtZW50CisgICAgICB9OworCisgICAgICAvLyBJZiBhIGN1c3RvbSBldmVudCB3YXMgcHJvdmlkZWQgdGhlbiBleHRlbmQgb3VyIGR1bW15IGV2ZW50IHdpdGggaXQKKyAgICAgIGlmIChldmVudC50eXBlKSB7CisgICAgICAgIGR1bW15RXZlbnQgPSBleHRlbmQoZHVtbXlFdmVudCwgZXZlbnQpOworICAgICAgfQorCisgICAgICAvLyBDb3B5IGV2ZW50IGhhbmRsZXJzIGluIGNhc2UgZXZlbnQgaGFuZGxlcnMgYXJyYXkgaXMgbW9kaWZpZWQgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICAgIGV2ZW50Rm5zQ29weSA9IHNoYWxsb3dDb3B5KGV2ZW50Rm5zKTsKKyAgICAgIGhhbmRsZXJBcmdzID0gZXh0cmFQYXJhbWV0ZXJzID8gW2R1bW15RXZlbnRdLmNvbmNhdChleHRyYVBhcmFtZXRlcnMpIDogW2R1bW15RXZlbnRdOworCisgICAgICBmb3JFYWNoKGV2ZW50Rm5zQ29weSwgZnVuY3Rpb24oZm4pIHsKKyAgICAgICAgaWYgKCFkdW1teUV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpIHsKKyAgICAgICAgICBmbi5hcHBseShlbGVtZW50LCBoYW5kbGVyQXJncyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgfQorfSwgZnVuY3Rpb24oZm4sIG5hbWUpIHsKKyAgLyoqCisgICAqIGNoYWluaW5nIGZ1bmN0aW9ucworICAgKi8KKyAgSlFMaXRlLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpIHsKKyAgICB2YXIgdmFsdWU7CisKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHsKKyAgICAgICAgdmFsdWUgPSBmbih0aGlzW2ldLCBhcmcxLCBhcmcyLCBhcmczKTsKKyAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHsKKyAgICAgICAgICAvLyBhbnkgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIHZhbHVlIG5lZWRzIHRvIGJlIHdyYXBwZWQKKyAgICAgICAgICB2YWx1ZSA9IGpxTGl0ZSh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGpxTGl0ZUFkZE5vZGVzKHZhbHVlLCBmbih0aGlzW2ldLCBhcmcxLCBhcmcyLCBhcmczKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBpc0RlZmluZWQodmFsdWUpID8gdmFsdWUgOiB0aGlzOworICB9OworCisgIC8vIGJpbmQgbGVnYWN5IGJpbmQvdW5iaW5kIHRvIG9uL29mZgorICBKUUxpdGUucHJvdG90eXBlLmJpbmQgPSBKUUxpdGUucHJvdG90eXBlLm9uOworICBKUUxpdGUucHJvdG90eXBlLnVuYmluZCA9IEpRTGl0ZS5wcm90b3R5cGUub2ZmOworfSk7CisKKworLy8gUHJvdmlkZXIgZm9yIHByaXZhdGUgJCRqcUxpdGUgc2VydmljZQorZnVuY3Rpb24gJCRqcUxpdGVQcm92aWRlcigpIHsKKyAgdGhpcy4kZ2V0ID0gZnVuY3Rpb24gJCRqcUxpdGUoKSB7CisgICAgcmV0dXJuIGV4dGVuZChKUUxpdGUsIHsKKyAgICAgIGhhc0NsYXNzOiBmdW5jdGlvbihub2RlLCBjbGFzc2VzKSB7CisgICAgICAgIGlmIChub2RlLmF0dHIpIG5vZGUgPSBub2RlWzBdOworICAgICAgICByZXR1cm4ganFMaXRlSGFzQ2xhc3Mobm9kZSwgY2xhc3Nlcyk7CisgICAgICB9LAorICAgICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKG5vZGUsIGNsYXNzZXMpIHsKKyAgICAgICAgaWYgKG5vZGUuYXR0cikgbm9kZSA9IG5vZGVbMF07CisgICAgICAgIHJldHVybiBqcUxpdGVBZGRDbGFzcyhub2RlLCBjbGFzc2VzKTsKKyAgICAgIH0sCisgICAgICByZW1vdmVDbGFzczogZnVuY3Rpb24obm9kZSwgY2xhc3NlcykgeworICAgICAgICBpZiAobm9kZS5hdHRyKSBub2RlID0gbm9kZVswXTsKKyAgICAgICAgcmV0dXJuIGpxTGl0ZVJlbW92ZUNsYXNzKG5vZGUsIGNsYXNzZXMpOworICAgICAgfQorICAgIH0pOworICB9OworfQorCisvKioKKyAqIENvbXB1dGVzIGEgaGFzaCBvZiBhbiAnb2JqJy4KKyAqIEhhc2ggb2YgYToKKyAqICBzdHJpbmcgaXMgc3RyaW5nCisgKiAgbnVtYmVyIGlzIG51bWJlciBhcyBzdHJpbmcKKyAqICBvYmplY3QgaXMgZWl0aGVyIHJlc3VsdCBvZiBjYWxsaW5nICQkaGFzaEtleSBmdW5jdGlvbiBvbiB0aGUgb2JqZWN0IG9yIHVuaXF1ZWx5IGdlbmVyYXRlZCBpZCwKKyAqICAgICAgICAgdGhhdCBpcyBhbHNvIGFzc2lnbmVkIHRvIHRoZSAkJGhhc2hLZXkgcHJvcGVydHkgb2YgdGhlIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gb2JqCisgKiBAcmV0dXJucyB7c3RyaW5nfSBoYXNoIHN0cmluZyBzdWNoIHRoYXQgdGhlIHNhbWUgaW5wdXQgd2lsbCBoYXZlIHRoZSBzYW1lIGhhc2ggc3RyaW5nLgorICogICAgICAgICBUaGUgcmVzdWx0aW5nIHN0cmluZyBrZXkgaXMgaW4gJ3R5cGU6aGFzaEtleScgZm9ybWF0LgorICovCitmdW5jdGlvbiBoYXNoS2V5KG9iaiwgbmV4dFVpZEZuKSB7CisgIHZhciBrZXkgPSBvYmogJiYgb2JqLiQkaGFzaEtleTsKKworICBpZiAoa2V5KSB7CisgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgIGtleSA9IG9iai4kJGhhc2hLZXkoKTsKKyAgICB9CisgICAgcmV0dXJuIGtleTsKKyAgfQorCisgIHZhciBvYmpUeXBlID0gdHlwZW9mIG9iajsKKyAgaWYgKG9ialR5cGUgPT0gJ2Z1bmN0aW9uJyB8fCAob2JqVHlwZSA9PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpKSB7CisgICAga2V5ID0gb2JqLiQkaGFzaEtleSA9IG9ialR5cGUgKyAnOicgKyAobmV4dFVpZEZuIHx8IG5leHRVaWQpKCk7CisgIH0gZWxzZSB7CisgICAga2V5ID0gb2JqVHlwZSArICc6JyArIG9iajsKKyAgfQorCisgIHJldHVybiBrZXk7Cit9CisKKy8qKgorICogSGFzaE1hcCB3aGljaCBjYW4gdXNlIG9iamVjdHMgYXMga2V5cworICovCitmdW5jdGlvbiBIYXNoTWFwKGFycmF5LCBpc29sYXRlZFVpZCkgeworICBpZiAoaXNvbGF0ZWRVaWQpIHsKKyAgICB2YXIgdWlkID0gMDsKKyAgICB0aGlzLm5leHRVaWQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiArK3VpZDsKKyAgICB9OworICB9CisgIGZvckVhY2goYXJyYXksIHRoaXMucHV0LCB0aGlzKTsKK30KK0hhc2hNYXAucHJvdG90eXBlID0geworICAvKioKKyAgICogU3RvcmUga2V5IHZhbHVlIHBhaXIKKyAgICogQHBhcmFtIGtleSBrZXkgdG8gc3RvcmUgY2FuIGJlIGFueSB0eXBlCisgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBzdG9yZSBjYW4gYmUgYW55IHR5cGUKKyAgICovCisgIHB1dDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAgIHRoaXNbaGFzaEtleShrZXksIHRoaXMubmV4dFVpZCldID0gdmFsdWU7CisgIH0sCisKKyAgLyoqCisgICAqIEBwYXJhbSBrZXkKKyAgICogQHJldHVybnMge09iamVjdH0gdGhlIHZhbHVlIGZvciB0aGUga2V5CisgICAqLworICBnZXQ6IGZ1bmN0aW9uKGtleSkgeworICAgIHJldHVybiB0aGlzW2hhc2hLZXkoa2V5LCB0aGlzLm5leHRVaWQpXTsKKyAgfSwKKworICAvKioKKyAgICogUmVtb3ZlIHRoZSBrZXkvdmFsdWUgcGFpcgorICAgKiBAcGFyYW0ga2V5CisgICAqLworICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgeworICAgIHZhciB2YWx1ZSA9IHRoaXNba2V5ID0gaGFzaEtleShrZXksIHRoaXMubmV4dFVpZCldOworICAgIGRlbGV0ZSB0aGlzW2tleV07CisgICAgcmV0dXJuIHZhbHVlOworICB9Cit9OworCisvKioKKyAqIEBuZ2RvYyBmdW5jdGlvbgorICogQG1vZHVsZSBuZworICogQG5hbWUgYW5ndWxhci5pbmplY3RvcgorICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIENyZWF0ZXMgYW4gaW5qZWN0b3Igb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgZm9yIHJldHJpZXZpbmcgc2VydmljZXMgYXMgd2VsbCBhcyBmb3IKKyAqIGRlcGVuZGVuY3kgaW5qZWN0aW9uIChzZWUge0BsaW5rIGd1aWRlL2RpIGRlcGVuZGVuY3kgaW5qZWN0aW9ufSkuCisgKgorICogQHBhcmFtIHtBcnJheS48c3RyaW5nfEZ1bmN0aW9uPn0gbW9kdWxlcyBBIGxpc3Qgb2YgbW9kdWxlIGZ1bmN0aW9ucyBvciB0aGVpciBhbGlhc2VzLiBTZWUKKyAqICAgICB7QGxpbmsgYW5ndWxhci5tb2R1bGV9LiBUaGUgYG5nYCBtb2R1bGUgbXVzdCBiZSBleHBsaWNpdGx5IGFkZGVkLgorICogQHBhcmFtIHtib29sZWFuPX0gW3N0cmljdERpPWZhbHNlXSBXaGV0aGVyIHRoZSBpbmplY3RvciBzaG91bGQgYmUgaW4gc3RyaWN0IG1vZGUsIHdoaWNoCisgKiAgICAgZGlzYWxsb3dzIGFyZ3VtZW50IG5hbWUgYW5ub3RhdGlvbiBpbmZlcmVuY2UuCisgKiBAcmV0dXJucyB7aW5qZWN0b3J9IEluamVjdG9yIG9iamVjdC4gU2VlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LgorICoKKyAqIEBleGFtcGxlCisgKiBUeXBpY2FsIHVzYWdlCisgKiBgYGBqcworICogICAvLyBjcmVhdGUgYW4gaW5qZWN0b3IKKyAqICAgdmFyICRpbmplY3RvciA9IGFuZ3VsYXIuaW5qZWN0b3IoWyduZyddKTsKKyAqCisgKiAgIC8vIHVzZSB0aGUgaW5qZWN0b3IgdG8ga2ljayBvZmYgeW91ciBhcHBsaWNhdGlvbgorICogICAvLyB1c2UgdGhlIHR5cGUgaW5mZXJlbmNlIHRvIGF1dG8gaW5qZWN0IGFyZ3VtZW50cywgb3IgdXNlIGltcGxpY2l0IGluamVjdGlvbgorICogICAkaW5qZWN0b3IuaW52b2tlKGZ1bmN0aW9uKCRyb290U2NvcGUsICRjb21waWxlLCAkZG9jdW1lbnQpIHsKKyAqICAgICAkY29tcGlsZSgkZG9jdW1lbnQpKCRyb290U2NvcGUpOworICogICAgICRyb290U2NvcGUuJGRpZ2VzdCgpOworICogICB9KTsKKyAqIGBgYAorICoKKyAqIFNvbWV0aW1lcyB5b3Ugd2FudCB0byBnZXQgYWNjZXNzIHRvIHRoZSBpbmplY3RvciBvZiBhIGN1cnJlbnRseSBydW5uaW5nIEFuZ3VsYXIgYXBwCisgKiBmcm9tIG91dHNpZGUgQW5ndWxhci4gUGVyaGFwcywgeW91IHdhbnQgdG8gaW5qZWN0IGFuZCBjb21waWxlIHNvbWUgbWFya3VwIGFmdGVyIHRoZQorICogYXBwbGljYXRpb24gaGFzIGJlZW4gYm9vdHN0cmFwcGVkLiBZb3UgY2FuIGRvIHRoaXMgdXNpbmcgdGhlIGV4dHJhIGBpbmplY3RvcigpYCBhZGRlZAorICogdG8gSlF1ZXJ5L2pxTGl0ZSBlbGVtZW50cy4gU2VlIHtAbGluayBhbmd1bGFyLmVsZW1lbnR9LgorICoKKyAqICpUaGlzIGlzIGZhaXJseSByYXJlIGJ1dCBjb3VsZCBiZSB0aGUgY2FzZSBpZiBhIHRoaXJkIHBhcnR5IGxpYnJhcnkgaXMgaW5qZWN0aW5nIHRoZQorICogbWFya3VwLioKKyAqCisgKiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYSBuZXcgYmxvY2sgb2YgSFRNTCBjb250YWluaW5nIGEgYG5nLWNvbnRyb2xsZXJgCisgKiBkaXJlY3RpdmUgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgYm9keSBieSBKUXVlcnkuIFdlIHRoZW4gY29tcGlsZSBhbmQgbGluaworICogaXQgaW50byB0aGUgY3VycmVudCBBbmd1bGFySlMgc2NvcGUuCisgKgorICogYGBganMKKyAqIHZhciAkZGl2ID0gJCgnPGRpdiBuZy1jb250cm9sbGVyPSJNeUN0cmwiPnt7Y29udGVudC5sYWJlbH19PC9kaXY+Jyk7CisgKiAkKGRvY3VtZW50LmJvZHkpLmFwcGVuZCgkZGl2KTsKKyAqCisgKiBhbmd1bGFyLmVsZW1lbnQoZG9jdW1lbnQpLmluamVjdG9yKCkuaW52b2tlKGZ1bmN0aW9uKCRjb21waWxlKSB7CisgKiAgIHZhciBzY29wZSA9IGFuZ3VsYXIuZWxlbWVudCgkZGl2KS5zY29wZSgpOworICogICAkY29tcGlsZSgkZGl2KShzY29wZSk7CisgKiB9KTsKKyAqIGBgYAorICovCisKKworLyoqCisgKiBAbmdkb2MgbW9kdWxlCisgKiBAbmFtZSBhdXRvCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBJbXBsaWNpdCBtb2R1bGUgd2hpY2ggZ2V0cyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGVhY2gge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uCisgKi8KKwordmFyIEZOX0FSR1MgPSAvXmZ1bmN0aW9uXHMqW15cKF0qXChccyooW15cKV0qKVwpL207Cit2YXIgRk5fQVJHX1NQTElUID0gLywvOwordmFyIEZOX0FSRyA9IC9eXHMqKF8/KShcUys/KVwxXHMqJC87Cit2YXIgU1RSSVBfQ09NTUVOVFMgPSAvKChcL1wvLiokKXwoXC9cKltcc1xTXSo/XCpcLykpL21nOwordmFyICRpbmplY3Rvck1pbkVyciA9IG1pbkVycignJGluamVjdG9yJyk7CisKK2Z1bmN0aW9uIGFub25GbihmbikgeworICAvLyBGb3IgYW5vbnltb3VzIGZ1bmN0aW9ucywgc2hvd2luZyBhdCB0aGUgdmVyeSBsZWFzdCB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGNhbiBoZWxwIGluCisgIC8vIGRlYnVnZ2luZy4KKyAgdmFyIGZuVGV4dCA9IGZuLnRvU3RyaW5nKCkucmVwbGFjZShTVFJJUF9DT01NRU5UUywgJycpLAorICAgICAgYXJncyA9IGZuVGV4dC5tYXRjaChGTl9BUkdTKTsKKyAgaWYgKGFyZ3MpIHsKKyAgICByZXR1cm4gJ2Z1bmN0aW9uKCcgKyAoYXJnc1sxXSB8fCAnJykucmVwbGFjZSgvW1xzXHJcbl0rLywgJyAnKSArICcpJzsKKyAgfQorICByZXR1cm4gJ2ZuJzsKK30KKworZnVuY3Rpb24gYW5ub3RhdGUoZm4sIHN0cmljdERpLCBuYW1lKSB7CisgIHZhciAkaW5qZWN0LAorICAgICAgZm5UZXh0LAorICAgICAgYXJnRGVjbCwKKyAgICAgIGxhc3Q7CisKKyAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykgeworICAgIGlmICghKCRpbmplY3QgPSBmbi4kaW5qZWN0KSkgeworICAgICAgJGluamVjdCA9IFtdOworICAgICAgaWYgKGZuLmxlbmd0aCkgeworICAgICAgICBpZiAoc3RyaWN0RGkpIHsKKyAgICAgICAgICBpZiAoIWlzU3RyaW5nKG5hbWUpIHx8ICFuYW1lKSB7CisgICAgICAgICAgICBuYW1lID0gZm4ubmFtZSB8fCBhbm9uRm4oZm4pOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ3N0cmljdGRpJywKKyAgICAgICAgICAgICd7MH0gaXMgbm90IHVzaW5nIGV4cGxpY2l0IGFubm90YXRpb24gYW5kIGNhbm5vdCBiZSBpbnZva2VkIGluIHN0cmljdCBtb2RlJywgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZm5UZXh0ID0gZm4udG9TdHJpbmcoKS5yZXBsYWNlKFNUUklQX0NPTU1FTlRTLCAnJyk7CisgICAgICAgIGFyZ0RlY2wgPSBmblRleHQubWF0Y2goRk5fQVJHUyk7CisgICAgICAgIGZvckVhY2goYXJnRGVjbFsxXS5zcGxpdChGTl9BUkdfU1BMSVQpLCBmdW5jdGlvbihhcmcpIHsKKyAgICAgICAgICBhcmcucmVwbGFjZShGTl9BUkcsIGZ1bmN0aW9uKGFsbCwgdW5kZXJzY29yZSwgbmFtZSkgeworICAgICAgICAgICAgJGluamVjdC5wdXNoKG5hbWUpOworICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICAgIGZuLiRpbmplY3QgPSAkaW5qZWN0OworICAgIH0KKyAgfSBlbHNlIGlmIChpc0FycmF5KGZuKSkgeworICAgIGxhc3QgPSBmbi5sZW5ndGggLSAxOworICAgIGFzc2VydEFyZ0ZuKGZuW2xhc3RdLCAnZm4nKTsKKyAgICAkaW5qZWN0ID0gZm4uc2xpY2UoMCwgbGFzdCk7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0QXJnRm4oZm4sICdmbicsIHRydWUpOworICB9CisgIHJldHVybiAkaW5qZWN0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBAbmdkb2Mgc2VydmljZQorICogQG5hbWUgJGluamVjdG9yCisgKgorICogQGRlc2NyaXB0aW9uCisgKgorICogYCRpbmplY3RvcmAgaXMgdXNlZCB0byByZXRyaWV2ZSBvYmplY3QgaW5zdGFuY2VzIGFzIGRlZmluZWQgYnkKKyAqIHtAbGluayBhdXRvLiRwcm92aWRlIHByb3ZpZGVyfSwgaW5zdGFudGlhdGUgdHlwZXMsIGludm9rZSBtZXRob2RzLAorICogYW5kIGxvYWQgbW9kdWxlcy4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGFsd2F5cyBob2xkcyB0cnVlOgorICoKKyAqIGBgYGpzCisgKiAgIHZhciAkaW5qZWN0b3IgPSBhbmd1bGFyLmluamVjdG9yKCk7CisgKiAgIGV4cGVjdCgkaW5qZWN0b3IuZ2V0KCckaW5qZWN0b3InKSkudG9CZSgkaW5qZWN0b3IpOworICogICBleHBlY3QoJGluamVjdG9yLmludm9rZShmdW5jdGlvbigkaW5qZWN0b3IpIHsKKyAqICAgICByZXR1cm4gJGluamVjdG9yOworICogICB9KSkudG9CZSgkaW5qZWN0b3IpOworICogYGBgCisgKgorICogIyBJbmplY3Rpb24gRnVuY3Rpb24gQW5ub3RhdGlvbgorICoKKyAqIEphdmFTY3JpcHQgZG9lcyBub3QgaGF2ZSBhbm5vdGF0aW9ucywgYW5kIGFubm90YXRpb25zIGFyZSBuZWVkZWQgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLiBUaGUKKyAqIGZvbGxvd2luZyBhcmUgYWxsIHZhbGlkIHdheXMgb2YgYW5ub3RhdGluZyBmdW5jdGlvbiB3aXRoIGluamVjdGlvbiBhcmd1bWVudHMgYW5kIGFyZSBlcXVpdmFsZW50LgorICoKKyAqIGBgYGpzCisgKiAgIC8vIGluZmVycmVkIChvbmx5IHdvcmtzIGlmIGNvZGUgbm90IG1pbmlmaWVkL29iZnVzY2F0ZWQpCisgKiAgICRpbmplY3Rvci5pbnZva2UoZnVuY3Rpb24oc2VydmljZUEpe30pOworICoKKyAqICAgLy8gYW5ub3RhdGVkCisgKiAgIGZ1bmN0aW9uIGV4cGxpY2l0KHNlcnZpY2VBKSB7fTsKKyAqICAgZXhwbGljaXQuJGluamVjdCA9IFsnc2VydmljZUEnXTsKKyAqICAgJGluamVjdG9yLmludm9rZShleHBsaWNpdCk7CisgKgorICogICAvLyBpbmxpbmUKKyAqICAgJGluamVjdG9yLmludm9rZShbJ3NlcnZpY2VBJywgZnVuY3Rpb24oc2VydmljZUEpe31dKTsKKyAqIGBgYAorICoKKyAqICMjIEluZmVyZW5jZQorICoKKyAqIEluIEphdmFTY3JpcHQgY2FsbGluZyBgdG9TdHJpbmcoKWAgb24gYSBmdW5jdGlvbiByZXR1cm5zIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiBUaGUgZGVmaW5pdGlvbgorICogY2FuIHRoZW4gYmUgcGFyc2VkIGFuZCB0aGUgZnVuY3Rpb24gYXJndW1lbnRzIGNhbiBiZSBleHRyYWN0ZWQuIFRoaXMgbWV0aG9kIG9mIGRpc2NvdmVyaW5nCisgKiBhbm5vdGF0aW9ucyBpcyBkaXNhbGxvd2VkIHdoZW4gdGhlIGluamVjdG9yIGlzIGluIHN0cmljdCBtb2RlLgorICogKk5PVEU6KiBUaGlzIGRvZXMgbm90IHdvcmsgd2l0aCBtaW5pZmljYXRpb24sIGFuZCBvYmZ1c2NhdGlvbiB0b29scyBzaW5jZSB0aGVzZSB0b29scyBjaGFuZ2UgdGhlCisgKiBhcmd1bWVudCBuYW1lcy4KKyAqCisgKiAjIyBgJGluamVjdGAgQW5ub3RhdGlvbgorICogQnkgYWRkaW5nIGFuIGAkaW5qZWN0YCBwcm9wZXJ0eSBvbnRvIGEgZnVuY3Rpb24gdGhlIGluamVjdGlvbiBwYXJhbWV0ZXJzIGNhbiBiZSBzcGVjaWZpZWQuCisgKgorICogIyMgSW5saW5lCisgKiBBcyBhbiBhcnJheSBvZiBpbmplY3Rpb24gbmFtZXMsIHdoZXJlIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFycmF5IGlzIHRoZSBmdW5jdGlvbiB0byBjYWxsLgorICovCisKKy8qKgorICogQG5nZG9jIG1ldGhvZAorICogQG5hbWUgJGluamVjdG9yI2dldAorICoKKyAqIEBkZXNjcmlwdGlvbgorICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZSB0byByZXRyaWV2ZS4KKyAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsZXIgQW4gb3B0aW9uYWwgc3RyaW5nIHRvIHByb3ZpZGUgdGhlIG9yaWdpbiBvZiB0aGUgZnVuY3Rpb24gY2FsbCBmb3IgZXJyb3IgbWVzc2FnZXMuCisgKiBAcmV0dXJuIHsqfSBUaGUgaW5zdGFuY2UuCisgKi8KKworLyoqCisgKiBAbmdkb2MgbWV0aG9kCisgKiBAbmFtZSAkaW5qZWN0b3IjaW52b2tlCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBJbnZva2UgdGhlIG1ldGhvZCBhbmQgc3VwcGx5IHRoZSBtZXRob2QgYXJndW1lbnRzIGZyb20gdGhlIGAkaW5qZWN0b3JgLgorICoKKyAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLiBGdW5jdGlvbiBwYXJhbWV0ZXJzIGFyZSBpbmplY3RlZCBhY2NvcmRpbmcgdG8gdGhlCisgKiAgIHtAbGluayBndWlkZS9kaSAkaW5qZWN0IEFubm90YXRpb259IHJ1bGVzLgorICogQHBhcmFtIHtPYmplY3Q9fSBzZWxmIFRoZSBgdGhpc2AgZm9yIHRoZSBpbnZva2VkIG1ldGhvZC4KKyAqIEBwYXJhbSB7T2JqZWN0PX0gbG9jYWxzIE9wdGlvbmFsIG9iamVjdC4gSWYgcHJlc2V0IHRoZW4gYW55IGFyZ3VtZW50IG5hbWVzIGFyZSByZWFkIGZyb20gdGhpcworICogICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZpcnN0LCBiZWZvcmUgdGhlIGAkaW5qZWN0b3JgIGlzIGNvbnN1bHRlZC4KKyAqIEByZXR1cm5zIHsqfSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGludm9rZWQgYGZuYCBmdW5jdGlvbi4KKyAqLworCisvKioKKyAqIEBuZ2RvYyBtZXRob2QKKyAqIEBuYW1lICRpbmplY3RvciNoYXMKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIEFsbG93cyB0aGUgdXNlciB0byBxdWVyeSBpZiB0aGUgcGFydGljdWxhciBzZXJ2aWNlIGV4aXN0cy4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIHF1ZXJ5LgorICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBpbmplY3RvciBoYXMgZ2l2ZW4gc2VydmljZS4KKyAqLworCisvKioKKyAqIEBuZ2RvYyBtZXRob2QKKyAqIEBuYW1lICRpbmplY3RvciNpbnN0YW50aWF0ZQorICogQGRlc2NyaXB0aW9uCisgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgSlMgdHlwZS4gVGhlIG1ldGhvZCB0YWtlcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCBpbnZva2VzIHRoZSBuZXcKKyAqIG9wZXJhdG9yLCBhbmQgc3VwcGxpZXMgYWxsIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGFzIHNwZWNpZmllZCBieSB0aGUKKyAqIGNvbnN0cnVjdG9yIGFubm90YXRpb24uCisgKgorICogQHBhcmFtIHtGdW5jdGlvbn0gVHlwZSBBbm5vdGF0ZWQgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgKiBAcGFyYW0ge09iamVjdD19IGxvY2FscyBPcHRpb25hbCBvYmplY3QuIElmIHByZXNldCB0aGVuIGFueSBhcmd1bWVudCBuYW1lcyBhcmUgcmVhZCBmcm9tIHRoaXMKKyAqIG9iamVjdCBmaXJzdCwgYmVmb3JlIHRoZSBgJGluamVjdG9yYCBpcyBjb25zdWx0ZWQuCisgKiBAcmV0dXJucyB7T2JqZWN0fSBuZXcgaW5zdGFuY2Ugb2YgYFR5cGVgLgorICovCisKKy8qKgorICogQG5nZG9jIG1ldGhvZAorICogQG5hbWUgJGluamVjdG9yI2Fubm90YXRlCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHNlcnZpY2UgbmFtZXMgd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIHJlcXVlc3RpbmcgZm9yIGluamVjdGlvbi4gVGhpcyBBUEkgaXMKKyAqIHVzZWQgYnkgdGhlIGluamVjdG9yIHRvIGRldGVybWluZSB3aGljaCBzZXJ2aWNlcyBuZWVkIHRvIGJlIGluamVjdGVkIGludG8gdGhlIGZ1bmN0aW9uIHdoZW4gdGhlCisgKiBmdW5jdGlvbiBpcyBpbnZva2VkLiBUaGVyZSBhcmUgdGhyZWUgd2F5cyBpbiB3aGljaCB0aGUgZnVuY3Rpb24gY2FuIGJlIGFubm90YXRlZCB3aXRoIHRoZSBuZWVkZWQKKyAqIGRlcGVuZGVuY2llcy4KKyAqCisgKiAjIEFyZ3VtZW50IG5hbWVzCisgKgorICogVGhlIHNpbXBsZXN0IGZvcm0gaXMgdG8gZXh0cmFjdCB0aGUgZGVwZW5kZW5jaWVzIGZyb20gdGhlIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24uIFRoaXMgaXMgZG9uZQorICogYnkgY29udmVydGluZyB0aGUgZnVuY3Rpb24gaW50byBhIHN0cmluZyB1c2luZyBgdG9TdHJpbmcoKWAgbWV0aG9kIGFuZCBleHRyYWN0aW5nIHRoZSBhcmd1bWVudAorICogbmFtZXMuCisgKiBgYGBqcworICogICAvLyBHaXZlbgorICogICBmdW5jdGlvbiBNeUNvbnRyb2xsZXIoJHNjb3BlLCAkcm91dGUpIHsKKyAqICAgICAvLyAuLi4KKyAqICAgfQorICoKKyAqICAgLy8gVGhlbgorICogICBleHBlY3QoaW5qZWN0b3IuYW5ub3RhdGUoTXlDb250cm9sbGVyKSkudG9FcXVhbChbJyRzY29wZScsICckcm91dGUnXSk7CisgKiBgYGAKKyAqCisgKiBZb3UgY2FuIGRpc2FsbG93IHRoaXMgbWV0aG9kIGJ5IHVzaW5nIHN0cmljdCBpbmplY3Rpb24gbW9kZS4KKyAqCisgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIHdpdGggY29kZSBtaW5pZmljYXRpb24gLyBvYmZ1c2NhdGlvbi4gRm9yIHRoaXMgcmVhc29uIHRoZSBmb2xsb3dpbmcKKyAqIGFubm90YXRpb24gc3RyYXRlZ2llcyBhcmUgc3VwcG9ydGVkLgorICoKKyAqICMgVGhlIGAkaW5qZWN0YCBwcm9wZXJ0eQorICoKKyAqIElmIGEgZnVuY3Rpb24gaGFzIGFuIGAkaW5qZWN0YCBwcm9wZXJ0eSBhbmQgaXRzIHZhbHVlIGlzIGFuIGFycmF5IG9mIHN0cmluZ3MsIHRoZW4gdGhlIHN0cmluZ3MKKyAqIHJlcHJlc2VudCBuYW1lcyBvZiBzZXJ2aWNlcyB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBmdW5jdGlvbi4KKyAqIGBgYGpzCisgKiAgIC8vIEdpdmVuCisgKiAgIHZhciBNeUNvbnRyb2xsZXIgPSBmdW5jdGlvbihvYmZ1c2NhdGVkU2NvcGUsIG9iZnVzY2F0ZWRSb3V0ZSkgeworICogICAgIC8vIC4uLgorICogICB9CisgKiAgIC8vIERlZmluZSBmdW5jdGlvbiBkZXBlbmRlbmNpZXMKKyAqICAgTXlDb250cm9sbGVyWyckaW5qZWN0J10gPSBbJyRzY29wZScsICckcm91dGUnXTsKKyAqCisgKiAgIC8vIFRoZW4KKyAqICAgZXhwZWN0KGluamVjdG9yLmFubm90YXRlKE15Q29udHJvbGxlcikpLnRvRXF1YWwoWyckc2NvcGUnLCAnJHJvdXRlJ10pOworICogYGBgCisgKgorICogIyBUaGUgYXJyYXkgbm90YXRpb24KKyAqCisgKiBJdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gaW5saW5lIEluamVjdGVkIGZ1bmN0aW9ucyBhbmQgdGhhdCdzIHdoZW4gc2V0dGluZyB0aGUgYCRpbmplY3RgIHByb3BlcnR5CisgKiBpcyB2ZXJ5IGluY29udmVuaWVudC4gSW4gdGhlc2Ugc2l0dWF0aW9ucyB1c2luZyB0aGUgYXJyYXkgbm90YXRpb24gdG8gc3BlY2lmeSB0aGUgZGVwZW5kZW5jaWVzIGluCisgKiBhIHdheSB0aGF0IHN1cnZpdmVzIG1pbmlmaWNhdGlvbiBpcyBhIGJldHRlciBjaG9pY2U6CisgKgorICogYGBganMKKyAqICAgLy8gV2Ugd2lzaCB0byB3cml0ZSB0aGlzIChub3QgbWluaWZpY2F0aW9uIC8gb2JmdXNjYXRpb24gc2FmZSkKKyAqICAgaW5qZWN0b3IuaW52b2tlKGZ1bmN0aW9uKCRjb21waWxlLCAkcm9vdFNjb3BlKSB7CisgKiAgICAgLy8gLi4uCisgKiAgIH0pOworICoKKyAqICAgLy8gV2UgYXJlIGZvcmNlZCB0byB3cml0ZSBicmVhayBpbmxpbmluZworICogICB2YXIgdG1wRm4gPSBmdW5jdGlvbihvYmZ1c2NhdGVkQ29tcGlsZSwgb2JmdXNjYXRlZFJvb3RTY29wZSkgeworICogICAgIC8vIC4uLgorICogICB9OworICogICB0bXBGbi4kaW5qZWN0ID0gWyckY29tcGlsZScsICckcm9vdFNjb3BlJ107CisgKiAgIGluamVjdG9yLmludm9rZSh0bXBGbik7CisgKgorICogICAvLyBUbyBiZXR0ZXIgc3VwcG9ydCBpbmxpbmUgZnVuY3Rpb24gdGhlIGlubGluZSBhbm5vdGF0aW9uIGlzIHN1cHBvcnRlZAorICogICBpbmplY3Rvci5pbnZva2UoWyckY29tcGlsZScsICckcm9vdFNjb3BlJywgZnVuY3Rpb24ob2JmQ29tcGlsZSwgb2JmUm9vdFNjb3BlKSB7CisgKiAgICAgLy8gLi4uCisgKiAgIH1dKTsKKyAqCisgKiAgIC8vIFRoZXJlZm9yZQorICogICBleHBlY3QoaW5qZWN0b3IuYW5ub3RhdGUoCisgKiAgICAgIFsnJGNvbXBpbGUnLCAnJHJvb3RTY29wZScsIGZ1bmN0aW9uKG9iZnVzXyRjb21waWxlLCBvYmZ1c18kcm9vdFNjb3BlKSB7fV0pCisgKiAgICApLnRvRXF1YWwoWyckY29tcGlsZScsICckcm9vdFNjb3BlJ10pOworICogYGBgCisgKgorICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheS48c3RyaW5nfEZ1bmN0aW9uPn0gZm4gRnVuY3Rpb24gZm9yIHdoaWNoIGRlcGVuZGVudCBzZXJ2aWNlIG5hbWVzIG5lZWQgdG8KKyAqIGJlIHJldHJpZXZlZCBhcyBkZXNjcmliZWQgYWJvdmUuCisgKgorICogQHBhcmFtIHtib29sZWFuPX0gW3N0cmljdERpPWZhbHNlXSBEaXNhbGxvdyBhcmd1bWVudCBuYW1lIGFubm90YXRpb24gaW5mZXJlbmNlLgorICoKKyAqIEByZXR1cm5zIHtBcnJheS48c3RyaW5nPn0gVGhlIG5hbWVzIG9mIHRoZSBzZXJ2aWNlcyB3aGljaCB0aGUgZnVuY3Rpb24gcmVxdWlyZXMuCisgKi8KKworCisKKworLyoqCisgKiBAbmdkb2Mgc2VydmljZQorICogQG5hbWUgJHByb3ZpZGUKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBUaGUge0BsaW5rIGF1dG8uJHByb3ZpZGUgJHByb3ZpZGV9IHNlcnZpY2UgaGFzIGEgbnVtYmVyIG9mIG1ldGhvZHMgZm9yIHJlZ2lzdGVyaW5nIGNvbXBvbmVudHMKKyAqIHdpdGggdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LiBNYW55IG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgYWxzbyBleHBvc2VkIG9uCisgKiB7QGxpbmsgYW5ndWxhci5Nb2R1bGV9LgorICoKKyAqIEFuIEFuZ3VsYXIgKipzZXJ2aWNlKiogaXMgYSBzaW5nbGV0b24gb2JqZWN0IGNyZWF0ZWQgYnkgYSAqKnNlcnZpY2UgZmFjdG9yeSoqLiAgVGhlc2UgKipzZXJ2aWNlCisgKiBmYWN0b3JpZXMqKiBhcmUgZnVuY3Rpb25zIHdoaWNoLCBpbiB0dXJuLCBhcmUgY3JlYXRlZCBieSBhICoqc2VydmljZSBwcm92aWRlcioqLgorICogVGhlICoqc2VydmljZSBwcm92aWRlcnMqKiBhcmUgY29uc3RydWN0b3IgZnVuY3Rpb25zLiBXaGVuIGluc3RhbnRpYXRlZCB0aGV5IG11c3QgY29udGFpbiBhCisgKiBwcm9wZXJ0eSBjYWxsZWQgYCRnZXRgLCB3aGljaCBob2xkcyB0aGUgKipzZXJ2aWNlIGZhY3RvcnkqKiBmdW5jdGlvbi4KKyAqCisgKiBXaGVuIHlvdSByZXF1ZXN0IGEgc2VydmljZSwgdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9IGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIHRoZQorICogY29ycmVjdCAqKnNlcnZpY2UgcHJvdmlkZXIqKiwgaW5zdGFudGlhdGluZyBpdCBhbmQgdGhlbiBjYWxsaW5nIGl0cyBgJGdldGAgKipzZXJ2aWNlIGZhY3RvcnkqKgorICogZnVuY3Rpb24gdG8gZ2V0IHRoZSBpbnN0YW5jZSBvZiB0aGUgKipzZXJ2aWNlKiouCisgKgorICogT2Z0ZW4gc2VydmljZXMgaGF2ZSBubyBjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kIHRoZXJlIGlzIG5vIG5lZWQgdG8gYWRkIG1ldGhvZHMgdG8gdGhlIHNlcnZpY2UKKyAqIHByb3ZpZGVyLiAgVGhlIHByb3ZpZGVyIHdpbGwgYmUgbm8gbW9yZSB0aGFuIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gd2l0aCBhIGAkZ2V0YCBwcm9wZXJ0eS4gRm9yCisgKiB0aGVzZSBjYXNlcyB0aGUge0BsaW5rIGF1dG8uJHByb3ZpZGUgJHByb3ZpZGV9IHNlcnZpY2UgaGFzIGFkZGl0aW9uYWwgaGVscGVyIG1ldGhvZHMgdG8gcmVnaXN0ZXIKKyAqIHNlcnZpY2VzIHdpdGhvdXQgc3BlY2lmeWluZyBhIHByb3ZpZGVyLgorICoKKyAqICoge0BsaW5rIGF1dG8uJHByb3ZpZGUjcHJvdmlkZXIgcHJvdmlkZXIocHJvdmlkZXIpfSAtIHJlZ2lzdGVycyBhICoqc2VydmljZSBwcm92aWRlcioqIHdpdGggdGhlCisgKiAgICAge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0KKyAqICoge0BsaW5rIGF1dG8uJHByb3ZpZGUjY29uc3RhbnQgY29uc3RhbnQob2JqKX0gLSByZWdpc3RlcnMgYSB2YWx1ZS9vYmplY3QgdGhhdCBjYW4gYmUgYWNjZXNzZWQgYnkKKyAqICAgICBwcm92aWRlcnMgYW5kIHNlcnZpY2VzLgorICogKiB7QGxpbmsgYXV0by4kcHJvdmlkZSN2YWx1ZSB2YWx1ZShvYmopfSAtIHJlZ2lzdGVycyBhIHZhbHVlL29iamVjdCB0aGF0IGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5CisgKiAgICAgc2VydmljZXMsIG5vdCBwcm92aWRlcnMuCisgKiAqIHtAbGluayBhdXRvLiRwcm92aWRlI2ZhY3RvcnkgZmFjdG9yeShmbil9IC0gcmVnaXN0ZXJzIGEgc2VydmljZSAqKmZhY3RvcnkgZnVuY3Rpb24qKiwgYGZuYCwKKyAqICAgICB0aGF0IHdpbGwgYmUgd3JhcHBlZCBpbiBhICoqc2VydmljZSBwcm92aWRlcioqIG9iamVjdCwgd2hvc2UgYCRnZXRgIHByb3BlcnR5IHdpbGwgY29udGFpbiB0aGUKKyAqICAgICBnaXZlbiBmYWN0b3J5IGZ1bmN0aW9uLgorICogKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNzZXJ2aWNlIHNlcnZpY2UoY2xhc3MpfSAtIHJlZ2lzdGVycyBhICoqY29uc3RydWN0b3IgZnVuY3Rpb24qKiwgYGNsYXNzYAorICogICAgIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGluIGEgKipzZXJ2aWNlIHByb3ZpZGVyKiogb2JqZWN0LCB3aG9zZSBgJGdldGAgcHJvcGVydHkgd2lsbCBpbnN0YW50aWF0ZQorICogICAgICBhIG5ldyBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorICoKKyAqIFNlZSB0aGUgaW5kaXZpZHVhbCBtZXRob2RzIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlcy4KKyAqLworCisvKioKKyAqIEBuZ2RvYyBtZXRob2QKKyAqIEBuYW1lICRwcm92aWRlI3Byb3ZpZGVyCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBSZWdpc3RlciBhICoqcHJvdmlkZXIgZnVuY3Rpb24qKiB3aXRoIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfS4gUHJvdmlkZXIgZnVuY3Rpb25zCisgKiBhcmUgY29uc3RydWN0b3IgZnVuY3Rpb25zLCB3aG9zZSBpbnN0YW5jZXMgYXJlIHJlc3BvbnNpYmxlIGZvciAicHJvdmlkaW5nIiBhIGZhY3RvcnkgZm9yIGEKKyAqIHNlcnZpY2UuCisgKgorICogU2VydmljZSBwcm92aWRlciBuYW1lcyBzdGFydCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoZXkgcHJvdmlkZSBmb2xsb3dlZCBieSBgUHJvdmlkZXJgLgorICogRm9yIGV4YW1wbGUsIHRoZSB7QGxpbmsgbmcuJGxvZyAkbG9nfSBzZXJ2aWNlIGhhcyBhIHByb3ZpZGVyIGNhbGxlZAorICoge0BsaW5rIG5nLiRsb2dQcm92aWRlciAkbG9nUHJvdmlkZXJ9LgorICoKKyAqIFNlcnZpY2UgcHJvdmlkZXIgb2JqZWN0cyBjYW4gaGF2ZSBhZGRpdGlvbmFsIG1ldGhvZHMgd2hpY2ggYWxsb3cgY29uZmlndXJhdGlvbiBvZiB0aGUgcHJvdmlkZXIKKyAqIGFuZCBpdHMgc2VydmljZS4gSW1wb3J0YW50bHksIHlvdSBjYW4gY29uZmlndXJlIHdoYXQga2luZCBvZiBzZXJ2aWNlIGlzIGNyZWF0ZWQgYnkgdGhlIGAkZ2V0YAorICogbWV0aG9kLCBvciBob3cgdGhhdCBzZXJ2aWNlIHdpbGwgYWN0LiBGb3IgZXhhbXBsZSwgdGhlIHtAbGluayBuZy4kbG9nUHJvdmlkZXIgJGxvZ1Byb3ZpZGVyfSBoYXMgYQorICogbWV0aG9kIHtAbGluayBuZy4kbG9nUHJvdmlkZXIjZGVidWdFbmFibGVkIGRlYnVnRW5hYmxlZH0KKyAqIHdoaWNoIGxldHMgeW91IHNwZWNpZnkgd2hldGhlciB0aGUge0BsaW5rIG5nLiRsb2cgJGxvZ30gc2VydmljZSB3aWxsIGxvZyBkZWJ1ZyBtZXNzYWdlcyB0byB0aGUKKyAqIGNvbnNvbGUgb3Igbm90LgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZS4gTk9URTogdGhlIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIHVuZGVyIGBuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICdQcm92aWRlcidgIGtleS4KKyAqIEBwYXJhbSB7KE9iamVjdHxmdW5jdGlvbigpKX0gcHJvdmlkZXIgSWYgdGhlIHByb3ZpZGVyIGlzOgorICoKKyAqICAgLSBgT2JqZWN0YDogdGhlbiBpdCBzaG91bGQgaGF2ZSBhIGAkZ2V0YCBtZXRob2QuIFRoZSBgJGdldGAgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCB1c2luZworICogICAgIHtAbGluayBhdXRvLiRpbmplY3RvciNpbnZva2UgJGluamVjdG9yLmludm9rZSgpfSB3aGVuIGFuIGluc3RhbmNlIG5lZWRzIHRvIGJlIGNyZWF0ZWQuCisgKiAgIC0gYENvbnN0cnVjdG9yYDogYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVyIHdpbGwgYmUgY3JlYXRlZCB1c2luZworICogICAgIHtAbGluayBhdXRvLiRpbmplY3RvciNpbnN0YW50aWF0ZSAkaW5qZWN0b3IuaW5zdGFudGlhdGUoKX0sIHRoZW4gdHJlYXRlZCBhcyBgb2JqZWN0YC4KKyAqCisgKiBAcmV0dXJucyB7T2JqZWN0fSByZWdpc3RlcmVkIHByb3ZpZGVyIGluc3RhbmNlCisKKyAqIEBleGFtcGxlCisgKgorICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBjcmVhdGUgYSBzaW1wbGUgZXZlbnQgdHJhY2tpbmcgc2VydmljZSBhbmQgcmVnaXN0ZXIgaXQgdXNpbmcKKyAqIHtAbGluayBhdXRvLiRwcm92aWRlI3Byb3ZpZGVyICRwcm92aWRlLnByb3ZpZGVyKCl9LgorICoKKyAqIGBgYGpzCisgKiAgLy8gRGVmaW5lIHRoZSBldmVudFRyYWNrZXIgcHJvdmlkZXIKKyAqICBmdW5jdGlvbiBFdmVudFRyYWNrZXJQcm92aWRlcigpIHsKKyAqICAgIHZhciB0cmFja2luZ1VybCA9ICcvdHJhY2snOworICoKKyAqICAgIC8vIEEgcHJvdmlkZXIgbWV0aG9kIGZvciBjb25maWd1cmluZyB3aGVyZSB0aGUgdHJhY2tlZCBldmVudHMgc2hvdWxkIGJlZW4gc2F2ZWQKKyAqICAgIHRoaXMuc2V0VHJhY2tpbmdVcmwgPSBmdW5jdGlvbih1cmwpIHsKKyAqICAgICAgdHJhY2tpbmdVcmwgPSB1cmw7CisgKiAgICB9OworICoKKyAqICAgIC8vIFRoZSBzZXJ2aWNlIGZhY3RvcnkgZnVuY3Rpb24KKyAqICAgIHRoaXMuJGdldCA9IFsnJGh0dHAnLCBmdW5jdGlvbigkaHR0cCkgeworICogICAgICB2YXIgdHJhY2tlZEV2ZW50cyA9IHt9OworICogICAgICByZXR1cm4geworICogICAgICAgIC8vIENhbGwgdGhpcyB0byB0cmFjayBhbiBldmVudAorICogICAgICAgIGV2ZW50OiBmdW5jdGlvbihldmVudCkgeworICogICAgICAgICAgdmFyIGNvdW50ID0gdHJhY2tlZEV2ZW50c1tldmVudF0gfHwgMDsKKyAqICAgICAgICAgIGNvdW50ICs9IDE7CisgKiAgICAgICAgICB0cmFja2VkRXZlbnRzW2V2ZW50XSA9IGNvdW50OworICogICAgICAgICAgcmV0dXJuIGNvdW50OworICogICAgICAgIH0sCisgKiAgICAgICAgLy8gQ2FsbCB0aGlzIHRvIHNhdmUgdGhlIHRyYWNrZWQgZXZlbnRzIHRvIHRoZSB0cmFja2luZ1VybAorICogICAgICAgIHNhdmU6IGZ1bmN0aW9uKCkgeworICogICAgICAgICAgJGh0dHAucG9zdCh0cmFja2luZ1VybCwgdHJhY2tlZEV2ZW50cyk7CisgKiAgICAgICAgfQorICogICAgICB9OworICogICAgfV07CisgKiAgfQorICoKKyAqICBkZXNjcmliZSgnZXZlbnRUcmFja2VyJywgZnVuY3Rpb24oKSB7CisgKiAgICB2YXIgcG9zdFNweTsKKyAqCisgKiAgICBiZWZvcmVFYWNoKG1vZHVsZShmdW5jdGlvbigkcHJvdmlkZSkgeworICogICAgICAvLyBSZWdpc3RlciB0aGUgZXZlbnRUcmFja2VyIHByb3ZpZGVyCisgKiAgICAgICRwcm92aWRlLnByb3ZpZGVyKCdldmVudFRyYWNrZXInLCBFdmVudFRyYWNrZXJQcm92aWRlcik7CisgKiAgICB9KSk7CisgKgorICogICAgYmVmb3JlRWFjaChtb2R1bGUoZnVuY3Rpb24oZXZlbnRUcmFja2VyUHJvdmlkZXIpIHsKKyAqICAgICAgLy8gQ29uZmlndXJlIGV2ZW50VHJhY2tlciBwcm92aWRlcgorICogICAgICBldmVudFRyYWNrZXJQcm92aWRlci5zZXRUcmFja2luZ1VybCgnL2N1c3RvbS10cmFjaycpOworICogICAgfSkpOworICoKKyAqICAgIGl0KCd0cmFja3MgZXZlbnRzJywgaW5qZWN0KGZ1bmN0aW9uKGV2ZW50VHJhY2tlcikgeworICogICAgICBleHBlY3QoZXZlbnRUcmFja2VyLmV2ZW50KCdsb2dpbicpKS50b0VxdWFsKDEpOworICogICAgICBleHBlY3QoZXZlbnRUcmFja2VyLmV2ZW50KCdsb2dpbicpKS50b0VxdWFsKDIpOworICogICAgfSkpOworICoKKyAqICAgIGl0KCdzYXZlcyB0byB0aGUgdHJhY2tpbmcgdXJsJywgaW5qZWN0KGZ1bmN0aW9uKGV2ZW50VHJhY2tlciwgJGh0dHApIHsKKyAqICAgICAgcG9zdFNweSA9IHNweU9uKCRodHRwLCAncG9zdCcpOworICogICAgICBldmVudFRyYWNrZXIuZXZlbnQoJ2xvZ2luJyk7CisgKiAgICAgIGV2ZW50VHJhY2tlci5zYXZlKCk7CisgKiAgICAgIGV4cGVjdChwb3N0U3B5KS50b0hhdmVCZWVuQ2FsbGVkKCk7CisgKiAgICAgIGV4cGVjdChwb3N0U3B5Lm1vc3RSZWNlbnRDYWxsLmFyZ3NbMF0pLm5vdC50b0VxdWFsKCcvdHJhY2snKTsKKyAqICAgICAgZXhwZWN0KHBvc3RTcHkubW9zdFJlY2VudENhbGwuYXJnc1swXSkudG9FcXVhbCgnL2N1c3RvbS10cmFjaycpOworICogICAgICBleHBlY3QocG9zdFNweS5tb3N0UmVjZW50Q2FsbC5hcmdzWzFdKS50b0VxdWFsKHsgJ2xvZ2luJzogMSB9KTsKKyAqICAgIH0pKTsKKyAqICB9KTsKKyAqIGBgYAorICovCisKKy8qKgorICogQG5nZG9jIG1ldGhvZAorICogQG5hbWUgJHByb3ZpZGUjZmFjdG9yeQorICogQGRlc2NyaXB0aW9uCisgKgorICogUmVnaXN0ZXIgYSAqKnNlcnZpY2UgZmFjdG9yeSoqLCB3aGljaCB3aWxsIGJlIGNhbGxlZCB0byByZXR1cm4gdGhlIHNlcnZpY2UgaW5zdGFuY2UuCisgKiBUaGlzIGlzIHNob3J0IGZvciByZWdpc3RlcmluZyBhIHNlcnZpY2Ugd2hlcmUgaXRzIHByb3ZpZGVyIGNvbnNpc3RzIG9mIG9ubHkgYSBgJGdldGAgcHJvcGVydHksCisgKiB3aGljaCBpcyB0aGUgZ2l2ZW4gc2VydmljZSBmYWN0b3J5IGZ1bmN0aW9uLgorICogWW91IHNob3VsZCB1c2Uge0BsaW5rIGF1dG8uJHByb3ZpZGUjZmFjdG9yeSAkcHJvdmlkZS5mYWN0b3J5KGdldEZuKX0gaWYgeW91IGRvIG5vdCBuZWVkIHRvCisgKiBjb25maWd1cmUgeW91ciBzZXJ2aWNlIGluIGEgcHJvdmlkZXIuCisgKgorICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlLgorICogQHBhcmFtIHtmdW5jdGlvbigpfSAkZ2V0Rm4gVGhlICRnZXRGbiBmb3IgdGhlIGluc3RhbmNlIGNyZWF0aW9uLiBJbnRlcm5hbGx5IHRoaXMgaXMgYSBzaG9ydCBoYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYCRwcm92aWRlLnByb3ZpZGVyKG5hbWUsIHskZ2V0OiAkZ2V0Rm59KWAuCisgKiBAcmV0dXJucyB7T2JqZWN0fSByZWdpc3RlcmVkIHByb3ZpZGVyIGluc3RhbmNlCisgKgorICogQGV4YW1wbGUKKyAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiByZWdpc3RlcmluZyBhIHNlcnZpY2UKKyAqIGBgYGpzCisgKiAgICRwcm92aWRlLmZhY3RvcnkoJ3BpbmcnLCBbJyRodHRwJywgZnVuY3Rpb24oJGh0dHApIHsKKyAqICAgICByZXR1cm4gZnVuY3Rpb24gcGluZygpIHsKKyAqICAgICAgIHJldHVybiAkaHR0cC5zZW5kKCcvcGluZycpOworICogICAgIH07CisgKiAgIH1dKTsKKyAqIGBgYAorICogWW91IHdvdWxkIHRoZW4gaW5qZWN0IGFuZCB1c2UgdGhpcyBzZXJ2aWNlIGxpa2UgdGhpczoKKyAqIGBgYGpzCisgKiAgIHNvbWVNb2R1bGUuY29udHJvbGxlcignQ3RybCcsIFsncGluZycsIGZ1bmN0aW9uKHBpbmcpIHsKKyAqICAgICBwaW5nKCk7CisgKiAgIH1dKTsKKyAqIGBgYAorICovCisKKworLyoqCisgKiBAbmdkb2MgbWV0aG9kCisgKiBAbmFtZSAkcHJvdmlkZSNzZXJ2aWNlCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBSZWdpc3RlciBhICoqc2VydmljZSBjb25zdHJ1Y3RvcioqLCB3aGljaCB3aWxsIGJlIGludm9rZWQgd2l0aCBgbmV3YCB0byBjcmVhdGUgdGhlIHNlcnZpY2UKKyAqIGluc3RhbmNlLgorICogVGhpcyBpcyBzaG9ydCBmb3IgcmVnaXN0ZXJpbmcgYSBzZXJ2aWNlIHdoZXJlIGl0cyBwcm92aWRlcidzIGAkZ2V0YCBwcm9wZXJ0eSBpcyB0aGUgc2VydmljZQorICogY29uc3RydWN0b3IgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIHNlcnZpY2UgaW5zdGFuY2UuCisgKgorICogWW91IHNob3VsZCB1c2Uge0BsaW5rIGF1dG8uJHByb3ZpZGUjc2VydmljZSAkcHJvdmlkZS5zZXJ2aWNlKGNsYXNzKX0gaWYgeW91IGRlZmluZSB5b3VyIHNlcnZpY2UKKyAqIGFzIGEgdHlwZS9jbGFzcy4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UuCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvciBBIGNsYXNzIChjb25zdHJ1Y3RvciBmdW5jdGlvbikgdGhhdCB3aWxsIGJlIGluc3RhbnRpYXRlZC4KKyAqIEByZXR1cm5zIHtPYmplY3R9IHJlZ2lzdGVyZWQgcHJvdmlkZXIgaW5zdGFuY2UKKyAqCisgKiBAZXhhbXBsZQorICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIHJlZ2lzdGVyaW5nIGEgc2VydmljZSB1c2luZworICoge0BsaW5rIGF1dG8uJHByb3ZpZGUjc2VydmljZSAkcHJvdmlkZS5zZXJ2aWNlKGNsYXNzKX0uCisgKiBgYGBqcworICogICB2YXIgUGluZyA9IGZ1bmN0aW9uKCRodHRwKSB7CisgKiAgICAgdGhpcy4kaHR0cCA9ICRodHRwOworICogICB9OworICoKKyAqICAgUGluZy4kaW5qZWN0ID0gWyckaHR0cCddOworICoKKyAqICAgUGluZy5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uKCkgeworICogICAgIHJldHVybiB0aGlzLiRodHRwLmdldCgnL3BpbmcnKTsKKyAqICAgfTsKKyAqICAgJHByb3ZpZGUuc2VydmljZSgncGluZycsIFBpbmcpOworICogYGBgCisgKiBZb3Ugd291bGQgdGhlbiBpbmplY3QgYW5kIHVzZSB0aGlzIHNlcnZpY2UgbGlrZSB0aGlzOgorICogYGBganMKKyAqICAgc29tZU1vZHVsZS5jb250cm9sbGVyKCdDdHJsJywgWydwaW5nJywgZnVuY3Rpb24ocGluZykgeworICogICAgIHBpbmcuc2VuZCgpOworICogICB9XSk7CisgKiBgYGAKKyAqLworCisKKy8qKgorICogQG5nZG9jIG1ldGhvZAorICogQG5hbWUgJHByb3ZpZGUjdmFsdWUKKyAqIEBkZXNjcmlwdGlvbgorICoKKyAqIFJlZ2lzdGVyIGEgKip2YWx1ZSBzZXJ2aWNlKiogd2l0aCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0sIHN1Y2ggYXMgYSBzdHJpbmcsIGEKKyAqIG51bWJlciwgYW4gYXJyYXksIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLiAgVGhpcyBpcyBzaG9ydCBmb3IgcmVnaXN0ZXJpbmcgYSBzZXJ2aWNlIHdoZXJlIGl0cworICogcHJvdmlkZXIncyBgJGdldGAgcHJvcGVydHkgaXMgYSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSAqKnZhbHVlCisgKiBzZXJ2aWNlKiouCisgKgorICogVmFsdWUgc2VydmljZXMgYXJlIHNpbWlsYXIgdG8gY29uc3RhbnQgc2VydmljZXMsIGV4Y2VwdCB0aGF0IHRoZXkgY2Fubm90IGJlIGluamVjdGVkIGludG8gYQorICogbW9kdWxlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKHNlZSB7QGxpbmsgYW5ndWxhci5Nb2R1bGUjY29uZmlnfSkgYnV0IHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gYnkKKyAqIGFuIEFuZ3VsYXIKKyAqIHtAbGluayBhdXRvLiRwcm92aWRlI2RlY29yYXRvciBkZWNvcmF0b3J9LgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZS4KKyAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlLgorICogQHJldHVybnMge09iamVjdH0gcmVnaXN0ZXJlZCBwcm92aWRlciBpbnN0YW5jZQorICoKKyAqIEBleGFtcGxlCisgKiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGNyZWF0aW5nIHZhbHVlIHNlcnZpY2VzLgorICogYGBganMKKyAqICAgJHByb3ZpZGUudmFsdWUoJ0FETUlOX1VTRVInLCAnYWRtaW4nKTsKKyAqCisgKiAgICRwcm92aWRlLnZhbHVlKCdSb2xlTG9va3VwJywgeyBhZG1pbjogMCwgd3JpdGVyOiAxLCByZWFkZXI6IDIgfSk7CisgKgorICogICAkcHJvdmlkZS52YWx1ZSgnaGFsZk9mJywgZnVuY3Rpb24odmFsdWUpIHsKKyAqICAgICByZXR1cm4gdmFsdWUgLyAyOworICogICB9KTsKKyAqIGBgYAorICovCisKKworLyoqCisgKiBAbmdkb2MgbWV0aG9kCisgKiBAbmFtZSAkcHJvdmlkZSNjb25zdGFudAorICogQGRlc2NyaXB0aW9uCisgKgorICogUmVnaXN0ZXIgYSAqKmNvbnN0YW50IHNlcnZpY2UqKiwgc3VjaCBhcyBhIHN0cmluZywgYSBudW1iZXIsIGFuIGFycmF5LCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwKKyAqIHdpdGggdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LiBVbmxpa2Uge0BsaW5rIGF1dG8uJHByb3ZpZGUjdmFsdWUgdmFsdWV9IGl0IGNhbiBiZQorICogaW5qZWN0ZWQgaW50byBhIG1vZHVsZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uIChzZWUge0BsaW5rIGFuZ3VsYXIuTW9kdWxlI2NvbmZpZ30pIGFuZCBpdCBjYW5ub3QKKyAqIGJlIG92ZXJyaWRkZW4gYnkgYW4gQW5ndWxhciB7QGxpbmsgYXV0by4kcHJvdmlkZSNkZWNvcmF0b3IgZGVjb3JhdG9yfS4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29uc3RhbnQuCisgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBjb25zdGFudCB2YWx1ZS4KKyAqIEByZXR1cm5zIHtPYmplY3R9IHJlZ2lzdGVyZWQgaW5zdGFuY2UKKyAqCisgKiBAZXhhbXBsZQorICogSGVyZSBhIHNvbWUgZXhhbXBsZXMgb2YgY3JlYXRpbmcgY29uc3RhbnRzOgorICogYGBganMKKyAqICAgJHByb3ZpZGUuY29uc3RhbnQoJ1NIQVJEX0hFSUdIVCcsIDMwNik7CisgKgorICogICAkcHJvdmlkZS5jb25zdGFudCgnTVlfQ09MT1VSUycsIFsncmVkJywgJ2JsdWUnLCAnZ3JleSddKTsKKyAqCisgKiAgICRwcm92aWRlLmNvbnN0YW50KCdkb3VibGUnLCBmdW5jdGlvbih2YWx1ZSkgeworICogICAgIHJldHVybiB2YWx1ZSAqIDI7CisgKiAgIH0pOworICogYGBgCisgKi8KKworCisvKioKKyAqIEBuZ2RvYyBtZXRob2QKKyAqIEBuYW1lICRwcm92aWRlI2RlY29yYXRvcgorICogQGRlc2NyaXB0aW9uCisgKgorICogUmVnaXN0ZXIgYSAqKnNlcnZpY2UgZGVjb3JhdG9yKiogd2l0aCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uIEEgc2VydmljZSBkZWNvcmF0b3IKKyAqIGludGVyY2VwdHMgdGhlIGNyZWF0aW9uIG9mIGEgc2VydmljZSwgYWxsb3dpbmcgaXQgdG8gb3ZlcnJpZGUgb3IgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlCisgKiBzZXJ2aWNlLiBUaGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBkZWNvcmF0b3IgbWF5IGJlIHRoZSBvcmlnaW5hbCBzZXJ2aWNlLCBvciBhIG5ldyBzZXJ2aWNlCisgKiBvYmplY3Qgd2hpY2ggcmVwbGFjZXMgb3Igd3JhcHMgYW5kIGRlbGVnYXRlcyB0byB0aGUgb3JpZ2luYWwgc2VydmljZS4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSB0byBkZWNvcmF0ZS4KKyAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gZGVjb3JhdG9yIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHNlcnZpY2UgbmVlZHMgdG8gYmUKKyAqICAgIGluc3RhbnRpYXRlZCBhbmQgc2hvdWxkIHJldHVybiB0aGUgZGVjb3JhdGVkIHNlcnZpY2UgaW5zdGFuY2UuIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgdXNpbmcKKyAqICAgIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3IjaW52b2tlIGluamVjdG9yLmludm9rZX0gbWV0aG9kIGFuZCBpcyB0aGVyZWZvcmUgZnVsbHkgaW5qZWN0YWJsZS4KKyAqICAgIExvY2FsIGluamVjdGlvbiBhcmd1bWVudHM6CisgKgorICogICAgKiBgJGRlbGVnYXRlYCAtIFRoZSBvcmlnaW5hbCBzZXJ2aWNlIGluc3RhbmNlLCB3aGljaCBjYW4gYmUgbW9ua2V5IHBhdGNoZWQsIGNvbmZpZ3VyZWQsCisgKiAgICAgIGRlY29yYXRlZCBvciBkZWxlZ2F0ZWQgdG8uCisgKgorICogQGV4YW1wbGUKKyAqIEhlcmUgd2UgZGVjb3JhdGUgdGhlIHtAbGluayBuZy4kbG9nICRsb2d9IHNlcnZpY2UgdG8gY29udmVydCB3YXJuaW5ncyB0byBlcnJvcnMgYnkgaW50ZXJjZXB0aW5nCisgKiBjYWxscyB0byB7QGxpbmsgbmcuJGxvZyNlcnJvciAkbG9nLndhcm4oKX0uCisgKiBgYGBqcworICogICAkcHJvdmlkZS5kZWNvcmF0b3IoJyRsb2cnLCBbJyRkZWxlZ2F0ZScsIGZ1bmN0aW9uKCRkZWxlZ2F0ZSkgeworICogICAgICRkZWxlZ2F0ZS53YXJuID0gJGRlbGVnYXRlLmVycm9yOworICogICAgIHJldHVybiAkZGVsZWdhdGU7CisgKiAgIH1dKTsKKyAqIGBgYAorICovCisKKworZnVuY3Rpb24gY3JlYXRlSW5qZWN0b3IobW9kdWxlc1RvTG9hZCwgc3RyaWN0RGkpIHsKKyAgc3RyaWN0RGkgPSAoc3RyaWN0RGkgPT09IHRydWUpOworICB2YXIgSU5TVEFOVElBVElORyA9IHt9LAorICAgICAgcHJvdmlkZXJTdWZmaXggPSAnUHJvdmlkZXInLAorICAgICAgcGF0aCA9IFtdLAorICAgICAgbG9hZGVkTW9kdWxlcyA9IG5ldyBIYXNoTWFwKFtdLCB0cnVlKSwKKyAgICAgIHByb3ZpZGVyQ2FjaGUgPSB7CisgICAgICAgICRwcm92aWRlOiB7CisgICAgICAgICAgICBwcm92aWRlcjogc3VwcG9ydE9iamVjdChwcm92aWRlciksCisgICAgICAgICAgICBmYWN0b3J5OiBzdXBwb3J0T2JqZWN0KGZhY3RvcnkpLAorICAgICAgICAgICAgc2VydmljZTogc3VwcG9ydE9iamVjdChzZXJ2aWNlKSwKKyAgICAgICAgICAgIHZhbHVlOiBzdXBwb3J0T2JqZWN0KHZhbHVlKSwKKyAgICAgICAgICAgIGNvbnN0YW50OiBzdXBwb3J0T2JqZWN0KGNvbnN0YW50KSwKKyAgICAgICAgICAgIGRlY29yYXRvcjogZGVjb3JhdG9yCisgICAgICAgICAgfQorICAgICAgfSwKKyAgICAgIHByb3ZpZGVySW5qZWN0b3IgPSAocHJvdmlkZXJDYWNoZS4kaW5qZWN0b3IgPQorICAgICAgICAgIGNyZWF0ZUludGVybmFsSW5qZWN0b3IocHJvdmlkZXJDYWNoZSwgZnVuY3Rpb24oc2VydmljZU5hbWUsIGNhbGxlcikgeworICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNTdHJpbmcoY2FsbGVyKSkgeworICAgICAgICAgICAgICBwYXRoLnB1c2goY2FsbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93ICRpbmplY3Rvck1pbkVycigndW5wcicsICJVbmtub3duIHByb3ZpZGVyOiB7MH0iLCBwYXRoLmpvaW4oJyA8LSAnKSk7CisgICAgICAgICAgfSkpLAorICAgICAgaW5zdGFuY2VDYWNoZSA9IHt9LAorICAgICAgaW5zdGFuY2VJbmplY3RvciA9IChpbnN0YW5jZUNhY2hlLiRpbmplY3RvciA9CisgICAgICAgICAgY3JlYXRlSW50ZXJuYWxJbmplY3RvcihpbnN0YW5jZUNhY2hlLCBmdW5jdGlvbihzZXJ2aWNlTmFtZSwgY2FsbGVyKSB7CisgICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBwcm92aWRlckluamVjdG9yLmdldChzZXJ2aWNlTmFtZSArIHByb3ZpZGVyU3VmZml4LCBjYWxsZXIpOworICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlSW5qZWN0b3IuaW52b2tlKHByb3ZpZGVyLiRnZXQsIHByb3ZpZGVyLCB1bmRlZmluZWQsIHNlcnZpY2VOYW1lKTsKKyAgICAgICAgICB9KSk7CisKKworICBmb3JFYWNoKGxvYWRNb2R1bGVzKG1vZHVsZXNUb0xvYWQpLCBmdW5jdGlvbihmbikgeyBpbnN0YW5jZUluamVjdG9yLmludm9rZShmbiB8fCBub29wKTsgfSk7CisKKyAgcmV0dXJuIGluc3RhbmNlSW5qZWN0b3I7CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vICRwcm92aWRlcgorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICBmdW5jdGlvbiBzdXBwb3J0T2JqZWN0KGRlbGVnYXRlKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICAgIGlmIChpc09iamVjdChrZXkpKSB7CisgICAgICAgIGZvckVhY2goa2V5LCByZXZlcnNlUGFyYW1zKGRlbGVnYXRlKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoa2V5LCB2YWx1ZSk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIHByb3ZpZGVyKG5hbWUsIHByb3ZpZGVyXykgeworICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KG5hbWUsICdzZXJ2aWNlJyk7CisgICAgaWYgKGlzRnVuY3Rpb24ocHJvdmlkZXJfKSB8fCBpc0FycmF5KHByb3ZpZGVyXykpIHsKKyAgICAgIHByb3ZpZGVyXyA9IHByb3ZpZGVySW5qZWN0b3IuaW5zdGFudGlhdGUocHJvdmlkZXJfKTsKKyAgICB9CisgICAgaWYgKCFwcm92aWRlcl8uJGdldCkgeworICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCdwZ2V0JywgIlByb3ZpZGVyICd7MH0nIG11c3QgZGVmaW5lICRnZXQgZmFjdG9yeSBtZXRob2QuIiwgbmFtZSk7CisgICAgfQorICAgIHJldHVybiBwcm92aWRlckNhY2hlW25hbWUgKyBwcm92aWRlclN1ZmZpeF0gPSBwcm92aWRlcl87CisgIH0KKworICBmdW5jdGlvbiBlbmZvcmNlUmV0dXJuVmFsdWUobmFtZSwgZmFjdG9yeSkgeworICAgIHJldHVybiBmdW5jdGlvbiBlbmZvcmNlZFJldHVyblZhbHVlKCkgeworICAgICAgdmFyIHJlc3VsdCA9IGluc3RhbmNlSW5qZWN0b3IuaW52b2tlKGZhY3RvcnksIHRoaXMpOworICAgICAgaWYgKGlzVW5kZWZpbmVkKHJlc3VsdCkpIHsKKyAgICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCd1bmRlZicsICJQcm92aWRlciAnezB9JyBtdXN0IHJldHVybiBhIHZhbHVlIGZyb20gJGdldCBmYWN0b3J5IG1ldGhvZC4iLCBuYW1lKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfTsKKyAgfQorCisgIGZ1bmN0aW9uIGZhY3RvcnkobmFtZSwgZmFjdG9yeUZuLCBlbmZvcmNlKSB7CisgICAgcmV0dXJuIHByb3ZpZGVyKG5hbWUsIHsKKyAgICAgICRnZXQ6IGVuZm9yY2UgIT09IGZhbHNlID8gZW5mb3JjZVJldHVyblZhbHVlKG5hbWUsIGZhY3RvcnlGbikgOiBmYWN0b3J5Rm4KKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIHNlcnZpY2UobmFtZSwgY29uc3RydWN0b3IpIHsKKyAgICByZXR1cm4gZmFjdG9yeShuYW1lLCBbJyRpbmplY3RvcicsIGZ1bmN0aW9uKCRpbmplY3RvcikgeworICAgICAgcmV0dXJuICRpbmplY3Rvci5pbnN0YW50aWF0ZShjb25zdHJ1Y3Rvcik7CisgICAgfV0pOworICB9CisKKyAgZnVuY3Rpb24gdmFsdWUobmFtZSwgdmFsKSB7IHJldHVybiBmYWN0b3J5KG5hbWUsIHZhbHVlRm4odmFsKSwgZmFsc2UpOyB9CisKKyAgZnVuY3Rpb24gY29uc3RhbnQobmFtZSwgdmFsdWUpIHsKKyAgICBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eShuYW1lLCAnY29uc3RhbnQnKTsKKyAgICBwcm92aWRlckNhY2hlW25hbWVdID0gdmFsdWU7CisgICAgaW5zdGFuY2VDYWNoZVtuYW1lXSA9IHZhbHVlOworICB9CisKKyAgZnVuY3Rpb24gZGVjb3JhdG9yKHNlcnZpY2VOYW1lLCBkZWNvckZuKSB7CisgICAgdmFyIG9yaWdQcm92aWRlciA9IHByb3ZpZGVySW5qZWN0b3IuZ2V0KHNlcnZpY2VOYW1lICsgcHJvdmlkZXJTdWZmaXgpLAorICAgICAgICBvcmlnJGdldCA9IG9yaWdQcm92aWRlci4kZ2V0OworCisgICAgb3JpZ1Byb3ZpZGVyLiRnZXQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBvcmlnSW5zdGFuY2UgPSBpbnN0YW5jZUluamVjdG9yLmludm9rZShvcmlnJGdldCwgb3JpZ1Byb3ZpZGVyKTsKKyAgICAgIHJldHVybiBpbnN0YW5jZUluamVjdG9yLmludm9rZShkZWNvckZuLCBudWxsLCB7JGRlbGVnYXRlOiBvcmlnSW5zdGFuY2V9KTsKKyAgICB9OworICB9CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vIE1vZHVsZSBMb2FkaW5nCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICBmdW5jdGlvbiBsb2FkTW9kdWxlcyhtb2R1bGVzVG9Mb2FkKSB7CisgICAgdmFyIHJ1bkJsb2NrcyA9IFtdLCBtb2R1bGVGbjsKKyAgICBmb3JFYWNoKG1vZHVsZXNUb0xvYWQsIGZ1bmN0aW9uKG1vZHVsZSkgeworICAgICAgaWYgKGxvYWRlZE1vZHVsZXMuZ2V0KG1vZHVsZSkpIHJldHVybjsKKyAgICAgIGxvYWRlZE1vZHVsZXMucHV0KG1vZHVsZSwgdHJ1ZSk7CisKKyAgICAgIGZ1bmN0aW9uIHJ1bkludm9rZVF1ZXVlKHF1ZXVlKSB7CisgICAgICAgIHZhciBpLCBpaTsKKyAgICAgICAgZm9yIChpID0gMCwgaWkgPSBxdWV1ZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgdmFyIGludm9rZUFyZ3MgPSBxdWV1ZVtpXSwKKyAgICAgICAgICAgICAgcHJvdmlkZXIgPSBwcm92aWRlckluamVjdG9yLmdldChpbnZva2VBcmdzWzBdKTsKKworICAgICAgICAgIHByb3ZpZGVyW2ludm9rZUFyZ3NbMV1dLmFwcGx5KHByb3ZpZGVyLCBpbnZva2VBcmdzWzJdKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBpZiAoaXNTdHJpbmcobW9kdWxlKSkgeworICAgICAgICAgIG1vZHVsZUZuID0gYW5ndWxhck1vZHVsZShtb2R1bGUpOworICAgICAgICAgIHJ1bkJsb2NrcyA9IHJ1bkJsb2Nrcy5jb25jYXQobG9hZE1vZHVsZXMobW9kdWxlRm4ucmVxdWlyZXMpKS5jb25jYXQobW9kdWxlRm4uX3J1bkJsb2Nrcyk7CisgICAgICAgICAgcnVuSW52b2tlUXVldWUobW9kdWxlRm4uX2ludm9rZVF1ZXVlKTsKKyAgICAgICAgICBydW5JbnZva2VRdWV1ZShtb2R1bGVGbi5fY29uZmlnQmxvY2tzKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKG1vZHVsZSkpIHsKKyAgICAgICAgICAgIHJ1bkJsb2Nrcy5wdXNoKHByb3ZpZGVySW5qZWN0b3IuaW52b2tlKG1vZHVsZSkpOworICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkobW9kdWxlKSkgeworICAgICAgICAgICAgcnVuQmxvY2tzLnB1c2gocHJvdmlkZXJJbmplY3Rvci5pbnZva2UobW9kdWxlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXNzZXJ0QXJnRm4obW9kdWxlLCAnbW9kdWxlJyk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgaWYgKGlzQXJyYXkobW9kdWxlKSkgeworICAgICAgICAgIG1vZHVsZSA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGUubWVzc2FnZSAmJiBlLnN0YWNrICYmIGUuc3RhY2suaW5kZXhPZihlLm1lc3NhZ2UpID09IC0xKSB7CisgICAgICAgICAgLy8gU2FmYXJpICYgRkYncyBzdGFjayB0cmFjZXMgZG9uJ3QgY29udGFpbiBlcnJvci5tZXNzYWdlIGNvbnRlbnQKKyAgICAgICAgICAvLyB1bmxpa2UgdGhvc2Ugb2YgQ2hyb21lIGFuZCBJRQorICAgICAgICAgIC8vIFNvIGlmIHN0YWNrIGRvZXNuJ3QgY29udGFpbiBtZXNzYWdlLCB3ZSBjcmVhdGUgYSBuZXcgc3RyaW5nIHRoYXQgY29udGFpbnMgYm90aC4KKyAgICAgICAgICAvLyBTaW5jZSBlcnJvci5zdGFjayBpcyByZWFkLW9ubHkgaW4gU2FmYXJpLCBJJ20gb3ZlcnJpZGluZyBlIGFuZCBub3QgZS5zdGFjayBoZXJlLgorICAgICAgICAgIC8qIGpzaGludCAtVzAyMiAqLworICAgICAgICAgIGUgPSBlLm1lc3NhZ2UgKyAnXG4nICsgZS5zdGFjazsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ21vZHVsZXJyJywgIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBtb2R1bGUgezB9IGR1ZSB0bzpcbnsxfSIsCisgICAgICAgICAgICAgICAgICBtb2R1bGUsIGUuc3RhY2sgfHwgZS5tZXNzYWdlIHx8IGUpOworICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBydW5CbG9ja3M7CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gaW50ZXJuYWwgSW5qZWN0b3IKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgZnVuY3Rpb24gY3JlYXRlSW50ZXJuYWxJbmplY3RvcihjYWNoZSwgZmFjdG9yeSkgeworCisgICAgZnVuY3Rpb24gZ2V0U2VydmljZShzZXJ2aWNlTmFtZSwgY2FsbGVyKSB7CisgICAgICBpZiAoY2FjaGUuaGFzT3duUHJvcGVydHkoc2VydmljZU5hbWUpKSB7CisgICAgICAgIGlmIChjYWNoZVtzZXJ2aWNlTmFtZV0gPT09IElOU1RBTlRJQVRJTkcpIHsKKyAgICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ2NkZXAnLCAnQ2lyY3VsYXIgZGVwZW5kZW5jeSBmb3VuZDogezB9JywKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgKyAnIDwtICcgKyBwYXRoLmpvaW4oJyA8LSAnKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNhY2hlW3NlcnZpY2VOYW1lXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcGF0aC51bnNoaWZ0KHNlcnZpY2VOYW1lKTsKKyAgICAgICAgICBjYWNoZVtzZXJ2aWNlTmFtZV0gPSBJTlNUQU5USUFUSU5HOworICAgICAgICAgIHJldHVybiBjYWNoZVtzZXJ2aWNlTmFtZV0gPSBmYWN0b3J5KHNlcnZpY2VOYW1lLCBjYWxsZXIpOworICAgICAgICB9IGNhdGNoIChlcnIpIHsKKyAgICAgICAgICBpZiAoY2FjaGVbc2VydmljZU5hbWVdID09PSBJTlNUQU5USUFUSU5HKSB7CisgICAgICAgICAgICBkZWxldGUgY2FjaGVbc2VydmljZU5hbWVdOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgcGF0aC5zaGlmdCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gaW52b2tlKGZuLCBzZWxmLCBsb2NhbHMsIHNlcnZpY2VOYW1lKSB7CisgICAgICBpZiAodHlwZW9mIGxvY2FscyA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgc2VydmljZU5hbWUgPSBsb2NhbHM7CisgICAgICAgIGxvY2FscyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHZhciBhcmdzID0gW10sCisgICAgICAgICAgJGluamVjdCA9IGFubm90YXRlKGZuLCBzdHJpY3REaSwgc2VydmljZU5hbWUpLAorICAgICAgICAgIGxlbmd0aCwgaSwKKyAgICAgICAgICBrZXk7CisKKyAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9ICRpbmplY3QubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAga2V5ID0gJGluamVjdFtpXTsKKyAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCdpdGtuJywKKyAgICAgICAgICAgICAgICAgICdJbmNvcnJlY3QgaW5qZWN0aW9uIHRva2VuISBFeHBlY3RlZCBzZXJ2aWNlIG5hbWUgYXMgc3RyaW5nLCBnb3QgezB9Jywga2V5KTsKKyAgICAgICAgfQorICAgICAgICBhcmdzLnB1c2goCisgICAgICAgICAgbG9jYWxzICYmIGxvY2Fscy5oYXNPd25Qcm9wZXJ0eShrZXkpCisgICAgICAgICAgPyBsb2NhbHNba2V5XQorICAgICAgICAgIDogZ2V0U2VydmljZShrZXksIHNlcnZpY2VOYW1lKQorICAgICAgICApOworICAgICAgfQorICAgICAgaWYgKGlzQXJyYXkoZm4pKSB7CisgICAgICAgIGZuID0gZm5bbGVuZ3RoXTsKKyAgICAgIH0KKworICAgICAgLy8gaHR0cDovL2pzcGVyZi5jb20vYW5ndWxhcmpzLWludm9rZS1hcHBseS12cy1zd2l0Y2gKKyAgICAgIC8vICM1Mzg4CisgICAgICByZXR1cm4gZm4uYXBwbHkoc2VsZiwgYXJncyk7CisgICAgfQorCisgICAgZnVuY3Rpb24gaW5zdGFudGlhdGUoVHlwZSwgbG9jYWxzLCBzZXJ2aWNlTmFtZSkgeworICAgICAgLy8gQ2hlY2sgaWYgVHlwZSBpcyBhbm5vdGF0ZWQgYW5kIHVzZSBqdXN0IHRoZSBnaXZlbiBmdW5jdGlvbiBhdCBuLTEgYXMgcGFyYW1ldGVyCisgICAgICAvLyBlLmcuIHNvbWVNb2R1bGUuZmFjdG9yeSgnZ3JlZXRlcicsIFsnJHdpbmRvdycsIGZ1bmN0aW9uKHJlbmFtZWQkd2luZG93KSB7fV0pOworICAgICAgLy8gT2JqZWN0IGNyZWF0aW9uOiBodHRwOi8vanNwZXJmLmNvbS9jcmVhdGUtY29uc3RydWN0b3IvMgorICAgICAgdmFyIGluc3RhbmNlID0gT2JqZWN0LmNyZWF0ZSgoaXNBcnJheShUeXBlKSA/IFR5cGVbVHlwZS5sZW5ndGggLSAxXSA6IFR5cGUpLnByb3RvdHlwZSk7CisgICAgICB2YXIgcmV0dXJuZWRWYWx1ZSA9IGludm9rZShUeXBlLCBpbnN0YW5jZSwgbG9jYWxzLCBzZXJ2aWNlTmFtZSk7CisKKyAgICAgIHJldHVybiBpc09iamVjdChyZXR1cm5lZFZhbHVlKSB8fCBpc0Z1bmN0aW9uKHJldHVybmVkVmFsdWUpID8gcmV0dXJuZWRWYWx1ZSA6IGluc3RhbmNlOworICAgIH0KKworICAgIHJldHVybiB7CisgICAgICBpbnZva2U6IGludm9rZSwKKyAgICAgIGluc3RhbnRpYXRlOiBpbnN0YW50aWF0ZSwKKyAgICAgIGdldDogZ2V0U2VydmljZSwKKyAgICAgIGFubm90YXRlOiBhbm5vdGF0ZSwKKyAgICAgIGhhczogZnVuY3Rpb24obmFtZSkgeworICAgICAgICByZXR1cm4gcHJvdmlkZXJDYWNoZS5oYXNPd25Qcm9wZXJ0eShuYW1lICsgcHJvdmlkZXJTdWZmaXgpIHx8IGNhY2hlLmhhc093blByb3BlcnR5KG5hbWUpOworICAgICAgfQorICAgIH07CisgIH0KK30KKworY3JlYXRlSW5qZWN0b3IuJCRhbm5vdGF0ZSA9IGFubm90YXRlOworCisvKioKKyAqIEBuZ2RvYyBwcm92aWRlcgorICogQG5hbWUgJGFuY2hvclNjcm9sbFByb3ZpZGVyCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBVc2UgYCRhbmNob3JTY3JvbGxQcm92aWRlcmAgdG8gZGlzYWJsZSBhdXRvbWF0aWMgc2Nyb2xsaW5nIHdoZW5ldmVyCisgKiB7QGxpbmsgbmcuJGxvY2F0aW9uI2hhc2ggJGxvY2F0aW9uLmhhc2goKX0gY2hhbmdlcy4KKyAqLworZnVuY3Rpb24gJEFuY2hvclNjcm9sbFByb3ZpZGVyKCkgeworCisgIHZhciBhdXRvU2Nyb2xsaW5nRW5hYmxlZCA9IHRydWU7CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgJGFuY2hvclNjcm9sbFByb3ZpZGVyI2Rpc2FibGVBdXRvU2Nyb2xsaW5nCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBCeSBkZWZhdWx0LCB7QGxpbmsgbmcuJGFuY2hvclNjcm9sbCAkYW5jaG9yU2Nyb2xsKCl9IHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgY2hhbmdlcyB0bworICAgKiB7QGxpbmsgbmcuJGxvY2F0aW9uI2hhc2ggJGxvY2F0aW9uLmhhc2goKX0gYW5kIHNjcm9sbCB0byB0aGUgZWxlbWVudCBtYXRjaGluZyB0aGUgbmV3IGhhc2guPGJyIC8+CisgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBkaXNhYmxlIGF1dG9tYXRpYyBzY3JvbGxpbmcuCisgICAqCisgICAqIElmIGF1dG9tYXRpYyBzY3JvbGxpbmcgaXMgZGlzYWJsZWQsIG9uZSBtdXN0IGV4cGxpY2l0bHkgY2FsbAorICAgKiB7QGxpbmsgbmcuJGFuY2hvclNjcm9sbCAkYW5jaG9yU2Nyb2xsKCl9IGluIG9yZGVyIHRvIHNjcm9sbCB0byB0aGUgZWxlbWVudCByZWxhdGVkIHRvIHRoZQorICAgKiBjdXJyZW50IGhhc2guCisgICAqLworICB0aGlzLmRpc2FibGVBdXRvU2Nyb2xsaW5nID0gZnVuY3Rpb24oKSB7CisgICAgYXV0b1Njcm9sbGluZ0VuYWJsZWQgPSBmYWxzZTsKKyAgfTsKKworICAvKioKKyAgICogQG5nZG9jIHNlcnZpY2UKKyAgICogQG5hbWUgJGFuY2hvclNjcm9sbAorICAgKiBAa2luZCBmdW5jdGlvbgorICAgKiBAcmVxdWlyZXMgJHdpbmRvdworICAgKiBAcmVxdWlyZXMgJGxvY2F0aW9uCisgICAqIEByZXF1aXJlcyAkcm9vdFNjb3BlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBXaGVuIGNhbGxlZCwgaXQgY2hlY2tzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHtAbGluayBuZy4kbG9jYXRpb24jaGFzaCAkbG9jYXRpb24uaGFzaCgpfSBhbmQKKyAgICogc2Nyb2xscyB0byB0aGUgcmVsYXRlZCBlbGVtZW50LCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiB0aGUKKyAgICogW0h0bWw1IHNwZWNdKGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCN0aGUtaW5kaWNhdGVkLXBhcnQtb2YtdGhlLWRvY3VtZW50KS4KKyAgICoKKyAgICogSXQgYWxzbyB3YXRjaGVzIHRoZSB7QGxpbmsgbmcuJGxvY2F0aW9uI2hhc2ggJGxvY2F0aW9uLmhhc2goKX0gYW5kIGF1dG9tYXRpY2FsbHkgc2Nyb2xscyB0bworICAgKiBtYXRjaCBhbnkgYW5jaG9yIHdoZW5ldmVyIGl0IGNoYW5nZXMuIFRoaXMgY2FuIGJlIGRpc2FibGVkIGJ5IGNhbGxpbmcKKyAgICoge0BsaW5rIG5nLiRhbmNob3JTY3JvbGxQcm92aWRlciNkaXNhYmxlQXV0b1Njcm9sbGluZyAkYW5jaG9yU2Nyb2xsUHJvdmlkZXIuZGlzYWJsZUF1dG9TY3JvbGxpbmcoKX0uCisgICAqCisgICAqIEFkZGl0aW9uYWxseSwgeW91IGNhbiB1c2UgaXRzIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsI3lPZmZzZXQgeU9mZnNldH0gcHJvcGVydHkgdG8gc3BlY2lmeSBhCisgICAqIHZlcnRpY2FsIHNjcm9sbC1vZmZzZXQgKGVpdGhlciBmaXhlZCBvciBkeW5hbWljKS4KKyAgICoKKyAgICogQHByb3BlcnR5IHsobnVtYmVyfGZ1bmN0aW9ufGpxTGl0ZSl9IHlPZmZzZXQKKyAgICogSWYgc2V0LCBzcGVjaWZpZXMgYSB2ZXJ0aWNhbCBzY3JvbGwtb2Zmc2V0LiBUaGlzIGlzIG9mdGVuIHVzZWZ1bCB3aGVuIHRoZXJlIGFyZSBmaXhlZAorICAgKiBwb3NpdGlvbmVkIGVsZW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2UsIHN1Y2ggYXMgbmF2YmFycywgaGVhZGVycyBldGMuCisgICAqCisgICAqIGB5T2Zmc2V0YCBjYW4gYmUgc3BlY2lmaWVkIGluIHZhcmlvdXMgd2F5czoKKyAgICogLSAqKm51bWJlcioqOiBBIGZpeGVkIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgdXNlZCBhcyBvZmZzZXQuPGJyIC8+PGJyIC8+CisgICAqIC0gKipmdW5jdGlvbioqOiBBIGdldHRlciBmdW5jdGlvbiBjYWxsZWQgZXZlcnl0aW1lIGAkYW5jaG9yU2Nyb2xsKClgIGlzIGV4ZWN1dGVkLiBNdXN0IHJldHVybgorICAgKiAgIGEgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgb2Zmc2V0IChpbiBwaXhlbHMpLjxiciAvPjxiciAvPgorICAgKiAtICoqanFMaXRlKio6IEEganFMaXRlL2pRdWVyeSBlbGVtZW50IHRvIGJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlIG9mZnNldC4gVGhlIGRpc3RhbmNlIGZyb20KKyAgICogICB0aGUgdG9wIG9mIHRoZSBwYWdlIHRvIHRoZSBlbGVtZW50J3MgYm90dG9tIHdpbGwgYmUgdXNlZCBhcyBvZmZzZXQuPGJyIC8+CisgICAqICAgKipOb3RlKio6IFRoZSBlbGVtZW50IHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IG9ubHkgYXMgbG9uZyBhcyBpdHMgYHBvc2l0aW9uYCBpcyBzZXQgdG8KKyAgICogICBgZml4ZWRgLiBUaGlzIG9wdGlvbiBpcyB1c2VmdWwsIHdoZW4gZGVhbGluZyB3aXRoIHJlc3BvbnNpdmUgbmF2YmFycy9oZWFkZXJzIHRoYXQgYWRqdXN0CisgICAqICAgdGhlaXIgaGVpZ2h0IGFuZC9vciBwb3NpdGlvbmluZyBhY2NvcmRpbmcgdG8gdGhlIHZpZXdwb3J0J3Mgc2l6ZS4KKyAgICoKKyAgICogPGJyIC8+CisgICAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgorICAgKiBJbiBvcmRlciBmb3IgYHlPZmZzZXRgIHRvIHdvcmsgcHJvcGVybHksIHNjcm9sbGluZyBzaG91bGQgdGFrZSBwbGFjZSBvbiB0aGUgZG9jdW1lbnQncyByb290IGFuZAorICAgKiBub3Qgc29tZSBjaGlsZCBlbGVtZW50LgorICAgKiA8L2Rpdj4KKyAgICoKKyAgICogQGV4YW1wbGUKKyAgICAgPGV4YW1wbGUgbW9kdWxlPSJhbmNob3JTY3JvbGxFeGFtcGxlIj4KKyAgICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICAgIDxkaXYgaWQ9InNjcm9sbEFyZWEiIG5nLWNvbnRyb2xsZXI9IlNjcm9sbENvbnRyb2xsZXIiPgorICAgICAgICAgICA8YSBuZy1jbGljaz0iZ290b0JvdHRvbSgpIj5HbyB0byBib3R0b208L2E+CisgICAgICAgICAgIDxhIGlkPSJib3R0b20iPjwvYT4gWW91J3JlIGF0IHRoZSBib3R0b20hCisgICAgICAgICA8L2Rpdj4KKyAgICAgICA8L2ZpbGU+CisgICAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KKyAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdhbmNob3JTY3JvbGxFeGFtcGxlJywgW10pCisgICAgICAgICAgIC5jb250cm9sbGVyKCdTY3JvbGxDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGxvY2F0aW9uJywgJyRhbmNob3JTY3JvbGwnLAorICAgICAgICAgICAgIGZ1bmN0aW9uICgkc2NvcGUsICRsb2NhdGlvbiwgJGFuY2hvclNjcm9sbCkgeworICAgICAgICAgICAgICAgJHNjb3BlLmdvdG9Cb3R0b20gPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBsb2NhdGlvbi5oYXNoIHRvIHRoZSBpZCBvZgorICAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudCB5b3Ugd2lzaCB0byBzY3JvbGwgdG8uCisgICAgICAgICAgICAgICAgICRsb2NhdGlvbi5oYXNoKCdib3R0b20nKTsKKworICAgICAgICAgICAgICAgICAvLyBjYWxsICRhbmNob3JTY3JvbGwoKQorICAgICAgICAgICAgICAgICAkYW5jaG9yU2Nyb2xsKCk7CisgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgIH1dKTsKKyAgICAgICA8L2ZpbGU+CisgICAgICAgPGZpbGUgbmFtZT0ic3R5bGUuY3NzIj4KKyAgICAgICAgICNzY3JvbGxBcmVhIHsKKyAgICAgICAgICAgaGVpZ2h0OiAyODBweDsKKyAgICAgICAgICAgb3ZlcmZsb3c6IGF1dG87CisgICAgICAgICB9CisKKyAgICAgICAgICNib3R0b20geworICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKKyAgICAgICAgICAgbWFyZ2luLXRvcDogMjAwMHB4OworICAgICAgICAgfQorICAgICAgIDwvZmlsZT4KKyAgICAgPC9leGFtcGxlPgorICAgKgorICAgKiA8aHIgLz4KKyAgICogVGhlIGV4YW1wbGUgYmVsb3cgaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBhIHZlcnRpY2FsIHNjcm9sbC1vZmZzZXQgKHNwZWNpZmllZCBhcyBhIGZpeGVkIHZhbHVlKS4KKyAgICogU2VlIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsI3lPZmZzZXQgJGFuY2hvclNjcm9sbC55T2Zmc2V0fSBmb3IgbW9yZSBkZXRhaWxzLgorICAgKgorICAgKiBAZXhhbXBsZQorICAgICA8ZXhhbXBsZSBtb2R1bGU9ImFuY2hvclNjcm9sbE9mZnNldEV4YW1wbGUiPgorICAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgICAgPGRpdiBjbGFzcz0iZml4ZWQtaGVhZGVyIiBuZy1jb250cm9sbGVyPSJoZWFkZXJDdHJsIj4KKyAgICAgICAgICAgPGEgaHJlZj0iIiBuZy1jbGljaz0iZ290b0FuY2hvcih4KSIgbmctcmVwZWF0PSJ4IGluIFsxLDIsMyw0LDVdIj4KKyAgICAgICAgICAgICBHbyB0byBhbmNob3Ige3t4fX0KKyAgICAgICAgICAgPC9hPgorICAgICAgICAgPC9kaXY+CisgICAgICAgICA8ZGl2IGlkPSJhbmNob3J7e3h9fSIgY2xhc3M9ImFuY2hvciIgbmctcmVwZWF0PSJ4IGluIFsxLDIsMyw0LDVdIj4KKyAgICAgICAgICAgQW5jaG9yIHt7eH19IG9mIDUKKyAgICAgICAgIDwvZGl2PgorICAgICAgIDwvZmlsZT4KKyAgICAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgorICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2FuY2hvclNjcm9sbE9mZnNldEV4YW1wbGUnLCBbXSkKKyAgICAgICAgICAgLnJ1bihbJyRhbmNob3JTY3JvbGwnLCBmdW5jdGlvbigkYW5jaG9yU2Nyb2xsKSB7CisgICAgICAgICAgICAgJGFuY2hvclNjcm9sbC55T2Zmc2V0ID0gNTA7ICAgLy8gYWx3YXlzIHNjcm9sbCBieSA1MCBleHRyYSBwaXhlbHMKKyAgICAgICAgICAgfV0pCisgICAgICAgICAgIC5jb250cm9sbGVyKCdoZWFkZXJDdHJsJywgWyckYW5jaG9yU2Nyb2xsJywgJyRsb2NhdGlvbicsICckc2NvcGUnLAorICAgICAgICAgICAgIGZ1bmN0aW9uICgkYW5jaG9yU2Nyb2xsLCAkbG9jYXRpb24sICRzY29wZSkgeworICAgICAgICAgICAgICAgJHNjb3BlLmdvdG9BbmNob3IgPSBmdW5jdGlvbih4KSB7CisgICAgICAgICAgICAgICAgIHZhciBuZXdIYXNoID0gJ2FuY2hvcicgKyB4OworICAgICAgICAgICAgICAgICBpZiAoJGxvY2F0aW9uLmhhc2goKSAhPT0gbmV3SGFzaCkgeworICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgJGxvY2F0aW9uLmhhc2ggdG8gYG5ld0hhc2hgIGFuZAorICAgICAgICAgICAgICAgICAgIC8vICRhbmNob3JTY3JvbGwgd2lsbCBhdXRvbWF0aWNhbGx5IHNjcm9sbCB0byBpdAorICAgICAgICAgICAgICAgICAgICRsb2NhdGlvbi5oYXNoKCdhbmNob3InICsgeCk7CisgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgLy8gY2FsbCAkYW5jaG9yU2Nyb2xsKCkgZXhwbGljaXRseSwKKyAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSAkbG9jYXRpb24uaGFzaCBoYXNuJ3QgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICRhbmNob3JTY3JvbGwoKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgIF0pOworICAgICAgIDwvZmlsZT4KKyAgICAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPgorICAgICAgICAgYm9keSB7CisgICAgICAgICAgIHBhZGRpbmctdG9wOiA1MHB4OworICAgICAgICAgfQorCisgICAgICAgICAuYW5jaG9yIHsKKyAgICAgICAgICAgYm9yZGVyOiAycHggZGFzaGVkIERhcmtPcmNoaWQ7CisgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMTBweCAyMDBweCAxMHB4OworICAgICAgICAgfQorCisgICAgICAgICAuZml4ZWQtaGVhZGVyIHsKKyAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjIpOworICAgICAgICAgICBoZWlnaHQ6IDUwcHg7CisgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKKyAgICAgICAgICAgdG9wOiAwOyBsZWZ0OiAwOyByaWdodDogMDsKKyAgICAgICAgIH0KKworICAgICAgICAgLmZpeGVkLWhlYWRlciA+IGEgeworICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICAgICAgIG1hcmdpbjogNXB4IDE1cHg7CisgICAgICAgICB9CisgICAgICAgPC9maWxlPgorICAgICA8L2V4YW1wbGU+CisgICAqLworICB0aGlzLiRnZXQgPSBbJyR3aW5kb3cnLCAnJGxvY2F0aW9uJywgJyRyb290U2NvcGUnLCBmdW5jdGlvbigkd2luZG93LCAkbG9jYXRpb24sICRyb290U2NvcGUpIHsKKyAgICB2YXIgZG9jdW1lbnQgPSAkd2luZG93LmRvY3VtZW50OworCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBmaXJzdCBhbmNob3IgZnJvbSBhIE5vZGVMaXN0CisgICAgLy8gKHVzaW5nIGBBcnJheSNzb21lKClgIGluc3RlYWQgb2YgYGFuZ3VsYXIjZm9yRWFjaCgpYCBzaW5jZSBpdCdzIG1vcmUgcGVyZm9ybWFudAorICAgIC8vICBhbmQgd29ya2luZyBpbiBhbGwgc3VwcG9ydGVkIGJyb3dzZXJzLikKKyAgICBmdW5jdGlvbiBnZXRGaXJzdEFuY2hvcihsaXN0KSB7CisgICAgICB2YXIgcmVzdWx0ID0gbnVsbDsKKyAgICAgIEFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwobGlzdCwgZnVuY3Rpb24oZWxlbWVudCkgeworICAgICAgICBpZiAobm9kZU5hbWVfKGVsZW1lbnQpID09PSAnYScpIHsKKyAgICAgICAgICByZXN1bHQgPSBlbGVtZW50OworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgZnVuY3Rpb24gZ2V0WU9mZnNldCgpIHsKKworICAgICAgdmFyIG9mZnNldCA9IHNjcm9sbC55T2Zmc2V0OworCisgICAgICBpZiAoaXNGdW5jdGlvbihvZmZzZXQpKSB7CisgICAgICAgIG9mZnNldCA9IG9mZnNldCgpOworICAgICAgfSBlbHNlIGlmIChpc0VsZW1lbnQob2Zmc2V0KSkgeworICAgICAgICB2YXIgZWxlbSA9IG9mZnNldFswXTsKKyAgICAgICAgdmFyIHN0eWxlID0gJHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pOworICAgICAgICBpZiAoc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcpIHsKKyAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFpc051bWJlcihvZmZzZXQpKSB7CisgICAgICAgIG9mZnNldCA9IDA7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorCisgICAgZnVuY3Rpb24gc2Nyb2xsVG8oZWxlbSkgeworICAgICAgaWYgKGVsZW0pIHsKKyAgICAgICAgZWxlbS5zY3JvbGxJbnRvVmlldygpOworCisgICAgICAgIHZhciBvZmZzZXQgPSBnZXRZT2Zmc2V0KCk7CisKKyAgICAgICAgaWYgKG9mZnNldCkgeworICAgICAgICAgIC8vIGBvZmZzZXRgIGlzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHdlIHNob3VsZCBzY3JvbGwgVVAgaW4gb3JkZXIgdG8gYWxpZ24gYGVsZW1gIHByb3Blcmx5LgorICAgICAgICAgIC8vIFRoaXMgaXMgdHJ1ZSBPTkxZIGlmIHRoZSBjYWxsIHRvIGBlbGVtLnNjcm9sbEludG9WaWV3KClgIGluaXRpYWxseSBhbGlnbnMgYGVsZW1gIGF0IHRoZQorICAgICAgICAgIC8vIHRvcCBvZiB0aGUgdmlld3BvcnQuCisgICAgICAgICAgLy8KKyAgICAgICAgICAvLyBJRiB0aGUgbnVtYmVyIG9mIHBpeGVscyBmcm9tIHRoZSB0b3Agb2YgYGVsZW1gIHRvIHRoZSBlbmQgb2YgdGhlIHBhZ2UncyBjb250ZW50IGlzIGxlc3MKKyAgICAgICAgICAvLyB0aGFuIHRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0LCB0aGVuIGBlbGVtLnNjcm9sbEludG9WaWV3KClgIHdpbGwgYWxpZ24gdGhlIGBlbGVtYCBzb21lCisgICAgICAgICAgLy8gd2F5IGRvd24gdGhlIHBhZ2UuCisgICAgICAgICAgLy8KKyAgICAgICAgICAvLyBUaGlzIGlzIG9mdGVuIHRoZSBjYXNlIGZvciBlbGVtZW50cyBuZWFyIHRoZSBib3R0b20gb2YgdGhlIHBhZ2UuCisgICAgICAgICAgLy8KKyAgICAgICAgICAvLyBJbiBzdWNoIGNhc2VzIHdlIGRvIG5vdCBuZWVkIHRvIHNjcm9sbCB0aGUgd2hvbGUgYG9mZnNldGAgdXAsIGp1c3QgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICAgICAgICAgIC8vIHRoZSB0b3Agb2YgdGhlIGVsZW1lbnQgYW5kIHRoZSBvZmZzZXQsIHdoaWNoIGlzIGVub3VnaCB0byBhbGlnbiB0aGUgdG9wIG9mIGBlbGVtYCBhdCB0aGUKKyAgICAgICAgICAvLyBkZXNpcmVkIHBvc2l0aW9uLgorICAgICAgICAgIHZhciBlbGVtVG9wID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7CisgICAgICAgICAgJHdpbmRvdy5zY3JvbGxCeSgwLCBlbGVtVG9wIC0gb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgJHdpbmRvdy5zY3JvbGxUbygwLCAwKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBzY3JvbGwoKSB7CisgICAgICB2YXIgaGFzaCA9ICRsb2NhdGlvbi5oYXNoKCksIGVsbTsKKworICAgICAgLy8gZW1wdHkgaGFzaCwgc2Nyb2xsIHRvIHRoZSB0b3Agb2YgdGhlIHBhZ2UKKyAgICAgIGlmICghaGFzaCkgc2Nyb2xsVG8obnVsbCk7CisKKyAgICAgIC8vIGVsZW1lbnQgd2l0aCBnaXZlbiBpZAorICAgICAgZWxzZSBpZiAoKGVsbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGhhc2gpKSkgc2Nyb2xsVG8oZWxtKTsKKworICAgICAgLy8gZmlyc3QgYW5jaG9yIHdpdGggZ2l2ZW4gbmFtZSA6LUQKKyAgICAgIGVsc2UgaWYgKChlbG0gPSBnZXRGaXJzdEFuY2hvcihkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShoYXNoKSkpKSBzY3JvbGxUbyhlbG0pOworCisgICAgICAvLyBubyBlbGVtZW50IGFuZCBoYXNoID09ICd0b3AnLCBzY3JvbGwgdG8gdGhlIHRvcCBvZiB0aGUgcGFnZQorICAgICAgZWxzZSBpZiAoaGFzaCA9PT0gJ3RvcCcpIHNjcm9sbFRvKG51bGwpOworICAgIH0KKworICAgIC8vIGRvZXMgbm90IHNjcm9sbCB3aGVuIHVzZXIgY2xpY2tzIG9uIGFuY2hvciBsaW5rIHRoYXQgaXMgY3VycmVudGx5IG9uCisgICAgLy8gKG5vIHVybCBjaGFuZ2UsIG5vICRsb2NhdGlvbi5oYXNoKCkgY2hhbmdlKSwgYnJvd3NlciBuYXRpdmUgZG9lcyBzY3JvbGwKKyAgICBpZiAoYXV0b1Njcm9sbGluZ0VuYWJsZWQpIHsKKyAgICAgICRyb290U2NvcGUuJHdhdGNoKGZ1bmN0aW9uIGF1dG9TY3JvbGxXYXRjaCgpIHtyZXR1cm4gJGxvY2F0aW9uLmhhc2goKTt9LAorICAgICAgICBmdW5jdGlvbiBhdXRvU2Nyb2xsV2F0Y2hBY3Rpb24obmV3VmFsLCBvbGRWYWwpIHsKKyAgICAgICAgICAvLyBza2lwIHRoZSBpbml0aWFsIHNjcm9sbCBpZiAkbG9jYXRpb24uaGFzaCBpcyBlbXB0eQorICAgICAgICAgIGlmIChuZXdWYWwgPT09IG9sZFZhbCAmJiBuZXdWYWwgPT09ICcnKSByZXR1cm47CisKKyAgICAgICAgICBqcUxpdGVEb2N1bWVudExvYWRlZChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICRyb290U2NvcGUuJGV2YWxBc3luYyhzY3JvbGwpOworICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICByZXR1cm4gc2Nyb2xsOworICB9XTsKK30KKwordmFyICRhbmltYXRlTWluRXJyID0gbWluRXJyKCckYW5pbWF0ZScpOworCisvKioKKyAqIEBuZ2RvYyBwcm92aWRlcgorICogQG5hbWUgJGFuaW1hdGVQcm92aWRlcgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAkYW5pbWF0ZSB0aGF0IGRvZXNuJ3QgcGVyZm9ybSBhbnkgYW5pbWF0aW9ucywgaW5zdGVhZCBqdXN0CisgKiBzeW5jaHJvbm91c2x5IHBlcmZvcm1zIERPTQorICogdXBkYXRlcyBhbmQgY2FsbHMgZG9uZSgpIGNhbGxiYWNrcy4KKyAqCisgKiBJbiBvcmRlciB0byBlbmFibGUgYW5pbWF0aW9ucyB0aGUgbmdBbmltYXRlIG1vZHVsZSBoYXMgdG8gYmUgbG9hZGVkLgorICoKKyAqIFRvIHNlZSB0aGUgZnVuY3Rpb25hbCBpbXBsZW1lbnRhdGlvbiBjaGVjayBvdXQgc3JjL25nQW5pbWF0ZS9hbmltYXRlLmpzCisgKi8KK3ZhciAkQW5pbWF0ZVByb3ZpZGVyID0gWyckcHJvdmlkZScsIGZ1bmN0aW9uKCRwcm92aWRlKSB7CisKKworICB0aGlzLiQkc2VsZWN0b3JzID0ge307CisKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAkYW5pbWF0ZVByb3ZpZGVyI3JlZ2lzdGVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBSZWdpc3RlcnMgYSBuZXcgaW5qZWN0YWJsZSBhbmltYXRpb24gZmFjdG9yeSBmdW5jdGlvbi4gVGhlIGZhY3RvcnkgZnVuY3Rpb24gcHJvZHVjZXMgdGhlCisgICAqIGFuaW1hdGlvbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgY2FsbGJhY2sgZnVuY3Rpb25zIGZvciBlYWNoIGV2ZW50IHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUKKyAgICogYW5pbWF0ZWQuCisgICAqCisgICAqICAgKiBgZXZlbnRGbmA6IGBmdW5jdGlvbihFbGVtZW50LCBkb25lRnVuY3Rpb24pYCBUaGUgZWxlbWVudCB0byBhbmltYXRlLCB0aGUgYGRvbmVGdW5jdGlvbmAKKyAgICogICBtdXN0IGJlIGNhbGxlZCBvbmNlIHRoZSBlbGVtZW50IGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4gSWYgYSBmdW5jdGlvbiBpcyByZXR1cm5lZCB0aGVuIHRoZQorICAgKiAgIGFuaW1hdGlvbiBzZXJ2aWNlIHdpbGwgdXNlIHRoaXMgZnVuY3Rpb24gdG8gY2FuY2VsIHRoZSBhbmltYXRpb24gd2hlbmV2ZXIgYSBjYW5jZWwgZXZlbnQgaXMKKyAgICogICB0cmlnZ2VyZWQuCisgICAqCisgICAqCisgICAqIGBgYGpzCisgICAqICAgcmV0dXJuIHsKKyAgICAgKiAgICAgZXZlbnRGbiA6IGZ1bmN0aW9uKGVsZW1lbnQsIGRvbmUpIHsKKyAgICAgKiAgICAgICAvL2NvZGUgdG8gcnVuIHRoZSBhbmltYXRpb24KKyAgICAgKiAgICAgICAvL29uY2UgY29tcGxldGUsIHRoZW4gcnVuIGRvbmUoKQorICAgICAqICAgICAgIHJldHVybiBmdW5jdGlvbiBjYW5jZWxsYXRpb25GdW5jdGlvbigpIHsKKyAgICAgKiAgICAgICAgIC8vY29kZSB0byBjYW5jZWwgdGhlIGFuaW1hdGlvbgorICAgICAqICAgICAgIH0KKyAgICAgKiAgICAgfQorICAgICAqICAgfQorICAgKiBgYGAKKyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGFuaW1hdGlvbi4KKyAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmFjdG9yeSBUaGUgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgdG8gcmV0dXJuIHRoZSBhbmltYXRpb24KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuCisgICAqLworICB0aGlzLnJlZ2lzdGVyID0gZnVuY3Rpb24obmFtZSwgZmFjdG9yeSkgeworICAgIHZhciBrZXkgPSBuYW1lICsgJy1hbmltYXRpb24nOworICAgIGlmIChuYW1lICYmIG5hbWUuY2hhckF0KDApICE9ICcuJykgdGhyb3cgJGFuaW1hdGVNaW5FcnIoJ25vdGNzZWwnLAorICAgICAgICAiRXhwZWN0aW5nIGNsYXNzIHNlbGVjdG9yIHN0YXJ0aW5nIHdpdGggJy4nIGdvdCAnezB9Jy4iLCBuYW1lKTsKKyAgICB0aGlzLiQkc2VsZWN0b3JzW25hbWUuc3Vic3RyKDEpXSA9IGtleTsKKyAgICAkcHJvdmlkZS5mYWN0b3J5KGtleSwgZmFjdG9yeSk7CisgIH07CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgJGFuaW1hdGVQcm92aWRlciNjbGFzc05hbWVGaWx0ZXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIFNldHMgYW5kL29yIHJldHVybnMgdGhlIENTUyBjbGFzcyByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyBjaGVja2VkIHdoZW4gcGVyZm9ybWluZworICAgKiBhbiBhbmltYXRpb24uIFVwb24gYm9vdHN0cmFwIHRoZSBjbGFzc05hbWVGaWx0ZXIgdmFsdWUgaXMgbm90IHNldCBhdCBhbGwgYW5kIHdpbGwKKyAgICogdGhlcmVmb3JlIGVuYWJsZSAkYW5pbWF0ZSB0byBhdHRlbXB0IHRvIHBlcmZvcm0gYW4gYW5pbWF0aW9uIG9uIGFueSBlbGVtZW50LgorICAgKiBXaGVuIHNldHRpbmcgdGhlIGNsYXNzTmFtZUZpbHRlciB2YWx1ZSwgYW5pbWF0aW9ucyB3aWxsIG9ubHkgYmUgcGVyZm9ybWVkIG9uIGVsZW1lbnRzCisgICAqIHRoYXQgc3VjY2Vzc2Z1bGx5IG1hdGNoIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbi4gVGhpcyBpbiB0dXJuIGNhbiBib29zdCBwZXJmb3JtYW5jZQorICAgKiBmb3IgbG93LXBvd2VyZWQgZGV2aWNlcyBhcyB3ZWxsIGFzIGFwcGxpY2F0aW9ucyBjb250YWluaW5nIGEgbG90IG9mIHN0cnVjdHVyYWwgb3BlcmF0aW9ucy4KKyAgICogQHBhcmFtIHtSZWdFeHA9fSBleHByZXNzaW9uIFRoZSBjbGFzc05hbWUgZXhwcmVzc2lvbiB3aGljaCB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgYW5pbWF0aW9ucworICAgKiBAcmV0dXJuIHtSZWdFeHB9IFRoZSBjdXJyZW50IENTUyBjbGFzc05hbWUgZXhwcmVzc2lvbiB2YWx1ZS4gSWYgbnVsbCB0aGVuIHRoZXJlIGlzIG5vIGV4cHJlc3Npb24gdmFsdWUKKyAgICovCisgIHRoaXMuY2xhc3NOYW1lRmlsdGVyID0gZnVuY3Rpb24oZXhwcmVzc2lvbikgeworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CisgICAgICB0aGlzLiQkY2xhc3NOYW1lRmlsdGVyID0gKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBSZWdFeHApID8gZXhwcmVzc2lvbiA6IG51bGw7CisgICAgfQorICAgIHJldHVybiB0aGlzLiQkY2xhc3NOYW1lRmlsdGVyOworICB9OworCisgIHRoaXMuJGdldCA9IFsnJCRxJywgJyQkYXN5bmNDYWxsYmFjaycsICckcm9vdFNjb3BlJywgZnVuY3Rpb24oJCRxLCAkJGFzeW5jQ2FsbGJhY2ssICRyb290U2NvcGUpIHsKKworICAgIHZhciBjdXJyZW50RGVmZXI7CisKKyAgICBmdW5jdGlvbiBydW5BbmltYXRpb25Qb3N0RGlnZXN0KGZuKSB7CisgICAgICB2YXIgY2FuY2VsRm4sIGRlZmVyID0gJCRxLmRlZmVyKCk7CisgICAgICBkZWZlci5wcm9taXNlLiQkY2FuY2VsRm4gPSBmdW5jdGlvbiBuZ0FuaW1hdGVNYXliZUNhbmNlbCgpIHsKKyAgICAgICAgY2FuY2VsRm4gJiYgY2FuY2VsRm4oKTsKKyAgICAgIH07CisKKyAgICAgICRyb290U2NvcGUuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uIG5nQW5pbWF0ZVBvc3REaWdlc3QoKSB7CisgICAgICAgIGNhbmNlbEZuID0gZm4oZnVuY3Rpb24gbmdBbmltYXRlTm90aWZ5Q29tcGxldGUoKSB7CisgICAgICAgICAgZGVmZXIucmVzb2x2ZSgpOworICAgICAgICB9KTsKKyAgICAgIH0pOworCisgICAgICByZXR1cm4gZGVmZXIucHJvbWlzZTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiByZXNvbHZlRWxlbWVudENsYXNzZXMoZWxlbWVudCwgY2xhc3NlcykgeworICAgICAgdmFyIHRvQWRkID0gW10sIHRvUmVtb3ZlID0gW107CisKKyAgICAgIHZhciBoYXNDbGFzc2VzID0gY3JlYXRlTWFwKCk7CisgICAgICBmb3JFYWNoKChlbGVtZW50LmF0dHIoJ2NsYXNzJykgfHwgJycpLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oY2xhc3NOYW1lKSB7CisgICAgICAgIGhhc0NsYXNzZXNbY2xhc3NOYW1lXSA9IHRydWU7CisgICAgICB9KTsKKworICAgICAgZm9yRWFjaChjbGFzc2VzLCBmdW5jdGlvbihzdGF0dXMsIGNsYXNzTmFtZSkgeworICAgICAgICB2YXIgaGFzQ2xhc3MgPSBoYXNDbGFzc2VzW2NsYXNzTmFtZV07CisKKyAgICAgICAgLy8gSWYgdGhlIG1vc3QgcmVjZW50IGNsYXNzIG1hbmlwdWxhdGlvbiAodmlhICRhbmltYXRlKSB3YXMgdG8gcmVtb3ZlIHRoZSBjbGFzcywgYW5kIHRoZQorICAgICAgICAvLyBlbGVtZW50IGN1cnJlbnRseSBoYXMgdGhlIGNsYXNzLCB0aGUgY2xhc3MgaXMgc2NoZWR1bGVkIGZvciByZW1vdmFsLiBPdGhlcndpc2UsIGlmCisgICAgICAgIC8vIHRoZSBtb3N0IHJlY2VudCBjbGFzcyBtYW5pcHVsYXRpb24gKHZpYSAkYW5pbWF0ZSkgd2FzIHRvIGFkZCB0aGUgY2xhc3MsIGFuZCB0aGUKKyAgICAgICAgLy8gZWxlbWVudCBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZSB0aGUgY2xhc3MsIHRoZSBjbGFzcyBpcyBzY2hlZHVsZWQgdG8gYmUgYWRkZWQuCisgICAgICAgIGlmIChzdGF0dXMgPT09IGZhbHNlICYmIGhhc0NsYXNzKSB7CisgICAgICAgICAgdG9SZW1vdmUucHVzaChjbGFzc05hbWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gdHJ1ZSAmJiAhaGFzQ2xhc3MpIHsKKyAgICAgICAgICB0b0FkZC5wdXNoKGNsYXNzTmFtZSk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICByZXR1cm4gKHRvQWRkLmxlbmd0aCArIHRvUmVtb3ZlLmxlbmd0aCkgPiAwICYmCisgICAgICAgIFt0b0FkZC5sZW5ndGggPyB0b0FkZCA6IG51bGwsIHRvUmVtb3ZlLmxlbmd0aCA/IHRvUmVtb3ZlIDogbnVsbF07CisgICAgfQorCisgICAgZnVuY3Rpb24gY2FjaGVkQ2xhc3NNYW5pcHVsYXRpb24oY2FjaGUsIGNsYXNzZXMsIG9wKSB7CisgICAgICBmb3IgKHZhciBpPTAsIGlpID0gY2xhc3Nlcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc2VzW2ldOworICAgICAgICBjYWNoZVtjbGFzc05hbWVdID0gb3A7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gYXN5bmNQcm9taXNlKCkgeworICAgICAgLy8gb25seSBzZXJ2ZSBvbmUgaW5zdGFuY2Ugb2YgYSBwcm9taXNlIGluIG9yZGVyIHRvIHNhdmUgQ1BVIGN5Y2xlcworICAgICAgaWYgKCFjdXJyZW50RGVmZXIpIHsKKyAgICAgICAgY3VycmVudERlZmVyID0gJCRxLmRlZmVyKCk7CisgICAgICAgICQkYXN5bmNDYWxsYmFjayhmdW5jdGlvbigpIHsKKyAgICAgICAgICBjdXJyZW50RGVmZXIucmVzb2x2ZSgpOworICAgICAgICAgIGN1cnJlbnREZWZlciA9IG51bGw7CisgICAgICAgIH0pOworICAgICAgfQorICAgICAgcmV0dXJuIGN1cnJlbnREZWZlci5wcm9taXNlOworICAgIH0KKworICAgIGZ1bmN0aW9uIGFwcGx5U3R5bGVzKGVsZW1lbnQsIG9wdGlvbnMpIHsKKyAgICAgIGlmIChhbmd1bGFyLmlzT2JqZWN0KG9wdGlvbnMpKSB7CisgICAgICAgIHZhciBzdHlsZXMgPSBleHRlbmQob3B0aW9ucy5mcm9tIHx8IHt9LCBvcHRpb25zLnRvIHx8IHt9KTsKKyAgICAgICAgZWxlbWVudC5jc3Moc3R5bGVzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBuZ2RvYyBzZXJ2aWNlCisgICAgICogQG5hbWUgJGFuaW1hdGUKKyAgICAgKiBAZGVzY3JpcHRpb24gVGhlICRhbmltYXRlIHNlcnZpY2UgcHJvdmlkZXMgcnVkaW1lbnRhcnkgRE9NIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgdG8KKyAgICAgKiBpbnNlcnQsIHJlbW92ZSBhbmQgbW92ZSBlbGVtZW50cyB3aXRoaW4gdGhlIERPTSwgYXMgd2VsbCBhcyBhZGRpbmcgYW5kIHJlbW92aW5nIGNsYXNzZXMuCisgICAgICogVGhpcyBzZXJ2aWNlIGlzIHRoZSBjb3JlIHNlcnZpY2UgdXNlZCBieSB0aGUgbmdBbmltYXRlICRhbmltYXRvciBzZXJ2aWNlIHdoaWNoIHByb3ZpZGVzCisgICAgICogaGlnaC1sZXZlbCBhbmltYXRpb24gaG9va3MgZm9yIENTUyBhbmQgSmF2YVNjcmlwdC4KKyAgICAgKgorICAgICAqICRhbmltYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgQW5ndWxhckpTIGNvcmUsIGhvd2V2ZXIsIHRoZSBuZ0FuaW1hdGUgbW9kdWxlIG11c3QgYmUgaW5jbHVkZWQKKyAgICAgKiB0byBlbmFibGUgZnVsbCBvdXQgYW5pbWF0aW9uIHN1cHBvcnQuIE90aGVyd2lzZSwgJGFuaW1hdGUgd2lsbCBvbmx5IHBlcmZvcm0gc2ltcGxlIERPTQorICAgICAqIG1hbmlwdWxhdGlvbiBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogVG8gbGVhcm4gbW9yZSBhYm91dCBlbmFibGluZyBhbmltYXRpb24gc3VwcG9ydCwgY2xpY2sgaGVyZSB0byB2aXNpdCB0aGUge0BsaW5rIG5nQW5pbWF0ZQorICAgICAqIG5nQW5pbWF0ZSBtb2R1bGUgcGFnZX0gYXMgd2VsbCBhcyB0aGUge0BsaW5rIG5nQW5pbWF0ZS4kYW5pbWF0ZSBuZ0FuaW1hdGUgJGFuaW1hdGUgc2VydmljZQorICAgICAqIHBhZ2V9LgorICAgICAqLworICAgIHJldHVybiB7CisgICAgICBhbmltYXRlOiBmdW5jdGlvbihlbGVtZW50LCBmcm9tLCB0bykgeworICAgICAgICBhcHBseVN0eWxlcyhlbGVtZW50LCB7IGZyb206IGZyb20sIHRvOiB0byB9KTsKKyAgICAgICAgcmV0dXJuIGFzeW5jUHJvbWlzZSgpOworICAgICAgfSwKKworICAgICAgLyoqCisgICAgICAgKgorICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICogQG5hbWUgJGFuaW1hdGUjZW50ZXIKKyAgICAgICAqIEBraW5kIGZ1bmN0aW9uCisgICAgICAgKiBAZGVzY3JpcHRpb24gSW5zZXJ0cyB0aGUgZWxlbWVudCBpbnRvIHRoZSBET00gZWl0aGVyIGFmdGVyIHRoZSBgYWZ0ZXJgIGVsZW1lbnQgb3IKKyAgICAgICAqIGFzIHRoZSBmaXJzdCBjaGlsZCB3aXRoaW4gdGhlIGBwYXJlbnRgIGVsZW1lbnQuIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBhIHByb21pc2UKKyAgICAgICAqIGlzIHJldHVybmVkIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBhdCBhIGxhdGVyIHRpbWUuCisgICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgdGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00KKyAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcGFyZW50IHRoZSBwYXJlbnQgZWxlbWVudCB3aGljaCB3aWxsIGFwcGVuZCB0aGUgZWxlbWVudCBhcworICAgICAgICogICBhIGNoaWxkIChpZiB0aGUgYWZ0ZXIgZWxlbWVudCBpcyBub3QgcHJlc2VudCkKKyAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gYWZ0ZXIgdGhlIHNpYmxpbmcgZWxlbWVudCB3aGljaCB3aWxsIGFwcGVuZCB0aGUgZWxlbWVudAorICAgICAgICogICBhZnRlciBpdHNlbGYKKyAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIHN0eWxlcyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudC4KKyAgICAgICAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSBhbmltYXRpb24gY2FsbGJhY2sgcHJvbWlzZQorICAgICAgICovCisgICAgICBlbnRlcjogZnVuY3Rpb24oZWxlbWVudCwgcGFyZW50LCBhZnRlciwgb3B0aW9ucykgeworICAgICAgICBhcHBseVN0eWxlcyhlbGVtZW50LCBvcHRpb25zKTsKKyAgICAgICAgYWZ0ZXIgPyBhZnRlci5hZnRlcihlbGVtZW50KQorICAgICAgICAgICAgICA6IHBhcmVudC5wcmVwZW5kKGVsZW1lbnQpOworICAgICAgICByZXR1cm4gYXN5bmNQcm9taXNlKCk7CisgICAgICB9LAorCisgICAgICAvKioKKyAgICAgICAqCisgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNsZWF2ZQorICAgICAgICogQGtpbmQgZnVuY3Rpb24KKyAgICAgICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIHRoZSBlbGVtZW50IGZyb20gdGhlIERPTS4gV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGEgcHJvbWlzZQorICAgICAgICogaXMgcmV0dXJuZWQgdGhhdCB3aWxsIGJlIHJlc29sdmVkIGF0IGEgbGF0ZXIgdGltZS4KKyAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZWxlbWVudCB3aGljaCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NCisgICAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgYW4gb3B0aW9uYWwgY29sbGVjdGlvbiBvZiBvcHRpb25zIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LgorICAgICAgICogQHJldHVybiB7UHJvbWlzZX0gdGhlIGFuaW1hdGlvbiBjYWxsYmFjayBwcm9taXNlCisgICAgICAgKi8KKyAgICAgIGxlYXZlOiBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7CisgICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7CisgICAgICAgIHJldHVybiBhc3luY1Byb21pc2UoKTsKKyAgICAgIH0sCisKKyAgICAgIC8qKgorICAgICAgICoKKyAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAqIEBuYW1lICRhbmltYXRlI21vdmUKKyAgICAgICAqIEBraW5kIGZ1bmN0aW9uCisgICAgICAgKiBAZGVzY3JpcHRpb24gTW92ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBwcm92aWRlZCBlbGVtZW50IHdpdGhpbiB0aGUgRE9NIHRvIGJlIHBsYWNlZAorICAgICAgICogZWl0aGVyIGFmdGVyIHRoZSBgYWZ0ZXJgIGVsZW1lbnQgb3IgaW5zaWRlIG9mIHRoZSBgcGFyZW50YCBlbGVtZW50LiBXaGVuIHRoZSBmdW5jdGlvbgorICAgICAgICogaXMgY2FsbGVkIGEgcHJvbWlzZSBpcyByZXR1cm5lZCB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgYXQgYSBsYXRlciB0aW1lLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZWxlbWVudCB3aGljaCB3aWxsIGJlIG1vdmVkIGFyb3VuZCB3aXRoaW4gdGhlCisgICAgICAgKiAgIERPTQorICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBwYXJlbnQgdGhlIHBhcmVudCBlbGVtZW50IHdoZXJlIHRoZSBlbGVtZW50IHdpbGwgYmUKKyAgICAgICAqICAgaW5zZXJ0ZWQgaW50byAoaWYgdGhlIGFmdGVyIGVsZW1lbnQgaXMgbm90IHByZXNlbnQpCisgICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGFmdGVyIHRoZSBzaWJsaW5nIGVsZW1lbnQgd2hlcmUgdGhlIGVsZW1lbnQgd2lsbCBiZQorICAgICAgICogICBwb3NpdGlvbmVkIG5leHQgdG8KKyAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIG9wdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuCisgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2UKKyAgICAgICAqLworICAgICAgbW92ZTogZnVuY3Rpb24oZWxlbWVudCwgcGFyZW50LCBhZnRlciwgb3B0aW9ucykgeworICAgICAgICAvLyBEbyBub3QgcmVtb3ZlIGVsZW1lbnQgYmVmb3JlIGluc2VydC4gUmVtb3Zpbmcgd2lsbCBjYXVzZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgICAgLy8gZWxlbWVudCB0byBiZSBkcm9wcGVkLiBJbnNlcnQgd2lsbCBpbXBsaWNpdGx5IGRvIHRoZSByZW1vdmUuCisgICAgICAgIHJldHVybiB0aGlzLmVudGVyKGVsZW1lbnQsIHBhcmVudCwgYWZ0ZXIsIG9wdGlvbnMpOworICAgICAgfSwKKworICAgICAgLyoqCisgICAgICAgKgorICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICogQG5hbWUgJGFuaW1hdGUjYWRkQ2xhc3MKKyAgICAgICAqIEBraW5kIGZ1bmN0aW9uCisgICAgICAgKiBAZGVzY3JpcHRpb24gQWRkcyB0aGUgcHJvdmlkZWQgY2xhc3NOYW1lIENTUyBjbGFzcyB2YWx1ZSB0byB0aGUgcHJvdmlkZWQgZWxlbWVudC4KKyAgICAgICAqIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBhIHByb21pc2UgaXMgcmV0dXJuZWQgdGhhdCB3aWxsIGJlIHJlc29sdmVkIGF0IGEgbGF0ZXIgdGltZS4KKyAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZWxlbWVudCB3aGljaCB3aWxsIGhhdmUgdGhlIGNsYXNzTmFtZSB2YWx1ZQorICAgICAgICogICBhZGRlZCB0byBpdAorICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSB0aGUgQ1NTIGNsYXNzIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVsZW1lbnQKKyAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIG9wdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuCisgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2UKKyAgICAgICAqLworICAgICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSwgb3B0aW9ucykgeworICAgICAgICByZXR1cm4gdGhpcy5zZXRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUsIFtdLCBvcHRpb25zKTsKKyAgICAgIH0sCisKKyAgICAgICQkYWRkQ2xhc3NJbW1lZGlhdGVseTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lLCBvcHRpb25zKSB7CisgICAgICAgIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCk7CisgICAgICAgIGNsYXNzTmFtZSA9ICFpc1N0cmluZyhjbGFzc05hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICA/IChpc0FycmF5KGNsYXNzTmFtZSkgPyBjbGFzc05hbWUuam9pbignICcpIDogJycpCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNsYXNzTmFtZTsKKyAgICAgICAgZm9yRWFjaChlbGVtZW50LCBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgICAgICAganFMaXRlQWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKTsKKyAgICAgICAgfSk7CisgICAgICAgIGFwcGx5U3R5bGVzKGVsZW1lbnQsIG9wdGlvbnMpOworICAgICAgICByZXR1cm4gYXN5bmNQcm9taXNlKCk7CisgICAgICB9LAorCisgICAgICAvKioKKyAgICAgICAqCisgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNyZW1vdmVDbGFzcworICAgICAgICogQGtpbmQgZnVuY3Rpb24KKyAgICAgICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIHRoZSBwcm92aWRlZCBjbGFzc05hbWUgQ1NTIGNsYXNzIHZhbHVlIGZyb20gdGhlIHByb3ZpZGVkIGVsZW1lbnQuCisgICAgICAgKiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYSBwcm9taXNlIGlzIHJldHVybmVkIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBhdCBhIGxhdGVyIHRpbWUuCisgICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgdGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBoYXZlIHRoZSBjbGFzc05hbWUgdmFsdWUKKyAgICAgICAqICAgcmVtb3ZlZCBmcm9tIGl0CisgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIHRoZSBDU1MgY2xhc3Mgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnQKKyAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIG9wdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuCisgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2UKKyAgICAgICAqLworICAgICAgcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSwgb3B0aW9ucykgeworICAgICAgICByZXR1cm4gdGhpcy5zZXRDbGFzcyhlbGVtZW50LCBbXSwgY2xhc3NOYW1lLCBvcHRpb25zKTsKKyAgICAgIH0sCisKKyAgICAgICQkcmVtb3ZlQ2xhc3NJbW1lZGlhdGVseTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lLCBvcHRpb25zKSB7CisgICAgICAgIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCk7CisgICAgICAgIGNsYXNzTmFtZSA9ICFpc1N0cmluZyhjbGFzc05hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICA/IChpc0FycmF5KGNsYXNzTmFtZSkgPyBjbGFzc05hbWUuam9pbignICcpIDogJycpCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNsYXNzTmFtZTsKKyAgICAgICAgZm9yRWFjaChlbGVtZW50LCBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgICAgICAganFMaXRlUmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKTsKKyAgICAgICAgfSk7CisgICAgICAgIGFwcGx5U3R5bGVzKGVsZW1lbnQsIG9wdGlvbnMpOworICAgICAgICByZXR1cm4gYXN5bmNQcm9taXNlKCk7CisgICAgICB9LAorCisgICAgICAvKioKKyAgICAgICAqCisgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNzZXRDbGFzcworICAgICAgICogQGtpbmQgZnVuY3Rpb24KKyAgICAgICAqIEBkZXNjcmlwdGlvbiBBZGRzIGFuZC9vciByZW1vdmVzIHRoZSBnaXZlbiBDU1MgY2xhc3NlcyB0byBhbmQgZnJvbSB0aGUgZWxlbWVudC4KKyAgICAgICAqIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBhIHByb21pc2UgaXMgcmV0dXJuZWQgdGhhdCB3aWxsIGJlIHJlc29sdmVkIGF0IGEgbGF0ZXIgdGltZS4KKyAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZWxlbWVudCB3aGljaCB3aWxsIGhhdmUgaXRzIENTUyBjbGFzc2VzIGNoYW5nZWQKKyAgICAgICAqICAgcmVtb3ZlZCBmcm9tIGl0CisgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkIHRoZSBDU1MgY2xhc3NlcyB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbGVtZW50CisgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVtb3ZlIHRoZSBDU1MgY2xhc3Mgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnQKKyAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIG9wdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuCisgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2UKKyAgICAgICAqLworICAgICAgc2V0Q2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIGFkZCwgcmVtb3ZlLCBvcHRpb25zKSB7CisgICAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgICAgdmFyIFNUT1JBR0VfS0VZID0gJyQkYW5pbWF0ZUNsYXNzZXMnOworICAgICAgICB2YXIgY3JlYXRlZENhY2hlID0gZmFsc2U7CisgICAgICAgIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCk7CisKKyAgICAgICAgdmFyIGNhY2hlID0gZWxlbWVudC5kYXRhKFNUT1JBR0VfS0VZKTsKKyAgICAgICAgaWYgKCFjYWNoZSkgeworICAgICAgICAgIGNhY2hlID0geworICAgICAgICAgICAgY2xhc3Nlczoge30sCisgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zCisgICAgICAgICAgfTsKKyAgICAgICAgICBjcmVhdGVkQ2FjaGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgY2FjaGUub3B0aW9ucykgeworICAgICAgICAgIGNhY2hlLm9wdGlvbnMgPSBhbmd1bGFyLmV4dGVuZChjYWNoZS5vcHRpb25zIHx8IHt9LCBvcHRpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBjbGFzc2VzID0gY2FjaGUuY2xhc3NlczsKKworICAgICAgICBhZGQgPSBpc0FycmF5KGFkZCkgPyBhZGQgOiBhZGQuc3BsaXQoJyAnKTsKKyAgICAgICAgcmVtb3ZlID0gaXNBcnJheShyZW1vdmUpID8gcmVtb3ZlIDogcmVtb3ZlLnNwbGl0KCcgJyk7CisgICAgICAgIGNhY2hlZENsYXNzTWFuaXB1bGF0aW9uKGNsYXNzZXMsIGFkZCwgdHJ1ZSk7CisgICAgICAgIGNhY2hlZENsYXNzTWFuaXB1bGF0aW9uKGNsYXNzZXMsIHJlbW92ZSwgZmFsc2UpOworCisgICAgICAgIGlmIChjcmVhdGVkQ2FjaGUpIHsKKyAgICAgICAgICBjYWNoZS5wcm9taXNlID0gcnVuQW5pbWF0aW9uUG9zdERpZ2VzdChmdW5jdGlvbihkb25lKSB7CisgICAgICAgICAgICB2YXIgY2FjaGUgPSBlbGVtZW50LmRhdGEoU1RPUkFHRV9LRVkpOworICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVEYXRhKFNUT1JBR0VfS0VZKTsKKworICAgICAgICAgICAgLy8gaW4gdGhlIGV2ZW50IHRoYXQgdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZCBiZWZvcmUgcG9zdERpZ2VzdAorICAgICAgICAgICAgLy8gaXMgcnVuIHRoZW4gdGhlIGNhY2hlIHdpbGwgYmUgdW5kZWZpbmVkIGFuZCB0aGVyZSB3aWxsIGJlCisgICAgICAgICAgICAvLyBubyBuZWVkIGFueW1vcmUgdG8gYWRkIG9yIHJlbW92ZSBhbmQgb2YgdGhlIGVsZW1lbnQgY2xhc3NlcworICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgIHZhciBjbGFzc2VzID0gcmVzb2x2ZUVsZW1lbnRDbGFzc2VzKGVsZW1lbnQsIGNhY2hlLmNsYXNzZXMpOworICAgICAgICAgICAgICBpZiAoY2xhc3NlcykgeworICAgICAgICAgICAgICAgIHNlbGYuJCRzZXRDbGFzc0ltbWVkaWF0ZWx5KGVsZW1lbnQsIGNsYXNzZXNbMF0sIGNsYXNzZXNbMV0sIGNhY2hlLm9wdGlvbnMpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBlbGVtZW50LmRhdGEoU1RPUkFHRV9LRVksIGNhY2hlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjYWNoZS5wcm9taXNlOworICAgICAgfSwKKworICAgICAgJCRzZXRDbGFzc0ltbWVkaWF0ZWx5OiBmdW5jdGlvbihlbGVtZW50LCBhZGQsIHJlbW92ZSwgb3B0aW9ucykgeworICAgICAgICBhZGQgJiYgdGhpcy4kJGFkZENsYXNzSW1tZWRpYXRlbHkoZWxlbWVudCwgYWRkKTsKKyAgICAgICAgcmVtb3ZlICYmIHRoaXMuJCRyZW1vdmVDbGFzc0ltbWVkaWF0ZWx5KGVsZW1lbnQsIHJlbW92ZSk7CisgICAgICAgIGFwcGx5U3R5bGVzKGVsZW1lbnQsIG9wdGlvbnMpOworICAgICAgICByZXR1cm4gYXN5bmNQcm9taXNlKCk7CisgICAgICB9LAorCisgICAgICBlbmFibGVkOiBub29wLAorICAgICAgY2FuY2VsOiBub29wCisgICAgfTsKKyAgfV07Cit9XTsKKworZnVuY3Rpb24gJCRBc3luY0NhbGxiYWNrUHJvdmlkZXIoKSB7CisgIHRoaXMuJGdldCA9IFsnJCRyQUYnLCAnJHRpbWVvdXQnLCBmdW5jdGlvbigkJHJBRiwgJHRpbWVvdXQpIHsKKyAgICByZXR1cm4gJCRyQUYuc3VwcG9ydGVkCisgICAgICA/IGZ1bmN0aW9uKGZuKSB7IHJldHVybiAkJHJBRihmbik7IH0KKyAgICAgIDogZnVuY3Rpb24oZm4pIHsKKyAgICAgICAgcmV0dXJuICR0aW1lb3V0KGZuLCAwLCBmYWxzZSk7CisgICAgICB9OworICB9XTsKK30KKworLyogZ2xvYmFsIHN0cmlwSGFzaDogdHJ1ZSAqLworCisvKioKKyAqICEgVGhpcyBpcyBhIHByaXZhdGUgdW5kb2N1bWVudGVkIHNlcnZpY2UgIQorICoKKyAqIEBuYW1lICRicm93c2VyCisgKiBAcmVxdWlyZXMgJGxvZworICogQGRlc2NyaXB0aW9uCisgKiBUaGlzIG9iamVjdCBoYXMgdHdvIGdvYWxzOgorICoKKyAqIC0gaGlkZSBhbGwgdGhlIGdsb2JhbCBzdGF0ZSBpbiB0aGUgYnJvd3NlciBjYXVzZWQgYnkgdGhlIHdpbmRvdyBvYmplY3QKKyAqIC0gYWJzdHJhY3QgYXdheSBhbGwgdGhlIGJyb3dzZXIgc3BlY2lmaWMgZmVhdHVyZXMgYW5kIGluY29uc2lzdGVuY2llcworICoKKyAqIEZvciB0ZXN0cyB3ZSBwcm92aWRlIHtAbGluayBuZ01vY2suJGJyb3dzZXIgbW9jayBpbXBsZW1lbnRhdGlvbn0gb2YgdGhlIGAkYnJvd3NlcmAKKyAqIHNlcnZpY2UsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBjb252ZW5pZW50IHRlc3Rpbmcgb2YgdGhlIGFwcGxpY2F0aW9uIHdpdGhvdXQgdGhlIGludGVyYWN0aW9uIHdpdGgKKyAqIHRoZSByZWFsIGJyb3dzZXIgYXBpcy4KKyAqLworLyoqCisgKiBAcGFyYW0ge29iamVjdH0gd2luZG93IFRoZSBnbG9iYWwgd2luZG93IG9iamVjdC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBkb2N1bWVudCBqUXVlcnkgd3JhcHBlZCBkb2N1bWVudC4KKyAqIEBwYXJhbSB7b2JqZWN0fSAkbG9nIHdpbmRvdy5jb25zb2xlIG9yIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGludGVyZmFjZS4KKyAqIEBwYXJhbSB7b2JqZWN0fSAkc25pZmZlciAkc25pZmZlciBzZXJ2aWNlCisgKi8KK2Z1bmN0aW9uIEJyb3dzZXIod2luZG93LCBkb2N1bWVudCwgJGxvZywgJHNuaWZmZXIpIHsKKyAgdmFyIHNlbGYgPSB0aGlzLAorICAgICAgcmF3RG9jdW1lbnQgPSBkb2N1bWVudFswXSwKKyAgICAgIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLAorICAgICAgaGlzdG9yeSA9IHdpbmRvdy5oaXN0b3J5LAorICAgICAgc2V0VGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0LAorICAgICAgY2xlYXJUaW1lb3V0ID0gd2luZG93LmNsZWFyVGltZW91dCwKKyAgICAgIHBlbmRpbmdEZWZlcklkcyA9IHt9OworCisgIHNlbGYuaXNNb2NrID0gZmFsc2U7CisKKyAgdmFyIG91dHN0YW5kaW5nUmVxdWVzdENvdW50ID0gMDsKKyAgdmFyIG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrcyA9IFtdOworCisgIC8vIFRPRE8odm9qdGEpOiByZW1vdmUgdGhpcyB0ZW1wb3JhcnkgYXBpCisgIHNlbGYuJCRjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdCA9IGNvbXBsZXRlT3V0c3RhbmRpbmdSZXF1ZXN0OworICBzZWxmLiQkaW5jT3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPSBmdW5jdGlvbigpIHsgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQrKzsgfTsKKworICAvKioKKyAgICogRXhlY3V0ZXMgdGhlIGBmbmAgZnVuY3Rpb24oc3VwcG9ydHMgY3VycnlpbmcpIGFuZCBkZWNyZW1lbnRzIHRoZSBgb3V0c3RhbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzYAorICAgKiBjb3VudGVyLiBJZiB0aGUgY291bnRlciByZWFjaGVzIDAsIGFsbCB0aGUgYG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrc2AgYXJlIGV4ZWN1dGVkLgorICAgKi8KKyAgZnVuY3Rpb24gY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3QoZm4pIHsKKyAgICB0cnkgeworICAgICAgZm4uYXBwbHkobnVsbCwgc2xpY2VBcmdzKGFyZ3VtZW50cywgMSkpOworICAgIH0gZmluYWxseSB7CisgICAgICBvdXRzdGFuZGluZ1JlcXVlc3RDb3VudC0tOworICAgICAgaWYgKG91dHN0YW5kaW5nUmVxdWVzdENvdW50ID09PSAwKSB7CisgICAgICAgIHdoaWxlIChvdXRzdGFuZGluZ1JlcXVlc3RDYWxsYmFja3MubGVuZ3RoKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrcy5wb3AoKSgpOworICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgICRsb2cuZXJyb3IoZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gZ2V0SGFzaCh1cmwpIHsKKyAgICB2YXIgaW5kZXggPSB1cmwuaW5kZXhPZignIycpOworICAgIHJldHVybiBpbmRleCA9PT0gLTEgPyAnJyA6IHVybC5zdWJzdHIoaW5kZXggKyAxKTsKKyAgfQorCisgIC8qKgorICAgKiBAcHJpdmF0ZQorICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBpcyB1c2VkIG9ubHkgYnkgc2NlbmFyaW8gcnVubmVyCisgICAqIFRPRE8odm9qdGEpOiBwcmVmaXggdGhpcyBtZXRob2Qgd2l0aCAkJCA/CisgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gY2FsbGJhY2sgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIG5vIG91dHN0YW5kaW5nIHJlcXVlc3QKKyAgICovCisgIHNlbGYubm90aWZ5V2hlbk5vT3V0c3RhbmRpbmdSZXF1ZXN0cyA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CisgICAgLy8gZm9yY2UgYnJvd3NlciB0byBleGVjdXRlIGFsbCBwb2xsRm5zIC0gdGhpcyBpcyBuZWVkZWQgc28gdGhhdCBjb29raWVzIGFuZCBvdGhlciBwb2xsZXJzIGZpcmUKKyAgICAvLyBhdCBzb21lIGRldGVybWluaXN0aWMgdGltZSBpbiByZXNwZWN0IHRvIHRoZSB0ZXN0IHJ1bm5lcidzIGFjdGlvbnMuIExlYXZpbmcgdGhpbmdzIHVwIHRvIHRoZQorICAgIC8vIHJlZ3VsYXIgcG9sbGVyIHdvdWxkIHJlc3VsdCBpbiBmbGFreSB0ZXN0cy4KKyAgICBmb3JFYWNoKHBvbGxGbnMsIGZ1bmN0aW9uKHBvbGxGbikgeyBwb2xsRm4oKTsgfSk7CisKKyAgICBpZiAob3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPT09IDApIHsKKyAgICAgIGNhbGxiYWNrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTsKKyAgICB9CisgIH07CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gUG9sbCBXYXRjaGVyIEFQSQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICB2YXIgcG9sbEZucyA9IFtdLAorICAgICAgcG9sbFRpbWVvdXQ7CisKKyAgLyoqCisgICAqIEBuYW1lICRicm93c2VyI2FkZFBvbGxGbgorICAgKgorICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGZuIFBvbGwgZnVuY3Rpb24gdG8gYWRkCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBBZGRzIGEgZnVuY3Rpb24gdG8gdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgcG9sbGVyIHBlcmlvZGljYWxseSBleGVjdXRlcywKKyAgICogYW5kIHN0YXJ0cyBwb2xsaW5nIGlmIG5vdCBzdGFydGVkIHlldC4KKyAgICoKKyAgICogQHJldHVybnMge2Z1bmN0aW9uKCl9IHRoZSBhZGRlZCBmdW5jdGlvbgorICAgKi8KKyAgc2VsZi5hZGRQb2xsRm4gPSBmdW5jdGlvbihmbikgeworICAgIGlmIChpc1VuZGVmaW5lZChwb2xsVGltZW91dCkpIHN0YXJ0UG9sbGVyKDEwMCwgc2V0VGltZW91dCk7CisgICAgcG9sbEZucy5wdXNoKGZuKTsKKyAgICByZXR1cm4gZm47CisgIH07CisKKyAgLyoqCisgICAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnZhbCBIb3cgb2Z0ZW4gc2hvdWxkIGJyb3dzZXIgY2FsbCBwb2xsIGZ1bmN0aW9ucyAobXMpCisgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gc2V0VGltZW91dCBSZWZlcmVuY2UgdG8gYSByZWFsIG9yIGZha2UgYHNldFRpbWVvdXRgIGZ1bmN0aW9uLgorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogQ29uZmlndXJlcyB0aGUgcG9sbGVyIHRvIHJ1biBpbiB0aGUgc3BlY2lmaWVkIGludGVydmFscywgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgKiBzZXRUaW1lb3V0IGZuIGFuZCBraWNrcyBpdCBvZmYuCisgICAqLworICBmdW5jdGlvbiBzdGFydFBvbGxlcihpbnRlcnZhbCwgc2V0VGltZW91dCkgeworICAgIChmdW5jdGlvbiBjaGVjaygpIHsKKyAgICAgIGZvckVhY2gocG9sbEZucywgZnVuY3Rpb24ocG9sbEZuKSB7IHBvbGxGbigpOyB9KTsKKyAgICAgIHBvbGxUaW1lb3V0ID0gc2V0VGltZW91dChjaGVjaywgaW50ZXJ2YWwpOworICAgIH0pKCk7CisgIH0KKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBVUkwgQVBJCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgdmFyIGNhY2hlZFN0YXRlLCBsYXN0SGlzdG9yeVN0YXRlLAorICAgICAgbGFzdEJyb3dzZXJVcmwgPSBsb2NhdGlvbi5ocmVmLAorICAgICAgYmFzZUVsZW1lbnQgPSBkb2N1bWVudC5maW5kKCdiYXNlJyksCisgICAgICByZWxvYWRMb2NhdGlvbiA9IG51bGw7CisKKyAgY2FjaGVTdGF0ZSgpOworICBsYXN0SGlzdG9yeVN0YXRlID0gY2FjaGVkU3RhdGU7CisKKyAgLyoqCisgICAqIEBuYW1lICRicm93c2VyI3VybAorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogR0VUVEVSOgorICAgKiBXaXRob3V0IGFueSBhcmd1bWVudCwgdGhpcyBtZXRob2QganVzdCByZXR1cm5zIGN1cnJlbnQgdmFsdWUgb2YgbG9jYXRpb24uaHJlZi4KKyAgICoKKyAgICogU0VUVEVSOgorICAgKiBXaXRoIGF0IGxlYXN0IG9uZSBhcmd1bWVudCwgdGhpcyBtZXRob2Qgc2V0cyB1cmwgdG8gbmV3IHZhbHVlLgorICAgKiBJZiBodG1sNSBoaXN0b3J5IGFwaSBzdXBwb3J0ZWQsIHB1c2hTdGF0ZS9yZXBsYWNlU3RhdGUgaXMgdXNlZCwgb3RoZXJ3aXNlCisgICAqIGxvY2F0aW9uLmhyZWYvbG9jYXRpb24ucmVwbGFjZSBpcyB1c2VkLgorICAgKiBSZXR1cm5zIGl0cyBvd24gaW5zdGFuY2UgdG8gYWxsb3cgY2hhaW5pbmcKKyAgICoKKyAgICogTk9URTogdGhpcyBhcGkgaXMgaW50ZW5kZWQgZm9yIHVzZSBvbmx5IGJ5IHRoZSAkbG9jYXRpb24gc2VydmljZS4gUGxlYXNlIHVzZSB0aGUKKyAgICoge0BsaW5rIG5nLiRsb2NhdGlvbiAkbG9jYXRpb24gc2VydmljZX0gdG8gY2hhbmdlIHVybC4KKyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBOZXcgdXJsICh3aGVuIHVzZWQgYXMgc2V0dGVyKQorICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZXBsYWNlIFNob3VsZCBuZXcgdXJsIHJlcGxhY2UgY3VycmVudCBoaXN0b3J5IHJlY29yZD8KKyAgICogQHBhcmFtIHtvYmplY3Q9fSBzdGF0ZSBvYmplY3QgdG8gdXNlIHdpdGggcHVzaFN0YXRlL3JlcGxhY2VTdGF0ZQorICAgKi8KKyAgc2VsZi51cmwgPSBmdW5jdGlvbih1cmwsIHJlcGxhY2UsIHN0YXRlKSB7CisgICAgLy8gSW4gbW9kZXJuIGJyb3dzZXJzIGBoaXN0b3J5LnN0YXRlYCBpcyBgbnVsbGAgYnkgZGVmYXVsdDsgdHJlYXRpbmcgaXQgc2VwYXJhdGVseQorICAgIC8vIGZyb20gYHVuZGVmaW5lZGAgd291bGQgY2F1c2UgYCRicm93c2VyLnVybCgnL2ZvbycpYCB0byBjaGFuZ2UgYGhpc3Rvcnkuc3RhdGVgCisgICAgLy8gdG8gdW5kZWZpbmVkIHZpYSBgcHVzaFN0YXRlYC4gSW5zdGVhZCwgbGV0J3MgY2hhbmdlIGB1bmRlZmluZWRgIHRvIGBudWxsYCBoZXJlLgorICAgIGlmIChpc1VuZGVmaW5lZChzdGF0ZSkpIHsKKyAgICAgIHN0YXRlID0gbnVsbDsKKyAgICB9CisKKyAgICAvLyBBbmRyb2lkIEJyb3dzZXIgQkZDYWNoZSBjYXVzZXMgbG9jYXRpb24sIGhpc3RvcnkgcmVmZXJlbmNlIHRvIGJlY29tZSBzdGFsZS4KKyAgICBpZiAobG9jYXRpb24gIT09IHdpbmRvdy5sb2NhdGlvbikgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247CisgICAgaWYgKGhpc3RvcnkgIT09IHdpbmRvdy5oaXN0b3J5KSBoaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7CisKKyAgICAvLyBzZXR0ZXIKKyAgICBpZiAodXJsKSB7CisgICAgICB2YXIgc2FtZVN0YXRlID0gbGFzdEhpc3RvcnlTdGF0ZSA9PT0gc3RhdGU7CisKKyAgICAgIC8vIERvbid0IGNoYW5nZSBhbnl0aGluZyBpZiBwcmV2aW91cyBhbmQgY3VycmVudCBVUkxzIGFuZCBzdGF0ZXMgbWF0Y2guIFRoaXMgYWxzbyBwcmV2ZW50cworICAgICAgLy8gSUU8MTAgZnJvbSBnZXR0aW5nIGludG8gcmVkaXJlY3QgbG9vcCB3aGVuIGluIExvY2F0aW9uSGFzaGJhbmdJbkh0bWw1VXJsIG1vZGUuCisgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9jb21taXQvZmZiMjcwMQorICAgICAgaWYgKGxhc3RCcm93c2VyVXJsID09PSB1cmwgJiYgKCEkc25pZmZlci5oaXN0b3J5IHx8IHNhbWVTdGF0ZSkpIHsKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgICB9CisgICAgICB2YXIgc2FtZUJhc2UgPSBsYXN0QnJvd3NlclVybCAmJiBzdHJpcEhhc2gobGFzdEJyb3dzZXJVcmwpID09PSBzdHJpcEhhc2godXJsKTsKKyAgICAgIGxhc3RCcm93c2VyVXJsID0gdXJsOworICAgICAgbGFzdEhpc3RvcnlTdGF0ZSA9IHN0YXRlOworICAgICAgLy8gRG9uJ3QgdXNlIGhpc3RvcnkgQVBJIGlmIG9ubHkgdGhlIGhhc2ggY2hhbmdlZAorICAgICAgLy8gZHVlIHRvIGEgYnVnIGluIElFMTAvSUUxMSB3aGljaCBsZWFkcworICAgICAgLy8gdG8gbm90IGZpcmluZyBhIGBoYXNoY2hhbmdlYCBub3IgYHBvcHN0YXRlYCBldmVudAorICAgICAgLy8gaW4gc29tZSBjYXNlcyAoc2VlICM5MTQzKS4KKyAgICAgIGlmICgkc25pZmZlci5oaXN0b3J5ICYmICghc2FtZUJhc2UgfHwgIXNhbWVTdGF0ZSkpIHsKKyAgICAgICAgaGlzdG9yeVtyZXBsYWNlID8gJ3JlcGxhY2VTdGF0ZScgOiAncHVzaFN0YXRlJ10oc3RhdGUsICcnLCB1cmwpOworICAgICAgICBjYWNoZVN0YXRlKCk7CisgICAgICAgIC8vIERvIHRoZSBhc3NpZ25tZW50IGFnYWluIHNvIHRoYXQgdGhvc2UgdHdvIHZhcmlhYmxlcyBhcmUgcmVmZXJlbnRpYWxseSBpZGVudGljYWwuCisgICAgICAgIGxhc3RIaXN0b3J5U3RhdGUgPSBjYWNoZWRTdGF0ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghc2FtZUJhc2UpIHsKKyAgICAgICAgICByZWxvYWRMb2NhdGlvbiA9IHVybDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVwbGFjZSkgeworICAgICAgICAgIGxvY2F0aW9uLnJlcGxhY2UodXJsKTsKKyAgICAgICAgfSBlbHNlIGlmICghc2FtZUJhc2UpIHsKKyAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gdXJsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxvY2F0aW9uLmhhc2ggPSBnZXRIYXNoKHVybCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzZWxmOworICAgIC8vIGdldHRlcgorICAgIH0gZWxzZSB7CisgICAgICAvLyAtIHJlbG9hZExvY2F0aW9uIGlzIG5lZWRlZCBhcyBicm93c2VycyBkb24ndCBhbGxvdyB0byByZWFkIG91dAorICAgICAgLy8gICB0aGUgbmV3IGxvY2F0aW9uLmhyZWYgaWYgYSByZWxvYWQgaGFwcGVuZWQuCisgICAgICAvLyAtIHRoZSByZXBsYWNlbWVudCBpcyBhIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQwNzE3MgorICAgICAgcmV0dXJuIHJlbG9hZExvY2F0aW9uIHx8IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvJTI3L2csIiciKTsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIEBuYW1lICRicm93c2VyI3N0YXRlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBUaGlzIG1ldGhvZCBpcyBhIGdldHRlci4KKyAgICoKKyAgICogUmV0dXJuIGhpc3Rvcnkuc3RhdGUgb3IgbnVsbCBpZiBoaXN0b3J5LnN0YXRlIGlzIHVuZGVmaW5lZC4KKyAgICoKKyAgICogQHJldHVybnMge29iamVjdH0gc3RhdGUKKyAgICovCisgIHNlbGYuc3RhdGUgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gY2FjaGVkU3RhdGU7CisgIH07CisKKyAgdmFyIHVybENoYW5nZUxpc3RlbmVycyA9IFtdLAorICAgICAgdXJsQ2hhbmdlSW5pdCA9IGZhbHNlOworCisgIGZ1bmN0aW9uIGNhY2hlU3RhdGVBbmRGaXJlVXJsQ2hhbmdlKCkgeworICAgIGNhY2hlU3RhdGUoKTsKKyAgICBmaXJlVXJsQ2hhbmdlKCk7CisgIH0KKworICAvLyBUaGlzIHZhcmlhYmxlIHNob3VsZCBiZSB1c2VkICpvbmx5KiBpbnNpZGUgdGhlIGNhY2hlU3RhdGUgZnVuY3Rpb24uCisgIHZhciBsYXN0Q2FjaGVkU3RhdGUgPSBudWxsOworICBmdW5jdGlvbiBjYWNoZVN0YXRlKCkgeworICAgIC8vIFRoaXMgc2hvdWxkIGJlIHRoZSBvbmx5IHBsYWNlIGluICRicm93c2VyIHdoZXJlIGBoaXN0b3J5LnN0YXRlYCBpcyByZWFkLgorICAgIGNhY2hlZFN0YXRlID0gd2luZG93Lmhpc3Rvcnkuc3RhdGU7CisgICAgY2FjaGVkU3RhdGUgPSBpc1VuZGVmaW5lZChjYWNoZWRTdGF0ZSkgPyBudWxsIDogY2FjaGVkU3RhdGU7CisKKyAgICAvLyBQcmV2ZW50IGNhbGxiYWNrcyBmbyBmaXJlIHR3aWNlIGlmIGJvdGggaGFzaGNoYW5nZSAmIHBvcHN0YXRlIHdlcmUgZmlyZWQuCisgICAgaWYgKGVxdWFscyhjYWNoZWRTdGF0ZSwgbGFzdENhY2hlZFN0YXRlKSkgeworICAgICAgY2FjaGVkU3RhdGUgPSBsYXN0Q2FjaGVkU3RhdGU7CisgICAgfQorICAgIGxhc3RDYWNoZWRTdGF0ZSA9IGNhY2hlZFN0YXRlOworICB9CisKKyAgZnVuY3Rpb24gZmlyZVVybENoYW5nZSgpIHsKKyAgICBpZiAobGFzdEJyb3dzZXJVcmwgPT09IHNlbGYudXJsKCkgJiYgbGFzdEhpc3RvcnlTdGF0ZSA9PT0gY2FjaGVkU3RhdGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsYXN0QnJvd3NlclVybCA9IHNlbGYudXJsKCk7CisgICAgbGFzdEhpc3RvcnlTdGF0ZSA9IGNhY2hlZFN0YXRlOworICAgIGZvckVhY2godXJsQ2hhbmdlTGlzdGVuZXJzLCBmdW5jdGlvbihsaXN0ZW5lcikgeworICAgICAgbGlzdGVuZXIoc2VsZi51cmwoKSwgY2FjaGVkU3RhdGUpOworICAgIH0pOworICB9CisKKyAgLyoqCisgICAqIEBuYW1lICRicm93c2VyI29uVXJsQ2hhbmdlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBSZWdpc3RlciBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkLCB3aGVuIHVybCBjaGFuZ2VzLgorICAgKgorICAgKiBJdCdzIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHVybCBpcyBjaGFuZ2VkIGZyb20gb3V0c2lkZSBvZiBhbmd1bGFyOgorICAgKiAtIHVzZXIgdHlwZXMgZGlmZmVyZW50IHVybCBpbnRvIGFkZHJlc3MgYmFyCisgICAqIC0gdXNlciBjbGlja3Mgb24gaGlzdG9yeSAoZm9yd2FyZC9iYWNrKSBidXR0b24KKyAgICogLSB1c2VyIGNsaWNrcyBvbiBhIGxpbmsKKyAgICoKKyAgICogSXQncyBub3QgY2FsbGVkIHdoZW4gdXJsIGlzIGNoYW5nZWQgYnkgJGJyb3dzZXIudXJsKCkgbWV0aG9kCisgICAqCisgICAqIFRoZSBsaXN0ZW5lciBnZXRzIGNhbGxlZCB3aXRoIG5ldyB1cmwgYXMgcGFyYW1ldGVyLgorICAgKgorICAgKiBOT1RFOiB0aGlzIGFwaSBpcyBpbnRlbmRlZCBmb3IgdXNlIG9ubHkgYnkgdGhlICRsb2NhdGlvbiBzZXJ2aWNlLiBQbGVhc2UgdXNlIHRoZQorICAgKiB7QGxpbmsgbmcuJGxvY2F0aW9uICRsb2NhdGlvbiBzZXJ2aWNlfSB0byBtb25pdG9yIHVybCBjaGFuZ2VzIGluIGFuZ3VsYXIgYXBwcy4KKyAgICoKKyAgICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpfSBsaXN0ZW5lciBMaXN0ZW5lciBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB1cmwgY2hhbmdlcy4KKyAgICogQHJldHVybiB7ZnVuY3Rpb24oc3RyaW5nKX0gUmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lciBmbiAtIGhhbmR5IGlmIHRoZSBmbiBpcyBhbm9ueW1vdXMuCisgICAqLworICBzZWxmLm9uVXJsQ2hhbmdlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKKyAgICAvLyBUT0RPKHZvanRhKTogcmVmYWN0b3IgdG8gdXNlIG5vZGUncyBzeW50YXggZm9yIGV2ZW50cworICAgIGlmICghdXJsQ2hhbmdlSW5pdCkgeworICAgICAgLy8gV2UgbGlzdGVuIG9uIGJvdGggKGhhc2hjaGFuZ2UvcG9wc3RhdGUpIHdoZW4gYXZhaWxhYmxlLCBhcyBzb21lIGJyb3dzZXJzIChlLmcuIE9wZXJhKQorICAgICAgLy8gZG9uJ3QgZmlyZSBwb3BzdGF0ZSB3aGVuIHVzZXIgY2hhbmdlIHRoZSBhZGRyZXNzIGJhciBhbmQgZG9uJ3QgZmlyZSBoYXNoY2hhbmdlIHdoZW4gdXJsCisgICAgICAvLyBjaGFuZ2VkIGJ5IHB1c2gvcmVwbGFjZVN0YXRlCisKKyAgICAgIC8vIGh0bWw1IGhpc3RvcnkgYXBpIC0gcG9wc3RhdGUgZXZlbnQKKyAgICAgIGlmICgkc25pZmZlci5oaXN0b3J5KSBqcUxpdGUod2luZG93KS5vbigncG9wc3RhdGUnLCBjYWNoZVN0YXRlQW5kRmlyZVVybENoYW5nZSk7CisgICAgICAvLyBoYXNoY2hhbmdlIGV2ZW50CisgICAgICBqcUxpdGUod2luZG93KS5vbignaGFzaGNoYW5nZScsIGNhY2hlU3RhdGVBbmRGaXJlVXJsQ2hhbmdlKTsKKworICAgICAgdXJsQ2hhbmdlSW5pdCA9IHRydWU7CisgICAgfQorCisgICAgdXJsQ2hhbmdlTGlzdGVuZXJzLnB1c2goY2FsbGJhY2spOworICAgIHJldHVybiBjYWxsYmFjazsKKyAgfTsKKworICAvKioKKyAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHVybCBoYXMgY2hhbmdlZCBvdXRzaWRlIG9mIEFuZ3VsYXIuCisgICAqIE5lZWRzIHRvIGJlIGV4cG9ydGVkIHRvIGJlIGFibGUgdG8gY2hlY2sgZm9yIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gZG9uZSBpbiBzeW5jLAorICAgKiBhcyBoYXNoY2hhbmdlL3BvcHN0YXRlIGV2ZW50cyBmaXJlIGluIGFzeW5jLgorICAgKi8KKyAgc2VsZi4kJGNoZWNrVXJsQ2hhbmdlID0gZmlyZVVybENoYW5nZTsKKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBNaXNjIEFQSQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgIC8qKgorICAgKiBAbmFtZSAkYnJvd3NlciNiYXNlSHJlZgorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogUmV0dXJucyBjdXJyZW50IDxiYXNlIGhyZWY+CisgICAqIChhbHdheXMgcmVsYXRpdmUgLSB3aXRob3V0IGRvbWFpbikKKyAgICoKKyAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGN1cnJlbnQgYmFzZSBocmVmCisgICAqLworICBzZWxmLmJhc2VIcmVmID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIGhyZWYgPSBiYXNlRWxlbWVudC5hdHRyKCdocmVmJyk7CisgICAgcmV0dXJuIGhyZWYgPyBocmVmLnJlcGxhY2UoL14oaHR0cHM/XDopP1wvXC9bXlwvXSovLCAnJykgOiAnJzsKKyAgfTsKKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBDb29raWVzIEFQSQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICB2YXIgbGFzdENvb2tpZXMgPSB7fTsKKyAgdmFyIGxhc3RDb29raWVTdHJpbmcgPSAnJzsKKyAgdmFyIGNvb2tpZVBhdGggPSBzZWxmLmJhc2VIcmVmKCk7CisKKyAgZnVuY3Rpb24gc2FmZURlY29kZVVSSUNvbXBvbmVudChzdHIpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHJldHVybiBzdHI7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEBuYW1lICRicm93c2VyI2Nvb2tpZXMKKyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIENvb2tpZSBuYW1lCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gdmFsdWUgQ29va2llIHZhbHVlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBUaGUgY29va2llcyBtZXRob2QgcHJvdmlkZXMgYSAncHJpdmF0ZScgbG93IGxldmVsIGFjY2VzcyB0byBicm93c2VyIGNvb2tpZXMuCisgICAqIEl0IGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGRpcmVjdGx5LCB1c2UgdGhlICRjb29raWUgc2VydmljZSBpbnN0ZWFkLgorICAgKgorICAgKiBUaGUgcmV0dXJuIHZhbHVlcyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgYXJndW1lbnRzIHRoYXQgdGhlIG1ldGhvZCB3YXMgY2FsbGVkIHdpdGggYXMgZm9sbG93czoKKyAgICoKKyAgICogLSBjb29raWVzKCkgLT4gaGFzaCBvZiBhbGwgY29va2llcywgdGhpcyBpcyBOT1QgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbCBzdGF0ZSwgc28gZG8gbm90IG1vZGlmeQorICAgKiAgIGl0CisgICAqIC0gY29va2llcyhuYW1lLCB2YWx1ZSkgLT4gc2V0IG5hbWUgdG8gdmFsdWUsIGlmIHZhbHVlIGlzIHVuZGVmaW5lZCBkZWxldGUgdGhlIGNvb2tpZQorICAgKiAtIGNvb2tpZXMobmFtZSkgLT4gdGhlIHNhbWUgYXMgKG5hbWUsIHVuZGVmaW5lZCkgPT0gREVMRVRFUyAobm8gb25lIGNhbGxzIGl0IHJpZ2h0IG5vdyB0aGF0CisgICAqICAgd2F5KQorICAgKgorICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIYXNoIG9mIGFsbCBjb29raWVzIChpZiBjYWxsZWQgd2l0aG91dCBhbnkgcGFyYW1ldGVyKQorICAgKi8KKyAgc2VsZi5jb29raWVzID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKKyAgICB2YXIgY29va2llTGVuZ3RoLCBjb29raWVBcnJheSwgY29va2llLCBpLCBpbmRleDsKKworICAgIGlmIChuYW1lKSB7CisgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeworICAgICAgICByYXdEb2N1bWVudC5jb29raWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAiPTtwYXRoPSIgKyBjb29raWVQYXRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjtleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHsKKyAgICAgICAgICBjb29raWVMZW5ndGggPSAocmF3RG9jdW1lbnQuY29va2llID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7cGF0aD0nICsgY29va2llUGF0aCkubGVuZ3RoICsgMTsKKworICAgICAgICAgIC8vIHBlciBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMTA5LnR4dCBicm93c2VyIG11c3QgYWxsb3cgYXQgbWluaW11bToKKyAgICAgICAgICAvLyAtIDMwMCBjb29raWVzCisgICAgICAgICAgLy8gLSAyMCBjb29raWVzIHBlciB1bmlxdWUgZG9tYWluCisgICAgICAgICAgLy8gLSA0MDk2IGJ5dGVzIHBlciBjb29raWUKKyAgICAgICAgICBpZiAoY29va2llTGVuZ3RoID4gNDA5NikgeworICAgICAgICAgICAgJGxvZy53YXJuKCJDb29raWUgJyIgKyBuYW1lICsKKyAgICAgICAgICAgICAgIicgcG9zc2libHkgbm90IHNldCBvciBvdmVyZmxvd2VkIGJlY2F1c2UgaXQgd2FzIHRvbyBsYXJnZSAoIiArCisgICAgICAgICAgICAgIGNvb2tpZUxlbmd0aCArICIgPiA0MDk2IGJ5dGVzKSEiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHJhd0RvY3VtZW50LmNvb2tpZSAhPT0gbGFzdENvb2tpZVN0cmluZykgeworICAgICAgICBsYXN0Q29va2llU3RyaW5nID0gcmF3RG9jdW1lbnQuY29va2llOworICAgICAgICBjb29raWVBcnJheSA9IGxhc3RDb29raWVTdHJpbmcuc3BsaXQoIjsgIik7CisgICAgICAgIGxhc3RDb29raWVzID0ge307CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb2tpZUFycmF5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgY29va2llID0gY29va2llQXJyYXlbaV07CisgICAgICAgICAgaW5kZXggPSBjb29raWUuaW5kZXhPZignPScpOworICAgICAgICAgIGlmIChpbmRleCA+IDApIHsgLy9pZ25vcmUgbmFtZWxlc3MgY29va2llcworICAgICAgICAgICAgbmFtZSA9IHNhZmVEZWNvZGVVUklDb21wb25lbnQoY29va2llLnN1YnN0cmluZygwLCBpbmRleCkpOworICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHZhbHVlIHRoYXQgaXMgc2VlbiBmb3IgYSBjb29raWUgaXMgdGhlIG1vc3QKKyAgICAgICAgICAgIC8vIHNwZWNpZmljIG9uZS4gIHZhbHVlcyBmb3IgdGhlIHNhbWUgY29va2llIG5hbWUgdGhhdAorICAgICAgICAgICAgLy8gZm9sbG93IGFyZSBmb3IgbGVzcyBzcGVjaWZpYyBwYXRocy4KKyAgICAgICAgICAgIGlmIChsYXN0Q29va2llc1tuYW1lXSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICAgIGxhc3RDb29raWVzW25hbWVdID0gc2FmZURlY29kZVVSSUNvbXBvbmVudChjb29raWUuc3Vic3RyaW5nKGluZGV4ICsgMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGxhc3RDb29raWVzOworICAgIH0KKyAgfTsKKworCisgIC8qKgorICAgKiBAbmFtZSAkYnJvd3NlciNkZWZlcgorICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGZuIEEgZnVuY3Rpb24sIHdobydzIGV4ZWN1dGlvbiBzaG91bGQgYmUgZGVmZXJyZWQuCisgICAqIEBwYXJhbSB7bnVtYmVyPX0gW2RlbGF5PTBdIG9mIG1pbGxpc2Vjb25kcyB0byBkZWZlciB0aGUgZnVuY3Rpb24gZXhlY3V0aW9uLgorICAgKiBAcmV0dXJucyB7Kn0gRGVmZXJJZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNhbmNlbCB0aGUgdGFzayB2aWEgYCRicm93c2VyLmRlZmVyLmNhbmNlbCgpYC4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIEV4ZWN1dGVzIGEgZm4gYXN5bmNocm9ub3VzbHkgdmlhIGBzZXRUaW1lb3V0KGZuLCBkZWxheSlgLgorICAgKgorICAgKiBVbmxpa2Ugd2hlbiBjYWxsaW5nIGBzZXRUaW1lb3V0YCBkaXJlY3RseSwgaW4gdGVzdCB0aGlzIGZ1bmN0aW9uIGlzIG1vY2tlZCBhbmQgaW5zdGVhZCBvZiB1c2luZworICAgKiBgc2V0VGltZW91dGAgaW4gdGVzdHMsIHRoZSBmbnMgYXJlIHF1ZXVlZCBpbiBhbiBhcnJheSwgd2hpY2ggY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZmx1c2hlZAorICAgKiB2aWEgYCRicm93c2VyLmRlZmVyLmZsdXNoKClgLgorICAgKgorICAgKi8KKyAgc2VsZi5kZWZlciA9IGZ1bmN0aW9uKGZuLCBkZWxheSkgeworICAgIHZhciB0aW1lb3V0SWQ7CisgICAgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQrKzsKKyAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworICAgICAgZGVsZXRlIHBlbmRpbmdEZWZlcklkc1t0aW1lb3V0SWRdOworICAgICAgY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3QoZm4pOworICAgIH0sIGRlbGF5IHx8IDApOworICAgIHBlbmRpbmdEZWZlcklkc1t0aW1lb3V0SWRdID0gdHJ1ZTsKKyAgICByZXR1cm4gdGltZW91dElkOworICB9OworCisKKyAgLyoqCisgICAqIEBuYW1lICRicm93c2VyI2RlZmVyLmNhbmNlbAorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogQ2FuY2VscyBhIGRlZmVycmVkIHRhc2sgaWRlbnRpZmllZCB3aXRoIGBkZWZlcklkYC4KKyAgICoKKyAgICogQHBhcmFtIHsqfSBkZWZlcklkIFRva2VuIHJldHVybmVkIGJ5IHRoZSBgJGJyb3dzZXIuZGVmZXJgIGZ1bmN0aW9uLgorICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRhc2sgaGFzbid0IGV4ZWN1dGVkIHlldCBhbmQgd2FzIHN1Y2Nlc3NmdWxseQorICAgKiAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQuCisgICAqLworICBzZWxmLmRlZmVyLmNhbmNlbCA9IGZ1bmN0aW9uKGRlZmVySWQpIHsKKyAgICBpZiAocGVuZGluZ0RlZmVySWRzW2RlZmVySWRdKSB7CisgICAgICBkZWxldGUgcGVuZGluZ0RlZmVySWRzW2RlZmVySWRdOworICAgICAgY2xlYXJUaW1lb3V0KGRlZmVySWQpOworICAgICAgY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3Qobm9vcCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9OworCit9CisKK2Z1bmN0aW9uICRCcm93c2VyUHJvdmlkZXIoKSB7CisgIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsICckbG9nJywgJyRzbmlmZmVyJywgJyRkb2N1bWVudCcsCisgICAgICBmdW5jdGlvbigkd2luZG93LCAkbG9nLCAkc25pZmZlciwgJGRvY3VtZW50KSB7CisgICAgICAgIHJldHVybiBuZXcgQnJvd3Nlcigkd2luZG93LCAkZG9jdW1lbnQsICRsb2csICRzbmlmZmVyKTsKKyAgICAgIH1dOworfQorCisvKioKKyAqIEBuZ2RvYyBzZXJ2aWNlCisgKiBAbmFtZSAkY2FjaGVGYWN0b3J5CisgKgorICogQGRlc2NyaXB0aW9uCisgKiBGYWN0b3J5IHRoYXQgY29uc3RydWN0cyB7QGxpbmsgJGNhY2hlRmFjdG9yeS5DYWNoZSBDYWNoZX0gb2JqZWN0cyBhbmQgZ2l2ZXMgYWNjZXNzIHRvCisgKiB0aGVtLgorICoKKyAqIGBgYGpzCisgKgorICogIHZhciBjYWNoZSA9ICRjYWNoZUZhY3RvcnkoJ2NhY2hlSWQnKTsKKyAqICBleHBlY3QoJGNhY2hlRmFjdG9yeS5nZXQoJ2NhY2hlSWQnKSkudG9CZShjYWNoZSk7CisgKiAgZXhwZWN0KCRjYWNoZUZhY3RvcnkuZ2V0KCdub1N1Y2hDYWNoZUlkJykpLm5vdC50b0JlRGVmaW5lZCgpOworICoKKyAqICBjYWNoZS5wdXQoImtleSIsICJ2YWx1ZSIpOworICogIGNhY2hlLnB1dCgiYW5vdGhlciBrZXkiLCAiYW5vdGhlciB2YWx1ZSIpOworICoKKyAqICAvLyBXZSd2ZSBzcGVjaWZpZWQgbm8gb3B0aW9ucyBvbiBjcmVhdGlvbgorICogIGV4cGVjdChjYWNoZS5pbmZvKCkpLnRvRXF1YWwoe2lkOiAnY2FjaGVJZCcsIHNpemU6IDJ9KTsKKyAqCisgKiBgYGAKKyAqCisgKgorICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlSWQgTmFtZSBvciBpZCBvZiB0aGUgbmV3bHkgY3JlYXRlZCBjYWNoZS4KKyAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBPcHRpb25zIG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgY2FjaGUgYmVoYXZpb3IuIFByb3BlcnRpZXM6CisgKgorICogICAtIGB7bnVtYmVyPX1gIGBjYXBhY2l0eWAg4oA/IHR1cm5zIHRoZSBjYWNoZSBpbnRvIExSVSBjYWNoZS4KKyAqCisgKiBAcmV0dXJucyB7b2JqZWN0fSBOZXdseSBjcmVhdGVkIGNhY2hlIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgc2V0IG9mIG1ldGhvZHM6CisgKgorICogLSBge29iamVjdH1gIGBpbmZvKClgIOKAPyBSZXR1cm5zIGlkLCBzaXplLCBhbmQgb3B0aW9ucyBvZiBjYWNoZS4KKyAqIC0gYHt7Kn19YCBgcHV0KHtzdHJpbmd9IGtleSwgeyp9IHZhbHVlKWAg4oA/IFB1dHMgYSBuZXcga2V5LXZhbHVlIHBhaXIgaW50byB0aGUgY2FjaGUgYW5kIHJldHVybnMKKyAqICAgaXQuCisgKiAtIGB7eyp9fWAgYGdldCh7c3RyaW5nfSBrZXkpYCDigD8gUmV0dXJucyBjYWNoZWQgdmFsdWUgZm9yIGBrZXlgIG9yIHVuZGVmaW5lZCBmb3IgY2FjaGUgbWlzcy4KKyAqIC0gYHt2b2lkfWAgYHJlbW92ZSh7c3RyaW5nfSBrZXkpYCDigD8gUmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlIGNhY2hlLgorICogLSBge3ZvaWR9YCBgcmVtb3ZlQWxsKClgIOKAPyBSZW1vdmVzIGFsbCBjYWNoZWQgdmFsdWVzLgorICogLSBge3ZvaWR9YCBgZGVzdHJveSgpYCDigD8gUmVtb3ZlcyByZWZlcmVuY2VzIHRvIHRoaXMgY2FjaGUgZnJvbSAkY2FjaGVGYWN0b3J5LgorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZSBtb2R1bGU9ImNhY2hlRXhhbXBsZUFwcCI+CisgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iQ2FjaGVDb250cm9sbGVyIj4KKyAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD0ibmV3Q2FjaGVLZXkiIHBsYWNlaG9sZGVyPSJLZXkiPgorICAgICAgICAgPGlucHV0IG5nLW1vZGVsPSJuZXdDYWNoZVZhbHVlIiBwbGFjZWhvbGRlcj0iVmFsdWUiPgorICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0icHV0KG5ld0NhY2hlS2V5LCBuZXdDYWNoZVZhbHVlKSI+Q2FjaGU8L2J1dHRvbj4KKworICAgICAgICAgPHAgbmctaWY9ImtleXMubGVuZ3RoIj5DYWNoZWQgVmFsdWVzPC9wPgorICAgICAgICAgPGRpdiBuZy1yZXBlYXQ9ImtleSBpbiBrZXlzIj4KKyAgICAgICAgICAgPHNwYW4gbmctYmluZD0ia2V5Ij48L3NwYW4+CisgICAgICAgICAgIDxzcGFuPjogPC9zcGFuPgorICAgICAgICAgICA8YiBuZy1iaW5kPSJjYWNoZS5nZXQoa2V5KSI+PC9iPgorICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgIDxwPkNhY2hlIEluZm88L3A+CisgICAgICAgICA8ZGl2IG5nLXJlcGVhdD0iKGtleSwgdmFsdWUpIGluIGNhY2hlLmluZm8oKSI+CisgICAgICAgICAgIDxzcGFuIG5nLWJpbmQ9ImtleSI+PC9zcGFuPgorICAgICAgICAgICA8c3Bhbj46IDwvc3Bhbj4KKyAgICAgICAgICAgPGIgbmctYmluZD0idmFsdWUiPjwvYj4KKyAgICAgICAgIDwvZGl2PgorICAgICAgIDwvZGl2PgorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+CisgICAgICAgYW5ndWxhci5tb2R1bGUoJ2NhY2hlRXhhbXBsZUFwcCcsIFtdKS4KKyAgICAgICAgIGNvbnRyb2xsZXIoJ0NhY2hlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRjYWNoZUZhY3RvcnknLCBmdW5jdGlvbigkc2NvcGUsICRjYWNoZUZhY3RvcnkpIHsKKyAgICAgICAgICAgJHNjb3BlLmtleXMgPSBbXTsKKyAgICAgICAgICAgJHNjb3BlLmNhY2hlID0gJGNhY2hlRmFjdG9yeSgnY2FjaGVJZCcpOworICAgICAgICAgICAkc2NvcGUucHV0ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAgICAgICAgICAgIGlmICgkc2NvcGUuY2FjaGUuZ2V0KGtleSkgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgJHNjb3BlLmtleXMucHVzaChrZXkpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAkc2NvcGUuY2FjaGUucHV0KGtleSwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZSk7CisgICAgICAgICAgIH07CisgICAgICAgICB9XSk7CisgICAgIDwvZmlsZT4KKyAgICAgPGZpbGUgbmFtZT0ic3R5bGUuY3NzIj4KKyAgICAgICBwIHsKKyAgICAgICAgIG1hcmdpbjogMTBweCAwIDNweDsKKyAgICAgICB9CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLworZnVuY3Rpb24gJENhY2hlRmFjdG9yeVByb3ZpZGVyKCkgeworCisgIHRoaXMuJGdldCA9IGZ1bmN0aW9uKCkgeworICAgIHZhciBjYWNoZXMgPSB7fTsKKworICAgIGZ1bmN0aW9uIGNhY2hlRmFjdG9yeShjYWNoZUlkLCBvcHRpb25zKSB7CisgICAgICBpZiAoY2FjaGVJZCBpbiBjYWNoZXMpIHsKKyAgICAgICAgdGhyb3cgbWluRXJyKCckY2FjaGVGYWN0b3J5JykoJ2lpZCcsICJDYWNoZUlkICd7MH0nIGlzIGFscmVhZHkgdGFrZW4hIiwgY2FjaGVJZCk7CisgICAgICB9CisKKyAgICAgIHZhciBzaXplID0gMCwKKyAgICAgICAgICBzdGF0cyA9IGV4dGVuZCh7fSwgb3B0aW9ucywge2lkOiBjYWNoZUlkfSksCisgICAgICAgICAgZGF0YSA9IHt9LAorICAgICAgICAgIGNhcGFjaXR5ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5jYXBhY2l0eSkgfHwgTnVtYmVyLk1BWF9WQUxVRSwKKyAgICAgICAgICBscnVIYXNoID0ge30sCisgICAgICAgICAgZnJlc2hFbmQgPSBudWxsLAorICAgICAgICAgIHN0YWxlRW5kID0gbnVsbDsKKworICAgICAgLyoqCisgICAgICAgKiBAbmdkb2MgdHlwZQorICAgICAgICogQG5hbWUgJGNhY2hlRmFjdG9yeS5DYWNoZQorICAgICAgICoKKyAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICogQSBjYWNoZSBvYmplY3QgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YSwgcHJpbWFyaWx5IHVzZWQgYnkKKyAgICAgICAqIHtAbGluayAkaHR0cCAkaHR0cH0gYW5kIHRoZSB7QGxpbmsgbmcuZGlyZWN0aXZlOnNjcmlwdCBzY3JpcHR9IGRpcmVjdGl2ZSB0byBjYWNoZQorICAgICAgICogdGVtcGxhdGVzIGFuZCBvdGhlciBkYXRhLgorICAgICAgICoKKyAgICAgICAqIGBgYGpzCisgICAgICAgKiAgYW5ndWxhci5tb2R1bGUoJ3N1cGVyQ2FjaGUnKQorICAgICAgICogICAgLmZhY3RvcnkoJ3N1cGVyQ2FjaGUnLCBbJyRjYWNoZUZhY3RvcnknLCBmdW5jdGlvbigkY2FjaGVGYWN0b3J5KSB7CisgICAgICAgKiAgICAgIHJldHVybiAkY2FjaGVGYWN0b3J5KCdzdXBlci1jYWNoZScpOworICAgICAgICogICAgfV0pOworICAgICAgICogYGBgCisgICAgICAgKgorICAgICAgICogRXhhbXBsZSB0ZXN0OgorICAgICAgICoKKyAgICAgICAqIGBgYGpzCisgICAgICAgKiAgaXQoJ3Nob3VsZCBiZWhhdmUgbGlrZSBhIGNhY2hlJywgaW5qZWN0KGZ1bmN0aW9uKHN1cGVyQ2FjaGUpIHsKKyAgICAgICAqICAgIHN1cGVyQ2FjaGUucHV0KCdrZXknLCAndmFsdWUnKTsKKyAgICAgICAqICAgIHN1cGVyQ2FjaGUucHV0KCdhbm90aGVyIGtleScsICdhbm90aGVyIHZhbHVlJyk7CisgICAgICAgKgorICAgICAgICogICAgZXhwZWN0KHN1cGVyQ2FjaGUuaW5mbygpKS50b0VxdWFsKHsKKyAgICAgICAqICAgICAgaWQ6ICdzdXBlci1jYWNoZScsCisgICAgICAgKiAgICAgIHNpemU6IDIKKyAgICAgICAqICAgIH0pOworICAgICAgICoKKyAgICAgICAqICAgIHN1cGVyQ2FjaGUucmVtb3ZlKCdhbm90aGVyIGtleScpOworICAgICAgICogICAgZXhwZWN0KHN1cGVyQ2FjaGUuZ2V0KCdhbm90aGVyIGtleScpKS50b0JlVW5kZWZpbmVkKCk7CisgICAgICAgKgorICAgICAgICogICAgc3VwZXJDYWNoZS5yZW1vdmVBbGwoKTsKKyAgICAgICAqICAgIGV4cGVjdChzdXBlckNhY2hlLmluZm8oKSkudG9FcXVhbCh7CisgICAgICAgKiAgICAgIGlkOiAnc3VwZXItY2FjaGUnLAorICAgICAgICogICAgICBzaXplOiAwCisgICAgICAgKiAgICB9KTsKKyAgICAgICAqICB9KSk7CisgICAgICAgKiBgYGAKKyAgICAgICAqLworICAgICAgcmV0dXJuIGNhY2hlc1tjYWNoZUlkXSA9IHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5LkNhY2hlI3B1dAorICAgICAgICAgKiBAa2luZCBmdW5jdGlvbgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAgICogSW5zZXJ0cyBhIG5hbWVkIGVudHJ5IGludG8gdGhlIHtAbGluayAkY2FjaGVGYWN0b3J5LkNhY2hlIENhY2hlfSBvYmplY3QgdG8gYmUKKyAgICAgICAgICogcmV0cmlldmVkIGxhdGVyLCBhbmQgaW5jcmVtZW50aW5nIHRoZSBzaXplIG9mIHRoZSBjYWNoZSBpZiB0aGUga2V5IHdhcyBub3QgYWxyZWFkeQorICAgICAgICAgKiBwcmVzZW50IGluIHRoZSBjYWNoZS4gSWYgYmVoYXZpbmcgbGlrZSBhbiBMUlUgY2FjaGUsIGl0IHdpbGwgYWxzbyByZW1vdmUgc3RhbGUKKyAgICAgICAgICogZW50cmllcyBmcm9tIHRoZSBzZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEl0IHdpbGwgbm90IGluc2VydCB1bmRlZmluZWQgdmFsdWVzIGludG8gdGhlIGNhY2hlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRoZSBrZXkgdW5kZXIgd2hpY2ggdGhlIGNhY2hlZCBkYXRhIGlzIHN0b3JlZC4KKyAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSB0aGUgdmFsdWUgdG8gc3RvcmUgYWxvbmdzaWRlIHRoZSBrZXkuIElmIGl0IGlzIHVuZGVmaW5lZCwgdGhlIGtleQorICAgICAgICAgKiAgICB3aWxsIG5vdCBiZSBzdG9yZWQuCisgICAgICAgICAqIEByZXR1cm5zIHsqfSB0aGUgdmFsdWUgc3RvcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHV0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgICAgICAgaWYgKGNhcGFjaXR5IDwgTnVtYmVyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgdmFyIGxydUVudHJ5ID0gbHJ1SGFzaFtrZXldIHx8IChscnVIYXNoW2tleV0gPSB7a2V5OiBrZXl9KTsKKworICAgICAgICAgICAgcmVmcmVzaChscnVFbnRyeSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuOworICAgICAgICAgIGlmICghKGtleSBpbiBkYXRhKSkgc2l6ZSsrOworICAgICAgICAgIGRhdGFba2V5XSA9IHZhbHVlOworCisgICAgICAgICAgaWYgKHNpemUgPiBjYXBhY2l0eSkgeworICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3RhbGVFbmQua2V5KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0sCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAgICogQG5hbWUgJGNhY2hlRmFjdG9yeS5DYWNoZSNnZXQKKyAgICAgICAgICogQGtpbmQgZnVuY3Rpb24KKyAgICAgICAgICoKKyAgICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgICAqIFJldHJpZXZlcyBuYW1lZCBkYXRhIHN0b3JlZCBpbiB0aGUge0BsaW5rICRjYWNoZUZhY3RvcnkuQ2FjaGUgQ2FjaGV9IG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSB0aGUga2V5IG9mIHRoZSBkYXRhIHRvIGJlIHJldHJpZXZlZAorICAgICAgICAgKiBAcmV0dXJucyB7Kn0gdGhlIHZhbHVlIHN0b3JlZC4KKyAgICAgICAgICovCisgICAgICAgIGdldDogZnVuY3Rpb24oa2V5KSB7CisgICAgICAgICAgaWYgKGNhcGFjaXR5IDwgTnVtYmVyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgdmFyIGxydUVudHJ5ID0gbHJ1SGFzaFtrZXldOworCisgICAgICAgICAgICBpZiAoIWxydUVudHJ5KSByZXR1cm47CisKKyAgICAgICAgICAgIHJlZnJlc2gobHJ1RW50cnkpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBkYXRhW2tleV07CisgICAgICAgIH0sCisKKworICAgICAgICAvKioKKyAgICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5LkNhY2hlI3JlbW92ZQorICAgICAgICAgKiBAa2luZCBmdW5jdGlvbgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAgICogUmVtb3ZlcyBhbiBlbnRyeSBmcm9tIHRoZSB7QGxpbmsgJGNhY2hlRmFjdG9yeS5DYWNoZSBDYWNoZX0gb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGJlIHJlbW92ZWQKKyAgICAgICAgICovCisgICAgICAgIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7CisgICAgICAgICAgaWYgKGNhcGFjaXR5IDwgTnVtYmVyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgdmFyIGxydUVudHJ5ID0gbHJ1SGFzaFtrZXldOworCisgICAgICAgICAgICBpZiAoIWxydUVudHJ5KSByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChscnVFbnRyeSA9PSBmcmVzaEVuZCkgZnJlc2hFbmQgPSBscnVFbnRyeS5wOworICAgICAgICAgICAgaWYgKGxydUVudHJ5ID09IHN0YWxlRW5kKSBzdGFsZUVuZCA9IGxydUVudHJ5Lm47CisgICAgICAgICAgICBsaW5rKGxydUVudHJ5Lm4sbHJ1RW50cnkucCk7CisKKyAgICAgICAgICAgIGRlbGV0ZSBscnVIYXNoW2tleV07CisgICAgICAgICAgfQorCisgICAgICAgICAgZGVsZXRlIGRhdGFba2V5XTsKKyAgICAgICAgICBzaXplLS07CisgICAgICAgIH0sCisKKworICAgICAgICAvKioKKyAgICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5LkNhY2hlI3JlbW92ZUFsbAorICAgICAgICAgKiBAa2luZCBmdW5jdGlvbgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAgICogQ2xlYXJzIHRoZSBjYWNoZSBvYmplY3Qgb2YgYW55IGVudHJpZXMuCisgICAgICAgICAqLworICAgICAgICByZW1vdmVBbGw6IGZ1bmN0aW9uKCkgeworICAgICAgICAgIGRhdGEgPSB7fTsKKyAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgICBscnVIYXNoID0ge307CisgICAgICAgICAgZnJlc2hFbmQgPSBzdGFsZUVuZCA9IG51bGw7CisgICAgICAgIH0sCisKKworICAgICAgICAvKioKKyAgICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICAgKiBAbmFtZSAkY2FjaGVGYWN0b3J5LkNhY2hlI2Rlc3Ryb3kKKyAgICAgICAgICogQGtpbmQgZnVuY3Rpb24KKyAgICAgICAgICoKKyAgICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgICAqIERlc3Ryb3lzIHRoZSB7QGxpbmsgJGNhY2hlRmFjdG9yeS5DYWNoZSBDYWNoZX0gb2JqZWN0IGVudGlyZWx5LAorICAgICAgICAgKiByZW1vdmluZyBpdCBmcm9tIHRoZSB7QGxpbmsgJGNhY2hlRmFjdG9yeSAkY2FjaGVGYWN0b3J5fSBzZXQuCisgICAgICAgICAqLworICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICBkYXRhID0gbnVsbDsKKyAgICAgICAgICBzdGF0cyA9IG51bGw7CisgICAgICAgICAgbHJ1SGFzaCA9IG51bGw7CisgICAgICAgICAgZGVsZXRlIGNhY2hlc1tjYWNoZUlkXTsKKyAgICAgICAgfSwKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGUjaW5mbworICAgICAgICAgKiBAa2luZCBmdW5jdGlvbgorICAgICAgICAgKgorICAgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGEgcGFydGljdWxhciB7QGxpbmsgJGNhY2hlRmFjdG9yeS5DYWNoZSBDYWNoZX0uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm5zIHtvYmplY3R9IGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgICAgICogICA8dWw+CisgICAgICAgICAqICAgICA8bGk+KippZCoqOiB0aGUgaWQgb2YgdGhlIGNhY2hlIGluc3RhbmNlPC9saT4KKyAgICAgICAgICogICAgIDxsaT4qKnNpemUqKjogdGhlIG51bWJlciBvZiBlbnRyaWVzIGtlcHQgaW4gdGhlIGNhY2hlIGluc3RhbmNlPC9saT4KKyAgICAgICAgICogICAgIDxsaT4qKi4uLioqOiBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZyb20gdGhlIG9wdGlvbnMgb2JqZWN0IHdoZW4gY3JlYXRpbmcgdGhlCisgICAgICAgICAqICAgICAgIGNhY2hlLjwvbGk+CisgICAgICAgICAqICAgPC91bD4KKyAgICAgICAgICovCisgICAgICAgIGluZm86IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHJldHVybiBleHRlbmQoe30sIHN0YXRzLCB7c2l6ZTogc2l6ZX0pOworICAgICAgICB9CisgICAgICB9OworCisKKyAgICAgIC8qKgorICAgICAgICogbWFrZXMgdGhlIGBlbnRyeWAgdGhlIGZyZXNoRW5kIG9mIHRoZSBMUlUgbGlua2VkIGxpc3QKKyAgICAgICAqLworICAgICAgZnVuY3Rpb24gcmVmcmVzaChlbnRyeSkgeworICAgICAgICBpZiAoZW50cnkgIT0gZnJlc2hFbmQpIHsKKyAgICAgICAgICBpZiAoIXN0YWxlRW5kKSB7CisgICAgICAgICAgICBzdGFsZUVuZCA9IGVudHJ5OworICAgICAgICAgIH0gZWxzZSBpZiAoc3RhbGVFbmQgPT0gZW50cnkpIHsKKyAgICAgICAgICAgIHN0YWxlRW5kID0gZW50cnkubjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBsaW5rKGVudHJ5Lm4sIGVudHJ5LnApOworICAgICAgICAgIGxpbmsoZW50cnksIGZyZXNoRW5kKTsKKyAgICAgICAgICBmcmVzaEVuZCA9IGVudHJ5OworICAgICAgICAgIGZyZXNoRW5kLm4gPSBudWxsOworICAgICAgICB9CisgICAgICB9CisKKworICAgICAgLyoqCisgICAgICAgKiBiaWRpcmVjdGlvbmFsbHkgbGlua3MgdHdvIGVudHJpZXMgb2YgdGhlIExSVSBsaW5rZWQgbGlzdAorICAgICAgICovCisgICAgICBmdW5jdGlvbiBsaW5rKG5leHRFbnRyeSwgcHJldkVudHJ5KSB7CisgICAgICAgIGlmIChuZXh0RW50cnkgIT0gcHJldkVudHJ5KSB7CisgICAgICAgICAgaWYgKG5leHRFbnRyeSkgbmV4dEVudHJ5LnAgPSBwcmV2RW50cnk7IC8vcCBzdGFuZHMgZm9yIHByZXZpb3VzLCAncHJldicgZGlkbid0IG1pbmlmeQorICAgICAgICAgIGlmIChwcmV2RW50cnkpIHByZXZFbnRyeS5uID0gbmV4dEVudHJ5OyAvL24gc3RhbmRzIGZvciBuZXh0LCAnbmV4dCcgZGlkbid0IG1pbmlmeQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgJGNhY2hlRmFjdG9yeSNpbmZvCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRoZSBjYWNoZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZAorICAgKgorICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIGtleS12YWx1ZSBtYXAgb2YgYGNhY2hlSWRgIHRvIHRoZSByZXN1bHQgb2YgY2FsbGluZyBgY2FjaGUjaW5mb2AKKyAgICovCisgICAgY2FjaGVGYWN0b3J5LmluZm8gPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBpbmZvID0ge307CisgICAgICBmb3JFYWNoKGNhY2hlcywgZnVuY3Rpb24oY2FjaGUsIGNhY2hlSWQpIHsKKyAgICAgICAgaW5mb1tjYWNoZUlkXSA9IGNhY2hlLmluZm8oKTsKKyAgICAgIH0pOworICAgICAgcmV0dXJuIGluZm87CisgICAgfTsKKworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkjZ2V0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBHZXQgYWNjZXNzIHRvIGEgY2FjaGUgb2JqZWN0IGJ5IHRoZSBgY2FjaGVJZGAgdXNlZCB3aGVuIGl0IHdhcyBjcmVhdGVkLgorICAgKgorICAgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVJZCBOYW1lIG9yIGlkIG9mIGEgY2FjaGUgdG8gYWNjZXNzLgorICAgKiBAcmV0dXJucyB7b2JqZWN0fSBDYWNoZSBvYmplY3QgaWRlbnRpZmllZCBieSB0aGUgY2FjaGVJZCBvciB1bmRlZmluZWQgaWYgbm8gc3VjaCBjYWNoZS4KKyAgICovCisgICAgY2FjaGVGYWN0b3J5LmdldCA9IGZ1bmN0aW9uKGNhY2hlSWQpIHsKKyAgICAgIHJldHVybiBjYWNoZXNbY2FjaGVJZF07CisgICAgfTsKKworCisgICAgcmV0dXJuIGNhY2hlRmFjdG9yeTsKKyAgfTsKK30KKworLyoqCisgKiBAbmdkb2Mgc2VydmljZQorICogQG5hbWUgJHRlbXBsYXRlQ2FjaGUKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFRoZSBmaXJzdCB0aW1lIGEgdGVtcGxhdGUgaXMgdXNlZCwgaXQgaXMgbG9hZGVkIGluIHRoZSB0ZW1wbGF0ZSBjYWNoZSBmb3IgcXVpY2sgcmV0cmlldmFsLiBZb3UKKyAqIGNhbiBsb2FkIHRlbXBsYXRlcyBkaXJlY3RseSBpbnRvIHRoZSBjYWNoZSBpbiBhIGBzY3JpcHRgIHRhZywgb3IgYnkgY29uc3VtaW5nIHRoZQorICogYCR0ZW1wbGF0ZUNhY2hlYCBzZXJ2aWNlIGRpcmVjdGx5LgorICoKKyAqIEFkZGluZyB2aWEgdGhlIGBzY3JpcHRgIHRhZzoKKyAqCisgKiBgYGBodG1sCisgKiAgIDxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9InRlbXBsYXRlSWQuaHRtbCI+CisgKiAgICAgPHA+VGhpcyBpcyB0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGU8L3A+CisgKiAgIDwvc2NyaXB0PgorICogYGBgCisgKgorICogKipOb3RlOioqIHRoZSBgc2NyaXB0YCB0YWcgY29udGFpbmluZyB0aGUgdGVtcGxhdGUgZG9lcyBub3QgbmVlZCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYGhlYWRgIG9mCisgKiB0aGUgZG9jdW1lbnQsIGJ1dCBpdCBtdXN0IGJlIGEgZGVzY2VuZGVudCBvZiB0aGUge0BsaW5rIG5nLiRyb290RWxlbWVudCAkcm9vdEVsZW1lbnR9IChJRSwKKyAqIGVsZW1lbnQgd2l0aCBuZy1hcHAgYXR0cmlidXRlKSwgb3RoZXJ3aXNlIHRoZSB0ZW1wbGF0ZSB3aWxsIGJlIGlnbm9yZWQuCisgKgorICogQWRkaW5nIHZpYSB0aGUgJHRlbXBsYXRlQ2FjaGUgc2VydmljZToKKyAqCisgKiBgYGBqcworICogdmFyIG15QXBwID0gYW5ndWxhci5tb2R1bGUoJ215QXBwJywgW10pOworICogbXlBcHAucnVuKGZ1bmN0aW9uKCR0ZW1wbGF0ZUNhY2hlKSB7CisgKiAgICR0ZW1wbGF0ZUNhY2hlLnB1dCgndGVtcGxhdGVJZC5odG1sJywgJ1RoaXMgaXMgdGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlJyk7CisgKiB9KTsKKyAqIGBgYAorICoKKyAqIFRvIHJldHJpZXZlIHRoZSB0ZW1wbGF0ZSBsYXRlciwgc2ltcGx5IHVzZSBpdCBpbiB5b3VyIEhUTUw6CisgKiBgYGBodG1sCisgKiA8ZGl2IG5nLWluY2x1ZGU9IiAndGVtcGxhdGVJZC5odG1sJyAiPjwvZGl2PgorICogYGBgCisgKgorICogb3IgZ2V0IGl0IHZpYSBKYXZhc2NyaXB0OgorICogYGBganMKKyAqICR0ZW1wbGF0ZUNhY2hlLmdldCgndGVtcGxhdGVJZC5odG1sJykKKyAqIGBgYAorICoKKyAqIFNlZSB7QGxpbmsgbmcuJGNhY2hlRmFjdG9yeSAkY2FjaGVGYWN0b3J5fS4KKyAqCisgKi8KK2Z1bmN0aW9uICRUZW1wbGF0ZUNhY2hlUHJvdmlkZXIoKSB7CisgIHRoaXMuJGdldCA9IFsnJGNhY2hlRmFjdG9yeScsIGZ1bmN0aW9uKCRjYWNoZUZhY3RvcnkpIHsKKyAgICByZXR1cm4gJGNhY2hlRmFjdG9yeSgndGVtcGxhdGVzJyk7CisgIH1dOworfQorCisvKiAhIFZBUklBQkxFL0ZVTkNUSU9OIE5BTUlORyBDT05WRU5USU9OUyBUSEFUIEFQUExZIFRPIFRISVMgRklMRSEKKyAqCisgKiBET00tcmVsYXRlZCB2YXJpYWJsZXM6CisgKgorICogLSAibm9kZSIgLSBET00gTm9kZQorICogLSAiZWxlbWVudCIgLSBET00gRWxlbWVudCBvciBOb2RlCisgKiAtICIkbm9kZSIgb3IgIiRlbGVtZW50IiAtIGpxTGl0ZS13cmFwcGVkIG5vZGUgb3IgZWxlbWVudAorICoKKyAqCisgKiBDb21waWxlciByZWxhdGVkIHN0dWZmOgorICoKKyAqIC0gImxpbmtGbiIgLSBsaW5raW5nIGZuIG9mIGEgc2luZ2xlIGRpcmVjdGl2ZQorICogLSAibm9kZUxpbmtGbiIgLSBmdW5jdGlvbiB0aGF0IGFnZ3JlZ2F0ZXMgYWxsIGxpbmtpbmcgZm5zIGZvciBhIHBhcnRpY3VsYXIgbm9kZQorICogLSAiY2hpbGRMaW5rRm4iIC0gIGZ1bmN0aW9uIHRoYXQgYWdncmVnYXRlcyBhbGwgbGlua2luZyBmbnMgZm9yIGNoaWxkIG5vZGVzIG9mIGEgcGFydGljdWxhciBub2RlCisgKiAtICJjb21wb3NpdGVMaW5rRm4iIC0gZnVuY3Rpb24gdGhhdCBhZ2dyZWdhdGVzIGFsbCBsaW5raW5nIGZucyBmb3IgYSBjb21waWxhdGlvbiByb290IChub2RlTGlzdCkKKyAqLworCisKKy8qKgorICogQG5nZG9jIHNlcnZpY2UKKyAqIEBuYW1lICRjb21waWxlCisgKiBAa2luZCBmdW5jdGlvbgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogQ29tcGlsZXMgYW4gSFRNTCBzdHJpbmcgb3IgRE9NIGludG8gYSB0ZW1wbGF0ZSBhbmQgcHJvZHVjZXMgYSB0ZW1wbGF0ZSBmdW5jdGlvbiwgd2hpY2gKKyAqIGNhbiB0aGVuIGJlIHVzZWQgdG8gbGluayB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBgc2NvcGVgfSBhbmQgdGhlIHRlbXBsYXRlIHRvZ2V0aGVyLgorICoKKyAqIFRoZSBjb21waWxhdGlvbiBpcyBhIHByb2Nlc3Mgb2Ygd2Fsa2luZyB0aGUgRE9NIHRyZWUgYW5kIG1hdGNoaW5nIERPTSBlbGVtZW50cyB0bworICoge0BsaW5rIG5nLiRjb21waWxlUHJvdmlkZXIjZGlyZWN0aXZlIGRpcmVjdGl2ZXN9LgorICoKKyAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgorICogKipOb3RlOioqIFRoaXMgZG9jdW1lbnQgaXMgYW4gaW4tZGVwdGggcmVmZXJlbmNlIG9mIGFsbCBkaXJlY3RpdmUgb3B0aW9ucy4KKyAqIEZvciBhIGdlbnRsZSBpbnRyb2R1Y3Rpb24gdG8gZGlyZWN0aXZlcyB3aXRoIGV4YW1wbGVzIG9mIGNvbW1vbiB1c2UgY2FzZXMsCisgKiBzZWUgdGhlIHtAbGluayBndWlkZS9kaXJlY3RpdmUgZGlyZWN0aXZlIGd1aWRlfS4KKyAqIDwvZGl2PgorICoKKyAqICMjIENvbXByZWhlbnNpdmUgRGlyZWN0aXZlIEFQSQorICoKKyAqIFRoZXJlIGFyZSBtYW55IGRpZmZlcmVudCBvcHRpb25zIGZvciBhIGRpcmVjdGl2ZS4KKyAqCisgKiBUaGUgZGlmZmVyZW5jZSByZXNpZGVzIGluIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZhY3RvcnkgZnVuY3Rpb24uCisgKiBZb3UgY2FuIGVpdGhlciByZXR1cm4gYSAiRGlyZWN0aXZlIERlZmluaXRpb24gT2JqZWN0IiAoc2VlIGJlbG93KSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGl2ZSBwcm9wZXJ0aWVzLAorICogb3IganVzdCB0aGUgYHBvc3RMaW5rYCBmdW5jdGlvbiAoYWxsIG90aGVyIHByb3BlcnRpZXMgd2lsbCBoYXZlIHRoZSBkZWZhdWx0IHZhbHVlcykuCisgKgorICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtc3VjY2VzcyI+CisgKiAqKkJlc3QgUHJhY3RpY2U6KiogSXQncyByZWNvbW1lbmRlZCB0byB1c2UgdGhlICJkaXJlY3RpdmUgZGVmaW5pdGlvbiBvYmplY3QiIGZvcm0uCisgKiA8L2Rpdj4KKyAqCisgKiBIZXJlJ3MgYW4gZXhhbXBsZSBkaXJlY3RpdmUgZGVjbGFyZWQgd2l0aCBhIERpcmVjdGl2ZSBEZWZpbml0aW9uIE9iamVjdDoKKyAqCisgKiBgYGBqcworICogICB2YXIgbXlNb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSguLi4pOworICoKKyAqICAgbXlNb2R1bGUuZGlyZWN0aXZlKCdkaXJlY3RpdmVOYW1lJywgZnVuY3Rpb24gZmFjdG9yeShpbmplY3RhYmxlcykgeworICogICAgIHZhciBkaXJlY3RpdmVEZWZpbml0aW9uT2JqZWN0ID0geworICogICAgICAgcHJpb3JpdHk6IDAsCisgKiAgICAgICB0ZW1wbGF0ZTogJzxkaXY+PC9kaXY+JywgLy8gb3IgLy8gZnVuY3Rpb24odEVsZW1lbnQsIHRBdHRycykgeyAuLi4gfSwKKyAqICAgICAgIC8vIG9yCisgKiAgICAgICAvLyB0ZW1wbGF0ZVVybDogJ2RpcmVjdGl2ZS5odG1sJywgLy8gb3IgLy8gZnVuY3Rpb24odEVsZW1lbnQsIHRBdHRycykgeyAuLi4gfSwKKyAqICAgICAgIHRyYW5zY2x1ZGU6IGZhbHNlLAorICogICAgICAgcmVzdHJpY3Q6ICdBJywKKyAqICAgICAgIHRlbXBsYXRlTmFtZXNwYWNlOiAnaHRtbCcsCisgKiAgICAgICBzY29wZTogZmFsc2UsCisgKiAgICAgICBjb250cm9sbGVyOiBmdW5jdGlvbigkc2NvcGUsICRlbGVtZW50LCAkYXR0cnMsICR0cmFuc2NsdWRlLCBvdGhlckluamVjdGFibGVzKSB7IC4uLiB9LAorICogICAgICAgY29udHJvbGxlckFzOiAnc3RyaW5nQWxpYXMnLAorICogICAgICAgcmVxdWlyZTogJ3NpYmxpbmdEaXJlY3RpdmVOYW1lJywgLy8gb3IgLy8gWydecGFyZW50RGlyZWN0aXZlTmFtZScsICc/b3B0aW9uYWxEaXJlY3RpdmVOYW1lJywgJz9eb3B0aW9uYWxQYXJlbnQnXSwKKyAqICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uIGNvbXBpbGUodEVsZW1lbnQsIHRBdHRycywgdHJhbnNjbHVkZSkgeworICogICAgICAgICByZXR1cm4geworICogICAgICAgICAgIHByZTogZnVuY3Rpb24gcHJlTGluayhzY29wZSwgaUVsZW1lbnQsIGlBdHRycywgY29udHJvbGxlcikgeyAuLi4gfSwKKyAqICAgICAgICAgICBwb3N0OiBmdW5jdGlvbiBwb3N0TGluayhzY29wZSwgaUVsZW1lbnQsIGlBdHRycywgY29udHJvbGxlcikgeyAuLi4gfQorICogICAgICAgICB9CisgKiAgICAgICAgIC8vIG9yCisgKiAgICAgICAgIC8vIHJldHVybiBmdW5jdGlvbiBwb3N0TGluayggLi4uICkgeyAuLi4gfQorICogICAgICAgfSwKKyAqICAgICAgIC8vIG9yCisgKiAgICAgICAvLyBsaW5rOiB7CisgKiAgICAgICAvLyAgcHJlOiBmdW5jdGlvbiBwcmVMaW5rKHNjb3BlLCBpRWxlbWVudCwgaUF0dHJzLCBjb250cm9sbGVyKSB7IC4uLiB9LAorICogICAgICAgLy8gIHBvc3Q6IGZ1bmN0aW9uIHBvc3RMaW5rKHNjb3BlLCBpRWxlbWVudCwgaUF0dHJzLCBjb250cm9sbGVyKSB7IC4uLiB9CisgKiAgICAgICAvLyB9CisgKiAgICAgICAvLyBvcgorICogICAgICAgLy8gbGluazogZnVuY3Rpb24gcG9zdExpbmsoIC4uLiApIHsgLi4uIH0KKyAqICAgICB9OworICogICAgIHJldHVybiBkaXJlY3RpdmVEZWZpbml0aW9uT2JqZWN0OworICogICB9KTsKKyAqIGBgYAorICoKKyAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgorICogKipOb3RlOioqIEFueSB1bnNwZWNpZmllZCBvcHRpb25zIHdpbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIHNlZSB0aGUgZGVmYXVsdCB2YWx1ZXMgYmVsb3cuCisgKiA8L2Rpdj4KKyAqCisgKiBUaGVyZWZvcmUgdGhlIGFib3ZlIGNhbiBiZSBzaW1wbGlmaWVkIGFzOgorICoKKyAqIGBgYGpzCisgKiAgIHZhciBteU1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKC4uLik7CisgKgorICogICBteU1vZHVsZS5kaXJlY3RpdmUoJ2RpcmVjdGl2ZU5hbWUnLCBmdW5jdGlvbiBmYWN0b3J5KGluamVjdGFibGVzKSB7CisgKiAgICAgdmFyIGRpcmVjdGl2ZURlZmluaXRpb25PYmplY3QgPSB7CisgKiAgICAgICBsaW5rOiBmdW5jdGlvbiBwb3N0TGluayhzY29wZSwgaUVsZW1lbnQsIGlBdHRycykgeyAuLi4gfQorICogICAgIH07CisgKiAgICAgcmV0dXJuIGRpcmVjdGl2ZURlZmluaXRpb25PYmplY3Q7CisgKiAgICAgLy8gb3IKKyAqICAgICAvLyByZXR1cm4gZnVuY3Rpb24gcG9zdExpbmsoc2NvcGUsIGlFbGVtZW50LCBpQXR0cnMpIHsgLi4uIH0KKyAqICAgfSk7CisgKiBgYGAKKyAqCisgKgorICoKKyAqICMjIyBEaXJlY3RpdmUgRGVmaW5pdGlvbiBPYmplY3QKKyAqCisgKiBUaGUgZGlyZWN0aXZlIGRlZmluaXRpb24gb2JqZWN0IHByb3ZpZGVzIGluc3RydWN0aW9ucyB0byB0aGUge0BsaW5rIG5nLiRjb21waWxlCisgKiBjb21waWxlcn0uIFRoZSBhdHRyaWJ1dGVzIGFyZToKKyAqCisgKiAjIyMjIGBtdWx0aUVsZW1lbnRgCisgKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIHRydWUsIHRoZSBIVE1MIGNvbXBpbGVyIHdpbGwgY29sbGVjdCBET00gbm9kZXMgYmV0d2VlbgorICogbm9kZXMgd2l0aCB0aGUgYXR0cmlidXRlcyBgZGlyZWN0aXZlLW5hbWUtc3RhcnRgIGFuZCBgZGlyZWN0aXZlLW5hbWUtZW5kYCwgYW5kIGdyb3VwIHRoZW0KKyAqIHRvZ2V0aGVyIGFzIHRoZSBkaXJlY3RpdmUgZWxlbWVudHMuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBmZWF0dXJlIGJlIHVzZWQgb24gZGlyZWN0aXZlcworICogd2hpY2ggYXJlIG5vdCBzdHJpY3RseSBiZWhhdmlvdXJhbCAoc3VjaCBhcyB7QGxpbmsgbmdDbGlja30pLCBhbmQgd2hpY2gKKyAqIGRvIG5vdCBtYW5pcHVsYXRlIG9yIHJlcGxhY2UgY2hpbGQgbm9kZXMgKHN1Y2ggYXMge0BsaW5rIG5nSW5jbHVkZX0pLgorICoKKyAqICMjIyMgYHByaW9yaXR5YAorICogV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZGlyZWN0aXZlcyBkZWZpbmVkIG9uIGEgc2luZ2xlIERPTSBlbGVtZW50LCBzb21ldGltZXMgaXQKKyAqIGlzIG5lY2Vzc2FyeSB0byBzcGVjaWZ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlyZWN0aXZlcyBhcmUgYXBwbGllZC4gVGhlIGBwcmlvcml0eWAgaXMgdXNlZAorICogdG8gc29ydCB0aGUgZGlyZWN0aXZlcyBiZWZvcmUgdGhlaXIgYGNvbXBpbGVgIGZ1bmN0aW9ucyBnZXQgY2FsbGVkLiBQcmlvcml0eSBpcyBkZWZpbmVkIGFzIGEKKyAqIG51bWJlci4gRGlyZWN0aXZlcyB3aXRoIGdyZWF0ZXIgbnVtZXJpY2FsIGBwcmlvcml0eWAgYXJlIGNvbXBpbGVkIGZpcnN0LiBQcmUtbGluayBmdW5jdGlvbnMKKyAqIGFyZSBhbHNvIHJ1biBpbiBwcmlvcml0eSBvcmRlciwgYnV0IHBvc3QtbGluayBmdW5jdGlvbnMgYXJlIHJ1biBpbiByZXZlcnNlIG9yZGVyLiBUaGUgb3JkZXIKKyAqIG9mIGRpcmVjdGl2ZXMgd2l0aCB0aGUgc2FtZSBwcmlvcml0eSBpcyB1bmRlZmluZWQuIFRoZSBkZWZhdWx0IHByaW9yaXR5IGlzIGAwYC4KKyAqCisgKiAjIyMjIGB0ZXJtaW5hbGAKKyAqIElmIHNldCB0byB0cnVlIHRoZW4gdGhlIGN1cnJlbnQgYHByaW9yaXR5YCB3aWxsIGJlIHRoZSBsYXN0IHNldCBvZiBkaXJlY3RpdmVzCisgKiB3aGljaCB3aWxsIGV4ZWN1dGUgKGFueSBkaXJlY3RpdmVzIGF0IHRoZSBjdXJyZW50IHByaW9yaXR5IHdpbGwgc3RpbGwgZXhlY3V0ZQorICogYXMgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiBvbiBzYW1lIGBwcmlvcml0eWAgaXMgdW5kZWZpbmVkKS4gTm90ZSB0aGF0IGV4cHJlc3Npb25zCisgKiBhbmQgb3RoZXIgZGlyZWN0aXZlcyB1c2VkIGluIHRoZSBkaXJlY3RpdmUncyB0ZW1wbGF0ZSB3aWxsIGFsc28gYmUgZXhjbHVkZWQgZnJvbSBleGVjdXRpb24uCisgKgorICogIyMjIyBgc2NvcGVgCisgKiAqKklmIHNldCB0byBgdHJ1ZWAsKiogdGhlbiBhIG5ldyBzY29wZSB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoaXMgZGlyZWN0aXZlLiBJZiBtdWx0aXBsZSBkaXJlY3RpdmVzIG9uIHRoZQorICogc2FtZSBlbGVtZW50IHJlcXVlc3QgYSBuZXcgc2NvcGUsIG9ubHkgb25lIG5ldyBzY29wZSBpcyBjcmVhdGVkLiBUaGUgbmV3IHNjb3BlIHJ1bGUgZG9lcyBub3QKKyAqIGFwcGx5IGZvciB0aGUgcm9vdCBvZiB0aGUgdGVtcGxhdGUgc2luY2UgdGhlIHJvb3Qgb2YgdGhlIHRlbXBsYXRlIGFsd2F5cyBnZXRzIGEgbmV3IHNjb3BlLgorICoKKyAqICoqSWYgc2V0IHRvIGB7fWAgKG9iamVjdCBoYXNoKSwqKiB0aGVuIGEgbmV3ICJpc29sYXRlIiBzY29wZSBpcyBjcmVhdGVkLiBUaGUgJ2lzb2xhdGUnIHNjb3BlIGRpZmZlcnMgZnJvbQorICogbm9ybWFsIHNjb3BlIGluIHRoYXQgaXQgZG9lcyBub3QgcHJvdG90eXBpY2FsbHkgaW5oZXJpdCBmcm9tIHRoZSBwYXJlbnQgc2NvcGUuIFRoaXMgaXMgdXNlZnVsCisgKiB3aGVuIGNyZWF0aW5nIHJldXNhYmxlIGNvbXBvbmVudHMsIHdoaWNoIHNob3VsZCBub3QgYWNjaWRlbnRhbGx5IHJlYWQgb3IgbW9kaWZ5IGRhdGEgaW4gdGhlCisgKiBwYXJlbnQgc2NvcGUuCisgKgorICogVGhlICdpc29sYXRlJyBzY29wZSB0YWtlcyBhbiBvYmplY3QgaGFzaCB3aGljaCBkZWZpbmVzIGEgc2V0IG9mIGxvY2FsIHNjb3BlIHByb3BlcnRpZXMKKyAqIGRlcml2ZWQgZnJvbSB0aGUgcGFyZW50IHNjb3BlLiBUaGVzZSBsb2NhbCBwcm9wZXJ0aWVzIGFyZSB1c2VmdWwgZm9yIGFsaWFzaW5nIHZhbHVlcyBmb3IKKyAqIHRlbXBsYXRlcy4gTG9jYWxzIGRlZmluaXRpb24gaXMgYSBoYXNoIG9mIGxvY2FsIHNjb3BlIHByb3BlcnR5IHRvIGl0cyBzb3VyY2U6CisgKgorICogKiBgQGAgb3IgYEBhdHRyYCAtIGJpbmQgYSBsb2NhbCBzY29wZSBwcm9wZXJ0eSB0byB0aGUgdmFsdWUgb2YgRE9NIGF0dHJpYnV0ZS4gVGhlIHJlc3VsdCBpcworICogICBhbHdheXMgYSBzdHJpbmcgc2luY2UgRE9NIGF0dHJpYnV0ZXMgYXJlIHN0cmluZ3MuIElmIG5vIGBhdHRyYCBuYW1lIGlzIHNwZWNpZmllZCAgdGhlbiB0aGUKKyAqICAgYXR0cmlidXRlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgbG9jYWwgbmFtZS4KKyAqICAgR2l2ZW4gYDx3aWRnZXQgbXktYXR0cj0iaGVsbG8ge3tuYW1lfX0iPmAgYW5kIHdpZGdldCBkZWZpbml0aW9uCisgKiAgIG9mIGBzY29wZTogeyBsb2NhbE5hbWU6J0BteUF0dHInIH1gLCB0aGVuIHdpZGdldCBzY29wZSBwcm9wZXJ0eSBgbG9jYWxOYW1lYCB3aWxsIHJlZmxlY3QKKyAqICAgdGhlIGludGVycG9sYXRlZCB2YWx1ZSBvZiBgaGVsbG8ge3tuYW1lfX1gLiBBcyB0aGUgYG5hbWVgIGF0dHJpYnV0ZSBjaGFuZ2VzIHNvIHdpbGwgdGhlCisgKiAgIGBsb2NhbE5hbWVgIHByb3BlcnR5IG9uIHRoZSB3aWRnZXQgc2NvcGUuIFRoZSBgbmFtZWAgaXMgcmVhZCBmcm9tIHRoZSBwYXJlbnQgc2NvcGUgKG5vdAorICogICBjb21wb25lbnQgc2NvcGUpLgorICoKKyAqICogYD1gIG9yIGA9YXR0cmAgLSBzZXQgdXAgYmktZGlyZWN0aW9uYWwgYmluZGluZyBiZXR3ZWVuIGEgbG9jYWwgc2NvcGUgcHJvcGVydHkgYW5kIHRoZQorICogICBwYXJlbnQgc2NvcGUgcHJvcGVydHkgb2YgbmFtZSBkZWZpbmVkIHZpYSB0aGUgdmFsdWUgb2YgdGhlIGBhdHRyYCBhdHRyaWJ1dGUuIElmIG5vIGBhdHRyYAorICogICBuYW1lIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBsb2NhbCBuYW1lLgorICogICBHaXZlbiBgPHdpZGdldCBteS1hdHRyPSJwYXJlbnRNb2RlbCI+YCBhbmQgd2lkZ2V0IGRlZmluaXRpb24gb2YKKyAqICAgYHNjb3BlOiB7IGxvY2FsTW9kZWw6Jz1teUF0dHInIH1gLCB0aGVuIHdpZGdldCBzY29wZSBwcm9wZXJ0eSBgbG9jYWxNb2RlbGAgd2lsbCByZWZsZWN0IHRoZQorICogICB2YWx1ZSBvZiBgcGFyZW50TW9kZWxgIG9uIHRoZSBwYXJlbnQgc2NvcGUuIEFueSBjaGFuZ2VzIHRvIGBwYXJlbnRNb2RlbGAgd2lsbCBiZSByZWZsZWN0ZWQKKyAqICAgaW4gYGxvY2FsTW9kZWxgIGFuZCBhbnkgY2hhbmdlcyBpbiBgbG9jYWxNb2RlbGAgd2lsbCByZWZsZWN0IGluIGBwYXJlbnRNb2RlbGAuIElmIHRoZSBwYXJlbnQKKyAqICAgc2NvcGUgcHJvcGVydHkgZG9lc24ndCBleGlzdCwgaXQgd2lsbCB0aHJvdyBhIE5PTl9BU1NJR05BQkxFX01PREVMX0VYUFJFU1NJT04gZXhjZXB0aW9uLiBZb3UKKyAqICAgY2FuIGF2b2lkIHRoaXMgYmVoYXZpb3IgdXNpbmcgYD0/YCBvciBgPT9hdHRyYCBpbiBvcmRlciB0byBmbGFnIHRoZSBwcm9wZXJ0eSBhcyBvcHRpb25hbC4gSWYKKyAqICAgeW91IHdhbnQgdG8gc2hhbGxvdyB3YXRjaCBmb3IgY2hhbmdlcyAoaS5lLiAkd2F0Y2hDb2xsZWN0aW9uIGluc3RlYWQgb2YgJHdhdGNoKSB5b3UgY2FuIHVzZQorICogICBgPSpgIG9yIGA9KmF0dHJgIChgPSo/YCBvciBgPSo/YXR0cmAgaWYgdGhlIHByb3BlcnR5IGlzIG9wdGlvbmFsKS4KKyAqCisgKiAqIGAmYCBvciBgJmF0dHJgIC0gcHJvdmlkZXMgYSB3YXkgdG8gZXhlY3V0ZSBhbiBleHByZXNzaW9uIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwYXJlbnQgc2NvcGUuCisgKiAgIElmIG5vIGBhdHRyYCBuYW1lIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZQorICogICBsb2NhbCBuYW1lLiBHaXZlbiBgPHdpZGdldCBteS1hdHRyPSJjb3VudCA9IGNvdW50ICsgdmFsdWUiPmAgYW5kIHdpZGdldCBkZWZpbml0aW9uIG9mCisgKiAgIGBzY29wZTogeyBsb2NhbEZuOicmbXlBdHRyJyB9YCwgdGhlbiBpc29sYXRlIHNjb3BlIHByb3BlcnR5IGBsb2NhbEZuYCB3aWxsIHBvaW50IHRvCisgKiAgIGEgZnVuY3Rpb24gd3JhcHBlciBmb3IgdGhlIGBjb3VudCA9IGNvdW50ICsgdmFsdWVgIGV4cHJlc3Npb24uIE9mdGVuIGl0J3MgZGVzaXJhYmxlIHRvCisgKiAgIHBhc3MgZGF0YSBmcm9tIHRoZSBpc29sYXRlZCBzY29wZSB2aWEgYW4gZXhwcmVzc2lvbiB0byB0aGUgcGFyZW50IHNjb3BlLCB0aGlzIGNhbiBiZQorICogICBkb25lIGJ5IHBhc3NpbmcgYSBtYXAgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMgYW5kIHZhbHVlcyBpbnRvIHRoZSBleHByZXNzaW9uIHdyYXBwZXIgZm4uCisgKiAgIEZvciBleGFtcGxlLCBpZiB0aGUgZXhwcmVzc2lvbiBpcyBgaW5jcmVtZW50KGFtb3VudClgIHRoZW4gd2UgY2FuIHNwZWNpZnkgdGhlIGFtb3VudCB2YWx1ZQorICogICBieSBjYWxsaW5nIHRoZSBgbG9jYWxGbmAgYXMgYGxvY2FsRm4oe2Ftb3VudDogMjJ9KWAuCisgKgorICoKKyAqICMjIyMgYGJpbmRUb0NvbnRyb2xsZXJgCisgKiBXaGVuIGFuIGlzb2xhdGUgc2NvcGUgaXMgdXNlZCBmb3IgYSBjb21wb25lbnQgKHNlZSBhYm92ZSksIGFuZCBgY29udHJvbGxlckFzYCBpcyB1c2VkLCBgYmluZFRvQ29udHJvbGxlcjogdHJ1ZWAgd2lsbAorICogYWxsb3cgYSBjb21wb25lbnQgdG8gaGF2ZSBpdHMgcHJvcGVydGllcyBib3VuZCB0byB0aGUgY29udHJvbGxlciwgcmF0aGVyIHRoYW4gdG8gc2NvcGUuIFdoZW4gdGhlIGNvbnRyb2xsZXIKKyAqIGlzIGluc3RhbnRpYXRlZCwgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBpc29sYXRlIHNjb3BlIGJpbmRpbmdzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZS4KKyAqCisgKiAjIyMjIGBjb250cm9sbGVyYAorICogQ29udHJvbGxlciBjb25zdHJ1Y3RvciBmdW5jdGlvbi4gVGhlIGNvbnRyb2xsZXIgaXMgaW5zdGFudGlhdGVkIGJlZm9yZSB0aGUKKyAqIHByZS1saW5raW5nIHBoYXNlIGFuZCBpdCBpcyBzaGFyZWQgd2l0aCBvdGhlciBkaXJlY3RpdmVzIChzZWUKKyAqIGByZXF1aXJlYCBhdHRyaWJ1dGUpLiBUaGlzIGFsbG93cyB0aGUgZGlyZWN0aXZlcyB0byBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgYW5kIGF1Z21lbnQKKyAqIGVhY2ggb3RoZXIncyBiZWhhdmlvci4gVGhlIGNvbnRyb2xsZXIgaXMgaW5qZWN0YWJsZSAoYW5kIHN1cHBvcnRzIGJyYWNrZXQgbm90YXRpb24pIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhbHM6CisgKgorICogKiBgJHNjb3BlYCAtIEN1cnJlbnQgc2NvcGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50CisgKiAqIGAkZWxlbWVudGAgLSBDdXJyZW50IGVsZW1lbnQKKyAqICogYCRhdHRyc2AgLSBDdXJyZW50IGF0dHJpYnV0ZXMgb2JqZWN0IGZvciB0aGUgZWxlbWVudAorICogKiBgJHRyYW5zY2x1ZGVgIC0gQSB0cmFuc2NsdWRlIGxpbmtpbmcgZnVuY3Rpb24gcHJlLWJvdW5kIHRvIHRoZSBjb3JyZWN0IHRyYW5zY2x1c2lvbiBzY29wZToKKyAqICAgYGZ1bmN0aW9uKFtzY29wZV0sIGNsb25lTGlua2luZ0ZuLCBmdXR1cmVQYXJlbnRFbGVtZW50KWAuCisgKiAgICAqIGBzY29wZWA6IG9wdGlvbmFsIGFyZ3VtZW50IHRvIG92ZXJyaWRlIHRoZSBzY29wZS4KKyAqICAgICogYGNsb25lTGlua2luZ0ZuYDogb3B0aW9uYWwgYXJndW1lbnQgdG8gY3JlYXRlIGNsb25lcyBvZiB0aGUgb3JpZ2luYWwgdHJhbnNjbHVkZWQgY29udGVudC4KKyAqICAgICogYGZ1dHVyZVBhcmVudEVsZW1lbnRgOgorICogICAgICAgICogZGVmaW5lcyB0aGUgcGFyZW50IHRvIHdoaWNoIHRoZSBgY2xvbmVMaW5raW5nRm5gIHdpbGwgYWRkIHRoZSBjbG9uZWQgZWxlbWVudHMuCisgKiAgICAgICAgKiBkZWZhdWx0OiBgJGVsZW1lbnQucGFyZW50KClgIHJlc3AuIGAkZWxlbWVudGAgZm9yIGB0cmFuc2NsdWRlOidlbGVtZW50J2AgcmVzcC4gYHRyYW5zY2x1ZGU6dHJ1ZWAuCisgKiAgICAgICAgKiBvbmx5IG5lZWRlZCBmb3IgdHJhbnNjbHVkZXMgdGhhdCBhcmUgYWxsb3dlZCB0byBjb250YWluIG5vbiBodG1sIGVsZW1lbnRzIChlLmcuIFNWRyBlbGVtZW50cykKKyAqICAgICAgICAgIGFuZCB3aGVuIHRoZSBgY2xvbmVMaW5raW5GbmAgaXMgcGFzc2VkLAorICogICAgICAgICAgYXMgdGhvc2UgZWxlbWVudHMgbmVlZCB0byBjcmVhdGVkIGFuZCBjbG9uZWQgaW4gYSBzcGVjaWFsIHdheSB3aGVuIHRoZXkgYXJlIGRlZmluZWQgb3V0c2lkZSB0aGVpcgorICogICAgICAgICAgdXN1YWwgY29udGFpbmVycyAoZS5nLiBsaWtlIGA8c3ZnPmApLgorICogICAgICAgICogU2VlIGFsc28gdGhlIGBkaXJlY3RpdmUudGVtcGxhdGVOYW1lc3BhY2VgIHByb3BlcnR5LgorICoKKyAqCisgKiAjIyMjIGByZXF1aXJlYAorICogUmVxdWlyZSBhbm90aGVyIGRpcmVjdGl2ZSBhbmQgaW5qZWN0IGl0cyBjb250cm9sbGVyIGFzIHRoZSBmb3VydGggYXJndW1lbnQgdG8gdGhlIGxpbmtpbmcgZnVuY3Rpb24uIFRoZQorICogYHJlcXVpcmVgIHRha2VzIGEgc3RyaW5nIG5hbWUgKG9yIGFycmF5IG9mIHN0cmluZ3MpIG9mIHRoZSBkaXJlY3RpdmUocykgdG8gcGFzcyBpbi4gSWYgYW4gYXJyYXkgaXMgdXNlZCwgdGhlCisgKiBpbmplY3RlZCBhcmd1bWVudCB3aWxsIGJlIGFuIGFycmF5IGluIGNvcnJlc3BvbmRpbmcgb3JkZXIuIElmIG5vIHN1Y2ggZGlyZWN0aXZlIGNhbiBiZQorICogZm91bmQsIG9yIGlmIHRoZSBkaXJlY3RpdmUgZG9lcyBub3QgaGF2ZSBhIGNvbnRyb2xsZXIsIHRoZW4gYW4gZXJyb3IgaXMgcmFpc2VkLiBUaGUgbmFtZSBjYW4gYmUgcHJlZml4ZWQgd2l0aDoKKyAqCisgKiAqIChubyBwcmVmaXgpIC0gTG9jYXRlIHRoZSByZXF1aXJlZCBjb250cm9sbGVyIG9uIHRoZSBjdXJyZW50IGVsZW1lbnQuIFRocm93IGFuIGVycm9yIGlmIG5vdCBmb3VuZC4KKyAqICogYD9gIC0gQXR0ZW1wdCB0byBsb2NhdGUgdGhlIHJlcXVpcmVkIGNvbnRyb2xsZXIgb3IgcGFzcyBgbnVsbGAgdG8gdGhlIGBsaW5rYCBmbiBpZiBub3QgZm91bmQuCisgKiAqIGBeYCAtIExvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBieSBzZWFyY2hpbmcgdGhlIGVsZW1lbnQgYW5kIGl0cyBwYXJlbnRzLiBUaHJvdyBhbiBlcnJvciBpZiBub3QgZm91bmQuCisgKiAqIGBeXmAgLSBMb2NhdGUgdGhlIHJlcXVpcmVkIGNvbnRyb2xsZXIgYnkgc2VhcmNoaW5nIHRoZSBlbGVtZW50J3MgcGFyZW50cy4gVGhyb3cgYW4gZXJyb3IgaWYgbm90IGZvdW5kLgorICogKiBgP15gIC0gQXR0ZW1wdCB0byBsb2NhdGUgdGhlIHJlcXVpcmVkIGNvbnRyb2xsZXIgYnkgc2VhcmNoaW5nIHRoZSBlbGVtZW50IGFuZCBpdHMgcGFyZW50cyBvciBwYXNzCisgKiAgIGBudWxsYCB0byB0aGUgYGxpbmtgIGZuIGlmIG5vdCBmb3VuZC4KKyAqICogYD9eXmAgLSBBdHRlbXB0IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBieSBzZWFyY2hpbmcgdGhlIGVsZW1lbnQncyBwYXJlbnRzLCBvciBwYXNzCisgKiAgIGBudWxsYCB0byB0aGUgYGxpbmtgIGZuIGlmIG5vdCBmb3VuZC4KKyAqCisgKgorICogIyMjIyBgY29udHJvbGxlckFzYAorICogQ29udHJvbGxlciBhbGlhcyBhdCB0aGUgZGlyZWN0aXZlIHNjb3BlLiBBbiBhbGlhcyBmb3IgdGhlIGNvbnRyb2xsZXIgc28gaXQKKyAqIGNhbiBiZSByZWZlcmVuY2VkIGF0IHRoZSBkaXJlY3RpdmUgdGVtcGxhdGUuIFRoZSBkaXJlY3RpdmUgbmVlZHMgdG8gZGVmaW5lIGEgc2NvcGUgZm9yIHRoaXMKKyAqIGNvbmZpZ3VyYXRpb24gdG8gYmUgdXNlZC4gVXNlZnVsIGluIHRoZSBjYXNlIHdoZW4gZGlyZWN0aXZlIGlzIHVzZWQgYXMgY29tcG9uZW50LgorICoKKyAqCisgKiAjIyMjIGByZXN0cmljdGAKKyAqIFN0cmluZyBvZiBzdWJzZXQgb2YgYEVBQ01gIHdoaWNoIHJlc3RyaWN0cyB0aGUgZGlyZWN0aXZlIHRvIGEgc3BlY2lmaWMgZGlyZWN0aXZlCisgKiBkZWNsYXJhdGlvbiBzdHlsZS4gSWYgb21pdHRlZCwgdGhlIGRlZmF1bHRzIChlbGVtZW50cyBhbmQgYXR0cmlidXRlcykgYXJlIHVzZWQuCisgKgorICogKiBgRWAgLSBFbGVtZW50IG5hbWUgKGRlZmF1bHQpOiBgPG15LWRpcmVjdGl2ZT48L215LWRpcmVjdGl2ZT5gCisgKiAqIGBBYCAtIEF0dHJpYnV0ZSAoZGVmYXVsdCk6IGA8ZGl2IG15LWRpcmVjdGl2ZT0iZXhwIj48L2Rpdj5gCisgKiAqIGBDYCAtIENsYXNzOiBgPGRpdiBjbGFzcz0ibXktZGlyZWN0aXZlOiBleHA7Ij48L2Rpdj5gCisgKiAqIGBNYCAtIENvbW1lbnQ6IGA8IS0tIGRpcmVjdGl2ZTogbXktZGlyZWN0aXZlIGV4cCAtLT5gCisgKgorICoKKyAqICMjIyMgYHRlbXBsYXRlTmFtZXNwYWNlYAorICogU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZG9jdW1lbnQgdHlwZSB1c2VkIGJ5IHRoZSBtYXJrdXAgaW4gdGhlIHRlbXBsYXRlLgorICogQW5ndWxhckpTIG5lZWRzIHRoaXMgaW5mb3JtYXRpb24gYXMgdGhvc2UgZWxlbWVudHMgbmVlZCB0byBiZSBjcmVhdGVkIGFuZCBjbG9uZWQKKyAqIGluIGEgc3BlY2lhbCB3YXkgd2hlbiB0aGV5IGFyZSBkZWZpbmVkIG91dHNpZGUgdGhlaXIgdXN1YWwgY29udGFpbmVycyBsaWtlIGA8c3ZnPmAgYW5kIGA8bWF0aD5gLgorICoKKyAqICogYGh0bWxgIC0gQWxsIHJvb3Qgbm9kZXMgaW4gdGhlIHRlbXBsYXRlIGFyZSBIVE1MLiBSb290IG5vZGVzIG1heSBhbHNvIGJlCisgKiAgIHRvcC1sZXZlbCBlbGVtZW50cyBzdWNoIGFzIGA8c3ZnPmAgb3IgYDxtYXRoPmAuCisgKiAqIGBzdmdgIC0gVGhlIHJvb3Qgbm9kZXMgaW4gdGhlIHRlbXBsYXRlIGFyZSBTVkcgZWxlbWVudHMgKGV4Y2x1ZGluZyBgPG1hdGg+YCkuCisgKiAqIGBtYXRoYCAtIFRoZSByb290IG5vZGVzIGluIHRoZSB0ZW1wbGF0ZSBhcmUgTWF0aE1MIGVsZW1lbnRzIChleGNsdWRpbmcgYDxzdmc+YCkuCisgKgorICogSWYgbm8gYHRlbXBsYXRlTmFtZXNwYWNlYCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIG5hbWVzcGFjZSBpcyBjb25zaWRlcmVkIHRvIGJlIGBodG1sYC4KKyAqCisgKiAjIyMjIGB0ZW1wbGF0ZWAKKyAqIEhUTUwgbWFya3VwIHRoYXQgbWF5OgorICogKiBSZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudCAoZGVmYXVsdCkuCisgKiAqIFJlcGxhY2UgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQgaXRzZWxmIChpZiBgcmVwbGFjZWAgaXMgdHJ1ZSAtIERFUFJFQ0FURUQpLgorICogKiBXcmFwIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudCAoaWYgYHRyYW5zY2x1ZGVgIGlzIHRydWUpLgorICoKKyAqIFZhbHVlIG1heSBiZToKKyAqCisgKiAqIEEgc3RyaW5nLiBGb3IgZXhhbXBsZSBgPGRpdiByZWQtb24taG92ZXI+e3tkZWxldGVfc3RyfX08L2Rpdj5gLgorICogKiBBIGZ1bmN0aW9uIHdoaWNoIHRha2VzIHR3byBhcmd1bWVudHMgYHRFbGVtZW50YCBhbmQgYHRBdHRyc2AgKGRlc2NyaWJlZCBpbiB0aGUgYGNvbXBpbGVgCisgKiAgIGZ1bmN0aW9uIGFwaSBiZWxvdykgYW5kIHJldHVybnMgYSBzdHJpbmcgdmFsdWUuCisgKgorICoKKyAqICMjIyMgYHRlbXBsYXRlVXJsYAorICogVGhpcyBpcyBzaW1pbGFyIHRvIGB0ZW1wbGF0ZWAgYnV0IHRoZSB0ZW1wbGF0ZSBpcyBsb2FkZWQgZnJvbSB0aGUgc3BlY2lmaWVkIFVSTCwgYXN5bmNocm9ub3VzbHkuCisgKgorICogQmVjYXVzZSB0ZW1wbGF0ZSBsb2FkaW5nIGlzIGFzeW5jaHJvbm91cyB0aGUgY29tcGlsZXIgd2lsbCBzdXNwZW5kIGNvbXBpbGF0aW9uIG9mIGRpcmVjdGl2ZXMgb24gdGhhdCBlbGVtZW50CisgKiBmb3IgbGF0ZXIgd2hlbiB0aGUgdGVtcGxhdGUgaGFzIGJlZW4gcmVzb2x2ZWQuICBJbiB0aGUgbWVhbnRpbWUgaXQgd2lsbCBjb250aW51ZSB0byBjb21waWxlIGFuZCBsaW5rCisgKiBzaWJsaW5nIGFuZCBwYXJlbnQgZWxlbWVudHMgYXMgdGhvdWdoIHRoaXMgZWxlbWVudCBoYWQgbm90IGNvbnRhaW5lZCBhbnkgZGlyZWN0aXZlcy4KKyAqCisgKiBUaGUgY29tcGlsZXIgZG9lcyBub3Qgc3VzcGVuZCB0aGUgZW50aXJlIGNvbXBpbGF0aW9uIHRvIHdhaXQgZm9yIHRlbXBsYXRlcyB0byBiZSBsb2FkZWQgYmVjYXVzZSB0aGlzCisgKiB3b3VsZCByZXN1bHQgaW4gdGhlIHdob2xlIGFwcCAic3RhbGxpbmciIHVudGlsIGFsbCB0ZW1wbGF0ZXMgYXJlIGxvYWRlZCBhc3luY2hyb25vdXNseSAtIGV2ZW4gaW4gdGhlCisgKiBjYXNlIHdoZW4gb25seSBvbmUgZGVlcGx5IG5lc3RlZCBkaXJlY3RpdmUgaGFzIGB0ZW1wbGF0ZVVybGAuCisgKgorICogVGVtcGxhdGUgbG9hZGluZyBpcyBhc3luY2hyb25vdXMgZXZlbiBpZiB0aGUgdGVtcGxhdGUgaGFzIGJlZW4gcHJlbG9hZGVkIGludG8gdGhlIHtAbGluayAkdGVtcGxhdGVDYWNoZX0KKyAqCisgKiBZb3UgY2FuIHNwZWNpZnkgYHRlbXBsYXRlVXJsYCBhcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFVSTCBvciBhcyBhIGZ1bmN0aW9uIHdoaWNoIHRha2VzIHR3bworICogYXJndW1lbnRzIGB0RWxlbWVudGAgYW5kIGB0QXR0cnNgIChkZXNjcmliZWQgaW4gdGhlIGBjb21waWxlYCBmdW5jdGlvbiBhcGkgYmVsb3cpIGFuZCByZXR1cm5zCisgKiBhIHN0cmluZyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHVybC4gIEluIGVpdGhlciBjYXNlLCB0aGUgdGVtcGxhdGUgVVJMIGlzIHBhc3NlZCB0aHJvdWdoIHtAbGluaworICogJHNjZSNnZXRUcnVzdGVkUmVzb3VyY2VVcmwgJHNjZS5nZXRUcnVzdGVkUmVzb3VyY2VVcmx9LgorICoKKyAqCisgKiAjIyMjIGByZXBsYWNlYCAoWypERVBSRUNBVEVEKiFdLCB3aWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciByZWxlYXNlIC0gaS5lLiB2Mi4wKQorICogc3BlY2lmeSB3aGF0IHRoZSB0ZW1wbGF0ZSBzaG91bGQgcmVwbGFjZS4gRGVmYXVsdHMgdG8gYGZhbHNlYC4KKyAqCisgKiAqIGB0cnVlYCAtIHRoZSB0ZW1wbGF0ZSB3aWxsIHJlcGxhY2UgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQuCisgKiAqIGBmYWxzZWAgLSB0aGUgdGVtcGxhdGUgd2lsbCByZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudC4KKyAqCisgKiBUaGUgcmVwbGFjZW1lbnQgcHJvY2VzcyBtaWdyYXRlcyBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMgLyBjbGFzc2VzIGZyb20gdGhlIG9sZCBlbGVtZW50IHRvIHRoZSBuZXcKKyAqIG9uZS4gU2VlIHRoZSB7QGxpbmsgZ3VpZGUvZGlyZWN0aXZlI3RlbXBsYXRlLWV4cGFuZGluZy1kaXJlY3RpdmUKKyAqIERpcmVjdGl2ZXMgR3VpZGV9IGZvciBhbiBleGFtcGxlLgorICoKKyAqIFRoZXJlIGFyZSB2ZXJ5IGZldyBzY2VuYXJpb3Mgd2hlcmUgZWxlbWVudCByZXBsYWNlbWVudCBpcyByZXF1aXJlZCBmb3IgdGhlIGFwcGxpY2F0aW9uIGZ1bmN0aW9uLAorICogdGhlIG1haW4gb25lIGJlaW5nIHJldXNhYmxlIGN1c3RvbSBjb21wb25lbnRzIHRoYXQgYXJlIHVzZWQgd2l0aGluIFNWRyBjb250ZXh0cworICogKGJlY2F1c2UgU1ZHIGRvZXNuJ3Qgd29yayB3aXRoIGN1c3RvbSBlbGVtZW50cyBpbiB0aGUgRE9NIHRyZWUpLgorICoKKyAqICMjIyMgYHRyYW5zY2x1ZGVgCisgKiBFeHRyYWN0IHRoZSBjb250ZW50cyBvZiB0aGUgZWxlbWVudCB3aGVyZSB0aGUgZGlyZWN0aXZlIGFwcGVhcnMgYW5kIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBkaXJlY3RpdmUuCisgKiBUaGUgY29udGVudHMgYXJlIGNvbXBpbGVkIGFuZCBwcm92aWRlZCB0byB0aGUgZGlyZWN0aXZlIGFzIGEgKip0cmFuc2NsdXNpb24gZnVuY3Rpb24qKi4gU2VlIHRoZQorICoge0BsaW5rICRjb21waWxlI3RyYW5zY2x1c2lvbiBUcmFuc2NsdXNpb259IHNlY3Rpb24gYmVsb3cuCisgKgorICogVGhlcmUgYXJlIHR3byBraW5kcyBvZiB0cmFuc2NsdXNpb24gZGVwZW5kaW5nIHVwb24gd2hldGhlciB5b3Ugd2FudCB0byB0cmFuc2NsdWRlIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZQorICogZGlyZWN0aXZlJ3MgZWxlbWVudCBvciB0aGUgZW50aXJlIGVsZW1lbnQ6CisgKgorICogKiBgdHJ1ZWAgLSB0cmFuc2NsdWRlIHRoZSBjb250ZW50IChpLmUuIHRoZSBjaGlsZCBub2Rlcykgb2YgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQuCisgKiAqIGAnZWxlbWVudCdgIC0gdHJhbnNjbHVkZSB0aGUgd2hvbGUgb2YgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQgaW5jbHVkaW5nIGFueSBkaXJlY3RpdmVzIG9uIHRoaXMKKyAqICAgZWxlbWVudCB0aGF0IGRlZmluZWQgYXQgYSBsb3dlciBwcmlvcml0eSB0aGFuIHRoaXMgZGlyZWN0aXZlLiBXaGVuIHVzZWQsIHRoZSBgdGVtcGxhdGVgCisgKiAgIHByb3BlcnR5IGlzIGlnbm9yZWQuCisgKgorICoKKyAqICMjIyMgYGNvbXBpbGVgCisgKgorICogYGBganMKKyAqICAgZnVuY3Rpb24gY29tcGlsZSh0RWxlbWVudCwgdEF0dHJzLCB0cmFuc2NsdWRlKSB7IC4uLiB9CisgKiBgYGAKKyAqCisgKiBUaGUgY29tcGlsZSBmdW5jdGlvbiBkZWFscyB3aXRoIHRyYW5zZm9ybWluZyB0aGUgdGVtcGxhdGUgRE9NLiBTaW5jZSBtb3N0IGRpcmVjdGl2ZXMgZG8gbm90IGRvCisgKiB0ZW1wbGF0ZSB0cmFuc2Zvcm1hdGlvbiwgaXQgaXMgbm90IHVzZWQgb2Z0ZW4uIFRoZSBjb21waWxlIGZ1bmN0aW9uIHRha2VzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorICoKKyAqICAgKiBgdEVsZW1lbnRgIC0gdGVtcGxhdGUgZWxlbWVudCAtIFRoZSBlbGVtZW50IHdoZXJlIHRoZSBkaXJlY3RpdmUgaGFzIGJlZW4gZGVjbGFyZWQuIEl0IGlzCisgKiAgICAgc2FmZSB0byBkbyB0ZW1wbGF0ZSB0cmFuc2Zvcm1hdGlvbiBvbiB0aGUgZWxlbWVudCBhbmQgY2hpbGQgZWxlbWVudHMgb25seS4KKyAqCisgKiAgICogYHRBdHRyc2AgLSB0ZW1wbGF0ZSBhdHRyaWJ1dGVzIC0gTm9ybWFsaXplZCBsaXN0IG9mIGF0dHJpYnV0ZXMgZGVjbGFyZWQgb24gdGhpcyBlbGVtZW50IHNoYXJlZAorICogICAgIGJldHdlZW4gYWxsIGRpcmVjdGl2ZSBjb21waWxlIGZ1bmN0aW9ucy4KKyAqCisgKiAgICogYHRyYW5zY2x1ZGVgIC0gIFsqREVQUkVDQVRFRCohXSBBIHRyYW5zY2x1ZGUgbGlua2luZyBmdW5jdGlvbjogYGZ1bmN0aW9uKHNjb3BlLCBjbG9uZUxpbmtpbmdGbilgCisgKgorICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+CisgKiAqKk5vdGU6KiogVGhlIHRlbXBsYXRlIGluc3RhbmNlIGFuZCB0aGUgbGluayBpbnN0YW5jZSBtYXkgYmUgZGlmZmVyZW50IG9iamVjdHMgaWYgdGhlIHRlbXBsYXRlIGhhcworICogYmVlbiBjbG9uZWQuIEZvciB0aGlzIHJlYXNvbiBpdCBpcyAqKm5vdCoqIHNhZmUgdG8gZG8gYW55dGhpbmcgb3RoZXIgdGhhbiBET00gdHJhbnNmb3JtYXRpb25zIHRoYXQKKyAqIGFwcGx5IHRvIGFsbCBjbG9uZWQgRE9NIG5vZGVzIHdpdGhpbiB0aGUgY29tcGlsZSBmdW5jdGlvbi4gU3BlY2lmaWNhbGx5LCBET00gbGlzdGVuZXIgcmVnaXN0cmF0aW9uCisgKiBzaG91bGQgYmUgZG9uZSBpbiBhIGxpbmtpbmcgZnVuY3Rpb24gcmF0aGVyIHRoYW4gaW4gYSBjb21waWxlIGZ1bmN0aW9uLgorICogPC9kaXY+CisKKyAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgorICogKipOb3RlOioqIFRoZSBjb21waWxlIGZ1bmN0aW9uIGNhbm5vdCBoYW5kbGUgZGlyZWN0aXZlcyB0aGF0IHJlY3Vyc2l2ZWx5IHVzZSB0aGVtc2VsdmVzIGluIHRoZWlyCisgKiBvd24gdGVtcGxhdGVzIG9yIGNvbXBpbGUgZnVuY3Rpb25zLiBDb21waWxpbmcgdGhlc2UgZGlyZWN0aXZlcyByZXN1bHRzIGluIGFuIGluZmluaXRlIGxvb3AgYW5kIGEKKyAqIHN0YWNrIG92ZXJmbG93IGVycm9ycy4KKyAqCisgKiBUaGlzIGNhbiBiZSBhdm9pZGVkIGJ5IG1hbnVhbGx5IHVzaW5nICRjb21waWxlIGluIHRoZSBwb3N0TGluayBmdW5jdGlvbiB0byBpbXBlcmF0aXZlbHkgY29tcGlsZQorICogYSBkaXJlY3RpdmUncyB0ZW1wbGF0ZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYXV0b21hdGljIHRlbXBsYXRlIGNvbXBpbGF0aW9uIHZpYSBgdGVtcGxhdGVgIG9yCisgKiBgdGVtcGxhdGVVcmxgIGRlY2xhcmF0aW9uIG9yIG1hbnVhbCBjb21waWxhdGlvbiBpbnNpZGUgdGhlIGNvbXBpbGUgZnVuY3Rpb24uCisgKiA8L2Rpdj4KKyAqCisgKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1lcnJvciI+CisgKiAqKk5vdGU6KiogVGhlIGB0cmFuc2NsdWRlYCBmdW5jdGlvbiB0aGF0IGlzIHBhc3NlZCB0byB0aGUgY29tcGlsZSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLCBhcyBpdAorICogICBlLmcuIGRvZXMgbm90IGtub3cgYWJvdXQgdGhlIHJpZ2h0IG91dGVyIHNjb3BlLiBQbGVhc2UgdXNlIHRoZSB0cmFuc2NsdWRlIGZ1bmN0aW9uIHRoYXQgaXMgcGFzc2VkCisgKiAgIHRvIHRoZSBsaW5rIGZ1bmN0aW9uIGluc3RlYWQuCisgKiA8L2Rpdj4KKworICogQSBjb21waWxlIGZ1bmN0aW9uIGNhbiBoYXZlIGEgcmV0dXJuIHZhbHVlIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QuCisgKgorICogKiByZXR1cm5pbmcgYSAocG9zdC1saW5rKSBmdW5jdGlvbiAtIGlzIGVxdWl2YWxlbnQgdG8gcmVnaXN0ZXJpbmcgdGhlIGxpbmtpbmcgZnVuY3Rpb24gdmlhIHRoZQorICogICBgbGlua2AgcHJvcGVydHkgb2YgdGhlIGNvbmZpZyBvYmplY3Qgd2hlbiB0aGUgY29tcGlsZSBmdW5jdGlvbiBpcyBlbXB0eS4KKyAqCisgKiAqIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBmdW5jdGlvbihzKSByZWdpc3RlcmVkIHZpYSBgcHJlYCBhbmQgYHBvc3RgIHByb3BlcnRpZXMgLSBhbGxvd3MgeW91IHRvCisgKiAgIGNvbnRyb2wgd2hlbiBhIGxpbmtpbmcgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGxpbmtpbmcgcGhhc2UuIFNlZSBpbmZvIGFib3V0CisgKiAgIHByZS1saW5raW5nIGFuZCBwb3N0LWxpbmtpbmcgZnVuY3Rpb25zIGJlbG93LgorICoKKyAqCisgKiAjIyMjIGBsaW5rYAorICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIG9ubHkgaWYgdGhlIGBjb21waWxlYCBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZC4KKyAqCisgKiBgYGBqcworICogICBmdW5jdGlvbiBsaW5rKHNjb3BlLCBpRWxlbWVudCwgaUF0dHJzLCBjb250cm9sbGVyLCB0cmFuc2NsdWRlRm4pIHsgLi4uIH0KKyAqIGBgYAorICoKKyAqIFRoZSBsaW5rIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyBET00gbGlzdGVuZXJzIGFzIHdlbGwgYXMgdXBkYXRpbmcgdGhlIERPTS4gSXQgaXMKKyAqIGV4ZWN1dGVkIGFmdGVyIHRoZSB0ZW1wbGF0ZSBoYXMgYmVlbiBjbG9uZWQuIFRoaXMgaXMgd2hlcmUgbW9zdCBvZiB0aGUgZGlyZWN0aXZlIGxvZ2ljIHdpbGwgYmUKKyAqIHB1dC4KKyAqCisgKiAgICogYHNjb3BlYCAtIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIFNjb3BlfSAtIFRoZSBzY29wZSB0byBiZSB1c2VkIGJ5IHRoZQorICogICAgIGRpcmVjdGl2ZSBmb3IgcmVnaXN0ZXJpbmcge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIHdhdGNoZXN9LgorICoKKyAqICAgKiBgaUVsZW1lbnRgIC0gaW5zdGFuY2UgZWxlbWVudCAtIFRoZSBlbGVtZW50IHdoZXJlIHRoZSBkaXJlY3RpdmUgaXMgdG8gYmUgdXNlZC4gSXQgaXMgc2FmZSB0bworICogICAgIG1hbmlwdWxhdGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50IG9ubHkgaW4gYHBvc3RMaW5rYCBmdW5jdGlvbiBzaW5jZSB0aGUgY2hpbGRyZW4gaGF2ZQorICogICAgIGFscmVhZHkgYmVlbiBsaW5rZWQuCisgKgorICogICAqIGBpQXR0cnNgIC0gaW5zdGFuY2UgYXR0cmlidXRlcyAtIE5vcm1hbGl6ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzIGRlY2xhcmVkIG9uIHRoaXMgZWxlbWVudCBzaGFyZWQKKyAqICAgICBiZXR3ZWVuIGFsbCBkaXJlY3RpdmUgbGlua2luZyBmdW5jdGlvbnMuCisgKgorICogICAqIGBjb250cm9sbGVyYCAtIGEgY29udHJvbGxlciBpbnN0YW5jZSAtIEEgY29udHJvbGxlciBpbnN0YW5jZSBpZiBhdCBsZWFzdCBvbmUgZGlyZWN0aXZlIG9uIHRoZQorICogICAgIGVsZW1lbnQgZGVmaW5lcyBhIGNvbnRyb2xsZXIuIFRoZSBjb250cm9sbGVyIGlzIHNoYXJlZCBhbW9uZyBhbGwgdGhlIGRpcmVjdGl2ZXMsIHdoaWNoIGFsbG93cworICogICAgIHRoZSBkaXJlY3RpdmVzIHRvIHVzZSB0aGUgY29udHJvbGxlcnMgYXMgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuCisgKgorICogICAqIGB0cmFuc2NsdWRlRm5gIC0gQSB0cmFuc2NsdWRlIGxpbmtpbmcgZnVuY3Rpb24gcHJlLWJvdW5kIHRvIHRoZSBjb3JyZWN0IHRyYW5zY2x1c2lvbiBzY29wZS4KKyAqICAgICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBgJHRyYW5zY2x1ZGVgCisgKiAgICAgcGFyYW1ldGVyIG9mIGRpcmVjdGl2ZSBjb250cm9sbGVycywgc2VlIHRoZXJlIGZvciBkZXRhaWxzLgorICogICAgIGBmdW5jdGlvbihbc2NvcGVdLCBjbG9uZUxpbmtpbmdGbiwgZnV0dXJlUGFyZW50RWxlbWVudClgLgorICoKKyAqICMjIyMgUHJlLWxpbmtpbmcgZnVuY3Rpb24KKyAqCisgKiBFeGVjdXRlZCBiZWZvcmUgdGhlIGNoaWxkIGVsZW1lbnRzIGFyZSBsaW5rZWQuIE5vdCBzYWZlIHRvIGRvIERPTSB0cmFuc2Zvcm1hdGlvbiBzaW5jZSB0aGUKKyAqIGNvbXBpbGVyIGxpbmtpbmcgZnVuY3Rpb24gd2lsbCBmYWlsIHRvIGxvY2F0ZSB0aGUgY29ycmVjdCBlbGVtZW50cyBmb3IgbGlua2luZy4KKyAqCisgKiAjIyMjIFBvc3QtbGlua2luZyBmdW5jdGlvbgorICoKKyAqIEV4ZWN1dGVkIGFmdGVyIHRoZSBjaGlsZCBlbGVtZW50cyBhcmUgbGlua2VkLgorICoKKyAqIE5vdGUgdGhhdCBjaGlsZCBlbGVtZW50cyB0aGF0IGNvbnRhaW4gYHRlbXBsYXRlVXJsYCBkaXJlY3RpdmVzIHdpbGwgbm90IGhhdmUgYmVlbiBjb21waWxlZAorICogYW5kIGxpbmtlZCBzaW5jZSB0aGV5IGFyZSB3YWl0aW5nIGZvciB0aGVpciB0ZW1wbGF0ZSB0byBsb2FkIGFzeW5jaHJvbm91c2x5IGFuZCB0aGVpciBvd24KKyAqIGNvbXBpbGF0aW9uIGFuZCBsaW5raW5nIGhhcyBiZWVuIHN1c3BlbmRlZCB1bnRpbCB0aGF0IG9jY3Vycy4KKyAqCisgKiBJdCBpcyBzYWZlIHRvIGRvIERPTSB0cmFuc2Zvcm1hdGlvbiBpbiB0aGUgcG9zdC1saW5raW5nIGZ1bmN0aW9uIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB3YWl0aW5nCisgKiBmb3IgdGhlaXIgYXN5bmMgdGVtcGxhdGVzIHRvIGJlIHJlc29sdmVkLgorICoKKyAqCisgKiAjIyMgVHJhbnNjbHVzaW9uCisgKgorICogVHJhbnNjbHVzaW9uIGlzIHRoZSBwcm9jZXNzIG9mIGV4dHJhY3RpbmcgYSBjb2xsZWN0aW9uIG9mIERPTSBlbGVtZW50IGZyb20gb25lIHBhcnQgb2YgdGhlIERPTSBhbmQKKyAqIGNvcHlpbmcgdGhlbSB0byBhbm90aGVyIHBhcnQgb2YgdGhlIERPTSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlaXIgY29ubmVjdGlvbiB0byB0aGUgb3JpZ2luYWwgQW5ndWxhckpTCisgKiBzY29wZSBmcm9tIHdoZXJlIHRoZXkgd2VyZSB0YWtlbi4KKyAqCisgKiBUcmFuc2NsdXNpb24gaXMgdXNlZCAob2Z0ZW4gd2l0aCB7QGxpbmsgbmdUcmFuc2NsdWRlfSkgdG8gaW5zZXJ0IHRoZQorICogb3JpZ2luYWwgY29udGVudHMgb2YgYSBkaXJlY3RpdmUncyBlbGVtZW50IGludG8gYSBzcGVjaWZpZWQgcGxhY2UgaW4gdGhlIHRlbXBsYXRlIG9mIHRoZSBkaXJlY3RpdmUuCisgKiBUaGUgYmVuZWZpdCBvZiB0cmFuc2NsdXNpb24sIG92ZXIgc2ltcGx5IG1vdmluZyB0aGUgRE9NIGVsZW1lbnRzIG1hbnVhbGx5LCBpcyB0aGF0IHRoZSB0cmFuc2NsdWRlZAorICogY29udGVudCBoYXMgYWNjZXNzIHRvIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBzY29wZSBmcm9tIHdoaWNoIGl0IHdhcyB0YWtlbiwgZXZlbiBpZiB0aGUgZGlyZWN0aXZlCisgKiBoYXMgaXNvbGF0ZWQgc2NvcGUuCisgKiBTZWUgdGhlIHtAbGluayBndWlkZS9kaXJlY3RpdmUjY3JlYXRpbmctYS1kaXJlY3RpdmUtdGhhdC13cmFwcy1vdGhlci1lbGVtZW50cyBEaXJlY3RpdmVzIEd1aWRlfS4KKyAqCisgKiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB0aGUgd2lkZ2V0IHRvIGhhdmUgcHJpdmF0ZSBzdGF0ZSBmb3IgaXRzIHRlbXBsYXRlLCB3aGlsZSB0aGUgdHJhbnNjbHVkZWQKKyAqIGNvbnRlbnQgaGFzIGFjY2VzcyB0byBpdHMgb3JpZ2luYXRpbmcgc2NvcGUuCisgKgorICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+CisgKiAqKk5vdGU6KiogV2hlbiB0ZXN0aW5nIGFuIGVsZW1lbnQgdHJhbnNjbHVkZSBkaXJlY3RpdmUgeW91IG11c3Qgbm90IHBsYWNlIHRoZSBkaXJlY3RpdmUgYXQgdGhlIHJvb3Qgb2YgdGhlCisgKiBET00gZnJhZ21lbnQgdGhhdCBpcyBiZWluZyBjb21waWxlZC4gU2VlIHtAbGluayBndWlkZS91bml0LXRlc3RpbmcjdGVzdGluZy10cmFuc2NsdXNpb24tZGlyZWN0aXZlcworICogVGVzdGluZyBUcmFuc2NsdXNpb24gRGlyZWN0aXZlc30uCisgKiA8L2Rpdj4KKyAqCisgKiAjIyMjIFRyYW5zY2x1c2lvbiBGdW5jdGlvbnMKKyAqCisgKiBXaGVuIGEgZGlyZWN0aXZlIHJlcXVlc3RzIHRyYW5zY2x1c2lvbiwgdGhlIGNvbXBpbGVyIGV4dHJhY3RzIGl0cyBjb250ZW50cyBhbmQgcHJvdmlkZXMgYSAqKnRyYW5zY2x1c2lvbgorICogZnVuY3Rpb24qKiB0byB0aGUgZGlyZWN0aXZlJ3MgYGxpbmtgIGZ1bmN0aW9uIGFuZCBgY29udHJvbGxlcmAuIFRoaXMgdHJhbnNjbHVzaW9uIGZ1bmN0aW9uIGlzIGEgc3BlY2lhbAorICogKipsaW5raW5nIGZ1bmN0aW9uKiogdGhhdCB3aWxsIHJldHVybiB0aGUgY29tcGlsZWQgY29udGVudHMgbGlua2VkIHRvIGEgbmV3IHRyYW5zY2x1c2lvbiBzY29wZS4KKyAqCisgKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1pbmZvIj4KKyAqIElmIHlvdSBhcmUganVzdCB1c2luZyB7QGxpbmsgbmdUcmFuc2NsdWRlfSB0aGVuIHlvdSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgZnVuY3Rpb24sIHNpbmNlCisgKiBuZ1RyYW5zY2x1ZGUgd2lsbCBkZWFsIHdpdGggaXQgZm9yIHVzLgorICogPC9kaXY+CisgKgorICogSWYgeW91IHdhbnQgdG8gbWFudWFsbHkgY29udHJvbCB0aGUgaW5zZXJ0aW9uIGFuZCByZW1vdmFsIG9mIHRoZSB0cmFuc2NsdWRlZCBjb250ZW50IGluIHlvdXIgZGlyZWN0aXZlCisgKiB0aGVuIHlvdSBtdXN0IHVzZSB0aGlzIHRyYW5zY2x1ZGUgZnVuY3Rpb24uIFdoZW4geW91IGNhbGwgYSB0cmFuc2NsdWRlIGZ1bmN0aW9uIGl0IHJldHVybnMgYSBhIGpxTGl0ZS9KUXVlcnkKKyAqIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBjb21waWxlZCBET00sIHdoaWNoIGlzIGxpbmtlZCB0byB0aGUgY29ycmVjdCB0cmFuc2NsdXNpb24gc2NvcGUuCisgKgorICogV2hlbiB5b3UgY2FsbCBhIHRyYW5zY2x1c2lvbiBmdW5jdGlvbiB5b3UgY2FuIHBhc3MgaW4gYSAqKmNsb25lIGF0dGFjaCBmdW5jdGlvbioqLiBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMKKyAqIHR3byBwYXJhbWV0ZXJzLCBgZnVuY3Rpb24oY2xvbmUsIHNjb3BlKSB7IC4uLiB9YCwgd2hlcmUgdGhlIGBjbG9uZWAgaXMgYSBmcmVzaCBjb21waWxlZCBjb3B5IG9mIHlvdXIgdHJhbnNjbHVkZWQKKyAqIGNvbnRlbnQgYW5kIHRoZSBgc2NvcGVgIGlzIHRoZSBuZXdseSBjcmVhdGVkIHRyYW5zY2x1c2lvbiBzY29wZSwgdG8gd2hpY2ggdGhlIGNsb25lIGlzIGJvdW5kLgorICoKKyAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWluZm8iPgorICogKipCZXN0IFByYWN0aWNlKio6IEFsd2F5cyBwcm92aWRlIGEgYGNsb25lRm5gIChjbG9uZSBhdHRhY2ggZnVuY3Rpb24pIHdoZW4geW91IGNhbGwgYSB0cmFuc2x1ZGUgZnVuY3Rpb24KKyAqIHNpbmNlIHlvdSB0aGVuIGdldCBhIGZyZXNoIGNsb25lIG9mIHRoZSBvcmlnaW5hbCBET00gYW5kIGFsc28gaGF2ZSBhY2Nlc3MgdG8gdGhlIG5ldyB0cmFuc2NsdXNpb24gc2NvcGUuCisgKiA8L2Rpdj4KKyAqCisgKiBJdCBpcyBub3JtYWwgcHJhY3RpY2UgdG8gYXR0YWNoIHlvdXIgdHJhbnNjbHVkZWQgY29udGVudCAoYGNsb25lYCkgdG8gdGhlIERPTSBpbnNpZGUgeW91ciAqKmNsb25lCisgKiBhdHRhY2ggZnVuY3Rpb24qKjoKKyAqCisgKiBgYGBqcworICogdmFyIHRyYW5zY2x1ZGVkQ29udGVudCwgdHJhbnNjbHVzaW9uU2NvcGU7CisgKgorICogJHRyYW5zY2x1ZGUoZnVuY3Rpb24oY2xvbmUsIHNjb3BlKSB7CisgKiAgIGVsZW1lbnQuYXBwZW5kKGNsb25lKTsKKyAqICAgdHJhbnNjbHVkZWRDb250ZW50ID0gY2xvbmU7CisgKiAgIHRyYW5zY2x1c2lvblNjb3BlID0gc2NvcGU7CisgKiB9KTsKKyAqIGBgYAorICoKKyAqIExhdGVyLCBpZiB5b3Ugd2FudCB0byByZW1vdmUgdGhlIHRyYW5zY2x1ZGVkIGNvbnRlbnQgZnJvbSB5b3VyIERPTSB0aGVuIHlvdSBzaG91bGQgYWxzbyBkZXN0cm95IHRoZQorICogYXNzb2NpYXRlZCB0cmFuc2NsdXNpb24gc2NvcGU6CisgKgorICogYGBganMKKyAqIHRyYW5zY2x1ZGVkQ29udGVudC5yZW1vdmUoKTsKKyAqIHRyYW5zY2x1c2lvblNjb3BlLiRkZXN0cm95KCk7CisgKiBgYGAKKyAqCisgKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1pbmZvIj4KKyAqICoqQmVzdCBQcmFjdGljZSoqOiBpZiB5b3UgaW50ZW5kIHRvIGFkZCBhbmQgcmVtb3ZlIHRyYW5zY2x1ZGVkIGNvbnRlbnQgbWFudWFsbHkgaW4geW91ciBkaXJlY3RpdmUKKyAqIChieSBjYWxsaW5nIHRoZSB0cmFuc2NsdWRlIGZ1bmN0aW9uIHRvIGdldCB0aGUgRE9NIGFuZCBhbmQgY2FsbGluZyBgZWxlbWVudC5yZW1vdmUoKWAgdG8gcmVtb3ZlIGl0KSwKKyAqIHRoZW4geW91IGFyZSBhbHNvIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGAkZGVzdHJveWAgb24gdGhlIHRyYW5zY2x1c2lvbiBzY29wZS4KKyAqIDwvZGl2PgorICoKKyAqIFRoZSBidWlsdC1pbiBET00gbWFuaXB1bGF0aW9uIGRpcmVjdGl2ZXMsIHN1Y2ggYXMge0BsaW5rIG5nSWZ9LCB7QGxpbmsgbmdTd2l0Y2h9IGFuZCB7QGxpbmsgbmdSZXBlYXR9CisgKiBhdXRvbWF0aWNhbGx5IGRlc3Ryb3kgdGhlaXIgdHJhbnNsdWRlZCBjbG9uZXMgYXMgbmVjZXNzYXJ5IHNvIHlvdSBkbyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIGlmCisgKiB5b3UgYXJlIHNpbXBseSB1c2luZyB7QGxpbmsgbmdUcmFuc2NsdWRlfSB0byBpbmplY3QgdGhlIHRyYW5zY2x1c2lvbiBpbnRvIHlvdXIgZGlyZWN0aXZlLgorICoKKyAqCisgKiAjIyMjIFRyYW5zY2x1c2lvbiBTY29wZXMKKyAqCisgKiBXaGVuIHlvdSBjYWxsIGEgdHJhbnNjbHVkZSBmdW5jdGlvbiBpdCByZXR1cm5zIGEgRE9NIGZyYWdtZW50IHRoYXQgaXMgcHJlLWJvdW5kIHRvIGEgKip0cmFuc2NsdXNpb24KKyAqIHNjb3BlKiouIFRoaXMgc2NvcGUgaXMgc3BlY2lhbCwgaW4gdGhhdCBpdCBpcyBhIGNoaWxkIG9mIHRoZSBkaXJlY3RpdmUncyBzY29wZSAoYW5kIHNvIGdldHMgZGVzdHJveWVkCisgKiB3aGVuIHRoZSBkaXJlY3RpdmUncyBzY29wZSBnZXRzIGRlc3Ryb3llZCkgYnV0IGl0IGluaGVyaXRzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzY29wZSBmcm9tIHdoaWNoIGl0CisgKiB3YXMgdGFrZW4uCisgKgorICogRm9yIGV4YW1wbGUgY29uc2lkZXIgYSBkaXJlY3RpdmUgdGhhdCB1c2VzIHRyYW5zY2x1c2lvbiBhbmQgaXNvbGF0ZWQgc2NvcGUuIFRoZSBET00gaGllcmFyY2h5IG1pZ2h0IGxvb2sKKyAqIGxpa2UgdGhpczoKKyAqCisgKiBgYGBodG1sCisgKiA8ZGl2IG5nLWFwcD4KKyAqICAgPGRpdiBpc29sYXRlPgorICogICAgIDxkaXYgdHJhbnNjbHVzaW9uPgorICogICAgIDwvZGl2PgorICogICA8L2Rpdj4KKyAqIDwvZGl2PgorICogYGBgCisgKgorICogVGhlIGAkcGFyZW50YCBzY29wZSBoaWVyYXJjaHkgd2lsbCBsb29rIGxpa2UgdGhpczoKKyAqCisgKiBgYGAKKyAqIC0gJHJvb3RTY29wZQorICogICAtIGlzb2xhdGUKKyAqICAgICAtIHRyYW5zY2x1c2lvbgorICogYGBgCisgKgorICogYnV0IHRoZSBzY29wZXMgd2lsbCBpbmhlcml0IHByb3RvdHlwaWNhbGx5IGZyb20gZGlmZmVyZW50IHNjb3BlcyB0byB0aGVpciBgJHBhcmVudGAuCisgKgorICogYGBgCisgKiAtICRyb290U2NvcGUKKyAqICAgLSB0cmFuc2NsdXNpb24KKyAqIC0gaXNvbGF0ZQorICogYGBgCisgKgorICoKKyAqICMjIyBBdHRyaWJ1dGVzCisgKgorICogVGhlIHtAbGluayBuZy4kY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyBBdHRyaWJ1dGVzfSBvYmplY3QgLSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgaW4gdGhlCisgKiBgbGluaygpYCBvciBgY29tcGlsZSgpYCBmdW5jdGlvbnMuIEl0IGhhcyBhIHZhcmlldHkgb2YgdXNlcy4KKyAqCisgKiBhY2Nlc3NpbmcgKk5vcm1hbGl6ZWQgYXR0cmlidXRlIG5hbWVzOioKKyAqIERpcmVjdGl2ZXMgbGlrZSAnbmdCaW5kJyBjYW4gYmUgZXhwcmVzc2VkIGluIG1hbnkgd2F5czogJ25nOmJpbmQnLCBgZGF0YS1uZy1iaW5kYCwgb3IgJ3gtbmctYmluZCcuCisgKiB0aGUgYXR0cmlidXRlcyBvYmplY3QgYWxsb3dzIGZvciBub3JtYWxpemVkIGFjY2VzcyB0bworICogICB0aGUgYXR0cmlidXRlcy4KKyAqCisgKiAqICpEaXJlY3RpdmUgaW50ZXItY29tbXVuaWNhdGlvbjoqIEFsbCBkaXJlY3RpdmVzIHNoYXJlIHRoZSBzYW1lIGluc3RhbmNlIG9mIHRoZSBhdHRyaWJ1dGVzCisgKiAgIG9iamVjdCB3aGljaCBhbGxvd3MgdGhlIGRpcmVjdGl2ZXMgdG8gdXNlIHRoZSBhdHRyaWJ1dGVzIG9iamVjdCBhcyBpbnRlciBkaXJlY3RpdmUKKyAqICAgY29tbXVuaWNhdGlvbi4KKyAqCisgKiAqICpTdXBwb3J0cyBpbnRlcnBvbGF0aW9uOiogSW50ZXJwb2xhdGlvbiBhdHRyaWJ1dGVzIGFyZSBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlIG9iamVjdAorICogICBhbGxvd2luZyBvdGhlciBkaXJlY3RpdmVzIHRvIHJlYWQgdGhlIGludGVycG9sYXRlZCB2YWx1ZS4KKyAqCisgKiAqICpPYnNlcnZpbmcgaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZXM6KiBVc2UgYCRvYnNlcnZlYCB0byBvYnNlcnZlIHRoZSB2YWx1ZSBjaGFuZ2VzIG9mIGF0dHJpYnV0ZXMKKyAqICAgdGhhdCBjb250YWluIGludGVycG9sYXRpb24gKGUuZy4gYHNyYz0ie3tiYXJ9fSJgKS4gTm90IG9ubHkgaXMgdGhpcyB2ZXJ5IGVmZmljaWVudCBidXQgaXQncyBhbHNvCisgKiAgIHRoZSBvbmx5IHdheSB0byBlYXNpbHkgZ2V0IHRoZSBhY3R1YWwgdmFsdWUgYmVjYXVzZSBkdXJpbmcgdGhlIGxpbmtpbmcgcGhhc2UgdGhlIGludGVycG9sYXRpb24KKyAqICAgaGFzbid0IGJlZW4gZXZhbHVhdGVkIHlldCBhbmQgc28gdGhlIHZhbHVlIGlzIGF0IHRoaXMgdGltZSBzZXQgdG8gYHVuZGVmaW5lZGAuCisgKgorICogYGBganMKKyAqIGZ1bmN0aW9uIGxpbmtpbmdGbihzY29wZSwgZWxtLCBhdHRycywgY3RybCkgeworICogICAvLyBnZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZQorICogICBjb25zb2xlLmxvZyhhdHRycy5uZ01vZGVsKTsKKyAqCisgKiAgIC8vIGNoYW5nZSB0aGUgYXR0cmlidXRlCisgKiAgIGF0dHJzLiRzZXQoJ25nTW9kZWwnLCAnbmV3IHZhbHVlJyk7CisgKgorICogICAvLyBvYnNlcnZlIGNoYW5nZXMgdG8gaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZQorICogICBhdHRycy4kb2JzZXJ2ZSgnbmdNb2RlbCcsIGZ1bmN0aW9uKHZhbHVlKSB7CisgKiAgICAgY29uc29sZS5sb2coJ25nTW9kZWwgaGFzIGNoYW5nZWQgdmFsdWUgdG8gJyArIHZhbHVlKTsKKyAqICAgfSk7CisgKiB9CisgKiBgYGAKKyAqCisgKiAjIyBFeGFtcGxlCisgKgorICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+CisgKiAqKk5vdGUqKjogVHlwaWNhbGx5IGRpcmVjdGl2ZXMgYXJlIHJlZ2lzdGVyZWQgd2l0aCBgbW9kdWxlLmRpcmVjdGl2ZWAuIFRoZSBleGFtcGxlIGJlbG93IGlzCisgKiB0byBpbGx1c3RyYXRlIGhvdyBgJGNvbXBpbGVgIHdvcmtzLgorICogPC9kaXY+CisgKgorIDxleGFtcGxlIG1vZHVsZT0iY29tcGlsZUV4YW1wbGUiPgorICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgPHNjcmlwdD4KKyAgICAgIGFuZ3VsYXIubW9kdWxlKCdjb21waWxlRXhhbXBsZScsIFtdLCBmdW5jdGlvbigkY29tcGlsZVByb3ZpZGVyKSB7CisgICAgICAgIC8vIGNvbmZpZ3VyZSBuZXcgJ2NvbXBpbGUnIGRpcmVjdGl2ZSBieSBwYXNzaW5nIGEgZGlyZWN0aXZlCisgICAgICAgIC8vIGZhY3RvcnkgZnVuY3Rpb24uIFRoZSBmYWN0b3J5IGZ1bmN0aW9uIGluamVjdHMgdGhlICckY29tcGlsZScKKyAgICAgICAgJGNvbXBpbGVQcm92aWRlci5kaXJlY3RpdmUoJ2NvbXBpbGUnLCBmdW5jdGlvbigkY29tcGlsZSkgeworICAgICAgICAgIC8vIGRpcmVjdGl2ZSBmYWN0b3J5IGNyZWF0ZXMgYSBsaW5rIGZ1bmN0aW9uCisgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykgeworICAgICAgICAgICAgc2NvcGUuJHdhdGNoKAorICAgICAgICAgICAgICBmdW5jdGlvbihzY29wZSkgeworICAgICAgICAgICAgICAgICAvLyB3YXRjaCB0aGUgJ2NvbXBpbGUnIGV4cHJlc3Npb24gZm9yIGNoYW5nZXMKKyAgICAgICAgICAgICAgICByZXR1cm4gc2NvcGUuJGV2YWwoYXR0cnMuY29tcGlsZSk7CisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgJ2NvbXBpbGUnIGV4cHJlc3Npb24gY2hhbmdlcworICAgICAgICAgICAgICAgIC8vIGFzc2lnbiBpdCBpbnRvIHRoZSBjdXJyZW50IERPTQorICAgICAgICAgICAgICAgIGVsZW1lbnQuaHRtbCh2YWx1ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBjb21waWxlIHRoZSBuZXcgRE9NIGFuZCBsaW5rIGl0IHRvIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgLy8gc2NvcGUuCisgICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugb25seSBjb21waWxlIC5jaGlsZE5vZGVzIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBnZXQgaW50byBpbmZpbml0ZSBsb29wIGNvbXBpbGluZyBvdXJzZWx2ZXMKKyAgICAgICAgICAgICAgICAkY29tcGlsZShlbGVtZW50LmNvbnRlbnRzKCkpKHNjb3BlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICAgICAgICB9OworICAgICAgICB9KTsKKyAgICAgIH0pCisgICAgICAuY29udHJvbGxlcignR3JlZXRlckNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgICAkc2NvcGUubmFtZSA9ICdBbmd1bGFyJzsKKyAgICAgICAgJHNjb3BlLmh0bWwgPSAnSGVsbG8ge3tuYW1lfX0nOworICAgICAgfV0pOworICAgIDwvc2NyaXB0PgorICAgIDxkaXYgbmctY29udHJvbGxlcj0iR3JlZXRlckNvbnRyb2xsZXIiPgorICAgICAgPGlucHV0IG5nLW1vZGVsPSJuYW1lIj4gPGJyPgorICAgICAgPHRleHRhcmVhIG5nLW1vZGVsPSJodG1sIj48L3RleHRhcmVhPiA8YnI+CisgICAgICA8ZGl2IGNvbXBpbGU9Imh0bWwiPjwvZGl2PgorICAgIDwvZGl2PgorICAgPC9maWxlPgorICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgIGl0KCdzaG91bGQgYXV0byBjb21waWxlJywgZnVuY3Rpb24oKSB7CisgICAgICAgdmFyIHRleHRhcmVhID0gJCgndGV4dGFyZWEnKTsKKyAgICAgICB2YXIgb3V0cHV0ID0gJCgnZGl2W2NvbXBpbGVdJyk7CisgICAgICAgLy8gVGhlIGluaXRpYWwgc3RhdGUgcmVhZHMgJ0hlbGxvIEFuZ3VsYXInLgorICAgICAgIGV4cGVjdChvdXRwdXQuZ2V0VGV4dCgpKS50b0JlKCdIZWxsbyBBbmd1bGFyJyk7CisgICAgICAgdGV4dGFyZWEuY2xlYXIoKTsKKyAgICAgICB0ZXh0YXJlYS5zZW5kS2V5cygne3tuYW1lfX0hJyk7CisgICAgICAgZXhwZWN0KG91dHB1dC5nZXRUZXh0KCkpLnRvQmUoJ0FuZ3VsYXIhJyk7CisgICAgIH0pOworICAgPC9maWxlPgorIDwvZXhhbXBsZT4KKworICoKKyAqCisgKiBAcGFyYW0ge3N0cmluZ3xET01FbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgb3IgSFRNTCBzdHJpbmcgdG8gY29tcGlsZSBpbnRvIGEgdGVtcGxhdGUgZnVuY3Rpb24uCisgKiBAcGFyYW0ge2Z1bmN0aW9uKGFuZ3VsYXIuU2NvcGUsIGNsb25lQXR0YWNoRm49KX0gdHJhbnNjbHVkZSBmdW5jdGlvbiBhdmFpbGFibGUgdG8gZGlyZWN0aXZlcyAtIERFUFJFQ0FURUQuCisgKgorICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtZXJyb3IiPgorICogKipOb3RlOioqIFBhc3NpbmcgYSBgdHJhbnNjbHVkZWAgZnVuY3Rpb24gdG8gdGhlICRjb21waWxlIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQsIGFzIGl0CisgKiAgIGUuZy4gd2lsbCBub3QgdXNlIHRoZSByaWdodCBvdXRlciBzY29wZS4gUGxlYXNlIHBhc3MgdGhlIHRyYW5zY2x1ZGUgZnVuY3Rpb24gYXMgYQorICogICBgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm5gIHRvIHRoZSBsaW5rIGZ1bmN0aW9uIGluc3RlYWQuCisgKiA8L2Rpdj4KKyAqCisgKiBAcGFyYW0ge251bWJlcn0gbWF4UHJpb3JpdHkgb25seSBhcHBseSBkaXJlY3RpdmVzIGxvd2VyIHRoYW4gZ2l2ZW4gcHJpb3JpdHkgKE9ubHkgZWZmZWN0cyB0aGUKKyAqICAgICAgICAgICAgICAgICByb290IGVsZW1lbnQocyksIG5vdCB0aGVpciBjaGlsZHJlbikKKyAqIEByZXR1cm5zIHtmdW5jdGlvbihzY29wZSwgY2xvbmVBdHRhY2hGbj0sIG9wdGlvbnM9KX0gYSBsaW5rIGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gYmluZCB0ZW1wbGF0ZQorICogKGEgRE9NIGVsZW1lbnQvdHJlZSkgdG8gYSBzY29wZS4gV2hlcmU6CisgKgorICogICogYHNjb3BlYCAtIEEge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUgU2NvcGV9IHRvIGJpbmQgdG8uCisgKiAgKiBgY2xvbmVBdHRhY2hGbmAgLSBJZiBgY2xvbmVBdHRhY2hGbmAgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIGxpbmsgZnVuY3Rpb24gd2lsbCBjbG9uZSB0aGUKKyAqICBgdGVtcGxhdGVgIGFuZCBjYWxsIHRoZSBgY2xvbmVBdHRhY2hGbmAgZnVuY3Rpb24gYWxsb3dpbmcgdGhlIGNhbGxlciB0byBhdHRhY2ggdGhlCisgKiAgY2xvbmVkIGVsZW1lbnRzIHRvIHRoZSBET00gZG9jdW1lbnQgYXQgdGhlIGFwcHJvcHJpYXRlIHBsYWNlLiBUaGUgYGNsb25lQXR0YWNoRm5gIGlzCisgKiAgY2FsbGVkIGFzOiA8YnI+IGBjbG9uZUF0dGFjaEZuKGNsb25lZEVsZW1lbnQsIHNjb3BlKWAgd2hlcmU6CisgKgorICogICAgICAqIGBjbG9uZWRFbGVtZW50YCAtIGlzIGEgY2xvbmUgb2YgdGhlIG9yaWdpbmFsIGBlbGVtZW50YCBwYXNzZWQgaW50byB0aGUgY29tcGlsZXIuCisgKiAgICAgICogYHNjb3BlYCAtIGlzIHRoZSBjdXJyZW50IHNjb3BlIHdpdGggd2hpY2ggdGhlIGxpbmtpbmcgZnVuY3Rpb24gaXMgd29ya2luZyB3aXRoLgorICoKKyAqICAqIGBvcHRpb25zYCAtIEFuIG9wdGlvbmFsIG9iamVjdCBoYXNoIHdpdGggbGlua2luZyBvcHRpb25zLiBJZiBgb3B0aW9uc2AgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIGZvbGxvd2luZworICogIGtleXMgbWF5IGJlIHVzZWQgdG8gY29udHJvbCBsaW5raW5nIGJlaGF2aW9yOgorICoKKyAqICAgICAgKiBgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm5gIC0gdGhlIHRyYW5zY2x1ZGUgZnVuY3Rpb24gbWFkZSBhdmFpbGFibGUgdG8KKyAqICAgICAgICBkaXJlY3RpdmVzOyBpZiBnaXZlbiwgaXQgd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbGluayBmdW5jdGlvbnMgb2YKKyAqICAgICAgICBkaXJlY3RpdmVzIGZvdW5kIGluIGBlbGVtZW50YCBkdXJpbmcgY29tcGlsYXRpb24uCisgKiAgICAgICogYHRyYW5zY2x1ZGVDb250cm9sbGVyc2AgLSBhbiBvYmplY3QgaGFzaCB3aXRoIGtleXMgdGhhdCBtYXAgY29udHJvbGxlciBuYW1lcworICogICAgICAgIHRvIGNvbnRyb2xsZXIgaW5zdGFuY2VzOyBpZiBnaXZlbiwgaXQgd2lsbCBtYWtlIHRoZSBjb250cm9sbGVycworICogICAgICAgIGF2YWlsYWJsZSB0byBkaXJlY3RpdmVzLgorICogICAgICAqIGBmdXR1cmVQYXJlbnRFbGVtZW50YCAtIGRlZmluZXMgdGhlIHBhcmVudCB0byB3aGljaCB0aGUgYGNsb25lQXR0YWNoRm5gIHdpbGwgYWRkCisgKiAgICAgICAgdGhlIGNsb25lZCBlbGVtZW50czsgb25seSBuZWVkZWQgZm9yIHRyYW5zY2x1ZGVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gY29udGFpbiBub24gaHRtbAorICogICAgICAgIGVsZW1lbnRzIChlLmcuIFNWRyBlbGVtZW50cykuIFNlZSBhbHNvIHRoZSBkaXJlY3RpdmUuY29udHJvbGxlciBwcm9wZXJ0eS4KKyAqCisgKiBDYWxsaW5nIHRoZSBsaW5raW5nIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVsZW1lbnQgb2YgdGhlIHRlbXBsYXRlLiBJdCBpcyBlaXRoZXIgdGhlIG9yaWdpbmFsCisgKiBlbGVtZW50IHBhc3NlZCBpbiwgb3IgdGhlIGNsb25lIG9mIHRoZSBlbGVtZW50IGlmIHRoZSBgY2xvbmVBdHRhY2hGbmAgaXMgcHJvdmlkZWQuCisgKgorICogQWZ0ZXIgbGlua2luZyB0aGUgdmlldyBpcyBub3QgdXBkYXRlZCB1bnRpbCBhZnRlciBhIGNhbGwgdG8gJGRpZ2VzdCB3aGljaCB0eXBpY2FsbHkgaXMgZG9uZSBieQorICogQW5ndWxhciBhdXRvbWF0aWNhbGx5LgorICoKKyAqIElmIHlvdSBuZWVkIGFjY2VzcyB0byB0aGUgYm91bmQgdmlldywgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGRvIGl0OgorICoKKyAqIC0gSWYgeW91IGFyZSBub3QgYXNraW5nIHRoZSBsaW5raW5nIGZ1bmN0aW9uIHRvIGNsb25lIHRoZSB0ZW1wbGF0ZSwgY3JlYXRlIHRoZSBET00gZWxlbWVudChzKQorICogICBiZWZvcmUgeW91IHNlbmQgdGhlbSB0byB0aGUgY29tcGlsZXIgYW5kIGtlZXAgdGhpcyByZWZlcmVuY2UgYXJvdW5kLgorICogICBgYGBqcworICogICAgIHZhciBlbGVtZW50ID0gJGNvbXBpbGUoJzxwPnt7dG90YWx9fTwvcD4nKShzY29wZSk7CisgKiAgIGBgYAorICoKKyAqIC0gaWYgb24gdGhlIG90aGVyIGhhbmQsIHlvdSBuZWVkIHRoZSBlbGVtZW50IHRvIGJlIGNsb25lZCwgdGhlIHZpZXcgcmVmZXJlbmNlIGZyb20gdGhlIG9yaWdpbmFsCisgKiAgIGV4YW1wbGUgd291bGQgbm90IHBvaW50IHRvIHRoZSBjbG9uZSwgYnV0IHJhdGhlciB0byB0aGUgb3JpZ2luYWwgdGVtcGxhdGUgdGhhdCB3YXMgY2xvbmVkLiBJbgorICogICB0aGlzIGNhc2UsIHlvdSBjYW4gYWNjZXNzIHRoZSBjbG9uZSB2aWEgdGhlIGNsb25lQXR0YWNoRm46CisgKiAgIGBgYGpzCisgKiAgICAgdmFyIHRlbXBsYXRlRWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudCgnPHA+e3t0b3RhbH19PC9wPicpLAorICogICAgICAgICBzY29wZSA9IC4uLi47CisgKgorICogICAgIHZhciBjbG9uZWRFbGVtZW50ID0gJGNvbXBpbGUodGVtcGxhdGVFbGVtZW50KShzY29wZSwgZnVuY3Rpb24oY2xvbmVkRWxlbWVudCwgc2NvcGUpIHsKKyAqICAgICAgIC8vYXR0YWNoIHRoZSBjbG9uZSB0byBET00gZG9jdW1lbnQgYXQgdGhlIHJpZ2h0IHBsYWNlCisgKiAgICAgfSk7CisgKgorICogICAgIC8vbm93IHdlIGhhdmUgcmVmZXJlbmNlIHRvIHRoZSBjbG9uZWQgRE9NIHZpYSBgY2xvbmVkRWxlbWVudGAKKyAqICAgYGBgCisgKgorICoKKyAqIEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdGhlIGNvbXBpbGVyIHdvcmtzLCBzZWUgdGhlCisgKiB7QGxpbmsgZ3VpZGUvY29tcGlsZXIgQW5ndWxhciBIVE1MIENvbXBpbGVyfSBzZWN0aW9uIG9mIHRoZSBEZXZlbG9wZXIgR3VpZGUuCisgKi8KKwordmFyICRjb21waWxlTWluRXJyID0gbWluRXJyKCckY29tcGlsZScpOworCisvKioKKyAqIEBuZ2RvYyBwcm92aWRlcgorICogQG5hbWUgJGNvbXBpbGVQcm92aWRlcgorICoKKyAqIEBkZXNjcmlwdGlvbgorICovCiskQ29tcGlsZVByb3ZpZGVyLiRpbmplY3QgPSBbJyRwcm92aWRlJywgJyQkc2FuaXRpemVVcmlQcm92aWRlciddOworZnVuY3Rpb24gJENvbXBpbGVQcm92aWRlcigkcHJvdmlkZSwgJCRzYW5pdGl6ZVVyaVByb3ZpZGVyKSB7CisgIHZhciBoYXNEaXJlY3RpdmVzID0ge30sCisgICAgICBTdWZmaXggPSAnRGlyZWN0aXZlJywKKyAgICAgIENPTU1FTlRfRElSRUNUSVZFX1JFR0VYUCA9IC9eXHMqZGlyZWN0aXZlXDpccyooW1x3XC1dKylccysoLiopJC8sCisgICAgICBDTEFTU19ESVJFQ1RJVkVfUkVHRVhQID0gLygoW1x3XC1dKykoPzpcOihbXjtdKykpPzs/KS8sCisgICAgICBBTExfT1JfTk9USElOR19BVFRSUyA9IG1ha2VNYXAoJ25nU3JjLG5nU3Jjc2V0LHNyYyxzcmNzZXQnKSwKKyAgICAgIFJFUVVJUkVfUFJFRklYX1JFR0VYUCA9IC9eKD86KFxeXF4/KT8oXD8pPyhcXlxePyk/KT8vOworCisgIC8vIFJlZjogaHR0cDovL2RldmVsb3BlcnMud2hhdHdnLm9yZy93ZWJhcHBhcGlzLmh0bWwjZXZlbnQtaGFuZGxlci1pZGwtYXR0cmlidXRlcworICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IGZ1dHVyZSBET00gZXZlbnQgYXR0cmlidXRlIG5hbWVzIHdpbGwgYmVnaW4gd2l0aAorICAvLyAnb24nIGFuZCBiZSBjb21wb3NlZCBvZiBvbmx5IEVuZ2xpc2ggbGV0dGVycy4KKyAgdmFyIEVWRU5UX0hBTkRMRVJfQVRUUl9SRUdFWFAgPSAvXihvblthLXpdK3xmb3JtYWN0aW9uKSQvOworCisgIGZ1bmN0aW9uIHBhcnNlSXNvbGF0ZUJpbmRpbmdzKHNjb3BlLCBkaXJlY3RpdmVOYW1lKSB7CisgICAgdmFyIExPQ0FMX1JFR0VYUCA9IC9eXHMqKFtAJl18PShcKj8pKShcPz8pXHMqKFx3KilccyokLzsKKworICAgIHZhciBiaW5kaW5ncyA9IHt9OworCisgICAgZm9yRWFjaChzY29wZSwgZnVuY3Rpb24oZGVmaW5pdGlvbiwgc2NvcGVOYW1lKSB7CisgICAgICB2YXIgbWF0Y2ggPSBkZWZpbml0aW9uLm1hdGNoKExPQ0FMX1JFR0VYUCk7CisKKyAgICAgIGlmICghbWF0Y2gpIHsKKyAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ2lzY3AnLAorICAgICAgICAgICAgIkludmFsaWQgaXNvbGF0ZSBzY29wZSBkZWZpbml0aW9uIGZvciBkaXJlY3RpdmUgJ3swfScuIiArCisgICAgICAgICAgICAiIERlZmluaXRpb246IHsuLi4gezF9OiAnezJ9JyAuLi59IiwKKyAgICAgICAgICAgIGRpcmVjdGl2ZU5hbWUsIHNjb3BlTmFtZSwgZGVmaW5pdGlvbik7CisgICAgICB9CisKKyAgICAgIGJpbmRpbmdzW3Njb3BlTmFtZV0gPSB7CisgICAgICAgIG1vZGU6IG1hdGNoWzFdWzBdLAorICAgICAgICBjb2xsZWN0aW9uOiBtYXRjaFsyXSA9PT0gJyonLAorICAgICAgICBvcHRpb25hbDogbWF0Y2hbM10gPT09ICc/JywKKyAgICAgICAgYXR0ck5hbWU6IG1hdGNoWzRdIHx8IHNjb3BlTmFtZQorICAgICAgfTsKKyAgICB9KTsKKworICAgIHJldHVybiBiaW5kaW5nczsKKyAgfQorCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRjb21waWxlUHJvdmlkZXIjZGlyZWN0aXZlCisgICAqIEBraW5kIGZ1bmN0aW9uCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBSZWdpc3RlciBhIG5ldyBkaXJlY3RpdmUgd2l0aCB0aGUgY29tcGlsZXIuCisgICAqCisgICAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gbmFtZSBOYW1lIG9mIHRoZSBkaXJlY3RpdmUgaW4gY2FtZWwtY2FzZSAoaS5lLiA8Y29kZT5uZ0JpbmQ8L2NvZGU+IHdoaWNoCisgICAqICAgIHdpbGwgbWF0Y2ggYXMgPGNvZGU+bmctYmluZDwvY29kZT4pLCBvciBhbiBvYmplY3QgbWFwIG9mIGRpcmVjdGl2ZXMgd2hlcmUgdGhlIGtleXMgYXJlIHRoZQorICAgKiAgICBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGZhY3Rvcmllcy4KKyAgICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheX0gZGlyZWN0aXZlRmFjdG9yeSBBbiBpbmplY3RhYmxlIGRpcmVjdGl2ZSBmYWN0b3J5IGZ1bmN0aW9uLiBTZWUKKyAgICogICAge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZX0gZm9yIG1vcmUgaW5mby4KKyAgICogQHJldHVybnMge25nLiRjb21waWxlUHJvdmlkZXJ9IFNlbGYgZm9yIGNoYWluaW5nLgorICAgKi8KKyAgIHRoaXMuZGlyZWN0aXZlID0gZnVuY3Rpb24gcmVnaXN0ZXJEaXJlY3RpdmUobmFtZSwgZGlyZWN0aXZlRmFjdG9yeSkgeworICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KG5hbWUsICdkaXJlY3RpdmUnKTsKKyAgICBpZiAoaXNTdHJpbmcobmFtZSkpIHsKKyAgICAgIGFzc2VydEFyZyhkaXJlY3RpdmVGYWN0b3J5LCAnZGlyZWN0aXZlRmFjdG9yeScpOworICAgICAgaWYgKCFoYXNEaXJlY3RpdmVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CisgICAgICAgIGhhc0RpcmVjdGl2ZXNbbmFtZV0gPSBbXTsKKyAgICAgICAgJHByb3ZpZGUuZmFjdG9yeShuYW1lICsgU3VmZml4LCBbJyRpbmplY3RvcicsICckZXhjZXB0aW9uSGFuZGxlcicsCisgICAgICAgICAgZnVuY3Rpb24oJGluamVjdG9yLCAkZXhjZXB0aW9uSGFuZGxlcikgeworICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZXMgPSBbXTsKKyAgICAgICAgICAgIGZvckVhY2goaGFzRGlyZWN0aXZlc1tuYW1lXSwgZnVuY3Rpb24oZGlyZWN0aXZlRmFjdG9yeSwgaW5kZXgpIHsKKyAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aXZlID0gJGluamVjdG9yLmludm9rZShkaXJlY3RpdmVGYWN0b3J5KTsKKyAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihkaXJlY3RpdmUpKSB7CisgICAgICAgICAgICAgICAgICBkaXJlY3RpdmUgPSB7IGNvbXBpbGU6IHZhbHVlRm4oZGlyZWN0aXZlKSB9OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRpcmVjdGl2ZS5jb21waWxlICYmIGRpcmVjdGl2ZS5saW5rKSB7CisgICAgICAgICAgICAgICAgICBkaXJlY3RpdmUuY29tcGlsZSA9IHZhbHVlRm4oZGlyZWN0aXZlLmxpbmspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaXJlY3RpdmUucHJpb3JpdHkgPSBkaXJlY3RpdmUucHJpb3JpdHkgfHwgMDsKKyAgICAgICAgICAgICAgICBkaXJlY3RpdmUuaW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgICAgICBkaXJlY3RpdmUubmFtZSA9IGRpcmVjdGl2ZS5uYW1lIHx8IG5hbWU7CisgICAgICAgICAgICAgICAgZGlyZWN0aXZlLnJlcXVpcmUgPSBkaXJlY3RpdmUucmVxdWlyZSB8fCAoZGlyZWN0aXZlLmNvbnRyb2xsZXIgJiYgZGlyZWN0aXZlLm5hbWUpOworICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5yZXN0cmljdCA9IGRpcmVjdGl2ZS5yZXN0cmljdCB8fCAnRUEnOworICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChkaXJlY3RpdmUuc2NvcGUpKSB7CisgICAgICAgICAgICAgICAgICBkaXJlY3RpdmUuJCRpc29sYXRlQmluZGluZ3MgPSBwYXJzZUlzb2xhdGVCaW5kaW5ncyhkaXJlY3RpdmUuc2NvcGUsIGRpcmVjdGl2ZS5uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlyZWN0aXZlcy5wdXNoKGRpcmVjdGl2ZSk7CisgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlczsKKyAgICAgICAgICB9XSk7CisgICAgICB9CisgICAgICBoYXNEaXJlY3RpdmVzW25hbWVdLnB1c2goZGlyZWN0aXZlRmFjdG9yeSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvckVhY2gobmFtZSwgcmV2ZXJzZVBhcmFtcyhyZWdpc3RlckRpcmVjdGl2ZSkpOworICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgfTsKKworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRjb21waWxlUHJvdmlkZXIjYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QKKyAgICogQGtpbmQgZnVuY3Rpb24KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIFJldHJpZXZlcyBvciBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcmVndWxhciBleHByZXNzaW9uIHRoYXQgaXMgdXNlZCBmb3Igd2hpdGVsaXN0aW5nIG9mIHNhZmUKKyAgICogdXJscyBkdXJpbmcgYVtocmVmXSBzYW5pdGl6YXRpb24uCisgICAqCisgICAqIFRoZSBzYW5pdGl6YXRpb24gaXMgYSBzZWN1cml0eSBtZWFzdXJlIGFpbWVkIGF0IHByZXZlbnRpbmcgWFNTIGF0dGFja3MgdmlhIGh0bWwgbGlua3MuCisgICAqCisgICAqIEFueSB1cmwgYWJvdXQgdG8gYmUgYXNzaWduZWQgdG8gYVtocmVmXSB2aWEgZGF0YS1iaW5kaW5nIGlzIGZpcnN0IG5vcm1hbGl6ZWQgYW5kIHR1cm5lZCBpbnRvCisgICAqIGFuIGFic29sdXRlIHVybC4gQWZ0ZXJ3YXJkcywgdGhlIHVybCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdGAKKyAgICogcmVndWxhciBleHByZXNzaW9uLiBJZiBhIG1hdGNoIGlzIGZvdW5kLCB0aGUgb3JpZ2luYWwgdXJsIGlzIHdyaXR0ZW4gaW50byB0aGUgZG9tLiBPdGhlcndpc2UsCisgICAqIHRoZSBhYnNvbHV0ZSB1cmwgaXMgcHJlZml4ZWQgd2l0aCBgJ3Vuc2FmZTonYCBzdHJpbmcgYW5kIG9ubHkgdGhlbiBpcyBpdCB3cml0dGVuIGludG8gdGhlIERPTS4KKyAgICoKKyAgICogQHBhcmFtIHtSZWdFeHA9fSByZWdleHAgTmV3IHJlZ2V4cCB0byB3aGl0ZWxpc3QgdXJscyB3aXRoLgorICAgKiBAcmV0dXJucyB7UmVnRXhwfG5nLiRjb21waWxlUHJvdmlkZXJ9IEN1cnJlbnQgUmVnRXhwIGlmIGNhbGxlZCB3aXRob3V0IHZhbHVlIG9yIHNlbGYgZm9yCisgICAqICAgIGNoYWluaW5nIG90aGVyd2lzZS4KKyAgICovCisgIHRoaXMuYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSBmdW5jdGlvbihyZWdleHApIHsKKyAgICBpZiAoaXNEZWZpbmVkKHJlZ2V4cCkpIHsKKyAgICAgICQkc2FuaXRpemVVcmlQcm92aWRlci5hSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdChyZWdleHApOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAkJHNhbml0aXplVXJpUHJvdmlkZXIuYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QoKTsKKyAgICB9CisgIH07CisKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAkY29tcGlsZVByb3ZpZGVyI2ltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdAorICAgKiBAa2luZCBmdW5jdGlvbgorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogUmV0cmlldmVzIG9yIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIGZvciB3aGl0ZWxpc3Rpbmcgb2Ygc2FmZQorICAgKiB1cmxzIGR1cmluZyBpbWdbc3JjXSBzYW5pdGl6YXRpb24uCisgICAqCisgICAqIFRoZSBzYW5pdGl6YXRpb24gaXMgYSBzZWN1cml0eSBtZWFzdXJlIGFpbWVkIGF0IHByZXZlbnQgWFNTIGF0dGFja3MgdmlhIGh0bWwgbGlua3MuCisgICAqCisgICAqIEFueSB1cmwgYWJvdXQgdG8gYmUgYXNzaWduZWQgdG8gaW1nW3NyY10gdmlhIGRhdGEtYmluZGluZyBpcyBmaXJzdCBub3JtYWxpemVkIGFuZCB0dXJuZWQgaW50bworICAgKiBhbiBhYnNvbHV0ZSB1cmwuIEFmdGVyd2FyZHMsIHRoZSB1cmwgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBgaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0YAorICAgKiByZWd1bGFyIGV4cHJlc3Npb24uIElmIGEgbWF0Y2ggaXMgZm91bmQsIHRoZSBvcmlnaW5hbCB1cmwgaXMgd3JpdHRlbiBpbnRvIHRoZSBkb20uIE90aGVyd2lzZSwKKyAgICogdGhlIGFic29sdXRlIHVybCBpcyBwcmVmaXhlZCB3aXRoIGAndW5zYWZlOidgIHN0cmluZyBhbmQgb25seSB0aGVuIGlzIGl0IHdyaXR0ZW4gaW50byB0aGUgRE9NLgorICAgKgorICAgKiBAcGFyYW0ge1JlZ0V4cD19IHJlZ2V4cCBOZXcgcmVnZXhwIHRvIHdoaXRlbGlzdCB1cmxzIHdpdGguCisgICAqIEByZXR1cm5zIHtSZWdFeHB8bmcuJGNvbXBpbGVQcm92aWRlcn0gQ3VycmVudCBSZWdFeHAgaWYgY2FsbGVkIHdpdGhvdXQgdmFsdWUgb3Igc2VsZiBmb3IKKyAgICogICAgY2hhaW5pbmcgb3RoZXJ3aXNlLgorICAgKi8KKyAgdGhpcy5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSBmdW5jdGlvbihyZWdleHApIHsKKyAgICBpZiAoaXNEZWZpbmVkKHJlZ2V4cCkpIHsKKyAgICAgICQkc2FuaXRpemVVcmlQcm92aWRlci5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QocmVnZXhwKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gJCRzYW5pdGl6ZVVyaVByb3ZpZGVyLmltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCgpOworICAgIH0KKyAgfTsKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAgJGNvbXBpbGVQcm92aWRlciNkZWJ1Z0luZm9FbmFibGVkCisgICAqCisgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGVuYWJsZWQgdXBkYXRlIHRoZSBkZWJ1Z0luZm9FbmFibGVkIHN0YXRlIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UganVzdCByZXR1cm4gdGhlCisgICAqIGN1cnJlbnQgZGVidWdJbmZvRW5hYmxlZCBzdGF0ZQorICAgKiBAcmV0dXJucyB7Kn0gY3VycmVudCB2YWx1ZSBpZiB1c2VkIGFzIGdldHRlciBvciBpdHNlbGYgKGNoYWluaW5nKSBpZiB1c2VkIGFzIHNldHRlcgorICAgKgorICAgKiBAa2luZCBmdW5jdGlvbgorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogQ2FsbCB0aGlzIG1ldGhvZCB0byBlbmFibGUvZGlzYWJsZSB2YXJpb3VzIGRlYnVnIHJ1bnRpbWUgaW5mb3JtYXRpb24gaW4gdGhlIGNvbXBpbGVyIHN1Y2ggYXMgYWRkaW5nCisgICAqIGJpbmRpbmcgaW5mb3JtYXRpb24gYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHNjb3BlIG9uIHRvIERPTSBlbGVtZW50cy4KKyAgICogSWYgZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgYWRkIHRoZSBmb2xsb3dpbmcgdG8gRE9NIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGJvdW5kIHRvIHRoZSBzY29wZQorICAgKiAqIGBuZy1iaW5kaW5nYCBDU1MgY2xhc3MKKyAgICogKiBgJGJpbmRpbmdgIGRhdGEgcHJvcGVydHkgY29udGFpbmluZyBhbiBhcnJheSBvZiB0aGUgYmluZGluZyBleHByZXNzaW9ucworICAgKgorICAgKiBZb3UgbWF5IHdhbnQgdG8gZGlzYWJsZSB0aGlzIGluIHByb2R1Y3Rpb24gZm9yIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgYm9vc3QuIFNlZQorICAgKiB7QGxpbmsgZ3VpZGUvcHJvZHVjdGlvbiNkaXNhYmxpbmctZGVidWctZGF0YSBEaXNhYmxpbmcgRGVidWcgRGF0YX0gZm9yIG1vcmUuCisgICAqCisgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgICAqLworICB2YXIgZGVidWdJbmZvRW5hYmxlZCA9IHRydWU7CisgIHRoaXMuZGVidWdJbmZvRW5hYmxlZCA9IGZ1bmN0aW9uKGVuYWJsZWQpIHsKKyAgICBpZiAoaXNEZWZpbmVkKGVuYWJsZWQpKSB7CisgICAgICBkZWJ1Z0luZm9FbmFibGVkID0gZW5hYmxlZDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICByZXR1cm4gZGVidWdJbmZvRW5hYmxlZDsKKyAgfTsKKworICB0aGlzLiRnZXQgPSBbCisgICAgICAgICAgICAnJGluamVjdG9yJywgJyRpbnRlcnBvbGF0ZScsICckZXhjZXB0aW9uSGFuZGxlcicsICckdGVtcGxhdGVSZXF1ZXN0JywgJyRwYXJzZScsCisgICAgICAgICAgICAnJGNvbnRyb2xsZXInLCAnJHJvb3RTY29wZScsICckZG9jdW1lbnQnLCAnJHNjZScsICckYW5pbWF0ZScsICckJHNhbml0aXplVXJpJywKKyAgICBmdW5jdGlvbigkaW5qZWN0b3IsICAgJGludGVycG9sYXRlLCAgICRleGNlcHRpb25IYW5kbGVyLCAgICR0ZW1wbGF0ZVJlcXVlc3QsICAgJHBhcnNlLAorICAgICAgICAgICAgICRjb250cm9sbGVyLCAgICRyb290U2NvcGUsICAgJGRvY3VtZW50LCAgICRzY2UsICAgJGFuaW1hdGUsICAgJCRzYW5pdGl6ZVVyaSkgeworCisgICAgdmFyIEF0dHJpYnV0ZXMgPSBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGVzVG9Db3B5KSB7CisgICAgICBpZiAoYXR0cmlidXRlc1RvQ29weSkgeworICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXNUb0NvcHkpOworICAgICAgICB2YXIgaSwgbCwga2V5OworCisgICAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgeworICAgICAgICAgIGtleSA9IGtleXNbaV07CisgICAgICAgICAgdGhpc1trZXldID0gYXR0cmlidXRlc1RvQ29weVtrZXldOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLiRhdHRyID0ge307CisgICAgICB9CisKKyAgICAgIHRoaXMuJCRlbGVtZW50ID0gZWxlbWVudDsKKyAgICB9OworCisgICAgQXR0cmlidXRlcy5wcm90b3R5cGUgPSB7CisgICAgICAvKioKKyAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRub3JtYWxpemUKKyAgICAgICAqIEBraW5kIGZ1bmN0aW9uCisgICAgICAgKgorICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgKiBDb252ZXJ0cyBhbiBhdHRyaWJ1dGUgbmFtZSAoZS5nLiBkYXNoL2NvbG9uL3VuZGVyc2NvcmUtZGVsaW1pdGVkIHN0cmluZywgb3B0aW9uYWxseSBwcmVmaXhlZCB3aXRoIGB4LWAgb3IKKyAgICAgICAqIGBkYXRhLWApIHRvIGl0cyBub3JtYWxpemVkLCBjYW1lbENhc2UgZm9ybS4KKyAgICAgICAqCisgICAgICAgKiBBbHNvIHRoZXJlIGlzIHNwZWNpYWwgY2FzZSBmb3IgTW96IHByZWZpeCBzdGFydGluZyB3aXRoIHVwcGVyIGNhc2UgbGV0dGVyLgorICAgICAgICoKKyAgICAgICAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGNoZWNrIG91dCB0aGUgZ3VpZGUgb24ge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSNtYXRjaGluZy1kaXJlY3RpdmVzIE1hdGNoaW5nIERpcmVjdGl2ZXN9CisgICAgICAgKgorICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSB0byBub3JtYWxpemUKKyAgICAgICAqLworICAgICAgJG5vcm1hbGl6ZTogZGlyZWN0aXZlTm9ybWFsaXplLAorCisKKyAgICAgIC8qKgorICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICogQG5hbWUgJGNvbXBpbGUuZGlyZWN0aXZlLkF0dHJpYnV0ZXMjJGFkZENsYXNzCisgICAgICAgKiBAa2luZCBmdW5jdGlvbgorICAgICAgICoKKyAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICogQWRkcyB0aGUgQ1NTIGNsYXNzIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgY2xhc3NWYWwgcGFyYW1ldGVyIHRvIHRoZSBlbGVtZW50LiBJZiBhbmltYXRpb25zCisgICAgICAgKiBhcmUgZW5hYmxlZCB0aGVuIGFuIGFuaW1hdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCBmb3IgdGhlIGNsYXNzIGFkZGl0aW9uLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1ZhbCBUaGUgY2xhc3NOYW1lIHZhbHVlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudAorICAgICAgICovCisgICAgICAkYWRkQ2xhc3M6IGZ1bmN0aW9uKGNsYXNzVmFsKSB7CisgICAgICAgIGlmIChjbGFzc1ZhbCAmJiBjbGFzc1ZhbC5sZW5ndGggPiAwKSB7CisgICAgICAgICAgJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsIGNsYXNzVmFsKTsKKyAgICAgICAgfQorICAgICAgfSwKKworICAgICAgLyoqCisgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkcmVtb3ZlQ2xhc3MKKyAgICAgICAqIEBraW5kIGZ1bmN0aW9uCisgICAgICAgKgorICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgKiBSZW1vdmVzIHRoZSBDU1MgY2xhc3MgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSBjbGFzc1ZhbCBwYXJhbWV0ZXIgZnJvbSB0aGUgZWxlbWVudC4gSWYKKyAgICAgICAqIGFuaW1hdGlvbnMgYXJlIGVuYWJsZWQgdGhlbiBhbiBhbmltYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgZm9yIHRoZSBjbGFzcyByZW1vdmFsLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1ZhbCBUaGUgY2xhc3NOYW1lIHZhbHVlIHRoYXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnQKKyAgICAgICAqLworICAgICAgJHJlbW92ZUNsYXNzOiBmdW5jdGlvbihjbGFzc1ZhbCkgeworICAgICAgICBpZiAoY2xhc3NWYWwgJiYgY2xhc3NWYWwubGVuZ3RoID4gMCkgeworICAgICAgICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LCBjbGFzc1ZhbCk7CisgICAgICAgIH0KKyAgICAgIH0sCisKKyAgICAgIC8qKgorICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICogQG5hbWUgJGNvbXBpbGUuZGlyZWN0aXZlLkF0dHJpYnV0ZXMjJHVwZGF0ZUNsYXNzCisgICAgICAgKiBAa2luZCBmdW5jdGlvbgorICAgICAgICoKKyAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICogQWRkcyBhbmQgcmVtb3ZlcyB0aGUgYXBwcm9wcmlhdGUgQ1NTIGNsYXNzIHZhbHVlcyB0byB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZQorICAgICAgICogYmV0d2VlbiB0aGUgbmV3IGFuZCBvbGQgQ1NTIGNsYXNzIHZhbHVlcyAoc3BlY2lmaWVkIGFzIG5ld0NsYXNzZXMgYW5kIG9sZENsYXNzZXMpLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdDbGFzc2VzIFRoZSBjdXJyZW50IENTUyBjbGFzc05hbWUgdmFsdWUKKyAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvbGRDbGFzc2VzIFRoZSBmb3JtZXIgQ1NTIGNsYXNzTmFtZSB2YWx1ZQorICAgICAgICovCisgICAgICAkdXBkYXRlQ2xhc3M6IGZ1bmN0aW9uKG5ld0NsYXNzZXMsIG9sZENsYXNzZXMpIHsKKyAgICAgICAgdmFyIHRvQWRkID0gdG9rZW5EaWZmZXJlbmNlKG5ld0NsYXNzZXMsIG9sZENsYXNzZXMpOworICAgICAgICBpZiAodG9BZGQgJiYgdG9BZGQubGVuZ3RoKSB7CisgICAgICAgICAgJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsIHRvQWRkKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0b1JlbW92ZSA9IHRva2VuRGlmZmVyZW5jZShvbGRDbGFzc2VzLCBuZXdDbGFzc2VzKTsKKyAgICAgICAgaWYgKHRvUmVtb3ZlICYmIHRvUmVtb3ZlLmxlbmd0aCkgeworICAgICAgICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LCB0b1JlbW92ZSk7CisgICAgICAgIH0KKyAgICAgIH0sCisKKyAgICAgIC8qKgorICAgICAgICogU2V0IGEgbm9ybWFsaXplZCBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgaW4gYSB3YXkgc3VjaCB0aGF0IGFsbCBkaXJlY3RpdmVzCisgICAgICAgKiBjYW4gc2hhcmUgdGhlIGF0dHJpYnV0ZS4gVGhpcyBmdW5jdGlvbiBwcm9wZXJseSBoYW5kbGVzIGJvb2xlYW4gYXR0cmlidXRlcy4KKyAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTm9ybWFsaXplZCBrZXkuIChpZSBuZ0F0dHJpYnV0ZSkKKyAgICAgICAqIEBwYXJhbSB7c3RyaW5nfGJvb2xlYW59IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuIElmIGBudWxsYCBhdHRyaWJ1dGUgd2lsbCBiZSBkZWxldGVkLgorICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gd3JpdGVBdHRyIElmIGZhbHNlLCBkb2VzIG5vdCB3cml0ZSB0aGUgdmFsdWUgdG8gRE9NIGVsZW1lbnQgYXR0cmlidXRlLgorICAgICAgICogICAgIERlZmF1bHRzIHRvIHRydWUuCisgICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJOYW1lIE9wdGlvbmFsIG5vbmUgbm9ybWFsaXplZCBuYW1lLiBEZWZhdWx0cyB0byBrZXkuCisgICAgICAgKi8KKyAgICAgICRzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUsIHdyaXRlQXR0ciwgYXR0ck5hbWUpIHsKKyAgICAgICAgLy8gVE9ETzogZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIHRocm93IGFuIGVycm9yIGlmICJjbGFzcyIKKyAgICAgICAgLy9pcyBzZXQgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIHNpbmNlIGl0IG1heSBjYXVzZSAkdXBkYXRlQ2xhc3MgdG8KKyAgICAgICAgLy9iZWNvbWUgdW5zdGFibGUuCisKKyAgICAgICAgdmFyIG5vZGUgPSB0aGlzLiQkZWxlbWVudFswXSwKKyAgICAgICAgICAgIGJvb2xlYW5LZXkgPSBnZXRCb29sZWFuQXR0ck5hbWUobm9kZSwga2V5KSwKKyAgICAgICAgICAgIGFsaWFzZWRLZXkgPSBnZXRBbGlhc2VkQXR0ck5hbWUobm9kZSwga2V5KSwKKyAgICAgICAgICAgIG9ic2VydmVyID0ga2V5LAorICAgICAgICAgICAgbm9kZU5hbWU7CisKKyAgICAgICAgaWYgKGJvb2xlYW5LZXkpIHsKKyAgICAgICAgICB0aGlzLiQkZWxlbWVudC5wcm9wKGtleSwgdmFsdWUpOworICAgICAgICAgIGF0dHJOYW1lID0gYm9vbGVhbktleTsKKyAgICAgICAgfSBlbHNlIGlmIChhbGlhc2VkS2V5KSB7CisgICAgICAgICAgdGhpc1thbGlhc2VkS2V5XSA9IHZhbHVlOworICAgICAgICAgIG9ic2VydmVyID0gYWxpYXNlZEtleTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXNba2V5XSA9IHZhbHVlOworCisgICAgICAgIC8vIHRyYW5zbGF0ZSBub3JtYWxpemVkIGtleSB0byBhY3R1YWwga2V5CisgICAgICAgIGlmIChhdHRyTmFtZSkgeworICAgICAgICAgIHRoaXMuJGF0dHJba2V5XSA9IGF0dHJOYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGF0dHJOYW1lID0gdGhpcy4kYXR0cltrZXldOworICAgICAgICAgIGlmICghYXR0ck5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuJGF0dHJba2V5XSA9IGF0dHJOYW1lID0gc25ha2VfY2FzZShrZXksICctJyk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbm9kZU5hbWUgPSBub2RlTmFtZV8odGhpcy4kJGVsZW1lbnQpOworCisgICAgICAgIGlmICgobm9kZU5hbWUgPT09ICdhJyAmJiBrZXkgPT09ICdocmVmJykgfHwKKyAgICAgICAgICAgIChub2RlTmFtZSA9PT0gJ2ltZycgJiYga2V5ID09PSAnc3JjJykpIHsKKyAgICAgICAgICAvLyBzYW5pdGl6ZSBhW2hyZWZdIGFuZCBpbWdbc3JjXSB2YWx1ZXMKKyAgICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZSA9ICQkc2FuaXRpemVVcmkodmFsdWUsIGtleSA9PT0gJ3NyYycpOworICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSAnaW1nJyAmJiBrZXkgPT09ICdzcmNzZXQnKSB7CisgICAgICAgICAgLy8gc2FuaXRpemUgaW1nW3NyY3NldF0gdmFsdWVzCisgICAgICAgICAgdmFyIHJlc3VsdCA9ICIiOworCisgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgaWYgdGhlcmUgYXJlIHNwYWNlcyBiZWNhdXNlIGl0J3Mgbm90IHRoZSBzYW1lIHBhdHRlcm4KKyAgICAgICAgICB2YXIgdHJpbW1lZFNyY3NldCA9IHRyaW0odmFsdWUpOworICAgICAgICAgIC8vICAgICAgICAgICAgICAgICggICA5OTl4ICAgLHwgICA5OTl3ICAgLHwgICAsfCwgICApCisgICAgICAgICAgdmFyIHNyY1BhdHRlcm4gPSAvKFxzK1xkK3hccyosfFxzK1xkK3dccyosfFxzKyx8LFxzKykvOworICAgICAgICAgIHZhciBwYXR0ZXJuID0gL1xzLy50ZXN0KHRyaW1tZWRTcmNzZXQpID8gc3JjUGF0dGVybiA6IC8oLCkvOworCisgICAgICAgICAgLy8gc3BsaXQgc3Jjc2V0IGludG8gdHVwbGUgb2YgdXJpIGFuZCBkZXNjcmlwdG9yIGV4Y2VwdCBmb3IgdGhlIGxhc3QgaXRlbQorICAgICAgICAgIHZhciByYXdVcmlzID0gdHJpbW1lZFNyY3NldC5zcGxpdChwYXR0ZXJuKTsKKworICAgICAgICAgIC8vIGZvciBlYWNoIHR1cGxlcworICAgICAgICAgIHZhciBuYnJVcmlzV2l0aDJwYXJ0cyA9IE1hdGguZmxvb3IocmF3VXJpcy5sZW5ndGggLyAyKTsKKyAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5iclVyaXNXaXRoMnBhcnRzOyBpKyspIHsKKyAgICAgICAgICAgIHZhciBpbm5lcklkeCA9IGkgKiAyOworICAgICAgICAgICAgLy8gc2FuaXRpemUgdGhlIHVyaQorICAgICAgICAgICAgcmVzdWx0ICs9ICQkc2FuaXRpemVVcmkodHJpbShyYXdVcmlzW2lubmVySWR4XSksIHRydWUpOworICAgICAgICAgICAgLy8gYWRkIHRoZSBkZXNjcmlwdG9yCisgICAgICAgICAgICByZXN1bHQgKz0gKCIgIiArIHRyaW0ocmF3VXJpc1tpbm5lcklkeCArIDFdKSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gc3BsaXQgdGhlIGxhc3QgaXRlbSBpbnRvIHVyaSBhbmQgZGVzY3JpcHRvcgorICAgICAgICAgIHZhciBsYXN0VHVwbGUgPSB0cmltKHJhd1VyaXNbaSAqIDJdKS5zcGxpdCgvXHMvKTsKKworICAgICAgICAgIC8vIHNhbml0aXplIHRoZSBsYXN0IHVyaQorICAgICAgICAgIHJlc3VsdCArPSAkJHNhbml0aXplVXJpKHRyaW0obGFzdFR1cGxlWzBdKSwgdHJ1ZSk7CisKKyAgICAgICAgICAvLyBhbmQgYWRkIHRoZSBsYXN0IGRlc2NyaXB0b3IgaWYgYW55CisgICAgICAgICAgaWYgKGxhc3RUdXBsZS5sZW5ndGggPT09IDIpIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAoIiAiICsgdHJpbShsYXN0VHVwbGVbMV0pKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhpc1trZXldID0gdmFsdWUgPSByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAod3JpdGVBdHRyICE9PSBmYWxzZSkgeworICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICB0aGlzLiQkZWxlbWVudC5yZW1vdmVBdHRyKGF0dHJOYW1lKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy4kJGVsZW1lbnQuYXR0cihhdHRyTmFtZSwgdmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpcmUgb2JzZXJ2ZXJzCisgICAgICAgIHZhciAkJG9ic2VydmVycyA9IHRoaXMuJCRvYnNlcnZlcnM7CisgICAgICAgICQkb2JzZXJ2ZXJzICYmIGZvckVhY2goJCRvYnNlcnZlcnNbb2JzZXJ2ZXJdLCBmdW5jdGlvbihmbikgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmbih2YWx1ZSk7CisgICAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0sCisKKworICAgICAgLyoqCisgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkb2JzZXJ2ZQorICAgICAgICogQGtpbmQgZnVuY3Rpb24KKyAgICAgICAqCisgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAqIE9ic2VydmVzIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUuCisgICAgICAgKgorICAgICAgICogVGhlIG9ic2VydmVyIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBvbmNlIGR1cmluZyB0aGUgbmV4dCBgJGRpZ2VzdGAgZm9sbG93aW5nCisgICAgICAgKiBjb21waWxhdGlvbi4gVGhlIG9ic2VydmVyIGlzIHRoZW4gaW52b2tlZCB3aGVuZXZlciB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlCisgICAgICAgKiBjaGFuZ2VzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTm9ybWFsaXplZCBrZXkuIChpZSBuZ0F0dHJpYnV0ZSkgLgorICAgICAgICogQHBhcmFtIHtmdW5jdGlvbihpbnRlcnBvbGF0ZWRWYWx1ZSl9IGZuIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIKKyAgICAgICAgICAgICAgICB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgY2hhbmdlcy4KKyAgICAgICAqICAgICAgICBTZWUgdGhlIHtAbGluayBndWlkZS9kaXJlY3RpdmUjdGV4dC1hbmQtYXR0cmlidXRlLWJpbmRpbmdzIERpcmVjdGl2ZXN9IGd1aWRlIGZvciBtb3JlIGluZm8uCisgICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gUmV0dXJucyBhIGRlcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIG9ic2VydmVyLgorICAgICAgICovCisgICAgICAkb2JzZXJ2ZTogZnVuY3Rpb24oa2V5LCBmbikgeworICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLAorICAgICAgICAgICAgJCRvYnNlcnZlcnMgPSAoYXR0cnMuJCRvYnNlcnZlcnMgfHwgKGF0dHJzLiQkb2JzZXJ2ZXJzID0gY3JlYXRlTWFwKCkpKSwKKyAgICAgICAgICAgIGxpc3RlbmVycyA9ICgkJG9ic2VydmVyc1trZXldIHx8ICgkJG9ic2VydmVyc1trZXldID0gW10pKTsKKworICAgICAgICBsaXN0ZW5lcnMucHVzaChmbik7CisgICAgICAgICRyb290U2NvcGUuJGV2YWxBc3luYyhmdW5jdGlvbigpIHsKKyAgICAgICAgICBpZiAoIWxpc3RlbmVycy4kJGludGVyICYmIGF0dHJzLmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgICAgIC8vIG5vIG9uZSByZWdpc3RlcmVkIGF0dHJpYnV0ZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLCBzbyBsZXRzIGNhbGwgaXQgbWFudWFsbHkKKyAgICAgICAgICAgIGZuKGF0dHJzW2tleV0pOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgICAgIGFycmF5UmVtb3ZlKGxpc3RlbmVycywgZm4pOworICAgICAgICB9OworICAgICAgfQorICAgIH07CisKKworICAgIGZ1bmN0aW9uIHNhZmVBZGRDbGFzcygkZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAgICB0cnkgeworICAgICAgICAkZWxlbWVudC5hZGRDbGFzcyhjbGFzc05hbWUpOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAvLyBpZ25vcmUsIHNpbmNlIGl0IG1lYW5zIHRoYXQgd2UgYXJlIHRyeWluZyB0byBzZXQgY2xhc3Mgb24KKyAgICAgICAgLy8gU1ZHIGVsZW1lbnQsIHdoZXJlIGNsYXNzIG5hbWUgaXMgcmVhZC1vbmx5LgorICAgICAgfQorICAgIH0KKworCisgICAgdmFyIHN0YXJ0U3ltYm9sID0gJGludGVycG9sYXRlLnN0YXJ0U3ltYm9sKCksCisgICAgICAgIGVuZFN5bWJvbCA9ICRpbnRlcnBvbGF0ZS5lbmRTeW1ib2woKSwKKyAgICAgICAgZGVub3JtYWxpemVUZW1wbGF0ZSA9IChzdGFydFN5bWJvbCA9PSAne3snIHx8IGVuZFN5bWJvbCAgPT0gJ319JykKKyAgICAgICAgICAgID8gaWRlbnRpdHkKKyAgICAgICAgICAgIDogZnVuY3Rpb24gZGVub3JtYWxpemVUZW1wbGF0ZSh0ZW1wbGF0ZSkgeworICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvXHtcey9nLCBzdGFydFN5bWJvbCkucmVwbGFjZSgvfX0vZywgZW5kU3ltYm9sKTsKKyAgICAgICAgfSwKKyAgICAgICAgTkdfQVRUUl9CSU5ESU5HID0gL15uZ0F0dHJbQS1aXS87CisKKyAgICBjb21waWxlLiQkYWRkQmluZGluZ0luZm8gPSBkZWJ1Z0luZm9FbmFibGVkID8gZnVuY3Rpb24gJCRhZGRCaW5kaW5nSW5mbygkZWxlbWVudCwgYmluZGluZykgeworICAgICAgdmFyIGJpbmRpbmdzID0gJGVsZW1lbnQuZGF0YSgnJGJpbmRpbmcnKSB8fCBbXTsKKworICAgICAgaWYgKGlzQXJyYXkoYmluZGluZykpIHsKKyAgICAgICAgYmluZGluZ3MgPSBiaW5kaW5ncy5jb25jYXQoYmluZGluZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBiaW5kaW5ncy5wdXNoKGJpbmRpbmcpOworICAgICAgfQorCisgICAgICAkZWxlbWVudC5kYXRhKCckYmluZGluZycsIGJpbmRpbmdzKTsKKyAgICB9IDogbm9vcDsKKworICAgIGNvbXBpbGUuJCRhZGRCaW5kaW5nQ2xhc3MgPSBkZWJ1Z0luZm9FbmFibGVkID8gZnVuY3Rpb24gJCRhZGRCaW5kaW5nQ2xhc3MoJGVsZW1lbnQpIHsKKyAgICAgIHNhZmVBZGRDbGFzcygkZWxlbWVudCwgJ25nLWJpbmRpbmcnKTsKKyAgICB9IDogbm9vcDsKKworICAgIGNvbXBpbGUuJCRhZGRTY29wZUluZm8gPSBkZWJ1Z0luZm9FbmFibGVkID8gZnVuY3Rpb24gJCRhZGRTY29wZUluZm8oJGVsZW1lbnQsIHNjb3BlLCBpc29sYXRlZCwgbm9UZW1wbGF0ZSkgeworICAgICAgdmFyIGRhdGFOYW1lID0gaXNvbGF0ZWQgPyAobm9UZW1wbGF0ZSA/ICckaXNvbGF0ZVNjb3BlTm9UZW1wbGF0ZScgOiAnJGlzb2xhdGVTY29wZScpIDogJyRzY29wZSc7CisgICAgICAkZWxlbWVudC5kYXRhKGRhdGFOYW1lLCBzY29wZSk7CisgICAgfSA6IG5vb3A7CisKKyAgICBjb21waWxlLiQkYWRkU2NvcGVDbGFzcyA9IGRlYnVnSW5mb0VuYWJsZWQgPyBmdW5jdGlvbiAkJGFkZFNjb3BlQ2xhc3MoJGVsZW1lbnQsIGlzb2xhdGVkKSB7CisgICAgICBzYWZlQWRkQ2xhc3MoJGVsZW1lbnQsIGlzb2xhdGVkID8gJ25nLWlzb2xhdGUtc2NvcGUnIDogJ25nLXNjb3BlJyk7CisgICAgfSA6IG5vb3A7CisKKyAgICByZXR1cm4gY29tcGlsZTsKKworICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIGZ1bmN0aW9uIGNvbXBpbGUoJGNvbXBpbGVOb2RlcywgdHJhbnNjbHVkZUZuLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCkgeworICAgICAgaWYgKCEoJGNvbXBpbGVOb2RlcyBpbnN0YW5jZW9mIGpxTGl0ZSkpIHsKKyAgICAgICAgLy8ganF1ZXJ5IGFsd2F5cyByZXdyYXBzLCB3aGVyZWFzIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIG9yaWdpbmFsIHNlbGVjdG9yIHNvIHRoYXQgd2UgY2FuCisgICAgICAgIC8vIG1vZGlmeSBpdC4KKyAgICAgICAgJGNvbXBpbGVOb2RlcyA9IGpxTGl0ZSgkY29tcGlsZU5vZGVzKTsKKyAgICAgIH0KKyAgICAgIC8vIFdlIGNhbiBub3QgY29tcGlsZSB0b3AgbGV2ZWwgdGV4dCBlbGVtZW50cyBzaW5jZSB0ZXh0IG5vZGVzIGNhbiBiZSBtZXJnZWQgYW5kIHdlIHdpbGwKKyAgICAgIC8vIG5vdCBiZSBhYmxlIHRvIGF0dGFjaCBzY29wZSBkYXRhIHRvIHRoZW0sIHNvIHdlIHdpbGwgd3JhcCB0aGVtIGluIDxzcGFuPgorICAgICAgZm9yRWFjaCgkY29tcGlsZU5vZGVzLCBmdW5jdGlvbihub2RlLCBpbmRleCkgeworICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOT0RFX1RZUEVfVEVYVCAmJiBub2RlLm5vZGVWYWx1ZS5tYXRjaCgvXFMrLykgLyogbm9uLWVtcHR5ICovICkgeworICAgICAgICAgICRjb21waWxlTm9kZXNbaW5kZXhdID0ganFMaXRlKG5vZGUpLndyYXAoJzxzcGFuPjwvc3Bhbj4nKS5wYXJlbnQoKVswXTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICB2YXIgY29tcG9zaXRlTGlua0ZuID0KKyAgICAgICAgICAgICAgY29tcGlsZU5vZGVzKCRjb21waWxlTm9kZXMsIHRyYW5zY2x1ZGVGbiwgJGNvbXBpbGVOb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUsIHByZXZpb3VzQ29tcGlsZUNvbnRleHQpOworICAgICAgY29tcGlsZS4kJGFkZFNjb3BlQ2xhc3MoJGNvbXBpbGVOb2Rlcyk7CisgICAgICB2YXIgbmFtZXNwYWNlID0gbnVsbDsKKyAgICAgIHJldHVybiBmdW5jdGlvbiBwdWJsaWNMaW5rRm4oc2NvcGUsIGNsb25lQ29ubmVjdEZuLCBvcHRpb25zKSB7CisgICAgICAgIGFzc2VydEFyZyhzY29wZSwgJ3Njb3BlJyk7CisKKyAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisgICAgICAgIHZhciBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbiA9IG9wdGlvbnMucGFyZW50Qm91bmRUcmFuc2NsdWRlRm4sCisgICAgICAgICAgdHJhbnNjbHVkZUNvbnRyb2xsZXJzID0gb3B0aW9ucy50cmFuc2NsdWRlQ29udHJvbGxlcnMsCisgICAgICAgICAgZnV0dXJlUGFyZW50RWxlbWVudCA9IG9wdGlvbnMuZnV0dXJlUGFyZW50RWxlbWVudDsKKworICAgICAgICAvLyBXaGVuIGBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbmAgaXMgcGFzc2VkLCBpdCBpcyBhCisgICAgICAgIC8vIGBjb250cm9sbGVyc0JvdW5kVHJhbnNjbHVkZWAgZnVuY3Rpb24gKGl0IHdhcyBwcmV2aW91c2x5IHBhc3NlZAorICAgICAgICAvLyBhcyBgdHJhbnNjbHVkZWAgdG8gZGlyZWN0aXZlLmxpbmspIHNvIHdlIG11c3QgdW53cmFwIGl0IHRvIGdldAorICAgICAgICAvLyBpdHMgYGJvdW5kVHJhbnNjbHVkZUZuYAorICAgICAgICBpZiAocGFyZW50Qm91bmRUcmFuc2NsdWRlRm4gJiYgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4uJCRib3VuZFRyYW5zY2x1ZGUpIHsKKyAgICAgICAgICBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbiA9IHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuLiQkYm91bmRUcmFuc2NsdWRlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFuYW1lc3BhY2UpIHsKKyAgICAgICAgICBuYW1lc3BhY2UgPSBkZXRlY3ROYW1lc3BhY2VGb3JDaGlsZEVsZW1lbnRzKGZ1dHVyZVBhcmVudEVsZW1lbnQpOworICAgICAgICB9CisgICAgICAgIHZhciAkbGlua05vZGU7CisgICAgICAgIGlmIChuYW1lc3BhY2UgIT09ICdodG1sJykgeworICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBkaXJlY3RpdmUgd2l0aCByZXBsYWNlOnRydWUgYW5kIHRlbXBsYXRlVXJsIHRoZSAkY29tcGlsZU5vZGVzCisgICAgICAgICAgLy8gKG9yIGEgY2hpbGQgZWxlbWVudCBpbnNpZGUgb2YgdGhlbSkKKyAgICAgICAgICAvLyBtaWdodCBjaGFuZ2UsIHNvIHdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlIG5hbWVzcGFjZSBhZGFwdGVkIGNvbXBpbGVOb2RlcworICAgICAgICAgIC8vIGZvciBjYWxsIHRvIHRoZSBsaW5rIGZ1bmN0aW9uLgorICAgICAgICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBhbHJlYWR5IGNsb25lIHRoZSBub2Rlcy4uLgorICAgICAgICAgICRsaW5rTm9kZSA9IGpxTGl0ZSgKKyAgICAgICAgICAgIHdyYXBUZW1wbGF0ZShuYW1lc3BhY2UsIGpxTGl0ZSgnPGRpdj4nKS5hcHBlbmQoJGNvbXBpbGVOb2RlcykuaHRtbCgpKQorICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSBpZiAoY2xvbmVDb25uZWN0Rm4pIHsKKyAgICAgICAgICAvLyBpbXBvcnRhbnQhITogd2UgbXVzdCBjYWxsIG91ciBqcUxpdGUuY2xvbmUoKSBzaW5jZSB0aGUgalF1ZXJ5IG9uZSBpcyB0cnlpbmcgdG8gYmUgc21hcnQKKyAgICAgICAgICAvLyBhbmQgc29tZXRpbWVzIGNoYW5nZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgRE9NLgorICAgICAgICAgICRsaW5rTm9kZSA9IEpRTGl0ZVByb3RvdHlwZS5jbG9uZS5jYWxsKCRjb21waWxlTm9kZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICRsaW5rTm9kZSA9ICRjb21waWxlTm9kZXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhbnNjbHVkZUNvbnRyb2xsZXJzKSB7CisgICAgICAgICAgZm9yICh2YXIgY29udHJvbGxlck5hbWUgaW4gdHJhbnNjbHVkZUNvbnRyb2xsZXJzKSB7CisgICAgICAgICAgICAkbGlua05vZGUuZGF0YSgnJCcgKyBjb250cm9sbGVyTmFtZSArICdDb250cm9sbGVyJywgdHJhbnNjbHVkZUNvbnRyb2xsZXJzW2NvbnRyb2xsZXJOYW1lXS5pbnN0YW5jZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29tcGlsZS4kJGFkZFNjb3BlSW5mbygkbGlua05vZGUsIHNjb3BlKTsKKworICAgICAgICBpZiAoY2xvbmVDb25uZWN0Rm4pIGNsb25lQ29ubmVjdEZuKCRsaW5rTm9kZSwgc2NvcGUpOworICAgICAgICBpZiAoY29tcG9zaXRlTGlua0ZuKSBjb21wb3NpdGVMaW5rRm4oc2NvcGUsICRsaW5rTm9kZSwgJGxpbmtOb2RlLCBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbik7CisgICAgICAgIHJldHVybiAkbGlua05vZGU7CisgICAgICB9OworICAgIH0KKworICAgIGZ1bmN0aW9uIGRldGVjdE5hbWVzcGFjZUZvckNoaWxkRWxlbWVudHMocGFyZW50RWxlbWVudCkgeworICAgICAgLy8gVE9ETzogTWFrZSB0aGlzIGRldGVjdCBNYXRoTUwgYXMgd2VsbC4uLgorICAgICAgdmFyIG5vZGUgPSBwYXJlbnRFbGVtZW50ICYmIHBhcmVudEVsZW1lbnRbMF07CisgICAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgcmV0dXJuICdodG1sJzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBub2RlTmFtZV8obm9kZSkgIT09ICdmb3JlaWdub2JqZWN0JyAmJiBub2RlLnRvU3RyaW5nKCkubWF0Y2goL1NWRy8pID8gJ3N2ZycgOiAnaHRtbCc7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGlsZSBmdW5jdGlvbiBtYXRjaGVzIGVhY2ggbm9kZSBpbiBub2RlTGlzdCBhZ2FpbnN0IHRoZSBkaXJlY3RpdmVzLiBPbmNlIGFsbCBkaXJlY3RpdmVzCisgICAgICogZm9yIGEgcGFydGljdWxhciBub2RlIGFyZSBjb2xsZWN0ZWQgdGhlaXIgY29tcGlsZSBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkLiBUaGUgY29tcGlsZQorICAgICAqIGZ1bmN0aW9ucyByZXR1cm4gdmFsdWVzIC0gdGhlIGxpbmtpbmcgZnVuY3Rpb25zIC0gYXJlIGNvbWJpbmVkIGludG8gYSBjb21wb3NpdGUgbGlua2luZworICAgICAqIGZ1bmN0aW9uLCB3aGljaCBpcyB0aGUgYSBsaW5raW5nIGZ1bmN0aW9uIGZvciB0aGUgbm9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7Tm9kZUxpc3R9IG5vZGVMaXN0IGFuIGFycmF5IG9mIG5vZGVzIG9yIE5vZGVMaXN0IHRvIGNvbXBpbGUKKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGFuZ3VsYXIuU2NvcGUsIGNsb25lQXR0YWNoRm49KX0gdHJhbnNjbHVkZUZuIEEgbGlua2luZyBmdW5jdGlvbiwgd2hlcmUgdGhlCisgICAgICogICAgICAgIHNjb3BlIGFyZ3VtZW50IGlzIGF1dG8tZ2VuZXJhdGVkIHRvIHRoZSBuZXcgY2hpbGQgb2YgdGhlIHRyYW5zY2x1ZGVkIHBhcmVudCBzY29wZS4KKyAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnQ9fSAkcm9vdEVsZW1lbnQgSWYgdGhlIG5vZGVMaXN0IGlzIHRoZSByb290IG9mIHRoZSBjb21waWxhdGlvbiB0cmVlIHRoZW4KKyAgICAgKiAgICAgICAgdGhlIHJvb3RFbGVtZW50IG11c3QgYmUgc2V0IHRoZSBqcUxpdGUgY29sbGVjdGlvbiBvZiB0aGUgY29tcGlsZSByb290LiBUaGlzIGlzCisgICAgICogICAgICAgIG5lZWRlZCBzbyB0aGF0IHRoZSBqcUxpdGUgY29sbGVjdGlvbiBpdGVtcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCB3aWRnZXRzLgorICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gbWF4UHJpb3JpdHkgTWF4IGRpcmVjdGl2ZSBwcmlvcml0eS4KKyAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgY29tcG9zaXRlIGxpbmtpbmcgZnVuY3Rpb24gb2YgYWxsIG9mIHRoZSBtYXRjaGVkIGRpcmVjdGl2ZXMgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBjb21waWxlTm9kZXMobm9kZUxpc3QsIHRyYW5zY2x1ZGVGbiwgJHJvb3RFbGVtZW50LCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tcGlsZUNvbnRleHQpIHsKKyAgICAgIHZhciBsaW5rRm5zID0gW10sCisgICAgICAgICAgYXR0cnMsIGRpcmVjdGl2ZXMsIG5vZGVMaW5rRm4sIGNoaWxkTm9kZXMsIGNoaWxkTGlua0ZuLCBsaW5rRm5Gb3VuZCwgbm9kZUxpbmtGbkZvdW5kOworCisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVMaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGF0dHJzID0gbmV3IEF0dHJpYnV0ZXMoKTsKKworICAgICAgICAvLyB3ZSBtdXN0IGFsd2F5cyByZWZlciB0byBub2RlTGlzdFtpXSBzaW5jZSB0aGUgbm9kZXMgY2FuIGJlIHJlcGxhY2VkIHVuZGVybmVhdGggdXMuCisgICAgICAgIGRpcmVjdGl2ZXMgPSBjb2xsZWN0RGlyZWN0aXZlcyhub2RlTGlzdFtpXSwgW10sIGF0dHJzLCBpID09PSAwID8gbWF4UHJpb3JpdHkgOiB1bmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlRGlyZWN0aXZlKTsKKworICAgICAgICBub2RlTGlua0ZuID0gKGRpcmVjdGl2ZXMubGVuZ3RoKQorICAgICAgICAgICAgPyBhcHBseURpcmVjdGl2ZXNUb05vZGUoZGlyZWN0aXZlcywgbm9kZUxpc3RbaV0sIGF0dHJzLCB0cmFuc2NsdWRlRm4sICRyb290RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgW10sIFtdLCBwcmV2aW91c0NvbXBpbGVDb250ZXh0KQorICAgICAgICAgICAgOiBudWxsOworCisgICAgICAgIGlmIChub2RlTGlua0ZuICYmIG5vZGVMaW5rRm4uc2NvcGUpIHsKKyAgICAgICAgICBjb21waWxlLiQkYWRkU2NvcGVDbGFzcyhhdHRycy4kJGVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgY2hpbGRMaW5rRm4gPSAobm9kZUxpbmtGbiAmJiBub2RlTGlua0ZuLnRlcm1pbmFsIHx8CisgICAgICAgICAgICAgICAgICAgICAgIShjaGlsZE5vZGVzID0gbm9kZUxpc3RbaV0uY2hpbGROb2RlcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAhY2hpbGROb2Rlcy5sZW5ndGgpCisgICAgICAgICAgICA/IG51bGwKKyAgICAgICAgICAgIDogY29tcGlsZU5vZGVzKGNoaWxkTm9kZXMsCisgICAgICAgICAgICAgICAgIG5vZGVMaW5rRm4gPyAoCisgICAgICAgICAgICAgICAgICAobm9kZUxpbmtGbi50cmFuc2NsdWRlT25UaGlzRWxlbWVudCB8fCAhbm9kZUxpbmtGbi50ZW1wbGF0ZU9uVGhpc0VsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgICAmJiBub2RlTGlua0ZuLnRyYW5zY2x1ZGUpIDogdHJhbnNjbHVkZUZuKTsKKworICAgICAgICBpZiAobm9kZUxpbmtGbiB8fCBjaGlsZExpbmtGbikgeworICAgICAgICAgIGxpbmtGbnMucHVzaChpLCBub2RlTGlua0ZuLCBjaGlsZExpbmtGbik7CisgICAgICAgICAgbGlua0ZuRm91bmQgPSB0cnVlOworICAgICAgICAgIG5vZGVMaW5rRm5Gb3VuZCA9IG5vZGVMaW5rRm5Gb3VuZCB8fCBub2RlTGlua0ZuOworICAgICAgICB9CisKKyAgICAgICAgLy91c2UgdGhlIHByZXZpb3VzIGNvbnRleHQgb25seSBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHZpcnR1YWwgZ3JvdXAKKyAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCA9IG51bGw7CisgICAgICB9CisKKyAgICAgIC8vIHJldHVybiBhIGxpbmtpbmcgZnVuY3Rpb24gaWYgd2UgaGF2ZSBmb3VuZCBhbnl0aGluZywgbnVsbCBvdGhlcndpc2UKKyAgICAgIHJldHVybiBsaW5rRm5Gb3VuZCA/IGNvbXBvc2l0ZUxpbmtGbiA6IG51bGw7CisKKyAgICAgIGZ1bmN0aW9uIGNvbXBvc2l0ZUxpbmtGbihzY29wZSwgbm9kZUxpc3QsICRyb290RWxlbWVudCwgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4pIHsKKyAgICAgICAgdmFyIG5vZGVMaW5rRm4sIGNoaWxkTGlua0ZuLCBub2RlLCBjaGlsZFNjb3BlLCBpLCBpaSwgaWR4LCBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuOworICAgICAgICB2YXIgc3RhYmxlTm9kZUxpc3Q7CisKKworICAgICAgICBpZiAobm9kZUxpbmtGbkZvdW5kKSB7CisgICAgICAgICAgLy8gY29weSBub2RlTGlzdCBzbyB0aGF0IGlmIGEgbm9kZUxpbmtGbiByZW1vdmVzIG9yIGFkZHMgYW4gZWxlbWVudCBhdCB0aGlzIERPTSBsZXZlbCBvdXIKKyAgICAgICAgICAvLyBvZmZzZXRzIGRvbid0IGdldCBzY3Jld2VkIHVwCisgICAgICAgICAgdmFyIG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QubGVuZ3RoOworICAgICAgICAgIHN0YWJsZU5vZGVMaXN0ID0gbmV3IEFycmF5KG5vZGVMaXN0TGVuZ3RoKTsKKworICAgICAgICAgIC8vIGNyZWF0ZSBhIHNwYXJzZSBhcnJheSBieSBvbmx5IGNvcHlpbmcgdGhlIGVsZW1lbnRzIHdoaWNoIGhhdmUgYSBsaW5rRm4KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGlua0Zucy5sZW5ndGg7IGkrPTMpIHsKKyAgICAgICAgICAgIGlkeCA9IGxpbmtGbnNbaV07CisgICAgICAgICAgICBzdGFibGVOb2RlTGlzdFtpZHhdID0gbm9kZUxpc3RbaWR4XTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhYmxlTm9kZUxpc3QgPSBub2RlTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gbGlua0Zucy5sZW5ndGg7IGkgPCBpaTspIHsKKyAgICAgICAgICBub2RlID0gc3RhYmxlTm9kZUxpc3RbbGlua0Zuc1tpKytdXTsKKyAgICAgICAgICBub2RlTGlua0ZuID0gbGlua0Zuc1tpKytdOworICAgICAgICAgIGNoaWxkTGlua0ZuID0gbGlua0Zuc1tpKytdOworCisgICAgICAgICAgaWYgKG5vZGVMaW5rRm4pIHsKKyAgICAgICAgICAgIGlmIChub2RlTGlua0ZuLnNjb3BlKSB7CisgICAgICAgICAgICAgIGNoaWxkU2NvcGUgPSBzY29wZS4kbmV3KCk7CisgICAgICAgICAgICAgIGNvbXBpbGUuJCRhZGRTY29wZUluZm8oanFMaXRlKG5vZGUpLCBjaGlsZFNjb3BlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNoaWxkU2NvcGUgPSBzY29wZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5vZGVMaW5rRm4udHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQpIHsKKyAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IGNyZWF0ZUJvdW5kVHJhbnNjbHVkZUZuKAorICAgICAgICAgICAgICAgICAgc2NvcGUsIG5vZGVMaW5rRm4udHJhbnNjbHVkZSwgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4sCisgICAgICAgICAgICAgICAgICBub2RlTGlua0ZuLmVsZW1lbnRUcmFuc2NsdWRlT25UaGlzRWxlbWVudCk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5vZGVMaW5rRm4udGVtcGxhdGVPblRoaXNFbGVtZW50ICYmIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuKSB7CisgICAgICAgICAgICAgIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4gPSBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbjsKKworICAgICAgICAgICAgfSBlbHNlIGlmICghcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4gJiYgdHJhbnNjbHVkZUZuKSB7CisgICAgICAgICAgICAgIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4gPSBjcmVhdGVCb3VuZFRyYW5zY2x1ZGVGbihzY29wZSwgdHJhbnNjbHVkZUZuKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vZGVMaW5rRm4oY2hpbGRMaW5rRm4sIGNoaWxkU2NvcGUsIG5vZGUsICRyb290RWxlbWVudCwgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbik7CisKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkTGlua0ZuKSB7CisgICAgICAgICAgICBjaGlsZExpbmtGbihzY29wZSwgbm9kZS5jaGlsZE5vZGVzLCB1bmRlZmluZWQsIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBjcmVhdGVCb3VuZFRyYW5zY2x1ZGVGbihzY29wZSwgdHJhbnNjbHVkZUZuLCBwcmV2aW91c0JvdW5kVHJhbnNjbHVkZUZuLCBlbGVtZW50VHJhbnNjbHVzaW9uKSB7CisKKyAgICAgIHZhciBib3VuZFRyYW5zY2x1ZGVGbiA9IGZ1bmN0aW9uKHRyYW5zY2x1ZGVkU2NvcGUsIGNsb25lRm4sIGNvbnRyb2xsZXJzLCBmdXR1cmVQYXJlbnRFbGVtZW50LCBjb250YWluaW5nU2NvcGUpIHsKKworICAgICAgICBpZiAoIXRyYW5zY2x1ZGVkU2NvcGUpIHsKKyAgICAgICAgICB0cmFuc2NsdWRlZFNjb3BlID0gc2NvcGUuJG5ldyhmYWxzZSwgY29udGFpbmluZ1Njb3BlKTsKKyAgICAgICAgICB0cmFuc2NsdWRlZFNjb3BlLiQkdHJhbnNjbHVkZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRyYW5zY2x1ZGVGbih0cmFuc2NsdWRlZFNjb3BlLCBjbG9uZUZuLCB7CisgICAgICAgICAgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm46IHByZXZpb3VzQm91bmRUcmFuc2NsdWRlRm4sCisgICAgICAgICAgdHJhbnNjbHVkZUNvbnRyb2xsZXJzOiBjb250cm9sbGVycywKKyAgICAgICAgICBmdXR1cmVQYXJlbnRFbGVtZW50OiBmdXR1cmVQYXJlbnRFbGVtZW50CisgICAgICAgIH0pOworICAgICAgfTsKKworICAgICAgcmV0dXJuIGJvdW5kVHJhbnNjbHVkZUZuOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvb2tzIGZvciBkaXJlY3RpdmVzIG9uIHRoZSBnaXZlbiBub2RlIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGRpcmVjdGl2ZSBjb2xsZWN0aW9uIHdoaWNoIGlzCisgICAgICogc29ydGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5vZGUgTm9kZSB0byBzZWFyY2guCisgICAgICogQHBhcmFtIGRpcmVjdGl2ZXMgQW4gYXJyYXkgdG8gd2hpY2ggdGhlIGRpcmVjdGl2ZXMgYXJlIGFkZGVkIHRvLiBUaGlzIGFycmF5IGlzIHNvcnRlZCBiZWZvcmUKKyAgICAgKiAgICAgICAgdGhlIGZ1bmN0aW9uIHJldHVybnMuCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBzaGFyZWQgYXR0cnMgb2JqZWN0IHdoaWNoIGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIG5vcm1hbGl6ZWQgYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0ge251bWJlcj19IG1heFByaW9yaXR5IE1heCBkaXJlY3RpdmUgcHJpb3JpdHkuCisgICAgICovCisgICAgZnVuY3Rpb24gY29sbGVjdERpcmVjdGl2ZXMobm9kZSwgZGlyZWN0aXZlcywgYXR0cnMsIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUpIHsKKyAgICAgIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGUsCisgICAgICAgICAgYXR0cnNNYXAgPSBhdHRycy4kYXR0ciwKKyAgICAgICAgICBtYXRjaCwKKyAgICAgICAgICBjbGFzc05hbWU7CisKKyAgICAgIHN3aXRjaCAobm9kZVR5cGUpIHsKKyAgICAgICAgY2FzZSBOT0RFX1RZUEVfRUxFTUVOVDogLyogRWxlbWVudCAqLworICAgICAgICAgIC8vIHVzZSB0aGUgbm9kZSBuYW1lOiA8ZGlyZWN0aXZlPgorICAgICAgICAgIGFkZERpcmVjdGl2ZShkaXJlY3RpdmVzLAorICAgICAgICAgICAgICBkaXJlY3RpdmVOb3JtYWxpemUobm9kZU5hbWVfKG5vZGUpKSwgJ0UnLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlKTsKKworICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgYXR0cmlidXRlcworICAgICAgICAgIGZvciAodmFyIGF0dHIsIG5hbWUsIG5OYW1lLCBuZ0F0dHJOYW1lLCB2YWx1ZSwgaXNOZ0F0dHIsIG5BdHRycyA9IG5vZGUuYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICBqID0gMCwgamogPSBuQXR0cnMgJiYgbkF0dHJzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKKyAgICAgICAgICAgIHZhciBhdHRyU3RhcnROYW1lID0gZmFsc2U7CisgICAgICAgICAgICB2YXIgYXR0ckVuZE5hbWUgPSBmYWxzZTsKKworICAgICAgICAgICAgYXR0ciA9IG5BdHRyc1tqXTsKKyAgICAgICAgICAgIG5hbWUgPSBhdHRyLm5hbWU7CisgICAgICAgICAgICB2YWx1ZSA9IHRyaW0oYXR0ci52YWx1ZSk7CisKKyAgICAgICAgICAgIC8vIHN1cHBvcnQgbmdBdHRyIGF0dHJpYnV0ZSBiaW5kaW5nCisgICAgICAgICAgICBuZ0F0dHJOYW1lID0gZGlyZWN0aXZlTm9ybWFsaXplKG5hbWUpOworICAgICAgICAgICAgaWYgKGlzTmdBdHRyID0gTkdfQVRUUl9CSU5ESU5HLnRlc3QobmdBdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShQUkVGSVhfUkVHRVhQLCAnJykKKyAgICAgICAgICAgICAgICAuc3Vic3RyKDgpLnJlcGxhY2UoL18oLikvZywgZnVuY3Rpb24obWF0Y2gsIGxldHRlcikgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZGlyZWN0aXZlTk5hbWUgPSBuZ0F0dHJOYW1lLnJlcGxhY2UoLyhTdGFydHxFbmQpJC8sICcnKTsKKyAgICAgICAgICAgIGlmIChkaXJlY3RpdmVJc011bHRpRWxlbWVudChkaXJlY3RpdmVOTmFtZSkpIHsKKyAgICAgICAgICAgICAgaWYgKG5nQXR0ck5hbWUgPT09IGRpcmVjdGl2ZU5OYW1lICsgJ1N0YXJ0JykgeworICAgICAgICAgICAgICAgIGF0dHJTdGFydE5hbWUgPSBuYW1lOworICAgICAgICAgICAgICAgIGF0dHJFbmROYW1lID0gbmFtZS5zdWJzdHIoMCwgbmFtZS5sZW5ndGggLSA1KSArICdlbmQnOworICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigwLCBuYW1lLmxlbmd0aCAtIDYpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5OYW1lID0gZGlyZWN0aXZlTm9ybWFsaXplKG5hbWUudG9Mb3dlckNhc2UoKSk7CisgICAgICAgICAgICBhdHRyc01hcFtuTmFtZV0gPSBuYW1lOworICAgICAgICAgICAgaWYgKGlzTmdBdHRyIHx8ICFhdHRycy5oYXNPd25Qcm9wZXJ0eShuTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBhdHRyc1tuTmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0Qm9vbGVhbkF0dHJOYW1lKG5vZGUsIG5OYW1lKSkgeworICAgICAgICAgICAgICAgICAgYXR0cnNbbk5hbWVdID0gdHJ1ZTsgLy8gcHJlc2VuY2UgbWVhbnMgdHJ1ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZEF0dHJJbnRlcnBvbGF0ZURpcmVjdGl2ZShub2RlLCBkaXJlY3RpdmVzLCB2YWx1ZSwgbk5hbWUsIGlzTmdBdHRyKTsKKyAgICAgICAgICAgIGFkZERpcmVjdGl2ZShkaXJlY3RpdmVzLCBuTmFtZSwgJ0EnLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLCBhdHRyU3RhcnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyRW5kTmFtZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gdXNlIGNsYXNzIGFzIGRpcmVjdGl2ZQorICAgICAgICAgIGNsYXNzTmFtZSA9IG5vZGUuY2xhc3NOYW1lOworICAgICAgICAgIGlmIChpc1N0cmluZyhjbGFzc05hbWUpICYmIGNsYXNzTmFtZSAhPT0gJycpIHsKKyAgICAgICAgICAgIHdoaWxlIChtYXRjaCA9IENMQVNTX0RJUkVDVElWRV9SRUdFWFAuZXhlYyhjbGFzc05hbWUpKSB7CisgICAgICAgICAgICAgIG5OYW1lID0gZGlyZWN0aXZlTm9ybWFsaXplKG1hdGNoWzJdKTsKKyAgICAgICAgICAgICAgaWYgKGFkZERpcmVjdGl2ZShkaXJlY3RpdmVzLCBuTmFtZSwgJ0MnLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlKSkgeworICAgICAgICAgICAgICAgIGF0dHJzW25OYW1lXSA9IHRyaW0obWF0Y2hbM10pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHIobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOT0RFX1RZUEVfVEVYVDogLyogVGV4dCBOb2RlICovCisgICAgICAgICAgYWRkVGV4dEludGVycG9sYXRlRGlyZWN0aXZlKGRpcmVjdGl2ZXMsIG5vZGUubm9kZVZhbHVlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOT0RFX1RZUEVfQ09NTUVOVDogLyogQ29tbWVudCAqLworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYXRjaCA9IENPTU1FTlRfRElSRUNUSVZFX1JFR0VYUC5leGVjKG5vZGUubm9kZVZhbHVlKTsKKyAgICAgICAgICAgIGlmIChtYXRjaCkgeworICAgICAgICAgICAgICBuTmFtZSA9IGRpcmVjdGl2ZU5vcm1hbGl6ZShtYXRjaFsxXSk7CisgICAgICAgICAgICAgIGlmIChhZGREaXJlY3RpdmUoZGlyZWN0aXZlcywgbk5hbWUsICdNJywgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSkpIHsKKyAgICAgICAgICAgICAgICBhdHRyc1tuTmFtZV0gPSB0cmltKG1hdGNoWzJdKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIC8vIHR1cm5zIG91dCB0aGF0IHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcyBJRTkgdGhyb3dzIGVycm9ycyB3aGVuIG9uZSBhdHRlbXB0cyB0byByZWFkCisgICAgICAgICAgICAvLyBjb21tZW50J3Mgbm9kZSB2YWx1ZS4KKyAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIGl0IGFuZCBjb250aW51ZS4gKENhbid0IHNlZW0gdG8gcmVwcm9kdWNlIGluIHRlc3QgY2FzZS4pCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkaXJlY3RpdmVzLnNvcnQoYnlQcmlvcml0eSk7CisgICAgICByZXR1cm4gZGlyZWN0aXZlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIG5vZGUgd2l0aCBhbiBkaXJlY3RpdmUtc3RhcnQgaXQgY29sbGVjdHMgYWxsIG9mIHRoZSBzaWJsaW5ncyB1bnRpbCBpdCBmaW5kcworICAgICAqIGRpcmVjdGl2ZS1lbmQuCisgICAgICogQHBhcmFtIG5vZGUKKyAgICAgKiBAcGFyYW0gYXR0clN0YXJ0CisgICAgICogQHBhcmFtIGF0dHJFbmQKKyAgICAgKiBAcmV0dXJucyB7Kn0KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBncm91cFNjYW4obm9kZSwgYXR0clN0YXJ0LCBhdHRyRW5kKSB7CisgICAgICB2YXIgbm9kZXMgPSBbXTsKKyAgICAgIHZhciBkZXB0aCA9IDA7CisgICAgICBpZiAoYXR0clN0YXJ0ICYmIG5vZGUuaGFzQXR0cmlidXRlICYmIG5vZGUuaGFzQXR0cmlidXRlKGF0dHJTdGFydCkpIHsKKyAgICAgICAgZG8geworICAgICAgICAgIGlmICghbm9kZSkgeworICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ3V0ZXJkaXInLAorICAgICAgICAgICAgICAgICAgICAgICJVbnRlcm1pbmF0ZWQgYXR0cmlidXRlLCBmb3VuZCAnezB9JyBidXQgbm8gbWF0Y2hpbmcgJ3sxfScgZm91bmQuIiwKKyAgICAgICAgICAgICAgICAgICAgICBhdHRyU3RhcnQsIGF0dHJFbmQpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOT0RFX1RZUEVfRUxFTUVOVCkgeworICAgICAgICAgICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJTdGFydCkpIGRlcHRoKys7CisgICAgICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0ckVuZCkpIGRlcHRoLS07CisgICAgICAgICAgfQorICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSk7CisgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CisgICAgICAgIH0gd2hpbGUgKGRlcHRoID4gMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBub2Rlcy5wdXNoKG5vZGUpOworICAgICAgfQorCisgICAgICByZXR1cm4ganFMaXRlKG5vZGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVyIGZvciBsaW5raW5nIGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIG5vcm1hbCBsaW5raW5nIGZ1bmN0aW9uIGludG8gYSBncm91cGVkCisgICAgICogbGlua2luZyBmdW5jdGlvbi4KKyAgICAgKiBAcGFyYW0gbGlua0ZuCisgICAgICogQHBhcmFtIGF0dHJTdGFydAorICAgICAqIEBwYXJhbSBhdHRyRW5kCisgICAgICogQHJldHVybnMge0Z1bmN0aW9ufQorICAgICAqLworICAgIGZ1bmN0aW9uIGdyb3VwRWxlbWVudHNMaW5rRm5XcmFwcGVyKGxpbmtGbiwgYXR0clN0YXJ0LCBhdHRyRW5kKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBjb250cm9sbGVycywgdHJhbnNjbHVkZUZuKSB7CisgICAgICAgIGVsZW1lbnQgPSBncm91cFNjYW4oZWxlbWVudFswXSwgYXR0clN0YXJ0LCBhdHRyRW5kKTsKKyAgICAgICAgcmV0dXJuIGxpbmtGbihzY29wZSwgZWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXJzLCB0cmFuc2NsdWRlRm4pOworICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmNlIHRoZSBkaXJlY3RpdmVzIGhhdmUgYmVlbiBjb2xsZWN0ZWQsIHRoZWlyIGNvbXBpbGUgZnVuY3Rpb25zIGFyZSBleGVjdXRlZC4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyByZXNwb25zaWJsZSBmb3IgaW5saW5pbmcgZGlyZWN0aXZlIHRlbXBsYXRlcyBhcyB3ZWxsIGFzIHRlcm1pbmF0aW5nIHRoZSBhcHBsaWNhdGlvbgorICAgICAqIG9mIHRoZSBkaXJlY3RpdmVzIGlmIHRoZSB0ZXJtaW5hbCBkaXJlY3RpdmUgaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7QXJyYXl9IGRpcmVjdGl2ZXMgQXJyYXkgb2YgY29sbGVjdGVkIGRpcmVjdGl2ZXMgdG8gZXhlY3V0ZSB0aGVpciBjb21waWxlIGZ1bmN0aW9uLgorICAgICAqICAgICAgICB0aGlzIG5lZWRzIHRvIGJlIHByZS1zb3J0ZWQgYnkgcHJpb3JpdHkgb3JkZXIuCisgICAgICogQHBhcmFtIHtOb2RlfSBjb21waWxlTm9kZSBUaGUgcmF3IERPTSBub2RlIHRvIGFwcGx5IHRoZSBjb21waWxlIGZ1bmN0aW9ucyB0bworICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0ZW1wbGF0ZUF0dHJzIFRoZSBzaGFyZWQgYXR0cmlidXRlIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIHtmdW5jdGlvbihhbmd1bGFyLlNjb3BlLCBjbG9uZUF0dGFjaEZuPSl9IHRyYW5zY2x1ZGVGbiBBIGxpbmtpbmcgZnVuY3Rpb24sIHdoZXJlIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZSBhcmd1bWVudCBpcyBhdXRvLWdlbmVyYXRlZCB0byB0aGUgbmV3CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkIG9mIHRoZSB0cmFuc2NsdWRlZCBwYXJlbnQgc2NvcGUuCisgICAgICogQHBhcmFtIHtKUUxpdGV9IGpxQ29sbGVjdGlvbiBJZiB3ZSBhcmUgd29ya2luZyBvbiB0aGUgcm9vdCBvZiB0aGUgY29tcGlsZSB0cmVlIHRoZW4gdGhpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQgaGFzIHRoZSByb290IGpxTGl0ZSBhcnJheSBzbyB0aGF0IHdlIGNhbiByZXBsYWNlIG5vZGVzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBpdC4KKyAgICAgKiBAcGFyYW0ge09iamVjdD19IG9yaWdpbmFsUmVwbGFjZURpcmVjdGl2ZSBBbiBvcHRpb25hbCBkaXJlY3RpdmUgdGhhdCB3aWxsIGJlIGlnbm9yZWQgd2hlbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGluZyB0aGUgdHJhbnNjbHVzaW9uLgorICAgICAqIEBwYXJhbSB7QXJyYXkuPEZ1bmN0aW9uPn0gcHJlTGlua0ZucworICAgICAqIEBwYXJhbSB7QXJyYXkuPEZ1bmN0aW9uPn0gcG9zdExpbmtGbnMKKyAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJldmlvdXNDb21waWxlQ29udGV4dCBDb250ZXh0IHVzZWQgZm9yIHByZXZpb3VzIGNvbXBpbGF0aW9uIG9mIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZQorICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gbGlua0ZuCisgICAgICovCisgICAgZnVuY3Rpb24gYXBwbHlEaXJlY3RpdmVzVG9Ob2RlKGRpcmVjdGl2ZXMsIGNvbXBpbGVOb2RlLCB0ZW1wbGF0ZUF0dHJzLCB0cmFuc2NsdWRlRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxQ29sbGVjdGlvbiwgb3JpZ2luYWxSZXBsYWNlRGlyZWN0aXZlLCBwcmVMaW5rRm5zLCBwb3N0TGlua0ZucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCkgeworICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCA9IHByZXZpb3VzQ29tcGlsZUNvbnRleHQgfHwge307CisKKyAgICAgIHZhciB0ZXJtaW5hbFByaW9yaXR5ID0gLU51bWJlci5NQVhfVkFMVUUsCisgICAgICAgICAgbmV3U2NvcGVEaXJlY3RpdmUsCisgICAgICAgICAgY29udHJvbGxlckRpcmVjdGl2ZXMgPSBwcmV2aW91c0NvbXBpbGVDb250ZXh0LmNvbnRyb2xsZXJEaXJlY3RpdmVzLAorICAgICAgICAgIGNvbnRyb2xsZXJzLAorICAgICAgICAgIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSA9IHByZXZpb3VzQ29tcGlsZUNvbnRleHQubmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLAorICAgICAgICAgIHRlbXBsYXRlRGlyZWN0aXZlID0gcHJldmlvdXNDb21waWxlQ29udGV4dC50ZW1wbGF0ZURpcmVjdGl2ZSwKKyAgICAgICAgICBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlID0gcHJldmlvdXNDb21waWxlQ29udGV4dC5ub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlLAorICAgICAgICAgIGhhc1RyYW5zY2x1ZGVEaXJlY3RpdmUgPSBmYWxzZSwKKyAgICAgICAgICBoYXNUZW1wbGF0ZSA9IGZhbHNlLAorICAgICAgICAgIGhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlID0gcHJldmlvdXNDb21waWxlQ29udGV4dC5oYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSwKKyAgICAgICAgICAkY29tcGlsZU5vZGUgPSB0ZW1wbGF0ZUF0dHJzLiQkZWxlbWVudCA9IGpxTGl0ZShjb21waWxlTm9kZSksCisgICAgICAgICAgZGlyZWN0aXZlLAorICAgICAgICAgIGRpcmVjdGl2ZU5hbWUsCisgICAgICAgICAgJHRlbXBsYXRlLAorICAgICAgICAgIHJlcGxhY2VEaXJlY3RpdmUgPSBvcmlnaW5hbFJlcGxhY2VEaXJlY3RpdmUsCisgICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4gPSB0cmFuc2NsdWRlRm4sCisgICAgICAgICAgbGlua0ZuLAorICAgICAgICAgIGRpcmVjdGl2ZVZhbHVlOworCisgICAgICAvLyBleGVjdXRlcyBhbGwgZGlyZWN0aXZlcyBvbiB0aGUgY3VycmVudCBlbGVtZW50CisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBkaXJlY3RpdmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgZGlyZWN0aXZlID0gZGlyZWN0aXZlc1tpXTsKKyAgICAgICAgdmFyIGF0dHJTdGFydCA9IGRpcmVjdGl2ZS4kJHN0YXJ0OworICAgICAgICB2YXIgYXR0ckVuZCA9IGRpcmVjdGl2ZS4kJGVuZDsKKworICAgICAgICAvLyBjb2xsZWN0IG11bHRpYmxvY2sgc2VjdGlvbnMKKyAgICAgICAgaWYgKGF0dHJTdGFydCkgeworICAgICAgICAgICRjb21waWxlTm9kZSA9IGdyb3VwU2Nhbihjb21waWxlTm9kZSwgYXR0clN0YXJ0LCBhdHRyRW5kKTsKKyAgICAgICAgfQorICAgICAgICAkdGVtcGxhdGUgPSB1bmRlZmluZWQ7CisKKyAgICAgICAgaWYgKHRlcm1pbmFsUHJpb3JpdHkgPiBkaXJlY3RpdmUucHJpb3JpdHkpIHsKKyAgICAgICAgICBicmVhazsgLy8gcHJldmVudCBmdXJ0aGVyIHByb2Nlc3Npbmcgb2YgZGlyZWN0aXZlcworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpcmVjdGl2ZVZhbHVlID0gZGlyZWN0aXZlLnNjb3BlKSB7CisKKyAgICAgICAgICAvLyBza2lwIHRoZSBjaGVjayBmb3IgZGlyZWN0aXZlcyB3aXRoIGFzeW5jIHRlbXBsYXRlcywgd2UnbGwgY2hlY2sgdGhlIGRlcml2ZWQgc3luYworICAgICAgICAgIC8vIGRpcmVjdGl2ZSB3aGVuIHRoZSB0ZW1wbGF0ZSBhcnJpdmVzCisgICAgICAgICAgaWYgKCFkaXJlY3RpdmUudGVtcGxhdGVVcmwpIHsKKyAgICAgICAgICAgIGlmIChpc09iamVjdChkaXJlY3RpdmVWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgLy8gVGhpcyBkaXJlY3RpdmUgaXMgdHJ5aW5nIHRvIGFkZCBhbiBpc29sYXRlZCBzY29wZS4KKyAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBubyBzY29wZSBvZiBhbnkga2luZCBhbHJlYWR5CisgICAgICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlKCduZXcvaXNvbGF0ZWQgc2NvcGUnLCBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgfHwgbmV3U2NvcGVEaXJlY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZSwgJGNvbXBpbGVOb2RlKTsKKyAgICAgICAgICAgICAgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlID0gZGlyZWN0aXZlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLy8gVGhpcyBkaXJlY3RpdmUgaXMgdHJ5aW5nIHRvIGFkZCBhIGNoaWxkIHNjb3BlLgorICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGlzIG5vIGlzb2xhdGVkIHNjb3BlIGFscmVhZHkKKyAgICAgICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGUoJ25ldy9pc29sYXRlZCBzY29wZScsIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSwgZGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tcGlsZU5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIG5ld1Njb3BlRGlyZWN0aXZlID0gbmV3U2NvcGVEaXJlY3RpdmUgfHwgZGlyZWN0aXZlOworICAgICAgICB9CisKKyAgICAgICAgZGlyZWN0aXZlTmFtZSA9IGRpcmVjdGl2ZS5uYW1lOworCisgICAgICAgIGlmICghZGlyZWN0aXZlLnRlbXBsYXRlVXJsICYmIGRpcmVjdGl2ZS5jb250cm9sbGVyKSB7CisgICAgICAgICAgZGlyZWN0aXZlVmFsdWUgPSBkaXJlY3RpdmUuY29udHJvbGxlcjsKKyAgICAgICAgICBjb250cm9sbGVyRGlyZWN0aXZlcyA9IGNvbnRyb2xsZXJEaXJlY3RpdmVzIHx8IHt9OworICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlKCInIiArIGRpcmVjdGl2ZU5hbWUgKyAiJyBjb250cm9sbGVyIiwKKyAgICAgICAgICAgICAgY29udHJvbGxlckRpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0sIGRpcmVjdGl2ZSwgJGNvbXBpbGVOb2RlKTsKKyAgICAgICAgICBjb250cm9sbGVyRGlyZWN0aXZlc1tkaXJlY3RpdmVOYW1lXSA9IGRpcmVjdGl2ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaXJlY3RpdmVWYWx1ZSA9IGRpcmVjdGl2ZS50cmFuc2NsdWRlKSB7CisgICAgICAgICAgaGFzVHJhbnNjbHVkZURpcmVjdGl2ZSA9IHRydWU7CisKKyAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgbmdJZiBhbmQgbmdSZXBlYXQgc28gdGhhdCB3ZSBkb24ndCBjb21wbGFpbiBhYm91dCBkdXBsaWNhdGUgdHJhbnNjbHVzaW9uLgorICAgICAgICAgIC8vIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgZGlyZWN0aXZlcyB0aGF0IGtub3cgaG93IHRvIHNhZmVseSBoYW5kbGUgZWxlbWVudCB0cmFuc2NsdXNpb24sCisgICAgICAgICAgLy8gd2hlcmUgdGhlIHRyYW5zY2x1ZGVkIG5vZGVzIGFyZSBhZGRlZCBvciByZXBsYWNlZCBhZnRlciBsaW5raW5nLgorICAgICAgICAgIGlmICghZGlyZWN0aXZlLiQkdGxiKSB7CisgICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZSgndHJhbnNjbHVzaW9uJywgbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZSwgZGlyZWN0aXZlLCAkY29tcGlsZU5vZGUpOworICAgICAgICAgICAgbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZSA9IGRpcmVjdGl2ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZGlyZWN0aXZlVmFsdWUgPT0gJ2VsZW1lbnQnKSB7CisgICAgICAgICAgICBoYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSA9IHRydWU7CisgICAgICAgICAgICB0ZXJtaW5hbFByaW9yaXR5ID0gZGlyZWN0aXZlLnByaW9yaXR5OworICAgICAgICAgICAgJHRlbXBsYXRlID0gJGNvbXBpbGVOb2RlOworICAgICAgICAgICAgJGNvbXBpbGVOb2RlID0gdGVtcGxhdGVBdHRycy4kJGVsZW1lbnQgPQorICAgICAgICAgICAgICAgIGpxTGl0ZShkb2N1bWVudC5jcmVhdGVDb21tZW50KCcgJyArIGRpcmVjdGl2ZU5hbWUgKyAnOiAnICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUF0dHJzW2RpcmVjdGl2ZU5hbWVdICsgJyAnKSk7CisgICAgICAgICAgICBjb21waWxlTm9kZSA9ICRjb21waWxlTm9kZVswXTsKKyAgICAgICAgICAgIHJlcGxhY2VXaXRoKGpxQ29sbGVjdGlvbiwgc2xpY2VBcmdzKCR0ZW1wbGF0ZSksIGNvbXBpbGVOb2RlKTsKKworICAgICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4gPSBjb21waWxlKCR0ZW1wbGF0ZSwgdHJhbnNjbHVkZUZuLCB0ZXJtaW5hbFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VEaXJlY3RpdmUgJiYgcmVwbGFjZURpcmVjdGl2ZS5uYW1lLCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBwYXNzIGluOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBjb250cm9sbGVyRGlyZWN0aXZlcyAtIG90aGVyd2lzZSB3ZSdsbCBjcmVhdGUgZHVwbGljYXRlcyBjb250cm9sbGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgb3IgdGVtcGxhdGVEaXJlY3RpdmUgLSBjb21iaW5pbmcgdGVtcGxhdGVzIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZWxlbWVudCB0cmFuc2NsdXNpb24gZG9lc24ndCBtYWtlIHNlbnNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgb25seSBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlIHNvIHRoYXQgd2UgcHJldmVudCBwdXR0aW5nIHRyYW5zY2x1c2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gdGhlIHNhbWUgZWxlbWVudCBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmU6IG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRlbXBsYXRlID0ganFMaXRlKGpxTGl0ZUNsb25lKGNvbXBpbGVOb2RlKSkuY29udGVudHMoKTsKKyAgICAgICAgICAgICRjb21waWxlTm9kZS5lbXB0eSgpOyAvLyBjbGVhciBjb250ZW50cworICAgICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4gPSBjb21waWxlKCR0ZW1wbGF0ZSwgdHJhbnNjbHVkZUZuKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGlyZWN0aXZlLnRlbXBsYXRlKSB7CisgICAgICAgICAgaGFzVGVtcGxhdGUgPSB0cnVlOworICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlKCd0ZW1wbGF0ZScsIHRlbXBsYXRlRGlyZWN0aXZlLCBkaXJlY3RpdmUsICRjb21waWxlTm9kZSk7CisgICAgICAgICAgdGVtcGxhdGVEaXJlY3RpdmUgPSBkaXJlY3RpdmU7CisKKyAgICAgICAgICBkaXJlY3RpdmVWYWx1ZSA9IChpc0Z1bmN0aW9uKGRpcmVjdGl2ZS50ZW1wbGF0ZSkpCisgICAgICAgICAgICAgID8gZGlyZWN0aXZlLnRlbXBsYXRlKCRjb21waWxlTm9kZSwgdGVtcGxhdGVBdHRycykKKyAgICAgICAgICAgICAgOiBkaXJlY3RpdmUudGVtcGxhdGU7CisKKyAgICAgICAgICBkaXJlY3RpdmVWYWx1ZSA9IGRlbm9ybWFsaXplVGVtcGxhdGUoZGlyZWN0aXZlVmFsdWUpOworCisgICAgICAgICAgaWYgKGRpcmVjdGl2ZS5yZXBsYWNlKSB7CisgICAgICAgICAgICByZXBsYWNlRGlyZWN0aXZlID0gZGlyZWN0aXZlOworICAgICAgICAgICAgaWYgKGpxTGl0ZUlzVGV4dE5vZGUoZGlyZWN0aXZlVmFsdWUpKSB7CisgICAgICAgICAgICAgICR0ZW1wbGF0ZSA9IFtdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgJHRlbXBsYXRlID0gcmVtb3ZlQ29tbWVudHMod3JhcFRlbXBsYXRlKGRpcmVjdGl2ZS50ZW1wbGF0ZU5hbWVzcGFjZSwgdHJpbShkaXJlY3RpdmVWYWx1ZSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXBpbGVOb2RlID0gJHRlbXBsYXRlWzBdOworCisgICAgICAgICAgICBpZiAoJHRlbXBsYXRlLmxlbmd0aCAhPSAxIHx8IGNvbXBpbGVOb2RlLm5vZGVUeXBlICE9PSBOT0RFX1RZUEVfRUxFTUVOVCkgeworICAgICAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycigndHBscnQnLAorICAgICAgICAgICAgICAgICAgIlRlbXBsYXRlIGZvciBkaXJlY3RpdmUgJ3swfScgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gezF9IiwKKyAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZU5hbWUsICcnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVwbGFjZVdpdGgoanFDb2xsZWN0aW9uLCAkY29tcGlsZU5vZGUsIGNvbXBpbGVOb2RlKTsKKworICAgICAgICAgICAgdmFyIG5ld1RlbXBsYXRlQXR0cnMgPSB7JGF0dHI6IHt9fTsKKworICAgICAgICAgICAgLy8gY29tYmluZSBkaXJlY3RpdmVzIGZyb20gdGhlIG9yaWdpbmFsIG5vZGUgYW5kIGZyb20gdGhlIHRlbXBsYXRlOgorICAgICAgICAgICAgLy8gLSB0YWtlIHRoZSBhcnJheSBvZiBkaXJlY3RpdmVzIGZvciB0aGlzIGVsZW1lbnQKKyAgICAgICAgICAgIC8vIC0gc3BsaXQgaXQgaW50byB0d28gcGFydHMsIHRob3NlIHRoYXQgYWxyZWFkeSBhcHBsaWVkIChwcm9jZXNzZWQpIGFuZCB0aG9zZSB0aGF0IHdlcmVuJ3QgKHVucHJvY2Vzc2VkKQorICAgICAgICAgICAgLy8gLSBjb2xsZWN0IGRpcmVjdGl2ZXMgZnJvbSB0aGUgdGVtcGxhdGUgYW5kIHNvcnQgdGhlbSBieSBwcmlvcml0eQorICAgICAgICAgICAgLy8gLSBjb21iaW5lIGRpcmVjdGl2ZXMgYXM6IHByb2Nlc3NlZCArIHRlbXBsYXRlICsgdW5wcm9jZXNzZWQKKyAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURpcmVjdGl2ZXMgPSBjb2xsZWN0RGlyZWN0aXZlcyhjb21waWxlTm9kZSwgW10sIG5ld1RlbXBsYXRlQXR0cnMpOworICAgICAgICAgICAgdmFyIHVucHJvY2Vzc2VkRGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXMuc3BsaWNlKGkgKyAxLCBkaXJlY3RpdmVzLmxlbmd0aCAtIChpICsgMSkpOworCisgICAgICAgICAgICBpZiAobmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlKSB7CisgICAgICAgICAgICAgIG1hcmtEaXJlY3RpdmVzQXNJc29sYXRlKHRlbXBsYXRlRGlyZWN0aXZlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXJlY3RpdmVzID0gZGlyZWN0aXZlcy5jb25jYXQodGVtcGxhdGVEaXJlY3RpdmVzKS5jb25jYXQodW5wcm9jZXNzZWREaXJlY3RpdmVzKTsKKyAgICAgICAgICAgIG1lcmdlVGVtcGxhdGVBdHRyaWJ1dGVzKHRlbXBsYXRlQXR0cnMsIG5ld1RlbXBsYXRlQXR0cnMpOworCisgICAgICAgICAgICBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkY29tcGlsZU5vZGUuaHRtbChkaXJlY3RpdmVWYWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpcmVjdGl2ZS50ZW1wbGF0ZVVybCkgeworICAgICAgICAgIGhhc1RlbXBsYXRlID0gdHJ1ZTsKKyAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZSgndGVtcGxhdGUnLCB0ZW1wbGF0ZURpcmVjdGl2ZSwgZGlyZWN0aXZlLCAkY29tcGlsZU5vZGUpOworICAgICAgICAgIHRlbXBsYXRlRGlyZWN0aXZlID0gZGlyZWN0aXZlOworCisgICAgICAgICAgaWYgKGRpcmVjdGl2ZS5yZXBsYWNlKSB7CisgICAgICAgICAgICByZXBsYWNlRGlyZWN0aXZlID0gZGlyZWN0aXZlOworICAgICAgICAgIH0KKworICAgICAgICAgIG5vZGVMaW5rRm4gPSBjb21waWxlVGVtcGxhdGVVcmwoZGlyZWN0aXZlcy5zcGxpY2UoaSwgZGlyZWN0aXZlcy5sZW5ndGggLSBpKSwgJGNvbXBpbGVOb2RlLAorICAgICAgICAgICAgICB0ZW1wbGF0ZUF0dHJzLCBqcUNvbGxlY3Rpb24sIGhhc1RyYW5zY2x1ZGVEaXJlY3RpdmUgJiYgY2hpbGRUcmFuc2NsdWRlRm4sIHByZUxpbmtGbnMsIHBvc3RMaW5rRm5zLCB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlckRpcmVjdGl2ZXM6IGNvbnRyb2xsZXJEaXJlY3RpdmVzLAorICAgICAgICAgICAgICAgIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZTogbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgIHRlbXBsYXRlRGlyZWN0aXZlOiB0ZW1wbGF0ZURpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlOiBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlCisgICAgICAgICAgICAgIH0pOworICAgICAgICAgIGlpID0gZGlyZWN0aXZlcy5sZW5ndGg7CisgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aXZlLmNvbXBpbGUpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgbGlua0ZuID0gZGlyZWN0aXZlLmNvbXBpbGUoJGNvbXBpbGVOb2RlLCB0ZW1wbGF0ZUF0dHJzLCBjaGlsZFRyYW5zY2x1ZGVGbik7CisgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihsaW5rRm4pKSB7CisgICAgICAgICAgICAgIGFkZExpbmtGbnMobnVsbCwgbGlua0ZuLCBhdHRyU3RhcnQsIGF0dHJFbmQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5rRm4pIHsKKyAgICAgICAgICAgICAgYWRkTGlua0ZucyhsaW5rRm4ucHJlLCBsaW5rRm4ucG9zdCwgYXR0clN0YXJ0LCBhdHRyRW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlLCBzdGFydGluZ1RhZygkY29tcGlsZU5vZGUpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGlyZWN0aXZlLnRlcm1pbmFsKSB7CisgICAgICAgICAgbm9kZUxpbmtGbi50ZXJtaW5hbCA9IHRydWU7CisgICAgICAgICAgdGVybWluYWxQcmlvcml0eSA9IE1hdGgubWF4KHRlcm1pbmFsUHJpb3JpdHksIGRpcmVjdGl2ZS5wcmlvcml0eSk7CisgICAgICAgIH0KKworICAgICAgfQorCisgICAgICBub2RlTGlua0ZuLnNjb3BlID0gbmV3U2NvcGVEaXJlY3RpdmUgJiYgbmV3U2NvcGVEaXJlY3RpdmUuc2NvcGUgPT09IHRydWU7CisgICAgICBub2RlTGlua0ZuLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50ID0gaGFzVHJhbnNjbHVkZURpcmVjdGl2ZTsKKyAgICAgIG5vZGVMaW5rRm4uZWxlbWVudFRyYW5zY2x1ZGVPblRoaXNFbGVtZW50ID0gaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmU7CisgICAgICBub2RlTGlua0ZuLnRlbXBsYXRlT25UaGlzRWxlbWVudCA9IGhhc1RlbXBsYXRlOworICAgICAgbm9kZUxpbmtGbi50cmFuc2NsdWRlID0gY2hpbGRUcmFuc2NsdWRlRm47CisKKyAgICAgIHByZXZpb3VzQ29tcGlsZUNvbnRleHQuaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmUgPSBoYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZTsKKworICAgICAgLy8gbWlnaHQgYmUgbm9ybWFsIG9yIGRlbGF5ZWQgbm9kZUxpbmtGbiBkZXBlbmRpbmcgb24gaWYgdGVtcGxhdGVVcmwgaXMgcHJlc2VudAorICAgICAgcmV0dXJuIG5vZGVMaW5rRm47CisKKyAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgIGZ1bmN0aW9uIGFkZExpbmtGbnMocHJlLCBwb3N0LCBhdHRyU3RhcnQsIGF0dHJFbmQpIHsKKyAgICAgICAgaWYgKHByZSkgeworICAgICAgICAgIGlmIChhdHRyU3RhcnQpIHByZSA9IGdyb3VwRWxlbWVudHNMaW5rRm5XcmFwcGVyKHByZSwgYXR0clN0YXJ0LCBhdHRyRW5kKTsKKyAgICAgICAgICBwcmUucmVxdWlyZSA9IGRpcmVjdGl2ZS5yZXF1aXJlOworICAgICAgICAgIHByZS5kaXJlY3RpdmVOYW1lID0gZGlyZWN0aXZlTmFtZTsKKyAgICAgICAgICBpZiAobmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlID09PSBkaXJlY3RpdmUgfHwgZGlyZWN0aXZlLiQkaXNvbGF0ZVNjb3BlKSB7CisgICAgICAgICAgICBwcmUgPSBjbG9uZUFuZEFubm90YXRlRm4ocHJlLCB7aXNvbGF0ZVNjb3BlOiB0cnVlfSk7CisgICAgICAgICAgfQorICAgICAgICAgIHByZUxpbmtGbnMucHVzaChwcmUpOworICAgICAgICB9CisgICAgICAgIGlmIChwb3N0KSB7CisgICAgICAgICAgaWYgKGF0dHJTdGFydCkgcG9zdCA9IGdyb3VwRWxlbWVudHNMaW5rRm5XcmFwcGVyKHBvc3QsIGF0dHJTdGFydCwgYXR0ckVuZCk7CisgICAgICAgICAgcG9zdC5yZXF1aXJlID0gZGlyZWN0aXZlLnJlcXVpcmU7CisgICAgICAgICAgcG9zdC5kaXJlY3RpdmVOYW1lID0gZGlyZWN0aXZlTmFtZTsKKyAgICAgICAgICBpZiAobmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlID09PSBkaXJlY3RpdmUgfHwgZGlyZWN0aXZlLiQkaXNvbGF0ZVNjb3BlKSB7CisgICAgICAgICAgICBwb3N0ID0gY2xvbmVBbmRBbm5vdGF0ZUZuKHBvc3QsIHtpc29sYXRlU2NvcGU6IHRydWV9KTsKKyAgICAgICAgICB9CisgICAgICAgICAgcG9zdExpbmtGbnMucHVzaChwb3N0KTsKKyAgICAgICAgfQorICAgICAgfQorCisKKyAgICAgIGZ1bmN0aW9uIGdldENvbnRyb2xsZXJzKGRpcmVjdGl2ZU5hbWUsIHJlcXVpcmUsICRlbGVtZW50LCBlbGVtZW50Q29udHJvbGxlcnMpIHsKKyAgICAgICAgdmFyIHZhbHVlLCByZXRyaWV2YWxNZXRob2QgPSAnZGF0YScsIG9wdGlvbmFsID0gZmFsc2U7CisgICAgICAgIHZhciAkc2VhcmNoRWxlbWVudCA9ICRlbGVtZW50OworICAgICAgICB2YXIgbWF0Y2g7CisgICAgICAgIGlmIChpc1N0cmluZyhyZXF1aXJlKSkgeworICAgICAgICAgIG1hdGNoID0gcmVxdWlyZS5tYXRjaChSRVFVSVJFX1BSRUZJWF9SRUdFWFApOworICAgICAgICAgIHJlcXVpcmUgPSByZXF1aXJlLnN1YnN0cmluZyhtYXRjaFswXS5sZW5ndGgpOworCisgICAgICAgICAgaWYgKG1hdGNoWzNdKSB7CisgICAgICAgICAgICBpZiAobWF0Y2hbMV0pIG1hdGNoWzNdID0gbnVsbDsKKyAgICAgICAgICAgIGVsc2UgbWF0Y2hbMV0gPSBtYXRjaFszXTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1hdGNoWzFdID09PSAnXicpIHsKKyAgICAgICAgICAgIHJldHJpZXZhbE1ldGhvZCA9ICdpbmhlcml0ZWREYXRhJzsKKyAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoWzFdID09PSAnXl4nKSB7CisgICAgICAgICAgICByZXRyaWV2YWxNZXRob2QgPSAnaW5oZXJpdGVkRGF0YSc7CisgICAgICAgICAgICAkc2VhcmNoRWxlbWVudCA9ICRlbGVtZW50LnBhcmVudCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobWF0Y2hbMl0gPT09ICc/JykgeworICAgICAgICAgICAgb3B0aW9uYWwgPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhbHVlID0gbnVsbDsKKworICAgICAgICAgIGlmIChlbGVtZW50Q29udHJvbGxlcnMgJiYgcmV0cmlldmFsTWV0aG9kID09PSAnZGF0YScpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9IGVsZW1lbnRDb250cm9sbGVyc1tyZXF1aXJlXSkgeworICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmluc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8ICRzZWFyY2hFbGVtZW50W3JldHJpZXZhbE1ldGhvZF0oJyQnICsgcmVxdWlyZSArICdDb250cm9sbGVyJyk7CisKKyAgICAgICAgICBpZiAoIXZhbHVlICYmICFvcHRpb25hbCkgeworICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ2N0cmVxJywKKyAgICAgICAgICAgICAgICAiQ29udHJvbGxlciAnezB9JywgcmVxdWlyZWQgYnkgZGlyZWN0aXZlICd7MX0nLCBjYW4ndCBiZSBmb3VuZCEiLAorICAgICAgICAgICAgICAgIHJlcXVpcmUsIGRpcmVjdGl2ZU5hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gdmFsdWUgfHwgbnVsbDsKKyAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHJlcXVpcmUpKSB7CisgICAgICAgICAgdmFsdWUgPSBbXTsKKyAgICAgICAgICBmb3JFYWNoKHJlcXVpcmUsIGZ1bmN0aW9uKHJlcXVpcmUpIHsKKyAgICAgICAgICAgIHZhbHVlLnB1c2goZ2V0Q29udHJvbGxlcnMoZGlyZWN0aXZlTmFtZSwgcmVxdWlyZSwgJGVsZW1lbnQsIGVsZW1lbnRDb250cm9sbGVycykpOworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKworCisgICAgICBmdW5jdGlvbiBub2RlTGlua0ZuKGNoaWxkTGlua0ZuLCBzY29wZSwgbGlua05vZGUsICRyb290RWxlbWVudCwgYm91bmRUcmFuc2NsdWRlRm4pIHsKKyAgICAgICAgdmFyIGksIGlpLCBsaW5rRm4sIGNvbnRyb2xsZXIsIGlzb2xhdGVTY29wZSwgZWxlbWVudENvbnRyb2xsZXJzLCB0cmFuc2NsdWRlRm4sICRlbGVtZW50LAorICAgICAgICAgICAgYXR0cnM7CisKKyAgICAgICAgaWYgKGNvbXBpbGVOb2RlID09PSBsaW5rTm9kZSkgeworICAgICAgICAgIGF0dHJzID0gdGVtcGxhdGVBdHRyczsKKyAgICAgICAgICAkZWxlbWVudCA9IHRlbXBsYXRlQXR0cnMuJCRlbGVtZW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICRlbGVtZW50ID0ganFMaXRlKGxpbmtOb2RlKTsKKyAgICAgICAgICBhdHRycyA9IG5ldyBBdHRyaWJ1dGVzKCRlbGVtZW50LCB0ZW1wbGF0ZUF0dHJzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUpIHsKKyAgICAgICAgICBpc29sYXRlU2NvcGUgPSBzY29wZS4kbmV3KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJvdW5kVHJhbnNjbHVkZUZuKSB7CisgICAgICAgICAgLy8gdHJhY2sgYGJvdW5kVHJhbnNjbHVkZUZuYCBzbyBpdCBjYW4gYmUgdW53cmFwcGVkIGlmIGB0cmFuc2NsdWRlRm5gCisgICAgICAgICAgLy8gaXMgbGF0ZXIgcGFzc2VkIGFzIGBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbmAgdG8gYHB1YmxpY0xpbmtGbmAKKyAgICAgICAgICB0cmFuc2NsdWRlRm4gPSBjb250cm9sbGVyc0JvdW5kVHJhbnNjbHVkZTsKKyAgICAgICAgICB0cmFuc2NsdWRlRm4uJCRib3VuZFRyYW5zY2x1ZGUgPSBib3VuZFRyYW5zY2x1ZGVGbjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250cm9sbGVyRGlyZWN0aXZlcykgeworICAgICAgICAgIC8vIFRPRE86IG1lcmdlIGBjb250cm9sbGVyc2AgYW5kIGBlbGVtZW50Q29udHJvbGxlcnNgIGludG8gc2luZ2xlIG9iamVjdC4KKyAgICAgICAgICBjb250cm9sbGVycyA9IHt9OworICAgICAgICAgIGVsZW1lbnRDb250cm9sbGVycyA9IHt9OworICAgICAgICAgIGZvckVhY2goY29udHJvbGxlckRpcmVjdGl2ZXMsIGZ1bmN0aW9uKGRpcmVjdGl2ZSkgeworICAgICAgICAgICAgdmFyIGxvY2FscyA9IHsKKyAgICAgICAgICAgICAgJHNjb3BlOiBkaXJlY3RpdmUgPT09IG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSB8fCBkaXJlY3RpdmUuJCRpc29sYXRlU2NvcGUgPyBpc29sYXRlU2NvcGUgOiBzY29wZSwKKyAgICAgICAgICAgICAgJGVsZW1lbnQ6ICRlbGVtZW50LAorICAgICAgICAgICAgICAkYXR0cnM6IGF0dHJzLAorICAgICAgICAgICAgICAkdHJhbnNjbHVkZTogdHJhbnNjbHVkZUZuCisgICAgICAgICAgICB9LCBjb250cm9sbGVySW5zdGFuY2U7CisKKyAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBkaXJlY3RpdmUuY29udHJvbGxlcjsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVyID09ICdAJykgeworICAgICAgICAgICAgICBjb250cm9sbGVyID0gYXR0cnNbZGlyZWN0aXZlLm5hbWVdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250cm9sbGVySW5zdGFuY2UgPSAkY29udHJvbGxlcihjb250cm9sbGVyLCBsb2NhbHMsIHRydWUsIGRpcmVjdGl2ZS5jb250cm9sbGVyQXMpOworCisgICAgICAgICAgICAvLyBGb3IgZGlyZWN0aXZlcyB3aXRoIGVsZW1lbnQgdHJhbnNjbHVzaW9uIHRoZSBlbGVtZW50IGlzIGEgY29tbWVudCwKKyAgICAgICAgICAgIC8vIGJ1dCBqUXVlcnkgLmRhdGEgZG9lc24ndCBzdXBwb3J0IGF0dGFjaGluZyBkYXRhIHRvIGNvbW1lbnQgbm9kZXMgYXMgaXQncyBoYXJkIHRvCisgICAgICAgICAgICAvLyBjbGVhbiB1cCAoaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvODMzNSkuCisgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBzYXZlIHRoZSBjb250cm9sbGVycyBmb3IgdGhlIGVsZW1lbnQgaW4gYSBsb2NhbCBoYXNoIGFuZCBhdHRhY2ggdG8gLmRhdGEKKyAgICAgICAgICAgIC8vIGxhdGVyLCBvbmNlIHdlIGhhdmUgdGhlIGFjdHVhbCBlbGVtZW50LgorICAgICAgICAgICAgZWxlbWVudENvbnRyb2xsZXJzW2RpcmVjdGl2ZS5uYW1lXSA9IGNvbnRyb2xsZXJJbnN0YW5jZTsKKyAgICAgICAgICAgIGlmICghaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmUpIHsKKyAgICAgICAgICAgICAgJGVsZW1lbnQuZGF0YSgnJCcgKyBkaXJlY3RpdmUubmFtZSArICdDb250cm9sbGVyJywgY29udHJvbGxlckluc3RhbmNlLmluc3RhbmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udHJvbGxlcnNbZGlyZWN0aXZlLm5hbWVdID0gY29udHJvbGxlckluc3RhbmNlOworICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSkgeworICAgICAgICAgIGNvbXBpbGUuJCRhZGRTY29wZUluZm8oJGVsZW1lbnQsIGlzb2xhdGVTY29wZSwgdHJ1ZSwgISh0ZW1wbGF0ZURpcmVjdGl2ZSAmJiAodGVtcGxhdGVEaXJlY3RpdmUgPT09IG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSB8fAorICAgICAgICAgICAgICB0ZW1wbGF0ZURpcmVjdGl2ZSA9PT0gbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLiQkb3JpZ2luYWxEaXJlY3RpdmUpKSk7CisgICAgICAgICAgY29tcGlsZS4kJGFkZFNjb3BlQ2xhc3MoJGVsZW1lbnQsIHRydWUpOworCisgICAgICAgICAgdmFyIGlzb2xhdGVTY29wZUNvbnRyb2xsZXIgPSBjb250cm9sbGVycyAmJiBjb250cm9sbGVyc1tuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUubmFtZV07CisgICAgICAgICAgdmFyIGlzb2xhdGVCaW5kaW5nQ29udGV4dCA9IGlzb2xhdGVTY29wZTsKKyAgICAgICAgICBpZiAoaXNvbGF0ZVNjb3BlQ29udHJvbGxlciAmJiBpc29sYXRlU2NvcGVDb250cm9sbGVyLmlkZW50aWZpZXIgJiYKKyAgICAgICAgICAgICAgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLmJpbmRUb0NvbnRyb2xsZXIgPT09IHRydWUpIHsKKyAgICAgICAgICAgIGlzb2xhdGVCaW5kaW5nQ29udGV4dCA9IGlzb2xhdGVTY29wZUNvbnRyb2xsZXIuaW5zdGFuY2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yRWFjaChpc29sYXRlU2NvcGUuJCRpc29sYXRlQmluZGluZ3MgPSBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUuJCRpc29sYXRlQmluZGluZ3MsIGZ1bmN0aW9uKGRlZmluaXRpb24sIHNjb3BlTmFtZSkgeworICAgICAgICAgICAgdmFyIGF0dHJOYW1lID0gZGVmaW5pdGlvbi5hdHRyTmFtZSwKKyAgICAgICAgICAgICAgICBvcHRpb25hbCA9IGRlZmluaXRpb24ub3B0aW9uYWwsCisgICAgICAgICAgICAgICAgbW9kZSA9IGRlZmluaXRpb24ubW9kZSwgLy8gQCwgPSwgb3IgJgorICAgICAgICAgICAgICAgIGxhc3RWYWx1ZSwKKyAgICAgICAgICAgICAgICBwYXJlbnRHZXQsIHBhcmVudFNldCwgY29tcGFyZTsKKworICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7CisKKyAgICAgICAgICAgICAgY2FzZSAnQCc6CisgICAgICAgICAgICAgICAgYXR0cnMuJG9ic2VydmUoYXR0ck5hbWUsIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICBpc29sYXRlQmluZGluZ0NvbnRleHRbc2NvcGVOYW1lXSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGF0dHJzLiQkb2JzZXJ2ZXJzW2F0dHJOYW1lXS4kJHNjb3BlID0gc2NvcGU7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJzW2F0dHJOYW1lXSkgeworICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBoYXMgYmVlbiBwcm92aWRlZCB0aGVuIHdlIHRyaWdnZXIgYW4gaW50ZXJwb2xhdGlvbiB0byBlbnN1cmUKKyAgICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBpcyB0aGVyZSBmb3IgdXNlIGluIHRoZSBsaW5rIGZuCisgICAgICAgICAgICAgICAgICBpc29sYXRlQmluZGluZ0NvbnRleHRbc2NvcGVOYW1lXSA9ICRpbnRlcnBvbGF0ZShhdHRyc1thdHRyTmFtZV0pKHNjb3BlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgaWYgKG9wdGlvbmFsICYmICFhdHRyc1thdHRyTmFtZV0pIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyZW50R2V0ID0gJHBhcnNlKGF0dHJzW2F0dHJOYW1lXSk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudEdldC5saXRlcmFsKSB7CisgICAgICAgICAgICAgICAgICBjb21wYXJlID0gZXF1YWxzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBjb21wYXJlID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYSA9PT0gYiB8fCAoYSAhPT0gYSAmJiBiICE9PSBiKTsgfTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyZW50U2V0ID0gcGFyZW50R2V0LmFzc2lnbiB8fCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBjaGFuZ2UsIG9yIHdlIHdpbGwgdGhyb3cgdGhpcyBleGNlcHRpb24gb24gZXZlcnkgJGRpZ2VzdAorICAgICAgICAgICAgICAgICAgbGFzdFZhbHVlID0gaXNvbGF0ZUJpbmRpbmdDb250ZXh0W3Njb3BlTmFtZV0gPSBwYXJlbnRHZXQoc2NvcGUpOworICAgICAgICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ25vbmFzc2lnbicsCisgICAgICAgICAgICAgICAgICAgICAgIkV4cHJlc3Npb24gJ3swfScgdXNlZCB3aXRoIGRpcmVjdGl2ZSAnezF9JyBpcyBub24tYXNzaWduYWJsZSEiLAorICAgICAgICAgICAgICAgICAgICAgIGF0dHJzW2F0dHJOYW1lXSwgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLm5hbWUpOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbGFzdFZhbHVlID0gaXNvbGF0ZUJpbmRpbmdDb250ZXh0W3Njb3BlTmFtZV0gPSBwYXJlbnRHZXQoc2NvcGUpOworICAgICAgICAgICAgICAgIHZhciBwYXJlbnRWYWx1ZVdhdGNoID0gZnVuY3Rpb24gcGFyZW50VmFsdWVXYXRjaChwYXJlbnRWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlKHBhcmVudFZhbHVlLCBpc29sYXRlQmluZGluZ0NvbnRleHRbc2NvcGVOYW1lXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIG91dCBvZiBzeW5jIGFuZCBuZWVkIHRvIGNvcHkKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlKHBhcmVudFZhbHVlLCBsYXN0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IGNoYW5nZWQgYW5kIGl0IGhhcyBwcmVjZWRlbmNlCisgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZUJpbmRpbmdDb250ZXh0W3Njb3BlTmFtZV0gPSBwYXJlbnRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFyZW50IGNhbiBiZSBhc3NpZ25lZCB0aGVuIGRvIHNvCisgICAgICAgICAgICAgICAgICAgICAgcGFyZW50U2V0KHNjb3BlLCBwYXJlbnRWYWx1ZSA9IGlzb2xhdGVCaW5kaW5nQ29udGV4dFtzY29wZU5hbWVdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RWYWx1ZSA9IHBhcmVudFZhbHVlOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcGFyZW50VmFsdWVXYXRjaC4kc3RhdGVmdWwgPSB0cnVlOworICAgICAgICAgICAgICAgIHZhciB1bndhdGNoOworICAgICAgICAgICAgICAgIGlmIChkZWZpbml0aW9uLmNvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgIHVud2F0Y2ggPSBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKGF0dHJzW2F0dHJOYW1lXSwgcGFyZW50VmFsdWVXYXRjaCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHVud2F0Y2ggPSBzY29wZS4kd2F0Y2goJHBhcnNlKGF0dHJzW2F0dHJOYW1lXSwgcGFyZW50VmFsdWVXYXRjaCksIG51bGwsIHBhcmVudEdldC5saXRlcmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXNvbGF0ZVNjb3BlLiRvbignJGRlc3Ryb3knLCB1bndhdGNoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICAgICAgICBwYXJlbnRHZXQgPSAkcGFyc2UoYXR0cnNbYXR0ck5hbWVdKTsKKyAgICAgICAgICAgICAgICBpc29sYXRlQmluZGluZ0NvbnRleHRbc2NvcGVOYW1lXSA9IGZ1bmN0aW9uKGxvY2FscykgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudEdldChzY29wZSwgbG9jYWxzKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIGlmIChjb250cm9sbGVycykgeworICAgICAgICAgIGZvckVhY2goY29udHJvbGxlcnMsIGZ1bmN0aW9uKGNvbnRyb2xsZXIpIHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIoKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBjb250cm9sbGVycyA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBQUkVMSU5LSU5HCisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gcHJlTGlua0Zucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgbGlua0ZuID0gcHJlTGlua0Zuc1tpXTsKKyAgICAgICAgICBpbnZva2VMaW5rRm4obGlua0ZuLAorICAgICAgICAgICAgICBsaW5rRm4uaXNvbGF0ZVNjb3BlID8gaXNvbGF0ZVNjb3BlIDogc2NvcGUsCisgICAgICAgICAgICAgICRlbGVtZW50LAorICAgICAgICAgICAgICBhdHRycywKKyAgICAgICAgICAgICAgbGlua0ZuLnJlcXVpcmUgJiYgZ2V0Q29udHJvbGxlcnMobGlua0ZuLmRpcmVjdGl2ZU5hbWUsIGxpbmtGbi5yZXF1aXJlLCAkZWxlbWVudCwgZWxlbWVudENvbnRyb2xsZXJzKSwKKyAgICAgICAgICAgICAgdHJhbnNjbHVkZUZuCisgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJFQ1VSU0lPTgorICAgICAgICAvLyBXZSBvbmx5IHBhc3MgdGhlIGlzb2xhdGUgc2NvcGUsIGlmIHRoZSBpc29sYXRlIGRpcmVjdGl2ZSBoYXMgYSB0ZW1wbGF0ZSwKKyAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBjaGlsZCBlbGVtZW50cyBkbyBub3QgYmVsb25nIHRvIHRoZSBpc29sYXRlIGRpcmVjdGl2ZS4KKyAgICAgICAgdmFyIHNjb3BlVG9DaGlsZCA9IHNjb3BlOworICAgICAgICBpZiAobmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlICYmIChuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUudGVtcGxhdGUgfHwgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLnRlbXBsYXRlVXJsID09PSBudWxsKSkgeworICAgICAgICAgIHNjb3BlVG9DaGlsZCA9IGlzb2xhdGVTY29wZTsKKyAgICAgICAgfQorICAgICAgICBjaGlsZExpbmtGbiAmJiBjaGlsZExpbmtGbihzY29wZVRvQ2hpbGQsIGxpbmtOb2RlLmNoaWxkTm9kZXMsIHVuZGVmaW5lZCwgYm91bmRUcmFuc2NsdWRlRm4pOworCisgICAgICAgIC8vIFBPU1RMSU5LSU5HCisgICAgICAgIGZvciAoaSA9IHBvc3RMaW5rRm5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgbGlua0ZuID0gcG9zdExpbmtGbnNbaV07CisgICAgICAgICAgaW52b2tlTGlua0ZuKGxpbmtGbiwKKyAgICAgICAgICAgICAgbGlua0ZuLmlzb2xhdGVTY29wZSA/IGlzb2xhdGVTY29wZSA6IHNjb3BlLAorICAgICAgICAgICAgICAkZWxlbWVudCwKKyAgICAgICAgICAgICAgYXR0cnMsCisgICAgICAgICAgICAgIGxpbmtGbi5yZXF1aXJlICYmIGdldENvbnRyb2xsZXJzKGxpbmtGbi5kaXJlY3RpdmVOYW1lLCBsaW5rRm4ucmVxdWlyZSwgJGVsZW1lbnQsIGVsZW1lbnRDb250cm9sbGVycyksCisgICAgICAgICAgICAgIHRyYW5zY2x1ZGVGbgorICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGluamVjdGVkIGFzIGAkdHJhbnNjbHVkZWAuCisgICAgICAgIC8vIE5vdGU6IGFsbCBhcmd1bWVudHMgYXJlIG9wdGlvbmFsIQorICAgICAgICBmdW5jdGlvbiBjb250cm9sbGVyc0JvdW5kVHJhbnNjbHVkZShzY29wZSwgY2xvbmVBdHRhY2hGbiwgZnV0dXJlUGFyZW50RWxlbWVudCkgeworICAgICAgICAgIHZhciB0cmFuc2NsdWRlQ29udHJvbGxlcnM7CisKKyAgICAgICAgICAvLyBObyBzY29wZSBwYXNzZWQgaW46CisgICAgICAgICAgaWYgKCFpc1Njb3BlKHNjb3BlKSkgeworICAgICAgICAgICAgZnV0dXJlUGFyZW50RWxlbWVudCA9IGNsb25lQXR0YWNoRm47CisgICAgICAgICAgICBjbG9uZUF0dGFjaEZuID0gc2NvcGU7CisgICAgICAgICAgICBzY29wZSA9IHVuZGVmaW5lZDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmUpIHsKKyAgICAgICAgICAgIHRyYW5zY2x1ZGVDb250cm9sbGVycyA9IGVsZW1lbnRDb250cm9sbGVyczsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFmdXR1cmVQYXJlbnRFbGVtZW50KSB7CisgICAgICAgICAgICBmdXR1cmVQYXJlbnRFbGVtZW50ID0gaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmUgPyAkZWxlbWVudC5wYXJlbnQoKSA6ICRlbGVtZW50OworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gYm91bmRUcmFuc2NsdWRlRm4oc2NvcGUsIGNsb25lQXR0YWNoRm4sIHRyYW5zY2x1ZGVDb250cm9sbGVycywgZnV0dXJlUGFyZW50RWxlbWVudCwgc2NvcGVUb0NoaWxkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIG1hcmtEaXJlY3RpdmVzQXNJc29sYXRlKGRpcmVjdGl2ZXMpIHsKKyAgICAgIC8vIG1hcmsgYWxsIGRpcmVjdGl2ZXMgYXMgbmVlZGluZyBpc29sYXRlIHNjb3BlLgorICAgICAgZm9yICh2YXIgaiA9IDAsIGpqID0gZGlyZWN0aXZlcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CisgICAgICAgIGRpcmVjdGl2ZXNbal0gPSBpbmhlcml0KGRpcmVjdGl2ZXNbal0sIHskJGlzb2xhdGVTY29wZTogdHJ1ZX0pOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGxvb2tzIHVwIHRoZSBkaXJlY3RpdmUgYW5kIGRlY29yYXRlcyBpdCB3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZyBhbmQgcHJvcGVyIHBhcmFtZXRlcnMuIFdlCisgICAgICogY2FsbCB0aGlzIHRoZSBib3VuZERpcmVjdGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZSB0byBsb29rIHVwLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBUaGUgZGlyZWN0aXZlIG11c3QgYmUgZm91bmQgaW4gc3BlY2lmaWMgZm9ybWF0LgorICAgICAqICAgU3RyaW5nIGNvbnRhaW5pbmcgYW55IG9mIHRoZXNlcyBjaGFyYWN0ZXJzOgorICAgICAqCisgICAgICogICAqIGBFYDogZWxlbWVudCBuYW1lCisgICAgICogICAqIGBBJzogYXR0cmlidXRlCisgICAgICogICAqIGBDYDogY2xhc3MKKyAgICAgKiAgICogYE1gOiBjb21tZW50CisgICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgZGlyZWN0aXZlIHdhcyBhZGRlZC4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBhZGREaXJlY3RpdmUodERpcmVjdGl2ZXMsIG5hbWUsIGxvY2F0aW9uLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLCBzdGFydEF0dHJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRBdHRyTmFtZSkgeworICAgICAgaWYgKG5hbWUgPT09IGlnbm9yZURpcmVjdGl2ZSkgcmV0dXJuIG51bGw7CisgICAgICB2YXIgbWF0Y2ggPSBudWxsOworICAgICAgaWYgKGhhc0RpcmVjdGl2ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgZm9yICh2YXIgZGlyZWN0aXZlLCBkaXJlY3RpdmVzID0gJGluamVjdG9yLmdldChuYW1lICsgU3VmZml4KSwKKyAgICAgICAgICAgIGkgPSAwLCBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkaXJlY3RpdmUgPSBkaXJlY3RpdmVzW2ldOworICAgICAgICAgICAgaWYgKChtYXhQcmlvcml0eSA9PT0gdW5kZWZpbmVkIHx8IG1heFByaW9yaXR5ID4gZGlyZWN0aXZlLnByaW9yaXR5KSAmJgorICAgICAgICAgICAgICAgICBkaXJlY3RpdmUucmVzdHJpY3QuaW5kZXhPZihsb2NhdGlvbikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgaWYgKHN0YXJ0QXR0ck5hbWUpIHsKKyAgICAgICAgICAgICAgICBkaXJlY3RpdmUgPSBpbmhlcml0KGRpcmVjdGl2ZSwgeyQkc3RhcnQ6IHN0YXJ0QXR0ck5hbWUsICQkZW5kOiBlbmRBdHRyTmFtZX0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHREaXJlY3RpdmVzLnB1c2goZGlyZWN0aXZlKTsKKyAgICAgICAgICAgICAgbWF0Y2ggPSBkaXJlY3RpdmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBjYXRjaCAoZSkgeyAkZXhjZXB0aW9uSGFuZGxlcihlKTsgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbWF0Y2g7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBsb29rcyB1cCB0aGUgZGlyZWN0aXZlIGFuZCByZXR1cm5zIHRydWUgaWYgaXQgaXMgYSBtdWx0aS1lbGVtZW50IGRpcmVjdGl2ZSwKKyAgICAgKiBhbmQgdGhlcmVmb3JlIHJlcXVpcmVzIERPTSBub2RlcyBiZXR3ZWVuIC1zdGFydCBhbmQgLWVuZCBtYXJrZXJzIHRvIGJlIGdyb3VwZWQKKyAgICAgKiB0b2dldGhlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZSB0byBsb29rIHVwLgorICAgICAqIEByZXR1cm5zIHRydWUgaWYgZGlyZWN0aXZlIHdhcyByZWdpc3RlcmVkIGFzIG11bHRpLWVsZW1lbnQuCisgICAgICovCisgICAgZnVuY3Rpb24gZGlyZWN0aXZlSXNNdWx0aUVsZW1lbnQobmFtZSkgeworICAgICAgaWYgKGhhc0RpcmVjdGl2ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKKyAgICAgICAgZm9yICh2YXIgZGlyZWN0aXZlLCBkaXJlY3RpdmVzID0gJGluamVjdG9yLmdldChuYW1lICsgU3VmZml4KSwKKyAgICAgICAgICAgIGkgPSAwLCBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZXNbaV07CisgICAgICAgICAgaWYgKGRpcmVjdGl2ZS5tdWx0aUVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gdGhlIGVsZW1lbnQgaXMgcmVwbGFjZWQgd2l0aCBIVE1MIHRlbXBsYXRlIHRoZW4gdGhlIG5ldyBhdHRyaWJ1dGVzCisgICAgICogb24gdGhlIHRlbXBsYXRlIG5lZWQgdG8gYmUgbWVyZ2VkIHdpdGggdGhlIGV4aXN0aW5nIGF0dHJpYnV0ZXMgaW4gdGhlIERPTS4KKyAgICAgKiBUaGUgZGVzaXJlZCBlZmZlY3QgaXMgdG8gaGF2ZSBib3RoIG9mIHRoZSBhdHRyaWJ1dGVzIHByZXNlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ge29iamVjdH0gZHN0IGRlc3RpbmF0aW9uIGF0dHJpYnV0ZXMgKG9yaWdpbmFsIERPTSkKKyAgICAgKiBAcGFyYW0ge29iamVjdH0gc3JjIHNvdXJjZSBhdHRyaWJ1dGVzIChmcm9tIHRoZSBkaXJlY3RpdmUgdGVtcGxhdGUpCisgICAgICovCisgICAgZnVuY3Rpb24gbWVyZ2VUZW1wbGF0ZUF0dHJpYnV0ZXMoZHN0LCBzcmMpIHsKKyAgICAgIHZhciBzcmNBdHRyID0gc3JjLiRhdHRyLAorICAgICAgICAgIGRzdEF0dHIgPSBkc3QuJGF0dHIsCisgICAgICAgICAgJGVsZW1lbnQgPSBkc3QuJCRlbGVtZW50OworCisgICAgICAvLyByZWFwcGx5IHRoZSBvbGQgYXR0cmlidXRlcyB0byB0aGUgbmV3IGVsZW1lbnQKKyAgICAgIGZvckVhY2goZHN0LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CisgICAgICAgIGlmIChrZXkuY2hhckF0KDApICE9ICckJykgeworICAgICAgICAgIGlmIChzcmNba2V5XSAmJiBzcmNba2V5XSAhPT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHZhbHVlICs9IChrZXkgPT09ICdzdHlsZScgPyAnOycgOiAnICcpICsgc3JjW2tleV07CisgICAgICAgICAgfQorICAgICAgICAgIGRzdC4kc2V0KGtleSwgdmFsdWUsIHRydWUsIHNyY0F0dHJba2V5XSk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICAvLyBjb3B5IHRoZSBuZXcgYXR0cmlidXRlcyBvbiB0aGUgb2xkIGF0dHJzIG9iamVjdAorICAgICAgZm9yRWFjaChzcmMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKKyAgICAgICAgaWYgKGtleSA9PSAnY2xhc3MnKSB7CisgICAgICAgICAgc2FmZUFkZENsYXNzKCRlbGVtZW50LCB2YWx1ZSk7CisgICAgICAgICAgZHN0WydjbGFzcyddID0gKGRzdFsnY2xhc3MnXSA/IGRzdFsnY2xhc3MnXSArICcgJyA6ICcnKSArIHZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSAnc3R5bGUnKSB7CisgICAgICAgICAgJGVsZW1lbnQuYXR0cignc3R5bGUnLCAkZWxlbWVudC5hdHRyKCdzdHlsZScpICsgJzsnICsgdmFsdWUpOworICAgICAgICAgIGRzdFsnc3R5bGUnXSA9IChkc3RbJ3N0eWxlJ10gPyBkc3RbJ3N0eWxlJ10gKyAnOycgOiAnJykgKyB2YWx1ZTsKKyAgICAgICAgICAvLyBgZHN0YCB3aWxsIG5ldmVyIGNvbnRhaW4gaGFzT3duUHJvcGVydHkgYXMgRE9NIHBhcnNlciB3b24ndCBsZXQgaXQuCisgICAgICAgICAgLy8gWW91IHdpbGwgZ2V0IGFuICJJbnZhbGlkQ2hhcmFjdGVyRXJyb3I6IERPTSBFeGNlcHRpb24gNSIgZXJyb3IgaWYgeW91CisgICAgICAgICAgLy8gaGF2ZSBhbiBhdHRyaWJ1dGUgbGlrZSAiaGFzLW93bi1wcm9wZXJ0eSIgb3IgImRhdGEtaGFzLW93bi1wcm9wZXJ0eSIsIGV0Yy4KKyAgICAgICAgfSBlbHNlIGlmIChrZXkuY2hhckF0KDApICE9ICckJyAmJiAhZHN0Lmhhc093blByb3BlcnR5KGtleSkpIHsKKyAgICAgICAgICBkc3Rba2V5XSA9IHZhbHVlOworICAgICAgICAgIGRzdEF0dHJba2V5XSA9IHNyY0F0dHJba2V5XTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorCisKKyAgICBmdW5jdGlvbiBjb21waWxlVGVtcGxhdGVVcmwoZGlyZWN0aXZlcywgJGNvbXBpbGVOb2RlLCB0QXR0cnMsCisgICAgICAgICRyb290RWxlbWVudCwgY2hpbGRUcmFuc2NsdWRlRm4sIHByZUxpbmtGbnMsIHBvc3RMaW5rRm5zLCBwcmV2aW91c0NvbXBpbGVDb250ZXh0KSB7CisgICAgICB2YXIgbGlua1F1ZXVlID0gW10sCisgICAgICAgICAgYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4sCisgICAgICAgICAgYWZ0ZXJUZW1wbGF0ZUNoaWxkTGlua0ZuLAorICAgICAgICAgIGJlZm9yZVRlbXBsYXRlQ29tcGlsZU5vZGUgPSAkY29tcGlsZU5vZGVbMF0sCisgICAgICAgICAgb3JpZ0FzeW5jRGlyZWN0aXZlID0gZGlyZWN0aXZlcy5zaGlmdCgpLAorICAgICAgICAgIC8vIFRoZSBmYWN0IHRoYXQgd2UgaGF2ZSB0byBjb3B5IGFuZCBwYXRjaCB0aGUgZGlyZWN0aXZlIHNlZW1zIHdyb25nIQorICAgICAgICAgIGRlcml2ZWRTeW5jRGlyZWN0aXZlID0gZXh0ZW5kKHt9LCBvcmlnQXN5bmNEaXJlY3RpdmUsIHsKKyAgICAgICAgICAgIHRlbXBsYXRlVXJsOiBudWxsLCB0cmFuc2NsdWRlOiBudWxsLCByZXBsYWNlOiBudWxsLCAkJG9yaWdpbmFsRGlyZWN0aXZlOiBvcmlnQXN5bmNEaXJlY3RpdmUKKyAgICAgICAgICB9KSwKKyAgICAgICAgICB0ZW1wbGF0ZVVybCA9IChpc0Z1bmN0aW9uKG9yaWdBc3luY0RpcmVjdGl2ZS50ZW1wbGF0ZVVybCkpCisgICAgICAgICAgICAgID8gb3JpZ0FzeW5jRGlyZWN0aXZlLnRlbXBsYXRlVXJsKCRjb21waWxlTm9kZSwgdEF0dHJzKQorICAgICAgICAgICAgICA6IG9yaWdBc3luY0RpcmVjdGl2ZS50ZW1wbGF0ZVVybCwKKyAgICAgICAgICB0ZW1wbGF0ZU5hbWVzcGFjZSA9IG9yaWdBc3luY0RpcmVjdGl2ZS50ZW1wbGF0ZU5hbWVzcGFjZTsKKworICAgICAgJGNvbXBpbGVOb2RlLmVtcHR5KCk7CisKKyAgICAgICR0ZW1wbGF0ZVJlcXVlc3QoJHNjZS5nZXRUcnVzdGVkUmVzb3VyY2VVcmwodGVtcGxhdGVVcmwpKQorICAgICAgICAudGhlbihmdW5jdGlvbihjb250ZW50KSB7CisgICAgICAgICAgdmFyIGNvbXBpbGVOb2RlLCB0ZW1wVGVtcGxhdGVBdHRycywgJHRlbXBsYXRlLCBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuOworCisgICAgICAgICAgY29udGVudCA9IGRlbm9ybWFsaXplVGVtcGxhdGUoY29udGVudCk7CisKKyAgICAgICAgICBpZiAob3JpZ0FzeW5jRGlyZWN0aXZlLnJlcGxhY2UpIHsKKyAgICAgICAgICAgIGlmIChqcUxpdGVJc1RleHROb2RlKGNvbnRlbnQpKSB7CisgICAgICAgICAgICAgICR0ZW1wbGF0ZSA9IFtdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgJHRlbXBsYXRlID0gcmVtb3ZlQ29tbWVudHMod3JhcFRlbXBsYXRlKHRlbXBsYXRlTmFtZXNwYWNlLCB0cmltKGNvbnRlbnQpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21waWxlTm9kZSA9ICR0ZW1wbGF0ZVswXTsKKworICAgICAgICAgICAgaWYgKCR0ZW1wbGF0ZS5sZW5ndGggIT0gMSB8fCBjb21waWxlTm9kZS5ub2RlVHlwZSAhPT0gTk9ERV9UWVBFX0VMRU1FTlQpIHsKKyAgICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ3RwbHJ0JywKKyAgICAgICAgICAgICAgICAgICJUZW1wbGF0ZSBmb3IgZGlyZWN0aXZlICd7MH0nIG11c3QgaGF2ZSBleGFjdGx5IG9uZSByb290IGVsZW1lbnQuIHsxfSIsCisgICAgICAgICAgICAgICAgICBvcmlnQXN5bmNEaXJlY3RpdmUubmFtZSwgdGVtcGxhdGVVcmwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wVGVtcGxhdGVBdHRycyA9IHskYXR0cjoge319OworICAgICAgICAgICAgcmVwbGFjZVdpdGgoJHJvb3RFbGVtZW50LCAkY29tcGlsZU5vZGUsIGNvbXBpbGVOb2RlKTsKKyAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURpcmVjdGl2ZXMgPSBjb2xsZWN0RGlyZWN0aXZlcyhjb21waWxlTm9kZSwgW10sIHRlbXBUZW1wbGF0ZUF0dHJzKTsKKworICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG9yaWdBc3luY0RpcmVjdGl2ZS5zY29wZSkpIHsKKyAgICAgICAgICAgICAgbWFya0RpcmVjdGl2ZXNBc0lzb2xhdGUodGVtcGxhdGVEaXJlY3RpdmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpcmVjdGl2ZXMgPSB0ZW1wbGF0ZURpcmVjdGl2ZXMuY29uY2F0KGRpcmVjdGl2ZXMpOworICAgICAgICAgICAgbWVyZ2VUZW1wbGF0ZUF0dHJpYnV0ZXModEF0dHJzLCB0ZW1wVGVtcGxhdGVBdHRycyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbXBpbGVOb2RlID0gYmVmb3JlVGVtcGxhdGVDb21waWxlTm9kZTsKKyAgICAgICAgICAgICRjb21waWxlTm9kZS5odG1sKGNvbnRlbnQpOworICAgICAgICAgIH0KKworICAgICAgICAgIGRpcmVjdGl2ZXMudW5zaGlmdChkZXJpdmVkU3luY0RpcmVjdGl2ZSk7CisKKyAgICAgICAgICBhZnRlclRlbXBsYXRlTm9kZUxpbmtGbiA9IGFwcGx5RGlyZWN0aXZlc1RvTm9kZShkaXJlY3RpdmVzLCBjb21waWxlTm9kZSwgdEF0dHJzLAorICAgICAgICAgICAgICBjaGlsZFRyYW5zY2x1ZGVGbiwgJGNvbXBpbGVOb2RlLCBvcmlnQXN5bmNEaXJlY3RpdmUsIHByZUxpbmtGbnMsIHBvc3RMaW5rRm5zLAorICAgICAgICAgICAgICBwcmV2aW91c0NvbXBpbGVDb250ZXh0KTsKKyAgICAgICAgICBmb3JFYWNoKCRyb290RWxlbWVudCwgZnVuY3Rpb24obm9kZSwgaSkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gY29tcGlsZU5vZGUpIHsKKyAgICAgICAgICAgICAgJHJvb3RFbGVtZW50W2ldID0gJGNvbXBpbGVOb2RlWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICAgIGFmdGVyVGVtcGxhdGVDaGlsZExpbmtGbiA9IGNvbXBpbGVOb2RlcygkY29tcGlsZU5vZGVbMF0uY2hpbGROb2RlcywgY2hpbGRUcmFuc2NsdWRlRm4pOworCisgICAgICAgICAgd2hpbGUgKGxpbmtRdWV1ZS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHZhciBzY29wZSA9IGxpbmtRdWV1ZS5zaGlmdCgpLAorICAgICAgICAgICAgICAgIGJlZm9yZVRlbXBsYXRlTGlua05vZGUgPSBsaW5rUXVldWUuc2hpZnQoKSwKKyAgICAgICAgICAgICAgICBsaW5rUm9vdEVsZW1lbnQgPSBsaW5rUXVldWUuc2hpZnQoKSwKKyAgICAgICAgICAgICAgICBib3VuZFRyYW5zY2x1ZGVGbiA9IGxpbmtRdWV1ZS5zaGlmdCgpLAorICAgICAgICAgICAgICAgIGxpbmtOb2RlID0gJGNvbXBpbGVOb2RlWzBdOworCisgICAgICAgICAgICBpZiAoc2NvcGUuJCRkZXN0cm95ZWQpIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoYmVmb3JlVGVtcGxhdGVMaW5rTm9kZSAhPT0gYmVmb3JlVGVtcGxhdGVDb21waWxlTm9kZSkgeworICAgICAgICAgICAgICB2YXIgb2xkQ2xhc3NlcyA9IGJlZm9yZVRlbXBsYXRlTGlua05vZGUuY2xhc3NOYW1lOworCisgICAgICAgICAgICAgIGlmICghKHByZXZpb3VzQ29tcGlsZUNvbnRleHQuaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmUgJiYKKyAgICAgICAgICAgICAgICAgIG9yaWdBc3luY0RpcmVjdGl2ZS5yZXBsYWNlKSkgeworICAgICAgICAgICAgICAgIC8vIGl0IHdhcyBjbG9uZWQgdGhlcmVmb3JlIHdlIGhhdmUgdG8gY2xvbmUgYXMgd2VsbC4KKyAgICAgICAgICAgICAgICBsaW5rTm9kZSA9IGpxTGl0ZUNsb25lKGNvbXBpbGVOb2RlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICByZXBsYWNlV2l0aChsaW5rUm9vdEVsZW1lbnQsIGpxTGl0ZShiZWZvcmVUZW1wbGF0ZUxpbmtOb2RlKSwgbGlua05vZGUpOworCisgICAgICAgICAgICAgIC8vIENvcHkgaW4gQ1NTIGNsYXNzZXMgZnJvbSBvcmlnaW5hbCBub2RlCisgICAgICAgICAgICAgIHNhZmVBZGRDbGFzcyhqcUxpdGUobGlua05vZGUpLCBvbGRDbGFzc2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZnRlclRlbXBsYXRlTm9kZUxpbmtGbi50cmFuc2NsdWRlT25UaGlzRWxlbWVudCkgeworICAgICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuID0gY3JlYXRlQm91bmRUcmFuc2NsdWRlRm4oc2NvcGUsIGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuLnRyYW5zY2x1ZGUsIGJvdW5kVHJhbnNjbHVkZUZuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4gPSBib3VuZFRyYW5zY2x1ZGVGbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuKGFmdGVyVGVtcGxhdGVDaGlsZExpbmtGbiwgc2NvcGUsIGxpbmtOb2RlLCAkcm9vdEVsZW1lbnQsCisgICAgICAgICAgICAgIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4pOworICAgICAgICAgIH0KKyAgICAgICAgICBsaW5rUXVldWUgPSBudWxsOworICAgICAgICB9KTsKKworICAgICAgcmV0dXJuIGZ1bmN0aW9uIGRlbGF5ZWROb2RlTGlua0ZuKGlnbm9yZUNoaWxkTGlua0ZuLCBzY29wZSwgbm9kZSwgcm9vdEVsZW1lbnQsIGJvdW5kVHJhbnNjbHVkZUZuKSB7CisgICAgICAgIHZhciBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuID0gYm91bmRUcmFuc2NsdWRlRm47CisgICAgICAgIGlmIChzY29wZS4kJGRlc3Ryb3llZCkgcmV0dXJuOworICAgICAgICBpZiAobGlua1F1ZXVlKSB7CisgICAgICAgICAgbGlua1F1ZXVlLnB1c2goc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4udHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQpIHsKKyAgICAgICAgICAgIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4gPSBjcmVhdGVCb3VuZFRyYW5zY2x1ZGVGbihzY29wZSwgYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4udHJhbnNjbHVkZSwgYm91bmRUcmFuc2NsdWRlRm4pOworICAgICAgICAgIH0KKyAgICAgICAgICBhZnRlclRlbXBsYXRlTm9kZUxpbmtGbihhZnRlclRlbXBsYXRlQ2hpbGRMaW5rRm4sIHNjb3BlLCBub2RlLCByb290RWxlbWVudCwgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbik7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTb3J0aW5nIGZ1bmN0aW9uIGZvciBib3VuZCBkaXJlY3RpdmVzLgorICAgICAqLworICAgIGZ1bmN0aW9uIGJ5UHJpb3JpdHkoYSwgYikgeworICAgICAgdmFyIGRpZmYgPSBiLnByaW9yaXR5IC0gYS5wcmlvcml0eTsKKyAgICAgIGlmIChkaWZmICE9PSAwKSByZXR1cm4gZGlmZjsKKyAgICAgIGlmIChhLm5hbWUgIT09IGIubmFtZSkgcmV0dXJuIChhLm5hbWUgPCBiLm5hbWUpID8gLTEgOiAxOworICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4OworICAgIH0KKworCisgICAgZnVuY3Rpb24gYXNzZXJ0Tm9EdXBsaWNhdGUod2hhdCwgcHJldmlvdXNEaXJlY3RpdmUsIGRpcmVjdGl2ZSwgZWxlbWVudCkgeworICAgICAgaWYgKHByZXZpb3VzRGlyZWN0aXZlKSB7CisgICAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCdtdWx0aWRpcicsICdNdWx0aXBsZSBkaXJlY3RpdmVzIFt7MH0sIHsxfV0gYXNraW5nIGZvciB7Mn0gb246IHszfScsCisgICAgICAgICAgICBwcmV2aW91c0RpcmVjdGl2ZS5uYW1lLCBkaXJlY3RpdmUubmFtZSwgd2hhdCwgc3RhcnRpbmdUYWcoZWxlbWVudCkpOworICAgICAgfQorICAgIH0KKworCisgICAgZnVuY3Rpb24gYWRkVGV4dEludGVycG9sYXRlRGlyZWN0aXZlKGRpcmVjdGl2ZXMsIHRleHQpIHsKKyAgICAgIHZhciBpbnRlcnBvbGF0ZUZuID0gJGludGVycG9sYXRlKHRleHQsIHRydWUpOworICAgICAgaWYgKGludGVycG9sYXRlRm4pIHsKKyAgICAgICAgZGlyZWN0aXZlcy5wdXNoKHsKKyAgICAgICAgICBwcmlvcml0eTogMCwKKyAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGVDb21waWxlRm4odGVtcGxhdGVOb2RlKSB7CisgICAgICAgICAgICB2YXIgdGVtcGxhdGVOb2RlUGFyZW50ID0gdGVtcGxhdGVOb2RlLnBhcmVudCgpLAorICAgICAgICAgICAgICAgIGhhc0NvbXBpbGVQYXJlbnQgPSAhIXRlbXBsYXRlTm9kZVBhcmVudC5sZW5ndGg7CisKKyAgICAgICAgICAgIC8vIFdoZW4gdHJhbnNjbHVkaW5nIGEgdGVtcGxhdGUgdGhhdCBoYXMgYmluZGluZ3MgaW4gdGhlIHJvb3QKKyAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgYSBwYXJlbnQgYW5kIHRodXMgbmVlZCB0byBhZGQgdGhlIGNsYXNzIGR1cmluZyBsaW5raW5nIGZuLgorICAgICAgICAgICAgaWYgKGhhc0NvbXBpbGVQYXJlbnQpIGNvbXBpbGUuJCRhZGRCaW5kaW5nQ2xhc3ModGVtcGxhdGVOb2RlUGFyZW50KTsKKworICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZUxpbmtGbihzY29wZSwgbm9kZSkgeworICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQoKTsKKyAgICAgICAgICAgICAgaWYgKCFoYXNDb21waWxlUGFyZW50KSBjb21waWxlLiQkYWRkQmluZGluZ0NsYXNzKHBhcmVudCk7CisgICAgICAgICAgICAgIGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyhwYXJlbnQsIGludGVycG9sYXRlRm4uZXhwcmVzc2lvbnMpOworICAgICAgICAgICAgICBzY29wZS4kd2F0Y2goaW50ZXJwb2xhdGVGbiwgZnVuY3Rpb24gaW50ZXJwb2xhdGVGbldhdGNoQWN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgbm9kZVswXS5ub2RlVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9OworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorCisKKyAgICBmdW5jdGlvbiB3cmFwVGVtcGxhdGUodHlwZSwgdGVtcGxhdGUpIHsKKyAgICAgIHR5cGUgPSBsb3dlcmNhc2UodHlwZSB8fCAnaHRtbCcpOworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlICdzdmcnOgorICAgICAgY2FzZSAnbWF0aCc6CisgICAgICAgIHZhciB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgICAgICAgIHdyYXBwZXIuaW5uZXJIVE1MID0gJzwnICsgdHlwZSArICc+JyArIHRlbXBsYXRlICsgJzwvJyArIHR5cGUgKyAnPic7CisgICAgICAgIHJldHVybiB3cmFwcGVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2RlczsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiB0ZW1wbGF0ZTsKKyAgICAgIH0KKyAgICB9CisKKworICAgIGZ1bmN0aW9uIGdldFRydXN0ZWRDb250ZXh0KG5vZGUsIGF0dHJOb3JtYWxpemVkTmFtZSkgeworICAgICAgaWYgKGF0dHJOb3JtYWxpemVkTmFtZSA9PSAic3JjZG9jIikgeworICAgICAgICByZXR1cm4gJHNjZS5IVE1MOworICAgICAgfQorICAgICAgdmFyIHRhZyA9IG5vZGVOYW1lXyhub2RlKTsKKyAgICAgIC8vIG1hY3Rpb25beGxpbms6aHJlZl0gY2FuIHNvdXJjZSBTVkcuICBJdCdzIG5vdCBsaW1pdGVkIHRvIDxtYWN0aW9uPi4KKyAgICAgIGlmIChhdHRyTm9ybWFsaXplZE5hbWUgPT0gInhsaW5rSHJlZiIgfHwKKyAgICAgICAgICAodGFnID09ICJmb3JtIiAmJiBhdHRyTm9ybWFsaXplZE5hbWUgPT0gImFjdGlvbiIpIHx8CisgICAgICAgICAgKHRhZyAhPSAiaW1nIiAmJiAoYXR0ck5vcm1hbGl6ZWROYW1lID09ICJzcmMiIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5vcm1hbGl6ZWROYW1lID09ICJuZ1NyYyIpKSkgeworICAgICAgICByZXR1cm4gJHNjZS5SRVNPVVJDRV9VUkw7CisgICAgICB9CisgICAgfQorCisKKyAgICBmdW5jdGlvbiBhZGRBdHRySW50ZXJwb2xhdGVEaXJlY3RpdmUobm9kZSwgZGlyZWN0aXZlcywgdmFsdWUsIG5hbWUsIGFsbE9yTm90aGluZykgeworICAgICAgdmFyIHRydXN0ZWRDb250ZXh0ID0gZ2V0VHJ1c3RlZENvbnRleHQobm9kZSwgbmFtZSk7CisgICAgICBhbGxPck5vdGhpbmcgPSBBTExfT1JfTk9USElOR19BVFRSU1tuYW1lXSB8fCBhbGxPck5vdGhpbmc7CisKKyAgICAgIHZhciBpbnRlcnBvbGF0ZUZuID0gJGludGVycG9sYXRlKHZhbHVlLCB0cnVlLCB0cnVzdGVkQ29udGV4dCwgYWxsT3JOb3RoaW5nKTsKKworICAgICAgLy8gbm8gaW50ZXJwb2xhdGlvbiBmb3VuZCAtPiBpZ25vcmUKKyAgICAgIGlmICghaW50ZXJwb2xhdGVGbikgcmV0dXJuOworCisKKyAgICAgIGlmIChuYW1lID09PSAibXVsdGlwbGUiICYmIG5vZGVOYW1lXyhub2RlKSA9PT0gInNlbGVjdCIpIHsKKyAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoInNlbG11bHRpIiwKKyAgICAgICAgICAgICJCaW5kaW5nIHRvIHRoZSAnbXVsdGlwbGUnIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkLiBFbGVtZW50OiB7MH0iLAorICAgICAgICAgICAgc3RhcnRpbmdUYWcobm9kZSkpOworICAgICAgfQorCisgICAgICBkaXJlY3RpdmVzLnB1c2goeworICAgICAgICBwcmlvcml0eTogMTAwLAorICAgICAgICBjb21waWxlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgIHByZTogZnVuY3Rpb24gYXR0ckludGVycG9sYXRlUHJlTGlua0ZuKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7CisgICAgICAgICAgICAgICAgdmFyICQkb2JzZXJ2ZXJzID0gKGF0dHIuJCRvYnNlcnZlcnMgfHwgKGF0dHIuJCRvYnNlcnZlcnMgPSB7fSkpOworCisgICAgICAgICAgICAgICAgaWYgKEVWRU5UX0hBTkRMRVJfQVRUUl9SRUdFWFAudGVzdChuYW1lKSkgeworICAgICAgICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ25vZG9tZXZlbnRzJywKKyAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJwb2xhdGlvbnMgZm9yIEhUTUwgRE9NIGV2ZW50IGF0dHJpYnV0ZXMgYXJlIGRpc2FsbG93ZWQuICBQbGVhc2UgdXNlIHRoZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm5nLSB2ZXJzaW9ucyAoc3VjaCBhcyBuZy1jbGljayBpbnN0ZWFkIG9mIG9uY2xpY2spIGluc3RlYWQuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0ICRpbnRlcnBvbGF0ZSgpZWQKKyAgICAgICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBhdHRyW25hbWVdOworICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gaW50ZXJwb2xhdGUgYWdhaW4gc2luY2UgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgYmVlbiB1cGRhdGVkCisgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBieSBhbm90aGVyIGRpcmVjdGl2ZSdzIGNvbXBpbGUgZnVuY3Rpb24pCisgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdW5zZXQvZW1wdHkgdmFsdWVzIG1ha2UgaW50ZXJwb2xhdGVGbiBmYWxzeQorICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGVGbiA9IG5ld1ZhbHVlICYmICRpbnRlcnBvbGF0ZShuZXdWYWx1ZSwgdHJ1ZSwgdHJ1c3RlZENvbnRleHQsIGFsbE9yTm90aGluZyk7CisgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIGF0dHJpYnV0ZSB3YXMgdXBkYXRlZCBzbyB0aGF0IHRoZXJlIGlzIG5vIGludGVycG9sYXRpb24gZ29pbmcgb24gd2UgZG9uJ3Qgd2FudCB0bworICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGFueSBvYnNlcnZlcnMKKyAgICAgICAgICAgICAgICBpZiAoIWludGVycG9sYXRlRm4pIHJldHVybjsKKworICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgYXR0ciBvYmplY3Qgc28gdGhhdCBpdCdzIHJlYWR5IGluIGNhc2Ugd2UgbmVlZCB0aGUgdmFsdWUgZm9yIGlzb2xhdGUKKyAgICAgICAgICAgICAgICAvLyBzY29wZSBpbml0aWFsaXphdGlvbiwgb3RoZXJ3aXNlIHRoZSB2YWx1ZSB3b3VsZCBub3QgYmUgYXZhaWxhYmxlIGZyb20gaXNvbGF0ZQorICAgICAgICAgICAgICAgIC8vIGRpcmVjdGl2ZSdzIGxpbmtpbmcgZm4gZHVyaW5nIGxpbmtpbmcgcGhhc2UKKyAgICAgICAgICAgICAgICBhdHRyW25hbWVdID0gaW50ZXJwb2xhdGVGbihzY29wZSk7CisKKyAgICAgICAgICAgICAgICAoJCRvYnNlcnZlcnNbbmFtZV0gfHwgKCQkb2JzZXJ2ZXJzW25hbWVdID0gW10pKS4kJGludGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAoYXR0ci4kJG9ic2VydmVycyAmJiBhdHRyLiQkb2JzZXJ2ZXJzW25hbWVdLiQkc2NvcGUgfHwgc2NvcGUpLgorICAgICAgICAgICAgICAgICAgJHdhdGNoKGludGVycG9sYXRlRm4sIGZ1bmN0aW9uIGludGVycG9sYXRlRm5XYXRjaEFjdGlvbihuZXdWYWx1ZSwgb2xkVmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9zcGVjaWFsIGNhc2UgZm9yIGNsYXNzIGF0dHJpYnV0ZSBhZGRpdGlvbiArIHJlbW92YWwKKyAgICAgICAgICAgICAgICAgICAgLy9zbyB0aGF0IGNsYXNzIGNoYW5nZXMgY2FuIHRhcCBpbnRvIHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgLy9ob29rcyBwcm92aWRlZCBieSB0aGUgJGFuaW1hdGUgc2VydmljZS4gQmUgc3VyZSB0bworICAgICAgICAgICAgICAgICAgICAvL3NraXAgYW5pbWF0aW9ucyB3aGVuIHRoZSBmaXJzdCBkaWdlc3Qgb2NjdXJzICh3aGVuCisgICAgICAgICAgICAgICAgICAgIC8vYm90aCB0aGUgbmV3IGFuZCB0aGUgb2xkIHZhbHVlcyBhcmUgdGhlIHNhbWUpIHNpbmNlCisgICAgICAgICAgICAgICAgICAgIC8vdGhlIENTUyBjbGFzc2VzIGFyZSB0aGUgbm9uLWludGVycG9sYXRlZCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdjbGFzcycgJiYgbmV3VmFsdWUgIT0gb2xkVmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICBhdHRyLiR1cGRhdGVDbGFzcyhuZXdWYWx1ZSwgb2xkVmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgIGF0dHIuJHNldChuYW1lLCBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHNwZWNpYWwganFMaXRlLnJlcGxhY2VXaXRoLCB3aGljaCBjYW4gcmVwbGFjZSBpdGVtcyB3aGljaAorICAgICAqIGhhdmUgbm8gcGFyZW50cywgcHJvdmlkZWQgdGhhdCB0aGUgY29udGFpbmluZyBqcUxpdGUgY29sbGVjdGlvbiBpcyBwcm92aWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7SnFMaXRlPX0gJHJvb3RFbGVtZW50IFRoZSByb290IG9mIHRoZSBjb21waWxlIHRyZWUuIFVzZWQgc28gdGhhdCB3ZSBjYW4gcmVwbGFjZSBub2RlcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByb290IG9mIHRoZSB0cmVlLgorICAgICAqIEBwYXJhbSB7SnFMaXRlfSBlbGVtZW50c1RvUmVtb3ZlIFRoZSBqcUxpdGUgZWxlbWVudCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcmVwbGFjZS4gV2Uga2VlcAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzaGVsbCwgYnV0IHJlcGxhY2UgaXRzIERPTSBub2RlIHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0ge05vZGV9IG5ld05vZGUgVGhlIG5ldyBET00gbm9kZS4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiByZXBsYWNlV2l0aCgkcm9vdEVsZW1lbnQsIGVsZW1lbnRzVG9SZW1vdmUsIG5ld05vZGUpIHsKKyAgICAgIHZhciBmaXJzdEVsZW1lbnRUb1JlbW92ZSA9IGVsZW1lbnRzVG9SZW1vdmVbMF0sCisgICAgICAgICAgcmVtb3ZlQ291bnQgPSBlbGVtZW50c1RvUmVtb3ZlLmxlbmd0aCwKKyAgICAgICAgICBwYXJlbnQgPSBmaXJzdEVsZW1lbnRUb1JlbW92ZS5wYXJlbnROb2RlLAorICAgICAgICAgIGksIGlpOworCisgICAgICBpZiAoJHJvb3RFbGVtZW50KSB7CisgICAgICAgIGZvciAoaSA9IDAsIGlpID0gJHJvb3RFbGVtZW50Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICBpZiAoJHJvb3RFbGVtZW50W2ldID09IGZpcnN0RWxlbWVudFRvUmVtb3ZlKSB7CisgICAgICAgICAgICAkcm9vdEVsZW1lbnRbaSsrXSA9IG5ld05vZGU7CisgICAgICAgICAgICBmb3IgKHZhciBqID0gaSwgajIgPSBqICsgcmVtb3ZlQ291bnQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgamogPSAkcm9vdEVsZW1lbnQubGVuZ3RoOworICAgICAgICAgICAgICAgICBqIDwgamo7IGorKywgajIrKykgeworICAgICAgICAgICAgICBpZiAoajIgPCBqaikgeworICAgICAgICAgICAgICAgICRyb290RWxlbWVudFtqXSA9ICRyb290RWxlbWVudFtqMl07CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVsZXRlICRyb290RWxlbWVudFtqXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgJHJvb3RFbGVtZW50Lmxlbmd0aCAtPSByZW1vdmVDb3VudCAtIDE7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSByZXBsYWNlZCBlbGVtZW50IGlzIGFsc28gdGhlIGpRdWVyeSAuY29udGV4dCB0aGVuIHJlcGxhY2UgaXQKKyAgICAgICAgICAgIC8vIC5jb250ZXh0IGlzIGEgZGVwcmVjYXRlZCBqUXVlcnkgYXBpLCBzbyB3ZSBzaG91bGQgc2V0IGl0IG9ubHkgd2hlbiBqUXVlcnkgc2V0IGl0CisgICAgICAgICAgICAvLyBodHRwOi8vYXBpLmpxdWVyeS5jb20vY29udGV4dC8KKyAgICAgICAgICAgIGlmICgkcm9vdEVsZW1lbnQuY29udGV4dCA9PT0gZmlyc3RFbGVtZW50VG9SZW1vdmUpIHsKKyAgICAgICAgICAgICAgJHJvb3RFbGVtZW50LmNvbnRleHQgPSBuZXdOb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChwYXJlbnQpIHsKKyAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBmaXJzdEVsZW1lbnRUb1JlbW92ZSk7CisgICAgICB9CisKKyAgICAgIC8vIFRPRE8ocGVyZik6IHdoYXQncyB0aGlzIGRvY3VtZW50IGZyYWdtZW50IGZvcj8gaXMgaXQgbmVlZGVkPyBjYW4gd2UgYXQgbGVhc3QgcmV1c2UgaXQ/CisgICAgICB2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChmaXJzdEVsZW1lbnRUb1JlbW92ZSk7CisKKyAgICAgIC8vIENvcHkgb3ZlciB1c2VyIGRhdGEgKHRoYXQgaW5jbHVkZXMgQW5ndWxhcidzICRzY29wZSBldGMuKS4gRG9uJ3QgY29weSBwcml2YXRlCisgICAgICAvLyBkYXRhIGhlcmUgYmVjYXVzZSB0aGVyZSdzIG5vIHB1YmxpYyBpbnRlcmZhY2UgaW4galF1ZXJ5IHRvIGRvIHRoYXQgYW5kIGNvcHlpbmcgb3ZlcgorICAgICAgLy8gZXZlbnQgbGlzdGVuZXJzICh3aGljaCBpcyB0aGUgbWFpbiB1c2Ugb2YgcHJpdmF0ZSBkYXRhKSB3b3VsZG4ndCB3b3JrIGFueXdheS4KKyAgICAgIGpxTGl0ZShuZXdOb2RlKS5kYXRhKGpxTGl0ZShmaXJzdEVsZW1lbnRUb1JlbW92ZSkuZGF0YSgpKTsKKworICAgICAgLy8gUmVtb3ZlIGRhdGEgb2YgdGhlIHJlcGxhY2VkIGVsZW1lbnQuIFdlIGNhbm5vdCBqdXN0IGNhbGwgLnJlbW92ZSgpCisgICAgICAvLyBvbiB0aGUgZWxlbWVudCBpdCBzaW5jZSB0aGF0IHdvdWxkIGRlYWxsb2NhdGUgc2NvcGUgdGhhdCBpcyBuZWVkZWQKKyAgICAgIC8vIGZvciB0aGUgbmV3IG5vZGUuIEluc3RlYWQsIHJlbW92ZSB0aGUgZGF0YSAibWFudWFsbHkiLgorICAgICAgaWYgKCFqUXVlcnkpIHsKKyAgICAgICAgZGVsZXRlIGpxTGl0ZS5jYWNoZVtmaXJzdEVsZW1lbnRUb1JlbW92ZVtqcUxpdGUuZXhwYW5kb11dOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8galF1ZXJ5IDIueCBkb2Vzbid0IGV4cG9zZSB0aGUgZGF0YSBzdG9yYWdlLiBVc2UgalF1ZXJ5LmNsZWFuRGF0YSB0byBjbGVhbiB1cCBhZnRlcgorICAgICAgICAvLyB0aGUgcmVwbGFjZWQgZWxlbWVudC4gVGhlIGNsZWFuRGF0YSB2ZXJzaW9uIG1vbmtleS1wYXRjaGVkIGJ5IEFuZ3VsYXIgd291bGQgY2F1c2UKKyAgICAgICAgLy8gdGhlIHNjb3BlIHRvIGJlIHRyYXNoZWQgYW5kIHdlIGRvIG5lZWQgdGhlIHZlcnkgc2FtZSBzY29wZSB0byB3b3JrIHdpdGggdGhlIG5ldworICAgICAgICAvLyBlbGVtZW50LiBIb3dldmVyLCB3ZSBjYW5ub3QganVzdCBjYWNoZSB0aGUgbm9uLXBhdGNoZWQgdmVyc2lvbiBhbmQgdXNlIGl0IGhlcmUgYXMKKyAgICAgICAgLy8gdGhhdCB3b3VsZCBicmVhayBpZiBhbm90aGVyIGxpYnJhcnkgcGF0Y2hlcyB0aGUgbWV0aG9kIGFmdGVyIEFuZ3VsYXIgZG9lcyAob25lCisgICAgICAgIC8vIGV4YW1wbGUgaXMgalF1ZXJ5IFVJKS4gSW5zdGVhZCwgc2V0IGEgZmxhZyBpbmRpY2F0aW5nIHNjb3BlIGRlc3Ryb3lpbmcgc2hvdWxkIGJlCisgICAgICAgIC8vIHNraXBwZWQgdGhpcyBvbmUgdGltZS4KKyAgICAgICAgc2tpcERlc3Ryb3lPbk5leHRKUXVlcnlDbGVhbkRhdGEgPSB0cnVlOworICAgICAgICBqUXVlcnkuY2xlYW5EYXRhKFtmaXJzdEVsZW1lbnRUb1JlbW92ZV0pOworICAgICAgfQorCisgICAgICBmb3IgKHZhciBrID0gMSwga2sgPSBlbGVtZW50c1RvUmVtb3ZlLmxlbmd0aDsgayA8IGtrOyBrKyspIHsKKyAgICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50c1RvUmVtb3ZlW2tdOworICAgICAgICBqcUxpdGUoZWxlbWVudCkucmVtb3ZlKCk7IC8vIG11c3QgZG8gdGhpcyB3YXkgdG8gY2xlYW4gdXAgZXhwYW5kbworICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKKyAgICAgICAgZGVsZXRlIGVsZW1lbnRzVG9SZW1vdmVba107CisgICAgICB9CisKKyAgICAgIGVsZW1lbnRzVG9SZW1vdmVbMF0gPSBuZXdOb2RlOworICAgICAgZWxlbWVudHNUb1JlbW92ZS5sZW5ndGggPSAxOworICAgIH0KKworCisgICAgZnVuY3Rpb24gY2xvbmVBbmRBbm5vdGF0ZUZuKGZuLCBhbm5vdGF0aW9uKSB7CisgICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uKCkgeyByZXR1cm4gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfSwgZm4sIGFubm90YXRpb24pOworICAgIH0KKworCisgICAgZnVuY3Rpb24gaW52b2tlTGlua0ZuKGxpbmtGbiwgc2NvcGUsICRlbGVtZW50LCBhdHRycywgY29udHJvbGxlcnMsIHRyYW5zY2x1ZGVGbikgeworICAgICAgdHJ5IHsKKyAgICAgICAgbGlua0ZuKHNjb3BlLCAkZWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXJzLCB0cmFuc2NsdWRlRm4pOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlLCBzdGFydGluZ1RhZygkZWxlbWVudCkpOworICAgICAgfQorICAgIH0KKyAgfV07Cit9CisKK3ZhciBQUkVGSVhfUkVHRVhQID0gL14oKD86eHxkYXRhKVtcOlwtX10pL2k7CisvKioKKyAqIENvbnZlcnRzIGFsbCBhY2NlcHRlZCBkaXJlY3RpdmVzIGZvcm1hdCBpbnRvIHByb3BlciBkaXJlY3RpdmUgbmFtZS4KKyAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gbm9ybWFsaXplCisgKi8KK2Z1bmN0aW9uIGRpcmVjdGl2ZU5vcm1hbGl6ZShuYW1lKSB7CisgIHJldHVybiBjYW1lbENhc2UobmFtZS5yZXBsYWNlKFBSRUZJWF9SRUdFWFAsICcnKSk7Cit9CisKKy8qKgorICogQG5nZG9jIHR5cGUKKyAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBBIHNoYXJlZCBvYmplY3QgYmV0d2VlbiBkaXJlY3RpdmUgY29tcGlsZSAvIGxpbmtpbmcgZnVuY3Rpb25zIHdoaWNoIGNvbnRhaW5zIG5vcm1hbGl6ZWQgRE9NCisgKiBlbGVtZW50IGF0dHJpYnV0ZXMuIFRoZSB2YWx1ZXMgcmVmbGVjdCBjdXJyZW50IGJpbmRpbmcgc3RhdGUgYHt7IH19YC4gVGhlIG5vcm1hbGl6YXRpb24gaXMKKyAqIG5lZWRlZCBzaW5jZSBhbGwgb2YgdGhlc2UgYXJlIHRyZWF0ZWQgYXMgZXF1aXZhbGVudCBpbiBBbmd1bGFyOgorICoKKyAqIGBgYAorICogICAgPHNwYW4gbmc6YmluZD0iYSIgbmctYmluZD0iYSIgZGF0YS1uZy1iaW5kPSJhIiB4LW5nLWJpbmQ9ImEiPgorICogYGBgCisgKi8KKworLyoqCisgKiBAbmdkb2MgcHJvcGVydHkKKyAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRhdHRyCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBBIG1hcCBvZiBET00gZWxlbWVudCBhdHRyaWJ1dGUgbmFtZXMgdG8gdGhlIG5vcm1hbGl6ZWQgbmFtZS4gVGhpcyBpcworICogbmVlZGVkIHRvIGRvIHJldmVyc2UgbG9va3VwIGZyb20gbm9ybWFsaXplZCBuYW1lIGJhY2sgdG8gYWN0dWFsIG5hbWUuCisgKi8KKworCisvKioKKyAqIEBuZ2RvYyBtZXRob2QKKyAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRzZXQKKyAqIEBraW5kIGZ1bmN0aW9uCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBTZXQgRE9NIGVsZW1lbnQgYXR0cmlidXRlIHZhbHVlLgorICoKKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOb3JtYWxpemVkIGVsZW1lbnQgYXR0cmlidXRlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIG1vZGlmeS4gVGhlIG5hbWUgaXMKKyAqICAgICAgICAgIHJldmVyc2UtdHJhbnNsYXRlZCB1c2luZyB0aGUge0BsaW5rIG5nLiRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRhdHRyICRhdHRyfQorICogICAgICAgICAgcHJvcGVydHkgdG8gdGhlIG9yaWdpbmFsIG5hbWUuCisgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVmFsdWUgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgdG8uIFRoZSB2YWx1ZSBjYW4gYmUgYW4gaW50ZXJwb2xhdGVkIHN0cmluZy4KKyAqLworCisKKworLyoqCisgKiBDbG9zdXJlIGNvbXBpbGVyIHR5cGUgaW5mb3JtYXRpb24KKyAqLworCitmdW5jdGlvbiBub2Rlc2V0TGlua2luZ0ZuKAorICAvKiBhbmd1bGFyLlNjb3BlICovIHNjb3BlLAorICAvKiBOb2RlTGlzdCAqLyBub2RlTGlzdCwKKyAgLyogRWxlbWVudCAqLyByb290RWxlbWVudCwKKyAgLyogZnVuY3Rpb24oRnVuY3Rpb24pICovIGJvdW5kVHJhbnNjbHVkZUZuCispIHt9CisKK2Z1bmN0aW9uIGRpcmVjdGl2ZUxpbmtpbmdGbigKKyAgLyogbm9kZXNldExpbmtpbmdGbiAqLyBub2Rlc2V0TGlua2luZ0ZuLAorICAvKiBhbmd1bGFyLlNjb3BlICovIHNjb3BlLAorICAvKiBOb2RlICovIG5vZGUsCisgIC8qIEVsZW1lbnQgKi8gcm9vdEVsZW1lbnQsCisgIC8qIGZ1bmN0aW9uKEZ1bmN0aW9uKSAqLyBib3VuZFRyYW5zY2x1ZGVGbgorKSB7fQorCitmdW5jdGlvbiB0b2tlbkRpZmZlcmVuY2Uoc3RyMSwgc3RyMikgeworICB2YXIgdmFsdWVzID0gJycsCisgICAgICB0b2tlbnMxID0gc3RyMS5zcGxpdCgvXHMrLyksCisgICAgICB0b2tlbnMyID0gc3RyMi5zcGxpdCgvXHMrLyk7CisKKyAgb3V0ZXI6CisgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zMS5sZW5ndGg7IGkrKykgeworICAgIHZhciB0b2tlbiA9IHRva2VuczFbaV07CisgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0b2tlbnMyLmxlbmd0aDsgaisrKSB7CisgICAgICBpZiAodG9rZW4gPT0gdG9rZW5zMltqXSkgY29udGludWUgb3V0ZXI7CisgICAgfQorICAgIHZhbHVlcyArPSAodmFsdWVzLmxlbmd0aCA+IDAgPyAnICcgOiAnJykgKyB0b2tlbjsKKyAgfQorICByZXR1cm4gdmFsdWVzOworfQorCitmdW5jdGlvbiByZW1vdmVDb21tZW50cyhqcU5vZGVzKSB7CisgIGpxTm9kZXMgPSBqcUxpdGUoanFOb2Rlcyk7CisgIHZhciBpID0ganFOb2Rlcy5sZW5ndGg7CisKKyAgaWYgKGkgPD0gMSkgeworICAgIHJldHVybiBqcU5vZGVzOworICB9CisKKyAgd2hpbGUgKGktLSkgeworICAgIHZhciBub2RlID0ganFOb2Rlc1tpXTsKKyAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0NPTU1FTlQpIHsKKyAgICAgIHNwbGljZS5jYWxsKGpxTm9kZXMsIGksIDEpOworICAgIH0KKyAgfQorICByZXR1cm4ganFOb2RlczsKK30KKworLyoqCisgKiBAbmdkb2MgcHJvdmlkZXIKKyAqIEBuYW1lICRjb250cm9sbGVyUHJvdmlkZXIKKyAqIEBkZXNjcmlwdGlvbgorICogVGhlIHtAbGluayBuZy4kY29udHJvbGxlciAkY29udHJvbGxlciBzZXJ2aWNlfSBpcyB1c2VkIGJ5IEFuZ3VsYXIgdG8gY3JlYXRlIG5ldworICogY29udHJvbGxlcnMuCisgKgorICogVGhpcyBwcm92aWRlciBhbGxvd3MgY29udHJvbGxlciByZWdpc3RyYXRpb24gdmlhIHRoZQorICoge0BsaW5rIG5nLiRjb250cm9sbGVyUHJvdmlkZXIjcmVnaXN0ZXIgcmVnaXN0ZXJ9IG1ldGhvZC4KKyAqLworZnVuY3Rpb24gJENvbnRyb2xsZXJQcm92aWRlcigpIHsKKyAgdmFyIGNvbnRyb2xsZXJzID0ge30sCisgICAgICBnbG9iYWxzID0gZmFsc2UsCisgICAgICBDTlRSTF9SRUcgPSAvXihcUyspKFxzK2FzXHMrKFx3KykpPyQvOworCisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgJGNvbnRyb2xsZXJQcm92aWRlciNyZWdpc3RlcgorICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWUgQ29udHJvbGxlciBuYW1lLCBvciBhbiBvYmplY3QgbWFwIG9mIGNvbnRyb2xsZXJzIHdoZXJlIHRoZSBrZXlzIGFyZQorICAgKiAgICB0aGUgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBjb25zdHJ1Y3RvcnMuCisgICAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXl9IGNvbnN0cnVjdG9yIENvbnRyb2xsZXIgY29uc3RydWN0b3IgZm4gKG9wdGlvbmFsbHkgZGVjb3JhdGVkIHdpdGggREkKKyAgICogICAgYW5ub3RhdGlvbnMgaW4gdGhlIGFycmF5IG5vdGF0aW9uKS4KKyAgICovCisgIHRoaXMucmVnaXN0ZXIgPSBmdW5jdGlvbihuYW1lLCBjb25zdHJ1Y3RvcikgeworICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KG5hbWUsICdjb250cm9sbGVyJyk7CisgICAgaWYgKGlzT2JqZWN0KG5hbWUpKSB7CisgICAgICBleHRlbmQoY29udHJvbGxlcnMsIG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBjb250cm9sbGVyc1tuYW1lXSA9IGNvbnN0cnVjdG9yOworICAgIH0KKyAgfTsKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAkY29udHJvbGxlclByb3ZpZGVyI2FsbG93R2xvYmFscworICAgKiBAZGVzY3JpcHRpb24gSWYgY2FsbGVkLCBhbGxvd3MgYCRjb250cm9sbGVyYCB0byBmaW5kIGNvbnRyb2xsZXIgY29uc3RydWN0b3JzIG9uIGB3aW5kb3dgCisgICAqLworICB0aGlzLmFsbG93R2xvYmFscyA9IGZ1bmN0aW9uKCkgeworICAgIGdsb2JhbHMgPSB0cnVlOworICB9OworCisKKyAgdGhpcy4kZ2V0ID0gWyckaW5qZWN0b3InLCAnJHdpbmRvdycsIGZ1bmN0aW9uKCRpbmplY3RvciwgJHdpbmRvdykgeworCisgICAgLyoqCisgICAgICogQG5nZG9jIHNlcnZpY2UKKyAgICAgKiBAbmFtZSAkY29udHJvbGxlcgorICAgICAqIEByZXF1aXJlcyAkaW5qZWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBjb25zdHJ1Y3RvciBJZiBjYWxsZWQgd2l0aCBhIGZ1bmN0aW9uIHRoZW4gaXQncyBjb25zaWRlcmVkIHRvIGJlIHRoZQorICAgICAqICAgIGNvbnRyb2xsZXIgY29uc3RydWN0b3IgZnVuY3Rpb24uIE90aGVyd2lzZSBpdCdzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdHJpbmcgd2hpY2ggaXMgdXNlZAorICAgICAqICAgIHRvIHJldHJpZXZlIHRoZSBjb250cm9sbGVyIGNvbnN0cnVjdG9yIHVzaW5nIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAgICoKKyAgICAgKiAgICAqIGNoZWNrIGlmIGEgY29udHJvbGxlciB3aXRoIGdpdmVuIG5hbWUgaXMgcmVnaXN0ZXJlZCB2aWEgYCRjb250cm9sbGVyUHJvdmlkZXJgCisgICAgICogICAgKiBjaGVjayBpZiBldmFsdWF0aW5nIHRoZSBzdHJpbmcgb24gdGhlIGN1cnJlbnQgc2NvcGUgcmV0dXJucyBhIGNvbnN0cnVjdG9yCisgICAgICogICAgKiBpZiAkY29udHJvbGxlclByb3ZpZGVyI2FsbG93R2xvYmFscywgY2hlY2sgYHdpbmRvd1tjb25zdHJ1Y3Rvcl1gIG9uIHRoZSBnbG9iYWwKKyAgICAgKiAgICAgIGB3aW5kb3dgIG9iamVjdCAobm90IHJlY29tbWVuZGVkKQorICAgICAqCisgICAgICogICAgVGhlIHN0cmluZyBjYW4gdXNlIHRoZSBgY29udHJvbGxlciBhcyBwcm9wZXJ0eWAgc3ludGF4LCB3aGVyZSB0aGUgY29udHJvbGxlciBpbnN0YW5jZSBpcyBwdWJsaXNoZWQKKyAgICAgKiAgICBhcyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG9uIHRoZSBgc2NvcGVgOyB0aGUgYHNjb3BlYCBtdXN0IGJlIGluamVjdGVkIGludG8gYGxvY2Fsc2AgcGFyYW0gZm9yIHRoaXMKKyAgICAgKiAgICB0byB3b3JrIGNvcnJlY3RseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsb2NhbHMgSW5qZWN0aW9uIGxvY2FscyBmb3IgQ29udHJvbGxlci4KKyAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEluc3RhbmNlIG9mIGdpdmVuIGNvbnRyb2xsZXIuCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBgJGNvbnRyb2xsZXJgIHNlcnZpY2UgaXMgcmVzcG9uc2libGUgZm9yIGluc3RhbnRpYXRpbmcgY29udHJvbGxlcnMuCisgICAgICoKKyAgICAgKiBJdCdzIGp1c3QgYSBzaW1wbGUgY2FsbCB0byB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfSwgYnV0IGV4dHJhY3RlZCBpbnRvCisgICAgICogYSBzZXJ2aWNlLCBzbyB0aGF0IG9uZSBjYW4gb3ZlcnJpZGUgdGhpcyBzZXJ2aWNlIHdpdGggW0JDIHZlcnNpb25dKGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLzE2NDk3ODgpLgorICAgICAqLworICAgIHJldHVybiBmdW5jdGlvbihleHByZXNzaW9uLCBsb2NhbHMsIGxhdGVyLCBpZGVudCkgeworICAgICAgLy8gUFJJVkFURSBBUEk6CisgICAgICAvLyAgIHBhcmFtIGBsYXRlcmAgLS0tIGluZGljYXRlcyB0aGF0IHRoZSBjb250cm9sbGVyJ3MgY29uc3RydWN0b3IgaXMgaW52b2tlZCBhdCBhIGxhdGVyIHRpbWUuCisgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIElmIHRydWUsICRjb250cm9sbGVyIHdpbGwgYWxsb2NhdGUgdGhlIG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0CisgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZSBjaGFpbiwgYnV0IHdpbGwgbm90IGludm9rZSB0aGUgY29udHJvbGxlciB1bnRpbCBhIHJldHVybmVkCisgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrIGlzIGludm9rZWQuCisgICAgICAvLyAgIHBhcmFtIGBpZGVudGAgLS0tIEFuIG9wdGlvbmFsIGxhYmVsIHdoaWNoIG92ZXJyaWRlcyB0aGUgbGFiZWwgcGFyc2VkIGZyb20gdGhlIGNvbnRyb2xsZXIKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwgaWYgYW55LgorICAgICAgdmFyIGluc3RhbmNlLCBtYXRjaCwgY29uc3RydWN0b3IsIGlkZW50aWZpZXI7CisgICAgICBsYXRlciA9IGxhdGVyID09PSB0cnVlOworICAgICAgaWYgKGlkZW50ICYmIGlzU3RyaW5nKGlkZW50KSkgeworICAgICAgICBpZGVudGlmaWVyID0gaWRlbnQ7CisgICAgICB9CisKKyAgICAgIGlmIChpc1N0cmluZyhleHByZXNzaW9uKSkgeworICAgICAgICBtYXRjaCA9IGV4cHJlc3Npb24ubWF0Y2goQ05UUkxfUkVHKSwKKyAgICAgICAgY29uc3RydWN0b3IgPSBtYXRjaFsxXSwKKyAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXIgfHwgbWF0Y2hbM107CisgICAgICAgIGV4cHJlc3Npb24gPSBjb250cm9sbGVycy5oYXNPd25Qcm9wZXJ0eShjb25zdHJ1Y3RvcikKKyAgICAgICAgICAgID8gY29udHJvbGxlcnNbY29uc3RydWN0b3JdCisgICAgICAgICAgICA6IGdldHRlcihsb2NhbHMuJHNjb3BlLCBjb25zdHJ1Y3RvciwgdHJ1ZSkgfHwKKyAgICAgICAgICAgICAgICAoZ2xvYmFscyA/IGdldHRlcigkd2luZG93LCBjb25zdHJ1Y3RvciwgdHJ1ZSkgOiB1bmRlZmluZWQpOworCisgICAgICAgIGFzc2VydEFyZ0ZuKGV4cHJlc3Npb24sIGNvbnN0cnVjdG9yLCB0cnVlKTsKKyAgICAgIH0KKworICAgICAgaWYgKGxhdGVyKSB7CisgICAgICAgIC8vIEluc3RhbnRpYXRlIGNvbnRyb2xsZXIgbGF0ZXI6CisgICAgICAgIC8vIFRoaXMgbWFjaGluZXJ5IGlzIHVzZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBvYmplY3QgYmVmb3JlIGNhbGxpbmcgdGhlCisgICAgICAgIC8vIGNvbnRyb2xsZXIncyBjb25zdHJ1Y3RvciBpdHNlbGYuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgYWxsb3dzIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbnRyb2xsZXIgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBpcworICAgICAgICAvLyBpbnZva2VkLiBQcmltYXJpbHksIHRoaXMgaXMgdXNlZCBmb3IgaXNvbGF0ZSBzY29wZSBiaW5kaW5ncyBpbiAkY29tcGlsZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBmZWF0dXJlIGlzIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucywgYW5kIGlzIHRodXMgbm90IGRvY3VtZW50ZWQKKyAgICAgICAgLy8gcHVibGljbHkuCisgICAgICAgIC8vIE9iamVjdCBjcmVhdGlvbjogaHR0cDovL2pzcGVyZi5jb20vY3JlYXRlLWNvbnN0cnVjdG9yLzIKKyAgICAgICAgdmFyIGNvbnRyb2xsZXJQcm90b3R5cGUgPSAoaXNBcnJheShleHByZXNzaW9uKSA/CisgICAgICAgICAgZXhwcmVzc2lvbltleHByZXNzaW9uLmxlbmd0aCAtIDFdIDogZXhwcmVzc2lvbikucHJvdG90eXBlOworICAgICAgICBpbnN0YW5jZSA9IE9iamVjdC5jcmVhdGUoY29udHJvbGxlclByb3RvdHlwZSk7CisKKyAgICAgICAgaWYgKGlkZW50aWZpZXIpIHsKKyAgICAgICAgICBhZGRJZGVudGlmaWVyKGxvY2FscywgaWRlbnRpZmllciwgaW5zdGFuY2UsIGNvbnN0cnVjdG9yIHx8IGV4cHJlc3Npb24ubmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uKCkgeworICAgICAgICAgICRpbmplY3Rvci5pbnZva2UoZXhwcmVzc2lvbiwgaW5zdGFuY2UsIGxvY2FscywgY29uc3RydWN0b3IpOworICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICAgICAgfSwgeworICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSwKKyAgICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyCisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBpbnN0YW5jZSA9ICRpbmplY3Rvci5pbnN0YW50aWF0ZShleHByZXNzaW9uLCBsb2NhbHMsIGNvbnN0cnVjdG9yKTsKKworICAgICAgaWYgKGlkZW50aWZpZXIpIHsKKyAgICAgICAgYWRkSWRlbnRpZmllcihsb2NhbHMsIGlkZW50aWZpZXIsIGluc3RhbmNlLCBjb25zdHJ1Y3RvciB8fCBleHByZXNzaW9uLm5hbWUpOworICAgICAgfQorCisgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfTsKKworICAgIGZ1bmN0aW9uIGFkZElkZW50aWZpZXIobG9jYWxzLCBpZGVudGlmaWVyLCBpbnN0YW5jZSwgbmFtZSkgeworICAgICAgaWYgKCEobG9jYWxzICYmIGlzT2JqZWN0KGxvY2Fscy4kc2NvcGUpKSkgeworICAgICAgICB0aHJvdyBtaW5FcnIoJyRjb250cm9sbGVyJykoJ25vc2NwJywKKyAgICAgICAgICAiQ2Fubm90IGV4cG9ydCBjb250cm9sbGVyICd7MH0nIGFzICd7MX0nISBObyAkc2NvcGUgb2JqZWN0IHByb3ZpZGVkIHZpYSBgbG9jYWxzYC4iLAorICAgICAgICAgIG5hbWUsIGlkZW50aWZpZXIpOworICAgICAgfQorCisgICAgICBsb2NhbHMuJHNjb3BlW2lkZW50aWZpZXJdID0gaW5zdGFuY2U7CisgICAgfQorICB9XTsKK30KKworLyoqCisgKiBAbmdkb2Mgc2VydmljZQorICogQG5hbWUgJGRvY3VtZW50CisgKiBAcmVxdWlyZXMgJHdpbmRvdworICoKKyAqIEBkZXNjcmlwdGlvbgorICogQSB7QGxpbmsgYW5ndWxhci5lbGVtZW50IGpRdWVyeSBvciBqcUxpdGV9IHdyYXBwZXIgZm9yIHRoZSBicm93c2VyJ3MgYHdpbmRvdy5kb2N1bWVudGAgb2JqZWN0LgorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZSBtb2R1bGU9ImRvY3VtZW50RXhhbXBsZSI+CisgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgICAgPHA+JGRvY3VtZW50IHRpdGxlOiA8YiBuZy1iaW5kPSJ0aXRsZSI+PC9iPjwvcD4KKyAgICAgICAgIDxwPndpbmRvdy5kb2N1bWVudCB0aXRsZTogPGIgbmctYmluZD0id2luZG93VGl0bGUiPjwvYj48L3A+CisgICAgICAgPC9kaXY+CisgICAgIDwvZmlsZT4KKyAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KKyAgICAgICBhbmd1bGFyLm1vZHVsZSgnZG9jdW1lbnRFeGFtcGxlJywgW10pCisgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsICckZG9jdW1lbnQnLCBmdW5jdGlvbigkc2NvcGUsICRkb2N1bWVudCkgeworICAgICAgICAgICAkc2NvcGUudGl0bGUgPSAkZG9jdW1lbnRbMF0udGl0bGU7CisgICAgICAgICAgICRzY29wZS53aW5kb3dUaXRsZSA9IGFuZ3VsYXIuZWxlbWVudCh3aW5kb3cuZG9jdW1lbnQpWzBdLnRpdGxlOworICAgICAgICAgfV0pOworICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisgKi8KK2Z1bmN0aW9uICREb2N1bWVudFByb3ZpZGVyKCkgeworICB0aGlzLiRnZXQgPSBbJyR3aW5kb3cnLCBmdW5jdGlvbih3aW5kb3cpIHsKKyAgICByZXR1cm4ganFMaXRlKHdpbmRvdy5kb2N1bWVudCk7CisgIH1dOworfQorCisvKioKKyAqIEBuZ2RvYyBzZXJ2aWNlCisgKiBAbmFtZSAkZXhjZXB0aW9uSGFuZGxlcgorICogQHJlcXVpcmVzIG5nLiRsb2cKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIEFueSB1bmNhdWdodCBleGNlcHRpb24gaW4gYW5ndWxhciBleHByZXNzaW9ucyBpcyBkZWxlZ2F0ZWQgdG8gdGhpcyBzZXJ2aWNlLgorICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGRlbGVnYXRlcyB0byBgJGxvZy5lcnJvcmAgd2hpY2ggbG9ncyBpdCBpbnRvCisgKiB0aGUgYnJvd3NlciBjb25zb2xlLgorICoKKyAqIEluIHVuaXQgdGVzdHMsIGlmIGBhbmd1bGFyLW1vY2tzLmpzYCBpcyBsb2FkZWQsIHRoaXMgc2VydmljZSBpcyBvdmVycmlkZGVuIGJ5CisgKiB7QGxpbmsgbmdNb2NrLiRleGNlcHRpb25IYW5kbGVyIG1vY2sgJGV4Y2VwdGlvbkhhbmRsZXJ9IHdoaWNoIGFpZHMgaW4gdGVzdGluZy4KKyAqCisgKiAjIyBFeGFtcGxlOgorICoKKyAqIGBgYGpzCisgKiAgIGFuZ3VsYXIubW9kdWxlKCdleGNlcHRpb25PdmVycmlkZScsIFtdKS5mYWN0b3J5KCckZXhjZXB0aW9uSGFuZGxlcicsIGZ1bmN0aW9uKCkgeworICogICAgIHJldHVybiBmdW5jdGlvbihleGNlcHRpb24sIGNhdXNlKSB7CisgKiAgICAgICBleGNlcHRpb24ubWVzc2FnZSArPSAnIChjYXVzZWQgYnkgIicgKyBjYXVzZSArICciKSc7CisgKiAgICAgICB0aHJvdyBleGNlcHRpb247CisgKiAgICAgfTsKKyAqICAgfSk7CisgKiBgYGAKKyAqCisgKiBUaGlzIGV4YW1wbGUgd2lsbCBvdmVycmlkZSB0aGUgbm9ybWFsIGFjdGlvbiBvZiBgJGV4Y2VwdGlvbkhhbmRsZXJgLCB0byBtYWtlIGFuZ3VsYXIKKyAqIGV4Y2VwdGlvbnMgZmFpbCBoYXJkIHdoZW4gdGhleSBoYXBwZW4sIGluc3RlYWQgb2YganVzdCBsb2dnaW5nIHRvIHRoZSBjb25zb2xlLgorICoKKyAqIDxociAvPgorICogTm90ZSwgdGhhdCBjb2RlIGV4ZWN1dGVkIGluIGV2ZW50LWxpc3RlbmVycyAoZXZlbiB0aG9zZSByZWdpc3RlcmVkIHVzaW5nIGpxTGl0ZSdzIGBvbmAvYGJpbmRgCisgKiBtZXRob2RzKSBkb2VzIG5vdCBkZWxlZ2F0ZSBleGNlcHRpb25zIHRvIHRoZSB7QGxpbmsgbmcuJGV4Y2VwdGlvbkhhbmRsZXIgJGV4Y2VwdGlvbkhhbmRsZXJ9CisgKiAodW5sZXNzIGV4ZWN1dGVkIGR1cmluZyBhIGRpZ2VzdCkuCisgKgorICogSWYgeW91IHdpc2gsIHlvdSBjYW4gbWFudWFsbHkgZGVsZWdhdGUgZXhjZXB0aW9ucywgZS5nLgorICogYHRyeSB7IC4uLiB9IGNhdGNoKGUpIHsgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7IH1gCisgKgorICogQHBhcmFtIHtFcnJvcn0gZXhjZXB0aW9uIEV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgorICogQHBhcmFtIHtzdHJpbmc9fSBjYXVzZSBvcHRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udGV4dCBpbiB3aGljaAorICogICAgICAgdGhlIGVycm9yIHdhcyB0aHJvd24uCisgKgorICovCitmdW5jdGlvbiAkRXhjZXB0aW9uSGFuZGxlclByb3ZpZGVyKCkgeworICB0aGlzLiRnZXQgPSBbJyRsb2cnLCBmdW5jdGlvbigkbG9nKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uKGV4Y2VwdGlvbiwgY2F1c2UpIHsKKyAgICAgICRsb2cuZXJyb3IuYXBwbHkoJGxvZywgYXJndW1lbnRzKTsKKyAgICB9OworICB9XTsKK30KKwordmFyIEFQUExJQ0FUSU9OX0pTT04gPSAnYXBwbGljYXRpb24vanNvbic7Cit2YXIgQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0pTT04gPSB7J0NvbnRlbnQtVHlwZSc6IEFQUExJQ0FUSU9OX0pTT04gKyAnO2NoYXJzZXQ9dXRmLTgnfTsKK3ZhciBKU09OX1NUQVJUID0gL15cW3xeXHsoPyFceykvOwordmFyIEpTT05fRU5EUyA9IHsKKyAgJ1snOiAvXSQvLAorICAneyc6IC99JC8KK307Cit2YXIgSlNPTl9QUk9URUNUSU9OX1BSRUZJWCA9IC9eXClcXVx9Jyw/XG4vOworCitmdW5jdGlvbiBkZWZhdWx0SHR0cFJlc3BvbnNlVHJhbnNmb3JtKGRhdGEsIGhlYWRlcnMpIHsKKyAgaWYgKGlzU3RyaW5nKGRhdGEpKSB7CisgICAgLy8gU3RyaXAganNvbiB2dWxuZXJhYmlsaXR5IHByb3RlY3Rpb24gcHJlZml4IGFuZCB0cmltIHdoaXRlc3BhY2UKKyAgICB2YXIgdGVtcERhdGEgPSBkYXRhLnJlcGxhY2UoSlNPTl9QUk9URUNUSU9OX1BSRUZJWCwgJycpLnRyaW0oKTsKKworICAgIGlmICh0ZW1wRGF0YSkgeworICAgICAgdmFyIGNvbnRlbnRUeXBlID0gaGVhZGVycygnQ29udGVudC1UeXBlJyk7CisgICAgICBpZiAoKGNvbnRlbnRUeXBlICYmIChjb250ZW50VHlwZS5pbmRleE9mKEFQUExJQ0FUSU9OX0pTT04pID09PSAwKSkgfHwgaXNKc29uTGlrZSh0ZW1wRGF0YSkpIHsKKyAgICAgICAgZGF0YSA9IGZyb21Kc29uKHRlbXBEYXRhKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gZGF0YTsKK30KKworZnVuY3Rpb24gaXNKc29uTGlrZShzdHIpIHsKKyAgICB2YXIganNvblN0YXJ0ID0gc3RyLm1hdGNoKEpTT05fU1RBUlQpOworICAgIHJldHVybiBqc29uU3RhcnQgJiYgSlNPTl9FTkRTW2pzb25TdGFydFswXV0udGVzdChzdHIpOworfQorCisvKioKKyAqIFBhcnNlIGhlYWRlcnMgaW50byBrZXkgdmFsdWUgb2JqZWN0CisgKgorICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlcnMgUmF3IGhlYWRlcnMgYXMgYSBzdHJpbmcKKyAqIEByZXR1cm5zIHtPYmplY3R9IFBhcnNlZCBoZWFkZXJzIGFzIGtleSB2YWx1ZSBvYmplY3QKKyAqLworZnVuY3Rpb24gcGFyc2VIZWFkZXJzKGhlYWRlcnMpIHsKKyAgdmFyIHBhcnNlZCA9IGNyZWF0ZU1hcCgpLCBrZXksIHZhbCwgaTsKKworICBpZiAoIWhlYWRlcnMpIHJldHVybiBwYXJzZWQ7CisKKyAgZm9yRWFjaChoZWFkZXJzLnNwbGl0KCdcbicpLCBmdW5jdGlvbihsaW5lKSB7CisgICAgaSA9IGxpbmUuaW5kZXhPZignOicpOworICAgIGtleSA9IGxvd2VyY2FzZSh0cmltKGxpbmUuc3Vic3RyKDAsIGkpKSk7CisgICAgdmFsID0gdHJpbShsaW5lLnN1YnN0cihpICsgMSkpOworCisgICAgaWYgKGtleSkgeworICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDsKKyAgICB9CisgIH0pOworCisgIHJldHVybiBwYXJzZWQ7Cit9CisKKworLyoqCisgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gcGFyc2VkIGhlYWRlcnMuCisgKgorICogSGVhZGVycyBhcmUgbGF6eSBwYXJzZWQgd2hlbiBmaXJzdCByZXF1ZXN0ZWQuCisgKiBAc2VlIHBhcnNlSGVhZGVycworICoKKyAqIEBwYXJhbSB7KHN0cmluZ3xPYmplY3QpfSBoZWFkZXJzIEhlYWRlcnMgdG8gcHJvdmlkZSBhY2Nlc3MgdG8uCisgKiBAcmV0dXJucyB7ZnVuY3Rpb24oc3RyaW5nPSl9IFJldHVybnMgYSBnZXR0ZXIgZnVuY3Rpb24gd2hpY2ggaWYgY2FsbGVkIHdpdGg6CisgKgorICogICAtIGlmIGNhbGxlZCB3aXRoIHNpbmdsZSBhbiBhcmd1bWVudCByZXR1cm5zIGEgc2luZ2xlIGhlYWRlciB2YWx1ZSBvciBudWxsCisgKiAgIC0gaWYgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGhlYWRlcnMuCisgKi8KK2Z1bmN0aW9uIGhlYWRlcnNHZXR0ZXIoaGVhZGVycykgeworICB2YXIgaGVhZGVyc09iaiA9IGlzT2JqZWN0KGhlYWRlcnMpID8gaGVhZGVycyA6IHVuZGVmaW5lZDsKKworICByZXR1cm4gZnVuY3Rpb24obmFtZSkgeworICAgIGlmICghaGVhZGVyc09iaikgaGVhZGVyc09iaiA9ICBwYXJzZUhlYWRlcnMoaGVhZGVycyk7CisKKyAgICBpZiAobmFtZSkgeworICAgICAgdmFyIHZhbHVlID0gaGVhZGVyc09ialtsb3dlcmNhc2UobmFtZSldOworICAgICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHsKKyAgICAgICAgdmFsdWUgPSBudWxsOworICAgICAgfQorICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHJldHVybiBoZWFkZXJzT2JqOworICB9OworfQorCisKKy8qKgorICogQ2hhaW4gYWxsIGdpdmVuIGZ1bmN0aW9ucworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgYm90aCByZXF1ZXN0IGFuZCByZXNwb25zZSB0cmFuc2Zvcm1pbmcKKyAqCisgKiBAcGFyYW0geyp9IGRhdGEgRGF0YSB0byB0cmFuc2Zvcm0uCisgKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZz0pfSBoZWFkZXJzIEhUVFAgaGVhZGVycyBnZXR0ZXIgZm4uCisgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlLgorICogQHBhcmFtIHsoRnVuY3Rpb258QXJyYXkuPEZ1bmN0aW9uPil9IGZucyBGdW5jdGlvbiBvciBhbiBhcnJheSBvZiBmdW5jdGlvbnMuCisgKiBAcmV0dXJucyB7Kn0gVHJhbnNmb3JtZWQgZGF0YS4KKyAqLworZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShkYXRhLCBoZWFkZXJzLCBzdGF0dXMsIGZucykgeworICBpZiAoaXNGdW5jdGlvbihmbnMpKQorICAgIHJldHVybiBmbnMoZGF0YSwgaGVhZGVycywgc3RhdHVzKTsKKworICBmb3JFYWNoKGZucywgZnVuY3Rpb24oZm4pIHsKKyAgICBkYXRhID0gZm4oZGF0YSwgaGVhZGVycywgc3RhdHVzKTsKKyAgfSk7CisKKyAgcmV0dXJuIGRhdGE7Cit9CisKKworZnVuY3Rpb24gaXNTdWNjZXNzKHN0YXR1cykgeworICByZXR1cm4gMjAwIDw9IHN0YXR1cyAmJiBzdGF0dXMgPCAzMDA7Cit9CisKKworLyoqCisgKiBAbmdkb2MgcHJvdmlkZXIKKyAqIEBuYW1lICRodHRwUHJvdmlkZXIKKyAqIEBkZXNjcmlwdGlvbgorICogVXNlIGAkaHR0cFByb3ZpZGVyYCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIHtAbGluayBuZy4kaHR0cCAkaHR0cH0gc2VydmljZS4KKyAqICovCitmdW5jdGlvbiAkSHR0cFByb3ZpZGVyKCkgeworICAvKioKKyAgICogQG5nZG9jIHByb3BlcnR5CisgICAqIEBuYW1lICRodHRwUHJvdmlkZXIjZGVmYXVsdHMKKyAgICogQGRlc2NyaXB0aW9uCisgICAqCisgICAqIE9iamVjdCBjb250YWluaW5nIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwge0BsaW5rIG5nLiRodHRwICRodHRwfSByZXF1ZXN0cy4KKyAgICoKKyAgICogLSAqKmBkZWZhdWx0cy5jYWNoZWAqKiAtIHtPYmplY3R9IC0gYW4gb2JqZWN0IGJ1aWx0IHdpdGgge0BsaW5rIG5nLiRjYWNoZUZhY3RvcnkgYCRjYWNoZUZhY3RvcnlgfQorICAgKiB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgY2FjaGUgZm9yIGFsbCByZXF1ZXN0cyB3aG8gc2V0IHRoZWlyIGBjYWNoZWAgcHJvcGVydHkgdG8gYHRydWVgLgorICAgKiBJZiB5b3Ugc2V0IHRoZSBgZGVmYXVsdC5jYWNoZSA9IGZhbHNlYCB0aGVuIG9ubHkgcmVxdWVzdHMgdGhhdCBzcGVjaWZ5IHRoZWlyIG93biBjdXN0b20KKyAgICogY2FjaGUgb2JqZWN0IHdpbGwgYmUgY2FjaGVkLiBTZWUge0BsaW5rICRodHRwI2NhY2hpbmcgJGh0dHAgQ2FjaGluZ30gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAqCisgICAqIC0gKipgZGVmYXVsdHMueHNyZkNvb2tpZU5hbWVgKiogLSB7c3RyaW5nfSAtIE5hbWUgb2YgY29va2llIGNvbnRhaW5pbmcgdGhlIFhTUkYgdG9rZW4uCisgICAqIERlZmF1bHRzIHZhbHVlIGlzIGAnWFNSRi1UT0tFTidgLgorICAgKgorICAgKiAtICoqYGRlZmF1bHRzLnhzcmZIZWFkZXJOYW1lYCoqIC0ge3N0cmluZ30gLSBOYW1lIG9mIEhUVFAgaGVhZGVyIHRvIHBvcHVsYXRlIHdpdGggdGhlCisgICAqIFhTUkYgdG9rZW4uIERlZmF1bHRzIHZhbHVlIGlzIGAnWC1YU1JGLVRPS0VOJ2AuCisgICAqCisgICAqIC0gKipgZGVmYXVsdHMuaGVhZGVyc2AqKiAtIHtPYmplY3R9IC0gRGVmYXVsdCBoZWFkZXJzIGZvciBhbGwgJGh0dHAgcmVxdWVzdHMuCisgICAqIFJlZmVyIHRvIHtAbGluayBuZy4kaHR0cCNzZXR0aW5nLWh0dHAtaGVhZGVycyAkaHR0cH0gZm9yIGRvY3VtZW50YXRpb24gb24KKyAgICogc2V0dGluZyBkZWZhdWx0IGhlYWRlcnMuCisgICAqICAgICAtICoqYGRlZmF1bHRzLmhlYWRlcnMuY29tbW9uYCoqCisgICAqICAgICAtICoqYGRlZmF1bHRzLmhlYWRlcnMucG9zdGAqKgorICAgKiAgICAgLSAqKmBkZWZhdWx0cy5oZWFkZXJzLnB1dGAqKgorICAgKiAgICAgLSAqKmBkZWZhdWx0cy5oZWFkZXJzLnBhdGNoYCoqCisgICAqCisgICAqKi8KKyAgdmFyIGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0cyA9IHsKKyAgICAvLyB0cmFuc2Zvcm0gaW5jb21pbmcgcmVzcG9uc2UgZGF0YQorICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBbZGVmYXVsdEh0dHBSZXNwb25zZVRyYW5zZm9ybV0sCisKKyAgICAvLyB0cmFuc2Zvcm0gb3V0Z29pbmcgcmVxdWVzdCBkYXRhCisgICAgdHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uKGQpIHsKKyAgICAgIHJldHVybiBpc09iamVjdChkKSAmJiAhaXNGaWxlKGQpICYmICFpc0Jsb2IoZCkgJiYgIWlzRm9ybURhdGEoZCkgPyB0b0pzb24oZCkgOiBkOworICAgIH1dLAorCisgICAgLy8gZGVmYXVsdCBoZWFkZXJzCisgICAgaGVhZGVyczogeworICAgICAgY29tbW9uOiB7CisgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJworICAgICAgfSwKKyAgICAgIHBvc3Q6ICAgc2hhbGxvd0NvcHkoQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0pTT04pLAorICAgICAgcHV0OiAgICBzaGFsbG93Q29weShDT05URU5UX1RZUEVfQVBQTElDQVRJT05fSlNPTiksCisgICAgICBwYXRjaDogIHNoYWxsb3dDb3B5KENPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9KU09OKQorICAgIH0sCisKKyAgICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLAorICAgIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJworICB9OworCisgIHZhciB1c2VBcHBseUFzeW5jID0gZmFsc2U7CisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRodHRwUHJvdmlkZXIjdXNlQXBwbHlBc3luYworICAgKiBAZGVzY3JpcHRpb24KKyAgICoKKyAgICogQ29uZmlndXJlICRodHRwIHNlcnZpY2UgdG8gY29tYmluZSBwcm9jZXNzaW5nIG9mIG11bHRpcGxlIGh0dHAgcmVzcG9uc2VzIHJlY2VpdmVkIGF0IGFyb3VuZAorICAgKiB0aGUgc2FtZSB0aW1lIHZpYSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkYXBwbHlBc3luYyAkcm9vdFNjb3BlLiRhcHBseUFzeW5jfS4gVGhpcyBjYW4gcmVzdWx0IGluCisgICAqIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGZvciBiaWdnZXIgYXBwbGljYXRpb25zIHRoYXQgbWFrZSBtYW55IEhUVFAgcmVxdWVzdHMKKyAgICogY29uY3VycmVudGx5IChjb21tb24gZHVyaW5nIGFwcGxpY2F0aW9uIGJvb3RzdHJhcCkuCisgICAqCisgICAqIERlZmF1bHRzIHRvIGZhbHNlLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZlZCwgcmV0dXJucyB0aGUgY3VycmVudCBjb25maWd1cmVkIHZhbHVlLgorICAgKgorICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB2YWx1ZSBJZiB0cnVlLCB3aGVuIHJlcXVlc3RzIGFyZSBsb2FkZWQsIHRoZXkgd2lsbCBzY2hlZHVsZSBhIGRlZmVycmVkCisgICAqICAgICJhcHBseSIgb24gdGhlIG5leHQgdGljaywgZ2l2aW5nIHRpbWUgZm9yIHN1YnNlcXVlbnQgcmVxdWVzdHMgaW4gYSByb3VnaGx5IH4xMG1zIHdpbmRvdworICAgKiAgICB0byBsb2FkIGFuZCBzaGFyZSB0aGUgc2FtZSBkaWdlc3QgY3ljbGUuCisgICAqCisgICAqIEByZXR1cm5zIHtib29sZWFufE9iamVjdH0gSWYgYSB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybnMgdGhlICRodHRwUHJvdmlkZXIgZm9yIGNoYWluaW5nLgorICAgKiAgICBvdGhlcndpc2UsIHJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJlZCB2YWx1ZS4KKyAgICoqLworICB0aGlzLnVzZUFwcGx5QXN5bmMgPSBmdW5jdGlvbih2YWx1ZSkgeworICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7CisgICAgICB1c2VBcHBseUFzeW5jID0gISF2YWx1ZTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICByZXR1cm4gdXNlQXBwbHlBc3luYzsKKyAgfTsKKworICAvKioKKyAgICogQG5nZG9jIHByb3BlcnR5CisgICAqIEBuYW1lICRodHRwUHJvdmlkZXIjaW50ZXJjZXB0b3JzCisgICAqIEBkZXNjcmlwdGlvbgorICAgKgorICAgKiBBcnJheSBjb250YWluaW5nIHNlcnZpY2UgZmFjdG9yaWVzIGZvciBhbGwgc3luY2hyb25vdXMgb3IgYXN5bmNocm9ub3VzIHtAbGluayBuZy4kaHR0cCAkaHR0cH0KKyAgICogcHJlLXByb2Nlc3Npbmcgb2YgcmVxdWVzdCBvciBwb3N0cHJvY2Vzc2luZyBvZiByZXNwb25zZXMuCisgICAqCisgICAqIFRoZXNlIHNlcnZpY2UgZmFjdG9yaWVzIGFyZSBvcmRlcmVkIGJ5IHJlcXVlc3QsIGkuZS4gdGhleSBhcmUgYXBwbGllZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUKKyAgICogYXJyYXksIG9uIHJlcXVlc3QsIGJ1dCByZXZlcnNlIG9yZGVyLCBvbiByZXNwb25zZS4KKyAgICoKKyAgICoge0BsaW5rIG5nLiRodHRwI2ludGVyY2VwdG9ycyBJbnRlcmNlcHRvcnMgZGV0YWlsZWQgaW5mb30KKyAgICoqLworICB2YXIgaW50ZXJjZXB0b3JGYWN0b3JpZXMgPSB0aGlzLmludGVyY2VwdG9ycyA9IFtdOworCisgIHRoaXMuJGdldCA9IFsnJGh0dHBCYWNrZW5kJywgJyRicm93c2VyJywgJyRjYWNoZUZhY3RvcnknLCAnJHJvb3RTY29wZScsICckcScsICckaW5qZWN0b3InLAorICAgICAgZnVuY3Rpb24oJGh0dHBCYWNrZW5kLCAkYnJvd3NlciwgJGNhY2hlRmFjdG9yeSwgJHJvb3RTY29wZSwgJHEsICRpbmplY3RvcikgeworCisgICAgdmFyIGRlZmF1bHRDYWNoZSA9ICRjYWNoZUZhY3RvcnkoJyRodHRwJyk7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmNlcHRvcnMgc3RvcmVkIGluIHJldmVyc2Ugb3JkZXIuIElubmVyIGludGVyY2VwdG9ycyBiZWZvcmUgb3V0ZXIgaW50ZXJjZXB0b3JzLgorICAgICAqIFRoZSByZXZlcnNhbCBpcyBuZWVkZWQgc28gdGhhdCB3ZSBjYW4gYnVpbGQgdXAgdGhlIGludGVyY2VwdGlvbiBjaGFpbiBhcm91bmQgdGhlCisgICAgICogc2VydmVyIHJlcXVlc3QuCisgICAgICovCisgICAgdmFyIHJldmVyc2VkSW50ZXJjZXB0b3JzID0gW107CisKKyAgICBmb3JFYWNoKGludGVyY2VwdG9yRmFjdG9yaWVzLCBmdW5jdGlvbihpbnRlcmNlcHRvckZhY3RvcnkpIHsKKyAgICAgIHJldmVyc2VkSW50ZXJjZXB0b3JzLnVuc2hpZnQoaXNTdHJpbmcoaW50ZXJjZXB0b3JGYWN0b3J5KQorICAgICAgICAgID8gJGluamVjdG9yLmdldChpbnRlcmNlcHRvckZhY3RvcnkpIDogJGluamVjdG9yLmludm9rZShpbnRlcmNlcHRvckZhY3RvcnkpKTsKKyAgICB9KTsKKworICAgIC8qKgorICAgICAqIEBuZ2RvYyBzZXJ2aWNlCisgICAgICogQGtpbmQgZnVuY3Rpb24KKyAgICAgKiBAbmFtZSAkaHR0cAorICAgICAqIEByZXF1aXJlcyBuZy4kaHR0cEJhY2tlbmQKKyAgICAgKiBAcmVxdWlyZXMgJGNhY2hlRmFjdG9yeQorICAgICAqIEByZXF1aXJlcyAkcm9vdFNjb3BlCisgICAgICogQHJlcXVpcmVzICRxCisgICAgICogQHJlcXVpcmVzICRpbmplY3RvcgorICAgICAqCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICogVGhlIGAkaHR0cGAgc2VydmljZSBpcyBhIGNvcmUgQW5ndWxhciBzZXJ2aWNlIHRoYXQgZmFjaWxpdGF0ZXMgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSByZW1vdGUKKyAgICAgKiBIVFRQIHNlcnZlcnMgdmlhIHRoZSBicm93c2VyJ3MgW1hNTEh0dHBSZXF1ZXN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi94bWxodHRwcmVxdWVzdCkKKyAgICAgKiBvYmplY3Qgb3IgdmlhIFtKU09OUF0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KU09OUCkuCisgICAgICoKKyAgICAgKiBGb3IgdW5pdCB0ZXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBgJGh0dHBgIHNlcnZpY2UsIHNlZQorICAgICAqIHtAbGluayBuZ01vY2suJGh0dHBCYWNrZW5kICRodHRwQmFja2VuZCBtb2NrfS4KKyAgICAgKgorICAgICAqIEZvciBhIGhpZ2hlciBsZXZlbCBvZiBhYnN0cmFjdGlvbiwgcGxlYXNlIGNoZWNrIG91dCB0aGUge0BsaW5rIG5nUmVzb3VyY2UuJHJlc291cmNlCisgICAgICogJHJlc291cmNlfSBzZXJ2aWNlLgorICAgICAqCisgICAgICogVGhlICRodHRwIEFQSSBpcyBiYXNlZCBvbiB0aGUge0BsaW5rIG5nLiRxIGRlZmVycmVkL3Byb21pc2UgQVBJc30gZXhwb3NlZCBieQorICAgICAqIHRoZSAkcSBzZXJ2aWNlLiBXaGlsZSBmb3Igc2ltcGxlIHVzYWdlIHBhdHRlcm5zIHRoaXMgZG9lc24ndCBtYXR0ZXIgbXVjaCwgZm9yIGFkdmFuY2VkIHVzYWdlCisgICAgICogaXQgaXMgaW1wb3J0YW50IHRvIGZhbWlsaWFyaXplIHlvdXJzZWxmIHdpdGggdGhlc2UgQVBJcyBhbmQgdGhlIGd1YXJhbnRlZXMgdGhleSBwcm92aWRlLgorICAgICAqCisgICAgICoKKyAgICAgKiAjIyBHZW5lcmFsIHVzYWdlCisgICAgICogVGhlIGAkaHR0cGAgc2VydmljZSBpcyBhIGZ1bmN0aW9uIHdoaWNoIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IOKAPyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IOKAPworICAgICAqIHRoYXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBhbiBIVFRQIHJlcXVlc3QgYW5kIHJldHVybnMgIGEge0BsaW5rIG5nLiRxIHByb21pc2V9CisgICAgICogd2l0aCB0d28gJGh0dHAgc3BlY2lmaWMgbWV0aG9kczogYHN1Y2Nlc3NgIGFuZCBgZXJyb3JgLgorICAgICAqCisgICAgICogYGBganMKKyAgICAgKiAgIC8vIFNpbXBsZSBHRVQgcmVxdWVzdCBleGFtcGxlIDoKKyAgICAgKiAgICRodHRwLmdldCgnL3NvbWVVcmwnKS4KKyAgICAgKiAgICAgc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykgeworICAgICAqICAgICAgIC8vIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkKKyAgICAgKiAgICAgICAvLyB3aGVuIHRoZSByZXNwb25zZSBpcyBhdmFpbGFibGUKKyAgICAgKiAgICAgfSkuCisgICAgICogICAgIGVycm9yKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7CisgICAgICogICAgICAgLy8gY2FsbGVkIGFzeW5jaHJvbm91c2x5IGlmIGFuIGVycm9yIG9jY3VycworICAgICAqICAgICAgIC8vIG9yIHNlcnZlciByZXR1cm5zIHJlc3BvbnNlIHdpdGggYW4gZXJyb3Igc3RhdHVzLgorICAgICAqICAgICB9KTsKKyAgICAgKiBgYGAKKyAgICAgKgorICAgICAqIGBgYGpzCisgICAgICogICAvLyBTaW1wbGUgUE9TVCByZXF1ZXN0IGV4YW1wbGUgKHBhc3NpbmcgZGF0YSkgOgorICAgICAqICAgJGh0dHAucG9zdCgnL3NvbWVVcmwnLCB7bXNnOidoZWxsbyB3b3JkISd9KS4KKyAgICAgKiAgICAgc3VjY2VzcyhmdW5jdGlvbihkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykgeworICAgICAqICAgICAgIC8vIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkKKyAgICAgKiAgICAgICAvLyB3aGVuIHRoZSByZXNwb25zZSBpcyBhdmFpbGFibGUKKyAgICAgKiAgICAgfSkuCisgICAgICogICAgIGVycm9yKGZ1bmN0aW9uKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7CisgICAgICogICAgICAgLy8gY2FsbGVkIGFzeW5jaHJvbm91c2x5IGlmIGFuIGVycm9yIG9jY3VycworICAgICAqICAgICAgIC8vIG9yIHNlcnZlciByZXR1cm5zIHJlc3BvbnNlIHdpdGggYW4gZXJyb3Igc3RhdHVzLgorICAgICAqICAgICB9KTsKKyAgICAgKiBgYGAKKyAgICAgKgorICAgICAqCisgICAgICogU2luY2UgdGhlIHJldHVybmVkIHZhbHVlIG9mIGNhbGxpbmcgdGhlICRodHRwIGZ1bmN0aW9uIGlzIGEgYHByb21pc2VgLCB5b3UgY2FuIGFsc28gdXNlCisgICAgICogdGhlIGB0aGVuYCBtZXRob2QgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzLCBhbmQgdGhlc2UgY2FsbGJhY2tzIHdpbGwgcmVjZWl2ZSBhIHNpbmdsZSBhcmd1bWVudCDigD8KKyAgICAgKiBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZS4gU2VlIHRoZSBBUEkgc2lnbmF0dXJlIGFuZCB0eXBlIGluZm8gYmVsb3cgZm9yIG1vcmUKKyAgICAgKiBkZXRhaWxzLgorICAgICAqCisgICAgICogQSByZXNwb25zZSBzdGF0dXMgY29kZSBiZXR3ZWVuIDIwMCBhbmQgMjk5IGlzIGNvbnNpZGVyZWQgYSBzdWNjZXNzIHN0YXR1cyBhbmQKKyAgICAgKiB3aWxsIHJlc3VsdCBpbiB0aGUgc3VjY2VzcyBjYWxsYmFjayBiZWluZyBjYWxsZWQuIE5vdGUgdGhhdCBpZiB0aGUgcmVzcG9uc2UgaXMgYSByZWRpcmVjdCwKKyAgICAgKiBYTUxIdHRwUmVxdWVzdCB3aWxsIHRyYW5zcGFyZW50bHkgZm9sbG93IGl0LCBtZWFuaW5nIHRoYXQgdGhlIGVycm9yIGNhbGxiYWNrIHdpbGwgbm90IGJlCisgICAgICogY2FsbGVkIGZvciBzdWNoIHJlc3BvbnNlcy4KKyAgICAgKgorICAgICAqICMjIFdyaXRpbmcgVW5pdCBUZXN0cyB0aGF0IHVzZSAkaHR0cAorICAgICAqIFdoZW4gdW5pdCB0ZXN0aW5nICh1c2luZyB7QGxpbmsgbmdNb2NrIG5nTW9ja30pLCBpdCBpcyBuZWNlc3NhcnkgdG8gY2FsbAorICAgICAqIHtAbGluayBuZ01vY2suJGh0dHBCYWNrZW5kI2ZsdXNoICRodHRwQmFja2VuZC5mbHVzaCgpfSB0byBmbHVzaCBlYWNoIHBlbmRpbmcKKyAgICAgKiByZXF1ZXN0IHVzaW5nIHRyYWluZWQgcmVzcG9uc2VzLgorICAgICAqCisgICAgICogYGBgCisgICAgICogJGh0dHBCYWNrZW5kLmV4cGVjdEdFVCguLi4pOworICAgICAqICRodHRwLmdldCguLi4pOworICAgICAqICRodHRwQmFja2VuZC5mbHVzaCgpOworICAgICAqIGBgYAorICAgICAqCisgICAgICogIyMgU2hvcnRjdXQgbWV0aG9kcworICAgICAqCisgICAgICogU2hvcnRjdXQgbWV0aG9kcyBhcmUgYWxzbyBhdmFpbGFibGUuIEFsbCBzaG9ydGN1dCBtZXRob2RzIHJlcXVpcmUgcGFzc2luZyBpbiB0aGUgVVJMLCBhbmQKKyAgICAgKiByZXF1ZXN0IGRhdGEgbXVzdCBiZSBwYXNzZWQgaW4gZm9yIFBPU1QvUFVUIHJlcXVlc3RzLgorICAgICAqCisgICAgICogYGBganMKKyAgICAgKiAgICRodHRwLmdldCgnL3NvbWVVcmwnKS5zdWNjZXNzKHN1Y2Nlc3NDYWxsYmFjayk7CisgICAgICogICAkaHR0cC5wb3N0KCcvc29tZVVybCcsIGRhdGEpLnN1Y2Nlc3Moc3VjY2Vzc0NhbGxiYWNrKTsKKyAgICAgKiBgYGAKKyAgICAgKgorICAgICAqIENvbXBsZXRlIGxpc3Qgb2Ygc2hvcnRjdXQgbWV0aG9kczoKKyAgICAgKgorICAgICAqIC0ge0BsaW5rIG5nLiRodHRwI2dldCAkaHR0cC5nZXR9CisgICAgICogLSB7QGxpbmsgbmcuJGh0dHAjaGVhZCAkaHR0cC5oZWFkfQorICAgICAqIC0ge0BsaW5rIG5nLiRodHRwI3Bvc3QgJGh0dHAucG9zdH0KKyAgICAgKiAtIHtAbGluayBuZy4kaHR0cCNwdXQgJGh0dHAucHV0fQorICAgICAqIC0ge0BsaW5rIG5nLiRodHRwI2RlbGV0ZSAkaHR0cC5kZWxldGV9CisgICAgICogLSB7QGxpbmsgbmcuJGh0dHAjanNvbnAgJGh0dHAuanNvbnB9CisgICAgICogLSB7QGxpbmsgbmcuJGh0dHAjcGF0Y2ggJGh0dHAucGF0Y2h9CisgICAgICoKKyAgICAgKgorICAgICAqICMjIFNldHRpbmcgSFRUUCBIZWFkZXJzCisgICAgICoKKyAgICAgKiBUaGUgJGh0dHAgc2VydmljZSB3aWxsIGF1dG9tYXRpY2FsbHkgYWRkIGNlcnRhaW4gSFRUUCBoZWFkZXJzIHRvIGFsbCByZXF1ZXN0cy4gVGhlc2UgZGVmYXVsdHMKKyAgICAgKiBjYW4gYmUgZnVsbHkgY29uZmlndXJlZCBieSBhY2Nlc3NpbmcgdGhlIGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmhlYWRlcnNgIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBvYmplY3QsIHdoaWNoIGN1cnJlbnRseSBjb250YWlucyB0aGlzIGRlZmF1bHQgY29uZmlndXJhdGlvbjoKKyAgICAgKgorICAgICAqIC0gYCRodHRwUHJvdmlkZXIuZGVmYXVsdHMuaGVhZGVycy5jb21tb25gIChoZWFkZXJzIHRoYXQgYXJlIGNvbW1vbiBmb3IgYWxsIHJlcXVlc3RzKToKKyAgICAgKiAgIC0gYEFjY2VwdDogYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKiAvICpgCisgICAgICogLSBgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzLnBvc3RgOiAoaGVhZGVyIGRlZmF1bHRzIGZvciBQT1NUIHJlcXVlc3RzKQorICAgICAqICAgLSBgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uYAorICAgICAqIC0gYCRodHRwUHJvdmlkZXIuZGVmYXVsdHMuaGVhZGVycy5wdXRgIChoZWFkZXIgZGVmYXVsdHMgZm9yIFBVVCByZXF1ZXN0cykKKyAgICAgKiAgIC0gYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbmAKKyAgICAgKgorICAgICAqIFRvIGFkZCBvciBvdmVyd3JpdGUgdGhlc2UgZGVmYXVsdHMsIHNpbXBseSBhZGQgb3IgcmVtb3ZlIGEgcHJvcGVydHkgZnJvbSB0aGVzZSBjb25maWd1cmF0aW9uCisgICAgICogb2JqZWN0cy4gVG8gYWRkIGhlYWRlcnMgZm9yIGFuIEhUVFAgbWV0aG9kIG90aGVyIHRoYW4gUE9TVCBvciBQVVQsIHNpbXBseSBhZGQgYSBuZXcgb2JqZWN0CisgICAgICogd2l0aCB0aGUgbG93ZXJjYXNlZCBIVFRQIG1ldGhvZCBuYW1lIGFzIHRoZSBrZXksIGUuZy4KKyAgICAgKiBgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzLmdldCA9IHsgJ015LUhlYWRlcicgOiAndmFsdWUnIH0uCisgICAgICoKKyAgICAgKiBUaGUgZGVmYXVsdHMgY2FuIGFsc28gYmUgc2V0IGF0IHJ1bnRpbWUgdmlhIHRoZSBgJGh0dHAuZGVmYXVsdHNgIG9iamVjdCBpbiB0aGUgc2FtZQorICAgICAqIGZhc2hpb24uIEZvciBleGFtcGxlOgorICAgICAqCisgICAgICogYGBgCisgICAgICogbW9kdWxlLnJ1bihmdW5jdGlvbigkaHR0cCkgeworICAgICAqICAgJGh0dHAuZGVmYXVsdHMuaGVhZGVycy5jb21tb24uQXV0aG9yaXphdGlvbiA9ICdCYXNpYyBZbVZsY0RwaWIyOXcnCisgICAgICogfSk7CisgICAgICogYGBgCisgICAgICoKKyAgICAgKiBJbiBhZGRpdGlvbiwgeW91IGNhbiBzdXBwbHkgYSBgaGVhZGVyc2AgcHJvcGVydHkgaW4gdGhlIGNvbmZpZyBvYmplY3QgcGFzc2VkIHdoZW4KKyAgICAgKiBjYWxsaW5nIGAkaHR0cChjb25maWcpYCwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0cyB3aXRob3V0IGNoYW5naW5nIHRoZW0gZ2xvYmFsbHkuCisgICAgICoKKyAgICAgKiBUbyBleHBsaWNpdGx5IHJlbW92ZSBhIGhlYWRlciBhdXRvbWF0aWNhbGx5IGFkZGVkIHZpYSAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmhlYWRlcnMgb24gYSBwZXIgcmVxdWVzdCBiYXNpcywKKyAgICAgKiBVc2UgdGhlIGBoZWFkZXJzYCBwcm9wZXJ0eSwgc2V0dGluZyB0aGUgZGVzaXJlZCBoZWFkZXIgdG8gYHVuZGVmaW5lZGAuIEZvciBleGFtcGxlOgorICAgICAqCisgICAgICogYGBganMKKyAgICAgKiB2YXIgcmVxID0geworICAgICAqICBtZXRob2Q6ICdQT1NUJywKKyAgICAgKiAgdXJsOiAnaHR0cDovL2V4YW1wbGUuY29tJywKKyAgICAgKiAgaGVhZGVyczogeworICAgICAqICAgICdDb250ZW50LVR5cGUnOiB1bmRlZmluZWQKKyAgICAgKiAgfSwKKyAgICAgKiAgZGF0YTogeyB0ZXN0OiAndGVzdCcgfSwKKyAgICAgKiB9CisgICAgICoKKyAgICAgKiAkaHR0cChyZXEpLnN1Y2Nlc3MoZnVuY3Rpb24oKXsuLi59KS5lcnJvcihmdW5jdGlvbigpey4uLn0pOworICAgICAqIGBgYAorICAgICAqCisgICAgICogIyMgVHJhbnNmb3JtaW5nIFJlcXVlc3RzIGFuZCBSZXNwb25zZXMKKyAgICAgKgorICAgICAqIEJvdGggcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyBjYW4gYmUgdHJhbnNmb3JtZWQgdXNpbmcgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zOiBgdHJhbnNmb3JtUmVxdWVzdGAKKyAgICAgKiBhbmQgYHRyYW5zZm9ybVJlc3BvbnNlYC4gVGhlc2UgcHJvcGVydGllcyBjYW4gYmUgYSBzaW5nbGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zCisgICAgICogdGhlIHRyYW5zZm9ybWVkIHZhbHVlIChge2Z1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIsIHN0YXR1cylgKSBvciBhbiBhcnJheSBvZiBzdWNoIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucywKKyAgICAgKiB3aGljaCBhbGxvd3MgeW91IHRvIGBwdXNoYCBvciBgdW5zaGlmdGAgYSBuZXcgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gaW50byB0aGUgdHJhbnNmb3JtYXRpb24gY2hhaW4uCisgICAgICoKKyAgICAgKiAjIyMgRGVmYXVsdCBUcmFuc2Zvcm1hdGlvbnMKKyAgICAgKgorICAgICAqIFRoZSBgJGh0dHBQcm92aWRlcmAgcHJvdmlkZXIgYW5kIGAkaHR0cGAgc2VydmljZSBleHBvc2UgYGRlZmF1bHRzLnRyYW5zZm9ybVJlcXVlc3RgIGFuZAorICAgICAqIGBkZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZWAgcHJvcGVydGllcy4gSWYgYSByZXF1ZXN0IGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biB0cmFuc2Zvcm1hdGlvbnMKKyAgICAgKiB0aGVuIHRoZXNlIHdpbGwgYmUgYXBwbGllZC4KKyAgICAgKgorICAgICAqIFlvdSBjYW4gYXVnbWVudCBvciByZXBsYWNlIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWF0aW9ucyBieSBtb2RpZnlpbmcgdGhlc2UgcHJvcGVydGllcyBieSBhZGRpbmcgdG8gb3IKKyAgICAgKiByZXBsYWNpbmcgdGhlIGFycmF5LgorICAgICAqCisgICAgICogQW5ndWxhciBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGRlZmF1bHQgdHJhbnNmb3JtYXRpb25zOgorICAgICAqCisgICAgICogUmVxdWVzdCB0cmFuc2Zvcm1hdGlvbnMgKGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLnRyYW5zZm9ybVJlcXVlc3RgIGFuZCBgJGh0dHAuZGVmYXVsdHMudHJhbnNmb3JtUmVxdWVzdGApOgorICAgICAqCisgICAgICogLSBJZiB0aGUgYGRhdGFgIHByb3BlcnR5IG9mIHRoZSByZXF1ZXN0IGNvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5zIGFuIG9iamVjdCwgc2VyaWFsaXplIGl0CisgICAgICogICBpbnRvIEpTT04gZm9ybWF0LgorICAgICAqCisgICAgICogUmVzcG9uc2UgdHJhbnNmb3JtYXRpb25zIChgJGh0dHBQcm92aWRlci5kZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZWAgYW5kIGAkaHR0cC5kZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZWApOgorICAgICAqCisgICAgICogIC0gSWYgWFNSRiBwcmVmaXggaXMgZGV0ZWN0ZWQsIHN0cmlwIGl0IChzZWUgU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMgc2VjdGlvbiBiZWxvdykuCisgICAgICogIC0gSWYgSlNPTiByZXNwb25zZSBpcyBkZXRlY3RlZCwgZGVzZXJpYWxpemUgaXQgdXNpbmcgYSBKU09OIHBhcnNlci4KKyAgICAgKgorICAgICAqCisgICAgICogIyMjIE92ZXJyaWRpbmcgdGhlIERlZmF1bHQgVHJhbnNmb3JtYXRpb25zIFBlciBSZXF1ZXN0CisgICAgICoKKyAgICAgKiBJZiB5b3Ugd2lzaCBvdmVycmlkZSB0aGUgcmVxdWVzdC9yZXNwb25zZSB0cmFuc2Zvcm1hdGlvbnMgb25seSBmb3IgYSBzaW5nbGUgcmVxdWVzdCB0aGVuIHByb3ZpZGUKKyAgICAgKiBgdHJhbnNmb3JtUmVxdWVzdGAgYW5kL29yIGB0cmFuc2Zvcm1SZXNwb25zZWAgcHJvcGVydGllcyBvbiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QgcGFzc2VkCisgICAgICogaW50byBgJGh0dHBgLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IGlmIHlvdSBwcm92aWRlIHRoZXNlIHByb3BlcnRpZXMgb24gdGhlIGNvbmZpZyBvYmplY3QgdGhlIGRlZmF1bHQgdHJhbnNmb3JtYXRpb25zIHdpbGwgYmUKKyAgICAgKiBvdmVyd3JpdHRlbi4gSWYgeW91IHdpc2ggdG8gYXVnbWVudCB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1hdGlvbnMgdGhlbiB5b3UgbXVzdCBpbmNsdWRlIHRoZW0gaW4geW91cgorICAgICAqIGxvY2FsIHRyYW5zZm9ybWF0aW9uIGFycmF5LgorICAgICAqCisgICAgICogVGhlIGZvbGxvd2luZyBjb2RlIGRlbW9uc3RyYXRlcyBhZGRpbmcgYSBuZXcgcmVzcG9uc2UgdHJhbnNmb3JtYXRpb24gdG8gYmUgcnVuIGFmdGVyIHRoZSBkZWZhdWx0IHJlc3BvbnNlCisgICAgICogdHJhbnNmb3JtYXRpb25zIGhhdmUgYmVlbiBydW4uCisgICAgICoKKyAgICAgKiBgYGBqcworICAgICAqIGZ1bmN0aW9uIGFwcGVuZFRyYW5zZm9ybShkZWZhdWx0cywgdHJhbnNmb3JtKSB7CisgICAgICoKKyAgICAgKiAgIC8vIFdlIGNhbid0IGd1YXJhbnRlZSB0aGF0IHRoZSBkZWZhdWx0IHRyYW5zZm9ybWF0aW9uIGlzIGFuIGFycmF5CisgICAgICogICBkZWZhdWx0cyA9IGFuZ3VsYXIuaXNBcnJheShkZWZhdWx0cykgPyBkZWZhdWx0cyA6IFtkZWZhdWx0c107CisgICAgICoKKyAgICAgKiAgIC8vIEFwcGVuZCB0aGUgbmV3IHRyYW5zZm9ybWF0aW9uIHRvIHRoZSBkZWZhdWx0cworICAgICAqICAgcmV0dXJuIGRlZmF1bHRzLmNvbmNhdCh0cmFuc2Zvcm0pOworICAgICAqIH0KKyAgICAgKgorICAgICAqICRodHRwKHsKKyAgICAgKiAgIHVybDogJy4uLicsCisgICAgICogICBtZXRob2Q6ICdHRVQnLAorICAgICAqICAgdHJhbnNmb3JtUmVzcG9uc2U6IGFwcGVuZFRyYW5zZm9ybSgkaHR0cC5kZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZSwgZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgKiAgICAgcmV0dXJuIGRvVHJhbnNmb3JtKHZhbHVlKTsKKyAgICAgKiAgIH0pCisgICAgICogfSk7CisgICAgICogYGBgCisgICAgICoKKyAgICAgKgorICAgICAqICMjIENhY2hpbmcKKyAgICAgKgorICAgICAqIFRvIGVuYWJsZSBjYWNoaW5nLCBzZXQgdGhlIHJlcXVlc3QgY29uZmlndXJhdGlvbiBgY2FjaGVgIHByb3BlcnR5IHRvIGB0cnVlYCAodG8gdXNlIGRlZmF1bHQKKyAgICAgKiBjYWNoZSkgb3IgdG8gYSBjdXN0b20gY2FjaGUgb2JqZWN0IChidWlsdCB3aXRoIHtAbGluayBuZy4kY2FjaGVGYWN0b3J5IGAkY2FjaGVGYWN0b3J5YH0pLgorICAgICAqIFdoZW4gdGhlIGNhY2hlIGlzIGVuYWJsZWQsIGAkaHR0cGAgc3RvcmVzIHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIGNhY2hlLiBUaGUgbmV4dCB0aW1lIHRoZSBzYW1lIHJlcXVlc3QgaXMgbWFkZSwgdGhlIHJlc3BvbnNlIGlzIHNlcnZlZCBmcm9tIHRoZSBjYWNoZSB3aXRob3V0CisgICAgICogc2VuZGluZyBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCBldmVuIGlmIHRoZSByZXNwb25zZSBpcyBzZXJ2ZWQgZnJvbSBjYWNoZSwgZGVsaXZlcnkgb2YgdGhlIGRhdGEgaXMgYXN5bmNocm9ub3VzIGluCisgICAgICogdGhlIHNhbWUgd2F5IHRoYXQgcmVhbCByZXF1ZXN0cyBhcmUuCisgICAgICoKKyAgICAgKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgR0VUIHJlcXVlc3RzIGZvciB0aGUgc2FtZSBVUkwgdGhhdCBzaG91bGQgYmUgY2FjaGVkIHVzaW5nIHRoZSBzYW1lCisgICAgICogY2FjaGUsIGJ1dCB0aGUgY2FjaGUgaXMgbm90IHBvcHVsYXRlZCB5ZXQsIG9ubHkgb25lIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB3aWxsIGJlIG1hZGUgYW5kCisgICAgICogdGhlIHJlbWFpbmluZyByZXF1ZXN0cyB3aWxsIGJlIGZ1bGZpbGxlZCB1c2luZyB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgZmlyc3QgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIFlvdSBjYW4gY2hhbmdlIHRoZSBkZWZhdWx0IGNhY2hlIHRvIGEgbmV3IG9iamVjdCAoYnVpbHQgd2l0aAorICAgICAqIHtAbGluayBuZy4kY2FjaGVGYWN0b3J5IGAkY2FjaGVGYWN0b3J5YH0pIGJ5IHVwZGF0aW5nIHRoZQorICAgICAqIHtAbGluayBuZy4kaHR0cCNkZWZhdWx0cyBgJGh0dHAuZGVmYXVsdHMuY2FjaGVgfSBwcm9wZXJ0eS4gQWxsIHJlcXVlc3RzIHdobyBzZXQKKyAgICAgKiB0aGVpciBgY2FjaGVgIHByb3BlcnR5IHRvIGB0cnVlYCB3aWxsIG5vdyB1c2UgdGhpcyBjYWNoZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBJZiB5b3Ugc2V0IHRoZSBkZWZhdWx0IGNhY2hlIHRvIGBmYWxzZWAgdGhlbiBvbmx5IHJlcXVlc3RzIHRoYXQgc3BlY2lmeSB0aGVpciBvd24gY3VzdG9tCisgICAgICogY2FjaGUgb2JqZWN0IHdpbGwgYmUgY2FjaGVkLgorICAgICAqCisgICAgICogIyMgSW50ZXJjZXB0b3JzCisgICAgICoKKyAgICAgKiBCZWZvcmUgeW91IHN0YXJ0IGNyZWF0aW5nIGludGVyY2VwdG9ycywgYmUgc3VyZSB0byB1bmRlcnN0YW5kIHRoZQorICAgICAqIHtAbGluayBuZy4kcSAkcSBhbmQgZGVmZXJyZWQvcHJvbWlzZSBBUElzfS4KKyAgICAgKgorICAgICAqIEZvciBwdXJwb3NlcyBvZiBnbG9iYWwgZXJyb3IgaGFuZGxpbmcsIGF1dGhlbnRpY2F0aW9uLCBvciBhbnkga2luZCBvZiBzeW5jaHJvbm91cyBvcgorICAgICAqIGFzeW5jaHJvbm91cyBwcmUtcHJvY2Vzc2luZyBvZiByZXF1ZXN0IG9yIHBvc3Rwcm9jZXNzaW5nIG9mIHJlc3BvbnNlcywgaXQgaXMgZGVzaXJhYmxlIHRvIGJlCisgICAgICogYWJsZSB0byBpbnRlcmNlcHQgcmVxdWVzdHMgYmVmb3JlIHRoZXkgYXJlIGhhbmRlZCB0byB0aGUgc2VydmVyIGFuZAorICAgICAqIHJlc3BvbnNlcyBiZWZvcmUgdGhleSBhcmUgaGFuZGVkIG92ZXIgdG8gdGhlIGFwcGxpY2F0aW9uIGNvZGUgdGhhdAorICAgICAqIGluaXRpYXRlZCB0aGVzZSByZXF1ZXN0cy4gVGhlIGludGVyY2VwdG9ycyBsZXZlcmFnZSB0aGUge0BsaW5rIG5nLiRxCisgICAgICogcHJvbWlzZSBBUElzfSB0byBmdWxmaWxsIHRoaXMgbmVlZCBmb3IgYm90aCBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHByZS1wcm9jZXNzaW5nLgorICAgICAqCisgICAgICogVGhlIGludGVyY2VwdG9ycyBhcmUgc2VydmljZSBmYWN0b3JpZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgJGh0dHBQcm92aWRlcmAgYnkKKyAgICAgKiBhZGRpbmcgdGhlbSB0byB0aGUgYCRodHRwUHJvdmlkZXIuaW50ZXJjZXB0b3JzYCBhcnJheS4gVGhlIGZhY3RvcnkgaXMgY2FsbGVkIGFuZAorICAgICAqIGluamVjdGVkIHdpdGggZGVwZW5kZW5jaWVzIChpZiBzcGVjaWZpZWQpIGFuZCByZXR1cm5zIHRoZSBpbnRlcmNlcHRvci4KKyAgICAgKgorICAgICAqIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgaW50ZXJjZXB0b3JzIChhbmQgdHdvIGtpbmRzIG9mIHJlamVjdGlvbiBpbnRlcmNlcHRvcnMpOgorICAgICAqCisgICAgICogICAqIGByZXF1ZXN0YDogaW50ZXJjZXB0b3JzIGdldCBjYWxsZWQgd2l0aCBhIGh0dHAgYGNvbmZpZ2Agb2JqZWN0LiBUaGUgZnVuY3Rpb24gaXMgZnJlZSB0bworICAgICAqICAgICBtb2RpZnkgdGhlIGBjb25maWdgIG9iamVjdCBvciBjcmVhdGUgYSBuZXcgb25lLiBUaGUgZnVuY3Rpb24gbmVlZHMgdG8gcmV0dXJuIHRoZSBgY29uZmlnYAorICAgICAqICAgICBvYmplY3QgZGlyZWN0bHksIG9yIGEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBgY29uZmlnYCBvciBhIG5ldyBgY29uZmlnYCBvYmplY3QuCisgICAgICogICAqIGByZXF1ZXN0RXJyb3JgOiBpbnRlcmNlcHRvciBnZXRzIGNhbGxlZCB3aGVuIGEgcHJldmlvdXMgaW50ZXJjZXB0b3IgdGhyZXcgYW4gZXJyb3Igb3IKKyAgICAgKiAgICAgcmVzb2x2ZWQgd2l0aCBhIHJlamVjdGlvbi4KKyAgICAgKiAgICogYHJlc3BvbnNlYDogaW50ZXJjZXB0b3JzIGdldCBjYWxsZWQgd2l0aCBodHRwIGByZXNwb25zZWAgb2JqZWN0LiBUaGUgZnVuY3Rpb24gaXMgZnJlZSB0bworICAgICAqICAgICBtb2RpZnkgdGhlIGByZXNwb25zZWAgb2JqZWN0IG9yIGNyZWF0ZSBhIG5ldyBvbmUuIFRoZSBmdW5jdGlvbiBuZWVkcyB0byByZXR1cm4gdGhlIGByZXNwb25zZWAKKyAgICAgKiAgICAgb2JqZWN0IGRpcmVjdGx5LCBvciBhcyBhIHByb21pc2UgY29udGFpbmluZyB0aGUgYHJlc3BvbnNlYCBvciBhIG5ldyBgcmVzcG9uc2VgIG9iamVjdC4KKyAgICAgKiAgICogYHJlc3BvbnNlRXJyb3JgOiBpbnRlcmNlcHRvciBnZXRzIGNhbGxlZCB3aGVuIGEgcHJldmlvdXMgaW50ZXJjZXB0b3IgdGhyZXcgYW4gZXJyb3Igb3IKKyAgICAgKiAgICAgcmVzb2x2ZWQgd2l0aCBhIHJlamVjdGlvbi4KKyAgICAgKgorICAgICAqCisgICAgICogYGBganMKKyAgICAgKiAgIC8vIHJlZ2lzdGVyIHRoZSBpbnRlcmNlcHRvciBhcyBhIHNlcnZpY2UKKyAgICAgKiAgICRwcm92aWRlLmZhY3RvcnkoJ215SHR0cEludGVyY2VwdG9yJywgZnVuY3Rpb24oJHEsIGRlcGVuZGVuY3kxLCBkZXBlbmRlbmN5MikgeworICAgICAqICAgICByZXR1cm4geworICAgICAqICAgICAgIC8vIG9wdGlvbmFsIG1ldGhvZAorICAgICAqICAgICAgICdyZXF1ZXN0JzogZnVuY3Rpb24oY29uZmlnKSB7CisgICAgICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgb24gc3VjY2VzcworICAgICAqICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgKiAgICAgICB9LAorICAgICAqCisgICAgICogICAgICAgLy8gb3B0aW9uYWwgbWV0aG9kCisgICAgICogICAgICAncmVxdWVzdEVycm9yJzogZnVuY3Rpb24ocmVqZWN0aW9uKSB7CisgICAgICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgb24gZXJyb3IKKyAgICAgKiAgICAgICAgIGlmIChjYW5SZWNvdmVyKHJlamVjdGlvbikpIHsKKyAgICAgKiAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT3JOZXdQcm9taXNlCisgICAgICogICAgICAgICB9CisgICAgICogICAgICAgICByZXR1cm4gJHEucmVqZWN0KHJlamVjdGlvbik7CisgICAgICogICAgICAgfSwKKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKiAgICAgICAvLyBvcHRpb25hbCBtZXRob2QKKyAgICAgKiAgICAgICAncmVzcG9uc2UnOiBmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIG9uIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgKiAgICAgICB9LAorICAgICAqCisgICAgICogICAgICAgLy8gb3B0aW9uYWwgbWV0aG9kCisgICAgICogICAgICAncmVzcG9uc2VFcnJvcic6IGZ1bmN0aW9uKHJlamVjdGlvbikgeworICAgICAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIG9uIGVycm9yCisgICAgICogICAgICAgICBpZiAoY2FuUmVjb3ZlcihyZWplY3Rpb24pKSB7CisgICAgICogICAgICAgICAgIHJldHVybiByZXNwb25zZU9yTmV3UHJvbWlzZQorICAgICAqICAgICAgICAgfQorICAgICAqICAgICAgICAgcmV0dXJuICRxLnJlamVjdChyZWplY3Rpb24pOworICAgICAqICAgICAgIH0KKyAgICAgKiAgICAgfTsKKyAgICAgKiAgIH0pOworICAgICAqCisgICAgICogICAkaHR0cFByb3ZpZGVyLmludGVyY2VwdG9ycy5wdXNoKCdteUh0dHBJbnRlcmNlcHRvcicpOworICAgICAqCisgICAgICoKKyAgICAgKiAgIC8vIGFsdGVybmF0aXZlbHksIHJlZ2lzdGVyIHRoZSBpbnRlcmNlcHRvciB2aWEgYW4gYW5vbnltb3VzIGZhY3RvcnkKKyAgICAgKiAgICRodHRwUHJvdmlkZXIuaW50ZXJjZXB0b3JzLnB1c2goZnVuY3Rpb24oJHEsIGRlcGVuZGVuY3kxLCBkZXBlbmRlbmN5MikgeworICAgICAqICAgICByZXR1cm4geworICAgICAqICAgICAgJ3JlcXVlc3QnOiBmdW5jdGlvbihjb25maWcpIHsKKyAgICAgKiAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlCisgICAgICogICAgICAgfSwKKyAgICAgKgorICAgICAqICAgICAgICdyZXNwb25zZSc6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICogICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZQorICAgICAqICAgICAgIH0KKyAgICAgKiAgICAgfTsKKyAgICAgKiAgIH0pOworICAgICAqIGBgYAorICAgICAqCisgICAgICogIyMgU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMKKyAgICAgKgorICAgICAqIFdoZW4gZGVzaWduaW5nIHdlYiBhcHBsaWNhdGlvbnMsIGNvbnNpZGVyIHNlY3VyaXR5IHRocmVhdHMgZnJvbToKKyAgICAgKgorICAgICAqIC0gW0pTT04gdnVsbmVyYWJpbGl0eV0oaHR0cDovL2hhYWNrZWQuY29tL2FyY2hpdmUvMjAwOC8xMS8yMC9hbmF0b215LW9mLWEtc3VidGxlLWpzb24tdnVsbmVyYWJpbGl0eS5hc3B4KQorICAgICAqIC0gW1hTUkZdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3Jvc3Mtc2l0ZV9yZXF1ZXN0X2ZvcmdlcnkpCisgICAgICoKKyAgICAgKiBCb3RoIHNlcnZlciBhbmQgdGhlIGNsaWVudCBtdXN0IGNvb3BlcmF0ZSBpbiBvcmRlciB0byBlbGltaW5hdGUgdGhlc2UgdGhyZWF0cy4gQW5ndWxhciBjb21lcworICAgICAqIHByZS1jb25maWd1cmVkIHdpdGggc3RyYXRlZ2llcyB0aGF0IGFkZHJlc3MgdGhlc2UgaXNzdWVzLCBidXQgZm9yIHRoaXMgdG8gd29yayBiYWNrZW5kIHNlcnZlcgorICAgICAqIGNvb3BlcmF0aW9uIGlzIHJlcXVpcmVkLgorICAgICAqCisgICAgICogIyMjIEpTT04gVnVsbmVyYWJpbGl0eSBQcm90ZWN0aW9uCisgICAgICoKKyAgICAgKiBBIFtKU09OIHZ1bG5lcmFiaWxpdHldKGh0dHA6Ly9oYWFja2VkLmNvbS9hcmNoaXZlLzIwMDgvMTEvMjAvYW5hdG9teS1vZi1hLXN1YnRsZS1qc29uLXZ1bG5lcmFiaWxpdHkuYXNweCkKKyAgICAgKiBhbGxvd3MgdGhpcmQgcGFydHkgd2Vic2l0ZSB0byB0dXJuIHlvdXIgSlNPTiByZXNvdXJjZSBVUkwgaW50bworICAgICAqIFtKU09OUF0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KU09OUCkgcmVxdWVzdCB1bmRlciBzb21lIGNvbmRpdGlvbnMuIFRvCisgICAgICogY291bnRlciB0aGlzIHlvdXIgc2VydmVyIGNhbiBwcmVmaXggYWxsIEpTT04gcmVxdWVzdHMgd2l0aCBmb2xsb3dpbmcgc3RyaW5nIGAiKV19JyxcbiJgLgorICAgICAqIEFuZ3VsYXIgd2lsbCBhdXRvbWF0aWNhbGx5IHN0cmlwIHRoZSBwcmVmaXggYmVmb3JlIHByb2Nlc3NpbmcgaXQgYXMgSlNPTi4KKyAgICAgKgorICAgICAqIEZvciBleGFtcGxlIGlmIHlvdXIgc2VydmVyIG5lZWRzIHRvIHJldHVybjoKKyAgICAgKiBgYGBqcworICAgICAqIFsnb25lJywndHdvJ10KKyAgICAgKiBgYGAKKyAgICAgKgorICAgICAqIHdoaWNoIGlzIHZ1bG5lcmFibGUgdG8gYXR0YWNrLCB5b3VyIHNlcnZlciBjYW4gcmV0dXJuOgorICAgICAqIGBgYGpzCisgICAgICogKV19JywKKyAgICAgKiBbJ29uZScsJ3R3byddCisgICAgICogYGBgCisgICAgICoKKyAgICAgKiBBbmd1bGFyIHdpbGwgc3RyaXAgdGhlIHByZWZpeCwgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIEpTT04uCisgICAgICoKKyAgICAgKgorICAgICAqICMjIyBDcm9zcyBTaXRlIFJlcXVlc3QgRm9yZ2VyeSAoWFNSRikgUHJvdGVjdGlvbgorICAgICAqCisgICAgICogW1hTUkZdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3Jvc3Mtc2l0ZV9yZXF1ZXN0X2ZvcmdlcnkpIGlzIGEgdGVjaG5pcXVlIGJ5IHdoaWNoCisgICAgICogYW4gdW5hdXRob3JpemVkIHNpdGUgY2FuIGdhaW4geW91ciB1c2VyJ3MgcHJpdmF0ZSBkYXRhLiBBbmd1bGFyIHByb3ZpZGVzIGEgbWVjaGFuaXNtCisgICAgICogdG8gY291bnRlciBYU1JGLiBXaGVuIHBlcmZvcm1pbmcgWEhSIHJlcXVlc3RzLCB0aGUgJGh0dHAgc2VydmljZSByZWFkcyBhIHRva2VuIGZyb20gYSBjb29raWUKKyAgICAgKiAoYnkgZGVmYXVsdCwgYFhTUkYtVE9LRU5gKSBhbmQgc2V0cyBpdCBhcyBhbiBIVFRQIGhlYWRlciAoYFgtWFNSRi1UT0tFTmApLiBTaW5jZSBvbmx5CisgICAgICogSmF2YVNjcmlwdCB0aGF0IHJ1bnMgb24geW91ciBkb21haW4gY291bGQgcmVhZCB0aGUgY29va2llLCB5b3VyIHNlcnZlciBjYW4gYmUgYXNzdXJlZCB0aGF0CisgICAgICogdGhlIFhIUiBjYW1lIGZyb20gSmF2YVNjcmlwdCBydW5uaW5nIG9uIHlvdXIgZG9tYWluLiBUaGUgaGVhZGVyIHdpbGwgbm90IGJlIHNldCBmb3IKKyAgICAgKiBjcm9zcy1kb21haW4gcmVxdWVzdHMuCisgICAgICoKKyAgICAgKiBUbyB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLCB5b3VyIHNlcnZlciBuZWVkcyB0byBzZXQgYSB0b2tlbiBpbiBhIEphdmFTY3JpcHQgcmVhZGFibGUgc2Vzc2lvbgorICAgICAqIGNvb2tpZSBjYWxsZWQgYFhTUkYtVE9LRU5gIG9uIHRoZSBmaXJzdCBIVFRQIEdFVCByZXF1ZXN0LiBPbiBzdWJzZXF1ZW50IFhIUiByZXF1ZXN0cyB0aGUKKyAgICAgKiBzZXJ2ZXIgY2FuIHZlcmlmeSB0aGF0IHRoZSBjb29raWUgbWF0Y2hlcyBgWC1YU1JGLVRPS0VOYCBIVFRQIGhlYWRlciwgYW5kIHRoZXJlZm9yZSBiZSBzdXJlCisgICAgICogdGhhdCBvbmx5IEphdmFTY3JpcHQgcnVubmluZyBvbiB5b3VyIGRvbWFpbiBjb3VsZCBoYXZlIHNlbnQgdGhlIHJlcXVlc3QuIFRoZSB0b2tlbiBtdXN0IGJlCisgICAgICogdW5pcXVlIGZvciBlYWNoIHVzZXIgYW5kIG11c3QgYmUgdmVyaWZpYWJsZSBieSB0aGUgc2VydmVyICh0byBwcmV2ZW50IHRoZSBKYXZhU2NyaXB0IGZyb20KKyAgICAgKiBtYWtpbmcgdXAgaXRzIG93biB0b2tlbnMpLiBXZSByZWNvbW1lbmQgdGhhdCB0aGUgdG9rZW4gaXMgYSBkaWdlc3Qgb2YgeW91ciBzaXRlJ3MKKyAgICAgKiBhdXRoZW50aWNhdGlvbiBjb29raWUgd2l0aCBhIFtzYWx0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TYWx0XyhjcnlwdG9ncmFwaHkmIzQxOykKKyAgICAgKiBmb3IgYWRkZWQgc2VjdXJpdHkuCisgICAgICoKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaGVhZGVycyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHRoZSB4c3JmSGVhZGVyTmFtZSBhbmQgeHNyZkNvb2tpZU5hbWUKKyAgICAgKiBwcm9wZXJ0aWVzIG9mIGVpdGhlciAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzIGF0IGNvbmZpZy10aW1lLCAkaHR0cC5kZWZhdWx0cyBhdCBydW4tdGltZSwKKyAgICAgKiBvciB0aGUgcGVyLXJlcXVlc3QgY29uZmlnIG9iamVjdC4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBPYmplY3QgZGVzY3JpYmluZyB0aGUgcmVxdWVzdCB0byBiZSBtYWRlIGFuZCBob3cgaXQgc2hvdWxkIGJlCisgICAgICogICAgcHJvY2Vzc2VkLiBUaGUgb2JqZWN0IGhhcyBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgKgorICAgICAqICAgIC0gKiptZXRob2QqKiDigD8gYHtzdHJpbmd9YCDigD8gSFRUUCBtZXRob2QgKGUuZy4gJ0dFVCcsICdQT1NUJywgZXRjKQorICAgICAqICAgIC0gKip1cmwqKiDigD8gYHtzdHJpbmd9YCDigD8gQWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIG9mIHRoZSByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC4KKyAgICAgKiAgICAtICoqcGFyYW1zKiog4oA/IGB7T2JqZWN0LjxzdHJpbmd8T2JqZWN0Pn1gIOKAPyBNYXAgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHdoaWNoIHdpbGwgYmUgdHVybmVkCisgICAgICogICAgICB0byBgP2tleTE9dmFsdWUxJmtleTI9dmFsdWUyYCBhZnRlciB0aGUgdXJsLiBJZiB0aGUgdmFsdWUgaXMgbm90IGEgc3RyaW5nLCBpdCB3aWxsIGJlCisgICAgICogICAgICBKU09OaWZpZWQuCisgICAgICogICAgLSAqKmRhdGEqKiDigD8gYHtzdHJpbmd8T2JqZWN0fWAg4oA/IERhdGEgdG8gYmUgc2VudCBhcyB0aGUgcmVxdWVzdCBtZXNzYWdlIGRhdGEuCisgICAgICogICAgLSAqKmhlYWRlcnMqKiDigD8gYHtPYmplY3R9YCDigD8gTWFwIG9mIHN0cmluZ3Mgb3IgZnVuY3Rpb25zIHdoaWNoIHJldHVybiBzdHJpbmdzIHJlcHJlc2VudGluZworICAgICAqICAgICAgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4gSWYgdGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGlzIG51bGwsIHRoZQorICAgICAqICAgICAgaGVhZGVyIHdpbGwgbm90IGJlIHNlbnQuCisgICAgICogICAgLSAqKnhzcmZIZWFkZXJOYW1lKiog4oA/IGB7c3RyaW5nfWAg4oA/IE5hbWUgb2YgSFRUUCBoZWFkZXIgdG8gcG9wdWxhdGUgd2l0aCB0aGUgWFNSRiB0b2tlbi4KKyAgICAgKiAgICAtICoqeHNyZkNvb2tpZU5hbWUqKiDigD8gYHtzdHJpbmd9YCDigD8gTmFtZSBvZiBjb29raWUgY29udGFpbmluZyB0aGUgWFNSRiB0b2tlbi4KKyAgICAgKiAgICAtICoqdHJhbnNmb3JtUmVxdWVzdCoqIOKAPworICAgICAqICAgICAgYHtmdW5jdGlvbihkYXRhLCBoZWFkZXJzR2V0dGVyKXxBcnJheS48ZnVuY3Rpb24oZGF0YSwgaGVhZGVyc0dldHRlcik+fWAg4oA/CisgICAgICogICAgICB0cmFuc2Zvcm0gZnVuY3Rpb24gb3IgYW4gYXJyYXkgb2Ygc3VjaCBmdW5jdGlvbnMuIFRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gdGFrZXMgdGhlIGh0dHAKKyAgICAgKiAgICAgIHJlcXVlc3QgYm9keSBhbmQgaGVhZGVycyBhbmQgcmV0dXJucyBpdHMgdHJhbnNmb3JtZWQgKHR5cGljYWxseSBzZXJpYWxpemVkKSB2ZXJzaW9uLgorICAgICAqICAgICAgU2VlIHtAbGluayBuZy4kaHR0cCNvdmVycmlkaW5nLXRoZS1kZWZhdWx0LXRyYW5zZm9ybWF0aW9ucy1wZXItcmVxdWVzdAorICAgICAqICAgICAgT3ZlcnJpZGluZyB0aGUgRGVmYXVsdCBUcmFuc2Zvcm1hdGlvbnN9CisgICAgICogICAgLSAqKnRyYW5zZm9ybVJlc3BvbnNlKiog4oA/CisgICAgICogICAgICBge2Z1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIsIHN0YXR1cyl8QXJyYXkuPGZ1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIsIHN0YXR1cyk+fWAg4oA/CisgICAgICogICAgICB0cmFuc2Zvcm0gZnVuY3Rpb24gb3IgYW4gYXJyYXkgb2Ygc3VjaCBmdW5jdGlvbnMuIFRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gdGFrZXMgdGhlIGh0dHAKKyAgICAgKiAgICAgIHJlc3BvbnNlIGJvZHksIGhlYWRlcnMgYW5kIHN0YXR1cyBhbmQgcmV0dXJucyBpdHMgdHJhbnNmb3JtZWQgKHR5cGljYWxseSBkZXNlcmlhbGl6ZWQpIHZlcnNpb24uCisgICAgICogICAgICBTZWUge0BsaW5rIG5nLiRodHRwI292ZXJyaWRpbmctdGhlLWRlZmF1bHQtdHJhbnNmb3JtYXRpb25zLXBlci1yZXF1ZXN0CisgICAgICogICAgICBPdmVycmlkaW5nIHRoZSBEZWZhdWx0IFRyYW5zZm9ybWF0aW9uc30KKyAgICAgKiAgICAtICoqY2FjaGUqKiDigD8gYHtib29sZWFufENhY2hlfWAg4oA/IElmIHRydWUsIGEgZGVmYXVsdCAkaHR0cCBjYWNoZSB3aWxsIGJlIHVzZWQgdG8gY2FjaGUgdGhlCisgICAgICogICAgICBHRVQgcmVxdWVzdCwgb3RoZXJ3aXNlIGlmIGEgY2FjaGUgaW5zdGFuY2UgYnVpbHQgd2l0aAorICAgICAqICAgICAge0BsaW5rIG5nLiRjYWNoZUZhY3RvcnkgJGNhY2hlRmFjdG9yeX0sIHRoaXMgY2FjaGUgd2lsbCBiZSB1c2VkIGZvcgorICAgICAqICAgICAgY2FjaGluZy4KKyAgICAgKiAgICAtICoqdGltZW91dCoqIOKAPyBge251bWJlcnxQcm9taXNlfWAg4oA/IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciB7QGxpbmsgbmcuJHEgcHJvbWlzZX0KKyAgICAgKiAgICAgIHRoYXQgc2hvdWxkIGFib3J0IHRoZSByZXF1ZXN0IHdoZW4gcmVzb2x2ZWQuCisgICAgICogICAgLSAqKndpdGhDcmVkZW50aWFscyoqIC0gYHtib29sZWFufWAgLSB3aGV0aGVyIHRvIHNldCB0aGUgYHdpdGhDcmVkZW50aWFsc2AgZmxhZyBvbiB0aGUKKyAgICAgKiAgICAgIFhIUiBvYmplY3QuIFNlZSBbcmVxdWVzdHMgd2l0aCBjcmVkZW50aWFsc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRUUC9BY2Nlc3NfY29udHJvbF9DT1JTI1JlcXVlc3RzX3dpdGhfY3JlZGVudGlhbHMpCisgICAgICogICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKiAgICAtICoqcmVzcG9uc2VUeXBlKiogLSBge3N0cmluZ31gIC0gc2VlCisgICAgICogICAgICBbcmVxdWVzdFR5cGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvRE9NL1hNTEh0dHBSZXF1ZXN0I3Jlc3BvbnNlVHlwZSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IFJldHVybnMgYSB7QGxpbmsgbmcuJHEgcHJvbWlzZX0gb2JqZWN0IHdpdGggdGhlCisgICAgICogICBzdGFuZGFyZCBgdGhlbmAgbWV0aG9kIGFuZCB0d28gaHR0cCBzcGVjaWZpYyBtZXRob2RzOiBgc3VjY2Vzc2AgYW5kIGBlcnJvcmAuIFRoZSBgdGhlbmAKKyAgICAgKiAgIG1ldGhvZCB0YWtlcyB0d28gYXJndW1lbnRzIGEgc3VjY2VzcyBhbmQgYW4gZXJyb3IgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2l0aCBhCisgICAgICogICByZXNwb25zZSBvYmplY3QuIFRoZSBgc3VjY2Vzc2AgYW5kIGBlcnJvcmAgbWV0aG9kcyB0YWtlIGEgc2luZ2xlIGFyZ3VtZW50IC0gYSBmdW5jdGlvbiB0aGF0CisgICAgICogICB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzIG9yIGZhaWxzIHJlc3BlY3RpdmVseS4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgaW50bworICAgICAqICAgdGhlc2UgZnVuY3Rpb25zIGFyZSBkZXN0cnVjdHVyZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlc3BvbnNlIG9iamVjdCBwYXNzZWQgaW50byB0aGUKKyAgICAgKiAgIGB0aGVuYCBtZXRob2QuIFRoZSByZXNwb25zZSBvYmplY3QgaGFzIHRoZXNlIHByb3BlcnRpZXM6CisgICAgICoKKyAgICAgKiAgIC0gKipkYXRhKiog4oA/IGB7c3RyaW5nfE9iamVjdH1gIOKAPyBUaGUgcmVzcG9uc2UgYm9keSB0cmFuc2Zvcm1lZCB3aXRoIHRoZSB0cmFuc2Zvcm0KKyAgICAgKiAgICAgZnVuY3Rpb25zLgorICAgICAqICAgLSAqKnN0YXR1cyoqIOKAPyBge251bWJlcn1gIOKAPyBIVFRQIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZS4KKyAgICAgKiAgIC0gKipoZWFkZXJzKiog4oA/IGB7ZnVuY3Rpb24oW2hlYWRlck5hbWVdKX1gIOKAPyBIZWFkZXIgZ2V0dGVyIGZ1bmN0aW9uLgorICAgICAqICAgLSAqKmNvbmZpZyoqIOKAPyBge09iamVjdH1gIOKAPyBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCB3YXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcmVxdWVzdC4KKyAgICAgKiAgIC0gKipzdGF0dXNUZXh0Kiog4oA/IGB7c3RyaW5nfWAg4oA/IEhUVFAgc3RhdHVzIHRleHQgb2YgdGhlIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHByb3BlcnR5IHtBcnJheS48T2JqZWN0Pn0gcGVuZGluZ1JlcXVlc3RzIEFycmF5IG9mIGNvbmZpZyBvYmplY3RzIGZvciBjdXJyZW50bHkgcGVuZGluZworICAgICAqICAgcmVxdWVzdHMuIFRoaXMgaXMgcHJpbWFyaWx5IG1lYW50IHRvIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAgICAgKgorICAgICAqCisgICAgICogQGV4YW1wbGUKKzxleGFtcGxlIG1vZHVsZT0iaHR0cEV4YW1wbGUiPgorPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgIDxkaXYgbmctY29udHJvbGxlcj0iRmV0Y2hDb250cm9sbGVyIj4KKyAgICA8c2VsZWN0IG5nLW1vZGVsPSJtZXRob2QiPgorICAgICAgPG9wdGlvbj5HRVQ8L29wdGlvbj4KKyAgICAgIDxvcHRpb24+SlNPTlA8L29wdGlvbj4KKyAgICA8L3NlbGVjdD4KKyAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InVybCIgc2l6ZT0iODAiLz4KKyAgICA8YnV0dG9uIGlkPSJmZXRjaGJ0biIgbmctY2xpY2s9ImZldGNoKCkiPmZldGNoPC9idXR0b24+PGJyPgorICAgIDxidXR0b24gaWQ9InNhbXBsZWdldGJ0biIgbmctY2xpY2s9InVwZGF0ZU1vZGVsKCdHRVQnLCAnaHR0cC1oZWxsby5odG1sJykiPlNhbXBsZSBHRVQ8L2J1dHRvbj4KKyAgICA8YnV0dG9uIGlkPSJzYW1wbGVqc29ucGJ0biIKKyAgICAgIG5nLWNsaWNrPSJ1cGRhdGVNb2RlbCgnSlNPTlAnLAorICAgICAgICAgICAgICAgICAgICAnaHR0cHM6Ly9hbmd1bGFyanMub3JnL2dyZWV0LnBocD9jYWxsYmFjaz1KU09OX0NBTExCQUNLJm5hbWU9U3VwZXIlMjBIZXJvJykiPgorICAgICAgU2FtcGxlIEpTT05QCisgICAgPC9idXR0b24+CisgICAgPGJ1dHRvbiBpZD0iaW52YWxpZGpzb25wYnRuIgorICAgICAgbmctY2xpY2s9InVwZGF0ZU1vZGVsKCdKU09OUCcsICdodHRwczovL2FuZ3VsYXJqcy5vcmcvZG9lc250ZXhpc3QmY2FsbGJhY2s9SlNPTl9DQUxMQkFDSycpIj4KKyAgICAgICAgSW52YWxpZCBKU09OUAorICAgICAgPC9idXR0b24+CisgICAgPHByZT5odHRwIHN0YXR1cyBjb2RlOiB7e3N0YXR1c319PC9wcmU+CisgICAgPHByZT5odHRwIHJlc3BvbnNlIGRhdGE6IHt7ZGF0YX19PC9wcmU+CisgIDwvZGl2PgorPC9maWxlPgorPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KKyAgYW5ndWxhci5tb2R1bGUoJ2h0dHBFeGFtcGxlJywgW10pCisgICAgLmNvbnRyb2xsZXIoJ0ZldGNoQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRodHRwJywgJyR0ZW1wbGF0ZUNhY2hlJywKKyAgICAgIGZ1bmN0aW9uKCRzY29wZSwgJGh0dHAsICR0ZW1wbGF0ZUNhY2hlKSB7CisgICAgICAgICRzY29wZS5tZXRob2QgPSAnR0VUJzsKKyAgICAgICAgJHNjb3BlLnVybCA9ICdodHRwLWhlbGxvLmh0bWwnOworCisgICAgICAgICRzY29wZS5mZXRjaCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICRzY29wZS5jb2RlID0gbnVsbDsKKyAgICAgICAgICAkc2NvcGUucmVzcG9uc2UgPSBudWxsOworCisgICAgICAgICAgJGh0dHAoe21ldGhvZDogJHNjb3BlLm1ldGhvZCwgdXJsOiAkc2NvcGUudXJsLCBjYWNoZTogJHRlbXBsYXRlQ2FjaGV9KS4KKyAgICAgICAgICAgIHN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7CisgICAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICRzY29wZS5kYXRhID0gZGF0YTsKKyAgICAgICAgICAgIH0pLgorICAgICAgICAgICAgZXJyb3IoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7CisgICAgICAgICAgICAgICRzY29wZS5kYXRhID0gZGF0YSB8fCAiUmVxdWVzdCBmYWlsZWQiOworICAgICAgICAgICAgICAkc2NvcGUuc3RhdHVzID0gc3RhdHVzOworICAgICAgICAgIH0pOworICAgICAgICB9OworCisgICAgICAgICRzY29wZS51cGRhdGVNb2RlbCA9IGZ1bmN0aW9uKG1ldGhvZCwgdXJsKSB7CisgICAgICAgICAgJHNjb3BlLm1ldGhvZCA9IG1ldGhvZDsKKyAgICAgICAgICAkc2NvcGUudXJsID0gdXJsOworICAgICAgICB9OworICAgICAgfV0pOworPC9maWxlPgorPGZpbGUgbmFtZT0iaHR0cC1oZWxsby5odG1sIj4KKyAgSGVsbG8sICRodHRwIQorPC9maWxlPgorPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgIHZhciBzdGF0dXMgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3N0YXR1cycpKTsKKyAgdmFyIGRhdGEgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2RhdGEnKSk7CisgIHZhciBmZXRjaEJ0biA9IGVsZW1lbnQoYnkuaWQoJ2ZldGNoYnRuJykpOworICB2YXIgc2FtcGxlR2V0QnRuID0gZWxlbWVudChieS5pZCgnc2FtcGxlZ2V0YnRuJykpOworICB2YXIgc2FtcGxlSnNvbnBCdG4gPSBlbGVtZW50KGJ5LmlkKCdzYW1wbGVqc29ucGJ0bicpKTsKKyAgdmFyIGludmFsaWRKc29ucEJ0biA9IGVsZW1lbnQoYnkuaWQoJ2ludmFsaWRqc29ucGJ0bicpKTsKKworICBpdCgnc2hvdWxkIG1ha2UgYW4geGhyIEdFVCByZXF1ZXN0JywgZnVuY3Rpb24oKSB7CisgICAgc2FtcGxlR2V0QnRuLmNsaWNrKCk7CisgICAgZmV0Y2hCdG4uY2xpY2soKTsKKyAgICBleHBlY3Qoc3RhdHVzLmdldFRleHQoKSkudG9NYXRjaCgnMjAwJyk7CisgICAgZXhwZWN0KGRhdGEuZ2V0VGV4dCgpKS50b01hdGNoKC9IZWxsbywgXCRodHRwIS8pOworICB9KTsKKworLy8gQ29tbWVudGVkIG91dCBkdWUgdG8gZmxha2VzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvOTE4NQorLy8gaXQoJ3Nob3VsZCBtYWtlIGEgSlNPTlAgcmVxdWVzdCB0byBhbmd1bGFyanMub3JnJywgZnVuY3Rpb24oKSB7CisvLyAgIHNhbXBsZUpzb25wQnRuLmNsaWNrKCk7CisvLyAgIGZldGNoQnRuLmNsaWNrKCk7CisvLyAgIGV4cGVjdChzdGF0dXMuZ2V0VGV4dCgpKS50b01hdGNoKCcyMDAnKTsKKy8vICAgZXhwZWN0KGRhdGEuZ2V0VGV4dCgpKS50b01hdGNoKC9TdXBlciBIZXJvIS8pOworLy8gfSk7CisKKyAgaXQoJ3Nob3VsZCBtYWtlIEpTT05QIHJlcXVlc3QgdG8gaW52YWxpZCBVUkwgYW5kIGludm9rZSB0aGUgZXJyb3IgaGFuZGxlcicsCisgICAgICBmdW5jdGlvbigpIHsKKyAgICBpbnZhbGlkSnNvbnBCdG4uY2xpY2soKTsKKyAgICBmZXRjaEJ0bi5jbGljaygpOworICAgIGV4cGVjdChzdGF0dXMuZ2V0VGV4dCgpKS50b01hdGNoKCcwJyk7CisgICAgZXhwZWN0KGRhdGEuZ2V0VGV4dCgpKS50b01hdGNoKCdSZXF1ZXN0IGZhaWxlZCcpOworICB9KTsKKzwvZmlsZT4KKzwvZXhhbXBsZT4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiAkaHR0cChyZXF1ZXN0Q29uZmlnKSB7CisKKyAgICAgIGlmICghYW5ndWxhci5pc09iamVjdChyZXF1ZXN0Q29uZmlnKSkgeworICAgICAgICB0aHJvdyBtaW5FcnIoJyRodHRwJykoJ2JhZHJlcScsICdIdHRwIHJlcXVlc3QgY29uZmlndXJhdGlvbiBtdXN0IGJlIGFuIG9iamVjdC4gIFJlY2VpdmVkOiB7MH0nLCByZXF1ZXN0Q29uZmlnKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNvbmZpZyA9IGV4dGVuZCh7CisgICAgICAgIG1ldGhvZDogJ2dldCcsCisgICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGRlZmF1bHRzLnRyYW5zZm9ybVJlcXVlc3QsCisgICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBkZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZQorICAgICAgfSwgcmVxdWVzdENvbmZpZyk7CisKKyAgICAgIGNvbmZpZy5oZWFkZXJzID0gbWVyZ2VIZWFkZXJzKHJlcXVlc3RDb25maWcpOworICAgICAgY29uZmlnLm1ldGhvZCA9IHVwcGVyY2FzZShjb25maWcubWV0aG9kKTsKKworICAgICAgdmFyIHNlcnZlclJlcXVlc3QgPSBmdW5jdGlvbihjb25maWcpIHsKKyAgICAgICAgdmFyIGhlYWRlcnMgPSBjb25maWcuaGVhZGVyczsKKyAgICAgICAgdmFyIHJlcURhdGEgPSB0cmFuc2Zvcm1EYXRhKGNvbmZpZy5kYXRhLCBoZWFkZXJzR2V0dGVyKGhlYWRlcnMpLCB1bmRlZmluZWQsIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0KTsKKworICAgICAgICAvLyBzdHJpcCBjb250ZW50LXR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWQKKyAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHJlcURhdGEpKSB7CisgICAgICAgICAgZm9yRWFjaChoZWFkZXJzLCBmdW5jdGlvbih2YWx1ZSwgaGVhZGVyKSB7CisgICAgICAgICAgICBpZiAobG93ZXJjYXNlKGhlYWRlcikgPT09ICdjb250ZW50LXR5cGUnKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIGhlYWRlcnNbaGVhZGVyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1VuZGVmaW5lZChjb25maWcud2l0aENyZWRlbnRpYWxzKSAmJiAhaXNVbmRlZmluZWQoZGVmYXVsdHMud2l0aENyZWRlbnRpYWxzKSkgeworICAgICAgICAgIGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgPSBkZWZhdWx0cy53aXRoQ3JlZGVudGlhbHM7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZW5kIHJlcXVlc3QKKyAgICAgICAgcmV0dXJuIHNlbmRSZXEoY29uZmlnLCByZXFEYXRhKS50aGVuKHRyYW5zZm9ybVJlc3BvbnNlLCB0cmFuc2Zvcm1SZXNwb25zZSk7CisgICAgICB9OworCisgICAgICB2YXIgY2hhaW4gPSBbc2VydmVyUmVxdWVzdCwgdW5kZWZpbmVkXTsKKyAgICAgIHZhciBwcm9taXNlID0gJHEud2hlbihjb25maWcpOworCisgICAgICAvLyBhcHBseSBpbnRlcmNlcHRvcnMKKyAgICAgIGZvckVhY2gocmV2ZXJzZWRJbnRlcmNlcHRvcnMsIGZ1bmN0aW9uKGludGVyY2VwdG9yKSB7CisgICAgICAgIGlmIChpbnRlcmNlcHRvci5yZXF1ZXN0IHx8IGludGVyY2VwdG9yLnJlcXVlc3RFcnJvcikgeworICAgICAgICAgIGNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IucmVxdWVzdCwgaW50ZXJjZXB0b3IucmVxdWVzdEVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50ZXJjZXB0b3IucmVzcG9uc2UgfHwgaW50ZXJjZXB0b3IucmVzcG9uc2VFcnJvcikgeworICAgICAgICAgIGNoYWluLnB1c2goaW50ZXJjZXB0b3IucmVzcG9uc2UsIGludGVyY2VwdG9yLnJlc3BvbnNlRXJyb3IpOworICAgICAgICB9CisgICAgICB9KTsKKworICAgICAgd2hpbGUgKGNoYWluLmxlbmd0aCkgeworICAgICAgICB2YXIgdGhlbkZuID0gY2hhaW4uc2hpZnQoKTsKKyAgICAgICAgdmFyIHJlamVjdEZuID0gY2hhaW4uc2hpZnQoKTsKKworICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHRoZW5GbiwgcmVqZWN0Rm4pOworICAgICAgfQorCisgICAgICBwcm9taXNlLnN1Y2Nlc3MgPSBmdW5jdGlvbihmbikgeworICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgICBmbihyZXNwb25zZS5kYXRhLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMsIGNvbmZpZyk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvbWlzZTsKKyAgICAgIH07CisKKyAgICAgIHByb21pc2UuZXJyb3IgPSBmdW5jdGlvbihmbikgeworICAgICAgICBwcm9taXNlLnRoZW4obnVsbCwgZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgICBmbihyZXNwb25zZS5kYXRhLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMsIGNvbmZpZyk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvbWlzZTsKKyAgICAgIH07CisKKyAgICAgIHJldHVybiBwcm9taXNlOworCisgICAgICBmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShyZXNwb25zZSkgeworICAgICAgICAvLyBtYWtlIGEgY29weSBzaW5jZSB0aGUgcmVzcG9uc2UgbXVzdCBiZSBjYWNoZWFibGUKKyAgICAgICAgdmFyIHJlc3AgPSBleHRlbmQoe30sIHJlc3BvbnNlKTsKKyAgICAgICAgaWYgKCFyZXNwb25zZS5kYXRhKSB7CisgICAgICAgICAgcmVzcC5kYXRhID0gcmVzcG9uc2UuZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXNwLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKHJlc3BvbnNlLmRhdGEsIHJlc3BvbnNlLmhlYWRlcnMsIHJlc3BvbnNlLnN0YXR1cywgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGlzU3VjY2VzcyhyZXNwb25zZS5zdGF0dXMpKQorICAgICAgICAgID8gcmVzcAorICAgICAgICAgIDogJHEucmVqZWN0KHJlc3ApOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBleGVjdXRlSGVhZGVyRm5zKGhlYWRlcnMpIHsKKyAgICAgICAgdmFyIGhlYWRlckNvbnRlbnQsIHByb2Nlc3NlZEhlYWRlcnMgPSB7fTsKKworICAgICAgICBmb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uKGhlYWRlckZuLCBoZWFkZXIpIHsKKyAgICAgICAgICBpZiAoaXNGdW5jdGlvbihoZWFkZXJGbikpIHsKKyAgICAgICAgICAgIGhlYWRlckNvbnRlbnQgPSBoZWFkZXJGbigpOworICAgICAgICAgICAgaWYgKGhlYWRlckNvbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICBwcm9jZXNzZWRIZWFkZXJzW2hlYWRlcl0gPSBoZWFkZXJDb250ZW50OworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm9jZXNzZWRIZWFkZXJzW2hlYWRlcl0gPSBoZWFkZXJGbjsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBwcm9jZXNzZWRIZWFkZXJzOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBtZXJnZUhlYWRlcnMoY29uZmlnKSB7CisgICAgICAgIHZhciBkZWZIZWFkZXJzID0gZGVmYXVsdHMuaGVhZGVycywKKyAgICAgICAgICAgIHJlcUhlYWRlcnMgPSBleHRlbmQoe30sIGNvbmZpZy5oZWFkZXJzKSwKKyAgICAgICAgICAgIGRlZkhlYWRlck5hbWUsIGxvd2VyY2FzZURlZkhlYWRlck5hbWUsIHJlcUhlYWRlck5hbWU7CisKKyAgICAgICAgZGVmSGVhZGVycyA9IGV4dGVuZCh7fSwgZGVmSGVhZGVycy5jb21tb24sIGRlZkhlYWRlcnNbbG93ZXJjYXNlKGNvbmZpZy5tZXRob2QpXSk7CisKKyAgICAgICAgLy8gdXNpbmcgZm9yLWluIGluc3RlYWQgb2YgZm9yRWFjaCB0byBhdm9pZCB1bmVjZXNzYXJ5IGl0ZXJhdGlvbiBhZnRlciBoZWFkZXIgaGFzIGJlZW4gZm91bmQKKyAgICAgICAgZGVmYXVsdEhlYWRlcnNJdGVyYXRpb246CisgICAgICAgIGZvciAoZGVmSGVhZGVyTmFtZSBpbiBkZWZIZWFkZXJzKSB7CisgICAgICAgICAgbG93ZXJjYXNlRGVmSGVhZGVyTmFtZSA9IGxvd2VyY2FzZShkZWZIZWFkZXJOYW1lKTsKKworICAgICAgICAgIGZvciAocmVxSGVhZGVyTmFtZSBpbiByZXFIZWFkZXJzKSB7CisgICAgICAgICAgICBpZiAobG93ZXJjYXNlKHJlcUhlYWRlck5hbWUpID09PSBsb3dlcmNhc2VEZWZIZWFkZXJOYW1lKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlIGRlZmF1bHRIZWFkZXJzSXRlcmF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHJlcUhlYWRlcnNbZGVmSGVhZGVyTmFtZV0gPSBkZWZIZWFkZXJzW2RlZkhlYWRlck5hbWVdOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXhlY3V0ZSBpZiBoZWFkZXIgdmFsdWUgaXMgYSBmdW5jdGlvbiBmb3IgbWVyZ2VkIGhlYWRlcnMKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVIZWFkZXJGbnMocmVxSGVhZGVycyk7CisgICAgICB9CisgICAgfQorCisgICAgJGh0dHAucGVuZGluZ1JlcXVlc3RzID0gW107CisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICogQG5hbWUgJGh0dHAjZ2V0CisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgR0VUYCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBVUkwgc3BlY2lmeWluZyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdAorICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gRnV0dXJlIG9iamVjdAorICAgICAqLworCisgICAgLyoqCisgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAqIEBuYW1lICRodHRwI2RlbGV0ZQorICAgICAqCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gYERFTEVURWAgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0CisgICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IEZ1dHVyZSBvYmplY3QKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgKiBAbmFtZSAkaHR0cCNoZWFkCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgSEVBRGAgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0CisgICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IEZ1dHVyZSBvYmplY3QKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgKiBAbmFtZSAkaHR0cCNqc29ucAorICAgICAqCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gYEpTT05QYCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBVUkwgc3BlY2lmeWluZyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHJlcXVlc3QuCisgICAgICogICAgICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY2FsbGJhY2sgc2hvdWxkIGJlIHRoZSBzdHJpbmcgYEpTT05fQ0FMTEJBQ0tgLgorICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBGdXR1cmUgb2JqZWN0CisgICAgICovCisgICAgY3JlYXRlU2hvcnRNZXRob2RzKCdnZXQnLCAnZGVsZXRlJywgJ2hlYWQnLCAnanNvbnAnKTsKKworICAgIC8qKgorICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgKiBAbmFtZSAkaHR0cCNwb3N0CisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgUE9TVGAgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0CisgICAgICogQHBhcmFtIHsqfSBkYXRhIFJlcXVlc3QgY29udGVudAorICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBGdXR1cmUgb2JqZWN0CisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICogQG5hbWUgJGh0dHAjcHV0CisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgUFVUYCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBVUkwgc3BlY2lmeWluZyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0geyp9IGRhdGEgUmVxdWVzdCBjb250ZW50CisgICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IEZ1dHVyZSBvYmplY3QKKyAgICAgKi8KKworICAgICAvKioKKyAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgKiBAbmFtZSAkaHR0cCNwYXRjaAorICAgICAgKgorICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gYFBBVENIYCByZXF1ZXN0LgorICAgICAgKgorICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFJlbGF0aXZlIG9yIGFic29sdXRlIFVSTCBzcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdAorICAgICAgKiBAcGFyYW0geyp9IGRhdGEgUmVxdWVzdCBjb250ZW50CisgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gRnV0dXJlIG9iamVjdAorICAgICAgKi8KKyAgICBjcmVhdGVTaG9ydE1ldGhvZHNXaXRoRGF0YSgncG9zdCcsICdwdXQnLCAncGF0Y2gnKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQG5nZG9jIHByb3BlcnR5CisgICAgICAgICAqIEBuYW1lICRodHRwI2RlZmF1bHRzCisgICAgICAgICAqCisgICAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICAgKiBSdW50aW1lIGVxdWl2YWxlbnQgb2YgdGhlIGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzYCBwcm9wZXJ0eS4gQWxsb3dzIGNvbmZpZ3VyYXRpb24gb2YKKyAgICAgICAgICogZGVmYXVsdCBoZWFkZXJzLCB3aXRoQ3JlZGVudGlhbHMgYXMgd2VsbCBhcyByZXF1ZXN0IGFuZCByZXNwb25zZSB0cmFuc2Zvcm1hdGlvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIFNlZSAiU2V0dGluZyBIVFRQIEhlYWRlcnMiIGFuZCAiVHJhbnNmb3JtaW5nIFJlcXVlc3RzIGFuZCBSZXNwb25zZXMiIHNlY3Rpb25zIGFib3ZlLgorICAgICAgICAgKi8KKyAgICAkaHR0cC5kZWZhdWx0cyA9IGRlZmF1bHRzOworCisKKyAgICByZXR1cm4gJGh0dHA7CisKKworICAgIGZ1bmN0aW9uIGNyZWF0ZVNob3J0TWV0aG9kcyhuYW1lcykgeworICAgICAgZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgJGh0dHBbbmFtZV0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykgeworICAgICAgICAgIHJldHVybiAkaHR0cChleHRlbmQoY29uZmlnIHx8IHt9LCB7CisgICAgICAgICAgICBtZXRob2Q6IG5hbWUsCisgICAgICAgICAgICB1cmw6IHVybAorICAgICAgICAgIH0pKTsKKyAgICAgICAgfTsKKyAgICAgIH0pOworICAgIH0KKworCisgICAgZnVuY3Rpb24gY3JlYXRlU2hvcnRNZXRob2RzV2l0aERhdGEobmFtZSkgeworICAgICAgZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgJGh0dHBbbmFtZV0gPSBmdW5jdGlvbih1cmwsIGRhdGEsIGNvbmZpZykgeworICAgICAgICAgIHJldHVybiAkaHR0cChleHRlbmQoY29uZmlnIHx8IHt9LCB7CisgICAgICAgICAgICBtZXRob2Q6IG5hbWUsCisgICAgICAgICAgICB1cmw6IHVybCwKKyAgICAgICAgICAgIGRhdGE6IGRhdGEKKyAgICAgICAgICB9KSk7CisgICAgICAgIH07CisgICAgICB9KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSByZXF1ZXN0LgorICAgICAqCisgICAgICogISEhIEFDQ0VTU0VTIENMT1NVUkUgVkFSUzoKKyAgICAgKiAkaHR0cEJhY2tlbmQsIGRlZmF1bHRzLCAkbG9nLCAkcm9vdFNjb3BlLCBkZWZhdWx0Q2FjaGUsICRodHRwLnBlbmRpbmdSZXF1ZXN0cworICAgICAqLworICAgIGZ1bmN0aW9uIHNlbmRSZXEoY29uZmlnLCByZXFEYXRhKSB7CisgICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpLAorICAgICAgICAgIHByb21pc2UgPSBkZWZlcnJlZC5wcm9taXNlLAorICAgICAgICAgIGNhY2hlLAorICAgICAgICAgIGNhY2hlZFJlc3AsCisgICAgICAgICAgcmVxSGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzLAorICAgICAgICAgIHVybCA9IGJ1aWxkVXJsKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMpOworCisgICAgICAkaHR0cC5wZW5kaW5nUmVxdWVzdHMucHVzaChjb25maWcpOworICAgICAgcHJvbWlzZS50aGVuKHJlbW92ZVBlbmRpbmdSZXEsIHJlbW92ZVBlbmRpbmdSZXEpOworCisKKyAgICAgIGlmICgoY29uZmlnLmNhY2hlIHx8IGRlZmF1bHRzLmNhY2hlKSAmJiBjb25maWcuY2FjaGUgIT09IGZhbHNlICYmCisgICAgICAgICAgKGNvbmZpZy5tZXRob2QgPT09ICdHRVQnIHx8IGNvbmZpZy5tZXRob2QgPT09ICdKU09OUCcpKSB7CisgICAgICAgIGNhY2hlID0gaXNPYmplY3QoY29uZmlnLmNhY2hlKSA/IGNvbmZpZy5jYWNoZQorICAgICAgICAgICAgICA6IGlzT2JqZWN0KGRlZmF1bHRzLmNhY2hlKSA/IGRlZmF1bHRzLmNhY2hlCisgICAgICAgICAgICAgIDogZGVmYXVsdENhY2hlOworICAgICAgfQorCisgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgY2FjaGVkUmVzcCA9IGNhY2hlLmdldCh1cmwpOworICAgICAgICBpZiAoaXNEZWZpbmVkKGNhY2hlZFJlc3ApKSB7CisgICAgICAgICAgaWYgKGlzUHJvbWlzZUxpa2UoY2FjaGVkUmVzcCkpIHsKKyAgICAgICAgICAgIC8vIGNhY2hlZCByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4gc2VudCwgYnV0IHRoZXJlIGlzIG5vIHJlc3BvbnNlIHlldAorICAgICAgICAgICAgY2FjaGVkUmVzcC50aGVuKHJlc29sdmVQcm9taXNlV2l0aFJlc3VsdCwgcmVzb2x2ZVByb21pc2VXaXRoUmVzdWx0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc2VydmluZyBmcm9tIGNhY2hlCisgICAgICAgICAgICBpZiAoaXNBcnJheShjYWNoZWRSZXNwKSkgeworICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShjYWNoZWRSZXNwWzFdLCBjYWNoZWRSZXNwWzBdLCBzaGFsbG93Q29weShjYWNoZWRSZXNwWzJdKSwgY2FjaGVkUmVzcFszXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShjYWNoZWRSZXNwLCAyMDAsIHt9LCAnT0snKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gcHV0IHRoZSBwcm9taXNlIGZvciB0aGUgbm9uLXRyYW5zZm9ybWVkIHJlc3BvbnNlIGludG8gY2FjaGUgYXMgYSBwbGFjZWhvbGRlcgorICAgICAgICAgIGNhY2hlLnB1dCh1cmwsIHByb21pc2UpOworICAgICAgICB9CisgICAgICB9CisKKworICAgICAgLy8gaWYgd2Ugd29uJ3QgaGF2ZSB0aGUgcmVzcG9uc2UgaW4gY2FjaGUsIHNldCB0aGUgeHNyZiBoZWFkZXJzIGFuZAorICAgICAgLy8gc2VuZCB0aGUgcmVxdWVzdCB0byB0aGUgYmFja2VuZAorICAgICAgaWYgKGlzVW5kZWZpbmVkKGNhY2hlZFJlc3ApKSB7CisgICAgICAgIHZhciB4c3JmVmFsdWUgPSB1cmxJc1NhbWVPcmlnaW4oY29uZmlnLnVybCkKKyAgICAgICAgICAgID8gJGJyb3dzZXIuY29va2llcygpW2NvbmZpZy54c3JmQ29va2llTmFtZSB8fCBkZWZhdWx0cy54c3JmQ29va2llTmFtZV0KKyAgICAgICAgICAgIDogdW5kZWZpbmVkOworICAgICAgICBpZiAoeHNyZlZhbHVlKSB7CisgICAgICAgICAgcmVxSGVhZGVyc1soY29uZmlnLnhzcmZIZWFkZXJOYW1lIHx8IGRlZmF1bHRzLnhzcmZIZWFkZXJOYW1lKV0gPSB4c3JmVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAkaHR0cEJhY2tlbmQoY29uZmlnLm1ldGhvZCwgdXJsLCByZXFEYXRhLCBkb25lLCByZXFIZWFkZXJzLCBjb25maWcudGltZW91dCwKKyAgICAgICAgICAgIGNvbmZpZy53aXRoQ3JlZGVudGlhbHMsIGNvbmZpZy5yZXNwb25zZVR5cGUpOworICAgICAgfQorCisgICAgICByZXR1cm4gcHJvbWlzZTsKKworCisgICAgICAvKioKKyAgICAgICAqIENhbGxiYWNrIHJlZ2lzdGVyZWQgdG8gJGh0dHBCYWNrZW5kKCk6CisgICAgICAgKiAgLSBjYWNoZXMgdGhlIHJlc3BvbnNlIGlmIGRlc2lyZWQKKyAgICAgICAqICAtIHJlc29sdmVzIHRoZSByYXcgJGh0dHAgcHJvbWlzZQorICAgICAgICogIC0gY2FsbHMgJGFwcGx5CisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uIGRvbmUoc3RhdHVzLCByZXNwb25zZSwgaGVhZGVyc1N0cmluZywgc3RhdHVzVGV4dCkgeworICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICBpZiAoaXNTdWNjZXNzKHN0YXR1cykpIHsKKyAgICAgICAgICAgIGNhY2hlLnB1dCh1cmwsIFtzdGF0dXMsIHJlc3BvbnNlLCBwYXJzZUhlYWRlcnMoaGVhZGVyc1N0cmluZyksIHN0YXR1c1RleHRdKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmVtb3ZlIHByb21pc2UgZnJvbSB0aGUgY2FjaGUKKyAgICAgICAgICAgIGNhY2hlLnJlbW92ZSh1cmwpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHJlc29sdmVIdHRwUHJvbWlzZSgpIHsKKyAgICAgICAgICByZXNvbHZlUHJvbWlzZShyZXNwb25zZSwgc3RhdHVzLCBoZWFkZXJzU3RyaW5nLCBzdGF0dXNUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1c2VBcHBseUFzeW5jKSB7CisgICAgICAgICAgJHJvb3RTY29wZS4kYXBwbHlBc3luYyhyZXNvbHZlSHR0cFByb21pc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc29sdmVIdHRwUHJvbWlzZSgpOworICAgICAgICAgIGlmICghJHJvb3RTY29wZS4kJHBoYXNlKSAkcm9vdFNjb3BlLiRhcHBseSgpOworICAgICAgICB9CisgICAgICB9CisKKworICAgICAgLyoqCisgICAgICAgKiBSZXNvbHZlcyB0aGUgcmF3ICRodHRwIHByb21pc2UuCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHJlc3BvbnNlLCBzdGF0dXMsIGhlYWRlcnMsIHN0YXR1c1RleHQpIHsKKyAgICAgICAgLy8gbm9ybWFsaXplIGludGVybmFsIHN0YXR1c2VzIHRvIDAKKyAgICAgICAgc3RhdHVzID0gTWF0aC5tYXgoc3RhdHVzLCAwKTsKKworICAgICAgICAoaXNTdWNjZXNzKHN0YXR1cykgPyBkZWZlcnJlZC5yZXNvbHZlIDogZGVmZXJyZWQucmVqZWN0KSh7CisgICAgICAgICAgZGF0YTogcmVzcG9uc2UsCisgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsCisgICAgICAgICAgaGVhZGVyczogaGVhZGVyc0dldHRlcihoZWFkZXJzKSwKKyAgICAgICAgICBjb25maWc6IGNvbmZpZywKKyAgICAgICAgICBzdGF0dXNUZXh0OiBzdGF0dXNUZXh0CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiByZXNvbHZlUHJvbWlzZVdpdGhSZXN1bHQocmVzdWx0KSB7CisgICAgICAgIHJlc29sdmVQcm9taXNlKHJlc3VsdC5kYXRhLCByZXN1bHQuc3RhdHVzLCBzaGFsbG93Q29weShyZXN1bHQuaGVhZGVycygpKSwgcmVzdWx0LnN0YXR1c1RleHQpOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiByZW1vdmVQZW5kaW5nUmVxKCkgeworICAgICAgICB2YXIgaWR4ID0gJGh0dHAucGVuZGluZ1JlcXVlc3RzLmluZGV4T2YoY29uZmlnKTsKKyAgICAgICAgaWYgKGlkeCAhPT0gLTEpICRodHRwLnBlbmRpbmdSZXF1ZXN0cy5zcGxpY2UoaWR4LCAxKTsKKyAgICAgIH0KKyAgICB9CisKKworICAgIGZ1bmN0aW9uIGJ1aWxkVXJsKHVybCwgcGFyYW1zKSB7CisgICAgICBpZiAoIXBhcmFtcykgcmV0dXJuIHVybDsKKyAgICAgIHZhciBwYXJ0cyA9IFtdOworICAgICAgZm9yRWFjaFNvcnRlZChwYXJhbXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKKyAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IGlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuOworICAgICAgICBpZiAoIWlzQXJyYXkodmFsdWUpKSB2YWx1ZSA9IFt2YWx1ZV07CisKKyAgICAgICAgZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24odikgeworICAgICAgICAgIGlmIChpc09iamVjdCh2KSkgeworICAgICAgICAgICAgaWYgKGlzRGF0ZSh2KSkgeworICAgICAgICAgICAgICB2ID0gdi50b0lTT1N0cmluZygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdiA9IHRvSnNvbih2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcGFydHMucHVzaChlbmNvZGVVcmlRdWVyeShrZXkpICsgJz0nICsKKyAgICAgICAgICAgICAgICAgICAgIGVuY29kZVVyaVF1ZXJ5KHYpKTsKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAwKSB7CisgICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCc/JykgPT0gLTEpID8gJz8nIDogJyYnKSArIHBhcnRzLmpvaW4oJyYnKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB1cmw7CisgICAgfQorICB9XTsKK30KKworZnVuY3Rpb24gY3JlYXRlWGhyKCkgeworICAgIHJldHVybiBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7Cit9CisKKy8qKgorICogQG5nZG9jIHNlcnZpY2UKKyAqIEBuYW1lICRodHRwQmFja2VuZAorICogQHJlcXVpcmVzICR3aW5kb3cKKyAqIEByZXF1aXJlcyAkZG9jdW1lbnQKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIEhUVFAgYmFja2VuZCB1c2VkIGJ5IHRoZSB7QGxpbmsgbmcuJGh0dHAgc2VydmljZX0gdGhhdCBkZWxlZ2F0ZXMgdG8KKyAqIFhNTEh0dHBSZXF1ZXN0IG9iamVjdCBvciBKU09OUCBhbmQgZGVhbHMgd2l0aCBicm93c2VyIGluY29tcGF0aWJpbGl0aWVzLgorICoKKyAqIFlvdSBzaG91bGQgbmV2ZXIgbmVlZCB0byB1c2UgdGhpcyBzZXJ2aWNlIGRpcmVjdGx5LCBpbnN0ZWFkIHVzZSB0aGUgaGlnaGVyLWxldmVsIGFic3RyYWN0aW9uczoKKyAqIHtAbGluayBuZy4kaHR0cCAkaHR0cH0gb3Ige0BsaW5rIG5nUmVzb3VyY2UuJHJlc291cmNlICRyZXNvdXJjZX0uCisgKgorICogRHVyaW5nIHRlc3RpbmcgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzd2FwcGVkIHdpdGgge0BsaW5rIG5nTW9jay4kaHR0cEJhY2tlbmQgbW9jaworICogJGh0dHBCYWNrZW5kfSB3aGljaCBjYW4gYmUgdHJhaW5lZCB3aXRoIHJlc3BvbnNlcy4KKyAqLworZnVuY3Rpb24gJEh0dHBCYWNrZW5kUHJvdmlkZXIoKSB7CisgIHRoaXMuJGdldCA9IFsnJGJyb3dzZXInLCAnJHdpbmRvdycsICckZG9jdW1lbnQnLCBmdW5jdGlvbigkYnJvd3NlciwgJHdpbmRvdywgJGRvY3VtZW50KSB7CisgICAgcmV0dXJuIGNyZWF0ZUh0dHBCYWNrZW5kKCRicm93c2VyLCBjcmVhdGVYaHIsICRicm93c2VyLmRlZmVyLCAkd2luZG93LmFuZ3VsYXIuY2FsbGJhY2tzLCAkZG9jdW1lbnRbMF0pOworICB9XTsKK30KKworZnVuY3Rpb24gY3JlYXRlSHR0cEJhY2tlbmQoJGJyb3dzZXIsIGNyZWF0ZVhociwgJGJyb3dzZXJEZWZlciwgY2FsbGJhY2tzLCByYXdEb2N1bWVudCkgeworICAvLyBUT0RPKHZvanRhKTogZml4IHRoZSBzaWduYXR1cmUKKyAgcmV0dXJuIGZ1bmN0aW9uKG1ldGhvZCwgdXJsLCBwb3N0LCBjYWxsYmFjaywgaGVhZGVycywgdGltZW91dCwgd2l0aENyZWRlbnRpYWxzLCByZXNwb25zZVR5cGUpIHsKKyAgICAkYnJvd3Nlci4kJGluY091dHN0YW5kaW5nUmVxdWVzdENvdW50KCk7CisgICAgdXJsID0gdXJsIHx8ICRicm93c2VyLnVybCgpOworCisgICAgaWYgKGxvd2VyY2FzZShtZXRob2QpID09ICdqc29ucCcpIHsKKyAgICAgIHZhciBjYWxsYmFja0lkID0gJ18nICsgKGNhbGxiYWNrcy5jb3VudGVyKyspLnRvU3RyaW5nKDM2KTsKKyAgICAgIGNhbGxiYWNrc1tjYWxsYmFja0lkXSA9IGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgICAgY2FsbGJhY2tzW2NhbGxiYWNrSWRdLmRhdGEgPSBkYXRhOworICAgICAgICBjYWxsYmFja3NbY2FsbGJhY2tJZF0uY2FsbGVkID0gdHJ1ZTsKKyAgICAgIH07CisKKyAgICAgIHZhciBqc29ucERvbmUgPSBqc29ucFJlcSh1cmwucmVwbGFjZSgnSlNPTl9DQUxMQkFDSycsICdhbmd1bGFyLmNhbGxiYWNrcy4nICsgY2FsbGJhY2tJZCksCisgICAgICAgICAgY2FsbGJhY2tJZCwgZnVuY3Rpb24oc3RhdHVzLCB0ZXh0KSB7CisgICAgICAgIGNvbXBsZXRlUmVxdWVzdChjYWxsYmFjaywgc3RhdHVzLCBjYWxsYmFja3NbY2FsbGJhY2tJZF0uZGF0YSwgIiIsIHRleHQpOworICAgICAgICBjYWxsYmFja3NbY2FsbGJhY2tJZF0gPSBub29wOworICAgICAgfSk7CisgICAgfSBlbHNlIHsKKworICAgICAgdmFyIHhociA9IGNyZWF0ZVhocigpOworCisgICAgICB4aHIub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7CisgICAgICBmb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKKyAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgICB9KTsKKworICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uIHJlcXVlc3RMb2FkZWQoKSB7CisgICAgICAgIHZhciBzdGF0dXNUZXh0ID0geGhyLnN0YXR1c1RleHQgfHwgJyc7CisKKyAgICAgICAgLy8gcmVzcG9uc2VUZXh0IGlzIHRoZSBvbGQtc2Nob29sIHdheSBvZiByZXRyaWV2aW5nIHJlc3BvbnNlIChzdXBwb3J0ZWQgYnkgSUU4ICYgOSkKKyAgICAgICAgLy8gcmVzcG9uc2UvcmVzcG9uc2VUeXBlIHByb3BlcnRpZXMgd2VyZSBpbnRyb2R1Y2VkIGluIFhIUiBMZXZlbDIgc3BlYyAoc3VwcG9ydGVkIGJ5IElFMTApCisgICAgICAgIHZhciByZXNwb25zZSA9ICgncmVzcG9uc2UnIGluIHhocikgPyB4aHIucmVzcG9uc2UgOiB4aHIucmVzcG9uc2VUZXh0OworCisgICAgICAgIC8vIG5vcm1hbGl6ZSBJRTkgYnVnIChodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xNDUwKQorICAgICAgICB2YXIgc3RhdHVzID0geGhyLnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IHhoci5zdGF0dXM7CisKKyAgICAgICAgLy8gZml4IHN0YXR1cyBjb2RlIHdoZW4gaXQgaXMgMCAoMCBzdGF0dXMgaXMgdW5kb2N1bWVudGVkKS4KKyAgICAgICAgLy8gT2NjdXJzIHdoZW4gYWNjZXNzaW5nIGZpbGUgcmVzb3VyY2VzIG9yIG9uIEFuZHJvaWQgNC4xIHN0b2NrIGJyb3dzZXIKKyAgICAgICAgLy8gd2hpbGUgcmV0cmlldmluZyBmaWxlcyBmcm9tIGFwcGxpY2F0aW9uIGNhY2hlLgorICAgICAgICBpZiAoc3RhdHVzID09PSAwKSB7CisgICAgICAgICAgc3RhdHVzID0gcmVzcG9uc2UgPyAyMDAgOiB1cmxSZXNvbHZlKHVybCkucHJvdG9jb2wgPT0gJ2ZpbGUnID8gNDA0IDogMDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbXBsZXRlUmVxdWVzdChjYWxsYmFjaywKKyAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgIHJlc3BvbnNlLAorICAgICAgICAgICAgeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLAorICAgICAgICAgICAgc3RhdHVzVGV4dCk7CisgICAgICB9OworCisgICAgICB2YXIgcmVxdWVzdEVycm9yID0gZnVuY3Rpb24oKSB7CisgICAgICAgIC8vIFRoZSByZXNwb25zZSBpcyBhbHdheXMgZW1wdHkKKyAgICAgICAgLy8gU2VlIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdC1lcnJvci1zdGVwcyBhbmQgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtbmV0d29yay1lcnJvcgorICAgICAgICBjb21wbGV0ZVJlcXVlc3QoY2FsbGJhY2ssIC0xLCBudWxsLCBudWxsLCAnJyk7CisgICAgICB9OworCisgICAgICB4aHIub25lcnJvciA9IHJlcXVlc3RFcnJvcjsKKyAgICAgIHhoci5vbmFib3J0ID0gcmVxdWVzdEVycm9yOworCisgICAgICBpZiAod2l0aENyZWRlbnRpYWxzKSB7CisgICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlOworICAgICAgfQorCisgICAgICBpZiAocmVzcG9uc2VUeXBlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgIC8vIFdlYktpdCBhZGRlZCBzdXBwb3J0IGZvciB0aGUganNvbiByZXNwb25zZVR5cGUgdmFsdWUgb24gMDkvMDMvMjAxMworICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY0OC4gVmVyc2lvbnMgb2YgU2FmYXJpIHByaW9yIHRvIDcgYXJlCisgICAgICAgICAgLy8ga25vd24gdG8gdGhyb3cgd2hlbiBzZXR0aW5nIHRoZSB2YWx1ZSAianNvbiIgYXMgdGhlIHJlc3BvbnNlIHR5cGUuIE90aGVyIG9sZGVyCisgICAgICAgICAgLy8gYnJvd3NlcnMgaW1wbGVtZW50aW5nIHRoZSByZXNwb25zZVR5cGUKKyAgICAgICAgICAvLworICAgICAgICAgIC8vIFRoZSBqc29uIHJlc3BvbnNlIHR5cGUgY2FuIGJlIGlnbm9yZWQgaWYgbm90IHN1cHBvcnRlZCwgYmVjYXVzZSBKU09OIHBheWxvYWRzIGFyZQorICAgICAgICAgIC8vIHBhcnNlZCBvbiB0aGUgY2xpZW50LXNpZGUgcmVnYXJkbGVzcy4KKyAgICAgICAgICBpZiAocmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHhoci5zZW5kKHBvc3QgfHwgbnVsbCk7CisgICAgfQorCisgICAgaWYgKHRpbWVvdXQgPiAwKSB7CisgICAgICB2YXIgdGltZW91dElkID0gJGJyb3dzZXJEZWZlcih0aW1lb3V0UmVxdWVzdCwgdGltZW91dCk7CisgICAgfSBlbHNlIGlmIChpc1Byb21pc2VMaWtlKHRpbWVvdXQpKSB7CisgICAgICB0aW1lb3V0LnRoZW4odGltZW91dFJlcXVlc3QpOworICAgIH0KKworCisgICAgZnVuY3Rpb24gdGltZW91dFJlcXVlc3QoKSB7CisgICAgICBqc29ucERvbmUgJiYganNvbnBEb25lKCk7CisgICAgICB4aHIgJiYgeGhyLmFib3J0KCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gY29tcGxldGVSZXF1ZXN0KGNhbGxiYWNrLCBzdGF0dXMsIHJlc3BvbnNlLCBoZWFkZXJzU3RyaW5nLCBzdGF0dXNUZXh0KSB7CisgICAgICAvLyBjYW5jZWwgdGltZW91dCBhbmQgc3Vic2VxdWVudCB0aW1lb3V0IHByb21pc2UgcmVzb2x1dGlvbgorICAgICAgaWYgKHRpbWVvdXRJZCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgICRicm93c2VyRGVmZXIuY2FuY2VsKHRpbWVvdXRJZCk7CisgICAgICB9CisgICAgICBqc29ucERvbmUgPSB4aHIgPSBudWxsOworCisgICAgICBjYWxsYmFjayhzdGF0dXMsIHJlc3BvbnNlLCBoZWFkZXJzU3RyaW5nLCBzdGF0dXNUZXh0KTsKKyAgICAgICRicm93c2VyLiQkY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3Qobm9vcCk7CisgICAgfQorICB9OworCisgIGZ1bmN0aW9uIGpzb25wUmVxKHVybCwgY2FsbGJhY2tJZCwgZG9uZSkgeworICAgIC8vIHdlIGNhbid0IHVzZSBqUXVlcnkvanFMaXRlIGhlcmUgYmVjYXVzZSBqUXVlcnkgZG9lcyBjcmF6eSBzaGl0IHdpdGggc2NyaXB0IGVsZW1lbnRzLCBlLmcuOgorICAgIC8vIC0gZmV0Y2hlcyBsb2NhbCBzY3JpcHRzIHZpYSBYSFIgYW5kIGV2YWxzIHRoZW0KKyAgICAvLyAtIGFkZHMgYW5kIGltbWVkaWF0ZWx5IHJlbW92ZXMgc2NyaXB0IGVsZW1lbnRzIGZyb20gdGhlIGRvY3VtZW50CisgICAgdmFyIHNjcmlwdCA9IHJhd0RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpLCBjYWxsYmFjayA9IG51bGw7CisgICAgc2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKKyAgICBzY3JpcHQuc3JjID0gdXJsOworICAgIHNjcmlwdC5hc3luYyA9IHRydWU7CisKKyAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICByZW1vdmVFdmVudExpc3RlbmVyRm4oc2NyaXB0LCAibG9hZCIsIGNhbGxiYWNrKTsKKyAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJGbihzY3JpcHQsICJlcnJvciIsIGNhbGxiYWNrKTsKKyAgICAgIHJhd0RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2NyaXB0KTsKKyAgICAgIHNjcmlwdCA9IG51bGw7CisgICAgICB2YXIgc3RhdHVzID0gLTE7CisgICAgICB2YXIgdGV4dCA9ICJ1bmtub3duIjsKKworICAgICAgaWYgKGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC50eXBlID09PSAibG9hZCIgJiYgIWNhbGxiYWNrc1tjYWxsYmFja0lkXS5jYWxsZWQpIHsKKyAgICAgICAgICBldmVudCA9IHsgdHlwZTogImVycm9yIiB9OworICAgICAgICB9CisgICAgICAgIHRleHQgPSBldmVudC50eXBlOworICAgICAgICBzdGF0dXMgPSBldmVudC50eXBlID09PSAiZXJyb3IiID8gNDA0IDogMjAwOworICAgICAgfQorCisgICAgICBpZiAoZG9uZSkgeworICAgICAgICBkb25lKHN0YXR1cywgdGV4dCk7CisgICAgICB9CisgICAgfTsKKworICAgIGFkZEV2ZW50TGlzdGVuZXJGbihzY3JpcHQsICJsb2FkIiwgY2FsbGJhY2spOworICAgIGFkZEV2ZW50TGlzdGVuZXJGbihzY3JpcHQsICJlcnJvciIsIGNhbGxiYWNrKTsKKyAgICByYXdEb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7CisgICAgcmV0dXJuIGNhbGxiYWNrOworICB9Cit9CisKK3ZhciAkaW50ZXJwb2xhdGVNaW5FcnIgPSBtaW5FcnIoJyRpbnRlcnBvbGF0ZScpOworCisvKioKKyAqIEBuZ2RvYyBwcm92aWRlcgorICogQG5hbWUgJGludGVycG9sYXRlUHJvdmlkZXIKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBVc2VkIGZvciBjb25maWd1cmluZyB0aGUgaW50ZXJwb2xhdGlvbiBtYXJrdXAuIERlZmF1bHRzIHRvIGB7e2AgYW5kIGB9fWAuCisgKgorICogQGV4YW1wbGUKKzxleGFtcGxlIG1vZHVsZT0iY3VzdG9tSW50ZXJwb2xhdGlvbkFwcCI+Cis8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKzxzY3JpcHQ+CisgIHZhciBjdXN0b21JbnRlcnBvbGF0aW9uQXBwID0gYW5ndWxhci5tb2R1bGUoJ2N1c3RvbUludGVycG9sYXRpb25BcHAnLCBbXSk7CisKKyAgY3VzdG9tSW50ZXJwb2xhdGlvbkFwcC5jb25maWcoZnVuY3Rpb24oJGludGVycG9sYXRlUHJvdmlkZXIpIHsKKyAgICAkaW50ZXJwb2xhdGVQcm92aWRlci5zdGFydFN5bWJvbCgnLy8nKTsKKyAgICAkaW50ZXJwb2xhdGVQcm92aWRlci5lbmRTeW1ib2woJy8vJyk7CisgIH0pOworCisKKyAgY3VzdG9tSW50ZXJwb2xhdGlvbkFwcC5jb250cm9sbGVyKCdEZW1vQ29udHJvbGxlcicsIGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5sYWJlbCA9ICJUaGlzIGJpbmRpbmcgaXMgYnJvdWdodCB5b3UgYnkgLy8gaW50ZXJwb2xhdGlvbiBzeW1ib2xzLiI7CisgIH0pOworPC9zY3JpcHQ+Cis8ZGl2IG5nLWFwcD0iQXBwIiBuZy1jb250cm9sbGVyPSJEZW1vQ29udHJvbGxlciBhcyBkZW1vIj4KKyAgICAvL2RlbW8ubGFiZWwvLworPC9kaXY+Cis8L2ZpbGU+Cis8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAgaXQoJ3Nob3VsZCBpbnRlcnBvbGF0ZSBiaW5kaW5nIHdpdGggY3VzdG9tIHN5bWJvbHMnLCBmdW5jdGlvbigpIHsKKyAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdkZW1vLmxhYmVsJykpLmdldFRleHQoKSkudG9CZSgnVGhpcyBiaW5kaW5nIGlzIGJyb3VnaHQgeW91IGJ5IC8vIGludGVycG9sYXRpb24gc3ltYm9scy4nKTsKKyAgfSk7Cis8L2ZpbGU+Cis8L2V4YW1wbGU+CisgKi8KK2Z1bmN0aW9uICRJbnRlcnBvbGF0ZVByb3ZpZGVyKCkgeworICB2YXIgc3RhcnRTeW1ib2wgPSAne3snOworICB2YXIgZW5kU3ltYm9sID0gJ319JzsKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAkaW50ZXJwb2xhdGVQcm92aWRlciNzdGFydFN5bWJvbAorICAgKiBAZGVzY3JpcHRpb24KKyAgICogU3ltYm9sIHRvIGRlbm90ZSBzdGFydCBvZiBleHByZXNzaW9uIGluIHRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nLiBEZWZhdWx0cyB0byBge3tgLgorICAgKgorICAgKiBAcGFyYW0ge3N0cmluZz19IHZhbHVlIG5ldyB2YWx1ZSB0byBzZXQgdGhlIHN0YXJ0aW5nIHN5bWJvbCB0by4KKyAgICogQHJldHVybnMge3N0cmluZ3xzZWxmfSBSZXR1cm5zIHRoZSBzeW1ib2wgd2hlbiB1c2VkIGFzIGdldHRlciBhbmQgc2VsZiBpZiB1c2VkIGFzIHNldHRlci4KKyAgICovCisgIHRoaXMuc3RhcnRTeW1ib2wgPSBmdW5jdGlvbih2YWx1ZSkgeworICAgIGlmICh2YWx1ZSkgeworICAgICAgc3RhcnRTeW1ib2wgPSB2YWx1ZTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gc3RhcnRTeW1ib2w7CisgICAgfQorICB9OworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRpbnRlcnBvbGF0ZVByb3ZpZGVyI2VuZFN5bWJvbAorICAgKiBAZGVzY3JpcHRpb24KKyAgICogU3ltYm9sIHRvIGRlbm90ZSB0aGUgZW5kIG9mIGV4cHJlc3Npb24gaW4gdGhlIGludGVycG9sYXRlZCBzdHJpbmcuIERlZmF1bHRzIHRvIGB9fWAuCisgICAqCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gdmFsdWUgbmV3IHZhbHVlIHRvIHNldCB0aGUgZW5kaW5nIHN5bWJvbCB0by4KKyAgICogQHJldHVybnMge3N0cmluZ3xzZWxmfSBSZXR1cm5zIHRoZSBzeW1ib2wgd2hlbiB1c2VkIGFzIGdldHRlciBhbmQgc2VsZiBpZiB1c2VkIGFzIHNldHRlci4KKyAgICovCisgIHRoaXMuZW5kU3ltYm9sID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgICBpZiAodmFsdWUpIHsKKyAgICAgIGVuZFN5bWJvbCA9IHZhbHVlOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBlbmRTeW1ib2w7CisgICAgfQorICB9OworCisKKyAgdGhpcy4kZ2V0ID0gWyckcGFyc2UnLCAnJGV4Y2VwdGlvbkhhbmRsZXInLCAnJHNjZScsIGZ1bmN0aW9uKCRwYXJzZSwgJGV4Y2VwdGlvbkhhbmRsZXIsICRzY2UpIHsKKyAgICB2YXIgc3RhcnRTeW1ib2xMZW5ndGggPSBzdGFydFN5bWJvbC5sZW5ndGgsCisgICAgICAgIGVuZFN5bWJvbExlbmd0aCA9IGVuZFN5bWJvbC5sZW5ndGgsCisgICAgICAgIGVzY2FwZWRTdGFydFJlZ2V4cCA9IG5ldyBSZWdFeHAoc3RhcnRTeW1ib2wucmVwbGFjZSgvLi9nLCBlc2NhcGUpLCAnZycpLAorICAgICAgICBlc2NhcGVkRW5kUmVnZXhwID0gbmV3IFJlZ0V4cChlbmRTeW1ib2wucmVwbGFjZSgvLi9nLCBlc2NhcGUpLCAnZycpOworCisgICAgZnVuY3Rpb24gZXNjYXBlKGNoKSB7CisgICAgICByZXR1cm4gJ1xcXFxcXCcgKyBjaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAbmdkb2Mgc2VydmljZQorICAgICAqIEBuYW1lICRpbnRlcnBvbGF0ZQorICAgICAqIEBraW5kIGZ1bmN0aW9uCisgICAgICoKKyAgICAgKiBAcmVxdWlyZXMgJHBhcnNlCisgICAgICogQHJlcXVpcmVzICRzY2UKKyAgICAgKgorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqCisgICAgICogQ29tcGlsZXMgYSBzdHJpbmcgd2l0aCBtYXJrdXAgaW50byBhbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLiBUaGlzIHNlcnZpY2UgaXMgdXNlZCBieSB0aGUKKyAgICAgKiBIVE1MIHtAbGluayBuZy4kY29tcGlsZSAkY29tcGlsZX0gc2VydmljZSBmb3IgZGF0YSBiaW5kaW5nLiBTZWUKKyAgICAgKiB7QGxpbmsgbmcuJGludGVycG9sYXRlUHJvdmlkZXIgJGludGVycG9sYXRlUHJvdmlkZXJ9IGZvciBjb25maWd1cmluZyB0aGUKKyAgICAgKiBpbnRlcnBvbGF0aW9uIG1hcmt1cC4KKyAgICAgKgorICAgICAqCisgICAgICogYGBganMKKyAgICAgKiAgIHZhciAkaW50ZXJwb2xhdGUgPSAuLi47IC8vIGluamVjdGVkCisgICAgICogICB2YXIgZXhwID0gJGludGVycG9sYXRlKCdIZWxsbyB7e25hbWUgfCB1cHBlcmNhc2V9fSEnKTsKKyAgICAgKiAgIGV4cGVjdChleHAoe25hbWU6J0FuZ3VsYXInfSkudG9FcXVhbCgnSGVsbG8gQU5HVUxBUiEnKTsKKyAgICAgKiBgYGAKKyAgICAgKgorICAgICAqIGAkaW50ZXJwb2xhdGVgIHRha2VzIGFuIG9wdGlvbmFsIGZvdXJ0aCBhcmd1bWVudCwgYGFsbE9yTm90aGluZ2AuIElmIGBhbGxPck5vdGhpbmdgIGlzCisgICAgICogYHRydWVgLCB0aGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbiB3aWxsIHJldHVybiBgdW5kZWZpbmVkYCB1bmxlc3MgYWxsIGVtYmVkZGVkIGV4cHJlc3Npb25zCisgICAgICogZXZhbHVhdGUgdG8gYSB2YWx1ZSBvdGhlciB0aGFuIGB1bmRlZmluZWRgLgorICAgICAqCisgICAgICogYGBganMKKyAgICAgKiAgIHZhciAkaW50ZXJwb2xhdGUgPSAuLi47IC8vIGluamVjdGVkCisgICAgICogICB2YXIgY29udGV4dCA9IHtncmVldGluZzogJ0hlbGxvJywgbmFtZTogdW5kZWZpbmVkIH07CisgICAgICoKKyAgICAgKiAgIC8vIGRlZmF1bHQgImZvcmdpdmluZyIgbW9kZQorICAgICAqICAgdmFyIGV4cCA9ICRpbnRlcnBvbGF0ZSgne3tncmVldGluZ319IHt7bmFtZX19IScpOworICAgICAqICAgZXhwZWN0KGV4cChjb250ZXh0KSkudG9FcXVhbCgnSGVsbG8gIScpOworICAgICAqCisgICAgICogICAvLyAiYWxsT3JOb3RoaW5nIiBtb2RlCisgICAgICogICBleHAgPSAkaW50ZXJwb2xhdGUoJ3t7Z3JlZXRpbmd9fSB7e25hbWV9fSEnLCBmYWxzZSwgbnVsbCwgdHJ1ZSk7CisgICAgICogICBleHBlY3QoZXhwKGNvbnRleHQpKS50b0JlVW5kZWZpbmVkKCk7CisgICAgICogICBjb250ZXh0Lm5hbWUgPSAnQW5ndWxhcic7CisgICAgICogICBleHBlY3QoZXhwKGNvbnRleHQpKS50b0VxdWFsKCdIZWxsbyBBbmd1bGFyIScpOworICAgICAqIGBgYAorICAgICAqCisgICAgICogYGFsbE9yTm90aGluZ2AgaXMgdXNlZnVsIGZvciBpbnRlcnBvbGF0aW5nIFVSTHMuIGBuZ1NyY2AgYW5kIGBuZ1NyY3NldGAgdXNlIHRoaXMgYmVoYXZpb3IuCisgICAgICoKKyAgICAgKiAjIyMjRXNjYXBlZCBJbnRlcnBvbGF0aW9uCisgICAgICogJGludGVycG9sYXRlIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBlc2NhcGluZyBpbnRlcnBvbGF0aW9uIG1hcmtlcnMuIFN0YXJ0IGFuZCBlbmQgbWFya2VycworICAgICAqIGNhbiBiZSBlc2NhcGVkIGJ5IHByZWNlZGluZyBlYWNoIG9mIHRoZWlyIGNoYXJhY3RlcnMgd2l0aCBhIFJFVkVSU0UgU09MSURVUyBVKzAwNUMgKGJhY2tzbGFzaCkuCisgICAgICogSXQgd2lsbCBiZSByZW5kZXJlZCBhcyBhIHJlZ3VsYXIgc3RhcnQvZW5kIG1hcmtlciwgYW5kIHdpbGwgbm90IGJlIGludGVycHJldGVkIGFzIGFuIGV4cHJlc3Npb24KKyAgICAgKiBvciBiaW5kaW5nLgorICAgICAqCisgICAgICogVGhpcyBlbmFibGVzIHdlYi1zZXJ2ZXJzIHRvIHByZXZlbnQgc2NyaXB0IGluamVjdGlvbiBhdHRhY2tzIGFuZCBkZWZhY2luZyBhdHRhY2tzLCB0byBzb21lCisgICAgICogZGVncmVlLCB3aGlsZSBhbHNvIGVuYWJsaW5nIGNvZGUgZXhhbXBsZXMgdG8gd29yayB3aXRob3V0IHJlbHlpbmcgb24gdGhlCisgICAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ05vbkJpbmRhYmxlIG5nTm9uQmluZGFibGV9IGRpcmVjdGl2ZS4KKyAgICAgKgorICAgICAqICoqRm9yIHNlY3VyaXR5IHB1cnBvc2VzLCBpdCBpcyBzdHJvbmdseSBlbmNvdXJhZ2VkIHRoYXQgd2ViIHNlcnZlcnMgZXNjYXBlIHVzZXItc3VwcGxpZWQgZGF0YSwKKyAgICAgKiByZXBsYWNpbmcgYW5nbGUgYnJhY2tldHMgKCZsdDssICZndDspIHdpdGggJmFtcDtsdDsgYW5kICZhbXA7Z3Q7IHJlc3BlY3RpdmVseSwgYW5kIHJlcGxhY2luZyBhbGwKKyAgICAgKiBpbnRlcnBvbGF0aW9uIHN0YXJ0L2VuZCBtYXJrZXJzIHdpdGggdGhlaXIgZXNjYXBlZCBjb3VudGVycGFydHMuKioKKyAgICAgKgorICAgICAqIEVzY2FwZWQgaW50ZXJwb2xhdGlvbiBtYXJrZXJzIGFyZSBvbmx5IHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCBpbnRlcnBvbGF0aW9uIG1hcmtlcnMgaW4gcmVuZGVyZWQKKyAgICAgKiBvdXRwdXQgd2hlbiB0aGUgJGludGVycG9sYXRlIHNlcnZpY2UgcHJvY2Vzc2VzIHRoZSB0ZXh0LiBTbywgZm9yIEhUTUwgZWxlbWVudHMgaW50ZXJwb2xhdGVkCisgICAgICogYnkge0BsaW5rIG5nLiRjb21waWxlICRjb21waWxlfSwgb3Igb3RoZXJ3aXNlIGludGVycG9sYXRlZCB3aXRoIHRoZSBgbXVzdEhhdmVFeHByZXNzaW9uYCBwYXJhbWV0ZXIKKyAgICAgKiBzZXQgdG8gYHRydWVgLCB0aGUgaW50ZXJwb2xhdGVkIHRleHQgbXVzdCBjb250YWluIGFuIHVuZXNjYXBlZCBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb24uIEFzIHN1Y2gsCisgICAgICogdGhpcyBpcyB0eXBpY2FsbHkgdXNlZnVsIG9ubHkgd2hlbiB1c2VyLWRhdGEgaXMgdXNlZCBpbiByZW5kZXJpbmcgYSB0ZW1wbGF0ZSBmcm9tIHRoZSBzZXJ2ZXIsIG9yCisgICAgICogd2hlbiBvdGhlcndpc2UgdW50cnVzdGVkIGRhdGEgaXMgdXNlZCBieSBhIGRpcmVjdGl2ZS4KKyAgICAgKgorICAgICAqIDxleGFtcGxlPgorICAgICAqICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgKiAgICA8ZGl2IG5nLWluaXQ9InVzZXJuYW1lPSdBIHVzZXInIj4KKyAgICAgKiAgICAgIDxwIG5nLWluaXQ9ImFwcHRpdGxlPSdFc2NhcGluZyBkZW1vJyI+e3thcHB0aXRsZX19OiBce1x7IHVzZXJuYW1lID0gImRlZmFjZWQgdmFsdWUiOyBcfVx9CisgICAgICogICAgICAgIDwvcD4KKyAgICAgKiAgICAgIDxwPjxzdHJvbmc+e3t1c2VybmFtZX19PC9zdHJvbmc+IGF0dGVtcHRzIHRvIGluamVjdCBjb2RlIHdoaWNoIHdpbGwgZGVmYWNlIHRoZQorICAgICAqICAgICAgICBhcHBsaWNhdGlvbiwgYnV0IGZhaWxzIHRvIGFjY29tcGxpc2ggdGhlaXIgdGFzaywgYmVjYXVzZSB0aGUgc2VydmVyIGhhcyBjb3JyZWN0bHkKKyAgICAgKiAgICAgICAgZXNjYXBlZCB0aGUgaW50ZXJwb2xhdGlvbiBzdGFydC9lbmQgbWFya2VycyB3aXRoIFJFVkVSU0UgU09MSURVUyBVKzAwNUMgKGJhY2tzbGFzaCkKKyAgICAgKiAgICAgICAgY2hhcmFjdGVycy48L3A+CisgICAgICogICAgICA8cD5JbnN0ZWFkLCB0aGUgcmVzdWx0IG9mIHRoZSBhdHRlbXB0ZWQgc2NyaXB0IGluamVjdGlvbiBpcyB2aXNpYmxlLCBhbmQgY2FuIGJlIHJlbW92ZWQKKyAgICAgKiAgICAgICAgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYW4gYWRtaW5pc3RyYXRvci48L3A+CisgICAgICogICAgPC9kaXY+CisgICAgICogIDwvZmlsZT4KKyAgICAgKiA8L2V4YW1wbGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUaGUgdGV4dCB3aXRoIG1hcmt1cCB0byBpbnRlcnBvbGF0ZS4KKyAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBtdXN0SGF2ZUV4cHJlc3Npb24gaWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgaW50ZXJwb2xhdGlvbiBzdHJpbmcgbXVzdCBoYXZlCisgICAgICogICAgZW1iZWRkZWQgZXhwcmVzc2lvbiBpbiBvcmRlciB0byByZXR1cm4gYW4gaW50ZXJwb2xhdGlvbiBmdW5jdGlvbi4gU3RyaW5ncyB3aXRoIG5vCisgICAgICogICAgZW1iZWRkZWQgZXhwcmVzc2lvbiB3aWxsIHJldHVybiBudWxsIGZvciB0aGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbi4KKyAgICAgKiBAcGFyYW0ge3N0cmluZz19IHRydXN0ZWRDb250ZXh0IHdoZW4gcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBwYXNzZXMgdGhlIGludGVycG9sYXRlZAorICAgICAqICAgIHJlc3VsdCB0aHJvdWdoIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWQgJHNjZS5nZXRUcnVzdGVkKGludGVycG9sYXRlZFJlc3VsdCwKKyAgICAgKiAgICB0cnVzdGVkQ29udGV4dCl9IGJlZm9yZSByZXR1cm5pbmcgaXQuICBSZWZlciB0byB0aGUge0BsaW5rIG5nLiRzY2UgJHNjZX0gc2VydmljZSB0aGF0CisgICAgICogICAgcHJvdmlkZXMgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgZm9yIGRldGFpbHMuCisgICAgICogQHBhcmFtIHtib29sZWFuPX0gYWxsT3JOb3RoaW5nIGlmIGB0cnVlYCwgdGhlbiB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gcmV0dXJucyB1bmRlZmluZWQKKyAgICAgKiAgICB1bmxlc3MgYWxsIGVtYmVkZGVkIGV4cHJlc3Npb25zIGV2YWx1YXRlIHRvIGEgdmFsdWUgb3RoZXIgdGhhbiBgdW5kZWZpbmVkYC4KKyAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCl9IGFuIGludGVycG9sYXRpb24gZnVuY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBjb21wdXRlIHRoZQorICAgICAqICAgIGludGVycG9sYXRlZCBzdHJpbmcuIFRoZSBmdW5jdGlvbiBoYXMgdGhlc2UgcGFyYW1ldGVyczoKKyAgICAgKgorICAgICAqIC0gYGNvbnRleHRgOiBldmFsdWF0aW9uIGNvbnRleHQgZm9yIGFsbCBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgaW50ZXJwb2xhdGVkIHRleHQKKyAgICAgKi8KKyAgICBmdW5jdGlvbiAkaW50ZXJwb2xhdGUodGV4dCwgbXVzdEhhdmVFeHByZXNzaW9uLCB0cnVzdGVkQ29udGV4dCwgYWxsT3JOb3RoaW5nKSB7CisgICAgICBhbGxPck5vdGhpbmcgPSAhIWFsbE9yTm90aGluZzsKKyAgICAgIHZhciBzdGFydEluZGV4LAorICAgICAgICAgIGVuZEluZGV4LAorICAgICAgICAgIGluZGV4ID0gMCwKKyAgICAgICAgICBleHByZXNzaW9ucyA9IFtdLAorICAgICAgICAgIHBhcnNlRm5zID0gW10sCisgICAgICAgICAgdGV4dExlbmd0aCA9IHRleHQubGVuZ3RoLAorICAgICAgICAgIGV4cCwKKyAgICAgICAgICBjb25jYXQgPSBbXSwKKyAgICAgICAgICBleHByZXNzaW9uUG9zaXRpb25zID0gW107CisKKyAgICAgIHdoaWxlIChpbmRleCA8IHRleHRMZW5ndGgpIHsKKyAgICAgICAgaWYgKCgoc3RhcnRJbmRleCA9IHRleHQuaW5kZXhPZihzdGFydFN5bWJvbCwgaW5kZXgpKSAhPSAtMSkgJiYKKyAgICAgICAgICAgICAoKGVuZEluZGV4ID0gdGV4dC5pbmRleE9mKGVuZFN5bWJvbCwgc3RhcnRJbmRleCArIHN0YXJ0U3ltYm9sTGVuZ3RoKSkgIT0gLTEpKSB7CisgICAgICAgICAgaWYgKGluZGV4ICE9PSBzdGFydEluZGV4KSB7CisgICAgICAgICAgICBjb25jYXQucHVzaCh1bmVzY2FwZVRleHQodGV4dC5zdWJzdHJpbmcoaW5kZXgsIHN0YXJ0SW5kZXgpKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGV4cCA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0SW5kZXggKyBzdGFydFN5bWJvbExlbmd0aCwgZW5kSW5kZXgpOworICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2goZXhwKTsKKyAgICAgICAgICBwYXJzZUZucy5wdXNoKCRwYXJzZShleHAsIHBhcnNlU3RyaW5naWZ5SW50ZXJjZXB0b3IpKTsKKyAgICAgICAgICBpbmRleCA9IGVuZEluZGV4ICsgZW5kU3ltYm9sTGVuZ3RoOworICAgICAgICAgIGV4cHJlc3Npb25Qb3NpdGlvbnMucHVzaChjb25jYXQubGVuZ3RoKTsKKyAgICAgICAgICBjb25jYXQucHVzaCgnJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gd2UgZGlkIG5vdCBmaW5kIGFuIGludGVycG9sYXRpb24sIHNvIHdlIGhhdmUgdG8gYWRkIHRoZSByZW1haW5kZXIgdG8gdGhlIHNlcGFyYXRvcnMgYXJyYXkKKyAgICAgICAgICBpZiAoaW5kZXggIT09IHRleHRMZW5ndGgpIHsKKyAgICAgICAgICAgIGNvbmNhdC5wdXNoKHVuZXNjYXBlVGV4dCh0ZXh0LnN1YnN0cmluZyhpbmRleCkpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQ29uY2F0ZW5hdGluZyBleHByZXNzaW9ucyBtYWtlcyBpdCBoYXJkIHRvIHJlYXNvbiBhYm91dCB3aGV0aGVyIHNvbWUgY29tYmluYXRpb24gb2YKKyAgICAgIC8vIGNvbmNhdGVuYXRlZCB2YWx1ZXMgYXJlIHVuc2FmZSB0byB1c2UgYW5kIGNvdWxkIGVhc2lseSBsZWFkIHRvIFhTUy4gIEJ5IHJlcXVpcmluZyB0aGF0IGEKKyAgICAgIC8vIHNpbmdsZSBleHByZXNzaW9uIGJlIHVzZWQgZm9yIGlmcmFtZVtzcmNdLCBvYmplY3Rbc3JjXSwgZXRjLiwgd2UgZW5zdXJlIHRoYXQgdGhlIHZhbHVlCisgICAgICAvLyB0aGF0J3MgdXNlZCBpcyBhc3NpZ25lZCBvciBjb25zdHJ1Y3RlZCBieSBzb21lIEpTIGNvZGUgc29tZXdoZXJlIHRoYXQgaXMgbW9yZSB0ZXN0YWJsZSBvcgorICAgICAgLy8gbWFrZSBpdCBvYnZpb3VzIHRoYXQgeW91IGJvdW5kIHRoZSB2YWx1ZSB0byBzb21lIHVzZXIgY29udHJvbGxlZCB2YWx1ZS4gIFRoaXMgaGVscHMgcmVkdWNlCisgICAgICAvLyB0aGUgbG9hZCB3aGVuIGF1ZGl0aW5nIGZvciBYU1MgaXNzdWVzLgorICAgICAgaWYgKHRydXN0ZWRDb250ZXh0ICYmIGNvbmNhdC5sZW5ndGggPiAxKSB7CisgICAgICAgICAgdGhyb3cgJGludGVycG9sYXRlTWluRXJyKCdub2NvbmNhdCcsCisgICAgICAgICAgICAgICJFcnJvciB3aGlsZSBpbnRlcnBvbGF0aW5nOiB7MH1cblN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nIGRpc2FsbG93cyAiICsKKyAgICAgICAgICAgICAgImludGVycG9sYXRpb25zIHRoYXQgY29uY2F0ZW5hdGUgbXVsdGlwbGUgZXhwcmVzc2lvbnMgd2hlbiBhIHRydXN0ZWQgdmFsdWUgaXMgIiArCisgICAgICAgICAgICAgICJyZXF1aXJlZC4gIFNlZSBodHRwOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy4kc2NlIiwgdGV4dCk7CisgICAgICB9CisKKyAgICAgIGlmICghbXVzdEhhdmVFeHByZXNzaW9uIHx8IGV4cHJlc3Npb25zLmxlbmd0aCkgeworICAgICAgICB2YXIgY29tcHV0ZSA9IGZ1bmN0aW9uKHZhbHVlcykgeworICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGV4cHJlc3Npb25zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhbGxPck5vdGhpbmcgJiYgaXNVbmRlZmluZWQodmFsdWVzW2ldKSkgcmV0dXJuOworICAgICAgICAgICAgY29uY2F0W2V4cHJlc3Npb25Qb3NpdGlvbnNbaV1dID0gdmFsdWVzW2ldOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gY29uY2F0LmpvaW4oJycpOworICAgICAgICB9OworCisgICAgICAgIHZhciBnZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgcmV0dXJuIHRydXN0ZWRDb250ZXh0ID8KKyAgICAgICAgICAgICRzY2UuZ2V0VHJ1c3RlZCh0cnVzdGVkQ29udGV4dCwgdmFsdWUpIDoKKyAgICAgICAgICAgICRzY2UudmFsdWVPZih2YWx1ZSk7CisgICAgICAgIH07CisKKyAgICAgICAgdmFyIHN0cmluZ2lmeSA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsgLy8gbnVsbCB8fCB1bmRlZmluZWQKKyAgICAgICAgICAgIHJldHVybiAnJzsKKyAgICAgICAgICB9CisgICAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKKyAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzoKKyAgICAgICAgICAgICAgdmFsdWUgPSAnJyArIHZhbHVlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHZhbHVlID0gdG9Kc29uKHZhbHVlKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiBpbnRlcnBvbGF0aW9uRm4oY29udGV4dCkgeworICAgICAgICAgICAgdmFyIGkgPSAwOworICAgICAgICAgICAgdmFyIGlpID0gZXhwcmVzc2lvbnMubGVuZ3RoOworICAgICAgICAgICAgdmFyIHZhbHVlcyA9IG5ldyBBcnJheShpaSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGZvciAoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IHBhcnNlRm5zW2ldKGNvbnRleHQpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGUodmFsdWVzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgICAgICB2YXIgbmV3RXJyID0gJGludGVycG9sYXRlTWluRXJyKCdpbnRlcnInLCAiQ2FuJ3QgaW50ZXJwb2xhdGU6IHswfVxuezF9IiwgdGV4dCwKKyAgICAgICAgICAgICAgICAgIGVyci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIobmV3RXJyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIH0sIHsKKyAgICAgICAgICAvLyBhbGwgb2YgdGhlc2UgcHJvcGVydGllcyBhcmUgdW5kb2N1bWVudGVkIGZvciBub3cKKyAgICAgICAgICBleHA6IHRleHQsIC8vanVzdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHJlZ3VsYXIgd2F0Y2hlcnMgY3JlYXRlZCB2aWEgJHdhdGNoCisgICAgICAgICAgZXhwcmVzc2lvbnM6IGV4cHJlc3Npb25zLAorICAgICAgICAgICQkd2F0Y2hEZWxlZ2F0ZTogZnVuY3Rpb24oc2NvcGUsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSkgeworICAgICAgICAgICAgdmFyIGxhc3RWYWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBzY29wZS4kd2F0Y2hHcm91cChwYXJzZUZucywgZnVuY3Rpb24gaW50ZXJwb2xhdGVGbldhdGNoZXIodmFsdWVzLCBvbGRWYWx1ZXMpIHsKKyAgICAgICAgICAgICAgdmFyIGN1cnJWYWx1ZSA9IGNvbXB1dGUodmFsdWVzKTsKKyAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBjdXJyVmFsdWUsIHZhbHVlcyAhPT0gb2xkVmFsdWVzID8gbGFzdFZhbHVlIDogY3VyclZhbHVlLCBzY29wZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbGFzdFZhbHVlID0gY3VyclZhbHVlOworICAgICAgICAgICAgfSwgb2JqZWN0RXF1YWxpdHkpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgIGZ1bmN0aW9uIHVuZXNjYXBlVGV4dCh0ZXh0KSB7CisgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoZXNjYXBlZFN0YXJ0UmVnZXhwLCBzdGFydFN5bWJvbCkuCisgICAgICAgICAgcmVwbGFjZShlc2NhcGVkRW5kUmVnZXhwLCBlbmRTeW1ib2wpOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBwYXJzZVN0cmluZ2lmeUludGVyY2VwdG9yKHZhbHVlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdmFsdWUgPSBnZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgcmV0dXJuIGFsbE9yTm90aGluZyAmJiAhaXNEZWZpbmVkKHZhbHVlKSA/IHZhbHVlIDogc3RyaW5naWZ5KHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgdmFyIG5ld0VyciA9ICRpbnRlcnBvbGF0ZU1pbkVycignaW50ZXJyJywgIkNhbid0IGludGVycG9sYXRlOiB7MH1cbnsxfSIsIHRleHQsCisgICAgICAgICAgICBlcnIudG9TdHJpbmcoKSk7CisgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIobmV3RXJyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAqIEBuYW1lICRpbnRlcnBvbGF0ZSNzdGFydFN5bWJvbAorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqIFN5bWJvbCB0byBkZW5vdGUgdGhlIHN0YXJ0IG9mIGV4cHJlc3Npb24gaW4gdGhlIGludGVycG9sYXRlZCBzdHJpbmcuIERlZmF1bHRzIHRvIGB7e2AuCisgICAgICoKKyAgICAgKiBVc2Uge0BsaW5rIG5nLiRpbnRlcnBvbGF0ZVByb3ZpZGVyI3N0YXJ0U3ltYm9sIGAkaW50ZXJwb2xhdGVQcm92aWRlci5zdGFydFN5bWJvbGB9IHRvIGNoYW5nZQorICAgICAqIHRoZSBzeW1ib2wuCisgICAgICoKKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBzdGFydCBzeW1ib2wuCisgICAgICovCisgICAgJGludGVycG9sYXRlLnN0YXJ0U3ltYm9sID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gc3RhcnRTeW1ib2w7CisgICAgfTsKKworCisgICAgLyoqCisgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAqIEBuYW1lICRpbnRlcnBvbGF0ZSNlbmRTeW1ib2wKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTeW1ib2wgdG8gZGVub3RlIHRoZSBlbmQgb2YgZXhwcmVzc2lvbiBpbiB0aGUgaW50ZXJwb2xhdGVkIHN0cmluZy4gRGVmYXVsdHMgdG8gYH19YC4KKyAgICAgKgorICAgICAqIFVzZSB7QGxpbmsgbmcuJGludGVycG9sYXRlUHJvdmlkZXIjZW5kU3ltYm9sIGAkaW50ZXJwb2xhdGVQcm92aWRlci5lbmRTeW1ib2xgfSB0byBjaGFuZ2UKKyAgICAgKiB0aGUgc3ltYm9sLgorICAgICAqCisgICAgICogQHJldHVybnMge3N0cmluZ30gZW5kIHN5bWJvbC4KKyAgICAgKi8KKyAgICAkaW50ZXJwb2xhdGUuZW5kU3ltYm9sID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gZW5kU3ltYm9sOworICAgIH07CisKKyAgICByZXR1cm4gJGludGVycG9sYXRlOworICB9XTsKK30KKworZnVuY3Rpb24gJEludGVydmFsUHJvdmlkZXIoKSB7CisgIHRoaXMuJGdldCA9IFsnJHJvb3RTY29wZScsICckd2luZG93JywgJyRxJywgJyQkcScsCisgICAgICAgZnVuY3Rpb24oJHJvb3RTY29wZSwgICAkd2luZG93LCAgICRxLCAgICQkcSkgeworICAgIHZhciBpbnRlcnZhbHMgPSB7fTsKKworCisgICAgIC8qKgorICAgICAgKiBAbmdkb2Mgc2VydmljZQorICAgICAgKiBAbmFtZSAkaW50ZXJ2YWwKKyAgICAgICoKKyAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAqIEFuZ3VsYXIncyB3cmFwcGVyIGZvciBgd2luZG93LnNldEludGVydmFsYC4gVGhlIGBmbmAgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZXZlcnkgYGRlbGF5YAorICAgICAgKiBtaWxsaXNlY29uZHMuCisgICAgICAqCisgICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgcmVnaXN0ZXJpbmcgYW4gaW50ZXJ2YWwgZnVuY3Rpb24gaXMgYSBwcm9taXNlLiBUaGlzIHByb21pc2Ugd2lsbCBiZQorICAgICAgKiBub3RpZmllZCB1cG9uIGVhY2ggdGljayBvZiB0aGUgaW50ZXJ2YWwsIGFuZCB3aWxsIGJlIHJlc29sdmVkIGFmdGVyIGBjb3VudGAgaXRlcmF0aW9ucywgb3IKKyAgICAgICogcnVuIGluZGVmaW5pdGVseSBpZiBgY291bnRgIGlzIG5vdCBkZWZpbmVkLiBUaGUgdmFsdWUgb2YgdGhlIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHRoZQorICAgICAgKiBudW1iZXIgb2YgaXRlcmF0aW9ucyB0aGF0IGhhdmUgcnVuLgorICAgICAgKiBUbyBjYW5jZWwgYW4gaW50ZXJ2YWwsIGNhbGwgYCRpbnRlcnZhbC5jYW5jZWwocHJvbWlzZSlgLgorICAgICAgKgorICAgICAgKiBJbiB0ZXN0cyB5b3UgY2FuIHVzZSB7QGxpbmsgbmdNb2NrLiRpbnRlcnZhbCNmbHVzaCBgJGludGVydmFsLmZsdXNoKG1pbGxpcylgfSB0bworICAgICAgKiBtb3ZlIGZvcndhcmQgYnkgYG1pbGxpc2AgbWlsbGlzZWNvbmRzIGFuZCB0cmlnZ2VyIGFueSBmdW5jdGlvbnMgc2NoZWR1bGVkIHRvIHJ1biBpbiB0aGF0CisgICAgICAqIHRpbWUuCisgICAgICAqCisgICAgICAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgorICAgICAgKiAqKk5vdGUqKjogSW50ZXJ2YWxzIGNyZWF0ZWQgYnkgdGhpcyBzZXJ2aWNlIG11c3QgYmUgZXhwbGljaXRseSBkZXN0cm95ZWQgd2hlbiB5b3UgYXJlIGZpbmlzaGVkCisgICAgICAqIHdpdGggdGhlbS4gIEluIHBhcnRpY3VsYXIgdGhleSBhcmUgbm90IGF1dG9tYXRpY2FsbHkgZGVzdHJveWVkIHdoZW4gYSBjb250cm9sbGVyJ3Mgc2NvcGUgb3IgYQorICAgICAgKiBkaXJlY3RpdmUncyBlbGVtZW50IGFyZSBkZXN0cm95ZWQuCisgICAgICAqIFlvdSBzaG91bGQgdGFrZSB0aGlzIGludG8gY29uc2lkZXJhdGlvbiBhbmQgbWFrZSBzdXJlIHRvIGFsd2F5cyBjYW5jZWwgdGhlIGludGVydmFsIGF0IHRoZQorICAgICAgKiBhcHByb3ByaWF0ZSBtb21lbnQuICBTZWUgdGhlIGV4YW1wbGUgYmVsb3cgZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgYW5kIHdoZW4gdG8gZG8gdGhpcy4KKyAgICAgICogPC9kaXY+CisgICAgICAqCisgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gZm4gQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgcmVwZWF0ZWRseS4KKyAgICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5IE51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiBlYWNoIGZ1bmN0aW9uIGNhbGwuCisgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gW2NvdW50PTBdIE51bWJlciBvZiB0aW1lcyB0byByZXBlYXQuIElmIG5vdCBzZXQsIG9yIDAsIHdpbGwgcmVwZWF0CisgICAgICAqICAgaW5kZWZpbml0ZWx5LgorICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBbaW52b2tlQXBwbHk9dHJ1ZV0gSWYgc2V0IHRvIGBmYWxzZWAgc2tpcHMgbW9kZWwgZGlydHkgY2hlY2tpbmcsIG90aGVyd2lzZQorICAgICAgKiAgIHdpbGwgaW52b2tlIGBmbmAgd2l0aGluIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkYXBwbHkgJGFwcGx5fSBibG9jay4KKyAgICAgICogQHJldHVybnMge3Byb21pc2V9IEEgcHJvbWlzZSB3aGljaCB3aWxsIGJlIG5vdGlmaWVkIG9uIGVhY2ggaXRlcmF0aW9uLgorICAgICAgKgorICAgICAgKiBAZXhhbXBsZQorICAgICAgKiA8ZXhhbXBsZSBtb2R1bGU9ImludGVydmFsRXhhbXBsZSI+CisgICAgICAqIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgKiAgIDxzY3JpcHQ+CisgICAgICAqICAgICBhbmd1bGFyLm1vZHVsZSgnaW50ZXJ2YWxFeGFtcGxlJywgW10pCisgICAgICAqICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRpbnRlcnZhbCcsCisgICAgICAqICAgICAgICAgZnVuY3Rpb24oJHNjb3BlLCAkaW50ZXJ2YWwpIHsKKyAgICAgICogICAgICAgICAgICRzY29wZS5mb3JtYXQgPSAnTS9kL3l5IGg6bW06c3MgYSc7CisgICAgICAqICAgICAgICAgICAkc2NvcGUuYmxvb2RfMSA9IDEwMDsKKyAgICAgICogICAgICAgICAgICRzY29wZS5ibG9vZF8yID0gMTIwOworICAgICAgKgorICAgICAgKiAgICAgICAgICAgdmFyIHN0b3A7CisgICAgICAqICAgICAgICAgICAkc2NvcGUuZmlnaHQgPSBmdW5jdGlvbigpIHsKKyAgICAgICogICAgICAgICAgICAgLy8gRG9uJ3Qgc3RhcnQgYSBuZXcgZmlnaHQgaWYgd2UgYXJlIGFscmVhZHkgZmlnaHRpbmcKKyAgICAgICogICAgICAgICAgICAgaWYgKCBhbmd1bGFyLmlzRGVmaW5lZChzdG9wKSApIHJldHVybjsKKyAgICAgICoKKyAgICAgICogICAgICAgICAgICAgc3RvcCA9ICRpbnRlcnZhbChmdW5jdGlvbigpIHsKKyAgICAgICogICAgICAgICAgICAgICBpZiAoJHNjb3BlLmJsb29kXzEgPiAwICYmICRzY29wZS5ibG9vZF8yID4gMCkgeworICAgICAgKiAgICAgICAgICAgICAgICAgJHNjb3BlLmJsb29kXzEgPSAkc2NvcGUuYmxvb2RfMSAtIDM7CisgICAgICAqICAgICAgICAgICAgICAgICAkc2NvcGUuYmxvb2RfMiA9ICRzY29wZS5ibG9vZF8yIC0gNDsKKyAgICAgICogICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgKiAgICAgICAgICAgICAgICAgJHNjb3BlLnN0b3BGaWdodCgpOworICAgICAgKiAgICAgICAgICAgICAgIH0KKyAgICAgICogICAgICAgICAgICAgfSwgMTAwKTsKKyAgICAgICogICAgICAgICAgIH07CisgICAgICAqCisgICAgICAqICAgICAgICAgICAkc2NvcGUuc3RvcEZpZ2h0ID0gZnVuY3Rpb24oKSB7CisgICAgICAqICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChzdG9wKSkgeworICAgICAgKiAgICAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwoc3RvcCk7CisgICAgICAqICAgICAgICAgICAgICAgc3RvcCA9IHVuZGVmaW5lZDsKKyAgICAgICogICAgICAgICAgICAgfQorICAgICAgKiAgICAgICAgICAgfTsKKyAgICAgICoKKyAgICAgICogICAgICAgICAgICRzY29wZS5yZXNldEZpZ2h0ID0gZnVuY3Rpb24oKSB7CisgICAgICAqICAgICAgICAgICAgICRzY29wZS5ibG9vZF8xID0gMTAwOworICAgICAgKiAgICAgICAgICAgICAkc2NvcGUuYmxvb2RfMiA9IDEyMDsKKyAgICAgICogICAgICAgICAgIH07CisgICAgICAqCisgICAgICAqICAgICAgICAgICAkc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkgeworICAgICAgKiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaW50ZXJ2YWwgaXMgZGVzdHJveWVkIHRvbworICAgICAgKiAgICAgICAgICAgICAkc2NvcGUuc3RvcEZpZ2h0KCk7CisgICAgICAqICAgICAgICAgICB9KTsKKyAgICAgICogICAgICAgICB9XSkKKyAgICAgICogICAgICAgLy8gUmVnaXN0ZXIgdGhlICdteUN1cnJlbnRUaW1lJyBkaXJlY3RpdmUgZmFjdG9yeSBtZXRob2QuCisgICAgICAqICAgICAgIC8vIFdlIGluamVjdCAkaW50ZXJ2YWwgYW5kIGRhdGVGaWx0ZXIgc2VydmljZSBzaW5jZSB0aGUgZmFjdG9yeSBtZXRob2QgaXMgREkuCisgICAgICAqICAgICAgIC5kaXJlY3RpdmUoJ215Q3VycmVudFRpbWUnLCBbJyRpbnRlcnZhbCcsICdkYXRlRmlsdGVyJywKKyAgICAgICogICAgICAgICBmdW5jdGlvbigkaW50ZXJ2YWwsIGRhdGVGaWx0ZXIpIHsKKyAgICAgICogICAgICAgICAgIC8vIHJldHVybiB0aGUgZGlyZWN0aXZlIGxpbmsgZnVuY3Rpb24uIChjb21waWxlIGZ1bmN0aW9uIG5vdCBuZWVkZWQpCisgICAgICAqICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7CisgICAgICAqICAgICAgICAgICAgIHZhciBmb3JtYXQsICAvLyBkYXRlIGZvcm1hdAorICAgICAgKiAgICAgICAgICAgICAgICAgc3RvcFRpbWU7IC8vIHNvIHRoYXQgd2UgY2FuIGNhbmNlbCB0aGUgdGltZSB1cGRhdGVzCisgICAgICAqCisgICAgICAqICAgICAgICAgICAgIC8vIHVzZWQgdG8gdXBkYXRlIHRoZSBVSQorICAgICAgKiAgICAgICAgICAgICBmdW5jdGlvbiB1cGRhdGVUaW1lKCkgeworICAgICAgKiAgICAgICAgICAgICAgIGVsZW1lbnQudGV4dChkYXRlRmlsdGVyKG5ldyBEYXRlKCksIGZvcm1hdCkpOworICAgICAgKiAgICAgICAgICAgICB9CisgICAgICAqCisgICAgICAqICAgICAgICAgICAgIC8vIHdhdGNoIHRoZSBleHByZXNzaW9uLCBhbmQgdXBkYXRlIHRoZSBVSSBvbiBjaGFuZ2UuCisgICAgICAqICAgICAgICAgICAgIHNjb3BlLiR3YXRjaChhdHRycy5teUN1cnJlbnRUaW1lLCBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgKiAgICAgICAgICAgICAgIGZvcm1hdCA9IHZhbHVlOworICAgICAgKiAgICAgICAgICAgICAgIHVwZGF0ZVRpbWUoKTsKKyAgICAgICogICAgICAgICAgICAgfSk7CisgICAgICAqCisgICAgICAqICAgICAgICAgICAgIHN0b3BUaW1lID0gJGludGVydmFsKHVwZGF0ZVRpbWUsIDEwMDApOworICAgICAgKgorICAgICAgKiAgICAgICAgICAgICAvLyBsaXN0ZW4gb24gRE9NIGRlc3Ryb3kgKHJlbW92YWwpIGV2ZW50LCBhbmQgY2FuY2VsIHRoZSBuZXh0IFVJIHVwZGF0ZQorICAgICAgKiAgICAgICAgICAgICAvLyB0byBwcmV2ZW50IHVwZGF0aW5nIHRpbWUgYWZ0ZXIgdGhlIERPTSBlbGVtZW50IHdhcyByZW1vdmVkLgorICAgICAgKiAgICAgICAgICAgICBlbGVtZW50Lm9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkgeworICAgICAgKiAgICAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwoc3RvcFRpbWUpOworICAgICAgKiAgICAgICAgICAgICB9KTsKKyAgICAgICogICAgICAgICAgIH0KKyAgICAgICogICAgICAgICB9XSk7CisgICAgICAqICAgPC9zY3JpcHQ+CisgICAgICAqCisgICAgICAqICAgPGRpdj4KKyAgICAgICogICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgKiAgICAgICBEYXRlIGZvcm1hdDogPGlucHV0IG5nLW1vZGVsPSJmb3JtYXQiPiA8aHIvPgorICAgICAgKiAgICAgICBDdXJyZW50IHRpbWUgaXM6IDxzcGFuIG15LWN1cnJlbnQtdGltZT0iZm9ybWF0Ij48L3NwYW4+CisgICAgICAqICAgICAgIDxoci8+CisgICAgICAqICAgICAgIEJsb29kIDEgOiA8Zm9udCBjb2xvcj0ncmVkJz57e2Jsb29kXzF9fTwvZm9udD4KKyAgICAgICogICAgICAgQmxvb2QgMiA6IDxmb250IGNvbG9yPSdyZWQnPnt7Ymxvb2RfMn19PC9mb250PgorICAgICAgKiAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1uZy1jbGljaz0iZmlnaHQoKSI+RmlnaHQ8L2J1dHRvbj4KKyAgICAgICogICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtbmctY2xpY2s9InN0b3BGaWdodCgpIj5TdG9wRmlnaHQ8L2J1dHRvbj4KKyAgICAgICogICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtbmctY2xpY2s9InJlc2V0RmlnaHQoKSI+cmVzZXRGaWdodDwvYnV0dG9uPgorICAgICAgKiAgICAgPC9kaXY+CisgICAgICAqICAgPC9kaXY+CisgICAgICAqCisgICAgICAqIDwvZmlsZT4KKyAgICAgICogPC9leGFtcGxlPgorICAgICAgKi8KKyAgICBmdW5jdGlvbiBpbnRlcnZhbChmbiwgZGVsYXksIGNvdW50LCBpbnZva2VBcHBseSkgeworICAgICAgdmFyIHNldEludGVydmFsID0gJHdpbmRvdy5zZXRJbnRlcnZhbCwKKyAgICAgICAgICBjbGVhckludGVydmFsID0gJHdpbmRvdy5jbGVhckludGVydmFsLAorICAgICAgICAgIGl0ZXJhdGlvbiA9IDAsCisgICAgICAgICAgc2tpcEFwcGx5ID0gKGlzRGVmaW5lZChpbnZva2VBcHBseSkgJiYgIWludm9rZUFwcGx5KSwKKyAgICAgICAgICBkZWZlcnJlZCA9IChza2lwQXBwbHkgPyAkJHEgOiAkcSkuZGVmZXIoKSwKKyAgICAgICAgICBwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZTsKKworICAgICAgY291bnQgPSBpc0RlZmluZWQoY291bnQpID8gY291bnQgOiAwOworCisgICAgICBwcm9taXNlLnRoZW4obnVsbCwgbnVsbCwgZm4pOworCisgICAgICBwcm9taXNlLiQkaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGZ1bmN0aW9uIHRpY2soKSB7CisgICAgICAgIGRlZmVycmVkLm5vdGlmeShpdGVyYXRpb24rKyk7CisKKyAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBpdGVyYXRpb24gPj0gY291bnQpIHsKKyAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGl0ZXJhdGlvbik7CisgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcm9taXNlLiQkaW50ZXJ2YWxJZCk7CisgICAgICAgICAgZGVsZXRlIGludGVydmFsc1twcm9taXNlLiQkaW50ZXJ2YWxJZF07CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNraXBBcHBseSkgJHJvb3RTY29wZS4kYXBwbHkoKTsKKworICAgICAgfSwgZGVsYXkpOworCisgICAgICBpbnRlcnZhbHNbcHJvbWlzZS4kJGludGVydmFsSWRdID0gZGVmZXJyZWQ7CisKKyAgICAgIHJldHVybiBwcm9taXNlOworICAgIH0KKworCisgICAgIC8qKgorICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAqIEBuYW1lICRpbnRlcnZhbCNjYW5jZWwKKyAgICAgICoKKyAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAqIENhbmNlbHMgYSB0YXNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHByb21pc2VgLgorICAgICAgKgorICAgICAgKiBAcGFyYW0ge3Byb21pc2V9IHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGAkaW50ZXJ2YWxgIGZ1bmN0aW9uLgorICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRhc2sgd2FzIHN1Y2Nlc3NmdWxseSBjYW5jZWxlZC4KKyAgICAgICovCisgICAgaW50ZXJ2YWwuY2FuY2VsID0gZnVuY3Rpb24ocHJvbWlzZSkgeworICAgICAgaWYgKHByb21pc2UgJiYgcHJvbWlzZS4kJGludGVydmFsSWQgaW4gaW50ZXJ2YWxzKSB7CisgICAgICAgIGludGVydmFsc1twcm9taXNlLiQkaW50ZXJ2YWxJZF0ucmVqZWN0KCdjYW5jZWxlZCcpOworICAgICAgICAkd2luZG93LmNsZWFySW50ZXJ2YWwocHJvbWlzZS4kJGludGVydmFsSWQpOworICAgICAgICBkZWxldGUgaW50ZXJ2YWxzW3Byb21pc2UuJCRpbnRlcnZhbElkXTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfTsKKworICAgIHJldHVybiBpbnRlcnZhbDsKKyAgfV07Cit9CisKKy8qKgorICogQG5nZG9jIHNlcnZpY2UKKyAqIEBuYW1lICRsb2NhbGUKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqICRsb2NhbGUgc2VydmljZSBwcm92aWRlcyBsb2NhbGl6YXRpb24gcnVsZXMgZm9yIHZhcmlvdXMgQW5ndWxhciBjb21wb25lbnRzLiBBcyBvZiByaWdodCBub3cgdGhlCisgKiBvbmx5IHB1YmxpYyBhcGkgaXM6CisgKgorICogKiBgaWRgIOKAPyBge3N0cmluZ31gIOKAPyBsb2NhbGUgaWQgZm9ybWF0dGVkIGFzIGBsYW5ndWFnZUlkLWNvdW50cnlJZGAgKGUuZy4gYGVuLXVzYCkKKyAqLworZnVuY3Rpb24gJExvY2FsZVByb3ZpZGVyKCkgeworICB0aGlzLiRnZXQgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4geworICAgICAgaWQ6ICdlbi11cycsCisKKyAgICAgIE5VTUJFUl9GT1JNQVRTOiB7CisgICAgICAgIERFQ0lNQUxfU0VQOiAnLicsCisgICAgICAgIEdST1VQX1NFUDogJywnLAorICAgICAgICBQQVRURVJOUzogWworICAgICAgICAgIHsgLy8gRGVjaW1hbCBQYXR0ZXJuCisgICAgICAgICAgICBtaW5JbnQ6IDEsCisgICAgICAgICAgICBtaW5GcmFjOiAwLAorICAgICAgICAgICAgbWF4RnJhYzogMywKKyAgICAgICAgICAgIHBvc1ByZTogJycsCisgICAgICAgICAgICBwb3NTdWY6ICcnLAorICAgICAgICAgICAgbmVnUHJlOiAnLScsCisgICAgICAgICAgICBuZWdTdWY6ICcnLAorICAgICAgICAgICAgZ1NpemU6IDMsCisgICAgICAgICAgICBsZ1NpemU6IDMKKyAgICAgICAgICB9LHsgLy9DdXJyZW5jeSBQYXR0ZXJuCisgICAgICAgICAgICBtaW5JbnQ6IDEsCisgICAgICAgICAgICBtaW5GcmFjOiAyLAorICAgICAgICAgICAgbWF4RnJhYzogMiwKKyAgICAgICAgICAgIHBvc1ByZTogJ1x1MDBBNCcsCisgICAgICAgICAgICBwb3NTdWY6ICcnLAorICAgICAgICAgICAgbmVnUHJlOiAnKFx1MDBBNCcsCisgICAgICAgICAgICBuZWdTdWY6ICcpJywKKyAgICAgICAgICAgIGdTaXplOiAzLAorICAgICAgICAgICAgbGdTaXplOiAzCisgICAgICAgICAgfQorICAgICAgICBdLAorICAgICAgICBDVVJSRU5DWV9TWU06ICckJworICAgICAgfSwKKworICAgICAgREFURVRJTUVfRk9STUFUUzogeworICAgICAgICBNT05USDoKKyAgICAgICAgICAgICdKYW51YXJ5LEZlYnJ1YXJ5LE1hcmNoLEFwcmlsLE1heSxKdW5lLEp1bHksQXVndXN0LFNlcHRlbWJlcixPY3RvYmVyLE5vdmVtYmVyLERlY2VtYmVyJworICAgICAgICAgICAgLnNwbGl0KCcsJyksCisgICAgICAgIFNIT1JUTU9OVEg6ICAnSmFuLEZlYixNYXIsQXByLE1heSxKdW4sSnVsLEF1ZyxTZXAsT2N0LE5vdixEZWMnLnNwbGl0KCcsJyksCisgICAgICAgIERBWTogJ1N1bmRheSxNb25kYXksVHVlc2RheSxXZWRuZXNkYXksVGh1cnNkYXksRnJpZGF5LFNhdHVyZGF5Jy5zcGxpdCgnLCcpLAorICAgICAgICBTSE9SVERBWTogJ1N1bixNb24sVHVlLFdlZCxUaHUsRnJpLFNhdCcuc3BsaXQoJywnKSwKKyAgICAgICAgQU1QTVM6IFsnQU0nLCdQTSddLAorICAgICAgICBtZWRpdW06ICdNTU0gZCwgeSBoOm1tOnNzIGEnLAorICAgICAgICAnc2hvcnQnOiAnTS9kL3l5IGg6bW0gYScsCisgICAgICAgIGZ1bGxEYXRlOiAnRUVFRSwgTU1NTSBkLCB5JywKKyAgICAgICAgbG9uZ0RhdGU6ICdNTU1NIGQsIHknLAorICAgICAgICBtZWRpdW1EYXRlOiAnTU1NIGQsIHknLAorICAgICAgICBzaG9ydERhdGU6ICdNL2QveXknLAorICAgICAgICBtZWRpdW1UaW1lOiAnaDptbTpzcyBhJywKKyAgICAgICAgc2hvcnRUaW1lOiAnaDptbSBhJworICAgICAgfSwKKworICAgICAgcGx1cmFsQ2F0OiBmdW5jdGlvbihudW0pIHsKKyAgICAgICAgaWYgKG51bSA9PT0gMSkgeworICAgICAgICAgIHJldHVybiAnb25lJzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJ290aGVyJzsKKyAgICAgIH0KKyAgICB9OworICB9OworfQorCit2YXIgUEFUSF9NQVRDSCA9IC9eKFteXD8jXSopKFw/KFteI10qKSk/KCMoLiopKT8kLywKKyAgICBERUZBVUxUX1BPUlRTID0geydodHRwJzogODAsICdodHRwcyc6IDQ0MywgJ2Z0cCc6IDIxfTsKK3ZhciAkbG9jYXRpb25NaW5FcnIgPSBtaW5FcnIoJyRsb2NhdGlvbicpOworCisKKy8qKgorICogRW5jb2RlIHBhdGggdXNpbmcgZW5jb2RlVXJpU2VnbWVudCwgaWdub3JpbmcgZm9yd2FyZCBzbGFzaGVzCisgKgorICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0byBlbmNvZGUKKyAqIEByZXR1cm5zIHtzdHJpbmd9CisgKi8KK2Z1bmN0aW9uIGVuY29kZVBhdGgocGF0aCkgeworICB2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJyksCisgICAgICBpID0gc2VnbWVudHMubGVuZ3RoOworCisgIHdoaWxlIChpLS0pIHsKKyAgICBzZWdtZW50c1tpXSA9IGVuY29kZVVyaVNlZ21lbnQoc2VnbWVudHNbaV0pOworICB9CisKKyAgcmV0dXJuIHNlZ21lbnRzLmpvaW4oJy8nKTsKK30KKworZnVuY3Rpb24gcGFyc2VBYnNvbHV0ZVVybChhYnNvbHV0ZVVybCwgbG9jYXRpb25PYmopIHsKKyAgdmFyIHBhcnNlZFVybCA9IHVybFJlc29sdmUoYWJzb2x1dGVVcmwpOworCisgIGxvY2F0aW9uT2JqLiQkcHJvdG9jb2wgPSBwYXJzZWRVcmwucHJvdG9jb2w7CisgIGxvY2F0aW9uT2JqLiQkaG9zdCA9IHBhcnNlZFVybC5ob3N0bmFtZTsKKyAgbG9jYXRpb25PYmouJCRwb3J0ID0gaW50KHBhcnNlZFVybC5wb3J0KSB8fCBERUZBVUxUX1BPUlRTW3BhcnNlZFVybC5wcm90b2NvbF0gfHwgbnVsbDsKK30KKworCitmdW5jdGlvbiBwYXJzZUFwcFVybChyZWxhdGl2ZVVybCwgbG9jYXRpb25PYmopIHsKKyAgdmFyIHByZWZpeGVkID0gKHJlbGF0aXZlVXJsLmNoYXJBdCgwKSAhPT0gJy8nKTsKKyAgaWYgKHByZWZpeGVkKSB7CisgICAgcmVsYXRpdmVVcmwgPSAnLycgKyByZWxhdGl2ZVVybDsKKyAgfQorICB2YXIgbWF0Y2ggPSB1cmxSZXNvbHZlKHJlbGF0aXZlVXJsKTsKKyAgbG9jYXRpb25PYmouJCRwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHByZWZpeGVkICYmIG1hdGNoLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nID8KKyAgICAgIG1hdGNoLnBhdGhuYW1lLnN1YnN0cmluZygxKSA6IG1hdGNoLnBhdGhuYW1lKTsKKyAgbG9jYXRpb25PYmouJCRzZWFyY2ggPSBwYXJzZUtleVZhbHVlKG1hdGNoLnNlYXJjaCk7CisgIGxvY2F0aW9uT2JqLiQkaGFzaCA9IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaC5oYXNoKTsKKworICAvLyBtYWtlIHN1cmUgcGF0aCBzdGFydHMgd2l0aCAnLyc7CisgIGlmIChsb2NhdGlvbk9iai4kJHBhdGggJiYgbG9jYXRpb25PYmouJCRwYXRoLmNoYXJBdCgwKSAhPSAnLycpIHsKKyAgICBsb2NhdGlvbk9iai4kJHBhdGggPSAnLycgKyBsb2NhdGlvbk9iai4kJHBhdGg7CisgIH0KK30KKworCisvKioKKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gYmVnaW4KKyAqIEBwYXJhbSB7c3RyaW5nfSB3aG9sZQorICogQHJldHVybnMge3N0cmluZ30gcmV0dXJucyB0ZXh0IGZyb20gd2hvbGUgYWZ0ZXIgYmVnaW4gb3IgdW5kZWZpbmVkIGlmIGl0IGRvZXMgbm90IGJlZ2luIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkIHN0cmluZy4KKyAqLworZnVuY3Rpb24gYmVnaW5zV2l0aChiZWdpbiwgd2hvbGUpIHsKKyAgaWYgKHdob2xlLmluZGV4T2YoYmVnaW4pID09PSAwKSB7CisgICAgcmV0dXJuIHdob2xlLnN1YnN0cihiZWdpbi5sZW5ndGgpOworICB9Cit9CisKKworZnVuY3Rpb24gc3RyaXBIYXNoKHVybCkgeworICB2YXIgaW5kZXggPSB1cmwuaW5kZXhPZignIycpOworICByZXR1cm4gaW5kZXggPT0gLTEgPyB1cmwgOiB1cmwuc3Vic3RyKDAsIGluZGV4KTsKK30KKworZnVuY3Rpb24gdHJpbUVtcHR5SGFzaCh1cmwpIHsKKyAgcmV0dXJuIHVybC5yZXBsYWNlKC8oIy4rKXwjJC8sICckMScpOworfQorCisKK2Z1bmN0aW9uIHN0cmlwRmlsZSh1cmwpIHsKKyAgcmV0dXJuIHVybC5zdWJzdHIoMCwgc3RyaXBIYXNoKHVybCkubGFzdEluZGV4T2YoJy8nKSArIDEpOworfQorCisvKiByZXR1cm4gdGhlIHNlcnZlciBvbmx5IChzY2hlbWU6Ly9ob3N0OnBvcnQpICovCitmdW5jdGlvbiBzZXJ2ZXJCYXNlKHVybCkgeworICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCB1cmwuaW5kZXhPZignLycsIHVybC5pbmRleE9mKCcvLycpICsgMikpOworfQorCisKKy8qKgorICogTG9jYXRpb25IdG1sNVVybCByZXByZXNlbnRzIGFuIHVybAorICogVGhpcyBvYmplY3QgaXMgZXhwb3NlZCBhcyAkbG9jYXRpb24gc2VydmljZSB3aGVuIEhUTUw1IG1vZGUgaXMgZW5hYmxlZCBhbmQgc3VwcG9ydGVkCisgKgorICogQGNvbnN0cnVjdG9yCisgKiBAcGFyYW0ge3N0cmluZ30gYXBwQmFzZSBhcHBsaWNhdGlvbiBiYXNlIFVSTAorICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQcmVmaXggdXJsIHBhdGggcHJlZml4CisgKi8KK2Z1bmN0aW9uIExvY2F0aW9uSHRtbDVVcmwoYXBwQmFzZSwgYmFzZVByZWZpeCkgeworICB0aGlzLiQkaHRtbDUgPSB0cnVlOworICBiYXNlUHJlZml4ID0gYmFzZVByZWZpeCB8fCAnJzsKKyAgdmFyIGFwcEJhc2VOb0ZpbGUgPSBzdHJpcEZpbGUoYXBwQmFzZSk7CisgIHBhcnNlQWJzb2x1dGVVcmwoYXBwQmFzZSwgdGhpcyk7CisKKworICAvKioKKyAgICogUGFyc2UgZ2l2ZW4gaHRtbDUgKHJlZ3VsYXIpIHVybCBzdHJpbmcgaW50byBwcm9wZXJ0aWVzCisgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSFRNTDUgdXJsCisgICAqIEBwcml2YXRlCisgICAqLworICB0aGlzLiQkcGFyc2UgPSBmdW5jdGlvbih1cmwpIHsKKyAgICB2YXIgcGF0aFVybCA9IGJlZ2luc1dpdGgoYXBwQmFzZU5vRmlsZSwgdXJsKTsKKyAgICBpZiAoIWlzU3RyaW5nKHBhdGhVcmwpKSB7CisgICAgICB0aHJvdyAkbG9jYXRpb25NaW5FcnIoJ2lwdGhwcmZ4JywgJ0ludmFsaWQgdXJsICJ7MH0iLCBtaXNzaW5nIHBhdGggcHJlZml4ICJ7MX0iLicsIHVybCwKKyAgICAgICAgICBhcHBCYXNlTm9GaWxlKTsKKyAgICB9CisKKyAgICBwYXJzZUFwcFVybChwYXRoVXJsLCB0aGlzKTsKKworICAgIGlmICghdGhpcy4kJHBhdGgpIHsKKyAgICAgIHRoaXMuJCRwYXRoID0gJy8nOworICAgIH0KKworICAgIHRoaXMuJCRjb21wb3NlKCk7CisgIH07CisKKyAgLyoqCisgICAqIENvbXBvc2UgdXJsIGFuZCB1cGRhdGUgYGFic1VybGAgcHJvcGVydHkKKyAgICogQHByaXZhdGUKKyAgICovCisgIHRoaXMuJCRjb21wb3NlID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIHNlYXJjaCA9IHRvS2V5VmFsdWUodGhpcy4kJHNlYXJjaCksCisgICAgICAgIGhhc2ggPSB0aGlzLiQkaGFzaCA/ICcjJyArIGVuY29kZVVyaVNlZ21lbnQodGhpcy4kJGhhc2gpIDogJyc7CisKKyAgICB0aGlzLiQkdXJsID0gZW5jb2RlUGF0aCh0aGlzLiQkcGF0aCkgKyAoc2VhcmNoID8gJz8nICsgc2VhcmNoIDogJycpICsgaGFzaDsKKyAgICB0aGlzLiQkYWJzVXJsID0gYXBwQmFzZU5vRmlsZSArIHRoaXMuJCR1cmwuc3Vic3RyKDEpOyAvLyBmaXJzdCBjaGFyIGlzIGFsd2F5cyAnLycKKyAgfTsKKworICB0aGlzLiQkcGFyc2VMaW5rVXJsID0gZnVuY3Rpb24odXJsLCByZWxIcmVmKSB7CisgICAgaWYgKHJlbEhyZWYgJiYgcmVsSHJlZlswXSA9PT0gJyMnKSB7CisgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIGxpbmtzIHRvIGhhc2ggZnJhZ21lbnRzOgorICAgICAgLy8ga2VlcCB0aGUgb2xkIHVybCBhbmQgb25seSByZXBsYWNlIHRoZSBoYXNoIGZyYWdtZW50CisgICAgICB0aGlzLmhhc2gocmVsSHJlZi5zbGljZSgxKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmFyIGFwcFVybCwgcHJldkFwcFVybDsKKyAgICB2YXIgcmV3cml0dGVuVXJsOworCisgICAgaWYgKChhcHBVcmwgPSBiZWdpbnNXaXRoKGFwcEJhc2UsIHVybCkpICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHByZXZBcHBVcmwgPSBhcHBVcmw7CisgICAgICBpZiAoKGFwcFVybCA9IGJlZ2luc1dpdGgoYmFzZVByZWZpeCwgYXBwVXJsKSkgIT09IHVuZGVmaW5lZCkgeworICAgICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlTm9GaWxlICsgKGJlZ2luc1dpdGgoJy8nLCBhcHBVcmwpIHx8IGFwcFVybCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlICsgcHJldkFwcFVybDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChhcHBVcmwgPSBiZWdpbnNXaXRoKGFwcEJhc2VOb0ZpbGUsIHVybCkpICE9PSB1bmRlZmluZWQpIHsKKyAgICAgIHJld3JpdHRlblVybCA9IGFwcEJhc2VOb0ZpbGUgKyBhcHBVcmw7CisgICAgfSBlbHNlIGlmIChhcHBCYXNlTm9GaWxlID09IHVybCArICcvJykgeworICAgICAgcmV3cml0dGVuVXJsID0gYXBwQmFzZU5vRmlsZTsKKyAgICB9CisgICAgaWYgKHJld3JpdHRlblVybCkgeworICAgICAgdGhpcy4kJHBhcnNlKHJld3JpdHRlblVybCk7CisgICAgfQorICAgIHJldHVybiAhIXJld3JpdHRlblVybDsKKyAgfTsKK30KKworCisvKioKKyAqIExvY2F0aW9uSGFzaGJhbmdVcmwgcmVwcmVzZW50cyB1cmwKKyAqIFRoaXMgb2JqZWN0IGlzIGV4cG9zZWQgYXMgJGxvY2F0aW9uIHNlcnZpY2Ugd2hlbiBkZXZlbG9wZXIgZG9lc24ndCBvcHQgaW50byBodG1sNSBtb2RlLgorICogSXQgYWxzbyBzZXJ2ZXMgYXMgdGhlIGJhc2UgY2xhc3MgZm9yIGh0bWw1IG1vZGUgZmFsbGJhY2sgb24gbGVnYWN5IGJyb3dzZXJzLgorICoKKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IGFwcEJhc2UgYXBwbGljYXRpb24gYmFzZSBVUkwKKyAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoUHJlZml4IGhhc2hiYW5nIHByZWZpeAorICovCitmdW5jdGlvbiBMb2NhdGlvbkhhc2hiYW5nVXJsKGFwcEJhc2UsIGhhc2hQcmVmaXgpIHsKKyAgdmFyIGFwcEJhc2VOb0ZpbGUgPSBzdHJpcEZpbGUoYXBwQmFzZSk7CisKKyAgcGFyc2VBYnNvbHV0ZVVybChhcHBCYXNlLCB0aGlzKTsKKworCisgIC8qKgorICAgKiBQYXJzZSBnaXZlbiBoYXNoYmFuZyB1cmwgaW50byBwcm9wZXJ0aWVzCisgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSGFzaGJhbmcgdXJsCisgICAqIEBwcml2YXRlCisgICAqLworICB0aGlzLiQkcGFyc2UgPSBmdW5jdGlvbih1cmwpIHsKKyAgICB2YXIgd2l0aG91dEJhc2VVcmwgPSBiZWdpbnNXaXRoKGFwcEJhc2UsIHVybCkgfHwgYmVnaW5zV2l0aChhcHBCYXNlTm9GaWxlLCB1cmwpOworICAgIHZhciB3aXRob3V0SGFzaFVybDsKKworICAgIGlmICh3aXRob3V0QmFzZVVybC5jaGFyQXQoMCkgPT09ICcjJykgeworCisgICAgICAvLyBUaGUgcmVzdCBvZiB0aGUgdXJsIHN0YXJ0cyB3aXRoIGEgaGFzaCBzbyB3ZSBoYXZlCisgICAgICAvLyBnb3QgZWl0aGVyIGEgaGFzaGJhbmcgcGF0aCBvciBhIHBsYWluIGhhc2ggZnJhZ21lbnQKKyAgICAgIHdpdGhvdXRIYXNoVXJsID0gYmVnaW5zV2l0aChoYXNoUHJlZml4LCB3aXRob3V0QmFzZVVybCk7CisgICAgICBpZiAoaXNVbmRlZmluZWQod2l0aG91dEhhc2hVcmwpKSB7CisgICAgICAgIC8vIFRoZXJlIHdhcyBubyBoYXNoYmFuZyBwcmVmaXggc28gd2UganVzdCBoYXZlIGEgaGFzaCBmcmFnbWVudAorICAgICAgICB3aXRob3V0SGFzaFVybCA9IHdpdGhvdXRCYXNlVXJsOworICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZXJlIHdhcyBubyBoYXNoYmFuZyBwYXRoIG5vciBoYXNoIGZyYWdtZW50OgorICAgICAgLy8gSWYgd2UgYXJlIGluIEhUTUw1IG1vZGUgd2UgdXNlIHdoYXQgaXMgbGVmdCBhcyB0aGUgcGF0aDsKKyAgICAgIC8vIE90aGVyd2lzZSB3ZSBpZ25vcmUgd2hhdCBpcyBsZWZ0CisgICAgICB3aXRob3V0SGFzaFVybCA9IHRoaXMuJCRodG1sNSA/IHdpdGhvdXRCYXNlVXJsIDogJyc7CisgICAgfQorCisgICAgcGFyc2VBcHBVcmwod2l0aG91dEhhc2hVcmwsIHRoaXMpOworCisgICAgdGhpcy4kJHBhdGggPSByZW1vdmVXaW5kb3dzRHJpdmVOYW1lKHRoaXMuJCRwYXRoLCB3aXRob3V0SGFzaFVybCwgYXBwQmFzZSk7CisKKyAgICB0aGlzLiQkY29tcG9zZSgpOworCisgICAgLyoKKyAgICAgKiBJbiBXaW5kb3dzLCBvbiBhbiBhbmNob3Igbm9kZSBvbiBkb2N1bWVudHMgbG9hZGVkIGZyb20KKyAgICAgKiB0aGUgZmlsZXN5c3RlbSwgdGhlIGJyb3dzZXIgd2lsbCByZXR1cm4gYSBwYXRobmFtZQorICAgICAqIHByZWZpeGVkIHdpdGggdGhlIGRyaXZlIG5hbWUgKCcvQzovcGF0aCcpIHdoZW4gYQorICAgICAqIHBhdGhuYW1lIHdpdGhvdXQgYSBkcml2ZSBpcyBzZXQ6CisgICAgICogICogYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnL2ZvbycpCisgICAgICogICAqIGEucGF0aG5hbWUgPT09ICcvQzovZm9vJyAvL3RydWUKKyAgICAgKgorICAgICAqIEluc2lkZSBvZiBBbmd1bGFyLCB3ZSdyZSBhbHdheXMgdXNpbmcgcGF0aG5hbWVzIHRoYXQKKyAgICAgKiBkbyBub3QgaW5jbHVkZSBkcml2ZSBuYW1lcyBmb3Igcm91dGluZy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiByZW1vdmVXaW5kb3dzRHJpdmVOYW1lKHBhdGgsIHVybCwgYmFzZSkgeworICAgICAgLyoKKyAgICAgIE1hdGNoZXMgcGF0aHMgZm9yIGZpbGUgcHJvdG9jb2wgb24gd2luZG93cywKKyAgICAgIHN1Y2ggYXMgL0M6L2Zvby9iYXIsIGFuZCBjYXB0dXJlcyBvbmx5IC9mb28vYmFyLgorICAgICAgKi8KKyAgICAgIHZhciB3aW5kb3dzRmlsZVBhdGhFeHAgPSAvXlwvW0EtWl06KFwvLiopLzsKKworICAgICAgdmFyIGZpcnN0UGF0aFNlZ21lbnRNYXRjaDsKKworICAgICAgLy9HZXQgdGhlIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgaW5wdXQgVVJMLgorICAgICAgaWYgKHVybC5pbmRleE9mKGJhc2UpID09PSAwKSB7CisgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKGJhc2UsICcnKTsKKyAgICAgIH0KKworICAgICAgLy8gVGhlIGlucHV0IFVSTCBpbnRlbnRpb25hbGx5IGNvbnRhaW5zIGEgZmlyc3QgcGF0aCBzZWdtZW50IHRoYXQgZW5kcyB3aXRoIGEgY29sb24uCisgICAgICBpZiAod2luZG93c0ZpbGVQYXRoRXhwLmV4ZWModXJsKSkgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgIH0KKworICAgICAgZmlyc3RQYXRoU2VnbWVudE1hdGNoID0gd2luZG93c0ZpbGVQYXRoRXhwLmV4ZWMocGF0aCk7CisgICAgICByZXR1cm4gZmlyc3RQYXRoU2VnbWVudE1hdGNoID8gZmlyc3RQYXRoU2VnbWVudE1hdGNoWzFdIDogcGF0aDsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIENvbXBvc2UgaGFzaGJhbmcgdXJsIGFuZCB1cGRhdGUgYGFic1VybGAgcHJvcGVydHkKKyAgICogQHByaXZhdGUKKyAgICovCisgIHRoaXMuJCRjb21wb3NlID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIHNlYXJjaCA9IHRvS2V5VmFsdWUodGhpcy4kJHNlYXJjaCksCisgICAgICAgIGhhc2ggPSB0aGlzLiQkaGFzaCA/ICcjJyArIGVuY29kZVVyaVNlZ21lbnQodGhpcy4kJGhhc2gpIDogJyc7CisKKyAgICB0aGlzLiQkdXJsID0gZW5jb2RlUGF0aCh0aGlzLiQkcGF0aCkgKyAoc2VhcmNoID8gJz8nICsgc2VhcmNoIDogJycpICsgaGFzaDsKKyAgICB0aGlzLiQkYWJzVXJsID0gYXBwQmFzZSArICh0aGlzLiQkdXJsID8gaGFzaFByZWZpeCArIHRoaXMuJCR1cmwgOiAnJyk7CisgIH07CisKKyAgdGhpcy4kJHBhcnNlTGlua1VybCA9IGZ1bmN0aW9uKHVybCwgcmVsSHJlZikgeworICAgIGlmIChzdHJpcEhhc2goYXBwQmFzZSkgPT0gc3RyaXBIYXNoKHVybCkpIHsKKyAgICAgIHRoaXMuJCRwYXJzZSh1cmwpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfTsKK30KKworCisvKioKKyAqIExvY2F0aW9uSGFzaGJhbmdVcmwgcmVwcmVzZW50cyB1cmwKKyAqIFRoaXMgb2JqZWN0IGlzIGV4cG9zZWQgYXMgJGxvY2F0aW9uIHNlcnZpY2Ugd2hlbiBodG1sNSBoaXN0b3J5IGFwaSBpcyBlbmFibGVkIGJ1dCB0aGUgYnJvd3NlcgorICogZG9lcyBub3Qgc3VwcG9ydCBpdC4KKyAqCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7c3RyaW5nfSBhcHBCYXNlIGFwcGxpY2F0aW9uIGJhc2UgVVJMCisgKiBAcGFyYW0ge3N0cmluZ30gaGFzaFByZWZpeCBoYXNoYmFuZyBwcmVmaXgKKyAqLworZnVuY3Rpb24gTG9jYXRpb25IYXNoYmFuZ0luSHRtbDVVcmwoYXBwQmFzZSwgaGFzaFByZWZpeCkgeworICB0aGlzLiQkaHRtbDUgPSB0cnVlOworICBMb2NhdGlvbkhhc2hiYW5nVXJsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKyAgdmFyIGFwcEJhc2VOb0ZpbGUgPSBzdHJpcEZpbGUoYXBwQmFzZSk7CisKKyAgdGhpcy4kJHBhcnNlTGlua1VybCA9IGZ1bmN0aW9uKHVybCwgcmVsSHJlZikgeworICAgIGlmIChyZWxIcmVmICYmIHJlbEhyZWZbMF0gPT09ICcjJykgeworICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBsaW5rcyB0byBoYXNoIGZyYWdtZW50czoKKyAgICAgIC8vIGtlZXAgdGhlIG9sZCB1cmwgYW5kIG9ubHkgcmVwbGFjZSB0aGUgaGFzaCBmcmFnbWVudAorICAgICAgdGhpcy5oYXNoKHJlbEhyZWYuc2xpY2UoMSkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmFyIHJld3JpdHRlblVybDsKKyAgICB2YXIgYXBwVXJsOworCisgICAgaWYgKGFwcEJhc2UgPT0gc3RyaXBIYXNoKHVybCkpIHsKKyAgICAgIHJld3JpdHRlblVybCA9IHVybDsKKyAgICB9IGVsc2UgaWYgKChhcHBVcmwgPSBiZWdpbnNXaXRoKGFwcEJhc2VOb0ZpbGUsIHVybCkpKSB7CisgICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlICsgaGFzaFByZWZpeCArIGFwcFVybDsKKyAgICB9IGVsc2UgaWYgKGFwcEJhc2VOb0ZpbGUgPT09IHVybCArICcvJykgeworICAgICAgcmV3cml0dGVuVXJsID0gYXBwQmFzZU5vRmlsZTsKKyAgICB9CisgICAgaWYgKHJld3JpdHRlblVybCkgeworICAgICAgdGhpcy4kJHBhcnNlKHJld3JpdHRlblVybCk7CisgICAgfQorICAgIHJldHVybiAhIXJld3JpdHRlblVybDsKKyAgfTsKKworICB0aGlzLiQkY29tcG9zZSA9IGZ1bmN0aW9uKCkgeworICAgIHZhciBzZWFyY2ggPSB0b0tleVZhbHVlKHRoaXMuJCRzZWFyY2gpLAorICAgICAgICBoYXNoID0gdGhpcy4kJGhhc2ggPyAnIycgKyBlbmNvZGVVcmlTZWdtZW50KHRoaXMuJCRoYXNoKSA6ICcnOworCisgICAgdGhpcy4kJHVybCA9IGVuY29kZVBhdGgodGhpcy4kJHBhdGgpICsgKHNlYXJjaCA/ICc/JyArIHNlYXJjaCA6ICcnKSArIGhhc2g7CisgICAgLy8gaW5jbHVkZSBoYXNoUHJlZml4IGluICQkYWJzVXJsIHdoZW4gJCR1cmwgaXMgZW1wdHkgc28gSUU4ICYgOSBkbyBub3QgcmVsb2FkIHBhZ2UgYmVjYXVzZSBvZiByZW1vdmFsIG9mICcjJworICAgIHRoaXMuJCRhYnNVcmwgPSBhcHBCYXNlICsgaGFzaFByZWZpeCArIHRoaXMuJCR1cmw7CisgIH07CisKK30KKworCit2YXIgbG9jYXRpb25Qcm90b3R5cGUgPSB7CisKKyAgLyoqCisgICAqIEFyZSB3ZSBpbiBodG1sNSBtb2RlPworICAgKiBAcHJpdmF0ZQorICAgKi8KKyAgJCRodG1sNTogZmFsc2UsCisKKyAgLyoqCisgICAqIEhhcyBhbnkgY2hhbmdlIGJlZW4gcmVwbGFjaW5nPworICAgKiBAcHJpdmF0ZQorICAgKi8KKyAgJCRyZXBsYWNlOiBmYWxzZSwKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAkbG9jYXRpb24jYWJzVXJsCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgb25seS4KKyAgICoKKyAgICogUmV0dXJuIGZ1bGwgdXJsIHJlcHJlc2VudGF0aW9uIHdpdGggYWxsIHNlZ21lbnRzIGVuY29kZWQgYWNjb3JkaW5nIHRvIHJ1bGVzIHNwZWNpZmllZCBpbgorICAgKiBbUkZDIDM5ODZdKGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzM5ODYudHh0KS4KKyAgICoKKyAgICoKKyAgICogYGBganMKKyAgICogLy8gZ2l2ZW4gdXJsIGh0dHA6Ly9leGFtcGxlLmNvbS8jL3NvbWUvcGF0aD9mb289YmFyJmJhej14b3hvCisgICAqIHZhciBhYnNVcmwgPSAkbG9jYXRpb24uYWJzVXJsKCk7CisgICAqIC8vID0+ICJodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94byIKKyAgICogYGBgCisgICAqCisgICAqIEByZXR1cm4ge3N0cmluZ30gZnVsbCB1cmwKKyAgICovCisgIGFic1VybDogbG9jYXRpb25HZXR0ZXIoJyQkYWJzVXJsJyksCisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgJGxvY2F0aW9uI3VybAorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIC8gc2V0dGVyLgorICAgKgorICAgKiBSZXR1cm4gdXJsIChlLmcuIGAvcGF0aD9hPWIjaGFzaGApIHdoZW4gY2FsbGVkIHdpdGhvdXQgYW55IHBhcmFtZXRlci4KKyAgICoKKyAgICogQ2hhbmdlIHBhdGgsIHNlYXJjaCBhbmQgaGFzaCwgd2hlbiBjYWxsZWQgd2l0aCBwYXJhbWV0ZXIgYW5kIHJldHVybiBgJGxvY2F0aW9uYC4KKyAgICoKKyAgICoKKyAgICogYGBganMKKyAgICogLy8gZ2l2ZW4gdXJsIGh0dHA6Ly9leGFtcGxlLmNvbS8jL3NvbWUvcGF0aD9mb289YmFyJmJhej14b3hvCisgICAqIHZhciB1cmwgPSAkbG9jYXRpb24udXJsKCk7CisgICAqIC8vID0+ICIvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8iCisgICAqIGBgYAorICAgKgorICAgKiBAcGFyYW0ge3N0cmluZz19IHVybCBOZXcgdXJsIHdpdGhvdXQgYmFzZSBwcmVmaXggKGUuZy4gYC9wYXRoP2E9YiNoYXNoYCkKKyAgICogQHJldHVybiB7c3RyaW5nfSB1cmwKKyAgICovCisgIHVybDogZnVuY3Rpb24odXJsKSB7CisgICAgaWYgKGlzVW5kZWZpbmVkKHVybCkpCisgICAgICByZXR1cm4gdGhpcy4kJHVybDsKKworICAgIHZhciBtYXRjaCA9IFBBVEhfTUFUQ0guZXhlYyh1cmwpOworICAgIGlmIChtYXRjaFsxXSB8fCB1cmwgPT09ICcnKSB0aGlzLnBhdGgoZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzFdKSk7CisgICAgaWYgKG1hdGNoWzJdIHx8IG1hdGNoWzFdIHx8IHVybCA9PT0gJycpIHRoaXMuc2VhcmNoKG1hdGNoWzNdIHx8ICcnKTsKKyAgICB0aGlzLmhhc2gobWF0Y2hbNV0gfHwgJycpOworCisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgJGxvY2F0aW9uI3Byb3RvY29sCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgb25seS4KKyAgICoKKyAgICogUmV0dXJuIHByb3RvY29sIG9mIGN1cnJlbnQgdXJsLgorICAgKgorICAgKgorICAgKiBgYGBqcworICAgKiAvLyBnaXZlbiB1cmwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8KKyAgICogdmFyIHByb3RvY29sID0gJGxvY2F0aW9uLnByb3RvY29sKCk7CisgICAqIC8vID0+ICJodHRwIgorICAgKiBgYGAKKyAgICoKKyAgICogQHJldHVybiB7c3RyaW5nfSBwcm90b2NvbCBvZiBjdXJyZW50IHVybAorICAgKi8KKyAgcHJvdG9jb2w6IGxvY2F0aW9uR2V0dGVyKCckJHByb3RvY29sJyksCisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgJGxvY2F0aW9uI2hvc3QKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciBvbmx5LgorICAgKgorICAgKiBSZXR1cm4gaG9zdCBvZiBjdXJyZW50IHVybC4KKyAgICoKKyAgICoKKyAgICogYGBganMKKyAgICogLy8gZ2l2ZW4gdXJsIGh0dHA6Ly9leGFtcGxlLmNvbS8jL3NvbWUvcGF0aD9mb289YmFyJmJhej14b3hvCisgICAqIHZhciBob3N0ID0gJGxvY2F0aW9uLmhvc3QoKTsKKyAgICogLy8gPT4gImV4YW1wbGUuY29tIgorICAgKiBgYGAKKyAgICoKKyAgICogQHJldHVybiB7c3RyaW5nfSBob3N0IG9mIGN1cnJlbnQgdXJsLgorICAgKi8KKyAgaG9zdDogbG9jYXRpb25HZXR0ZXIoJyQkaG9zdCcpLAorCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRsb2NhdGlvbiNwb3J0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgb25seS4KKyAgICoKKyAgICogUmV0dXJuIHBvcnQgb2YgY3VycmVudCB1cmwuCisgICAqCisgICAqCisgICAqIGBgYGpzCisgICAqIC8vIGdpdmVuIHVybCBodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94bworICAgKiB2YXIgcG9ydCA9ICRsb2NhdGlvbi5wb3J0KCk7CisgICAqIC8vID0+IDgwCisgICAqIGBgYAorICAgKgorICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHBvcnQKKyAgICovCisgIHBvcnQ6IGxvY2F0aW9uR2V0dGVyKCckJHBvcnQnKSwKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAkbG9jYXRpb24jcGF0aAorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIC8gc2V0dGVyLgorICAgKgorICAgKiBSZXR1cm4gcGF0aCBvZiBjdXJyZW50IHVybCB3aGVuIGNhbGxlZCB3aXRob3V0IGFueSBwYXJhbWV0ZXIuCisgICAqCisgICAqIENoYW5nZSBwYXRoIHdoZW4gY2FsbGVkIHdpdGggcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuCisgICAqCisgICAqIE5vdGU6IFBhdGggc2hvdWxkIGFsd2F5cyBiZWdpbiB3aXRoIGZvcndhcmQgc2xhc2ggKC8pLCB0aGlzIG1ldGhvZCB3aWxsIGFkZCB0aGUgZm9yd2FyZCBzbGFzaAorICAgKiBpZiBpdCBpcyBtaXNzaW5nLgorICAgKgorICAgKgorICAgKiBgYGBqcworICAgKiAvLyBnaXZlbiB1cmwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8KKyAgICogdmFyIHBhdGggPSAkbG9jYXRpb24ucGF0aCgpOworICAgKiAvLyA9PiAiL3NvbWUvcGF0aCIKKyAgICogYGBgCisgICAqCisgICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gcGF0aCBOZXcgcGF0aAorICAgKiBAcmV0dXJuIHtzdHJpbmd9IHBhdGgKKyAgICovCisgIHBhdGg6IGxvY2F0aW9uR2V0dGVyU2V0dGVyKCckJHBhdGgnLCBmdW5jdGlvbihwYXRoKSB7CisgICAgcGF0aCA9IHBhdGggIT09IG51bGwgPyBwYXRoLnRvU3RyaW5nKCkgOiAnJzsKKyAgICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT0gJy8nID8gcGF0aCA6ICcvJyArIHBhdGg7CisgIH0pLAorCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRsb2NhdGlvbiNzZWFyY2gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciAvIHNldHRlci4KKyAgICoKKyAgICogUmV0dXJuIHNlYXJjaCBwYXJ0IChhcyBvYmplY3QpIG9mIGN1cnJlbnQgdXJsIHdoZW4gY2FsbGVkIHdpdGhvdXQgYW55IHBhcmFtZXRlci4KKyAgICoKKyAgICogQ2hhbmdlIHNlYXJjaCBwYXJ0IHdoZW4gY2FsbGVkIHdpdGggcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuCisgICAqCisgICAqCisgICAqIGBgYGpzCisgICAqIC8vIGdpdmVuIHVybCBodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94bworICAgKiB2YXIgc2VhcmNoT2JqZWN0ID0gJGxvY2F0aW9uLnNlYXJjaCgpOworICAgKiAvLyA9PiB7Zm9vOiAnYmFyJywgYmF6OiAneG94byd9CisgICAqCisgICAqIC8vIHNldCBmb28gdG8gJ3lpcGVlJworICAgKiAkbG9jYXRpb24uc2VhcmNoKCdmb28nLCAneWlwZWUnKTsKKyAgICogLy8gJGxvY2F0aW9uLnNlYXJjaCgpID0+IHtmb286ICd5aXBlZScsIGJhejogJ3hveG8nfQorICAgKiBgYGAKKyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0LjxzdHJpbmc+fE9iamVjdC48QXJyYXkuPHN0cmluZz4+fSBzZWFyY2ggTmV3IHNlYXJjaCBwYXJhbXMgLSBzdHJpbmcgb3IKKyAgICogaGFzaCBvYmplY3QuCisgICAqCisgICAqIFdoZW4gY2FsbGVkIHdpdGggYSBzaW5nbGUgYXJndW1lbnQgdGhlIG1ldGhvZCBhY3RzIGFzIGEgc2V0dGVyLCBzZXR0aW5nIHRoZSBgc2VhcmNoYCBjb21wb25lbnQKKyAgICogb2YgYCRsb2NhdGlvbmAgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICoKKyAgICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgaGFzaCBvYmplY3QgY29udGFpbmluZyBhbiBhcnJheSBvZiB2YWx1ZXMsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIGVuY29kZWQKKyAgICogYXMgZHVwbGljYXRlIHNlYXJjaCBwYXJhbWV0ZXJzIGluIHRoZSB1cmwuCisgICAqCisgICAqIEBwYXJhbSB7KHN0cmluZ3xOdW1iZXJ8QXJyYXk8c3RyaW5nPnxib29sZWFuKT19IHBhcmFtVmFsdWUgSWYgYHNlYXJjaGAgaXMgYSBzdHJpbmcgb3IgbnVtYmVyLCB0aGVuIGBwYXJhbVZhbHVlYAorICAgKiB3aWxsIG92ZXJyaWRlIG9ubHkgYSBzaW5nbGUgc2VhcmNoIHByb3BlcnR5LgorICAgKgorICAgKiBJZiBgcGFyYW1WYWx1ZWAgaXMgYW4gYXJyYXksIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIHByb3BlcnR5IG9mIHRoZSBgc2VhcmNoYCBjb21wb25lbnQgb2YKKyAgICogYCRsb2NhdGlvbmAgc3BlY2lmaWVkIHZpYSB0aGUgZmlyc3QgYXJndW1lbnQuCisgICAqCisgICAqIElmIGBwYXJhbVZhbHVlYCBpcyBgbnVsbGAsIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgdmlhIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIGRlbGV0ZWQuCisgICAqCisgICAqIElmIGBwYXJhbVZhbHVlYCBpcyBgdHJ1ZWAsIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgdmlhIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIGFkZGVkIHdpdGggbm8KKyAgICogdmFsdWUgbm9yIHRyYWlsaW5nIGVxdWFsIHNpZ24uCisgICAqCisgICAqIEByZXR1cm4ge09iamVjdH0gSWYgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzIHJldHVybnMgdGhlIHBhcnNlZCBgc2VhcmNoYCBvYmplY3QuIElmIGNhbGxlZCB3aXRoCisgICAqIG9uZSBvciBtb3JlIGFyZ3VtZW50cyByZXR1cm5zIGAkbG9jYXRpb25gIG9iamVjdCBpdHNlbGYuCisgICAqLworICBzZWFyY2g6IGZ1bmN0aW9uKHNlYXJjaCwgcGFyYW1WYWx1ZSkgeworICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkgeworICAgICAgY2FzZSAwOgorICAgICAgICByZXR1cm4gdGhpcy4kJHNlYXJjaDsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGlzU3RyaW5nKHNlYXJjaCkgfHwgaXNOdW1iZXIoc2VhcmNoKSkgeworICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC50b1N0cmluZygpOworICAgICAgICAgIHRoaXMuJCRzZWFyY2ggPSBwYXJzZUtleVZhbHVlKHNlYXJjaCk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2VhcmNoKSkgeworICAgICAgICAgIHNlYXJjaCA9IGNvcHkoc2VhcmNoLCB7fSk7CisgICAgICAgICAgLy8gcmVtb3ZlIG9iamVjdCB1bmRlZmluZWQgb3IgbnVsbCBwcm9wZXJ0aWVzCisgICAgICAgICAgZm9yRWFjaChzZWFyY2gsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSBkZWxldGUgc2VhcmNoW2tleV07CisgICAgICAgICAgfSk7CisKKyAgICAgICAgICB0aGlzLiQkc2VhcmNoID0gc2VhcmNoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93ICRsb2NhdGlvbk1pbkVycignaXNyY2hhcmcnLAorICAgICAgICAgICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBgJGxvY2F0aW9uI3NlYXJjaCgpYCBjYWxsIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gb2JqZWN0LicpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHBhcmFtVmFsdWUpIHx8IHBhcmFtVmFsdWUgPT09IG51bGwpIHsKKyAgICAgICAgICBkZWxldGUgdGhpcy4kJHNlYXJjaFtzZWFyY2hdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuJCRzZWFyY2hbc2VhcmNoXSA9IHBhcmFtVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLiQkY29tcG9zZSgpOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRsb2NhdGlvbiNoYXNoCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgLyBzZXR0ZXIuCisgICAqCisgICAqIFJldHVybiBoYXNoIGZyYWdtZW50IHdoZW4gY2FsbGVkIHdpdGhvdXQgYW55IHBhcmFtZXRlci4KKyAgICoKKyAgICogQ2hhbmdlIGhhc2ggZnJhZ21lbnQgd2hlbiBjYWxsZWQgd2l0aCBwYXJhbWV0ZXIgYW5kIHJldHVybiBgJGxvY2F0aW9uYC4KKyAgICoKKyAgICoKKyAgICogYGBganMKKyAgICogLy8gZ2l2ZW4gdXJsIGh0dHA6Ly9leGFtcGxlLmNvbS8jL3NvbWUvcGF0aD9mb289YmFyJmJhej14b3hvI2hhc2hWYWx1ZQorICAgKiB2YXIgaGFzaCA9ICRsb2NhdGlvbi5oYXNoKCk7CisgICAqIC8vID0+ICJoYXNoVmFsdWUiCisgICAqIGBgYAorICAgKgorICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKT19IGhhc2ggTmV3IGhhc2ggZnJhZ21lbnQKKyAgICogQHJldHVybiB7c3RyaW5nfSBoYXNoCisgICAqLworICBoYXNoOiBsb2NhdGlvbkdldHRlclNldHRlcignJCRoYXNoJywgZnVuY3Rpb24oaGFzaCkgeworICAgIHJldHVybiBoYXNoICE9PSBudWxsID8gaGFzaC50b1N0cmluZygpIDogJyc7CisgIH0pLAorCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRsb2NhdGlvbiNyZXBsYWNlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBJZiBjYWxsZWQsIGFsbCBjaGFuZ2VzIHRvICRsb2NhdGlvbiBkdXJpbmcgY3VycmVudCBgJGRpZ2VzdGAgd2lsbCBiZSByZXBsYWNpbmcgY3VycmVudCBoaXN0b3J5CisgICAqIHJlY29yZCwgaW5zdGVhZCBvZiBhZGRpbmcgbmV3IG9uZS4KKyAgICovCisgIHJlcGxhY2U6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuJCRyZXBsYWNlID0gdHJ1ZTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorfTsKKworZm9yRWFjaChbTG9jYXRpb25IYXNoYmFuZ0luSHRtbDVVcmwsIExvY2F0aW9uSGFzaGJhbmdVcmwsIExvY2F0aW9uSHRtbDVVcmxdLCBmdW5jdGlvbihMb2NhdGlvbikgeworICBMb2NhdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGxvY2F0aW9uUHJvdG90eXBlKTsKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAkbG9jYXRpb24jc3RhdGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciAvIHNldHRlci4KKyAgICoKKyAgICogUmV0dXJuIHRoZSBoaXN0b3J5IHN0YXRlIG9iamVjdCB3aGVuIGNhbGxlZCB3aXRob3V0IGFueSBwYXJhbWV0ZXIuCisgICAqCisgICAqIENoYW5nZSB0aGUgaGlzdG9yeSBzdGF0ZSBvYmplY3Qgd2hlbiBjYWxsZWQgd2l0aCBvbmUgcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuCisgICAqIFRoZSBzdGF0ZSBvYmplY3QgaXMgbGF0ZXIgcGFzc2VkIHRvIGBwdXNoU3RhdGVgIG9yIGByZXBsYWNlU3RhdGVgLgorICAgKgorICAgKiBOT1RFOiBUaGlzIG1ldGhvZCBpcyBzdXBwb3J0ZWQgb25seSBpbiBIVE1MNSBtb2RlIGFuZCBvbmx5IGluIGJyb3dzZXJzIHN1cHBvcnRpbmcKKyAgICogdGhlIEhUTUw1IEhpc3RvcnkgQVBJIChpLmUuIG1ldGhvZHMgYHB1c2hTdGF0ZWAgYW5kIGByZXBsYWNlU3RhdGVgKS4gSWYgeW91IG5lZWQgdG8gc3VwcG9ydAorICAgKiBvbGRlciBicm93c2VycyAobGlrZSBJRTkgb3IgQW5kcm9pZCA8IDQuMCksIGRvbid0IHVzZSB0aGlzIG1ldGhvZC4KKyAgICoKKyAgICogQHBhcmFtIHtvYmplY3Q9fSBzdGF0ZSBTdGF0ZSBvYmplY3QgZm9yIHB1c2hTdGF0ZSBvciByZXBsYWNlU3RhdGUKKyAgICogQHJldHVybiB7b2JqZWN0fSBzdGF0ZQorICAgKi8KKyAgTG9jYXRpb24ucHJvdG90eXBlLnN0YXRlID0gZnVuY3Rpb24oc3RhdGUpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpCisgICAgICByZXR1cm4gdGhpcy4kJHN0YXRlOworCisgICAgaWYgKExvY2F0aW9uICE9PSBMb2NhdGlvbkh0bWw1VXJsIHx8ICF0aGlzLiQkaHRtbDUpIHsKKyAgICAgIHRocm93ICRsb2NhdGlvbk1pbkVycignbm9zdGF0ZScsICdIaXN0b3J5IEFQSSBzdGF0ZSBzdXBwb3J0IGlzIGF2YWlsYWJsZSBvbmx5ICcgKworICAgICAgICAnaW4gSFRNTDUgbW9kZSBhbmQgb25seSBpbiBicm93c2VycyBzdXBwb3J0aW5nIEhUTUw1IEhpc3RvcnkgQVBJJyk7CisgICAgfQorICAgIC8vIFRoZSB1c2VyIG1pZ2h0IG1vZGlmeSBgc3RhdGVPYmplY3RgIGFmdGVyIGludm9raW5nIGAkbG9jYXRpb24uc3RhdGUoc3RhdGVPYmplY3QpYAorICAgIC8vIGJ1dCB3ZSdyZSBjaGFuZ2luZyB0aGUgJCRzdGF0ZSByZWZlcmVuY2UgdG8gJGJyb3dzZXIuc3RhdGUoKSBkdXJpbmcgdGhlICRkaWdlc3QKKyAgICAvLyBzbyB0aGUgbW9kaWZpY2F0aW9uIHdpbmRvdyBpcyBuYXJyb3cuCisgICAgdGhpcy4kJHN0YXRlID0gaXNVbmRlZmluZWQoc3RhdGUpID8gbnVsbCA6IHN0YXRlOworCisgICAgcmV0dXJuIHRoaXM7CisgIH07Cit9KTsKKworCitmdW5jdGlvbiBsb2NhdGlvbkdldHRlcihwcm9wZXJ0eSkgeworICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXNbcHJvcGVydHldOworICB9OworfQorCisKK2Z1bmN0aW9uIGxvY2F0aW9uR2V0dGVyU2V0dGVyKHByb3BlcnR5LCBwcmVwcm9jZXNzKSB7CisgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgeworICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpCisgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0eV07CisKKyAgICB0aGlzW3Byb3BlcnR5XSA9IHByZXByb2Nlc3ModmFsdWUpOworICAgIHRoaXMuJCRjb21wb3NlKCk7CisKKyAgICByZXR1cm4gdGhpczsKKyAgfTsKK30KKworCisvKioKKyAqIEBuZ2RvYyBzZXJ2aWNlCisgKiBAbmFtZSAkbG9jYXRpb24KKyAqCisgKiBAcmVxdWlyZXMgJHJvb3RFbGVtZW50CisgKgorICogQGRlc2NyaXB0aW9uCisgKiBUaGUgJGxvY2F0aW9uIHNlcnZpY2UgcGFyc2VzIHRoZSBVUkwgaW4gdGhlIGJyb3dzZXIgYWRkcmVzcyBiYXIgKGJhc2VkIG9uIHRoZQorICogW3dpbmRvdy5sb2NhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vd2luZG93LmxvY2F0aW9uKSkgYW5kIG1ha2VzIHRoZSBVUkwKKyAqIGF2YWlsYWJsZSB0byB5b3VyIGFwcGxpY2F0aW9uLiBDaGFuZ2VzIHRvIHRoZSBVUkwgaW4gdGhlIGFkZHJlc3MgYmFyIGFyZSByZWZsZWN0ZWQgaW50bworICogJGxvY2F0aW9uIHNlcnZpY2UgYW5kIGNoYW5nZXMgdG8gJGxvY2F0aW9uIGFyZSByZWZsZWN0ZWQgaW50byB0aGUgYnJvd3NlciBhZGRyZXNzIGJhci4KKyAqCisgKiAqKlRoZSAkbG9jYXRpb24gc2VydmljZToqKgorICoKKyAqIC0gRXhwb3NlcyB0aGUgY3VycmVudCBVUkwgaW4gdGhlIGJyb3dzZXIgYWRkcmVzcyBiYXIsIHNvIHlvdSBjYW4KKyAqICAgLSBXYXRjaCBhbmQgb2JzZXJ2ZSB0aGUgVVJMLgorICogICAtIENoYW5nZSB0aGUgVVJMLgorICogLSBTeW5jaHJvbml6ZXMgdGhlIFVSTCB3aXRoIHRoZSBicm93c2VyIHdoZW4gdGhlIHVzZXIKKyAqICAgLSBDaGFuZ2VzIHRoZSBhZGRyZXNzIGJhci4KKyAqICAgLSBDbGlja3MgdGhlIGJhY2sgb3IgZm9yd2FyZCBidXR0b24gKG9yIGNsaWNrcyBhIEhpc3RvcnkgbGluaykuCisgKiAgIC0gQ2xpY2tzIG9uIGEgbGluay4KKyAqIC0gUmVwcmVzZW50cyB0aGUgVVJMIG9iamVjdCBhcyBhIHNldCBvZiBtZXRob2RzIChwcm90b2NvbCwgaG9zdCwgcG9ydCwgcGF0aCwgc2VhcmNoLCBoYXNoKS4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUge0BsaW5rIGd1aWRlLyRsb2NhdGlvbiBEZXZlbG9wZXIgR3VpZGU6IFVzaW5nICRsb2NhdGlvbn0KKyAqLworCisvKioKKyAqIEBuZ2RvYyBwcm92aWRlcgorICogQG5hbWUgJGxvY2F0aW9uUHJvdmlkZXIKKyAqIEBkZXNjcmlwdGlvbgorICogVXNlIHRoZSBgJGxvY2F0aW9uUHJvdmlkZXJgIHRvIGNvbmZpZ3VyZSBob3cgdGhlIGFwcGxpY2F0aW9uIGRlZXAgbGlua2luZyBwYXRocyBhcmUgc3RvcmVkLgorICovCitmdW5jdGlvbiAkTG9jYXRpb25Qcm92aWRlcigpIHsKKyAgdmFyIGhhc2hQcmVmaXggPSAnJywKKyAgICAgIGh0bWw1TW9kZSA9IHsKKyAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIHJlcXVpcmVCYXNlOiB0cnVlLAorICAgICAgICByZXdyaXRlTGlua3M6IHRydWUKKyAgICAgIH07CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgJGxvY2F0aW9uUHJvdmlkZXIjaGFzaFByZWZpeAorICAgKiBAZGVzY3JpcHRpb24KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBwcmVmaXggUHJlZml4IGZvciBoYXNoIHBhcnQgKGNvbnRhaW5pbmcgcGF0aCBhbmQgc2VhcmNoKQorICAgKiBAcmV0dXJucyB7Kn0gY3VycmVudCB2YWx1ZSBpZiB1c2VkIGFzIGdldHRlciBvciBpdHNlbGYgKGNoYWluaW5nKSBpZiB1c2VkIGFzIHNldHRlcgorICAgKi8KKyAgdGhpcy5oYXNoUHJlZml4ID0gZnVuY3Rpb24ocHJlZml4KSB7CisgICAgaWYgKGlzRGVmaW5lZChwcmVmaXgpKSB7CisgICAgICBoYXNoUHJlZml4ID0gcHJlZml4OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBoYXNoUHJlZml4OworICAgIH0KKyAgfTsKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAkbG9jYXRpb25Qcm92aWRlciNodG1sNU1vZGUKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIEBwYXJhbSB7KGJvb2xlYW58T2JqZWN0KT19IG1vZGUgSWYgYm9vbGVhbiwgc2V0cyBgaHRtbDVNb2RlLmVuYWJsZWRgIHRvIHZhbHVlLgorICAgKiAgIElmIG9iamVjdCwgc2V0cyBgZW5hYmxlZGAsIGByZXF1aXJlQmFzZWAgYW5kIGByZXdyaXRlTGlua3NgIHRvIHJlc3BlY3RpdmUgdmFsdWVzLiBTdXBwb3J0ZWQKKyAgICogICBwcm9wZXJ0aWVzOgorICAgKiAgIC0gKiplbmFibGVkKiog4oA/IGB7Ym9vbGVhbn1gIOKAPyAoZGVmYXVsdDogZmFsc2UpIElmIHRydWUsIHdpbGwgcmVseSBvbiBgaGlzdG9yeS5wdXNoU3RhdGVgIHRvCisgICAqICAgICBjaGFuZ2UgdXJscyB3aGVyZSBzdXBwb3J0ZWQuIFdpbGwgZmFsbCBiYWNrIHRvIGhhc2gtcHJlZml4ZWQgcGF0aHMgaW4gYnJvd3NlcnMgdGhhdCBkbyBub3QKKyAgICogICAgIHN1cHBvcnQgYHB1c2hTdGF0ZWAuCisgICAqICAgLSAqKnJlcXVpcmVCYXNlKiogLSBge2Jvb2xlYW59YCAtIChkZWZhdWx0OiBgdHJ1ZWApIFdoZW4gaHRtbDVNb2RlIGlzIGVuYWJsZWQsIHNwZWNpZmllcworICAgKiAgICAgd2hldGhlciBvciBub3QgYSA8YmFzZT4gdGFnIGlzIHJlcXVpcmVkIHRvIGJlIHByZXNlbnQuIElmIGBlbmFibGVkYCBhbmQgYHJlcXVpcmVCYXNlYCBhcmUKKyAgICogICAgIHRydWUsIGFuZCBhIGJhc2UgdGFnIGlzIG5vdCBwcmVzZW50LCBhbiBlcnJvciB3aWxsIGJlIHRocm93biB3aGVuIGAkbG9jYXRpb25gIGlzIGluamVjdGVkLgorICAgKiAgICAgU2VlIHRoZSB7QGxpbmsgZ3VpZGUvJGxvY2F0aW9uICRsb2NhdGlvbiBndWlkZSBmb3IgbW9yZSBpbmZvcm1hdGlvbn0KKyAgICogICAtICoqcmV3cml0ZUxpbmtzKiogLSBge2Jvb2xlYW59YCAtIChkZWZhdWx0OiBgdHJ1ZWApIFdoZW4gaHRtbDVNb2RlIGlzIGVuYWJsZWQsCisgICAqICAgICBlbmFibGVzL2Rpc2FibGVzIHVybCByZXdyaXRpbmcgZm9yIHJlbGF0aXZlIGxpbmtzLgorICAgKgorICAgKiBAcmV0dXJucyB7T2JqZWN0fSBodG1sNU1vZGUgb2JqZWN0IGlmIHVzZWQgYXMgZ2V0dGVyIG9yIGl0c2VsZiAoY2hhaW5pbmcpIGlmIHVzZWQgYXMgc2V0dGVyCisgICAqLworICB0aGlzLmh0bWw1TW9kZSA9IGZ1bmN0aW9uKG1vZGUpIHsKKyAgICBpZiAoaXNCb29sZWFuKG1vZGUpKSB7CisgICAgICBodG1sNU1vZGUuZW5hYmxlZCA9IG1vZGU7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KG1vZGUpKSB7CisKKyAgICAgIGlmIChpc0Jvb2xlYW4obW9kZS5lbmFibGVkKSkgeworICAgICAgICBodG1sNU1vZGUuZW5hYmxlZCA9IG1vZGUuZW5hYmxlZDsKKyAgICAgIH0KKworICAgICAgaWYgKGlzQm9vbGVhbihtb2RlLnJlcXVpcmVCYXNlKSkgeworICAgICAgICBodG1sNU1vZGUucmVxdWlyZUJhc2UgPSBtb2RlLnJlcXVpcmVCYXNlOworICAgICAgfQorCisgICAgICBpZiAoaXNCb29sZWFuKG1vZGUucmV3cml0ZUxpbmtzKSkgeworICAgICAgICBodG1sNU1vZGUucmV3cml0ZUxpbmtzID0gbW9kZS5yZXdyaXRlTGlua3M7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gaHRtbDVNb2RlOworICAgIH0KKyAgfTsKKworICAvKioKKyAgICogQG5nZG9jIGV2ZW50CisgICAqIEBuYW1lICRsb2NhdGlvbiMkbG9jYXRpb25DaGFuZ2VTdGFydAorICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBCcm9hZGNhc3RlZCBiZWZvcmUgYSBVUkwgd2lsbCBjaGFuZ2UuCisgICAqCisgICAqIFRoaXMgY2hhbmdlIGNhbiBiZSBwcmV2ZW50ZWQgYnkgY2FsbGluZworICAgKiBgcHJldmVudERlZmF1bHRgIG1ldGhvZCBvZiB0aGUgZXZlbnQuIFNlZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb259IGZvciBtb3JlCisgICAqIGRldGFpbHMgYWJvdXQgZXZlbnQgb2JqZWN0LiBVcG9uIHN1Y2Nlc3NmdWwgY2hhbmdlCisgICAqIHtAbGluayBuZy4kbG9jYXRpb24jJGxvY2F0aW9uQ2hhbmdlU3VjY2VzcyAkbG9jYXRpb25DaGFuZ2VTdWNjZXNzfSBpcyBmaXJlZC4KKyAgICoKKyAgICogVGhlIGBuZXdTdGF0ZWAgYW5kIGBvbGRTdGF0ZWAgcGFyYW1ldGVycyBtYXkgYmUgZGVmaW5lZCBvbmx5IGluIEhUTUw1IG1vZGUgYW5kIHdoZW4KKyAgICogdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLgorICAgKgorICAgKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuCisgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdVcmwgTmV3IFVSTAorICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFVybCBVUkwgdGhhdCB3YXMgYmVmb3JlIGl0IHdhcyBjaGFuZ2VkLgorICAgKiBAcGFyYW0ge3N0cmluZz19IG5ld1N0YXRlIE5ldyBoaXN0b3J5IHN0YXRlIG9iamVjdAorICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFN0YXRlIEhpc3Rvcnkgc3RhdGUgb2JqZWN0IHRoYXQgd2FzIGJlZm9yZSBpdCB3YXMgY2hhbmdlZC4KKyAgICovCisKKyAgLyoqCisgICAqIEBuZ2RvYyBldmVudAorICAgKiBAbmFtZSAkbG9jYXRpb24jJGxvY2F0aW9uQ2hhbmdlU3VjY2VzcworICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBCcm9hZGNhc3RlZCBhZnRlciBhIFVSTCB3YXMgY2hhbmdlZC4KKyAgICoKKyAgICogVGhlIGBuZXdTdGF0ZWAgYW5kIGBvbGRTdGF0ZWAgcGFyYW1ldGVycyBtYXkgYmUgZGVmaW5lZCBvbmx5IGluIEhUTUw1IG1vZGUgYW5kIHdoZW4KKyAgICogdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLgorICAgKgorICAgKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuCisgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdVcmwgTmV3IFVSTAorICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFVybCBVUkwgdGhhdCB3YXMgYmVmb3JlIGl0IHdhcyBjaGFuZ2VkLgorICAgKiBAcGFyYW0ge3N0cmluZz19IG5ld1N0YXRlIE5ldyBoaXN0b3J5IHN0YXRlIG9iamVjdAorICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFN0YXRlIEhpc3Rvcnkgc3RhdGUgb2JqZWN0IHRoYXQgd2FzIGJlZm9yZSBpdCB3YXMgY2hhbmdlZC4KKyAgICovCisKKyAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywgJyRicm93c2VyJywgJyRzbmlmZmVyJywgJyRyb290RWxlbWVudCcsICckd2luZG93JywKKyAgICAgIGZ1bmN0aW9uKCRyb290U2NvcGUsICRicm93c2VyLCAkc25pZmZlciwgJHJvb3RFbGVtZW50LCAkd2luZG93KSB7CisgICAgdmFyICRsb2NhdGlvbiwKKyAgICAgICAgTG9jYXRpb25Nb2RlLAorICAgICAgICBiYXNlSHJlZiA9ICRicm93c2VyLmJhc2VIcmVmKCksIC8vIGlmIGJhc2VbaHJlZl0gaXMgdW5kZWZpbmVkLCBpdCBkZWZhdWx0cyB0byAnJworICAgICAgICBpbml0aWFsVXJsID0gJGJyb3dzZXIudXJsKCksCisgICAgICAgIGFwcEJhc2U7CisKKyAgICBpZiAoaHRtbDVNb2RlLmVuYWJsZWQpIHsKKyAgICAgIGlmICghYmFzZUhyZWYgJiYgaHRtbDVNb2RlLnJlcXVpcmVCYXNlKSB7CisgICAgICAgIHRocm93ICRsb2NhdGlvbk1pbkVycignbm9iYXNlJywKKyAgICAgICAgICAiJGxvY2F0aW9uIGluIEhUTUw1IG1vZGUgcmVxdWlyZXMgYSA8YmFzZT4gdGFnIHRvIGJlIHByZXNlbnQhIik7CisgICAgICB9CisgICAgICBhcHBCYXNlID0gc2VydmVyQmFzZShpbml0aWFsVXJsKSArIChiYXNlSHJlZiB8fCAnLycpOworICAgICAgTG9jYXRpb25Nb2RlID0gJHNuaWZmZXIuaGlzdG9yeSA/IExvY2F0aW9uSHRtbDVVcmwgOiBMb2NhdGlvbkhhc2hiYW5nSW5IdG1sNVVybDsKKyAgICB9IGVsc2UgeworICAgICAgYXBwQmFzZSA9IHN0cmlwSGFzaChpbml0aWFsVXJsKTsKKyAgICAgIExvY2F0aW9uTW9kZSA9IExvY2F0aW9uSGFzaGJhbmdVcmw7CisgICAgfQorICAgICRsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbk1vZGUoYXBwQmFzZSwgJyMnICsgaGFzaFByZWZpeCk7CisgICAgJGxvY2F0aW9uLiQkcGFyc2VMaW5rVXJsKGluaXRpYWxVcmwsIGluaXRpYWxVcmwpOworCisgICAgJGxvY2F0aW9uLiQkc3RhdGUgPSAkYnJvd3Nlci5zdGF0ZSgpOworCisgICAgdmFyIElHTk9SRV9VUklfUkVHRVhQID0gL15ccyooamF2YXNjcmlwdHxtYWlsdG8pOi9pOworCisgICAgZnVuY3Rpb24gc2V0QnJvd3NlclVybFdpdGhGYWxsYmFjayh1cmwsIHJlcGxhY2UsIHN0YXRlKSB7CisgICAgICB2YXIgb2xkVXJsID0gJGxvY2F0aW9uLnVybCgpOworICAgICAgdmFyIG9sZFN0YXRlID0gJGxvY2F0aW9uLiQkc3RhdGU7CisgICAgICB0cnkgeworICAgICAgICAkYnJvd3Nlci51cmwodXJsLCByZXBsYWNlLCBzdGF0ZSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlICRsb2NhdGlvbi5zdGF0ZSgpIHJldHVybnMgcmVmZXJlbnRpYWxseSBpZGVudGljYWwgKG5vdCBqdXN0IGRlZXBseSBlcXVhbCkKKyAgICAgICAgLy8gc3RhdGUgb2JqZWN0OyB0aGlzIG1ha2VzIHBvc3NpYmxlIHF1aWNrIGNoZWNraW5nIGlmIHRoZSBzdGF0ZSBjaGFuZ2VkIGluIHRoZSBkaWdlc3QKKyAgICAgICAgLy8gbG9vcC4gQ2hlY2tpbmcgZGVlcCBlcXVhbGl0eSB3b3VsZCBiZSB0b28gZXhwZW5zaXZlLgorICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9ICRicm93c2VyLnN0YXRlKCk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIC8vIFJlc3RvcmUgb2xkIHZhbHVlcyBpZiBwdXNoU3RhdGUgZmFpbHMKKyAgICAgICAgJGxvY2F0aW9uLnVybChvbGRVcmwpOworICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9IG9sZFN0YXRlOworCisgICAgICAgIHRocm93IGU7CisgICAgICB9CisgICAgfQorCisgICAgJHJvb3RFbGVtZW50Lm9uKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAvLyBUT0RPKHZvanRhKTogcmV3cml0ZSBsaW5rIHdoZW4gb3BlbmluZyBpbiBuZXcgdGFiL3dpbmRvdyAoaW4gbGVnYWN5IGJyb3dzZXIpCisgICAgICAvLyBjdXJyZW50bHkgd2Ugb3BlbiBuaWNlIHVybCBsaW5rIGFuZCByZWRpcmVjdCB0aGVuCisKKyAgICAgIGlmICghaHRtbDVNb2RlLnJld3JpdGVMaW5rcyB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQud2hpY2ggPT0gMikgcmV0dXJuOworCisgICAgICB2YXIgZWxtID0ganFMaXRlKGV2ZW50LnRhcmdldCk7CisKKyAgICAgIC8vIHRyYXZlcnNlIHRoZSBET00gdXAgdG8gZmluZCBmaXJzdCBBIHRhZworICAgICAgd2hpbGUgKG5vZGVOYW1lXyhlbG1bMF0pICE9PSAnYScpIHsKKyAgICAgICAgLy8gaWdub3JlIHJld3JpdGluZyBpZiBubyBBIHRhZyAocmVhY2hlZCByb290IGVsZW1lbnQsIG9yIG5vIHBhcmVudCAtIHJlbW92ZWQgZnJvbSBkb2N1bWVudCkKKyAgICAgICAgaWYgKGVsbVswXSA9PT0gJHJvb3RFbGVtZW50WzBdIHx8ICEoZWxtID0gZWxtLnBhcmVudCgpKVswXSkgcmV0dXJuOworICAgICAgfQorCisgICAgICB2YXIgYWJzSHJlZiA9IGVsbS5wcm9wKCdocmVmJyk7CisgICAgICAvLyBnZXQgdGhlIGFjdHVhbCBocmVmIGF0dHJpYnV0ZSAtIHNlZQorICAgICAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2RkMzQ3MTQ4KHY9dnMuODUpLmFzcHgKKyAgICAgIHZhciByZWxIcmVmID0gZWxtLmF0dHIoJ2hyZWYnKSB8fCBlbG0uYXR0cigneGxpbms6aHJlZicpOworCisgICAgICBpZiAoaXNPYmplY3QoYWJzSHJlZikgJiYgYWJzSHJlZi50b1N0cmluZygpID09PSAnW29iamVjdCBTVkdBbmltYXRlZFN0cmluZ10nKSB7CisgICAgICAgIC8vIFNWR0FuaW1hdGVkU3RyaW5nLmFuaW1WYWwgc2hvdWxkIGJlIGlkZW50aWNhbCB0byBTVkdBbmltYXRlZFN0cmluZy5iYXNlVmFsLCB1bmxlc3MgZHVyaW5nCisgICAgICAgIC8vIGFuIGFuaW1hdGlvbi4KKyAgICAgICAgYWJzSHJlZiA9IHVybFJlc29sdmUoYWJzSHJlZi5hbmltVmFsKS5ocmVmOworICAgICAgfQorCisgICAgICAvLyBJZ25vcmUgd2hlbiB1cmwgaXMgc3RhcnRlZCB3aXRoIGphdmFzY3JpcHQ6IG9yIG1haWx0bzoKKyAgICAgIGlmIChJR05PUkVfVVJJX1JFR0VYUC50ZXN0KGFic0hyZWYpKSByZXR1cm47CisKKyAgICAgIGlmIChhYnNIcmVmICYmICFlbG0uYXR0cigndGFyZ2V0JykgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CisgICAgICAgIGlmICgkbG9jYXRpb24uJCRwYXJzZUxpbmtVcmwoYWJzSHJlZiwgcmVsSHJlZikpIHsKKyAgICAgICAgICAvLyBXZSBkbyBhIHByZXZlbnREZWZhdWx0IGZvciBhbGwgdXJscyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBhbmd1bGFyIGFwcGxpY2F0aW9uLAorICAgICAgICAgIC8vIGluIGh0bWw1bW9kZSBhbmQgYWxzbyB3aXRob3V0LCBzbyB0aGF0IHdlIGFyZSBhYmxlIHRvIGFib3J0IG5hdmlnYXRpb24gd2l0aG91dAorICAgICAgICAgIC8vIGdldHRpbmcgZG91YmxlIGVudHJpZXMgaW4gdGhlIGxvY2F0aW9uIGhpc3RvcnkuCisgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgICAvLyB1cGRhdGUgbG9jYXRpb24gbWFudWFsbHkKKyAgICAgICAgICBpZiAoJGxvY2F0aW9uLmFic1VybCgpICE9ICRicm93c2VyLnVybCgpKSB7CisgICAgICAgICAgICAkcm9vdFNjb3BlLiRhcHBseSgpOworICAgICAgICAgICAgLy8gaGFjayB0byB3b3JrIGFyb3VuZCBGRjYgYnVnIDY4NDIwOCB3aGVuIHNjZW5hcmlvIHJ1bm5lciBjbGlja3Mgb24gbGlua3MKKyAgICAgICAgICAgICR3aW5kb3cuYW5ndWxhclsnZmYtNjg0MjA4LXByZXZlbnREZWZhdWx0J10gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworCisKKyAgICAvLyByZXdyaXRlIGhhc2hiYW5nIHVybCA8PiBodG1sNSB1cmwKKyAgICBpZiAoJGxvY2F0aW9uLmFic1VybCgpICE9IGluaXRpYWxVcmwpIHsKKyAgICAgICRicm93c2VyLnVybCgkbG9jYXRpb24uYWJzVXJsKCksIHRydWUpOworICAgIH0KKworICAgIHZhciBpbml0aWFsaXppbmcgPSB0cnVlOworCisgICAgLy8gdXBkYXRlICRsb2NhdGlvbiB3aGVuICRicm93c2VyIHVybCBjaGFuZ2VzCisgICAgJGJyb3dzZXIub25VcmxDaGFuZ2UoZnVuY3Rpb24obmV3VXJsLCBuZXdTdGF0ZSkgeworICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgb2xkVXJsID0gJGxvY2F0aW9uLmFic1VybCgpOworICAgICAgICB2YXIgb2xkU3RhdGUgPSAkbG9jYXRpb24uJCRzdGF0ZTsKKyAgICAgICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQ7CisKKyAgICAgICAgJGxvY2F0aW9uLiQkcGFyc2UobmV3VXJsKTsKKyAgICAgICAgJGxvY2F0aW9uLiQkc3RhdGUgPSBuZXdTdGF0ZTsKKworICAgICAgICBkZWZhdWx0UHJldmVudGVkID0gJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckbG9jYXRpb25DaGFuZ2VTdGFydCcsIG5ld1VybCwgb2xkVXJsLAorICAgICAgICAgICAgbmV3U3RhdGUsIG9sZFN0YXRlKS5kZWZhdWx0UHJldmVudGVkOworCisgICAgICAgIC8vIGlmIHRoZSBsb2NhdGlvbiB3YXMgY2hhbmdlZCBieSBhIGAkbG9jYXRpb25DaGFuZ2VTdGFydGAgaGFuZGxlciB0aGVuIHN0b3AKKyAgICAgICAgLy8gcHJvY2Vzc2luZyB0aGlzIGxvY2F0aW9uIGNoYW5nZQorICAgICAgICBpZiAoJGxvY2F0aW9uLmFic1VybCgpICE9PSBuZXdVcmwpIHJldHVybjsKKworICAgICAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkgeworICAgICAgICAgICRsb2NhdGlvbi4kJHBhcnNlKG9sZFVybCk7CisgICAgICAgICAgJGxvY2F0aW9uLiQkc3RhdGUgPSBvbGRTdGF0ZTsKKyAgICAgICAgICBzZXRCcm93c2VyVXJsV2l0aEZhbGxiYWNrKG9sZFVybCwgZmFsc2UsIG9sZFN0YXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbml0aWFsaXppbmcgPSBmYWxzZTsKKyAgICAgICAgICBhZnRlckxvY2F0aW9uQ2hhbmdlKG9sZFVybCwgb2xkU3RhdGUpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGlmICghJHJvb3RTY29wZS4kJHBoYXNlKSAkcm9vdFNjb3BlLiRkaWdlc3QoKTsKKyAgICB9KTsKKworICAgIC8vIHVwZGF0ZSBicm93c2VyCisgICAgJHJvb3RTY29wZS4kd2F0Y2goZnVuY3Rpb24gJGxvY2F0aW9uV2F0Y2goKSB7CisgICAgICB2YXIgb2xkVXJsID0gdHJpbUVtcHR5SGFzaCgkYnJvd3Nlci51cmwoKSk7CisgICAgICB2YXIgbmV3VXJsID0gdHJpbUVtcHR5SGFzaCgkbG9jYXRpb24uYWJzVXJsKCkpOworICAgICAgdmFyIG9sZFN0YXRlID0gJGJyb3dzZXIuc3RhdGUoKTsKKyAgICAgIHZhciBjdXJyZW50UmVwbGFjZSA9ICRsb2NhdGlvbi4kJHJlcGxhY2U7CisgICAgICB2YXIgdXJsT3JTdGF0ZUNoYW5nZWQgPSBvbGRVcmwgIT09IG5ld1VybCB8fAorICAgICAgICAoJGxvY2F0aW9uLiQkaHRtbDUgJiYgJHNuaWZmZXIuaGlzdG9yeSAmJiBvbGRTdGF0ZSAhPT0gJGxvY2F0aW9uLiQkc3RhdGUpOworCisgICAgICBpZiAoaW5pdGlhbGl6aW5nIHx8IHVybE9yU3RhdGVDaGFuZ2VkKSB7CisgICAgICAgIGluaXRpYWxpemluZyA9IGZhbHNlOworCisgICAgICAgICRyb290U2NvcGUuJGV2YWxBc3luYyhmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgbmV3VXJsID0gJGxvY2F0aW9uLmFic1VybCgpOworICAgICAgICAgIHZhciBkZWZhdWx0UHJldmVudGVkID0gJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckbG9jYXRpb25DaGFuZ2VTdGFydCcsIG5ld1VybCwgb2xkVXJsLAorICAgICAgICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSwgb2xkU3RhdGUpLmRlZmF1bHRQcmV2ZW50ZWQ7CisKKyAgICAgICAgICAvLyBpZiB0aGUgbG9jYXRpb24gd2FzIGNoYW5nZWQgYnkgYSBgJGxvY2F0aW9uQ2hhbmdlU3RhcnRgIGhhbmRsZXIgdGhlbiBzdG9wCisgICAgICAgICAgLy8gcHJvY2Vzc2luZyB0aGlzIGxvY2F0aW9uIGNoYW5nZQorICAgICAgICAgIGlmICgkbG9jYXRpb24uYWJzVXJsKCkgIT09IG5ld1VybCkgcmV0dXJuOworCisgICAgICAgICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHsKKyAgICAgICAgICAgICRsb2NhdGlvbi4kJHBhcnNlKG9sZFVybCk7CisgICAgICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9IG9sZFN0YXRlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodXJsT3JTdGF0ZUNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgc2V0QnJvd3NlclVybFdpdGhGYWxsYmFjayhuZXdVcmwsIGN1cnJlbnRSZXBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFN0YXRlID09PSAkbG9jYXRpb24uJCRzdGF0ZSA/IG51bGwgOiAkbG9jYXRpb24uJCRzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZnRlckxvY2F0aW9uQ2hhbmdlKG9sZFVybCwgb2xkU3RhdGUpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisKKyAgICAgICRsb2NhdGlvbi4kJHJlcGxhY2UgPSBmYWxzZTsKKworICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byByZXR1cm4gYW55dGhpbmcgYmVjYXVzZSAkZXZhbEFzeW5jIHdpbGwgbWFrZSB0aGUgZGlnZXN0IGxvb3AgZGlydHkgd2hlbgorICAgICAgLy8gdGhlcmUgaXMgYSBjaGFuZ2UKKyAgICB9KTsKKworICAgIHJldHVybiAkbG9jYXRpb247CisKKyAgICBmdW5jdGlvbiBhZnRlckxvY2F0aW9uQ2hhbmdlKG9sZFVybCwgb2xkU3RhdGUpIHsKKyAgICAgICRyb290U2NvcGUuJGJyb2FkY2FzdCgnJGxvY2F0aW9uQ2hhbmdlU3VjY2VzcycsICRsb2NhdGlvbi5hYnNVcmwoKSwgb2xkVXJsLAorICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSwgb2xkU3RhdGUpOworICAgIH0KK31dOworfQorCisvKioKKyAqIEBuZ2RvYyBzZXJ2aWNlCisgKiBAbmFtZSAkbG9nCisgKiBAcmVxdWlyZXMgJHdpbmRvdworICoKKyAqIEBkZXNjcmlwdGlvbgorICogU2ltcGxlIHNlcnZpY2UgZm9yIGxvZ2dpbmcuIERlZmF1bHQgaW1wbGVtZW50YXRpb24gc2FmZWx5IHdyaXRlcyB0aGUgbWVzc2FnZQorICogaW50byB0aGUgYnJvd3NlcidzIGNvbnNvbGUgKGlmIHByZXNlbnQpLgorICoKKyAqIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBzZXJ2aWNlIGlzIHRvIHNpbXBsaWZ5IGRlYnVnZ2luZyBhbmQgdHJvdWJsZXNob290aW5nLgorICoKKyAqIFRoZSBkZWZhdWx0IGlzIHRvIGxvZyBgZGVidWdgIG1lc3NhZ2VzLiBZb3UgY2FuIHVzZQorICoge0BsaW5rIG5nLiRsb2dQcm92aWRlciBuZy4kbG9nUHJvdmlkZXIjZGVidWdFbmFibGVkfSB0byBjaGFuZ2UgdGhpcy4KKyAqCisgKiBAZXhhbXBsZQorICAgPGV4YW1wbGUgbW9kdWxlPSJsb2dFeGFtcGxlIj4KKyAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KKyAgICAgICBhbmd1bGFyLm1vZHVsZSgnbG9nRXhhbXBsZScsIFtdKQorICAgICAgICAgLmNvbnRyb2xsZXIoJ0xvZ0NvbnRyb2xsZXInLCBbJyRzY29wZScsICckbG9nJywgZnVuY3Rpb24oJHNjb3BlLCAkbG9nKSB7CisgICAgICAgICAgICRzY29wZS4kbG9nID0gJGxvZzsKKyAgICAgICAgICAgJHNjb3BlLm1lc3NhZ2UgPSAnSGVsbG8gV29ybGQhJzsKKyAgICAgICAgIH1dKTsKKyAgICAgPC9maWxlPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkxvZ0NvbnRyb2xsZXIiPgorICAgICAgICAgPHA+UmVsb2FkIHRoaXMgcGFnZSB3aXRoIG9wZW4gY29uc29sZSwgZW50ZXIgdGV4dCBhbmQgaGl0IHRoZSBsb2cgYnV0dG9uLi4uPC9wPgorICAgICAgICAgTWVzc2FnZToKKyAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ibWVzc2FnZSIvPgorICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0iJGxvZy5sb2cobWVzc2FnZSkiPmxvZzwvYnV0dG9uPgorICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0iJGxvZy53YXJuKG1lc3NhZ2UpIj53YXJuPC9idXR0b24+CisgICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPSIkbG9nLmluZm8obWVzc2FnZSkiPmluZm88L2J1dHRvbj4KKyAgICAgICAgIDxidXR0b24gbmctY2xpY2s9IiRsb2cuZXJyb3IobWVzc2FnZSkiPmVycm9yPC9idXR0b24+CisgICAgICAgPC9kaXY+CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLworCisvKioKKyAqIEBuZ2RvYyBwcm92aWRlcgorICogQG5hbWUgJGxvZ1Byb3ZpZGVyCisgKiBAZGVzY3JpcHRpb24KKyAqIFVzZSB0aGUgYCRsb2dQcm92aWRlcmAgdG8gY29uZmlndXJlIGhvdyB0aGUgYXBwbGljYXRpb24gbG9ncyBtZXNzYWdlcworICovCitmdW5jdGlvbiAkTG9nUHJvdmlkZXIoKSB7CisgIHZhciBkZWJ1ZyA9IHRydWUsCisgICAgICBzZWxmID0gdGhpczsKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAkbG9nUHJvdmlkZXIjZGVidWdFbmFibGVkCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBmbGFnIGVuYWJsZSBvciBkaXNhYmxlIGRlYnVnIGxldmVsIG1lc3NhZ2VzCisgICAqIEByZXR1cm5zIHsqfSBjdXJyZW50IHZhbHVlIGlmIHVzZWQgYXMgZ2V0dGVyIG9yIGl0c2VsZiAoY2hhaW5pbmcpIGlmIHVzZWQgYXMgc2V0dGVyCisgICAqLworICB0aGlzLmRlYnVnRW5hYmxlZCA9IGZ1bmN0aW9uKGZsYWcpIHsKKyAgICBpZiAoaXNEZWZpbmVkKGZsYWcpKSB7CisgICAgICBkZWJ1ZyA9IGZsYWc7CisgICAgcmV0dXJuIHRoaXM7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBkZWJ1ZzsKKyAgICB9CisgIH07CisKKyAgdGhpcy4kZ2V0ID0gWyckd2luZG93JywgZnVuY3Rpb24oJHdpbmRvdykgeworICAgIHJldHVybiB7CisgICAgICAvKioKKyAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAqIEBuYW1lICRsb2cjbG9nCisgICAgICAgKgorICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgKiBXcml0ZSBhIGxvZyBtZXNzYWdlCisgICAgICAgKi8KKyAgICAgIGxvZzogY29uc29sZUxvZygnbG9nJyksCisKKyAgICAgIC8qKgorICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICogQG5hbWUgJGxvZyNpbmZvCisgICAgICAgKgorICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgKiBXcml0ZSBhbiBpbmZvcm1hdGlvbiBtZXNzYWdlCisgICAgICAgKi8KKyAgICAgIGluZm86IGNvbnNvbGVMb2coJ2luZm8nKSwKKworICAgICAgLyoqCisgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgKiBAbmFtZSAkbG9nI3dhcm4KKyAgICAgICAqCisgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAqIFdyaXRlIGEgd2FybmluZyBtZXNzYWdlCisgICAgICAgKi8KKyAgICAgIHdhcm46IGNvbnNvbGVMb2coJ3dhcm4nKSwKKworICAgICAgLyoqCisgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgKiBAbmFtZSAkbG9nI2Vycm9yCisgICAgICAgKgorICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgKiBXcml0ZSBhbiBlcnJvciBtZXNzYWdlCisgICAgICAgKi8KKyAgICAgIGVycm9yOiBjb25zb2xlTG9nKCdlcnJvcicpLAorCisgICAgICAvKioKKyAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAqIEBuYW1lICRsb2cjZGVidWcKKyAgICAgICAqCisgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZQorICAgICAgICovCisgICAgICBkZWJ1ZzogKGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgZm4gPSBjb25zb2xlTG9nKCdkZWJ1ZycpOworCisgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIGZuLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgfSgpKQorICAgIH07CisKKyAgICBmdW5jdGlvbiBmb3JtYXRFcnJvcihhcmcpIHsKKyAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBFcnJvcikgeworICAgICAgICBpZiAoYXJnLnN0YWNrKSB7CisgICAgICAgICAgYXJnID0gKGFyZy5tZXNzYWdlICYmIGFyZy5zdGFjay5pbmRleE9mKGFyZy5tZXNzYWdlKSA9PT0gLTEpCisgICAgICAgICAgICAgID8gJ0Vycm9yOiAnICsgYXJnLm1lc3NhZ2UgKyAnXG4nICsgYXJnLnN0YWNrCisgICAgICAgICAgICAgIDogYXJnLnN0YWNrOworICAgICAgICB9IGVsc2UgaWYgKGFyZy5zb3VyY2VVUkwpIHsKKyAgICAgICAgICBhcmcgPSBhcmcubWVzc2FnZSArICdcbicgKyBhcmcuc291cmNlVVJMICsgJzonICsgYXJnLmxpbmU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBhcmc7CisgICAgfQorCisgICAgZnVuY3Rpb24gY29uc29sZUxvZyh0eXBlKSB7CisgICAgICB2YXIgY29uc29sZSA9ICR3aW5kb3cuY29uc29sZSB8fCB7fSwKKyAgICAgICAgICBsb2dGbiA9IGNvbnNvbGVbdHlwZV0gfHwgY29uc29sZS5sb2cgfHwgbm9vcCwKKyAgICAgICAgICBoYXNBcHBseSA9IGZhbHNlOworCisgICAgICAvLyBOb3RlOiByZWFkaW5nIGxvZ0ZuLmFwcGx5IHRocm93cyBhbiBlcnJvciBpbiBJRTExIGluIElFOCBkb2N1bWVudCBtb2RlLgorICAgICAgLy8gVGhlIHJlYXNvbiBiZWhpbmQgdGhpcyBpcyB0aGF0IGNvbnNvbGUubG9nIGhhcyB0eXBlICJvYmplY3QiIGluIElFOC4uLgorICAgICAgdHJ5IHsKKyAgICAgICAgaGFzQXBwbHkgPSAhIWxvZ0ZuLmFwcGx5OworICAgICAgfSBjYXRjaCAoZSkge30KKworICAgICAgaWYgKGhhc0FwcGx5KSB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgYXJncyA9IFtdOworICAgICAgICAgIGZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbihhcmcpIHsKKyAgICAgICAgICAgIGFyZ3MucHVzaChmb3JtYXRFcnJvcihhcmcpKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICByZXR1cm4gbG9nRm4uYXBwbHkoY29uc29sZSwgYXJncyk7CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIC8vIHdlIGFyZSBJRSB3aGljaCBlaXRoZXIgZG9lc24ndCBoYXZlIHdpbmRvdy5jb25zb2xlID0+IHRoaXMgaXMgbm9vcCBhbmQgd2UgZG8gbm90aGluZywKKyAgICAgIC8vIG9yIHdlIGFyZSBJRSB3aGVyZSBjb25zb2xlLmxvZyBkb2Vzbid0IGhhdmUgYXBwbHkgc28gd2UgbG9nIGF0IGxlYXN0IGZpcnN0IDIgYXJncworICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFyZzEsIGFyZzIpIHsKKyAgICAgICAgbG9nRm4oYXJnMSwgYXJnMiA9PSBudWxsID8gJycgOiBhcmcyKTsKKyAgICAgIH07CisgICAgfQorICB9XTsKK30KKwordmFyICRwYXJzZU1pbkVyciA9IG1pbkVycignJHBhcnNlJyk7CisKKy8vIFNhbmRib3hpbmcgQW5ndWxhciBFeHByZXNzaW9ucworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbmd1bGFyIGV4cHJlc3Npb25zIGFyZSBnZW5lcmFsbHkgY29uc2lkZXJlZCBzYWZlIGJlY2F1c2UgdGhlc2UgZXhwcmVzc2lvbnMgb25seSBoYXZlIGRpcmVjdAorLy8gYWNjZXNzIHRvIGAkc2NvcGVgIGFuZCBsb2NhbHMuIEhvd2V2ZXIsIG9uZSBjYW4gb2J0YWluIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IEpTIGNvZGUgYnkKKy8vIG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byBuYXRpdmUgSlMgZnVuY3Rpb25zIHN1Y2ggYXMgdGhlIEZ1bmN0aW9uIGNvbnN0cnVjdG9yLgorLy8KKy8vIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgQW5ndWxhciBleHByZXNzaW9uOgorLy8KKy8vICAge30udG9TdHJpbmcuY29uc3RydWN0b3IoJ2FsZXJ0KCJldmlsIEpTIGNvZGUiKScpCisvLworLy8gVGhpcyBzYW5kYm94aW5nIHRlY2huaXF1ZSBpcyBub3QgcGVyZmVjdCBhbmQgZG9lc24ndCBhaW0gdG8gYmUuIFRoZSBnb2FsIGlzIHRvIHByZXZlbnQgZXhwbG9pdHMKKy8vIGFnYWluc3QgdGhlIGV4cHJlc3Npb24gbGFuZ3VhZ2UsIGJ1dCBub3QgdG8gcHJldmVudCBleHBsb2l0cyB0aGF0IHdlcmUgZW5hYmxlZCBieSBleHBvc2luZworLy8gc2Vuc2l0aXZlIEphdmFTY3JpcHQgb3IgYnJvd3NlciBBUElzIG9uIFNjb3BlLiBFeHBvc2luZyBzdWNoIG9iamVjdHMgb24gYSBTY29wZSBpcyBuZXZlciBhIGdvb2QKKy8vIHByYWN0aWNlIGFuZCB0aGVyZWZvcmUgd2UgYXJlIG5vdCBldmVuIHRyeWluZyB0byBwcm90ZWN0IGFnYWluc3QgaW50ZXJhY3Rpb24gd2l0aCBhbiBvYmplY3QKKy8vIGV4cGxpY2l0bHkgZXhwb3NlZCBpbiB0aGlzIHdheS4KKy8vCisvLyBJbiBnZW5lcmFsLCBpdCBpcyBub3QgcG9zc2libGUgdG8gYWNjZXNzIGEgV2luZG93IG9iamVjdCBmcm9tIGFuIGFuZ3VsYXIgZXhwcmVzc2lvbiB1bmxlc3MgYQorLy8gd2luZG93IG9yIHNvbWUgRE9NIG9iamVjdCB0aGF0IGhhcyBhIHJlZmVyZW5jZSB0byB3aW5kb3cgaXMgcHVibGlzaGVkIG9udG8gYSBTY29wZS4KKy8vIFNpbWlsYXJseSB3ZSBwcmV2ZW50IGludm9jYXRpb25zIG9mIGZ1bmN0aW9uIGtub3duIHRvIGJlIGRhbmdlcm91cywgYXMgd2VsbCBhcyBhc3NpZ25tZW50cyB0bworLy8gbmF0aXZlIG9iamVjdHMuCisvLworLy8gU2VlIGh0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2d1aWRlL3NlY3VyaXR5CisKKworZnVuY3Rpb24gZW5zdXJlU2FmZU1lbWJlck5hbWUobmFtZSwgZnVsbEV4cHJlc3Npb24pIHsKKyAgaWYgKG5hbWUgPT09ICJfX2RlZmluZUdldHRlcl9fIiB8fCBuYW1lID09PSAiX19kZWZpbmVTZXR0ZXJfXyIKKyAgICAgIHx8IG5hbWUgPT09ICJfX2xvb2t1cEdldHRlcl9fIiB8fCBuYW1lID09PSAiX19sb29rdXBTZXR0ZXJfXyIKKyAgICAgIHx8IG5hbWUgPT09ICJfX3Byb3RvX18iKSB7CisgICAgdGhyb3cgJHBhcnNlTWluRXJyKCdpc2VjZmxkJywKKyAgICAgICAgJ0F0dGVtcHRpbmcgdG8gYWNjZXNzIGEgZGlzYWxsb3dlZCBmaWVsZCBpbiBBbmd1bGFyIGV4cHJlc3Npb25zISAnCisgICAgICAgICsgJ0V4cHJlc3Npb246IHswfScsIGZ1bGxFeHByZXNzaW9uKTsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworZnVuY3Rpb24gZW5zdXJlU2FmZU9iamVjdChvYmosIGZ1bGxFeHByZXNzaW9uKSB7CisgIC8vIG5pZnR5IGNoZWNrIGlmIG9iaiBpcyBGdW5jdGlvbiB0aGF0IGlzIGZhc3QgYW5kIHdvcmtzIGFjcm9zcyBpZnJhbWVzIGFuZCBvdGhlciBjb250ZXh0cworICBpZiAob2JqKSB7CisgICAgaWYgKG9iai5jb25zdHJ1Y3RvciA9PT0gb2JqKSB7CisgICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2lzZWNmbicsCisgICAgICAgICAgJ1JlZmVyZW5jaW5nIEZ1bmN0aW9uIGluIEFuZ3VsYXIgZXhwcmVzc2lvbnMgaXMgZGlzYWxsb3dlZCEgRXhwcmVzc2lvbjogezB9JywKKyAgICAgICAgICBmdWxsRXhwcmVzc2lvbik7CisgICAgfSBlbHNlIGlmICgvLyBpc1dpbmRvdyhvYmopCisgICAgICAgIG9iai53aW5kb3cgPT09IG9iaikgeworICAgICAgdGhyb3cgJHBhcnNlTWluRXJyKCdpc2Vjd2luZG93JywKKyAgICAgICAgICAnUmVmZXJlbmNpbmcgdGhlIFdpbmRvdyBpbiBBbmd1bGFyIGV4cHJlc3Npb25zIGlzIGRpc2FsbG93ZWQhIEV4cHJlc3Npb246IHswfScsCisgICAgICAgICAgZnVsbEV4cHJlc3Npb24pOworICAgIH0gZWxzZSBpZiAoLy8gaXNFbGVtZW50KG9iaikKKyAgICAgICAgb2JqLmNoaWxkcmVuICYmIChvYmoubm9kZU5hbWUgfHwgKG9iai5wcm9wICYmIG9iai5hdHRyICYmIG9iai5maW5kKSkpIHsKKyAgICAgIHRocm93ICRwYXJzZU1pbkVycignaXNlY2RvbScsCisgICAgICAgICAgJ1JlZmVyZW5jaW5nIERPTSBub2RlcyBpbiBBbmd1bGFyIGV4cHJlc3Npb25zIGlzIGRpc2FsbG93ZWQhIEV4cHJlc3Npb246IHswfScsCisgICAgICAgICAgZnVsbEV4cHJlc3Npb24pOworICAgIH0gZWxzZSBpZiAoLy8gYmxvY2sgT2JqZWN0IHNvIHRoYXQgd2UgY2FuJ3QgZ2V0IGhvbGQgb2YgZGFuZ2Vyb3VzIE9iamVjdC4qIG1ldGhvZHMKKyAgICAgICAgb2JqID09PSBPYmplY3QpIHsKKyAgICAgIHRocm93ICRwYXJzZU1pbkVycignaXNlY29iaicsCisgICAgICAgICAgJ1JlZmVyZW5jaW5nIE9iamVjdCBpbiBBbmd1bGFyIGV4cHJlc3Npb25zIGlzIGRpc2FsbG93ZWQhIEV4cHJlc3Npb246IHswfScsCisgICAgICAgICAgZnVsbEV4cHJlc3Npb24pOworICAgIH0KKyAgfQorICByZXR1cm4gb2JqOworfQorCit2YXIgQ0FMTCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsOwordmFyIEFQUExZID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5OwordmFyIEJJTkQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDsKKworZnVuY3Rpb24gZW5zdXJlU2FmZUZ1bmN0aW9uKG9iaiwgZnVsbEV4cHJlc3Npb24pIHsKKyAgaWYgKG9iaikgeworICAgIGlmIChvYmouY29uc3RydWN0b3IgPT09IG9iaikgeworICAgICAgdGhyb3cgJHBhcnNlTWluRXJyKCdpc2VjZm4nLAorICAgICAgICAnUmVmZXJlbmNpbmcgRnVuY3Rpb24gaW4gQW5ndWxhciBleHByZXNzaW9ucyBpcyBkaXNhbGxvd2VkISBFeHByZXNzaW9uOiB7MH0nLAorICAgICAgICBmdWxsRXhwcmVzc2lvbik7CisgICAgfSBlbHNlIGlmIChvYmogPT09IENBTEwgfHwgb2JqID09PSBBUFBMWSB8fCBvYmogPT09IEJJTkQpIHsKKyAgICAgIHRocm93ICRwYXJzZU1pbkVycignaXNlY2ZmJywKKyAgICAgICAgJ1JlZmVyZW5jaW5nIGNhbGwsIGFwcGx5IG9yIGJpbmQgaW4gQW5ndWxhciBleHByZXNzaW9ucyBpcyBkaXNhbGxvd2VkISBFeHByZXNzaW9uOiB7MH0nLAorICAgICAgICBmdWxsRXhwcmVzc2lvbik7CisgICAgfQorICB9Cit9CisKKy8vS2V5d29yZCBjb25zdGFudHMKK3ZhciBDT05TVEFOVFMgPSBjcmVhdGVNYXAoKTsKK2ZvckVhY2goeworICAnbnVsbCc6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbDsgfSwKKyAgJ3RydWUnOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0sCisgICdmYWxzZSc6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH0sCisgICd1bmRlZmluZWQnOiBmdW5jdGlvbigpIHt9Cit9LCBmdW5jdGlvbihjb25zdGFudEdldHRlciwgbmFtZSkgeworICBjb25zdGFudEdldHRlci5jb25zdGFudCA9IGNvbnN0YW50R2V0dGVyLmxpdGVyYWwgPSBjb25zdGFudEdldHRlci5zaGFyZWRHZXR0ZXIgPSB0cnVlOworICBDT05TVEFOVFNbbmFtZV0gPSBjb25zdGFudEdldHRlcjsKK30pOworCisvL05vdCBxdWl0ZSBhIGNvbnN0YW50LCBidXQgY2FuIGJlIGxleC9wYXJzZWQgdGhlIHNhbWUKK0NPTlNUQU5UU1sndGhpcyddID0gZnVuY3Rpb24oc2VsZikgeyByZXR1cm4gc2VsZjsgfTsKK0NPTlNUQU5UU1sndGhpcyddLnNoYXJlZEdldHRlciA9IHRydWU7CisKKworLy9PcGVyYXRvcnMgLSB3aWxsIGJlIHdyYXBwZWQgYnkgYmluYXJ5Rm4vdW5hcnlGbi9hc3NpZ25tZW50L2ZpbHRlcgordmFyIE9QRVJBVE9SUyA9IGV4dGVuZChjcmVhdGVNYXAoKSwgeworICAgICcrJzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHsKKyAgICAgIGE9YShzZWxmLCBsb2NhbHMpOyBiPWIoc2VsZiwgbG9jYWxzKTsKKyAgICAgIGlmIChpc0RlZmluZWQoYSkpIHsKKyAgICAgICAgaWYgKGlzRGVmaW5lZChiKSkgeworICAgICAgICAgIHJldHVybiBhICsgYjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpc0RlZmluZWQoYikgPyBiIDogdW5kZWZpbmVkO30sCisgICAgJy0nOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikgeworICAgICAgICAgIGE9YShzZWxmLCBsb2NhbHMpOyBiPWIoc2VsZiwgbG9jYWxzKTsKKyAgICAgICAgICByZXR1cm4gKGlzRGVmaW5lZChhKSA/IGEgOiAwKSAtIChpc0RlZmluZWQoYikgPyBiIDogMCk7CisgICAgICAgIH0sCisgICAgJyonOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikge3JldHVybiBhKHNlbGYsIGxvY2FscykgKiBiKHNlbGYsIGxvY2Fscyk7fSwKKyAgICAnLyc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSAvIGIoc2VsZiwgbG9jYWxzKTt9LAorICAgICclJzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpICUgYihzZWxmLCBsb2NhbHMpO30sCisgICAgJz09PSc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSA9PT0gYihzZWxmLCBsb2NhbHMpO30sCisgICAgJyE9PSc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSAhPT0gYihzZWxmLCBsb2NhbHMpO30sCisgICAgJz09JzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpID09IGIoc2VsZiwgbG9jYWxzKTt9LAorICAgICchPSc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSAhPSBiKHNlbGYsIGxvY2Fscyk7fSwKKyAgICAnPCc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSA8IGIoc2VsZiwgbG9jYWxzKTt9LAorICAgICc+JzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpID4gYihzZWxmLCBsb2NhbHMpO30sCisgICAgJzw9JzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpIDw9IGIoc2VsZiwgbG9jYWxzKTt9LAorICAgICc+PSc6ZnVuY3Rpb24oc2VsZiwgbG9jYWxzLCBhLCBiKSB7cmV0dXJuIGEoc2VsZiwgbG9jYWxzKSA+PSBiKHNlbGYsIGxvY2Fscyk7fSwKKyAgICAnJiYnOmZ1bmN0aW9uKHNlbGYsIGxvY2FscywgYSwgYikge3JldHVybiBhKHNlbGYsIGxvY2FscykgJiYgYihzZWxmLCBsb2NhbHMpO30sCisgICAgJ3x8JzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEsIGIpIHtyZXR1cm4gYShzZWxmLCBsb2NhbHMpIHx8IGIoc2VsZiwgbG9jYWxzKTt9LAorICAgICchJzpmdW5jdGlvbihzZWxmLCBsb2NhbHMsIGEpIHtyZXR1cm4gIWEoc2VsZiwgbG9jYWxzKTt9LAorCisgICAgLy9Ub2tlbml6ZWQgYXMgb3BlcmF0b3JzIGJ1dCBwYXJzZWQgYXMgYXNzaWdubWVudC9maWx0ZXJzCisgICAgJz0nOnRydWUsCisgICAgJ3wnOnRydWUKK30pOwordmFyIEVTQ0FQRSA9IHsibiI6IlxuIiwgImYiOiJcZiIsICJyIjoiXHIiLCAidCI6Ilx0IiwgInYiOiJcdiIsICInIjoiJyIsICciJzonIid9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworLyoqCisgKiBAY29uc3RydWN0b3IKKyAqLwordmFyIExleGVyID0gZnVuY3Rpb24ob3B0aW9ucykgeworICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworfTsKKworTGV4ZXIucHJvdG90eXBlID0geworICBjb25zdHJ1Y3RvcjogTGV4ZXIsCisKKyAgbGV4OiBmdW5jdGlvbih0ZXh0KSB7CisgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICB0aGlzLmluZGV4ID0gMDsKKyAgICB0aGlzLnRva2VucyA9IFtdOworCisgICAgd2hpbGUgKHRoaXMuaW5kZXggPCB0aGlzLnRleHQubGVuZ3RoKSB7CisgICAgICB2YXIgY2ggPSB0aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpOworICAgICAgaWYgKGNoID09PSAnIicgfHwgY2ggPT09ICInIikgeworICAgICAgICB0aGlzLnJlYWRTdHJpbmcoY2gpOworICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTnVtYmVyKGNoKSB8fCBjaCA9PT0gJy4nICYmIHRoaXMuaXNOdW1iZXIodGhpcy5wZWVrKCkpKSB7CisgICAgICAgIHRoaXMucmVhZE51bWJlcigpOworICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSWRlbnQoY2gpKSB7CisgICAgICAgIHRoaXMucmVhZElkZW50KCk7CisgICAgICB9IGVsc2UgaWYgKHRoaXMuaXMoY2gsICcoKXt9W10uLDs6PycpKSB7CisgICAgICAgIHRoaXMudG9rZW5zLnB1c2goe2luZGV4OiB0aGlzLmluZGV4LCB0ZXh0OiBjaH0pOworICAgICAgICB0aGlzLmluZGV4Kys7CisgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICB0aGlzLmluZGV4Kys7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgY2gyID0gY2ggKyB0aGlzLnBlZWsoKTsKKyAgICAgICAgdmFyIGNoMyA9IGNoMiArIHRoaXMucGVlaygyKTsKKyAgICAgICAgdmFyIG9wMSA9IE9QRVJBVE9SU1tjaF07CisgICAgICAgIHZhciBvcDIgPSBPUEVSQVRPUlNbY2gyXTsKKyAgICAgICAgdmFyIG9wMyA9IE9QRVJBVE9SU1tjaDNdOworICAgICAgICBpZiAob3AxIHx8IG9wMiB8fCBvcDMpIHsKKyAgICAgICAgICB2YXIgdG9rZW4gPSBvcDMgPyBjaDMgOiAob3AyID8gY2gyIDogY2gpOworICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2goe2luZGV4OiB0aGlzLmluZGV4LCB0ZXh0OiB0b2tlbiwgb3BlcmF0b3I6IHRydWV9KTsKKyAgICAgICAgICB0aGlzLmluZGV4ICs9IHRva2VuLmxlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLnRocm93RXJyb3IoJ1VuZXhwZWN0ZWQgbmV4dCBjaGFyYWN0ZXIgJywgdGhpcy5pbmRleCwgdGhpcy5pbmRleCArIDEpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0aGlzLnRva2VuczsKKyAgfSwKKworICBpczogZnVuY3Rpb24oY2gsIGNoYXJzKSB7CisgICAgcmV0dXJuIGNoYXJzLmluZGV4T2YoY2gpICE9PSAtMTsKKyAgfSwKKworICBwZWVrOiBmdW5jdGlvbihpKSB7CisgICAgdmFyIG51bSA9IGkgfHwgMTsKKyAgICByZXR1cm4gKHRoaXMuaW5kZXggKyBudW0gPCB0aGlzLnRleHQubGVuZ3RoKSA/IHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCArIG51bSkgOiBmYWxzZTsKKyAgfSwKKworICBpc051bWJlcjogZnVuY3Rpb24oY2gpIHsKKyAgICByZXR1cm4gKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpICYmIHR5cGVvZiBjaCA9PT0gInN0cmluZyI7CisgIH0sCisKKyAgaXNXaGl0ZXNwYWNlOiBmdW5jdGlvbihjaCkgeworICAgIC8vIElFIHRyZWF0cyBub24tYnJlYWtpbmcgc3BhY2UgYXMgXHUwMEEwCisgICAgcmV0dXJuIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXHInIHx8IGNoID09PSAnXHQnIHx8CisgICAgICAgICAgICBjaCA9PT0gJ1xuJyB8fCBjaCA9PT0gJ1x2JyB8fCBjaCA9PT0gJ1x1MDBBMCcpOworICB9LAorCisgIGlzSWRlbnQ6IGZ1bmN0aW9uKGNoKSB7CisgICAgcmV0dXJuICgnYScgPD0gY2ggJiYgY2ggPD0gJ3onIHx8CisgICAgICAgICAgICAnQScgPD0gY2ggJiYgY2ggPD0gJ1onIHx8CisgICAgICAgICAgICAnXycgPT09IGNoIHx8IGNoID09PSAnJCcpOworICB9LAorCisgIGlzRXhwT3BlcmF0b3I6IGZ1bmN0aW9uKGNoKSB7CisgICAgcmV0dXJuIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycgfHwgdGhpcy5pc051bWJlcihjaCkpOworICB9LAorCisgIHRocm93RXJyb3I6IGZ1bmN0aW9uKGVycm9yLCBzdGFydCwgZW5kKSB7CisgICAgZW5kID0gZW5kIHx8IHRoaXMuaW5kZXg7CisgICAgdmFyIGNvbFN0ciA9IChpc0RlZmluZWQoc3RhcnQpCisgICAgICAgICAgICA/ICdzICcgKyBzdGFydCArICAnLScgKyB0aGlzLmluZGV4ICsgJyBbJyArIHRoaXMudGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCkgKyAnXScKKyAgICAgICAgICAgIDogJyAnICsgZW5kKTsKKyAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2xleGVycicsICdMZXhlciBFcnJvcjogezB9IGF0IGNvbHVtbnsxfSBpbiBleHByZXNzaW9uIFt7Mn1dLicsCisgICAgICAgIGVycm9yLCBjb2xTdHIsIHRoaXMudGV4dCk7CisgIH0sCisKKyAgcmVhZE51bWJlcjogZnVuY3Rpb24oKSB7CisgICAgdmFyIG51bWJlciA9ICcnOworICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXg7CisgICAgd2hpbGUgKHRoaXMuaW5kZXggPCB0aGlzLnRleHQubGVuZ3RoKSB7CisgICAgICB2YXIgY2ggPSBsb3dlcmNhc2UodGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4KSk7CisgICAgICBpZiAoY2ggPT0gJy4nIHx8IHRoaXMuaXNOdW1iZXIoY2gpKSB7CisgICAgICAgIG51bWJlciArPSBjaDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhciBwZWVrQ2ggPSB0aGlzLnBlZWsoKTsKKyAgICAgICAgaWYgKGNoID09ICdlJyAmJiB0aGlzLmlzRXhwT3BlcmF0b3IocGVla0NoKSkgeworICAgICAgICAgIG51bWJlciArPSBjaDsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRXhwT3BlcmF0b3IoY2gpICYmCisgICAgICAgICAgICBwZWVrQ2ggJiYgdGhpcy5pc051bWJlcihwZWVrQ2gpICYmCisgICAgICAgICAgICBudW1iZXIuY2hhckF0KG51bWJlci5sZW5ndGggLSAxKSA9PSAnZScpIHsKKyAgICAgICAgICBudW1iZXIgKz0gY2g7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0V4cE9wZXJhdG9yKGNoKSAmJgorICAgICAgICAgICAgKCFwZWVrQ2ggfHwgIXRoaXMuaXNOdW1iZXIocGVla0NoKSkgJiYKKyAgICAgICAgICAgIG51bWJlci5jaGFyQXQobnVtYmVyLmxlbmd0aCAtIDEpID09ICdlJykgeworICAgICAgICAgIHRoaXMudGhyb3dFcnJvcignSW52YWxpZCBleHBvbmVudCcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aGlzLmluZGV4Kys7CisgICAgfQorICAgIHRoaXMudG9rZW5zLnB1c2goeworICAgICAgaW5kZXg6IHN0YXJ0LAorICAgICAgdGV4dDogbnVtYmVyLAorICAgICAgY29uc3RhbnQ6IHRydWUsCisgICAgICB2YWx1ZTogTnVtYmVyKG51bWJlcikKKyAgICB9KTsKKyAgfSwKKworICByZWFkSWRlbnQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXg7CisgICAgd2hpbGUgKHRoaXMuaW5kZXggPCB0aGlzLnRleHQubGVuZ3RoKSB7CisgICAgICB2YXIgY2ggPSB0aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpOworICAgICAgaWYgKCEodGhpcy5pc0lkZW50KGNoKSB8fCB0aGlzLmlzTnVtYmVyKGNoKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB0aGlzLmluZGV4Kys7CisgICAgfQorICAgIHRoaXMudG9rZW5zLnB1c2goeworICAgICAgaW5kZXg6IHN0YXJ0LAorICAgICAgdGV4dDogdGhpcy50ZXh0LnNsaWNlKHN0YXJ0LCB0aGlzLmluZGV4KSwKKyAgICAgIGlkZW50aWZpZXI6IHRydWUKKyAgICB9KTsKKyAgfSwKKworICByZWFkU3RyaW5nOiBmdW5jdGlvbihxdW90ZSkgeworICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXg7CisgICAgdGhpcy5pbmRleCsrOworICAgIHZhciBzdHJpbmcgPSAnJzsKKyAgICB2YXIgcmF3U3RyaW5nID0gcXVvdGU7CisgICAgdmFyIGVzY2FwZSA9IGZhbHNlOworICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50ZXh0Lmxlbmd0aCkgeworICAgICAgdmFyIGNoID0gdGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4KTsKKyAgICAgIHJhd1N0cmluZyArPSBjaDsKKyAgICAgIGlmIChlc2NhcGUpIHsKKyAgICAgICAgaWYgKGNoID09PSAndScpIHsKKyAgICAgICAgICB2YXIgaGV4ID0gdGhpcy50ZXh0LnN1YnN0cmluZyh0aGlzLmluZGV4ICsgMSwgdGhpcy5pbmRleCArIDUpOworICAgICAgICAgIGlmICghaGV4Lm1hdGNoKC9bXGRhLWZdezR9L2kpKQorICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKCdJbnZhbGlkIHVuaWNvZGUgZXNjYXBlIFtcXHUnICsgaGV4ICsgJ10nKTsKKyAgICAgICAgICB0aGlzLmluZGV4ICs9IDQ7CisgICAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaGV4LCAxNikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZhciByZXAgPSBFU0NBUEVbY2hdOworICAgICAgICAgIHN0cmluZyA9IHN0cmluZyArIChyZXAgfHwgY2gpOworICAgICAgICB9CisgICAgICAgIGVzY2FwZSA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgeworICAgICAgICBlc2NhcGUgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChjaCA9PT0gcXVvdGUpIHsKKyAgICAgICAgdGhpcy5pbmRleCsrOworICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHsKKyAgICAgICAgICBpbmRleDogc3RhcnQsCisgICAgICAgICAgdGV4dDogcmF3U3RyaW5nLAorICAgICAgICAgIGNvbnN0YW50OiB0cnVlLAorICAgICAgICAgIHZhbHVlOiBzdHJpbmcKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgIH0KKyAgICAgIHRoaXMuaW5kZXgrKzsKKyAgICB9CisgICAgdGhpcy50aHJvd0Vycm9yKCdVbnRlcm1pbmF0ZWQgcXVvdGUnLCBzdGFydCk7CisgIH0KK307CisKKworZnVuY3Rpb24gaXNDb25zdGFudChleHApIHsKKyAgcmV0dXJuIGV4cC5jb25zdGFudDsKK30KKworLyoqCisgKiBAY29uc3RydWN0b3IKKyAqLwordmFyIFBhcnNlciA9IGZ1bmN0aW9uKGxleGVyLCAkZmlsdGVyLCBvcHRpb25zKSB7CisgIHRoaXMubGV4ZXIgPSBsZXhlcjsKKyAgdGhpcy4kZmlsdGVyID0gJGZpbHRlcjsKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKK307CisKK1BhcnNlci5aRVJPID0gZXh0ZW5kKGZ1bmN0aW9uKCkgeworICByZXR1cm4gMDsKK30sIHsKKyAgc2hhcmVkR2V0dGVyOiB0cnVlLAorICBjb25zdGFudDogdHJ1ZQorfSk7CisKK1BhcnNlci5wcm90b3R5cGUgPSB7CisgIGNvbnN0cnVjdG9yOiBQYXJzZXIsCisKKyAgcGFyc2U6IGZ1bmN0aW9uKHRleHQpIHsKKyAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgIHRoaXMudG9rZW5zID0gdGhpcy5sZXhlci5sZXgodGV4dCk7CisKKyAgICB2YXIgdmFsdWUgPSB0aGlzLnN0YXRlbWVudHMoKTsKKworICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggIT09IDApIHsKKyAgICAgIHRoaXMudGhyb3dFcnJvcignaXMgYW4gdW5leHBlY3RlZCB0b2tlbicsIHRoaXMudG9rZW5zWzBdKTsKKyAgICB9CisKKyAgICB2YWx1ZS5saXRlcmFsID0gISF2YWx1ZS5saXRlcmFsOworICAgIHZhbHVlLmNvbnN0YW50ID0gISF2YWx1ZS5jb25zdGFudDsKKworICAgIHJldHVybiB2YWx1ZTsKKyAgfSwKKworICBwcmltYXJ5OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcHJpbWFyeTsKKyAgICBpZiAodGhpcy5leHBlY3QoJygnKSkgeworICAgICAgcHJpbWFyeSA9IHRoaXMuZmlsdGVyQ2hhaW4oKTsKKyAgICAgIHRoaXMuY29uc3VtZSgnKScpOworICAgIH0gZWxzZSBpZiAodGhpcy5leHBlY3QoJ1snKSkgeworICAgICAgcHJpbWFyeSA9IHRoaXMuYXJyYXlEZWNsYXJhdGlvbigpOworICAgIH0gZWxzZSBpZiAodGhpcy5leHBlY3QoJ3snKSkgeworICAgICAgcHJpbWFyeSA9IHRoaXMub2JqZWN0KCk7CisgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoKS5pZGVudGlmaWVyICYmIHRoaXMucGVlaygpLnRleHQgaW4gQ09OU1RBTlRTKSB7CisgICAgICBwcmltYXJ5ID0gQ09OU1RBTlRTW3RoaXMuY29uc3VtZSgpLnRleHRdOworICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrKCkuaWRlbnRpZmllcikgeworICAgICAgcHJpbWFyeSA9IHRoaXMuaWRlbnRpZmllcigpOworICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrKCkuY29uc3RhbnQpIHsKKyAgICAgIHByaW1hcnkgPSB0aGlzLmNvbnN0YW50KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMudGhyb3dFcnJvcignbm90IGEgcHJpbWFyeSBleHByZXNzaW9uJywgdGhpcy5wZWVrKCkpOworICAgIH0KKworICAgIHZhciBuZXh0LCBjb250ZXh0OworICAgIHdoaWxlICgobmV4dCA9IHRoaXMuZXhwZWN0KCcoJywgJ1snLCAnLicpKSkgeworICAgICAgaWYgKG5leHQudGV4dCA9PT0gJygnKSB7CisgICAgICAgIHByaW1hcnkgPSB0aGlzLmZ1bmN0aW9uQ2FsbChwcmltYXJ5LCBjb250ZXh0KTsKKyAgICAgICAgY29udGV4dCA9IG51bGw7CisgICAgICB9IGVsc2UgaWYgKG5leHQudGV4dCA9PT0gJ1snKSB7CisgICAgICAgIGNvbnRleHQgPSBwcmltYXJ5OworICAgICAgICBwcmltYXJ5ID0gdGhpcy5vYmplY3RJbmRleChwcmltYXJ5KTsKKyAgICAgIH0gZWxzZSBpZiAobmV4dC50ZXh0ID09PSAnLicpIHsKKyAgICAgICAgY29udGV4dCA9IHByaW1hcnk7CisgICAgICAgIHByaW1hcnkgPSB0aGlzLmZpZWxkQWNjZXNzKHByaW1hcnkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy50aHJvd0Vycm9yKCdJTVBPU1NJQkxFJyk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBwcmltYXJ5OworICB9LAorCisgIHRocm93RXJyb3I6IGZ1bmN0aW9uKG1zZywgdG9rZW4pIHsKKyAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ3N5bnRheCcsCisgICAgICAgICdTeW50YXggRXJyb3I6IFRva2VuIFwnezB9XCcgezF9IGF0IGNvbHVtbiB7Mn0gb2YgdGhlIGV4cHJlc3Npb24gW3szfV0gc3RhcnRpbmcgYXQgW3s0fV0uJywKKyAgICAgICAgICB0b2tlbi50ZXh0LCBtc2csICh0b2tlbi5pbmRleCArIDEpLCB0aGlzLnRleHQsIHRoaXMudGV4dC5zdWJzdHJpbmcodG9rZW4uaW5kZXgpKTsKKyAgfSwKKworICBwZWVrVG9rZW46IGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggPT09IDApCisgICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ3Vlb2UnLCAnVW5leHBlY3RlZCBlbmQgb2YgZXhwcmVzc2lvbjogezB9JywgdGhpcy50ZXh0KTsKKyAgICByZXR1cm4gdGhpcy50b2tlbnNbMF07CisgIH0sCisKKyAgcGVlazogZnVuY3Rpb24oZTEsIGUyLCBlMywgZTQpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVrQWhlYWQoMCwgZTEsIGUyLCBlMywgZTQpOworICB9LAorICBwZWVrQWhlYWQ6IGZ1bmN0aW9uKGksIGUxLCBlMiwgZTMsIGU0KSB7CisgICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCA+IGkpIHsKKyAgICAgIHZhciB0b2tlbiA9IHRoaXMudG9rZW5zW2ldOworICAgICAgdmFyIHQgPSB0b2tlbi50ZXh0OworICAgICAgaWYgKHQgPT09IGUxIHx8IHQgPT09IGUyIHx8IHQgPT09IGUzIHx8IHQgPT09IGU0IHx8CisgICAgICAgICAgKCFlMSAmJiAhZTIgJiYgIWUzICYmICFlNCkpIHsKKyAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0sCisKKyAgZXhwZWN0OiBmdW5jdGlvbihlMSwgZTIsIGUzLCBlNCkgeworICAgIHZhciB0b2tlbiA9IHRoaXMucGVlayhlMSwgZTIsIGUzLCBlNCk7CisgICAgaWYgKHRva2VuKSB7CisgICAgICB0aGlzLnRva2Vucy5zaGlmdCgpOworICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0sCisKKyAgY29uc3VtZTogZnVuY3Rpb24oZTEpIHsKKyAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID09PSAwKSB7CisgICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ3Vlb2UnLCAnVW5leHBlY3RlZCBlbmQgb2YgZXhwcmVzc2lvbjogezB9JywgdGhpcy50ZXh0KTsKKyAgICB9CisKKyAgICB2YXIgdG9rZW4gPSB0aGlzLmV4cGVjdChlMSk7CisgICAgaWYgKCF0b2tlbikgeworICAgICAgdGhpcy50aHJvd0Vycm9yKCdpcyB1bmV4cGVjdGVkLCBleHBlY3RpbmcgWycgKyBlMSArICddJywgdGhpcy5wZWVrKCkpOworICAgIH0KKyAgICByZXR1cm4gdG9rZW47CisgIH0sCisKKyAgdW5hcnlGbjogZnVuY3Rpb24ob3AsIHJpZ2h0KSB7CisgICAgdmFyIGZuID0gT1BFUkFUT1JTW29wXTsKKyAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRwYXJzZVVuYXJ5Rm4oc2VsZiwgbG9jYWxzKSB7CisgICAgICByZXR1cm4gZm4oc2VsZiwgbG9jYWxzLCByaWdodCk7CisgICAgfSwgeworICAgICAgY29uc3RhbnQ6cmlnaHQuY29uc3RhbnQsCisgICAgICBpbnB1dHM6IFtyaWdodF0KKyAgICB9KTsKKyAgfSwKKworICBiaW5hcnlGbjogZnVuY3Rpb24obGVmdCwgb3AsIHJpZ2h0LCBpc0JyYW5jaGluZykgeworICAgIHZhciBmbiA9IE9QRVJBVE9SU1tvcF07CisgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAkcGFyc2VCaW5hcnlGbihzZWxmLCBsb2NhbHMpIHsKKyAgICAgIHJldHVybiBmbihzZWxmLCBsb2NhbHMsIGxlZnQsIHJpZ2h0KTsKKyAgICB9LCB7CisgICAgICBjb25zdGFudDogbGVmdC5jb25zdGFudCAmJiByaWdodC5jb25zdGFudCwKKyAgICAgIGlucHV0czogIWlzQnJhbmNoaW5nICYmIFtsZWZ0LCByaWdodF0KKyAgICB9KTsKKyAgfSwKKworICBpZGVudGlmaWVyOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgaWQgPSB0aGlzLmNvbnN1bWUoKS50ZXh0OworCisgICAgLy9Db250aW51ZSByZWFkaW5nIGVhY2ggYC5pZGVudGlmaWVyYCB1bmxlc3MgaXQgaXMgYSBtZXRob2QgaW52b2NhdGlvbgorICAgIHdoaWxlICh0aGlzLnBlZWsoJy4nKSAmJiB0aGlzLnBlZWtBaGVhZCgxKS5pZGVudGlmaWVyICYmICF0aGlzLnBlZWtBaGVhZCgyLCAnKCcpKSB7CisgICAgICBpZCArPSB0aGlzLmNvbnN1bWUoKS50ZXh0ICsgdGhpcy5jb25zdW1lKCkudGV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gZ2V0dGVyRm4oaWQsIHRoaXMub3B0aW9ucywgdGhpcy50ZXh0KTsKKyAgfSwKKworICBjb25zdGFudDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHZhbHVlID0gdGhpcy5jb25zdW1lKCkudmFsdWU7CisKKyAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRwYXJzZUNvbnN0YW50KCkgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0sIHsKKyAgICAgIGNvbnN0YW50OiB0cnVlLAorICAgICAgbGl0ZXJhbDogdHJ1ZQorICAgIH0pOworICB9LAorCisgIHN0YXRlbWVudHM6IGZ1bmN0aW9uKCkgeworICAgIHZhciBzdGF0ZW1lbnRzID0gW107CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggPiAwICYmICF0aGlzLnBlZWsoJ30nLCAnKScsICc7JywgJ10nKSkKKyAgICAgICAgc3RhdGVtZW50cy5wdXNoKHRoaXMuZmlsdGVyQ2hhaW4oKSk7CisgICAgICBpZiAoIXRoaXMuZXhwZWN0KCc7JykpIHsKKyAgICAgICAgLy8gb3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSB0aGVyZSBpcyBvbmx5IG9uZSBzdGF0ZW1lbnQuCisgICAgICAgIC8vIFRPRE8oc2l6ZSk6IG1heWJlIHdlIHNob3VsZCBub3Qgc3VwcG9ydCBtdWx0aXBsZSBzdGF0ZW1lbnRzPworICAgICAgICByZXR1cm4gKHN0YXRlbWVudHMubGVuZ3RoID09PSAxKQorICAgICAgICAgICAgPyBzdGF0ZW1lbnRzWzBdCisgICAgICAgICAgICA6IGZ1bmN0aW9uICRwYXJzZVN0YXRlbWVudHMoc2VsZiwgbG9jYWxzKSB7CisgICAgICAgICAgICAgICAgdmFyIHZhbHVlOworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHN0YXRlbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdGF0ZW1lbnRzW2ldKHNlbGYsIGxvY2Fscyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgZmlsdGVyQ2hhaW46IGZ1bmN0aW9uKCkgeworICAgIHZhciBsZWZ0ID0gdGhpcy5leHByZXNzaW9uKCk7CisgICAgdmFyIHRva2VuOworICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnfCcpKSkgeworICAgICAgbGVmdCA9IHRoaXMuZmlsdGVyKGxlZnQpOworICAgIH0KKyAgICByZXR1cm4gbGVmdDsKKyAgfSwKKworICBmaWx0ZXI6IGZ1bmN0aW9uKGlucHV0Rm4pIHsKKyAgICB2YXIgZm4gPSB0aGlzLiRmaWx0ZXIodGhpcy5jb25zdW1lKCkudGV4dCk7CisgICAgdmFyIGFyZ3NGbjsKKyAgICB2YXIgYXJnczsKKworICAgIGlmICh0aGlzLnBlZWsoJzonKSkgeworICAgICAgYXJnc0ZuID0gW107CisgICAgICBhcmdzID0gW107IC8vIHdlIGNhbiBzYWZlbHkgcmV1c2UgdGhlIGFycmF5CisgICAgICB3aGlsZSAodGhpcy5leHBlY3QoJzonKSkgeworICAgICAgICBhcmdzRm4ucHVzaCh0aGlzLmV4cHJlc3Npb24oKSk7CisgICAgICB9CisgICAgfQorCisgICAgdmFyIGlucHV0cyA9IFtpbnB1dEZuXS5jb25jYXQoYXJnc0ZuIHx8IFtdKTsKKworICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gJHBhcnNlRmlsdGVyKHNlbGYsIGxvY2FscykgeworICAgICAgdmFyIGlucHV0ID0gaW5wdXRGbihzZWxmLCBsb2NhbHMpOworICAgICAgaWYgKGFyZ3MpIHsKKyAgICAgICAgYXJnc1swXSA9IGlucHV0OworCisgICAgICAgIHZhciBpID0gYXJnc0ZuLmxlbmd0aDsKKyAgICAgICAgd2hpbGUgKGktLSkgeworICAgICAgICAgIGFyZ3NbaSArIDFdID0gYXJnc0ZuW2ldKHNlbGYsIGxvY2Fscyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZm4uYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZuKGlucHV0KTsKKyAgICB9LCB7CisgICAgICBjb25zdGFudDogIWZuLiRzdGF0ZWZ1bCAmJiBpbnB1dHMuZXZlcnkoaXNDb25zdGFudCksCisgICAgICBpbnB1dHM6ICFmbi4kc3RhdGVmdWwgJiYgaW5wdXRzCisgICAgfSk7CisgIH0sCisKKyAgZXhwcmVzc2lvbjogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuYXNzaWdubWVudCgpOworICB9LAorCisgIGFzc2lnbm1lbnQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciBsZWZ0ID0gdGhpcy50ZXJuYXJ5KCk7CisgICAgdmFyIHJpZ2h0OworICAgIHZhciB0b2tlbjsKKyAgICBpZiAoKHRva2VuID0gdGhpcy5leHBlY3QoJz0nKSkpIHsKKyAgICAgIGlmICghbGVmdC5hc3NpZ24pIHsKKyAgICAgICAgdGhpcy50aHJvd0Vycm9yKCdpbXBsaWVzIGFzc2lnbm1lbnQgYnV0IFsnICsKKyAgICAgICAgICAgIHRoaXMudGV4dC5zdWJzdHJpbmcoMCwgdG9rZW4uaW5kZXgpICsgJ10gY2FuIG5vdCBiZSBhc3NpZ25lZCB0bycsIHRva2VuKTsKKyAgICAgIH0KKyAgICAgIHJpZ2h0ID0gdGhpcy50ZXJuYXJ5KCk7CisgICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRwYXJzZUFzc2lnbm1lbnQoc2NvcGUsIGxvY2FscykgeworICAgICAgICByZXR1cm4gbGVmdC5hc3NpZ24oc2NvcGUsIHJpZ2h0KHNjb3BlLCBsb2NhbHMpLCBsb2NhbHMpOworICAgICAgfSwgeworICAgICAgICBpbnB1dHM6IFtsZWZ0LCByaWdodF0KKyAgICAgIH0pOworICAgIH0KKyAgICByZXR1cm4gbGVmdDsKKyAgfSwKKworICB0ZXJuYXJ5OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgbGVmdCA9IHRoaXMubG9naWNhbE9SKCk7CisgICAgdmFyIG1pZGRsZTsKKyAgICB2YXIgdG9rZW47CisgICAgaWYgKCh0b2tlbiA9IHRoaXMuZXhwZWN0KCc/JykpKSB7CisgICAgICBtaWRkbGUgPSB0aGlzLmFzc2lnbm1lbnQoKTsKKyAgICAgIGlmICh0aGlzLmNvbnN1bWUoJzonKSkgeworICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLmFzc2lnbm1lbnQoKTsKKworICAgICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICRwYXJzZVRlcm5hcnkoc2VsZiwgbG9jYWxzKSB7CisgICAgICAgICAgcmV0dXJuIGxlZnQoc2VsZiwgbG9jYWxzKSA/IG1pZGRsZShzZWxmLCBsb2NhbHMpIDogcmlnaHQoc2VsZiwgbG9jYWxzKTsKKyAgICAgICAgfSwgeworICAgICAgICAgIGNvbnN0YW50OiBsZWZ0LmNvbnN0YW50ICYmIG1pZGRsZS5jb25zdGFudCAmJiByaWdodC5jb25zdGFudAorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbGVmdDsKKyAgfSwKKworICBsb2dpY2FsT1I6IGZ1bmN0aW9uKCkgeworICAgIHZhciBsZWZ0ID0gdGhpcy5sb2dpY2FsQU5EKCk7CisgICAgdmFyIHRva2VuOworICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnfHwnKSkpIHsKKyAgICAgIGxlZnQgPSB0aGlzLmJpbmFyeUZuKGxlZnQsIHRva2VuLnRleHQsIHRoaXMubG9naWNhbEFORCgpLCB0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIGxlZnQ7CisgIH0sCisKKyAgbG9naWNhbEFORDogZnVuY3Rpb24oKSB7CisgICAgdmFyIGxlZnQgPSB0aGlzLmVxdWFsaXR5KCk7CisgICAgdmFyIHRva2VuOworICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnJiYnKSkpIHsKKyAgICAgIGxlZnQgPSB0aGlzLmJpbmFyeUZuKGxlZnQsIHRva2VuLnRleHQsIHRoaXMuZXF1YWxpdHkoKSwgdHJ1ZSk7CisgICAgfQorICAgIHJldHVybiBsZWZ0OworICB9LAorCisgIGVxdWFsaXR5OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgbGVmdCA9IHRoaXMucmVsYXRpb25hbCgpOworICAgIHZhciB0b2tlbjsKKyAgICB3aGlsZSAoKHRva2VuID0gdGhpcy5leHBlY3QoJz09JywnIT0nLCc9PT0nLCchPT0nKSkpIHsKKyAgICAgIGxlZnQgPSB0aGlzLmJpbmFyeUZuKGxlZnQsIHRva2VuLnRleHQsIHRoaXMucmVsYXRpb25hbCgpKTsKKyAgICB9CisgICAgcmV0dXJuIGxlZnQ7CisgIH0sCisKKyAgcmVsYXRpb25hbDogZnVuY3Rpb24oKSB7CisgICAgdmFyIGxlZnQgPSB0aGlzLmFkZGl0aXZlKCk7CisgICAgdmFyIHRva2VuOworICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnPCcsICc+JywgJzw9JywgJz49JykpKSB7CisgICAgICBsZWZ0ID0gdGhpcy5iaW5hcnlGbihsZWZ0LCB0b2tlbi50ZXh0LCB0aGlzLmFkZGl0aXZlKCkpOworICAgIH0KKyAgICByZXR1cm4gbGVmdDsKKyAgfSwKKworICBhZGRpdGl2ZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIGxlZnQgPSB0aGlzLm11bHRpcGxpY2F0aXZlKCk7CisgICAgdmFyIHRva2VuOworICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnKycsJy0nKSkpIHsKKyAgICAgIGxlZnQgPSB0aGlzLmJpbmFyeUZuKGxlZnQsIHRva2VuLnRleHQsIHRoaXMubXVsdGlwbGljYXRpdmUoKSk7CisgICAgfQorICAgIHJldHVybiBsZWZ0OworICB9LAorCisgIG11bHRpcGxpY2F0aXZlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgbGVmdCA9IHRoaXMudW5hcnkoKTsKKyAgICB2YXIgdG9rZW47CisgICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZXhwZWN0KCcqJywnLycsJyUnKSkpIHsKKyAgICAgIGxlZnQgPSB0aGlzLmJpbmFyeUZuKGxlZnQsIHRva2VuLnRleHQsIHRoaXMudW5hcnkoKSk7CisgICAgfQorICAgIHJldHVybiBsZWZ0OworICB9LAorCisgIHVuYXJ5OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgdG9rZW47CisgICAgaWYgKHRoaXMuZXhwZWN0KCcrJykpIHsKKyAgICAgIHJldHVybiB0aGlzLnByaW1hcnkoKTsKKyAgICB9IGVsc2UgaWYgKCh0b2tlbiA9IHRoaXMuZXhwZWN0KCctJykpKSB7CisgICAgICByZXR1cm4gdGhpcy5iaW5hcnlGbihQYXJzZXIuWkVSTywgdG9rZW4udGV4dCwgdGhpcy51bmFyeSgpKTsKKyAgICB9IGVsc2UgaWYgKCh0b2tlbiA9IHRoaXMuZXhwZWN0KCchJykpKSB7CisgICAgICByZXR1cm4gdGhpcy51bmFyeUZuKHRva2VuLnRleHQsIHRoaXMudW5hcnkoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0aGlzLnByaW1hcnkoKTsKKyAgICB9CisgIH0sCisKKyAgZmllbGRBY2Nlc3M6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHZhciBnZXR0ZXIgPSB0aGlzLmlkZW50aWZpZXIoKTsKKworICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gJHBhcnNlRmllbGRBY2Nlc3Moc2NvcGUsIGxvY2Fscywgc2VsZikgeworICAgICAgdmFyIG8gPSBzZWxmIHx8IG9iamVjdChzY29wZSwgbG9jYWxzKTsKKyAgICAgIHJldHVybiAobyA9PSBudWxsKSA/IHVuZGVmaW5lZCA6IGdldHRlcihvKTsKKyAgICB9LCB7CisgICAgICBhc3NpZ246IGZ1bmN0aW9uKHNjb3BlLCB2YWx1ZSwgbG9jYWxzKSB7CisgICAgICAgIHZhciBvID0gb2JqZWN0KHNjb3BlLCBsb2NhbHMpOworICAgICAgICBpZiAoIW8pIG9iamVjdC5hc3NpZ24oc2NvcGUsIG8gPSB7fSk7CisgICAgICAgIHJldHVybiBnZXR0ZXIuYXNzaWduKG8sIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSwKKworICBvYmplY3RJbmRleDogZnVuY3Rpb24ob2JqKSB7CisgICAgdmFyIGV4cHJlc3Npb24gPSB0aGlzLnRleHQ7CisKKyAgICB2YXIgaW5kZXhGbiA9IHRoaXMuZXhwcmVzc2lvbigpOworICAgIHRoaXMuY29uc3VtZSgnXScpOworCisgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAkcGFyc2VPYmplY3RJbmRleChzZWxmLCBsb2NhbHMpIHsKKyAgICAgIHZhciBvID0gb2JqKHNlbGYsIGxvY2FscyksCisgICAgICAgICAgaSA9IGluZGV4Rm4oc2VsZiwgbG9jYWxzKSwKKyAgICAgICAgICB2OworCisgICAgICBlbnN1cmVTYWZlTWVtYmVyTmFtZShpLCBleHByZXNzaW9uKTsKKyAgICAgIGlmICghbykgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIHYgPSBlbnN1cmVTYWZlT2JqZWN0KG9baV0sIGV4cHJlc3Npb24pOworICAgICAgcmV0dXJuIHY7CisgICAgfSwgeworICAgICAgYXNzaWduOiBmdW5jdGlvbihzZWxmLCB2YWx1ZSwgbG9jYWxzKSB7CisgICAgICAgIHZhciBrZXkgPSBlbnN1cmVTYWZlTWVtYmVyTmFtZShpbmRleEZuKHNlbGYsIGxvY2FscyksIGV4cHJlc3Npb24pOworICAgICAgICAvLyBwcmV2ZW50IG92ZXJ3cml0aW5nIG9mIEZ1bmN0aW9uLmNvbnN0cnVjdG9yIHdoaWNoIHdvdWxkIGJyZWFrIGVuc3VyZVNhZmVPYmplY3QgY2hlY2sKKyAgICAgICAgdmFyIG8gPSBlbnN1cmVTYWZlT2JqZWN0KG9iaihzZWxmLCBsb2NhbHMpLCBleHByZXNzaW9uKTsKKyAgICAgICAgaWYgKCFvKSBvYmouYXNzaWduKHNlbGYsIG8gPSB7fSk7CisgICAgICAgIHJldHVybiBvW2tleV0gPSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSwKKworICBmdW5jdGlvbkNhbGw6IGZ1bmN0aW9uKGZuR2V0dGVyLCBjb250ZXh0R2V0dGVyKSB7CisgICAgdmFyIGFyZ3NGbiA9IFtdOworICAgIGlmICh0aGlzLnBlZWtUb2tlbigpLnRleHQgIT09ICcpJykgeworICAgICAgZG8geworICAgICAgICBhcmdzRm4ucHVzaCh0aGlzLmV4cHJlc3Npb24oKSk7CisgICAgICB9IHdoaWxlICh0aGlzLmV4cGVjdCgnLCcpKTsKKyAgICB9CisgICAgdGhpcy5jb25zdW1lKCcpJyk7CisKKyAgICB2YXIgZXhwcmVzc2lvblRleHQgPSB0aGlzLnRleHQ7CisgICAgLy8gd2UgY2FuIHNhZmVseSByZXVzZSB0aGUgYXJyYXkgYWNyb3NzIGludm9jYXRpb25zCisgICAgdmFyIGFyZ3MgPSBhcmdzRm4ubGVuZ3RoID8gW10gOiBudWxsOworCisgICAgcmV0dXJuIGZ1bmN0aW9uICRwYXJzZUZ1bmN0aW9uQ2FsbChzY29wZSwgbG9jYWxzKSB7CisgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRHZXR0ZXIgPyBjb250ZXh0R2V0dGVyKHNjb3BlLCBsb2NhbHMpIDogaXNEZWZpbmVkKGNvbnRleHRHZXR0ZXIpID8gdW5kZWZpbmVkIDogc2NvcGU7CisgICAgICB2YXIgZm4gPSBmbkdldHRlcihzY29wZSwgbG9jYWxzLCBjb250ZXh0KSB8fCBub29wOworCisgICAgICBpZiAoYXJncykgeworICAgICAgICB2YXIgaSA9IGFyZ3NGbi5sZW5ndGg7CisgICAgICAgIHdoaWxlIChpLS0pIHsKKyAgICAgICAgICBhcmdzW2ldID0gZW5zdXJlU2FmZU9iamVjdChhcmdzRm5baV0oc2NvcGUsIGxvY2FscyksIGV4cHJlc3Npb25UZXh0KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBlbnN1cmVTYWZlT2JqZWN0KGNvbnRleHQsIGV4cHJlc3Npb25UZXh0KTsKKyAgICAgIGVuc3VyZVNhZmVGdW5jdGlvbihmbiwgZXhwcmVzc2lvblRleHQpOworCisgICAgICAvLyBJRSBkb2Vzbid0IGhhdmUgYXBwbHkgZm9yIHNvbWUgbmF0aXZlIGZ1bmN0aW9ucworICAgICAgdmFyIHYgPSBmbi5hcHBseQorICAgICAgICAgICAgPyBmbi5hcHBseShjb250ZXh0LCBhcmdzKQorICAgICAgICAgICAgOiBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTsKKworICAgICAgcmV0dXJuIGVuc3VyZVNhZmVPYmplY3QodiwgZXhwcmVzc2lvblRleHQpOworICAgICAgfTsKKyAgfSwKKworICAvLyBUaGlzIGlzIHVzZWQgd2l0aCBqc29uIGFycmF5IGRlY2xhcmF0aW9uCisgIGFycmF5RGVjbGFyYXRpb246IGZ1bmN0aW9uKCkgeworICAgIHZhciBlbGVtZW50Rm5zID0gW107CisgICAgaWYgKHRoaXMucGVla1Rva2VuKCkudGV4dCAhPT0gJ10nKSB7CisgICAgICBkbyB7CisgICAgICAgIGlmICh0aGlzLnBlZWsoJ10nKSkgeworICAgICAgICAgIC8vIFN1cHBvcnQgdHJhaWxpbmcgY29tbWFzIHBlciBFUzUuMS4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbGVtZW50Rm5zLnB1c2godGhpcy5leHByZXNzaW9uKCkpOworICAgICAgfSB3aGlsZSAodGhpcy5leHBlY3QoJywnKSk7CisgICAgfQorICAgIHRoaXMuY29uc3VtZSgnXScpOworCisgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAkcGFyc2VBcnJheUxpdGVyYWwoc2VsZiwgbG9jYWxzKSB7CisgICAgICB2YXIgYXJyYXkgPSBbXTsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGVsZW1lbnRGbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICBhcnJheS5wdXNoKGVsZW1lbnRGbnNbaV0oc2VsZiwgbG9jYWxzKSk7CisgICAgICB9CisgICAgICByZXR1cm4gYXJyYXk7CisgICAgfSwgeworICAgICAgbGl0ZXJhbDogdHJ1ZSwKKyAgICAgIGNvbnN0YW50OiBlbGVtZW50Rm5zLmV2ZXJ5KGlzQ29uc3RhbnQpLAorICAgICAgaW5wdXRzOiBlbGVtZW50Rm5zCisgICAgfSk7CisgIH0sCisKKyAgb2JqZWN0OiBmdW5jdGlvbigpIHsKKyAgICB2YXIga2V5cyA9IFtdLCB2YWx1ZUZucyA9IFtdOworICAgIGlmICh0aGlzLnBlZWtUb2tlbigpLnRleHQgIT09ICd9JykgeworICAgICAgZG8geworICAgICAgICBpZiAodGhpcy5wZWVrKCd9JykpIHsKKyAgICAgICAgICAvLyBTdXBwb3J0IHRyYWlsaW5nIGNvbW1hcyBwZXIgRVM1LjEuCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdmFyIHRva2VuID0gdGhpcy5jb25zdW1lKCk7CisgICAgICAgIGlmICh0b2tlbi5jb25zdGFudCkgeworICAgICAgICAgIGtleXMucHVzaCh0b2tlbi52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodG9rZW4uaWRlbnRpZmllcikgeworICAgICAgICAgIGtleXMucHVzaCh0b2tlbi50ZXh0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLnRocm93RXJyb3IoImludmFsaWQga2V5IiwgdG9rZW4pOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29uc3VtZSgnOicpOworICAgICAgICB2YWx1ZUZucy5wdXNoKHRoaXMuZXhwcmVzc2lvbigpKTsKKyAgICAgIH0gd2hpbGUgKHRoaXMuZXhwZWN0KCcsJykpOworICAgIH0KKyAgICB0aGlzLmNvbnN1bWUoJ30nKTsKKworICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gJHBhcnNlT2JqZWN0TGl0ZXJhbChzZWxmLCBsb2NhbHMpIHsKKyAgICAgIHZhciBvYmplY3QgPSB7fTsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHZhbHVlRm5zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgb2JqZWN0W2tleXNbaV1dID0gdmFsdWVGbnNbaV0oc2VsZiwgbG9jYWxzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBvYmplY3Q7CisgICAgfSwgeworICAgICAgbGl0ZXJhbDogdHJ1ZSwKKyAgICAgIGNvbnN0YW50OiB2YWx1ZUZucy5ldmVyeShpc0NvbnN0YW50KSwKKyAgICAgIGlucHV0czogdmFsdWVGbnMKKyAgICB9KTsKKyAgfQorfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUGFyc2VyIGhlbHBlciBmdW5jdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Z1bmN0aW9uIHNldHRlcihvYmosIHBhdGgsIHNldFZhbHVlLCBmdWxsRXhwKSB7CisgIGVuc3VyZVNhZmVPYmplY3Qob2JqLCBmdWxsRXhwKTsKKworICB2YXIgZWxlbWVudCA9IHBhdGguc3BsaXQoJy4nKSwga2V5OworICBmb3IgKHZhciBpID0gMDsgZWxlbWVudC5sZW5ndGggPiAxOyBpKyspIHsKKyAgICBrZXkgPSBlbnN1cmVTYWZlTWVtYmVyTmFtZShlbGVtZW50LnNoaWZ0KCksIGZ1bGxFeHApOworICAgIHZhciBwcm9wZXJ0eU9iaiA9IGVuc3VyZVNhZmVPYmplY3Qob2JqW2tleV0sIGZ1bGxFeHApOworICAgIGlmICghcHJvcGVydHlPYmopIHsKKyAgICAgIHByb3BlcnR5T2JqID0ge307CisgICAgICBvYmpba2V5XSA9IHByb3BlcnR5T2JqOworICAgIH0KKyAgICBvYmogPSBwcm9wZXJ0eU9iajsKKyAgfQorICBrZXkgPSBlbnN1cmVTYWZlTWVtYmVyTmFtZShlbGVtZW50LnNoaWZ0KCksIGZ1bGxFeHApOworICBlbnN1cmVTYWZlT2JqZWN0KG9ialtrZXldLCBmdWxsRXhwKTsKKyAgb2JqW2tleV0gPSBzZXRWYWx1ZTsKKyAgcmV0dXJuIHNldFZhbHVlOworfQorCit2YXIgZ2V0dGVyRm5DYWNoZURlZmF1bHQgPSBjcmVhdGVNYXAoKTsKK3ZhciBnZXR0ZXJGbkNhY2hlRXhwZW5zaXZlID0gY3JlYXRlTWFwKCk7CisKK2Z1bmN0aW9uIGlzUG9zc2libHlEYW5nZXJvdXNNZW1iZXJOYW1lKG5hbWUpIHsKKyAgcmV0dXJuIG5hbWUgPT0gJ2NvbnN0cnVjdG9yJzsKK30KKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgIkJsYWNrIEhvbGUiIHZhcmlhbnQgZnJvbToKKyAqIC0gaHR0cDovL2pzcGVyZi5jb20vYW5ndWxhcmpzLXBhcnNlLWdldHRlci80CisgKiAtIGh0dHA6Ly9qc3BlcmYuY29tL3BhdGgtZXZhbHVhdGlvbi1zaW1wbGlmaWVkLzcKKyAqLworZnVuY3Rpb24gY3NwU2FmZUdldHRlckZuKGtleTAsIGtleTEsIGtleTIsIGtleTMsIGtleTQsIGZ1bGxFeHAsIGV4cGVuc2l2ZUNoZWNrcykgeworICBlbnN1cmVTYWZlTWVtYmVyTmFtZShrZXkwLCBmdWxsRXhwKTsKKyAgZW5zdXJlU2FmZU1lbWJlck5hbWUoa2V5MSwgZnVsbEV4cCk7CisgIGVuc3VyZVNhZmVNZW1iZXJOYW1lKGtleTIsIGZ1bGxFeHApOworICBlbnN1cmVTYWZlTWVtYmVyTmFtZShrZXkzLCBmdWxsRXhwKTsKKyAgZW5zdXJlU2FmZU1lbWJlck5hbWUoa2V5NCwgZnVsbEV4cCk7CisgIHZhciBlc28gPSBmdW5jdGlvbihvKSB7CisgICAgcmV0dXJuIGVuc3VyZVNhZmVPYmplY3QobywgZnVsbEV4cCk7CisgIH07CisgIHZhciBlc28wID0gKGV4cGVuc2l2ZUNoZWNrcyB8fCBpc1Bvc3NpYmx5RGFuZ2Vyb3VzTWVtYmVyTmFtZShrZXkwKSkgPyBlc28gOiBpZGVudGl0eTsKKyAgdmFyIGVzbzEgPSAoZXhwZW5zaXZlQ2hlY2tzIHx8IGlzUG9zc2libHlEYW5nZXJvdXNNZW1iZXJOYW1lKGtleTEpKSA/IGVzbyA6IGlkZW50aXR5OworICB2YXIgZXNvMiA9IChleHBlbnNpdmVDaGVja3MgfHwgaXNQb3NzaWJseURhbmdlcm91c01lbWJlck5hbWUoa2V5MikpID8gZXNvIDogaWRlbnRpdHk7CisgIHZhciBlc28zID0gKGV4cGVuc2l2ZUNoZWNrcyB8fCBpc1Bvc3NpYmx5RGFuZ2Vyb3VzTWVtYmVyTmFtZShrZXkzKSkgPyBlc28gOiBpZGVudGl0eTsKKyAgdmFyIGVzbzQgPSAoZXhwZW5zaXZlQ2hlY2tzIHx8IGlzUG9zc2libHlEYW5nZXJvdXNNZW1iZXJOYW1lKGtleTQpKSA/IGVzbyA6IGlkZW50aXR5OworCisgIHJldHVybiBmdW5jdGlvbiBjc3BTYWZlR2V0dGVyKHNjb3BlLCBsb2NhbHMpIHsKKyAgICB2YXIgcGF0aFZhbCA9IChsb2NhbHMgJiYgbG9jYWxzLmhhc093blByb3BlcnR5KGtleTApKSA/IGxvY2FscyA6IHNjb3BlOworCisgICAgaWYgKHBhdGhWYWwgPT0gbnVsbCkgcmV0dXJuIHBhdGhWYWw7CisgICAgcGF0aFZhbCA9IGVzbzAocGF0aFZhbFtrZXkwXSk7CisKKyAgICBpZiAoIWtleTEpIHJldHVybiBwYXRoVmFsOworICAgIGlmIChwYXRoVmFsID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7CisgICAgcGF0aFZhbCA9IGVzbzEocGF0aFZhbFtrZXkxXSk7CisKKyAgICBpZiAoIWtleTIpIHJldHVybiBwYXRoVmFsOworICAgIGlmIChwYXRoVmFsID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7CisgICAgcGF0aFZhbCA9IGVzbzIocGF0aFZhbFtrZXkyXSk7CisKKyAgICBpZiAoIWtleTMpIHJldHVybiBwYXRoVmFsOworICAgIGlmIChwYXRoVmFsID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7CisgICAgcGF0aFZhbCA9IGVzbzMocGF0aFZhbFtrZXkzXSk7CisKKyAgICBpZiAoIWtleTQpIHJldHVybiBwYXRoVmFsOworICAgIGlmIChwYXRoVmFsID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7CisgICAgcGF0aFZhbCA9IGVzbzQocGF0aFZhbFtrZXk0XSk7CisKKyAgICByZXR1cm4gcGF0aFZhbDsKKyAgfTsKK30KKworZnVuY3Rpb24gZ2V0dGVyRm5XaXRoRW5zdXJlU2FmZU9iamVjdChmbiwgZnVsbEV4cHJlc3Npb24pIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKHMsIGwpIHsKKyAgICByZXR1cm4gZm4ocywgbCwgZW5zdXJlU2FmZU9iamVjdCwgZnVsbEV4cHJlc3Npb24pOworICB9OworfQorCitmdW5jdGlvbiBnZXR0ZXJGbihwYXRoLCBvcHRpb25zLCBmdWxsRXhwKSB7CisgIHZhciBleHBlbnNpdmVDaGVja3MgPSBvcHRpb25zLmV4cGVuc2l2ZUNoZWNrczsKKyAgdmFyIGdldHRlckZuQ2FjaGUgPSAoZXhwZW5zaXZlQ2hlY2tzID8gZ2V0dGVyRm5DYWNoZUV4cGVuc2l2ZSA6IGdldHRlckZuQ2FjaGVEZWZhdWx0KTsKKyAgdmFyIGZuID0gZ2V0dGVyRm5DYWNoZVtwYXRoXTsKKyAgaWYgKGZuKSByZXR1cm4gZm47CisKKworICB2YXIgcGF0aEtleXMgPSBwYXRoLnNwbGl0KCcuJyksCisgICAgICBwYXRoS2V5c0xlbmd0aCA9IHBhdGhLZXlzLmxlbmd0aDsKKworICAvLyBodHRwOi8vanNwZXJmLmNvbS9hbmd1bGFyanMtcGFyc2UtZ2V0dGVyLzYKKyAgaWYgKG9wdGlvbnMuY3NwKSB7CisgICAgaWYgKHBhdGhLZXlzTGVuZ3RoIDwgNikgeworICAgICAgZm4gPSBjc3BTYWZlR2V0dGVyRm4ocGF0aEtleXNbMF0sIHBhdGhLZXlzWzFdLCBwYXRoS2V5c1syXSwgcGF0aEtleXNbM10sIHBhdGhLZXlzWzRdLCBmdWxsRXhwLCBleHBlbnNpdmVDaGVja3MpOworICAgIH0gZWxzZSB7CisgICAgICBmbiA9IGZ1bmN0aW9uIGNzcFNhZmVHZXR0ZXIoc2NvcGUsIGxvY2FscykgeworICAgICAgICB2YXIgaSA9IDAsIHZhbDsKKyAgICAgICAgZG8geworICAgICAgICAgIHZhbCA9IGNzcFNhZmVHZXR0ZXJGbihwYXRoS2V5c1tpKytdLCBwYXRoS2V5c1tpKytdLCBwYXRoS2V5c1tpKytdLCBwYXRoS2V5c1tpKytdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoS2V5c1tpKytdLCBmdWxsRXhwLCBleHBlbnNpdmVDaGVja3MpKHNjb3BlLCBsb2NhbHMpOworCisgICAgICAgICAgbG9jYWxzID0gdW5kZWZpbmVkOyAvLyBjbGVhciBhZnRlciBmaXJzdCBpdGVyYXRpb24KKyAgICAgICAgICBzY29wZSA9IHZhbDsKKyAgICAgICAgfSB3aGlsZSAoaSA8IHBhdGhLZXlzTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgIH07CisgICAgfQorICB9IGVsc2UgeworICAgIHZhciBjb2RlID0gJyc7CisgICAgaWYgKGV4cGVuc2l2ZUNoZWNrcykgeworICAgICAgY29kZSArPSAncyA9IGVzbyhzLCBmZSk7XG5sID0gZXNvKGwsIGZlKTtcbic7CisgICAgfQorICAgIHZhciBuZWVkc0Vuc3VyZVNhZmVPYmplY3QgPSBleHBlbnNpdmVDaGVja3M7CisgICAgZm9yRWFjaChwYXRoS2V5cywgZnVuY3Rpb24oa2V5LCBpbmRleCkgeworICAgICAgZW5zdXJlU2FmZU1lbWJlck5hbWUoa2V5LCBmdWxsRXhwKTsKKyAgICAgIHZhciBsb29rdXBKcyA9IChpbmRleAorICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHNpbXBseSBkZXJlZmVyZW5jZSAncycgb24gYW55IC5kb3Qgbm90YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICA/ICdzJworICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBpZiB3ZSBhcmUgZmlyc3QgdGhlbiB3ZSBjaGVjayBsb2NhbHMgZmlyc3QsIGFuZCBpZiBzbyByZWFkIGl0IGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgOiAnKChsJiZsLmhhc093blByb3BlcnR5KCInICsga2V5ICsgJyIpKT9sOnMpJykgKyAnLicgKyBrZXk7CisgICAgICBpZiAoZXhwZW5zaXZlQ2hlY2tzIHx8IGlzUG9zc2libHlEYW5nZXJvdXNNZW1iZXJOYW1lKGtleSkpIHsKKyAgICAgICAgbG9va3VwSnMgPSAnZXNvKCcgKyBsb29rdXBKcyArICcsIGZlKSc7CisgICAgICAgIG5lZWRzRW5zdXJlU2FmZU9iamVjdCA9IHRydWU7CisgICAgICB9CisgICAgICBjb2RlICs9ICdpZihzID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4nICsKKyAgICAgICAgICAgICAgJ3M9JyArIGxvb2t1cEpzICsgJztcbic7CisgICAgfSk7CisgICAgY29kZSArPSAncmV0dXJuIHM7JzsKKworICAgIC8qIGpzaGludCAtVzA1NCAqLworICAgIHZhciBldmFsZWRGbkdldHRlciA9IG5ldyBGdW5jdGlvbigncycsICdsJywgJ2VzbycsICdmZScsIGNvZGUpOyAvLyBzPXNjb3BlLCBsPWxvY2FscywgZXNvPWVuc3VyZVNhZmVPYmplY3QKKyAgICAvKiBqc2hpbnQgK1cwNTQgKi8KKyAgICBldmFsZWRGbkdldHRlci50b1N0cmluZyA9IHZhbHVlRm4oY29kZSk7CisgICAgaWYgKG5lZWRzRW5zdXJlU2FmZU9iamVjdCkgeworICAgICAgZXZhbGVkRm5HZXR0ZXIgPSBnZXR0ZXJGbldpdGhFbnN1cmVTYWZlT2JqZWN0KGV2YWxlZEZuR2V0dGVyLCBmdWxsRXhwKTsKKyAgICB9CisgICAgZm4gPSBldmFsZWRGbkdldHRlcjsKKyAgfQorCisgIGZuLnNoYXJlZEdldHRlciA9IHRydWU7CisgIGZuLmFzc2lnbiA9IGZ1bmN0aW9uKHNlbGYsIHZhbHVlKSB7CisgICAgcmV0dXJuIHNldHRlcihzZWxmLCBwYXRoLCB2YWx1ZSwgcGF0aCk7CisgIH07CisgIGdldHRlckZuQ2FjaGVbcGF0aF0gPSBmbjsKKyAgcmV0dXJuIGZuOworfQorCit2YXIgb2JqZWN0VmFsdWVPZiA9IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZjsKKworZnVuY3Rpb24gZ2V0VmFsdWVPZih2YWx1ZSkgeworICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZS52YWx1ZU9mKSA/IHZhbHVlLnZhbHVlT2YoKSA6IG9iamVjdFZhbHVlT2YuY2FsbCh2YWx1ZSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogQG5nZG9jIHNlcnZpY2UKKyAqIEBuYW1lICRwYXJzZQorICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBDb252ZXJ0cyBBbmd1bGFyIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGludG8gYSBmdW5jdGlvbi4KKyAqCisgKiBgYGBqcworICogICB2YXIgZ2V0dGVyID0gJHBhcnNlKCd1c2VyLm5hbWUnKTsKKyAqICAgdmFyIHNldHRlciA9IGdldHRlci5hc3NpZ247CisgKiAgIHZhciBjb250ZXh0ID0ge3VzZXI6e25hbWU6J2FuZ3VsYXInfX07CisgKiAgIHZhciBsb2NhbHMgPSB7dXNlcjp7bmFtZTonbG9jYWwnfX07CisgKgorICogICBleHBlY3QoZ2V0dGVyKGNvbnRleHQpKS50b0VxdWFsKCdhbmd1bGFyJyk7CisgKiAgIHNldHRlcihjb250ZXh0LCAnbmV3VmFsdWUnKTsKKyAqICAgZXhwZWN0KGNvbnRleHQudXNlci5uYW1lKS50b0VxdWFsKCduZXdWYWx1ZScpOworICogICBleHBlY3QoZ2V0dGVyKGNvbnRleHQsIGxvY2FscykpLnRvRXF1YWwoJ2xvY2FsJyk7CisgKiBgYGAKKyAqCisgKgorICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS4KKyAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0LCBsb2NhbHMpfSBhIGZ1bmN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb246CisgKgorICogICAgKiBgY29udGV4dGAg4oA/IGB7b2JqZWN0fWAg4oA/IGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5ncworICogICAgICBhcmUgZXZhbHVhdGVkIGFnYWluc3QgKHR5cGljYWxseSBhIHNjb3BlIG9iamVjdCkuCisgKiAgICAqIGBsb2NhbHNgIOKAPyBge29iamVjdD19YCDigD8gbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluCisgKiAgICAgIGBjb250ZXh0YC4KKyAqCisgKiAgICBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gYWxzbyBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICogICAgICAqIGBsaXRlcmFsYCDigD8gYHtib29sZWFufWAg4oA/IHdoZXRoZXIgdGhlIGV4cHJlc3Npb24ncyB0b3AtbGV2ZWwgbm9kZSBpcyBhIEphdmFTY3JpcHQKKyAqICAgICAgICBsaXRlcmFsLgorICogICAgICAqIGBjb25zdGFudGAg4oA/IGB7Ym9vbGVhbn1gIOKAPyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIGlzIG1hZGUgZW50aXJlbHkgb2YgSmF2YVNjcmlwdAorICogICAgICAgIGNvbnN0YW50IGxpdGVyYWxzLgorICogICAgICAqIGBhc3NpZ25gIOKAPyBgez9mdW5jdGlvbihjb250ZXh0LCB2YWx1ZSl9YCDigD8gaWYgdGhlIGV4cHJlc3Npb24gaXMgYXNzaWduYWJsZSwgdGhpcyB3aWxsIGJlCisgKiAgICAgICAgc2V0IHRvIGEgZnVuY3Rpb24gdG8gY2hhbmdlIGl0cyB2YWx1ZSBvbiB0aGUgZ2l2ZW4gY29udGV4dC4KKyAqCisgKi8KKworCisvKioKKyAqIEBuZ2RvYyBwcm92aWRlcgorICogQG5hbWUgJHBhcnNlUHJvdmlkZXIKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIGAkcGFyc2VQcm92aWRlcmAgY2FuIGJlIHVzZWQgZm9yIGNvbmZpZ3VyaW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSB7QGxpbmsgbmcuJHBhcnNlICRwYXJzZX0KKyAqICBzZXJ2aWNlLgorICovCitmdW5jdGlvbiAkUGFyc2VQcm92aWRlcigpIHsKKyAgdmFyIGNhY2hlRGVmYXVsdCA9IGNyZWF0ZU1hcCgpOworICB2YXIgY2FjaGVFeHBlbnNpdmUgPSBjcmVhdGVNYXAoKTsKKworCisKKyAgdGhpcy4kZ2V0ID0gWyckZmlsdGVyJywgJyRzbmlmZmVyJywgZnVuY3Rpb24oJGZpbHRlciwgJHNuaWZmZXIpIHsKKyAgICB2YXIgJHBhcnNlT3B0aW9ucyA9IHsKKyAgICAgICAgICBjc3A6ICRzbmlmZmVyLmNzcCwKKyAgICAgICAgICBleHBlbnNpdmVDaGVja3M6IGZhbHNlCisgICAgICAgIH0sCisgICAgICAgICRwYXJzZU9wdGlvbnNFeHBlbnNpdmUgPSB7CisgICAgICAgICAgY3NwOiAkc25pZmZlci5jc3AsCisgICAgICAgICAgZXhwZW5zaXZlQ2hlY2tzOiB0cnVlCisgICAgICAgIH07CisKKyAgICBmdW5jdGlvbiB3cmFwU2hhcmVkRXhwcmVzc2lvbihleHApIHsKKyAgICAgIHZhciB3cmFwcGVkID0gZXhwOworCisgICAgICBpZiAoZXhwLnNoYXJlZEdldHRlcikgeworICAgICAgICB3cmFwcGVkID0gZnVuY3Rpb24gJHBhcnNlV3JhcHBlcihzZWxmLCBsb2NhbHMpIHsKKyAgICAgICAgICByZXR1cm4gZXhwKHNlbGYsIGxvY2Fscyk7CisgICAgICAgIH07CisgICAgICAgIHdyYXBwZWQubGl0ZXJhbCA9IGV4cC5saXRlcmFsOworICAgICAgICB3cmFwcGVkLmNvbnN0YW50ID0gZXhwLmNvbnN0YW50OworICAgICAgICB3cmFwcGVkLmFzc2lnbiA9IGV4cC5hc3NpZ247CisgICAgICB9CisKKyAgICAgIHJldHVybiB3cmFwcGVkOworICAgIH0KKworICAgIHJldHVybiBmdW5jdGlvbiAkcGFyc2UoZXhwLCBpbnRlcmNlcHRvckZuLCBleHBlbnNpdmVDaGVja3MpIHsKKyAgICAgIHZhciBwYXJzZWRFeHByZXNzaW9uLCBvbmVUaW1lLCBjYWNoZUtleTsKKworICAgICAgc3dpdGNoICh0eXBlb2YgZXhwKSB7CisgICAgICAgIGNhc2UgJ3N0cmluZyc6CisgICAgICAgICAgY2FjaGVLZXkgPSBleHAgPSBleHAudHJpbSgpOworCisgICAgICAgICAgdmFyIGNhY2hlID0gKGV4cGVuc2l2ZUNoZWNrcyA/IGNhY2hlRXhwZW5zaXZlIDogY2FjaGVEZWZhdWx0KTsKKyAgICAgICAgICBwYXJzZWRFeHByZXNzaW9uID0gY2FjaGVbY2FjaGVLZXldOworCisgICAgICAgICAgaWYgKCFwYXJzZWRFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBpZiAoZXhwLmNoYXJBdCgwKSA9PT0gJzonICYmIGV4cC5jaGFyQXQoMSkgPT09ICc6JykgeworICAgICAgICAgICAgICBvbmVUaW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgZXhwID0gZXhwLnN1YnN0cmluZygyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHBhcnNlT3B0aW9ucyA9IGV4cGVuc2l2ZUNoZWNrcyA/ICRwYXJzZU9wdGlvbnNFeHBlbnNpdmUgOiAkcGFyc2VPcHRpb25zOworICAgICAgICAgICAgdmFyIGxleGVyID0gbmV3IExleGVyKHBhcnNlT3B0aW9ucyk7CisgICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IFBhcnNlcihsZXhlciwgJGZpbHRlciwgcGFyc2VPcHRpb25zKTsKKyAgICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24gPSBwYXJzZXIucGFyc2UoZXhwKTsKKworICAgICAgICAgICAgaWYgKHBhcnNlZEV4cHJlc3Npb24uY29uc3RhbnQpIHsKKyAgICAgICAgICAgICAgcGFyc2VkRXhwcmVzc2lvbi4kJHdhdGNoRGVsZWdhdGUgPSBjb25zdGFudFdhdGNoRGVsZWdhdGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9uZVRpbWUpIHsKKyAgICAgICAgICAgICAgLy9vbmVUaW1lIGlzIG5vdCBwYXJ0IG9mIHRoZSBleHAgcGFzc2VkIHRvIHRoZSBQYXJzZXIgc28gd2UgbWF5IGhhdmUgdG8KKyAgICAgICAgICAgICAgLy93cmFwIHRoZSBwYXJzZWRFeHByZXNzaW9uIGJlZm9yZSBhZGRpbmcgYSAkJHdhdGNoRGVsZWdhdGUKKyAgICAgICAgICAgICAgcGFyc2VkRXhwcmVzc2lvbiA9IHdyYXBTaGFyZWRFeHByZXNzaW9uKHBhcnNlZEV4cHJlc3Npb24pOworICAgICAgICAgICAgICBwYXJzZWRFeHByZXNzaW9uLiQkd2F0Y2hEZWxlZ2F0ZSA9IHBhcnNlZEV4cHJlc3Npb24ubGl0ZXJhbCA/CisgICAgICAgICAgICAgICAgb25lVGltZUxpdGVyYWxXYXRjaERlbGVnYXRlIDogb25lVGltZVdhdGNoRGVsZWdhdGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlZEV4cHJlc3Npb24uaW5wdXRzKSB7CisgICAgICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlID0gaW5wdXRzV2F0Y2hEZWxlZ2F0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FjaGVbY2FjaGVLZXldID0gcGFyc2VkRXhwcmVzc2lvbjsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIGFkZEludGVyY2VwdG9yKHBhcnNlZEV4cHJlc3Npb24sIGludGVyY2VwdG9yRm4pOworCisgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoKKyAgICAgICAgICByZXR1cm4gYWRkSW50ZXJjZXB0b3IoZXhwLCBpbnRlcmNlcHRvckZuKTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBhZGRJbnRlcmNlcHRvcihub29wLCBpbnRlcmNlcHRvckZuKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgZnVuY3Rpb24gY29sbGVjdEV4cHJlc3Npb25JbnB1dHMoaW5wdXRzLCBsaXN0KSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpbnB1dHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICB2YXIgaW5wdXQgPSBpbnB1dHNbaV07CisgICAgICAgIGlmICghaW5wdXQuY29uc3RhbnQpIHsKKyAgICAgICAgICBpZiAoaW5wdXQuaW5wdXRzKSB7CisgICAgICAgICAgICBjb2xsZWN0RXhwcmVzc2lvbklucHV0cyhpbnB1dC5pbnB1dHMsIGxpc3QpOworICAgICAgICAgIH0gZWxzZSBpZiAobGlzdC5pbmRleE9mKGlucHV0KSA9PT0gLTEpIHsgLy8gVE9ETyhwZXJmKSBjYW4gd2UgZG8gYmV0dGVyPworICAgICAgICAgICAgbGlzdC5wdXNoKGlucHV0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgZnVuY3Rpb24gZXhwcmVzc2lvbklucHV0RGlydHlDaGVjayhuZXdWYWx1ZSwgb2xkVmFsdWVPZlZhbHVlKSB7CisKKyAgICAgIGlmIChuZXdWYWx1ZSA9PSBudWxsIHx8IG9sZFZhbHVlT2ZWYWx1ZSA9PSBudWxsKSB7IC8vIG51bGwvdW5kZWZpbmVkCisgICAgICAgIHJldHVybiBuZXdWYWx1ZSA9PT0gb2xkVmFsdWVPZlZhbHVlOworICAgICAgfQorCisgICAgICBpZiAodHlwZW9mIG5ld1ZhbHVlID09PSAnb2JqZWN0JykgeworCisgICAgICAgIC8vIGF0dGVtcHQgdG8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBwcmltaXRpdmUgdHlwZQorICAgICAgICAvLyBUT0RPKGRvY3MpOiBhZGQgYSBub3RlIHRvIGRvY3MgdGhhdCBieSBpbXBsZW1lbnRpbmcgdmFsdWVPZiBldmVuIG9iamVjdHMgYW5kIGFycmF5cyBjYW4KKyAgICAgICAgLy8gICAgICAgICAgICAgYmUgY2hlYXBseSBkaXJ0eS1jaGVja2VkCisgICAgICAgIG5ld1ZhbHVlID0gZ2V0VmFsdWVPZihuZXdWYWx1ZSk7CisKKyAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ29iamVjdCcpIHsKKyAgICAgICAgICAvLyBvYmplY3RzL2FycmF5cyBhcmUgbm90IHN1cHBvcnRlZCAtIGRlZXAtd2F0Y2hpbmcgdGhlbSB3b3VsZCBiZSB0b28gZXhwZW5zaXZlCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmFsbC10aHJvdWdoIHRvIHRoZSBwcmltaXRpdmUgZXF1YWxpdHkgY2hlY2sKKyAgICAgIH0KKworICAgICAgLy9QcmltaXRpdmUgb3IgTmFOCisgICAgICByZXR1cm4gbmV3VmFsdWUgPT09IG9sZFZhbHVlT2ZWYWx1ZSB8fCAobmV3VmFsdWUgIT09IG5ld1ZhbHVlICYmIG9sZFZhbHVlT2ZWYWx1ZSAhPT0gb2xkVmFsdWVPZlZhbHVlKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBpbnB1dHNXYXRjaERlbGVnYXRlKHNjb3BlLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIHBhcnNlZEV4cHJlc3Npb24pIHsKKyAgICAgIHZhciBpbnB1dEV4cHJlc3Npb25zID0gcGFyc2VkRXhwcmVzc2lvbi4kJGlucHV0cyB8fAorICAgICAgICAgICAgICAgICAgICAocGFyc2VkRXhwcmVzc2lvbi4kJGlucHV0cyA9IGNvbGxlY3RFeHByZXNzaW9uSW5wdXRzKHBhcnNlZEV4cHJlc3Npb24uaW5wdXRzLCBbXSkpOworCisgICAgICB2YXIgbGFzdFJlc3VsdDsKKworICAgICAgaWYgKGlucHV0RXhwcmVzc2lvbnMubGVuZ3RoID09PSAxKSB7CisgICAgICAgIHZhciBvbGRJbnB1dFZhbHVlID0gZXhwcmVzc2lvbklucHV0RGlydHlDaGVjazsgLy8gaW5pdCB0byBzb21ldGhpbmcgdW5pcXVlIHNvIHRoYXQgZXF1YWxzIGNoZWNrIGZhaWxzCisgICAgICAgIGlucHV0RXhwcmVzc2lvbnMgPSBpbnB1dEV4cHJlc3Npb25zWzBdOworICAgICAgICByZXR1cm4gc2NvcGUuJHdhdGNoKGZ1bmN0aW9uIGV4cHJlc3Npb25JbnB1dFdhdGNoKHNjb3BlKSB7CisgICAgICAgICAgdmFyIG5ld0lucHV0VmFsdWUgPSBpbnB1dEV4cHJlc3Npb25zKHNjb3BlKTsKKyAgICAgICAgICBpZiAoIWV4cHJlc3Npb25JbnB1dERpcnR5Q2hlY2sobmV3SW5wdXRWYWx1ZSwgb2xkSW5wdXRWYWx1ZSkpIHsKKyAgICAgICAgICAgIGxhc3RSZXN1bHQgPSBwYXJzZWRFeHByZXNzaW9uKHNjb3BlKTsKKyAgICAgICAgICAgIG9sZElucHV0VmFsdWUgPSBuZXdJbnB1dFZhbHVlICYmIGdldFZhbHVlT2YobmV3SW5wdXRWYWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBsYXN0UmVzdWx0OworICAgICAgICB9LCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHkpOworICAgICAgfQorCisgICAgICB2YXIgb2xkSW5wdXRWYWx1ZU9mVmFsdWVzID0gW107CisgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBpbnB1dEV4cHJlc3Npb25zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgb2xkSW5wdXRWYWx1ZU9mVmFsdWVzW2ldID0gZXhwcmVzc2lvbklucHV0RGlydHlDaGVjazsgLy8gaW5pdCB0byBzb21ldGhpbmcgdW5pcXVlIHNvIHRoYXQgZXF1YWxzIGNoZWNrIGZhaWxzCisgICAgICB9CisKKyAgICAgIHJldHVybiBzY29wZS4kd2F0Y2goZnVuY3Rpb24gZXhwcmVzc2lvbklucHV0c1dhdGNoKHNjb3BlKSB7CisgICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7CisKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW5wdXRFeHByZXNzaW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgICAgdmFyIG5ld0lucHV0VmFsdWUgPSBpbnB1dEV4cHJlc3Npb25zW2ldKHNjb3BlKTsKKyAgICAgICAgICBpZiAoY2hhbmdlZCB8fCAoY2hhbmdlZCA9ICFleHByZXNzaW9uSW5wdXREaXJ0eUNoZWNrKG5ld0lucHV0VmFsdWUsIG9sZElucHV0VmFsdWVPZlZhbHVlc1tpXSkpKSB7CisgICAgICAgICAgICBvbGRJbnB1dFZhbHVlT2ZWYWx1ZXNbaV0gPSBuZXdJbnB1dFZhbHVlICYmIGdldFZhbHVlT2YobmV3SW5wdXRWYWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICBsYXN0UmVzdWx0ID0gcGFyc2VkRXhwcmVzc2lvbihzY29wZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGFzdFJlc3VsdDsKKyAgICAgIH0sIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gb25lVGltZVdhdGNoRGVsZWdhdGUoc2NvcGUsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSwgcGFyc2VkRXhwcmVzc2lvbikgeworICAgICAgdmFyIHVud2F0Y2gsIGxhc3RWYWx1ZTsKKyAgICAgIHJldHVybiB1bndhdGNoID0gc2NvcGUuJHdhdGNoKGZ1bmN0aW9uIG9uZVRpbWVXYXRjaChzY29wZSkgeworICAgICAgICByZXR1cm4gcGFyc2VkRXhwcmVzc2lvbihzY29wZSk7CisgICAgICB9LCBmdW5jdGlvbiBvbmVUaW1lTGlzdGVuZXIodmFsdWUsIG9sZCwgc2NvcGUpIHsKKyAgICAgICAgbGFzdFZhbHVlID0gdmFsdWU7CisgICAgICAgIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVyKSkgeworICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHsKKyAgICAgICAgICBzY29wZS4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpZiAoaXNEZWZpbmVkKGxhc3RWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgdW53YXRjaCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9LCBvYmplY3RFcXVhbGl0eSk7CisgICAgfQorCisgICAgZnVuY3Rpb24gb25lVGltZUxpdGVyYWxXYXRjaERlbGVnYXRlKHNjb3BlLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIHBhcnNlZEV4cHJlc3Npb24pIHsKKyAgICAgIHZhciB1bndhdGNoLCBsYXN0VmFsdWU7CisgICAgICByZXR1cm4gdW53YXRjaCA9IHNjb3BlLiR3YXRjaChmdW5jdGlvbiBvbmVUaW1lV2F0Y2goc2NvcGUpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlZEV4cHJlc3Npb24oc2NvcGUpOworICAgICAgfSwgZnVuY3Rpb24gb25lVGltZUxpc3RlbmVyKHZhbHVlLCBvbGQsIHNjb3BlKSB7CisgICAgICAgIGxhc3RWYWx1ZSA9IHZhbHVlOworICAgICAgICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcikpIHsKKyAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIHZhbHVlLCBvbGQsIHNjb3BlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNBbGxEZWZpbmVkKHZhbHVlKSkgeworICAgICAgICAgIHNjb3BlLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChpc0FsbERlZmluZWQobGFzdFZhbHVlKSkgdW53YXRjaCgpOworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9LCBvYmplY3RFcXVhbGl0eSk7CisKKyAgICAgIGZ1bmN0aW9uIGlzQWxsRGVmaW5lZCh2YWx1ZSkgeworICAgICAgICB2YXIgYWxsRGVmaW5lZCA9IHRydWU7CisgICAgICAgIGZvckVhY2godmFsdWUsIGZ1bmN0aW9uKHZhbCkgeworICAgICAgICAgIGlmICghaXNEZWZpbmVkKHZhbCkpIGFsbERlZmluZWQgPSBmYWxzZTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBhbGxEZWZpbmVkOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIGNvbnN0YW50V2F0Y2hEZWxlZ2F0ZShzY29wZSwgbGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5LCBwYXJzZWRFeHByZXNzaW9uKSB7CisgICAgICB2YXIgdW53YXRjaDsKKyAgICAgIHJldHVybiB1bndhdGNoID0gc2NvcGUuJHdhdGNoKGZ1bmN0aW9uIGNvbnN0YW50V2F0Y2goc2NvcGUpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlZEV4cHJlc3Npb24oc2NvcGUpOworICAgICAgfSwgZnVuY3Rpb24gY29uc3RhbnRMaXN0ZW5lcih2YWx1ZSwgb2xkLCBzY29wZSkgeworICAgICAgICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcikpIHsKKyAgICAgICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgICB9CisgICAgICAgIHVud2F0Y2goKTsKKyAgICAgIH0sIG9iamVjdEVxdWFsaXR5KTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBhZGRJbnRlcmNlcHRvcihwYXJzZWRFeHByZXNzaW9uLCBpbnRlcmNlcHRvckZuKSB7CisgICAgICBpZiAoIWludGVyY2VwdG9yRm4pIHJldHVybiBwYXJzZWRFeHByZXNzaW9uOworICAgICAgdmFyIHdhdGNoRGVsZWdhdGUgPSBwYXJzZWRFeHByZXNzaW9uLiQkd2F0Y2hEZWxlZ2F0ZTsKKworICAgICAgdmFyIHJlZ3VsYXJXYXRjaCA9CisgICAgICAgICAgd2F0Y2hEZWxlZ2F0ZSAhPT0gb25lVGltZUxpdGVyYWxXYXRjaERlbGVnYXRlICYmCisgICAgICAgICAgd2F0Y2hEZWxlZ2F0ZSAhPT0gb25lVGltZVdhdGNoRGVsZWdhdGU7CisKKyAgICAgIHZhciBmbiA9IHJlZ3VsYXJXYXRjaCA/IGZ1bmN0aW9uIHJlZ3VsYXJJbnRlcmNlcHRlZEV4cHJlc3Npb24oc2NvcGUsIGxvY2FscykgeworICAgICAgICB2YXIgdmFsdWUgPSBwYXJzZWRFeHByZXNzaW9uKHNjb3BlLCBsb2NhbHMpOworICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3JGbih2YWx1ZSwgc2NvcGUsIGxvY2Fscyk7CisgICAgICB9IDogZnVuY3Rpb24gb25lVGltZUludGVyY2VwdGVkRXhwcmVzc2lvbihzY29wZSwgbG9jYWxzKSB7CisgICAgICAgIHZhciB2YWx1ZSA9IHBhcnNlZEV4cHJlc3Npb24oc2NvcGUsIGxvY2Fscyk7CisgICAgICAgIHZhciByZXN1bHQgPSBpbnRlcmNlcHRvckZuKHZhbHVlLCBzY29wZSwgbG9jYWxzKTsKKyAgICAgICAgLy8gd2Ugb25seSByZXR1cm4gdGhlIGludGVyY2VwdG9yJ3MgcmVzdWx0IGlmIHRoZQorICAgICAgICAvLyBpbml0aWFsIHZhbHVlIGlzIGRlZmluZWQgKGZvciBiaW5kLW9uY2UpCisgICAgICAgIHJldHVybiBpc0RlZmluZWQodmFsdWUpID8gcmVzdWx0IDogdmFsdWU7CisgICAgICB9OworCisgICAgICAvLyBQcm9wYWdhdGUgJCR3YXRjaERlbGVnYXRlcyBvdGhlciB0aGVuIGlucHV0c1dhdGNoRGVsZWdhdGUKKyAgICAgIGlmIChwYXJzZWRFeHByZXNzaW9uLiQkd2F0Y2hEZWxlZ2F0ZSAmJgorICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlICE9PSBpbnB1dHNXYXRjaERlbGVnYXRlKSB7CisgICAgICAgIGZuLiQkd2F0Y2hEZWxlZ2F0ZSA9IHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlOworICAgICAgfSBlbHNlIGlmICghaW50ZXJjZXB0b3JGbi4kc3RhdGVmdWwpIHsKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gaW50ZXJjZXB0b3IsIGJ1dCBubyB3YXRjaERlbGVnYXRlIHRoZW4gdHJlYXQgdGhlIGludGVyY2VwdG9yIGxpa2UKKyAgICAgICAgLy8gd2UgdHJlYXQgZmlsdGVycyAtIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBwdXJlIGZ1bmN0aW9uIHVubGVzcyBmbGFnZ2VkIHdpdGggJHN0YXRlZnVsCisgICAgICAgIGZuLiQkd2F0Y2hEZWxlZ2F0ZSA9IGlucHV0c1dhdGNoRGVsZWdhdGU7CisgICAgICAgIGZuLmlucHV0cyA9IFtwYXJzZWRFeHByZXNzaW9uXTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZuOworICAgIH0KKyAgfV07Cit9CisKKy8qKgorICogQG5nZG9jIHNlcnZpY2UKKyAqIEBuYW1lICRxCisgKiBAcmVxdWlyZXMgJHJvb3RTY29wZQorICoKKyAqIEBkZXNjcmlwdGlvbgorICogQSBzZXJ2aWNlIHRoYXQgaGVscHMgeW91IHJ1biBmdW5jdGlvbnMgYXN5bmNocm9ub3VzbHksIGFuZCB1c2UgdGhlaXIgcmV0dXJuIHZhbHVlcyAob3IgZXhjZXB0aW9ucykKKyAqIHdoZW4gdGhleSBhcmUgZG9uZSBwcm9jZXNzaW5nLgorICoKKyAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgcHJvbWlzZXMvZGVmZXJyZWQgb2JqZWN0cyBpbnNwaXJlZCBieQorICogW0tyaXMgS293YWwncyBRXShodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL3EpLgorICoKKyAqICRxIGNhbiBiZSB1c2VkIGluIHR3byBmYXNoaW9ucyAtLS0gb25lIHdoaWNoIGlzIG1vcmUgc2ltaWxhciB0byBLcmlzIEtvd2FsJ3MgUSBvciBqUXVlcnkncyBEZWZlcnJlZAorICogaW1wbGVtZW50YXRpb25zLCBhbmQgdGhlIG90aGVyIHdoaWNoIHJlc2VtYmxlcyBFUzYgcHJvbWlzZXMgdG8gc29tZSBkZWdyZWUuCisgKgorICogIyAkcSBjb25zdHJ1Y3RvcgorICoKKyAqIFRoZSBzdHJlYW1saW5lZCBFUzYgc3R5bGUgcHJvbWlzZSBpcyBlc3NlbnRpYWxseSBqdXN0IHVzaW5nICRxIGFzIGEgY29uc3RydWN0b3Igd2hpY2ggdGFrZXMgYSBgcmVzb2x2ZXJgCisgKiBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQuIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgbmF0aXZlIFByb21pc2UgaW1wbGVtZW50YXRpb24gZnJvbSBFUzYgSGFybW9ueSwKKyAqIHNlZSBbTUROXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm9taXNlKS4KKyAqCisgKiBXaGlsZSB0aGUgY29uc3RydWN0b3Itc3R5bGUgdXNlIGlzIHN1cHBvcnRlZCwgbm90IGFsbCBvZiB0aGUgc3VwcG9ydGluZyBtZXRob2RzIGZyb20gRVM2IEhhcm1vbnkgcHJvbWlzZXMgYXJlCisgKiBhdmFpbGFibGUgeWV0LgorICoKKyAqIEl0IGNhbiBiZSB1c2VkIGxpa2Ugc286CisgKgorICogYGBganMKKyAqICAgLy8gZm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgZXhhbXBsZSBsZXQncyBhc3N1bWUgdGhhdCB2YXJpYWJsZXMgYCRxYCBhbmQgYG9rVG9HcmVldGAKKyAqICAgLy8gYXJlIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlICh0aGV5IGNvdWxkIGhhdmUgYmVlbiBpbmplY3RlZCBvciBwYXNzZWQgaW4pLgorICoKKyAqICAgZnVuY3Rpb24gYXN5bmNHcmVldChuYW1lKSB7CisgKiAgICAgLy8gcGVyZm9ybSBzb21lIGFzeW5jaHJvbm91cyBvcGVyYXRpb24sIHJlc29sdmUgb3IgcmVqZWN0IHRoZSBwcm9taXNlIHdoZW4gYXBwcm9wcmlhdGUuCisgKiAgICAgcmV0dXJuICRxKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgeworICogICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAqICAgICAgICAgaWYgKG9rVG9HcmVldChuYW1lKSkgeworICogICAgICAgICAgIHJlc29sdmUoJ0hlbGxvLCAnICsgbmFtZSArICchJyk7CisgKiAgICAgICAgIH0gZWxzZSB7CisgKiAgICAgICAgICAgcmVqZWN0KCdHcmVldGluZyAnICsgbmFtZSArICcgaXMgbm90IGFsbG93ZWQuJyk7CisgKiAgICAgICAgIH0KKyAqICAgICAgIH0sIDEwMDApOworICogICAgIH0pOworICogICB9CisgKgorICogICB2YXIgcHJvbWlzZSA9IGFzeW5jR3JlZXQoJ1JvYmluIEhvb2QnKTsKKyAqICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGdyZWV0aW5nKSB7CisgKiAgICAgYWxlcnQoJ1N1Y2Nlc3M6ICcgKyBncmVldGluZyk7CisgKiAgIH0sIGZ1bmN0aW9uKHJlYXNvbikgeworICogICAgIGFsZXJ0KCdGYWlsZWQ6ICcgKyByZWFzb24pOworICogICB9KTsKKyAqIGBgYAorICoKKyAqIE5vdGU6IHByb2dyZXNzL25vdGlmeSBjYWxsYmFja3MgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIHZpYSB0aGUgRVM2LXN0eWxlIGludGVyZmFjZS4KKyAqCisgKiBIb3dldmVyLCB0aGUgbW9yZSB0cmFkaXRpb25hbCBDb21tb25KUy1zdHlsZSB1c2FnZSBpcyBzdGlsbCBhdmFpbGFibGUsIGFuZCBkb2N1bWVudGVkIGJlbG93LgorICoKKyAqIFtUaGUgQ29tbW9uSlMgUHJvbWlzZSBwcm9wb3NhbF0oaHR0cDovL3dpa2kuY29tbW9uanMub3JnL3dpa2kvUHJvbWlzZXMpIGRlc2NyaWJlcyBhIHByb21pc2UgYXMgYW4KKyAqIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYW4gYWN0aW9uIHRoYXQgaXMKKyAqIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseSwgYW5kIG1heSBvciBtYXkgbm90IGJlIGZpbmlzaGVkIGF0IGFueSBnaXZlbiBwb2ludCBpbiB0aW1lLgorICoKKyAqIEZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGRlYWxpbmcgd2l0aCBlcnJvciBoYW5kbGluZywgZGVmZXJyZWQgYW5kIHByb21pc2UgQVBJcyBhcmUgdG8KKyAqIGFzeW5jaHJvbm91cyBwcm9ncmFtbWluZyB3aGF0IGB0cnlgLCBgY2F0Y2hgIGFuZCBgdGhyb3dgIGtleXdvcmRzIGFyZSB0byBzeW5jaHJvbm91cyBwcm9ncmFtbWluZy4KKyAqCisgKiBgYGBqcworICogICAvLyBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBleGFtcGxlIGxldCdzIGFzc3VtZSB0aGF0IHZhcmlhYmxlcyBgJHFgIGFuZCBgb2tUb0dyZWV0YAorICogICAvLyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGUgKHRoZXkgY291bGQgaGF2ZSBiZWVuIGluamVjdGVkIG9yIHBhc3NlZCBpbikuCisgKgorICogICBmdW5jdGlvbiBhc3luY0dyZWV0KG5hbWUpIHsKKyAqICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpOworICoKKyAqICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworICogICAgICAgZGVmZXJyZWQubm90aWZ5KCdBYm91dCB0byBncmVldCAnICsgbmFtZSArICcuJyk7CisgKgorICogICAgICAgaWYgKG9rVG9HcmVldChuYW1lKSkgeworICogICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCdIZWxsbywgJyArIG5hbWUgKyAnIScpOworICogICAgICAgfSBlbHNlIHsKKyAqICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCdHcmVldGluZyAnICsgbmFtZSArICcgaXMgbm90IGFsbG93ZWQuJyk7CisgKiAgICAgICB9CisgKiAgICAgfSwgMTAwMCk7CisgKgorICogICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlOworICogICB9CisgKgorICogICB2YXIgcHJvbWlzZSA9IGFzeW5jR3JlZXQoJ1JvYmluIEhvb2QnKTsKKyAqICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGdyZWV0aW5nKSB7CisgKiAgICAgYWxlcnQoJ1N1Y2Nlc3M6ICcgKyBncmVldGluZyk7CisgKiAgIH0sIGZ1bmN0aW9uKHJlYXNvbikgeworICogICAgIGFsZXJ0KCdGYWlsZWQ6ICcgKyByZWFzb24pOworICogICB9LCBmdW5jdGlvbih1cGRhdGUpIHsKKyAqICAgICBhbGVydCgnR290IG5vdGlmaWNhdGlvbjogJyArIHVwZGF0ZSk7CisgKiAgIH0pOworICogYGBgCisgKgorICogQXQgZmlyc3QgaXQgbWlnaHQgbm90IGJlIG9idmlvdXMgd2h5IHRoaXMgZXh0cmEgY29tcGxleGl0eSBpcyB3b3J0aCB0aGUgdHJvdWJsZS4gVGhlIHBheW9mZgorICogY29tZXMgaW4gdGhlIHdheSBvZiBndWFyYW50ZWVzIHRoYXQgcHJvbWlzZSBhbmQgZGVmZXJyZWQgQVBJcyBtYWtlLCBzZWUKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvdW5jb21tb25qcy9ibG9iL21hc3Rlci9wcm9taXNlcy9zcGVjaWZpY2F0aW9uLm1kLgorICoKKyAqIEFkZGl0aW9uYWxseSB0aGUgcHJvbWlzZSBhcGkgYWxsb3dzIGZvciBjb21wb3NpdGlvbiB0aGF0IGlzIHZlcnkgaGFyZCB0byBkbyB3aXRoIHRoZQorICogdHJhZGl0aW9uYWwgY2FsbGJhY2sgKFtDUFNdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29udGludWF0aW9uLXBhc3Npbmdfc3R5bGUpKSBhcHByb2FjaC4KKyAqIEZvciBtb3JlIG9uIHRoaXMgcGxlYXNlIHNlZSB0aGUgW1EgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xKSBlc3BlY2lhbGx5IHRoZQorICogc2VjdGlvbiBvbiBzZXJpYWwgb3IgcGFyYWxsZWwgam9pbmluZyBvZiBwcm9taXNlcy4KKyAqCisgKiAjIFRoZSBEZWZlcnJlZCBBUEkKKyAqCisgKiBBIG5ldyBpbnN0YW5jZSBvZiBkZWZlcnJlZCBpcyBjb25zdHJ1Y3RlZCBieSBjYWxsaW5nIGAkcS5kZWZlcigpYC4KKyAqCisgKiBUaGUgcHVycG9zZSBvZiB0aGUgZGVmZXJyZWQgb2JqZWN0IGlzIHRvIGV4cG9zZSB0aGUgYXNzb2NpYXRlZCBQcm9taXNlIGluc3RhbmNlIGFzIHdlbGwgYXMgQVBJcworICogdGhhdCBjYW4gYmUgdXNlZCBmb3Igc2lnbmFsaW5nIHRoZSBzdWNjZXNzZnVsIG9yIHVuc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLCBhcyB3ZWxsIGFzIHRoZSBzdGF0dXMKKyAqIG9mIHRoZSB0YXNrLgorICoKKyAqICoqTWV0aG9kcyoqCisgKgorICogLSBgcmVzb2x2ZSh2YWx1ZSlgIOKAPyByZXNvbHZlcyB0aGUgZGVyaXZlZCBwcm9taXNlIHdpdGggdGhlIGB2YWx1ZWAuIElmIHRoZSB2YWx1ZSBpcyBhIHJlamVjdGlvbgorICogICBjb25zdHJ1Y3RlZCB2aWEgYCRxLnJlamVjdGAsIHRoZSBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgaW5zdGVhZC4KKyAqIC0gYHJlamVjdChyZWFzb24pYCDigD8gcmVqZWN0cyB0aGUgZGVyaXZlZCBwcm9taXNlIHdpdGggdGhlIGByZWFzb25gLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAqICAgcmVzb2x2aW5nIGl0IHdpdGggYSByZWplY3Rpb24gY29uc3RydWN0ZWQgdmlhIGAkcS5yZWplY3RgLgorICogLSBgbm90aWZ5KHZhbHVlKWAgLSBwcm92aWRlcyB1cGRhdGVzIG9uIHRoZSBzdGF0dXMgb2YgdGhlIHByb21pc2UncyBleGVjdXRpb24uIFRoaXMgbWF5IGJlIGNhbGxlZAorICogICBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgdGhlIHByb21pc2UgaXMgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkLgorICoKKyAqICoqUHJvcGVydGllcyoqCisgKgorICogLSBwcm9taXNlIOKAPyBge1Byb21pc2V9YCDigD8gcHJvbWlzZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVmZXJyZWQuCisgKgorICoKKyAqICMgVGhlIFByb21pc2UgQVBJCisgKgorICogQSBuZXcgcHJvbWlzZSBpbnN0YW5jZSBpcyBjcmVhdGVkIHdoZW4gYSBkZWZlcnJlZCBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5CisgKiBjYWxsaW5nIGBkZWZlcnJlZC5wcm9taXNlYC4KKyAqCisgKiBUaGUgcHVycG9zZSBvZiB0aGUgcHJvbWlzZSBvYmplY3QgaXMgdG8gYWxsb3cgZm9yIGludGVyZXN0ZWQgcGFydGllcyB0byBnZXQgYWNjZXNzIHRvIHRoZSByZXN1bHQKKyAqIG9mIHRoZSBkZWZlcnJlZCB0YXNrIHdoZW4gaXQgY29tcGxldGVzLgorICoKKyAqICoqTWV0aG9kcyoqCisgKgorICogLSBgdGhlbihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2ssIG5vdGlmeUNhbGxiYWNrKWAg4oA/IHJlZ2FyZGxlc3Mgb2Ygd2hlbiB0aGUgcHJvbWlzZSB3YXMgb3IKKyAqICAgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCwgYHRoZW5gIGNhbGxzIG9uZSBvZiB0aGUgc3VjY2VzcyBvciBlcnJvciBjYWxsYmFja3MgYXN5bmNocm9ub3VzbHkKKyAqICAgYXMgc29vbiBhcyB0aGUgcmVzdWx0IGlzIGF2YWlsYWJsZS4gVGhlIGNhbGxiYWNrcyBhcmUgY2FsbGVkIHdpdGggYSBzaW5nbGUgYXJndW1lbnQ6IHRoZSByZXN1bHQKKyAqICAgb3IgcmVqZWN0aW9uIHJlYXNvbi4gQWRkaXRpb25hbGx5LCB0aGUgbm90aWZ5IGNhbGxiYWNrIG1heSBiZSBjYWxsZWQgemVybyBvciBtb3JlIHRpbWVzIHRvCisgKiAgIHByb3ZpZGUgYSBwcm9ncmVzcyBpbmRpY2F0aW9uLCBiZWZvcmUgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuCisgKgorICogICBUaGlzIG1ldGhvZCAqcmV0dXJucyBhIG5ldyBwcm9taXNlKiB3aGljaCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB2aWEgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUKKyAqICAgYHN1Y2Nlc3NDYWxsYmFja2AsIGBlcnJvckNhbGxiYWNrYC4gSXQgYWxzbyBub3RpZmllcyB2aWEgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUKKyAqICAgYG5vdGlmeUNhbGxiYWNrYCBtZXRob2QuIFRoZSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCBvciByZWplY3RlZCBmcm9tIHRoZSBub3RpZnlDYWxsYmFjaworICogICBtZXRob2QuCisgKgorICogLSBgY2F0Y2goZXJyb3JDYWxsYmFjaylgIOKAPyBzaG9ydGhhbmQgZm9yIGBwcm9taXNlLnRoZW4obnVsbCwgZXJyb3JDYWxsYmFjaylgCisgKgorICogLSBgZmluYWxseShjYWxsYmFjaywgbm90aWZ5Q2FsbGJhY2spYCDigD8gYWxsb3dzIHlvdSB0byBvYnNlcnZlIGVpdGhlciB0aGUgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIG9mIGEgcHJvbWlzZSwKKyAqICAgYnV0IHRvIGRvIHNvIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBmaW5hbCB2YWx1ZS4gVGhpcyBpcyB1c2VmdWwgdG8gcmVsZWFzZSByZXNvdXJjZXMgb3IgZG8gc29tZQorICogICBjbGVhbi11cCB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgd2hldGhlciB0aGUgcHJvbWlzZSB3YXMgcmVqZWN0ZWQgb3IgcmVzb2x2ZWQuIFNlZSB0aGUgW2Z1bGwKKyAqICAgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xL3dpa2kvQVBJLVJlZmVyZW5jZSNwcm9taXNlZmluYWxseWNhbGxiYWNrKSBmb3IKKyAqICAgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiAjIENoYWluaW5nIHByb21pc2VzCisgKgorICogQmVjYXVzZSBjYWxsaW5nIHRoZSBgdGhlbmAgbWV0aG9kIG9mIGEgcHJvbWlzZSByZXR1cm5zIGEgbmV3IGRlcml2ZWQgcHJvbWlzZSwgaXQgaXMgZWFzaWx5CisgKiBwb3NzaWJsZSB0byBjcmVhdGUgYSBjaGFpbiBvZiBwcm9taXNlczoKKyAqCisgKiBgYGBqcworICogICBwcm9taXNlQiA9IHByb21pc2VBLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgKiAgICAgcmV0dXJuIHJlc3VsdCArIDE7CisgKiAgIH0pOworICoKKyAqICAgLy8gcHJvbWlzZUIgd2lsbCBiZSByZXNvbHZlZCBpbW1lZGlhdGVseSBhZnRlciBwcm9taXNlQSBpcyByZXNvbHZlZCBhbmQgaXRzIHZhbHVlCisgKiAgIC8vIHdpbGwgYmUgdGhlIHJlc3VsdCBvZiBwcm9taXNlQSBpbmNyZW1lbnRlZCBieSAxCisgKiBgYGAKKyAqCisgKiBJdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgY2hhaW5zIG9mIGFueSBsZW5ndGggYW5kIHNpbmNlIGEgcHJvbWlzZSBjYW4gYmUgcmVzb2x2ZWQgd2l0aCBhbm90aGVyCisgKiBwcm9taXNlICh3aGljaCB3aWxsIGRlZmVyIGl0cyByZXNvbHV0aW9uIGZ1cnRoZXIpLCBpdCBpcyBwb3NzaWJsZSB0byBwYXVzZS9kZWZlciByZXNvbHV0aW9uIG9mCisgKiB0aGUgcHJvbWlzZXMgYXQgYW55IHBvaW50IGluIHRoZSBjaGFpbi4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBpbXBsZW1lbnQgcG93ZXJmdWwgQVBJcyBsaWtlCisgKiAkaHR0cCdzIHJlc3BvbnNlIGludGVyY2VwdG9ycy4KKyAqCisgKgorICogIyBEaWZmZXJlbmNlcyBiZXR3ZWVuIEtyaXMgS293YWwncyBRIGFuZCAkcQorICoKKyAqICBUaGVyZSBhcmUgdHdvIG1haW4gZGlmZmVyZW5jZXM6CisgKgorICogLSAkcSBpcyBpbnRlZ3JhdGVkIHdpdGggdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlfSBTY29wZSBtb2RlbCBvYnNlcnZhdGlvbgorICogICBtZWNoYW5pc20gaW4gYW5ndWxhciwgd2hpY2ggbWVhbnMgZmFzdGVyIHByb3BhZ2F0aW9uIG9mIHJlc29sdXRpb24gb3IgcmVqZWN0aW9uIGludG8geW91cgorICogICBtb2RlbHMgYW5kIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGJyb3dzZXIgcmVwYWludHMsIHdoaWNoIHdvdWxkIHJlc3VsdCBpbiBmbGlja2VyaW5nIFVJLgorICogLSBRIGhhcyBtYW55IG1vcmUgZmVhdHVyZXMgdGhhbiAkcSwgYnV0IHRoYXQgY29tZXMgYXQgYSBjb3N0IG9mIGJ5dGVzLiAkcSBpcyB0aW55LCBidXQgY29udGFpbnMKKyAqICAgYWxsIHRoZSBpbXBvcnRhbnQgZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9yIGNvbW1vbiBhc3luYyB0YXNrcy4KKyAqCisgKiAgIyBUZXN0aW5nCisgKgorICogIGBgYGpzCisgKiAgICBpdCgnc2hvdWxkIHNpbXVsYXRlIHByb21pc2UnLCBpbmplY3QoZnVuY3Rpb24oJHEsICRyb290U2NvcGUpIHsKKyAqICAgICAgdmFyIGRlZmVycmVkID0gJHEuZGVmZXIoKTsKKyAqICAgICAgdmFyIHByb21pc2UgPSBkZWZlcnJlZC5wcm9taXNlOworICogICAgICB2YXIgcmVzb2x2ZWRWYWx1ZTsKKyAqCisgKiAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSkgeyByZXNvbHZlZFZhbHVlID0gdmFsdWU7IH0pOworICogICAgICBleHBlY3QocmVzb2x2ZWRWYWx1ZSkudG9CZVVuZGVmaW5lZCgpOworICoKKyAqICAgICAgLy8gU2ltdWxhdGUgcmVzb2x2aW5nIG9mIHByb21pc2UKKyAqICAgICAgZGVmZXJyZWQucmVzb2x2ZSgxMjMpOworICogICAgICAvLyBOb3RlIHRoYXQgdGhlICd0aGVuJyBmdW5jdGlvbiBkb2VzIG5vdCBnZXQgY2FsbGVkIHN5bmNocm9ub3VzbHkuCisgKiAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB3ZSB3YW50IHRoZSBwcm9taXNlIEFQSSB0byBhbHdheXMgYmUgYXN5bmMsIHdoZXRoZXIgb3Igbm90CisgKiAgICAgIC8vIGl0IGdvdCBjYWxsZWQgc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseS4KKyAqICAgICAgZXhwZWN0KHJlc29sdmVkVmFsdWUpLnRvQmVVbmRlZmluZWQoKTsKKyAqCisgKiAgICAgIC8vIFByb3BhZ2F0ZSBwcm9taXNlIHJlc29sdXRpb24gdG8gJ3RoZW4nIGZ1bmN0aW9ucyB1c2luZyAkYXBwbHkoKS4KKyAqICAgICAgJHJvb3RTY29wZS4kYXBwbHkoKTsKKyAqICAgICAgZXhwZWN0KHJlc29sdmVkVmFsdWUpLnRvRXF1YWwoMTIzKTsKKyAqICAgIH0pKTsKKyAqICBgYGAKKyAqCisgKiBAcGFyYW0ge2Z1bmN0aW9uKGZ1bmN0aW9uLCBmdW5jdGlvbil9IHJlc29sdmVyIEZ1bmN0aW9uIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciByZXNvbHZpbmcgb3IKKyAqICAgcmVqZWN0aW5nIHRoZSBuZXdseSBjcmVhdGVkIHByb21pc2UuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSBmdW5jdGlvbiB3aGljaCByZXNvbHZlcyB0aGUKKyAqICAgcHJvbWlzZSwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBmdW5jdGlvbiB3aGljaCByZWplY3RzIHRoZSBwcm9taXNlLgorICoKKyAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgbmV3bHkgY3JlYXRlZCBwcm9taXNlLgorICovCitmdW5jdGlvbiAkUVByb3ZpZGVyKCkgeworCisgIHRoaXMuJGdldCA9IFsnJHJvb3RTY29wZScsICckZXhjZXB0aW9uSGFuZGxlcicsIGZ1bmN0aW9uKCRyb290U2NvcGUsICRleGNlcHRpb25IYW5kbGVyKSB7CisgICAgcmV0dXJuIHFGYWN0b3J5KGZ1bmN0aW9uKGNhbGxiYWNrKSB7CisgICAgICAkcm9vdFNjb3BlLiRldmFsQXN5bmMoY2FsbGJhY2spOworICAgIH0sICRleGNlcHRpb25IYW5kbGVyKTsKKyAgfV07Cit9CisKK2Z1bmN0aW9uICQkUVByb3ZpZGVyKCkgeworICB0aGlzLiRnZXQgPSBbJyRicm93c2VyJywgJyRleGNlcHRpb25IYW5kbGVyJywgZnVuY3Rpb24oJGJyb3dzZXIsICRleGNlcHRpb25IYW5kbGVyKSB7CisgICAgcmV0dXJuIHFGYWN0b3J5KGZ1bmN0aW9uKGNhbGxiYWNrKSB7CisgICAgICAkYnJvd3Nlci5kZWZlcihjYWxsYmFjayk7CisgICAgfSwgJGV4Y2VwdGlvbkhhbmRsZXIpOworICB9XTsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RzIGEgcHJvbWlzZSBtYW5hZ2VyLgorICoKKyAqIEBwYXJhbSB7ZnVuY3Rpb24oZnVuY3Rpb24pfSBuZXh0VGljayBGdW5jdGlvbiBmb3IgZXhlY3V0aW5nIGZ1bmN0aW9ucyBpbiB0aGUgbmV4dCB0dXJuLgorICogQHBhcmFtIHtmdW5jdGlvbiguLi4qKX0gZXhjZXB0aW9uSGFuZGxlciBGdW5jdGlvbiBpbnRvIHdoaWNoIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBhcmUgcGFzc2VkIGZvcgorICogICAgIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2UgbWFuYWdlci4KKyAqLworZnVuY3Rpb24gcUZhY3RvcnkobmV4dFRpY2ssIGV4Y2VwdGlvbkhhbmRsZXIpIHsKKyAgdmFyICRxTWluRXJyID0gbWluRXJyKCckcScsIFR5cGVFcnJvcik7CisgIGZ1bmN0aW9uIGNhbGxPbmNlKHNlbGYsIHJlc29sdmVGbiwgcmVqZWN0Rm4pIHsKKyAgICB2YXIgY2FsbGVkID0gZmFsc2U7CisgICAgZnVuY3Rpb24gd3JhcChmbikgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgIGlmIChjYWxsZWQpIHJldHVybjsKKyAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgZm4uY2FsbChzZWxmLCB2YWx1ZSk7CisgICAgICB9OworICAgIH0KKworICAgIHJldHVybiBbd3JhcChyZXNvbHZlRm4pLCB3cmFwKHJlamVjdEZuKV07CisgIH0KKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSBuZy4kcSNkZWZlcgorICAgKiBAa2luZCBmdW5jdGlvbgorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogQ3JlYXRlcyBhIGBEZWZlcnJlZGAgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgYSB0YXNrIHdoaWNoIHdpbGwgZmluaXNoIGluIHRoZSBmdXR1cmUuCisgICAqCisgICAqIEByZXR1cm5zIHtEZWZlcnJlZH0gUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBkZWZlcnJlZC4KKyAgICovCisgIHZhciBkZWZlciA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBuZXcgRGVmZXJyZWQoKTsKKyAgfTsKKworICBmdW5jdGlvbiBQcm9taXNlKCkgeworICAgIHRoaXMuJCRzdGF0ZSA9IHsgc3RhdHVzOiAwIH07CisgIH0KKworICBQcm9taXNlLnByb3RvdHlwZSA9IHsKKyAgICB0aGVuOiBmdW5jdGlvbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgcHJvZ3Jlc3NCYWNrKSB7CisgICAgICB2YXIgcmVzdWx0ID0gbmV3IERlZmVycmVkKCk7CisKKyAgICAgIHRoaXMuJCRzdGF0ZS5wZW5kaW5nID0gdGhpcy4kJHN0YXRlLnBlbmRpbmcgfHwgW107CisgICAgICB0aGlzLiQkc3RhdGUucGVuZGluZy5wdXNoKFtyZXN1bHQsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBwcm9ncmVzc0JhY2tdKTsKKyAgICAgIGlmICh0aGlzLiQkc3RhdGUuc3RhdHVzID4gMCkgc2NoZWR1bGVQcm9jZXNzUXVldWUodGhpcy4kJHN0YXRlKTsKKworICAgICAgcmV0dXJuIHJlc3VsdC5wcm9taXNlOworICAgIH0sCisKKyAgICAiY2F0Y2giOiBmdW5jdGlvbihjYWxsYmFjaykgeworICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBjYWxsYmFjayk7CisgICAgfSwKKworICAgICJmaW5hbGx5IjogZnVuY3Rpb24oY2FsbGJhY2ssIHByb2dyZXNzQmFjaykgeworICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICByZXR1cm4gaGFuZGxlQ2FsbGJhY2sodmFsdWUsIHRydWUsIGNhbGxiYWNrKTsKKyAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVDYWxsYmFjayhlcnJvciwgZmFsc2UsIGNhbGxiYWNrKTsKKyAgICAgIH0sIHByb2dyZXNzQmFjayk7CisgICAgfQorICB9OworCisgIC8vRmFzdGVyLCBtb3JlIGJhc2ljIHRoYW4gYW5ndWxhci5iaW5kIGh0dHA6Ly9qc3BlcmYuY29tL2FuZ3VsYXItYmluZC12cy1jdXN0b20tdnMtbmF0aXZlCisgIGZ1bmN0aW9uIHNpbXBsZUJpbmQoY29udGV4dCwgZm4pIHsKKyAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIGZuLmNhbGwoY29udGV4dCwgdmFsdWUpOworICAgIH07CisgIH0KKworICBmdW5jdGlvbiBwcm9jZXNzUXVldWUoc3RhdGUpIHsKKyAgICB2YXIgZm4sIHByb21pc2UsIHBlbmRpbmc7CisKKyAgICBwZW5kaW5nID0gc3RhdGUucGVuZGluZzsKKyAgICBzdGF0ZS5wcm9jZXNzU2NoZWR1bGVkID0gZmFsc2U7CisgICAgc3RhdGUucGVuZGluZyA9IHVuZGVmaW5lZDsKKyAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwZW5kaW5nLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgIHByb21pc2UgPSBwZW5kaW5nW2ldWzBdOworICAgICAgZm4gPSBwZW5kaW5nW2ldW3N0YXRlLnN0YXR1c107CisgICAgICB0cnkgeworICAgICAgICBpZiAoaXNGdW5jdGlvbihmbikpIHsKKyAgICAgICAgICBwcm9taXNlLnJlc29sdmUoZm4oc3RhdGUudmFsdWUpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5zdGF0dXMgPT09IDEpIHsKKyAgICAgICAgICBwcm9taXNlLnJlc29sdmUoc3RhdGUudmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByb21pc2UucmVqZWN0KHN0YXRlLnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBwcm9taXNlLnJlamVjdChlKTsKKyAgICAgICAgZXhjZXB0aW9uSGFuZGxlcihlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBzY2hlZHVsZVByb2Nlc3NRdWV1ZShzdGF0ZSkgeworICAgIGlmIChzdGF0ZS5wcm9jZXNzU2NoZWR1bGVkIHx8ICFzdGF0ZS5wZW5kaW5nKSByZXR1cm47CisgICAgc3RhdGUucHJvY2Vzc1NjaGVkdWxlZCA9IHRydWU7CisgICAgbmV4dFRpY2soZnVuY3Rpb24oKSB7IHByb2Nlc3NRdWV1ZShzdGF0ZSk7IH0pOworICB9CisKKyAgZnVuY3Rpb24gRGVmZXJyZWQoKSB7CisgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKTsKKyAgICAvL05lY2Vzc2FyeSB0byBzdXBwb3J0IHVuYm91bmQgZXhlY3V0aW9uIDovCisgICAgdGhpcy5yZXNvbHZlID0gc2ltcGxlQmluZCh0aGlzLCB0aGlzLnJlc29sdmUpOworICAgIHRoaXMucmVqZWN0ID0gc2ltcGxlQmluZCh0aGlzLCB0aGlzLnJlamVjdCk7CisgICAgdGhpcy5ub3RpZnkgPSBzaW1wbGVCaW5kKHRoaXMsIHRoaXMubm90aWZ5KTsKKyAgfQorCisgIERlZmVycmVkLnByb3RvdHlwZSA9IHsKKyAgICByZXNvbHZlOiBmdW5jdGlvbih2YWwpIHsKKyAgICAgIGlmICh0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXMpIHJldHVybjsKKyAgICAgIGlmICh2YWwgPT09IHRoaXMucHJvbWlzZSkgeworICAgICAgICB0aGlzLiQkcmVqZWN0KCRxTWluRXJyKAorICAgICAgICAgICdxY3ljbGUnLAorICAgICAgICAgICJFeHBlY3RlZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIHdpdGggdmFsdWUgb3RoZXIgdGhhbiBpdHNlbGYgJ3swfSciLAorICAgICAgICAgIHZhbCkpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHRoaXMuJCRyZXNvbHZlKHZhbCk7CisgICAgICB9CisKKyAgICB9LAorCisgICAgJCRyZXNvbHZlOiBmdW5jdGlvbih2YWwpIHsKKyAgICAgIHZhciB0aGVuLCBmbnM7CisKKyAgICAgIGZucyA9IGNhbGxPbmNlKHRoaXMsIHRoaXMuJCRyZXNvbHZlLCB0aGlzLiQkcmVqZWN0KTsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmICgoaXNPYmplY3QodmFsKSB8fCBpc0Z1bmN0aW9uKHZhbCkpKSB0aGVuID0gdmFsICYmIHZhbC50aGVuOworICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGVuKSkgeworICAgICAgICAgIHRoaXMucHJvbWlzZS4kJHN0YXRlLnN0YXR1cyA9IC0xOworICAgICAgICAgIHRoZW4uY2FsbCh2YWwsIGZuc1swXSwgZm5zWzFdLCB0aGlzLm5vdGlmeSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5wcm9taXNlLiQkc3RhdGUudmFsdWUgPSB2YWw7CisgICAgICAgICAgdGhpcy5wcm9taXNlLiQkc3RhdGUuc3RhdHVzID0gMTsKKyAgICAgICAgICBzY2hlZHVsZVByb2Nlc3NRdWV1ZSh0aGlzLnByb21pc2UuJCRzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgZm5zWzFdKGUpOworICAgICAgICBleGNlcHRpb25IYW5kbGVyKGUpOworICAgICAgfQorICAgIH0sCisKKyAgICByZWplY3Q6IGZ1bmN0aW9uKHJlYXNvbikgeworICAgICAgaWYgKHRoaXMucHJvbWlzZS4kJHN0YXRlLnN0YXR1cykgcmV0dXJuOworICAgICAgdGhpcy4kJHJlamVjdChyZWFzb24pOworICAgIH0sCisKKyAgICAkJHJlamVjdDogZnVuY3Rpb24ocmVhc29uKSB7CisgICAgICB0aGlzLnByb21pc2UuJCRzdGF0ZS52YWx1ZSA9IHJlYXNvbjsKKyAgICAgIHRoaXMucHJvbWlzZS4kJHN0YXRlLnN0YXR1cyA9IDI7CisgICAgICBzY2hlZHVsZVByb2Nlc3NRdWV1ZSh0aGlzLnByb21pc2UuJCRzdGF0ZSk7CisgICAgfSwKKworICAgIG5vdGlmeTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHsKKyAgICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLnByb21pc2UuJCRzdGF0ZS5wZW5kaW5nOworCisgICAgICBpZiAoKHRoaXMucHJvbWlzZS4kJHN0YXRlLnN0YXR1cyA8PSAwKSAmJiBjYWxsYmFja3MgJiYgY2FsbGJhY2tzLmxlbmd0aCkgeworICAgICAgICBuZXh0VGljayhmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgY2FsbGJhY2ssIHJlc3VsdDsKKyAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2tzW2ldWzBdOworICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFja3NbaV1bM107CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICByZXN1bHQubm90aWZ5KGlzRnVuY3Rpb24oY2FsbGJhY2spID8gY2FsbGJhY2socHJvZ3Jlc3MpIDogcHJvZ3Jlc3MpOworICAgICAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgICBleGNlcHRpb25IYW5kbGVyKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfQorICB9OworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRxI3JlamVjdAorICAgKiBAa2luZCBmdW5jdGlvbgorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogQ3JlYXRlcyBhIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBhcyByZWplY3RlZCB3aXRoIHRoZSBzcGVjaWZpZWQgYHJlYXNvbmAuIFRoaXMgYXBpIHNob3VsZCBiZQorICAgKiB1c2VkIHRvIGZvcndhcmQgcmVqZWN0aW9uIGluIGEgY2hhaW4gb2YgcHJvbWlzZXMuIElmIHlvdSBhcmUgZGVhbGluZyB3aXRoIHRoZSBsYXN0IHByb21pc2UgaW4KKyAgICogYSBwcm9taXNlIGNoYWluLCB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBpdC4KKyAgICoKKyAgICogV2hlbiBjb21wYXJpbmcgZGVmZXJyZWRzL3Byb21pc2VzIHRvIHRoZSBmYW1pbGlhciBiZWhhdmlvciBvZiB0cnkvY2F0Y2gvdGhyb3csIHRoaW5rIG9mCisgICAqIGByZWplY3RgIGFzIHRoZSBgdGhyb3dgIGtleXdvcmQgaW4gSmF2YVNjcmlwdC4gVGhpcyBhbHNvIG1lYW5zIHRoYXQgaWYgeW91ICJjYXRjaCIgYW4gZXJyb3IgdmlhCisgICAqIGEgcHJvbWlzZSBlcnJvciBjYWxsYmFjayBhbmQgeW91IHdhbnQgdG8gZm9yd2FyZCB0aGUgZXJyb3IgdG8gdGhlIHByb21pc2UgZGVyaXZlZCBmcm9tIHRoZQorICAgKiBjdXJyZW50IHByb21pc2UsIHlvdSBoYXZlIHRvICJyZXRocm93IiB0aGUgZXJyb3IgYnkgcmV0dXJuaW5nIGEgcmVqZWN0aW9uIGNvbnN0cnVjdGVkIHZpYQorICAgKiBgcmVqZWN0YC4KKyAgICoKKyAgICogYGBganMKKyAgICogICBwcm9taXNlQiA9IHByb21pc2VBLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAqICAgICAvLyBzdWNjZXNzOiBkbyBzb21ldGhpbmcgYW5kIHJlc29sdmUgcHJvbWlzZUIKKyAgICogICAgIC8vICAgICAgICAgIHdpdGggdGhlIG9sZCBvciBhIG5ldyByZXN1bHQKKyAgICogICAgIHJldHVybiByZXN1bHQ7CisgICAqICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CisgICAqICAgICAvLyBlcnJvcjogaGFuZGxlIHRoZSBlcnJvciBpZiBwb3NzaWJsZSBhbmQKKyAgICogICAgIC8vICAgICAgICByZXNvbHZlIHByb21pc2VCIHdpdGggbmV3UHJvbWlzZU9yVmFsdWUsCisgICAqICAgICAvLyAgICAgICAgb3RoZXJ3aXNlIGZvcndhcmQgdGhlIHJlamVjdGlvbiB0byBwcm9taXNlQgorICAgKiAgICAgaWYgKGNhbkhhbmRsZShyZWFzb24pKSB7CisgICAqICAgICAgLy8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcmVjb3ZlcgorICAgKiAgICAgIHJldHVybiBuZXdQcm9taXNlT3JWYWx1ZTsKKyAgICogICAgIH0KKyAgICogICAgIHJldHVybiAkcS5yZWplY3QocmVhc29uKTsKKyAgICogICB9KTsKKyAgICogYGBgCisgICAqCisgICAqIEBwYXJhbSB7Kn0gcmVhc29uIENvbnN0YW50LCBtZXNzYWdlLCBleGNlcHRpb24gb3IgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVqZWN0aW9uIHJlYXNvbi4KKyAgICogQHJldHVybnMge1Byb21pc2V9IFJldHVybnMgYSBwcm9taXNlIHRoYXQgd2FzIGFscmVhZHkgcmVzb2x2ZWQgYXMgcmVqZWN0ZWQgd2l0aCB0aGUgYHJlYXNvbmAuCisgICAqLworICB2YXIgcmVqZWN0ID0gZnVuY3Rpb24ocmVhc29uKSB7CisgICAgdmFyIHJlc3VsdCA9IG5ldyBEZWZlcnJlZCgpOworICAgIHJlc3VsdC5yZWplY3QocmVhc29uKTsKKyAgICByZXR1cm4gcmVzdWx0LnByb21pc2U7CisgIH07CisKKyAgdmFyIG1ha2VQcm9taXNlID0gZnVuY3Rpb24gbWFrZVByb21pc2UodmFsdWUsIHJlc29sdmVkKSB7CisgICAgdmFyIHJlc3VsdCA9IG5ldyBEZWZlcnJlZCgpOworICAgIGlmIChyZXNvbHZlZCkgeworICAgICAgcmVzdWx0LnJlc29sdmUodmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQucmVqZWN0KHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC5wcm9taXNlOworICB9OworCisgIHZhciBoYW5kbGVDYWxsYmFjayA9IGZ1bmN0aW9uIGhhbmRsZUNhbGxiYWNrKHZhbHVlLCBpc1Jlc29sdmVkLCBjYWxsYmFjaykgeworICAgIHZhciBjYWxsYmFja091dHB1dCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgY2FsbGJhY2tPdXRwdXQgPSBjYWxsYmFjaygpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHJldHVybiBtYWtlUHJvbWlzZShlLCBmYWxzZSk7CisgICAgfQorICAgIGlmIChpc1Byb21pc2VMaWtlKGNhbGxiYWNrT3V0cHV0KSkgeworICAgICAgcmV0dXJuIGNhbGxiYWNrT3V0cHV0LnRoZW4oZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtYWtlUHJvbWlzZSh2YWx1ZSwgaXNSZXNvbHZlZCk7CisgICAgICB9LCBmdW5jdGlvbihlcnJvcikgeworICAgICAgICByZXR1cm4gbWFrZVByb21pc2UoZXJyb3IsIGZhbHNlKTsKKyAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbWFrZVByb21pc2UodmFsdWUsIGlzUmVzb2x2ZWQpOworICAgIH0KKyAgfTsKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAkcSN3aGVuCisgICAqIEBraW5kIGZ1bmN0aW9uCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBXcmFwcyBhbiBvYmplY3QgdGhhdCBtaWdodCBiZSBhIHZhbHVlIG9yIGEgKDNyZCBwYXJ0eSkgdGhlbi1hYmxlIHByb21pc2UgaW50byBhICRxIHByb21pc2UuCisgICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IGFyZSBkZWFsaW5nIHdpdGggYW4gb2JqZWN0IHRoYXQgbWlnaHQgb3IgbWlnaHQgbm90IGJlIGEgcHJvbWlzZSwgb3IgaWYKKyAgICogdGhlIHByb21pc2UgY29tZXMgZnJvbSBhIHNvdXJjZSB0aGF0IGNhbid0IGJlIHRydXN0ZWQuCisgICAqCisgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb3IgYSBwcm9taXNlCisgICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIGEgcHJvbWlzZSBvZiB0aGUgcGFzc2VkIHZhbHVlIG9yIHByb21pc2UKKyAgICovCisKKworICB2YXIgd2hlbiA9IGZ1bmN0aW9uKHZhbHVlLCBjYWxsYmFjaywgZXJyYmFjaywgcHJvZ3Jlc3NCYWNrKSB7CisgICAgdmFyIHJlc3VsdCA9IG5ldyBEZWZlcnJlZCgpOworICAgIHJlc3VsdC5yZXNvbHZlKHZhbHVlKTsKKyAgICByZXR1cm4gcmVzdWx0LnByb21pc2UudGhlbihjYWxsYmFjaywgZXJyYmFjaywgcHJvZ3Jlc3NCYWNrKTsKKyAgfTsKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSAkcSNhbGwKKyAgICogQGtpbmQgZnVuY3Rpb24KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIENvbWJpbmVzIG11bHRpcGxlIHByb21pc2VzIGludG8gYSBzaW5nbGUgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gYWxsIG9mIHRoZSBpbnB1dAorICAgKiBwcm9taXNlcyBhcmUgcmVzb2x2ZWQuCisgICAqCisgICAqIEBwYXJhbSB7QXJyYXkuPFByb21pc2U+fE9iamVjdC48UHJvbWlzZT59IHByb21pc2VzIEFuIGFycmF5IG9yIGhhc2ggb2YgcHJvbWlzZXMuCisgICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIGEgc2luZ2xlIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggYW4gYXJyYXkvaGFzaCBvZiB2YWx1ZXMsCisgICAqICAgZWFjaCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9taXNlIGF0IHRoZSBzYW1lIGluZGV4L2tleSBpbiB0aGUgYHByb21pc2VzYCBhcnJheS9oYXNoLgorICAgKiAgIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgaXMgcmVzb2x2ZWQgd2l0aCBhIHJlamVjdGlvbiwgdGhpcyByZXN1bHRpbmcgcHJvbWlzZSB3aWxsIGJlIHJlamVjdGVkCisgICAqICAgd2l0aCB0aGUgc2FtZSByZWplY3Rpb24gdmFsdWUuCisgICAqLworCisgIGZ1bmN0aW9uIGFsbChwcm9taXNlcykgeworICAgIHZhciBkZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpLAorICAgICAgICBjb3VudGVyID0gMCwKKyAgICAgICAgcmVzdWx0cyA9IGlzQXJyYXkocHJvbWlzZXMpID8gW10gOiB7fTsKKworICAgIGZvckVhY2gocHJvbWlzZXMsIGZ1bmN0aW9uKHByb21pc2UsIGtleSkgeworICAgICAgY291bnRlcisrOworICAgICAgd2hlbihwcm9taXNlKS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgIGlmIChyZXN1bHRzLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybjsKKyAgICAgICAgcmVzdWx0c1trZXldID0gdmFsdWU7CisgICAgICAgIGlmICghKC0tY291bnRlcikpIGRlZmVycmVkLnJlc29sdmUocmVzdWx0cyk7CisgICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHsKKyAgICAgICAgaWYgKHJlc3VsdHMuaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuOworICAgICAgICBkZWZlcnJlZC5yZWplY3QocmVhc29uKTsKKyAgICAgIH0pOworICAgIH0pOworCisgICAgaWYgKGNvdW50ZXIgPT09IDApIHsKKyAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzdWx0cyk7CisgICAgfQorCisgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgIH0KKworICB2YXIgJFEgPSBmdW5jdGlvbiBRKHJlc29sdmVyKSB7CisgICAgaWYgKCFpc0Z1bmN0aW9uKHJlc29sdmVyKSkgeworICAgICAgdGhyb3cgJHFNaW5FcnIoJ25vcnNsdnInLCAiRXhwZWN0ZWQgcmVzb2x2ZXJGbiwgZ290ICd7MH0nIiwgcmVzb2x2ZXIpOworICAgIH0KKworICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBRKSkgeworICAgICAgLy8gTW9yZSB1c2VmdWwgd2hlbiAkUSBpcyB0aGUgUHJvbWlzZSBpdHNlbGYuCisgICAgICByZXR1cm4gbmV3IFEocmVzb2x2ZXIpOworICAgIH0KKworICAgIHZhciBkZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpOworCisgICAgZnVuY3Rpb24gcmVzb2x2ZUZuKHZhbHVlKSB7CisgICAgICBkZWZlcnJlZC5yZXNvbHZlKHZhbHVlKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiByZWplY3RGbihyZWFzb24pIHsKKyAgICAgIGRlZmVycmVkLnJlamVjdChyZWFzb24pOworICAgIH0KKworICAgIHJlc29sdmVyKHJlc29sdmVGbiwgcmVqZWN0Rm4pOworCisgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7CisgIH07CisKKyAgJFEuZGVmZXIgPSBkZWZlcjsKKyAgJFEucmVqZWN0ID0gcmVqZWN0OworICAkUS53aGVuID0gd2hlbjsKKyAgJFEuYWxsID0gYWxsOworCisgIHJldHVybiAkUTsKK30KKworZnVuY3Rpb24gJCRSQUZQcm92aWRlcigpIHsgLy9yQUYKKyAgdGhpcy4kZ2V0ID0gWyckd2luZG93JywgJyR0aW1lb3V0JywgZnVuY3Rpb24oJHdpbmRvdywgJHRpbWVvdXQpIHsKKyAgICB2YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gJHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7CisKKyAgICB2YXIgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSAkd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aW5kb3cud2Via2l0Q2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lOworCisgICAgdmFyIHJhZlN1cHBvcnRlZCA9ICEhcmVxdWVzdEFuaW1hdGlvbkZyYW1lOworICAgIHZhciByYWYgPSByYWZTdXBwb3J0ZWQKKyAgICAgID8gZnVuY3Rpb24oZm4pIHsKKyAgICAgICAgICB2YXIgaWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOworICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKKyAgICAgICAgICB9OworICAgICAgICB9CisgICAgICA6IGZ1bmN0aW9uKGZuKSB7CisgICAgICAgICAgdmFyIHRpbWVyID0gJHRpbWVvdXQoZm4sIDE2LjY2LCBmYWxzZSk7IC8vIDEwMDAgLyA2MCA9IDE2LjY2NgorICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICR0aW1lb3V0LmNhbmNlbCh0aW1lcik7CisgICAgICAgICAgfTsKKyAgICAgICAgfTsKKworICAgIHJhZi5zdXBwb3J0ZWQgPSByYWZTdXBwb3J0ZWQ7CisKKyAgICByZXR1cm4gcmFmOworICB9XTsKK30KKworLyoqCisgKiBERVNJR04gTk9URVMKKyAqCisgKiBUaGUgZGVzaWduIGRlY2lzaW9ucyBiZWhpbmQgdGhlIHNjb3BlIGFyZSBoZWF2aWx5IGZhdm9yZWQgZm9yIHNwZWVkIGFuZCBtZW1vcnkgY29uc3VtcHRpb24uCisgKgorICogVGhlIHR5cGljYWwgdXNlIG9mIHNjb3BlIGlzIHRvIHdhdGNoIHRoZSBleHByZXNzaW9ucywgd2hpY2ggbW9zdCBvZiB0aGUgdGltZSByZXR1cm4gdGhlIHNhbWUKKyAqIHZhbHVlIGFzIGxhc3QgdGltZSBzbyB3ZSBvcHRpbWl6ZSB0aGUgb3BlcmF0aW9uLgorICoKKyAqIENsb3N1cmVzIGNvbnN0cnVjdGlvbiBpcyBleHBlbnNpdmUgaW4gdGVybXMgb2Ygc3BlZWQgYXMgd2VsbCBhcyBtZW1vcnk6CisgKiAgIC0gTm8gY2xvc3VyZXMsIGluc3RlYWQgdXNlIHByb3RvdHlwaWNhbCBpbmhlcml0YW5jZSBmb3IgQVBJCisgKiAgIC0gSW50ZXJuYWwgc3RhdGUgbmVlZHMgdG8gYmUgc3RvcmVkIG9uIHNjb3BlIGRpcmVjdGx5LCB3aGljaCBtZWFucyB0aGF0IHByaXZhdGUgc3RhdGUgaXMKKyAqICAgICBleHBvc2VkIGFzICQkX19fXyBwcm9wZXJ0aWVzCisgKgorICogTG9vcCBvcGVyYXRpb25zIGFyZSBvcHRpbWl6ZWQgYnkgdXNpbmcgd2hpbGUoY291bnQtLSkgeyAuLi4gfQorICogICAtIHRoaXMgbWVhbnMgdGhhdCBpbiBvcmRlciB0byBrZWVwIHRoZSBzYW1lIG9yZGVyIG9mIGV4ZWN1dGlvbiBhcyBhZGRpdGlvbiB3ZSBoYXZlIHRvIGFkZAorICogICAgIGl0ZW1zIHRvIHRoZSBhcnJheSBhdCB0aGUgYmVnaW5uaW5nICh1bnNoaWZ0KSBpbnN0ZWFkIG9mIGF0IHRoZSBlbmQgKHB1c2gpCisgKgorICogQ2hpbGQgc2NvcGVzIGFyZSBjcmVhdGVkIGFuZCByZW1vdmVkIG9mdGVuCisgKiAgIC0gVXNpbmcgYW4gYXJyYXkgd291bGQgYmUgc2xvdyBzaW5jZSBpbnNlcnRzIGluIG1pZGRsZSBhcmUgZXhwZW5zaXZlIHNvIHdlIHVzZSBsaW5rZWQgbGlzdAorICoKKyAqIFRoZXJlIGFyZSBmZXcgd2F0Y2hlcyB0aGVuIGEgbG90IG9mIG9ic2VydmVycy4gVGhpcyBpcyB3aHkgeW91IGRvbid0IHdhbnQgdGhlIG9ic2VydmVyIHRvIGJlCisgKiBpbXBsZW1lbnRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2F0Y2guIFdhdGNoIHJlcXVpcmVzIHJldHVybiBvZiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB3aGljaAorICogYXJlIGV4cGVuc2l2ZSB0byBjb25zdHJ1Y3QuCisgKi8KKworCisvKioKKyAqIEBuZ2RvYyBwcm92aWRlcgorICogQG5hbWUgJHJvb3RTY29wZVByb3ZpZGVyCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBQcm92aWRlciBmb3IgdGhlICRyb290U2NvcGUgc2VydmljZS4KKyAqLworCisvKioKKyAqIEBuZ2RvYyBtZXRob2QKKyAqIEBuYW1lICRyb290U2NvcGVQcm92aWRlciNkaWdlc3RUdGwKKyAqIEBkZXNjcmlwdGlvbgorICoKKyAqIFNldHMgdGhlIG51bWJlciBvZiBgJGRpZ2VzdGAgaXRlcmF0aW9ucyB0aGUgc2NvcGUgc2hvdWxkIGF0dGVtcHQgdG8gZXhlY3V0ZSBiZWZvcmUgZ2l2aW5nIHVwIGFuZAorICogYXNzdW1pbmcgdGhhdCB0aGUgbW9kZWwgaXMgdW5zdGFibGUuCisgKgorICogVGhlIGN1cnJlbnQgZGVmYXVsdCBpcyAxMCBpdGVyYXRpb25zLgorICoKKyAqIEluIGNvbXBsZXggYXBwbGljYXRpb25zIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gYCR3YXRjaGBzIHdpbGwgcmVzdWx0IGluCisgKiBzZXZlcmFsIGRpZ2VzdCBpdGVyYXRpb25zLiBIb3dldmVyIGlmIGFuIGFwcGxpY2F0aW9uIG5lZWRzIG1vcmUgdGhhbiB0aGUgZGVmYXVsdCAxMCBkaWdlc3QKKyAqIGl0ZXJhdGlvbnMgZm9yIGl0cyBtb2RlbCB0byBzdGFiaWxpemUgdGhlbiB5b3Ugc2hvdWxkIGludmVzdGlnYXRlIHdoYXQgaXMgY2F1c2luZyB0aGUgbW9kZWwgdG8KKyAqIGNvbnRpbnVvdXNseSBjaGFuZ2UgZHVyaW5nIHRoZSBkaWdlc3QuCisgKgorICogSW5jcmVhc2luZyB0aGUgVFRMIGNvdWxkIGhhdmUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLCBzbyB5b3Ugc2hvdWxkIG5vdCBjaGFuZ2UgaXQgd2l0aG91dAorICogcHJvcGVyIGp1c3RpZmljYXRpb24uCisgKgorICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IFRoZSBudW1iZXIgb2YgZGlnZXN0IGl0ZXJhdGlvbnMuCisgKi8KKworCisvKioKKyAqIEBuZ2RvYyBzZXJ2aWNlCisgKiBAbmFtZSAkcm9vdFNjb3BlCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBFdmVyeSBhcHBsaWNhdGlvbiBoYXMgYSBzaW5nbGUgcm9vdCB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBzY29wZX0uCisgKiBBbGwgb3RoZXIgc2NvcGVzIGFyZSBkZXNjZW5kYW50IHNjb3BlcyBvZiB0aGUgcm9vdCBzY29wZS4gU2NvcGVzIHByb3ZpZGUgc2VwYXJhdGlvbgorICogYmV0d2VlbiB0aGUgbW9kZWwgYW5kIHRoZSB2aWV3LCB2aWEgYSBtZWNoYW5pc20gZm9yIHdhdGNoaW5nIHRoZSBtb2RlbCBmb3IgY2hhbmdlcy4KKyAqIFRoZXkgYWxzbyBwcm92aWRlIGFuIGV2ZW50IGVtaXNzaW9uL2Jyb2FkY2FzdCBhbmQgc3Vic2NyaXB0aW9uIGZhY2lsaXR5LiBTZWUgdGhlCisgKiB7QGxpbmsgZ3VpZGUvc2NvcGUgZGV2ZWxvcGVyIGd1aWRlIG9uIHNjb3Blc30uCisgKi8KK2Z1bmN0aW9uICRSb290U2NvcGVQcm92aWRlcigpIHsKKyAgdmFyIFRUTCA9IDEwOworICB2YXIgJHJvb3RTY29wZU1pbkVyciA9IG1pbkVycignJHJvb3RTY29wZScpOworICB2YXIgbGFzdERpcnR5V2F0Y2ggPSBudWxsOworICB2YXIgYXBwbHlBc3luY0lkID0gbnVsbDsKKworICB0aGlzLmRpZ2VzdFR0bCA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHsKKyAgICAgIFRUTCA9IHZhbHVlOworICAgIH0KKyAgICByZXR1cm4gVFRMOworICB9OworCisgIHRoaXMuJGdldCA9IFsnJGluamVjdG9yJywgJyRleGNlcHRpb25IYW5kbGVyJywgJyRwYXJzZScsICckYnJvd3NlcicsCisgICAgICBmdW5jdGlvbigkaW5qZWN0b3IsICRleGNlcHRpb25IYW5kbGVyLCAkcGFyc2UsICRicm93c2VyKSB7CisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgdHlwZQorICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUKKyAgICAgKgorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqIEEgcm9vdCBzY29wZSBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZSAkcm9vdFNjb3BlfSBrZXkgZnJvbSB0aGUKKyAgICAgKiB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfS4gQ2hpbGQgc2NvcGVzIGFyZSBjcmVhdGVkIHVzaW5nIHRoZQorICAgICAqIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRuZXcgJG5ldygpfSBtZXRob2QuIChNb3N0IHNjb3BlcyBhcmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4KKyAgICAgKiBjb21waWxlZCBIVE1MIHRlbXBsYXRlIGlzIGV4ZWN1dGVkLikKKyAgICAgKgorICAgICAqIEhlcmUgaXMgYSBzaW1wbGUgc2NvcGUgc25pcHBldCB0byBzaG93IGhvdyB5b3UgY2FuIGludGVyYWN0IHdpdGggdGhlIHNjb3BlLgorICAgICAqIGBgYGh0bWwKKyAgICAgKiA8ZmlsZSBzcmM9Ii4vdGVzdC9uZy9yb290U2NvcGVTcGVjLmpzIiB0YWc9ImRvY3MxIiAvPgorICAgICAqIGBgYAorICAgICAqCisgICAgICogIyBJbmhlcml0YW5jZQorICAgICAqIEEgc2NvcGUgY2FuIGluaGVyaXQgZnJvbSBhIHBhcmVudCBzY29wZSwgYXMgaW4gdGhpcyBleGFtcGxlOgorICAgICAqIGBgYGpzCisgICAgICAgICB2YXIgcGFyZW50ID0gJHJvb3RTY29wZTsKKyAgICAgICAgIHZhciBjaGlsZCA9IHBhcmVudC4kbmV3KCk7CisKKyAgICAgICAgIHBhcmVudC5zYWx1dGF0aW9uID0gIkhlbGxvIjsKKyAgICAgICAgIGV4cGVjdChjaGlsZC5zYWx1dGF0aW9uKS50b0VxdWFsKCdIZWxsbycpOworCisgICAgICAgICBjaGlsZC5zYWx1dGF0aW9uID0gIldlbGNvbWUiOworICAgICAgICAgZXhwZWN0KGNoaWxkLnNhbHV0YXRpb24pLnRvRXF1YWwoJ1dlbGNvbWUnKTsKKyAgICAgICAgIGV4cGVjdChwYXJlbnQuc2FsdXRhdGlvbikudG9FcXVhbCgnSGVsbG8nKTsKKyAgICAgKiBgYGAKKyAgICAgKgorICAgICAqIFdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBgU2NvcGVgIGluIHRlc3RzLCBhZGRpdGlvbmFsIGhlbHBlciBtZXRob2RzIGFyZSBhdmFpbGFibGUgb24gdGhlCisgICAgICogaW5zdGFuY2VzIG9mIGBTY29wZWAgdHlwZS4gU2VlIHtAbGluayBuZ01vY2suJHJvb3RTY29wZS5TY29wZSBuZ01vY2sgU2NvcGV9IGZvciBhZGRpdGlvbmFsCisgICAgICogZGV0YWlscy4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywgZnVuY3Rpb24oKT49fSBwcm92aWRlcnMgTWFwIG9mIHNlcnZpY2UgZmFjdG9yeSB3aGljaCBuZWVkIHRvIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCBmb3IgdGhlIGN1cnJlbnQgc2NvcGUuIERlZmF1bHRzIHRvIHtAbGluayBuZ30uCisgICAgICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywgKj49fSBpbnN0YW5jZUNhY2hlIFByb3ZpZGVzIHByZS1pbnN0YW50aWF0ZWQgc2VydmljZXMgd2hpY2ggc2hvdWxkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQvb3ZlcnJpZGUgc2VydmljZXMgcHJvdmlkZWQgYnkgYHByb3ZpZGVyc2AuIFRoaXMgaXMgaGFuZHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdW5pdC10ZXN0aW5nIGFuZCBoYXZpbmcgdGhlIG5lZWQgdG8gb3ZlcnJpZGUgYSBkZWZhdWx0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLgorICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ld2x5IGNyZWF0ZWQgc2NvcGUuCisgICAgICoKKyAgICAgKi8KKyAgICBmdW5jdGlvbiBTY29wZSgpIHsKKyAgICAgIHRoaXMuJGlkID0gbmV4dFVpZCgpOworICAgICAgdGhpcy4kJHBoYXNlID0gdGhpcy4kcGFyZW50ID0gdGhpcy4kJHdhdGNoZXJzID0KKyAgICAgICAgICAgICAgICAgICAgIHRoaXMuJCRuZXh0U2libGluZyA9IHRoaXMuJCRwcmV2U2libGluZyA9CisgICAgICAgICAgICAgICAgICAgICB0aGlzLiQkY2hpbGRIZWFkID0gdGhpcy4kJGNoaWxkVGFpbCA9IG51bGw7CisgICAgICB0aGlzLiRyb290ID0gdGhpczsKKyAgICAgIHRoaXMuJCRkZXN0cm95ZWQgPSBmYWxzZTsKKyAgICAgIHRoaXMuJCRsaXN0ZW5lcnMgPSB7fTsKKyAgICAgIHRoaXMuJCRsaXN0ZW5lckNvdW50ID0ge307CisgICAgICB0aGlzLiQkaXNvbGF0ZUJpbmRpbmdzID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgcHJvcGVydHkKKyAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRpZAorICAgICAqCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICogVW5pcXVlIHNjb3BlIElEIChtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcpIHVzZWZ1bCBmb3IgZGVidWdnaW5nLgorICAgICAqLworCisgICAgIC8qKgorICAgICAgKiBAbmdkb2MgcHJvcGVydHkKKyAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkcGFyZW50CisgICAgICAqCisgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBzY29wZS4KKyAgICAgICovCisKKyAgICAgIC8qKgorICAgICAgICogQG5nZG9jIHByb3BlcnR5CisgICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRyb290CisgICAgICAgKgorICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIHJvb3Qgc2NvcGUuCisgICAgICAgKi8KKworICAgIFNjb3BlLnByb3RvdHlwZSA9IHsKKyAgICAgIGNvbnN0cnVjdG9yOiBTY29wZSwKKyAgICAgIC8qKgorICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkbmV3CisgICAgICAgKiBAa2luZCBmdW5jdGlvbgorICAgICAgICoKKyAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICogQ3JlYXRlcyBhIG5ldyBjaGlsZCB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBzY29wZX0uCisgICAgICAgKgorICAgICAgICogVGhlIHBhcmVudCBzY29wZSB3aWxsIHByb3BhZ2F0ZSB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0KCl9IGV2ZW50LgorICAgICAgICogVGhlIHNjb3BlIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNjb3BlIGhpZXJhcmNoeSB1c2luZyB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGVzdHJveSAkZGVzdHJveSgpfS4KKyAgICAgICAqCisgICAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGVzdHJveSAkZGVzdHJveSgpfSBtdXN0IGJlIGNhbGxlZCBvbiBhIHNjb3BlIHdoZW4gaXQgaXMKKyAgICAgICAqIGRlc2lyZWQgZm9yIHRoZSBzY29wZSBhbmQgaXRzIGNoaWxkIHNjb3BlcyB0byBiZSBwZXJtYW5lbnRseSBkZXRhY2hlZCBmcm9tIHRoZSBwYXJlbnQgYW5kCisgICAgICAgKiB0aHVzIHN0b3AgcGFydGljaXBhdGluZyBpbiBtb2RlbCBjaGFuZ2UgZGV0ZWN0aW9uIGFuZCBsaXN0ZW5lciBub3RpZmljYXRpb24gYnkgaW52b2tpbmcuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHtib29sZWFufSBpc29sYXRlIElmIHRydWUsIHRoZW4gdGhlIHNjb3BlIGRvZXMgbm90IHByb3RvdHlwaWNhbGx5IGluaGVyaXQgZnJvbSB0aGUKKyAgICAgICAqICAgICAgICAgcGFyZW50IHNjb3BlLiBUaGUgc2NvcGUgaXMgaXNvbGF0ZWQsIGFzIGl0IGNhbiBub3Qgc2VlIHBhcmVudCBzY29wZSBwcm9wZXJ0aWVzLgorICAgICAgICogICAgICAgICBXaGVuIGNyZWF0aW5nIHdpZGdldHMsIGl0IGlzIHVzZWZ1bCBmb3IgdGhlIHdpZGdldCB0byBub3QgYWNjaWRlbnRhbGx5IHJlYWQgcGFyZW50CisgICAgICAgKiAgICAgICAgIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7U2NvcGV9IFtwYXJlbnQ9dGhpc10gVGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIGBTY29wZWB9IHRoYXQgd2lsbCBiZSB0aGUgYCRwYXJlbnRgCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBuZXdseSBjcmVhdGVkIHNjb3BlLiBEZWZhdWx0cyB0byBgdGhpc2Agc2NvcGUgaWYgbm90IHByb3ZpZGVkLgorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRyYW5zY2x1ZGUgc2NvcGUgdG8gY29ycmVjdGx5IHBsYWNlIGl0CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBzY29wZSBoaWVyYXJjaHkgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIGNvcnJlY3QgcHJvdG90eXBpY2FsCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBuZXdseSBjcmVhdGVkIGNoaWxkIHNjb3BlLgorICAgICAgICoKKyAgICAgICAqLworICAgICAgJG5ldzogZnVuY3Rpb24oaXNvbGF0ZSwgcGFyZW50KSB7CisgICAgICAgIHZhciBjaGlsZDsKKworICAgICAgICBwYXJlbnQgPSBwYXJlbnQgfHwgdGhpczsKKworICAgICAgICBpZiAoaXNvbGF0ZSkgeworICAgICAgICAgIGNoaWxkID0gbmV3IFNjb3BlKCk7CisgICAgICAgICAgY2hpbGQuJHJvb3QgPSB0aGlzLiRyb290OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIE9ubHkgY3JlYXRlIGEgY2hpbGQgc2NvcGUgY2xhc3MgaWYgc29tZWJvZHkgYXNrcyBmb3Igb25lLAorICAgICAgICAgIC8vIGJ1dCBjYWNoZSBpdCB0byBhbGxvdyB0aGUgVk0gdG8gb3B0aW1pemUgbG9va3Vwcy4KKyAgICAgICAgICBpZiAoIXRoaXMuJCRDaGlsZFNjb3BlKSB7CisgICAgICAgICAgICB0aGlzLiQkQ2hpbGRTY29wZSA9IGZ1bmN0aW9uIENoaWxkU2NvcGUoKSB7CisgICAgICAgICAgICAgIHRoaXMuJCR3YXRjaGVycyA9IHRoaXMuJCRuZXh0U2libGluZyA9CisgICAgICAgICAgICAgICAgICB0aGlzLiQkY2hpbGRIZWFkID0gdGhpcy4kJGNoaWxkVGFpbCA9IG51bGw7CisgICAgICAgICAgICAgIHRoaXMuJCRsaXN0ZW5lcnMgPSB7fTsKKyAgICAgICAgICAgICAgdGhpcy4kJGxpc3RlbmVyQ291bnQgPSB7fTsKKyAgICAgICAgICAgICAgdGhpcy4kaWQgPSBuZXh0VWlkKCk7CisgICAgICAgICAgICAgIHRoaXMuJCRDaGlsZFNjb3BlID0gbnVsbDsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0aGlzLiQkQ2hpbGRTY29wZS5wcm90b3R5cGUgPSB0aGlzOworICAgICAgICAgIH0KKyAgICAgICAgICBjaGlsZCA9IG5ldyB0aGlzLiQkQ2hpbGRTY29wZSgpOworICAgICAgICB9CisgICAgICAgIGNoaWxkLiRwYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIGNoaWxkLiQkcHJldlNpYmxpbmcgPSBwYXJlbnQuJCRjaGlsZFRhaWw7CisgICAgICAgIGlmIChwYXJlbnQuJCRjaGlsZEhlYWQpIHsKKyAgICAgICAgICBwYXJlbnQuJCRjaGlsZFRhaWwuJCRuZXh0U2libGluZyA9IGNoaWxkOworICAgICAgICAgIHBhcmVudC4kJGNoaWxkVGFpbCA9IGNoaWxkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBhcmVudC4kJGNoaWxkSGVhZCA9IHBhcmVudC4kJGNoaWxkVGFpbCA9IGNoaWxkOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2hlbiB0aGUgbmV3IHNjb3BlIGlzIG5vdCBpc29sYXRlZCBvciB3ZSBpbmhlcml0IGZyb20gYHRoaXNgLCBhbmQKKyAgICAgICAgLy8gdGhlIHBhcmVudCBzY29wZSBpcyBkZXN0cm95ZWQsIHRoZSBwcm9wZXJ0eSBgJCRkZXN0cm95ZWRgIGlzIGluaGVyaXRlZAorICAgICAgICAvLyBwcm90b3R5cGljYWxseS4gSW4gYWxsIG90aGVyIGNhc2VzLCB0aGlzIHByb3BlcnR5IG5lZWRzIHRvIGJlIHNldAorICAgICAgICAvLyB3aGVuIHRoZSBwYXJlbnQgc2NvcGUgaXMgZGVzdHJveWVkLgorICAgICAgICAvLyBUaGUgbGlzdGVuZXIgbmVlZHMgdG8gYmUgYWRkZWQgYWZ0ZXIgdGhlIHBhcmVudCBpcyBzZXQKKyAgICAgICAgaWYgKGlzb2xhdGUgfHwgcGFyZW50ICE9IHRoaXMpIGNoaWxkLiRvbignJGRlc3Ryb3knLCBkZXN0cm95Q2hpbGQpOworCisgICAgICAgIHJldHVybiBjaGlsZDsKKworICAgICAgICBmdW5jdGlvbiBkZXN0cm95Q2hpbGQoKSB7CisgICAgICAgICAgY2hpbGQuJCRkZXN0cm95ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9LAorCisgICAgICAvKioKKyAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJHdhdGNoCisgICAgICAgKiBAa2luZCBmdW5jdGlvbgorICAgICAgICoKKyAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICogUmVnaXN0ZXJzIGEgYGxpc3RlbmVyYCBjYWxsYmFjayB0byBiZSBleGVjdXRlZCB3aGVuZXZlciB0aGUgYHdhdGNoRXhwcmVzc2lvbmAgY2hhbmdlcy4KKyAgICAgICAqCisgICAgICAgKiAtIFRoZSBgd2F0Y2hFeHByZXNzaW9uYCBpcyBjYWxsZWQgb24gZXZlcnkgY2FsbCB0byB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0CisgICAgICAgKiAgICRkaWdlc3QoKX0gYW5kIHNob3VsZCByZXR1cm4gdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB3YXRjaGVkLiAoU2luY2UKKyAgICAgICAqICAge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0KCl9IHJlcnVucyB3aGVuIGl0IGRldGVjdHMgY2hhbmdlcyB0aGUKKyAgICAgICAqICAgYHdhdGNoRXhwcmVzc2lvbmAgY2FuIGV4ZWN1dGUgbXVsdGlwbGUgdGltZXMgcGVyCisgICAgICAgKiAgIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdCgpfSBhbmQgc2hvdWxkIGJlIGlkZW1wb3RlbnQuKQorICAgICAgICogLSBUaGUgYGxpc3RlbmVyYCBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IGB3YXRjaEV4cHJlc3Npb25gIGFuZCB0aGUKKyAgICAgICAqICAgcHJldmlvdXMgY2FsbCB0byBgd2F0Y2hFeHByZXNzaW9uYCBhcmUgbm90IGVxdWFsICh3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGluaXRpYWwgcnVuLAorICAgICAgICogICBzZWUgYmVsb3cpLiBJbmVxdWFsaXR5IGlzIGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHJlZmVyZW5jZSBpbmVxdWFsaXR5LAorICAgICAgICogICBbc3RyaWN0IGNvbXBhcmlzb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9Db21wYXJpc29uX09wZXJhdG9ycykKKyAgICAgICAqICAgIHZpYSB0aGUgYCE9PWAgSmF2YXNjcmlwdCBvcGVyYXRvciwgdW5sZXNzIGBvYmplY3RFcXVhbGl0eSA9PSB0cnVlYAorICAgICAgICogICAoc2VlIG5leHQgcG9pbnQpCisgICAgICAgKiAtIFdoZW4gYG9iamVjdEVxdWFsaXR5ID09IHRydWVgLCBpbmVxdWFsaXR5IG9mIHRoZSBgd2F0Y2hFeHByZXNzaW9uYCBpcyBkZXRlcm1pbmVkCisgICAgICAgKiAgIGFjY29yZGluZyB0byB0aGUge0BsaW5rIGFuZ3VsYXIuZXF1YWxzfSBmdW5jdGlvbi4gVG8gc2F2ZSB0aGUgdmFsdWUgb2YgdGhlIG9iamVjdCBmb3IKKyAgICAgICAqICAgbGF0ZXIgY29tcGFyaXNvbiwgdGhlIHtAbGluayBhbmd1bGFyLmNvcHl9IGZ1bmN0aW9uIGlzIHVzZWQuIFRoaXMgdGhlcmVmb3JlIG1lYW5zIHRoYXQKKyAgICAgICAqICAgd2F0Y2hpbmcgY29tcGxleCBvYmplY3RzIHdpbGwgaGF2ZSBhZHZlcnNlIG1lbW9yeSBhbmQgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLgorICAgICAgICogLSBUaGUgd2F0Y2ggYGxpc3RlbmVyYCBtYXkgY2hhbmdlIHRoZSBtb2RlbCwgd2hpY2ggbWF5IHRyaWdnZXIgb3RoZXIgYGxpc3RlbmVyYHMgdG8gZmlyZS4KKyAgICAgICAqICAgVGhpcyBpcyBhY2hpZXZlZCBieSByZXJ1bm5pbmcgdGhlIHdhdGNoZXJzIHVudGlsIG5vIGNoYW5nZXMgYXJlIGRldGVjdGVkLiBUaGUgcmVydW4KKyAgICAgICAqICAgaXRlcmF0aW9uIGxpbWl0IGlzIDEwIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBkZWFkbG9jay4KKyAgICAgICAqCisgICAgICAgKgorICAgICAgICogSWYgeW91IHdhbnQgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0fSBpcyBjYWxsZWQsCisgICAgICAgKiB5b3UgY2FuIHJlZ2lzdGVyIGEgYHdhdGNoRXhwcmVzc2lvbmAgZnVuY3Rpb24gd2l0aCBubyBgbGlzdGVuZXJgLiAoU2luY2UgYHdhdGNoRXhwcmVzc2lvbmAKKyAgICAgICAqIGNhbiBleGVjdXRlIG11bHRpcGxlIHRpbWVzIHBlciB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3R9IGN5Y2xlIHdoZW4gYQorICAgICAgICogY2hhbmdlIGlzIGRldGVjdGVkLCBiZSBwcmVwYXJlZCBmb3IgbXVsdGlwbGUgY2FsbHMgdG8geW91ciBsaXN0ZW5lci4pCisgICAgICAgKgorICAgICAgICogQWZ0ZXIgYSB3YXRjaGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2NvcGUsIHRoZSBgbGlzdGVuZXJgIGZuIGlzIGNhbGxlZCBhc3luY2hyb25vdXNseQorICAgICAgICogKHZpYSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZXZhbEFzeW5jICRldmFsQXN5bmN9KSB0byBpbml0aWFsaXplIHRoZQorICAgICAgICogd2F0Y2hlci4gSW4gcmFyZSBjYXNlcywgdGhpcyBpcyB1bmRlc2lyYWJsZSBiZWNhdXNlIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQgd2hlbiB0aGUgcmVzdWx0CisgICAgICAgKiBvZiBgd2F0Y2hFeHByZXNzaW9uYCBkaWRuJ3QgY2hhbmdlLiBUbyBkZXRlY3QgdGhpcyBzY2VuYXJpbyB3aXRoaW4gdGhlIGBsaXN0ZW5lcmAgZm4sIHlvdQorICAgICAgICogY2FuIGNvbXBhcmUgdGhlIGBuZXdWYWxgIGFuZCBgb2xkVmFsYC4gSWYgdGhlc2UgdHdvIHZhbHVlcyBhcmUgaWRlbnRpY2FsIChgPT09YCkgdGhlbiB0aGUKKyAgICAgICAqIGxpc3RlbmVyIHdhcyBjYWxsZWQgZHVlIHRvIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqCisgICAgICAgKgorICAgICAgICogIyBFeGFtcGxlCisgICAgICAgKiBgYGBqcworICAgICAgICAgICAvLyBsZXQncyBhc3N1bWUgdGhhdCBzY29wZSB3YXMgZGVwZW5kZW5jeSBpbmplY3RlZCBhcyB0aGUgJHJvb3RTY29wZQorICAgICAgICAgICB2YXIgc2NvcGUgPSAkcm9vdFNjb3BlOworICAgICAgICAgICBzY29wZS5uYW1lID0gJ21pc2tvJzsKKyAgICAgICAgICAgc2NvcGUuY291bnRlciA9IDA7CisKKyAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMCk7CisgICAgICAgICAgIHNjb3BlLiR3YXRjaCgnbmFtZScsIGZ1bmN0aW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgeworICAgICAgICAgICAgIHNjb3BlLmNvdW50ZXIgPSBzY29wZS5jb3VudGVyICsgMTsKKyAgICAgICAgICAgfSk7CisgICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDApOworCisgICAgICAgICAgIHNjb3BlLiRkaWdlc3QoKTsKKyAgICAgICAgICAgLy8gdGhlIGxpc3RlbmVyIGlzIGFsd2F5cyBjYWxsZWQgZHVyaW5nIHRoZSBmaXJzdCAkZGlnZXN0IGxvb3AgYWZ0ZXIgaXQgd2FzIHJlZ2lzdGVyZWQKKyAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMSk7CisKKyAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpOworICAgICAgICAgICAvLyBidXQgbm93IGl0IHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgdGhlIHZhbHVlIGNoYW5nZXMKKyAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMSk7CisKKyAgICAgICAgICAgc2NvcGUubmFtZSA9ICdhZGFtJzsKKyAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpOworICAgICAgICAgICBleHBlY3Qoc2NvcGUuY291bnRlcikudG9FcXVhbCgyKTsKKworCisKKyAgICAgICAgICAgLy8gVXNpbmcgYSBmdW5jdGlvbiBhcyBhIHdhdGNoRXhwcmVzc2lvbgorICAgICAgICAgICB2YXIgZm9vZDsKKyAgICAgICAgICAgc2NvcGUuZm9vZENvdW50ZXIgPSAwOworICAgICAgICAgICBleHBlY3Qoc2NvcGUuZm9vZENvdW50ZXIpLnRvRXF1YWwoMCk7CisgICAgICAgICAgIHNjb3BlLiR3YXRjaCgKKyAgICAgICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIGJlaW5nIHdhdGNoZWQuIEl0IGlzIGNhbGxlZCBmb3IgZWFjaCB0dXJuIG9mIHRoZSAkZGlnZXN0IGxvb3AKKyAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIGZvb2Q7IH0sCisgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2hhbmdlIGxpc3RlbmVyLCBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgYWJvdmUgZnVuY3Rpb24gY2hhbmdlcworICAgICAgICAgICAgIGZ1bmN0aW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgeworICAgICAgICAgICAgICAgaWYgKCBuZXdWYWx1ZSAhPT0gb2xkVmFsdWUgKSB7CisgICAgICAgICAgICAgICAgIC8vIE9ubHkgaW5jcmVtZW50IHRoZSBjb3VudGVyIGlmIHRoZSB2YWx1ZSBjaGFuZ2VkCisgICAgICAgICAgICAgICAgIHNjb3BlLmZvb2RDb3VudGVyID0gc2NvcGUuZm9vZENvdW50ZXIgKyAxOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgKTsKKyAgICAgICAgICAgLy8gTm8gZGlnZXN0IGhhcyBiZWVuIHJ1biBzbyB0aGUgY291bnRlciB3aWxsIGJlIHplcm8KKyAgICAgICAgICAgZXhwZWN0KHNjb3BlLmZvb2RDb3VudGVyKS50b0VxdWFsKDApOworCisgICAgICAgICAgIC8vIFJ1biB0aGUgZGlnZXN0IGJ1dCBzaW5jZSBmb29kIGhhcyBub3QgY2hhbmdlZCBjb3VudCB3aWxsIHN0aWxsIGJlIHplcm8KKyAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpOworICAgICAgICAgICBleHBlY3Qoc2NvcGUuZm9vZENvdW50ZXIpLnRvRXF1YWwoMCk7CisKKyAgICAgICAgICAgLy8gVXBkYXRlIGZvb2QgYW5kIHJ1biBkaWdlc3QuICBOb3cgdGhlIGNvdW50ZXIgd2lsbCBpbmNyZW1lbnQKKyAgICAgICAgICAgZm9vZCA9ICdjaGVlc2VidXJnZXInOworICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7CisgICAgICAgICAgIGV4cGVjdChzY29wZS5mb29kQ291bnRlcikudG9FcXVhbCgxKTsKKworICAgICAgICogYGBgCisgICAgICAgKgorICAgICAgICoKKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0geyhmdW5jdGlvbigpfHN0cmluZyl9IHdhdGNoRXhwcmVzc2lvbiBFeHByZXNzaW9uIHRoYXQgaXMgZXZhbHVhdGVkIG9uIGVhY2gKKyAgICAgICAqICAgIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdH0gY3ljbGUuIEEgY2hhbmdlIGluIHRoZSByZXR1cm4gdmFsdWUgdHJpZ2dlcnMKKyAgICAgICAqICAgIGEgY2FsbCB0byB0aGUgYGxpc3RlbmVyYC4KKyAgICAgICAqCisgICAgICAgKiAgICAtIGBzdHJpbmdgOiBFdmFsdWF0ZWQgYXMge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0KKyAgICAgICAqICAgIC0gYGZ1bmN0aW9uKHNjb3BlKWA6IGNhbGxlZCB3aXRoIGN1cnJlbnQgYHNjb3BlYCBhcyBhIHBhcmFtZXRlci4KKyAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3VmFsLCBvbGRWYWwsIHNjb3BlKX0gbGlzdGVuZXIgQ2FsbGJhY2sgY2FsbGVkIHdoZW5ldmVyIHRoZSB2YWx1ZQorICAgICAgICogICAgb2YgYHdhdGNoRXhwcmVzc2lvbmAgY2hhbmdlcy4KKyAgICAgICAqCisgICAgICAgKiAgICAtIGBuZXdWYWxgIGNvbnRhaW5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBgd2F0Y2hFeHByZXNzaW9uYAorICAgICAgICogICAgLSBgb2xkVmFsYCBjb250YWlucyB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGB3YXRjaEV4cHJlc3Npb25gCisgICAgICAgKiAgICAtIGBzY29wZWAgcmVmZXJzIHRvIHRoZSBjdXJyZW50IHNjb3BlCisgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBvYmplY3RFcXVhbGl0eSBDb21wYXJlIGZvciBvYmplY3QgZXF1YWxpdHkgdXNpbmcge0BsaW5rIGFuZ3VsYXIuZXF1YWxzfSBpbnN0ZWFkIG9mCisgICAgICAgKiAgICAgY29tcGFyaW5nIGZvciByZWZlcmVuY2UgZXF1YWxpdHkuCisgICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gUmV0dXJucyBhIGRlcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIGxpc3RlbmVyLgorICAgICAgICovCisgICAgICAkd2F0Y2g6IGZ1bmN0aW9uKHdhdGNoRXhwLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHkpIHsKKyAgICAgICAgdmFyIGdldCA9ICRwYXJzZSh3YXRjaEV4cCk7CisKKyAgICAgICAgaWYgKGdldC4kJHdhdGNoRGVsZWdhdGUpIHsKKyAgICAgICAgICByZXR1cm4gZ2V0LiQkd2F0Y2hEZWxlZ2F0ZSh0aGlzLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIGdldCk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIHNjb3BlID0gdGhpcywKKyAgICAgICAgICAgIGFycmF5ID0gc2NvcGUuJCR3YXRjaGVycywKKyAgICAgICAgICAgIHdhdGNoZXIgPSB7CisgICAgICAgICAgICAgIGZuOiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgbGFzdDogaW5pdFdhdGNoVmFsLAorICAgICAgICAgICAgICBnZXQ6IGdldCwKKyAgICAgICAgICAgICAgZXhwOiB3YXRjaEV4cCwKKyAgICAgICAgICAgICAgZXE6ICEhb2JqZWN0RXF1YWxpdHkKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgbGFzdERpcnR5V2F0Y2ggPSBudWxsOworCisgICAgICAgIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpIHsKKyAgICAgICAgICB3YXRjaGVyLmZuID0gbm9vcDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYXJyYXkpIHsKKyAgICAgICAgICBhcnJheSA9IHNjb3BlLiQkd2F0Y2hlcnMgPSBbXTsKKyAgICAgICAgfQorICAgICAgICAvLyB3ZSB1c2UgdW5zaGlmdCBzaW5jZSB3ZSB1c2UgYSB3aGlsZSBsb29wIGluICRkaWdlc3QgZm9yIHNwZWVkLgorICAgICAgICAvLyB0aGUgd2hpbGUgbG9vcCByZWFkcyBpbiByZXZlcnNlIG9yZGVyLgorICAgICAgICBhcnJheS51bnNoaWZ0KHdhdGNoZXIpOworCisgICAgICAgIHJldHVybiBmdW5jdGlvbiBkZXJlZ2lzdGVyV2F0Y2goKSB7CisgICAgICAgICAgYXJyYXlSZW1vdmUoYXJyYXksIHdhdGNoZXIpOworICAgICAgICAgIGxhc3REaXJ0eVdhdGNoID0gbnVsbDsKKyAgICAgICAgfTsKKyAgICAgIH0sCisKKyAgICAgIC8qKgorICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkd2F0Y2hHcm91cAorICAgICAgICogQGtpbmQgZnVuY3Rpb24KKyAgICAgICAqCisgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAqIEEgdmFyaWFudCBvZiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggJHdhdGNoKCl9IHdoZXJlIGl0IHdhdGNoZXMgYW4gYXJyYXkgb2YgYHdhdGNoRXhwcmVzc2lvbnNgLgorICAgICAgICogSWYgYW55IG9uZSBleHByZXNzaW9uIGluIHRoZSBjb2xsZWN0aW9uIGNoYW5nZXMgdGhlIGBsaXN0ZW5lcmAgaXMgZXhlY3V0ZWQuCisgICAgICAgKgorICAgICAgICogLSBUaGUgaXRlbXMgaW4gdGhlIGB3YXRjaEV4cHJlc3Npb25zYCBhcnJheSBhcmUgb2JzZXJ2ZWQgdmlhIHN0YW5kYXJkICR3YXRjaCBvcGVyYXRpb24gYW5kIGFyZSBleGFtaW5lZCBvbiBldmVyeQorICAgICAgICogICBjYWxsIHRvICRkaWdlc3QoKSB0byBzZWUgaWYgYW55IGl0ZW1zIGNoYW5nZXMuCisgICAgICAgKiAtIFRoZSBgbGlzdGVuZXJgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgZXhwcmVzc2lvbiBpbiB0aGUgYHdhdGNoRXhwcmVzc2lvbnNgIGFycmF5IGNoYW5nZXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nfEZ1bmN0aW9uKHNjb3BlKT59IHdhdGNoRXhwcmVzc2lvbnMgQXJyYXkgb2YgZXhwcmVzc2lvbnMgdGhhdCB3aWxsIGJlIGluZGl2aWR1YWxseQorICAgICAgICogd2F0Y2hlZCB1c2luZyB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggJHdhdGNoKCl9CisgICAgICAgKgorICAgICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXdWYWx1ZXMsIG9sZFZhbHVlcywgc2NvcGUpfSBsaXN0ZW5lciBDYWxsYmFjayBjYWxsZWQgd2hlbmV2ZXIgdGhlIHJldHVybiB2YWx1ZSBvZiBhbnkKKyAgICAgICAqICAgIGV4cHJlc3Npb24gaW4gYHdhdGNoRXhwcmVzc2lvbnNgIGNoYW5nZXMKKyAgICAgICAqICAgIFRoZSBgbmV3VmFsdWVzYCBhcnJheSBjb250YWlucyB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIGB3YXRjaEV4cHJlc3Npb25zYCwgd2l0aCB0aGUgaW5kZXhlcyBtYXRjaGluZworICAgICAgICogICAgdGhvc2Ugb2YgYHdhdGNoRXhwcmVzc2lvbmAKKyAgICAgICAqICAgIGFuZCB0aGUgYG9sZFZhbHVlc2AgYXJyYXkgY29udGFpbnMgdGhlIHByZXZpb3VzIHZhbHVlcyBvZiB0aGUgYHdhdGNoRXhwcmVzc2lvbnNgLCB3aXRoIHRoZSBpbmRleGVzIG1hdGNoaW5nCisgICAgICAgKiAgICB0aG9zZSBvZiBgd2F0Y2hFeHByZXNzaW9uYAorICAgICAgICogICAgVGhlIGBzY29wZWAgcmVmZXJzIHRvIHRoZSBjdXJyZW50IHNjb3BlLgorICAgICAgICogQHJldHVybnMge2Z1bmN0aW9uKCl9IFJldHVybnMgYSBkZS1yZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIGFsbCBsaXN0ZW5lcnMuCisgICAgICAgKi8KKyAgICAgICR3YXRjaEdyb3VwOiBmdW5jdGlvbih3YXRjaEV4cHJlc3Npb25zLCBsaXN0ZW5lcikgeworICAgICAgICB2YXIgb2xkVmFsdWVzID0gbmV3IEFycmF5KHdhdGNoRXhwcmVzc2lvbnMubGVuZ3RoKTsKKyAgICAgICAgdmFyIG5ld1ZhbHVlcyA9IG5ldyBBcnJheSh3YXRjaEV4cHJlc3Npb25zLmxlbmd0aCk7CisgICAgICAgIHZhciBkZXJlZ2lzdGVyRm5zID0gW107CisgICAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgICAgdmFyIGNoYW5nZVJlYWN0aW9uU2NoZWR1bGVkID0gZmFsc2U7CisgICAgICAgIHZhciBmaXJzdFJ1biA9IHRydWU7CisKKyAgICAgICAgaWYgKCF3YXRjaEV4cHJlc3Npb25zLmxlbmd0aCkgeworICAgICAgICAgIC8vIE5vIGV4cHJlc3Npb25zIG1lYW5zIHdlIGNhbGwgdGhlIGxpc3RlbmVyIEFTQVAKKyAgICAgICAgICB2YXIgc2hvdWxkQ2FsbCA9IHRydWU7CisgICAgICAgICAgc2VsZi4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgaWYgKHNob3VsZENhbGwpIGxpc3RlbmVyKG5ld1ZhbHVlcywgbmV3VmFsdWVzLCBzZWxmKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gZGVyZWdpc3RlcldhdGNoR3JvdXAoKSB7CisgICAgICAgICAgICBzaG91bGRDYWxsID0gZmFsc2U7CisgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3YXRjaEV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMSkgeworICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBzaXplIG9mIG9uZQorICAgICAgICAgIHJldHVybiB0aGlzLiR3YXRjaCh3YXRjaEV4cHJlc3Npb25zWzBdLCBmdW5jdGlvbiB3YXRjaEdyb3VwQWN0aW9uKHZhbHVlLCBvbGRWYWx1ZSwgc2NvcGUpIHsKKyAgICAgICAgICAgIG5ld1ZhbHVlc1swXSA9IHZhbHVlOworICAgICAgICAgICAgb2xkVmFsdWVzWzBdID0gb2xkVmFsdWU7CisgICAgICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZXMsICh2YWx1ZSA9PT0gb2xkVmFsdWUpID8gbmV3VmFsdWVzIDogb2xkVmFsdWVzLCBzY29wZSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBmb3JFYWNoKHdhdGNoRXhwcmVzc2lvbnMsIGZ1bmN0aW9uKGV4cHIsIGkpIHsKKyAgICAgICAgICB2YXIgdW53YXRjaEZuID0gc2VsZi4kd2F0Y2goZXhwciwgZnVuY3Rpb24gd2F0Y2hHcm91cFN1YkFjdGlvbih2YWx1ZSwgb2xkVmFsdWUpIHsKKyAgICAgICAgICAgIG5ld1ZhbHVlc1tpXSA9IHZhbHVlOworICAgICAgICAgICAgb2xkVmFsdWVzW2ldID0gb2xkVmFsdWU7CisgICAgICAgICAgICBpZiAoIWNoYW5nZVJlYWN0aW9uU2NoZWR1bGVkKSB7CisgICAgICAgICAgICAgIGNoYW5nZVJlYWN0aW9uU2NoZWR1bGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgc2VsZi4kZXZhbEFzeW5jKHdhdGNoR3JvdXBBY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICAgIGRlcmVnaXN0ZXJGbnMucHVzaCh1bndhdGNoRm4pOworICAgICAgICB9KTsKKworICAgICAgICBmdW5jdGlvbiB3YXRjaEdyb3VwQWN0aW9uKCkgeworICAgICAgICAgIGNoYW5nZVJlYWN0aW9uU2NoZWR1bGVkID0gZmFsc2U7CisKKyAgICAgICAgICBpZiAoZmlyc3RSdW4pIHsKKyAgICAgICAgICAgIGZpcnN0UnVuID0gZmFsc2U7CisgICAgICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZXMsIG5ld1ZhbHVlcywgc2VsZik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpc3RlbmVyKG5ld1ZhbHVlcywgb2xkVmFsdWVzLCBzZWxmKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZnVuY3Rpb24gZGVyZWdpc3RlcldhdGNoR3JvdXAoKSB7CisgICAgICAgICAgd2hpbGUgKGRlcmVnaXN0ZXJGbnMubGVuZ3RoKSB7CisgICAgICAgICAgICBkZXJlZ2lzdGVyRm5zLnNoaWZ0KCkoKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICB9LAorCisKKyAgICAgIC8qKgorICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkd2F0Y2hDb2xsZWN0aW9uCisgICAgICAgKiBAa2luZCBmdW5jdGlvbgorICAgICAgICoKKyAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICogU2hhbGxvdyB3YXRjaGVzIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhbmQgZmlyZXMgd2hlbmV2ZXIgYW55IG9mIHRoZSBwcm9wZXJ0aWVzIGNoYW5nZQorICAgICAgICogKGZvciBhcnJheXMsIHRoaXMgaW1wbGllcyB3YXRjaGluZyB0aGUgYXJyYXkgaXRlbXM7IGZvciBvYmplY3QgbWFwcywgdGhpcyBpbXBsaWVzIHdhdGNoaW5nCisgICAgICAgKiB0aGUgcHJvcGVydGllcykuIElmIGEgY2hhbmdlIGlzIGRldGVjdGVkLCB0aGUgYGxpc3RlbmVyYCBjYWxsYmFjayBpcyBmaXJlZC4KKyAgICAgICAqCisgICAgICAgKiAtIFRoZSBgb2JqYCBjb2xsZWN0aW9uIGlzIG9ic2VydmVkIHZpYSBzdGFuZGFyZCAkd2F0Y2ggb3BlcmF0aW9uIGFuZCBpcyBleGFtaW5lZCBvbiBldmVyeQorICAgICAgICogICBjYWxsIHRvICRkaWdlc3QoKSB0byBzZWUgaWYgYW55IGl0ZW1zIGhhdmUgYmVlbiBhZGRlZCwgcmVtb3ZlZCwgb3IgbW92ZWQuCisgICAgICAgKiAtIFRoZSBgbGlzdGVuZXJgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnl0aGluZyB3aXRoaW4gdGhlIGBvYmpgIGhhcyBjaGFuZ2VkLiBFeGFtcGxlcyBpbmNsdWRlCisgICAgICAgKiAgIGFkZGluZywgcmVtb3ZpbmcsIGFuZCBtb3ZpbmcgaXRlbXMgYmVsb25naW5nIHRvIGFuIG9iamVjdCBvciBhcnJheS4KKyAgICAgICAqCisgICAgICAgKgorICAgICAgICogIyBFeGFtcGxlCisgICAgICAgKiBgYGBqcworICAgICAgICAgICRzY29wZS5uYW1lcyA9IFsnaWdvcicsICdtYXRpYXMnLCAnbWlza28nLCAnamFtZXMnXTsKKyAgICAgICAgICAkc2NvcGUuZGF0YUNvdW50ID0gNDsKKworICAgICAgICAgICRzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCduYW1lcycsIGZ1bmN0aW9uKG5ld05hbWVzLCBvbGROYW1lcykgeworICAgICAgICAgICAgJHNjb3BlLmRhdGFDb3VudCA9IG5ld05hbWVzLmxlbmd0aDsKKyAgICAgICAgICB9KTsKKworICAgICAgICAgIGV4cGVjdCgkc2NvcGUuZGF0YUNvdW50KS50b0VxdWFsKDQpOworICAgICAgICAgICRzY29wZS4kZGlnZXN0KCk7CisKKyAgICAgICAgICAvL3N0aWxsIGF0IDQgLi4uIG5vIGNoYW5nZXMKKyAgICAgICAgICBleHBlY3QoJHNjb3BlLmRhdGFDb3VudCkudG9FcXVhbCg0KTsKKworICAgICAgICAgICRzY29wZS5uYW1lcy5wb3AoKTsKKyAgICAgICAgICAkc2NvcGUuJGRpZ2VzdCgpOworCisgICAgICAgICAgLy9ub3cgdGhlcmUncyBiZWVuIGEgY2hhbmdlCisgICAgICAgICAgZXhwZWN0KCRzY29wZS5kYXRhQ291bnQpLnRvRXF1YWwoMyk7CisgICAgICAgKiBgYGAKKyAgICAgICAqCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oc2NvcGUpfSBvYmogRXZhbHVhdGVkIGFzIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259LiBUaGUKKyAgICAgICAqICAgIGV4cHJlc3Npb24gdmFsdWUgc2hvdWxkIGV2YWx1YXRlIHRvIGFuIG9iamVjdCBvciBhbiBhcnJheSB3aGljaCBpcyBvYnNlcnZlZCBvbiBlYWNoCisgICAgICAgKiAgICB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3R9IGN5Y2xlLiBBbnkgc2hhbGxvdyBjaGFuZ2Ugd2l0aGluIHRoZQorICAgICAgICogICAgY29sbGVjdGlvbiB3aWxsIHRyaWdnZXIgYSBjYWxsIHRvIHRoZSBgbGlzdGVuZXJgLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3Q29sbGVjdGlvbiwgb2xkQ29sbGVjdGlvbiwgc2NvcGUpfSBsaXN0ZW5lciBhIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZAorICAgICAgICogICAgd2hlbiBhIGNoYW5nZSBpcyBkZXRlY3RlZC4KKyAgICAgICAqICAgIC0gVGhlIGBuZXdDb2xsZWN0aW9uYCBvYmplY3QgaXMgdGhlIG5ld2x5IG1vZGlmaWVkIGRhdGEgb2J0YWluZWQgZnJvbSB0aGUgYG9iamAgZXhwcmVzc2lvbgorICAgICAgICogICAgLSBUaGUgYG9sZENvbGxlY3Rpb25gIG9iamVjdCBpcyBhIGNvcHkgb2YgdGhlIGZvcm1lciBjb2xsZWN0aW9uIGRhdGEuCisgICAgICAgKiAgICAgIER1ZSB0byBwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9ucywgdGhlYG9sZENvbGxlY3Rpb25gIHZhbHVlIGlzIGNvbXB1dGVkIG9ubHkgaWYgdGhlCisgICAgICAgKiAgICAgIGBsaXN0ZW5lcmAgZnVuY3Rpb24gZGVjbGFyZXMgdHdvIG9yIG1vcmUgYXJndW1lbnRzLgorICAgICAgICogICAgLSBUaGUgYHNjb3BlYCBhcmd1bWVudCByZWZlcnMgdG8gdGhlIGN1cnJlbnQgc2NvcGUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMge2Z1bmN0aW9uKCl9IFJldHVybnMgYSBkZS1yZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHRoaXMgbGlzdGVuZXIuIFdoZW4gdGhlCisgICAgICAgKiAgICBkZS1yZWdpc3RyYXRpb24gZnVuY3Rpb24gaXMgZXhlY3V0ZWQsIHRoZSBpbnRlcm5hbCB3YXRjaCBvcGVyYXRpb24gaXMgdGVybWluYXRlZC4KKyAgICAgICAqLworICAgICAgJHdhdGNoQ29sbGVjdGlvbjogZnVuY3Rpb24ob2JqLCBsaXN0ZW5lcikgeworICAgICAgICAkd2F0Y2hDb2xsZWN0aW9uSW50ZXJjZXB0b3IuJHN0YXRlZnVsID0gdHJ1ZTsKKworICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgICAgIC8vIHRoZSBjdXJyZW50IHZhbHVlLCB1cGRhdGVkIG9uIGVhY2ggZGlydHktY2hlY2sgcnVuCisgICAgICAgIHZhciBuZXdWYWx1ZTsKKyAgICAgICAgLy8gYSBzaGFsbG93IGNvcHkgb2YgdGhlIG5ld1ZhbHVlIGZyb20gdGhlIGxhc3QgZGlydHktY2hlY2sgcnVuLAorICAgICAgICAvLyB1cGRhdGVkIHRvIG1hdGNoIG5ld1ZhbHVlIGR1cmluZyBkaXJ0eS1jaGVjayBydW4KKyAgICAgICAgdmFyIG9sZFZhbHVlOworICAgICAgICAvLyBhIHNoYWxsb3cgY29weSBvZiB0aGUgbmV3VmFsdWUgZnJvbSB3aGVuIHRoZSBsYXN0IGNoYW5nZSBoYXBwZW5lZAorICAgICAgICB2YXIgdmVyeU9sZFZhbHVlOworICAgICAgICAvLyBvbmx5IHRyYWNrIHZlcnlPbGRWYWx1ZSBpZiB0aGUgbGlzdGVuZXIgaXMgYXNraW5nIGZvciBpdAorICAgICAgICB2YXIgdHJhY2tWZXJ5T2xkVmFsdWUgPSAobGlzdGVuZXIubGVuZ3RoID4gMSk7CisgICAgICAgIHZhciBjaGFuZ2VEZXRlY3RlZCA9IDA7CisgICAgICAgIHZhciBjaGFuZ2VEZXRlY3RvciA9ICRwYXJzZShvYmosICR3YXRjaENvbGxlY3Rpb25JbnRlcmNlcHRvcik7CisgICAgICAgIHZhciBpbnRlcm5hbEFycmF5ID0gW107CisgICAgICAgIHZhciBpbnRlcm5hbE9iamVjdCA9IHt9OworICAgICAgICB2YXIgaW5pdFJ1biA9IHRydWU7CisgICAgICAgIHZhciBvbGRMZW5ndGggPSAwOworCisgICAgICAgIGZ1bmN0aW9uICR3YXRjaENvbGxlY3Rpb25JbnRlcmNlcHRvcihfdmFsdWUpIHsKKyAgICAgICAgICBuZXdWYWx1ZSA9IF92YWx1ZTsKKyAgICAgICAgICB2YXIgbmV3TGVuZ3RoLCBrZXksIGJvdGhOYU4sIG5ld0l0ZW0sIG9sZEl0ZW07CisKKyAgICAgICAgICAvLyBJZiB0aGUgbmV3IHZhbHVlIGlzIHVuZGVmaW5lZCwgdGhlbiByZXR1cm4gdW5kZWZpbmVkIGFzIHRoZSB3YXRjaCBtYXkgYmUgYSBvbmUtdGltZSB3YXRjaAorICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChuZXdWYWx1ZSkpIHJldHVybjsKKworICAgICAgICAgIGlmICghaXNPYmplY3QobmV3VmFsdWUpKSB7IC8vIGlmIHByaW1pdGl2ZQorICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICBvbGRWYWx1ZSA9IG5ld1ZhbHVlOworICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheUxpa2UobmV3VmFsdWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IGludGVybmFsQXJyYXkpIHsKKyAgICAgICAgICAgICAgLy8gd2UgYXJlIHRyYW5zaXRpb25pbmcgZnJvbSBzb21ldGhpbmcgd2hpY2ggd2FzIG5vdCBhbiBhcnJheSBpbnRvIGFycmF5LgorICAgICAgICAgICAgICBvbGRWYWx1ZSA9IGludGVybmFsQXJyYXk7CisgICAgICAgICAgICAgIG9sZExlbmd0aCA9IG9sZFZhbHVlLmxlbmd0aCA9IDA7CisgICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5ld0xlbmd0aCA9IG5ld1ZhbHVlLmxlbmd0aDsKKworICAgICAgICAgICAgaWYgKG9sZExlbmd0aCAhPT0gbmV3TGVuZ3RoKSB7CisgICAgICAgICAgICAgIC8vIGlmIGxlbmd0aHMgZG8gbm90IG1hdGNoIHdlIG5lZWQgdG8gdHJpZ2dlciBjaGFuZ2Ugbm90aWZpY2F0aW9uCisgICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7CisgICAgICAgICAgICAgIG9sZFZhbHVlLmxlbmd0aCA9IG9sZExlbmd0aCA9IG5ld0xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIGl0ZW1zIHRvIG9sZFZhbHVlIGFuZCBsb29rIGZvciBjaGFuZ2VzLgorICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICBvbGRJdGVtID0gb2xkVmFsdWVbaV07CisgICAgICAgICAgICAgIG5ld0l0ZW0gPSBuZXdWYWx1ZVtpXTsKKworICAgICAgICAgICAgICBib3RoTmFOID0gKG9sZEl0ZW0gIT09IG9sZEl0ZW0pICYmIChuZXdJdGVtICE9PSBuZXdJdGVtKTsKKyAgICAgICAgICAgICAgaWYgKCFib3RoTmFOICYmIChvbGRJdGVtICE9PSBuZXdJdGVtKSkgeworICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7CisgICAgICAgICAgICAgICAgb2xkVmFsdWVbaV0gPSBuZXdJdGVtOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gaW50ZXJuYWxPYmplY3QpIHsKKyAgICAgICAgICAgICAgLy8gd2UgYXJlIHRyYW5zaXRpb25pbmcgZnJvbSBzb21ldGhpbmcgd2hpY2ggd2FzIG5vdCBhbiBvYmplY3QgaW50byBvYmplY3QuCisgICAgICAgICAgICAgIG9sZFZhbHVlID0gaW50ZXJuYWxPYmplY3QgPSB7fTsKKyAgICAgICAgICAgICAgb2xkTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIGl0ZW1zIHRvIG9sZFZhbHVlIGFuZCBsb29rIGZvciBjaGFuZ2VzLgorICAgICAgICAgICAgbmV3TGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGZvciAoa2V5IGluIG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CisgICAgICAgICAgICAgICAgbmV3TGVuZ3RoKys7CisgICAgICAgICAgICAgICAgbmV3SXRlbSA9IG5ld1ZhbHVlW2tleV07CisgICAgICAgICAgICAgICAgb2xkSXRlbSA9IG9sZFZhbHVlW2tleV07CisKKyAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG9sZFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICBib3RoTmFOID0gKG9sZEl0ZW0gIT09IG9sZEl0ZW0pICYmIChuZXdJdGVtICE9PSBuZXdJdGVtKTsKKyAgICAgICAgICAgICAgICAgIGlmICghYm90aE5hTiAmJiAob2xkSXRlbSAhPT0gbmV3SXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWVba2V5XSA9IG5ld0l0ZW07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIG9sZExlbmd0aCsrOworICAgICAgICAgICAgICAgICAgb2xkVmFsdWVba2V5XSA9IG5ld0l0ZW07CisgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9sZExlbmd0aCA+IG5ld0xlbmd0aCkgeworICAgICAgICAgICAgICAvLyB3ZSB1c2VkIHRvIGhhdmUgbW9yZSBrZXlzLCBuZWVkIHRvIGZpbmQgdGhlbSBhbmQgZGVzdHJveSB0aGVtLgorICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrOworICAgICAgICAgICAgICBmb3IgKGtleSBpbiBvbGRWYWx1ZSkgeworICAgICAgICAgICAgICAgIGlmICghbmV3VmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSkgeworICAgICAgICAgICAgICAgICAgb2xkTGVuZ3RoLS07CisgICAgICAgICAgICAgICAgICBkZWxldGUgb2xkVmFsdWVba2V5XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIGNoYW5nZURldGVjdGVkOworICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gJHdhdGNoQ29sbGVjdGlvbkFjdGlvbigpIHsKKyAgICAgICAgICBpZiAoaW5pdFJ1bikgeworICAgICAgICAgICAgaW5pdFJ1biA9IGZhbHNlOworICAgICAgICAgICAgbGlzdGVuZXIobmV3VmFsdWUsIG5ld1ZhbHVlLCBzZWxmKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGlzdGVuZXIobmV3VmFsdWUsIHZlcnlPbGRWYWx1ZSwgc2VsZik7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgZm9yIHRoZSBuZXh0IHRpbWUgYSBjb2xsZWN0aW9uIGlzIGNoYW5nZWQKKyAgICAgICAgICBpZiAodHJhY2tWZXJ5T2xkVmFsdWUpIHsKKyAgICAgICAgICAgIGlmICghaXNPYmplY3QobmV3VmFsdWUpKSB7CisgICAgICAgICAgICAgIC8vcHJpbWl0aXZlCisgICAgICAgICAgICAgIHZlcnlPbGRWYWx1ZSA9IG5ld1ZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5TGlrZShuZXdWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgdmVyeU9sZFZhbHVlID0gbmV3IEFycmF5KG5ld1ZhbHVlLmxlbmd0aCk7CisgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3VmFsdWUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB2ZXJ5T2xkVmFsdWVbaV0gPSBuZXdWYWx1ZVtpXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gaWYgb2JqZWN0CisgICAgICAgICAgICAgIHZlcnlPbGRWYWx1ZSA9IHt9OworICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gbmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChuZXdWYWx1ZSwga2V5KSkgeworICAgICAgICAgICAgICAgICAgdmVyeU9sZFZhbHVlW2tleV0gPSBuZXdWYWx1ZVtrZXldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzLiR3YXRjaChjaGFuZ2VEZXRlY3RvciwgJHdhdGNoQ29sbGVjdGlvbkFjdGlvbik7CisgICAgICB9LAorCisgICAgICAvKioKKyAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdAorICAgICAgICogQGtpbmQgZnVuY3Rpb24KKyAgICAgICAqCisgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAqIFByb2Nlc3NlcyBhbGwgb2YgdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyR3YXRjaCB3YXRjaGVyc30gb2YgdGhlIGN1cnJlbnQgc2NvcGUgYW5kCisgICAgICAgKiBpdHMgY2hpbGRyZW4uIEJlY2F1c2UgYSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggd2F0Y2hlcn0ncyBsaXN0ZW5lciBjYW4gY2hhbmdlCisgICAgICAgKiB0aGUgbW9kZWwsIHRoZSBgJGRpZ2VzdCgpYCBrZWVwcyBjYWxsaW5nIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggd2F0Y2hlcnN9CisgICAgICAgKiB1bnRpbCBubyBtb3JlIGxpc3RlbmVycyBhcmUgZmlyaW5nLiBUaGlzIG1lYW5zIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gZ2V0IGludG8gYW4gaW5maW5pdGUKKyAgICAgICAqIGxvb3AuIFRoaXMgZnVuY3Rpb24gd2lsbCB0aHJvdyBgJ01heGltdW0gaXRlcmF0aW9uIGxpbWl0IGV4Y2VlZGVkLidgIGlmIHRoZSBudW1iZXIgb2YKKyAgICAgICAqIGl0ZXJhdGlvbnMgZXhjZWVkcyAxMC4KKyAgICAgICAqCisgICAgICAgKiBVc3VhbGx5LCB5b3UgZG9uJ3QgY2FsbCBgJGRpZ2VzdCgpYCBkaXJlY3RseSBpbgorICAgICAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NvbnRyb2xsZXIgY29udHJvbGxlcnN9IG9yIGluCisgICAgICAgKiB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmUgZGlyZWN0aXZlc30uCisgICAgICAgKiBJbnN0ZWFkLCB5b3Ugc2hvdWxkIGNhbGwge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGFwcGx5ICRhcHBseSgpfSAodHlwaWNhbGx5IGZyb20gd2l0aGluCisgICAgICAgKiBhIHtAbGluayBuZy4kY29tcGlsZVByb3ZpZGVyI2RpcmVjdGl2ZSBkaXJlY3RpdmV9KSwgd2hpY2ggd2lsbCBmb3JjZSBhIGAkZGlnZXN0KClgLgorICAgICAgICoKKyAgICAgICAqIElmIHlvdSB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIGAkZGlnZXN0KClgIGlzIGNhbGxlZCwKKyAgICAgICAqIHlvdSBjYW4gcmVnaXN0ZXIgYSBgd2F0Y2hFeHByZXNzaW9uYCBmdW5jdGlvbiB3aXRoCisgICAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggJHdhdGNoKCl9IHdpdGggbm8gYGxpc3RlbmVyYC4KKyAgICAgICAqCisgICAgICAgKiBJbiB1bml0IHRlc3RzLCB5b3UgbWF5IG5lZWQgdG8gY2FsbCBgJGRpZ2VzdCgpYCB0byBzaW11bGF0ZSB0aGUgc2NvcGUgbGlmZSBjeWNsZS4KKyAgICAgICAqCisgICAgICAgKiAjIEV4YW1wbGUKKyAgICAgICAqIGBgYGpzCisgICAgICAgICAgIHZhciBzY29wZSA9IC4uLjsKKyAgICAgICAgICAgc2NvcGUubmFtZSA9ICdtaXNrbyc7CisgICAgICAgICAgIHNjb3BlLmNvdW50ZXIgPSAwOworCisgICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDApOworICAgICAgICAgICBzY29wZS4kd2F0Y2goJ25hbWUnLCBmdW5jdGlvbihuZXdWYWx1ZSwgb2xkVmFsdWUpIHsKKyAgICAgICAgICAgICBzY29wZS5jb3VudGVyID0gc2NvcGUuY291bnRlciArIDE7CisgICAgICAgICAgIH0pOworICAgICAgICAgICBleHBlY3Qoc2NvcGUuY291bnRlcikudG9FcXVhbCgwKTsKKworICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7CisgICAgICAgICAgIC8vIHRoZSBsaXN0ZW5lciBpcyBhbHdheXMgY2FsbGVkIGR1cmluZyB0aGUgZmlyc3QgJGRpZ2VzdCBsb29wIGFmdGVyIGl0IHdhcyByZWdpc3RlcmVkCisgICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDEpOworCisgICAgICAgICAgIHNjb3BlLiRkaWdlc3QoKTsKKyAgICAgICAgICAgLy8gYnV0IG5vdyBpdCB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzIHRoZSB2YWx1ZSBjaGFuZ2VzCisgICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDEpOworCisgICAgICAgICAgIHNjb3BlLm5hbWUgPSAnYWRhbSc7CisgICAgICAgICAgIHNjb3BlLiRkaWdlc3QoKTsKKyAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMik7CisgICAgICAgKiBgYGAKKyAgICAgICAqCisgICAgICAgKi8KKyAgICAgICRkaWdlc3Q6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgd2F0Y2gsIHZhbHVlLCBsYXN0LAorICAgICAgICAgICAgd2F0Y2hlcnMsCisgICAgICAgICAgICBsZW5ndGgsCisgICAgICAgICAgICBkaXJ0eSwgdHRsID0gVFRMLAorICAgICAgICAgICAgbmV4dCwgY3VycmVudCwgdGFyZ2V0ID0gdGhpcywKKyAgICAgICAgICAgIHdhdGNoTG9nID0gW10sCisgICAgICAgICAgICBsb2dJZHgsIGxvZ01zZywgYXN5bmNUYXNrOworCisgICAgICAgIGJlZ2luUGhhc2UoJyRkaWdlc3QnKTsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGNoYW5nZXMgdG8gYnJvd3NlciB1cmwgdGhhdCBoYXBwZW5lZCBpbiBzeW5jIGJlZm9yZSB0aGUgY2FsbCB0byAkZGlnZXN0CisgICAgICAgICRicm93c2VyLiQkY2hlY2tVcmxDaGFuZ2UoKTsKKworICAgICAgICBpZiAodGhpcyA9PT0gJHJvb3RTY29wZSAmJiBhcHBseUFzeW5jSWQgIT09IG51bGwpIHsKKyAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSByb290IHNjb3BlLCBhbmQgJGFwcGx5QXN5bmMgaGFzIHNjaGVkdWxlZCBhIGRlZmVycmVkICRhcHBseSgpLCB0aGVuCisgICAgICAgICAgLy8gY2FuY2VsIHRoZSBzY2hlZHVsZWQgJGFwcGx5IGFuZCBmbHVzaCB0aGUgcXVldWUgb2YgZXhwcmVzc2lvbnMgdG8gYmUgZXZhbHVhdGVkLgorICAgICAgICAgICRicm93c2VyLmRlZmVyLmNhbmNlbChhcHBseUFzeW5jSWQpOworICAgICAgICAgIGZsdXNoQXBwbHlBc3luYygpOworICAgICAgICB9CisKKyAgICAgICAgbGFzdERpcnR5V2F0Y2ggPSBudWxsOworCisgICAgICAgIGRvIHsgLy8gIndoaWxlIGRpcnR5IiBsb29wCisgICAgICAgICAgZGlydHkgPSBmYWxzZTsKKyAgICAgICAgICBjdXJyZW50ID0gdGFyZ2V0OworCisgICAgICAgICAgd2hpbGUgKGFzeW5jUXVldWUubGVuZ3RoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBhc3luY1Rhc2sgPSBhc3luY1F1ZXVlLnNoaWZ0KCk7CisgICAgICAgICAgICAgIGFzeW5jVGFzay5zY29wZS4kZXZhbChhc3luY1Rhc2suZXhwcmVzc2lvbiwgYXN5bmNUYXNrLmxvY2Fscyk7CisgICAgICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdERpcnR5V2F0Y2ggPSBudWxsOworICAgICAgICAgIH0KKworICAgICAgICAgIHRyYXZlcnNlU2NvcGVzTG9vcDoKKyAgICAgICAgICBkbyB7IC8vICJ0cmF2ZXJzZSB0aGUgc2NvcGVzIiBsb29wCisgICAgICAgICAgICBpZiAoKHdhdGNoZXJzID0gY3VycmVudC4kJHdhdGNoZXJzKSkgeworICAgICAgICAgICAgICAvLyBwcm9jZXNzIG91ciB3YXRjaGVzCisgICAgICAgICAgICAgIGxlbmd0aCA9IHdhdGNoZXJzLmxlbmd0aDsKKyAgICAgICAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgIHdhdGNoID0gd2F0Y2hlcnNbbGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAgIC8vIE1vc3QgY29tbW9uIHdhdGNoZXMgYXJlIG9uIHByaW1pdGl2ZXMsIGluIHdoaWNoIGNhc2Ugd2UgY2FuIHNob3J0CisgICAgICAgICAgICAgICAgICAvLyBjaXJjdWl0IGl0IHdpdGggPT09IG9wZXJhdG9yLCBvbmx5IHdoZW4gPT09IGZhaWxzIGRvIHdlIHVzZSAuZXF1YWxzCisgICAgICAgICAgICAgICAgICBpZiAod2F0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9IHdhdGNoLmdldChjdXJyZW50KSkgIT09IChsYXN0ID0gd2F0Y2gubGFzdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICEod2F0Y2guZXEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVxdWFscyh2YWx1ZSwgbGFzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHR5cGVvZiBsYXN0ID09PSAnbnVtYmVyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzTmFOKHZhbHVlKSAmJiBpc05hTihsYXN0KSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgIGxhc3REaXJ0eVdhdGNoID0gd2F0Y2g7CisgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gubGFzdCA9IHdhdGNoLmVxID8gY29weSh2YWx1ZSwgbnVsbCkgOiB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICB3YXRjaC5mbih2YWx1ZSwgKChsYXN0ID09PSBpbml0V2F0Y2hWYWwpID8gdmFsdWUgOiBsYXN0KSwgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHR0bCA8IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0lkeCA9IDQgLSB0dGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdhdGNoTG9nW2xvZ0lkeF0pIHdhdGNoTG9nW2xvZ0lkeF0gPSBbXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoTG9nW2xvZ0lkeF0ucHVzaCh7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZzogaXNGdW5jdGlvbih3YXRjaC5leHApID8gJ2ZuOiAnICsgKHdhdGNoLmV4cC5uYW1lIHx8IHdhdGNoLmV4cC50b1N0cmluZygpKSA6IHdhdGNoLmV4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsOiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkVmFsOiBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2F0Y2ggPT09IGxhc3REaXJ0eVdhdGNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG1vc3QgcmVjZW50bHkgZGlydHkgd2F0Y2hlciBpcyBub3cgY2xlYW4sIHNob3J0IGNpcmN1aXQgc2luY2UgdGhlIHJlbWFpbmluZyB3YXRjaGVycworICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgYWxyZWFkeSBiZWVuIHRlc3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRyYXZlcnNlU2NvcGVzTG9vcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbnNhbml0eSBXYXJuaW5nOiBzY29wZSBkZXB0aC1maXJzdCB0cmF2ZXJzYWwKKyAgICAgICAgICAgIC8vIHllcywgdGhpcyBjb2RlIGlzIGEgYml0IGNyYXp5LCBidXQgaXQgd29ya3MgYW5kIHdlIGhhdmUgdGVzdHMgdG8gcHJvdmUgaXQhCisgICAgICAgICAgICAvLyB0aGlzIHBpZWNlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdHJhdmVyc2FsIGluICRicm9hZGNhc3QKKyAgICAgICAgICAgIGlmICghKG5leHQgPSAoY3VycmVudC4kJGNoaWxkSGVhZCB8fAorICAgICAgICAgICAgICAgIChjdXJyZW50ICE9PSB0YXJnZXQgJiYgY3VycmVudC4kJG5leHRTaWJsaW5nKSkpKSB7CisgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ICE9PSB0YXJnZXQgJiYgIShuZXh0ID0gY3VycmVudC4kJG5leHRTaWJsaW5nKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LiRwYXJlbnQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IHdoaWxlICgoY3VycmVudCA9IG5leHQpKTsKKworICAgICAgICAgIC8vIGBicmVhayB0cmF2ZXJzZVNjb3Blc0xvb3A7YCB0YWtlcyB1cyB0byBoZXJlCisKKyAgICAgICAgICBpZiAoKGRpcnR5IHx8IGFzeW5jUXVldWUubGVuZ3RoKSAmJiAhKHR0bC0tKSkgeworICAgICAgICAgICAgY2xlYXJQaGFzZSgpOworICAgICAgICAgICAgdGhyb3cgJHJvb3RTY29wZU1pbkVycignaW5mZGlnJywKKyAgICAgICAgICAgICAgICAnezB9ICRkaWdlc3QoKSBpdGVyYXRpb25zIHJlYWNoZWQuIEFib3J0aW5nIVxuJyArCisgICAgICAgICAgICAgICAgJ1dhdGNoZXJzIGZpcmVkIGluIHRoZSBsYXN0IDUgaXRlcmF0aW9uczogezF9JywKKyAgICAgICAgICAgICAgICBUVEwsIHdhdGNoTG9nKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfSB3aGlsZSAoZGlydHkgfHwgYXN5bmNRdWV1ZS5sZW5ndGgpOworCisgICAgICAgIGNsZWFyUGhhc2UoKTsKKworICAgICAgICB3aGlsZSAocG9zdERpZ2VzdFF1ZXVlLmxlbmd0aCkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwb3N0RGlnZXN0UXVldWUuc2hpZnQoKSgpOworICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKworCisgICAgICAvKioKKyAgICAgICAqIEBuZ2RvYyBldmVudAorICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkZGVzdHJveQorICAgICAgICogQGV2ZW50VHlwZSBicm9hZGNhc3Qgb24gc2NvcGUgYmVpbmcgZGVzdHJveWVkCisgICAgICAgKgorICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgKiBCcm9hZGNhc3RlZCB3aGVuIGEgc2NvcGUgYW5kIGl0cyBjaGlsZHJlbiBhcmUgYmVpbmcgZGVzdHJveWVkLgorICAgICAgICoKKyAgICAgICAqIE5vdGUgdGhhdCwgaW4gQW5ndWxhckpTLCB0aGVyZSBpcyBhbHNvIGEgYCRkZXN0cm95YCBqUXVlcnkgZXZlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvCisgICAgICAgKiBjbGVhbiB1cCBET00gYmluZGluZ3MgYmVmb3JlIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00uCisgICAgICAgKi8KKworICAgICAgLyoqCisgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRkZXN0cm95CisgICAgICAgKiBAa2luZCBmdW5jdGlvbgorICAgICAgICoKKyAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICogUmVtb3ZlcyB0aGUgY3VycmVudCBzY29wZSAoYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4pIGZyb20gdGhlIHBhcmVudCBzY29wZS4gUmVtb3ZhbCBpbXBsaWVzCisgICAgICAgKiB0aGF0IGNhbGxzIHRvIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdCgpfSB3aWxsIG5vIGxvbmdlcgorICAgICAgICogcHJvcGFnYXRlIHRvIHRoZSBjdXJyZW50IHNjb3BlIGFuZCBpdHMgY2hpbGRyZW4uIFJlbW92YWwgYWxzbyBpbXBsaWVzIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgICAqIHNjb3BlIGlzIGVsaWdpYmxlIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uCisgICAgICAgKgorICAgICAgICogVGhlIGAkZGVzdHJveSgpYCBpcyB1c3VhbGx5IHVzZWQgYnkgZGlyZWN0aXZlcyBzdWNoIGFzCisgICAgICAgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nUmVwZWF0IG5nUmVwZWF0fSBmb3IgbWFuYWdpbmcgdGhlCisgICAgICAgKiB1bnJvbGxpbmcgb2YgdGhlIGxvb3AuCisgICAgICAgKgorICAgICAgICogSnVzdCBiZWZvcmUgYSBzY29wZSBpcyBkZXN0cm95ZWQsIGEgYCRkZXN0cm95YCBldmVudCBpcyBicm9hZGNhc3RlZCBvbiB0aGlzIHNjb3BlLgorICAgICAgICogQXBwbGljYXRpb24gY29kZSBjYW4gcmVnaXN0ZXIgYSBgJGRlc3Ryb3lgIGV2ZW50IGhhbmRsZXIgdGhhdCB3aWxsIGdpdmUgaXQgYSBjaGFuY2UgdG8KKyAgICAgICAqIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSBjbGVhbnVwLgorICAgICAgICoKKyAgICAgICAqIE5vdGUgdGhhdCwgaW4gQW5ndWxhckpTLCB0aGVyZSBpcyBhbHNvIGEgYCRkZXN0cm95YCBqUXVlcnkgZXZlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvCisgICAgICAgKiBjbGVhbiB1cCBET00gYmluZGluZ3MgYmVmb3JlIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00uCisgICAgICAgKi8KKyAgICAgICRkZXN0cm95OiBmdW5jdGlvbigpIHsKKyAgICAgICAgLy8gd2UgY2FuJ3QgZGVzdHJveSB0aGUgcm9vdCBzY29wZSBvciBhIHNjb3BlIHRoYXQgaGFzIGJlZW4gYWxyZWFkeSBkZXN0cm95ZWQKKyAgICAgICAgaWYgKHRoaXMuJCRkZXN0cm95ZWQpIHJldHVybjsKKyAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDsKKworICAgICAgICB0aGlzLiRicm9hZGNhc3QoJyRkZXN0cm95Jyk7CisgICAgICAgIHRoaXMuJCRkZXN0cm95ZWQgPSB0cnVlOworICAgICAgICBpZiAodGhpcyA9PT0gJHJvb3RTY29wZSkgcmV0dXJuOworCisgICAgICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiB0aGlzLiQkbGlzdGVuZXJDb3VudCkgeworICAgICAgICAgIGRlY3JlbWVudExpc3RlbmVyQ291bnQodGhpcywgdGhpcy4kJGxpc3RlbmVyQ291bnRbZXZlbnROYW1lXSwgZXZlbnROYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldmVyIGFsbCB0aGUgcmVmZXJlbmNlcyB0byBwYXJlbnQgc2NvcGVzIChhZnRlciB0aGlzIGNsZWFudXAsIHRoZSBjdXJyZW50IHNjb3BlIHNob3VsZAorICAgICAgICAvLyBub3QgYmUgcmV0YWluZWQgYnkgYW55IG9mIG91ciByZWZlcmVuY2VzIGFuZCBzaG91bGQgYmUgZWxpZ2libGUgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbikKKyAgICAgICAgaWYgKHBhcmVudC4kJGNoaWxkSGVhZCA9PSB0aGlzKSBwYXJlbnQuJCRjaGlsZEhlYWQgPSB0aGlzLiQkbmV4dFNpYmxpbmc7CisgICAgICAgIGlmIChwYXJlbnQuJCRjaGlsZFRhaWwgPT0gdGhpcykgcGFyZW50LiQkY2hpbGRUYWlsID0gdGhpcy4kJHByZXZTaWJsaW5nOworICAgICAgICBpZiAodGhpcy4kJHByZXZTaWJsaW5nKSB0aGlzLiQkcHJldlNpYmxpbmcuJCRuZXh0U2libGluZyA9IHRoaXMuJCRuZXh0U2libGluZzsKKyAgICAgICAgaWYgKHRoaXMuJCRuZXh0U2libGluZykgdGhpcy4kJG5leHRTaWJsaW5nLiQkcHJldlNpYmxpbmcgPSB0aGlzLiQkcHJldlNpYmxpbmc7CisKKyAgICAgICAgLy8gRGlzYWJsZSBsaXN0ZW5lcnMsIHdhdGNoZXJzIGFuZCBhcHBseS9kaWdlc3QgbWV0aG9kcworICAgICAgICB0aGlzLiRkZXN0cm95ID0gdGhpcy4kZGlnZXN0ID0gdGhpcy4kYXBwbHkgPSB0aGlzLiRldmFsQXN5bmMgPSB0aGlzLiRhcHBseUFzeW5jID0gbm9vcDsKKyAgICAgICAgdGhpcy4kb24gPSB0aGlzLiR3YXRjaCA9IHRoaXMuJHdhdGNoR3JvdXAgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG5vb3A7IH07CisgICAgICAgIHRoaXMuJCRsaXN0ZW5lcnMgPSB7fTsKKworICAgICAgICAvLyBBbGwgb2YgdGhlIGNvZGUgYmVsb3cgaXMgYm9ndXMgY29kZSB0aGF0IHdvcmtzIGFyb3VuZCBWOCdzIG1lbW9yeSBsZWFrIHZpYSBvcHRpbWl6ZWQgY29kZQorICAgICAgICAvLyBhbmQgaW5saW5lIGNhY2hlcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gc2VlOgorICAgICAgICAvLyAtIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMDczI2MyNgorICAgICAgICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzY3OTQjaXNzdWVjb21tZW50LTM4NjQ4OTA5CisgICAgICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvMTMxMyNpc3N1ZWNvbW1lbnQtMTAzNzg0NTEKKworICAgICAgICB0aGlzLiRwYXJlbnQgPSB0aGlzLiQkbmV4dFNpYmxpbmcgPSB0aGlzLiQkcHJldlNpYmxpbmcgPSB0aGlzLiQkY2hpbGRIZWFkID0KKyAgICAgICAgICAgIHRoaXMuJCRjaGlsZFRhaWwgPSB0aGlzLiRyb290ID0gdGhpcy4kJHdhdGNoZXJzID0gbnVsbDsKKyAgICAgIH0sCisKKyAgICAgIC8qKgorICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkZXZhbAorICAgICAgICogQGtpbmQgZnVuY3Rpb24KKyAgICAgICAqCisgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAqIEV4ZWN1dGVzIHRoZSBgZXhwcmVzc2lvbmAgb24gdGhlIGN1cnJlbnQgc2NvcGUgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gQW55IGV4Y2VwdGlvbnMgaW4KKyAgICAgICAqIHRoZSBleHByZXNzaW9uIGFyZSBwcm9wYWdhdGVkICh1bmNhdWdodCkuIFRoaXMgaXMgdXNlZnVsIHdoZW4gZXZhbHVhdGluZyBBbmd1bGFyCisgICAgICAgKiBleHByZXNzaW9ucy4KKyAgICAgICAqCisgICAgICAgKiAjIEV4YW1wbGUKKyAgICAgICAqIGBgYGpzCisgICAgICAgICAgIHZhciBzY29wZSA9IG5nLiRyb290U2NvcGUuU2NvcGUoKTsKKyAgICAgICAgICAgc2NvcGUuYSA9IDE7CisgICAgICAgICAgIHNjb3BlLmIgPSAyOworCisgICAgICAgICAgIGV4cGVjdChzY29wZS4kZXZhbCgnYStiJykpLnRvRXF1YWwoMyk7CisgICAgICAgICAgIGV4cGVjdChzY29wZS4kZXZhbChmdW5jdGlvbihzY29wZSl7IHJldHVybiBzY29wZS5hICsgc2NvcGUuYjsgfSkpLnRvRXF1YWwoMyk7CisgICAgICAgKiBgYGAKKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24oKSk9fSBleHByZXNzaW9uIEFuIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgICAtIGBzdHJpbmdgOiBleGVjdXRlIHVzaW5nIHRoZSBydWxlcyBhcyBkZWZpbmVkIGluICB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufS4KKyAgICAgICAqICAgIC0gYGZ1bmN0aW9uKHNjb3BlKWA6IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGN1cnJlbnQgYHNjb3BlYCBwYXJhbWV0ZXIuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHsob2JqZWN0KT19IGxvY2FscyBMb2NhbCB2YXJpYWJsZXMgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluIHNjb3BlLgorICAgICAgICogQHJldHVybnMgeyp9IFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgJGV2YWw6IGZ1bmN0aW9uKGV4cHIsIGxvY2FscykgeworICAgICAgICByZXR1cm4gJHBhcnNlKGV4cHIpKHRoaXMsIGxvY2Fscyk7CisgICAgICB9LAorCisgICAgICAvKioKKyAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGV2YWxBc3luYworICAgICAgICogQGtpbmQgZnVuY3Rpb24KKyAgICAgICAqCisgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAqIEV4ZWN1dGVzIHRoZSBleHByZXNzaW9uIG9uIHRoZSBjdXJyZW50IHNjb3BlIGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZS4KKyAgICAgICAqCisgICAgICAgKiBUaGUgYCRldmFsQXN5bmNgIG1ha2VzIG5vIGd1YXJhbnRlZXMgYXMgdG8gd2hlbiB0aGUgYGV4cHJlc3Npb25gIHdpbGwgYmUgZXhlY3V0ZWQsIG9ubHkKKyAgICAgICAqIHRoYXQ6CisgICAgICAgKgorICAgICAgICogICAtIGl0IHdpbGwgZXhlY3V0ZSBhZnRlciB0aGUgZnVuY3Rpb24gdGhhdCBzY2hlZHVsZWQgdGhlIGV2YWx1YXRpb24gKHByZWZlcmFibHkgYmVmb3JlIERPTQorICAgICAgICogICAgIHJlbmRlcmluZykuCisgICAgICAgKiAgIC0gYXQgbGVhc3Qgb25lIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdCBjeWNsZX0gd2lsbCBiZSBwZXJmb3JtZWQgYWZ0ZXIKKyAgICAgICAqICAgICBgZXhwcmVzc2lvbmAgZXhlY3V0aW9uLgorICAgICAgICoKKyAgICAgICAqIEFueSBleGNlcHRpb25zIGZyb20gdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBhcmUgZm9yd2FyZGVkIHRvIHRoZQorICAgICAgICoge0BsaW5rIG5nLiRleGNlcHRpb25IYW5kbGVyICRleGNlcHRpb25IYW5kbGVyfSBzZXJ2aWNlLgorICAgICAgICoKKyAgICAgICAqIF9fTm90ZTpfXyBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvdXRzaWRlIG9mIGEgYCRkaWdlc3RgIGN5Y2xlLCBhIG5ldyBgJGRpZ2VzdGAgY3ljbGUKKyAgICAgICAqIHdpbGwgYmUgc2NoZWR1bGVkLiBIb3dldmVyLCBpdCBpcyBlbmNvdXJhZ2VkIHRvIGFsd2F5cyBjYWxsIGNvZGUgdGhhdCBjaGFuZ2VzIHRoZSBtb2RlbAorICAgICAgICogZnJvbSB3aXRoaW4gYW4gYCRhcHBseWAgY2FsbC4gVGhhdCBpbmNsdWRlcyBjb2RlIGV2YWx1YXRlZCB2aWEgYCRldmFsQXN5bmNgLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbigpKT19IGV4cHJlc3Npb24gQW4gYW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkLgorICAgICAgICoKKyAgICAgICAqICAgIC0gYHN0cmluZ2A6IGV4ZWN1dGUgdXNpbmcgdGhlIHJ1bGVzIGFzIGRlZmluZWQgaW4ge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0uCisgICAgICAgKiAgICAtIGBmdW5jdGlvbihzY29wZSlgOiBleGVjdXRlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBjdXJyZW50IGBzY29wZWAgcGFyYW1ldGVyLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7KG9iamVjdCk9fSBsb2NhbHMgTG9jYWwgdmFyaWFibGVzIG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpbiBzY29wZS4KKyAgICAgICAqLworICAgICAgJGV2YWxBc3luYzogZnVuY3Rpb24oZXhwciwgbG9jYWxzKSB7CisgICAgICAgIC8vIGlmIHdlIGFyZSBvdXRzaWRlIG9mIGFuICRkaWdlc3QgbG9vcCBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgc2NoZWR1bGluZyBhc3luYworICAgICAgICAvLyB0YXNrIGFsc28gc2NoZWR1bGUgYXN5bmMgYXV0by1mbHVzaAorICAgICAgICBpZiAoISRyb290U2NvcGUuJCRwaGFzZSAmJiAhYXN5bmNRdWV1ZS5sZW5ndGgpIHsKKyAgICAgICAgICAkYnJvd3Nlci5kZWZlcihmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChhc3luY1F1ZXVlLmxlbmd0aCkgeworICAgICAgICAgICAgICAkcm9vdFNjb3BlLiRkaWdlc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGFzeW5jUXVldWUucHVzaCh7c2NvcGU6IHRoaXMsIGV4cHJlc3Npb246IGV4cHIsIGxvY2FsczogbG9jYWxzfSk7CisgICAgICB9LAorCisgICAgICAkJHBvc3REaWdlc3Q6IGZ1bmN0aW9uKGZuKSB7CisgICAgICAgIHBvc3REaWdlc3RRdWV1ZS5wdXNoKGZuKTsKKyAgICAgIH0sCisKKyAgICAgIC8qKgorICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkYXBwbHkKKyAgICAgICAqIEBraW5kIGZ1bmN0aW9uCisgICAgICAgKgorICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgKiBgJGFwcGx5KClgIGlzIHVzZWQgdG8gZXhlY3V0ZSBhbiBleHByZXNzaW9uIGluIGFuZ3VsYXIgZnJvbSBvdXRzaWRlIG9mIHRoZSBhbmd1bGFyCisgICAgICAgKiBmcmFtZXdvcmsuIChGb3IgZXhhbXBsZSBmcm9tIGJyb3dzZXIgRE9NIGV2ZW50cywgc2V0VGltZW91dCwgWEhSIG9yIHRoaXJkIHBhcnR5IGxpYnJhcmllcykuCisgICAgICAgKiBCZWNhdXNlIHdlIGFyZSBjYWxsaW5nIGludG8gdGhlIGFuZ3VsYXIgZnJhbWV3b3JrIHdlIG5lZWQgdG8gcGVyZm9ybSBwcm9wZXIgc2NvcGUgbGlmZQorICAgICAgICogY3ljbGUgb2Yge0BsaW5rIG5nLiRleGNlcHRpb25IYW5kbGVyIGV4Y2VwdGlvbiBoYW5kbGluZ30sCisgICAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0IGV4ZWN1dGluZyB3YXRjaGVzfS4KKyAgICAgICAqCisgICAgICAgKiAjIyBMaWZlIGN5Y2xlCisgICAgICAgKgorICAgICAgICogIyBQc2V1ZG8tQ29kZSBvZiBgJGFwcGx5KClgCisgICAgICAgKiBgYGBqcworICAgICAgICAgICBmdW5jdGlvbiAkYXBwbHkoZXhwcikgeworICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICByZXR1cm4gJGV2YWwoZXhwcik7CisgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7CisgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICRyb290LiRkaWdlc3QoKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAqIGBgYAorICAgICAgICoKKyAgICAgICAqCisgICAgICAgKiBTY29wZSdzIGAkYXBwbHkoKWAgbWV0aG9kIHRyYW5zaXRpb25zIHRocm91Z2ggdGhlIGZvbGxvd2luZyBzdGFnZXM6CisgICAgICAgKgorICAgICAgICogMS4gVGhlIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGlzIGV4ZWN1dGVkIHVzaW5nIHRoZQorICAgICAgICogICAge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGV2YWwgJGV2YWwoKX0gbWV0aG9kLgorICAgICAgICogMi4gQW55IGV4Y2VwdGlvbnMgZnJvbSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBleHByZXNzaW9uIGFyZSBmb3J3YXJkZWQgdG8gdGhlCisgICAgICAgKiAgICB7QGxpbmsgbmcuJGV4Y2VwdGlvbkhhbmRsZXIgJGV4Y2VwdGlvbkhhbmRsZXJ9IHNlcnZpY2UuCisgICAgICAgKiAzLiBUaGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIHdhdGNofSBsaXN0ZW5lcnMgYXJlIGZpcmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQorICAgICAgICogICAgZXhwcmVzc2lvbiB3YXMgZXhlY3V0ZWQgdXNpbmcgdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdCgpfSBtZXRob2QuCisgICAgICAgKgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbigpKT19IGV4cCBBbiBhbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQuCisgICAgICAgKgorICAgICAgICogICAgLSBgc3RyaW5nYDogZXhlY3V0ZSB1c2luZyB0aGUgcnVsZXMgYXMgZGVmaW5lZCBpbiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufS4KKyAgICAgICAqICAgIC0gYGZ1bmN0aW9uKHNjb3BlKWA6IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIHdpdGggY3VycmVudCBgc2NvcGVgIHBhcmFtZXRlci4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICAkYXBwbHk6IGZ1bmN0aW9uKGV4cHIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBiZWdpblBoYXNlKCckYXBwbHknKTsKKyAgICAgICAgICByZXR1cm4gdGhpcy4kZXZhbChleHByKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIGNsZWFyUGhhc2UoKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgJHJvb3RTY29wZS4kZGlnZXN0KCk7CisgICAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSwKKworICAgICAgLyoqCisgICAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRhcHBseUFzeW5jCisgICAgICAgKiBAa2luZCBmdW5jdGlvbgorICAgICAgICoKKyAgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgICogU2NoZWR1bGUgdGhlIGludm9rYXRpb24gb2YgJGFwcGx5IHRvIG9jY3VyIGF0IGEgbGF0ZXIgdGltZS4gVGhlIGFjdHVhbCB0aW1lIGRpZmZlcmVuY2UKKyAgICAgICAqIHZhcmllcyBhY3Jvc3MgYnJvd3NlcnMsIGJ1dCBpcyB0eXBpY2FsbHkgYXJvdW5kIH4xMCBtaWxsaXNlY29uZHMuCisgICAgICAgKgorICAgICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBxdWV1ZSB1cCBtdWx0aXBsZSBleHByZXNzaW9ucyB3aGljaCBuZWVkIHRvIGJlIGV2YWx1YXRlZCBpbiB0aGUgc2FtZQorICAgICAgICogZGlnZXN0LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbigpKT19IGV4cCBBbiBhbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQuCisgICAgICAgKgorICAgICAgICogICAgLSBgc3RyaW5nYDogZXhlY3V0ZSB1c2luZyB0aGUgcnVsZXMgYXMgZGVmaW5lZCBpbiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufS4KKyAgICAgICAqICAgIC0gYGZ1bmN0aW9uKHNjb3BlKWA6IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIHdpdGggY3VycmVudCBgc2NvcGVgIHBhcmFtZXRlci4KKyAgICAgICAqLworICAgICAgJGFwcGx5QXN5bmM6IGZ1bmN0aW9uKGV4cHIpIHsKKyAgICAgICAgdmFyIHNjb3BlID0gdGhpczsKKyAgICAgICAgZXhwciAmJiBhcHBseUFzeW5jUXVldWUucHVzaCgkYXBwbHlBc3luY0V4cHJlc3Npb24pOworICAgICAgICBzY2hlZHVsZUFwcGx5QXN5bmMoKTsKKworICAgICAgICBmdW5jdGlvbiAkYXBwbHlBc3luY0V4cHJlc3Npb24oKSB7CisgICAgICAgICAgc2NvcGUuJGV2YWwoZXhwcik7CisgICAgICAgIH0KKyAgICAgIH0sCisKKyAgICAgIC8qKgorICAgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkb24KKyAgICAgICAqIEBraW5kIGZ1bmN0aW9uCisgICAgICAgKgorICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgKiBMaXN0ZW5zIG9uIGV2ZW50cyBvZiBhIGdpdmVuIHR5cGUuIFNlZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZW1pdCAkZW1pdH0gZm9yCisgICAgICAgKiBkaXNjdXNzaW9uIG9mIGV2ZW50IGxpZmUgY3ljbGUuCisgICAgICAgKgorICAgICAgICogVGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uIGZvcm1hdCBpczogYGZ1bmN0aW9uKGV2ZW50LCBhcmdzLi4uKWAuIFRoZSBgZXZlbnRgIG9iamVjdAorICAgICAgICogcGFzc2VkIGludG8gdGhlIGxpc3RlbmVyIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgICAgICAgKgorICAgICAgICogICAtIGB0YXJnZXRTY29wZWAgLSBge1Njb3BlfWA6IHRoZSBzY29wZSBvbiB3aGljaCB0aGUgZXZlbnQgd2FzIGAkZW1pdGAtZWQgb3IKKyAgICAgICAqICAgICBgJGJyb2FkY2FzdGAtZWQuCisgICAgICAgKiAgIC0gYGN1cnJlbnRTY29wZWAgLSBge1Njb3BlfWA6IHRoZSBzY29wZSB0aGF0IGlzIGN1cnJlbnRseSBoYW5kbGluZyB0aGUgZXZlbnQuIE9uY2UgdGhlCisgICAgICAgKiAgICAgZXZlbnQgcHJvcGFnYXRlcyB0aHJvdWdoIHRoZSBzY29wZSBoaWVyYXJjaHksIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIG51bGwuCisgICAgICAgKiAgIC0gYG5hbWVgIC0gYHtzdHJpbmd9YDogbmFtZSBvZiB0aGUgZXZlbnQuCisgICAgICAgKiAgIC0gYHN0b3BQcm9wYWdhdGlvbmAgLSBge2Z1bmN0aW9uPX1gOiBjYWxsaW5nIGBzdG9wUHJvcGFnYXRpb25gIGZ1bmN0aW9uIHdpbGwgY2FuY2VsCisgICAgICAgKiAgICAgZnVydGhlciBldmVudCBwcm9wYWdhdGlvbiAoYXZhaWxhYmxlIG9ubHkgZm9yIGV2ZW50cyB0aGF0IHdlcmUgYCRlbWl0YC1lZCkuCisgICAgICAgKiAgIC0gYHByZXZlbnREZWZhdWx0YCAtIGB7ZnVuY3Rpb259YDogY2FsbGluZyBgcHJldmVudERlZmF1bHRgIHNldHMgYGRlZmF1bHRQcmV2ZW50ZWRgIGZsYWcKKyAgICAgICAqICAgICB0byB0cnVlLgorICAgICAgICogICAtIGBkZWZhdWx0UHJldmVudGVkYCAtIGB7Ym9vbGVhbn1gOiB0cnVlIGlmIGBwcmV2ZW50RGVmYXVsdGAgd2FzIGNhbGxlZC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBFdmVudCBuYW1lIHRvIGxpc3RlbiBvbi4KKyAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQsIC4uLmFyZ3MpfSBsaXN0ZW5lciBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIGVtaXR0ZWQuCisgICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gUmV0dXJucyBhIGRlcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIGxpc3RlbmVyLgorICAgICAgICovCisgICAgICAkb246IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7CisgICAgICAgIHZhciBuYW1lZExpc3RlbmVycyA9IHRoaXMuJCRsaXN0ZW5lcnNbbmFtZV07CisgICAgICAgIGlmICghbmFtZWRMaXN0ZW5lcnMpIHsKKyAgICAgICAgICB0aGlzLiQkbGlzdGVuZXJzW25hbWVdID0gbmFtZWRMaXN0ZW5lcnMgPSBbXTsKKyAgICAgICAgfQorICAgICAgICBuYW1lZExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKKworICAgICAgICB2YXIgY3VycmVudCA9IHRoaXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBpZiAoIWN1cnJlbnQuJCRsaXN0ZW5lckNvdW50W25hbWVdKSB7CisgICAgICAgICAgICBjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGN1cnJlbnQuJCRsaXN0ZW5lckNvdW50W25hbWVdKys7CisgICAgICAgIH0gd2hpbGUgKChjdXJyZW50ID0gY3VycmVudC4kcGFyZW50KSk7CisKKyAgICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgICAgdmFyIGluZGV4T2ZMaXN0ZW5lciA9IG5hbWVkTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpOworICAgICAgICAgIGlmIChpbmRleE9mTGlzdGVuZXIgIT09IC0xKSB7CisgICAgICAgICAgICBuYW1lZExpc3RlbmVyc1tpbmRleE9mTGlzdGVuZXJdID0gbnVsbDsKKyAgICAgICAgICAgIGRlY3JlbWVudExpc3RlbmVyQ291bnQoc2VsZiwgMSwgbmFtZSk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgfSwKKworCisgICAgICAvKioKKyAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGVtaXQKKyAgICAgICAqIEBraW5kIGZ1bmN0aW9uCisgICAgICAgKgorICAgICAgICogQGRlc2NyaXB0aW9uCisgICAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IGBuYW1lYCB1cHdhcmRzIHRocm91Z2ggdGhlIHNjb3BlIGhpZXJhcmNoeSBub3RpZnlpbmcgdGhlCisgICAgICAgKiByZWdpc3RlcmVkIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbn0gbGlzdGVuZXJzLgorICAgICAgICoKKyAgICAgICAqIFRoZSBldmVudCBsaWZlIGN5Y2xlIHN0YXJ0cyBhdCB0aGUgc2NvcGUgb24gd2hpY2ggYCRlbWl0YCB3YXMgY2FsbGVkLiBBbGwKKyAgICAgICAqIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbiBsaXN0ZW5lcnN9IGxpc3RlbmluZyBmb3IgYG5hbWVgIGV2ZW50IG9uIHRoaXMgc2NvcGUgZ2V0CisgICAgICAgKiBub3RpZmllZC4gQWZ0ZXJ3YXJkcywgdGhlIGV2ZW50IHRyYXZlcnNlcyB1cHdhcmRzIHRvd2FyZCB0aGUgcm9vdCBzY29wZSBhbmQgY2FsbHMgYWxsCisgICAgICAgKiByZWdpc3RlcmVkIGxpc3RlbmVycyBhbG9uZyB0aGUgd2F5LiBUaGUgZXZlbnQgd2lsbCBzdG9wIHByb3BhZ2F0aW5nIGlmIG9uZSBvZiB0aGUgbGlzdGVuZXJzCisgICAgICAgKiBjYW5jZWxzIGl0LgorICAgICAgICoKKyAgICAgICAqIEFueSBleGNlcHRpb24gZW1pdHRlZCBmcm9tIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb24gbGlzdGVuZXJzfSB3aWxsIGJlIHBhc3NlZAorICAgICAgICogb250byB0aGUge0BsaW5rIG5nLiRleGNlcHRpb25IYW5kbGVyICRleGNlcHRpb25IYW5kbGVyfSBzZXJ2aWNlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEV2ZW50IG5hbWUgdG8gZW1pdC4KKyAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBPcHRpb25hbCBvbmUgb3IgbW9yZSBhcmd1bWVudHMgd2hpY2ggd2lsbCBiZSBwYXNzZWQgb250byB0aGUgZXZlbnQgbGlzdGVuZXJzLgorICAgICAgICogQHJldHVybiB7T2JqZWN0fSBFdmVudCBvYmplY3QgKHNlZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb259KS4KKyAgICAgICAqLworICAgICAgJGVtaXQ6IGZ1bmN0aW9uKG5hbWUsIGFyZ3MpIHsKKyAgICAgICAgdmFyIGVtcHR5ID0gW10sCisgICAgICAgICAgICBuYW1lZExpc3RlbmVycywKKyAgICAgICAgICAgIHNjb3BlID0gdGhpcywKKyAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgZXZlbnQgPSB7CisgICAgICAgICAgICAgIG5hbWU6IG5hbWUsCisgICAgICAgICAgICAgIHRhcmdldFNjb3BlOiBzY29wZSwKKyAgICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtzdG9wUHJvcGFnYXRpb24gPSB0cnVlO30sCisgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBsaXN0ZW5lckFyZ3MgPSBjb25jYXQoW2V2ZW50XSwgYXJndW1lbnRzLCAxKSwKKyAgICAgICAgICAgIGksIGxlbmd0aDsKKworICAgICAgICBkbyB7CisgICAgICAgICAgbmFtZWRMaXN0ZW5lcnMgPSBzY29wZS4kJGxpc3RlbmVyc1tuYW1lXSB8fCBlbXB0eTsKKyAgICAgICAgICBldmVudC5jdXJyZW50U2NvcGUgPSBzY29wZTsKKyAgICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBuYW1lZExpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworCisgICAgICAgICAgICAvLyBpZiBsaXN0ZW5lcnMgd2VyZSBkZXJlZ2lzdGVyZWQsIGRlZnJhZ21lbnQgdGhlIGFycmF5CisgICAgICAgICAgICBpZiAoIW5hbWVkTGlzdGVuZXJzW2ldKSB7CisgICAgICAgICAgICAgIG5hbWVkTGlzdGVuZXJzLnNwbGljZShpLCAxKTsKKyAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAvL2FsbG93IGFsbCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnQgc2NvcGUgdG8gcnVuCisgICAgICAgICAgICAgIG5hbWVkTGlzdGVuZXJzW2ldLmFwcGx5KG51bGwsIGxpc3RlbmVyQXJncyk7CisgICAgICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAvL2lmIGFueSBsaXN0ZW5lciBvbiB0aGUgY3VycmVudCBzY29wZSBzdG9wcyBwcm9wYWdhdGlvbiwgcHJldmVudCBidWJibGluZworICAgICAgICAgIGlmIChzdG9wUHJvcGFnYXRpb24pIHsKKyAgICAgICAgICAgIGV2ZW50LmN1cnJlbnRTY29wZSA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gZXZlbnQ7CisgICAgICAgICAgfQorICAgICAgICAgIC8vdHJhdmVyc2UgdXB3YXJkcworICAgICAgICAgIHNjb3BlID0gc2NvcGUuJHBhcmVudDsKKyAgICAgICAgfSB3aGlsZSAoc2NvcGUpOworCisgICAgICAgIGV2ZW50LmN1cnJlbnRTY29wZSA9IG51bGw7CisKKyAgICAgICAgcmV0dXJuIGV2ZW50OworICAgICAgfSwKKworCisgICAgICAvKioKKyAgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGJyb2FkY2FzdAorICAgICAgICogQGtpbmQgZnVuY3Rpb24KKyAgICAgICAqCisgICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICAqIERpc3BhdGNoZXMgYW4gZXZlbnQgYG5hbWVgIGRvd253YXJkcyB0byBhbGwgY2hpbGQgc2NvcGVzIChhbmQgdGhlaXIgY2hpbGRyZW4pIG5vdGlmeWluZyB0aGUKKyAgICAgICAqIHJlZ2lzdGVyZWQge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJG9ufSBsaXN0ZW5lcnMuCisgICAgICAgKgorICAgICAgICogVGhlIGV2ZW50IGxpZmUgY3ljbGUgc3RhcnRzIGF0IHRoZSBzY29wZSBvbiB3aGljaCBgJGJyb2FkY2FzdGAgd2FzIGNhbGxlZC4gQWxsCisgICAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb24gbGlzdGVuZXJzfSBsaXN0ZW5pbmcgZm9yIGBuYW1lYCBldmVudCBvbiB0aGlzIHNjb3BlIGdldAorICAgICAgICogbm90aWZpZWQuIEFmdGVyd2FyZHMsIHRoZSBldmVudCBwcm9wYWdhdGVzIHRvIGFsbCBkaXJlY3QgYW5kIGluZGlyZWN0IHNjb3BlcyBvZiB0aGUgY3VycmVudAorICAgICAgICogc2NvcGUgYW5kIGNhbGxzIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycyBhbG9uZyB0aGUgd2F5LiBUaGUgZXZlbnQgY2Fubm90IGJlIGNhbmNlbGVkLgorICAgICAgICoKKyAgICAgICAqIEFueSBleGNlcHRpb24gZW1pdHRlZCBmcm9tIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb24gbGlzdGVuZXJzfSB3aWxsIGJlIHBhc3NlZAorICAgICAgICogb250byB0aGUge0BsaW5rIG5nLiRleGNlcHRpb25IYW5kbGVyICRleGNlcHRpb25IYW5kbGVyfSBzZXJ2aWNlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEV2ZW50IG5hbWUgdG8gYnJvYWRjYXN0LgorICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIE9wdGlvbmFsIG9uZSBvciBtb3JlIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHBhc3NlZCBvbnRvIHRoZSBldmVudCBsaXN0ZW5lcnMuCisgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEV2ZW50IG9iamVjdCwgc2VlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbn0KKyAgICAgICAqLworICAgICAgJGJyb2FkY2FzdDogZnVuY3Rpb24obmFtZSwgYXJncykgeworICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcywKKyAgICAgICAgICAgIGN1cnJlbnQgPSB0YXJnZXQsCisgICAgICAgICAgICBuZXh0ID0gdGFyZ2V0LAorICAgICAgICAgICAgZXZlbnQgPSB7CisgICAgICAgICAgICAgIG5hbWU6IG5hbWUsCisgICAgICAgICAgICAgIHRhcmdldFNjb3BlOiB0YXJnZXQsCisgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgaWYgKCF0YXJnZXQuJCRsaXN0ZW5lckNvdW50W25hbWVdKSByZXR1cm4gZXZlbnQ7CisKKyAgICAgICAgdmFyIGxpc3RlbmVyQXJncyA9IGNvbmNhdChbZXZlbnRdLCBhcmd1bWVudHMsIDEpLAorICAgICAgICAgICAgbGlzdGVuZXJzLCBpLCBsZW5ndGg7CisKKyAgICAgICAgLy9kb3duIHdoaWxlIHlvdSBjYW4sIHRoZW4gdXAgYW5kIG5leHQgc2libGluZyBvciB1cCBhbmQgbmV4dCBzaWJsaW5nIHVudGlsIGJhY2sgYXQgcm9vdAorICAgICAgICB3aGlsZSAoKGN1cnJlbnQgPSBuZXh0KSkgeworICAgICAgICAgIGV2ZW50LmN1cnJlbnRTY29wZSA9IGN1cnJlbnQ7CisgICAgICAgICAgbGlzdGVuZXJzID0gY3VycmVudC4kJGxpc3RlbmVyc1tuYW1lXSB8fCBbXTsKKyAgICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGlmIGxpc3RlbmVycyB3ZXJlIGRlcmVnaXN0ZXJlZCwgZGVmcmFnbWVudCB0aGUgYXJyYXkKKyAgICAgICAgICAgIGlmICghbGlzdGVuZXJzW2ldKSB7CisgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7CisgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgbGVuZ3RoLS07CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkobnVsbCwgbGlzdGVuZXJBcmdzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gSW5zYW5pdHkgV2FybmluZzogc2NvcGUgZGVwdGgtZmlyc3QgdHJhdmVyc2FsCisgICAgICAgICAgLy8geWVzLCB0aGlzIGNvZGUgaXMgYSBiaXQgY3JhenksIGJ1dCBpdCB3b3JrcyBhbmQgd2UgaGF2ZSB0ZXN0cyB0byBwcm92ZSBpdCEKKyAgICAgICAgICAvLyB0aGlzIHBpZWNlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdHJhdmVyc2FsIGluICRkaWdlc3QKKyAgICAgICAgICAvLyAodGhvdWdoIGl0IGRpZmZlcnMgZHVlIHRvIGhhdmluZyB0aGUgZXh0cmEgY2hlY2sgZm9yICQkbGlzdGVuZXJDb3VudCkKKyAgICAgICAgICBpZiAoIShuZXh0ID0gKChjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSAmJiBjdXJyZW50LiQkY2hpbGRIZWFkKSB8fAorICAgICAgICAgICAgICAoY3VycmVudCAhPT0gdGFyZ2V0ICYmIGN1cnJlbnQuJCRuZXh0U2libGluZykpKSkgeworICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT09IHRhcmdldCAmJiAhKG5leHQgPSBjdXJyZW50LiQkbmV4dFNpYmxpbmcpKSB7CisgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LiRwYXJlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXZlbnQuY3VycmVudFNjb3BlID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIGV2ZW50OworICAgICAgfQorICAgIH07CisKKyAgICB2YXIgJHJvb3RTY29wZSA9IG5ldyBTY29wZSgpOworCisgICAgLy9UaGUgaW50ZXJuYWwgcXVldWVzLiBFeHBvc2UgdGhlbSBvbiB0aGUgJHJvb3RTY29wZSBmb3IgZGVidWdnaW5nL3Rlc3RpbmcgcHVycG9zZXMuCisgICAgdmFyIGFzeW5jUXVldWUgPSAkcm9vdFNjb3BlLiQkYXN5bmNRdWV1ZSA9IFtdOworICAgIHZhciBwb3N0RGlnZXN0UXVldWUgPSAkcm9vdFNjb3BlLiQkcG9zdERpZ2VzdFF1ZXVlID0gW107CisgICAgdmFyIGFwcGx5QXN5bmNRdWV1ZSA9ICRyb290U2NvcGUuJCRhcHBseUFzeW5jUXVldWUgPSBbXTsKKworICAgIHJldHVybiAkcm9vdFNjb3BlOworCisKKyAgICBmdW5jdGlvbiBiZWdpblBoYXNlKHBoYXNlKSB7CisgICAgICBpZiAoJHJvb3RTY29wZS4kJHBoYXNlKSB7CisgICAgICAgIHRocm93ICRyb290U2NvcGVNaW5FcnIoJ2lucHJvZycsICd7MH0gYWxyZWFkeSBpbiBwcm9ncmVzcycsICRyb290U2NvcGUuJCRwaGFzZSk7CisgICAgICB9CisKKyAgICAgICRyb290U2NvcGUuJCRwaGFzZSA9IHBoYXNlOworICAgIH0KKworICAgIGZ1bmN0aW9uIGNsZWFyUGhhc2UoKSB7CisgICAgICAkcm9vdFNjb3BlLiQkcGhhc2UgPSBudWxsOworICAgIH0KKworCisgICAgZnVuY3Rpb24gZGVjcmVtZW50TGlzdGVuZXJDb3VudChjdXJyZW50LCBjb3VudCwgbmFtZSkgeworICAgICAgZG8geworICAgICAgICBjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSAtPSBjb3VudDsKKworICAgICAgICBpZiAoY3VycmVudC4kJGxpc3RlbmVyQ291bnRbbmFtZV0gPT09IDApIHsKKyAgICAgICAgICBkZWxldGUgY3VycmVudC4kJGxpc3RlbmVyQ291bnRbbmFtZV07CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKChjdXJyZW50ID0gY3VycmVudC4kcGFyZW50KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZnVuY3Rpb24gdXNlZCBhcyBhbiBpbml0aWFsIHZhbHVlIGZvciB3YXRjaGVycy4KKyAgICAgKiBiZWNhdXNlIGl0J3MgdW5pcXVlIHdlIGNhbiBlYXNpbHkgdGVsbCBpdCBhcGFydCBmcm9tIG90aGVyIHZhbHVlcworICAgICAqLworICAgIGZ1bmN0aW9uIGluaXRXYXRjaFZhbCgpIHt9CisKKyAgICBmdW5jdGlvbiBmbHVzaEFwcGx5QXN5bmMoKSB7CisgICAgICB3aGlsZSAoYXBwbHlBc3luY1F1ZXVlLmxlbmd0aCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGFwcGx5QXN5bmNRdWV1ZS5zaGlmdCgpKCk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYXBwbHlBc3luY0lkID0gbnVsbDsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBzY2hlZHVsZUFwcGx5QXN5bmMoKSB7CisgICAgICBpZiAoYXBwbHlBc3luY0lkID09PSBudWxsKSB7CisgICAgICAgIGFwcGx5QXN5bmNJZCA9ICRicm93c2VyLmRlZmVyKGZ1bmN0aW9uKCkgeworICAgICAgICAgICRyb290U2NvcGUuJGFwcGx5KGZsdXNoQXBwbHlBc3luYyk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKyAgfV07Cit9CisKKy8qKgorICogQGRlc2NyaXB0aW9uCisgKiBQcml2YXRlIHNlcnZpY2UgdG8gc2FuaXRpemUgdXJpcyBmb3IgbGlua3MgYW5kIGltYWdlcy4gVXNlZCBieSAkY29tcGlsZSBhbmQgJHNhbml0aXplLgorICovCitmdW5jdGlvbiAkJFNhbml0aXplVXJpUHJvdmlkZXIoKSB7CisgIHZhciBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdCA9IC9eXHMqKGh0dHBzP3xmdHB8bWFpbHRvfHRlbHxmaWxlKTovLAorICAgIGltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCA9IC9eXHMqKChodHRwcz98ZnRwfGZpbGV8YmxvYik6fGRhdGE6aW1hZ2VcLykvOworCisgIC8qKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogUmV0cmlldmVzIG9yIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIGZvciB3aGl0ZWxpc3Rpbmcgb2Ygc2FmZQorICAgKiB1cmxzIGR1cmluZyBhW2hyZWZdIHNhbml0aXphdGlvbi4KKyAgICoKKyAgICogVGhlIHNhbml0aXphdGlvbiBpcyBhIHNlY3VyaXR5IG1lYXN1cmUgYWltZWQgYXQgcHJldmVudCBYU1MgYXR0YWNrcyB2aWEgaHRtbCBsaW5rcy4KKyAgICoKKyAgICogQW55IHVybCBhYm91dCB0byBiZSBhc3NpZ25lZCB0byBhW2hyZWZdIHZpYSBkYXRhLWJpbmRpbmcgaXMgZmlyc3Qgbm9ybWFsaXplZCBhbmQgdHVybmVkIGludG8KKyAgICogYW4gYWJzb2x1dGUgdXJsLiBBZnRlcndhcmRzLCB0aGUgdXJsIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgYGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0YAorICAgKiByZWd1bGFyIGV4cHJlc3Npb24uIElmIGEgbWF0Y2ggaXMgZm91bmQsIHRoZSBvcmlnaW5hbCB1cmwgaXMgd3JpdHRlbiBpbnRvIHRoZSBkb20uIE90aGVyd2lzZSwKKyAgICogdGhlIGFic29sdXRlIHVybCBpcyBwcmVmaXhlZCB3aXRoIGAndW5zYWZlOidgIHN0cmluZyBhbmQgb25seSB0aGVuIGlzIGl0IHdyaXR0ZW4gaW50byB0aGUgRE9NLgorICAgKgorICAgKiBAcGFyYW0ge1JlZ0V4cD19IHJlZ2V4cCBOZXcgcmVnZXhwIHRvIHdoaXRlbGlzdCB1cmxzIHdpdGguCisgICAqIEByZXR1cm5zIHtSZWdFeHB8bmcuJGNvbXBpbGVQcm92aWRlcn0gQ3VycmVudCBSZWdFeHAgaWYgY2FsbGVkIHdpdGhvdXQgdmFsdWUgb3Igc2VsZiBmb3IKKyAgICogICAgY2hhaW5pbmcgb3RoZXJ3aXNlLgorICAgKi8KKyAgdGhpcy5hSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdCA9IGZ1bmN0aW9uKHJlZ2V4cCkgeworICAgIGlmIChpc0RlZmluZWQocmVnZXhwKSkgeworICAgICAgYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSByZWdleHA7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgcmV0dXJuIGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0OworICB9OworCisKKyAgLyoqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBSZXRyaWV2ZXMgb3Igb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGlzIHVzZWQgZm9yIHdoaXRlbGlzdGluZyBvZiBzYWZlCisgICAqIHVybHMgZHVyaW5nIGltZ1tzcmNdIHNhbml0aXphdGlvbi4KKyAgICoKKyAgICogVGhlIHNhbml0aXphdGlvbiBpcyBhIHNlY3VyaXR5IG1lYXN1cmUgYWltZWQgYXQgcHJldmVudCBYU1MgYXR0YWNrcyB2aWEgaHRtbCBsaW5rcy4KKyAgICoKKyAgICogQW55IHVybCBhYm91dCB0byBiZSBhc3NpZ25lZCB0byBpbWdbc3JjXSB2aWEgZGF0YS1iaW5kaW5nIGlzIGZpcnN0IG5vcm1hbGl6ZWQgYW5kIHR1cm5lZCBpbnRvCisgICAqIGFuIGFic29sdXRlIHVybC4gQWZ0ZXJ3YXJkcywgdGhlIHVybCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3RgCisgICAqIHJlZ3VsYXIgZXhwcmVzc2lvbi4gSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhlIG9yaWdpbmFsIHVybCBpcyB3cml0dGVuIGludG8gdGhlIGRvbS4gT3RoZXJ3aXNlLAorICAgKiB0aGUgYWJzb2x1dGUgdXJsIGlzIHByZWZpeGVkIHdpdGggYCd1bnNhZmU6J2Agc3RyaW5nIGFuZCBvbmx5IHRoZW4gaXMgaXQgd3JpdHRlbiBpbnRvIHRoZSBET00uCisgICAqCisgICAqIEBwYXJhbSB7UmVnRXhwPX0gcmVnZXhwIE5ldyByZWdleHAgdG8gd2hpdGVsaXN0IHVybHMgd2l0aC4KKyAgICogQHJldHVybnMge1JlZ0V4cHxuZy4kY29tcGlsZVByb3ZpZGVyfSBDdXJyZW50IFJlZ0V4cCBpZiBjYWxsZWQgd2l0aG91dCB2YWx1ZSBvciBzZWxmIGZvcgorICAgKiAgICBjaGFpbmluZyBvdGhlcndpc2UuCisgICAqLworICB0aGlzLmltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCA9IGZ1bmN0aW9uKHJlZ2V4cCkgeworICAgIGlmIChpc0RlZmluZWQocmVnZXhwKSkgeworICAgICAgaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0ID0gcmVnZXhwOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIHJldHVybiBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3Q7CisgIH07CisKKyAgdGhpcy4kZ2V0ID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uIHNhbml0aXplVXJpKHVyaSwgaXNJbWFnZSkgeworICAgICAgdmFyIHJlZ2V4ID0gaXNJbWFnZSA/IGltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCA6IGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0OworICAgICAgdmFyIG5vcm1hbGl6ZWRWYWw7CisgICAgICBub3JtYWxpemVkVmFsID0gdXJsUmVzb2x2ZSh1cmkpLmhyZWY7CisgICAgICBpZiAobm9ybWFsaXplZFZhbCAhPT0gJycgJiYgIW5vcm1hbGl6ZWRWYWwubWF0Y2gocmVnZXgpKSB7CisgICAgICAgIHJldHVybiAndW5zYWZlOicgKyBub3JtYWxpemVkVmFsOworICAgICAgfQorICAgICAgcmV0dXJuIHVyaTsKKyAgICB9OworICB9OworfQorCit2YXIgJHNjZU1pbkVyciA9IG1pbkVycignJHNjZScpOworCit2YXIgU0NFX0NPTlRFWFRTID0geworICBIVE1MOiAnaHRtbCcsCisgIENTUzogJ2NzcycsCisgIFVSTDogJ3VybCcsCisgIC8vIFJFU09VUkNFX1VSTCBpcyBhIHN1YnR5cGUgb2YgVVJMIHVzZWQgaW4gY29udGV4dHMgd2hlcmUgYSBwcml2aWxlZ2VkIHJlc291cmNlIGlzIHNvdXJjZWQgZnJvbSBhCisgIC8vIHVybC4gIChlLmcuIG5nLWluY2x1ZGUsIHNjcmlwdCBzcmMsIHRlbXBsYXRlVXJsKQorICBSRVNPVVJDRV9VUkw6ICdyZXNvdXJjZVVybCcsCisgIEpTOiAnanMnCit9OworCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvbGxvdy4KKworZnVuY3Rpb24gYWRqdXN0TWF0Y2hlcihtYXRjaGVyKSB7CisgIGlmIChtYXRjaGVyID09PSAnc2VsZicpIHsKKyAgICByZXR1cm4gbWF0Y2hlcjsKKyAgfSBlbHNlIGlmIChpc1N0cmluZyhtYXRjaGVyKSkgeworICAgIC8vIFN0cmluZ3MgbWF0Y2ggZXhhY3RseSBleGNlcHQgZm9yIDIgd2lsZGNhcmRzIC0gJyonIGFuZCAnKionLgorICAgIC8vICcqJyBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgZXhjZXB0IHRob3NlIGZyb20gdGhlIHNldCAnOi8uPyYnLgorICAgIC8vICcqKicgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIChsaWtlIC4qIGluIGEgUmVnRXhwKS4KKyAgICAvLyBNb3JlIHRoYW4gMiAqJ3MgcmFpc2VzIGFuIGVycm9yIGFzIGl0J3MgaWxsIGRlZmluZWQuCisgICAgaWYgKG1hdGNoZXIuaW5kZXhPZignKioqJykgPiAtMSkgeworICAgICAgdGhyb3cgJHNjZU1pbkVycignaXdjYXJkJywKKyAgICAgICAgICAnSWxsZWdhbCBzZXF1ZW5jZSAqKiogaW4gc3RyaW5nIG1hdGNoZXIuICBTdHJpbmc6IHswfScsIG1hdGNoZXIpOworICAgIH0KKyAgICBtYXRjaGVyID0gZXNjYXBlRm9yUmVnZXhwKG1hdGNoZXIpLgorICAgICAgICAgICAgICAgICAgcmVwbGFjZSgnXFwqXFwqJywgJy4qJykuCisgICAgICAgICAgICAgICAgICByZXBsYWNlKCdcXConLCAnW146Ly4/JjtdKicpOworICAgIHJldHVybiBuZXcgUmVnRXhwKCdeJyArIG1hdGNoZXIgKyAnJCcpOworICB9IGVsc2UgaWYgKGlzUmVnRXhwKG1hdGNoZXIpKSB7CisgICAgLy8gVGhlIG9ubHkgb3RoZXIgdHlwZSBvZiBtYXRjaGVyIGFsbG93ZWQgaXMgYSBSZWdleHAuCisgICAgLy8gTWF0Y2ggZW50aXJlIFVSTCAvIGRpc2FsbG93IHBhcnRpYWwgbWF0Y2hlcy4KKyAgICAvLyBGbGFncyBhcmUgcmVzZXQgKGkuZS4gbm8gZ2xvYmFsLCBpZ25vcmVDYXNlIG9yIG11bHRpbGluZSkKKyAgICByZXR1cm4gbmV3IFJlZ0V4cCgnXicgKyBtYXRjaGVyLnNvdXJjZSArICckJyk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgJHNjZU1pbkVycignaW1hdGNoZXInLAorICAgICAgICAnTWF0Y2hlcnMgbWF5IG9ubHkgYmUgInNlbGYiLCBzdHJpbmcgcGF0dGVybnMgb3IgUmVnRXhwIG9iamVjdHMnKTsKKyAgfQorfQorCisKK2Z1bmN0aW9uIGFkanVzdE1hdGNoZXJzKG1hdGNoZXJzKSB7CisgIHZhciBhZGp1c3RlZE1hdGNoZXJzID0gW107CisgIGlmIChpc0RlZmluZWQobWF0Y2hlcnMpKSB7CisgICAgZm9yRWFjaChtYXRjaGVycywgZnVuY3Rpb24obWF0Y2hlcikgeworICAgICAgYWRqdXN0ZWRNYXRjaGVycy5wdXNoKGFkanVzdE1hdGNoZXIobWF0Y2hlcikpOworICAgIH0pOworICB9CisgIHJldHVybiBhZGp1c3RlZE1hdGNoZXJzOworfQorCisKKy8qKgorICogQG5nZG9jIHNlcnZpY2UKKyAqIEBuYW1lICRzY2VEZWxlZ2F0ZQorICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBgJHNjZURlbGVnYXRlYCBpcyBhIHNlcnZpY2UgdGhhdCBpcyB1c2VkIGJ5IHRoZSBgJHNjZWAgc2VydmljZSB0byBwcm92aWRlIHtAbGluayBuZy4kc2NlIFN0cmljdAorICogQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKX0gc2VydmljZXMgdG8gQW5ndWxhckpTLgorICoKKyAqIFR5cGljYWxseSwgeW91IHdvdWxkIGNvbmZpZ3VyZSBvciBvdmVycmlkZSB0aGUge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSAkc2NlRGVsZWdhdGV9IGluc3RlYWQgb2YKKyAqIHRoZSBgJHNjZWAgc2VydmljZSB0byBjdXN0b21pemUgdGhlIHdheSBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyB3b3JrcyBpbiBBbmd1bGFySlMuICBUaGlzIGlzCisgKiBiZWNhdXNlLCB3aGlsZSB0aGUgYCRzY2VgIHByb3ZpZGVzIG51bWVyb3VzIHNob3J0aGFuZCBtZXRob2RzLCBldGMuLCB5b3UgcmVhbGx5IG9ubHkgbmVlZCB0bworICogb3ZlcnJpZGUgMyBjb3JlIGZ1bmN0aW9ucyAoYHRydXN0QXNgLCBgZ2V0VHJ1c3RlZGAgYW5kIGB2YWx1ZU9mYCkgdG8gcmVwbGFjZSB0aGUgd2F5IHRoaW5ncworICogd29yayBiZWNhdXNlIGAkc2NlYCBkZWxlZ2F0ZXMgdG8gYCRzY2VEZWxlZ2F0ZWAgZm9yIHRoZXNlIG9wZXJhdGlvbnMuCisgKgorICogUmVmZXIge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyICRzY2VEZWxlZ2F0ZVByb3ZpZGVyfSB0byBjb25maWd1cmUgdGhpcyBzZXJ2aWNlLgorICoKKyAqIFRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIGAkc2NlRGVsZWdhdGVgIHNob3VsZCB3b3JrIG91dCBvZiB0aGUgYm94IHdpdGggbGl0dGxlIHBhaW4uICBXaGlsZSB5b3UKKyAqIGNhbiBvdmVycmlkZSBpdCBjb21wbGV0ZWx5IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgYCRzY2VgLCB0aGUgY29tbW9uIGNhc2Ugd291bGQKKyAqIGludm9sdmUgY29uZmlndXJpbmcgdGhlIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciAkc2NlRGVsZWdhdGVQcm92aWRlcn0gaW5zdGVhZCBieSBzZXR0aW5nCisgKiB5b3VyIG93biB3aGl0ZWxpc3RzIGFuZCBibGFja2xpc3RzIGZvciB0cnVzdGluZyBVUkxzIHVzZWQgZm9yIGxvYWRpbmcgQW5ndWxhckpTIHJlc291cmNlcyBzdWNoIGFzCisgKiB0ZW1wbGF0ZXMuICBSZWZlciB7QGxpbmsgbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxXaGl0ZWxpc3QKKyAqICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsV2hpdGVsaXN0fSBhbmQge0BsaW5rCisgKiBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybEJsYWNrbGlzdCAkc2NlRGVsZWdhdGVQcm92aWRlci5yZXNvdXJjZVVybEJsYWNrbGlzdH0KKyAqLworCisvKioKKyAqIEBuZ2RvYyBwcm92aWRlcgorICogQG5hbWUgJHNjZURlbGVnYXRlUHJvdmlkZXIKKyAqIEBkZXNjcmlwdGlvbgorICoKKyAqIFRoZSBgJHNjZURlbGVnYXRlUHJvdmlkZXJgIHByb3ZpZGVyIGFsbG93cyBkZXZlbG9wZXJzIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZQorICogJHNjZURlbGVnYXRlfSBzZXJ2aWNlLiAgVGhpcyBhbGxvd3Mgb25lIHRvIGdldC9zZXQgdGhlIHdoaXRlbGlzdHMgYW5kIGJsYWNrbGlzdHMgdXNlZCB0byBlbnN1cmUKKyAqIHRoYXQgdGhlIFVSTHMgdXNlZCBmb3Igc291cmNpbmcgQW5ndWxhciB0ZW1wbGF0ZXMgYXJlIHNhZmUuICBSZWZlciB7QGxpbmsKKyAqIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0ICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsV2hpdGVsaXN0fSBhbmQKKyAqIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybEJsYWNrbGlzdCAkc2NlRGVsZWdhdGVQcm92aWRlci5yZXNvdXJjZVVybEJsYWNrbGlzdH0KKyAqCisgKiBGb3IgdGhlIGdlbmVyYWwgZGV0YWlscyBhYm91dCB0aGlzIHNlcnZpY2UgaW4gQW5ndWxhciwgcmVhZCB0aGUgbWFpbiBwYWdlIGZvciB7QGxpbmsgbmcuJHNjZQorICogU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgKFNDRSl9LgorICoKKyAqICoqRXhhbXBsZSoqOiAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBjYXNlLiA8YSBuYW1lPSJleGFtcGxlIj48L2E+CisgKgorICogLSB5b3VyIGFwcCBpcyBob3N0ZWQgYXQgdXJsIGBodHRwOi8vbXlhcHAuZXhhbXBsZS5jb20vYAorICogLSBidXQgc29tZSBvZiB5b3VyIHRlbXBsYXRlcyBhcmUgaG9zdGVkIG9uIG90aGVyIGRvbWFpbnMgeW91IGNvbnRyb2wgc3VjaCBhcworICogICBgaHR0cDovL3NydjAxLmFzc2V0cy5leGFtcGxlLmNvbS9gLMKgIGBodHRwOi8vc3J2MDIuYXNzZXRzLmV4YW1wbGUuY29tL2AsIGV0Yy4KKyAqIC0gYW5kIHlvdSBoYXZlIGFuIG9wZW4gcmVkaXJlY3QgYXQgYGh0dHA6Ly9teWFwcC5leGFtcGxlLmNvbS9jbGlja1RocnU/Li4uYC4KKyAqCisgKiBIZXJlIGlzIHdoYXQgYSBzZWN1cmUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzY2VuYXJpbyBtaWdodCBsb29rIGxpa2U6CisgKgorICogYGBgCisgKiAgYW5ndWxhci5tb2R1bGUoJ215QXBwJywgW10pLmNvbmZpZyhmdW5jdGlvbigkc2NlRGVsZWdhdGVQcm92aWRlcikgeworICogICAgJHNjZURlbGVnYXRlUHJvdmlkZXIucmVzb3VyY2VVcmxXaGl0ZWxpc3QoWworICogICAgICAvLyBBbGxvdyBzYW1lIG9yaWdpbiByZXNvdXJjZSBsb2Fkcy4KKyAqICAgICAgJ3NlbGYnLAorICogICAgICAvLyBBbGxvdyBsb2FkaW5nIGZyb20gb3VyIGFzc2V0cyBkb21haW4uICBOb3RpY2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAqIGFuZCAqKi4KKyAqICAgICAgJ2h0dHA6Ly9zcnYqLmFzc2V0cy5leGFtcGxlLmNvbS8qKicKKyAqICAgIF0pOworICoKKyAqICAgIC8vIFRoZSBibGFja2xpc3Qgb3ZlcnJpZGVzIHRoZSB3aGl0ZWxpc3Qgc28gdGhlIG9wZW4gcmVkaXJlY3QgaGVyZSBpcyBibG9ja2VkLgorICogICAgJHNjZURlbGVnYXRlUHJvdmlkZXIucmVzb3VyY2VVcmxCbGFja2xpc3QoWworICogICAgICAnaHR0cDovL215YXBwLmV4YW1wbGUuY29tL2NsaWNrVGhydSoqJworICogICAgXSk7CisgKiAgfSk7CisgKiBgYGAKKyAqLworCitmdW5jdGlvbiAkU2NlRGVsZWdhdGVQcm92aWRlcigpIHsKKyAgdGhpcy5TQ0VfQ09OVEVYVFMgPSBTQ0VfQ09OVEVYVFM7CisKKyAgLy8gUmVzb3VyY2UgVVJMcyBjYW4gYWxzbyBiZSB0cnVzdGVkIGJ5IHBvbGljeS4KKyAgdmFyIHJlc291cmNlVXJsV2hpdGVsaXN0ID0gWydzZWxmJ10sCisgICAgICByZXNvdXJjZVVybEJsYWNrbGlzdCA9IFtdOworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0CisgICAqIEBraW5kIGZ1bmN0aW9uCisgICAqCisgICAqIEBwYXJhbSB7QXJyYXk9fSB3aGl0ZWxpc3QgV2hlbiBwcm92aWRlZCwgcmVwbGFjZXMgdGhlIHJlc291cmNlVXJsV2hpdGVsaXN0IHdpdGggdGhlIHZhbHVlCisgICAqICAgICBwcm92aWRlZC4gIFRoaXMgbXVzdCBiZSBhbiBhcnJheSBvciBudWxsLiAgQSBzbmFwc2hvdCBvZiB0aGlzIGFycmF5IGlzIHVzZWQgc28gZnVydGhlcgorICAgKiAgICAgY2hhbmdlcyB0byB0aGUgYXJyYXkgYXJlIGlnbm9yZWQuCisgICAqCisgICAqICAgICBGb2xsb3cge0BsaW5rIG5nLiRzY2UjcmVzb3VyY2VVcmxQYXR0ZXJuSXRlbSB0aGlzIGxpbmt9IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBpdGVtcworICAgKiAgICAgYWxsb3dlZCBpbiB0aGlzIGFycmF5LgorICAgKgorICAgKiAgICAgTm90ZTogKiphbiBlbXB0eSB3aGl0ZWxpc3QgYXJyYXkgd2lsbCBibG9jayBhbGwgVVJMcyoqIQorICAgKgorICAgKiBAcmV0dXJuIHtBcnJheX0gdGhlIGN1cnJlbnRseSBzZXQgd2hpdGVsaXN0IGFycmF5LgorICAgKgorICAgKiBUaGUgKipkZWZhdWx0IHZhbHVlKiogd2hlbiBubyB3aGl0ZWxpc3QgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQgaXMgYFsnc2VsZiddYCBhbGxvd2luZyBvbmx5CisgICAqIHNhbWUgb3JpZ2luIHJlc291cmNlIHJlcXVlc3RzLgorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogU2V0cy9HZXRzIHRoZSB3aGl0ZWxpc3Qgb2YgdHJ1c3RlZCByZXNvdXJjZSBVUkxzLgorICAgKi8KKyAgdGhpcy5yZXNvdXJjZVVybFdoaXRlbGlzdCA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHsKKyAgICAgIHJlc291cmNlVXJsV2hpdGVsaXN0ID0gYWRqdXN0TWF0Y2hlcnModmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gcmVzb3VyY2VVcmxXaGl0ZWxpc3Q7CisgIH07CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxCbGFja2xpc3QKKyAgICogQGtpbmQgZnVuY3Rpb24KKyAgICoKKyAgICogQHBhcmFtIHtBcnJheT19IGJsYWNrbGlzdCBXaGVuIHByb3ZpZGVkLCByZXBsYWNlcyB0aGUgcmVzb3VyY2VVcmxCbGFja2xpc3Qgd2l0aCB0aGUgdmFsdWUKKyAgICogICAgIHByb3ZpZGVkLiAgVGhpcyBtdXN0IGJlIGFuIGFycmF5IG9yIG51bGwuICBBIHNuYXBzaG90IG9mIHRoaXMgYXJyYXkgaXMgdXNlZCBzbyBmdXJ0aGVyCisgICAqICAgICBjaGFuZ2VzIHRvIHRoZSBhcnJheSBhcmUgaWdub3JlZC4KKyAgICoKKyAgICogICAgIEZvbGxvdyB7QGxpbmsgbmcuJHNjZSNyZXNvdXJjZVVybFBhdHRlcm5JdGVtIHRoaXMgbGlua30gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGl0ZW1zCisgICAqICAgICBhbGxvd2VkIGluIHRoaXMgYXJyYXkuCisgICAqCisgICAqICAgICBUaGUgdHlwaWNhbCB1c2FnZSBmb3IgdGhlIGJsYWNrbGlzdCBpcyB0byAqKmJsb2NrCisgICAqICAgICBbb3BlbiByZWRpcmVjdHNdKGh0dHA6Ly9jd2UubWl0cmUub3JnL2RhdGEvZGVmaW5pdGlvbnMvNjAxLmh0bWwpKiogc2VydmVkIGJ5IHlvdXIgZG9tYWluIGFzCisgICAqICAgICB0aGVzZSB3b3VsZCBvdGhlcndpc2UgYmUgdHJ1c3RlZCBidXQgYWN0dWFsbHkgcmV0dXJuIGNvbnRlbnQgZnJvbSB0aGUgcmVkaXJlY3RlZCBkb21haW4uCisgICAqCisgICAqICAgICBGaW5hbGx5LCAqKnRoZSBibGFja2xpc3Qgb3ZlcnJpZGVzIHRoZSB3aGl0ZWxpc3QqKiBhbmQgaGFzIHRoZSBmaW5hbCBzYXkuCisgICAqCisgICAqIEByZXR1cm4ge0FycmF5fSB0aGUgY3VycmVudGx5IHNldCBibGFja2xpc3QgYXJyYXkuCisgICAqCisgICAqIFRoZSAqKmRlZmF1bHQgdmFsdWUqKiB3aGVuIG5vIHdoaXRlbGlzdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldCBpcyB0aGUgZW1wdHkgYXJyYXkgKGkuZS4gdGhlcmUKKyAgICogaXMgbm8gYmxhY2tsaXN0LikKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIFNldHMvR2V0cyB0aGUgYmxhY2tsaXN0IG9mIHRydXN0ZWQgcmVzb3VyY2UgVVJMcy4KKyAgICovCisKKyAgdGhpcy5yZXNvdXJjZVVybEJsYWNrbGlzdCA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHsKKyAgICAgIHJlc291cmNlVXJsQmxhY2tsaXN0ID0gYWRqdXN0TWF0Y2hlcnModmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gcmVzb3VyY2VVcmxCbGFja2xpc3Q7CisgIH07CisKKyAgdGhpcy4kZ2V0ID0gWyckaW5qZWN0b3InLCBmdW5jdGlvbigkaW5qZWN0b3IpIHsKKworICAgIHZhciBodG1sU2FuaXRpemVyID0gZnVuY3Rpb24gaHRtbFNhbml0aXplcihodG1sKSB7CisgICAgICB0aHJvdyAkc2NlTWluRXJyKCd1bnNhZmUnLCAnQXR0ZW1wdGluZyB0byB1c2UgYW4gdW5zYWZlIHZhbHVlIGluIGEgc2FmZSBjb250ZXh0LicpOworICAgIH07CisKKyAgICBpZiAoJGluamVjdG9yLmhhcygnJHNhbml0aXplJykpIHsKKyAgICAgIGh0bWxTYW5pdGl6ZXIgPSAkaW5qZWN0b3IuZ2V0KCckc2FuaXRpemUnKTsKKyAgICB9CisKKworICAgIGZ1bmN0aW9uIG1hdGNoVXJsKG1hdGNoZXIsIHBhcnNlZFVybCkgeworICAgICAgaWYgKG1hdGNoZXIgPT09ICdzZWxmJykgeworICAgICAgICByZXR1cm4gdXJsSXNTYW1lT3JpZ2luKHBhcnNlZFVybCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBkZWZpbml0ZWx5IGEgcmVnZXguICBTZWUgYWRqdXN0TWF0Y2hlcnMoKQorICAgICAgICByZXR1cm4gISFtYXRjaGVyLmV4ZWMocGFyc2VkVXJsLmhyZWYpOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIGlzUmVzb3VyY2VVcmxBbGxvd2VkQnlQb2xpY3kodXJsKSB7CisgICAgICB2YXIgcGFyc2VkVXJsID0gdXJsUmVzb2x2ZSh1cmwudG9TdHJpbmcoKSk7CisgICAgICB2YXIgaSwgbiwgYWxsb3dlZCA9IGZhbHNlOworICAgICAgLy8gRW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIGl0ZW0gZnJvbSB0aGUgd2hpdGVsaXN0IGFsbG93cyB0aGlzIHVybC4KKyAgICAgIGZvciAoaSA9IDAsIG4gPSByZXNvdXJjZVVybFdoaXRlbGlzdC5sZW5ndGg7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKG1hdGNoVXJsKHJlc291cmNlVXJsV2hpdGVsaXN0W2ldLCBwYXJzZWRVcmwpKSB7CisgICAgICAgICAgYWxsb3dlZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChhbGxvd2VkKSB7CisgICAgICAgIC8vIEVuc3VyZSB0aGF0IG5vIGl0ZW0gZnJvbSB0aGUgYmxhY2tsaXN0IGJsb2NrZWQgdGhpcyB1cmwuCisgICAgICAgIGZvciAoaSA9IDAsIG4gPSByZXNvdXJjZVVybEJsYWNrbGlzdC5sZW5ndGg7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICBpZiAobWF0Y2hVcmwocmVzb3VyY2VVcmxCbGFja2xpc3RbaV0sIHBhcnNlZFVybCkpIHsKKyAgICAgICAgICAgIGFsbG93ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGFsbG93ZWQ7CisgICAgfQorCisgICAgZnVuY3Rpb24gZ2VuZXJhdGVIb2xkZXJUeXBlKEJhc2UpIHsKKyAgICAgIHZhciBob2xkZXJUeXBlID0gZnVuY3Rpb24gVHJ1c3RlZFZhbHVlSG9sZGVyVHlwZSh0cnVzdGVkVmFsdWUpIHsKKyAgICAgICAgdGhpcy4kJHVud3JhcFRydXN0ZWRWYWx1ZSA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHJldHVybiB0cnVzdGVkVmFsdWU7CisgICAgICAgIH07CisgICAgICB9OworICAgICAgaWYgKEJhc2UpIHsKKyAgICAgICAgaG9sZGVyVHlwZS5wcm90b3R5cGUgPSBuZXcgQmFzZSgpOworICAgICAgfQorICAgICAgaG9sZGVyVHlwZS5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uIHNjZVZhbHVlT2YoKSB7CisgICAgICAgIHJldHVybiB0aGlzLiQkdW53cmFwVHJ1c3RlZFZhbHVlKCk7CisgICAgICB9OworICAgICAgaG9sZGVyVHlwZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBzY2VUb1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuJCR1bndyYXBUcnVzdGVkVmFsdWUoKS50b1N0cmluZygpOworICAgICAgfTsKKyAgICAgIHJldHVybiBob2xkZXJUeXBlOworICAgIH0KKworICAgIHZhciB0cnVzdGVkVmFsdWVIb2xkZXJCYXNlID0gZ2VuZXJhdGVIb2xkZXJUeXBlKCksCisgICAgICAgIGJ5VHlwZSA9IHt9OworCisgICAgYnlUeXBlW1NDRV9DT05URVhUUy5IVE1MXSA9IGdlbmVyYXRlSG9sZGVyVHlwZSh0cnVzdGVkVmFsdWVIb2xkZXJCYXNlKTsKKyAgICBieVR5cGVbU0NFX0NPTlRFWFRTLkNTU10gPSBnZW5lcmF0ZUhvbGRlclR5cGUodHJ1c3RlZFZhbHVlSG9sZGVyQmFzZSk7CisgICAgYnlUeXBlW1NDRV9DT05URVhUUy5VUkxdID0gZ2VuZXJhdGVIb2xkZXJUeXBlKHRydXN0ZWRWYWx1ZUhvbGRlckJhc2UpOworICAgIGJ5VHlwZVtTQ0VfQ09OVEVYVFMuSlNdID0gZ2VuZXJhdGVIb2xkZXJUeXBlKHRydXN0ZWRWYWx1ZUhvbGRlckJhc2UpOworICAgIGJ5VHlwZVtTQ0VfQ09OVEVYVFMuUkVTT1VSQ0VfVVJMXSA9IGdlbmVyYXRlSG9sZGVyVHlwZShieVR5cGVbU0NFX0NPTlRFWFRTLlVSTF0pOworCisgICAgLyoqCisgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAqIEBuYW1lICRzY2VEZWxlZ2F0ZSN0cnVzdEFzCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGlzIHRydXN0ZWQgYnkgYW5ndWxhciBmb3IgdXNlIGluIHNwZWNpZmllZCBzdHJpY3QKKyAgICAgKiBjb250ZXh0dWFsIGVzY2FwaW5nIGNvbnRleHRzIChzdWNoIGFzIG5nLWJpbmQtaHRtbCwgbmctaW5jbHVkZSwgYW55IHNyYworICAgICAqIGF0dHJpYnV0ZSBpbnRlcnBvbGF0aW9uLCBhbnkgZG9tIGV2ZW50IGJpbmRpbmcgYXR0cmlidXRlIGludGVycG9sYXRpb24KKyAgICAgKiBzdWNoIGFzIGZvciBvbmNsaWNrLCAgZXRjLikgdGhhdCB1c2VzIHRoZSBwcm92aWRlZCB2YWx1ZS4KKyAgICAgKiBTZWUge0BsaW5rIG5nLiRzY2UgJHNjZX0gZm9yIGVuYWJsaW5nIHN0cmljdCBjb250ZXh0dWFsIGVzY2FwaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGtpbmQgb2YgY29udGV4dCBpbiB3aGljaCB0aGlzIHZhbHVlIGlzIHNhZmUgZm9yIHVzZS4gIGUuZy4gdXJsLAorICAgICAqICAgcmVzb3VyY2VVcmwsIGh0bWwsIGpzIGFuZCBjc3MuCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIHRydXN0ZWQvc2FmZS4KKyAgICAgKiBAcmV0dXJucyB7Kn0gQSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0YW5kIGluIGZvciB0aGUgcHJvdmlkZWQgYHZhbHVlYCBpbiBwbGFjZXMKKyAgICAgKiB3aGVyZSBBbmd1bGFyIGV4cGVjdHMgYSAkc2NlLnRydXN0QXMoKSByZXR1cm4gdmFsdWUuCisgICAgICovCisgICAgZnVuY3Rpb24gdHJ1c3RBcyh0eXBlLCB0cnVzdGVkVmFsdWUpIHsKKyAgICAgIHZhciBDb25zdHJ1Y3RvciA9IChieVR5cGUuaGFzT3duUHJvcGVydHkodHlwZSkgPyBieVR5cGVbdHlwZV0gOiBudWxsKTsKKyAgICAgIGlmICghQ29uc3RydWN0b3IpIHsKKyAgICAgICAgdGhyb3cgJHNjZU1pbkVycignaWNvbnRleHQnLAorICAgICAgICAgICAgJ0F0dGVtcHRlZCB0byB0cnVzdCBhIHZhbHVlIGluIGludmFsaWQgY29udGV4dC4gQ29udGV4dDogezB9OyBWYWx1ZTogezF9JywKKyAgICAgICAgICAgIHR5cGUsIHRydXN0ZWRWYWx1ZSk7CisgICAgICB9CisgICAgICBpZiAodHJ1c3RlZFZhbHVlID09PSBudWxsIHx8IHRydXN0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRydXN0ZWRWYWx1ZSA9PT0gJycpIHsKKyAgICAgICAgcmV0dXJuIHRydXN0ZWRWYWx1ZTsKKyAgICAgIH0KKyAgICAgIC8vIEFsbCB0aGUgY3VycmVudCBjb250ZXh0cyBpbiBTQ0VfQ09OVEVYVFMgaGFwcGVuIHRvIGJlIHN0cmluZ3MuICBJbiBvcmRlciB0byBhdm9pZCB0cnVzdGluZworICAgICAgLy8gbXV0YWJsZSBvYmplY3RzLCB3ZSBlbnN1cmUgaGVyZSB0aGF0IHRoZSB2YWx1ZSBwYXNzZWQgaW4gaXMgYWN0dWFsbHkgYSBzdHJpbmcuCisgICAgICBpZiAodHlwZW9mIHRydXN0ZWRWYWx1ZSAhPT0gJ3N0cmluZycpIHsKKyAgICAgICAgdGhyb3cgJHNjZU1pbkVycignaXR5cGUnLAorICAgICAgICAgICAgJ0F0dGVtcHRlZCB0byB0cnVzdCBhIG5vbi1zdHJpbmcgdmFsdWUgaW4gYSBjb250ZW50IHJlcXVpcmluZyBhIHN0cmluZzogQ29udGV4dDogezB9JywKKyAgICAgICAgICAgIHR5cGUpOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0cnVzdGVkVmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgKiBAbmFtZSAkc2NlRGVsZWdhdGUjdmFsdWVPZgorICAgICAqCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICogSWYgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaGFkIGJlZW4gcmV0dXJuZWQgYnkgYSBwcmlvciBjYWxsIHRvIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcworICAgICAqIGAkc2NlRGVsZWdhdGUudHJ1c3RBc2B9LCByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IGhhZCBiZWVuIHBhc3NlZCB0byB7QGxpbmsKKyAgICAgKiBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXNgfS4KKyAgICAgKgorICAgICAqIElmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGlzIG5vdCBhIHZhbHVlIHRoYXQgaGFkIGJlZW4gcmV0dXJuZWQgYnkge0BsaW5rCisgICAgICogbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0sIHJldHVybnMgaXQgYXMtaXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSByZXN1bHQgb2YgYSBwcmlvciB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0KKyAgICAgKiAgICAgIGNhbGwgb3IgYW55dGhpbmcgZWxzZS4KKyAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIGB2YWx1ZWAgdGhhdCB3YXMgb3JpZ2luYWxseSBwcm92aWRlZCB0byB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMKKyAgICAgKiAgICAgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0gaWYgYHZhbHVlYCBpcyB0aGUgcmVzdWx0IG9mIHN1Y2ggYSBjYWxsLiAgT3RoZXJ3aXNlLCByZXR1cm5zCisgICAgICogICAgIGB2YWx1ZWAgdW5jaGFuZ2VkLgorICAgICAqLworICAgIGZ1bmN0aW9uIHZhbHVlT2YobWF5YmVUcnVzdGVkKSB7CisgICAgICBpZiAobWF5YmVUcnVzdGVkIGluc3RhbmNlb2YgdHJ1c3RlZFZhbHVlSG9sZGVyQmFzZSkgeworICAgICAgICByZXR1cm4gbWF5YmVUcnVzdGVkLiQkdW53cmFwVHJ1c3RlZFZhbHVlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbWF5YmVUcnVzdGVkOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgKiBAbmFtZSAkc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZAorICAgICAqCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICogVGFrZXMgdGhlIHJlc3VsdCBvZiBhIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXNgfSBjYWxsIGFuZAorICAgICAqIHJldHVybnMgdGhlIG9yaWdpbmFsbHkgc3VwcGxpZWQgdmFsdWUgaWYgdGhlIHF1ZXJpZWQgY29udGV4dCB0eXBlIGlzIGEgc3VwZXJ0eXBlIG9mIHRoZQorICAgICAqIGNyZWF0ZWQgdHlwZS4gIElmIHRoaXMgY29uZGl0aW9uIGlzbid0IHNhdGlzZmllZCwgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBraW5kIG9mIGNvbnRleHQgaW4gd2hpY2ggdGhpcyB2YWx1ZSBpcyB0byBiZSB1c2VkLgorICAgICAqIEBwYXJhbSB7Kn0gbWF5YmVUcnVzdGVkIFRoZSByZXN1bHQgb2YgYSBwcmlvciB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMKKyAgICAgKiAgICAgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0gY2FsbC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIHRoZSB3YXMgb3JpZ2luYWxseSBwcm92aWRlZCB0byB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMKKyAgICAgKiAgICAgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0gaWYgdmFsaWQgaW4gdGhpcyBjb250ZXh0LiAgT3RoZXJ3aXNlLCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIGZ1bmN0aW9uIGdldFRydXN0ZWQodHlwZSwgbWF5YmVUcnVzdGVkKSB7CisgICAgICBpZiAobWF5YmVUcnVzdGVkID09PSBudWxsIHx8IG1heWJlVHJ1c3RlZCA9PT0gdW5kZWZpbmVkIHx8IG1heWJlVHJ1c3RlZCA9PT0gJycpIHsKKyAgICAgICAgcmV0dXJuIG1heWJlVHJ1c3RlZDsKKyAgICAgIH0KKyAgICAgIHZhciBjb25zdHJ1Y3RvciA9IChieVR5cGUuaGFzT3duUHJvcGVydHkodHlwZSkgPyBieVR5cGVbdHlwZV0gOiBudWxsKTsKKyAgICAgIGlmIChjb25zdHJ1Y3RvciAmJiBtYXliZVRydXN0ZWQgaW5zdGFuY2VvZiBjb25zdHJ1Y3RvcikgeworICAgICAgICByZXR1cm4gbWF5YmVUcnVzdGVkLiQkdW53cmFwVHJ1c3RlZFZhbHVlKCk7CisgICAgICB9CisgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgdGhlbiB3ZSBtYXkgb25seSB0YWtlIG9uZSBvZiB0d28gYWN0aW9ucy4KKyAgICAgIC8vIDEuIHNhbml0aXplIHRoZSB2YWx1ZSBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlLCBvcgorICAgICAgLy8gMi4gdGhyb3cgYW4gZXhjZXB0aW9uLgorICAgICAgaWYgKHR5cGUgPT09IFNDRV9DT05URVhUUy5SRVNPVVJDRV9VUkwpIHsKKyAgICAgICAgaWYgKGlzUmVzb3VyY2VVcmxBbGxvd2VkQnlQb2xpY3kobWF5YmVUcnVzdGVkKSkgeworICAgICAgICAgIHJldHVybiBtYXliZVRydXN0ZWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgJHNjZU1pbkVycignaW5zZWN1cmwnLAorICAgICAgICAgICAgICAnQmxvY2tlZCBsb2FkaW5nIHJlc291cmNlIGZyb20gdXJsIG5vdCBhbGxvd2VkIGJ5ICRzY2VEZWxlZ2F0ZSBwb2xpY3kuICBVUkw6IHswfScsCisgICAgICAgICAgICAgIG1heWJlVHJ1c3RlZC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBTQ0VfQ09OVEVYVFMuSFRNTCkgeworICAgICAgICByZXR1cm4gaHRtbFNhbml0aXplcihtYXliZVRydXN0ZWQpOworICAgICAgfQorICAgICAgdGhyb3cgJHNjZU1pbkVycigndW5zYWZlJywgJ0F0dGVtcHRpbmcgdG8gdXNlIGFuIHVuc2FmZSB2YWx1ZSBpbiBhIHNhZmUgY29udGV4dC4nKTsKKyAgICB9CisKKyAgICByZXR1cm4geyB0cnVzdEFzOiB0cnVzdEFzLAorICAgICAgICAgICAgIGdldFRydXN0ZWQ6IGdldFRydXN0ZWQsCisgICAgICAgICAgICAgdmFsdWVPZjogdmFsdWVPZiB9OworICB9XTsKK30KKworCisvKioKKyAqIEBuZ2RvYyBwcm92aWRlcgorICogQG5hbWUgJHNjZVByb3ZpZGVyCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBUaGUgJHNjZVByb3ZpZGVyIHByb3ZpZGVyIGFsbG93cyBkZXZlbG9wZXJzIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIG5nLiRzY2UgJHNjZX0gc2VydmljZS4KKyAqIC0gICBlbmFibGUvZGlzYWJsZSBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKSBpbiBhIG1vZHVsZQorICogLSAgIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpdGggYSBjdXN0b20gZGVsZWdhdGUKKyAqCisgKiBSZWFkIG1vcmUgYWJvdXQge0BsaW5rIG5nLiRzY2UgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgKFNDRSl9LgorICovCisKKy8qIGpzaGludCBtYXhsZW46IGZhbHNlKi8KKworLyoqCisgKiBAbmdkb2Mgc2VydmljZQorICogQG5hbWUgJHNjZQorICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBgJHNjZWAgaXMgYSBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgc2VydmljZXMgdG8gQW5ndWxhckpTLgorICoKKyAqICMgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcKKyAqCisgKiBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKSBpcyBhIG1vZGUgaW4gd2hpY2ggQW5ndWxhckpTIHJlcXVpcmVzIGJpbmRpbmdzIGluIGNlcnRhaW4KKyAqIGNvbnRleHRzIHRvIHJlc3VsdCBpbiBhIHZhbHVlIHRoYXQgaXMgbWFya2VkIGFzIHNhZmUgdG8gdXNlIGZvciB0aGF0IGNvbnRleHQuICBPbmUgZXhhbXBsZSBvZgorICogc3VjaCBhIGNvbnRleHQgaXMgYmluZGluZyBhcmJpdHJhcnkgaHRtbCBjb250cm9sbGVkIGJ5IHRoZSB1c2VyIHZpYSBgbmctYmluZC1odG1sYC4gIFdlIHJlZmVyCisgKiB0byB0aGVzZSBjb250ZXh0cyBhcyBwcml2aWxlZ2VkIG9yIFNDRSBjb250ZXh0cy4KKyAqCisgKiBBcyBvZiB2ZXJzaW9uIDEuMiwgQW5ndWxhciBzaGlwcyB3aXRoIFNDRSBlbmFibGVkIGJ5IGRlZmF1bHQuCisgKgorICogTm90ZTogIFdoZW4gZW5hYmxlZCAodGhlIGRlZmF1bHQpLCBJRTwxMSBpbiBxdWlya3MgbW9kZSBpcyBub3Qgc3VwcG9ydGVkLiAgSW4gdGhpcyBtb2RlLCBJRTwxMSBhbGxvdworICogb25lIHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGphdmFzY3JpcHQgYnkgdGhlIHVzZSBvZiB0aGUgZXhwcmVzc2lvbigpIHN5bnRheC4gIFJlZmVyCisgKiA8aHR0cDovL2Jsb2dzLm1zZG4uY29tL2IvaWUvYXJjaGl2ZS8yMDA4LzEwLzE2L2VuZGluZy1leHByZXNzaW9ucy5hc3B4PiB0byBsZWFybiBtb3JlIGFib3V0IHRoZW0uCisgKiBZb3UgY2FuIGVuc3VyZSB5b3VyIGRvY3VtZW50IGlzIGluIHN0YW5kYXJkcyBtb2RlIGFuZCBub3QgcXVpcmtzIG1vZGUgYnkgYWRkaW5nIGA8IWRvY3R5cGUgaHRtbD5gCisgKiB0byB0aGUgdG9wIG9mIHlvdXIgSFRNTCBkb2N1bWVudC4KKyAqCisgKiBTQ0UgYXNzaXN0cyBpbiB3cml0aW5nIGNvZGUgaW4gd2F5IHRoYXQgKGEpIGlzIHNlY3VyZSBieSBkZWZhdWx0IGFuZCAoYikgbWFrZXMgYXVkaXRpbmcgZm9yCisgKiBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMgc3VjaCBhcyBYU1MsIGNsaWNramFja2luZywgZXRjLiBhIGxvdCBlYXNpZXIuCisgKgorICogSGVyZSdzIGFuIGV4YW1wbGUgb2YgYSBiaW5kaW5nIGluIGEgcHJpdmlsZWdlZCBjb250ZXh0OgorICoKKyAqIGBgYAorICogPGlucHV0IG5nLW1vZGVsPSJ1c2VySHRtbCI+CisgKiA8ZGl2IG5nLWJpbmQtaHRtbD0idXNlckh0bWwiPjwvZGl2PgorICogYGBgCisgKgorICogTm90aWNlIHRoYXQgYG5nLWJpbmQtaHRtbGAgaXMgYm91bmQgdG8gYHVzZXJIdG1sYCBjb250cm9sbGVkIGJ5IHRoZSB1c2VyLiAgV2l0aCBTQ0UKKyAqIGRpc2FibGVkLCB0aGlzIGFwcGxpY2F0aW9uIGFsbG93cyB0aGUgdXNlciB0byByZW5kZXIgYXJiaXRyYXJ5IEhUTUwgaW50byB0aGUgRElWLgorICogSW4gYSBtb3JlIHJlYWxpc3RpYyBleGFtcGxlLCBvbmUgbWF5IGJlIHJlbmRlcmluZyB1c2VyIGNvbW1lbnRzLCBibG9nIGFydGljbGVzLCBldGMuIHZpYQorICogYmluZGluZ3MuICAoSFRNTCBpcyBqdXN0IG9uZSBleGFtcGxlIG9mIGEgY29udGV4dCB3aGVyZSByZW5kZXJpbmcgdXNlciBjb250cm9sbGVkIGlucHV0IGNyZWF0ZXMKKyAqIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4pCisgKgorICogRm9yIHRoZSBjYXNlIG9mIEhUTUwsIHlvdSBtaWdodCB1c2UgYSBsaWJyYXJ5LCBlaXRoZXIgb24gdGhlIGNsaWVudCBzaWRlLCBvciBvbiB0aGUgc2VydmVyIHNpZGUsCisgKiB0byBzYW5pdGl6ZSB1bnNhZmUgSFRNTCBiZWZvcmUgYmluZGluZyB0byB0aGUgdmFsdWUgYW5kIHJlbmRlcmluZyBpdCBpbiB0aGUgZG9jdW1lbnQuCisgKgorICogSG93IHdvdWxkIHlvdSBlbnN1cmUgdGhhdCBldmVyeSBwbGFjZSB0aGF0IHVzZWQgdGhlc2UgdHlwZXMgb2YgYmluZGluZ3Mgd2FzIGJvdW5kIHRvIGEgdmFsdWUgdGhhdAorICogd2FzIHNhbml0aXplZCBieSB5b3VyIGxpYnJhcnkgKG9yIHJldHVybmVkIGFzIHNhZmUgZm9yIHJlbmRlcmluZyBieSB5b3VyIHNlcnZlcj8pICBIb3cgY2FuIHlvdQorICogZW5zdXJlIHRoYXQgeW91IGRpZG4ndCBhY2NpZGVudGFsbHkgZGVsZXRlIHRoZSBsaW5lIHRoYXQgc2FuaXRpemVkIHRoZSB2YWx1ZSwgb3IgcmVuYW1lZCBzb21lCisgKiBwcm9wZXJ0aWVzL2ZpZWxkcyBhbmQgZm9yZ290IHRvIHVwZGF0ZSB0aGUgYmluZGluZyB0byB0aGUgc2FuaXRpemVkIHZhbHVlPworICoKKyAqIFRvIGJlIHNlY3VyZSBieSBkZWZhdWx0LCB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCBhbnkgc3VjaCBiaW5kaW5ncyBhcmUgZGlzYWxsb3dlZCB1bmxlc3MgeW91IGNhbgorICogZGV0ZXJtaW5lIHRoYXQgc29tZXRoaW5nIGV4cGxpY2l0bHkgc2F5cyBpdCdzIHNhZmUgdG8gdXNlIGEgdmFsdWUgZm9yIGJpbmRpbmcgaW4gdGhhdAorICogY29udGV4dC4gIFlvdSBjYW4gdGhlbiBhdWRpdCB5b3VyIGNvZGUgKGEgc2ltcGxlIGdyZXAgd291bGQgZG8pIHRvIGVuc3VyZSB0aGF0IHRoaXMgaXMgb25seSBkb25lCisgKiBmb3IgdGhvc2UgdmFsdWVzIHRoYXQgeW91IGNhbiBlYXNpbHkgdGVsbCBhcmUgc2FmZSAtIGJlY2F1c2UgdGhleSB3ZXJlIHJlY2VpdmVkIGZyb20geW91ciBzZXJ2ZXIsCisgKiBzYW5pdGl6ZWQgYnkgeW91ciBsaWJyYXJ5LCBldGMuICBZb3UgY2FuIG9yZ2FuaXplIHlvdXIgY29kZWJhc2UgdG8gaGVscCB3aXRoIHRoaXMgLSBwZXJoYXBzCisgKiBhbGxvd2luZyBvbmx5IHRoZSBmaWxlcyBpbiBhIHNwZWNpZmljIGRpcmVjdG9yeSB0byBkbyB0aGlzLiAgRW5zdXJpbmcgdGhhdCB0aGUgaW50ZXJuYWwgQVBJCisgKiBleHBvc2VkIGJ5IHRoYXQgY29kZSBkb2Vzbid0IG1hcmt1cCBhcmJpdHJhcnkgdmFsdWVzIGFzIHNhZmUgdGhlbiBiZWNvbWVzIGEgbW9yZSBtYW5hZ2VhYmxlIHRhc2suCisgKgorICogSW4gdGhlIGNhc2Ugb2YgQW5ndWxhckpTJyBTQ0Ugc2VydmljZSwgb25lIHVzZXMge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyAkc2NlLnRydXN0QXN9CisgKiAoYW5kIHNob3J0aGFuZCBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIG5nLiRzY2UjdHJ1c3RBc0h0bWwgJHNjZS50cnVzdEFzSHRtbH0sIGV0Yy4pIHRvCisgKiBvYnRhaW4gdmFsdWVzIHRoYXQgd2lsbCBiZSBhY2NlcHRlZCBieSBTQ0UgLyBwcml2aWxlZ2VkIGNvbnRleHRzLgorICoKKyAqCisgKiAjIyBIb3cgZG9lcyBpdCB3b3JrPworICoKKyAqIEluIHByaXZpbGVnZWQgY29udGV4dHMsIGRpcmVjdGl2ZXMgYW5kIGNvZGUgd2lsbCBiaW5kIHRvIHRoZSByZXN1bHQgb2Yge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZAorICogJHNjZS5nZXRUcnVzdGVkKGNvbnRleHQsIHZhbHVlKX0gcmF0aGVyIHRoYW4gdG8gdGhlIHZhbHVlIGRpcmVjdGx5LiAgRGlyZWN0aXZlcyB1c2Uge0BsaW5rCisgKiBuZy4kc2NlI3BhcnNlQXMgJHNjZS5wYXJzZUFzfSByYXRoZXIgdGhhbiBgJHBhcnNlYCB0byB3YXRjaCBhdHRyaWJ1dGUgYmluZGluZ3MsIHdoaWNoIHBlcmZvcm1zIHRoZQorICoge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZCAkc2NlLmdldFRydXN0ZWR9IGJlaGluZCB0aGUgc2NlbmVzIG9uIG5vbi1jb25zdGFudCBsaXRlcmFscy4KKyAqCisgKiBBcyBhbiBleGFtcGxlLCB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQmluZEh0bWwgbmdCaW5kSHRtbH0gdXNlcyB7QGxpbmsKKyAqIG5nLiRzY2UjcGFyc2VBc0h0bWwgJHNjZS5wYXJzZUFzSHRtbChiaW5kaW5nIGV4cHJlc3Npb24pfS4gIEhlcmUncyB0aGUgYWN0dWFsIGNvZGUgKHNsaWdodGx5CisgKiBzaW1wbGlmaWVkKToKKyAqCisgKiBgYGAKKyAqIHZhciBuZ0JpbmRIdG1sRGlyZWN0aXZlID0gWyckc2NlJywgZnVuY3Rpb24oJHNjZSkgeworICogICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsKKyAqICAgICBzY29wZS4kd2F0Y2goJHNjZS5wYXJzZUFzSHRtbChhdHRyLm5nQmluZEh0bWwpLCBmdW5jdGlvbih2YWx1ZSkgeworICogICAgICAgZWxlbWVudC5odG1sKHZhbHVlIHx8ICcnKTsKKyAqICAgICB9KTsKKyAqICAgfTsKKyAqIH1dOworICogYGBgCisgKgorICogIyMgSW1wYWN0IG9uIGxvYWRpbmcgdGVtcGxhdGVzCisgKgorICogVGhpcyBhcHBsaWVzIGJvdGggdG8gdGhlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdJbmNsdWRlIGBuZy1pbmNsdWRlYH0gZGlyZWN0aXZlIGFzIHdlbGwgYXMKKyAqIGB0ZW1wbGF0ZVVybGAncyBzcGVjaWZpZWQgYnkge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSBkaXJlY3RpdmVzfS4KKyAqCisgKiBCeSBkZWZhdWx0LCBBbmd1bGFyIG9ubHkgbG9hZHMgdGVtcGxhdGVzIGZyb20gdGhlIHNhbWUgZG9tYWluIGFuZCBwcm90b2NvbCBhcyB0aGUgYXBwbGljYXRpb24KKyAqIGRvY3VtZW50LiAgVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZFJlc291cmNlVXJsCisgKiAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybH0gb24gdGhlIHRlbXBsYXRlIFVSTC4gIFRvIGxvYWQgdGVtcGxhdGVzIGZyb20gb3RoZXIgZG9tYWlucyBhbmQvb3IKKyAqIHByb3RvY29scywgeW91IG1heSBlaXRoZXIgZWl0aGVyIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybFdoaXRlbGlzdCB3aGl0ZWxpc3QKKyAqIHRoZW19IG9yIHtAbGluayBuZy4kc2NlI3RydXN0QXNSZXNvdXJjZVVybCB3cmFwIGl0fSBpbnRvIGEgdHJ1c3RlZCB2YWx1ZS4KKyAqCisgKiAqUGxlYXNlIG5vdGUqOgorICogVGhlIGJyb3dzZXIncworICogW1NhbWUgT3JpZ2luIFBvbGljeV0oaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9icm93c2Vyc2VjL3dpa2kvUGFydDIjU2FtZS1vcmlnaW5fcG9saWN5X2Zvcl9YTUxIdHRwUmVxdWVzdCkKKyAqIGFuZCBbQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpXShodHRwOi8vd3d3LnczLm9yZy9UUi9jb3JzLykKKyAqIHBvbGljeSBhcHBseSBpbiBhZGRpdGlvbiB0byB0aGlzIGFuZCBtYXkgZnVydGhlciByZXN0cmljdCB3aGV0aGVyIHRoZSB0ZW1wbGF0ZSBpcyBzdWNjZXNzZnVsbHkKKyAqIGxvYWRlZC4gIFRoaXMgbWVhbnMgdGhhdCB3aXRob3V0IHRoZSByaWdodCBDT1JTIHBvbGljeSwgbG9hZGluZyB0ZW1wbGF0ZXMgZnJvbSBhIGRpZmZlcmVudCBkb21haW4KKyAqIHdvbid0IHdvcmsgb24gYWxsIGJyb3dzZXJzLiAgQWxzbywgbG9hZGluZyB0ZW1wbGF0ZXMgZnJvbSBgZmlsZTovL2AgVVJMIGRvZXMgbm90IHdvcmsgb24gc29tZQorICogYnJvd3NlcnMuCisgKgorICogIyMgVGhpcyBmZWVscyBsaWtlIHRvbyBtdWNoIG92ZXJoZWFkCisgKgorICogSXQncyBpbXBvcnRhbnQgdG8gcmVtZW1iZXIgdGhhdCBTQ0Ugb25seSBhcHBsaWVzIHRvIGludGVycG9sYXRpb24gZXhwcmVzc2lvbnMuCisgKgorICogSWYgeW91ciBleHByZXNzaW9ucyBhcmUgY29uc3RhbnQgbGl0ZXJhbHMsIHRoZXkncmUgYXV0b21hdGljYWxseSB0cnVzdGVkIGFuZCB5b3UgZG9uJ3QgbmVlZCB0bworICogY2FsbCBgJHNjZS50cnVzdEFzYCBvbiB0aGVtIChyZW1lbWJlciB0byBpbmNsdWRlIHRoZSBgbmdTYW5pdGl6ZWAgbW9kdWxlKSAoZS5nLgorICogYDxkaXYgbmctYmluZC1odG1sPSInPGI+aW1wbGljaXRseSB0cnVzdGVkPC9iPiciPjwvZGl2PmApIGp1c3Qgd29ya3MuCisgKgorICogQWRkaXRpb25hbGx5LCBgYVtocmVmXWAgYW5kIGBpbWdbc3JjXWAgYXV0b21hdGljYWxseSBzYW5pdGl6ZSB0aGVpciBVUkxzIGFuZCBkbyBub3QgcGFzcyB0aGVtCisgKiB0aHJvdWdoIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWQgJHNjZS5nZXRUcnVzdGVkfS4gIFNDRSBkb2Vzbid0IHBsYXkgYSByb2xlIGhlcmUuCisgKgorICogVGhlIGluY2x1ZGVkIHtAbGluayBuZy4kc2NlRGVsZWdhdGUgJHNjZURlbGVnYXRlfSBjb21lcyB3aXRoIHNhbmUgZGVmYXVsdHMgdG8gYWxsb3cgeW91IHRvIGxvYWQKKyAqIHRlbXBsYXRlcyBpbiBgbmctaW5jbHVkZWAgZnJvbSB5b3VyIGFwcGxpY2F0aW9uJ3MgZG9tYWluIHdpdGhvdXQgaGF2aW5nIHRvIGV2ZW4ga25vdyBhYm91dCBTQ0UuCisgKiBJdCBibG9ja3MgbG9hZGluZyB0ZW1wbGF0ZXMgZnJvbSBvdGhlciBkb21haW5zIG9yIGxvYWRpbmcgdGVtcGxhdGVzIG92ZXIgaHR0cCBmcm9tIGFuIGh0dHBzCisgKiBzZXJ2ZWQgZG9jdW1lbnQuICBZb3UgY2FuIGNoYW5nZSB0aGVzZSBieSBzZXR0aW5nIHlvdXIgb3duIGN1c3RvbSB7QGxpbmsKKyAqIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0IHdoaXRlbGlzdHN9IGFuZCB7QGxpbmsKKyAqIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsQmxhY2tsaXN0IGJsYWNrbGlzdHN9IGZvciBtYXRjaGluZyBzdWNoIFVSTHMuCisgKgorICogVGhpcyBzaWduaWZpY2FudGx5IHJlZHVjZXMgdGhlIG92ZXJoZWFkLiAgSXQgaXMgZmFyIGVhc2llciB0byBwYXkgdGhlIHNtYWxsIG92ZXJoZWFkIGFuZCBoYXZlIGFuCisgKiBhcHBsaWNhdGlvbiB0aGF0J3Mgc2VjdXJlIGFuZCBjYW4gYmUgYXVkaXRlZCB0byB2ZXJpZnkgdGhhdCB3aXRoIG11Y2ggbW9yZSBlYXNlIHRoYW4gYm9sdGluZworICogc2VjdXJpdHkgb250byBhbiBhcHBsaWNhdGlvbiBsYXRlci4KKyAqCisgKiA8YSBuYW1lPSJjb250ZXh0cyI+PC9hPgorICogIyMgV2hhdCB0cnVzdGVkIGNvbnRleHQgdHlwZXMgYXJlIHN1cHBvcnRlZD8KKyAqCisgKiB8IENvbnRleHQgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICB8CisgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18CisgKiB8IGAkc2NlLkhUTUxgICAgICAgICAgfCBGb3IgSFRNTCB0aGF0J3Mgc2FmZSB0byBzb3VyY2UgaW50byB0aGUgYXBwbGljYXRpb24uICBUaGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0JpbmRIdG1sIG5nQmluZEh0bWx9IGRpcmVjdGl2ZSB1c2VzIHRoaXMgY29udGV4dCBmb3IgYmluZGluZ3MuIElmIGFuIHVuc2FmZSB2YWx1ZSBpcyBlbmNvdW50ZXJlZCBhbmQgdGhlIHtAbGluayBuZ1Nhbml0aXplICRzYW5pdGl6ZX0gbW9kdWxlIGlzIHByZXNlbnQgdGhpcyB3aWxsIHNhbml0aXplIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yLiB8CisgKiB8IGAkc2NlLkNTU2AgICAgICAgICAgfCBGb3IgQ1NTIHRoYXQncyBzYWZlIHRvIHNvdXJjZSBpbnRvIHRoZSBhcHBsaWNhdGlvbi4gIEN1cnJlbnRseSB1bnVzZWQuICBGZWVsIGZyZWUgdG8gdXNlIGl0IGluIHlvdXIgb3duIGRpcmVjdGl2ZXMuIHwKKyAqIHwgYCRzY2UuVVJMYCAgICAgICAgICB8IEZvciBVUkxzIHRoYXQgYXJlIHNhZmUgdG8gZm9sbG93IGFzIGxpbmtzLiAgQ3VycmVudGx5IHVudXNlZCAoYDxhIGhyZWY9YCBhbmQgYDxpbWcgc3JjPWAgc2FuaXRpemUgdGhlaXIgdXJscyBhbmQgZG9uJ3QgY29uc3RpdHV0ZSBhbiBTQ0UgY29udGV4dC4gfAorICogfCBgJHNjZS5SRVNPVVJDRV9VUkxgIHwgRm9yIFVSTHMgdGhhdCBhcmUgbm90IG9ubHkgc2FmZSB0byBmb2xsb3cgYXMgbGlua3MsIGJ1dCB3aG9zZSBjb250ZW50cyBhcmUgYWxzbyBzYWZlIHRvIGluY2x1ZGUgaW4geW91ciBhcHBsaWNhdGlvbi4gIEV4YW1wbGVzIGluY2x1ZGUgYG5nLWluY2x1ZGVgLCBgc3JjYCAvIGBuZ1NyY2AgYmluZGluZ3MgZm9yIHRhZ3Mgb3RoZXIgdGhhbiBgSU1HYCAoZS5nLiBgSUZSQU1FYCwgYE9CSkVDVGAsIGV0Yy4pICA8YnI+PGJyPk5vdGUgdGhhdCBgJHNjZS5SRVNPVVJDRV9VUkxgIG1ha2VzIGEgc3Ryb25nZXIgc3RhdGVtZW50IGFib3V0IHRoZSBVUkwgdGhhbiBgJHNjZS5VUkxgIGRvZXMgYW5kIHRoZXJlZm9yZSBjb250ZXh0cyByZXF1aXJpbmcgdmFsdWVzIHRydXN0ZWQgZm9yIGAkc2NlLlJFU09VUkNFX1VSTGAgY2FuIGJlIHVzZWQgYW55d2hlcmUgdGhhdCB2YWx1ZXMgdHJ1c3RlZCBmb3IgYCRzY2UuVVJMYCBhcmUgcmVxdWlyZWQuIHwKKyAqIHwgYCRzY2UuSlNgICAgICAgICAgICB8IEZvciBKYXZhU2NyaXB0IHRoYXQgaXMgc2FmZSB0byBleGVjdXRlIGluIHlvdXIgYXBwbGljYXRpb24ncyBjb250ZXh0LiAgQ3VycmVudGx5IHVudXNlZC4gIEZlZWwgZnJlZSB0byB1c2UgaXQgaW4geW91ciBvd24gZGlyZWN0aXZlcy4gfAorICoKKyAqICMjIEZvcm1hdCBvZiBpdGVtcyBpbiB7QGxpbmsgbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxXaGl0ZWxpc3QgcmVzb3VyY2VVcmxXaGl0ZWxpc3R9L3tAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybEJsYWNrbGlzdCBCbGFja2xpc3R9IDxhIG5hbWU9InJlc291cmNlVXJsUGF0dGVybkl0ZW0iPjwvYT4KKyAqCisgKiAgRWFjaCBlbGVtZW50IGluIHRoZXNlIGFycmF5cyBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICoKKyAqICAtICoqJ3NlbGYnKioKKyAqICAgIC0gVGhlIHNwZWNpYWwgKipzdHJpbmcqKiwgYCdzZWxmJ2AsIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFnYWluc3QgYWxsIFVSTHMgb2YgdGhlICoqc2FtZQorICogICAgICBkb21haW4qKiBhcyB0aGUgYXBwbGljYXRpb24gZG9jdW1lbnQgdXNpbmcgdGhlICoqc2FtZSBwcm90b2NvbCoqLgorICogIC0gKipTdHJpbmcqKiAoZXhjZXB0IHRoZSBzcGVjaWFsIHZhbHVlIGAnc2VsZidgKQorICogICAgLSBUaGUgc3RyaW5nIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgZnVsbCAqbm9ybWFsaXplZCAvIGFic29sdXRlIFVSTCogb2YgdGhlIHJlc291cmNlCisgKiAgICAgIGJlaW5nIHRlc3RlZCAoc3Vic3RyaW5nIG1hdGNoZXMgYXJlIG5vdCBnb29kIGVub3VnaC4pCisgKiAgICAtIFRoZXJlIGFyZSBleGFjdGx5ICoqdHdvIHdpbGRjYXJkIHNlcXVlbmNlcyoqIC0gYCpgIGFuZCBgKipgLiAgQWxsIG90aGVyIGNoYXJhY3RlcnMKKyAqICAgICAgbWF0Y2ggdGhlbXNlbHZlcy4KKyAqICAgIC0gYCpgOiBtYXRjaGVzIHplcm8gb3IgbW9yZSBvY2N1cnJlbmNlcyBvZiBhbnkgY2hhcmFjdGVyIG90aGVyIHRoYW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgNgorICogICAgICBjaGFyYWN0ZXJzOiAnYDpgJywgJ2AvYCcsICdgLmAnLCAnYD9gJywgJ2AmYCcgYW5kICc7Jy4gIEl0J3MgYSB1c2VmdWwgd2lsZGNhcmQgZm9yIHVzZQorICogICAgICBpbiBhIHdoaXRlbGlzdC4KKyAqICAgIC0gYCoqYDogbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgb2NjdXJyZW5jZXMgb2YgKmFueSogY2hhcmFjdGVyLiAgQXMgc3VjaCwgaXQncyBub3QKKyAqICAgICAgbm90IGFwcHJvcHJpYXRlIHRvIHVzZSBpbiBmb3IgYSBzY2hlbWUsIGRvbWFpbiwgZXRjLiBhcyBpdCB3b3VsZCBtYXRjaCB0b28gbXVjaC4gIChlLmcuCisgKiAgICAgIGh0dHA6Ly8qKi5leGFtcGxlLmNvbS8gd291bGQgbWF0Y2ggaHR0cDovL2V2aWwuY29tLz9pZ25vcmU9LmV4YW1wbGUuY29tLyBhbmQgdGhhdCBtaWdodAorICogICAgICBub3QgaGF2ZSBiZWVuIHRoZSBpbnRlbnRpb24uKSAgSXRzIHVzYWdlIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgcGF0aCBpcyBvay4gIChlLmcuCisgKiAgICAgIGh0dHA6Ly9mb28uZXhhbXBsZS5jb20vdGVtcGxhdGVzLyoqKS4KKyAqICAtICoqUmVnRXhwKiogKCpzZWUgY2F2ZWF0IGJlbG93KikKKyAqICAgIC0gKkNhdmVhdCo6ICBXaGlsZSByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBwb3dlcmZ1bCBhbmQgb2ZmZXIgZ3JlYXQgZmxleGliaWxpdHksICB0aGVpciBzeW50YXgKKyAqICAgICAgKGFuZCBhbGwgdGhlIGluZXZpdGFibGUgZXNjYXBpbmcpIG1ha2VzIHRoZW0gKmhhcmRlciB0byBtYWludGFpbiouICBJdCdzIGVhc3kgdG8KKyAqICAgICAgYWNjaWRlbnRhbGx5IGludHJvZHVjZSBhIGJ1ZyB3aGVuIG9uZSB1cGRhdGVzIGEgY29tcGxleCBleHByZXNzaW9uIChpbWhvLCBhbGwgcmVnZXhlcyBzaG91bGQKKyAqICAgICAgaGF2ZSBnb29kIHRlc3QgY292ZXJhZ2UuKS4gIEZvciBpbnN0YW5jZSwgdGhlIHVzZSBvZiBgLmAgaW4gdGhlIHJlZ2V4IGlzIGNvcnJlY3Qgb25seSBpbiBhCisgKiAgICAgIHNtYWxsIG51bWJlciBvZiBjYXNlcy4gIEEgYC5gIGNoYXJhY3RlciBpbiB0aGUgcmVnZXggdXNlZCB3aGVuIG1hdGNoaW5nIHRoZSBzY2hlbWUgb3IgYQorICogICAgICBzdWJkb21haW4gY291bGQgYmUgbWF0Y2hlZCBhZ2FpbnN0IGEgYDpgIG9yIGxpdGVyYWwgYC5gIHRoYXQgd2FzIGxpa2VseSBub3QgaW50ZW5kZWQuICAgSXQKKyAqICAgICAgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgc3RyaW5nIHBhdHRlcm5zIGFuZCBvbmx5IGZhbGwgYmFjayB0byByZWd1bGFyIGV4cHJlc3Npb25zCisgKiAgICAgIGlmIHRoZXkgYXMgYSBsYXN0IHJlc29ydC4KKyAqICAgIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlZ0V4cCAoaS5lLiBub3QgYSBzdHJpbmcuKSAgSXQgaXMKKyAqICAgICAgbWF0Y2hlZCBhZ2FpbnN0IHRoZSAqKmVudGlyZSoqICpub3JtYWxpemVkIC8gYWJzb2x1dGUgVVJMKiBvZiB0aGUgcmVzb3VyY2UgYmVpbmcgdGVzdGVkCisgKiAgICAgIChldmVuIHdoZW4gdGhlIFJlZ0V4cCBkaWQgbm90IGhhdmUgdGhlIGBeYCBhbmQgYCRgIGNvZGVzLikgIEluIGFkZGl0aW9uLCBhbnkgZmxhZ3MKKyAqICAgICAgcHJlc2VudCBvbiB0aGUgUmVnRXhwIChzdWNoIGFzIG11bHRpbGluZSwgZ2xvYmFsLCBpZ25vcmVDYXNlKSBhcmUgaWdub3JlZC4KKyAqICAgIC0gSWYgeW91IGFyZSBnZW5lcmF0aW5nIHlvdXIgSmF2YVNjcmlwdCBmcm9tIHNvbWUgb3RoZXIgdGVtcGxhdGluZyBlbmdpbmUgKG5vdAorICogICAgICByZWNvbW1lbmRlZCwgZS5nLiBpbiBpc3N1ZSBbIzQwMDZdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzQwMDYpKSwKKyAqICAgICAgcmVtZW1iZXIgdG8gZXNjYXBlIHlvdXIgcmVndWxhciBleHByZXNzaW9uIChhbmQgYmUgYXdhcmUgdGhhdCB5b3UgbWlnaHQgbmVlZCBtb3JlIHRoYW4KKyAqICAgICAgb25lIGxldmVsIG9mIGVzY2FwaW5nIGRlcGVuZGluZyBvbiB5b3VyIHRlbXBsYXRpbmcgZW5naW5lIGFuZCB0aGUgd2F5IHlvdSBpbnRlcnBvbGF0ZWQKKyAqICAgICAgdGhlIHZhbHVlLikgIERvIG1ha2UgdXNlIG9mIHlvdXIgcGxhdGZvcm0ncyBlc2NhcGluZyBtZWNoYW5pc20gYXMgaXQgbWlnaHQgYmUgZ29vZAorICogICAgICBlbm91Z2ggYmVmb3JlIGNvZGluZyB5b3VyIG93bi4gIGUuZy4gUnVieSBoYXMKKyAqICAgICAgW1JlZ2V4cC5lc2NhcGUoc3RyKV0oaHR0cDovL3d3dy5ydWJ5LWRvYy5vcmcvY29yZS0yLjAuMC9SZWdleHAuaHRtbCNtZXRob2QtYy1lc2NhcGUpCisgKiAgICAgIGFuZCBQeXRob24gaGFzIFtyZS5lc2NhcGVdKGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS9yZS5odG1sI3JlLmVzY2FwZSkuCisgKiAgICAgIEphdmFzY3JpcHQgbGFja3MgYSBzaW1pbGFyIGJ1aWx0IGluIGZ1bmN0aW9uIGZvciBlc2NhcGluZy4gIFRha2UgYSBsb29rIGF0IEdvb2dsZQorICogICAgICBDbG9zdXJlIGxpYnJhcnkncyBbZ29vZy5zdHJpbmcucmVnRXhwRXNjYXBlKHMpXSgKKyAqICAgICAgaHR0cDovL2RvY3MuY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL2dpdC9jbG9zdXJlX2dvb2dfc3RyaW5nX3N0cmluZy5qcy5zb3VyY2UuaHRtbCNsaW5lOTYyKS4KKyAqCisgKiBSZWZlciB7QGxpbmsgbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIgJHNjZURlbGVnYXRlUHJvdmlkZXJ9IGZvciBhbiBleGFtcGxlLgorICoKKyAqICMjIFNob3cgbWUgYW4gZXhhbXBsZSB1c2luZyBTQ0UuCisgKgorICogPGV4YW1wbGUgbW9kdWxlPSJteVNjZUFwcCIgZGVwcz0iYW5ndWxhci1zYW5pdGl6ZS5qcyI+CisgKiA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAqICAgPGRpdiBuZy1jb250cm9sbGVyPSJBcHBDb250cm9sbGVyIGFzIG15Q3RybCI+CisgKiAgICAgPGkgbmctYmluZC1odG1sPSJteUN0cmwuZXhwbGljaXRseVRydXN0ZWRIdG1sIiBpZD0iZXhwbGljaXRseVRydXN0ZWRIdG1sIj48L2k+PGJyPjxicj4KKyAqICAgICA8Yj5Vc2VyIGNvbW1lbnRzPC9iPjxicj4KKyAqICAgICBCeSBkZWZhdWx0LCBIVE1MIHRoYXQgaXNuJ3QgZXhwbGljaXRseSB0cnVzdGVkIChlLmcuIEFsaWNlJ3MgY29tbWVudCkgaXMgc2FuaXRpemVkIHdoZW4KKyAqICAgICAkc2FuaXRpemUgaXMgYXZhaWxhYmxlLiAgSWYgJHNhbml0aXplIGlzbid0IGF2YWlsYWJsZSwgdGhpcyByZXN1bHRzIGluIGFuIGVycm9yIGluc3RlYWQgb2YgYW4KKyAqICAgICBleHBsb2l0LgorICogICAgIDxkaXYgY2xhc3M9IndlbGwiPgorICogICAgICAgPGRpdiBuZy1yZXBlYXQ9InVzZXJDb21tZW50IGluIG15Q3RybC51c2VyQ29tbWVudHMiPgorICogICAgICAgICA8Yj57e3VzZXJDb21tZW50Lm5hbWV9fTwvYj46CisgKiAgICAgICAgIDxzcGFuIG5nLWJpbmQtaHRtbD0idXNlckNvbW1lbnQuaHRtbENvbW1lbnQiIGNsYXNzPSJodG1sQ29tbWVudCI+PC9zcGFuPgorICogICAgICAgICA8YnI+CisgKiAgICAgICA8L2Rpdj4KKyAqICAgICA8L2Rpdj4KKyAqICAgPC9kaXY+CisgKiA8L2ZpbGU+CisgKgorICogPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KKyAqICAgYW5ndWxhci5tb2R1bGUoJ215U2NlQXBwJywgWyduZ1Nhbml0aXplJ10pCisgKiAgICAgLmNvbnRyb2xsZXIoJ0FwcENvbnRyb2xsZXInLCBbJyRodHRwJywgJyR0ZW1wbGF0ZUNhY2hlJywgJyRzY2UnLAorICogICAgICAgZnVuY3Rpb24oJGh0dHAsICR0ZW1wbGF0ZUNhY2hlLCAkc2NlKSB7CisgKiAgICAgICAgIHZhciBzZWxmID0gdGhpczsKKyAqICAgICAgICAgJGh0dHAuZ2V0KCJ0ZXN0X2RhdGEuanNvbiIsIHtjYWNoZTogJHRlbXBsYXRlQ2FjaGV9KS5zdWNjZXNzKGZ1bmN0aW9uKHVzZXJDb21tZW50cykgeworICogICAgICAgICAgIHNlbGYudXNlckNvbW1lbnRzID0gdXNlckNvbW1lbnRzOworICogICAgICAgICB9KTsKKyAqICAgICAgICAgc2VsZi5leHBsaWNpdGx5VHJ1c3RlZEh0bWwgPSAkc2NlLnRydXN0QXNIdG1sKAorICogICAgICAgICAgICAgJzxzcGFuIG9ubW91c2VvdmVyPSJ0aGlzLnRleHRDb250ZW50PSZxdW90O0V4cGxpY2l0bHkgdHJ1c3RlZCBIVE1MIGJ5cGFzc2VzICcgKworICogICAgICAgICAgICAgJ3Nhbml0aXphdGlvbi4mcXVvdDsiPkhvdmVyIG92ZXIgdGhpcyB0ZXh0Ljwvc3Bhbj4nKTsKKyAqICAgICAgIH1dKTsKKyAqIDwvZmlsZT4KKyAqCisgKiA8ZmlsZSBuYW1lPSJ0ZXN0X2RhdGEuanNvbiI+CisgKiBbCisgKiAgIHsgIm5hbWUiOiAiQWxpY2UiLAorICogICAgICJodG1sQ29tbWVudCI6CisgKiAgICAgICAgICI8c3BhbiBvbm1vdXNlb3Zlcj0ndGhpcy50ZXh0Q29udGVudD1cIlBXTjNEIVwiJz5JcyA8aT5hbnlvbmU8L2k+IHJlYWRpbmcgdGhpcz88L3NwYW4+IgorICogICB9LAorICogICB7ICJuYW1lIjogIkJvYiIsCisgKiAgICAgImh0bWxDb21tZW50IjogIjxpPlllcyE8L2k+ICBBbSBJIHRoZSBvbmx5IG90aGVyIG9uZT8iCisgKiAgIH0KKyAqIF0KKyAqIDwvZmlsZT4KKyAqCisgKiA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAqICAgZGVzY3JpYmUoJ1NDRSBkb2MgZGVtbycsIGZ1bmN0aW9uKCkgeworICogICAgIGl0KCdzaG91bGQgc2FuaXRpemUgdW50cnVzdGVkIHZhbHVlcycsIGZ1bmN0aW9uKCkgeworICogICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKGJ5LmNzcygnLmh0bWxDb21tZW50JykpLmZpcnN0KCkuZ2V0SW5uZXJIdG1sKCkpCisgKiAgICAgICAgICAgLnRvQmUoJzxzcGFuPklzIDxpPmFueW9uZTwvaT4gcmVhZGluZyB0aGlzPzwvc3Bhbj4nKTsKKyAqICAgICB9KTsKKyAqCisgKiAgICAgaXQoJ3Nob3VsZCBOT1Qgc2FuaXRpemUgZXhwbGljaXRseSB0cnVzdGVkIHZhbHVlcycsIGZ1bmN0aW9uKCkgeworICogICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2V4cGxpY2l0bHlUcnVzdGVkSHRtbCcpKS5nZXRJbm5lckh0bWwoKSkudG9CZSgKKyAqICAgICAgICAgICAnPHNwYW4gb25tb3VzZW92ZXI9InRoaXMudGV4dENvbnRlbnQ9JnF1b3Q7RXhwbGljaXRseSB0cnVzdGVkIEhUTUwgYnlwYXNzZXMgJyArCisgKiAgICAgICAgICAgJ3Nhbml0aXphdGlvbi4mcXVvdDsiPkhvdmVyIG92ZXIgdGhpcyB0ZXh0Ljwvc3Bhbj4nKTsKKyAqICAgICB9KTsKKyAqICAgfSk7CisgKiA8L2ZpbGU+CisgKiA8L2V4YW1wbGU+CisgKgorICoKKyAqCisgKiAjIyBDYW4gSSBkaXNhYmxlIFNDRSBjb21wbGV0ZWx5PworICoKKyAqIFllcywgeW91IGNhbi4gIEhvd2V2ZXIsIHRoaXMgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQuICBTQ0UgZ2l2ZXMgeW91IGEgbG90IG9mIHNlY3VyaXR5IGJlbmVmaXRzCisgKiBmb3IgbGl0dGxlIGNvZGluZyBvdmVyaGVhZC4gIEl0IHdpbGwgYmUgbXVjaCBoYXJkZXIgdG8gdGFrZSBhbiBTQ0UgZGlzYWJsZWQgYXBwbGljYXRpb24gYW5kCisgKiBlaXRoZXIgc2VjdXJlIGl0IG9uIHlvdXIgb3duIG9yIGVuYWJsZSBTQ0UgYXQgYSBsYXRlciBzdGFnZS4gIEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gZGlzYWJsZSBTQ0UKKyAqIGZvciBjYXNlcyB3aGVyZSB5b3UgaGF2ZSBhIGxvdCBvZiBleGlzdGluZyBjb2RlIHRoYXQgd2FzIHdyaXR0ZW4gYmVmb3JlIFNDRSB3YXMgaW50cm9kdWNlZCBhbmQKKyAqIHlvdSdyZSBtaWdyYXRpbmcgdGhlbSBhIG1vZHVsZSBhdCBhIHRpbWUuCisgKgorICogVGhhdCBzYWlkLCBoZXJlJ3MgaG93IHlvdSBjYW4gY29tcGxldGVseSBkaXNhYmxlIFNDRToKKyAqCisgKiBgYGAKKyAqIGFuZ3VsYXIubW9kdWxlKCdteUFwcFdpdGhTY2VEaXNhYmxlZG15QXBwJywgW10pLmNvbmZpZyhmdW5jdGlvbigkc2NlUHJvdmlkZXIpIHsKKyAqICAgLy8gQ29tcGxldGVseSBkaXNhYmxlIFNDRS4gIEZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIG9ubHkhCisgKiAgIC8vIERvIG5vdCB1c2UgaW4gbmV3IHByb2plY3RzLgorICogICAkc2NlUHJvdmlkZXIuZW5hYmxlZChmYWxzZSk7CisgKiB9KTsKKyAqIGBgYAorICoKKyAqLworLyoganNoaW50IG1heGxlbjogMTAwICovCisKK2Z1bmN0aW9uICRTY2VQcm92aWRlcigpIHsKKyAgdmFyIGVuYWJsZWQgPSB0cnVlOworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRzY2VQcm92aWRlciNlbmFibGVkCisgICAqIEBraW5kIGZ1bmN0aW9uCisgICAqCisgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHZhbHVlIElmIHByb3ZpZGVkLCB0aGVuIGVuYWJsZXMvZGlzYWJsZXMgU0NFLgorICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIFNDRSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBFbmFibGVzL2Rpc2FibGVzIFNDRSBhbmQgcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZS4KKyAgICovCisgIHRoaXMuZW5hYmxlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHsKKyAgICAgIGVuYWJsZWQgPSAhIXZhbHVlOworICAgIH0KKyAgICByZXR1cm4gZW5hYmxlZDsKKyAgfTsKKworCisgIC8qIERlc2lnbiBub3RlcyBvbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgU0NFLgorICAgKgorICAgKiBUaGUgQVBJIGNvbnRyYWN0IGZvciB0aGUgU0NFIGRlbGVnYXRlCisgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogVGhlIFNDRSBkZWxlZ2F0ZSBvYmplY3QgbXVzdCBwcm92aWRlIHRoZSBmb2xsb3dpbmcgMyBtZXRob2RzOgorICAgKgorICAgKiAtIHRydXN0QXMoY29udGV4dEVudW0sIHZhbHVlKQorICAgKiAgICAgVGhpcyBtZXRob2QgaXMgdXNlZCB0byB0ZWxsIHRoZSBTQ0Ugc2VydmljZSB0aGF0IHRoZSBwcm92aWRlZCB2YWx1ZSBpcyBPSyB0byB1c2UgaW4gdGhlCisgICAqICAgICBjb250ZXh0cyBzcGVjaWZpZWQgYnkgY29udGV4dEVudW0uICBJdCBtdXN0IHJldHVybiBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGJ5CisgICAqICAgICBnZXRUcnVzdGVkKCkgZm9yIGEgY29tcGF0aWJsZSBjb250ZXh0RW51bSBhbmQgcmV0dXJuIHRoaXMgdmFsdWUuCisgICAqCisgICAqIC0gdmFsdWVPZih2YWx1ZSkKKyAgICogICAgIEZvciB2YWx1ZXMgdGhhdCB3ZXJlIG5vdCBwcm9kdWNlZCBieSB0cnVzdEFzKCksIHJldHVybiB0aGVtIGFzIGlzLiAgRm9yIHZhbHVlcyB0aGF0IHdlcmUKKyAgICogICAgIHByb2R1Y2VkIGJ5IHRydXN0QXMoKSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IHZhbHVlIHRvIHRydXN0QXMuICBCYXNpY2FsbHksIGlmCisgICAqICAgICB0cnVzdEFzIGlzIHdyYXBwaW5nIHRoZSBnaXZlbiB2YWx1ZXMgaW50byBzb21lIHR5cGUsIHRoaXMgb3BlcmF0aW9uIHVud3JhcHMgaXQgd2hlbiBnaXZlbgorICAgKiAgICAgc3VjaCBhIHZhbHVlLgorICAgKgorICAgKiAtIGdldFRydXN0ZWQoY29udGV4dEVudW0sIHZhbHVlKQorICAgKiAgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBhIHZhbHVlIHRoYXQgaXMgc2FmZSB0byB1c2UgaW4gdGhlIGNvbnRleHQgc3BlY2lmaWVkIGJ5CisgICAqICAgICBjb250ZXh0RW51bSBvciB0aHJvdyBhbmQgZXhjZXB0aW9uIG90aGVyd2lzZS4KKyAgICoKKyAgICogTk9URTogVGhpcyBjb250cmFjdCBkZWxpYmVyYXRlbHkgZG9lcyBOT1Qgc3RhdGUgdGhhdCB2YWx1ZXMgcmV0dXJuZWQgYnkgdHJ1c3RBcygpIG11c3QgYmUKKyAgICogb3BhcXVlIG9yIHdyYXBwZWQgaW4gc29tZSBob2xkZXIgb2JqZWN0LiAgVGhhdCBoYXBwZW5zIHRvIGJlIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIEZvcgorICAgKiBpbnN0YW5jZSwgYW4gaW1wbGVtZW50YXRpb24gY291bGQgbWFpbnRhaW4gYSByZWdpc3RyeSBvZiBhbGwgdHJ1c3RlZCBvYmplY3RzIGJ5IGNvbnRleHQuICBJbgorICAgKiBzdWNoIGEgY2FzZSwgdHJ1c3RBcygpIHdvdWxkIHJldHVybiB0aGUgc2FtZSBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGluLiAgZ2V0VHJ1c3RlZCgpIHdvdWxkCisgICAqIHJldHVybiB0aGUgc2FtZSBvYmplY3QgcGFzc2VkIGluIGlmIGl0IHdhcyBmb3VuZCBpbiB0aGUgcmVnaXN0cnkgdW5kZXIgYSBjb21wYXRpYmxlIGNvbnRleHQgb3IKKyAgICogdGhyb3cgYW4gZXhjZXB0aW9uIG90aGVyd2lzZS4gIEFuIGltcGxlbWVudGF0aW9uIG1pZ2h0IG9ubHkgd3JhcCB2YWx1ZXMgc29tZSBvZiB0aGUgdGltZSBiYXNlZAorICAgKiBvbiBzb21lIGNyaXRlcmlhLiAgZ2V0VHJ1c3RlZCgpIG1pZ2h0IHJldHVybiBhIHZhbHVlIGFuZCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciBzcGVjaWFsCisgICAqIGNvbnN0YW50cyBvciBvYmplY3RzIGV2ZW4gaWYgbm90IHdyYXBwZWQuICBBbGwgc3VjaCBpbXBsZW1lbnRhdGlvbnMgZnVsZmlsbCB0aGlzIGNvbnRyYWN0LgorICAgKgorICAgKgorICAgKiBBIG5vdGUgb24gdGhlIGluaGVyaXRhbmNlIG1vZGVsIGZvciBTQ0UgY29udGV4dHMKKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIEkndmUgdXNlZCBpbmhlcml0YW5jZSBhbmQgbWFkZSBSRVNPVVJDRV9VUkwgd3JhcHBlZCB0eXBlcyBhIHN1YnR5cGUgb2YgVVJMIHdyYXBwZWQgdHlwZXMuICBUaGlzCisgICAqIGlzIHB1cmVseSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorICAgKgorICAgKiBUaGUgY29udHJhY3QgaXMgc2ltcGx5IHRoaXM6CisgICAqCisgICAqICAgICBnZXRUcnVzdGVkKCRzY2UuUkVTT1VSQ0VfVVJMLCB2YWx1ZSkgc3VjY2VlZGluZyBpbXBsaWVzIHRoYXQgZ2V0VHJ1c3RlZCgkc2NlLlVSTCwgdmFsdWUpCisgICAqICAgICB3aWxsIGFsc28gc3VjY2VlZC4KKyAgICoKKyAgICogSW5oZXJpdGFuY2UgaGFwcGVucyB0byBjYXB0dXJlIHRoaXMgaW4gYSBuYXR1cmFsIHdheS4gIEluIHNvbWUgZnV0dXJlLCB3ZQorICAgKiBtYXkgbm90IHVzZSBpbmhlcml0YW5jZSBhbnltb3JlLiAgVGhhdCBpcyBPSyBiZWNhdXNlIG5vIGNvZGUgb3V0c2lkZSBvZgorICAgKiBzY2UuanMgYW5kIHNjZVNwZWNzLmpzIHdvdWxkIG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhpcyBkZXRhaWwuCisgICAqLworCisgIHRoaXMuJGdldCA9IFsnJHBhcnNlJywgJyRzY2VEZWxlZ2F0ZScsIGZ1bmN0aW9uKAorICAgICAgICAgICAgICAgICRwYXJzZSwgICAkc2NlRGVsZWdhdGUpIHsKKyAgICAvLyBQcmVyZXE6IEVuc3VyZSB0aGF0IHdlJ3JlIG5vdCBydW5uaW5nIGluIElFPDExIHF1aXJrcyBtb2RlLiAgSW4gdGhhdCBtb2RlLCBJRSA8IDExIGFsbG93CisgICAgLy8gdGhlICJleHByZXNzaW9uKGphdmFzY3JpcHQgZXhwcmVzc2lvbikiIHN5bnRheCB3aGljaCBpcyBpbnNlY3VyZS4KKyAgICBpZiAoZW5hYmxlZCAmJiBtc2llIDwgOCkgeworICAgICAgdGhyb3cgJHNjZU1pbkVycignaWVxdWlya3MnLAorICAgICAgICAnU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgZG9lcyBub3Qgc3VwcG9ydCBJbnRlcm5ldCBFeHBsb3JlciB2ZXJzaW9uIDwgMTEgaW4gcXVpcmtzICcgKworICAgICAgICAnbW9kZS4gIFlvdSBjYW4gZml4IHRoaXMgYnkgYWRkaW5nIHRoZSB0ZXh0IDwhZG9jdHlwZSBodG1sPiB0byB0aGUgdG9wIG9mIHlvdXIgSFRNTCAnICsKKyAgICAgICAgJ2RvY3VtZW50LiAgU2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRzY2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7CisgICAgfQorCisgICAgdmFyIHNjZSA9IHNoYWxsb3dDb3B5KFNDRV9DT05URVhUUyk7CisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICogQG5hbWUgJHNjZSNpc0VuYWJsZWQKKyAgICAgKiBAa2luZCBmdW5jdGlvbgorICAgICAqCisgICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBTQ0UgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLiAgSWYgeW91IHdhbnQgdG8gc2V0IHRoZSB2YWx1ZSwgeW91CisgICAgICogaGF2ZSB0byBkbyBpdCBhdCBtb2R1bGUgY29uZmlnIHRpbWUgb24ge0BsaW5rIG5nLiRzY2VQcm92aWRlciAkc2NlUHJvdmlkZXJ9LgorICAgICAqCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBTQ0UgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBzY2UuaXNFbmFibGVkID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gZW5hYmxlZDsKKyAgICB9OworICAgIHNjZS50cnVzdEFzID0gJHNjZURlbGVnYXRlLnRydXN0QXM7CisgICAgc2NlLmdldFRydXN0ZWQgPSAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZDsKKyAgICBzY2UudmFsdWVPZiA9ICRzY2VEZWxlZ2F0ZS52YWx1ZU9mOworCisgICAgaWYgKCFlbmFibGVkKSB7CisgICAgICBzY2UudHJ1c3RBcyA9IHNjZS5nZXRUcnVzdGVkID0gZnVuY3Rpb24odHlwZSwgdmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9OworICAgICAgc2NlLnZhbHVlT2YgPSBpZGVudGl0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICogQG5hbWUgJHNjZSNwYXJzZUFzCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBDb252ZXJ0cyBBbmd1bGFyIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGludG8gYSBmdW5jdGlvbi4gIFRoaXMgaXMgbGlrZSB7QGxpbmsKKyAgICAgKiBuZy4kcGFyc2UgJHBhcnNlfSBhbmQgaXMgaWRlbnRpY2FsIHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgYSBsaXRlcmFsIGNvbnN0YW50LiAgT3RoZXJ3aXNlLCBpdAorICAgICAqIHdyYXBzIHRoZSBleHByZXNzaW9uIGluIGEgY2FsbCB0byB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkICRzY2UuZ2V0VHJ1c3RlZCgqdHlwZSosCisgICAgICogKnJlc3VsdCopfQorICAgICAqCisgICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGtpbmQgb2YgU0NFIGNvbnRleHQgaW4gd2hpY2ggdGhpcyByZXN1bHQgd2lsbCBiZSB1c2VkLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFN0cmluZyBleHByZXNzaW9uIHRvIGNvbXBpbGUuCisgICAgICogQHJldHVybnMge2Z1bmN0aW9uKGNvbnRleHQsIGxvY2Fscyl9IGEgZnVuY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbjoKKyAgICAgKgorICAgICAqICAgICogYGNvbnRleHRgIOKAPyBge29iamVjdH1gIOKAPyBhbiBvYmplY3QgYWdhaW5zdCB3aGljaCBhbnkgZXhwcmVzc2lvbnMgZW1iZWRkZWQgaW4gdGhlIHN0cmluZ3MKKyAgICAgKiAgICAgIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCAodHlwaWNhbGx5IGEgc2NvcGUgb2JqZWN0KS4KKyAgICAgKiAgICAqIGBsb2NhbHNgIOKAPyBge29iamVjdD19YCDigD8gbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluCisgICAgICogICAgICBgY29udGV4dGAuCisgICAgICovCisgICAgc2NlLnBhcnNlQXMgPSBmdW5jdGlvbiBzY2VQYXJzZUFzKHR5cGUsIGV4cHIpIHsKKyAgICAgIHZhciBwYXJzZWQgPSAkcGFyc2UoZXhwcik7CisgICAgICBpZiAocGFyc2VkLmxpdGVyYWwgJiYgcGFyc2VkLmNvbnN0YW50KSB7CisgICAgICAgIHJldHVybiBwYXJzZWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gJHBhcnNlKGV4cHIsIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgcmV0dXJuIHNjZS5nZXRUcnVzdGVkKHR5cGUsIHZhbHVlKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgKiBAbmFtZSAkc2NlI3RydXN0QXMKKyAgICAgKgorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqIERlbGVnYXRlcyB0byB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0uICBBcyBzdWNoLAorICAgICAqIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgaXMgdHJ1c3RlZCBieSBhbmd1bGFyIGZvciB1c2UgaW4gc3BlY2lmaWVkIHN0cmljdCBjb250ZXh0dWFsCisgICAgICogZXNjYXBpbmcgY29udGV4dHMgKHN1Y2ggYXMgbmctYmluZC1odG1sLCBuZy1pbmNsdWRlLCBhbnkgc3JjIGF0dHJpYnV0ZQorICAgICAqIGludGVycG9sYXRpb24sIGFueSBkb20gZXZlbnQgYmluZGluZyBhdHRyaWJ1dGUgaW50ZXJwb2xhdGlvbiBzdWNoIGFzIGZvciBvbmNsaWNrLCAgZXRjLikKKyAgICAgKiB0aGF0IHVzZXMgdGhlIHByb3ZpZGVkIHZhbHVlLiAgU2VlICoge0BsaW5rIG5nLiRzY2UgJHNjZX0gZm9yIGVuYWJsaW5nIHN0cmljdCBjb250ZXh0dWFsCisgICAgICogZXNjYXBpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUga2luZCBvZiBjb250ZXh0IGluIHdoaWNoIHRoaXMgdmFsdWUgaXMgc2FmZSBmb3IgdXNlLiAgZS5nLiB1cmwsCisgICAgICogICByZXNvdXJjZV91cmwsIGh0bWwsIGpzIGFuZCBjc3MuCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIHRydXN0ZWQvc2FmZS4KKyAgICAgKiBAcmV0dXJucyB7Kn0gQSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0YW5kIGluIGZvciB0aGUgcHJvdmlkZWQgYHZhbHVlYCBpbiBwbGFjZXMKKyAgICAgKiB3aGVyZSBBbmd1bGFyIGV4cGVjdHMgYSAkc2NlLnRydXN0QXMoKSByZXR1cm4gdmFsdWUuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICogQG5hbWUgJHNjZSN0cnVzdEFzSHRtbAorICAgICAqCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnRydXN0QXNIdG1sKHZhbHVlKWAg4oY/CisgICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXMoJHNjZS5IVE1MLCB2YWx1ZSlgfQorICAgICAqCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHJ1c3RBcy4KKyAgICAgKiBAcmV0dXJucyB7Kn0gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkSHRtbAorICAgICAqICAgICAkc2NlLmdldFRydXN0ZWRIdG1sKHZhbHVlKX0gdG8gb2J0YWluIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIChwcml2aWxlZ2VkIGRpcmVjdGl2ZXMKKyAgICAgKiAgICAgb25seSBhY2NlcHQgZXhwcmVzc2lvbnMgdGhhdCBhcmUgZWl0aGVyIGxpdGVyYWwgY29uc3RhbnRzIG9yIGFyZSB0aGUKKyAgICAgKiAgICAgcmV0dXJuIHZhbHVlIG9mIHtAbGluayBuZy4kc2NlI3RydXN0QXMgJHNjZS50cnVzdEFzfS4pCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICogQG5hbWUgJHNjZSN0cnVzdEFzVXJsCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UudHJ1c3RBc1VybCh2YWx1ZSlgIOKGPworICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzKCRzY2UuVVJMLCB2YWx1ZSlgfQorICAgICAqCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHJ1c3RBcy4KKyAgICAgKiBAcmV0dXJucyB7Kn0gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkVXJsCisgICAgICogICAgICRzY2UuZ2V0VHJ1c3RlZFVybCh2YWx1ZSl9IHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgdmFsdWUuICAocHJpdmlsZWdlZCBkaXJlY3RpdmVzCisgICAgICogICAgIG9ubHkgYWNjZXB0IGV4cHJlc3Npb25zIHRoYXQgYXJlIGVpdGhlciBsaXRlcmFsIGNvbnN0YW50cyBvciBhcmUgdGhlCisgICAgICogICAgIHJldHVybiB2YWx1ZSBvZiB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzICRzY2UudHJ1c3RBc30uKQorICAgICAqLworCisgICAgLyoqCisgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAqIEBuYW1lICRzY2UjdHJ1c3RBc1Jlc291cmNlVXJsCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UudHJ1c3RBc1Jlc291cmNlVXJsKHZhbHVlKWAg4oY/CisgICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXMoJHNjZS5SRVNPVVJDRV9VUkwsIHZhbHVlKWB9CisgICAgICoKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB0cnVzdEFzLgorICAgICAqIEByZXR1cm5zIHsqfSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWRSZXNvdXJjZVVybAorICAgICAqICAgICAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybCh2YWx1ZSl9IHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgdmFsdWUuICAocHJpdmlsZWdlZCBkaXJlY3RpdmVzCisgICAgICogICAgIG9ubHkgYWNjZXB0IGV4cHJlc3Npb25zIHRoYXQgYXJlIGVpdGhlciBsaXRlcmFsIGNvbnN0YW50cyBvciBhcmUgdGhlIHJldHVybgorICAgICAqICAgICB2YWx1ZSBvZiB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzICRzY2UudHJ1c3RBc30uKQorICAgICAqLworCisgICAgLyoqCisgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAqIEBuYW1lICRzY2UjdHJ1c3RBc0pzCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UudHJ1c3RBc0pzKHZhbHVlKWAg4oY/CisgICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXMoJHNjZS5KUywgdmFsdWUpYH0KKyAgICAgKgorICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRydXN0QXMuCisgICAgICogQHJldHVybnMgeyp9IEFuIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8ge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZEpzCisgICAgICogICAgICRzY2UuZ2V0VHJ1c3RlZEpzKHZhbHVlKX0gdG8gb2J0YWluIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIChwcml2aWxlZ2VkIGRpcmVjdGl2ZXMKKyAgICAgKiAgICAgb25seSBhY2NlcHQgZXhwcmVzc2lvbnMgdGhhdCBhcmUgZWl0aGVyIGxpdGVyYWwgY29uc3RhbnRzIG9yIGFyZSB0aGUKKyAgICAgKiAgICAgcmV0dXJuIHZhbHVlIG9mIHtAbGluayBuZy4kc2NlI3RydXN0QXMgJHNjZS50cnVzdEFzfS4pCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICogQG5hbWUgJHNjZSNnZXRUcnVzdGVkCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSNnZXRUcnVzdGVkIGAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZGB9LiAgQXMgc3VjaCwKKyAgICAgKiB0YWtlcyB0aGUgcmVzdWx0IG9mIGEge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyBgJHNjZS50cnVzdEFzYH0oKSBjYWxsIGFuZCByZXR1cm5zIHRoZQorICAgICAqIG9yaWdpbmFsbHkgc3VwcGxpZWQgdmFsdWUgaWYgdGhlIHF1ZXJpZWQgY29udGV4dCB0eXBlIGlzIGEgc3VwZXJ0eXBlIG9mIHRoZSBjcmVhdGVkIHR5cGUuCisgICAgICogSWYgdGhpcyBjb25kaXRpb24gaXNuJ3Qgc2F0aXNmaWVkLCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGtpbmQgb2YgY29udGV4dCBpbiB3aGljaCB0aGlzIHZhbHVlIGlzIHRvIGJlIHVzZWQuCisgICAgICogQHBhcmFtIHsqfSBtYXliZVRydXN0ZWQgVGhlIHJlc3VsdCBvZiBhIHByaW9yIHtAbGluayBuZy4kc2NlI3RydXN0QXMgYCRzY2UudHJ1c3RBc2B9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgY2FsbC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIHRoZSB3YXMgb3JpZ2luYWxseSBwcm92aWRlZCB0bworICAgICAqICAgICAgICAgICAgICB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzIGAkc2NlLnRydXN0QXNgfSBpZiB2YWxpZCBpbiB0aGlzIGNvbnRleHQuCisgICAgICogICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgKiBAbmFtZSAkc2NlI2dldFRydXN0ZWRIdG1sCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UuZ2V0VHJ1c3RlZEh0bWwodmFsdWUpYCDihj8KKyAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSNnZXRUcnVzdGVkIGAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZCgkc2NlLkhUTUwsIHZhbHVlKWB9CisgICAgICoKKyAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXNzIHRvIGAkc2NlLmdldFRydXN0ZWRgLgorICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcmV0dXJuIHZhbHVlIG9mIGAkc2NlLmdldFRydXN0ZWQoJHNjZS5IVE1MLCB2YWx1ZSlgCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICogQG5hbWUgJHNjZSNnZXRUcnVzdGVkQ3NzCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UuZ2V0VHJ1c3RlZENzcyh2YWx1ZSlgIOKGPworICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI2dldFRydXN0ZWQgYCRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkKCRzY2UuQ1NTLCB2YWx1ZSlgfQorICAgICAqCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFzcyB0byBgJHNjZS5nZXRUcnVzdGVkYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHJldHVybiB2YWx1ZSBvZiBgJHNjZS5nZXRUcnVzdGVkKCRzY2UuQ1NTLCB2YWx1ZSlgCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICogQG5hbWUgJHNjZSNnZXRUcnVzdGVkVXJsCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UuZ2V0VHJ1c3RlZFVybCh2YWx1ZSlgIOKGPworICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI2dldFRydXN0ZWQgYCRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkKCRzY2UuVVJMLCB2YWx1ZSlgfQorICAgICAqCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFzcyB0byBgJHNjZS5nZXRUcnVzdGVkYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHJldHVybiB2YWx1ZSBvZiBgJHNjZS5nZXRUcnVzdGVkKCRzY2UuVVJMLCB2YWx1ZSlgCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICogQG5hbWUgJHNjZSNnZXRUcnVzdGVkUmVzb3VyY2VVcmwKKyAgICAgKgorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5nZXRUcnVzdGVkUmVzb3VyY2VVcmwodmFsdWUpYCDihj8KKyAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSNnZXRUcnVzdGVkIGAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZCgkc2NlLlJFU09VUkNFX1VSTCwgdmFsdWUpYH0KKyAgICAgKgorICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBhc3MgdG8gYCRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHJldHVybiB2YWx1ZSBvZiBgJHNjZS5nZXRUcnVzdGVkKCRzY2UuUkVTT1VSQ0VfVVJMLCB2YWx1ZSlgCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICogQG5hbWUgJHNjZSNnZXRUcnVzdGVkSnMKKyAgICAgKgorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5nZXRUcnVzdGVkSnModmFsdWUpYCDihj8KKyAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSNnZXRUcnVzdGVkIGAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZCgkc2NlLkpTLCB2YWx1ZSlgfQorICAgICAqCisgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFzcyB0byBgJHNjZS5nZXRUcnVzdGVkYC4KKyAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHJldHVybiB2YWx1ZSBvZiBgJHNjZS5nZXRUcnVzdGVkKCRzY2UuSlMsIHZhbHVlKWAKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgKiBAbmFtZSAkc2NlI3BhcnNlQXNIdG1sCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UucGFyc2VBc0h0bWwoZXhwcmVzc2lvbiBzdHJpbmcpYCDihj8KKyAgICAgKiAgICAge0BsaW5rIG5nLiRzY2UjcGFyc2VBcyBgJHNjZS5wYXJzZUFzKCRzY2UuSFRNTCwgdmFsdWUpYH0KKyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFN0cmluZyBleHByZXNzaW9uIHRvIGNvbXBpbGUuCisgICAgICogQHJldHVybnMge2Z1bmN0aW9uKGNvbnRleHQsIGxvY2Fscyl9IGEgZnVuY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbjoKKyAgICAgKgorICAgICAqICAgICogYGNvbnRleHRgIOKAPyBge29iamVjdH1gIOKAPyBhbiBvYmplY3QgYWdhaW5zdCB3aGljaCBhbnkgZXhwcmVzc2lvbnMgZW1iZWRkZWQgaW4gdGhlIHN0cmluZ3MKKyAgICAgKiAgICAgIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCAodHlwaWNhbGx5IGEgc2NvcGUgb2JqZWN0KS4KKyAgICAgKiAgICAqIGBsb2NhbHNgIOKAPyBge29iamVjdD19YCDigD8gbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluCisgICAgICogICAgICBgY29udGV4dGAuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBAbmdkb2MgbWV0aG9kCisgICAgICogQG5hbWUgJHNjZSNwYXJzZUFzQ3NzCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UucGFyc2VBc0Nzcyh2YWx1ZSlgIOKGPworICAgICAqICAgICB7QGxpbmsgbmcuJHNjZSNwYXJzZUFzIGAkc2NlLnBhcnNlQXMoJHNjZS5DU1MsIHZhbHVlKWB9CisgICAgICoKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBTdHJpbmcgZXhwcmVzc2lvbiB0byBjb21waWxlLgorICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0LCBsb2NhbHMpfSBhIGZ1bmN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb246CisgICAgICoKKyAgICAgKiAgICAqIGBjb250ZXh0YCDigD8gYHtvYmplY3R9YCDigD8gYW4gb2JqZWN0IGFnYWluc3Qgd2hpY2ggYW55IGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBzdHJpbmdzCisgICAgICogICAgICBhcmUgZXZhbHVhdGVkIGFnYWluc3QgKHR5cGljYWxseSBhIHNjb3BlIG9iamVjdCkuCisgICAgICogICAgKiBgbG9jYWxzYCDigD8gYHtvYmplY3Q9fWAg4oA/IGxvY2FsIHZhcmlhYmxlcyBjb250ZXh0IG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpbgorICAgICAqICAgICAgYGNvbnRleHRgLgorICAgICAqLworCisgICAgLyoqCisgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAqIEBuYW1lICRzY2UjcGFyc2VBc1VybAorICAgICAqCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnBhcnNlQXNVcmwodmFsdWUpYCDihj8KKyAgICAgKiAgICAge0BsaW5rIG5nLiRzY2UjcGFyc2VBcyBgJHNjZS5wYXJzZUFzKCRzY2UuVVJMLCB2YWx1ZSlgfQorICAgICAqCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS4KKyAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCwgbG9jYWxzKX0gYSBmdW5jdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb21waWxlZCBleHByZXNzaW9uOgorICAgICAqCisgICAgICogICAgKiBgY29udGV4dGAg4oA/IGB7b2JqZWN0fWAg4oA/IGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5ncworICAgICAqICAgICAgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0ICh0eXBpY2FsbHkgYSBzY29wZSBvYmplY3QpLgorICAgICAqICAgICogYGxvY2Fsc2Ag4oA/IGB7b2JqZWN0PX1gIOKAPyBsb2NhbCB2YXJpYWJsZXMgY29udGV4dCBvYmplY3QsIHVzZWZ1bCBmb3Igb3ZlcnJpZGluZyB2YWx1ZXMgaW4KKyAgICAgKiAgICAgIGBjb250ZXh0YC4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgKiBAbmFtZSAkc2NlI3BhcnNlQXNSZXNvdXJjZVVybAorICAgICAqCisgICAgICogQGRlc2NyaXB0aW9uCisgICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLnBhcnNlQXNSZXNvdXJjZVVybCh2YWx1ZSlgIOKGPworICAgICAqICAgICB7QGxpbmsgbmcuJHNjZSNwYXJzZUFzIGAkc2NlLnBhcnNlQXMoJHNjZS5SRVNPVVJDRV9VUkwsIHZhbHVlKWB9CisgICAgICoKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBTdHJpbmcgZXhwcmVzc2lvbiB0byBjb21waWxlLgorICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0LCBsb2NhbHMpfSBhIGZ1bmN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb246CisgICAgICoKKyAgICAgKiAgICAqIGBjb250ZXh0YCDigD8gYHtvYmplY3R9YCDigD8gYW4gb2JqZWN0IGFnYWluc3Qgd2hpY2ggYW55IGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBzdHJpbmdzCisgICAgICogICAgICBhcmUgZXZhbHVhdGVkIGFnYWluc3QgKHR5cGljYWxseSBhIHNjb3BlIG9iamVjdCkuCisgICAgICogICAgKiBgbG9jYWxzYCDigD8gYHtvYmplY3Q9fWAg4oA/IGxvY2FsIHZhcmlhYmxlcyBjb250ZXh0IG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpbgorICAgICAqICAgICAgYGNvbnRleHRgLgorICAgICAqLworCisgICAgLyoqCisgICAgICogQG5nZG9jIG1ldGhvZAorICAgICAqIEBuYW1lICRzY2UjcGFyc2VBc0pzCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UucGFyc2VBc0pzKHZhbHVlKWAg4oY/CisgICAgICogICAgIHtAbGluayBuZy4kc2NlI3BhcnNlQXMgYCRzY2UucGFyc2VBcygkc2NlLkpTLCB2YWx1ZSlgfQorICAgICAqCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS4KKyAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCwgbG9jYWxzKX0gYSBmdW5jdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb21waWxlZCBleHByZXNzaW9uOgorICAgICAqCisgICAgICogICAgKiBgY29udGV4dGAg4oA/IGB7b2JqZWN0fWAg4oA/IGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5ncworICAgICAqICAgICAgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0ICh0eXBpY2FsbHkgYSBzY29wZSBvYmplY3QpLgorICAgICAqICAgICogYGxvY2Fsc2Ag4oA/IGB7b2JqZWN0PX1gIOKAPyBsb2NhbCB2YXJpYWJsZXMgY29udGV4dCBvYmplY3QsIHVzZWZ1bCBmb3Igb3ZlcnJpZGluZyB2YWx1ZXMgaW4KKyAgICAgKiAgICAgIGBjb250ZXh0YC4KKyAgICAgKi8KKworICAgIC8vIFNob3J0aGFuZCBkZWxlZ2F0aW9ucy4KKyAgICB2YXIgcGFyc2UgPSBzY2UucGFyc2VBcywKKyAgICAgICAgZ2V0VHJ1c3RlZCA9IHNjZS5nZXRUcnVzdGVkLAorICAgICAgICB0cnVzdEFzID0gc2NlLnRydXN0QXM7CisKKyAgICBmb3JFYWNoKFNDRV9DT05URVhUUywgZnVuY3Rpb24oZW51bVZhbHVlLCBuYW1lKSB7CisgICAgICB2YXIgbE5hbWUgPSBsb3dlcmNhc2UobmFtZSk7CisgICAgICBzY2VbY2FtZWxDYXNlKCJwYXJzZV9hc18iICsgbE5hbWUpXSA9IGZ1bmN0aW9uKGV4cHIpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlKGVudW1WYWx1ZSwgZXhwcik7CisgICAgICB9OworICAgICAgc2NlW2NhbWVsQ2FzZSgiZ2V0X3RydXN0ZWRfIiArIGxOYW1lKV0gPSBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICByZXR1cm4gZ2V0VHJ1c3RlZChlbnVtVmFsdWUsIHZhbHVlKTsKKyAgICAgIH07CisgICAgICBzY2VbY2FtZWxDYXNlKCJ0cnVzdF9hc18iICsgbE5hbWUpXSA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgIHJldHVybiB0cnVzdEFzKGVudW1WYWx1ZSwgdmFsdWUpOworICAgICAgfTsKKyAgICB9KTsKKworICAgIHJldHVybiBzY2U7CisgIH1dOworfQorCisvKioKKyAqICEhISBUaGlzIGlzIGFuIHVuZG9jdW1lbnRlZCAicHJpdmF0ZSIgc2VydmljZSAhISEKKyAqCisgKiBAbmFtZSAkc25pZmZlcgorICogQHJlcXVpcmVzICR3aW5kb3cKKyAqIEByZXF1aXJlcyAkZG9jdW1lbnQKKyAqCisgKiBAcHJvcGVydHkge2Jvb2xlYW59IGhpc3RvcnkgRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IGh0bWw1IGhpc3RvcnkgYXBpID8KKyAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdHJhbnNpdGlvbnMgRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IENTUyB0cmFuc2l0aW9uIGV2ZW50cyA/CisgKiBAcHJvcGVydHkge2Jvb2xlYW59IGFuaW1hdGlvbnMgRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IENTUyBhbmltYXRpb24gZXZlbnRzID8KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFRoaXMgaXMgdmVyeSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGVzdGluZyBicm93c2VyJ3MgZmVhdHVyZXMuCisgKi8KK2Z1bmN0aW9uICRTbmlmZmVyUHJvdmlkZXIoKSB7CisgIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsICckZG9jdW1lbnQnLCBmdW5jdGlvbigkd2luZG93LCAkZG9jdW1lbnQpIHsKKyAgICB2YXIgZXZlbnRTdXBwb3J0ID0ge30sCisgICAgICAgIGFuZHJvaWQgPQorICAgICAgICAgIGludCgoL2FuZHJvaWQgKFxkKykvLmV4ZWMobG93ZXJjYXNlKCgkd2luZG93Lm5hdmlnYXRvciB8fCB7fSkudXNlckFnZW50KSkgfHwgW10pWzFdKSwKKyAgICAgICAgYm94ZWUgPSAvQm94ZWUvaS50ZXN0KCgkd2luZG93Lm5hdmlnYXRvciB8fCB7fSkudXNlckFnZW50KSwKKyAgICAgICAgZG9jdW1lbnQgPSAkZG9jdW1lbnRbMF0gfHwge30sCisgICAgICAgIHZlbmRvclByZWZpeCwKKyAgICAgICAgdmVuZG9yUmVnZXggPSAvXihNb3p8d2Via2l0fG1zKSg/PVtBLVpdKS8sCisgICAgICAgIGJvZHlTdHlsZSA9IGRvY3VtZW50LmJvZHkgJiYgZG9jdW1lbnQuYm9keS5zdHlsZSwKKyAgICAgICAgdHJhbnNpdGlvbnMgPSBmYWxzZSwKKyAgICAgICAgYW5pbWF0aW9ucyA9IGZhbHNlLAorICAgICAgICBtYXRjaDsKKworICAgIGlmIChib2R5U3R5bGUpIHsKKyAgICAgIGZvciAodmFyIHByb3AgaW4gYm9keVN0eWxlKSB7CisgICAgICAgIGlmIChtYXRjaCA9IHZlbmRvclJlZ2V4LmV4ZWMocHJvcCkpIHsKKyAgICAgICAgICB2ZW5kb3JQcmVmaXggPSBtYXRjaFswXTsKKyAgICAgICAgICB2ZW5kb3JQcmVmaXggPSB2ZW5kb3JQcmVmaXguc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB2ZW5kb3JQcmVmaXguc3Vic3RyKDEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghdmVuZG9yUHJlZml4KSB7CisgICAgICAgIHZlbmRvclByZWZpeCA9ICgnV2Via2l0T3BhY2l0eScgaW4gYm9keVN0eWxlKSAmJiAnd2Via2l0JzsKKyAgICAgIH0KKworICAgICAgdHJhbnNpdGlvbnMgPSAhISgoJ3RyYW5zaXRpb24nIGluIGJvZHlTdHlsZSkgfHwgKHZlbmRvclByZWZpeCArICdUcmFuc2l0aW9uJyBpbiBib2R5U3R5bGUpKTsKKyAgICAgIGFuaW1hdGlvbnMgID0gISEoKCdhbmltYXRpb24nIGluIGJvZHlTdHlsZSkgfHwgKHZlbmRvclByZWZpeCArICdBbmltYXRpb24nIGluIGJvZHlTdHlsZSkpOworCisgICAgICBpZiAoYW5kcm9pZCAmJiAoIXRyYW5zaXRpb25zIHx8ICAhYW5pbWF0aW9ucykpIHsKKyAgICAgICAgdHJhbnNpdGlvbnMgPSBpc1N0cmluZyhkb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdFRyYW5zaXRpb24pOworICAgICAgICBhbmltYXRpb25zID0gaXNTdHJpbmcoZG9jdW1lbnQuYm9keS5zdHlsZS53ZWJraXRBbmltYXRpb24pOworICAgICAgfQorICAgIH0KKworCisgICAgcmV0dXJuIHsKKyAgICAgIC8vIEFuZHJvaWQgaGFzIGhpc3RvcnkucHVzaFN0YXRlLCBidXQgaXQgZG9lcyBub3QgdXBkYXRlIGxvY2F0aW9uIGNvcnJlY3RseQorICAgICAgLy8gc28gbGV0J3Mgbm90IHVzZSB0aGUgaGlzdG9yeSBBUEkgYXQgYWxsLgorICAgICAgLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD0xNzQ3MQorICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvOTA0CisKKyAgICAgIC8vIG9sZGVyIHdlYmtpdCBicm93c2VyICg1MzMuOSkgb24gQm94ZWUgYm94IGhhcyBleGFjdGx5IHRoZSBzYW1lIHByb2JsZW0gYXMgQW5kcm9pZCBoYXMKKyAgICAgIC8vIHNvIGxldCdzIG5vdCB1c2UgdGhlIGhpc3RvcnkgQVBJIGFsc28KKyAgICAgIC8vIFdlIGFyZSBwdXJwb3NlZnVsbHkgdXNpbmcgYCEoYW5kcm9pZCA8IDQpYCB0byBjb3ZlciB0aGUgY2FzZSB3aGVuIGBhbmRyb2lkYCBpcyB1bmRlZmluZWQKKyAgICAgIC8vIGpzaGludCAtVzAxOAorICAgICAgaGlzdG9yeTogISEoJHdpbmRvdy5oaXN0b3J5ICYmICR3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUgJiYgIShhbmRyb2lkIDwgNCkgJiYgIWJveGVlKSwKKyAgICAgIC8vIGpzaGludCArVzAxOAorICAgICAgaGFzRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgIC8vIElFOSBpbXBsZW1lbnRzICdpbnB1dCcgZXZlbnQgaXQncyBzbyBmdWJhcmVkIHRoYXQgd2UgcmF0aGVyIHByZXRlbmQgdGhhdCBpdCBkb2Vzbid0IGhhdmUKKyAgICAgICAgLy8gaXQuIEluIHBhcnRpY3VsYXIgdGhlIGV2ZW50IGlzIG5vdCBmaXJlZCB3aGVuIGJhY2tzcGFjZSBvciBkZWxldGUga2V5IGFyZSBwcmVzc2VkIG9yCisgICAgICAgIC8vIHdoZW4gY3V0IG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCisgICAgICAgIC8vIElFMTArIGltcGxlbWVudHMgJ2lucHV0JyBldmVudCBidXQgaXQgZXJyb25lb3VzbHkgZmlyZXMgdW5kZXIgdmFyaW91cyBzaXR1YXRpb25zLAorICAgICAgICAvLyBlLmcuIHdoZW4gcGxhY2Vob2xkZXIgY2hhbmdlcywgb3IgYSBmb3JtIGlzIGZvY3VzZWQuCisgICAgICAgIGlmIChldmVudCA9PT0gJ2lucHV0JyAmJiBtc2llIDw9IDExKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGV2ZW50U3VwcG9ydFtldmVudF0pKSB7CisgICAgICAgICAgdmFyIGRpdkVsbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICAgICAgICAgIGV2ZW50U3VwcG9ydFtldmVudF0gPSAnb24nICsgZXZlbnQgaW4gZGl2RWxtOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGV2ZW50U3VwcG9ydFtldmVudF07CisgICAgICB9LAorICAgICAgY3NwOiBjc3AoKSwKKyAgICAgIHZlbmRvclByZWZpeDogdmVuZG9yUHJlZml4LAorICAgICAgdHJhbnNpdGlvbnM6IHRyYW5zaXRpb25zLAorICAgICAgYW5pbWF0aW9uczogYW5pbWF0aW9ucywKKyAgICAgIGFuZHJvaWQ6IGFuZHJvaWQKKyAgICB9OworICB9XTsKK30KKwordmFyICRjb21waWxlTWluRXJyID0gbWluRXJyKCckY29tcGlsZScpOworCisvKioKKyAqIEBuZ2RvYyBzZXJ2aWNlCisgKiBAbmFtZSAkdGVtcGxhdGVSZXF1ZXN0CisgKgorICogQGRlc2NyaXB0aW9uCisgKiBUaGUgYCR0ZW1wbGF0ZVJlcXVlc3RgIHNlcnZpY2UgZG93bmxvYWRzIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSB1c2luZyBgJGh0dHBgIGFuZCwgdXBvbiBzdWNjZXNzLAorICogc3RvcmVzIHRoZSBjb250ZW50cyBpbnNpZGUgb2YgYCR0ZW1wbGF0ZUNhY2hlYC4gSWYgdGhlIEhUVFAgcmVxdWVzdCBmYWlscyBvciB0aGUgcmVzcG9uc2UgZGF0YQorICogb2YgdGhlIEhUVFAgcmVxdWVzdCBpcyBlbXB0eSwgYSBgJGNvbXBpbGVgIGVycm9yIHdpbGwgYmUgdGhyb3duICh0aGUgZXhjZXB0aW9uIGNhbiBiZSB0aHdhcnRlZAorICogYnkgc2V0dGluZyB0aGUgMm5kIHBhcmFtZXRlciBvZiB0aGUgZnVuY3Rpb24gdG8gdHJ1ZSkuCisgKgorICogQHBhcmFtIHtzdHJpbmd9IHRwbCBUaGUgSFRUUCByZXF1ZXN0IHRlbXBsYXRlIFVSTAorICogQHBhcmFtIHtib29sZWFuPX0gaWdub3JlUmVxdWVzdEVycm9yIFdoZXRoZXIgb3Igbm90IHRvIGlnbm9yZSB0aGUgZXhjZXB0aW9uIHdoZW4gdGhlIHJlcXVlc3QgZmFpbHMgb3IgdGhlIHRlbXBsYXRlIGlzIGVtcHR5CisgKgorICogQHJldHVybiB7UHJvbWlzZX0gdGhlIEhUVFAgUHJvbWlzZSBmb3IgdGhlIGdpdmVuLgorICoKKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3RhbFBlbmRpbmdSZXF1ZXN0cyB0b3RhbCBhbW91bnQgb2YgcGVuZGluZyB0ZW1wbGF0ZSByZXF1ZXN0cyBiZWluZyBkb3dubG9hZGVkLgorICovCitmdW5jdGlvbiAkVGVtcGxhdGVSZXF1ZXN0UHJvdmlkZXIoKSB7CisgIHRoaXMuJGdldCA9IFsnJHRlbXBsYXRlQ2FjaGUnLCAnJGh0dHAnLCAnJHEnLCBmdW5jdGlvbigkdGVtcGxhdGVDYWNoZSwgJGh0dHAsICRxKSB7CisgICAgZnVuY3Rpb24gaGFuZGxlUmVxdWVzdEZuKHRwbCwgaWdub3JlUmVxdWVzdEVycm9yKSB7CisgICAgICB2YXIgc2VsZiA9IGhhbmRsZVJlcXVlc3RGbjsKKyAgICAgIHNlbGYudG90YWxQZW5kaW5nUmVxdWVzdHMrKzsKKworICAgICAgdmFyIHRyYW5zZm9ybVJlc3BvbnNlID0gJGh0dHAuZGVmYXVsdHMgJiYgJGh0dHAuZGVmYXVsdHMudHJhbnNmb3JtUmVzcG9uc2U7CisKKyAgICAgIGlmIChpc0FycmF5KHRyYW5zZm9ybVJlc3BvbnNlKSkgeworICAgICAgICB0cmFuc2Zvcm1SZXNwb25zZSA9IHRyYW5zZm9ybVJlc3BvbnNlLmZpbHRlcihmdW5jdGlvbih0cmFuc2Zvcm1lcikgeworICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lciAhPT0gZGVmYXVsdEh0dHBSZXNwb25zZVRyYW5zZm9ybTsKKyAgICAgICAgfSk7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybVJlc3BvbnNlID09PSBkZWZhdWx0SHR0cFJlc3BvbnNlVHJhbnNmb3JtKSB7CisgICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgdmFyIGh0dHBPcHRpb25zID0geworICAgICAgICBjYWNoZTogJHRlbXBsYXRlQ2FjaGUsCisgICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiB0cmFuc2Zvcm1SZXNwb25zZQorICAgICAgfTsKKworICAgICAgcmV0dXJuICRodHRwLmdldCh0cGwsIGh0dHBPcHRpb25zKQorICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICAgIHNlbGYudG90YWxQZW5kaW5nUmVxdWVzdHMtLTsKKyAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTsKKyAgICAgICAgfSwgaGFuZGxlRXJyb3IpOworCisgICAgICBmdW5jdGlvbiBoYW5kbGVFcnJvcihyZXNwKSB7CisgICAgICAgIHNlbGYudG90YWxQZW5kaW5nUmVxdWVzdHMtLTsKKyAgICAgICAgaWYgKCFpZ25vcmVSZXF1ZXN0RXJyb3IpIHsKKyAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycigndHBsb2FkJywgJ0ZhaWxlZCB0byBsb2FkIHRlbXBsYXRlOiB7MH0nLCB0cGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAkcS5yZWplY3QocmVzcCk7CisgICAgICB9CisgICAgfQorCisgICAgaGFuZGxlUmVxdWVzdEZuLnRvdGFsUGVuZGluZ1JlcXVlc3RzID0gMDsKKworICAgIHJldHVybiBoYW5kbGVSZXF1ZXN0Rm47CisgIH1dOworfQorCitmdW5jdGlvbiAkJFRlc3RhYmlsaXR5UHJvdmlkZXIoKSB7CisgIHRoaXMuJGdldCA9IFsnJHJvb3RTY29wZScsICckYnJvd3NlcicsICckbG9jYXRpb24nLAorICAgICAgIGZ1bmN0aW9uKCRyb290U2NvcGUsICAgJGJyb3dzZXIsICAgJGxvY2F0aW9uKSB7CisKKyAgICAvKioKKyAgICAgKiBAbmFtZSAkdGVzdGFiaWxpdHkKKyAgICAgKgorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqIFRoZSBwcml2YXRlICQkdGVzdGFiaWxpdHkgc2VydmljZSBwcm92aWRlcyBhIGNvbGxlY3Rpb24gb2YgbWV0aG9kcyBmb3IgdXNlIHdoZW4gZGVidWdnaW5nCisgICAgICogb3IgYnkgYXV0b21hdGVkIHRlc3QgYW5kIGRlYnVnZ2luZyB0b29scy4KKyAgICAgKi8KKyAgICB2YXIgdGVzdGFiaWxpdHkgPSB7fTsKKworICAgIC8qKgorICAgICAqIEBuYW1lICQkdGVzdGFiaWxpdHkjZmluZEJpbmRpbmdzCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIGJvdW5kICh2aWEgbmctYmluZCBvciB7e319KQorICAgICAqIHRvIGV4cHJlc3Npb25zIG1hdGNoaW5nIHRoZSBpbnB1dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCByb290IHRvIHNlYXJjaCBmcm9tLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gbWF0Y2guCisgICAgICogQHBhcmFtIHtib29sZWFufSBvcHRfZXhhY3RNYXRjaCBJZiB0cnVlLCBvbmx5IHJldHVybnMgZXhhY3QgbWF0Y2hlcworICAgICAqICAgICBmb3IgdGhlIGV4cHJlc3Npb24uIEZpbHRlcnMgYW5kIHdoaXRlc3BhY2UgYXJlIGlnbm9yZWQuCisgICAgICovCisgICAgdGVzdGFiaWxpdHkuZmluZEJpbmRpbmdzID0gZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgb3B0X2V4YWN0TWF0Y2gpIHsKKyAgICAgIHZhciBiaW5kaW5ncyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmctYmluZGluZycpOworICAgICAgdmFyIG1hdGNoZXMgPSBbXTsKKyAgICAgIGZvckVhY2goYmluZGluZ3MsIGZ1bmN0aW9uKGJpbmRpbmcpIHsKKyAgICAgICAgdmFyIGRhdGFCaW5kaW5nID0gYW5ndWxhci5lbGVtZW50KGJpbmRpbmcpLmRhdGEoJyRiaW5kaW5nJyk7CisgICAgICAgIGlmIChkYXRhQmluZGluZykgeworICAgICAgICAgIGZvckVhY2goZGF0YUJpbmRpbmcsIGZ1bmN0aW9uKGJpbmRpbmdOYW1lKSB7CisgICAgICAgICAgICBpZiAob3B0X2V4YWN0TWF0Y2gpIHsKKyAgICAgICAgICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgUmVnRXhwKCcoXnxcXHMpJyArIGVzY2FwZUZvclJlZ2V4cChleHByZXNzaW9uKSArICcoXFxzfFxcfHwkKScpOworICAgICAgICAgICAgICBpZiAobWF0Y2hlci50ZXN0KGJpbmRpbmdOYW1lKSkgeworICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChiaW5kaW5nKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKGJpbmRpbmdOYW1lLmluZGV4T2YoZXhwcmVzc2lvbikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goYmluZGluZyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICByZXR1cm4gbWF0Y2hlczsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQG5hbWUgJCR0ZXN0YWJpbGl0eSNmaW5kTW9kZWxzCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHR3by13YXkgZm91bmQgdmlhIG5nLW1vZGVsIHRvCisgICAgICogZXhwcmVzc2lvbnMgbWF0Y2hpbmcgdGhlIGlucHV0LgorICAgICAqCisgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHJvb3QgdG8gc2VhcmNoIGZyb20uCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIG1vZGVsIGV4cHJlc3Npb24gdG8gbWF0Y2guCisgICAgICogQHBhcmFtIHtib29sZWFufSBvcHRfZXhhY3RNYXRjaCBJZiB0cnVlLCBvbmx5IHJldHVybnMgZXhhY3QgbWF0Y2hlcworICAgICAqICAgICBmb3IgdGhlIGV4cHJlc3Npb24uCisgICAgICovCisgICAgdGVzdGFiaWxpdHkuZmluZE1vZGVscyA9IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIG9wdF9leGFjdE1hdGNoKSB7CisgICAgICB2YXIgcHJlZml4ZXMgPSBbJ25nLScsICdkYXRhLW5nLScsICduZ1xcOiddOworICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBwcmVmaXhlcy5sZW5ndGg7ICsrcCkgeworICAgICAgICB2YXIgYXR0cmlidXRlRXF1YWxzID0gb3B0X2V4YWN0TWF0Y2ggPyAnPScgOiAnKj0nOworICAgICAgICB2YXIgc2VsZWN0b3IgPSAnWycgKyBwcmVmaXhlc1twXSArICdtb2RlbCcgKyBhdHRyaWJ1dGVFcXVhbHMgKyAnIicgKyBleHByZXNzaW9uICsgJyJdJzsKKyAgICAgICAgdmFyIGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKKyAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCkgeworICAgICAgICAgIHJldHVybiBlbGVtZW50czsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBAbmFtZSAkJHRlc3RhYmlsaXR5I2dldExvY2F0aW9uCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBTaG9ydGN1dCBmb3IgZ2V0dGluZyB0aGUgbG9jYXRpb24gaW4gYSBicm93c2VyIGFnbm9zdGljIHdheS4gUmV0dXJucworICAgICAqICAgICB0aGUgcGF0aCwgc2VhcmNoLCBhbmQgaGFzaC4gKGUuZy4gL3BhdGg/YT1iI2hhc2gpCisgICAgICovCisgICAgdGVzdGFiaWxpdHkuZ2V0TG9jYXRpb24gPSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiAkbG9jYXRpb24udXJsKCk7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEBuYW1lICQkdGVzdGFiaWxpdHkjc2V0TG9jYXRpb24KKyAgICAgKgorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqIFNob3J0Y3V0IGZvciBuYXZpZ2F0aW5nIHRvIGEgbG9jYXRpb24gd2l0aG91dCBkb2luZyBhIGZ1bGwgcGFnZSByZWxvYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBsb2NhdGlvbiB1cmwgKHBhdGgsIHNlYXJjaCBhbmQgaGFzaCwKKyAgICAgKiAgICAgZS5nLiAvcGF0aD9hPWIjaGFzaCkgdG8gZ28gdG8uCisgICAgICovCisgICAgdGVzdGFiaWxpdHkuc2V0TG9jYXRpb24gPSBmdW5jdGlvbih1cmwpIHsKKyAgICAgIGlmICh1cmwgIT09ICRsb2NhdGlvbi51cmwoKSkgeworICAgICAgICAkbG9jYXRpb24udXJsKHVybCk7CisgICAgICAgICRyb290U2NvcGUuJGRpZ2VzdCgpOworICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBAbmFtZSAkJHRlc3RhYmlsaXR5I3doZW5TdGFibGUKKyAgICAgKgorICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAqIENhbGxzIHRoZSBjYWxsYmFjayB3aGVuICR0aW1lb3V0IGFuZCAkaHR0cCByZXF1ZXN0cyBhcmUgY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sKKyAgICAgKi8KKyAgICB0ZXN0YWJpbGl0eS53aGVuU3RhYmxlID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKKyAgICAgICRicm93c2VyLm5vdGlmeVdoZW5Ob091dHN0YW5kaW5nUmVxdWVzdHMoY2FsbGJhY2spOworICAgIH07CisKKyAgICByZXR1cm4gdGVzdGFiaWxpdHk7CisgIH1dOworfQorCitmdW5jdGlvbiAkVGltZW91dFByb3ZpZGVyKCkgeworICB0aGlzLiRnZXQgPSBbJyRyb290U2NvcGUnLCAnJGJyb3dzZXInLCAnJHEnLCAnJCRxJywgJyRleGNlcHRpb25IYW5kbGVyJywKKyAgICAgICBmdW5jdGlvbigkcm9vdFNjb3BlLCAgICRicm93c2VyLCAgICRxLCAgICQkcSwgICAkZXhjZXB0aW9uSGFuZGxlcikgeworICAgIHZhciBkZWZlcnJlZHMgPSB7fTsKKworCisgICAgIC8qKgorICAgICAgKiBAbmdkb2Mgc2VydmljZQorICAgICAgKiBAbmFtZSAkdGltZW91dAorICAgICAgKgorICAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgICogQW5ndWxhcidzIHdyYXBwZXIgZm9yIGB3aW5kb3cuc2V0VGltZW91dGAuIFRoZSBgZm5gIGZ1bmN0aW9uIGlzIHdyYXBwZWQgaW50byBhIHRyeS9jYXRjaAorICAgICAgKiBibG9jayBhbmQgZGVsZWdhdGVzIGFueSBleGNlcHRpb25zIHRvCisgICAgICAqIHtAbGluayBuZy4kZXhjZXB0aW9uSGFuZGxlciAkZXhjZXB0aW9uSGFuZGxlcn0gc2VydmljZS4KKyAgICAgICoKKyAgICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiByZWdpc3RlcmluZyBhIHRpbWVvdXQgZnVuY3Rpb24gaXMgYSBwcm9taXNlLCB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHdoZW4KKyAgICAgICogdGhlIHRpbWVvdXQgaXMgcmVhY2hlZCBhbmQgdGhlIHRpbWVvdXQgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuCisgICAgICAqCisgICAgICAqIFRvIGNhbmNlbCBhIHRpbWVvdXQgcmVxdWVzdCwgY2FsbCBgJHRpbWVvdXQuY2FuY2VsKHByb21pc2UpYC4KKyAgICAgICoKKyAgICAgICogSW4gdGVzdHMgeW91IGNhbiB1c2Uge0BsaW5rIG5nTW9jay4kdGltZW91dCBgJHRpbWVvdXQuZmx1c2goKWB9IHRvCisgICAgICAqIHN5bmNocm9ub3VzbHkgZmx1c2ggdGhlIHF1ZXVlIG9mIGRlZmVycmVkIGZ1bmN0aW9ucy4KKyAgICAgICoKKyAgICAgICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBBIGZ1bmN0aW9uLCB3aG9zZSBleGVjdXRpb24gc2hvdWxkIGJlIGRlbGF5ZWQuCisgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gW2RlbGF5PTBdIERlbGF5IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgICogQHBhcmFtIHtib29sZWFuPX0gW2ludm9rZUFwcGx5PXRydWVdIElmIHNldCB0byBgZmFsc2VgIHNraXBzIG1vZGVsIGRpcnR5IGNoZWNraW5nLCBvdGhlcndpc2UKKyAgICAgICogICB3aWxsIGludm9rZSBgZm5gIHdpdGhpbiB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGFwcGx5ICRhcHBseX0gYmxvY2suCisgICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuIFRoZSB2YWx1ZSB0aGlzCisgICAgICAqICAgcHJvbWlzZSB3aWxsIGJlIHJlc29sdmVkIHdpdGggaXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYGZuYCBmdW5jdGlvbi4KKyAgICAgICoKKyAgICAgICovCisgICAgZnVuY3Rpb24gdGltZW91dChmbiwgZGVsYXksIGludm9rZUFwcGx5KSB7CisgICAgICB2YXIgc2tpcEFwcGx5ID0gKGlzRGVmaW5lZChpbnZva2VBcHBseSkgJiYgIWludm9rZUFwcGx5KSwKKyAgICAgICAgICBkZWZlcnJlZCA9IChza2lwQXBwbHkgPyAkJHEgOiAkcSkuZGVmZXIoKSwKKyAgICAgICAgICBwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZSwKKyAgICAgICAgICB0aW1lb3V0SWQ7CisKKyAgICAgIHRpbWVvdXRJZCA9ICRicm93c2VyLmRlZmVyKGZ1bmN0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoZm4oKSk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZSk7CisgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgZGVsZXRlIGRlZmVycmVkc1twcm9taXNlLiQkdGltZW91dElkXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2tpcEFwcGx5KSAkcm9vdFNjb3BlLiRhcHBseSgpOworICAgICAgfSwgZGVsYXkpOworCisgICAgICBwcm9taXNlLiQkdGltZW91dElkID0gdGltZW91dElkOworICAgICAgZGVmZXJyZWRzW3RpbWVvdXRJZF0gPSBkZWZlcnJlZDsKKworICAgICAgcmV0dXJuIHByb21pc2U7CisgICAgfQorCisKKyAgICAgLyoqCisgICAgICAqIEBuZ2RvYyBtZXRob2QKKyAgICAgICogQG5hbWUgJHRpbWVvdXQjY2FuY2VsCisgICAgICAqCisgICAgICAqIEBkZXNjcmlwdGlvbgorICAgICAgKiBDYW5jZWxzIGEgdGFzayBhc3NvY2lhdGVkIHdpdGggdGhlIGBwcm9taXNlYC4gQXMgYSByZXN1bHQgb2YgdGhpcywgdGhlIHByb21pc2Ugd2lsbCBiZQorICAgICAgKiByZXNvbHZlZCB3aXRoIGEgcmVqZWN0aW9uLgorICAgICAgKgorICAgICAgKiBAcGFyYW0ge1Byb21pc2U9fSBwcm9taXNlIFByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGAkdGltZW91dGAgZnVuY3Rpb24uCisgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdGFzayBoYXNuJ3QgZXhlY3V0ZWQgeWV0IGFuZCB3YXMgc3VjY2Vzc2Z1bGx5CisgICAgICAqICAgY2FuY2VsZWQuCisgICAgICAqLworICAgIHRpbWVvdXQuY2FuY2VsID0gZnVuY3Rpb24ocHJvbWlzZSkgeworICAgICAgaWYgKHByb21pc2UgJiYgcHJvbWlzZS4kJHRpbWVvdXRJZCBpbiBkZWZlcnJlZHMpIHsKKyAgICAgICAgZGVmZXJyZWRzW3Byb21pc2UuJCR0aW1lb3V0SWRdLnJlamVjdCgnY2FuY2VsZWQnKTsKKyAgICAgICAgZGVsZXRlIGRlZmVycmVkc1twcm9taXNlLiQkdGltZW91dElkXTsKKyAgICAgICAgcmV0dXJuICRicm93c2VyLmRlZmVyLmNhbmNlbChwcm9taXNlLiQkdGltZW91dElkKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9OworCisgICAgcmV0dXJuIHRpbWVvdXQ7CisgIH1dOworfQorCisvLyBOT1RFOiAgVGhlIHVzYWdlIG9mIHdpbmRvdyBhbmQgZG9jdW1lbnQgaW5zdGVhZCBvZiAkd2luZG93IGFuZCAkZG9jdW1lbnQgaGVyZSBpcworLy8gZGVsaWJlcmF0ZS4gIFRoaXMgc2VydmljZSBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyBiZWhhdmlvciBvZiBhbmNob3Igbm9kZXMgY3JlYXRlZCBieSB0aGUKKy8vIGJyb3dzZXIgKHJlc29sdmluZyBhbmQgcGFyc2luZyBVUkxzKSB0aGF0IGlzIHVubGlrZWx5IHRvIGJlIHByb3ZpZGVkIGJ5IG1vY2sgb2JqZWN0cyBhbmQKKy8vIGNhdXNlIHVzIHRvIGJyZWFrIHRlc3RzLiAgSW4gYWRkaXRpb24sIHdoZW4gdGhlIGJyb3dzZXIgcmVzb2x2ZXMgYSBVUkwgZm9yIFhIUiwgaXQKKy8vIGRvZXNuJ3Qga25vdyBhYm91dCBtb2NrZWQgbG9jYXRpb25zIGFuZCByZXNvbHZlcyBVUkxzIHRvIHRoZSByZWFsIGRvY3VtZW50IC0gd2hpY2ggaXMKKy8vIGV4YWN0bHkgdGhlIGJlaGF2aW9yIG5lZWRlZCBoZXJlLiAgVGhlcmUgaXMgbGl0dGxlIHZhbHVlIGlzIG1vY2tpbmcgdGhlc2Ugb3V0IGZvciB0aGlzCisvLyBzZXJ2aWNlLgordmFyIHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwordmFyIG9yaWdpblVybCA9IHVybFJlc29sdmUod2luZG93LmxvY2F0aW9uLmhyZWYpOworCisKKy8qKgorICoKKyAqIEltcGxlbWVudGF0aW9uIE5vdGVzIGZvciBub24tSUUgYnJvd3NlcnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFzc2lnbmluZyBhIFVSTCB0byB0aGUgaHJlZiBwcm9wZXJ0eSBvZiBhbiBhbmNob3IgRE9NIG5vZGUsIGV2ZW4gb25lIGF0dGFjaGVkIHRvIHRoZSBET00sCisgKiByZXN1bHRzIGJvdGggaW4gdGhlIG5vcm1hbGl6aW5nIGFuZCBwYXJzaW5nIG9mIHRoZSBVUkwuICBOb3JtYWxpemluZyBtZWFucyB0aGF0IGEgcmVsYXRpdmUKKyAqIFVSTCB3aWxsIGJlIHJlc29sdmVkIGludG8gYW4gYWJzb2x1dGUgVVJMIGluIHRoZSBjb250ZXh0IG9mIHRoZSBhcHBsaWNhdGlvbiBkb2N1bWVudC4KKyAqIFBhcnNpbmcgbWVhbnMgdGhhdCB0aGUgYW5jaG9yIG5vZGUncyBob3N0LCBob3N0bmFtZSwgcHJvdG9jb2wsIHBvcnQsIHBhdGhuYW1lIGFuZCByZWxhdGVkCisgKiBwcm9wZXJ0aWVzIGFyZSBhbGwgcG9wdWxhdGVkIHRvIHJlZmxlY3QgdGhlIG5vcm1hbGl6ZWQgVVJMLiAgVGhpcyBhcHByb2FjaCBoYXMgd2lkZQorICogY29tcGF0aWJpbGl0eSAtIFNhZmFyaSAxKywgTW96aWxsYSAxKywgT3BlcmEgNyssZSBldGMuICBTZWUKKyAqIGh0dHA6Ly93d3cuYXB0YW5hLmNvbS9yZWZlcmVuY2UvaHRtbC9hcGkvSFRNTEFuY2hvckVsZW1lbnQuaHRtbAorICoKKyAqIEltcGxlbWVudGF0aW9uIE5vdGVzIGZvciBJRQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJRSA+PSA4IGFuZCA8PSAxMCBub3JtYWxpemVzIHRoZSBVUkwgd2hlbiBhc3NpZ25lZCB0byB0aGUgYW5jaG9yIG5vZGUgc2ltaWxhciB0byB0aGUgb3RoZXIKKyAqIGJyb3dzZXJzLiAgSG93ZXZlciwgdGhlIHBhcnNlZCBjb21wb25lbnRzIHdpbGwgbm90IGJlIHNldCBpZiB0aGUgVVJMIGFzc2lnbmVkIGRpZCBub3Qgc3BlY2lmeQorICogdGhlbS4gIChlLmcuIGlmIHlvdSBhc3NpZ24gYS5ocmVmID0gImZvbyIsIHRoZW4gYS5wcm90b2NvbCwgYS5ob3N0LCBldGMuIHdpbGwgYmUgZW1wdHkuKSAgV2UKKyAqIHdvcmsgYXJvdW5kIHRoYXQgYnkgcGVyZm9ybWluZyB0aGUgcGFyc2luZyBpbiBhIDJuZCBzdGVwIGJ5IHRha2luZyBhIHByZXZpb3VzbHkgbm9ybWFsaXplZAorICogVVJMIChlLmcuIGJ5IGFzc2lnbmluZyB0byBhLmhyZWYpIGFuZCBhc3NpZ25pbmcgaXQgYS5ocmVmIGFnYWluLiAgVGhpcyBjb3JyZWN0bHkgcG9wdWxhdGVzIHRoZQorICogcHJvcGVydGllcyBzdWNoIGFzIHByb3RvY29sLCBob3N0bmFtZSwgcG9ydCwgZXRjLgorICoKKyAqIElFNyBkb2VzIG5vdCBub3JtYWxpemUgdGhlIFVSTCB3aGVuIGFzc2lnbmVkIHRvIGFuIGFuY2hvciBub2RlLiAgKEFwcGFyZW50bHksIGl0IGRvZXMsIGlmIG9uZQorICogdXNlcyB0aGUgaW5uZXIgSFRNTCBhcHByb2FjaCB0byBhc3NpZ24gdGhlIFVSTCBhcyBwYXJ0IG9mIGFuIEhUTUwgc25pcHBldCAtCisgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NzI3MjkpICBIb3dldmVyLCBzZXR0aW5nIGltZ1tzcmNdIGRvZXMgbm9ybWFsaXplIHRoZSBVUkwuCisgKiBVbmZvcnR1bmF0ZWx5LCBzZXR0aW5nIGltZ1tzcmNdIHRvIHNvbWV0aGluZyBsaWtlICJqYXZhc2NyaXB0OmZvbyIgb24gSUUgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAqIFNpbmNlIHRoZSBwcmltYXJ5IHVzYWdlIGZvciBub3JtYWxpemluZyBVUkxzIGlzIHRvIHNhbml0aXplIHN1Y2ggVVJMcywgd2UgY2FuJ3QgdXNlIHRoYXQKKyAqIG1ldGhvZCBhbmQgSUUgPCA4IGlzIHVuc3VwcG9ydGVkLgorICoKKyAqIFJlZmVyZW5jZXM6CisgKiAgIGh0dHA6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxBbmNob3JFbGVtZW50CisgKiAgIGh0dHA6Ly93d3cuYXB0YW5hLmNvbS9yZWZlcmVuY2UvaHRtbC9hcGkvSFRNTEFuY2hvckVsZW1lbnQuaHRtbAorICogICBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHMKKyAqICAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9wdWxsLzI5MDIKKyAqICAgaHR0cDovL2phbWVzLnBhZG9sc2V5LmNvbS9qYXZhc2NyaXB0L3BhcnNpbmctdXJscy13aXRoLXRoZS1kb20vCisgKgorICogQGtpbmQgZnVuY3Rpb24KKyAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byBiZSBwYXJzZWQuCisgKiBAZGVzY3JpcHRpb24gTm9ybWFsaXplcyBhbmQgcGFyc2VzIGEgVVJMLgorICogQHJldHVybnMge29iamVjdH0gUmV0dXJucyB0aGUgbm9ybWFsaXplZCBVUkwgYXMgYSBkaWN0aW9uYXJ5LgorICoKKyAqICAgfCBtZW1iZXIgbmFtZSAgIHwgRGVzY3JpcHRpb24gICAgfAorICogICB8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18CisgKiAgIHwgaHJlZiAgICAgICAgICB8IEEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBwcm92aWRlZCBVUkwgaWYgaXQgd2FzIG5vdCBhbiBhYnNvbHV0ZSBVUkwgfAorICogICB8IHByb3RvY29sICAgICAgfCBUaGUgcHJvdG9jb2wgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBjb2xvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgfCBob3N0ICAgICAgICAgIHwgVGhlIGhvc3QgYW5kIHBvcnQgKGlmIHRoZSBwb3J0IGlzIG5vbi1kZWZhdWx0KSBvZiB0aGUgbm9ybWFsaXplZFVybCAgICB8CisgKiAgIHwgc2VhcmNoICAgICAgICB8IFRoZSBzZWFyY2ggcGFyYW1zLCBtaW51cyB0aGUgcXVlc3Rpb24gbWFyayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICB8IGhhc2ggICAgICAgICAgfCBUaGUgaGFzaCBzdHJpbmcsIG1pbnVzIHRoZSBoYXNoIHN5bWJvbAorICogICB8IGhvc3RuYW1lICAgICAgfCBUaGUgaG9zdG5hbWUKKyAqICAgfCBwb3J0ICAgICAgICAgIHwgVGhlIHBvcnQsIHdpdGhvdXQgIjoiCisgKiAgIHwgcGF0aG5hbWUgICAgICB8IFRoZSBwYXRobmFtZSwgYmVnaW5uaW5nIHdpdGggIi8iCisgKgorICovCitmdW5jdGlvbiB1cmxSZXNvbHZlKHVybCkgeworICB2YXIgaHJlZiA9IHVybDsKKworICBpZiAobXNpZSkgeworICAgIC8vIE5vcm1hbGl6ZSBiZWZvcmUgcGFyc2UuICBSZWZlciBJbXBsZW1lbnRhdGlvbiBOb3RlcyBvbiB3aHkgdGhpcyBpcworICAgIC8vIGRvbmUgaW4gdHdvIHN0ZXBzIG9uIElFLgorICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgiaHJlZiIsIGhyZWYpOworICAgIGhyZWYgPSB1cmxQYXJzaW5nTm9kZS5ocmVmOworICB9CisKKyAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7CisKKyAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlscworICByZXR1cm4geworICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsCisgICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJywKKyAgICBob3N0OiB1cmxQYXJzaW5nTm9kZS5ob3N0LAorICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cPy8sICcnKSA6ICcnLAorICAgIGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsCisgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLAorICAgIHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsCisgICAgcGF0aG5hbWU6ICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykKKyAgICAgID8gdXJsUGFyc2luZ05vZGUucGF0aG5hbWUKKyAgICAgIDogJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUKKyAgfTsKK30KKworLyoqCisgKiBQYXJzZSBhIHJlcXVlc3QgVVJMIGFuZCBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgc2FtZS1vcmlnaW4gcmVxdWVzdCBhcyB0aGUgYXBwbGljYXRpb24gZG9jdW1lbnQuCisgKgorICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZXF1ZXN0VXJsIFRoZSB1cmwgb2YgdGhlIHJlcXVlc3QgYXMgYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHJlc29sdmVkCisgKiBvciBhIHBhcnNlZCBVUkwgb2JqZWN0LgorICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgZm9yIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgYXBwbGljYXRpb24gZG9jdW1lbnQuCisgKi8KK2Z1bmN0aW9uIHVybElzU2FtZU9yaWdpbihyZXF1ZXN0VXJsKSB7CisgIHZhciBwYXJzZWQgPSAoaXNTdHJpbmcocmVxdWVzdFVybCkpID8gdXJsUmVzb2x2ZShyZXF1ZXN0VXJsKSA6IHJlcXVlc3RVcmw7CisgIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VcmwucHJvdG9jb2wgJiYKKyAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVXJsLmhvc3QpOworfQorCisvKioKKyAqIEBuZ2RvYyBzZXJ2aWNlCisgKiBAbmFtZSAkd2luZG93CisgKgorICogQGRlc2NyaXB0aW9uCisgKiBBIHJlZmVyZW5jZSB0byB0aGUgYnJvd3NlcidzIGB3aW5kb3dgIG9iamVjdC4gV2hpbGUgYHdpbmRvd2AKKyAqIGlzIGdsb2JhbGx5IGF2YWlsYWJsZSBpbiBKYXZhU2NyaXB0LCBpdCBjYXVzZXMgdGVzdGFiaWxpdHkgcHJvYmxlbXMsIGJlY2F1c2UKKyAqIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiBJbiBhbmd1bGFyIHdlIGFsd2F5cyByZWZlciB0byBpdCB0aHJvdWdoIHRoZQorICogYCR3aW5kb3dgIHNlcnZpY2UsIHNvIGl0IG1heSBiZSBvdmVycmlkZGVuLCByZW1vdmVkIG9yIG1vY2tlZCBmb3IgdGVzdGluZy4KKyAqCisgKiBFeHByZXNzaW9ucywgbGlrZSB0aGUgb25lIGRlZmluZWQgZm9yIHRoZSBgbmdDbGlja2AgZGlyZWN0aXZlIGluIHRoZSBleGFtcGxlCisgKiBiZWxvdywgYXJlIGV2YWx1YXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgc2NvcGUuICBUaGVyZWZvcmUsIHRoZXJlIGlzCisgKiBubyByaXNrIG9mIGluYWR2ZXJ0ZW50bHkgY29kaW5nIGluIGEgZGVwZW5kZW5jeSBvbiBhIGdsb2JhbCB2YWx1ZSBpbiBzdWNoIGFuCisgKiBleHByZXNzaW9uLgorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZSBtb2R1bGU9IndpbmRvd0V4YW1wbGUiPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8c2NyaXB0PgorICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3dpbmRvd0V4YW1wbGUnLCBbXSkKKyAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJHdpbmRvdycsIGZ1bmN0aW9uKCRzY29wZSwgJHdpbmRvdykgeworICAgICAgICAgICAgICRzY29wZS5ncmVldGluZyA9ICdIZWxsbywgV29ybGQhJzsKKyAgICAgICAgICAgICAkc2NvcGUuZG9HcmVldGluZyA9IGZ1bmN0aW9uKGdyZWV0aW5nKSB7CisgICAgICAgICAgICAgICAkd2luZG93LmFsZXJ0KGdyZWV0aW5nKTsKKyAgICAgICAgICAgICB9OworICAgICAgICAgICB9XSk7CisgICAgICAgPC9zY3JpcHQ+CisgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImdyZWV0aW5nIiAvPgorICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz0iZG9HcmVldGluZyhncmVldGluZykiPkFMRVJUPC9idXR0b24+CisgICAgICAgPC9kaXY+CisgICAgIDwvZmlsZT4KKyAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICBpdCgnc2hvdWxkIGRpc3BsYXkgdGhlIGdyZWV0aW5nIGluIHRoZSBpbnB1dCBib3gnLCBmdW5jdGlvbigpIHsKKyAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdncmVldGluZycpKS5zZW5kS2V5cygnSGVsbG8sIEUyRSBUZXN0cycpOworICAgICAgIC8vIElmIHdlIGNsaWNrIHRoZSBidXR0b24gaXQgd2lsbCBibG9jayB0aGUgdGVzdCBydW5uZXIKKyAgICAgICAvLyBlbGVtZW50KCc6YnV0dG9uJykuY2xpY2soKTsKKyAgICAgIH0pOworICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisgKi8KK2Z1bmN0aW9uICRXaW5kb3dQcm92aWRlcigpIHsKKyAgdGhpcy4kZ2V0ID0gdmFsdWVGbih3aW5kb3cpOworfQorCisvKiBnbG9iYWwgY3VycmVuY3lGaWx0ZXI6IHRydWUsCisgZGF0ZUZpbHRlcjogdHJ1ZSwKKyBmaWx0ZXJGaWx0ZXI6IHRydWUsCisganNvbkZpbHRlcjogdHJ1ZSwKKyBsaW1pdFRvRmlsdGVyOiB0cnVlLAorIGxvd2VyY2FzZUZpbHRlcjogdHJ1ZSwKKyBudW1iZXJGaWx0ZXI6IHRydWUsCisgb3JkZXJCeUZpbHRlcjogdHJ1ZSwKKyB1cHBlcmNhc2VGaWx0ZXI6IHRydWUsCisgKi8KKworLyoqCisgKiBAbmdkb2MgcHJvdmlkZXIKKyAqIEBuYW1lICRmaWx0ZXJQcm92aWRlcgorICogQGRlc2NyaXB0aW9uCisgKgorICogRmlsdGVycyBhcmUganVzdCBmdW5jdGlvbnMgd2hpY2ggdHJhbnNmb3JtIGlucHV0IHRvIGFuIG91dHB1dC4gSG93ZXZlciBmaWx0ZXJzIG5lZWQgdG8gYmUKKyAqIERlcGVuZGVuY3kgSW5qZWN0ZWQuIFRvIGFjaGlldmUgdGhpcyBhIGZpbHRlciBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGEgZmFjdG9yeSBmdW5jdGlvbiB3aGljaCBpcworICogYW5ub3RhdGVkIHdpdGggZGVwZW5kZW5jaWVzIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYSBmaWx0ZXIgZnVuY3Rpb24uCisgKgorICogYGBganMKKyAqICAgLy8gRmlsdGVyIHJlZ2lzdHJhdGlvbgorICogICBmdW5jdGlvbiBNeU1vZHVsZSgkcHJvdmlkZSwgJGZpbHRlclByb3ZpZGVyKSB7CisgKiAgICAgLy8gY3JlYXRlIGEgc2VydmljZSB0byBkZW1vbnN0cmF0ZSBpbmplY3Rpb24gKG5vdCBhbHdheXMgbmVlZGVkKQorICogICAgICRwcm92aWRlLnZhbHVlKCdncmVldCcsIGZ1bmN0aW9uKG5hbWUpeworICogICAgICAgcmV0dXJuICdIZWxsbyAnICsgbmFtZSArICchJzsKKyAqICAgICB9KTsKKyAqCisgKiAgICAgLy8gcmVnaXN0ZXIgYSBmaWx0ZXIgZmFjdG9yeSB3aGljaCB1c2VzIHRoZQorICogICAgIC8vIGdyZWV0IHNlcnZpY2UgdG8gZGVtb25zdHJhdGUgREkuCisgKiAgICAgJGZpbHRlclByb3ZpZGVyLnJlZ2lzdGVyKCdncmVldCcsIGZ1bmN0aW9uKGdyZWV0KXsKKyAqICAgICAgIC8vIHJldHVybiB0aGUgZmlsdGVyIGZ1bmN0aW9uIHdoaWNoIHVzZXMgdGhlIGdyZWV0IHNlcnZpY2UKKyAqICAgICAgIC8vIHRvIGdlbmVyYXRlIHNhbHV0YXRpb24KKyAqICAgICAgIHJldHVybiBmdW5jdGlvbih0ZXh0KSB7CisgKiAgICAgICAgIC8vIGZpbHRlcnMgbmVlZCB0byBiZSBmb3JnaXZpbmcgc28gY2hlY2sgaW5wdXQgdmFsaWRpdHkKKyAqICAgICAgICAgcmV0dXJuIHRleHQgJiYgZ3JlZXQodGV4dCkgfHwgdGV4dDsKKyAqICAgICAgIH07CisgKiAgICAgfSk7CisgKiAgIH0KKyAqIGBgYAorICoKKyAqIFRoZSBmaWx0ZXIgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgJGluamVjdG9yYCB1bmRlciB0aGUgZmlsdGVyIG5hbWUgc3VmZml4IHdpdGgKKyAqIGBGaWx0ZXJgLgorICoKKyAqIGBgYGpzCisgKiAgIGl0KCdzaG91bGQgYmUgdGhlIHNhbWUgaW5zdGFuY2UnLCBpbmplY3QoCisgKiAgICAgZnVuY3Rpb24oJGZpbHRlclByb3ZpZGVyKSB7CisgKiAgICAgICAkZmlsdGVyUHJvdmlkZXIucmVnaXN0ZXIoJ3JldmVyc2UnLCBmdW5jdGlvbigpeworICogICAgICAgICByZXR1cm4gLi4uOworICogICAgICAgfSk7CisgKiAgICAgfSwKKyAqICAgICBmdW5jdGlvbigkZmlsdGVyLCByZXZlcnNlRmlsdGVyKSB7CisgKiAgICAgICBleHBlY3QoJGZpbHRlcigncmV2ZXJzZScpKS50b0JlKHJldmVyc2VGaWx0ZXIpOworICogICAgIH0pOworICogYGBgCisgKgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyBhbmd1bGFyIGZpbHRlcnMgd29yaywgYW5kIGhvdyB0byBjcmVhdGUgeW91ciBvd24gZmlsdGVycywgc2VlCisgKiB7QGxpbmsgZ3VpZGUvZmlsdGVyIEZpbHRlcnN9IGluIHRoZSBBbmd1bGFyIERldmVsb3BlciBHdWlkZS4KKyAqLworCisvKioKKyAqIEBuZ2RvYyBzZXJ2aWNlCisgKiBAbmFtZSAkZmlsdGVyCisgKiBAa2luZCBmdW5jdGlvbgorICogQGRlc2NyaXB0aW9uCisgKiBGaWx0ZXJzIGFyZSB1c2VkIGZvciBmb3JtYXR0aW5nIGRhdGEgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgorICoKKyAqIFRoZSBnZW5lcmFsIHN5bnRheCBpbiB0ZW1wbGF0ZXMgaXMgYXMgZm9sbG93czoKKyAqCisgKiAgICAgICAgIHt7IGV4cHJlc3Npb24gW3wgZmlsdGVyX25hbWVbOnBhcmFtZXRlcl92YWx1ZV0gLi4uIF0gfX0KKyAqCisgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWx0ZXIgZnVuY3Rpb24gdG8gcmV0cmlldmUKKyAqIEByZXR1cm4ge0Z1bmN0aW9ufSB0aGUgZmlsdGVyIGZ1bmN0aW9uCisgKiBAZXhhbXBsZQorICAgPGV4YW1wbGUgbmFtZT0iJGZpbHRlciIgbW9kdWxlPSJmaWx0ZXJFeGFtcGxlIj4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJNYWluQ3RybCI+CisgICAgICAgIDxoMz57eyBvcmlnaW5hbFRleHQgfX08L2gzPgorICAgICAgICA8aDM+e3sgZmlsdGVyZWRUZXh0IH19PC9oMz4KKyAgICAgICA8L2Rpdj4KKyAgICAgPC9maWxlPgorCisgICAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+CisgICAgICBhbmd1bGFyLm1vZHVsZSgnZmlsdGVyRXhhbXBsZScsIFtdKQorICAgICAgLmNvbnRyb2xsZXIoJ01haW5DdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkZmlsdGVyKSB7CisgICAgICAgICRzY29wZS5vcmlnaW5hbFRleHQgPSAnaGVsbG8nOworICAgICAgICAkc2NvcGUuZmlsdGVyZWRUZXh0ID0gJGZpbHRlcigndXBwZXJjYXNlJykoJHNjb3BlLm9yaWdpbmFsVGV4dCk7CisgICAgICB9KTsKKyAgICAgPC9maWxlPgorICAgPC9leGFtcGxlPgorICAqLworJEZpbHRlclByb3ZpZGVyLiRpbmplY3QgPSBbJyRwcm92aWRlJ107CitmdW5jdGlvbiAkRmlsdGVyUHJvdmlkZXIoJHByb3ZpZGUpIHsKKyAgdmFyIHN1ZmZpeCA9ICdGaWx0ZXInOworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lICRmaWx0ZXJQcm92aWRlciNyZWdpc3RlcgorICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWUgTmFtZSBvZiB0aGUgZmlsdGVyIGZ1bmN0aW9uLCBvciBhbiBvYmplY3QgbWFwIG9mIGZpbHRlcnMgd2hlcmUKKyAgICogICAgdGhlIGtleXMgYXJlIHRoZSBmaWx0ZXIgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBmaWx0ZXIgZmFjdG9yaWVzLgorICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZWdpc3RlcmVkIGZpbHRlciBpbnN0YW5jZSwgb3IgaWYgYSBtYXAgb2YgZmlsdGVycyB3YXMgcHJvdmlkZWQgdGhlbiBhIG1hcAorICAgKiAgICBvZiB0aGUgcmVnaXN0ZXJlZCBmaWx0ZXIgaW5zdGFuY2VzLgorICAgKi8KKyAgZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgZmFjdG9yeSkgeworICAgIGlmIChpc09iamVjdChuYW1lKSkgeworICAgICAgdmFyIGZpbHRlcnMgPSB7fTsKKyAgICAgIGZvckVhY2gobmFtZSwgZnVuY3Rpb24oZmlsdGVyLCBrZXkpIHsKKyAgICAgICAgZmlsdGVyc1trZXldID0gcmVnaXN0ZXIoa2V5LCBmaWx0ZXIpOworICAgICAgfSk7CisgICAgICByZXR1cm4gZmlsdGVyczsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICRwcm92aWRlLmZhY3RvcnkobmFtZSArIHN1ZmZpeCwgZmFjdG9yeSk7CisgICAgfQorICB9CisgIHRoaXMucmVnaXN0ZXIgPSByZWdpc3RlcjsKKworICB0aGlzLiRnZXQgPSBbJyRpbmplY3RvcicsIGZ1bmN0aW9uKCRpbmplY3RvcikgeworICAgIHJldHVybiBmdW5jdGlvbihuYW1lKSB7CisgICAgICByZXR1cm4gJGluamVjdG9yLmdldChuYW1lICsgc3VmZml4KTsKKyAgICB9OworICB9XTsKKworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgLyogZ2xvYmFsCisgICAgY3VycmVuY3lGaWx0ZXI6IGZhbHNlLAorICAgIGRhdGVGaWx0ZXI6IGZhbHNlLAorICAgIGZpbHRlckZpbHRlcjogZmFsc2UsCisgICAganNvbkZpbHRlcjogZmFsc2UsCisgICAgbGltaXRUb0ZpbHRlcjogZmFsc2UsCisgICAgbG93ZXJjYXNlRmlsdGVyOiBmYWxzZSwKKyAgICBudW1iZXJGaWx0ZXI6IGZhbHNlLAorICAgIG9yZGVyQnlGaWx0ZXI6IGZhbHNlLAorICAgIHVwcGVyY2FzZUZpbHRlcjogZmFsc2UsCisgICovCisKKyAgcmVnaXN0ZXIoJ2N1cnJlbmN5JywgY3VycmVuY3lGaWx0ZXIpOworICByZWdpc3RlcignZGF0ZScsIGRhdGVGaWx0ZXIpOworICByZWdpc3RlcignZmlsdGVyJywgZmlsdGVyRmlsdGVyKTsKKyAgcmVnaXN0ZXIoJ2pzb24nLCBqc29uRmlsdGVyKTsKKyAgcmVnaXN0ZXIoJ2xpbWl0VG8nLCBsaW1pdFRvRmlsdGVyKTsKKyAgcmVnaXN0ZXIoJ2xvd2VyY2FzZScsIGxvd2VyY2FzZUZpbHRlcik7CisgIHJlZ2lzdGVyKCdudW1iZXInLCBudW1iZXJGaWx0ZXIpOworICByZWdpc3Rlcignb3JkZXJCeScsIG9yZGVyQnlGaWx0ZXIpOworICByZWdpc3RlcigndXBwZXJjYXNlJywgdXBwZXJjYXNlRmlsdGVyKTsKK30KKworLyoqCisgKiBAbmdkb2MgZmlsdGVyCisgKiBAbmFtZSBmaWx0ZXIKKyAqIEBraW5kIGZ1bmN0aW9uCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBTZWxlY3RzIGEgc3Vic2V0IG9mIGl0ZW1zIGZyb20gYGFycmF5YCBhbmQgcmV0dXJucyBpdCBhcyBhIG5ldyBhcnJheS4KKyAqCisgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc291cmNlIGFycmF5LgorICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fGZ1bmN0aW9uKCl9IGV4cHJlc3Npb24gVGhlIHByZWRpY2F0ZSB0byBiZSB1c2VkIGZvciBzZWxlY3RpbmcgaXRlbXMgZnJvbQorICogICBgYXJyYXlgLgorICoKKyAqICAgQ2FuIGJlIG9uZSBvZjoKKyAqCisgKiAgIC0gYHN0cmluZ2A6IFRoZSBzdHJpbmcgaXMgdXNlZCBmb3IgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgY29udGVudHMgb2YgdGhlIGBhcnJheWAuIEFsbCBzdHJpbmdzIG9yCisgKiAgICAgb2JqZWN0cyB3aXRoIHN0cmluZyBwcm9wZXJ0aWVzIGluIGBhcnJheWAgdGhhdCBtYXRjaCB0aGlzIHN0cmluZyB3aWxsIGJlIHJldHVybmVkLiBUaGlzIGFsc28KKyAqICAgICBhcHBsaWVzIHRvIG5lc3RlZCBvYmplY3QgcHJvcGVydGllcy4KKyAqICAgICBUaGUgcHJlZGljYXRlIGNhbiBiZSBuZWdhdGVkIGJ5IHByZWZpeGluZyB0aGUgc3RyaW5nIHdpdGggYCFgLgorICoKKyAqICAgLSBgT2JqZWN0YDogQSBwYXR0ZXJuIG9iamVjdCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgc3BlY2lmaWMgcHJvcGVydGllcyBvbiBvYmplY3RzIGNvbnRhaW5lZAorICogICAgIGJ5IGBhcnJheWAuIEZvciBleGFtcGxlIGB7bmFtZToiTSIsIHBob25lOiIxIn1gIHByZWRpY2F0ZSB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBpdGVtcworICogICAgIHdoaWNoIGhhdmUgcHJvcGVydHkgYG5hbWVgIGNvbnRhaW5pbmcgIk0iIGFuZCBwcm9wZXJ0eSBgcGhvbmVgIGNvbnRhaW5pbmcgIjEiLiBBIHNwZWNpYWwKKyAqICAgICBwcm9wZXJ0eSBuYW1lIGAkYCBjYW4gYmUgdXNlZCAoYXMgaW4gYHskOiJ0ZXh0In1gKSB0byBhY2NlcHQgYSBtYXRjaCBhZ2FpbnN0IGFueQorICogICAgIHByb3BlcnR5IG9mIHRoZSBvYmplY3Qgb3IgaXRzIG5lc3RlZCBvYmplY3QgcHJvcGVydGllcy4gVGhhdCdzIGVxdWl2YWxlbnQgdG8gdGhlIHNpbXBsZQorICogICAgIHN1YnN0cmluZyBtYXRjaCB3aXRoIGEgYHN0cmluZ2AgYXMgZGVzY3JpYmVkIGFib3ZlLiBUaGUgcHJlZGljYXRlIGNhbiBiZSBuZWdhdGVkIGJ5IHByZWZpeGluZworICogICAgIHRoZSBzdHJpbmcgd2l0aCBgIWAuCisgKiAgICAgRm9yIGV4YW1wbGUgYHtuYW1lOiAiIU0ifWAgcHJlZGljYXRlIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGl0ZW1zIHdoaWNoIGhhdmUgcHJvcGVydHkgYG5hbWVgCisgKiAgICAgbm90IGNvbnRhaW5pbmcgIk0iLgorICoKKyAqICAgICBOb3RlIHRoYXQgYSBuYW1lZCBwcm9wZXJ0eSB3aWxsIG1hdGNoIHByb3BlcnRpZXMgb24gdGhlIHNhbWUgbGV2ZWwgb25seSwgd2hpbGUgdGhlIHNwZWNpYWwKKyAqICAgICBgJGAgcHJvcGVydHkgd2lsbCBtYXRjaCBwcm9wZXJ0aWVzIG9uIHRoZSBzYW1lIGxldmVsIG9yIGRlZXBlci4gRS5nLiBhbiBhcnJheSBpdGVtIGxpa2UKKyAqICAgICBge25hbWU6IHtmaXJzdDogJ0pvaG4nLCBsYXN0OiAnRG9lJ319YCB3aWxsICoqbm90KiogYmUgbWF0Y2hlZCBieSBge25hbWU6ICdKb2huJ31gLCBidXQKKyAqICAgICAqKndpbGwqKiBiZSBtYXRjaGVkIGJ5IGB7JDogJ0pvaG4nfWAuCisgKgorICogICAtIGBmdW5jdGlvbih2YWx1ZSwgaW5kZXgpYDogQSBwcmVkaWNhdGUgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gd3JpdGUgYXJiaXRyYXJ5IGZpbHRlcnMuIFRoZQorICogICAgIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAuIFRoZSBmaW5hbCByZXN1bHQgaXMgYW4gYXJyYXkgb2YgdGhvc2UKKyAqICAgICBlbGVtZW50cyB0aGF0IHRoZSBwcmVkaWNhdGUgcmV0dXJuZWQgdHJ1ZSBmb3IuCisgKgorICogQHBhcmFtIHtmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkKXx0cnVlfHVuZGVmaW5lZH0gY29tcGFyYXRvciBDb21wYXJhdG9yIHdoaWNoIGlzIHVzZWQgaW4KKyAqICAgICBkZXRlcm1pbmluZyBpZiB0aGUgZXhwZWN0ZWQgdmFsdWUgKGZyb20gdGhlIGZpbHRlciBleHByZXNzaW9uKSBhbmQgYWN0dWFsIHZhbHVlIChmcm9tCisgKiAgICAgdGhlIG9iamVjdCBpbiB0aGUgYXJyYXkpIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgbWF0Y2guCisgKgorICogICBDYW4gYmUgb25lIG9mOgorICoKKyAqICAgLSBgZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZClgOgorICogICAgIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGdpdmVuIHRoZSBvYmplY3QgdmFsdWUgYW5kIHRoZSBwcmVkaWNhdGUgdmFsdWUgdG8gY29tcGFyZSBhbmQKKyAqICAgICBzaG91bGQgcmV0dXJuIHRydWUgaWYgYm90aCB2YWx1ZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1YWwuCisgKgorICogICAtIGB0cnVlYDogQSBzaG9ydGhhbmQgZm9yIGBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7IHJldHVybiBhbmd1bGFyLmVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKX1gLgorICogICAgIFRoaXMgaXMgZXNzZW50aWFsbHkgc3RyaWN0IGNvbXBhcmlzb24gb2YgZXhwZWN0ZWQgYW5kIGFjdHVhbC4KKyAqCisgKiAgIC0gYGZhbHNlfHVuZGVmaW5lZGA6IEEgc2hvcnQgaGFuZCBmb3IgYSBmdW5jdGlvbiB3aGljaCB3aWxsIGxvb2sgZm9yIGEgc3Vic3RyaW5nIG1hdGNoIGluIGNhc2UKKyAqICAgICBpbnNlbnNpdGl2ZSB3YXkuCisgKgorICogQGV4YW1wbGUKKyAgIDxleGFtcGxlPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8ZGl2IG5nLWluaXQ9ImZyaWVuZHMgPSBbe25hbWU6J0pvaG4nLCBwaG9uZTonNTU1LTEyNzYnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6J01hcnknLCBwaG9uZTonODAwLUJJRy1NQVJZJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOidNaWtlJywgcGhvbmU6JzU1NS00MzIxJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOidBZGFtJywgcGhvbmU6JzU1NS01Njc4J30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOidKdWxpZScsIHBob25lOic1NTUtODc2NSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTonSnVsaWV0dGUnLCBwaG9uZTonNTU1LTU2NzgnfV0iPjwvZGl2PgorCisgICAgICAgU2VhcmNoOiA8aW5wdXQgbmctbW9kZWw9InNlYXJjaFRleHQiPgorICAgICAgIDx0YWJsZSBpZD0ic2VhcmNoVGV4dFJlc3VsdHMiPgorICAgICAgICAgPHRyPjx0aD5OYW1lPC90aD48dGg+UGhvbmU8L3RoPjwvdHI+CisgICAgICAgICA8dHIgbmctcmVwZWF0PSJmcmllbmQgaW4gZnJpZW5kcyB8IGZpbHRlcjpzZWFyY2hUZXh0Ij4KKyAgICAgICAgICAgPHRkPnt7ZnJpZW5kLm5hbWV9fTwvdGQ+CisgICAgICAgICAgIDx0ZD57e2ZyaWVuZC5waG9uZX19PC90ZD4KKyAgICAgICAgIDwvdHI+CisgICAgICAgPC90YWJsZT4KKyAgICAgICA8aHI+CisgICAgICAgQW55OiA8aW5wdXQgbmctbW9kZWw9InNlYXJjaC4kIj4gPGJyPgorICAgICAgIE5hbWUgb25seSA8aW5wdXQgbmctbW9kZWw9InNlYXJjaC5uYW1lIj48YnI+CisgICAgICAgUGhvbmUgb25seSA8aW5wdXQgbmctbW9kZWw9InNlYXJjaC5waG9uZSI+PGJyPgorICAgICAgIEVxdWFsaXR5IDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9InN0cmljdCI+PGJyPgorICAgICAgIDx0YWJsZSBpZD0ic2VhcmNoT2JqUmVzdWx0cyI+CisgICAgICAgICA8dHI+PHRoPk5hbWU8L3RoPjx0aD5QaG9uZTwvdGg+PC90cj4KKyAgICAgICAgIDx0ciBuZy1yZXBlYXQ9ImZyaWVuZE9iaiBpbiBmcmllbmRzIHwgZmlsdGVyOnNlYXJjaDpzdHJpY3QiPgorICAgICAgICAgICA8dGQ+e3tmcmllbmRPYmoubmFtZX19PC90ZD4KKyAgICAgICAgICAgPHRkPnt7ZnJpZW5kT2JqLnBob25lfX08L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgICA8L3RhYmxlPgorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIHZhciBleHBlY3RGcmllbmROYW1lcyA9IGZ1bmN0aW9uKGV4cGVjdGVkTmFtZXMsIGtleSkgeworICAgICAgICAgZWxlbWVudC5hbGwoYnkucmVwZWF0ZXIoa2V5ICsgJyBpbiBmcmllbmRzJykuY29sdW1uKGtleSArICcubmFtZScpKS50aGVuKGZ1bmN0aW9uKGFycikgeworICAgICAgICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbih3ZCwgaSkgeworICAgICAgICAgICAgIGV4cGVjdCh3ZC5nZXRUZXh0KCkpLnRvTWF0Y2goZXhwZWN0ZWROYW1lc1tpXSk7CisgICAgICAgICAgIH0pOworICAgICAgICAgfSk7CisgICAgICAgfTsKKworICAgICAgIGl0KCdzaG91bGQgc2VhcmNoIGFjcm9zcyBhbGwgZmllbGRzIHdoZW4gZmlsdGVyaW5nIHdpdGggYSBzdHJpbmcnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIHZhciBzZWFyY2hUZXh0ID0gZWxlbWVudChieS5tb2RlbCgnc2VhcmNoVGV4dCcpKTsKKyAgICAgICAgIHNlYXJjaFRleHQuY2xlYXIoKTsKKyAgICAgICAgIHNlYXJjaFRleHQuc2VuZEtleXMoJ20nKTsKKyAgICAgICAgIGV4cGVjdEZyaWVuZE5hbWVzKFsnTWFyeScsICdNaWtlJywgJ0FkYW0nXSwgJ2ZyaWVuZCcpOworCisgICAgICAgICBzZWFyY2hUZXh0LmNsZWFyKCk7CisgICAgICAgICBzZWFyY2hUZXh0LnNlbmRLZXlzKCc3NicpOworICAgICAgICAgZXhwZWN0RnJpZW5kTmFtZXMoWydKb2huJywgJ0p1bGllJ10sICdmcmllbmQnKTsKKyAgICAgICB9KTsKKworICAgICAgIGl0KCdzaG91bGQgc2VhcmNoIGluIHNwZWNpZmljIGZpZWxkcyB3aGVuIGZpbHRlcmluZyB3aXRoIGEgcHJlZGljYXRlIG9iamVjdCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgdmFyIHNlYXJjaEFueSA9IGVsZW1lbnQoYnkubW9kZWwoJ3NlYXJjaC4kJykpOworICAgICAgICAgc2VhcmNoQW55LmNsZWFyKCk7CisgICAgICAgICBzZWFyY2hBbnkuc2VuZEtleXMoJ2knKTsKKyAgICAgICAgIGV4cGVjdEZyaWVuZE5hbWVzKFsnTWFyeScsICdNaWtlJywgJ0p1bGllJywgJ0p1bGlldHRlJ10sICdmcmllbmRPYmonKTsKKyAgICAgICB9KTsKKyAgICAgICBpdCgnc2hvdWxkIHVzZSBhIGVxdWFsIGNvbXBhcmlzb24gd2hlbiBjb21wYXJhdG9yIGlzIHRydWUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIHZhciBzZWFyY2hOYW1lID0gZWxlbWVudChieS5tb2RlbCgnc2VhcmNoLm5hbWUnKSk7CisgICAgICAgICB2YXIgc3RyaWN0ID0gZWxlbWVudChieS5tb2RlbCgnc3RyaWN0JykpOworICAgICAgICAgc2VhcmNoTmFtZS5jbGVhcigpOworICAgICAgICAgc2VhcmNoTmFtZS5zZW5kS2V5cygnSnVsaWUnKTsKKyAgICAgICAgIHN0cmljdC5jbGljaygpOworICAgICAgICAgZXhwZWN0RnJpZW5kTmFtZXMoWydKdWxpZSddLCAnZnJpZW5kT2JqJyk7CisgICAgICAgfSk7CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLworZnVuY3Rpb24gZmlsdGVyRmlsdGVyKCkgeworICByZXR1cm4gZnVuY3Rpb24oYXJyYXksIGV4cHJlc3Npb24sIGNvbXBhcmF0b3IpIHsKKyAgICBpZiAoIWlzQXJyYXkoYXJyYXkpKSByZXR1cm4gYXJyYXk7CisKKyAgICB2YXIgcHJlZGljYXRlRm47CisgICAgdmFyIG1hdGNoQWdhaW5zdEFueVByb3A7CisKKyAgICBzd2l0Y2ggKHR5cGVvZiBleHByZXNzaW9uKSB7CisgICAgICBjYXNlICdmdW5jdGlvbic6CisgICAgICAgIHByZWRpY2F0ZUZuID0gZXhwcmVzc2lvbjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdib29sZWFuJzoKKyAgICAgIGNhc2UgJ251bWJlcic6CisgICAgICBjYXNlICdzdHJpbmcnOgorICAgICAgICBtYXRjaEFnYWluc3RBbnlQcm9wID0gdHJ1ZTsKKyAgICAgICAgLy9qc2hpbnQgLVcwODYKKyAgICAgIGNhc2UgJ29iamVjdCc6CisgICAgICAgIC8vanNoaW50ICtXMDg2CisgICAgICAgIHByZWRpY2F0ZUZuID0gY3JlYXRlUHJlZGljYXRlRm4oZXhwcmVzc2lvbiwgY29tcGFyYXRvciwgbWF0Y2hBZ2FpbnN0QW55UHJvcCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGFycmF5OworICAgIH0KKworICAgIHJldHVybiBhcnJheS5maWx0ZXIocHJlZGljYXRlRm4pOworICB9OworfQorCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBgZmlsdGVyRmlsdGVyYAorZnVuY3Rpb24gY3JlYXRlUHJlZGljYXRlRm4oZXhwcmVzc2lvbiwgY29tcGFyYXRvciwgbWF0Y2hBZ2FpbnN0QW55UHJvcCkgeworICB2YXIgc2hvdWxkTWF0Y2hQcmltaXRpdmVzID0gaXNPYmplY3QoZXhwcmVzc2lvbikgJiYgKCckJyBpbiBleHByZXNzaW9uKTsKKyAgdmFyIHByZWRpY2F0ZUZuOworCisgIGlmIChjb21wYXJhdG9yID09PSB0cnVlKSB7CisgICAgY29tcGFyYXRvciA9IGVxdWFsczsKKyAgfSBlbHNlIGlmICghaXNGdW5jdGlvbihjb21wYXJhdG9yKSkgeworICAgIGNvbXBhcmF0b3IgPSBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7CisgICAgICBpZiAoaXNPYmplY3QoYWN0dWFsKSB8fCBpc09iamVjdChleHBlY3RlZCkpIHsKKyAgICAgICAgLy8gUHJldmVudCBhbiBvYmplY3QgdG8gYmUgY29uc2lkZXJlZCBlcXVhbCB0byBhIHN0cmluZyBsaWtlIGAnW29iamVjdCdgCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgYWN0dWFsID0gbG93ZXJjYXNlKCcnICsgYWN0dWFsKTsKKyAgICAgIGV4cGVjdGVkID0gbG93ZXJjYXNlKCcnICsgZXhwZWN0ZWQpOworICAgICAgcmV0dXJuIGFjdHVhbC5pbmRleE9mKGV4cGVjdGVkKSAhPT0gLTE7CisgICAgfTsKKyAgfQorCisgIHByZWRpY2F0ZUZuID0gZnVuY3Rpb24oaXRlbSkgeworICAgIGlmIChzaG91bGRNYXRjaFByaW1pdGl2ZXMgJiYgIWlzT2JqZWN0KGl0ZW0pKSB7CisgICAgICByZXR1cm4gZGVlcENvbXBhcmUoaXRlbSwgZXhwcmVzc2lvbi4kLCBjb21wYXJhdG9yLCBmYWxzZSk7CisgICAgfQorICAgIHJldHVybiBkZWVwQ29tcGFyZShpdGVtLCBleHByZXNzaW9uLCBjb21wYXJhdG9yLCBtYXRjaEFnYWluc3RBbnlQcm9wKTsKKyAgfTsKKworICByZXR1cm4gcHJlZGljYXRlRm47Cit9CisKK2Z1bmN0aW9uIGRlZXBDb21wYXJlKGFjdHVhbCwgZXhwZWN0ZWQsIGNvbXBhcmF0b3IsIG1hdGNoQWdhaW5zdEFueVByb3AsIGRvbnRNYXRjaFdob2xlT2JqZWN0KSB7CisgIHZhciBhY3R1YWxUeXBlID0gdHlwZW9mIGFjdHVhbDsKKyAgdmFyIGV4cGVjdGVkVHlwZSA9IHR5cGVvZiBleHBlY3RlZDsKKworICBpZiAoKGV4cGVjdGVkVHlwZSA9PT0gJ3N0cmluZycpICYmIChleHBlY3RlZC5jaGFyQXQoMCkgPT09ICchJykpIHsKKyAgICByZXR1cm4gIWRlZXBDb21wYXJlKGFjdHVhbCwgZXhwZWN0ZWQuc3Vic3RyaW5nKDEpLCBjb21wYXJhdG9yLCBtYXRjaEFnYWluc3RBbnlQcm9wKTsKKyAgfSBlbHNlIGlmIChhY3R1YWxUeXBlID09PSAnYXJyYXknKSB7CisgICAgLy8gSW4gY2FzZSBgYWN0dWFsYCBpcyBhbiBhcnJheSwgY29uc2lkZXIgaXQgYSBtYXRjaAorICAgIC8vIGlmIEFOWSBvZiBpdCdzIGl0ZW1zIG1hdGNoZXMgYGV4cGVjdGVkYAorICAgIHJldHVybiBhY3R1YWwuc29tZShmdW5jdGlvbihpdGVtKSB7CisgICAgICByZXR1cm4gZGVlcENvbXBhcmUoaXRlbSwgZXhwZWN0ZWQsIGNvbXBhcmF0b3IsIG1hdGNoQWdhaW5zdEFueVByb3ApOworICAgIH0pOworICB9CisKKyAgc3dpdGNoIChhY3R1YWxUeXBlKSB7CisgICAgY2FzZSAnb2JqZWN0JzoKKyAgICAgIHZhciBrZXk7CisgICAgICBpZiAobWF0Y2hBZ2FpbnN0QW55UHJvcCkgeworICAgICAgICBmb3IgKGtleSBpbiBhY3R1YWwpIHsKKyAgICAgICAgICBpZiAoKGtleS5jaGFyQXQoMCkgIT09ICckJykgJiYgZGVlcENvbXBhcmUoYWN0dWFsW2tleV0sIGV4cGVjdGVkLCBjb21wYXJhdG9yLCB0cnVlKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkb250TWF0Y2hXaG9sZU9iamVjdCA/IGZhbHNlIDogZGVlcENvbXBhcmUoYWN0dWFsLCBleHBlY3RlZCwgY29tcGFyYXRvciwgZmFsc2UpOworICAgICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09ICdvYmplY3QnKSB7CisgICAgICAgIGZvciAoa2V5IGluIGV4cGVjdGVkKSB7CisgICAgICAgICAgdmFyIGV4cGVjdGVkVmFsID0gZXhwZWN0ZWRba2V5XTsKKyAgICAgICAgICBpZiAoaXNGdW5jdGlvbihleHBlY3RlZFZhbCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHZhciBtYXRjaEFueVByb3BlcnR5ID0ga2V5ID09PSAnJCc7CisgICAgICAgICAgdmFyIGFjdHVhbFZhbCA9IG1hdGNoQW55UHJvcGVydHkgPyBhY3R1YWwgOiBhY3R1YWxba2V5XTsKKyAgICAgICAgICBpZiAoIWRlZXBDb21wYXJlKGFjdHVhbFZhbCwgZXhwZWN0ZWRWYWwsIGNvbXBhcmF0b3IsIG1hdGNoQW55UHJvcGVydHksIG1hdGNoQW55UHJvcGVydHkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdmdW5jdGlvbic6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBjb21wYXJhdG9yKGFjdHVhbCwgZXhwZWN0ZWQpOworICB9Cit9CisKKy8qKgorICogQG5nZG9jIGZpbHRlcgorICogQG5hbWUgY3VycmVuY3kKKyAqIEBraW5kIGZ1bmN0aW9uCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBGb3JtYXRzIGEgbnVtYmVyIGFzIGEgY3VycmVuY3kgKGllICQxLDIzNC41NikuIFdoZW4gbm8gY3VycmVuY3kgc3ltYm9sIGlzIHByb3ZpZGVkLCBkZWZhdWx0CisgKiBzeW1ib2wgZm9yIGN1cnJlbnQgbG9jYWxlIGlzIHVzZWQuCisgKgorICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudCBJbnB1dCB0byBmaWx0ZXIuCisgKiBAcGFyYW0ge3N0cmluZz19IHN5bWJvbCBDdXJyZW5jeSBzeW1ib2wgb3IgaWRlbnRpZmllciB0byBiZSBkaXNwbGF5ZWQuCisgKiBAcGFyYW0ge251bWJlcj19IGZyYWN0aW9uU2l6ZSBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gcm91bmQgdGhlIGFtb3VudCB0bywgZGVmYXVsdHMgdG8gZGVmYXVsdCBtYXggZnJhY3Rpb24gc2l6ZSBmb3IgY3VycmVudCBsb2NhbGUKKyAqIEByZXR1cm5zIHtzdHJpbmd9IEZvcm1hdHRlZCBudW1iZXIuCisgKgorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZSBtb2R1bGU9ImN1cnJlbmN5RXhhbXBsZSI+CisgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgIDxzY3JpcHQ+CisgICAgICAgICBhbmd1bGFyLm1vZHVsZSgnY3VycmVuY3lFeGFtcGxlJywgW10pCisgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgICAgICAgJHNjb3BlLmFtb3VudCA9IDEyMzQuNTY7CisgICAgICAgICAgIH1dKTsKKyAgICAgICA8L3NjcmlwdD4KKyAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KKyAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIG5nLW1vZGVsPSJhbW91bnQiPiA8YnI+CisgICAgICAgICBkZWZhdWx0IGN1cnJlbmN5IHN5bWJvbCAoJCk6IDxzcGFuIGlkPSJjdXJyZW5jeS1kZWZhdWx0Ij57e2Ftb3VudCB8IGN1cnJlbmN5fX08L3NwYW4+PGJyPgorICAgICAgICAgY3VzdG9tIGN1cnJlbmN5IGlkZW50aWZpZXIgKFVTRCQpOiA8c3BhbiBpZD0iY3VycmVuY3ktY3VzdG9tIj57e2Ftb3VudCB8IGN1cnJlbmN5OiJVU0QkIn19PC9zcGFuPgorICAgICAgICAgbm8gZnJhY3Rpb25zICgwKTogPHNwYW4gaWQ9ImN1cnJlbmN5LW5vLWZyYWN0aW9ucyI+e3thbW91bnQgfCBjdXJyZW5jeToiVVNEJCI6MH19PC9zcGFuPgorICAgICAgIDwvZGl2PgorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIGl0KCdzaG91bGQgaW5pdCB3aXRoIDEyMzQuNTYnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjdXJyZW5jeS1kZWZhdWx0JykpLmdldFRleHQoKSkudG9CZSgnJDEsMjM0LjU2Jyk7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktY3VzdG9tJykpLmdldFRleHQoKSkudG9CZSgnVVNEJDEsMjM0LjU2Jyk7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktbm8tZnJhY3Rpb25zJykpLmdldFRleHQoKSkudG9CZSgnVVNEJDEsMjM1Jyk7CisgICAgICAgfSk7CisgICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIGlmIChicm93c2VyLnBhcmFtcy5icm93c2VyID09ICdzYWZhcmknKSB7CisgICAgICAgICAgIC8vIFNhZmFyaSBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSBtaW51cyBrZXkuIFNlZQorICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9wcm90cmFjdG9yL2lzc3Vlcy80ODEKKyAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgfQorICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnYW1vdW50JykpLmNsZWFyKCk7CisgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdhbW91bnQnKSkuc2VuZEtleXMoJy0xMjM0Jyk7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktZGVmYXVsdCcpKS5nZXRUZXh0KCkpLnRvQmUoJygkMSwyMzQuMDApJyk7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktY3VzdG9tJykpLmdldFRleHQoKSkudG9CZSgnKFVTRCQxLDIzNC4wMCknKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjdXJyZW5jeS1uby1mcmFjdGlvbnMnKSkuZ2V0VGV4dCgpKS50b0JlKCcoVVNEJDEsMjM0KScpOworICAgICAgIH0pOworICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisgKi8KK2N1cnJlbmN5RmlsdGVyLiRpbmplY3QgPSBbJyRsb2NhbGUnXTsKK2Z1bmN0aW9uIGN1cnJlbmN5RmlsdGVyKCRsb2NhbGUpIHsKKyAgdmFyIGZvcm1hdHMgPSAkbG9jYWxlLk5VTUJFUl9GT1JNQVRTOworICByZXR1cm4gZnVuY3Rpb24oYW1vdW50LCBjdXJyZW5jeVN5bWJvbCwgZnJhY3Rpb25TaXplKSB7CisgICAgaWYgKGlzVW5kZWZpbmVkKGN1cnJlbmN5U3ltYm9sKSkgeworICAgICAgY3VycmVuY3lTeW1ib2wgPSBmb3JtYXRzLkNVUlJFTkNZX1NZTTsKKyAgICB9CisKKyAgICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb25TaXplKSkgeworICAgICAgZnJhY3Rpb25TaXplID0gZm9ybWF0cy5QQVRURVJOU1sxXS5tYXhGcmFjOworICAgIH0KKworICAgIC8vIGlmIG51bGwgb3IgdW5kZWZpbmVkIHBhc3MgaXQgdGhyb3VnaAorICAgIHJldHVybiAoYW1vdW50ID09IG51bGwpCisgICAgICAgID8gYW1vdW50CisgICAgICAgIDogZm9ybWF0TnVtYmVyKGFtb3VudCwgZm9ybWF0cy5QQVRURVJOU1sxXSwgZm9ybWF0cy5HUk9VUF9TRVAsIGZvcm1hdHMuREVDSU1BTF9TRVAsIGZyYWN0aW9uU2l6ZSkuCisgICAgICAgICAgICByZXBsYWNlKC9cdTAwQTQvZywgY3VycmVuY3lTeW1ib2wpOworICB9OworfQorCisvKioKKyAqIEBuZ2RvYyBmaWx0ZXIKKyAqIEBuYW1lIG51bWJlcgorICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIEZvcm1hdHMgYSBudW1iZXIgYXMgdGV4dC4KKyAqCisgKiBJZiB0aGUgaW5wdXQgaXMgbm90IGEgbnVtYmVyIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IG51bWJlciBOdW1iZXIgdG8gZm9ybWF0LgorICogQHBhcmFtIHsobnVtYmVyfHN0cmluZyk9fSBmcmFjdGlvblNpemUgTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHJvdW5kIHRoZSBudW1iZXIgdG8uCisgKiBJZiB0aGlzIGlzIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBmcmFjdGlvbiBzaXplIGlzIGNvbXB1dGVkIGZyb20gdGhlIGN1cnJlbnQgbG9jYWxlJ3MgbnVtYmVyCisgKiBmb3JtYXR0aW5nIHBhdHRlcm4uIEluIHRoZSBjYXNlIG9mIHRoZSBkZWZhdWx0IGxvY2FsZSwgaXQgd2lsbCBiZSAzLgorICogQHJldHVybnMge3N0cmluZ30gTnVtYmVyIHJvdW5kZWQgdG8gZGVjaW1hbFBsYWNlcyBhbmQgcGxhY2VzIGEg4oA/LOKAPyBhZnRlciBlYWNoIHRoaXJkIGRpZ2l0LgorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZSBtb2R1bGU9Im51bWJlckZpbHRlckV4YW1wbGUiPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8c2NyaXB0PgorICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ251bWJlckZpbHRlckV4YW1wbGUnLCBbXSkKKyAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAgICAgICAgICAgICAkc2NvcGUudmFsID0gMTIzNC41Njc4OTsKKyAgICAgICAgICAgfV0pOworICAgICAgIDwvc2NyaXB0PgorICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgICAgRW50ZXIgbnVtYmVyOiA8aW5wdXQgbmctbW9kZWw9J3ZhbCc+PGJyPgorICAgICAgICAgRGVmYXVsdCBmb3JtYXR0aW5nOiA8c3BhbiBpZD0nbnVtYmVyLWRlZmF1bHQnPnt7dmFsIHwgbnVtYmVyfX08L3NwYW4+PGJyPgorICAgICAgICAgTm8gZnJhY3Rpb25zOiA8c3Bhbj57e3ZhbCB8IG51bWJlcjowfX08L3NwYW4+PGJyPgorICAgICAgICAgTmVnYXRpdmUgbnVtYmVyOiA8c3Bhbj57ey12YWwgfCBudW1iZXI6NH19PC9zcGFuPgorICAgICAgIDwvZGl2PgorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIGl0KCdzaG91bGQgZm9ybWF0IG51bWJlcnMnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdudW1iZXItZGVmYXVsdCcpKS5nZXRUZXh0KCkpLnRvQmUoJzEsMjM0LjU2OCcpOworICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygndmFsIHwgbnVtYmVyOjAnKSkuZ2V0VGV4dCgpKS50b0JlKCcxLDIzNScpOworICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnLXZhbCB8IG51bWJlcjo0JykpLmdldFRleHQoKSkudG9CZSgnLTEsMjM0LjU2NzknKTsKKyAgICAgICB9KTsKKworICAgICAgIGl0KCdzaG91bGQgdXBkYXRlJywgZnVuY3Rpb24oKSB7CisgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCd2YWwnKSkuY2xlYXIoKTsKKyAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3ZhbCcpKS5zZW5kS2V5cygnMzM3NC4zMzMnKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdudW1iZXItZGVmYXVsdCcpKS5nZXRUZXh0KCkpLnRvQmUoJzMsMzc0LjMzMycpOworICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygndmFsIHwgbnVtYmVyOjAnKSkuZ2V0VGV4dCgpKS50b0JlKCczLDM3NCcpOworICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnLXZhbCB8IG51bWJlcjo0JykpLmdldFRleHQoKSkudG9CZSgnLTMsMzc0LjMzMzAnKTsKKyAgICAgIH0pOworICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisgKi8KKworCitudW1iZXJGaWx0ZXIuJGluamVjdCA9IFsnJGxvY2FsZSddOworZnVuY3Rpb24gbnVtYmVyRmlsdGVyKCRsb2NhbGUpIHsKKyAgdmFyIGZvcm1hdHMgPSAkbG9jYWxlLk5VTUJFUl9GT1JNQVRTOworICByZXR1cm4gZnVuY3Rpb24obnVtYmVyLCBmcmFjdGlvblNpemUpIHsKKworICAgIC8vIGlmIG51bGwgb3IgdW5kZWZpbmVkIHBhc3MgaXQgdGhyb3VnaAorICAgIHJldHVybiAobnVtYmVyID09IG51bGwpCisgICAgICAgID8gbnVtYmVyCisgICAgICAgIDogZm9ybWF0TnVtYmVyKG51bWJlciwgZm9ybWF0cy5QQVRURVJOU1swXSwgZm9ybWF0cy5HUk9VUF9TRVAsIGZvcm1hdHMuREVDSU1BTF9TRVAsCisgICAgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uU2l6ZSk7CisgIH07Cit9CisKK3ZhciBERUNJTUFMX1NFUCA9ICcuJzsKK2Z1bmN0aW9uIGZvcm1hdE51bWJlcihudW1iZXIsIHBhdHRlcm4sIGdyb3VwU2VwLCBkZWNpbWFsU2VwLCBmcmFjdGlvblNpemUpIHsKKyAgaWYgKCFpc0Zpbml0ZShudW1iZXIpIHx8IGlzT2JqZWN0KG51bWJlcikpIHJldHVybiAnJzsKKworICB2YXIgaXNOZWdhdGl2ZSA9IG51bWJlciA8IDA7CisgIG51bWJlciA9IE1hdGguYWJzKG51bWJlcik7CisgIHZhciBudW1TdHIgPSBudW1iZXIgKyAnJywKKyAgICAgIGZvcm1hdGVkVGV4dCA9ICcnLAorICAgICAgcGFydHMgPSBbXTsKKworICB2YXIgaGFzRXhwb25lbnQgPSBmYWxzZTsKKyAgaWYgKG51bVN0ci5pbmRleE9mKCdlJykgIT09IC0xKSB7CisgICAgdmFyIG1hdGNoID0gbnVtU3RyLm1hdGNoKC8oW1xkXC5dKyllKC0/KShcZCspLyk7CisgICAgaWYgKG1hdGNoICYmIG1hdGNoWzJdID09ICctJyAmJiBtYXRjaFszXSA+IGZyYWN0aW9uU2l6ZSArIDEpIHsKKyAgICAgIG51bWJlciA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvcm1hdGVkVGV4dCA9IG51bVN0cjsKKyAgICAgIGhhc0V4cG9uZW50ID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAoIWhhc0V4cG9uZW50KSB7CisgICAgdmFyIGZyYWN0aW9uTGVuID0gKG51bVN0ci5zcGxpdChERUNJTUFMX1NFUClbMV0gfHwgJycpLmxlbmd0aDsKKworICAgIC8vIGRldGVybWluZSBmcmFjdGlvblNpemUgaWYgaXQgaXMgbm90IHNwZWNpZmllZAorICAgIGlmIChpc1VuZGVmaW5lZChmcmFjdGlvblNpemUpKSB7CisgICAgICBmcmFjdGlvblNpemUgPSBNYXRoLm1pbihNYXRoLm1heChwYXR0ZXJuLm1pbkZyYWMsIGZyYWN0aW9uTGVuKSwgcGF0dGVybi5tYXhGcmFjKTsKKyAgICB9CisKKyAgICAvLyBzYWZlbHkgcm91bmQgbnVtYmVycyBpbiBKUyB3aXRob3V0IGhpdHRpbmcgaW1wcmVjaXNpb25zIG9mIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWNzCisgICAgLy8gaW5zcGlyZWQgYnk6CisgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9yb3VuZAorICAgIG51bWJlciA9ICsoTWF0aC5yb3VuZCgrKG51bWJlci50b1N0cmluZygpICsgJ2UnICsgZnJhY3Rpb25TaXplKSkudG9TdHJpbmcoKSArICdlJyArIC1mcmFjdGlvblNpemUpOworCisgICAgdmFyIGZyYWN0aW9uID0gKCcnICsgbnVtYmVyKS5zcGxpdChERUNJTUFMX1NFUCk7CisgICAgdmFyIHdob2xlID0gZnJhY3Rpb25bMF07CisgICAgZnJhY3Rpb24gPSBmcmFjdGlvblsxXSB8fCAnJzsKKworICAgIHZhciBpLCBwb3MgPSAwLAorICAgICAgICBsZ3JvdXAgPSBwYXR0ZXJuLmxnU2l6ZSwKKyAgICAgICAgZ3JvdXAgPSBwYXR0ZXJuLmdTaXplOworCisgICAgaWYgKHdob2xlLmxlbmd0aCA+PSAobGdyb3VwICsgZ3JvdXApKSB7CisgICAgICBwb3MgPSB3aG9sZS5sZW5ndGggLSBsZ3JvdXA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9zOyBpKyspIHsKKyAgICAgICAgaWYgKChwb3MgLSBpKSAlIGdyb3VwID09PSAwICYmIGkgIT09IDApIHsKKyAgICAgICAgICBmb3JtYXRlZFRleHQgKz0gZ3JvdXBTZXA7CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0ZWRUZXh0ICs9IHdob2xlLmNoYXJBdChpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSBwb3M7IGkgPCB3aG9sZS5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKCh3aG9sZS5sZW5ndGggLSBpKSAlIGxncm91cCA9PT0gMCAmJiBpICE9PSAwKSB7CisgICAgICAgIGZvcm1hdGVkVGV4dCArPSBncm91cFNlcDsKKyAgICAgIH0KKyAgICAgIGZvcm1hdGVkVGV4dCArPSB3aG9sZS5jaGFyQXQoaSk7CisgICAgfQorCisgICAgLy8gZm9ybWF0IGZyYWN0aW9uIHBhcnQuCisgICAgd2hpbGUgKGZyYWN0aW9uLmxlbmd0aCA8IGZyYWN0aW9uU2l6ZSkgeworICAgICAgZnJhY3Rpb24gKz0gJzAnOworICAgIH0KKworICAgIGlmIChmcmFjdGlvblNpemUgJiYgZnJhY3Rpb25TaXplICE9PSAiMCIpIGZvcm1hdGVkVGV4dCArPSBkZWNpbWFsU2VwICsgZnJhY3Rpb24uc3Vic3RyKDAsIGZyYWN0aW9uU2l6ZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKGZyYWN0aW9uU2l6ZSA+IDAgJiYgbnVtYmVyIDwgMSkgeworICAgICAgZm9ybWF0ZWRUZXh0ID0gbnVtYmVyLnRvRml4ZWQoZnJhY3Rpb25TaXplKTsKKyAgICAgIG51bWJlciA9IHBhcnNlRmxvYXQoZm9ybWF0ZWRUZXh0KTsKKyAgICB9CisgIH0KKworICBpZiAobnVtYmVyID09PSAwKSB7CisgICAgaXNOZWdhdGl2ZSA9IGZhbHNlOworICB9CisKKyAgcGFydHMucHVzaChpc05lZ2F0aXZlID8gcGF0dGVybi5uZWdQcmUgOiBwYXR0ZXJuLnBvc1ByZSwKKyAgICAgICAgICAgICBmb3JtYXRlZFRleHQsCisgICAgICAgICAgICAgaXNOZWdhdGl2ZSA/IHBhdHRlcm4ubmVnU3VmIDogcGF0dGVybi5wb3NTdWYpOworICByZXR1cm4gcGFydHMuam9pbignJyk7Cit9CisKK2Z1bmN0aW9uIHBhZE51bWJlcihudW0sIGRpZ2l0cywgdHJpbSkgeworICB2YXIgbmVnID0gJyc7CisgIGlmIChudW0gPCAwKSB7CisgICAgbmVnID0gICctJzsKKyAgICBudW0gPSAtbnVtOworICB9CisgIG51bSA9ICcnICsgbnVtOworICB3aGlsZSAobnVtLmxlbmd0aCA8IGRpZ2l0cykgbnVtID0gJzAnICsgbnVtOworICBpZiAodHJpbSkKKyAgICBudW0gPSBudW0uc3Vic3RyKG51bS5sZW5ndGggLSBkaWdpdHMpOworICByZXR1cm4gbmVnICsgbnVtOworfQorCisKK2Z1bmN0aW9uIGRhdGVHZXR0ZXIobmFtZSwgc2l6ZSwgb2Zmc2V0LCB0cmltKSB7CisgIG9mZnNldCA9IG9mZnNldCB8fCAwOworICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkgeworICAgIHZhciB2YWx1ZSA9IGRhdGVbJ2dldCcgKyBuYW1lXSgpOworICAgIGlmIChvZmZzZXQgPiAwIHx8IHZhbHVlID4gLW9mZnNldCkKKyAgICAgIHZhbHVlICs9IG9mZnNldDsKKyAgICBpZiAodmFsdWUgPT09IDAgJiYgb2Zmc2V0ID09IC0xMikgdmFsdWUgPSAxMjsKKyAgICByZXR1cm4gcGFkTnVtYmVyKHZhbHVlLCBzaXplLCB0cmltKTsKKyAgfTsKK30KKworZnVuY3Rpb24gZGF0ZVN0ckdldHRlcihuYW1lLCBzaG9ydEZvcm0pIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUsIGZvcm1hdHMpIHsKKyAgICB2YXIgdmFsdWUgPSBkYXRlWydnZXQnICsgbmFtZV0oKTsKKyAgICB2YXIgZ2V0ID0gdXBwZXJjYXNlKHNob3J0Rm9ybSA/ICgnU0hPUlQnICsgbmFtZSkgOiBuYW1lKTsKKworICAgIHJldHVybiBmb3JtYXRzW2dldF1bdmFsdWVdOworICB9OworfQorCitmdW5jdGlvbiB0aW1lWm9uZUdldHRlcihkYXRlKSB7CisgIHZhciB6b25lID0gLTEgKiBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CisgIHZhciBwYWRkZWRab25lID0gKHpvbmUgPj0gMCkgPyAiKyIgOiAiIjsKKworICBwYWRkZWRab25lICs9IHBhZE51bWJlcihNYXRoW3pvbmUgPiAwID8gJ2Zsb29yJyA6ICdjZWlsJ10oem9uZSAvIDYwKSwgMikgKworICAgICAgICAgICAgICAgIHBhZE51bWJlcihNYXRoLmFicyh6b25lICUgNjApLCAyKTsKKworICByZXR1cm4gcGFkZGVkWm9uZTsKK30KKworZnVuY3Rpb24gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcih5ZWFyKSB7CisgICAgLy8gMCA9IGluZGV4IG9mIEphbnVhcnkKKyAgICB2YXIgZGF5T2ZXZWVrT25GaXJzdCA9IChuZXcgRGF0ZSh5ZWFyLCAwLCAxKSkuZ2V0RGF5KCk7CisgICAgLy8gNCA9IGluZGV4IG9mIFRodXJzZGF5ICgrMSB0byBhY2NvdW50IGZvciAxc3QgPSA1KQorICAgIC8vIDExID0gaW5kZXggb2YgKm5leHQqIFRodXJzZGF5ICgrMSBhY2NvdW50IGZvciAxc3QgPSAxMikKKyAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgMCwgKChkYXlPZldlZWtPbkZpcnN0IDw9IDQpID8gNSA6IDEyKSAtIGRheU9mV2Vla09uRmlyc3QpOworfQorCitmdW5jdGlvbiBnZXRUaHVyc2RheVRoaXNXZWVrKGRhdGV0aW1lKSB7CisgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGV0aW1lLmdldEZ1bGxZZWFyKCksIGRhdGV0aW1lLmdldE1vbnRoKCksCisgICAgICAvLyA0ID0gaW5kZXggb2YgVGh1cnNkYXkKKyAgICAgIGRhdGV0aW1lLmdldERhdGUoKSArICg0IC0gZGF0ZXRpbWUuZ2V0RGF5KCkpKTsKK30KKworZnVuY3Rpb24gd2Vla0dldHRlcihzaXplKSB7CisgICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkgeworICAgICAgdmFyIGZpcnN0VGh1cnMgPSBnZXRGaXJzdFRodXJzZGF5T2ZZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSksCisgICAgICAgICB0aGlzVGh1cnMgPSBnZXRUaHVyc2RheVRoaXNXZWVrKGRhdGUpOworCisgICAgICB2YXIgZGlmZiA9ICt0aGlzVGh1cnMgLSArZmlyc3RUaHVycywKKyAgICAgICAgIHJlc3VsdCA9IDEgKyBNYXRoLnJvdW5kKGRpZmYgLyA2LjA0OGU4KTsgLy8gNi4wNDhlOCBtcyBwZXIgd2VlaworCisgICAgICByZXR1cm4gcGFkTnVtYmVyKHJlc3VsdCwgc2l6ZSk7CisgICB9OworfQorCitmdW5jdGlvbiBhbXBtR2V0dGVyKGRhdGUsIGZvcm1hdHMpIHsKKyAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKSA8IDEyID8gZm9ybWF0cy5BTVBNU1swXSA6IGZvcm1hdHMuQU1QTVNbMV07Cit9CisKK3ZhciBEQVRFX0ZPUk1BVFMgPSB7CisgIHl5eXk6IGRhdGVHZXR0ZXIoJ0Z1bGxZZWFyJywgNCksCisgICAgeXk6IGRhdGVHZXR0ZXIoJ0Z1bGxZZWFyJywgMiwgMCwgdHJ1ZSksCisgICAgIHk6IGRhdGVHZXR0ZXIoJ0Z1bGxZZWFyJywgMSksCisgIE1NTU06IGRhdGVTdHJHZXR0ZXIoJ01vbnRoJyksCisgICBNTU06IGRhdGVTdHJHZXR0ZXIoJ01vbnRoJywgdHJ1ZSksCisgICAgTU06IGRhdGVHZXR0ZXIoJ01vbnRoJywgMiwgMSksCisgICAgIE06IGRhdGVHZXR0ZXIoJ01vbnRoJywgMSwgMSksCisgICAgZGQ6IGRhdGVHZXR0ZXIoJ0RhdGUnLCAyKSwKKyAgICAgZDogZGF0ZUdldHRlcignRGF0ZScsIDEpLAorICAgIEhIOiBkYXRlR2V0dGVyKCdIb3VycycsIDIpLAorICAgICBIOiBkYXRlR2V0dGVyKCdIb3VycycsIDEpLAorICAgIGhoOiBkYXRlR2V0dGVyKCdIb3VycycsIDIsIC0xMiksCisgICAgIGg6IGRhdGVHZXR0ZXIoJ0hvdXJzJywgMSwgLTEyKSwKKyAgICBtbTogZGF0ZUdldHRlcignTWludXRlcycsIDIpLAorICAgICBtOiBkYXRlR2V0dGVyKCdNaW51dGVzJywgMSksCisgICAgc3M6IGRhdGVHZXR0ZXIoJ1NlY29uZHMnLCAyKSwKKyAgICAgczogZGF0ZUdldHRlcignU2Vjb25kcycsIDEpLAorICAgICAvLyB3aGlsZSBJU08gODYwMSByZXF1aXJlcyBmcmFjdGlvbnMgdG8gYmUgcHJlZml4ZWQgd2l0aCBgLmAgb3IgYCxgCisgICAgIC8vIHdlIGNhbiBiZSBqdXN0IHNhZmVseSByZWx5IG9uIHVzaW5nIGBzc3NgIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IHNpbmdsZSBvciB0d28gZGlnaXQgZnJhY3Rpb25zCisgICBzc3M6IGRhdGVHZXR0ZXIoJ01pbGxpc2Vjb25kcycsIDMpLAorICBFRUVFOiBkYXRlU3RyR2V0dGVyKCdEYXknKSwKKyAgIEVFRTogZGF0ZVN0ckdldHRlcignRGF5JywgdHJ1ZSksCisgICAgIGE6IGFtcG1HZXR0ZXIsCisgICAgIFo6IHRpbWVab25lR2V0dGVyLAorICAgIHd3OiB3ZWVrR2V0dGVyKDIpLAorICAgICB3OiB3ZWVrR2V0dGVyKDEpCit9OworCit2YXIgREFURV9GT1JNQVRTX1NQTElUID0gLygoPzpbXnlNZEhobXNhWkV3J10rKXwoPzonKD86W14nXXwnJykqJyl8KD86RSt8eSt8TSt8ZCt8SCt8aCt8bSt8cyt8YXxafHcrKSkoLiopLywKKyAgICBOVU1CRVJfU1RSSU5HID0gL15cLT9cZCskLzsKKworLyoqCisgKiBAbmdkb2MgZmlsdGVyCisgKiBAbmFtZSBkYXRlCisgKiBAa2luZCBmdW5jdGlvbgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogICBGb3JtYXRzIGBkYXRlYCB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIGBmb3JtYXRgLgorICoKKyAqICAgYGZvcm1hdGAgc3RyaW5nIGNhbiBiZSBjb21wb3NlZCBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOgorICoKKyAqICAgKiBgJ3l5eXknYDogNCBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB5ZWFyIChlLmcuIEFEIDEgPT4gMDAwMSwgQUQgMjAxMCA9PiAyMDEwKQorICogICAqIGAneXknYDogMiBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB5ZWFyLCBwYWRkZWQgKDAwLTk5KS4gKGUuZy4gQUQgMjAwMSA9PiAwMSwgQUQgMjAxMCA9PiAxMCkKKyAqICAgKiBgJ3knYDogMSBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB5ZWFyLCBlLmcuIChBRCAxID0+IDEsIEFEIDE5OSA9PiAxOTkpCisgKiAgICogYCdNTU1NJ2A6IE1vbnRoIGluIHllYXIgKEphbnVhcnktRGVjZW1iZXIpCisgKiAgICogYCdNTU0nYDogTW9udGggaW4geWVhciAoSmFuLURlYykKKyAqICAgKiBgJ01NJ2A6IE1vbnRoIGluIHllYXIsIHBhZGRlZCAoMDEtMTIpCisgKiAgICogYCdNJ2A6IE1vbnRoIGluIHllYXIgKDEtMTIpCisgKiAgICogYCdkZCdgOiBEYXkgaW4gbW9udGgsIHBhZGRlZCAoMDEtMzEpCisgKiAgICogYCdkJ2A6IERheSBpbiBtb250aCAoMS0zMSkKKyAqICAgKiBgJ0VFRUUnYDogRGF5IGluIFdlZWssKFN1bmRheS1TYXR1cmRheSkKKyAqICAgKiBgJ0VFRSdgOiBEYXkgaW4gV2VlaywgKFN1bi1TYXQpCisgKiAgICogYCdISCdgOiBIb3VyIGluIGRheSwgcGFkZGVkICgwMC0yMykKKyAqICAgKiBgJ0gnYDogSG91ciBpbiBkYXkgKDAtMjMpCisgKiAgICogYCdoaCdgOiBIb3VyIGluIEFNL1BNLCBwYWRkZWQgKDAxLTEyKQorICogICAqIGAnaCdgOiBIb3VyIGluIEFNL1BNLCAoMS0xMikKKyAqICAgKiBgJ21tJ2A6IE1pbnV0ZSBpbiBob3VyLCBwYWRkZWQgKDAwLTU5KQorICogICAqIGAnbSdgOiBNaW51dGUgaW4gaG91ciAoMC01OSkKKyAqICAgKiBgJ3NzJ2A6IFNlY29uZCBpbiBtaW51dGUsIHBhZGRlZCAoMDAtNTkpCisgKiAgICogYCdzJ2A6IFNlY29uZCBpbiBtaW51dGUgKDAtNTkpCisgKiAgICogYCcuc3NzJyBvciAnLHNzcydgOiBNaWxsaXNlY29uZCBpbiBzZWNvbmQsIHBhZGRlZCAoMDAwLTk5OSkKKyAqICAgKiBgJ2EnYDogQU0vUE0gbWFya2VyCisgKiAgICogYCdaJ2A6IDQgZGlnaXQgKCtzaWduKSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGltZXpvbmUgb2Zmc2V0ICgtMTIwMC0rMTIwMCkKKyAqICAgKiBgJ3d3J2A6IFdlZWsgb2YgeWVhciwgcGFkZGVkICgwMC01MykuIFdlZWsgMDEgaXMgdGhlIHdlZWsgd2l0aCB0aGUgZmlyc3QgVGh1cnNkYXkgb2YgdGhlIHllYXIKKyAqICAgKiBgJ3cnYDogV2VlayBvZiB5ZWFyICgwLTUzKS4gV2VlayAxIGlzIHRoZSB3ZWVrIHdpdGggdGhlIGZpcnN0IFRodXJzZGF5IG9mIHRoZSB5ZWFyCisgKgorICogICBgZm9ybWF0YCBzdHJpbmcgY2FuIGFsc28gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgcHJlZGVmaW5lZAorICogICB7QGxpbmsgZ3VpZGUvaTE4biBsb2NhbGl6YWJsZSBmb3JtYXRzfToKKyAqCisgKiAgICogYCdtZWRpdW0nYDogZXF1aXZhbGVudCB0byBgJ01NTSBkLCB5IGg6bW06c3MgYSdgIGZvciBlbl9VUyBsb2NhbGUKKyAqICAgICAoZS5nLiBTZXAgMywgMjAxMCAxMjowNTowOCBQTSkKKyAqICAgKiBgJ3Nob3J0J2A6IGVxdWl2YWxlbnQgdG8gYCdNL2QveXkgaDptbSBhJ2AgZm9yIGVuX1VTICBsb2NhbGUgKGUuZy4gOS8zLzEwIDEyOjA1IFBNKQorICogICAqIGAnZnVsbERhdGUnYDogZXF1aXZhbGVudCB0byBgJ0VFRUUsIE1NTU0gZCwgeSdgIGZvciBlbl9VUyAgbG9jYWxlCisgKiAgICAgKGUuZy4gRnJpZGF5LCBTZXB0ZW1iZXIgMywgMjAxMCkKKyAqICAgKiBgJ2xvbmdEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdNTU1NIGQsIHknYCBmb3IgZW5fVVMgIGxvY2FsZSAoZS5nLiBTZXB0ZW1iZXIgMywgMjAxMCkKKyAqICAgKiBgJ21lZGl1bURhdGUnYDogZXF1aXZhbGVudCB0byBgJ01NTSBkLCB5J2AgZm9yIGVuX1VTICBsb2NhbGUgKGUuZy4gU2VwIDMsIDIwMTApCisgKiAgICogYCdzaG9ydERhdGUnYDogZXF1aXZhbGVudCB0byBgJ00vZC95eSdgIGZvciBlbl9VUyBsb2NhbGUgKGUuZy4gOS8zLzEwKQorICogICAqIGAnbWVkaXVtVGltZSdgOiBlcXVpdmFsZW50IHRvIGAnaDptbTpzcyBhJ2AgZm9yIGVuX1VTIGxvY2FsZSAoZS5nLiAxMjowNTowOCBQTSkKKyAqICAgKiBgJ3Nob3J0VGltZSdgOiBlcXVpdmFsZW50IHRvIGAnaDptbSBhJ2AgZm9yIGVuX1VTIGxvY2FsZSAoZS5nLiAxMjowNSBQTSkKKyAqCisgKiAgIGBmb3JtYXRgIHN0cmluZyBjYW4gY29udGFpbiBsaXRlcmFsIHZhbHVlcy4gVGhlc2UgbmVlZCB0byBiZSBlc2NhcGVkIGJ5IHN1cnJvdW5kaW5nIHdpdGggc2luZ2xlIHF1b3RlcyAoZS5nLgorICogICBgImggJ2luIHRoZSBtb3JuaW5nJyJgKS4gSW4gb3JkZXIgdG8gb3V0cHV0IGEgc2luZ2xlIHF1b3RlLCBlc2NhcGUgaXQgLSBpLmUuLCB0d28gc2luZ2xlIHF1b3RlcyBpbiBhIHNlcXVlbmNlCisgKiAgIChlLmcuIGAiaCAnbycnY2xvY2snImApLgorICoKKyAqIEBwYXJhbSB7KERhdGV8bnVtYmVyfHN0cmluZyl9IGRhdGUgRGF0ZSB0byBmb3JtYXQgZWl0aGVyIGFzIERhdGUgb2JqZWN0LCBtaWxsaXNlY29uZHMgKHN0cmluZyBvcgorICogICAgbnVtYmVyKSBvciB2YXJpb3VzIElTTyA4NjAxIGRhdGV0aW1lIHN0cmluZyBmb3JtYXRzIChlLmcuIHl5eXktTU0tZGRUSEg6bW06c3Muc3NzWiBhbmQgaXRzCisgKiAgICBzaG9ydGVyIHZlcnNpb25zIGxpa2UgeXl5eS1NTS1kZFRISDptbVosIHl5eXktTU0tZGQgb3IgeXl5eU1NZGRUSEhtbXNzWikuIElmIG5vIHRpbWV6b25lIGlzCisgKiAgICBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpbnB1dCwgdGhlIHRpbWUgaXMgY29uc2lkZXJlZCB0byBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuCisgKiBAcGFyYW0ge3N0cmluZz19IGZvcm1hdCBGb3JtYXR0aW5nIHJ1bGVzIChzZWUgRGVzY3JpcHRpb24pLiBJZiBub3Qgc3BlY2lmaWVkLAorICogICAgYG1lZGl1bURhdGVgIGlzIHVzZWQuCisgKiBAcGFyYW0ge3N0cmluZz19IHRpbWV6b25lIFRpbWV6b25lIHRvIGJlIHVzZWQgZm9yIGZvcm1hdHRpbmcuIFJpZ2h0IG5vdywgb25seSBgJ1VUQydgIGlzIHN1cHBvcnRlZC4KKyAqICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB0aW1lem9uZSBvZiB0aGUgYnJvd3NlciB3aWxsIGJlIHVzZWQuCisgKiBAcmV0dXJucyB7c3RyaW5nfSBGb3JtYXR0ZWQgc3RyaW5nIG9yIHRoZSBpbnB1dCBpZiBpbnB1dCBpcyBub3QgcmVjb2duaXplZCBhcyBkYXRlL21pbGxpcy4KKyAqCisgKiBAZXhhbXBsZQorICAgPGV4YW1wbGU+CisgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgIDxzcGFuIG5nLW5vbi1iaW5kYWJsZT57ezEyODgzMjM2MjMwMDYgfCBkYXRlOidtZWRpdW0nfX08L3NwYW4+OgorICAgICAgICAgICA8c3Bhbj57ezEyODgzMjM2MjMwMDYgfCBkYXRlOidtZWRpdW0nfX08L3NwYW4+PGJyPgorICAgICAgIDxzcGFuIG5nLW5vbi1iaW5kYWJsZT57ezEyODgzMjM2MjMwMDYgfCBkYXRlOid5eXl5LU1NLWRkIEhIOm1tOnNzIFonfX08L3NwYW4+OgorICAgICAgICAgIDxzcGFuPnt7MTI4ODMyMzYyMzAwNiB8IGRhdGU6J3l5eXktTU0tZGQgSEg6bW06c3MgWid9fTwvc3Bhbj48YnI+CisgICAgICAgPHNwYW4gbmctbm9uLWJpbmRhYmxlPnt7MTI4ODMyMzYyMzAwNiB8IGRhdGU6J01NL2RkL3l5eXkgQCBoOm1tYSd9fTwvc3Bhbj46CisgICAgICAgICAgPHNwYW4+e3snMTI4ODMyMzYyMzAwNicgfCBkYXRlOidNTS9kZC95eXl5IEAgaDptbWEnfX08L3NwYW4+PGJyPgorICAgICAgIDxzcGFuIG5nLW5vbi1iaW5kYWJsZT57ezEyODgzMjM2MjMwMDYgfCBkYXRlOiJNTS9kZC95eXl5ICdhdCcgaDptbWEifX08L3NwYW4+OgorICAgICAgICAgIDxzcGFuPnt7JzEyODgzMjM2MjMwMDYnIHwgZGF0ZToiTU0vZGQveXl5eSAnYXQnIGg6bW1hIn19PC9zcGFuPjxicj4KKyAgICAgPC9maWxlPgorICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAgICAgICBpdCgnc2hvdWxkIGZvcm1hdCBkYXRlJywgZnVuY3Rpb24oKSB7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCIxMjg4MzIzNjIzMDA2IHwgZGF0ZTonbWVkaXVtJyIpKS5nZXRUZXh0KCkpLgorICAgICAgICAgICAgdG9NYXRjaCgvT2N0IDJcZCwgMjAxMCBcZHsxLDJ9OlxkezJ9OlxkezJ9IChBTXxQTSkvKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoIjEyODgzMjM2MjMwMDYgfCBkYXRlOid5eXl5LU1NLWRkIEhIOm1tOnNzIFonIikpLmdldFRleHQoKSkuCisgICAgICAgICAgICB0b01hdGNoKC8yMDEwXC0xMFwtMlxkIFxkezJ9OlxkezJ9OlxkezJ9IChcLXxcKyk/XGR7NH0vKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoIicxMjg4MzIzNjIzMDA2JyB8IGRhdGU6J01NL2RkL3l5eXkgQCBoOm1tYSciKSkuZ2V0VGV4dCgpKS4KKyAgICAgICAgICAgIHRvTWF0Y2goLzEwXC8yXGRcLzIwMTAgQCBcZHsxLDJ9OlxkezJ9KEFNfFBNKS8pOworICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygiJzEyODgzMjM2MjMwMDYnIHwgZGF0ZTpcIk1NL2RkL3l5eXkgJ2F0JyBoOm1tYVwiIikpLmdldFRleHQoKSkuCisgICAgICAgICAgICB0b01hdGNoKC8xMFwvMlxkXC8yMDEwIGF0IFxkezEsMn06XGR7Mn0oQU18UE0pLyk7CisgICAgICAgfSk7CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLworZGF0ZUZpbHRlci4kaW5qZWN0ID0gWyckbG9jYWxlJ107CitmdW5jdGlvbiBkYXRlRmlsdGVyKCRsb2NhbGUpIHsKKworCisgIHZhciBSX0lTTzg2MDFfU1RSID0gL14oXGR7NH0pLT8oXGRcZCktPyhcZFxkKSg/OlQoXGRcZCkoPzo6PyhcZFxkKSg/Ojo/KFxkXGQpKD86XC4oXGQrKSk/KT8pPyhafChbKy1dKShcZFxkKTo/KFxkXGQpKT8pPyQvOworICAgICAgICAgICAgICAgICAgICAgLy8gMSAgICAgICAgMiAgICAgICAzICAgICAgICAgNCAgICAgICAgICA1ICAgICAgICAgIDYgICAgICAgICAgNyAgICAgICAgICA4ICA5ICAgICAxMCAgICAgIDExCisgIGZ1bmN0aW9uIGpzb25TdHJpbmdUb0RhdGUoc3RyaW5nKSB7CisgICAgdmFyIG1hdGNoOworICAgIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChSX0lTTzg2MDFfU1RSKSkgeworICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgwKSwKKyAgICAgICAgICB0ekhvdXIgPSAwLAorICAgICAgICAgIHR6TWluICA9IDAsCisgICAgICAgICAgZGF0ZVNldHRlciA9IG1hdGNoWzhdID8gZGF0ZS5zZXRVVENGdWxsWWVhciA6IGRhdGUuc2V0RnVsbFllYXIsCisgICAgICAgICAgdGltZVNldHRlciA9IG1hdGNoWzhdID8gZGF0ZS5zZXRVVENIb3VycyA6IGRhdGUuc2V0SG91cnM7CisKKyAgICAgIGlmIChtYXRjaFs5XSkgeworICAgICAgICB0ekhvdXIgPSBpbnQobWF0Y2hbOV0gKyBtYXRjaFsxMF0pOworICAgICAgICB0ek1pbiA9IGludChtYXRjaFs5XSArIG1hdGNoWzExXSk7CisgICAgICB9CisgICAgICBkYXRlU2V0dGVyLmNhbGwoZGF0ZSwgaW50KG1hdGNoWzFdKSwgaW50KG1hdGNoWzJdKSAtIDEsIGludChtYXRjaFszXSkpOworICAgICAgdmFyIGggPSBpbnQobWF0Y2hbNF0gfHwgMCkgLSB0ekhvdXI7CisgICAgICB2YXIgbSA9IGludChtYXRjaFs1XSB8fCAwKSAtIHR6TWluOworICAgICAgdmFyIHMgPSBpbnQobWF0Y2hbNl0gfHwgMCk7CisgICAgICB2YXIgbXMgPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoJzAuJyArIChtYXRjaFs3XSB8fCAwKSkgKiAxMDAwKTsKKyAgICAgIHRpbWVTZXR0ZXIuY2FsbChkYXRlLCBoLCBtLCBzLCBtcyk7CisgICAgICByZXR1cm4gZGF0ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmluZzsKKyAgfQorCisKKyAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUsIGZvcm1hdCwgdGltZXpvbmUpIHsKKyAgICB2YXIgdGV4dCA9ICcnLAorICAgICAgICBwYXJ0cyA9IFtdLAorICAgICAgICBmbiwgbWF0Y2g7CisKKyAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJ21lZGl1bURhdGUnOworICAgIGZvcm1hdCA9ICRsb2NhbGUuREFURVRJTUVfRk9STUFUU1tmb3JtYXRdIHx8IGZvcm1hdDsKKyAgICBpZiAoaXNTdHJpbmcoZGF0ZSkpIHsKKyAgICAgIGRhdGUgPSBOVU1CRVJfU1RSSU5HLnRlc3QoZGF0ZSkgPyBpbnQoZGF0ZSkgOiBqc29uU3RyaW5nVG9EYXRlKGRhdGUpOworICAgIH0KKworICAgIGlmIChpc051bWJlcihkYXRlKSkgeworICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUpOworICAgIH0KKworICAgIGlmICghaXNEYXRlKGRhdGUpKSB7CisgICAgICByZXR1cm4gZGF0ZTsKKyAgICB9CisKKyAgICB3aGlsZSAoZm9ybWF0KSB7CisgICAgICBtYXRjaCA9IERBVEVfRk9STUFUU19TUExJVC5leGVjKGZvcm1hdCk7CisgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgcGFydHMgPSBjb25jYXQocGFydHMsIG1hdGNoLCAxKTsKKyAgICAgICAgZm9ybWF0ID0gcGFydHMucG9wKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJ0cy5wdXNoKGZvcm1hdCk7CisgICAgICAgIGZvcm1hdCA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHRpbWV6b25lICYmIHRpbWV6b25lID09PSAnVVRDJykgeworICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTsKKyAgICAgIGRhdGUuc2V0TWludXRlcyhkYXRlLmdldE1pbnV0ZXMoKSArIGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSk7CisgICAgfQorICAgIGZvckVhY2gocGFydHMsIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICBmbiA9IERBVEVfRk9STUFUU1t2YWx1ZV07CisgICAgICB0ZXh0ICs9IGZuID8gZm4oZGF0ZSwgJGxvY2FsZS5EQVRFVElNRV9GT1JNQVRTKQorICAgICAgICAgICAgICAgICA6IHZhbHVlLnJlcGxhY2UoLyheJ3wnJCkvZywgJycpLnJlcGxhY2UoLycnL2csICInIik7CisgICAgfSk7CisKKyAgICByZXR1cm4gdGV4dDsKKyAgfTsKK30KKworCisvKioKKyAqIEBuZ2RvYyBmaWx0ZXIKKyAqIEBuYW1lIGpzb24KKyAqIEBraW5kIGZ1bmN0aW9uCisgKgorICogQGRlc2NyaXB0aW9uCisgKiAgIEFsbG93cyB5b3UgdG8gY29udmVydCBhIEphdmFTY3JpcHQgb2JqZWN0IGludG8gSlNPTiBzdHJpbmcuCisgKgorICogICBUaGlzIGZpbHRlciBpcyBtb3N0bHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuIFdoZW4gdXNpbmcgdGhlIGRvdWJsZSBjdXJseSB7e3ZhbHVlfX0gbm90YXRpb24KKyAqICAgdGhlIGJpbmRpbmcgaXMgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gSlNPTi4KKyAqCisgKiBAcGFyYW0geyp9IG9iamVjdCBBbnkgSmF2YVNjcmlwdCBvYmplY3QgKGluY2x1ZGluZyBhcnJheXMgYW5kIHByaW1pdGl2ZSB0eXBlcykgdG8gZmlsdGVyLgorICogQHBhcmFtIHtudW1iZXI9fSBzcGFjaW5nIFRoZSBudW1iZXIgb2Ygc3BhY2VzIHRvIHVzZSBwZXIgaW5kZW50YXRpb24sIGRlZmF1bHRzIHRvIDIuCisgKiBAcmV0dXJucyB7c3RyaW5nfSBKU09OIHN0cmluZy4KKyAqCisgKgorICogQGV4YW1wbGUKKyAgIDxleGFtcGxlPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8cHJlIGlkPSJkZWZhdWx0LXNwYWNpbmciPnt7IHsnbmFtZSc6J3ZhbHVlJ30gfCBqc29uIH19PC9wcmU+CisgICAgICAgPHByZSBpZD0iY3VzdG9tLXNwYWNpbmciPnt7IHsnbmFtZSc6J3ZhbHVlJ30gfCBqc29uOjQgfX08L3ByZT4KKyAgICAgPC9maWxlPgorICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAgICAgICBpdCgnc2hvdWxkIGpzb25pZnkgZmlsdGVyZWQgb2JqZWN0cycsIGZ1bmN0aW9uKCkgeworICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2RlZmF1bHQtc3BhY2luZycpKS5nZXRUZXh0KCkpLnRvTWF0Y2goL1x7XG4gICJuYW1lIjogPyJ2YWx1ZSJcbn0vKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjdXN0b20tc3BhY2luZycpKS5nZXRUZXh0KCkpLnRvTWF0Y2goL1x7XG4gICAgIm5hbWUiOiA/InZhbHVlIlxufS8pOworICAgICAgIH0pOworICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisgKgorICovCitmdW5jdGlvbiBqc29uRmlsdGVyKCkgeworICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBzcGFjaW5nKSB7CisgICAgaWYgKGlzVW5kZWZpbmVkKHNwYWNpbmcpKSB7CisgICAgICAgIHNwYWNpbmcgPSAyOworICAgIH0KKyAgICByZXR1cm4gdG9Kc29uKG9iamVjdCwgc3BhY2luZyk7CisgIH07Cit9CisKKworLyoqCisgKiBAbmdkb2MgZmlsdGVyCisgKiBAbmFtZSBsb3dlcmNhc2UKKyAqIEBraW5kIGZ1bmN0aW9uCisgKiBAZGVzY3JpcHRpb24KKyAqIENvbnZlcnRzIHN0cmluZyB0byBsb3dlcmNhc2UuCisgKiBAc2VlIGFuZ3VsYXIubG93ZXJjYXNlCisgKi8KK3ZhciBsb3dlcmNhc2VGaWx0ZXIgPSB2YWx1ZUZuKGxvd2VyY2FzZSk7CisKKworLyoqCisgKiBAbmdkb2MgZmlsdGVyCisgKiBAbmFtZSB1cHBlcmNhc2UKKyAqIEBraW5kIGZ1bmN0aW9uCisgKiBAZGVzY3JpcHRpb24KKyAqIENvbnZlcnRzIHN0cmluZyB0byB1cHBlcmNhc2UuCisgKiBAc2VlIGFuZ3VsYXIudXBwZXJjYXNlCisgKi8KK3ZhciB1cHBlcmNhc2VGaWx0ZXIgPSB2YWx1ZUZuKHVwcGVyY2FzZSk7CisKKy8qKgorICogQG5nZG9jIGZpbHRlcgorICogQG5hbWUgbGltaXRUbworICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgb3Igc3RyaW5nIGNvbnRhaW5pbmcgb25seSBhIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuIFRoZSBlbGVtZW50cworICogYXJlIHRha2VuIGZyb20gZWl0aGVyIHRoZSBiZWdpbm5pbmcgb3IgdGhlIGVuZCBvZiB0aGUgc291cmNlIGFycmF5LCBzdHJpbmcgb3IgbnVtYmVyLCBhcyBzcGVjaWZpZWQgYnkKKyAqIHRoZSB2YWx1ZSBhbmQgc2lnbiAocG9zaXRpdmUgb3IgbmVnYXRpdmUpIG9mIGBsaW1pdGAuIElmIGEgbnVtYmVyIGlzIHVzZWQgYXMgaW5wdXQsIGl0IGlzCisgKiBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcuCisgKgorICogQHBhcmFtIHtBcnJheXxzdHJpbmd8bnVtYmVyfSBpbnB1dCBTb3VyY2UgYXJyYXksIHN0cmluZyBvciBudW1iZXIgdG8gYmUgbGltaXRlZC4KKyAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGltaXQgVGhlIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgb3Igc3RyaW5nLiBJZiB0aGUgYGxpbWl0YCBudW1iZXIKKyAqICAgICBpcyBwb3NpdGl2ZSwgYGxpbWl0YCBudW1iZXIgb2YgaXRlbXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzb3VyY2UgYXJyYXkvc3RyaW5nIGFyZSBjb3BpZWQuCisgKiAgICAgSWYgdGhlIG51bWJlciBpcyBuZWdhdGl2ZSwgYGxpbWl0YCBudW1iZXIgIG9mIGl0ZW1zIGZyb20gdGhlIGVuZCBvZiB0aGUgc291cmNlIGFycmF5L3N0cmluZworICogICAgIGFyZSBjb3BpZWQuIFRoZSBgbGltaXRgIHdpbGwgYmUgdHJpbW1lZCBpZiBpdCBleGNlZWRzIGBhcnJheS5sZW5ndGhgCisgKiBAcmV0dXJucyB7QXJyYXl8c3RyaW5nfSBBIG5ldyBzdWItYXJyYXkgb3Igc3Vic3RyaW5nIG9mIGxlbmd0aCBgbGltaXRgIG9yIGxlc3MgaWYgaW5wdXQgYXJyYXkKKyAqICAgICBoYWQgbGVzcyB0aGFuIGBsaW1pdGAgZWxlbWVudHMuCisgKgorICogQGV4YW1wbGUKKyAgIDxleGFtcGxlIG1vZHVsZT0ibGltaXRUb0V4YW1wbGUiPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8c2NyaXB0PgorICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2xpbWl0VG9FeGFtcGxlJywgW10pCisgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgICAgICAgJHNjb3BlLm51bWJlcnMgPSBbMSwyLDMsNCw1LDYsNyw4LDldOworICAgICAgICAgICAgICRzY29wZS5sZXR0ZXJzID0gImFiY2RlZmdoaSI7CisgICAgICAgICAgICAgJHNjb3BlLmxvbmdOdW1iZXIgPSAyMzQ1NDMyMzQyOworICAgICAgICAgICAgICRzY29wZS5udW1MaW1pdCA9IDM7CisgICAgICAgICAgICAgJHNjb3BlLmxldHRlckxpbWl0ID0gMzsKKyAgICAgICAgICAgICAkc2NvcGUubG9uZ051bWJlckxpbWl0ID0gMzsKKyAgICAgICAgICAgfV0pOworICAgICAgIDwvc2NyaXB0PgorICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgICAgTGltaXQge3tudW1iZXJzfX0gdG86IDxpbnB1dCB0eXBlPSJudW1iZXIiIHN0ZXA9IjEiIG5nLW1vZGVsPSJudW1MaW1pdCI+CisgICAgICAgICA8cD5PdXRwdXQgbnVtYmVyczoge3sgbnVtYmVycyB8IGxpbWl0VG86bnVtTGltaXQgfX08L3A+CisgICAgICAgICBMaW1pdCB7e2xldHRlcnN9fSB0bzogPGlucHV0IHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbmctbW9kZWw9ImxldHRlckxpbWl0Ij4KKyAgICAgICAgIDxwPk91dHB1dCBsZXR0ZXJzOiB7eyBsZXR0ZXJzIHwgbGltaXRUbzpsZXR0ZXJMaW1pdCB9fTwvcD4KKyAgICAgICAgIExpbWl0IHt7bG9uZ051bWJlcn19IHRvOiA8aW5wdXQgdHlwZT0ibnVtYmVyIiBzdGVwPSIxIiBuZy1tb2RlbD0ibG9uZ051bWJlckxpbWl0Ij4KKyAgICAgICAgIDxwPk91dHB1dCBsb25nIG51bWJlcjoge3sgbG9uZ051bWJlciB8IGxpbWl0VG86bG9uZ051bWJlckxpbWl0IH19PC9wPgorICAgICAgIDwvZGl2PgorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIHZhciBudW1MaW1pdElucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbnVtTGltaXQnKSk7CisgICAgICAgdmFyIGxldHRlckxpbWl0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdsZXR0ZXJMaW1pdCcpKTsKKyAgICAgICB2YXIgbG9uZ051bWJlckxpbWl0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdsb25nTnVtYmVyTGltaXQnKSk7CisgICAgICAgdmFyIGxpbWl0ZWROdW1iZXJzID0gZWxlbWVudChieS5iaW5kaW5nKCdudW1iZXJzIHwgbGltaXRUbzpudW1MaW1pdCcpKTsKKyAgICAgICB2YXIgbGltaXRlZExldHRlcnMgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2xldHRlcnMgfCBsaW1pdFRvOmxldHRlckxpbWl0JykpOworICAgICAgIHZhciBsaW1pdGVkTG9uZ051bWJlciA9IGVsZW1lbnQoYnkuYmluZGluZygnbG9uZ051bWJlciB8IGxpbWl0VG86bG9uZ051bWJlckxpbWl0JykpOworCisgICAgICAgaXQoJ3Nob3VsZCBsaW1pdCB0aGUgbnVtYmVyIGFycmF5IHRvIGZpcnN0IHRocmVlIGl0ZW1zJywgZnVuY3Rpb24oKSB7CisgICAgICAgICBleHBlY3QobnVtTGltaXRJbnB1dC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvQmUoJzMnKTsKKyAgICAgICAgIGV4cGVjdChsZXR0ZXJMaW1pdElucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9CZSgnMycpOworICAgICAgICAgZXhwZWN0KGxvbmdOdW1iZXJMaW1pdElucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9CZSgnMycpOworICAgICAgICAgZXhwZWN0KGxpbWl0ZWROdW1iZXJzLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IG51bWJlcnM6IFsxLDIsM10nKTsKKyAgICAgICAgIGV4cGVjdChsaW1pdGVkTGV0dGVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsZXR0ZXJzOiBhYmMnKTsKKyAgICAgICAgIGV4cGVjdChsaW1pdGVkTG9uZ051bWJlci5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsb25nIG51bWJlcjogMjM0Jyk7CisgICAgICAgfSk7CisKKyAgICAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBzYWZhcmkgYW5kIHByb3RyYWN0b3IgdGhhdCBkb2Vzbid0IGxpa2UgdGhlIG1pbnVzIGtleQorICAgICAgIC8vIGl0KCdzaG91bGQgdXBkYXRlIHRoZSBvdXRwdXQgd2hlbiAtMyBpcyBlbnRlcmVkJywgZnVuY3Rpb24oKSB7CisgICAgICAgLy8gICBudW1MaW1pdElucHV0LmNsZWFyKCk7CisgICAgICAgLy8gICBudW1MaW1pdElucHV0LnNlbmRLZXlzKCctMycpOworICAgICAgIC8vICAgbGV0dGVyTGltaXRJbnB1dC5jbGVhcigpOworICAgICAgIC8vICAgbGV0dGVyTGltaXRJbnB1dC5zZW5kS2V5cygnLTMnKTsKKyAgICAgICAvLyAgIGxvbmdOdW1iZXJMaW1pdElucHV0LmNsZWFyKCk7CisgICAgICAgLy8gICBsb25nTnVtYmVyTGltaXRJbnB1dC5zZW5kS2V5cygnLTMnKTsKKyAgICAgICAvLyAgIGV4cGVjdChsaW1pdGVkTnVtYmVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBudW1iZXJzOiBbNyw4LDldJyk7CisgICAgICAgLy8gICBleHBlY3QobGltaXRlZExldHRlcnMuZ2V0VGV4dCgpKS50b0VxdWFsKCdPdXRwdXQgbGV0dGVyczogZ2hpJyk7CisgICAgICAgLy8gICBleHBlY3QobGltaXRlZExvbmdOdW1iZXIuZ2V0VGV4dCgpKS50b0VxdWFsKCdPdXRwdXQgbG9uZyBudW1iZXI6IDM0MicpOworICAgICAgIC8vIH0pOworCisgICAgICAgaXQoJ3Nob3VsZCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIHNpemUgb2YgaW5wdXQgYXJyYXknLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIG51bUxpbWl0SW5wdXQuY2xlYXIoKTsKKyAgICAgICAgIG51bUxpbWl0SW5wdXQuc2VuZEtleXMoJzEwMCcpOworICAgICAgICAgbGV0dGVyTGltaXRJbnB1dC5jbGVhcigpOworICAgICAgICAgbGV0dGVyTGltaXRJbnB1dC5zZW5kS2V5cygnMTAwJyk7CisgICAgICAgICBsb25nTnVtYmVyTGltaXRJbnB1dC5jbGVhcigpOworICAgICAgICAgbG9uZ051bWJlckxpbWl0SW5wdXQuc2VuZEtleXMoJzEwMCcpOworICAgICAgICAgZXhwZWN0KGxpbWl0ZWROdW1iZXJzLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IG51bWJlcnM6IFsxLDIsMyw0LDUsNiw3LDgsOV0nKTsKKyAgICAgICAgIGV4cGVjdChsaW1pdGVkTGV0dGVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsZXR0ZXJzOiBhYmNkZWZnaGknKTsKKyAgICAgICAgIGV4cGVjdChsaW1pdGVkTG9uZ051bWJlci5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsb25nIG51bWJlcjogMjM0NTQzMjM0MicpOworICAgICAgIH0pOworICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisqLworZnVuY3Rpb24gbGltaXRUb0ZpbHRlcigpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBsaW1pdCkgeworICAgIGlmIChpc051bWJlcihpbnB1dCkpIGlucHV0ID0gaW5wdXQudG9TdHJpbmcoKTsKKyAgICBpZiAoIWlzQXJyYXkoaW5wdXQpICYmICFpc1N0cmluZyhpbnB1dCkpIHJldHVybiBpbnB1dDsKKworICAgIGlmIChNYXRoLmFicyhOdW1iZXIobGltaXQpKSA9PT0gSW5maW5pdHkpIHsKKyAgICAgIGxpbWl0ID0gTnVtYmVyKGxpbWl0KTsKKyAgICB9IGVsc2UgeworICAgICAgbGltaXQgPSBpbnQobGltaXQpOworICAgIH0KKworICAgIGlmIChpc1N0cmluZyhpbnB1dCkpIHsKKyAgICAgIC8vTmFOIGNoZWNrIG9uIGxpbWl0CisgICAgICBpZiAobGltaXQpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0ID49IDAgPyBpbnB1dC5zbGljZSgwLCBsaW1pdCkgOiBpbnB1dC5zbGljZShsaW1pdCwgaW5wdXQubGVuZ3RoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgaSwgbjsKKworICAgIC8vIGlmIGFicyhsaW1pdCkgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCwgdHJpbSBpdAorICAgIGlmIChsaW1pdCA+IGlucHV0Lmxlbmd0aCkKKyAgICAgIGxpbWl0ID0gaW5wdXQubGVuZ3RoOworICAgIGVsc2UgaWYgKGxpbWl0IDwgLWlucHV0Lmxlbmd0aCkKKyAgICAgIGxpbWl0ID0gLWlucHV0Lmxlbmd0aDsKKworICAgIGlmIChsaW1pdCA+IDApIHsKKyAgICAgIGkgPSAwOworICAgICAgbiA9IGxpbWl0OworICAgIH0gZWxzZSB7CisgICAgICAvLyB6ZXJvIGFuZCBOYU4gY2hlY2sgb24gbGltaXQgLSByZXR1cm4gZW1wdHkgYXJyYXkKKyAgICAgIGlmICghbGltaXQpIHJldHVybiBbXTsKKworICAgICAgaSA9IGlucHV0Lmxlbmd0aCArIGxpbWl0OworICAgICAgbiA9IGlucHV0Lmxlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gaW5wdXQuc2xpY2UoaSwgbik7CisgIH07Cit9CisKKy8qKgorICogQG5nZG9jIGZpbHRlcgorICogQG5hbWUgb3JkZXJCeQorICogQGtpbmQgZnVuY3Rpb24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIE9yZGVycyBhIHNwZWNpZmllZCBgYXJyYXlgIGJ5IHRoZSBgZXhwcmVzc2lvbmAgcHJlZGljYXRlLiBJdCBpcyBvcmRlcmVkIGFscGhhYmV0aWNhbGx5CisgKiBmb3Igc3RyaW5ncyBhbmQgbnVtZXJpY2FsbHkgZm9yIG51bWJlcnMuIE5vdGU6IGlmIHlvdSBub3RpY2UgbnVtYmVycyBhcmUgbm90IGJlaW5nIHNvcnRlZAorICogY29ycmVjdGx5LCBtYWtlIHN1cmUgdGhleSBhcmUgYWN0dWFsbHkgYmVpbmcgc2F2ZWQgYXMgbnVtYmVycyBhbmQgbm90IHN0cmluZ3MuCisgKgorICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNvcnQuCisgKiBAcGFyYW0ge2Z1bmN0aW9uKCopfHN0cmluZ3xBcnJheS48KGZ1bmN0aW9uKCopfHN0cmluZyk+PX0gZXhwcmVzc2lvbiBBIHByZWRpY2F0ZSB0byBiZQorICogICAgdXNlZCBieSB0aGUgY29tcGFyYXRvciB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIG9mIGVsZW1lbnRzLgorICoKKyAqICAgIENhbiBiZSBvbmUgb2Y6CisgKgorICogICAgLSBgZnVuY3Rpb25gOiBHZXR0ZXIgZnVuY3Rpb24uIFRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHNvcnRlZCB1c2luZyB0aGUKKyAqICAgICAgYDxgLCBgPWAsIGA+YCBvcGVyYXRvci4KKyAqICAgIC0gYHN0cmluZ2A6IEFuIEFuZ3VsYXIgZXhwcmVzc2lvbi4gVGhlIHJlc3VsdCBvZiB0aGlzIGV4cHJlc3Npb24gaXMgdXNlZCB0byBjb21wYXJlIGVsZW1lbnRzCisgKiAgICAgIChmb3IgZXhhbXBsZSBgbmFtZWAgdG8gc29ydCBieSBhIHByb3BlcnR5IGNhbGxlZCBgbmFtZWAgb3IgYG5hbWUuc3Vic3RyKDAsIDMpYCB0byBzb3J0IGJ5CisgKiAgICAgIDMgZmlyc3QgY2hhcmFjdGVycyBvZiBhIHByb3BlcnR5IGNhbGxlZCBgbmFtZWApLiBUaGUgcmVzdWx0IG9mIGEgY29uc3RhbnQgZXhwcmVzc2lvbgorICogICAgICBpcyBpbnRlcnByZXRlZCBhcyBhIHByb3BlcnR5IG5hbWUgdG8gYmUgdXNlZCBpbiBjb21wYXJpc29ucyAoZm9yIGV4YW1wbGUgYCJzcGVjaWFsIG5hbWUiYAorICogICAgICB0byBzb3J0IG9iamVjdCBieSB0aGUgdmFsdWUgb2YgdGhlaXIgYHNwZWNpYWwgbmFtZWAgcHJvcGVydHkpLiBBbiBleHByZXNzaW9uIGNhbiBiZQorICogICAgICBvcHRpb25hbGx5IHByZWZpeGVkIHdpdGggYCtgIG9yIGAtYCB0byBjb250cm9sIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIHNvcnQgb3JkZXIKKyAqICAgICAgKGZvciBleGFtcGxlLCBgK25hbWVgIG9yIGAtbmFtZWApLiBJZiBubyBwcm9wZXJ0eSBpcyBwcm92aWRlZCwgKGUuZy4gYCcrJ2ApIHRoZW4gdGhlIGFycmF5CisgKiAgICAgIGVsZW1lbnQgaXRzZWxmIGlzIHVzZWQgdG8gY29tcGFyZSB3aGVyZSBzb3J0aW5nLgorICogICAgLSBgQXJyYXlgOiBBbiBhcnJheSBvZiBmdW5jdGlvbiBvciBzdHJpbmcgcHJlZGljYXRlcy4gVGhlIGZpcnN0IHByZWRpY2F0ZSBpbiB0aGUgYXJyYXkKKyAqICAgICAgaXMgdXNlZCBmb3Igc29ydGluZywgYnV0IHdoZW4gdHdvIGl0ZW1zIGFyZSBlcXVpdmFsZW50LCB0aGUgbmV4dCBwcmVkaWNhdGUgaXMgdXNlZC4KKyAqCisgKiAgICBJZiB0aGUgcHJlZGljYXRlIGlzIG1pc3Npbmcgb3IgZW1wdHkgdGhlbiBpdCBkZWZhdWx0cyB0byBgJysnYC4KKyAqCisgKiBAcGFyYW0ge2Jvb2xlYW49fSByZXZlcnNlIFJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBhcnJheS4KKyAqIEByZXR1cm5zIHtBcnJheX0gU29ydGVkIGNvcHkgb2YgdGhlIHNvdXJjZSBhcnJheS4KKyAqCisgKiBAZXhhbXBsZQorICAgPGV4YW1wbGUgbW9kdWxlPSJvcmRlckJ5RXhhbXBsZSI+CisgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgIDxzY3JpcHQ+CisgICAgICAgICBhbmd1bGFyLm1vZHVsZSgnb3JkZXJCeUV4YW1wbGUnLCBbXSkKKyAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAgICAgICAgICAgICAkc2NvcGUuZnJpZW5kcyA9CisgICAgICAgICAgICAgICAgIFt7bmFtZTonSm9obicsIHBob25lOic1NTUtMTIxMicsIGFnZToxMH0sCisgICAgICAgICAgICAgICAgICB7bmFtZTonTWFyeScsIHBob25lOic1NTUtOTg3NicsIGFnZToxOX0sCisgICAgICAgICAgICAgICAgICB7bmFtZTonTWlrZScsIHBob25lOic1NTUtNDMyMScsIGFnZToyMX0sCisgICAgICAgICAgICAgICAgICB7bmFtZTonQWRhbScsIHBob25lOic1NTUtNTY3OCcsIGFnZTozNX0sCisgICAgICAgICAgICAgICAgICB7bmFtZTonSnVsaWUnLCBwaG9uZTonNTU1LTg3NjUnLCBhZ2U6Mjl9XTsKKyAgICAgICAgICAgICAkc2NvcGUucHJlZGljYXRlID0gJy1hZ2UnOworICAgICAgICAgICB9XSk7CisgICAgICAgPC9zY3JpcHQ+CisgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgICAgICAgICA8cHJlPlNvcnRpbmcgcHJlZGljYXRlID0ge3twcmVkaWNhdGV9fTsgcmV2ZXJzZSA9IHt7cmV2ZXJzZX19PC9wcmU+CisgICAgICAgICA8aHIvPgorICAgICAgICAgWyA8YSBocmVmPSIiIG5nLWNsaWNrPSJwcmVkaWNhdGU9JyciPnVuc29ydGVkPC9hPiBdCisgICAgICAgICA8dGFibGUgY2xhc3M9ImZyaWVuZCI+CisgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICA8dGg+PGEgaHJlZj0iIiBuZy1jbGljaz0icHJlZGljYXRlID0gJ25hbWUnOyByZXZlcnNlPWZhbHNlIj5OYW1lPC9hPgorICAgICAgICAgICAgICAgICAoPGEgaHJlZj0iIiBuZy1jbGljaz0icHJlZGljYXRlID0gJy1uYW1lJzsgcmV2ZXJzZT1mYWxzZSI+XjwvYT4pPC90aD4KKyAgICAgICAgICAgICA8dGg+PGEgaHJlZj0iIiBuZy1jbGljaz0icHJlZGljYXRlID0gJ3Bob25lJzsgcmV2ZXJzZT0hcmV2ZXJzZSI+UGhvbmUgTnVtYmVyPC9hPjwvdGg+CisgICAgICAgICAgICAgPHRoPjxhIGhyZWY9IiIgbmctY2xpY2s9InByZWRpY2F0ZSA9ICdhZ2UnOyByZXZlcnNlPSFyZXZlcnNlIj5BZ2U8L2E+PC90aD4KKyAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgPHRyIG5nLXJlcGVhdD0iZnJpZW5kIGluIGZyaWVuZHMgfCBvcmRlckJ5OnByZWRpY2F0ZTpyZXZlcnNlIj4KKyAgICAgICAgICAgICA8dGQ+e3tmcmllbmQubmFtZX19PC90ZD4KKyAgICAgICAgICAgICA8dGQ+e3tmcmllbmQucGhvbmV9fTwvdGQ+CisgICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLmFnZX19PC90ZD4KKyAgICAgICAgICAgPC90cj4KKyAgICAgICAgIDwvdGFibGU+CisgICAgICAgPC9kaXY+CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqCisgKiBJdCdzIGFsc28gcG9zc2libGUgdG8gY2FsbCB0aGUgb3JkZXJCeSBmaWx0ZXIgbWFudWFsbHksIGJ5IGluamVjdGluZyBgJGZpbHRlcmAsIHJldHJpZXZpbmcgdGhlCisgKiBmaWx0ZXIgcm91dGluZSB3aXRoIGAkZmlsdGVyKCdvcmRlckJ5JylgLCBhbmQgY2FsbGluZyB0aGUgcmV0dXJuZWQgZmlsdGVyIHJvdXRpbmUgd2l0aCB0aGUKKyAqIGRlc2lyZWQgcGFyYW1ldGVycy4KKyAqCisgKiBFeGFtcGxlOgorICoKKyAqIEBleGFtcGxlCisgIDxleGFtcGxlIG1vZHVsZT0ib3JkZXJCeUV4YW1wbGUiPgorICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZnJpZW5kIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+PGEgaHJlZj0iIiBuZy1jbGljaz0icmV2ZXJzZT1mYWxzZTtvcmRlcignbmFtZScsIGZhbHNlKSI+TmFtZTwvYT4KKyAgICAgICAgICAgICAgKDxhIGhyZWY9IiIgbmctY2xpY2s9Im9yZGVyKCctbmFtZScsZmFsc2UpIj5ePC9hPik8L3RoPgorICAgICAgICAgICAgPHRoPjxhIGhyZWY9IiIgbmctY2xpY2s9InJldmVyc2U9IXJldmVyc2U7b3JkZXIoJ3Bob25lJywgcmV2ZXJzZSkiPlBob25lIE51bWJlcjwvYT48L3RoPgorICAgICAgICAgICAgPHRoPjxhIGhyZWY9IiIgbmctY2xpY2s9InJldmVyc2U9IXJldmVyc2U7b3JkZXIoJ2FnZScscmV2ZXJzZSkiPkFnZTwvYT48L3RoPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyIG5nLXJlcGVhdD0iZnJpZW5kIGluIGZyaWVuZHMiPgorICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLm5hbWV9fTwvdGQ+CisgICAgICAgICAgICA8dGQ+e3tmcmllbmQucGhvbmV9fTwvdGQ+CisgICAgICAgICAgICA8dGQ+e3tmcmllbmQuYWdlfX08L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKyAgICA8L2ZpbGU+CisKKyAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgorICAgICAgYW5ndWxhci5tb2R1bGUoJ29yZGVyQnlFeGFtcGxlJywgW10pCisgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRmaWx0ZXInLCBmdW5jdGlvbigkc2NvcGUsICRmaWx0ZXIpIHsKKyAgICAgICAgICB2YXIgb3JkZXJCeSA9ICRmaWx0ZXIoJ29yZGVyQnknKTsKKyAgICAgICAgICAkc2NvcGUuZnJpZW5kcyA9IFsKKyAgICAgICAgICAgIHsgbmFtZTogJ0pvaG4nLCAgICBwaG9uZTogJzU1NS0xMjEyJywgICAgYWdlOiAxMCB9LAorICAgICAgICAgICAgeyBuYW1lOiAnTWFyeScsICAgIHBob25lOiAnNTU1LTk4NzYnLCAgICBhZ2U6IDE5IH0sCisgICAgICAgICAgICB7IG5hbWU6ICdNaWtlJywgICAgcGhvbmU6ICc1NTUtNDMyMScsICAgIGFnZTogMjEgfSwKKyAgICAgICAgICAgIHsgbmFtZTogJ0FkYW0nLCAgICBwaG9uZTogJzU1NS01Njc4JywgICAgYWdlOiAzNSB9LAorICAgICAgICAgICAgeyBuYW1lOiAnSnVsaWUnLCAgIHBob25lOiAnNTU1LTg3NjUnLCAgICBhZ2U6IDI5IH0KKyAgICAgICAgICBdOworICAgICAgICAgICRzY29wZS5vcmRlciA9IGZ1bmN0aW9uKHByZWRpY2F0ZSwgcmV2ZXJzZSkgeworICAgICAgICAgICAgJHNjb3BlLmZyaWVuZHMgPSBvcmRlckJ5KCRzY29wZS5mcmllbmRzLCBwcmVkaWNhdGUsIHJldmVyc2UpOworICAgICAgICAgIH07CisgICAgICAgICAgJHNjb3BlLm9yZGVyKCctYWdlJyxmYWxzZSk7CisgICAgICAgIH1dKTsKKyAgICA8L2ZpbGU+Cis8L2V4YW1wbGU+CisgKi8KK29yZGVyQnlGaWx0ZXIuJGluamVjdCA9IFsnJHBhcnNlJ107CitmdW5jdGlvbiBvcmRlckJ5RmlsdGVyKCRwYXJzZSkgeworICByZXR1cm4gZnVuY3Rpb24oYXJyYXksIHNvcnRQcmVkaWNhdGUsIHJldmVyc2VPcmRlcikgeworICAgIGlmICghKGlzQXJyYXlMaWtlKGFycmF5KSkpIHJldHVybiBhcnJheTsKKyAgICBzb3J0UHJlZGljYXRlID0gaXNBcnJheShzb3J0UHJlZGljYXRlKSA/IHNvcnRQcmVkaWNhdGUgOiBbc29ydFByZWRpY2F0ZV07CisgICAgaWYgKHNvcnRQcmVkaWNhdGUubGVuZ3RoID09PSAwKSB7IHNvcnRQcmVkaWNhdGUgPSBbJysnXTsgfQorICAgIHNvcnRQcmVkaWNhdGUgPSBzb3J0UHJlZGljYXRlLm1hcChmdW5jdGlvbihwcmVkaWNhdGUpIHsKKyAgICAgIHZhciBkZXNjZW5kaW5nID0gZmFsc2UsIGdldCA9IHByZWRpY2F0ZSB8fCBpZGVudGl0eTsKKyAgICAgIGlmIChpc1N0cmluZyhwcmVkaWNhdGUpKSB7CisgICAgICAgIGlmICgocHJlZGljYXRlLmNoYXJBdCgwKSA9PSAnKycgfHwgcHJlZGljYXRlLmNoYXJBdCgwKSA9PSAnLScpKSB7CisgICAgICAgICAgZGVzY2VuZGluZyA9IHByZWRpY2F0ZS5jaGFyQXQoMCkgPT0gJy0nOworICAgICAgICAgIHByZWRpY2F0ZSA9IHByZWRpY2F0ZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZWRpY2F0ZSA9PT0gJycpIHsKKyAgICAgICAgICAvLyBFZmZlY3RpdmVseSBubyBwcmVkaWNhdGUgd2FzIHBhc3NlZCBzbyB3ZSBjb21wYXJlIGlkZW50aXR5CisgICAgICAgICAgcmV0dXJuIHJldmVyc2VDb21wYXJhdG9yKGNvbXBhcmUsIGRlc2NlbmRpbmcpOworICAgICAgICB9CisgICAgICAgIGdldCA9ICRwYXJzZShwcmVkaWNhdGUpOworICAgICAgICBpZiAoZ2V0LmNvbnN0YW50KSB7CisgICAgICAgICAgdmFyIGtleSA9IGdldCgpOworICAgICAgICAgIHJldHVybiByZXZlcnNlQ29tcGFyYXRvcihmdW5jdGlvbihhLCBiKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyZShhW2tleV0sIGJba2V5XSk7CisgICAgICAgICAgfSwgZGVzY2VuZGluZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXZlcnNlQ29tcGFyYXRvcihmdW5jdGlvbihhLCBiKSB7CisgICAgICAgIHJldHVybiBjb21wYXJlKGdldChhKSxnZXQoYikpOworICAgICAgfSwgZGVzY2VuZGluZyk7CisgICAgfSk7CisgICAgcmV0dXJuIHNsaWNlLmNhbGwoYXJyYXkpLnNvcnQocmV2ZXJzZUNvbXBhcmF0b3IoY29tcGFyYXRvciwgcmV2ZXJzZU9yZGVyKSk7CisKKyAgICBmdW5jdGlvbiBjb21wYXJhdG9yKG8xLCBvMikgeworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0UHJlZGljYXRlLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciBjb21wID0gc29ydFByZWRpY2F0ZVtpXShvMSwgbzIpOworICAgICAgICBpZiAoY29tcCAhPT0gMCkgcmV0dXJuIGNvbXA7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZnVuY3Rpb24gcmV2ZXJzZUNvbXBhcmF0b3IoY29tcCwgZGVzY2VuZGluZykgeworICAgICAgcmV0dXJuIGRlc2NlbmRpbmcKKyAgICAgICAgICA/IGZ1bmN0aW9uKGEsIGIpIHtyZXR1cm4gY29tcChiLGEpO30KKyAgICAgICAgICA6IGNvbXA7CisgICAgfQorCisgICAgZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWUpIHsKKyAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CisgICAgICAgIGNhc2UgJ251bWJlcic6IC8qIGZhbGxzIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSAnYm9vbGVhbic6IC8qIGZhbGxzIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSAnc3RyaW5nJzoKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHsKKyAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICdudWxsJzsKKyAgICAgIGlmICh0eXBlb2YgdmFsdWUudmFsdWVPZiA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlT2YoKTsKKyAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkgcmV0dXJuIHZhbHVlOworICAgICAgfQorICAgICAgaWYgKHR5cGVvZiB2YWx1ZS50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykgeworICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAnJzsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjb21wYXJlKHYxLCB2MikgeworICAgICAgdmFyIHQxID0gdHlwZW9mIHYxOworICAgICAgdmFyIHQyID0gdHlwZW9mIHYyOworICAgICAgaWYgKHQxID09PSB0MiAmJiB0MSA9PT0gIm9iamVjdCIpIHsKKyAgICAgICAgdjEgPSBvYmplY3RUb1N0cmluZyh2MSk7CisgICAgICAgIHYyID0gb2JqZWN0VG9TdHJpbmcodjIpOworICAgICAgfQorICAgICAgaWYgKHQxID09PSB0MikgeworICAgICAgICBpZiAodDEgPT09ICJzdHJpbmciKSB7CisgICAgICAgICAgIHYxID0gdjEudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgdjIgPSB2Mi50b0xvd2VyQ2FzZSgpOworICAgICAgICB9CisgICAgICAgIGlmICh2MSA9PT0gdjIpIHJldHVybiAwOworICAgICAgICByZXR1cm4gdjEgPCB2MiA/IC0xIDogMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB0MSA8IHQyID8gLTEgOiAxOworICAgICAgfQorICAgIH0KKyAgfTsKK30KKworZnVuY3Rpb24gbmdEaXJlY3RpdmUoZGlyZWN0aXZlKSB7CisgIGlmIChpc0Z1bmN0aW9uKGRpcmVjdGl2ZSkpIHsKKyAgICBkaXJlY3RpdmUgPSB7CisgICAgICBsaW5rOiBkaXJlY3RpdmUKKyAgICB9OworICB9CisgIGRpcmVjdGl2ZS5yZXN0cmljdCA9IGRpcmVjdGl2ZS5yZXN0cmljdCB8fCAnQUMnOworICByZXR1cm4gdmFsdWVGbihkaXJlY3RpdmUpOworfQorCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIGEKKyAqIEByZXN0cmljdCBFCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBNb2RpZmllcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgaHRtbCBBIHRhZyBzbyB0aGF0IHRoZSBkZWZhdWx0IGFjdGlvbiBpcyBwcmV2ZW50ZWQgd2hlbgorICogdGhlIGhyZWYgYXR0cmlidXRlIGlzIGVtcHR5LgorICoKKyAqIFRoaXMgY2hhbmdlIHBlcm1pdHMgdGhlIGVhc3kgY3JlYXRpb24gb2YgYWN0aW9uIGxpbmtzIHdpdGggdGhlIGBuZ0NsaWNrYCBkaXJlY3RpdmUKKyAqIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGxvY2F0aW9uIG9yIGNhdXNpbmcgcGFnZSByZWxvYWRzLCBlLmcuOgorICogYDxhIGhyZWY9IiIgbmctY2xpY2s9Imxpc3QuYWRkSXRlbSgpIj5BZGQgSXRlbTwvYT5gCisgKi8KK3ZhciBodG1sQW5jaG9yRGlyZWN0aXZlID0gdmFsdWVGbih7CisgIHJlc3RyaWN0OiAnRScsCisgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHsKKyAgICBpZiAoIWF0dHIuaHJlZiAmJiAhYXR0ci54bGlua0hyZWYgJiYgIWF0dHIubmFtZSkgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50KSB7CisgICAgICAgIC8vIFNWR0FFbGVtZW50IGRvZXMgbm90IHVzZSB0aGUgaHJlZiBhdHRyaWJ1dGUsIGJ1dCByYXRoZXIgdGhlICd4bGlua0hyZWYnIGF0dHJpYnV0ZS4KKyAgICAgICAgdmFyIGhyZWYgPSB0b1N0cmluZy5jYWxsKGVsZW1lbnQucHJvcCgnaHJlZicpKSA9PT0gJ1tvYmplY3QgU1ZHQW5pbWF0ZWRTdHJpbmddJyA/CisgICAgICAgICAgICAgICAgICAgJ3hsaW5rOmhyZWYnIDogJ2hyZWYnOworICAgICAgICBlbGVtZW50Lm9uKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBubyBocmVmIHVybCwgdGhlbiBkb24ndCBuYXZpZ2F0ZSBhbnl3aGVyZS4KKyAgICAgICAgICBpZiAoIWVsZW1lbnQuYXR0cihocmVmKSkgeworICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfTsKKyAgICB9CisgIH0KK30pOworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nSHJlZgorICogQHJlc3RyaWN0IEEKKyAqIEBwcmlvcml0eSA5OQorICoKKyAqIEBkZXNjcmlwdGlvbgorICogVXNpbmcgQW5ndWxhciBtYXJrdXAgbGlrZSBge3toYXNofX1gIGluIGFuIGhyZWYgYXR0cmlidXRlIHdpbGwKKyAqIG1ha2UgdGhlIGxpbmsgZ28gdG8gdGhlIHdyb25nIFVSTCBpZiB0aGUgdXNlciBjbGlja3MgaXQgYmVmb3JlCisgKiBBbmd1bGFyIGhhcyBhIGNoYW5jZSB0byByZXBsYWNlIHRoZSBge3toYXNofX1gIG1hcmt1cCB3aXRoIGl0cworICogdmFsdWUuIFVudGlsIEFuZ3VsYXIgcmVwbGFjZXMgdGhlIG1hcmt1cCB0aGUgbGluayB3aWxsIGJlIGJyb2tlbgorICogYW5kIHdpbGwgbW9zdCBsaWtlbHkgcmV0dXJuIGEgNDA0IGVycm9yLiBUaGUgYG5nSHJlZmAgZGlyZWN0aXZlCisgKiBzb2x2ZXMgdGhpcyBwcm9ibGVtLgorICoKKyAqIFRoZSB3cm9uZyB3YXkgdG8gd3JpdGUgaXQ6CisgKiBgYGBodG1sCisgKiA8YSBocmVmPSJodHRwOi8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIve3toYXNofX0iPmxpbmsxPC9hPgorICogYGBgCisgKgorICogVGhlIGNvcnJlY3Qgd2F5IHRvIHdyaXRlIGl0OgorICogYGBgaHRtbAorICogPGEgbmctaHJlZj0iaHR0cDovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyL3t7aGFzaH19Ij5saW5rMTwvYT4KKyAqIGBgYAorICoKKyAqIEBlbGVtZW50IEEKKyAqIEBwYXJhbSB7dGVtcGxhdGV9IG5nSHJlZiBhbnkgc3RyaW5nIHdoaWNoIGNhbiBjb250YWluIGB7e319YCBtYXJrdXAuCisgKgorICogQGV4YW1wbGUKKyAqIFRoaXMgZXhhbXBsZSBzaG93cyB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBgaHJlZmAsIGBuZy1ocmVmYCBhbmQgYG5nLWNsaWNrYCBhdHRyaWJ1dGVzCisgKiBpbiBsaW5rcyBhbmQgdGhlaXIgZGlmZmVyZW50IGJlaGF2aW9yczoKKyAgICA8ZXhhbXBsZT4KKyAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgICA8aW5wdXQgbmctbW9kZWw9InZhbHVlIiAvPjxiciAvPgorICAgICAgICA8YSBpZD0ibGluay0xIiBocmVmIG5nLWNsaWNrPSJ2YWx1ZSA9IDEiPmxpbmsgMTwvYT4gKGxpbmssIGRvbid0IHJlbG9hZCk8YnIgLz4KKyAgICAgICAgPGEgaWQ9ImxpbmstMiIgaHJlZj0iIiBuZy1jbGljaz0idmFsdWUgPSAyIj5saW5rIDI8L2E+IChsaW5rLCBkb24ndCByZWxvYWQpPGJyIC8+CisgICAgICAgIDxhIGlkPSJsaW5rLTMiIG5nLWhyZWY9Ii97eycxMjMnfX0iPmxpbmsgMzwvYT4gKGxpbmssIHJlbG9hZCEpPGJyIC8+CisgICAgICAgIDxhIGlkPSJsaW5rLTQiIGhyZWY9IiIgbmFtZT0ieHgiIG5nLWNsaWNrPSJ2YWx1ZSA9IDQiPmFuY2hvcjwvYT4gKGxpbmssIGRvbid0IHJlbG9hZCk8YnIgLz4KKyAgICAgICAgPGEgaWQ9ImxpbmstNSIgbmFtZT0ieHh4IiBuZy1jbGljaz0idmFsdWUgPSA1Ij5hbmNob3I8L2E+IChubyBsaW5rKTxiciAvPgorICAgICAgICA8YSBpZD0ibGluay02IiBuZy1ocmVmPSJ7e3ZhbHVlfX0iPmxpbms8L2E+IChsaW5rLCBjaGFuZ2UgbG9jYXRpb24pCisgICAgICA8L2ZpbGU+CisgICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAgICAgICAgaXQoJ3Nob3VsZCBleGVjdXRlIG5nLWNsaWNrIGJ1dCBub3QgcmVsb2FkIHdoZW4gaHJlZiB3aXRob3V0IHZhbHVlJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgZWxlbWVudChieS5pZCgnbGluay0xJykpLmNsaWNrKCk7CisgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnMScpOworICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTEnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvQmUoJycpOworICAgICAgICB9KTsKKworICAgICAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgbmctY2xpY2sgYnV0IG5vdCByZWxvYWQgd2hlbiBocmVmIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uKCkgeworICAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ2xpbmstMicpKS5jbGljaygpOworICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvRXF1YWwoJzInKTsKKyAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGluay0yJykpLmdldEF0dHJpYnV0ZSgnaHJlZicpKS50b0JlKCcnKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaXQoJ3Nob3VsZCBleGVjdXRlIG5nLWNsaWNrIGFuZCBjaGFuZ2UgdXJsIHdoZW4gbmctaHJlZiBzcGVjaWZpZWQnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnbGluay0zJykpLmdldEF0dHJpYnV0ZSgnaHJlZicpKS50b01hdGNoKC9cLzEyMyQvKTsKKworICAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ2xpbmstMycpKS5jbGljaygpOworCisgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgbmF2aWdhdGUgYXdheSBmcm9tIGFuIEFuZ3VsYXIgcGFnZSwgc28gd2UgbmVlZAorICAgICAgICAgIC8vIHRvIHVzZSBicm93c2VyLmRyaXZlciB0byBnZXQgdGhlIGJhc2Ugd2ViZHJpdmVyLgorCisgICAgICAgICAgYnJvd3Nlci53YWl0KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIuZHJpdmVyLmdldEN1cnJlbnRVcmwoKS50aGVuKGZ1bmN0aW9uKHVybCkgeworICAgICAgICAgICAgICByZXR1cm4gdXJsLm1hdGNoKC9cLzEyMyQvKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0sIDUwMDAsICdwYWdlIHNob3VsZCBuYXZpZ2F0ZSB0byAvMTIzJyk7CisgICAgICAgIH0pOworCisgICAgICAgIHhpdCgnc2hvdWxkIGV4ZWN1dGUgbmctY2xpY2sgYnV0IG5vdCByZWxvYWQgd2hlbiBocmVmIGVtcHR5IHN0cmluZyBhbmQgbmFtZSBzcGVjaWZpZWQnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICBlbGVtZW50KGJ5LmlkKCdsaW5rLTQnKSkuY2xpY2soKTsKKyAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0VxdWFsKCc0Jyk7CisgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2xpbmstNCcpKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkudG9CZSgnJyk7CisgICAgICAgIH0pOworCisgICAgICAgIGl0KCdzaG91bGQgZXhlY3V0ZSBuZy1jbGljayBidXQgbm90IHJlbG9hZCB3aGVuIG5vIGhyZWYgYnV0IG5hbWUgc3BlY2lmaWVkJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgZWxlbWVudChieS5pZCgnbGluay01JykpLmNsaWNrKCk7CisgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnNScpOworICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTUnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvQmUobnVsbCk7CisgICAgICAgIH0pOworCisgICAgICAgIGl0KCdzaG91bGQgb25seSBjaGFuZ2UgdXJsIHdoZW4gb25seSBuZy1ocmVmJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuY2xlYXIoKTsKKyAgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKS5zZW5kS2V5cygnNicpOworICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTYnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvTWF0Y2goL1wvNiQvKTsKKworICAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ2xpbmstNicpKS5jbGljaygpOworCisgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgbmF2aWdhdGUgYXdheSBmcm9tIGFuIEFuZ3VsYXIgcGFnZSwgc28gd2UgbmVlZAorICAgICAgICAgIC8vIHRvIHVzZSBicm93c2VyLmRyaXZlciB0byBnZXQgdGhlIGJhc2Ugd2ViZHJpdmVyLgorICAgICAgICAgIGJyb3dzZXIud2FpdChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBicm93c2VyLmRyaXZlci5nZXRDdXJyZW50VXJsKCkudGhlbihmdW5jdGlvbih1cmwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHVybC5tYXRjaCgvXC82JC8pOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSwgNTAwMCwgJ3BhZ2Ugc2hvdWxkIG5hdmlnYXRlIHRvIC82Jyk7CisgICAgICAgIH0pOworICAgICAgPC9maWxlPgorICAgIDwvZXhhbXBsZT4KKyAqLworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nU3JjCisgKiBAcmVzdHJpY3QgQQorICogQHByaW9yaXR5IDk5CisgKgorICogQGRlc2NyaXB0aW9uCisgKiBVc2luZyBBbmd1bGFyIG1hcmt1cCBsaWtlIGB7e2hhc2h9fWAgaW4gYSBgc3JjYCBhdHRyaWJ1dGUgZG9lc24ndAorICogd29yayByaWdodDogVGhlIGJyb3dzZXIgd2lsbCBmZXRjaCBmcm9tIHRoZSBVUkwgd2l0aCB0aGUgbGl0ZXJhbAorICogdGV4dCBge3toYXNofX1gIHVudGlsIEFuZ3VsYXIgcmVwbGFjZXMgdGhlIGV4cHJlc3Npb24gaW5zaWRlCisgKiBge3toYXNofX1gLiBUaGUgYG5nU3JjYCBkaXJlY3RpdmUgc29sdmVzIHRoaXMgcHJvYmxlbS4KKyAqCisgKiBUaGUgYnVnZ3kgd2F5IHRvIHdyaXRlIGl0OgorICogYGBgaHRtbAorICogPGltZyBzcmM9Imh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fSIvPgorICogYGBgCisgKgorICogVGhlIGNvcnJlY3Qgd2F5IHRvIHdyaXRlIGl0OgorICogYGBgaHRtbAorICogPGltZyBuZy1zcmM9Imh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fSIvPgorICogYGBgCisgKgorICogQGVsZW1lbnQgSU1HCisgKiBAcGFyYW0ge3RlbXBsYXRlfSBuZ1NyYyBhbnkgc3RyaW5nIHdoaWNoIGNhbiBjb250YWluIGB7e319YCBtYXJrdXAuCisgKi8KKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ1NyY3NldAorICogQHJlc3RyaWN0IEEKKyAqIEBwcmlvcml0eSA5OQorICoKKyAqIEBkZXNjcmlwdGlvbgorICogVXNpbmcgQW5ndWxhciBtYXJrdXAgbGlrZSBge3toYXNofX1gIGluIGEgYHNyY3NldGAgYXR0cmlidXRlIGRvZXNuJ3QKKyAqIHdvcmsgcmlnaHQ6IFRoZSBicm93c2VyIHdpbGwgZmV0Y2ggZnJvbSB0aGUgVVJMIHdpdGggdGhlIGxpdGVyYWwKKyAqIHRleHQgYHt7aGFzaH19YCB1bnRpbCBBbmd1bGFyIHJlcGxhY2VzIHRoZSBleHByZXNzaW9uIGluc2lkZQorICogYHt7aGFzaH19YC4gVGhlIGBuZ1NyY3NldGAgZGlyZWN0aXZlIHNvbHZlcyB0aGlzIHByb2JsZW0uCisgKgorICogVGhlIGJ1Z2d5IHdheSB0byB3cml0ZSBpdDoKKyAqIGBgYGh0bWwKKyAqIDxpbWcgc3Jjc2V0PSJodHRwOi8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIve3toYXNofX0gMngiLz4KKyAqIGBgYAorICoKKyAqIFRoZSBjb3JyZWN0IHdheSB0byB3cml0ZSBpdDoKKyAqIGBgYGh0bWwKKyAqIDxpbWcgbmctc3Jjc2V0PSJodHRwOi8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIve3toYXNofX0gMngiLz4KKyAqIGBgYAorICoKKyAqIEBlbGVtZW50IElNRworICogQHBhcmFtIHt0ZW1wbGF0ZX0gbmdTcmNzZXQgYW55IHN0cmluZyB3aGljaCBjYW4gY29udGFpbiBge3t9fWAgbWFya3VwLgorICovCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdEaXNhYmxlZAorICogQHJlc3RyaWN0IEEKKyAqIEBwcmlvcml0eSAxMDAKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBXZSBzaG91bGRuJ3QgZG8gdGhpcywgYmVjYXVzZSBpdCB3aWxsIG1ha2UgdGhlIGJ1dHRvbiBlbmFibGVkIG9uIENocm9tZS9GaXJlZm94IGJ1dCBub3Qgb24gSUU4IGFuZCBvbGRlciBJRXM6CisgKiBgYGBodG1sCisgKiA8ZGl2IG5nLWluaXQ9InNjb3BlID0geyBpc0Rpc2FibGVkOiBmYWxzZSB9Ij4KKyAqICA8YnV0dG9uIGRpc2FibGVkPSJ7e3Njb3BlLmlzRGlzYWJsZWR9fSI+RGlzYWJsZWQ8L2J1dHRvbj4KKyAqIDwvZGl2PgorICogYGBgCisgKgorICogVGhlIEhUTUwgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGJyb3dzZXJzIHRvIHByZXNlcnZlIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzCisgKiBzdWNoIGFzIGRpc2FibGVkLiAoVGhlaXIgcHJlc2VuY2UgbWVhbnMgdHJ1ZSBhbmQgdGhlaXIgYWJzZW5jZSBtZWFucyBmYWxzZS4pCisgKiBJZiB3ZSBwdXQgYW4gQW5ndWxhciBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb24gaW50byBzdWNoIGFuIGF0dHJpYnV0ZSB0aGVuIHRoZQorICogYmluZGluZyBpbmZvcm1hdGlvbiB3b3VsZCBiZSBsb3N0IHdoZW4gdGhlIGJyb3dzZXIgcmVtb3ZlcyB0aGUgYXR0cmlidXRlLgorICogVGhlIGBuZ0Rpc2FibGVkYCBkaXJlY3RpdmUgc29sdmVzIHRoaXMgcHJvYmxlbSBmb3IgdGhlIGBkaXNhYmxlZGAgYXR0cmlidXRlLgorICogVGhpcyBjb21wbGVtZW50YXJ5IGRpcmVjdGl2ZSBpcyBub3QgcmVtb3ZlZCBieSB0aGUgYnJvd3NlciBhbmQgc28gcHJvdmlkZXMKKyAqIGEgcGVybWFuZW50IHJlbGlhYmxlIHBsYWNlIHRvIHN0b3JlIHRoZSBiaW5kaW5nIGluZm9ybWF0aW9uLgorICoKKyAqIEBleGFtcGxlCisgICAgPGV4YW1wbGU+CisgICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICAgQ2xpY2sgbWUgdG8gdG9nZ2xlOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJjaGVja2VkIj48YnIvPgorICAgICAgICA8YnV0dG9uIG5nLW1vZGVsPSJidXR0b24iIG5nLWRpc2FibGVkPSJjaGVja2VkIj5CdXR0b248L2J1dHRvbj4KKyAgICAgIDwvZmlsZT4KKyAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgICBpdCgnc2hvdWxkIHRvZ2dsZSBidXR0b24nLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJ2J1dHRvbicpKS5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpLnRvQmVGYWxzeSgpOworICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2NoZWNrZWQnKSkuY2xpY2soKTsKKyAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJ2J1dHRvbicpKS5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpLnRvQmVUcnV0aHkoKTsKKyAgICAgICAgfSk7CisgICAgICA8L2ZpbGU+CisgICAgPC9leGFtcGxlPgorICoKKyAqIEBlbGVtZW50IElOUFVUCisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nRGlzYWJsZWQgSWYgdGhlIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGlzIHRydXRoeSwKKyAqICAgICB0aGVuIHNwZWNpYWwgYXR0cmlidXRlICJkaXNhYmxlZCIgd2lsbCBiZSBzZXQgb24gdGhlIGVsZW1lbnQKKyAqLworCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdDaGVja2VkCisgKiBAcmVzdHJpY3QgQQorICogQHByaW9yaXR5IDEwMAorICoKKyAqIEBkZXNjcmlwdGlvbgorICogVGhlIEhUTUwgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGJyb3dzZXJzIHRvIHByZXNlcnZlIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzCisgKiBzdWNoIGFzIGNoZWNrZWQuIChUaGVpciBwcmVzZW5jZSBtZWFucyB0cnVlIGFuZCB0aGVpciBhYnNlbmNlIG1lYW5zIGZhbHNlLikKKyAqIElmIHdlIHB1dCBhbiBBbmd1bGFyIGludGVycG9sYXRpb24gZXhwcmVzc2lvbiBpbnRvIHN1Y2ggYW4gYXR0cmlidXRlIHRoZW4gdGhlCisgKiBiaW5kaW5nIGluZm9ybWF0aW9uIHdvdWxkIGJlIGxvc3Qgd2hlbiB0aGUgYnJvd3NlciByZW1vdmVzIHRoZSBhdHRyaWJ1dGUuCisgKiBUaGUgYG5nQ2hlY2tlZGAgZGlyZWN0aXZlIHNvbHZlcyB0aGlzIHByb2JsZW0gZm9yIHRoZSBgY2hlY2tlZGAgYXR0cmlidXRlLgorICogVGhpcyBjb21wbGVtZW50YXJ5IGRpcmVjdGl2ZSBpcyBub3QgcmVtb3ZlZCBieSB0aGUgYnJvd3NlciBhbmQgc28gcHJvdmlkZXMKKyAqIGEgcGVybWFuZW50IHJlbGlhYmxlIHBsYWNlIHRvIHN0b3JlIHRoZSBiaW5kaW5nIGluZm9ybWF0aW9uLgorICogQGV4YW1wbGUKKyAgICA8ZXhhbXBsZT4KKyAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgICBDaGVjayBtZSB0byBjaGVjayBib3RoOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJtYXN0ZXIiPjxici8+CisgICAgICAgIDxpbnB1dCBpZD0iY2hlY2tTbGF2ZSIgdHlwZT0iY2hlY2tib3giIG5nLWNoZWNrZWQ9Im1hc3RlciI+CisgICAgICA8L2ZpbGU+CisgICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAgICAgICAgaXQoJ3Nob3VsZCBjaGVjayBib3RoIGNoZWNrQm94ZXMnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY2hlY2tTbGF2ZScpKS5nZXRBdHRyaWJ1dGUoJ2NoZWNrZWQnKSkudG9CZUZhbHN5KCk7CisgICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnbWFzdGVyJykpLmNsaWNrKCk7CisgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2NoZWNrU2xhdmUnKSkuZ2V0QXR0cmlidXRlKCdjaGVja2VkJykpLnRvQmVUcnV0aHkoKTsKKyAgICAgICAgfSk7CisgICAgICA8L2ZpbGU+CisgICAgPC9leGFtcGxlPgorICoKKyAqIEBlbGVtZW50IElOUFVUCisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2hlY2tlZCBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LAorICogICAgIHRoZW4gc3BlY2lhbCBhdHRyaWJ1dGUgImNoZWNrZWQiIHdpbGwgYmUgc2V0IG9uIHRoZSBlbGVtZW50CisgKi8KKworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nUmVhZG9ubHkKKyAqIEByZXN0cmljdCBBCisgKiBAcHJpb3JpdHkgMTAwCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYnJvd3NlcnMgdG8gcHJlc2VydmUgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMKKyAqIHN1Y2ggYXMgcmVhZG9ubHkuIChUaGVpciBwcmVzZW5jZSBtZWFucyB0cnVlIGFuZCB0aGVpciBhYnNlbmNlIG1lYW5zIGZhbHNlLikKKyAqIElmIHdlIHB1dCBhbiBBbmd1bGFyIGludGVycG9sYXRpb24gZXhwcmVzc2lvbiBpbnRvIHN1Y2ggYW4gYXR0cmlidXRlIHRoZW4gdGhlCisgKiBiaW5kaW5nIGluZm9ybWF0aW9uIHdvdWxkIGJlIGxvc3Qgd2hlbiB0aGUgYnJvd3NlciByZW1vdmVzIHRoZSBhdHRyaWJ1dGUuCisgKiBUaGUgYG5nUmVhZG9ubHlgIGRpcmVjdGl2ZSBzb2x2ZXMgdGhpcyBwcm9ibGVtIGZvciB0aGUgYHJlYWRvbmx5YCBhdHRyaWJ1dGUuCisgKiBUaGlzIGNvbXBsZW1lbnRhcnkgZGlyZWN0aXZlIGlzIG5vdCByZW1vdmVkIGJ5IHRoZSBicm93c2VyIGFuZCBzbyBwcm92aWRlcworICogYSBwZXJtYW5lbnQgcmVsaWFibGUgcGxhY2UgdG8gc3RvcmUgdGhlIGJpbmRpbmcgaW5mb3JtYXRpb24uCisgKiBAZXhhbXBsZQorICAgIDxleGFtcGxlPgorICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICAgIENoZWNrIG1lIHRvIG1ha2UgdGV4dCByZWFkb25seTogPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iY2hlY2tlZCI+PGJyLz4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLXJlYWRvbmx5PSJjaGVja2VkIiB2YWx1ZT0iSSdtIEFuZ3VsYXIiLz4KKyAgICAgIDwvZmlsZT4KKyAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgICBpdCgnc2hvdWxkIHRvZ2dsZSByZWFkb25seSBhdHRyJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCdbdHlwZT0idGV4dCJdJykpLmdldEF0dHJpYnV0ZSgncmVhZG9ubHknKSkudG9CZUZhbHN5KCk7CisgICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnY2hlY2tlZCcpKS5jbGljaygpOworICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnW3R5cGU9InRleHQiXScpKS5nZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JykpLnRvQmVUcnV0aHkoKTsKKyAgICAgICAgfSk7CisgICAgICA8L2ZpbGU+CisgICAgPC9leGFtcGxlPgorICoKKyAqIEBlbGVtZW50IElOUFVUCisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nUmVhZG9ubHkgSWYgdGhlIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGlzIHRydXRoeSwKKyAqICAgICB0aGVuIHNwZWNpYWwgYXR0cmlidXRlICJyZWFkb25seSIgd2lsbCBiZSBzZXQgb24gdGhlIGVsZW1lbnQKKyAqLworCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdTZWxlY3RlZAorICogQHJlc3RyaWN0IEEKKyAqIEBwcmlvcml0eSAxMDAKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFRoZSBIVE1MIHNwZWNpZmljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBicm93c2VycyB0byBwcmVzZXJ2ZSB0aGUgdmFsdWVzIG9mIGJvb2xlYW4gYXR0cmlidXRlcworICogc3VjaCBhcyBzZWxlY3RlZC4gKFRoZWlyIHByZXNlbmNlIG1lYW5zIHRydWUgYW5kIHRoZWlyIGFic2VuY2UgbWVhbnMgZmFsc2UuKQorICogSWYgd2UgcHV0IGFuIEFuZ3VsYXIgaW50ZXJwb2xhdGlvbiBleHByZXNzaW9uIGludG8gc3VjaCBhbiBhdHRyaWJ1dGUgdGhlbiB0aGUKKyAqIGJpbmRpbmcgaW5mb3JtYXRpb24gd291bGQgYmUgbG9zdCB3aGVuIHRoZSBicm93c2VyIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZS4KKyAqIFRoZSBgbmdTZWxlY3RlZGAgZGlyZWN0aXZlIHNvbHZlcyB0aGlzIHByb2JsZW0gZm9yIHRoZSBgc2VsZWN0ZWRgIGF0dHJpYnV0ZS4KKyAqIFRoaXMgY29tcGxlbWVudGFyeSBkaXJlY3RpdmUgaXMgbm90IHJlbW92ZWQgYnkgdGhlIGJyb3dzZXIgYW5kIHNvIHByb3ZpZGVzCisgKiBhIHBlcm1hbmVudCByZWxpYWJsZSBwbGFjZSB0byBzdG9yZSB0aGUgYmluZGluZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBAZXhhbXBsZQorICAgIDxleGFtcGxlPgorICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICAgIENoZWNrIG1lIHRvIHNlbGVjdDogPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ic2VsZWN0ZWQiPjxici8+CisgICAgICAgIDxzZWxlY3Q+CisgICAgICAgICAgPG9wdGlvbj5IZWxsbyE8L29wdGlvbj4KKyAgICAgICAgICA8b3B0aW9uIGlkPSJncmVldCIgbmctc2VsZWN0ZWQ9InNlbGVjdGVkIj5HcmVldGluZ3MhPC9vcHRpb24+CisgICAgICAgIDwvc2VsZWN0PgorICAgICAgPC9maWxlPgorICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgIGl0KCdzaG91bGQgc2VsZWN0IEdyZWV0aW5ncyEnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZ3JlZXQnKSkuZ2V0QXR0cmlidXRlKCdzZWxlY3RlZCcpKS50b0JlRmFsc3koKTsKKyAgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzZWxlY3RlZCcpKS5jbGljaygpOworICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdncmVldCcpKS5nZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJykpLnRvQmVUcnV0aHkoKTsKKyAgICAgICAgfSk7CisgICAgICA8L2ZpbGU+CisgICAgPC9leGFtcGxlPgorICoKKyAqIEBlbGVtZW50IE9QVElPTgorICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ1NlbGVjdGVkIElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyB0cnV0aHksCisgKiAgICAgdGhlbiBzcGVjaWFsIGF0dHJpYnV0ZSAic2VsZWN0ZWQiIHdpbGwgYmUgc2V0IG9uIHRoZSBlbGVtZW50CisgKi8KKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ09wZW4KKyAqIEByZXN0cmljdCBBCisgKiBAcHJpb3JpdHkgMTAwCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYnJvd3NlcnMgdG8gcHJlc2VydmUgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMKKyAqIHN1Y2ggYXMgb3Blbi4gKFRoZWlyIHByZXNlbmNlIG1lYW5zIHRydWUgYW5kIHRoZWlyIGFic2VuY2UgbWVhbnMgZmFsc2UuKQorICogSWYgd2UgcHV0IGFuIEFuZ3VsYXIgaW50ZXJwb2xhdGlvbiBleHByZXNzaW9uIGludG8gc3VjaCBhbiBhdHRyaWJ1dGUgdGhlbiB0aGUKKyAqIGJpbmRpbmcgaW5mb3JtYXRpb24gd291bGQgYmUgbG9zdCB3aGVuIHRoZSBicm93c2VyIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZS4KKyAqIFRoZSBgbmdPcGVuYCBkaXJlY3RpdmUgc29sdmVzIHRoaXMgcHJvYmxlbSBmb3IgdGhlIGBvcGVuYCBhdHRyaWJ1dGUuCisgKiBUaGlzIGNvbXBsZW1lbnRhcnkgZGlyZWN0aXZlIGlzIG5vdCByZW1vdmVkIGJ5IHRoZSBicm93c2VyIGFuZCBzbyBwcm92aWRlcworICogYSBwZXJtYW5lbnQgcmVsaWFibGUgcGxhY2UgdG8gc3RvcmUgdGhlIGJpbmRpbmcgaW5mb3JtYXRpb24uCisgKiBAZXhhbXBsZQorICAgICA8ZXhhbXBsZT4KKyAgICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICAgIENoZWNrIG1lIGNoZWNrIG11bHRpcGxlOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJvcGVuIj48YnIvPgorICAgICAgICAgPGRldGFpbHMgaWQ9ImRldGFpbHMiIG5nLW9wZW49Im9wZW4iPgorICAgICAgICAgICAgPHN1bW1hcnk+U2hvdy9IaWRlIG1lPC9zdW1tYXJ5PgorICAgICAgICAgPC9kZXRhaWxzPgorICAgICAgIDwvZmlsZT4KKyAgICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAgICAgICAgIGl0KCdzaG91bGQgdG9nZ2xlIG9wZW4nLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2RldGFpbHMnKSkuZ2V0QXR0cmlidXRlKCdvcGVuJykpLnRvQmVGYWxzeSgpOworICAgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdvcGVuJykpLmNsaWNrKCk7CisgICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdkZXRhaWxzJykpLmdldEF0dHJpYnV0ZSgnb3BlbicpKS50b0JlVHJ1dGh5KCk7CisgICAgICAgICB9KTsKKyAgICAgICA8L2ZpbGU+CisgICAgIDwvZXhhbXBsZT4KKyAqCisgKiBAZWxlbWVudCBERVRBSUxTCisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nT3BlbiBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LAorICogICAgIHRoZW4gc3BlY2lhbCBhdHRyaWJ1dGUgIm9wZW4iIHdpbGwgYmUgc2V0IG9uIHRoZSBlbGVtZW50CisgKi8KKwordmFyIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzID0ge307CisKKworLy8gYm9vbGVhbiBhdHRycyBhcmUgZXZhbHVhdGVkCitmb3JFYWNoKEJPT0xFQU5fQVRUUiwgZnVuY3Rpb24ocHJvcE5hbWUsIGF0dHJOYW1lKSB7CisgIC8vIGJpbmRpbmcgdG8gbXVsdGlwbGUgaXMgbm90IHN1cHBvcnRlZAorICBpZiAocHJvcE5hbWUgPT0gIm11bHRpcGxlIikgcmV0dXJuOworCisgIHZhciBub3JtYWxpemVkID0gZGlyZWN0aXZlTm9ybWFsaXplKCduZy0nICsgYXR0ck5hbWUpOworICBuZ0F0dHJpYnV0ZUFsaWFzRGlyZWN0aXZlc1tub3JtYWxpemVkXSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB7CisgICAgICByZXN0cmljdDogJ0EnLAorICAgICAgcHJpb3JpdHk6IDEwMCwKKyAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7CisgICAgICAgIHNjb3BlLiR3YXRjaChhdHRyW25vcm1hbGl6ZWRdLCBmdW5jdGlvbiBuZ0Jvb2xlYW5BdHRyV2F0Y2hBY3Rpb24odmFsdWUpIHsKKyAgICAgICAgICBhdHRyLiRzZXQoYXR0ck5hbWUsICEhdmFsdWUpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9OworICB9OworfSk7CisKKy8vIGFsaWFzZWQgaW5wdXQgYXR0cnMgYXJlIGV2YWx1YXRlZAorZm9yRWFjaChBTElBU0VEX0FUVFIsIGZ1bmN0aW9uKGh0bWxBdHRyLCBuZ0F0dHIpIHsKKyAgbmdBdHRyaWJ1dGVBbGlhc0RpcmVjdGl2ZXNbbmdBdHRyXSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB7CisgICAgICBwcmlvcml0eTogMTAwLAorICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsKKyAgICAgICAgLy9zcGVjaWFsIGNhc2UgbmdQYXR0ZXJuIHdoZW4gYSBsaXRlcmFsIHJlZ3VsYXIgZXhwcmVzc2lvbiB2YWx1ZQorICAgICAgICAvL2lzIHVzZWQgYXMgdGhlIGV4cHJlc3Npb24gKHRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gd2F0Y2ggYW55dGhpbmcpLgorICAgICAgICBpZiAobmdBdHRyID09PSAibmdQYXR0ZXJuIiAmJiBhdHRyLm5nUGF0dGVybi5jaGFyQXQoMCkgPT0gIi8iKSB7CisgICAgICAgICAgdmFyIG1hdGNoID0gYXR0ci5uZ1BhdHRlcm4ubWF0Y2goUkVHRVhfU1RSSU5HX1JFR0VYUCk7CisgICAgICAgICAgaWYgKG1hdGNoKSB7CisgICAgICAgICAgICBhdHRyLiRzZXQoIm5nUGF0dGVybiIsIG5ldyBSZWdFeHAobWF0Y2hbMV0sIG1hdGNoWzJdKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2NvcGUuJHdhdGNoKGF0dHJbbmdBdHRyXSwgZnVuY3Rpb24gbmdBdHRyQWxpYXNXYXRjaEFjdGlvbih2YWx1ZSkgeworICAgICAgICAgIGF0dHIuJHNldChuZ0F0dHIsIHZhbHVlKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfTsKKyAgfTsKK30pOworCisvLyBuZy1zcmMsIG5nLXNyY3NldCwgbmctaHJlZiBhcmUgaW50ZXJwb2xhdGVkCitmb3JFYWNoKFsnc3JjJywgJ3NyY3NldCcsICdocmVmJ10sIGZ1bmN0aW9uKGF0dHJOYW1lKSB7CisgIHZhciBub3JtYWxpemVkID0gZGlyZWN0aXZlTm9ybWFsaXplKCduZy0nICsgYXR0ck5hbWUpOworICBuZ0F0dHJpYnV0ZUFsaWFzRGlyZWN0aXZlc1tub3JtYWxpemVkXSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB7CisgICAgICBwcmlvcml0eTogOTksIC8vIGl0IG5lZWRzIHRvIHJ1biBhZnRlciB0aGUgYXR0cmlidXRlcyBhcmUgaW50ZXJwb2xhdGVkCisgICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cikgeworICAgICAgICB2YXIgcHJvcE5hbWUgPSBhdHRyTmFtZSwKKyAgICAgICAgICAgIG5hbWUgPSBhdHRyTmFtZTsKKworICAgICAgICBpZiAoYXR0ck5hbWUgPT09ICdocmVmJyAmJgorICAgICAgICAgICAgdG9TdHJpbmcuY2FsbChlbGVtZW50LnByb3AoJ2hyZWYnKSkgPT09ICdbb2JqZWN0IFNWR0FuaW1hdGVkU3RyaW5nXScpIHsKKyAgICAgICAgICBuYW1lID0gJ3hsaW5rSHJlZic7CisgICAgICAgICAgYXR0ci4kYXR0cltuYW1lXSA9ICd4bGluazpocmVmJzsKKyAgICAgICAgICBwcm9wTmFtZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBhdHRyLiRvYnNlcnZlKG5vcm1hbGl6ZWQsIGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgaWYgKGF0dHJOYW1lID09PSAnaHJlZicpIHsKKyAgICAgICAgICAgICAgYXR0ci4kc2V0KG5hbWUsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGF0dHIuJHNldChuYW1lLCB2YWx1ZSk7CisKKyAgICAgICAgICAvLyBvbiBJRSwgaWYgIm5nOnNyYyIgZGlyZWN0aXZlIGRlY2xhcmF0aW9uIGlzIHVzZWQgYW5kICJzcmMiIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0CisgICAgICAgICAgLy8gdGhlbiBjYWxsaW5nIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzcmMnLCAnZm9vJykgZG9lc24ndCBkbyBhbnl0aGluZywgc28gd2UgbmVlZAorICAgICAgICAgIC8vIHRvIHNldCB0aGUgcHJvcGVydHkgYXMgd2VsbCB0byBhY2hpZXZlIHRoZSBkZXNpcmVkIGVmZmVjdC4KKyAgICAgICAgICAvLyB3ZSB1c2UgYXR0clthdHRyTmFtZV0gdmFsdWUgc2luY2UgJHNldCBjYW4gc2FuaXRpemUgdGhlIHVybC4KKyAgICAgICAgICBpZiAobXNpZSAmJiBwcm9wTmFtZSkgZWxlbWVudC5wcm9wKHByb3BOYW1lLCBhdHRyW25hbWVdKTsKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfTsKKyAgfTsKK30pOworCisvKiBnbG9iYWwgLW51bGxGb3JtQ3RybCwgLVNVQk1JVFRFRF9DTEFTUywgYWRkU2V0VmFsaWRpdHlNZXRob2Q6IHRydWUKKyAqLwordmFyIG51bGxGb3JtQ3RybCA9IHsKKyAgJGFkZENvbnRyb2w6IG5vb3AsCisgICQkcmVuYW1lQ29udHJvbDogbnVsbEZvcm1SZW5hbWVDb250cm9sLAorICAkcmVtb3ZlQ29udHJvbDogbm9vcCwKKyAgJHNldFZhbGlkaXR5OiBub29wLAorICAkc2V0RGlydHk6IG5vb3AsCisgICRzZXRQcmlzdGluZTogbm9vcCwKKyAgJHNldFN1Ym1pdHRlZDogbm9vcAorfSwKK1NVQk1JVFRFRF9DTEFTUyA9ICduZy1zdWJtaXR0ZWQnOworCitmdW5jdGlvbiBudWxsRm9ybVJlbmFtZUNvbnRyb2woY29udHJvbCwgbmFtZSkgeworICBjb250cm9sLiRuYW1lID0gbmFtZTsKK30KKworLyoqCisgKiBAbmdkb2MgdHlwZQorICogQG5hbWUgZm9ybS5Gb3JtQ29udHJvbGxlcgorICoKKyAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHByaXN0aW5lIFRydWUgaWYgdXNlciBoYXMgbm90IGludGVyYWN0ZWQgd2l0aCB0aGUgZm9ybSB5ZXQuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59ICRkaXJ0eSBUcnVlIGlmIHVzZXIgaGFzIGFscmVhZHkgaW50ZXJhY3RlZCB3aXRoIHRoZSBmb3JtLgorICogQHByb3BlcnR5IHtib29sZWFufSAkdmFsaWQgVHJ1ZSBpZiBhbGwgb2YgdGhlIGNvbnRhaW5pbmcgZm9ybXMgYW5kIGNvbnRyb2xzIGFyZSB2YWxpZC4KKyAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJGludmFsaWQgVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgY29udGFpbmluZyBjb250cm9sIG9yIGZvcm0gaXMgaW52YWxpZC4KKyAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHN1Ym1pdHRlZCBUcnVlIGlmIHVzZXIgaGFzIHN1Ym1pdHRlZCB0aGUgZm9ybSBldmVuIGlmIGl0cyBpbnZhbGlkLgorICoKKyAqIEBwcm9wZXJ0eSB7T2JqZWN0fSAkZXJyb3IgSXMgYW4gb2JqZWN0IGhhc2gsIGNvbnRhaW5pbmcgcmVmZXJlbmNlcyB0byBjb250cm9scyBvcgorICogIGZvcm1zIHdpdGggZmFpbGluZyB2YWxpZGF0b3JzLCB3aGVyZToKKyAqCisgKiAgLSBrZXlzIGFyZSB2YWxpZGF0aW9uIHRva2VucyAoZXJyb3IgbmFtZXMpLAorICogIC0gdmFsdWVzIGFyZSBhcnJheXMgb2YgY29udHJvbHMgb3IgZm9ybXMgdGhhdCBoYXZlIGEgZmFpbGluZyB2YWxpZGF0b3IgZm9yIGdpdmVuIGVycm9yIG5hbWUuCisgKgorICogIEJ1aWx0LWluIHZhbGlkYXRpb24gdG9rZW5zOgorICoKKyAqICAtIGBlbWFpbGAKKyAqICAtIGBtYXhgCisgKiAgLSBgbWF4bGVuZ3RoYAorICogIC0gYG1pbmAKKyAqICAtIGBtaW5sZW5ndGhgCisgKiAgLSBgbnVtYmVyYAorICogIC0gYHBhdHRlcm5gCisgKiAgLSBgcmVxdWlyZWRgCisgKiAgLSBgdXJsYAorICogIC0gYGRhdGVgCisgKiAgLSBgZGF0ZXRpbWVsb2NhbGAKKyAqICAtIGB0aW1lYAorICogIC0gYHdlZWtgCisgKiAgLSBgbW9udGhgCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBgRm9ybUNvbnRyb2xsZXJgIGtlZXBzIHRyYWNrIG9mIGFsbCBpdHMgY29udHJvbHMgYW5kIG5lc3RlZCBmb3JtcyBhcyB3ZWxsIGFzIHRoZSBzdGF0ZSBvZiB0aGVtLAorICogc3VjaCBhcyBiZWluZyB2YWxpZC9pbnZhbGlkIG9yIGRpcnR5L3ByaXN0aW5lLgorICoKKyAqIEVhY2gge0BsaW5rIG5nLmRpcmVjdGl2ZTpmb3JtIGZvcm19IGRpcmVjdGl2ZSBjcmVhdGVzIGFuIGluc3RhbmNlCisgKiBvZiBgRm9ybUNvbnRyb2xsZXJgLgorICoKKyAqLworLy9hc2tzIGZvciAkc2NvcGUgdG8gZm9vbCB0aGUgQkMgY29udHJvbGxlciBtb2R1bGUKK0Zvcm1Db250cm9sbGVyLiRpbmplY3QgPSBbJyRlbGVtZW50JywgJyRhdHRycycsICckc2NvcGUnLCAnJGFuaW1hdGUnLCAnJGludGVycG9sYXRlJ107CitmdW5jdGlvbiBGb3JtQ29udHJvbGxlcihlbGVtZW50LCBhdHRycywgJHNjb3BlLCAkYW5pbWF0ZSwgJGludGVycG9sYXRlKSB7CisgIHZhciBmb3JtID0gdGhpcywKKyAgICAgIGNvbnRyb2xzID0gW107CisKKyAgdmFyIHBhcmVudEZvcm0gPSBmb3JtLiQkcGFyZW50Rm9ybSA9IGVsZW1lbnQucGFyZW50KCkuY29udHJvbGxlcignZm9ybScpIHx8IG51bGxGb3JtQ3RybDsKKworICAvLyBpbml0IHN0YXRlCisgIGZvcm0uJGVycm9yID0ge307CisgIGZvcm0uJCRzdWNjZXNzID0ge307CisgIGZvcm0uJHBlbmRpbmcgPSB1bmRlZmluZWQ7CisgIGZvcm0uJG5hbWUgPSAkaW50ZXJwb2xhdGUoYXR0cnMubmFtZSB8fCBhdHRycy5uZ0Zvcm0gfHwgJycpKCRzY29wZSk7CisgIGZvcm0uJGRpcnR5ID0gZmFsc2U7CisgIGZvcm0uJHByaXN0aW5lID0gdHJ1ZTsKKyAgZm9ybS4kdmFsaWQgPSB0cnVlOworICBmb3JtLiRpbnZhbGlkID0gZmFsc2U7CisgIGZvcm0uJHN1Ym1pdHRlZCA9IGZhbHNlOworCisgIHBhcmVudEZvcm0uJGFkZENvbnRyb2woZm9ybSk7CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgZm9ybS5Gb3JtQ29udHJvbGxlciMkcm9sbGJhY2tWaWV3VmFsdWUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIFJvbGxiYWNrIGFsbCBmb3JtIGNvbnRyb2xzIHBlbmRpbmcgdXBkYXRlcyB0byB0aGUgYCRtb2RlbFZhbHVlYC4KKyAgICoKKyAgICogVXBkYXRlcyBtYXkgYmUgcGVuZGluZyBieSBhIGRlYm91bmNlZCBldmVudCBvciBiZWNhdXNlIHRoZSBpbnB1dCBpcyB3YWl0aW5nIGZvciBhIHNvbWUgZnV0dXJlCisgICAqIGV2ZW50IGRlZmluZWQgaW4gYG5nLW1vZGVsLW9wdGlvbnNgLiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgbmVlZGVkIGJ5IHRoZSByZXNldCBidXR0b24gb2YKKyAgICogYSBmb3JtIHRoYXQgdXNlcyBgbmctbW9kZWwtb3B0aW9uc2AgdG8gcGVuZCB1cGRhdGVzLgorICAgKi8KKyAgZm9ybS4kcm9sbGJhY2tWaWV3VmFsdWUgPSBmdW5jdGlvbigpIHsKKyAgICBmb3JFYWNoKGNvbnRyb2xzLCBmdW5jdGlvbihjb250cm9sKSB7CisgICAgICBjb250cm9sLiRyb2xsYmFja1ZpZXdWYWx1ZSgpOworICAgIH0pOworICB9OworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJGNvbW1pdFZpZXdWYWx1ZQorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogQ29tbWl0IGFsbCBmb3JtIGNvbnRyb2xzIHBlbmRpbmcgdXBkYXRlcyB0byB0aGUgYCRtb2RlbFZhbHVlYC4KKyAgICoKKyAgICogVXBkYXRlcyBtYXkgYmUgcGVuZGluZyBieSBhIGRlYm91bmNlZCBldmVudCBvciBiZWNhdXNlIHRoZSBpbnB1dCBpcyB3YWl0aW5nIGZvciBhIHNvbWUgZnV0dXJlCisgICAqIGV2ZW50IGRlZmluZWQgaW4gYG5nLW1vZGVsLW9wdGlvbnNgLiBUaGlzIG1ldGhvZCBpcyByYXJlbHkgbmVlZGVkIGFzIGBOZ01vZGVsQ29udHJvbGxlcmAKKyAgICogdXN1YWxseSBoYW5kbGVzIGNhbGxpbmcgdGhpcyBpbiByZXNwb25zZSB0byBpbnB1dCBldmVudHMuCisgICAqLworICBmb3JtLiRjb21taXRWaWV3VmFsdWUgPSBmdW5jdGlvbigpIHsKKyAgICBmb3JFYWNoKGNvbnRyb2xzLCBmdW5jdGlvbihjb250cm9sKSB7CisgICAgICBjb250cm9sLiRjb21taXRWaWV3VmFsdWUoKTsKKyAgICB9KTsKKyAgfTsKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRhZGRDb250cm9sCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBSZWdpc3RlciBhIGNvbnRyb2wgd2l0aCB0aGUgZm9ybS4KKyAgICoKKyAgICogSW5wdXQgZWxlbWVudHMgdXNpbmcgbmdNb2RlbENvbnRyb2xsZXIgZG8gdGhpcyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhleSBhcmUgbGlua2VkLgorICAgKi8KKyAgZm9ybS4kYWRkQ29udHJvbCA9IGZ1bmN0aW9uKGNvbnRyb2wpIHsKKyAgICAvLyBCcmVha2luZyBjaGFuZ2UgLSBiZWZvcmUsIGlucHV0cyB3aG9zZSBuYW1lIHdhcyAiaGFzT3duUHJvcGVydHkiIHdlcmUgcXVpZXRseSBpZ25vcmVkCisgICAgLy8gYW5kIG5vdCBhZGRlZCB0byB0aGUgc2NvcGUuICBOb3cgd2UgdGhyb3cgYW4gZXJyb3IuCisgICAgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkoY29udHJvbC4kbmFtZSwgJ2lucHV0Jyk7CisgICAgY29udHJvbHMucHVzaChjb250cm9sKTsKKworICAgIGlmIChjb250cm9sLiRuYW1lKSB7CisgICAgICBmb3JtW2NvbnRyb2wuJG5hbWVdID0gY29udHJvbDsKKyAgICB9CisgIH07CisKKyAgLy8gUHJpdmF0ZSBBUEk6IHJlbmFtZSBhIGZvcm0gY29udHJvbAorICBmb3JtLiQkcmVuYW1lQ29udHJvbCA9IGZ1bmN0aW9uKGNvbnRyb2wsIG5ld05hbWUpIHsKKyAgICB2YXIgb2xkTmFtZSA9IGNvbnRyb2wuJG5hbWU7CisKKyAgICBpZiAoZm9ybVtvbGROYW1lXSA9PT0gY29udHJvbCkgeworICAgICAgZGVsZXRlIGZvcm1bb2xkTmFtZV07CisgICAgfQorICAgIGZvcm1bbmV3TmFtZV0gPSBjb250cm9sOworICAgIGNvbnRyb2wuJG5hbWUgPSBuZXdOYW1lOworICB9OworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHJlbW92ZUNvbnRyb2wKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIERlcmVnaXN0ZXIgYSBjb250cm9sIGZyb20gdGhlIGZvcm0uCisgICAqCisgICAqIElucHV0IGVsZW1lbnRzIHVzaW5nIG5nTW9kZWxDb250cm9sbGVyIGRvIHRoaXMgYXV0b21hdGljYWxseSB3aGVuIHRoZXkgYXJlIGRlc3Ryb3llZC4KKyAgICovCisgIGZvcm0uJHJlbW92ZUNvbnRyb2wgPSBmdW5jdGlvbihjb250cm9sKSB7CisgICAgaWYgKGNvbnRyb2wuJG5hbWUgJiYgZm9ybVtjb250cm9sLiRuYW1lXSA9PT0gY29udHJvbCkgeworICAgICAgZGVsZXRlIGZvcm1bY29udHJvbC4kbmFtZV07CisgICAgfQorICAgIGZvckVhY2goZm9ybS4kcGVuZGluZywgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHsKKyAgICAgIGZvcm0uJHNldFZhbGlkaXR5KG5hbWUsIG51bGwsIGNvbnRyb2wpOworICAgIH0pOworICAgIGZvckVhY2goZm9ybS4kZXJyb3IsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7CisgICAgICBmb3JtLiRzZXRWYWxpZGl0eShuYW1lLCBudWxsLCBjb250cm9sKTsKKyAgICB9KTsKKworICAgIGFycmF5UmVtb3ZlKGNvbnRyb2xzLCBjb250cm9sKTsKKyAgfTsKKworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHNldFZhbGlkaXR5CisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBTZXRzIHRoZSB2YWxpZGl0eSBvZiBhIGZvcm0gY29udHJvbC4KKyAgICoKKyAgICogVGhpcyBtZXRob2Qgd2lsbCBhbHNvIHByb3BhZ2F0ZSB0byBwYXJlbnQgZm9ybXMuCisgICAqLworICBhZGRTZXRWYWxpZGl0eU1ldGhvZCh7CisgICAgY3RybDogdGhpcywKKyAgICAkZWxlbWVudDogZWxlbWVudCwKKyAgICBzZXQ6IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHksIGNvbnRyb2wpIHsKKyAgICAgIHZhciBsaXN0ID0gb2JqZWN0W3Byb3BlcnR5XTsKKyAgICAgIGlmICghbGlzdCkgeworICAgICAgICBvYmplY3RbcHJvcGVydHldID0gW2NvbnRyb2xdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGluZGV4ID0gbGlzdC5pbmRleE9mKGNvbnRyb2wpOworICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7CisgICAgICAgICAgbGlzdC5wdXNoKGNvbnRyb2wpOworICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICB1bnNldDogZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSwgY29udHJvbCkgeworICAgICAgdmFyIGxpc3QgPSBvYmplY3RbcHJvcGVydHldOworICAgICAgaWYgKCFsaXN0KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGFycmF5UmVtb3ZlKGxpc3QsIGNvbnRyb2wpOworICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7CisgICAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldOworICAgICAgfQorICAgIH0sCisgICAgcGFyZW50Rm9ybTogcGFyZW50Rm9ybSwKKyAgICAkYW5pbWF0ZTogJGFuaW1hdGUKKyAgfSk7CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgZm9ybS5Gb3JtQ29udHJvbGxlciMkc2V0RGlydHkKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIFNldHMgdGhlIGZvcm0gdG8gYSBkaXJ0eSBzdGF0ZS4KKyAgICoKKyAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBhZGQgdGhlICduZy1kaXJ0eScgY2xhc3MgYW5kIHNldCB0aGUgZm9ybSB0byBhIGRpcnR5CisgICAqIHN0YXRlIChuZy1kaXJ0eSBjbGFzcykuIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBwcm9wYWdhdGUgdG8gcGFyZW50IGZvcm1zLgorICAgKi8KKyAgZm9ybS4kc2V0RGlydHkgPSBmdW5jdGlvbigpIHsKKyAgICAkYW5pbWF0ZS5yZW1vdmVDbGFzcyhlbGVtZW50LCBQUklTVElORV9DTEFTUyk7CisgICAgJGFuaW1hdGUuYWRkQ2xhc3MoZWxlbWVudCwgRElSVFlfQ0xBU1MpOworICAgIGZvcm0uJGRpcnR5ID0gdHJ1ZTsKKyAgICBmb3JtLiRwcmlzdGluZSA9IGZhbHNlOworICAgIHBhcmVudEZvcm0uJHNldERpcnR5KCk7CisgIH07CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgZm9ybS5Gb3JtQ29udHJvbGxlciMkc2V0UHJpc3RpbmUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIFNldHMgdGhlIGZvcm0gdG8gaXRzIHByaXN0aW5lIHN0YXRlLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHJlbW92ZSB0aGUgJ25nLWRpcnR5JyBjbGFzcyBhbmQgc2V0IHRoZSBmb3JtIHRvIGl0cyBwcmlzdGluZQorICAgKiBzdGF0ZSAobmctcHJpc3RpbmUgY2xhc3MpLiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gcHJvcGFnYXRlIHRvIGFsbCB0aGUgY29udHJvbHMgY29udGFpbmVkCisgICAqIGluIHRoaXMgZm9ybS4KKyAgICoKKyAgICogU2V0dGluZyBhIGZvcm0gYmFjayB0byBhIHByaXN0aW5lIHN0YXRlIGlzIG9mdGVuIHVzZWZ1bCB3aGVuIHdlIHdhbnQgdG8gJ3JldXNlJyBhIGZvcm0gYWZ0ZXIKKyAgICogc2F2aW5nIG9yIHJlc2V0dGluZyBpdC4KKyAgICovCisgIGZvcm0uJHNldFByaXN0aW5lID0gZnVuY3Rpb24oKSB7CisgICAgJGFuaW1hdGUuc2V0Q2xhc3MoZWxlbWVudCwgUFJJU1RJTkVfQ0xBU1MsIERJUlRZX0NMQVNTICsgJyAnICsgU1VCTUlUVEVEX0NMQVNTKTsKKyAgICBmb3JtLiRkaXJ0eSA9IGZhbHNlOworICAgIGZvcm0uJHByaXN0aW5lID0gdHJ1ZTsKKyAgICBmb3JtLiRzdWJtaXR0ZWQgPSBmYWxzZTsKKyAgICBmb3JFYWNoKGNvbnRyb2xzLCBmdW5jdGlvbihjb250cm9sKSB7CisgICAgICBjb250cm9sLiRzZXRQcmlzdGluZSgpOworICAgIH0pOworICB9OworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHNldFVudG91Y2hlZAorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogU2V0cyB0aGUgZm9ybSB0byBpdHMgdW50b3VjaGVkIHN0YXRlLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHJlbW92ZSB0aGUgJ25nLXRvdWNoZWQnIGNsYXNzIGFuZCBzZXQgdGhlIGZvcm0gY29udHJvbHMgdG8gdGhlaXIKKyAgICogdW50b3VjaGVkIHN0YXRlIChuZy11bnRvdWNoZWQgY2xhc3MpLgorICAgKgorICAgKiBTZXR0aW5nIGEgZm9ybSBjb250cm9scyBiYWNrIHRvIHRoZWlyIHVudG91Y2hlZCBzdGF0ZSBpcyBvZnRlbiB1c2VmdWwgd2hlbiBzZXR0aW5nIHRoZSBmb3JtCisgICAqIGJhY2sgdG8gaXRzIHByaXN0aW5lIHN0YXRlLgorICAgKi8KKyAgZm9ybS4kc2V0VW50b3VjaGVkID0gZnVuY3Rpb24oKSB7CisgICAgZm9yRWFjaChjb250cm9scywgZnVuY3Rpb24oY29udHJvbCkgeworICAgICAgY29udHJvbC4kc2V0VW50b3VjaGVkKCk7CisgICAgfSk7CisgIH07CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgZm9ybS5Gb3JtQ29udHJvbGxlciMkc2V0U3VibWl0dGVkCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBTZXRzIHRoZSBmb3JtIHRvIGl0cyBzdWJtaXR0ZWQgc3RhdGUuCisgICAqLworICBmb3JtLiRzZXRTdWJtaXR0ZWQgPSBmdW5jdGlvbigpIHsKKyAgICAkYW5pbWF0ZS5hZGRDbGFzcyhlbGVtZW50LCBTVUJNSVRURURfQ0xBU1MpOworICAgIGZvcm0uJHN1Ym1pdHRlZCA9IHRydWU7CisgICAgcGFyZW50Rm9ybS4kc2V0U3VibWl0dGVkKCk7CisgIH07Cit9CisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdGb3JtCisgKiBAcmVzdHJpY3QgRUFDCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBOZXN0YWJsZSBhbGlhcyBvZiB7QGxpbmsgbmcuZGlyZWN0aXZlOmZvcm0gYGZvcm1gfSBkaXJlY3RpdmUuIEhUTUwKKyAqIGRvZXMgbm90IGFsbG93IG5lc3Rpbmcgb2YgZm9ybSBlbGVtZW50cy4gSXQgaXMgdXNlZnVsIHRvIG5lc3QgZm9ybXMsIGZvciBleGFtcGxlIGlmIHRoZSB2YWxpZGl0eSBvZiBhCisgKiBzdWItZ3JvdXAgb2YgY29udHJvbHMgbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZC4KKyAqCisgKiBOb3RlOiB0aGUgcHVycG9zZSBvZiBgbmdGb3JtYCBpcyB0byBncm91cCBjb250cm9scywKKyAqIGJ1dCBub3QgdG8gYmUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGA8Zm9ybT5gIHRhZyB3aXRoIGFsbCBvZiBpdHMgY2FwYWJpbGl0aWVzCisgKiAoZS5nLiBwb3N0aW5nIHRvIHRoZSBzZXJ2ZXIsIC4uLikuCisgKgorICogQHBhcmFtIHtzdHJpbmc9fSBuZ0Zvcm18bmFtZSBOYW1lIG9mIHRoZSBmb3JtLiBJZiBzcGVjaWZpZWQsIHRoZSBmb3JtIGNvbnRyb2xsZXIgd2lsbCBiZSBwdWJsaXNoZWQgaW50bworICogICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgc2NvcGUsIHVuZGVyIHRoaXMgbmFtZS4KKyAqCisgKi8KKworIC8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgZm9ybQorICogQHJlc3RyaWN0IEUKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIERpcmVjdGl2ZSB0aGF0IGluc3RhbnRpYXRlcworICoge0BsaW5rIGZvcm0uRm9ybUNvbnRyb2xsZXIgRm9ybUNvbnRyb2xsZXJ9LgorICoKKyAqIElmIHRoZSBgbmFtZWAgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGZvcm0gY29udHJvbGxlciBpcyBwdWJsaXNoZWQgb250byB0aGUgY3VycmVudCBzY29wZSB1bmRlcgorICogdGhpcyBuYW1lLgorICoKKyAqICMgQWxpYXM6IHtAbGluayBuZy5kaXJlY3RpdmU6bmdGb3JtIGBuZ0Zvcm1gfQorICoKKyAqIEluIEFuZ3VsYXIgZm9ybXMgY2FuIGJlIG5lc3RlZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBvdXRlciBmb3JtIGlzIHZhbGlkIHdoZW4gYWxsIG9mIHRoZSBjaGlsZAorICogZm9ybXMgYXJlIHZhbGlkIGFzIHdlbGwuIEhvd2V2ZXIsIGJyb3dzZXJzIGRvIG5vdCBhbGxvdyBuZXN0aW5nIG9mIGA8Zm9ybT5gIGVsZW1lbnRzLCBzbworICogQW5ndWxhciBwcm92aWRlcyB0aGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0Zvcm0gYG5nRm9ybWB9IGRpcmVjdGl2ZSB3aGljaCBiZWhhdmVzIGlkZW50aWNhbGx5IHRvCisgKiBgPGZvcm0+YCBidXQgY2FuIGJlIG5lc3RlZC4gIFRoaXMgYWxsb3dzIHlvdSB0byBoYXZlIG5lc3RlZCBmb3Jtcywgd2hpY2ggaXMgdmVyeSB1c2VmdWwgd2hlbgorICogdXNpbmcgQW5ndWxhciB2YWxpZGF0aW9uIGRpcmVjdGl2ZXMgaW4gZm9ybXMgdGhhdCBhcmUgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIHVzaW5nIHRoZQorICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ1JlcGVhdCBgbmdSZXBlYXRgfSBkaXJlY3RpdmUuIFNpbmNlIHlvdSBjYW5ub3QgZHluYW1pY2FsbHkgZ2VuZXJhdGUgdGhlIGBuYW1lYAorICogYXR0cmlidXRlIG9mIGlucHV0IGVsZW1lbnRzIHVzaW5nIGludGVycG9sYXRpb24sIHlvdSBoYXZlIHRvIHdyYXAgZWFjaCBzZXQgb2YgcmVwZWF0ZWQgaW5wdXRzIGluIGFuCisgKiBgbmdGb3JtYCBkaXJlY3RpdmUgYW5kIG5lc3QgdGhlc2UgaW4gYW4gb3V0ZXIgYGZvcm1gIGVsZW1lbnQuCisgKgorICoKKyAqICMgQ1NTIGNsYXNzZXMKKyAqICAtIGBuZy12YWxpZGAgaXMgc2V0IGlmIHRoZSBmb3JtIGlzIHZhbGlkLgorICogIC0gYG5nLWludmFsaWRgIGlzIHNldCBpZiB0aGUgZm9ybSBpcyBpbnZhbGlkLgorICogIC0gYG5nLXByaXN0aW5lYCBpcyBzZXQgaWYgdGhlIGZvcm0gaXMgcHJpc3RpbmUuCisgKiAgLSBgbmctZGlydHlgIGlzIHNldCBpZiB0aGUgZm9ybSBpcyBkaXJ0eS4KKyAqICAtIGBuZy1zdWJtaXR0ZWRgIGlzIHNldCBpZiB0aGUgZm9ybSB3YXMgc3VibWl0dGVkLgorICoKKyAqIEtlZXAgaW4gbWluZCB0aGF0IG5nQW5pbWF0ZSBjYW4gZGV0ZWN0IGVhY2ggb2YgdGhlc2UgY2xhc3NlcyB3aGVuIGFkZGVkIGFuZCByZW1vdmVkLgorICoKKyAqCisgKiAjIFN1Ym1pdHRpbmcgYSBmb3JtIGFuZCBwcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGFjdGlvbgorICoKKyAqIFNpbmNlIHRoZSByb2xlIG9mIGZvcm1zIGluIGNsaWVudC1zaWRlIEFuZ3VsYXIgYXBwbGljYXRpb25zIGlzIGRpZmZlcmVudCB0aGFuIGluIGNsYXNzaWNhbAorICogcm91bmR0cmlwIGFwcHMsIGl0IGlzIGRlc2lyYWJsZSBmb3IgdGhlIGJyb3dzZXIgbm90IHRvIHRyYW5zbGF0ZSB0aGUgZm9ybSBzdWJtaXNzaW9uIGludG8gYSBmdWxsCisgKiBwYWdlIHJlbG9hZCB0aGF0IHNlbmRzIHRoZSBkYXRhIHRvIHRoZSBzZXJ2ZXIuIEluc3RlYWQgc29tZSBqYXZhc2NyaXB0IGxvZ2ljIHNob3VsZCBiZSB0cmlnZ2VyZWQKKyAqIHRvIGhhbmRsZSB0aGUgZm9ybSBzdWJtaXNzaW9uIGluIGFuIGFwcGxpY2F0aW9uLXNwZWNpZmljIHdheS4KKyAqCisgKiBGb3IgdGhpcyByZWFzb24sIEFuZ3VsYXIgcHJldmVudHMgdGhlIGRlZmF1bHQgYWN0aW9uIChmb3JtIHN1Ym1pc3Npb24gdG8gdGhlIHNlcnZlcikgdW5sZXNzIHRoZQorICogYDxmb3JtPmAgZWxlbWVudCBoYXMgYW4gYGFjdGlvbmAgYXR0cmlidXRlIHNwZWNpZmllZC4KKyAqCisgKiBZb3UgY2FuIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gd2F5cyB0byBzcGVjaWZ5IHdoYXQgamF2YXNjcmlwdCBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuCisgKiBhIGZvcm0gaXMgc3VibWl0dGVkOgorICoKKyAqIC0ge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ1N1Ym1pdCBuZ1N1Ym1pdH0gZGlyZWN0aXZlIG9uIHRoZSBmb3JtIGVsZW1lbnQKKyAqIC0ge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NsaWNrIG5nQ2xpY2t9IGRpcmVjdGl2ZSBvbiB0aGUgZmlyc3QKKyAgKiAgYnV0dG9uIG9yIGlucHV0IGZpZWxkIG9mIHR5cGUgc3VibWl0IChpbnB1dFt0eXBlPXN1Ym1pdF0pCisgKgorICogVG8gcHJldmVudCBkb3VibGUgZXhlY3V0aW9uIG9mIHRoZSBoYW5kbGVyLCB1c2Ugb25seSBvbmUgb2YgdGhlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdTdWJtaXQgbmdTdWJtaXR9CisgKiBvciB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ2xpY2sgbmdDbGlja30gZGlyZWN0aXZlcy4KKyAqIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGZvcm0gc3VibWlzc2lvbiBydWxlcyBpbiB0aGUgSFRNTCBzcGVjaWZpY2F0aW9uOgorICoKKyAqIC0gSWYgYSBmb3JtIGhhcyBvbmx5IG9uZSBpbnB1dCBmaWVsZCB0aGVuIGhpdHRpbmcgZW50ZXIgaW4gdGhpcyBmaWVsZCB0cmlnZ2VycyBmb3JtIHN1Ym1pdAorICogKGBuZ1N1Ym1pdGApCisgKiAtIGlmIGEgZm9ybSBoYXMgMisgaW5wdXQgZmllbGRzIGFuZCBubyBidXR0b25zIG9yIGlucHV0W3R5cGU9c3VibWl0XSB0aGVuIGhpdHRpbmcgZW50ZXIKKyAqIGRvZXNuJ3QgdHJpZ2dlciBzdWJtaXQKKyAqIC0gaWYgYSBmb3JtIGhhcyBvbmUgb3IgbW9yZSBpbnB1dCBmaWVsZHMgYW5kIG9uZSBvciBtb3JlIGJ1dHRvbnMgb3IgaW5wdXRbdHlwZT1zdWJtaXRdIHRoZW4KKyAqIGhpdHRpbmcgZW50ZXIgaW4gYW55IG9mIHRoZSBpbnB1dCBmaWVsZHMgd2lsbCB0cmlnZ2VyIHRoZSBjbGljayBoYW5kbGVyIG9uIHRoZSAqZmlyc3QqIGJ1dHRvbiBvcgorICogaW5wdXRbdHlwZT1zdWJtaXRdIChgbmdDbGlja2ApICphbmQqIGEgc3VibWl0IGhhbmRsZXIgb24gdGhlIGVuY2xvc2luZyBmb3JtIChgbmdTdWJtaXRgKQorICoKKyAqIEFueSBwZW5kaW5nIGBuZ01vZGVsT3B0aW9uc2AgY2hhbmdlcyB3aWxsIHRha2UgcGxhY2UgaW1tZWRpYXRlbHkgd2hlbiBhbiBlbmNsb3NpbmcgZm9ybSBpcworICogc3VibWl0dGVkLiBOb3RlIHRoYXQgYG5nQ2xpY2tgIGV2ZW50cyB3aWxsIG9jY3VyIGJlZm9yZSB0aGUgbW9kZWwgaXMgdXBkYXRlZC4gVXNlIGBuZ1N1Ym1pdGAKKyAqIHRvIGhhdmUgYWNjZXNzIHRvIHRoZSB1cGRhdGVkIG1vZGVsLgorICoKKyAqICMjIEFuaW1hdGlvbiBIb29rcworICoKKyAqIEFuaW1hdGlvbnMgaW4gbmdGb3JtIGFyZSB0cmlnZ2VyZWQgd2hlbiBhbnkgb2YgdGhlIGFzc29jaWF0ZWQgQ1NTIGNsYXNzZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkLgorICogVGhlc2UgY2xhc3NlcyBhcmU6IGAubmctcHJpc3RpbmVgLCBgLm5nLWRpcnR5YCwgYC5uZy1pbnZhbGlkYCBhbmQgYC5uZy12YWxpZGAgYXMgd2VsbCBhcyBhbnkKKyAqIG90aGVyIHZhbGlkYXRpb25zIHRoYXQgYXJlIHBlcmZvcm1lZCB3aXRoaW4gdGhlIGZvcm0uIEFuaW1hdGlvbnMgaW4gbmdGb3JtIGFyZSBzaW1pbGFyIHRvIGhvdworICogdGhleSB3b3JrIGluIG5nQ2xhc3MgYW5kIGFuaW1hdGlvbnMgY2FuIGJlIGhvb2tlZCBpbnRvIHVzaW5nIENTUyB0cmFuc2l0aW9ucywga2V5ZnJhbWVzIGFzIHdlbGwKKyAqIGFzIEpTIGFuaW1hdGlvbnMuCisgKgorICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGEgc2ltcGxlIHdheSB0byB1dGlsaXplIENTUyB0cmFuc2l0aW9ucyB0byBzdHlsZSBhIGZvcm0gZWxlbWVudAorICogdGhhdCBoYXMgYmVlbiByZW5kZXJlZCBhcyBpbnZhbGlkIGFmdGVyIGl0IGhhcyBiZWVuIHZhbGlkYXRlZDoKKyAqCisgKiA8cHJlPgorICogLy9iZSBzdXJlIHRvIGluY2x1ZGUgbmdBbmltYXRlIGFzIGEgbW9kdWxlIHRvIGhvb2sgaW50byBtb3JlCisgKiAvL2FkdmFuY2VkIGFuaW1hdGlvbnMKKyAqIC5teS1mb3JtIHsKKyAqICAgdHJhbnNpdGlvbjowLjVzIGxpbmVhciBhbGw7CisgKiAgIGJhY2tncm91bmQ6IHdoaXRlOworICogfQorICogLm15LWZvcm0ubmctaW52YWxpZCB7CisgKiAgIGJhY2tncm91bmQ6IHJlZDsKKyAqICAgY29sb3I6d2hpdGU7CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiBAZXhhbXBsZQorICAgIDxleGFtcGxlIGRlcHM9ImFuZ3VsYXItYW5pbWF0ZS5qcyIgYW5pbWF0aW9ucz0idHJ1ZSIgZml4QmFzZT0idHJ1ZSIgbW9kdWxlPSJmb3JtRXhhbXBsZSI+CisgICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8c2NyaXB0PgorICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2Zvcm1FeGFtcGxlJywgW10pCisgICAgICAgICAgIC5jb250cm9sbGVyKCdGb3JtQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgICAgICAgJHNjb3BlLnVzZXJUeXBlID0gJ2d1ZXN0JzsKKyAgICAgICAgICAgfV0pOworICAgICAgIDwvc2NyaXB0PgorICAgICAgIDxzdHlsZT4KKyAgICAgICAgLm15LWZvcm0geworICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgbGluZWFyIDAuNXM7CisgICAgICAgICAgdHJhbnNpdGlvbjphbGwgbGluZWFyIDAuNXM7CisgICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgLm15LWZvcm0ubmctaW52YWxpZCB7CisgICAgICAgICAgYmFja2dyb3VuZDogcmVkOworICAgICAgICB9CisgICAgICAgPC9zdHlsZT4KKyAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkZvcm1Db250cm9sbGVyIiBjbGFzcz0ibXktZm9ybSI+CisgICAgICAgICB1c2VyVHlwZTogPGlucHV0IG5hbWU9ImlucHV0IiBuZy1tb2RlbD0idXNlclR5cGUiIHJlcXVpcmVkPgorICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkIj5SZXF1aXJlZCE8L3NwYW4+PGJyPgorICAgICAgICAgPHR0PnVzZXJUeXBlID0ge3t1c2VyVHlwZX19PC90dD48YnI+CisgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiR2YWxpZCA9IHt7bXlGb3JtLmlucHV0LiR2YWxpZH19PC90dD48YnI+CisgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnI+CisgICAgICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnI+CisgICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxicj4KKyAgICAgICAgPC9mb3JtPgorICAgICAgPC9maWxlPgorICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgIHZhciB1c2VyVHlwZSA9IGVsZW1lbnQoYnkuYmluZGluZygndXNlclR5cGUnKSk7CisgICAgICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOworCisgICAgICAgICAgZXhwZWN0KHVzZXJUeXBlLmdldFRleHQoKSkudG9Db250YWluKCdndWVzdCcpOworICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOworICAgICAgICB9KTsKKworICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgdXNlclR5cGUgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3VzZXJUeXBlJykpOworICAgICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTsKKyAgICAgICAgICB2YXIgdXNlcklucHV0ID0gZWxlbWVudChieS5tb2RlbCgndXNlclR5cGUnKSk7CisKKyAgICAgICAgICB1c2VySW5wdXQuY2xlYXIoKTsKKyAgICAgICAgICB1c2VySW5wdXQuc2VuZEtleXMoJycpOworCisgICAgICAgICAgZXhwZWN0KHVzZXJUeXBlLmdldFRleHQoKSkudG9FcXVhbCgndXNlclR5cGUgPScpOworICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsKKyAgICAgICAgfSk7CisgICAgICA8L2ZpbGU+CisgICAgPC9leGFtcGxlPgorICoKKyAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBOYW1lIG9mIHRoZSBmb3JtLiBJZiBzcGVjaWZpZWQsIHRoZSBmb3JtIGNvbnRyb2xsZXIgd2lsbCBiZSBwdWJsaXNoZWQgaW50bworICogICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgc2NvcGUsIHVuZGVyIHRoaXMgbmFtZS4KKyAqLwordmFyIGZvcm1EaXJlY3RpdmVGYWN0b3J5ID0gZnVuY3Rpb24oaXNOZ0Zvcm0pIHsKKyAgcmV0dXJuIFsnJHRpbWVvdXQnLCBmdW5jdGlvbigkdGltZW91dCkgeworICAgIHZhciBmb3JtRGlyZWN0aXZlID0geworICAgICAgbmFtZTogJ2Zvcm0nLAorICAgICAgcmVzdHJpY3Q6IGlzTmdGb3JtID8gJ0VBQycgOiAnRScsCisgICAgICBjb250cm9sbGVyOiBGb3JtQ29udHJvbGxlciwKKyAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nRm9ybUNvbXBpbGUoZm9ybUVsZW1lbnQpIHsKKyAgICAgICAgLy8gU2V0dXAgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY29udHJvbAorICAgICAgICBmb3JtRWxlbWVudC5hZGRDbGFzcyhQUklTVElORV9DTEFTUykuYWRkQ2xhc3MoVkFMSURfQ0xBU1MpOworCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgcHJlOiBmdW5jdGlvbiBuZ0Zvcm1QcmVMaW5rKHNjb3BlLCBmb3JtRWxlbWVudCwgYXR0ciwgY29udHJvbGxlcikgeworICAgICAgICAgICAgLy8gaWYgYGFjdGlvbmAgYXR0ciBpcyBub3QgcHJlc2VudCBvbiB0aGUgZm9ybSwgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24gKHN1Ym1pc3Npb24pCisgICAgICAgICAgICBpZiAoISgnYWN0aW9uJyBpbiBhdHRyKSkgeworICAgICAgICAgICAgICAvLyB3ZSBjYW4ndCB1c2UganEgZXZlbnRzIGJlY2F1c2UgaWYgYSBmb3JtIGlzIGRlc3Ryb3llZCBkdXJpbmcgc3VibWlzc2lvbiB0aGUgZGVmYXVsdAorICAgICAgICAgICAgICAvLyBhY3Rpb24gaXMgbm90IHByZXZlbnRlZC4gc2VlICMxMjM4CisgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgIC8vIElFIDkgaXMgbm90IGFmZmVjdGVkIGJlY2F1c2UgaXQgZG9lc24ndCBmaXJlIGEgc3VibWl0IGV2ZW50IGFuZCB0cnkgdG8gZG8gYSBmdWxsCisgICAgICAgICAgICAgIC8vIHBhZ2UgcmVsb2FkIGlmIHRoZSBmb3JtIHdhcyBkZXN0cm95ZWQgYnkgc3VibWlzc2lvbiBvZiB0aGUgZm9ybSB2aWEgYSBjbGljayBoYW5kbGVyCisgICAgICAgICAgICAgIC8vIG9uIGEgYnV0dG9uIGluIHRoZSBmb3JtLiBMb29rcyBsaWtlIGFuIElFOSBzcGVjaWZpYyBidWcuCisgICAgICAgICAgICAgIHZhciBoYW5kbGVGb3JtU3VibWlzc2lvbiA9IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgY29udHJvbGxlci4kY29tbWl0Vmlld1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLiRzZXRTdWJtaXR0ZWQoKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lckZuKGZvcm1FbGVtZW50WzBdLCAnc3VibWl0JywgaGFuZGxlRm9ybVN1Ym1pc3Npb24pOworCisgICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIHByZXZlbnREZWZhdWx0IGxpc3RlbmVyIHNvIHRoYXQgd2UgZG9uJ3Qgbm90IGxlYWsgbWVtb3J5IGJ1dCBpbiBhCisgICAgICAgICAgICAgIC8vIHdheSB0aGF0IHdpbGwgYWNoaWV2ZSB0aGUgcHJldmVudGlvbiBvZiB0aGUgZGVmYXVsdCBhY3Rpb24uCisgICAgICAgICAgICAgIGZvcm1FbGVtZW50Lm9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckZuKGZvcm1FbGVtZW50WzBdLCAnc3VibWl0JywgaGFuZGxlRm9ybVN1Ym1pc3Npb24pOworICAgICAgICAgICAgICAgIH0sIDAsIGZhbHNlKTsKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBwYXJlbnRGb3JtQ3RybCA9IGNvbnRyb2xsZXIuJCRwYXJlbnRGb3JtLAorICAgICAgICAgICAgICAgIGFsaWFzID0gY29udHJvbGxlci4kbmFtZTsKKworICAgICAgICAgICAgaWYgKGFsaWFzKSB7CisgICAgICAgICAgICAgIHNldHRlcihzY29wZSwgYWxpYXMsIGNvbnRyb2xsZXIsIGFsaWFzKTsKKyAgICAgICAgICAgICAgYXR0ci4kb2JzZXJ2ZShhdHRyLm5hbWUgPyAnbmFtZScgOiAnbmdGb3JtJywgZnVuY3Rpb24obmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWxpYXMgPT09IG5ld1ZhbHVlKSByZXR1cm47CisgICAgICAgICAgICAgICAgc2V0dGVyKHNjb3BlLCBhbGlhcywgdW5kZWZpbmVkLCBhbGlhcyk7CisgICAgICAgICAgICAgICAgYWxpYXMgPSBuZXdWYWx1ZTsKKyAgICAgICAgICAgICAgICBzZXR0ZXIoc2NvcGUsIGFsaWFzLCBjb250cm9sbGVyLCBhbGlhcyk7CisgICAgICAgICAgICAgICAgcGFyZW50Rm9ybUN0cmwuJCRyZW5hbWVDb250cm9sKGNvbnRyb2xsZXIsIGFsaWFzKTsKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtRWxlbWVudC5vbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgcGFyZW50Rm9ybUN0cmwuJHJlbW92ZUNvbnRyb2woY29udHJvbGxlcik7CisgICAgICAgICAgICAgIGlmIChhbGlhcykgeworICAgICAgICAgICAgICAgIHNldHRlcihzY29wZSwgYWxpYXMsIHVuZGVmaW5lZCwgYWxpYXMpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGV4dGVuZChjb250cm9sbGVyLCBudWxsRm9ybUN0cmwpOyAvL3N0b3AgcHJvcGFnYXRpbmcgY2hpbGQgZGVzdHJ1Y3Rpb24gaGFuZGxlcnMgdXB3YXJkcworICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgfQorICAgIH07CisKKyAgICByZXR1cm4gZm9ybURpcmVjdGl2ZTsKKyAgfV07Cit9OworCit2YXIgZm9ybURpcmVjdGl2ZSA9IGZvcm1EaXJlY3RpdmVGYWN0b3J5KCk7Cit2YXIgbmdGb3JtRGlyZWN0aXZlID0gZm9ybURpcmVjdGl2ZUZhY3RvcnkodHJ1ZSk7CisKKy8qIGdsb2JhbCBWQUxJRF9DTEFTUzogdHJ1ZSwKKyAgSU5WQUxJRF9DTEFTUzogdHJ1ZSwKKyAgUFJJU1RJTkVfQ0xBU1M6IHRydWUsCisgIERJUlRZX0NMQVNTOiB0cnVlLAorICBVTlRPVUNIRURfQ0xBU1M6IHRydWUsCisgIFRPVUNIRURfQ0xBU1M6IHRydWUsCisqLworCisvLyBSZWdleCBjb2RlIGlzIG9idGFpbmVkIGZyb20gU086IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMxNDMwNzAvamF2YXNjcmlwdC1yZWdleC1pc28tZGF0ZXRpbWUjYW5zd2VyLTMxNDMyMzEKK3ZhciBJU09fREFURV9SRUdFWFAgPSAvXGR7NH0tWzAxXVxkLVswLTNdXGRUWzAtMl1cZDpbMC01XVxkOlswLTVdXGRcLlxkKyhbKy1dWzAtMl1cZDpbMC01XVxkfFopLzsKK3ZhciBVUkxfUkVHRVhQID0gL14oZnRwfGh0dHB8aHR0cHMpOlwvXC8oXHcrOnswLDF9XHcqQCk/KFxTKykoOlswLTldKyk/KFwvfFwvKFtcdyMhOi4/Kz0mJUAhXC1cL10pKT8kLzsKK3ZhciBFTUFJTF9SRUdFWFAgPSAvXlthLXowLTkhIyQlJicqK1wvPT9eX2B7fH1+Li1dK0BbYS16MC05XShbYS16MC05LV0qW2EtejAtOV0pPyhcLlthLXowLTldKFthLXowLTktXSpbYS16MC05XSk/KSokL2k7Cit2YXIgTlVNQkVSX1JFR0VYUCA9IC9eXHMqKFwtfFwrKT8oXGQrfChcZCooXC5cZCopKSlccyokLzsKK3ZhciBEQVRFX1JFR0VYUCA9IC9eKFxkezR9KS0oXGR7Mn0pLShcZHsyfSkkLzsKK3ZhciBEQVRFVElNRUxPQ0FMX1JFR0VYUCA9IC9eKFxkezR9KS0oXGRcZCktKFxkXGQpVChcZFxkKTooXGRcZCkoPzo6KFxkXGQpKFwuXGR7MSwzfSk/KT8kLzsKK3ZhciBXRUVLX1JFR0VYUCA9IC9eKFxkezR9KS1XKFxkXGQpJC87Cit2YXIgTU9OVEhfUkVHRVhQID0gL14oXGR7NH0pLShcZFxkKSQvOwordmFyIFRJTUVfUkVHRVhQID0gL14oXGRcZCk6KFxkXGQpKD86OihcZFxkKShcLlxkezEsM30pPyk/JC87Cit2YXIgREVGQVVMVF9SRUdFWFAgPSAvKFxzK3xeKWRlZmF1bHQoXHMrfCQpLzsKKwordmFyICRuZ01vZGVsTWluRXJyID0gbmV3IG1pbkVycignbmdNb2RlbCcpOworCit2YXIgaW5wdXRUeXBlID0geworCisgIC8qKgorICAgKiBAbmdkb2MgaW5wdXQKKyAgICogQG5hbWUgaW5wdXRbdGV4dF0KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIFN0YW5kYXJkIEhUTUwgdGV4dCBpbnB1dCB3aXRoIGFuZ3VsYXIgZGF0YSBiaW5kaW5nLCBpbmhlcml0ZWQgYnkgbW9zdCBvZiB0aGUgYGlucHV0YCBlbGVtZW50cy4KKyAgICoKKyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLgorICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvCisgICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mCisgICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLgorICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWlubGVuZ3RoIFNldHMgYG1pbmxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIHNob3J0ZXIgdGhhbgorICAgKiAgICBtaW5sZW5ndGguCisgICAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNYXhsZW5ndGggU2V0cyBgbWF4bGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbG9uZ2VyIHRoYW4KKyAgICogICAgbWF4bGVuZ3RoLiBTZXR0aW5nIHRoZSBhdHRyaWJ1dGUgdG8gYSBuZWdhdGl2ZSBvciBub24tbnVtZXJpYyB2YWx1ZSwgYWxsb3dzIHZpZXcgdmFsdWVzIG9mCisgICAqICAgIGFueSBsZW5ndGguCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gcGF0dGVybiBTaW1pbGFyIHRvIGBuZ1BhdHRlcm5gIGV4Y2VwdCB0aGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgdGhlIGFjdHVhbCBzdHJpbmcKKyAgICogICAgdGhhdCBjb250YWlucyB0aGUgcmVndWxhciBleHByZXNzaW9uIGJvZHkgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiAgICBhcyBpbiB0aGUgbmdQYXR0ZXJuIGRpcmVjdGl2ZS4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1BhdHRlcm4gU2V0cyBgcGF0dGVybmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIG5nTW9kZWwgdmFsdWUgZG9lcyBub3QgbWF0Y2gKKyAgICogICAgYSBSZWdFeHAgZm91bmQgYnkgZXZhbHVhdGluZyB0aGUgQW5ndWxhciBleHByZXNzaW9uIGdpdmVuIGluIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCisgICAqICAgIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIFJlZ0V4cCBvYmplY3QgdGhlbiB0aGlzIGlzIHVzZWQgZGlyZWN0bHkuCisgICAqICAgIElmIHRoZSBleHByZXNzaW9uIGlzIGEgc3RyaW5nIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBSZWdFeHAgYWZ0ZXIgd3JhcHBpbmcgaXQgaW4gYF5gIGFuZCBgJGAKKyAgICogICAgY2hhcmFjdGVycy4gRm9yIGluc3RhbmNlLCBgImFiYyJgIHdpbGwgYmUgY29udmVydGVkIHRvIGBuZXcgUmVnRXhwKCdeYWJjJCcpYC4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyCisgICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuCisgICAqIEBwYXJhbSB7Ym9vbGVhbj19IFtuZ1RyaW09dHJ1ZV0gSWYgc2V0IHRvIGZhbHNlIEFuZ3VsYXIgd2lsbCBub3QgYXV0b21hdGljYWxseSB0cmltIHRoZSBpbnB1dC4KKyAgICogICAgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgaW5wdXRbdHlwZT1wYXNzd29yZF0gY29udHJvbHMsIHdoaWNoIHdpbGwgbmV2ZXIgdHJpbSB0aGUKKyAgICogICAgaW5wdXQuCisgICAqCisgICAqIEBleGFtcGxlCisgICAgICA8ZXhhbXBsZSBuYW1lPSJ0ZXh0LWlucHV0LWRpcmVjdGl2ZSIgbW9kdWxlPSJ0ZXh0SW5wdXRFeGFtcGxlIj4KKyAgICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICAgICA8c2NyaXB0PgorICAgICAgICAgICBhbmd1bGFyLm1vZHVsZSgndGV4dElucHV0RXhhbXBsZScsIFtdKQorICAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgICAgICAgICAkc2NvcGUudGV4dCA9ICdndWVzdCc7CisgICAgICAgICAgICAgICAkc2NvcGUud29yZCA9IC9eXHMqXHcqXHMqJC87CisgICAgICAgICAgICAgfV0pOworICAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KKyAgICAgICAgICAgU2luZ2xlIHdvcmQ6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJpbnB1dCIgbmctbW9kZWw9InRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctcGF0dGVybj0id29yZCIgcmVxdWlyZWQgbmctdHJpbT0iZmFsc2UiPgorICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQiPgorICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4KKyAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLnBhdHRlcm4iPgorICAgICAgICAgICAgIFNpbmdsZSB3b3JkIG9ubHkhPC9zcGFuPgorCisgICAgICAgICAgIDx0dD50ZXh0ID0ge3t0ZXh0fX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4KKyAgICAgICAgICA8L2Zvcm0+CisgICAgICAgIDwvZmlsZT4KKyAgICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgICAgdmFyIHRleHQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3RleHQnKSk7CisgICAgICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOworICAgICAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3RleHQnKSk7CisKKyAgICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9Db250YWluKCdndWVzdCcpOworICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7CisgICAgICAgICAgfSk7CisKKyAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7CisgICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnJyk7CisKKyAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9FcXVhbCgndGV4dCA9Jyk7CisgICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7CisgICAgICAgICAgfSk7CisKKyAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgbXVsdGkgd29yZCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTsKKyAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCdoZWxsbyB3b3JsZCcpOworCisgICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7CisgICAgICAgICAgfSk7CisgICAgICAgIDwvZmlsZT4KKyAgICAgIDwvZXhhbXBsZT4KKyAgICovCisgICd0ZXh0JzogdGV4dElucHV0VHlwZSwKKworICAgIC8qKgorICAgICAqIEBuZ2RvYyBpbnB1dAorICAgICAqIEBuYW1lIGlucHV0W2RhdGVdCisgICAgICoKKyAgICAgKiBAZGVzY3JpcHRpb24KKyAgICAgKiBJbnB1dCB3aXRoIGRhdGUgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHlldCBzdXBwb3J0CisgICAgICogdGhlIEhUTUw1IGRhdGUgaW5wdXQsIGEgdGV4dCBlbGVtZW50IHdpbGwgYmUgdXNlZC4gSW4gdGhhdCBjYXNlLCB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxCisgICAgICogZGF0ZSBmb3JtYXQgKHl5eXktTU0tZGQpLCBmb3IgZXhhbXBsZTogYDIwMDktMDEtMDZgLiBTaW5jZSBtYW55CisgICAgICogbW9kZXJuIGJyb3dzZXJzIGRvIG5vdCB5ZXQgc3VwcG9ydCB0aGlzIGlucHV0IHR5cGUsIGl0IGlzIGltcG9ydGFudCB0byBwcm92aWRlIGN1ZXMgdG8gdXNlcnMgb24gdGhlCisgICAgICogZXhwZWN0ZWQgaW5wdXQgZm9ybWF0IHZpYSBhIHBsYWNlaG9sZGVyIG9yIGxhYmVsLgorICAgICAqCisgICAgICogVGhlIG1vZGVsIG11c3QgYWx3YXlzIGJlIGEgRGF0ZSBvYmplY3QsIG90aGVyd2lzZSBBbmd1bGFyIHdpbGwgdGhyb3cgYW4gZXJyb3IuCisgICAgICogSW52YWxpZCBgRGF0ZWAgb2JqZWN0cyAoZGF0ZXMgd2hvc2UgYGdldFRpbWUoKWAgaXMgYE5hTmApIHdpbGwgYmUgcmVuZGVyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAqCisgICAgICogVGhlIHRpbWV6b25lIHRvIGJlIHVzZWQgdG8gcmVhZC93cml0ZSB0aGUgYERhdGVgIGluc3RhbmNlIGluIHRoZSBtb2RlbCBjYW4gYmUgZGVmaW5lZCB1c2luZworICAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9LiBCeSBkZWZhdWx0LCB0aGlzIGlzIHRoZSB0aW1lem9uZSBvZiB0aGUgYnJvd3Nlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4KKyAgICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuCisgICAgICogQHBhcmFtIHtzdHJpbmc9fSBtaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgbGVzcyB0aGFuIGBtaW5gLiBUaGlzIG11c3QgYmUgYQorICAgICAqIHZhbGlkIElTTyBkYXRlIHN0cmluZyAoeXl5eS1NTS1kZCkuCisgICAgICogQHBhcmFtIHtzdHJpbmc9fSBtYXggU2V0cyB0aGUgYG1heGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgZ3JlYXRlciB0aGFuIGBtYXhgLiBUaGlzIG11c3QgYmUKKyAgICAgKiBhIHZhbGlkIElTTyBkYXRlIHN0cmluZyAoeXl5eS1NTS1kZCkuCisgICAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLgorICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0bworICAgICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mCisgICAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyCisgICAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBleGFtcGxlCisgICAgIDxleGFtcGxlIG5hbWU9ImRhdGUtaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9ImRhdGVJbnB1dEV4YW1wbGUiPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8c2NyaXB0PgorICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdkYXRlSW5wdXRFeGFtcGxlJywgW10pCisgICAgICAgICAgICAuY29udHJvbGxlcignRGF0ZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgICAgICAgICAkc2NvcGUudmFsdWUgPSBuZXcgRGF0ZSgyMDEzLCA5LCAyMik7CisgICAgICAgICAgICB9XSk7CisgICAgICAgPC9zY3JpcHQ+CisgICAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJEYXRlQ29udHJvbGxlciBhcyBkYXRlQ3RybCI+CisgICAgICAgICAgUGljayBhIGRhdGUgaW4gMjAxMzoKKyAgICAgICAgICA8aW5wdXQgdHlwZT0iZGF0ZSIgaWQ9ImV4YW1wbGVJbnB1dCIgbmFtZT0iaW5wdXQiIG5nLW1vZGVsPSJ2YWx1ZSIKKyAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9Inl5eXktTU0tZGQiIG1pbj0iMjAxMy0wMS0wMSIgbWF4PSIyMDEzLTEyLTMxIiByZXF1aXJlZCAvPgorICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZCI+CisgICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4KKyAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IuZGF0ZSI+CisgICAgICAgICAgICAgIE5vdCBhIHZhbGlkIGRhdGUhPC9zcGFuPgorICAgICAgICAgICA8dHQ+dmFsdWUgPSB7e3ZhbHVlIHwgZGF0ZTogInl5eXktTU0tZGQifX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4KKyAgICAgICA8L2Zvcm0+CisgICAgIDwvZmlsZT4KKyAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQoYnkuYmluZGluZygndmFsdWUgfCBkYXRlOiAieXl5eS1NTS1kZCInKSk7CisgICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTsKKyAgICAgICAgdmFyIGlucHV0ID0gZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSk7CisKKyAgICAgICAgLy8gY3VycmVudGx5IHByb3RyYWN0b3Ivd2ViZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgICAgLy8gc2VuZGluZyBrZXlzIHRvIGFsbCBrbm93biBIVE1MNSBpbnB1dCBjb250cm9scworICAgICAgICAvLyBmb3IgdmFyaW91cyBicm93c2VycyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3Byb3RyYWN0b3IvaXNzdWVzLzU2MikuCisgICAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkgeworICAgICAgICAgIC8vIHNldCB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgYW5kIGZvcmNlIHZhbGlkYXRpb24uCisgICAgICAgICAgdmFyIHNjciA9ICJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyAiICsKKyAgICAgICAgICAiaXB0LnZhbHVlID0gJyIgKyB2YWwgKyAiJzsiICsKKyAgICAgICAgICAiYW5ndWxhci5lbGVtZW50KGlwdCkuc2NvcGUoKS4kYXBwbHkoZnVuY3Rpb24ocykgeyBzLm15Rm9ybVtpcHQubmFtZV0uJHNldFZpZXdWYWx1ZSgnIiArIHZhbCArICInKTsgfSk7IjsKKyAgICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTsKKyAgICAgICAgfQorCisgICAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMjAxMy0xMC0yMicpOworICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IHRydWUnKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgc2V0SW5wdXQoJycpOworICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTsKKyAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpOworICAgICAgICB9KTsKKworICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgb3ZlciBtYXgnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICBzZXRJbnB1dCgnMjAxNS0wMS0wMScpOworICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7CisgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTsKKyAgICAgICAgfSk7CisgICAgIDwvZmlsZT4KKyAgICAgPC9leGFtcGxlPgorICAgICAqLworICAnZGF0ZSc6IGNyZWF0ZURhdGVJbnB1dFR5cGUoJ2RhdGUnLCBEQVRFX1JFR0VYUCwKKyAgICAgICAgIGNyZWF0ZURhdGVQYXJzZXIoREFURV9SRUdFWFAsIFsneXl5eScsICdNTScsICdkZCddKSwKKyAgICAgICAgICd5eXl5LU1NLWRkJyksCisKKyAgIC8qKgorICAgICogQG5nZG9jIGlucHV0CisgICAgKiBAbmFtZSBpbnB1dFtkYXRldGltZS1sb2NhbF0KKyAgICAqCisgICAgKiBAZGVzY3JpcHRpb24KKyAgICAqIElucHV0IHdpdGggZGF0ZXRpbWUgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHlldCBzdXBwb3J0CisgICAgKiB0aGUgSFRNTDUgZGF0ZSBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxCisgICAgKiBsb2NhbCBkYXRldGltZSBmb3JtYXQgKHl5eXktTU0tZGRUSEg6bW06c3MpLCBmb3IgZXhhbXBsZTogYDIwMTAtMTItMjhUMTQ6NTc6MDBgLgorICAgICoKKyAgICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLgorICAgICogSW52YWxpZCBgRGF0ZWAgb2JqZWN0cyAoZGF0ZXMgd2hvc2UgYGdldFRpbWUoKWAgaXMgYE5hTmApIHdpbGwgYmUgcmVuZGVyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLgorICAgICoKKyAgICAqIFRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgY2FuIGJlIGRlZmluZWQgdXNpbmcKKyAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9LiBCeSBkZWZhdWx0LCB0aGlzIGlzIHRoZSB0aW1lem9uZSBvZiB0aGUgYnJvd3Nlci4KKyAgICAqCisgICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uCisgICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuCisgICAgKiBAcGFyYW0ge3N0cmluZz19IG1pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBsZXNzIHRoYW4gYG1pbmAuIFRoaXMgbXVzdCBiZSBhCisgICAgKiB2YWxpZCBJU08gZGF0ZXRpbWUgZm9ybWF0ICh5eXl5LU1NLWRkVEhIOm1tOnNzKS4KKyAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbWF4IFNldHMgdGhlIGBtYXhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGdyZWF0ZXIgdGhhbiBgbWF4YC4gVGhpcyBtdXN0IGJlCisgICAgKiBhIHZhbGlkIElTTyBkYXRldGltZSBmb3JtYXQgKHl5eXktTU0tZGRUSEg6bW06c3MpLgorICAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLgorICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvCisgICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZgorICAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuCisgICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXIKKyAgICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuCisgICAgKgorICAgICogQGV4YW1wbGUKKyAgICA8ZXhhbXBsZSBuYW1lPSJkYXRldGltZWxvY2FsLWlucHV0LWRpcmVjdGl2ZSIgbW9kdWxlPSJkYXRlRXhhbXBsZSI+CisgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICA8c2NyaXB0PgorICAgICAgICBhbmd1bGFyLm1vZHVsZSgnZGF0ZUV4YW1wbGUnLCBbXSkKKyAgICAgICAgICAuY29udHJvbGxlcignRGF0ZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgICAgICAgJHNjb3BlLnZhbHVlID0gbmV3IERhdGUoMjAxMCwgMTEsIDI4LCAxNCwgNTcpOworICAgICAgICAgIH1dKTsKKyAgICAgIDwvc2NyaXB0PgorICAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJEYXRlQ29udHJvbGxlciBhcyBkYXRlQ3RybCI+CisgICAgICAgIFBpY2sgYSBkYXRlIGJldHdlZW4gaW4gMjAxMzoKKyAgICAgICAgPGlucHV0IHR5cGU9ImRhdGV0aW1lLWxvY2FsIiBpZD0iZXhhbXBsZUlucHV0IiBuYW1lPSJpbnB1dCIgbmctbW9kZWw9InZhbHVlIgorICAgICAgICAgICAgcGxhY2Vob2xkZXI9Inl5eXktTU0tZGRUSEg6bW06c3MiIG1pbj0iMjAwMS0wMS0wMVQwMDowMDowMCIgbWF4PSIyMDEzLTEyLTMxVDAwOjAwOjAwIiByZXF1aXJlZCAvPgorICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQiPgorICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPgorICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IuZGF0ZXRpbWVsb2NhbCI+CisgICAgICAgICAgICBOb3QgYSB2YWxpZCBkYXRlITwvc3Bhbj4KKyAgICAgICAgPHR0PnZhbHVlID0ge3t2YWx1ZSB8IGRhdGU6ICJ5eXl5LU1NLWRkVEhIOm1tOnNzIn19PC90dD48YnIvPgorICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiR2YWxpZCA9IHt7bXlGb3JtLmlucHV0LiR2YWxpZH19PC90dD48YnIvPgorICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPgorICAgICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnIvPgorICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxici8+CisgICAgICA8L2Zvcm0+CisgICAgPC9maWxlPgorICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCd2YWx1ZSB8IGRhdGU6ICJ5eXl5LU1NLWRkVEhIOm1tOnNzIicpKTsKKyAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTsKKyAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpOworCisgICAgICAvLyBjdXJyZW50bHkgcHJvdHJhY3Rvci93ZWJkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydAorICAgICAgLy8gc2VuZGluZyBrZXlzIHRvIGFsbCBrbm93biBIVE1MNSBpbnB1dCBjb250cm9scworICAgICAgLy8gZm9yIHZhcmlvdXMgYnJvd3NlcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3Byb3RyYWN0b3IvaXNzdWVzLzU2MikuCisgICAgICBmdW5jdGlvbiBzZXRJbnB1dCh2YWwpIHsKKyAgICAgICAgLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhbmQgZm9yY2UgdmFsaWRhdGlvbi4KKyAgICAgICAgdmFyIHNjciA9ICJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyAiICsKKyAgICAgICAgImlwdC52YWx1ZSA9ICciICsgdmFsICsgIic7IiArCisgICAgICAgICJhbmd1bGFyLmVsZW1lbnQoaXB0KS5zY29wZSgpLiRhcHBseShmdW5jdGlvbihzKSB7IHMubXlGb3JtW2lwdC5uYW1lXS4kc2V0Vmlld1ZhbHVlKCciICsgdmFsICsgIicpOyB9KTsiOworICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTsKKyAgICAgIH0KKworICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7CisgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMjAxMC0xMi0yOFQxNDo1NzowMCcpOworICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSB0cnVlJyk7CisgICAgICB9KTsKKworICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7CisgICAgICAgIHNldElucHV0KCcnKTsKKyAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpOworICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpOworICAgICAgfSk7CisKKyAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBvdmVyIG1heCcsIGZ1bmN0aW9uKCkgeworICAgICAgICBzZXRJbnB1dCgnMjAxNS0wMS0wMVQyMzo1OTowMCcpOworICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJycpOworICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpOworICAgICAgfSk7CisgICAgPC9maWxlPgorICAgIDwvZXhhbXBsZT4KKyAgICAqLworICAnZGF0ZXRpbWUtbG9jYWwnOiBjcmVhdGVEYXRlSW5wdXRUeXBlKCdkYXRldGltZWxvY2FsJywgREFURVRJTUVMT0NBTF9SRUdFWFAsCisgICAgICBjcmVhdGVEYXRlUGFyc2VyKERBVEVUSU1FTE9DQUxfUkVHRVhQLCBbJ3l5eXknLCAnTU0nLCAnZGQnLCAnSEgnLCAnbW0nLCAnc3MnLCAnc3NzJ10pLAorICAgICAgJ3l5eXktTU0tZGRUSEg6bW06c3Muc3NzJyksCisKKyAgLyoqCisgICAqIEBuZ2RvYyBpbnB1dAorICAgKiBAbmFtZSBpbnB1dFt0aW1lXQorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogSW5wdXQgd2l0aCB0aW1lIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uLiBJbiBicm93c2VycyB0aGF0IGRvIG5vdCB5ZXQgc3VwcG9ydAorICAgKiB0aGUgSFRNTDUgZGF0ZSBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxCisgICAqIGxvY2FsIHRpbWUgZm9ybWF0IChISDptbTpzcyksIGZvciBleGFtcGxlOiBgMTQ6NTc6MDBgLiBNb2RlbCBtdXN0IGJlIGEgRGF0ZSBvYmplY3QuIFRoaXMgYmluZGluZyB3aWxsIGFsd2F5cyBvdXRwdXQgYQorICAgKiBEYXRlIG9iamVjdCB0byB0aGUgbW9kZWwgb2YgSmFudWFyeSAxLCAxOTcwLCBvciBsb2NhbCBkYXRlIGBuZXcgRGF0ZSgxOTcwLCAwLCAxLCBISCwgbW0sIHNzKWAuCisgICAqCisgICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLgorICAgKiBJbnZhbGlkIGBEYXRlYCBvYmplY3RzIChkYXRlcyB3aG9zZSBgZ2V0VGltZSgpYCBpcyBgTmFOYCkgd2lsbCBiZSByZW5kZXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCisgICAqCisgICAqIFRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgY2FuIGJlIGRlZmluZWQgdXNpbmcKKyAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30uIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyLgorICAgKgorICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBtaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgbGVzcyB0aGFuIGBtaW5gLiBUaGlzIG11c3QgYmUgYQorICAgKiB2YWxpZCBJU08gdGltZSBmb3JtYXQgKEhIOm1tOnNzKS4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBtYXggU2V0cyB0aGUgYG1heGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgZ3JlYXRlciB0aGFuIGBtYXhgLiBUaGlzIG11c3QgYmUgYQorICAgKiB2YWxpZCBJU08gdGltZSBmb3JtYXQgKEhIOm1tOnNzKS4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLgorICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG8KKyAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2YKKyAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcgorICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LgorICAgKgorICAgKiBAZXhhbXBsZQorICAgPGV4YW1wbGUgbmFtZT0idGltZS1pbnB1dC1kaXJlY3RpdmUiIG1vZHVsZT0idGltZUV4YW1wbGUiPgorICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgIDxzY3JpcHQ+CisgICAgICBhbmd1bGFyLm1vZHVsZSgndGltZUV4YW1wbGUnLCBbXSkKKyAgICAgICAgLmNvbnRyb2xsZXIoJ0RhdGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAgICAgICAgICAkc2NvcGUudmFsdWUgPSBuZXcgRGF0ZSgxOTcwLCAwLCAxLCAxNCwgNTcsIDApOworICAgICAgICB9XSk7CisgICAgIDwvc2NyaXB0PgorICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkRhdGVDb250cm9sbGVyIGFzIGRhdGVDdHJsIj4KKyAgICAgICAgUGljayBhIGJldHdlZW4gOGFtIGFuZCA1cG06CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0aW1lIiBpZD0iZXhhbXBsZUlucHV0IiBuYW1lPSJpbnB1dCIgbmctbW9kZWw9InZhbHVlIgorICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkhIOm1tOnNzIiBtaW49IjA4OjAwOjAwIiBtYXg9IjE3OjAwOjAwIiByZXF1aXJlZCAvPgorICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQiPgorICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPgorICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IudGltZSI+CisgICAgICAgICAgICBOb3QgYSB2YWxpZCBkYXRlITwvc3Bhbj4KKyAgICAgICAgPHR0PnZhbHVlID0ge3t2YWx1ZSB8IGRhdGU6ICJISDptbTpzcyJ9fTwvdHQ+PGJyLz4KKyAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz4KKyAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz4KKyAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz4KKyAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPgorICAgICA8L2Zvcm0+CisgICA8L2ZpbGU+CisgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAgICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQoYnkuYmluZGluZygndmFsdWUgfCBkYXRlOiAiSEg6bW06c3MiJykpOworICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOworICAgICAgdmFyIGlucHV0ID0gZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSk7CisKKyAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0CisgICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzCisgICAgICAvLyBmb3IgdmFyaW91cyBicm93c2VycyAoaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNTYyKS4KKyAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkgeworICAgICAgICAvLyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFuZCBmb3JjZSB2YWxpZGF0aW9uLgorICAgICAgICB2YXIgc2NyID0gInZhciBpcHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhhbXBsZUlucHV0Jyk7ICIgKworICAgICAgICAiaXB0LnZhbHVlID0gJyIgKyB2YWwgKyAiJzsiICsKKyAgICAgICAgImFuZ3VsYXIuZWxlbWVudChpcHQpLnNjb3BlKCkuJGFwcGx5KGZ1bmN0aW9uKHMpIHsgcy5teUZvcm1baXB0Lm5hbWVdLiRzZXRWaWV3VmFsdWUoJyIgKyB2YWwgKyAiJyk7IH0pOyI7CisgICAgICAgIGJyb3dzZXIuZXhlY3V0ZVNjcmlwdChzY3IpOworICAgICAgfQorCisgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9Db250YWluKCcxNDo1NzowMCcpOworICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSB0cnVlJyk7CisgICAgICB9KTsKKworICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7CisgICAgICAgIHNldElucHV0KCcnKTsKKyAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpOworICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpOworICAgICAgfSk7CisKKyAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBvdmVyIG1heCcsIGZ1bmN0aW9uKCkgeworICAgICAgICBzZXRJbnB1dCgnMjM6NTk6MDAnKTsKKyAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9Db250YWluKCcnKTsKKyAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTsKKyAgICAgIH0pOworICAgPC9maWxlPgorICAgPC9leGFtcGxlPgorICAgKi8KKyAgJ3RpbWUnOiBjcmVhdGVEYXRlSW5wdXRUeXBlKCd0aW1lJywgVElNRV9SRUdFWFAsCisgICAgICBjcmVhdGVEYXRlUGFyc2VyKFRJTUVfUkVHRVhQLCBbJ0hIJywgJ21tJywgJ3NzJywgJ3NzcyddKSwKKyAgICAgJ0hIOm1tOnNzLnNzcycpLAorCisgICAvKioKKyAgICAqIEBuZ2RvYyBpbnB1dAorICAgICogQG5hbWUgaW5wdXRbd2Vla10KKyAgICAqCisgICAgKiBAZGVzY3JpcHRpb24KKyAgICAqIElucHV0IHdpdGggd2Vlay1vZi10aGUteWVhciB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbiB0byBEYXRlLiBJbiBicm93c2VycyB0aGF0IGRvIG5vdCB5ZXQgc3VwcG9ydAorICAgICogdGhlIEhUTUw1IHdlZWsgaW5wdXQsIGEgdGV4dCBlbGVtZW50IHdpbGwgYmUgdXNlZC4gSW4gdGhhdCBjYXNlLCB0aGUgdGV4dCBtdXN0IGJlIGVudGVyZWQgaW4gYSB2YWxpZCBJU08tODYwMQorICAgICogd2VlayBmb3JtYXQgKHl5eXktVyMjKSwgZm9yIGV4YW1wbGU6IGAyMDEzLVcwMmAuCisgICAgKgorICAgICogVGhlIG1vZGVsIG11c3QgYWx3YXlzIGJlIGEgRGF0ZSBvYmplY3QsIG90aGVyd2lzZSBBbmd1bGFyIHdpbGwgdGhyb3cgYW4gZXJyb3IuCisgICAgKiBJbnZhbGlkIGBEYXRlYCBvYmplY3RzIChkYXRlcyB3aG9zZSBgZ2V0VGltZSgpYCBpcyBgTmFOYCkgd2lsbCBiZSByZW5kZXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgKgorICAgICogVGhlIHRpbWV6b25lIHRvIGJlIHVzZWQgdG8gcmVhZC93cml0ZSB0aGUgYERhdGVgIGluc3RhbmNlIGluIHRoZSBtb2RlbCBjYW4gYmUgZGVmaW5lZCB1c2luZworICAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30uIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyLgorICAgICoKKyAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4KKyAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4KKyAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbWluYC4gVGhpcyBtdXN0IGJlIGEKKyAgICAqIHZhbGlkIElTTyB3ZWVrIGZvcm1hdCAoeXl5eS1XIyMpLgorICAgICogQHBhcmFtIHtzdHJpbmc9fSBtYXggU2V0cyB0aGUgYG1heGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgZ3JlYXRlciB0aGFuIGBtYXhgLiBUaGlzIG11c3QgYmUKKyAgICAqIGEgdmFsaWQgSVNPIHdlZWsgZm9ybWF0ICh5eXl5LVcjIykuCisgICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuCisgICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG8KKyAgICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mCisgICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4KKyAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcgorICAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC4KKyAgICAqCisgICAgKiBAZXhhbXBsZQorICAgIDxleGFtcGxlIG5hbWU9IndlZWstaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9IndlZWtFeGFtcGxlIj4KKyAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgIDxzY3JpcHQ+CisgICAgICBhbmd1bGFyLm1vZHVsZSgnd2Vla0V4YW1wbGUnLCBbXSkKKyAgICAgICAgLmNvbnRyb2xsZXIoJ0RhdGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAgICAgICAgICAkc2NvcGUudmFsdWUgPSBuZXcgRGF0ZSgyMDEzLCAwLCAzKTsKKyAgICAgICAgfV0pOworICAgICAgPC9zY3JpcHQ+CisgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkRhdGVDb250cm9sbGVyIGFzIGRhdGVDdHJsIj4KKyAgICAgICAgUGljayBhIGRhdGUgYmV0d2VlbiBpbiAyMDEzOgorICAgICAgICA8aW5wdXQgaWQ9ImV4YW1wbGVJbnB1dCIgdHlwZT0id2VlayIgbmFtZT0iaW5wdXQiIG5nLW1vZGVsPSJ2YWx1ZSIKKyAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJZWVlZLVcjIyIgbWluPSIyMDEyLVczMiIgbWF4PSIyMDEzLVc1MiIgcmVxdWlyZWQgLz4KKyAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkIj4KKyAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4KKyAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLndlZWsiPgorICAgICAgICAgICAgTm90IGEgdmFsaWQgZGF0ZSE8L3NwYW4+CisgICAgICAgIDx0dD52YWx1ZSA9IHt7dmFsdWUgfCBkYXRlOiAieXl5eS1Xd3cifX08L3R0Pjxici8+CisgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+CisgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+CisgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+CisgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4KKyAgICAgIDwvZm9ybT4KKyAgICA8L2ZpbGU+CisgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICB2YXIgdmFsdWUgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3ZhbHVlIHwgZGF0ZTogInl5eXktV3d3IicpKTsKKyAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTsKKyAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpOworCisgICAgICAvLyBjdXJyZW50bHkgcHJvdHJhY3Rvci93ZWJkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydAorICAgICAgLy8gc2VuZGluZyBrZXlzIHRvIGFsbCBrbm93biBIVE1MNSBpbnB1dCBjb250cm9scworICAgICAgLy8gZm9yIHZhcmlvdXMgYnJvd3NlcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3Byb3RyYWN0b3IvaXNzdWVzLzU2MikuCisgICAgICBmdW5jdGlvbiBzZXRJbnB1dCh2YWwpIHsKKyAgICAgICAgLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhbmQgZm9yY2UgdmFsaWRhdGlvbi4KKyAgICAgICAgdmFyIHNjciA9ICJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyAiICsKKyAgICAgICAgImlwdC52YWx1ZSA9ICciICsgdmFsICsgIic7IiArCisgICAgICAgICJhbmd1bGFyLmVsZW1lbnQoaXB0KS5zY29wZSgpLiRhcHBseShmdW5jdGlvbihzKSB7IHMubXlGb3JtW2lwdC5uYW1lXS4kc2V0Vmlld1ZhbHVlKCciICsgdmFsICsgIicpOyB9KTsiOworICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTsKKyAgICAgIH0KKworICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7CisgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMjAxMy1XMDEnKTsKKyAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gdHJ1ZScpOworICAgICAgfSk7CisKKyAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkgeworICAgICAgICBzZXRJbnB1dCgnJyk7CisgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTsKKyAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTsKKyAgICAgIH0pOworCisgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgb3ZlciBtYXgnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgc2V0SW5wdXQoJzIwMTUtVzAxJyk7CisgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7CisgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7CisgICAgICB9KTsKKyAgICA8L2ZpbGU+CisgICAgPC9leGFtcGxlPgorICAgICovCisgICd3ZWVrJzogY3JlYXRlRGF0ZUlucHV0VHlwZSgnd2VlaycsIFdFRUtfUkVHRVhQLCB3ZWVrUGFyc2VyLCAneXl5eS1Xd3cnKSwKKworICAvKioKKyAgICogQG5nZG9jIGlucHV0CisgICAqIEBuYW1lIGlucHV0W21vbnRoXQorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogSW5wdXQgd2l0aCBtb250aCB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbi4gSW4gYnJvd3NlcnMgdGhhdCBkbyBub3QgeWV0IHN1cHBvcnQKKyAgICogdGhlIEhUTUw1IG1vbnRoIGlucHV0LCBhIHRleHQgZWxlbWVudCB3aWxsIGJlIHVzZWQuIEluIHRoYXQgY2FzZSwgdGhlIHRleHQgbXVzdCBiZSBlbnRlcmVkIGluIGEgdmFsaWQgSVNPLTg2MDEKKyAgICogbW9udGggZm9ybWF0ICh5eXl5LU1NKSwgZm9yIGV4YW1wbGU6IGAyMDA5LTAxYC4KKyAgICoKKyAgICogVGhlIG1vZGVsIG11c3QgYWx3YXlzIGJlIGEgRGF0ZSBvYmplY3QsIG90aGVyd2lzZSBBbmd1bGFyIHdpbGwgdGhyb3cgYW4gZXJyb3IuCisgICAqIEludmFsaWQgYERhdGVgIG9iamVjdHMgKGRhdGVzIHdob3NlIGBnZXRUaW1lKClgIGlzIGBOYU5gKSB3aWxsIGJlIHJlbmRlcmVkIGFzIGFuIGVtcHR5IHN0cmluZy4KKyAgICogSWYgdGhlIG1vZGVsIGlzIG5vdCBzZXQgdG8gdGhlIGZpcnN0IG9mIHRoZSBtb250aCwgdGhlIG5leHQgdmlldyB0byBtb2RlbCB1cGRhdGUgd2lsbCBzZXQgaXQKKyAgICogdG8gdGhlIGZpcnN0IG9mIHRoZSBtb250aC4KKyAgICoKKyAgICogVGhlIHRpbWV6b25lIHRvIGJlIHVzZWQgdG8gcmVhZC93cml0ZSB0aGUgYERhdGVgIGluc3RhbmNlIGluIHRoZSBtb2RlbCBjYW4gYmUgZGVmaW5lZCB1c2luZworICAgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nTW9kZWxPcHRpb25zIG5nTW9kZWxPcHRpb25zfS4gQnkgZGVmYXVsdCwgdGhpcyBpcyB0aGUgdGltZXpvbmUgb2YgdGhlIGJyb3dzZXIuCisgICAqCisgICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLgorICAgKiBAcGFyYW0ge3N0cmluZz19IG1pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBsZXNzIHRoYW4gYG1pbmAuIFRoaXMgbXVzdCBiZQorICAgKiBhIHZhbGlkIElTTyBtb250aCBmb3JtYXQgKHl5eXktTU0pLgorICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuIFRoaXMgbXVzdAorICAgKiBiZSBhIHZhbGlkIElTTyBtb250aCBmb3JtYXQgKHl5eXktTU0pLgorICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0bworICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZgorICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyCisgICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuCisgICAqCisgICAqIEBleGFtcGxlCisgICA8ZXhhbXBsZSBuYW1lPSJtb250aC1pbnB1dC1kaXJlY3RpdmUiIG1vZHVsZT0ibW9udGhFeGFtcGxlIj4KKyAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICA8c2NyaXB0PgorICAgICAgYW5ndWxhci5tb2R1bGUoJ21vbnRoRXhhbXBsZScsIFtdKQorICAgICAgICAuY29udHJvbGxlcignRGF0ZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgICAgICRzY29wZS52YWx1ZSA9IG5ldyBEYXRlKDIwMTMsIDksIDEpOworICAgICAgICB9XSk7CisgICAgIDwvc2NyaXB0PgorICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkRhdGVDb250cm9sbGVyIGFzIGRhdGVDdHJsIj4KKyAgICAgICBQaWNrIGEgbW9udGggaW50IDIwMTM6CisgICAgICAgPGlucHV0IGlkPSJleGFtcGxlSW5wdXQiIHR5cGU9Im1vbnRoIiBuYW1lPSJpbnB1dCIgbmctbW9kZWw9InZhbHVlIgorICAgICAgICAgIHBsYWNlaG9sZGVyPSJ5eXl5LU1NIiBtaW49IjIwMTMtMDEiIG1heD0iMjAxMy0xMiIgcmVxdWlyZWQgLz4KKyAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQiPgorICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4KKyAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IubW9udGgiPgorICAgICAgICAgIE5vdCBhIHZhbGlkIG1vbnRoITwvc3Bhbj4KKyAgICAgICA8dHQ+dmFsdWUgPSB7e3ZhbHVlIHwgZGF0ZTogInl5eXktTU0ifX08L3R0Pjxici8+CisgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz4KKyAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPgorICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+CisgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPgorICAgICA8L2Zvcm0+CisgICA8L2ZpbGU+CisgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAgICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQoYnkuYmluZGluZygndmFsdWUgfCBkYXRlOiAieXl5eS1NTSInKSk7CisgICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7CisgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKTsKKworICAgICAgLy8gY3VycmVudGx5IHByb3RyYWN0b3Ivd2ViZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgIC8vIHNlbmRpbmcga2V5cyB0byBhbGwga25vd24gSFRNTDUgaW5wdXQgY29udHJvbHMKKyAgICAgIC8vIGZvciB2YXJpb3VzIGJyb3dzZXJzIChodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9wcm90cmFjdG9yL2lzc3Vlcy81NjIpLgorICAgICAgZnVuY3Rpb24gc2V0SW5wdXQodmFsKSB7CisgICAgICAgIC8vIHNldCB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgYW5kIGZvcmNlIHZhbGlkYXRpb24uCisgICAgICAgIHZhciBzY3IgPSAidmFyIGlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlSW5wdXQnKTsgIiArCisgICAgICAgICJpcHQudmFsdWUgPSAnIiArIHZhbCArICInOyIgKworICAgICAgICAiYW5ndWxhci5lbGVtZW50KGlwdCkuc2NvcGUoKS4kYXBwbHkoZnVuY3Rpb24ocykgeyBzLm15Rm9ybVtpcHQubmFtZV0uJHNldFZpZXdWYWx1ZSgnIiArIHZhbCArICInKTsgfSk7IjsKKyAgICAgICAgYnJvd3Nlci5leGVjdXRlU2NyaXB0KHNjcik7CisgICAgICB9CisKKyAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgeworICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzIwMTMtMTAnKTsKKyAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gdHJ1ZScpOworICAgICAgfSk7CisKKyAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkgeworICAgICAgICBzZXRJbnB1dCgnJyk7CisgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTsKKyAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTsKKyAgICAgIH0pOworCisgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgb3ZlciBtYXgnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgc2V0SW5wdXQoJzIwMTUtMDEnKTsKKyAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9Db250YWluKCcnKTsKKyAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTsKKyAgICAgIH0pOworICAgPC9maWxlPgorICAgPC9leGFtcGxlPgorICAgKi8KKyAgJ21vbnRoJzogY3JlYXRlRGF0ZUlucHV0VHlwZSgnbW9udGgnLCBNT05USF9SRUdFWFAsCisgICAgIGNyZWF0ZURhdGVQYXJzZXIoTU9OVEhfUkVHRVhQLCBbJ3l5eXknLCAnTU0nXSksCisgICAgICd5eXl5LU1NJyksCisKKyAgLyoqCisgICAqIEBuZ2RvYyBpbnB1dAorICAgKiBAbmFtZSBpbnB1dFtudW1iZXJdCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBUZXh0IGlucHV0IHdpdGggbnVtYmVyIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uLiBTZXRzIHRoZSBgbnVtYmVyYCB2YWxpZGF0aW9uCisgICAqIGVycm9yIGlmIG5vdCBhIHZhbGlkIG51bWJlci4KKyAgICoKKyAgICogVGhlIG1vZGVsIG11c3QgYWx3YXlzIGJlIGEgbnVtYmVyLCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLgorICAgKgorICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBtaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgbGVzcyB0aGFuIGBtaW5gLgorICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvCisgICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mCisgICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLgorICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWlubGVuZ3RoIFNldHMgYG1pbmxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIHNob3J0ZXIgdGhhbgorICAgKiAgICBtaW5sZW5ndGguCisgICAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNYXhsZW5ndGggU2V0cyBgbWF4bGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbG9uZ2VyIHRoYW4KKyAgICogICAgbWF4bGVuZ3RoLiBTZXR0aW5nIHRoZSBhdHRyaWJ1dGUgdG8gYSBuZWdhdGl2ZSBvciBub24tbnVtZXJpYyB2YWx1ZSwgYWxsb3dzIHZpZXcgdmFsdWVzIG9mCisgICAqICAgIGFueSBsZW5ndGguCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gcGF0dGVybiBTaW1pbGFyIHRvIGBuZ1BhdHRlcm5gIGV4Y2VwdCB0aGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgdGhlIGFjdHVhbCBzdHJpbmcKKyAgICogICAgdGhhdCBjb250YWlucyB0aGUgcmVndWxhciBleHByZXNzaW9uIGJvZHkgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiAgICBhcyBpbiB0aGUgbmdQYXR0ZXJuIGRpcmVjdGl2ZS4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1BhdHRlcm4gU2V0cyBgcGF0dGVybmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIG5nTW9kZWwgdmFsdWUgZG9lcyBub3QgbWF0Y2gKKyAgICogICAgYSBSZWdFeHAgZm91bmQgYnkgZXZhbHVhdGluZyB0aGUgQW5ndWxhciBleHByZXNzaW9uIGdpdmVuIGluIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCisgICAqICAgIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIFJlZ0V4cCBvYmplY3QgdGhlbiB0aGlzIGlzIHVzZWQgZGlyZWN0bHkuCisgICAqICAgIElmIHRoZSBleHByZXNzaW9uIGlzIGEgc3RyaW5nIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBSZWdFeHAgYWZ0ZXIgd3JhcHBpbmcgaXQgaW4gYF5gIGFuZCBgJGAKKyAgICogICAgY2hhcmFjdGVycy4gRm9yIGluc3RhbmNlLCBgImFiYyJgIHdpbGwgYmUgY29udmVydGVkIHRvIGBuZXcgUmVnRXhwKCdeYWJjJCcpYC4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyCisgICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuCisgICAqCisgICAqIEBleGFtcGxlCisgICAgICA8ZXhhbXBsZSBuYW1lPSJudW1iZXItaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9Im51bWJlckV4YW1wbGUiPgorICAgICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICAgIDxzY3JpcHQ+CisgICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdudW1iZXJFeGFtcGxlJywgW10pCisgICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAgICAgICAgICAgICAgICRzY29wZS52YWx1ZSA9IDEyOworICAgICAgICAgICAgIH1dKTsKKyAgICAgICAgIDwvc2NyaXB0PgorICAgICAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgICAgICAgICAgIE51bWJlcjogPGlucHV0IHR5cGU9Im51bWJlciIgbmFtZT0iaW5wdXQiIG5nLW1vZGVsPSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPSIwIiBtYXg9Ijk5IiByZXF1aXJlZD4KKyAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkIj4KKyAgICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+CisgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLmlucHV0LiRlcnJvci5udW1iZXIiPgorICAgICAgICAgICAgIE5vdCB2YWxpZCBudW1iZXIhPC9zcGFuPgorICAgICAgICAgICA8dHQ+dmFsdWUgPSB7e3ZhbHVlfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4KKyAgICAgICAgICA8L2Zvcm0+CisgICAgICAgIDwvZmlsZT4KKyAgICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCd2YWx1ZScpKTsKKyAgICAgICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7CisgICAgICAgICAgdmFyIGlucHV0ID0gZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSk7CisKKyAgICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMTInKTsKKyAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOworICAgICAgICAgIH0pOworCisgICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpbnB1dC5jbGVhcigpOworICAgICAgICAgICAgaW5wdXQuc2VuZEtleXMoJycpOworICAgICAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpOworICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOworICAgICAgICAgIH0pOworCisgICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG92ZXIgbWF4JywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpbnB1dC5jbGVhcigpOworICAgICAgICAgICAgaW5wdXQuc2VuZEtleXMoJzEyMycpOworICAgICAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpOworICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOworICAgICAgICAgIH0pOworICAgICAgICA8L2ZpbGU+CisgICAgICA8L2V4YW1wbGU+CisgICAqLworICAnbnVtYmVyJzogbnVtYmVySW5wdXRUeXBlLAorCisKKyAgLyoqCisgICAqIEBuZ2RvYyBpbnB1dAorICAgKiBAbmFtZSBpbnB1dFt1cmxdCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBUZXh0IGlucHV0IHdpdGggVVJMIHZhbGlkYXRpb24uIFNldHMgdGhlIGB1cmxgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSBjb250ZW50IGlzIG5vdCBhCisgICAqIHZhbGlkIFVSTC4KKyAgICoKKyAgICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+CisgICAqICoqTm90ZToqKiBgaW5wdXRbdXJsXWAgdXNlcyBhIHJlZ2V4IHRvIHZhbGlkYXRlIHVybHMgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIHJlZ2V4CisgICAqIHVzZWQgaW4gQ2hyb21pdW0uIElmIHlvdSBuZWVkIHN0cmljdGVyIHZhbGlkYXRpb24sIHlvdSBjYW4gdXNlIGBuZy1wYXR0ZXJuYCBvciBtb2RpZnkKKyAgICogdGhlIGJ1aWx0LWluIHZhbGlkYXRvcnMgKHNlZSB0aGUge0BsaW5rIGd1aWRlL2Zvcm1zIEZvcm1zIGd1aWRlfSkKKyAgICogPC9kaXY+CisgICAqCisgICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLgorICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0bworICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZgorICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4KKyAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW4KKyAgICogICAgbWlubGVuZ3RoLgorICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuCisgICAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZgorICAgKiAgICBhbnkgbGVuZ3RoLgorICAgKiBAcGFyYW0ge3N0cmluZz19IHBhdHRlcm4gU2ltaWxhciB0byBgbmdQYXR0ZXJuYCBleGNlcHQgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBhY3R1YWwgc3RyaW5nCisgICAqICAgIHRoYXQgY29udGFpbnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBib2R5IHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgYXMgaW4gdGhlIG5nUGF0dGVybiBkaXJlY3RpdmUuCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdQYXR0ZXJuIFNldHMgYHBhdHRlcm5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSBuZ01vZGVsIHZhbHVlIGRvZXMgbm90IG1hdGNoCisgICAqICAgIGEgUmVnRXhwIGZvdW5kIGJ5IGV2YWx1YXRpbmcgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgYXR0cmlidXRlIHZhbHVlLgorICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBSZWdFeHAgb2JqZWN0IHRoZW4gdGhpcyBpcyB1c2VkIGRpcmVjdGx5LgorICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIHN0cmluZyB0aGVuIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgUmVnRXhwIGFmdGVyIHdyYXBwaW5nIGl0IGluIGBeYCBhbmQgYCRgCisgICAqICAgIGNoYXJhY3RlcnMuIEZvciBpbnN0YW5jZSwgYCJhYmMiYCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgbmV3IFJlZ0V4cCgnXmFiYyQnKWAuCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcgorICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LgorICAgKgorICAgKiBAZXhhbXBsZQorICAgICAgPGV4YW1wbGUgbmFtZT0idXJsLWlucHV0LWRpcmVjdGl2ZSIgbW9kdWxlPSJ1cmxFeGFtcGxlIj4KKyAgICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICAgICA8c2NyaXB0PgorICAgICAgICAgICBhbmd1bGFyLm1vZHVsZSgndXJsRXhhbXBsZScsIFtdKQorICAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgICAgICAgICAkc2NvcGUudGV4dCA9ICdodHRwOi8vZ29vZ2xlLmNvbSc7CisgICAgICAgICAgICAgfV0pOworICAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iIG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KKyAgICAgICAgICAgVVJMOiA8aW5wdXQgdHlwZT0idXJsIiBuYW1lPSJpbnB1dCIgbmctbW9kZWw9InRleHQiIHJlcXVpcmVkPgorICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQiPgorICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4KKyAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLnVybCI+CisgICAgICAgICAgICAgTm90IHZhbGlkIHVybCE8L3NwYW4+CisgICAgICAgICAgIDx0dD50ZXh0ID0ge3t0ZXh0fX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+CisgICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4KKyAgICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IudXJsID0ge3shIW15Rm9ybS4kZXJyb3IudXJsfX08L3R0Pjxici8+CisgICAgICAgICAgPC9mb3JtPgorICAgICAgICA8L2ZpbGU+CisgICAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgICAgIHZhciB0ZXh0ID0gZWxlbWVudChieS5iaW5kaW5nKCd0ZXh0JykpOworICAgICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTsKKyAgICAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd0ZXh0JykpOworCisgICAgICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBleHBlY3QodGV4dC5nZXRUZXh0KCkpLnRvQ29udGFpbignaHR0cDovL2dvb2dsZS5jb20nKTsKKyAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOworICAgICAgICAgIH0pOworCisgICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBpbnB1dC5jbGVhcigpOworICAgICAgICAgICAgaW5wdXQuc2VuZEtleXMoJycpOworCisgICAgICAgICAgICBleHBlY3QodGV4dC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3RleHQgPScpOworICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOworICAgICAgICAgIH0pOworCisgICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG5vdCB1cmwnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7CisgICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnYm94Jyk7CisKKyAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgPC9maWxlPgorICAgICAgPC9leGFtcGxlPgorICAgKi8KKyAgJ3VybCc6IHVybElucHV0VHlwZSwKKworCisgIC8qKgorICAgKiBAbmdkb2MgaW5wdXQKKyAgICogQG5hbWUgaW5wdXRbZW1haWxdCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBUZXh0IGlucHV0IHdpdGggZW1haWwgdmFsaWRhdGlvbi4gU2V0cyB0aGUgYGVtYWlsYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiBub3QgYSB2YWxpZCBlbWFpbAorICAgKiBhZGRyZXNzLgorICAgKgorICAgKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC13YXJuaW5nIj4KKyAgICogKipOb3RlOioqIGBpbnB1dFtlbWFpbF1gIHVzZXMgYSByZWdleCB0byB2YWxpZGF0ZSBlbWFpbCBhZGRyZXNzZXMgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIHJlZ2V4CisgICAqIHVzZWQgaW4gQ2hyb21pdW0uIElmIHlvdSBuZWVkIHN0cmljdGVyIHZhbGlkYXRpb24gKGUuZy4gcmVxdWlyaW5nIGEgdG9wLWxldmVsIGRvbWFpbiksIHlvdSBjYW4KKyAgICogdXNlIGBuZy1wYXR0ZXJuYCBvciBtb2RpZnkgdGhlIGJ1aWx0LWluIHZhbGlkYXRvcnMgKHNlZSB0aGUge0BsaW5rIGd1aWRlL2Zvcm1zIEZvcm1zIGd1aWRlfSkKKyAgICogPC9kaXY+CisgICAqCisgICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLgorICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0bworICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZgorICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4KKyAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW4KKyAgICogICAgbWlubGVuZ3RoLgorICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuCisgICAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZgorICAgKiAgICBhbnkgbGVuZ3RoLgorICAgKiBAcGFyYW0ge3N0cmluZz19IHBhdHRlcm4gU2ltaWxhciB0byBgbmdQYXR0ZXJuYCBleGNlcHQgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBhY3R1YWwgc3RyaW5nCisgICAqICAgIHRoYXQgY29udGFpbnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBib2R5IHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgYXMgaW4gdGhlIG5nUGF0dGVybiBkaXJlY3RpdmUuCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdQYXR0ZXJuIFNldHMgYHBhdHRlcm5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSBuZ01vZGVsIHZhbHVlIGRvZXMgbm90IG1hdGNoCisgICAqICAgIGEgUmVnRXhwIGZvdW5kIGJ5IGV2YWx1YXRpbmcgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgYXR0cmlidXRlIHZhbHVlLgorICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBSZWdFeHAgb2JqZWN0IHRoZW4gdGhpcyBpcyB1c2VkIGRpcmVjdGx5LgorICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIHN0cmluZyB0aGVuIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgUmVnRXhwIGFmdGVyIHdyYXBwaW5nIGl0IGluIGBeYCBhbmQgYCRgCisgICAqICAgIGNoYXJhY3RlcnMuIEZvciBpbnN0YW5jZSwgYCJhYmMiYCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgbmV3IFJlZ0V4cCgnXmFiYyQnKWAuCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcgorICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LgorICAgKgorICAgKiBAZXhhbXBsZQorICAgICAgPGV4YW1wbGUgbmFtZT0iZW1haWwtaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9ImVtYWlsRXhhbXBsZSI+CisgICAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgICAgPHNjcmlwdD4KKyAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2VtYWlsRXhhbXBsZScsIFtdKQorICAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgICAgICAgICAkc2NvcGUudGV4dCA9ICdtZUBleGFtcGxlLmNvbSc7CisgICAgICAgICAgICAgfV0pOworICAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgICAgIDxmb3JtIG5hbWU9Im15Rm9ybSIgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgICAgICAgIEVtYWlsOiA8aW5wdXQgdHlwZT0iZW1haWwiIG5hbWU9ImlucHV0IiBuZy1tb2RlbD0idGV4dCIgcmVxdWlyZWQ+CisgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkIj4KKyAgICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj4KKyAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5pbnB1dC4kZXJyb3IuZW1haWwiPgorICAgICAgICAgICAgICAgTm90IHZhbGlkIGVtYWlsITwvc3Bhbj4KKyAgICAgICAgICAgICA8dHQ+dGV4dCA9IHt7dGV4dH19PC90dD48YnIvPgorICAgICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+CisgICAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz4KKyAgICAgICAgICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnIvPgorICAgICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz4KKyAgICAgICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5lbWFpbCA9IHt7ISFteUZvcm0uJGVycm9yLmVtYWlsfX08L3R0Pjxici8+CisgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgIDwvZmlsZT4KKyAgICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgICAgdmFyIHRleHQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3RleHQnKSk7CisgICAgICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpOworICAgICAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3RleHQnKSk7CisKKyAgICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9Db250YWluKCdtZUBleGFtcGxlLmNvbScpOworICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7CisgICAgICAgICAgfSk7CisKKyAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7CisgICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnJyk7CisgICAgICAgICAgICBleHBlY3QodGV4dC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3RleHQgPScpOworICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOworICAgICAgICAgIH0pOworCisgICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG5vdCBlbWFpbCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTsKKyAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCd4eHgnKTsKKworICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOworICAgICAgICAgIH0pOworICAgICAgICA8L2ZpbGU+CisgICAgICA8L2V4YW1wbGU+CisgICAqLworICAnZW1haWwnOiBlbWFpbElucHV0VHlwZSwKKworCisgIC8qKgorICAgKiBAbmdkb2MgaW5wdXQKKyAgICogQG5hbWUgaW5wdXRbcmFkaW9dCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBIVE1MIHJhZGlvIGJ1dHRvbi4KKyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLgorICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBleHByZXNzaW9uIHNob3VsZCBiZSBzZXQgd2hlbiBzZWxlY3RlZC4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLgorICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXIKKyAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC4KKyAgICogQHBhcmFtIHtzdHJpbmd9IG5nVmFsdWUgQW5ndWxhciBleHByZXNzaW9uIHdoaWNoIHNldHMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBleHByZXNzaW9uIHNob3VsZAorICAgKiAgICBiZSBzZXQgd2hlbiBzZWxlY3RlZC4KKyAgICoKKyAgICogQGV4YW1wbGUKKyAgICAgIDxleGFtcGxlIG5hbWU9InJhZGlvLWlucHV0LWRpcmVjdGl2ZSIgbW9kdWxlPSJyYWRpb0V4YW1wbGUiPgorICAgICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICAgIDxzY3JpcHQ+CisgICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdyYWRpb0V4YW1wbGUnLCBbXSkKKyAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgICAgICAgICAgJHNjb3BlLmNvbG9yID0gJ2JsdWUnOworICAgICAgICAgICAgICAgJHNjb3BlLnNwZWNpYWxWYWx1ZSA9IHsKKyAgICAgICAgICAgICAgICAgImlkIjogIjEyMzQ1IiwKKyAgICAgICAgICAgICAgICAgInZhbHVlIjogImdyZWVuIgorICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICB9XSk7CisgICAgICAgICA8L3NjcmlwdD4KKyAgICAgICAgIDxmb3JtIG5hbWU9Im15Rm9ybSIgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5nLW1vZGVsPSJjb2xvciIgdmFsdWU9InJlZCI+ICBSZWQgPGJyLz4KKyAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuZy1tb2RlbD0iY29sb3IiIG5nLXZhbHVlPSJzcGVjaWFsVmFsdWUiPiBHcmVlbiA8YnIvPgorICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5nLW1vZGVsPSJjb2xvciIgdmFsdWU9ImJsdWUiPiBCbHVlIDxici8+CisgICAgICAgICAgIDx0dD5jb2xvciA9IHt7Y29sb3IgfCBqc29ufX08L3R0Pjxici8+CisgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgIE5vdGUgdGhhdCBgbmctdmFsdWU9InNwZWNpYWxWYWx1ZSJgIHNldHMgcmFkaW8gaXRlbSdzIHZhbHVlIHRvIGJlIHRoZSB2YWx1ZSBvZiBgJHNjb3BlLnNwZWNpYWxWYWx1ZWAuCisgICAgICAgIDwvZmlsZT4KKyAgICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgICAgaXQoJ3Nob3VsZCBjaGFuZ2Ugc3RhdGUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBjb2xvciA9IGVsZW1lbnQoYnkuYmluZGluZygnY29sb3InKSk7CisKKyAgICAgICAgICAgIGV4cGVjdChjb2xvci5nZXRUZXh0KCkpLnRvQ29udGFpbignYmx1ZScpOworCisgICAgICAgICAgICBlbGVtZW50LmFsbChieS5tb2RlbCgnY29sb3InKSkuZ2V0KDApLmNsaWNrKCk7CisKKyAgICAgICAgICAgIGV4cGVjdChjb2xvci5nZXRUZXh0KCkpLnRvQ29udGFpbigncmVkJyk7CisgICAgICAgICAgfSk7CisgICAgICAgIDwvZmlsZT4KKyAgICAgIDwvZXhhbXBsZT4KKyAgICovCisgICdyYWRpbyc6IHJhZGlvSW5wdXRUeXBlLAorCisKKyAgLyoqCisgICAqIEBuZ2RvYyBpbnB1dAorICAgKiBAbmFtZSBpbnB1dFtjaGVja2JveF0KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIEhUTUwgY2hlY2tib3guCisgICAqCisgICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4KKyAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLgorICAgKiBAcGFyYW0ge2V4cHJlc3Npb249fSBuZ1RydWVWYWx1ZSBUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIHNldCB3aGVuIHNlbGVjdGVkLgorICAgKiBAcGFyYW0ge2V4cHJlc3Npb249fSBuZ0ZhbHNlVmFsdWUgVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBleHByZXNzaW9uIHNob3VsZCBiZSBzZXQgd2hlbiBub3Qgc2VsZWN0ZWQuCisgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlcgorICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LgorICAgKgorICAgKiBAZXhhbXBsZQorICAgICAgPGV4YW1wbGUgbmFtZT0iY2hlY2tib3gtaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9ImNoZWNrYm94RXhhbXBsZSI+CisgICAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgICAgPHNjcmlwdD4KKyAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2NoZWNrYm94RXhhbXBsZScsIFtdKQorICAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgICAgICAgICAkc2NvcGUudmFsdWUxID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICRzY29wZS52YWx1ZTIgPSAnWUVTJworICAgICAgICAgICAgIH1dKTsKKyAgICAgICAgIDwvc2NyaXB0PgorICAgICAgICAgPGZvcm0gbmFtZT0ibXlGb3JtIiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgICAgICAgICAgIFZhbHVlMTogPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0idmFsdWUxIj4gPGJyLz4KKyAgICAgICAgICAgVmFsdWUyOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJ2YWx1ZTIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLXRydWUtdmFsdWU9IidZRVMnIiBuZy1mYWxzZS12YWx1ZT0iJ05PJyI+IDxici8+CisgICAgICAgICAgIDx0dD52YWx1ZTEgPSB7e3ZhbHVlMX19PC90dD48YnIvPgorICAgICAgICAgICA8dHQ+dmFsdWUyID0ge3t2YWx1ZTJ9fTwvdHQ+PGJyLz4KKyAgICAgICAgICA8L2Zvcm0+CisgICAgICAgIDwvZmlsZT4KKyAgICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgICAgaXQoJ3Nob3VsZCBjaGFuZ2Ugc3RhdGUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciB2YWx1ZTEgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3ZhbHVlMScpKTsKKyAgICAgICAgICAgIHZhciB2YWx1ZTIgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3ZhbHVlMicpKTsKKworICAgICAgICAgICAgZXhwZWN0KHZhbHVlMS5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOworICAgICAgICAgICAgZXhwZWN0KHZhbHVlMi5nZXRUZXh0KCkpLnRvQ29udGFpbignWUVTJyk7CisKKyAgICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlMScpKS5jbGljaygpOworICAgICAgICAgICAgZWxlbWVudChieS5tb2RlbCgndmFsdWUyJykpLmNsaWNrKCk7CisKKyAgICAgICAgICAgIGV4cGVjdCh2YWx1ZTEuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7CisgICAgICAgICAgICBleHBlY3QodmFsdWUyLmdldFRleHQoKSkudG9Db250YWluKCdOTycpOworICAgICAgICAgIH0pOworICAgICAgICA8L2ZpbGU+CisgICAgICA8L2V4YW1wbGU+CisgICAqLworICAnY2hlY2tib3gnOiBjaGVja2JveElucHV0VHlwZSwKKworICAnaGlkZGVuJzogbm9vcCwKKyAgJ2J1dHRvbic6IG5vb3AsCisgICdzdWJtaXQnOiBub29wLAorICAncmVzZXQnOiBub29wLAorICAnZmlsZSc6IG5vb3AKK307CisKK2Z1bmN0aW9uIHN0cmluZ0Jhc2VkSW5wdXRUeXBlKGN0cmwpIHsKKyAgY3RybC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmFsdWUpID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpOworICB9KTsKK30KKworZnVuY3Rpb24gdGV4dElucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKSB7CisgIGJhc2VJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcik7CisgIHN0cmluZ0Jhc2VkSW5wdXRUeXBlKGN0cmwpOworfQorCitmdW5jdGlvbiBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHsKKyAgdmFyIHR5cGUgPSBsb3dlcmNhc2UoZWxlbWVudFswXS50eXBlKTsKKworICAvLyBJbiBjb21wb3NpdGlvbiBtb2RlLCB1c2VycyBhcmUgc3RpbGwgaW5wdXRpbmcgaW50ZXJtZWRpYXRlIHRleHQgYnVmZmVyLAorICAvLyBob2xkIHRoZSBsaXN0ZW5lciB1bnRpbCBjb21wb3NpdGlvbiBpcyBkb25lLgorICAvLyBNb3JlIGFib3V0IGNvbXBvc2l0aW9uIGV2ZW50czogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NvbXBvc2l0aW9uRXZlbnQKKyAgaWYgKCEkc25pZmZlci5hbmRyb2lkKSB7CisgICAgdmFyIGNvbXBvc2luZyA9IGZhbHNlOworCisgICAgZWxlbWVudC5vbignY29tcG9zaXRpb25zdGFydCcsIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgIGNvbXBvc2luZyA9IHRydWU7CisgICAgfSk7CisKKyAgICBlbGVtZW50Lm9uKCdjb21wb3NpdGlvbmVuZCcsIGZ1bmN0aW9uKCkgeworICAgICAgY29tcG9zaW5nID0gZmFsc2U7CisgICAgICBsaXN0ZW5lcigpOworICAgIH0pOworICB9CisKKyAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXYpIHsKKyAgICBpZiAodGltZW91dCkgeworICAgICAgJGJyb3dzZXIuZGVmZXIuY2FuY2VsKHRpbWVvdXQpOworICAgICAgdGltZW91dCA9IG51bGw7CisgICAgfQorICAgIGlmIChjb21wb3NpbmcpIHJldHVybjsKKyAgICB2YXIgdmFsdWUgPSBlbGVtZW50LnZhbCgpLAorICAgICAgICBldmVudCA9IGV2ICYmIGV2LnR5cGU7CisKKyAgICAvLyBCeSBkZWZhdWx0IHdlIHdpbGwgdHJpbSB0aGUgdmFsdWUKKyAgICAvLyBJZiB0aGUgYXR0cmlidXRlIG5nLXRyaW0gZXhpc3RzIHdlIHdpbGwgYXZvaWQgdHJpbW1pbmcKKyAgICAvLyBJZiBpbnB1dCB0eXBlIGlzICdwYXNzd29yZCcsIHRoZSB2YWx1ZSBpcyBuZXZlciB0cmltbWVkCisgICAgaWYgKHR5cGUgIT09ICdwYXNzd29yZCcgJiYgKCFhdHRyLm5nVHJpbSB8fCBhdHRyLm5nVHJpbSAhPT0gJ2ZhbHNlJykpIHsKKyAgICAgIHZhbHVlID0gdHJpbSh2YWx1ZSk7CisgICAgfQorCisgICAgLy8gSWYgYSBjb250cm9sIGlzIHN1ZmZlcmluZyBmcm9tIGJhZCBpbnB1dCAoZHVlIHRvIG5hdGl2ZSB2YWxpZGF0b3JzKSwgYnJvd3NlcnMgZGlzY2FyZCBpdHMKKyAgICAvLyB2YWx1ZSwgc28gaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byByZXZhbGlkYXRlIChieSBjYWxsaW5nICRzZXRWaWV3VmFsdWUgYWdhaW4pIGV2ZW4gaWYgdGhlCisgICAgLy8gY29udHJvbCdzIHZhbHVlIGlzIHRoZSBzYW1lIGVtcHR5IHZhbHVlIHR3aWNlIGluIGEgcm93LgorICAgIGlmIChjdHJsLiR2aWV3VmFsdWUgIT09IHZhbHVlIHx8ICh2YWx1ZSA9PT0gJycgJiYgY3RybC4kJGhhc05hdGl2ZVZhbGlkYXRvcnMpKSB7CisgICAgICBjdHJsLiRzZXRWaWV3VmFsdWUodmFsdWUsIGV2ZW50KTsKKyAgICB9CisgIH07CisKKyAgLy8gaWYgdGhlIGJyb3dzZXIgZG9lcyBzdXBwb3J0ICJpbnB1dCIgZXZlbnQsIHdlIGFyZSBmaW5lIC0gZXhjZXB0IG9uIElFOSB3aGljaCBkb2Vzbid0IGZpcmUgdGhlCisgIC8vIGlucHV0IGV2ZW50IG9uIGJhY2tzcGFjZSwgZGVsZXRlIG9yIGN1dAorICBpZiAoJHNuaWZmZXIuaGFzRXZlbnQoJ2lucHV0JykpIHsKKyAgICBlbGVtZW50Lm9uKCdpbnB1dCcsIGxpc3RlbmVyKTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgdGltZW91dDsKKworICAgIHZhciBkZWZlckxpc3RlbmVyID0gZnVuY3Rpb24oZXYsIGlucHV0LCBvcmlnVmFsdWUpIHsKKyAgICAgIGlmICghdGltZW91dCkgeworICAgICAgICB0aW1lb3V0ID0gJGJyb3dzZXIuZGVmZXIoZnVuY3Rpb24oKSB7CisgICAgICAgICAgdGltZW91dCA9IG51bGw7CisgICAgICAgICAgaWYgKCFpbnB1dCB8fCBpbnB1dC52YWx1ZSAhPT0gb3JpZ1ZhbHVlKSB7CisgICAgICAgICAgICBsaXN0ZW5lcihldik7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9OworCisgICAgZWxlbWVudC5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICB2YXIga2V5ID0gZXZlbnQua2V5Q29kZTsKKworICAgICAgLy8gaWdub3JlCisgICAgICAvLyAgICBjb21tYW5kICAgICAgICAgICAgbW9kaWZpZXJzICAgICAgICAgICAgICAgICAgIGFycm93cworICAgICAgaWYgKGtleSA9PT0gOTEgfHwgKDE1IDwga2V5ICYmIGtleSA8IDE5KSB8fCAoMzcgPD0ga2V5ICYmIGtleSA8PSA0MCkpIHJldHVybjsKKworICAgICAgZGVmZXJMaXN0ZW5lcihldmVudCwgdGhpcywgdGhpcy52YWx1ZSk7CisgICAgfSk7CisKKyAgICAvLyBpZiB1c2VyIG1vZGlmaWVzIGlucHV0IHZhbHVlIHVzaW5nIGNvbnRleHQgbWVudSBpbiBJRSwgd2UgbmVlZCAicGFzdGUiIGFuZCAiY3V0IiBldmVudHMgdG8gY2F0Y2ggaXQKKyAgICBpZiAoJHNuaWZmZXIuaGFzRXZlbnQoJ3Bhc3RlJykpIHsKKyAgICAgIGVsZW1lbnQub24oJ3Bhc3RlIGN1dCcsIGRlZmVyTGlzdGVuZXIpOworICAgIH0KKyAgfQorCisgIC8vIGlmIHVzZXIgcGFzdGUgaW50byBpbnB1dCB1c2luZyBtb3VzZSBvbiBvbGRlciBicm93c2VyCisgIC8vIG9yIGZvcm0gYXV0b2NvbXBsZXRlIG9uIG5ld2VyIGJyb3dzZXIsIHdlIG5lZWQgImNoYW5nZSIgZXZlbnQgdG8gY2F0Y2ggaXQKKyAgZWxlbWVudC5vbignY2hhbmdlJywgbGlzdGVuZXIpOworCisgIGN0cmwuJHJlbmRlciA9IGZ1bmN0aW9uKCkgeworICAgIGVsZW1lbnQudmFsKGN0cmwuJGlzRW1wdHkoY3RybC4kdmlld1ZhbHVlKSA/ICcnIDogY3RybC4kdmlld1ZhbHVlKTsKKyAgfTsKK30KKworZnVuY3Rpb24gd2Vla1BhcnNlcihpc29XZWVrLCBleGlzdGluZ0RhdGUpIHsKKyAgaWYgKGlzRGF0ZShpc29XZWVrKSkgeworICAgIHJldHVybiBpc29XZWVrOworICB9CisKKyAgaWYgKGlzU3RyaW5nKGlzb1dlZWspKSB7CisgICAgV0VFS19SRUdFWFAubGFzdEluZGV4ID0gMDsKKyAgICB2YXIgcGFydHMgPSBXRUVLX1JFR0VYUC5leGVjKGlzb1dlZWspOworICAgIGlmIChwYXJ0cykgeworICAgICAgdmFyIHllYXIgPSArcGFydHNbMV0sCisgICAgICAgICAgd2VlayA9ICtwYXJ0c1syXSwKKyAgICAgICAgICBob3VycyA9IDAsCisgICAgICAgICAgbWludXRlcyA9IDAsCisgICAgICAgICAgc2Vjb25kcyA9IDAsCisgICAgICAgICAgbWlsbGlzZWNvbmRzID0gMCwKKyAgICAgICAgICBmaXJzdFRodXJzID0gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcih5ZWFyKSwKKyAgICAgICAgICBhZGREYXlzID0gKHdlZWsgLSAxKSAqIDc7CisKKyAgICAgIGlmIChleGlzdGluZ0RhdGUpIHsKKyAgICAgICAgaG91cnMgPSBleGlzdGluZ0RhdGUuZ2V0SG91cnMoKTsKKyAgICAgICAgbWludXRlcyA9IGV4aXN0aW5nRGF0ZS5nZXRNaW51dGVzKCk7CisgICAgICAgIHNlY29uZHMgPSBleGlzdGluZ0RhdGUuZ2V0U2Vjb25kcygpOworICAgICAgICBtaWxsaXNlY29uZHMgPSBleGlzdGluZ0RhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwLCBmaXJzdFRodXJzLmdldERhdGUoKSArIGFkZERheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHMpOworICAgIH0KKyAgfQorCisgIHJldHVybiBOYU47Cit9CisKK2Z1bmN0aW9uIGNyZWF0ZURhdGVQYXJzZXIocmVnZXhwLCBtYXBwaW5nKSB7CisgIHJldHVybiBmdW5jdGlvbihpc28sIGRhdGUpIHsKKyAgICB2YXIgcGFydHMsIG1hcDsKKworICAgIGlmIChpc0RhdGUoaXNvKSkgeworICAgICAgcmV0dXJuIGlzbzsKKyAgICB9CisKKyAgICBpZiAoaXNTdHJpbmcoaXNvKSkgeworICAgICAgLy8gV2hlbiBhIGRhdGUgaXMgSlNPTidpZmllZCB0byB3cmFwcyBpdHNlbGYgaW5zaWRlIG9mIGFuIGV4dHJhCisgICAgICAvLyBzZXQgb2YgZG91YmxlIHF1b3Rlcy4gVGhpcyBtYWtlcyB0aGUgZGF0ZSBwYXJzaW5nIGNvZGUgdW5hYmxlCisgICAgICAvLyB0byBtYXRjaCB0aGUgZGF0ZSBzdHJpbmcgYW5kIHBhcnNlIGl0IGFzIGEgZGF0ZS4KKyAgICAgIGlmIChpc28uY2hhckF0KDApID09ICciJyAmJiBpc28uY2hhckF0KGlzby5sZW5ndGggLSAxKSA9PSAnIicpIHsKKyAgICAgICAgaXNvID0gaXNvLnN1YnN0cmluZygxLCBpc28ubGVuZ3RoIC0gMSk7CisgICAgICB9CisgICAgICBpZiAoSVNPX0RBVEVfUkVHRVhQLnRlc3QoaXNvKSkgeworICAgICAgICByZXR1cm4gbmV3IERhdGUoaXNvKTsKKyAgICAgIH0KKyAgICAgIHJlZ2V4cC5sYXN0SW5kZXggPSAwOworICAgICAgcGFydHMgPSByZWdleHAuZXhlYyhpc28pOworCisgICAgICBpZiAocGFydHMpIHsKKyAgICAgICAgcGFydHMuc2hpZnQoKTsKKyAgICAgICAgaWYgKGRhdGUpIHsKKyAgICAgICAgICBtYXAgPSB7CisgICAgICAgICAgICB5eXl5OiBkYXRlLmdldEZ1bGxZZWFyKCksCisgICAgICAgICAgICBNTTogZGF0ZS5nZXRNb250aCgpICsgMSwKKyAgICAgICAgICAgIGRkOiBkYXRlLmdldERhdGUoKSwKKyAgICAgICAgICAgIEhIOiBkYXRlLmdldEhvdXJzKCksCisgICAgICAgICAgICBtbTogZGF0ZS5nZXRNaW51dGVzKCksCisgICAgICAgICAgICBzczogZGF0ZS5nZXRTZWNvbmRzKCksCisgICAgICAgICAgICBzc3M6IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLyAxMDAwCisgICAgICAgICAgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtYXAgPSB7IHl5eXk6IDE5NzAsIE1NOiAxLCBkZDogMSwgSEg6IDAsIG1tOiAwLCBzczogMCwgc3NzOiAwIH07CisgICAgICAgIH0KKworICAgICAgICBmb3JFYWNoKHBhcnRzLCBmdW5jdGlvbihwYXJ0LCBpbmRleCkgeworICAgICAgICAgIGlmIChpbmRleCA8IG1hcHBpbmcubGVuZ3RoKSB7CisgICAgICAgICAgICBtYXBbbWFwcGluZ1tpbmRleF1dID0gK3BhcnQ7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG1hcC55eXl5LCBtYXAuTU0gLSAxLCBtYXAuZGQsIG1hcC5ISCwgbWFwLm1tLCBtYXAuc3MgfHwgMCwgbWFwLnNzcyAqIDEwMDAgfHwgMCk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5hTjsKKyAgfTsKK30KKworZnVuY3Rpb24gY3JlYXRlRGF0ZUlucHV0VHlwZSh0eXBlLCByZWdleHAsIHBhcnNlRGF0ZSwgZm9ybWF0KSB7CisgIHJldHVybiBmdW5jdGlvbiBkeW5hbWljRGF0ZUlucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyLCAkZmlsdGVyKSB7CisgICAgYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKTsKKyAgICBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpOworICAgIHZhciB0aW1lem9uZSA9IGN0cmwgJiYgY3RybC4kb3B0aW9ucyAmJiBjdHJsLiRvcHRpb25zLnRpbWV6b25lOworICAgIHZhciBwcmV2aW91c0RhdGU7CisKKyAgICBjdHJsLiQkcGFyc2VyTmFtZSA9IHR5cGU7CisgICAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICBpZiAoY3RybC4kaXNFbXB0eSh2YWx1ZSkpIHJldHVybiBudWxsOworICAgICAgaWYgKHJlZ2V4cC50ZXN0KHZhbHVlKSkgeworICAgICAgICAvLyBOb3RlOiBXZSBjYW5ub3QgcmVhZCBjdHJsLiRtb2RlbFZhbHVlLCBhcyB0aGVyZSBtaWdodCBiZSBhIGRpZmZlcmVudAorICAgICAgICAvLyBwYXJzZXIvZm9ybWF0dGVyIGluIHRoZSBwcm9jZXNzaW5nIGNoYWluIHNvIHRoYXQgdGhlIG1vZGVsCisgICAgICAgIC8vIGNvbnRhaW5zIHNvbWUgZGlmZmVyZW50IGRhdGEgZm9ybWF0IQorICAgICAgICB2YXIgcGFyc2VkRGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgcHJldmlvdXNEYXRlKTsKKyAgICAgICAgaWYgKHRpbWV6b25lID09PSAnVVRDJykgeworICAgICAgICAgIHBhcnNlZERhdGUuc2V0TWludXRlcyhwYXJzZWREYXRlLmdldE1pbnV0ZXMoKSAtIHBhcnNlZERhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcnNlZERhdGU7CisgICAgICB9CisgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgIH0pOworCisgICAgY3RybC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICBpZiAodmFsdWUgJiYgIWlzRGF0ZSh2YWx1ZSkpIHsKKyAgICAgICAgdGhyb3cgJG5nTW9kZWxNaW5FcnIoJ2RhdGVmbXQnLCAnRXhwZWN0ZWQgYHswfWAgdG8gYmUgYSBkYXRlJywgdmFsdWUpOworICAgICAgfQorICAgICAgaWYgKGlzVmFsaWREYXRlKHZhbHVlKSkgeworICAgICAgICBwcmV2aW91c0RhdGUgPSB2YWx1ZTsKKyAgICAgICAgaWYgKHByZXZpb3VzRGF0ZSAmJiB0aW1lem9uZSA9PT0gJ1VUQycpIHsKKyAgICAgICAgICB2YXIgdGltZXpvbmVPZmZzZXQgPSA2MDAwMCAqIHByZXZpb3VzRGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpOworICAgICAgICAgIHByZXZpb3VzRGF0ZSA9IG5ldyBEYXRlKHByZXZpb3VzRGF0ZS5nZXRUaW1lKCkgKyB0aW1lem9uZU9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICRmaWx0ZXIoJ2RhdGUnKSh2YWx1ZSwgZm9ybWF0LCB0aW1lem9uZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmV2aW91c0RhdGUgPSBudWxsOworICAgICAgICByZXR1cm4gJyc7CisgICAgICB9CisgICAgfSk7CisKKyAgICBpZiAoaXNEZWZpbmVkKGF0dHIubWluKSB8fCBhdHRyLm5nTWluKSB7CisgICAgICB2YXIgbWluVmFsOworICAgICAgY3RybC4kdmFsaWRhdG9ycy5taW4gPSBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICByZXR1cm4gIWlzVmFsaWREYXRlKHZhbHVlKSB8fCBpc1VuZGVmaW5lZChtaW5WYWwpIHx8IHBhcnNlRGF0ZSh2YWx1ZSkgPj0gbWluVmFsOworICAgICAgfTsKKyAgICAgIGF0dHIuJG9ic2VydmUoJ21pbicsIGZ1bmN0aW9uKHZhbCkgeworICAgICAgICBtaW5WYWwgPSBwYXJzZU9ic2VydmVkRGF0ZVZhbHVlKHZhbCk7CisgICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7CisgICAgICB9KTsKKyAgICB9CisKKyAgICBpZiAoaXNEZWZpbmVkKGF0dHIubWF4KSB8fCBhdHRyLm5nTWF4KSB7CisgICAgICB2YXIgbWF4VmFsOworICAgICAgY3RybC4kdmFsaWRhdG9ycy5tYXggPSBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICByZXR1cm4gIWlzVmFsaWREYXRlKHZhbHVlKSB8fCBpc1VuZGVmaW5lZChtYXhWYWwpIHx8IHBhcnNlRGF0ZSh2YWx1ZSkgPD0gbWF4VmFsOworICAgICAgfTsKKyAgICAgIGF0dHIuJG9ic2VydmUoJ21heCcsIGZ1bmN0aW9uKHZhbCkgeworICAgICAgICBtYXhWYWwgPSBwYXJzZU9ic2VydmVkRGF0ZVZhbHVlKHZhbCk7CisgICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7CisgICAgICB9KTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBpc1ZhbGlkRGF0ZSh2YWx1ZSkgeworICAgICAgLy8gSW52YWxpZCBEYXRlOiBnZXRUaW1lKCkgcmV0dXJucyBOYU4KKyAgICAgIHJldHVybiB2YWx1ZSAmJiAhKHZhbHVlLmdldFRpbWUgJiYgdmFsdWUuZ2V0VGltZSgpICE9PSB2YWx1ZS5nZXRUaW1lKCkpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHBhcnNlT2JzZXJ2ZWREYXRlVmFsdWUodmFsKSB7CisgICAgICByZXR1cm4gaXNEZWZpbmVkKHZhbCkgPyAoaXNEYXRlKHZhbCkgPyB2YWwgOiBwYXJzZURhdGUodmFsKSkgOiB1bmRlZmluZWQ7CisgICAgfQorICB9OworfQorCitmdW5jdGlvbiBiYWRJbnB1dENoZWNrZXIoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwpIHsKKyAgdmFyIG5vZGUgPSBlbGVtZW50WzBdOworICB2YXIgbmF0aXZlVmFsaWRhdGlvbiA9IGN0cmwuJCRoYXNOYXRpdmVWYWxpZGF0b3JzID0gaXNPYmplY3Qobm9kZS52YWxpZGl0eSk7CisgIGlmIChuYXRpdmVWYWxpZGF0aW9uKSB7CisgICAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICB2YXIgdmFsaWRpdHkgPSBlbGVtZW50LnByb3AoVkFMSURJVFlfU1RBVEVfUFJPUEVSVFkpIHx8IHt9OworICAgICAgLy8gRGV0ZWN0IGJ1ZyBpbiBGRjM1IGZvciBpbnB1dFtlbWFpbF0gKGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEwNjQ0MzApOgorICAgICAgLy8gLSBhbHNvIHNldHMgdmFsaWRpdHkuYmFkSW5wdXQgKHNob3VsZCBvbmx5IGJlIHZhbGlkaXR5LnR5cGVNaXNtYXRjaCkuCisgICAgICAvLyAtIHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9mb3Jtcy5odG1sI2UtbWFpbC1zdGF0ZS0odHlwZT1lbWFpbCkKKyAgICAgIC8vIC0gY2FuIGlnbm9yZSB0aGlzIGNhc2UgYXMgd2UgY2FuIHN0aWxsIHJlYWQgb3V0IHRoZSBlcnJvbmVvdXMgZW1haWwuLi4KKyAgICAgIHJldHVybiB2YWxpZGl0eS5iYWRJbnB1dCAmJiAhdmFsaWRpdHkudHlwZU1pc21hdGNoID8gdW5kZWZpbmVkIDogdmFsdWU7CisgICAgfSk7CisgIH0KK30KKworZnVuY3Rpb24gbnVtYmVySW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHsKKyAgYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKTsKKyAgYmFzZUlucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKTsKKworICBjdHJsLiQkcGFyc2VyTmFtZSA9ICdudW1iZXInOworICBjdHJsLiRwYXJzZXJzLnB1c2goZnVuY3Rpb24odmFsdWUpIHsKKyAgICBpZiAoY3RybC4kaXNFbXB0eSh2YWx1ZSkpICAgICAgcmV0dXJuIG51bGw7CisgICAgaWYgKE5VTUJFUl9SRUdFWFAudGVzdCh2YWx1ZSkpIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTsKKyAgICByZXR1cm4gdW5kZWZpbmVkOworICB9KTsKKworICBjdHJsLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24odmFsdWUpIHsKKyAgICBpZiAoIWN0cmwuJGlzRW1wdHkodmFsdWUpKSB7CisgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkgeworICAgICAgICB0aHJvdyAkbmdNb2RlbE1pbkVycignbnVtZm10JywgJ0V4cGVjdGVkIGB7MH1gIHRvIGJlIGEgbnVtYmVyJywgdmFsdWUpOworICAgICAgfQorICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7CisgIH0pOworCisgIGlmIChhdHRyLm1pbiB8fCBhdHRyLm5nTWluKSB7CisgICAgdmFyIG1pblZhbDsKKyAgICBjdHJsLiR2YWxpZGF0b3JzLm1pbiA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICByZXR1cm4gY3RybC4kaXNFbXB0eSh2YWx1ZSkgfHwgaXNVbmRlZmluZWQobWluVmFsKSB8fCB2YWx1ZSA+PSBtaW5WYWw7CisgICAgfTsKKworICAgIGF0dHIuJG9ic2VydmUoJ21pbicsIGZ1bmN0aW9uKHZhbCkgeworICAgICAgaWYgKGlzRGVmaW5lZCh2YWwpICYmICFpc051bWJlcih2YWwpKSB7CisgICAgICAgIHZhbCA9IHBhcnNlRmxvYXQodmFsLCAxMCk7CisgICAgICB9CisgICAgICBtaW5WYWwgPSBpc051bWJlcih2YWwpICYmICFpc05hTih2YWwpID8gdmFsIDogdW5kZWZpbmVkOworICAgICAgLy8gVE9ETyhtYXRza28pOiBpbXBsZW1lbnQgdmFsaWRhdGVMYXRlciB0byByZWR1Y2UgbnVtYmVyIG9mIHZhbGlkYXRpb25zCisgICAgICBjdHJsLiR2YWxpZGF0ZSgpOworICAgIH0pOworICB9CisKKyAgaWYgKGF0dHIubWF4IHx8IGF0dHIubmdNYXgpIHsKKyAgICB2YXIgbWF4VmFsOworICAgIGN0cmwuJHZhbGlkYXRvcnMubWF4ID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZhbHVlKSB8fCBpc1VuZGVmaW5lZChtYXhWYWwpIHx8IHZhbHVlIDw9IG1heFZhbDsKKyAgICB9OworCisgICAgYXR0ci4kb2JzZXJ2ZSgnbWF4JywgZnVuY3Rpb24odmFsKSB7CisgICAgICBpZiAoaXNEZWZpbmVkKHZhbCkgJiYgIWlzTnVtYmVyKHZhbCkpIHsKKyAgICAgICAgdmFsID0gcGFyc2VGbG9hdCh2YWwsIDEwKTsKKyAgICAgIH0KKyAgICAgIG1heFZhbCA9IGlzTnVtYmVyKHZhbCkgJiYgIWlzTmFOKHZhbCkgPyB2YWwgOiB1bmRlZmluZWQ7CisgICAgICAvLyBUT0RPKG1hdHNrbyk6IGltcGxlbWVudCB2YWxpZGF0ZUxhdGVyIHRvIHJlZHVjZSBudW1iZXIgb2YgdmFsaWRhdGlvbnMKKyAgICAgIGN0cmwuJHZhbGlkYXRlKCk7CisgICAgfSk7CisgIH0KK30KKworZnVuY3Rpb24gdXJsSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHsKKyAgLy8gTm90ZTogbm8gYmFkSW5wdXRDaGVja2VyIGhlcmUgYnkgcHVycG9zZSBhcyBgdXJsYCBpcyBvbmx5IGEgdmFsaWRhdGlvbgorICAvLyBpbiBicm93c2VycywgaS5lLiB3ZSBjYW4gYWx3YXlzIHJlYWQgb3V0IGlucHV0LnZhbHVlIGV2ZW4gaWYgaXQgaXMgbm90IHZhbGlkIQorICBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpOworICBzdHJpbmdCYXNlZElucHV0VHlwZShjdHJsKTsKKworICBjdHJsLiQkcGFyc2VyTmFtZSA9ICd1cmwnOworICBjdHJsLiR2YWxpZGF0b3JzLnVybCA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkgeworICAgIHZhciB2YWx1ZSA9IG1vZGVsVmFsdWUgfHwgdmlld1ZhbHVlOworICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZhbHVlKSB8fCBVUkxfUkVHRVhQLnRlc3QodmFsdWUpOworICB9OworfQorCitmdW5jdGlvbiBlbWFpbElucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKSB7CisgIC8vIE5vdGU6IG5vIGJhZElucHV0Q2hlY2tlciBoZXJlIGJ5IHB1cnBvc2UgYXMgYHVybGAgaXMgb25seSBhIHZhbGlkYXRpb24KKyAgLy8gaW4gYnJvd3NlcnMsIGkuZS4gd2UgY2FuIGFsd2F5cyByZWFkIG91dCBpbnB1dC52YWx1ZSBldmVuIGlmIGl0IGlzIG5vdCB2YWxpZCEKKyAgYmFzZUlucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKTsKKyAgc3RyaW5nQmFzZWRJbnB1dFR5cGUoY3RybCk7CisKKyAgY3RybC4kJHBhcnNlck5hbWUgPSAnZW1haWwnOworICBjdHJsLiR2YWxpZGF0b3JzLmVtYWlsID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7CisgICAgdmFyIHZhbHVlID0gbW9kZWxWYWx1ZSB8fCB2aWV3VmFsdWU7CisgICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmFsdWUpIHx8IEVNQUlMX1JFR0VYUC50ZXN0KHZhbHVlKTsKKyAgfTsKK30KKworZnVuY3Rpb24gcmFkaW9JbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwpIHsKKyAgLy8gbWFrZSB0aGUgbmFtZSB1bmlxdWUsIGlmIG5vdCBkZWZpbmVkCisgIGlmIChpc1VuZGVmaW5lZChhdHRyLm5hbWUpKSB7CisgICAgZWxlbWVudC5hdHRyKCduYW1lJywgbmV4dFVpZCgpKTsKKyAgfQorCisgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKGV2KSB7CisgICAgaWYgKGVsZW1lbnRbMF0uY2hlY2tlZCkgeworICAgICAgY3RybC4kc2V0Vmlld1ZhbHVlKGF0dHIudmFsdWUsIGV2ICYmIGV2LnR5cGUpOworICAgIH0KKyAgfTsKKworICBlbGVtZW50Lm9uKCdjbGljaycsIGxpc3RlbmVyKTsKKworICBjdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHsKKyAgICB2YXIgdmFsdWUgPSBhdHRyLnZhbHVlOworICAgIGVsZW1lbnRbMF0uY2hlY2tlZCA9ICh2YWx1ZSA9PSBjdHJsLiR2aWV3VmFsdWUpOworICB9OworCisgIGF0dHIuJG9ic2VydmUoJ3ZhbHVlJywgY3RybC4kcmVuZGVyKTsKK30KKworZnVuY3Rpb24gcGFyc2VDb25zdGFudEV4cHIoJHBhcnNlLCBjb250ZXh0LCBuYW1lLCBleHByZXNzaW9uLCBmYWxsYmFjaykgeworICB2YXIgcGFyc2VGbjsKKyAgaWYgKGlzRGVmaW5lZChleHByZXNzaW9uKSkgeworICAgIHBhcnNlRm4gPSAkcGFyc2UoZXhwcmVzc2lvbik7CisgICAgaWYgKCFwYXJzZUZuLmNvbnN0YW50KSB7CisgICAgICB0aHJvdyBtaW5FcnIoJ25nTW9kZWwnKSgnY29uc3RleHByJywgJ0V4cGVjdGVkIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yIGB7MH1gLCBidXQgc2F3ICcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYHsxfWAuJywgbmFtZSwgZXhwcmVzc2lvbik7CisgICAgfQorICAgIHJldHVybiBwYXJzZUZuKGNvbnRleHQpOworICB9CisgIHJldHVybiBmYWxsYmFjazsKK30KKworZnVuY3Rpb24gY2hlY2tib3hJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3NlciwgJGZpbHRlciwgJHBhcnNlKSB7CisgIHZhciB0cnVlVmFsdWUgPSBwYXJzZUNvbnN0YW50RXhwcigkcGFyc2UsIHNjb3BlLCAnbmdUcnVlVmFsdWUnLCBhdHRyLm5nVHJ1ZVZhbHVlLCB0cnVlKTsKKyAgdmFyIGZhbHNlVmFsdWUgPSBwYXJzZUNvbnN0YW50RXhwcigkcGFyc2UsIHNjb3BlLCAnbmdGYWxzZVZhbHVlJywgYXR0ci5uZ0ZhbHNlVmFsdWUsIGZhbHNlKTsKKworICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihldikgeworICAgIGN0cmwuJHNldFZpZXdWYWx1ZShlbGVtZW50WzBdLmNoZWNrZWQsIGV2ICYmIGV2LnR5cGUpOworICB9OworCisgIGVsZW1lbnQub24oJ2NsaWNrJywgbGlzdGVuZXIpOworCisgIGN0cmwuJHJlbmRlciA9IGZ1bmN0aW9uKCkgeworICAgIGVsZW1lbnRbMF0uY2hlY2tlZCA9IGN0cmwuJHZpZXdWYWx1ZTsKKyAgfTsKKworICAvLyBPdmVycmlkZSB0aGUgc3RhbmRhcmQgYCRpc0VtcHR5YCBiZWNhdXNlIHRoZSAkdmlld1ZhbHVlIG9mIGFuIGVtcHR5IGNoZWNrYm94IGlzIGFsd2F5cyBzZXQgdG8gYGZhbHNlYAorICAvLyBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHBhcnNlciBiZWxvdywgd2hpY2ggY29tcGFyZXMgdGhlIGAkbW9kZWxWYWx1ZWAgd2l0aCBgdHJ1ZVZhbHVlYCB0byBjb252ZXJ0CisgIC8vIGl0IHRvIGEgYm9vbGVhbi4KKyAgY3RybC4kaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZTsKKyAgfTsKKworICBjdHJsLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24odmFsdWUpIHsKKyAgICByZXR1cm4gZXF1YWxzKHZhbHVlLCB0cnVlVmFsdWUpOworICB9KTsKKworICBjdHJsLiRwYXJzZXJzLnB1c2goZnVuY3Rpb24odmFsdWUpIHsKKyAgICByZXR1cm4gdmFsdWUgPyB0cnVlVmFsdWUgOiBmYWxzZVZhbHVlOworICB9KTsKK30KKworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIHRleHRhcmVhCisgKiBAcmVzdHJpY3QgRQorICoKKyAqIEBkZXNjcmlwdGlvbgorICogSFRNTCB0ZXh0YXJlYSBlbGVtZW50IGNvbnRyb2wgd2l0aCBhbmd1bGFyIGRhdGEtYmluZGluZy4gVGhlIGRhdGEtYmluZGluZyBhbmQgdmFsaWRhdGlvbgorICogcHJvcGVydGllcyBvZiB0aGlzIGVsZW1lbnQgYXJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhvc2Ugb2YgdGhlCisgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOmlucHV0IGlucHV0IGVsZW1lbnR9LgorICoKKyAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by4KKyAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC4KKyAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC4KKyAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0bworICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2YKKyAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLgorICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW4KKyAqICAgIG1pbmxlbmd0aC4KKyAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNYXhsZW5ndGggU2V0cyBgbWF4bGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbG9uZ2VyIHRoYW4KKyAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZiBhbnkKKyAqICAgIGxlbmd0aC4KKyAqIEBwYXJhbSB7c3RyaW5nPX0gbmdQYXR0ZXJuIFNldHMgYHBhdHRlcm5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUKKyAqICAgIFJlZ0V4cCBwYXR0ZXJuIGV4cHJlc3Npb24uIEV4cGVjdGVkIHZhbHVlIGlzIGAvcmVnZXhwL2AgZm9yIGlubGluZSBwYXR0ZXJucyBvciBgcmVnZXhwYCBmb3IKKyAqICAgIHBhdHRlcm5zIGRlZmluZWQgYXMgc2NvcGUgZXhwcmVzc2lvbnMuCisgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXIKKyAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuCisgKiBAcGFyYW0ge2Jvb2xlYW49fSBbbmdUcmltPXRydWVdIElmIHNldCB0byBmYWxzZSBBbmd1bGFyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgdHJpbSB0aGUgaW5wdXQuCisgKi8KKworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIGlucHV0CisgKiBAcmVzdHJpY3QgRQorICoKKyAqIEBkZXNjcmlwdGlvbgorICogSFRNTCBpbnB1dCBlbGVtZW50IGNvbnRyb2wuIFdoZW4gdXNlZCB0b2dldGhlciB3aXRoIHtAbGluayBuZ01vZGVsIGBuZ01vZGVsYH0sIGl0IHByb3ZpZGVzIGRhdGEtYmluZGluZywKKyAqIGlucHV0IHN0YXRlIGNvbnRyb2wsIGFuZCB2YWxpZGF0aW9uLgorICogSW5wdXQgY29udHJvbCBmb2xsb3dzIEhUTUw1IGlucHV0IHR5cGVzIGFuZCBwb2x5ZmlsbHMgdGhlIEhUTUw1IHZhbGlkYXRpb24gYmVoYXZpb3IgZm9yIG9sZGVyIGJyb3dzZXJzLgorICoKKyAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXdhcm5pbmciPgorICogKipOb3RlOioqIE5vdCBldmVyeSBmZWF0dXJlIG9mZmVyZWQgaXMgYXZhaWxhYmxlIGZvciBhbGwgaW5wdXQgdHlwZXMuCisgKiBTcGVjaWZpY2FsbHksIGRhdGEgYmluZGluZyBhbmQgZXZlbnQgaGFuZGxpbmcgdmlhIGBuZy1tb2RlbGAgaXMgdW5zdXBwb3J0ZWQgZm9yIGBpbnB1dFtmaWxlXWAuCisgKiA8L2Rpdj4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uCisgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuCisgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuCisgKiBAcGFyYW0ge2Jvb2xlYW49fSBuZ1JlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgaWYgc2V0IHRvIHRydWUKKyAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNaW5sZW5ndGggU2V0cyBgbWlubGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgc2hvcnRlciB0aGFuCisgKiAgICBtaW5sZW5ndGguCisgKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuCisgKiAgICBtYXhsZW5ndGguIFNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0byBhIG5lZ2F0aXZlIG9yIG5vbi1udW1lcmljIHZhbHVlLCBhbGxvd3MgdmlldyB2YWx1ZXMgb2YgYW55CisgKiAgICBsZW5ndGguCisgKiBAcGFyYW0ge3N0cmluZz19IG5nUGF0dGVybiBTZXRzIGBwYXR0ZXJuYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlCisgKiAgICBSZWdFeHAgcGF0dGVybiBleHByZXNzaW9uLiBFeHBlY3RlZCB2YWx1ZSBpcyBgL3JlZ2V4cC9gIGZvciBpbmxpbmUgcGF0dGVybnMgb3IgYHJlZ2V4cGAgZm9yCisgKiAgICBwYXR0ZXJucyBkZWZpbmVkIGFzIHNjb3BlIGV4cHJlc3Npb25zLgorICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyCisgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LgorICogQHBhcmFtIHtib29sZWFuPX0gW25nVHJpbT10cnVlXSBJZiBzZXQgdG8gZmFsc2UgQW5ndWxhciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IHRyaW0gdGhlIGlucHV0LgorICogICAgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgaW5wdXRbdHlwZT1wYXNzd29yZF0gY29udHJvbHMsIHdoaWNoIHdpbGwgbmV2ZXIgdHJpbSB0aGUKKyAqICAgIGlucHV0LgorICoKKyAqIEBleGFtcGxlCisgICAgPGV4YW1wbGUgbmFtZT0iaW5wdXQtZGlyZWN0aXZlIiBtb2R1bGU9ImlucHV0RXhhbXBsZSI+CisgICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8c2NyaXB0PgorICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdpbnB1dEV4YW1wbGUnLCBbXSkKKyAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgICAgICAgICRzY29wZS51c2VyID0ge25hbWU6ICdndWVzdCcsIGxhc3Q6ICd2aXNpdG9yJ307CisgICAgICAgICAgICB9XSk7CisgICAgICAgPC9zY3JpcHQ+CisgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgICAgICAgICA8Zm9ybSBuYW1lPSJteUZvcm0iPgorICAgICAgICAgICBVc2VyIG5hbWU6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VyTmFtZSIgbmctbW9kZWw9InVzZXIubmFtZSIgcmVxdWlyZWQ+CisgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJvciIgbmctc2hvdz0ibXlGb3JtLnVzZXJOYW1lLiRlcnJvci5yZXF1aXJlZCI+CisgICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPjxicj4KKyAgICAgICAgICAgTGFzdCBuYW1lOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibGFzdE5hbWUiIG5nLW1vZGVsPSJ1c2VyLmxhc3QiCisgICAgICAgICAgICAgbmctbWlubGVuZ3RoPSIzIiBuZy1tYXhsZW5ndGg9IjEwIj4KKyAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0ubGFzdE5hbWUuJGVycm9yLm1pbmxlbmd0aCI+CisgICAgICAgICAgICAgVG9vIHNob3J0ITwvc3Bhbj4KKyAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVycm9yIiBuZy1zaG93PSJteUZvcm0ubGFzdE5hbWUuJGVycm9yLm1heGxlbmd0aCI+CisgICAgICAgICAgICAgVG9vIGxvbmchPC9zcGFuPjxicj4KKyAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgIDxocj4KKyAgICAgICAgIDx0dD51c2VyID0ge3t1c2VyfX08L3R0Pjxici8+CisgICAgICAgICA8dHQ+bXlGb3JtLnVzZXJOYW1lLiR2YWxpZCA9IHt7bXlGb3JtLnVzZXJOYW1lLiR2YWxpZH19PC90dD48YnI+CisgICAgICAgICA8dHQ+bXlGb3JtLnVzZXJOYW1lLiRlcnJvciA9IHt7bXlGb3JtLnVzZXJOYW1lLiRlcnJvcn19PC90dD48YnI+CisgICAgICAgICA8dHQ+bXlGb3JtLmxhc3ROYW1lLiR2YWxpZCA9IHt7bXlGb3JtLmxhc3ROYW1lLiR2YWxpZH19PC90dD48YnI+CisgICAgICAgICA8dHQ+bXlGb3JtLmxhc3ROYW1lLiRlcnJvciA9IHt7bXlGb3JtLmxhc3ROYW1lLiRlcnJvcn19PC90dD48YnI+CisgICAgICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnI+CisgICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxicj4KKyAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLm1pbmxlbmd0aCA9IHt7ISFteUZvcm0uJGVycm9yLm1pbmxlbmd0aH19PC90dD48YnI+CisgICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5tYXhsZW5ndGggPSB7eyEhbXlGb3JtLiRlcnJvci5tYXhsZW5ndGh9fTwvdHQ+PGJyPgorICAgICAgIDwvZGl2PgorICAgICAgPC9maWxlPgorICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgIHZhciB1c2VyID0gZWxlbWVudChieS5leGFjdEJpbmRpbmcoJ3VzZXInKSk7CisgICAgICAgIHZhciB1c2VyTmFtZVZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0udXNlck5hbWUuJHZhbGlkJykpOworICAgICAgICB2YXIgbGFzdE5hbWVWYWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmxhc3ROYW1lLiR2YWxpZCcpKTsKKyAgICAgICAgdmFyIGxhc3ROYW1lRXJyb3IgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5sYXN0TmFtZS4kZXJyb3InKSk7CisgICAgICAgIHZhciBmb3JtVmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS4kdmFsaWQnKSk7CisgICAgICAgIHZhciB1c2VyTmFtZUlucHV0ID0gZWxlbWVudChieS5tb2RlbCgndXNlci5uYW1lJykpOworICAgICAgICB2YXIgdXNlckxhc3RJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3VzZXIubGFzdCcpKTsKKworICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICBleHBlY3QodXNlci5nZXRUZXh0KCkpLnRvQ29udGFpbigneyJuYW1lIjoiZ3Vlc3QiLCJsYXN0IjoidmlzaXRvciJ9Jyk7CisgICAgICAgICAgZXhwZWN0KHVzZXJOYW1lVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTsKKyAgICAgICAgICBleHBlY3QoZm9ybVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7CisgICAgICAgIH0pOworCisgICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eSB3aGVuIHJlcXVpcmVkJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgdXNlck5hbWVJbnB1dC5jbGVhcigpOworICAgICAgICAgIHVzZXJOYW1lSW5wdXQuc2VuZEtleXMoJycpOworCisgICAgICAgICAgZXhwZWN0KHVzZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3sibGFzdCI6InZpc2l0b3IifScpOworICAgICAgICAgIGV4cGVjdCh1c2VyTmFtZVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpOworICAgICAgICAgIGV4cGVjdChmb3JtVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7CisgICAgICAgIH0pOworCisgICAgICAgIGl0KCdzaG91bGQgYmUgdmFsaWQgaWYgZW1wdHkgd2hlbiBtaW4gbGVuZ3RoIGlzIHNldCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgIHVzZXJMYXN0SW5wdXQuY2xlYXIoKTsKKyAgICAgICAgICB1c2VyTGFzdElucHV0LnNlbmRLZXlzKCcnKTsKKworICAgICAgICAgIGV4cGVjdCh1c2VyLmdldFRleHQoKSkudG9Db250YWluKCd7Im5hbWUiOiJndWVzdCIsImxhc3QiOiIifScpOworICAgICAgICAgIGV4cGVjdChsYXN0TmFtZVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7CisgICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOworICAgICAgICB9KTsKKworICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgbGVzcyB0aGFuIHJlcXVpcmVkIG1pbiBsZW5ndGgnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICB1c2VyTGFzdElucHV0LmNsZWFyKCk7CisgICAgICAgICAgdXNlckxhc3RJbnB1dC5zZW5kS2V5cygneHgnKTsKKworICAgICAgICAgIGV4cGVjdCh1c2VyLmdldFRleHQoKSkudG9Db250YWluKCd7Im5hbWUiOiJndWVzdCJ9Jyk7CisgICAgICAgICAgZXhwZWN0KGxhc3ROYW1lVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7CisgICAgICAgICAgZXhwZWN0KGxhc3ROYW1lRXJyb3IuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ21pbmxlbmd0aCcpOworICAgICAgICAgIGV4cGVjdChmb3JtVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7CisgICAgICAgIH0pOworCisgICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBsb25nZXIgdGhhbiBtYXggbGVuZ3RoJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgdXNlckxhc3RJbnB1dC5jbGVhcigpOworICAgICAgICAgIHVzZXJMYXN0SW5wdXQuc2VuZEtleXMoJ3NvbWUgcmlkaWN1bG91c2x5IGxvbmcgbmFtZScpOworCisgICAgICAgICAgZXhwZWN0KHVzZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3sibmFtZSI6Imd1ZXN0In0nKTsKKyAgICAgICAgICBleHBlY3QobGFzdE5hbWVWYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsKKyAgICAgICAgICBleHBlY3QobGFzdE5hbWVFcnJvci5nZXRUZXh0KCkpLnRvQ29udGFpbignbWF4bGVuZ3RoJyk7CisgICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTsKKyAgICAgICAgfSk7CisgICAgICA8L2ZpbGU+CisgICAgPC9leGFtcGxlPgorICovCit2YXIgaW5wdXREaXJlY3RpdmUgPSBbJyRicm93c2VyJywgJyRzbmlmZmVyJywgJyRmaWx0ZXInLCAnJHBhcnNlJywKKyAgICBmdW5jdGlvbigkYnJvd3NlciwgJHNuaWZmZXIsICRmaWx0ZXIsICRwYXJzZSkgeworICByZXR1cm4geworICAgIHJlc3RyaWN0OiAnRScsCisgICAgcmVxdWlyZTogWyc/bmdNb2RlbCddLAorICAgIGxpbms6IHsKKyAgICAgIHByZTogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmxzKSB7CisgICAgICAgIGlmIChjdHJsc1swXSkgeworICAgICAgICAgIChpbnB1dFR5cGVbbG93ZXJjYXNlKGF0dHIudHlwZSldIHx8IGlucHV0VHlwZS50ZXh0KShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybHNbMF0sICRzbmlmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnJvd3NlciwgJGZpbHRlciwgJHBhcnNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKK31dOworCit2YXIgVkFMSURfQ0xBU1MgPSAnbmctdmFsaWQnLAorICAgIElOVkFMSURfQ0xBU1MgPSAnbmctaW52YWxpZCcsCisgICAgUFJJU1RJTkVfQ0xBU1MgPSAnbmctcHJpc3RpbmUnLAorICAgIERJUlRZX0NMQVNTID0gJ25nLWRpcnR5JywKKyAgICBVTlRPVUNIRURfQ0xBU1MgPSAnbmctdW50b3VjaGVkJywKKyAgICBUT1VDSEVEX0NMQVNTID0gJ25nLXRvdWNoZWQnLAorICAgIFBFTkRJTkdfQ0xBU1MgPSAnbmctcGVuZGluZyc7CisKKy8qKgorICogQG5nZG9jIHR5cGUKKyAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIKKyAqCisgKiBAcHJvcGVydHkge3N0cmluZ30gJHZpZXdWYWx1ZSBBY3R1YWwgc3RyaW5nIHZhbHVlIGluIHRoZSB2aWV3LgorICogQHByb3BlcnR5IHsqfSAkbW9kZWxWYWx1ZSBUaGUgdmFsdWUgaW4gdGhlIG1vZGVsIHRoYXQgdGhlIGNvbnRyb2wgaXMgYm91bmQgdG8uCisgKiBAcHJvcGVydHkge0FycmF5LjxGdW5jdGlvbj59ICRwYXJzZXJzIEFycmF5IG9mIGZ1bmN0aW9ucyB0byBleGVjdXRlLCBhcyBhIHBpcGVsaW5lLCB3aGVuZXZlcgorICAgICAgIHRoZSBjb250cm9sIHJlYWRzIHZhbHVlIGZyb20gdGhlIERPTS4gVGhlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGluIGFycmF5IG9yZGVyLCBlYWNoIHBhc3NpbmcKKyAgICAgICBpdHMgcmV0dXJuIHZhbHVlIHRocm91Z2ggdG8gdGhlIG5leHQuIFRoZSBsYXN0IHJldHVybiB2YWx1ZSBpcyBmb3J3YXJkZWQgdG8gdGhlCisgICAgICAge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZhbGlkYXRvcnMgYCR2YWxpZGF0b3JzYH0gY29sbGVjdGlvbi4KKworUGFyc2VycyBhcmUgdXNlZCB0byBzYW5pdGl6ZSAvIGNvbnZlcnQgdGhlIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2aWV3VmFsdWUKK2Akdmlld1ZhbHVlYH0uCisKK1JldHVybmluZyBgdW5kZWZpbmVkYCBmcm9tIGEgcGFyc2VyIG1lYW5zIGEgcGFyc2UgZXJyb3Igb2NjdXJyZWQuIEluIHRoYXQgY2FzZSwKK25vIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2YWxpZGF0b3JzIGAkdmFsaWRhdG9yc2B9IHdpbGwgcnVuIGFuZCB0aGUgYG5nTW9kZWxgCit3aWxsIGJlIHNldCB0byBgdW5kZWZpbmVkYCB1bmxlc3Mge0BsaW5rIG5nTW9kZWxPcHRpb25zIGBuZ01vZGVsT3B0aW9ucy5hbGxvd0ludmFsaWRgfQoraXMgc2V0IHRvIGB0cnVlYC4gVGhlIHBhcnNlIGVycm9yIGlzIHN0b3JlZCBpbiBgbmdNb2RlbC4kZXJyb3IucGFyc2VgLgorCisgKgorICogQHByb3BlcnR5IHtBcnJheS48RnVuY3Rpb24+fSAkZm9ybWF0dGVycyBBcnJheSBvZiBmdW5jdGlvbnMgdG8gZXhlY3V0ZSwgYXMgYSBwaXBlbGluZSwgd2hlbmV2ZXIKKyAgICAgICB0aGUgbW9kZWwgdmFsdWUgY2hhbmdlcy4gVGhlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGluIHJldmVyc2UgYXJyYXkgb3JkZXIsIGVhY2ggcGFzc2luZyB0aGUgdmFsdWUgdGhyb3VnaCB0byB0aGUKKyAgICAgICBuZXh0LiBUaGUgbGFzdCByZXR1cm4gdmFsdWUgaXMgdXNlZCBhcyB0aGUgYWN0dWFsIERPTSB2YWx1ZS4KKyAgICAgICBVc2VkIHRvIGZvcm1hdCAvIGNvbnZlcnQgdmFsdWVzIGZvciBkaXNwbGF5IGluIHRoZSBjb250cm9sLgorICogYGBganMKKyAqIGZ1bmN0aW9uIGZvcm1hdHRlcih2YWx1ZSkgeworICogICBpZiAodmFsdWUpIHsKKyAqICAgICByZXR1cm4gdmFsdWUudG9VcHBlckNhc2UoKTsKKyAqICAgfQorICogfQorICogbmdNb2RlbC4kZm9ybWF0dGVycy5wdXNoKGZvcm1hdHRlcik7CisgKiBgYGAKKyAqCisgKiBAcHJvcGVydHkge09iamVjdC48c3RyaW5nLCBmdW5jdGlvbj59ICR2YWxpZGF0b3JzIEEgY29sbGVjdGlvbiBvZiB2YWxpZGF0b3JzIHRoYXQgYXJlIGFwcGxpZWQKKyAqICAgICAgd2hlbmV2ZXIgdGhlIG1vZGVsIHZhbHVlIGNoYW5nZXMuIFRoZSBrZXkgdmFsdWUgd2l0aGluIHRoZSBvYmplY3QgcmVmZXJzIHRvIHRoZSBuYW1lIG9mIHRoZQorICogICAgICB2YWxpZGF0b3Igd2hpbGUgdGhlIGZ1bmN0aW9uIHJlZmVycyB0byB0aGUgdmFsaWRhdGlvbiBvcGVyYXRpb24uIFRoZSB2YWxpZGF0aW9uIG9wZXJhdGlvbiBpcworICogICAgICBwcm92aWRlZCB3aXRoIHRoZSBtb2RlbCB2YWx1ZSBhcyBhbiBhcmd1bWVudCBhbmQgbXVzdCByZXR1cm4gYSB0cnVlIG9yIGZhbHNlIHZhbHVlIGRlcGVuZGluZworICogICAgICBvbiB0aGUgcmVzcG9uc2Ugb2YgdGhhdCB2YWxpZGF0aW9uLgorICoKKyAqIGBgYGpzCisgKiBuZ01vZGVsLiR2YWxpZGF0b3JzLnZhbGlkQ2hhcmFjdGVycyA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkgeworICogICB2YXIgdmFsdWUgPSBtb2RlbFZhbHVlIHx8IHZpZXdWYWx1ZTsKKyAqICAgcmV0dXJuIC9bMC05XSsvLnRlc3QodmFsdWUpICYmCisgKiAgICAgICAgICAvW2Etel0rLy50ZXN0KHZhbHVlKSAmJgorICogICAgICAgICAgL1tBLVpdKy8udGVzdCh2YWx1ZSkgJiYKKyAqICAgICAgICAgIC9cVysvLnRlc3QodmFsdWUpOworICogfTsKKyAqIGBgYAorICoKKyAqIEBwcm9wZXJ0eSB7T2JqZWN0LjxzdHJpbmcsIGZ1bmN0aW9uPn0gJGFzeW5jVmFsaWRhdG9ycyBBIGNvbGxlY3Rpb24gb2YgdmFsaWRhdGlvbnMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8KKyAqICAgICAgcGVyZm9ybSBhbiBhc3luY2hyb25vdXMgdmFsaWRhdGlvbiAoZS5nLiBhIEhUVFAgcmVxdWVzdCkuIFRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoYXQgaXMgcHJvdmlkZWQKKyAqICAgICAgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgcHJvbWlzZSB3aGVuIGl0IGlzIHJ1biBkdXJpbmcgdGhlIG1vZGVsIHZhbGlkYXRpb24gcHJvY2Vzcy4gT25jZSB0aGUgcHJvbWlzZQorICogICAgICBpcyBkZWxpdmVyZWQgdGhlbiB0aGUgdmFsaWRhdGlvbiBzdGF0dXMgd2lsbCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIGZ1bGZpbGxlZCBhbmQgZmFsc2Ugd2hlbiByZWplY3RlZC4KKyAqICAgICAgV2hlbiB0aGUgYXN5bmNocm9ub3VzIHZhbGlkYXRvcnMgYXJlIHRyaWdnZXJlZCwgZWFjaCBvZiB0aGUgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiBwYXJhbGxlbCBhbmQgdGhlIG1vZGVsCisgKiAgICAgIHZhbHVlIHdpbGwgb25seSBiZSB1cGRhdGVkIG9uY2UgYWxsIHZhbGlkYXRvcnMgaGF2ZSBiZWVuIGZ1bGZpbGxlZC4gQXMgbG9uZyBhcyBhbiBhc3luY2hyb25vdXMgdmFsaWRhdG9yCisgKiAgICAgIGlzIHVuZnVsZmlsbGVkLCBpdHMga2V5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbnRyb2xsZXJzIGAkcGVuZGluZ2AgcHJvcGVydHkuIEFsc28sIGFsbCBhc3luY2hyb25vdXMgdmFsaWRhdG9ycworICogICAgICB3aWxsIG9ubHkgcnVuIG9uY2UgYWxsIHN5bmNocm9ub3VzIHZhbGlkYXRvcnMgaGF2ZSBwYXNzZWQuCisgKgorICogUGxlYXNlIG5vdGUgdGhhdCBpZiAkaHR0cCBpcyB1c2VkIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIHNlcnZlciByZXR1cm5zIGEgc3VjY2VzcyBIVFRQIHJlc3BvbnNlIGNvZGUKKyAqIGluIG9yZGVyIHRvIGZ1bGZpbGwgdGhlIHZhbGlkYXRpb24gYW5kIGEgc3RhdHVzIGxldmVsIG9mIGA0eHhgIGluIG9yZGVyIHRvIHJlamVjdCB0aGUgdmFsaWRhdGlvbi4KKyAqCisgKiBgYGBqcworICogbmdNb2RlbC4kYXN5bmNWYWxpZGF0b3JzLnVuaXF1ZVVzZXJuYW1lID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7CisgKiAgIHZhciB2YWx1ZSA9IG1vZGVsVmFsdWUgfHwgdmlld1ZhbHVlOworICoKKyAqICAgLy8gTG9va3VwIHVzZXIgYnkgdXNlcm5hbWUKKyAqICAgcmV0dXJuICRodHRwLmdldCgnL2FwaS91c2Vycy8nICsgdmFsdWUpLgorICogICAgICB0aGVuKGZ1bmN0aW9uIHJlc29sdmVkKCkgeworICogICAgICAgIC8vdXNlcm5hbWUgZXhpc3RzLCB0aGlzIG1lYW5zIHZhbGlkYXRpb24gZmFpbHMKKyAqICAgICAgICByZXR1cm4gJHEucmVqZWN0KCdleGlzdHMnKTsKKyAqICAgICAgfSwgZnVuY3Rpb24gcmVqZWN0ZWQoKSB7CisgKiAgICAgICAgLy91c2VybmFtZSBkb2VzIG5vdCBleGlzdCwgdGhlcmVmb3JlIHRoaXMgdmFsaWRhdGlvbiBwYXNzZXMKKyAqICAgICAgICByZXR1cm4gdHJ1ZTsKKyAqICAgICAgfSk7CisgKiB9OworICogYGBgCisgKgorICogQHByb3BlcnR5IHtBcnJheS48RnVuY3Rpb24+fSAkdmlld0NoYW5nZUxpc3RlbmVycyBBcnJheSBvZiBmdW5jdGlvbnMgdG8gZXhlY3V0ZSB3aGVuZXZlciB0aGUKKyAqICAgICB2aWV3IHZhbHVlIGhhcyBjaGFuZ2VkLiBJdCBpcyBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMsIGFuZCBpdHMgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCisgKiAgICAgVGhpcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhZGRpdGlvbmFsICR3YXRjaGVzIGFnYWluc3QgdGhlIG1vZGVsIHZhbHVlLgorICoKKyAqIEBwcm9wZXJ0eSB7T2JqZWN0fSAkZXJyb3IgQW4gb2JqZWN0IGhhc2ggd2l0aCBhbGwgZmFpbGluZyB2YWxpZGF0b3IgaWRzIGFzIGtleXMuCisgKiBAcHJvcGVydHkge09iamVjdH0gJHBlbmRpbmcgQW4gb2JqZWN0IGhhc2ggd2l0aCBhbGwgcGVuZGluZyB2YWxpZGF0b3IgaWRzIGFzIGtleXMuCisgKgorICogQHByb3BlcnR5IHtib29sZWFufSAkdW50b3VjaGVkIFRydWUgaWYgY29udHJvbCBoYXMgbm90IGxvc3QgZm9jdXMgeWV0LgorICogQHByb3BlcnR5IHtib29sZWFufSAkdG91Y2hlZCBUcnVlIGlmIGNvbnRyb2wgaGFzIGxvc3QgZm9jdXMuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59ICRwcmlzdGluZSBUcnVlIGlmIHVzZXIgaGFzIG5vdCBpbnRlcmFjdGVkIHdpdGggdGhlIGNvbnRyb2wgeWV0LgorICogQHByb3BlcnR5IHtib29sZWFufSAkZGlydHkgVHJ1ZSBpZiB1c2VyIGhhcyBhbHJlYWR5IGludGVyYWN0ZWQgd2l0aCB0aGUgY29udHJvbC4KKyAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHZhbGlkIFRydWUgaWYgdGhlcmUgaXMgbm8gZXJyb3IuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59ICRpbnZhbGlkIFRydWUgaWYgYXQgbGVhc3Qgb25lIGVycm9yIG9uIHRoZSBjb250cm9sLgorICogQHByb3BlcnR5IHtzdHJpbmd9ICRuYW1lIFRoZSBuYW1lIGF0dHJpYnV0ZSBvZiB0aGUgY29udHJvbC4KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqCisgKiBgTmdNb2RlbENvbnRyb2xsZXJgIHByb3ZpZGVzIEFQSSBmb3IgdGhlIHtAbGluayBuZ01vZGVsIGBuZ01vZGVsYH0gZGlyZWN0aXZlLgorICogVGhlIGNvbnRyb2xsZXIgY29udGFpbnMgc2VydmljZXMgZm9yIGRhdGEtYmluZGluZywgdmFsaWRhdGlvbiwgQ1NTIHVwZGF0ZXMsIGFuZCB2YWx1ZSBmb3JtYXR0aW5nCisgKiBhbmQgcGFyc2luZy4gSXQgcHVycG9zZWZ1bGx5IGRvZXMgbm90IGNvbnRhaW4gYW55IGxvZ2ljIHdoaWNoIGRlYWxzIHdpdGggRE9NIHJlbmRlcmluZyBvcgorICogbGlzdGVuaW5nIHRvIERPTSBldmVudHMuCisgKiBTdWNoIERPTSByZWxhdGVkIGxvZ2ljIHNob3VsZCBiZSBwcm92aWRlZCBieSBvdGhlciBkaXJlY3RpdmVzIHdoaWNoIG1ha2UgdXNlIG9mCisgKiBgTmdNb2RlbENvbnRyb2xsZXJgIGZvciBkYXRhLWJpbmRpbmcgdG8gY29udHJvbCBlbGVtZW50cy4KKyAqIEFuZ3VsYXIgcHJvdmlkZXMgdGhpcyBET00gbG9naWMgZm9yIG1vc3Qge0BsaW5rIGlucHV0IGBpbnB1dGB9IGVsZW1lbnRzLgorICogQXQgdGhlIGVuZCBvZiB0aGlzIHBhZ2UgeW91IGNhbiBmaW5kIGEge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjY3VzdG9tLWNvbnRyb2wtZXhhbXBsZQorICogY3VzdG9tIGNvbnRyb2wgZXhhbXBsZX0gdGhhdCB1c2VzIGBuZ01vZGVsQ29udHJvbGxlcmAgdG8gYmluZCB0byBgY29udGVudGVkaXRhYmxlYCBlbGVtZW50cy4KKyAqCisgKiBAZXhhbXBsZQorICogIyMjIEN1c3RvbSBDb250cm9sIEV4YW1wbGUKKyAqIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGBOZ01vZGVsQ29udHJvbGxlcmAgd2l0aCBhIGN1c3RvbSBjb250cm9sIHRvIGFjaGlldmUKKyAqIGRhdGEtYmluZGluZy4gTm90aWNlIGhvdyBkaWZmZXJlbnQgZGlyZWN0aXZlcyAoYGNvbnRlbnRlZGl0YWJsZWAsIGBuZy1tb2RlbGAsIGFuZCBgcmVxdWlyZWRgKQorICogY29sbGFib3JhdGUgdG9nZXRoZXIgdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCByZXN1bHQuCisgKgorICogTm90ZSB0aGF0IGBjb250ZW50ZWRpdGFibGVgIGlzIGFuIEhUTUw1IGF0dHJpYnV0ZSwgd2hpY2ggdGVsbHMgdGhlIGJyb3dzZXIgdG8gbGV0IHRoZSBlbGVtZW50CisgKiBjb250ZW50cyBiZSBlZGl0ZWQgaW4gcGxhY2UgYnkgdGhlIHVzZXIuICBUaGlzIHdpbGwgbm90IHdvcmsgb24gb2xkZXIgYnJvd3NlcnMuCisgKgorICogV2UgYXJlIHVzaW5nIHRoZSB7QGxpbmsgbmcuc2VydmljZTokc2NlICRzY2V9IHNlcnZpY2UgaGVyZSBhbmQgaW5jbHVkZSB0aGUge0BsaW5rIG5nU2FuaXRpemUgJHNhbml0aXplfQorICogbW9kdWxlIHRvIGF1dG9tYXRpY2FsbHkgcmVtb3ZlICJiYWQiIGNvbnRlbnQgbGlrZSBpbmxpbmUgZXZlbnQgbGlzdGVuZXIgKGUuZy4gYDxzcGFuIG9uY2xpY2s9Ii4uLiI+YCkuCisgKiBIb3dldmVyLCBhcyB3ZSBhcmUgdXNpbmcgYCRzY2VgIHRoZSBtb2RlbCBjYW4gc3RpbGwgZGVjaWRlIHRvIHByb3ZpZGUgdW5zYWZlIGNvbnRlbnQgaWYgaXQgbWFya3MKKyAqIHRoYXQgY29udGVudCB1c2luZyB0aGUgYCRzY2VgIHNlcnZpY2UuCisgKgorICogPGV4YW1wbGUgbmFtZT0iTmdNb2RlbENvbnRyb2xsZXIiIG1vZHVsZT0iY3VzdG9tQ29udHJvbCIgZGVwcz0iYW5ndWxhci1zYW5pdGl6ZS5qcyI+CisgICAgPGZpbGUgbmFtZT0ic3R5bGUuY3NzIj4KKyAgICAgIFtjb250ZW50ZWRpdGFibGVdIHsKKyAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOworICAgICAgICBtaW4taGVpZ2h0OiAyMHB4OworICAgICAgfQorCisgICAgICAubmctaW52YWxpZCB7CisgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJlZDsKKyAgICAgIH0KKworICAgIDwvZmlsZT4KKyAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgorICAgICAgYW5ndWxhci5tb2R1bGUoJ2N1c3RvbUNvbnRyb2wnLCBbJ25nU2FuaXRpemUnXSkuCisgICAgICAgIGRpcmVjdGl2ZSgnY29udGVudGVkaXRhYmxlJywgWyckc2NlJywgZnVuY3Rpb24oJHNjZSkgeworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICByZXN0cmljdDogJ0EnLCAvLyBvbmx5IGFjdGl2YXRlIG9uIGVsZW1lbnQgYXR0cmlidXRlCisgICAgICAgICAgICByZXF1aXJlOiAnP25nTW9kZWwnLCAvLyBnZXQgYSBob2xkIG9mIE5nTW9kZWxDb250cm9sbGVyCisgICAgICAgICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMsIG5nTW9kZWwpIHsKKyAgICAgICAgICAgICAgaWYgKCFuZ01vZGVsKSByZXR1cm47IC8vIGRvIG5vdGhpbmcgaWYgbm8gbmctbW9kZWwKKworICAgICAgICAgICAgICAvLyBTcGVjaWZ5IGhvdyBVSSBzaG91bGQgYmUgdXBkYXRlZAorICAgICAgICAgICAgICBuZ01vZGVsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBlbGVtZW50Lmh0bWwoJHNjZS5nZXRUcnVzdGVkSHRtbChuZ01vZGVsLiR2aWV3VmFsdWUgfHwgJycpKTsKKyAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIGNoYW5nZSBldmVudHMgdG8gZW5hYmxlIGJpbmRpbmcKKyAgICAgICAgICAgICAgZWxlbWVudC5vbignYmx1ciBrZXl1cCBjaGFuZ2UnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBzY29wZS4kZXZhbEFzeW5jKHJlYWQpOworICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgcmVhZCgpOyAvLyBpbml0aWFsaXplCisKKyAgICAgICAgICAgICAgLy8gV3JpdGUgZGF0YSB0byB0aGUgbW9kZWwKKyAgICAgICAgICAgICAgZnVuY3Rpb24gcmVhZCgpIHsKKyAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IGVsZW1lbnQuaHRtbCgpOworICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UgY2xlYXIgdGhlIGNvbnRlbnQgZWRpdGFibGUgdGhlIGJyb3dzZXIgbGVhdmVzIGEgPGJyPiBiZWhpbmQKKyAgICAgICAgICAgICAgICAvLyBJZiBzdHJpcC1iciBhdHRyaWJ1dGUgaXMgcHJvdmlkZWQgdGhlbiB3ZSBzdHJpcCB0aGlzIG91dAorICAgICAgICAgICAgICAgIGlmICggYXR0cnMuc3RyaXBCciAmJiBodG1sID09ICc8YnI+JyApIHsKKyAgICAgICAgICAgICAgICAgIGh0bWwgPSAnJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmdNb2RlbC4kc2V0Vmlld1ZhbHVlKGh0bWwpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgfV0pOworICAgIDwvZmlsZT4KKyAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgIDxmb3JtIG5hbWU9Im15Rm9ybSI+CisgICAgICAgPGRpdiBjb250ZW50ZWRpdGFibGUKKyAgICAgICAgICAgIG5hbWU9Im15V2lkZ2V0IiBuZy1tb2RlbD0idXNlckNvbnRlbnQiCisgICAgICAgICAgICBzdHJpcC1icj0idHJ1ZSIKKyAgICAgICAgICAgIHJlcXVpcmVkPkNoYW5nZSBtZSE8L2Rpdj4KKyAgICAgICAgPHNwYW4gbmctc2hvdz0ibXlGb3JtLm15V2lkZ2V0LiRlcnJvci5yZXF1aXJlZCI+UmVxdWlyZWQhPC9zcGFuPgorICAgICAgIDxocj4KKyAgICAgICA8dGV4dGFyZWEgbmctbW9kZWw9InVzZXJDb250ZW50Ij48L3RleHRhcmVhPgorICAgICAgPC9mb3JtPgorICAgIDwvZmlsZT4KKyAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAgICBpdCgnc2hvdWxkIGRhdGEtYmluZCBhbmQgYmVjb21lIGludmFsaWQnLCBmdW5jdGlvbigpIHsKKyAgICAgIGlmIChicm93c2VyLnBhcmFtcy5icm93c2VyID09ICdzYWZhcmknIHx8IGJyb3dzZXIucGFyYW1zLmJyb3dzZXIgPT0gJ2ZpcmVmb3gnKSB7CisgICAgICAgIC8vIFNhZmFyaURyaXZlciBjYW4ndCBoYW5kbGUgY29udGVudGVkaXRhYmxlCisgICAgICAgIC8vIGFuZCBGaXJlZm94IGRyaXZlciBjYW4ndCBjbGVhciBjb250ZW50ZWRpdGFibGVzIHZlcnkgd2VsbAorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICB2YXIgY29udGVudEVkaXRhYmxlID0gZWxlbWVudChieS5jc3MoJ1tjb250ZW50ZWRpdGFibGVdJykpOworICAgICAgdmFyIGNvbnRlbnQgPSAnQ2hhbmdlIG1lISc7CisKKyAgICAgIGV4cGVjdChjb250ZW50RWRpdGFibGUuZ2V0VGV4dCgpKS50b0VxdWFsKGNvbnRlbnQpOworCisgICAgICBjb250ZW50RWRpdGFibGUuY2xlYXIoKTsKKyAgICAgIGNvbnRlbnRFZGl0YWJsZS5zZW5kS2V5cyhwcm90cmFjdG9yLktleS5CQUNLX1NQQUNFKTsKKyAgICAgIGV4cGVjdChjb250ZW50RWRpdGFibGUuZ2V0VGV4dCgpKS50b0VxdWFsKCcnKTsKKyAgICAgIGV4cGVjdChjb250ZW50RWRpdGFibGUuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b01hdGNoKC9uZy1pbnZhbGlkLXJlcXVpcmVkLyk7CisgICAgfSk7CisgICAgPC9maWxlPgorICogPC9leGFtcGxlPgorICoKKyAqCisgKi8KK3ZhciBOZ01vZGVsQ29udHJvbGxlciA9IFsnJHNjb3BlJywgJyRleGNlcHRpb25IYW5kbGVyJywgJyRhdHRycycsICckZWxlbWVudCcsICckcGFyc2UnLCAnJGFuaW1hdGUnLCAnJHRpbWVvdXQnLCAnJHJvb3RTY29wZScsICckcScsICckaW50ZXJwb2xhdGUnLAorICAgIGZ1bmN0aW9uKCRzY29wZSwgJGV4Y2VwdGlvbkhhbmRsZXIsICRhdHRyLCAkZWxlbWVudCwgJHBhcnNlLCAkYW5pbWF0ZSwgJHRpbWVvdXQsICRyb290U2NvcGUsICRxLCAkaW50ZXJwb2xhdGUpIHsKKyAgdGhpcy4kdmlld1ZhbHVlID0gTnVtYmVyLk5hTjsKKyAgdGhpcy4kbW9kZWxWYWx1ZSA9IE51bWJlci5OYU47CisgIHRoaXMuJCRyYXdNb2RlbFZhbHVlID0gdW5kZWZpbmVkOyAvLyBzdG9yZXMgdGhlIHBhcnNlZCBtb2RlbFZhbHVlIC8gbW9kZWwgc2V0IGZyb20gc2NvcGUgcmVnYXJkbGVzcyBvZiB2YWxpZGl0eS4KKyAgdGhpcy4kdmFsaWRhdG9ycyA9IHt9OworICB0aGlzLiRhc3luY1ZhbGlkYXRvcnMgPSB7fTsKKyAgdGhpcy4kcGFyc2VycyA9IFtdOworICB0aGlzLiRmb3JtYXR0ZXJzID0gW107CisgIHRoaXMuJHZpZXdDaGFuZ2VMaXN0ZW5lcnMgPSBbXTsKKyAgdGhpcy4kdW50b3VjaGVkID0gdHJ1ZTsKKyAgdGhpcy4kdG91Y2hlZCA9IGZhbHNlOworICB0aGlzLiRwcmlzdGluZSA9IHRydWU7CisgIHRoaXMuJGRpcnR5ID0gZmFsc2U7CisgIHRoaXMuJHZhbGlkID0gdHJ1ZTsKKyAgdGhpcy4kaW52YWxpZCA9IGZhbHNlOworICB0aGlzLiRlcnJvciA9IHt9OyAvLyBrZWVwIGludmFsaWQga2V5cyBoZXJlCisgIHRoaXMuJCRzdWNjZXNzID0ge307IC8vIGtlZXAgdmFsaWQga2V5cyBoZXJlCisgIHRoaXMuJHBlbmRpbmcgPSB1bmRlZmluZWQ7IC8vIGtlZXAgcGVuZGluZyBrZXlzIGhlcmUKKyAgdGhpcy4kbmFtZSA9ICRpbnRlcnBvbGF0ZSgkYXR0ci5uYW1lIHx8ICcnLCBmYWxzZSkoJHNjb3BlKTsKKworCisgIHZhciBwYXJzZWROZ01vZGVsID0gJHBhcnNlKCRhdHRyLm5nTW9kZWwpLAorICAgICAgcGFyc2VkTmdNb2RlbEFzc2lnbiA9IHBhcnNlZE5nTW9kZWwuYXNzaWduLAorICAgICAgbmdNb2RlbEdldCA9IHBhcnNlZE5nTW9kZWwsCisgICAgICBuZ01vZGVsU2V0ID0gcGFyc2VkTmdNb2RlbEFzc2lnbiwKKyAgICAgIHBlbmRpbmdEZWJvdW5jZSA9IG51bGwsCisgICAgICBjdHJsID0gdGhpczsKKworICB0aGlzLiQkc2V0T3B0aW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICBjdHJsLiRvcHRpb25zID0gb3B0aW9uczsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmdldHRlclNldHRlcikgeworICAgICAgdmFyIGludm9rZU1vZGVsR2V0dGVyID0gJHBhcnNlKCRhdHRyLm5nTW9kZWwgKyAnKCknKSwKKyAgICAgICAgICBpbnZva2VNb2RlbFNldHRlciA9ICRwYXJzZSgkYXR0ci5uZ01vZGVsICsgJygkJCRwKScpOworCisgICAgICBuZ01vZGVsR2V0ID0gZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgIHZhciBtb2RlbFZhbHVlID0gcGFyc2VkTmdNb2RlbCgkc2NvcGUpOworICAgICAgICBpZiAoaXNGdW5jdGlvbihtb2RlbFZhbHVlKSkgeworICAgICAgICAgIG1vZGVsVmFsdWUgPSBpbnZva2VNb2RlbEdldHRlcigkc2NvcGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtb2RlbFZhbHVlOworICAgICAgfTsKKyAgICAgIG5nTW9kZWxTZXQgPSBmdW5jdGlvbigkc2NvcGUsIG5ld1ZhbHVlKSB7CisgICAgICAgIGlmIChpc0Z1bmN0aW9uKHBhcnNlZE5nTW9kZWwoJHNjb3BlKSkpIHsKKyAgICAgICAgICBpbnZva2VNb2RlbFNldHRlcigkc2NvcGUsIHskJCRwOiBjdHJsLiRtb2RlbFZhbHVlfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcGFyc2VkTmdNb2RlbEFzc2lnbigkc2NvcGUsIGN0cmwuJG1vZGVsVmFsdWUpOworICAgICAgICB9CisgICAgICB9OworICAgIH0gZWxzZSBpZiAoIXBhcnNlZE5nTW9kZWwuYXNzaWduKSB7CisgICAgICB0aHJvdyAkbmdNb2RlbE1pbkVycignbm9uYXNzaWduJywgIkV4cHJlc3Npb24gJ3swfScgaXMgbm9uLWFzc2lnbmFibGUuIEVsZW1lbnQ6IHsxfSIsCisgICAgICAgICAgJGF0dHIubmdNb2RlbCwgc3RhcnRpbmdUYWcoJGVsZW1lbnQpKTsKKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkcmVuZGVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBDYWxsZWQgd2hlbiB0aGUgdmlldyBuZWVkcyB0byBiZSB1cGRhdGVkLiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSB1c2VyIG9mIHRoZSBuZy1tb2RlbAorICAgKiBkaXJlY3RpdmUgd2lsbCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCisgICAqCisgICAqIFRoZSBgJHJlbmRlcigpYCBtZXRob2QgaXMgaW52b2tlZCBpbiB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbnM6CisgICAqCisgICAqICogYCRyb2xsYmFja1ZpZXdWYWx1ZSgpYCBpcyBjYWxsZWQuICBJZiB3ZSBhcmUgcm9sbGluZyBiYWNrIHRoZSB2aWV3IHZhbHVlIHRvIHRoZSBsYXN0CisgICAqICAgY29tbWl0dGVkIHZhbHVlIHRoZW4gYCRyZW5kZXIoKWAgaXMgY2FsbGVkIHRvIHVwZGF0ZSB0aGUgaW5wdXQgY29udHJvbC4KKyAgICogKiBUaGUgdmFsdWUgcmVmZXJlbmNlZCBieSBgbmctbW9kZWxgIGlzIGNoYW5nZWQgcHJvZ3JhbW1hdGljYWxseSBhbmQgYm90aCB0aGUgYCRtb2RlbFZhbHVlYCBhbmQKKyAgICogICB0aGUgYCR2aWV3VmFsdWVgIGFyZSBkaWZmZXJlbnQgdG8gbGFzdCB0aW1lLgorICAgKgorICAgKiBTaW5jZSBgbmctbW9kZWxgIGRvZXMgbm90IGRvIGEgZGVlcCB3YXRjaCwgYCRyZW5kZXIoKWAgaXMgb25seSBpbnZva2VkIGlmIHRoZSB2YWx1ZXMgb2YKKyAgICogYCRtb2RlbFZhbHVlYCBhbmQgYCR2aWV3VmFsdWVgIGFyZSBhY3R1YWxseSBkaWZmZXJlbnQgdG8gdGhlaXIgcHJldmlvdXMgdmFsdWUuIElmIGAkbW9kZWxWYWx1ZWAKKyAgICogb3IgYCR2aWV3VmFsdWVgIGFyZSBvYmplY3RzIChyYXRoZXIgdGhhbiBhIHN0cmluZyBvciBudW1iZXIpIHRoZW4gYCRyZW5kZXIoKWAgd2lsbCBub3QgYmUKKyAgICogaW52b2tlZCBpZiB5b3Ugb25seSBjaGFuZ2UgYSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0cy4KKyAgICovCisgIHRoaXMuJHJlbmRlciA9IG5vb3A7CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkaXNFbXB0eQorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGUgdmFsdWUgb2YgYW4gaW5wdXQgaXMgZW1wdHkuCisgICAqCisgICAqIEZvciBpbnN0YW5jZSwgdGhlIHJlcXVpcmVkIGRpcmVjdGl2ZSBkb2VzIHRoaXMgdG8gd29yayBvdXQgaWYgdGhlIGlucHV0IGhhcyBkYXRhIG9yIG5vdC4KKyAgICoKKyAgICogVGhlIGRlZmF1bHQgYCRpc0VtcHR5YCBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgdmFsdWUgaXMgYHVuZGVmaW5lZGAsIGAnJ2AsIGBudWxsYCBvciBgTmFOYC4KKyAgICoKKyAgICogWW91IGNhbiBvdmVycmlkZSB0aGlzIGZvciBpbnB1dCBkaXJlY3RpdmVzIHdob3NlIGNvbmNlcHQgb2YgYmVpbmcgZW1wdHkgaXMgZGlmZmVyZW50IHRvIHRoZQorICAgKiBkZWZhdWx0LiBUaGUgYGNoZWNrYm94SW5wdXRUeXBlYCBkaXJlY3RpdmUgZG9lcyB0aGlzIGJlY2F1c2UgaW4gaXRzIGNhc2UgYSB2YWx1ZSBvZiBgZmFsc2VgCisgICAqIGltcGxpZXMgZW1wdHkuCisgICAqCisgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBpbnB1dCB0byBjaGVjayBmb3IgZW1wdGluZXNzLgorICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzICJlbXB0eSIuCisgICAqLworICB0aGlzLiRpc0VtcHR5ID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgICByZXR1cm4gaXNVbmRlZmluZWQodmFsdWUpIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWU7CisgIH07CisKKyAgdmFyIHBhcmVudEZvcm0gPSAkZWxlbWVudC5pbmhlcml0ZWREYXRhKCckZm9ybUNvbnRyb2xsZXInKSB8fCBudWxsRm9ybUN0cmwsCisgICAgICBjdXJyZW50VmFsaWRhdGlvblJ1bklkID0gMDsKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXRWYWxpZGl0eQorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogQ2hhbmdlIHRoZSB2YWxpZGl0eSBzdGF0ZSwgYW5kIG5vdGlmeSB0aGUgZm9ybS4KKyAgICoKKyAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB3aXRoaW4gJHBhcnNlcnMvJGZvcm1hdHRlcnMgb3IgYSBjdXN0b20gdmFsaWRhdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICogSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBpdCBzaG91bGQgYmUgc3VmZmljaWVudCB0byB1c2UgdGhlIGBuZ01vZGVsLiR2YWxpZGF0b3JzYCBhbmQKKyAgICogYG5nTW9kZWwuJGFzeW5jVmFsaWRhdG9yc2AgY29sbGVjdGlvbnMgd2hpY2ggd2lsbCBjYWxsIGAkc2V0VmFsaWRpdHlgIGF1dG9tYXRpY2FsbHkuCisgICAqCisgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWxpZGF0aW9uRXJyb3JLZXkgTmFtZSBvZiB0aGUgdmFsaWRhdG9yLiBUaGUgYHZhbGlkYXRpb25FcnJvcktleWAgd2lsbCBiZSBhc3NpZ25lZAorICAgKiAgICAgICAgdG8gZWl0aGVyIGAkZXJyb3JbdmFsaWRhdGlvbkVycm9yS2V5XWAgb3IgYCRwZW5kaW5nW3ZhbGlkYXRpb25FcnJvcktleV1gCisgICAqICAgICAgICAoZm9yIHVuZnVsZmlsbGVkIGAkYXN5bmNWYWxpZGF0b3JzYCksIHNvIHRoYXQgaXQgaXMgYXZhaWxhYmxlIGZvciBkYXRhLWJpbmRpbmcuCisgICAqICAgICAgICBUaGUgYHZhbGlkYXRpb25FcnJvcktleWAgc2hvdWxkIGJlIGluIGNhbWVsQ2FzZSBhbmQgd2lsbCBnZXQgY29udmVydGVkIGludG8gZGFzaC1jYXNlCisgICAqICAgICAgICBmb3IgY2xhc3MgbmFtZS4gRXhhbXBsZTogYG15RXJyb3JgIHdpbGwgcmVzdWx0IGluIGBuZy12YWxpZC1teS1lcnJvcmAgYW5kIGBuZy1pbnZhbGlkLW15LWVycm9yYAorICAgKiAgICAgICAgY2xhc3MgYW5kIGNhbiBiZSBib3VuZCB0byBhcyAgYHt7c29tZUZvcm0uc29tZUNvbnRyb2wuJGVycm9yLm15RXJyb3J9fWAgLgorICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzVmFsaWQgV2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBpcyB2YWxpZCAodHJ1ZSksIGludmFsaWQgKGZhbHNlKSwgcGVuZGluZyAodW5kZWZpbmVkKSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHNraXBwZWQgKG51bGwpLiBQZW5kaW5nIGlzIHVzZWQgZm9yIHVuZnVsZmlsbGVkIGAkYXN5bmNWYWxpZGF0b3JzYC4KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFNraXBwZWQgaXMgdXNlZCBieSBBbmd1bGFyIHdoZW4gdmFsaWRhdG9ycyBkbyBub3QgcnVuIGJlY2F1c2Ugb2YgcGFyc2UgZXJyb3JzIGFuZAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBgJGFzeW5jVmFsaWRhdG9yc2AgZG8gbm90IHJ1biBiZWNhdXNlIGFueSBvZiB0aGUgYCR2YWxpZGF0b3JzYCBmYWlsZWQuCisgICAqLworICBhZGRTZXRWYWxpZGl0eU1ldGhvZCh7CisgICAgY3RybDogdGhpcywKKyAgICAkZWxlbWVudDogJGVsZW1lbnQsCisgICAgc2V0OiBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7CisgICAgICBvYmplY3RbcHJvcGVydHldID0gdHJ1ZTsKKyAgICB9LAorICAgIHVuc2V0OiBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7CisgICAgICBkZWxldGUgb2JqZWN0W3Byb3BlcnR5XTsKKyAgICB9LAorICAgIHBhcmVudEZvcm06IHBhcmVudEZvcm0sCisgICAgJGFuaW1hdGU6ICRhbmltYXRlCisgIH0pOworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHNldFByaXN0aW5lCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBTZXRzIHRoZSBjb250cm9sIHRvIGl0cyBwcmlzdGluZSBzdGF0ZS4KKyAgICoKKyAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlIGBuZy1kaXJ0eWAgY2xhc3MgYW5kIHNldCB0aGUgY29udHJvbCB0byBpdHMgcHJpc3RpbmUKKyAgICogc3RhdGUgKGBuZy1wcmlzdGluZWAgY2xhc3MpLiBBIG1vZGVsIGlzIGNvbnNpZGVyZWQgdG8gYmUgcHJpc3RpbmUgd2hlbiB0aGUgY29udHJvbAorICAgKiBoYXMgbm90IGJlZW4gY2hhbmdlZCBmcm9tIHdoZW4gZmlyc3QgY29tcGlsZWQuCisgICAqLworICB0aGlzLiRzZXRQcmlzdGluZSA9IGZ1bmN0aW9uKCkgeworICAgIGN0cmwuJGRpcnR5ID0gZmFsc2U7CisgICAgY3RybC4kcHJpc3RpbmUgPSB0cnVlOworICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKCRlbGVtZW50LCBESVJUWV9DTEFTUyk7CisgICAgJGFuaW1hdGUuYWRkQ2xhc3MoJGVsZW1lbnQsIFBSSVNUSU5FX0NMQVNTKTsKKyAgfTsKKworICAvKioKKyAgICogQG5nZG9jIG1ldGhvZAorICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXREaXJ0eQorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogU2V0cyB0aGUgY29udHJvbCB0byBpdHMgZGlydHkgc3RhdGUuCisgICAqCisgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBgbmctcHJpc3RpbmVgIGNsYXNzIGFuZCBzZXQgdGhlIGNvbnRyb2wgdG8gaXRzIGRpcnR5CisgICAqIHN0YXRlIChgbmctZGlydHlgIGNsYXNzKS4gQSBtb2RlbCBpcyBjb25zaWRlcmVkIHRvIGJlIGRpcnR5IHdoZW4gdGhlIGNvbnRyb2wgaGFzIGJlZW4gY2hhbmdlZAorICAgKiBmcm9tIHdoZW4gZmlyc3QgY29tcGlsZWQuCisgICAqLworICB0aGlzLiRzZXREaXJ0eSA9IGZ1bmN0aW9uKCkgeworICAgIGN0cmwuJGRpcnR5ID0gdHJ1ZTsKKyAgICBjdHJsLiRwcmlzdGluZSA9IGZhbHNlOworICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKCRlbGVtZW50LCBQUklTVElORV9DTEFTUyk7CisgICAgJGFuaW1hdGUuYWRkQ2xhc3MoJGVsZW1lbnQsIERJUlRZX0NMQVNTKTsKKyAgICBwYXJlbnRGb3JtLiRzZXREaXJ0eSgpOworICB9OworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHNldFVudG91Y2hlZAorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogU2V0cyB0aGUgY29udHJvbCB0byBpdHMgdW50b3VjaGVkIHN0YXRlLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHJlbW92ZSB0aGUgYG5nLXRvdWNoZWRgIGNsYXNzIGFuZCBzZXQgdGhlIGNvbnRyb2wgdG8gaXRzCisgICAqIHVudG91Y2hlZCBzdGF0ZSAoYG5nLXVudG91Y2hlZGAgY2xhc3MpLiBVcG9uIGNvbXBpbGF0aW9uLCBhIG1vZGVsIGlzIHNldCBhcyB1bnRvdWNoZWQKKyAgICogYnkgZGVmYXVsdCwgaG93ZXZlciB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3RvcmUgdGhhdCBzdGF0ZSBpZiB0aGUgbW9kZWwgaGFzCisgICAqIGFscmVhZHkgYmVlbiB0b3VjaGVkIGJ5IHRoZSB1c2VyLgorICAgKi8KKyAgdGhpcy4kc2V0VW50b3VjaGVkID0gZnVuY3Rpb24oKSB7CisgICAgY3RybC4kdG91Y2hlZCA9IGZhbHNlOworICAgIGN0cmwuJHVudG91Y2hlZCA9IHRydWU7CisgICAgJGFuaW1hdGUuc2V0Q2xhc3MoJGVsZW1lbnQsIFVOVE9VQ0hFRF9DTEFTUywgVE9VQ0hFRF9DTEFTUyk7CisgIH07CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkc2V0VG91Y2hlZAorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogU2V0cyB0aGUgY29udHJvbCB0byBpdHMgdG91Y2hlZCBzdGF0ZS4KKyAgICoKKyAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlIGBuZy11bnRvdWNoZWRgIGNsYXNzIGFuZCBzZXQgdGhlIGNvbnRyb2wgdG8gaXRzCisgICAqIHRvdWNoZWQgc3RhdGUgKGBuZy10b3VjaGVkYCBjbGFzcykuIEEgbW9kZWwgaXMgY29uc2lkZXJlZCB0byBiZSB0b3VjaGVkIHdoZW4gdGhlIHVzZXIgaGFzCisgICAqIGZpcnN0IGZvY3VzZWQgdGhlIGNvbnRyb2wgZWxlbWVudCBhbmQgdGhlbiBzaGlmdGVkIGZvY3VzIGF3YXkgZnJvbSB0aGUgY29udHJvbCAoYmx1ciBldmVudCkuCisgICAqLworICB0aGlzLiRzZXRUb3VjaGVkID0gZnVuY3Rpb24oKSB7CisgICAgY3RybC4kdG91Y2hlZCA9IHRydWU7CisgICAgY3RybC4kdW50b3VjaGVkID0gZmFsc2U7CisgICAgJGFuaW1hdGUuc2V0Q2xhc3MoJGVsZW1lbnQsIFRPVUNIRURfQ0xBU1MsIFVOVE9VQ0hFRF9DTEFTUyk7CisgIH07CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkcm9sbGJhY2tWaWV3VmFsdWUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uCisgICAqIENhbmNlbCBhbiB1cGRhdGUgYW5kIHJlc2V0IHRoZSBpbnB1dCBlbGVtZW50J3MgdmFsdWUgdG8gcHJldmVudCBhbiB1cGRhdGUgdG8gdGhlIGAkbW9kZWxWYWx1ZWAsCisgICAqIHdoaWNoIG1heSBiZSBjYXVzZWQgYnkgYSBwZW5kaW5nIGRlYm91bmNlZCBldmVudCBvciBiZWNhdXNlIHRoZSBpbnB1dCBpcyB3YWl0aW5nIGZvciBhIHNvbWUKKyAgICogZnV0dXJlIGV2ZW50LgorICAgKgorICAgKiBJZiB5b3UgaGF2ZSBhbiBpbnB1dCB0aGF0IHVzZXMgYG5nLW1vZGVsLW9wdGlvbnNgIHRvIHNldCB1cCBkZWJvdW5jZWQgZXZlbnRzIG9yIGV2ZW50cyBzdWNoCisgICAqIGFzIGJsdXIgeW91IGNhbiBoYXZlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZXJlIGlzIGEgcGVyaW9kIHdoZW4gdGhlIGAkdmlld1ZhbHVlYAorICAgKiBpcyBvdXQgb2Ygc3luY2ggd2l0aCB0aGUgbmdNb2RlbCdzIGAkbW9kZWxWYWx1ZWAuCisgICAqCisgICAqIEluIHRoaXMgY2FzZSwgeW91IGNhbiBydW4gaW50byBkaWZmaWN1bHRpZXMgaWYgeW91IHRyeSB0byB1cGRhdGUgdGhlIG5nTW9kZWwncyBgJG1vZGVsVmFsdWVgCisgICAqIHByb2dyYW1tYXRpY2FsbHkgYmVmb3JlIHRoZXNlIGRlYm91bmNlZC9mdXR1cmUgZXZlbnRzIGhhdmUgcmVzb2x2ZWQvb2NjdXJyZWQsIGJlY2F1c2UgQW5ndWxhcidzCisgICAqIGRpcnR5IGNoZWNraW5nIG1lY2hhbmlzbSBpcyBub3QgYWJsZSB0byB0ZWxsIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhY3R1YWxseSBjaGFuZ2VkIG9yIG5vdC4KKyAgICoKKyAgICogVGhlIGAkcm9sbGJhY2tWaWV3VmFsdWUoKWAgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHByb2dyYW1tYXRpY2FsbHkgY2hhbmdpbmcgdGhlIG1vZGVsIG9mIGFuCisgICAqIGlucHV0IHdoaWNoIG1heSBoYXZlIHN1Y2ggZXZlbnRzIHBlbmRpbmcuIFRoaXMgaXMgaW1wb3J0YW50IGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICAgKiBpbnB1dCBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IG1vZGVsIHZhbHVlIGFuZCBhbnkgcGVuZGluZyBvcGVyYXRpb25zIGFyZSBjYW5jZWxsZWQuCisgICAqCisgICAqIDxleGFtcGxlIG5hbWU9Im5nLW1vZGVsLWNhbmNlbC11cGRhdGUiIG1vZHVsZT0iY2FuY2VsLXVwZGF0ZS1leGFtcGxlIj4KKyAgICogICA8ZmlsZSBuYW1lPSJhcHAuanMiPgorICAgKiAgICAgYW5ndWxhci5tb2R1bGUoJ2NhbmNlbC11cGRhdGUtZXhhbXBsZScsIFtdKQorICAgKgorICAgKiAgICAgLmNvbnRyb2xsZXIoJ0NhbmNlbFVwZGF0ZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgKiAgICAgICAkc2NvcGUucmVzZXRXaXRoQ2FuY2VsID0gZnVuY3Rpb24oZSkgeworICAgKiAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gMjcpIHsKKyAgICogICAgICAgICAgICRzY29wZS5teUZvcm0ubXlJbnB1dDEuJHJvbGxiYWNrVmlld1ZhbHVlKCk7CisgICAqICAgICAgICAgICAkc2NvcGUubXlWYWx1ZSA9ICcnOworICAgKiAgICAgICAgIH0KKyAgICogICAgICAgfTsKKyAgICogICAgICAgJHNjb3BlLnJlc2V0V2l0aG91dENhbmNlbCA9IGZ1bmN0aW9uKGUpIHsKKyAgICogICAgICAgICBpZiAoZS5rZXlDb2RlID09IDI3KSB7CisgICAqICAgICAgICAgICAkc2NvcGUubXlWYWx1ZSA9ICcnOworICAgKiAgICAgICAgIH0KKyAgICogICAgICAgfTsKKyAgICogICAgIH1dKTsKKyAgICogICA8L2ZpbGU+CisgICAqICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAqICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkNhbmNlbFVwZGF0ZUNvbnRyb2xsZXIiPgorICAgKiAgICAgICA8cD5UcnkgdHlwaW5nIHNvbWV0aGluZyBpbiBlYWNoIGlucHV0LiAgU2VlIHRoYXQgdGhlIG1vZGVsIG9ubHkgdXBkYXRlcyB3aGVuIHlvdQorICAgKiAgICAgICAgICBibHVyIG9mZiB0aGUgaW5wdXQuCisgICAqICAgICAgICA8L3A+CisgICAqICAgICAgICA8cD5Ob3cgc2VlIHdoYXQgaGFwcGVucyBpZiB5b3Ugc3RhcnQgdHlwaW5nIHRoZW4gcHJlc3MgdGhlIEVzY2FwZSBrZXk8L3A+CisgICAqCisgICAqICAgICAgIDxmb3JtIG5hbWU9Im15Rm9ybSIgbmctbW9kZWwtb3B0aW9ucz0ieyB1cGRhdGVPbjogJ2JsdXInIH0iPgorICAgKiAgICAgICAgIDxwPldpdGggJHJvbGxiYWNrVmlld1ZhbHVlKCk8L3A+CisgICAqICAgICAgICAgPGlucHV0IG5hbWU9Im15SW5wdXQxIiBuZy1tb2RlbD0ibXlWYWx1ZSIgbmcta2V5ZG93bj0icmVzZXRXaXRoQ2FuY2VsKCRldmVudCkiPjxici8+CisgICAqICAgICAgICAgbXlWYWx1ZTogInt7IG15VmFsdWUgfX0iCisgICAqCisgICAqICAgICAgICAgPHA+V2l0aG91dCAkcm9sbGJhY2tWaWV3VmFsdWUoKTwvcD4KKyAgICogICAgICAgICA8aW5wdXQgbmFtZT0ibXlJbnB1dDIiIG5nLW1vZGVsPSJteVZhbHVlIiBuZy1rZXlkb3duPSJyZXNldFdpdGhvdXRDYW5jZWwoJGV2ZW50KSI+PGJyLz4KKyAgICogICAgICAgICBteVZhbHVlOiAie3sgbXlWYWx1ZSB9fSIKKyAgICogICAgICAgPC9mb3JtPgorICAgKiAgICAgPC9kaXY+CisgICAqICAgPC9maWxlPgorICAgKiA8L2V4YW1wbGU+CisgICAqLworICB0aGlzLiRyb2xsYmFja1ZpZXdWYWx1ZSA9IGZ1bmN0aW9uKCkgeworICAgICR0aW1lb3V0LmNhbmNlbChwZW5kaW5nRGVib3VuY2UpOworICAgIGN0cmwuJHZpZXdWYWx1ZSA9IGN0cmwuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlOworICAgIGN0cmwuJHJlbmRlcigpOworICB9OworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZhbGlkYXRlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBSdW5zIGVhY2ggb2YgdGhlIHJlZ2lzdGVyZWQgdmFsaWRhdG9ycyAoZmlyc3Qgc3luY2hyb25vdXMgdmFsaWRhdG9ycyBhbmQgdGhlbgorICAgKiBhc3luY2hyb25vdXMgdmFsaWRhdG9ycykuCisgICAqIElmIHRoZSB2YWxpZGl0eSBjaGFuZ2VzIHRvIGludmFsaWQsIHRoZSBtb2RlbCB3aWxsIGJlIHNldCB0byBgdW5kZWZpbmVkYCwKKyAgICogdW5sZXNzIHtAbGluayBuZ01vZGVsT3B0aW9ucyBgbmdNb2RlbE9wdGlvbnMuYWxsb3dJbnZhbGlkYH0gaXMgYHRydWVgLgorICAgKiBJZiB0aGUgdmFsaWRpdHkgY2hhbmdlcyB0byB2YWxpZCwgaXQgd2lsbCBzZXQgdGhlIG1vZGVsIHRvIHRoZSBsYXN0IGF2YWlsYWJsZSB2YWxpZAorICAgKiBtb2RlbFZhbHVlLCBpLmUuIGVpdGhlciB0aGUgbGFzdCBwYXJzZWQgdmFsdWUgb3IgdGhlIGxhc3QgdmFsdWUgc2V0IGZyb20gdGhlIHNjb3BlLgorICAgKi8KKyAgdGhpcy4kdmFsaWRhdGUgPSBmdW5jdGlvbigpIHsKKyAgICAvLyBpZ25vcmUgJHZhbGlkYXRlIGJlZm9yZSBtb2RlbCBpcyBpbml0aWFsaXplZAorICAgIGlmIChpc051bWJlcihjdHJsLiRtb2RlbFZhbHVlKSAmJiBpc05hTihjdHJsLiRtb2RlbFZhbHVlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhciB2aWV3VmFsdWUgPSBjdHJsLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZTsKKyAgICAvLyBOb3RlOiB3ZSB1c2UgdGhlICQkcmF3TW9kZWxWYWx1ZSBhcyAkbW9kZWxWYWx1ZSBtaWdodCBoYXZlIGJlZW4KKyAgICAvLyBzZXQgdG8gdW5kZWZpbmVkIGR1cmluZyBhIHZpZXcgLT4gbW9kZWwgdXBkYXRlIHRoYXQgZm91bmQgdmFsaWRhdGlvbgorICAgIC8vIGVycm9ycy4gV2UgY2FuJ3QgcGFyc2UgdGhlIHZpZXcgaGVyZSwgc2luY2UgdGhhdCBjb3VsZCBjaGFuZ2UKKyAgICAvLyB0aGUgbW9kZWwgYWx0aG91Z2ggbmVpdGhlciB2aWV3VmFsdWUgbm9yIHRoZSBtb2RlbCBvbiB0aGUgc2NvcGUgY2hhbmdlZAorICAgIHZhciBtb2RlbFZhbHVlID0gY3RybC4kJHJhd01vZGVsVmFsdWU7CisKKyAgICAvLyBDaGVjayBpZiB0aGUgdGhlcmUncyBhIHBhcnNlIGVycm9yLCBzbyB3ZSBkb24ndCB1bnNldCBpdCBhY2NpZGVudGlhbGx5CisgICAgdmFyIHBhcnNlck5hbWUgPSBjdHJsLiQkcGFyc2VyTmFtZSB8fCAncGFyc2UnOworICAgIHZhciBwYXJzZXJWYWxpZCA9IGN0cmwuJGVycm9yW3BhcnNlck5hbWVdID8gZmFsc2UgOiB1bmRlZmluZWQ7CisKKyAgICB2YXIgcHJldlZhbGlkID0gY3RybC4kdmFsaWQ7CisgICAgdmFyIHByZXZNb2RlbFZhbHVlID0gY3RybC4kbW9kZWxWYWx1ZTsKKworICAgIHZhciBhbGxvd0ludmFsaWQgPSBjdHJsLiRvcHRpb25zICYmIGN0cmwuJG9wdGlvbnMuYWxsb3dJbnZhbGlkOworCisgICAgY3RybC4kJHJ1blZhbGlkYXRvcnMocGFyc2VyVmFsaWQsIG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSwgZnVuY3Rpb24oYWxsVmFsaWQpIHsKKyAgICAgIC8vIElmIHRoZXJlIHdhcyBubyBjaGFuZ2UgaW4gdmFsaWRpdHksIGRvbid0IHVwZGF0ZSB0aGUgbW9kZWwKKyAgICAgIC8vIFRoaXMgcHJldmVudHMgY2hhbmdpbmcgYW4gaW52YWxpZCBtb2RlbFZhbHVlIHRvIHVuZGVmaW5lZAorICAgICAgaWYgKCFhbGxvd0ludmFsaWQgJiYgcHJldlZhbGlkICE9PSBhbGxWYWxpZCkgeworICAgICAgICAvLyBOb3RlOiBEb24ndCBjaGVjayBjdHJsLiR2YWxpZCBoZXJlLCBhcyB3ZSBjb3VsZCBoYXZlCisgICAgICAgIC8vIGV4dGVybmFsIHZhbGlkYXRvcnMgKGUuZy4gY2FsY3VsYXRlZCBvbiB0aGUgc2VydmVyKSwKKyAgICAgICAgLy8gdGhhdCBqdXN0IGNhbGwgJHNldFZhbGlkaXR5IGFuZCBuZWVkIHRoZSBtb2RlbCB2YWx1ZQorICAgICAgICAvLyB0byBjYWxjdWxhdGUgdGhlaXIgdmFsaWRpdHkuCisgICAgICAgIGN0cmwuJG1vZGVsVmFsdWUgPSBhbGxWYWxpZCA/IG1vZGVsVmFsdWUgOiB1bmRlZmluZWQ7CisKKyAgICAgICAgaWYgKGN0cmwuJG1vZGVsVmFsdWUgIT09IHByZXZNb2RlbFZhbHVlKSB7CisgICAgICAgICAgY3RybC4kJHdyaXRlTW9kZWxUb1Njb3BlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKworICB9OworCisgIHRoaXMuJCRydW5WYWxpZGF0b3JzID0gZnVuY3Rpb24ocGFyc2VWYWxpZCwgbW9kZWxWYWx1ZSwgdmlld1ZhbHVlLCBkb25lQ2FsbGJhY2spIHsKKyAgICBjdXJyZW50VmFsaWRhdGlvblJ1bklkKys7CisgICAgdmFyIGxvY2FsVmFsaWRhdGlvblJ1bklkID0gY3VycmVudFZhbGlkYXRpb25SdW5JZDsKKworICAgIC8vIGNoZWNrIHBhcnNlciBlcnJvcgorICAgIGlmICghcHJvY2Vzc1BhcnNlRXJyb3JzKHBhcnNlVmFsaWQpKSB7CisgICAgICB2YWxpZGF0aW9uRG9uZShmYWxzZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghcHJvY2Vzc1N5bmNWYWxpZGF0b3JzKCkpIHsKKyAgICAgIHZhbGlkYXRpb25Eb25lKGZhbHNlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgcHJvY2Vzc0FzeW5jVmFsaWRhdG9ycygpOworCisgICAgZnVuY3Rpb24gcHJvY2Vzc1BhcnNlRXJyb3JzKHBhcnNlVmFsaWQpIHsKKyAgICAgIHZhciBlcnJvcktleSA9IGN0cmwuJCRwYXJzZXJOYW1lIHx8ICdwYXJzZSc7CisgICAgICBpZiAocGFyc2VWYWxpZCA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHNldFZhbGlkaXR5KGVycm9yS2V5LCBudWxsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldFZhbGlkaXR5KGVycm9yS2V5LCBwYXJzZVZhbGlkKTsKKyAgICAgICAgaWYgKCFwYXJzZVZhbGlkKSB7CisgICAgICAgICAgZm9yRWFjaChjdHJsLiR2YWxpZGF0b3JzLCBmdW5jdGlvbih2LCBuYW1lKSB7CisgICAgICAgICAgICBzZXRWYWxpZGl0eShuYW1lLCBudWxsKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBmb3JFYWNoKGN0cmwuJGFzeW5jVmFsaWRhdG9ycywgZnVuY3Rpb24odiwgbmFtZSkgeworICAgICAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgbnVsbCk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBwcm9jZXNzU3luY1ZhbGlkYXRvcnMoKSB7CisgICAgICB2YXIgc3luY1ZhbGlkYXRvcnNWYWxpZCA9IHRydWU7CisgICAgICBmb3JFYWNoKGN0cmwuJHZhbGlkYXRvcnMsIGZ1bmN0aW9uKHZhbGlkYXRvciwgbmFtZSkgeworICAgICAgICB2YXIgcmVzdWx0ID0gdmFsaWRhdG9yKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSk7CisgICAgICAgIHN5bmNWYWxpZGF0b3JzVmFsaWQgPSBzeW5jVmFsaWRhdG9yc1ZhbGlkICYmIHJlc3VsdDsKKyAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgcmVzdWx0KTsKKyAgICAgIH0pOworICAgICAgaWYgKCFzeW5jVmFsaWRhdG9yc1ZhbGlkKSB7CisgICAgICAgIGZvckVhY2goY3RybC4kYXN5bmNWYWxpZGF0b3JzLCBmdW5jdGlvbih2LCBuYW1lKSB7CisgICAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgbnVsbCk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBwcm9jZXNzQXN5bmNWYWxpZGF0b3JzKCkgeworICAgICAgdmFyIHZhbGlkYXRvclByb21pc2VzID0gW107CisgICAgICB2YXIgYWxsVmFsaWQgPSB0cnVlOworICAgICAgZm9yRWFjaChjdHJsLiRhc3luY1ZhbGlkYXRvcnMsIGZ1bmN0aW9uKHZhbGlkYXRvciwgbmFtZSkgeworICAgICAgICB2YXIgcHJvbWlzZSA9IHZhbGlkYXRvcihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpOworICAgICAgICBpZiAoIWlzUHJvbWlzZUxpa2UocHJvbWlzZSkpIHsKKyAgICAgICAgICB0aHJvdyAkbmdNb2RlbE1pbkVycigiJGFzeW5jVmFsaWRhdG9ycyIsCisgICAgICAgICAgICAiRXhwZWN0ZWQgYXN5bmNocm9ub3VzIHZhbGlkYXRvciB0byByZXR1cm4gYSBwcm9taXNlIGJ1dCBnb3QgJ3swfScgaW5zdGVhZC4iLCBwcm9taXNlKTsKKyAgICAgICAgfQorICAgICAgICBzZXRWYWxpZGl0eShuYW1lLCB1bmRlZmluZWQpOworICAgICAgICB2YWxpZGF0b3JQcm9taXNlcy5wdXNoKHByb21pc2UudGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgICBzZXRWYWxpZGl0eShuYW1lLCB0cnVlKTsKKyAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHsKKyAgICAgICAgICBhbGxWYWxpZCA9IGZhbHNlOworICAgICAgICAgIHNldFZhbGlkaXR5KG5hbWUsIGZhbHNlKTsKKyAgICAgICAgfSkpOworICAgICAgfSk7CisgICAgICBpZiAoIXZhbGlkYXRvclByb21pc2VzLmxlbmd0aCkgeworICAgICAgICB2YWxpZGF0aW9uRG9uZSh0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICRxLmFsbCh2YWxpZGF0b3JQcm9taXNlcykudGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YWxpZGF0aW9uRG9uZShhbGxWYWxpZCk7CisgICAgICAgIH0sIG5vb3ApOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIHNldFZhbGlkaXR5KG5hbWUsIGlzVmFsaWQpIHsKKyAgICAgIGlmIChsb2NhbFZhbGlkYXRpb25SdW5JZCA9PT0gY3VycmVudFZhbGlkYXRpb25SdW5JZCkgeworICAgICAgICBjdHJsLiRzZXRWYWxpZGl0eShuYW1lLCBpc1ZhbGlkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiB2YWxpZGF0aW9uRG9uZShhbGxWYWxpZCkgeworICAgICAgaWYgKGxvY2FsVmFsaWRhdGlvblJ1bklkID09PSBjdXJyZW50VmFsaWRhdGlvblJ1bklkKSB7CisKKyAgICAgICAgZG9uZUNhbGxiYWNrKGFsbFZhbGlkKTsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgLyoqCisgICAqIEBuZ2RvYyBtZXRob2QKKyAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkY29tbWl0Vmlld1ZhbHVlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbgorICAgKiBDb21taXQgYSBwZW5kaW5nIHVwZGF0ZSB0byB0aGUgYCRtb2RlbFZhbHVlYC4KKyAgICoKKyAgICogVXBkYXRlcyBtYXkgYmUgcGVuZGluZyBieSBhIGRlYm91bmNlZCBldmVudCBvciBiZWNhdXNlIHRoZSBpbnB1dCBpcyB3YWl0aW5nIGZvciBhIHNvbWUgZnV0dXJlCisgICAqIGV2ZW50IGRlZmluZWQgaW4gYG5nLW1vZGVsLW9wdGlvbnNgLiB0aGlzIG1ldGhvZCBpcyByYXJlbHkgbmVlZGVkIGFzIGBOZ01vZGVsQ29udHJvbGxlcmAKKyAgICogdXN1YWxseSBoYW5kbGVzIGNhbGxpbmcgdGhpcyBpbiByZXNwb25zZSB0byBpbnB1dCBldmVudHMuCisgICAqLworICB0aGlzLiRjb21taXRWaWV3VmFsdWUgPSBmdW5jdGlvbigpIHsKKyAgICB2YXIgdmlld1ZhbHVlID0gY3RybC4kdmlld1ZhbHVlOworCisgICAgJHRpbWVvdXQuY2FuY2VsKHBlbmRpbmdEZWJvdW5jZSk7CisKKyAgICAvLyBJZiB0aGUgdmlldyB2YWx1ZSBoYXMgbm90IGNoYW5nZWQgdGhlbiB3ZSBzaG91bGQganVzdCBleGl0LCBleGNlcHQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMKKyAgICAvLyBhIG5hdGl2ZSB2YWxpZGF0b3Igb24gdGhlIGVsZW1lbnQuIEluIHRoaXMgY2FzZSB0aGUgdmFsaWRhdGlvbiBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkIGV2ZW4gdGhvdWdoCisgICAgLy8gdGhlIHZpZXdWYWx1ZSBoYXMgc3RheWVkIGVtcHR5LgorICAgIGlmIChjdHJsLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZSA9PT0gdmlld1ZhbHVlICYmICh2aWV3VmFsdWUgIT09ICcnIHx8ICFjdHJsLiQkaGFzTmF0aXZlVmFsaWRhdG9ycykpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY3RybC4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWUgPSB2aWV3VmFsdWU7CisKKyAgICAvLyBjaGFuZ2UgdG8gZGlydHkKKyAgICBpZiAoY3RybC4kcHJpc3RpbmUpIHsKKyAgICAgIHRoaXMuJHNldERpcnR5KCk7CisgICAgfQorICAgIHRoaXMuJCRwYXJzZUFuZFZhbGlkYXRlKCk7CisgIH07CisKKyAgdGhpcy4kJHBhcnNlQW5kVmFsaWRhdGUgPSBmdW5jdGlvbigpIHsKKyAgICB2YXIgdmlld1ZhbHVlID0gY3RybC4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWU7CisgICAgdmFyIG1vZGVsVmFsdWUgPSB2aWV3VmFsdWU7CisgICAgdmFyIHBhcnNlclZhbGlkID0gaXNVbmRlZmluZWQobW9kZWxWYWx1ZSkgPyB1bmRlZmluZWQgOiB0cnVlOworCisgICAgaWYgKHBhcnNlclZhbGlkKSB7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN0cmwuJHBhcnNlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgbW9kZWxWYWx1ZSA9IGN0cmwuJHBhcnNlcnNbaV0obW9kZWxWYWx1ZSk7CisgICAgICAgIGlmIChpc1VuZGVmaW5lZChtb2RlbFZhbHVlKSkgeworICAgICAgICAgIHBhcnNlclZhbGlkID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGlzTnVtYmVyKGN0cmwuJG1vZGVsVmFsdWUpICYmIGlzTmFOKGN0cmwuJG1vZGVsVmFsdWUpKSB7CisgICAgICAvLyBjdHJsLiRtb2RlbFZhbHVlIGhhcyBub3QgYmVlbiB0b3VjaGVkIHlldC4uLgorICAgICAgY3RybC4kbW9kZWxWYWx1ZSA9IG5nTW9kZWxHZXQoJHNjb3BlKTsKKyAgICB9CisgICAgdmFyIHByZXZNb2RlbFZhbHVlID0gY3RybC4kbW9kZWxWYWx1ZTsKKyAgICB2YXIgYWxsb3dJbnZhbGlkID0gY3RybC4kb3B0aW9ucyAmJiBjdHJsLiRvcHRpb25zLmFsbG93SW52YWxpZDsKKyAgICBjdHJsLiQkcmF3TW9kZWxWYWx1ZSA9IG1vZGVsVmFsdWU7CisKKyAgICBpZiAoYWxsb3dJbnZhbGlkKSB7CisgICAgICBjdHJsLiRtb2RlbFZhbHVlID0gbW9kZWxWYWx1ZTsKKyAgICAgIHdyaXRlVG9Nb2RlbElmTmVlZGVkKCk7CisgICAgfQorCisgICAgLy8gUGFzcyB0aGUgJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlIGhlcmUsIGJlY2F1c2UgdGhlIGNhY2hlZCB2aWV3VmFsdWUgbWlnaHQgYmUgb3V0IG9mIGRhdGUuCisgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGUuZy4gJHNldFZpZXdWYWx1ZSBpcyBjYWxsZWQgZnJvbSBpbnNpZGUgYSBwYXJzZXIKKyAgICBjdHJsLiQkcnVuVmFsaWRhdG9ycyhwYXJzZXJWYWxpZCwgbW9kZWxWYWx1ZSwgY3RybC4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWUsIGZ1bmN0aW9uKGFsbFZhbGlkKSB7CisgICAgICBpZiAoIWFsbG93SW52YWxpZCkgeworICAgICAgICAvLyBOb3RlOiBEb24ndCBjaGVjayBjdHJsLiR2YWxpZCBoZXJlLCBhcyB3ZSBjb3VsZCBoYXZlCisgICAgICAgIC8vIGV4dGVybmFsIHZhbGlkYXRvcnMgKGUuZy4gY2FsY3VsYXRlZCBvbiB0aGUgc2VydmVyKSwKKyAgICAgICAgLy8gdGhhdCBqdXN0IGNhbGwgJHNldFZhbGlkaXR5IGFuZCBuZWVkIHRoZSBtb2RlbCB2YWx1ZQorICAgICAgICAvLyB0byBjYWxjdWxhdGUgdGhlaXIgdmFsaWRpdHkuCisgICAgICAgIGN0cmwuJG1vZGVsVmFsdWUgPSBhbGxWYWxpZCA/IG1vZGVsVmFsdWUgOiB1bmRlZmluZWQ7CisgICAgICAgIHdyaXRlVG9Nb2RlbElmTmVlZGVkKCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBmdW5jdGlvbiB3cml0ZVRvTW9kZWxJZk5lZWRlZCgpIHsKKyAgICAgIGlmIChjdHJsLiRtb2RlbFZhbHVlICE9PSBwcmV2TW9kZWxWYWx1ZSkgeworICAgICAgICBjdHJsLiQkd3JpdGVNb2RlbFRvU2NvcGUoKTsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgdGhpcy4kJHdyaXRlTW9kZWxUb1Njb3BlID0gZnVuY3Rpb24oKSB7CisgICAgbmdNb2RlbFNldCgkc2NvcGUsIGN0cmwuJG1vZGVsVmFsdWUpOworICAgIGZvckVhY2goY3RybC4kdmlld0NoYW5nZUxpc3RlbmVycywgZnVuY3Rpb24obGlzdGVuZXIpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGxpc3RlbmVyKCk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpOworICAgICAgfQorICAgIH0pOworICB9OworCisgIC8qKgorICAgKiBAbmdkb2MgbWV0aG9kCisgICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHNldFZpZXdWYWx1ZQorICAgKgorICAgKiBAZGVzY3JpcHRpb24KKyAgICogVXBkYXRlIHRoZSB2aWV3IHZhbHVlLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYW4gaW5wdXQgZGlyZWN0aXZlIHdhbnQgdG8gY2hhbmdlIHRoZSB2aWV3IHZhbHVlOyB0eXBpY2FsbHksCisgICAqIHRoaXMgaXMgZG9uZSBmcm9tIHdpdGhpbiBhIERPTSBldmVudCBoYW5kbGVyLgorICAgKgorICAgKiBGb3IgZXhhbXBsZSB7QGxpbmsgbmcuZGlyZWN0aXZlOmlucHV0IGlucHV0fSBjYWxscyBpdCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgY2hhbmdlcyBhbmQKKyAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpzZWxlY3Qgc2VsZWN0fSBjYWxscyBpdCB3aGVuIGFuIG9wdGlvbiBpcyBzZWxlY3RlZC4KKyAgICoKKyAgICogSWYgdGhlIG5ldyBgdmFsdWVgIGlzIGFuIG9iamVjdCAocmF0aGVyIHRoYW4gYSBzdHJpbmcgb3IgYSBudW1iZXIpLCB3ZSBzaG91bGQgbWFrZSBhIGNvcHkgb2YgdGhlCisgICAqIG9iamVjdCBiZWZvcmUgcGFzc2luZyBpdCB0byBgJHNldFZpZXdWYWx1ZWAuICBUaGlzIGlzIGJlY2F1c2UgYG5nTW9kZWxgIGRvZXMgbm90IHBlcmZvcm0gYSBkZWVwCisgICAqIHdhdGNoIG9mIG9iamVjdHMsIGl0IG9ubHkgbG9va3MgZm9yIGEgY2hhbmdlIG9mIGlkZW50aXR5LiBJZiB5b3Ugb25seSBjaGFuZ2UgdGhlIHByb3BlcnR5IG9mCisgICAqIHRoZSBvYmplY3QgdGhlbiBuZ01vZGVsIHdpbGwgbm90IHJlYWxpc2UgdGhhdCB0aGUgb2JqZWN0IGhhcyBjaGFuZ2VkIGFuZCB3aWxsIG5vdCBpbnZva2UgdGhlCisgICAqIGAkcGFyc2Vyc2AgYW5kIGAkdmFsaWRhdG9yc2AgcGlwZWxpbmVzLgorICAgKgorICAgKiBGb3IgdGhpcyByZWFzb24sIHlvdSBzaG91bGQgbm90IGNoYW5nZSBwcm9wZXJ0aWVzIG9mIHRoZSBjb3B5IG9uY2UgaXQgaGFzIGJlZW4gcGFzc2VkIHRvCisgICAqIGAkc2V0Vmlld1ZhbHVlYC4gT3RoZXJ3aXNlIHlvdSBtYXkgY2F1c2UgdGhlIG1vZGVsIHZhbHVlIG9uIHRoZSBzY29wZSB0byBjaGFuZ2UgaW5jb3JyZWN0bHkuCisgICAqCisgICAqIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUgbmV3IGB2YWx1ZWAgd2lsbCBiZSBzdGFnZWQgZm9yIGNvbW1pdHRpbmcgdGhyb3VnaCB0aGUgYCRwYXJzZXJzYAorICAgKiBhbmQgYCR2YWxpZGF0b3JzYCBwaXBlbGluZXMuIElmIHRoZXJlIGFyZSBubyBzcGVjaWFsIHtAbGluayBuZ01vZGVsT3B0aW9uc30gc3BlY2lmaWVkIHRoZW4gdGhlIHN0YWdlZAorICAgKiB2YWx1ZSBzZW50IGRpcmVjdGx5IGZvciBwcm9jZXNzaW5nLCBmaW5hbGx5IHRvIGJlIGFwcGxpZWQgdG8gYCRtb2RlbFZhbHVlYCBhbmQgdGhlbiB0aGUKKyAgICogKipleHByZXNzaW9uKiogc3BlY2lmaWVkIGluIHRoZSBgbmctbW9kZWxgIGF0dHJpYnV0ZS4KKyAgICoKKyAgICogTGFzdGx5LCBhbGwgdGhlIHJlZ2lzdGVyZWQgY2hhbmdlIGxpc3RlbmVycywgaW4gdGhlIGAkdmlld0NoYW5nZUxpc3RlbmVyc2AgbGlzdCwgYXJlIGNhbGxlZC4KKyAgICoKKyAgICogSW4gY2FzZSB0aGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30gZGlyZWN0aXZlIGlzIHVzZWQgd2l0aCBgdXBkYXRlT25gCisgICAqIGFuZCB0aGUgYGRlZmF1bHRgIHRyaWdnZXIgaXMgbm90IGxpc3RlZCwgYWxsIHRob3NlIGFjdGlvbnMgd2lsbCByZW1haW4gcGVuZGluZyB1bnRpbCBvbmUgb2YgdGhlCisgICAqIGB1cGRhdGVPbmAgZXZlbnRzIGlzIHRyaWdnZXJlZCBvbiB0aGUgRE9NIGVsZW1lbnQuCisgICAqIEFsbCB0aGVzZSBhY3Rpb25zIHdpbGwgYmUgZGVib3VuY2VkIGlmIHRoZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nTW9kZWxPcHRpb25zIG5nTW9kZWxPcHRpb25zfQorICAgKiBkaXJlY3RpdmUgaXMgdXNlZCB3aXRoIGEgY3VzdG9tIGRlYm91bmNlIGZvciB0aGlzIHBhcnRpY3VsYXIgZXZlbnQuCisgICAqCisgICAqIE5vdGUgdGhhdCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdHJpZ2dlciBhIGAkZGlnZXN0YC4KKyAgICoKKyAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFZhbHVlIGZyb20gdGhlIHZpZXcuCisgICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyIEV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSB1cGRhdGUuCisgICAqLworICB0aGlzLiRzZXRWaWV3VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSwgdHJpZ2dlcikgeworICAgIGN0cmwuJHZpZXdWYWx1ZSA9IHZhbHVlOworICAgIGlmICghY3RybC4kb3B0aW9ucyB8fCBjdHJsLiRvcHRpb25zLnVwZGF0ZU9uRGVmYXVsdCkgeworICAgICAgY3RybC4kJGRlYm91bmNlVmlld1ZhbHVlQ29tbWl0KHRyaWdnZXIpOworICAgIH0KKyAgfTsKKworICB0aGlzLiQkZGVib3VuY2VWaWV3VmFsdWVDb21taXQgPSBmdW5jdGlvbih0cmlnZ2VyKSB7CisgICAgdmFyIGRlYm91bmNlRGVsYXkgPSAwLAorICAgICAgICBvcHRpb25zID0gY3RybC4kb3B0aW9ucywKKyAgICAgICAgZGVib3VuY2U7CisKKyAgICBpZiAob3B0aW9ucyAmJiBpc0RlZmluZWQob3B0aW9ucy5kZWJvdW5jZSkpIHsKKyAgICAgIGRlYm91bmNlID0gb3B0aW9ucy5kZWJvdW5jZTsKKyAgICAgIGlmIChpc051bWJlcihkZWJvdW5jZSkpIHsKKyAgICAgICAgZGVib3VuY2VEZWxheSA9IGRlYm91bmNlOworICAgICAgfSBlbHNlIGlmIChpc051bWJlcihkZWJvdW5jZVt0cmlnZ2VyXSkpIHsKKyAgICAgICAgZGVib3VuY2VEZWxheSA9IGRlYm91bmNlW3RyaWdnZXJdOworICAgICAgfSBlbHNlIGlmIChpc051bWJlcihkZWJvdW5jZVsnZGVmYXVsdCddKSkgeworICAgICAgICBkZWJvdW5jZURlbGF5ID0gZGVib3VuY2VbJ2RlZmF1bHQnXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAkdGltZW91dC5jYW5jZWwocGVuZGluZ0RlYm91bmNlKTsKKyAgICBpZiAoZGVib3VuY2VEZWxheSkgeworICAgICAgcGVuZGluZ0RlYm91bmNlID0gJHRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICAgIGN0cmwuJGNvbW1pdFZpZXdWYWx1ZSgpOworICAgICAgfSwgZGVib3VuY2VEZWxheSk7CisgICAgfSBlbHNlIGlmICgkcm9vdFNjb3BlLiQkcGhhc2UpIHsKKyAgICAgIGN0cmwuJGNvbW1pdFZpZXdWYWx1ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAkc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkgeworICAgICAgICBjdHJsLiRjb21taXRWaWV3VmFsdWUoKTsKKyAgICAgIH0pOworICAgIH0KKyAgfTsKKworICAvLyBtb2RlbCAtPiB2YWx1ZQorICAvLyBOb3RlOiB3ZSBjYW5ub3QgdXNlIGEgbm9ybWFsIHNjb3BlLiR3YXRjaCBhcyB3ZSB3YW50IHRvIGRldGVjdCB0aGUgZm9sbG93aW5nOgorICAvLyAxLiBzY29wZSB2YWx1ZSBpcyAnYScKKyAgLy8gMi4gdXNlciBlbnRlcnMgJ2InCisgIC8vIDMuIG5nLWNoYW5nZSBraWNrcyBpbiBhbmQgcmV2ZXJ0cyBzY29wZSB2YWx1ZSB0byAnYScKKyAgLy8gICAgLT4gc2NvcGUgdmFsdWUgZGlkIG5vdCBjaGFuZ2Ugc2luY2UgdGhlIGxhc3QgZGlnZXN0IGFzCisgIC8vICAgICAgIG5nLWNoYW5nZSBleGVjdXRlcyBpbiBhcHBseSBwaGFzZQorICAvLyA0LiB2aWV3IHNob3VsZCBiZSBjaGFuZ2VkIGJhY2sgdG8gJ2EnCisgICRzY29wZS4kd2F0Y2goZnVuY3Rpb24gbmdNb2RlbFdhdGNoKCkgeworICAgIHZhciBtb2RlbFZhbHVlID0gbmdNb2RlbEdldCgkc2NvcGUpOworCisgICAgLy8gaWYgc2NvcGUgbW9kZWwgdmFsdWUgYW5kIG5nTW9kZWwgdmFsdWUgYXJlIG91dCBvZiBzeW5jCisgICAgLy8gVE9ETyhwZXJmKTogd2h5IG5vdCBtb3ZlIHRoaXMgdG8gdGhlIGFjdGlvbiBmbj8KKyAgICBpZiAobW9kZWxWYWx1ZSAhPT0gY3RybC4kbW9kZWxWYWx1ZSkgeworICAgICAgY3RybC4kbW9kZWxWYWx1ZSA9IGN0cmwuJCRyYXdNb2RlbFZhbHVlID0gbW9kZWxWYWx1ZTsKKworICAgICAgdmFyIGZvcm1hdHRlcnMgPSBjdHJsLiRmb3JtYXR0ZXJzLAorICAgICAgICAgIGlkeCA9IGZvcm1hdHRlcnMubGVuZ3RoOworCisgICAgICB2YXIgdmlld1ZhbHVlID0gbW9kZWxWYWx1ZTsKKyAgICAgIHdoaWxlIChpZHgtLSkgeworICAgICAgICB2aWV3VmFsdWUgPSBmb3JtYXR0ZXJzW2lkeF0odmlld1ZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChjdHJsLiR2aWV3VmFsdWUgIT09IHZpZXdWYWx1ZSkgeworICAgICAgICBjdHJsLiR2aWV3VmFsdWUgPSBjdHJsLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZSA9IHZpZXdWYWx1ZTsKKyAgICAgICAgY3RybC4kcmVuZGVyKCk7CisKKyAgICAgICAgY3RybC4kJHJ1blZhbGlkYXRvcnModW5kZWZpbmVkLCBtb2RlbFZhbHVlLCB2aWV3VmFsdWUsIG5vb3ApOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtb2RlbFZhbHVlOworICB9KTsKK31dOworCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdNb2RlbAorICoKKyAqIEBlbGVtZW50IGlucHV0CisgKiBAcHJpb3JpdHkgMQorICoKKyAqIEBkZXNjcmlwdGlvbgorICogVGhlIGBuZ01vZGVsYCBkaXJlY3RpdmUgYmluZHMgYW4gYGlucHV0YCxgc2VsZWN0YCwgYHRleHRhcmVhYCAob3IgY3VzdG9tIGZvcm0gY29udHJvbCkgdG8gYQorICogcHJvcGVydHkgb24gdGhlIHNjb3BlIHVzaW5nIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIE5nTW9kZWxDb250cm9sbGVyfSwKKyAqIHdoaWNoIGlzIGNyZWF0ZWQgYW5kIGV4cG9zZWQgYnkgdGhpcyBkaXJlY3RpdmUuCisgKgorICogYG5nTW9kZWxgIGlzIHJlc3BvbnNpYmxlIGZvcjoKKyAqCisgKiAtIEJpbmRpbmcgdGhlIHZpZXcgaW50byB0aGUgbW9kZWwsIHdoaWNoIG90aGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyBgaW5wdXRgLCBgdGV4dGFyZWFgIG9yIGBzZWxlY3RgCisgKiAgIHJlcXVpcmUuCisgKiAtIFByb3ZpZGluZyB2YWxpZGF0aW9uIGJlaGF2aW9yIChpLmUuIHJlcXVpcmVkLCBudW1iZXIsIGVtYWlsLCB1cmwpLgorICogLSBLZWVwaW5nIHRoZSBzdGF0ZSBvZiB0aGUgY29udHJvbCAodmFsaWQvaW52YWxpZCwgZGlydHkvcHJpc3RpbmUsIHRvdWNoZWQvdW50b3VjaGVkLCB2YWxpZGF0aW9uIGVycm9ycykuCisgKiAtIFNldHRpbmcgcmVsYXRlZCBjc3MgY2xhc3NlcyBvbiB0aGUgZWxlbWVudCAoYG5nLXZhbGlkYCwgYG5nLWludmFsaWRgLCBgbmctZGlydHlgLCBgbmctcHJpc3RpbmVgLCBgbmctdG91Y2hlZGAsIGBuZy11bnRvdWNoZWRgKSBpbmNsdWRpbmcgYW5pbWF0aW9ucy4KKyAqIC0gUmVnaXN0ZXJpbmcgdGhlIGNvbnRyb2wgd2l0aCBpdHMgcGFyZW50IHtAbGluayBuZy5kaXJlY3RpdmU6Zm9ybSBmb3JtfS4KKyAqCisgKiBOb3RlOiBgbmdNb2RlbGAgd2lsbCB0cnkgdG8gYmluZCB0byB0aGUgcHJvcGVydHkgZ2l2ZW4gYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiBvbiB0aGUKKyAqIGN1cnJlbnQgc2NvcGUuIElmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGFscmVhZHkgZXhpc3Qgb24gdGhpcyBzY29wZSwgaXQgd2lsbCBiZSBjcmVhdGVkCisgKiBpbXBsaWNpdGx5IGFuZCBhZGRlZCB0byB0aGUgc2NvcGUuCisgKgorICogRm9yIGJlc3QgcHJhY3RpY2VzIG9uIHVzaW5nIGBuZ01vZGVsYCwgc2VlOgorICoKKyAqICAtIFtVbmRlcnN0YW5kaW5nIFNjb3Blc10oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy93aWtpL1VuZGVyc3RhbmRpbmctU2NvcGVzKQorICoKKyAqIEZvciBiYXNpYyBleGFtcGxlcywgaG93IHRvIHVzZSBgbmdNb2RlbGAsIHNlZToKKyAqCisgKiAgLSB7QGxpbmsgbmcuZGlyZWN0aXZlOmlucHV0IGlucHV0fQorICogICAgLSB7QGxpbmsgaW5wdXRbdGV4dF0gdGV4dH0KKyAqICAgIC0ge0BsaW5rIGlucHV0W2NoZWNrYm94XSBjaGVja2JveH0KKyAqICAgIC0ge0BsaW5rIGlucHV0W3JhZGlvXSByYWRpb30KKyAqICAgIC0ge0BsaW5rIGlucHV0W251bWJlcl0gbnVtYmVyfQorICogICAgLSB7QGxpbmsgaW5wdXRbZW1haWxdIGVtYWlsfQorICogICAgLSB7QGxpbmsgaW5wdXRbdXJsXSB1cmx9CisgKiAgICAtIHtAbGluayBpbnB1dFtkYXRlXSBkYXRlfQorICogICAgLSB7QGxpbmsgaW5wdXRbZGF0ZXRpbWUtbG9jYWxdIGRhdGV0aW1lLWxvY2FsfQorICogICAgLSB7QGxpbmsgaW5wdXRbdGltZV0gdGltZX0KKyAqICAgIC0ge0BsaW5rIGlucHV0W21vbnRoXSBtb250aH0KKyAqICAgIC0ge0BsaW5rIGlucHV0W3dlZWtdIHdlZWt9CisgKiAgLSB7QGxpbmsgbmcuZGlyZWN0aXZlOnNlbGVjdCBzZWxlY3R9CisgKiAgLSB7QGxpbmsgbmcuZGlyZWN0aXZlOnRleHRhcmVhIHRleHRhcmVhfQorICoKKyAqICMgQ1NTIGNsYXNzZXMKKyAqIFRoZSBmb2xsb3dpbmcgQ1NTIGNsYXNzZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkIG9uIHRoZSBhc3NvY2lhdGVkIGlucHV0L3NlbGVjdC90ZXh0YXJlYSBlbGVtZW50CisgKiBkZXBlbmRpbmcgb24gdGhlIHZhbGlkaXR5IG9mIHRoZSBtb2RlbC4KKyAqCisgKiAgLSBgbmctdmFsaWRgOiB0aGUgbW9kZWwgaXMgdmFsaWQKKyAqICAtIGBuZy1pbnZhbGlkYDogdGhlIG1vZGVsIGlzIGludmFsaWQKKyAqICAtIGBuZy12YWxpZC1ba2V5XWA6IGZvciBlYWNoIHZhbGlkIGtleSBhZGRlZCBieSBgJHNldFZhbGlkaXR5YAorICogIC0gYG5nLWludmFsaWQtW2tleV1gOiBmb3IgZWFjaCBpbnZhbGlkIGtleSBhZGRlZCBieSBgJHNldFZhbGlkaXR5YAorICogIC0gYG5nLXByaXN0aW5lYDogdGhlIGNvbnRyb2wgaGFzbid0IGJlZW4gaW50ZXJhY3RlZCB3aXRoIHlldAorICogIC0gYG5nLWRpcnR5YDogdGhlIGNvbnRyb2wgaGFzIGJlZW4gaW50ZXJhY3RlZCB3aXRoCisgKiAgLSBgbmctdG91Y2hlZGA6IHRoZSBjb250cm9sIGhhcyBiZWVuIGJsdXJyZWQKKyAqICAtIGBuZy11bnRvdWNoZWRgOiB0aGUgY29udHJvbCBoYXNuJ3QgYmVlbiBibHVycmVkCisgKiAgLSBgbmctcGVuZGluZ2A6IGFueSBgJGFzeW5jVmFsaWRhdG9yc2AgYXJlIHVuZnVsZmlsbGVkCisgKgorICogS2VlcCBpbiBtaW5kIHRoYXQgbmdBbmltYXRlIGNhbiBkZXRlY3QgZWFjaCBvZiB0aGVzZSBjbGFzc2VzIHdoZW4gYWRkZWQgYW5kIHJlbW92ZWQuCisgKgorICogIyMgQW5pbWF0aW9uIEhvb2tzCisgKgorICogQW5pbWF0aW9ucyB3aXRoaW4gbW9kZWxzIGFyZSB0cmlnZ2VyZWQgd2hlbiBhbnkgb2YgdGhlIGFzc29jaWF0ZWQgQ1NTIGNsYXNzZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkCisgKiBvbiB0aGUgaW5wdXQgZWxlbWVudCB3aGljaCBpcyBhdHRhY2hlZCB0byB0aGUgbW9kZWwuIFRoZXNlIGNsYXNzZXMgYXJlOiBgLm5nLXByaXN0aW5lYCwgYC5uZy1kaXJ0eWAsCisgKiBgLm5nLWludmFsaWRgIGFuZCBgLm5nLXZhbGlkYCBhcyB3ZWxsIGFzIGFueSBvdGhlciB2YWxpZGF0aW9ucyB0aGF0IGFyZSBwZXJmb3JtZWQgb24gdGhlIG1vZGVsIGl0c2VsZi4KKyAqIFRoZSBhbmltYXRpb25zIHRoYXQgYXJlIHRyaWdnZXJlZCB3aXRoaW4gbmdNb2RlbCBhcmUgc2ltaWxhciB0byBob3cgdGhleSB3b3JrIGluIG5nQ2xhc3MgYW5kCisgKiBhbmltYXRpb25zIGNhbiBiZSBob29rZWQgaW50byB1c2luZyBDU1MgdHJhbnNpdGlvbnMsIGtleWZyYW1lcyBhcyB3ZWxsIGFzIEpTIGFuaW1hdGlvbnMuCisgKgorICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGEgc2ltcGxlIHdheSB0byB1dGlsaXplIENTUyB0cmFuc2l0aW9ucyB0byBzdHlsZSBhbiBpbnB1dCBlbGVtZW50CisgKiB0aGF0IGhhcyBiZWVuIHJlbmRlcmVkIGFzIGludmFsaWQgYWZ0ZXIgaXQgaGFzIGJlZW4gdmFsaWRhdGVkOgorICoKKyAqIDxwcmU+CisgKiAvL2JlIHN1cmUgdG8gaW5jbHVkZSBuZ0FuaW1hdGUgYXMgYSBtb2R1bGUgdG8gaG9vayBpbnRvIG1vcmUKKyAqIC8vYWR2YW5jZWQgYW5pbWF0aW9ucworICogLm15LWlucHV0IHsKKyAqICAgdHJhbnNpdGlvbjowLjVzIGxpbmVhciBhbGw7CisgKiAgIGJhY2tncm91bmQ6IHdoaXRlOworICogfQorICogLm15LWlucHV0Lm5nLWludmFsaWQgeworICogICBiYWNrZ3JvdW5kOiByZWQ7CisgKiAgIGNvbG9yOndoaXRlOworICogfQorICogPC9wcmU+CisgKgorICogQGV4YW1wbGUKKyAqIDxleGFtcGxlIGRlcHM9ImFuZ3VsYXItYW5pbWF0ZS5qcyIgYW5pbWF0aW9ucz0idHJ1ZSIgZml4QmFzZT0idHJ1ZSIgbW9kdWxlPSJpbnB1dEV4YW1wbGUiPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8c2NyaXB0PgorICAgICAgICBhbmd1bGFyLm1vZHVsZSgnaW5wdXRFeGFtcGxlJywgW10pCisgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAgICAgICAgICAgICRzY29wZS52YWwgPSAnMSc7CisgICAgICAgICAgfV0pOworICAgICAgIDwvc2NyaXB0PgorICAgICAgIDxzdHlsZT4KKyAgICAgICAgIC5teS1pbnB1dCB7CisgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgbGluZWFyIDAuNXM7CisgICAgICAgICAgIHRyYW5zaXRpb246YWxsIGxpbmVhciAwLjVzOworICAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKKyAgICAgICAgIH0KKyAgICAgICAgIC5teS1pbnB1dC5uZy1pbnZhbGlkIHsKKyAgICAgICAgICAgY29sb3I6d2hpdGU7CisgICAgICAgICAgIGJhY2tncm91bmQ6IHJlZDsKKyAgICAgICAgIH0KKyAgICAgICA8L3N0eWxlPgorICAgICAgIFVwZGF0ZSBpbnB1dCB0byBzZWUgdHJhbnNpdGlvbnMgd2hlbiB2YWxpZC9pbnZhbGlkLgorICAgICAgIEludGVnZXIgaXMgYSB2YWxpZCB2YWx1ZS4KKyAgICAgICA8Zm9ybSBuYW1lPSJ0ZXN0Rm9ybSIgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgICAgPGlucHV0IG5nLW1vZGVsPSJ2YWwiIG5nLXBhdHRlcm49Ii9eXGQrJC8iIG5hbWU9ImFuaW0iIGNsYXNzPSJteS1pbnB1dCIgLz4KKyAgICAgICA8L2Zvcm0+CisgICAgIDwvZmlsZT4KKyAqIDwvZXhhbXBsZT4KKyAqCisgKiAjIyBCaW5kaW5nIHRvIGEgZ2V0dGVyL3NldHRlcgorICoKKyAqIFNvbWV0aW1lcyBpdCdzIGhlbHBmdWwgdG8gYmluZCBgbmdNb2RlbGAgdG8gYSBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uLiAgQSBnZXR0ZXIvc2V0dGVyIGlzIGEKKyAqIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCB3aGVuIGNhbGxlZCB3aXRoIHplcm8gYXJndW1lbnRzLCBhbmQgc2V0cworICogdGhlIGludGVybmFsIHN0YXRlIG9mIGEgbW9kZWwgd2hlbiBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudC4gSXQncyBzb21ldGltZXMgdXNlZnVsIHRvIHVzZSB0aGlzCisgKiBmb3IgbW9kZWxzIHRoYXQgaGF2ZSBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0aGF0J3MgZGlmZmVyZW50IHRoYW4gd2hhdCB0aGUgbW9kZWwgZXhwb3NlcworICogdG8gdGhlIHZpZXcuCisgKgorICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtc3VjY2VzcyI+CisgKiAqKkJlc3QgUHJhY3RpY2U6KiogSXQncyBiZXN0IHRvIGtlZXAgZ2V0dGVycyBmYXN0IGJlY2F1c2UgQW5ndWxhciBpcyBsaWtlbHkgdG8gY2FsbCB0aGVtIG1vcmUKKyAqIGZyZXF1ZW50bHkgdGhhbiBvdGhlciBwYXJ0cyBvZiB5b3VyIGNvZGUuCisgKiA8L2Rpdj4KKyAqCisgKiBZb3UgdXNlIHRoaXMgYmVoYXZpb3IgYnkgYWRkaW5nIGBuZy1tb2RlbC1vcHRpb25zPSJ7IGdldHRlclNldHRlcjogdHJ1ZSB9ImAgdG8gYW4gZWxlbWVudCB0aGF0CisgKiBoYXMgYG5nLW1vZGVsYCBhdHRhY2hlZCB0byBpdC4gWW91IGNhbiBhbHNvIGFkZCBgbmctbW9kZWwtb3B0aW9ucz0ieyBnZXR0ZXJTZXR0ZXI6IHRydWUgfSJgIHRvCisgKiBhIGA8Zm9ybT5gLCB3aGljaCB3aWxsIGVuYWJsZSB0aGlzIGJlaGF2aW9yIGZvciBhbGwgYDxpbnB1dD5gcyB3aXRoaW4gaXQuIFNlZQorICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBgbmdNb2RlbE9wdGlvbnNgfSBmb3IgbW9yZS4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBgbmdNb2RlbGAgd2l0aCBhIGdldHRlci9zZXR0ZXI6CisgKgorICogQGV4YW1wbGUKKyAqIDxleGFtcGxlIG5hbWU9Im5nTW9kZWwtZ2V0dGVyLXNldHRlciIgbW9kdWxlPSJnZXR0ZXJTZXR0ZXJFeGFtcGxlIj4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgICAgICAgICA8Zm9ybSBuYW1lPSJ1c2VyRm9ybSI+CisgICAgICAgICAgIE5hbWU6CisgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VyTmFtZSIKKyAgICAgICAgICAgICAgICAgIG5nLW1vZGVsPSJ1c2VyLm5hbWUiCisgICAgICAgICAgICAgICAgICBuZy1tb2RlbC1vcHRpb25zPSJ7IGdldHRlclNldHRlcjogdHJ1ZSB9IiAvPgorICAgICAgICAgPC9mb3JtPgorICAgICAgICAgPHByZT51c2VyLm5hbWUgPSA8c3BhbiBuZy1iaW5kPSJ1c2VyLm5hbWUoKSI+PC9zcGFuPjwvcHJlPgorICAgICAgIDwvZGl2PgorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9ImFwcC5qcyI+CisgICAgICAgYW5ndWxhci5tb2R1bGUoJ2dldHRlclNldHRlckV4YW1wbGUnLCBbXSkKKyAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgICAgIHZhciBfbmFtZSA9ICdCcmlhbic7CisgICAgICAgICAgICRzY29wZS51c2VyID0geworICAgICAgICAgICAgIG5hbWU6IGZ1bmN0aW9uKG5ld05hbWUpIHsKKyAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChuZXdOYW1lKSkgeworICAgICAgICAgICAgICAgICBfbmFtZSA9IG5ld05hbWU7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICByZXR1cm4gX25hbWU7CisgICAgICAgICAgICAgfQorICAgICAgICAgICB9OworICAgICAgICAgfV0pOworICAgICA8L2ZpbGU+CisgKiA8L2V4YW1wbGU+CisgKi8KK3ZhciBuZ01vZGVsRGlyZWN0aXZlID0gWyckcm9vdFNjb3BlJywgZnVuY3Rpb24oJHJvb3RTY29wZSkgeworICByZXR1cm4geworICAgIHJlc3RyaWN0OiAnQScsCisgICAgcmVxdWlyZTogWyduZ01vZGVsJywgJ14/Zm9ybScsICdeP25nTW9kZWxPcHRpb25zJ10sCisgICAgY29udHJvbGxlcjogTmdNb2RlbENvbnRyb2xsZXIsCisgICAgLy8gUHJlbGluayBuZWVkcyB0byBydW4gYmVmb3JlIGFueSBpbnB1dCBkaXJlY3RpdmUKKyAgICAvLyBzbyB0aGF0IHdlIGNhbiBzZXQgdGhlIE5nTW9kZWxPcHRpb25zIGluIE5nTW9kZWxDb250cm9sbGVyCisgICAgLy8gYmVmb3JlIGFueW9uZSBlbHNlIHVzZXMgaXQuCisgICAgcHJpb3JpdHk6IDEsCisgICAgY29tcGlsZTogZnVuY3Rpb24gbmdNb2RlbENvbXBpbGUoZWxlbWVudCkgeworICAgICAgLy8gU2V0dXAgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY29udHJvbAorICAgICAgZWxlbWVudC5hZGRDbGFzcyhQUklTVElORV9DTEFTUykuYWRkQ2xhc3MoVU5UT1VDSEVEX0NMQVNTKS5hZGRDbGFzcyhWQUxJRF9DTEFTUyk7CisKKyAgICAgIHJldHVybiB7CisgICAgICAgIHByZTogZnVuY3Rpb24gbmdNb2RlbFByZUxpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmxzKSB7CisgICAgICAgICAgdmFyIG1vZGVsQ3RybCA9IGN0cmxzWzBdLAorICAgICAgICAgICAgICBmb3JtQ3RybCA9IGN0cmxzWzFdIHx8IG51bGxGb3JtQ3RybDsKKworICAgICAgICAgIG1vZGVsQ3RybC4kJHNldE9wdGlvbnMoY3RybHNbMl0gJiYgY3RybHNbMl0uJG9wdGlvbnMpOworCisgICAgICAgICAgLy8gbm90aWZ5IG90aGVycywgZXNwZWNpYWxseSBwYXJlbnQgZm9ybXMKKyAgICAgICAgICBmb3JtQ3RybC4kYWRkQ29udHJvbChtb2RlbEN0cmwpOworCisgICAgICAgICAgYXR0ci4kb2JzZXJ2ZSgnbmFtZScsIGZ1bmN0aW9uKG5ld1ZhbHVlKSB7CisgICAgICAgICAgICBpZiAobW9kZWxDdHJsLiRuYW1lICE9PSBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICBmb3JtQ3RybC4kJHJlbmFtZUNvbnRyb2wobW9kZWxDdHJsLCBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisKKyAgICAgICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBmb3JtQ3RybC4kcmVtb3ZlQ29udHJvbChtb2RlbEN0cmwpOworICAgICAgICAgIH0pOworICAgICAgICB9LAorICAgICAgICBwb3N0OiBmdW5jdGlvbiBuZ01vZGVsUG9zdExpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmxzKSB7CisgICAgICAgICAgdmFyIG1vZGVsQ3RybCA9IGN0cmxzWzBdOworICAgICAgICAgIGlmIChtb2RlbEN0cmwuJG9wdGlvbnMgJiYgbW9kZWxDdHJsLiRvcHRpb25zLnVwZGF0ZU9uKSB7CisgICAgICAgICAgICBlbGVtZW50Lm9uKG1vZGVsQ3RybC4kb3B0aW9ucy51cGRhdGVPbiwgZnVuY3Rpb24oZXYpIHsKKyAgICAgICAgICAgICAgbW9kZWxDdHJsLiQkZGVib3VuY2VWaWV3VmFsdWVDb21taXQoZXYgJiYgZXYudHlwZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBlbGVtZW50Lm9uKCdibHVyJywgZnVuY3Rpb24oZXYpIHsKKyAgICAgICAgICAgIGlmIChtb2RlbEN0cmwuJHRvdWNoZWQpIHJldHVybjsKKworICAgICAgICAgICAgaWYgKCRyb290U2NvcGUuJCRwaGFzZSkgeworICAgICAgICAgICAgICBzY29wZS4kZXZhbEFzeW5jKG1vZGVsQ3RybC4kc2V0VG91Y2hlZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzY29wZS4kYXBwbHkobW9kZWxDdHJsLiRzZXRUb3VjaGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICB9CisgIH07Cit9XTsKKworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nQ2hhbmdlCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBFdmFsdWF0ZSB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgdGhlIGlucHV0LgorICogVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGltbWVkaWF0ZWx5LCB1bmxpa2UgdGhlIEphdmFTY3JpcHQgb25jaGFuZ2UgZXZlbnQKKyAqIHdoaWNoIG9ubHkgdHJpZ2dlcnMgYXQgdGhlIGVuZCBvZiBhIGNoYW5nZSAodXN1YWxseSwgd2hlbiB0aGUgdXNlciBsZWF2ZXMgdGhlCisgKiBmb3JtIGVsZW1lbnQgb3IgcHJlc3NlcyB0aGUgcmV0dXJuIGtleSkuCisgKgorICogVGhlIGBuZ0NoYW5nZWAgZXhwcmVzc2lvbiBpcyBvbmx5IGV2YWx1YXRlZCB3aGVuIGEgY2hhbmdlIGluIHRoZSBpbnB1dCB2YWx1ZSBjYXVzZXMKKyAqIGEgbmV3IHZhbHVlIHRvIGJlIGNvbW1pdHRlZCB0byB0aGUgbW9kZWwuCisgKgorICogSXQgd2lsbCBub3QgYmUgZXZhbHVhdGVkOgorICogKiBpZiB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgYCRwYXJzZXJzYCB0cmFuc2Zvcm1hdGlvbiBwaXBlbGluZSBoYXMgbm90IGNoYW5nZWQKKyAqICogaWYgdGhlIGlucHV0IGhhcyBjb250aW51ZWQgdG8gYmUgaW52YWxpZCBzaW5jZSB0aGUgbW9kZWwgd2lsbCBzdGF5IGBudWxsYAorICogKiBpZiB0aGUgbW9kZWwgaXMgY2hhbmdlZCBwcm9ncmFtbWF0aWNhbGx5IGFuZCBub3QgYnkgYSBjaGFuZ2UgdG8gdGhlIGlucHV0IHZhbHVlCisgKgorICoKKyAqIE5vdGUsIHRoaXMgZGlyZWN0aXZlIHJlcXVpcmVzIGBuZ01vZGVsYCB0byBiZSBwcmVzZW50LgorICoKKyAqIEBlbGVtZW50IGlucHV0CisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2hhbmdlIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24gY2hhbmdlCisgKiBpbiBpbnB1dCB2YWx1ZS4KKyAqCisgKiBAZXhhbXBsZQorICogPGV4YW1wbGUgbmFtZT0ibmdDaGFuZ2UtZGlyZWN0aXZlIiBtb2R1bGU9ImNoYW5nZUV4YW1wbGUiPgorICogICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAqICAgICA8c2NyaXB0PgorICogICAgICAgYW5ndWxhci5tb2R1bGUoJ2NoYW5nZUV4YW1wbGUnLCBbXSkKKyAqICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAqICAgICAgICAgICAkc2NvcGUuY291bnRlciA9IDA7CisgKiAgICAgICAgICAgJHNjb3BlLmNoYW5nZSA9IGZ1bmN0aW9uKCkgeworICogICAgICAgICAgICAgJHNjb3BlLmNvdW50ZXIrKzsKKyAqICAgICAgICAgICB9OworICogICAgICAgICB9XSk7CisgKiAgICAgPC9zY3JpcHQ+CisgKiAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgKiAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJjb25maXJtZWQiIG5nLWNoYW5nZT0iY2hhbmdlKCkiIGlkPSJuZy1jaGFuZ2UtZXhhbXBsZTEiIC8+CisgKiAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJjb25maXJtZWQiIGlkPSJuZy1jaGFuZ2UtZXhhbXBsZTIiIC8+CisgKiAgICAgICA8bGFiZWwgZm9yPSJuZy1jaGFuZ2UtZXhhbXBsZTIiPkNvbmZpcm1lZDwvbGFiZWw+PGJyIC8+CisgKiAgICAgICA8dHQ+ZGVidWcgPSB7e2NvbmZpcm1lZH19PC90dD48YnIvPgorICogICAgICAgPHR0PmNvdW50ZXIgPSB7e2NvdW50ZXJ9fTwvdHQ+PGJyLz4KKyAqICAgICA8L2Rpdj4KKyAqICAgPC9maWxlPgorICogICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAqICAgICB2YXIgY291bnRlciA9IGVsZW1lbnQoYnkuYmluZGluZygnY291bnRlcicpKTsKKyAqICAgICB2YXIgZGVidWcgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2NvbmZpcm1lZCcpKTsKKyAqCisgKiAgICAgaXQoJ3Nob3VsZCBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBpZiBjaGFuZ2luZyBmcm9tIHZpZXcnLCBmdW5jdGlvbigpIHsKKyAqICAgICAgIGV4cGVjdChjb3VudGVyLmdldFRleHQoKSkudG9Db250YWluKCcwJyk7CisgKgorICogICAgICAgZWxlbWVudChieS5pZCgnbmctY2hhbmdlLWV4YW1wbGUxJykpLmNsaWNrKCk7CisgKgorICogICAgICAgZXhwZWN0KGNvdW50ZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzEnKTsKKyAqICAgICAgIGV4cGVjdChkZWJ1Zy5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOworICogICAgIH0pOworICoKKyAqICAgICBpdCgnc2hvdWxkIG5vdCBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBpZiBjaGFuZ2luZyBmcm9tIG1vZGVsJywgZnVuY3Rpb24oKSB7CisgKiAgICAgICBlbGVtZW50KGJ5LmlkKCduZy1jaGFuZ2UtZXhhbXBsZTInKSkuY2xpY2soKTsKKworICogICAgICAgZXhwZWN0KGNvdW50ZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzAnKTsKKyAqICAgICAgIGV4cGVjdChkZWJ1Zy5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpOworICogICAgIH0pOworICogICA8L2ZpbGU+CisgKiA8L2V4YW1wbGU+CisgKi8KK3ZhciBuZ0NoYW5nZURpcmVjdGl2ZSA9IHZhbHVlRm4oeworICByZXN0cmljdDogJ0EnLAorICByZXF1aXJlOiAnbmdNb2RlbCcsCisgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKSB7CisgICAgY3RybC4kdmlld0NoYW5nZUxpc3RlbmVycy5wdXNoKGZ1bmN0aW9uKCkgeworICAgICAgc2NvcGUuJGV2YWwoYXR0ci5uZ0NoYW5nZSk7CisgICAgfSk7CisgIH0KK30pOworCisKK3ZhciByZXF1aXJlZERpcmVjdGl2ZSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4geworICAgIHJlc3RyaWN0OiAnQScsCisgICAgcmVxdWlyZTogJz9uZ01vZGVsJywKKyAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxtLCBhdHRyLCBjdHJsKSB7CisgICAgICBpZiAoIWN0cmwpIHJldHVybjsKKyAgICAgIGF0dHIucmVxdWlyZWQgPSB0cnVlOyAvLyBmb3JjZSB0cnV0aHkgaW4gY2FzZSB3ZSBhcmUgb24gbm9uIGlucHV0IGVsZW1lbnQKKworICAgICAgY3RybC4kdmFsaWRhdG9ycy5yZXF1aXJlZCA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkgeworICAgICAgICByZXR1cm4gIWF0dHIucmVxdWlyZWQgfHwgIWN0cmwuJGlzRW1wdHkodmlld1ZhbHVlKTsKKyAgICAgIH07CisKKyAgICAgIGF0dHIuJG9ic2VydmUoJ3JlcXVpcmVkJywgZnVuY3Rpb24oKSB7CisgICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7CisgICAgICB9KTsKKyAgICB9CisgIH07Cit9OworCisKK3ZhciBwYXR0ZXJuRGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB7CisgICAgcmVzdHJpY3Q6ICdBJywKKyAgICByZXF1aXJlOiAnP25nTW9kZWwnLAorICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbG0sIGF0dHIsIGN0cmwpIHsKKyAgICAgIGlmICghY3RybCkgcmV0dXJuOworCisgICAgICB2YXIgcmVnZXhwLCBwYXR0ZXJuRXhwID0gYXR0ci5uZ1BhdHRlcm4gfHwgYXR0ci5wYXR0ZXJuOworICAgICAgYXR0ci4kb2JzZXJ2ZSgncGF0dGVybicsIGZ1bmN0aW9uKHJlZ2V4KSB7CisgICAgICAgIGlmIChpc1N0cmluZyhyZWdleCkgJiYgcmVnZXgubGVuZ3RoID4gMCkgeworICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnXicgKyByZWdleCArICckJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVnZXggJiYgIXJlZ2V4LnRlc3QpIHsKKyAgICAgICAgICB0aHJvdyBtaW5FcnIoJ25nUGF0dGVybicpKCdub3JlZ2V4cCcsCisgICAgICAgICAgICAnRXhwZWN0ZWQgezB9IHRvIGJlIGEgUmVnRXhwIGJ1dCB3YXMgezF9LiBFbGVtZW50OiB7Mn0nLCBwYXR0ZXJuRXhwLAorICAgICAgICAgICAgcmVnZXgsIHN0YXJ0aW5nVGFnKGVsbSkpOworICAgICAgICB9CisKKyAgICAgICAgcmVnZXhwID0gcmVnZXggfHwgdW5kZWZpbmVkOworICAgICAgICBjdHJsLiR2YWxpZGF0ZSgpOworICAgICAgfSk7CisKKyAgICAgIGN0cmwuJHZhbGlkYXRvcnMucGF0dGVybiA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZhbHVlKSB8fCBpc1VuZGVmaW5lZChyZWdleHApIHx8IHJlZ2V4cC50ZXN0KHZhbHVlKTsKKyAgICAgIH07CisgICAgfQorICB9OworfTsKKworCit2YXIgbWF4bGVuZ3RoRGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB7CisgICAgcmVzdHJpY3Q6ICdBJywKKyAgICByZXF1aXJlOiAnP25nTW9kZWwnLAorICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbG0sIGF0dHIsIGN0cmwpIHsKKyAgICAgIGlmICghY3RybCkgcmV0dXJuOworCisgICAgICB2YXIgbWF4bGVuZ3RoID0gLTE7CisgICAgICBhdHRyLiRvYnNlcnZlKCdtYXhsZW5ndGgnLCBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICB2YXIgaW50VmFsID0gaW50KHZhbHVlKTsKKyAgICAgICAgbWF4bGVuZ3RoID0gaXNOYU4oaW50VmFsKSA/IC0xIDogaW50VmFsOworICAgICAgICBjdHJsLiR2YWxpZGF0ZSgpOworICAgICAgfSk7CisgICAgICBjdHJsLiR2YWxpZGF0b3JzLm1heGxlbmd0aCA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkgeworICAgICAgICByZXR1cm4gKG1heGxlbmd0aCA8IDApIHx8IGN0cmwuJGlzRW1wdHkobW9kZWxWYWx1ZSkgfHwgKHZpZXdWYWx1ZS5sZW5ndGggPD0gbWF4bGVuZ3RoKTsKKyAgICAgIH07CisgICAgfQorICB9OworfTsKKwordmFyIG1pbmxlbmd0aERpcmVjdGl2ZSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4geworICAgIHJlc3RyaWN0OiAnQScsCisgICAgcmVxdWlyZTogJz9uZ01vZGVsJywKKyAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxtLCBhdHRyLCBjdHJsKSB7CisgICAgICBpZiAoIWN0cmwpIHJldHVybjsKKworICAgICAgdmFyIG1pbmxlbmd0aCA9IDA7CisgICAgICBhdHRyLiRvYnNlcnZlKCdtaW5sZW5ndGgnLCBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICBtaW5sZW5ndGggPSBpbnQodmFsdWUpIHx8IDA7CisgICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7CisgICAgICB9KTsKKyAgICAgIGN0cmwuJHZhbGlkYXRvcnMubWlubGVuZ3RoID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7CisgICAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZpZXdWYWx1ZSkgfHwgdmlld1ZhbHVlLmxlbmd0aCA+PSBtaW5sZW5ndGg7CisgICAgICB9OworICAgIH0KKyAgfTsKK307CisKKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ0xpc3QKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFRleHQgaW5wdXQgdGhhdCBjb252ZXJ0cyBiZXR3ZWVuIGEgZGVsaW1pdGVkIHN0cmluZyBhbmQgYW4gYXJyYXkgb2Ygc3RyaW5ncy4gVGhlIGRlZmF1bHQKKyAqIGRlbGltaXRlciBpcyBhIGNvbW1hIGZvbGxvd2VkIGJ5IGEgc3BhY2UgLSBlcXVpdmFsZW50IHRvIGBuZy1saXN0PSIsICJgLiBZb3UgY2FuIHNwZWNpZnkgYSBjdXN0b20KKyAqIGRlbGltaXRlciBhcyB0aGUgdmFsdWUgb2YgdGhlIGBuZ0xpc3RgIGF0dHJpYnV0ZSAtIGZvciBleGFtcGxlLCBgbmctbGlzdD0iIHwgImAuCisgKgorICogVGhlIGJlaGF2aW91ciBvZiB0aGUgZGlyZWN0aXZlIGlzIGFmZmVjdGVkIGJ5IHRoZSB1c2Ugb2YgdGhlIGBuZ1RyaW1gIGF0dHJpYnV0ZS4KKyAqICogSWYgYG5nVHJpbWAgaXMgc2V0IHRvIGAiZmFsc2UiYCB0aGVuIHdoaXRlc3BhY2UgYXJvdW5kIGJvdGggdGhlIHNlcGFyYXRvciBhbmQgZWFjaAorICogICBsaXN0IGl0ZW0gaXMgcmVzcGVjdGVkLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgdXNlciBvZiB0aGUgZGlyZWN0aXZlIGlzIHJlc3BvbnNpYmxlIGZvcgorICogICBkZWFsaW5nIHdpdGggd2hpdGVzcGFjZSBidXQgYWxzbyBhbGxvd3MgeW91IHRvIHVzZSB3aGl0ZXNwYWNlIGFzIGEgZGVsaW1pdGVyLCBzdWNoIGFzIGEKKyAqICAgdGFiIG9yIG5ld2xpbmUgY2hhcmFjdGVyLgorICogKiBPdGhlcndpc2Ugd2hpdGVzcGFjZSBhcm91bmQgdGhlIGRlbGltaXRlciBpcyBpZ25vcmVkIHdoZW4gc3BsaXR0aW5nIChhbHRob3VnaCBpdCBpcyByZXNwZWN0ZWQKKyAqICAgd2hlbiBqb2luaW5nIHRoZSBsaXN0IGl0ZW1zIGJhY2sgdG9nZXRoZXIpIGFuZCB3aGl0ZXNwYWNlIGFyb3VuZCBlYWNoIGxpc3QgaXRlbSBpcyBzdHJpcHBlZAorICogICBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgorICoKKyAqICMjIyBFeGFtcGxlIHdpdGggVmFsaWRhdGlvbgorICoKKyAqIDxleGFtcGxlIG5hbWU9Im5nTGlzdC1kaXJlY3RpdmUiIG1vZHVsZT0ibGlzdEV4YW1wbGUiPgorICogICA8ZmlsZSBuYW1lPSJhcHAuanMiPgorICogICAgICBhbmd1bGFyLm1vZHVsZSgnbGlzdEV4YW1wbGUnLCBbXSkKKyAqICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICogICAgICAgICAgJHNjb3BlLm5hbWVzID0gWydtb3JwaGV1cycsICduZW8nLCAndHJpbml0eSddOworICogICAgICAgIH1dKTsKKyAqICAgPC9maWxlPgorICogICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAqICAgIDxmb3JtIG5hbWU9Im15Rm9ybSIgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICogICAgICBMaXN0OiA8aW5wdXQgbmFtZT0ibmFtZXNJbnB1dCIgbmctbW9kZWw9Im5hbWVzIiBuZy1saXN0IHJlcXVpcmVkPgorICogICAgICA8c3BhbiBjbGFzcz0iZXJyb3IiIG5nLXNob3c9Im15Rm9ybS5uYW1lc0lucHV0LiRlcnJvci5yZXF1aXJlZCI+CisgKiAgICAgICAgUmVxdWlyZWQhPC9zcGFuPgorICogICAgICA8YnI+CisgKiAgICAgIDx0dD5uYW1lcyA9IHt7bmFtZXN9fTwvdHQ+PGJyLz4KKyAqICAgICAgPHR0Pm15Rm9ybS5uYW1lc0lucHV0LiR2YWxpZCA9IHt7bXlGb3JtLm5hbWVzSW5wdXQuJHZhbGlkfX08L3R0Pjxici8+CisgKiAgICAgIDx0dD5teUZvcm0ubmFtZXNJbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5uYW1lc0lucHV0LiRlcnJvcn19PC90dD48YnIvPgorICogICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnIvPgorICogICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxici8+CisgKiAgICAgPC9mb3JtPgorICogICA8L2ZpbGU+CisgKiAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICogICAgIHZhciBsaXN0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCduYW1lcycpKTsKKyAqICAgICB2YXIgbmFtZXMgPSBlbGVtZW50KGJ5LmV4YWN0QmluZGluZygnbmFtZXMnKSk7CisgKiAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0ubmFtZXNJbnB1dC4kdmFsaWQnKSk7CisgKiAgICAgdmFyIGVycm9yID0gZWxlbWVudChieS5jc3MoJ3NwYW4uZXJyb3InKSk7CisgKgorICogICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgeworICogICAgICAgZXhwZWN0KG5hbWVzLmdldFRleHQoKSkudG9Db250YWluKCdbIm1vcnBoZXVzIiwibmVvIiwidHJpbml0eSJdJyk7CisgKiAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTsKKyAqICAgICAgIGV4cGVjdChlcnJvci5nZXRDc3NWYWx1ZSgnZGlzcGxheScpKS50b0JlKCdub25lJyk7CisgKiAgICAgfSk7CisgKgorICogICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkgeworICogICAgICAgbGlzdElucHV0LmNsZWFyKCk7CisgKiAgICAgICBsaXN0SW5wdXQuc2VuZEtleXMoJycpOworICoKKyAqICAgICAgIGV4cGVjdChuYW1lcy5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7CisgKiAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7CisgKiAgICAgICBleHBlY3QoZXJyb3IuZ2V0Q3NzVmFsdWUoJ2Rpc3BsYXknKSkubm90LnRvQmUoJ25vbmUnKTsKKyAqICAgICB9KTsKKyAqICAgPC9maWxlPgorICogPC9leGFtcGxlPgorICoKKyAqICMjIyBFeGFtcGxlIC0gc3BsaXR0aW5nIG9uIHdoaXRlc3BhY2UKKyAqIDxleGFtcGxlIG5hbWU9Im5nTGlzdC1kaXJlY3RpdmUtbmV3bGluZXMiPgorICogICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAqICAgIDx0ZXh0YXJlYSBuZy1tb2RlbD0ibGlzdCIgbmctbGlzdD0iJiMxMDsiIG5nLXRyaW09ImZhbHNlIj48L3RleHRhcmVhPgorICogICAgPHByZT57eyBsaXN0IHwganNvbiB9fTwvcHJlPgorICogICA8L2ZpbGU+CisgKiAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICogICAgIGl0KCJzaG91bGQgc3BsaXQgdGhlIHRleHQgYnkgbmV3bGluZXMiLCBmdW5jdGlvbigpIHsKKyAqICAgICAgIHZhciBsaXN0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdsaXN0JykpOworICogICAgICAgdmFyIG91dHB1dCA9IGVsZW1lbnQoYnkuYmluZGluZygnbGlzdCB8IGpzb24nKSk7CisgKiAgICAgICBsaXN0SW5wdXQuc2VuZEtleXMoJ2FiY1xuZGVmXG5naGknKTsKKyAqICAgICAgIGV4cGVjdChvdXRwdXQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ1tcbiAgImFiYyIsXG4gICJkZWYiLFxuICAiZ2hpIlxuXScpOworICogICAgIH0pOworICogICA8L2ZpbGU+CisgKiA8L2V4YW1wbGU+CisgKgorICogQGVsZW1lbnQgaW5wdXQKKyAqIEBwYXJhbSB7c3RyaW5nPX0gbmdMaXN0IG9wdGlvbmFsIGRlbGltaXRlciB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHNwbGl0IHRoZSB2YWx1ZS4KKyAqLwordmFyIG5nTGlzdERpcmVjdGl2ZSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4geworICAgIHJlc3RyaWN0OiAnQScsCisgICAgcHJpb3JpdHk6IDEwMCwKKyAgICByZXF1aXJlOiAnbmdNb2RlbCcsCisgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwpIHsKKyAgICAgIC8vIFdlIHdhbnQgdG8gY29udHJvbCB3aGl0ZXNwYWNlIHRyaW1taW5nIHNvIHdlIHVzZSB0aGlzIGNvbnZvbHV0ZWQgYXBwcm9hY2gKKyAgICAgIC8vIHRvIGFjY2VzcyB0aGUgbmdMaXN0IGF0dHJpYnV0ZSwgd2hpY2ggZG9lc24ndCBwcmUtdHJpbSB0aGUgYXR0cmlidXRlCisgICAgICB2YXIgbmdMaXN0ID0gZWxlbWVudC5hdHRyKGF0dHIuJGF0dHIubmdMaXN0KSB8fCAnLCAnOworICAgICAgdmFyIHRyaW1WYWx1ZXMgPSBhdHRyLm5nVHJpbSAhPT0gJ2ZhbHNlJzsKKyAgICAgIHZhciBzZXBhcmF0b3IgPSB0cmltVmFsdWVzID8gdHJpbShuZ0xpc3QpIDogbmdMaXN0OworCisgICAgICB2YXIgcGFyc2UgPSBmdW5jdGlvbih2aWV3VmFsdWUpIHsKKyAgICAgICAgLy8gSWYgdGhlIHZpZXdWYWx1ZSBpcyBpbnZhbGlkIChzYXkgcmVxdWlyZWQgYnV0IGVtcHR5KSBpdCB3aWxsIGJlIGB1bmRlZmluZWRgCisgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2aWV3VmFsdWUpKSByZXR1cm47CisKKyAgICAgICAgdmFyIGxpc3QgPSBbXTsKKworICAgICAgICBpZiAodmlld1ZhbHVlKSB7CisgICAgICAgICAgZm9yRWFjaCh2aWV3VmFsdWUuc3BsaXQoc2VwYXJhdG9yKSwgZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSkgbGlzdC5wdXNoKHRyaW1WYWx1ZXMgPyB0cmltKHZhbHVlKSA6IHZhbHVlKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsaXN0OworICAgICAgfTsKKworICAgICAgY3RybC4kcGFyc2Vycy5wdXNoKHBhcnNlKTsKKyAgICAgIGN0cmwuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgICByZXR1cm4gdmFsdWUuam9pbihuZ0xpc3QpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICAgIH0pOworCisgICAgICAvLyBPdmVycmlkZSB0aGUgc3RhbmRhcmQgJGlzRW1wdHkgYmVjYXVzZSBhbiBlbXB0eSBhcnJheSBtZWFucyB0aGUgaW5wdXQgaXMgZW1wdHkuCisgICAgICBjdHJsLiRpc0VtcHR5ID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICF2YWx1ZSB8fCAhdmFsdWUubGVuZ3RoOworICAgICAgfTsKKyAgICB9CisgIH07Cit9OworCisKK3ZhciBDT05TVEFOVF9WQUxVRV9SRUdFWFAgPSAvXih0cnVlfGZhbHNlfFxkKykkLzsKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdWYWx1ZQorICoKKyAqIEBkZXNjcmlwdGlvbgorICogQmluZHMgdGhlIGdpdmVuIGV4cHJlc3Npb24gdG8gdGhlIHZhbHVlIG9mIGA8b3B0aW9uPmAgb3Ige0BsaW5rIGlucHV0W3JhZGlvXSBgaW5wdXRbcmFkaW9dYH0sCisgKiBzbyB0aGF0IHdoZW4gdGhlIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHRoZSB7QGxpbmsgbmdNb2RlbCBgbmdNb2RlbGB9IG9mIHRoYXQgZWxlbWVudCBpcyBzZXQgdG8KKyAqIHRoZSBib3VuZCB2YWx1ZS4KKyAqCisgKiBgbmdWYWx1ZWAgaXMgdXNlZnVsIHdoZW4gZHluYW1pY2FsbHkgZ2VuZXJhdGluZyBsaXN0cyBvZiByYWRpbyBidXR0b25zIHVzaW5nCisgKiB7QGxpbmsgbmdSZXBlYXQgYG5nUmVwZWF0YH0sIGFzIHNob3duIGJlbG93LgorICoKKyAqIExpa2V3aXNlLCBgbmdWYWx1ZWAgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYDxvcHRpb24+YCBlbGVtZW50cyBmb3IKKyAqIHRoZSB7QGxpbmsgc2VsZWN0IGBzZWxlY3RgfSBlbGVtZW50LiBJbiB0aGF0IGNhc2UgaG93ZXZlciwgb25seSBzdHJpbmdzIGFyZSBzdXBwb3J0ZWQKKyAqIGZvciB0aGUgYHZhbHVlIGBhdHRyaWJ1dGUsIHNvIHRoZSByZXN1bHRpbmcgYG5nTW9kZWxgIHdpbGwgYWx3YXlzIGJlIGEgc3RyaW5nLgorICogU3VwcG9ydCBmb3IgYHNlbGVjdGAgbW9kZWxzIHdpdGggbm9uLXN0cmluZyB2YWx1ZXMgaXMgYXZhaWxhYmxlIHZpYSBgbmdPcHRpb25zYC4KKyAqCisgKiBAZWxlbWVudCBpbnB1dAorICogQHBhcmFtIHtzdHJpbmc9fSBuZ1ZhbHVlIGFuZ3VsYXIgZXhwcmVzc2lvbiwgd2hvc2UgdmFsdWUgd2lsbCBiZSBib3VuZCB0byB0aGUgYHZhbHVlYCBhdHRyaWJ1dGUKKyAqICAgb2YgdGhlIGBpbnB1dGAgZWxlbWVudAorICoKKyAqIEBleGFtcGxlCisgICAgPGV4YW1wbGUgbmFtZT0ibmdWYWx1ZS1kaXJlY3RpdmUiIG1vZHVsZT0idmFsdWVFeGFtcGxlIj4KKyAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgIDxzY3JpcHQ+CisgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3ZhbHVlRXhhbXBsZScsIFtdKQorICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAgICAgICAgICAgICAgJHNjb3BlLm5hbWVzID0gWydwaXp6YScsICd1bmljb3JucycsICdyb2JvdHMnXTsKKyAgICAgICAgICAgICAgJHNjb3BlLm15ID0geyBmYXZvcml0ZTogJ3VuaWNvcm5zJyB9OworICAgICAgICAgICAgfV0pOworICAgICAgIDwvc2NyaXB0PgorICAgICAgICA8Zm9ybSBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgICAgICAgICAgPGgyPldoaWNoIGlzIHlvdXIgZmF2b3JpdGU/PC9oMj4KKyAgICAgICAgICAgIDxsYWJlbCBuZy1yZXBlYXQ9Im5hbWUgaW4gbmFtZXMiIGZvcj0ie3tuYW1lfX0iPgorICAgICAgICAgICAgICB7e25hbWV9fQorICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iCisgICAgICAgICAgICAgICAgICAgICBuZy1tb2RlbD0ibXkuZmF2b3JpdGUiCisgICAgICAgICAgICAgICAgICAgICBuZy12YWx1ZT0ibmFtZSIKKyAgICAgICAgICAgICAgICAgICAgIGlkPSJ7e25hbWV9fSIKKyAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImZhdm9yaXRlIj4KKyAgICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgICAgPGRpdj5Zb3UgY2hvc2Uge3tteS5mYXZvcml0ZX19PC9kaXY+CisgICAgICAgIDwvZm9ybT4KKyAgICAgIDwvZmlsZT4KKyAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgICB2YXIgZmF2b3JpdGUgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215LmZhdm9yaXRlJykpOworCisgICAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgIGV4cGVjdChmYXZvcml0ZS5nZXRUZXh0KCkpLnRvQ29udGFpbigndW5pY29ybnMnKTsKKyAgICAgICAgfSk7CisgICAgICAgIGl0KCdzaG91bGQgYmluZCB0aGUgdmFsdWVzIHRvIHRoZSBpbnB1dHMnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICBlbGVtZW50LmFsbChieS5tb2RlbCgnbXkuZmF2b3JpdGUnKSkuZ2V0KDApLmNsaWNrKCk7CisgICAgICAgICAgZXhwZWN0KGZhdm9yaXRlLmdldFRleHQoKSkudG9Db250YWluKCdwaXp6YScpOworICAgICAgICB9KTsKKyAgICAgIDwvZmlsZT4KKyAgICA8L2V4YW1wbGU+CisgKi8KK3ZhciBuZ1ZhbHVlRGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB7CisgICAgcmVzdHJpY3Q6ICdBJywKKyAgICBwcmlvcml0eTogMTAwLAorICAgIGNvbXBpbGU6IGZ1bmN0aW9uKHRwbCwgdHBsQXR0cikgeworICAgICAgaWYgKENPTlNUQU5UX1ZBTFVFX1JFR0VYUC50ZXN0KHRwbEF0dHIubmdWYWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5nVmFsdWVDb25zdGFudExpbmsoc2NvcGUsIGVsbSwgYXR0cikgeworICAgICAgICAgIGF0dHIuJHNldCgndmFsdWUnLCBzY29wZS4kZXZhbChhdHRyLm5nVmFsdWUpKTsKKyAgICAgICAgfTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbiBuZ1ZhbHVlTGluayhzY29wZSwgZWxtLCBhdHRyKSB7CisgICAgICAgICAgc2NvcGUuJHdhdGNoKGF0dHIubmdWYWx1ZSwgZnVuY3Rpb24gdmFsdWVXYXRjaEFjdGlvbih2YWx1ZSkgeworICAgICAgICAgICAgYXR0ci4kc2V0KCd2YWx1ZScsIHZhbHVlKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICB9CisgIH07Cit9OworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nTW9kZWxPcHRpb25zCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBBbGxvd3MgdHVuaW5nIGhvdyBtb2RlbCB1cGRhdGVzIGFyZSBkb25lLiBVc2luZyBgbmdNb2RlbE9wdGlvbnNgIHlvdSBjYW4gc3BlY2lmeSBhIGN1c3RvbSBsaXN0IG9mCisgKiBldmVudHMgdGhhdCB3aWxsIHRyaWdnZXIgYSBtb2RlbCB1cGRhdGUgYW5kL29yIGEgZGVib3VuY2luZyBkZWxheSBzbyB0aGF0IHRoZSBhY3R1YWwgdXBkYXRlIG9ubHkKKyAqIHRha2VzIHBsYWNlIHdoZW4gYSB0aW1lciBleHBpcmVzOyB0aGlzIHRpbWVyIHdpbGwgYmUgcmVzZXQgYWZ0ZXIgYW5vdGhlciBjaGFuZ2UgdGFrZXMgcGxhY2UuCisgKgorICogR2l2ZW4gdGhlIG5hdHVyZSBvZiBgbmdNb2RlbE9wdGlvbnNgLCB0aGUgdmFsdWUgZGlzcGxheWVkIGluc2lkZSBpbnB1dCBmaWVsZHMgaW4gdGhlIHZpZXcgbWlnaHQKKyAqIGJlIGRpZmZlcmVudCB0aGFuIHRoZSB2YWx1ZSBpbiB0aGUgYWN0dWFsIG1vZGVsLiBUaGlzIG1lYW5zIHRoYXQgaWYgeW91IHVwZGF0ZSB0aGUgbW9kZWwgeW91CisgKiBzaG91bGQgYWxzbyBpbnZva2Uge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIgYCRyb2xsYmFja1ZpZXdWYWx1ZWB9IG9uIHRoZSByZWxldmFudCBpbnB1dCBmaWVsZCBpbgorICogb3JkZXIgdG8gbWFrZSBzdXJlIGl0IGlzIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCBhbmQgdGhhdCBhbnkgZGVib3VuY2VkIGFjdGlvbiBpcyBjYW5jZWxlZC4KKyAqCisgKiBUaGUgZWFzaWVzdCB3YXkgdG8gcmVmZXJlbmNlIHRoZSBjb250cm9sJ3Mge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIgYCRyb2xsYmFja1ZpZXdWYWx1ZWB9CisgKiBtZXRob2QgaXMgYnkgbWFraW5nIHN1cmUgdGhlIGlucHV0IGlzIHBsYWNlZCBpbnNpZGUgYSBmb3JtIHRoYXQgaGFzIGEgYG5hbWVgIGF0dHJpYnV0ZS4gVGhpcyBpcworICogaW1wb3J0YW50IGJlY2F1c2UgYGZvcm1gIGNvbnRyb2xsZXJzIGFyZSBwdWJsaXNoZWQgdG8gdGhlIHJlbGF0ZWQgc2NvcGUgdW5kZXIgdGhlIG5hbWUgaW4gdGhlaXIKKyAqIGBuYW1lYCBhdHRyaWJ1dGUuCisgKgorICogQW55IHBlbmRpbmcgY2hhbmdlcyB3aWxsIHRha2UgcGxhY2UgaW1tZWRpYXRlbHkgd2hlbiBhbiBlbmNsb3NpbmcgZm9ybSBpcyBzdWJtaXR0ZWQgdmlhIHRoZQorICogYHN1Ym1pdGAgZXZlbnQuIE5vdGUgdGhhdCBgbmdDbGlja2AgZXZlbnRzIHdpbGwgb2NjdXIgYmVmb3JlIHRoZSBtb2RlbCBpcyB1cGRhdGVkLiBVc2UgYG5nU3VibWl0YAorICogdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIHVwZGF0ZWQgbW9kZWwuCisgKgorICogYG5nTW9kZWxPcHRpb25zYCBoYXMgYW4gZWZmZWN0IG9uIHRoZSBlbGVtZW50IGl0J3MgZGVjbGFyZWQgb24gYW5kIGl0cyBkZXNjZW5kYW50cy4KKyAqCisgKiBAcGFyYW0ge09iamVjdH0gbmdNb2RlbE9wdGlvbnMgb3B0aW9ucyB0byBhcHBseSB0byB0aGUgY3VycmVudCBtb2RlbC4gVmFsaWQga2V5cyBhcmU6CisgKiAgIC0gYHVwZGF0ZU9uYDogc3RyaW5nIHNwZWNpZnlpbmcgd2hpY2ggZXZlbnQgc2hvdWxkIHRoZSBpbnB1dCBiZSBib3VuZCB0by4gWW91IGNhbiBzZXQgc2V2ZXJhbAorICogICAgIGV2ZW50cyB1c2luZyBhbiBzcGFjZSBkZWxpbWl0ZWQgbGlzdC4gVGhlcmUgaXMgYSBzcGVjaWFsIGV2ZW50IGNhbGxlZCBgZGVmYXVsdGAgdGhhdAorICogICAgIG1hdGNoZXMgdGhlIGRlZmF1bHQgZXZlbnRzIGJlbG9uZ2luZyBvZiB0aGUgY29udHJvbC4KKyAqICAgLSBgZGVib3VuY2VgOiBpbnRlZ2VyIHZhbHVlIHdoaWNoIGNvbnRhaW5zIHRoZSBkZWJvdW5jZSBtb2RlbCB1cGRhdGUgdmFsdWUgaW4gbWlsbGlzZWNvbmRzLiBBCisgKiAgICAgdmFsdWUgb2YgMCB0cmlnZ2VycyBhbiBpbW1lZGlhdGUgdXBkYXRlLiBJZiBhbiBvYmplY3QgaXMgc3VwcGxpZWQgaW5zdGVhZCwgeW91IGNhbiBzcGVjaWZ5IGEKKyAqICAgICBjdXN0b20gdmFsdWUgZm9yIGVhY2ggZXZlbnQuIEZvciBleGFtcGxlOgorICogICAgIGBuZy1tb2RlbC1vcHRpb25zPSJ7IHVwZGF0ZU9uOiAnZGVmYXVsdCBibHVyJywgZGVib3VuY2U6IHsnZGVmYXVsdCc6IDUwMCwgJ2JsdXInOiAwfSB9ImAKKyAqICAgLSBgYWxsb3dJbnZhbGlkYDogYm9vbGVhbiB2YWx1ZSB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgbW9kZWwgY2FuIGJlIHNldCB3aXRoIHZhbHVlcyB0aGF0IGRpZAorICogICAgIG5vdCB2YWxpZGF0ZSBjb3JyZWN0bHkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBzZXR0aW5nIHRoZSBtb2RlbCB0byB1bmRlZmluZWQuCisgKiAgIC0gYGdldHRlclNldHRlcmA6IGJvb2xlYW4gdmFsdWUgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0byB0cmVhdCBmdW5jdGlvbnMgYm91bmQgdG8KKyAgICAgICBgbmdNb2RlbGAgYXMgZ2V0dGVycy9zZXR0ZXJzLgorICogICAtIGB0aW1lem9uZWA6IERlZmluZXMgdGhlIHRpbWV6b25lIHRvIGJlIHVzZWQgdG8gcmVhZC93cml0ZSB0aGUgYERhdGVgIGluc3RhbmNlIGluIHRoZSBtb2RlbCBmb3IKKyAqICAgICBgPGlucHV0IHR5cGU9ImRhdGUiPmAsIGA8aW5wdXQgdHlwZT0idGltZSI+YCwgLi4uIC4gUmlnaHQgbm93LCB0aGUgb25seSBzdXBwb3J0ZWQgdmFsdWUgaXMgYCdVVEMnYCwKKyAqICAgICBvdGhlcndpc2UgdGhlIGRlZmF1bHQgdGltZXpvbmUgb2YgdGhlIGJyb3dzZXIgd2lsbCBiZSB1c2VkLgorICoKKyAqIEBleGFtcGxlCisKKyAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBvdmVycmlkZSBpbW1lZGlhdGUgdXBkYXRlcy4gQ2hhbmdlcyBvbiB0aGUgaW5wdXRzIHdpdGhpbiB0aGUKKyAgZm9ybSB3aWxsIHVwZGF0ZSB0aGUgbW9kZWwgb25seSB3aGVuIHRoZSBjb250cm9sIGxvc2VzIGZvY3VzIChibHVyIGV2ZW50KS4gSWYgYGVzY2FwZWAga2V5IGlzCisgIHByZXNzZWQgd2hpbGUgdGhlIGlucHV0IGZpZWxkIGlzIGZvY3VzZWQsIHRoZSB2YWx1ZSBpcyByZXNldCB0byB0aGUgdmFsdWUgaW4gdGhlIGN1cnJlbnQgbW9kZWwuCisKKyAgPGV4YW1wbGUgbmFtZT0ibmdNb2RlbE9wdGlvbnMtZGlyZWN0aXZlLWJsdXIiIG1vZHVsZT0ib3B0aW9uc0V4YW1wbGUiPgorICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgICAgICAgIDxmb3JtIG5hbWU9InVzZXJGb3JtIj4KKyAgICAgICAgICBOYW1lOgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VyTmFtZSIKKyAgICAgICAgICAgICAgICAgbmctbW9kZWw9InVzZXIubmFtZSIKKyAgICAgICAgICAgICAgICAgbmctbW9kZWwtb3B0aW9ucz0ieyB1cGRhdGVPbjogJ2JsdXInIH0iCisgICAgICAgICAgICAgICAgIG5nLWtleXVwPSJjYW5jZWwoJGV2ZW50KSIgLz48YnIgLz4KKworICAgICAgICAgIE90aGVyIGRhdGE6CisgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJ1c2VyLmRhdGEiIC8+PGJyIC8+CisgICAgICAgIDwvZm9ybT4KKyAgICAgICAgPHByZT51c2VyLm5hbWUgPSA8c3BhbiBuZy1iaW5kPSJ1c2VyLm5hbWUiPjwvc3Bhbj48L3ByZT4KKyAgICAgIDwvZGl2PgorICAgIDwvZmlsZT4KKyAgICA8ZmlsZSBuYW1lPSJhcHAuanMiPgorICAgICAgYW5ndWxhci5tb2R1bGUoJ29wdGlvbnNFeGFtcGxlJywgW10pCisgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgICAgJHNjb3BlLnVzZXIgPSB7IG5hbWU6ICdzYXknLCBkYXRhOiAnJyB9OworCisgICAgICAgICAgJHNjb3BlLmNhbmNlbCA9IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gMjcpIHsKKyAgICAgICAgICAgICAgJHNjb3BlLnVzZXJGb3JtLnVzZXJOYW1lLiRyb2xsYmFja1ZpZXdWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgIH1dKTsKKyAgICA8L2ZpbGU+CisgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICB2YXIgbW9kZWwgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3VzZXIubmFtZScpKTsKKyAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3VzZXIubmFtZScpKTsKKyAgICAgIHZhciBvdGhlciA9IGVsZW1lbnQoYnkubW9kZWwoJ3VzZXIuZGF0YScpKTsKKworICAgICAgaXQoJ3Nob3VsZCBhbGxvdyBjdXN0b20gZXZlbnRzJywgZnVuY3Rpb24oKSB7CisgICAgICAgIGlucHV0LnNlbmRLZXlzKCcgaGVsbG8nKTsKKyAgICAgICAgaW5wdXQuY2xpY2soKTsKKyAgICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkudG9FcXVhbCgnc2F5Jyk7CisgICAgICAgIG90aGVyLmNsaWNrKCk7CisgICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3NheSBoZWxsbycpOworICAgICAgfSk7CisKKyAgICAgIGl0KCdzaG91bGQgJHJvbGxiYWNrVmlld1ZhbHVlIHdoZW4gbW9kZWwgY2hhbmdlcycsIGZ1bmN0aW9uKCkgeworICAgICAgICBpbnB1dC5zZW5kS2V5cygnIGhlbGxvJyk7CisgICAgICAgIGV4cGVjdChpbnB1dC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvRXF1YWwoJ3NheSBoZWxsbycpOworICAgICAgICBpbnB1dC5zZW5kS2V5cyhwcm90cmFjdG9yLktleS5FU0NBUEUpOworICAgICAgICBleHBlY3QoaW5wdXQuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0VxdWFsKCdzYXknKTsKKyAgICAgICAgb3RoZXIuY2xpY2soKTsKKyAgICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkudG9FcXVhbCgnc2F5Jyk7CisgICAgICB9KTsKKyAgICA8L2ZpbGU+CisgIDwvZXhhbXBsZT4KKworICBUaGlzIG9uZSBzaG93cyBob3cgdG8gZGVib3VuY2UgbW9kZWwgY2hhbmdlcy4gTW9kZWwgd2lsbCBiZSB1cGRhdGVkIG9ubHkgMSBzZWMgYWZ0ZXIgbGFzdCBjaGFuZ2UuCisgIElmIHRoZSBgQ2xlYXJgIGJ1dHRvbiBpcyBwcmVzc2VkLCBhbnkgZGVib3VuY2VkIGFjdGlvbiBpcyBjYW5jZWxlZCBhbmQgdGhlIHZhbHVlIGJlY29tZXMgZW1wdHkuCisKKyAgPGV4YW1wbGUgbmFtZT0ibmdNb2RlbE9wdGlvbnMtZGlyZWN0aXZlLWRlYm91bmNlIiBtb2R1bGU9Im9wdGlvbnNFeGFtcGxlIj4KKyAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgICA8Zm9ybSBuYW1lPSJ1c2VyRm9ybSI+CisgICAgICAgICAgTmFtZToKKyAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idXNlck5hbWUiCisgICAgICAgICAgICAgICAgIG5nLW1vZGVsPSJ1c2VyLm5hbWUiCisgICAgICAgICAgICAgICAgIG5nLW1vZGVsLW9wdGlvbnM9InsgZGVib3VuY2U6IDEwMDAgfSIgLz4KKyAgICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPSJ1c2VyRm9ybS51c2VyTmFtZS4kcm9sbGJhY2tWaWV3VmFsdWUoKTsgdXNlci5uYW1lPScnIj5DbGVhcjwvYnV0dG9uPjxiciAvPgorICAgICAgICA8L2Zvcm0+CisgICAgICAgIDxwcmU+dXNlci5uYW1lID0gPHNwYW4gbmctYmluZD0idXNlci5uYW1lIj48L3NwYW4+PC9wcmU+CisgICAgICA8L2Rpdj4KKyAgICA8L2ZpbGU+CisgICAgPGZpbGUgbmFtZT0iYXBwLmpzIj4KKyAgICAgIGFuZ3VsYXIubW9kdWxlKCdvcHRpb25zRXhhbXBsZScsIFtdKQorICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgICAgICRzY29wZS51c2VyID0geyBuYW1lOiAnc2F5JyB9OworICAgICAgICB9XSk7CisgICAgPC9maWxlPgorICA8L2V4YW1wbGU+CisKKyAgVGhpcyBvbmUgc2hvd3MgaG93IHRvIGJpbmQgdG8gZ2V0dGVyL3NldHRlcnM6CisKKyAgPGV4YW1wbGUgbmFtZT0ibmdNb2RlbE9wdGlvbnMtZGlyZWN0aXZlLWdldHRlci1zZXR0ZXIiIG1vZHVsZT0iZ2V0dGVyU2V0dGVyRXhhbXBsZSI+CisgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KKyAgICAgICAgPGZvcm0gbmFtZT0idXNlckZvcm0iPgorICAgICAgICAgIE5hbWU6CisgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzZXJOYW1lIgorICAgICAgICAgICAgICAgICBuZy1tb2RlbD0idXNlci5uYW1lIgorICAgICAgICAgICAgICAgICBuZy1tb2RlbC1vcHRpb25zPSJ7IGdldHRlclNldHRlcjogdHJ1ZSB9IiAvPgorICAgICAgICA8L2Zvcm0+CisgICAgICAgIDxwcmU+dXNlci5uYW1lID0gPHNwYW4gbmctYmluZD0idXNlci5uYW1lKCkiPjwvc3Bhbj48L3ByZT4KKyAgICAgIDwvZGl2PgorICAgIDwvZmlsZT4KKyAgICA8ZmlsZSBuYW1lPSJhcHAuanMiPgorICAgICAgYW5ndWxhci5tb2R1bGUoJ2dldHRlclNldHRlckV4YW1wbGUnLCBbXSkKKyAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAgICAgICAgICB2YXIgX25hbWUgPSAnQnJpYW4nOworICAgICAgICAgICRzY29wZS51c2VyID0geworICAgICAgICAgICAgbmFtZTogZnVuY3Rpb24obmV3TmFtZSkgeworICAgICAgICAgICAgICByZXR1cm4gYW5ndWxhci5pc0RlZmluZWQobmV3TmFtZSkgPyAoX25hbWUgPSBuZXdOYW1lKSA6IF9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgIH1dKTsKKyAgICA8L2ZpbGU+CisgIDwvZXhhbXBsZT4KKyAqLwordmFyIG5nTW9kZWxPcHRpb25zRGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB7CisgICAgcmVzdHJpY3Q6ICdBJywKKyAgICBjb250cm9sbGVyOiBbJyRzY29wZScsICckYXR0cnMnLCBmdW5jdGlvbigkc2NvcGUsICRhdHRycykgeworICAgICAgdmFyIHRoYXQgPSB0aGlzOworICAgICAgdGhpcy4kb3B0aW9ucyA9ICRzY29wZS4kZXZhbCgkYXR0cnMubmdNb2RlbE9wdGlvbnMpOworICAgICAgLy8gQWxsb3cgYWRkaW5nL292ZXJyaWRpbmcgYm91bmQgZXZlbnRzCisgICAgICBpZiAodGhpcy4kb3B0aW9ucy51cGRhdGVPbiAhPT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHRoaXMuJG9wdGlvbnMudXBkYXRlT25EZWZhdWx0ID0gZmFsc2U7CisgICAgICAgIC8vIGV4dHJhY3QgImRlZmF1bHQiIHBzZXVkby1ldmVudCBmcm9tIGxpc3Qgb2YgZXZlbnRzIHRoYXQgY2FuIHRyaWdnZXIgYSBtb2RlbCB1cGRhdGUKKyAgICAgICAgdGhpcy4kb3B0aW9ucy51cGRhdGVPbiA9IHRyaW0odGhpcy4kb3B0aW9ucy51cGRhdGVPbi5yZXBsYWNlKERFRkFVTFRfUkVHRVhQLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICB0aGF0LiRvcHRpb25zLnVwZGF0ZU9uRGVmYXVsdCA9IHRydWU7CisgICAgICAgICAgcmV0dXJuICcgJzsKKyAgICAgICAgfSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy4kb3B0aW9ucy51cGRhdGVPbkRlZmF1bHQgPSB0cnVlOworICAgICAgfQorICAgIH1dCisgIH07Cit9OworCisvLyBoZWxwZXIgbWV0aG9kcworZnVuY3Rpb24gYWRkU2V0VmFsaWRpdHlNZXRob2QoY29udGV4dCkgeworICB2YXIgY3RybCA9IGNvbnRleHQuY3RybCwKKyAgICAgICRlbGVtZW50ID0gY29udGV4dC4kZWxlbWVudCwKKyAgICAgIGNsYXNzQ2FjaGUgPSB7fSwKKyAgICAgIHNldCA9IGNvbnRleHQuc2V0LAorICAgICAgdW5zZXQgPSBjb250ZXh0LnVuc2V0LAorICAgICAgcGFyZW50Rm9ybSA9IGNvbnRleHQucGFyZW50Rm9ybSwKKyAgICAgICRhbmltYXRlID0gY29udGV4dC4kYW5pbWF0ZTsKKworICBjbGFzc0NhY2hlW0lOVkFMSURfQ0xBU1NdID0gIShjbGFzc0NhY2hlW1ZBTElEX0NMQVNTXSA9ICRlbGVtZW50Lmhhc0NsYXNzKFZBTElEX0NMQVNTKSk7CisKKyAgY3RybC4kc2V0VmFsaWRpdHkgPSBzZXRWYWxpZGl0eTsKKworICBmdW5jdGlvbiBzZXRWYWxpZGl0eSh2YWxpZGF0aW9uRXJyb3JLZXksIHN0YXRlLCBvcHRpb25zKSB7CisgICAgaWYgKHN0YXRlID09PSB1bmRlZmluZWQpIHsKKyAgICAgIGNyZWF0ZUFuZFNldCgnJHBlbmRpbmcnLCB2YWxpZGF0aW9uRXJyb3JLZXksIG9wdGlvbnMpOworICAgIH0gZWxzZSB7CisgICAgICB1bnNldEFuZENsZWFudXAoJyRwZW5kaW5nJywgdmFsaWRhdGlvbkVycm9yS2V5LCBvcHRpb25zKTsKKyAgICB9CisgICAgaWYgKCFpc0Jvb2xlYW4oc3RhdGUpKSB7CisgICAgICB1bnNldChjdHJsLiRlcnJvciwgdmFsaWRhdGlvbkVycm9yS2V5LCBvcHRpb25zKTsKKyAgICAgIHVuc2V0KGN0cmwuJCRzdWNjZXNzLCB2YWxpZGF0aW9uRXJyb3JLZXksIG9wdGlvbnMpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3RhdGUpIHsKKyAgICAgICAgdW5zZXQoY3RybC4kZXJyb3IsIHZhbGlkYXRpb25FcnJvcktleSwgb3B0aW9ucyk7CisgICAgICAgIHNldChjdHJsLiQkc3VjY2VzcywgdmFsaWRhdGlvbkVycm9yS2V5LCBvcHRpb25zKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldChjdHJsLiRlcnJvciwgdmFsaWRhdGlvbkVycm9yS2V5LCBvcHRpb25zKTsKKyAgICAgICAgdW5zZXQoY3RybC4kJHN1Y2Nlc3MsIHZhbGlkYXRpb25FcnJvcktleSwgb3B0aW9ucyk7CisgICAgICB9CisgICAgfQorICAgIGlmIChjdHJsLiRwZW5kaW5nKSB7CisgICAgICBjYWNoZWRUb2dnbGVDbGFzcyhQRU5ESU5HX0NMQVNTLCB0cnVlKTsKKyAgICAgIGN0cmwuJHZhbGlkID0gY3RybC4kaW52YWxpZCA9IHVuZGVmaW5lZDsKKyAgICAgIHRvZ2dsZVZhbGlkYXRpb25Dc3MoJycsIG51bGwpOworICAgIH0gZWxzZSB7CisgICAgICBjYWNoZWRUb2dnbGVDbGFzcyhQRU5ESU5HX0NMQVNTLCBmYWxzZSk7CisgICAgICBjdHJsLiR2YWxpZCA9IGlzT2JqZWN0RW1wdHkoY3RybC4kZXJyb3IpOworICAgICAgY3RybC4kaW52YWxpZCA9ICFjdHJsLiR2YWxpZDsKKyAgICAgIHRvZ2dsZVZhbGlkYXRpb25Dc3MoJycsIGN0cmwuJHZhbGlkKTsKKyAgICB9CisKKyAgICAvLyByZS1yZWFkIHRoZSBzdGF0ZSBhcyB0aGUgc2V0L3Vuc2V0IG1ldGhvZHMgY291bGQgaGF2ZQorICAgIC8vIGNvbWJpbmVkIHN0YXRlIGluIGN0cmwuJGVycm9yW3ZhbGlkYXRpb25FcnJvcl0gKHVzZWQgZm9yIGZvcm1zKSwKKyAgICAvLyB3aGVyZSBzZXR0aW5nL3Vuc2V0dGluZyBvbmx5IGluY3JlbWVudHMvZGVjcmVtZW50cyB0aGUgdmFsdWUsCisgICAgLy8gYW5kIGRvZXMgbm90IHJlcGxhY2UgaXQuCisgICAgdmFyIGNvbWJpbmVkU3RhdGU7CisgICAgaWYgKGN0cmwuJHBlbmRpbmcgJiYgY3RybC4kcGVuZGluZ1t2YWxpZGF0aW9uRXJyb3JLZXldKSB7CisgICAgICBjb21iaW5lZFN0YXRlID0gdW5kZWZpbmVkOworICAgIH0gZWxzZSBpZiAoY3RybC4kZXJyb3JbdmFsaWRhdGlvbkVycm9yS2V5XSkgeworICAgICAgY29tYmluZWRTdGF0ZSA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoY3RybC4kJHN1Y2Nlc3NbdmFsaWRhdGlvbkVycm9yS2V5XSkgeworICAgICAgY29tYmluZWRTdGF0ZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbWJpbmVkU3RhdGUgPSBudWxsOworICAgIH0KKyAgICB0b2dnbGVWYWxpZGF0aW9uQ3NzKHZhbGlkYXRpb25FcnJvcktleSwgY29tYmluZWRTdGF0ZSk7CisgICAgcGFyZW50Rm9ybS4kc2V0VmFsaWRpdHkodmFsaWRhdGlvbkVycm9yS2V5LCBjb21iaW5lZFN0YXRlLCBjdHJsKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZUFuZFNldChuYW1lLCB2YWx1ZSwgb3B0aW9ucykgeworICAgIGlmICghY3RybFtuYW1lXSkgeworICAgICAgY3RybFtuYW1lXSA9IHt9OworICAgIH0KKyAgICBzZXQoY3RybFtuYW1lXSwgdmFsdWUsIG9wdGlvbnMpOworICB9CisKKyAgZnVuY3Rpb24gdW5zZXRBbmRDbGVhbnVwKG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7CisgICAgaWYgKGN0cmxbbmFtZV0pIHsKKyAgICAgIHVuc2V0KGN0cmxbbmFtZV0sIHZhbHVlLCBvcHRpb25zKTsKKyAgICB9CisgICAgaWYgKGlzT2JqZWN0RW1wdHkoY3RybFtuYW1lXSkpIHsKKyAgICAgIGN0cmxbbmFtZV0gPSB1bmRlZmluZWQ7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gY2FjaGVkVG9nZ2xlQ2xhc3MoY2xhc3NOYW1lLCBzd2l0Y2hWYWx1ZSkgeworICAgIGlmIChzd2l0Y2hWYWx1ZSAmJiAhY2xhc3NDYWNoZVtjbGFzc05hbWVdKSB7CisgICAgICAkYW5pbWF0ZS5hZGRDbGFzcygkZWxlbWVudCwgY2xhc3NOYW1lKTsKKyAgICAgIGNsYXNzQ2FjaGVbY2xhc3NOYW1lXSA9IHRydWU7CisgICAgfSBlbHNlIGlmICghc3dpdGNoVmFsdWUgJiYgY2xhc3NDYWNoZVtjbGFzc05hbWVdKSB7CisgICAgICAkYW5pbWF0ZS5yZW1vdmVDbGFzcygkZWxlbWVudCwgY2xhc3NOYW1lKTsKKyAgICAgIGNsYXNzQ2FjaGVbY2xhc3NOYW1lXSA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHRvZ2dsZVZhbGlkYXRpb25Dc3ModmFsaWRhdGlvbkVycm9yS2V5LCBpc1ZhbGlkKSB7CisgICAgdmFsaWRhdGlvbkVycm9yS2V5ID0gdmFsaWRhdGlvbkVycm9yS2V5ID8gJy0nICsgc25ha2VfY2FzZSh2YWxpZGF0aW9uRXJyb3JLZXksICctJykgOiAnJzsKKworICAgIGNhY2hlZFRvZ2dsZUNsYXNzKFZBTElEX0NMQVNTICsgdmFsaWRhdGlvbkVycm9yS2V5LCBpc1ZhbGlkID09PSB0cnVlKTsKKyAgICBjYWNoZWRUb2dnbGVDbGFzcyhJTlZBTElEX0NMQVNTICsgdmFsaWRhdGlvbkVycm9yS2V5LCBpc1ZhbGlkID09PSBmYWxzZSk7CisgIH0KK30KKworZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmopIHsKKyAgaWYgKG9iaikgeworICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nQmluZAorICogQHJlc3RyaWN0IEFDCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBUaGUgYG5nQmluZGAgYXR0cmlidXRlIHRlbGxzIEFuZ3VsYXIgdG8gcmVwbGFjZSB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgSFRNTCBlbGVtZW50CisgKiB3aXRoIHRoZSB2YWx1ZSBvZiBhIGdpdmVuIGV4cHJlc3Npb24sIGFuZCB0byB1cGRhdGUgdGhlIHRleHQgY29udGVudCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGF0CisgKiBleHByZXNzaW9uIGNoYW5nZXMuCisgKgorICogVHlwaWNhbGx5LCB5b3UgZG9uJ3QgdXNlIGBuZ0JpbmRgIGRpcmVjdGx5LCBidXQgaW5zdGVhZCB5b3UgdXNlIHRoZSBkb3VibGUgY3VybHkgbWFya3VwIGxpa2UKKyAqIGB7eyBleHByZXNzaW9uIH19YCB3aGljaCBpcyBzaW1pbGFyIGJ1dCBsZXNzIHZlcmJvc2UuCisgKgorICogSXQgaXMgcHJlZmVyYWJsZSB0byB1c2UgYG5nQmluZGAgaW5zdGVhZCBvZiBge3sgZXhwcmVzc2lvbiB9fWAgaWYgYSB0ZW1wbGF0ZSBpcyBtb21lbnRhcmlseQorICogZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyIGluIGl0cyByYXcgc3RhdGUgYmVmb3JlIEFuZ3VsYXIgY29tcGlsZXMgaXQuIFNpbmNlIGBuZ0JpbmRgIGlzIGFuCisgKiBlbGVtZW50IGF0dHJpYnV0ZSwgaXQgbWFrZXMgdGhlIGJpbmRpbmdzIGludmlzaWJsZSB0byB0aGUgdXNlciB3aGlsZSB0aGUgcGFnZSBpcyBsb2FkaW5nLgorICoKKyAqIEFuIGFsdGVybmF0aXZlIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbSB3b3VsZCBiZSB1c2luZyB0aGUKKyAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDbG9hayBuZ0Nsb2FrfSBkaXJlY3RpdmUuCisgKgorICoKKyAqIEBlbGVtZW50IEFOWQorICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0JpbmQge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUuCisgKgorICogQGV4YW1wbGUKKyAqIEVudGVyIGEgbmFtZSBpbiB0aGUgTGl2ZSBQcmV2aWV3IHRleHQgYm94OyB0aGUgZ3JlZXRpbmcgYmVsb3cgdGhlIHRleHQgYm94IGNoYW5nZXMgaW5zdGFudGx5LgorICAgPGV4YW1wbGUgbW9kdWxlPSJiaW5kRXhhbXBsZSI+CisgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgIDxzY3JpcHQ+CisgICAgICAgICBhbmd1bGFyLm1vZHVsZSgnYmluZEV4YW1wbGUnLCBbXSkKKyAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAgICAgICAgICAgICAkc2NvcGUubmFtZSA9ICdXaGlybGVkJzsKKyAgICAgICAgICAgfV0pOworICAgICAgIDwvc2NyaXB0PgorICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgICAgRW50ZXIgbmFtZTogPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJuYW1lIj48YnI+CisgICAgICAgICBIZWxsbyA8c3BhbiBuZy1iaW5kPSJuYW1lIj48L3NwYW4+IQorICAgICAgIDwvZGl2PgorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctYmluZCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgdmFyIG5hbWVJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ25hbWUnKSk7CisKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ25hbWUnKSkuZ2V0VGV4dCgpKS50b0JlKCdXaGlybGVkJyk7CisgICAgICAgICBuYW1lSW5wdXQuY2xlYXIoKTsKKyAgICAgICAgIG5hbWVJbnB1dC5zZW5kS2V5cygnd29ybGQnKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ25hbWUnKSkuZ2V0VGV4dCgpKS50b0JlKCd3b3JsZCcpOworICAgICAgIH0pOworICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisgKi8KK3ZhciBuZ0JpbmREaXJlY3RpdmUgPSBbJyRjb21waWxlJywgZnVuY3Rpb24oJGNvbXBpbGUpIHsKKyAgcmV0dXJuIHsKKyAgICByZXN0cmljdDogJ0FDJywKKyAgICBjb21waWxlOiBmdW5jdGlvbiBuZ0JpbmRDb21waWxlKHRlbXBsYXRlRWxlbWVudCkgeworICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nQ2xhc3ModGVtcGxhdGVFbGVtZW50KTsKKyAgICAgIHJldHVybiBmdW5jdGlvbiBuZ0JpbmRMaW5rKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7CisgICAgICAgICRjb21waWxlLiQkYWRkQmluZGluZ0luZm8oZWxlbWVudCwgYXR0ci5uZ0JpbmQpOworICAgICAgICBlbGVtZW50ID0gZWxlbWVudFswXTsKKyAgICAgICAgc2NvcGUuJHdhdGNoKGF0dHIubmdCaW5kLCBmdW5jdGlvbiBuZ0JpbmRXYXRjaEFjdGlvbih2YWx1ZSkgeworICAgICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJycgOiB2YWx1ZTsKKyAgICAgICAgfSk7CisgICAgICB9OworICAgIH0KKyAgfTsKK31dOworCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdCaW5kVGVtcGxhdGUKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFRoZSBgbmdCaW5kVGVtcGxhdGVgIGRpcmVjdGl2ZSBzcGVjaWZpZXMgdGhhdCB0aGUgZWxlbWVudAorICogdGV4dCBjb250ZW50IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBpbnRlcnBvbGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZQorICogaW4gdGhlIGBuZ0JpbmRUZW1wbGF0ZWAgYXR0cmlidXRlLgorICogVW5saWtlIGBuZ0JpbmRgLCB0aGUgYG5nQmluZFRlbXBsYXRlYCBjYW4gY29udGFpbiBtdWx0aXBsZSBge3tgIGB9fWAKKyAqIGV4cHJlc3Npb25zLiBUaGlzIGRpcmVjdGl2ZSBpcyBuZWVkZWQgc2luY2Ugc29tZSBIVE1MIGVsZW1lbnRzCisgKiAoc3VjaCBhcyBUSVRMRSBhbmQgT1BUSU9OKSBjYW5ub3QgY29udGFpbiBTUEFOIGVsZW1lbnRzLgorICoKKyAqIEBlbGVtZW50IEFOWQorICogQHBhcmFtIHtzdHJpbmd9IG5nQmluZFRlbXBsYXRlIHRlbXBsYXRlIG9mIGZvcm0KKyAqICAgPHR0Pnt7PC90dD4gPHR0PmV4cHJlc3Npb248L3R0PiA8dHQ+fX08L3R0PiB0byBldmFsLgorICoKKyAqIEBleGFtcGxlCisgKiBUcnkgaXQgaGVyZTogZW50ZXIgdGV4dCBpbiB0ZXh0IGJveCBhbmQgd2F0Y2ggdGhlIGdyZWV0aW5nIGNoYW5nZS4KKyAgIDxleGFtcGxlIG1vZHVsZT0iYmluZEV4YW1wbGUiPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8c2NyaXB0PgorICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2JpbmRFeGFtcGxlJywgW10pCisgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgICAgICAgJHNjb3BlLnNhbHV0YXRpb24gPSAnSGVsbG8nOworICAgICAgICAgICAgICRzY29wZS5uYW1lID0gJ1dvcmxkJzsKKyAgICAgICAgICAgfV0pOworICAgICAgIDwvc2NyaXB0PgorICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgICBTYWx1dGF0aW9uOiA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InNhbHV0YXRpb24iPjxicj4KKyAgICAgICAgTmFtZTogPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJuYW1lIj48YnI+CisgICAgICAgIDxwcmUgbmctYmluZC10ZW1wbGF0ZT0ie3tzYWx1dGF0aW9ufX0ge3tuYW1lfX0hIj48L3ByZT4KKyAgICAgICA8L2Rpdj4KKyAgICAgPC9maWxlPgorICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLWJpbmQnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIHZhciBzYWx1dGF0aW9uRWxlbSA9IGVsZW1lbnQoYnkuYmluZGluZygnc2FsdXRhdGlvbicpKTsKKyAgICAgICAgIHZhciBzYWx1dGF0aW9uSW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdzYWx1dGF0aW9uJykpOworICAgICAgICAgdmFyIG5hbWVJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ25hbWUnKSk7CisKKyAgICAgICAgIGV4cGVjdChzYWx1dGF0aW9uRWxlbS5nZXRUZXh0KCkpLnRvQmUoJ0hlbGxvIFdvcmxkIScpOworCisgICAgICAgICBzYWx1dGF0aW9uSW5wdXQuY2xlYXIoKTsKKyAgICAgICAgIHNhbHV0YXRpb25JbnB1dC5zZW5kS2V5cygnR3JlZXRpbmdzJyk7CisgICAgICAgICBuYW1lSW5wdXQuY2xlYXIoKTsKKyAgICAgICAgIG5hbWVJbnB1dC5zZW5kS2V5cygndXNlcicpOworCisgICAgICAgICBleHBlY3Qoc2FsdXRhdGlvbkVsZW0uZ2V0VGV4dCgpKS50b0JlKCdHcmVldGluZ3MgdXNlciEnKTsKKyAgICAgICB9KTsKKyAgICAgPC9maWxlPgorICAgPC9leGFtcGxlPgorICovCit2YXIgbmdCaW5kVGVtcGxhdGVEaXJlY3RpdmUgPSBbJyRpbnRlcnBvbGF0ZScsICckY29tcGlsZScsIGZ1bmN0aW9uKCRpbnRlcnBvbGF0ZSwgJGNvbXBpbGUpIHsKKyAgcmV0dXJuIHsKKyAgICBjb21waWxlOiBmdW5jdGlvbiBuZ0JpbmRUZW1wbGF0ZUNvbXBpbGUodGVtcGxhdGVFbGVtZW50KSB7CisgICAgICAkY29tcGlsZS4kJGFkZEJpbmRpbmdDbGFzcyh0ZW1wbGF0ZUVsZW1lbnQpOworICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5nQmluZFRlbXBsYXRlTGluayhzY29wZSwgZWxlbWVudCwgYXR0cikgeworICAgICAgICB2YXIgaW50ZXJwb2xhdGVGbiA9ICRpbnRlcnBvbGF0ZShlbGVtZW50LmF0dHIoYXR0ci4kYXR0ci5uZ0JpbmRUZW1wbGF0ZSkpOworICAgICAgICAkY29tcGlsZS4kJGFkZEJpbmRpbmdJbmZvKGVsZW1lbnQsIGludGVycG9sYXRlRm4uZXhwcmVzc2lvbnMpOworICAgICAgICBlbGVtZW50ID0gZWxlbWVudFswXTsKKyAgICAgICAgYXR0ci4kb2JzZXJ2ZSgnbmdCaW5kVGVtcGxhdGUnLCBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJycgOiB2YWx1ZTsKKyAgICAgICAgfSk7CisgICAgICB9OworICAgIH0KKyAgfTsKK31dOworCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdCaW5kSHRtbAorICoKKyAqIEBkZXNjcmlwdGlvbgorICogRXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGFuZCBpbnNlcnRzIHRoZSByZXN1bHRpbmcgSFRNTCBpbnRvIHRoZSBlbGVtZW50IGluIGEgc2VjdXJlIHdheS4gQnkgZGVmYXVsdCwKKyAqIHRoZSByZXN1bHRpbmcgSFRNTCBjb250ZW50IHdpbGwgYmUgc2FuaXRpemVkIHVzaW5nIHRoZSB7QGxpbmsgbmdTYW5pdGl6ZS4kc2FuaXRpemUgJHNhbml0aXplfSBzZXJ2aWNlLgorICogVG8gdXRpbGl6ZSB0aGlzIGZ1bmN0aW9uYWxpdHksIGVuc3VyZSB0aGF0IGAkc2FuaXRpemVgIGlzIGF2YWlsYWJsZSwgZm9yIGV4YW1wbGUsIGJ5IGluY2x1ZGluZyB7QGxpbmsKKyAqIG5nU2FuaXRpemV9IGluIHlvdXIgbW9kdWxlJ3MgZGVwZW5kZW5jaWVzIChub3QgaW4gY29yZSBBbmd1bGFyKS4gSW4gb3JkZXIgdG8gdXNlIHtAbGluayBuZ1Nhbml0aXplfQorICogaW4geW91ciBtb2R1bGUncyBkZXBlbmRlbmNpZXMsIHlvdSBuZWVkIHRvIGluY2x1ZGUgImFuZ3VsYXItc2FuaXRpemUuanMiIGluIHlvdXIgYXBwbGljYXRpb24uCisgKgorICogWW91IG1heSBhbHNvIGJ5cGFzcyBzYW5pdGl6YXRpb24gZm9yIHZhbHVlcyB5b3Uga25vdyBhcmUgc2FmZS4gVG8gZG8gc28sIGJpbmQgdG8KKyAqIGFuIGV4cGxpY2l0bHkgdHJ1c3RlZCB2YWx1ZSB2aWEge0BsaW5rIG5nLiRzY2UjdHJ1c3RBc0h0bWwgJHNjZS50cnVzdEFzSHRtbH0uICBTZWUgdGhlIGV4YW1wbGUKKyAqIHVuZGVyIHtAbGluayBuZy4kc2NlI3Nob3ctbWUtYW4tZXhhbXBsZS11c2luZy1zY2UtIFN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nIChTQ0UpfS4KKyAqCisgKiBOb3RlOiBJZiBhIGAkc2FuaXRpemVgIHNlcnZpY2UgaXMgdW5hdmFpbGFibGUgYW5kIHRoZSBib3VuZCB2YWx1ZSBpc24ndCBleHBsaWNpdGx5IHRydXN0ZWQsIHlvdQorICogd2lsbCBoYXZlIGFuIGV4Y2VwdGlvbiAoaW5zdGVhZCBvZiBhbiBleHBsb2l0LikKKyAqCisgKiBAZWxlbWVudCBBTlkKKyAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdCaW5kSHRtbCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZS4KKyAqCisgKiBAZXhhbXBsZQorCisgICA8ZXhhbXBsZSBtb2R1bGU9ImJpbmRIdG1sRXhhbXBsZSIgZGVwcz0iYW5ndWxhci1zYW5pdGl6ZS5qcyI+CisgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgICA8cCBuZy1iaW5kLWh0bWw9Im15SFRNTCI+PC9wPgorICAgICAgIDwvZGl2PgorICAgICA8L2ZpbGU+CisKKyAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KKyAgICAgICBhbmd1bGFyLm1vZHVsZSgnYmluZEh0bWxFeGFtcGxlJywgWyduZ1Nhbml0aXplJ10pCisgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgICAgICAkc2NvcGUubXlIVE1MID0KKyAgICAgICAgICAgICAgJ0kgYW0gYW4gPGNvZGU+SFRNTDwvY29kZT5zdHJpbmcgd2l0aCAnICsKKyAgICAgICAgICAgICAgJzxhIGhyZWY9IiMiPmxpbmtzITwvYT4gYW5kIG90aGVyIDxlbT5zdHVmZjwvZW0+JzsKKyAgICAgICAgIH1dKTsKKyAgICAgPC9maWxlPgorCisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctYmluZC1odG1sJywgZnVuY3Rpb24oKSB7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdteUhUTUwnKSkuZ2V0VGV4dCgpKS50b0JlKAorICAgICAgICAgICAgICdJIGFtIGFuIEhUTUxzdHJpbmcgd2l0aCBsaW5rcyEgYW5kIG90aGVyIHN0dWZmJyk7CisgICAgICAgfSk7CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLwordmFyIG5nQmluZEh0bWxEaXJlY3RpdmUgPSBbJyRzY2UnLCAnJHBhcnNlJywgJyRjb21waWxlJywgZnVuY3Rpb24oJHNjZSwgJHBhcnNlLCAkY29tcGlsZSkgeworICByZXR1cm4geworICAgIHJlc3RyaWN0OiAnQScsCisgICAgY29tcGlsZTogZnVuY3Rpb24gbmdCaW5kSHRtbENvbXBpbGUodEVsZW1lbnQsIHRBdHRycykgeworICAgICAgdmFyIG5nQmluZEh0bWxHZXR0ZXIgPSAkcGFyc2UodEF0dHJzLm5nQmluZEh0bWwpOworICAgICAgdmFyIG5nQmluZEh0bWxXYXRjaCA9ICRwYXJzZSh0QXR0cnMubmdCaW5kSHRtbCwgZnVuY3Rpb24gZ2V0U3RyaW5nVmFsdWUodmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSB8fCAnJykudG9TdHJpbmcoKTsKKyAgICAgIH0pOworICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nQ2xhc3ModEVsZW1lbnQpOworCisgICAgICByZXR1cm4gZnVuY3Rpb24gbmdCaW5kSHRtbExpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHsKKyAgICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyhlbGVtZW50LCBhdHRyLm5nQmluZEh0bWwpOworCisgICAgICAgIHNjb3BlLiR3YXRjaChuZ0JpbmRIdG1sV2F0Y2gsIGZ1bmN0aW9uIG5nQmluZEh0bWxXYXRjaEFjdGlvbigpIHsKKyAgICAgICAgICAvLyB3ZSByZS1ldmFsdWF0ZSB0aGUgZXhwciBiZWNhdXNlIHdlIHdhbnQgYSBUcnVzdGVkVmFsdWVIb2xkZXJUeXBlCisgICAgICAgICAgLy8gZm9yICRzY2UsIG5vdCBhIHN0cmluZworICAgICAgICAgIGVsZW1lbnQuaHRtbCgkc2NlLmdldFRydXN0ZWRIdG1sKG5nQmluZEh0bWxHZXR0ZXIoc2NvcGUpKSB8fCAnJyk7CisgICAgICAgIH0pOworICAgICAgfTsKKyAgICB9CisgIH07Cit9XTsKKworZnVuY3Rpb24gY2xhc3NEaXJlY3RpdmUobmFtZSwgc2VsZWN0b3IpIHsKKyAgbmFtZSA9ICduZ0NsYXNzJyArIG5hbWU7CisgIHJldHVybiBbJyRhbmltYXRlJywgZnVuY3Rpb24oJGFuaW1hdGUpIHsKKyAgICByZXR1cm4geworICAgICAgcmVzdHJpY3Q6ICdBQycsCisgICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cikgeworICAgICAgICB2YXIgb2xkVmFsOworCisgICAgICAgIHNjb3BlLiR3YXRjaChhdHRyW25hbWVdLCBuZ0NsYXNzV2F0Y2hBY3Rpb24sIHRydWUpOworCisgICAgICAgIGF0dHIuJG9ic2VydmUoJ2NsYXNzJywgZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgICBuZ0NsYXNzV2F0Y2hBY3Rpb24oc2NvcGUuJGV2YWwoYXR0cltuYW1lXSkpOworICAgICAgICB9KTsKKworCisgICAgICAgIGlmIChuYW1lICE9PSAnbmdDbGFzcycpIHsKKyAgICAgICAgICBzY29wZS4kd2F0Y2goJyRpbmRleCcsIGZ1bmN0aW9uKCRpbmRleCwgb2xkJGluZGV4KSB7CisgICAgICAgICAgICAvLyBqc2hpbnQgYml0d2lzZTogZmFsc2UKKyAgICAgICAgICAgIHZhciBtb2QgPSAkaW5kZXggJiAxOworICAgICAgICAgICAgaWYgKG1vZCAhPT0gKG9sZCRpbmRleCAmIDEpKSB7CisgICAgICAgICAgICAgIHZhciBjbGFzc2VzID0gYXJyYXlDbGFzc2VzKHNjb3BlLiRldmFsKGF0dHJbbmFtZV0pKTsKKyAgICAgICAgICAgICAgbW9kID09PSBzZWxlY3RvciA/CisgICAgICAgICAgICAgICAgYWRkQ2xhc3NlcyhjbGFzc2VzKSA6CisgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3NlcyhjbGFzc2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGFkZENsYXNzZXMoY2xhc3NlcykgeworICAgICAgICAgIHZhciBuZXdDbGFzc2VzID0gZGlnZXN0Q2xhc3NDb3VudHMoY2xhc3NlcywgMSk7CisgICAgICAgICAgYXR0ci4kYWRkQ2xhc3MobmV3Q2xhc3Nlcyk7CisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiByZW1vdmVDbGFzc2VzKGNsYXNzZXMpIHsKKyAgICAgICAgICB2YXIgbmV3Q2xhc3NlcyA9IGRpZ2VzdENsYXNzQ291bnRzKGNsYXNzZXMsIC0xKTsKKyAgICAgICAgICBhdHRyLiRyZW1vdmVDbGFzcyhuZXdDbGFzc2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGRpZ2VzdENsYXNzQ291bnRzKGNsYXNzZXMsIGNvdW50KSB7CisgICAgICAgICAgdmFyIGNsYXNzQ291bnRzID0gZWxlbWVudC5kYXRhKCckY2xhc3NDb3VudHMnKSB8fCB7fTsKKyAgICAgICAgICB2YXIgY2xhc3Nlc1RvVXBkYXRlID0gW107CisgICAgICAgICAgZm9yRWFjaChjbGFzc2VzLCBmdW5jdGlvbihjbGFzc05hbWUpIHsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDAgfHwgY2xhc3NDb3VudHNbY2xhc3NOYW1lXSkgeworICAgICAgICAgICAgICBjbGFzc0NvdW50c1tjbGFzc05hbWVdID0gKGNsYXNzQ291bnRzW2NsYXNzTmFtZV0gfHwgMCkgKyBjb3VudDsKKyAgICAgICAgICAgICAgaWYgKGNsYXNzQ291bnRzW2NsYXNzTmFtZV0gPT09ICsoY291bnQgPiAwKSkgeworICAgICAgICAgICAgICAgIGNsYXNzZXNUb1VwZGF0ZS5wdXNoKGNsYXNzTmFtZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgICBlbGVtZW50LmRhdGEoJyRjbGFzc0NvdW50cycsIGNsYXNzQ291bnRzKTsKKyAgICAgICAgICByZXR1cm4gY2xhc3Nlc1RvVXBkYXRlLmpvaW4oJyAnKTsKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUNsYXNzZXMob2xkQ2xhc3NlcywgbmV3Q2xhc3NlcykgeworICAgICAgICAgIHZhciB0b0FkZCA9IGFycmF5RGlmZmVyZW5jZShuZXdDbGFzc2VzLCBvbGRDbGFzc2VzKTsKKyAgICAgICAgICB2YXIgdG9SZW1vdmUgPSBhcnJheURpZmZlcmVuY2Uob2xkQ2xhc3NlcywgbmV3Q2xhc3Nlcyk7CisgICAgICAgICAgdG9BZGQgPSBkaWdlc3RDbGFzc0NvdW50cyh0b0FkZCwgMSk7CisgICAgICAgICAgdG9SZW1vdmUgPSBkaWdlc3RDbGFzc0NvdW50cyh0b1JlbW92ZSwgLTEpOworICAgICAgICAgIGlmICh0b0FkZCAmJiB0b0FkZC5sZW5ndGgpIHsKKyAgICAgICAgICAgICRhbmltYXRlLmFkZENsYXNzKGVsZW1lbnQsIHRvQWRkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRvUmVtb3ZlICYmIHRvUmVtb3ZlLmxlbmd0aCkgeworICAgICAgICAgICAgJGFuaW1hdGUucmVtb3ZlQ2xhc3MoZWxlbWVudCwgdG9SZW1vdmUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIG5nQ2xhc3NXYXRjaEFjdGlvbihuZXdWYWwpIHsKKyAgICAgICAgICBpZiAoc2VsZWN0b3IgPT09IHRydWUgfHwgc2NvcGUuJGluZGV4ICUgMiA9PT0gc2VsZWN0b3IpIHsKKyAgICAgICAgICAgIHZhciBuZXdDbGFzc2VzID0gYXJyYXlDbGFzc2VzKG5ld1ZhbCB8fCBbXSk7CisgICAgICAgICAgICBpZiAoIW9sZFZhbCkgeworICAgICAgICAgICAgICBhZGRDbGFzc2VzKG5ld0NsYXNzZXMpOworICAgICAgICAgICAgfSBlbHNlIGlmICghZXF1YWxzKG5ld1ZhbCxvbGRWYWwpKSB7CisgICAgICAgICAgICAgIHZhciBvbGRDbGFzc2VzID0gYXJyYXlDbGFzc2VzKG9sZFZhbCk7CisgICAgICAgICAgICAgIHVwZGF0ZUNsYXNzZXMob2xkQ2xhc3NlcywgbmV3Q2xhc3Nlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIG9sZFZhbCA9IHNoYWxsb3dDb3B5KG5ld1ZhbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworCisgICAgZnVuY3Rpb24gYXJyYXlEaWZmZXJlbmNlKHRva2VuczEsIHRva2VuczIpIHsKKyAgICAgIHZhciB2YWx1ZXMgPSBbXTsKKworICAgICAgb3V0ZXI6CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2VuczEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zMVtpXTsKKyAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0b2tlbnMyLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgaWYgKHRva2VuID09IHRva2VuczJbal0pIGNvbnRpbnVlIG91dGVyOworICAgICAgICB9CisgICAgICAgIHZhbHVlcy5wdXNoKHRva2VuKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorCisgICAgZnVuY3Rpb24gYXJyYXlDbGFzc2VzKGNsYXNzVmFsKSB7CisgICAgICBpZiAoaXNBcnJheShjbGFzc1ZhbCkpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzVmFsOworICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyhjbGFzc1ZhbCkpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzVmFsLnNwbGl0KCcgJyk7CisgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGNsYXNzVmFsKSkgeworICAgICAgICB2YXIgY2xhc3NlcyA9IFtdOworICAgICAgICBmb3JFYWNoKGNsYXNzVmFsLCBmdW5jdGlvbih2LCBrKSB7CisgICAgICAgICAgaWYgKHYpIHsKKyAgICAgICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmNvbmNhdChrLnNwbGl0KCcgJykpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgICAgfQorICAgICAgcmV0dXJuIGNsYXNzVmFsOworICAgIH0KKyAgfV07Cit9CisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdDbGFzcworICogQHJlc3RyaWN0IEFDCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBUaGUgYG5nQ2xhc3NgIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIGR5bmFtaWNhbGx5IHNldCBDU1MgY2xhc3NlcyBvbiBhbiBIVE1MIGVsZW1lbnQgYnkgZGF0YWJpbmRpbmcKKyAqIGFuIGV4cHJlc3Npb24gdGhhdCByZXByZXNlbnRzIGFsbCBjbGFzc2VzIHRvIGJlIGFkZGVkLgorICoKKyAqIFRoZSBkaXJlY3RpdmUgb3BlcmF0ZXMgaW4gdGhyZWUgZGlmZmVyZW50IHdheXMsIGRlcGVuZGluZyBvbiB3aGljaCBvZiB0aHJlZSB0eXBlcyB0aGUgZXhwcmVzc2lvbgorICogZXZhbHVhdGVzIHRvOgorICoKKyAqIDEuIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHN0cmluZywgdGhlIHN0cmluZyBzaG91bGQgYmUgb25lIG9yIG1vcmUgc3BhY2UtZGVsaW1pdGVkIGNsYXNzCisgKiBuYW1lcy4KKyAqCisgKiAyLiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYW4gYXJyYXksIGVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgc2hvdWxkIGJlIGEgc3RyaW5nIHRoYXQgaXMKKyAqIG9uZSBvciBtb3JlIHNwYWNlLWRlbGltaXRlZCBjbGFzcyBuYW1lcy4KKyAqCisgKiAzLiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYW4gb2JqZWN0LCB0aGVuIGZvciBlYWNoIGtleS12YWx1ZSBwYWlyIG9mIHRoZQorICogb2JqZWN0IHdpdGggYSB0cnV0aHkgdmFsdWUgdGhlIGNvcnJlc3BvbmRpbmcga2V5IGlzIHVzZWQgYXMgYSBjbGFzcyBuYW1lLgorICoKKyAqIFRoZSBkaXJlY3RpdmUgd29uJ3QgYWRkIGR1cGxpY2F0ZSBjbGFzc2VzIGlmIGEgcGFydGljdWxhciBjbGFzcyB3YXMgYWxyZWFkeSBzZXQuCisgKgorICogV2hlbiB0aGUgZXhwcmVzc2lvbiBjaGFuZ2VzLCB0aGUgcHJldmlvdXNseSBhZGRlZCBjbGFzc2VzIGFyZSByZW1vdmVkIGFuZCBvbmx5IHRoZW4gdGhlCisgKiBuZXcgY2xhc3NlcyBhcmUgYWRkZWQuCisgKgorICogQGFuaW1hdGlvbnMKKyAqIGFkZCAtIGhhcHBlbnMganVzdCBiZWZvcmUgdGhlIGNsYXNzIGlzIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQKKyAqIHJlbW92ZSAtIGhhcHBlbnMganVzdCBiZWZvcmUgdGhlIGNsYXNzIGlzIHJlbW92ZWQgZnJvbSB0aGUgZWxlbWVudAorICoKKyAqIEBlbGVtZW50IEFOWQorICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NsYXNzIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWwuIFRoZSByZXN1bHQKKyAqICAgb2YgdGhlIGV2YWx1YXRpb24gY2FuIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBzcGFjZSBkZWxpbWl0ZWQgY2xhc3MKKyAqICAgbmFtZXMsIGFuIGFycmF5LCBvciBhIG1hcCBvZiBjbGFzcyBuYW1lcyB0byBib29sZWFuIHZhbHVlcy4gSW4gdGhlIGNhc2Ugb2YgYSBtYXAsIHRoZQorICogICBuYW1lcyBvZiB0aGUgcHJvcGVydGllcyB3aG9zZSB2YWx1ZXMgYXJlIHRydXRoeSB3aWxsIGJlIGFkZGVkIGFzIGNzcyBjbGFzc2VzIHRvIHRoZQorICogICBlbGVtZW50LgorICoKKyAqIEBleGFtcGxlIEV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgYmFzaWMgYmluZGluZ3MgdmlhIG5nQ2xhc3MgZGlyZWN0aXZlLgorICAgPGV4YW1wbGU+CisgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgIDxwIG5nLWNsYXNzPSJ7c3RyaWtlOiBkZWxldGVkLCBib2xkOiBpbXBvcnRhbnQsIHJlZDogZXJyb3J9Ij5NYXAgU3ludGF4IEV4YW1wbGU8L3A+CisgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iZGVsZXRlZCI+IGRlbGV0ZWQgKGFwcGx5ICJzdHJpa2UiIGNsYXNzKTxicj4KKyAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJpbXBvcnRhbnQiPiBpbXBvcnRhbnQgKGFwcGx5ICJib2xkIiBjbGFzcyk8YnI+CisgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iZXJyb3IiPiBlcnJvciAoYXBwbHkgInJlZCIgY2xhc3MpCisgICAgICAgPGhyPgorICAgICAgIDxwIG5nLWNsYXNzPSJzdHlsZSI+VXNpbmcgU3RyaW5nIFN5bnRheDwvcD4KKyAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InN0eWxlIiBwbGFjZWhvbGRlcj0iVHlwZTogYm9sZCBzdHJpa2UgcmVkIj4KKyAgICAgICA8aHI+CisgICAgICAgPHAgbmctY2xhc3M9IltzdHlsZTEsIHN0eWxlMiwgc3R5bGUzXSI+VXNpbmcgQXJyYXkgU3ludGF4PC9wPgorICAgICAgIDxpbnB1dCBuZy1tb2RlbD0ic3R5bGUxIiBwbGFjZWhvbGRlcj0iVHlwZTogYm9sZCwgc3RyaWtlIG9yIHJlZCI+PGJyPgorICAgICAgIDxpbnB1dCBuZy1tb2RlbD0ic3R5bGUyIiBwbGFjZWhvbGRlcj0iVHlwZTogYm9sZCwgc3RyaWtlIG9yIHJlZCI+PGJyPgorICAgICAgIDxpbnB1dCBuZy1tb2RlbD0ic3R5bGUzIiBwbGFjZWhvbGRlcj0iVHlwZTogYm9sZCwgc3RyaWtlIG9yIHJlZCI+PGJyPgorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InN0eWxlLmNzcyI+CisgICAgICAgLnN0cmlrZSB7CisgICAgICAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKKyAgICAgICB9CisgICAgICAgLmJvbGQgeworICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICB9CisgICAgICAgLnJlZCB7CisgICAgICAgICAgIGNvbG9yOiByZWQ7CisgICAgICAgfQorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIHZhciBwcyA9IGVsZW1lbnQuYWxsKGJ5LmNzcygncCcpKTsKKworICAgICAgIGl0KCdzaG91bGQgbGV0IHlvdSB0b2dnbGUgdGhlIGNsYXNzJywgZnVuY3Rpb24oKSB7CisKKyAgICAgICAgIGV4cGVjdChwcy5maXJzdCgpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkubm90LnRvTWF0Y2goL2JvbGQvKTsKKyAgICAgICAgIGV4cGVjdChwcy5maXJzdCgpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkubm90LnRvTWF0Y2goL3JlZC8pOworCisgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdpbXBvcnRhbnQnKSkuY2xpY2soKTsKKyAgICAgICAgIGV4cGVjdChwcy5maXJzdCgpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG9NYXRjaCgvYm9sZC8pOworCisgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdlcnJvcicpKS5jbGljaygpOworICAgICAgICAgZXhwZWN0KHBzLmZpcnN0KCkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b01hdGNoKC9yZWQvKTsKKyAgICAgICB9KTsKKworICAgICAgIGl0KCdzaG91bGQgbGV0IHlvdSB0b2dnbGUgc3RyaW5nIGV4YW1wbGUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIGV4cGVjdChwcy5nZXQoMSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b0JlKCcnKTsKKyAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3N0eWxlJykpLmNsZWFyKCk7CisgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzdHlsZScpKS5zZW5kS2V5cygncmVkJyk7CisgICAgICAgICBleHBlY3QocHMuZ2V0KDEpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG9CZSgncmVkJyk7CisgICAgICAgfSk7CisKKyAgICAgICBpdCgnYXJyYXkgZXhhbXBsZSBzaG91bGQgaGF2ZSAzIGNsYXNzZXMnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIGV4cGVjdChwcy5sYXN0KCkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b0JlKCcnKTsKKyAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3N0eWxlMScpKS5zZW5kS2V5cygnYm9sZCcpOworICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnc3R5bGUyJykpLnNlbmRLZXlzKCdzdHJpa2UnKTsKKyAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3N0eWxlMycpKS5zZW5kS2V5cygncmVkJyk7CisgICAgICAgICBleHBlY3QocHMubGFzdCgpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG9CZSgnYm9sZCBzdHJpa2UgcmVkJyk7CisgICAgICAgfSk7CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKworICAgIyMgQW5pbWF0aW9ucworCisgICBUaGUgZXhhbXBsZSBiZWxvdyBkZW1vbnN0cmF0ZXMgaG93IHRvIHBlcmZvcm0gYW5pbWF0aW9ucyB1c2luZyBuZ0NsYXNzLgorCisgICA8ZXhhbXBsZSBtb2R1bGU9Im5nQW5pbWF0ZSIgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIj4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICA8aW5wdXQgaWQ9InNldGJ0biIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0ic2V0IiBuZy1jbGljaz0ibXlWYXI9J215LWNsYXNzJyI+CisgICAgICA8aW5wdXQgaWQ9ImNsZWFyYnRuIiB0eXBlPSJidXR0b24iIHZhbHVlPSJjbGVhciIgbmctY2xpY2s9Im15VmFyPScnIj4KKyAgICAgIDxicj4KKyAgICAgIDxzcGFuIGNsYXNzPSJiYXNlLWNsYXNzIiBuZy1jbGFzcz0ibXlWYXIiPlNhbXBsZSBUZXh0PC9zcGFuPgorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InN0eWxlLmNzcyI+CisgICAgICAgLmJhc2UtY2xhc3MgeworICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDAuNXM7CisgICAgICAgICB0cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDAuNXM7CisgICAgICAgfQorCisgICAgICAgLmJhc2UtY2xhc3MubXktY2xhc3MgeworICAgICAgICAgY29sb3I6IHJlZDsKKyAgICAgICAgIGZvbnQtc2l6ZTozZW07CisgICAgICAgfQorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctY2xhc3MnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnLmJhc2UtY2xhc3MnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5ub3QuCisgICAgICAgICAgIHRvTWF0Y2goL215LWNsYXNzLyk7CisKKyAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ3NldGJ0bicpKS5jbGljaygpOworCisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJy5iYXNlLWNsYXNzJykpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkuCisgICAgICAgICAgIHRvTWF0Y2goL215LWNsYXNzLyk7CisKKyAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ2NsZWFyYnRuJykpLmNsaWNrKCk7CisKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnLmJhc2UtY2xhc3MnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5ub3QuCisgICAgICAgICAgIHRvTWF0Y2goL215LWNsYXNzLyk7CisgICAgICAgfSk7CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKworCisgICAjIyBuZ0NsYXNzIGFuZCBwcmUtZXhpc3RpbmcgQ1NTMyBUcmFuc2l0aW9ucy9BbmltYXRpb25zCisgICBUaGUgbmdDbGFzcyBkaXJlY3RpdmUgc3RpbGwgc3VwcG9ydHMgQ1NTMyBUcmFuc2l0aW9ucy9BbmltYXRpb25zIGV2ZW4gaWYgdGhleSBkbyBub3QgZm9sbG93IHRoZSBuZ0FuaW1hdGUgQ1NTIG5hbWluZyBzdHJ1Y3R1cmUuCisgICBVcG9uIGFuaW1hdGlvbiBuZ0FuaW1hdGUgd2lsbCBhcHBseSBzdXBwbGVtZW50YXJ5IENTUyBjbGFzc2VzIHRvIHRyYWNrIHRoZSBzdGFydCBhbmQgZW5kIG9mIGFuIGFuaW1hdGlvbiwgYnV0IHRoaXMgd2lsbCBub3QgaGluZGVyCisgICBhbnkgcHJlLWV4aXN0aW5nIENTUyB0cmFuc2l0aW9ucyBhbHJlYWR5IG9uIHRoZSBlbGVtZW50LiBUbyBnZXQgYW4gaWRlYSBvZiB3aGF0IGhhcHBlbnMgZHVyaW5nIGEgY2xhc3MtYmFzZWQgYW5pbWF0aW9uLCBiZSBzdXJlCisgICB0byB2aWV3IHRoZSBzdGVwIGJ5IHN0ZXAgZGV0YWlscyBvZiB7QGxpbmsgbmcuJGFuaW1hdGUjYWRkQ2xhc3MgJGFuaW1hdGUuYWRkQ2xhc3N9IGFuZAorICAge0BsaW5rIG5nLiRhbmltYXRlI3JlbW92ZUNsYXNzICRhbmltYXRlLnJlbW92ZUNsYXNzfS4KKyAqLwordmFyIG5nQ2xhc3NEaXJlY3RpdmUgPSBjbGFzc0RpcmVjdGl2ZSgnJywgdHJ1ZSk7CisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdDbGFzc09kZAorICogQHJlc3RyaWN0IEFDCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBUaGUgYG5nQ2xhc3NPZGRgIGFuZCBgbmdDbGFzc0V2ZW5gIGRpcmVjdGl2ZXMgd29yayBleGFjdGx5IGFzCisgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ2xhc3MgbmdDbGFzc30sIGV4Y2VwdCB0aGV5IHdvcmsgaW4KKyAqIGNvbmp1bmN0aW9uIHdpdGggYG5nUmVwZWF0YCBhbmQgdGFrZSBlZmZlY3Qgb25seSBvbiBvZGQgKGV2ZW4pIHJvd3MuCisgKgorICogVGhpcyBkaXJlY3RpdmUgY2FuIGJlIGFwcGxpZWQgb25seSB3aXRoaW4gdGhlIHNjb3BlIG9mIGFuCisgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nUmVwZWF0IG5nUmVwZWF0fS4KKyAqCisgKiBAZWxlbWVudCBBTlkKKyAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDbGFzc09kZCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsLiBUaGUgcmVzdWx0CisgKiAgIG9mIHRoZSBldmFsdWF0aW9uIGNhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgc3BhY2UgZGVsaW1pdGVkIGNsYXNzIG5hbWVzIG9yIGFuIGFycmF5LgorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZT4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICAgIDxvbCBuZy1pbml0PSJuYW1lcz1bJ0pvaG4nLCAnTWFyeScsICdDYXRlJywgJ1N1eiddIj4KKyAgICAgICAgICA8bGkgbmctcmVwZWF0PSJuYW1lIGluIG5hbWVzIj4KKyAgICAgICAgICAgPHNwYW4gbmctY2xhc3Mtb2RkPSInb2RkJyIgbmctY2xhc3MtZXZlbj0iJ2V2ZW4nIj4KKyAgICAgICAgICAgICB7e25hbWV9fQorICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgPC9saT4KKyAgICAgICAgPC9vbD4KKyAgICAgPC9maWxlPgorICAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPgorICAgICAgIC5vZGQgeworICAgICAgICAgY29sb3I6IHJlZDsKKyAgICAgICB9CisgICAgICAgLmV2ZW4geworICAgICAgICAgY29sb3I6IGJsdWU7CisgICAgICAgfQorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctY2xhc3Mtb2RkIGFuZCBuZy1jbGFzcy1ldmVuJywgZnVuY3Rpb24oKSB7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5yZXBlYXRlcignbmFtZSBpbiBuYW1lcycpLnJvdygwKS5jb2x1bW4oJ25hbWUnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS4KKyAgICAgICAgICAgdG9NYXRjaCgvb2RkLyk7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5yZXBlYXRlcignbmFtZSBpbiBuYW1lcycpLnJvdygxKS5jb2x1bW4oJ25hbWUnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS4KKyAgICAgICAgICAgdG9NYXRjaCgvZXZlbi8pOworICAgICAgIH0pOworICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisgKi8KK3ZhciBuZ0NsYXNzT2RkRGlyZWN0aXZlID0gY2xhc3NEaXJlY3RpdmUoJ09kZCcsIDApOworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nQ2xhc3NFdmVuCisgKiBAcmVzdHJpY3QgQUMKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFRoZSBgbmdDbGFzc09kZGAgYW5kIGBuZ0NsYXNzRXZlbmAgZGlyZWN0aXZlcyB3b3JrIGV4YWN0bHkgYXMKKyAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDbGFzcyBuZ0NsYXNzfSwgZXhjZXB0IHRoZXkgd29yayBpbgorICogY29uanVuY3Rpb24gd2l0aCBgbmdSZXBlYXRgIGFuZCB0YWtlIGVmZmVjdCBvbmx5IG9uIG9kZCAoZXZlbikgcm93cy4KKyAqCisgKiBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgYXBwbGllZCBvbmx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgYW4KKyAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdSZXBlYXQgbmdSZXBlYXR9LgorICoKKyAqIEBlbGVtZW50IEFOWQorICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NsYXNzRXZlbiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsLiBUaGUKKyAqICAgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uIGNhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgc3BhY2UgZGVsaW1pdGVkIGNsYXNzIG5hbWVzIG9yIGFuIGFycmF5LgorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZT4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICAgIDxvbCBuZy1pbml0PSJuYW1lcz1bJ0pvaG4nLCAnTWFyeScsICdDYXRlJywgJ1N1eiddIj4KKyAgICAgICAgICA8bGkgbmctcmVwZWF0PSJuYW1lIGluIG5hbWVzIj4KKyAgICAgICAgICAgPHNwYW4gbmctY2xhc3Mtb2RkPSInb2RkJyIgbmctY2xhc3MtZXZlbj0iJ2V2ZW4nIj4KKyAgICAgICAgICAgICB7e25hbWV9fSAmbmJzcDsgJm5ic3A7ICZuYnNwOworICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgPC9saT4KKyAgICAgICAgPC9vbD4KKyAgICAgPC9maWxlPgorICAgICA8ZmlsZSBuYW1lPSJzdHlsZS5jc3MiPgorICAgICAgIC5vZGQgeworICAgICAgICAgY29sb3I6IHJlZDsKKyAgICAgICB9CisgICAgICAgLmV2ZW4geworICAgICAgICAgY29sb3I6IGJsdWU7CisgICAgICAgfQorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctY2xhc3Mtb2RkIGFuZCBuZy1jbGFzcy1ldmVuJywgZnVuY3Rpb24oKSB7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5yZXBlYXRlcignbmFtZSBpbiBuYW1lcycpLnJvdygwKS5jb2x1bW4oJ25hbWUnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS4KKyAgICAgICAgICAgdG9NYXRjaCgvb2RkLyk7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5yZXBlYXRlcignbmFtZSBpbiBuYW1lcycpLnJvdygxKS5jb2x1bW4oJ25hbWUnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS4KKyAgICAgICAgICAgdG9NYXRjaCgvZXZlbi8pOworICAgICAgIH0pOworICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisgKi8KK3ZhciBuZ0NsYXNzRXZlbkRpcmVjdGl2ZSA9IGNsYXNzRGlyZWN0aXZlKCdFdmVuJywgMSk7CisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdDbG9haworICogQHJlc3RyaWN0IEFDCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBUaGUgYG5nQ2xvYWtgIGRpcmVjdGl2ZSBpcyB1c2VkIHRvIHByZXZlbnQgdGhlIEFuZ3VsYXIgaHRtbCB0ZW1wbGF0ZSBmcm9tIGJlaW5nIGJyaWVmbHkKKyAqIGRpc3BsYXllZCBieSB0aGUgYnJvd3NlciBpbiBpdHMgcmF3ICh1bmNvbXBpbGVkKSBmb3JtIHdoaWxlIHlvdXIgYXBwbGljYXRpb24gaXMgbG9hZGluZy4gVXNlIHRoaXMKKyAqIGRpcmVjdGl2ZSB0byBhdm9pZCB0aGUgdW5kZXNpcmFibGUgZmxpY2tlciBlZmZlY3QgY2F1c2VkIGJ5IHRoZSBodG1sIHRlbXBsYXRlIGRpc3BsYXkuCisgKgorICogVGhlIGRpcmVjdGl2ZSBjYW4gYmUgYXBwbGllZCB0byB0aGUgYDxib2R5PmAgZWxlbWVudCwgYnV0IHRoZSBwcmVmZXJyZWQgdXNhZ2UgaXMgdG8gYXBwbHkKKyAqIG11bHRpcGxlIGBuZ0Nsb2FrYCBkaXJlY3RpdmVzIHRvIHNtYWxsIHBvcnRpb25zIG9mIHRoZSBwYWdlIHRvIHBlcm1pdCBwcm9ncmVzc2l2ZSByZW5kZXJpbmcKKyAqIG9mIHRoZSBicm93c2VyIHZpZXcuCisgKgorICogYG5nQ2xvYWtgIHdvcmtzIGluIGNvb3BlcmF0aW9uIHdpdGggdGhlIGZvbGxvd2luZyBjc3MgcnVsZSBlbWJlZGRlZCB3aXRoaW4gYGFuZ3VsYXIuanNgIGFuZAorICogYGFuZ3VsYXIubWluLmpzYC4KKyAqIEZvciBDU1AgbW9kZSBwbGVhc2UgYWRkIGBhbmd1bGFyLWNzcC5jc3NgIHRvIHlvdXIgaHRtbCBmaWxlIChzZWUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NzcCBuZ0NzcH0pLgorICoKKyAqIGBgYGNzcworICogW25nXDpjbG9ha10sIFtuZy1jbG9ha10sIFtkYXRhLW5nLWNsb2FrXSwgW3gtbmctY2xvYWtdLCAubmctY2xvYWssIC54LW5nLWNsb2FrIHsKKyAqICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OworICogfQorICogYGBgCisgKgorICogV2hlbiB0aGlzIGNzcyBydWxlIGlzIGxvYWRlZCBieSB0aGUgYnJvd3NlciwgYWxsIGh0bWwgZWxlbWVudHMgKGluY2x1ZGluZyB0aGVpciBjaGlsZHJlbikgdGhhdAorICogYXJlIHRhZ2dlZCB3aXRoIHRoZSBgbmdDbG9ha2AgZGlyZWN0aXZlIGFyZSBoaWRkZW4uIFdoZW4gQW5ndWxhciBlbmNvdW50ZXJzIHRoaXMgZGlyZWN0aXZlCisgKiBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBpdCBkZWxldGVzIHRoZSBgbmdDbG9ha2AgZWxlbWVudCBhdHRyaWJ1dGUsIG1ha2luZworICogdGhlIGNvbXBpbGVkIGVsZW1lbnQgdmlzaWJsZS4KKyAqCisgKiBGb3IgdGhlIGJlc3QgcmVzdWx0LCB0aGUgYGFuZ3VsYXIuanNgIHNjcmlwdCBtdXN0IGJlIGxvYWRlZCBpbiB0aGUgaGVhZCBzZWN0aW9uIG9mIHRoZSBodG1sCisgKiBkb2N1bWVudDsgYWx0ZXJuYXRpdmVseSwgdGhlIGNzcyBydWxlIGFib3ZlIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGV4dGVybmFsIHN0eWxlc2hlZXQgb2YgdGhlCisgKiBhcHBsaWNhdGlvbi4KKyAqCisgKiBMZWdhY3kgYnJvd3NlcnMsIGxpa2UgSUU3LCBkbyBub3QgcHJvdmlkZSBhdHRyaWJ1dGUgc2VsZWN0b3Igc3VwcG9ydCAoYWRkZWQgaW4gQ1NTIDIuMSkgc28gdGhleQorICogY2Fubm90IG1hdGNoIHRoZSBgW25nXDpjbG9ha11gIHNlbGVjdG9yLiBUbyB3b3JrIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHlvdSBtdXN0IGFkZCB0aGUgY3NzCisgKiBjbGFzcyBgbmctY2xvYWtgIGluIGFkZGl0aW9uIHRvIHRoZSBgbmdDbG9ha2AgZGlyZWN0aXZlIGFzIHNob3duIGluIHRoZSBleGFtcGxlIGJlbG93LgorICoKKyAqIEBlbGVtZW50IEFOWQorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZT4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICAgIDxkaXYgaWQ9InRlbXBsYXRlMSIgbmctY2xvYWs+e3sgJ2hlbGxvJyB9fTwvZGl2PgorICAgICAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZTIiIG5nLWNsb2FrIGNsYXNzPSJuZy1jbG9hayI+e3sgJ2hlbGxvIElFNycgfX08L2Rpdj4KKyAgICAgPC9maWxlPgorICAgICA8ZmlsZSBuYW1lPSJwcm90cmFjdG9yLmpzIiB0eXBlPSJwcm90cmFjdG9yIj4KKyAgICAgICBpdCgnc2hvdWxkIHJlbW92ZSB0aGUgdGVtcGxhdGUgZGlyZWN0aXZlIGFuZCBjc3MgY2xhc3MnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIGV4cGVjdCgkKCcjdGVtcGxhdGUxJykuZ2V0QXR0cmlidXRlKCduZy1jbG9haycpKS4KKyAgICAgICAgICAgdG9CZU51bGwoKTsKKyAgICAgICAgIGV4cGVjdCgkKCcjdGVtcGxhdGUyJykuZ2V0QXR0cmlidXRlKCduZy1jbG9haycpKS4KKyAgICAgICAgICAgdG9CZU51bGwoKTsKKyAgICAgICB9KTsKKyAgICAgPC9maWxlPgorICAgPC9leGFtcGxlPgorICoKKyAqLwordmFyIG5nQ2xvYWtEaXJlY3RpdmUgPSBuZ0RpcmVjdGl2ZSh7CisgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHsKKyAgICBhdHRyLiRzZXQoJ25nQ2xvYWsnLCB1bmRlZmluZWQpOworICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ25nLWNsb2FrJyk7CisgIH0KK30pOworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nQ29udHJvbGxlcgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogVGhlIGBuZ0NvbnRyb2xsZXJgIGRpcmVjdGl2ZSBhdHRhY2hlcyBhIGNvbnRyb2xsZXIgY2xhc3MgdG8gdGhlIHZpZXcuIFRoaXMgaXMgYSBrZXkgYXNwZWN0IG9mIGhvdyBhbmd1bGFyCisgKiBzdXBwb3J0cyB0aGUgcHJpbmNpcGxlcyBiZWhpbmQgdGhlIE1vZGVsLVZpZXctQ29udHJvbGxlciBkZXNpZ24gcGF0dGVybi4KKyAqCisgKiBNVkMgY29tcG9uZW50cyBpbiBhbmd1bGFyOgorICoKKyAqICogTW9kZWwg4oA/IE1vZGVscyBhcmUgdGhlIHByb3BlcnRpZXMgb2YgYSBzY29wZTsgc2NvcGVzIGFyZSBhdHRhY2hlZCB0byB0aGUgRE9NIHdoZXJlIHNjb3BlIHByb3BlcnRpZXMKKyAqICAgYXJlIGFjY2Vzc2VkIHRocm91Z2ggYmluZGluZ3MuCisgKiAqIFZpZXcg4oA/IFRoZSB0ZW1wbGF0ZSAoSFRNTCB3aXRoIGRhdGEgYmluZGluZ3MpIHRoYXQgaXMgcmVuZGVyZWQgaW50byB0aGUgVmlldy4KKyAqICogQ29udHJvbGxlciDigD8gVGhlIGBuZ0NvbnRyb2xsZXJgIGRpcmVjdGl2ZSBzcGVjaWZpZXMgYSBDb250cm9sbGVyIGNsYXNzOyB0aGUgY2xhc3MgY29udGFpbnMgYnVzaW5lc3MKKyAqICAgbG9naWMgYmVoaW5kIHRoZSBhcHBsaWNhdGlvbiB0byBkZWNvcmF0ZSB0aGUgc2NvcGUgd2l0aCBmdW5jdGlvbnMgYW5kIHZhbHVlcworICoKKyAqIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gYXR0YWNoIGNvbnRyb2xsZXJzIHRvIHRoZSBET00gYnkgZGVjbGFyaW5nIGl0IGluIGEgcm91dGUgZGVmaW5pdGlvbgorICogdmlhIHRoZSB7QGxpbmsgbmdSb3V0ZS4kcm91dGUgJHJvdXRlfSBzZXJ2aWNlLiBBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIGRlY2xhcmUgdGhlIGNvbnRyb2xsZXIKKyAqIGFnYWluIHVzaW5nIGBuZy1jb250cm9sbGVyYCBpbiB0aGUgdGVtcGxhdGUgaXRzZWxmLiAgVGhpcyB3aWxsIGNhdXNlIHRoZSBjb250cm9sbGVyIHRvIGJlIGF0dGFjaGVkCisgKiBhbmQgZXhlY3V0ZWQgdHdpY2UuCisgKgorICogQGVsZW1lbnQgQU5ZCisgKiBAc2NvcGUKKyAqIEBwcmlvcml0eSA1MDAKKyAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDb250cm9sbGVyIE5hbWUgb2YgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggdGhlIGN1cnJlbnQKKyAqIHtAbGluayBuZy4kY29udHJvbGxlclByb3ZpZGVyICRjb250cm9sbGVyUHJvdmlkZXJ9IG9yIGFuIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259CisgKiB0aGF0IG9uIHRoZSBjdXJyZW50IHNjb3BlIGV2YWx1YXRlcyB0byBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorICoKKyAqIFRoZSBjb250cm9sbGVyIGluc3RhbmNlIGNhbiBiZSBwdWJsaXNoZWQgaW50byBhIHNjb3BlIHByb3BlcnR5IGJ5IHNwZWNpZnlpbmcKKyAqIGBuZy1jb250cm9sbGVyPSJhcyBwcm9wZXJ0eU5hbWUiYC4KKyAqCisgKiBJZiB0aGUgY3VycmVudCBgJGNvbnRyb2xsZXJQcm92aWRlcmAgaXMgY29uZmlndXJlZCB0byB1c2UgZ2xvYmFscyAodmlhCisgKiB7QGxpbmsgbmcuJGNvbnRyb2xsZXJQcm92aWRlciNhbGxvd0dsb2JhbHMgYCRjb250cm9sbGVyUHJvdmlkZXIuYWxsb3dHbG9iYWxzKClgIH0pLCB0aGlzIG1heQorICogYWxzbyBiZSB0aGUgbmFtZSBvZiBhIGdsb2JhbGx5IGFjY2Vzc2libGUgY29uc3RydWN0b3IgZnVuY3Rpb24gKG5vdCByZWNvbW1lbmRlZCkuCisgKgorICogQGV4YW1wbGUKKyAqIEhlcmUgaXMgYSBzaW1wbGUgZm9ybSBmb3IgZWRpdGluZyB1c2VyIGNvbnRhY3QgaW5mb3JtYXRpb24uIEFkZGluZywgcmVtb3ZpbmcsIGNsZWFyaW5nLCBhbmQKKyAqIGdyZWV0aW5nIGFyZSBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZSBjb250cm9sbGVyIChzZWUgc291cmNlIHRhYikuIFRoZXNlIG1ldGhvZHMgY2FuCisgKiBlYXNpbHkgYmUgY2FsbGVkIGZyb20gdGhlIGFuZ3VsYXIgbWFya3VwLiBBbnkgY2hhbmdlcyB0byB0aGUgZGF0YSBhcmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQKKyAqIGluIHRoZSBWaWV3IHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgbWFudWFsIHVwZGF0ZS4KKyAqCisgKiBUd28gZGlmZmVyZW50IGRlY2xhcmF0aW9uIHN0eWxlcyBhcmUgaW5jbHVkZWQgYmVsb3c6CisgKgorICogKiBvbmUgYmluZHMgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBkaXJlY3RseSBvbnRvIHRoZSBjb250cm9sbGVyIHVzaW5nIGB0aGlzYDoKKyAqIGBuZy1jb250cm9sbGVyPSJTZXR0aW5nc0NvbnRyb2xsZXIxIGFzIHNldHRpbmdzImAKKyAqICogb25lIGluamVjdHMgYCRzY29wZWAgaW50byB0aGUgY29udHJvbGxlcjoKKyAqIGBuZy1jb250cm9sbGVyPSJTZXR0aW5nc0NvbnRyb2xsZXIyImAKKyAqCisgKiBUaGUgc2Vjb25kIG9wdGlvbiBpcyBtb3JlIGNvbW1vbiBpbiB0aGUgQW5ndWxhciBjb21tdW5pdHksIGFuZCBpcyBnZW5lcmFsbHkgdXNlZCBpbiBib2lsZXJwbGF0ZXMKKyAqIGFuZCBpbiB0aGlzIGd1aWRlLiBIb3dldmVyLCB0aGVyZSBhcmUgYWR2YW50YWdlcyB0byBiaW5kaW5nIHByb3BlcnRpZXMgZGlyZWN0bHkgdG8gdGhlIGNvbnRyb2xsZXIKKyAqIGFuZCBhdm9pZGluZyBzY29wZS4KKyAqCisgKiAqIFVzaW5nIGBjb250cm9sbGVyIGFzYCBtYWtlcyBpdCBvYnZpb3VzIHdoaWNoIGNvbnRyb2xsZXIgeW91IGFyZSBhY2Nlc3NpbmcgaW4gdGhlIHRlbXBsYXRlIHdoZW4KKyAqIG11bHRpcGxlIGNvbnRyb2xsZXJzIGFwcGx5IHRvIGFuIGVsZW1lbnQuCisgKiAqIElmIHlvdSBhcmUgd3JpdGluZyB5b3VyIGNvbnRyb2xsZXJzIGFzIGNsYXNzZXMgeW91IGhhdmUgZWFzaWVyIGFjY2VzcyB0byB0aGUgcHJvcGVydGllcyBhbmQKKyAqIG1ldGhvZHMsIHdoaWNoIHdpbGwgYXBwZWFyIG9uIHRoZSBzY29wZSwgZnJvbSBpbnNpZGUgdGhlIGNvbnRyb2xsZXIgY29kZS4KKyAqICogU2luY2UgdGhlcmUgaXMgYWx3YXlzIGEgYC5gIGluIHRoZSBiaW5kaW5ncywgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgcHJvdG90eXBhbAorICogaW5oZXJpdGFuY2UgbWFza2luZyBwcmltaXRpdmVzLgorICoKKyAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIGBjb250cm9sbGVyIGFzYCBzeW50YXguCisgKgorICogPGV4YW1wbGUgbmFtZT0ibmdDb250cm9sbGVyQXMiIG1vZHVsZT0iY29udHJvbGxlckFzRXhhbXBsZSI+CisgKiAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICogICAgPGRpdiBpZD0iY3RybC1hcy1leG1wbCIgbmctY29udHJvbGxlcj0iU2V0dGluZ3NDb250cm9sbGVyMSBhcyBzZXR0aW5ncyI+CisgKiAgICAgIE5hbWU6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic2V0dGluZ3MubmFtZSIvPgorICogICAgICBbIDxhIGhyZWY9IiIgbmctY2xpY2s9InNldHRpbmdzLmdyZWV0KCkiPmdyZWV0PC9hPiBdPGJyLz4KKyAqICAgICAgQ29udGFjdDoKKyAqICAgICAgPHVsPgorICogICAgICAgIDxsaSBuZy1yZXBlYXQ9ImNvbnRhY3QgaW4gc2V0dGluZ3MuY29udGFjdHMiPgorICogICAgICAgICAgPHNlbGVjdCBuZy1tb2RlbD0iY29udGFjdC50eXBlIj4KKyAqICAgICAgICAgICAgIDxvcHRpb24+cGhvbmU8L29wdGlvbj4KKyAqICAgICAgICAgICAgIDxvcHRpb24+ZW1haWw8L29wdGlvbj4KKyAqICAgICAgICAgIDwvc2VsZWN0PgorICogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJjb250YWN0LnZhbHVlIi8+CisgKiAgICAgICAgICBbIDxhIGhyZWY9IiIgbmctY2xpY2s9InNldHRpbmdzLmNsZWFyQ29udGFjdChjb250YWN0KSI+Y2xlYXI8L2E+CisgKiAgICAgICAgICB8IDxhIGhyZWY9IiIgbmctY2xpY2s9InNldHRpbmdzLnJlbW92ZUNvbnRhY3QoY29udGFjdCkiPlg8L2E+IF0KKyAqICAgICAgICA8L2xpPgorICogICAgICAgIDxsaT5bIDxhIGhyZWY9IiIgbmctY2xpY2s9InNldHRpbmdzLmFkZENvbnRhY3QoKSI+YWRkPC9hPiBdPC9saT4KKyAqICAgICA8L3VsPgorICogICAgPC9kaXY+CisgKiAgIDwvZmlsZT4KKyAqICAgPGZpbGUgbmFtZT0iYXBwLmpzIj4KKyAqICAgIGFuZ3VsYXIubW9kdWxlKCdjb250cm9sbGVyQXNFeGFtcGxlJywgW10pCisgKiAgICAgIC5jb250cm9sbGVyKCdTZXR0aW5nc0NvbnRyb2xsZXIxJywgU2V0dGluZ3NDb250cm9sbGVyMSk7CisgKgorICogICAgZnVuY3Rpb24gU2V0dGluZ3NDb250cm9sbGVyMSgpIHsKKyAqICAgICAgdGhpcy5uYW1lID0gIkpvaG4gU21pdGgiOworICogICAgICB0aGlzLmNvbnRhY3RzID0gWworICogICAgICAgIHt0eXBlOiAncGhvbmUnLCB2YWx1ZTogJzQwOCA1NTUgMTIxMid9LAorICogICAgICAgIHt0eXBlOiAnZW1haWwnLCB2YWx1ZTogJ2pvaG4uc21pdGhAZXhhbXBsZS5vcmcnfSBdOworICogICAgfQorICoKKyAqICAgIFNldHRpbmdzQ29udHJvbGxlcjEucHJvdG90eXBlLmdyZWV0ID0gZnVuY3Rpb24oKSB7CisgKiAgICAgIGFsZXJ0KHRoaXMubmFtZSk7CisgKiAgICB9OworICoKKyAqICAgIFNldHRpbmdzQ29udHJvbGxlcjEucHJvdG90eXBlLmFkZENvbnRhY3QgPSBmdW5jdGlvbigpIHsKKyAqICAgICAgdGhpcy5jb250YWN0cy5wdXNoKHt0eXBlOiAnZW1haWwnLCB2YWx1ZTogJ3lvdXJuYW1lQGV4YW1wbGUub3JnJ30pOworICogICAgfTsKKyAqCisgKiAgICBTZXR0aW5nc0NvbnRyb2xsZXIxLnByb3RvdHlwZS5yZW1vdmVDb250YWN0ID0gZnVuY3Rpb24oY29udGFjdFRvUmVtb3ZlKSB7CisgKiAgICAgdmFyIGluZGV4ID0gdGhpcy5jb250YWN0cy5pbmRleE9mKGNvbnRhY3RUb1JlbW92ZSk7CisgKiAgICAgIHRoaXMuY29udGFjdHMuc3BsaWNlKGluZGV4LCAxKTsKKyAqICAgIH07CisgKgorICogICAgU2V0dGluZ3NDb250cm9sbGVyMS5wcm90b3R5cGUuY2xlYXJDb250YWN0ID0gZnVuY3Rpb24oY29udGFjdCkgeworICogICAgICBjb250YWN0LnR5cGUgPSAncGhvbmUnOworICogICAgICBjb250YWN0LnZhbHVlID0gJyc7CisgKiAgICB9OworICogICA8L2ZpbGU+CisgKiAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICogICAgIGl0KCdzaG91bGQgY2hlY2sgY29udHJvbGxlciBhcycsIGZ1bmN0aW9uKCkgeworICogICAgICAgdmFyIGNvbnRhaW5lciA9IGVsZW1lbnQoYnkuaWQoJ2N0cmwtYXMtZXhtcGwnKSk7CisgKiAgICAgICAgIGV4cGVjdChjb250YWluZXIuZWxlbWVudChieS5tb2RlbCgnc2V0dGluZ3MubmFtZScpKQorICogICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvQmUoJ0pvaG4gU21pdGgnKTsKKyAqCisgKiAgICAgICB2YXIgZmlyc3RSZXBlYXQgPQorICogICAgICAgICAgIGNvbnRhaW5lci5lbGVtZW50KGJ5LnJlcGVhdGVyKCdjb250YWN0IGluIHNldHRpbmdzLmNvbnRhY3RzJykucm93KDApKTsKKyAqICAgICAgIHZhciBzZWNvbmRSZXBlYXQgPQorICogICAgICAgICAgIGNvbnRhaW5lci5lbGVtZW50KGJ5LnJlcGVhdGVyKCdjb250YWN0IGluIHNldHRpbmdzLmNvbnRhY3RzJykucm93KDEpKTsKKyAqCisgKiAgICAgICBleHBlY3QoZmlyc3RSZXBlYXQuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpCisgKiAgICAgICAgICAgLnRvQmUoJzQwOCA1NTUgMTIxMicpOworICoKKyAqICAgICAgIGV4cGVjdChzZWNvbmRSZXBlYXQuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpCisgKiAgICAgICAgICAgLnRvQmUoJ2pvaG4uc21pdGhAZXhhbXBsZS5vcmcnKTsKKyAqCisgKiAgICAgICBmaXJzdFJlcGVhdC5lbGVtZW50KGJ5LmxpbmtUZXh0KCdjbGVhcicpKS5jbGljaygpOworICoKKyAqICAgICAgIGV4cGVjdChmaXJzdFJlcGVhdC5lbGVtZW50KGJ5Lm1vZGVsKCdjb250YWN0LnZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkKKyAqICAgICAgICAgICAudG9CZSgnJyk7CisgKgorICogICAgICAgY29udGFpbmVyLmVsZW1lbnQoYnkubGlua1RleHQoJ2FkZCcpKS5jbGljaygpOworICoKKyAqICAgICAgIGV4cGVjdChjb250YWluZXIuZWxlbWVudChieS5yZXBlYXRlcignY29udGFjdCBpbiBzZXR0aW5ncy5jb250YWN0cycpLnJvdygyKSkKKyAqICAgICAgICAgICAuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKQorICogICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpCisgKiAgICAgICAgICAgLnRvQmUoJ3lvdXJuYW1lQGV4YW1wbGUub3JnJyk7CisgKiAgICAgfSk7CisgKiAgIDwvZmlsZT4KKyAqIDwvZXhhbXBsZT4KKyAqCisgKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSAiYXR0YWNoIHRvIGAkc2NvcGVgIiBzdHlsZSBvZiBjb250cm9sbGVyLgorICoKKyAqIDxleGFtcGxlIG5hbWU9Im5nQ29udHJvbGxlciIgbW9kdWxlPSJjb250cm9sbGVyRXhhbXBsZSI+CisgKiAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgKiAgIDxkaXYgaWQ9ImN0cmwtZXhtcGwiIG5nLWNvbnRyb2xsZXI9IlNldHRpbmdzQ29udHJvbGxlcjIiPgorICogICAgIE5hbWU6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ibmFtZSIvPgorICogICAgIFsgPGEgaHJlZj0iIiBuZy1jbGljaz0iZ3JlZXQoKSI+Z3JlZXQ8L2E+IF08YnIvPgorICogICAgIENvbnRhY3Q6CisgKiAgICAgPHVsPgorICogICAgICAgPGxpIG5nLXJlcGVhdD0iY29udGFjdCBpbiBjb250YWN0cyI+CisgKiAgICAgICAgIDxzZWxlY3QgbmctbW9kZWw9ImNvbnRhY3QudHlwZSI+CisgKiAgICAgICAgICAgIDxvcHRpb24+cGhvbmU8L29wdGlvbj4KKyAqICAgICAgICAgICAgPG9wdGlvbj5lbWFpbDwvb3B0aW9uPgorICogICAgICAgICA8L3NlbGVjdD4KKyAqICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJjb250YWN0LnZhbHVlIi8+CisgKiAgICAgICAgIFsgPGEgaHJlZj0iIiBuZy1jbGljaz0iY2xlYXJDb250YWN0KGNvbnRhY3QpIj5jbGVhcjwvYT4KKyAqICAgICAgICAgfCA8YSBocmVmPSIiIG5nLWNsaWNrPSJyZW1vdmVDb250YWN0KGNvbnRhY3QpIj5YPC9hPiBdCisgKiAgICAgICA8L2xpPgorICogICAgICAgPGxpPlsgPGEgaHJlZj0iIiBuZy1jbGljaz0iYWRkQ29udGFjdCgpIj5hZGQ8L2E+IF08L2xpPgorICogICAgPC91bD4KKyAqICAgPC9kaXY+CisgKiAgPC9maWxlPgorICogIDxmaWxlIG5hbWU9ImFwcC5qcyI+CisgKiAgIGFuZ3VsYXIubW9kdWxlKCdjb250cm9sbGVyRXhhbXBsZScsIFtdKQorICogICAgIC5jb250cm9sbGVyKCdTZXR0aW5nc0NvbnRyb2xsZXIyJywgWyckc2NvcGUnLCBTZXR0aW5nc0NvbnRyb2xsZXIyXSk7CisgKgorICogICBmdW5jdGlvbiBTZXR0aW5nc0NvbnRyb2xsZXIyKCRzY29wZSkgeworICogICAgICRzY29wZS5uYW1lID0gIkpvaG4gU21pdGgiOworICogICAgICRzY29wZS5jb250YWN0cyA9IFsKKyAqICAgICAgIHt0eXBlOidwaG9uZScsIHZhbHVlOic0MDggNTU1IDEyMTInfSwKKyAqICAgICAgIHt0eXBlOidlbWFpbCcsIHZhbHVlOidqb2huLnNtaXRoQGV4YW1wbGUub3JnJ30gXTsKKyAqCisgKiAgICAgJHNjb3BlLmdyZWV0ID0gZnVuY3Rpb24oKSB7CisgKiAgICAgICBhbGVydCgkc2NvcGUubmFtZSk7CisgKiAgICAgfTsKKyAqCisgKiAgICAgJHNjb3BlLmFkZENvbnRhY3QgPSBmdW5jdGlvbigpIHsKKyAqICAgICAgICRzY29wZS5jb250YWN0cy5wdXNoKHt0eXBlOidlbWFpbCcsIHZhbHVlOid5b3VybmFtZUBleGFtcGxlLm9yZyd9KTsKKyAqICAgICB9OworICoKKyAqICAgICAkc2NvcGUucmVtb3ZlQ29udGFjdCA9IGZ1bmN0aW9uKGNvbnRhY3RUb1JlbW92ZSkgeworICogICAgICAgdmFyIGluZGV4ID0gJHNjb3BlLmNvbnRhY3RzLmluZGV4T2YoY29udGFjdFRvUmVtb3ZlKTsKKyAqICAgICAgICRzY29wZS5jb250YWN0cy5zcGxpY2UoaW5kZXgsIDEpOworICogICAgIH07CisgKgorICogICAgICRzY29wZS5jbGVhckNvbnRhY3QgPSBmdW5jdGlvbihjb250YWN0KSB7CisgKiAgICAgICBjb250YWN0LnR5cGUgPSAncGhvbmUnOworICogICAgICAgY29udGFjdC52YWx1ZSA9ICcnOworICogICAgIH07CisgKiAgIH0KKyAqICA8L2ZpbGU+CisgKiAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgKiAgICBpdCgnc2hvdWxkIGNoZWNrIGNvbnRyb2xsZXInLCBmdW5jdGlvbigpIHsKKyAqICAgICAgdmFyIGNvbnRhaW5lciA9IGVsZW1lbnQoYnkuaWQoJ2N0cmwtZXhtcGwnKSk7CisgKgorICogICAgICBleHBlY3QoY29udGFpbmVyLmVsZW1lbnQoYnkubW9kZWwoJ25hbWUnKSkKKyAqICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvQmUoJ0pvaG4gU21pdGgnKTsKKyAqCisgKiAgICAgIHZhciBmaXJzdFJlcGVhdCA9CisgKiAgICAgICAgICBjb250YWluZXIuZWxlbWVudChieS5yZXBlYXRlcignY29udGFjdCBpbiBjb250YWN0cycpLnJvdygwKSk7CisgKiAgICAgIHZhciBzZWNvbmRSZXBlYXQgPQorICogICAgICAgICAgY29udGFpbmVyLmVsZW1lbnQoYnkucmVwZWF0ZXIoJ2NvbnRhY3QgaW4gY29udGFjdHMnKS5yb3coMSkpOworICoKKyAqICAgICAgZXhwZWN0KGZpcnN0UmVwZWF0LmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKQorICogICAgICAgICAgLnRvQmUoJzQwOCA1NTUgMTIxMicpOworICogICAgICBleHBlY3Qoc2Vjb25kUmVwZWF0LmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKQorICogICAgICAgICAgLnRvQmUoJ2pvaG4uc21pdGhAZXhhbXBsZS5vcmcnKTsKKyAqCisgKiAgICAgIGZpcnN0UmVwZWF0LmVsZW1lbnQoYnkubGlua1RleHQoJ2NsZWFyJykpLmNsaWNrKCk7CisgKgorICogICAgICBleHBlY3QoZmlyc3RSZXBlYXQuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpCisgKiAgICAgICAgICAudG9CZSgnJyk7CisgKgorICogICAgICBjb250YWluZXIuZWxlbWVudChieS5saW5rVGV4dCgnYWRkJykpLmNsaWNrKCk7CisgKgorICogICAgICBleHBlY3QoY29udGFpbmVyLmVsZW1lbnQoYnkucmVwZWF0ZXIoJ2NvbnRhY3QgaW4gY29udGFjdHMnKS5yb3coMikpCisgKiAgICAgICAgICAuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKQorICogICAgICAgICAgLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkKKyAqICAgICAgICAgIC50b0JlKCd5b3VybmFtZUBleGFtcGxlLm9yZycpOworICogICAgfSk7CisgKiAgPC9maWxlPgorICo8L2V4YW1wbGU+CisKKyAqLwordmFyIG5nQ29udHJvbGxlckRpcmVjdGl2ZSA9IFtmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHsKKyAgICByZXN0cmljdDogJ0EnLAorICAgIHNjb3BlOiB0cnVlLAorICAgIGNvbnRyb2xsZXI6ICdAJywKKyAgICBwcmlvcml0eTogNTAwCisgIH07Cit9XTsKKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ0NzcAorICoKKyAqIEBlbGVtZW50IGh0bWwKKyAqIEBkZXNjcmlwdGlvbgorICogRW5hYmxlcyBbQ1NQIChDb250ZW50IFNlY3VyaXR5IFBvbGljeSldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL1NlY3VyaXR5L0NTUCkgc3VwcG9ydC4KKyAqCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuIGRldmVsb3BpbmcgdGhpbmdzIGxpa2UgR29vZ2xlIENocm9tZSBFeHRlbnNpb25zIG9yIFVuaXZlcnNhbCBXaW5kb3dzIEFwcHMuCisgKgorICogQ1NQIGZvcmJpZHMgYXBwcyB0byB1c2UgYGV2YWxgIG9yIGBGdW5jdGlvbihzdHJpbmcpYCBnZW5lcmF0ZWQgZnVuY3Rpb25zIChhbW9uZyBvdGhlciB0aGluZ3MpLgorICogRm9yIEFuZ3VsYXIgdG8gYmUgQ1NQIGNvbXBhdGlibGUgdGhlcmUgYXJlIG9ubHkgdHdvIHRoaW5ncyB0aGF0IHdlIG5lZWQgdG8gZG8gZGlmZmVyZW50bHk6CisgKgorICogLSBkb24ndCB1c2UgYEZ1bmN0aW9uYCBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBvcHRpbWl6ZWQgdmFsdWUgZ2V0dGVycworICogLSBkb24ndCBpbmplY3QgY3VzdG9tIHN0eWxlc2hlZXQgaW50byB0aGUgZG9jdW1lbnQKKyAqCisgKiBBbmd1bGFySlMgdXNlcyBgRnVuY3Rpb24oc3RyaW5nKWAgZ2VuZXJhdGVkIGZ1bmN0aW9ucyBhcyBhIHNwZWVkIG9wdGltaXphdGlvbi4gQXBwbHlpbmcgdGhlIGBuZ0NzcGAKKyAqIGRpcmVjdGl2ZSB3aWxsIGNhdXNlIEFuZ3VsYXIgdG8gdXNlIENTUCBjb21wYXRpYmlsaXR5IG1vZGUuIFdoZW4gdGhpcyBtb2RlIGlzIG9uIEFuZ3VsYXJKUyB3aWxsCisgKiBldmFsdWF0ZSBhbGwgZXhwcmVzc2lvbnMgdXAgdG8gMzAlIHNsb3dlciB0aGFuIGluIG5vbi1DU1AgbW9kZSwgYnV0IG5vIHNlY3VyaXR5IHZpb2xhdGlvbnMgd2lsbAorICogYmUgcmFpc2VkLgorICoKKyAqIENTUCBmb3JiaWRzIEphdmFTY3JpcHQgdG8gaW5saW5lIHN0eWxlc2hlZXQgcnVsZXMuIEluIG5vbiBDU1AgbW9kZSBBbmd1bGFyIGF1dG9tYXRpY2FsbHkKKyAqIGluY2x1ZGVzIHNvbWUgQ1NTIHJ1bGVzIChlLmcuIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDbG9hayBuZ0Nsb2FrfSkuCisgKiBUbyBtYWtlIHRob3NlIGRpcmVjdGl2ZXMgd29yayBpbiBDU1AgbW9kZSwgaW5jbHVkZSB0aGUgYGFuZ3VsYXItY3NwLmNzc2AgbWFudWFsbHkuCisgKgorICogQW5ndWxhciB0cmllcyB0byBhdXRvZGV0ZWN0IGlmIENTUCBpcyBhY3RpdmUgYW5kIGF1dG9tYXRpY2FsbHkgdHVybiBvbiB0aGUgQ1NQLXNhZmUgbW9kZS4gVGhpcworICogYXV0b2RldGVjdGlvbiBob3dldmVyIHRyaWdnZXJzIGEgQ1NQIGVycm9yIHRvIGJlIGxvZ2dlZCBpbiB0aGUgY29uc29sZToKKyAqCisgKiBgYGAKKyAqIFJlZnVzZWQgdG8gZXZhbHVhdGUgYSBzdHJpbmcgYXMgSmF2YVNjcmlwdCBiZWNhdXNlICd1bnNhZmUtZXZhbCcgaXMgbm90IGFuIGFsbG93ZWQgc291cmNlIG9mCisgKiBzY3JpcHQgaW4gdGhlIGZvbGxvd2luZyBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBkaXJlY3RpdmU6ICJkZWZhdWx0LXNyYyAnc2VsZiciLiBOb3RlIHRoYXQKKyAqICdzY3JpcHQtc3JjJyB3YXMgbm90IGV4cGxpY2l0bHkgc2V0LCBzbyAnZGVmYXVsdC1zcmMnIGlzIHVzZWQgYXMgYSBmYWxsYmFjay4KKyAqIGBgYAorICoKKyAqIFRoaXMgZXJyb3IgaXMgaGFybWxlc3MgYnV0IGFubm95aW5nLiBUbyBwcmV2ZW50IHRoZSBlcnJvciBmcm9tIHNob3dpbmcgdXAsIHB1dCB0aGUgYG5nQ3NwYAorICogZGlyZWN0aXZlIG9uIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGFwcGxpY2F0aW9uIG9yIG9uIHRoZSBgYW5ndWxhci5qc2Agc2NyaXB0IHRhZywgd2hpY2hldmVyCisgKiBhcHBlYXJzIGZpcnN0IGluIHRoZSBodG1sIGRvY3VtZW50LgorICoKKyAqICpOb3RlOiBUaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgYG5nLWNzcGAgYW5kIGBkYXRhLW5nLWNzcGAgYXR0cmlidXRlIGZvcm0uKgorICoKKyAqIEBleGFtcGxlCisgKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFwcGx5IHRoZSBgbmdDc3BgIGRpcmVjdGl2ZSB0byB0aGUgYGh0bWxgIHRhZy4KKyAgIGBgYGh0bWwKKyAgICAgPCFkb2N0eXBlIGh0bWw+CisgICAgIDxodG1sIG5nLWFwcCBuZy1jc3A+CisgICAgIC4uLgorICAgICAuLi4KKyAgICAgPC9odG1sPgorICAgYGBgCisgICogQGV4YW1wbGUKKyAgICAgIC8vIE5vdGU6IHRoZSBzdWZmaXggYC5jc3BgIGluIHRoZSBleGFtcGxlIG5hbWUgdHJpZ2dlcnMKKyAgICAgIC8vIGNzcCBtb2RlIGluIG91ciBodHRwIHNlcnZlciEKKyAgICAgIDxleGFtcGxlIG5hbWU9ImV4YW1wbGUuY3NwIiBtb2R1bGU9ImNzcEV4YW1wbGUiIG5nLWNzcD0idHJ1ZSI+CisgICAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iTWFpbkNvbnRyb2xsZXIgYXMgY3RybCI+CisgICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPSJjdHJsLmluYygpIiBpZD0iaW5jIj5JbmNyZW1lbnQ8L2J1dHRvbj4KKyAgICAgICAgICAgICAgPHNwYW4gaWQ9ImNvdW50ZXIiPgorICAgICAgICAgICAgICAgIHt7Y3RybC5jb3VudGVyfX0KKyAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9ImN0cmwuZXZpbCgpIiBpZD0iZXZpbCI+RXZpbDwvYnV0dG9uPgorICAgICAgICAgICAgICA8c3BhbiBpZD0iZXZpbEVycm9yIj4KKyAgICAgICAgICAgICAgICB7e2N0cmwuZXZpbEVycm9yfX0KKyAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZmlsZT4KKyAgICAgICAgPGZpbGUgbmFtZT0ic2NyaXB0LmpzIj4KKyAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2NzcEV4YW1wbGUnLCBbXSkKKyAgICAgICAgICAgICAuY29udHJvbGxlcignTWFpbkNvbnRyb2xsZXInLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgIHRoaXMuaW5jID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHRoaXMuZXZpbCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgLy8ganNoaW50IGV2aWw6dHJ1ZQorICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZXZhbCgnMSsyJyk7CisgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZpbEVycm9yID0gZS5tZXNzYWdlOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0pOworICAgICAgICA8L2ZpbGU+CisgICAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgICAgIHZhciB1dGlsLCB3ZWJkcml2ZXI7CisKKyAgICAgICAgICB2YXIgaW5jQnRuID0gZWxlbWVudChieS5pZCgnaW5jJykpOworICAgICAgICAgIHZhciBjb3VudGVyID0gZWxlbWVudChieS5pZCgnY291bnRlcicpKTsKKyAgICAgICAgICB2YXIgZXZpbEJ0biA9IGVsZW1lbnQoYnkuaWQoJ2V2aWwnKSk7CisgICAgICAgICAgdmFyIGV2aWxFcnJvciA9IGVsZW1lbnQoYnkuaWQoJ2V2aWxFcnJvcicpKTsKKworICAgICAgICAgIGZ1bmN0aW9uIGdldEFuZENsZWFyU2V2ZXJlRXJyb3JzKCkgeworICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIubWFuYWdlKCkubG9ncygpLmdldCgnYnJvd3NlcicpLnRoZW4oZnVuY3Rpb24oYnJvd3NlckxvZykgeworICAgICAgICAgICAgICByZXR1cm4gYnJvd3NlckxvZy5maWx0ZXIoZnVuY3Rpb24obG9nRW50cnkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9nRW50cnkubGV2ZWwudmFsdWUgPiB3ZWJkcml2ZXIubG9nZ2luZy5MZXZlbC5XQVJOSU5HLnZhbHVlOworICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKworICAgICAgICAgIGZ1bmN0aW9uIGNsZWFyRXJyb3JzKCkgeworICAgICAgICAgICAgZ2V0QW5kQ2xlYXJTZXZlcmVFcnJvcnMoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmdW5jdGlvbiBleHBlY3ROb0Vycm9ycygpIHsKKyAgICAgICAgICAgIGdldEFuZENsZWFyU2V2ZXJlRXJyb3JzKCkudGhlbihmdW5jdGlvbihmaWx0ZXJlZExvZykgeworICAgICAgICAgICAgICBleHBlY3QoZmlsdGVyZWRMb2cubGVuZ3RoKS50b0VxdWFsKDApOworICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRMb2cubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Jyb3dzZXIgY29uc29sZSBlcnJvcnM6ICcgKyB1dGlsLmluc3BlY3QoZmlsdGVyZWRMb2cpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZnVuY3Rpb24gZXhwZWN0RXJyb3IocmVnZXgpIHsKKyAgICAgICAgICAgIGdldEFuZENsZWFyU2V2ZXJlRXJyb3JzKCkudGhlbihmdW5jdGlvbihmaWx0ZXJlZExvZykgeworICAgICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgZmlsdGVyZWRMb2cuZm9yRWFjaChmdW5jdGlvbihsb2cpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLm1lc3NhZ2UubWF0Y2gocmVnZXgpKSB7CisgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgYW4gZXJyb3IgdGhhdCBtYXRjaGVzICcgKyByZWdleCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKworICAgICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB1dGlsID0gcmVxdWlyZSgndXRpbCcpOworICAgICAgICAgICAgd2ViZHJpdmVyID0gcmVxdWlyZSgncHJvdHJhY3Rvci9ub2RlX21vZHVsZXMvc2VsZW5pdW0td2ViZHJpdmVyJyk7CisgICAgICAgICAgfSk7CisKKyAgICAgICAgICAvLyBGb3Igbm93LCB3ZSBvbmx5IHRlc3Qgb24gQ2hyb21lLAorICAgICAgICAgIC8vIGFzIFNhZmFyaSBkb2VzIG5vdCBsb2FkIHRoZSBwYWdlIHdpdGggUHJvdHJhY3RvcidzIGluamVjdGVkIHNjcmlwdHMsCisgICAgICAgICAgLy8gYW5kIEZpcmVmb3ggd2ViZHJpdmVyIGFsd2F5cyBkaXNhYmxlcyBjb250ZW50IHNlY3VyaXR5IHBvbGljeSAoIzYzNTgpCisgICAgICAgICAgaWYgKGJyb3dzZXIucGFyYW1zLmJyb3dzZXIgIT09ICdjaHJvbWUnKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgaXQoJ3Nob3VsZCBub3QgcmVwb3J0IGVycm9ycyB3aGVuIHRoZSBwYWdlIGlzIGxvYWRlZCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgLy8gY2xlYXIgZXJyb3JzIHNvIHdlIGFyZSBub3QgZGVwZW5kZW50IG9uIHByZXZpb3VzIHRlc3RzCisgICAgICAgICAgICBjbGVhckVycm9ycygpOworICAgICAgICAgICAgLy8gTmVlZCB0byByZWxvYWQgdGhlIHBhZ2UgYXMgdGhlIHBhZ2UgaXMgYWxyZWFkeSBsb2FkZWQgd2hlbgorICAgICAgICAgICAgLy8gd2UgY29tZSBoZXJlCisgICAgICAgICAgICBicm93c2VyLmRyaXZlci5nZXRDdXJyZW50VXJsKCkudGhlbihmdW5jdGlvbih1cmwpIHsKKyAgICAgICAgICAgICAgYnJvd3Nlci5nZXQodXJsKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZXhwZWN0Tm9FcnJvcnMoKTsKKyAgICAgICAgICB9KTsKKworICAgICAgICAgIGl0KCdzaG91bGQgZXZhbHVhdGUgZXhwcmVzc2lvbnMnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGV4cGVjdChjb3VudGVyLmdldFRleHQoKSkudG9FcXVhbCgnMCcpOworICAgICAgICAgICAgaW5jQnRuLmNsaWNrKCk7CisgICAgICAgICAgICBleHBlY3QoY291bnRlci5nZXRUZXh0KCkpLnRvRXF1YWwoJzEnKTsKKyAgICAgICAgICAgIGV4cGVjdE5vRXJyb3JzKCk7CisgICAgICAgICAgfSk7CisKKyAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IGFuZCByZXBvcnQgYW4gZXJyb3Igd2hlbiB1c2luZyAiZXZhbCInLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGV2aWxCdG4uY2xpY2soKTsKKyAgICAgICAgICAgIGV4cGVjdChldmlsRXJyb3IuZ2V0VGV4dCgpKS50b01hdGNoKC9Db250ZW50IFNlY3VyaXR5IFBvbGljeS8pOworICAgICAgICAgICAgZXhwZWN0RXJyb3IoL0NvbnRlbnQgU2VjdXJpdHkgUG9saWN5Lyk7CisgICAgICAgICAgfSk7CisgICAgICAgIDwvZmlsZT4KKyAgICAgIDwvZXhhbXBsZT4KKyAgKi8KKworLy8gbmdDc3AgaXMgbm90IGltcGxlbWVudGVkIGFzIGEgcHJvcGVyIGRpcmVjdGl2ZSBhbnkgbW9yZSwgYmVjYXVzZSB3ZSBuZWVkIGl0IGJlIHByb2Nlc3NlZCB3aGlsZSB3ZQorLy8gYm9vdHN0cmFwIHRoZSBzeXN0ZW0gKGJlZm9yZSAkcGFyc2UgaXMgaW5zdGFudGlhdGVkKSwgZm9yIHRoaXMgcmVhc29uIHdlIGp1c3QgaGF2ZQorLy8gdGhlIGNzcC5pc0FjdGl2ZSgpIGZuIHRoYXQgbG9va3MgZm9yIG5nLWNzcCBhdHRyaWJ1dGUgYW55d2hlcmUgaW4gdGhlIGN1cnJlbnQgZG9jCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdDbGljaworICoKKyAqIEBkZXNjcmlwdGlvbgorICogVGhlIG5nQ2xpY2sgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igd2hlbgorICogYW4gZWxlbWVudCBpcyBjbGlja2VkLgorICoKKyAqIEBlbGVtZW50IEFOWQorICogQHByaW9yaXR5IDAKKyAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDbGljayB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCisgKiBjbGljay4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pCisgKgorICogQGV4YW1wbGUKKyAgIDxleGFtcGxlPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgIDxidXR0b24gbmctY2xpY2s9ImNvdW50ID0gY291bnQgKyAxIiBuZy1pbml0PSJjb3VudD0wIj4KKyAgICAgICAgSW5jcmVtZW50CisgICAgICA8L2J1dHRvbj4KKyAgICAgIDxzcGFuPgorICAgICAgICBjb3VudDoge3tjb3VudH19CisgICAgICA8L3NwYW4+CisgICAgIDwvZmlsZT4KKyAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1jbGljaycsIGZ1bmN0aW9uKCkgeworICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnY291bnQnKSkuZ2V0VGV4dCgpKS50b01hdGNoKCcwJyk7CisgICAgICAgICBlbGVtZW50KGJ5LmNzcygnYnV0dG9uJykpLmNsaWNrKCk7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdjb3VudCcpKS5nZXRUZXh0KCkpLnRvTWF0Y2goJzEnKTsKKyAgICAgICB9KTsKKyAgICAgPC9maWxlPgorICAgPC9leGFtcGxlPgorICovCisvKgorICogQSBjb2xsZWN0aW9uIG9mIGRpcmVjdGl2ZXMgdGhhdCBhbGxvd3MgY3JlYXRpb24gb2YgY3VzdG9tIGV2ZW50IGhhbmRsZXJzIHRoYXQgYXJlIGRlZmluZWQgYXMKKyAqIGFuZ3VsYXIgZXhwcmVzc2lvbnMgYW5kIGFyZSBjb21waWxlZCBhbmQgZXhlY3V0ZWQgd2l0aGluIHRoZSBjdXJyZW50IHNjb3BlLgorICovCit2YXIgbmdFdmVudERpcmVjdGl2ZXMgPSB7fTsKKworLy8gRm9yIGV2ZW50cyB0aGF0IG1pZ2h0IGZpcmUgc3luY2hyb25vdXNseSBkdXJpbmcgRE9NIG1hbmlwdWxhdGlvbgorLy8gd2UgbmVlZCB0byBleGVjdXRlIHRoZWlyIGV2ZW50IGhhbmRsZXJzIGFzeW5jaHJvbm91c2x5IHVzaW5nICRldmFsQXN5bmMsCisvLyBzbyB0aGF0IHRoZXkgYXJlIG5vdCBleGVjdXRlZCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuCit2YXIgZm9yY2VBc3luY0V2ZW50cyA9IHsKKyAgJ2JsdXInOiB0cnVlLAorICAnZm9jdXMnOiB0cnVlCit9OworZm9yRWFjaCgKKyAgJ2NsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZW1vdmUgbW91c2VlbnRlciBtb3VzZWxlYXZlIGtleWRvd24ga2V5dXAga2V5cHJlc3Mgc3VibWl0IGZvY3VzIGJsdXIgY29weSBjdXQgcGFzdGUnLnNwbGl0KCcgJyksCisgIGZ1bmN0aW9uKGV2ZW50TmFtZSkgeworICAgIHZhciBkaXJlY3RpdmVOYW1lID0gZGlyZWN0aXZlTm9ybWFsaXplKCduZy0nICsgZXZlbnROYW1lKTsKKyAgICBuZ0V2ZW50RGlyZWN0aXZlc1tkaXJlY3RpdmVOYW1lXSA9IFsnJHBhcnNlJywgJyRyb290U2NvcGUnLCBmdW5jdGlvbigkcGFyc2UsICRyb290U2NvcGUpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHJlc3RyaWN0OiAnQScsCisgICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKCRlbGVtZW50LCBhdHRyKSB7CisgICAgICAgICAgLy8gV2UgZXhwb3NlIHRoZSBwb3dlcmZ1bCAkZXZlbnQgb2JqZWN0IG9uIHRoZSBzY29wZSB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgV2luZG93LAorICAgICAgICAgIC8vIGV0Yy4gdGhhdCBpc24ndCBwcm90ZWN0ZWQgYnkgdGhlIGZhc3QgcGF0aHMgaW4gJHBhcnNlLiAgV2UgZXhwbGljaXRseSByZXF1ZXN0IGJldHRlcgorICAgICAgICAgIC8vIGNoZWNrcyBhdCB0aGUgY29zdCBvZiBzcGVlZCBzaW5jZSBldmVudCBoYW5kbGVyIGV4cHJlc3Npb25zIGFyZSBub3QgZXhlY3V0ZWQgYXMKKyAgICAgICAgICAvLyBmcmVxdWVudGx5IGFzIHJlZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi4KKyAgICAgICAgICB2YXIgZm4gPSAkcGFyc2UoYXR0cltkaXJlY3RpdmVOYW1lXSwgLyogaW50ZXJjZXB0b3JGbiAqLyBudWxsLCAvKiBleHBlbnNpdmVDaGVja3MgKi8gdHJ1ZSk7CisgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5nRXZlbnRIYW5kbGVyKHNjb3BlLCBlbGVtZW50KSB7CisgICAgICAgICAgICBlbGVtZW50Lm9uKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgZm4oc2NvcGUsIHskZXZlbnQ6ZXZlbnR9KTsKKyAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgaWYgKGZvcmNlQXN5bmNFdmVudHNbZXZlbnROYW1lXSAmJiAkcm9vdFNjb3BlLiQkcGhhc2UpIHsKKyAgICAgICAgICAgICAgICBzY29wZS4kZXZhbEFzeW5jKGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoY2FsbGJhY2spOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9OworICAgICAgICB9CisgICAgICB9OworICAgIH1dOworICB9CispOworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nRGJsY2xpY2sKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFRoZSBgbmdEYmxjbGlja2AgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gYSBkYmxjbGljayBldmVudC4KKyAqCisgKiBAZWxlbWVudCBBTlkKKyAqIEBwcmlvcml0eSAwCisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nRGJsY2xpY2sge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbgorICogYSBkYmxjbGljay4gKFRoZSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgKQorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZT4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICA8YnV0dG9uIG5nLWRibGNsaWNrPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+CisgICAgICAgIEluY3JlbWVudCAob24gZG91YmxlIGNsaWNrKQorICAgICAgPC9idXR0b24+CisgICAgICBjb3VudDoge3tjb3VudH19CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLworCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdNb3VzZWRvd24KKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFRoZSBuZ01vdXNlZG93biBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBtb3VzZWRvd24gZXZlbnQuCisgKgorICogQGVsZW1lbnQgQU5ZCisgKiBAcHJpb3JpdHkgMAorICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ01vdXNlZG93biB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCisgKiBtb3VzZWRvd24uICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZT4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICA8YnV0dG9uIG5nLW1vdXNlZG93bj0iY291bnQgPSBjb3VudCArIDEiIG5nLWluaXQ9ImNvdW50PTAiPgorICAgICAgICBJbmNyZW1lbnQgKG9uIG1vdXNlIGRvd24pCisgICAgICA8L2J1dHRvbj4KKyAgICAgIGNvdW50OiB7e2NvdW50fX0KKyAgICAgPC9maWxlPgorICAgPC9leGFtcGxlPgorICovCisKKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ01vdXNldXAKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIG1vdXNldXAgZXZlbnQuCisgKgorICogQGVsZW1lbnQgQU5ZCisgKiBAcHJpb3JpdHkgMAorICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ01vdXNldXAge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbgorICogbW91c2V1cC4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pCisgKgorICogQGV4YW1wbGUKKyAgIDxleGFtcGxlPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgIDxidXR0b24gbmctbW91c2V1cD0iY291bnQgPSBjb3VudCArIDEiIG5nLWluaXQ9ImNvdW50PTAiPgorICAgICAgICBJbmNyZW1lbnQgKG9uIG1vdXNlIHVwKQorICAgICAgPC9idXR0b24+CisgICAgICBjb3VudDoge3tjb3VudH19CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nTW91c2VvdmVyCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBtb3VzZW92ZXIgZXZlbnQuCisgKgorICogQGVsZW1lbnQgQU5ZCisgKiBAcHJpb3JpdHkgMAorICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ01vdXNlb3ZlciB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCisgKiBtb3VzZW92ZXIuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZT4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICA8YnV0dG9uIG5nLW1vdXNlb3Zlcj0iY291bnQgPSBjb3VudCArIDEiIG5nLWluaXQ9ImNvdW50PTAiPgorICAgICAgICBJbmNyZW1lbnQgKHdoZW4gbW91c2UgaXMgb3ZlcikKKyAgICAgIDwvYnV0dG9uPgorICAgICAgY291bnQ6IHt7Y291bnR9fQorICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisgKi8KKworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nTW91c2VlbnRlcgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gbW91c2VlbnRlciBldmVudC4KKyAqCisgKiBAZWxlbWVudCBBTlkKKyAqIEBwcmlvcml0eSAwCisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2VlbnRlciB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCisgKiBtb3VzZWVudGVyLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSkKKyAqCisgKiBAZXhhbXBsZQorICAgPGV4YW1wbGU+CisgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgPGJ1dHRvbiBuZy1tb3VzZWVudGVyPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+CisgICAgICAgIEluY3JlbWVudCAod2hlbiBtb3VzZSBlbnRlcnMpCisgICAgICA8L2J1dHRvbj4KKyAgICAgIGNvdW50OiB7e2NvdW50fX0KKyAgICAgPC9maWxlPgorICAgPC9leGFtcGxlPgorICovCisKKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ01vdXNlbGVhdmUKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIG1vdXNlbGVhdmUgZXZlbnQuCisgKgorICogQGVsZW1lbnQgQU5ZCisgKiBAcHJpb3JpdHkgMAorICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ01vdXNlbGVhdmUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbgorICogbW91c2VsZWF2ZS4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pCisgKgorICogQGV4YW1wbGUKKyAgIDxleGFtcGxlPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgIDxidXR0b24gbmctbW91c2VsZWF2ZT0iY291bnQgPSBjb3VudCArIDEiIG5nLWluaXQ9ImNvdW50PTAiPgorICAgICAgICBJbmNyZW1lbnQgKHdoZW4gbW91c2UgbGVhdmVzKQorICAgICAgPC9idXR0b24+CisgICAgICBjb3VudDoge3tjb3VudH19CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLworCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdNb3VzZW1vdmUKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIG1vdXNlbW92ZSBldmVudC4KKyAqCisgKiBAZWxlbWVudCBBTlkKKyAqIEBwcmlvcml0eSAwCisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2Vtb3ZlIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24KKyAqIG1vdXNlbW92ZS4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pCisgKgorICogQGV4YW1wbGUKKyAgIDxleGFtcGxlPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgIDxidXR0b24gbmctbW91c2Vtb3ZlPSJjb3VudCA9IGNvdW50ICsgMSIgbmctaW5pdD0iY291bnQ9MCI+CisgICAgICAgIEluY3JlbWVudCAod2hlbiBtb3VzZSBtb3ZlcykKKyAgICAgIDwvYnV0dG9uPgorICAgICAgY291bnQ6IHt7Y291bnR9fQorICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisgKi8KKworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nS2V5ZG93bgorICoKKyAqIEBkZXNjcmlwdGlvbgorICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24ga2V5ZG93biBldmVudC4KKyAqCisgKiBAZWxlbWVudCBBTlkKKyAqIEBwcmlvcml0eSAwCisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nS2V5ZG93biB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCisgKiBrZXlkb3duLiAoRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YCBhbmQgY2FuIGJlIGludGVycm9nYXRlZCBmb3Iga2V5Q29kZSwgYWx0S2V5LCBldGMuKQorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZT4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICA8aW5wdXQgbmcta2V5ZG93bj0iY291bnQgPSBjb3VudCArIDEiIG5nLWluaXQ9ImNvdW50PTAiPgorICAgICAga2V5IGRvd24gY291bnQ6IHt7Y291bnR9fQorICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisgKi8KKworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nS2V5dXAKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGtleXVwIGV2ZW50LgorICoKKyAqIEBlbGVtZW50IEFOWQorICogQHByaW9yaXR5IDAKKyAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdLZXl1cCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCisgKiBrZXl1cC4gKEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGAgYW5kIGNhbiBiZSBpbnRlcnJvZ2F0ZWQgZm9yIGtleUNvZGUsIGFsdEtleSwgZXRjLikKKyAqCisgKiBAZXhhbXBsZQorICAgPGV4YW1wbGU+CisgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgIDxwPlR5cGluZyBpbiB0aGUgaW5wdXQgYm94IGJlbG93IHVwZGF0ZXMgdGhlIGtleSBjb3VudDwvcD4KKyAgICAgICA8aW5wdXQgbmcta2V5dXA9ImNvdW50ID0gY291bnQgKyAxIiBuZy1pbml0PSJjb3VudD0wIj4ga2V5IHVwIGNvdW50OiB7e2NvdW50fX0KKworICAgICAgIDxwPlR5cGluZyBpbiB0aGUgaW5wdXQgYm94IGJlbG93IHVwZGF0ZXMgdGhlIGtleWNvZGU8L3A+CisgICAgICAgPGlucHV0IG5nLWtleXVwPSJldmVudD0kZXZlbnQiPgorICAgICAgIDxwPmV2ZW50IGtleUNvZGU6IHt7IGV2ZW50LmtleUNvZGUgfX08L3A+CisgICAgICAgPHA+ZXZlbnQgYWx0S2V5OiB7eyBldmVudC5hbHRLZXkgfX08L3A+CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLworCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdLZXlwcmVzcworICoKKyAqIEBkZXNjcmlwdGlvbgorICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24ga2V5cHJlc3MgZXZlbnQuCisgKgorICogQGVsZW1lbnQgQU5ZCisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nS2V5cHJlc3Mge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbgorICoga2V5cHJlc3MuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9CisgKiBhbmQgY2FuIGJlIGludGVycm9nYXRlZCBmb3Iga2V5Q29kZSwgYWx0S2V5LCBldGMuKQorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZT4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICA8aW5wdXQgbmcta2V5cHJlc3M9ImNvdW50ID0gY291bnQgKyAxIiBuZy1pbml0PSJjb3VudD0wIj4KKyAgICAgIGtleSBwcmVzcyBjb3VudDoge3tjb3VudH19CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLworCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdTdWJtaXQKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIEVuYWJsZXMgYmluZGluZyBhbmd1bGFyIGV4cHJlc3Npb25zIHRvIG9uc3VibWl0IGV2ZW50cy4KKyAqCisgKiBBZGRpdGlvbmFsbHkgaXQgcHJldmVudHMgdGhlIGRlZmF1bHQgYWN0aW9uICh3aGljaCBmb3IgZm9ybSBtZWFucyBzZW5kaW5nIHRoZSByZXF1ZXN0IHRvIHRoZQorICogc2VydmVyIGFuZCByZWxvYWRpbmcgdGhlIGN1cnJlbnQgcGFnZSksIGJ1dCBvbmx5IGlmIHRoZSBmb3JtIGRvZXMgbm90IGNvbnRhaW4gYGFjdGlvbmAsCisgKiBgZGF0YS1hY3Rpb25gLCBvciBgeC1hY3Rpb25gIGF0dHJpYnV0ZXMuCisgKgorICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+CisgKiAqKldhcm5pbmc6KiogQmUgY2FyZWZ1bCBub3QgdG8gY2F1c2UgImRvdWJsZS1zdWJtaXNzaW9uIiBieSB1c2luZyBib3RoIHRoZSBgbmdDbGlja2AgYW5kCisgKiBgbmdTdWJtaXRgIGhhbmRsZXJzIHRvZ2V0aGVyLiBTZWUgdGhlCisgKiB7QGxpbmsgZm9ybSNzdWJtaXR0aW5nLWEtZm9ybS1hbmQtcHJldmVudGluZy10aGUtZGVmYXVsdC1hY3Rpb24gYGZvcm1gIGRpcmVjdGl2ZSBkb2N1bWVudGF0aW9ufQorICogZm9yIGEgZGV0YWlsZWQgZGlzY3Vzc2lvbiBvZiB3aGVuIGBuZ1N1Ym1pdGAgbWF5IGJlIHRyaWdnZXJlZC4KKyAqIDwvZGl2PgorICoKKyAqIEBlbGVtZW50IGZvcm0KKyAqIEBwcmlvcml0eSAwCisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nU3VibWl0IHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWwuCisgKiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSkKKyAqCisgKiBAZXhhbXBsZQorICAgPGV4YW1wbGUgbW9kdWxlPSJzdWJtaXRFeGFtcGxlIj4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICA8c2NyaXB0PgorICAgICAgICBhbmd1bGFyLm1vZHVsZSgnc3VibWl0RXhhbXBsZScsIFtdKQorICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7CisgICAgICAgICAgICAkc2NvcGUubGlzdCA9IFtdOworICAgICAgICAgICAgJHNjb3BlLnRleHQgPSAnaGVsbG8nOworICAgICAgICAgICAgJHNjb3BlLnN1Ym1pdCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICBpZiAoJHNjb3BlLnRleHQpIHsKKyAgICAgICAgICAgICAgICAkc2NvcGUubGlzdC5wdXNoKHRoaXMudGV4dCk7CisgICAgICAgICAgICAgICAgJHNjb3BlLnRleHQgPSAnJzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICB9XSk7CisgICAgICA8L3NjcmlwdD4KKyAgICAgIDxmb3JtIG5nLXN1Ym1pdD0ic3VibWl0KCkiIG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KKyAgICAgICAgRW50ZXIgdGV4dCBhbmQgaGl0IGVudGVyOgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InRleHQiIG5hbWU9InRleHQiIC8+CisgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIGlkPSJzdWJtaXQiIHZhbHVlPSJTdWJtaXQiIC8+CisgICAgICAgIDxwcmU+bGlzdD17e2xpc3R9fTwvcHJlPgorICAgICAgPC9mb3JtPgorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctc3VibWl0JywgZnVuY3Rpb24oKSB7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdsaXN0JykpLmdldFRleHQoKSkudG9CZSgnbGlzdD1bXScpOworICAgICAgICAgZWxlbWVudChieS5jc3MoJyNzdWJtaXQnKSkuY2xpY2soKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ2xpc3QnKSkuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2hlbGxvJyk7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5tb2RlbCgndGV4dCcpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvQmUoJycpOworICAgICAgIH0pOworICAgICAgIGl0KCdzaG91bGQgaWdub3JlIGVtcHR5IHN0cmluZ3MnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ2xpc3QnKSkuZ2V0VGV4dCgpKS50b0JlKCdsaXN0PVtdJyk7CisgICAgICAgICBlbGVtZW50KGJ5LmNzcygnI3N1Ym1pdCcpKS5jbGljaygpOworICAgICAgICAgZWxlbWVudChieS5jc3MoJyNzdWJtaXQnKSkuY2xpY2soKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ2xpc3QnKSkuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2hlbGxvJyk7CisgICAgICAgIH0pOworICAgICA8L2ZpbGU+CisgICA8L2V4YW1wbGU+CisgKi8KKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ0ZvY3VzCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBmb2N1cyBldmVudC4KKyAqCisgKiBOb3RlOiBBcyB0aGUgYGZvY3VzYCBldmVudCBpcyBleGVjdXRlZCBzeW5jaHJvbm91c2x5IHdoZW4gY2FsbGluZyBgaW5wdXQuZm9jdXMoKWAKKyAqIEFuZ3VsYXJKUyBleGVjdXRlcyB0aGUgZXhwcmVzc2lvbiB1c2luZyBgc2NvcGUuJGV2YWxBc3luY2AgaWYgdGhlIGV2ZW50IGlzIGZpcmVkCisgKiBkdXJpbmcgYW4gYCRhcHBseWAgdG8gZW5zdXJlIGEgY29uc2lzdGVudCBzdGF0ZS4KKyAqCisgKiBAZWxlbWVudCB3aW5kb3csIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBhCisgKiBAcHJpb3JpdHkgMAorICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0ZvY3VzIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24KKyAqIGZvY3VzLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSkKKyAqCisgKiBAZXhhbXBsZQorICogU2VlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDbGljayBuZ0NsaWNrfQorICovCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdCbHVyCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBibHVyIGV2ZW50LgorICoKKyAqIEEgW2JsdXIgZXZlbnRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy9ibHVyKSBmaXJlcyB3aGVuCisgKiBhbiBlbGVtZW50IGhhcyBsb3N0IGZvY3VzLgorICoKKyAqIE5vdGU6IEFzIHRoZSBgYmx1cmAgZXZlbnQgaXMgZXhlY3V0ZWQgc3luY2hyb25vdXNseSBhbHNvIGR1cmluZyBET00gbWFuaXB1bGF0aW9ucworICogKGUuZy4gcmVtb3ZpbmcgYSBmb2N1c3NlZCBpbnB1dCksCisgKiBBbmd1bGFySlMgZXhlY3V0ZXMgdGhlIGV4cHJlc3Npb24gdXNpbmcgYHNjb3BlLiRldmFsQXN5bmNgIGlmIHRoZSBldmVudCBpcyBmaXJlZAorICogZHVyaW5nIGFuIGAkYXBwbHlgIHRvIGVuc3VyZSBhIGNvbnNpc3RlbnQgc3RhdGUuCisgKgorICogQGVsZW1lbnQgd2luZG93LCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYQorICogQHByaW9yaXR5IDAKKyAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdCbHVyIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24KKyAqIGJsdXIuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQorICoKKyAqIEBleGFtcGxlCisgKiBTZWUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NsaWNrIG5nQ2xpY2t9CisgKi8KKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ0NvcHkKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGNvcHkgZXZlbnQuCisgKgorICogQGVsZW1lbnQgd2luZG93LCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYQorICogQHByaW9yaXR5IDAKKyAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDb3B5IHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb24KKyAqIGNvcHkuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KQorICoKKyAqIEBleGFtcGxlCisgICA8ZXhhbXBsZT4KKyAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICA8aW5wdXQgbmctY29weT0iY29waWVkPXRydWUiIG5nLWluaXQ9ImNvcGllZD1mYWxzZTsgdmFsdWU9J2NvcHkgbWUnIiBuZy1tb2RlbD0idmFsdWUiPgorICAgICAgY29waWVkOiB7e2NvcGllZH19CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nQ3V0CisgKgorICogQGRlc2NyaXB0aW9uCisgKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBjdXQgZXZlbnQuCisgKgorICogQGVsZW1lbnQgd2luZG93LCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYQorICogQHByaW9yaXR5IDAKKyAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDdXQge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvbgorICogY3V0LiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSkKKyAqCisgKiBAZXhhbXBsZQorICAgPGV4YW1wbGU+CisgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgPGlucHV0IG5nLWN1dD0iY3V0PXRydWUiIG5nLWluaXQ9ImN1dD1mYWxzZTsgdmFsdWU9J2N1dCBtZSciIG5nLW1vZGVsPSJ2YWx1ZSI+CisgICAgICBjdXQ6IHt7Y3V0fX0KKyAgICAgPC9maWxlPgorICAgPC9leGFtcGxlPgorICovCisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdQYXN0ZQorICoKKyAqIEBkZXNjcmlwdGlvbgorICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gcGFzdGUgZXZlbnQuCisgKgorICogQGVsZW1lbnQgd2luZG93LCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYQorICogQHByaW9yaXR5IDAKKyAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdQYXN0ZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uCisgKiBwYXN0ZS4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pCisgKgorICogQGV4YW1wbGUKKyAgIDxleGFtcGxlPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgIDxpbnB1dCBuZy1wYXN0ZT0icGFzdGU9dHJ1ZSIgbmctaW5pdD0icGFzdGU9ZmFsc2UiIHBsYWNlaG9sZGVyPSdwYXN0ZSBoZXJlJz4KKyAgICAgIHBhc3RlZDoge3twYXN0ZX19CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nSWYKKyAqIEByZXN0cmljdCBBCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBUaGUgYG5nSWZgIGRpcmVjdGl2ZSByZW1vdmVzIG9yIHJlY3JlYXRlcyBhIHBvcnRpb24gb2YgdGhlIERPTSB0cmVlIGJhc2VkIG9uIGFuCisgKiB7ZXhwcmVzc2lvbn0uIElmIHRoZSBleHByZXNzaW9uIGFzc2lnbmVkIHRvIGBuZ0lmYCBldmFsdWF0ZXMgdG8gYSBmYWxzZQorICogdmFsdWUgdGhlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIERPTSwgb3RoZXJ3aXNlIGEgY2xvbmUgb2YgdGhlCisgKiBlbGVtZW50IGlzIHJlaW5zZXJ0ZWQgaW50byB0aGUgRE9NLgorICoKKyAqIGBuZ0lmYCBkaWZmZXJzIGZyb20gYG5nU2hvd2AgYW5kIGBuZ0hpZGVgIGluIHRoYXQgYG5nSWZgIGNvbXBsZXRlbHkgcmVtb3ZlcyBhbmQgcmVjcmVhdGVzIHRoZQorICogZWxlbWVudCBpbiB0aGUgRE9NIHJhdGhlciB0aGFuIGNoYW5naW5nIGl0cyB2aXNpYmlsaXR5IHZpYSB0aGUgYGRpc3BsYXlgIGNzcyBwcm9wZXJ0eS4gIEEgY29tbW9uCisgKiBjYXNlIHdoZW4gdGhpcyBkaWZmZXJlbmNlIGlzIHNpZ25pZmljYW50IGlzIHdoZW4gdXNpbmcgY3NzIHNlbGVjdG9ycyB0aGF0IHJlbHkgb24gYW4gZWxlbWVudCdzCisgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIERPTSwgc3VjaCBhcyB0aGUgYDpmaXJzdC1jaGlsZGAgb3IgYDpsYXN0LWNoaWxkYCBwc2V1ZG8tY2xhc3Nlcy4KKyAqCisgKiBOb3RlIHRoYXQgd2hlbiBhbiBlbGVtZW50IGlzIHJlbW92ZWQgdXNpbmcgYG5nSWZgIGl0cyBzY29wZSBpcyBkZXN0cm95ZWQgYW5kIGEgbmV3IHNjb3BlCisgKiBpcyBjcmVhdGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmVzdG9yZWQuICBUaGUgc2NvcGUgY3JlYXRlZCB3aXRoaW4gYG5nSWZgIGluaGVyaXRzIGZyb20KKyAqIGl0cyBwYXJlbnQgc2NvcGUgdXNpbmcKKyAqIFtwcm90b3R5cGFsIGluaGVyaXRhbmNlXShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL3dpa2kvVW5kZXJzdGFuZGluZy1TY29wZXMjamF2YXNjcmlwdC1wcm90b3R5cGFsLWluaGVyaXRhbmNlKS4KKyAqIEFuIGltcG9ydGFudCBpbXBsaWNhdGlvbiBvZiB0aGlzIGlzIGlmIGBuZ01vZGVsYCBpcyB1c2VkIHdpdGhpbiBgbmdJZmAgdG8gYmluZCB0bworICogYSBqYXZhc2NyaXB0IHByaW1pdGl2ZSBkZWZpbmVkIGluIHRoZSBwYXJlbnQgc2NvcGUuIEluIHRoaXMgY2FzZSBhbnkgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZQorICogdmFyaWFibGUgd2l0aGluIHRoZSBjaGlsZCBzY29wZSB3aWxsIG92ZXJyaWRlIChoaWRlKSB0aGUgdmFsdWUgaW4gdGhlIHBhcmVudCBzY29wZS4KKyAqCisgKiBBbHNvLCBgbmdJZmAgcmVjcmVhdGVzIGVsZW1lbnRzIHVzaW5nIHRoZWlyIGNvbXBpbGVkIHN0YXRlLiBBbiBleGFtcGxlIG9mIHRoaXMgYmVoYXZpb3IKKyAqIGlzIGlmIGFuIGVsZW1lbnQncyBjbGFzcyBhdHRyaWJ1dGUgaXMgZGlyZWN0bHkgbW9kaWZpZWQgYWZ0ZXIgaXQncyBjb21waWxlZCwgdXNpbmcgc29tZXRoaW5nIGxpa2UKKyAqIGpRdWVyeSdzIGAuYWRkQ2xhc3MoKWAgbWV0aG9kLCBhbmQgdGhlIGVsZW1lbnQgaXMgbGF0ZXIgcmVtb3ZlZC4gV2hlbiBgbmdJZmAgcmVjcmVhdGVzIHRoZSBlbGVtZW50CisgKiB0aGUgYWRkZWQgY2xhc3Mgd2lsbCBiZSBsb3N0IGJlY2F1c2UgdGhlIG9yaWdpbmFsIGNvbXBpbGVkIHN0YXRlIGlzIHVzZWQgdG8gcmVnZW5lcmF0ZSB0aGUgZWxlbWVudC4KKyAqCisgKiBBZGRpdGlvbmFsbHksIHlvdSBjYW4gcHJvdmlkZSBhbmltYXRpb25zIHZpYSB0aGUgYG5nQW5pbWF0ZWAgbW9kdWxlIHRvIGFuaW1hdGUgdGhlIGBlbnRlcmAKKyAqIGFuZCBgbGVhdmVgIGVmZmVjdHMuCisgKgorICogQGFuaW1hdGlvbnMKKyAqIGVudGVyIC0gaGFwcGVucyBqdXN0IGFmdGVyIHRoZSBgbmdJZmAgY29udGVudHMgY2hhbmdlIGFuZCBhIG5ldyBET00gZWxlbWVudCBpcyBjcmVhdGVkIGFuZCBpbmplY3RlZCBpbnRvIHRoZSBgbmdJZmAgY29udGFpbmVyCisgKiBsZWF2ZSAtIGhhcHBlbnMganVzdCBiZWZvcmUgdGhlIGBuZ0lmYCBjb250ZW50cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBET00KKyAqCisgKiBAZWxlbWVudCBBTlkKKyAqIEBzY29wZQorICogQHByaW9yaXR5IDYwMAorICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0lmIElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyBmYWxzeSB0aGVuCisgKiAgICAgdGhlIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gdHJlZS4gSWYgaXQgaXMgdHJ1dGh5IGEgY29weSBvZiB0aGUgY29tcGlsZWQKKyAqICAgICBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBET00gdHJlZS4KKyAqCisgKiBAZXhhbXBsZQorICA8ZXhhbXBsZSBtb2R1bGU9Im5nQW5pbWF0ZSIgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIj4KKyAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgIENsaWNrIG1lOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJjaGVja2VkIiBuZy1pbml0PSJjaGVja2VkPXRydWUiIC8+PGJyLz4KKyAgICAgIFNob3cgd2hlbiBjaGVja2VkOgorICAgICAgPHNwYW4gbmctaWY9ImNoZWNrZWQiIGNsYXNzPSJhbmltYXRlLWlmIj4KKyAgICAgICAgVGhpcyBpcyByZW1vdmVkIHdoZW4gdGhlIGNoZWNrYm94IGlzIHVuY2hlY2tlZC4KKyAgICAgIDwvc3Bhbj4KKyAgICA8L2ZpbGU+CisgICAgPGZpbGUgbmFtZT0iYW5pbWF0aW9ucy5jc3MiPgorICAgICAgLmFuaW1hdGUtaWYgeworICAgICAgICBiYWNrZ3JvdW5kOndoaXRlOworICAgICAgICBib3JkZXI6MXB4IHNvbGlkIGJsYWNrOworICAgICAgICBwYWRkaW5nOjEwcHg7CisgICAgICB9CisKKyAgICAgIC5hbmltYXRlLWlmLm5nLWVudGVyLCAuYW5pbWF0ZS1pZi5uZy1sZWF2ZSB7CisgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzOworICAgICAgICB0cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDAuNXM7CisgICAgICB9CisKKyAgICAgIC5hbmltYXRlLWlmLm5nLWVudGVyLAorICAgICAgLmFuaW1hdGUtaWYubmctbGVhdmUubmctbGVhdmUtYWN0aXZlIHsKKyAgICAgICAgb3BhY2l0eTowOworICAgICAgfQorCisgICAgICAuYW5pbWF0ZS1pZi5uZy1sZWF2ZSwKKyAgICAgIC5hbmltYXRlLWlmLm5nLWVudGVyLm5nLWVudGVyLWFjdGl2ZSB7CisgICAgICAgIG9wYWNpdHk6MTsKKyAgICAgIH0KKyAgICA8L2ZpbGU+CisgIDwvZXhhbXBsZT4KKyAqLwordmFyIG5nSWZEaXJlY3RpdmUgPSBbJyRhbmltYXRlJywgZnVuY3Rpb24oJGFuaW1hdGUpIHsKKyAgcmV0dXJuIHsKKyAgICBtdWx0aUVsZW1lbnQ6IHRydWUsCisgICAgdHJhbnNjbHVkZTogJ2VsZW1lbnQnLAorICAgIHByaW9yaXR5OiA2MDAsCisgICAgdGVybWluYWw6IHRydWUsCisgICAgcmVzdHJpY3Q6ICdBJywKKyAgICAkJHRsYjogdHJ1ZSwKKyAgICBsaW5rOiBmdW5jdGlvbigkc2NvcGUsICRlbGVtZW50LCAkYXR0ciwgY3RybCwgJHRyYW5zY2x1ZGUpIHsKKyAgICAgICAgdmFyIGJsb2NrLCBjaGlsZFNjb3BlLCBwcmV2aW91c0VsZW1lbnRzOworICAgICAgICAkc2NvcGUuJHdhdGNoKCRhdHRyLm5nSWYsIGZ1bmN0aW9uIG5nSWZXYXRjaEFjdGlvbih2YWx1ZSkgeworCisgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoIWNoaWxkU2NvcGUpIHsKKyAgICAgICAgICAgICAgJHRyYW5zY2x1ZGUoZnVuY3Rpb24oY2xvbmUsIG5ld1Njb3BlKSB7CisgICAgICAgICAgICAgICAgY2hpbGRTY29wZSA9IG5ld1Njb3BlOworICAgICAgICAgICAgICAgIGNsb25lW2Nsb25lLmxlbmd0aCsrXSA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJyBlbmQgbmdJZjogJyArICRhdHRyLm5nSWYgKyAnICcpOworICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIG9ubHkgbmVlZCB0aGUgZmlyc3QvbGFzdCBub2RlIG9mIHRoZSBjbG9uZWQgbm9kZXMuCisgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgbmVlZCB0byBrZWVwIHRoZSByZWZlcmVuY2UgdG8gdGhlIGpxbGl0ZSB3cmFwcGVyIGFzIGl0IG1pZ2h0IGJlIGNoYW5nZWQgbGF0ZXIKKyAgICAgICAgICAgICAgICAvLyBieSBhIGRpcmVjdGl2ZSB3aXRoIHRlbXBsYXRlVXJsIHdoZW4gaXRzIHRlbXBsYXRlIGFycml2ZXMuCisgICAgICAgICAgICAgICAgYmxvY2sgPSB7CisgICAgICAgICAgICAgICAgICBjbG9uZTogY2xvbmUKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICRhbmltYXRlLmVudGVyKGNsb25lLCAkZWxlbWVudC5wYXJlbnQoKSwgJGVsZW1lbnQpOworICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudHMpIHsKKyAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50cy5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50cyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hpbGRTY29wZSkgeworICAgICAgICAgICAgICBjaGlsZFNjb3BlLiRkZXN0cm95KCk7CisgICAgICAgICAgICAgIGNoaWxkU2NvcGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJsb2NrKSB7CisgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudHMgPSBnZXRCbG9ja05vZGVzKGJsb2NrLmNsb25lKTsKKyAgICAgICAgICAgICAgJGFuaW1hdGUubGVhdmUocHJldmlvdXNFbGVtZW50cykudGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRzID0gbnVsbDsKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIGJsb2NrID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKyAgfTsKK31dOworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nSW5jbHVkZQorICogQHJlc3RyaWN0IEVDQQorICoKKyAqIEBkZXNjcmlwdGlvbgorICogRmV0Y2hlcywgY29tcGlsZXMgYW5kIGluY2x1ZGVzIGFuIGV4dGVybmFsIEhUTUwgZnJhZ21lbnQuCisgKgorICogQnkgZGVmYXVsdCwgdGhlIHRlbXBsYXRlIFVSTCBpcyByZXN0cmljdGVkIHRvIHRoZSBzYW1lIGRvbWFpbiBhbmQgcHJvdG9jb2wgYXMgdGhlCisgKiBhcHBsaWNhdGlvbiBkb2N1bWVudC4gVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcge0BsaW5rICRzY2UjZ2V0VHJ1c3RlZFJlc291cmNlVXJsCisgKiAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybH0gb24gaXQuIFRvIGxvYWQgdGVtcGxhdGVzIGZyb20gb3RoZXIgZG9tYWlucyBvciBwcm90b2NvbHMKKyAqIHlvdSBtYXkgZWl0aGVyIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybFdoaXRlbGlzdCB3aGl0ZWxpc3QgdGhlbX0gb3IKKyAqIHtAbGluayAkc2NlI3RydXN0QXNSZXNvdXJjZVVybCB3cmFwIHRoZW19IGFzIHRydXN0ZWQgdmFsdWVzLiBSZWZlciB0byBBbmd1bGFyJ3Mge0BsaW5rCisgKiBuZy4kc2NlIFN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nfS4KKyAqCisgKiBJbiBhZGRpdGlvbiwgdGhlIGJyb3dzZXIncworICogW1NhbWUgT3JpZ2luIFBvbGljeV0oaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9icm93c2Vyc2VjL3dpa2kvUGFydDIjU2FtZS1vcmlnaW5fcG9saWN5X2Zvcl9YTUxIdHRwUmVxdWVzdCkKKyAqIGFuZCBbQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpXShodHRwOi8vd3d3LnczLm9yZy9UUi9jb3JzLykKKyAqIHBvbGljeSBtYXkgZnVydGhlciByZXN0cmljdCB3aGV0aGVyIHRoZSB0ZW1wbGF0ZSBpcyBzdWNjZXNzZnVsbHkgbG9hZGVkLgorICogRm9yIGV4YW1wbGUsIGBuZ0luY2x1ZGVgIHdvbid0IHdvcmsgZm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cyBvbiBhbGwgYnJvd3NlcnMgYW5kIGZvciBgZmlsZTovL2AKKyAqIGFjY2VzcyBvbiBzb21lIGJyb3dzZXJzLgorICoKKyAqIEBhbmltYXRpb25zCisgKiBlbnRlciAtIGFuaW1hdGlvbiBpcyB1c2VkIHRvIGJyaW5nIG5ldyBjb250ZW50IGludG8gdGhlIGJyb3dzZXIuCisgKiBsZWF2ZSAtIGFuaW1hdGlvbiBpcyB1c2VkIHRvIGFuaW1hdGUgZXhpc3RpbmcgY29udGVudCBhd2F5LgorICoKKyAqIFRoZSBlbnRlciBhbmQgbGVhdmUgYW5pbWF0aW9uIG9jY3VyIGNvbmN1cnJlbnRseS4KKyAqCisgKiBAc2NvcGUKKyAqIEBwcmlvcml0eSA0MDAKKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbmdJbmNsdWRlfHNyYyBhbmd1bGFyIGV4cHJlc3Npb24gZXZhbHVhdGluZyB0byBVUkwuIElmIHRoZSBzb3VyY2UgaXMgYSBzdHJpbmcgY29uc3RhbnQsCisgKiAgICAgICAgICAgICAgICAgbWFrZSBzdXJlIHlvdSB3cmFwIGl0IGluICoqc2luZ2xlKiogcXVvdGVzLCBlLmcuIGBzcmM9IidteVBhcnRpYWxUZW1wbGF0ZS5odG1sJyJgLgorICogQHBhcmFtIHtzdHJpbmc9fSBvbmxvYWQgRXhwcmVzc2lvbiB0byBldmFsdWF0ZSB3aGVuIGEgbmV3IHBhcnRpYWwgaXMgbG9hZGVkLgorICoKKyAqIEBwYXJhbSB7c3RyaW5nPX0gYXV0b3Njcm9sbCBXaGV0aGVyIGBuZ0luY2x1ZGVgIHNob3VsZCBjYWxsIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsCisgKiAgICAgICAgICAgICAgICAgICRhbmNob3JTY3JvbGx9IHRvIHNjcm9sbCB0aGUgdmlld3BvcnQgYWZ0ZXIgdGhlIGNvbnRlbnQgaXMgbG9hZGVkLgorICoKKyAqICAgICAgICAgICAgICAgICAgLSBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBzZXQsIGRpc2FibGUgc2Nyb2xsaW5nLgorICogICAgICAgICAgICAgICAgICAtIElmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0IHdpdGhvdXQgdmFsdWUsIGVuYWJsZSBzY3JvbGxpbmcuCisgKiAgICAgICAgICAgICAgICAgIC0gT3RoZXJ3aXNlIGVuYWJsZSBzY3JvbGxpbmcgb25seSBpZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1dGh5IHZhbHVlLgorICoKKyAqIEBleGFtcGxlCisgIDxleGFtcGxlIG1vZHVsZT0iaW5jbHVkZUV4YW1wbGUiIGRlcHM9ImFuZ3VsYXItYW5pbWF0ZS5qcyIgYW5pbWF0aW9ucz0idHJ1ZSI+CisgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgIDxzZWxlY3QgbmctbW9kZWw9InRlbXBsYXRlIiBuZy1vcHRpb25zPSJ0Lm5hbWUgZm9yIHQgaW4gdGVtcGxhdGVzIj4KKyAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj4oYmxhbmspPC9vcHRpb24+CisgICAgICAgPC9zZWxlY3Q+CisgICAgICAgdXJsIG9mIHRoZSB0ZW1wbGF0ZTogPHR0Pnt7dGVtcGxhdGUudXJsfX08L3R0PgorICAgICAgIDxoci8+CisgICAgICAgPGRpdiBjbGFzcz0ic2xpZGUtYW5pbWF0ZS1jb250YWluZXIiPgorICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGUtYW5pbWF0ZSIgbmctaW5jbHVkZT0idGVtcGxhdGUudXJsIj48L2Rpdj4KKyAgICAgICA8L2Rpdj4KKyAgICAgPC9kaXY+CisgICAgPC9maWxlPgorICAgIDxmaWxlIG5hbWU9InNjcmlwdC5qcyI+CisgICAgICBhbmd1bGFyLm1vZHVsZSgnaW5jbHVkZUV4YW1wbGUnLCBbJ25nQW5pbWF0ZSddKQorICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgICAgICRzY29wZS50ZW1wbGF0ZXMgPQorICAgICAgICAgICAgWyB7IG5hbWU6ICd0ZW1wbGF0ZTEuaHRtbCcsIHVybDogJ3RlbXBsYXRlMS5odG1sJ30sCisgICAgICAgICAgICAgIHsgbmFtZTogJ3RlbXBsYXRlMi5odG1sJywgdXJsOiAndGVtcGxhdGUyLmh0bWwnfSBdOworICAgICAgICAgICRzY29wZS50ZW1wbGF0ZSA9ICRzY29wZS50ZW1wbGF0ZXNbMF07CisgICAgICAgIH1dKTsKKyAgICAgPC9maWxlPgorICAgIDxmaWxlIG5hbWU9InRlbXBsYXRlMS5odG1sIj4KKyAgICAgIENvbnRlbnQgb2YgdGVtcGxhdGUxLmh0bWwKKyAgICA8L2ZpbGU+CisgICAgPGZpbGUgbmFtZT0idGVtcGxhdGUyLmh0bWwiPgorICAgICAgQ29udGVudCBvZiB0ZW1wbGF0ZTIuaHRtbAorICAgIDwvZmlsZT4KKyAgICA8ZmlsZSBuYW1lPSJhbmltYXRpb25zLmNzcyI+CisgICAgICAuc2xpZGUtYW5pbWF0ZS1jb250YWluZXIgeworICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgICAgICAgYmFja2dyb3VuZDp3aGl0ZTsKKyAgICAgICAgYm9yZGVyOjFweCBzb2xpZCBibGFjazsKKyAgICAgICAgaGVpZ2h0OjQwcHg7CisgICAgICAgIG92ZXJmbG93OmhpZGRlbjsKKyAgICAgIH0KKworICAgICAgLnNsaWRlLWFuaW1hdGUgeworICAgICAgICBwYWRkaW5nOjEwcHg7CisgICAgICB9CisKKyAgICAgIC5zbGlkZS1hbmltYXRlLm5nLWVudGVyLCAuc2xpZGUtYW5pbWF0ZS5uZy1sZWF2ZSB7CisgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzOworICAgICAgICB0cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDAuNXM7CisKKyAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7CisgICAgICAgIHRvcDowOworICAgICAgICBsZWZ0OjA7CisgICAgICAgIHJpZ2h0OjA7CisgICAgICAgIGJvdHRvbTowOworICAgICAgICBkaXNwbGF5OmJsb2NrOworICAgICAgICBwYWRkaW5nOjEwcHg7CisgICAgICB9CisKKyAgICAgIC5zbGlkZS1hbmltYXRlLm5nLWVudGVyIHsKKyAgICAgICAgdG9wOi01MHB4OworICAgICAgfQorICAgICAgLnNsaWRlLWFuaW1hdGUubmctZW50ZXIubmctZW50ZXItYWN0aXZlIHsKKyAgICAgICAgdG9wOjA7CisgICAgICB9CisKKyAgICAgIC5zbGlkZS1hbmltYXRlLm5nLWxlYXZlIHsKKyAgICAgICAgdG9wOjA7CisgICAgICB9CisgICAgICAuc2xpZGUtYW5pbWF0ZS5uZy1sZWF2ZS5uZy1sZWF2ZS1hY3RpdmUgeworICAgICAgICB0b3A6NTBweDsKKyAgICAgIH0KKyAgICA8L2ZpbGU+CisgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICB2YXIgdGVtcGxhdGVTZWxlY3QgPSBlbGVtZW50KGJ5Lm1vZGVsKCd0ZW1wbGF0ZScpKTsKKyAgICAgIHZhciBpbmNsdWRlRWxlbSA9IGVsZW1lbnQoYnkuY3NzKCdbbmctaW5jbHVkZV0nKSk7CisKKyAgICAgIGl0KCdzaG91bGQgbG9hZCB0ZW1wbGF0ZTEuaHRtbCcsIGZ1bmN0aW9uKCkgeworICAgICAgICBleHBlY3QoaW5jbHVkZUVsZW0uZ2V0VGV4dCgpKS50b01hdGNoKC9Db250ZW50IG9mIHRlbXBsYXRlMS5odG1sLyk7CisgICAgICB9KTsKKworICAgICAgaXQoJ3Nob3VsZCBsb2FkIHRlbXBsYXRlMi5odG1sJywgZnVuY3Rpb24oKSB7CisgICAgICAgIGlmIChicm93c2VyLnBhcmFtcy5icm93c2VyID09ICdmaXJlZm94JykgeworICAgICAgICAgIC8vIEZpcmVmb3ggY2FuJ3QgaGFuZGxlIHVzaW5nIHNlbGVjdHMKKyAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNDgwCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlU2VsZWN0LmNsaWNrKCk7CisgICAgICAgIHRlbXBsYXRlU2VsZWN0LmFsbChieS5jc3MoJ29wdGlvbicpKS5nZXQoMikuY2xpY2soKTsKKyAgICAgICAgZXhwZWN0KGluY2x1ZGVFbGVtLmdldFRleHQoKSkudG9NYXRjaCgvQ29udGVudCBvZiB0ZW1wbGF0ZTIuaHRtbC8pOworICAgICAgfSk7CisKKyAgICAgIGl0KCdzaG91bGQgY2hhbmdlIHRvIGJsYW5rJywgZnVuY3Rpb24oKSB7CisgICAgICAgIGlmIChicm93c2VyLnBhcmFtcy5icm93c2VyID09ICdmaXJlZm94JykgeworICAgICAgICAgIC8vIEZpcmVmb3ggY2FuJ3QgaGFuZGxlIHVzaW5nIHNlbGVjdHMKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGVTZWxlY3QuY2xpY2soKTsKKyAgICAgICAgdGVtcGxhdGVTZWxlY3QuYWxsKGJ5LmNzcygnb3B0aW9uJykpLmdldCgwKS5jbGljaygpOworICAgICAgICBleHBlY3QoaW5jbHVkZUVsZW0uaXNQcmVzZW50KCkpLnRvQmUoZmFsc2UpOworICAgICAgfSk7CisgICAgPC9maWxlPgorICA8L2V4YW1wbGU+CisgKi8KKworCisvKioKKyAqIEBuZ2RvYyBldmVudAorICogQG5hbWUgbmdJbmNsdWRlIyRpbmNsdWRlQ29udGVudFJlcXVlc3RlZAorICogQGV2ZW50VHlwZSBlbWl0IG9uIHRoZSBzY29wZSBuZ0luY2x1ZGUgd2FzIGRlY2xhcmVkIGluCisgKiBAZGVzY3JpcHRpb24KKyAqIEVtaXR0ZWQgZXZlcnkgdGltZSB0aGUgbmdJbmNsdWRlIGNvbnRlbnQgaXMgcmVxdWVzdGVkLgorICoKKyAqIEBwYXJhbSB7T2JqZWN0fSBhbmd1bGFyRXZlbnQgU3ludGhldGljIGV2ZW50IG9iamVjdC4KKyAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgVVJMIG9mIGNvbnRlbnQgdG8gbG9hZC4KKyAqLworCisKKy8qKgorICogQG5nZG9jIGV2ZW50CisgKiBAbmFtZSBuZ0luY2x1ZGUjJGluY2x1ZGVDb250ZW50TG9hZGVkCisgKiBAZXZlbnRUeXBlIGVtaXQgb24gdGhlIGN1cnJlbnQgbmdJbmNsdWRlIHNjb3BlCisgKiBAZGVzY3JpcHRpb24KKyAqIEVtaXR0ZWQgZXZlcnkgdGltZSB0aGUgbmdJbmNsdWRlIGNvbnRlbnQgaXMgcmVsb2FkZWQuCisgKgorICogQHBhcmFtIHtPYmplY3R9IGFuZ3VsYXJFdmVudCBTeW50aGV0aWMgZXZlbnQgb2JqZWN0LgorICogQHBhcmFtIHtTdHJpbmd9IHNyYyBVUkwgb2YgY29udGVudCB0byBsb2FkLgorICovCisKKworLyoqCisgKiBAbmdkb2MgZXZlbnQKKyAqIEBuYW1lIG5nSW5jbHVkZSMkaW5jbHVkZUNvbnRlbnRFcnJvcgorICogQGV2ZW50VHlwZSBlbWl0IG9uIHRoZSBzY29wZSBuZ0luY2x1ZGUgd2FzIGRlY2xhcmVkIGluCisgKiBAZGVzY3JpcHRpb24KKyAqIEVtaXR0ZWQgd2hlbiBhIHRlbXBsYXRlIEhUVFAgcmVxdWVzdCB5aWVsZHMgYW4gZXJyb25vdXMgcmVzcG9uc2UgKHN0YXR1cyA8IDIwMCB8fCBzdGF0dXMgPiAyOTkpCisgKgorICogQHBhcmFtIHtPYmplY3R9IGFuZ3VsYXJFdmVudCBTeW50aGV0aWMgZXZlbnQgb2JqZWN0LgorICogQHBhcmFtIHtTdHJpbmd9IHNyYyBVUkwgb2YgY29udGVudCB0byBsb2FkLgorICovCit2YXIgbmdJbmNsdWRlRGlyZWN0aXZlID0gWyckdGVtcGxhdGVSZXF1ZXN0JywgJyRhbmNob3JTY3JvbGwnLCAnJGFuaW1hdGUnLCAnJHNjZScsCisgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkdGVtcGxhdGVSZXF1ZXN0LCAgICRhbmNob3JTY3JvbGwsICAgJGFuaW1hdGUsICAgJHNjZSkgeworICByZXR1cm4geworICAgIHJlc3RyaWN0OiAnRUNBJywKKyAgICBwcmlvcml0eTogNDAwLAorICAgIHRlcm1pbmFsOiB0cnVlLAorICAgIHRyYW5zY2x1ZGU6ICdlbGVtZW50JywKKyAgICBjb250cm9sbGVyOiBhbmd1bGFyLm5vb3AsCisgICAgY29tcGlsZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cikgeworICAgICAgdmFyIHNyY0V4cCA9IGF0dHIubmdJbmNsdWRlIHx8IGF0dHIuc3JjLAorICAgICAgICAgIG9ubG9hZEV4cCA9IGF0dHIub25sb2FkIHx8ICcnLAorICAgICAgICAgIGF1dG9TY3JvbGxFeHAgPSBhdHRyLmF1dG9zY3JvbGw7CisKKyAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgJGVsZW1lbnQsICRhdHRyLCBjdHJsLCAkdHJhbnNjbHVkZSkgeworICAgICAgICB2YXIgY2hhbmdlQ291bnRlciA9IDAsCisgICAgICAgICAgICBjdXJyZW50U2NvcGUsCisgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQsCisgICAgICAgICAgICBjdXJyZW50RWxlbWVudDsKKworICAgICAgICB2YXIgY2xlYW51cExhc3RJbmNsdWRlQ29udGVudCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQpIHsKKyAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudC5yZW1vdmUoKTsKKyAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudCA9IG51bGw7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjdXJyZW50U2NvcGUpIHsKKyAgICAgICAgICAgIGN1cnJlbnRTY29wZS4kZGVzdHJveSgpOworICAgICAgICAgICAgY3VycmVudFNjb3BlID0gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50KSB7CisgICAgICAgICAgICAkYW5pbWF0ZS5sZWF2ZShjdXJyZW50RWxlbWVudCkudGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50ID0gY3VycmVudEVsZW1lbnQ7CisgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHNjb3BlLiR3YXRjaCgkc2NlLnBhcnNlQXNSZXNvdXJjZVVybChzcmNFeHApLCBmdW5jdGlvbiBuZ0luY2x1ZGVXYXRjaEFjdGlvbihzcmMpIHsKKyAgICAgICAgICB2YXIgYWZ0ZXJBbmltYXRpb24gPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChpc0RlZmluZWQoYXV0b1Njcm9sbEV4cCkgJiYgKCFhdXRvU2Nyb2xsRXhwIHx8IHNjb3BlLiRldmFsKGF1dG9TY3JvbGxFeHApKSkgeworICAgICAgICAgICAgICAkYW5jaG9yU2Nyb2xsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgICB2YXIgdGhpc0NoYW5nZUlkID0gKytjaGFuZ2VDb3VudGVyOworCisgICAgICAgICAgaWYgKHNyYykgeworICAgICAgICAgICAgLy9zZXQgdGhlIDJuZCBwYXJhbSB0byB0cnVlIHRvIGlnbm9yZSB0aGUgdGVtcGxhdGUgcmVxdWVzdCBlcnJvciBzbyB0aGF0IHRoZSBpbm5lcgorICAgICAgICAgICAgLy9jb250ZW50cyBhbmQgc2NvcGUgY2FuIGJlIGNsZWFuZWQgdXAuCisgICAgICAgICAgICAkdGVtcGxhdGVSZXF1ZXN0KHNyYywgdHJ1ZSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICAgICAgICBpZiAodGhpc0NoYW5nZUlkICE9PSBjaGFuZ2VDb3VudGVyKSByZXR1cm47CisgICAgICAgICAgICAgIHZhciBuZXdTY29wZSA9IHNjb3BlLiRuZXcoKTsKKyAgICAgICAgICAgICAgY3RybC50ZW1wbGF0ZSA9IHJlc3BvbnNlOworCisgICAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBhbHNvIGxpbmsgYWxsIGNoaWxkcmVuIG9mIG5nLWluY2x1ZGUgdGhhdCB3ZXJlIGNvbnRhaW5lZCBpbiB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgICAgLy8gaHRtbC4gSWYgdGhhdCBjb250ZW50IGNvbnRhaW5zIGNvbnRyb2xsZXJzLCAuLi4gdGhleSBjb3VsZCBwb2xsdXRlL2NoYW5nZSB0aGUgc2NvcGUuCisgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHVzaW5nIG5nLWluY2x1ZGUgb24gYW4gZWxlbWVudCB3aXRoIGFkZGl0aW9uYWwgY29udGVudCBkb2VzIG5vdCBtYWtlIHNlbnNlLi4uCisgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIGNhbid0IHJlbW92ZSB0aGVtIGluIHRoZSBjbG9uZUF0dGNoRm4gb2YgJHRyYW5zY2x1ZGUgYXMgdGhhdAorICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGxpbmtpbmcgdGhlIGNvbnRlbnQsIHdoaWNoIHdvdWxkIGFwcGx5IGNoaWxkCisgICAgICAgICAgICAgIC8vIGRpcmVjdGl2ZXMgdG8gbm9uIGV4aXN0aW5nIGVsZW1lbnRzLgorICAgICAgICAgICAgICB2YXIgY2xvbmUgPSAkdHJhbnNjbHVkZShuZXdTY29wZSwgZnVuY3Rpb24oY2xvbmUpIHsKKyAgICAgICAgICAgICAgICBjbGVhbnVwTGFzdEluY2x1ZGVDb250ZW50KCk7CisgICAgICAgICAgICAgICAgJGFuaW1hdGUuZW50ZXIoY2xvbmUsIG51bGwsICRlbGVtZW50KS50aGVuKGFmdGVyQW5pbWF0aW9uKTsKKyAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgY3VycmVudFNjb3BlID0gbmV3U2NvcGU7CisgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY2xvbmU7CisKKyAgICAgICAgICAgICAgY3VycmVudFNjb3BlLiRlbWl0KCckaW5jbHVkZUNvbnRlbnRMb2FkZWQnLCBzcmMpOworICAgICAgICAgICAgICBzY29wZS4kZXZhbChvbmxvYWRFeHApOworICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgIGlmICh0aGlzQ2hhbmdlSWQgPT09IGNoYW5nZUNvdW50ZXIpIHsKKyAgICAgICAgICAgICAgICBjbGVhbnVwTGFzdEluY2x1ZGVDb250ZW50KCk7CisgICAgICAgICAgICAgICAgc2NvcGUuJGVtaXQoJyRpbmNsdWRlQ29udGVudEVycm9yJywgc3JjKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzY29wZS4kZW1pdCgnJGluY2x1ZGVDb250ZW50UmVxdWVzdGVkJywgc3JjKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xlYW51cExhc3RJbmNsdWRlQ29udGVudCgpOworICAgICAgICAgICAgY3RybC50ZW1wbGF0ZSA9IG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH07CisgICAgfQorICB9OworfV07CisKKy8vIFRoaXMgZGlyZWN0aXZlIGlzIGNhbGxlZCBkdXJpbmcgdGhlICR0cmFuc2NsdWRlIGNhbGwgb2YgdGhlIGZpcnN0IGBuZ0luY2x1ZGVgIGRpcmVjdGl2ZS4KKy8vIEl0IHdpbGwgcmVwbGFjZSBhbmQgY29tcGlsZSB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCB3aXRoIHRoZSBsb2FkZWQgdGVtcGxhdGUuCisvLyBXZSBuZWVkIHRoaXMgZGlyZWN0aXZlIHNvIHRoYXQgdGhlIGVsZW1lbnQgY29udGVudCBpcyBhbHJlYWR5IGZpbGxlZCB3aGVuCisvLyB0aGUgbGluayBmdW5jdGlvbiBvZiBhbm90aGVyIGRpcmVjdGl2ZSBvbiB0aGUgc2FtZSBlbGVtZW50IGFzIG5nSW5jbHVkZQorLy8gaXMgY2FsbGVkLgordmFyIG5nSW5jbHVkZUZpbGxDb250ZW50RGlyZWN0aXZlID0gWyckY29tcGlsZScsCisgIGZ1bmN0aW9uKCRjb21waWxlKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIHJlc3RyaWN0OiAnRUNBJywKKyAgICAgIHByaW9yaXR5OiAtNDAwLAorICAgICAgcmVxdWlyZTogJ25nSW5jbHVkZScsCisgICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgJGVsZW1lbnQsICRhdHRyLCBjdHJsKSB7CisgICAgICAgIGlmICgvU1ZHLy50ZXN0KCRlbGVtZW50WzBdLnRvU3RyaW5nKCkpKSB7CisgICAgICAgICAgLy8gV2ViS2l0OiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM1Njk4IC0tLSBTVkcgZWxlbWVudHMgZG8gbm90CisgICAgICAgICAgLy8gc3VwcG9ydCBpbm5lckhUTUwsIHNvIGRldGVjdCB0aGlzIGhlcmUgYW5kIHRyeSB0byBnZW5lcmF0ZSB0aGUgY29udGVudHMKKyAgICAgICAgICAvLyBzcGVjaWFsbHkuCisgICAgICAgICAgJGVsZW1lbnQuZW1wdHkoKTsKKyAgICAgICAgICAkY29tcGlsZShqcUxpdGVCdWlsZEZyYWdtZW50KGN0cmwudGVtcGxhdGUsIGRvY3VtZW50KS5jaGlsZE5vZGVzKShzY29wZSwKKyAgICAgICAgICAgICAgZnVuY3Rpb24gbmFtZXNwYWNlQWRhcHRlZENsb25lKGNsb25lKSB7CisgICAgICAgICAgICAkZWxlbWVudC5hcHBlbmQoY2xvbmUpOworICAgICAgICAgIH0sIHtmdXR1cmVQYXJlbnRFbGVtZW50OiAkZWxlbWVudH0pOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgICRlbGVtZW50Lmh0bWwoY3RybC50ZW1wbGF0ZSk7CisgICAgICAgICRjb21waWxlKCRlbGVtZW50LmNvbnRlbnRzKCkpKHNjb3BlKTsKKyAgICAgIH0KKyAgICB9OworICB9XTsKKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ0luaXQKKyAqIEByZXN0cmljdCBBQworICoKKyAqIEBkZXNjcmlwdGlvbgorICogVGhlIGBuZ0luaXRgIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIGV2YWx1YXRlIGFuIGV4cHJlc3Npb24gaW4gdGhlCisgKiBjdXJyZW50IHNjb3BlLgorICoKKyAqIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWVycm9yIj4KKyAqIFRoZSBvbmx5IGFwcHJvcHJpYXRlIHVzZSBvZiBgbmdJbml0YCBpcyBmb3IgYWxpYXNpbmcgc3BlY2lhbCBwcm9wZXJ0aWVzIG9mCisgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nUmVwZWF0IGBuZ1JlcGVhdGB9LCBhcyBzZWVuIGluIHRoZSBkZW1vIGJlbG93LiBCZXNpZGVzIHRoaXMgY2FzZSwgeW91CisgKiBzaG91bGQgdXNlIHtAbGluayBndWlkZS9jb250cm9sbGVyIGNvbnRyb2xsZXJzfSByYXRoZXIgdGhhbiBgbmdJbml0YAorICogdG8gaW5pdGlhbGl6ZSB2YWx1ZXMgb24gYSBzY29wZS4KKyAqIDwvZGl2PgorICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+CisgKiAqKk5vdGUqKjogSWYgeW91IGhhdmUgYXNzaWdubWVudCBpbiBgbmdJbml0YCBhbG9uZyB3aXRoIHtAbGluayBuZy4kZmlsdGVyIGAkZmlsdGVyYH0sIG1ha2UKKyAqIHN1cmUgeW91IGhhdmUgcGFyZW50aGVzaXMgZm9yIGNvcnJlY3QgcHJlY2VkZW5jZToKKyAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKyAqICAgPGRpdiBuZy1pbml0PSJ0ZXN0MSA9IChkYXRhIHwgb3JkZXJCeTonbmFtZScpIj48L2Rpdj4KKyAqIDwvcHJlPgorICogPC9kaXY+CisgKgorICogQHByaW9yaXR5IDQ1MAorICoKKyAqIEBlbGVtZW50IEFOWQorICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0luaXQge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbC4KKyAqCisgKiBAZXhhbXBsZQorICAgPGV4YW1wbGUgbW9kdWxlPSJpbml0RXhhbXBsZSI+CisgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgPHNjcmlwdD4KKyAgICAgYW5ndWxhci5tb2R1bGUoJ2luaXRFeGFtcGxlJywgW10pCisgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAgICAgICAgICRzY29wZS5saXN0ID0gW1snYScsICdiJ10sIFsnYycsICdkJ11dOworICAgICAgIH1dKTsKKyAgIDwvc2NyaXB0PgorICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgICAgIDxkaXYgbmctcmVwZWF0PSJpbm5lckxpc3QgaW4gbGlzdCIgbmctaW5pdD0ib3V0ZXJJbmRleCA9ICRpbmRleCI+CisgICAgICAgPGRpdiBuZy1yZXBlYXQ9InZhbHVlIGluIGlubmVyTGlzdCIgbmctaW5pdD0iaW5uZXJJbmRleCA9ICRpbmRleCI+CisgICAgICAgICAgPHNwYW4gY2xhc3M9ImV4YW1wbGUtaW5pdCI+bGlzdFsge3tvdXRlckluZGV4fX0gXVsge3tpbm5lckluZGV4fX0gXSA9IHt7dmFsdWV9fTs8L3NwYW4+CisgICAgICAgPC9kaXY+CisgICAgIDwvZGl2PgorICAgPC9kaXY+CisgICAgIDwvZmlsZT4KKyAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgaXQoJ3Nob3VsZCBhbGlhcyBpbmRleCBwb3NpdGlvbnMnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgIHZhciBlbGVtZW50cyA9IGVsZW1lbnQuYWxsKGJ5LmNzcygnLmV4YW1wbGUtaW5pdCcpKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50cy5nZXQoMCkuZ2V0VGV4dCgpKS50b0JlKCdsaXN0WyAwIF1bIDAgXSA9IGE7Jyk7CisgICAgICAgICBleHBlY3QoZWxlbWVudHMuZ2V0KDEpLmdldFRleHQoKSkudG9CZSgnbGlzdFsgMCBdWyAxIF0gPSBiOycpOworICAgICAgICAgZXhwZWN0KGVsZW1lbnRzLmdldCgyKS5nZXRUZXh0KCkpLnRvQmUoJ2xpc3RbIDEgXVsgMCBdID0gYzsnKTsKKyAgICAgICAgIGV4cGVjdChlbGVtZW50cy5nZXQoMykuZ2V0VGV4dCgpKS50b0JlKCdsaXN0WyAxIF1bIDEgXSA9IGQ7Jyk7CisgICAgICAgfSk7CisgICAgIDwvZmlsZT4KKyAgIDwvZXhhbXBsZT4KKyAqLwordmFyIG5nSW5pdERpcmVjdGl2ZSA9IG5nRGlyZWN0aXZlKHsKKyAgcHJpb3JpdHk6IDQ1MCwKKyAgY29tcGlsZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIHByZTogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7CisgICAgICAgIHNjb3BlLiRldmFsKGF0dHJzLm5nSW5pdCk7CisgICAgICB9CisgICAgfTsKKyAgfQorfSk7CisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdOb25CaW5kYWJsZQorICogQHJlc3RyaWN0IEFDCisgKiBAcHJpb3JpdHkgMTAwMAorICoKKyAqIEBkZXNjcmlwdGlvbgorICogVGhlIGBuZ05vbkJpbmRhYmxlYCBkaXJlY3RpdmUgdGVsbHMgQW5ndWxhciBub3QgdG8gY29tcGlsZSBvciBiaW5kIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudAorICogRE9NIGVsZW1lbnQuIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIHdoYXQgYXBwZWFycyB0byBiZSBBbmd1bGFyIGRpcmVjdGl2ZXMgYW5kCisgKiBiaW5kaW5ncyBidXQgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQgYnkgQW5ndWxhci4gVGhpcyBjb3VsZCBiZSB0aGUgY2FzZSBpZiB5b3UgaGF2ZSBhIHNpdGUgdGhhdAorICogZGlzcGxheXMgc25pcHBldHMgb2YgY29kZSwgZm9yIGluc3RhbmNlLgorICoKKyAqIEBlbGVtZW50IEFOWQorICoKKyAqIEBleGFtcGxlCisgKiBJbiB0aGlzIGV4YW1wbGUgdGhlcmUgYXJlIHR3byBsb2NhdGlvbnMgd2hlcmUgYSBzaW1wbGUgaW50ZXJwb2xhdGlvbiBiaW5kaW5nIChge3t9fWApIGlzIHByZXNlbnQsCisgKiBidXQgdGhlIG9uZSB3cmFwcGVkIGluIGBuZ05vbkJpbmRhYmxlYCBpcyBsZWZ0IGFsb25lLgorICoKKyAqIEBleGFtcGxlCisgICAgPGV4YW1wbGU+CisgICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICAgPGRpdj5Ob3JtYWw6IHt7MSArIDJ9fTwvZGl2PgorICAgICAgICA8ZGl2IG5nLW5vbi1iaW5kYWJsZT5JZ25vcmVkOiB7ezEgKyAyfX08L2Rpdj4KKyAgICAgIDwvZmlsZT4KKyAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctbm9uLWJpbmRhYmxlJywgZnVuY3Rpb24oKSB7CisgICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCcxICsgMicpKS5nZXRUZXh0KCkpLnRvQ29udGFpbignMycpOworICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKGJ5LmNzcygnZGl2JykpLmxhc3QoKS5nZXRUZXh0KCkpLnRvTWF0Y2goLzEgXCsgMi8pOworICAgICAgIH0pOworICAgICAgPC9maWxlPgorICAgIDwvZXhhbXBsZT4KKyAqLwordmFyIG5nTm9uQmluZGFibGVEaXJlY3RpdmUgPSBuZ0RpcmVjdGl2ZSh7IHRlcm1pbmFsOiB0cnVlLCBwcmlvcml0eTogMTAwMCB9KTsKKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ1BsdXJhbGl6ZQorICogQHJlc3RyaWN0IEVBCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBgbmdQbHVyYWxpemVgIGlzIGEgZGlyZWN0aXZlIHRoYXQgZGlzcGxheXMgbWVzc2FnZXMgYWNjb3JkaW5nIHRvIGVuLVVTIGxvY2FsaXphdGlvbiBydWxlcy4KKyAqIFRoZXNlIHJ1bGVzIGFyZSBidW5kbGVkIHdpdGggYW5ndWxhci5qcywgYnV0IGNhbiBiZSBvdmVycmlkZGVuCisgKiAoc2VlIHtAbGluayBndWlkZS9pMThuIEFuZ3VsYXIgaTE4bn0gZGV2IGd1aWRlKS4gWW91IGNvbmZpZ3VyZSBuZ1BsdXJhbGl6ZSBkaXJlY3RpdmUKKyAqIGJ5IHNwZWNpZnlpbmcgdGhlIG1hcHBpbmdzIGJldHdlZW4KKyAqIFtwbHVyYWwgY2F0ZWdvcmllc10oaHR0cDovL3VuaWNvZGUub3JnL3JlcG9zL2NsZHItdG1wL3RydW5rL2RpZmYvc3VwcGxlbWVudGFsL2xhbmd1YWdlX3BsdXJhbF9ydWxlcy5odG1sKQorICogYW5kIHRoZSBzdHJpbmdzIHRvIGJlIGRpc3BsYXllZC4KKyAqCisgKiAjIFBsdXJhbCBjYXRlZ29yaWVzIGFuZCBleHBsaWNpdCBudW1iZXIgcnVsZXMKKyAqIFRoZXJlIGFyZSB0d28KKyAqIFtwbHVyYWwgY2F0ZWdvcmllc10oaHR0cDovL3VuaWNvZGUub3JnL3JlcG9zL2NsZHItdG1wL3RydW5rL2RpZmYvc3VwcGxlbWVudGFsL2xhbmd1YWdlX3BsdXJhbF9ydWxlcy5odG1sKQorICogaW4gQW5ndWxhcidzIGRlZmF1bHQgZW4tVVMgbG9jYWxlOiAib25lIiBhbmQgIm90aGVyIi4KKyAqCisgKiBXaGlsZSBhIHBsdXJhbCBjYXRlZ29yeSBtYXkgbWF0Y2ggbWFueSBudW1iZXJzIChmb3IgZXhhbXBsZSwgaW4gZW4tVVMgbG9jYWxlLCAib3RoZXIiIGNhbiBtYXRjaAorICogYW55IG51bWJlciB0aGF0IGlzIG5vdCAxKSwgYW4gZXhwbGljaXQgbnVtYmVyIHJ1bGUgY2FuIG9ubHkgbWF0Y2ggb25lIG51bWJlci4gRm9yIGV4YW1wbGUsIHRoZQorICogZXhwbGljaXQgbnVtYmVyIHJ1bGUgZm9yICIzIiBtYXRjaGVzIHRoZSBudW1iZXIgMy4gVGhlcmUgYXJlIGV4YW1wbGVzIG9mIHBsdXJhbCBjYXRlZ29yaWVzCisgKiBhbmQgZXhwbGljaXQgbnVtYmVyIHJ1bGVzIHRocm91Z2hvdXQgdGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudGF0aW9uLgorICoKKyAqICMgQ29uZmlndXJpbmcgbmdQbHVyYWxpemUKKyAqIFlvdSBjb25maWd1cmUgbmdQbHVyYWxpemUgYnkgcHJvdmlkaW5nIDIgYXR0cmlidXRlczogYGNvdW50YCBhbmQgYHdoZW5gLgorICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gb3B0aW9uYWwgYXR0cmlidXRlLCBgb2Zmc2V0YC4KKyAqCisgKiBUaGUgdmFsdWUgb2YgdGhlIGBjb3VudGAgYXR0cmlidXRlIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4ge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24KKyAqIEFuZ3VsYXIgZXhwcmVzc2lvbn07IHRoZXNlIGFyZSBldmFsdWF0ZWQgb24gdGhlIGN1cnJlbnQgc2NvcGUgZm9yIGl0cyBib3VuZCB2YWx1ZS4KKyAqCisgKiBUaGUgYHdoZW5gIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIG1hcHBpbmdzIGJldHdlZW4gcGx1cmFsIGNhdGVnb3JpZXMgYW5kIHRoZSBhY3R1YWwKKyAqIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQuIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSBhIEpTT04gb2JqZWN0LgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gY29uZmlndXJlIG5nUGx1cmFsaXplOgorICoKKyAqIGBgYGh0bWwKKyAqIDxuZy1wbHVyYWxpemUgY291bnQ9InBlcnNvbkNvdW50IgorICAgICAgICAgICAgICAgICB3aGVuPSJ7JzAnOiAnTm9ib2R5IGlzIHZpZXdpbmcuJywKKyAqICAgICAgICAgICAgICAgICAgICAgICdvbmUnOiAnMSBwZXJzb24gaXMgdmlld2luZy4nLAorICogICAgICAgICAgICAgICAgICAgICAgJ290aGVyJzogJ3t9IHBlb3BsZSBhcmUgdmlld2luZy4nfSI+CisgKiA8L25nLXBsdXJhbGl6ZT4KKyAqYGBgCisgKgorICogSW4gdGhlIGV4YW1wbGUsIGAiMDogTm9ib2R5IGlzIHZpZXdpbmcuImAgaXMgYW4gZXhwbGljaXQgbnVtYmVyIHJ1bGUuIElmIHlvdSBkaWQgbm90CisgKiBzcGVjaWZ5IHRoaXMgcnVsZSwgMCB3b3VsZCBiZSBtYXRjaGVkIHRvIHRoZSAib3RoZXIiIGNhdGVnb3J5IGFuZCAiMCBwZW9wbGUgYXJlIHZpZXdpbmciCisgKiB3b3VsZCBiZSBzaG93biBpbnN0ZWFkIG9mICJOb2JvZHkgaXMgdmlld2luZyIuIFlvdSBjYW4gc3BlY2lmeSBhbiBleHBsaWNpdCBudW1iZXIgcnVsZSBmb3IKKyAqIG90aGVyIG51bWJlcnMsIGZvciBleGFtcGxlIDEyLCBzbyB0aGF0IGluc3RlYWQgb2Ygc2hvd2luZyAiMTIgcGVvcGxlIGFyZSB2aWV3aW5nIiwgeW91IGNhbgorICogc2hvdyAiYSBkb3plbiBwZW9wbGUgYXJlIHZpZXdpbmciLgorICoKKyAqIFlvdSBjYW4gdXNlIGEgc2V0IG9mIGNsb3NlZCBicmFjZXMgKGB7fWApIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBudW1iZXIgdGhhdCB5b3Ugd2FudCBzdWJzdGl0dXRlZAorICogaW50byBwbHVyYWxpemVkIHN0cmluZ3MuIEluIHRoZSBwcmV2aW91cyBleGFtcGxlLCBBbmd1bGFyIHdpbGwgcmVwbGFjZSBge31gIHdpdGgKKyAqIDxzcGFuIG5nLW5vbi1iaW5kYWJsZT5ge3twZXJzb25Db3VudH19YDwvc3Bhbj4uIFRoZSBjbG9zZWQgYnJhY2VzIGB7fWAgaXMgYSBwbGFjZWhvbGRlcgorICogZm9yIDxzcGFuIG5nLW5vbi1iaW5kYWJsZT57e251bWJlckV4cHJlc3Npb259fTwvc3Bhbj4uCisgKgorICogIyBDb25maWd1cmluZyBuZ1BsdXJhbGl6ZSB3aXRoIG9mZnNldAorICogVGhlIGBvZmZzZXRgIGF0dHJpYnV0ZSBhbGxvd3MgZnVydGhlciBjdXN0b21pemF0aW9uIG9mIHBsdXJhbGl6ZWQgdGV4dCwgd2hpY2ggY2FuIHJlc3VsdCBpbgorICogYSBiZXR0ZXIgdXNlciBleHBlcmllbmNlLiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiB0aGUgbWVzc2FnZSAiNCBwZW9wbGUgYXJlIHZpZXdpbmcgdGhpcyBkb2N1bWVudCIsCisgKiB5b3UgbWlnaHQgZGlzcGxheSAiSm9obiwgS2F0ZSBhbmQgMiBvdGhlcnMgYXJlIHZpZXdpbmcgdGhpcyBkb2N1bWVudCIuCisgKiBUaGUgb2Zmc2V0IGF0dHJpYnV0ZSBhbGxvd3MgeW91IHRvIG9mZnNldCBhIG51bWJlciBieSBhbnkgZGVzaXJlZCB2YWx1ZS4KKyAqIExldCdzIHRha2UgYSBsb29rIGF0IGFuIGV4YW1wbGU6CisgKgorICogYGBgaHRtbAorICogPG5nLXBsdXJhbGl6ZSBjb3VudD0icGVyc29uQ291bnQiIG9mZnNldD0yCisgKiAgICAgICAgICAgICAgIHdoZW49InsnMCc6ICdOb2JvZHkgaXMgdmlld2luZy4nLAorICogICAgICAgICAgICAgICAgICAgICAgJzEnOiAne3twZXJzb24xfX0gaXMgdmlld2luZy4nLAorICogICAgICAgICAgICAgICAgICAgICAgJzInOiAne3twZXJzb24xfX0gYW5kIHt7cGVyc29uMn19IGFyZSB2aWV3aW5nLicsCisgKiAgICAgICAgICAgICAgICAgICAgICAnb25lJzogJ3t7cGVyc29uMX19LCB7e3BlcnNvbjJ9fSBhbmQgb25lIG90aGVyIHBlcnNvbiBhcmUgdmlld2luZy4nLAorICogICAgICAgICAgICAgICAgICAgICAgJ290aGVyJzogJ3t7cGVyc29uMX19LCB7e3BlcnNvbjJ9fSBhbmQge30gb3RoZXIgcGVvcGxlIGFyZSB2aWV3aW5nLid9Ij4KKyAqIDwvbmctcGx1cmFsaXplPgorICogYGBgCisgKgorICogTm90aWNlIHRoYXQgd2UgYXJlIHN0aWxsIHVzaW5nIHR3byBwbHVyYWwgY2F0ZWdvcmllcyhvbmUsIG90aGVyKSwgYnV0IHdlIGFkZGVkCisgKiB0aHJlZSBleHBsaWNpdCBudW1iZXIgcnVsZXMgMCwgMSBhbmQgMi4KKyAqIFdoZW4gb25lIHBlcnNvbiwgcGVyaGFwcyBKb2huLCB2aWV3cyB0aGUgZG9jdW1lbnQsICJKb2huIGlzIHZpZXdpbmciIHdpbGwgYmUgc2hvd24uCisgKiBXaGVuIHRocmVlIHBlb3BsZSB2aWV3IHRoZSBkb2N1bWVudCwgbm8gZXhwbGljaXQgbnVtYmVyIHJ1bGUgaXMgZm91bmQsIHNvCisgKiBhbiBvZmZzZXQgb2YgMiBpcyB0YWtlbiBvZmYgMywgYW5kIEFuZ3VsYXIgdXNlcyAxIHRvIGRlY2lkZSB0aGUgcGx1cmFsIGNhdGVnb3J5LgorICogSW4gdGhpcyBjYXNlLCBwbHVyYWwgY2F0ZWdvcnkgJ29uZScgaXMgbWF0Y2hlZCBhbmQgIkpvaG4sIE1hcnkgYW5kIG9uZSBvdGhlciBwZXJzb24gYXJlIHZpZXdpbmciCisgKiBpcyBzaG93bi4KKyAqCisgKiBOb3RlIHRoYXQgd2hlbiB5b3Ugc3BlY2lmeSBvZmZzZXRzLCB5b3UgbXVzdCBwcm92aWRlIGV4cGxpY2l0IG51bWJlciBydWxlcyBmb3IKKyAqIG51bWJlcnMgZnJvbSAwIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIG9mZnNldC4gSWYgeW91IHVzZSBhbiBvZmZzZXQgb2YgMywgZm9yIGV4YW1wbGUsCisgKiB5b3UgbXVzdCBwcm92aWRlIGV4cGxpY2l0IG51bWJlciBydWxlcyBmb3IgMCwgMSwgMiBhbmQgMy4gWW91IG11c3QgYWxzbyBwcm92aWRlIHBsdXJhbCBzdHJpbmdzIGZvcgorICogcGx1cmFsIGNhdGVnb3JpZXMgIm9uZSIgYW5kICJvdGhlciIuCisgKgorICogQHBhcmFtIHtzdHJpbmd8ZXhwcmVzc2lvbn0gY291bnQgVGhlIHZhcmlhYmxlIHRvIGJlIGJvdW5kIHRvLgorICogQHBhcmFtIHtzdHJpbmd9IHdoZW4gVGhlIG1hcHBpbmcgYmV0d2VlbiBwbHVyYWwgY2F0ZWdvcnkgdG8gaXRzIGNvcnJlc3BvbmRpbmcgc3RyaW5ncy4KKyAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byBkZWR1Y3QgZnJvbSB0aGUgdG90YWwgbnVtYmVyLgorICoKKyAqIEBleGFtcGxlCisgICAgPGV4YW1wbGUgbW9kdWxlPSJwbHVyYWxpemVFeGFtcGxlIj4KKyAgICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgICA8c2NyaXB0PgorICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdwbHVyYWxpemVFeGFtcGxlJywgW10pCisgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgICAgICAgICAkc2NvcGUucGVyc29uMSA9ICdJZ29yJzsKKyAgICAgICAgICAgICAgJHNjb3BlLnBlcnNvbjIgPSAnTWlza28nOworICAgICAgICAgICAgICAkc2NvcGUucGVyc29uQ291bnQgPSAxOworICAgICAgICAgICAgfV0pOworICAgICAgICA8L3NjcmlwdD4KKyAgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgICAgICAgICAgUGVyc29uIDE6PGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJwZXJzb24xIiB2YWx1ZT0iSWdvciIgLz48YnIvPgorICAgICAgICAgIFBlcnNvbiAyOjxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0icGVyc29uMiIgdmFsdWU9Ik1pc2tvIiAvPjxici8+CisgICAgICAgICAgTnVtYmVyIG9mIFBlb3BsZTo8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InBlcnNvbkNvdW50IiB2YWx1ZT0iMSIgLz48YnIvPgorCisgICAgICAgICAgPCEtLS0gRXhhbXBsZSB3aXRoIHNpbXBsZSBwbHVyYWxpemF0aW9uIHJ1bGVzIGZvciBlbiBsb2NhbGUgLS0tPgorICAgICAgICAgIFdpdGhvdXQgT2Zmc2V0OgorICAgICAgICAgIDxuZy1wbHVyYWxpemUgY291bnQ9InBlcnNvbkNvdW50IgorICAgICAgICAgICAgICAgICAgICAgICAgd2hlbj0ieycwJzogJ05vYm9keSBpcyB2aWV3aW5nLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uZSc6ICcxIHBlcnNvbiBpcyB2aWV3aW5nLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ290aGVyJzogJ3t9IHBlb3BsZSBhcmUgdmlld2luZy4nfSI+CisgICAgICAgICAgPC9uZy1wbHVyYWxpemU+PGJyPgorCisgICAgICAgICAgPCEtLS0gRXhhbXBsZSB3aXRoIG9mZnNldCAtLS0+CisgICAgICAgICAgV2l0aCBPZmZzZXQoMik6CisgICAgICAgICAgPG5nLXBsdXJhbGl6ZSBjb3VudD0icGVyc29uQ291bnQiIG9mZnNldD0yCisgICAgICAgICAgICAgICAgICAgICAgICB3aGVuPSJ7JzAnOiAnTm9ib2R5IGlzIHZpZXdpbmcuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMSc6ICd7e3BlcnNvbjF9fSBpcyB2aWV3aW5nLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzInOiAne3twZXJzb24xfX0gYW5kIHt7cGVyc29uMn19IGFyZSB2aWV3aW5nLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uZSc6ICd7e3BlcnNvbjF9fSwge3twZXJzb24yfX0gYW5kIG9uZSBvdGhlciBwZXJzb24gYXJlIHZpZXdpbmcuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3RoZXInOiAne3twZXJzb24xfX0sIHt7cGVyc29uMn19IGFuZCB7fSBvdGhlciBwZW9wbGUgYXJlIHZpZXdpbmcuJ30iPgorICAgICAgICAgIDwvbmctcGx1cmFsaXplPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZmlsZT4KKyAgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgICBpdCgnc2hvdWxkIHNob3cgY29ycmVjdCBwbHVyYWxpemVkIHN0cmluZycsIGZ1bmN0aW9uKCkgeworICAgICAgICAgIHZhciB3aXRob3V0T2Zmc2V0ID0gZWxlbWVudC5hbGwoYnkuY3NzKCduZy1wbHVyYWxpemUnKSkuZ2V0KDApOworICAgICAgICAgIHZhciB3aXRoT2Zmc2V0ID0gZWxlbWVudC5hbGwoYnkuY3NzKCduZy1wbHVyYWxpemUnKSkuZ2V0KDEpOworICAgICAgICAgIHZhciBjb3VudElucHV0ID0gZWxlbWVudChieS5tb2RlbCgncGVyc29uQ291bnQnKSk7CisKKyAgICAgICAgICBleHBlY3Qod2l0aG91dE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJzEgcGVyc29uIGlzIHZpZXdpbmcuJyk7CisgICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdJZ29yIGlzIHZpZXdpbmcuJyk7CisKKyAgICAgICAgICBjb3VudElucHV0LmNsZWFyKCk7CisgICAgICAgICAgY291bnRJbnB1dC5zZW5kS2V5cygnMCcpOworCisgICAgICAgICAgZXhwZWN0KHdpdGhvdXRPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdOb2JvZHkgaXMgdmlld2luZy4nKTsKKyAgICAgICAgICBleHBlY3Qod2l0aE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJ05vYm9keSBpcyB2aWV3aW5nLicpOworCisgICAgICAgICAgY291bnRJbnB1dC5jbGVhcigpOworICAgICAgICAgIGNvdW50SW5wdXQuc2VuZEtleXMoJzInKTsKKworICAgICAgICAgIGV4cGVjdCh3aXRob3V0T2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnMiBwZW9wbGUgYXJlIHZpZXdpbmcuJyk7CisgICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdJZ29yIGFuZCBNaXNrbyBhcmUgdmlld2luZy4nKTsKKworICAgICAgICAgIGNvdW50SW5wdXQuY2xlYXIoKTsKKyAgICAgICAgICBjb3VudElucHV0LnNlbmRLZXlzKCczJyk7CisKKyAgICAgICAgICBleHBlY3Qod2l0aG91dE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJzMgcGVvcGxlIGFyZSB2aWV3aW5nLicpOworICAgICAgICAgIGV4cGVjdCh3aXRoT2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnSWdvciwgTWlza28gYW5kIG9uZSBvdGhlciBwZXJzb24gYXJlIHZpZXdpbmcuJyk7CisKKyAgICAgICAgICBjb3VudElucHV0LmNsZWFyKCk7CisgICAgICAgICAgY291bnRJbnB1dC5zZW5kS2V5cygnNCcpOworCisgICAgICAgICAgZXhwZWN0KHdpdGhvdXRPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCc0IHBlb3BsZSBhcmUgdmlld2luZy4nKTsKKyAgICAgICAgICBleHBlY3Qod2l0aE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJ0lnb3IsIE1pc2tvIGFuZCAyIG90aGVyIHBlb3BsZSBhcmUgdmlld2luZy4nKTsKKyAgICAgICAgfSk7CisgICAgICAgIGl0KCdzaG91bGQgc2hvdyBkYXRhLWJvdW5kIG5hbWVzJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgdmFyIHdpdGhPZmZzZXQgPSBlbGVtZW50LmFsbChieS5jc3MoJ25nLXBsdXJhbGl6ZScpKS5nZXQoMSk7CisgICAgICAgICAgdmFyIHBlcnNvbkNvdW50ID0gZWxlbWVudChieS5tb2RlbCgncGVyc29uQ291bnQnKSk7CisgICAgICAgICAgdmFyIHBlcnNvbjEgPSBlbGVtZW50KGJ5Lm1vZGVsKCdwZXJzb24xJykpOworICAgICAgICAgIHZhciBwZXJzb24yID0gZWxlbWVudChieS5tb2RlbCgncGVyc29uMicpKTsKKyAgICAgICAgICBwZXJzb25Db3VudC5jbGVhcigpOworICAgICAgICAgIHBlcnNvbkNvdW50LnNlbmRLZXlzKCc0Jyk7CisgICAgICAgICAgcGVyc29uMS5jbGVhcigpOworICAgICAgICAgIHBlcnNvbjEuc2VuZEtleXMoJ0RpJyk7CisgICAgICAgICAgcGVyc29uMi5jbGVhcigpOworICAgICAgICAgIHBlcnNvbjIuc2VuZEtleXMoJ1ZvanRhJyk7CisgICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdEaSwgVm9qdGEgYW5kIDIgb3RoZXIgcGVvcGxlIGFyZSB2aWV3aW5nLicpOworICAgICAgICB9KTsKKyAgICAgIDwvZmlsZT4KKyAgICA8L2V4YW1wbGU+CisgKi8KK3ZhciBuZ1BsdXJhbGl6ZURpcmVjdGl2ZSA9IFsnJGxvY2FsZScsICckaW50ZXJwb2xhdGUnLCBmdW5jdGlvbigkbG9jYWxlLCAkaW50ZXJwb2xhdGUpIHsKKyAgdmFyIEJSQUNFID0gL3t9L2csCisgICAgICBJU19XSEVOID0gL153aGVuKE1pbnVzKT8oLispJC87CisKKyAgcmV0dXJuIHsKKyAgICByZXN0cmljdDogJ0VBJywKKyAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cikgeworICAgICAgdmFyIG51bWJlckV4cCA9IGF0dHIuY291bnQsCisgICAgICAgICAgd2hlbkV4cCA9IGF0dHIuJGF0dHIud2hlbiAmJiBlbGVtZW50LmF0dHIoYXR0ci4kYXR0ci53aGVuKSwgLy8gd2UgaGF2ZSB7e319IGluIGF0dHJzCisgICAgICAgICAgb2Zmc2V0ID0gYXR0ci5vZmZzZXQgfHwgMCwKKyAgICAgICAgICB3aGVucyA9IHNjb3BlLiRldmFsKHdoZW5FeHApIHx8IHt9LAorICAgICAgICAgIHdoZW5zRXhwRm5zID0ge30sCisgICAgICAgICAgc3RhcnRTeW1ib2wgPSAkaW50ZXJwb2xhdGUuc3RhcnRTeW1ib2woKSwKKyAgICAgICAgICBlbmRTeW1ib2wgPSAkaW50ZXJwb2xhdGUuZW5kU3ltYm9sKCksCisgICAgICAgICAgYnJhY2VSZXBsYWNlbWVudCA9IHN0YXJ0U3ltYm9sICsgbnVtYmVyRXhwICsgJy0nICsgb2Zmc2V0ICsgZW5kU3ltYm9sLAorICAgICAgICAgIHdhdGNoUmVtb3ZlciA9IGFuZ3VsYXIubm9vcCwKKyAgICAgICAgICBsYXN0Q291bnQ7CisKKyAgICAgIGZvckVhY2goYXR0ciwgZnVuY3Rpb24oZXhwcmVzc2lvbiwgYXR0cmlidXRlTmFtZSkgeworICAgICAgICB2YXIgdG1wTWF0Y2ggPSBJU19XSEVOLmV4ZWMoYXR0cmlidXRlTmFtZSk7CisgICAgICAgIGlmICh0bXBNYXRjaCkgeworICAgICAgICAgIHZhciB3aGVuS2V5ID0gKHRtcE1hdGNoWzFdID8gJy0nIDogJycpICsgbG93ZXJjYXNlKHRtcE1hdGNoWzJdKTsKKyAgICAgICAgICB3aGVuc1t3aGVuS2V5XSA9IGVsZW1lbnQuYXR0cihhdHRyLiRhdHRyW2F0dHJpYnV0ZU5hbWVdKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBmb3JFYWNoKHdoZW5zLCBmdW5jdGlvbihleHByZXNzaW9uLCBrZXkpIHsKKyAgICAgICAgd2hlbnNFeHBGbnNba2V5XSA9ICRpbnRlcnBvbGF0ZShleHByZXNzaW9uLnJlcGxhY2UoQlJBQ0UsIGJyYWNlUmVwbGFjZW1lbnQpKTsKKworICAgICAgfSk7CisKKyAgICAgIHNjb3BlLiR3YXRjaChudW1iZXJFeHAsIGZ1bmN0aW9uIG5nUGx1cmFsaXplV2F0Y2hBY3Rpb24obmV3VmFsKSB7CisgICAgICAgIHZhciBjb3VudCA9IHBhcnNlRmxvYXQobmV3VmFsKTsKKyAgICAgICAgdmFyIGNvdW50SXNOYU4gPSBpc05hTihjb3VudCk7CisKKyAgICAgICAgaWYgKCFjb3VudElzTmFOICYmICEoY291bnQgaW4gd2hlbnMpKSB7CisgICAgICAgICAgLy8gSWYgYW4gZXhwbGljaXQgbnVtYmVyIHJ1bGUgc3VjaCBhcyAxLCAyLCAzLi4uIGlzIGRlZmluZWQsIGp1c3QgdXNlIGl0LgorICAgICAgICAgIC8vIE90aGVyd2lzZSwgY2hlY2sgaXQgYWdhaW5zdCBwbHVyYWxpemF0aW9uIHJ1bGVzIGluICRsb2NhbGUgc2VydmljZS4KKyAgICAgICAgICBjb3VudCA9ICRsb2NhbGUucGx1cmFsQ2F0KGNvdW50IC0gb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGJvdGggYGNvdW50YCBhbmQgYGxhc3RDb3VudGAgYXJlIE5hTiwgd2UgZG9uJ3QgbmVlZCB0byByZS1yZWdpc3RlciBhIHdhdGNoLgorICAgICAgICAvLyBJbiBKUyBgTmFOICE9PSBOYU5gLCBzbyB3ZSBoYXZlIHRvIGV4bGljaXRseSBjaGVjay4KKyAgICAgICAgaWYgKChjb3VudCAhPT0gbGFzdENvdW50KSAmJiAhKGNvdW50SXNOYU4gJiYgaXNOYU4obGFzdENvdW50KSkpIHsKKyAgICAgICAgICB3YXRjaFJlbW92ZXIoKTsKKyAgICAgICAgICB3YXRjaFJlbW92ZXIgPSBzY29wZS4kd2F0Y2god2hlbnNFeHBGbnNbY291bnRdLCB1cGRhdGVFbGVtZW50VGV4dCk7CisgICAgICAgICAgbGFzdENvdW50ID0gY291bnQ7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50VGV4dChuZXdUZXh0KSB7CisgICAgICAgIGVsZW1lbnQudGV4dChuZXdUZXh0IHx8ICcnKTsKKyAgICAgIH0KKyAgICB9CisgIH07Cit9XTsKKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ1JlcGVhdAorICoKKyAqIEBkZXNjcmlwdGlvbgorICogVGhlIGBuZ1JlcGVhdGAgZGlyZWN0aXZlIGluc3RhbnRpYXRlcyBhIHRlbXBsYXRlIG9uY2UgcGVyIGl0ZW0gZnJvbSBhIGNvbGxlY3Rpb24uIEVhY2ggdGVtcGxhdGUKKyAqIGluc3RhbmNlIGdldHMgaXRzIG93biBzY29wZSwgd2hlcmUgdGhlIGdpdmVuIGxvb3AgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gaXRlbSwKKyAqIGFuZCBgJGluZGV4YCBpcyBzZXQgdG8gdGhlIGl0ZW0gaW5kZXggb3Iga2V5LgorICoKKyAqIFNwZWNpYWwgcHJvcGVydGllcyBhcmUgZXhwb3NlZCBvbiB0aGUgbG9jYWwgc2NvcGUgb2YgZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZSwgaW5jbHVkaW5nOgorICoKKyAqIHwgVmFyaWFibGUgIHwgVHlwZSAgICAgICAgICAgIHwgRGV0YWlscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqIHwgYCRpbmRleGAgIHwge0B0eXBlIG51bWJlcn0gIHwgaXRlcmF0b3Igb2Zmc2V0IG9mIHRoZSByZXBlYXRlZCBlbGVtZW50ICgwLi5sZW5ndGgtMSkgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgYCRmaXJzdGAgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgcmVwZWF0ZWQgZWxlbWVudCBpcyBmaXJzdCBpbiB0aGUgaXRlcmF0b3IuICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgYCRtaWRkbGVgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgcmVwZWF0ZWQgZWxlbWVudCBpcyBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBpbiB0aGUgaXRlcmF0b3IuIHwKKyAqIHwgYCRsYXN0YCAgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgcmVwZWF0ZWQgZWxlbWVudCBpcyBsYXN0IGluIHRoZSBpdGVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgYCRldmVuYCAgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgaXRlcmF0b3IgcG9zaXRpb24gYCRpbmRleGAgaXMgZXZlbiAob3RoZXJ3aXNlIGZhbHNlKS4gICAgICAgICAgIHwKKyAqIHwgYCRvZGRgICAgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgaXRlcmF0b3IgcG9zaXRpb24gYCRpbmRleGAgaXMgb2RkIChvdGhlcndpc2UgZmFsc2UpLiAgICAgICAgICAgIHwKKyAqCisgKiBDcmVhdGluZyBhbGlhc2VzIGZvciB0aGVzZSBwcm9wZXJ0aWVzIGlzIHBvc3NpYmxlIHdpdGgge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0luaXQgYG5nSW5pdGB9LgorICogVGhpcyBtYXkgYmUgdXNlZnVsIHdoZW4sIGZvciBpbnN0YW5jZSwgbmVzdGluZyBuZ1JlcGVhdHMuCisgKgorICogIyBTcGVjaWFsIHJlcGVhdCBzdGFydCBhbmQgZW5kIHBvaW50cworICogVG8gcmVwZWF0IGEgc2VyaWVzIG9mIGVsZW1lbnRzIGluc3RlYWQgb2YganVzdCBvbmUgcGFyZW50IGVsZW1lbnQsIG5nUmVwZWF0IChhcyB3ZWxsIGFzIG90aGVyIG5nIGRpcmVjdGl2ZXMpIHN1cHBvcnRzIGV4dGVuZGluZworICogdGhlIHJhbmdlIG9mIHRoZSByZXBlYXRlciBieSBkZWZpbmluZyBleHBsaWNpdCBzdGFydCBhbmQgZW5kIHBvaW50cyBieSB1c2luZyAqKm5nLXJlcGVhdC1zdGFydCoqIGFuZCAqKm5nLXJlcGVhdC1lbmQqKiByZXNwZWN0aXZlbHkuCisgKiBUaGUgKipuZy1yZXBlYXQtc3RhcnQqKiBkaXJlY3RpdmUgd29ya3MgdGhlIHNhbWUgYXMgKipuZy1yZXBlYXQqKiwgYnV0IHdpbGwgcmVwZWF0IGFsbCB0aGUgSFRNTCBjb2RlIChpbmNsdWRpbmcgdGhlIHRhZyBpdCdzIGRlZmluZWQgb24pCisgKiB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBlbmRpbmcgSFRNTCB0YWcgd2hlcmUgKipuZy1yZXBlYXQtZW5kKiogaXMgcGxhY2VkLgorICoKKyAqIFRoZSBleGFtcGxlIGJlbG93IG1ha2VzIHVzZSBvZiB0aGlzIGZlYXR1cmU6CisgKiBgYGBodG1sCisgKiAgIDxoZWFkZXIgbmctcmVwZWF0LXN0YXJ0PSJpdGVtIGluIGl0ZW1zIj4KKyAqICAgICBIZWFkZXIge3sgaXRlbSB9fQorICogICA8L2hlYWRlcj4KKyAqICAgPGRpdiBjbGFzcz0iYm9keSI+CisgKiAgICAgQm9keSB7eyBpdGVtIH19CisgKiAgIDwvZGl2PgorICogICA8Zm9vdGVyIG5nLXJlcGVhdC1lbmQ+CisgKiAgICAgRm9vdGVyIHt7IGl0ZW0gfX0KKyAqICAgPC9mb290ZXI+CisgKiBgYGAKKyAqCisgKiBBbmQgd2l0aCBhbiBpbnB1dCBvZiB7QHR5cGUgWydBJywnQiddfSBmb3IgdGhlIGl0ZW1zIHZhcmlhYmxlIGluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgb3V0cHV0IHdpbGwgZXZhbHVhdGUgdG86CisgKiBgYGBodG1sCisgKiAgIDxoZWFkZXI+CisgKiAgICAgSGVhZGVyIEEKKyAqICAgPC9oZWFkZXI+CisgKiAgIDxkaXYgY2xhc3M9ImJvZHkiPgorICogICAgIEJvZHkgQQorICogICA8L2Rpdj4KKyAqICAgPGZvb3Rlcj4KKyAqICAgICBGb290ZXIgQQorICogICA8L2Zvb3Rlcj4KKyAqICAgPGhlYWRlcj4KKyAqICAgICBIZWFkZXIgQgorICogICA8L2hlYWRlcj4KKyAqICAgPGRpdiBjbGFzcz0iYm9keSI+CisgKiAgICAgQm9keSBCCisgKiAgIDwvZGl2PgorICogICA8Zm9vdGVyPgorICogICAgIEZvb3RlciBCCisgKiAgIDwvZm9vdGVyPgorICogYGBgCisgKgorICogVGhlIGN1c3RvbSBzdGFydCBhbmQgZW5kIHBvaW50cyBmb3IgbmdSZXBlYXQgYWxzbyBzdXBwb3J0IGFsbCBvdGhlciBIVE1MIGRpcmVjdGl2ZSBzeW50YXggZmxhdm9ycyBwcm92aWRlZCBpbiBBbmd1bGFySlMgKHN1Y2gKKyAqIGFzICoqZGF0YS1uZy1yZXBlYXQtc3RhcnQqKiwgKip4LW5nLXJlcGVhdC1zdGFydCoqIGFuZCAqKm5nOnJlcGVhdC1zdGFydCoqKS4KKyAqCisgKiBAYW5pbWF0aW9ucworICogKiouZW50ZXIqKiAtIHdoZW4gYSBuZXcgaXRlbSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvciB3aGVuIGFuIGl0ZW0gaXMgcmV2ZWFsZWQgYWZ0ZXIgYSBmaWx0ZXIKKyAqCisgKiAqKi5sZWF2ZSoqIC0gd2hlbiBhbiBpdGVtIGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvciB3aGVuIGFuIGl0ZW0gaXMgZmlsdGVyZWQgb3V0CisgKgorICogKioubW92ZSoqIC0gd2hlbiBhbiBhZGphY2VudCBpdGVtIGlzIGZpbHRlcmVkIG91dCBjYXVzaW5nIGEgcmVvcmRlciBvciB3aGVuIHRoZSBpdGVtIGNvbnRlbnRzIGFyZSByZW9yZGVyZWQKKyAqCisgKiBAZWxlbWVudCBBTlkKKyAqIEBzY29wZQorICogQHByaW9yaXR5IDEwMDAKKyAqIEBwYXJhbSB7cmVwZWF0X2V4cHJlc3Npb259IG5nUmVwZWF0IFRoZSBleHByZXNzaW9uIGluZGljYXRpbmcgaG93IHRvIGVudW1lcmF0ZSBhIGNvbGxlY3Rpb24uIFRoZXNlCisgKiAgIGZvcm1hdHMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6CisgKgorICogICAqIGB2YXJpYWJsZSBpbiBleHByZXNzaW9uYCDigD8gd2hlcmUgdmFyaWFibGUgaXMgdGhlIHVzZXIgZGVmaW5lZCBsb29wIHZhcmlhYmxlIGFuZCBgZXhwcmVzc2lvbmAKKyAqICAgICBpcyBhIHNjb3BlIGV4cHJlc3Npb24gZ2l2aW5nIHRoZSBjb2xsZWN0aW9uIHRvIGVudW1lcmF0ZS4KKyAqCisgKiAgICAgRm9yIGV4YW1wbGU6IGBhbGJ1bSBpbiBhcnRpc3QuYWxidW1zYC4KKyAqCisgKiAgICogYChrZXksIHZhbHVlKSBpbiBleHByZXNzaW9uYCDigD8gd2hlcmUgYGtleWAgYW5kIGB2YWx1ZWAgY2FuIGJlIGFueSB1c2VyIGRlZmluZWQgaWRlbnRpZmllcnMsCisgKiAgICAgYW5kIGBleHByZXNzaW9uYCBpcyB0aGUgc2NvcGUgZXhwcmVzc2lvbiBnaXZpbmcgdGhlIGNvbGxlY3Rpb24gdG8gZW51bWVyYXRlLgorICoKKyAqICAgICBGb3IgZXhhbXBsZTogYChuYW1lLCBhZ2UpIGluIHsnYWRhbSc6MTAsICdhbWFsaWUnOjEyfWAuCisgKgorICogICAqIGB2YXJpYWJsZSBpbiBleHByZXNzaW9uIHRyYWNrIGJ5IHRyYWNraW5nX2V4cHJlc3Npb25gIOKAPyBZb3UgY2FuIGFsc28gcHJvdmlkZSBhbiBvcHRpb25hbCB0cmFja2luZyBmdW5jdGlvbgorICogICAgIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgb2JqZWN0cyBpbiB0aGUgY29sbGVjdGlvbiB3aXRoIHRoZSBET00gZWxlbWVudHMuIElmIG5vIHRyYWNraW5nIGZ1bmN0aW9uCisgKiAgICAgaXMgc3BlY2lmaWVkIHRoZSBuZy1yZXBlYXQgYXNzb2NpYXRlcyBlbGVtZW50cyBieSBpZGVudGl0eSBpbiB0aGUgY29sbGVjdGlvbi4gSXQgaXMgYW4gZXJyb3IgdG8gaGF2ZQorICogICAgIG1vcmUgdGhhbiBvbmUgdHJhY2tpbmcgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0byB0aGUgc2FtZSBrZXkuIChUaGlzIHdvdWxkIG1lYW4gdGhhdCB0d28gZGlzdGluY3Qgb2JqZWN0cyBhcmUKKyAqICAgICBtYXBwZWQgdG8gdGhlIHNhbWUgRE9NIGVsZW1lbnQsIHdoaWNoIGlzIG5vdCBwb3NzaWJsZS4pICBGaWx0ZXJzIHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBleHByZXNzaW9uLAorICogICAgIGJlZm9yZSBzcGVjaWZ5aW5nIGEgdHJhY2tpbmcgZXhwcmVzc2lvbi4KKyAqCisgKiAgICAgRm9yIGV4YW1wbGU6IGBpdGVtIGluIGl0ZW1zYCBpcyBlcXVpdmFsZW50IHRvIGBpdGVtIGluIGl0ZW1zIHRyYWNrIGJ5ICRpZChpdGVtKWAuIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBET00gZWxlbWVudHMKKyAqICAgICB3aWxsIGJlIGFzc29jaWF0ZWQgYnkgaXRlbSBpZGVudGl0eSBpbiB0aGUgYXJyYXkuCisgKgorICogICAgIEZvciBleGFtcGxlOiBgaXRlbSBpbiBpdGVtcyB0cmFjayBieSAkaWQoaXRlbSlgLiBBIGJ1aWx0IGluIGAkaWQoKWAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYXNzaWduIGEgdW5pcXVlCisgKiAgICAgYCQkaGFzaEtleWAgcHJvcGVydHkgdG8gZWFjaCBpdGVtIGluIHRoZSBhcnJheS4gVGhpcyBwcm9wZXJ0eSBpcyB0aGVuIHVzZWQgYXMgYSBrZXkgdG8gYXNzb2NpYXRlZCBET00gZWxlbWVudHMKKyAqICAgICB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0gaW4gdGhlIGFycmF5IGJ5IGlkZW50aXR5LiBNb3ZpbmcgdGhlIHNhbWUgb2JqZWN0IGluIGFycmF5IHdvdWxkIG1vdmUgdGhlIERPTQorICogICAgIGVsZW1lbnQgaW4gdGhlIHNhbWUgd2F5IGluIHRoZSBET00uCisgKgorICogICAgIEZvciBleGFtcGxlOiBgaXRlbSBpbiBpdGVtcyB0cmFjayBieSBpdGVtLmlkYCBpcyBhIHR5cGljYWwgcGF0dGVybiB3aGVuIHRoZSBpdGVtcyBjb21lIGZyb20gdGhlIGRhdGFiYXNlLiBJbiB0aGlzCisgKiAgICAgY2FzZSB0aGUgb2JqZWN0IGlkZW50aXR5IGRvZXMgbm90IG1hdHRlci4gVHdvIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBhcyBsb25nIGFzIHRoZWlyIGBpZGAKKyAqICAgICBwcm9wZXJ0eSBpcyBzYW1lLgorICoKKyAqICAgICBGb3IgZXhhbXBsZTogYGl0ZW0gaW4gaXRlbXMgfCBmaWx0ZXI6c2VhcmNoVGV4dCB0cmFjayBieSBpdGVtLmlkYCBpcyBhIHBhdHRlcm4gdGhhdCBtaWdodCBiZSB1c2VkIHRvIGFwcGx5IGEgZmlsdGVyCisgKiAgICAgdG8gaXRlbXMgaW4gY29uanVuY3Rpb24gd2l0aCBhIHRyYWNraW5nIGV4cHJlc3Npb24uCisgKgorICogICAqIGB2YXJpYWJsZSBpbiBleHByZXNzaW9uIGFzIGFsaWFzX2V4cHJlc3Npb25gIOKAPyBZb3UgY2FuIGFsc28gcHJvdmlkZSBhbiBvcHRpb25hbCBhbGlhcyBleHByZXNzaW9uIHdoaWNoIHdpbGwgdGhlbiBzdG9yZSB0aGUKKyAqICAgICBpbnRlcm1lZGlhdGUgcmVzdWx0cyBvZiB0aGUgcmVwZWF0ZXIgYWZ0ZXIgdGhlIGZpbHRlcnMgaGF2ZSBiZWVuIGFwcGxpZWQuIFR5cGljYWxseSB0aGlzIGlzIHVzZWQgdG8gcmVuZGVyIGEgc3BlY2lhbCBtZXNzYWdlCisgKiAgICAgd2hlbiBhIGZpbHRlciBpcyBhY3RpdmUgb24gdGhlIHJlcGVhdGVyLCBidXQgdGhlIGZpbHRlcmVkIHJlc3VsdCBzZXQgaXMgZW1wdHkuCisgKgorICogICAgIEZvciBleGFtcGxlOiBgaXRlbSBpbiBpdGVtcyB8IGZpbHRlcjp4IGFzIHJlc3VsdHNgIHdpbGwgc3RvcmUgdGhlIGZyYWdtZW50IG9mIHRoZSByZXBlYXRlZCBpdGVtcyBhcyBgcmVzdWx0c2AsIGJ1dCBvbmx5IGFmdGVyCisgKiAgICAgdGhlIGl0ZW1zIGhhdmUgYmVlbiBwcm9jZXNzZWQgdGhyb3VnaCB0aGUgZmlsdGVyLgorICoKKyAqIEBleGFtcGxlCisgKiBUaGlzIGV4YW1wbGUgaW5pdGlhbGl6ZXMgdGhlIHNjb3BlIHRvIGEgbGlzdCBvZiBuYW1lcyBhbmQKKyAqIHRoZW4gdXNlcyBgbmdSZXBlYXRgIHRvIGRpc3BsYXkgZXZlcnkgcGVyc29uOgorICA8ZXhhbXBsZSBtb2R1bGU9Im5nQW5pbWF0ZSIgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIj4KKyAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgIDxkaXYgbmctaW5pdD0iZnJpZW5kcyA9IFsKKyAgICAgICAge25hbWU6J0pvaG4nLCBhZ2U6MjUsIGdlbmRlcjonYm95J30sCisgICAgICAgIHtuYW1lOidKZXNzaWUnLCBhZ2U6MzAsIGdlbmRlcjonZ2lybCd9LAorICAgICAgICB7bmFtZTonSm9oYW5uYScsIGFnZToyOCwgZ2VuZGVyOidnaXJsJ30sCisgICAgICAgIHtuYW1lOidKb3knLCBhZ2U6MTUsIGdlbmRlcjonZ2lybCd9LAorICAgICAgICB7bmFtZTonTWFyeScsIGFnZToyOCwgZ2VuZGVyOidnaXJsJ30sCisgICAgICAgIHtuYW1lOidQZXRlcicsIGFnZTo5NSwgZ2VuZGVyOidib3knfSwKKyAgICAgICAge25hbWU6J1NlYmFzdGlhbicsIGFnZTo1MCwgZ2VuZGVyOidib3knfSwKKyAgICAgICAge25hbWU6J0VyaWthJywgYWdlOjI3LCBnZW5kZXI6J2dpcmwnfSwKKyAgICAgICAge25hbWU6J1BhdHJpY2snLCBhZ2U6NDAsIGdlbmRlcjonYm95J30sCisgICAgICAgIHtuYW1lOidTYW1hbnRoYScsIGFnZTo2MCwgZ2VuZGVyOidnaXJsJ30KKyAgICAgIF0iPgorICAgICAgICBJIGhhdmUge3tmcmllbmRzLmxlbmd0aH19IGZyaWVuZHMuIFRoZXkgYXJlOgorICAgICAgICA8aW5wdXQgdHlwZT0ic2VhcmNoIiBuZy1tb2RlbD0icSIgcGxhY2Vob2xkZXI9ImZpbHRlciBmcmllbmRzLi4uIiAvPgorICAgICAgICA8dWwgY2xhc3M9ImV4YW1wbGUtYW5pbWF0ZS1jb250YWluZXIiPgorICAgICAgICAgIDxsaSBjbGFzcz0iYW5pbWF0ZS1yZXBlYXQiIG5nLXJlcGVhdD0iZnJpZW5kIGluIGZyaWVuZHMgfCBmaWx0ZXI6cSBhcyByZXN1bHRzIj4KKyAgICAgICAgICAgIFt7eyRpbmRleCArIDF9fV0ge3tmcmllbmQubmFtZX19IHdobyBpcyB7e2ZyaWVuZC5hZ2V9fSB5ZWFycyBvbGQuCisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGkgY2xhc3M9ImFuaW1hdGUtcmVwZWF0IiBuZy1pZj0icmVzdWx0cy5sZW5ndGggPT0gMCI+CisgICAgICAgICAgICA8c3Ryb25nPk5vIHJlc3VsdHMgZm91bmQuLi48L3N0cm9uZz4KKyAgICAgICAgICA8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgPC9kaXY+CisgICAgPC9maWxlPgorICAgIDxmaWxlIG5hbWU9ImFuaW1hdGlvbnMuY3NzIj4KKyAgICAgIC5leGFtcGxlLWFuaW1hdGUtY29udGFpbmVyIHsKKyAgICAgICAgYmFja2dyb3VuZDp3aGl0ZTsKKyAgICAgICAgYm9yZGVyOjFweCBzb2xpZCBibGFjazsKKyAgICAgICAgbGlzdC1zdHlsZTpub25lOworICAgICAgICBtYXJnaW46MDsKKyAgICAgICAgcGFkZGluZzowIDEwcHg7CisgICAgICB9CisKKyAgICAgIC5hbmltYXRlLXJlcGVhdCB7CisgICAgICAgIGxpbmUtaGVpZ2h0OjQwcHg7CisgICAgICAgIGxpc3Qtc3R5bGU6bm9uZTsKKyAgICAgICAgYm94LXNpemluZzpib3JkZXItYm94OworICAgICAgfQorCisgICAgICAuYW5pbWF0ZS1yZXBlYXQubmctbW92ZSwKKyAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1lbnRlciwKKyAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1sZWF2ZSB7CisgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgbGluZWFyIDAuNXM7CisgICAgICAgIHRyYW5zaXRpb246YWxsIGxpbmVhciAwLjVzOworICAgICAgfQorCisgICAgICAuYW5pbWF0ZS1yZXBlYXQubmctbGVhdmUubmctbGVhdmUtYWN0aXZlLAorICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLW1vdmUsCisgICAgICAuYW5pbWF0ZS1yZXBlYXQubmctZW50ZXIgeworICAgICAgICBvcGFjaXR5OjA7CisgICAgICAgIG1heC1oZWlnaHQ6MDsKKyAgICAgIH0KKworICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLWxlYXZlLAorICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLW1vdmUubmctbW92ZS1hY3RpdmUsCisgICAgICAuYW5pbWF0ZS1yZXBlYXQubmctZW50ZXIubmctZW50ZXItYWN0aXZlIHsKKyAgICAgICAgb3BhY2l0eToxOworICAgICAgICBtYXgtaGVpZ2h0OjQwcHg7CisgICAgICB9CisgICAgPC9maWxlPgorICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgdmFyIGZyaWVuZHMgPSBlbGVtZW50LmFsbChieS5yZXBlYXRlcignZnJpZW5kIGluIGZyaWVuZHMnKSk7CisKKyAgICAgIGl0KCdzaG91bGQgcmVuZGVyIGluaXRpYWwgZGF0YSBzZXQnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgZXhwZWN0KGZyaWVuZHMuY291bnQoKSkudG9CZSgxMCk7CisgICAgICAgIGV4cGVjdChmcmllbmRzLmdldCgwKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1sxXSBKb2huIHdobyBpcyAyNSB5ZWFycyBvbGQuJyk7CisgICAgICAgIGV4cGVjdChmcmllbmRzLmdldCgxKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1syXSBKZXNzaWUgd2hvIGlzIDMwIHllYXJzIG9sZC4nKTsKKyAgICAgICAgZXhwZWN0KGZyaWVuZHMubGFzdCgpLmdldFRleHQoKSkudG9FcXVhbCgnWzEwXSBTYW1hbnRoYSB3aG8gaXMgNjAgeWVhcnMgb2xkLicpOworICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdmcmllbmRzLmxlbmd0aCcpKS5nZXRUZXh0KCkpCisgICAgICAgICAgICAudG9NYXRjaCgiSSBoYXZlIDEwIGZyaWVuZHMuIFRoZXkgYXJlOiIpOworICAgICAgfSk7CisKKyAgICAgICBpdCgnc2hvdWxkIHVwZGF0ZSByZXBlYXRlciB3aGVuIGZpbHRlciBwcmVkaWNhdGUgY2hhbmdlcycsIGZ1bmN0aW9uKCkgeworICAgICAgICAgZXhwZWN0KGZyaWVuZHMuY291bnQoKSkudG9CZSgxMCk7CisKKyAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3EnKSkuc2VuZEtleXMoJ21hJyk7CisKKyAgICAgICAgIGV4cGVjdChmcmllbmRzLmNvdW50KCkpLnRvQmUoMik7CisgICAgICAgICBleHBlY3QoZnJpZW5kcy5nZXQoMCkuZ2V0VGV4dCgpKS50b0VxdWFsKCdbMV0gTWFyeSB3aG8gaXMgMjggeWVhcnMgb2xkLicpOworICAgICAgICAgZXhwZWN0KGZyaWVuZHMubGFzdCgpLmdldFRleHQoKSkudG9FcXVhbCgnWzJdIFNhbWFudGhhIHdobyBpcyA2MCB5ZWFycyBvbGQuJyk7CisgICAgICAgfSk7CisgICAgICA8L2ZpbGU+CisgICAgPC9leGFtcGxlPgorICovCit2YXIgbmdSZXBlYXREaXJlY3RpdmUgPSBbJyRwYXJzZScsICckYW5pbWF0ZScsIGZ1bmN0aW9uKCRwYXJzZSwgJGFuaW1hdGUpIHsKKyAgdmFyIE5HX1JFTU9WRUQgPSAnJCROR19SRU1PVkVEJzsKKyAgdmFyIG5nUmVwZWF0TWluRXJyID0gbWluRXJyKCduZ1JlcGVhdCcpOworCisgIHZhciB1cGRhdGVTY29wZSA9IGZ1bmN0aW9uKHNjb3BlLCBpbmRleCwgdmFsdWVJZGVudGlmaWVyLCB2YWx1ZSwga2V5SWRlbnRpZmllciwga2V5LCBhcnJheUxlbmd0aCkgeworICAgIC8vIFRPRE8ocGVyZik6IGdlbmVyYXRlIHNldHRlcnMgdG8gc2hhdmUgb2ZmIH40MG1zIG9yIDEtMS41JQorICAgIHNjb3BlW3ZhbHVlSWRlbnRpZmllcl0gPSB2YWx1ZTsKKyAgICBpZiAoa2V5SWRlbnRpZmllcikgc2NvcGVba2V5SWRlbnRpZmllcl0gPSBrZXk7CisgICAgc2NvcGUuJGluZGV4ID0gaW5kZXg7CisgICAgc2NvcGUuJGZpcnN0ID0gKGluZGV4ID09PSAwKTsKKyAgICBzY29wZS4kbGFzdCA9IChpbmRleCA9PT0gKGFycmF5TGVuZ3RoIC0gMSkpOworICAgIHNjb3BlLiRtaWRkbGUgPSAhKHNjb3BlLiRmaXJzdCB8fCBzY29wZS4kbGFzdCk7CisgICAgLy8ganNoaW50IGJpdHdpc2U6IGZhbHNlCisgICAgc2NvcGUuJG9kZCA9ICEoc2NvcGUuJGV2ZW4gPSAoaW5kZXgmMSkgPT09IDApOworICAgIC8vIGpzaGludCBiaXR3aXNlOiB0cnVlCisgIH07CisKKyAgdmFyIGdldEJsb2NrU3RhcnQgPSBmdW5jdGlvbihibG9jaykgeworICAgIHJldHVybiBibG9jay5jbG9uZVswXTsKKyAgfTsKKworICB2YXIgZ2V0QmxvY2tFbmQgPSBmdW5jdGlvbihibG9jaykgeworICAgIHJldHVybiBibG9jay5jbG9uZVtibG9jay5jbG9uZS5sZW5ndGggLSAxXTsKKyAgfTsKKworCisgIHJldHVybiB7CisgICAgcmVzdHJpY3Q6ICdBJywKKyAgICBtdWx0aUVsZW1lbnQ6IHRydWUsCisgICAgdHJhbnNjbHVkZTogJ2VsZW1lbnQnLAorICAgIHByaW9yaXR5OiAxMDAwLAorICAgIHRlcm1pbmFsOiB0cnVlLAorICAgICQkdGxiOiB0cnVlLAorICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nUmVwZWF0Q29tcGlsZSgkZWxlbWVudCwgJGF0dHIpIHsKKyAgICAgIHZhciBleHByZXNzaW9uID0gJGF0dHIubmdSZXBlYXQ7CisgICAgICB2YXIgbmdSZXBlYXRFbmRDb21tZW50ID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnIGVuZCBuZ1JlcGVhdDogJyArIGV4cHJlc3Npb24gKyAnICcpOworCisgICAgICB2YXIgbWF0Y2ggPSBleHByZXNzaW9uLm1hdGNoKC9eXHMqKFtcc1xTXSs/KVxzK2luXHMrKFtcc1xTXSs/KSg/OlxzK2FzXHMrKFtcc1xTXSs/KSk/KD86XHMrdHJhY2tccytieVxzKyhbXHNcU10rPykpP1xzKiQvKTsKKworICAgICAgaWYgKCFtYXRjaCkgeworICAgICAgICB0aHJvdyBuZ1JlcGVhdE1pbkVycignaWV4cCcsICJFeHBlY3RlZCBleHByZXNzaW9uIGluIGZvcm0gb2YgJ19pdGVtXyBpbiBfY29sbGVjdGlvbl9bIHRyYWNrIGJ5IF9pZF9dJyBidXQgZ290ICd7MH0nLiIsCisgICAgICAgICAgICBleHByZXNzaW9uKTsKKyAgICAgIH0KKworICAgICAgdmFyIGxocyA9IG1hdGNoWzFdOworICAgICAgdmFyIHJocyA9IG1hdGNoWzJdOworICAgICAgdmFyIGFsaWFzQXMgPSBtYXRjaFszXTsKKyAgICAgIHZhciB0cmFja0J5RXhwID0gbWF0Y2hbNF07CisKKyAgICAgIG1hdGNoID0gbGhzLm1hdGNoKC9eKD86KFxzKltcJFx3XSspfFwoXHMqKFtcJFx3XSspXHMqLFxzKihbXCRcd10rKVxzKlwpKSQvKTsKKworICAgICAgaWYgKCFtYXRjaCkgeworICAgICAgICB0aHJvdyBuZ1JlcGVhdE1pbkVycignaWlkZXhwJywgIidfaXRlbV8nIGluICdfaXRlbV8gaW4gX2NvbGxlY3Rpb25fJyBzaG91bGQgYmUgYW4gaWRlbnRpZmllciBvciAnKF9rZXlfLCBfdmFsdWVfKScgZXhwcmVzc2lvbiwgYnV0IGdvdCAnezB9Jy4iLAorICAgICAgICAgICAgbGhzKTsKKyAgICAgIH0KKyAgICAgIHZhciB2YWx1ZUlkZW50aWZpZXIgPSBtYXRjaFszXSB8fCBtYXRjaFsxXTsKKyAgICAgIHZhciBrZXlJZGVudGlmaWVyID0gbWF0Y2hbMl07CisKKyAgICAgIGlmIChhbGlhc0FzICYmICghL15bJGEtekEtWl9dWyRhLXpBLVowLTlfXSokLy50ZXN0KGFsaWFzQXMpIHx8CisgICAgICAgICAgL14obnVsbHx1bmRlZmluZWR8dGhpc3xcJGluZGV4fFwkZmlyc3R8XCRtaWRkbGV8XCRsYXN0fFwkZXZlbnxcJG9kZHxcJHBhcmVudCkkLy50ZXN0KGFsaWFzQXMpKSkgeworICAgICAgICB0aHJvdyBuZ1JlcGVhdE1pbkVycignYmFkaWRlbnQnLCAiYWxpYXMgJ3swfScgaXMgaW52YWxpZCAtLS0gbXVzdCBiZSBhIHZhbGlkIEpTIGlkZW50aWZpZXIgd2hpY2ggaXMgbm90IGEgcmVzZXJ2ZWQgbmFtZS4iLAorICAgICAgICAgIGFsaWFzQXMpOworICAgICAgfQorCisgICAgICB2YXIgdHJhY2tCeUV4cEdldHRlciwgdHJhY2tCeUlkRXhwRm4sIHRyYWNrQnlJZEFycmF5Rm4sIHRyYWNrQnlJZE9iakZuOworICAgICAgdmFyIGhhc2hGbkxvY2FscyA9IHskaWQ6IGhhc2hLZXl9OworCisgICAgICBpZiAodHJhY2tCeUV4cCkgeworICAgICAgICB0cmFja0J5RXhwR2V0dGVyID0gJHBhcnNlKHRyYWNrQnlFeHApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhY2tCeUlkQXJyYXlGbiA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICAgICAgICByZXR1cm4gaGFzaEtleSh2YWx1ZSk7CisgICAgICAgIH07CisgICAgICAgIHRyYWNrQnlJZE9iakZuID0gZnVuY3Rpb24oa2V5KSB7CisgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5nUmVwZWF0TGluaygkc2NvcGUsICRlbGVtZW50LCAkYXR0ciwgY3RybCwgJHRyYW5zY2x1ZGUpIHsKKworICAgICAgICBpZiAodHJhY2tCeUV4cEdldHRlcikgeworICAgICAgICAgIHRyYWNrQnlJZEV4cEZuID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSwgaW5kZXgpIHsKKyAgICAgICAgICAgIC8vIGFzc2lnbiBrZXksIHZhbHVlLCBhbmQgJGluZGV4IHRvIHRoZSBsb2NhbHMgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGluIGhhc2ggZnVuY3Rpb25zCisgICAgICAgICAgICBpZiAoa2V5SWRlbnRpZmllcikgaGFzaEZuTG9jYWxzW2tleUlkZW50aWZpZXJdID0ga2V5OworICAgICAgICAgICAgaGFzaEZuTG9jYWxzW3ZhbHVlSWRlbnRpZmllcl0gPSB2YWx1ZTsKKyAgICAgICAgICAgIGhhc2hGbkxvY2Fscy4kaW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIHJldHVybiB0cmFja0J5RXhwR2V0dGVyKCRzY29wZSwgaGFzaEZuTG9jYWxzKTsKKyAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgYSBsaXN0IG9mIGVsZW1lbnRzIGZyb20gcHJldmlvdXMgcnVuLiBUaGlzIGlzIGEgaGFzaCB3aGVyZSBrZXkgaXMgdGhlIGl0ZW0gZnJvbSB0aGUKKyAgICAgICAgLy8gaXRlcmF0b3IsIGFuZCB0aGUgdmFsdWUgaXMgb2JqZWN0cyB3aXRoIGZvbGxvd2luZyBwcm9wZXJ0aWVzLgorICAgICAgICAvLyAgIC0gc2NvcGU6IGJvdW5kIHNjb3BlCisgICAgICAgIC8vICAgLSBlbGVtZW50OiBwcmV2aW91cyBlbGVtZW50LgorICAgICAgICAvLyAgIC0gaW5kZXg6IHBvc2l0aW9uCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIGFyZSB1c2luZyBuby1wcm90byBvYmplY3Qgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGd1YXJkIGFnYWluc3QgaW5oZXJpdGVkIHByb3BzIHZpYQorICAgICAgICAvLyBoYXNPd25Qcm9wZXJ0eS4KKyAgICAgICAgdmFyIGxhc3RCbG9ja01hcCA9IGNyZWF0ZU1hcCgpOworCisgICAgICAgIC8vd2F0Y2ggcHJvcHMKKyAgICAgICAgJHNjb3BlLiR3YXRjaENvbGxlY3Rpb24ocmhzLCBmdW5jdGlvbiBuZ1JlcGVhdEFjdGlvbihjb2xsZWN0aW9uKSB7CisgICAgICAgICAgdmFyIGluZGV4LCBsZW5ndGgsCisgICAgICAgICAgICAgIHByZXZpb3VzTm9kZSA9ICRlbGVtZW50WzBdLCAgICAgLy8gbm9kZSB0aGF0IGNsb25lZCBub2RlcyBzaG91bGQgYmUgaW5zZXJ0ZWQgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCB0byB0aGUgY29tbWVudCBub2RlIGFuY2hvcgorICAgICAgICAgICAgICBuZXh0Tm9kZSwKKyAgICAgICAgICAgICAgLy8gU2FtZSBhcyBsYXN0QmxvY2tNYXAgYnV0IGl0IGhhcyB0aGUgY3VycmVudCBzdGF0ZS4gSXQgd2lsbCBiZWNvbWUgdGhlCisgICAgICAgICAgICAgIC8vIGxhc3RCbG9ja01hcCBvbiB0aGUgbmV4dCBpdGVyYXRpb24uCisgICAgICAgICAgICAgIG5leHRCbG9ja01hcCA9IGNyZWF0ZU1hcCgpLAorICAgICAgICAgICAgICBjb2xsZWN0aW9uTGVuZ3RoLAorICAgICAgICAgICAgICBrZXksIHZhbHVlLCAvLyBrZXkvdmFsdWUgb2YgaXRlcmF0aW9uCisgICAgICAgICAgICAgIHRyYWNrQnlJZCwKKyAgICAgICAgICAgICAgdHJhY2tCeUlkRm4sCisgICAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzLAorICAgICAgICAgICAgICBibG9jaywgICAgICAgLy8gbGFzdCBvYmplY3QgaW5mb3JtYXRpb24ge3Njb3BlLCBlbGVtZW50LCBpZH0KKyAgICAgICAgICAgICAgbmV4dEJsb2NrT3JkZXIsCisgICAgICAgICAgICAgIGVsZW1lbnRzVG9SZW1vdmU7CisKKyAgICAgICAgICBpZiAoYWxpYXNBcykgeworICAgICAgICAgICAgJHNjb3BlW2FsaWFzQXNdID0gY29sbGVjdGlvbjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHsKKyAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzID0gY29sbGVjdGlvbjsKKyAgICAgICAgICAgIHRyYWNrQnlJZEZuID0gdHJhY2tCeUlkRXhwRm4gfHwgdHJhY2tCeUlkQXJyYXlGbjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhY2tCeUlkRm4gPSB0cmFja0J5SWRFeHBGbiB8fCB0cmFja0J5SWRPYmpGbjsKKyAgICAgICAgICAgIC8vIGlmIG9iamVjdCwgZXh0cmFjdCBrZXlzLCBzb3J0IHRoZW0gYW5kIHVzZSB0byBkZXRlcm1pbmUgb3JkZXIgb2YgaXRlcmF0aW9uIG92ZXIgb2JqIHByb3BzCisgICAgICAgICAgICBjb2xsZWN0aW9uS2V5cyA9IFtdOworICAgICAgICAgICAgZm9yICh2YXIgaXRlbUtleSBpbiBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmhhc093blByb3BlcnR5KGl0ZW1LZXkpICYmIGl0ZW1LZXkuY2hhckF0KDApICE9ICckJykgeworICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzLnB1c2goaXRlbUtleSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzLnNvcnQoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjb2xsZWN0aW9uTGVuZ3RoID0gY29sbGVjdGlvbktleXMubGVuZ3RoOworICAgICAgICAgIG5leHRCbG9ja09yZGVyID0gbmV3IEFycmF5KGNvbGxlY3Rpb25MZW5ndGgpOworCisgICAgICAgICAgLy8gbG9jYXRlIGV4aXN0aW5nIGl0ZW1zCisgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29sbGVjdGlvbkxlbmd0aDsgaW5kZXgrKykgeworICAgICAgICAgICAga2V5ID0gKGNvbGxlY3Rpb24gPT09IGNvbGxlY3Rpb25LZXlzKSA/IGluZGV4IDogY29sbGVjdGlvbktleXNbaW5kZXhdOworICAgICAgICAgICAgdmFsdWUgPSBjb2xsZWN0aW9uW2tleV07CisgICAgICAgICAgICB0cmFja0J5SWQgPSB0cmFja0J5SWRGbihrZXksIHZhbHVlLCBpbmRleCk7CisgICAgICAgICAgICBpZiAobGFzdEJsb2NrTWFwW3RyYWNrQnlJZF0pIHsKKyAgICAgICAgICAgICAgLy8gZm91bmQgcHJldmlvdXNseSBzZWVuIGJsb2NrCisgICAgICAgICAgICAgIGJsb2NrID0gbGFzdEJsb2NrTWFwW3RyYWNrQnlJZF07CisgICAgICAgICAgICAgIGRlbGV0ZSBsYXN0QmxvY2tNYXBbdHJhY2tCeUlkXTsKKyAgICAgICAgICAgICAgbmV4dEJsb2NrTWFwW3RyYWNrQnlJZF0gPSBibG9jazsKKyAgICAgICAgICAgICAgbmV4dEJsb2NrT3JkZXJbaW5kZXhdID0gYmxvY2s7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRCbG9ja01hcFt0cmFja0J5SWRdKSB7CisgICAgICAgICAgICAgIC8vIGlmIGNvbGxpc2lvbiBkZXRlY3RlZC4gcmVzdG9yZSBsYXN0QmxvY2tNYXAgYW5kIHRocm93IGFuIGVycm9yCisgICAgICAgICAgICAgIGZvckVhY2gobmV4dEJsb2NrT3JkZXIsIGZ1bmN0aW9uKGJsb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrICYmIGJsb2NrLnNjb3BlKSBsYXN0QmxvY2tNYXBbYmxvY2suaWRdID0gYmxvY2s7CisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB0aHJvdyBuZ1JlcGVhdE1pbkVycignZHVwZXMnLAorICAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZXMgaW4gYSByZXBlYXRlciBhcmUgbm90IGFsbG93ZWQuIFVzZSAndHJhY2sgYnknIGV4cHJlc3Npb24gdG8gc3BlY2lmeSB1bmlxdWUga2V5cy4gUmVwZWF0ZXI6IHswfSwgRHVwbGljYXRlIGtleTogezF9LCBEdXBsaWNhdGUgdmFsdWU6IHsyfSIsCisgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLCB0cmFja0J5SWQsIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8vIG5ldyBuZXZlciBiZWZvcmUgc2VlbiBibG9jaworICAgICAgICAgICAgICBuZXh0QmxvY2tPcmRlcltpbmRleF0gPSB7aWQ6IHRyYWNrQnlJZCwgc2NvcGU6IHVuZGVmaW5lZCwgY2xvbmU6IHVuZGVmaW5lZH07CisgICAgICAgICAgICAgIG5leHRCbG9ja01hcFt0cmFja0J5SWRdID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyByZW1vdmUgbGVmdG92ZXIgaXRlbXMKKyAgICAgICAgICBmb3IgKHZhciBibG9ja0tleSBpbiBsYXN0QmxvY2tNYXApIHsKKyAgICAgICAgICAgIGJsb2NrID0gbGFzdEJsb2NrTWFwW2Jsb2NrS2V5XTsKKyAgICAgICAgICAgIGVsZW1lbnRzVG9SZW1vdmUgPSBnZXRCbG9ja05vZGVzKGJsb2NrLmNsb25lKTsKKyAgICAgICAgICAgICRhbmltYXRlLmxlYXZlKGVsZW1lbnRzVG9SZW1vdmUpOworICAgICAgICAgICAgaWYgKGVsZW1lbnRzVG9SZW1vdmVbMF0ucGFyZW50Tm9kZSkgeworICAgICAgICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCB3YXMgbm90IHJlbW92ZWQgeWV0IGJlY2F1c2Ugb2YgcGVuZGluZyBhbmltYXRpb24sIG1hcmsgaXQgYXMgZGVsZXRlZAorICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBpZ25vcmUgaXQgbGF0ZXIKKyAgICAgICAgICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGVsZW1lbnRzVG9SZW1vdmUubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGVsZW1lbnRzVG9SZW1vdmVbaW5kZXhdW05HX1JFTU9WRURdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxvY2suc2NvcGUuJGRlc3Ryb3koKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyB3ZSBhcmUgbm90IHVzaW5nIGZvckVhY2ggZm9yIHBlcmYgcmVhc29ucyAodHJ5aW5nIHRvIGF2b2lkICNjYWxsKQorICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvbGxlY3Rpb25MZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGtleSA9IChjb2xsZWN0aW9uID09PSBjb2xsZWN0aW9uS2V5cykgPyBpbmRleCA6IGNvbGxlY3Rpb25LZXlzW2luZGV4XTsKKyAgICAgICAgICAgIHZhbHVlID0gY29sbGVjdGlvbltrZXldOworICAgICAgICAgICAgYmxvY2sgPSBuZXh0QmxvY2tPcmRlcltpbmRleF07CisKKyAgICAgICAgICAgIGlmIChibG9jay5zY29wZSkgeworICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFscmVhZHkgc2VlbiB0aGlzIG9iamVjdCwgdGhlbiB3ZSBuZWVkIHRvIHJldXNlIHRoZQorICAgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHNjb3BlL2VsZW1lbnQKKworICAgICAgICAgICAgICBuZXh0Tm9kZSA9IHByZXZpb3VzTm9kZTsKKworICAgICAgICAgICAgICAvLyBza2lwIG5vZGVzIHRoYXQgYXJlIGFscmVhZHkgcGVuZGluZyByZW1vdmFsIHZpYSBsZWF2ZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG5leHROb2RlID0gbmV4dE5vZGUubmV4dFNpYmxpbmc7CisgICAgICAgICAgICAgIH0gd2hpbGUgKG5leHROb2RlICYmIG5leHROb2RlW05HX1JFTU9WRURdKTsKKworICAgICAgICAgICAgICBpZiAoZ2V0QmxvY2tTdGFydChibG9jaykgIT0gbmV4dE5vZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBpdGVtIHdoaWNoIGdvdCBtb3ZlZAorICAgICAgICAgICAgICAgICRhbmltYXRlLm1vdmUoZ2V0QmxvY2tOb2RlcyhibG9jay5jbG9uZSksIG51bGwsIGpxTGl0ZShwcmV2aW91c05vZGUpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBwcmV2aW91c05vZGUgPSBnZXRCbG9ja0VuZChibG9jayk7CisgICAgICAgICAgICAgIHVwZGF0ZVNjb3BlKGJsb2NrLnNjb3BlLCBpbmRleCwgdmFsdWVJZGVudGlmaWVyLCB2YWx1ZSwga2V5SWRlbnRpZmllciwga2V5LCBjb2xsZWN0aW9uTGVuZ3RoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8vIG5ldyBpdGVtIHdoaWNoIHdlIGRvbid0IGtub3cgYWJvdXQKKyAgICAgICAgICAgICAgJHRyYW5zY2x1ZGUoZnVuY3Rpb24gbmdSZXBlYXRUcmFuc2NsdWRlKGNsb25lLCBzY29wZSkgeworICAgICAgICAgICAgICAgIGJsb2NrLnNjb3BlID0gc2NvcGU7CisgICAgICAgICAgICAgICAgLy8gaHR0cDovL2pzcGVyZi5jb20vY2xvbmUtdnMtY3JlYXRlY29tbWVudAorICAgICAgICAgICAgICAgIHZhciBlbmROb2RlID0gbmdSZXBlYXRFbmRDb21tZW50LmNsb25lTm9kZShmYWxzZSk7CisgICAgICAgICAgICAgICAgY2xvbmVbY2xvbmUubGVuZ3RoKytdID0gZW5kTm9kZTsKKworICAgICAgICAgICAgICAgIC8vIFRPRE8ocGVyZik6IHN1cHBvcnQgbmFrZWQgcHJldmlvdXNOb2RlIGluIGBlbnRlcmAgdG8gYXZvaWQgY3JlYXRpb24gb2YganFMaXRlIHdyYXBwZXI/CisgICAgICAgICAgICAgICAgJGFuaW1hdGUuZW50ZXIoY2xvbmUsIG51bGwsIGpxTGl0ZShwcmV2aW91c05vZGUpKTsKKyAgICAgICAgICAgICAgICBwcmV2aW91c05vZGUgPSBlbmROb2RlOworICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIG9ubHkgbmVlZCB0aGUgZmlyc3QvbGFzdCBub2RlIG9mIHRoZSBjbG9uZWQgbm9kZXMuCisgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgbmVlZCB0byBrZWVwIHRoZSByZWZlcmVuY2UgdG8gdGhlIGpxbGl0ZSB3cmFwcGVyIGFzIGl0IG1pZ2h0IGJlIGNoYW5nZWQgbGF0ZXIKKyAgICAgICAgICAgICAgICAvLyBieSBhIGRpcmVjdGl2ZSB3aXRoIHRlbXBsYXRlVXJsIHdoZW4gaXRzIHRlbXBsYXRlIGFycml2ZXMuCisgICAgICAgICAgICAgICAgYmxvY2suY2xvbmUgPSBjbG9uZTsKKyAgICAgICAgICAgICAgICBuZXh0QmxvY2tNYXBbYmxvY2suaWRdID0gYmxvY2s7CisgICAgICAgICAgICAgICAgdXBkYXRlU2NvcGUoYmxvY2suc2NvcGUsIGluZGV4LCB2YWx1ZUlkZW50aWZpZXIsIHZhbHVlLCBrZXlJZGVudGlmaWVyLCBrZXksIGNvbGxlY3Rpb25MZW5ndGgpOworICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgbGFzdEJsb2NrTWFwID0gbmV4dEJsb2NrTWFwOworICAgICAgICB9KTsKKyAgICAgIH07CisgICAgfQorICB9OworfV07CisKK3ZhciBOR19ISURFX0NMQVNTID0gJ25nLWhpZGUnOwordmFyIE5HX0hJREVfSU5fUFJPR1JFU1NfQ0xBU1MgPSAnbmctaGlkZS1hbmltYXRlJzsKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdTaG93CisgKgorICogQGRlc2NyaXB0aW9uCisgKiBUaGUgYG5nU2hvd2AgZGlyZWN0aXZlIHNob3dzIG9yIGhpZGVzIHRoZSBnaXZlbiBIVE1MIGVsZW1lbnQgYmFzZWQgb24gdGhlIGV4cHJlc3Npb24KKyAqIHByb3ZpZGVkIHRvIHRoZSBgbmdTaG93YCBhdHRyaWJ1dGUuIFRoZSBlbGVtZW50IGlzIHNob3duIG9yIGhpZGRlbiBieSByZW1vdmluZyBvciBhZGRpbmcKKyAqIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBvbnRvIHRoZSBlbGVtZW50LiBUaGUgYC5uZy1oaWRlYCBDU1MgY2xhc3MgaXMgcHJlZGVmaW5lZAorICogaW4gQW5ndWxhckpTIGFuZCBzZXRzIHRoZSBkaXNwbGF5IHN0eWxlIHRvIG5vbmUgKHVzaW5nIGFuICFpbXBvcnRhbnQgZmxhZykuCisgKiBGb3IgQ1NQIG1vZGUgcGxlYXNlIGFkZCBgYW5ndWxhci1jc3AuY3NzYCB0byB5b3VyIGh0bWwgZmlsZSAoc2VlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDc3AgbmdDc3B9KS4KKyAqCisgKiBgYGBodG1sCisgKiA8IS0tIHdoZW4gJHNjb3BlLm15VmFsdWUgaXMgdHJ1dGh5IChlbGVtZW50IGlzIHZpc2libGUpIC0tPgorICogPGRpdiBuZy1zaG93PSJteVZhbHVlIj48L2Rpdj4KKyAqCisgKiA8IS0tIHdoZW4gJHNjb3BlLm15VmFsdWUgaXMgZmFsc3kgKGVsZW1lbnQgaXMgaGlkZGVuKSAtLT4KKyAqIDxkaXYgbmctc2hvdz0ibXlWYWx1ZSIgY2xhc3M9Im5nLWhpZGUiPjwvZGl2PgorICogYGBgCisgKgorICogV2hlbiB0aGUgYG5nU2hvd2AgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBmYWxzeSB2YWx1ZSB0aGVuIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBpcyBhZGRlZCB0byB0aGUgY2xhc3MKKyAqIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCBjYXVzaW5nIGl0IHRvIGJlY29tZSBoaWRkZW4uIFdoZW4gdHJ1dGh5LCB0aGUgYC5uZy1oaWRlYCBDU1MgY2xhc3MgaXMgcmVtb3ZlZAorICogZnJvbSB0aGUgZWxlbWVudCBjYXVzaW5nIHRoZSBlbGVtZW50IG5vdCB0byBhcHBlYXIgaGlkZGVuLgorICoKKyAqICMjIFdoeSBpcyAhaW1wb3J0YW50IHVzZWQ/CisgKgorICogWW91IG1heSBiZSB3b25kZXJpbmcgd2h5ICFpbXBvcnRhbnQgaXMgdXNlZCBmb3IgdGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzLiBUaGlzIGlzIGJlY2F1c2UgdGhlIGAubmctaGlkZWAgc2VsZWN0b3IKKyAqIGNhbiBiZSBlYXNpbHkgb3ZlcnJpZGRlbiBieSBoZWF2aWVyIHNlbGVjdG9ycy4gRm9yIGV4YW1wbGUsIHNvbWV0aGluZyBhcyBzaW1wbGUKKyAqIGFzIGNoYW5naW5nIHRoZSBkaXNwbGF5IHN0eWxlIG9uIGEgSFRNTCBsaXN0IGl0ZW0gd291bGQgbWFrZSBoaWRkZW4gZWxlbWVudHMgYXBwZWFyIHZpc2libGUuCisgKiBUaGlzIGFsc28gYmVjb21lcyBhIGJpZ2dlciBpc3N1ZSB3aGVuIGRlYWxpbmcgd2l0aCBDU1MgZnJhbWV3b3Jrcy4KKyAqCisgKiBCeSB1c2luZyAhaW1wb3J0YW50LCB0aGUgc2hvdyBhbmQgaGlkZSBiZWhhdmlvciB3aWxsIHdvcmsgYXMgZXhwZWN0ZWQgZGVzcGl0ZSBhbnkgY2xhc2ggYmV0d2VlbiBDU1Mgc2VsZWN0b3IKKyAqIHNwZWNpZmljaXR5ICh3aGVuICFpbXBvcnRhbnQgaXNuJ3QgdXNlZCB3aXRoIGFueSBjb25mbGljdGluZyBzdHlsZXMpLiBJZiBhIGRldmVsb3BlciBjaG9vc2VzIHRvIG92ZXJyaWRlIHRoZQorICogc3R5bGluZyB0byBjaGFuZ2UgaG93IHRvIGhpZGUgYW4gZWxlbWVudCB0aGVuIGl0IGlzIGp1c3QgYSBtYXR0ZXIgb2YgdXNpbmcgIWltcG9ydGFudCBpbiB0aGVpciBvd24gQ1NTIGNvZGUuCisgKgorICogIyMjIE92ZXJyaWRpbmcgYC5uZy1oaWRlYAorICoKKyAqIEJ5IGRlZmF1bHQsIHRoZSBgLm5nLWhpZGVgIGNsYXNzIHdpbGwgc3R5bGUgdGhlIGVsZW1lbnQgd2l0aCBgZGlzcGxheTogbm9uZSFpbXBvcnRhbnRgLiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UKKyAqIHRoZSBoaWRlIGJlaGF2aW9yIHdpdGggbmdTaG93L25nSGlkZSB0aGVuIHRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJlc3RhdGluZyB0aGUgc3R5bGVzIGZvciB0aGUgYC5uZy1oaWRlYAorICogY2xhc3MgaW4gQ1NTOgorICoKKyAqIGBgYGNzcworICogLm5nLWhpZGUgeworICogICAvJiM0MjsgdGhpcyBpcyBqdXN0IGFub3RoZXIgZm9ybSBvZiBoaWRpbmcgYW4gZWxlbWVudCAmIzQyOy8KKyAqICAgZGlzcGxheTogYmxvY2shaW1wb3J0YW50OworICogICBwb3NpdGlvbjogYWJzb2x1dGU7CisgKiAgIHRvcDogLTk5OTlweDsKKyAqICAgbGVmdDogLTk5OTlweDsKKyAqIH0KKyAqIGBgYAorICoKKyAqIEJ5IGRlZmF1bHQgeW91IGRvbid0IG5lZWQgdG8gb3ZlcnJpZGUgaW4gQ1NTIGFueXRoaW5nIGFuZCB0aGUgYW5pbWF0aW9ucyB3aWxsIHdvcmsgYXJvdW5kIHRoZSBkaXNwbGF5IHN0eWxlLgorICoKKyAqICMjIEEgbm90ZSBhYm91dCBhbmltYXRpb25zIHdpdGggYG5nU2hvd2AKKyAqCisgKiBBbmltYXRpb25zIGluIG5nU2hvdy9uZ0hpZGUgd29yayB3aXRoIHRoZSBzaG93IGFuZCBoaWRlIGV2ZW50cyB0aGF0IGFyZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGlyZWN0aXZlIGV4cHJlc3Npb24KKyAqIGlzIHRydWUgYW5kIGZhbHNlLiBUaGlzIHN5c3RlbSB3b3JrcyBsaWtlIHRoZSBhbmltYXRpb24gc3lzdGVtIHByZXNlbnQgd2l0aCBuZ0NsYXNzIGV4Y2VwdCB0aGF0CisgKiB5b3UgbXVzdCBhbHNvIGluY2x1ZGUgdGhlICFpbXBvcnRhbnQgZmxhZyB0byBvdmVycmlkZSB0aGUgZGlzcGxheSBwcm9wZXJ0eQorICogc28gdGhhdCB5b3UgY2FuIHBlcmZvcm0gYW4gYW5pbWF0aW9uIHdoZW4gdGhlIGVsZW1lbnQgaXMgaGlkZGVuIGR1cmluZyB0aGUgdGltZSBvZiB0aGUgYW5pbWF0aW9uLgorICoKKyAqIGBgYGNzcworICogLy8KKyAqIC8vYSB3b3JraW5nIGV4YW1wbGUgY2FuIGJlIGZvdW5kIGF0IHRoZSBib3R0b20gb2YgdGhpcyBwYWdlCisgKiAvLworICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQsIC5teS1lbGVtZW50Lm5nLWhpZGUtcmVtb3ZlIHsKKyAqICAgLyYjNDI7IHRoaXMgaXMgcmVxdWlyZWQgYXMgb2YgMS4zeCB0byBwcm9wZXJseQorICogICAgICBhcHBseSBhbGwgc3R5bGluZyBpbiBhIHNob3cvaGlkZSBhbmltYXRpb24gJiM0MjsvCisgKiAgIHRyYW5zaXRpb246IDBzIGxpbmVhciBhbGw7CisgKiB9CisgKgorICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQtYWN0aXZlLAorICogLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUtYWN0aXZlIHsKKyAqICAgLyYjNDI7IHRoZSB0cmFuc2l0aW9uIGlzIGRlZmluZWQgaW4gdGhlIGFjdGl2ZSBjbGFzcyAmIzQyOy8KKyAqICAgdHJhbnNpdGlvbjogMXMgbGluZWFyIGFsbDsKKyAqIH0KKyAqCisgKiAubXktZWxlbWVudC5uZy1oaWRlLWFkZCB7IC4uLiB9CisgKiAubXktZWxlbWVudC5uZy1oaWRlLWFkZC5uZy1oaWRlLWFkZC1hY3RpdmUgeyAuLi4gfQorICogLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUgeyAuLi4gfQorICogLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUubmctaGlkZS1yZW1vdmUtYWN0aXZlIHsgLi4uIH0KKyAqIGBgYAorICoKKyAqIEtlZXAgaW4gbWluZCB0aGF0LCBhcyBvZiBBbmd1bGFySlMgdmVyc2lvbiAxLjMuMC1iZXRhLjExLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNoYW5nZSB0aGUgZGlzcGxheQorICogcHJvcGVydHkgdG8gYmxvY2sgZHVyaW5nIGFuaW1hdGlvbiBzdGF0ZXMtLW5nQW5pbWF0ZSB3aWxsIGhhbmRsZSB0aGUgc3R5bGUgdG9nZ2xpbmcgYXV0b21hdGljYWxseSBmb3IgeW91LgorICoKKyAqIEBhbmltYXRpb25zCisgKiBhZGRDbGFzczogYC5uZy1oaWRlYCAtIGhhcHBlbnMgYWZ0ZXIgdGhlIGBuZ1Nob3dgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgdHJ1dGh5IHZhbHVlIGFuZCB0aGUganVzdCBiZWZvcmUgY29udGVudHMgYXJlIHNldCB0byB2aXNpYmxlCisgKiByZW1vdmVDbGFzczogYC5uZy1oaWRlYCAtIGhhcHBlbnMgYWZ0ZXIgdGhlIGBuZ1Nob3dgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgbm9uIHRydXRoeSB2YWx1ZSBhbmQganVzdCBiZWZvcmUgdGhlIGNvbnRlbnRzIGFyZSBzZXQgdG8gaGlkZGVuCisgKgorICogQGVsZW1lbnQgQU5ZCisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nU2hvdyBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5CisgKiAgICAgdGhlbiB0aGUgZWxlbWVudCBpcyBzaG93biBvciBoaWRkZW4gcmVzcGVjdGl2ZWx5LgorICoKKyAqIEBleGFtcGxlCisgIDxleGFtcGxlIG1vZHVsZT0ibmdBbmltYXRlIiBkZXBzPSJhbmd1bGFyLWFuaW1hdGUuanMiIGFuaW1hdGlvbnM9InRydWUiPgorICAgIDxmaWxlIG5hbWU9ImluZGV4Lmh0bWwiPgorICAgICAgQ2xpY2sgbWU6IDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImNoZWNrZWQiPjxici8+CisgICAgICA8ZGl2PgorICAgICAgICBTaG93OgorICAgICAgICA8ZGl2IGNsYXNzPSJjaGVjay1lbGVtZW50IGFuaW1hdGUtc2hvdyIgbmctc2hvdz0iY2hlY2tlZCI+CisgICAgICAgICAgPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGh1bWJzLXVwIj48L3NwYW4+IEkgc2hvdyB1cCB3aGVuIHlvdXIgY2hlY2tib3ggaXMgY2hlY2tlZC4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICAgIDxkaXY+CisgICAgICAgIEhpZGU6CisgICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrLWVsZW1lbnQgYW5pbWF0ZS1zaG93IiBuZy1oaWRlPSJjaGVja2VkIj4KKyAgICAgICAgICA8c3BhbiBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi10aHVtYnMtZG93biI+PC9zcGFuPiBJIGhpZGUgd2hlbiB5b3VyIGNoZWNrYm94IGlzIGNoZWNrZWQuCisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgPC9maWxlPgorICAgIDxmaWxlIG5hbWU9ImdseXBoaWNvbnMuY3NzIj4KKyAgICAgIEBpbXBvcnQgdXJsKC4uLy4uL2NvbXBvbmVudHMvYm9vdHN0cmFwLTMuMS4xL2Nzcy9ib290c3RyYXAuY3NzKTsKKyAgICA8L2ZpbGU+CisgICAgPGZpbGUgbmFtZT0iYW5pbWF0aW9ucy5jc3MiPgorICAgICAgLmFuaW1hdGUtc2hvdyB7CisgICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OworICAgICAgICBvcGFjaXR5OiAxOworICAgICAgICBwYWRkaW5nOiAxMHB4OworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsKKyAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CisgICAgICB9CisKKyAgICAgIC5hbmltYXRlLXNob3cubmctaGlkZS1hZGQubmctaGlkZS1hZGQtYWN0aXZlLAorICAgICAgLmFuaW1hdGUtc2hvdy5uZy1oaWRlLXJlbW92ZS5uZy1oaWRlLXJlbW92ZS1hY3RpdmUgeworICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCBsaW5lYXIgMC41czsKKyAgICAgICAgdHJhbnNpdGlvbjogYWxsIGxpbmVhciAwLjVzOworICAgICAgfQorCisgICAgICAuYW5pbWF0ZS1zaG93Lm5nLWhpZGUgeworICAgICAgICBsaW5lLWhlaWdodDogMDsKKyAgICAgICAgb3BhY2l0eTogMDsKKyAgICAgICAgcGFkZGluZzogMCAxMHB4OworICAgICAgfQorCisgICAgICAuY2hlY2stZWxlbWVudCB7CisgICAgICAgIHBhZGRpbmc6IDEwcHg7CisgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOworICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKKyAgICAgIH0KKyAgICA8L2ZpbGU+CisgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICB2YXIgdGh1bWJzVXAgPSBlbGVtZW50KGJ5LmNzcygnc3Bhbi5nbHlwaGljb24tdGh1bWJzLXVwJykpOworICAgICAgdmFyIHRodW1ic0Rvd24gPSBlbGVtZW50KGJ5LmNzcygnc3Bhbi5nbHlwaGljb24tdGh1bWJzLWRvd24nKSk7CisKKyAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctc2hvdyAvIG5nLWhpZGUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgZXhwZWN0KHRodW1ic1VwLmlzRGlzcGxheWVkKCkpLnRvQmVGYWxzeSgpOworICAgICAgICBleHBlY3QodGh1bWJzRG93bi5pc0Rpc3BsYXllZCgpKS50b0JlVHJ1dGh5KCk7CisKKyAgICAgICAgZWxlbWVudChieS5tb2RlbCgnY2hlY2tlZCcpKS5jbGljaygpOworCisgICAgICAgIGV4cGVjdCh0aHVtYnNVcC5pc0Rpc3BsYXllZCgpKS50b0JlVHJ1dGh5KCk7CisgICAgICAgIGV4cGVjdCh0aHVtYnNEb3duLmlzRGlzcGxheWVkKCkpLnRvQmVGYWxzeSgpOworICAgICAgfSk7CisgICAgPC9maWxlPgorICA8L2V4YW1wbGU+CisgKi8KK3ZhciBuZ1Nob3dEaXJlY3RpdmUgPSBbJyRhbmltYXRlJywgZnVuY3Rpb24oJGFuaW1hdGUpIHsKKyAgcmV0dXJuIHsKKyAgICByZXN0cmljdDogJ0EnLAorICAgIG11bHRpRWxlbWVudDogdHJ1ZSwKKyAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cikgeworICAgICAgc2NvcGUuJHdhdGNoKGF0dHIubmdTaG93LCBmdW5jdGlvbiBuZ1Nob3dXYXRjaEFjdGlvbih2YWx1ZSkgeworICAgICAgICAvLyB3ZSdyZSBhZGRpbmcgYSB0ZW1wb3JhcnksIGFuaW1hdGlvbi1zcGVjaWZpYyBjbGFzcyBmb3IgbmctaGlkZSBzaW5jZSB0aGlzIHdheQorICAgICAgICAvLyB3ZSBjYW4gY29udHJvbCB3aGVuIHRoZSBlbGVtZW50IGlzIGFjdHVhbGx5IGRpc3BsYXllZCBvbiBzY3JlZW4gd2l0aG91dCBoYXZpbmcKKyAgICAgICAgLy8gdG8gaGF2ZSBhIGdsb2JhbC9ncmVlZHkgQ1NTIHNlbGVjdG9yIHRoYXQgYnJlYWtzIHdoZW4gb3RoZXIgYW5pbWF0aW9ucyBhcmUgcnVuLgorICAgICAgICAvLyBSZWFkOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2lzc3Vlcy85MTAzI2lzc3VlY29tbWVudC01ODMzNTg0NQorICAgICAgICAkYW5pbWF0ZVt2YWx1ZSA/ICdyZW1vdmVDbGFzcycgOiAnYWRkQ2xhc3MnXShlbGVtZW50LCBOR19ISURFX0NMQVNTLCB7CisgICAgICAgICAgdGVtcENsYXNzZXM6IE5HX0hJREVfSU5fUFJPR1JFU1NfQ0xBU1MKKyAgICAgICAgfSk7CisgICAgICB9KTsKKyAgICB9CisgIH07Cit9XTsKKworCisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIG5nSGlkZQorICoKKyAqIEBkZXNjcmlwdGlvbgorICogVGhlIGBuZ0hpZGVgIGRpcmVjdGl2ZSBzaG93cyBvciBoaWRlcyB0aGUgZ2l2ZW4gSFRNTCBlbGVtZW50IGJhc2VkIG9uIHRoZSBleHByZXNzaW9uCisgKiBwcm92aWRlZCB0byB0aGUgYG5nSGlkZWAgYXR0cmlidXRlLiBUaGUgZWxlbWVudCBpcyBzaG93biBvciBoaWRkZW4gYnkgcmVtb3Zpbmcgb3IgYWRkaW5nCisgKiB0aGUgYG5nLWhpZGVgIENTUyBjbGFzcyBvbnRvIHRoZSBlbGVtZW50LiBUaGUgYC5uZy1oaWRlYCBDU1MgY2xhc3MgaXMgcHJlZGVmaW5lZAorICogaW4gQW5ndWxhckpTIGFuZCBzZXRzIHRoZSBkaXNwbGF5IHN0eWxlIHRvIG5vbmUgKHVzaW5nIGFuICFpbXBvcnRhbnQgZmxhZykuCisgKiBGb3IgQ1NQIG1vZGUgcGxlYXNlIGFkZCBgYW5ndWxhci1jc3AuY3NzYCB0byB5b3VyIGh0bWwgZmlsZSAoc2VlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDc3AgbmdDc3B9KS4KKyAqCisgKiBgYGBodG1sCisgKiA8IS0tIHdoZW4gJHNjb3BlLm15VmFsdWUgaXMgdHJ1dGh5IChlbGVtZW50IGlzIGhpZGRlbikgLS0+CisgKiA8ZGl2IG5nLWhpZGU9Im15VmFsdWUiIGNsYXNzPSJuZy1oaWRlIj48L2Rpdj4KKyAqCisgKiA8IS0tIHdoZW4gJHNjb3BlLm15VmFsdWUgaXMgZmFsc3kgKGVsZW1lbnQgaXMgdmlzaWJsZSkgLS0+CisgKiA8ZGl2IG5nLWhpZGU9Im15VmFsdWUiPjwvZGl2PgorICogYGBgCisgKgorICogV2hlbiB0aGUgYG5nSGlkZWAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSB0cnV0aHkgdmFsdWUgdGhlbiB0aGUgYC5uZy1oaWRlYCBDU1MgY2xhc3MgaXMgYWRkZWQgdG8gdGhlIGNsYXNzCisgKiBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgY2F1c2luZyBpdCB0byBiZWNvbWUgaGlkZGVuLiBXaGVuIGZhbHN5LCB0aGUgYC5uZy1oaWRlYCBDU1MgY2xhc3MgaXMgcmVtb3ZlZAorICogZnJvbSB0aGUgZWxlbWVudCBjYXVzaW5nIHRoZSBlbGVtZW50IG5vdCB0byBhcHBlYXIgaGlkZGVuLgorICoKKyAqICMjIFdoeSBpcyAhaW1wb3J0YW50IHVzZWQ/CisgKgorICogWW91IG1heSBiZSB3b25kZXJpbmcgd2h5ICFpbXBvcnRhbnQgaXMgdXNlZCBmb3IgdGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzLiBUaGlzIGlzIGJlY2F1c2UgdGhlIGAubmctaGlkZWAgc2VsZWN0b3IKKyAqIGNhbiBiZSBlYXNpbHkgb3ZlcnJpZGRlbiBieSBoZWF2aWVyIHNlbGVjdG9ycy4gRm9yIGV4YW1wbGUsIHNvbWV0aGluZyBhcyBzaW1wbGUKKyAqIGFzIGNoYW5naW5nIHRoZSBkaXNwbGF5IHN0eWxlIG9uIGEgSFRNTCBsaXN0IGl0ZW0gd291bGQgbWFrZSBoaWRkZW4gZWxlbWVudHMgYXBwZWFyIHZpc2libGUuCisgKiBUaGlzIGFsc28gYmVjb21lcyBhIGJpZ2dlciBpc3N1ZSB3aGVuIGRlYWxpbmcgd2l0aCBDU1MgZnJhbWV3b3Jrcy4KKyAqCisgKiBCeSB1c2luZyAhaW1wb3J0YW50LCB0aGUgc2hvdyBhbmQgaGlkZSBiZWhhdmlvciB3aWxsIHdvcmsgYXMgZXhwZWN0ZWQgZGVzcGl0ZSBhbnkgY2xhc2ggYmV0d2VlbiBDU1Mgc2VsZWN0b3IKKyAqIHNwZWNpZmljaXR5ICh3aGVuICFpbXBvcnRhbnQgaXNuJ3QgdXNlZCB3aXRoIGFueSBjb25mbGljdGluZyBzdHlsZXMpLiBJZiBhIGRldmVsb3BlciBjaG9vc2VzIHRvIG92ZXJyaWRlIHRoZQorICogc3R5bGluZyB0byBjaGFuZ2UgaG93IHRvIGhpZGUgYW4gZWxlbWVudCB0aGVuIGl0IGlzIGp1c3QgYSBtYXR0ZXIgb2YgdXNpbmcgIWltcG9ydGFudCBpbiB0aGVpciBvd24gQ1NTIGNvZGUuCisgKgorICogIyMjIE92ZXJyaWRpbmcgYC5uZy1oaWRlYAorICoKKyAqIEJ5IGRlZmF1bHQsIHRoZSBgLm5nLWhpZGVgIGNsYXNzIHdpbGwgc3R5bGUgdGhlIGVsZW1lbnQgd2l0aCBgZGlzcGxheTogbm9uZSFpbXBvcnRhbnRgLiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UKKyAqIHRoZSBoaWRlIGJlaGF2aW9yIHdpdGggbmdTaG93L25nSGlkZSB0aGVuIHRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJlc3RhdGluZyB0aGUgc3R5bGVzIGZvciB0aGUgYC5uZy1oaWRlYAorICogY2xhc3MgaW4gQ1NTOgorICoKKyAqIGBgYGNzcworICogLm5nLWhpZGUgeworICogICAvJiM0MjsgdGhpcyBpcyBqdXN0IGFub3RoZXIgZm9ybSBvZiBoaWRpbmcgYW4gZWxlbWVudCAmIzQyOy8KKyAqICAgZGlzcGxheTogYmxvY2shaW1wb3J0YW50OworICogICBwb3NpdGlvbjogYWJzb2x1dGU7CisgKiAgIHRvcDogLTk5OTlweDsKKyAqICAgbGVmdDogLTk5OTlweDsKKyAqIH0KKyAqIGBgYAorICoKKyAqIEJ5IGRlZmF1bHQgeW91IGRvbid0IG5lZWQgdG8gb3ZlcnJpZGUgaW4gQ1NTIGFueXRoaW5nIGFuZCB0aGUgYW5pbWF0aW9ucyB3aWxsIHdvcmsgYXJvdW5kIHRoZSBkaXNwbGF5IHN0eWxlLgorICoKKyAqICMjIEEgbm90ZSBhYm91dCBhbmltYXRpb25zIHdpdGggYG5nSGlkZWAKKyAqCisgKiBBbmltYXRpb25zIGluIG5nU2hvdy9uZ0hpZGUgd29yayB3aXRoIHRoZSBzaG93IGFuZCBoaWRlIGV2ZW50cyB0aGF0IGFyZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGlyZWN0aXZlIGV4cHJlc3Npb24KKyAqIGlzIHRydWUgYW5kIGZhbHNlLiBUaGlzIHN5c3RlbSB3b3JrcyBsaWtlIHRoZSBhbmltYXRpb24gc3lzdGVtIHByZXNlbnQgd2l0aCBuZ0NsYXNzLCBleGNlcHQgdGhhdCB0aGUgYC5uZy1oaWRlYAorICogQ1NTIGNsYXNzIGlzIGFkZGVkIGFuZCByZW1vdmVkIGZvciB5b3UgaW5zdGVhZCBvZiB5b3VyIG93biBDU1MgY2xhc3MuCisgKgorICogYGBgY3NzCisgKiAvLworICogLy9hIHdvcmtpbmcgZXhhbXBsZSBjYW4gYmUgZm91bmQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIHBhZ2UKKyAqIC8vCisgKiAubXktZWxlbWVudC5uZy1oaWRlLWFkZCwgLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUgeworICogICB0cmFuc2l0aW9uOiAwLjVzIGxpbmVhciBhbGw7CisgKiB9CisgKgorICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQgeyAuLi4gfQorICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQubmctaGlkZS1hZGQtYWN0aXZlIHsgLi4uIH0KKyAqIC5teS1lbGVtZW50Lm5nLWhpZGUtcmVtb3ZlIHsgLi4uIH0KKyAqIC5teS1lbGVtZW50Lm5nLWhpZGUtcmVtb3ZlLm5nLWhpZGUtcmVtb3ZlLWFjdGl2ZSB7IC4uLiB9CisgKiBgYGAKKyAqCisgKiBLZWVwIGluIG1pbmQgdGhhdCwgYXMgb2YgQW5ndWxhckpTIHZlcnNpb24gMS4zLjAtYmV0YS4xMSwgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgdGhlIGRpc3BsYXkKKyAqIHByb3BlcnR5IHRvIGJsb2NrIGR1cmluZyBhbmltYXRpb24gc3RhdGVzLS1uZ0FuaW1hdGUgd2lsbCBoYW5kbGUgdGhlIHN0eWxlIHRvZ2dsaW5nIGF1dG9tYXRpY2FsbHkgZm9yIHlvdS4KKyAqCisgKiBAYW5pbWF0aW9ucworICogcmVtb3ZlQ2xhc3M6IGAubmctaGlkZWAgLSBoYXBwZW5zIGFmdGVyIHRoZSBgbmdIaWRlYCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHRydXRoeSB2YWx1ZSBhbmQganVzdCBiZWZvcmUgdGhlIGNvbnRlbnRzIGFyZSBzZXQgdG8gaGlkZGVuCisgKiBhZGRDbGFzczogYC5uZy1oaWRlYCAtIGhhcHBlbnMgYWZ0ZXIgdGhlIGBuZ0hpZGVgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgbm9uIHRydXRoeSB2YWx1ZSBhbmQganVzdCBiZWZvcmUgdGhlIGNvbnRlbnRzIGFyZSBzZXQgdG8gdmlzaWJsZQorICoKKyAqIEBlbGVtZW50IEFOWQorICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0hpZGUgSWYgdGhlIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGlzIHRydXRoeSB0aGVuCisgKiAgICAgdGhlIGVsZW1lbnQgaXMgc2hvd24gb3IgaGlkZGVuIHJlc3BlY3RpdmVseS4KKyAqCisgKiBAZXhhbXBsZQorICA8ZXhhbXBsZSBtb2R1bGU9Im5nQW5pbWF0ZSIgZGVwcz0iYW5ndWxhci1hbmltYXRlLmpzIiBhbmltYXRpb25zPSJ0cnVlIj4KKyAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgIENsaWNrIG1lOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJjaGVja2VkIj48YnIvPgorICAgICAgPGRpdj4KKyAgICAgICAgU2hvdzoKKyAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2stZWxlbWVudCBhbmltYXRlLWhpZGUiIG5nLXNob3c9ImNoZWNrZWQiPgorICAgICAgICAgIDxzcGFuIGNsYXNzPSJnbHlwaGljb24gZ2x5cGhpY29uLXRodW1icy11cCI+PC9zcGFuPiBJIHNob3cgdXAgd2hlbiB5b3VyIGNoZWNrYm94IGlzIGNoZWNrZWQuCisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2PgorICAgICAgICBIaWRlOgorICAgICAgICA8ZGl2IGNsYXNzPSJjaGVjay1lbGVtZW50IGFuaW1hdGUtaGlkZSIgbmctaGlkZT0iY2hlY2tlZCI+CisgICAgICAgICAgPHNwYW4gY2xhc3M9ImdseXBoaWNvbiBnbHlwaGljb24tdGh1bWJzLWRvd24iPjwvc3Bhbj4gSSBoaWRlIHdoZW4geW91ciBjaGVja2JveCBpcyBjaGVja2VkLgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgIDwvZmlsZT4KKyAgICA8ZmlsZSBuYW1lPSJnbHlwaGljb25zLmNzcyI+CisgICAgICBAaW1wb3J0IHVybCguLi8uLi9jb21wb25lbnRzL2Jvb3RzdHJhcC0zLjEuMS9jc3MvYm9vdHN0cmFwLmNzcyk7CisgICAgPC9maWxlPgorICAgIDxmaWxlIG5hbWU9ImFuaW1hdGlvbnMuY3NzIj4KKyAgICAgIC5hbmltYXRlLWhpZGUgeworICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCBsaW5lYXIgMC41czsKKyAgICAgICAgdHJhbnNpdGlvbjogYWxsIGxpbmVhciAwLjVzOworICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKKyAgICAgICAgb3BhY2l0eTogMTsKKyAgICAgICAgcGFkZGluZzogMTBweDsKKyAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CisgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOworICAgICAgfQorCisgICAgICAuYW5pbWF0ZS1oaWRlLm5nLWhpZGUgeworICAgICAgICBsaW5lLWhlaWdodDogMDsKKyAgICAgICAgb3BhY2l0eTogMDsKKyAgICAgICAgcGFkZGluZzogMCAxMHB4OworICAgICAgfQorCisgICAgICAuY2hlY2stZWxlbWVudCB7CisgICAgICAgIHBhZGRpbmc6IDEwcHg7CisgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOworICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKKyAgICAgIH0KKyAgICA8L2ZpbGU+CisgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICB2YXIgdGh1bWJzVXAgPSBlbGVtZW50KGJ5LmNzcygnc3Bhbi5nbHlwaGljb24tdGh1bWJzLXVwJykpOworICAgICAgdmFyIHRodW1ic0Rvd24gPSBlbGVtZW50KGJ5LmNzcygnc3Bhbi5nbHlwaGljb24tdGh1bWJzLWRvd24nKSk7CisKKyAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctc2hvdyAvIG5nLWhpZGUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgZXhwZWN0KHRodW1ic1VwLmlzRGlzcGxheWVkKCkpLnRvQmVGYWxzeSgpOworICAgICAgICBleHBlY3QodGh1bWJzRG93bi5pc0Rpc3BsYXllZCgpKS50b0JlVHJ1dGh5KCk7CisKKyAgICAgICAgZWxlbWVudChieS5tb2RlbCgnY2hlY2tlZCcpKS5jbGljaygpOworCisgICAgICAgIGV4cGVjdCh0aHVtYnNVcC5pc0Rpc3BsYXllZCgpKS50b0JlVHJ1dGh5KCk7CisgICAgICAgIGV4cGVjdCh0aHVtYnNEb3duLmlzRGlzcGxheWVkKCkpLnRvQmVGYWxzeSgpOworICAgICAgfSk7CisgICAgPC9maWxlPgorICA8L2V4YW1wbGU+CisgKi8KK3ZhciBuZ0hpZGVEaXJlY3RpdmUgPSBbJyRhbmltYXRlJywgZnVuY3Rpb24oJGFuaW1hdGUpIHsKKyAgcmV0dXJuIHsKKyAgICByZXN0cmljdDogJ0EnLAorICAgIG11bHRpRWxlbWVudDogdHJ1ZSwKKyAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cikgeworICAgICAgc2NvcGUuJHdhdGNoKGF0dHIubmdIaWRlLCBmdW5jdGlvbiBuZ0hpZGVXYXRjaEFjdGlvbih2YWx1ZSkgeworICAgICAgICAvLyBUaGUgY29tbWVudCBpbnNpZGUgb2YgdGhlIG5nU2hvd0RpcmVjdGl2ZSBleHBsYWlucyB3aHkgd2UgYWRkIGFuZAorICAgICAgICAvLyByZW1vdmUgYSB0ZW1wb3JhcnkgY2xhc3MgZm9yIHRoZSBzaG93L2hpZGUgYW5pbWF0aW9uCisgICAgICAgICRhbmltYXRlW3ZhbHVlID8gJ2FkZENsYXNzJyA6ICdyZW1vdmVDbGFzcyddKGVsZW1lbnQsTkdfSElERV9DTEFTUywgeworICAgICAgICAgIHRlbXBDbGFzc2VzOiBOR19ISURFX0lOX1BST0dSRVNTX0NMQVNTCisgICAgICAgIH0pOworICAgICAgfSk7CisgICAgfQorICB9OworfV07CisKKy8qKgorICogQG5nZG9jIGRpcmVjdGl2ZQorICogQG5hbWUgbmdTdHlsZQorICogQHJlc3RyaWN0IEFDCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBUaGUgYG5nU3R5bGVgIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIHNldCBDU1Mgc3R5bGUgb24gYW4gSFRNTCBlbGVtZW50IGNvbmRpdGlvbmFsbHkuCisgKgorICogQGVsZW1lbnQgQU5ZCisgKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nU3R5bGUKKyAqCisgKiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB3aGljaCBldmFscyB0byBhbgorICogb2JqZWN0IHdob3NlIGtleXMgYXJlIENTUyBzdHlsZSBuYW1lcyBhbmQgdmFsdWVzIGFyZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhvc2UgQ1NTCisgKiBrZXlzLgorICoKKyAqIFNpbmNlIHNvbWUgQ1NTIHN0eWxlIG5hbWVzIGFyZSBub3QgdmFsaWQga2V5cyBmb3IgYW4gb2JqZWN0LCB0aGV5IG11c3QgYmUgcXVvdGVkLgorICogU2VlIHRoZSAnYmFja2dyb3VuZC1jb2xvcicgc3R5bGUgaW4gdGhlIGV4YW1wbGUgYmVsb3cuCisgKgorICogQGV4YW1wbGUKKyAgIDxleGFtcGxlPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9InNldCBjb2xvciIgbmctY2xpY2s9Im15U3R5bGU9e2NvbG9yOidyZWQnfSI+CisgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJzZXQgYmFja2dyb3VuZCIgbmctY2xpY2s9Im15U3R5bGU9eydiYWNrZ3JvdW5kLWNvbG9yJzonYmx1ZSd9Ij4KKyAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9ImNsZWFyIiBuZy1jbGljaz0ibXlTdHlsZT17fSI+CisgICAgICAgIDxici8+CisgICAgICAgIDxzcGFuIG5nLXN0eWxlPSJteVN0eWxlIj5TYW1wbGUgVGV4dDwvc3Bhbj4KKyAgICAgICAgPHByZT5teVN0eWxlPXt7bXlTdHlsZX19PC9wcmU+CisgICAgIDwvZmlsZT4KKyAgICAgPGZpbGUgbmFtZT0ic3R5bGUuY3NzIj4KKyAgICAgICBzcGFuIHsKKyAgICAgICAgIGNvbG9yOiBibGFjazsKKyAgICAgICB9CisgICAgIDwvZmlsZT4KKyAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgdmFyIGNvbG9yU3BhbiA9IGVsZW1lbnQoYnkuY3NzKCdzcGFuJykpOworCisgICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1zdHlsZScsIGZ1bmN0aW9uKCkgeworICAgICAgICAgZXhwZWN0KGNvbG9yU3Bhbi5nZXRDc3NWYWx1ZSgnY29sb3InKSkudG9CZSgncmdiYSgwLCAwLCAwLCAxKScpOworICAgICAgICAgZWxlbWVudChieS5jc3MoJ2lucHV0W3ZhbHVlPVwnc2V0IGNvbG9yXCddJykpLmNsaWNrKCk7CisgICAgICAgICBleHBlY3QoY29sb3JTcGFuLmdldENzc1ZhbHVlKCdjb2xvcicpKS50b0JlKCdyZ2JhKDI1NSwgMCwgMCwgMSknKTsKKyAgICAgICAgIGVsZW1lbnQoYnkuY3NzKCdpbnB1dFt2YWx1ZT1jbGVhcl0nKSkuY2xpY2soKTsKKyAgICAgICAgIGV4cGVjdChjb2xvclNwYW4uZ2V0Q3NzVmFsdWUoJ2NvbG9yJykpLnRvQmUoJ3JnYmEoMCwgMCwgMCwgMSknKTsKKyAgICAgICB9KTsKKyAgICAgPC9maWxlPgorICAgPC9leGFtcGxlPgorICovCit2YXIgbmdTdHlsZURpcmVjdGl2ZSA9IG5nRGlyZWN0aXZlKGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7CisgIHNjb3BlLiR3YXRjaChhdHRyLm5nU3R5bGUsIGZ1bmN0aW9uIG5nU3R5bGVXYXRjaEFjdGlvbihuZXdTdHlsZXMsIG9sZFN0eWxlcykgeworICAgIGlmIChvbGRTdHlsZXMgJiYgKG5ld1N0eWxlcyAhPT0gb2xkU3R5bGVzKSkgeworICAgICAgZm9yRWFjaChvbGRTdHlsZXMsIGZ1bmN0aW9uKHZhbCwgc3R5bGUpIHsgZWxlbWVudC5jc3Moc3R5bGUsICcnKTt9KTsKKyAgICB9CisgICAgaWYgKG5ld1N0eWxlcykgZWxlbWVudC5jc3MobmV3U3R5bGVzKTsKKyAgfSwgdHJ1ZSk7Cit9KTsKKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ1N3aXRjaAorICogQHJlc3RyaWN0IEVBCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBUaGUgYG5nU3dpdGNoYCBkaXJlY3RpdmUgaXMgdXNlZCB0byBjb25kaXRpb25hbGx5IHN3YXAgRE9NIHN0cnVjdHVyZSBvbiB5b3VyIHRlbXBsYXRlIGJhc2VkIG9uIGEgc2NvcGUgZXhwcmVzc2lvbi4KKyAqIEVsZW1lbnRzIHdpdGhpbiBgbmdTd2l0Y2hgIGJ1dCB3aXRob3V0IGBuZ1N3aXRjaFdoZW5gIG9yIGBuZ1N3aXRjaERlZmF1bHRgIGRpcmVjdGl2ZXMgd2lsbCBiZSBwcmVzZXJ2ZWQgYXQgdGhlIGxvY2F0aW9uCisgKiBhcyBzcGVjaWZpZWQgaW4gdGhlIHRlbXBsYXRlLgorICoKKyAqIFRoZSBkaXJlY3RpdmUgaXRzZWxmIHdvcmtzIHNpbWlsYXIgdG8gbmdJbmNsdWRlLCBob3dldmVyLCBpbnN0ZWFkIG9mIGRvd25sb2FkaW5nIHRlbXBsYXRlIGNvZGUgKG9yIGxvYWRpbmcgaXQKKyAqIGZyb20gdGhlIHRlbXBsYXRlIGNhY2hlKSwgYG5nU3dpdGNoYCBzaW1wbHkgY2hvb3NlcyBvbmUgb2YgdGhlIG5lc3RlZCBlbGVtZW50cyBhbmQgbWFrZXMgaXQgdmlzaWJsZSBiYXNlZCBvbiB3aGljaCBlbGVtZW50CisgKiBtYXRjaGVzIHRoZSB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBldmFsdWF0ZWQgZXhwcmVzc2lvbi4gSW4gb3RoZXIgd29yZHMsIHlvdSBkZWZpbmUgYSBjb250YWluZXIgZWxlbWVudAorICogKHdoZXJlIHlvdSBwbGFjZSB0aGUgZGlyZWN0aXZlKSwgcGxhY2UgYW4gZXhwcmVzc2lvbiBvbiB0aGUgKipgb249Ii4uLiJgIGF0dHJpYnV0ZSoqCisgKiAob3IgdGhlICoqYG5nLXN3aXRjaD0iLi4uImAgYXR0cmlidXRlKiopLCBkZWZpbmUgYW55IGlubmVyIGVsZW1lbnRzIGluc2lkZSBvZiB0aGUgZGlyZWN0aXZlIGFuZCBwbGFjZQorICogYSB3aGVuIGF0dHJpYnV0ZSBwZXIgZWxlbWVudC4gVGhlIHdoZW4gYXR0cmlidXRlIGlzIHVzZWQgdG8gaW5mb3JtIG5nU3dpdGNoIHdoaWNoIGVsZW1lbnQgdG8gZGlzcGxheSB3aGVuIHRoZSBvbgorICogZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuIElmIGEgbWF0Y2hpbmcgZXhwcmVzc2lvbiBpcyBub3QgZm91bmQgdmlhIGEgd2hlbiBhdHRyaWJ1dGUgdGhlbiBhbiBlbGVtZW50IHdpdGggdGhlIGRlZmF1bHQKKyAqIGF0dHJpYnV0ZSBpcyBkaXNwbGF5ZWQuCisgKgorICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyI+CisgKiBCZSBhd2FyZSB0aGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1hdGNoIGFnYWluc3QgY2Fubm90IGJlIGV4cHJlc3Npb25zLiBUaGV5IGFyZSBpbnRlcnByZXRlZAorICogYXMgbGl0ZXJhbCBzdHJpbmcgdmFsdWVzIHRvIG1hdGNoIGFnYWluc3QuCisgKiBGb3IgZXhhbXBsZSwgKipgbmctc3dpdGNoLXdoZW49InNvbWVWYWwiYCoqIHdpbGwgbWF0Y2ggYWdhaW5zdCB0aGUgc3RyaW5nIGAic29tZVZhbCJgIG5vdCBhZ2FpbnN0IHRoZQorICogdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gYCRzY29wZS5zb21lVmFsYC4KKyAqIDwvZGl2PgorCisgKiBAYW5pbWF0aW9ucworICogZW50ZXIgLSBoYXBwZW5zIGFmdGVyIHRoZSBuZ1N3aXRjaCBjb250ZW50cyBjaGFuZ2UgYW5kIHRoZSBtYXRjaGVkIGNoaWxkIGVsZW1lbnQgaXMgcGxhY2VkIGluc2lkZSB0aGUgY29udGFpbmVyCisgKiBsZWF2ZSAtIGhhcHBlbnMganVzdCBhZnRlciB0aGUgbmdTd2l0Y2ggY29udGVudHMgY2hhbmdlIGFuZCBqdXN0IGJlZm9yZSB0aGUgZm9ybWVyIGNvbnRlbnRzIGFyZSByZW1vdmVkIGZyb20gdGhlIERPTQorICoKKyAqIEB1c2FnZQorICoKKyAqIGBgYAorICogPEFOWSBuZy1zd2l0Y2g9ImV4cHJlc3Npb24iPgorICogICA8QU5ZIG5nLXN3aXRjaC13aGVuPSJtYXRjaFZhbHVlMSI+Li4uPC9BTlk+CisgKiAgIDxBTlkgbmctc3dpdGNoLXdoZW49Im1hdGNoVmFsdWUyIj4uLi48L0FOWT4KKyAqICAgPEFOWSBuZy1zd2l0Y2gtZGVmYXVsdD4uLi48L0FOWT4KKyAqIDwvQU5ZPgorICogYGBgCisgKgorICoKKyAqIEBzY29wZQorICogQHByaW9yaXR5IDEyMDAKKyAqIEBwYXJhbSB7Kn0gbmdTd2l0Y2h8b24gZXhwcmVzc2lvbiB0byBtYXRjaCBhZ2FpbnN0IDx0dD5uZy1zd2l0Y2gtd2hlbjwvdHQ+LgorICogT24gY2hpbGQgZWxlbWVudHMgYWRkOgorICoKKyAqICogYG5nU3dpdGNoV2hlbmA6IHRoZSBjYXNlIHN0YXRlbWVudCB0byBtYXRjaCBhZ2FpbnN0LiBJZiBtYXRjaCB0aGVuIHRoaXMKKyAqICAgY2FzZSB3aWxsIGJlIGRpc3BsYXllZC4gSWYgdGhlIHNhbWUgbWF0Y2ggYXBwZWFycyBtdWx0aXBsZSB0aW1lcywgYWxsIHRoZQorICogICBlbGVtZW50cyB3aWxsIGJlIGRpc3BsYXllZC4KKyAqICogYG5nU3dpdGNoRGVmYXVsdGA6IHRoZSBkZWZhdWx0IGNhc2Ugd2hlbiBubyBvdGhlciBjYXNlIG1hdGNoLiBJZiB0aGVyZQorICogICBhcmUgbXVsdGlwbGUgZGVmYXVsdCBjYXNlcywgYWxsIG9mIHRoZW0gd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiBubyBvdGhlcgorICogICBjYXNlIG1hdGNoLgorICoKKyAqCisgKiBAZXhhbXBsZQorICA8ZXhhbXBsZSBtb2R1bGU9InN3aXRjaEV4YW1wbGUiIGRlcHM9ImFuZ3VsYXItYW5pbWF0ZS5qcyIgYW5pbWF0aW9ucz0idHJ1ZSI+CisgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9IkV4YW1wbGVDb250cm9sbGVyIj4KKyAgICAgICAgPHNlbGVjdCBuZy1tb2RlbD0ic2VsZWN0aW9uIiBuZy1vcHRpb25zPSJpdGVtIGZvciBpdGVtIGluIGl0ZW1zIj4KKyAgICAgICAgPC9zZWxlY3Q+CisgICAgICAgIDx0dD5zZWxlY3Rpb249e3tzZWxlY3Rpb259fTwvdHQ+CisgICAgICAgIDxoci8+CisgICAgICAgIDxkaXYgY2xhc3M9ImFuaW1hdGUtc3dpdGNoLWNvbnRhaW5lciIKKyAgICAgICAgICBuZy1zd2l0Y2ggb249InNlbGVjdGlvbiI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhbmltYXRlLXN3aXRjaCIgbmctc3dpdGNoLXdoZW49InNldHRpbmdzIj5TZXR0aW5ncyBEaXY8L2Rpdj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFuaW1hdGUtc3dpdGNoIiBuZy1zd2l0Y2gtd2hlbj0iaG9tZSI+SG9tZSBTcGFuPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhbmltYXRlLXN3aXRjaCIgbmctc3dpdGNoLWRlZmF1bHQ+ZGVmYXVsdDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgIDwvZmlsZT4KKyAgICA8ZmlsZSBuYW1lPSJzY3JpcHQuanMiPgorICAgICAgYW5ndWxhci5tb2R1bGUoJ3N3aXRjaEV4YW1wbGUnLCBbJ25nQW5pbWF0ZSddKQorICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgICAgICRzY29wZS5pdGVtcyA9IFsnc2V0dGluZ3MnLCAnaG9tZScsICdvdGhlciddOworICAgICAgICAgICRzY29wZS5zZWxlY3Rpb24gPSAkc2NvcGUuaXRlbXNbMF07CisgICAgICAgIH1dKTsKKyAgICA8L2ZpbGU+CisgICAgPGZpbGUgbmFtZT0iYW5pbWF0aW9ucy5jc3MiPgorICAgICAgLmFuaW1hdGUtc3dpdGNoLWNvbnRhaW5lciB7CisgICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlOworICAgICAgICBiYWNrZ3JvdW5kOndoaXRlOworICAgICAgICBib3JkZXI6MXB4IHNvbGlkIGJsYWNrOworICAgICAgICBoZWlnaHQ6NDBweDsKKyAgICAgICAgb3ZlcmZsb3c6aGlkZGVuOworICAgICAgfQorCisgICAgICAuYW5pbWF0ZS1zd2l0Y2ggeworICAgICAgICBwYWRkaW5nOjEwcHg7CisgICAgICB9CisKKyAgICAgIC5hbmltYXRlLXN3aXRjaC5uZy1hbmltYXRlIHsKKyAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDAuNXM7CisgICAgICAgIHRyYW5zaXRpb246YWxsIGN1YmljLWJlemllcigwLjI1MCwgMC40NjAsIDAuNDUwLCAwLjk0MCkgMC41czsKKworICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTsKKyAgICAgICAgdG9wOjA7CisgICAgICAgIGxlZnQ6MDsKKyAgICAgICAgcmlnaHQ6MDsKKyAgICAgICAgYm90dG9tOjA7CisgICAgICB9CisKKyAgICAgIC5hbmltYXRlLXN3aXRjaC5uZy1sZWF2ZS5uZy1sZWF2ZS1hY3RpdmUsCisgICAgICAuYW5pbWF0ZS1zd2l0Y2gubmctZW50ZXIgeworICAgICAgICB0b3A6LTUwcHg7CisgICAgICB9CisgICAgICAuYW5pbWF0ZS1zd2l0Y2gubmctbGVhdmUsCisgICAgICAuYW5pbWF0ZS1zd2l0Y2gubmctZW50ZXIubmctZW50ZXItYWN0aXZlIHsKKyAgICAgICAgdG9wOjA7CisgICAgICB9CisgICAgPC9maWxlPgorICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgdmFyIHN3aXRjaEVsZW0gPSBlbGVtZW50KGJ5LmNzcygnW25nLXN3aXRjaF0nKSk7CisgICAgICB2YXIgc2VsZWN0ID0gZWxlbWVudChieS5tb2RlbCgnc2VsZWN0aW9uJykpOworCisgICAgICBpdCgnc2hvdWxkIHN0YXJ0IGluIHNldHRpbmdzJywgZnVuY3Rpb24oKSB7CisgICAgICAgIGV4cGVjdChzd2l0Y2hFbGVtLmdldFRleHQoKSkudG9NYXRjaCgvU2V0dGluZ3MgRGl2Lyk7CisgICAgICB9KTsKKyAgICAgIGl0KCdzaG91bGQgY2hhbmdlIHRvIGhvbWUnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgc2VsZWN0LmFsbChieS5jc3MoJ29wdGlvbicpKS5nZXQoMSkuY2xpY2soKTsKKyAgICAgICAgZXhwZWN0KHN3aXRjaEVsZW0uZ2V0VGV4dCgpKS50b01hdGNoKC9Ib21lIFNwYW4vKTsKKyAgICAgIH0pOworICAgICAgaXQoJ3Nob3VsZCBzZWxlY3QgZGVmYXVsdCcsIGZ1bmN0aW9uKCkgeworICAgICAgICBzZWxlY3QuYWxsKGJ5LmNzcygnb3B0aW9uJykpLmdldCgyKS5jbGljaygpOworICAgICAgICBleHBlY3Qoc3dpdGNoRWxlbS5nZXRUZXh0KCkpLnRvTWF0Y2goL2RlZmF1bHQvKTsKKyAgICAgIH0pOworICAgIDwvZmlsZT4KKyAgPC9leGFtcGxlPgorICovCit2YXIgbmdTd2l0Y2hEaXJlY3RpdmUgPSBbJyRhbmltYXRlJywgZnVuY3Rpb24oJGFuaW1hdGUpIHsKKyAgcmV0dXJuIHsKKyAgICByZXN0cmljdDogJ0VBJywKKyAgICByZXF1aXJlOiAnbmdTd2l0Y2gnLAorCisgICAgLy8gYXNrcyBmb3IgJHNjb3BlIHRvIGZvb2wgdGhlIEJDIGNvbnRyb2xsZXIgbW9kdWxlCisgICAgY29udHJvbGxlcjogWyckc2NvcGUnLCBmdW5jdGlvbiBuZ1N3aXRjaENvbnRyb2xsZXIoKSB7CisgICAgIHRoaXMuY2FzZXMgPSB7fTsKKyAgICB9XSwKKyAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0ciwgbmdTd2l0Y2hDb250cm9sbGVyKSB7CisgICAgICB2YXIgd2F0Y2hFeHByID0gYXR0ci5uZ1N3aXRjaCB8fCBhdHRyLm9uLAorICAgICAgICAgIHNlbGVjdGVkVHJhbnNjbHVkZXMgPSBbXSwKKyAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzID0gW10sCisgICAgICAgICAgcHJldmlvdXNMZWF2ZUFuaW1hdGlvbnMgPSBbXSwKKyAgICAgICAgICBzZWxlY3RlZFNjb3BlcyA9IFtdOworCisgICAgICB2YXIgc3BsaWNlRmFjdG9yeSA9IGZ1bmN0aW9uKGFycmF5LCBpbmRleCkgeworICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTsgfTsKKyAgICAgIH07CisKKyAgICAgIHNjb3BlLiR3YXRjaCh3YXRjaEV4cHIsIGZ1bmN0aW9uIG5nU3dpdGNoV2F0Y2hBY3Rpb24odmFsdWUpIHsKKyAgICAgICAgdmFyIGksIGlpOworICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHByZXZpb3VzTGVhdmVBbmltYXRpb25zLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKKyAgICAgICAgICAkYW5pbWF0ZS5jYW5jZWwocHJldmlvdXNMZWF2ZUFuaW1hdGlvbnNbaV0pOworICAgICAgICB9CisgICAgICAgIHByZXZpb3VzTGVhdmVBbmltYXRpb25zLmxlbmd0aCA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMCwgaWkgPSBzZWxlY3RlZFNjb3Blcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CisgICAgICAgICAgdmFyIHNlbGVjdGVkID0gZ2V0QmxvY2tOb2RlcyhzZWxlY3RlZEVsZW1lbnRzW2ldLmNsb25lKTsKKyAgICAgICAgICBzZWxlY3RlZFNjb3Blc1tpXS4kZGVzdHJveSgpOworICAgICAgICAgIHZhciBwcm9taXNlID0gcHJldmlvdXNMZWF2ZUFuaW1hdGlvbnNbaV0gPSAkYW5pbWF0ZS5sZWF2ZShzZWxlY3RlZCk7CisgICAgICAgICAgcHJvbWlzZS50aGVuKHNwbGljZUZhY3RvcnkocHJldmlvdXNMZWF2ZUFuaW1hdGlvbnMsIGkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID0gMDsKKyAgICAgICAgc2VsZWN0ZWRTY29wZXMubGVuZ3RoID0gMDsKKworICAgICAgICBpZiAoKHNlbGVjdGVkVHJhbnNjbHVkZXMgPSBuZ1N3aXRjaENvbnRyb2xsZXIuY2FzZXNbJyEnICsgdmFsdWVdIHx8IG5nU3dpdGNoQ29udHJvbGxlci5jYXNlc1snPyddKSkgeworICAgICAgICAgIGZvckVhY2goc2VsZWN0ZWRUcmFuc2NsdWRlcywgZnVuY3Rpb24oc2VsZWN0ZWRUcmFuc2NsdWRlKSB7CisgICAgICAgICAgICBzZWxlY3RlZFRyYW5zY2x1ZGUudHJhbnNjbHVkZShmdW5jdGlvbihjYXNlRWxlbWVudCwgc2VsZWN0ZWRTY29wZSkgeworICAgICAgICAgICAgICBzZWxlY3RlZFNjb3Blcy5wdXNoKHNlbGVjdGVkU2NvcGUpOworICAgICAgICAgICAgICB2YXIgYW5jaG9yID0gc2VsZWN0ZWRUcmFuc2NsdWRlLmVsZW1lbnQ7CisgICAgICAgICAgICAgIGNhc2VFbGVtZW50W2Nhc2VFbGVtZW50Lmxlbmd0aCsrXSA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJyBlbmQgbmdTd2l0Y2hXaGVuOiAnKTsKKyAgICAgICAgICAgICAgdmFyIGJsb2NrID0geyBjbG9uZTogY2FzZUVsZW1lbnQgfTsKKworICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLnB1c2goYmxvY2spOworICAgICAgICAgICAgICAkYW5pbWF0ZS5lbnRlcihjYXNlRWxlbWVudCwgYW5jaG9yLnBhcmVudCgpLCBhbmNob3IpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgfTsKK31dOworCit2YXIgbmdTd2l0Y2hXaGVuRGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoeworICB0cmFuc2NsdWRlOiAnZWxlbWVudCcsCisgIHByaW9yaXR5OiAxMjAwLAorICByZXF1aXJlOiAnXm5nU3dpdGNoJywKKyAgbXVsdGlFbGVtZW50OiB0cnVlLAorICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMsIGN0cmwsICR0cmFuc2NsdWRlKSB7CisgICAgY3RybC5jYXNlc1snIScgKyBhdHRycy5uZ1N3aXRjaFdoZW5dID0gKGN0cmwuY2FzZXNbJyEnICsgYXR0cnMubmdTd2l0Y2hXaGVuXSB8fCBbXSk7CisgICAgY3RybC5jYXNlc1snIScgKyBhdHRycy5uZ1N3aXRjaFdoZW5dLnB1c2goeyB0cmFuc2NsdWRlOiAkdHJhbnNjbHVkZSwgZWxlbWVudDogZWxlbWVudCB9KTsKKyAgfQorfSk7CisKK3ZhciBuZ1N3aXRjaERlZmF1bHREaXJlY3RpdmUgPSBuZ0RpcmVjdGl2ZSh7CisgIHRyYW5zY2x1ZGU6ICdlbGVtZW50JywKKyAgcHJpb3JpdHk6IDEyMDAsCisgIHJlcXVpcmU6ICdebmdTd2l0Y2gnLAorICBtdWx0aUVsZW1lbnQ6IHRydWUsCisgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkdHJhbnNjbHVkZSkgeworICAgIGN0cmwuY2FzZXNbJz8nXSA9IChjdHJsLmNhc2VzWyc/J10gfHwgW10pOworICAgIGN0cmwuY2FzZXNbJz8nXS5wdXNoKHsgdHJhbnNjbHVkZTogJHRyYW5zY2x1ZGUsIGVsZW1lbnQ6IGVsZW1lbnQgfSk7CisgICB9Cit9KTsKKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBuZ1RyYW5zY2x1ZGUKKyAqIEByZXN0cmljdCBFQUMKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIERpcmVjdGl2ZSB0aGF0IG1hcmtzIHRoZSBpbnNlcnRpb24gcG9pbnQgZm9yIHRoZSB0cmFuc2NsdWRlZCBET00gb2YgdGhlIG5lYXJlc3QgcGFyZW50IGRpcmVjdGl2ZSB0aGF0IHVzZXMgdHJhbnNjbHVzaW9uLgorICoKKyAqIEFueSBleGlzdGluZyBjb250ZW50IG9mIHRoZSBlbGVtZW50IHRoYXQgdGhpcyBkaXJlY3RpdmUgaXMgcGxhY2VkIG9uIHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIHRyYW5zY2x1ZGVkIGNvbnRlbnQgaXMgaW5zZXJ0ZWQuCisgKgorICogQGVsZW1lbnQgQU5ZCisgKgorICogQGV4YW1wbGUKKyAgIDxleGFtcGxlIG1vZHVsZT0idHJhbnNjbHVkZUV4YW1wbGUiPgorICAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICA8c2NyaXB0PgorICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3RyYW5zY2x1ZGVFeGFtcGxlJywgW10pCisgICAgICAgICAgLmRpcmVjdGl2ZSgncGFuZScsIGZ1bmN0aW9uKCl7CisgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgIHJlc3RyaWN0OiAnRScsCisgICAgICAgICAgICAgICB0cmFuc2NsdWRlOiB0cnVlLAorICAgICAgICAgICAgICAgc2NvcGU6IHsgdGl0bGU6J0AnIH0sCisgICAgICAgICAgICAgICB0ZW1wbGF0ZTogJzxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogZ3JheSI+e3t0aXRsZX19PC9kaXY+JyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnPG5nLXRyYW5zY2x1ZGU+PC9uZy10cmFuc2NsdWRlPicgKworICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nCisgICAgICAgICAgICAgfTsKKyAgICAgICAgIH0pCisgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkgeworICAgICAgICAgICAkc2NvcGUudGl0bGUgPSAnTG9yZW0gSXBzdW0nOworICAgICAgICAgICAkc2NvcGUudGV4dCA9ICdOZXF1ZSBwb3JybyBxdWlzcXVhbSBlc3QgcXVpIGRvbG9yZW0gaXBzdW0gcXVpYSBkb2xvci4uLic7CisgICAgICAgICB9XSk7CisgICAgICAgPC9zY3JpcHQ+CisgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPSJFeGFtcGxlQ29udHJvbGxlciI+CisgICAgICAgICA8aW5wdXQgbmctbW9kZWw9InRpdGxlIj4gPGJyLz4KKyAgICAgICAgIDx0ZXh0YXJlYSBuZy1tb2RlbD0idGV4dCI+PC90ZXh0YXJlYT4gPGJyLz4KKyAgICAgICAgIDxwYW5lIHRpdGxlPSJ7e3RpdGxlfX0iPnt7dGV4dH19PC9wYW5lPgorICAgICAgIDwvZGl2PgorICAgICA8L2ZpbGU+CisgICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgICBpdCgnc2hvdWxkIGhhdmUgdHJhbnNjbHVkZWQnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZWxlbWVudChieS5tb2RlbCgndGl0bGUnKSk7CisgICAgICAgICAgdGl0bGVFbGVtZW50LmNsZWFyKCk7CisgICAgICAgICAgdGl0bGVFbGVtZW50LnNlbmRLZXlzKCdUSVRMRScpOworICAgICAgICAgIHZhciB0ZXh0RWxlbWVudCA9IGVsZW1lbnQoYnkubW9kZWwoJ3RleHQnKSk7CisgICAgICAgICAgdGV4dEVsZW1lbnQuY2xlYXIoKTsKKyAgICAgICAgICB0ZXh0RWxlbWVudC5zZW5kS2V5cygnVEVYVCcpOworICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3RpdGxlJykpLmdldFRleHQoKSkudG9FcXVhbCgnVElUTEUnKTsKKyAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCd0ZXh0JykpLmdldFRleHQoKSkudG9FcXVhbCgnVEVYVCcpOworICAgICAgICB9KTsKKyAgICAgPC9maWxlPgorICAgPC9leGFtcGxlPgorICoKKyAqLwordmFyIG5nVHJhbnNjbHVkZURpcmVjdGl2ZSA9IG5nRGlyZWN0aXZlKHsKKyAgcmVzdHJpY3Q6ICdFQUMnLAorICBsaW5rOiBmdW5jdGlvbigkc2NvcGUsICRlbGVtZW50LCAkYXR0cnMsIGNvbnRyb2xsZXIsICR0cmFuc2NsdWRlKSB7CisgICAgaWYgKCEkdHJhbnNjbHVkZSkgeworICAgICAgdGhyb3cgbWluRXJyKCduZ1RyYW5zY2x1ZGUnKSgnb3JwaGFuJywKKyAgICAgICAnSWxsZWdhbCB1c2Ugb2YgbmdUcmFuc2NsdWRlIGRpcmVjdGl2ZSBpbiB0aGUgdGVtcGxhdGUhICcgKworICAgICAgICdObyBwYXJlbnQgZGlyZWN0aXZlIHRoYXQgcmVxdWlyZXMgYSB0cmFuc2NsdXNpb24gZm91bmQuICcgKworICAgICAgICdFbGVtZW50OiB7MH0nLAorICAgICAgIHN0YXJ0aW5nVGFnKCRlbGVtZW50KSk7CisgICAgfQorCisgICAgJHRyYW5zY2x1ZGUoZnVuY3Rpb24oY2xvbmUpIHsKKyAgICAgICRlbGVtZW50LmVtcHR5KCk7CisgICAgICAkZWxlbWVudC5hcHBlbmQoY2xvbmUpOworICAgIH0pOworICB9Cit9KTsKKworLyoqCisgKiBAbmdkb2MgZGlyZWN0aXZlCisgKiBAbmFtZSBzY3JpcHQKKyAqIEByZXN0cmljdCBFCisgKgorICogQGRlc2NyaXB0aW9uCisgKiBMb2FkIHRoZSBjb250ZW50IG9mIGEgYDxzY3JpcHQ+YCBlbGVtZW50IGludG8ge0BsaW5rIG5nLiR0ZW1wbGF0ZUNhY2hlIGAkdGVtcGxhdGVDYWNoZWB9LCBzbyB0aGF0IHRoZQorICogdGVtcGxhdGUgY2FuIGJlIHVzZWQgYnkge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0luY2x1ZGUgYG5nSW5jbHVkZWB9LAorICoge0BsaW5rIG5nUm91dGUuZGlyZWN0aXZlOm5nVmlldyBgbmdWaWV3YH0sIG9yIHtAbGluayBndWlkZS9kaXJlY3RpdmUgZGlyZWN0aXZlc30uIFRoZSB0eXBlIG9mIHRoZQorICogYDxzY3JpcHQ+YCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGFzIGB0ZXh0L25nLXRlbXBsYXRlYCwgYW5kIGEgY2FjaGUgbmFtZSBmb3IgdGhlIHRlbXBsYXRlIG11c3QgYmUKKyAqIGFzc2lnbmVkIHRocm91Z2ggdGhlIGVsZW1lbnQncyBgaWRgLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGFzIGEgZGlyZWN0aXZlJ3MgYHRlbXBsYXRlVXJsYC4KKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBNdXN0IGJlIHNldCB0byBgJ3RleHQvbmctdGVtcGxhdGUnYC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBpZCBDYWNoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZS4KKyAqCisgKiBAZXhhbXBsZQorICA8ZXhhbXBsZT4KKyAgICA8ZmlsZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgaWQ9Ii90cGwuaHRtbCI+CisgICAgICAgIENvbnRlbnQgb2YgdGhlIHRlbXBsYXRlLgorICAgICAgPC9zY3JpcHQ+CisKKyAgICAgIDxhIG5nLWNsaWNrPSJjdXJyZW50VHBsPScvdHBsLmh0bWwnIiBpZD0idHBsLWxpbmsiPkxvYWQgaW5saW5lZCB0ZW1wbGF0ZTwvYT4KKyAgICAgIDxkaXYgaWQ9InRwbC1jb250ZW50IiBuZy1pbmNsdWRlIHNyYz0iY3VycmVudFRwbCI+PC9kaXY+CisgICAgPC9maWxlPgorICAgIDxmaWxlIG5hbWU9InByb3RyYWN0b3IuanMiIHR5cGU9InByb3RyYWN0b3IiPgorICAgICAgaXQoJ3Nob3VsZCBsb2FkIHRlbXBsYXRlIGRlZmluZWQgaW5zaWRlIHNjcmlwdCB0YWcnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgZWxlbWVudChieS5jc3MoJyN0cGwtbGluaycpKS5jbGljaygpOworICAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJyN0cGwtY29udGVudCcpKS5nZXRUZXh0KCkpLnRvTWF0Y2goL0NvbnRlbnQgb2YgdGhlIHRlbXBsYXRlLyk7CisgICAgICB9KTsKKyAgICA8L2ZpbGU+CisgIDwvZXhhbXBsZT4KKyAqLwordmFyIHNjcmlwdERpcmVjdGl2ZSA9IFsnJHRlbXBsYXRlQ2FjaGUnLCBmdW5jdGlvbigkdGVtcGxhdGVDYWNoZSkgeworICByZXR1cm4geworICAgIHJlc3RyaWN0OiAnRScsCisgICAgdGVybWluYWw6IHRydWUsCisgICAgY29tcGlsZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cikgeworICAgICAgaWYgKGF0dHIudHlwZSA9PSAndGV4dC9uZy10ZW1wbGF0ZScpIHsKKyAgICAgICAgdmFyIHRlbXBsYXRlVXJsID0gYXR0ci5pZCwKKyAgICAgICAgICAgIHRleHQgPSBlbGVtZW50WzBdLnRleHQ7CisKKyAgICAgICAgJHRlbXBsYXRlQ2FjaGUucHV0KHRlbXBsYXRlVXJsLCB0ZXh0KTsKKyAgICAgIH0KKyAgICB9CisgIH07Cit9XTsKKwordmFyIG5nT3B0aW9uc01pbkVyciA9IG1pbkVycignbmdPcHRpb25zJyk7CisvKioKKyAqIEBuZ2RvYyBkaXJlY3RpdmUKKyAqIEBuYW1lIHNlbGVjdAorICogQHJlc3RyaWN0IEUKKyAqCisgKiBAZGVzY3JpcHRpb24KKyAqIEhUTUwgYFNFTEVDVGAgZWxlbWVudCB3aXRoIGFuZ3VsYXIgZGF0YS1iaW5kaW5nLgorICoKKyAqICMgYG5nT3B0aW9uc2AKKyAqCisgKiBUaGUgYG5nT3B0aW9uc2AgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIGR5bmFtaWNhbGx5IGdlbmVyYXRlIGEgbGlzdCBvZiBgPG9wdGlvbj5gCisgKiBlbGVtZW50cyBmb3IgdGhlIGA8c2VsZWN0PmAgZWxlbWVudCB1c2luZyB0aGUgYXJyYXkgb3Igb2JqZWN0IG9idGFpbmVkIGJ5IGV2YWx1YXRpbmcgdGhlCisgKiBgbmdPcHRpb25zYCBjb21wcmVoZW5zaW9uIGV4cHJlc3Npb24uCisgKgorICogSW4gbWFueSBjYXNlcywgYG5nUmVwZWF0YCBjYW4gYmUgdXNlZCBvbiBgPG9wdGlvbj5gIGVsZW1lbnRzIGluc3RlYWQgb2YgYG5nT3B0aW9uc2AgdG8gYWNoaWV2ZSBhCisgKiBzaW1pbGFyIHJlc3VsdC4gSG93ZXZlciwgYG5nT3B0aW9uc2AgcHJvdmlkZXMgc29tZSBiZW5lZml0cyBzdWNoIGFzIHJlZHVjaW5nIG1lbW9yeSBhbmQKKyAqIGluY3JlYXNpbmcgc3BlZWQgYnkgbm90IGNyZWF0aW5nIGEgbmV3IHNjb3BlIGZvciBlYWNoIHJlcGVhdGVkIGluc3RhbmNlLCBhcyB3ZWxsIGFzIHByb3ZpZGluZworICogbW9yZSBmbGV4aWJpbGl0eSBpbiBob3cgdGhlIGA8c2VsZWN0PmAncyBtb2RlbCBpcyBhc3NpZ25lZCB2aWEgdGhlIGBzZWxlY3RgICoqYGFzYCoqIHBhcnQgb2YgdGhlCisgKiBjb21wcmVoZW5zaW9uIGV4cHJlc3Npb24uIGBuZ09wdGlvbnNgIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGA8c2VsZWN0PmAgbW9kZWwgbmVlZHMgdG8gYmUgYm91bmQKKyAqICB0byBhIG5vbi1zdHJpbmcgdmFsdWUuIFRoaXMgaXMgYmVjYXVzZSBhbiBvcHRpb24gZWxlbWVudCBjYW4gb25seSBiZSBib3VuZCB0byBzdHJpbmcgdmFsdWVzIGF0CisgKiBwcmVzZW50LgorICoKKyAqIFdoZW4gYW4gaXRlbSBpbiB0aGUgYDxzZWxlY3Q+YCBtZW51IGlzIHNlbGVjdGVkLCB0aGUgYXJyYXkgZWxlbWVudCBvciBvYmplY3QgcHJvcGVydHkKKyAqIHJlcHJlc2VudGVkIGJ5IHRoZSBzZWxlY3RlZCBvcHRpb24gd2lsbCBiZSBib3VuZCB0byB0aGUgbW9kZWwgaWRlbnRpZmllZCBieSB0aGUgYG5nTW9kZWxgCisgKiBkaXJlY3RpdmUuCisgKgorICogT3B0aW9uYWxseSwgYSBzaW5nbGUgaGFyZC1jb2RlZCBgPG9wdGlvbj5gIGVsZW1lbnQsIHdpdGggdGhlIHZhbHVlIHNldCB0byBhbiBlbXB0eSBzdHJpbmcsIGNhbgorICogYmUgbmVzdGVkIGludG8gdGhlIGA8c2VsZWN0PmAgZWxlbWVudC4gVGhpcyBlbGVtZW50IHdpbGwgdGhlbiByZXByZXNlbnQgdGhlIGBudWxsYCBvciAibm90IHNlbGVjdGVkIgorICogb3B0aW9uLiBTZWUgZXhhbXBsZSBiZWxvdyBmb3IgZGVtb25zdHJhdGlvbi4KKyAqCisgKiA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC13YXJuaW5nIj4KKyAqICoqTm90ZToqKiBgbmdNb2RlbGAgY29tcGFyZXMgYnkgcmVmZXJlbmNlLCBub3QgdmFsdWUuIFRoaXMgaXMgaW1wb3J0YW50IHdoZW4gYmluZGluZyB0byBhbgorICogYXJyYXkgb2Ygb2JqZWN0cy4gU2VlIGFuIGV4YW1wbGUgW2luIHRoaXMganNmaWRkbGVdKGh0dHA6Ly9qc2ZpZGRsZS5uZXQvcVd6VGIvKS4KKyAqIDwvZGl2PgorICoKKyAqICMjIGBzZWxlY3RgICoqYGFzYCoqCisgKgorICogVXNpbmcgYHNlbGVjdGAgKipgYXNgKiogd2lsbCBiaW5kIHRoZSByZXN1bHQgb2YgdGhlIGBzZWxlY3RgIGV4cHJlc3Npb24gdG8gdGhlIG1vZGVsLCBidXQKKyAqIHRoZSB2YWx1ZSBvZiB0aGUgYDxzZWxlY3Q+YCBhbmQgYDxvcHRpb24+YCBodG1sIGVsZW1lbnRzIHdpbGwgYmUgZWl0aGVyIHRoZSBpbmRleCAoZm9yIGFycmF5IGRhdGEgc291cmNlcykKKyAqIG9yIHByb3BlcnR5IG5hbWUgKGZvciBvYmplY3QgZGF0YSBzb3VyY2VzKSBvZiB0aGUgdmFsdWUgd2l0aGluIHRoZSBjb2xsZWN0aW9uLiBJZiBhICoqYHRyYWNrIGJ5YCoqIGV4cHJlc3Npb24KKyAqIGlzIHVzZWQsIHRoZSByZXN1bHQgb2YgdGhhdCBleHByZXNzaW9uIHdpbGwgYmUgc2V0IGFzIHRoZSB2YWx1ZSBvZiB0aGUgYG9wdGlvbmAgYW5kIGBzZWxlY3RgIGVsZW1lbnRzLgorICoKKyAqCisgKiAjIyMgYHNlbGVjdGAgKipgYXNgKiogYW5kICoqYHRyYWNrIGJ5YCoqCisgKgorICogPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtd2FybmluZyI+CisgKiBEbyBub3QgdXNlIGBzZWxlY3RgICoqYGFzYCoqIGFuZCAqKmB0cmFjayBieWAqKiBpbiB0aGUgc2FtZSBleHByZXNzaW9uLiBUaGV5IGFyZSBub3QgZGVzaWduZWQgdG8gd29yayB0b2dldGhlci4KKyAqIDwvZGl2PgorICoKKyAqIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAqCisgKiBgYGBodG1sCisgKiA8c2VsZWN0IG5nLW9wdGlvbnM9Iml0ZW0uc3ViSXRlbSBhcyBpdGVtLmxhYmVsIGZvciBpdGVtIGluIHZhbHVlcyB0cmFjayBieSBpdGVtLmlkIiBuZy1tb2RlbD0ic2VsZWN0ZWQiPgorICogYGBgCisgKgorICogYGBganMKKyAqICRzY29wZS52YWx1ZXMgPSBbeworICogICBpZDogMSwKKyAqICAgbGFiZWw6ICdhTGFiZWwnLAorICogICBzdWJJdGVtOiB7IG5hbWU6ICdhU3ViSXRlbScgfQorICogfSwgeworICogICBpZDogMiwKKyAqICAgbGFiZWw6ICdiTGFiZWwnLAorICogICBzdWJJdGVtOiB7IG5hbWU6ICdiU3ViSXRlbScgfQorICogfV07CisgKgorICogJHNjb3BlLnNlbGVjdGVkID0geyBuYW1lOiAnYVN1Ykl0ZW0nIH07CisgKiBgYGAKKyAqCisgKiBXaXRoIHRoZSBwdXJwb3NlIG9mIHByZXNlcnZpbmcgdGhlIHNlbGVjdGlvbiwgdGhlICoqYHRyYWNrIGJ5YCoqIGV4cHJlc3Npb24gaXMgYWx3YXlzIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQKKyAqIG9mIHRoZSBkYXRhIHNvdXJjZSAodG8gYGl0ZW1gIGluIHRoaXMgZXhhbXBsZSkuIFRvIGNhbGN1bGF0ZSB3aGV0aGVyIGFuIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHdlIGRvIHRoZQorICogZm9sbG93aW5nOgorICoKKyAqIDEuIEFwcGx5ICoqYHRyYWNrIGJ5YCoqIHRvIHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkuIEluIHRoZSBleGFtcGxlOiBgWzEsIDJdYAorICogMi4gQXBwbHkgKipgdHJhY2sgYnlgKiogdG8gdGhlIGFscmVhZHkgc2VsZWN0ZWQgdmFsdWUgaW4gYG5nTW9kZWxgLgorICogICAgSW4gdGhlIGV4YW1wbGU6IHRoaXMgaXMgbm90IHBvc3NpYmxlIGFzICoqYHRyYWNrIGJ5YCoqIHJlZmVycyB0byBgaXRlbS5pZGAsIGJ1dCB0aGUgc2VsZWN0ZWQKKyAqICAgIHZhbHVlIGZyb20gYG5nTW9kZWxgIGlzIGB7bmFtZTogJ2FTdWJJdGVtJ31gLCBzbyB0aGUgKipgdHJhY2sgYnlgKiogZXhwcmVzc2lvbiBpcyBhcHBsaWVkIHRvCisgKiAgICBhIHdyb25nIG9iamVjdCwgdGhlIHNlbGVjdGVkIGVsZW1lbnQgY2FuJ3QgYmUgZm91bmQsIGA8c2VsZWN0PmAgaXMgYWx3YXlzIHJlc2V0IHRvIHRoZSAibm90CisgKiAgICBzZWxlY3RlZCIgb3B0aW9uLgorICoKKyAqCisgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uCisgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuCisgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFRoZSBjb250cm9sIGlzIGNvbnNpZGVyZWQgdmFsaWQgb25seSBpZiB2YWx1ZSBpcyBlbnRlcmVkLgorICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvCisgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZgorICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuCisgKiBAcGFyYW0ge2NvbXByZWhlbnNpb25fZXhwcmVzc2lvbj19IG5nT3B0aW9ucyBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKKyAqCisgKiAgICogZm9yIGFycmF5IGRhdGEgc291cmNlczoKKyAqICAgICAqIGBsYWJlbGAgKipgZm9yYCoqIGB2YWx1ZWAgKipgaW5gKiogYGFycmF5YAorICogICAgICogYHNlbGVjdGAgKipgYXNgKiogYGxhYmVsYCAqKmBmb3JgKiogYHZhbHVlYCAqKmBpbmAqKiBgYXJyYXlgCisgKiAgICAgKiBgbGFiZWxgICoqYGdyb3VwIGJ5YCoqIGBncm91cGAgKipgZm9yYCoqIGB2YWx1ZWAgKipgaW5gKiogYGFycmF5YAorICogICAgICogYGxhYmVsYCAqKmBncm91cCBieWAqKiBgZ3JvdXBgICoqYGZvcmAqKiBgdmFsdWVgICoqYGluYCoqIGBhcnJheWAgKipgdHJhY2sgYnlgKiogYHRyYWNrZXhwcmAKKyAqICAgICAqIGBsYWJlbGAgKipgZm9yYCoqIGB2YWx1ZWAgKipgaW5gKiogYGFycmF5YCB8IG9yZGVyQnk6YG9yZGVyZXhwcmAgKipgdHJhY2sgYnlgKiogYHRyYWNrZXhwcmAKKyAqICAgICAgICAoZm9yIGluY2x1ZGluZyBhIGZpbHRlciB3aXRoIGB0cmFjayBieWApCisgKiAgICogZm9yIG9iamVjdCBkYXRhIHNvdXJjZXM6CisgKiAgICAgKiBgbGFiZWxgICoqYGZvciAoYCoqYGtleWAgKipgLGAqKiBgdmFsdWVgKipgKSBpbmAqKiBgb2JqZWN0YAorICogICAgICogYHNlbGVjdGAgKipgYXNgKiogYGxhYmVsYCAqKmBmb3IgKGAqKmBrZXlgICoqYCxgKiogYHZhbHVlYCoqYCkgaW5gKiogYG9iamVjdGAKKyAqICAgICAqIGBsYWJlbGAgKipgZ3JvdXAgYnlgKiogYGdyb3VwYCAqKmBmb3IgKGAqKmBrZXlgKipgLGAqKiBgdmFsdWVgKipgKSBpbmAqKiBgb2JqZWN0YAorICogICAgICogYHNlbGVjdGAgKipgYXNgKiogYGxhYmVsYCAqKmBncm91cCBieWAqKiBgZ3JvdXBgCisgKiAgICAgICAgICoqYGZvcmAgYChgKipga2V5YCoqYCxgKiogYHZhbHVlYCoqYCkgaW5gKiogYG9iamVjdGAKKyAqCisgKiBXaGVyZToKKyAqCisgKiAgICogYGFycmF5YCAvIGBvYmplY3RgOiBhbiBleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyB0byBhbiBhcnJheSAvIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuCisgKiAgICogYHZhbHVlYDogbG9jYWwgdmFyaWFibGUgd2hpY2ggd2lsbCByZWZlciB0byBlYWNoIGl0ZW0gaW4gdGhlIGBhcnJheWAgb3IgZWFjaCBwcm9wZXJ0eSB2YWx1ZQorICogICAgICBvZiBgb2JqZWN0YCBkdXJpbmcgaXRlcmF0aW9uLgorICogICAqIGBrZXlgOiBsb2NhbCB2YXJpYWJsZSB3aGljaCB3aWxsIHJlZmVyIHRvIGEgcHJvcGVydHkgbmFtZSBpbiBgb2JqZWN0YCBkdXJpbmcgaXRlcmF0aW9uLgorICogICAqIGBsYWJlbGA6IFRoZSByZXN1bHQgb2YgdGhpcyBleHByZXNzaW9uIHdpbGwgYmUgdGhlIGxhYmVsIGZvciBgPG9wdGlvbj5gIGVsZW1lbnQuIFRoZQorICogICAgIGBleHByZXNzaW9uYCB3aWxsIG1vc3QgbGlrZWx5IHJlZmVyIHRvIHRoZSBgdmFsdWVgIHZhcmlhYmxlIChlLmcuIGB2YWx1ZS5wcm9wZXJ0eU5hbWVgKS4KKyAqICAgKiBgc2VsZWN0YDogVGhlIHJlc3VsdCBvZiB0aGlzIGV4cHJlc3Npb24gd2lsbCBiZSBib3VuZCB0byB0aGUgbW9kZWwgb2YgdGhlIHBhcmVudCBgPHNlbGVjdD5gCisgKiAgICAgIGVsZW1lbnQuIElmIG5vdCBzcGVjaWZpZWQsIGBzZWxlY3RgIGV4cHJlc3Npb24gd2lsbCBkZWZhdWx0IHRvIGB2YWx1ZWAuCisgKiAgICogYGdyb3VwYDogVGhlIHJlc3VsdCBvZiB0aGlzIGV4cHJlc3Npb24gd2lsbCBiZSB1c2VkIHRvIGdyb3VwIG9wdGlvbnMgdXNpbmcgdGhlIGA8b3B0Z3JvdXA+YAorICogICAgICBET00gZWxlbWVudC4KKyAqICAgKiBgdHJhY2tleHByYDogVXNlZCB3aGVuIHdvcmtpbmcgd2l0aCBhbiBhcnJheSBvZiBvYmplY3RzLiBUaGUgcmVzdWx0IG9mIHRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlCisgKiAgICAgIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG9iamVjdHMgaW4gdGhlIGFycmF5LiBUaGUgYHRyYWNrZXhwcmAgd2lsbCBtb3N0IGxpa2VseSByZWZlciB0byB0aGUKKyAqICAgICBgdmFsdWVgIHZhcmlhYmxlIChlLmcuIGB2YWx1ZS5wcm9wZXJ0eU5hbWVgKS4gV2l0aCB0aGlzIHRoZSBzZWxlY3Rpb24gaXMgcHJlc2VydmVkCisgKiAgICAgIGV2ZW4gd2hlbiB0aGUgb3B0aW9ucyBhcmUgcmVjcmVhdGVkIChlLmcuIHJlbG9hZGVkIGZyb20gdGhlIHNlcnZlcikuCisgKgorICogQGV4YW1wbGUKKyAgICA8ZXhhbXBsZSBtb2R1bGU9InNlbGVjdEV4YW1wbGUiPgorICAgICAgPGZpbGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICAgIDxzY3JpcHQ+CisgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdzZWxlY3RFeGFtcGxlJywgW10pCisgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHsKKyAgICAgICAgICAgICRzY29wZS5jb2xvcnMgPSBbCisgICAgICAgICAgICAgIHtuYW1lOidibGFjaycsIHNoYWRlOidkYXJrJ30sCisgICAgICAgICAgICAgIHtuYW1lOid3aGl0ZScsIHNoYWRlOidsaWdodCd9LAorICAgICAgICAgICAgICB7bmFtZToncmVkJywgc2hhZGU6J2RhcmsnfSwKKyAgICAgICAgICAgICAge25hbWU6J2JsdWUnLCBzaGFkZTonZGFyayd9LAorICAgICAgICAgICAgICB7bmFtZToneWVsbG93Jywgc2hhZGU6J2xpZ2h0J30KKyAgICAgICAgICAgIF07CisgICAgICAgICAgICAkc2NvcGUubXlDb2xvciA9ICRzY29wZS5jb2xvcnNbMl07IC8vIHJlZAorICAgICAgICAgIH1dKTsKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgIDxkaXYgbmctY29udHJvbGxlcj0iRXhhbXBsZUNvbnRyb2xsZXIiPgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9ImNvbG9yIGluIGNvbG9ycyI+CisgICAgICAgICAgICAgIE5hbWU6IDxpbnB1dCBuZy1tb2RlbD0iY29sb3IubmFtZSI+CisgICAgICAgICAgICAgIFs8YSBocmVmIG5nLWNsaWNrPSJjb2xvcnMuc3BsaWNlKCRpbmRleCwgMSkiPlg8L2E+XQorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgWzxhIGhyZWYgbmctY2xpY2s9ImNvbG9ycy5wdXNoKHt9KSI+YWRkPC9hPl0KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgICA8aHIvPgorICAgICAgICAgIENvbG9yIChudWxsIG5vdCBhbGxvd2VkKToKKyAgICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPSJteUNvbG9yIiBuZy1vcHRpb25zPSJjb2xvci5uYW1lIGZvciBjb2xvciBpbiBjb2xvcnMiPjwvc2VsZWN0Pjxicj4KKworICAgICAgICAgIENvbG9yIChudWxsIGFsbG93ZWQpOgorICAgICAgICAgIDxzcGFuICBjbGFzcz0ibnVsbGFibGUiPgorICAgICAgICAgICAgPHNlbGVjdCBuZy1tb2RlbD0ibXlDb2xvciIgbmctb3B0aW9ucz0iY29sb3IubmFtZSBmb3IgY29sb3IgaW4gY29sb3JzIj4KKyAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj4tLSBjaG9vc2UgY29sb3IgLS08L29wdGlvbj4KKyAgICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgICAgIDwvc3Bhbj48YnIvPgorCisgICAgICAgICAgQ29sb3IgZ3JvdXBlZCBieSBzaGFkZToKKyAgICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPSJteUNvbG9yIiBuZy1vcHRpb25zPSJjb2xvci5uYW1lIGdyb3VwIGJ5IGNvbG9yLnNoYWRlIGZvciBjb2xvciBpbiBjb2xvcnMiPgorICAgICAgICAgIDwvc2VsZWN0Pjxici8+CisKKworICAgICAgICAgIFNlbGVjdCA8YSBocmVmIG5nLWNsaWNrPSJteUNvbG9yID0geyBuYW1lOidub3QgaW4gbGlzdCcsIHNoYWRlOiAnb3RoZXInIH0iPmJvZ3VzPC9hPi48YnI+CisgICAgICAgICAgPGhyLz4KKyAgICAgICAgICBDdXJyZW50bHkgc2VsZWN0ZWQ6IHt7IHtzZWxlY3RlZF9jb2xvcjpteUNvbG9yfSB9fQorICAgICAgICAgIDxkaXYgc3R5bGU9ImJvcmRlcjpzb2xpZCAxcHggYmxhY2s7IGhlaWdodDoyMHB4IgorICAgICAgICAgICAgICAgbmctc3R5bGU9InsnYmFja2dyb3VuZC1jb2xvcic6bXlDb2xvci5uYW1lfSI+CisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9maWxlPgorICAgICAgPGZpbGUgbmFtZT0icHJvdHJhY3Rvci5qcyIgdHlwZT0icHJvdHJhY3RvciI+CisgICAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLW9wdGlvbnMnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygne3NlbGVjdGVkX2NvbG9yOm15Q29sb3J9JykpLmdldFRleHQoKSkudG9NYXRjaCgncmVkJyk7CisgICAgICAgICAgIGVsZW1lbnQuYWxsKGJ5Lm1vZGVsKCdteUNvbG9yJykpLmZpcnN0KCkuY2xpY2soKTsKKyAgICAgICAgICAgZWxlbWVudC5hbGwoYnkuY3NzKCdzZWxlY3RbbmctbW9kZWw9Im15Q29sb3IiXSBvcHRpb24nKSkuZmlyc3QoKS5jbGljaygpOworICAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCd7c2VsZWN0ZWRfY29sb3I6bXlDb2xvcn0nKSkuZ2V0VGV4dCgpKS50b01hdGNoKCdibGFjaycpOworICAgICAgICAgICBlbGVtZW50KGJ5LmNzcygnLm51bGxhYmxlIHNlbGVjdFtuZy1tb2RlbD0ibXlDb2xvciJdJykpLmNsaWNrKCk7CisgICAgICAgICAgIGVsZW1lbnQuYWxsKGJ5LmNzcygnLm51bGxhYmxlIHNlbGVjdFtuZy1tb2RlbD0ibXlDb2xvciJdIG9wdGlvbicpKS5maXJzdCgpLmNsaWNrKCk7CisgICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3tzZWxlY3RlZF9jb2xvcjpteUNvbG9yfScpKS5nZXRUZXh0KCkpLnRvTWF0Y2goJ251bGwnKTsKKyAgICAgICAgIH0pOworICAgICAgPC9maWxlPgorICAgIDwvZXhhbXBsZT4KKyAqLworCit2YXIgbmdPcHRpb25zRGlyZWN0aXZlID0gdmFsdWVGbih7CisgIHJlc3RyaWN0OiAnQScsCisgIHRlcm1pbmFsOiB0cnVlCit9KTsKKworLy8ganNoaW50IG1heGxlbjogZmFsc2UKK3ZhciBzZWxlY3REaXJlY3RpdmUgPSBbJyRjb21waWxlJywgJyRwYXJzZScsIGZ1bmN0aW9uKCRjb21waWxlLCAgICRwYXJzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIC8vMDAwMDExMTExMTExMTEwMDAwMDAwMDAwMDIyMjIyMjIyMjIwMDAwMDAwMDAwMDAwMDAwMDAwMDAzMzMzMzMzMzMzMDAwMDAwMDAwMDAwMDA0NDQ0NDQ0NDQ0NDQ0NDQwMDAwMDAwMDA1NTU1NTU1NTU1NTU1NTUwMDAwMDAwNjY2NjY2NjY2NjY2NjY2MDAwMDAwMDAwMDAwMDAwNzc3Nzc3Nzc3NzAwMDAwMDAwMDAwMDAwMDAwMDA4ODg4ODg4ODg4CisgIHZhciBOR19PUFRJT05TX1JFR0VYUCA9IC9eXHMqKFtcc1xTXSs/KSg/OlxzK2FzXHMrKFtcc1xTXSs/KSk/KD86XHMrZ3JvdXBccytieVxzKyhbXHNcU10rPykpP1xzK2ZvclxzKyg/OihbXCRcd11bXCRcd10qKXwoPzpcKFxzKihbXCRcd11bXCRcd10qKVxzKixccyooW1wkXHddW1wkXHddKilccypcKSkpXHMraW5ccysoW1xzXFNdKz8pKD86XHMrdHJhY2tccytieVxzKyhbXHNcU10rPykpPyQvLAorICAgICAgbnVsbE1vZGVsQ3RybCA9IHskc2V0Vmlld1ZhbHVlOiBub29wfTsKKy8vIGpzaGludCBtYXhsZW46IDEwMAorCisgIHJldHVybiB7CisgICAgcmVzdHJpY3Q6ICdFJywKKyAgICByZXF1aXJlOiBbJ3NlbGVjdCcsICc/bmdNb2RlbCddLAorICAgIGNvbnRyb2xsZXI6IFsnJGVsZW1lbnQnLCAnJHNjb3BlJywgJyRhdHRycycsIGZ1bmN0aW9uKCRlbGVtZW50LCAkc2NvcGUsICRhdHRycykgeworICAgICAgdmFyIHNlbGYgPSB0aGlzLAorICAgICAgICAgIG9wdGlvbnNNYXAgPSB7fSwKKyAgICAgICAgICBuZ01vZGVsQ3RybCA9IG51bGxNb2RlbEN0cmwsCisgICAgICAgICAgbnVsbE9wdGlvbiwKKyAgICAgICAgICB1bmtub3duT3B0aW9uOworCisKKyAgICAgIHNlbGYuZGF0YWJvdW5kID0gJGF0dHJzLm5nTW9kZWw7CisKKworICAgICAgc2VsZi5pbml0ID0gZnVuY3Rpb24obmdNb2RlbEN0cmxfLCBudWxsT3B0aW9uXywgdW5rbm93bk9wdGlvbl8pIHsKKyAgICAgICAgbmdNb2RlbEN0cmwgPSBuZ01vZGVsQ3RybF87CisgICAgICAgIG51bGxPcHRpb24gPSBudWxsT3B0aW9uXzsKKyAgICAgICAgdW5rbm93bk9wdGlvbiA9IHVua25vd25PcHRpb25fOworICAgICAgfTsKKworCisgICAgICBzZWxmLmFkZE9wdGlvbiA9IGZ1bmN0aW9uKHZhbHVlLCBlbGVtZW50KSB7CisgICAgICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KHZhbHVlLCAnIm9wdGlvbiB2YWx1ZSInKTsKKyAgICAgICAgb3B0aW9uc01hcFt2YWx1ZV0gPSB0cnVlOworCisgICAgICAgIGlmIChuZ01vZGVsQ3RybC4kdmlld1ZhbHVlID09IHZhbHVlKSB7CisgICAgICAgICAgJGVsZW1lbnQudmFsKHZhbHVlKTsKKyAgICAgICAgICBpZiAodW5rbm93bk9wdGlvbi5wYXJlbnQoKSkgdW5rbm93bk9wdGlvbi5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzgxNDU5CisgICAgICAgIC8vIEFkZGluZyBhbiA8b3B0aW9uIHNlbGVjdGVkPSJzZWxlY3RlZCI+IGVsZW1lbnQgdG8gYSA8c2VsZWN0IHJlcXVpcmVkPSJyZXF1aXJlZCI+IHNob3VsZAorICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgbmV3IGVsZW1lbnQKKyAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudFswXS5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykpIHsKKyAgICAgICAgICBlbGVtZW50WzBdLnNlbGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfTsKKworCisgICAgICBzZWxmLnJlbW92ZU9wdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgIGlmICh0aGlzLmhhc09wdGlvbih2YWx1ZSkpIHsKKyAgICAgICAgICBkZWxldGUgb3B0aW9uc01hcFt2YWx1ZV07CisgICAgICAgICAgaWYgKG5nTW9kZWxDdHJsLiR2aWV3VmFsdWUgPT09IHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnJlbmRlclVua25vd25PcHRpb24odmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfTsKKworCisgICAgICBzZWxmLnJlbmRlclVua25vd25PcHRpb24gPSBmdW5jdGlvbih2YWwpIHsKKyAgICAgICAgdmFyIHVua25vd25WYWwgPSAnPyAnICsgaGFzaEtleSh2YWwpICsgJyA/JzsKKyAgICAgICAgdW5rbm93bk9wdGlvbi52YWwodW5rbm93blZhbCk7CisgICAgICAgICRlbGVtZW50LnByZXBlbmQodW5rbm93bk9wdGlvbik7CisgICAgICAgICRlbGVtZW50LnZhbCh1bmtub3duVmFsKTsKKyAgICAgICAgdW5rbm93bk9wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOyAvLyBuZWVkZWQgZm9yIElFCisgICAgICB9OworCisKKyAgICAgIHNlbGYuaGFzT3B0aW9uID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnNNYXAuaGFzT3duUHJvcGVydHkodmFsdWUpOworICAgICAgfTsKKworICAgICAgJHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHsKKyAgICAgICAgLy8gZGlzYWJsZSB1bmtub3duIG9wdGlvbiBzbyB0aGF0IHdlIGRvbid0IGRvIHdvcmsgd2hlbiB0aGUgd2hvbGUgc2VsZWN0IGlzIGJlaW5nIGRlc3Ryb3llZAorICAgICAgICBzZWxmLnJlbmRlclVua25vd25PcHRpb24gPSBub29wOworICAgICAgfSk7CisgICAgfV0sCisKKyAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybHMpIHsKKyAgICAgIC8vIGlmIG5nTW9kZWwgaXMgbm90IGRlZmluZWQsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKKyAgICAgIGlmICghY3RybHNbMV0pIHJldHVybjsKKworICAgICAgdmFyIHNlbGVjdEN0cmwgPSBjdHJsc1swXSwKKyAgICAgICAgICBuZ01vZGVsQ3RybCA9IGN0cmxzWzFdLAorICAgICAgICAgIG11bHRpcGxlID0gYXR0ci5tdWx0aXBsZSwKKyAgICAgICAgICBvcHRpb25zRXhwID0gYXR0ci5uZ09wdGlvbnMsCisgICAgICAgICAgbnVsbE9wdGlvbiA9IGZhbHNlLCAvLyBpZiBmYWxzZSwgdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHNlbGVjdCBpdCAodXNlZCBieSBuZ09wdGlvbnMpCisgICAgICAgICAgZW1wdHlPcHRpb24sCisgICAgICAgICAgcmVuZGVyU2NoZWR1bGVkID0gZmFsc2UsCisgICAgICAgICAgLy8gd2UgY2FuJ3QganVzdCBqcUxpdGUoJzxvcHRpb24+Jykgc2luY2UganFMaXRlIGlzIG5vdCBzbWFydCBlbm91Z2gKKyAgICAgICAgICAvLyB0byBjcmVhdGUgaXQgaW4gPHNlbGVjdD4gYW5kIElFIGJhcmZzIG90aGVyd2lzZS4KKyAgICAgICAgICBvcHRpb25UZW1wbGF0ZSA9IGpxTGl0ZShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKSksCisgICAgICAgICAgb3B0R3JvdXBUZW1wbGF0ZSA9anFMaXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGdyb3VwJykpLAorICAgICAgICAgIHVua25vd25PcHRpb24gPSBvcHRpb25UZW1wbGF0ZS5jbG9uZSgpOworCisgICAgICAvLyBmaW5kICJudWxsIiBvcHRpb24KKyAgICAgIGZvciAodmFyIGkgPSAwLCBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKSwgaWkgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CisgICAgICAgIGlmIChjaGlsZHJlbltpXS52YWx1ZSA9PT0gJycpIHsKKyAgICAgICAgICBlbXB0eU9wdGlvbiA9IG51bGxPcHRpb24gPSBjaGlsZHJlbi5lcShpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBzZWxlY3RDdHJsLmluaXQobmdNb2RlbEN0cmwsIG51bGxPcHRpb24sIHVua25vd25PcHRpb24pOworCisgICAgICAvLyByZXF1aXJlZCB2YWxpZGF0b3IKKyAgICAgIGlmIChtdWx0aXBsZSkgeworICAgICAgICBuZ01vZGVsQ3RybC4kaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgICAgcmV0dXJuICF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPT09IDA7CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIGlmIChvcHRpb25zRXhwKSBzZXR1cEFzT3B0aW9ucyhzY29wZSwgZWxlbWVudCwgbmdNb2RlbEN0cmwpOworICAgICAgZWxzZSBpZiAobXVsdGlwbGUpIHNldHVwQXNNdWx0aXBsZShzY29wZSwgZWxlbWVudCwgbmdNb2RlbEN0cmwpOworICAgICAgZWxzZSBzZXR1cEFzU2luZ2xlKHNjb3BlLCBlbGVtZW50LCBuZ01vZGVsQ3RybCwgc2VsZWN0Q3RybCk7CisKKworICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKworICAgICAgZnVuY3Rpb24gc2V0dXBBc1NpbmdsZShzY29wZSwgc2VsZWN0RWxlbWVudCwgbmdNb2RlbEN0cmwsIHNlbGVjdEN0cmwpIHsKKyAgICAgICAgbmdNb2RlbEN0cmwuJHJlbmRlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgIHZhciB2aWV3VmFsdWUgPSBuZ01vZGVsQ3RybC4kdmlld1ZhbHVlOworCisgICAgICAgICAgaWYgKHNlbGVjdEN0cmwuaGFzT3B0aW9uKHZpZXdWYWx1ZSkpIHsKKyAgICAgICAgICAgIGlmICh1bmtub3duT3B0aW9uLnBhcmVudCgpKSB1bmtub3duT3B0aW9uLnJlbW92ZSgpOworICAgICAgICAgICAgc2VsZWN0RWxlbWVudC52YWwodmlld1ZhbHVlKTsKKyAgICAgICAgICAgIGlmICh2aWV3VmFsdWUgPT09ICcnKSBlbXB0eU9wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOyAvLyB0byBtYWtlIElFOSBoYXBweQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodmlld1ZhbHVlKSAmJiBlbXB0eU9wdGlvbikgeworICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnZhbCgnJyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzZWxlY3RDdHJsLnJlbmRlclVua25vd25PcHRpb24odmlld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgc2VsZWN0RWxlbWVudC5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgaWYgKHVua25vd25PcHRpb24ucGFyZW50KCkpIHVua25vd25PcHRpb24ucmVtb3ZlKCk7CisgICAgICAgICAgICBuZ01vZGVsQ3RybC4kc2V0Vmlld1ZhbHVlKHNlbGVjdEVsZW1lbnQudmFsKCkpOworICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICAgIH0KKworICAgICAgZnVuY3Rpb24gc2V0dXBBc011bHRpcGxlKHNjb3BlLCBzZWxlY3RFbGVtZW50LCBjdHJsKSB7CisgICAgICAgIHZhciBsYXN0VmlldzsKKyAgICAgICAgY3RybC4kcmVuZGVyID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgdmFyIGl0ZW1zID0gbmV3IEhhc2hNYXAoY3RybC4kdmlld1ZhbHVlKTsKKyAgICAgICAgICBmb3JFYWNoKHNlbGVjdEVsZW1lbnQuZmluZCgnb3B0aW9uJyksIGZ1bmN0aW9uKG9wdGlvbikgeworICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gaXNEZWZpbmVkKGl0ZW1zLmdldChvcHRpb24udmFsdWUpKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyB3ZSBoYXZlIHRvIGRvIGl0IG9uIGVhY2ggd2F0Y2ggc2luY2UgbmdNb2RlbCB3YXRjaGVzIHJlZmVyZW5jZSwgYnV0CisgICAgICAgIC8vIHdlIG5lZWQgdG8gd29yayBvZiBhbiBhcnJheSwgc28gd2UgbmVlZCB0byBzZWUgaWYgYW55dGhpbmcgd2FzIGluc2VydGVkL3JlbW92ZWQKKyAgICAgICAgc2NvcGUuJHdhdGNoKGZ1bmN0aW9uIHNlbGVjdE11bHRpcGxlV2F0Y2goKSB7CisgICAgICAgICAgaWYgKCFlcXVhbHMobGFzdFZpZXcsIGN0cmwuJHZpZXdWYWx1ZSkpIHsKKyAgICAgICAgICAgIGxhc3RWaWV3ID0gc2hhbGxvd0NvcHkoY3RybC4kdmlld1ZhbHVlKTsKKyAgICAgICAgICAgIGN0cmwuJHJlbmRlcigpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgc2VsZWN0RWxlbWVudC5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CisgICAgICAgICAgICBmb3JFYWNoKHNlbGVjdEVsZW1lbnQuZmluZCgnb3B0aW9uJyksIGZ1bmN0aW9uKG9wdGlvbikgeworICAgICAgICAgICAgICBpZiAob3B0aW9uLnNlbGVjdGVkKSB7CisgICAgICAgICAgICAgICAgYXJyYXkucHVzaChvcHRpb24udmFsdWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGN0cmwuJHNldFZpZXdWYWx1ZShhcnJheSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBzZXR1cEFzT3B0aW9ucyhzY29wZSwgc2VsZWN0RWxlbWVudCwgY3RybCkgeworICAgICAgICB2YXIgbWF0Y2g7CisKKyAgICAgICAgaWYgKCEobWF0Y2ggPSBvcHRpb25zRXhwLm1hdGNoKE5HX09QVElPTlNfUkVHRVhQKSkpIHsKKyAgICAgICAgICB0aHJvdyBuZ09wdGlvbnNNaW5FcnIoJ2lleHAnLAorICAgICAgICAgICAgIkV4cGVjdGVkIGV4cHJlc3Npb24gaW4gZm9ybSBvZiAiICsKKyAgICAgICAgICAgICInX3NlbGVjdF8gKGFzIF9sYWJlbF8pPyBmb3IgKF9rZXlfLCk/X3ZhbHVlXyBpbiBfY29sbGVjdGlvbl8nIiArCisgICAgICAgICAgICAiIGJ1dCBnb3QgJ3swfScuIEVsZW1lbnQ6IHsxfSIsCisgICAgICAgICAgICBvcHRpb25zRXhwLCBzdGFydGluZ1RhZyhzZWxlY3RFbGVtZW50KSk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZGlzcGxheUZuID0gJHBhcnNlKG1hdGNoWzJdIHx8IG1hdGNoWzFdKSwKKyAgICAgICAgICAgIHZhbHVlTmFtZSA9IG1hdGNoWzRdIHx8IG1hdGNoWzZdLAorICAgICAgICAgICAgc2VsZWN0QXMgPSAvIGFzIC8udGVzdChtYXRjaFswXSkgJiYgbWF0Y2hbMV0sCisgICAgICAgICAgICBzZWxlY3RBc0ZuID0gc2VsZWN0QXMgPyAkcGFyc2Uoc2VsZWN0QXMpIDogbnVsbCwKKyAgICAgICAgICAgIGtleU5hbWUgPSBtYXRjaFs1XSwKKyAgICAgICAgICAgIGdyb3VwQnlGbiA9ICRwYXJzZShtYXRjaFszXSB8fCAnJyksCisgICAgICAgICAgICB2YWx1ZUZuID0gJHBhcnNlKG1hdGNoWzJdID8gbWF0Y2hbMV0gOiB2YWx1ZU5hbWUpLAorICAgICAgICAgICAgdmFsdWVzRm4gPSAkcGFyc2UobWF0Y2hbN10pLAorICAgICAgICAgICAgdHJhY2sgPSBtYXRjaFs4XSwKKyAgICAgICAgICAgIHRyYWNrRm4gPSB0cmFjayA/ICRwYXJzZShtYXRjaFs4XSkgOiBudWxsLAorICAgICAgICAgICAgdHJhY2tLZXlzQ2FjaGUgPSB7fSwKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gYXJyYXkgb2YgYXJyYXkgb2YgZXhpc3Rpbmcgb3B0aW9uIGdyb3VwcyBpbiBET00uCisgICAgICAgICAgICAvLyBXZSB0cnkgdG8gcmV1c2UgdGhlc2UgaWYgcG9zc2libGUKKyAgICAgICAgICAgIC8vIC0gb3B0aW9uR3JvdXBzQ2FjaGVbMF0gaXMgdGhlIG9wdGlvbnMgd2l0aCBubyBvcHRpb24gZ3JvdXAKKyAgICAgICAgICAgIC8vIC0gb3B0aW9uR3JvdXBzQ2FjaGVbP11bMF0gaXMgdGhlIHBhcmVudDogZWl0aGVyIHRoZSBTRUxFQ1Qgb3IgT1BUR1JPVVAgZWxlbWVudAorICAgICAgICAgICAgb3B0aW9uR3JvdXBzQ2FjaGUgPSBbW3tlbGVtZW50OiBzZWxlY3RFbGVtZW50LCBsYWJlbDonJ31dXSwKKyAgICAgICAgICAgIC8vcmUtdXNhYmxlIG9iamVjdCB0byByZXByZXNlbnQgb3B0aW9uJ3MgbG9jYWxzCisgICAgICAgICAgICBsb2NhbHMgPSB7fTsKKworICAgICAgICBpZiAobnVsbE9wdGlvbikgeworICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIGVsZW1lbnQgc2luY2UgdGhlcmUgbWlnaHQgYmUgYmluZGluZ3MgaW4gaXQKKyAgICAgICAgICAkY29tcGlsZShudWxsT3B0aW9uKShzY29wZSk7CisKKyAgICAgICAgICAvLyByZW1vdmUgdGhlIGNsYXNzLCB3aGljaCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGJlY2F1c2Ugd2UgcmVjb21waWxlIHRoZSBlbGVtZW50IGFuZCBpdAorICAgICAgICAgIC8vIGJlY29tZXMgdGhlIGNvbXBpbGF0aW9uIHJvb3QKKyAgICAgICAgICBudWxsT3B0aW9uLnJlbW92ZUNsYXNzKCduZy1zY29wZScpOworCisgICAgICAgICAgLy8gd2UgbmVlZCB0byByZW1vdmUgaXQgYmVmb3JlIGNhbGxpbmcgc2VsZWN0RWxlbWVudC5lbXB0eSgpIGJlY2F1c2Ugb3RoZXJ3aXNlIElFIHdpbGwKKyAgICAgICAgICAvLyByZW1vdmUgdGhlIGxhYmVsIGZyb20gdGhlIGVsZW1lbnQuIHd0Zj8KKyAgICAgICAgICBudWxsT3B0aW9uLnJlbW92ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2xlYXIgY29udGVudHMsIHdlJ2xsIGFkZCB3aGF0J3MgbmVlZGVkIGJhc2VkIG9uIHRoZSBtb2RlbAorICAgICAgICBzZWxlY3RFbGVtZW50LmVtcHR5KCk7CisKKyAgICAgICAgc2VsZWN0RWxlbWVudC5vbignY2hhbmdlJywgc2VsZWN0aW9uQ2hhbmdlZCk7CisKKyAgICAgICAgY3RybC4kcmVuZGVyID0gcmVuZGVyOworCisgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24odmFsdWVzRm4sIHNjaGVkdWxlUmVuZGVyaW5nKTsKKyAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbihnZXRMYWJlbHMsIHNjaGVkdWxlUmVuZGVyaW5nKTsKKworICAgICAgICBpZiAobXVsdGlwbGUpIHsKKyAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKGZ1bmN0aW9uKCkgeyByZXR1cm4gY3RybC4kbW9kZWxWYWx1ZTsgfSwgc2NoZWR1bGVSZW5kZXJpbmcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCisKKyAgICAgICAgZnVuY3Rpb24gY2FsbEV4cHJlc3Npb24oZXhwckZuLCBrZXksIHZhbHVlKSB7CisgICAgICAgICAgbG9jYWxzW3ZhbHVlTmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgICBpZiAoa2V5TmFtZSkgbG9jYWxzW2tleU5hbWVdID0ga2V5OworICAgICAgICAgIHJldHVybiBleHByRm4oc2NvcGUsIGxvY2Fscyk7CisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBzZWxlY3Rpb25DaGFuZ2VkKCkgeworICAgICAgICAgIHNjb3BlLiRhcHBseShmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uID0gdmFsdWVzRm4oc2NvcGUpIHx8IFtdOworICAgICAgICAgICAgdmFyIHZpZXdWYWx1ZTsKKyAgICAgICAgICAgIGlmIChtdWx0aXBsZSkgeworICAgICAgICAgICAgICB2aWV3VmFsdWUgPSBbXTsKKyAgICAgICAgICAgICAgZm9yRWFjaChzZWxlY3RFbGVtZW50LnZhbCgpLCBmdW5jdGlvbihzZWxlY3RlZEtleSkgeworICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRLZXkgPSB0cmFja0ZuID8gdHJhY2tLZXlzQ2FjaGVbc2VsZWN0ZWRLZXldIDogc2VsZWN0ZWRLZXk7CisgICAgICAgICAgICAgICAgdmlld1ZhbHVlLnB1c2goZ2V0Vmlld1ZhbHVlKHNlbGVjdGVkS2V5LCBjb2xsZWN0aW9uW3NlbGVjdGVkS2V5XSkpOworICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHZhciBzZWxlY3RlZEtleSA9IHRyYWNrRm4gPyB0cmFja0tleXNDYWNoZVtzZWxlY3RFbGVtZW50LnZhbCgpXSA6IHNlbGVjdEVsZW1lbnQudmFsKCk7CisgICAgICAgICAgICAgIHZpZXdWYWx1ZSA9IGdldFZpZXdWYWx1ZShzZWxlY3RlZEtleSwgY29sbGVjdGlvbltzZWxlY3RlZEtleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3RybC4kc2V0Vmlld1ZhbHVlKHZpZXdWYWx1ZSk7CisgICAgICAgICAgICByZW5kZXIoKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGdldFZpZXdWYWx1ZShrZXksIHZhbHVlKSB7CisgICAgICAgICAgaWYgKGtleSA9PT0gJz8nKSB7CisgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOworICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnJykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciB2aWV3VmFsdWVGbiA9IHNlbGVjdEFzRm4gPyBzZWxlY3RBc0ZuIDogdmFsdWVGbjsKKyAgICAgICAgICAgIHJldHVybiBjYWxsRXhwcmVzc2lvbih2aWV3VmFsdWVGbiwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZnVuY3Rpb24gZ2V0TGFiZWxzKCkgeworICAgICAgICAgIHZhciB2YWx1ZXMgPSB2YWx1ZXNGbihzY29wZSk7CisgICAgICAgICAgdmFyIHRvRGlzcGxheTsKKyAgICAgICAgICBpZiAodmFsdWVzICYmIGlzQXJyYXkodmFsdWVzKSkgeworICAgICAgICAgICAgdG9EaXNwbGF5ID0gbmV3IEFycmF5KHZhbHVlcy5sZW5ndGgpOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdmFsdWVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKKyAgICAgICAgICAgICAgdG9EaXNwbGF5W2ldID0gY2FsbEV4cHJlc3Npb24oZGlzcGxheUZuLCBpLCB2YWx1ZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRvRGlzcGxheTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlcykgeworICAgICAgICAgICAgLy8gVE9ETzogQWRkIGEgdGVzdCBmb3IgdGhpcyBjYXNlCisgICAgICAgICAgICB0b0Rpc3BsYXkgPSB7fTsKKyAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gdmFsdWVzKSB7CisgICAgICAgICAgICAgIGlmICh2YWx1ZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgICAgICAgICAgICAgICB0b0Rpc3BsYXlbcHJvcF0gPSBjYWxsRXhwcmVzc2lvbihkaXNwbGF5Rm4sIHByb3AsIHZhbHVlc1twcm9wXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHRvRGlzcGxheTsKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUlzU2VsZWN0ZWRGbih2aWV3VmFsdWUpIHsKKyAgICAgICAgICB2YXIgc2VsZWN0ZWRTZXQ7CisgICAgICAgICAgaWYgKG11bHRpcGxlKSB7CisgICAgICAgICAgICBpZiAodHJhY2tGbiAmJiBpc0FycmF5KHZpZXdWYWx1ZSkpIHsKKworICAgICAgICAgICAgICBzZWxlY3RlZFNldCA9IG5ldyBIYXNoTWFwKFtdKTsKKyAgICAgICAgICAgICAgZm9yICh2YXIgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCB2aWV3VmFsdWUubGVuZ3RoOyB0cmFja0luZGV4KyspIHsKKyAgICAgICAgICAgICAgICAvLyB0cmFja2luZyBieSBrZXkKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFNldC5wdXQoY2FsbEV4cHJlc3Npb24odHJhY2tGbiwgbnVsbCwgdmlld1ZhbHVlW3RyYWNrSW5kZXhdKSwgdHJ1ZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHNlbGVjdGVkU2V0ID0gbmV3IEhhc2hNYXAodmlld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrRm4pIHsKKyAgICAgICAgICAgIHZpZXdWYWx1ZSA9IGNhbGxFeHByZXNzaW9uKHRyYWNrRm4sIG51bGwsIHZpZXdWYWx1ZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzU2VsZWN0ZWQoa2V5LCB2YWx1ZSkgeworICAgICAgICAgICAgdmFyIGNvbXBhcmVWYWx1ZUZuOworICAgICAgICAgICAgaWYgKHRyYWNrRm4pIHsKKyAgICAgICAgICAgICAgY29tcGFyZVZhbHVlRm4gPSB0cmFja0ZuOworICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RBc0ZuKSB7CisgICAgICAgICAgICAgIGNvbXBhcmVWYWx1ZUZuID0gc2VsZWN0QXNGbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNvbXBhcmVWYWx1ZUZuID0gdmFsdWVGbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG11bHRpcGxlKSB7CisgICAgICAgICAgICAgIHJldHVybiBpc0RlZmluZWQoc2VsZWN0ZWRTZXQucmVtb3ZlKGNhbGxFeHByZXNzaW9uKGNvbXBhcmVWYWx1ZUZuLCBrZXksIHZhbHVlKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHZpZXdWYWx1ZSA9PT0gY2FsbEV4cHJlc3Npb24oY29tcGFyZVZhbHVlRm4sIGtleSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiBzY2hlZHVsZVJlbmRlcmluZygpIHsKKyAgICAgICAgICBpZiAoIXJlbmRlclNjaGVkdWxlZCkgeworICAgICAgICAgICAgc2NvcGUuJCRwb3N0RGlnZXN0KHJlbmRlcik7CisgICAgICAgICAgICByZW5kZXJTY2hlZHVsZWQgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIG5ldyBsYWJlbE1hcCBpcyBjcmVhdGVkIHdpdGggZWFjaCByZW5kZXIuCisgICAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIGV4aXN0aW5nIG9wdGlvbiB3aXRoIGFkZGVkPWZhbHNlLAorICAgICAgICAgKiBhbmQgZWFjaCBuZXcgb3B0aW9uIHdpdGggYWRkZWQ9dHJ1ZS4KKyAgICAgICAgICogLSBMYWJlbHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIHR3aWNlLAorICAgICAgICAgKiAob25jZSB3aXRoIGFkZGVkPXRydWUgYW5kIG9uY2Ugd2l0aCBhZGRlZD1mYWxzZSkgd2lsbCBlbmQgdXAgd2l0aCBhIHZhbHVlIG9mIDAsIGFuZAorICAgICAgICAgKiB3aWxsIGNhdXNlIG5vIGNoYW5nZSB0byBoYXBwZW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcgb3B0aW9uLgorICAgICAgICAgKiAtIExhYmVscyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhpcyBtZXRob2Qgb25seSBvbmNlIHdpdGggYWRkZWQ9ZmFsc2Ugd2lsbCBlbmQgdXAgd2l0aCBhCisgICAgICAgICAqIHZhbHVlIG9mIC0xIGFuZCB3aWxsIGV2ZW50dWFsbHkgYmUgcGFzc2VkIHRvIHNlbGVjdEN0cmwucmVtb3ZlT3B0aW9uKCkKKyAgICAgICAgICogLSBMYWJlbHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIG9ubHkgb25jZSB3aXRoIGFkZGVkPXRydWUgd2lsbCBlbmQgdXAgd2l0aCBhCisgICAgICAgICAqIHZhbHVlIG9mIDEgYW5kIHdpbGwgZXZlbnR1YWxseSBiZSBwYXNzZWQgdG8gc2VsZWN0Q3RybC5hZGRPcHRpb24oKQorICAgICAgICAqLworICAgICAgICBmdW5jdGlvbiB1cGRhdGVMYWJlbE1hcChsYWJlbE1hcCwgbGFiZWwsIGFkZGVkKSB7CisgICAgICAgICAgbGFiZWxNYXBbbGFiZWxdID0gbGFiZWxNYXBbbGFiZWxdIHx8IDA7CisgICAgICAgICAgbGFiZWxNYXBbbGFiZWxdICs9IChhZGRlZCA/IDEgOiAtMSk7CisgICAgICAgIH0KKworICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CisgICAgICAgICAgcmVuZGVyU2NoZWR1bGVkID0gZmFsc2U7CisKKyAgICAgICAgICAvLyBUZW1wb3JhcnkgbG9jYXRpb24gZm9yIHRoZSBvcHRpb24gZ3JvdXBzIGJlZm9yZSB3ZSByZW5kZXIgdGhlbQorICAgICAgICAgIHZhciBvcHRpb25Hcm91cHMgPSB7Jyc6W119LAorICAgICAgICAgICAgICBvcHRpb25Hcm91cE5hbWVzID0gWycnXSwKKyAgICAgICAgICAgICAgb3B0aW9uR3JvdXBOYW1lLAorICAgICAgICAgICAgICBvcHRpb25Hcm91cCwKKyAgICAgICAgICAgICAgb3B0aW9uLAorICAgICAgICAgICAgICBleGlzdGluZ1BhcmVudCwgZXhpc3RpbmdPcHRpb25zLCBleGlzdGluZ09wdGlvbiwKKyAgICAgICAgICAgICAgdmlld1ZhbHVlID0gY3RybC4kdmlld1ZhbHVlLAorICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXNGbihzY29wZSkgfHwgW10sCisgICAgICAgICAgICAgIGtleXMgPSBrZXlOYW1lID8gc29ydGVkS2V5cyh2YWx1ZXMpIDogdmFsdWVzLAorICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICBncm91cExlbmd0aCwgbGVuZ3RoLAorICAgICAgICAgICAgICBncm91cEluZGV4LCBpbmRleCwKKyAgICAgICAgICAgICAgbGFiZWxNYXAgPSB7fSwKKyAgICAgICAgICAgICAgc2VsZWN0ZWQsCisgICAgICAgICAgICAgIGlzU2VsZWN0ZWQgPSBjcmVhdGVJc1NlbGVjdGVkRm4odmlld1ZhbHVlKSwKKyAgICAgICAgICAgICAgYW55U2VsZWN0ZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgbGFzdEVsZW1lbnQsCisgICAgICAgICAgICAgIGVsZW1lbnQsCisgICAgICAgICAgICAgIGxhYmVsLAorICAgICAgICAgICAgICBvcHRpb25JZDsKKworICAgICAgICAgIHRyYWNrS2V5c0NhY2hlID0ge307CisKKyAgICAgICAgICAvLyBXZSBub3cgYnVpbGQgdXAgdGhlIGxpc3Qgb2Ygb3B0aW9ucyB3ZSBuZWVkICh3ZSBtZXJnZSBsYXRlcikKKyAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgbGVuZ3RoID0ga2V5cy5sZW5ndGgsIGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CisgICAgICAgICAgICBrZXkgPSBpbmRleDsKKyAgICAgICAgICAgIGlmIChrZXlOYW1lKSB7CisgICAgICAgICAgICAgIGtleSA9IGtleXNbaW5kZXhdOworICAgICAgICAgICAgICBpZiAoa2V5LmNoYXJBdCgwKSA9PT0gJyQnKSBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2tleV07CisKKyAgICAgICAgICAgIG9wdGlvbkdyb3VwTmFtZSA9IGNhbGxFeHByZXNzaW9uKGdyb3VwQnlGbiwga2V5LCB2YWx1ZSkgfHwgJyc7CisgICAgICAgICAgICBpZiAoIShvcHRpb25Hcm91cCA9IG9wdGlvbkdyb3Vwc1tvcHRpb25Hcm91cE5hbWVdKSkgeworICAgICAgICAgICAgICBvcHRpb25Hcm91cCA9IG9wdGlvbkdyb3Vwc1tvcHRpb25Hcm91cE5hbWVdID0gW107CisgICAgICAgICAgICAgIG9wdGlvbkdyb3VwTmFtZXMucHVzaChvcHRpb25Hcm91cE5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZWxlY3RlZCA9IGlzU2VsZWN0ZWQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBhbnlTZWxlY3RlZCA9IGFueVNlbGVjdGVkIHx8IHNlbGVjdGVkOworCisgICAgICAgICAgICBsYWJlbCA9IGNhbGxFeHByZXNzaW9uKGRpc3BsYXlGbiwga2V5LCB2YWx1ZSk7IC8vIHdoYXQgd2lsbCBiZSBzZWVuIGJ5IHRoZSB1c2VyCisKKyAgICAgICAgICAgIC8vIGRvaW5nIGRpc3BsYXlGbihzY29wZSwgbG9jYWxzKSB8fCAnJyBvdmVyd3JpdGVzIHplcm8gdmFsdWVzCisgICAgICAgICAgICBsYWJlbCA9IGlzRGVmaW5lZChsYWJlbCkgPyBsYWJlbCA6ICcnOworICAgICAgICAgICAgb3B0aW9uSWQgPSB0cmFja0ZuID8gdHJhY2tGbihzY29wZSwgbG9jYWxzKSA6IChrZXlOYW1lID8ga2V5c1tpbmRleF0gOiBpbmRleCk7CisgICAgICAgICAgICBpZiAodHJhY2tGbikgeworICAgICAgICAgICAgICB0cmFja0tleXNDYWNoZVtvcHRpb25JZF0gPSBrZXk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9wdGlvbkdyb3VwLnB1c2goeworICAgICAgICAgICAgICAvLyBlaXRoZXIgdGhlIGluZGV4IGludG8gYXJyYXkgb3Iga2V5IGZyb20gb2JqZWN0CisgICAgICAgICAgICAgIGlkOiBvcHRpb25JZCwKKyAgICAgICAgICAgICAgbGFiZWw6IGxhYmVsLAorICAgICAgICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWQgICAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBiZSBzZWxlY3RlZAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghbXVsdGlwbGUpIHsKKyAgICAgICAgICAgIGlmIChudWxsT3B0aW9uIHx8IHZpZXdWYWx1ZSA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAvLyBpbnNlcnQgbnVsbCBvcHRpb24gaWYgd2UgaGF2ZSBhIHBsYWNlaG9sZGVyLCBvciB0aGUgbW9kZWwgaXMgbnVsbAorICAgICAgICAgICAgICBvcHRpb25Hcm91cHNbJyddLnVuc2hpZnQoe2lkOicnLCBsYWJlbDonJywgc2VsZWN0ZWQ6IWFueVNlbGVjdGVkfSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhbnlTZWxlY3RlZCkgeworICAgICAgICAgICAgICAvLyBvcHRpb24gY291bGQgbm90IGJlIGZvdW5kLCB3ZSBoYXZlIHRvIGluc2VydCB0aGUgdW5kZWZpbmVkIGl0ZW0KKyAgICAgICAgICAgICAgb3B0aW9uR3JvdXBzWycnXS51bnNoaWZ0KHtpZDonPycsIGxhYmVsOicnLCBzZWxlY3RlZDp0cnVlfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gTm93IHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBsaXN0IG9mIERPTSBub2RlcyB0byBtYXRjaCB0aGUgb3B0aW9uR3JvdXBzIHdlIGNvbXB1dGVkIGFib3ZlCisgICAgICAgICAgZm9yIChncm91cEluZGV4ID0gMCwgZ3JvdXBMZW5ndGggPSBvcHRpb25Hcm91cE5hbWVzLmxlbmd0aDsKKyAgICAgICAgICAgICAgIGdyb3VwSW5kZXggPCBncm91cExlbmd0aDsKKyAgICAgICAgICAgICAgIGdyb3VwSW5kZXgrKykgeworICAgICAgICAgICAgLy8gY3VycmVudCBvcHRpb24gZ3JvdXAgbmFtZSBvciAnJyBpZiBubyBncm91cAorICAgICAgICAgICAgb3B0aW9uR3JvdXBOYW1lID0gb3B0aW9uR3JvdXBOYW1lc1tncm91cEluZGV4XTsKKworICAgICAgICAgICAgLy8gbGlzdCBvZiBvcHRpb25zIGZvciB0aGF0IGdyb3VwLiAoZmlyc3QgaXRlbSBoYXMgdGhlIHBhcmVudCkKKyAgICAgICAgICAgIG9wdGlvbkdyb3VwID0gb3B0aW9uR3JvdXBzW29wdGlvbkdyb3VwTmFtZV07CisKKyAgICAgICAgICAgIGlmIChvcHRpb25Hcm91cHNDYWNoZS5sZW5ndGggPD0gZ3JvdXBJbmRleCkgeworICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGdyb3cgdGhlIG9wdGlvbkdyb3VwcworICAgICAgICAgICAgICBleGlzdGluZ1BhcmVudCA9IHsKKyAgICAgICAgICAgICAgICBlbGVtZW50OiBvcHRHcm91cFRlbXBsYXRlLmNsb25lKCkuYXR0cignbGFiZWwnLCBvcHRpb25Hcm91cE5hbWUpLAorICAgICAgICAgICAgICAgIGxhYmVsOiBvcHRpb25Hcm91cC5sYWJlbAorICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICBleGlzdGluZ09wdGlvbnMgPSBbZXhpc3RpbmdQYXJlbnRdOworICAgICAgICAgICAgICBvcHRpb25Hcm91cHNDYWNoZS5wdXNoKGV4aXN0aW5nT3B0aW9ucyk7CisgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kKGV4aXN0aW5nUGFyZW50LmVsZW1lbnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZXhpc3RpbmdPcHRpb25zID0gb3B0aW9uR3JvdXBzQ2FjaGVbZ3JvdXBJbmRleF07CisgICAgICAgICAgICAgIGV4aXN0aW5nUGFyZW50ID0gZXhpc3RpbmdPcHRpb25zWzBdOyAgLy8gZWl0aGVyIFNFTEVDVCAobm8gZ3JvdXApIG9yIE9QVEdST1VQIGVsZW1lbnQKKworICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIE9QVEdST1VQIGxhYmVsIGlmIG5vdCB0aGUgc2FtZS4KKyAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUGFyZW50LmxhYmVsICE9IG9wdGlvbkdyb3VwTmFtZSkgeworICAgICAgICAgICAgICAgIGV4aXN0aW5nUGFyZW50LmVsZW1lbnQuYXR0cignbGFiZWwnLCBleGlzdGluZ1BhcmVudC5sYWJlbCA9IG9wdGlvbkdyb3VwTmFtZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGFzdEVsZW1lbnQgPSBudWxsOyAgLy8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZworICAgICAgICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9wdGlvbkdyb3VwLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgb3B0aW9uID0gb3B0aW9uR3JvdXBbaW5kZXhdOworICAgICAgICAgICAgICBpZiAoKGV4aXN0aW5nT3B0aW9uID0gZXhpc3RpbmdPcHRpb25zW2luZGV4ICsgMV0pKSB7CisgICAgICAgICAgICAgICAgLy8gcmV1c2UgZWxlbWVudHMKKyAgICAgICAgICAgICAgICBsYXN0RWxlbWVudCA9IGV4aXN0aW5nT3B0aW9uLmVsZW1lbnQ7CisgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nT3B0aW9uLmxhYmVsICE9PSBvcHRpb24ubGFiZWwpIHsKKyAgICAgICAgICAgICAgICAgIHVwZGF0ZUxhYmVsTWFwKGxhYmVsTWFwLCBleGlzdGluZ09wdGlvbi5sYWJlbCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgdXBkYXRlTGFiZWxNYXAobGFiZWxNYXAsIG9wdGlvbi5sYWJlbCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICBsYXN0RWxlbWVudC50ZXh0KGV4aXN0aW5nT3B0aW9uLmxhYmVsID0gb3B0aW9uLmxhYmVsKTsKKyAgICAgICAgICAgICAgICAgIGxhc3RFbGVtZW50LnByb3AoJ2xhYmVsJywgZXhpc3RpbmdPcHRpb24ubGFiZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdPcHRpb24uaWQgIT09IG9wdGlvbi5pZCkgeworICAgICAgICAgICAgICAgICAgbGFzdEVsZW1lbnQudmFsKGV4aXN0aW5nT3B0aW9uLmlkID0gb3B0aW9uLmlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gbGFzdEVsZW1lbnQucHJvcCgnc2VsZWN0ZWQnKSBwcm92aWRlZCBieSBqUXVlcnkgaGFzIHNpZGUtZWZmZWN0cworICAgICAgICAgICAgICAgIGlmIChsYXN0RWxlbWVudFswXS5zZWxlY3RlZCAhPT0gb3B0aW9uLnNlbGVjdGVkKSB7CisgICAgICAgICAgICAgICAgICBsYXN0RWxlbWVudC5wcm9wKCdzZWxlY3RlZCcsIChleGlzdGluZ09wdGlvbi5zZWxlY3RlZCA9IG9wdGlvbi5zZWxlY3RlZCkpOworICAgICAgICAgICAgICAgICAgaWYgKG1zaWUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2VlICM3NjkyCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZWxlY3RlZCBpdGVtIHdvdWxkbid0IHZpc3VhbGx5IHVwZGF0ZSBvbiBJRSB3aXRob3V0IHRoaXMuCisgICAgICAgICAgICAgICAgICAgIC8vIFRlc3RlZCBvbiBXaW43OiBJRTksIElFMTAgYW5kIElFMTEuIEZ1dHVyZSBJRXMgc2hvdWxkIGJlIHRlc3RlZCBhcyB3ZWxsCisgICAgICAgICAgICAgICAgICAgIGxhc3RFbGVtZW50LnByb3AoJ3NlbGVjdGVkJywgZXhpc3RpbmdPcHRpb24uc2VsZWN0ZWQpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBncm93IGVsZW1lbnRzCisKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIGEgbnVsbCBvcHRpb24KKyAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmlkID09PSAnJyAmJiBudWxsT3B0aW9uKSB7CisgICAgICAgICAgICAgICAgICAvLyBwdXQgYmFjayB0aGUgcHJlLWNvbXBpbGVkIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsT3B0aW9uOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAvLyBqUXVlcnkodjEuNC4yKSBCdWc6IFdlIHNob3VsZCBiZSBhYmxlIHRvIGNoYWluIHRoZSBtZXRob2QgY2FsbHMsIGJ1dAorICAgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSBvbiBzb21lIGJyb3dzZXIgdGhlIC50ZXh0KCkgcmV0dXJucyBhIHN0cmluZworICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoZW4gdGhlIGVsZW1lbnQuCisgICAgICAgICAgICAgICAgICAoZWxlbWVudCA9IG9wdGlvblRlbXBsYXRlLmNsb25lKCkpCisgICAgICAgICAgICAgICAgICAgICAgLnZhbChvcHRpb24uaWQpCisgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NlbGVjdGVkJywgb3B0aW9uLnNlbGVjdGVkKQorICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdzZWxlY3RlZCcsIG9wdGlvbi5zZWxlY3RlZCkKKyAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbGFiZWwnLCBvcHRpb24ubGFiZWwpCisgICAgICAgICAgICAgICAgICAgICAgLnRleHQob3B0aW9uLmxhYmVsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBleGlzdGluZ09wdGlvbnMucHVzaChleGlzdGluZ09wdGlvbiA9IHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgaWQ6IG9wdGlvbi5pZCwKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IG9wdGlvbi5zZWxlY3RlZAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHVwZGF0ZUxhYmVsTWFwKGxhYmVsTWFwLCBvcHRpb24ubGFiZWwsIHRydWUpOworICAgICAgICAgICAgICAgIGlmIChsYXN0RWxlbWVudCkgeworICAgICAgICAgICAgICAgICAgbGFzdEVsZW1lbnQuYWZ0ZXIoZWxlbWVudCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGFyZW50LmVsZW1lbnQuYXBwZW5kKGVsZW1lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0RWxlbWVudCA9IGVsZW1lbnQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgZXhjZXNzaXZlIE9QVElPTnMgaW4gYSBncm91cAorICAgICAgICAgICAgaW5kZXgrKzsgLy8gaW5jcmVtZW50IHNpbmNlIHRoZSBleGlzdGluZ09wdGlvbnNbMF0gaXMgcGFyZW50IGVsZW1lbnQgbm90IE9QVElPTgorICAgICAgICAgICAgd2hpbGUgKGV4aXN0aW5nT3B0aW9ucy5sZW5ndGggPiBpbmRleCkgeworICAgICAgICAgICAgICBvcHRpb24gPSBleGlzdGluZ09wdGlvbnMucG9wKCk7CisgICAgICAgICAgICAgIHVwZGF0ZUxhYmVsTWFwKGxhYmVsTWFwLCBvcHRpb24ubGFiZWwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgb3B0aW9uLmVsZW1lbnQucmVtb3ZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8vIHJlbW92ZSBhbnkgZXhjZXNzaXZlIE9QVEdST1VQcyBmcm9tIHNlbGVjdAorICAgICAgICAgIHdoaWxlIChvcHRpb25Hcm91cHNDYWNoZS5sZW5ndGggPiBncm91cEluZGV4KSB7CisgICAgICAgICAgICAvLyByZW1vdmUgYWxsIHRoZSBsYWJlbHMgaW4gdGhlIG9wdGlvbiBncm91cAorICAgICAgICAgICAgb3B0aW9uR3JvdXAgPSBvcHRpb25Hcm91cHNDYWNoZS5wb3AoKTsKKyAgICAgICAgICAgIGZvciAoaW5kZXggPSAxOyBpbmRleCA8IG9wdGlvbkdyb3VwLmxlbmd0aDsgKytpbmRleCkgeworICAgICAgICAgICAgICB1cGRhdGVMYWJlbE1hcChsYWJlbE1hcCwgb3B0aW9uR3JvdXBbaW5kZXhdLmxhYmVsLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcHRpb25Hcm91cFswXS5lbGVtZW50LnJlbW92ZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3JFYWNoKGxhYmVsTWFwLCBmdW5jdGlvbihjb3VudCwgbGFiZWwpIHsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgc2VsZWN0Q3RybC5hZGRPcHRpb24obGFiZWwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IDApIHsKKyAgICAgICAgICAgICAgc2VsZWN0Q3RybC5yZW1vdmVPcHRpb24obGFiZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworfV07CisKK3ZhciBvcHRpb25EaXJlY3RpdmUgPSBbJyRpbnRlcnBvbGF0ZScsIGZ1bmN0aW9uKCRpbnRlcnBvbGF0ZSkgeworICB2YXIgbnVsbFNlbGVjdEN0cmwgPSB7CisgICAgYWRkT3B0aW9uOiBub29wLAorICAgIHJlbW92ZU9wdGlvbjogbm9vcAorICB9OworCisgIHJldHVybiB7CisgICAgcmVzdHJpY3Q6ICdFJywKKyAgICBwcmlvcml0eTogMTAwLAorICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHsKKyAgICAgIGlmIChpc1VuZGVmaW5lZChhdHRyLnZhbHVlKSkgeworICAgICAgICB2YXIgaW50ZXJwb2xhdGVGbiA9ICRpbnRlcnBvbGF0ZShlbGVtZW50LnRleHQoKSwgdHJ1ZSk7CisgICAgICAgIGlmICghaW50ZXJwb2xhdGVGbikgeworICAgICAgICAgIGF0dHIuJHNldCgndmFsdWUnLCBlbGVtZW50LnRleHQoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7CisgICAgICAgIHZhciBzZWxlY3RDdHJsTmFtZSA9ICckc2VsZWN0Q29udHJvbGxlcicsCisgICAgICAgICAgICBwYXJlbnQgPSBlbGVtZW50LnBhcmVudCgpLAorICAgICAgICAgICAgc2VsZWN0Q3RybCA9IHBhcmVudC5kYXRhKHNlbGVjdEN0cmxOYW1lKSB8fAorICAgICAgICAgICAgICBwYXJlbnQucGFyZW50KCkuZGF0YShzZWxlY3RDdHJsTmFtZSk7IC8vIGluIGNhc2Ugd2UgYXJlIGluIG9wdGdyb3VwCisKKyAgICAgICAgaWYgKCFzZWxlY3RDdHJsIHx8ICFzZWxlY3RDdHJsLmRhdGFib3VuZCkgeworICAgICAgICAgIHNlbGVjdEN0cmwgPSBudWxsU2VsZWN0Q3RybDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnRlcnBvbGF0ZUZuKSB7CisgICAgICAgICAgc2NvcGUuJHdhdGNoKGludGVycG9sYXRlRm4sIGZ1bmN0aW9uIGludGVycG9sYXRlV2F0Y2hBY3Rpb24obmV3VmFsLCBvbGRWYWwpIHsKKyAgICAgICAgICAgIGF0dHIuJHNldCgndmFsdWUnLCBuZXdWYWwpOworICAgICAgICAgICAgaWYgKG9sZFZhbCAhPT0gbmV3VmFsKSB7CisgICAgICAgICAgICAgIHNlbGVjdEN0cmwucmVtb3ZlT3B0aW9uKG9sZFZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZWxlY3RDdHJsLmFkZE9wdGlvbihuZXdWYWwsIGVsZW1lbnQpOworICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbGVjdEN0cmwuYWRkT3B0aW9uKGF0dHIudmFsdWUsIGVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgZWxlbWVudC5vbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICBzZWxlY3RDdHJsLnJlbW92ZU9wdGlvbihhdHRyLnZhbHVlKTsKKyAgICAgICAgfSk7CisgICAgICB9OworICAgIH0KKyAgfTsKK31dOworCit2YXIgc3R5bGVEaXJlY3RpdmUgPSB2YWx1ZUZuKHsKKyAgcmVzdHJpY3Q6ICdFJywKKyAgdGVybWluYWw6IGZhbHNlCit9KTsKKworICBpZiAod2luZG93LmFuZ3VsYXIuYm9vdHN0cmFwKSB7CisgICAgLy9Bbmd1bGFySlMgaXMgYWxyZWFkeSBsb2FkZWQsIHNvIHdlIGNhbiByZXR1cm4gaGVyZS4uLgorICAgIGNvbnNvbGUubG9nKCdXQVJOSU5HOiBUcmllZCB0byBsb2FkIGFuZ3VsYXIgbW9yZSB0aGFuIG9uY2UuJyk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy90cnkgdG8gYmluZCB0byBqcXVlcnkgbm93IHNvIHRoYXQgb25lIGNhbiB3cml0ZSBqcUxpdGUoZG9jdW1lbnQpLnJlYWR5KCkKKyAgLy9idXQgd2Ugd2lsbCByZWJpbmQgb24gYm9vdHN0cmFwIGFnYWluLgorICBiaW5kSlF1ZXJ5KCk7CisKKyAgcHVibGlzaEV4dGVybmFsQVBJKGFuZ3VsYXIpOworCisgIGpxTGl0ZShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CisgICAgYW5ndWxhckluaXQoZG9jdW1lbnQsIGJvb3RzdHJhcCk7CisgIH0pOworCit9KSh3aW5kb3csIGRvY3VtZW50KTsKKworIXdpbmRvdy5hbmd1bGFyLiQkY3NwKCkgJiYgd2luZG93LmFuZ3VsYXIuZWxlbWVudChkb2N1bWVudCkuZmluZCgnaGVhZCcpLnByZXBlbmQoJzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGNoYXJzZXQgIlVURi04IjtbbmdcXDpjbG9ha10sW25nLWNsb2FrXSxbZGF0YS1uZy1jbG9ha10sW3gtbmctY2xvYWtdLC5uZy1jbG9haywueC1uZy1jbG9haywubmctaGlkZTpub3QoLm5nLWhpZGUtYW5pbWF0ZSl7ZGlzcGxheTpub25lICFpbXBvcnRhbnQ7fW5nXFw6Zm9ybXtkaXNwbGF5OmJsb2NrO308L3N0eWxlPicpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvYW5ndWxhci5taW4uanMgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9hbmd1bGFyLm1pbi5qcwppbmRleCA4MjAwODE0Li40MTFiYmQ5IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9hbmd1bGFyLm1pbi5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9hbmd1bGFyLm1pbi5qcwpAQCAtMSwyNzMgKzEsMjczIEBACi0vKg0KLVRoZSBNSVQgTGljZW5zZQ0KLQ0KLUNvcHlyaWdodCAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZw0KLQ0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkNCi1vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCi10byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQotY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KLQ0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQotQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTg0KLVRIRSBTT0ZUV0FSRS4NCi0qLw0KLS8qDQotIEFuZ3VsYXJKUyB2MS4zLjgNCi0gKGMpIDIwMTAtMjAxNCBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmcNCi0gTGljZW5zZTogTUlUDQotKi8NCi0oZnVuY3Rpb24oTSxZLHQpeyd1c2Ugc3RyaWN0JztmdW5jdGlvbiBUKGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXSxjO2M9IlsiKyhiP2IrIjoiOiIiKSthKyJdIGh0dHA6Ly9lcnJvcnMuYW5ndWxhcmpzLm9yZy8xLjMuOC8iKyhiP2IrIi8iOiIiKSthO2ZvcihhPTE7YTxhcmd1bWVudHMubGVuZ3RoO2ErKyl7Yz1jKygxPT1hPyI/IjoiJiIpKyJwIisoYS0xKSsiPSI7dmFyIGQ9ZW5jb2RlVVJJQ29tcG9uZW50LGU7ZT1hcmd1bWVudHNbYV07ZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lLnRvU3RyaW5nKCkucmVwbGFjZSgvIFx7W1xzXFNdKiQvLCIiKToidW5kZWZpbmVkIj09dHlwZW9mIGU/InVuZGVmaW5lZCI6InN0cmluZyIhPXR5cGVvZiBlP0pTT04uc3RyaW5naWZ5KGUpOmU7Yys9ZChlKX1yZXR1cm4gRXJyb3IoYyl9fWZ1bmN0aW9uIFRhKGIpe2lmKG51bGw9PWJ8fFVhKGIpKXJldHVybiExO3ZhciBhPWIubGVuZ3RoO3JldHVybiBiLm5vZGVUeXBlPT09DQotbmEmJmE/ITA6RihiKXx8eChiKXx8MD09PWF8fCJudW1iZXIiPT09dHlwZW9mIGEmJjA8YSYmYS0xIGluIGJ9ZnVuY3Rpb24gcyhiLGEsYyl7dmFyIGQsZTtpZihiKWlmKEcoYikpZm9yKGQgaW4gYikicHJvdG90eXBlIj09ZHx8Imxlbmd0aCI9PWR8fCJuYW1lIj09ZHx8Yi5oYXNPd25Qcm9wZXJ0eSYmIWIuaGFzT3duUHJvcGVydHkoZCl8fGEuY2FsbChjLGJbZF0sZCxiKTtlbHNlIGlmKHgoYil8fFRhKGIpKXt2YXIgZj0ib2JqZWN0IiE9PXR5cGVvZiBiO2Q9MDtmb3IoZT1iLmxlbmd0aDtkPGU7ZCsrKShmfHxkIGluIGIpJiZhLmNhbGwoYyxiW2RdLGQsYil9ZWxzZSBpZihiLmZvckVhY2gmJmIuZm9yRWFjaCE9PXMpYi5mb3JFYWNoKGEsYyxiKTtlbHNlIGZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYS5jYWxsKGMsYltkXSxkLGIpO3JldHVybiBifWZ1bmN0aW9uIEVkKGIsYSxjKXtmb3IodmFyIGQ9T2JqZWN0LmtleXMoYikuc29ydCgpLGU9MDtlPGQubGVuZ3RoO2UrKylhLmNhbGwoYywNCi1iW2RbZV1dLGRbZV0pO3JldHVybiBkfWZ1bmN0aW9uIGtjKGIpe3JldHVybiBmdW5jdGlvbihhLGMpe2IoYyxhKX19ZnVuY3Rpb24gRmQoKXtyZXR1cm4rK25ifWZ1bmN0aW9uIGxjKGIsYSl7YT9iLiQkaGFzaEtleT1hOmRlbGV0ZSBiLiQkaGFzaEtleX1mdW5jdGlvbiB6KGIpe2Zvcih2YXIgYT1iLiQkaGFzaEtleSxjPTEsZD1hcmd1bWVudHMubGVuZ3RoO2M8ZDtjKyspe3ZhciBlPWFyZ3VtZW50c1tjXTtpZihlKWZvcih2YXIgZj1PYmplY3Qua2V5cyhlKSxnPTAsaD1mLmxlbmd0aDtnPGg7ZysrKXt2YXIgbD1mW2ddO2JbbF09ZVtsXX19bGMoYixhKTtyZXR1cm4gYn1mdW5jdGlvbiBiYShiKXtyZXR1cm4gcGFyc2VJbnQoYiwxMCl9ZnVuY3Rpb24gQygpe31mdW5jdGlvbiBvYShiKXtyZXR1cm4gYn1mdW5jdGlvbiBkYShiKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYn19ZnVuY3Rpb24gRChiKXtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBifWZ1bmN0aW9uIHkoYil7cmV0dXJuInVuZGVmaW5lZCIhPT0NCi10eXBlb2YgYn1mdW5jdGlvbiBIKGIpe3JldHVybiBudWxsIT09YiYmIm9iamVjdCI9PT10eXBlb2YgYn1mdW5jdGlvbiBGKGIpe3JldHVybiJzdHJpbmciPT09dHlwZW9mIGJ9ZnVuY3Rpb24gVihiKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBifWZ1bmN0aW9uIHBhKGIpe3JldHVybiJbb2JqZWN0IERhdGVdIj09PURhLmNhbGwoYil9ZnVuY3Rpb24gRyhiKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIGJ9ZnVuY3Rpb24gb2IoYil7cmV0dXJuIltvYmplY3QgUmVnRXhwXSI9PT1EYS5jYWxsKGIpfWZ1bmN0aW9uIFVhKGIpe3JldHVybiBiJiZiLndpbmRvdz09PWJ9ZnVuY3Rpb24gVmEoYil7cmV0dXJuIGImJmIuJGV2YWxBc3luYyYmYi4kd2F0Y2h9ZnVuY3Rpb24gV2EoYil7cmV0dXJuImJvb2xlYW4iPT09dHlwZW9mIGJ9ZnVuY3Rpb24gbWMoYil7cmV0dXJuISghYnx8IShiLm5vZGVOYW1lfHxiLnByb3AmJmIuYXR0ciYmYi5maW5kKSl9ZnVuY3Rpb24gR2QoYil7dmFyIGE9e307DQotYj1iLnNwbGl0KCIsIik7dmFyIGM7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhW2JbY11dPSEwO3JldHVybiBhfWZ1bmN0aW9uIHVhKGIpe3JldHVybiBRKGIubm9kZU5hbWV8fGJbMF0mJmJbMF0ubm9kZU5hbWUpfWZ1bmN0aW9uIFhhKGIsYSl7dmFyIGM9Yi5pbmRleE9mKGEpOzA8PWMmJmIuc3BsaWNlKGMsMSk7cmV0dXJuIGF9ZnVuY3Rpb24gRWEoYixhLGMsZCl7aWYoVWEoYil8fFZhKGIpKXRocm93IEthKCJjcHdzIik7aWYoYSl7aWYoYj09PWEpdGhyb3cgS2EoImNwaSIpO2M9Y3x8W107ZD1kfHxbXTtpZihIKGIpKXt2YXIgZT1jLmluZGV4T2YoYik7aWYoLTEhPT1lKXJldHVybiBkW2VdO2MucHVzaChiKTtkLnB1c2goYSl9aWYoeChiKSlmb3IodmFyIGY9YS5sZW5ndGg9MDtmPGIubGVuZ3RoO2YrKyllPUVhKGJbZl0sbnVsbCxjLGQpLEgoYltmXSkmJihjLnB1c2goYltmXSksZC5wdXNoKGUpKSxhLnB1c2goZSk7ZWxzZXt2YXIgZz1hLiQkaGFzaEtleTt4KGEpP2EubGVuZ3RoPQ0KLTA6cyhhLGZ1bmN0aW9uKGIsYyl7ZGVsZXRlIGFbY119KTtmb3IoZiBpbiBiKWIuaGFzT3duUHJvcGVydHkoZikmJihlPUVhKGJbZl0sbnVsbCxjLGQpLEgoYltmXSkmJihjLnB1c2goYltmXSksZC5wdXNoKGUpKSxhW2ZdPWUpO2xjKGEsZyl9fWVsc2UgaWYoYT1iKXgoYik/YT1FYShiLFtdLGMsZCk6cGEoYik/YT1uZXcgRGF0ZShiLmdldFRpbWUoKSk6b2IoYik/KGE9bmV3IFJlZ0V4cChiLnNvdXJjZSxiLnRvU3RyaW5nKCkubWF0Y2goL1teXC9dKiQvKVswXSksYS5sYXN0SW5kZXg9Yi5sYXN0SW5kZXgpOkgoYikmJihlPU9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKGIpKSxhPUVhKGIsZSxjLGQpKTtyZXR1cm4gYX1mdW5jdGlvbiBxYShiLGEpe2lmKHgoYikpe2E9YXx8W107Zm9yKHZhciBjPTAsZD1iLmxlbmd0aDtjPGQ7YysrKWFbY109YltjXX1lbHNlIGlmKEgoYikpZm9yKGMgaW4gYT1hfHx7fSxiKWlmKCIkIiE9PWMuY2hhckF0KDApfHwiJCIhPT1jLmNoYXJBdCgxKSlhW2NdPQ0KLWJbY107cmV0dXJuIGF8fGJ9ZnVuY3Rpb24gZmEoYixhKXtpZihiPT09YSlyZXR1cm4hMDtpZihudWxsPT09Ynx8bnVsbD09PWEpcmV0dXJuITE7aWYoYiE9PWImJmEhPT1hKXJldHVybiEwO3ZhciBjPXR5cGVvZiBiLGQ7aWYoYz09dHlwZW9mIGEmJiJvYmplY3QiPT1jKWlmKHgoYikpe2lmKCF4KGEpKXJldHVybiExO2lmKChjPWIubGVuZ3RoKT09YS5sZW5ndGgpe2ZvcihkPTA7ZDxjO2QrKylpZighZmEoYltkXSxhW2RdKSlyZXR1cm4hMTtyZXR1cm4hMH19ZWxzZXtpZihwYShiKSlyZXR1cm4gcGEoYSk/ZmEoYi5nZXRUaW1lKCksYS5nZXRUaW1lKCkpOiExO2lmKG9iKGIpJiZvYihhKSlyZXR1cm4gYi50b1N0cmluZygpPT1hLnRvU3RyaW5nKCk7aWYoVmEoYil8fFZhKGEpfHxVYShiKXx8VWEoYSl8fHgoYSkpcmV0dXJuITE7Yz17fTtmb3IoZCBpbiBiKWlmKCIkIiE9PWQuY2hhckF0KDApJiYhRyhiW2RdKSl7aWYoIWZhKGJbZF0sYVtkXSkpcmV0dXJuITE7Y1tkXT0hMH1mb3IoZCBpbiBhKWlmKCFjLmhhc093blByb3BlcnR5KGQpJiYNCi0iJCIhPT1kLmNoYXJBdCgwKSYmYVtkXSE9PXQmJiFHKGFbZF0pKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFlhKGIsYSxjKXtyZXR1cm4gYi5jb25jYXQoWmEuY2FsbChhLGMpKX1mdW5jdGlvbiBuYyhiLGEpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aD9aYS5jYWxsKGFyZ3VtZW50cywyKTpbXTtyZXR1cm4hRyhhKXx8YSBpbnN0YW5jZW9mIFJlZ0V4cD9hOmMubGVuZ3RoP2Z1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/YS5hcHBseShiLFlhKGMsYXJndW1lbnRzLDApKTphLmFwcGx5KGIsYyl9OmZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/YS5hcHBseShiLGFyZ3VtZW50cyk6YS5jYWxsKGIpfX1mdW5jdGlvbiBIZChiLGEpe3ZhciBjPWE7InN0cmluZyI9PT10eXBlb2YgYiYmIiQiPT09Yi5jaGFyQXQoMCkmJiIkIj09PWIuY2hhckF0KDEpP2M9dDpVYShhKT9jPSIkV0lORE9XIjphJiZZPT09YT9jPSIkRE9DVU1FTlQiOlZhKGEpJiYNCi0oYz0iJFNDT1BFIik7cmV0dXJuIGN9ZnVuY3Rpb24gJGEoYixhKXtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBiKXJldHVybiB0O1YoYSl8fChhPWE/MjpudWxsKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYixIZCxhKX1mdW5jdGlvbiBvYyhiKXtyZXR1cm4gRihiKT9KU09OLnBhcnNlKGIpOmJ9ZnVuY3Rpb24gdmEoYil7Yj1CKGIpLmNsb25lKCk7dHJ5e2IuZW1wdHkoKX1jYXRjaChhKXt9dmFyIGM9QigiPGRpdj4iKS5hcHBlbmQoYikuaHRtbCgpO3RyeXtyZXR1cm4gYlswXS5ub2RlVHlwZT09PXBiP1EoYyk6Yy5tYXRjaCgvXig8W14+XSs+KS8pWzFdLnJlcGxhY2UoL148KFtcd1wtXSspLyxmdW5jdGlvbihhLGIpe3JldHVybiI8IitRKGIpfSl9Y2F0Y2goZCl7cmV0dXJuIFEoYyl9fWZ1bmN0aW9uIHBjKGIpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGIpfWNhdGNoKGEpe319ZnVuY3Rpb24gcWMoYil7dmFyIGE9e30sYyxkO3MoKGJ8fCIiKS5zcGxpdCgiJiIpLGZ1bmN0aW9uKGIpe2ImJg0KLShjPWIucmVwbGFjZSgvXCsvZywiJTIwIikuc3BsaXQoIj0iKSxkPXBjKGNbMF0pLHkoZCkmJihiPXkoY1sxXSk/cGMoY1sxXSk6ITAscmMuY2FsbChhLGQpP3goYVtkXSk/YVtkXS5wdXNoKGIpOmFbZF09W2FbZF0sYl06YVtkXT1iKSl9KTtyZXR1cm4gYX1mdW5jdGlvbiBOYihiKXt2YXIgYT1bXTtzKGIsZnVuY3Rpb24oYixkKXt4KGIpP3MoYixmdW5jdGlvbihiKXthLnB1c2goRmEoZCwhMCkrKCEwPT09Yj8iIjoiPSIrRmEoYiwhMCkpKX0pOmEucHVzaChGYShkLCEwKSsoITA9PT1iPyIiOiI9IitGYShiLCEwKSkpfSk7cmV0dXJuIGEubGVuZ3RoP2Euam9pbigiJiIpOiIifWZ1bmN0aW9uIHFiKGIpe3JldHVybiBGYShiLCEwKS5yZXBsYWNlKC8lMjYvZ2ksIiYiKS5yZXBsYWNlKC8lM0QvZ2ksIj0iKS5yZXBsYWNlKC8lMkIvZ2ksIisiKX1mdW5jdGlvbiBGYShiLGEpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoYikucmVwbGFjZSgvJTQwL2dpLCJAIikucmVwbGFjZSgvJTNBL2dpLA0KLSI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lM0IvZ2ksIjsiKS5yZXBsYWNlKC8lMjAvZyxhPyIlMjAiOiIrIil9ZnVuY3Rpb24gSWQoYixhKXt2YXIgYyxkLGU9cmIubGVuZ3RoO2I9QihiKTtmb3IoZD0wO2Q8ZTsrK2QpaWYoYz1yYltkXSthLEYoYz1iLmF0dHIoYykpKXJldHVybiBjO3JldHVybiBudWxsfWZ1bmN0aW9uIEpkKGIsYSl7dmFyIGMsZCxlPXt9O3MocmIsZnVuY3Rpb24oYSl7YSs9ImFwcCI7IWMmJmIuaGFzQXR0cmlidXRlJiZiLmhhc0F0dHJpYnV0ZShhKSYmKGM9YixkPWIuZ2V0QXR0cmlidXRlKGEpKX0pO3MocmIsZnVuY3Rpb24oYSl7YSs9ImFwcCI7dmFyIGU7IWMmJihlPWIucXVlcnlTZWxlY3RvcigiWyIrYS5yZXBsYWNlKCI6IiwiXFw6IikrIl0iKSkmJihjPWUsZD1lLmdldEF0dHJpYnV0ZShhKSl9KTtjJiYoZS5zdHJpY3REaT1udWxsIT09SWQoYywic3RyaWN0LWRpIiksYShjLGQ/W2RdOltdLGUpKX1mdW5jdGlvbiBzYyhiLA0KLWEsYyl7SChjKXx8KGM9e30pO2M9eih7c3RyaWN0RGk6ITF9LGMpO3ZhciBkPWZ1bmN0aW9uKCl7Yj1CKGIpO2lmKGIuaW5qZWN0b3IoKSl7dmFyIGQ9YlswXT09PVk/ImRvY3VtZW50Ijp2YShiKTt0aHJvdyBLYSgiYnRzdHJwZCIsZC5yZXBsYWNlKC88LywiJmx0OyIpLnJlcGxhY2UoLz4vLCImZ3Q7IikpO31hPWF8fFtdO2EudW5zaGlmdChbIiRwcm92aWRlIixmdW5jdGlvbihhKXthLnZhbHVlKCIkcm9vdEVsZW1lbnQiLGIpfV0pO2MuZGVidWdJbmZvRW5hYmxlZCYmYS5wdXNoKFsiJGNvbXBpbGVQcm92aWRlciIsZnVuY3Rpb24oYSl7YS5kZWJ1Z0luZm9FbmFibGVkKCEwKX1dKTthLnVuc2hpZnQoIm5nIik7ZD1PYihhLGMuc3RyaWN0RGkpO2QuaW52b2tlKFsiJHJvb3RTY29wZSIsIiRyb290RWxlbWVudCIsIiRjb21waWxlIiwiJGluamVjdG9yIixmdW5jdGlvbihhLGIsYyxkKXthLiRhcHBseShmdW5jdGlvbigpe2IuZGF0YSgiJGluamVjdG9yIixkKTtjKGIpKGEpfSl9XSk7cmV0dXJuIGR9LA0KLWU9L15OR19FTkFCTEVfREVCVUdfSU5GTyEvLGY9L15OR19ERUZFUl9CT09UU1RSQVAhLztNJiZlLnRlc3QoTS5uYW1lKSYmKGMuZGVidWdJbmZvRW5hYmxlZD0hMCxNLm5hbWU9TS5uYW1lLnJlcGxhY2UoZSwiIikpO2lmKE0mJiFmLnRlc3QoTS5uYW1lKSlyZXR1cm4gZCgpO00ubmFtZT1NLm5hbWUucmVwbGFjZShmLCIiKTtnYS5yZXN1bWVCb290c3RyYXA9ZnVuY3Rpb24oYil7cyhiLGZ1bmN0aW9uKGIpe2EucHVzaChiKX0pO2QoKX19ZnVuY3Rpb24gS2QoKXtNLm5hbWU9Ik5HX0VOQUJMRV9ERUJVR19JTkZPISIrTS5uYW1lO00ubG9jYXRpb24ucmVsb2FkKCl9ZnVuY3Rpb24gTGQoYil7Yj1nYS5lbGVtZW50KGIpLmluamVjdG9yKCk7aWYoIWIpdGhyb3cgS2EoInRlc3QiKTtyZXR1cm4gYi5nZXQoIiQkdGVzdGFiaWxpdHkiKX1mdW5jdGlvbiB0YyhiLGEpe2E9YXx8Il8iO3JldHVybiBiLnJlcGxhY2UoTWQsZnVuY3Rpb24oYixkKXtyZXR1cm4oZD9hOiIiKStiLnRvTG93ZXJDYXNlKCl9KX0NCi1mdW5jdGlvbiBOZCgpe3ZhciBiO3VjfHwoKHJhPU0ualF1ZXJ5KSYmcmEuZm4ub24/KEI9cmEseihyYS5mbix7c2NvcGU6TGEuc2NvcGUsaXNvbGF0ZVNjb3BlOkxhLmlzb2xhdGVTY29wZSxjb250cm9sbGVyOkxhLmNvbnRyb2xsZXIsaW5qZWN0b3I6TGEuaW5qZWN0b3IsaW5oZXJpdGVkRGF0YTpMYS5pbmhlcml0ZWREYXRhfSksYj1yYS5jbGVhbkRhdGEscmEuY2xlYW5EYXRhPWZ1bmN0aW9uKGEpe3ZhciBjO2lmKFBiKVBiPSExO2Vsc2UgZm9yKHZhciBkPTAsZTtudWxsIT0oZT1hW2RdKTtkKyspKGM9cmEuX2RhdGEoZSwiZXZlbnRzIikpJiZjLiRkZXN0cm95JiZyYShlKS50cmlnZ2VySGFuZGxlcigiJGRlc3Ryb3kiKTtiKGEpfSk6Qj1SLGdhLmVsZW1lbnQ9Qix1Yz0hMCl9ZnVuY3Rpb24gUWIoYixhLGMpe2lmKCFiKXRocm93IEthKCJhcmVxIixhfHwiPyIsY3x8InJlcXVpcmVkIik7cmV0dXJuIGJ9ZnVuY3Rpb24gc2IoYixhLGMpe2MmJngoYikmJihiPWJbYi5sZW5ndGgtMV0pOw0KLVFiKEcoYiksYSwibm90IGEgZnVuY3Rpb24sIGdvdCAiKyhiJiYib2JqZWN0Ij09PXR5cGVvZiBiP2IuY29uc3RydWN0b3IubmFtZXx8Ik9iamVjdCI6dHlwZW9mIGIpKTtyZXR1cm4gYn1mdW5jdGlvbiBNYShiLGEpe2lmKCJoYXNPd25Qcm9wZXJ0eSI9PT1iKXRocm93IEthKCJiYWRuYW1lIixhKTt9ZnVuY3Rpb24gdmMoYixhLGMpe2lmKCFhKXJldHVybiBiO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZCxlPWIsZj1hLmxlbmd0aCxnPTA7ZzxmO2crKylkPWFbZ10sYiYmKGI9KGU9YilbZF0pO3JldHVybiFjJiZHKGIpP25jKGUsYik6Yn1mdW5jdGlvbiB0YihiKXt2YXIgYT1iWzBdO2I9YltiLmxlbmd0aC0xXTt2YXIgYz1bYV07ZG97YT1hLm5leHRTaWJsaW5nO2lmKCFhKWJyZWFrO2MucHVzaChhKX13aGlsZShhIT09Yik7cmV0dXJuIEIoYyl9ZnVuY3Rpb24gaGEoKXtyZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBPZChiKXtmdW5jdGlvbiBhKGEsYixjKXtyZXR1cm4gYVtiXXx8DQotKGFbYl09YygpKX12YXIgYz1UKCIkaW5qZWN0b3IiKSxkPVQoIm5nIik7Yj1hKGIsImFuZ3VsYXIiLE9iamVjdCk7Yi4kJG1pbkVycj1iLiQkbWluRXJyfHxUO3JldHVybiBhKGIsIm1vZHVsZSIsZnVuY3Rpb24oKXt2YXIgYj17fTtyZXR1cm4gZnVuY3Rpb24oZixnLGgpe2lmKCJoYXNPd25Qcm9wZXJ0eSI9PT1mKXRocm93IGQoImJhZG5hbWUiLCJtb2R1bGUiKTtnJiZiLmhhc093blByb3BlcnR5KGYpJiYoYltmXT1udWxsKTtyZXR1cm4gYShiLGYsZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGMsZCxlLGYpe2Z8fChmPWIpO3JldHVybiBmdW5jdGlvbigpe2ZbZXx8InB1c2giXShbYyxkLGFyZ3VtZW50c10pO3JldHVybiB1fX1pZighZyl0aHJvdyBjKCJub21vZCIsZik7dmFyIGI9W10sZD1bXSxlPVtdLHE9YSgiJGluamVjdG9yIiwiaW52b2tlIiwicHVzaCIsZCksdT17X2ludm9rZVF1ZXVlOmIsX2NvbmZpZ0Jsb2NrczpkLF9ydW5CbG9ja3M6ZSxyZXF1aXJlczpnLG5hbWU6Zixwcm92aWRlcjphKCIkcHJvdmlkZSIsDQotInByb3ZpZGVyIiksZmFjdG9yeTphKCIkcHJvdmlkZSIsImZhY3RvcnkiKSxzZXJ2aWNlOmEoIiRwcm92aWRlIiwic2VydmljZSIpLHZhbHVlOmEoIiRwcm92aWRlIiwidmFsdWUiKSxjb25zdGFudDphKCIkcHJvdmlkZSIsImNvbnN0YW50IiwidW5zaGlmdCIpLGFuaW1hdGlvbjphKCIkYW5pbWF0ZVByb3ZpZGVyIiwicmVnaXN0ZXIiKSxmaWx0ZXI6YSgiJGZpbHRlclByb3ZpZGVyIiwicmVnaXN0ZXIiKSxjb250cm9sbGVyOmEoIiRjb250cm9sbGVyUHJvdmlkZXIiLCJyZWdpc3RlciIpLGRpcmVjdGl2ZTphKCIkY29tcGlsZVByb3ZpZGVyIiwiZGlyZWN0aXZlIiksY29uZmlnOnEscnVuOmZ1bmN0aW9uKGEpe2UucHVzaChhKTtyZXR1cm4gdGhpc319O2gmJnEoaCk7cmV0dXJuIHV9KX19KX1mdW5jdGlvbiBQZChiKXt6KGIse2Jvb3RzdHJhcDpzYyxjb3B5OkVhLGV4dGVuZDp6LGVxdWFsczpmYSxlbGVtZW50OkIsZm9yRWFjaDpzLGluamVjdG9yOk9iLG5vb3A6QyxiaW5kOm5jLHRvSnNvbjokYSwNCi1mcm9tSnNvbjpvYyxpZGVudGl0eTpvYSxpc1VuZGVmaW5lZDpELGlzRGVmaW5lZDp5LGlzU3RyaW5nOkYsaXNGdW5jdGlvbjpHLGlzT2JqZWN0OkgsaXNOdW1iZXI6Vixpc0VsZW1lbnQ6bWMsaXNBcnJheTp4LHZlcnNpb246UWQsaXNEYXRlOnBhLGxvd2VyY2FzZTpRLHVwcGVyY2FzZTp1YixjYWxsYmFja3M6e2NvdW50ZXI6MH0sZ2V0VGVzdGFiaWxpdHk6TGQsJCRtaW5FcnI6VCwkJGNzcDphYixyZWxvYWRXaXRoRGVidWdJbmZvOktkfSk7YmI9T2QoTSk7dHJ5e2JiKCJuZ0xvY2FsZSIpfWNhdGNoKGEpe2JiKCJuZ0xvY2FsZSIsW10pLnByb3ZpZGVyKCIkbG9jYWxlIixSZCl9YmIoIm5nIixbIm5nTG9jYWxlIl0sWyIkcHJvdmlkZSIsZnVuY3Rpb24oYSl7YS5wcm92aWRlcih7JCRzYW5pdGl6ZVVyaTpTZH0pO2EucHJvdmlkZXIoIiRjb21waWxlIix3YykuZGlyZWN0aXZlKHthOlRkLGlucHV0OnhjLHRleHRhcmVhOnhjLGZvcm06VWQsc2NyaXB0OlZkLHNlbGVjdDpXZCxzdHlsZTpYZCwNCi1vcHRpb246WWQsbmdCaW5kOlpkLG5nQmluZEh0bWw6JGQsbmdCaW5kVGVtcGxhdGU6YWUsbmdDbGFzczpiZSxuZ0NsYXNzRXZlbjpjZSxuZ0NsYXNzT2RkOmRlLG5nQ2xvYWs6ZWUsbmdDb250cm9sbGVyOmZlLG5nRm9ybTpnZSxuZ0hpZGU6aGUsbmdJZjppZSxuZ0luY2x1ZGU6amUsbmdJbml0OmtlLG5nTm9uQmluZGFibGU6bGUsbmdQbHVyYWxpemU6bWUsbmdSZXBlYXQ6bmUsbmdTaG93Om9lLG5nU3R5bGU6cGUsbmdTd2l0Y2g6cWUsbmdTd2l0Y2hXaGVuOnJlLG5nU3dpdGNoRGVmYXVsdDpzZSxuZ09wdGlvbnM6dGUsbmdUcmFuc2NsdWRlOnVlLG5nTW9kZWw6dmUsbmdMaXN0OndlLG5nQ2hhbmdlOnhlLHBhdHRlcm46eWMsbmdQYXR0ZXJuOnljLHJlcXVpcmVkOnpjLG5nUmVxdWlyZWQ6emMsbWlubGVuZ3RoOkFjLG5nTWlubGVuZ3RoOkFjLG1heGxlbmd0aDpCYyxuZ01heGxlbmd0aDpCYyxuZ1ZhbHVlOnllLG5nTW9kZWxPcHRpb25zOnplfSkuZGlyZWN0aXZlKHtuZ0luY2x1ZGU6QWV9KS5kaXJlY3RpdmUodmIpLmRpcmVjdGl2ZShDYyk7DQotYS5wcm92aWRlcih7JGFuY2hvclNjcm9sbDpCZSwkYW5pbWF0ZTpDZSwkYnJvd3NlcjpEZSwkY2FjaGVGYWN0b3J5OkVlLCRjb250cm9sbGVyOkZlLCRkb2N1bWVudDpHZSwkZXhjZXB0aW9uSGFuZGxlcjpIZSwkZmlsdGVyOkRjLCRpbnRlcnBvbGF0ZTpJZSwkaW50ZXJ2YWw6SmUsJGh0dHA6S2UsJGh0dHBCYWNrZW5kOkxlLCRsb2NhdGlvbjpNZSwkbG9nOk5lLCRwYXJzZTpPZSwkcm9vdFNjb3BlOlBlLCRxOlFlLCQkcTpSZSwkc2NlOlNlLCRzY2VEZWxlZ2F0ZTpUZSwkc25pZmZlcjpVZSwkdGVtcGxhdGVDYWNoZTpWZSwkdGVtcGxhdGVSZXF1ZXN0OldlLCQkdGVzdGFiaWxpdHk6WGUsJHRpbWVvdXQ6WWUsJHdpbmRvdzpaZSwkJHJBRjokZSwkJGFzeW5jQ2FsbGJhY2s6YWYsJCRqcUxpdGU6YmZ9KX1dKX1mdW5jdGlvbiBjYihiKXtyZXR1cm4gYi5yZXBsYWNlKGNmLGZ1bmN0aW9uKGEsYixkLGUpe3JldHVybiBlP2QudG9VcHBlckNhc2UoKTpkfSkucmVwbGFjZShkZiwiTW96JDEiKX0NCi1mdW5jdGlvbiBFYyhiKXtiPWIubm9kZVR5cGU7cmV0dXJuIGI9PT1uYXx8IWJ8fDk9PT1ifWZ1bmN0aW9uIEZjKGIsYSl7dmFyIGMsZCxlPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGY9W107aWYoUmIudGVzdChiKSl7Yz1jfHxlLmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgiZGl2IikpO2Q9KGVmLmV4ZWMoYil8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCk7ZD1pYVtkXXx8aWEuX2RlZmF1bHQ7Yy5pbm5lckhUTUw9ZFsxXStiLnJlcGxhY2UoZmYsIjwkMT48LyQyPiIpK2RbMl07Zm9yKGQ9ZFswXTtkLS07KWM9Yy5sYXN0Q2hpbGQ7Zj1ZYShmLGMuY2hpbGROb2Rlcyk7Yz1lLmZpcnN0Q2hpbGQ7Yy50ZXh0Q29udGVudD0iIn1lbHNlIGYucHVzaChhLmNyZWF0ZVRleHROb2RlKGIpKTtlLnRleHRDb250ZW50PSIiO2UuaW5uZXJIVE1MPSIiO3MoZixmdW5jdGlvbihhKXtlLmFwcGVuZENoaWxkKGEpfSk7cmV0dXJuIGV9ZnVuY3Rpb24gUihiKXtpZihiIGluc3RhbmNlb2YNCi1SKXJldHVybiBiO3ZhciBhO0YoYikmJihiPVUoYiksYT0hMCk7aWYoISh0aGlzIGluc3RhbmNlb2YgUikpe2lmKGEmJiI8IiE9Yi5jaGFyQXQoMCkpdGhyb3cgU2IoIm5vc2VsIik7cmV0dXJuIG5ldyBSKGIpfWlmKGEpe2E9WTt2YXIgYztiPShjPWdmLmV4ZWMoYikpP1thLmNyZWF0ZUVsZW1lbnQoY1sxXSldOihjPUZjKGIsYSkpP2MuY2hpbGROb2RlczpbXX1HYyh0aGlzLGIpfWZ1bmN0aW9uIFRiKGIpe3JldHVybiBiLmNsb25lTm9kZSghMCl9ZnVuY3Rpb24gd2IoYixhKXthfHx4YihiKTtpZihiLnF1ZXJ5U2VsZWN0b3JBbGwpZm9yKHZhciBjPWIucXVlcnlTZWxlY3RvckFsbCgiKiIpLGQ9MCxlPWMubGVuZ3RoO2Q8ZTtkKyspeGIoY1tkXSl9ZnVuY3Rpb24gSGMoYixhLGMsZCl7aWYoeShkKSl0aHJvdyBTYigib2ZmYXJncyIpO3ZhciBlPShkPXliKGIpKSYmZC5ldmVudHMsZj1kJiZkLmhhbmRsZTtpZihmKWlmKGEpcyhhLnNwbGl0KCIgIiksZnVuY3Rpb24oYSl7aWYoeShjKSl7dmFyIGQ9DQotZVthXTtYYShkfHxbXSxjKTtpZihkJiYwPGQubGVuZ3RoKXJldHVybn1iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxmLCExKTtkZWxldGUgZVthXX0pO2Vsc2UgZm9yKGEgaW4gZSkiJGRlc3Ryb3kiIT09YSYmYi5yZW1vdmVFdmVudExpc3RlbmVyKGEsZiwhMSksZGVsZXRlIGVbYV19ZnVuY3Rpb24geGIoYixhKXt2YXIgYz1iLm5nMzM5LGQ9YyYmemJbY107ZCYmKGE/ZGVsZXRlIGQuZGF0YVthXTooZC5oYW5kbGUmJihkLmV2ZW50cy4kZGVzdHJveSYmZC5oYW5kbGUoe30sIiRkZXN0cm95IiksSGMoYikpLGRlbGV0ZSB6YltjXSxiLm5nMzM5PXQpKX1mdW5jdGlvbiB5YihiLGEpe3ZhciBjPWIubmczMzksYz1jJiZ6YltjXTthJiYhYyYmKGIubmczMzk9Yz0rK2hmLGM9emJbY109e2V2ZW50czp7fSxkYXRhOnt9LGhhbmRsZTp0fSk7cmV0dXJuIGN9ZnVuY3Rpb24gVWIoYixhLGMpe2lmKEVjKGIpKXt2YXIgZD15KGMpLGU9IWQmJmEmJiFIKGEpLGY9IWE7Yj0oYj15YihiLCFlKSkmJmIuZGF0YTsNCi1pZihkKWJbYV09YztlbHNle2lmKGYpcmV0dXJuIGI7aWYoZSlyZXR1cm4gYiYmYlthXTt6KGIsYSl9fX1mdW5jdGlvbiBBYihiLGEpe3JldHVybiBiLmdldEF0dHJpYnV0ZT8tMTwoIiAiKyhiLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpKyIgIikucmVwbGFjZSgvW1xuXHRdL2csIiAiKS5pbmRleE9mKCIgIithKyIgIik6ITF9ZnVuY3Rpb24gQmIoYixhKXthJiZiLnNldEF0dHJpYnV0ZSYmcyhhLnNwbGl0KCIgIiksZnVuY3Rpb24oYSl7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIixVKCgiICIrKGIuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiKS5yZXBsYWNlKC9bXG5cdF0vZywiICIpLnJlcGxhY2UoIiAiK1UoYSkrIiAiLCIgIikpKX0pfWZ1bmN0aW9uIENiKGIsYSl7aWYoYSYmYi5zZXRBdHRyaWJ1dGUpe3ZhciBjPSgiICIrKGIuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiKS5yZXBsYWNlKC9bXG5cdF0vZywiICIpO3MoYS5zcGxpdCgiICIpLGZ1bmN0aW9uKGEpe2E9DQotVShhKTstMT09PWMuaW5kZXhPZigiICIrYSsiICIpJiYoYys9YSsiICIpfSk7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIixVKGMpKX19ZnVuY3Rpb24gR2MoYixhKXtpZihhKWlmKGEubm9kZVR5cGUpYltiLmxlbmd0aCsrXT1hO2Vsc2V7dmFyIGM9YS5sZW5ndGg7aWYoIm51bWJlciI9PT10eXBlb2YgYyYmYS53aW5kb3chPT1hKXtpZihjKWZvcih2YXIgZD0wO2Q8YztkKyspYltiLmxlbmd0aCsrXT1hW2RdfWVsc2UgYltiLmxlbmd0aCsrXT1hfX1mdW5jdGlvbiBJYyhiLGEpe3JldHVybiBEYihiLCIkIisoYXx8Im5nQ29udHJvbGxlciIpKyJDb250cm9sbGVyIil9ZnVuY3Rpb24gRGIoYixhLGMpezk9PWIubm9kZVR5cGUmJihiPWIuZG9jdW1lbnRFbGVtZW50KTtmb3IoYT14KGEpP2E6W2FdO2I7KXtmb3IodmFyIGQ9MCxlPWEubGVuZ3RoO2Q8ZTtkKyspaWYoKGM9Qi5kYXRhKGIsYVtkXSkpIT09dClyZXR1cm4gYztiPWIucGFyZW50Tm9kZXx8MTE9PT1iLm5vZGVUeXBlJiZiLmhvc3R9fQ0KLWZ1bmN0aW9uIEpjKGIpe2Zvcih3YihiLCEwKTtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX1mdW5jdGlvbiBLYyhiLGEpe2F8fHdiKGIpO3ZhciBjPWIucGFyZW50Tm9kZTtjJiZjLnJlbW92ZUNoaWxkKGIpfWZ1bmN0aW9uIGpmKGIsYSl7YT1hfHxNO2lmKCJjb21wbGV0ZSI9PT1hLmRvY3VtZW50LnJlYWR5U3RhdGUpYS5zZXRUaW1lb3V0KGIpO2Vsc2UgQihhKS5vbigibG9hZCIsYil9ZnVuY3Rpb24gTGMoYixhKXt2YXIgYz1FYlthLnRvTG93ZXJDYXNlKCldO3JldHVybiBjJiZNY1t1YShiKV0mJmN9ZnVuY3Rpb24ga2YoYixhKXt2YXIgYz1iLm5vZGVOYW1lO3JldHVybigiSU5QVVQiPT09Y3x8IlRFWFRBUkVBIj09PWMpJiZOY1thXX1mdW5jdGlvbiBsZihiLGEpe3ZhciBjPWZ1bmN0aW9uKGMsZSl7Yy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gYy5kZWZhdWx0UHJldmVudGVkfTt2YXIgZj1hW2V8fGMudHlwZV0sZz1mP2YubGVuZ3RoOg0KLTA7aWYoZyl7aWYoRChjLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCkpe3ZhciBoPWMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO2Muc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7Yy5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9ITA7Yy5zdG9wUHJvcGFnYXRpb24mJmMuc3RvcFByb3BhZ2F0aW9uKCk7aCYmaC5jYWxsKGMpfX1jLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuITA9PT1jLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZH07MTxnJiYoZj1xYShmKSk7Zm9yKHZhciBsPTA7bDxnO2wrKyljLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCl8fGZbbF0uY2FsbChiLGMpfX07Yy5lbGVtPWI7cmV0dXJuIGN9ZnVuY3Rpb24gYmYoKXt0aGlzLiRnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4geihSLHtoYXNDbGFzczpmdW5jdGlvbihiLGEpe2IuYXR0ciYmKGI9YlswXSk7cmV0dXJuIEFiKGIsYSl9LGFkZENsYXNzOmZ1bmN0aW9uKGIsDQotYSl7Yi5hdHRyJiYoYj1iWzBdKTtyZXR1cm4gQ2IoYixhKX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYixhKXtiLmF0dHImJihiPWJbMF0pO3JldHVybiBCYihiLGEpfX0pfX1mdW5jdGlvbiBOYShiLGEpe3ZhciBjPWImJmIuJCRoYXNoS2V5O2lmKGMpcmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiBjJiYoYz1iLiQkaGFzaEtleSgpKSxjO2M9dHlwZW9mIGI7cmV0dXJuIGM9ImZ1bmN0aW9uIj09Y3x8Im9iamVjdCI9PWMmJm51bGwhPT1iP2IuJCRoYXNoS2V5PWMrIjoiKyhhfHxGZCkoKTpjKyI6IitifWZ1bmN0aW9uIGRiKGIsYSl7aWYoYSl7dmFyIGM9MDt0aGlzLm5leHRVaWQ9ZnVuY3Rpb24oKXtyZXR1cm4rK2N9fXMoYix0aGlzLnB1dCx0aGlzKX1mdW5jdGlvbiBtZihiKXtyZXR1cm4oYj1iLnRvU3RyaW5nKCkucmVwbGFjZShPYywiIikubWF0Y2goUGMpKT8iZnVuY3Rpb24oIisoYlsxXXx8IiIpLnJlcGxhY2UoL1tcc1xyXG5dKy8sIiAiKSsiKSI6ImZuIn1mdW5jdGlvbiBWYihiLA0KLWEsYyl7dmFyIGQ7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBiKXtpZighKGQ9Yi4kaW5qZWN0KSl7ZD1bXTtpZihiLmxlbmd0aCl7aWYoYSl0aHJvdyBGKGMpJiZjfHwoYz1iLm5hbWV8fG1mKGIpKSxHYSgic3RyaWN0ZGkiLGMpO2E9Yi50b1N0cmluZygpLnJlcGxhY2UoT2MsIiIpO2E9YS5tYXRjaChQYyk7cyhhWzFdLnNwbGl0KG5mKSxmdW5jdGlvbihhKXthLnJlcGxhY2Uob2YsZnVuY3Rpb24oYSxiLGMpe2QucHVzaChjKX0pfSl9Yi4kaW5qZWN0PWR9fWVsc2UgeChiKT8oYT1iLmxlbmd0aC0xLHNiKGJbYV0sImZuIiksZD1iLnNsaWNlKDAsYSkpOnNiKGIsImZuIiwhMCk7cmV0dXJuIGR9ZnVuY3Rpb24gT2IoYixhKXtmdW5jdGlvbiBjKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2lmKEgoYikpcyhiLGtjKGEpKTtlbHNlIHJldHVybiBhKGIsYyl9fWZ1bmN0aW9uIGQoYSxiKXtNYShhLCJzZXJ2aWNlIik7aWYoRyhiKXx8eChiKSliPXEuaW5zdGFudGlhdGUoYik7aWYoIWIuJGdldCl0aHJvdyBHYSgicGdldCIsDQotYSk7cmV0dXJuIHBbYSsiUHJvdmlkZXIiXT1ifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz1yLmludm9rZShiLHRoaXMpO2lmKEQoYykpdGhyb3cgR2EoInVuZGVmIixhKTtyZXR1cm4gY319ZnVuY3Rpb24gZihhLGIsYyl7cmV0dXJuIGQoYSx7JGdldDohMSE9PWM/ZShhLGIpOmJ9KX1mdW5jdGlvbiBnKGEpe3ZhciBiPVtdLGM7cyhhLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGIsYztiPTA7Zm9yKGM9YS5sZW5ndGg7YjxjO2IrKyl7dmFyIGU9YVtiXSxmPXEuZ2V0KGVbMF0pO2ZbZVsxXV0uYXBwbHkoZixlWzJdKX19aWYoIW0uZ2V0KGEpKXttLnB1dChhLCEwKTt0cnl7RihhKT8oYz1iYihhKSxiPWIuY29uY2F0KGcoYy5yZXF1aXJlcykpLmNvbmNhdChjLl9ydW5CbG9ja3MpLGQoYy5faW52b2tlUXVldWUpLGQoYy5fY29uZmlnQmxvY2tzKSk6RyhhKT9iLnB1c2gocS5pbnZva2UoYSkpOngoYSk/Yi5wdXNoKHEuaW52b2tlKGEpKTpzYihhLCJtb2R1bGUiKX1jYXRjaChlKXt0aHJvdyB4KGEpJiYNCi0oYT1hW2EubGVuZ3RoLTFdKSxlLm1lc3NhZ2UmJmUuc3RhY2smJi0xPT1lLnN0YWNrLmluZGV4T2YoZS5tZXNzYWdlKSYmKGU9ZS5tZXNzYWdlKyJcbiIrZS5zdGFjayksR2EoIm1vZHVsZXJyIixhLGUuc3RhY2t8fGUubWVzc2FnZXx8ZSk7fX19KTtyZXR1cm4gYn1mdW5jdGlvbiBoKGIsYyl7ZnVuY3Rpb24gZChhLGUpe2lmKGIuaGFzT3duUHJvcGVydHkoYSkpe2lmKGJbYV09PT1sKXRocm93IEdhKCJjZGVwIixhKyIgPC0gIitrLmpvaW4oIiA8LSAiKSk7cmV0dXJuIGJbYV19dHJ5e3JldHVybiBrLnVuc2hpZnQoYSksYlthXT1sLGJbYV09YyhhLGUpfWNhdGNoKGYpe3Rocm93IGJbYV09PT1sJiZkZWxldGUgYlthXSxmO31maW5hbGx5e2suc2hpZnQoKX19ZnVuY3Rpb24gZShiLGMsZixnKXsic3RyaW5nIj09PXR5cGVvZiBmJiYoZz1mLGY9bnVsbCk7dmFyIGg9W10saz1WYihiLGEsZyksbCxxLHA7cT0wO2ZvcihsPWsubGVuZ3RoO3E8bDtxKyspe3A9a1txXTtpZigic3RyaW5nIiE9PQ0KLXR5cGVvZiBwKXRocm93IEdhKCJpdGtuIixwKTtoLnB1c2goZiYmZi5oYXNPd25Qcm9wZXJ0eShwKT9mW3BdOmQocCxnKSl9eChiKSYmKGI9YltsXSk7cmV0dXJuIGIuYXBwbHkoYyxoKX1yZXR1cm57aW52b2tlOmUsaW5zdGFudGlhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPU9iamVjdC5jcmVhdGUoKHgoYSk/YVthLmxlbmd0aC0xXTphKS5wcm90b3R5cGUpO2E9ZShhLGQsYixjKTtyZXR1cm4gSChhKXx8RyhhKT9hOmR9LGdldDpkLGFubm90YXRlOlZiLGhhczpmdW5jdGlvbihhKXtyZXR1cm4gcC5oYXNPd25Qcm9wZXJ0eShhKyJQcm92aWRlciIpfHxiLmhhc093blByb3BlcnR5KGEpfX19YT0hMD09PWE7dmFyIGw9e30saz1bXSxtPW5ldyBkYihbXSwhMCkscD17JHByb3ZpZGU6e3Byb3ZpZGVyOmMoZCksZmFjdG9yeTpjKGYpLHNlcnZpY2U6YyhmdW5jdGlvbihhLGIpe3JldHVybiBmKGEsWyIkaW5qZWN0b3IiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmluc3RhbnRpYXRlKGIpfV0pfSksDQotdmFsdWU6YyhmdW5jdGlvbihhLGIpe3JldHVybiBmKGEsZGEoYiksITEpfSksY29uc3RhbnQ6YyhmdW5jdGlvbihhLGIpe01hKGEsImNvbnN0YW50Iik7cFthXT1iO3VbYV09Yn0pLGRlY29yYXRvcjpmdW5jdGlvbihhLGIpe3ZhciBjPXEuZ2V0KGErIlByb3ZpZGVyIiksZD1jLiRnZXQ7Yy4kZ2V0PWZ1bmN0aW9uKCl7dmFyIGE9ci5pbnZva2UoZCxjKTtyZXR1cm4gci5pbnZva2UoYixudWxsLHskZGVsZWdhdGU6YX0pfX19fSxxPXAuJGluamVjdG9yPWgocCxmdW5jdGlvbihhLGIpe2dhLmlzU3RyaW5nKGIpJiZrLnB1c2goYik7dGhyb3cgR2EoInVucHIiLGsuam9pbigiIDwtICIpKTt9KSx1PXt9LHI9dS4kaW5qZWN0b3I9aCh1LGZ1bmN0aW9uKGEsYil7dmFyIGM9cS5nZXQoYSsiUHJvdmlkZXIiLGIpO3JldHVybiByLmludm9rZShjLiRnZXQsYyx0LGEpfSk7cyhnKGIpLGZ1bmN0aW9uKGEpe3IuaW52b2tlKGF8fEMpfSk7cmV0dXJuIHJ9ZnVuY3Rpb24gQmUoKXt2YXIgYj0hMDt0aGlzLmRpc2FibGVBdXRvU2Nyb2xsaW5nPQ0KLWZ1bmN0aW9uKCl7Yj0hMX07dGhpcy4kZ2V0PVsiJHdpbmRvdyIsIiRsb2NhdGlvbiIsIiRyb290U2NvcGUiLGZ1bmN0aW9uKGEsYyxkKXtmdW5jdGlvbiBlKGEpe3ZhciBiPW51bGw7QXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbChhLGZ1bmN0aW9uKGEpe2lmKCJhIj09PXVhKGEpKXJldHVybiBiPWEsITB9KTtyZXR1cm4gYn1mdW5jdGlvbiBmKGIpe2lmKGIpe2Iuc2Nyb2xsSW50b1ZpZXcoKTt2YXIgYztjPWcueU9mZnNldDtHKGMpP2M9YygpOm1jKGMpPyhjPWNbMF0sYz0iZml4ZWQiIT09YS5nZXRDb21wdXRlZFN0eWxlKGMpLnBvc2l0aW9uPzA6Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20pOlYoYyl8fChjPTApO2MmJihiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLGEuc2Nyb2xsQnkoMCxiLWMpKX1lbHNlIGEuc2Nyb2xsVG8oMCwwKX1mdW5jdGlvbiBnKCl7dmFyIGE9Yy5oYXNoKCksYjthPyhiPWguZ2V0RWxlbWVudEJ5SWQoYSkpP2YoYik6KGI9ZShoLmdldEVsZW1lbnRzQnlOYW1lKGEpKSk/DQotZihiKToidG9wIj09PWEmJmYobnVsbCk6ZihudWxsKX12YXIgaD1hLmRvY3VtZW50O2ImJmQuJHdhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIGMuaGFzaCgpfSxmdW5jdGlvbihhLGIpe2E9PT1iJiYiIj09PWF8fGpmKGZ1bmN0aW9uKCl7ZC4kZXZhbEFzeW5jKGcpfSl9KTtyZXR1cm4gZ31dfWZ1bmN0aW9uIGFmKCl7dGhpcy4kZ2V0PVsiJCRyQUYiLCIkdGltZW91dCIsZnVuY3Rpb24oYixhKXtyZXR1cm4gYi5zdXBwb3J0ZWQ/ZnVuY3Rpb24oYSl7cmV0dXJuIGIoYSl9OmZ1bmN0aW9uKGIpe3JldHVybiBhKGIsMCwhMSl9fV19ZnVuY3Rpb24gcGYoYixhLGMsZCl7ZnVuY3Rpb24gZShhKXt0cnl7YS5hcHBseShudWxsLFphLmNhbGwoYXJndW1lbnRzLDEpKX1maW5hbGx5e2lmKHYtLSwwPT09dilmb3IoO3cubGVuZ3RoOyl0cnl7dy5wb3AoKSgpfWNhdGNoKGIpe2MuZXJyb3IoYil9fX1mdW5jdGlvbiBmKGEsYil7KGZ1bmN0aW9uIE4oKXtzKEwsZnVuY3Rpb24oYSl7YSgpfSk7Sj1iKE4sDQotYSl9KSgpfWZ1bmN0aW9uIGcoKXtoKCk7bCgpfWZ1bmN0aW9uIGgoKXtBPWIuaGlzdG9yeS5zdGF0ZTtBPUQoQSk/bnVsbDpBO2ZhKEEsSSkmJihBPUkpO0k9QX1mdW5jdGlvbiBsKCl7aWYoRSE9PW0udXJsKCl8fFAhPT1BKUU9bS51cmwoKSxQPUEscyhXLGZ1bmN0aW9uKGEpe2EobS51cmwoKSxBKX0pfWZ1bmN0aW9uIGsoYSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYSl9Y2F0Y2goYil7cmV0dXJuIGF9fXZhciBtPXRoaXMscD1hWzBdLHE9Yi5sb2NhdGlvbix1PWIuaGlzdG9yeSxyPWIuc2V0VGltZW91dCxPPWIuY2xlYXJUaW1lb3V0LG49e307bS5pc01vY2s9ITE7dmFyIHY9MCx3PVtdO20uJCRjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdD1lO20uJCRpbmNPdXRzdGFuZGluZ1JlcXVlc3RDb3VudD1mdW5jdGlvbigpe3YrK307bS5ub3RpZnlXaGVuTm9PdXRzdGFuZGluZ1JlcXVlc3RzPWZ1bmN0aW9uKGEpe3MoTCxmdW5jdGlvbihhKXthKCl9KTswPT09dj9hKCk6DQotdy5wdXNoKGEpfTt2YXIgTD1bXSxKO20uYWRkUG9sbEZuPWZ1bmN0aW9uKGEpe0QoSikmJmYoMTAwLHIpO0wucHVzaChhKTtyZXR1cm4gYX07dmFyIEEsUCxFPXEuaHJlZixTPWEuZmluZCgiYmFzZSIpLFg9bnVsbDtoKCk7UD1BO20udXJsPWZ1bmN0aW9uKGEsYyxlKXtEKGUpJiYoZT1udWxsKTtxIT09Yi5sb2NhdGlvbiYmKHE9Yi5sb2NhdGlvbik7dSE9PWIuaGlzdG9yeSYmKHU9Yi5oaXN0b3J5KTtpZihhKXt2YXIgZj1QPT09ZTtpZihFPT09YSYmKCFkLmhpc3Rvcnl8fGYpKXJldHVybiBtO3ZhciBnPUUmJkhhKEUpPT09SGEoYSk7RT1hO1A9ZTshZC5oaXN0b3J5fHxnJiZmPyhnfHwoWD1hKSxjP3EucmVwbGFjZShhKTpnPyhjPXEsZT1hLmluZGV4T2YoIiMiKSxhPS0xPT09ZT8iIjphLnN1YnN0cihlKzEpLGMuaGFzaD1hKTpxLmhyZWY9YSk6KHVbYz8icmVwbGFjZVN0YXRlIjoicHVzaFN0YXRlIl0oZSwiIixhKSxoKCksUD1BKTtyZXR1cm4gbX1yZXR1cm4gWHx8cS5ocmVmLnJlcGxhY2UoLyUyNy9nLA0KLSInIil9O20uc3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gQX07dmFyIFc9W10sd2E9ITEsST1udWxsO20ub25VcmxDaGFuZ2U9ZnVuY3Rpb24oYSl7aWYoIXdhKXtpZihkLmhpc3RvcnkpQihiKS5vbigicG9wc3RhdGUiLGcpO0IoYikub24oImhhc2hjaGFuZ2UiLGcpO3dhPSEwfVcucHVzaChhKTtyZXR1cm4gYX07bS4kJGNoZWNrVXJsQ2hhbmdlPWw7bS5iYXNlSHJlZj1mdW5jdGlvbigpe3ZhciBhPVMuYXR0cigiaHJlZiIpO3JldHVybiBhP2EucmVwbGFjZSgvXihodHRwcz9cOik/XC9cL1teXC9dKi8sIiIpOiIifTt2YXIgZWE9e30seT0iIixjYT1tLmJhc2VIcmVmKCk7bS5jb29raWVzPWZ1bmN0aW9uKGEsYil7dmFyIGQsZSxmLGc7aWYoYSliPT09dD9wLmNvb2tpZT1lbmNvZGVVUklDb21wb25lbnQoYSkrIj07cGF0aD0iK2NhKyI7ZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIEdNVCI6RihiKSYmKGQ9KHAuY29va2llPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKw0KLSI7cGF0aD0iK2NhKS5sZW5ndGgrMSw0MDk2PGQmJmMud2FybigiQ29va2llICciK2ErIicgcG9zc2libHkgbm90IHNldCBvciBvdmVyZmxvd2VkIGJlY2F1c2UgaXQgd2FzIHRvbyBsYXJnZSAoIitkKyIgPiA0MDk2IGJ5dGVzKSEiKSk7ZWxzZXtpZihwLmNvb2tpZSE9PXkpZm9yKHk9cC5jb29raWUsZD15LnNwbGl0KCI7ICIpLGVhPXt9LGY9MDtmPGQubGVuZ3RoO2YrKyllPWRbZl0sZz1lLmluZGV4T2YoIj0iKSwwPGcmJihhPWsoZS5zdWJzdHJpbmcoMCxnKSksZWFbYV09PT10JiYoZWFbYV09ayhlLnN1YnN0cmluZyhnKzEpKSkpO3JldHVybiBlYX19O20uZGVmZXI9ZnVuY3Rpb24oYSxiKXt2YXIgYzt2Kys7Yz1yKGZ1bmN0aW9uKCl7ZGVsZXRlIG5bY107ZShhKX0sYnx8MCk7bltjXT0hMDtyZXR1cm4gY307bS5kZWZlci5jYW5jZWw9ZnVuY3Rpb24oYSl7cmV0dXJuIG5bYV0/KGRlbGV0ZSBuW2FdLE8oYSksZShDKSwhMCk6ITF9fWZ1bmN0aW9uIERlKCl7dGhpcy4kZ2V0PVsiJHdpbmRvdyIsDQotIiRsb2ciLCIkc25pZmZlciIsIiRkb2N1bWVudCIsZnVuY3Rpb24oYixhLGMsZCl7cmV0dXJuIG5ldyBwZihiLGQsYSxjKX1dfWZ1bmN0aW9uIEVlKCl7dGhpcy4kZ2V0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGQpe2Z1bmN0aW9uIGUoYSl7YSE9cCYmKHE/cT09YSYmKHE9YS5uKTpxPWEsZihhLm4sYS5wKSxmKGEscCkscD1hLHAubj1udWxsKX1mdW5jdGlvbiBmKGEsYil7YSE9YiYmKGEmJihhLnA9YiksYiYmKGIubj1hKSl9aWYoYiBpbiBhKXRocm93IFQoIiRjYWNoZUZhY3RvcnkiKSgiaWlkIixiKTt2YXIgZz0wLGg9eih7fSxkLHtpZDpifSksbD17fSxrPWQmJmQuY2FwYWNpdHl8fE51bWJlci5NQVhfVkFMVUUsbT17fSxwPW51bGwscT1udWxsO3JldHVybiBhW2JdPXtwdXQ6ZnVuY3Rpb24oYSxiKXtpZihrPE51bWJlci5NQVhfVkFMVUUpe3ZhciBjPW1bYV18fChtW2FdPXtrZXk6YX0pO2UoYyl9aWYoIUQoYikpcmV0dXJuIGEgaW4gbHx8ZysrLGxbYV09YixnPmsmJnRoaXMucmVtb3ZlKHEua2V5KSwNCi1ifSxnZXQ6ZnVuY3Rpb24oYSl7aWYoazxOdW1iZXIuTUFYX1ZBTFVFKXt2YXIgYj1tW2FdO2lmKCFiKXJldHVybjtlKGIpfXJldHVybiBsW2FdfSxyZW1vdmU6ZnVuY3Rpb24oYSl7aWYoazxOdW1iZXIuTUFYX1ZBTFVFKXt2YXIgYj1tW2FdO2lmKCFiKXJldHVybjtiPT1wJiYocD1iLnApO2I9PXEmJihxPWIubik7ZihiLm4sYi5wKTtkZWxldGUgbVthXX1kZWxldGUgbFthXTtnLS19LHJlbW92ZUFsbDpmdW5jdGlvbigpe2w9e307Zz0wO209e307cD1xPW51bGx9LGRlc3Ryb3k6ZnVuY3Rpb24oKXttPWg9bD1udWxsO2RlbGV0ZSBhW2JdfSxpbmZvOmZ1bmN0aW9uKCl7cmV0dXJuIHooe30saCx7c2l6ZTpnfSl9fX12YXIgYT17fTtiLmluZm89ZnVuY3Rpb24oKXt2YXIgYj17fTtzKGEsZnVuY3Rpb24oYSxlKXtiW2VdPWEuaW5mbygpfSk7cmV0dXJuIGJ9O2IuZ2V0PWZ1bmN0aW9uKGIpe3JldHVybiBhW2JdfTtyZXR1cm4gYn19ZnVuY3Rpb24gVmUoKXt0aGlzLiRnZXQ9WyIkY2FjaGVGYWN0b3J5IiwNCi1mdW5jdGlvbihiKXtyZXR1cm4gYigidGVtcGxhdGVzIil9XX1mdW5jdGlvbiB3YyhiLGEpe2Z1bmN0aW9uIGMoYSxiKXt2YXIgYz0vXlxzKihbQCZdfD0oXCo/KSkoXD8/KVxzKihcdyopXHMqJC8sZD17fTtzKGEsZnVuY3Rpb24oYSxlKXt2YXIgZj1hLm1hdGNoKGMpO2lmKCFmKXRocm93IGphKCJpc2NwIixiLGUsYSk7ZFtlXT17bW9kZTpmWzFdWzBdLGNvbGxlY3Rpb246IioiPT09ZlsyXSxvcHRpb25hbDoiPyI9PT1mWzNdLGF0dHJOYW1lOmZbNF18fGV9fSk7cmV0dXJuIGR9dmFyIGQ9e30sZT0vXlxzKmRpcmVjdGl2ZVw6XHMqKFtcd1wtXSspXHMrKC4qKSQvLGY9LygoW1x3XC1dKykoPzpcOihbXjtdKykpPzs/KS8sZz1HZCgibmdTcmMsbmdTcmNzZXQsc3JjLHNyY3NldCIpLGg9L14oPzooXF5cXj8pPyhcPyk/KFxeXF4/KT8pPy8sbD0vXihvblthLXpdK3xmb3JtYWN0aW9uKSQvO3RoaXMuZGlyZWN0aXZlPWZ1bmN0aW9uIHAoYSxlKXtNYShhLCJkaXJlY3RpdmUiKTtGKGEpPyhRYihlLA0KLSJkaXJlY3RpdmVGYWN0b3J5IiksZC5oYXNPd25Qcm9wZXJ0eShhKXx8KGRbYV09W10sYi5mYWN0b3J5KGErIkRpcmVjdGl2ZSIsWyIkaW5qZWN0b3IiLCIkZXhjZXB0aW9uSGFuZGxlciIsZnVuY3Rpb24oYixlKXt2YXIgZj1bXTtzKGRbYV0sZnVuY3Rpb24oZCxnKXt0cnl7dmFyIGg9Yi5pbnZva2UoZCk7RyhoKT9oPXtjb21waWxlOmRhKGgpfTohaC5jb21waWxlJiZoLmxpbmsmJihoLmNvbXBpbGU9ZGEoaC5saW5rKSk7aC5wcmlvcml0eT1oLnByaW9yaXR5fHwwO2guaW5kZXg9ZztoLm5hbWU9aC5uYW1lfHxhO2gucmVxdWlyZT1oLnJlcXVpcmV8fGguY29udHJvbGxlciYmaC5uYW1lO2gucmVzdHJpY3Q9aC5yZXN0cmljdHx8IkVBIjtIKGguc2NvcGUpJiYoaC4kJGlzb2xhdGVCaW5kaW5ncz1jKGguc2NvcGUsaC5uYW1lKSk7Zi5wdXNoKGgpfWNhdGNoKGwpe2UobCl9fSk7cmV0dXJuIGZ9XSkpLGRbYV0ucHVzaChlKSk6cyhhLGtjKHApKTtyZXR1cm4gdGhpc307dGhpcy5hSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdD0NCi1mdW5jdGlvbihiKXtyZXR1cm4geShiKT8oYS5hSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdChiKSx0aGlzKTphLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0KCl9O3RoaXMuaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0PWZ1bmN0aW9uKGIpe3JldHVybiB5KGIpPyhhLmltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdChiKSx0aGlzKTphLmltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCgpfTt2YXIgaz0hMDt0aGlzLmRlYnVnSW5mb0VuYWJsZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk/KGs9YSx0aGlzKTprfTt0aGlzLiRnZXQ9WyIkaW5qZWN0b3IiLCIkaW50ZXJwb2xhdGUiLCIkZXhjZXB0aW9uSGFuZGxlciIsIiR0ZW1wbGF0ZVJlcXVlc3QiLCIkcGFyc2UiLCIkY29udHJvbGxlciIsIiRyb290U2NvcGUiLCIkZG9jdW1lbnQiLCIkc2NlIiwiJGFuaW1hdGUiLCIkJHNhbml0aXplVXJpIixmdW5jdGlvbihhLGIsYyxyLE8sbix2LHcsTCxKLEEpe2Z1bmN0aW9uIFAoYSxiKXt0cnl7YS5hZGRDbGFzcyhiKX1jYXRjaChjKXt9fQ0KLWZ1bmN0aW9uIEUoYSxiLGMsZCxlKXthIGluc3RhbmNlb2YgQnx8KGE9QihhKSk7cyhhLGZ1bmN0aW9uKGIsYyl7Yi5ub2RlVHlwZT09cGImJmIubm9kZVZhbHVlLm1hdGNoKC9cUysvKSYmKGFbY109QihiKS53cmFwKCI8c3Bhbj48L3NwYW4+IikucGFyZW50KClbMF0pfSk7dmFyIGY9UyhhLGIsYSxjLGQsZSk7RS4kJGFkZFNjb3BlQ2xhc3MoYSk7dmFyIGc9bnVsbDtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe1FiKGIsInNjb3BlIik7ZD1kfHx7fTt2YXIgZT1kLnBhcmVudEJvdW5kVHJhbnNjbHVkZUZuLGg9ZC50cmFuc2NsdWRlQ29udHJvbGxlcnM7ZD1kLmZ1dHVyZVBhcmVudEVsZW1lbnQ7ZSYmZS4kJGJvdW5kVHJhbnNjbHVkZSYmKGU9ZS4kJGJvdW5kVHJhbnNjbHVkZSk7Z3x8KGc9KGQ9ZCYmZFswXSk/ImZvcmVpZ25vYmplY3QiIT09dWEoZCkmJmQudG9TdHJpbmcoKS5tYXRjaCgvU1ZHLyk/InN2ZyI6Imh0bWwiOiJodG1sIik7ZD0iaHRtbCIhPT1nP0IoV2IoZyxCKCI8ZGl2PiIpLmFwcGVuZChhKS5odG1sKCkpKToNCi1jP0xhLmNsb25lLmNhbGwoYSk6YTtpZihoKWZvcih2YXIgbCBpbiBoKWQuZGF0YSgiJCIrbCsiQ29udHJvbGxlciIsaFtsXS5pbnN0YW5jZSk7RS4kJGFkZFNjb3BlSW5mbyhkLGIpO2MmJmMoZCxiKTtmJiZmKGIsZCxkLGUpO3JldHVybiBkfX1mdW5jdGlvbiBTKGEsYixjLGQsZSxmKXtmdW5jdGlvbiBnKGEsYyxkLGUpe3ZhciBmLGwsayxxLHAsbix3O2lmKHIpZm9yKHc9QXJyYXkoYy5sZW5ndGgpLHE9MDtxPGgubGVuZ3RoO3ErPTMpZj1oW3FdLHdbZl09Y1tmXTtlbHNlIHc9YztxPTA7Zm9yKHA9aC5sZW5ndGg7cTxwOylsPXdbaFtxKytdXSxjPWhbcSsrXSxmPWhbcSsrXSxjPyhjLnNjb3BlPyhrPWEuJG5ldygpLEUuJCRhZGRTY29wZUluZm8oQihsKSxrKSk6az1hLG49Yy50cmFuc2NsdWRlT25UaGlzRWxlbWVudD9YKGEsYy50cmFuc2NsdWRlLGUsYy5lbGVtZW50VHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQpOiFjLnRlbXBsYXRlT25UaGlzRWxlbWVudCYmZT9lOiFlJiZiP1goYSwNCi1iKTpudWxsLGMoZixrLGwsZCxuKSk6ZiYmZihhLGwuY2hpbGROb2Rlcyx0LGUpfWZvcih2YXIgaD1bXSxsLGsscSxwLHIsbj0wO248YS5sZW5ndGg7bisrKXtsPW5ldyBYYjtrPVcoYVtuXSxbXSxsLDA9PT1uP2Q6dCxlKTsoZj1rLmxlbmd0aD9lYShrLGFbbl0sbCxiLGMsbnVsbCxbXSxbXSxmKTpudWxsKSYmZi5zY29wZSYmRS4kJGFkZFNjb3BlQ2xhc3MobC4kJGVsZW1lbnQpO2w9ZiYmZi50ZXJtaW5hbHx8IShxPWFbbl0uY2hpbGROb2Rlcyl8fCFxLmxlbmd0aD9udWxsOlMocSxmPyhmLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50fHwhZi50ZW1wbGF0ZU9uVGhpc0VsZW1lbnQpJiZmLnRyYW5zY2x1ZGU6Yik7aWYoZnx8bCloLnB1c2gobixmLGwpLHA9ITAscj1yfHxmO2Y9bnVsbH1yZXR1cm4gcD9nOm51bGx9ZnVuY3Rpb24gWChhLGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oZCxlLGYsZyxoKXtkfHwoZD1hLiRuZXcoITEsaCksZC4kJHRyYW5zY2x1ZGVkPSEwKTtyZXR1cm4gYihkLGUsDQote3BhcmVudEJvdW5kVHJhbnNjbHVkZUZuOmMsdHJhbnNjbHVkZUNvbnRyb2xsZXJzOmYsZnV0dXJlUGFyZW50RWxlbWVudDpnfSl9fWZ1bmN0aW9uIFcoYSxiLGMsZCxnKXt2YXIgaD1jLiRhdHRyLGw7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgbmE6Y2EoYix5YSh1YShhKSksIkUiLGQsZyk7Zm9yKHZhciBrLHEscCxyPWEuYXR0cmlidXRlcyxuPTAsdz1yJiZyLmxlbmd0aDtuPHc7bisrKXt2YXIgTz0hMSxMPSExO2s9cltuXTtsPWsubmFtZTtxPVUoay52YWx1ZSk7az15YShsKTtpZihwPWZiLnRlc3QoaykpbD1sLnJlcGxhY2UoUmMsIiIpLnN1YnN0cig4KS5yZXBsYWNlKC9fKC4pL2csZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfSk7dmFyIHU9ay5yZXBsYWNlKC8oU3RhcnR8RW5kKSQvLCIiKTtEKHUpJiZrPT09dSsiU3RhcnQiJiYoTz1sLEw9bC5zdWJzdHIoMCxsLmxlbmd0aC01KSsiZW5kIixsPWwuc3Vic3RyKDAsbC5sZW5ndGgtNikpO2s9eWEobC50b0xvd2VyQ2FzZSgpKTsNCi1oW2tdPWw7aWYocHx8IWMuaGFzT3duUHJvcGVydHkoaykpY1trXT1xLExjKGEsaykmJihjW2tdPSEwKTtQYShhLGIscSxrLHApO2NhKGIsaywiQSIsZCxnLE8sTCl9YT1hLmNsYXNzTmFtZTtpZihGKGEpJiYiIiE9PWEpZm9yKDtsPWYuZXhlYyhhKTspaz15YShsWzJdKSxjYShiLGssIkMiLGQsZykmJihjW2tdPVUobFszXSkpLGE9YS5zdWJzdHIobC5pbmRleCtsWzBdLmxlbmd0aCk7YnJlYWs7Y2FzZSBwYjpNKGIsYS5ub2RlVmFsdWUpO2JyZWFrO2Nhc2UgODp0cnl7aWYobD1lLmV4ZWMoYS5ub2RlVmFsdWUpKWs9eWEobFsxXSksY2EoYixrLCJNIixkLGcpJiYoY1trXT1VKGxbMl0pKX1jYXRjaCh2KXt9fWIuc29ydChOKTtyZXR1cm4gYn1mdW5jdGlvbiB3YShhLGIsYyl7dmFyIGQ9W10sZT0wO2lmKGImJmEuaGFzQXR0cmlidXRlJiZhLmhhc0F0dHJpYnV0ZShiKSl7ZG97aWYoIWEpdGhyb3cgamEoInV0ZXJkaXIiLGIsYyk7YS5ub2RlVHlwZT09bmEmJihhLmhhc0F0dHJpYnV0ZShiKSYmDQotZSsrLGEuaGFzQXR0cmlidXRlKGMpJiZlLS0pO2QucHVzaChhKTthPWEubmV4dFNpYmxpbmd9d2hpbGUoMDxlKX1lbHNlIGQucHVzaChhKTtyZXR1cm4gQihkKX1mdW5jdGlvbiBJKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCxlLGYsZyxoKXtlPXdhKGVbMF0sYixjKTtyZXR1cm4gYShkLGUsZixnLGgpfX1mdW5jdGlvbiBlYShhLGQsZSxmLGcsbCxrLHAscil7ZnVuY3Rpb24gdyhhLGIsYyxkKXtpZihhKXtjJiYoYT1JKGEsYyxkKSk7YS5yZXF1aXJlPUsucmVxdWlyZTthLmRpcmVjdGl2ZU5hbWU9ejtpZihTPT09S3x8Sy4kJGlzb2xhdGVTY29wZSlhPVooYSx7aXNvbGF0ZVNjb3BlOiEwfSk7ay5wdXNoKGEpfWlmKGIpe2MmJihiPUkoYixjLGQpKTtiLnJlcXVpcmU9Sy5yZXF1aXJlO2IuZGlyZWN0aXZlTmFtZT16O2lmKFM9PT1LfHxLLiQkaXNvbGF0ZVNjb3BlKWI9WihiLHtpc29sYXRlU2NvcGU6ITB9KTtwLnB1c2goYil9fWZ1bmN0aW9uIEwoYSxiLGMsZCl7dmFyIGUsZj0iZGF0YSIsDQotZz0hMSxsPWMsaztpZihGKGIpKXtrPWIubWF0Y2goaCk7Yj1iLnN1YnN0cmluZyhrWzBdLmxlbmd0aCk7a1szXSYmKGtbMV0/a1szXT1udWxsOmtbMV09a1szXSk7Il4iPT09a1sxXT9mPSJpbmhlcml0ZWREYXRhIjoiXl4iPT09a1sxXSYmKGY9ImluaGVyaXRlZERhdGEiLGw9Yy5wYXJlbnQoKSk7Ij8iPT09a1syXSYmKGc9ITApO2U9bnVsbDtkJiYiZGF0YSI9PT1mJiYoZT1kW2JdKSYmKGU9ZS5pbnN0YW5jZSk7ZT1lfHxsW2ZdKCIkIitiKyJDb250cm9sbGVyIik7aWYoIWUmJiFnKXRocm93IGphKCJjdHJlcSIsYixhKTtyZXR1cm4gZXx8bnVsbH14KGIpJiYoZT1bXSxzKGIsZnVuY3Rpb24oYil7ZS5wdXNoKEwoYSxiLGMsZCkpfSkpO3JldHVybiBlfWZ1bmN0aW9uIHYoYSxjLGYsZyxoKXtmdW5jdGlvbiBsKGEsYixjKXt2YXIgZDtWYShhKXx8KGM9YixiPWEsYT10KTtDJiYoZD1QKTtjfHwoYz1DP1cucGFyZW50KCk6Vyk7cmV0dXJuIGgoYSxiLGQsYyx3YSl9dmFyIHIsdyx1LEEsDQotUCxlYixXLEk7ZD09PWY/KEk9ZSxXPWUuJCRlbGVtZW50KTooVz1CKGYpLEk9bmV3IFhiKFcsZSkpO1MmJihBPWMuJG5ldyghMCkpO2gmJihlYj1sLGViLiQkYm91bmRUcmFuc2NsdWRlPWgpO0omJihYPXt9LFA9e30scyhKLGZ1bmN0aW9uKGEpe3ZhciBiPXskc2NvcGU6YT09PVN8fGEuJCRpc29sYXRlU2NvcGU/QTpjLCRlbGVtZW50OlcsJGF0dHJzOkksJHRyYW5zY2x1ZGU6ZWJ9O3U9YS5jb250cm9sbGVyOyJAIj09dSYmKHU9SVthLm5hbWVdKTtiPW4odSxiLCEwLGEuY29udHJvbGxlckFzKTtQW2EubmFtZV09YjtDfHxXLmRhdGEoIiQiK2EubmFtZSsiQ29udHJvbGxlciIsYi5pbnN0YW5jZSk7WFthLm5hbWVdPWJ9KSk7aWYoUyl7RS4kJGFkZFNjb3BlSW5mbyhXLEEsITAsIShrYSYmKGthPT09U3x8a2E9PT1TLiQkb3JpZ2luYWxEaXJlY3RpdmUpKSk7RS4kJGFkZFNjb3BlQ2xhc3MoVywhMCk7Zz1YJiZYW1MubmFtZV07dmFyIHhhPUE7ZyYmZy5pZGVudGlmaWVyJiYhMD09PVMuYmluZFRvQ29udHJvbGxlciYmDQotKHhhPWcuaW5zdGFuY2UpO3MoQS4kJGlzb2xhdGVCaW5kaW5ncz1TLiQkaXNvbGF0ZUJpbmRpbmdzLGZ1bmN0aW9uKGEsZCl7dmFyIGU9YS5hdHRyTmFtZSxmPWEub3B0aW9uYWwsZyxoLGwsaztzd2l0Y2goYS5tb2RlKXtjYXNlICJAIjpJLiRvYnNlcnZlKGUsZnVuY3Rpb24oYSl7eGFbZF09YX0pO0kuJCRvYnNlcnZlcnNbZV0uJCRzY29wZT1jO0lbZV0mJih4YVtkXT1iKElbZV0pKGMpKTticmVhaztjYXNlICI9IjppZihmJiYhSVtlXSlicmVhaztoPU8oSVtlXSk7az1oLmxpdGVyYWw/ZmE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWJ8fGEhPT1hJiZiIT09Yn07bD1oLmFzc2lnbnx8ZnVuY3Rpb24oKXtnPXhhW2RdPWgoYyk7dGhyb3cgamEoIm5vbmFzc2lnbiIsSVtlXSxTLm5hbWUpO307Zz14YVtkXT1oKGMpO2Y9ZnVuY3Rpb24oYSl7ayhhLHhhW2RdKXx8KGsoYSxnKT9sKGMsYT14YVtkXSk6eGFbZF09YSk7cmV0dXJuIGc9YX07Zi4kc3RhdGVmdWw9ITA7Zj1hLmNvbGxlY3Rpb24/DQotYy4kd2F0Y2hDb2xsZWN0aW9uKElbZV0sZik6Yy4kd2F0Y2goTyhJW2VdLGYpLG51bGwsaC5saXRlcmFsKTtBLiRvbigiJGRlc3Ryb3kiLGYpO2JyZWFrO2Nhc2UgIiYiOmg9TyhJW2VdKSx4YVtkXT1mdW5jdGlvbihhKXtyZXR1cm4gaChjLGEpfX19KX1YJiYocyhYLGZ1bmN0aW9uKGEpe2EoKX0pLFg9bnVsbCk7Zz0wO2ZvcihyPWsubGVuZ3RoO2c8cjtnKyspdz1rW2ddLCQodyx3Lmlzb2xhdGVTY29wZT9BOmMsVyxJLHcucmVxdWlyZSYmTCh3LmRpcmVjdGl2ZU5hbWUsdy5yZXF1aXJlLFcsUCksZWIpO3ZhciB3YT1jO1MmJihTLnRlbXBsYXRlfHxudWxsPT09Uy50ZW1wbGF0ZVVybCkmJih3YT1BKTthJiZhKHdhLGYuY2hpbGROb2Rlcyx0LGgpO2ZvcihnPXAubGVuZ3RoLTE7MDw9ZztnLS0pdz1wW2ddLCQodyx3Lmlzb2xhdGVTY29wZT9BOmMsVyxJLHcucmVxdWlyZSYmTCh3LmRpcmVjdGl2ZU5hbWUsdy5yZXF1aXJlLFcsUCksZWIpfXI9cnx8e307Zm9yKHZhciBBPS1OdW1iZXIuTUFYX1ZBTFVFLA0KLVAsSj1yLmNvbnRyb2xsZXJEaXJlY3RpdmVzLFgsUz1yLm5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSxrYT1yLnRlbXBsYXRlRGlyZWN0aXZlLGVhPXIubm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZSxjYT0hMSxEPSExLEM9ci5oYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSxhYT1lLiQkZWxlbWVudD1CKGQpLEsseixOLEFhPWYsUSxNPTAsUj1hLmxlbmd0aDtNPFI7TSsrKXtLPWFbTV07dmFyIFBhPUsuJCRzdGFydCxmYj1LLiQkZW5kO1BhJiYoYWE9d2EoZCxQYSxmYikpO049dDtpZihBPksucHJpb3JpdHkpYnJlYWs7aWYoTj1LLnNjb3BlKUsudGVtcGxhdGVVcmx8fChIKE4pPyhPYSgibmV3L2lzb2xhdGVkIHNjb3BlIixTfHxQLEssYWEpLFM9Syk6T2EoIm5ldy9pc29sYXRlZCBzY29wZSIsUyxLLGFhKSksUD1QfHxLO3o9Sy5uYW1lOyFLLnRlbXBsYXRlVXJsJiZLLmNvbnRyb2xsZXImJihOPUsuY29udHJvbGxlcixKPUp8fHt9LE9hKCInIit6KyInIGNvbnRyb2xsZXIiLEpbel0sDQotSyxhYSksSlt6XT1LKTtpZihOPUsudHJhbnNjbHVkZSljYT0hMCxLLiQkdGxifHwoT2EoInRyYW5zY2x1c2lvbiIsZWEsSyxhYSksZWE9SyksImVsZW1lbnQiPT1OPyhDPSEwLEE9Sy5wcmlvcml0eSxOPWFhLGFhPWUuJCRlbGVtZW50PUIoWS5jcmVhdGVDb21tZW50KCIgIit6KyI6ICIrZVt6XSsiICIpKSxkPWFhWzBdLFYoZyxaYS5jYWxsKE4sMCksZCksQWE9RShOLGYsQSxsJiZsLm5hbWUse25vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmU6ZWF9KSk6KE49QihUYihkKSkuY29udGVudHMoKSxhYS5lbXB0eSgpLEFhPUUoTixmKSk7aWYoSy50ZW1wbGF0ZSlpZihEPSEwLE9hKCJ0ZW1wbGF0ZSIsa2EsSyxhYSksa2E9SyxOPUcoSy50ZW1wbGF0ZSk/Sy50ZW1wbGF0ZShhYSxlKTpLLnRlbXBsYXRlLE49U2MoTiksSy5yZXBsYWNlKXtsPUs7Tj1SYi50ZXN0KE4pP1RjKFdiKEsudGVtcGxhdGVOYW1lc3BhY2UsVShOKSkpOltdO2Q9TlswXTtpZigxIT1OLmxlbmd0aHx8ZC5ub2RlVHlwZSE9PQ0KLW5hKXRocm93IGphKCJ0cGxydCIseiwiIik7VihnLGFhLGQpO1I9eyRhdHRyOnt9fTtOPVcoZCxbXSxSKTt2YXIgYmE9YS5zcGxpY2UoTSsxLGEubGVuZ3RoLShNKzEpKTtTJiZ5KE4pO2E9YS5jb25jYXQoTikuY29uY2F0KGJhKTtRYyhlLFIpO1I9YS5sZW5ndGh9ZWxzZSBhYS5odG1sKE4pO2lmKEsudGVtcGxhdGVVcmwpRD0hMCxPYSgidGVtcGxhdGUiLGthLEssYWEpLGthPUssSy5yZXBsYWNlJiYobD1LKSx2PVQoYS5zcGxpY2UoTSxhLmxlbmd0aC1NKSxhYSxlLGcsY2EmJkFhLGsscCx7Y29udHJvbGxlckRpcmVjdGl2ZXM6SixuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmU6Uyx0ZW1wbGF0ZURpcmVjdGl2ZTprYSxub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlOmVhfSksUj1hLmxlbmd0aDtlbHNlIGlmKEsuY29tcGlsZSl0cnl7UT1LLmNvbXBpbGUoYWEsZSxBYSksRyhRKT93KG51bGwsUSxQYSxmYik6USYmdyhRLnByZSxRLnBvc3QsUGEsZmIpfWNhdGNoKHFmKXtjKHFmLHZhKGFhKSl9Sy50ZXJtaW5hbCYmDQotKHYudGVybWluYWw9ITAsQT1NYXRoLm1heChBLEsucHJpb3JpdHkpKX12LnNjb3BlPVAmJiEwPT09UC5zY29wZTt2LnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50PWNhO3YuZWxlbWVudFRyYW5zY2x1ZGVPblRoaXNFbGVtZW50PUM7di50ZW1wbGF0ZU9uVGhpc0VsZW1lbnQ9RDt2LnRyYW5zY2x1ZGU9QWE7ci5oYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZT1DO3JldHVybiB2fWZ1bmN0aW9uIHkoYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aDtiPGM7YisrKXt2YXIgZD1iLGU7ZT16KE9iamVjdC5jcmVhdGUoYVtiXSkseyQkaXNvbGF0ZVNjb3BlOiEwfSk7YVtkXT1lfX1mdW5jdGlvbiBjYShiLGUsZixnLGgsbCxrKXtpZihlPT09aClyZXR1cm4gbnVsbDtoPW51bGw7aWYoZC5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIHE7ZT1hLmdldChlKyJEaXJlY3RpdmUiKTtmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspdHJ5e2lmKHE9ZVtyXSwoZz09PXR8fGc+cS5wcmlvcml0eSkmJi0xIT0NCi1xLnJlc3RyaWN0LmluZGV4T2YoZikpe2lmKGwpe3ZhciB3PXskJHN0YXJ0OmwsJCRlbmQ6a307cT16KE9iamVjdC5jcmVhdGUocSksdyl9Yi5wdXNoKHEpO2g9cX19Y2F0Y2goTyl7YyhPKX19cmV0dXJuIGh9ZnVuY3Rpb24gRChiKXtpZihkLmhhc093blByb3BlcnR5KGIpKWZvcih2YXIgYz1hLmdldChiKyJEaXJlY3RpdmUiKSxlPTAsZj1jLmxlbmd0aDtlPGY7ZSsrKWlmKGI9Y1tlXSxiLm11bHRpRWxlbWVudClyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBRYyhhLGIpe3ZhciBjPWIuJGF0dHIsZD1hLiRhdHRyLGU9YS4kJGVsZW1lbnQ7cyhhLGZ1bmN0aW9uKGQsZSl7IiQiIT1lLmNoYXJBdCgwKSYmKGJbZV0mJmJbZV0hPT1kJiYoZCs9KCJzdHlsZSI9PT1lPyI7IjoiICIpK2JbZV0pLGEuJHNldChlLGQsITAsY1tlXSkpfSk7cyhiLGZ1bmN0aW9uKGIsZil7ImNsYXNzIj09Zj8oUChlLGIpLGFbImNsYXNzIl09KGFbImNsYXNzIl0/YVsiY2xhc3MiXSsiICI6IiIpK2IpOiJzdHlsZSI9PQ0KLWY/KGUuYXR0cigic3R5bGUiLGUuYXR0cigic3R5bGUiKSsiOyIrYiksYS5zdHlsZT0oYS5zdHlsZT9hLnN0eWxlKyI7IjoiIikrYik6IiQiPT1mLmNoYXJBdCgwKXx8YS5oYXNPd25Qcm9wZXJ0eShmKXx8KGFbZl09YixkW2ZdPWNbZl0pfSl9ZnVuY3Rpb24gVChhLGIsYyxkLGUsZixnLGgpe3ZhciBsPVtdLGsscSxwPWJbMF0sbj1hLnNoaWZ0KCksdz16KHt9LG4se3RlbXBsYXRlVXJsOm51bGwsdHJhbnNjbHVkZTpudWxsLHJlcGxhY2U6bnVsbCwkJG9yaWdpbmFsRGlyZWN0aXZlOm59KSxPPUcobi50ZW1wbGF0ZVVybCk/bi50ZW1wbGF0ZVVybChiLGMpOm4udGVtcGxhdGVVcmwsdT1uLnRlbXBsYXRlTmFtZXNwYWNlO2IuZW1wdHkoKTtyKEwuZ2V0VHJ1c3RlZFJlc291cmNlVXJsKE8pKS50aGVuKGZ1bmN0aW9uKHIpe3ZhciBMLHY7cj1TYyhyKTtpZihuLnJlcGxhY2Upe3I9UmIudGVzdChyKT9UYyhXYih1LFUocikpKTpbXTtMPXJbMF07aWYoMSE9ci5sZW5ndGh8fEwubm9kZVR5cGUhPT0NCi1uYSl0aHJvdyBqYSgidHBscnQiLG4ubmFtZSxPKTtyPXskYXR0cjp7fX07VihkLGIsTCk7dmFyIEE9VyhMLFtdLHIpO0gobi5zY29wZSkmJnkoQSk7YT1BLmNvbmNhdChhKTtRYyhjLHIpfWVsc2UgTD1wLGIuaHRtbChyKTthLnVuc2hpZnQodyk7az1lYShhLEwsYyxlLGIsbixmLGcsaCk7cyhkLGZ1bmN0aW9uKGEsYyl7YT09TCYmKGRbY109YlswXSl9KTtmb3IocT1TKGJbMF0uY2hpbGROb2RlcyxlKTtsLmxlbmd0aDspe3I9bC5zaGlmdCgpO3Y9bC5zaGlmdCgpO3ZhciBKPWwuc2hpZnQoKSxFPWwuc2hpZnQoKSxBPWJbMF07aWYoIXIuJCRkZXN0cm95ZWQpe2lmKHYhPT1wKXt2YXIgST12LmNsYXNzTmFtZTtoLmhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlJiZuLnJlcGxhY2V8fChBPVRiKEwpKTtWKEosQih2KSxBKTtQKEIoQSksSSl9dj1rLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50P1gocixrLnRyYW5zY2x1ZGUsRSk6RTtrKHEscixBLGQsdil9fWw9bnVsbH0pO3JldHVybiBmdW5jdGlvbihhLA0KLWIsYyxkLGUpe2E9ZTtiLiQkZGVzdHJveWVkfHwobD9sLnB1c2goYixjLGQsYSk6KGsudHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQmJihhPVgoYixrLnRyYW5zY2x1ZGUsZSkpLGsocSxiLGMsZCxhKSkpfX1mdW5jdGlvbiBOKGEsYil7dmFyIGM9Yi5wcmlvcml0eS1hLnByaW9yaXR5O3JldHVybiAwIT09Yz9jOmEubmFtZSE9PWIubmFtZT9hLm5hbWU8Yi5uYW1lPy0xOjE6YS5pbmRleC1iLmluZGV4fWZ1bmN0aW9uIE9hKGEsYixjLGQpe2lmKGIpdGhyb3cgamEoIm11bHRpZGlyIixiLm5hbWUsYy5uYW1lLGEsdmEoZCkpO31mdW5jdGlvbiBNKGEsYyl7dmFyIGQ9YihjLCEwKTtkJiZhLnB1c2goe3ByaW9yaXR5OjAsY29tcGlsZTpmdW5jdGlvbihhKXthPWEucGFyZW50KCk7dmFyIGI9ISFhLmxlbmd0aDtiJiZFLiQkYWRkQmluZGluZ0NsYXNzKGEpO3JldHVybiBmdW5jdGlvbihhLGMpe3ZhciBlPWMucGFyZW50KCk7Ynx8RS4kJGFkZEJpbmRpbmdDbGFzcyhlKTtFLiQkYWRkQmluZGluZ0luZm8oZSwNCi1kLmV4cHJlc3Npb25zKTthLiR3YXRjaChkLGZ1bmN0aW9uKGEpe2NbMF0ubm9kZVZhbHVlPWF9KX19fSl9ZnVuY3Rpb24gV2IoYSxiKXthPVEoYXx8Imh0bWwiKTtzd2l0Y2goYSl7Y2FzZSAic3ZnIjpjYXNlICJtYXRoIjp2YXIgYz1ZLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuaW5uZXJIVE1MPSI8IithKyI+IitiKyI8LyIrYSsiPiI7cmV0dXJuIGMuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzO2RlZmF1bHQ6cmV0dXJuIGJ9fWZ1bmN0aW9uIFIoYSxiKXtpZigic3JjZG9jIj09YilyZXR1cm4gTC5IVE1MO3ZhciBjPXVhKGEpO2lmKCJ4bGlua0hyZWYiPT1ifHwiZm9ybSI9PWMmJiJhY3Rpb24iPT1ifHwiaW1nIiE9YyYmKCJzcmMiPT1ifHwibmdTcmMiPT1iKSlyZXR1cm4gTC5SRVNPVVJDRV9VUkx9ZnVuY3Rpb24gUGEoYSxjLGQsZSxmKXt2YXIgaD1SKGEsZSk7Zj1nW2VdfHxmO3ZhciBrPWIoZCwhMCxoLGYpO2lmKGspe2lmKCJtdWx0aXBsZSI9PT1lJiYic2VsZWN0Ij09PXVhKGEpKXRocm93IGphKCJzZWxtdWx0aSIsDQotdmEoYSkpO2MucHVzaCh7cHJpb3JpdHk6MTAwLGNvbXBpbGU6ZnVuY3Rpb24oKXtyZXR1cm57cHJlOmZ1bmN0aW9uKGEsYyxnKXtjPWcuJCRvYnNlcnZlcnN8fChnLiQkb2JzZXJ2ZXJzPXt9KTtpZihsLnRlc3QoZSkpdGhyb3cgamEoIm5vZG9tZXZlbnRzIik7dmFyIHA9Z1tlXTtwIT09ZCYmKGs9cCYmYihwLCEwLGgsZiksZD1wKTtrJiYoZ1tlXT1rKGEpLChjW2VdfHwoY1tlXT1bXSkpLiQkaW50ZXI9ITAsKGcuJCRvYnNlcnZlcnMmJmcuJCRvYnNlcnZlcnNbZV0uJCRzY29wZXx8YSkuJHdhdGNoKGssZnVuY3Rpb24oYSxiKXsiY2xhc3MiPT09ZSYmYSE9Yj9nLiR1cGRhdGVDbGFzcyhhLGIpOmcuJHNldChlLGEpfSkpfX19fSl9fWZ1bmN0aW9uIFYoYSxiLGMpe3ZhciBkPWJbMF0sZT1iLmxlbmd0aCxmPWQucGFyZW50Tm9kZSxnLGg7aWYoYSlmb3IoZz0wLGg9YS5sZW5ndGg7ZzxoO2crKylpZihhW2ddPT1kKXthW2crK109YztoPWcrZS0xO2Zvcih2YXIgbD1hLmxlbmd0aDtnPGw7ZysrLA0KLWgrKyloPGw/YVtnXT1hW2hdOmRlbGV0ZSBhW2ddO2EubGVuZ3RoLT1lLTE7YS5jb250ZXh0PT09ZCYmKGEuY29udGV4dD1jKTticmVha31mJiZmLnJlcGxhY2VDaGlsZChjLGQpO2E9WS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7YS5hcHBlbmRDaGlsZChkKTtCKGMpLmRhdGEoQihkKS5kYXRhKCkpO3JhPyhQYj0hMCxyYS5jbGVhbkRhdGEoW2RdKSk6ZGVsZXRlIEIuY2FjaGVbZFtCLmV4cGFuZG9dXTtkPTE7Zm9yKGU9Yi5sZW5ndGg7ZDxlO2QrKylmPWJbZF0sQihmKS5yZW1vdmUoKSxhLmFwcGVuZENoaWxkKGYpLGRlbGV0ZSBiW2RdO2JbMF09YztiLmxlbmd0aD0xfWZ1bmN0aW9uIFooYSxiKXtyZXR1cm4geihmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sYSxiKX1mdW5jdGlvbiAkKGEsYixkLGUsZixnKXt0cnl7YShiLGQsZSxmLGcpfWNhdGNoKGgpe2MoaCx2YShkKSl9fXZhciBYYj1mdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPU9iamVjdC5rZXlzKGIpLA0KLWQsZSxmO2Q9MDtmb3IoZT1jLmxlbmd0aDtkPGU7ZCsrKWY9Y1tkXSx0aGlzW2ZdPWJbZl19ZWxzZSB0aGlzLiRhdHRyPXt9O3RoaXMuJCRlbGVtZW50PWF9O1hiLnByb3RvdHlwZT17JG5vcm1hbGl6ZTp5YSwkYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7YSYmMDxhLmxlbmd0aCYmSi5hZGRDbGFzcyh0aGlzLiQkZWxlbWVudCxhKX0sJHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe2EmJjA8YS5sZW5ndGgmJkoucmVtb3ZlQ2xhc3ModGhpcy4kJGVsZW1lbnQsYSl9LCR1cGRhdGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPVVjKGEsYik7YyYmYy5sZW5ndGgmJkouYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsYyk7KGM9VWMoYixhKSkmJmMubGVuZ3RoJiZKLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LGMpfSwkc2V0OmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBmPXRoaXMuJCRlbGVtZW50WzBdLGc9TGMoZixhKSxoPWtmKGYsYSksZj1hO2c/KHRoaXMuJCRlbGVtZW50LnByb3AoYSxiKSxlPWcpOg0KLWgmJih0aGlzW2hdPWIsZj1oKTt0aGlzW2FdPWI7ZT90aGlzLiRhdHRyW2FdPWU6KGU9dGhpcy4kYXR0clthXSl8fCh0aGlzLiRhdHRyW2FdPWU9dGMoYSwiLSIpKTtnPXVhKHRoaXMuJCRlbGVtZW50KTtpZigiYSI9PT1nJiYiaHJlZiI9PT1hfHwiaW1nIj09PWcmJiJzcmMiPT09YSl0aGlzW2FdPWI9QShiLCJzcmMiPT09YSk7ZWxzZSBpZigiaW1nIj09PWcmJiJzcmNzZXQiPT09YSl7Zm9yKHZhciBnPSIiLGg9VShiKSxsPS8oXHMrXGQreFxzKix8XHMrXGQrd1xzKix8XHMrLHwsXHMrKS8sbD0vXHMvLnRlc3QoaCk/bDovKCwpLyxoPWguc3BsaXQobCksbD1NYXRoLmZsb29yKGgubGVuZ3RoLzIpLGs9MDtrPGw7aysrKXZhciBxPTIqayxnPWcrQShVKGhbcV0pLCEwKSxnPWcrKCIgIitVKGhbcSsxXSkpO2g9VShoWzIqa10pLnNwbGl0KC9ccy8pO2crPUEoVShoWzBdKSwhMCk7Mj09PWgubGVuZ3RoJiYoZys9IiAiK1UoaFsxXSkpO3RoaXNbYV09Yj1nfSExIT09ZCYmKG51bGw9PT1ifHwNCi1iPT09dD90aGlzLiQkZWxlbWVudC5yZW1vdmVBdHRyKGUpOnRoaXMuJCRlbGVtZW50LmF0dHIoZSxiKSk7KGE9dGhpcy4kJG9ic2VydmVycykmJnMoYVtmXSxmdW5jdGlvbihhKXt0cnl7YShiKX1jYXRjaChkKXtjKGQpfX0pfSwkb2JzZXJ2ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD1jLiQkb2JzZXJ2ZXJzfHwoYy4kJG9ic2VydmVycz1oYSgpKSxlPWRbYV18fChkW2FdPVtdKTtlLnB1c2goYik7di4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7IWUuJCRpbnRlciYmYy5oYXNPd25Qcm9wZXJ0eShhKSYmYihjW2FdKX0pO3JldHVybiBmdW5jdGlvbigpe1hhKGUsYil9fX07dmFyIEFhPWIuc3RhcnRTeW1ib2woKSxrYT1iLmVuZFN5bWJvbCgpLFNjPSJ7eyI9PUFhfHwifX0iPT1rYT9vYTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9ce1x7L2csQWEpLnJlcGxhY2UoL319L2csa2EpfSxmYj0vXm5nQXR0cltBLVpdLztFLiQkYWRkQmluZGluZ0luZm89az9mdW5jdGlvbihhLGIpe3ZhciBjPQ0KLWEuZGF0YSgiJGJpbmRpbmciKXx8W107eChiKT9jPWMuY29uY2F0KGIpOmMucHVzaChiKTthLmRhdGEoIiRiaW5kaW5nIixjKX06QztFLiQkYWRkQmluZGluZ0NsYXNzPWs/ZnVuY3Rpb24oYSl7UChhLCJuZy1iaW5kaW5nIil9OkM7RS4kJGFkZFNjb3BlSW5mbz1rP2Z1bmN0aW9uKGEsYixjLGQpe2EuZGF0YShjP2Q/IiRpc29sYXRlU2NvcGVOb1RlbXBsYXRlIjoiJGlzb2xhdGVTY29wZSI6IiRzY29wZSIsYil9OkM7RS4kJGFkZFNjb3BlQ2xhc3M9az9mdW5jdGlvbihhLGIpe1AoYSxiPyJuZy1pc29sYXRlLXNjb3BlIjoibmctc2NvcGUiKX06QztyZXR1cm4gRX1dfWZ1bmN0aW9uIHlhKGIpe3JldHVybiBjYihiLnJlcGxhY2UoUmMsIiIpKX1mdW5jdGlvbiBVYyhiLGEpe3ZhciBjPSIiLGQ9Yi5zcGxpdCgvXHMrLyksZT1hLnNwbGl0KC9ccysvKSxmPTA7YTpmb3IoO2Y8ZC5sZW5ndGg7ZisrKXtmb3IodmFyIGc9ZFtmXSxoPTA7aDxlLmxlbmd0aDtoKyspaWYoZz09ZVtoXSljb250aW51ZSBhOw0KLWMrPSgwPGMubGVuZ3RoPyIgIjoiIikrZ31yZXR1cm4gY31mdW5jdGlvbiBUYyhiKXtiPUIoYik7dmFyIGE9Yi5sZW5ndGg7aWYoMT49YSlyZXR1cm4gYjtmb3IoO2EtLTspOD09PWJbYV0ubm9kZVR5cGUmJnJmLmNhbGwoYixhLDEpO3JldHVybiBifWZ1bmN0aW9uIEZlKCl7dmFyIGI9e30sYT0hMSxjPS9eKFxTKykoXHMrYXNccysoXHcrKSk/JC87dGhpcy5yZWdpc3Rlcj1mdW5jdGlvbihhLGMpe01hKGEsImNvbnRyb2xsZXIiKTtIKGEpP3ooYixhKTpiW2FdPWN9O3RoaXMuYWxsb3dHbG9iYWxzPWZ1bmN0aW9uKCl7YT0hMH07dGhpcy4kZ2V0PVsiJGluamVjdG9yIiwiJHdpbmRvdyIsZnVuY3Rpb24oZCxlKXtmdW5jdGlvbiBmKGEsYixjLGQpe2lmKCFhfHwhSChhLiRzY29wZSkpdGhyb3cgVCgiJGNvbnRyb2xsZXIiKSgibm9zY3AiLGQsYik7YS4kc2NvcGVbYl09Y31yZXR1cm4gZnVuY3Rpb24oZyxoLGwsayl7dmFyIG0scCxxO2w9ITA9PT1sO2smJkYoaykmJihxPWspO0YoZykmJg0KLShrPWcubWF0Y2goYykscD1rWzFdLHE9cXx8a1szXSxnPWIuaGFzT3duUHJvcGVydHkocCk/YltwXTp2YyhoLiRzY29wZSxwLCEwKXx8KGE/dmMoZSxwLCEwKTp0KSxzYihnLHAsITApKTtpZihsKXJldHVybiBsPSh4KGcpP2dbZy5sZW5ndGgtMV06ZykucHJvdG90eXBlLG09T2JqZWN0LmNyZWF0ZShsKSxxJiZmKGgscSxtLHB8fGcubmFtZSkseihmdW5jdGlvbigpe2QuaW52b2tlKGcsbSxoLHApO3JldHVybiBtfSx7aW5zdGFuY2U6bSxpZGVudGlmaWVyOnF9KTttPWQuaW5zdGFudGlhdGUoZyxoLHApO3EmJmYoaCxxLG0scHx8Zy5uYW1lKTtyZXR1cm4gbX19XX1mdW5jdGlvbiBHZSgpe3RoaXMuJGdldD1bIiR3aW5kb3ciLGZ1bmN0aW9uKGIpe3JldHVybiBCKGIuZG9jdW1lbnQpfV19ZnVuY3Rpb24gSGUoKXt0aGlzLiRnZXQ9WyIkbG9nIixmdW5jdGlvbihiKXtyZXR1cm4gZnVuY3Rpb24oYSxjKXtiLmVycm9yLmFwcGx5KGIsYXJndW1lbnRzKX19XX1mdW5jdGlvbiBZYihiLGEpe2lmKEYoYikpe3ZhciBjPQ0KLWIucmVwbGFjZShzZiwiIikudHJpbSgpO2lmKGMpe3ZhciBkPWEoIkNvbnRlbnQtVHlwZSIpOyhkPWQmJjA9PT1kLmluZGV4T2YoVmMpKXx8KGQ9KGQ9Yy5tYXRjaCh0ZikpJiZ1ZltkWzBdXS50ZXN0KGMpKTtkJiYoYj1vYyhjKSl9fXJldHVybiBifWZ1bmN0aW9uIFdjKGIpe3ZhciBhPWhhKCksYyxkLGU7aWYoIWIpcmV0dXJuIGE7cyhiLnNwbGl0KCJcbiIpLGZ1bmN0aW9uKGIpe2U9Yi5pbmRleE9mKCI6Iik7Yz1RKFUoYi5zdWJzdHIoMCxlKSkpO2Q9VShiLnN1YnN0cihlKzEpKTtjJiYoYVtjXT1hW2NdP2FbY10rIiwgIitkOmQpfSk7cmV0dXJuIGF9ZnVuY3Rpb24gWGMoYil7dmFyIGE9SChiKT9iOnQ7cmV0dXJuIGZ1bmN0aW9uKGMpe2F8fChhPVdjKGIpKTtyZXR1cm4gYz8oYz1hW1EoYyldLHZvaWQgMD09PWMmJihjPW51bGwpLGMpOmF9fWZ1bmN0aW9uIFljKGIsYSxjLGQpe2lmKEcoZCkpcmV0dXJuIGQoYixhLGMpO3MoZCxmdW5jdGlvbihkKXtiPWQoYixhLGMpfSk7cmV0dXJuIGJ9DQotZnVuY3Rpb24gS2UoKXt2YXIgYj10aGlzLmRlZmF1bHRzPXt0cmFuc2Zvcm1SZXNwb25zZTpbWWJdLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGEpe3JldHVybiBIKGEpJiYiW29iamVjdCBGaWxlXSIhPT1EYS5jYWxsKGEpJiYiW29iamVjdCBCbG9iXSIhPT1EYS5jYWxsKGEpJiYiW29iamVjdCBGb3JtRGF0YV0iIT09RGEuY2FsbChhKT8kYShhKTphfV0saGVhZGVyczp7Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiJ9LHBvc3Q6cWEoWmIpLHB1dDpxYShaYikscGF0Y2g6cWEoWmIpfSx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiJ9LGE9ITE7dGhpcy51c2VBcHBseUFzeW5jPWZ1bmN0aW9uKGIpe3JldHVybiB5KGIpPyhhPSEhYix0aGlzKTphfTt2YXIgYz10aGlzLmludGVyY2VwdG9ycz1bXTt0aGlzLiRnZXQ9WyIkaHR0cEJhY2tlbmQiLCIkYnJvd3NlciIsIiRjYWNoZUZhY3RvcnkiLA0KLSIkcm9vdFNjb3BlIiwiJHEiLCIkaW5qZWN0b3IiLGZ1bmN0aW9uKGQsZSxmLGcsaCxsKXtmdW5jdGlvbiBrKGEpe2Z1bmN0aW9uIGMoYSl7dmFyIGI9eih7fSxhKTtiLmRhdGE9YS5kYXRhP1ljKGEuZGF0YSxhLmhlYWRlcnMsYS5zdGF0dXMsZS50cmFuc2Zvcm1SZXNwb25zZSk6YS5kYXRhO2E9YS5zdGF0dXM7cmV0dXJuIDIwMDw9YSYmMzAwPmE/YjpoLnJlamVjdChiKX1mdW5jdGlvbiBkKGEpe3ZhciBiLGM9e307cyhhLGZ1bmN0aW9uKGEsZCl7RyhhKT8oYj1hKCksbnVsbCE9YiYmKGNbZF09YikpOmNbZF09YX0pO3JldHVybiBjfWlmKCFnYS5pc09iamVjdChhKSl0aHJvdyBUKCIkaHR0cCIpKCJiYWRyZXEiLGEpO3ZhciBlPXooe21ldGhvZDoiZ2V0Iix0cmFuc2Zvcm1SZXF1ZXN0OmIudHJhbnNmb3JtUmVxdWVzdCx0cmFuc2Zvcm1SZXNwb25zZTpiLnRyYW5zZm9ybVJlc3BvbnNlfSxhKTtlLmhlYWRlcnM9ZnVuY3Rpb24oYSl7dmFyIGM9Yi5oZWFkZXJzLGU9eih7fSxhLmhlYWRlcnMpLA0KLWYsZyxjPXooe30sYy5jb21tb24sY1tRKGEubWV0aG9kKV0pO2E6Zm9yKGYgaW4gYyl7YT1RKGYpO2ZvcihnIGluIGUpaWYoUShnKT09PWEpY29udGludWUgYTtlW2ZdPWNbZl19cmV0dXJuIGQoZSl9KGEpO2UubWV0aG9kPXViKGUubWV0aG9kKTt2YXIgZj1bZnVuY3Rpb24oYSl7dmFyIGQ9YS5oZWFkZXJzLGU9WWMoYS5kYXRhLFhjKGQpLHQsYS50cmFuc2Zvcm1SZXF1ZXN0KTtEKGUpJiZzKGQsZnVuY3Rpb24oYSxiKXsiY29udGVudC10eXBlIj09PVEoYikmJmRlbGV0ZSBkW2JdfSk7RChhLndpdGhDcmVkZW50aWFscykmJiFEKGIud2l0aENyZWRlbnRpYWxzKSYmKGEud2l0aENyZWRlbnRpYWxzPWIud2l0aENyZWRlbnRpYWxzKTtyZXR1cm4gbShhLGUpLnRoZW4oYyxjKX0sdF0sZz1oLndoZW4oZSk7Zm9yKHModSxmdW5jdGlvbihhKXsoYS5yZXF1ZXN0fHxhLnJlcXVlc3RFcnJvcikmJmYudW5zaGlmdChhLnJlcXVlc3QsYS5yZXF1ZXN0RXJyb3IpOyhhLnJlc3BvbnNlfHxhLnJlc3BvbnNlRXJyb3IpJiYNCi1mLnB1c2goYS5yZXNwb25zZSxhLnJlc3BvbnNlRXJyb3IpfSk7Zi5sZW5ndGg7KXthPWYuc2hpZnQoKTt2YXIgbD1mLnNoaWZ0KCksZz1nLnRoZW4oYSxsKX1nLnN1Y2Nlc3M9ZnVuY3Rpb24oYSl7Zy50aGVuKGZ1bmN0aW9uKGIpe2EoYi5kYXRhLGIuc3RhdHVzLGIuaGVhZGVycyxlKX0pO3JldHVybiBnfTtnLmVycm9yPWZ1bmN0aW9uKGEpe2cudGhlbihudWxsLGZ1bmN0aW9uKGIpe2EoYi5kYXRhLGIuc3RhdHVzLGIuaGVhZGVycyxlKX0pO3JldHVybiBnfTtyZXR1cm4gZ31mdW5jdGlvbiBtKGMsZil7ZnVuY3Rpb24gbChiLGMsZCxlKXtmdW5jdGlvbiBmKCl7bShjLGIsZCxlKX1QJiYoMjAwPD1iJiYzMDA+Yj9QLnB1dChYLFtiLGMsV2MoZCksZV0pOlAucmVtb3ZlKFgpKTthP2cuJGFwcGx5QXN5bmMoZik6KGYoKSxnLiQkcGhhc2V8fGcuJGFwcGx5KCkpfWZ1bmN0aW9uIG0oYSxiLGQsZSl7Yj1NYXRoLm1heChiLDApOygyMDA8PWImJjMwMD5iP0oucmVzb2x2ZTpKLnJlamVjdCkoe2RhdGE6YSwNCi1zdGF0dXM6YixoZWFkZXJzOlhjKGQpLGNvbmZpZzpjLHN0YXR1c1RleHQ6ZX0pfWZ1bmN0aW9uIHcoYSl7bShhLmRhdGEsYS5zdGF0dXMscWEoYS5oZWFkZXJzKCkpLGEuc3RhdHVzVGV4dCl9ZnVuY3Rpb24gdSgpe3ZhciBhPWsucGVuZGluZ1JlcXVlc3RzLmluZGV4T2YoYyk7LTEhPT1hJiZrLnBlbmRpbmdSZXF1ZXN0cy5zcGxpY2UoYSwxKX12YXIgSj1oLmRlZmVyKCksQT1KLnByb21pc2UsUCxFLHM9Yy5oZWFkZXJzLFg9cChjLnVybCxjLnBhcmFtcyk7ay5wZW5kaW5nUmVxdWVzdHMucHVzaChjKTtBLnRoZW4odSx1KTshYy5jYWNoZSYmIWIuY2FjaGV8fCExPT09Yy5jYWNoZXx8IkdFVCIhPT1jLm1ldGhvZCYmIkpTT05QIiE9PWMubWV0aG9kfHwoUD1IKGMuY2FjaGUpP2MuY2FjaGU6SChiLmNhY2hlKT9iLmNhY2hlOnEpO1AmJihFPVAuZ2V0KFgpLHkoRSk/RSYmRyhFLnRoZW4pP0UudGhlbih3LHcpOngoRSk/bShFWzFdLEVbMF0scWEoRVsyXSksRVszXSk6bShFLDIwMCx7fSwNCi0iT0siKTpQLnB1dChYLEEpKTtEKEUpJiYoKEU9WmMoYy51cmwpP2UuY29va2llcygpW2MueHNyZkNvb2tpZU5hbWV8fGIueHNyZkNvb2tpZU5hbWVdOnQpJiYoc1tjLnhzcmZIZWFkZXJOYW1lfHxiLnhzcmZIZWFkZXJOYW1lXT1FKSxkKGMubWV0aG9kLFgsZixsLHMsYy50aW1lb3V0LGMud2l0aENyZWRlbnRpYWxzLGMucmVzcG9uc2VUeXBlKSk7cmV0dXJuIEF9ZnVuY3Rpb24gcChhLGIpe2lmKCFiKXJldHVybiBhO3ZhciBjPVtdO0VkKGIsZnVuY3Rpb24oYSxiKXtudWxsPT09YXx8RChhKXx8KHgoYSl8fChhPVthXSkscyhhLGZ1bmN0aW9uKGEpe0goYSkmJihhPXBhKGEpP2EudG9JU09TdHJpbmcoKTokYShhKSk7Yy5wdXNoKEZhKGIpKyI9IitGYShhKSl9KSl9KTswPGMubGVuZ3RoJiYoYSs9KC0xPT1hLmluZGV4T2YoIj8iKT8iPyI6IiYiKStjLmpvaW4oIiYiKSk7cmV0dXJuIGF9dmFyIHE9ZigiJGh0dHAiKSx1PVtdO3MoYyxmdW5jdGlvbihhKXt1LnVuc2hpZnQoRihhKT9sLmdldChhKToNCi1sLmludm9rZShhKSl9KTtrLnBlbmRpbmdSZXF1ZXN0cz1bXTsoZnVuY3Rpb24oYSl7cyhhcmd1bWVudHMsZnVuY3Rpb24oYSl7a1thXT1mdW5jdGlvbihiLGMpe3JldHVybiBrKHooY3x8e30se21ldGhvZDphLHVybDpifSkpfX0pfSkoImdldCIsImRlbGV0ZSIsImhlYWQiLCJqc29ucCIpOyhmdW5jdGlvbihhKXtzKGFyZ3VtZW50cyxmdW5jdGlvbihhKXtrW2FdPWZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gayh6KGR8fHt9LHttZXRob2Q6YSx1cmw6YixkYXRhOmN9KSl9fSl9KSgicG9zdCIsInB1dCIsInBhdGNoIik7ay5kZWZhdWx0cz1iO3JldHVybiBrfV19ZnVuY3Rpb24gdmYoKXtyZXR1cm4gbmV3IE0uWE1MSHR0cFJlcXVlc3R9ZnVuY3Rpb24gTGUoKXt0aGlzLiRnZXQ9WyIkYnJvd3NlciIsIiR3aW5kb3ciLCIkZG9jdW1lbnQiLGZ1bmN0aW9uKGIsYSxjKXtyZXR1cm4gd2YoYix2ZixiLmRlZmVyLGEuYW5ndWxhci5jYWxsYmFja3MsY1swXSl9XX1mdW5jdGlvbiB3ZihiLGEsYywNCi1kLGUpe2Z1bmN0aW9uIGYoYSxiLGMpe3ZhciBmPWUuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksbT1udWxsO2YudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtmLnNyYz1hO2YuYXN5bmM9ITA7bT1mdW5jdGlvbihhKXtmLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLG0sITEpO2YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG0sITEpO2UuYm9keS5yZW1vdmVDaGlsZChmKTtmPW51bGw7dmFyIGc9LTEsdT0idW5rbm93biI7YSYmKCJsb2FkIiE9PWEudHlwZXx8ZFtiXS5jYWxsZWR8fChhPXt0eXBlOiJlcnJvciJ9KSx1PWEudHlwZSxnPSJlcnJvciI9PT1hLnR5cGU/NDA0OjIwMCk7YyYmYyhnLHUpfTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLG0sITEpO2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG0sITEpO2UuYm9keS5hcHBlbmRDaGlsZChmKTtyZXR1cm4gbX1yZXR1cm4gZnVuY3Rpb24oZSxoLGwsayxtLHAscSx1KXtmdW5jdGlvbiByKCl7diYmdigpO3cmJncuYWJvcnQoKX0NCi1mdW5jdGlvbiBPKGEsZCxlLGYsZyl7SiE9PXQmJmMuY2FuY2VsKEopO3Y9dz1udWxsO2EoZCxlLGYsZyk7Yi4kJGNvbXBsZXRlT3V0c3RhbmRpbmdSZXF1ZXN0KEMpfWIuJCRpbmNPdXRzdGFuZGluZ1JlcXVlc3RDb3VudCgpO2g9aHx8Yi51cmwoKTtpZigianNvbnAiPT1RKGUpKXt2YXIgbj0iXyIrKGQuY291bnRlcisrKS50b1N0cmluZygzNik7ZFtuXT1mdW5jdGlvbihhKXtkW25dLmRhdGE9YTtkW25dLmNhbGxlZD0hMH07dmFyIHY9ZihoLnJlcGxhY2UoIkpTT05fQ0FMTEJBQ0siLCJhbmd1bGFyLmNhbGxiYWNrcy4iK24pLG4sZnVuY3Rpb24oYSxiKXtPKGssYSxkW25dLmRhdGEsIiIsYik7ZFtuXT1DfSl9ZWxzZXt2YXIgdz1hKCk7dy5vcGVuKGUsaCwhMCk7cyhtLGZ1bmN0aW9uKGEsYil7eShhKSYmdy5zZXRSZXF1ZXN0SGVhZGVyKGIsYSl9KTt3Lm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPXcuc3RhdHVzVGV4dHx8IiIsYj0icmVzcG9uc2UiaW4gdz93LnJlc3BvbnNlOncucmVzcG9uc2VUZXh0LA0KLWM9MTIyMz09PXcuc3RhdHVzPzIwNDp3LnN0YXR1czswPT09YyYmKGM9Yj8yMDA6ImZpbGUiPT1CYShoKS5wcm90b2NvbD80MDQ6MCk7TyhrLGMsYix3LmdldEFsbFJlc3BvbnNlSGVhZGVycygpLGEpfTtlPWZ1bmN0aW9uKCl7TyhrLC0xLG51bGwsbnVsbCwiIil9O3cub25lcnJvcj1lO3cub25hYm9ydD1lO3EmJih3LndpdGhDcmVkZW50aWFscz0hMCk7aWYodSl0cnl7dy5yZXNwb25zZVR5cGU9dX1jYXRjaChMKXtpZigianNvbiIhPT11KXRocm93IEw7fXcuc2VuZChsfHxudWxsKX1pZigwPHApdmFyIEo9YyhyLHApO2Vsc2UgcCYmRyhwLnRoZW4pJiZwLnRoZW4ocil9fWZ1bmN0aW9uIEllKCl7dmFyIGI9Int7IixhPSJ9fSI7dGhpcy5zdGFydFN5bWJvbD1mdW5jdGlvbihhKXtyZXR1cm4gYT8oYj1hLHRoaXMpOmJ9O3RoaXMuZW5kU3ltYm9sPWZ1bmN0aW9uKGIpe3JldHVybiBiPyhhPWIsdGhpcyk6YX07dGhpcy4kZ2V0PVsiJHBhcnNlIiwiJGV4Y2VwdGlvbkhhbmRsZXIiLCIkc2NlIiwNCi1mdW5jdGlvbihjLGQsZSl7ZnVuY3Rpb24gZihhKXtyZXR1cm4iXFxcXFxcIithfWZ1bmN0aW9uIGcoZixnLHUscil7ZnVuY3Rpb24gTyhjKXtyZXR1cm4gYy5yZXBsYWNlKGssYikucmVwbGFjZShtLGEpfWZ1bmN0aW9uIG4oYSl7dHJ5e3ZhciBiPWE7YT11P2UuZ2V0VHJ1c3RlZCh1LGIpOmUudmFsdWVPZihiKTt2YXIgYztpZihyJiYheShhKSljPWE7ZWxzZSBpZihudWxsPT1hKWM9IiI7ZWxzZXtzd2l0Y2godHlwZW9mIGEpe2Nhc2UgInN0cmluZyI6YnJlYWs7Y2FzZSAibnVtYmVyIjphPSIiK2E7YnJlYWs7ZGVmYXVsdDphPSRhKGEpfWM9YX1yZXR1cm4gY31jYXRjaChnKXtjPSRiKCJpbnRlcnIiLGYsZy50b1N0cmluZygpKSxkKGMpfX1yPSEhcjtmb3IodmFyIHYsdyxMPTAsSj1bXSxBPVtdLFA9Zi5sZW5ndGgsRT1bXSxzPVtdO0w8UDspaWYoLTEhPSh2PWYuaW5kZXhPZihiLEwpKSYmLTEhPSh3PWYuaW5kZXhPZihhLHYraCkpKUwhPT12JiZFLnB1c2goTyhmLnN1YnN0cmluZyhMLA0KLXYpKSksTD1mLnN1YnN0cmluZyh2K2gsdyksSi5wdXNoKEwpLEEucHVzaChjKEwsbikpLEw9dytsLHMucHVzaChFLmxlbmd0aCksRS5wdXNoKCIiKTtlbHNle0whPT1QJiZFLnB1c2goTyhmLnN1YnN0cmluZyhMKSkpO2JyZWFrfWlmKHUmJjE8RS5sZW5ndGgpdGhyb3cgJGIoIm5vY29uY2F0IixmKTtpZighZ3x8Si5sZW5ndGgpe3ZhciBYPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9Si5sZW5ndGg7YjxjO2IrKyl7aWYociYmRChhW2JdKSlyZXR1cm47RVtzW2JdXT1hW2JdfXJldHVybiBFLmpvaW4oIiIpfTtyZXR1cm4geihmdW5jdGlvbihhKXt2YXIgYj0wLGM9Si5sZW5ndGgsZT1BcnJheShjKTt0cnl7Zm9yKDtiPGM7YisrKWVbYl09QVtiXShhKTtyZXR1cm4gWChlKX1jYXRjaChnKXthPSRiKCJpbnRlcnIiLGYsZy50b1N0cmluZygpKSxkKGEpfX0se2V4cDpmLGV4cHJlc3Npb25zOkosJCR3YXRjaERlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYS4kd2F0Y2hHcm91cChBLA0KLWZ1bmN0aW9uKGMsZSl7dmFyIGY9WChjKTtHKGIpJiZiLmNhbGwodGhpcyxmLGMhPT1lP2Q6ZixhKTtkPWZ9LGMpfX0pfX12YXIgaD1iLmxlbmd0aCxsPWEubGVuZ3RoLGs9bmV3IFJlZ0V4cChiLnJlcGxhY2UoLy4vZyxmKSwiZyIpLG09bmV3IFJlZ0V4cChhLnJlcGxhY2UoLy4vZyxmKSwiZyIpO2cuc3RhcnRTeW1ib2w9ZnVuY3Rpb24oKXtyZXR1cm4gYn07Zy5lbmRTeW1ib2w9ZnVuY3Rpb24oKXtyZXR1cm4gYX07cmV0dXJuIGd9XX1mdW5jdGlvbiBKZSgpe3RoaXMuJGdldD1bIiRyb290U2NvcGUiLCIkd2luZG93IiwiJHEiLCIkJHEiLGZ1bmN0aW9uKGIsYSxjLGQpe2Z1bmN0aW9uIGUoZSxoLGwsayl7dmFyIG09YS5zZXRJbnRlcnZhbCxwPWEuY2xlYXJJbnRlcnZhbCxxPTAsdT15KGspJiYhayxyPSh1P2Q6YykuZGVmZXIoKSxPPXIucHJvbWlzZTtsPXkobCk/bDowO08udGhlbihudWxsLG51bGwsZSk7Ty4kJGludGVydmFsSWQ9bShmdW5jdGlvbigpe3Iubm90aWZ5KHErKyk7MDwNCi1sJiZxPj1sJiYoci5yZXNvbHZlKHEpLHAoTy4kJGludGVydmFsSWQpLGRlbGV0ZSBmW08uJCRpbnRlcnZhbElkXSk7dXx8Yi4kYXBwbHkoKX0saCk7ZltPLiQkaW50ZXJ2YWxJZF09cjtyZXR1cm4gT312YXIgZj17fTtlLmNhbmNlbD1mdW5jdGlvbihiKXtyZXR1cm4gYiYmYi4kJGludGVydmFsSWQgaW4gZj8oZltiLiQkaW50ZXJ2YWxJZF0ucmVqZWN0KCJjYW5jZWxlZCIpLGEuY2xlYXJJbnRlcnZhbChiLiQkaW50ZXJ2YWxJZCksZGVsZXRlIGZbYi4kJGludGVydmFsSWRdLCEwKTohMX07cmV0dXJuIGV9XX1mdW5jdGlvbiBSZCgpe3RoaXMuJGdldD1mdW5jdGlvbigpe3JldHVybntpZDoiZW4tdXMiLE5VTUJFUl9GT1JNQVRTOntERUNJTUFMX1NFUDoiLiIsR1JPVVBfU0VQOiIsIixQQVRURVJOUzpbe21pbkludDoxLG1pbkZyYWM6MCxtYXhGcmFjOjMscG9zUHJlOiIiLHBvc1N1ZjoiIixuZWdQcmU6Ii0iLG5lZ1N1ZjoiIixnU2l6ZTozLGxnU2l6ZTozfSx7bWluSW50OjEsbWluRnJhYzoyLA0KLW1heEZyYWM6Mixwb3NQcmU6Ilx1MDBhNCIscG9zU3VmOiIiLG5lZ1ByZToiKFx1MDBhNCIsbmVnU3VmOiIpIixnU2l6ZTozLGxnU2l6ZTozfV0sQ1VSUkVOQ1lfU1lNOiIkIn0sREFURVRJTUVfRk9STUFUUzp7TU9OVEg6IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIiksU0hPUlRNT05USDoiSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWMiLnNwbGl0KCIgIiksREFZOiJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSIuc3BsaXQoIiAiKSxTSE9SVERBWToiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0Ii5zcGxpdCgiICIpLEFNUE1TOlsiQU0iLCJQTSJdLG1lZGl1bToiTU1NIGQsIHkgaDptbTpzcyBhIiwic2hvcnQiOiJNL2QveXkgaDptbSBhIixmdWxsRGF0ZToiRUVFRSwgTU1NTSBkLCB5IiwNCi1sb25nRGF0ZToiTU1NTSBkLCB5IixtZWRpdW1EYXRlOiJNTU0gZCwgeSIsc2hvcnREYXRlOiJNL2QveXkiLG1lZGl1bVRpbWU6Img6bW06c3MgYSIsc2hvcnRUaW1lOiJoOm1tIGEifSxwbHVyYWxDYXQ6ZnVuY3Rpb24oYil7cmV0dXJuIDE9PT1iPyJvbmUiOiJvdGhlciJ9fX19ZnVuY3Rpb24gYWMoYil7Yj1iLnNwbGl0KCIvIik7Zm9yKHZhciBhPWIubGVuZ3RoO2EtLTspYlthXT1xYihiW2FdKTtyZXR1cm4gYi5qb2luKCIvIil9ZnVuY3Rpb24gJGMoYixhKXt2YXIgYz1CYShiKTthLiQkcHJvdG9jb2w9Yy5wcm90b2NvbDthLiQkaG9zdD1jLmhvc3RuYW1lO2EuJCRwb3J0PWJhKGMucG9ydCl8fHhmW2MucHJvdG9jb2xdfHxudWxsfWZ1bmN0aW9uIGFkKGIsYSl7dmFyIGM9Ii8iIT09Yi5jaGFyQXQoMCk7YyYmKGI9Ii8iK2IpO3ZhciBkPUJhKGIpO2EuJCRwYXRoPWRlY29kZVVSSUNvbXBvbmVudChjJiYiLyI9PT1kLnBhdGhuYW1lLmNoYXJBdCgwKT9kLnBhdGhuYW1lLnN1YnN0cmluZygxKToNCi1kLnBhdGhuYW1lKTthLiQkc2VhcmNoPXFjKGQuc2VhcmNoKTthLiQkaGFzaD1kZWNvZGVVUklDb21wb25lbnQoZC5oYXNoKTthLiQkcGF0aCYmIi8iIT1hLiQkcGF0aC5jaGFyQXQoMCkmJihhLiQkcGF0aD0iLyIrYS4kJHBhdGgpfWZ1bmN0aW9uIHphKGIsYSl7aWYoMD09PWEuaW5kZXhPZihiKSlyZXR1cm4gYS5zdWJzdHIoYi5sZW5ndGgpfWZ1bmN0aW9uIEhhKGIpe3ZhciBhPWIuaW5kZXhPZigiIyIpO3JldHVybi0xPT1hP2I6Yi5zdWJzdHIoMCxhKX1mdW5jdGlvbiBiZChiKXtyZXR1cm4gYi5yZXBsYWNlKC8oIy4rKXwjJC8sIiQxIil9ZnVuY3Rpb24gYmMoYil7cmV0dXJuIGIuc3Vic3RyKDAsSGEoYikubGFzdEluZGV4T2YoIi8iKSsxKX1mdW5jdGlvbiBjYyhiLGEpe3RoaXMuJCRodG1sNT0hMDthPWF8fCIiO3ZhciBjPWJjKGIpOyRjKGIsdGhpcyk7dGhpcy4kJHBhcnNlPWZ1bmN0aW9uKGEpe3ZhciBiPXphKGMsYSk7aWYoIUYoYikpdGhyb3cgRmIoImlwdGhwcmZ4IixhLGMpOw0KLWFkKGIsdGhpcyk7dGhpcy4kJHBhdGh8fCh0aGlzLiQkcGF0aD0iLyIpO3RoaXMuJCRjb21wb3NlKCl9O3RoaXMuJCRjb21wb3NlPWZ1bmN0aW9uKCl7dmFyIGE9TmIodGhpcy4kJHNlYXJjaCksYj10aGlzLiQkaGFzaD8iIyIrcWIodGhpcy4kJGhhc2gpOiIiO3RoaXMuJCR1cmw9YWModGhpcy4kJHBhdGgpKyhhPyI/IithOiIiKStiO3RoaXMuJCRhYnNVcmw9Yyt0aGlzLiQkdXJsLnN1YnN0cigxKX07dGhpcy4kJHBhcnNlTGlua1VybD1mdW5jdGlvbihkLGUpe2lmKGUmJiIjIj09PWVbMF0pcmV0dXJuIHRoaXMuaGFzaChlLnNsaWNlKDEpKSwhMDt2YXIgZixnOyhmPXphKGIsZCkpIT09dD8oZz1mLGc9KGY9emEoYSxmKSkhPT10P2MrKHphKCIvIixmKXx8Zik6YitnKTooZj16YShjLGQpKSE9PXQ/Zz1jK2Y6Yz09ZCsiLyImJihnPWMpO2cmJnRoaXMuJCRwYXJzZShnKTtyZXR1cm4hIWd9fWZ1bmN0aW9uIGRjKGIsYSl7dmFyIGM9YmMoYik7JGMoYix0aGlzKTt0aGlzLiQkcGFyc2U9ZnVuY3Rpb24oZCl7ZD0NCi16YShiLGQpfHx6YShjLGQpO3ZhciBlOyIjIj09PWQuY2hhckF0KDApPyhlPXphKGEsZCksRChlKSYmKGU9ZCkpOmU9dGhpcy4kJGh0bWw1P2Q6IiI7YWQoZSx0aGlzKTtkPXRoaXMuJCRwYXRoO3ZhciBmPS9eXC9bQS1aXTooXC8uKikvOzA9PT1lLmluZGV4T2YoYikmJihlPWUucmVwbGFjZShiLCIiKSk7Zi5leGVjKGUpfHwoZD0oZT1mLmV4ZWMoZCkpP2VbMV06ZCk7dGhpcy4kJHBhdGg9ZDt0aGlzLiQkY29tcG9zZSgpfTt0aGlzLiQkY29tcG9zZT1mdW5jdGlvbigpe3ZhciBjPU5iKHRoaXMuJCRzZWFyY2gpLGU9dGhpcy4kJGhhc2g/IiMiK3FiKHRoaXMuJCRoYXNoKToiIjt0aGlzLiQkdXJsPWFjKHRoaXMuJCRwYXRoKSsoYz8iPyIrYzoiIikrZTt0aGlzLiQkYWJzVXJsPWIrKHRoaXMuJCR1cmw/YSt0aGlzLiQkdXJsOiIiKX07dGhpcy4kJHBhcnNlTGlua1VybD1mdW5jdGlvbihhLGMpe3JldHVybiBIYShiKT09SGEoYSk/KHRoaXMuJCRwYXJzZShhKSwhMCk6ITF9fWZ1bmN0aW9uIGNkKGIsDQotYSl7dGhpcy4kJGh0bWw1PSEwO2RjLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYz1iYyhiKTt0aGlzLiQkcGFyc2VMaW5rVXJsPWZ1bmN0aW9uKGQsZSl7aWYoZSYmIiMiPT09ZVswXSlyZXR1cm4gdGhpcy5oYXNoKGUuc2xpY2UoMSkpLCEwO3ZhciBmLGc7Yj09SGEoZCk/Zj1kOihnPXphKGMsZCkpP2Y9YithK2c6Yz09PWQrIi8iJiYoZj1jKTtmJiZ0aGlzLiQkcGFyc2UoZik7cmV0dXJuISFmfTt0aGlzLiQkY29tcG9zZT1mdW5jdGlvbigpe3ZhciBjPU5iKHRoaXMuJCRzZWFyY2gpLGU9dGhpcy4kJGhhc2g/IiMiK3FiKHRoaXMuJCRoYXNoKToiIjt0aGlzLiQkdXJsPWFjKHRoaXMuJCRwYXRoKSsoYz8iPyIrYzoiIikrZTt0aGlzLiQkYWJzVXJsPWIrYSt0aGlzLiQkdXJsfX1mdW5jdGlvbiBHYihiKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tiXX19ZnVuY3Rpb24gZGQoYixhKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoRChjKSlyZXR1cm4gdGhpc1tiXTt0aGlzW2JdPQ0KLWEoYyk7dGhpcy4kJGNvbXBvc2UoKTtyZXR1cm4gdGhpc319ZnVuY3Rpb24gTWUoKXt2YXIgYj0iIixhPXtlbmFibGVkOiExLHJlcXVpcmVCYXNlOiEwLHJld3JpdGVMaW5rczohMH07dGhpcy5oYXNoUHJlZml4PWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPyhiPWEsdGhpcyk6Yn07dGhpcy5odG1sNU1vZGU9ZnVuY3Rpb24oYil7cmV0dXJuIFdhKGIpPyhhLmVuYWJsZWQ9Yix0aGlzKTpIKGIpPyhXYShiLmVuYWJsZWQpJiYoYS5lbmFibGVkPWIuZW5hYmxlZCksV2EoYi5yZXF1aXJlQmFzZSkmJihhLnJlcXVpcmVCYXNlPWIucmVxdWlyZUJhc2UpLFdhKGIucmV3cml0ZUxpbmtzKSYmKGEucmV3cml0ZUxpbmtzPWIucmV3cml0ZUxpbmtzKSx0aGlzKTphfTt0aGlzLiRnZXQ9WyIkcm9vdFNjb3BlIiwiJGJyb3dzZXIiLCIkc25pZmZlciIsIiRyb290RWxlbWVudCIsIiR3aW5kb3ciLGZ1bmN0aW9uKGMsZCxlLGYsZyl7ZnVuY3Rpb24gaChhLGIsYyl7dmFyIGU9ay51cmwoKSxmPWsuJCRzdGF0ZTsNCi10cnl7ZC51cmwoYSxiLGMpLGsuJCRzdGF0ZT1kLnN0YXRlKCl9Y2F0Y2goZyl7dGhyb3cgay51cmwoZSksay4kJHN0YXRlPWYsZzt9fWZ1bmN0aW9uIGwoYSxiKXtjLiRicm9hZGNhc3QoIiRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3MiLGsuYWJzVXJsKCksYSxrLiQkc3RhdGUsYil9dmFyIGssbTttPWQuYmFzZUhyZWYoKTt2YXIgcD1kLnVybCgpLHE7aWYoYS5lbmFibGVkKXtpZighbSYmYS5yZXF1aXJlQmFzZSl0aHJvdyBGYigibm9iYXNlIik7cT1wLnN1YnN0cmluZygwLHAuaW5kZXhPZigiLyIscC5pbmRleE9mKCIvLyIpKzIpKSsobXx8Ii8iKTttPWUuaGlzdG9yeT9jYzpjZH1lbHNlIHE9SGEocCksbT1kYztrPW5ldyBtKHEsIiMiK2IpO2suJCRwYXJzZUxpbmtVcmwocCxwKTtrLiQkc3RhdGU9ZC5zdGF0ZSgpO3ZhciB1PS9eXHMqKGphdmFzY3JpcHR8bWFpbHRvKTovaTtmLm9uKCJjbGljayIsZnVuY3Rpb24oYil7aWYoYS5yZXdyaXRlTGlua3MmJiFiLmN0cmxLZXkmJiFiLm1ldGFLZXkmJg0KLTIhPWIud2hpY2gpe2Zvcih2YXIgZT1CKGIudGFyZ2V0KTsiYSIhPT11YShlWzBdKTspaWYoZVswXT09PWZbMF18fCEoZT1lLnBhcmVudCgpKVswXSlyZXR1cm47dmFyIGg9ZS5wcm9wKCJocmVmIiksbD1lLmF0dHIoImhyZWYiKXx8ZS5hdHRyKCJ4bGluazpocmVmIik7SChoKSYmIltvYmplY3QgU1ZHQW5pbWF0ZWRTdHJpbmddIj09PWgudG9TdHJpbmcoKSYmKGg9QmEoaC5hbmltVmFsKS5ocmVmKTt1LnRlc3QoaCl8fCFofHxlLmF0dHIoInRhcmdldCIpfHxiLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwhay4kJHBhcnNlTGlua1VybChoLGwpfHwoYi5wcmV2ZW50RGVmYXVsdCgpLGsuYWJzVXJsKCkhPWQudXJsKCkmJihjLiRhcHBseSgpLGcuYW5ndWxhclsiZmYtNjg0MjA4LXByZXZlbnREZWZhdWx0Il09ITApKX19KTtrLmFic1VybCgpIT1wJiZkLnVybChrLmFic1VybCgpLCEwKTt2YXIgcj0hMDtkLm9uVXJsQ2hhbmdlKGZ1bmN0aW9uKGEsYil7Yy4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7dmFyIGQ9DQotay5hYnNVcmwoKSxlPWsuJCRzdGF0ZSxmO2suJCRwYXJzZShhKTtrLiQkc3RhdGU9YjtmPWMuJGJyb2FkY2FzdCgiJGxvY2F0aW9uQ2hhbmdlU3RhcnQiLGEsZCxiLGUpLmRlZmF1bHRQcmV2ZW50ZWQ7ay5hYnNVcmwoKT09PWEmJihmPyhrLiQkcGFyc2UoZCksay4kJHN0YXRlPWUsaChkLCExLGUpKToocj0hMSxsKGQsZSkpKX0pO2MuJCRwaGFzZXx8Yy4kZGlnZXN0KCl9KTtjLiR3YXRjaChmdW5jdGlvbigpe3ZhciBhPWJkKGQudXJsKCkpLGI9YmQoay5hYnNVcmwoKSksZj1kLnN0YXRlKCksZz1rLiQkcmVwbGFjZSxxPWEhPT1ifHxrLiQkaHRtbDUmJmUuaGlzdG9yeSYmZiE9PWsuJCRzdGF0ZTtpZihyfHxxKXI9ITEsYy4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7dmFyIGI9ay5hYnNVcmwoKSxkPWMuJGJyb2FkY2FzdCgiJGxvY2F0aW9uQ2hhbmdlU3RhcnQiLGIsYSxrLiQkc3RhdGUsZikuZGVmYXVsdFByZXZlbnRlZDtrLmFic1VybCgpPT09YiYmKGQ/KGsuJCRwYXJzZShhKSxrLiQkc3RhdGU9DQotZik6KHEmJmgoYixnLGY9PT1rLiQkc3RhdGU/bnVsbDprLiQkc3RhdGUpLGwoYSxmKSkpfSk7ay4kJHJlcGxhY2U9ITF9KTtyZXR1cm4ga31dfWZ1bmN0aW9uIE5lKCl7dmFyIGI9ITAsYT10aGlzO3RoaXMuZGVidWdFbmFibGVkPWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPyhiPWEsdGhpcyk6Yn07dGhpcy4kZ2V0PVsiJHdpbmRvdyIsZnVuY3Rpb24oYyl7ZnVuY3Rpb24gZChhKXthIGluc3RhbmNlb2YgRXJyb3ImJihhLnN0YWNrP2E9YS5tZXNzYWdlJiYtMT09PWEuc3RhY2suaW5kZXhPZihhLm1lc3NhZ2UpPyJFcnJvcjogIithLm1lc3NhZ2UrIlxuIithLnN0YWNrOmEuc3RhY2s6YS5zb3VyY2VVUkwmJihhPWEubWVzc2FnZSsiXG4iK2Euc291cmNlVVJMKyI6IithLmxpbmUpKTtyZXR1cm4gYX1mdW5jdGlvbiBlKGEpe3ZhciBiPWMuY29uc29sZXx8e30sZT1iW2FdfHxiLmxvZ3x8QzthPSExO3RyeXthPSEhZS5hcHBseX1jYXRjaChsKXt9cmV0dXJuIGE/ZnVuY3Rpb24oKXt2YXIgYT0NCi1bXTtzKGFyZ3VtZW50cyxmdW5jdGlvbihiKXthLnB1c2goZChiKSl9KTtyZXR1cm4gZS5hcHBseShiLGEpfTpmdW5jdGlvbihhLGIpe2UoYSxudWxsPT1iPyIiOmIpfX1yZXR1cm57bG9nOmUoImxvZyIpLGluZm86ZSgiaW5mbyIpLHdhcm46ZSgid2FybiIpLGVycm9yOmUoImVycm9yIiksZGVidWc6ZnVuY3Rpb24oKXt2YXIgYz1lKCJkZWJ1ZyIpO3JldHVybiBmdW5jdGlvbigpe2ImJmMuYXBwbHkoYSxhcmd1bWVudHMpfX0oKX19XX1mdW5jdGlvbiBzYShiLGEpe2lmKCJfX2RlZmluZUdldHRlcl9fIj09PWJ8fCJfX2RlZmluZVNldHRlcl9fIj09PWJ8fCJfX2xvb2t1cEdldHRlcl9fIj09PWJ8fCJfX2xvb2t1cFNldHRlcl9fIj09PWJ8fCJfX3Byb3RvX18iPT09Yil0aHJvdyBsYSgiaXNlY2ZsZCIsYSk7cmV0dXJuIGJ9ZnVuY3Rpb24gdGEoYixhKXtpZihiKXtpZihiLmNvbnN0cnVjdG9yPT09Yil0aHJvdyBsYSgiaXNlY2ZuIixhKTtpZihiLndpbmRvdz09PWIpdGhyb3cgbGEoImlzZWN3aW5kb3ciLA0KLWEpO2lmKGIuY2hpbGRyZW4mJihiLm5vZGVOYW1lfHxiLnByb3AmJmIuYXR0ciYmYi5maW5kKSl0aHJvdyBsYSgiaXNlY2RvbSIsYSk7aWYoYj09PU9iamVjdCl0aHJvdyBsYSgiaXNlY29iaiIsYSk7fXJldHVybiBifWZ1bmN0aW9uIGVjKGIpe3JldHVybiBiLmNvbnN0YW50fWZ1bmN0aW9uIGdiKGIsYSxjLGQpe3RhKGIsZCk7YT1hLnNwbGl0KCIuIik7Zm9yKHZhciBlLGY9MDsxPGEubGVuZ3RoO2YrKyl7ZT1zYShhLnNoaWZ0KCksZCk7dmFyIGc9dGEoYltlXSxkKTtnfHwoZz17fSxiW2VdPWcpO2I9Z31lPXNhKGEuc2hpZnQoKSxkKTt0YShiW2VdLGQpO3JldHVybiBiW2VdPWN9ZnVuY3Rpb24gUWEoYil7cmV0dXJuImNvbnN0cnVjdG9yIj09Yn1mdW5jdGlvbiBlZChiLGEsYyxkLGUsZixnKXtzYShiLGYpO3NhKGEsZik7c2EoYyxmKTtzYShkLGYpO3NhKGUsZik7dmFyIGg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRhKGEsZil9LGw9Z3x8UWEoYik/aDpvYSxrPWd8fFFhKGEpP2g6b2EsbT0NCi1nfHxRYShjKT9oOm9hLHA9Z3x8UWEoZCk/aDpvYSxxPWd8fFFhKGUpP2g6b2E7cmV0dXJuIGZ1bmN0aW9uKGYsZyl7dmFyIGg9ZyYmZy5oYXNPd25Qcm9wZXJ0eShiKT9nOmY7aWYobnVsbD09aClyZXR1cm4gaDtoPWwoaFtiXSk7aWYoIWEpcmV0dXJuIGg7aWYobnVsbD09aClyZXR1cm4gdDtoPWsoaFthXSk7aWYoIWMpcmV0dXJuIGg7aWYobnVsbD09aClyZXR1cm4gdDtoPW0oaFtjXSk7aWYoIWQpcmV0dXJuIGg7aWYobnVsbD09aClyZXR1cm4gdDtoPXAoaFtkXSk7cmV0dXJuIGU/bnVsbD09aD90Omg9cShoW2VdKTpofX1mdW5jdGlvbiB5ZihiLGEpe3JldHVybiBmdW5jdGlvbihjLGQpe3JldHVybiBiKGMsZCx0YSxhKX19ZnVuY3Rpb24gemYoYixhLGMpe3ZhciBkPWEuZXhwZW5zaXZlQ2hlY2tzLGU9ZD9BZjpCZixmPWVbYl07aWYoZilyZXR1cm4gZjt2YXIgZz1iLnNwbGl0KCIuIiksaD1nLmxlbmd0aDtpZihhLmNzcClmPTY+aD9lZChnWzBdLGdbMV0sZ1syXSxnWzNdLGdbNF0sDQotYyxkKTpmdW5jdGlvbihhLGIpe3ZhciBlPTAsZjtkbyBmPWVkKGdbZSsrXSxnW2UrK10sZ1tlKytdLGdbZSsrXSxnW2UrK10sYyxkKShhLGIpLGI9dCxhPWY7d2hpbGUoZTxoKTtyZXR1cm4gZn07ZWxzZXt2YXIgbD0iIjtkJiYobCs9InMgPSBlc28ocywgZmUpO1xubCA9IGVzbyhsLCBmZSk7XG4iKTt2YXIgaz1kO3MoZyxmdW5jdGlvbihhLGIpe3NhKGEsYyk7dmFyIGU9KGI/InMiOicoKGwmJmwuaGFzT3duUHJvcGVydHkoIicrYSsnIikpP2w6cyknKSsiLiIrYTtpZihkfHxRYShhKSllPSJlc28oIitlKyIsIGZlKSIsaz0hMDtsKz0iaWYocyA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xucz0iK2UrIjtcbiJ9KTtsKz0icmV0dXJuIHM7IjthPW5ldyBGdW5jdGlvbigicyIsImwiLCJlc28iLCJmZSIsbCk7YS50b1N0cmluZz1kYShsKTtrJiYoYT15ZihhLGMpKTtmPWF9Zi5zaGFyZWRHZXR0ZXI9ITA7Zi5hc3NpZ249ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZ2IoYSxiLGMsYil9O3JldHVybiBlW2JdPQ0KLWZ9ZnVuY3Rpb24gZmMoYil7cmV0dXJuIEcoYi52YWx1ZU9mKT9iLnZhbHVlT2YoKTpDZi5jYWxsKGIpfWZ1bmN0aW9uIE9lKCl7dmFyIGI9aGEoKSxhPWhhKCk7dGhpcy4kZ2V0PVsiJGZpbHRlciIsIiRzbmlmZmVyIixmdW5jdGlvbihjLGQpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9YTthLnNoYXJlZEdldHRlciYmKGI9ZnVuY3Rpb24oYixjKXtyZXR1cm4gYShiLGMpfSxiLmxpdGVyYWw9YS5saXRlcmFsLGIuY29uc3RhbnQ9YS5jb25zdGFudCxiLmFzc2lnbj1hLmFzc2lnbik7cmV0dXJuIGJ9ZnVuY3Rpb24gZihhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyl7dmFyIGU9YVtjXTtlLmNvbnN0YW50fHwoZS5pbnB1dHM/ZihlLmlucHV0cyxiKTotMT09PWIuaW5kZXhPZihlKSYmYi5wdXNoKGUpKX1yZXR1cm4gYn1mdW5jdGlvbiBnKGEsYil7cmV0dXJuIG51bGw9PWF8fG51bGw9PWI/YT09PWI6Im9iamVjdCI9PT10eXBlb2YgYSYmKGE9ZmMoYSksIm9iamVjdCI9PT10eXBlb2YgYSk/DQotITE6YT09PWJ8fGEhPT1hJiZiIT09Yn1mdW5jdGlvbiBoKGEsYixjLGQpe3ZhciBlPWQuJCRpbnB1dHN8fChkLiQkaW5wdXRzPWYoZC5pbnB1dHMsW10pKSxoO2lmKDE9PT1lLmxlbmd0aCl7dmFyIGw9ZyxlPWVbMF07cmV0dXJuIGEuJHdhdGNoKGZ1bmN0aW9uKGEpe3ZhciBiPWUoYSk7ZyhiLGwpfHwoaD1kKGEpLGw9YiYmZmMoYikpO3JldHVybiBofSxiLGMpfWZvcih2YXIgaz1bXSxxPTAscD1lLmxlbmd0aDtxPHA7cSsrKWtbcV09ZztyZXR1cm4gYS4kd2F0Y2goZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExLGM9MCxmPWUubGVuZ3RoO2M8ZjtjKyspe3ZhciBsPWVbY10oYSk7aWYoYnx8KGI9IWcobCxrW2NdKSkpa1tjXT1sJiZmYyhsKX1iJiYoaD1kKGEpKTtyZXR1cm4gaH0sYixjKX1mdW5jdGlvbiBsKGEsYixjLGQpe3ZhciBlLGY7cmV0dXJuIGU9YS4kd2F0Y2goZnVuY3Rpb24oYSl7cmV0dXJuIGQoYSl9LGZ1bmN0aW9uKGEsYyxkKXtmPWE7RyhiKSYmYi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7DQoteShhKSYmZC4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKXt5KGYpJiZlKCl9KX0sYyl9ZnVuY3Rpb24gayhhLGIsYyxkKXtmdW5jdGlvbiBlKGEpe3ZhciBiPSEwO3MoYSxmdW5jdGlvbihhKXt5KGEpfHwoYj0hMSl9KTtyZXR1cm4gYn12YXIgZixnO3JldHVybiBmPWEuJHdhdGNoKGZ1bmN0aW9uKGEpe3JldHVybiBkKGEpfSxmdW5jdGlvbihhLGMsZCl7Zz1hO0coYikmJmIuY2FsbCh0aGlzLGEsYyxkKTtlKGEpJiZkLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpe2UoZykmJmYoKX0pfSxjKX1mdW5jdGlvbiBtKGEsYixjLGQpe3ZhciBlO3JldHVybiBlPWEuJHdhdGNoKGZ1bmN0aW9uKGEpe3JldHVybiBkKGEpfSxmdW5jdGlvbihhLGMsZCl7RyhiKSYmYi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSgpfSxjKX1mdW5jdGlvbiBwKGEsYil7aWYoIWIpcmV0dXJuIGE7dmFyIGM9YS4kJHdhdGNoRGVsZWdhdGUsYz1jIT09ayYmYyE9PWw/ZnVuY3Rpb24oYyxkKXt2YXIgZT1hKGMsZCk7cmV0dXJuIGIoZSwNCi1jLGQpfTpmdW5jdGlvbihjLGQpe3ZhciBlPWEoYyxkKSxmPWIoZSxjLGQpO3JldHVybiB5KGUpP2Y6ZX07YS4kJHdhdGNoRGVsZWdhdGUmJmEuJCR3YXRjaERlbGVnYXRlIT09aD9jLiQkd2F0Y2hEZWxlZ2F0ZT1hLiQkd2F0Y2hEZWxlZ2F0ZTpiLiRzdGF0ZWZ1bHx8KGMuJCR3YXRjaERlbGVnYXRlPWgsYy5pbnB1dHM9W2FdKTtyZXR1cm4gY312YXIgcT17Y3NwOmQuY3NwLGV4cGVuc2l2ZUNoZWNrczohMX0sdT17Y3NwOmQuY3NwLGV4cGVuc2l2ZUNoZWNrczohMH07cmV0dXJuIGZ1bmN0aW9uKGQsZixnKXt2YXIgdix3LEw7c3dpdGNoKHR5cGVvZiBkKXtjYXNlICJzdHJpbmciOkw9ZD1kLnRyaW0oKTt2YXIgSj1nP2E6Yjt2PUpbTF07dnx8KCI6Ij09PWQuY2hhckF0KDApJiYiOiI9PT1kLmNoYXJBdCgxKSYmKHc9ITAsZD1kLnN1YnN0cmluZygyKSksZz1nP3U6cSx2PW5ldyBnYyhnKSx2PShuZXcgaGIodixjLGcpKS5wYXJzZShkKSx2LmNvbnN0YW50P3YuJCR3YXRjaERlbGVnYXRlPQ0KLW06dz8odj1lKHYpLHYuJCR3YXRjaERlbGVnYXRlPXYubGl0ZXJhbD9rOmwpOnYuaW5wdXRzJiYodi4kJHdhdGNoRGVsZWdhdGU9aCksSltMXT12KTtyZXR1cm4gcCh2LGYpO2Nhc2UgImZ1bmN0aW9uIjpyZXR1cm4gcChkLGYpO2RlZmF1bHQ6cmV0dXJuIHAoQyxmKX19fV19ZnVuY3Rpb24gUWUoKXt0aGlzLiRnZXQ9WyIkcm9vdFNjb3BlIiwiJGV4Y2VwdGlvbkhhbmRsZXIiLGZ1bmN0aW9uKGIsYSl7cmV0dXJuIGZkKGZ1bmN0aW9uKGEpe2IuJGV2YWxBc3luYyhhKX0sYSl9XX1mdW5jdGlvbiBSZSgpe3RoaXMuJGdldD1bIiRicm93c2VyIiwiJGV4Y2VwdGlvbkhhbmRsZXIiLGZ1bmN0aW9uKGIsYSl7cmV0dXJuIGZkKGZ1bmN0aW9uKGEpe2IuZGVmZXIoYSl9LGEpfV19ZnVuY3Rpb24gZmQoYixhKXtmdW5jdGlvbiBjKGEsYixjKXtmdW5jdGlvbiBkKGIpe3JldHVybiBmdW5jdGlvbihjKXtlfHwoZT0hMCxiLmNhbGwoYSxjKSl9fXZhciBlPSExO3JldHVybltkKGIpLGQoYyldfWZ1bmN0aW9uIGQoKXt0aGlzLiQkc3RhdGU9DQote3N0YXR1czowfX1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2IuY2FsbChhLGMpfX1mdW5jdGlvbiBmKGMpeyFjLnByb2Nlc3NTY2hlZHVsZWQmJmMucGVuZGluZyYmKGMucHJvY2Vzc1NjaGVkdWxlZD0hMCxiKGZ1bmN0aW9uKCl7dmFyIGIsZCxlO2U9Yy5wZW5kaW5nO2MucHJvY2Vzc1NjaGVkdWxlZD0hMTtjLnBlbmRpbmc9dDtmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2Y8ZzsrK2Ype2Q9ZVtmXVswXTtiPWVbZl1bYy5zdGF0dXNdO3RyeXtHKGIpP2QucmVzb2x2ZShiKGMudmFsdWUpKToxPT09Yy5zdGF0dXM/ZC5yZXNvbHZlKGMudmFsdWUpOmQucmVqZWN0KGMudmFsdWUpfWNhdGNoKGgpe2QucmVqZWN0KGgpLGEoaCl9fX0pKX1mdW5jdGlvbiBnKCl7dGhpcy5wcm9taXNlPW5ldyBkO3RoaXMucmVzb2x2ZT1lKHRoaXMsdGhpcy5yZXNvbHZlKTt0aGlzLnJlamVjdD1lKHRoaXMsdGhpcy5yZWplY3QpO3RoaXMubm90aWZ5PWUodGhpcyx0aGlzLm5vdGlmeSl9dmFyIGg9DQotVCgiJHEiLFR5cGVFcnJvcik7ZC5wcm90b3R5cGU9e3RoZW46ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW5ldyBnO3RoaXMuJCRzdGF0ZS5wZW5kaW5nPXRoaXMuJCRzdGF0ZS5wZW5kaW5nfHxbXTt0aGlzLiQkc3RhdGUucGVuZGluZy5wdXNoKFtkLGEsYixjXSk7MDx0aGlzLiQkc3RhdGUuc3RhdHVzJiZmKHRoaXMuJCRzdGF0ZSk7cmV0dXJuIGQucHJvbWlzZX0sImNhdGNoIjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9LCJmaW5hbGx5IjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oYil7cmV0dXJuIGsoYiwhMCxhKX0sZnVuY3Rpb24oYil7cmV0dXJuIGsoYiwhMSxhKX0sYil9fTtnLnByb3RvdHlwZT17cmVzb2x2ZTpmdW5jdGlvbihhKXt0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXN8fChhPT09dGhpcy5wcm9taXNlP3RoaXMuJCRyZWplY3QoaCgicWN5Y2xlIixhKSk6dGhpcy4kJHJlc29sdmUoYSkpfSwkJHJlc29sdmU6ZnVuY3Rpb24oYil7dmFyIGQsDQotZTtlPWModGhpcyx0aGlzLiQkcmVzb2x2ZSx0aGlzLiQkcmVqZWN0KTt0cnl7aWYoSChiKXx8RyhiKSlkPWImJmIudGhlbjtHKGQpPyh0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXM9LTEsZC5jYWxsKGIsZVswXSxlWzFdLHRoaXMubm90aWZ5KSk6KHRoaXMucHJvbWlzZS4kJHN0YXRlLnZhbHVlPWIsdGhpcy5wcm9taXNlLiQkc3RhdGUuc3RhdHVzPTEsZih0aGlzLnByb21pc2UuJCRzdGF0ZSkpfWNhdGNoKGcpe2VbMV0oZyksYShnKX19LHJlamVjdDpmdW5jdGlvbihhKXt0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXN8fHRoaXMuJCRyZWplY3QoYSl9LCQkcmVqZWN0OmZ1bmN0aW9uKGEpe3RoaXMucHJvbWlzZS4kJHN0YXRlLnZhbHVlPWE7dGhpcy5wcm9taXNlLiQkc3RhdGUuc3RhdHVzPTI7Zih0aGlzLnByb21pc2UuJCRzdGF0ZSl9LG5vdGlmeTpmdW5jdGlvbihjKXt2YXIgZD10aGlzLnByb21pc2UuJCRzdGF0ZS5wZW5kaW5nOzA+PXRoaXMucHJvbWlzZS4kJHN0YXRlLnN0YXR1cyYmDQotZCYmZC5sZW5ndGgmJmIoZnVuY3Rpb24oKXtmb3IodmFyIGIsZSxmPTAsZz1kLmxlbmd0aDtmPGc7ZisrKXtlPWRbZl1bMF07Yj1kW2ZdWzNdO3RyeXtlLm5vdGlmeShHKGIpP2IoYyk6Yyl9Y2F0Y2goaCl7YShoKX19fSl9fTt2YXIgbD1mdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBnO2I/Yy5yZXNvbHZlKGEpOmMucmVqZWN0KGEpO3JldHVybiBjLnByb21pc2V9LGs9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW51bGw7dHJ5e0coYykmJihkPWMoKSl9Y2F0Y2goZSl7cmV0dXJuIGwoZSwhMSl9cmV0dXJuIGQmJkcoZC50aGVuKT9kLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gbChhLGIpfSxmdW5jdGlvbihhKXtyZXR1cm4gbChhLCExKX0pOmwoYSxiKX0sbT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uZXcgZztlLnJlc29sdmUoYSk7cmV0dXJuIGUucHJvbWlzZS50aGVuKGIsYyxkKX0scD1mdW5jdGlvbiB1KGEpe2lmKCFHKGEpKXRocm93IGgoIm5vcnNsdnIiLGEpO2lmKCEodGhpcyBpbnN0YW5jZW9mDQotdSkpcmV0dXJuIG5ldyB1KGEpO3ZhciBiPW5ldyBnO2EoZnVuY3Rpb24oYSl7Yi5yZXNvbHZlKGEpfSxmdW5jdGlvbihhKXtiLnJlamVjdChhKX0pO3JldHVybiBiLnByb21pc2V9O3AuZGVmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGd9O3AucmVqZWN0PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBnO2IucmVqZWN0KGEpO3JldHVybiBiLnByb21pc2V9O3Aud2hlbj1tO3AuYWxsPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBnLGM9MCxkPXgoYSk/W106e307cyhhLGZ1bmN0aW9uKGEsZSl7YysrO20oYSkudGhlbihmdW5jdGlvbihhKXtkLmhhc093blByb3BlcnR5KGUpfHwoZFtlXT1hLC0tY3x8Yi5yZXNvbHZlKGQpKX0sZnVuY3Rpb24oYSl7ZC5oYXNPd25Qcm9wZXJ0eShlKXx8Yi5yZWplY3QoYSl9KX0pOzA9PT1jJiZiLnJlc29sdmUoZCk7cmV0dXJuIGIucHJvbWlzZX07cmV0dXJuIHB9ZnVuY3Rpb24gJGUoKXt0aGlzLiRnZXQ9WyIkd2luZG93IiwiJHRpbWVvdXQiLGZ1bmN0aW9uKGIsDQotYSl7dmFyIGM9Yi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGIud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lLGQ9Yi5jYW5jZWxBbmltYXRpb25GcmFtZXx8Yi53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZXx8Yi53ZWJraXRDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUsZT0hIWMsZj1lP2Z1bmN0aW9uKGEpe3ZhciBiPWMoYSk7cmV0dXJuIGZ1bmN0aW9uKCl7ZChiKX19OmZ1bmN0aW9uKGIpe3ZhciBjPWEoYiwxNi42NiwhMSk7cmV0dXJuIGZ1bmN0aW9uKCl7YS5jYW5jZWwoYyl9fTtmLnN1cHBvcnRlZD1lO3JldHVybiBmfV19ZnVuY3Rpb24gUGUoKXt2YXIgYj0xMCxhPVQoIiRyb290U2NvcGUiKSxjPW51bGwsZD1udWxsO3RoaXMuZGlnZXN0VHRsPWZ1bmN0aW9uKGEpe2FyZ3VtZW50cy5sZW5ndGgmJihiPWEpO3JldHVybiBifTt0aGlzLiRnZXQ9WyIkaW5qZWN0b3IiLCIkZXhjZXB0aW9uSGFuZGxlciIsIiRwYXJzZSIsIiRicm93c2VyIixmdW5jdGlvbihlLGYsZyxoKXtmdW5jdGlvbiBsKCl7dGhpcy4kaWQ9DQotKytuYjt0aGlzLiQkcGhhc2U9dGhpcy4kcGFyZW50PXRoaXMuJCR3YXRjaGVycz10aGlzLiQkbmV4dFNpYmxpbmc9dGhpcy4kJHByZXZTaWJsaW5nPXRoaXMuJCRjaGlsZEhlYWQ9dGhpcy4kJGNoaWxkVGFpbD1udWxsO3RoaXMuJHJvb3Q9dGhpczt0aGlzLiQkZGVzdHJveWVkPSExO3RoaXMuJCRsaXN0ZW5lcnM9e307dGhpcy4kJGxpc3RlbmVyQ291bnQ9e307dGhpcy4kJGlzb2xhdGVCaW5kaW5ncz1udWxsfWZ1bmN0aW9uIGsoYil7aWYoci4kJHBoYXNlKXRocm93IGEoImlucHJvZyIsci4kJHBoYXNlKTtyLiQkcGhhc2U9Yn1mdW5jdGlvbiBtKGEsYixjKXtkbyBhLiQkbGlzdGVuZXJDb3VudFtjXS09YiwwPT09YS4kJGxpc3RlbmVyQ291bnRbY10mJmRlbGV0ZSBhLiQkbGlzdGVuZXJDb3VudFtjXTt3aGlsZShhPWEuJHBhcmVudCl9ZnVuY3Rpb24gcCgpe31mdW5jdGlvbiBxKCl7Zm9yKDt2Lmxlbmd0aDspdHJ5e3Yuc2hpZnQoKSgpfWNhdGNoKGEpe2YoYSl9ZD1udWxsfWZ1bmN0aW9uIHUoKXtudWxsPT09DQotZCYmKGQ9aC5kZWZlcihmdW5jdGlvbigpe3IuJGFwcGx5KHEpfSkpfWwucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpsLCRuZXc6ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKCl7ZC4kJGRlc3Ryb3llZD0hMH12YXIgZDtiPWJ8fHRoaXM7YT8oZD1uZXcgbCxkLiRyb290PXRoaXMuJHJvb3QpOih0aGlzLiQkQ2hpbGRTY29wZXx8KHRoaXMuJCRDaGlsZFNjb3BlPWZ1bmN0aW9uKCl7dGhpcy4kJHdhdGNoZXJzPXRoaXMuJCRuZXh0U2libGluZz10aGlzLiQkY2hpbGRIZWFkPXRoaXMuJCRjaGlsZFRhaWw9bnVsbDt0aGlzLiQkbGlzdGVuZXJzPXt9O3RoaXMuJCRsaXN0ZW5lckNvdW50PXt9O3RoaXMuJGlkPSsrbmI7dGhpcy4kJENoaWxkU2NvcGU9bnVsbH0sdGhpcy4kJENoaWxkU2NvcGUucHJvdG90eXBlPXRoaXMpLGQ9bmV3IHRoaXMuJCRDaGlsZFNjb3BlKTtkLiRwYXJlbnQ9YjtkLiQkcHJldlNpYmxpbmc9Yi4kJGNoaWxkVGFpbDtiLiQkY2hpbGRIZWFkPyhiLiQkY2hpbGRUYWlsLiQkbmV4dFNpYmxpbmc9DQotZCxiLiQkY2hpbGRUYWlsPWQpOmIuJCRjaGlsZEhlYWQ9Yi4kJGNoaWxkVGFpbD1kOyhhfHxiIT10aGlzKSYmZC4kb24oIiRkZXN0cm95IixjKTtyZXR1cm4gZH0sJHdhdGNoOmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1nKGEpO2lmKGUuJCR3YXRjaERlbGVnYXRlKXJldHVybiBlLiQkd2F0Y2hEZWxlZ2F0ZSh0aGlzLGIsZCxlKTt2YXIgZj10aGlzLiQkd2F0Y2hlcnMsaD17Zm46YixsYXN0OnAsZ2V0OmUsZXhwOmEsZXE6ISFkfTtjPW51bGw7RyhiKXx8KGguZm49Qyk7Znx8KGY9dGhpcy4kJHdhdGNoZXJzPVtdKTtmLnVuc2hpZnQoaCk7cmV0dXJuIGZ1bmN0aW9uKCl7WGEoZixoKTtjPW51bGx9fSwkd2F0Y2hHcm91cDpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXtoPSExO2w/KGw9ITEsYihlLGUsZykpOmIoZSxkLGcpfXZhciBkPUFycmF5KGEubGVuZ3RoKSxlPUFycmF5KGEubGVuZ3RoKSxmPVtdLGc9dGhpcyxoPSExLGw9ITA7aWYoIWEubGVuZ3RoKXt2YXIgaz0hMDtnLiRldmFsQXN5bmMoZnVuY3Rpb24oKXtrJiYNCi1iKGUsZSxnKX0pO3JldHVybiBmdW5jdGlvbigpe2s9ITF9fWlmKDE9PT1hLmxlbmd0aClyZXR1cm4gdGhpcy4kd2F0Y2goYVswXSxmdW5jdGlvbihhLGMsZil7ZVswXT1hO2RbMF09YztiKGUsYT09PWM/ZTpkLGYpfSk7cyhhLGZ1bmN0aW9uKGEsYil7dmFyIGw9Zy4kd2F0Y2goYSxmdW5jdGlvbihhLGYpe2VbYl09YTtkW2JdPWY7aHx8KGg9ITAsZy4kZXZhbEFzeW5jKGMpKX0pO2YucHVzaChsKX0pO3JldHVybiBmdW5jdGlvbigpe2Zvcig7Zi5sZW5ndGg7KWYuc2hpZnQoKSgpfX0sJHdhdGNoQ29sbGVjdGlvbjpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7ZT1hO3ZhciBiLGQsZyxoO2lmKCFEKGUpKXtpZihIKGUpKWlmKFRhKGUpKWZvcihmIT09cSYmKGY9cSx1PWYubGVuZ3RoPTAsaysrKSxhPWUubGVuZ3RoLHUhPT1hJiYoaysrLGYubGVuZ3RoPXU9YSksYj0wO2I8YTtiKyspaD1mW2JdLGc9ZVtiXSxkPWghPT1oJiZnIT09ZyxkfHxoPT09Z3x8KGsrKyxmW2JdPWcpO2Vsc2V7ZiE9PQ0KLW0mJihmPW09e30sdT0wLGsrKyk7YT0wO2ZvcihiIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShiKSYmKGErKyxnPWVbYl0saD1mW2JdLGIgaW4gZj8oZD1oIT09aCYmZyE9PWcsZHx8aD09PWd8fChrKyssZltiXT1nKSk6KHUrKyxmW2JdPWcsaysrKSk7aWYodT5hKWZvcihiIGluIGsrKyxmKWUuaGFzT3duUHJvcGVydHkoYil8fCh1LS0sZGVsZXRlIGZbYl0pfWVsc2UgZiE9PWUmJihmPWUsaysrKTtyZXR1cm4ga319Yy4kc3RhdGVmdWw9ITA7dmFyIGQ9dGhpcyxlLGYsaCxsPTE8Yi5sZW5ndGgsaz0wLHA9ZyhhLGMpLHE9W10sbT17fSxuPSEwLHU9MDtyZXR1cm4gdGhpcy4kd2F0Y2gocCxmdW5jdGlvbigpe24/KG49ITEsYihlLGUsZCkpOmIoZSxoLGQpO2lmKGwpaWYoSChlKSlpZihUYShlKSl7aD1BcnJheShlLmxlbmd0aCk7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspaFthXT1lW2FdfWVsc2UgZm9yKGEgaW4gaD17fSxlKXJjLmNhbGwoZSxhKSYmKGhbYV09ZVthXSk7ZWxzZSBoPQ0KLWV9KX0sJGRpZ2VzdDpmdW5jdGlvbigpe3ZhciBlLGcsbCxtLHUsdixzPWIsdCxXPVtdLHksSTtrKCIkZGlnZXN0Iik7aC4kJGNoZWNrVXJsQ2hhbmdlKCk7dGhpcz09PXImJm51bGwhPT1kJiYoaC5kZWZlci5jYW5jZWwoZCkscSgpKTtjPW51bGw7ZG97dj0hMTtmb3IodD10aGlzO08ubGVuZ3RoOyl7dHJ5e0k9Ty5zaGlmdCgpLEkuc2NvcGUuJGV2YWwoSS5leHByZXNzaW9uLEkubG9jYWxzKX1jYXRjaChCKXtmKEIpfWM9bnVsbH1hOmRve2lmKG09dC4kJHdhdGNoZXJzKWZvcih1PW0ubGVuZ3RoO3UtLTspdHJ5e2lmKGU9bVt1XSlpZigoZz1lLmdldCh0KSkhPT0obD1lLmxhc3QpJiYhKGUuZXE/ZmEoZyxsKToibnVtYmVyIj09PXR5cGVvZiBnJiYibnVtYmVyIj09PXR5cGVvZiBsJiZpc05hTihnKSYmaXNOYU4obCkpKXY9ITAsYz1lLGUubGFzdD1lLmVxP0VhKGcsbnVsbCk6ZyxlLmZuKGcsbD09PXA/ZzpsLHQpLDU+cyYmKHk9NC1zLFdbeV18fChXW3ldPVtdKSxXW3ldLnB1c2goe21zZzpHKGUuZXhwKT8NCi0iZm46ICIrKGUuZXhwLm5hbWV8fGUuZXhwLnRvU3RyaW5nKCkpOmUuZXhwLG5ld1ZhbDpnLG9sZFZhbDpsfSkpO2Vsc2UgaWYoZT09PWMpe3Y9ITE7YnJlYWsgYX19Y2F0Y2goRCl7ZihEKX1pZighKG09dC4kJGNoaWxkSGVhZHx8dCE9PXRoaXMmJnQuJCRuZXh0U2libGluZykpZm9yKDt0IT09dGhpcyYmIShtPXQuJCRuZXh0U2libGluZyk7KXQ9dC4kcGFyZW50fXdoaWxlKHQ9bSk7aWYoKHZ8fE8ubGVuZ3RoKSYmIXMtLSl0aHJvdyByLiQkcGhhc2U9bnVsbCxhKCJpbmZkaWciLGIsVyk7fXdoaWxlKHZ8fE8ubGVuZ3RoKTtmb3Ioci4kJHBoYXNlPW51bGw7bi5sZW5ndGg7KXRyeXtuLnNoaWZ0KCkoKX1jYXRjaChjYSl7ZihjYSl9fSwkZGVzdHJveTpmdW5jdGlvbigpe2lmKCF0aGlzLiQkZGVzdHJveWVkKXt2YXIgYT10aGlzLiRwYXJlbnQ7dGhpcy4kYnJvYWRjYXN0KCIkZGVzdHJveSIpO3RoaXMuJCRkZXN0cm95ZWQ9ITA7aWYodGhpcyE9PXIpe2Zvcih2YXIgYiBpbiB0aGlzLiQkbGlzdGVuZXJDb3VudCltKHRoaXMsDQotdGhpcy4kJGxpc3RlbmVyQ291bnRbYl0sYik7YS4kJGNoaWxkSGVhZD09dGhpcyYmKGEuJCRjaGlsZEhlYWQ9dGhpcy4kJG5leHRTaWJsaW5nKTthLiQkY2hpbGRUYWlsPT10aGlzJiYoYS4kJGNoaWxkVGFpbD10aGlzLiQkcHJldlNpYmxpbmcpO3RoaXMuJCRwcmV2U2libGluZyYmKHRoaXMuJCRwcmV2U2libGluZy4kJG5leHRTaWJsaW5nPXRoaXMuJCRuZXh0U2libGluZyk7dGhpcy4kJG5leHRTaWJsaW5nJiYodGhpcy4kJG5leHRTaWJsaW5nLiQkcHJldlNpYmxpbmc9dGhpcy4kJHByZXZTaWJsaW5nKTt0aGlzLiRkZXN0cm95PXRoaXMuJGRpZ2VzdD10aGlzLiRhcHBseT10aGlzLiRldmFsQXN5bmM9dGhpcy4kYXBwbHlBc3luYz1DO3RoaXMuJG9uPXRoaXMuJHdhdGNoPXRoaXMuJHdhdGNoR3JvdXA9ZnVuY3Rpb24oKXtyZXR1cm4gQ307dGhpcy4kJGxpc3RlbmVycz17fTt0aGlzLiRwYXJlbnQ9dGhpcy4kJG5leHRTaWJsaW5nPXRoaXMuJCRwcmV2U2libGluZz10aGlzLiQkY2hpbGRIZWFkPQ0KLXRoaXMuJCRjaGlsZFRhaWw9dGhpcy4kcm9vdD10aGlzLiQkd2F0Y2hlcnM9bnVsbH19fSwkZXZhbDpmdW5jdGlvbihhLGIpe3JldHVybiBnKGEpKHRoaXMsYil9LCRldmFsQXN5bmM6ZnVuY3Rpb24oYSxiKXtyLiQkcGhhc2V8fE8ubGVuZ3RofHxoLmRlZmVyKGZ1bmN0aW9uKCl7Ty5sZW5ndGgmJnIuJGRpZ2VzdCgpfSk7Ty5wdXNoKHtzY29wZTp0aGlzLGV4cHJlc3Npb246YSxsb2NhbHM6Yn0pfSwkJHBvc3REaWdlc3Q6ZnVuY3Rpb24oYSl7bi5wdXNoKGEpfSwkYXBwbHk6ZnVuY3Rpb24oYSl7dHJ5e3JldHVybiBrKCIkYXBwbHkiKSx0aGlzLiRldmFsKGEpfWNhdGNoKGIpe2YoYil9ZmluYWxseXtyLiQkcGhhc2U9bnVsbDt0cnl7ci4kZGlnZXN0KCl9Y2F0Y2goYyl7dGhyb3cgZihjKSxjO319fSwkYXBwbHlBc3luYzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7Yy4kZXZhbChhKX12YXIgYz10aGlzO2EmJnYucHVzaChiKTt1KCl9LCRvbjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuJCRsaXN0ZW5lcnNbYV07DQotY3x8KHRoaXMuJCRsaXN0ZW5lcnNbYV09Yz1bXSk7Yy5wdXNoKGIpO3ZhciBkPXRoaXM7ZG8gZC4kJGxpc3RlbmVyQ291bnRbYV18fChkLiQkbGlzdGVuZXJDb3VudFthXT0wKSxkLiQkbGlzdGVuZXJDb3VudFthXSsrO3doaWxlKGQ9ZC4kcGFyZW50KTt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPWMuaW5kZXhPZihiKTstMSE9PWQmJihjW2RdPW51bGwsbShlLDEsYSkpfX0sJGVtaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkLGU9dGhpcyxnPSExLGg9e25hbWU6YSx0YXJnZXRTY29wZTplLHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe2c9ITB9LHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7aC5kZWZhdWx0UHJldmVudGVkPSEwfSxkZWZhdWx0UHJldmVudGVkOiExfSxsPVlhKFtoXSxhcmd1bWVudHMsMSksayxwO2Rve2Q9ZS4kJGxpc3RlbmVyc1thXXx8YztoLmN1cnJlbnRTY29wZT1lO2s9MDtmb3IocD1kLmxlbmd0aDtrPHA7aysrKWlmKGRba10pdHJ5e2Rba10uYXBwbHkobnVsbCwNCi1sKX1jYXRjaChtKXtmKG0pfWVsc2UgZC5zcGxpY2UoaywxKSxrLS0scC0tO2lmKGcpcmV0dXJuIGguY3VycmVudFNjb3BlPW51bGwsaDtlPWUuJHBhcmVudH13aGlsZShlKTtoLmN1cnJlbnRTY29wZT1udWxsO3JldHVybiBofSwkYnJvYWRjYXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxkPXRoaXMsZT17bmFtZTphLHRhcmdldFNjb3BlOnRoaXMscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXtlLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9LGRlZmF1bHRQcmV2ZW50ZWQ6ITF9O2lmKCF0aGlzLiQkbGlzdGVuZXJDb3VudFthXSlyZXR1cm4gZTtmb3IodmFyIGc9WWEoW2VdLGFyZ3VtZW50cywxKSxoLGw7Yz1kOyl7ZS5jdXJyZW50U2NvcGU9YztkPWMuJCRsaXN0ZW5lcnNbYV18fFtdO2g9MDtmb3IobD1kLmxlbmd0aDtoPGw7aCsrKWlmKGRbaF0pdHJ5e2RbaF0uYXBwbHkobnVsbCxnKX1jYXRjaChrKXtmKGspfWVsc2UgZC5zcGxpY2UoaCwxKSxoLS0sbC0tO2lmKCEoZD1jLiQkbGlzdGVuZXJDb3VudFthXSYmDQotYy4kJGNoaWxkSGVhZHx8YyE9PXRoaXMmJmMuJCRuZXh0U2libGluZykpZm9yKDtjIT09dGhpcyYmIShkPWMuJCRuZXh0U2libGluZyk7KWM9Yy4kcGFyZW50fWUuY3VycmVudFNjb3BlPW51bGw7cmV0dXJuIGV9fTt2YXIgcj1uZXcgbCxPPXIuJCRhc3luY1F1ZXVlPVtdLG49ci4kJHBvc3REaWdlc3RRdWV1ZT1bXSx2PXIuJCRhcHBseUFzeW5jUXVldWU9W107cmV0dXJuIHJ9XX1mdW5jdGlvbiBTZCgpe3ZhciBiPS9eXHMqKGh0dHBzP3xmdHB8bWFpbHRvfHRlbHxmaWxlKTovLGE9L15ccyooKGh0dHBzP3xmdHB8ZmlsZXxibG9iKTp8ZGF0YTppbWFnZVwvKS87dGhpcy5hSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdD1mdW5jdGlvbihhKXtyZXR1cm4geShhKT8oYj1hLHRoaXMpOmJ9O3RoaXMuaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0PWZ1bmN0aW9uKGIpe3JldHVybiB5KGIpPyhhPWIsdGhpcyk6YX07dGhpcy4kZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7dmFyIGU9DQotZD9hOmIsZjtmPUJhKGMpLmhyZWY7cmV0dXJuIiI9PT1mfHxmLm1hdGNoKGUpP2M6InVuc2FmZToiK2Z9fX1mdW5jdGlvbiBEZihiKXtpZigic2VsZiI9PT1iKXJldHVybiBiO2lmKEYoYikpe2lmKC0xPGIuaW5kZXhPZigiKioqIikpdGhyb3cgQ2EoIml3Y2FyZCIsYik7Yj1nZChiKS5yZXBsYWNlKCJcXCpcXCoiLCIuKiIpLnJlcGxhY2UoIlxcKiIsIlteOi8uPyY7XSoiKTtyZXR1cm4gbmV3IFJlZ0V4cCgiXiIrYisiJCIpfWlmKG9iKGIpKXJldHVybiBuZXcgUmVnRXhwKCJeIitiLnNvdXJjZSsiJCIpO3Rocm93IENhKCJpbWF0Y2hlciIpO31mdW5jdGlvbiBoZChiKXt2YXIgYT1bXTt5KGIpJiZzKGIsZnVuY3Rpb24oYil7YS5wdXNoKERmKGIpKX0pO3JldHVybiBhfWZ1bmN0aW9uIFRlKCl7dGhpcy5TQ0VfQ09OVEVYVFM9bWE7dmFyIGI9WyJzZWxmIl0sYT1bXTt0aGlzLnJlc291cmNlVXJsV2hpdGVsaXN0PWZ1bmN0aW9uKGEpe2FyZ3VtZW50cy5sZW5ndGgmJihiPWhkKGEpKTtyZXR1cm4gYn07DQotdGhpcy5yZXNvdXJjZVVybEJsYWNrbGlzdD1mdW5jdGlvbihiKXthcmd1bWVudHMubGVuZ3RoJiYoYT1oZChiKSk7cmV0dXJuIGF9O3RoaXMuJGdldD1bIiRpbmplY3RvciIsZnVuY3Rpb24oYyl7ZnVuY3Rpb24gZChhLGIpe3JldHVybiJzZWxmIj09PWE/WmMoYik6ISFhLmV4ZWMoYi5ocmVmKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWZ1bmN0aW9uKGEpe3RoaXMuJCR1bndyYXBUcnVzdGVkVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYX19O2EmJihiLnByb3RvdHlwZT1uZXcgYSk7Yi5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiQkdW53cmFwVHJ1c3RlZFZhbHVlKCl9O2IucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJCR1bndyYXBUcnVzdGVkVmFsdWUoKS50b1N0cmluZygpfTtyZXR1cm4gYn12YXIgZj1mdW5jdGlvbihhKXt0aHJvdyBDYSgidW5zYWZlIik7fTtjLmhhcygiJHNhbml0aXplIikmJihmPWMuZ2V0KCIkc2FuaXRpemUiKSk7DQotdmFyIGc9ZSgpLGg9e307aFttYS5IVE1MXT1lKGcpO2hbbWEuQ1NTXT1lKGcpO2hbbWEuVVJMXT1lKGcpO2hbbWEuSlNdPWUoZyk7aFttYS5SRVNPVVJDRV9VUkxdPWUoaFttYS5VUkxdKTtyZXR1cm57dHJ1c3RBczpmdW5jdGlvbihhLGIpe3ZhciBjPWguaGFzT3duUHJvcGVydHkoYSk/aFthXTpudWxsO2lmKCFjKXRocm93IENhKCJpY29udGV4dCIsYSxiKTtpZihudWxsPT09Ynx8Yj09PXR8fCIiPT09YilyZXR1cm4gYjtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXRocm93IENhKCJpdHlwZSIsYSk7cmV0dXJuIG5ldyBjKGIpfSxnZXRUcnVzdGVkOmZ1bmN0aW9uKGMsZSl7aWYobnVsbD09PWV8fGU9PT10fHwiIj09PWUpcmV0dXJuIGU7dmFyIGc9aC5oYXNPd25Qcm9wZXJ0eShjKT9oW2NdOm51bGw7aWYoZyYmZSBpbnN0YW5jZW9mIGcpcmV0dXJuIGUuJCR1bndyYXBUcnVzdGVkVmFsdWUoKTtpZihjPT09bWEuUkVTT1VSQ0VfVVJMKXt2YXIgZz1CYShlLnRvU3RyaW5nKCkpLHAscSx1PQ0KLSExO3A9MDtmb3IocT1iLmxlbmd0aDtwPHE7cCsrKWlmKGQoYltwXSxnKSl7dT0hMDticmVha31pZih1KWZvcihwPTAscT1hLmxlbmd0aDtwPHE7cCsrKWlmKGQoYVtwXSxnKSl7dT0hMTticmVha31pZih1KXJldHVybiBlO3Rocm93IENhKCJpbnNlY3VybCIsZS50b1N0cmluZygpKTt9aWYoYz09PW1hLkhUTUwpcmV0dXJuIGYoZSk7dGhyb3cgQ2EoInVuc2FmZSIpO30sdmFsdWVPZjpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIGc/YS4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpOmF9fX1dfWZ1bmN0aW9uIFNlKCl7dmFyIGI9ITA7dGhpcy5lbmFibGVkPWZ1bmN0aW9uKGEpe2FyZ3VtZW50cy5sZW5ndGgmJihiPSEhYSk7cmV0dXJuIGJ9O3RoaXMuJGdldD1bIiRwYXJzZSIsIiRzY2VEZWxlZ2F0ZSIsZnVuY3Rpb24oYSxjKXtpZihiJiY4PlJhKXRocm93IENhKCJpZXF1aXJrcyIpO3ZhciBkPXFhKG1hKTtkLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiBifTtkLnRydXN0QXM9DQotYy50cnVzdEFzO2QuZ2V0VHJ1c3RlZD1jLmdldFRydXN0ZWQ7ZC52YWx1ZU9mPWMudmFsdWVPZjtifHwoZC50cnVzdEFzPWQuZ2V0VHJ1c3RlZD1mdW5jdGlvbihhLGIpe3JldHVybiBifSxkLnZhbHVlT2Y9b2EpO2QucGFyc2VBcz1mdW5jdGlvbihiLGMpe3ZhciBlPWEoYyk7cmV0dXJuIGUubGl0ZXJhbCYmZS5jb25zdGFudD9lOmEoYyxmdW5jdGlvbihhKXtyZXR1cm4gZC5nZXRUcnVzdGVkKGIsYSl9KX07dmFyIGU9ZC5wYXJzZUFzLGY9ZC5nZXRUcnVzdGVkLGc9ZC50cnVzdEFzO3MobWEsZnVuY3Rpb24oYSxiKXt2YXIgYz1RKGIpO2RbY2IoInBhcnNlX2FzXyIrYyldPWZ1bmN0aW9uKGIpe3JldHVybiBlKGEsYil9O2RbY2IoImdldF90cnVzdGVkXyIrYyldPWZ1bmN0aW9uKGIpe3JldHVybiBmKGEsYil9O2RbY2IoInRydXN0X2FzXyIrYyldPWZ1bmN0aW9uKGIpe3JldHVybiBnKGEsYil9fSk7cmV0dXJuIGR9XX1mdW5jdGlvbiBVZSgpe3RoaXMuJGdldD1bIiR3aW5kb3ciLCIkZG9jdW1lbnQiLA0KLWZ1bmN0aW9uKGIsYSl7dmFyIGM9e30sZD1iYSgoL2FuZHJvaWQgKFxkKykvLmV4ZWMoUSgoYi5uYXZpZ2F0b3J8fHt9KS51c2VyQWdlbnQpKXx8W10pWzFdKSxlPS9Cb3hlZS9pLnRlc3QoKGIubmF2aWdhdG9yfHx7fSkudXNlckFnZW50KSxmPWFbMF18fHt9LGcsaD0vXihNb3p8d2Via2l0fG1zKSg/PVtBLVpdKS8sbD1mLmJvZHkmJmYuYm9keS5zdHlsZSxrPSExLG09ITE7aWYobCl7Zm9yKHZhciBwIGluIGwpaWYoaz1oLmV4ZWMocCkpe2c9a1swXTtnPWcuc3Vic3RyKDAsMSkudG9VcHBlckNhc2UoKStnLnN1YnN0cigxKTticmVha31nfHwoZz0iV2Via2l0T3BhY2l0eSJpbiBsJiYid2Via2l0Iik7az0hISgidHJhbnNpdGlvbiJpbiBsfHxnKyJUcmFuc2l0aW9uImluIGwpO209ISEoImFuaW1hdGlvbiJpbiBsfHxnKyJBbmltYXRpb24iaW4gbCk7IWR8fGsmJm18fChrPUYoZi5ib2R5LnN0eWxlLndlYmtpdFRyYW5zaXRpb24pLG09RihmLmJvZHkuc3R5bGUud2Via2l0QW5pbWF0aW9uKSl9cmV0dXJue2hpc3Rvcnk6ISghYi5oaXN0b3J5fHwNCi0hYi5oaXN0b3J5LnB1c2hTdGF0ZXx8ND5kfHxlKSxoYXNFdmVudDpmdW5jdGlvbihhKXtpZigiaW5wdXQiPT09YSYmMTE+PVJhKXJldHVybiExO2lmKEQoY1thXSkpe3ZhciBiPWYuY3JlYXRlRWxlbWVudCgiZGl2Iik7Y1thXT0ib24iK2EgaW4gYn1yZXR1cm4gY1thXX0sY3NwOmFiKCksdmVuZG9yUHJlZml4OmcsdHJhbnNpdGlvbnM6ayxhbmltYXRpb25zOm0sYW5kcm9pZDpkfX1dfWZ1bmN0aW9uIFdlKCl7dGhpcy4kZ2V0PVsiJHRlbXBsYXRlQ2FjaGUiLCIkaHR0cCIsIiRxIixmdW5jdGlvbihiLGEsYyl7ZnVuY3Rpb24gZChlLGYpe2QudG90YWxQZW5kaW5nUmVxdWVzdHMrKzt2YXIgZz1hLmRlZmF1bHRzJiZhLmRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlO3goZyk/Zz1nLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYSE9PVlifSk6Zz09PVliJiYoZz1udWxsKTtyZXR1cm4gYS5nZXQoZSx7Y2FjaGU6Yix0cmFuc2Zvcm1SZXNwb25zZTpnfSkudGhlbihmdW5jdGlvbihhKXtkLnRvdGFsUGVuZGluZ1JlcXVlc3RzLS07DQotcmV0dXJuIGEuZGF0YX0sZnVuY3Rpb24oYSl7ZC50b3RhbFBlbmRpbmdSZXF1ZXN0cy0tO2lmKCFmKXRocm93IGphKCJ0cGxvYWQiLGUpO3JldHVybiBjLnJlamVjdChhKX0pfWQudG90YWxQZW5kaW5nUmVxdWVzdHM9MDtyZXR1cm4gZH1dfWZ1bmN0aW9uIFhlKCl7dGhpcy4kZ2V0PVsiJHJvb3RTY29wZSIsIiRicm93c2VyIiwiJGxvY2F0aW9uIixmdW5jdGlvbihiLGEsYyl7cmV0dXJue2ZpbmRCaW5kaW5nczpmdW5jdGlvbihhLGIsYyl7YT1hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm5nLWJpbmRpbmciKTt2YXIgZz1bXTtzKGEsZnVuY3Rpb24oYSl7dmFyIGQ9Z2EuZWxlbWVudChhKS5kYXRhKCIkYmluZGluZyIpO2QmJnMoZCxmdW5jdGlvbihkKXtjPyhuZXcgUmVnRXhwKCIoXnxcXHMpIitnZChiKSsiKFxcc3xcXHx8JCkiKSkudGVzdChkKSYmZy5wdXNoKGEpOi0xIT1kLmluZGV4T2YoYikmJmcucHVzaChhKX0pfSk7cmV0dXJuIGd9LGZpbmRNb2RlbHM6ZnVuY3Rpb24oYSxiLA0KLWMpe2Zvcih2YXIgZz1bIm5nLSIsImRhdGEtbmctIiwibmdcXDoiXSxoPTA7aDxnLmxlbmd0aDsrK2gpe3ZhciBsPWEucXVlcnlTZWxlY3RvckFsbCgiWyIrZ1toXSsibW9kZWwiKyhjPyI9IjoiKj0iKSsnIicrYisnIl0nKTtpZihsLmxlbmd0aClyZXR1cm4gbH19LGdldExvY2F0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGMudXJsKCl9LHNldExvY2F0aW9uOmZ1bmN0aW9uKGEpe2EhPT1jLnVybCgpJiYoYy51cmwoYSksYi4kZGlnZXN0KCkpfSx3aGVuU3RhYmxlOmZ1bmN0aW9uKGIpe2Eubm90aWZ5V2hlbk5vT3V0c3RhbmRpbmdSZXF1ZXN0cyhiKX19fV19ZnVuY3Rpb24gWWUoKXt0aGlzLiRnZXQ9WyIkcm9vdFNjb3BlIiwiJGJyb3dzZXIiLCIkcSIsIiQkcSIsIiRleGNlcHRpb25IYW5kbGVyIixmdW5jdGlvbihiLGEsYyxkLGUpe2Z1bmN0aW9uIGYoZixsLGspe3ZhciBtPXkoaykmJiFrLHA9KG0/ZDpjKS5kZWZlcigpLHE9cC5wcm9taXNlO2w9YS5kZWZlcihmdW5jdGlvbigpe3RyeXtwLnJlc29sdmUoZigpKX1jYXRjaChhKXtwLnJlamVjdChhKSwNCi1lKGEpfWZpbmFsbHl7ZGVsZXRlIGdbcS4kJHRpbWVvdXRJZF19bXx8Yi4kYXBwbHkoKX0sbCk7cS4kJHRpbWVvdXRJZD1sO2dbbF09cDtyZXR1cm4gcX12YXIgZz17fTtmLmNhbmNlbD1mdW5jdGlvbihiKXtyZXR1cm4gYiYmYi4kJHRpbWVvdXRJZCBpbiBnPyhnW2IuJCR0aW1lb3V0SWRdLnJlamVjdCgiY2FuY2VsZWQiKSxkZWxldGUgZ1tiLiQkdGltZW91dElkXSxhLmRlZmVyLmNhbmNlbChiLiQkdGltZW91dElkKSk6ITF9O3JldHVybiBmfV19ZnVuY3Rpb24gQmEoYil7UmEmJihaLnNldEF0dHJpYnV0ZSgiaHJlZiIsYiksYj1aLmhyZWYpO1ouc2V0QXR0cmlidXRlKCJocmVmIixiKTtyZXR1cm57aHJlZjpaLmhyZWYscHJvdG9jb2w6Wi5wcm90b2NvbD9aLnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDpaLmhvc3Qsc2VhcmNoOlouc2VhcmNoP1ouc2VhcmNoLnJlcGxhY2UoL15cPy8sIiIpOiIiLGhhc2g6Wi5oYXNoP1ouaGFzaC5yZXBsYWNlKC9eIy8sIiIpOiIiLGhvc3RuYW1lOlouaG9zdG5hbWUsDQotcG9ydDpaLnBvcnQscGF0aG5hbWU6Ii8iPT09Wi5wYXRobmFtZS5jaGFyQXQoMCk/Wi5wYXRobmFtZToiLyIrWi5wYXRobmFtZX19ZnVuY3Rpb24gWmMoYil7Yj1GKGIpP0JhKGIpOmI7cmV0dXJuIGIucHJvdG9jb2w9PT1pZC5wcm90b2NvbCYmYi5ob3N0PT09aWQuaG9zdH1mdW5jdGlvbiBaZSgpe3RoaXMuJGdldD1kYShNKX1mdW5jdGlvbiBEYyhiKXtmdW5jdGlvbiBhKGMsZCl7aWYoSChjKSl7dmFyIGU9e307cyhjLGZ1bmN0aW9uKGIsYyl7ZVtjXT1hKGMsYil9KTtyZXR1cm4gZX1yZXR1cm4gYi5mYWN0b3J5KGMrIkZpbHRlciIsZCl9dGhpcy5yZWdpc3Rlcj1hO3RoaXMuJGdldD1bIiRpbmplY3RvciIsZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBhLmdldChiKyJGaWx0ZXIiKX19XTthKCJjdXJyZW5jeSIsamQpO2EoImRhdGUiLGtkKTthKCJmaWx0ZXIiLEVmKTthKCJqc29uIixGZik7YSgibGltaXRUbyIsR2YpO2EoImxvd2VyY2FzZSIsSGYpO2EoIm51bWJlciIsDQotbGQpO2EoIm9yZGVyQnkiLG1kKTthKCJ1cHBlcmNhc2UiLElmKX1mdW5jdGlvbiBFZigpe3JldHVybiBmdW5jdGlvbihiLGEsYyl7aWYoIXgoYikpcmV0dXJuIGI7dmFyIGQ7c3dpdGNoKHR5cGVvZiBhKXtjYXNlICJmdW5jdGlvbiI6YnJlYWs7Y2FzZSAiYm9vbGVhbiI6Y2FzZSAibnVtYmVyIjpjYXNlICJzdHJpbmciOmQ9ITA7Y2FzZSAib2JqZWN0IjphPUpmKGEsYyxkKTticmVhaztkZWZhdWx0OnJldHVybiBifXJldHVybiBiLmZpbHRlcihhKX19ZnVuY3Rpb24gSmYoYixhLGMpe3ZhciBkPUgoYikmJiIkImluIGI7ITA9PT1hP2E9ZmE6RyhhKXx8KGE9ZnVuY3Rpb24oYSxiKXtpZihIKGEpfHxIKGIpKXJldHVybiExO2E9USgiIithKTtiPVEoIiIrYik7cmV0dXJuLTEhPT1hLmluZGV4T2YoYil9KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGQmJiFIKGUpP0lhKGUsYi4kLGEsITEpOklhKGUsYixhLGMpfX1mdW5jdGlvbiBJYShiLGEsYyxkLGUpe3ZhciBmPXR5cGVvZiBiLGc9DQotdHlwZW9mIGE7aWYoInN0cmluZyI9PT1nJiYiISI9PT1hLmNoYXJBdCgwKSlyZXR1cm4hSWEoYixhLnN1YnN0cmluZygxKSxjLGQpO2lmKCJhcnJheSI9PT1mKXJldHVybiBiLnNvbWUoZnVuY3Rpb24oYil7cmV0dXJuIElhKGIsYSxjLGQpfSk7c3dpdGNoKGYpe2Nhc2UgIm9iamVjdCI6dmFyIGg7aWYoZCl7Zm9yKGggaW4gYilpZigiJCIhPT1oLmNoYXJBdCgwKSYmSWEoYltoXSxhLGMsITApKXJldHVybiEwO3JldHVybiBlPyExOklhKGIsYSxjLCExKX1pZigib2JqZWN0Ij09PWcpe2ZvcihoIGluIGEpaWYoZT1hW2hdLCFHKGUpJiYoZj0iJCI9PT1oLCFJYShmP2I6YltoXSxlLGMsZixmKSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIGMoYixhKTtjYXNlICJmdW5jdGlvbiI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4gYyhiLGEpfX1mdW5jdGlvbiBqZChiKXt2YXIgYT1iLk5VTUJFUl9GT1JNQVRTO3JldHVybiBmdW5jdGlvbihiLGQsZSl7RChkKSYmKGQ9YS5DVVJSRU5DWV9TWU0pOw0KLUQoZSkmJihlPWEuUEFUVEVSTlNbMV0ubWF4RnJhYyk7cmV0dXJuIG51bGw9PWI/YjpuZChiLGEuUEFUVEVSTlNbMV0sYS5HUk9VUF9TRVAsYS5ERUNJTUFMX1NFUCxlKS5yZXBsYWNlKC9cdTAwQTQvZyxkKX19ZnVuY3Rpb24gbGQoYil7dmFyIGE9Yi5OVU1CRVJfRk9STUFUUztyZXR1cm4gZnVuY3Rpb24oYixkKXtyZXR1cm4gbnVsbD09Yj9iOm5kKGIsYS5QQVRURVJOU1swXSxhLkdST1VQX1NFUCxhLkRFQ0lNQUxfU0VQLGQpfX1mdW5jdGlvbiBuZChiLGEsYyxkLGUpe2lmKCFpc0Zpbml0ZShiKXx8SChiKSlyZXR1cm4iIjt2YXIgZj0wPmI7Yj1NYXRoLmFicyhiKTt2YXIgZz1iKyIiLGg9IiIsbD1bXSxrPSExO2lmKC0xIT09Zy5pbmRleE9mKCJlIikpe3ZhciBtPWcubWF0Y2goLyhbXGRcLl0rKWUoLT8pKFxkKykvKTttJiYiLSI9PW1bMl0mJm1bM10+ZSsxP2I9MDooaD1nLGs9ITApfWlmKGspMDxlJiYxPmImJihoPWIudG9GaXhlZChlKSxiPXBhcnNlRmxvYXQoaCkpO2Vsc2V7Zz0NCi0oZy5zcGxpdChvZClbMV18fCIiKS5sZW5ndGg7RChlKSYmKGU9TWF0aC5taW4oTWF0aC5tYXgoYS5taW5GcmFjLGcpLGEubWF4RnJhYykpO2I9KyhNYXRoLnJvdW5kKCsoYi50b1N0cmluZygpKyJlIitlKSkudG9TdHJpbmcoKSsiZSIrLWUpO3ZhciBnPSgiIitiKS5zcGxpdChvZCksaz1nWzBdLGc9Z1sxXXx8IiIscD0wLHE9YS5sZ1NpemUsdT1hLmdTaXplO2lmKGsubGVuZ3RoPj1xK3UpZm9yKHA9ay5sZW5ndGgtcSxtPTA7bTxwO20rKykwPT09KHAtbSkldSYmMCE9PW0mJihoKz1jKSxoKz1rLmNoYXJBdChtKTtmb3IobT1wO208ay5sZW5ndGg7bSsrKTA9PT0oay5sZW5ndGgtbSklcSYmMCE9PW0mJihoKz1jKSxoKz1rLmNoYXJBdChtKTtmb3IoO2cubGVuZ3RoPGU7KWcrPSIwIjtlJiYiMCIhPT1lJiYoaCs9ZCtnLnN1YnN0cigwLGUpKX0wPT09YiYmKGY9ITEpO2wucHVzaChmP2EubmVnUHJlOmEucG9zUHJlLGgsZj9hLm5lZ1N1ZjphLnBvc1N1Zik7cmV0dXJuIGwuam9pbigiIil9DQotZnVuY3Rpb24gSGIoYixhLGMpe3ZhciBkPSIiOzA+YiYmKGQ9Ii0iLGI9LWIpO2ZvcihiPSIiK2I7Yi5sZW5ndGg8YTspYj0iMCIrYjtjJiYoYj1iLnN1YnN0cihiLmxlbmd0aC1hKSk7cmV0dXJuIGQrYn1mdW5jdGlvbiAkKGIsYSxjLGQpe2M9Y3x8MDtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1lWyJnZXQiK2JdKCk7aWYoMDxjfHxlPi1jKWUrPWM7MD09PWUmJi0xMj09YyYmKGU9MTIpO3JldHVybiBIYihlLGEsZCl9fWZ1bmN0aW9uIEliKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7dmFyIGU9Y1siZ2V0IitiXSgpLGY9dWIoYT8iU0hPUlQiK2I6Yik7cmV0dXJuIGRbZl1bZV19fWZ1bmN0aW9uIHBkKGIpe3ZhciBhPShuZXcgRGF0ZShiLDAsMSkpLmdldERheSgpO3JldHVybiBuZXcgRGF0ZShiLDAsKDQ+PWE/NToxMiktYSl9ZnVuY3Rpb24gcWQoYil7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPXBkKGEuZ2V0RnVsbFllYXIoKSk7YT0rbmV3IERhdGUoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSwNCi1hLmdldERhdGUoKSsoNC1hLmdldERheSgpKSktK2M7YT0xK01hdGgucm91bmQoYS82MDQ4RTUpO3JldHVybiBIYihhLGIpfX1mdW5jdGlvbiBrZChiKXtmdW5jdGlvbiBhKGEpe3ZhciBiO2lmKGI9YS5tYXRjaChjKSl7YT1uZXcgRGF0ZSgwKTt2YXIgZj0wLGc9MCxoPWJbOF0/YS5zZXRVVENGdWxsWWVhcjphLnNldEZ1bGxZZWFyLGw9Yls4XT9hLnNldFVUQ0hvdXJzOmEuc2V0SG91cnM7Yls5XSYmKGY9YmEoYls5XStiWzEwXSksZz1iYShiWzldK2JbMTFdKSk7aC5jYWxsKGEsYmEoYlsxXSksYmEoYlsyXSktMSxiYShiWzNdKSk7Zj1iYShiWzRdfHwwKS1mO2c9YmEoYls1XXx8MCktZztoPWJhKGJbNl18fDApO2I9TWF0aC5yb3VuZCgxRTMqcGFyc2VGbG9hdCgiMC4iKyhiWzddfHwwKSkpO2wuY2FsbChhLGYsZyxoLGIpfXJldHVybiBhfXZhciBjPS9eKFxkezR9KS0/KFxkXGQpLT8oXGRcZCkoPzpUKFxkXGQpKD86Oj8oXGRcZCkoPzo6PyhcZFxkKSg/OlwuKFxkKykpPyk/KT8oWnwoWystXSkoXGRcZCk6PyhcZFxkKSk/KT8kLzsNCi1yZXR1cm4gZnVuY3Rpb24oYyxlLGYpe3ZhciBnPSIiLGg9W10sbCxrO2U9ZXx8Im1lZGl1bURhdGUiO2U9Yi5EQVRFVElNRV9GT1JNQVRTW2VdfHxlO0YoYykmJihjPUtmLnRlc3QoYyk/YmEoYyk6YShjKSk7VihjKSYmKGM9bmV3IERhdGUoYykpO2lmKCFwYShjKSlyZXR1cm4gYztmb3IoO2U7KShrPUxmLmV4ZWMoZSkpPyhoPVlhKGgsaywxKSxlPWgucG9wKCkpOihoLnB1c2goZSksZT1udWxsKTtmJiYiVVRDIj09PWYmJihjPW5ldyBEYXRlKGMuZ2V0VGltZSgpKSxjLnNldE1pbnV0ZXMoYy5nZXRNaW51dGVzKCkrYy5nZXRUaW1lem9uZU9mZnNldCgpKSk7cyhoLGZ1bmN0aW9uKGEpe2w9TWZbYV07Zys9bD9sKGMsYi5EQVRFVElNRV9GT1JNQVRTKTphLnJlcGxhY2UoLyheJ3wnJCkvZywiIikucmVwbGFjZSgvJycvZywiJyIpfSk7cmV0dXJuIGd9fWZ1bmN0aW9uIEZmKCl7cmV0dXJuIGZ1bmN0aW9uKGIsYSl7RChhKSYmKGE9Mik7cmV0dXJuICRhKGIsYSl9fWZ1bmN0aW9uIEdmKCl7cmV0dXJuIGZ1bmN0aW9uKGIsDQotYSl7VihiKSYmKGI9Yi50b1N0cmluZygpKTtpZigheChiKSYmIUYoYikpcmV0dXJuIGI7YT1JbmZpbml0eT09PU1hdGguYWJzKE51bWJlcihhKSk/TnVtYmVyKGEpOmJhKGEpO2lmKEYoYikpcmV0dXJuIGE/MDw9YT9iLnNsaWNlKDAsYSk6Yi5zbGljZShhLGIubGVuZ3RoKToiIjt2YXIgYyxkO2E+Yi5sZW5ndGg/YT1iLmxlbmd0aDphPC1iLmxlbmd0aCYmKGE9LWIubGVuZ3RoKTtpZigwPGEpYz0wLGQ9YTtlbHNle2lmKCFhKXJldHVybltdO2M9Yi5sZW5ndGgrYTtkPWIubGVuZ3RofXJldHVybiBiLnNsaWNlKGMsZCl9fWZ1bmN0aW9uIG1kKGIpe3JldHVybiBmdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gZShhLGIpe3JldHVybiBiP2Z1bmN0aW9uKGIsYyl7cmV0dXJuIGEoYyxiKX06YX1mdW5jdGlvbiBmKGEpe3N3aXRjaCh0eXBlb2YgYSl7Y2FzZSAibnVtYmVyIjpjYXNlICJib29sZWFuIjpjYXNlICJzdHJpbmciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIGcoYSl7cmV0dXJuIG51bGw9PT0NCi1hPyJudWxsIjoiZnVuY3Rpb24iPT09dHlwZW9mIGEudmFsdWVPZiYmKGE9YS52YWx1ZU9mKCksZihhKSl8fCJmdW5jdGlvbiI9PT10eXBlb2YgYS50b1N0cmluZyYmKGE9YS50b1N0cmluZygpLGYoYSkpP2E6IiJ9ZnVuY3Rpb24gaChhLGIpe3ZhciBjPXR5cGVvZiBhLGQ9dHlwZW9mIGI7Yz09PWQmJiJvYmplY3QiPT09YyYmKGE9ZyhhKSxiPWcoYikpO3JldHVybiBjPT09ZD8oInN0cmluZyI9PT1jJiYoYT1hLnRvTG93ZXJDYXNlKCksYj1iLnRvTG93ZXJDYXNlKCkpLGE9PT1iPzA6YTxiPy0xOjEpOmM8ZD8tMToxfWlmKCFUYShhKSlyZXR1cm4gYTtjPXgoYyk/YzpbY107MD09PWMubGVuZ3RoJiYoYz1bIisiXSk7Yz1jLm1hcChmdW5jdGlvbihhKXt2YXIgYz0hMSxkPWF8fG9hO2lmKEYoYSkpe2lmKCIrIj09YS5jaGFyQXQoMCl8fCItIj09YS5jaGFyQXQoMCkpYz0iLSI9PWEuY2hhckF0KDApLGE9YS5zdWJzdHJpbmcoMSk7aWYoIiI9PT1hKXJldHVybiBlKGgsYyk7ZD1iKGEpO2lmKGQuY29uc3RhbnQpe3ZhciBmPQ0KLWQoKTtyZXR1cm4gZShmdW5jdGlvbihhLGIpe3JldHVybiBoKGFbZl0sYltmXSl9LGMpfX1yZXR1cm4gZShmdW5jdGlvbihhLGIpe3JldHVybiBoKGQoYSksZChiKSl9LGMpfSk7cmV0dXJuIFphLmNhbGwoYSkuc29ydChlKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF0oYSxiKTtpZigwIT09ZSlyZXR1cm4gZX1yZXR1cm4gMH0sZCkpfX1mdW5jdGlvbiBKYShiKXtHKGIpJiYoYj17bGluazpifSk7Yi5yZXN0cmljdD1iLnJlc3RyaWN0fHwiQUMiO3JldHVybiBkYShiKX1mdW5jdGlvbiByZChiLGEsYyxkLGUpe3ZhciBmPXRoaXMsZz1bXSxoPWYuJCRwYXJlbnRGb3JtPWIucGFyZW50KCkuY29udHJvbGxlcigiZm9ybSIpfHxKYjtmLiRlcnJvcj17fTtmLiQkc3VjY2Vzcz17fTtmLiRwZW5kaW5nPXQ7Zi4kbmFtZT1lKGEubmFtZXx8YS5uZ0Zvcm18fCIiKShjKTtmLiRkaXJ0eT0hMTtmLiRwcmlzdGluZT0hMDtmLiR2YWxpZD0hMDtmLiRpbnZhbGlkPQ0KLSExO2YuJHN1Ym1pdHRlZD0hMTtoLiRhZGRDb250cm9sKGYpO2YuJHJvbGxiYWNrVmlld1ZhbHVlPWZ1bmN0aW9uKCl7cyhnLGZ1bmN0aW9uKGEpe2EuJHJvbGxiYWNrVmlld1ZhbHVlKCl9KX07Zi4kY29tbWl0Vmlld1ZhbHVlPWZ1bmN0aW9uKCl7cyhnLGZ1bmN0aW9uKGEpe2EuJGNvbW1pdFZpZXdWYWx1ZSgpfSl9O2YuJGFkZENvbnRyb2w9ZnVuY3Rpb24oYSl7TWEoYS4kbmFtZSwiaW5wdXQiKTtnLnB1c2goYSk7YS4kbmFtZSYmKGZbYS4kbmFtZV09YSl9O2YuJCRyZW5hbWVDb250cm9sPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS4kbmFtZTtmW2NdPT09YSYmZGVsZXRlIGZbY107ZltiXT1hO2EuJG5hbWU9Yn07Zi4kcmVtb3ZlQ29udHJvbD1mdW5jdGlvbihhKXthLiRuYW1lJiZmW2EuJG5hbWVdPT09YSYmZGVsZXRlIGZbYS4kbmFtZV07cyhmLiRwZW5kaW5nLGZ1bmN0aW9uKGIsYyl7Zi4kc2V0VmFsaWRpdHkoYyxudWxsLGEpfSk7cyhmLiRlcnJvcixmdW5jdGlvbihiLGMpe2YuJHNldFZhbGlkaXR5KGMsDQotbnVsbCxhKX0pO1hhKGcsYSl9O3NkKHtjdHJsOnRoaXMsJGVsZW1lbnQ6YixzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWFbYl07ZD8tMT09PWQuaW5kZXhPZihjKSYmZC5wdXNoKGMpOmFbYl09W2NdfSx1bnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YVtiXTtkJiYoWGEoZCxjKSwwPT09ZC5sZW5ndGgmJmRlbGV0ZSBhW2JdKX0scGFyZW50Rm9ybTpoLCRhbmltYXRlOmR9KTtmLiRzZXREaXJ0eT1mdW5jdGlvbigpe2QucmVtb3ZlQ2xhc3MoYixTYSk7ZC5hZGRDbGFzcyhiLEtiKTtmLiRkaXJ0eT0hMDtmLiRwcmlzdGluZT0hMTtoLiRzZXREaXJ0eSgpfTtmLiRzZXRQcmlzdGluZT1mdW5jdGlvbigpe2Quc2V0Q2xhc3MoYixTYSxLYisiIG5nLXN1Ym1pdHRlZCIpO2YuJGRpcnR5PSExO2YuJHByaXN0aW5lPSEwO2YuJHN1Ym1pdHRlZD0hMTtzKGcsZnVuY3Rpb24oYSl7YS4kc2V0UHJpc3RpbmUoKX0pfTtmLiRzZXRVbnRvdWNoZWQ9ZnVuY3Rpb24oKXtzKGcsZnVuY3Rpb24oYSl7YS4kc2V0VW50b3VjaGVkKCl9KX07DQotZi4kc2V0U3VibWl0dGVkPWZ1bmN0aW9uKCl7ZC5hZGRDbGFzcyhiLCJuZy1zdWJtaXR0ZWQiKTtmLiRzdWJtaXR0ZWQ9ITA7aC4kc2V0U3VibWl0dGVkKCl9fWZ1bmN0aW9uIGhjKGIpe2IuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gYi4kaXNFbXB0eShhKT9hOmEudG9TdHJpbmcoKX0pfWZ1bmN0aW9uIGliKGIsYSxjLGQsZSxmKXt2YXIgZz1RKGFbMF0udHlwZSk7aWYoIWUuYW5kcm9pZCl7dmFyIGg9ITE7YS5vbigiY29tcG9zaXRpb25zdGFydCIsZnVuY3Rpb24oYSl7aD0hMH0pO2Eub24oImNvbXBvc2l0aW9uZW5kIixmdW5jdGlvbigpe2g9ITE7bCgpfSl9dmFyIGw9ZnVuY3Rpb24oYil7ayYmKGYuZGVmZXIuY2FuY2VsKGspLGs9bnVsbCk7aWYoIWgpe3ZhciBlPWEudmFsKCk7Yj1iJiZiLnR5cGU7InBhc3N3b3JkIj09PWd8fGMubmdUcmltJiYiZmFsc2UiPT09Yy5uZ1RyaW18fChlPVUoZSkpOyhkLiR2aWV3VmFsdWUhPT1lfHwiIj09PWUmJmQuJCRoYXNOYXRpdmVWYWxpZGF0b3JzKSYmDQotZC4kc2V0Vmlld1ZhbHVlKGUsYil9fTtpZihlLmhhc0V2ZW50KCJpbnB1dCIpKWEub24oImlucHV0IixsKTtlbHNle3ZhciBrLG09ZnVuY3Rpb24oYSxiLGMpe2t8fChrPWYuZGVmZXIoZnVuY3Rpb24oKXtrPW51bGw7YiYmYi52YWx1ZT09PWN8fGwoYSl9KSl9O2Eub24oImtleWRvd24iLGZ1bmN0aW9uKGEpe3ZhciBiPWEua2V5Q29kZTs5MT09PWJ8fDE1PGImJjE5PmJ8fDM3PD1iJiY0MD49Ynx8bShhLHRoaXMsdGhpcy52YWx1ZSl9KTtpZihlLmhhc0V2ZW50KCJwYXN0ZSIpKWEub24oInBhc3RlIGN1dCIsbSl9YS5vbigiY2hhbmdlIixsKTtkLiRyZW5kZXI9ZnVuY3Rpb24oKXthLnZhbChkLiRpc0VtcHR5KGQuJHZpZXdWYWx1ZSk/IiI6ZC4kdmlld1ZhbHVlKX19ZnVuY3Rpb24gTGIoYixhKXtyZXR1cm4gZnVuY3Rpb24oYyxkKXt2YXIgZSxmO2lmKHBhKGMpKXJldHVybiBjO2lmKEYoYykpeyciJz09Yy5jaGFyQXQoMCkmJiciJz09Yy5jaGFyQXQoYy5sZW5ndGgtMSkmJihjPWMuc3Vic3RyaW5nKDEsDQotYy5sZW5ndGgtMSkpO2lmKE5mLnRlc3QoYykpcmV0dXJuIG5ldyBEYXRlKGMpO2IubGFzdEluZGV4PTA7aWYoZT1iLmV4ZWMoYykpcmV0dXJuIGUuc2hpZnQoKSxmPWQ/e3l5eXk6ZC5nZXRGdWxsWWVhcigpLE1NOmQuZ2V0TW9udGgoKSsxLGRkOmQuZ2V0RGF0ZSgpLEhIOmQuZ2V0SG91cnMoKSxtbTpkLmdldE1pbnV0ZXMoKSxzczpkLmdldFNlY29uZHMoKSxzc3M6ZC5nZXRNaWxsaXNlY29uZHMoKS8xRTN9Ont5eXl5OjE5NzAsTU06MSxkZDoxLEhIOjAsbW06MCxzczowLHNzczowfSxzKGUsZnVuY3Rpb24oYixjKXtjPGEubGVuZ3RoJiYoZlthW2NdXT0rYil9KSxuZXcgRGF0ZShmLnl5eXksZi5NTS0xLGYuZGQsZi5ISCxmLm1tLGYuc3N8fDAsMUUzKmYuc3NzfHwwKX1yZXR1cm4gTmFOfX1mdW5jdGlvbiBqYihiLGEsYyxkKXtyZXR1cm4gZnVuY3Rpb24oZSxmLGcsaCxsLGssbSl7ZnVuY3Rpb24gcChhKXtyZXR1cm4gYSYmIShhLmdldFRpbWUmJmEuZ2V0VGltZSgpIT09YS5nZXRUaW1lKCkpfQ0KLWZ1bmN0aW9uIHEoYSl7cmV0dXJuIHkoYSk/cGEoYSk/YTpjKGEpOnR9dGQoZSxmLGcsaCk7aWIoZSxmLGcsaCxsLGspO3ZhciB1PWgmJmguJG9wdGlvbnMmJmguJG9wdGlvbnMudGltZXpvbmUscjtoLiQkcGFyc2VyTmFtZT1iO2guJHBhcnNlcnMucHVzaChmdW5jdGlvbihiKXtyZXR1cm4gaC4kaXNFbXB0eShiKT9udWxsOmEudGVzdChiKT8oYj1jKGIsciksIlVUQyI9PT11JiZiLnNldE1pbnV0ZXMoYi5nZXRNaW51dGVzKCktYi5nZXRUaW1lem9uZU9mZnNldCgpKSxiKTp0fSk7aC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGEpe2lmKGEmJiFwYShhKSl0aHJvdyBNYigiZGF0ZWZtdCIsYSk7aWYocChhKSl7aWYoKHI9YSkmJiJVVEMiPT09dSl7dmFyIGI9NkU0KnIuZ2V0VGltZXpvbmVPZmZzZXQoKTtyPW5ldyBEYXRlKHIuZ2V0VGltZSgpK2IpfXJldHVybiBtKCJkYXRlIikoYSxkLHUpfXI9bnVsbDtyZXR1cm4iIn0pO2lmKHkoZy5taW4pfHxnLm5nTWluKXt2YXIgcztoLiR2YWxpZGF0b3JzLm1pbj0NCi1mdW5jdGlvbihhKXtyZXR1cm4hcChhKXx8RChzKXx8YyhhKT49c307Zy4kb2JzZXJ2ZSgibWluIixmdW5jdGlvbihhKXtzPXEoYSk7aC4kdmFsaWRhdGUoKX0pfWlmKHkoZy5tYXgpfHxnLm5nTWF4KXt2YXIgbjtoLiR2YWxpZGF0b3JzLm1heD1mdW5jdGlvbihhKXtyZXR1cm4hcChhKXx8RChuKXx8YyhhKTw9bn07Zy4kb2JzZXJ2ZSgibWF4IixmdW5jdGlvbihhKXtuPXEoYSk7aC4kdmFsaWRhdGUoKX0pfX19ZnVuY3Rpb24gdGQoYixhLGMsZCl7KGQuJCRoYXNOYXRpdmVWYWxpZGF0b3JzPUgoYVswXS52YWxpZGl0eSkpJiZkLiRwYXJzZXJzLnB1c2goZnVuY3Rpb24oYil7dmFyIGM9YS5wcm9wKCJ2YWxpZGl0eSIpfHx7fTtyZXR1cm4gYy5iYWRJbnB1dCYmIWMudHlwZU1pc21hdGNoP3Q6Yn0pfWZ1bmN0aW9uIHVkKGIsYSxjLGQsZSl7aWYoeShkKSl7Yj1iKGQpO2lmKCFiLmNvbnN0YW50KXRocm93IFQoIm5nTW9kZWwiKSgiY29uc3RleHByIixjLGQpO3JldHVybiBiKGEpfXJldHVybiBlfQ0KLWZ1bmN0aW9uIHNkKGIpe2Z1bmN0aW9uIGEoYSxiKXtiJiYhZlthXT8oay5hZGRDbGFzcyhlLGEpLGZbYV09ITApOiFiJiZmW2FdJiYoay5yZW1vdmVDbGFzcyhlLGEpLGZbYV09ITEpfWZ1bmN0aW9uIGMoYixjKXtiPWI/Ii0iK3RjKGIsIi0iKToiIjthKGtiK2IsITA9PT1jKTthKHZkK2IsITE9PT1jKX12YXIgZD1iLmN0cmwsZT1iLiRlbGVtZW50LGY9e30sZz1iLnNldCxoPWIudW5zZXQsbD1iLnBhcmVudEZvcm0saz1iLiRhbmltYXRlO2ZbdmRdPSEoZltrYl09ZS5oYXNDbGFzcyhrYikpO2QuJHNldFZhbGlkaXR5PWZ1bmN0aW9uKGIsZSxmKXtlPT09dD8oZC4kcGVuZGluZ3x8KGQuJHBlbmRpbmc9e30pLGcoZC4kcGVuZGluZyxiLGYpKTooZC4kcGVuZGluZyYmaChkLiRwZW5kaW5nLGIsZiksd2QoZC4kcGVuZGluZykmJihkLiRwZW5kaW5nPXQpKTtXYShlKT9lPyhoKGQuJGVycm9yLGIsZiksZyhkLiQkc3VjY2VzcyxiLGYpKTooZyhkLiRlcnJvcixiLGYpLGgoZC4kJHN1Y2Nlc3MsDQotYixmKSk6KGgoZC4kZXJyb3IsYixmKSxoKGQuJCRzdWNjZXNzLGIsZikpO2QuJHBlbmRpbmc/KGEoeGQsITApLGQuJHZhbGlkPWQuJGludmFsaWQ9dCxjKCIiLG51bGwpKTooYSh4ZCwhMSksZC4kdmFsaWQ9d2QoZC4kZXJyb3IpLGQuJGludmFsaWQ9IWQuJHZhbGlkLGMoIiIsZC4kdmFsaWQpKTtlPWQuJHBlbmRpbmcmJmQuJHBlbmRpbmdbYl0/dDpkLiRlcnJvcltiXT8hMTpkLiQkc3VjY2Vzc1tiXT8hMDpudWxsO2MoYixlKTtsLiRzZXRWYWxpZGl0eShiLGUsZCl9fWZ1bmN0aW9uIHdkKGIpe2lmKGIpZm9yKHZhciBhIGluIGIpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gaWMoYixhKXtiPSJuZ0NsYXNzIitiO3JldHVyblsiJGFuaW1hdGUiLGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGQoYSxiKXt2YXIgYz1bXSxkPTA7YTpmb3IoO2Q8YS5sZW5ndGg7ZCsrKXtmb3IodmFyIGU9YVtkXSxtPTA7bTxiLmxlbmd0aDttKyspaWYoZT09YlttXSljb250aW51ZSBhO2MucHVzaChlKX1yZXR1cm4gY30NCi1mdW5jdGlvbiBlKGEpe2lmKCF4KGEpKXtpZihGKGEpKXJldHVybiBhLnNwbGl0KCIgIik7aWYoSChhKSl7dmFyIGI9W107cyhhLGZ1bmN0aW9uKGEsYyl7YSYmKGI9Yi5jb25jYXQoYy5zcGxpdCgiICIpKSl9KTtyZXR1cm4gYn19cmV0dXJuIGF9cmV0dXJue3Jlc3RyaWN0OiJBQyIsbGluazpmdW5jdGlvbihmLGcsaCl7ZnVuY3Rpb24gbChhLGIpe3ZhciBjPWcuZGF0YSgiJGNsYXNzQ291bnRzIil8fHt9LGQ9W107cyhhLGZ1bmN0aW9uKGEpe2lmKDA8Ynx8Y1thXSljW2FdPShjW2FdfHwwKStiLGNbYV09PT0rKDA8YikmJmQucHVzaChhKX0pO2cuZGF0YSgiJGNsYXNzQ291bnRzIixjKTtyZXR1cm4gZC5qb2luKCIgIil9ZnVuY3Rpb24gayhiKXtpZighMD09PWF8fGYuJGluZGV4JTI9PT1hKXt2YXIgaz1lKGJ8fFtdKTtpZighbSl7dmFyIHU9bChrLDEpO2guJGFkZENsYXNzKHUpfWVsc2UgaWYoIWZhKGIsbSkpe3ZhciByPWUobSksdT1kKGssciksaz1kKHIsayksdT1sKHUsMSksaz0NCi1sKGssLTEpO3UmJnUubGVuZ3RoJiZjLmFkZENsYXNzKGcsdSk7ayYmay5sZW5ndGgmJmMucmVtb3ZlQ2xhc3MoZyxrKX19bT1xYShiKX12YXIgbTtmLiR3YXRjaChoW2JdLGssITApO2guJG9ic2VydmUoImNsYXNzIixmdW5jdGlvbihhKXtrKGYuJGV2YWwoaFtiXSkpfSk7Im5nQ2xhc3MiIT09YiYmZi4kd2F0Y2goIiRpbmRleCIsZnVuY3Rpb24oYyxkKXt2YXIgZz1jJjE7aWYoZyE9PShkJjEpKXt2YXIgaz1lKGYuJGV2YWwoaFtiXSkpO2c9PT1hPyhnPWwoaywxKSxoLiRhZGRDbGFzcyhnKSk6KGc9bChrLC0xKSxoLiRyZW1vdmVDbGFzcyhnKSl9fSl9fX1dfXZhciBPZj0vXlwvKC4rKVwvKFthLXpdKikkLyxRPWZ1bmN0aW9uKGIpe3JldHVybiBGKGIpP2IudG9Mb3dlckNhc2UoKTpifSxyYz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHViPWZ1bmN0aW9uKGIpe3JldHVybiBGKGIpP2IudG9VcHBlckNhc2UoKTpifSxSYSxCLHJhLFphPVtdLnNsaWNlLHJmPVtdLnNwbGljZSwNCi1QZj1bXS5wdXNoLERhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsS2E9VCgibmciKSxnYT1NLmFuZ3VsYXJ8fChNLmFuZ3VsYXI9e30pLGJiLG5iPTA7UmE9WS5kb2N1bWVudE1vZGU7Qy4kaW5qZWN0PVtdO29hLiRpbmplY3Q9W107dmFyIHg9QXJyYXkuaXNBcnJheSxVPWZ1bmN0aW9uKGIpe3JldHVybiBGKGIpP2IudHJpbSgpOmJ9LGdkPWZ1bmN0aW9uKGIpe3JldHVybiBiLnJlcGxhY2UoLyhbLSgpXFtcXXt9Kz8qLiRcXnwsOiM8IVxcXSkvZywiXFwkMSIpLnJlcGxhY2UoL1x4MDgvZywiXFx4MDgiKX0sYWI9ZnVuY3Rpb24oKXtpZih5KGFiLmlzQWN0aXZlXykpcmV0dXJuIGFiLmlzQWN0aXZlXzt2YXIgYj0hKCFZLnF1ZXJ5U2VsZWN0b3IoIltuZy1jc3BdIikmJiFZLnF1ZXJ5U2VsZWN0b3IoIltkYXRhLW5nLWNzcF0iKSk7aWYoIWIpdHJ5e25ldyBGdW5jdGlvbigiIil9Y2F0Y2goYSl7Yj0hMH1yZXR1cm4gYWIuaXNBY3RpdmVfPWJ9LHJiPVsibmctIiwiZGF0YS1uZy0iLCJuZzoiLA0KLSJ4LW5nLSJdLE1kPS9bQS1aXS9nLHVjPSExLFBiLG5hPTEscGI9MyxRZD17ZnVsbDoiMS4zLjgiLG1ham9yOjEsbWlub3I6Myxkb3Q6OCxjb2RlTmFtZToicHJvcGhldGljLW5hcndoYWwifTtSLmV4cGFuZG89Im5nMzM5Ijt2YXIgemI9Ui5jYWNoZT17fSxoZj0xO1IuX2RhdGE9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuY2FjaGVbYlt0aGlzLmV4cGFuZG9dXXx8e319O3ZhciBjZj0vKFtcOlwtXF9dKyguKSkvZyxkZj0vXm1veihbQS1aXSkvLFFmPXttb3VzZWxlYXZlOiJtb3VzZW91dCIsbW91c2VlbnRlcjoibW91c2VvdmVyIn0sU2I9VCgianFMaXRlIiksZ2Y9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyxSYj0vPHwmIz9cdys7LyxlZj0vPChbXHc6XSspLyxmZj0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLGlhPXtvcHRpb246WzEsJzxzZWxlY3QgbXVsdGlwbGU9Im11bHRpcGxlIj4nLA0KLSI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07aWEub3B0Z3JvdXA9aWEub3B0aW9uO2lhLnRib2R5PWlhLnRmb290PWlhLmNvbGdyb3VwPWlhLmNhcHRpb249aWEudGhlYWQ7aWEudGg9aWEudGQ7dmFyIExhPVIucHJvdG90eXBlPXtyZWFkeTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKCl7Y3x8KGM9ITAsYigpKX12YXIgYz0hMTsiY29tcGxldGUiPT09WS5yZWFkeVN0YXRlP3NldFRpbWVvdXQoYSk6KHRoaXMub24oIkRPTUNvbnRlbnRMb2FkZWQiLGEpLFIoTSkub24oImxvYWQiLGEpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgYj1bXTtzKHRoaXMsZnVuY3Rpb24oYSl7Yi5wdXNoKCIiKw0KLWEpfSk7cmV0dXJuIlsiK2Iuam9pbigiLCAiKSsiXSJ9LGVxOmZ1bmN0aW9uKGIpe3JldHVybiAwPD1iP0IodGhpc1tiXSk6Qih0aGlzW3RoaXMubGVuZ3RoK2JdKX0sbGVuZ3RoOjAscHVzaDpQZixzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0sRWI9e307cygibXVsdGlwbGUgc2VsZWN0ZWQgY2hlY2tlZCBkaXNhYmxlZCByZWFkT25seSByZXF1aXJlZCBvcGVuIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGIpe0ViW1EoYildPWJ9KTt2YXIgTWM9e307cygiaW5wdXQgc2VsZWN0IG9wdGlvbiB0ZXh0YXJlYSBidXR0b24gZm9ybSBkZXRhaWxzIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGIpe01jW2JdPSEwfSk7dmFyIE5jPXtuZ01pbmxlbmd0aDoibWlubGVuZ3RoIixuZ01heGxlbmd0aDoibWF4bGVuZ3RoIixuZ01pbjoibWluIixuZ01heDoibWF4IixuZ1BhdHRlcm46InBhdHRlcm4ifTtzKHtkYXRhOlViLHJlbW92ZURhdGE6eGJ9LGZ1bmN0aW9uKGIsYSl7UlthXT1ifSk7cyh7ZGF0YTpVYiwNCi1pbmhlcml0ZWREYXRhOkRiLHNjb3BlOmZ1bmN0aW9uKGIpe3JldHVybiBCLmRhdGEoYiwiJHNjb3BlIil8fERiKGIucGFyZW50Tm9kZXx8YixbIiRpc29sYXRlU2NvcGUiLCIkc2NvcGUiXSl9LGlzb2xhdGVTY29wZTpmdW5jdGlvbihiKXtyZXR1cm4gQi5kYXRhKGIsIiRpc29sYXRlU2NvcGUiKXx8Qi5kYXRhKGIsIiRpc29sYXRlU2NvcGVOb1RlbXBsYXRlIil9LGNvbnRyb2xsZXI6SWMsaW5qZWN0b3I6ZnVuY3Rpb24oYil7cmV0dXJuIERiKGIsIiRpbmplY3RvciIpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGIsYSl7Yi5yZW1vdmVBdHRyaWJ1dGUoYSl9LGhhc0NsYXNzOkFiLGNzczpmdW5jdGlvbihiLGEsYyl7YT1jYihhKTtpZih5KGMpKWIuc3R5bGVbYV09YztlbHNlIHJldHVybiBiLnN0eWxlW2FdfSxhdHRyOmZ1bmN0aW9uKGIsYSxjKXt2YXIgZD1RKGEpO2lmKEViW2RdKWlmKHkoYykpYz8oYlthXT0hMCxiLnNldEF0dHJpYnV0ZShhLGQpKTooYlthXT0hMSxiLnJlbW92ZUF0dHJpYnV0ZShkKSk7DQotZWxzZSByZXR1cm4gYlthXXx8KGIuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYSl8fEMpLnNwZWNpZmllZD9kOnQ7ZWxzZSBpZih5KGMpKWIuc2V0QXR0cmlidXRlKGEsYyk7ZWxzZSBpZihiLmdldEF0dHJpYnV0ZSlyZXR1cm4gYj1iLmdldEF0dHJpYnV0ZShhLDIpLG51bGw9PT1iP3Q6Yn0scHJvcDpmdW5jdGlvbihiLGEsYyl7aWYoeShjKSliW2FdPWM7ZWxzZSByZXR1cm4gYlthXX0sdGV4dDpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSxiKXtpZihEKGIpKXt2YXIgZD1hLm5vZGVUeXBlO3JldHVybiBkPT09bmF8fGQ9PT1wYj9hLnRleHRDb250ZW50OiIifWEudGV4dENvbnRlbnQ9Yn1iLiRkdj0iIjtyZXR1cm4gYn0oKSx2YWw6ZnVuY3Rpb24oYixhKXtpZihEKGEpKXtpZihiLm11bHRpcGxlJiYic2VsZWN0Ij09PXVhKGIpKXt2YXIgYz1bXTtzKGIub3B0aW9ucyxmdW5jdGlvbihhKXthLnNlbGVjdGVkJiZjLnB1c2goYS52YWx1ZXx8YS50ZXh0KX0pO3JldHVybiAwPT09Yy5sZW5ndGg/DQotbnVsbDpjfXJldHVybiBiLnZhbHVlfWIudmFsdWU9YX0saHRtbDpmdW5jdGlvbihiLGEpe2lmKEQoYSkpcmV0dXJuIGIuaW5uZXJIVE1MO3diKGIsITApO2IuaW5uZXJIVE1MPWF9LGVtcHR5OkpjfSxmdW5jdGlvbihiLGEpe1IucHJvdG90eXBlW2FdPWZ1bmN0aW9uKGEsZCl7dmFyIGUsZixnPXRoaXMubGVuZ3RoO2lmKGIhPT1KYyYmKDI9PWIubGVuZ3RoJiZiIT09QWImJmIhPT1JYz9hOmQpPT09dCl7aWYoSChhKSl7Zm9yKGU9MDtlPGc7ZSsrKWlmKGI9PT1VYiliKHRoaXNbZV0sYSk7ZWxzZSBmb3IoZiBpbiBhKWIodGhpc1tlXSxmLGFbZl0pO3JldHVybiB0aGlzfWU9Yi4kZHY7Zz1lPT09dD9NYXRoLm1pbihnLDEpOmc7Zm9yKGY9MDtmPGc7ZisrKXt2YXIgaD1iKHRoaXNbZl0sYSxkKTtlPWU/ZStoOmh9cmV0dXJuIGV9Zm9yKGU9MDtlPGc7ZSsrKWIodGhpc1tlXSxhLGQpO3JldHVybiB0aGlzfX0pO3Moe3JlbW92ZURhdGE6eGIsb246ZnVuY3Rpb24gYShjLGQsZSxmKXtpZih5KGYpKXRocm93IFNiKCJvbmFyZ3MiKTsNCi1pZihFYyhjKSl7dmFyIGc9eWIoYywhMCk7Zj1nLmV2ZW50czt2YXIgaD1nLmhhbmRsZTtofHwoaD1nLmhhbmRsZT1sZihjLGYpKTtmb3IodmFyIGc9MDw9ZC5pbmRleE9mKCIgIik/ZC5zcGxpdCgiICIpOltkXSxsPWcubGVuZ3RoO2wtLTspe2Q9Z1tsXTt2YXIgaz1mW2RdO2t8fChmW2RdPVtdLCJtb3VzZWVudGVyIj09PWR8fCJtb3VzZWxlYXZlIj09PWQ/YShjLFFmW2RdLGZ1bmN0aW9uKGEpe3ZhciBjPWEucmVsYXRlZFRhcmdldDtjJiYoYz09PXRoaXN8fHRoaXMuY29udGFpbnMoYykpfHxoKGEsZCl9KToiJGRlc3Ryb3kiIT09ZCYmYy5hZGRFdmVudExpc3RlbmVyKGQsaCwhMSksaz1mW2RdKTtrLnB1c2goZSl9fX0sb2ZmOkhjLG9uZTpmdW5jdGlvbihhLGMsZCl7YT1CKGEpO2Eub24oYyxmdW5jdGlvbiBmKCl7YS5vZmYoYyxkKTthLm9mZihjLGYpfSk7YS5vbihjLGQpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbihhLGMpe3ZhciBkLGU9YS5wYXJlbnROb2RlO3diKGEpO3MobmV3IFIoYyksDQotZnVuY3Rpb24oYyl7ZD9lLmluc2VydEJlZm9yZShjLGQubmV4dFNpYmxpbmcpOmUucmVwbGFjZUNoaWxkKGMsYSk7ZD1jfSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO3MoYS5jaGlsZE5vZGVzLGZ1bmN0aW9uKGEpe2Eubm9kZVR5cGU9PT1uYSYmYy5wdXNoKGEpfSk7cmV0dXJuIGN9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbnRlbnREb2N1bWVudHx8YS5jaGlsZE5vZGVzfHxbXX0sYXBwZW5kOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5ub2RlVHlwZTtpZihkPT09bmF8fDExPT09ZCl7Yz1uZXcgUihjKTtmb3IodmFyIGQ9MCxlPWMubGVuZ3RoO2Q8ZTtkKyspYS5hcHBlbmRDaGlsZChjW2RdKX19LHByZXBlbmQ6ZnVuY3Rpb24oYSxjKXtpZihhLm5vZGVUeXBlPT09bmEpe3ZhciBkPWEuZmlyc3RDaGlsZDtzKG5ldyBSKGMpLGZ1bmN0aW9uKGMpe2EuaW5zZXJ0QmVmb3JlKGMsZCl9KX19LHdyYXA6ZnVuY3Rpb24oYSxjKXtjPUIoYykuZXEoMCkuY2xvbmUoKVswXTsNCi12YXIgZD1hLnBhcmVudE5vZGU7ZCYmZC5yZXBsYWNlQ2hpbGQoYyxhKTtjLmFwcGVuZENoaWxkKGEpfSxyZW1vdmU6S2MsZGV0YWNoOmZ1bmN0aW9uKGEpe0tjKGEsITApfSxhZnRlcjpmdW5jdGlvbihhLGMpe3ZhciBkPWEsZT1hLnBhcmVudE5vZGU7Yz1uZXcgUihjKTtmb3IodmFyIGY9MCxnPWMubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWNbZl07ZS5pbnNlcnRCZWZvcmUoaCxkLm5leHRTaWJsaW5nKTtkPWh9fSxhZGRDbGFzczpDYixyZW1vdmVDbGFzczpCYix0b2dnbGVDbGFzczpmdW5jdGlvbihhLGMsZCl7YyYmcyhjLnNwbGl0KCIgIiksZnVuY3Rpb24oYyl7dmFyIGY9ZDtEKGYpJiYoZj0hQWIoYSxjKSk7KGY/Q2I6QmIpKGEsYyl9KX0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybihhPWEucGFyZW50Tm9kZSkmJjExIT09YS5ub2RlVHlwZT9hOm51bGx9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubmV4dEVsZW1lbnRTaWJsaW5nfSxmaW5kOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/DQotYS5nZXRFbGVtZW50c0J5VGFnTmFtZShjKTpbXX0sY2xvbmU6VGIsdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGYsZz1jLnR5cGV8fGMsaD15YihhKTtpZihoPShoPWgmJmguZXZlbnRzKSYmaFtnXSllPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH0saXNEZWZhdWx0UHJldmVudGVkOmZ1bmN0aW9uKCl7cmV0dXJuITA9PT10aGlzLmRlZmF1bHRQcmV2ZW50ZWR9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPSEwfSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpmdW5jdGlvbigpe3JldHVybiEwPT09dGhpcy5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWR9LHN0b3BQcm9wYWdhdGlvbjpDLHR5cGU6Zyx0YXJnZXQ6YX0sYy50eXBlJiYoZT16KGUsYykpLGM9cWEoaCksZj1kP1tlXS5jb25jYXQoZCk6W2VdLHMoYyxmdW5jdGlvbihjKXtlLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCl8fA0KLWMuYXBwbHkoYSxmKX0pfX0sZnVuY3Rpb24oYSxjKXtSLnByb3RvdHlwZVtjXT1mdW5jdGlvbihjLGUsZil7Zm9yKHZhciBnLGg9MCxsPXRoaXMubGVuZ3RoO2g8bDtoKyspRChnKT8oZz1hKHRoaXNbaF0sYyxlLGYpLHkoZykmJihnPUIoZykpKTpHYyhnLGEodGhpc1toXSxjLGUsZikpO3JldHVybiB5KGcpP2c6dGhpc307Ui5wcm90b3R5cGUuYmluZD1SLnByb3RvdHlwZS5vbjtSLnByb3RvdHlwZS51bmJpbmQ9Ui5wcm90b3R5cGUub2ZmfSk7ZGIucHJvdG90eXBlPXtwdXQ6ZnVuY3Rpb24oYSxjKXt0aGlzW05hKGEsdGhpcy5uZXh0VWlkKV09Y30sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW05hKGEsdGhpcy5uZXh0VWlkKV19LHJlbW92ZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzW2E9TmEoYSx0aGlzLm5leHRVaWQpXTtkZWxldGUgdGhpc1thXTtyZXR1cm4gY319O3ZhciBQYz0vXmZ1bmN0aW9uXHMqW15cKF0qXChccyooW15cKV0qKVwpL20sbmY9LywvLG9mPS9eXHMqKF8/KShcUys/KVwxXHMqJC8sDQotT2M9LygoXC9cLy4qJCl8KFwvXCpbXHNcU10qP1wqXC8pKS9tZyxHYT1UKCIkaW5qZWN0b3IiKTtPYi4kJGFubm90YXRlPVZiO3ZhciBSZj1UKCIkYW5pbWF0ZSIpLENlPVsiJHByb3ZpZGUiLGZ1bmN0aW9uKGEpe3RoaXMuJCRzZWxlY3RvcnM9e307dGhpcy5yZWdpc3Rlcj1mdW5jdGlvbihjLGQpe3ZhciBlPWMrIi1hbmltYXRpb24iO2lmKGMmJiIuIiE9Yy5jaGFyQXQoMCkpdGhyb3cgUmYoIm5vdGNzZWwiLGMpO3RoaXMuJCRzZWxlY3RvcnNbYy5zdWJzdHIoMSldPWU7YS5mYWN0b3J5KGUsZCl9O3RoaXMuY2xhc3NOYW1lRmlsdGVyPWZ1bmN0aW9uKGEpezE9PT1hcmd1bWVudHMubGVuZ3RoJiYodGhpcy4kJGNsYXNzTmFtZUZpbHRlcj1hIGluc3RhbmNlb2YgUmVnRXhwP2E6bnVsbCk7cmV0dXJuIHRoaXMuJCRjbGFzc05hbWVGaWx0ZXJ9O3RoaXMuJGdldD1bIiQkcSIsIiQkYXN5bmNDYWxsYmFjayIsIiRyb290U2NvcGUiLGZ1bmN0aW9uKGEsZCxlKXtmdW5jdGlvbiBmKGQpe3ZhciBmLA0KLWc9YS5kZWZlcigpO2cucHJvbWlzZS4kJGNhbmNlbEZuPWZ1bmN0aW9uKCl7ZiYmZigpfTtlLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpe2Y9ZChmdW5jdGlvbigpe2cucmVzb2x2ZSgpfSl9KTtyZXR1cm4gZy5wcm9taXNlfWZ1bmN0aW9uIGcoYSxjKXt2YXIgZD1bXSxlPVtdLGY9aGEoKTtzKChhLmF0dHIoImNsYXNzIil8fCIiKS5zcGxpdCgvXHMrLyksZnVuY3Rpb24oYSl7ZlthXT0hMH0pO3MoYyxmdW5jdGlvbihhLGMpe3ZhciBnPWZbY107ITE9PT1hJiZnP2UucHVzaChjKTohMCE9PWF8fGd8fGQucHVzaChjKX0pO3JldHVybiAwPGQubGVuZ3RoK2UubGVuZ3RoJiZbZC5sZW5ndGg/ZDpudWxsLGUubGVuZ3RoP2U6bnVsbF19ZnVuY3Rpb24gaChhLGMsZCl7Zm9yKHZhciBlPTAsZj1jLmxlbmd0aDtlPGY7KytlKWFbY1tlXV09ZH1mdW5jdGlvbiBsKCl7bXx8KG09YS5kZWZlcigpLGQoZnVuY3Rpb24oKXttLnJlc29sdmUoKTttPW51bGx9KSk7cmV0dXJuIG0ucHJvbWlzZX1mdW5jdGlvbiBrKGEsDQotYyl7aWYoZ2EuaXNPYmplY3QoYykpe3ZhciBkPXooYy5mcm9tfHx7fSxjLnRvfHx7fSk7YS5jc3MoZCl9fXZhciBtO3JldHVybnthbmltYXRlOmZ1bmN0aW9uKGEsYyxkKXtrKGEse2Zyb206Yyx0bzpkfSk7cmV0dXJuIGwoKX0sZW50ZXI6ZnVuY3Rpb24oYSxjLGQsZSl7ayhhLGUpO2Q/ZC5hZnRlcihhKTpjLnByZXBlbmQoYSk7cmV0dXJuIGwoKX0sbGVhdmU6ZnVuY3Rpb24oYSxjKXthLnJlbW92ZSgpO3JldHVybiBsKCl9LG1vdmU6ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIHRoaXMuZW50ZXIoYSxjLGQsZSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5zZXRDbGFzcyhhLGMsW10sZCl9LCQkYWRkQ2xhc3NJbW1lZGlhdGVseTpmdW5jdGlvbihhLGMsZCl7YT1CKGEpO2M9RihjKT9jOngoYyk/Yy5qb2luKCIgIik6IiI7cyhhLGZ1bmN0aW9uKGEpe0NiKGEsYyl9KTtrKGEsZCk7cmV0dXJuIGwoKX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLnNldENsYXNzKGEsDQotW10sYyxkKX0sJCRyZW1vdmVDbGFzc0ltbWVkaWF0ZWx5OmZ1bmN0aW9uKGEsYyxkKXthPUIoYSk7Yz1GKGMpP2M6eChjKT9jLmpvaW4oIiAiKToiIjtzKGEsZnVuY3Rpb24oYSl7QmIoYSxjKX0pO2soYSxkKTtyZXR1cm4gbCgpfSxzZXRDbGFzczpmdW5jdGlvbihhLGMsZCxlKXt2YXIgaz10aGlzLGw9ITE7YT1CKGEpO3ZhciBtPWEuZGF0YSgiJCRhbmltYXRlQ2xhc3NlcyIpO20/ZSYmbS5vcHRpb25zJiYobS5vcHRpb25zPWdhLmV4dGVuZChtLm9wdGlvbnN8fHt9LGUpKToobT17Y2xhc3Nlczp7fSxvcHRpb25zOmV9LGw9ITApO2U9bS5jbGFzc2VzO2M9eChjKT9jOmMuc3BsaXQoIiAiKTtkPXgoZCk/ZDpkLnNwbGl0KCIgIik7aChlLGMsITApO2goZSxkLCExKTtsJiYobS5wcm9taXNlPWYoZnVuY3Rpb24oYyl7dmFyIGQ9YS5kYXRhKCIkJGFuaW1hdGVDbGFzc2VzIik7YS5yZW1vdmVEYXRhKCIkJGFuaW1hdGVDbGFzc2VzIik7aWYoZCl7dmFyIGU9ZyhhLGQuY2xhc3Nlcyk7ZSYmDQotay4kJHNldENsYXNzSW1tZWRpYXRlbHkoYSxlWzBdLGVbMV0sZC5vcHRpb25zKX1jKCl9KSxhLmRhdGEoIiQkYW5pbWF0ZUNsYXNzZXMiLG0pKTtyZXR1cm4gbS5wcm9taXNlfSwkJHNldENsYXNzSW1tZWRpYXRlbHk6ZnVuY3Rpb24oYSxjLGQsZSl7YyYmdGhpcy4kJGFkZENsYXNzSW1tZWRpYXRlbHkoYSxjKTtkJiZ0aGlzLiQkcmVtb3ZlQ2xhc3NJbW1lZGlhdGVseShhLGQpO2soYSxlKTtyZXR1cm4gbCgpfSxlbmFibGVkOkMsY2FuY2VsOkN9fV19XSxqYT1UKCIkY29tcGlsZSIpO3djLiRpbmplY3Q9WyIkcHJvdmlkZSIsIiQkc2FuaXRpemVVcmlQcm92aWRlciJdO3ZhciBSYz0vXigoPzp4fGRhdGEpW1w6XC1fXSkvaSxWYz0iYXBwbGljYXRpb24vanNvbiIsWmI9eyJDb250ZW50LVR5cGUiOlZjKyI7Y2hhcnNldD11dGYtOCJ9LHRmPS9eXFt8Xlx7KD8hXHspLyx1Zj17IlsiOi9dJC8sInsiOi99JC99LHNmPS9eXClcXVx9Jyw/XG4vLCRiPVQoIiRpbnRlcnBvbGF0ZSIpLFNmPS9eKFteXD8jXSopKFw/KFteI10qKSk/KCMoLiopKT8kLywNCi14Zj17aHR0cDo4MCxodHRwczo0NDMsZnRwOjIxfSxGYj1UKCIkbG9jYXRpb24iKSxUZj17JCRodG1sNTohMSwkJHJlcGxhY2U6ITEsYWJzVXJsOkdiKCIkJGFic1VybCIpLHVybDpmdW5jdGlvbihhKXtpZihEKGEpKXJldHVybiB0aGlzLiQkdXJsO3ZhciBjPVNmLmV4ZWMoYSk7KGNbMV18fCIiPT09YSkmJnRoaXMucGF0aChkZWNvZGVVUklDb21wb25lbnQoY1sxXSkpOyhjWzJdfHxjWzFdfHwiIj09PWEpJiZ0aGlzLnNlYXJjaChjWzNdfHwiIik7dGhpcy5oYXNoKGNbNV18fCIiKTtyZXR1cm4gdGhpc30scHJvdG9jb2w6R2IoIiQkcHJvdG9jb2wiKSxob3N0OkdiKCIkJGhvc3QiKSxwb3J0OkdiKCIkJHBvcnQiKSxwYXRoOmRkKCIkJHBhdGgiLGZ1bmN0aW9uKGEpe2E9bnVsbCE9PWE/YS50b1N0cmluZygpOiIiO3JldHVybiIvIj09YS5jaGFyQXQoMCk/YToiLyIrYX0pLHNlYXJjaDpmdW5jdGlvbihhLGMpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHRoaXMuJCRzZWFyY2g7DQotY2FzZSAxOmlmKEYoYSl8fFYoYSkpYT1hLnRvU3RyaW5nKCksdGhpcy4kJHNlYXJjaD1xYyhhKTtlbHNlIGlmKEgoYSkpYT1FYShhLHt9KSxzKGEsZnVuY3Rpb24oYyxlKXtudWxsPT1jJiZkZWxldGUgYVtlXX0pLHRoaXMuJCRzZWFyY2g9YTtlbHNlIHRocm93IEZiKCJpc3JjaGFyZyIpO2JyZWFrO2RlZmF1bHQ6RChjKXx8bnVsbD09PWM/ZGVsZXRlIHRoaXMuJCRzZWFyY2hbYV06dGhpcy4kJHNlYXJjaFthXT1jfXRoaXMuJCRjb21wb3NlKCk7cmV0dXJuIHRoaXN9LGhhc2g6ZGQoIiQkaGFzaCIsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hP2EudG9TdHJpbmcoKToiIn0pLHJlcGxhY2U6ZnVuY3Rpb24oKXt0aGlzLiQkcmVwbGFjZT0hMDtyZXR1cm4gdGhpc319O3MoW2NkLGRjLGNjXSxmdW5jdGlvbihhKXthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFRmKTthLnByb3RvdHlwZS5zdGF0ZT1mdW5jdGlvbihjKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy4kJHN0YXRlOw0KLWlmKGEhPT1jY3x8IXRoaXMuJCRodG1sNSl0aHJvdyBGYigibm9zdGF0ZSIpO3RoaXMuJCRzdGF0ZT1EKGMpP251bGw6YztyZXR1cm4gdGhpc319KTt2YXIgbGE9VCgiJHBhcnNlIiksVWY9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsVmY9RnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LFdmPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLGxiPWhhKCk7cyh7Im51bGwiOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LCJ0cnVlIjpmdW5jdGlvbigpe3JldHVybiEwfSwiZmFsc2UiOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHVuZGVmaW5lZDpmdW5jdGlvbigpe319LGZ1bmN0aW9uKGEsYyl7YS5jb25zdGFudD1hLmxpdGVyYWw9YS5zaGFyZWRHZXR0ZXI9ITA7bGJbY109YX0pO2xiWyJ0aGlzIl09ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2xiWyJ0aGlzIl0uc2hhcmVkR2V0dGVyPSEwO3ZhciBtYj16KGhhKCkseyIrIjpmdW5jdGlvbihhLGMsZCxlKXtkPWQoYSxjKTtlPWUoYSxjKTtyZXR1cm4geShkKT95KGUpPw0KLWQrZTpkOnkoZSk/ZTp0fSwiLSI6ZnVuY3Rpb24oYSxjLGQsZSl7ZD1kKGEsYyk7ZT1lKGEsYyk7cmV0dXJuKHkoZCk/ZDowKS0oeShlKT9lOjApfSwiKiI6ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIGQoYSxjKSplKGEsYyl9LCIvIjpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gZChhLGMpL2UoYSxjKX0sIiUiOmZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBkKGEsYyklZShhLGMpfSwiPT09IjpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gZChhLGMpPT09ZShhLGMpfSwiIT09IjpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gZChhLGMpIT09ZShhLGMpfSwiPT0iOmZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBkKGEsYyk9PWUoYSxjKX0sIiE9IjpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gZChhLGMpIT1lKGEsYyl9LCI8IjpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gZChhLGMpPGUoYSxjKX0sIj4iOmZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBkKGEsYyk+ZShhLGMpfSwiPD0iOmZ1bmN0aW9uKGEsDQotYyxkLGUpe3JldHVybiBkKGEsYyk8PWUoYSxjKX0sIj49IjpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gZChhLGMpPj1lKGEsYyl9LCImJiI6ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIGQoYSxjKSYmZShhLGMpfSwifHwiOmZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBkKGEsYyl8fGUoYSxjKX0sIiEiOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4hZChhLGMpfSwiPSI6ITAsInwiOiEwfSksWGY9e246IlxuIixmOiJcZiIscjoiXHIiLHQ6Ilx0Iix2OiJcdiIsIiciOiInIiwnIic6JyInfSxnYz1mdW5jdGlvbihhKXt0aGlzLm9wdGlvbnM9YX07Z2MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpnYyxsZXg6ZnVuY3Rpb24oYSl7dGhpcy50ZXh0PWE7dGhpcy5pbmRleD0wO2Zvcih0aGlzLnRva2Vucz1bXTt0aGlzLmluZGV4PHRoaXMudGV4dC5sZW5ndGg7KWlmKGE9dGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4KSwnIic9PT1hfHwiJyI9PT1hKXRoaXMucmVhZFN0cmluZyhhKTtlbHNlIGlmKHRoaXMuaXNOdW1iZXIoYSl8fA0KLSIuIj09PWEmJnRoaXMuaXNOdW1iZXIodGhpcy5wZWVrKCkpKXRoaXMucmVhZE51bWJlcigpO2Vsc2UgaWYodGhpcy5pc0lkZW50KGEpKXRoaXMucmVhZElkZW50KCk7ZWxzZSBpZih0aGlzLmlzKGEsIigpe31bXS4sOzo/IikpdGhpcy50b2tlbnMucHVzaCh7aW5kZXg6dGhpcy5pbmRleCx0ZXh0OmF9KSx0aGlzLmluZGV4Kys7ZWxzZSBpZih0aGlzLmlzV2hpdGVzcGFjZShhKSl0aGlzLmluZGV4Kys7ZWxzZXt2YXIgYz1hK3RoaXMucGVlaygpLGQ9Yyt0aGlzLnBlZWsoMiksZT1tYltjXSxmPW1iW2RdO21iW2FdfHxlfHxmPyhhPWY/ZDplP2M6YSx0aGlzLnRva2Vucy5wdXNoKHtpbmRleDp0aGlzLmluZGV4LHRleHQ6YSxvcGVyYXRvcjohMH0pLHRoaXMuaW5kZXgrPWEubGVuZ3RoKTp0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgbmV4dCBjaGFyYWN0ZXIgIix0aGlzLmluZGV4LHRoaXMuaW5kZXgrMSl9cmV0dXJuIHRoaXMudG9rZW5zfSxpczpmdW5jdGlvbihhLGMpe3JldHVybi0xIT09DQotYy5pbmRleE9mKGEpfSxwZWVrOmZ1bmN0aW9uKGEpe2E9YXx8MTtyZXR1cm4gdGhpcy5pbmRleCthPHRoaXMudGV4dC5sZW5ndGg/dGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4K2EpOiExfSxpc051bWJlcjpmdW5jdGlvbihhKXtyZXR1cm4iMCI8PWEmJiI5Ij49YSYmInN0cmluZyI9PT10eXBlb2YgYX0saXNXaGl0ZXNwYWNlOmZ1bmN0aW9uKGEpe3JldHVybiIgIj09PWF8fCJcciI9PT1hfHwiXHQiPT09YXx8IlxuIj09PWF8fCJcdiI9PT1hfHwiXHUwMGEwIj09PWF9LGlzSWRlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuImEiPD1hJiYieiI+PWF8fCJBIjw9YSYmIloiPj1hfHwiXyI9PT1hfHwiJCI9PT1hfSxpc0V4cE9wZXJhdG9yOmZ1bmN0aW9uKGEpe3JldHVybiItIj09PWF8fCIrIj09PWF8fHRoaXMuaXNOdW1iZXIoYSl9LHRocm93RXJyb3I6ZnVuY3Rpb24oYSxjLGQpe2Q9ZHx8dGhpcy5pbmRleDtjPXkoYyk/InMgIitjKyItIit0aGlzLmluZGV4KyIgWyIrdGhpcy50ZXh0LnN1YnN0cmluZyhjLA0KLWQpKyJdIjoiICIrZDt0aHJvdyBsYSgibGV4ZXJyIixhLGMsdGhpcy50ZXh0KTt9LHJlYWROdW1iZXI6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IiIsYz10aGlzLmluZGV4O3RoaXMuaW5kZXg8dGhpcy50ZXh0Lmxlbmd0aDspe3ZhciBkPVEodGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4KSk7aWYoIi4iPT1kfHx0aGlzLmlzTnVtYmVyKGQpKWErPWQ7ZWxzZXt2YXIgZT10aGlzLnBlZWsoKTtpZigiZSI9PWQmJnRoaXMuaXNFeHBPcGVyYXRvcihlKSlhKz1kO2Vsc2UgaWYodGhpcy5pc0V4cE9wZXJhdG9yKGQpJiZlJiZ0aGlzLmlzTnVtYmVyKGUpJiYiZSI9PWEuY2hhckF0KGEubGVuZ3RoLTEpKWErPWQ7ZWxzZSBpZighdGhpcy5pc0V4cE9wZXJhdG9yKGQpfHxlJiZ0aGlzLmlzTnVtYmVyKGUpfHwiZSIhPWEuY2hhckF0KGEubGVuZ3RoLTEpKWJyZWFrO2Vsc2UgdGhpcy50aHJvd0Vycm9yKCJJbnZhbGlkIGV4cG9uZW50Iil9dGhpcy5pbmRleCsrfXRoaXMudG9rZW5zLnB1c2goe2luZGV4OmMsDQotdGV4dDphLGNvbnN0YW50OiEwLHZhbHVlOk51bWJlcihhKX0pfSxyZWFkSWRlbnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5pbmRleDt0aGlzLmluZGV4PHRoaXMudGV4dC5sZW5ndGg7KXt2YXIgYz10aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpO2lmKCF0aGlzLmlzSWRlbnQoYykmJiF0aGlzLmlzTnVtYmVyKGMpKWJyZWFrO3RoaXMuaW5kZXgrK310aGlzLnRva2Vucy5wdXNoKHtpbmRleDphLHRleHQ6dGhpcy50ZXh0LnNsaWNlKGEsdGhpcy5pbmRleCksaWRlbnRpZmllcjohMH0pfSxyZWFkU3RyaW5nOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuaW5kZXg7dGhpcy5pbmRleCsrO2Zvcih2YXIgZD0iIixlPWEsZj0hMTt0aGlzLmluZGV4PHRoaXMudGV4dC5sZW5ndGg7KXt2YXIgZz10aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpLGU9ZStnO2lmKGYpInUiPT09Zz8oZj10aGlzLnRleHQuc3Vic3RyaW5nKHRoaXMuaW5kZXgrMSx0aGlzLmluZGV4KzUpLGYubWF0Y2goL1tcZGEtZl17NH0vaSl8fA0KLXRoaXMudGhyb3dFcnJvcigiSW52YWxpZCB1bmljb2RlIGVzY2FwZSBbXFx1IitmKyJdIiksdGhpcy5pbmRleCs9NCxkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGYsMTYpKSk6ZCs9WGZbZ118fGcsZj0hMTtlbHNlIGlmKCJcXCI9PT1nKWY9ITA7ZWxzZXtpZihnPT09YSl7dGhpcy5pbmRleCsrO3RoaXMudG9rZW5zLnB1c2goe2luZGV4OmMsdGV4dDplLGNvbnN0YW50OiEwLHZhbHVlOmR9KTtyZXR1cm59ZCs9Z310aGlzLmluZGV4Kyt9dGhpcy50aHJvd0Vycm9yKCJVbnRlcm1pbmF0ZWQgcXVvdGUiLGMpfX07dmFyIGhiPWZ1bmN0aW9uKGEsYyxkKXt0aGlzLmxleGVyPWE7dGhpcy4kZmlsdGVyPWM7dGhpcy5vcHRpb25zPWR9O2hiLlpFUk89eihmdW5jdGlvbigpe3JldHVybiAwfSx7c2hhcmVkR2V0dGVyOiEwLGNvbnN0YW50OiEwfSk7aGIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpoYixwYXJzZTpmdW5jdGlvbihhKXt0aGlzLnRleHQ9YTt0aGlzLnRva2Vucz10aGlzLmxleGVyLmxleChhKTsNCi1hPXRoaXMuc3RhdGVtZW50cygpOzAhPT10aGlzLnRva2Vucy5sZW5ndGgmJnRoaXMudGhyb3dFcnJvcigiaXMgYW4gdW5leHBlY3RlZCB0b2tlbiIsdGhpcy50b2tlbnNbMF0pO2EubGl0ZXJhbD0hIWEubGl0ZXJhbDthLmNvbnN0YW50PSEhYS5jb25zdGFudDtyZXR1cm4gYX0scHJpbWFyeTpmdW5jdGlvbigpe3ZhciBhO3RoaXMuZXhwZWN0KCIoIik/KGE9dGhpcy5maWx0ZXJDaGFpbigpLHRoaXMuY29uc3VtZSgiKSIpKTp0aGlzLmV4cGVjdCgiWyIpP2E9dGhpcy5hcnJheURlY2xhcmF0aW9uKCk6dGhpcy5leHBlY3QoInsiKT9hPXRoaXMub2JqZWN0KCk6dGhpcy5wZWVrKCkuaWRlbnRpZmllciYmdGhpcy5wZWVrKCkudGV4dCBpbiBsYj9hPWxiW3RoaXMuY29uc3VtZSgpLnRleHRdOnRoaXMucGVlaygpLmlkZW50aWZpZXI/YT10aGlzLmlkZW50aWZpZXIoKTp0aGlzLnBlZWsoKS5jb25zdGFudD9hPXRoaXMuY29uc3RhbnQoKTp0aGlzLnRocm93RXJyb3IoIm5vdCBhIHByaW1hcnkgZXhwcmVzc2lvbiIsDQotdGhpcy5wZWVrKCkpO2Zvcih2YXIgYyxkO2M9dGhpcy5leHBlY3QoIigiLCJbIiwiLiIpOykiKCI9PT1jLnRleHQ/KGE9dGhpcy5mdW5jdGlvbkNhbGwoYSxkKSxkPW51bGwpOiJbIj09PWMudGV4dD8oZD1hLGE9dGhpcy5vYmplY3RJbmRleChhKSk6Ii4iPT09Yy50ZXh0PyhkPWEsYT10aGlzLmZpZWxkQWNjZXNzKGEpKTp0aGlzLnRocm93RXJyb3IoIklNUE9TU0lCTEUiKTtyZXR1cm4gYX0sdGhyb3dFcnJvcjpmdW5jdGlvbihhLGMpe3Rocm93IGxhKCJzeW50YXgiLGMudGV4dCxhLGMuaW5kZXgrMSx0aGlzLnRleHQsdGhpcy50ZXh0LnN1YnN0cmluZyhjLmluZGV4KSk7fSxwZWVrVG9rZW46ZnVuY3Rpb24oKXtpZigwPT09dGhpcy50b2tlbnMubGVuZ3RoKXRocm93IGxhKCJ1ZW9lIix0aGlzLnRleHQpO3JldHVybiB0aGlzLnRva2Vuc1swXX0scGVlazpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gdGhpcy5wZWVrQWhlYWQoMCxhLGMsZCxlKX0scGVla0FoZWFkOmZ1bmN0aW9uKGEsDQotYyxkLGUsZil7aWYodGhpcy50b2tlbnMubGVuZ3RoPmEpe2E9dGhpcy50b2tlbnNbYV07dmFyIGc9YS50ZXh0O2lmKGc9PT1jfHxnPT09ZHx8Zz09PWV8fGc9PT1mfHwhKGN8fGR8fGV8fGYpKXJldHVybiBhfXJldHVybiExfSxleHBlY3Q6ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuKGE9dGhpcy5wZWVrKGEsYyxkLGUpKT8odGhpcy50b2tlbnMuc2hpZnQoKSxhKTohMX0sY29uc3VtZTpmdW5jdGlvbihhKXtpZigwPT09dGhpcy50b2tlbnMubGVuZ3RoKXRocm93IGxhKCJ1ZW9lIix0aGlzLnRleHQpO3ZhciBjPXRoaXMuZXhwZWN0KGEpO2N8fHRoaXMudGhyb3dFcnJvcigiaXMgdW5leHBlY3RlZCwgZXhwZWN0aW5nIFsiK2ErIl0iLHRoaXMucGVlaygpKTtyZXR1cm4gY30sdW5hcnlGbjpmdW5jdGlvbihhLGMpe3ZhciBkPW1iW2FdO3JldHVybiB6KGZ1bmN0aW9uKGEsZil7cmV0dXJuIGQoYSxmLGMpfSx7Y29uc3RhbnQ6Yy5jb25zdGFudCxpbnB1dHM6W2NdfSl9LGJpbmFyeUZuOmZ1bmN0aW9uKGEsDQotYyxkLGUpe3ZhciBmPW1iW2NdO3JldHVybiB6KGZ1bmN0aW9uKGMsZSl7cmV0dXJuIGYoYyxlLGEsZCl9LHtjb25zdGFudDphLmNvbnN0YW50JiZkLmNvbnN0YW50LGlucHV0czohZSYmW2EsZF19KX0saWRlbnRpZmllcjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmNvbnN1bWUoKS50ZXh0O3RoaXMucGVlaygiLiIpJiZ0aGlzLnBlZWtBaGVhZCgxKS5pZGVudGlmaWVyJiYhdGhpcy5wZWVrQWhlYWQoMiwiKCIpOylhKz10aGlzLmNvbnN1bWUoKS50ZXh0K3RoaXMuY29uc3VtZSgpLnRleHQ7cmV0dXJuIHpmKGEsdGhpcy5vcHRpb25zLHRoaXMudGV4dCl9LGNvbnN0YW50OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jb25zdW1lKCkudmFsdWU7cmV0dXJuIHooZnVuY3Rpb24oKXtyZXR1cm4gYX0se2NvbnN0YW50OiEwLGxpdGVyYWw6ITB9KX0sc3RhdGVtZW50czpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXTs7KWlmKDA8dGhpcy50b2tlbnMubGVuZ3RoJiYhdGhpcy5wZWVrKCJ9IiwiKSIsDQotIjsiLCJdIikmJmEucHVzaCh0aGlzLmZpbHRlckNoYWluKCkpLCF0aGlzLmV4cGVjdCgiOyIpKXJldHVybiAxPT09YS5sZW5ndGg/YVswXTpmdW5jdGlvbihjLGQpe2Zvcih2YXIgZSxmPTAsZz1hLmxlbmd0aDtmPGc7ZisrKWU9YVtmXShjLGQpO3JldHVybiBlfX0sZmlsdGVyQ2hhaW46ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5leHByZXNzaW9uKCk7dGhpcy5leHBlY3QoInwiKTspYT10aGlzLmZpbHRlcihhKTtyZXR1cm4gYX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuJGZpbHRlcih0aGlzLmNvbnN1bWUoKS50ZXh0KSxkLGU7aWYodGhpcy5wZWVrKCI6IikpZm9yKGQ9W10sZT1bXTt0aGlzLmV4cGVjdCgiOiIpOylkLnB1c2godGhpcy5leHByZXNzaW9uKCkpO3ZhciBmPVthXS5jb25jYXQoZHx8W10pO3JldHVybiB6KGZ1bmN0aW9uKGYsaCl7dmFyIGw9YShmLGgpO2lmKGUpe2VbMF09bDtmb3IobD1kLmxlbmd0aDtsLS07KWVbbCsxXT1kW2xdKGYsaCk7cmV0dXJuIGMuYXBwbHkodCwNCi1lKX1yZXR1cm4gYyhsKX0se2NvbnN0YW50OiFjLiRzdGF0ZWZ1bCYmZi5ldmVyeShlYyksaW5wdXRzOiFjLiRzdGF0ZWZ1bCYmZn0pfSxleHByZXNzaW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXNzaWdubWVudCgpfSxhc3NpZ25tZW50OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50ZXJuYXJ5KCksYyxkO3JldHVybihkPXRoaXMuZXhwZWN0KCI9IikpPyhhLmFzc2lnbnx8dGhpcy50aHJvd0Vycm9yKCJpbXBsaWVzIGFzc2lnbm1lbnQgYnV0IFsiK3RoaXMudGV4dC5zdWJzdHJpbmcoMCxkLmluZGV4KSsiXSBjYW4gbm90IGJlIGFzc2lnbmVkIHRvIixkKSxjPXRoaXMudGVybmFyeSgpLHooZnVuY3Rpb24oZCxmKXtyZXR1cm4gYS5hc3NpZ24oZCxjKGQsZiksZil9LHtpbnB1dHM6W2EsY119KSk6YX0sdGVybmFyeTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubG9naWNhbE9SKCksYztpZih0aGlzLmV4cGVjdCgiPyIpJiYoYz10aGlzLmFzc2lnbm1lbnQoKSx0aGlzLmNvbnN1bWUoIjoiKSkpe3ZhciBkPQ0KLXRoaXMuYXNzaWdubWVudCgpO3JldHVybiB6KGZ1bmN0aW9uKGUsZil7cmV0dXJuIGEoZSxmKT9jKGUsZik6ZChlLGYpfSx7Y29uc3RhbnQ6YS5jb25zdGFudCYmYy5jb25zdGFudCYmZC5jb25zdGFudH0pfXJldHVybiBhfSxsb2dpY2FsT1I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5sb2dpY2FsQU5EKCksYztjPXRoaXMuZXhwZWN0KCJ8fCIpOylhPXRoaXMuYmluYXJ5Rm4oYSxjLnRleHQsdGhpcy5sb2dpY2FsQU5EKCksITApO3JldHVybiBhfSxsb2dpY2FsQU5EOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZXF1YWxpdHkoKSxjO2M9dGhpcy5leHBlY3QoIiYmIik7KWE9dGhpcy5iaW5hcnlGbihhLGMudGV4dCx0aGlzLmVxdWFsaXR5KCksITApO3JldHVybiBhfSxlcXVhbGl0eTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnJlbGF0aW9uYWwoKSxjO2M9dGhpcy5leHBlY3QoIj09IiwiIT0iLCI9PT0iLCIhPT0iKTspYT10aGlzLmJpbmFyeUZuKGEsYy50ZXh0LHRoaXMucmVsYXRpb25hbCgpKTsNCi1yZXR1cm4gYX0scmVsYXRpb25hbDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmFkZGl0aXZlKCksYztjPXRoaXMuZXhwZWN0KCI8IiwiPiIsIjw9IiwiPj0iKTspYT10aGlzLmJpbmFyeUZuKGEsYy50ZXh0LHRoaXMuYWRkaXRpdmUoKSk7cmV0dXJuIGF9LGFkZGl0aXZlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMubXVsdGlwbGljYXRpdmUoKSxjO2M9dGhpcy5leHBlY3QoIisiLCItIik7KWE9dGhpcy5iaW5hcnlGbihhLGMudGV4dCx0aGlzLm11bHRpcGxpY2F0aXZlKCkpO3JldHVybiBhfSxtdWx0aXBsaWNhdGl2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnVuYXJ5KCksYztjPXRoaXMuZXhwZWN0KCIqIiwiLyIsIiUiKTspYT10aGlzLmJpbmFyeUZuKGEsYy50ZXh0LHRoaXMudW5hcnkoKSk7cmV0dXJuIGF9LHVuYXJ5OmZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIHRoaXMuZXhwZWN0KCIrIik/dGhpcy5wcmltYXJ5KCk6KGE9dGhpcy5leHBlY3QoIi0iKSk/dGhpcy5iaW5hcnlGbihoYi5aRVJPLA0KLWEudGV4dCx0aGlzLnVuYXJ5KCkpOihhPXRoaXMuZXhwZWN0KCIhIikpP3RoaXMudW5hcnlGbihhLnRleHQsdGhpcy51bmFyeSgpKTp0aGlzLnByaW1hcnkoKX0sZmllbGRBY2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5pZGVudGlmaWVyKCk7cmV0dXJuIHooZnVuY3Rpb24oZCxlLGYpe2Q9Znx8YShkLGUpO3JldHVybiBudWxsPT1kP3Q6YyhkKX0se2Fzc2lnbjpmdW5jdGlvbihkLGUsZil7KGY9YShkLGYpKXx8YS5hc3NpZ24oZCxmPXt9KTtyZXR1cm4gYy5hc3NpZ24oZixlKX19KX0sb2JqZWN0SW5kZXg6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy50ZXh0LGQ9dGhpcy5leHByZXNzaW9uKCk7dGhpcy5jb25zdW1lKCJdIik7cmV0dXJuIHooZnVuY3Rpb24oZSxmKXt2YXIgZz1hKGUsZiksaD1kKGUsZik7c2EoaCxjKTtyZXR1cm4gZz90YShnW2hdLGMpOnR9LHthc3NpZ246ZnVuY3Rpb24oZSxmLGcpe3ZhciBoPXNhKGQoZSxnKSxjKTsoZz10YShhKGUsZyksYykpfHxhLmFzc2lnbihlLA0KLWc9e30pO3JldHVybiBnW2hdPWZ9fSl9LGZ1bmN0aW9uQ2FsbDpmdW5jdGlvbihhLGMpe3ZhciBkPVtdO2lmKCIpIiE9PXRoaXMucGVla1Rva2VuKCkudGV4dCl7ZG8gZC5wdXNoKHRoaXMuZXhwcmVzc2lvbigpKTt3aGlsZSh0aGlzLmV4cGVjdCgiLCIpKX10aGlzLmNvbnN1bWUoIikiKTt2YXIgZT10aGlzLnRleHQsZj1kLmxlbmd0aD9bXTpudWxsO3JldHVybiBmdW5jdGlvbihnLGgpe3ZhciBsPWM/YyhnLGgpOnkoYyk/dDpnLGs9YShnLGgsbCl8fEM7aWYoZilmb3IodmFyIG09ZC5sZW5ndGg7bS0tOylmW21dPXRhKGRbbV0oZyxoKSxlKTt0YShsLGUpO2lmKGspe2lmKGsuY29uc3RydWN0b3I9PT1rKXRocm93IGxhKCJpc2VjZm4iLGUpO2lmKGs9PT1VZnx8az09PVZmfHxrPT09V2YpdGhyb3cgbGEoImlzZWNmZiIsZSk7fWw9ay5hcHBseT9rLmFwcGx5KGwsZik6ayhmWzBdLGZbMV0sZlsyXSxmWzNdLGZbNF0pO3JldHVybiB0YShsLGUpfX0sYXJyYXlEZWNsYXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQ0KLVtdO2lmKCJdIiE9PXRoaXMucGVla1Rva2VuKCkudGV4dCl7ZG97aWYodGhpcy5wZWVrKCJdIikpYnJlYWs7YS5wdXNoKHRoaXMuZXhwcmVzc2lvbigpKX13aGlsZSh0aGlzLmV4cGVjdCgiLCIpKX10aGlzLmNvbnN1bWUoIl0iKTtyZXR1cm4geihmdW5jdGlvbihjLGQpe2Zvcih2YXIgZT1bXSxmPTAsZz1hLmxlbmd0aDtmPGc7ZisrKWUucHVzaChhW2ZdKGMsZCkpO3JldHVybiBlfSx7bGl0ZXJhbDohMCxjb25zdGFudDphLmV2ZXJ5KGVjKSxpbnB1dHM6YX0pfSxvYmplY3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXSxjPVtdO2lmKCJ9IiE9PXRoaXMucGVla1Rva2VuKCkudGV4dCl7ZG97aWYodGhpcy5wZWVrKCJ9IikpYnJlYWs7dmFyIGQ9dGhpcy5jb25zdW1lKCk7ZC5jb25zdGFudD9hLnB1c2goZC52YWx1ZSk6ZC5pZGVudGlmaWVyP2EucHVzaChkLnRleHQpOnRoaXMudGhyb3dFcnJvcigiaW52YWxpZCBrZXkiLGQpO3RoaXMuY29uc3VtZSgiOiIpO2MucHVzaCh0aGlzLmV4cHJlc3Npb24oKSl9d2hpbGUodGhpcy5leHBlY3QoIiwiKSkNCi19dGhpcy5jb25zdW1lKCJ9Iik7cmV0dXJuIHooZnVuY3Rpb24oZCxmKXtmb3IodmFyIGc9e30saD0wLGw9Yy5sZW5ndGg7aDxsO2grKylnW2FbaF1dPWNbaF0oZCxmKTtyZXR1cm4gZ30se2xpdGVyYWw6ITAsY29uc3RhbnQ6Yy5ldmVyeShlYyksaW5wdXRzOmN9KX19O3ZhciBCZj1oYSgpLEFmPWhhKCksQ2Y9T2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mLENhPVQoIiRzY2UiKSxtYT17SFRNTDoiaHRtbCIsQ1NTOiJjc3MiLFVSTDoidXJsIixSRVNPVVJDRV9VUkw6InJlc291cmNlVXJsIixKUzoianMifSxqYT1UKCIkY29tcGlsZSIpLFo9WS5jcmVhdGVFbGVtZW50KCJhIiksaWQ9QmEoTS5sb2NhdGlvbi5ocmVmKTtEYy4kaW5qZWN0PVsiJHByb3ZpZGUiXTtqZC4kaW5qZWN0PVsiJGxvY2FsZSJdO2xkLiRpbmplY3Q9WyIkbG9jYWxlIl07dmFyIG9kPSIuIixNZj17eXl5eTokKCJGdWxsWWVhciIsNCkseXk6JCgiRnVsbFllYXIiLDIsMCwhMCkseTokKCJGdWxsWWVhciIsMSksTU1NTTpJYigiTW9udGgiKSwNCi1NTU06SWIoIk1vbnRoIiwhMCksTU06JCgiTW9udGgiLDIsMSksTTokKCJNb250aCIsMSwxKSxkZDokKCJEYXRlIiwyKSxkOiQoIkRhdGUiLDEpLEhIOiQoIkhvdXJzIiwyKSxIOiQoIkhvdXJzIiwxKSxoaDokKCJIb3VycyIsMiwtMTIpLGg6JCgiSG91cnMiLDEsLTEyKSxtbTokKCJNaW51dGVzIiwyKSxtOiQoIk1pbnV0ZXMiLDEpLHNzOiQoIlNlY29uZHMiLDIpLHM6JCgiU2Vjb25kcyIsMSksc3NzOiQoIk1pbGxpc2Vjb25kcyIsMyksRUVFRTpJYigiRGF5IiksRUVFOkliKCJEYXkiLCEwKSxhOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIDEyPmEuZ2V0SG91cnMoKT9jLkFNUE1TWzBdOmMuQU1QTVNbMV19LFo6ZnVuY3Rpb24oYSl7YT0tMSphLmdldFRpbWV6b25lT2Zmc2V0KCk7cmV0dXJuIGE9KDA8PWE/IisiOiIiKSsoSGIoTWF0aFswPGE/ImZsb29yIjoiY2VpbCJdKGEvNjApLDIpK0hiKE1hdGguYWJzKGElNjApLDIpKX0sd3c6cWQoMiksdzpxZCgxKX0sTGY9LygoPzpbXnlNZEhobXNhWkV3J10rKXwoPzonKD86W14nXXwnJykqJyl8KD86RSt8eSt8TSt8ZCt8SCt8aCt8bSt8cyt8YXxafHcrKSkoLiopLywNCi1LZj0vXlwtP1xkKyQvO2tkLiRpbmplY3Q9WyIkbG9jYWxlIl07dmFyIEhmPWRhKFEpLElmPWRhKHViKTttZC4kaW5qZWN0PVsiJHBhcnNlIl07dmFyIFRkPWRhKHtyZXN0cmljdDoiRSIsY29tcGlsZTpmdW5jdGlvbihhLGMpe2lmKCFjLmhyZWYmJiFjLnhsaW5rSHJlZiYmIWMubmFtZSlyZXR1cm4gZnVuY3Rpb24oYSxjKXt2YXIgZj0iW29iamVjdCBTVkdBbmltYXRlZFN0cmluZ10iPT09RGEuY2FsbChjLnByb3AoImhyZWYiKSk/InhsaW5rOmhyZWYiOiJocmVmIjtjLm9uKCJjbGljayIsZnVuY3Rpb24oYSl7Yy5hdHRyKGYpfHxhLnByZXZlbnREZWZhdWx0KCl9KX19fSksdmI9e307cyhFYixmdW5jdGlvbihhLGMpe2lmKCJtdWx0aXBsZSIhPWEpe3ZhciBkPXlhKCJuZy0iK2MpO3ZiW2RdPWZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJBIixwcmlvcml0eToxMDAsbGluazpmdW5jdGlvbihhLGYsZyl7YS4kd2F0Y2goZ1tkXSxmdW5jdGlvbihhKXtnLiRzZXQoYywhIWEpfSl9fX19fSk7DQotcyhOYyxmdW5jdGlvbihhLGMpe3ZiW2NdPWZ1bmN0aW9uKCl7cmV0dXJue3ByaW9yaXR5OjEwMCxsaW5rOmZ1bmN0aW9uKGEsZSxmKXtpZigibmdQYXR0ZXJuIj09PWMmJiIvIj09Zi5uZ1BhdHRlcm4uY2hhckF0KDApJiYoZT1mLm5nUGF0dGVybi5tYXRjaChPZikpKXtmLiRzZXQoIm5nUGF0dGVybiIsbmV3IFJlZ0V4cChlWzFdLGVbMl0pKTtyZXR1cm59YS4kd2F0Y2goZltjXSxmdW5jdGlvbihhKXtmLiRzZXQoYyxhKX0pfX19fSk7cyhbInNyYyIsInNyY3NldCIsImhyZWYiXSxmdW5jdGlvbihhKXt2YXIgYz15YSgibmctIithKTt2YltjXT1mdW5jdGlvbigpe3JldHVybntwcmlvcml0eTo5OSxsaW5rOmZ1bmN0aW9uKGQsZSxmKXt2YXIgZz1hLGg9YTsiaHJlZiI9PT1hJiYiW29iamVjdCBTVkdBbmltYXRlZFN0cmluZ10iPT09RGEuY2FsbChlLnByb3AoImhyZWYiKSkmJihoPSJ4bGlua0hyZWYiLGYuJGF0dHJbaF09InhsaW5rOmhyZWYiLGc9bnVsbCk7Zi4kb2JzZXJ2ZShjLGZ1bmN0aW9uKGMpe2M/DQotKGYuJHNldChoLGMpLFJhJiZnJiZlLnByb3AoZyxmW2hdKSk6ImhyZWYiPT09YSYmZi4kc2V0KGgsbnVsbCl9KX19fX0pO3ZhciBKYj17JGFkZENvbnRyb2w6QywkJHJlbmFtZUNvbnRyb2w6ZnVuY3Rpb24oYSxjKXthLiRuYW1lPWN9LCRyZW1vdmVDb250cm9sOkMsJHNldFZhbGlkaXR5OkMsJHNldERpcnR5OkMsJHNldFByaXN0aW5lOkMsJHNldFN1Ym1pdHRlZDpDfTtyZC4kaW5qZWN0PVsiJGVsZW1lbnQiLCIkYXR0cnMiLCIkc2NvcGUiLCIkYW5pbWF0ZSIsIiRpbnRlcnBvbGF0ZSJdO3ZhciB5ZD1mdW5jdGlvbihhKXtyZXR1cm5bIiR0aW1lb3V0IixmdW5jdGlvbihjKXtyZXR1cm57bmFtZToiZm9ybSIscmVzdHJpY3Q6YT8iRUFDIjoiRSIsY29udHJvbGxlcjpyZCxjb21waWxlOmZ1bmN0aW9uKGEpe2EuYWRkQ2xhc3MoU2EpLmFkZENsYXNzKGtiKTtyZXR1cm57cHJlOmZ1bmN0aW9uKGEsZCxnLGgpe2lmKCEoImFjdGlvbiJpbiBnKSl7dmFyIGw9ZnVuY3Rpb24oYyl7YS4kYXBwbHkoZnVuY3Rpb24oKXtoLiRjb21taXRWaWV3VmFsdWUoKTsNCi1oLiRzZXRTdWJtaXR0ZWQoKX0pO2MucHJldmVudERlZmF1bHQoKX07ZFswXS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLGwsITEpO2Qub24oIiRkZXN0cm95IixmdW5jdGlvbigpe2MoZnVuY3Rpb24oKXtkWzBdLnJlbW92ZUV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsbCwhMSl9LDAsITEpfSl9dmFyIGs9aC4kJHBhcmVudEZvcm0sbT1oLiRuYW1lO20mJihnYihhLG0saCxtKSxnLiRvYnNlcnZlKGcubmFtZT8ibmFtZSI6Im5nRm9ybSIsZnVuY3Rpb24oYyl7bSE9PWMmJihnYihhLG0sdCxtKSxtPWMsZ2IoYSxtLGgsbSksay4kJHJlbmFtZUNvbnRyb2woaCxtKSl9KSk7ZC5vbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7ay4kcmVtb3ZlQ29udHJvbChoKTttJiZnYihhLG0sdCxtKTt6KGgsSmIpfSl9fX19fV19LFVkPXlkKCksZ2U9eWQoITApLE5mPS9cZHs0fS1bMDFdXGQtWzAtM11cZFRbMC0yXVxkOlswLTVdXGQ6WzAtNV1cZFwuXGQrKFsrLV1bMC0yXVxkOlswLTVdXGR8WikvLFlmPS9eKGZ0cHxodHRwfGh0dHBzKTpcL1wvKFx3Kzp7MCwxfVx3KkApPyhcUyspKDpbMC05XSspPyhcL3xcLyhbXHcjITouPys9JiVAIVwtXC9dKSk/JC8sDQotWmY9L15bYS16MC05ISMkJSYnKitcLz0/Xl9ge3x9fi4tXStAW2EtejAtOV0oW2EtejAtOS1dKlthLXowLTldKT8oXC5bYS16MC05XShbYS16MC05LV0qW2EtejAtOV0pPykqJC9pLCRmPS9eXHMqKFwtfFwrKT8oXGQrfChcZCooXC5cZCopKSlccyokLyx6ZD0vXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pJC8sQWQ9L14oXGR7NH0pLShcZFxkKS0oXGRcZClUKFxkXGQpOihcZFxkKSg/OjooXGRcZCkoXC5cZHsxLDN9KT8pPyQvLGpjPS9eKFxkezR9KS1XKFxkXGQpJC8sQmQ9L14oXGR7NH0pLShcZFxkKSQvLENkPS9eKFxkXGQpOihcZFxkKSg/OjooXGRcZCkoXC5cZHsxLDN9KT8pPyQvLGFnPS8oXHMrfF4pZGVmYXVsdChccyt8JCkvLE1iPW5ldyBUKCJuZ01vZGVsIiksRGQ9e3RleHQ6ZnVuY3Rpb24oYSxjLGQsZSxmLGcpe2liKGEsYyxkLGUsZixnKTtoYyhlKX0sZGF0ZTpqYigiZGF0ZSIsemQsTGIoemQsWyJ5eXl5IiwiTU0iLCJkZCJdKSwieXl5eS1NTS1kZCIpLCJkYXRldGltZS1sb2NhbCI6amIoImRhdGV0aW1lbG9jYWwiLA0KLUFkLExiKEFkLCJ5eXl5IE1NIGRkIEhIIG1tIHNzIHNzcyIuc3BsaXQoIiAiKSksInl5eXktTU0tZGRUSEg6bW06c3Muc3NzIiksdGltZTpqYigidGltZSIsQ2QsTGIoQ2QsWyJISCIsIm1tIiwic3MiLCJzc3MiXSksIkhIOm1tOnNzLnNzcyIpLHdlZWs6amIoIndlZWsiLGpjLGZ1bmN0aW9uKGEsYyl7aWYocGEoYSkpcmV0dXJuIGE7aWYoRihhKSl7amMubGFzdEluZGV4PTA7dmFyIGQ9amMuZXhlYyhhKTtpZihkKXt2YXIgZT0rZFsxXSxmPStkWzJdLGc9ZD0wLGg9MCxsPTAsaz1wZChlKSxmPTcqKGYtMSk7YyYmKGQ9Yy5nZXRIb3VycygpLGc9Yy5nZXRNaW51dGVzKCksaD1jLmdldFNlY29uZHMoKSxsPWMuZ2V0TWlsbGlzZWNvbmRzKCkpO3JldHVybiBuZXcgRGF0ZShlLDAsay5nZXREYXRlKCkrZixkLGcsaCxsKX19cmV0dXJuIE5hTn0sInl5eXktV3d3IiksbW9udGg6amIoIm1vbnRoIixCZCxMYihCZCxbInl5eXkiLCJNTSJdKSwieXl5eS1NTSIpLG51bWJlcjpmdW5jdGlvbihhLA0KLWMsZCxlLGYsZyl7dGQoYSxjLGQsZSk7aWIoYSxjLGQsZSxmLGcpO2UuJCRwYXJzZXJOYW1lPSJudW1iZXIiO2UuJHBhcnNlcnMucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZS4kaXNFbXB0eShhKT9udWxsOiRmLnRlc3QoYSk/cGFyc2VGbG9hdChhKTp0fSk7ZS4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGEpe2lmKCFlLiRpc0VtcHR5KGEpKXtpZighVihhKSl0aHJvdyBNYigibnVtZm10IixhKTthPWEudG9TdHJpbmcoKX1yZXR1cm4gYX0pO2lmKGQubWlufHxkLm5nTWluKXt2YXIgaDtlLiR2YWxpZGF0b3JzLm1pbj1mdW5jdGlvbihhKXtyZXR1cm4gZS4kaXNFbXB0eShhKXx8RChoKXx8YT49aH07ZC4kb2JzZXJ2ZSgibWluIixmdW5jdGlvbihhKXt5KGEpJiYhVihhKSYmKGE9cGFyc2VGbG9hdChhLDEwKSk7aD1WKGEpJiYhaXNOYU4oYSk/YTp0O2UuJHZhbGlkYXRlKCl9KX1pZihkLm1heHx8ZC5uZ01heCl7dmFyIGw7ZS4kdmFsaWRhdG9ycy5tYXg9ZnVuY3Rpb24oYSl7cmV0dXJuIGUuJGlzRW1wdHkoYSl8fA0KLUQobCl8fGE8PWx9O2QuJG9ic2VydmUoIm1heCIsZnVuY3Rpb24oYSl7eShhKSYmIVYoYSkmJihhPXBhcnNlRmxvYXQoYSwxMCkpO2w9VihhKSYmIWlzTmFOKGEpP2E6dDtlLiR2YWxpZGF0ZSgpfSl9fSx1cmw6ZnVuY3Rpb24oYSxjLGQsZSxmLGcpe2liKGEsYyxkLGUsZixnKTtoYyhlKTtlLiQkcGFyc2VyTmFtZT0idXJsIjtlLiR2YWxpZGF0b3JzLnVybD1mdW5jdGlvbihhLGMpe3ZhciBkPWF8fGM7cmV0dXJuIGUuJGlzRW1wdHkoZCl8fFlmLnRlc3QoZCl9fSxlbWFpbDpmdW5jdGlvbihhLGMsZCxlLGYsZyl7aWIoYSxjLGQsZSxmLGcpO2hjKGUpO2UuJCRwYXJzZXJOYW1lPSJlbWFpbCI7ZS4kdmFsaWRhdG9ycy5lbWFpbD1mdW5jdGlvbihhLGMpe3ZhciBkPWF8fGM7cmV0dXJuIGUuJGlzRW1wdHkoZCl8fFpmLnRlc3QoZCl9fSxyYWRpbzpmdW5jdGlvbihhLGMsZCxlKXtEKGQubmFtZSkmJmMuYXR0cigibmFtZSIsKytuYik7Yy5vbigiY2xpY2siLGZ1bmN0aW9uKGEpe2NbMF0uY2hlY2tlZCYmDQotZS4kc2V0Vmlld1ZhbHVlKGQudmFsdWUsYSYmYS50eXBlKX0pO2UuJHJlbmRlcj1mdW5jdGlvbigpe2NbMF0uY2hlY2tlZD1kLnZhbHVlPT1lLiR2aWV3VmFsdWV9O2QuJG9ic2VydmUoInZhbHVlIixlLiRyZW5kZXIpfSxjaGVja2JveDpmdW5jdGlvbihhLGMsZCxlLGYsZyxoLGwpe3ZhciBrPXVkKGwsYSwibmdUcnVlVmFsdWUiLGQubmdUcnVlVmFsdWUsITApLG09dWQobCxhLCJuZ0ZhbHNlVmFsdWUiLGQubmdGYWxzZVZhbHVlLCExKTtjLm9uKCJjbGljayIsZnVuY3Rpb24oYSl7ZS4kc2V0Vmlld1ZhbHVlKGNbMF0uY2hlY2tlZCxhJiZhLnR5cGUpfSk7ZS4kcmVuZGVyPWZ1bmN0aW9uKCl7Y1swXS5jaGVja2VkPWUuJHZpZXdWYWx1ZX07ZS4kaXNFbXB0eT1mdW5jdGlvbihhKXtyZXR1cm4hMT09PWF9O2UuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZmEoYSxrKX0pO2UuJHBhcnNlcnMucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gYT9rOm19KX0saGlkZGVuOkMsDQotYnV0dG9uOkMsc3VibWl0OkMscmVzZXQ6QyxmaWxlOkN9LHhjPVsiJGJyb3dzZXIiLCIkc25pZmZlciIsIiRmaWx0ZXIiLCIkcGFyc2UiLGZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybntyZXN0cmljdDoiRSIscmVxdWlyZTpbIj9uZ01vZGVsIl0sbGluazp7cHJlOmZ1bmN0aW9uKGYsZyxoLGwpe2xbMF0mJihEZFtRKGgudHlwZSldfHxEZC50ZXh0KShmLGcsaCxsWzBdLGMsYSxkLGUpfX19fV0sa2I9Im5nLXZhbGlkIix2ZD0ibmctaW52YWxpZCIsU2E9Im5nLXByaXN0aW5lIixLYj0ibmctZGlydHkiLHhkPSJuZy1wZW5kaW5nIixiZz1bIiRzY29wZSIsIiRleGNlcHRpb25IYW5kbGVyIiwiJGF0dHJzIiwiJGVsZW1lbnQiLCIkcGFyc2UiLCIkYW5pbWF0ZSIsIiR0aW1lb3V0IiwiJHJvb3RTY29wZSIsIiRxIiwiJGludGVycG9sYXRlIixmdW5jdGlvbihhLGMsZCxlLGYsZyxoLGwsayxtKXt0aGlzLiRtb2RlbFZhbHVlPXRoaXMuJHZpZXdWYWx1ZT1OdW1iZXIuTmFOO3RoaXMuJCRyYXdNb2RlbFZhbHVlPQ0KLXQ7dGhpcy4kdmFsaWRhdG9ycz17fTt0aGlzLiRhc3luY1ZhbGlkYXRvcnM9e307dGhpcy4kcGFyc2Vycz1bXTt0aGlzLiRmb3JtYXR0ZXJzPVtdO3RoaXMuJHZpZXdDaGFuZ2VMaXN0ZW5lcnM9W107dGhpcy4kdW50b3VjaGVkPSEwO3RoaXMuJHRvdWNoZWQ9ITE7dGhpcy4kcHJpc3RpbmU9ITA7dGhpcy4kZGlydHk9ITE7dGhpcy4kdmFsaWQ9ITA7dGhpcy4kaW52YWxpZD0hMTt0aGlzLiRlcnJvcj17fTt0aGlzLiQkc3VjY2Vzcz17fTt0aGlzLiRwZW5kaW5nPXQ7dGhpcy4kbmFtZT1tKGQubmFtZXx8IiIsITEpKGEpO3ZhciBwPWYoZC5uZ01vZGVsKSxxPXAuYXNzaWduLHU9cCxyPXEsTz1udWxsLG49dGhpczt0aGlzLiQkc2V0T3B0aW9ucz1mdW5jdGlvbihhKXtpZigobi4kb3B0aW9ucz1hKSYmYS5nZXR0ZXJTZXR0ZXIpe3ZhciBjPWYoZC5uZ01vZGVsKyIoKSIpLGc9ZihkLm5nTW9kZWwrIigkJCRwKSIpO3U9ZnVuY3Rpb24oYSl7dmFyIGQ9cChhKTtHKGQpJiYoZD1jKGEpKTtyZXR1cm4gZH07DQotcj1mdW5jdGlvbihhLGMpe0cocChhKSk/ZyhhLHskJCRwOm4uJG1vZGVsVmFsdWV9KTpxKGEsbi4kbW9kZWxWYWx1ZSl9fWVsc2UgaWYoIXAuYXNzaWduKXRocm93IE1iKCJub25hc3NpZ24iLGQubmdNb2RlbCx2YShlKSk7fTt0aGlzLiRyZW5kZXI9Qzt0aGlzLiRpc0VtcHR5PWZ1bmN0aW9uKGEpe3JldHVybiBEKGEpfHwiIj09PWF8fG51bGw9PT1hfHxhIT09YX07dmFyIHY9ZS5pbmhlcml0ZWREYXRhKCIkZm9ybUNvbnRyb2xsZXIiKXx8SmIsdz0wO3NkKHtjdHJsOnRoaXMsJGVsZW1lbnQ6ZSxzZXQ6ZnVuY3Rpb24oYSxjKXthW2NdPSEwfSx1bnNldDpmdW5jdGlvbihhLGMpe2RlbGV0ZSBhW2NdfSxwYXJlbnRGb3JtOnYsJGFuaW1hdGU6Z30pO3RoaXMuJHNldFByaXN0aW5lPWZ1bmN0aW9uKCl7bi4kZGlydHk9ITE7bi4kcHJpc3RpbmU9ITA7Zy5yZW1vdmVDbGFzcyhlLEtiKTtnLmFkZENsYXNzKGUsU2EpfTt0aGlzLiRzZXREaXJ0eT1mdW5jdGlvbigpe24uJGRpcnR5PSEwO24uJHByaXN0aW5lPQ0KLSExO2cucmVtb3ZlQ2xhc3MoZSxTYSk7Zy5hZGRDbGFzcyhlLEtiKTt2LiRzZXREaXJ0eSgpfTt0aGlzLiRzZXRVbnRvdWNoZWQ9ZnVuY3Rpb24oKXtuLiR0b3VjaGVkPSExO24uJHVudG91Y2hlZD0hMDtnLnNldENsYXNzKGUsIm5nLXVudG91Y2hlZCIsIm5nLXRvdWNoZWQiKX07dGhpcy4kc2V0VG91Y2hlZD1mdW5jdGlvbigpe24uJHRvdWNoZWQ9ITA7bi4kdW50b3VjaGVkPSExO2cuc2V0Q2xhc3MoZSwibmctdG91Y2hlZCIsIm5nLXVudG91Y2hlZCIpfTt0aGlzLiRyb2xsYmFja1ZpZXdWYWx1ZT1mdW5jdGlvbigpe2guY2FuY2VsKE8pO24uJHZpZXdWYWx1ZT1uLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZTtuLiRyZW5kZXIoKX07dGhpcy4kdmFsaWRhdGU9ZnVuY3Rpb24oKXtpZighVihuLiRtb2RlbFZhbHVlKXx8IWlzTmFOKG4uJG1vZGVsVmFsdWUpKXt2YXIgYT1uLiQkcmF3TW9kZWxWYWx1ZSxjPW4uJHZhbGlkLGQ9bi4kbW9kZWxWYWx1ZSxlPW4uJG9wdGlvbnMmJm4uJG9wdGlvbnMuYWxsb3dJbnZhbGlkOw0KLW4uJCRydW5WYWxpZGF0b3JzKG4uJGVycm9yW24uJCRwYXJzZXJOYW1lfHwicGFyc2UiXT8hMTp0LGEsbi4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWUsZnVuY3Rpb24oZil7ZXx8Yz09PWZ8fChuLiRtb2RlbFZhbHVlPWY/YTp0LG4uJG1vZGVsVmFsdWUhPT1kJiZuLiQkd3JpdGVNb2RlbFRvU2NvcGUoKSl9KX19O3RoaXMuJCRydW5WYWxpZGF0b3JzPWZ1bmN0aW9uKGEsYyxkLGUpe2Z1bmN0aW9uIGYoKXt2YXIgYT0hMDtzKG4uJHZhbGlkYXRvcnMsZnVuY3Rpb24oZSxmKXt2YXIgZz1lKGMsZCk7YT1hJiZnO2goZixnKX0pO3JldHVybiBhPyEwOihzKG4uJGFzeW5jVmFsaWRhdG9ycyxmdW5jdGlvbihhLGMpe2goYyxudWxsKX0pLCExKX1mdW5jdGlvbiBnKCl7dmFyIGE9W10sZT0hMDtzKG4uJGFzeW5jVmFsaWRhdG9ycyxmdW5jdGlvbihmLGcpe3ZhciBsPWYoYyxkKTtpZighbHx8IUcobC50aGVuKSl0aHJvdyBNYigiJGFzeW5jVmFsaWRhdG9ycyIsbCk7aChnLHQpO2EucHVzaChsLnRoZW4oZnVuY3Rpb24oKXtoKGcsDQotITApfSxmdW5jdGlvbihhKXtlPSExO2goZywhMSl9KSl9KTthLmxlbmd0aD9rLmFsbChhKS50aGVuKGZ1bmN0aW9uKCl7bChlKX0sQyk6bCghMCl9ZnVuY3Rpb24gaChhLGMpe209PT13JiZuLiRzZXRWYWxpZGl0eShhLGMpfWZ1bmN0aW9uIGwoYSl7bT09PXcmJmUoYSl9dysrO3ZhciBtPXc7KGZ1bmN0aW9uKGEpe3ZhciBjPW4uJCRwYXJzZXJOYW1lfHwicGFyc2UiO2lmKGE9PT10KWgoYyxudWxsKTtlbHNlIGlmKGgoYyxhKSwhYSlyZXR1cm4gcyhuLiR2YWxpZGF0b3JzLGZ1bmN0aW9uKGEsYyl7aChjLG51bGwpfSkscyhuLiRhc3luY1ZhbGlkYXRvcnMsZnVuY3Rpb24oYSxjKXtoKGMsbnVsbCl9KSwhMTtyZXR1cm4hMH0pKGEpP2YoKT9nKCk6bCghMSk6bCghMSl9O3RoaXMuJGNvbW1pdFZpZXdWYWx1ZT1mdW5jdGlvbigpe3ZhciBhPW4uJHZpZXdWYWx1ZTtoLmNhbmNlbChPKTtpZihuLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZSE9PWF8fCIiPT09YSYmbi4kJGhhc05hdGl2ZVZhbGlkYXRvcnMpbi4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWU9DQotYSxuLiRwcmlzdGluZSYmdGhpcy4kc2V0RGlydHkoKSx0aGlzLiQkcGFyc2VBbmRWYWxpZGF0ZSgpfTt0aGlzLiQkcGFyc2VBbmRWYWxpZGF0ZT1mdW5jdGlvbigpe3ZhciBjPW4uJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlLGQ9RChjKT90OiEwO2lmKGQpZm9yKHZhciBlPTA7ZTxuLiRwYXJzZXJzLmxlbmd0aDtlKyspaWYoYz1uLiRwYXJzZXJzW2VdKGMpLEQoYykpe2Q9ITE7YnJlYWt9VihuLiRtb2RlbFZhbHVlKSYmaXNOYU4obi4kbW9kZWxWYWx1ZSkmJihuLiRtb2RlbFZhbHVlPXUoYSkpO3ZhciBmPW4uJG1vZGVsVmFsdWUsZz1uLiRvcHRpb25zJiZuLiRvcHRpb25zLmFsbG93SW52YWxpZDtuLiQkcmF3TW9kZWxWYWx1ZT1jO2cmJihuLiRtb2RlbFZhbHVlPWMsbi4kbW9kZWxWYWx1ZSE9PWYmJm4uJCR3cml0ZU1vZGVsVG9TY29wZSgpKTtuLiQkcnVuVmFsaWRhdG9ycyhkLGMsbi4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWUsZnVuY3Rpb24oYSl7Z3x8KG4uJG1vZGVsVmFsdWU9DQotYT9jOnQsbi4kbW9kZWxWYWx1ZSE9PWYmJm4uJCR3cml0ZU1vZGVsVG9TY29wZSgpKX0pfTt0aGlzLiQkd3JpdGVNb2RlbFRvU2NvcGU9ZnVuY3Rpb24oKXtyKGEsbi4kbW9kZWxWYWx1ZSk7cyhuLiR2aWV3Q2hhbmdlTGlzdGVuZXJzLGZ1bmN0aW9uKGEpe3RyeXthKCl9Y2F0Y2goZCl7YyhkKX19KX07dGhpcy4kc2V0Vmlld1ZhbHVlPWZ1bmN0aW9uKGEsYyl7bi4kdmlld1ZhbHVlPWE7bi4kb3B0aW9ucyYmIW4uJG9wdGlvbnMudXBkYXRlT25EZWZhdWx0fHxuLiQkZGVib3VuY2VWaWV3VmFsdWVDb21taXQoYyl9O3RoaXMuJCRkZWJvdW5jZVZpZXdWYWx1ZUNvbW1pdD1mdW5jdGlvbihjKXt2YXIgZD0wLGU9bi4kb3B0aW9ucztlJiZ5KGUuZGVib3VuY2UpJiYoZT1lLmRlYm91bmNlLFYoZSk/ZD1lOlYoZVtjXSk/ZD1lW2NdOlYoZVsiZGVmYXVsdCJdKSYmKGQ9ZVsiZGVmYXVsdCJdKSk7aC5jYW5jZWwoTyk7ZD9PPWgoZnVuY3Rpb24oKXtuLiRjb21taXRWaWV3VmFsdWUoKX0sZCk6DQotbC4kJHBoYXNlP24uJGNvbW1pdFZpZXdWYWx1ZSgpOmEuJGFwcGx5KGZ1bmN0aW9uKCl7bi4kY29tbWl0Vmlld1ZhbHVlKCl9KX07YS4kd2F0Y2goZnVuY3Rpb24oKXt2YXIgYz11KGEpO2lmKGMhPT1uLiRtb2RlbFZhbHVlKXtuLiRtb2RlbFZhbHVlPW4uJCRyYXdNb2RlbFZhbHVlPWM7Zm9yKHZhciBkPW4uJGZvcm1hdHRlcnMsZT1kLmxlbmd0aCxmPWM7ZS0tOylmPWRbZV0oZik7bi4kdmlld1ZhbHVlIT09ZiYmKG4uJHZpZXdWYWx1ZT1uLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZT1mLG4uJHJlbmRlcigpLG4uJCRydW5WYWxpZGF0b3JzKHQsYyxmLEMpKX1yZXR1cm4gY30pfV0sdmU9WyIkcm9vdFNjb3BlIixmdW5jdGlvbihhKXtyZXR1cm57cmVzdHJpY3Q6IkEiLHJlcXVpcmU6WyJuZ01vZGVsIiwiXj9mb3JtIiwiXj9uZ01vZGVsT3B0aW9ucyJdLGNvbnRyb2xsZXI6YmcscHJpb3JpdHk6MSxjb21waWxlOmZ1bmN0aW9uKGMpe2MuYWRkQ2xhc3MoU2EpLmFkZENsYXNzKCJuZy11bnRvdWNoZWQiKS5hZGRDbGFzcyhrYik7DQotcmV0dXJue3ByZTpmdW5jdGlvbihhLGMsZixnKXt2YXIgaD1nWzBdLGw9Z1sxXXx8SmI7aC4kJHNldE9wdGlvbnMoZ1syXSYmZ1syXS4kb3B0aW9ucyk7bC4kYWRkQ29udHJvbChoKTtmLiRvYnNlcnZlKCJuYW1lIixmdW5jdGlvbihhKXtoLiRuYW1lIT09YSYmbC4kJHJlbmFtZUNvbnRyb2woaCxhKX0pO2EuJG9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXtsLiRyZW1vdmVDb250cm9sKGgpfSl9LHBvc3Q6ZnVuY3Rpb24oYyxlLGYsZyl7dmFyIGg9Z1swXTtpZihoLiRvcHRpb25zJiZoLiRvcHRpb25zLnVwZGF0ZU9uKWUub24oaC4kb3B0aW9ucy51cGRhdGVPbixmdW5jdGlvbihhKXtoLiQkZGVib3VuY2VWaWV3VmFsdWVDb21taXQoYSYmYS50eXBlKX0pO2Uub24oImJsdXIiLGZ1bmN0aW9uKGUpe2guJHRvdWNoZWR8fChhLiQkcGhhc2U/Yy4kZXZhbEFzeW5jKGguJHNldFRvdWNoZWQpOmMuJGFwcGx5KGguJHNldFRvdWNoZWQpKX0pfX19fX1dLHhlPWRhKHtyZXN0cmljdDoiQSIscmVxdWlyZToibmdNb2RlbCIsDQotbGluazpmdW5jdGlvbihhLGMsZCxlKXtlLiR2aWV3Q2hhbmdlTGlzdGVuZXJzLnB1c2goZnVuY3Rpb24oKXthLiRldmFsKGQubmdDaGFuZ2UpfSl9fSksemM9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkEiLHJlcXVpcmU6Ij9uZ01vZGVsIixsaW5rOmZ1bmN0aW9uKGEsYyxkLGUpe2UmJihkLnJlcXVpcmVkPSEwLGUuJHZhbGlkYXRvcnMucmVxdWlyZWQ9ZnVuY3Rpb24oYSxjKXtyZXR1cm4hZC5yZXF1aXJlZHx8IWUuJGlzRW1wdHkoYyl9LGQuJG9ic2VydmUoInJlcXVpcmVkIixmdW5jdGlvbigpe2UuJHZhbGlkYXRlKCl9KSl9fX0seWM9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkEiLHJlcXVpcmU6Ij9uZ01vZGVsIixsaW5rOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKGUpe3ZhciBmLGc9ZC5uZ1BhdHRlcm58fGQucGF0dGVybjtkLiRvYnNlcnZlKCJwYXR0ZXJuIixmdW5jdGlvbihhKXtGKGEpJiYwPGEubGVuZ3RoJiYoYT1uZXcgUmVnRXhwKCJeIithKyIkIikpO2lmKGEmJg0KLSFhLnRlc3QpdGhyb3cgVCgibmdQYXR0ZXJuIikoIm5vcmVnZXhwIixnLGEsdmEoYykpO2Y9YXx8dDtlLiR2YWxpZGF0ZSgpfSk7ZS4kdmFsaWRhdG9ycy5wYXR0ZXJuPWZ1bmN0aW9uKGEpe3JldHVybiBlLiRpc0VtcHR5KGEpfHxEKGYpfHxmLnRlc3QoYSl9fX19fSxCYz1mdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiQSIscmVxdWlyZToiP25nTW9kZWwiLGxpbms6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoZSl7dmFyIGY9LTE7ZC4kb2JzZXJ2ZSgibWF4bGVuZ3RoIixmdW5jdGlvbihhKXthPWJhKGEpO2Y9aXNOYU4oYSk/LTE6YTtlLiR2YWxpZGF0ZSgpfSk7ZS4kdmFsaWRhdG9ycy5tYXhsZW5ndGg9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gMD5mfHxlLiRpc0VtcHR5KGEpfHxjLmxlbmd0aDw9Zn19fX19LEFjPWZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJBIixyZXF1aXJlOiI/bmdNb2RlbCIsbGluazpmdW5jdGlvbihhLGMsZCxlKXtpZihlKXt2YXIgZj0wO2QuJG9ic2VydmUoIm1pbmxlbmd0aCIsDQotZnVuY3Rpb24oYSl7Zj1iYShhKXx8MDtlLiR2YWxpZGF0ZSgpfSk7ZS4kdmFsaWRhdG9ycy5taW5sZW5ndGg9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZS4kaXNFbXB0eShjKXx8Yy5sZW5ndGg+PWZ9fX19fSx3ZT1mdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiQSIscHJpb3JpdHk6MTAwLHJlcXVpcmU6Im5nTW9kZWwiLGxpbms6ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGY9Yy5hdHRyKGQuJGF0dHIubmdMaXN0KXx8IiwgIixnPSJmYWxzZSIhPT1kLm5nVHJpbSxoPWc/VShmKTpmO2UuJHBhcnNlcnMucHVzaChmdW5jdGlvbihhKXtpZighRChhKSl7dmFyIGM9W107YSYmcyhhLnNwbGl0KGgpLGZ1bmN0aW9uKGEpe2EmJmMucHVzaChnP1UoYSk6YSl9KTtyZXR1cm4gY319KTtlLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24oYSl7cmV0dXJuIHgoYSk/YS5qb2luKGYpOnR9KTtlLiRpc0VtcHR5PWZ1bmN0aW9uKGEpe3JldHVybiFhfHwhYS5sZW5ndGh9fX19LGNnPS9eKHRydWV8ZmFsc2V8XGQrKSQvLA0KLXllPWZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJBIixwcmlvcml0eToxMDAsY29tcGlsZTpmdW5jdGlvbihhLGMpe3JldHVybiBjZy50ZXN0KGMubmdWYWx1ZSk/ZnVuY3Rpb24oYSxjLGYpe2YuJHNldCgidmFsdWUiLGEuJGV2YWwoZi5uZ1ZhbHVlKSl9OmZ1bmN0aW9uKGEsYyxmKXthLiR3YXRjaChmLm5nVmFsdWUsZnVuY3Rpb24oYSl7Zi4kc2V0KCJ2YWx1ZSIsYSl9KX19fX0semU9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkEiLGNvbnRyb2xsZXI6WyIkc2NvcGUiLCIkYXR0cnMiLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpczt0aGlzLiRvcHRpb25zPWEuJGV2YWwoYy5uZ01vZGVsT3B0aW9ucyk7dGhpcy4kb3B0aW9ucy51cGRhdGVPbiE9PXQ/KHRoaXMuJG9wdGlvbnMudXBkYXRlT25EZWZhdWx0PSExLHRoaXMuJG9wdGlvbnMudXBkYXRlT249VSh0aGlzLiRvcHRpb25zLnVwZGF0ZU9uLnJlcGxhY2UoYWcsZnVuY3Rpb24oKXtkLiRvcHRpb25zLnVwZGF0ZU9uRGVmYXVsdD0NCi0hMDtyZXR1cm4iICJ9KSkpOnRoaXMuJG9wdGlvbnMudXBkYXRlT25EZWZhdWx0PSEwfV19fSxaZD1bIiRjb21waWxlIixmdW5jdGlvbihhKXtyZXR1cm57cmVzdHJpY3Q6IkFDIixjb21waWxlOmZ1bmN0aW9uKGMpe2EuJCRhZGRCaW5kaW5nQ2xhc3MoYyk7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmKXthLiQkYWRkQmluZGluZ0luZm8oZSxmLm5nQmluZCk7ZT1lWzBdO2MuJHdhdGNoKGYubmdCaW5kLGZ1bmN0aW9uKGEpe2UudGV4dENvbnRlbnQ9YT09PXQ/IiI6YX0pfX19fV0sYWU9WyIkaW50ZXJwb2xhdGUiLCIkY29tcGlsZSIsZnVuY3Rpb24oYSxjKXtyZXR1cm57Y29tcGlsZTpmdW5jdGlvbihkKXtjLiQkYWRkQmluZGluZ0NsYXNzKGQpO3JldHVybiBmdW5jdGlvbihkLGYsZyl7ZD1hKGYuYXR0cihnLiRhdHRyLm5nQmluZFRlbXBsYXRlKSk7Yy4kJGFkZEJpbmRpbmdJbmZvKGYsZC5leHByZXNzaW9ucyk7Zj1mWzBdO2cuJG9ic2VydmUoIm5nQmluZFRlbXBsYXRlIixmdW5jdGlvbihhKXtmLnRleHRDb250ZW50PQ0KLWE9PT10PyIiOmF9KX19fX1dLCRkPVsiJHNjZSIsIiRwYXJzZSIsIiRjb21waWxlIixmdW5jdGlvbihhLGMsZCl7cmV0dXJue3Jlc3RyaWN0OiJBIixjb21waWxlOmZ1bmN0aW9uKGUsZil7dmFyIGc9YyhmLm5nQmluZEh0bWwpLGg9YyhmLm5nQmluZEh0bWwsZnVuY3Rpb24oYSl7cmV0dXJuKGF8fCIiKS50b1N0cmluZygpfSk7ZC4kJGFkZEJpbmRpbmdDbGFzcyhlKTtyZXR1cm4gZnVuY3Rpb24oYyxlLGYpe2QuJCRhZGRCaW5kaW5nSW5mbyhlLGYubmdCaW5kSHRtbCk7Yy4kd2F0Y2goaCxmdW5jdGlvbigpe2UuaHRtbChhLmdldFRydXN0ZWRIdG1sKGcoYykpfHwiIil9KX19fX1dLGJlPWljKCIiLCEwKSxkZT1pYygiT2RkIiwwKSxjZT1pYygiRXZlbiIsMSksZWU9SmEoe2NvbXBpbGU6ZnVuY3Rpb24oYSxjKXtjLiRzZXQoIm5nQ2xvYWsiLHQpO2EucmVtb3ZlQ2xhc3MoIm5nLWNsb2FrIil9fSksZmU9W2Z1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJBIixzY29wZTohMCxjb250cm9sbGVyOiJAIiwNCi1wcmlvcml0eTo1MDB9fV0sQ2M9e30sZGc9e2JsdXI6ITAsZm9jdXM6ITB9O3MoImNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZW1vdmUgbW91c2VlbnRlciBtb3VzZWxlYXZlIGtleWRvd24ga2V5dXAga2V5cHJlc3Mgc3VibWl0IGZvY3VzIGJsdXIgY29weSBjdXQgcGFzdGUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSl7dmFyIGM9eWEoIm5nLSIrYSk7Q2NbY109WyIkcGFyc2UiLCIkcm9vdFNjb3BlIixmdW5jdGlvbihkLGUpe3JldHVybntyZXN0cmljdDoiQSIsY29tcGlsZTpmdW5jdGlvbihmLGcpe3ZhciBoPWQoZ1tjXSxudWxsLCEwKTtyZXR1cm4gZnVuY3Rpb24oYyxkKXtkLm9uKGEsZnVuY3Rpb24oZCl7dmFyIGY9ZnVuY3Rpb24oKXtoKGMseyRldmVudDpkfSl9O2RnW2FdJiZlLiQkcGhhc2U/Yy4kZXZhbEFzeW5jKGYpOmMuJGFwcGx5KGYpfSl9fX19XX0pO3ZhciBpZT1bIiRhbmltYXRlIixmdW5jdGlvbihhKXtyZXR1cm57bXVsdGlFbGVtZW50OiEwLA0KLXRyYW5zY2x1ZGU6ImVsZW1lbnQiLHByaW9yaXR5OjYwMCx0ZXJtaW5hbDohMCxyZXN0cmljdDoiQSIsJCR0bGI6ITAsbGluazpmdW5jdGlvbihjLGQsZSxmLGcpe3ZhciBoLGwsaztjLiR3YXRjaChlLm5nSWYsZnVuY3Rpb24oYyl7Yz9sfHxnKGZ1bmN0aW9uKGMsZil7bD1mO2NbYy5sZW5ndGgrK109WS5jcmVhdGVDb21tZW50KCIgZW5kIG5nSWY6ICIrZS5uZ0lmKyIgIik7aD17Y2xvbmU6Y307YS5lbnRlcihjLGQucGFyZW50KCksZCl9KTooayYmKGsucmVtb3ZlKCksaz1udWxsKSxsJiYobC4kZGVzdHJveSgpLGw9bnVsbCksaCYmKGs9dGIoaC5jbG9uZSksYS5sZWF2ZShrKS50aGVuKGZ1bmN0aW9uKCl7az1udWxsfSksaD1udWxsKSl9KX19fV0samU9WyIkdGVtcGxhdGVSZXF1ZXN0IiwiJGFuY2hvclNjcm9sbCIsIiRhbmltYXRlIiwiJHNjZSIsZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJue3Jlc3RyaWN0OiJFQ0EiLHByaW9yaXR5OjQwMCx0ZXJtaW5hbDohMCx0cmFuc2NsdWRlOiJlbGVtZW50IiwNCi1jb250cm9sbGVyOmdhLm5vb3AsY29tcGlsZTpmdW5jdGlvbihmLGcpe3ZhciBoPWcubmdJbmNsdWRlfHxnLnNyYyxsPWcub25sb2FkfHwiIixrPWcuYXV0b3Njcm9sbDtyZXR1cm4gZnVuY3Rpb24oZixnLHEscyxyKXt2YXIgdD0wLG4sdix3LEw9ZnVuY3Rpb24oKXt2JiYodi5yZW1vdmUoKSx2PW51bGwpO24mJihuLiRkZXN0cm95KCksbj1udWxsKTt3JiYoZC5sZWF2ZSh3KS50aGVuKGZ1bmN0aW9uKCl7dj1udWxsfSksdj13LHc9bnVsbCl9O2YuJHdhdGNoKGUucGFyc2VBc1Jlc291cmNlVXJsKGgpLGZ1bmN0aW9uKGUpe3ZhciBoPWZ1bmN0aW9uKCl7IXkoayl8fGsmJiFmLiRldmFsKGspfHxjKCl9LHE9Kyt0O2U/KGEoZSwhMCkudGhlbihmdW5jdGlvbihhKXtpZihxPT09dCl7dmFyIGM9Zi4kbmV3KCk7cy50ZW1wbGF0ZT1hO2E9cihjLGZ1bmN0aW9uKGEpe0woKTtkLmVudGVyKGEsbnVsbCxnKS50aGVuKGgpfSk7bj1jO3c9YTtuLiRlbWl0KCIkaW5jbHVkZUNvbnRlbnRMb2FkZWQiLA0KLWUpO2YuJGV2YWwobCl9fSxmdW5jdGlvbigpe3E9PT10JiYoTCgpLGYuJGVtaXQoIiRpbmNsdWRlQ29udGVudEVycm9yIixlKSl9KSxmLiRlbWl0KCIkaW5jbHVkZUNvbnRlbnRSZXF1ZXN0ZWQiLGUpKTooTCgpLHMudGVtcGxhdGU9bnVsbCl9KX19fX1dLEFlPVsiJGNvbXBpbGUiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiRUNBIixwcmlvcml0eTotNDAwLHJlcXVpcmU6Im5nSW5jbHVkZSIsbGluazpmdW5jdGlvbihjLGQsZSxmKXsvU1ZHLy50ZXN0KGRbMF0udG9TdHJpbmcoKSk/KGQuZW1wdHkoKSxhKEZjKGYudGVtcGxhdGUsWSkuY2hpbGROb2RlcykoYyxmdW5jdGlvbihhKXtkLmFwcGVuZChhKX0se2Z1dHVyZVBhcmVudEVsZW1lbnQ6ZH0pKTooZC5odG1sKGYudGVtcGxhdGUpLGEoZC5jb250ZW50cygpKShjKSl9fX1dLGtlPUphKHtwcmlvcml0eTo0NTAsY29tcGlsZTpmdW5jdGlvbigpe3JldHVybntwcmU6ZnVuY3Rpb24oYSxjLGQpe2EuJGV2YWwoZC5uZ0luaXQpfX19fSksDQotbGU9SmEoe3Rlcm1pbmFsOiEwLHByaW9yaXR5OjFFM30pLG1lPVsiJGxvY2FsZSIsIiRpbnRlcnBvbGF0ZSIsZnVuY3Rpb24oYSxjKXt2YXIgZD0ve30vZyxlPS9ed2hlbihNaW51cyk/KC4rKSQvO3JldHVybntyZXN0cmljdDoiRUEiLGxpbms6ZnVuY3Rpb24oZixnLGgpe2Z1bmN0aW9uIGwoYSl7Zy50ZXh0KGF8fCIiKX12YXIgaz1oLmNvdW50LG09aC4kYXR0ci53aGVuJiZnLmF0dHIoaC4kYXR0ci53aGVuKSxwPWgub2Zmc2V0fHwwLHE9Zi4kZXZhbChtKXx8e30sdT17fSxtPWMuc3RhcnRTeW1ib2woKSxyPWMuZW5kU3ltYm9sKCksdD1tK2srIi0iK3ArcixuPWdhLm5vb3AsdjtzKGgsZnVuY3Rpb24oYSxjKXt2YXIgZD1lLmV4ZWMoYyk7ZCYmKGQ9KGRbMV0/Ii0iOiIiKStRKGRbMl0pLHFbZF09Zy5hdHRyKGguJGF0dHJbY10pKX0pO3MocSxmdW5jdGlvbihhLGUpe3VbZV09YyhhLnJlcGxhY2UoZCx0KSl9KTtmLiR3YXRjaChrLGZ1bmN0aW9uKGMpe2M9cGFyc2VGbG9hdChjKTt2YXIgZD0NCi1pc05hTihjKTtkfHxjIGluIHF8fChjPWEucGx1cmFsQ2F0KGMtcCkpO2M9PT12fHxkJiZpc05hTih2KXx8KG4oKSxuPWYuJHdhdGNoKHVbY10sbCksdj1jKX0pfX19XSxuZT1bIiRwYXJzZSIsIiRhbmltYXRlIixmdW5jdGlvbihhLGMpe3ZhciBkPVQoIm5nUmVwZWF0IiksZT1mdW5jdGlvbihhLGMsZCxlLGssbSxwKXthW2RdPWU7ayYmKGFba109bSk7YS4kaW5kZXg9YzthLiRmaXJzdD0wPT09YzthLiRsYXN0PWM9PT1wLTE7YS4kbWlkZGxlPSEoYS4kZmlyc3R8fGEuJGxhc3QpO2EuJG9kZD0hKGEuJGV2ZW49MD09PShjJjEpKX07cmV0dXJue3Jlc3RyaWN0OiJBIixtdWx0aUVsZW1lbnQ6ITAsdHJhbnNjbHVkZToiZWxlbWVudCIscHJpb3JpdHk6MUUzLHRlcm1pbmFsOiEwLCQkdGxiOiEwLGNvbXBpbGU6ZnVuY3Rpb24oZixnKXt2YXIgaD1nLm5nUmVwZWF0LGw9WS5jcmVhdGVDb21tZW50KCIgZW5kIG5nUmVwZWF0OiAiK2grIiAiKSxrPWgubWF0Y2goL15ccyooW1xzXFNdKz8pXHMraW5ccysoW1xzXFNdKz8pKD86XHMrYXNccysoW1xzXFNdKz8pKT8oPzpccyt0cmFja1xzK2J5XHMrKFtcc1xTXSs/KSk/XHMqJC8pOw0KLWlmKCFrKXRocm93IGQoImlleHAiLGgpO3ZhciBtPWtbMV0scD1rWzJdLHE9a1szXSx1PWtbNF0saz1tLm1hdGNoKC9eKD86KFxzKltcJFx3XSspfFwoXHMqKFtcJFx3XSspXHMqLFxzKihbXCRcd10rKVxzKlwpKSQvKTtpZighayl0aHJvdyBkKCJpaWRleHAiLG0pO3ZhciByPWtbM118fGtbMV0seT1rWzJdO2lmKHEmJighL15bJGEtekEtWl9dWyRhLXpBLVowLTlfXSokLy50ZXN0KHEpfHwvXihudWxsfHVuZGVmaW5lZHx0aGlzfFwkaW5kZXh8XCRmaXJzdHxcJG1pZGRsZXxcJGxhc3R8XCRldmVufFwkb2RkfFwkcGFyZW50KSQvLnRlc3QocSkpKXRocm93IGQoImJhZGlkZW50IixxKTt2YXIgbix2LHcsRCx6PXskaWQ6TmF9O3U/bj1hKHUpOih3PWZ1bmN0aW9uKGEsYyl7cmV0dXJuIE5hKGMpfSxEPWZ1bmN0aW9uKGEpe3JldHVybiBhfSk7cmV0dXJuIGZ1bmN0aW9uKGEsZixnLGssbSl7biYmKHY9ZnVuY3Rpb24oYyxkLGUpe3kmJih6W3ldPWMpO3pbcl09ZDt6LiRpbmRleD1lO3JldHVybiBuKGEsDQoteil9KTt2YXIgdT1oYSgpO2EuJHdhdGNoQ29sbGVjdGlvbihwLGZ1bmN0aW9uKGcpe3ZhciBrLHAsbj1mWzBdLEUsej1oYSgpLEMsUyxOLEcsSix4LEg7cSYmKGFbcV09Zyk7aWYoVGEoZykpSj1nLHA9dnx8dztlbHNle3A9dnx8RDtKPVtdO2ZvcihIIGluIGcpZy5oYXNPd25Qcm9wZXJ0eShIKSYmIiQiIT1ILmNoYXJBdCgwKSYmSi5wdXNoKEgpO0ouc29ydCgpfUM9Si5sZW5ndGg7SD1BcnJheShDKTtmb3Ioaz0wO2s8QztrKyspaWYoUz1nPT09Sj9rOkpba10sTj1nW1NdLEc9cChTLE4sayksdVtHXSl4PXVbR10sZGVsZXRlIHVbR10seltHXT14LEhba109eDtlbHNle2lmKHpbR10pdGhyb3cgcyhILGZ1bmN0aW9uKGEpe2EmJmEuc2NvcGUmJih1W2EuaWRdPWEpfSksZCgiZHVwZXMiLGgsRyxOKTtIW2tdPXtpZDpHLHNjb3BlOnQsY2xvbmU6dH07eltHXT0hMH1mb3IoRSBpbiB1KXt4PXVbRV07Rz10Yih4LmNsb25lKTtjLmxlYXZlKEcpO2lmKEdbMF0ucGFyZW50Tm9kZSlmb3Ioaz0wLA0KLXA9Ry5sZW5ndGg7azxwO2srKylHW2tdLiQkTkdfUkVNT1ZFRD0hMDt4LnNjb3BlLiRkZXN0cm95KCl9Zm9yKGs9MDtrPEM7aysrKWlmKFM9Zz09PUo/azpKW2tdLE49Z1tTXSx4PUhba10seC5zY29wZSl7RT1uO2RvIEU9RS5uZXh0U2libGluZzt3aGlsZShFJiZFLiQkTkdfUkVNT1ZFRCk7eC5jbG9uZVswXSE9RSYmYy5tb3ZlKHRiKHguY2xvbmUpLG51bGwsQihuKSk7bj14LmNsb25lW3guY2xvbmUubGVuZ3RoLTFdO2UoeC5zY29wZSxrLHIsTix5LFMsQyl9ZWxzZSBtKGZ1bmN0aW9uKGEsZCl7eC5zY29wZT1kO3ZhciBmPWwuY2xvbmVOb2RlKCExKTthW2EubGVuZ3RoKytdPWY7Yy5lbnRlcihhLG51bGwsQihuKSk7bj1mO3guY2xvbmU9YTt6W3guaWRdPXg7ZSh4LnNjb3BlLGsscixOLHksUyxDKX0pO3U9en0pfX19fV0sb2U9WyIkYW5pbWF0ZSIsZnVuY3Rpb24oYSl7cmV0dXJue3Jlc3RyaWN0OiJBIixtdWx0aUVsZW1lbnQ6ITAsbGluazpmdW5jdGlvbihjLGQsZSl7Yy4kd2F0Y2goZS5uZ1Nob3csDQotZnVuY3Rpb24oYyl7YVtjPyJyZW1vdmVDbGFzcyI6ImFkZENsYXNzIl0oZCwibmctaGlkZSIse3RlbXBDbGFzc2VzOiJuZy1oaWRlLWFuaW1hdGUifSl9KX19fV0saGU9WyIkYW5pbWF0ZSIsZnVuY3Rpb24oYSl7cmV0dXJue3Jlc3RyaWN0OiJBIixtdWx0aUVsZW1lbnQ6ITAsbGluazpmdW5jdGlvbihjLGQsZSl7Yy4kd2F0Y2goZS5uZ0hpZGUsZnVuY3Rpb24oYyl7YVtjPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oZCwibmctaGlkZSIse3RlbXBDbGFzc2VzOiJuZy1oaWRlLWFuaW1hdGUifSl9KX19fV0scGU9SmEoZnVuY3Rpb24oYSxjLGQpe2EuJHdhdGNoKGQubmdTdHlsZSxmdW5jdGlvbihhLGQpe2QmJmEhPT1kJiZzKGQsZnVuY3Rpb24oYSxkKXtjLmNzcyhkLCIiKX0pO2EmJmMuY3NzKGEpfSwhMCl9KSxxZT1bIiRhbmltYXRlIixmdW5jdGlvbihhKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXF1aXJlOiJuZ1N3aXRjaCIsY29udHJvbGxlcjpbIiRzY29wZSIsZnVuY3Rpb24oKXt0aGlzLmNhc2VzPQ0KLXt9fV0sbGluazpmdW5jdGlvbihjLGQsZSxmKXt2YXIgZz1bXSxoPVtdLGw9W10saz1bXSxtPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGZ1bmN0aW9uKCl7YS5zcGxpY2UoYywxKX19O2MuJHdhdGNoKGUubmdTd2l0Y2h8fGUub24sZnVuY3Rpb24oYyl7dmFyIGQsZTtkPTA7Zm9yKGU9bC5sZW5ndGg7ZDxlOysrZClhLmNhbmNlbChsW2RdKTtkPWwubGVuZ3RoPTA7Zm9yKGU9ay5sZW5ndGg7ZDxlOysrZCl7dmFyIHI9dGIoaFtkXS5jbG9uZSk7a1tkXS4kZGVzdHJveSgpOyhsW2RdPWEubGVhdmUocikpLnRoZW4obShsLGQpKX1oLmxlbmd0aD0wO2subGVuZ3RoPTA7KGc9Zi5jYXNlc1siISIrY118fGYuY2FzZXNbIj8iXSkmJnMoZyxmdW5jdGlvbihjKXtjLnRyYW5zY2x1ZGUoZnVuY3Rpb24oZCxlKXtrLnB1c2goZSk7dmFyIGY9Yy5lbGVtZW50O2RbZC5sZW5ndGgrK109WS5jcmVhdGVDb21tZW50KCIgZW5kIG5nU3dpdGNoV2hlbjogIik7aC5wdXNoKHtjbG9uZTpkfSk7YS5lbnRlcihkLA0KLWYucGFyZW50KCksZil9KX0pfSl9fX1dLHJlPUphKHt0cmFuc2NsdWRlOiJlbGVtZW50Iixwcmlvcml0eToxMjAwLHJlcXVpcmU6Il5uZ1N3aXRjaCIsbXVsdGlFbGVtZW50OiEwLGxpbms6ZnVuY3Rpb24oYSxjLGQsZSxmKXtlLmNhc2VzWyIhIitkLm5nU3dpdGNoV2hlbl09ZS5jYXNlc1siISIrZC5uZ1N3aXRjaFdoZW5dfHxbXTtlLmNhc2VzWyIhIitkLm5nU3dpdGNoV2hlbl0ucHVzaCh7dHJhbnNjbHVkZTpmLGVsZW1lbnQ6Y30pfX0pLHNlPUphKHt0cmFuc2NsdWRlOiJlbGVtZW50Iixwcmlvcml0eToxMjAwLHJlcXVpcmU6Il5uZ1N3aXRjaCIsbXVsdGlFbGVtZW50OiEwLGxpbms6ZnVuY3Rpb24oYSxjLGQsZSxmKXtlLmNhc2VzWyI/Il09ZS5jYXNlc1siPyJdfHxbXTtlLmNhc2VzWyI/Il0ucHVzaCh7dHJhbnNjbHVkZTpmLGVsZW1lbnQ6Y30pfX0pLHVlPUphKHtyZXN0cmljdDoiRUFDIixsaW5rOmZ1bmN0aW9uKGEsYyxkLGUsZil7aWYoIWYpdGhyb3cgVCgibmdUcmFuc2NsdWRlIikoIm9ycGhhbiIsDQotdmEoYykpO2YoZnVuY3Rpb24oYSl7Yy5lbXB0eSgpO2MuYXBwZW5kKGEpfSl9fSksVmQ9WyIkdGVtcGxhdGVDYWNoZSIsZnVuY3Rpb24oYSl7cmV0dXJue3Jlc3RyaWN0OiJFIix0ZXJtaW5hbDohMCxjb21waWxlOmZ1bmN0aW9uKGMsZCl7InRleHQvbmctdGVtcGxhdGUiPT1kLnR5cGUmJmEucHV0KGQuaWQsY1swXS50ZXh0KX19fV0sZWc9VCgibmdPcHRpb25zIiksdGU9ZGEoe3Jlc3RyaWN0OiJBIix0ZXJtaW5hbDohMH0pLFdkPVsiJGNvbXBpbGUiLCIkcGFyc2UiLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9L15ccyooW1xzXFNdKz8pKD86XHMrYXNccysoW1xzXFNdKz8pKT8oPzpccytncm91cFxzK2J5XHMrKFtcc1xTXSs/KSk/XHMrZm9yXHMrKD86KFtcJFx3XVtcJFx3XSopfCg/OlwoXHMqKFtcJFx3XVtcJFx3XSopXHMqLFxzKihbXCRcd11bXCRcd10qKVxzKlwpKSlccytpblxzKyhbXHNcU10rPykoPzpccyt0cmFja1xzK2J5XHMrKFtcc1xTXSs/KSk/JC8sZT17JHNldFZpZXdWYWx1ZTpDfTsNCi1yZXR1cm57cmVzdHJpY3Q6IkUiLHJlcXVpcmU6WyJzZWxlY3QiLCI/bmdNb2RlbCJdLGNvbnRyb2xsZXI6WyIkZWxlbWVudCIsIiRzY29wZSIsIiRhdHRycyIsZnVuY3Rpb24oYSxjLGQpe3ZhciBsPXRoaXMsaz17fSxtPWUscDtsLmRhdGFib3VuZD1kLm5nTW9kZWw7bC5pbml0PWZ1bmN0aW9uKGEsYyxkKXttPWE7cD1kfTtsLmFkZE9wdGlvbj1mdW5jdGlvbihjLGQpe01hKGMsJyJvcHRpb24gdmFsdWUiJyk7a1tjXT0hMDttLiR2aWV3VmFsdWU9PWMmJihhLnZhbChjKSxwLnBhcmVudCgpJiZwLnJlbW92ZSgpKTtkJiZkWzBdLmhhc0F0dHJpYnV0ZSgic2VsZWN0ZWQiKSYmKGRbMF0uc2VsZWN0ZWQ9ITApfTtsLnJlbW92ZU9wdGlvbj1mdW5jdGlvbihhKXt0aGlzLmhhc09wdGlvbihhKSYmKGRlbGV0ZSBrW2FdLG0uJHZpZXdWYWx1ZT09PWEmJnRoaXMucmVuZGVyVW5rbm93bk9wdGlvbihhKSl9O2wucmVuZGVyVW5rbm93bk9wdGlvbj1mdW5jdGlvbihjKXtjPSI/ICIrTmEoYykrIiA/IjsNCi1wLnZhbChjKTthLnByZXBlbmQocCk7YS52YWwoYyk7cC5wcm9wKCJzZWxlY3RlZCIsITApfTtsLmhhc09wdGlvbj1mdW5jdGlvbihhKXtyZXR1cm4gay5oYXNPd25Qcm9wZXJ0eShhKX07Yy4kb24oIiRkZXN0cm95IixmdW5jdGlvbigpe2wucmVuZGVyVW5rbm93bk9wdGlvbj1DfSl9XSxsaW5rOmZ1bmN0aW9uKGUsZyxoLGwpe2Z1bmN0aW9uIGsoYSxjLGQsZSl7ZC4kcmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGE9ZC4kdmlld1ZhbHVlO2UuaGFzT3B0aW9uKGEpPyhDLnBhcmVudCgpJiZDLnJlbW92ZSgpLGMudmFsKGEpLCIiPT09YSYmbi5wcm9wKCJzZWxlY3RlZCIsITApKTpEKGEpJiZuP2MudmFsKCIiKTplLnJlbmRlclVua25vd25PcHRpb24oYSl9O2Mub24oImNoYW5nZSIsZnVuY3Rpb24oKXthLiRhcHBseShmdW5jdGlvbigpe0MucGFyZW50KCkmJkMucmVtb3ZlKCk7ZC4kc2V0Vmlld1ZhbHVlKGMudmFsKCkpfSl9KX1mdW5jdGlvbiBtKGEsYyxkKXt2YXIgZTtkLiRyZW5kZXI9ZnVuY3Rpb24oKXt2YXIgYT0NCi1uZXcgZGIoZC4kdmlld1ZhbHVlKTtzKGMuZmluZCgib3B0aW9uIiksZnVuY3Rpb24oYyl7Yy5zZWxlY3RlZD15KGEuZ2V0KGMudmFsdWUpKX0pfTthLiR3YXRjaChmdW5jdGlvbigpe2ZhKGUsZC4kdmlld1ZhbHVlKXx8KGU9cWEoZC4kdmlld1ZhbHVlKSxkLiRyZW5kZXIoKSl9KTtjLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7YS4kYXBwbHkoZnVuY3Rpb24oKXt2YXIgYT1bXTtzKGMuZmluZCgib3B0aW9uIiksZnVuY3Rpb24oYyl7Yy5zZWxlY3RlZCYmYS5wdXNoKGMudmFsdWUpfSk7ZC4kc2V0Vmlld1ZhbHVlKGEpfSl9KX1mdW5jdGlvbiBwKGUsZixnKXtmdW5jdGlvbiBoKGEsYyxkKXtUW0FdPWQ7SCYmKFRbSF09Yyk7cmV0dXJuIGEoZSxUKX1mdW5jdGlvbiBrKGEpe3ZhciBjO2lmKHUpaWYoTSYmeChhKSl7Yz1uZXcgZGIoW10pO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWMucHV0KGgoTSxudWxsLGFbZF0pLCEwKX1lbHNlIGM9bmV3IGRiKGEpO2Vsc2UgTSYmKGE9aChNLG51bGwsDQotYSkpO3JldHVybiBmdW5jdGlvbihkLGUpe3ZhciBmO2Y9TT9NOkI/QjpGO3JldHVybiB1P3koYy5yZW1vdmUoaChmLGQsZSkpKTphPT09aChmLGQsZSl9fWZ1bmN0aW9uIGwoKXt2fHwoZS4kJHBvc3REaWdlc3QocCksdj0hMCl9ZnVuY3Rpb24gbShhLGMsZCl7YVtjXT1hW2NdfHwwO2FbY10rPWQ/MTotMX1mdW5jdGlvbiBwKCl7dj0hMTt2YXIgYT17IiI6W119LGM9WyIiXSxkLGwsbixyLHQ7bj1nLiR2aWV3VmFsdWU7cj1QKGUpfHxbXTt2YXIgQj1IP09iamVjdC5rZXlzKHIpLnNvcnQoKTpyLHgsQSxELEYsTj17fTt0PWsobik7dmFyIEk9ITEsVSxWO1E9e307Zm9yKEY9MDtEPUIubGVuZ3RoLEY8RDtGKyspe3g9RjtpZihIJiYoeD1CW0ZdLCIkIj09PXguY2hhckF0KDApKSljb250aW51ZTtBPXJbeF07ZD1oKEoseCxBKXx8IiI7KGw9YVtkXSl8fChsPWFbZF09W10sYy5wdXNoKGQpKTtkPXQoeCxBKTtJPUl8fGQ7QT1oKEMseCxBKTtBPXkoQSk/QToiIjtWPU0/TShlLFQpOkg/QltGXToNCi1GO00mJihRW1ZdPXgpO2wucHVzaCh7aWQ6VixsYWJlbDpBLHNlbGVjdGVkOmR9KX11fHwoenx8bnVsbD09PW4/YVsiIl0udW5zaGlmdCh7aWQ6IiIsbGFiZWw6IiIsc2VsZWN0ZWQ6IUl9KTpJfHxhWyIiXS51bnNoaWZ0KHtpZDoiPyIsbGFiZWw6IiIsc2VsZWN0ZWQ6ITB9KSk7eD0wO2ZvcihCPWMubGVuZ3RoO3g8Qjt4Kyspe2Q9Y1t4XTtsPWFbZF07Ui5sZW5ndGg8PXg/KG49e2VsZW1lbnQ6Ry5jbG9uZSgpLmF0dHIoImxhYmVsIixkKSxsYWJlbDpsLmxhYmVsfSxyPVtuXSxSLnB1c2gociksZi5hcHBlbmQobi5lbGVtZW50KSk6KHI9Ult4XSxuPXJbMF0sbi5sYWJlbCE9ZCYmbi5lbGVtZW50LmF0dHIoImxhYmVsIixuLmxhYmVsPWQpKTtJPW51bGw7Rj0wO2ZvcihEPWwubGVuZ3RoO0Y8RDtGKyspZD1sW0ZdLCh0PXJbRisxXSk/KEk9dC5lbGVtZW50LHQubGFiZWwhPT1kLmxhYmVsJiYobShOLHQubGFiZWwsITEpLG0oTixkLmxhYmVsLCEwKSxJLnRleHQodC5sYWJlbD1kLmxhYmVsKSwNCi1JLnByb3AoImxhYmVsIix0LmxhYmVsKSksdC5pZCE9PWQuaWQmJkkudmFsKHQuaWQ9ZC5pZCksSVswXS5zZWxlY3RlZCE9PWQuc2VsZWN0ZWQmJihJLnByb3AoInNlbGVjdGVkIix0LnNlbGVjdGVkPWQuc2VsZWN0ZWQpLFJhJiZJLnByb3AoInNlbGVjdGVkIix0LnNlbGVjdGVkKSkpOigiIj09PWQuaWQmJno/VT16OihVPXcuY2xvbmUoKSkudmFsKGQuaWQpLnByb3AoInNlbGVjdGVkIixkLnNlbGVjdGVkKS5hdHRyKCJzZWxlY3RlZCIsZC5zZWxlY3RlZCkucHJvcCgibGFiZWwiLGQubGFiZWwpLnRleHQoZC5sYWJlbCksci5wdXNoKHQ9e2VsZW1lbnQ6VSxsYWJlbDpkLmxhYmVsLGlkOmQuaWQsc2VsZWN0ZWQ6ZC5zZWxlY3RlZH0pLG0oTixkLmxhYmVsLCEwKSxJP0kuYWZ0ZXIoVSk6bi5lbGVtZW50LmFwcGVuZChVKSxJPVUpO2ZvcihGKys7ci5sZW5ndGg+RjspZD1yLnBvcCgpLG0oTixkLmxhYmVsLCExKSxkLmVsZW1lbnQucmVtb3ZlKCl9Zm9yKDtSLmxlbmd0aD54Oyl7bD1SLnBvcCgpOw0KLWZvcihGPTE7RjxsLmxlbmd0aDsrK0YpbShOLGxbRl0ubGFiZWwsITEpO2xbMF0uZWxlbWVudC5yZW1vdmUoKX1zKE4sZnVuY3Rpb24oYSxjKXswPGE/cS5hZGRPcHRpb24oYyk6MD5hJiZxLnJlbW92ZU9wdGlvbihjKX0pfXZhciBuO2lmKCEobj1yLm1hdGNoKGQpKSl0aHJvdyBlZygiaWV4cCIscix2YShmKSk7dmFyIEM9YyhuWzJdfHxuWzFdKSxBPW5bNF18fG5bNl0sRD0vIGFzIC8udGVzdChuWzBdKSYmblsxXSxCPUQ/YyhEKTpudWxsLEg9bls1XSxKPWMoblszXXx8IiIpLEY9YyhuWzJdP25bMV06QSksUD1jKG5bN10pLE09bls4XT9jKG5bOF0pOm51bGwsUT17fSxSPVtbe2VsZW1lbnQ6ZixsYWJlbDoiIn1dXSxUPXt9O3omJihhKHopKGUpLHoucmVtb3ZlQ2xhc3MoIm5nLXNjb3BlIiksei5yZW1vdmUoKSk7Zi5lbXB0eSgpO2Yub24oImNoYW5nZSIsZnVuY3Rpb24oKXtlLiRhcHBseShmdW5jdGlvbigpe3ZhciBhPVAoZSl8fFtdLGM7aWYodSljPVtdLHMoZi52YWwoKSxmdW5jdGlvbihkKXtkPQ0KLU0/UVtkXTpkO2MucHVzaCgiPyI9PT1kP3Q6IiI9PT1kP251bGw6aChCP0I6RixkLGFbZF0pKX0pO2Vsc2V7dmFyIGQ9TT9RW2YudmFsKCldOmYudmFsKCk7Yz0iPyI9PT1kP3Q6IiI9PT1kP251bGw6aChCP0I6RixkLGFbZF0pfWcuJHNldFZpZXdWYWx1ZShjKTtwKCl9KX0pO2cuJHJlbmRlcj1wO2UuJHdhdGNoQ29sbGVjdGlvbihQLGwpO2UuJHdhdGNoQ29sbGVjdGlvbihmdW5jdGlvbigpe3ZhciBhPVAoZSksYztpZihhJiZ4KGEpKXtjPUFycmF5KGEubGVuZ3RoKTtmb3IodmFyIGQ9MCxmPWEubGVuZ3RoO2Q8ZjtkKyspY1tkXT1oKEMsZCxhW2RdKX1lbHNlIGlmKGEpZm9yKGQgaW4gYz17fSxhKWEuaGFzT3duUHJvcGVydHkoZCkmJihjW2RdPWgoQyxkLGFbZF0pKTtyZXR1cm4gY30sbCk7dSYmZS4kd2F0Y2hDb2xsZWN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGcuJG1vZGVsVmFsdWV9LGwpfWlmKGxbMV0pe3ZhciBxPWxbMF07bD1sWzFdO3ZhciB1PWgubXVsdGlwbGUscj1oLm5nT3B0aW9ucywNCi16PSExLG4sdj0hMSx3PUIoWS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksRz1CKFkuY3JlYXRlRWxlbWVudCgib3B0Z3JvdXAiKSksQz13LmNsb25lKCk7aD0wO2Zvcih2YXIgQT1nLmNoaWxkcmVuKCksSD1BLmxlbmd0aDtoPEg7aCsrKWlmKCIiPT09QVtoXS52YWx1ZSl7bj16PUEuZXEoaCk7YnJlYWt9cS5pbml0KGwseixDKTt1JiYobC4kaXNFbXB0eT1mdW5jdGlvbihhKXtyZXR1cm4hYXx8MD09PWEubGVuZ3RofSk7cj9wKGUsZyxsKTp1P20oZSxnLGwpOmsoZSxnLGwscSl9fX19XSxZZD1bIiRpbnRlcnBvbGF0ZSIsZnVuY3Rpb24oYSl7dmFyIGM9e2FkZE9wdGlvbjpDLHJlbW92ZU9wdGlvbjpDfTtyZXR1cm57cmVzdHJpY3Q6IkUiLHByaW9yaXR5OjEwMCxjb21waWxlOmZ1bmN0aW9uKGQsZSl7aWYoRChlLnZhbHVlKSl7dmFyIGY9YShkLnRleHQoKSwhMCk7Znx8ZS4kc2V0KCJ2YWx1ZSIsZC50ZXh0KCkpfXJldHVybiBmdW5jdGlvbihhLGQsZSl7dmFyIGs9ZC5wYXJlbnQoKSwNCi1tPWsuZGF0YSgiJHNlbGVjdENvbnRyb2xsZXIiKXx8ay5wYXJlbnQoKS5kYXRhKCIkc2VsZWN0Q29udHJvbGxlciIpO20mJm0uZGF0YWJvdW5kfHwobT1jKTtmP2EuJHdhdGNoKGYsZnVuY3Rpb24oYSxjKXtlLiRzZXQoInZhbHVlIixhKTtjIT09YSYmbS5yZW1vdmVPcHRpb24oYyk7bS5hZGRPcHRpb24oYSxkKX0pOm0uYWRkT3B0aW9uKGUudmFsdWUsZCk7ZC5vbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7bS5yZW1vdmVPcHRpb24oZS52YWx1ZSl9KX19fX1dLFhkPWRhKHtyZXN0cmljdDoiRSIsdGVybWluYWw6ITF9KTtNLmFuZ3VsYXIuYm9vdHN0cmFwP2NvbnNvbGUubG9nKCJXQVJOSU5HOiBUcmllZCB0byBsb2FkIGFuZ3VsYXIgbW9yZSB0aGFuIG9uY2UuIik6KE5kKCksUGQoZ2EpLEIoWSkucmVhZHkoZnVuY3Rpb24oKXtKZChZLHNjKX0pKX0pKHdpbmRvdyxkb2N1bWVudCk7IXdpbmRvdy5hbmd1bGFyLiQkY3NwKCkmJndpbmRvdy5hbmd1bGFyLmVsZW1lbnQoZG9jdW1lbnQpLmZpbmQoImhlYWQiKS5wcmVwZW5kKCc8c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBjaGFyc2V0ICJVVEYtOCI7W25nXFw6Y2xvYWtdLFtuZy1jbG9ha10sW2RhdGEtbmctY2xvYWtdLFt4LW5nLWNsb2FrXSwubmctY2xvYWssLngtbmctY2xvYWssLm5nLWhpZGU6bm90KC5uZy1oaWRlLWFuaW1hdGUpe2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50O31uZ1xcOmZvcm17ZGlzcGxheTpibG9jazt9PC9zdHlsZT4nKTsNCi0vLyMgc291cmNlTWFwcGluZ1VSTD1hbmd1bGFyLm1pbi5qcy5tYXANCisvKgorVGhlIE1JVCBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKyovCisvKgorIEFuZ3VsYXJKUyB2MS4zLjgKKyAoYykgMjAxMC0yMDE0IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZworIExpY2Vuc2U6IE1JVAorKi8KKyhmdW5jdGlvbihNLFksdCl7J3VzZSBzdHJpY3QnO2Z1bmN0aW9uIFQoYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzWzBdLGM7Yz0iWyIrKGI/YisiOiI6IiIpK2ErIl0gaHR0cDovL2Vycm9ycy5hbmd1bGFyanMub3JnLzEuMy44LyIrKGI/YisiLyI6IiIpK2E7Zm9yKGE9MTthPGFyZ3VtZW50cy5sZW5ndGg7YSsrKXtjPWMrKDE9PWE/Ij8iOiImIikrInAiKyhhLTEpKyI9Ijt2YXIgZD1lbmNvZGVVUklDb21wb25lbnQsZTtlPWFyZ3VtZW50c1thXTtlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2UudG9TdHJpbmcoKS5yZXBsYWNlKC8gXHtbXHNcU10qJC8sIiIpOiJ1bmRlZmluZWQiPT10eXBlb2YgZT8idW5kZWZpbmVkIjoic3RyaW5nIiE9dHlwZW9mIGU/SlNPTi5zdHJpbmdpZnkoZSk6ZTtjKz1kKGUpfXJldHVybiBFcnJvcihjKX19ZnVuY3Rpb24gVGEoYil7aWYobnVsbD09Ynx8VWEoYikpcmV0dXJuITE7dmFyIGE9Yi5sZW5ndGg7cmV0dXJuIGIubm9kZVR5cGU9PT0KK25hJiZhPyEwOkYoYil8fHgoYil8fDA9PT1hfHwibnVtYmVyIj09PXR5cGVvZiBhJiYwPGEmJmEtMSBpbiBifWZ1bmN0aW9uIHMoYixhLGMpe3ZhciBkLGU7aWYoYilpZihHKGIpKWZvcihkIGluIGIpInByb3RvdHlwZSI9PWR8fCJsZW5ndGgiPT1kfHwibmFtZSI9PWR8fGIuaGFzT3duUHJvcGVydHkmJiFiLmhhc093blByb3BlcnR5KGQpfHxhLmNhbGwoYyxiW2RdLGQsYik7ZWxzZSBpZih4KGIpfHxUYShiKSl7dmFyIGY9Im9iamVjdCIhPT10eXBlb2YgYjtkPTA7Zm9yKGU9Yi5sZW5ndGg7ZDxlO2QrKykoZnx8ZCBpbiBiKSYmYS5jYWxsKGMsYltkXSxkLGIpfWVsc2UgaWYoYi5mb3JFYWNoJiZiLmZvckVhY2ghPT1zKWIuZm9yRWFjaChhLGMsYik7ZWxzZSBmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJmEuY2FsbChjLGJbZF0sZCxiKTtyZXR1cm4gYn1mdW5jdGlvbiBFZChiLGEsYyl7Zm9yKHZhciBkPU9iamVjdC5rZXlzKGIpLnNvcnQoKSxlPTA7ZTxkLmxlbmd0aDtlKyspYS5jYWxsKGMsCitiW2RbZV1dLGRbZV0pO3JldHVybiBkfWZ1bmN0aW9uIGtjKGIpe3JldHVybiBmdW5jdGlvbihhLGMpe2IoYyxhKX19ZnVuY3Rpb24gRmQoKXtyZXR1cm4rK25ifWZ1bmN0aW9uIGxjKGIsYSl7YT9iLiQkaGFzaEtleT1hOmRlbGV0ZSBiLiQkaGFzaEtleX1mdW5jdGlvbiB6KGIpe2Zvcih2YXIgYT1iLiQkaGFzaEtleSxjPTEsZD1hcmd1bWVudHMubGVuZ3RoO2M8ZDtjKyspe3ZhciBlPWFyZ3VtZW50c1tjXTtpZihlKWZvcih2YXIgZj1PYmplY3Qua2V5cyhlKSxnPTAsaD1mLmxlbmd0aDtnPGg7ZysrKXt2YXIgbD1mW2ddO2JbbF09ZVtsXX19bGMoYixhKTtyZXR1cm4gYn1mdW5jdGlvbiBiYShiKXtyZXR1cm4gcGFyc2VJbnQoYiwxMCl9ZnVuY3Rpb24gQygpe31mdW5jdGlvbiBvYShiKXtyZXR1cm4gYn1mdW5jdGlvbiBkYShiKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYn19ZnVuY3Rpb24gRChiKXtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBifWZ1bmN0aW9uIHkoYil7cmV0dXJuInVuZGVmaW5lZCIhPT0KK3R5cGVvZiBifWZ1bmN0aW9uIEgoYil7cmV0dXJuIG51bGwhPT1iJiYib2JqZWN0Ij09PXR5cGVvZiBifWZ1bmN0aW9uIEYoYil7cmV0dXJuInN0cmluZyI9PT10eXBlb2YgYn1mdW5jdGlvbiBWKGIpe3JldHVybiJudW1iZXIiPT09dHlwZW9mIGJ9ZnVuY3Rpb24gcGEoYil7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09RGEuY2FsbChiKX1mdW5jdGlvbiBHKGIpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgYn1mdW5jdGlvbiBvYihiKXtyZXR1cm4iW29iamVjdCBSZWdFeHBdIj09PURhLmNhbGwoYil9ZnVuY3Rpb24gVWEoYil7cmV0dXJuIGImJmIud2luZG93PT09Yn1mdW5jdGlvbiBWYShiKXtyZXR1cm4gYiYmYi4kZXZhbEFzeW5jJiZiLiR3YXRjaH1mdW5jdGlvbiBXYShiKXtyZXR1cm4iYm9vbGVhbiI9PT10eXBlb2YgYn1mdW5jdGlvbiBtYyhiKXtyZXR1cm4hKCFifHwhKGIubm9kZU5hbWV8fGIucHJvcCYmYi5hdHRyJiZiLmZpbmQpKX1mdW5jdGlvbiBHZChiKXt2YXIgYT17fTsKK2I9Yi5zcGxpdCgiLCIpO3ZhciBjO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYVtiW2NdXT0hMDtyZXR1cm4gYX1mdW5jdGlvbiB1YShiKXtyZXR1cm4gUShiLm5vZGVOYW1lfHxiWzBdJiZiWzBdLm5vZGVOYW1lKX1mdW5jdGlvbiBYYShiLGEpe3ZhciBjPWIuaW5kZXhPZihhKTswPD1jJiZiLnNwbGljZShjLDEpO3JldHVybiBhfWZ1bmN0aW9uIEVhKGIsYSxjLGQpe2lmKFVhKGIpfHxWYShiKSl0aHJvdyBLYSgiY3B3cyIpO2lmKGEpe2lmKGI9PT1hKXRocm93IEthKCJjcGkiKTtjPWN8fFtdO2Q9ZHx8W107aWYoSChiKSl7dmFyIGU9Yy5pbmRleE9mKGIpO2lmKC0xIT09ZSlyZXR1cm4gZFtlXTtjLnB1c2goYik7ZC5wdXNoKGEpfWlmKHgoYikpZm9yKHZhciBmPWEubGVuZ3RoPTA7ZjxiLmxlbmd0aDtmKyspZT1FYShiW2ZdLG51bGwsYyxkKSxIKGJbZl0pJiYoYy5wdXNoKGJbZl0pLGQucHVzaChlKSksYS5wdXNoKGUpO2Vsc2V7dmFyIGc9YS4kJGhhc2hLZXk7eChhKT9hLmxlbmd0aD0KKzA6cyhhLGZ1bmN0aW9uKGIsYyl7ZGVsZXRlIGFbY119KTtmb3IoZiBpbiBiKWIuaGFzT3duUHJvcGVydHkoZikmJihlPUVhKGJbZl0sbnVsbCxjLGQpLEgoYltmXSkmJihjLnB1c2goYltmXSksZC5wdXNoKGUpKSxhW2ZdPWUpO2xjKGEsZyl9fWVsc2UgaWYoYT1iKXgoYik/YT1FYShiLFtdLGMsZCk6cGEoYik/YT1uZXcgRGF0ZShiLmdldFRpbWUoKSk6b2IoYik/KGE9bmV3IFJlZ0V4cChiLnNvdXJjZSxiLnRvU3RyaW5nKCkubWF0Y2goL1teXC9dKiQvKVswXSksYS5sYXN0SW5kZXg9Yi5sYXN0SW5kZXgpOkgoYikmJihlPU9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKGIpKSxhPUVhKGIsZSxjLGQpKTtyZXR1cm4gYX1mdW5jdGlvbiBxYShiLGEpe2lmKHgoYikpe2E9YXx8W107Zm9yKHZhciBjPTAsZD1iLmxlbmd0aDtjPGQ7YysrKWFbY109YltjXX1lbHNlIGlmKEgoYikpZm9yKGMgaW4gYT1hfHx7fSxiKWlmKCIkIiE9PWMuY2hhckF0KDApfHwiJCIhPT1jLmNoYXJBdCgxKSlhW2NdPQorYltjXTtyZXR1cm4gYXx8Yn1mdW5jdGlvbiBmYShiLGEpe2lmKGI9PT1hKXJldHVybiEwO2lmKG51bGw9PT1ifHxudWxsPT09YSlyZXR1cm4hMTtpZihiIT09YiYmYSE9PWEpcmV0dXJuITA7dmFyIGM9dHlwZW9mIGIsZDtpZihjPT10eXBlb2YgYSYmIm9iamVjdCI9PWMpaWYoeChiKSl7aWYoIXgoYSkpcmV0dXJuITE7aWYoKGM9Yi5sZW5ndGgpPT1hLmxlbmd0aCl7Zm9yKGQ9MDtkPGM7ZCsrKWlmKCFmYShiW2RdLGFbZF0pKXJldHVybiExO3JldHVybiEwfX1lbHNle2lmKHBhKGIpKXJldHVybiBwYShhKT9mYShiLmdldFRpbWUoKSxhLmdldFRpbWUoKSk6ITE7aWYob2IoYikmJm9iKGEpKXJldHVybiBiLnRvU3RyaW5nKCk9PWEudG9TdHJpbmcoKTtpZihWYShiKXx8VmEoYSl8fFVhKGIpfHxVYShhKXx8eChhKSlyZXR1cm4hMTtjPXt9O2ZvcihkIGluIGIpaWYoIiQiIT09ZC5jaGFyQXQoMCkmJiFHKGJbZF0pKXtpZighZmEoYltkXSxhW2RdKSlyZXR1cm4hMTtjW2RdPSEwfWZvcihkIGluIGEpaWYoIWMuaGFzT3duUHJvcGVydHkoZCkmJgorIiQiIT09ZC5jaGFyQXQoMCkmJmFbZF0hPT10JiYhRyhhW2RdKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBZYShiLGEsYyl7cmV0dXJuIGIuY29uY2F0KFphLmNhbGwoYSxjKSl9ZnVuY3Rpb24gbmMoYixhKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGg/WmEuY2FsbChhcmd1bWVudHMsMik6W107cmV0dXJuIUcoYSl8fGEgaW5zdGFuY2VvZiBSZWdFeHA/YTpjLmxlbmd0aD9mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2EuYXBwbHkoYixZYShjLGFyZ3VtZW50cywwKSk6YS5hcHBseShiLGMpfTpmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2EuYXBwbHkoYixhcmd1bWVudHMpOmEuY2FsbChiKX19ZnVuY3Rpb24gSGQoYixhKXt2YXIgYz1hOyJzdHJpbmciPT09dHlwZW9mIGImJiIkIj09PWIuY2hhckF0KDApJiYiJCI9PT1iLmNoYXJBdCgxKT9jPXQ6VWEoYSk/Yz0iJFdJTkRPVyI6YSYmWT09PWE/Yz0iJERPQ1VNRU5UIjpWYShhKSYmCisoYz0iJFNDT1BFIik7cmV0dXJuIGN9ZnVuY3Rpb24gJGEoYixhKXtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBiKXJldHVybiB0O1YoYSl8fChhPWE/MjpudWxsKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYixIZCxhKX1mdW5jdGlvbiBvYyhiKXtyZXR1cm4gRihiKT9KU09OLnBhcnNlKGIpOmJ9ZnVuY3Rpb24gdmEoYil7Yj1CKGIpLmNsb25lKCk7dHJ5e2IuZW1wdHkoKX1jYXRjaChhKXt9dmFyIGM9QigiPGRpdj4iKS5hcHBlbmQoYikuaHRtbCgpO3RyeXtyZXR1cm4gYlswXS5ub2RlVHlwZT09PXBiP1EoYyk6Yy5tYXRjaCgvXig8W14+XSs+KS8pWzFdLnJlcGxhY2UoL148KFtcd1wtXSspLyxmdW5jdGlvbihhLGIpe3JldHVybiI8IitRKGIpfSl9Y2F0Y2goZCl7cmV0dXJuIFEoYyl9fWZ1bmN0aW9uIHBjKGIpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGIpfWNhdGNoKGEpe319ZnVuY3Rpb24gcWMoYil7dmFyIGE9e30sYyxkO3MoKGJ8fCIiKS5zcGxpdCgiJiIpLGZ1bmN0aW9uKGIpe2ImJgorKGM9Yi5yZXBsYWNlKC9cKy9nLCIlMjAiKS5zcGxpdCgiPSIpLGQ9cGMoY1swXSkseShkKSYmKGI9eShjWzFdKT9wYyhjWzFdKTohMCxyYy5jYWxsKGEsZCk/eChhW2RdKT9hW2RdLnB1c2goYik6YVtkXT1bYVtkXSxiXTphW2RdPWIpKX0pO3JldHVybiBhfWZ1bmN0aW9uIE5iKGIpe3ZhciBhPVtdO3MoYixmdW5jdGlvbihiLGQpe3goYik/cyhiLGZ1bmN0aW9uKGIpe2EucHVzaChGYShkLCEwKSsoITA9PT1iPyIiOiI9IitGYShiLCEwKSkpfSk6YS5wdXNoKEZhKGQsITApKyghMD09PWI/IiI6Ij0iK0ZhKGIsITApKSl9KTtyZXR1cm4gYS5sZW5ndGg/YS5qb2luKCImIik6IiJ9ZnVuY3Rpb24gcWIoYil7cmV0dXJuIEZhKGIsITApLnJlcGxhY2UoLyUyNi9naSwiJiIpLnJlcGxhY2UoLyUzRC9naSwiPSIpLnJlcGxhY2UoLyUyQi9naSwiKyIpfWZ1bmN0aW9uIEZhKGIsYSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChiKS5yZXBsYWNlKC8lNDAvZ2ksIkAiKS5yZXBsYWNlKC8lM0EvZ2ksCisiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTNCL2dpLCI7IikucmVwbGFjZSgvJTIwL2csYT8iJTIwIjoiKyIpfWZ1bmN0aW9uIElkKGIsYSl7dmFyIGMsZCxlPXJiLmxlbmd0aDtiPUIoYik7Zm9yKGQ9MDtkPGU7KytkKWlmKGM9cmJbZF0rYSxGKGM9Yi5hdHRyKGMpKSlyZXR1cm4gYztyZXR1cm4gbnVsbH1mdW5jdGlvbiBKZChiLGEpe3ZhciBjLGQsZT17fTtzKHJiLGZ1bmN0aW9uKGEpe2ErPSJhcHAiOyFjJiZiLmhhc0F0dHJpYnV0ZSYmYi5oYXNBdHRyaWJ1dGUoYSkmJihjPWIsZD1iLmdldEF0dHJpYnV0ZShhKSl9KTtzKHJiLGZ1bmN0aW9uKGEpe2ErPSJhcHAiO3ZhciBlOyFjJiYoZT1iLnF1ZXJ5U2VsZWN0b3IoIlsiK2EucmVwbGFjZSgiOiIsIlxcOiIpKyJdIikpJiYoYz1lLGQ9ZS5nZXRBdHRyaWJ1dGUoYSkpfSk7YyYmKGUuc3RyaWN0RGk9bnVsbCE9PUlkKGMsInN0cmljdC1kaSIpLGEoYyxkP1tkXTpbXSxlKSl9ZnVuY3Rpb24gc2MoYiwKK2EsYyl7SChjKXx8KGM9e30pO2M9eih7c3RyaWN0RGk6ITF9LGMpO3ZhciBkPWZ1bmN0aW9uKCl7Yj1CKGIpO2lmKGIuaW5qZWN0b3IoKSl7dmFyIGQ9YlswXT09PVk/ImRvY3VtZW50Ijp2YShiKTt0aHJvdyBLYSgiYnRzdHJwZCIsZC5yZXBsYWNlKC88LywiJmx0OyIpLnJlcGxhY2UoLz4vLCImZ3Q7IikpO31hPWF8fFtdO2EudW5zaGlmdChbIiRwcm92aWRlIixmdW5jdGlvbihhKXthLnZhbHVlKCIkcm9vdEVsZW1lbnQiLGIpfV0pO2MuZGVidWdJbmZvRW5hYmxlZCYmYS5wdXNoKFsiJGNvbXBpbGVQcm92aWRlciIsZnVuY3Rpb24oYSl7YS5kZWJ1Z0luZm9FbmFibGVkKCEwKX1dKTthLnVuc2hpZnQoIm5nIik7ZD1PYihhLGMuc3RyaWN0RGkpO2QuaW52b2tlKFsiJHJvb3RTY29wZSIsIiRyb290RWxlbWVudCIsIiRjb21waWxlIiwiJGluamVjdG9yIixmdW5jdGlvbihhLGIsYyxkKXthLiRhcHBseShmdW5jdGlvbigpe2IuZGF0YSgiJGluamVjdG9yIixkKTtjKGIpKGEpfSl9XSk7cmV0dXJuIGR9LAorZT0vXk5HX0VOQUJMRV9ERUJVR19JTkZPIS8sZj0vXk5HX0RFRkVSX0JPT1RTVFJBUCEvO00mJmUudGVzdChNLm5hbWUpJiYoYy5kZWJ1Z0luZm9FbmFibGVkPSEwLE0ubmFtZT1NLm5hbWUucmVwbGFjZShlLCIiKSk7aWYoTSYmIWYudGVzdChNLm5hbWUpKXJldHVybiBkKCk7TS5uYW1lPU0ubmFtZS5yZXBsYWNlKGYsIiIpO2dhLnJlc3VtZUJvb3RzdHJhcD1mdW5jdGlvbihiKXtzKGIsZnVuY3Rpb24oYil7YS5wdXNoKGIpfSk7ZCgpfX1mdW5jdGlvbiBLZCgpe00ubmFtZT0iTkdfRU5BQkxFX0RFQlVHX0lORk8hIitNLm5hbWU7TS5sb2NhdGlvbi5yZWxvYWQoKX1mdW5jdGlvbiBMZChiKXtiPWdhLmVsZW1lbnQoYikuaW5qZWN0b3IoKTtpZighYil0aHJvdyBLYSgidGVzdCIpO3JldHVybiBiLmdldCgiJCR0ZXN0YWJpbGl0eSIpfWZ1bmN0aW9uIHRjKGIsYSl7YT1hfHwiXyI7cmV0dXJuIGIucmVwbGFjZShNZCxmdW5jdGlvbihiLGQpe3JldHVybihkP2E6IiIpK2IudG9Mb3dlckNhc2UoKX0pfQorZnVuY3Rpb24gTmQoKXt2YXIgYjt1Y3x8KChyYT1NLmpRdWVyeSkmJnJhLmZuLm9uPyhCPXJhLHoocmEuZm4se3Njb3BlOkxhLnNjb3BlLGlzb2xhdGVTY29wZTpMYS5pc29sYXRlU2NvcGUsY29udHJvbGxlcjpMYS5jb250cm9sbGVyLGluamVjdG9yOkxhLmluamVjdG9yLGluaGVyaXRlZERhdGE6TGEuaW5oZXJpdGVkRGF0YX0pLGI9cmEuY2xlYW5EYXRhLHJhLmNsZWFuRGF0YT1mdW5jdGlvbihhKXt2YXIgYztpZihQYilQYj0hMTtlbHNlIGZvcih2YXIgZD0wLGU7bnVsbCE9KGU9YVtkXSk7ZCsrKShjPXJhLl9kYXRhKGUsImV2ZW50cyIpKSYmYy4kZGVzdHJveSYmcmEoZSkudHJpZ2dlckhhbmRsZXIoIiRkZXN0cm95Iik7YihhKX0pOkI9UixnYS5lbGVtZW50PUIsdWM9ITApfWZ1bmN0aW9uIFFiKGIsYSxjKXtpZighYil0aHJvdyBLYSgiYXJlcSIsYXx8Ij8iLGN8fCJyZXF1aXJlZCIpO3JldHVybiBifWZ1bmN0aW9uIHNiKGIsYSxjKXtjJiZ4KGIpJiYoYj1iW2IubGVuZ3RoLTFdKTsKK1FiKEcoYiksYSwibm90IGEgZnVuY3Rpb24sIGdvdCAiKyhiJiYib2JqZWN0Ij09PXR5cGVvZiBiP2IuY29uc3RydWN0b3IubmFtZXx8Ik9iamVjdCI6dHlwZW9mIGIpKTtyZXR1cm4gYn1mdW5jdGlvbiBNYShiLGEpe2lmKCJoYXNPd25Qcm9wZXJ0eSI9PT1iKXRocm93IEthKCJiYWRuYW1lIixhKTt9ZnVuY3Rpb24gdmMoYixhLGMpe2lmKCFhKXJldHVybiBiO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZCxlPWIsZj1hLmxlbmd0aCxnPTA7ZzxmO2crKylkPWFbZ10sYiYmKGI9KGU9YilbZF0pO3JldHVybiFjJiZHKGIpP25jKGUsYik6Yn1mdW5jdGlvbiB0YihiKXt2YXIgYT1iWzBdO2I9YltiLmxlbmd0aC0xXTt2YXIgYz1bYV07ZG97YT1hLm5leHRTaWJsaW5nO2lmKCFhKWJyZWFrO2MucHVzaChhKX13aGlsZShhIT09Yik7cmV0dXJuIEIoYyl9ZnVuY3Rpb24gaGEoKXtyZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBPZChiKXtmdW5jdGlvbiBhKGEsYixjKXtyZXR1cm4gYVtiXXx8CisoYVtiXT1jKCkpfXZhciBjPVQoIiRpbmplY3RvciIpLGQ9VCgibmciKTtiPWEoYiwiYW5ndWxhciIsT2JqZWN0KTtiLiQkbWluRXJyPWIuJCRtaW5FcnJ8fFQ7cmV0dXJuIGEoYiwibW9kdWxlIixmdW5jdGlvbigpe3ZhciBiPXt9O3JldHVybiBmdW5jdGlvbihmLGcsaCl7aWYoImhhc093blByb3BlcnR5Ij09PWYpdGhyb3cgZCgiYmFkbmFtZSIsIm1vZHVsZSIpO2cmJmIuaGFzT3duUHJvcGVydHkoZikmJihiW2ZdPW51bGwpO3JldHVybiBhKGIsZixmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYyxkLGUsZil7Znx8KGY9Yik7cmV0dXJuIGZ1bmN0aW9uKCl7ZltlfHwicHVzaCJdKFtjLGQsYXJndW1lbnRzXSk7cmV0dXJuIHV9fWlmKCFnKXRocm93IGMoIm5vbW9kIixmKTt2YXIgYj1bXSxkPVtdLGU9W10scT1hKCIkaW5qZWN0b3IiLCJpbnZva2UiLCJwdXNoIixkKSx1PXtfaW52b2tlUXVldWU6YixfY29uZmlnQmxvY2tzOmQsX3J1bkJsb2NrczplLHJlcXVpcmVzOmcsbmFtZTpmLHByb3ZpZGVyOmEoIiRwcm92aWRlIiwKKyJwcm92aWRlciIpLGZhY3Rvcnk6YSgiJHByb3ZpZGUiLCJmYWN0b3J5Iiksc2VydmljZTphKCIkcHJvdmlkZSIsInNlcnZpY2UiKSx2YWx1ZTphKCIkcHJvdmlkZSIsInZhbHVlIiksY29uc3RhbnQ6YSgiJHByb3ZpZGUiLCJjb25zdGFudCIsInVuc2hpZnQiKSxhbmltYXRpb246YSgiJGFuaW1hdGVQcm92aWRlciIsInJlZ2lzdGVyIiksZmlsdGVyOmEoIiRmaWx0ZXJQcm92aWRlciIsInJlZ2lzdGVyIiksY29udHJvbGxlcjphKCIkY29udHJvbGxlclByb3ZpZGVyIiwicmVnaXN0ZXIiKSxkaXJlY3RpdmU6YSgiJGNvbXBpbGVQcm92aWRlciIsImRpcmVjdGl2ZSIpLGNvbmZpZzpxLHJ1bjpmdW5jdGlvbihhKXtlLnB1c2goYSk7cmV0dXJuIHRoaXN9fTtoJiZxKGgpO3JldHVybiB1fSl9fSl9ZnVuY3Rpb24gUGQoYil7eihiLHtib290c3RyYXA6c2MsY29weTpFYSxleHRlbmQ6eixlcXVhbHM6ZmEsZWxlbWVudDpCLGZvckVhY2g6cyxpbmplY3RvcjpPYixub29wOkMsYmluZDpuYyx0b0pzb246JGEsCitmcm9tSnNvbjpvYyxpZGVudGl0eTpvYSxpc1VuZGVmaW5lZDpELGlzRGVmaW5lZDp5LGlzU3RyaW5nOkYsaXNGdW5jdGlvbjpHLGlzT2JqZWN0OkgsaXNOdW1iZXI6Vixpc0VsZW1lbnQ6bWMsaXNBcnJheTp4LHZlcnNpb246UWQsaXNEYXRlOnBhLGxvd2VyY2FzZTpRLHVwcGVyY2FzZTp1YixjYWxsYmFja3M6e2NvdW50ZXI6MH0sZ2V0VGVzdGFiaWxpdHk6TGQsJCRtaW5FcnI6VCwkJGNzcDphYixyZWxvYWRXaXRoRGVidWdJbmZvOktkfSk7YmI9T2QoTSk7dHJ5e2JiKCJuZ0xvY2FsZSIpfWNhdGNoKGEpe2JiKCJuZ0xvY2FsZSIsW10pLnByb3ZpZGVyKCIkbG9jYWxlIixSZCl9YmIoIm5nIixbIm5nTG9jYWxlIl0sWyIkcHJvdmlkZSIsZnVuY3Rpb24oYSl7YS5wcm92aWRlcih7JCRzYW5pdGl6ZVVyaTpTZH0pO2EucHJvdmlkZXIoIiRjb21waWxlIix3YykuZGlyZWN0aXZlKHthOlRkLGlucHV0OnhjLHRleHRhcmVhOnhjLGZvcm06VWQsc2NyaXB0OlZkLHNlbGVjdDpXZCxzdHlsZTpYZCwKK29wdGlvbjpZZCxuZ0JpbmQ6WmQsbmdCaW5kSHRtbDokZCxuZ0JpbmRUZW1wbGF0ZTphZSxuZ0NsYXNzOmJlLG5nQ2xhc3NFdmVuOmNlLG5nQ2xhc3NPZGQ6ZGUsbmdDbG9hazplZSxuZ0NvbnRyb2xsZXI6ZmUsbmdGb3JtOmdlLG5nSGlkZTpoZSxuZ0lmOmllLG5nSW5jbHVkZTpqZSxuZ0luaXQ6a2UsbmdOb25CaW5kYWJsZTpsZSxuZ1BsdXJhbGl6ZTptZSxuZ1JlcGVhdDpuZSxuZ1Nob3c6b2UsbmdTdHlsZTpwZSxuZ1N3aXRjaDpxZSxuZ1N3aXRjaFdoZW46cmUsbmdTd2l0Y2hEZWZhdWx0OnNlLG5nT3B0aW9uczp0ZSxuZ1RyYW5zY2x1ZGU6dWUsbmdNb2RlbDp2ZSxuZ0xpc3Q6d2UsbmdDaGFuZ2U6eGUscGF0dGVybjp5YyxuZ1BhdHRlcm46eWMscmVxdWlyZWQ6emMsbmdSZXF1aXJlZDp6YyxtaW5sZW5ndGg6QWMsbmdNaW5sZW5ndGg6QWMsbWF4bGVuZ3RoOkJjLG5nTWF4bGVuZ3RoOkJjLG5nVmFsdWU6eWUsbmdNb2RlbE9wdGlvbnM6emV9KS5kaXJlY3RpdmUoe25nSW5jbHVkZTpBZX0pLmRpcmVjdGl2ZSh2YikuZGlyZWN0aXZlKENjKTsKK2EucHJvdmlkZXIoeyRhbmNob3JTY3JvbGw6QmUsJGFuaW1hdGU6Q2UsJGJyb3dzZXI6RGUsJGNhY2hlRmFjdG9yeTpFZSwkY29udHJvbGxlcjpGZSwkZG9jdW1lbnQ6R2UsJGV4Y2VwdGlvbkhhbmRsZXI6SGUsJGZpbHRlcjpEYywkaW50ZXJwb2xhdGU6SWUsJGludGVydmFsOkplLCRodHRwOktlLCRodHRwQmFja2VuZDpMZSwkbG9jYXRpb246TWUsJGxvZzpOZSwkcGFyc2U6T2UsJHJvb3RTY29wZTpQZSwkcTpRZSwkJHE6UmUsJHNjZTpTZSwkc2NlRGVsZWdhdGU6VGUsJHNuaWZmZXI6VWUsJHRlbXBsYXRlQ2FjaGU6VmUsJHRlbXBsYXRlUmVxdWVzdDpXZSwkJHRlc3RhYmlsaXR5OlhlLCR0aW1lb3V0OlllLCR3aW5kb3c6WmUsJCRyQUY6JGUsJCRhc3luY0NhbGxiYWNrOmFmLCQkanFMaXRlOmJmfSl9XSl9ZnVuY3Rpb24gY2IoYil7cmV0dXJuIGIucmVwbGFjZShjZixmdW5jdGlvbihhLGIsZCxlKXtyZXR1cm4gZT9kLnRvVXBwZXJDYXNlKCk6ZH0pLnJlcGxhY2UoZGYsIk1veiQxIil9CitmdW5jdGlvbiBFYyhiKXtiPWIubm9kZVR5cGU7cmV0dXJuIGI9PT1uYXx8IWJ8fDk9PT1ifWZ1bmN0aW9uIEZjKGIsYSl7dmFyIGMsZCxlPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGY9W107aWYoUmIudGVzdChiKSl7Yz1jfHxlLmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgiZGl2IikpO2Q9KGVmLmV4ZWMoYil8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCk7ZD1pYVtkXXx8aWEuX2RlZmF1bHQ7Yy5pbm5lckhUTUw9ZFsxXStiLnJlcGxhY2UoZmYsIjwkMT48LyQyPiIpK2RbMl07Zm9yKGQ9ZFswXTtkLS07KWM9Yy5sYXN0Q2hpbGQ7Zj1ZYShmLGMuY2hpbGROb2Rlcyk7Yz1lLmZpcnN0Q2hpbGQ7Yy50ZXh0Q29udGVudD0iIn1lbHNlIGYucHVzaChhLmNyZWF0ZVRleHROb2RlKGIpKTtlLnRleHRDb250ZW50PSIiO2UuaW5uZXJIVE1MPSIiO3MoZixmdW5jdGlvbihhKXtlLmFwcGVuZENoaWxkKGEpfSk7cmV0dXJuIGV9ZnVuY3Rpb24gUihiKXtpZihiIGluc3RhbmNlb2YKK1IpcmV0dXJuIGI7dmFyIGE7RihiKSYmKGI9VShiKSxhPSEwKTtpZighKHRoaXMgaW5zdGFuY2VvZiBSKSl7aWYoYSYmIjwiIT1iLmNoYXJBdCgwKSl0aHJvdyBTYigibm9zZWwiKTtyZXR1cm4gbmV3IFIoYil9aWYoYSl7YT1ZO3ZhciBjO2I9KGM9Z2YuZXhlYyhiKSk/W2EuY3JlYXRlRWxlbWVudChjWzFdKV06KGM9RmMoYixhKSk/Yy5jaGlsZE5vZGVzOltdfUdjKHRoaXMsYil9ZnVuY3Rpb24gVGIoYil7cmV0dXJuIGIuY2xvbmVOb2RlKCEwKX1mdW5jdGlvbiB3YihiLGEpe2F8fHhiKGIpO2lmKGIucXVlcnlTZWxlY3RvckFsbClmb3IodmFyIGM9Yi5xdWVyeVNlbGVjdG9yQWxsKCIqIiksZD0wLGU9Yy5sZW5ndGg7ZDxlO2QrKyl4YihjW2RdKX1mdW5jdGlvbiBIYyhiLGEsYyxkKXtpZih5KGQpKXRocm93IFNiKCJvZmZhcmdzIik7dmFyIGU9KGQ9eWIoYikpJiZkLmV2ZW50cyxmPWQmJmQuaGFuZGxlO2lmKGYpaWYoYSlzKGEuc3BsaXQoIiAiKSxmdW5jdGlvbihhKXtpZih5KGMpKXt2YXIgZD0KK2VbYV07WGEoZHx8W10sYyk7aWYoZCYmMDxkLmxlbmd0aClyZXR1cm59Yi5yZW1vdmVFdmVudExpc3RlbmVyKGEsZiwhMSk7ZGVsZXRlIGVbYV19KTtlbHNlIGZvcihhIGluIGUpIiRkZXN0cm95IiE9PWEmJmIucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGYsITEpLGRlbGV0ZSBlW2FdfWZ1bmN0aW9uIHhiKGIsYSl7dmFyIGM9Yi5uZzMzOSxkPWMmJnpiW2NdO2QmJihhP2RlbGV0ZSBkLmRhdGFbYV06KGQuaGFuZGxlJiYoZC5ldmVudHMuJGRlc3Ryb3kmJmQuaGFuZGxlKHt9LCIkZGVzdHJveSIpLEhjKGIpKSxkZWxldGUgemJbY10sYi5uZzMzOT10KSl9ZnVuY3Rpb24geWIoYixhKXt2YXIgYz1iLm5nMzM5LGM9YyYmemJbY107YSYmIWMmJihiLm5nMzM5PWM9KytoZixjPXpiW2NdPXtldmVudHM6e30sZGF0YTp7fSxoYW5kbGU6dH0pO3JldHVybiBjfWZ1bmN0aW9uIFViKGIsYSxjKXtpZihFYyhiKSl7dmFyIGQ9eShjKSxlPSFkJiZhJiYhSChhKSxmPSFhO2I9KGI9eWIoYiwhZSkpJiZiLmRhdGE7CitpZihkKWJbYV09YztlbHNle2lmKGYpcmV0dXJuIGI7aWYoZSlyZXR1cm4gYiYmYlthXTt6KGIsYSl9fX1mdW5jdGlvbiBBYihiLGEpe3JldHVybiBiLmdldEF0dHJpYnV0ZT8tMTwoIiAiKyhiLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpKyIgIikucmVwbGFjZSgvW1xuXHRdL2csIiAiKS5pbmRleE9mKCIgIithKyIgIik6ITF9ZnVuY3Rpb24gQmIoYixhKXthJiZiLnNldEF0dHJpYnV0ZSYmcyhhLnNwbGl0KCIgIiksZnVuY3Rpb24oYSl7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIixVKCgiICIrKGIuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiKS5yZXBsYWNlKC9bXG5cdF0vZywiICIpLnJlcGxhY2UoIiAiK1UoYSkrIiAiLCIgIikpKX0pfWZ1bmN0aW9uIENiKGIsYSl7aWYoYSYmYi5zZXRBdHRyaWJ1dGUpe3ZhciBjPSgiICIrKGIuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiKS5yZXBsYWNlKC9bXG5cdF0vZywiICIpO3MoYS5zcGxpdCgiICIpLGZ1bmN0aW9uKGEpe2E9CitVKGEpOy0xPT09Yy5pbmRleE9mKCIgIithKyIgIikmJihjKz1hKyIgIil9KTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLFUoYykpfX1mdW5jdGlvbiBHYyhiLGEpe2lmKGEpaWYoYS5ub2RlVHlwZSliW2IubGVuZ3RoKytdPWE7ZWxzZXt2YXIgYz1hLmxlbmd0aDtpZigibnVtYmVyIj09PXR5cGVvZiBjJiZhLndpbmRvdyE9PWEpe2lmKGMpZm9yKHZhciBkPTA7ZDxjO2QrKyliW2IubGVuZ3RoKytdPWFbZF19ZWxzZSBiW2IubGVuZ3RoKytdPWF9fWZ1bmN0aW9uIEljKGIsYSl7cmV0dXJuIERiKGIsIiQiKyhhfHwibmdDb250cm9sbGVyIikrIkNvbnRyb2xsZXIiKX1mdW5jdGlvbiBEYihiLGEsYyl7OT09Yi5ub2RlVHlwZSYmKGI9Yi5kb2N1bWVudEVsZW1lbnQpO2ZvcihhPXgoYSk/YTpbYV07Yjspe2Zvcih2YXIgZD0wLGU9YS5sZW5ndGg7ZDxlO2QrKylpZigoYz1CLmRhdGEoYixhW2RdKSkhPT10KXJldHVybiBjO2I9Yi5wYXJlbnROb2RlfHwxMT09PWIubm9kZVR5cGUmJmIuaG9zdH19CitmdW5jdGlvbiBKYyhiKXtmb3Iod2IoYiwhMCk7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gS2MoYixhKXthfHx3YihiKTt2YXIgYz1iLnBhcmVudE5vZGU7YyYmYy5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBqZihiLGEpe2E9YXx8TTtpZigiY29tcGxldGUiPT09YS5kb2N1bWVudC5yZWFkeVN0YXRlKWEuc2V0VGltZW91dChiKTtlbHNlIEIoYSkub24oImxvYWQiLGIpfWZ1bmN0aW9uIExjKGIsYSl7dmFyIGM9RWJbYS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gYyYmTWNbdWEoYildJiZjfWZ1bmN0aW9uIGtmKGIsYSl7dmFyIGM9Yi5ub2RlTmFtZTtyZXR1cm4oIklOUFVUIj09PWN8fCJURVhUQVJFQSI9PT1jKSYmTmNbYV19ZnVuY3Rpb24gbGYoYixhKXt2YXIgYz1mdW5jdGlvbihjLGUpe2MuaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIGMuZGVmYXVsdFByZXZlbnRlZH07dmFyIGY9YVtlfHxjLnR5cGVdLGc9Zj9mLmxlbmd0aDoKKzA7aWYoZyl7aWYoRChjLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCkpe3ZhciBoPWMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO2Muc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7Yy5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9ITA7Yy5zdG9wUHJvcGFnYXRpb24mJmMuc3RvcFByb3BhZ2F0aW9uKCk7aCYmaC5jYWxsKGMpfX1jLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuITA9PT1jLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZH07MTxnJiYoZj1xYShmKSk7Zm9yKHZhciBsPTA7bDxnO2wrKyljLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCl8fGZbbF0uY2FsbChiLGMpfX07Yy5lbGVtPWI7cmV0dXJuIGN9ZnVuY3Rpb24gYmYoKXt0aGlzLiRnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4geihSLHtoYXNDbGFzczpmdW5jdGlvbihiLGEpe2IuYXR0ciYmKGI9YlswXSk7cmV0dXJuIEFiKGIsYSl9LGFkZENsYXNzOmZ1bmN0aW9uKGIsCithKXtiLmF0dHImJihiPWJbMF0pO3JldHVybiBDYihiLGEpfSxyZW1vdmVDbGFzczpmdW5jdGlvbihiLGEpe2IuYXR0ciYmKGI9YlswXSk7cmV0dXJuIEJiKGIsYSl9fSl9fWZ1bmN0aW9uIE5hKGIsYSl7dmFyIGM9YiYmYi4kJGhhc2hLZXk7aWYoYylyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIGMmJihjPWIuJCRoYXNoS2V5KCkpLGM7Yz10eXBlb2YgYjtyZXR1cm4gYz0iZnVuY3Rpb24iPT1jfHwib2JqZWN0Ij09YyYmbnVsbCE9PWI/Yi4kJGhhc2hLZXk9YysiOiIrKGF8fEZkKSgpOmMrIjoiK2J9ZnVuY3Rpb24gZGIoYixhKXtpZihhKXt2YXIgYz0wO3RoaXMubmV4dFVpZD1mdW5jdGlvbigpe3JldHVybisrY319cyhiLHRoaXMucHV0LHRoaXMpfWZ1bmN0aW9uIG1mKGIpe3JldHVybihiPWIudG9TdHJpbmcoKS5yZXBsYWNlKE9jLCIiKS5tYXRjaChQYykpPyJmdW5jdGlvbigiKyhiWzFdfHwiIikucmVwbGFjZSgvW1xzXHJcbl0rLywiICIpKyIpIjoiZm4ifWZ1bmN0aW9uIFZiKGIsCithLGMpe3ZhciBkO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYil7aWYoIShkPWIuJGluamVjdCkpe2Q9W107aWYoYi5sZW5ndGgpe2lmKGEpdGhyb3cgRihjKSYmY3x8KGM9Yi5uYW1lfHxtZihiKSksR2EoInN0cmljdGRpIixjKTthPWIudG9TdHJpbmcoKS5yZXBsYWNlKE9jLCIiKTthPWEubWF0Y2goUGMpO3MoYVsxXS5zcGxpdChuZiksZnVuY3Rpb24oYSl7YS5yZXBsYWNlKG9mLGZ1bmN0aW9uKGEsYixjKXtkLnB1c2goYyl9KX0pfWIuJGluamVjdD1kfX1lbHNlIHgoYik/KGE9Yi5sZW5ndGgtMSxzYihiW2FdLCJmbiIpLGQ9Yi5zbGljZSgwLGEpKTpzYihiLCJmbiIsITApO3JldHVybiBkfWZ1bmN0aW9uIE9iKGIsYSl7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtpZihIKGIpKXMoYixrYyhhKSk7ZWxzZSByZXR1cm4gYShiLGMpfX1mdW5jdGlvbiBkKGEsYil7TWEoYSwic2VydmljZSIpO2lmKEcoYil8fHgoYikpYj1xLmluc3RhbnRpYXRlKGIpO2lmKCFiLiRnZXQpdGhyb3cgR2EoInBnZXQiLAorYSk7cmV0dXJuIHBbYSsiUHJvdmlkZXIiXT1ifWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz1yLmludm9rZShiLHRoaXMpO2lmKEQoYykpdGhyb3cgR2EoInVuZGVmIixhKTtyZXR1cm4gY319ZnVuY3Rpb24gZihhLGIsYyl7cmV0dXJuIGQoYSx7JGdldDohMSE9PWM/ZShhLGIpOmJ9KX1mdW5jdGlvbiBnKGEpe3ZhciBiPVtdLGM7cyhhLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGIsYztiPTA7Zm9yKGM9YS5sZW5ndGg7YjxjO2IrKyl7dmFyIGU9YVtiXSxmPXEuZ2V0KGVbMF0pO2ZbZVsxXV0uYXBwbHkoZixlWzJdKX19aWYoIW0uZ2V0KGEpKXttLnB1dChhLCEwKTt0cnl7RihhKT8oYz1iYihhKSxiPWIuY29uY2F0KGcoYy5yZXF1aXJlcykpLmNvbmNhdChjLl9ydW5CbG9ja3MpLGQoYy5faW52b2tlUXVldWUpLGQoYy5fY29uZmlnQmxvY2tzKSk6RyhhKT9iLnB1c2gocS5pbnZva2UoYSkpOngoYSk/Yi5wdXNoKHEuaW52b2tlKGEpKTpzYihhLCJtb2R1bGUiKX1jYXRjaChlKXt0aHJvdyB4KGEpJiYKKyhhPWFbYS5sZW5ndGgtMV0pLGUubWVzc2FnZSYmZS5zdGFjayYmLTE9PWUuc3RhY2suaW5kZXhPZihlLm1lc3NhZ2UpJiYoZT1lLm1lc3NhZ2UrIlxuIitlLnN0YWNrKSxHYSgibW9kdWxlcnIiLGEsZS5zdGFja3x8ZS5tZXNzYWdlfHxlKTt9fX0pO3JldHVybiBifWZ1bmN0aW9uIGgoYixjKXtmdW5jdGlvbiBkKGEsZSl7aWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7aWYoYlthXT09PWwpdGhyb3cgR2EoImNkZXAiLGErIiA8LSAiK2suam9pbigiIDwtICIpKTtyZXR1cm4gYlthXX10cnl7cmV0dXJuIGsudW5zaGlmdChhKSxiW2FdPWwsYlthXT1jKGEsZSl9Y2F0Y2goZil7dGhyb3cgYlthXT09PWwmJmRlbGV0ZSBiW2FdLGY7fWZpbmFsbHl7ay5zaGlmdCgpfX1mdW5jdGlvbiBlKGIsYyxmLGcpeyJzdHJpbmciPT09dHlwZW9mIGYmJihnPWYsZj1udWxsKTt2YXIgaD1bXSxrPVZiKGIsYSxnKSxsLHEscDtxPTA7Zm9yKGw9ay5sZW5ndGg7cTxsO3ErKyl7cD1rW3FdO2lmKCJzdHJpbmciIT09Cit0eXBlb2YgcCl0aHJvdyBHYSgiaXRrbiIscCk7aC5wdXNoKGYmJmYuaGFzT3duUHJvcGVydHkocCk/ZltwXTpkKHAsZykpfXgoYikmJihiPWJbbF0pO3JldHVybiBiLmFwcGx5KGMsaCl9cmV0dXJue2ludm9rZTplLGluc3RhbnRpYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1PYmplY3QuY3JlYXRlKCh4KGEpP2FbYS5sZW5ndGgtMV06YSkucHJvdG90eXBlKTthPWUoYSxkLGIsYyk7cmV0dXJuIEgoYSl8fEcoYSk/YTpkfSxnZXQ6ZCxhbm5vdGF0ZTpWYixoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIHAuaGFzT3duUHJvcGVydHkoYSsiUHJvdmlkZXIiKXx8Yi5oYXNPd25Qcm9wZXJ0eShhKX19fWE9ITA9PT1hO3ZhciBsPXt9LGs9W10sbT1uZXcgZGIoW10sITApLHA9eyRwcm92aWRlOntwcm92aWRlcjpjKGQpLGZhY3Rvcnk6YyhmKSxzZXJ2aWNlOmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gZihhLFsiJGluamVjdG9yIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pbnN0YW50aWF0ZShiKX1dKX0pLAordmFsdWU6YyhmdW5jdGlvbihhLGIpe3JldHVybiBmKGEsZGEoYiksITEpfSksY29uc3RhbnQ6YyhmdW5jdGlvbihhLGIpe01hKGEsImNvbnN0YW50Iik7cFthXT1iO3VbYV09Yn0pLGRlY29yYXRvcjpmdW5jdGlvbihhLGIpe3ZhciBjPXEuZ2V0KGErIlByb3ZpZGVyIiksZD1jLiRnZXQ7Yy4kZ2V0PWZ1bmN0aW9uKCl7dmFyIGE9ci5pbnZva2UoZCxjKTtyZXR1cm4gci5pbnZva2UoYixudWxsLHskZGVsZWdhdGU6YX0pfX19fSxxPXAuJGluamVjdG9yPWgocCxmdW5jdGlvbihhLGIpe2dhLmlzU3RyaW5nKGIpJiZrLnB1c2goYik7dGhyb3cgR2EoInVucHIiLGsuam9pbigiIDwtICIpKTt9KSx1PXt9LHI9dS4kaW5qZWN0b3I9aCh1LGZ1bmN0aW9uKGEsYil7dmFyIGM9cS5nZXQoYSsiUHJvdmlkZXIiLGIpO3JldHVybiByLmludm9rZShjLiRnZXQsYyx0LGEpfSk7cyhnKGIpLGZ1bmN0aW9uKGEpe3IuaW52b2tlKGF8fEMpfSk7cmV0dXJuIHJ9ZnVuY3Rpb24gQmUoKXt2YXIgYj0hMDt0aGlzLmRpc2FibGVBdXRvU2Nyb2xsaW5nPQorZnVuY3Rpb24oKXtiPSExfTt0aGlzLiRnZXQ9WyIkd2luZG93IiwiJGxvY2F0aW9uIiwiJHJvb3RTY29wZSIsZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9bnVsbDtBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKGEsZnVuY3Rpb24oYSl7aWYoImEiPT09dWEoYSkpcmV0dXJuIGI9YSwhMH0pO3JldHVybiBifWZ1bmN0aW9uIGYoYil7aWYoYil7Yi5zY3JvbGxJbnRvVmlldygpO3ZhciBjO2M9Zy55T2Zmc2V0O0coYyk/Yz1jKCk6bWMoYyk/KGM9Y1swXSxjPSJmaXhlZCIhPT1hLmdldENvbXB1dGVkU3R5bGUoYykucG9zaXRpb24/MDpjLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSk6VihjKXx8KGM9MCk7YyYmKGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AsYS5zY3JvbGxCeSgwLGItYykpfWVsc2UgYS5zY3JvbGxUbygwLDApfWZ1bmN0aW9uIGcoKXt2YXIgYT1jLmhhc2goKSxiO2E/KGI9aC5nZXRFbGVtZW50QnlJZChhKSk/ZihiKTooYj1lKGguZ2V0RWxlbWVudHNCeU5hbWUoYSkpKT8KK2YoYik6InRvcCI9PT1hJiZmKG51bGwpOmYobnVsbCl9dmFyIGg9YS5kb2N1bWVudDtiJiZkLiR3YXRjaChmdW5jdGlvbigpe3JldHVybiBjLmhhc2goKX0sZnVuY3Rpb24oYSxiKXthPT09YiYmIiI9PT1hfHxqZihmdW5jdGlvbigpe2QuJGV2YWxBc3luYyhnKX0pfSk7cmV0dXJuIGd9XX1mdW5jdGlvbiBhZigpe3RoaXMuJGdldD1bIiQkckFGIiwiJHRpbWVvdXQiLGZ1bmN0aW9uKGIsYSl7cmV0dXJuIGIuc3VwcG9ydGVkP2Z1bmN0aW9uKGEpe3JldHVybiBiKGEpfTpmdW5jdGlvbihiKXtyZXR1cm4gYShiLDAsITEpfX1dfWZ1bmN0aW9uIHBmKGIsYSxjLGQpe2Z1bmN0aW9uIGUoYSl7dHJ5e2EuYXBwbHkobnVsbCxaYS5jYWxsKGFyZ3VtZW50cywxKSl9ZmluYWxseXtpZih2LS0sMD09PXYpZm9yKDt3Lmxlbmd0aDspdHJ5e3cucG9wKCkoKX1jYXRjaChiKXtjLmVycm9yKGIpfX19ZnVuY3Rpb24gZihhLGIpeyhmdW5jdGlvbiBOKCl7cyhMLGZ1bmN0aW9uKGEpe2EoKX0pO0o9YihOLAorYSl9KSgpfWZ1bmN0aW9uIGcoKXtoKCk7bCgpfWZ1bmN0aW9uIGgoKXtBPWIuaGlzdG9yeS5zdGF0ZTtBPUQoQSk/bnVsbDpBO2ZhKEEsSSkmJihBPUkpO0k9QX1mdW5jdGlvbiBsKCl7aWYoRSE9PW0udXJsKCl8fFAhPT1BKUU9bS51cmwoKSxQPUEscyhXLGZ1bmN0aW9uKGEpe2EobS51cmwoKSxBKX0pfWZ1bmN0aW9uIGsoYSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYSl9Y2F0Y2goYil7cmV0dXJuIGF9fXZhciBtPXRoaXMscD1hWzBdLHE9Yi5sb2NhdGlvbix1PWIuaGlzdG9yeSxyPWIuc2V0VGltZW91dCxPPWIuY2xlYXJUaW1lb3V0LG49e307bS5pc01vY2s9ITE7dmFyIHY9MCx3PVtdO20uJCRjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdD1lO20uJCRpbmNPdXRzdGFuZGluZ1JlcXVlc3RDb3VudD1mdW5jdGlvbigpe3YrK307bS5ub3RpZnlXaGVuTm9PdXRzdGFuZGluZ1JlcXVlc3RzPWZ1bmN0aW9uKGEpe3MoTCxmdW5jdGlvbihhKXthKCl9KTswPT09dj9hKCk6Cit3LnB1c2goYSl9O3ZhciBMPVtdLEo7bS5hZGRQb2xsRm49ZnVuY3Rpb24oYSl7RChKKSYmZigxMDAscik7TC5wdXNoKGEpO3JldHVybiBhfTt2YXIgQSxQLEU9cS5ocmVmLFM9YS5maW5kKCJiYXNlIiksWD1udWxsO2goKTtQPUE7bS51cmw9ZnVuY3Rpb24oYSxjLGUpe0QoZSkmJihlPW51bGwpO3EhPT1iLmxvY2F0aW9uJiYocT1iLmxvY2F0aW9uKTt1IT09Yi5oaXN0b3J5JiYodT1iLmhpc3RvcnkpO2lmKGEpe3ZhciBmPVA9PT1lO2lmKEU9PT1hJiYoIWQuaGlzdG9yeXx8ZikpcmV0dXJuIG07dmFyIGc9RSYmSGEoRSk9PT1IYShhKTtFPWE7UD1lOyFkLmhpc3Rvcnl8fGcmJmY/KGd8fChYPWEpLGM/cS5yZXBsYWNlKGEpOmc/KGM9cSxlPWEuaW5kZXhPZigiIyIpLGE9LTE9PT1lPyIiOmEuc3Vic3RyKGUrMSksYy5oYXNoPWEpOnEuaHJlZj1hKToodVtjPyJyZXBsYWNlU3RhdGUiOiJwdXNoU3RhdGUiXShlLCIiLGEpLGgoKSxQPUEpO3JldHVybiBtfXJldHVybiBYfHxxLmhyZWYucmVwbGFjZSgvJTI3L2csCisiJyIpfTttLnN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIEF9O3ZhciBXPVtdLHdhPSExLEk9bnVsbDttLm9uVXJsQ2hhbmdlPWZ1bmN0aW9uKGEpe2lmKCF3YSl7aWYoZC5oaXN0b3J5KUIoYikub24oInBvcHN0YXRlIixnKTtCKGIpLm9uKCJoYXNoY2hhbmdlIixnKTt3YT0hMH1XLnB1c2goYSk7cmV0dXJuIGF9O20uJCRjaGVja1VybENoYW5nZT1sO20uYmFzZUhyZWY9ZnVuY3Rpb24oKXt2YXIgYT1TLmF0dHIoImhyZWYiKTtyZXR1cm4gYT9hLnJlcGxhY2UoL14oaHR0cHM/XDopP1wvXC9bXlwvXSovLCIiKToiIn07dmFyIGVhPXt9LHk9IiIsY2E9bS5iYXNlSHJlZigpO20uY29va2llcz1mdW5jdGlvbihhLGIpe3ZhciBkLGUsZixnO2lmKGEpYj09PXQ/cC5jb29raWU9ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9O3BhdGg9IitjYSsiO2V4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQiOkYoYikmJihkPShwLmNvb2tpZT1lbmNvZGVVUklDb21wb25lbnQoYSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiKSsKKyI7cGF0aD0iK2NhKS5sZW5ndGgrMSw0MDk2PGQmJmMud2FybigiQ29va2llICciK2ErIicgcG9zc2libHkgbm90IHNldCBvciBvdmVyZmxvd2VkIGJlY2F1c2UgaXQgd2FzIHRvbyBsYXJnZSAoIitkKyIgPiA0MDk2IGJ5dGVzKSEiKSk7ZWxzZXtpZihwLmNvb2tpZSE9PXkpZm9yKHk9cC5jb29raWUsZD15LnNwbGl0KCI7ICIpLGVhPXt9LGY9MDtmPGQubGVuZ3RoO2YrKyllPWRbZl0sZz1lLmluZGV4T2YoIj0iKSwwPGcmJihhPWsoZS5zdWJzdHJpbmcoMCxnKSksZWFbYV09PT10JiYoZWFbYV09ayhlLnN1YnN0cmluZyhnKzEpKSkpO3JldHVybiBlYX19O20uZGVmZXI9ZnVuY3Rpb24oYSxiKXt2YXIgYzt2Kys7Yz1yKGZ1bmN0aW9uKCl7ZGVsZXRlIG5bY107ZShhKX0sYnx8MCk7bltjXT0hMDtyZXR1cm4gY307bS5kZWZlci5jYW5jZWw9ZnVuY3Rpb24oYSl7cmV0dXJuIG5bYV0/KGRlbGV0ZSBuW2FdLE8oYSksZShDKSwhMCk6ITF9fWZ1bmN0aW9uIERlKCl7dGhpcy4kZ2V0PVsiJHdpbmRvdyIsCisiJGxvZyIsIiRzbmlmZmVyIiwiJGRvY3VtZW50IixmdW5jdGlvbihiLGEsYyxkKXtyZXR1cm4gbmV3IHBmKGIsZCxhLGMpfV19ZnVuY3Rpb24gRWUoKXt0aGlzLiRnZXQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsZCl7ZnVuY3Rpb24gZShhKXthIT1wJiYocT9xPT1hJiYocT1hLm4pOnE9YSxmKGEubixhLnApLGYoYSxwKSxwPWEscC5uPW51bGwpfWZ1bmN0aW9uIGYoYSxiKXthIT1iJiYoYSYmKGEucD1iKSxiJiYoYi5uPWEpKX1pZihiIGluIGEpdGhyb3cgVCgiJGNhY2hlRmFjdG9yeSIpKCJpaWQiLGIpO3ZhciBnPTAsaD16KHt9LGQse2lkOmJ9KSxsPXt9LGs9ZCYmZC5jYXBhY2l0eXx8TnVtYmVyLk1BWF9WQUxVRSxtPXt9LHA9bnVsbCxxPW51bGw7cmV0dXJuIGFbYl09e3B1dDpmdW5jdGlvbihhLGIpe2lmKGs8TnVtYmVyLk1BWF9WQUxVRSl7dmFyIGM9bVthXXx8KG1bYV09e2tleTphfSk7ZShjKX1pZighRChiKSlyZXR1cm4gYSBpbiBsfHxnKyssbFthXT1iLGc+ayYmdGhpcy5yZW1vdmUocS5rZXkpLAorYn0sZ2V0OmZ1bmN0aW9uKGEpe2lmKGs8TnVtYmVyLk1BWF9WQUxVRSl7dmFyIGI9bVthXTtpZighYilyZXR1cm47ZShiKX1yZXR1cm4gbFthXX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2lmKGs8TnVtYmVyLk1BWF9WQUxVRSl7dmFyIGI9bVthXTtpZighYilyZXR1cm47Yj09cCYmKHA9Yi5wKTtiPT1xJiYocT1iLm4pO2YoYi5uLGIucCk7ZGVsZXRlIG1bYV19ZGVsZXRlIGxbYV07Zy0tfSxyZW1vdmVBbGw6ZnVuY3Rpb24oKXtsPXt9O2c9MDttPXt9O3A9cT1udWxsfSxkZXN0cm95OmZ1bmN0aW9uKCl7bT1oPWw9bnVsbDtkZWxldGUgYVtiXX0saW5mbzpmdW5jdGlvbigpe3JldHVybiB6KHt9LGgse3NpemU6Z30pfX19dmFyIGE9e307Yi5pbmZvPWZ1bmN0aW9uKCl7dmFyIGI9e307cyhhLGZ1bmN0aW9uKGEsZSl7YltlXT1hLmluZm8oKX0pO3JldHVybiBifTtiLmdldD1mdW5jdGlvbihiKXtyZXR1cm4gYVtiXX07cmV0dXJuIGJ9fWZ1bmN0aW9uIFZlKCl7dGhpcy4kZ2V0PVsiJGNhY2hlRmFjdG9yeSIsCitmdW5jdGlvbihiKXtyZXR1cm4gYigidGVtcGxhdGVzIil9XX1mdW5jdGlvbiB3YyhiLGEpe2Z1bmN0aW9uIGMoYSxiKXt2YXIgYz0vXlxzKihbQCZdfD0oXCo/KSkoXD8/KVxzKihcdyopXHMqJC8sZD17fTtzKGEsZnVuY3Rpb24oYSxlKXt2YXIgZj1hLm1hdGNoKGMpO2lmKCFmKXRocm93IGphKCJpc2NwIixiLGUsYSk7ZFtlXT17bW9kZTpmWzFdWzBdLGNvbGxlY3Rpb246IioiPT09ZlsyXSxvcHRpb25hbDoiPyI9PT1mWzNdLGF0dHJOYW1lOmZbNF18fGV9fSk7cmV0dXJuIGR9dmFyIGQ9e30sZT0vXlxzKmRpcmVjdGl2ZVw6XHMqKFtcd1wtXSspXHMrKC4qKSQvLGY9LygoW1x3XC1dKykoPzpcOihbXjtdKykpPzs/KS8sZz1HZCgibmdTcmMsbmdTcmNzZXQsc3JjLHNyY3NldCIpLGg9L14oPzooXF5cXj8pPyhcPyk/KFxeXF4/KT8pPy8sbD0vXihvblthLXpdK3xmb3JtYWN0aW9uKSQvO3RoaXMuZGlyZWN0aXZlPWZ1bmN0aW9uIHAoYSxlKXtNYShhLCJkaXJlY3RpdmUiKTtGKGEpPyhRYihlLAorImRpcmVjdGl2ZUZhY3RvcnkiKSxkLmhhc093blByb3BlcnR5KGEpfHwoZFthXT1bXSxiLmZhY3RvcnkoYSsiRGlyZWN0aXZlIixbIiRpbmplY3RvciIsIiRleGNlcHRpb25IYW5kbGVyIixmdW5jdGlvbihiLGUpe3ZhciBmPVtdO3MoZFthXSxmdW5jdGlvbihkLGcpe3RyeXt2YXIgaD1iLmludm9rZShkKTtHKGgpP2g9e2NvbXBpbGU6ZGEoaCl9OiFoLmNvbXBpbGUmJmgubGluayYmKGguY29tcGlsZT1kYShoLmxpbmspKTtoLnByaW9yaXR5PWgucHJpb3JpdHl8fDA7aC5pbmRleD1nO2gubmFtZT1oLm5hbWV8fGE7aC5yZXF1aXJlPWgucmVxdWlyZXx8aC5jb250cm9sbGVyJiZoLm5hbWU7aC5yZXN0cmljdD1oLnJlc3RyaWN0fHwiRUEiO0goaC5zY29wZSkmJihoLiQkaXNvbGF0ZUJpbmRpbmdzPWMoaC5zY29wZSxoLm5hbWUpKTtmLnB1c2goaCl9Y2F0Y2gobCl7ZShsKX19KTtyZXR1cm4gZn1dKSksZFthXS5wdXNoKGUpKTpzKGEsa2MocCkpO3JldHVybiB0aGlzfTt0aGlzLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0PQorZnVuY3Rpb24oYil7cmV0dXJuIHkoYik/KGEuYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QoYiksdGhpcyk6YS5hSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdCgpfTt0aGlzLmltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdD1mdW5jdGlvbihiKXtyZXR1cm4geShiKT8oYS5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QoYiksdGhpcyk6YS5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QoKX07dmFyIGs9ITA7dGhpcy5kZWJ1Z0luZm9FbmFibGVkPWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPyhrPWEsdGhpcyk6a307dGhpcy4kZ2V0PVsiJGluamVjdG9yIiwiJGludGVycG9sYXRlIiwiJGV4Y2VwdGlvbkhhbmRsZXIiLCIkdGVtcGxhdGVSZXF1ZXN0IiwiJHBhcnNlIiwiJGNvbnRyb2xsZXIiLCIkcm9vdFNjb3BlIiwiJGRvY3VtZW50IiwiJHNjZSIsIiRhbmltYXRlIiwiJCRzYW5pdGl6ZVVyaSIsZnVuY3Rpb24oYSxiLGMscixPLG4sdix3LEwsSixBKXtmdW5jdGlvbiBQKGEsYil7dHJ5e2EuYWRkQ2xhc3MoYil9Y2F0Y2goYyl7fX0KK2Z1bmN0aW9uIEUoYSxiLGMsZCxlKXthIGluc3RhbmNlb2YgQnx8KGE9QihhKSk7cyhhLGZ1bmN0aW9uKGIsYyl7Yi5ub2RlVHlwZT09cGImJmIubm9kZVZhbHVlLm1hdGNoKC9cUysvKSYmKGFbY109QihiKS53cmFwKCI8c3Bhbj48L3NwYW4+IikucGFyZW50KClbMF0pfSk7dmFyIGY9UyhhLGIsYSxjLGQsZSk7RS4kJGFkZFNjb3BlQ2xhc3MoYSk7dmFyIGc9bnVsbDtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe1FiKGIsInNjb3BlIik7ZD1kfHx7fTt2YXIgZT1kLnBhcmVudEJvdW5kVHJhbnNjbHVkZUZuLGg9ZC50cmFuc2NsdWRlQ29udHJvbGxlcnM7ZD1kLmZ1dHVyZVBhcmVudEVsZW1lbnQ7ZSYmZS4kJGJvdW5kVHJhbnNjbHVkZSYmKGU9ZS4kJGJvdW5kVHJhbnNjbHVkZSk7Z3x8KGc9KGQ9ZCYmZFswXSk/ImZvcmVpZ25vYmplY3QiIT09dWEoZCkmJmQudG9TdHJpbmcoKS5tYXRjaCgvU1ZHLyk/InN2ZyI6Imh0bWwiOiJodG1sIik7ZD0iaHRtbCIhPT1nP0IoV2IoZyxCKCI8ZGl2PiIpLmFwcGVuZChhKS5odG1sKCkpKToKK2M/TGEuY2xvbmUuY2FsbChhKTphO2lmKGgpZm9yKHZhciBsIGluIGgpZC5kYXRhKCIkIitsKyJDb250cm9sbGVyIixoW2xdLmluc3RhbmNlKTtFLiQkYWRkU2NvcGVJbmZvKGQsYik7YyYmYyhkLGIpO2YmJmYoYixkLGQsZSk7cmV0dXJuIGR9fWZ1bmN0aW9uIFMoYSxiLGMsZCxlLGYpe2Z1bmN0aW9uIGcoYSxjLGQsZSl7dmFyIGYsbCxrLHEscCxuLHc7aWYocilmb3Iodz1BcnJheShjLmxlbmd0aCkscT0wO3E8aC5sZW5ndGg7cSs9MylmPWhbcV0sd1tmXT1jW2ZdO2Vsc2Ugdz1jO3E9MDtmb3IocD1oLmxlbmd0aDtxPHA7KWw9d1toW3ErK11dLGM9aFtxKytdLGY9aFtxKytdLGM/KGMuc2NvcGU/KGs9YS4kbmV3KCksRS4kJGFkZFNjb3BlSW5mbyhCKGwpLGspKTprPWEsbj1jLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50P1goYSxjLnRyYW5zY2x1ZGUsZSxjLmVsZW1lbnRUcmFuc2NsdWRlT25UaGlzRWxlbWVudCk6IWMudGVtcGxhdGVPblRoaXNFbGVtZW50JiZlP2U6IWUmJmI/WChhLAorYik6bnVsbCxjKGYsayxsLGQsbikpOmYmJmYoYSxsLmNoaWxkTm9kZXMsdCxlKX1mb3IodmFyIGg9W10sbCxrLHEscCxyLG49MDtuPGEubGVuZ3RoO24rKyl7bD1uZXcgWGI7az1XKGFbbl0sW10sbCwwPT09bj9kOnQsZSk7KGY9ay5sZW5ndGg/ZWEoayxhW25dLGwsYixjLG51bGwsW10sW10sZik6bnVsbCkmJmYuc2NvcGUmJkUuJCRhZGRTY29wZUNsYXNzKGwuJCRlbGVtZW50KTtsPWYmJmYudGVybWluYWx8fCEocT1hW25dLmNoaWxkTm9kZXMpfHwhcS5sZW5ndGg/bnVsbDpTKHEsZj8oZi50cmFuc2NsdWRlT25UaGlzRWxlbWVudHx8IWYudGVtcGxhdGVPblRoaXNFbGVtZW50KSYmZi50cmFuc2NsdWRlOmIpO2lmKGZ8fGwpaC5wdXNoKG4sZixsKSxwPSEwLHI9cnx8ZjtmPW51bGx9cmV0dXJuIHA/ZzpudWxsfWZ1bmN0aW9uIFgoYSxiLGMsZCl7cmV0dXJuIGZ1bmN0aW9uKGQsZSxmLGcsaCl7ZHx8KGQ9YS4kbmV3KCExLGgpLGQuJCR0cmFuc2NsdWRlZD0hMCk7cmV0dXJuIGIoZCxlLAore3BhcmVudEJvdW5kVHJhbnNjbHVkZUZuOmMsdHJhbnNjbHVkZUNvbnRyb2xsZXJzOmYsZnV0dXJlUGFyZW50RWxlbWVudDpnfSl9fWZ1bmN0aW9uIFcoYSxiLGMsZCxnKXt2YXIgaD1jLiRhdHRyLGw7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgbmE6Y2EoYix5YSh1YShhKSksIkUiLGQsZyk7Zm9yKHZhciBrLHEscCxyPWEuYXR0cmlidXRlcyxuPTAsdz1yJiZyLmxlbmd0aDtuPHc7bisrKXt2YXIgTz0hMSxMPSExO2s9cltuXTtsPWsubmFtZTtxPVUoay52YWx1ZSk7az15YShsKTtpZihwPWZiLnRlc3QoaykpbD1sLnJlcGxhY2UoUmMsIiIpLnN1YnN0cig4KS5yZXBsYWNlKC9fKC4pL2csZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfSk7dmFyIHU9ay5yZXBsYWNlKC8oU3RhcnR8RW5kKSQvLCIiKTtEKHUpJiZrPT09dSsiU3RhcnQiJiYoTz1sLEw9bC5zdWJzdHIoMCxsLmxlbmd0aC01KSsiZW5kIixsPWwuc3Vic3RyKDAsbC5sZW5ndGgtNikpO2s9eWEobC50b0xvd2VyQ2FzZSgpKTsKK2hba109bDtpZihwfHwhYy5oYXNPd25Qcm9wZXJ0eShrKSljW2tdPXEsTGMoYSxrKSYmKGNba109ITApO1BhKGEsYixxLGsscCk7Y2EoYixrLCJBIixkLGcsTyxMKX1hPWEuY2xhc3NOYW1lO2lmKEYoYSkmJiIiIT09YSlmb3IoO2w9Zi5leGVjKGEpOylrPXlhKGxbMl0pLGNhKGIsaywiQyIsZCxnKSYmKGNba109VShsWzNdKSksYT1hLnN1YnN0cihsLmluZGV4K2xbMF0ubGVuZ3RoKTticmVhaztjYXNlIHBiOk0oYixhLm5vZGVWYWx1ZSk7YnJlYWs7Y2FzZSA4OnRyeXtpZihsPWUuZXhlYyhhLm5vZGVWYWx1ZSkpaz15YShsWzFdKSxjYShiLGssIk0iLGQsZykmJihjW2tdPVUobFsyXSkpfWNhdGNoKHYpe319Yi5zb3J0KE4pO3JldHVybiBifWZ1bmN0aW9uIHdhKGEsYixjKXt2YXIgZD1bXSxlPTA7aWYoYiYmYS5oYXNBdHRyaWJ1dGUmJmEuaGFzQXR0cmlidXRlKGIpKXtkb3tpZighYSl0aHJvdyBqYSgidXRlcmRpciIsYixjKTthLm5vZGVUeXBlPT1uYSYmKGEuaGFzQXR0cmlidXRlKGIpJiYKK2UrKyxhLmhhc0F0dHJpYnV0ZShjKSYmZS0tKTtkLnB1c2goYSk7YT1hLm5leHRTaWJsaW5nfXdoaWxlKDA8ZSl9ZWxzZSBkLnB1c2goYSk7cmV0dXJuIEIoZCl9ZnVuY3Rpb24gSShhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQsZSxmLGcsaCl7ZT13YShlWzBdLGIsYyk7cmV0dXJuIGEoZCxlLGYsZyxoKX19ZnVuY3Rpb24gZWEoYSxkLGUsZixnLGwsayxwLHIpe2Z1bmN0aW9uIHcoYSxiLGMsZCl7aWYoYSl7YyYmKGE9SShhLGMsZCkpO2EucmVxdWlyZT1LLnJlcXVpcmU7YS5kaXJlY3RpdmVOYW1lPXo7aWYoUz09PUt8fEsuJCRpc29sYXRlU2NvcGUpYT1aKGEse2lzb2xhdGVTY29wZTohMH0pO2sucHVzaChhKX1pZihiKXtjJiYoYj1JKGIsYyxkKSk7Yi5yZXF1aXJlPUsucmVxdWlyZTtiLmRpcmVjdGl2ZU5hbWU9ejtpZihTPT09S3x8Sy4kJGlzb2xhdGVTY29wZSliPVooYix7aXNvbGF0ZVNjb3BlOiEwfSk7cC5wdXNoKGIpfX1mdW5jdGlvbiBMKGEsYixjLGQpe3ZhciBlLGY9ImRhdGEiLAorZz0hMSxsPWMsaztpZihGKGIpKXtrPWIubWF0Y2goaCk7Yj1iLnN1YnN0cmluZyhrWzBdLmxlbmd0aCk7a1szXSYmKGtbMV0/a1szXT1udWxsOmtbMV09a1szXSk7Il4iPT09a1sxXT9mPSJpbmhlcml0ZWREYXRhIjoiXl4iPT09a1sxXSYmKGY9ImluaGVyaXRlZERhdGEiLGw9Yy5wYXJlbnQoKSk7Ij8iPT09a1syXSYmKGc9ITApO2U9bnVsbDtkJiYiZGF0YSI9PT1mJiYoZT1kW2JdKSYmKGU9ZS5pbnN0YW5jZSk7ZT1lfHxsW2ZdKCIkIitiKyJDb250cm9sbGVyIik7aWYoIWUmJiFnKXRocm93IGphKCJjdHJlcSIsYixhKTtyZXR1cm4gZXx8bnVsbH14KGIpJiYoZT1bXSxzKGIsZnVuY3Rpb24oYil7ZS5wdXNoKEwoYSxiLGMsZCkpfSkpO3JldHVybiBlfWZ1bmN0aW9uIHYoYSxjLGYsZyxoKXtmdW5jdGlvbiBsKGEsYixjKXt2YXIgZDtWYShhKXx8KGM9YixiPWEsYT10KTtDJiYoZD1QKTtjfHwoYz1DP1cucGFyZW50KCk6Vyk7cmV0dXJuIGgoYSxiLGQsYyx3YSl9dmFyIHIsdyx1LEEsCitQLGViLFcsSTtkPT09Zj8oST1lLFc9ZS4kJGVsZW1lbnQpOihXPUIoZiksST1uZXcgWGIoVyxlKSk7UyYmKEE9Yy4kbmV3KCEwKSk7aCYmKGViPWwsZWIuJCRib3VuZFRyYW5zY2x1ZGU9aCk7SiYmKFg9e30sUD17fSxzKEosZnVuY3Rpb24oYSl7dmFyIGI9eyRzY29wZTphPT09U3x8YS4kJGlzb2xhdGVTY29wZT9BOmMsJGVsZW1lbnQ6VywkYXR0cnM6SSwkdHJhbnNjbHVkZTplYn07dT1hLmNvbnRyb2xsZXI7IkAiPT11JiYodT1JW2EubmFtZV0pO2I9bih1LGIsITAsYS5jb250cm9sbGVyQXMpO1BbYS5uYW1lXT1iO0N8fFcuZGF0YSgiJCIrYS5uYW1lKyJDb250cm9sbGVyIixiLmluc3RhbmNlKTtYW2EubmFtZV09Yn0pKTtpZihTKXtFLiQkYWRkU2NvcGVJbmZvKFcsQSwhMCwhKGthJiYoa2E9PT1TfHxrYT09PVMuJCRvcmlnaW5hbERpcmVjdGl2ZSkpKTtFLiQkYWRkU2NvcGVDbGFzcyhXLCEwKTtnPVgmJlhbUy5uYW1lXTt2YXIgeGE9QTtnJiZnLmlkZW50aWZpZXImJiEwPT09Uy5iaW5kVG9Db250cm9sbGVyJiYKKyh4YT1nLmluc3RhbmNlKTtzKEEuJCRpc29sYXRlQmluZGluZ3M9Uy4kJGlzb2xhdGVCaW5kaW5ncyxmdW5jdGlvbihhLGQpe3ZhciBlPWEuYXR0ck5hbWUsZj1hLm9wdGlvbmFsLGcsaCxsLGs7c3dpdGNoKGEubW9kZSl7Y2FzZSAiQCI6SS4kb2JzZXJ2ZShlLGZ1bmN0aW9uKGEpe3hhW2RdPWF9KTtJLiQkb2JzZXJ2ZXJzW2VdLiQkc2NvcGU9YztJW2VdJiYoeGFbZF09YihJW2VdKShjKSk7YnJlYWs7Y2FzZSAiPSI6aWYoZiYmIUlbZV0pYnJlYWs7aD1PKElbZV0pO2s9aC5saXRlcmFsP2ZhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1ifHxhIT09YSYmYiE9PWJ9O2w9aC5hc3NpZ258fGZ1bmN0aW9uKCl7Zz14YVtkXT1oKGMpO3Rocm93IGphKCJub25hc3NpZ24iLElbZV0sUy5uYW1lKTt9O2c9eGFbZF09aChjKTtmPWZ1bmN0aW9uKGEpe2soYSx4YVtkXSl8fChrKGEsZyk/bChjLGE9eGFbZF0pOnhhW2RdPWEpO3JldHVybiBnPWF9O2YuJHN0YXRlZnVsPSEwO2Y9YS5jb2xsZWN0aW9uPworYy4kd2F0Y2hDb2xsZWN0aW9uKElbZV0sZik6Yy4kd2F0Y2goTyhJW2VdLGYpLG51bGwsaC5saXRlcmFsKTtBLiRvbigiJGRlc3Ryb3kiLGYpO2JyZWFrO2Nhc2UgIiYiOmg9TyhJW2VdKSx4YVtkXT1mdW5jdGlvbihhKXtyZXR1cm4gaChjLGEpfX19KX1YJiYocyhYLGZ1bmN0aW9uKGEpe2EoKX0pLFg9bnVsbCk7Zz0wO2ZvcihyPWsubGVuZ3RoO2c8cjtnKyspdz1rW2ddLCQodyx3Lmlzb2xhdGVTY29wZT9BOmMsVyxJLHcucmVxdWlyZSYmTCh3LmRpcmVjdGl2ZU5hbWUsdy5yZXF1aXJlLFcsUCksZWIpO3ZhciB3YT1jO1MmJihTLnRlbXBsYXRlfHxudWxsPT09Uy50ZW1wbGF0ZVVybCkmJih3YT1BKTthJiZhKHdhLGYuY2hpbGROb2Rlcyx0LGgpO2ZvcihnPXAubGVuZ3RoLTE7MDw9ZztnLS0pdz1wW2ddLCQodyx3Lmlzb2xhdGVTY29wZT9BOmMsVyxJLHcucmVxdWlyZSYmTCh3LmRpcmVjdGl2ZU5hbWUsdy5yZXF1aXJlLFcsUCksZWIpfXI9cnx8e307Zm9yKHZhciBBPS1OdW1iZXIuTUFYX1ZBTFVFLAorUCxKPXIuY29udHJvbGxlckRpcmVjdGl2ZXMsWCxTPXIubmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLGthPXIudGVtcGxhdGVEaXJlY3RpdmUsZWE9ci5ub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlLGNhPSExLEQ9ITEsQz1yLmhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlLGFhPWUuJCRlbGVtZW50PUIoZCksSyx6LE4sQWE9ZixRLE09MCxSPWEubGVuZ3RoO008UjtNKyspe0s9YVtNXTt2YXIgUGE9Sy4kJHN0YXJ0LGZiPUsuJCRlbmQ7UGEmJihhYT13YShkLFBhLGZiKSk7Tj10O2lmKEE+Sy5wcmlvcml0eSlicmVhaztpZihOPUsuc2NvcGUpSy50ZW1wbGF0ZVVybHx8KEgoTik/KE9hKCJuZXcvaXNvbGF0ZWQgc2NvcGUiLFN8fFAsSyxhYSksUz1LKTpPYSgibmV3L2lzb2xhdGVkIHNjb3BlIixTLEssYWEpKSxQPVB8fEs7ej1LLm5hbWU7IUsudGVtcGxhdGVVcmwmJksuY29udHJvbGxlciYmKE49Sy5jb250cm9sbGVyLEo9Snx8e30sT2EoIiciK3orIicgY29udHJvbGxlciIsSlt6XSwKK0ssYWEpLEpbel09Syk7aWYoTj1LLnRyYW5zY2x1ZGUpY2E9ITAsSy4kJHRsYnx8KE9hKCJ0cmFuc2NsdXNpb24iLGVhLEssYWEpLGVhPUspLCJlbGVtZW50Ij09Tj8oQz0hMCxBPUsucHJpb3JpdHksTj1hYSxhYT1lLiQkZWxlbWVudD1CKFkuY3JlYXRlQ29tbWVudCgiICIreisiOiAiK2Vbel0rIiAiKSksZD1hYVswXSxWKGcsWmEuY2FsbChOLDApLGQpLEFhPUUoTixmLEEsbCYmbC5uYW1lLHtub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlOmVhfSkpOihOPUIoVGIoZCkpLmNvbnRlbnRzKCksYWEuZW1wdHkoKSxBYT1FKE4sZikpO2lmKEsudGVtcGxhdGUpaWYoRD0hMCxPYSgidGVtcGxhdGUiLGthLEssYWEpLGthPUssTj1HKEsudGVtcGxhdGUpP0sudGVtcGxhdGUoYWEsZSk6Sy50ZW1wbGF0ZSxOPVNjKE4pLEsucmVwbGFjZSl7bD1LO049UmIudGVzdChOKT9UYyhXYihLLnRlbXBsYXRlTmFtZXNwYWNlLFUoTikpKTpbXTtkPU5bMF07aWYoMSE9Ti5sZW5ndGh8fGQubm9kZVR5cGUhPT0KK25hKXRocm93IGphKCJ0cGxydCIseiwiIik7VihnLGFhLGQpO1I9eyRhdHRyOnt9fTtOPVcoZCxbXSxSKTt2YXIgYmE9YS5zcGxpY2UoTSsxLGEubGVuZ3RoLShNKzEpKTtTJiZ5KE4pO2E9YS5jb25jYXQoTikuY29uY2F0KGJhKTtRYyhlLFIpO1I9YS5sZW5ndGh9ZWxzZSBhYS5odG1sKE4pO2lmKEsudGVtcGxhdGVVcmwpRD0hMCxPYSgidGVtcGxhdGUiLGthLEssYWEpLGthPUssSy5yZXBsYWNlJiYobD1LKSx2PVQoYS5zcGxpY2UoTSxhLmxlbmd0aC1NKSxhYSxlLGcsY2EmJkFhLGsscCx7Y29udHJvbGxlckRpcmVjdGl2ZXM6SixuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmU6Uyx0ZW1wbGF0ZURpcmVjdGl2ZTprYSxub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlOmVhfSksUj1hLmxlbmd0aDtlbHNlIGlmKEsuY29tcGlsZSl0cnl7UT1LLmNvbXBpbGUoYWEsZSxBYSksRyhRKT93KG51bGwsUSxQYSxmYik6USYmdyhRLnByZSxRLnBvc3QsUGEsZmIpfWNhdGNoKHFmKXtjKHFmLHZhKGFhKSl9Sy50ZXJtaW5hbCYmCisodi50ZXJtaW5hbD0hMCxBPU1hdGgubWF4KEEsSy5wcmlvcml0eSkpfXYuc2NvcGU9UCYmITA9PT1QLnNjb3BlO3YudHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQ9Y2E7di5lbGVtZW50VHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQ9Qzt2LnRlbXBsYXRlT25UaGlzRWxlbWVudD1EO3YudHJhbnNjbHVkZT1BYTtyLmhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlPUM7cmV0dXJuIHZ9ZnVuY3Rpb24geShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoO2I8YztiKyspe3ZhciBkPWIsZTtlPXooT2JqZWN0LmNyZWF0ZShhW2JdKSx7JCRpc29sYXRlU2NvcGU6ITB9KTthW2RdPWV9fWZ1bmN0aW9uIGNhKGIsZSxmLGcsaCxsLGspe2lmKGU9PT1oKXJldHVybiBudWxsO2g9bnVsbDtpZihkLmhhc093blByb3BlcnR5KGUpKXt2YXIgcTtlPWEuZ2V0KGUrIkRpcmVjdGl2ZSIpO2Zvcih2YXIgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl0cnl7aWYocT1lW3JdLChnPT09dHx8Zz5xLnByaW9yaXR5KSYmLTEhPQorcS5yZXN0cmljdC5pbmRleE9mKGYpKXtpZihsKXt2YXIgdz17JCRzdGFydDpsLCQkZW5kOmt9O3E9eihPYmplY3QuY3JlYXRlKHEpLHcpfWIucHVzaChxKTtoPXF9fWNhdGNoKE8pe2MoTyl9fXJldHVybiBofWZ1bmN0aW9uIEQoYil7aWYoZC5oYXNPd25Qcm9wZXJ0eShiKSlmb3IodmFyIGM9YS5nZXQoYisiRGlyZWN0aXZlIiksZT0wLGY9Yy5sZW5ndGg7ZTxmO2UrKylpZihiPWNbZV0sYi5tdWx0aUVsZW1lbnQpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gUWMoYSxiKXt2YXIgYz1iLiRhdHRyLGQ9YS4kYXR0cixlPWEuJCRlbGVtZW50O3MoYSxmdW5jdGlvbihkLGUpeyIkIiE9ZS5jaGFyQXQoMCkmJihiW2VdJiZiW2VdIT09ZCYmKGQrPSgic3R5bGUiPT09ZT8iOyI6IiAiKStiW2VdKSxhLiRzZXQoZSxkLCEwLGNbZV0pKX0pO3MoYixmdW5jdGlvbihiLGYpeyJjbGFzcyI9PWY/KFAoZSxiKSxhWyJjbGFzcyJdPShhWyJjbGFzcyJdP2FbImNsYXNzIl0rIiAiOiIiKStiKToic3R5bGUiPT0KK2Y/KGUuYXR0cigic3R5bGUiLGUuYXR0cigic3R5bGUiKSsiOyIrYiksYS5zdHlsZT0oYS5zdHlsZT9hLnN0eWxlKyI7IjoiIikrYik6IiQiPT1mLmNoYXJBdCgwKXx8YS5oYXNPd25Qcm9wZXJ0eShmKXx8KGFbZl09YixkW2ZdPWNbZl0pfSl9ZnVuY3Rpb24gVChhLGIsYyxkLGUsZixnLGgpe3ZhciBsPVtdLGsscSxwPWJbMF0sbj1hLnNoaWZ0KCksdz16KHt9LG4se3RlbXBsYXRlVXJsOm51bGwsdHJhbnNjbHVkZTpudWxsLHJlcGxhY2U6bnVsbCwkJG9yaWdpbmFsRGlyZWN0aXZlOm59KSxPPUcobi50ZW1wbGF0ZVVybCk/bi50ZW1wbGF0ZVVybChiLGMpOm4udGVtcGxhdGVVcmwsdT1uLnRlbXBsYXRlTmFtZXNwYWNlO2IuZW1wdHkoKTtyKEwuZ2V0VHJ1c3RlZFJlc291cmNlVXJsKE8pKS50aGVuKGZ1bmN0aW9uKHIpe3ZhciBMLHY7cj1TYyhyKTtpZihuLnJlcGxhY2Upe3I9UmIudGVzdChyKT9UYyhXYih1LFUocikpKTpbXTtMPXJbMF07aWYoMSE9ci5sZW5ndGh8fEwubm9kZVR5cGUhPT0KK25hKXRocm93IGphKCJ0cGxydCIsbi5uYW1lLE8pO3I9eyRhdHRyOnt9fTtWKGQsYixMKTt2YXIgQT1XKEwsW10scik7SChuLnNjb3BlKSYmeShBKTthPUEuY29uY2F0KGEpO1FjKGMscil9ZWxzZSBMPXAsYi5odG1sKHIpO2EudW5zaGlmdCh3KTtrPWVhKGEsTCxjLGUsYixuLGYsZyxoKTtzKGQsZnVuY3Rpb24oYSxjKXthPT1MJiYoZFtjXT1iWzBdKX0pO2ZvcihxPVMoYlswXS5jaGlsZE5vZGVzLGUpO2wubGVuZ3RoOyl7cj1sLnNoaWZ0KCk7dj1sLnNoaWZ0KCk7dmFyIEo9bC5zaGlmdCgpLEU9bC5zaGlmdCgpLEE9YlswXTtpZighci4kJGRlc3Ryb3llZCl7aWYodiE9PXApe3ZhciBJPXYuY2xhc3NOYW1lO2guaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmUmJm4ucmVwbGFjZXx8KEE9VGIoTCkpO1YoSixCKHYpLEEpO1AoQihBKSxJKX12PWsudHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQ/WChyLGsudHJhbnNjbHVkZSxFKTpFO2socSxyLEEsZCx2KX19bD1udWxsfSk7cmV0dXJuIGZ1bmN0aW9uKGEsCitiLGMsZCxlKXthPWU7Yi4kJGRlc3Ryb3llZHx8KGw/bC5wdXNoKGIsYyxkLGEpOihrLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50JiYoYT1YKGIsay50cmFuc2NsdWRlLGUpKSxrKHEsYixjLGQsYSkpKX19ZnVuY3Rpb24gTihhLGIpe3ZhciBjPWIucHJpb3JpdHktYS5wcmlvcml0eTtyZXR1cm4gMCE9PWM/YzphLm5hbWUhPT1iLm5hbWU/YS5uYW1lPGIubmFtZT8tMToxOmEuaW5kZXgtYi5pbmRleH1mdW5jdGlvbiBPYShhLGIsYyxkKXtpZihiKXRocm93IGphKCJtdWx0aWRpciIsYi5uYW1lLGMubmFtZSxhLHZhKGQpKTt9ZnVuY3Rpb24gTShhLGMpe3ZhciBkPWIoYywhMCk7ZCYmYS5wdXNoKHtwcmlvcml0eTowLGNvbXBpbGU6ZnVuY3Rpb24oYSl7YT1hLnBhcmVudCgpO3ZhciBiPSEhYS5sZW5ndGg7YiYmRS4kJGFkZEJpbmRpbmdDbGFzcyhhKTtyZXR1cm4gZnVuY3Rpb24oYSxjKXt2YXIgZT1jLnBhcmVudCgpO2J8fEUuJCRhZGRCaW5kaW5nQ2xhc3MoZSk7RS4kJGFkZEJpbmRpbmdJbmZvKGUsCitkLmV4cHJlc3Npb25zKTthLiR3YXRjaChkLGZ1bmN0aW9uKGEpe2NbMF0ubm9kZVZhbHVlPWF9KX19fSl9ZnVuY3Rpb24gV2IoYSxiKXthPVEoYXx8Imh0bWwiKTtzd2l0Y2goYSl7Y2FzZSAic3ZnIjpjYXNlICJtYXRoIjp2YXIgYz1ZLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuaW5uZXJIVE1MPSI8IithKyI+IitiKyI8LyIrYSsiPiI7cmV0dXJuIGMuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzO2RlZmF1bHQ6cmV0dXJuIGJ9fWZ1bmN0aW9uIFIoYSxiKXtpZigic3JjZG9jIj09YilyZXR1cm4gTC5IVE1MO3ZhciBjPXVhKGEpO2lmKCJ4bGlua0hyZWYiPT1ifHwiZm9ybSI9PWMmJiJhY3Rpb24iPT1ifHwiaW1nIiE9YyYmKCJzcmMiPT1ifHwibmdTcmMiPT1iKSlyZXR1cm4gTC5SRVNPVVJDRV9VUkx9ZnVuY3Rpb24gUGEoYSxjLGQsZSxmKXt2YXIgaD1SKGEsZSk7Zj1nW2VdfHxmO3ZhciBrPWIoZCwhMCxoLGYpO2lmKGspe2lmKCJtdWx0aXBsZSI9PT1lJiYic2VsZWN0Ij09PXVhKGEpKXRocm93IGphKCJzZWxtdWx0aSIsCit2YShhKSk7Yy5wdXNoKHtwcmlvcml0eToxMDAsY29tcGlsZTpmdW5jdGlvbigpe3JldHVybntwcmU6ZnVuY3Rpb24oYSxjLGcpe2M9Zy4kJG9ic2VydmVyc3x8KGcuJCRvYnNlcnZlcnM9e30pO2lmKGwudGVzdChlKSl0aHJvdyBqYSgibm9kb21ldmVudHMiKTt2YXIgcD1nW2VdO3AhPT1kJiYoaz1wJiZiKHAsITAsaCxmKSxkPXApO2smJihnW2VdPWsoYSksKGNbZV18fChjW2VdPVtdKSkuJCRpbnRlcj0hMCwoZy4kJG9ic2VydmVycyYmZy4kJG9ic2VydmVyc1tlXS4kJHNjb3BlfHxhKS4kd2F0Y2goayxmdW5jdGlvbihhLGIpeyJjbGFzcyI9PT1lJiZhIT1iP2cuJHVwZGF0ZUNsYXNzKGEsYik6Zy4kc2V0KGUsYSl9KSl9fX19KX19ZnVuY3Rpb24gVihhLGIsYyl7dmFyIGQ9YlswXSxlPWIubGVuZ3RoLGY9ZC5wYXJlbnROb2RlLGcsaDtpZihhKWZvcihnPTAsaD1hLmxlbmd0aDtnPGg7ZysrKWlmKGFbZ109PWQpe2FbZysrXT1jO2g9ZytlLTE7Zm9yKHZhciBsPWEubGVuZ3RoO2c8bDtnKyssCitoKyspaDxsP2FbZ109YVtoXTpkZWxldGUgYVtnXTthLmxlbmd0aC09ZS0xO2EuY29udGV4dD09PWQmJihhLmNvbnRleHQ9Yyk7YnJlYWt9ZiYmZi5yZXBsYWNlQ2hpbGQoYyxkKTthPVkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2EuYXBwZW5kQ2hpbGQoZCk7QihjKS5kYXRhKEIoZCkuZGF0YSgpKTtyYT8oUGI9ITAscmEuY2xlYW5EYXRhKFtkXSkpOmRlbGV0ZSBCLmNhY2hlW2RbQi5leHBhbmRvXV07ZD0xO2ZvcihlPWIubGVuZ3RoO2Q8ZTtkKyspZj1iW2RdLEIoZikucmVtb3ZlKCksYS5hcHBlbmRDaGlsZChmKSxkZWxldGUgYltkXTtiWzBdPWM7Yi5sZW5ndGg9MX1mdW5jdGlvbiBaKGEsYil7cmV0dXJuIHooZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShudWxsLGFyZ3VtZW50cyl9LGEsYil9ZnVuY3Rpb24gJChhLGIsZCxlLGYsZyl7dHJ5e2EoYixkLGUsZixnKX1jYXRjaChoKXtjKGgsdmEoZCkpfX12YXIgWGI9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1PYmplY3Qua2V5cyhiKSwKK2QsZSxmO2Q9MDtmb3IoZT1jLmxlbmd0aDtkPGU7ZCsrKWY9Y1tkXSx0aGlzW2ZdPWJbZl19ZWxzZSB0aGlzLiRhdHRyPXt9O3RoaXMuJCRlbGVtZW50PWF9O1hiLnByb3RvdHlwZT17JG5vcm1hbGl6ZTp5YSwkYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7YSYmMDxhLmxlbmd0aCYmSi5hZGRDbGFzcyh0aGlzLiQkZWxlbWVudCxhKX0sJHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe2EmJjA8YS5sZW5ndGgmJkoucmVtb3ZlQ2xhc3ModGhpcy4kJGVsZW1lbnQsYSl9LCR1cGRhdGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPVVjKGEsYik7YyYmYy5sZW5ndGgmJkouYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsYyk7KGM9VWMoYixhKSkmJmMubGVuZ3RoJiZKLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LGMpfSwkc2V0OmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBmPXRoaXMuJCRlbGVtZW50WzBdLGc9TGMoZixhKSxoPWtmKGYsYSksZj1hO2c/KHRoaXMuJCRlbGVtZW50LnByb3AoYSxiKSxlPWcpOgoraCYmKHRoaXNbaF09YixmPWgpO3RoaXNbYV09YjtlP3RoaXMuJGF0dHJbYV09ZTooZT10aGlzLiRhdHRyW2FdKXx8KHRoaXMuJGF0dHJbYV09ZT10YyhhLCItIikpO2c9dWEodGhpcy4kJGVsZW1lbnQpO2lmKCJhIj09PWcmJiJocmVmIj09PWF8fCJpbWciPT09ZyYmInNyYyI9PT1hKXRoaXNbYV09Yj1BKGIsInNyYyI9PT1hKTtlbHNlIGlmKCJpbWciPT09ZyYmInNyY3NldCI9PT1hKXtmb3IodmFyIGc9IiIsaD1VKGIpLGw9LyhccytcZCt4XHMqLHxccytcZCt3XHMqLHxccyssfCxccyspLyxsPS9ccy8udGVzdChoKT9sOi8oLCkvLGg9aC5zcGxpdChsKSxsPU1hdGguZmxvb3IoaC5sZW5ndGgvMiksaz0wO2s8bDtrKyspdmFyIHE9MiprLGc9ZytBKFUoaFtxXSksITApLGc9ZysoIiAiK1UoaFtxKzFdKSk7aD1VKGhbMiprXSkuc3BsaXQoL1xzLyk7Zys9QShVKGhbMF0pLCEwKTsyPT09aC5sZW5ndGgmJihnKz0iICIrVShoWzFdKSk7dGhpc1thXT1iPWd9ITEhPT1kJiYobnVsbD09PWJ8fAorYj09PXQ/dGhpcy4kJGVsZW1lbnQucmVtb3ZlQXR0cihlKTp0aGlzLiQkZWxlbWVudC5hdHRyKGUsYikpOyhhPXRoaXMuJCRvYnNlcnZlcnMpJiZzKGFbZl0sZnVuY3Rpb24oYSl7dHJ5e2EoYil9Y2F0Y2goZCl7YyhkKX19KX0sJG9ic2VydmU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLGQ9Yy4kJG9ic2VydmVyc3x8KGMuJCRvYnNlcnZlcnM9aGEoKSksZT1kW2FdfHwoZFthXT1bXSk7ZS5wdXNoKGIpO3YuJGV2YWxBc3luYyhmdW5jdGlvbigpeyFlLiQkaW50ZXImJmMuaGFzT3duUHJvcGVydHkoYSkmJmIoY1thXSl9KTtyZXR1cm4gZnVuY3Rpb24oKXtYYShlLGIpfX19O3ZhciBBYT1iLnN0YXJ0U3ltYm9sKCksa2E9Yi5lbmRTeW1ib2woKSxTYz0ie3siPT1BYXx8In19Ij09a2E/b2E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvXHtcey9nLEFhKS5yZXBsYWNlKC99fS9nLGthKX0sZmI9L15uZ0F0dHJbQS1aXS87RS4kJGFkZEJpbmRpbmdJbmZvPWs/ZnVuY3Rpb24oYSxiKXt2YXIgYz0KK2EuZGF0YSgiJGJpbmRpbmciKXx8W107eChiKT9jPWMuY29uY2F0KGIpOmMucHVzaChiKTthLmRhdGEoIiRiaW5kaW5nIixjKX06QztFLiQkYWRkQmluZGluZ0NsYXNzPWs/ZnVuY3Rpb24oYSl7UChhLCJuZy1iaW5kaW5nIil9OkM7RS4kJGFkZFNjb3BlSW5mbz1rP2Z1bmN0aW9uKGEsYixjLGQpe2EuZGF0YShjP2Q/IiRpc29sYXRlU2NvcGVOb1RlbXBsYXRlIjoiJGlzb2xhdGVTY29wZSI6IiRzY29wZSIsYil9OkM7RS4kJGFkZFNjb3BlQ2xhc3M9az9mdW5jdGlvbihhLGIpe1AoYSxiPyJuZy1pc29sYXRlLXNjb3BlIjoibmctc2NvcGUiKX06QztyZXR1cm4gRX1dfWZ1bmN0aW9uIHlhKGIpe3JldHVybiBjYihiLnJlcGxhY2UoUmMsIiIpKX1mdW5jdGlvbiBVYyhiLGEpe3ZhciBjPSIiLGQ9Yi5zcGxpdCgvXHMrLyksZT1hLnNwbGl0KC9ccysvKSxmPTA7YTpmb3IoO2Y8ZC5sZW5ndGg7ZisrKXtmb3IodmFyIGc9ZFtmXSxoPTA7aDxlLmxlbmd0aDtoKyspaWYoZz09ZVtoXSljb250aW51ZSBhOworYys9KDA8Yy5sZW5ndGg/IiAiOiIiKStnfXJldHVybiBjfWZ1bmN0aW9uIFRjKGIpe2I9QihiKTt2YXIgYT1iLmxlbmd0aDtpZigxPj1hKXJldHVybiBiO2Zvcig7YS0tOyk4PT09YlthXS5ub2RlVHlwZSYmcmYuY2FsbChiLGEsMSk7cmV0dXJuIGJ9ZnVuY3Rpb24gRmUoKXt2YXIgYj17fSxhPSExLGM9L14oXFMrKShccythc1xzKyhcdyspKT8kLzt0aGlzLnJlZ2lzdGVyPWZ1bmN0aW9uKGEsYyl7TWEoYSwiY29udHJvbGxlciIpO0goYSk/eihiLGEpOmJbYV09Y307dGhpcy5hbGxvd0dsb2JhbHM9ZnVuY3Rpb24oKXthPSEwfTt0aGlzLiRnZXQ9WyIkaW5qZWN0b3IiLCIkd2luZG93IixmdW5jdGlvbihkLGUpe2Z1bmN0aW9uIGYoYSxiLGMsZCl7aWYoIWF8fCFIKGEuJHNjb3BlKSl0aHJvdyBUKCIkY29udHJvbGxlciIpKCJub3NjcCIsZCxiKTthLiRzY29wZVtiXT1jfXJldHVybiBmdW5jdGlvbihnLGgsbCxrKXt2YXIgbSxwLHE7bD0hMD09PWw7ayYmRihrKSYmKHE9ayk7RihnKSYmCisoaz1nLm1hdGNoKGMpLHA9a1sxXSxxPXF8fGtbM10sZz1iLmhhc093blByb3BlcnR5KHApP2JbcF06dmMoaC4kc2NvcGUscCwhMCl8fChhP3ZjKGUscCwhMCk6dCksc2IoZyxwLCEwKSk7aWYobClyZXR1cm4gbD0oeChnKT9nW2cubGVuZ3RoLTFdOmcpLnByb3RvdHlwZSxtPU9iamVjdC5jcmVhdGUobCkscSYmZihoLHEsbSxwfHxnLm5hbWUpLHooZnVuY3Rpb24oKXtkLmludm9rZShnLG0saCxwKTtyZXR1cm4gbX0se2luc3RhbmNlOm0saWRlbnRpZmllcjpxfSk7bT1kLmluc3RhbnRpYXRlKGcsaCxwKTtxJiZmKGgscSxtLHB8fGcubmFtZSk7cmV0dXJuIG19fV19ZnVuY3Rpb24gR2UoKXt0aGlzLiRnZXQ9WyIkd2luZG93IixmdW5jdGlvbihiKXtyZXR1cm4gQihiLmRvY3VtZW50KX1dfWZ1bmN0aW9uIEhlKCl7dGhpcy4kZ2V0PVsiJGxvZyIsZnVuY3Rpb24oYil7cmV0dXJuIGZ1bmN0aW9uKGEsYyl7Yi5lcnJvci5hcHBseShiLGFyZ3VtZW50cyl9fV19ZnVuY3Rpb24gWWIoYixhKXtpZihGKGIpKXt2YXIgYz0KK2IucmVwbGFjZShzZiwiIikudHJpbSgpO2lmKGMpe3ZhciBkPWEoIkNvbnRlbnQtVHlwZSIpOyhkPWQmJjA9PT1kLmluZGV4T2YoVmMpKXx8KGQ9KGQ9Yy5tYXRjaCh0ZikpJiZ1ZltkWzBdXS50ZXN0KGMpKTtkJiYoYj1vYyhjKSl9fXJldHVybiBifWZ1bmN0aW9uIFdjKGIpe3ZhciBhPWhhKCksYyxkLGU7aWYoIWIpcmV0dXJuIGE7cyhiLnNwbGl0KCJcbiIpLGZ1bmN0aW9uKGIpe2U9Yi5pbmRleE9mKCI6Iik7Yz1RKFUoYi5zdWJzdHIoMCxlKSkpO2Q9VShiLnN1YnN0cihlKzEpKTtjJiYoYVtjXT1hW2NdP2FbY10rIiwgIitkOmQpfSk7cmV0dXJuIGF9ZnVuY3Rpb24gWGMoYil7dmFyIGE9SChiKT9iOnQ7cmV0dXJuIGZ1bmN0aW9uKGMpe2F8fChhPVdjKGIpKTtyZXR1cm4gYz8oYz1hW1EoYyldLHZvaWQgMD09PWMmJihjPW51bGwpLGMpOmF9fWZ1bmN0aW9uIFljKGIsYSxjLGQpe2lmKEcoZCkpcmV0dXJuIGQoYixhLGMpO3MoZCxmdW5jdGlvbihkKXtiPWQoYixhLGMpfSk7cmV0dXJuIGJ9CitmdW5jdGlvbiBLZSgpe3ZhciBiPXRoaXMuZGVmYXVsdHM9e3RyYW5zZm9ybVJlc3BvbnNlOltZYl0sdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oYSl7cmV0dXJuIEgoYSkmJiJbb2JqZWN0IEZpbGVdIiE9PURhLmNhbGwoYSkmJiJbb2JqZWN0IEJsb2JdIiE9PURhLmNhbGwoYSkmJiJbb2JqZWN0IEZvcm1EYXRhXSIhPT1EYS5jYWxsKGEpPyRhKGEpOmF9XSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIn0scG9zdDpxYShaYikscHV0OnFhKFpiKSxwYXRjaDpxYShaYil9LHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIn0sYT0hMTt0aGlzLnVzZUFwcGx5QXN5bmM9ZnVuY3Rpb24oYil7cmV0dXJuIHkoYik/KGE9ISFiLHRoaXMpOmF9O3ZhciBjPXRoaXMuaW50ZXJjZXB0b3JzPVtdO3RoaXMuJGdldD1bIiRodHRwQmFja2VuZCIsIiRicm93c2VyIiwiJGNhY2hlRmFjdG9yeSIsCisiJHJvb3RTY29wZSIsIiRxIiwiJGluamVjdG9yIixmdW5jdGlvbihkLGUsZixnLGgsbCl7ZnVuY3Rpb24gayhhKXtmdW5jdGlvbiBjKGEpe3ZhciBiPXooe30sYSk7Yi5kYXRhPWEuZGF0YT9ZYyhhLmRhdGEsYS5oZWFkZXJzLGEuc3RhdHVzLGUudHJhbnNmb3JtUmVzcG9uc2UpOmEuZGF0YTthPWEuc3RhdHVzO3JldHVybiAyMDA8PWEmJjMwMD5hP2I6aC5yZWplY3QoYil9ZnVuY3Rpb24gZChhKXt2YXIgYixjPXt9O3MoYSxmdW5jdGlvbihhLGQpe0coYSk/KGI9YSgpLG51bGwhPWImJihjW2RdPWIpKTpjW2RdPWF9KTtyZXR1cm4gY31pZighZ2EuaXNPYmplY3QoYSkpdGhyb3cgVCgiJGh0dHAiKSgiYmFkcmVxIixhKTt2YXIgZT16KHttZXRob2Q6ImdldCIsdHJhbnNmb3JtUmVxdWVzdDpiLnRyYW5zZm9ybVJlcXVlc3QsdHJhbnNmb3JtUmVzcG9uc2U6Yi50cmFuc2Zvcm1SZXNwb25zZX0sYSk7ZS5oZWFkZXJzPWZ1bmN0aW9uKGEpe3ZhciBjPWIuaGVhZGVycyxlPXooe30sYS5oZWFkZXJzKSwKK2YsZyxjPXooe30sYy5jb21tb24sY1tRKGEubWV0aG9kKV0pO2E6Zm9yKGYgaW4gYyl7YT1RKGYpO2ZvcihnIGluIGUpaWYoUShnKT09PWEpY29udGludWUgYTtlW2ZdPWNbZl19cmV0dXJuIGQoZSl9KGEpO2UubWV0aG9kPXViKGUubWV0aG9kKTt2YXIgZj1bZnVuY3Rpb24oYSl7dmFyIGQ9YS5oZWFkZXJzLGU9WWMoYS5kYXRhLFhjKGQpLHQsYS50cmFuc2Zvcm1SZXF1ZXN0KTtEKGUpJiZzKGQsZnVuY3Rpb24oYSxiKXsiY29udGVudC10eXBlIj09PVEoYikmJmRlbGV0ZSBkW2JdfSk7RChhLndpdGhDcmVkZW50aWFscykmJiFEKGIud2l0aENyZWRlbnRpYWxzKSYmKGEud2l0aENyZWRlbnRpYWxzPWIud2l0aENyZWRlbnRpYWxzKTtyZXR1cm4gbShhLGUpLnRoZW4oYyxjKX0sdF0sZz1oLndoZW4oZSk7Zm9yKHModSxmdW5jdGlvbihhKXsoYS5yZXF1ZXN0fHxhLnJlcXVlc3RFcnJvcikmJmYudW5zaGlmdChhLnJlcXVlc3QsYS5yZXF1ZXN0RXJyb3IpOyhhLnJlc3BvbnNlfHxhLnJlc3BvbnNlRXJyb3IpJiYKK2YucHVzaChhLnJlc3BvbnNlLGEucmVzcG9uc2VFcnJvcil9KTtmLmxlbmd0aDspe2E9Zi5zaGlmdCgpO3ZhciBsPWYuc2hpZnQoKSxnPWcudGhlbihhLGwpfWcuc3VjY2Vzcz1mdW5jdGlvbihhKXtnLnRoZW4oZnVuY3Rpb24oYil7YShiLmRhdGEsYi5zdGF0dXMsYi5oZWFkZXJzLGUpfSk7cmV0dXJuIGd9O2cuZXJyb3I9ZnVuY3Rpb24oYSl7Zy50aGVuKG51bGwsZnVuY3Rpb24oYil7YShiLmRhdGEsYi5zdGF0dXMsYi5oZWFkZXJzLGUpfSk7cmV0dXJuIGd9O3JldHVybiBnfWZ1bmN0aW9uIG0oYyxmKXtmdW5jdGlvbiBsKGIsYyxkLGUpe2Z1bmN0aW9uIGYoKXttKGMsYixkLGUpfVAmJigyMDA8PWImJjMwMD5iP1AucHV0KFgsW2IsYyxXYyhkKSxlXSk6UC5yZW1vdmUoWCkpO2E/Zy4kYXBwbHlBc3luYyhmKTooZigpLGcuJCRwaGFzZXx8Zy4kYXBwbHkoKSl9ZnVuY3Rpb24gbShhLGIsZCxlKXtiPU1hdGgubWF4KGIsMCk7KDIwMDw9YiYmMzAwPmI/Si5yZXNvbHZlOkoucmVqZWN0KSh7ZGF0YTphLAorc3RhdHVzOmIsaGVhZGVyczpYYyhkKSxjb25maWc6YyxzdGF0dXNUZXh0OmV9KX1mdW5jdGlvbiB3KGEpe20oYS5kYXRhLGEuc3RhdHVzLHFhKGEuaGVhZGVycygpKSxhLnN0YXR1c1RleHQpfWZ1bmN0aW9uIHUoKXt2YXIgYT1rLnBlbmRpbmdSZXF1ZXN0cy5pbmRleE9mKGMpOy0xIT09YSYmay5wZW5kaW5nUmVxdWVzdHMuc3BsaWNlKGEsMSl9dmFyIEo9aC5kZWZlcigpLEE9Si5wcm9taXNlLFAsRSxzPWMuaGVhZGVycyxYPXAoYy51cmwsYy5wYXJhbXMpO2sucGVuZGluZ1JlcXVlc3RzLnB1c2goYyk7QS50aGVuKHUsdSk7IWMuY2FjaGUmJiFiLmNhY2hlfHwhMT09PWMuY2FjaGV8fCJHRVQiIT09Yy5tZXRob2QmJiJKU09OUCIhPT1jLm1ldGhvZHx8KFA9SChjLmNhY2hlKT9jLmNhY2hlOkgoYi5jYWNoZSk/Yi5jYWNoZTpxKTtQJiYoRT1QLmdldChYKSx5KEUpP0UmJkcoRS50aGVuKT9FLnRoZW4odyx3KTp4KEUpP20oRVsxXSxFWzBdLHFhKEVbMl0pLEVbM10pOm0oRSwyMDAse30sCisiT0siKTpQLnB1dChYLEEpKTtEKEUpJiYoKEU9WmMoYy51cmwpP2UuY29va2llcygpW2MueHNyZkNvb2tpZU5hbWV8fGIueHNyZkNvb2tpZU5hbWVdOnQpJiYoc1tjLnhzcmZIZWFkZXJOYW1lfHxiLnhzcmZIZWFkZXJOYW1lXT1FKSxkKGMubWV0aG9kLFgsZixsLHMsYy50aW1lb3V0LGMud2l0aENyZWRlbnRpYWxzLGMucmVzcG9uc2VUeXBlKSk7cmV0dXJuIEF9ZnVuY3Rpb24gcChhLGIpe2lmKCFiKXJldHVybiBhO3ZhciBjPVtdO0VkKGIsZnVuY3Rpb24oYSxiKXtudWxsPT09YXx8RChhKXx8KHgoYSl8fChhPVthXSkscyhhLGZ1bmN0aW9uKGEpe0goYSkmJihhPXBhKGEpP2EudG9JU09TdHJpbmcoKTokYShhKSk7Yy5wdXNoKEZhKGIpKyI9IitGYShhKSl9KSl9KTswPGMubGVuZ3RoJiYoYSs9KC0xPT1hLmluZGV4T2YoIj8iKT8iPyI6IiYiKStjLmpvaW4oIiYiKSk7cmV0dXJuIGF9dmFyIHE9ZigiJGh0dHAiKSx1PVtdO3MoYyxmdW5jdGlvbihhKXt1LnVuc2hpZnQoRihhKT9sLmdldChhKToKK2wuaW52b2tlKGEpKX0pO2sucGVuZGluZ1JlcXVlc3RzPVtdOyhmdW5jdGlvbihhKXtzKGFyZ3VtZW50cyxmdW5jdGlvbihhKXtrW2FdPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGsoeihjfHx7fSx7bWV0aG9kOmEsdXJsOmJ9KSl9fSl9KSgiZ2V0IiwiZGVsZXRlIiwiaGVhZCIsImpzb25wIik7KGZ1bmN0aW9uKGEpe3MoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2tbYV09ZnVuY3Rpb24oYixjLGQpe3JldHVybiBrKHooZHx8e30se21ldGhvZDphLHVybDpiLGRhdGE6Y30pKX19KX0pKCJwb3N0IiwicHV0IiwicGF0Y2giKTtrLmRlZmF1bHRzPWI7cmV0dXJuIGt9XX1mdW5jdGlvbiB2Zigpe3JldHVybiBuZXcgTS5YTUxIdHRwUmVxdWVzdH1mdW5jdGlvbiBMZSgpe3RoaXMuJGdldD1bIiRicm93c2VyIiwiJHdpbmRvdyIsIiRkb2N1bWVudCIsZnVuY3Rpb24oYixhLGMpe3JldHVybiB3ZihiLHZmLGIuZGVmZXIsYS5hbmd1bGFyLmNhbGxiYWNrcyxjWzBdKX1dfWZ1bmN0aW9uIHdmKGIsYSxjLAorZCxlKXtmdW5jdGlvbiBmKGEsYixjKXt2YXIgZj1lLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLG09bnVsbDtmLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Zi5zcmM9YTtmLmFzeW5jPSEwO209ZnVuY3Rpb24oYSl7Zi5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixtLCExKTtmLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIixtLCExKTtlLmJvZHkucmVtb3ZlQ2hpbGQoZik7Zj1udWxsO3ZhciBnPS0xLHU9InVua25vd24iO2EmJigibG9hZCIhPT1hLnR5cGV8fGRbYl0uY2FsbGVkfHwoYT17dHlwZToiZXJyb3IifSksdT1hLnR5cGUsZz0iZXJyb3IiPT09YS50eXBlPzQwNDoyMDApO2MmJmMoZyx1KX07Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixtLCExKTtmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixtLCExKTtlLmJvZHkuYXBwZW5kQ2hpbGQoZik7cmV0dXJuIG19cmV0dXJuIGZ1bmN0aW9uKGUsaCxsLGssbSxwLHEsdSl7ZnVuY3Rpb24gcigpe3YmJnYoKTt3JiZ3LmFib3J0KCl9CitmdW5jdGlvbiBPKGEsZCxlLGYsZyl7SiE9PXQmJmMuY2FuY2VsKEopO3Y9dz1udWxsO2EoZCxlLGYsZyk7Yi4kJGNvbXBsZXRlT3V0c3RhbmRpbmdSZXF1ZXN0KEMpfWIuJCRpbmNPdXRzdGFuZGluZ1JlcXVlc3RDb3VudCgpO2g9aHx8Yi51cmwoKTtpZigianNvbnAiPT1RKGUpKXt2YXIgbj0iXyIrKGQuY291bnRlcisrKS50b1N0cmluZygzNik7ZFtuXT1mdW5jdGlvbihhKXtkW25dLmRhdGE9YTtkW25dLmNhbGxlZD0hMH07dmFyIHY9ZihoLnJlcGxhY2UoIkpTT05fQ0FMTEJBQ0siLCJhbmd1bGFyLmNhbGxiYWNrcy4iK24pLG4sZnVuY3Rpb24oYSxiKXtPKGssYSxkW25dLmRhdGEsIiIsYik7ZFtuXT1DfSl9ZWxzZXt2YXIgdz1hKCk7dy5vcGVuKGUsaCwhMCk7cyhtLGZ1bmN0aW9uKGEsYil7eShhKSYmdy5zZXRSZXF1ZXN0SGVhZGVyKGIsYSl9KTt3Lm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPXcuc3RhdHVzVGV4dHx8IiIsYj0icmVzcG9uc2UiaW4gdz93LnJlc3BvbnNlOncucmVzcG9uc2VUZXh0LAorYz0xMjIzPT09dy5zdGF0dXM/MjA0Oncuc3RhdHVzOzA9PT1jJiYoYz1iPzIwMDoiZmlsZSI9PUJhKGgpLnByb3RvY29sPzQwNDowKTtPKGssYyxiLHcuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksYSl9O2U9ZnVuY3Rpb24oKXtPKGssLTEsbnVsbCxudWxsLCIiKX07dy5vbmVycm9yPWU7dy5vbmFib3J0PWU7cSYmKHcud2l0aENyZWRlbnRpYWxzPSEwKTtpZih1KXRyeXt3LnJlc3BvbnNlVHlwZT11fWNhdGNoKEwpe2lmKCJqc29uIiE9PXUpdGhyb3cgTDt9dy5zZW5kKGx8fG51bGwpfWlmKDA8cCl2YXIgSj1jKHIscCk7ZWxzZSBwJiZHKHAudGhlbikmJnAudGhlbihyKX19ZnVuY3Rpb24gSWUoKXt2YXIgYj0ie3siLGE9In19Ijt0aGlzLnN0YXJ0U3ltYm9sPWZ1bmN0aW9uKGEpe3JldHVybiBhPyhiPWEsdGhpcyk6Yn07dGhpcy5lbmRTeW1ib2w9ZnVuY3Rpb24oYil7cmV0dXJuIGI/KGE9Yix0aGlzKTphfTt0aGlzLiRnZXQ9WyIkcGFyc2UiLCIkZXhjZXB0aW9uSGFuZGxlciIsIiRzY2UiLAorZnVuY3Rpb24oYyxkLGUpe2Z1bmN0aW9uIGYoYSl7cmV0dXJuIlxcXFxcXCIrYX1mdW5jdGlvbiBnKGYsZyx1LHIpe2Z1bmN0aW9uIE8oYyl7cmV0dXJuIGMucmVwbGFjZShrLGIpLnJlcGxhY2UobSxhKX1mdW5jdGlvbiBuKGEpe3RyeXt2YXIgYj1hO2E9dT9lLmdldFRydXN0ZWQodSxiKTplLnZhbHVlT2YoYik7dmFyIGM7aWYociYmIXkoYSkpYz1hO2Vsc2UgaWYobnVsbD09YSljPSIiO2Vsc2V7c3dpdGNoKHR5cGVvZiBhKXtjYXNlICJzdHJpbmciOmJyZWFrO2Nhc2UgIm51bWJlciI6YT0iIithO2JyZWFrO2RlZmF1bHQ6YT0kYShhKX1jPWF9cmV0dXJuIGN9Y2F0Y2goZyl7Yz0kYigiaW50ZXJyIixmLGcudG9TdHJpbmcoKSksZChjKX19cj0hIXI7Zm9yKHZhciB2LHcsTD0wLEo9W10sQT1bXSxQPWYubGVuZ3RoLEU9W10scz1bXTtMPFA7KWlmKC0xIT0odj1mLmluZGV4T2YoYixMKSkmJi0xIT0odz1mLmluZGV4T2YoYSx2K2gpKSlMIT09diYmRS5wdXNoKE8oZi5zdWJzdHJpbmcoTCwKK3YpKSksTD1mLnN1YnN0cmluZyh2K2gsdyksSi5wdXNoKEwpLEEucHVzaChjKEwsbikpLEw9dytsLHMucHVzaChFLmxlbmd0aCksRS5wdXNoKCIiKTtlbHNle0whPT1QJiZFLnB1c2goTyhmLnN1YnN0cmluZyhMKSkpO2JyZWFrfWlmKHUmJjE8RS5sZW5ndGgpdGhyb3cgJGIoIm5vY29uY2F0IixmKTtpZighZ3x8Si5sZW5ndGgpe3ZhciBYPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9Si5sZW5ndGg7YjxjO2IrKyl7aWYociYmRChhW2JdKSlyZXR1cm47RVtzW2JdXT1hW2JdfXJldHVybiBFLmpvaW4oIiIpfTtyZXR1cm4geihmdW5jdGlvbihhKXt2YXIgYj0wLGM9Si5sZW5ndGgsZT1BcnJheShjKTt0cnl7Zm9yKDtiPGM7YisrKWVbYl09QVtiXShhKTtyZXR1cm4gWChlKX1jYXRjaChnKXthPSRiKCJpbnRlcnIiLGYsZy50b1N0cmluZygpKSxkKGEpfX0se2V4cDpmLGV4cHJlc3Npb25zOkosJCR3YXRjaERlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYS4kd2F0Y2hHcm91cChBLAorZnVuY3Rpb24oYyxlKXt2YXIgZj1YKGMpO0coYikmJmIuY2FsbCh0aGlzLGYsYyE9PWU/ZDpmLGEpO2Q9Zn0sYyl9fSl9fXZhciBoPWIubGVuZ3RoLGw9YS5sZW5ndGgsaz1uZXcgUmVnRXhwKGIucmVwbGFjZSgvLi9nLGYpLCJnIiksbT1uZXcgUmVnRXhwKGEucmVwbGFjZSgvLi9nLGYpLCJnIik7Zy5zdGFydFN5bWJvbD1mdW5jdGlvbigpe3JldHVybiBifTtnLmVuZFN5bWJvbD1mdW5jdGlvbigpe3JldHVybiBhfTtyZXR1cm4gZ31dfWZ1bmN0aW9uIEplKCl7dGhpcy4kZ2V0PVsiJHJvb3RTY29wZSIsIiR3aW5kb3ciLCIkcSIsIiQkcSIsZnVuY3Rpb24oYixhLGMsZCl7ZnVuY3Rpb24gZShlLGgsbCxrKXt2YXIgbT1hLnNldEludGVydmFsLHA9YS5jbGVhckludGVydmFsLHE9MCx1PXkoaykmJiFrLHI9KHU/ZDpjKS5kZWZlcigpLE89ci5wcm9taXNlO2w9eShsKT9sOjA7Ty50aGVuKG51bGwsbnVsbCxlKTtPLiQkaW50ZXJ2YWxJZD1tKGZ1bmN0aW9uKCl7ci5ub3RpZnkocSsrKTswPAorbCYmcT49bCYmKHIucmVzb2x2ZShxKSxwKE8uJCRpbnRlcnZhbElkKSxkZWxldGUgZltPLiQkaW50ZXJ2YWxJZF0pO3V8fGIuJGFwcGx5KCl9LGgpO2ZbTy4kJGludGVydmFsSWRdPXI7cmV0dXJuIE99dmFyIGY9e307ZS5jYW5jZWw9ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuJCRpbnRlcnZhbElkIGluIGY/KGZbYi4kJGludGVydmFsSWRdLnJlamVjdCgiY2FuY2VsZWQiKSxhLmNsZWFySW50ZXJ2YWwoYi4kJGludGVydmFsSWQpLGRlbGV0ZSBmW2IuJCRpbnRlcnZhbElkXSwhMCk6ITF9O3JldHVybiBlfV19ZnVuY3Rpb24gUmQoKXt0aGlzLiRnZXQ9ZnVuY3Rpb24oKXtyZXR1cm57aWQ6ImVuLXVzIixOVU1CRVJfRk9STUFUUzp7REVDSU1BTF9TRVA6Ii4iLEdST1VQX1NFUDoiLCIsUEFUVEVSTlM6W3ttaW5JbnQ6MSxtaW5GcmFjOjAsbWF4RnJhYzozLHBvc1ByZToiIixwb3NTdWY6IiIsbmVnUHJlOiItIixuZWdTdWY6IiIsZ1NpemU6MyxsZ1NpemU6M30se21pbkludDoxLG1pbkZyYWM6MiwKK21heEZyYWM6Mixwb3NQcmU6Ilx1MDBhNCIscG9zU3VmOiIiLG5lZ1ByZToiKFx1MDBhNCIsbmVnU3VmOiIpIixnU2l6ZTozLGxnU2l6ZTozfV0sQ1VSUkVOQ1lfU1lNOiIkIn0sREFURVRJTUVfRk9STUFUUzp7TU9OVEg6IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIiksU0hPUlRNT05USDoiSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWMiLnNwbGl0KCIgIiksREFZOiJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSIuc3BsaXQoIiAiKSxTSE9SVERBWToiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0Ii5zcGxpdCgiICIpLEFNUE1TOlsiQU0iLCJQTSJdLG1lZGl1bToiTU1NIGQsIHkgaDptbTpzcyBhIiwic2hvcnQiOiJNL2QveXkgaDptbSBhIixmdWxsRGF0ZToiRUVFRSwgTU1NTSBkLCB5IiwKK2xvbmdEYXRlOiJNTU1NIGQsIHkiLG1lZGl1bURhdGU6Ik1NTSBkLCB5IixzaG9ydERhdGU6Ik0vZC95eSIsbWVkaXVtVGltZToiaDptbTpzcyBhIixzaG9ydFRpbWU6Img6bW0gYSJ9LHBsdXJhbENhdDpmdW5jdGlvbihiKXtyZXR1cm4gMT09PWI/Im9uZSI6Im90aGVyIn19fX1mdW5jdGlvbiBhYyhiKXtiPWIuc3BsaXQoIi8iKTtmb3IodmFyIGE9Yi5sZW5ndGg7YS0tOyliW2FdPXFiKGJbYV0pO3JldHVybiBiLmpvaW4oIi8iKX1mdW5jdGlvbiAkYyhiLGEpe3ZhciBjPUJhKGIpO2EuJCRwcm90b2NvbD1jLnByb3RvY29sO2EuJCRob3N0PWMuaG9zdG5hbWU7YS4kJHBvcnQ9YmEoYy5wb3J0KXx8eGZbYy5wcm90b2NvbF18fG51bGx9ZnVuY3Rpb24gYWQoYixhKXt2YXIgYz0iLyIhPT1iLmNoYXJBdCgwKTtjJiYoYj0iLyIrYik7dmFyIGQ9QmEoYik7YS4kJHBhdGg9ZGVjb2RlVVJJQ29tcG9uZW50KGMmJiIvIj09PWQucGF0aG5hbWUuY2hhckF0KDApP2QucGF0aG5hbWUuc3Vic3RyaW5nKDEpOgorZC5wYXRobmFtZSk7YS4kJHNlYXJjaD1xYyhkLnNlYXJjaCk7YS4kJGhhc2g9ZGVjb2RlVVJJQ29tcG9uZW50KGQuaGFzaCk7YS4kJHBhdGgmJiIvIiE9YS4kJHBhdGguY2hhckF0KDApJiYoYS4kJHBhdGg9Ii8iK2EuJCRwYXRoKX1mdW5jdGlvbiB6YShiLGEpe2lmKDA9PT1hLmluZGV4T2YoYikpcmV0dXJuIGEuc3Vic3RyKGIubGVuZ3RoKX1mdW5jdGlvbiBIYShiKXt2YXIgYT1iLmluZGV4T2YoIiMiKTtyZXR1cm4tMT09YT9iOmIuc3Vic3RyKDAsYSl9ZnVuY3Rpb24gYmQoYil7cmV0dXJuIGIucmVwbGFjZSgvKCMuKyl8IyQvLCIkMSIpfWZ1bmN0aW9uIGJjKGIpe3JldHVybiBiLnN1YnN0cigwLEhhKGIpLmxhc3RJbmRleE9mKCIvIikrMSl9ZnVuY3Rpb24gY2MoYixhKXt0aGlzLiQkaHRtbDU9ITA7YT1hfHwiIjt2YXIgYz1iYyhiKTskYyhiLHRoaXMpO3RoaXMuJCRwYXJzZT1mdW5jdGlvbihhKXt2YXIgYj16YShjLGEpO2lmKCFGKGIpKXRocm93IEZiKCJpcHRocHJmeCIsYSxjKTsKK2FkKGIsdGhpcyk7dGhpcy4kJHBhdGh8fCh0aGlzLiQkcGF0aD0iLyIpO3RoaXMuJCRjb21wb3NlKCl9O3RoaXMuJCRjb21wb3NlPWZ1bmN0aW9uKCl7dmFyIGE9TmIodGhpcy4kJHNlYXJjaCksYj10aGlzLiQkaGFzaD8iIyIrcWIodGhpcy4kJGhhc2gpOiIiO3RoaXMuJCR1cmw9YWModGhpcy4kJHBhdGgpKyhhPyI/IithOiIiKStiO3RoaXMuJCRhYnNVcmw9Yyt0aGlzLiQkdXJsLnN1YnN0cigxKX07dGhpcy4kJHBhcnNlTGlua1VybD1mdW5jdGlvbihkLGUpe2lmKGUmJiIjIj09PWVbMF0pcmV0dXJuIHRoaXMuaGFzaChlLnNsaWNlKDEpKSwhMDt2YXIgZixnOyhmPXphKGIsZCkpIT09dD8oZz1mLGc9KGY9emEoYSxmKSkhPT10P2MrKHphKCIvIixmKXx8Zik6YitnKTooZj16YShjLGQpKSE9PXQ/Zz1jK2Y6Yz09ZCsiLyImJihnPWMpO2cmJnRoaXMuJCRwYXJzZShnKTtyZXR1cm4hIWd9fWZ1bmN0aW9uIGRjKGIsYSl7dmFyIGM9YmMoYik7JGMoYix0aGlzKTt0aGlzLiQkcGFyc2U9ZnVuY3Rpb24oZCl7ZD0KK3phKGIsZCl8fHphKGMsZCk7dmFyIGU7IiMiPT09ZC5jaGFyQXQoMCk/KGU9emEoYSxkKSxEKGUpJiYoZT1kKSk6ZT10aGlzLiQkaHRtbDU/ZDoiIjthZChlLHRoaXMpO2Q9dGhpcy4kJHBhdGg7dmFyIGY9L15cL1tBLVpdOihcLy4qKS87MD09PWUuaW5kZXhPZihiKSYmKGU9ZS5yZXBsYWNlKGIsIiIpKTtmLmV4ZWMoZSl8fChkPShlPWYuZXhlYyhkKSk/ZVsxXTpkKTt0aGlzLiQkcGF0aD1kO3RoaXMuJCRjb21wb3NlKCl9O3RoaXMuJCRjb21wb3NlPWZ1bmN0aW9uKCl7dmFyIGM9TmIodGhpcy4kJHNlYXJjaCksZT10aGlzLiQkaGFzaD8iIyIrcWIodGhpcy4kJGhhc2gpOiIiO3RoaXMuJCR1cmw9YWModGhpcy4kJHBhdGgpKyhjPyI/IitjOiIiKStlO3RoaXMuJCRhYnNVcmw9YisodGhpcy4kJHVybD9hK3RoaXMuJCR1cmw6IiIpfTt0aGlzLiQkcGFyc2VMaW5rVXJsPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIEhhKGIpPT1IYShhKT8odGhpcy4kJHBhcnNlKGEpLCEwKTohMX19ZnVuY3Rpb24gY2QoYiwKK2Epe3RoaXMuJCRodG1sNT0hMDtkYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGM9YmMoYik7dGhpcy4kJHBhcnNlTGlua1VybD1mdW5jdGlvbihkLGUpe2lmKGUmJiIjIj09PWVbMF0pcmV0dXJuIHRoaXMuaGFzaChlLnNsaWNlKDEpKSwhMDt2YXIgZixnO2I9PUhhKGQpP2Y9ZDooZz16YShjLGQpKT9mPWIrYStnOmM9PT1kKyIvIiYmKGY9Yyk7ZiYmdGhpcy4kJHBhcnNlKGYpO3JldHVybiEhZn07dGhpcy4kJGNvbXBvc2U9ZnVuY3Rpb24oKXt2YXIgYz1OYih0aGlzLiQkc2VhcmNoKSxlPXRoaXMuJCRoYXNoPyIjIitxYih0aGlzLiQkaGFzaCk6IiI7dGhpcy4kJHVybD1hYyh0aGlzLiQkcGF0aCkrKGM/Ij8iK2M6IiIpK2U7dGhpcy4kJGFic1VybD1iK2ErdGhpcy4kJHVybH19ZnVuY3Rpb24gR2IoYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbYl19fWZ1bmN0aW9uIGRkKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKEQoYykpcmV0dXJuIHRoaXNbYl07dGhpc1tiXT0KK2EoYyk7dGhpcy4kJGNvbXBvc2UoKTtyZXR1cm4gdGhpc319ZnVuY3Rpb24gTWUoKXt2YXIgYj0iIixhPXtlbmFibGVkOiExLHJlcXVpcmVCYXNlOiEwLHJld3JpdGVMaW5rczohMH07dGhpcy5oYXNoUHJlZml4PWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPyhiPWEsdGhpcyk6Yn07dGhpcy5odG1sNU1vZGU9ZnVuY3Rpb24oYil7cmV0dXJuIFdhKGIpPyhhLmVuYWJsZWQ9Yix0aGlzKTpIKGIpPyhXYShiLmVuYWJsZWQpJiYoYS5lbmFibGVkPWIuZW5hYmxlZCksV2EoYi5yZXF1aXJlQmFzZSkmJihhLnJlcXVpcmVCYXNlPWIucmVxdWlyZUJhc2UpLFdhKGIucmV3cml0ZUxpbmtzKSYmKGEucmV3cml0ZUxpbmtzPWIucmV3cml0ZUxpbmtzKSx0aGlzKTphfTt0aGlzLiRnZXQ9WyIkcm9vdFNjb3BlIiwiJGJyb3dzZXIiLCIkc25pZmZlciIsIiRyb290RWxlbWVudCIsIiR3aW5kb3ciLGZ1bmN0aW9uKGMsZCxlLGYsZyl7ZnVuY3Rpb24gaChhLGIsYyl7dmFyIGU9ay51cmwoKSxmPWsuJCRzdGF0ZTsKK3RyeXtkLnVybChhLGIsYyksay4kJHN0YXRlPWQuc3RhdGUoKX1jYXRjaChnKXt0aHJvdyBrLnVybChlKSxrLiQkc3RhdGU9ZixnO319ZnVuY3Rpb24gbChhLGIpe2MuJGJyb2FkY2FzdCgiJGxvY2F0aW9uQ2hhbmdlU3VjY2VzcyIsay5hYnNVcmwoKSxhLGsuJCRzdGF0ZSxiKX12YXIgayxtO209ZC5iYXNlSHJlZigpO3ZhciBwPWQudXJsKCkscTtpZihhLmVuYWJsZWQpe2lmKCFtJiZhLnJlcXVpcmVCYXNlKXRocm93IEZiKCJub2Jhc2UiKTtxPXAuc3Vic3RyaW5nKDAscC5pbmRleE9mKCIvIixwLmluZGV4T2YoIi8vIikrMikpKyhtfHwiLyIpO209ZS5oaXN0b3J5P2NjOmNkfWVsc2UgcT1IYShwKSxtPWRjO2s9bmV3IG0ocSwiIyIrYik7ay4kJHBhcnNlTGlua1VybChwLHApO2suJCRzdGF0ZT1kLnN0YXRlKCk7dmFyIHU9L15ccyooamF2YXNjcmlwdHxtYWlsdG8pOi9pO2Yub24oImNsaWNrIixmdW5jdGlvbihiKXtpZihhLnJld3JpdGVMaW5rcyYmIWIuY3RybEtleSYmIWIubWV0YUtleSYmCisyIT1iLndoaWNoKXtmb3IodmFyIGU9QihiLnRhcmdldCk7ImEiIT09dWEoZVswXSk7KWlmKGVbMF09PT1mWzBdfHwhKGU9ZS5wYXJlbnQoKSlbMF0pcmV0dXJuO3ZhciBoPWUucHJvcCgiaHJlZiIpLGw9ZS5hdHRyKCJocmVmIil8fGUuYXR0cigieGxpbms6aHJlZiIpO0goaCkmJiJbb2JqZWN0IFNWR0FuaW1hdGVkU3RyaW5nXSI9PT1oLnRvU3RyaW5nKCkmJihoPUJhKGguYW5pbVZhbCkuaHJlZik7dS50ZXN0KGgpfHwhaHx8ZS5hdHRyKCJ0YXJnZXQiKXx8Yi5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8IWsuJCRwYXJzZUxpbmtVcmwoaCxsKXx8KGIucHJldmVudERlZmF1bHQoKSxrLmFic1VybCgpIT1kLnVybCgpJiYoYy4kYXBwbHkoKSxnLmFuZ3VsYXJbImZmLTY4NDIwOC1wcmV2ZW50RGVmYXVsdCJdPSEwKSl9fSk7ay5hYnNVcmwoKSE9cCYmZC51cmwoay5hYnNVcmwoKSwhMCk7dmFyIHI9ITA7ZC5vblVybENoYW5nZShmdW5jdGlvbihhLGIpe2MuJGV2YWxBc3luYyhmdW5jdGlvbigpe3ZhciBkPQoray5hYnNVcmwoKSxlPWsuJCRzdGF0ZSxmO2suJCRwYXJzZShhKTtrLiQkc3RhdGU9YjtmPWMuJGJyb2FkY2FzdCgiJGxvY2F0aW9uQ2hhbmdlU3RhcnQiLGEsZCxiLGUpLmRlZmF1bHRQcmV2ZW50ZWQ7ay5hYnNVcmwoKT09PWEmJihmPyhrLiQkcGFyc2UoZCksay4kJHN0YXRlPWUsaChkLCExLGUpKToocj0hMSxsKGQsZSkpKX0pO2MuJCRwaGFzZXx8Yy4kZGlnZXN0KCl9KTtjLiR3YXRjaChmdW5jdGlvbigpe3ZhciBhPWJkKGQudXJsKCkpLGI9YmQoay5hYnNVcmwoKSksZj1kLnN0YXRlKCksZz1rLiQkcmVwbGFjZSxxPWEhPT1ifHxrLiQkaHRtbDUmJmUuaGlzdG9yeSYmZiE9PWsuJCRzdGF0ZTtpZihyfHxxKXI9ITEsYy4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7dmFyIGI9ay5hYnNVcmwoKSxkPWMuJGJyb2FkY2FzdCgiJGxvY2F0aW9uQ2hhbmdlU3RhcnQiLGIsYSxrLiQkc3RhdGUsZikuZGVmYXVsdFByZXZlbnRlZDtrLmFic1VybCgpPT09YiYmKGQ/KGsuJCRwYXJzZShhKSxrLiQkc3RhdGU9CitmKToocSYmaChiLGcsZj09PWsuJCRzdGF0ZT9udWxsOmsuJCRzdGF0ZSksbChhLGYpKSl9KTtrLiQkcmVwbGFjZT0hMX0pO3JldHVybiBrfV19ZnVuY3Rpb24gTmUoKXt2YXIgYj0hMCxhPXRoaXM7dGhpcy5kZWJ1Z0VuYWJsZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk/KGI9YSx0aGlzKTpifTt0aGlzLiRnZXQ9WyIkd2luZG93IixmdW5jdGlvbihjKXtmdW5jdGlvbiBkKGEpe2EgaW5zdGFuY2VvZiBFcnJvciYmKGEuc3RhY2s/YT1hLm1lc3NhZ2UmJi0xPT09YS5zdGFjay5pbmRleE9mKGEubWVzc2FnZSk/IkVycm9yOiAiK2EubWVzc2FnZSsiXG4iK2Euc3RhY2s6YS5zdGFjazphLnNvdXJjZVVSTCYmKGE9YS5tZXNzYWdlKyJcbiIrYS5zb3VyY2VVUkwrIjoiK2EubGluZSkpO3JldHVybiBhfWZ1bmN0aW9uIGUoYSl7dmFyIGI9Yy5jb25zb2xlfHx7fSxlPWJbYV18fGIubG9nfHxDO2E9ITE7dHJ5e2E9ISFlLmFwcGx5fWNhdGNoKGwpe31yZXR1cm4gYT9mdW5jdGlvbigpe3ZhciBhPQorW107cyhhcmd1bWVudHMsZnVuY3Rpb24oYil7YS5wdXNoKGQoYikpfSk7cmV0dXJuIGUuYXBwbHkoYixhKX06ZnVuY3Rpb24oYSxiKXtlKGEsbnVsbD09Yj8iIjpiKX19cmV0dXJue2xvZzplKCJsb2ciKSxpbmZvOmUoImluZm8iKSx3YXJuOmUoIndhcm4iKSxlcnJvcjplKCJlcnJvciIpLGRlYnVnOmZ1bmN0aW9uKCl7dmFyIGM9ZSgiZGVidWciKTtyZXR1cm4gZnVuY3Rpb24oKXtiJiZjLmFwcGx5KGEsYXJndW1lbnRzKX19KCl9fV19ZnVuY3Rpb24gc2EoYixhKXtpZigiX19kZWZpbmVHZXR0ZXJfXyI9PT1ifHwiX19kZWZpbmVTZXR0ZXJfXyI9PT1ifHwiX19sb29rdXBHZXR0ZXJfXyI9PT1ifHwiX19sb29rdXBTZXR0ZXJfXyI9PT1ifHwiX19wcm90b19fIj09PWIpdGhyb3cgbGEoImlzZWNmbGQiLGEpO3JldHVybiBifWZ1bmN0aW9uIHRhKGIsYSl7aWYoYil7aWYoYi5jb25zdHJ1Y3Rvcj09PWIpdGhyb3cgbGEoImlzZWNmbiIsYSk7aWYoYi53aW5kb3c9PT1iKXRocm93IGxhKCJpc2Vjd2luZG93IiwKK2EpO2lmKGIuY2hpbGRyZW4mJihiLm5vZGVOYW1lfHxiLnByb3AmJmIuYXR0ciYmYi5maW5kKSl0aHJvdyBsYSgiaXNlY2RvbSIsYSk7aWYoYj09PU9iamVjdCl0aHJvdyBsYSgiaXNlY29iaiIsYSk7fXJldHVybiBifWZ1bmN0aW9uIGVjKGIpe3JldHVybiBiLmNvbnN0YW50fWZ1bmN0aW9uIGdiKGIsYSxjLGQpe3RhKGIsZCk7YT1hLnNwbGl0KCIuIik7Zm9yKHZhciBlLGY9MDsxPGEubGVuZ3RoO2YrKyl7ZT1zYShhLnNoaWZ0KCksZCk7dmFyIGc9dGEoYltlXSxkKTtnfHwoZz17fSxiW2VdPWcpO2I9Z31lPXNhKGEuc2hpZnQoKSxkKTt0YShiW2VdLGQpO3JldHVybiBiW2VdPWN9ZnVuY3Rpb24gUWEoYil7cmV0dXJuImNvbnN0cnVjdG9yIj09Yn1mdW5jdGlvbiBlZChiLGEsYyxkLGUsZixnKXtzYShiLGYpO3NhKGEsZik7c2EoYyxmKTtzYShkLGYpO3NhKGUsZik7dmFyIGg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRhKGEsZil9LGw9Z3x8UWEoYik/aDpvYSxrPWd8fFFhKGEpP2g6b2EsbT0KK2d8fFFhKGMpP2g6b2EscD1nfHxRYShkKT9oOm9hLHE9Z3x8UWEoZSk/aDpvYTtyZXR1cm4gZnVuY3Rpb24oZixnKXt2YXIgaD1nJiZnLmhhc093blByb3BlcnR5KGIpP2c6ZjtpZihudWxsPT1oKXJldHVybiBoO2g9bChoW2JdKTtpZighYSlyZXR1cm4gaDtpZihudWxsPT1oKXJldHVybiB0O2g9ayhoW2FdKTtpZighYylyZXR1cm4gaDtpZihudWxsPT1oKXJldHVybiB0O2g9bShoW2NdKTtpZighZClyZXR1cm4gaDtpZihudWxsPT1oKXJldHVybiB0O2g9cChoW2RdKTtyZXR1cm4gZT9udWxsPT1oP3Q6aD1xKGhbZV0pOmh9fWZ1bmN0aW9uIHlmKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7cmV0dXJuIGIoYyxkLHRhLGEpfX1mdW5jdGlvbiB6ZihiLGEsYyl7dmFyIGQ9YS5leHBlbnNpdmVDaGVja3MsZT1kP0FmOkJmLGY9ZVtiXTtpZihmKXJldHVybiBmO3ZhciBnPWIuc3BsaXQoIi4iKSxoPWcubGVuZ3RoO2lmKGEuY3NwKWY9Nj5oP2VkKGdbMF0sZ1sxXSxnWzJdLGdbM10sZ1s0XSwKK2MsZCk6ZnVuY3Rpb24oYSxiKXt2YXIgZT0wLGY7ZG8gZj1lZChnW2UrK10sZ1tlKytdLGdbZSsrXSxnW2UrK10sZ1tlKytdLGMsZCkoYSxiKSxiPXQsYT1mO3doaWxlKGU8aCk7cmV0dXJuIGZ9O2Vsc2V7dmFyIGw9IiI7ZCYmKGwrPSJzID0gZXNvKHMsIGZlKTtcbmwgPSBlc28obCwgZmUpO1xuIik7dmFyIGs9ZDtzKGcsZnVuY3Rpb24oYSxiKXtzYShhLGMpO3ZhciBlPShiPyJzIjonKChsJiZsLmhhc093blByb3BlcnR5KCInK2ErJyIpKT9sOnMpJykrIi4iK2E7aWYoZHx8UWEoYSkpZT0iZXNvKCIrZSsiLCBmZSkiLGs9ITA7bCs9ImlmKHMgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbnM9IitlKyI7XG4ifSk7bCs9InJldHVybiBzOyI7YT1uZXcgRnVuY3Rpb24oInMiLCJsIiwiZXNvIiwiZmUiLGwpO2EudG9TdHJpbmc9ZGEobCk7ayYmKGE9eWYoYSxjKSk7Zj1hfWYuc2hhcmVkR2V0dGVyPSEwO2YuYXNzaWduPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGdiKGEsYixjLGIpfTtyZXR1cm4gZVtiXT0KK2Z9ZnVuY3Rpb24gZmMoYil7cmV0dXJuIEcoYi52YWx1ZU9mKT9iLnZhbHVlT2YoKTpDZi5jYWxsKGIpfWZ1bmN0aW9uIE9lKCl7dmFyIGI9aGEoKSxhPWhhKCk7dGhpcy4kZ2V0PVsiJGZpbHRlciIsIiRzbmlmZmVyIixmdW5jdGlvbihjLGQpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9YTthLnNoYXJlZEdldHRlciYmKGI9ZnVuY3Rpb24oYixjKXtyZXR1cm4gYShiLGMpfSxiLmxpdGVyYWw9YS5saXRlcmFsLGIuY29uc3RhbnQ9YS5jb25zdGFudCxiLmFzc2lnbj1hLmFzc2lnbik7cmV0dXJuIGJ9ZnVuY3Rpb24gZihhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyl7dmFyIGU9YVtjXTtlLmNvbnN0YW50fHwoZS5pbnB1dHM/ZihlLmlucHV0cyxiKTotMT09PWIuaW5kZXhPZihlKSYmYi5wdXNoKGUpKX1yZXR1cm4gYn1mdW5jdGlvbiBnKGEsYil7cmV0dXJuIG51bGw9PWF8fG51bGw9PWI/YT09PWI6Im9iamVjdCI9PT10eXBlb2YgYSYmKGE9ZmMoYSksIm9iamVjdCI9PT10eXBlb2YgYSk/CishMTphPT09Ynx8YSE9PWEmJmIhPT1ifWZ1bmN0aW9uIGgoYSxiLGMsZCl7dmFyIGU9ZC4kJGlucHV0c3x8KGQuJCRpbnB1dHM9ZihkLmlucHV0cyxbXSkpLGg7aWYoMT09PWUubGVuZ3RoKXt2YXIgbD1nLGU9ZVswXTtyZXR1cm4gYS4kd2F0Y2goZnVuY3Rpb24oYSl7dmFyIGI9ZShhKTtnKGIsbCl8fChoPWQoYSksbD1iJiZmYyhiKSk7cmV0dXJuIGh9LGIsYyl9Zm9yKHZhciBrPVtdLHE9MCxwPWUubGVuZ3RoO3E8cDtxKyspa1txXT1nO3JldHVybiBhLiR3YXRjaChmdW5jdGlvbihhKXtmb3IodmFyIGI9ITEsYz0wLGY9ZS5sZW5ndGg7YzxmO2MrKyl7dmFyIGw9ZVtjXShhKTtpZihifHwoYj0hZyhsLGtbY10pKSlrW2NdPWwmJmZjKGwpfWImJihoPWQoYSkpO3JldHVybiBofSxiLGMpfWZ1bmN0aW9uIGwoYSxiLGMsZCl7dmFyIGUsZjtyZXR1cm4gZT1hLiR3YXRjaChmdW5jdGlvbihhKXtyZXR1cm4gZChhKX0sZnVuY3Rpb24oYSxjLGQpe2Y9YTtHKGIpJiZiLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsKK3koYSkmJmQuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uKCl7eShmKSYmZSgpfSl9LGMpfWZ1bmN0aW9uIGsoYSxiLGMsZCl7ZnVuY3Rpb24gZShhKXt2YXIgYj0hMDtzKGEsZnVuY3Rpb24oYSl7eShhKXx8KGI9ITEpfSk7cmV0dXJuIGJ9dmFyIGYsZztyZXR1cm4gZj1hLiR3YXRjaChmdW5jdGlvbihhKXtyZXR1cm4gZChhKX0sZnVuY3Rpb24oYSxjLGQpe2c9YTtHKGIpJiZiLmNhbGwodGhpcyxhLGMsZCk7ZShhKSYmZC4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKXtlKGcpJiZmKCl9KX0sYyl9ZnVuY3Rpb24gbShhLGIsYyxkKXt2YXIgZTtyZXR1cm4gZT1hLiR3YXRjaChmdW5jdGlvbihhKXtyZXR1cm4gZChhKX0sZnVuY3Rpb24oYSxjLGQpe0coYikmJmIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2UoKX0sYyl9ZnVuY3Rpb24gcChhLGIpe2lmKCFiKXJldHVybiBhO3ZhciBjPWEuJCR3YXRjaERlbGVnYXRlLGM9YyE9PWsmJmMhPT1sP2Z1bmN0aW9uKGMsZCl7dmFyIGU9YShjLGQpO3JldHVybiBiKGUsCitjLGQpfTpmdW5jdGlvbihjLGQpe3ZhciBlPWEoYyxkKSxmPWIoZSxjLGQpO3JldHVybiB5KGUpP2Y6ZX07YS4kJHdhdGNoRGVsZWdhdGUmJmEuJCR3YXRjaERlbGVnYXRlIT09aD9jLiQkd2F0Y2hEZWxlZ2F0ZT1hLiQkd2F0Y2hEZWxlZ2F0ZTpiLiRzdGF0ZWZ1bHx8KGMuJCR3YXRjaERlbGVnYXRlPWgsYy5pbnB1dHM9W2FdKTtyZXR1cm4gY312YXIgcT17Y3NwOmQuY3NwLGV4cGVuc2l2ZUNoZWNrczohMX0sdT17Y3NwOmQuY3NwLGV4cGVuc2l2ZUNoZWNrczohMH07cmV0dXJuIGZ1bmN0aW9uKGQsZixnKXt2YXIgdix3LEw7c3dpdGNoKHR5cGVvZiBkKXtjYXNlICJzdHJpbmciOkw9ZD1kLnRyaW0oKTt2YXIgSj1nP2E6Yjt2PUpbTF07dnx8KCI6Ij09PWQuY2hhckF0KDApJiYiOiI9PT1kLmNoYXJBdCgxKSYmKHc9ITAsZD1kLnN1YnN0cmluZygyKSksZz1nP3U6cSx2PW5ldyBnYyhnKSx2PShuZXcgaGIodixjLGcpKS5wYXJzZShkKSx2LmNvbnN0YW50P3YuJCR3YXRjaERlbGVnYXRlPQorbTp3Pyh2PWUodiksdi4kJHdhdGNoRGVsZWdhdGU9di5saXRlcmFsP2s6bCk6di5pbnB1dHMmJih2LiQkd2F0Y2hEZWxlZ2F0ZT1oKSxKW0xdPXYpO3JldHVybiBwKHYsZik7Y2FzZSAiZnVuY3Rpb24iOnJldHVybiBwKGQsZik7ZGVmYXVsdDpyZXR1cm4gcChDLGYpfX19XX1mdW5jdGlvbiBRZSgpe3RoaXMuJGdldD1bIiRyb290U2NvcGUiLCIkZXhjZXB0aW9uSGFuZGxlciIsZnVuY3Rpb24oYixhKXtyZXR1cm4gZmQoZnVuY3Rpb24oYSl7Yi4kZXZhbEFzeW5jKGEpfSxhKX1dfWZ1bmN0aW9uIFJlKCl7dGhpcy4kZ2V0PVsiJGJyb3dzZXIiLCIkZXhjZXB0aW9uSGFuZGxlciIsZnVuY3Rpb24oYixhKXtyZXR1cm4gZmQoZnVuY3Rpb24oYSl7Yi5kZWZlcihhKX0sYSl9XX1mdW5jdGlvbiBmZChiLGEpe2Z1bmN0aW9uIGMoYSxiLGMpe2Z1bmN0aW9uIGQoYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2V8fChlPSEwLGIuY2FsbChhLGMpKX19dmFyIGU9ITE7cmV0dXJuW2QoYiksZChjKV19ZnVuY3Rpb24gZCgpe3RoaXMuJCRzdGF0ZT0KK3tzdGF0dXM6MH19ZnVuY3Rpb24gZShhLGIpe3JldHVybiBmdW5jdGlvbihjKXtiLmNhbGwoYSxjKX19ZnVuY3Rpb24gZihjKXshYy5wcm9jZXNzU2NoZWR1bGVkJiZjLnBlbmRpbmcmJihjLnByb2Nlc3NTY2hlZHVsZWQ9ITAsYihmdW5jdGlvbigpe3ZhciBiLGQsZTtlPWMucGVuZGluZztjLnByb2Nlc3NTY2hlZHVsZWQ9ITE7Yy5wZW5kaW5nPXQ7Zm9yKHZhciBmPTAsZz1lLmxlbmd0aDtmPGc7KytmKXtkPWVbZl1bMF07Yj1lW2ZdW2Muc3RhdHVzXTt0cnl7RyhiKT9kLnJlc29sdmUoYihjLnZhbHVlKSk6MT09PWMuc3RhdHVzP2QucmVzb2x2ZShjLnZhbHVlKTpkLnJlamVjdChjLnZhbHVlKX1jYXRjaChoKXtkLnJlamVjdChoKSxhKGgpfX19KSl9ZnVuY3Rpb24gZygpe3RoaXMucHJvbWlzZT1uZXcgZDt0aGlzLnJlc29sdmU9ZSh0aGlzLHRoaXMucmVzb2x2ZSk7dGhpcy5yZWplY3Q9ZSh0aGlzLHRoaXMucmVqZWN0KTt0aGlzLm5vdGlmeT1lKHRoaXMsdGhpcy5ub3RpZnkpfXZhciBoPQorVCgiJHEiLFR5cGVFcnJvcik7ZC5wcm90b3R5cGU9e3RoZW46ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW5ldyBnO3RoaXMuJCRzdGF0ZS5wZW5kaW5nPXRoaXMuJCRzdGF0ZS5wZW5kaW5nfHxbXTt0aGlzLiQkc3RhdGUucGVuZGluZy5wdXNoKFtkLGEsYixjXSk7MDx0aGlzLiQkc3RhdGUuc3RhdHVzJiZmKHRoaXMuJCRzdGF0ZSk7cmV0dXJuIGQucHJvbWlzZX0sImNhdGNoIjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9LCJmaW5hbGx5IjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oYil7cmV0dXJuIGsoYiwhMCxhKX0sZnVuY3Rpb24oYil7cmV0dXJuIGsoYiwhMSxhKX0sYil9fTtnLnByb3RvdHlwZT17cmVzb2x2ZTpmdW5jdGlvbihhKXt0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXN8fChhPT09dGhpcy5wcm9taXNlP3RoaXMuJCRyZWplY3QoaCgicWN5Y2xlIixhKSk6dGhpcy4kJHJlc29sdmUoYSkpfSwkJHJlc29sdmU6ZnVuY3Rpb24oYil7dmFyIGQsCitlO2U9Yyh0aGlzLHRoaXMuJCRyZXNvbHZlLHRoaXMuJCRyZWplY3QpO3RyeXtpZihIKGIpfHxHKGIpKWQ9YiYmYi50aGVuO0coZCk/KHRoaXMucHJvbWlzZS4kJHN0YXRlLnN0YXR1cz0tMSxkLmNhbGwoYixlWzBdLGVbMV0sdGhpcy5ub3RpZnkpKToodGhpcy5wcm9taXNlLiQkc3RhdGUudmFsdWU9Yix0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXM9MSxmKHRoaXMucHJvbWlzZS4kJHN0YXRlKSl9Y2F0Y2goZyl7ZVsxXShnKSxhKGcpfX0scmVqZWN0OmZ1bmN0aW9uKGEpe3RoaXMucHJvbWlzZS4kJHN0YXRlLnN0YXR1c3x8dGhpcy4kJHJlamVjdChhKX0sJCRyZWplY3Q6ZnVuY3Rpb24oYSl7dGhpcy5wcm9taXNlLiQkc3RhdGUudmFsdWU9YTt0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXM9MjtmKHRoaXMucHJvbWlzZS4kJHN0YXRlKX0sbm90aWZ5OmZ1bmN0aW9uKGMpe3ZhciBkPXRoaXMucHJvbWlzZS4kJHN0YXRlLnBlbmRpbmc7MD49dGhpcy5wcm9taXNlLiQkc3RhdGUuc3RhdHVzJiYKK2QmJmQubGVuZ3RoJiZiKGZ1bmN0aW9uKCl7Zm9yKHZhciBiLGUsZj0wLGc9ZC5sZW5ndGg7ZjxnO2YrKyl7ZT1kW2ZdWzBdO2I9ZFtmXVszXTt0cnl7ZS5ub3RpZnkoRyhiKT9iKGMpOmMpfWNhdGNoKGgpe2EoaCl9fX0pfX07dmFyIGw9ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgZztiP2MucmVzb2x2ZShhKTpjLnJlamVjdChhKTtyZXR1cm4gYy5wcm9taXNlfSxrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1udWxsO3RyeXtHKGMpJiYoZD1jKCkpfWNhdGNoKGUpe3JldHVybiBsKGUsITEpfXJldHVybiBkJiZHKGQudGhlbik/ZC50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGwoYSxiKX0sZnVuY3Rpb24oYSl7cmV0dXJuIGwoYSwhMSl9KTpsKGEsYil9LG09ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bmV3IGc7ZS5yZXNvbHZlKGEpO3JldHVybiBlLnByb21pc2UudGhlbihiLGMsZCl9LHA9ZnVuY3Rpb24gdShhKXtpZighRyhhKSl0aHJvdyBoKCJub3JzbHZyIixhKTtpZighKHRoaXMgaW5zdGFuY2VvZgordSkpcmV0dXJuIG5ldyB1KGEpO3ZhciBiPW5ldyBnO2EoZnVuY3Rpb24oYSl7Yi5yZXNvbHZlKGEpfSxmdW5jdGlvbihhKXtiLnJlamVjdChhKX0pO3JldHVybiBiLnByb21pc2V9O3AuZGVmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGd9O3AucmVqZWN0PWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBnO2IucmVqZWN0KGEpO3JldHVybiBiLnByb21pc2V9O3Aud2hlbj1tO3AuYWxsPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBnLGM9MCxkPXgoYSk/W106e307cyhhLGZ1bmN0aW9uKGEsZSl7YysrO20oYSkudGhlbihmdW5jdGlvbihhKXtkLmhhc093blByb3BlcnR5KGUpfHwoZFtlXT1hLC0tY3x8Yi5yZXNvbHZlKGQpKX0sZnVuY3Rpb24oYSl7ZC5oYXNPd25Qcm9wZXJ0eShlKXx8Yi5yZWplY3QoYSl9KX0pOzA9PT1jJiZiLnJlc29sdmUoZCk7cmV0dXJuIGIucHJvbWlzZX07cmV0dXJuIHB9ZnVuY3Rpb24gJGUoKXt0aGlzLiRnZXQ9WyIkd2luZG93IiwiJHRpbWVvdXQiLGZ1bmN0aW9uKGIsCithKXt2YXIgYz1iLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8Yi53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUsZD1iLmNhbmNlbEFuaW1hdGlvbkZyYW1lfHxiLndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lfHxiLndlYmtpdENhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSxlPSEhYyxmPWU/ZnVuY3Rpb24oYSl7dmFyIGI9YyhhKTtyZXR1cm4gZnVuY3Rpb24oKXtkKGIpfX06ZnVuY3Rpb24oYil7dmFyIGM9YShiLDE2LjY2LCExKTtyZXR1cm4gZnVuY3Rpb24oKXthLmNhbmNlbChjKX19O2Yuc3VwcG9ydGVkPWU7cmV0dXJuIGZ9XX1mdW5jdGlvbiBQZSgpe3ZhciBiPTEwLGE9VCgiJHJvb3RTY29wZSIpLGM9bnVsbCxkPW51bGw7dGhpcy5kaWdlc3RUdGw9ZnVuY3Rpb24oYSl7YXJndW1lbnRzLmxlbmd0aCYmKGI9YSk7cmV0dXJuIGJ9O3RoaXMuJGdldD1bIiRpbmplY3RvciIsIiRleGNlcHRpb25IYW5kbGVyIiwiJHBhcnNlIiwiJGJyb3dzZXIiLGZ1bmN0aW9uKGUsZixnLGgpe2Z1bmN0aW9uIGwoKXt0aGlzLiRpZD0KKysrbmI7dGhpcy4kJHBoYXNlPXRoaXMuJHBhcmVudD10aGlzLiQkd2F0Y2hlcnM9dGhpcy4kJG5leHRTaWJsaW5nPXRoaXMuJCRwcmV2U2libGluZz10aGlzLiQkY2hpbGRIZWFkPXRoaXMuJCRjaGlsZFRhaWw9bnVsbDt0aGlzLiRyb290PXRoaXM7dGhpcy4kJGRlc3Ryb3llZD0hMTt0aGlzLiQkbGlzdGVuZXJzPXt9O3RoaXMuJCRsaXN0ZW5lckNvdW50PXt9O3RoaXMuJCRpc29sYXRlQmluZGluZ3M9bnVsbH1mdW5jdGlvbiBrKGIpe2lmKHIuJCRwaGFzZSl0aHJvdyBhKCJpbnByb2ciLHIuJCRwaGFzZSk7ci4kJHBoYXNlPWJ9ZnVuY3Rpb24gbShhLGIsYyl7ZG8gYS4kJGxpc3RlbmVyQ291bnRbY10tPWIsMD09PWEuJCRsaXN0ZW5lckNvdW50W2NdJiZkZWxldGUgYS4kJGxpc3RlbmVyQ291bnRbY107d2hpbGUoYT1hLiRwYXJlbnQpfWZ1bmN0aW9uIHAoKXt9ZnVuY3Rpb24gcSgpe2Zvcig7di5sZW5ndGg7KXRyeXt2LnNoaWZ0KCkoKX1jYXRjaChhKXtmKGEpfWQ9bnVsbH1mdW5jdGlvbiB1KCl7bnVsbD09PQorZCYmKGQ9aC5kZWZlcihmdW5jdGlvbigpe3IuJGFwcGx5KHEpfSkpfWwucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpsLCRuZXc6ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKCl7ZC4kJGRlc3Ryb3llZD0hMH12YXIgZDtiPWJ8fHRoaXM7YT8oZD1uZXcgbCxkLiRyb290PXRoaXMuJHJvb3QpOih0aGlzLiQkQ2hpbGRTY29wZXx8KHRoaXMuJCRDaGlsZFNjb3BlPWZ1bmN0aW9uKCl7dGhpcy4kJHdhdGNoZXJzPXRoaXMuJCRuZXh0U2libGluZz10aGlzLiQkY2hpbGRIZWFkPXRoaXMuJCRjaGlsZFRhaWw9bnVsbDt0aGlzLiQkbGlzdGVuZXJzPXt9O3RoaXMuJCRsaXN0ZW5lckNvdW50PXt9O3RoaXMuJGlkPSsrbmI7dGhpcy4kJENoaWxkU2NvcGU9bnVsbH0sdGhpcy4kJENoaWxkU2NvcGUucHJvdG90eXBlPXRoaXMpLGQ9bmV3IHRoaXMuJCRDaGlsZFNjb3BlKTtkLiRwYXJlbnQ9YjtkLiQkcHJldlNpYmxpbmc9Yi4kJGNoaWxkVGFpbDtiLiQkY2hpbGRIZWFkPyhiLiQkY2hpbGRUYWlsLiQkbmV4dFNpYmxpbmc9CitkLGIuJCRjaGlsZFRhaWw9ZCk6Yi4kJGNoaWxkSGVhZD1iLiQkY2hpbGRUYWlsPWQ7KGF8fGIhPXRoaXMpJiZkLiRvbigiJGRlc3Ryb3kiLGMpO3JldHVybiBkfSwkd2F0Y2g6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWcoYSk7aWYoZS4kJHdhdGNoRGVsZWdhdGUpcmV0dXJuIGUuJCR3YXRjaERlbGVnYXRlKHRoaXMsYixkLGUpO3ZhciBmPXRoaXMuJCR3YXRjaGVycyxoPXtmbjpiLGxhc3Q6cCxnZXQ6ZSxleHA6YSxlcTohIWR9O2M9bnVsbDtHKGIpfHwoaC5mbj1DKTtmfHwoZj10aGlzLiQkd2F0Y2hlcnM9W10pO2YudW5zaGlmdChoKTtyZXR1cm4gZnVuY3Rpb24oKXtYYShmLGgpO2M9bnVsbH19LCR3YXRjaEdyb3VwOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe2g9ITE7bD8obD0hMSxiKGUsZSxnKSk6YihlLGQsZyl9dmFyIGQ9QXJyYXkoYS5sZW5ndGgpLGU9QXJyYXkoYS5sZW5ndGgpLGY9W10sZz10aGlzLGg9ITEsbD0hMDtpZighYS5sZW5ndGgpe3ZhciBrPSEwO2cuJGV2YWxBc3luYyhmdW5jdGlvbigpe2smJgorYihlLGUsZyl9KTtyZXR1cm4gZnVuY3Rpb24oKXtrPSExfX1pZigxPT09YS5sZW5ndGgpcmV0dXJuIHRoaXMuJHdhdGNoKGFbMF0sZnVuY3Rpb24oYSxjLGYpe2VbMF09YTtkWzBdPWM7YihlLGE9PT1jP2U6ZCxmKX0pO3MoYSxmdW5jdGlvbihhLGIpe3ZhciBsPWcuJHdhdGNoKGEsZnVuY3Rpb24oYSxmKXtlW2JdPWE7ZFtiXT1mO2h8fChoPSEwLGcuJGV2YWxBc3luYyhjKSl9KTtmLnB1c2gobCl9KTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IoO2YubGVuZ3RoOylmLnNoaWZ0KCkoKX19LCR3YXRjaENvbGxlY3Rpb246ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2U9YTt2YXIgYixkLGcsaDtpZighRChlKSl7aWYoSChlKSlpZihUYShlKSlmb3IoZiE9PXEmJihmPXEsdT1mLmxlbmd0aD0wLGsrKyksYT1lLmxlbmd0aCx1IT09YSYmKGsrKyxmLmxlbmd0aD11PWEpLGI9MDtiPGE7YisrKWg9ZltiXSxnPWVbYl0sZD1oIT09aCYmZyE9PWcsZHx8aD09PWd8fChrKyssZltiXT1nKTtlbHNle2YhPT0KK20mJihmPW09e30sdT0wLGsrKyk7YT0wO2ZvcihiIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShiKSYmKGErKyxnPWVbYl0saD1mW2JdLGIgaW4gZj8oZD1oIT09aCYmZyE9PWcsZHx8aD09PWd8fChrKyssZltiXT1nKSk6KHUrKyxmW2JdPWcsaysrKSk7aWYodT5hKWZvcihiIGluIGsrKyxmKWUuaGFzT3duUHJvcGVydHkoYil8fCh1LS0sZGVsZXRlIGZbYl0pfWVsc2UgZiE9PWUmJihmPWUsaysrKTtyZXR1cm4ga319Yy4kc3RhdGVmdWw9ITA7dmFyIGQ9dGhpcyxlLGYsaCxsPTE8Yi5sZW5ndGgsaz0wLHA9ZyhhLGMpLHE9W10sbT17fSxuPSEwLHU9MDtyZXR1cm4gdGhpcy4kd2F0Y2gocCxmdW5jdGlvbigpe24/KG49ITEsYihlLGUsZCkpOmIoZSxoLGQpO2lmKGwpaWYoSChlKSlpZihUYShlKSl7aD1BcnJheShlLmxlbmd0aCk7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspaFthXT1lW2FdfWVsc2UgZm9yKGEgaW4gaD17fSxlKXJjLmNhbGwoZSxhKSYmKGhbYV09ZVthXSk7ZWxzZSBoPQorZX0pfSwkZGlnZXN0OmZ1bmN0aW9uKCl7dmFyIGUsZyxsLG0sdSx2LHM9Yix0LFc9W10seSxJO2soIiRkaWdlc3QiKTtoLiQkY2hlY2tVcmxDaGFuZ2UoKTt0aGlzPT09ciYmbnVsbCE9PWQmJihoLmRlZmVyLmNhbmNlbChkKSxxKCkpO2M9bnVsbDtkb3t2PSExO2Zvcih0PXRoaXM7Ty5sZW5ndGg7KXt0cnl7ST1PLnNoaWZ0KCksSS5zY29wZS4kZXZhbChJLmV4cHJlc3Npb24sSS5sb2NhbHMpfWNhdGNoKEIpe2YoQil9Yz1udWxsfWE6ZG97aWYobT10LiQkd2F0Y2hlcnMpZm9yKHU9bS5sZW5ndGg7dS0tOyl0cnl7aWYoZT1tW3VdKWlmKChnPWUuZ2V0KHQpKSE9PShsPWUubGFzdCkmJiEoZS5lcT9mYShnLGwpOiJudW1iZXIiPT09dHlwZW9mIGcmJiJudW1iZXIiPT09dHlwZW9mIGwmJmlzTmFOKGcpJiZpc05hTihsKSkpdj0hMCxjPWUsZS5sYXN0PWUuZXE/RWEoZyxudWxsKTpnLGUuZm4oZyxsPT09cD9nOmwsdCksNT5zJiYoeT00LXMsV1t5XXx8KFdbeV09W10pLFdbeV0ucHVzaCh7bXNnOkcoZS5leHApPworImZuOiAiKyhlLmV4cC5uYW1lfHxlLmV4cC50b1N0cmluZygpKTplLmV4cCxuZXdWYWw6ZyxvbGRWYWw6bH0pKTtlbHNlIGlmKGU9PT1jKXt2PSExO2JyZWFrIGF9fWNhdGNoKEQpe2YoRCl9aWYoIShtPXQuJCRjaGlsZEhlYWR8fHQhPT10aGlzJiZ0LiQkbmV4dFNpYmxpbmcpKWZvcig7dCE9PXRoaXMmJiEobT10LiQkbmV4dFNpYmxpbmcpOyl0PXQuJHBhcmVudH13aGlsZSh0PW0pO2lmKCh2fHxPLmxlbmd0aCkmJiFzLS0pdGhyb3cgci4kJHBoYXNlPW51bGwsYSgiaW5mZGlnIixiLFcpO313aGlsZSh2fHxPLmxlbmd0aCk7Zm9yKHIuJCRwaGFzZT1udWxsO24ubGVuZ3RoOyl0cnl7bi5zaGlmdCgpKCl9Y2F0Y2goY2Epe2YoY2EpfX0sJGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZighdGhpcy4kJGRlc3Ryb3llZCl7dmFyIGE9dGhpcy4kcGFyZW50O3RoaXMuJGJyb2FkY2FzdCgiJGRlc3Ryb3kiKTt0aGlzLiQkZGVzdHJveWVkPSEwO2lmKHRoaXMhPT1yKXtmb3IodmFyIGIgaW4gdGhpcy4kJGxpc3RlbmVyQ291bnQpbSh0aGlzLAordGhpcy4kJGxpc3RlbmVyQ291bnRbYl0sYik7YS4kJGNoaWxkSGVhZD09dGhpcyYmKGEuJCRjaGlsZEhlYWQ9dGhpcy4kJG5leHRTaWJsaW5nKTthLiQkY2hpbGRUYWlsPT10aGlzJiYoYS4kJGNoaWxkVGFpbD10aGlzLiQkcHJldlNpYmxpbmcpO3RoaXMuJCRwcmV2U2libGluZyYmKHRoaXMuJCRwcmV2U2libGluZy4kJG5leHRTaWJsaW5nPXRoaXMuJCRuZXh0U2libGluZyk7dGhpcy4kJG5leHRTaWJsaW5nJiYodGhpcy4kJG5leHRTaWJsaW5nLiQkcHJldlNpYmxpbmc9dGhpcy4kJHByZXZTaWJsaW5nKTt0aGlzLiRkZXN0cm95PXRoaXMuJGRpZ2VzdD10aGlzLiRhcHBseT10aGlzLiRldmFsQXN5bmM9dGhpcy4kYXBwbHlBc3luYz1DO3RoaXMuJG9uPXRoaXMuJHdhdGNoPXRoaXMuJHdhdGNoR3JvdXA9ZnVuY3Rpb24oKXtyZXR1cm4gQ307dGhpcy4kJGxpc3RlbmVycz17fTt0aGlzLiRwYXJlbnQ9dGhpcy4kJG5leHRTaWJsaW5nPXRoaXMuJCRwcmV2U2libGluZz10aGlzLiQkY2hpbGRIZWFkPQordGhpcy4kJGNoaWxkVGFpbD10aGlzLiRyb290PXRoaXMuJCR3YXRjaGVycz1udWxsfX19LCRldmFsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGcoYSkodGhpcyxiKX0sJGV2YWxBc3luYzpmdW5jdGlvbihhLGIpe3IuJCRwaGFzZXx8Ty5sZW5ndGh8fGguZGVmZXIoZnVuY3Rpb24oKXtPLmxlbmd0aCYmci4kZGlnZXN0KCl9KTtPLnB1c2goe3Njb3BlOnRoaXMsZXhwcmVzc2lvbjphLGxvY2FsczpifSl9LCQkcG9zdERpZ2VzdDpmdW5jdGlvbihhKXtuLnB1c2goYSl9LCRhcHBseTpmdW5jdGlvbihhKXt0cnl7cmV0dXJuIGsoIiRhcHBseSIpLHRoaXMuJGV2YWwoYSl9Y2F0Y2goYil7ZihiKX1maW5hbGx5e3IuJCRwaGFzZT1udWxsO3RyeXtyLiRkaWdlc3QoKX1jYXRjaChjKXt0aHJvdyBmKGMpLGM7fX19LCRhcHBseUFzeW5jOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtjLiRldmFsKGEpfXZhciBjPXRoaXM7YSYmdi5wdXNoKGIpO3UoKX0sJG9uOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy4kJGxpc3RlbmVyc1thXTsKK2N8fCh0aGlzLiQkbGlzdGVuZXJzW2FdPWM9W10pO2MucHVzaChiKTt2YXIgZD10aGlzO2RvIGQuJCRsaXN0ZW5lckNvdW50W2FdfHwoZC4kJGxpc3RlbmVyQ291bnRbYV09MCksZC4kJGxpc3RlbmVyQ291bnRbYV0rKzt3aGlsZShkPWQuJHBhcmVudCk7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLmluZGV4T2YoYik7LTEhPT1kJiYoY1tkXT1udWxsLG0oZSwxLGEpKX19LCRlbWl0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlPXRoaXMsZz0hMSxoPXtuYW1lOmEsdGFyZ2V0U2NvcGU6ZSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXtnPSEwfSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe2guZGVmYXVsdFByZXZlbnRlZD0hMH0sZGVmYXVsdFByZXZlbnRlZDohMX0sbD1ZYShbaF0sYXJndW1lbnRzLDEpLGsscDtkb3tkPWUuJCRsaXN0ZW5lcnNbYV18fGM7aC5jdXJyZW50U2NvcGU9ZTtrPTA7Zm9yKHA9ZC5sZW5ndGg7azxwO2srKylpZihkW2tdKXRyeXtkW2tdLmFwcGx5KG51bGwsCitsKX1jYXRjaChtKXtmKG0pfWVsc2UgZC5zcGxpY2UoaywxKSxrLS0scC0tO2lmKGcpcmV0dXJuIGguY3VycmVudFNjb3BlPW51bGwsaDtlPWUuJHBhcmVudH13aGlsZShlKTtoLmN1cnJlbnRTY29wZT1udWxsO3JldHVybiBofSwkYnJvYWRjYXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxkPXRoaXMsZT17bmFtZTphLHRhcmdldFNjb3BlOnRoaXMscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXtlLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9LGRlZmF1bHRQcmV2ZW50ZWQ6ITF9O2lmKCF0aGlzLiQkbGlzdGVuZXJDb3VudFthXSlyZXR1cm4gZTtmb3IodmFyIGc9WWEoW2VdLGFyZ3VtZW50cywxKSxoLGw7Yz1kOyl7ZS5jdXJyZW50U2NvcGU9YztkPWMuJCRsaXN0ZW5lcnNbYV18fFtdO2g9MDtmb3IobD1kLmxlbmd0aDtoPGw7aCsrKWlmKGRbaF0pdHJ5e2RbaF0uYXBwbHkobnVsbCxnKX1jYXRjaChrKXtmKGspfWVsc2UgZC5zcGxpY2UoaCwxKSxoLS0sbC0tO2lmKCEoZD1jLiQkbGlzdGVuZXJDb3VudFthXSYmCitjLiQkY2hpbGRIZWFkfHxjIT09dGhpcyYmYy4kJG5leHRTaWJsaW5nKSlmb3IoO2MhPT10aGlzJiYhKGQ9Yy4kJG5leHRTaWJsaW5nKTspYz1jLiRwYXJlbnR9ZS5jdXJyZW50U2NvcGU9bnVsbDtyZXR1cm4gZX19O3ZhciByPW5ldyBsLE89ci4kJGFzeW5jUXVldWU9W10sbj1yLiQkcG9zdERpZ2VzdFF1ZXVlPVtdLHY9ci4kJGFwcGx5QXN5bmNRdWV1ZT1bXTtyZXR1cm4gcn1dfWZ1bmN0aW9uIFNkKCl7dmFyIGI9L15ccyooaHR0cHM/fGZ0cHxtYWlsdG98dGVsfGZpbGUpOi8sYT0vXlxzKigoaHR0cHM/fGZ0cHxmaWxlfGJsb2IpOnxkYXRhOmltYWdlXC8pLzt0aGlzLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0PWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPyhiPWEsdGhpcyk6Yn07dGhpcy5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3Q9ZnVuY3Rpb24oYil7cmV0dXJuIHkoYik/KGE9Yix0aGlzKTphfTt0aGlzLiRnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oYyxkKXt2YXIgZT0KK2Q/YTpiLGY7Zj1CYShjKS5ocmVmO3JldHVybiIiPT09Znx8Zi5tYXRjaChlKT9jOiJ1bnNhZmU6IitmfX19ZnVuY3Rpb24gRGYoYil7aWYoInNlbGYiPT09YilyZXR1cm4gYjtpZihGKGIpKXtpZigtMTxiLmluZGV4T2YoIioqKiIpKXRocm93IENhKCJpd2NhcmQiLGIpO2I9Z2QoYikucmVwbGFjZSgiXFwqXFwqIiwiLioiKS5yZXBsYWNlKCJcXCoiLCJbXjovLj8mO10qIik7cmV0dXJuIG5ldyBSZWdFeHAoIl4iK2IrIiQiKX1pZihvYihiKSlyZXR1cm4gbmV3IFJlZ0V4cCgiXiIrYi5zb3VyY2UrIiQiKTt0aHJvdyBDYSgiaW1hdGNoZXIiKTt9ZnVuY3Rpb24gaGQoYil7dmFyIGE9W107eShiKSYmcyhiLGZ1bmN0aW9uKGIpe2EucHVzaChEZihiKSl9KTtyZXR1cm4gYX1mdW5jdGlvbiBUZSgpe3RoaXMuU0NFX0NPTlRFWFRTPW1hO3ZhciBiPVsic2VsZiJdLGE9W107dGhpcy5yZXNvdXJjZVVybFdoaXRlbGlzdD1mdW5jdGlvbihhKXthcmd1bWVudHMubGVuZ3RoJiYoYj1oZChhKSk7cmV0dXJuIGJ9OwordGhpcy5yZXNvdXJjZVVybEJsYWNrbGlzdD1mdW5jdGlvbihiKXthcmd1bWVudHMubGVuZ3RoJiYoYT1oZChiKSk7cmV0dXJuIGF9O3RoaXMuJGdldD1bIiRpbmplY3RvciIsZnVuY3Rpb24oYyl7ZnVuY3Rpb24gZChhLGIpe3JldHVybiJzZWxmIj09PWE/WmMoYik6ISFhLmV4ZWMoYi5ocmVmKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWZ1bmN0aW9uKGEpe3RoaXMuJCR1bndyYXBUcnVzdGVkVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gYX19O2EmJihiLnByb3RvdHlwZT1uZXcgYSk7Yi5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiQkdW53cmFwVHJ1c3RlZFZhbHVlKCl9O2IucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJCR1bndyYXBUcnVzdGVkVmFsdWUoKS50b1N0cmluZygpfTtyZXR1cm4gYn12YXIgZj1mdW5jdGlvbihhKXt0aHJvdyBDYSgidW5zYWZlIik7fTtjLmhhcygiJHNhbml0aXplIikmJihmPWMuZ2V0KCIkc2FuaXRpemUiKSk7Cit2YXIgZz1lKCksaD17fTtoW21hLkhUTUxdPWUoZyk7aFttYS5DU1NdPWUoZyk7aFttYS5VUkxdPWUoZyk7aFttYS5KU109ZShnKTtoW21hLlJFU09VUkNFX1VSTF09ZShoW21hLlVSTF0pO3JldHVybnt0cnVzdEFzOmZ1bmN0aW9uKGEsYil7dmFyIGM9aC5oYXNPd25Qcm9wZXJ0eShhKT9oW2FdOm51bGw7aWYoIWMpdGhyb3cgQ2EoImljb250ZXh0IixhLGIpO2lmKG51bGw9PT1ifHxiPT09dHx8IiI9PT1iKXJldHVybiBiO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdGhyb3cgQ2EoIml0eXBlIixhKTtyZXR1cm4gbmV3IGMoYil9LGdldFRydXN0ZWQ6ZnVuY3Rpb24oYyxlKXtpZihudWxsPT09ZXx8ZT09PXR8fCIiPT09ZSlyZXR1cm4gZTt2YXIgZz1oLmhhc093blByb3BlcnR5KGMpP2hbY106bnVsbDtpZihnJiZlIGluc3RhbmNlb2YgZylyZXR1cm4gZS4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpO2lmKGM9PT1tYS5SRVNPVVJDRV9VUkwpe3ZhciBnPUJhKGUudG9TdHJpbmcoKSkscCxxLHU9CishMTtwPTA7Zm9yKHE9Yi5sZW5ndGg7cDxxO3ArKylpZihkKGJbcF0sZykpe3U9ITA7YnJlYWt9aWYodSlmb3IocD0wLHE9YS5sZW5ndGg7cDxxO3ArKylpZihkKGFbcF0sZykpe3U9ITE7YnJlYWt9aWYodSlyZXR1cm4gZTt0aHJvdyBDYSgiaW5zZWN1cmwiLGUudG9TdHJpbmcoKSk7fWlmKGM9PT1tYS5IVE1MKXJldHVybiBmKGUpO3Rocm93IENhKCJ1bnNhZmUiKTt9LHZhbHVlT2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBnP2EuJCR1bndyYXBUcnVzdGVkVmFsdWUoKTphfX19XX1mdW5jdGlvbiBTZSgpe3ZhciBiPSEwO3RoaXMuZW5hYmxlZD1mdW5jdGlvbihhKXthcmd1bWVudHMubGVuZ3RoJiYoYj0hIWEpO3JldHVybiBifTt0aGlzLiRnZXQ9WyIkcGFyc2UiLCIkc2NlRGVsZWdhdGUiLGZ1bmN0aW9uKGEsYyl7aWYoYiYmOD5SYSl0aHJvdyBDYSgiaWVxdWlya3MiKTt2YXIgZD1xYShtYSk7ZC5pc0VuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gYn07ZC50cnVzdEFzPQorYy50cnVzdEFzO2QuZ2V0VHJ1c3RlZD1jLmdldFRydXN0ZWQ7ZC52YWx1ZU9mPWMudmFsdWVPZjtifHwoZC50cnVzdEFzPWQuZ2V0VHJ1c3RlZD1mdW5jdGlvbihhLGIpe3JldHVybiBifSxkLnZhbHVlT2Y9b2EpO2QucGFyc2VBcz1mdW5jdGlvbihiLGMpe3ZhciBlPWEoYyk7cmV0dXJuIGUubGl0ZXJhbCYmZS5jb25zdGFudD9lOmEoYyxmdW5jdGlvbihhKXtyZXR1cm4gZC5nZXRUcnVzdGVkKGIsYSl9KX07dmFyIGU9ZC5wYXJzZUFzLGY9ZC5nZXRUcnVzdGVkLGc9ZC50cnVzdEFzO3MobWEsZnVuY3Rpb24oYSxiKXt2YXIgYz1RKGIpO2RbY2IoInBhcnNlX2FzXyIrYyldPWZ1bmN0aW9uKGIpe3JldHVybiBlKGEsYil9O2RbY2IoImdldF90cnVzdGVkXyIrYyldPWZ1bmN0aW9uKGIpe3JldHVybiBmKGEsYil9O2RbY2IoInRydXN0X2FzXyIrYyldPWZ1bmN0aW9uKGIpe3JldHVybiBnKGEsYil9fSk7cmV0dXJuIGR9XX1mdW5jdGlvbiBVZSgpe3RoaXMuJGdldD1bIiR3aW5kb3ciLCIkZG9jdW1lbnQiLAorZnVuY3Rpb24oYixhKXt2YXIgYz17fSxkPWJhKCgvYW5kcm9pZCAoXGQrKS8uZXhlYyhRKChiLm5hdmlnYXRvcnx8e30pLnVzZXJBZ2VudCkpfHxbXSlbMV0pLGU9L0JveGVlL2kudGVzdCgoYi5uYXZpZ2F0b3J8fHt9KS51c2VyQWdlbnQpLGY9YVswXXx8e30sZyxoPS9eKE1venx3ZWJraXR8bXMpKD89W0EtWl0pLyxsPWYuYm9keSYmZi5ib2R5LnN0eWxlLGs9ITEsbT0hMTtpZihsKXtmb3IodmFyIHAgaW4gbClpZihrPWguZXhlYyhwKSl7Zz1rWzBdO2c9Zy5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpK2cuc3Vic3RyKDEpO2JyZWFrfWd8fChnPSJXZWJraXRPcGFjaXR5ImluIGwmJiJ3ZWJraXQiKTtrPSEhKCJ0cmFuc2l0aW9uImluIGx8fGcrIlRyYW5zaXRpb24iaW4gbCk7bT0hISgiYW5pbWF0aW9uImluIGx8fGcrIkFuaW1hdGlvbiJpbiBsKTshZHx8ayYmbXx8KGs9RihmLmJvZHkuc3R5bGUud2Via2l0VHJhbnNpdGlvbiksbT1GKGYuYm9keS5zdHlsZS53ZWJraXRBbmltYXRpb24pKX1yZXR1cm57aGlzdG9yeTohKCFiLmhpc3Rvcnl8fAorIWIuaGlzdG9yeS5wdXNoU3RhdGV8fDQ+ZHx8ZSksaGFzRXZlbnQ6ZnVuY3Rpb24oYSl7aWYoImlucHV0Ij09PWEmJjExPj1SYSlyZXR1cm4hMTtpZihEKGNbYV0pKXt2YXIgYj1mLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2NbYV09Im9uIithIGluIGJ9cmV0dXJuIGNbYV19LGNzcDphYigpLHZlbmRvclByZWZpeDpnLHRyYW5zaXRpb25zOmssYW5pbWF0aW9uczptLGFuZHJvaWQ6ZH19XX1mdW5jdGlvbiBXZSgpe3RoaXMuJGdldD1bIiR0ZW1wbGF0ZUNhY2hlIiwiJGh0dHAiLCIkcSIsZnVuY3Rpb24oYixhLGMpe2Z1bmN0aW9uIGQoZSxmKXtkLnRvdGFsUGVuZGluZ1JlcXVlc3RzKys7dmFyIGc9YS5kZWZhdWx0cyYmYS5kZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZTt4KGcpP2c9Zy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT1ZYn0pOmc9PT1ZYiYmKGc9bnVsbCk7cmV0dXJuIGEuZ2V0KGUse2NhY2hlOmIsdHJhbnNmb3JtUmVzcG9uc2U6Z30pLnRoZW4oZnVuY3Rpb24oYSl7ZC50b3RhbFBlbmRpbmdSZXF1ZXN0cy0tOworcmV0dXJuIGEuZGF0YX0sZnVuY3Rpb24oYSl7ZC50b3RhbFBlbmRpbmdSZXF1ZXN0cy0tO2lmKCFmKXRocm93IGphKCJ0cGxvYWQiLGUpO3JldHVybiBjLnJlamVjdChhKX0pfWQudG90YWxQZW5kaW5nUmVxdWVzdHM9MDtyZXR1cm4gZH1dfWZ1bmN0aW9uIFhlKCl7dGhpcy4kZ2V0PVsiJHJvb3RTY29wZSIsIiRicm93c2VyIiwiJGxvY2F0aW9uIixmdW5jdGlvbihiLGEsYyl7cmV0dXJue2ZpbmRCaW5kaW5nczpmdW5jdGlvbihhLGIsYyl7YT1hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm5nLWJpbmRpbmciKTt2YXIgZz1bXTtzKGEsZnVuY3Rpb24oYSl7dmFyIGQ9Z2EuZWxlbWVudChhKS5kYXRhKCIkYmluZGluZyIpO2QmJnMoZCxmdW5jdGlvbihkKXtjPyhuZXcgUmVnRXhwKCIoXnxcXHMpIitnZChiKSsiKFxcc3xcXHx8JCkiKSkudGVzdChkKSYmZy5wdXNoKGEpOi0xIT1kLmluZGV4T2YoYikmJmcucHVzaChhKX0pfSk7cmV0dXJuIGd9LGZpbmRNb2RlbHM6ZnVuY3Rpb24oYSxiLAorYyl7Zm9yKHZhciBnPVsibmctIiwiZGF0YS1uZy0iLCJuZ1xcOiJdLGg9MDtoPGcubGVuZ3RoOysraCl7dmFyIGw9YS5xdWVyeVNlbGVjdG9yQWxsKCJbIitnW2hdKyJtb2RlbCIrKGM/Ij0iOiIqPSIpKyciJytiKyciXScpO2lmKGwubGVuZ3RoKXJldHVybiBsfX0sZ2V0TG9jYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gYy51cmwoKX0sc2V0TG9jYXRpb246ZnVuY3Rpb24oYSl7YSE9PWMudXJsKCkmJihjLnVybChhKSxiLiRkaWdlc3QoKSl9LHdoZW5TdGFibGU6ZnVuY3Rpb24oYil7YS5ub3RpZnlXaGVuTm9PdXRzdGFuZGluZ1JlcXVlc3RzKGIpfX19XX1mdW5jdGlvbiBZZSgpe3RoaXMuJGdldD1bIiRyb290U2NvcGUiLCIkYnJvd3NlciIsIiRxIiwiJCRxIiwiJGV4Y2VwdGlvbkhhbmRsZXIiLGZ1bmN0aW9uKGIsYSxjLGQsZSl7ZnVuY3Rpb24gZihmLGwsayl7dmFyIG09eShrKSYmIWsscD0obT9kOmMpLmRlZmVyKCkscT1wLnByb21pc2U7bD1hLmRlZmVyKGZ1bmN0aW9uKCl7dHJ5e3AucmVzb2x2ZShmKCkpfWNhdGNoKGEpe3AucmVqZWN0KGEpLAorZShhKX1maW5hbGx5e2RlbGV0ZSBnW3EuJCR0aW1lb3V0SWRdfW18fGIuJGFwcGx5KCl9LGwpO3EuJCR0aW1lb3V0SWQ9bDtnW2xdPXA7cmV0dXJuIHF9dmFyIGc9e307Zi5jYW5jZWw9ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuJCR0aW1lb3V0SWQgaW4gZz8oZ1tiLiQkdGltZW91dElkXS5yZWplY3QoImNhbmNlbGVkIiksZGVsZXRlIGdbYi4kJHRpbWVvdXRJZF0sYS5kZWZlci5jYW5jZWwoYi4kJHRpbWVvdXRJZCkpOiExfTtyZXR1cm4gZn1dfWZ1bmN0aW9uIEJhKGIpe1JhJiYoWi5zZXRBdHRyaWJ1dGUoImhyZWYiLGIpLGI9Wi5ocmVmKTtaLnNldEF0dHJpYnV0ZSgiaHJlZiIsYik7cmV0dXJue2hyZWY6Wi5ocmVmLHByb3RvY29sOloucHJvdG9jb2w/Wi5wcm90b2NvbC5yZXBsYWNlKC86JC8sIiIpOiIiLGhvc3Q6Wi5ob3N0LHNlYXJjaDpaLnNlYXJjaD9aLnNlYXJjaC5yZXBsYWNlKC9eXD8vLCIiKToiIixoYXNoOlouaGFzaD9aLmhhc2gucmVwbGFjZSgvXiMvLCIiKToiIixob3N0bmFtZTpaLmhvc3RuYW1lLAorcG9ydDpaLnBvcnQscGF0aG5hbWU6Ii8iPT09Wi5wYXRobmFtZS5jaGFyQXQoMCk/Wi5wYXRobmFtZToiLyIrWi5wYXRobmFtZX19ZnVuY3Rpb24gWmMoYil7Yj1GKGIpP0JhKGIpOmI7cmV0dXJuIGIucHJvdG9jb2w9PT1pZC5wcm90b2NvbCYmYi5ob3N0PT09aWQuaG9zdH1mdW5jdGlvbiBaZSgpe3RoaXMuJGdldD1kYShNKX1mdW5jdGlvbiBEYyhiKXtmdW5jdGlvbiBhKGMsZCl7aWYoSChjKSl7dmFyIGU9e307cyhjLGZ1bmN0aW9uKGIsYyl7ZVtjXT1hKGMsYil9KTtyZXR1cm4gZX1yZXR1cm4gYi5mYWN0b3J5KGMrIkZpbHRlciIsZCl9dGhpcy5yZWdpc3Rlcj1hO3RoaXMuJGdldD1bIiRpbmplY3RvciIsZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBhLmdldChiKyJGaWx0ZXIiKX19XTthKCJjdXJyZW5jeSIsamQpO2EoImRhdGUiLGtkKTthKCJmaWx0ZXIiLEVmKTthKCJqc29uIixGZik7YSgibGltaXRUbyIsR2YpO2EoImxvd2VyY2FzZSIsSGYpO2EoIm51bWJlciIsCitsZCk7YSgib3JkZXJCeSIsbWQpO2EoInVwcGVyY2FzZSIsSWYpfWZ1bmN0aW9uIEVmKCl7cmV0dXJuIGZ1bmN0aW9uKGIsYSxjKXtpZigheChiKSlyZXR1cm4gYjt2YXIgZDtzd2l0Y2godHlwZW9mIGEpe2Nhc2UgImZ1bmN0aW9uIjpicmVhaztjYXNlICJib29sZWFuIjpjYXNlICJudW1iZXIiOmNhc2UgInN0cmluZyI6ZD0hMDtjYXNlICJvYmplY3QiOmE9SmYoYSxjLGQpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIGJ9cmV0dXJuIGIuZmlsdGVyKGEpfX1mdW5jdGlvbiBKZihiLGEsYyl7dmFyIGQ9SChiKSYmIiQiaW4gYjshMD09PWE/YT1mYTpHKGEpfHwoYT1mdW5jdGlvbihhLGIpe2lmKEgoYSl8fEgoYikpcmV0dXJuITE7YT1RKCIiK2EpO2I9USgiIitiKTtyZXR1cm4tMSE9PWEuaW5kZXhPZihiKX0pO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZCYmIUgoZSk/SWEoZSxiLiQsYSwhMSk6SWEoZSxiLGEsYyl9fWZ1bmN0aW9uIElhKGIsYSxjLGQsZSl7dmFyIGY9dHlwZW9mIGIsZz0KK3R5cGVvZiBhO2lmKCJzdHJpbmciPT09ZyYmIiEiPT09YS5jaGFyQXQoMCkpcmV0dXJuIUlhKGIsYS5zdWJzdHJpbmcoMSksYyxkKTtpZigiYXJyYXkiPT09ZilyZXR1cm4gYi5zb21lKGZ1bmN0aW9uKGIpe3JldHVybiBJYShiLGEsYyxkKX0pO3N3aXRjaChmKXtjYXNlICJvYmplY3QiOnZhciBoO2lmKGQpe2ZvcihoIGluIGIpaWYoIiQiIT09aC5jaGFyQXQoMCkmJklhKGJbaF0sYSxjLCEwKSlyZXR1cm4hMDtyZXR1cm4gZT8hMTpJYShiLGEsYywhMSl9aWYoIm9iamVjdCI9PT1nKXtmb3IoaCBpbiBhKWlmKGU9YVtoXSwhRyhlKSYmKGY9IiQiPT09aCwhSWEoZj9iOmJbaF0sZSxjLGYsZikpKXJldHVybiExO3JldHVybiEwfXJldHVybiBjKGIsYSk7Y2FzZSAiZnVuY3Rpb24iOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuIGMoYixhKX19ZnVuY3Rpb24gamQoYil7dmFyIGE9Yi5OVU1CRVJfRk9STUFUUztyZXR1cm4gZnVuY3Rpb24oYixkLGUpe0QoZCkmJihkPWEuQ1VSUkVOQ1lfU1lNKTsKK0QoZSkmJihlPWEuUEFUVEVSTlNbMV0ubWF4RnJhYyk7cmV0dXJuIG51bGw9PWI/YjpuZChiLGEuUEFUVEVSTlNbMV0sYS5HUk9VUF9TRVAsYS5ERUNJTUFMX1NFUCxlKS5yZXBsYWNlKC9cdTAwQTQvZyxkKX19ZnVuY3Rpb24gbGQoYil7dmFyIGE9Yi5OVU1CRVJfRk9STUFUUztyZXR1cm4gZnVuY3Rpb24oYixkKXtyZXR1cm4gbnVsbD09Yj9iOm5kKGIsYS5QQVRURVJOU1swXSxhLkdST1VQX1NFUCxhLkRFQ0lNQUxfU0VQLGQpfX1mdW5jdGlvbiBuZChiLGEsYyxkLGUpe2lmKCFpc0Zpbml0ZShiKXx8SChiKSlyZXR1cm4iIjt2YXIgZj0wPmI7Yj1NYXRoLmFicyhiKTt2YXIgZz1iKyIiLGg9IiIsbD1bXSxrPSExO2lmKC0xIT09Zy5pbmRleE9mKCJlIikpe3ZhciBtPWcubWF0Y2goLyhbXGRcLl0rKWUoLT8pKFxkKykvKTttJiYiLSI9PW1bMl0mJm1bM10+ZSsxP2I9MDooaD1nLGs9ITApfWlmKGspMDxlJiYxPmImJihoPWIudG9GaXhlZChlKSxiPXBhcnNlRmxvYXQoaCkpO2Vsc2V7Zz0KKyhnLnNwbGl0KG9kKVsxXXx8IiIpLmxlbmd0aDtEKGUpJiYoZT1NYXRoLm1pbihNYXRoLm1heChhLm1pbkZyYWMsZyksYS5tYXhGcmFjKSk7Yj0rKE1hdGgucm91bmQoKyhiLnRvU3RyaW5nKCkrImUiK2UpKS50b1N0cmluZygpKyJlIistZSk7dmFyIGc9KCIiK2IpLnNwbGl0KG9kKSxrPWdbMF0sZz1nWzFdfHwiIixwPTAscT1hLmxnU2l6ZSx1PWEuZ1NpemU7aWYoay5sZW5ndGg+PXErdSlmb3IocD1rLmxlbmd0aC1xLG09MDttPHA7bSsrKTA9PT0ocC1tKSV1JiYwIT09bSYmKGgrPWMpLGgrPWsuY2hhckF0KG0pO2ZvcihtPXA7bTxrLmxlbmd0aDttKyspMD09PShrLmxlbmd0aC1tKSVxJiYwIT09bSYmKGgrPWMpLGgrPWsuY2hhckF0KG0pO2Zvcig7Zy5sZW5ndGg8ZTspZys9IjAiO2UmJiIwIiE9PWUmJihoKz1kK2cuc3Vic3RyKDAsZSkpfTA9PT1iJiYoZj0hMSk7bC5wdXNoKGY/YS5uZWdQcmU6YS5wb3NQcmUsaCxmP2EubmVnU3VmOmEucG9zU3VmKTtyZXR1cm4gbC5qb2luKCIiKX0KK2Z1bmN0aW9uIEhiKGIsYSxjKXt2YXIgZD0iIjswPmImJihkPSItIixiPS1iKTtmb3IoYj0iIitiO2IubGVuZ3RoPGE7KWI9IjAiK2I7YyYmKGI9Yi5zdWJzdHIoYi5sZW5ndGgtYSkpO3JldHVybiBkK2J9ZnVuY3Rpb24gJChiLGEsYyxkKXtjPWN8fDA7cmV0dXJuIGZ1bmN0aW9uKGUpe2U9ZVsiZ2V0IitiXSgpO2lmKDA8Y3x8ZT4tYyllKz1jOzA9PT1lJiYtMTI9PWMmJihlPTEyKTtyZXR1cm4gSGIoZSxhLGQpfX1mdW5jdGlvbiBJYihiLGEpe3JldHVybiBmdW5jdGlvbihjLGQpe3ZhciBlPWNbImdldCIrYl0oKSxmPXViKGE/IlNIT1JUIitiOmIpO3JldHVybiBkW2ZdW2VdfX1mdW5jdGlvbiBwZChiKXt2YXIgYT0obmV3IERhdGUoYiwwLDEpKS5nZXREYXkoKTtyZXR1cm4gbmV3IERhdGUoYiwwLCg0Pj1hPzU6MTIpLWEpfWZ1bmN0aW9uIHFkKGIpe3JldHVybiBmdW5jdGlvbihhKXt2YXIgYz1wZChhLmdldEZ1bGxZZWFyKCkpO2E9K25ldyBEYXRlKGEuZ2V0RnVsbFllYXIoKSxhLmdldE1vbnRoKCksCithLmdldERhdGUoKSsoNC1hLmdldERheSgpKSktK2M7YT0xK01hdGgucm91bmQoYS82MDQ4RTUpO3JldHVybiBIYihhLGIpfX1mdW5jdGlvbiBrZChiKXtmdW5jdGlvbiBhKGEpe3ZhciBiO2lmKGI9YS5tYXRjaChjKSl7YT1uZXcgRGF0ZSgwKTt2YXIgZj0wLGc9MCxoPWJbOF0/YS5zZXRVVENGdWxsWWVhcjphLnNldEZ1bGxZZWFyLGw9Yls4XT9hLnNldFVUQ0hvdXJzOmEuc2V0SG91cnM7Yls5XSYmKGY9YmEoYls5XStiWzEwXSksZz1iYShiWzldK2JbMTFdKSk7aC5jYWxsKGEsYmEoYlsxXSksYmEoYlsyXSktMSxiYShiWzNdKSk7Zj1iYShiWzRdfHwwKS1mO2c9YmEoYls1XXx8MCktZztoPWJhKGJbNl18fDApO2I9TWF0aC5yb3VuZCgxRTMqcGFyc2VGbG9hdCgiMC4iKyhiWzddfHwwKSkpO2wuY2FsbChhLGYsZyxoLGIpfXJldHVybiBhfXZhciBjPS9eKFxkezR9KS0/KFxkXGQpLT8oXGRcZCkoPzpUKFxkXGQpKD86Oj8oXGRcZCkoPzo6PyhcZFxkKSg/OlwuKFxkKykpPyk/KT8oWnwoWystXSkoXGRcZCk6PyhcZFxkKSk/KT8kLzsKK3JldHVybiBmdW5jdGlvbihjLGUsZil7dmFyIGc9IiIsaD1bXSxsLGs7ZT1lfHwibWVkaXVtRGF0ZSI7ZT1iLkRBVEVUSU1FX0ZPUk1BVFNbZV18fGU7RihjKSYmKGM9S2YudGVzdChjKT9iYShjKTphKGMpKTtWKGMpJiYoYz1uZXcgRGF0ZShjKSk7aWYoIXBhKGMpKXJldHVybiBjO2Zvcig7ZTspKGs9TGYuZXhlYyhlKSk/KGg9WWEoaCxrLDEpLGU9aC5wb3AoKSk6KGgucHVzaChlKSxlPW51bGwpO2YmJiJVVEMiPT09ZiYmKGM9bmV3IERhdGUoYy5nZXRUaW1lKCkpLGMuc2V0TWludXRlcyhjLmdldE1pbnV0ZXMoKStjLmdldFRpbWV6b25lT2Zmc2V0KCkpKTtzKGgsZnVuY3Rpb24oYSl7bD1NZlthXTtnKz1sP2woYyxiLkRBVEVUSU1FX0ZPUk1BVFMpOmEucmVwbGFjZSgvKF4nfCckKS9nLCIiKS5yZXBsYWNlKC8nJy9nLCInIil9KTtyZXR1cm4gZ319ZnVuY3Rpb24gRmYoKXtyZXR1cm4gZnVuY3Rpb24oYixhKXtEKGEpJiYoYT0yKTtyZXR1cm4gJGEoYixhKX19ZnVuY3Rpb24gR2YoKXtyZXR1cm4gZnVuY3Rpb24oYiwKK2Epe1YoYikmJihiPWIudG9TdHJpbmcoKSk7aWYoIXgoYikmJiFGKGIpKXJldHVybiBiO2E9SW5maW5pdHk9PT1NYXRoLmFicyhOdW1iZXIoYSkpP051bWJlcihhKTpiYShhKTtpZihGKGIpKXJldHVybiBhPzA8PWE/Yi5zbGljZSgwLGEpOmIuc2xpY2UoYSxiLmxlbmd0aCk6IiI7dmFyIGMsZDthPmIubGVuZ3RoP2E9Yi5sZW5ndGg6YTwtYi5sZW5ndGgmJihhPS1iLmxlbmd0aCk7aWYoMDxhKWM9MCxkPWE7ZWxzZXtpZighYSlyZXR1cm5bXTtjPWIubGVuZ3RoK2E7ZD1iLmxlbmd0aH1yZXR1cm4gYi5zbGljZShjLGQpfX1mdW5jdGlvbiBtZChiKXtyZXR1cm4gZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYj9mdW5jdGlvbihiLGMpe3JldHVybiBhKGMsYil9OmF9ZnVuY3Rpb24gZihhKXtzd2l0Y2godHlwZW9mIGEpe2Nhc2UgIm51bWJlciI6Y2FzZSAiYm9vbGVhbiI6Y2FzZSAic3RyaW5nIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBnKGEpe3JldHVybiBudWxsPT09CithPyJudWxsIjoiZnVuY3Rpb24iPT09dHlwZW9mIGEudmFsdWVPZiYmKGE9YS52YWx1ZU9mKCksZihhKSl8fCJmdW5jdGlvbiI9PT10eXBlb2YgYS50b1N0cmluZyYmKGE9YS50b1N0cmluZygpLGYoYSkpP2E6IiJ9ZnVuY3Rpb24gaChhLGIpe3ZhciBjPXR5cGVvZiBhLGQ9dHlwZW9mIGI7Yz09PWQmJiJvYmplY3QiPT09YyYmKGE9ZyhhKSxiPWcoYikpO3JldHVybiBjPT09ZD8oInN0cmluZyI9PT1jJiYoYT1hLnRvTG93ZXJDYXNlKCksYj1iLnRvTG93ZXJDYXNlKCkpLGE9PT1iPzA6YTxiPy0xOjEpOmM8ZD8tMToxfWlmKCFUYShhKSlyZXR1cm4gYTtjPXgoYyk/YzpbY107MD09PWMubGVuZ3RoJiYoYz1bIisiXSk7Yz1jLm1hcChmdW5jdGlvbihhKXt2YXIgYz0hMSxkPWF8fG9hO2lmKEYoYSkpe2lmKCIrIj09YS5jaGFyQXQoMCl8fCItIj09YS5jaGFyQXQoMCkpYz0iLSI9PWEuY2hhckF0KDApLGE9YS5zdWJzdHJpbmcoMSk7aWYoIiI9PT1hKXJldHVybiBlKGgsYyk7ZD1iKGEpO2lmKGQuY29uc3RhbnQpe3ZhciBmPQorZCgpO3JldHVybiBlKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGgoYVtmXSxiW2ZdKX0sYyl9fXJldHVybiBlKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGgoZChhKSxkKGIpKX0sYyl9KTtyZXR1cm4gWmEuY2FsbChhKS5zb3J0KGUoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXShhLGIpO2lmKDAhPT1lKXJldHVybiBlfXJldHVybiAwfSxkKSl9fWZ1bmN0aW9uIEphKGIpe0coYikmJihiPXtsaW5rOmJ9KTtiLnJlc3RyaWN0PWIucmVzdHJpY3R8fCJBQyI7cmV0dXJuIGRhKGIpfWZ1bmN0aW9uIHJkKGIsYSxjLGQsZSl7dmFyIGY9dGhpcyxnPVtdLGg9Zi4kJHBhcmVudEZvcm09Yi5wYXJlbnQoKS5jb250cm9sbGVyKCJmb3JtIil8fEpiO2YuJGVycm9yPXt9O2YuJCRzdWNjZXNzPXt9O2YuJHBlbmRpbmc9dDtmLiRuYW1lPWUoYS5uYW1lfHxhLm5nRm9ybXx8IiIpKGMpO2YuJGRpcnR5PSExO2YuJHByaXN0aW5lPSEwO2YuJHZhbGlkPSEwO2YuJGludmFsaWQ9CishMTtmLiRzdWJtaXR0ZWQ9ITE7aC4kYWRkQ29udHJvbChmKTtmLiRyb2xsYmFja1ZpZXdWYWx1ZT1mdW5jdGlvbigpe3MoZyxmdW5jdGlvbihhKXthLiRyb2xsYmFja1ZpZXdWYWx1ZSgpfSl9O2YuJGNvbW1pdFZpZXdWYWx1ZT1mdW5jdGlvbigpe3MoZyxmdW5jdGlvbihhKXthLiRjb21taXRWaWV3VmFsdWUoKX0pfTtmLiRhZGRDb250cm9sPWZ1bmN0aW9uKGEpe01hKGEuJG5hbWUsImlucHV0Iik7Zy5wdXNoKGEpO2EuJG5hbWUmJihmW2EuJG5hbWVdPWEpfTtmLiQkcmVuYW1lQ29udHJvbD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuJG5hbWU7ZltjXT09PWEmJmRlbGV0ZSBmW2NdO2ZbYl09YTthLiRuYW1lPWJ9O2YuJHJlbW92ZUNvbnRyb2w9ZnVuY3Rpb24oYSl7YS4kbmFtZSYmZlthLiRuYW1lXT09PWEmJmRlbGV0ZSBmW2EuJG5hbWVdO3MoZi4kcGVuZGluZyxmdW5jdGlvbihiLGMpe2YuJHNldFZhbGlkaXR5KGMsbnVsbCxhKX0pO3MoZi4kZXJyb3IsZnVuY3Rpb24oYixjKXtmLiRzZXRWYWxpZGl0eShjLAorbnVsbCxhKX0pO1hhKGcsYSl9O3NkKHtjdHJsOnRoaXMsJGVsZW1lbnQ6YixzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWFbYl07ZD8tMT09PWQuaW5kZXhPZihjKSYmZC5wdXNoKGMpOmFbYl09W2NdfSx1bnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YVtiXTtkJiYoWGEoZCxjKSwwPT09ZC5sZW5ndGgmJmRlbGV0ZSBhW2JdKX0scGFyZW50Rm9ybTpoLCRhbmltYXRlOmR9KTtmLiRzZXREaXJ0eT1mdW5jdGlvbigpe2QucmVtb3ZlQ2xhc3MoYixTYSk7ZC5hZGRDbGFzcyhiLEtiKTtmLiRkaXJ0eT0hMDtmLiRwcmlzdGluZT0hMTtoLiRzZXREaXJ0eSgpfTtmLiRzZXRQcmlzdGluZT1mdW5jdGlvbigpe2Quc2V0Q2xhc3MoYixTYSxLYisiIG5nLXN1Ym1pdHRlZCIpO2YuJGRpcnR5PSExO2YuJHByaXN0aW5lPSEwO2YuJHN1Ym1pdHRlZD0hMTtzKGcsZnVuY3Rpb24oYSl7YS4kc2V0UHJpc3RpbmUoKX0pfTtmLiRzZXRVbnRvdWNoZWQ9ZnVuY3Rpb24oKXtzKGcsZnVuY3Rpb24oYSl7YS4kc2V0VW50b3VjaGVkKCl9KX07CitmLiRzZXRTdWJtaXR0ZWQ9ZnVuY3Rpb24oKXtkLmFkZENsYXNzKGIsIm5nLXN1Ym1pdHRlZCIpO2YuJHN1Ym1pdHRlZD0hMDtoLiRzZXRTdWJtaXR0ZWQoKX19ZnVuY3Rpb24gaGMoYil7Yi4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBiLiRpc0VtcHR5KGEpP2E6YS50b1N0cmluZygpfSl9ZnVuY3Rpb24gaWIoYixhLGMsZCxlLGYpe3ZhciBnPVEoYVswXS50eXBlKTtpZighZS5hbmRyb2lkKXt2YXIgaD0hMTthLm9uKCJjb21wb3NpdGlvbnN0YXJ0IixmdW5jdGlvbihhKXtoPSEwfSk7YS5vbigiY29tcG9zaXRpb25lbmQiLGZ1bmN0aW9uKCl7aD0hMTtsKCl9KX12YXIgbD1mdW5jdGlvbihiKXtrJiYoZi5kZWZlci5jYW5jZWwoayksaz1udWxsKTtpZighaCl7dmFyIGU9YS52YWwoKTtiPWImJmIudHlwZTsicGFzc3dvcmQiPT09Z3x8Yy5uZ1RyaW0mJiJmYWxzZSI9PT1jLm5nVHJpbXx8KGU9VShlKSk7KGQuJHZpZXdWYWx1ZSE9PWV8fCIiPT09ZSYmZC4kJGhhc05hdGl2ZVZhbGlkYXRvcnMpJiYKK2QuJHNldFZpZXdWYWx1ZShlLGIpfX07aWYoZS5oYXNFdmVudCgiaW5wdXQiKSlhLm9uKCJpbnB1dCIsbCk7ZWxzZXt2YXIgayxtPWZ1bmN0aW9uKGEsYixjKXtrfHwoaz1mLmRlZmVyKGZ1bmN0aW9uKCl7az1udWxsO2ImJmIudmFsdWU9PT1jfHxsKGEpfSkpfTthLm9uKCJrZXlkb3duIixmdW5jdGlvbihhKXt2YXIgYj1hLmtleUNvZGU7OTE9PT1ifHwxNTxiJiYxOT5ifHwzNzw9YiYmNDA+PWJ8fG0oYSx0aGlzLHRoaXMudmFsdWUpfSk7aWYoZS5oYXNFdmVudCgicGFzdGUiKSlhLm9uKCJwYXN0ZSBjdXQiLG0pfWEub24oImNoYW5nZSIsbCk7ZC4kcmVuZGVyPWZ1bmN0aW9uKCl7YS52YWwoZC4kaXNFbXB0eShkLiR2aWV3VmFsdWUpPyIiOmQuJHZpZXdWYWx1ZSl9fWZ1bmN0aW9uIExiKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7dmFyIGUsZjtpZihwYShjKSlyZXR1cm4gYztpZihGKGMpKXsnIic9PWMuY2hhckF0KDApJiYnIic9PWMuY2hhckF0KGMubGVuZ3RoLTEpJiYoYz1jLnN1YnN0cmluZygxLAorYy5sZW5ndGgtMSkpO2lmKE5mLnRlc3QoYykpcmV0dXJuIG5ldyBEYXRlKGMpO2IubGFzdEluZGV4PTA7aWYoZT1iLmV4ZWMoYykpcmV0dXJuIGUuc2hpZnQoKSxmPWQ/e3l5eXk6ZC5nZXRGdWxsWWVhcigpLE1NOmQuZ2V0TW9udGgoKSsxLGRkOmQuZ2V0RGF0ZSgpLEhIOmQuZ2V0SG91cnMoKSxtbTpkLmdldE1pbnV0ZXMoKSxzczpkLmdldFNlY29uZHMoKSxzc3M6ZC5nZXRNaWxsaXNlY29uZHMoKS8xRTN9Ont5eXl5OjE5NzAsTU06MSxkZDoxLEhIOjAsbW06MCxzczowLHNzczowfSxzKGUsZnVuY3Rpb24oYixjKXtjPGEubGVuZ3RoJiYoZlthW2NdXT0rYil9KSxuZXcgRGF0ZShmLnl5eXksZi5NTS0xLGYuZGQsZi5ISCxmLm1tLGYuc3N8fDAsMUUzKmYuc3NzfHwwKX1yZXR1cm4gTmFOfX1mdW5jdGlvbiBqYihiLGEsYyxkKXtyZXR1cm4gZnVuY3Rpb24oZSxmLGcsaCxsLGssbSl7ZnVuY3Rpb24gcChhKXtyZXR1cm4gYSYmIShhLmdldFRpbWUmJmEuZ2V0VGltZSgpIT09YS5nZXRUaW1lKCkpfQorZnVuY3Rpb24gcShhKXtyZXR1cm4geShhKT9wYShhKT9hOmMoYSk6dH10ZChlLGYsZyxoKTtpYihlLGYsZyxoLGwsayk7dmFyIHU9aCYmaC4kb3B0aW9ucyYmaC4kb3B0aW9ucy50aW1lem9uZSxyO2guJCRwYXJzZXJOYW1lPWI7aC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKGIpe3JldHVybiBoLiRpc0VtcHR5KGIpP251bGw6YS50ZXN0KGIpPyhiPWMoYixyKSwiVVRDIj09PXUmJmIuc2V0TWludXRlcyhiLmdldE1pbnV0ZXMoKS1iLmdldFRpbWV6b25lT2Zmc2V0KCkpLGIpOnR9KTtoLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24oYSl7aWYoYSYmIXBhKGEpKXRocm93IE1iKCJkYXRlZm10IixhKTtpZihwKGEpKXtpZigocj1hKSYmIlVUQyI9PT11KXt2YXIgYj02RTQqci5nZXRUaW1lem9uZU9mZnNldCgpO3I9bmV3IERhdGUoci5nZXRUaW1lKCkrYil9cmV0dXJuIG0oImRhdGUiKShhLGQsdSl9cj1udWxsO3JldHVybiIifSk7aWYoeShnLm1pbil8fGcubmdNaW4pe3ZhciBzO2guJHZhbGlkYXRvcnMubWluPQorZnVuY3Rpb24oYSl7cmV0dXJuIXAoYSl8fEQocyl8fGMoYSk+PXN9O2cuJG9ic2VydmUoIm1pbiIsZnVuY3Rpb24oYSl7cz1xKGEpO2guJHZhbGlkYXRlKCl9KX1pZih5KGcubWF4KXx8Zy5uZ01heCl7dmFyIG47aC4kdmFsaWRhdG9ycy5tYXg9ZnVuY3Rpb24oYSl7cmV0dXJuIXAoYSl8fEQobil8fGMoYSk8PW59O2cuJG9ic2VydmUoIm1heCIsZnVuY3Rpb24oYSl7bj1xKGEpO2guJHZhbGlkYXRlKCl9KX19fWZ1bmN0aW9uIHRkKGIsYSxjLGQpeyhkLiQkaGFzTmF0aXZlVmFsaWRhdG9ycz1IKGFbMF0udmFsaWRpdHkpKSYmZC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKGIpe3ZhciBjPWEucHJvcCgidmFsaWRpdHkiKXx8e307cmV0dXJuIGMuYmFkSW5wdXQmJiFjLnR5cGVNaXNtYXRjaD90OmJ9KX1mdW5jdGlvbiB1ZChiLGEsYyxkLGUpe2lmKHkoZCkpe2I9YihkKTtpZighYi5jb25zdGFudCl0aHJvdyBUKCJuZ01vZGVsIikoImNvbnN0ZXhwciIsYyxkKTtyZXR1cm4gYihhKX1yZXR1cm4gZX0KK2Z1bmN0aW9uIHNkKGIpe2Z1bmN0aW9uIGEoYSxiKXtiJiYhZlthXT8oay5hZGRDbGFzcyhlLGEpLGZbYV09ITApOiFiJiZmW2FdJiYoay5yZW1vdmVDbGFzcyhlLGEpLGZbYV09ITEpfWZ1bmN0aW9uIGMoYixjKXtiPWI/Ii0iK3RjKGIsIi0iKToiIjthKGtiK2IsITA9PT1jKTthKHZkK2IsITE9PT1jKX12YXIgZD1iLmN0cmwsZT1iLiRlbGVtZW50LGY9e30sZz1iLnNldCxoPWIudW5zZXQsbD1iLnBhcmVudEZvcm0saz1iLiRhbmltYXRlO2ZbdmRdPSEoZltrYl09ZS5oYXNDbGFzcyhrYikpO2QuJHNldFZhbGlkaXR5PWZ1bmN0aW9uKGIsZSxmKXtlPT09dD8oZC4kcGVuZGluZ3x8KGQuJHBlbmRpbmc9e30pLGcoZC4kcGVuZGluZyxiLGYpKTooZC4kcGVuZGluZyYmaChkLiRwZW5kaW5nLGIsZiksd2QoZC4kcGVuZGluZykmJihkLiRwZW5kaW5nPXQpKTtXYShlKT9lPyhoKGQuJGVycm9yLGIsZiksZyhkLiQkc3VjY2VzcyxiLGYpKTooZyhkLiRlcnJvcixiLGYpLGgoZC4kJHN1Y2Nlc3MsCitiLGYpKTooaChkLiRlcnJvcixiLGYpLGgoZC4kJHN1Y2Nlc3MsYixmKSk7ZC4kcGVuZGluZz8oYSh4ZCwhMCksZC4kdmFsaWQ9ZC4kaW52YWxpZD10LGMoIiIsbnVsbCkpOihhKHhkLCExKSxkLiR2YWxpZD13ZChkLiRlcnJvciksZC4kaW52YWxpZD0hZC4kdmFsaWQsYygiIixkLiR2YWxpZCkpO2U9ZC4kcGVuZGluZyYmZC4kcGVuZGluZ1tiXT90OmQuJGVycm9yW2JdPyExOmQuJCRzdWNjZXNzW2JdPyEwOm51bGw7YyhiLGUpO2wuJHNldFZhbGlkaXR5KGIsZSxkKX19ZnVuY3Rpb24gd2QoYil7aWYoYilmb3IodmFyIGEgaW4gYilyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBpYyhiLGEpe2I9Im5nQ2xhc3MiK2I7cmV0dXJuWyIkYW5pbWF0ZSIsZnVuY3Rpb24oYyl7ZnVuY3Rpb24gZChhLGIpe3ZhciBjPVtdLGQ9MDthOmZvcig7ZDxhLmxlbmd0aDtkKyspe2Zvcih2YXIgZT1hW2RdLG09MDttPGIubGVuZ3RoO20rKylpZihlPT1iW21dKWNvbnRpbnVlIGE7Yy5wdXNoKGUpfXJldHVybiBjfQorZnVuY3Rpb24gZShhKXtpZigheChhKSl7aWYoRihhKSlyZXR1cm4gYS5zcGxpdCgiICIpO2lmKEgoYSkpe3ZhciBiPVtdO3MoYSxmdW5jdGlvbihhLGMpe2EmJihiPWIuY29uY2F0KGMuc3BsaXQoIiAiKSkpfSk7cmV0dXJuIGJ9fXJldHVybiBhfXJldHVybntyZXN0cmljdDoiQUMiLGxpbms6ZnVuY3Rpb24oZixnLGgpe2Z1bmN0aW9uIGwoYSxiKXt2YXIgYz1nLmRhdGEoIiRjbGFzc0NvdW50cyIpfHx7fSxkPVtdO3MoYSxmdW5jdGlvbihhKXtpZigwPGJ8fGNbYV0pY1thXT0oY1thXXx8MCkrYixjW2FdPT09KygwPGIpJiZkLnB1c2goYSl9KTtnLmRhdGEoIiRjbGFzc0NvdW50cyIsYyk7cmV0dXJuIGQuam9pbigiICIpfWZ1bmN0aW9uIGsoYil7aWYoITA9PT1hfHxmLiRpbmRleCUyPT09YSl7dmFyIGs9ZShifHxbXSk7aWYoIW0pe3ZhciB1PWwoaywxKTtoLiRhZGRDbGFzcyh1KX1lbHNlIGlmKCFmYShiLG0pKXt2YXIgcj1lKG0pLHU9ZChrLHIpLGs9ZChyLGspLHU9bCh1LDEpLGs9CitsKGssLTEpO3UmJnUubGVuZ3RoJiZjLmFkZENsYXNzKGcsdSk7ayYmay5sZW5ndGgmJmMucmVtb3ZlQ2xhc3MoZyxrKX19bT1xYShiKX12YXIgbTtmLiR3YXRjaChoW2JdLGssITApO2guJG9ic2VydmUoImNsYXNzIixmdW5jdGlvbihhKXtrKGYuJGV2YWwoaFtiXSkpfSk7Im5nQ2xhc3MiIT09YiYmZi4kd2F0Y2goIiRpbmRleCIsZnVuY3Rpb24oYyxkKXt2YXIgZz1jJjE7aWYoZyE9PShkJjEpKXt2YXIgaz1lKGYuJGV2YWwoaFtiXSkpO2c9PT1hPyhnPWwoaywxKSxoLiRhZGRDbGFzcyhnKSk6KGc9bChrLC0xKSxoLiRyZW1vdmVDbGFzcyhnKSl9fSl9fX1dfXZhciBPZj0vXlwvKC4rKVwvKFthLXpdKikkLyxRPWZ1bmN0aW9uKGIpe3JldHVybiBGKGIpP2IudG9Mb3dlckNhc2UoKTpifSxyYz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHViPWZ1bmN0aW9uKGIpe3JldHVybiBGKGIpP2IudG9VcHBlckNhc2UoKTpifSxSYSxCLHJhLFphPVtdLnNsaWNlLHJmPVtdLnNwbGljZSwKK1BmPVtdLnB1c2gsRGE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxLYT1UKCJuZyIpLGdhPU0uYW5ndWxhcnx8KE0uYW5ndWxhcj17fSksYmIsbmI9MDtSYT1ZLmRvY3VtZW50TW9kZTtDLiRpbmplY3Q9W107b2EuJGluamVjdD1bXTt2YXIgeD1BcnJheS5pc0FycmF5LFU9ZnVuY3Rpb24oYil7cmV0dXJuIEYoYik/Yi50cmltKCk6Yn0sZ2Q9ZnVuY3Rpb24oYil7cmV0dXJuIGIucmVwbGFjZSgvKFstKClcW1xde30rPyouJFxefCw6IzwhXFxdKS9nLCJcXCQxIikucmVwbGFjZSgvXHgwOC9nLCJcXHgwOCIpfSxhYj1mdW5jdGlvbigpe2lmKHkoYWIuaXNBY3RpdmVfKSlyZXR1cm4gYWIuaXNBY3RpdmVfO3ZhciBiPSEoIVkucXVlcnlTZWxlY3RvcigiW25nLWNzcF0iKSYmIVkucXVlcnlTZWxlY3RvcigiW2RhdGEtbmctY3NwXSIpKTtpZighYil0cnl7bmV3IEZ1bmN0aW9uKCIiKX1jYXRjaChhKXtiPSEwfXJldHVybiBhYi5pc0FjdGl2ZV89Yn0scmI9WyJuZy0iLCJkYXRhLW5nLSIsIm5nOiIsCisieC1uZy0iXSxNZD0vW0EtWl0vZyx1Yz0hMSxQYixuYT0xLHBiPTMsUWQ9e2Z1bGw6IjEuMy44IixtYWpvcjoxLG1pbm9yOjMsZG90OjgsY29kZU5hbWU6InByb3BoZXRpYy1uYXJ3aGFsIn07Ui5leHBhbmRvPSJuZzMzOSI7dmFyIHpiPVIuY2FjaGU9e30saGY9MTtSLl9kYXRhPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmNhY2hlW2JbdGhpcy5leHBhbmRvXV18fHt9fTt2YXIgY2Y9LyhbXDpcLVxfXSsoLikpL2csZGY9L15tb3ooW0EtWl0pLyxRZj17bW91c2VsZWF2ZToibW91c2VvdXQiLG1vdXNlZW50ZXI6Im1vdXNlb3ZlciJ9LFNiPVQoImpxTGl0ZSIpLGdmPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sUmI9Lzx8JiM/XHcrOy8sZWY9LzwoW1x3Ol0rKS8sZmY9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSxpYT17b3B0aW9uOlsxLCc8c2VsZWN0IG11bHRpcGxlPSJtdWx0aXBsZSI+JywKKyI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07aWEub3B0Z3JvdXA9aWEub3B0aW9uO2lhLnRib2R5PWlhLnRmb290PWlhLmNvbGdyb3VwPWlhLmNhcHRpb249aWEudGhlYWQ7aWEudGg9aWEudGQ7dmFyIExhPVIucHJvdG90eXBlPXtyZWFkeTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKCl7Y3x8KGM9ITAsYigpKX12YXIgYz0hMTsiY29tcGxldGUiPT09WS5yZWFkeVN0YXRlP3NldFRpbWVvdXQoYSk6KHRoaXMub24oIkRPTUNvbnRlbnRMb2FkZWQiLGEpLFIoTSkub24oImxvYWQiLGEpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgYj1bXTtzKHRoaXMsZnVuY3Rpb24oYSl7Yi5wdXNoKCIiKworYSl9KTtyZXR1cm4iWyIrYi5qb2luKCIsICIpKyJdIn0sZXE6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PWI/Qih0aGlzW2JdKTpCKHRoaXNbdGhpcy5sZW5ndGgrYl0pfSxsZW5ndGg6MCxwdXNoOlBmLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSxFYj17fTtzKCJtdWx0aXBsZSBzZWxlY3RlZCBjaGVja2VkIGRpc2FibGVkIHJlYWRPbmx5IHJlcXVpcmVkIG9wZW4iLnNwbGl0KCIgIiksZnVuY3Rpb24oYil7RWJbUShiKV09Yn0pO3ZhciBNYz17fTtzKCJpbnB1dCBzZWxlY3Qgb3B0aW9uIHRleHRhcmVhIGJ1dHRvbiBmb3JtIGRldGFpbHMiLnNwbGl0KCIgIiksZnVuY3Rpb24oYil7TWNbYl09ITB9KTt2YXIgTmM9e25nTWlubGVuZ3RoOiJtaW5sZW5ndGgiLG5nTWF4bGVuZ3RoOiJtYXhsZW5ndGgiLG5nTWluOiJtaW4iLG5nTWF4OiJtYXgiLG5nUGF0dGVybjoicGF0dGVybiJ9O3Moe2RhdGE6VWIscmVtb3ZlRGF0YTp4Yn0sZnVuY3Rpb24oYixhKXtSW2FdPWJ9KTtzKHtkYXRhOlViLAoraW5oZXJpdGVkRGF0YTpEYixzY29wZTpmdW5jdGlvbihiKXtyZXR1cm4gQi5kYXRhKGIsIiRzY29wZSIpfHxEYihiLnBhcmVudE5vZGV8fGIsWyIkaXNvbGF0ZVNjb3BlIiwiJHNjb3BlIl0pfSxpc29sYXRlU2NvcGU6ZnVuY3Rpb24oYil7cmV0dXJuIEIuZGF0YShiLCIkaXNvbGF0ZVNjb3BlIil8fEIuZGF0YShiLCIkaXNvbGF0ZVNjb3BlTm9UZW1wbGF0ZSIpfSxjb250cm9sbGVyOkljLGluamVjdG9yOmZ1bmN0aW9uKGIpe3JldHVybiBEYihiLCIkaW5qZWN0b3IiKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihiLGEpe2IucmVtb3ZlQXR0cmlidXRlKGEpfSxoYXNDbGFzczpBYixjc3M6ZnVuY3Rpb24oYixhLGMpe2E9Y2IoYSk7aWYoeShjKSliLnN0eWxlW2FdPWM7ZWxzZSByZXR1cm4gYi5zdHlsZVthXX0sYXR0cjpmdW5jdGlvbihiLGEsYyl7dmFyIGQ9UShhKTtpZihFYltkXSlpZih5KGMpKWM/KGJbYV09ITAsYi5zZXRBdHRyaWJ1dGUoYSxkKSk6KGJbYV09ITEsYi5yZW1vdmVBdHRyaWJ1dGUoZCkpOworZWxzZSByZXR1cm4gYlthXXx8KGIuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYSl8fEMpLnNwZWNpZmllZD9kOnQ7ZWxzZSBpZih5KGMpKWIuc2V0QXR0cmlidXRlKGEsYyk7ZWxzZSBpZihiLmdldEF0dHJpYnV0ZSlyZXR1cm4gYj1iLmdldEF0dHJpYnV0ZShhLDIpLG51bGw9PT1iP3Q6Yn0scHJvcDpmdW5jdGlvbihiLGEsYyl7aWYoeShjKSliW2FdPWM7ZWxzZSByZXR1cm4gYlthXX0sdGV4dDpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSxiKXtpZihEKGIpKXt2YXIgZD1hLm5vZGVUeXBlO3JldHVybiBkPT09bmF8fGQ9PT1wYj9hLnRleHRDb250ZW50OiIifWEudGV4dENvbnRlbnQ9Yn1iLiRkdj0iIjtyZXR1cm4gYn0oKSx2YWw6ZnVuY3Rpb24oYixhKXtpZihEKGEpKXtpZihiLm11bHRpcGxlJiYic2VsZWN0Ij09PXVhKGIpKXt2YXIgYz1bXTtzKGIub3B0aW9ucyxmdW5jdGlvbihhKXthLnNlbGVjdGVkJiZjLnB1c2goYS52YWx1ZXx8YS50ZXh0KX0pO3JldHVybiAwPT09Yy5sZW5ndGg/CitudWxsOmN9cmV0dXJuIGIudmFsdWV9Yi52YWx1ZT1hfSxodG1sOmZ1bmN0aW9uKGIsYSl7aWYoRChhKSlyZXR1cm4gYi5pbm5lckhUTUw7d2IoYiwhMCk7Yi5pbm5lckhUTUw9YX0sZW1wdHk6SmN9LGZ1bmN0aW9uKGIsYSl7Ui5wcm90b3R5cGVbYV09ZnVuY3Rpb24oYSxkKXt2YXIgZSxmLGc9dGhpcy5sZW5ndGg7aWYoYiE9PUpjJiYoMj09Yi5sZW5ndGgmJmIhPT1BYiYmYiE9PUljP2E6ZCk9PT10KXtpZihIKGEpKXtmb3IoZT0wO2U8ZztlKyspaWYoYj09PVViKWIodGhpc1tlXSxhKTtlbHNlIGZvcihmIGluIGEpYih0aGlzW2VdLGYsYVtmXSk7cmV0dXJuIHRoaXN9ZT1iLiRkdjtnPWU9PT10P01hdGgubWluKGcsMSk6Zztmb3IoZj0wO2Y8ZztmKyspe3ZhciBoPWIodGhpc1tmXSxhLGQpO2U9ZT9lK2g6aH1yZXR1cm4gZX1mb3IoZT0wO2U8ZztlKyspYih0aGlzW2VdLGEsZCk7cmV0dXJuIHRoaXN9fSk7cyh7cmVtb3ZlRGF0YTp4YixvbjpmdW5jdGlvbiBhKGMsZCxlLGYpe2lmKHkoZikpdGhyb3cgU2IoIm9uYXJncyIpOworaWYoRWMoYykpe3ZhciBnPXliKGMsITApO2Y9Zy5ldmVudHM7dmFyIGg9Zy5oYW5kbGU7aHx8KGg9Zy5oYW5kbGU9bGYoYyxmKSk7Zm9yKHZhciBnPTA8PWQuaW5kZXhPZigiICIpP2Quc3BsaXQoIiAiKTpbZF0sbD1nLmxlbmd0aDtsLS07KXtkPWdbbF07dmFyIGs9ZltkXTtrfHwoZltkXT1bXSwibW91c2VlbnRlciI9PT1kfHwibW91c2VsZWF2ZSI9PT1kP2EoYyxRZltkXSxmdW5jdGlvbihhKXt2YXIgYz1hLnJlbGF0ZWRUYXJnZXQ7YyYmKGM9PT10aGlzfHx0aGlzLmNvbnRhaW5zKGMpKXx8aChhLGQpfSk6IiRkZXN0cm95IiE9PWQmJmMuYWRkRXZlbnRMaXN0ZW5lcihkLGgsITEpLGs9ZltkXSk7ay5wdXNoKGUpfX19LG9mZjpIYyxvbmU6ZnVuY3Rpb24oYSxjLGQpe2E9QihhKTthLm9uKGMsZnVuY3Rpb24gZigpe2Eub2ZmKGMsZCk7YS5vZmYoYyxmKX0pO2Eub24oYyxkKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPWEucGFyZW50Tm9kZTt3YihhKTtzKG5ldyBSKGMpLAorZnVuY3Rpb24oYyl7ZD9lLmluc2VydEJlZm9yZShjLGQubmV4dFNpYmxpbmcpOmUucmVwbGFjZUNoaWxkKGMsYSk7ZD1jfSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO3MoYS5jaGlsZE5vZGVzLGZ1bmN0aW9uKGEpe2Eubm9kZVR5cGU9PT1uYSYmYy5wdXNoKGEpfSk7cmV0dXJuIGN9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbnRlbnREb2N1bWVudHx8YS5jaGlsZE5vZGVzfHxbXX0sYXBwZW5kOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5ub2RlVHlwZTtpZihkPT09bmF8fDExPT09ZCl7Yz1uZXcgUihjKTtmb3IodmFyIGQ9MCxlPWMubGVuZ3RoO2Q8ZTtkKyspYS5hcHBlbmRDaGlsZChjW2RdKX19LHByZXBlbmQ6ZnVuY3Rpb24oYSxjKXtpZihhLm5vZGVUeXBlPT09bmEpe3ZhciBkPWEuZmlyc3RDaGlsZDtzKG5ldyBSKGMpLGZ1bmN0aW9uKGMpe2EuaW5zZXJ0QmVmb3JlKGMsZCl9KX19LHdyYXA6ZnVuY3Rpb24oYSxjKXtjPUIoYykuZXEoMCkuY2xvbmUoKVswXTsKK3ZhciBkPWEucGFyZW50Tm9kZTtkJiZkLnJlcGxhY2VDaGlsZChjLGEpO2MuYXBwZW5kQ2hpbGQoYSl9LHJlbW92ZTpLYyxkZXRhY2g6ZnVuY3Rpb24oYSl7S2MoYSwhMCl9LGFmdGVyOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9YSxlPWEucGFyZW50Tm9kZTtjPW5ldyBSKGMpO2Zvcih2YXIgZj0wLGc9Yy5sZW5ndGg7ZjxnO2YrKyl7dmFyIGg9Y1tmXTtlLmluc2VydEJlZm9yZShoLGQubmV4dFNpYmxpbmcpO2Q9aH19LGFkZENsYXNzOkNiLHJlbW92ZUNsYXNzOkJiLHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYyxkKXtjJiZzKGMuc3BsaXQoIiAiKSxmdW5jdGlvbihjKXt2YXIgZj1kO0QoZikmJihmPSFBYihhLGMpKTsoZj9DYjpCYikoYSxjKX0pfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE9YS5wYXJlbnROb2RlKSYmMTEhPT1hLm5vZGVUeXBlP2E6bnVsbH0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gYS5uZXh0RWxlbWVudFNpYmxpbmd9LGZpbmQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8KK2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYyk6W119LGNsb25lOlRiLHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxmLGc9Yy50eXBlfHxjLGg9eWIoYSk7aWYoaD0oaD1oJiZoLmV2ZW50cykmJmhbZ10pZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9LGlzRGVmYXVsdFByZXZlbnRlZDpmdW5jdGlvbigpe3JldHVybiEwPT09dGhpcy5kZWZhdWx0UHJldmVudGVkfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD0hMH0saXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMD09PXRoaXMuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkfSxzdG9wUHJvcGFnYXRpb246Qyx0eXBlOmcsdGFyZ2V0OmF9LGMudHlwZSYmKGU9eihlLGMpKSxjPXFhKGgpLGY9ZD9bZV0uY29uY2F0KGQpOltlXSxzKGMsZnVuY3Rpb24oYyl7ZS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpfHwKK2MuYXBwbHkoYSxmKX0pfX0sZnVuY3Rpb24oYSxjKXtSLnByb3RvdHlwZVtjXT1mdW5jdGlvbihjLGUsZil7Zm9yKHZhciBnLGg9MCxsPXRoaXMubGVuZ3RoO2g8bDtoKyspRChnKT8oZz1hKHRoaXNbaF0sYyxlLGYpLHkoZykmJihnPUIoZykpKTpHYyhnLGEodGhpc1toXSxjLGUsZikpO3JldHVybiB5KGcpP2c6dGhpc307Ui5wcm90b3R5cGUuYmluZD1SLnByb3RvdHlwZS5vbjtSLnByb3RvdHlwZS51bmJpbmQ9Ui5wcm90b3R5cGUub2ZmfSk7ZGIucHJvdG90eXBlPXtwdXQ6ZnVuY3Rpb24oYSxjKXt0aGlzW05hKGEsdGhpcy5uZXh0VWlkKV09Y30sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW05hKGEsdGhpcy5uZXh0VWlkKV19LHJlbW92ZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzW2E9TmEoYSx0aGlzLm5leHRVaWQpXTtkZWxldGUgdGhpc1thXTtyZXR1cm4gY319O3ZhciBQYz0vXmZ1bmN0aW9uXHMqW15cKF0qXChccyooW15cKV0qKVwpL20sbmY9LywvLG9mPS9eXHMqKF8/KShcUys/KVwxXHMqJC8sCitPYz0vKChcL1wvLiokKXwoXC9cKltcc1xTXSo/XCpcLykpL21nLEdhPVQoIiRpbmplY3RvciIpO09iLiQkYW5ub3RhdGU9VmI7dmFyIFJmPVQoIiRhbmltYXRlIiksQ2U9WyIkcHJvdmlkZSIsZnVuY3Rpb24oYSl7dGhpcy4kJHNlbGVjdG9ycz17fTt0aGlzLnJlZ2lzdGVyPWZ1bmN0aW9uKGMsZCl7dmFyIGU9YysiLWFuaW1hdGlvbiI7aWYoYyYmIi4iIT1jLmNoYXJBdCgwKSl0aHJvdyBSZigibm90Y3NlbCIsYyk7dGhpcy4kJHNlbGVjdG9yc1tjLnN1YnN0cigxKV09ZTthLmZhY3RvcnkoZSxkKX07dGhpcy5jbGFzc05hbWVGaWx0ZXI9ZnVuY3Rpb24oYSl7MT09PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLiQkY2xhc3NOYW1lRmlsdGVyPWEgaW5zdGFuY2VvZiBSZWdFeHA/YTpudWxsKTtyZXR1cm4gdGhpcy4kJGNsYXNzTmFtZUZpbHRlcn07dGhpcy4kZ2V0PVsiJCRxIiwiJCRhc3luY0NhbGxiYWNrIiwiJHJvb3RTY29wZSIsZnVuY3Rpb24oYSxkLGUpe2Z1bmN0aW9uIGYoZCl7dmFyIGYsCitnPWEuZGVmZXIoKTtnLnByb21pc2UuJCRjYW5jZWxGbj1mdW5jdGlvbigpe2YmJmYoKX07ZS4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKXtmPWQoZnVuY3Rpb24oKXtnLnJlc29sdmUoKX0pfSk7cmV0dXJuIGcucHJvbWlzZX1mdW5jdGlvbiBnKGEsYyl7dmFyIGQ9W10sZT1bXSxmPWhhKCk7cygoYS5hdHRyKCJjbGFzcyIpfHwiIikuc3BsaXQoL1xzKy8pLGZ1bmN0aW9uKGEpe2ZbYV09ITB9KTtzKGMsZnVuY3Rpb24oYSxjKXt2YXIgZz1mW2NdOyExPT09YSYmZz9lLnB1c2goYyk6ITAhPT1hfHxnfHxkLnB1c2goYyl9KTtyZXR1cm4gMDxkLmxlbmd0aCtlLmxlbmd0aCYmW2QubGVuZ3RoP2Q6bnVsbCxlLmxlbmd0aD9lOm51bGxdfWZ1bmN0aW9uIGgoYSxjLGQpe2Zvcih2YXIgZT0wLGY9Yy5sZW5ndGg7ZTxmOysrZSlhW2NbZV1dPWR9ZnVuY3Rpb24gbCgpe218fChtPWEuZGVmZXIoKSxkKGZ1bmN0aW9uKCl7bS5yZXNvbHZlKCk7bT1udWxsfSkpO3JldHVybiBtLnByb21pc2V9ZnVuY3Rpb24gayhhLAorYyl7aWYoZ2EuaXNPYmplY3QoYykpe3ZhciBkPXooYy5mcm9tfHx7fSxjLnRvfHx7fSk7YS5jc3MoZCl9fXZhciBtO3JldHVybnthbmltYXRlOmZ1bmN0aW9uKGEsYyxkKXtrKGEse2Zyb206Yyx0bzpkfSk7cmV0dXJuIGwoKX0sZW50ZXI6ZnVuY3Rpb24oYSxjLGQsZSl7ayhhLGUpO2Q/ZC5hZnRlcihhKTpjLnByZXBlbmQoYSk7cmV0dXJuIGwoKX0sbGVhdmU6ZnVuY3Rpb24oYSxjKXthLnJlbW92ZSgpO3JldHVybiBsKCl9LG1vdmU6ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIHRoaXMuZW50ZXIoYSxjLGQsZSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5zZXRDbGFzcyhhLGMsW10sZCl9LCQkYWRkQ2xhc3NJbW1lZGlhdGVseTpmdW5jdGlvbihhLGMsZCl7YT1CKGEpO2M9RihjKT9jOngoYyk/Yy5qb2luKCIgIik6IiI7cyhhLGZ1bmN0aW9uKGEpe0NiKGEsYyl9KTtrKGEsZCk7cmV0dXJuIGwoKX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLnNldENsYXNzKGEsCitbXSxjLGQpfSwkJHJlbW92ZUNsYXNzSW1tZWRpYXRlbHk6ZnVuY3Rpb24oYSxjLGQpe2E9QihhKTtjPUYoYyk/Yzp4KGMpP2Muam9pbigiICIpOiIiO3MoYSxmdW5jdGlvbihhKXtCYihhLGMpfSk7ayhhLGQpO3JldHVybiBsKCl9LHNldENsYXNzOmZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBrPXRoaXMsbD0hMTthPUIoYSk7dmFyIG09YS5kYXRhKCIkJGFuaW1hdGVDbGFzc2VzIik7bT9lJiZtLm9wdGlvbnMmJihtLm9wdGlvbnM9Z2EuZXh0ZW5kKG0ub3B0aW9uc3x8e30sZSkpOihtPXtjbGFzc2VzOnt9LG9wdGlvbnM6ZX0sbD0hMCk7ZT1tLmNsYXNzZXM7Yz14KGMpP2M6Yy5zcGxpdCgiICIpO2Q9eChkKT9kOmQuc3BsaXQoIiAiKTtoKGUsYywhMCk7aChlLGQsITEpO2wmJihtLnByb21pc2U9ZihmdW5jdGlvbihjKXt2YXIgZD1hLmRhdGEoIiQkYW5pbWF0ZUNsYXNzZXMiKTthLnJlbW92ZURhdGEoIiQkYW5pbWF0ZUNsYXNzZXMiKTtpZihkKXt2YXIgZT1nKGEsZC5jbGFzc2VzKTtlJiYKK2suJCRzZXRDbGFzc0ltbWVkaWF0ZWx5KGEsZVswXSxlWzFdLGQub3B0aW9ucyl9YygpfSksYS5kYXRhKCIkJGFuaW1hdGVDbGFzc2VzIixtKSk7cmV0dXJuIG0ucHJvbWlzZX0sJCRzZXRDbGFzc0ltbWVkaWF0ZWx5OmZ1bmN0aW9uKGEsYyxkLGUpe2MmJnRoaXMuJCRhZGRDbGFzc0ltbWVkaWF0ZWx5KGEsYyk7ZCYmdGhpcy4kJHJlbW92ZUNsYXNzSW1tZWRpYXRlbHkoYSxkKTtrKGEsZSk7cmV0dXJuIGwoKX0sZW5hYmxlZDpDLGNhbmNlbDpDfX1dfV0samE9VCgiJGNvbXBpbGUiKTt3Yy4kaW5qZWN0PVsiJHByb3ZpZGUiLCIkJHNhbml0aXplVXJpUHJvdmlkZXIiXTt2YXIgUmM9L14oKD86eHxkYXRhKVtcOlwtX10pL2ksVmM9ImFwcGxpY2F0aW9uL2pzb24iLFpiPXsiQ29udGVudC1UeXBlIjpWYysiO2NoYXJzZXQ9dXRmLTgifSx0Zj0vXlxbfF5ceyg/IVx7KS8sdWY9eyJbIjovXSQvLCJ7IjovfSQvfSxzZj0vXlwpXF1cfScsP1xuLywkYj1UKCIkaW50ZXJwb2xhdGUiKSxTZj0vXihbXlw/I10qKShcPyhbXiNdKikpPygjKC4qKSk/JC8sCit4Zj17aHR0cDo4MCxodHRwczo0NDMsZnRwOjIxfSxGYj1UKCIkbG9jYXRpb24iKSxUZj17JCRodG1sNTohMSwkJHJlcGxhY2U6ITEsYWJzVXJsOkdiKCIkJGFic1VybCIpLHVybDpmdW5jdGlvbihhKXtpZihEKGEpKXJldHVybiB0aGlzLiQkdXJsO3ZhciBjPVNmLmV4ZWMoYSk7KGNbMV18fCIiPT09YSkmJnRoaXMucGF0aChkZWNvZGVVUklDb21wb25lbnQoY1sxXSkpOyhjWzJdfHxjWzFdfHwiIj09PWEpJiZ0aGlzLnNlYXJjaChjWzNdfHwiIik7dGhpcy5oYXNoKGNbNV18fCIiKTtyZXR1cm4gdGhpc30scHJvdG9jb2w6R2IoIiQkcHJvdG9jb2wiKSxob3N0OkdiKCIkJGhvc3QiKSxwb3J0OkdiKCIkJHBvcnQiKSxwYXRoOmRkKCIkJHBhdGgiLGZ1bmN0aW9uKGEpe2E9bnVsbCE9PWE/YS50b1N0cmluZygpOiIiO3JldHVybiIvIj09YS5jaGFyQXQoMCk/YToiLyIrYX0pLHNlYXJjaDpmdW5jdGlvbihhLGMpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHRoaXMuJCRzZWFyY2g7CitjYXNlIDE6aWYoRihhKXx8VihhKSlhPWEudG9TdHJpbmcoKSx0aGlzLiQkc2VhcmNoPXFjKGEpO2Vsc2UgaWYoSChhKSlhPUVhKGEse30pLHMoYSxmdW5jdGlvbihjLGUpe251bGw9PWMmJmRlbGV0ZSBhW2VdfSksdGhpcy4kJHNlYXJjaD1hO2Vsc2UgdGhyb3cgRmIoImlzcmNoYXJnIik7YnJlYWs7ZGVmYXVsdDpEKGMpfHxudWxsPT09Yz9kZWxldGUgdGhpcy4kJHNlYXJjaFthXTp0aGlzLiQkc2VhcmNoW2FdPWN9dGhpcy4kJGNvbXBvc2UoKTtyZXR1cm4gdGhpc30saGFzaDpkZCgiJCRoYXNoIixmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWE/YS50b1N0cmluZygpOiIifSkscmVwbGFjZTpmdW5jdGlvbigpe3RoaXMuJCRyZXBsYWNlPSEwO3JldHVybiB0aGlzfX07cyhbY2QsZGMsY2NdLGZ1bmN0aW9uKGEpe2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVGYpO2EucHJvdG90eXBlLnN0YXRlPWZ1bmN0aW9uKGMpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLiQkc3RhdGU7CitpZihhIT09Y2N8fCF0aGlzLiQkaHRtbDUpdGhyb3cgRmIoIm5vc3RhdGUiKTt0aGlzLiQkc3RhdGU9RChjKT9udWxsOmM7cmV0dXJuIHRoaXN9fSk7dmFyIGxhPVQoIiRwYXJzZSIpLFVmPUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLFZmPUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSxXZj1GdW5jdGlvbi5wcm90b3R5cGUuYmluZCxsYj1oYSgpO3MoeyJudWxsIjpmdW5jdGlvbigpe3JldHVybiBudWxsfSwidHJ1ZSI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sImZhbHNlIjpmdW5jdGlvbigpe3JldHVybiExfSx1bmRlZmluZWQ6ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbihhLGMpe2EuY29uc3RhbnQ9YS5saXRlcmFsPWEuc2hhcmVkR2V0dGVyPSEwO2xiW2NdPWF9KTtsYlsidGhpcyJdPWZ1bmN0aW9uKGEpe3JldHVybiBhfTtsYlsidGhpcyJdLnNoYXJlZEdldHRlcj0hMDt2YXIgbWI9eihoYSgpLHsiKyI6ZnVuY3Rpb24oYSxjLGQsZSl7ZD1kKGEsYyk7ZT1lKGEsYyk7cmV0dXJuIHkoZCk/eShlKT8KK2QrZTpkOnkoZSk/ZTp0fSwiLSI6ZnVuY3Rpb24oYSxjLGQsZSl7ZD1kKGEsYyk7ZT1lKGEsYyk7cmV0dXJuKHkoZCk/ZDowKS0oeShlKT9lOjApfSwiKiI6ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIGQoYSxjKSplKGEsYyl9LCIvIjpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gZChhLGMpL2UoYSxjKX0sIiUiOmZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBkKGEsYyklZShhLGMpfSwiPT09IjpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gZChhLGMpPT09ZShhLGMpfSwiIT09IjpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gZChhLGMpIT09ZShhLGMpfSwiPT0iOmZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBkKGEsYyk9PWUoYSxjKX0sIiE9IjpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gZChhLGMpIT1lKGEsYyl9LCI8IjpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gZChhLGMpPGUoYSxjKX0sIj4iOmZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBkKGEsYyk+ZShhLGMpfSwiPD0iOmZ1bmN0aW9uKGEsCitjLGQsZSl7cmV0dXJuIGQoYSxjKTw9ZShhLGMpfSwiPj0iOmZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBkKGEsYyk+PWUoYSxjKX0sIiYmIjpmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gZChhLGMpJiZlKGEsYyl9LCJ8fCI6ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIGQoYSxjKXx8ZShhLGMpfSwiISI6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiFkKGEsYyl9LCI9IjohMCwifCI6ITB9KSxYZj17bjoiXG4iLGY6IlxmIixyOiJcciIsdDoiXHQiLHY6Ilx2IiwiJyI6IiciLCciJzonIid9LGdjPWZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucz1hfTtnYy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmdjLGxleDpmdW5jdGlvbihhKXt0aGlzLnRleHQ9YTt0aGlzLmluZGV4PTA7Zm9yKHRoaXMudG9rZW5zPVtdO3RoaXMuaW5kZXg8dGhpcy50ZXh0Lmxlbmd0aDspaWYoYT10aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpLCciJz09PWF8fCInIj09PWEpdGhpcy5yZWFkU3RyaW5nKGEpO2Vsc2UgaWYodGhpcy5pc051bWJlcihhKXx8CisiLiI9PT1hJiZ0aGlzLmlzTnVtYmVyKHRoaXMucGVlaygpKSl0aGlzLnJlYWROdW1iZXIoKTtlbHNlIGlmKHRoaXMuaXNJZGVudChhKSl0aGlzLnJlYWRJZGVudCgpO2Vsc2UgaWYodGhpcy5pcyhhLCIoKXt9W10uLDs6PyIpKXRoaXMudG9rZW5zLnB1c2goe2luZGV4OnRoaXMuaW5kZXgsdGV4dDphfSksdGhpcy5pbmRleCsrO2Vsc2UgaWYodGhpcy5pc1doaXRlc3BhY2UoYSkpdGhpcy5pbmRleCsrO2Vsc2V7dmFyIGM9YSt0aGlzLnBlZWsoKSxkPWMrdGhpcy5wZWVrKDIpLGU9bWJbY10sZj1tYltkXTttYlthXXx8ZXx8Zj8oYT1mP2Q6ZT9jOmEsdGhpcy50b2tlbnMucHVzaCh7aW5kZXg6dGhpcy5pbmRleCx0ZXh0OmEsb3BlcmF0b3I6ITB9KSx0aGlzLmluZGV4Kz1hLmxlbmd0aCk6dGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIG5leHQgY2hhcmFjdGVyICIsdGhpcy5pbmRleCx0aGlzLmluZGV4KzEpfXJldHVybiB0aGlzLnRva2Vuc30saXM6ZnVuY3Rpb24oYSxjKXtyZXR1cm4tMSE9PQorYy5pbmRleE9mKGEpfSxwZWVrOmZ1bmN0aW9uKGEpe2E9YXx8MTtyZXR1cm4gdGhpcy5pbmRleCthPHRoaXMudGV4dC5sZW5ndGg/dGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4K2EpOiExfSxpc051bWJlcjpmdW5jdGlvbihhKXtyZXR1cm4iMCI8PWEmJiI5Ij49YSYmInN0cmluZyI9PT10eXBlb2YgYX0saXNXaGl0ZXNwYWNlOmZ1bmN0aW9uKGEpe3JldHVybiIgIj09PWF8fCJcciI9PT1hfHwiXHQiPT09YXx8IlxuIj09PWF8fCJcdiI9PT1hfHwiXHUwMGEwIj09PWF9LGlzSWRlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuImEiPD1hJiYieiI+PWF8fCJBIjw9YSYmIloiPj1hfHwiXyI9PT1hfHwiJCI9PT1hfSxpc0V4cE9wZXJhdG9yOmZ1bmN0aW9uKGEpe3JldHVybiItIj09PWF8fCIrIj09PWF8fHRoaXMuaXNOdW1iZXIoYSl9LHRocm93RXJyb3I6ZnVuY3Rpb24oYSxjLGQpe2Q9ZHx8dGhpcy5pbmRleDtjPXkoYyk/InMgIitjKyItIit0aGlzLmluZGV4KyIgWyIrdGhpcy50ZXh0LnN1YnN0cmluZyhjLAorZCkrIl0iOiIgIitkO3Rocm93IGxhKCJsZXhlcnIiLGEsYyx0aGlzLnRleHQpO30scmVhZE51bWJlcjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iIixjPXRoaXMuaW5kZXg7dGhpcy5pbmRleDx0aGlzLnRleHQubGVuZ3RoOyl7dmFyIGQ9USh0aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpKTtpZigiLiI9PWR8fHRoaXMuaXNOdW1iZXIoZCkpYSs9ZDtlbHNle3ZhciBlPXRoaXMucGVlaygpO2lmKCJlIj09ZCYmdGhpcy5pc0V4cE9wZXJhdG9yKGUpKWErPWQ7ZWxzZSBpZih0aGlzLmlzRXhwT3BlcmF0b3IoZCkmJmUmJnRoaXMuaXNOdW1iZXIoZSkmJiJlIj09YS5jaGFyQXQoYS5sZW5ndGgtMSkpYSs9ZDtlbHNlIGlmKCF0aGlzLmlzRXhwT3BlcmF0b3IoZCl8fGUmJnRoaXMuaXNOdW1iZXIoZSl8fCJlIiE9YS5jaGFyQXQoYS5sZW5ndGgtMSkpYnJlYWs7ZWxzZSB0aGlzLnRocm93RXJyb3IoIkludmFsaWQgZXhwb25lbnQiKX10aGlzLmluZGV4Kyt9dGhpcy50b2tlbnMucHVzaCh7aW5kZXg6YywKK3RleHQ6YSxjb25zdGFudDohMCx2YWx1ZTpOdW1iZXIoYSl9KX0scmVhZElkZW50OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuaW5kZXg7dGhpcy5pbmRleDx0aGlzLnRleHQubGVuZ3RoOyl7dmFyIGM9dGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4KTtpZighdGhpcy5pc0lkZW50KGMpJiYhdGhpcy5pc051bWJlcihjKSlicmVhazt0aGlzLmluZGV4Kyt9dGhpcy50b2tlbnMucHVzaCh7aW5kZXg6YSx0ZXh0OnRoaXMudGV4dC5zbGljZShhLHRoaXMuaW5kZXgpLGlkZW50aWZpZXI6ITB9KX0scmVhZFN0cmluZzpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmluZGV4O3RoaXMuaW5kZXgrKztmb3IodmFyIGQ9IiIsZT1hLGY9ITE7dGhpcy5pbmRleDx0aGlzLnRleHQubGVuZ3RoOyl7dmFyIGc9dGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4KSxlPWUrZztpZihmKSJ1Ij09PWc/KGY9dGhpcy50ZXh0LnN1YnN0cmluZyh0aGlzLmluZGV4KzEsdGhpcy5pbmRleCs1KSxmLm1hdGNoKC9bXGRhLWZdezR9L2kpfHwKK3RoaXMudGhyb3dFcnJvcigiSW52YWxpZCB1bmljb2RlIGVzY2FwZSBbXFx1IitmKyJdIiksdGhpcy5pbmRleCs9NCxkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGYsMTYpKSk6ZCs9WGZbZ118fGcsZj0hMTtlbHNlIGlmKCJcXCI9PT1nKWY9ITA7ZWxzZXtpZihnPT09YSl7dGhpcy5pbmRleCsrO3RoaXMudG9rZW5zLnB1c2goe2luZGV4OmMsdGV4dDplLGNvbnN0YW50OiEwLHZhbHVlOmR9KTtyZXR1cm59ZCs9Z310aGlzLmluZGV4Kyt9dGhpcy50aHJvd0Vycm9yKCJVbnRlcm1pbmF0ZWQgcXVvdGUiLGMpfX07dmFyIGhiPWZ1bmN0aW9uKGEsYyxkKXt0aGlzLmxleGVyPWE7dGhpcy4kZmlsdGVyPWM7dGhpcy5vcHRpb25zPWR9O2hiLlpFUk89eihmdW5jdGlvbigpe3JldHVybiAwfSx7c2hhcmVkR2V0dGVyOiEwLGNvbnN0YW50OiEwfSk7aGIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpoYixwYXJzZTpmdW5jdGlvbihhKXt0aGlzLnRleHQ9YTt0aGlzLnRva2Vucz10aGlzLmxleGVyLmxleChhKTsKK2E9dGhpcy5zdGF0ZW1lbnRzKCk7MCE9PXRoaXMudG9rZW5zLmxlbmd0aCYmdGhpcy50aHJvd0Vycm9yKCJpcyBhbiB1bmV4cGVjdGVkIHRva2VuIix0aGlzLnRva2Vuc1swXSk7YS5saXRlcmFsPSEhYS5saXRlcmFsO2EuY29uc3RhbnQ9ISFhLmNvbnN0YW50O3JldHVybiBhfSxwcmltYXJ5OmZ1bmN0aW9uKCl7dmFyIGE7dGhpcy5leHBlY3QoIigiKT8oYT10aGlzLmZpbHRlckNoYWluKCksdGhpcy5jb25zdW1lKCIpIikpOnRoaXMuZXhwZWN0KCJbIik/YT10aGlzLmFycmF5RGVjbGFyYXRpb24oKTp0aGlzLmV4cGVjdCgieyIpP2E9dGhpcy5vYmplY3QoKTp0aGlzLnBlZWsoKS5pZGVudGlmaWVyJiZ0aGlzLnBlZWsoKS50ZXh0IGluIGxiP2E9bGJbdGhpcy5jb25zdW1lKCkudGV4dF06dGhpcy5wZWVrKCkuaWRlbnRpZmllcj9hPXRoaXMuaWRlbnRpZmllcigpOnRoaXMucGVlaygpLmNvbnN0YW50P2E9dGhpcy5jb25zdGFudCgpOnRoaXMudGhyb3dFcnJvcigibm90IGEgcHJpbWFyeSBleHByZXNzaW9uIiwKK3RoaXMucGVlaygpKTtmb3IodmFyIGMsZDtjPXRoaXMuZXhwZWN0KCIoIiwiWyIsIi4iKTspIigiPT09Yy50ZXh0PyhhPXRoaXMuZnVuY3Rpb25DYWxsKGEsZCksZD1udWxsKToiWyI9PT1jLnRleHQ/KGQ9YSxhPXRoaXMub2JqZWN0SW5kZXgoYSkpOiIuIj09PWMudGV4dD8oZD1hLGE9dGhpcy5maWVsZEFjY2VzcyhhKSk6dGhpcy50aHJvd0Vycm9yKCJJTVBPU1NJQkxFIik7cmV0dXJuIGF9LHRocm93RXJyb3I6ZnVuY3Rpb24oYSxjKXt0aHJvdyBsYSgic3ludGF4IixjLnRleHQsYSxjLmluZGV4KzEsdGhpcy50ZXh0LHRoaXMudGV4dC5zdWJzdHJpbmcoYy5pbmRleCkpO30scGVla1Rva2VuOmZ1bmN0aW9uKCl7aWYoMD09PXRoaXMudG9rZW5zLmxlbmd0aCl0aHJvdyBsYSgidWVvZSIsdGhpcy50ZXh0KTtyZXR1cm4gdGhpcy50b2tlbnNbMF19LHBlZWs6ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIHRoaXMucGVla0FoZWFkKDAsYSxjLGQsZSl9LHBlZWtBaGVhZDpmdW5jdGlvbihhLAorYyxkLGUsZil7aWYodGhpcy50b2tlbnMubGVuZ3RoPmEpe2E9dGhpcy50b2tlbnNbYV07dmFyIGc9YS50ZXh0O2lmKGc9PT1jfHxnPT09ZHx8Zz09PWV8fGc9PT1mfHwhKGN8fGR8fGV8fGYpKXJldHVybiBhfXJldHVybiExfSxleHBlY3Q6ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuKGE9dGhpcy5wZWVrKGEsYyxkLGUpKT8odGhpcy50b2tlbnMuc2hpZnQoKSxhKTohMX0sY29uc3VtZTpmdW5jdGlvbihhKXtpZigwPT09dGhpcy50b2tlbnMubGVuZ3RoKXRocm93IGxhKCJ1ZW9lIix0aGlzLnRleHQpO3ZhciBjPXRoaXMuZXhwZWN0KGEpO2N8fHRoaXMudGhyb3dFcnJvcigiaXMgdW5leHBlY3RlZCwgZXhwZWN0aW5nIFsiK2ErIl0iLHRoaXMucGVlaygpKTtyZXR1cm4gY30sdW5hcnlGbjpmdW5jdGlvbihhLGMpe3ZhciBkPW1iW2FdO3JldHVybiB6KGZ1bmN0aW9uKGEsZil7cmV0dXJuIGQoYSxmLGMpfSx7Y29uc3RhbnQ6Yy5jb25zdGFudCxpbnB1dHM6W2NdfSl9LGJpbmFyeUZuOmZ1bmN0aW9uKGEsCitjLGQsZSl7dmFyIGY9bWJbY107cmV0dXJuIHooZnVuY3Rpb24oYyxlKXtyZXR1cm4gZihjLGUsYSxkKX0se2NvbnN0YW50OmEuY29uc3RhbnQmJmQuY29uc3RhbnQsaW5wdXRzOiFlJiZbYSxkXX0pfSxpZGVudGlmaWVyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuY29uc3VtZSgpLnRleHQ7dGhpcy5wZWVrKCIuIikmJnRoaXMucGVla0FoZWFkKDEpLmlkZW50aWZpZXImJiF0aGlzLnBlZWtBaGVhZCgyLCIoIik7KWErPXRoaXMuY29uc3VtZSgpLnRleHQrdGhpcy5jb25zdW1lKCkudGV4dDtyZXR1cm4gemYoYSx0aGlzLm9wdGlvbnMsdGhpcy50ZXh0KX0sY29uc3RhbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvbnN1bWUoKS52YWx1ZTtyZXR1cm4geihmdW5jdGlvbigpe3JldHVybiBhfSx7Y29uc3RhbnQ6ITAsbGl0ZXJhbDohMH0pfSxzdGF0ZW1lbnRzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdOzspaWYoMDx0aGlzLnRva2Vucy5sZW5ndGgmJiF0aGlzLnBlZWsoIn0iLCIpIiwKKyI7IiwiXSIpJiZhLnB1c2godGhpcy5maWx0ZXJDaGFpbigpKSwhdGhpcy5leHBlY3QoIjsiKSlyZXR1cm4gMT09PWEubGVuZ3RoP2FbMF06ZnVuY3Rpb24oYyxkKXtmb3IodmFyIGUsZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPWFbZl0oYyxkKTtyZXR1cm4gZX19LGZpbHRlckNoYWluOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZXhwcmVzc2lvbigpO3RoaXMuZXhwZWN0KCJ8Iik7KWE9dGhpcy5maWx0ZXIoYSk7cmV0dXJuIGF9LGZpbHRlcjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLiRmaWx0ZXIodGhpcy5jb25zdW1lKCkudGV4dCksZCxlO2lmKHRoaXMucGVlaygiOiIpKWZvcihkPVtdLGU9W107dGhpcy5leHBlY3QoIjoiKTspZC5wdXNoKHRoaXMuZXhwcmVzc2lvbigpKTt2YXIgZj1bYV0uY29uY2F0KGR8fFtdKTtyZXR1cm4geihmdW5jdGlvbihmLGgpe3ZhciBsPWEoZixoKTtpZihlKXtlWzBdPWw7Zm9yKGw9ZC5sZW5ndGg7bC0tOyllW2wrMV09ZFtsXShmLGgpO3JldHVybiBjLmFwcGx5KHQsCitlKX1yZXR1cm4gYyhsKX0se2NvbnN0YW50OiFjLiRzdGF0ZWZ1bCYmZi5ldmVyeShlYyksaW5wdXRzOiFjLiRzdGF0ZWZ1bCYmZn0pfSxleHByZXNzaW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXNzaWdubWVudCgpfSxhc3NpZ25tZW50OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50ZXJuYXJ5KCksYyxkO3JldHVybihkPXRoaXMuZXhwZWN0KCI9IikpPyhhLmFzc2lnbnx8dGhpcy50aHJvd0Vycm9yKCJpbXBsaWVzIGFzc2lnbm1lbnQgYnV0IFsiK3RoaXMudGV4dC5zdWJzdHJpbmcoMCxkLmluZGV4KSsiXSBjYW4gbm90IGJlIGFzc2lnbmVkIHRvIixkKSxjPXRoaXMudGVybmFyeSgpLHooZnVuY3Rpb24oZCxmKXtyZXR1cm4gYS5hc3NpZ24oZCxjKGQsZiksZil9LHtpbnB1dHM6W2EsY119KSk6YX0sdGVybmFyeTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubG9naWNhbE9SKCksYztpZih0aGlzLmV4cGVjdCgiPyIpJiYoYz10aGlzLmFzc2lnbm1lbnQoKSx0aGlzLmNvbnN1bWUoIjoiKSkpe3ZhciBkPQordGhpcy5hc3NpZ25tZW50KCk7cmV0dXJuIHooZnVuY3Rpb24oZSxmKXtyZXR1cm4gYShlLGYpP2MoZSxmKTpkKGUsZil9LHtjb25zdGFudDphLmNvbnN0YW50JiZjLmNvbnN0YW50JiZkLmNvbnN0YW50fSl9cmV0dXJuIGF9LGxvZ2ljYWxPUjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmxvZ2ljYWxBTkQoKSxjO2M9dGhpcy5leHBlY3QoInx8Iik7KWE9dGhpcy5iaW5hcnlGbihhLGMudGV4dCx0aGlzLmxvZ2ljYWxBTkQoKSwhMCk7cmV0dXJuIGF9LGxvZ2ljYWxBTkQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5lcXVhbGl0eSgpLGM7Yz10aGlzLmV4cGVjdCgiJiYiKTspYT10aGlzLmJpbmFyeUZuKGEsYy50ZXh0LHRoaXMuZXF1YWxpdHkoKSwhMCk7cmV0dXJuIGF9LGVxdWFsaXR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucmVsYXRpb25hbCgpLGM7Yz10aGlzLmV4cGVjdCgiPT0iLCIhPSIsIj09PSIsIiE9PSIpOylhPXRoaXMuYmluYXJ5Rm4oYSxjLnRleHQsdGhpcy5yZWxhdGlvbmFsKCkpOworcmV0dXJuIGF9LHJlbGF0aW9uYWw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hZGRpdGl2ZSgpLGM7Yz10aGlzLmV4cGVjdCgiPCIsIj4iLCI8PSIsIj49Iik7KWE9dGhpcy5iaW5hcnlGbihhLGMudGV4dCx0aGlzLmFkZGl0aXZlKCkpO3JldHVybiBhfSxhZGRpdGl2ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm11bHRpcGxpY2F0aXZlKCksYztjPXRoaXMuZXhwZWN0KCIrIiwiLSIpOylhPXRoaXMuYmluYXJ5Rm4oYSxjLnRleHQsdGhpcy5tdWx0aXBsaWNhdGl2ZSgpKTtyZXR1cm4gYX0sbXVsdGlwbGljYXRpdmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51bmFyeSgpLGM7Yz10aGlzLmV4cGVjdCgiKiIsIi8iLCIlIik7KWE9dGhpcy5iaW5hcnlGbihhLGMudGV4dCx0aGlzLnVuYXJ5KCkpO3JldHVybiBhfSx1bmFyeTpmdW5jdGlvbigpe3ZhciBhO3JldHVybiB0aGlzLmV4cGVjdCgiKyIpP3RoaXMucHJpbWFyeSgpOihhPXRoaXMuZXhwZWN0KCItIikpP3RoaXMuYmluYXJ5Rm4oaGIuWkVSTywKK2EudGV4dCx0aGlzLnVuYXJ5KCkpOihhPXRoaXMuZXhwZWN0KCIhIikpP3RoaXMudW5hcnlGbihhLnRleHQsdGhpcy51bmFyeSgpKTp0aGlzLnByaW1hcnkoKX0sZmllbGRBY2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5pZGVudGlmaWVyKCk7cmV0dXJuIHooZnVuY3Rpb24oZCxlLGYpe2Q9Znx8YShkLGUpO3JldHVybiBudWxsPT1kP3Q6YyhkKX0se2Fzc2lnbjpmdW5jdGlvbihkLGUsZil7KGY9YShkLGYpKXx8YS5hc3NpZ24oZCxmPXt9KTtyZXR1cm4gYy5hc3NpZ24oZixlKX19KX0sb2JqZWN0SW5kZXg6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy50ZXh0LGQ9dGhpcy5leHByZXNzaW9uKCk7dGhpcy5jb25zdW1lKCJdIik7cmV0dXJuIHooZnVuY3Rpb24oZSxmKXt2YXIgZz1hKGUsZiksaD1kKGUsZik7c2EoaCxjKTtyZXR1cm4gZz90YShnW2hdLGMpOnR9LHthc3NpZ246ZnVuY3Rpb24oZSxmLGcpe3ZhciBoPXNhKGQoZSxnKSxjKTsoZz10YShhKGUsZyksYykpfHxhLmFzc2lnbihlLAorZz17fSk7cmV0dXJuIGdbaF09Zn19KX0sZnVuY3Rpb25DYWxsOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9W107aWYoIikiIT09dGhpcy5wZWVrVG9rZW4oKS50ZXh0KXtkbyBkLnB1c2godGhpcy5leHByZXNzaW9uKCkpO3doaWxlKHRoaXMuZXhwZWN0KCIsIikpfXRoaXMuY29uc3VtZSgiKSIpO3ZhciBlPXRoaXMudGV4dCxmPWQubGVuZ3RoP1tdOm51bGw7cmV0dXJuIGZ1bmN0aW9uKGcsaCl7dmFyIGw9Yz9jKGcsaCk6eShjKT90Omcsaz1hKGcsaCxsKXx8QztpZihmKWZvcih2YXIgbT1kLmxlbmd0aDttLS07KWZbbV09dGEoZFttXShnLGgpLGUpO3RhKGwsZSk7aWYoayl7aWYoay5jb25zdHJ1Y3Rvcj09PWspdGhyb3cgbGEoImlzZWNmbiIsZSk7aWYoaz09PVVmfHxrPT09VmZ8fGs9PT1XZil0aHJvdyBsYSgiaXNlY2ZmIixlKTt9bD1rLmFwcGx5P2suYXBwbHkobCxmKTprKGZbMF0sZlsxXSxmWzJdLGZbM10sZls0XSk7cmV0dXJuIHRhKGwsZSl9fSxhcnJheURlY2xhcmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CitbXTtpZigiXSIhPT10aGlzLnBlZWtUb2tlbigpLnRleHQpe2Rve2lmKHRoaXMucGVlaygiXSIpKWJyZWFrO2EucHVzaCh0aGlzLmV4cHJlc3Npb24oKSl9d2hpbGUodGhpcy5leHBlY3QoIiwiKSl9dGhpcy5jb25zdW1lKCJdIik7cmV0dXJuIHooZnVuY3Rpb24oYyxkKXtmb3IodmFyIGU9W10sZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllLnB1c2goYVtmXShjLGQpKTtyZXR1cm4gZX0se2xpdGVyYWw6ITAsY29uc3RhbnQ6YS5ldmVyeShlYyksaW5wdXRzOmF9KX0sb2JqZWN0OmZ1bmN0aW9uKCl7dmFyIGE9W10sYz1bXTtpZigifSIhPT10aGlzLnBlZWtUb2tlbigpLnRleHQpe2Rve2lmKHRoaXMucGVlaygifSIpKWJyZWFrO3ZhciBkPXRoaXMuY29uc3VtZSgpO2QuY29uc3RhbnQ/YS5wdXNoKGQudmFsdWUpOmQuaWRlbnRpZmllcj9hLnB1c2goZC50ZXh0KTp0aGlzLnRocm93RXJyb3IoImludmFsaWQga2V5IixkKTt0aGlzLmNvbnN1bWUoIjoiKTtjLnB1c2godGhpcy5leHByZXNzaW9uKCkpfXdoaWxlKHRoaXMuZXhwZWN0KCIsIikpCit9dGhpcy5jb25zdW1lKCJ9Iik7cmV0dXJuIHooZnVuY3Rpb24oZCxmKXtmb3IodmFyIGc9e30saD0wLGw9Yy5sZW5ndGg7aDxsO2grKylnW2FbaF1dPWNbaF0oZCxmKTtyZXR1cm4gZ30se2xpdGVyYWw6ITAsY29uc3RhbnQ6Yy5ldmVyeShlYyksaW5wdXRzOmN9KX19O3ZhciBCZj1oYSgpLEFmPWhhKCksQ2Y9T2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mLENhPVQoIiRzY2UiKSxtYT17SFRNTDoiaHRtbCIsQ1NTOiJjc3MiLFVSTDoidXJsIixSRVNPVVJDRV9VUkw6InJlc291cmNlVXJsIixKUzoianMifSxqYT1UKCIkY29tcGlsZSIpLFo9WS5jcmVhdGVFbGVtZW50KCJhIiksaWQ9QmEoTS5sb2NhdGlvbi5ocmVmKTtEYy4kaW5qZWN0PVsiJHByb3ZpZGUiXTtqZC4kaW5qZWN0PVsiJGxvY2FsZSJdO2xkLiRpbmplY3Q9WyIkbG9jYWxlIl07dmFyIG9kPSIuIixNZj17eXl5eTokKCJGdWxsWWVhciIsNCkseXk6JCgiRnVsbFllYXIiLDIsMCwhMCkseTokKCJGdWxsWWVhciIsMSksTU1NTTpJYigiTW9udGgiKSwKK01NTTpJYigiTW9udGgiLCEwKSxNTTokKCJNb250aCIsMiwxKSxNOiQoIk1vbnRoIiwxLDEpLGRkOiQoIkRhdGUiLDIpLGQ6JCgiRGF0ZSIsMSksSEg6JCgiSG91cnMiLDIpLEg6JCgiSG91cnMiLDEpLGhoOiQoIkhvdXJzIiwyLC0xMiksaDokKCJIb3VycyIsMSwtMTIpLG1tOiQoIk1pbnV0ZXMiLDIpLG06JCgiTWludXRlcyIsMSksc3M6JCgiU2Vjb25kcyIsMiksczokKCJTZWNvbmRzIiwxKSxzc3M6JCgiTWlsbGlzZWNvbmRzIiwzKSxFRUVFOkliKCJEYXkiKSxFRUU6SWIoIkRheSIsITApLGE6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gMTI+YS5nZXRIb3VycygpP2MuQU1QTVNbMF06Yy5BTVBNU1sxXX0sWjpmdW5jdGlvbihhKXthPS0xKmEuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4gYT0oMDw9YT8iKyI6IiIpKyhIYihNYXRoWzA8YT8iZmxvb3IiOiJjZWlsIl0oYS82MCksMikrSGIoTWF0aC5hYnMoYSU2MCksMikpfSx3dzpxZCgyKSx3OnFkKDEpfSxMZj0vKCg/OlteeU1kSGhtc2FaRXcnXSspfCg/OicoPzpbXiddfCcnKSonKXwoPzpFK3x5K3xNK3xkK3xIK3xoK3xtK3xzK3xhfFp8dyspKSguKikvLAorS2Y9L15cLT9cZCskLztrZC4kaW5qZWN0PVsiJGxvY2FsZSJdO3ZhciBIZj1kYShRKSxJZj1kYSh1Yik7bWQuJGluamVjdD1bIiRwYXJzZSJdO3ZhciBUZD1kYSh7cmVzdHJpY3Q6IkUiLGNvbXBpbGU6ZnVuY3Rpb24oYSxjKXtpZighYy5ocmVmJiYhYy54bGlua0hyZWYmJiFjLm5hbWUpcmV0dXJuIGZ1bmN0aW9uKGEsYyl7dmFyIGY9IltvYmplY3QgU1ZHQW5pbWF0ZWRTdHJpbmddIj09PURhLmNhbGwoYy5wcm9wKCJocmVmIikpPyJ4bGluazpocmVmIjoiaHJlZiI7Yy5vbigiY2xpY2siLGZ1bmN0aW9uKGEpe2MuYXR0cihmKXx8YS5wcmV2ZW50RGVmYXVsdCgpfSl9fX0pLHZiPXt9O3MoRWIsZnVuY3Rpb24oYSxjKXtpZigibXVsdGlwbGUiIT1hKXt2YXIgZD15YSgibmctIitjKTt2YltkXT1mdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiQSIscHJpb3JpdHk6MTAwLGxpbms6ZnVuY3Rpb24oYSxmLGcpe2EuJHdhdGNoKGdbZF0sZnVuY3Rpb24oYSl7Zy4kc2V0KGMsISFhKX0pfX19fX0pOworcyhOYyxmdW5jdGlvbihhLGMpe3ZiW2NdPWZ1bmN0aW9uKCl7cmV0dXJue3ByaW9yaXR5OjEwMCxsaW5rOmZ1bmN0aW9uKGEsZSxmKXtpZigibmdQYXR0ZXJuIj09PWMmJiIvIj09Zi5uZ1BhdHRlcm4uY2hhckF0KDApJiYoZT1mLm5nUGF0dGVybi5tYXRjaChPZikpKXtmLiRzZXQoIm5nUGF0dGVybiIsbmV3IFJlZ0V4cChlWzFdLGVbMl0pKTtyZXR1cm59YS4kd2F0Y2goZltjXSxmdW5jdGlvbihhKXtmLiRzZXQoYyxhKX0pfX19fSk7cyhbInNyYyIsInNyY3NldCIsImhyZWYiXSxmdW5jdGlvbihhKXt2YXIgYz15YSgibmctIithKTt2YltjXT1mdW5jdGlvbigpe3JldHVybntwcmlvcml0eTo5OSxsaW5rOmZ1bmN0aW9uKGQsZSxmKXt2YXIgZz1hLGg9YTsiaHJlZiI9PT1hJiYiW29iamVjdCBTVkdBbmltYXRlZFN0cmluZ10iPT09RGEuY2FsbChlLnByb3AoImhyZWYiKSkmJihoPSJ4bGlua0hyZWYiLGYuJGF0dHJbaF09InhsaW5rOmhyZWYiLGc9bnVsbCk7Zi4kb2JzZXJ2ZShjLGZ1bmN0aW9uKGMpe2M/CisoZi4kc2V0KGgsYyksUmEmJmcmJmUucHJvcChnLGZbaF0pKToiaHJlZiI9PT1hJiZmLiRzZXQoaCxudWxsKX0pfX19fSk7dmFyIEpiPXskYWRkQ29udHJvbDpDLCQkcmVuYW1lQ29udHJvbDpmdW5jdGlvbihhLGMpe2EuJG5hbWU9Y30sJHJlbW92ZUNvbnRyb2w6Qywkc2V0VmFsaWRpdHk6Qywkc2V0RGlydHk6Qywkc2V0UHJpc3RpbmU6Qywkc2V0U3VibWl0dGVkOkN9O3JkLiRpbmplY3Q9WyIkZWxlbWVudCIsIiRhdHRycyIsIiRzY29wZSIsIiRhbmltYXRlIiwiJGludGVycG9sYXRlIl07dmFyIHlkPWZ1bmN0aW9uKGEpe3JldHVyblsiJHRpbWVvdXQiLGZ1bmN0aW9uKGMpe3JldHVybntuYW1lOiJmb3JtIixyZXN0cmljdDphPyJFQUMiOiJFIixjb250cm9sbGVyOnJkLGNvbXBpbGU6ZnVuY3Rpb24oYSl7YS5hZGRDbGFzcyhTYSkuYWRkQ2xhc3Moa2IpO3JldHVybntwcmU6ZnVuY3Rpb24oYSxkLGcsaCl7aWYoISgiYWN0aW9uImluIGcpKXt2YXIgbD1mdW5jdGlvbihjKXthLiRhcHBseShmdW5jdGlvbigpe2guJGNvbW1pdFZpZXdWYWx1ZSgpOworaC4kc2V0U3VibWl0dGVkKCl9KTtjLnByZXZlbnREZWZhdWx0KCl9O2RbMF0uYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IixsLCExKTtkLm9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXtjKGZ1bmN0aW9uKCl7ZFswXS5yZW1vdmVFdmVudExpc3RlbmVyKCJzdWJtaXQiLGwsITEpfSwwLCExKX0pfXZhciBrPWguJCRwYXJlbnRGb3JtLG09aC4kbmFtZTttJiYoZ2IoYSxtLGgsbSksZy4kb2JzZXJ2ZShnLm5hbWU/Im5hbWUiOiJuZ0Zvcm0iLGZ1bmN0aW9uKGMpe20hPT1jJiYoZ2IoYSxtLHQsbSksbT1jLGdiKGEsbSxoLG0pLGsuJCRyZW5hbWVDb250cm9sKGgsbSkpfSkpO2Qub24oIiRkZXN0cm95IixmdW5jdGlvbigpe2suJHJlbW92ZUNvbnRyb2woaCk7bSYmZ2IoYSxtLHQsbSk7eihoLEpiKX0pfX19fX1dfSxVZD15ZCgpLGdlPXlkKCEwKSxOZj0vXGR7NH0tWzAxXVxkLVswLTNdXGRUWzAtMl1cZDpbMC01XVxkOlswLTVdXGRcLlxkKyhbKy1dWzAtMl1cZDpbMC01XVxkfFopLyxZZj0vXihmdHB8aHR0cHxodHRwcyk6XC9cLyhcdys6ezAsMX1cdypAKT8oXFMrKSg6WzAtOV0rKT8oXC98XC8oW1x3IyE6Lj8rPSYlQCFcLVwvXSkpPyQvLAorWmY9L15bYS16MC05ISMkJSYnKitcLz0/Xl9ge3x9fi4tXStAW2EtejAtOV0oW2EtejAtOS1dKlthLXowLTldKT8oXC5bYS16MC05XShbYS16MC05LV0qW2EtejAtOV0pPykqJC9pLCRmPS9eXHMqKFwtfFwrKT8oXGQrfChcZCooXC5cZCopKSlccyokLyx6ZD0vXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pJC8sQWQ9L14oXGR7NH0pLShcZFxkKS0oXGRcZClUKFxkXGQpOihcZFxkKSg/OjooXGRcZCkoXC5cZHsxLDN9KT8pPyQvLGpjPS9eKFxkezR9KS1XKFxkXGQpJC8sQmQ9L14oXGR7NH0pLShcZFxkKSQvLENkPS9eKFxkXGQpOihcZFxkKSg/OjooXGRcZCkoXC5cZHsxLDN9KT8pPyQvLGFnPS8oXHMrfF4pZGVmYXVsdChccyt8JCkvLE1iPW5ldyBUKCJuZ01vZGVsIiksRGQ9e3RleHQ6ZnVuY3Rpb24oYSxjLGQsZSxmLGcpe2liKGEsYyxkLGUsZixnKTtoYyhlKX0sZGF0ZTpqYigiZGF0ZSIsemQsTGIoemQsWyJ5eXl5IiwiTU0iLCJkZCJdKSwieXl5eS1NTS1kZCIpLCJkYXRldGltZS1sb2NhbCI6amIoImRhdGV0aW1lbG9jYWwiLAorQWQsTGIoQWQsInl5eXkgTU0gZGQgSEggbW0gc3Mgc3NzIi5zcGxpdCgiICIpKSwieXl5eS1NTS1kZFRISDptbTpzcy5zc3MiKSx0aW1lOmpiKCJ0aW1lIixDZCxMYihDZCxbIkhIIiwibW0iLCJzcyIsInNzcyJdKSwiSEg6bW06c3Muc3NzIiksd2VlazpqYigid2VlayIsamMsZnVuY3Rpb24oYSxjKXtpZihwYShhKSlyZXR1cm4gYTtpZihGKGEpKXtqYy5sYXN0SW5kZXg9MDt2YXIgZD1qYy5leGVjKGEpO2lmKGQpe3ZhciBlPStkWzFdLGY9K2RbMl0sZz1kPTAsaD0wLGw9MCxrPXBkKGUpLGY9NyooZi0xKTtjJiYoZD1jLmdldEhvdXJzKCksZz1jLmdldE1pbnV0ZXMoKSxoPWMuZ2V0U2Vjb25kcygpLGw9Yy5nZXRNaWxsaXNlY29uZHMoKSk7cmV0dXJuIG5ldyBEYXRlKGUsMCxrLmdldERhdGUoKStmLGQsZyxoLGwpfX1yZXR1cm4gTmFOfSwieXl5eS1Xd3ciKSxtb250aDpqYigibW9udGgiLEJkLExiKEJkLFsieXl5eSIsIk1NIl0pLCJ5eXl5LU1NIiksbnVtYmVyOmZ1bmN0aW9uKGEsCitjLGQsZSxmLGcpe3RkKGEsYyxkLGUpO2liKGEsYyxkLGUsZixnKTtlLiQkcGFyc2VyTmFtZT0ibnVtYmVyIjtlLiRwYXJzZXJzLnB1c2goZnVuY3Rpb24oYSl7cmV0dXJuIGUuJGlzRW1wdHkoYSk/bnVsbDokZi50ZXN0KGEpP3BhcnNlRmxvYXQoYSk6dH0pO2UuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbihhKXtpZighZS4kaXNFbXB0eShhKSl7aWYoIVYoYSkpdGhyb3cgTWIoIm51bWZtdCIsYSk7YT1hLnRvU3RyaW5nKCl9cmV0dXJuIGF9KTtpZihkLm1pbnx8ZC5uZ01pbil7dmFyIGg7ZS4kdmFsaWRhdG9ycy5taW49ZnVuY3Rpb24oYSl7cmV0dXJuIGUuJGlzRW1wdHkoYSl8fEQoaCl8fGE+PWh9O2QuJG9ic2VydmUoIm1pbiIsZnVuY3Rpb24oYSl7eShhKSYmIVYoYSkmJihhPXBhcnNlRmxvYXQoYSwxMCkpO2g9VihhKSYmIWlzTmFOKGEpP2E6dDtlLiR2YWxpZGF0ZSgpfSl9aWYoZC5tYXh8fGQubmdNYXgpe3ZhciBsO2UuJHZhbGlkYXRvcnMubWF4PWZ1bmN0aW9uKGEpe3JldHVybiBlLiRpc0VtcHR5KGEpfHwKK0QobCl8fGE8PWx9O2QuJG9ic2VydmUoIm1heCIsZnVuY3Rpb24oYSl7eShhKSYmIVYoYSkmJihhPXBhcnNlRmxvYXQoYSwxMCkpO2w9VihhKSYmIWlzTmFOKGEpP2E6dDtlLiR2YWxpZGF0ZSgpfSl9fSx1cmw6ZnVuY3Rpb24oYSxjLGQsZSxmLGcpe2liKGEsYyxkLGUsZixnKTtoYyhlKTtlLiQkcGFyc2VyTmFtZT0idXJsIjtlLiR2YWxpZGF0b3JzLnVybD1mdW5jdGlvbihhLGMpe3ZhciBkPWF8fGM7cmV0dXJuIGUuJGlzRW1wdHkoZCl8fFlmLnRlc3QoZCl9fSxlbWFpbDpmdW5jdGlvbihhLGMsZCxlLGYsZyl7aWIoYSxjLGQsZSxmLGcpO2hjKGUpO2UuJCRwYXJzZXJOYW1lPSJlbWFpbCI7ZS4kdmFsaWRhdG9ycy5lbWFpbD1mdW5jdGlvbihhLGMpe3ZhciBkPWF8fGM7cmV0dXJuIGUuJGlzRW1wdHkoZCl8fFpmLnRlc3QoZCl9fSxyYWRpbzpmdW5jdGlvbihhLGMsZCxlKXtEKGQubmFtZSkmJmMuYXR0cigibmFtZSIsKytuYik7Yy5vbigiY2xpY2siLGZ1bmN0aW9uKGEpe2NbMF0uY2hlY2tlZCYmCitlLiRzZXRWaWV3VmFsdWUoZC52YWx1ZSxhJiZhLnR5cGUpfSk7ZS4kcmVuZGVyPWZ1bmN0aW9uKCl7Y1swXS5jaGVja2VkPWQudmFsdWU9PWUuJHZpZXdWYWx1ZX07ZC4kb2JzZXJ2ZSgidmFsdWUiLGUuJHJlbmRlcil9LGNoZWNrYm94OmZ1bmN0aW9uKGEsYyxkLGUsZixnLGgsbCl7dmFyIGs9dWQobCxhLCJuZ1RydWVWYWx1ZSIsZC5uZ1RydWVWYWx1ZSwhMCksbT11ZChsLGEsIm5nRmFsc2VWYWx1ZSIsZC5uZ0ZhbHNlVmFsdWUsITEpO2Mub24oImNsaWNrIixmdW5jdGlvbihhKXtlLiRzZXRWaWV3VmFsdWUoY1swXS5jaGVja2VkLGEmJmEudHlwZSl9KTtlLiRyZW5kZXI9ZnVuY3Rpb24oKXtjWzBdLmNoZWNrZWQ9ZS4kdmlld1ZhbHVlfTtlLiRpc0VtcHR5PWZ1bmN0aW9uKGEpe3JldHVybiExPT09YX07ZS4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBmYShhLGspfSk7ZS4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBhP2s6bX0pfSxoaWRkZW46QywKK2J1dHRvbjpDLHN1Ym1pdDpDLHJlc2V0OkMsZmlsZTpDfSx4Yz1bIiRicm93c2VyIiwiJHNuaWZmZXIiLCIkZmlsdGVyIiwiJHBhcnNlIixmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm57cmVzdHJpY3Q6IkUiLHJlcXVpcmU6WyI/bmdNb2RlbCJdLGxpbms6e3ByZTpmdW5jdGlvbihmLGcsaCxsKXtsWzBdJiYoRGRbUShoLnR5cGUpXXx8RGQudGV4dCkoZixnLGgsbFswXSxjLGEsZCxlKX19fX1dLGtiPSJuZy12YWxpZCIsdmQ9Im5nLWludmFsaWQiLFNhPSJuZy1wcmlzdGluZSIsS2I9Im5nLWRpcnR5Iix4ZD0ibmctcGVuZGluZyIsYmc9WyIkc2NvcGUiLCIkZXhjZXB0aW9uSGFuZGxlciIsIiRhdHRycyIsIiRlbGVtZW50IiwiJHBhcnNlIiwiJGFuaW1hdGUiLCIkdGltZW91dCIsIiRyb290U2NvcGUiLCIkcSIsIiRpbnRlcnBvbGF0ZSIsZnVuY3Rpb24oYSxjLGQsZSxmLGcsaCxsLGssbSl7dGhpcy4kbW9kZWxWYWx1ZT10aGlzLiR2aWV3VmFsdWU9TnVtYmVyLk5hTjt0aGlzLiQkcmF3TW9kZWxWYWx1ZT0KK3Q7dGhpcy4kdmFsaWRhdG9ycz17fTt0aGlzLiRhc3luY1ZhbGlkYXRvcnM9e307dGhpcy4kcGFyc2Vycz1bXTt0aGlzLiRmb3JtYXR0ZXJzPVtdO3RoaXMuJHZpZXdDaGFuZ2VMaXN0ZW5lcnM9W107dGhpcy4kdW50b3VjaGVkPSEwO3RoaXMuJHRvdWNoZWQ9ITE7dGhpcy4kcHJpc3RpbmU9ITA7dGhpcy4kZGlydHk9ITE7dGhpcy4kdmFsaWQ9ITA7dGhpcy4kaW52YWxpZD0hMTt0aGlzLiRlcnJvcj17fTt0aGlzLiQkc3VjY2Vzcz17fTt0aGlzLiRwZW5kaW5nPXQ7dGhpcy4kbmFtZT1tKGQubmFtZXx8IiIsITEpKGEpO3ZhciBwPWYoZC5uZ01vZGVsKSxxPXAuYXNzaWduLHU9cCxyPXEsTz1udWxsLG49dGhpczt0aGlzLiQkc2V0T3B0aW9ucz1mdW5jdGlvbihhKXtpZigobi4kb3B0aW9ucz1hKSYmYS5nZXR0ZXJTZXR0ZXIpe3ZhciBjPWYoZC5uZ01vZGVsKyIoKSIpLGc9ZihkLm5nTW9kZWwrIigkJCRwKSIpO3U9ZnVuY3Rpb24oYSl7dmFyIGQ9cChhKTtHKGQpJiYoZD1jKGEpKTtyZXR1cm4gZH07CityPWZ1bmN0aW9uKGEsYyl7RyhwKGEpKT9nKGEseyQkJHA6bi4kbW9kZWxWYWx1ZX0pOnEoYSxuLiRtb2RlbFZhbHVlKX19ZWxzZSBpZighcC5hc3NpZ24pdGhyb3cgTWIoIm5vbmFzc2lnbiIsZC5uZ01vZGVsLHZhKGUpKTt9O3RoaXMuJHJlbmRlcj1DO3RoaXMuJGlzRW1wdHk9ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSl8fCIiPT09YXx8bnVsbD09PWF8fGEhPT1hfTt2YXIgdj1lLmluaGVyaXRlZERhdGEoIiRmb3JtQ29udHJvbGxlciIpfHxKYix3PTA7c2Qoe2N0cmw6dGhpcywkZWxlbWVudDplLHNldDpmdW5jdGlvbihhLGMpe2FbY109ITB9LHVuc2V0OmZ1bmN0aW9uKGEsYyl7ZGVsZXRlIGFbY119LHBhcmVudEZvcm06diwkYW5pbWF0ZTpnfSk7dGhpcy4kc2V0UHJpc3RpbmU9ZnVuY3Rpb24oKXtuLiRkaXJ0eT0hMTtuLiRwcmlzdGluZT0hMDtnLnJlbW92ZUNsYXNzKGUsS2IpO2cuYWRkQ2xhc3MoZSxTYSl9O3RoaXMuJHNldERpcnR5PWZ1bmN0aW9uKCl7bi4kZGlydHk9ITA7bi4kcHJpc3RpbmU9CishMTtnLnJlbW92ZUNsYXNzKGUsU2EpO2cuYWRkQ2xhc3MoZSxLYik7di4kc2V0RGlydHkoKX07dGhpcy4kc2V0VW50b3VjaGVkPWZ1bmN0aW9uKCl7bi4kdG91Y2hlZD0hMTtuLiR1bnRvdWNoZWQ9ITA7Zy5zZXRDbGFzcyhlLCJuZy11bnRvdWNoZWQiLCJuZy10b3VjaGVkIil9O3RoaXMuJHNldFRvdWNoZWQ9ZnVuY3Rpb24oKXtuLiR0b3VjaGVkPSEwO24uJHVudG91Y2hlZD0hMTtnLnNldENsYXNzKGUsIm5nLXRvdWNoZWQiLCJuZy11bnRvdWNoZWQiKX07dGhpcy4kcm9sbGJhY2tWaWV3VmFsdWU9ZnVuY3Rpb24oKXtoLmNhbmNlbChPKTtuLiR2aWV3VmFsdWU9bi4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWU7bi4kcmVuZGVyKCl9O3RoaXMuJHZhbGlkYXRlPWZ1bmN0aW9uKCl7aWYoIVYobi4kbW9kZWxWYWx1ZSl8fCFpc05hTihuLiRtb2RlbFZhbHVlKSl7dmFyIGE9bi4kJHJhd01vZGVsVmFsdWUsYz1uLiR2YWxpZCxkPW4uJG1vZGVsVmFsdWUsZT1uLiRvcHRpb25zJiZuLiRvcHRpb25zLmFsbG93SW52YWxpZDsKK24uJCRydW5WYWxpZGF0b3JzKG4uJGVycm9yW24uJCRwYXJzZXJOYW1lfHwicGFyc2UiXT8hMTp0LGEsbi4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWUsZnVuY3Rpb24oZil7ZXx8Yz09PWZ8fChuLiRtb2RlbFZhbHVlPWY/YTp0LG4uJG1vZGVsVmFsdWUhPT1kJiZuLiQkd3JpdGVNb2RlbFRvU2NvcGUoKSl9KX19O3RoaXMuJCRydW5WYWxpZGF0b3JzPWZ1bmN0aW9uKGEsYyxkLGUpe2Z1bmN0aW9uIGYoKXt2YXIgYT0hMDtzKG4uJHZhbGlkYXRvcnMsZnVuY3Rpb24oZSxmKXt2YXIgZz1lKGMsZCk7YT1hJiZnO2goZixnKX0pO3JldHVybiBhPyEwOihzKG4uJGFzeW5jVmFsaWRhdG9ycyxmdW5jdGlvbihhLGMpe2goYyxudWxsKX0pLCExKX1mdW5jdGlvbiBnKCl7dmFyIGE9W10sZT0hMDtzKG4uJGFzeW5jVmFsaWRhdG9ycyxmdW5jdGlvbihmLGcpe3ZhciBsPWYoYyxkKTtpZighbHx8IUcobC50aGVuKSl0aHJvdyBNYigiJGFzeW5jVmFsaWRhdG9ycyIsbCk7aChnLHQpO2EucHVzaChsLnRoZW4oZnVuY3Rpb24oKXtoKGcsCishMCl9LGZ1bmN0aW9uKGEpe2U9ITE7aChnLCExKX0pKX0pO2EubGVuZ3RoP2suYWxsKGEpLnRoZW4oZnVuY3Rpb24oKXtsKGUpfSxDKTpsKCEwKX1mdW5jdGlvbiBoKGEsYyl7bT09PXcmJm4uJHNldFZhbGlkaXR5KGEsYyl9ZnVuY3Rpb24gbChhKXttPT09dyYmZShhKX13Kys7dmFyIG09dzsoZnVuY3Rpb24oYSl7dmFyIGM9bi4kJHBhcnNlck5hbWV8fCJwYXJzZSI7aWYoYT09PXQpaChjLG51bGwpO2Vsc2UgaWYoaChjLGEpLCFhKXJldHVybiBzKG4uJHZhbGlkYXRvcnMsZnVuY3Rpb24oYSxjKXtoKGMsbnVsbCl9KSxzKG4uJGFzeW5jVmFsaWRhdG9ycyxmdW5jdGlvbihhLGMpe2goYyxudWxsKX0pLCExO3JldHVybiEwfSkoYSk/ZigpP2coKTpsKCExKTpsKCExKX07dGhpcy4kY29tbWl0Vmlld1ZhbHVlPWZ1bmN0aW9uKCl7dmFyIGE9bi4kdmlld1ZhbHVlO2guY2FuY2VsKE8pO2lmKG4uJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlIT09YXx8IiI9PT1hJiZuLiQkaGFzTmF0aXZlVmFsaWRhdG9ycyluLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZT0KK2Esbi4kcHJpc3RpbmUmJnRoaXMuJHNldERpcnR5KCksdGhpcy4kJHBhcnNlQW5kVmFsaWRhdGUoKX07dGhpcy4kJHBhcnNlQW5kVmFsaWRhdGU9ZnVuY3Rpb24oKXt2YXIgYz1uLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZSxkPUQoYyk/dDohMDtpZihkKWZvcih2YXIgZT0wO2U8bi4kcGFyc2Vycy5sZW5ndGg7ZSsrKWlmKGM9bi4kcGFyc2Vyc1tlXShjKSxEKGMpKXtkPSExO2JyZWFrfVYobi4kbW9kZWxWYWx1ZSkmJmlzTmFOKG4uJG1vZGVsVmFsdWUpJiYobi4kbW9kZWxWYWx1ZT11KGEpKTt2YXIgZj1uLiRtb2RlbFZhbHVlLGc9bi4kb3B0aW9ucyYmbi4kb3B0aW9ucy5hbGxvd0ludmFsaWQ7bi4kJHJhd01vZGVsVmFsdWU9YztnJiYobi4kbW9kZWxWYWx1ZT1jLG4uJG1vZGVsVmFsdWUhPT1mJiZuLiQkd3JpdGVNb2RlbFRvU2NvcGUoKSk7bi4kJHJ1blZhbGlkYXRvcnMoZCxjLG4uJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlLGZ1bmN0aW9uKGEpe2d8fChuLiRtb2RlbFZhbHVlPQorYT9jOnQsbi4kbW9kZWxWYWx1ZSE9PWYmJm4uJCR3cml0ZU1vZGVsVG9TY29wZSgpKX0pfTt0aGlzLiQkd3JpdGVNb2RlbFRvU2NvcGU9ZnVuY3Rpb24oKXtyKGEsbi4kbW9kZWxWYWx1ZSk7cyhuLiR2aWV3Q2hhbmdlTGlzdGVuZXJzLGZ1bmN0aW9uKGEpe3RyeXthKCl9Y2F0Y2goZCl7YyhkKX19KX07dGhpcy4kc2V0Vmlld1ZhbHVlPWZ1bmN0aW9uKGEsYyl7bi4kdmlld1ZhbHVlPWE7bi4kb3B0aW9ucyYmIW4uJG9wdGlvbnMudXBkYXRlT25EZWZhdWx0fHxuLiQkZGVib3VuY2VWaWV3VmFsdWVDb21taXQoYyl9O3RoaXMuJCRkZWJvdW5jZVZpZXdWYWx1ZUNvbW1pdD1mdW5jdGlvbihjKXt2YXIgZD0wLGU9bi4kb3B0aW9ucztlJiZ5KGUuZGVib3VuY2UpJiYoZT1lLmRlYm91bmNlLFYoZSk/ZD1lOlYoZVtjXSk/ZD1lW2NdOlYoZVsiZGVmYXVsdCJdKSYmKGQ9ZVsiZGVmYXVsdCJdKSk7aC5jYW5jZWwoTyk7ZD9PPWgoZnVuY3Rpb24oKXtuLiRjb21taXRWaWV3VmFsdWUoKX0sZCk6CitsLiQkcGhhc2U/bi4kY29tbWl0Vmlld1ZhbHVlKCk6YS4kYXBwbHkoZnVuY3Rpb24oKXtuLiRjb21taXRWaWV3VmFsdWUoKX0pfTthLiR3YXRjaChmdW5jdGlvbigpe3ZhciBjPXUoYSk7aWYoYyE9PW4uJG1vZGVsVmFsdWUpe24uJG1vZGVsVmFsdWU9bi4kJHJhd01vZGVsVmFsdWU9Yztmb3IodmFyIGQ9bi4kZm9ybWF0dGVycyxlPWQubGVuZ3RoLGY9YztlLS07KWY9ZFtlXShmKTtuLiR2aWV3VmFsdWUhPT1mJiYobi4kdmlld1ZhbHVlPW4uJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlPWYsbi4kcmVuZGVyKCksbi4kJHJ1blZhbGlkYXRvcnModCxjLGYsQykpfXJldHVybiBjfSl9XSx2ZT1bIiRyb290U2NvcGUiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiQSIscmVxdWlyZTpbIm5nTW9kZWwiLCJeP2Zvcm0iLCJeP25nTW9kZWxPcHRpb25zIl0sY29udHJvbGxlcjpiZyxwcmlvcml0eToxLGNvbXBpbGU6ZnVuY3Rpb24oYyl7Yy5hZGRDbGFzcyhTYSkuYWRkQ2xhc3MoIm5nLXVudG91Y2hlZCIpLmFkZENsYXNzKGtiKTsKK3JldHVybntwcmU6ZnVuY3Rpb24oYSxjLGYsZyl7dmFyIGg9Z1swXSxsPWdbMV18fEpiO2guJCRzZXRPcHRpb25zKGdbMl0mJmdbMl0uJG9wdGlvbnMpO2wuJGFkZENvbnRyb2woaCk7Zi4kb2JzZXJ2ZSgibmFtZSIsZnVuY3Rpb24oYSl7aC4kbmFtZSE9PWEmJmwuJCRyZW5hbWVDb250cm9sKGgsYSl9KTthLiRvbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7bC4kcmVtb3ZlQ29udHJvbChoKX0pfSxwb3N0OmZ1bmN0aW9uKGMsZSxmLGcpe3ZhciBoPWdbMF07aWYoaC4kb3B0aW9ucyYmaC4kb3B0aW9ucy51cGRhdGVPbillLm9uKGguJG9wdGlvbnMudXBkYXRlT24sZnVuY3Rpb24oYSl7aC4kJGRlYm91bmNlVmlld1ZhbHVlQ29tbWl0KGEmJmEudHlwZSl9KTtlLm9uKCJibHVyIixmdW5jdGlvbihlKXtoLiR0b3VjaGVkfHwoYS4kJHBoYXNlP2MuJGV2YWxBc3luYyhoLiRzZXRUb3VjaGVkKTpjLiRhcHBseShoLiRzZXRUb3VjaGVkKSl9KX19fX19XSx4ZT1kYSh7cmVzdHJpY3Q6IkEiLHJlcXVpcmU6Im5nTW9kZWwiLAorbGluazpmdW5jdGlvbihhLGMsZCxlKXtlLiR2aWV3Q2hhbmdlTGlzdGVuZXJzLnB1c2goZnVuY3Rpb24oKXthLiRldmFsKGQubmdDaGFuZ2UpfSl9fSksemM9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkEiLHJlcXVpcmU6Ij9uZ01vZGVsIixsaW5rOmZ1bmN0aW9uKGEsYyxkLGUpe2UmJihkLnJlcXVpcmVkPSEwLGUuJHZhbGlkYXRvcnMucmVxdWlyZWQ9ZnVuY3Rpb24oYSxjKXtyZXR1cm4hZC5yZXF1aXJlZHx8IWUuJGlzRW1wdHkoYyl9LGQuJG9ic2VydmUoInJlcXVpcmVkIixmdW5jdGlvbigpe2UuJHZhbGlkYXRlKCl9KSl9fX0seWM9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkEiLHJlcXVpcmU6Ij9uZ01vZGVsIixsaW5rOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKGUpe3ZhciBmLGc9ZC5uZ1BhdHRlcm58fGQucGF0dGVybjtkLiRvYnNlcnZlKCJwYXR0ZXJuIixmdW5jdGlvbihhKXtGKGEpJiYwPGEubGVuZ3RoJiYoYT1uZXcgUmVnRXhwKCJeIithKyIkIikpO2lmKGEmJgorIWEudGVzdCl0aHJvdyBUKCJuZ1BhdHRlcm4iKSgibm9yZWdleHAiLGcsYSx2YShjKSk7Zj1hfHx0O2UuJHZhbGlkYXRlKCl9KTtlLiR2YWxpZGF0b3JzLnBhdHRlcm49ZnVuY3Rpb24oYSl7cmV0dXJuIGUuJGlzRW1wdHkoYSl8fEQoZil8fGYudGVzdChhKX19fX19LEJjPWZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJBIixyZXF1aXJlOiI/bmdNb2RlbCIsbGluazpmdW5jdGlvbihhLGMsZCxlKXtpZihlKXt2YXIgZj0tMTtkLiRvYnNlcnZlKCJtYXhsZW5ndGgiLGZ1bmN0aW9uKGEpe2E9YmEoYSk7Zj1pc05hTihhKT8tMTphO2UuJHZhbGlkYXRlKCl9KTtlLiR2YWxpZGF0b3JzLm1heGxlbmd0aD1mdW5jdGlvbihhLGMpe3JldHVybiAwPmZ8fGUuJGlzRW1wdHkoYSl8fGMubGVuZ3RoPD1mfX19fX0sQWM9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkEiLHJlcXVpcmU6Ij9uZ01vZGVsIixsaW5rOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKGUpe3ZhciBmPTA7ZC4kb2JzZXJ2ZSgibWlubGVuZ3RoIiwKK2Z1bmN0aW9uKGEpe2Y9YmEoYSl8fDA7ZS4kdmFsaWRhdGUoKX0pO2UuJHZhbGlkYXRvcnMubWlubGVuZ3RoPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGUuJGlzRW1wdHkoYyl8fGMubGVuZ3RoPj1mfX19fX0sd2U9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkEiLHByaW9yaXR5OjEwMCxyZXF1aXJlOiJuZ01vZGVsIixsaW5rOmZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmPWMuYXR0cihkLiRhdHRyLm5nTGlzdCl8fCIsICIsZz0iZmFsc2UiIT09ZC5uZ1RyaW0saD1nP1UoZik6ZjtlLiRwYXJzZXJzLnB1c2goZnVuY3Rpb24oYSl7aWYoIUQoYSkpe3ZhciBjPVtdO2EmJnMoYS5zcGxpdChoKSxmdW5jdGlvbihhKXthJiZjLnB1c2goZz9VKGEpOmEpfSk7cmV0dXJuIGN9fSk7ZS4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiB4KGEpP2Euam9pbihmKTp0fSk7ZS4kaXNFbXB0eT1mdW5jdGlvbihhKXtyZXR1cm4hYXx8IWEubGVuZ3RofX19fSxjZz0vXih0cnVlfGZhbHNlfFxkKykkLywKK3llPWZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OiJBIixwcmlvcml0eToxMDAsY29tcGlsZTpmdW5jdGlvbihhLGMpe3JldHVybiBjZy50ZXN0KGMubmdWYWx1ZSk/ZnVuY3Rpb24oYSxjLGYpe2YuJHNldCgidmFsdWUiLGEuJGV2YWwoZi5uZ1ZhbHVlKSl9OmZ1bmN0aW9uKGEsYyxmKXthLiR3YXRjaChmLm5nVmFsdWUsZnVuY3Rpb24oYSl7Zi4kc2V0KCJ2YWx1ZSIsYSl9KX19fX0semU9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkEiLGNvbnRyb2xsZXI6WyIkc2NvcGUiLCIkYXR0cnMiLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpczt0aGlzLiRvcHRpb25zPWEuJGV2YWwoYy5uZ01vZGVsT3B0aW9ucyk7dGhpcy4kb3B0aW9ucy51cGRhdGVPbiE9PXQ/KHRoaXMuJG9wdGlvbnMudXBkYXRlT25EZWZhdWx0PSExLHRoaXMuJG9wdGlvbnMudXBkYXRlT249VSh0aGlzLiRvcHRpb25zLnVwZGF0ZU9uLnJlcGxhY2UoYWcsZnVuY3Rpb24oKXtkLiRvcHRpb25zLnVwZGF0ZU9uRGVmYXVsdD0KKyEwO3JldHVybiIgIn0pKSk6dGhpcy4kb3B0aW9ucy51cGRhdGVPbkRlZmF1bHQ9ITB9XX19LFpkPVsiJGNvbXBpbGUiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiQUMiLGNvbXBpbGU6ZnVuY3Rpb24oYyl7YS4kJGFkZEJpbmRpbmdDbGFzcyhjKTtyZXR1cm4gZnVuY3Rpb24oYyxlLGYpe2EuJCRhZGRCaW5kaW5nSW5mbyhlLGYubmdCaW5kKTtlPWVbMF07Yy4kd2F0Y2goZi5uZ0JpbmQsZnVuY3Rpb24oYSl7ZS50ZXh0Q29udGVudD1hPT09dD8iIjphfSl9fX19XSxhZT1bIiRpbnRlcnBvbGF0ZSIsIiRjb21waWxlIixmdW5jdGlvbihhLGMpe3JldHVybntjb21waWxlOmZ1bmN0aW9uKGQpe2MuJCRhZGRCaW5kaW5nQ2xhc3MoZCk7cmV0dXJuIGZ1bmN0aW9uKGQsZixnKXtkPWEoZi5hdHRyKGcuJGF0dHIubmdCaW5kVGVtcGxhdGUpKTtjLiQkYWRkQmluZGluZ0luZm8oZixkLmV4cHJlc3Npb25zKTtmPWZbMF07Zy4kb2JzZXJ2ZSgibmdCaW5kVGVtcGxhdGUiLGZ1bmN0aW9uKGEpe2YudGV4dENvbnRlbnQ9CithPT09dD8iIjphfSl9fX19XSwkZD1bIiRzY2UiLCIkcGFyc2UiLCIkY29tcGlsZSIsZnVuY3Rpb24oYSxjLGQpe3JldHVybntyZXN0cmljdDoiQSIsY29tcGlsZTpmdW5jdGlvbihlLGYpe3ZhciBnPWMoZi5uZ0JpbmRIdG1sKSxoPWMoZi5uZ0JpbmRIdG1sLGZ1bmN0aW9uKGEpe3JldHVybihhfHwiIikudG9TdHJpbmcoKX0pO2QuJCRhZGRCaW5kaW5nQ2xhc3MoZSk7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmKXtkLiQkYWRkQmluZGluZ0luZm8oZSxmLm5nQmluZEh0bWwpO2MuJHdhdGNoKGgsZnVuY3Rpb24oKXtlLmh0bWwoYS5nZXRUcnVzdGVkSHRtbChnKGMpKXx8IiIpfSl9fX19XSxiZT1pYygiIiwhMCksZGU9aWMoIk9kZCIsMCksY2U9aWMoIkV2ZW4iLDEpLGVlPUphKHtjb21waWxlOmZ1bmN0aW9uKGEsYyl7Yy4kc2V0KCJuZ0Nsb2FrIix0KTthLnJlbW92ZUNsYXNzKCJuZy1jbG9hayIpfX0pLGZlPVtmdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiQSIsc2NvcGU6ITAsY29udHJvbGxlcjoiQCIsCitwcmlvcml0eTo1MDB9fV0sQ2M9e30sZGc9e2JsdXI6ITAsZm9jdXM6ITB9O3MoImNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZW1vdmUgbW91c2VlbnRlciBtb3VzZWxlYXZlIGtleWRvd24ga2V5dXAga2V5cHJlc3Mgc3VibWl0IGZvY3VzIGJsdXIgY29weSBjdXQgcGFzdGUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSl7dmFyIGM9eWEoIm5nLSIrYSk7Q2NbY109WyIkcGFyc2UiLCIkcm9vdFNjb3BlIixmdW5jdGlvbihkLGUpe3JldHVybntyZXN0cmljdDoiQSIsY29tcGlsZTpmdW5jdGlvbihmLGcpe3ZhciBoPWQoZ1tjXSxudWxsLCEwKTtyZXR1cm4gZnVuY3Rpb24oYyxkKXtkLm9uKGEsZnVuY3Rpb24oZCl7dmFyIGY9ZnVuY3Rpb24oKXtoKGMseyRldmVudDpkfSl9O2RnW2FdJiZlLiQkcGhhc2U/Yy4kZXZhbEFzeW5jKGYpOmMuJGFwcGx5KGYpfSl9fX19XX0pO3ZhciBpZT1bIiRhbmltYXRlIixmdW5jdGlvbihhKXtyZXR1cm57bXVsdGlFbGVtZW50OiEwLAordHJhbnNjbHVkZToiZWxlbWVudCIscHJpb3JpdHk6NjAwLHRlcm1pbmFsOiEwLHJlc3RyaWN0OiJBIiwkJHRsYjohMCxsaW5rOmZ1bmN0aW9uKGMsZCxlLGYsZyl7dmFyIGgsbCxrO2MuJHdhdGNoKGUubmdJZixmdW5jdGlvbihjKXtjP2x8fGcoZnVuY3Rpb24oYyxmKXtsPWY7Y1tjLmxlbmd0aCsrXT1ZLmNyZWF0ZUNvbW1lbnQoIiBlbmQgbmdJZjogIitlLm5nSWYrIiAiKTtoPXtjbG9uZTpjfTthLmVudGVyKGMsZC5wYXJlbnQoKSxkKX0pOihrJiYoay5yZW1vdmUoKSxrPW51bGwpLGwmJihsLiRkZXN0cm95KCksbD1udWxsKSxoJiYoaz10YihoLmNsb25lKSxhLmxlYXZlKGspLnRoZW4oZnVuY3Rpb24oKXtrPW51bGx9KSxoPW51bGwpKX0pfX19XSxqZT1bIiR0ZW1wbGF0ZVJlcXVlc3QiLCIkYW5jaG9yU2Nyb2xsIiwiJGFuaW1hdGUiLCIkc2NlIixmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm57cmVzdHJpY3Q6IkVDQSIscHJpb3JpdHk6NDAwLHRlcm1pbmFsOiEwLHRyYW5zY2x1ZGU6ImVsZW1lbnQiLAorY29udHJvbGxlcjpnYS5ub29wLGNvbXBpbGU6ZnVuY3Rpb24oZixnKXt2YXIgaD1nLm5nSW5jbHVkZXx8Zy5zcmMsbD1nLm9ubG9hZHx8IiIsaz1nLmF1dG9zY3JvbGw7cmV0dXJuIGZ1bmN0aW9uKGYsZyxxLHMscil7dmFyIHQ9MCxuLHYsdyxMPWZ1bmN0aW9uKCl7diYmKHYucmVtb3ZlKCksdj1udWxsKTtuJiYobi4kZGVzdHJveSgpLG49bnVsbCk7dyYmKGQubGVhdmUodykudGhlbihmdW5jdGlvbigpe3Y9bnVsbH0pLHY9dyx3PW51bGwpfTtmLiR3YXRjaChlLnBhcnNlQXNSZXNvdXJjZVVybChoKSxmdW5jdGlvbihlKXt2YXIgaD1mdW5jdGlvbigpeyF5KGspfHxrJiYhZi4kZXZhbChrKXx8YygpfSxxPSsrdDtlPyhhKGUsITApLnRoZW4oZnVuY3Rpb24oYSl7aWYocT09PXQpe3ZhciBjPWYuJG5ldygpO3MudGVtcGxhdGU9YTthPXIoYyxmdW5jdGlvbihhKXtMKCk7ZC5lbnRlcihhLG51bGwsZykudGhlbihoKX0pO249Yzt3PWE7bi4kZW1pdCgiJGluY2x1ZGVDb250ZW50TG9hZGVkIiwKK2UpO2YuJGV2YWwobCl9fSxmdW5jdGlvbigpe3E9PT10JiYoTCgpLGYuJGVtaXQoIiRpbmNsdWRlQ29udGVudEVycm9yIixlKSl9KSxmLiRlbWl0KCIkaW5jbHVkZUNvbnRlbnRSZXF1ZXN0ZWQiLGUpKTooTCgpLHMudGVtcGxhdGU9bnVsbCl9KX19fX1dLEFlPVsiJGNvbXBpbGUiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiRUNBIixwcmlvcml0eTotNDAwLHJlcXVpcmU6Im5nSW5jbHVkZSIsbGluazpmdW5jdGlvbihjLGQsZSxmKXsvU1ZHLy50ZXN0KGRbMF0udG9TdHJpbmcoKSk/KGQuZW1wdHkoKSxhKEZjKGYudGVtcGxhdGUsWSkuY2hpbGROb2RlcykoYyxmdW5jdGlvbihhKXtkLmFwcGVuZChhKX0se2Z1dHVyZVBhcmVudEVsZW1lbnQ6ZH0pKTooZC5odG1sKGYudGVtcGxhdGUpLGEoZC5jb250ZW50cygpKShjKSl9fX1dLGtlPUphKHtwcmlvcml0eTo0NTAsY29tcGlsZTpmdW5jdGlvbigpe3JldHVybntwcmU6ZnVuY3Rpb24oYSxjLGQpe2EuJGV2YWwoZC5uZ0luaXQpfX19fSksCitsZT1KYSh7dGVybWluYWw6ITAscHJpb3JpdHk6MUUzfSksbWU9WyIkbG9jYWxlIiwiJGludGVycG9sYXRlIixmdW5jdGlvbihhLGMpe3ZhciBkPS97fS9nLGU9L153aGVuKE1pbnVzKT8oLispJC87cmV0dXJue3Jlc3RyaWN0OiJFQSIsbGluazpmdW5jdGlvbihmLGcsaCl7ZnVuY3Rpb24gbChhKXtnLnRleHQoYXx8IiIpfXZhciBrPWguY291bnQsbT1oLiRhdHRyLndoZW4mJmcuYXR0cihoLiRhdHRyLndoZW4pLHA9aC5vZmZzZXR8fDAscT1mLiRldmFsKG0pfHx7fSx1PXt9LG09Yy5zdGFydFN5bWJvbCgpLHI9Yy5lbmRTeW1ib2woKSx0PW0raysiLSIrcCtyLG49Z2Eubm9vcCx2O3MoaCxmdW5jdGlvbihhLGMpe3ZhciBkPWUuZXhlYyhjKTtkJiYoZD0oZFsxXT8iLSI6IiIpK1EoZFsyXSkscVtkXT1nLmF0dHIoaC4kYXR0cltjXSkpfSk7cyhxLGZ1bmN0aW9uKGEsZSl7dVtlXT1jKGEucmVwbGFjZShkLHQpKX0pO2YuJHdhdGNoKGssZnVuY3Rpb24oYyl7Yz1wYXJzZUZsb2F0KGMpO3ZhciBkPQoraXNOYU4oYyk7ZHx8YyBpbiBxfHwoYz1hLnBsdXJhbENhdChjLXApKTtjPT09dnx8ZCYmaXNOYU4odil8fChuKCksbj1mLiR3YXRjaCh1W2NdLGwpLHY9Yyl9KX19fV0sbmU9WyIkcGFyc2UiLCIkYW5pbWF0ZSIsZnVuY3Rpb24oYSxjKXt2YXIgZD1UKCJuZ1JlcGVhdCIpLGU9ZnVuY3Rpb24oYSxjLGQsZSxrLG0scCl7YVtkXT1lO2smJihhW2tdPW0pO2EuJGluZGV4PWM7YS4kZmlyc3Q9MD09PWM7YS4kbGFzdD1jPT09cC0xO2EuJG1pZGRsZT0hKGEuJGZpcnN0fHxhLiRsYXN0KTthLiRvZGQ9IShhLiRldmVuPTA9PT0oYyYxKSl9O3JldHVybntyZXN0cmljdDoiQSIsbXVsdGlFbGVtZW50OiEwLHRyYW5zY2x1ZGU6ImVsZW1lbnQiLHByaW9yaXR5OjFFMyx0ZXJtaW5hbDohMCwkJHRsYjohMCxjb21waWxlOmZ1bmN0aW9uKGYsZyl7dmFyIGg9Zy5uZ1JlcGVhdCxsPVkuY3JlYXRlQ29tbWVudCgiIGVuZCBuZ1JlcGVhdDogIitoKyIgIiksaz1oLm1hdGNoKC9eXHMqKFtcc1xTXSs/KVxzK2luXHMrKFtcc1xTXSs/KSg/OlxzK2FzXHMrKFtcc1xTXSs/KSk/KD86XHMrdHJhY2tccytieVxzKyhbXHNcU10rPykpP1xzKiQvKTsKK2lmKCFrKXRocm93IGQoImlleHAiLGgpO3ZhciBtPWtbMV0scD1rWzJdLHE9a1szXSx1PWtbNF0saz1tLm1hdGNoKC9eKD86KFxzKltcJFx3XSspfFwoXHMqKFtcJFx3XSspXHMqLFxzKihbXCRcd10rKVxzKlwpKSQvKTtpZighayl0aHJvdyBkKCJpaWRleHAiLG0pO3ZhciByPWtbM118fGtbMV0seT1rWzJdO2lmKHEmJighL15bJGEtekEtWl9dWyRhLXpBLVowLTlfXSokLy50ZXN0KHEpfHwvXihudWxsfHVuZGVmaW5lZHx0aGlzfFwkaW5kZXh8XCRmaXJzdHxcJG1pZGRsZXxcJGxhc3R8XCRldmVufFwkb2RkfFwkcGFyZW50KSQvLnRlc3QocSkpKXRocm93IGQoImJhZGlkZW50IixxKTt2YXIgbix2LHcsRCx6PXskaWQ6TmF9O3U/bj1hKHUpOih3PWZ1bmN0aW9uKGEsYyl7cmV0dXJuIE5hKGMpfSxEPWZ1bmN0aW9uKGEpe3JldHVybiBhfSk7cmV0dXJuIGZ1bmN0aW9uKGEsZixnLGssbSl7biYmKHY9ZnVuY3Rpb24oYyxkLGUpe3kmJih6W3ldPWMpO3pbcl09ZDt6LiRpbmRleD1lO3JldHVybiBuKGEsCit6KX0pO3ZhciB1PWhhKCk7YS4kd2F0Y2hDb2xsZWN0aW9uKHAsZnVuY3Rpb24oZyl7dmFyIGsscCxuPWZbMF0sRSx6PWhhKCksQyxTLE4sRyxKLHgsSDtxJiYoYVtxXT1nKTtpZihUYShnKSlKPWcscD12fHx3O2Vsc2V7cD12fHxEO0o9W107Zm9yKEggaW4gZylnLmhhc093blByb3BlcnR5KEgpJiYiJCIhPUguY2hhckF0KDApJiZKLnB1c2goSCk7Si5zb3J0KCl9Qz1KLmxlbmd0aDtIPUFycmF5KEMpO2ZvcihrPTA7azxDO2srKylpZihTPWc9PT1KP2s6SltrXSxOPWdbU10sRz1wKFMsTixrKSx1W0ddKXg9dVtHXSxkZWxldGUgdVtHXSx6W0ddPXgsSFtrXT14O2Vsc2V7aWYoeltHXSl0aHJvdyBzKEgsZnVuY3Rpb24oYSl7YSYmYS5zY29wZSYmKHVbYS5pZF09YSl9KSxkKCJkdXBlcyIsaCxHLE4pO0hba109e2lkOkcsc2NvcGU6dCxjbG9uZTp0fTt6W0ddPSEwfWZvcihFIGluIHUpe3g9dVtFXTtHPXRiKHguY2xvbmUpO2MubGVhdmUoRyk7aWYoR1swXS5wYXJlbnROb2RlKWZvcihrPTAsCitwPUcubGVuZ3RoO2s8cDtrKyspR1trXS4kJE5HX1JFTU9WRUQ9ITA7eC5zY29wZS4kZGVzdHJveSgpfWZvcihrPTA7azxDO2srKylpZihTPWc9PT1KP2s6SltrXSxOPWdbU10seD1IW2tdLHguc2NvcGUpe0U9bjtkbyBFPUUubmV4dFNpYmxpbmc7d2hpbGUoRSYmRS4kJE5HX1JFTU9WRUQpO3guY2xvbmVbMF0hPUUmJmMubW92ZSh0Yih4LmNsb25lKSxudWxsLEIobikpO249eC5jbG9uZVt4LmNsb25lLmxlbmd0aC0xXTtlKHguc2NvcGUsayxyLE4seSxTLEMpfWVsc2UgbShmdW5jdGlvbihhLGQpe3guc2NvcGU9ZDt2YXIgZj1sLmNsb25lTm9kZSghMSk7YVthLmxlbmd0aCsrXT1mO2MuZW50ZXIoYSxudWxsLEIobikpO249Zjt4LmNsb25lPWE7elt4LmlkXT14O2UoeC5zY29wZSxrLHIsTix5LFMsQyl9KTt1PXp9KX19fX1dLG9lPVsiJGFuaW1hdGUiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiQSIsbXVsdGlFbGVtZW50OiEwLGxpbms6ZnVuY3Rpb24oYyxkLGUpe2MuJHdhdGNoKGUubmdTaG93LAorZnVuY3Rpb24oYyl7YVtjPyJyZW1vdmVDbGFzcyI6ImFkZENsYXNzIl0oZCwibmctaGlkZSIse3RlbXBDbGFzc2VzOiJuZy1oaWRlLWFuaW1hdGUifSl9KX19fV0saGU9WyIkYW5pbWF0ZSIsZnVuY3Rpb24oYSl7cmV0dXJue3Jlc3RyaWN0OiJBIixtdWx0aUVsZW1lbnQ6ITAsbGluazpmdW5jdGlvbihjLGQsZSl7Yy4kd2F0Y2goZS5uZ0hpZGUsZnVuY3Rpb24oYyl7YVtjPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oZCwibmctaGlkZSIse3RlbXBDbGFzc2VzOiJuZy1oaWRlLWFuaW1hdGUifSl9KX19fV0scGU9SmEoZnVuY3Rpb24oYSxjLGQpe2EuJHdhdGNoKGQubmdTdHlsZSxmdW5jdGlvbihhLGQpe2QmJmEhPT1kJiZzKGQsZnVuY3Rpb24oYSxkKXtjLmNzcyhkLCIiKX0pO2EmJmMuY3NzKGEpfSwhMCl9KSxxZT1bIiRhbmltYXRlIixmdW5jdGlvbihhKXtyZXR1cm57cmVzdHJpY3Q6IkVBIixyZXF1aXJlOiJuZ1N3aXRjaCIsY29udHJvbGxlcjpbIiRzY29wZSIsZnVuY3Rpb24oKXt0aGlzLmNhc2VzPQore319XSxsaW5rOmZ1bmN0aW9uKGMsZCxlLGYpe3ZhciBnPVtdLGg9W10sbD1bXSxrPVtdLG09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZnVuY3Rpb24oKXthLnNwbGljZShjLDEpfX07Yy4kd2F0Y2goZS5uZ1N3aXRjaHx8ZS5vbixmdW5jdGlvbihjKXt2YXIgZCxlO2Q9MDtmb3IoZT1sLmxlbmd0aDtkPGU7KytkKWEuY2FuY2VsKGxbZF0pO2Q9bC5sZW5ndGg9MDtmb3IoZT1rLmxlbmd0aDtkPGU7KytkKXt2YXIgcj10YihoW2RdLmNsb25lKTtrW2RdLiRkZXN0cm95KCk7KGxbZF09YS5sZWF2ZShyKSkudGhlbihtKGwsZCkpfWgubGVuZ3RoPTA7ay5sZW5ndGg9MDsoZz1mLmNhc2VzWyIhIitjXXx8Zi5jYXNlc1siPyJdKSYmcyhnLGZ1bmN0aW9uKGMpe2MudHJhbnNjbHVkZShmdW5jdGlvbihkLGUpe2sucHVzaChlKTt2YXIgZj1jLmVsZW1lbnQ7ZFtkLmxlbmd0aCsrXT1ZLmNyZWF0ZUNvbW1lbnQoIiBlbmQgbmdTd2l0Y2hXaGVuOiAiKTtoLnB1c2goe2Nsb25lOmR9KTthLmVudGVyKGQsCitmLnBhcmVudCgpLGYpfSl9KX0pfX19XSxyZT1KYSh7dHJhbnNjbHVkZToiZWxlbWVudCIscHJpb3JpdHk6MTIwMCxyZXF1aXJlOiJebmdTd2l0Y2giLG11bHRpRWxlbWVudDohMCxsaW5rOmZ1bmN0aW9uKGEsYyxkLGUsZil7ZS5jYXNlc1siISIrZC5uZ1N3aXRjaFdoZW5dPWUuY2FzZXNbIiEiK2QubmdTd2l0Y2hXaGVuXXx8W107ZS5jYXNlc1siISIrZC5uZ1N3aXRjaFdoZW5dLnB1c2goe3RyYW5zY2x1ZGU6ZixlbGVtZW50OmN9KX19KSxzZT1KYSh7dHJhbnNjbHVkZToiZWxlbWVudCIscHJpb3JpdHk6MTIwMCxyZXF1aXJlOiJebmdTd2l0Y2giLG11bHRpRWxlbWVudDohMCxsaW5rOmZ1bmN0aW9uKGEsYyxkLGUsZil7ZS5jYXNlc1siPyJdPWUuY2FzZXNbIj8iXXx8W107ZS5jYXNlc1siPyJdLnB1c2goe3RyYW5zY2x1ZGU6ZixlbGVtZW50OmN9KX19KSx1ZT1KYSh7cmVzdHJpY3Q6IkVBQyIsbGluazpmdW5jdGlvbihhLGMsZCxlLGYpe2lmKCFmKXRocm93IFQoIm5nVHJhbnNjbHVkZSIpKCJvcnBoYW4iLAordmEoYykpO2YoZnVuY3Rpb24oYSl7Yy5lbXB0eSgpO2MuYXBwZW5kKGEpfSl9fSksVmQ9WyIkdGVtcGxhdGVDYWNoZSIsZnVuY3Rpb24oYSl7cmV0dXJue3Jlc3RyaWN0OiJFIix0ZXJtaW5hbDohMCxjb21waWxlOmZ1bmN0aW9uKGMsZCl7InRleHQvbmctdGVtcGxhdGUiPT1kLnR5cGUmJmEucHV0KGQuaWQsY1swXS50ZXh0KX19fV0sZWc9VCgibmdPcHRpb25zIiksdGU9ZGEoe3Jlc3RyaWN0OiJBIix0ZXJtaW5hbDohMH0pLFdkPVsiJGNvbXBpbGUiLCIkcGFyc2UiLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9L15ccyooW1xzXFNdKz8pKD86XHMrYXNccysoW1xzXFNdKz8pKT8oPzpccytncm91cFxzK2J5XHMrKFtcc1xTXSs/KSk/XHMrZm9yXHMrKD86KFtcJFx3XVtcJFx3XSopfCg/OlwoXHMqKFtcJFx3XVtcJFx3XSopXHMqLFxzKihbXCRcd11bXCRcd10qKVxzKlwpKSlccytpblxzKyhbXHNcU10rPykoPzpccyt0cmFja1xzK2J5XHMrKFtcc1xTXSs/KSk/JC8sZT17JHNldFZpZXdWYWx1ZTpDfTsKK3JldHVybntyZXN0cmljdDoiRSIscmVxdWlyZTpbInNlbGVjdCIsIj9uZ01vZGVsIl0sY29udHJvbGxlcjpbIiRlbGVtZW50IiwiJHNjb3BlIiwiJGF0dHJzIixmdW5jdGlvbihhLGMsZCl7dmFyIGw9dGhpcyxrPXt9LG09ZSxwO2wuZGF0YWJvdW5kPWQubmdNb2RlbDtsLmluaXQ9ZnVuY3Rpb24oYSxjLGQpe209YTtwPWR9O2wuYWRkT3B0aW9uPWZ1bmN0aW9uKGMsZCl7TWEoYywnIm9wdGlvbiB2YWx1ZSInKTtrW2NdPSEwO20uJHZpZXdWYWx1ZT09YyYmKGEudmFsKGMpLHAucGFyZW50KCkmJnAucmVtb3ZlKCkpO2QmJmRbMF0uaGFzQXR0cmlidXRlKCJzZWxlY3RlZCIpJiYoZFswXS5zZWxlY3RlZD0hMCl9O2wucmVtb3ZlT3B0aW9uPWZ1bmN0aW9uKGEpe3RoaXMuaGFzT3B0aW9uKGEpJiYoZGVsZXRlIGtbYV0sbS4kdmlld1ZhbHVlPT09YSYmdGhpcy5yZW5kZXJVbmtub3duT3B0aW9uKGEpKX07bC5yZW5kZXJVbmtub3duT3B0aW9uPWZ1bmN0aW9uKGMpe2M9Ij8gIitOYShjKSsiID8iOworcC52YWwoYyk7YS5wcmVwZW5kKHApO2EudmFsKGMpO3AucHJvcCgic2VsZWN0ZWQiLCEwKX07bC5oYXNPcHRpb249ZnVuY3Rpb24oYSl7cmV0dXJuIGsuaGFzT3duUHJvcGVydHkoYSl9O2MuJG9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXtsLnJlbmRlclVua25vd25PcHRpb249Q30pfV0sbGluazpmdW5jdGlvbihlLGcsaCxsKXtmdW5jdGlvbiBrKGEsYyxkLGUpe2QuJHJlbmRlcj1mdW5jdGlvbigpe3ZhciBhPWQuJHZpZXdWYWx1ZTtlLmhhc09wdGlvbihhKT8oQy5wYXJlbnQoKSYmQy5yZW1vdmUoKSxjLnZhbChhKSwiIj09PWEmJm4ucHJvcCgic2VsZWN0ZWQiLCEwKSk6RChhKSYmbj9jLnZhbCgiIik6ZS5yZW5kZXJVbmtub3duT3B0aW9uKGEpfTtjLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7YS4kYXBwbHkoZnVuY3Rpb24oKXtDLnBhcmVudCgpJiZDLnJlbW92ZSgpO2QuJHNldFZpZXdWYWx1ZShjLnZhbCgpKX0pfSl9ZnVuY3Rpb24gbShhLGMsZCl7dmFyIGU7ZC4kcmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGE9CituZXcgZGIoZC4kdmlld1ZhbHVlKTtzKGMuZmluZCgib3B0aW9uIiksZnVuY3Rpb24oYyl7Yy5zZWxlY3RlZD15KGEuZ2V0KGMudmFsdWUpKX0pfTthLiR3YXRjaChmdW5jdGlvbigpe2ZhKGUsZC4kdmlld1ZhbHVlKXx8KGU9cWEoZC4kdmlld1ZhbHVlKSxkLiRyZW5kZXIoKSl9KTtjLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7YS4kYXBwbHkoZnVuY3Rpb24oKXt2YXIgYT1bXTtzKGMuZmluZCgib3B0aW9uIiksZnVuY3Rpb24oYyl7Yy5zZWxlY3RlZCYmYS5wdXNoKGMudmFsdWUpfSk7ZC4kc2V0Vmlld1ZhbHVlKGEpfSl9KX1mdW5jdGlvbiBwKGUsZixnKXtmdW5jdGlvbiBoKGEsYyxkKXtUW0FdPWQ7SCYmKFRbSF09Yyk7cmV0dXJuIGEoZSxUKX1mdW5jdGlvbiBrKGEpe3ZhciBjO2lmKHUpaWYoTSYmeChhKSl7Yz1uZXcgZGIoW10pO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWMucHV0KGgoTSxudWxsLGFbZF0pLCEwKX1lbHNlIGM9bmV3IGRiKGEpO2Vsc2UgTSYmKGE9aChNLG51bGwsCithKSk7cmV0dXJuIGZ1bmN0aW9uKGQsZSl7dmFyIGY7Zj1NP006Qj9COkY7cmV0dXJuIHU/eShjLnJlbW92ZShoKGYsZCxlKSkpOmE9PT1oKGYsZCxlKX19ZnVuY3Rpb24gbCgpe3Z8fChlLiQkcG9zdERpZ2VzdChwKSx2PSEwKX1mdW5jdGlvbiBtKGEsYyxkKXthW2NdPWFbY118fDA7YVtjXSs9ZD8xOi0xfWZ1bmN0aW9uIHAoKXt2PSExO3ZhciBhPXsiIjpbXX0sYz1bIiJdLGQsbCxuLHIsdDtuPWcuJHZpZXdWYWx1ZTtyPVAoZSl8fFtdO3ZhciBCPUg/T2JqZWN0LmtleXMocikuc29ydCgpOnIseCxBLEQsRixOPXt9O3Q9ayhuKTt2YXIgST0hMSxVLFY7UT17fTtmb3IoRj0wO0Q9Qi5sZW5ndGgsRjxEO0YrKyl7eD1GO2lmKEgmJih4PUJbRl0sIiQiPT09eC5jaGFyQXQoMCkpKWNvbnRpbnVlO0E9clt4XTtkPWgoSix4LEEpfHwiIjsobD1hW2RdKXx8KGw9YVtkXT1bXSxjLnB1c2goZCkpO2Q9dCh4LEEpO0k9SXx8ZDtBPWgoQyx4LEEpO0E9eShBKT9BOiIiO1Y9TT9NKGUsVCk6SD9CW0ZdOgorRjtNJiYoUVtWXT14KTtsLnB1c2goe2lkOlYsbGFiZWw6QSxzZWxlY3RlZDpkfSl9dXx8KHp8fG51bGw9PT1uP2FbIiJdLnVuc2hpZnQoe2lkOiIiLGxhYmVsOiIiLHNlbGVjdGVkOiFJfSk6SXx8YVsiIl0udW5zaGlmdCh7aWQ6Ij8iLGxhYmVsOiIiLHNlbGVjdGVkOiEwfSkpO3g9MDtmb3IoQj1jLmxlbmd0aDt4PEI7eCsrKXtkPWNbeF07bD1hW2RdO1IubGVuZ3RoPD14PyhuPXtlbGVtZW50OkcuY2xvbmUoKS5hdHRyKCJsYWJlbCIsZCksbGFiZWw6bC5sYWJlbH0scj1bbl0sUi5wdXNoKHIpLGYuYXBwZW5kKG4uZWxlbWVudCkpOihyPVJbeF0sbj1yWzBdLG4ubGFiZWwhPWQmJm4uZWxlbWVudC5hdHRyKCJsYWJlbCIsbi5sYWJlbD1kKSk7ST1udWxsO0Y9MDtmb3IoRD1sLmxlbmd0aDtGPEQ7RisrKWQ9bFtGXSwodD1yW0YrMV0pPyhJPXQuZWxlbWVudCx0LmxhYmVsIT09ZC5sYWJlbCYmKG0oTix0LmxhYmVsLCExKSxtKE4sZC5sYWJlbCwhMCksSS50ZXh0KHQubGFiZWw9ZC5sYWJlbCksCitJLnByb3AoImxhYmVsIix0LmxhYmVsKSksdC5pZCE9PWQuaWQmJkkudmFsKHQuaWQ9ZC5pZCksSVswXS5zZWxlY3RlZCE9PWQuc2VsZWN0ZWQmJihJLnByb3AoInNlbGVjdGVkIix0LnNlbGVjdGVkPWQuc2VsZWN0ZWQpLFJhJiZJLnByb3AoInNlbGVjdGVkIix0LnNlbGVjdGVkKSkpOigiIj09PWQuaWQmJno/VT16OihVPXcuY2xvbmUoKSkudmFsKGQuaWQpLnByb3AoInNlbGVjdGVkIixkLnNlbGVjdGVkKS5hdHRyKCJzZWxlY3RlZCIsZC5zZWxlY3RlZCkucHJvcCgibGFiZWwiLGQubGFiZWwpLnRleHQoZC5sYWJlbCksci5wdXNoKHQ9e2VsZW1lbnQ6VSxsYWJlbDpkLmxhYmVsLGlkOmQuaWQsc2VsZWN0ZWQ6ZC5zZWxlY3RlZH0pLG0oTixkLmxhYmVsLCEwKSxJP0kuYWZ0ZXIoVSk6bi5lbGVtZW50LmFwcGVuZChVKSxJPVUpO2ZvcihGKys7ci5sZW5ndGg+RjspZD1yLnBvcCgpLG0oTixkLmxhYmVsLCExKSxkLmVsZW1lbnQucmVtb3ZlKCl9Zm9yKDtSLmxlbmd0aD54Oyl7bD1SLnBvcCgpOworZm9yKEY9MTtGPGwubGVuZ3RoOysrRiltKE4sbFtGXS5sYWJlbCwhMSk7bFswXS5lbGVtZW50LnJlbW92ZSgpfXMoTixmdW5jdGlvbihhLGMpezA8YT9xLmFkZE9wdGlvbihjKTowPmEmJnEucmVtb3ZlT3B0aW9uKGMpfSl9dmFyIG47aWYoIShuPXIubWF0Y2goZCkpKXRocm93IGVnKCJpZXhwIixyLHZhKGYpKTt2YXIgQz1jKG5bMl18fG5bMV0pLEE9bls0XXx8bls2XSxEPS8gYXMgLy50ZXN0KG5bMF0pJiZuWzFdLEI9RD9jKEQpOm51bGwsSD1uWzVdLEo9YyhuWzNdfHwiIiksRj1jKG5bMl0/blsxXTpBKSxQPWMobls3XSksTT1uWzhdP2Mobls4XSk6bnVsbCxRPXt9LFI9W1t7ZWxlbWVudDpmLGxhYmVsOiIifV1dLFQ9e307eiYmKGEoeikoZSksei5yZW1vdmVDbGFzcygibmctc2NvcGUiKSx6LnJlbW92ZSgpKTtmLmVtcHR5KCk7Zi5vbigiY2hhbmdlIixmdW5jdGlvbigpe2UuJGFwcGx5KGZ1bmN0aW9uKCl7dmFyIGE9UChlKXx8W10sYztpZih1KWM9W10scyhmLnZhbCgpLGZ1bmN0aW9uKGQpe2Q9CitNP1FbZF06ZDtjLnB1c2goIj8iPT09ZD90OiIiPT09ZD9udWxsOmgoQj9COkYsZCxhW2RdKSl9KTtlbHNle3ZhciBkPU0/UVtmLnZhbCgpXTpmLnZhbCgpO2M9Ij8iPT09ZD90OiIiPT09ZD9udWxsOmgoQj9COkYsZCxhW2RdKX1nLiRzZXRWaWV3VmFsdWUoYyk7cCgpfSl9KTtnLiRyZW5kZXI9cDtlLiR3YXRjaENvbGxlY3Rpb24oUCxsKTtlLiR3YXRjaENvbGxlY3Rpb24oZnVuY3Rpb24oKXt2YXIgYT1QKGUpLGM7aWYoYSYmeChhKSl7Yz1BcnJheShhLmxlbmd0aCk7Zm9yKHZhciBkPTAsZj1hLmxlbmd0aDtkPGY7ZCsrKWNbZF09aChDLGQsYVtkXSl9ZWxzZSBpZihhKWZvcihkIGluIGM9e30sYSlhLmhhc093blByb3BlcnR5KGQpJiYoY1tkXT1oKEMsZCxhW2RdKSk7cmV0dXJuIGN9LGwpO3UmJmUuJHdhdGNoQ29sbGVjdGlvbihmdW5jdGlvbigpe3JldHVybiBnLiRtb2RlbFZhbHVlfSxsKX1pZihsWzFdKXt2YXIgcT1sWzBdO2w9bFsxXTt2YXIgdT1oLm11bHRpcGxlLHI9aC5uZ09wdGlvbnMsCit6PSExLG4sdj0hMSx3PUIoWS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksRz1CKFkuY3JlYXRlRWxlbWVudCgib3B0Z3JvdXAiKSksQz13LmNsb25lKCk7aD0wO2Zvcih2YXIgQT1nLmNoaWxkcmVuKCksSD1BLmxlbmd0aDtoPEg7aCsrKWlmKCIiPT09QVtoXS52YWx1ZSl7bj16PUEuZXEoaCk7YnJlYWt9cS5pbml0KGwseixDKTt1JiYobC4kaXNFbXB0eT1mdW5jdGlvbihhKXtyZXR1cm4hYXx8MD09PWEubGVuZ3RofSk7cj9wKGUsZyxsKTp1P20oZSxnLGwpOmsoZSxnLGwscSl9fX19XSxZZD1bIiRpbnRlcnBvbGF0ZSIsZnVuY3Rpb24oYSl7dmFyIGM9e2FkZE9wdGlvbjpDLHJlbW92ZU9wdGlvbjpDfTtyZXR1cm57cmVzdHJpY3Q6IkUiLHByaW9yaXR5OjEwMCxjb21waWxlOmZ1bmN0aW9uKGQsZSl7aWYoRChlLnZhbHVlKSl7dmFyIGY9YShkLnRleHQoKSwhMCk7Znx8ZS4kc2V0KCJ2YWx1ZSIsZC50ZXh0KCkpfXJldHVybiBmdW5jdGlvbihhLGQsZSl7dmFyIGs9ZC5wYXJlbnQoKSwKK209ay5kYXRhKCIkc2VsZWN0Q29udHJvbGxlciIpfHxrLnBhcmVudCgpLmRhdGEoIiRzZWxlY3RDb250cm9sbGVyIik7bSYmbS5kYXRhYm91bmR8fChtPWMpO2Y/YS4kd2F0Y2goZixmdW5jdGlvbihhLGMpe2UuJHNldCgidmFsdWUiLGEpO2MhPT1hJiZtLnJlbW92ZU9wdGlvbihjKTttLmFkZE9wdGlvbihhLGQpfSk6bS5hZGRPcHRpb24oZS52YWx1ZSxkKTtkLm9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXttLnJlbW92ZU9wdGlvbihlLnZhbHVlKX0pfX19fV0sWGQ9ZGEoe3Jlc3RyaWN0OiJFIix0ZXJtaW5hbDohMX0pO00uYW5ndWxhci5ib290c3RyYXA/Y29uc29sZS5sb2coIldBUk5JTkc6IFRyaWVkIHRvIGxvYWQgYW5ndWxhciBtb3JlIHRoYW4gb25jZS4iKTooTmQoKSxQZChnYSksQihZKS5yZWFkeShmdW5jdGlvbigpe0pkKFksc2MpfSkpfSkod2luZG93LGRvY3VtZW50KTshd2luZG93LmFuZ3VsYXIuJCRjc3AoKSYmd2luZG93LmFuZ3VsYXIuZWxlbWVudChkb2N1bWVudCkuZmluZCgiaGVhZCIpLnByZXBlbmQoJzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+QGNoYXJzZXQgIlVURi04IjtbbmdcXDpjbG9ha10sW25nLWNsb2FrXSxbZGF0YS1uZy1jbG9ha10sW3gtbmctY2xvYWtdLC5uZy1jbG9haywueC1uZy1jbG9haywubmctaGlkZTpub3QoLm5nLWhpZGUtYW5pbWF0ZSl7ZGlzcGxheTpub25lICFpbXBvcnRhbnQ7fW5nXFw6Zm9ybXtkaXNwbGF5OmJsb2NrO308L3N0eWxlPicpOworLy8jIHNvdXJjZU1hcHBpbmdVUkw9YW5ndWxhci5taW4uanMubWFwCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9jaG9zZW4uanF1ZXJ5LmpzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvY2hvc2VuLmpxdWVyeS5qcwppbmRleCBmNTA3YzkwLi45YTU4MjhiZTEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2Nob3Nlbi5qcXVlcnkuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvY2hvc2VuLmpxdWVyeS5qcwpAQCAtMSwxMTk0ICsxLDExOTQgQEAKLS8qDQotDQotQ2hvc2VuDQotDQotLSBieSBQYXRyaWNrIEZpbGxlciBmb3IgSGFydmVzdCBodHRwOi8vZ2V0aGFydmVzdC5jb20NCi0tIENvcHlyaWdodCAoYykgMjAxMS0yMDEzIGJ5IEhhcnZlc3QNCi0NCi1BdmFpbGFibGUgZm9yIHVzZSB1bmRlciB0aGUgTUlUIExpY2Vuc2UNCi0NCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5DQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCi1pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzDQotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbA0KLWNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4NCi1hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCi0NCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLA0KLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4NCi1USEUgU09GVFdBUkUuDQotDQotKi8NCi0vLyBDaG9zZW4sIGEgU2VsZWN0IEJveCBFbmhhbmNlciBmb3IgalF1ZXJ5IGFuZCBQcm90b3R5cGUNCi0vLyBieSBQYXRyaWNrIEZpbGxlciBmb3IgSGFydmVzdCwgaHR0cDovL2dldGhhcnZlc3QuY29tDQotLy8NCi0vLyBWZXJzaW9uIDEuMC4wDQotLy8gRnVsbCBzb3VyY2UgYXQgaHR0cHM6Ly9naXRodWIuY29tL2hhcnZlc3RocS9jaG9zZW4NCi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgSGFydmVzdCBodHRwOi8vZ2V0aGFydmVzdC5jb20NCi0NCi0vLyBNSVQgTGljZW5zZSwgaHR0cHM6Ly9naXRodWIuY29tL2hhcnZlc3RocS9jaG9zZW4vYmxvYi9tYXN0ZXIvTElDRU5TRS5tZA0KLS8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgYGdydW50IGJ1aWxkYCwgZG8gbm90IGVkaXQgaXQgYnkgaGFuZC4NCi0oZnVuY3Rpb24oKSB7DQotICB2YXIgJCwgQWJzdHJhY3RDaG9zZW4sIENob3NlbiwgU2VsZWN0UGFyc2VyLCBfcmVmLA0KLSAgICBfX2hhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSwNCi0gICAgX19leHRlbmRzID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChfX2hhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH07DQotDQotICBTZWxlY3RQYXJzZXIgPSAoZnVuY3Rpb24oKSB7DQotICAgIGZ1bmN0aW9uIFNlbGVjdFBhcnNlcigpIHsNCi0gICAgICB0aGlzLm9wdGlvbnNfaW5kZXggPSAwOw0KLSAgICAgIHRoaXMucGFyc2VkID0gW107DQotICAgIH0NCi0NCi0gICAgU2VsZWN0UGFyc2VyLnByb3RvdHlwZS5hZGRfbm9kZSA9IGZ1bmN0aW9uKGNoaWxkKSB7DQotICAgICAgaWYgKGNoaWxkLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICJPUFRHUk9VUCIpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmFkZF9ncm91cChjaGlsZCk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmFkZF9vcHRpb24oY2hpbGQpOw0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgU2VsZWN0UGFyc2VyLnByb3RvdHlwZS5hZGRfZ3JvdXAgPSBmdW5jdGlvbihncm91cCkgew0KLSAgICAgIHZhciBncm91cF9wb3NpdGlvbiwgb3B0aW9uLCBfaSwgX2xlbiwgX3JlZiwgX3Jlc3VsdHM7DQotDQotICAgICAgZ3JvdXBfcG9zaXRpb24gPSB0aGlzLnBhcnNlZC5sZW5ndGg7DQotICAgICAgdGhpcy5wYXJzZWQucHVzaCh7DQotICAgICAgICBhcnJheV9pbmRleDogZ3JvdXBfcG9zaXRpb24sDQotICAgICAgICBncm91cDogdHJ1ZSwNCi0gICAgICAgIGxhYmVsOiB0aGlzLmVzY2FwZUV4cHJlc3Npb24oZ3JvdXAubGFiZWwpLA0KLSAgICAgICAgY2hpbGRyZW46IDAsDQotICAgICAgICBkaXNhYmxlZDogZ3JvdXAuZGlzYWJsZWQNCi0gICAgICB9KTsNCi0gICAgICBfcmVmID0gZ3JvdXAuY2hpbGROb2RlczsNCi0gICAgICBfcmVzdWx0cyA9IFtdOw0KLSAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KLSAgICAgICAgb3B0aW9uID0gX3JlZltfaV07DQotICAgICAgICBfcmVzdWx0cy5wdXNoKHRoaXMuYWRkX29wdGlvbihvcHRpb24sIGdyb3VwX3Bvc2l0aW9uLCBncm91cC5kaXNhYmxlZCkpOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gX3Jlc3VsdHM7DQotICAgIH07DQotDQotICAgIFNlbGVjdFBhcnNlci5wcm90b3R5cGUuYWRkX29wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbiwgZ3JvdXBfcG9zaXRpb24sIGdyb3VwX2Rpc2FibGVkKSB7DQotICAgICAgaWYgKG9wdGlvbi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAiT1BUSU9OIikgew0KLSAgICAgICAgaWYgKG9wdGlvbi50ZXh0ICE9PSAiIikgew0KLSAgICAgICAgICBpZiAoZ3JvdXBfcG9zaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRoaXMucGFyc2VkW2dyb3VwX3Bvc2l0aW9uXS5jaGlsZHJlbiArPSAxOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRoaXMucGFyc2VkLnB1c2goew0KLSAgICAgICAgICAgIGFycmF5X2luZGV4OiB0aGlzLnBhcnNlZC5sZW5ndGgsDQotICAgICAgICAgICAgb3B0aW9uc19pbmRleDogdGhpcy5vcHRpb25zX2luZGV4LA0KLSAgICAgICAgICAgIHZhbHVlOiBvcHRpb24udmFsdWUsDQotICAgICAgICAgICAgdGV4dDogb3B0aW9uLnRleHQsDQotICAgICAgICAgICAgaHRtbDogb3B0aW9uLmlubmVySFRNTCwNCi0gICAgICAgICAgICBzZWxlY3RlZDogb3B0aW9uLnNlbGVjdGVkLA0KLSAgICAgICAgICAgIGRpc2FibGVkOiBncm91cF9kaXNhYmxlZCA9PT0gdHJ1ZSA/IGdyb3VwX2Rpc2FibGVkIDogb3B0aW9uLmRpc2FibGVkLA0KLSAgICAgICAgICAgIGdyb3VwX2FycmF5X2luZGV4OiBncm91cF9wb3NpdGlvbiwNCi0gICAgICAgICAgICBjbGFzc2VzOiBvcHRpb24uY2xhc3NOYW1lLA0KLSAgICAgICAgICAgIHN0eWxlOiBvcHRpb24uc3R5bGUuY3NzVGV4dA0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIHRoaXMucGFyc2VkLnB1c2goew0KLSAgICAgICAgICAgIGFycmF5X2luZGV4OiB0aGlzLnBhcnNlZC5sZW5ndGgsDQotICAgICAgICAgICAgb3B0aW9uc19pbmRleDogdGhpcy5vcHRpb25zX2luZGV4LA0KLSAgICAgICAgICAgIGVtcHR5OiB0cnVlDQotICAgICAgICAgIH0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc19pbmRleCArPSAxOw0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgU2VsZWN0UGFyc2VyLnByb3RvdHlwZS5lc2NhcGVFeHByZXNzaW9uID0gZnVuY3Rpb24odGV4dCkgew0KLSAgICAgIHZhciBtYXAsIHVuc2FmZV9jaGFyczsNCi0NCi0gICAgICBpZiAoKHRleHQgPT0gbnVsbCkgfHwgdGV4dCA9PT0gZmFsc2UpIHsNCi0gICAgICAgIHJldHVybiAiIjsNCi0gICAgICB9DQotICAgICAgaWYgKCEvW1wmXDxcPlwiXCdcYF0vLnRlc3QodGV4dCkpIHsNCi0gICAgICAgIHJldHVybiB0ZXh0Ow0KLSAgICAgIH0NCi0gICAgICBtYXAgPSB7DQotICAgICAgICAiPCI6ICImbHQ7IiwNCi0gICAgICAgICI+IjogIiZndDsiLA0KLSAgICAgICAgJyInOiAiJnF1b3Q7IiwNCi0gICAgICAgICInIjogIiYjeDI3OyIsDQotICAgICAgICAiYCI6ICImI3g2MDsiDQotICAgICAgfTsNCi0gICAgICB1bnNhZmVfY2hhcnMgPSAvJig/IVx3KzspfFtcPFw+XCJcJ1xgXS9nOw0KLSAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UodW5zYWZlX2NoYXJzLCBmdW5jdGlvbihjaHIpIHsNCi0gICAgICAgIHJldHVybiBtYXBbY2hyXSB8fCAiJmFtcDsiOw0KLSAgICAgIH0pOw0KLSAgICB9Ow0KLQ0KLSAgICByZXR1cm4gU2VsZWN0UGFyc2VyOw0KLQ0KLSAgfSkoKTsNCi0NCi0gIFNlbGVjdFBhcnNlci5zZWxlY3RfdG9fYXJyYXkgPSBmdW5jdGlvbihzZWxlY3QpIHsNCi0gICAgdmFyIGNoaWxkLCBwYXJzZXIsIF9pLCBfbGVuLCBfcmVmOw0KLQ0KLSAgICBwYXJzZXIgPSBuZXcgU2VsZWN0UGFyc2VyKCk7DQotICAgIF9yZWYgPSBzZWxlY3QuY2hpbGROb2RlczsNCi0gICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQotICAgICAgY2hpbGQgPSBfcmVmW19pXTsNCi0gICAgICBwYXJzZXIuYWRkX25vZGUoY2hpbGQpOw0KLSAgICB9DQotICAgIHJldHVybiBwYXJzZXIucGFyc2VkOw0KLSAgfTsNCi0NCi0gIEFic3RyYWN0Q2hvc2VuID0gKGZ1bmN0aW9uKCkgew0KLSAgICBmdW5jdGlvbiBBYnN0cmFjdENob3Nlbihmb3JtX2ZpZWxkLCBvcHRpb25zKSB7DQotICAgICAgdGhpcy5mb3JtX2ZpZWxkID0gZm9ybV9maWVsZDsNCi0gICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDoge307DQotICAgICAgaWYgKCFBYnN0cmFjdENob3Nlbi5icm93c2VyX2lzX3N1cHBvcnRlZCgpKSB7DQotICAgICAgICByZXR1cm47DQotICAgICAgfQ0KLSAgICAgIHRoaXMuaXNfbXVsdGlwbGUgPSB0aGlzLmZvcm1fZmllbGQubXVsdGlwbGU7DQotICAgICAgdGhpcy5zZXRfZGVmYXVsdF90ZXh0KCk7DQotICAgICAgdGhpcy5zZXRfZGVmYXVsdF92YWx1ZXMoKTsNCi0gICAgICB0aGlzLnNldHVwKCk7DQotICAgICAgdGhpcy5zZXRfdXBfaHRtbCgpOw0KLSAgICAgIHRoaXMucmVnaXN0ZXJfb2JzZXJ2ZXJzKCk7DQotICAgIH0NCi0NCi0gICAgQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnNldF9kZWZhdWx0X3ZhbHVlcyA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQotDQotICAgICAgdGhpcy5jbGlja190ZXN0X2FjdGlvbiA9IGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgICAgcmV0dXJuIF90aGlzLnRlc3RfYWN0aXZlX2NsaWNrKGV2dCk7DQotICAgICAgfTsNCi0gICAgICB0aGlzLmFjdGl2YXRlX2FjdGlvbiA9IGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgICAgcmV0dXJuIF90aGlzLmFjdGl2YXRlX2ZpZWxkKGV2dCk7DQotICAgICAgfTsNCi0gICAgICB0aGlzLmFjdGl2ZV9maWVsZCA9IGZhbHNlOw0KLSAgICAgIHRoaXMubW91c2Vfb25fY29udGFpbmVyID0gZmFsc2U7DQotICAgICAgdGhpcy5yZXN1bHRzX3Nob3dpbmcgPSBmYWxzZTsNCi0gICAgICB0aGlzLnJlc3VsdF9oaWdobGlnaHRlZCA9IG51bGw7DQotICAgICAgdGhpcy5yZXN1bHRfc2luZ2xlX3NlbGVjdGVkID0gbnVsbDsNCi0gICAgICB0aGlzLmFsbG93X3NpbmdsZV9kZXNlbGVjdCA9ICh0aGlzLm9wdGlvbnMuYWxsb3dfc2luZ2xlX2Rlc2VsZWN0ICE9IG51bGwpICYmICh0aGlzLmZvcm1fZmllbGQub3B0aW9uc1swXSAhPSBudWxsKSAmJiB0aGlzLmZvcm1fZmllbGQub3B0aW9uc1swXS50ZXh0ID09PSAiIiA/IHRoaXMub3B0aW9ucy5hbGxvd19zaW5nbGVfZGVzZWxlY3QgOiBmYWxzZTsNCi0gICAgICB0aGlzLmRpc2FibGVfc2VhcmNoX3RocmVzaG9sZCA9IHRoaXMub3B0aW9ucy5kaXNhYmxlX3NlYXJjaF90aHJlc2hvbGQgfHwgMDsNCi0gICAgICB0aGlzLmRpc2FibGVfc2VhcmNoID0gdGhpcy5vcHRpb25zLmRpc2FibGVfc2VhcmNoIHx8IGZhbHNlOw0KLSAgICAgIHRoaXMuZW5hYmxlX3NwbGl0X3dvcmRfc2VhcmNoID0gdGhpcy5vcHRpb25zLmVuYWJsZV9zcGxpdF93b3JkX3NlYXJjaCAhPSBudWxsID8gdGhpcy5vcHRpb25zLmVuYWJsZV9zcGxpdF93b3JkX3NlYXJjaCA6IHRydWU7DQotICAgICAgdGhpcy5ncm91cF9zZWFyY2ggPSB0aGlzLm9wdGlvbnMuZ3JvdXBfc2VhcmNoICE9IG51bGwgPyB0aGlzLm9wdGlvbnMuZ3JvdXBfc2VhcmNoIDogdHJ1ZTsNCi0gICAgICB0aGlzLnNlYXJjaF9jb250YWlucyA9IHRoaXMub3B0aW9ucy5zZWFyY2hfY29udGFpbnMgfHwgZmFsc2U7DQotICAgICAgdGhpcy5zaW5nbGVfYmFja3N0cm9rZV9kZWxldGUgPSB0aGlzLm9wdGlvbnMuc2luZ2xlX2JhY2tzdHJva2VfZGVsZXRlICE9IG51bGwgPyB0aGlzLm9wdGlvbnMuc2luZ2xlX2JhY2tzdHJva2VfZGVsZXRlIDogdHJ1ZTsNCi0gICAgICB0aGlzLm1heF9zZWxlY3RlZF9vcHRpb25zID0gdGhpcy5vcHRpb25zLm1heF9zZWxlY3RlZF9vcHRpb25zIHx8IEluZmluaXR5Ow0KLSAgICAgIHRoaXMuaW5oZXJpdF9zZWxlY3RfY2xhc3NlcyA9IHRoaXMub3B0aW9ucy5pbmhlcml0X3NlbGVjdF9jbGFzc2VzIHx8IGZhbHNlOw0KLSAgICAgIHRoaXMuZGlzcGxheV9zZWxlY3RlZF9vcHRpb25zID0gdGhpcy5vcHRpb25zLmRpc3BsYXlfc2VsZWN0ZWRfb3B0aW9ucyAhPSBudWxsID8gdGhpcy5vcHRpb25zLmRpc3BsYXlfc2VsZWN0ZWRfb3B0aW9ucyA6IHRydWU7DQotICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheV9kaXNhYmxlZF9vcHRpb25zID0gdGhpcy5vcHRpb25zLmRpc3BsYXlfZGlzYWJsZWRfb3B0aW9ucyAhPSBudWxsID8gdGhpcy5vcHRpb25zLmRpc3BsYXlfZGlzYWJsZWRfb3B0aW9ucyA6IHRydWU7DQotICAgIH07DQotDQotICAgIEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5zZXRfZGVmYXVsdF90ZXh0ID0gZnVuY3Rpb24oKSB7DQotICAgICAgaWYgKHRoaXMuZm9ybV9maWVsZC5nZXRBdHRyaWJ1dGUoImRhdGEtcGxhY2Vob2xkZXIiKSkgew0KLSAgICAgICAgdGhpcy5kZWZhdWx0X3RleHQgPSB0aGlzLmZvcm1fZmllbGQuZ2V0QXR0cmlidXRlKCJkYXRhLXBsYWNlaG9sZGVyIik7DQotICAgICAgfSBlbHNlIGlmICh0aGlzLmlzX211bHRpcGxlKSB7DQotICAgICAgICB0aGlzLmRlZmF1bHRfdGV4dCA9IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcl90ZXh0X211bHRpcGxlIHx8IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcl90ZXh0IHx8IEFic3RyYWN0Q2hvc2VuLmRlZmF1bHRfbXVsdGlwbGVfdGV4dDsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgdGhpcy5kZWZhdWx0X3RleHQgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXJfdGV4dF9zaW5nbGUgfHwgdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyX3RleHQgfHwgQWJzdHJhY3RDaG9zZW4uZGVmYXVsdF9zaW5nbGVfdGV4dDsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHRoaXMucmVzdWx0c19ub25lX2ZvdW5kID0gdGhpcy5mb3JtX2ZpZWxkLmdldEF0dHJpYnV0ZSgiZGF0YS1ub19yZXN1bHRzX3RleHQiKSB8fCB0aGlzLm9wdGlvbnMubm9fcmVzdWx0c190ZXh0IHx8IEFic3RyYWN0Q2hvc2VuLmRlZmF1bHRfbm9fcmVzdWx0X3RleHQ7DQotICAgIH07DQotDQotICAgIEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5tb3VzZV9lbnRlciA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHJldHVybiB0aGlzLm1vdXNlX29uX2NvbnRhaW5lciA9IHRydWU7DQotICAgIH07DQotDQotICAgIEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5tb3VzZV9sZWF2ZSA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHJldHVybiB0aGlzLm1vdXNlX29uX2NvbnRhaW5lciA9IGZhbHNlOw0KLSAgICB9Ow0KLQ0KLSAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUuaW5wdXRfZm9jdXMgPSBmdW5jdGlvbihldnQpIHsNCi0gICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KLQ0KLSAgICAgIGlmICh0aGlzLmlzX211bHRpcGxlKSB7DQotICAgICAgICBpZiAoIXRoaXMuYWN0aXZlX2ZpZWxkKSB7DQotICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KChmdW5jdGlvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gX3RoaXMuY29udGFpbmVyX21vdXNlZG93bigpOw0KLSAgICAgICAgICB9KSwgNTApOw0KLSAgICAgICAgfQ0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBpZiAoIXRoaXMuYWN0aXZlX2ZpZWxkKSB7DQotICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlX2ZpZWxkKCk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUuaW5wdXRfYmx1ciA9IGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQotDQotICAgICAgaWYgKCF0aGlzLm1vdXNlX29uX2NvbnRhaW5lcikgew0KLSAgICAgICAgdGhpcy5hY3RpdmVfZmllbGQgPSBmYWxzZTsNCi0gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KChmdW5jdGlvbigpIHsNCi0gICAgICAgICAgcmV0dXJuIF90aGlzLmJsdXJfdGVzdCgpOw0KLSAgICAgICAgfSksIDEwMCk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzdWx0c19vcHRpb25fYnVpbGQgPSBmdW5jdGlvbihvcHRpb25zKSB7DQotICAgICAgdmFyIGNvbnRlbnQsIGRhdGEsIF9pLCBfbGVuLCBfcmVmOw0KLQ0KLSAgICAgIGNvbnRlbnQgPSAnJzsNCi0gICAgICBfcmVmID0gdGhpcy5yZXN1bHRzX2RhdGE7DQotICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQotICAgICAgICBkYXRhID0gX3JlZltfaV07DQotICAgICAgICBpZiAoZGF0YS5ncm91cCkgew0KLSAgICAgICAgICBjb250ZW50ICs9IHRoaXMucmVzdWx0X2FkZF9ncm91cChkYXRhKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIGNvbnRlbnQgKz0gdGhpcy5yZXN1bHRfYWRkX29wdGlvbihkYXRhKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmZpcnN0IDogdm9pZCAwKSB7DQotICAgICAgICAgIGlmIChkYXRhLnNlbGVjdGVkICYmIHRoaXMuaXNfbXVsdGlwbGUpIHsNCi0gICAgICAgICAgICB0aGlzLmNob2ljZV9idWlsZChkYXRhKTsNCi0gICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnNlbGVjdGVkICYmICF0aGlzLmlzX211bHRpcGxlKSB7DQotICAgICAgICAgICAgdGhpcy5zaW5nbGVfc2V0X3NlbGVjdGVkX3RleHQoZGF0YS50ZXh0KTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gY29udGVudDsNCi0gICAgfTsNCi0NCi0gICAgQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnJlc3VsdF9hZGRfb3B0aW9uID0gZnVuY3Rpb24ob3B0aW9uKSB7DQotICAgICAgdmFyIGNsYXNzZXMsIHN0eWxlOw0KLQ0KLSAgICAgIGlmICghb3B0aW9uLnNlYXJjaF9tYXRjaCkgew0KLSAgICAgICAgcmV0dXJuICcnOw0KLSAgICAgIH0NCi0gICAgICBpZiAoIXRoaXMuaW5jbHVkZV9vcHRpb25faW5fcmVzdWx0cyhvcHRpb24pKSB7DQotICAgICAgICByZXR1cm4gJyc7DQotICAgICAgfQ0KLSAgICAgIGNsYXNzZXMgPSBbXTsNCi0gICAgICBpZiAoIW9wdGlvbi5kaXNhYmxlZCAmJiAhKG9wdGlvbi5zZWxlY3RlZCAmJiB0aGlzLmlzX211bHRpcGxlKSkgew0KLSAgICAgICAgY2xhc3Nlcy5wdXNoKCJhY3RpdmUtcmVzdWx0Iik7DQotICAgICAgfQ0KLSAgICAgIGlmIChvcHRpb24uZGlzYWJsZWQgJiYgIShvcHRpb24uc2VsZWN0ZWQgJiYgdGhpcy5pc19tdWx0aXBsZSkpIHsNCi0gICAgICAgIGNsYXNzZXMucHVzaCgiZGlzYWJsZWQtcmVzdWx0Iik7DQotICAgICAgfQ0KLSAgICAgIGlmIChvcHRpb24uc2VsZWN0ZWQpIHsNCi0gICAgICAgIGNsYXNzZXMucHVzaCgicmVzdWx0LXNlbGVjdGVkIik7DQotICAgICAgfQ0KLSAgICAgIGlmIChvcHRpb24uZ3JvdXBfYXJyYXlfaW5kZXggIT0gbnVsbCkgew0KLSAgICAgICAgY2xhc3Nlcy5wdXNoKCJncm91cC1vcHRpb24iKTsNCi0gICAgICB9DQotICAgICAgaWYgKG9wdGlvbi5jbGFzc2VzICE9PSAiIikgew0KLSAgICAgICAgY2xhc3Nlcy5wdXNoKG9wdGlvbi5jbGFzc2VzKTsNCi0gICAgICB9DQotICAgICAgc3R5bGUgPSBvcHRpb24uc3R5bGUuY3NzVGV4dCAhPT0gIiIgPyAiIHN0eWxlPVwiIiArIG9wdGlvbi5zdHlsZSArICJcIiIgOiAiIjsNCi0gICAgICByZXR1cm4gIjxsaSBjbGFzcz1cIiIgKyAoY2xhc3Nlcy5qb2luKCcgJykpICsgIlwiIiArIHN0eWxlICsgIiBkYXRhLW9wdGlvbi1hcnJheS1pbmRleD1cIiIgKyBvcHRpb24uYXJyYXlfaW5kZXggKyAiXCI+IiArIG9wdGlvbi5zZWFyY2hfdGV4dCArICI8L2xpPiI7DQotICAgIH07DQotDQotICAgIEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5yZXN1bHRfYWRkX2dyb3VwID0gZnVuY3Rpb24oZ3JvdXApIHsNCi0gICAgICBpZiAoIShncm91cC5zZWFyY2hfbWF0Y2ggfHwgZ3JvdXAuZ3JvdXBfbWF0Y2gpKSB7DQotICAgICAgICByZXR1cm4gJyc7DQotICAgICAgfQ0KLSAgICAgIGlmICghKGdyb3VwLmFjdGl2ZV9vcHRpb25zID4gMCkpIHsNCi0gICAgICAgIHJldHVybiAnJzsNCi0gICAgICB9DQotICAgICAgcmV0dXJuICI8bGkgY2xhc3M9XCJncm91cC1yZXN1bHRcIj4iICsgZ3JvdXAuc2VhcmNoX3RleHQgKyAiPC9saT4iOw0KLSAgICB9Ow0KLQ0KLSAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzdWx0c191cGRhdGVfZmllbGQgPSBmdW5jdGlvbigpIHsNCi0gICAgICB0aGlzLnNldF9kZWZhdWx0X3RleHQoKTsNCi0gICAgICBpZiAoIXRoaXMuaXNfbXVsdGlwbGUpIHsNCi0gICAgICAgIHRoaXMucmVzdWx0c19yZXNldF9jbGVhbnVwKCk7DQotICAgICAgfQ0KLSAgICAgIHRoaXMucmVzdWx0X2NsZWFyX2hpZ2hsaWdodCgpOw0KLSAgICAgIHRoaXMucmVzdWx0X3NpbmdsZV9zZWxlY3RlZCA9IG51bGw7DQotICAgICAgdGhpcy5yZXN1bHRzX2J1aWxkKCk7DQotICAgICAgaWYgKHRoaXMucmVzdWx0c19zaG93aW5nKSB7DQotICAgICAgICByZXR1cm4gdGhpcy53aW5ub3dfcmVzdWx0cygpOw0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnJlc3VsdHNfdG9nZ2xlID0gZnVuY3Rpb24oKSB7DQotICAgICAgaWYgKHRoaXMucmVzdWx0c19zaG93aW5nKSB7DQotICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzX2hpZGUoKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0c19zaG93KCk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzdWx0c19zZWFyY2ggPSBmdW5jdGlvbihldnQpIHsNCi0gICAgICBpZiAodGhpcy5yZXN1bHRzX3Nob3dpbmcpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLndpbm5vd19yZXN1bHRzKCk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdHNfc2hvdygpOw0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLndpbm5vd19yZXN1bHRzID0gZnVuY3Rpb24oKSB7DQotICAgICAgdmFyIGVzY2FwZWRTZWFyY2hUZXh0LCBvcHRpb24sIHJlZ2V4LCByZWdleEFuY2hvciwgcmVzdWx0cywgcmVzdWx0c19ncm91cCwgc2VhcmNoVGV4dCwgc3RhcnRwb3MsIHRleHQsIHpyZWdleCwgX2ksIF9sZW4sIF9yZWY7DQotDQotICAgICAgdGhpcy5ub19yZXN1bHRzX2NsZWFyKCk7DQotICAgICAgcmVzdWx0cyA9IDA7DQotICAgICAgc2VhcmNoVGV4dCA9IHRoaXMuZ2V0X3NlYXJjaF90ZXh0KCk7DQotICAgICAgZXNjYXBlZFNlYXJjaFRleHQgPSBzZWFyY2hUZXh0LnJlcGxhY2UoL1stW1xde30oKSorPy4sXFxeJHwjXHNdL2csICJcXCQmIik7DQotICAgICAgcmVnZXhBbmNob3IgPSB0aGlzLnNlYXJjaF9jb250YWlucyA/ICIiIDogIl4iOw0KLSAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleEFuY2hvciArIGVzY2FwZWRTZWFyY2hUZXh0LCAnaScpOw0KLSAgICAgIHpyZWdleCA9IG5ldyBSZWdFeHAoZXNjYXBlZFNlYXJjaFRleHQsICdpJyk7DQotICAgICAgX3JlZiA9IHRoaXMucmVzdWx0c19kYXRhOw0KLSAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KLSAgICAgICAgb3B0aW9uID0gX3JlZltfaV07DQotICAgICAgICBvcHRpb24uc2VhcmNoX21hdGNoID0gZmFsc2U7DQotICAgICAgICByZXN1bHRzX2dyb3VwID0gbnVsbDsNCi0gICAgICAgIGlmICh0aGlzLmluY2x1ZGVfb3B0aW9uX2luX3Jlc3VsdHMob3B0aW9uKSkgew0KLSAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwKSB7DQotICAgICAgICAgICAgb3B0aW9uLmdyb3VwX21hdGNoID0gZmFsc2U7DQotICAgICAgICAgICAgb3B0aW9uLmFjdGl2ZV9vcHRpb25zID0gMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoKG9wdGlvbi5ncm91cF9hcnJheV9pbmRleCAhPSBudWxsKSAmJiB0aGlzLnJlc3VsdHNfZGF0YVtvcHRpb24uZ3JvdXBfYXJyYXlfaW5kZXhdKSB7DQotICAgICAgICAgICAgcmVzdWx0c19ncm91cCA9IHRoaXMucmVzdWx0c19kYXRhW29wdGlvbi5ncm91cF9hcnJheV9pbmRleF07DQotICAgICAgICAgICAgaWYgKHJlc3VsdHNfZ3JvdXAuYWN0aXZlX29wdGlvbnMgPT09IDAgJiYgcmVzdWx0c19ncm91cC5zZWFyY2hfbWF0Y2gpIHsNCi0gICAgICAgICAgICAgIHJlc3VsdHMgKz0gMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0c19ncm91cC5hY3RpdmVfb3B0aW9ucyArPSAxOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmICghKG9wdGlvbi5ncm91cCAmJiAhdGhpcy5ncm91cF9zZWFyY2gpKSB7DQotICAgICAgICAgICAgb3B0aW9uLnNlYXJjaF90ZXh0ID0gb3B0aW9uLmdyb3VwID8gb3B0aW9uLmxhYmVsIDogb3B0aW9uLmh0bWw7DQotICAgICAgICAgICAgb3B0aW9uLnNlYXJjaF9tYXRjaCA9IHRoaXMuc2VhcmNoX3N0cmluZ19tYXRjaChvcHRpb24uc2VhcmNoX3RleHQsIHJlZ2V4KTsNCi0gICAgICAgICAgICBpZiAob3B0aW9uLnNlYXJjaF9tYXRjaCAmJiAhb3B0aW9uLmdyb3VwKSB7DQotICAgICAgICAgICAgICByZXN1bHRzICs9IDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChvcHRpb24uc2VhcmNoX21hdGNoKSB7DQotICAgICAgICAgICAgICBpZiAoc2VhcmNoVGV4dC5sZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgc3RhcnRwb3MgPSBvcHRpb24uc2VhcmNoX3RleHQuc2VhcmNoKHpyZWdleCk7DQotICAgICAgICAgICAgICAgIHRleHQgPSBvcHRpb24uc2VhcmNoX3RleHQuc3Vic3RyKDAsIHN0YXJ0cG9zICsgc2VhcmNoVGV4dC5sZW5ndGgpICsgJzwvZW0+JyArIG9wdGlvbi5zZWFyY2hfdGV4dC5zdWJzdHIoc3RhcnRwb3MgKyBzZWFyY2hUZXh0Lmxlbmd0aCk7DQotICAgICAgICAgICAgICAgIG9wdGlvbi5zZWFyY2hfdGV4dCA9IHRleHQuc3Vic3RyKDAsIHN0YXJ0cG9zKSArICc8ZW0+JyArIHRleHQuc3Vic3RyKHN0YXJ0cG9zKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIGlmIChyZXN1bHRzX2dyb3VwICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0c19ncm91cC5ncm91cF9tYXRjaCA9IHRydWU7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmICgob3B0aW9uLmdyb3VwX2FycmF5X2luZGV4ICE9IG51bGwpICYmIHRoaXMucmVzdWx0c19kYXRhW29wdGlvbi5ncm91cF9hcnJheV9pbmRleF0uc2VhcmNoX21hdGNoKSB7DQotICAgICAgICAgICAgICBvcHRpb24uc2VhcmNoX21hdGNoID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgdGhpcy5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0KCk7DQotICAgICAgaWYgKHJlc3VsdHMgPCAxICYmIHNlYXJjaFRleHQubGVuZ3RoKSB7DQotICAgICAgICB0aGlzLnVwZGF0ZV9yZXN1bHRzX2NvbnRlbnQoIiIpOw0KLSAgICAgICAgcmV0dXJuIHRoaXMubm9fcmVzdWx0cyhzZWFyY2hUZXh0KTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgdGhpcy51cGRhdGVfcmVzdWx0c19jb250ZW50KHRoaXMucmVzdWx0c19vcHRpb25fYnVpbGQoKSk7DQotICAgICAgICByZXR1cm4gdGhpcy53aW5ub3dfcmVzdWx0c19zZXRfaGlnaGxpZ2h0KCk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUuc2VhcmNoX3N0cmluZ19tYXRjaCA9IGZ1bmN0aW9uKHNlYXJjaF9zdHJpbmcsIHJlZ2V4KSB7DQotICAgICAgdmFyIHBhcnQsIHBhcnRzLCBfaSwgX2xlbjsNCi0NCi0gICAgICBpZiAocmVnZXgudGVzdChzZWFyY2hfc3RyaW5nKSkgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgfSBlbHNlIGlmICh0aGlzLmVuYWJsZV9zcGxpdF93b3JkX3NlYXJjaCAmJiAoc2VhcmNoX3N0cmluZy5pbmRleE9mKCIgIikgPj0gMCB8fCBzZWFyY2hfc3RyaW5nLmluZGV4T2YoIlsiKSA9PT0gMCkpIHsNCi0gICAgICAgIHBhcnRzID0gc2VhcmNoX3N0cmluZy5yZXBsYWNlKC9cW3xcXS9nLCAiIikuc3BsaXQoIiAiKTsNCi0gICAgICAgIGlmIChwYXJ0cy5sZW5ndGgpIHsNCi0gICAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBwYXJ0cy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KLSAgICAgICAgICAgIHBhcnQgPSBwYXJ0c1tfaV07DQotICAgICAgICAgICAgaWYgKHJlZ2V4LnRlc3QocGFydCkpIHsNCi0gICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLmNob2ljZXNfY291bnQgPSBmdW5jdGlvbigpIHsNCi0gICAgICB2YXIgb3B0aW9uLCBfaSwgX2xlbiwgX3JlZjsNCi0NCi0gICAgICBpZiAodGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQgIT0gbnVsbCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRfb3B0aW9uX2NvdW50Ow0KLSAgICAgIH0NCi0gICAgICB0aGlzLnNlbGVjdGVkX29wdGlvbl9jb3VudCA9IDA7DQotICAgICAgX3JlZiA9IHRoaXMuZm9ybV9maWVsZC5vcHRpb25zOw0KLSAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgew0KLSAgICAgICAgb3B0aW9uID0gX3JlZltfaV07DQotICAgICAgICBpZiAob3B0aW9uLnNlbGVjdGVkKSB7DQotICAgICAgICAgIHRoaXMuc2VsZWN0ZWRfb3B0aW9uX2NvdW50ICs9IDE7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkX29wdGlvbl9jb3VudDsNCi0gICAgfTsNCi0NCi0gICAgQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLmNob2ljZXNfY2xpY2sgPSBmdW5jdGlvbihldnQpIHsNCi0gICAgICBldnQucHJldmVudERlZmF1bHQoKTsNCi0gICAgICBpZiAoISh0aGlzLnJlc3VsdHNfc2hvd2luZyB8fCB0aGlzLmlzX2Rpc2FibGVkKSkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0c19zaG93KCk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUua2V5dXBfY2hlY2tlciA9IGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgIHZhciBzdHJva2UsIF9yZWY7DQotDQotICAgICAgc3Ryb2tlID0gKF9yZWYgPSBldnQud2hpY2gpICE9IG51bGwgPyBfcmVmIDogZXZ0LmtleUNvZGU7DQotICAgICAgdGhpcy5zZWFyY2hfZmllbGRfc2NhbGUoKTsNCi0gICAgICBzd2l0Y2ggKHN0cm9rZSkgew0KLSAgICAgICAgY2FzZSA4Og0KLSAgICAgICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSAmJiB0aGlzLmJhY2tzdHJva2VfbGVuZ3RoIDwgMSAmJiB0aGlzLmNob2ljZXNfY291bnQoKSA+IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5rZXlkb3duX2JhY2tzdHJva2UoKTsNCi0gICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5wZW5kaW5nX2JhY2tzdHJva2UpIHsNCi0gICAgICAgICAgICB0aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKTsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzX3NlYXJjaCgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAxMzoNCi0gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICAgIGlmICh0aGlzLnJlc3VsdHNfc2hvd2luZykgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc3VsdF9zZWxlY3QoZXZ0KTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMjc6DQotICAgICAgICAgIGlmICh0aGlzLnJlc3VsdHNfc2hvd2luZykgew0KLSAgICAgICAgICAgIHRoaXMucmVzdWx0c19oaWRlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICBjYXNlIDk6DQotICAgICAgICBjYXNlIDM4Og0KLSAgICAgICAgY2FzZSA0MDoNCi0gICAgICAgIGNhc2UgMTY6DQotICAgICAgICBjYXNlIDkxOg0KLSAgICAgICAgY2FzZSAxNzoNCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzX3NlYXJjaCgpOw0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLmNvbnRhaW5lcl93aWR0aCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIGlmICh0aGlzLm9wdGlvbnMud2lkdGggIT0gbnVsbCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53aWR0aDsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuICIiICsgdGhpcy5mb3JtX2ZpZWxkLm9mZnNldFdpZHRoICsgInB4IjsNCi0gICAgICB9DQotICAgIH07DQotDQotICAgIEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5pbmNsdWRlX29wdGlvbl9pbl9yZXN1bHRzID0gZnVuY3Rpb24ob3B0aW9uKSB7DQotICAgICAgaWYgKHRoaXMuaXNfbXVsdGlwbGUgJiYgKCF0aGlzLmRpc3BsYXlfc2VsZWN0ZWRfb3B0aW9ucyAmJiBvcHRpb24uc2VsZWN0ZWQpKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgfQ0KLSAgICAgIGlmICghdGhpcy5kaXNwbGF5X2Rpc2FibGVkX29wdGlvbnMgJiYgb3B0aW9uLmRpc2FibGVkKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgfQ0KLSAgICAgIGlmIChvcHRpb24uZW1wdHkpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHRydWU7DQotICAgIH07DQotDQotICAgIEFic3RyYWN0Q2hvc2VuLmJyb3dzZXJfaXNfc3VwcG9ydGVkID0gZnVuY3Rpb24oKSB7DQotICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IuYXBwTmFtZSA9PT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpIHsNCi0gICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPj0gODsNCi0gICAgICB9DQotICAgICAgaWYgKC9pUChvZHxob25lKS9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgfQ0KLSAgICAgIGlmICgvQW5kcm9pZC9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpKSB7DQotICAgICAgICBpZiAoL01vYmlsZS9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpKSB7DQotICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgcmV0dXJuIHRydWU7DQotICAgIH07DQotDQotICAgIEFic3RyYWN0Q2hvc2VuLmRlZmF1bHRfbXVsdGlwbGVfdGV4dCA9ICJTZWxlY3QgU29tZSBPcHRpb25zIjsNCi0NCi0gICAgQWJzdHJhY3RDaG9zZW4uZGVmYXVsdF9zaW5nbGVfdGV4dCA9ICJTZWxlY3QgYW4gT3B0aW9uIjsNCi0NCi0gICAgQWJzdHJhY3RDaG9zZW4uZGVmYXVsdF9ub19yZXN1bHRfdGV4dCA9ICJObyByZXN1bHRzIG1hdGNoIjsNCi0NCi0gICAgcmV0dXJuIEFic3RyYWN0Q2hvc2VuOw0KLQ0KLSAgfSkoKTsNCi0NCi0gICQgPSBqUXVlcnk7DQotDQotICAkLmZuLmV4dGVuZCh7DQotICAgIGNob3NlbjogZnVuY3Rpb24ob3B0aW9ucykgew0KLSAgICAgIGlmICghQWJzdHJhY3RDaG9zZW4uYnJvd3Nlcl9pc19zdXBwb3J0ZWQoKSkgew0KLSAgICAgICAgcmV0dXJuIHRoaXM7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaW5wdXRfZmllbGQpIHsNCi0gICAgICAgIHZhciAkdGhpcywgY2hvc2VuOw0KLQ0KLSAgICAgICAgJHRoaXMgPSAkKHRoaXMpOw0KLSAgICAgICAgY2hvc2VuID0gJHRoaXMuZGF0YSgnY2hvc2VuJyk7DQotICAgICAgICBpZiAob3B0aW9ucyA9PT0gJ2Rlc3Ryb3knICYmIGNob3Nlbikgew0KLSAgICAgICAgICBjaG9zZW4uZGVzdHJveSgpOw0KLSAgICAgICAgfSBlbHNlIGlmICghY2hvc2VuKSB7DQotICAgICAgICAgICR0aGlzLmRhdGEoJ2Nob3NlbicsIG5ldyBDaG9zZW4odGhpcywgb3B0aW9ucykpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0pOw0KLSAgICB9DQotICB9KTsNCi0NCi0gIENob3NlbiA9IChmdW5jdGlvbihfc3VwZXIpIHsNCi0gICAgX19leHRlbmRzKENob3NlbiwgX3N1cGVyKTsNCi0NCi0gICAgZnVuY3Rpb24gQ2hvc2VuKCkgew0KLSAgICAgIF9yZWYgPSBDaG9zZW4uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQotICAgICAgcmV0dXJuIF9yZWY7DQotICAgIH0NCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5zZXR1cCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHRoaXMuZm9ybV9maWVsZF9qcSA9ICQodGhpcy5mb3JtX2ZpZWxkKTsNCi0gICAgICB0aGlzLmN1cnJlbnRfc2VsZWN0ZWRJbmRleCA9IHRoaXMuZm9ybV9maWVsZC5zZWxlY3RlZEluZGV4Ow0KLSAgICAgIHJldHVybiB0aGlzLmlzX3J0bCA9IHRoaXMuZm9ybV9maWVsZF9qcS5oYXNDbGFzcygiY2hvc2VuLXJ0bCIpOw0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLnNldF91cF9odG1sID0gZnVuY3Rpb24oKSB7DQotICAgICAgdmFyIGNvbnRhaW5lcl9jbGFzc2VzLCBjb250YWluZXJfcHJvcHM7DQotDQotICAgICAgY29udGFpbmVyX2NsYXNzZXMgPSBbImNob3Nlbi1jb250YWluZXIiXTsNCi0gICAgICBjb250YWluZXJfY2xhc3Nlcy5wdXNoKCJjaG9zZW4tY29udGFpbmVyLSIgKyAodGhpcy5pc19tdWx0aXBsZSA/ICJtdWx0aSIgOiAic2luZ2xlIikpOw0KLSAgICAgIGlmICh0aGlzLmluaGVyaXRfc2VsZWN0X2NsYXNzZXMgJiYgdGhpcy5mb3JtX2ZpZWxkLmNsYXNzTmFtZSkgew0KLSAgICAgICAgY29udGFpbmVyX2NsYXNzZXMucHVzaCh0aGlzLmZvcm1fZmllbGQuY2xhc3NOYW1lKTsNCi0gICAgICB9DQotICAgICAgaWYgKHRoaXMuaXNfcnRsKSB7DQotICAgICAgICBjb250YWluZXJfY2xhc3Nlcy5wdXNoKCJjaG9zZW4tcnRsIik7DQotICAgICAgfQ0KLSAgICAgIGNvbnRhaW5lcl9wcm9wcyA9IHsNCi0gICAgICAgICdjbGFzcyc6IGNvbnRhaW5lcl9jbGFzc2VzLmpvaW4oJyAnKSwNCi0gICAgICAgICdzdHlsZSc6ICJ3aWR0aDogIiArICh0aGlzLmNvbnRhaW5lcl93aWR0aCgpKSArICI7IiwNCi0gICAgICAgICd0aXRsZSc6IHRoaXMuZm9ybV9maWVsZC50aXRsZQ0KLSAgICAgIH07DQotICAgICAgaWYgKHRoaXMuZm9ybV9maWVsZC5pZC5sZW5ndGgpIHsNCi0gICAgICAgIGNvbnRhaW5lcl9wcm9wcy5pZCA9IHRoaXMuZm9ybV9maWVsZC5pZC5yZXBsYWNlKC9bXlx3XS9nLCAnXycpICsgIl9jaG9zZW4iOw0KLSAgICAgIH0NCi0gICAgICB0aGlzLmNvbnRhaW5lciA9ICQoIjxkaXYgLz4iLCBjb250YWluZXJfcHJvcHMpOw0KLSAgICAgIGlmICh0aGlzLmlzX211bHRpcGxlKSB7DQotICAgICAgICB0aGlzLmNvbnRhaW5lci5odG1sKCc8dWwgY2xhc3M9ImNob3Nlbi1jaG9pY2VzIj48bGkgY2xhc3M9InNlYXJjaC1maWVsZCI+PGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSInICsgdGhpcy5kZWZhdWx0X3RleHQgKyAnIiBjbGFzcz0iZGVmYXVsdCIgYXV0b2NvbXBsZXRlPSJvZmYiIHN0eWxlPSJ3aWR0aDoyNXB4OyIgLz48L2xpPjwvdWw+PGRpdiBjbGFzcz0iY2hvc2VuLWRyb3AiPjx1bCBjbGFzcz0iY2hvc2VuLXJlc3VsdHMiPjwvdWw+PC9kaXY+Jyk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHRoaXMuY29udGFpbmVyLmh0bWwoJzxhIGNsYXNzPSJjaG9zZW4tc2luZ2xlIGNob3Nlbi1kZWZhdWx0IiB0YWJpbmRleD0iLTEiPjxzcGFuPicgKyB0aGlzLmRlZmF1bHRfdGV4dCArICc8L3NwYW4+PGRpdj48Yj48L2I+PC9kaXY+PC9hPjxkaXYgY2xhc3M9ImNob3Nlbi1kcm9wIj48ZGl2IGNsYXNzPSJjaG9zZW4tc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+PC9kaXY+PHVsIGNsYXNzPSJjaG9zZW4tcmVzdWx0cyI+PC91bD48L2Rpdj4nKTsNCi0gICAgICB9DQotICAgICAgdGhpcy5mb3JtX2ZpZWxkX2pxLmhpZGUoKS5hZnRlcih0aGlzLmNvbnRhaW5lcik7DQotICAgICAgdGhpcy5kcm9wZG93biA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ2Rpdi5jaG9zZW4tZHJvcCcpLmZpcnN0KCk7DQotICAgICAgdGhpcy5zZWFyY2hfZmllbGQgPSB0aGlzLmNvbnRhaW5lci5maW5kKCdpbnB1dCcpLmZpcnN0KCk7DQotICAgICAgdGhpcy5zZWFyY2hfcmVzdWx0cyA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ3VsLmNob3Nlbi1yZXN1bHRzJykuZmlyc3QoKTsNCi0gICAgICB0aGlzLnNlYXJjaF9maWVsZF9zY2FsZSgpOw0KLSAgICAgIHRoaXMuc2VhcmNoX25vX3Jlc3VsdHMgPSB0aGlzLmNvbnRhaW5lci5maW5kKCdsaS5uby1yZXN1bHRzJykuZmlyc3QoKTsNCi0gICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSkgew0KLSAgICAgICAgdGhpcy5zZWFyY2hfY2hvaWNlcyA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ3VsLmNob3Nlbi1jaG9pY2VzJykuZmlyc3QoKTsNCi0gICAgICAgIHRoaXMuc2VhcmNoX2NvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ2xpLnNlYXJjaC1maWVsZCcpLmZpcnN0KCk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHRoaXMuc2VhcmNoX2NvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ2Rpdi5jaG9zZW4tc2VhcmNoJykuZmlyc3QoKTsNCi0gICAgICAgIHRoaXMuc2VsZWN0ZWRfaXRlbSA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy5jaG9zZW4tc2luZ2xlJykuZmlyc3QoKTsNCi0gICAgICB9DQotICAgICAgdGhpcy5yZXN1bHRzX2J1aWxkKCk7DQotICAgICAgdGhpcy5zZXRfdGFiX2luZGV4KCk7DQotICAgICAgdGhpcy5zZXRfbGFiZWxfYmVoYXZpb3IoKTsNCi0gICAgICByZXR1cm4gdGhpcy5mb3JtX2ZpZWxkX2pxLnRyaWdnZXIoImNob3NlbjpyZWFkeSIsIHsNCi0gICAgICAgIGNob3NlbjogdGhpcw0KLSAgICAgIH0pOw0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLnJlZ2lzdGVyX29ic2VydmVycyA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQotDQotICAgICAgdGhpcy5jb250YWluZXIuYmluZCgnbW91c2Vkb3duLmNob3NlbicsIGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgICAgX3RoaXMuY29udGFpbmVyX21vdXNlZG93bihldnQpOw0KLSAgICAgIH0pOw0KLSAgICAgIHRoaXMuY29udGFpbmVyLmJpbmQoJ21vdXNldXAuY2hvc2VuJywgZnVuY3Rpb24oZXZ0KSB7DQotICAgICAgICBfdGhpcy5jb250YWluZXJfbW91c2V1cChldnQpOw0KLSAgICAgIH0pOw0KLSAgICAgIHRoaXMuY29udGFpbmVyLmJpbmQoJ21vdXNlZW50ZXIuY2hvc2VuJywgZnVuY3Rpb24oZXZ0KSB7DQotICAgICAgICBfdGhpcy5tb3VzZV9lbnRlcihldnQpOw0KLSAgICAgIH0pOw0KLSAgICAgIHRoaXMuY29udGFpbmVyLmJpbmQoJ21vdXNlbGVhdmUuY2hvc2VuJywgZnVuY3Rpb24oZXZ0KSB7DQotICAgICAgICBfdGhpcy5tb3VzZV9sZWF2ZShldnQpOw0KLSAgICAgIH0pOw0KLSAgICAgIHRoaXMuc2VhcmNoX3Jlc3VsdHMuYmluZCgnbW91c2V1cC5jaG9zZW4nLCBmdW5jdGlvbihldnQpIHsNCi0gICAgICAgIF90aGlzLnNlYXJjaF9yZXN1bHRzX21vdXNldXAoZXZ0KTsNCi0gICAgICB9KTsNCi0gICAgICB0aGlzLnNlYXJjaF9yZXN1bHRzLmJpbmQoJ21vdXNlb3Zlci5jaG9zZW4nLCBmdW5jdGlvbihldnQpIHsNCi0gICAgICAgIF90aGlzLnNlYXJjaF9yZXN1bHRzX21vdXNlb3ZlcihldnQpOw0KLSAgICAgIH0pOw0KLSAgICAgIHRoaXMuc2VhcmNoX3Jlc3VsdHMuYmluZCgnbW91c2VvdXQuY2hvc2VuJywgZnVuY3Rpb24oZXZ0KSB7DQotICAgICAgICBfdGhpcy5zZWFyY2hfcmVzdWx0c19tb3VzZW91dChldnQpOw0KLSAgICAgIH0pOw0KLSAgICAgIHRoaXMuc2VhcmNoX3Jlc3VsdHMuYmluZCgnbW91c2V3aGVlbC5jaG9zZW4gRE9NTW91c2VTY3JvbGwuY2hvc2VuJywgZnVuY3Rpb24oZXZ0KSB7DQotICAgICAgICBfdGhpcy5zZWFyY2hfcmVzdWx0c19tb3VzZXdoZWVsKGV2dCk7DQotICAgICAgfSk7DQotICAgICAgdGhpcy5mb3JtX2ZpZWxkX2pxLmJpbmQoImNob3Nlbjp1cGRhdGVkLmNob3NlbiIsIGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgICAgX3RoaXMucmVzdWx0c191cGRhdGVfZmllbGQoZXZ0KTsNCi0gICAgICB9KTsNCi0gICAgICB0aGlzLmZvcm1fZmllbGRfanEuYmluZCgiY2hvc2VuOmFjdGl2YXRlLmNob3NlbiIsIGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgICAgX3RoaXMuYWN0aXZhdGVfZmllbGQoZXZ0KTsNCi0gICAgICB9KTsNCi0gICAgICB0aGlzLmZvcm1fZmllbGRfanEuYmluZCgiY2hvc2VuOm9wZW4uY2hvc2VuIiwgZnVuY3Rpb24oZXZ0KSB7DQotICAgICAgICBfdGhpcy5jb250YWluZXJfbW91c2Vkb3duKGV2dCk7DQotICAgICAgfSk7DQotICAgICAgdGhpcy5zZWFyY2hfZmllbGQuYmluZCgnYmx1ci5jaG9zZW4nLCBmdW5jdGlvbihldnQpIHsNCi0gICAgICAgIF90aGlzLmlucHV0X2JsdXIoZXZ0KTsNCi0gICAgICB9KTsNCi0gICAgICB0aGlzLnNlYXJjaF9maWVsZC5iaW5kKCdrZXl1cC5jaG9zZW4nLCBmdW5jdGlvbihldnQpIHsNCi0gICAgICAgIF90aGlzLmtleXVwX2NoZWNrZXIoZXZ0KTsNCi0gICAgICB9KTsNCi0gICAgICB0aGlzLnNlYXJjaF9maWVsZC5iaW5kKCdrZXlkb3duLmNob3NlbicsIGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgICAgX3RoaXMua2V5ZG93bl9jaGVja2VyKGV2dCk7DQotICAgICAgfSk7DQotICAgICAgdGhpcy5zZWFyY2hfZmllbGQuYmluZCgnZm9jdXMuY2hvc2VuJywgZnVuY3Rpb24oZXZ0KSB7DQotICAgICAgICBfdGhpcy5pbnB1dF9mb2N1cyhldnQpOw0KLSAgICAgIH0pOw0KLSAgICAgIGlmICh0aGlzLmlzX211bHRpcGxlKSB7DQotICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hfY2hvaWNlcy5iaW5kKCdjbGljay5jaG9zZW4nLCBmdW5jdGlvbihldnQpIHsNCi0gICAgICAgICAgX3RoaXMuY2hvaWNlc19jbGljayhldnQpOw0KLSAgICAgICAgfSk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5iaW5kKCdjbGljay5jaG9zZW4nLCBmdW5jdGlvbihldnQpIHsNCi0gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICB9KTsNCi0gICAgICB9DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkgew0KLSAgICAgICQoZG9jdW1lbnQpLnVuYmluZCgiY2xpY2suY2hvc2VuIiwgdGhpcy5jbGlja190ZXN0X2FjdGlvbik7DQotICAgICAgaWYgKHRoaXMuc2VhcmNoX2ZpZWxkWzBdLnRhYkluZGV4KSB7DQotICAgICAgICB0aGlzLmZvcm1fZmllbGRfanFbMF0udGFiSW5kZXggPSB0aGlzLnNlYXJjaF9maWVsZFswXS50YWJJbmRleDsNCi0gICAgICB9DQotICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7DQotICAgICAgdGhpcy5mb3JtX2ZpZWxkX2pxLnJlbW92ZURhdGEoJ2Nob3NlbicpOw0KLSAgICAgIHJldHVybiB0aGlzLmZvcm1fZmllbGRfanEuc2hvdygpOw0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLnNlYXJjaF9maWVsZF9kaXNhYmxlZCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHRoaXMuaXNfZGlzYWJsZWQgPSB0aGlzLmZvcm1fZmllbGRfanFbMF0uZGlzYWJsZWQ7DQotICAgICAgaWYgKHRoaXMuaXNfZGlzYWJsZWQpIHsNCi0gICAgICAgIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKCdjaG9zZW4tZGlzYWJsZWQnKTsNCi0gICAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkWzBdLmRpc2FibGVkID0gdHJ1ZTsNCi0gICAgICAgIGlmICghdGhpcy5pc19tdWx0aXBsZSkgew0KLSAgICAgICAgICB0aGlzLnNlbGVjdGVkX2l0ZW0udW5iaW5kKCJmb2N1cy5jaG9zZW4iLCB0aGlzLmFjdGl2YXRlX2FjdGlvbik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5jbG9zZV9maWVsZCgpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcygnY2hvc2VuLWRpc2FibGVkJyk7DQotICAgICAgICB0aGlzLnNlYXJjaF9maWVsZFswXS5kaXNhYmxlZCA9IGZhbHNlOw0KLSAgICAgICAgaWYgKCF0aGlzLmlzX211bHRpcGxlKSB7DQotICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkX2l0ZW0uYmluZCgiZm9jdXMuY2hvc2VuIiwgdGhpcy5hY3RpdmF0ZV9hY3Rpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5jb250YWluZXJfbW91c2Vkb3duID0gZnVuY3Rpb24oZXZ0KSB7DQotICAgICAgaWYgKCF0aGlzLmlzX2Rpc2FibGVkKSB7DQotICAgICAgICBpZiAoZXZ0ICYmIGV2dC50eXBlID09PSAibW91c2Vkb3duIiAmJiAhdGhpcy5yZXN1bHRzX3Nob3dpbmcpIHsNCi0gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoISgoZXZ0ICE9IG51bGwpICYmICgkKGV2dC50YXJnZXQpKS5oYXNDbGFzcygic2VhcmNoLWNob2ljZS1jbG9zZSIpKSkgew0KLSAgICAgICAgICBpZiAoIXRoaXMuYWN0aXZlX2ZpZWxkKSB7DQotICAgICAgICAgICAgaWYgKHRoaXMuaXNfbXVsdGlwbGUpIHsNCi0gICAgICAgICAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgiIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICQoZG9jdW1lbnQpLmJpbmQoJ2NsaWNrLmNob3NlbicsIHRoaXMuY2xpY2tfdGVzdF9hY3Rpb24pOw0KLSAgICAgICAgICAgIHRoaXMucmVzdWx0c19zaG93KCk7DQotICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNfbXVsdGlwbGUgJiYgZXZ0ICYmICgoJChldnQudGFyZ2V0KVswXSA9PT0gdGhpcy5zZWxlY3RlZF9pdGVtWzBdKSB8fCAkKGV2dC50YXJnZXQpLnBhcmVudHMoImEuY2hvc2VuLXNpbmdsZSIpLmxlbmd0aCkpIHsNCi0gICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTsNCi0gICAgICAgICAgICB0aGlzLnJlc3VsdHNfdG9nZ2xlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVfZmllbGQoKTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUuY29udGFpbmVyX21vdXNldXAgPSBmdW5jdGlvbihldnQpIHsNCi0gICAgICBpZiAoZXZ0LnRhcmdldC5ub2RlTmFtZSA9PT0gIkFCQlIiICYmICF0aGlzLmlzX2Rpc2FibGVkKSB7DQotICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzX3Jlc2V0KGV2dCk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLnNlYXJjaF9yZXN1bHRzX21vdXNld2hlZWwgPSBmdW5jdGlvbihldnQpIHsNCi0gICAgICB2YXIgZGVsdGEsIF9yZWYxLCBfcmVmMjsNCi0NCi0gICAgICBkZWx0YSA9IC0oKF9yZWYxID0gZXZ0Lm9yaWdpbmFsRXZlbnQpICE9IG51bGwgPyBfcmVmMS53aGVlbERlbHRhIDogdm9pZCAwKSB8fCAoKF9yZWYyID0gZXZ0Lm9yaWdpbmlhbEV2ZW50KSAhPSBudWxsID8gX3JlZjIuZGV0YWlsIDogdm9pZCAwKTsNCi0gICAgICBpZiAoZGVsdGEgIT0gbnVsbCkgew0KLSAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICBpZiAoZXZ0LnR5cGUgPT09ICdET01Nb3VzZVNjcm9sbCcpIHsNCi0gICAgICAgICAgZGVsdGEgPSBkZWx0YSAqIDQwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoX3Jlc3VsdHMuc2Nyb2xsVG9wKGRlbHRhICsgdGhpcy5zZWFyY2hfcmVzdWx0cy5zY3JvbGxUb3AoKSk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLmJsdXJfdGVzdCA9IGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgIGlmICghdGhpcy5hY3RpdmVfZmllbGQgJiYgdGhpcy5jb250YWluZXIuaGFzQ2xhc3MoImNob3Nlbi1jb250YWluZXItYWN0aXZlIikpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmNsb3NlX2ZpZWxkKCk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLmNsb3NlX2ZpZWxkID0gZnVuY3Rpb24oKSB7DQotICAgICAgJChkb2N1bWVudCkudW5iaW5kKCJjbGljay5jaG9zZW4iLCB0aGlzLmNsaWNrX3Rlc3RfYWN0aW9uKTsNCi0gICAgICB0aGlzLmFjdGl2ZV9maWVsZCA9IGZhbHNlOw0KLSAgICAgIHRoaXMucmVzdWx0c19oaWRlKCk7DQotICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoImNob3Nlbi1jb250YWluZXItYWN0aXZlIik7DQotICAgICAgdGhpcy5jbGVhcl9iYWNrc3Ryb2tlKCk7DQotICAgICAgdGhpcy5zaG93X3NlYXJjaF9maWVsZF9kZWZhdWx0KCk7DQotICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoX2ZpZWxkX3NjYWxlKCk7DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUuYWN0aXZhdGVfZmllbGQgPSBmdW5jdGlvbigpIHsNCi0gICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcygiY2hvc2VuLWNvbnRhaW5lci1hY3RpdmUiKTsNCi0gICAgICB0aGlzLmFjdGl2ZV9maWVsZCA9IHRydWU7DQotICAgICAgdGhpcy5zZWFyY2hfZmllbGQudmFsKHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgpKTsNCi0gICAgICByZXR1cm4gdGhpcy5zZWFyY2hfZmllbGQuZm9jdXMoKTsNCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS50ZXN0X2FjdGl2ZV9jbGljayA9IGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5pcygkKGV2dC50YXJnZXQpLmNsb3Nlc3QoJy5jaG9zZW4tY29udGFpbmVyJykpKSB7DQotICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVfZmllbGQgPSB0cnVlOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gdGhpcy5jbG9zZV9maWVsZCgpOw0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5yZXN1bHRzX2J1aWxkID0gZnVuY3Rpb24oKSB7DQotICAgICAgdGhpcy5wYXJzaW5nID0gdHJ1ZTsNCi0gICAgICB0aGlzLnNlbGVjdGVkX29wdGlvbl9jb3VudCA9IG51bGw7DQotICAgICAgdGhpcy5yZXN1bHRzX2RhdGEgPSBTZWxlY3RQYXJzZXIuc2VsZWN0X3RvX2FycmF5KHRoaXMuZm9ybV9maWVsZCk7DQotICAgICAgaWYgKHRoaXMuaXNfbXVsdGlwbGUpIHsNCi0gICAgICAgIHRoaXMuc2VhcmNoX2Nob2ljZXMuZmluZCgibGkuc2VhcmNoLWNob2ljZSIpLnJlbW92ZSgpOw0KLSAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNfbXVsdGlwbGUpIHsNCi0gICAgICAgIHRoaXMuc2luZ2xlX3NldF9zZWxlY3RlZF90ZXh0KCk7DQotICAgICAgICBpZiAodGhpcy5kaXNhYmxlX3NlYXJjaCB8fCB0aGlzLmZvcm1fZmllbGQub3B0aW9ucy5sZW5ndGggPD0gdGhpcy5kaXNhYmxlX3NlYXJjaF90aHJlc2hvbGQpIHsNCi0gICAgICAgICAgdGhpcy5zZWFyY2hfZmllbGRbMF0ucmVhZE9ubHkgPSB0cnVlOw0KLSAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcygiY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUtbm9zZWFyY2giKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkWzBdLnJlYWRPbmx5ID0gZmFsc2U7DQotICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKCJjaG9zZW4tY29udGFpbmVyLXNpbmdsZS1ub3NlYXJjaCIpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICB0aGlzLnVwZGF0ZV9yZXN1bHRzX2NvbnRlbnQodGhpcy5yZXN1bHRzX29wdGlvbl9idWlsZCh7DQotICAgICAgICBmaXJzdDogdHJ1ZQ0KLSAgICAgIH0pKTsNCi0gICAgICB0aGlzLnNlYXJjaF9maWVsZF9kaXNhYmxlZCgpOw0KLSAgICAgIHRoaXMuc2hvd19zZWFyY2hfZmllbGRfZGVmYXVsdCgpOw0KLSAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkX3NjYWxlKCk7DQotICAgICAgcmV0dXJuIHRoaXMucGFyc2luZyA9IGZhbHNlOw0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLnJlc3VsdF9kb19oaWdobGlnaHQgPSBmdW5jdGlvbihlbCkgew0KLSAgICAgIHZhciBoaWdoX2JvdHRvbSwgaGlnaF90b3AsIG1heEhlaWdodCwgdmlzaWJsZV9ib3R0b20sIHZpc2libGVfdG9wOw0KLQ0KLSAgICAgIGlmIChlbC5sZW5ndGgpIHsNCi0gICAgICAgIHRoaXMucmVzdWx0X2NsZWFyX2hpZ2hsaWdodCgpOw0KLSAgICAgICAgdGhpcy5yZXN1bHRfaGlnaGxpZ2h0ID0gZWw7DQotICAgICAgICB0aGlzLnJlc3VsdF9oaWdobGlnaHQuYWRkQ2xhc3MoImhpZ2hsaWdodGVkIik7DQotICAgICAgICBtYXhIZWlnaHQgPSBwYXJzZUludCh0aGlzLnNlYXJjaF9yZXN1bHRzLmNzcygibWF4SGVpZ2h0IiksIDEwKTsNCi0gICAgICAgIHZpc2libGVfdG9wID0gdGhpcy5zZWFyY2hfcmVzdWx0cy5zY3JvbGxUb3AoKTsNCi0gICAgICAgIHZpc2libGVfYm90dG9tID0gbWF4SGVpZ2h0ICsgdmlzaWJsZV90b3A7DQotICAgICAgICBoaWdoX3RvcCA9IHRoaXMucmVzdWx0X2hpZ2hsaWdodC5wb3NpdGlvbigpLnRvcCArIHRoaXMuc2VhcmNoX3Jlc3VsdHMuc2Nyb2xsVG9wKCk7DQotICAgICAgICBoaWdoX2JvdHRvbSA9IGhpZ2hfdG9wICsgdGhpcy5yZXN1bHRfaGlnaGxpZ2h0Lm91dGVySGVpZ2h0KCk7DQotICAgICAgICBpZiAoaGlnaF9ib3R0b20gPj0gdmlzaWJsZV9ib3R0b20pIHsNCi0gICAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoX3Jlc3VsdHMuc2Nyb2xsVG9wKChoaWdoX2JvdHRvbSAtIG1heEhlaWdodCkgPiAwID8gaGlnaF9ib3R0b20gLSBtYXhIZWlnaHQgOiAwKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoaGlnaF90b3AgPCB2aXNpYmxlX3RvcCkgew0KLSAgICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hfcmVzdWx0cy5zY3JvbGxUb3AoaGlnaF90b3ApOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0ID0gZnVuY3Rpb24oKSB7DQotICAgICAgaWYgKHRoaXMucmVzdWx0X2hpZ2hsaWdodCkgew0KLSAgICAgICAgdGhpcy5yZXN1bHRfaGlnaGxpZ2h0LnJlbW92ZUNsYXNzKCJoaWdobGlnaHRlZCIpOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gdGhpcy5yZXN1bHRfaGlnaGxpZ2h0ID0gbnVsbDsNCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5yZXN1bHRzX3Nob3cgPSBmdW5jdGlvbigpIHsNCi0gICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSAmJiB0aGlzLm1heF9zZWxlY3RlZF9vcHRpb25zIDw9IHRoaXMuY2hvaWNlc19jb3VudCgpKSB7DQotICAgICAgICB0aGlzLmZvcm1fZmllbGRfanEudHJpZ2dlcigiY2hvc2VuOm1heHNlbGVjdGVkIiwgew0KLSAgICAgICAgICBjaG9zZW46IHRoaXMNCi0gICAgICAgIH0pOw0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgIH0NCi0gICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcygiY2hvc2VuLXdpdGgtZHJvcCIpOw0KLSAgICAgIHRoaXMuZm9ybV9maWVsZF9qcS50cmlnZ2VyKCJjaG9zZW46c2hvd2luZ19kcm9wZG93biIsIHsNCi0gICAgICAgIGNob3NlbjogdGhpcw0KLSAgICAgIH0pOw0KLSAgICAgIHRoaXMucmVzdWx0c19zaG93aW5nID0gdHJ1ZTsNCi0gICAgICB0aGlzLnNlYXJjaF9maWVsZC5mb2N1cygpOw0KLSAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCh0aGlzLnNlYXJjaF9maWVsZC52YWwoKSk7DQotICAgICAgcmV0dXJuIHRoaXMud2lubm93X3Jlc3VsdHMoKTsNCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS51cGRhdGVfcmVzdWx0c19jb250ZW50ID0gZnVuY3Rpb24oY29udGVudCkgew0KLSAgICAgIHJldHVybiB0aGlzLnNlYXJjaF9yZXN1bHRzLmh0bWwoY29udGVudCk7DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUucmVzdWx0c19oaWRlID0gZnVuY3Rpb24oKSB7DQotICAgICAgaWYgKHRoaXMucmVzdWx0c19zaG93aW5nKSB7DQotICAgICAgICB0aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKTsNCi0gICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKCJjaG9zZW4td2l0aC1kcm9wIik7DQotICAgICAgICB0aGlzLmZvcm1fZmllbGRfanEudHJpZ2dlcigiY2hvc2VuOmhpZGluZ19kcm9wZG93biIsIHsNCi0gICAgICAgICAgY2hvc2VuOiB0aGlzDQotICAgICAgICB9KTsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHRoaXMucmVzdWx0c19zaG93aW5nID0gZmFsc2U7DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUuc2V0X3RhYl9pbmRleCA9IGZ1bmN0aW9uKGVsKSB7DQotICAgICAgdmFyIHRpOw0KLQ0KLSAgICAgIGlmICh0aGlzLmZvcm1fZmllbGQudGFiSW5kZXgpIHsNCi0gICAgICAgIHRpID0gdGhpcy5mb3JtX2ZpZWxkLnRhYkluZGV4Ow0KLSAgICAgICAgdGhpcy5mb3JtX2ZpZWxkLnRhYkluZGV4ID0gLTE7DQotICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hfZmllbGRbMF0udGFiSW5kZXggPSB0aTsNCi0gICAgICB9DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUuc2V0X2xhYmVsX2JlaGF2aW9yID0gZnVuY3Rpb24oKSB7DQotICAgICAgdmFyIF90aGlzID0gdGhpczsNCi0NCi0gICAgICB0aGlzLmZvcm1fZmllbGRfbGFiZWwgPSB0aGlzLmZvcm1fZmllbGRfanEucGFyZW50cygibGFiZWwiKTsNCi0gICAgICBpZiAoIXRoaXMuZm9ybV9maWVsZF9sYWJlbC5sZW5ndGggJiYgdGhpcy5mb3JtX2ZpZWxkLmlkLmxlbmd0aCkgew0KLSAgICAgICAgdGhpcy5mb3JtX2ZpZWxkX2xhYmVsID0gJCgibGFiZWxbZm9yPSciICsgdGhpcy5mb3JtX2ZpZWxkLmlkICsgIiddIik7DQotICAgICAgfQ0KLSAgICAgIGlmICh0aGlzLmZvcm1fZmllbGRfbGFiZWwubGVuZ3RoID4gMCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZm9ybV9maWVsZF9sYWJlbC5iaW5kKCdjbGljay5jaG9zZW4nLCBmdW5jdGlvbihldnQpIHsNCi0gICAgICAgICAgaWYgKF90aGlzLmlzX211bHRpcGxlKSB7DQotICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNvbnRhaW5lcl9tb3VzZWRvd24oZXZ0KTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gX3RoaXMuYWN0aXZhdGVfZmllbGQoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLnNob3dfc2VhcmNoX2ZpZWxkX2RlZmF1bHQgPSBmdW5jdGlvbigpIHsNCi0gICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSAmJiB0aGlzLmNob2ljZXNfY291bnQoKSA8IDEgJiYgIXRoaXMuYWN0aXZlX2ZpZWxkKSB7DQotICAgICAgICB0aGlzLnNlYXJjaF9maWVsZC52YWwodGhpcy5kZWZhdWx0X3RleHQpOw0KLSAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoX2ZpZWxkLmFkZENsYXNzKCJkZWZhdWx0Iik7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgiIik7DQotICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hfZmllbGQucmVtb3ZlQ2xhc3MoImRlZmF1bHQiKTsNCi0gICAgICB9DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUuc2VhcmNoX3Jlc3VsdHNfbW91c2V1cCA9IGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgIHZhciB0YXJnZXQ7DQotDQotICAgICAgdGFyZ2V0ID0gJChldnQudGFyZ2V0KS5oYXNDbGFzcygiYWN0aXZlLXJlc3VsdCIpID8gJChldnQudGFyZ2V0KSA6ICQoZXZ0LnRhcmdldCkucGFyZW50cygiLmFjdGl2ZS1yZXN1bHQiKS5maXJzdCgpOw0KLSAgICAgIGlmICh0YXJnZXQubGVuZ3RoKSB7DQotICAgICAgICB0aGlzLnJlc3VsdF9oaWdobGlnaHQgPSB0YXJnZXQ7DQotICAgICAgICB0aGlzLnJlc3VsdF9zZWxlY3QoZXZ0KTsNCi0gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaF9maWVsZC5mb2N1cygpOw0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfcmVzdWx0c19tb3VzZW92ZXIgPSBmdW5jdGlvbihldnQpIHsNCi0gICAgICB2YXIgdGFyZ2V0Ow0KLQ0KLSAgICAgIHRhcmdldCA9ICQoZXZ0LnRhcmdldCkuaGFzQ2xhc3MoImFjdGl2ZS1yZXN1bHQiKSA/ICQoZXZ0LnRhcmdldCkgOiAkKGV2dC50YXJnZXQpLnBhcmVudHMoIi5hY3RpdmUtcmVzdWx0IikuZmlyc3QoKTsNCi0gICAgICBpZiAodGFyZ2V0KSB7DQotICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRfZG9faGlnaGxpZ2h0KHRhcmdldCk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLnNlYXJjaF9yZXN1bHRzX21vdXNlb3V0ID0gZnVuY3Rpb24oZXZ0KSB7DQotICAgICAgaWYgKCQoZXZ0LnRhcmdldCkuaGFzQ2xhc3MoImFjdGl2ZS1yZXN1bHQiIHx8ICQoZXZ0LnRhcmdldCkucGFyZW50cygnLmFjdGl2ZS1yZXN1bHQnKS5maXJzdCgpKSkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0X2NsZWFyX2hpZ2hsaWdodCgpOw0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5jaG9pY2VfYnVpbGQgPSBmdW5jdGlvbihpdGVtKSB7DQotICAgICAgdmFyIGNob2ljZSwgY2xvc2VfbGluaywNCi0gICAgICAgIF90aGlzID0gdGhpczsNCi0NCi0gICAgICBjaG9pY2UgPSAkKCc8bGkgLz4nLCB7DQotICAgICAgICAiY2xhc3MiOiAic2VhcmNoLWNob2ljZSINCi0gICAgICB9KS5odG1sKCI8c3Bhbj4iICsgaXRlbS5odG1sICsgIjwvc3Bhbj4iKTsNCi0gICAgICBpZiAoaXRlbS5kaXNhYmxlZCkgew0KLSAgICAgICAgY2hvaWNlLmFkZENsYXNzKCdzZWFyY2gtY2hvaWNlLWRpc2FibGVkJyk7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGNsb3NlX2xpbmsgPSAkKCc8YSAvPicsIHsNCi0gICAgICAgICAgImNsYXNzIjogJ3NlYXJjaC1jaG9pY2UtY2xvc2UnLA0KLSAgICAgICAgICAnZGF0YS1vcHRpb24tYXJyYXktaW5kZXgnOiBpdGVtLmFycmF5X2luZGV4DQotICAgICAgICB9KTsNCi0gICAgICAgIGNsb3NlX2xpbmsuYmluZCgnY2xpY2suY2hvc2VuJywgZnVuY3Rpb24oZXZ0KSB7DQotICAgICAgICAgIHJldHVybiBfdGhpcy5jaG9pY2VfZGVzdHJveV9saW5rX2NsaWNrKGV2dCk7DQotICAgICAgICB9KTsNCi0gICAgICAgIGNob2ljZS5hcHBlbmQoY2xvc2VfbGluayk7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB0aGlzLnNlYXJjaF9jb250YWluZXIuYmVmb3JlKGNob2ljZSk7DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUuY2hvaWNlX2Rlc3Ryb3lfbGlua19jbGljayA9IGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOw0KLSAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTsNCi0gICAgICBpZiAoIXRoaXMuaXNfZGlzYWJsZWQpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmNob2ljZV9kZXN0cm95KCQoZXZ0LnRhcmdldCkpOw0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5jaG9pY2VfZGVzdHJveSA9IGZ1bmN0aW9uKGxpbmspIHsNCi0gICAgICBpZiAodGhpcy5yZXN1bHRfZGVzZWxlY3QobGlua1swXS5nZXRBdHRyaWJ1dGUoImRhdGEtb3B0aW9uLWFycmF5LWluZGV4IikpKSB7DQotICAgICAgICB0aGlzLnNob3dfc2VhcmNoX2ZpZWxkX2RlZmF1bHQoKTsNCi0gICAgICAgIGlmICh0aGlzLmlzX211bHRpcGxlICYmIHRoaXMuY2hvaWNlc19jb3VudCgpID4gMCAmJiB0aGlzLnNlYXJjaF9maWVsZC52YWwoKS5sZW5ndGggPCAxKSB7DQotICAgICAgICAgIHRoaXMucmVzdWx0c19oaWRlKCk7DQotICAgICAgICB9DQotICAgICAgICBsaW5rLnBhcmVudHMoJ2xpJykuZmlyc3QoKS5yZW1vdmUoKTsNCi0gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaF9maWVsZF9zY2FsZSgpOw0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5yZXN1bHRzX3Jlc2V0ID0gZnVuY3Rpb24oKSB7DQotICAgICAgdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbMF0uc2VsZWN0ZWQgPSB0cnVlOw0KLSAgICAgIHRoaXMuc2VsZWN0ZWRfb3B0aW9uX2NvdW50ID0gbnVsbDsNCi0gICAgICB0aGlzLnNpbmdsZV9zZXRfc2VsZWN0ZWRfdGV4dCgpOw0KLSAgICAgIHRoaXMuc2hvd19zZWFyY2hfZmllbGRfZGVmYXVsdCgpOw0KLSAgICAgIHRoaXMucmVzdWx0c19yZXNldF9jbGVhbnVwKCk7DQotICAgICAgdGhpcy5mb3JtX2ZpZWxkX2pxLnRyaWdnZXIoImNoYW5nZSIpOw0KLSAgICAgIGlmICh0aGlzLmFjdGl2ZV9maWVsZCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0c19oaWRlKCk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLnJlc3VsdHNfcmVzZXRfY2xlYW51cCA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHRoaXMuY3VycmVudF9zZWxlY3RlZEluZGV4ID0gdGhpcy5mb3JtX2ZpZWxkLnNlbGVjdGVkSW5kZXg7DQotICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRfaXRlbS5maW5kKCJhYmJyIikucmVtb3ZlKCk7DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUucmVzdWx0X3NlbGVjdCA9IGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgIHZhciBoaWdoLCBpdGVtLCBzZWxlY3RlZF9pbmRleDsNCi0NCi0gICAgICBpZiAodGhpcy5yZXN1bHRfaGlnaGxpZ2h0KSB7DQotICAgICAgICBoaWdoID0gdGhpcy5yZXN1bHRfaGlnaGxpZ2h0Ow0KLSAgICAgICAgdGhpcy5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0KCk7DQotICAgICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSAmJiB0aGlzLm1heF9zZWxlY3RlZF9vcHRpb25zIDw9IHRoaXMuY2hvaWNlc19jb3VudCgpKSB7DQotICAgICAgICAgIHRoaXMuZm9ybV9maWVsZF9qcS50cmlnZ2VyKCJjaG9zZW46bWF4c2VsZWN0ZWQiLCB7DQotICAgICAgICAgICAgY2hvc2VuOiB0aGlzDQotICAgICAgICAgIH0pOw0KLSAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSkgew0KLSAgICAgICAgICBoaWdoLnJlbW92ZUNsYXNzKCJhY3RpdmUtcmVzdWx0Iik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBpZiAodGhpcy5yZXN1bHRfc2luZ2xlX3NlbGVjdGVkKSB7DQotICAgICAgICAgICAgdGhpcy5yZXN1bHRfc2luZ2xlX3NlbGVjdGVkLnJlbW92ZUNsYXNzKCJyZXN1bHQtc2VsZWN0ZWQiKTsNCi0gICAgICAgICAgICBzZWxlY3RlZF9pbmRleCA9IHRoaXMucmVzdWx0X3NpbmdsZV9zZWxlY3RlZFswXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3B0aW9uLWFycmF5LWluZGV4Jyk7DQotICAgICAgICAgICAgdGhpcy5yZXN1bHRzX2RhdGFbc2VsZWN0ZWRfaW5kZXhdLnNlbGVjdGVkID0gZmFsc2U7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhpcy5yZXN1bHRfc2luZ2xlX3NlbGVjdGVkID0gaGlnaDsNCi0gICAgICAgIH0NCi0gICAgICAgIGhpZ2guYWRkQ2xhc3MoInJlc3VsdC1zZWxlY3RlZCIpOw0KLSAgICAgICAgaXRlbSA9IHRoaXMucmVzdWx0c19kYXRhW2hpZ2hbMF0uZ2V0QXR0cmlidXRlKCJkYXRhLW9wdGlvbi1hcnJheS1pbmRleCIpXTsNCi0gICAgICAgIGl0ZW0uc2VsZWN0ZWQgPSB0cnVlOw0KLSAgICAgICAgdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbaXRlbS5vcHRpb25zX2luZGV4XS5zZWxlY3RlZCA9IHRydWU7DQotICAgICAgICB0aGlzLnNlbGVjdGVkX29wdGlvbl9jb3VudCA9IG51bGw7DQotICAgICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSkgew0KLSAgICAgICAgICB0aGlzLmNob2ljZV9idWlsZChpdGVtKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIHRoaXMuc2luZ2xlX3NldF9zZWxlY3RlZF90ZXh0KGl0ZW0udGV4dCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoISgoZXZ0Lm1ldGFLZXkgfHwgZXZ0LmN0cmxLZXkpICYmIHRoaXMuaXNfbXVsdGlwbGUpKSB7DQotICAgICAgICAgIHRoaXMucmVzdWx0c19oaWRlKCk7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLnNlYXJjaF9maWVsZC52YWwoIiIpOw0KLSAgICAgICAgaWYgKHRoaXMuaXNfbXVsdGlwbGUgfHwgdGhpcy5mb3JtX2ZpZWxkLnNlbGVjdGVkSW5kZXggIT09IHRoaXMuY3VycmVudF9zZWxlY3RlZEluZGV4KSB7DQotICAgICAgICAgIHRoaXMuZm9ybV9maWVsZF9qcS50cmlnZ2VyKCJjaGFuZ2UiLCB7DQotICAgICAgICAgICAgJ3NlbGVjdGVkJzogdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbaXRlbS5vcHRpb25zX2luZGV4XS52YWx1ZQ0KLSAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuY3VycmVudF9zZWxlY3RlZEluZGV4ID0gdGhpcy5mb3JtX2ZpZWxkLnNlbGVjdGVkSW5kZXg7DQotICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hfZmllbGRfc2NhbGUoKTsNCi0gICAgICB9DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUuc2luZ2xlX3NldF9zZWxlY3RlZF90ZXh0ID0gZnVuY3Rpb24odGV4dCkgew0KLSAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsNCi0gICAgICAgIHRleHQgPSB0aGlzLmRlZmF1bHRfdGV4dDsNCi0gICAgICB9DQotICAgICAgaWYgKHRleHQgPT09IHRoaXMuZGVmYXVsdF90ZXh0KSB7DQotICAgICAgICB0aGlzLnNlbGVjdGVkX2l0ZW0uYWRkQ2xhc3MoImNob3Nlbi1kZWZhdWx0Iik7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHRoaXMuc2luZ2xlX2Rlc2VsZWN0X2NvbnRyb2xfYnVpbGQoKTsNCi0gICAgICAgIHRoaXMuc2VsZWN0ZWRfaXRlbS5yZW1vdmVDbGFzcygiY2hvc2VuLWRlZmF1bHQiKTsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRfaXRlbS5maW5kKCJzcGFuIikudGV4dCh0ZXh0KTsNCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5yZXN1bHRfZGVzZWxlY3QgPSBmdW5jdGlvbihwb3MpIHsNCi0gICAgICB2YXIgcmVzdWx0X2RhdGE7DQotDQotICAgICAgcmVzdWx0X2RhdGEgPSB0aGlzLnJlc3VsdHNfZGF0YVtwb3NdOw0KLSAgICAgIGlmICghdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbcmVzdWx0X2RhdGEub3B0aW9uc19pbmRleF0uZGlzYWJsZWQpIHsNCi0gICAgICAgIHJlc3VsdF9kYXRhLnNlbGVjdGVkID0gZmFsc2U7DQotICAgICAgICB0aGlzLmZvcm1fZmllbGQub3B0aW9uc1tyZXN1bHRfZGF0YS5vcHRpb25zX2luZGV4XS5zZWxlY3RlZCA9IGZhbHNlOw0KLSAgICAgICAgdGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQgPSBudWxsOw0KLSAgICAgICAgdGhpcy5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0KCk7DQotICAgICAgICBpZiAodGhpcy5yZXN1bHRzX3Nob3dpbmcpIHsNCi0gICAgICAgICAgdGhpcy53aW5ub3dfcmVzdWx0cygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy5mb3JtX2ZpZWxkX2pxLnRyaWdnZXIoImNoYW5nZSIsIHsNCi0gICAgICAgICAgZGVzZWxlY3RlZDogdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbcmVzdWx0X2RhdGEub3B0aW9uc19pbmRleF0udmFsdWUNCi0gICAgICAgIH0pOw0KLSAgICAgICAgdGhpcy5zZWFyY2hfZmllbGRfc2NhbGUoKTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLnNpbmdsZV9kZXNlbGVjdF9jb250cm9sX2J1aWxkID0gZnVuY3Rpb24oKSB7DQotICAgICAgaWYgKCF0aGlzLmFsbG93X3NpbmdsZV9kZXNlbGVjdCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICAgIH0NCi0gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRfaXRlbS5maW5kKCJhYmJyIikubGVuZ3RoKSB7DQotICAgICAgICB0aGlzLnNlbGVjdGVkX2l0ZW0uZmluZCgic3BhbiIpLmZpcnN0KCkuYWZ0ZXIoIjxhYmJyIGNsYXNzPVwic2VhcmNoLWNob2ljZS1jbG9zZVwiPjwvYWJicj4iKTsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRfaXRlbS5hZGRDbGFzcygiY2hvc2VuLXNpbmdsZS13aXRoLWRlc2VsZWN0Iik7DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUuZ2V0X3NlYXJjaF90ZXh0ID0gZnVuY3Rpb24oKSB7DQotICAgICAgaWYgKHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgpID09PSB0aGlzLmRlZmF1bHRfdGV4dCkgew0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICByZXR1cm4gJCgnPGRpdi8+JykudGV4dCgkLnRyaW0odGhpcy5zZWFyY2hfZmllbGQudmFsKCkpKS5odG1sKCk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLndpbm5vd19yZXN1bHRzX3NldF9oaWdobGlnaHQgPSBmdW5jdGlvbigpIHsNCi0gICAgICB2YXIgZG9faGlnaCwgc2VsZWN0ZWRfcmVzdWx0czsNCi0NCi0gICAgICBzZWxlY3RlZF9yZXN1bHRzID0gIXRoaXMuaXNfbXVsdGlwbGUgPyB0aGlzLnNlYXJjaF9yZXN1bHRzLmZpbmQoIi5yZXN1bHQtc2VsZWN0ZWQuYWN0aXZlLXJlc3VsdCIpIDogW107DQotICAgICAgZG9faGlnaCA9IHNlbGVjdGVkX3Jlc3VsdHMubGVuZ3RoID8gc2VsZWN0ZWRfcmVzdWx0cy5maXJzdCgpIDogdGhpcy5zZWFyY2hfcmVzdWx0cy5maW5kKCIuYWN0aXZlLXJlc3VsdCIpLmZpcnN0KCk7DQotICAgICAgaWYgKGRvX2hpZ2ggIT0gbnVsbCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0X2RvX2hpZ2hsaWdodChkb19oaWdoKTsNCi0gICAgICB9DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUubm9fcmVzdWx0cyA9IGZ1bmN0aW9uKHRlcm1zKSB7DQotICAgICAgdmFyIG5vX3Jlc3VsdHNfaHRtbDsNCi0NCi0gICAgICBub19yZXN1bHRzX2h0bWwgPSAkKCc8bGkgY2xhc3M9Im5vLXJlc3VsdHMiPicgKyB0aGlzLnJlc3VsdHNfbm9uZV9mb3VuZCArICcgIjxzcGFuPjwvc3Bhbj4iPC9saT4nKTsNCi0gICAgICBub19yZXN1bHRzX2h0bWwuZmluZCgic3BhbiIpLmZpcnN0KCkuaHRtbCh0ZXJtcyk7DQotICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoX3Jlc3VsdHMuYXBwZW5kKG5vX3Jlc3VsdHNfaHRtbCk7DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUubm9fcmVzdWx0c19jbGVhciA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHJldHVybiB0aGlzLnNlYXJjaF9yZXN1bHRzLmZpbmQoIi5uby1yZXN1bHRzIikucmVtb3ZlKCk7DQotICAgIH07DQotDQotICAgIENob3Nlbi5wcm90b3R5cGUua2V5ZG93bl9hcnJvdyA9IGZ1bmN0aW9uKCkgew0KLSAgICAgIHZhciBuZXh0X3NpYjsNCi0NCi0gICAgICBpZiAodGhpcy5yZXN1bHRzX3Nob3dpbmcgJiYgdGhpcy5yZXN1bHRfaGlnaGxpZ2h0KSB7DQotICAgICAgICBuZXh0X3NpYiA9IHRoaXMucmVzdWx0X2hpZ2hsaWdodC5uZXh0QWxsKCJsaS5hY3RpdmUtcmVzdWx0IikuZmlyc3QoKTsNCi0gICAgICAgIGlmIChuZXh0X3NpYikgew0KLSAgICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRfZG9faGlnaGxpZ2h0KG5leHRfc2liKTsNCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0c19zaG93KCk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLmtleXVwX2Fycm93ID0gZnVuY3Rpb24oKSB7DQotICAgICAgdmFyIHByZXZfc2liczsNCi0NCi0gICAgICBpZiAoIXRoaXMucmVzdWx0c19zaG93aW5nICYmICF0aGlzLmlzX211bHRpcGxlKSB7DQotICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzX3Nob3coKTsNCi0gICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdWx0X2hpZ2hsaWdodCkgew0KLSAgICAgICAgcHJldl9zaWJzID0gdGhpcy5yZXN1bHRfaGlnaGxpZ2h0LnByZXZBbGwoImxpLmFjdGl2ZS1yZXN1bHQiKTsNCi0gICAgICAgIGlmIChwcmV2X3NpYnMubGVuZ3RoKSB7DQotICAgICAgICAgIHJldHVybiB0aGlzLnJlc3VsdF9kb19oaWdobGlnaHQocHJldl9zaWJzLmZpcnN0KCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgaWYgKHRoaXMuY2hvaWNlc19jb3VudCgpID4gMCkgew0KLSAgICAgICAgICAgIHRoaXMucmVzdWx0c19oaWRlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0X2NsZWFyX2hpZ2hsaWdodCgpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5rZXlkb3duX2JhY2tzdHJva2UgPSBmdW5jdGlvbigpIHsNCi0gICAgICB2YXIgbmV4dF9hdmFpbGFibGVfZGVzdHJveTsNCi0NCi0gICAgICBpZiAodGhpcy5wZW5kaW5nX2JhY2tzdHJva2UpIHsNCi0gICAgICAgIHRoaXMuY2hvaWNlX2Rlc3Ryb3kodGhpcy5wZW5kaW5nX2JhY2tzdHJva2UuZmluZCgiYSIpLmZpcnN0KCkpOw0KLSAgICAgICAgcmV0dXJuIHRoaXMuY2xlYXJfYmFja3N0cm9rZSgpOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBuZXh0X2F2YWlsYWJsZV9kZXN0cm95ID0gdGhpcy5zZWFyY2hfY29udGFpbmVyLnNpYmxpbmdzKCJsaS5zZWFyY2gtY2hvaWNlIikubGFzdCgpOw0KLSAgICAgICAgaWYgKG5leHRfYXZhaWxhYmxlX2Rlc3Ryb3kubGVuZ3RoICYmICFuZXh0X2F2YWlsYWJsZV9kZXN0cm95Lmhhc0NsYXNzKCJzZWFyY2gtY2hvaWNlLWRpc2FibGVkIikpIHsNCi0gICAgICAgICAgdGhpcy5wZW5kaW5nX2JhY2tzdHJva2UgPSBuZXh0X2F2YWlsYWJsZV9kZXN0cm95Ow0KLSAgICAgICAgICBpZiAodGhpcy5zaW5nbGVfYmFja3N0cm9rZV9kZWxldGUpIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5rZXlkb3duX2JhY2tzdHJva2UoKTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nX2JhY2tzdHJva2UuYWRkQ2xhc3MoInNlYXJjaC1jaG9pY2UtZm9jdXMiKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5jbGVhcl9iYWNrc3Ryb2tlID0gZnVuY3Rpb24oKSB7DQotICAgICAgaWYgKHRoaXMucGVuZGluZ19iYWNrc3Ryb2tlKSB7DQotICAgICAgICB0aGlzLnBlbmRpbmdfYmFja3N0cm9rZS5yZW1vdmVDbGFzcygic2VhcmNoLWNob2ljZS1mb2N1cyIpOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gdGhpcy5wZW5kaW5nX2JhY2tzdHJva2UgPSBudWxsOw0KLSAgICB9Ow0KLQ0KLSAgICBDaG9zZW4ucHJvdG90eXBlLmtleWRvd25fY2hlY2tlciA9IGZ1bmN0aW9uKGV2dCkgew0KLSAgICAgIHZhciBzdHJva2UsIF9yZWYxOw0KLQ0KLSAgICAgIHN0cm9rZSA9IChfcmVmMSA9IGV2dC53aGljaCkgIT0gbnVsbCA/IF9yZWYxIDogZXZ0LmtleUNvZGU7DQotICAgICAgdGhpcy5zZWFyY2hfZmllbGRfc2NhbGUoKTsNCi0gICAgICBpZiAoc3Ryb2tlICE9PSA4ICYmIHRoaXMucGVuZGluZ19iYWNrc3Ryb2tlKSB7DQotICAgICAgICB0aGlzLmNsZWFyX2JhY2tzdHJva2UoKTsNCi0gICAgICB9DQotICAgICAgc3dpdGNoIChzdHJva2UpIHsNCi0gICAgICAgIGNhc2UgODoNCi0gICAgICAgICAgdGhpcy5iYWNrc3Ryb2tlX2xlbmd0aCA9IHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgpLmxlbmd0aDsNCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDk6DQotICAgICAgICAgIGlmICh0aGlzLnJlc3VsdHNfc2hvd2luZyAmJiAhdGhpcy5pc19tdWx0aXBsZSkgew0KLSAgICAgICAgICAgIHRoaXMucmVzdWx0X3NlbGVjdChldnQpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRoaXMubW91c2Vfb25fY29udGFpbmVyID0gZmFsc2U7DQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAxMzoNCi0gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAzODoNCi0gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICAgIHRoaXMua2V5dXBfYXJyb3coKTsNCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIDQwOg0KLSAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTsNCi0gICAgICAgICAgdGhpcy5rZXlkb3duX2Fycm93KCk7DQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgQ2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfZmllbGRfc2NhbGUgPSBmdW5jdGlvbigpIHsNCi0gICAgICB2YXIgZGl2LCBmX3dpZHRoLCBoLCBzdHlsZSwgc3R5bGVfYmxvY2ssIHN0eWxlcywgdywgX2ksIF9sZW47DQotDQotICAgICAgaWYgKHRoaXMuaXNfbXVsdGlwbGUpIHsNCi0gICAgICAgIGggPSAwOw0KLSAgICAgICAgdyA9IDA7DQotICAgICAgICBzdHlsZV9ibG9jayA9ICJwb3NpdGlvbjphYnNvbHV0ZTsgbGVmdDogLTEwMDBweDsgdG9wOiAtMTAwMHB4OyBkaXNwbGF5Om5vbmU7IjsNCi0gICAgICAgIHN0eWxlcyA9IFsnZm9udC1zaXplJywgJ2ZvbnQtc3R5bGUnLCAnZm9udC13ZWlnaHQnLCAnZm9udC1mYW1pbHknLCAnbGluZS1oZWlnaHQnLCAndGV4dC10cmFuc2Zvcm0nLCAnbGV0dGVyLXNwYWNpbmcnXTsNCi0gICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gc3R5bGVzLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7DQotICAgICAgICAgIHN0eWxlID0gc3R5bGVzW19pXTsNCi0gICAgICAgICAgc3R5bGVfYmxvY2sgKz0gc3R5bGUgKyAiOiIgKyB0aGlzLnNlYXJjaF9maWVsZC5jc3Moc3R5bGUpICsgIjsiOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZGl2ID0gJCgnPGRpdiAvPicsIHsNCi0gICAgICAgICAgJ3N0eWxlJzogc3R5bGVfYmxvY2sNCi0gICAgICAgIH0pOw0KLSAgICAgICAgZGl2LnRleHQodGhpcy5zZWFyY2hfZmllbGQudmFsKCkpOw0KLSAgICAgICAgJCgnYm9keScpLmFwcGVuZChkaXYpOw0KLSAgICAgICAgdyA9IGRpdi53aWR0aCgpICsgMjU7DQotICAgICAgICBkaXYucmVtb3ZlKCk7DQotICAgICAgICBmX3dpZHRoID0gdGhpcy5jb250YWluZXIub3V0ZXJXaWR0aCgpOw0KLSAgICAgICAgaWYgKHcgPiBmX3dpZHRoIC0gMTApIHsNCi0gICAgICAgICAgdyA9IGZfd2lkdGggLSAxMDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaF9maWVsZC5jc3Moew0KLSAgICAgICAgICAnd2lkdGgnOiB3ICsgJ3B4Jw0KLSAgICAgICAgfSk7DQotICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICByZXR1cm4gQ2hvc2VuOw0KLQ0KLSAgfSkoQWJzdHJhY3RDaG9zZW4pOw0KLQ0KLX0pLmNhbGwodGhpcyk7DQorLyoKKworQ2hvc2VuCisKKy0gYnkgUGF0cmljayBGaWxsZXIgZm9yIEhhcnZlc3QgaHR0cDovL2dldGhhcnZlc3QuY29tCistIENvcHlyaWdodCAoYykgMjAxMS0yMDEzIGJ5IEhhcnZlc3QKKworQXZhaWxhYmxlIGZvciB1c2UgdW5kZXIgdGhlIE1JVCBMaWNlbnNlCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorCisqLworLy8gQ2hvc2VuLCBhIFNlbGVjdCBCb3ggRW5oYW5jZXIgZm9yIGpRdWVyeSBhbmQgUHJvdG90eXBlCisvLyBieSBQYXRyaWNrIEZpbGxlciBmb3IgSGFydmVzdCwgaHR0cDovL2dldGhhcnZlc3QuY29tCisvLworLy8gVmVyc2lvbiAxLjAuMAorLy8gRnVsbCBzb3VyY2UgYXQgaHR0cHM6Ly9naXRodWIuY29tL2hhcnZlc3RocS9jaG9zZW4KKy8vIENvcHlyaWdodCAoYykgMjAxMSBIYXJ2ZXN0IGh0dHA6Ly9nZXRoYXJ2ZXN0LmNvbQorCisvLyBNSVQgTGljZW5zZSwgaHR0cHM6Ly9naXRodWIuY29tL2hhcnZlc3RocS9jaG9zZW4vYmxvYi9tYXN0ZXIvTElDRU5TRS5tZAorLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBgZ3J1bnQgYnVpbGRgLCBkbyBub3QgZWRpdCBpdCBieSBoYW5kLgorKGZ1bmN0aW9uKCkgeworICB2YXIgJCwgQWJzdHJhY3RDaG9zZW4sIENob3NlbiwgU2VsZWN0UGFyc2VyLCBfcmVmLAorICAgIF9faGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5LAorICAgIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoX19oYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9OworCisgIFNlbGVjdFBhcnNlciA9IChmdW5jdGlvbigpIHsKKyAgICBmdW5jdGlvbiBTZWxlY3RQYXJzZXIoKSB7CisgICAgICB0aGlzLm9wdGlvbnNfaW5kZXggPSAwOworICAgICAgdGhpcy5wYXJzZWQgPSBbXTsKKyAgICB9CisKKyAgICBTZWxlY3RQYXJzZXIucHJvdG90eXBlLmFkZF9ub2RlID0gZnVuY3Rpb24oY2hpbGQpIHsKKyAgICAgIGlmIChjaGlsZC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAiT1BUR1JPVVAiKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZF9ncm91cChjaGlsZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdGhpcy5hZGRfb3B0aW9uKGNoaWxkKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgU2VsZWN0UGFyc2VyLnByb3RvdHlwZS5hZGRfZ3JvdXAgPSBmdW5jdGlvbihncm91cCkgeworICAgICAgdmFyIGdyb3VwX3Bvc2l0aW9uLCBvcHRpb24sIF9pLCBfbGVuLCBfcmVmLCBfcmVzdWx0czsKKworICAgICAgZ3JvdXBfcG9zaXRpb24gPSB0aGlzLnBhcnNlZC5sZW5ndGg7CisgICAgICB0aGlzLnBhcnNlZC5wdXNoKHsKKyAgICAgICAgYXJyYXlfaW5kZXg6IGdyb3VwX3Bvc2l0aW9uLAorICAgICAgICBncm91cDogdHJ1ZSwKKyAgICAgICAgbGFiZWw6IHRoaXMuZXNjYXBlRXhwcmVzc2lvbihncm91cC5sYWJlbCksCisgICAgICAgIGNoaWxkcmVuOiAwLAorICAgICAgICBkaXNhYmxlZDogZ3JvdXAuZGlzYWJsZWQKKyAgICAgIH0pOworICAgICAgX3JlZiA9IGdyb3VwLmNoaWxkTm9kZXM7CisgICAgICBfcmVzdWx0cyA9IFtdOworICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7CisgICAgICAgIG9wdGlvbiA9IF9yZWZbX2ldOworICAgICAgICBfcmVzdWx0cy5wdXNoKHRoaXMuYWRkX29wdGlvbihvcHRpb24sIGdyb3VwX3Bvc2l0aW9uLCBncm91cC5kaXNhYmxlZCkpOworICAgICAgfQorICAgICAgcmV0dXJuIF9yZXN1bHRzOworICAgIH07CisKKyAgICBTZWxlY3RQYXJzZXIucHJvdG90eXBlLmFkZF9vcHRpb24gPSBmdW5jdGlvbihvcHRpb24sIGdyb3VwX3Bvc2l0aW9uLCBncm91cF9kaXNhYmxlZCkgeworICAgICAgaWYgKG9wdGlvbi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAiT1BUSU9OIikgeworICAgICAgICBpZiAob3B0aW9uLnRleHQgIT09ICIiKSB7CisgICAgICAgICAgaWYgKGdyb3VwX3Bvc2l0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucGFyc2VkW2dyb3VwX3Bvc2l0aW9uXS5jaGlsZHJlbiArPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICB0aGlzLnBhcnNlZC5wdXNoKHsKKyAgICAgICAgICAgIGFycmF5X2luZGV4OiB0aGlzLnBhcnNlZC5sZW5ndGgsCisgICAgICAgICAgICBvcHRpb25zX2luZGV4OiB0aGlzLm9wdGlvbnNfaW5kZXgsCisgICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLAorICAgICAgICAgICAgdGV4dDogb3B0aW9uLnRleHQsCisgICAgICAgICAgICBodG1sOiBvcHRpb24uaW5uZXJIVE1MLAorICAgICAgICAgICAgc2VsZWN0ZWQ6IG9wdGlvbi5zZWxlY3RlZCwKKyAgICAgICAgICAgIGRpc2FibGVkOiBncm91cF9kaXNhYmxlZCA9PT0gdHJ1ZSA/IGdyb3VwX2Rpc2FibGVkIDogb3B0aW9uLmRpc2FibGVkLAorICAgICAgICAgICAgZ3JvdXBfYXJyYXlfaW5kZXg6IGdyb3VwX3Bvc2l0aW9uLAorICAgICAgICAgICAgY2xhc3Nlczogb3B0aW9uLmNsYXNzTmFtZSwKKyAgICAgICAgICAgIHN0eWxlOiBvcHRpb24uc3R5bGUuY3NzVGV4dAorICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMucGFyc2VkLnB1c2goeworICAgICAgICAgICAgYXJyYXlfaW5kZXg6IHRoaXMucGFyc2VkLmxlbmd0aCwKKyAgICAgICAgICAgIG9wdGlvbnNfaW5kZXg6IHRoaXMub3B0aW9uc19pbmRleCwKKyAgICAgICAgICAgIGVtcHR5OiB0cnVlCisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc19pbmRleCArPSAxOworICAgICAgfQorICAgIH07CisKKyAgICBTZWxlY3RQYXJzZXIucHJvdG90eXBlLmVzY2FwZUV4cHJlc3Npb24gPSBmdW5jdGlvbih0ZXh0KSB7CisgICAgICB2YXIgbWFwLCB1bnNhZmVfY2hhcnM7CisKKyAgICAgIGlmICgodGV4dCA9PSBudWxsKSB8fCB0ZXh0ID09PSBmYWxzZSkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgICB9CisgICAgICBpZiAoIS9bXCZcPFw+XCJcJ1xgXS8udGVzdCh0ZXh0KSkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgIH0KKyAgICAgIG1hcCA9IHsKKyAgICAgICAgIjwiOiAiJmx0OyIsCisgICAgICAgICI+IjogIiZndDsiLAorICAgICAgICAnIic6ICImcXVvdDsiLAorICAgICAgICAiJyI6ICImI3gyNzsiLAorICAgICAgICAiYCI6ICImI3g2MDsiCisgICAgICB9OworICAgICAgdW5zYWZlX2NoYXJzID0gLyYoPyFcdys7KXxbXDxcPlwiXCdcYF0vZzsKKyAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UodW5zYWZlX2NoYXJzLCBmdW5jdGlvbihjaHIpIHsKKyAgICAgICAgcmV0dXJuIG1hcFtjaHJdIHx8ICImYW1wOyI7CisgICAgICB9KTsKKyAgICB9OworCisgICAgcmV0dXJuIFNlbGVjdFBhcnNlcjsKKworICB9KSgpOworCisgIFNlbGVjdFBhcnNlci5zZWxlY3RfdG9fYXJyYXkgPSBmdW5jdGlvbihzZWxlY3QpIHsKKyAgICB2YXIgY2hpbGQsIHBhcnNlciwgX2ksIF9sZW4sIF9yZWY7CisKKyAgICBwYXJzZXIgPSBuZXcgU2VsZWN0UGFyc2VyKCk7CisgICAgX3JlZiA9IHNlbGVjdC5jaGlsZE5vZGVzOworICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgeworICAgICAgY2hpbGQgPSBfcmVmW19pXTsKKyAgICAgIHBhcnNlci5hZGRfbm9kZShjaGlsZCk7CisgICAgfQorICAgIHJldHVybiBwYXJzZXIucGFyc2VkOworICB9OworCisgIEFic3RyYWN0Q2hvc2VuID0gKGZ1bmN0aW9uKCkgeworICAgIGZ1bmN0aW9uIEFic3RyYWN0Q2hvc2VuKGZvcm1fZmllbGQsIG9wdGlvbnMpIHsKKyAgICAgIHRoaXMuZm9ybV9maWVsZCA9IGZvcm1fZmllbGQ7CisgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDoge307CisgICAgICBpZiAoIUFic3RyYWN0Q2hvc2VuLmJyb3dzZXJfaXNfc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdGhpcy5pc19tdWx0aXBsZSA9IHRoaXMuZm9ybV9maWVsZC5tdWx0aXBsZTsKKyAgICAgIHRoaXMuc2V0X2RlZmF1bHRfdGV4dCgpOworICAgICAgdGhpcy5zZXRfZGVmYXVsdF92YWx1ZXMoKTsKKyAgICAgIHRoaXMuc2V0dXAoKTsKKyAgICAgIHRoaXMuc2V0X3VwX2h0bWwoKTsKKyAgICAgIHRoaXMucmVnaXN0ZXJfb2JzZXJ2ZXJzKCk7CisgICAgfQorCisgICAgQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnNldF9kZWZhdWx0X3ZhbHVlcyA9IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgdGhpcy5jbGlja190ZXN0X2FjdGlvbiA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgICByZXR1cm4gX3RoaXMudGVzdF9hY3RpdmVfY2xpY2soZXZ0KTsKKyAgICAgIH07CisgICAgICB0aGlzLmFjdGl2YXRlX2FjdGlvbiA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgICByZXR1cm4gX3RoaXMuYWN0aXZhdGVfZmllbGQoZXZ0KTsKKyAgICAgIH07CisgICAgICB0aGlzLmFjdGl2ZV9maWVsZCA9IGZhbHNlOworICAgICAgdGhpcy5tb3VzZV9vbl9jb250YWluZXIgPSBmYWxzZTsKKyAgICAgIHRoaXMucmVzdWx0c19zaG93aW5nID0gZmFsc2U7CisgICAgICB0aGlzLnJlc3VsdF9oaWdobGlnaHRlZCA9IG51bGw7CisgICAgICB0aGlzLnJlc3VsdF9zaW5nbGVfc2VsZWN0ZWQgPSBudWxsOworICAgICAgdGhpcy5hbGxvd19zaW5nbGVfZGVzZWxlY3QgPSAodGhpcy5vcHRpb25zLmFsbG93X3NpbmdsZV9kZXNlbGVjdCAhPSBudWxsKSAmJiAodGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbMF0gIT0gbnVsbCkgJiYgdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbMF0udGV4dCA9PT0gIiIgPyB0aGlzLm9wdGlvbnMuYWxsb3dfc2luZ2xlX2Rlc2VsZWN0IDogZmFsc2U7CisgICAgICB0aGlzLmRpc2FibGVfc2VhcmNoX3RocmVzaG9sZCA9IHRoaXMub3B0aW9ucy5kaXNhYmxlX3NlYXJjaF90aHJlc2hvbGQgfHwgMDsKKyAgICAgIHRoaXMuZGlzYWJsZV9zZWFyY2ggPSB0aGlzLm9wdGlvbnMuZGlzYWJsZV9zZWFyY2ggfHwgZmFsc2U7CisgICAgICB0aGlzLmVuYWJsZV9zcGxpdF93b3JkX3NlYXJjaCA9IHRoaXMub3B0aW9ucy5lbmFibGVfc3BsaXRfd29yZF9zZWFyY2ggIT0gbnVsbCA/IHRoaXMub3B0aW9ucy5lbmFibGVfc3BsaXRfd29yZF9zZWFyY2ggOiB0cnVlOworICAgICAgdGhpcy5ncm91cF9zZWFyY2ggPSB0aGlzLm9wdGlvbnMuZ3JvdXBfc2VhcmNoICE9IG51bGwgPyB0aGlzLm9wdGlvbnMuZ3JvdXBfc2VhcmNoIDogdHJ1ZTsKKyAgICAgIHRoaXMuc2VhcmNoX2NvbnRhaW5zID0gdGhpcy5vcHRpb25zLnNlYXJjaF9jb250YWlucyB8fCBmYWxzZTsKKyAgICAgIHRoaXMuc2luZ2xlX2JhY2tzdHJva2VfZGVsZXRlID0gdGhpcy5vcHRpb25zLnNpbmdsZV9iYWNrc3Ryb2tlX2RlbGV0ZSAhPSBudWxsID8gdGhpcy5vcHRpb25zLnNpbmdsZV9iYWNrc3Ryb2tlX2RlbGV0ZSA6IHRydWU7CisgICAgICB0aGlzLm1heF9zZWxlY3RlZF9vcHRpb25zID0gdGhpcy5vcHRpb25zLm1heF9zZWxlY3RlZF9vcHRpb25zIHx8IEluZmluaXR5OworICAgICAgdGhpcy5pbmhlcml0X3NlbGVjdF9jbGFzc2VzID0gdGhpcy5vcHRpb25zLmluaGVyaXRfc2VsZWN0X2NsYXNzZXMgfHwgZmFsc2U7CisgICAgICB0aGlzLmRpc3BsYXlfc2VsZWN0ZWRfb3B0aW9ucyA9IHRoaXMub3B0aW9ucy5kaXNwbGF5X3NlbGVjdGVkX29wdGlvbnMgIT0gbnVsbCA/IHRoaXMub3B0aW9ucy5kaXNwbGF5X3NlbGVjdGVkX29wdGlvbnMgOiB0cnVlOworICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheV9kaXNhYmxlZF9vcHRpb25zID0gdGhpcy5vcHRpb25zLmRpc3BsYXlfZGlzYWJsZWRfb3B0aW9ucyAhPSBudWxsID8gdGhpcy5vcHRpb25zLmRpc3BsYXlfZGlzYWJsZWRfb3B0aW9ucyA6IHRydWU7CisgICAgfTsKKworICAgIEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5zZXRfZGVmYXVsdF90ZXh0ID0gZnVuY3Rpb24oKSB7CisgICAgICBpZiAodGhpcy5mb3JtX2ZpZWxkLmdldEF0dHJpYnV0ZSgiZGF0YS1wbGFjZWhvbGRlciIpKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdF90ZXh0ID0gdGhpcy5mb3JtX2ZpZWxkLmdldEF0dHJpYnV0ZSgiZGF0YS1wbGFjZWhvbGRlciIpOworICAgICAgfSBlbHNlIGlmICh0aGlzLmlzX211bHRpcGxlKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdF90ZXh0ID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyX3RleHRfbXVsdGlwbGUgfHwgdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyX3RleHQgfHwgQWJzdHJhY3RDaG9zZW4uZGVmYXVsdF9tdWx0aXBsZV90ZXh0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0X3RleHQgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXJfdGV4dF9zaW5nbGUgfHwgdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyX3RleHQgfHwgQWJzdHJhY3RDaG9zZW4uZGVmYXVsdF9zaW5nbGVfdGV4dDsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzLnJlc3VsdHNfbm9uZV9mb3VuZCA9IHRoaXMuZm9ybV9maWVsZC5nZXRBdHRyaWJ1dGUoImRhdGEtbm9fcmVzdWx0c190ZXh0IikgfHwgdGhpcy5vcHRpb25zLm5vX3Jlc3VsdHNfdGV4dCB8fCBBYnN0cmFjdENob3Nlbi5kZWZhdWx0X25vX3Jlc3VsdF90ZXh0OworICAgIH07CisKKyAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUubW91c2VfZW50ZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB0aGlzLm1vdXNlX29uX2NvbnRhaW5lciA9IHRydWU7CisgICAgfTsKKworICAgIEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5tb3VzZV9sZWF2ZSA9IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMubW91c2Vfb25fY29udGFpbmVyID0gZmFsc2U7CisgICAgfTsKKworICAgIEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5pbnB1dF9mb2N1cyA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgaWYgKHRoaXMuaXNfbXVsdGlwbGUpIHsKKyAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZV9maWVsZCkgeworICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBfdGhpcy5jb250YWluZXJfbW91c2Vkb3duKCk7CisgICAgICAgICAgfSksIDUwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZV9maWVsZCkgeworICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlX2ZpZWxkKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworCisgICAgQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLmlucHV0X2JsdXIgPSBmdW5jdGlvbihldnQpIHsKKyAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICAgIGlmICghdGhpcy5tb3VzZV9vbl9jb250YWluZXIpIHsKKyAgICAgICAgdGhpcy5hY3RpdmVfZmllbGQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoKGZ1bmN0aW9uKCkgeworICAgICAgICAgIHJldHVybiBfdGhpcy5ibHVyX3Rlc3QoKTsKKyAgICAgICAgfSksIDEwMCk7CisgICAgICB9CisgICAgfTsKKworICAgIEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5yZXN1bHRzX29wdGlvbl9idWlsZCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICAgIHZhciBjb250ZW50LCBkYXRhLCBfaSwgX2xlbiwgX3JlZjsKKworICAgICAgY29udGVudCA9ICcnOworICAgICAgX3JlZiA9IHRoaXMucmVzdWx0c19kYXRhOworICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7CisgICAgICAgIGRhdGEgPSBfcmVmW19pXTsKKyAgICAgICAgaWYgKGRhdGEuZ3JvdXApIHsKKyAgICAgICAgICBjb250ZW50ICs9IHRoaXMucmVzdWx0X2FkZF9ncm91cChkYXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250ZW50ICs9IHRoaXMucmVzdWx0X2FkZF9vcHRpb24oZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuZmlyc3QgOiB2b2lkIDApIHsKKyAgICAgICAgICBpZiAoZGF0YS5zZWxlY3RlZCAmJiB0aGlzLmlzX211bHRpcGxlKSB7CisgICAgICAgICAgICB0aGlzLmNob2ljZV9idWlsZChkYXRhKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuc2VsZWN0ZWQgJiYgIXRoaXMuaXNfbXVsdGlwbGUpIHsKKyAgICAgICAgICAgIHRoaXMuc2luZ2xlX3NldF9zZWxlY3RlZF90ZXh0KGRhdGEudGV4dCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gY29udGVudDsKKyAgICB9OworCisgICAgQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnJlc3VsdF9hZGRfb3B0aW9uID0gZnVuY3Rpb24ob3B0aW9uKSB7CisgICAgICB2YXIgY2xhc3Nlcywgc3R5bGU7CisKKyAgICAgIGlmICghb3B0aW9uLnNlYXJjaF9tYXRjaCkgeworICAgICAgICByZXR1cm4gJyc7CisgICAgICB9CisgICAgICBpZiAoIXRoaXMuaW5jbHVkZV9vcHRpb25faW5fcmVzdWx0cyhvcHRpb24pKSB7CisgICAgICAgIHJldHVybiAnJzsKKyAgICAgIH0KKyAgICAgIGNsYXNzZXMgPSBbXTsKKyAgICAgIGlmICghb3B0aW9uLmRpc2FibGVkICYmICEob3B0aW9uLnNlbGVjdGVkICYmIHRoaXMuaXNfbXVsdGlwbGUpKSB7CisgICAgICAgIGNsYXNzZXMucHVzaCgiYWN0aXZlLXJlc3VsdCIpOworICAgICAgfQorICAgICAgaWYgKG9wdGlvbi5kaXNhYmxlZCAmJiAhKG9wdGlvbi5zZWxlY3RlZCAmJiB0aGlzLmlzX211bHRpcGxlKSkgeworICAgICAgICBjbGFzc2VzLnB1c2goImRpc2FibGVkLXJlc3VsdCIpOworICAgICAgfQorICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCkgeworICAgICAgICBjbGFzc2VzLnB1c2goInJlc3VsdC1zZWxlY3RlZCIpOworICAgICAgfQorICAgICAgaWYgKG9wdGlvbi5ncm91cF9hcnJheV9pbmRleCAhPSBudWxsKSB7CisgICAgICAgIGNsYXNzZXMucHVzaCgiZ3JvdXAtb3B0aW9uIik7CisgICAgICB9CisgICAgICBpZiAob3B0aW9uLmNsYXNzZXMgIT09ICIiKSB7CisgICAgICAgIGNsYXNzZXMucHVzaChvcHRpb24uY2xhc3Nlcyk7CisgICAgICB9CisgICAgICBzdHlsZSA9IG9wdGlvbi5zdHlsZS5jc3NUZXh0ICE9PSAiIiA/ICIgc3R5bGU9XCIiICsgb3B0aW9uLnN0eWxlICsgIlwiIiA6ICIiOworICAgICAgcmV0dXJuICI8bGkgY2xhc3M9XCIiICsgKGNsYXNzZXMuam9pbignICcpKSArICJcIiIgKyBzdHlsZSArICIgZGF0YS1vcHRpb24tYXJyYXktaW5kZXg9XCIiICsgb3B0aW9uLmFycmF5X2luZGV4ICsgIlwiPiIgKyBvcHRpb24uc2VhcmNoX3RleHQgKyAiPC9saT4iOworICAgIH07CisKKyAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzdWx0X2FkZF9ncm91cCA9IGZ1bmN0aW9uKGdyb3VwKSB7CisgICAgICBpZiAoIShncm91cC5zZWFyY2hfbWF0Y2ggfHwgZ3JvdXAuZ3JvdXBfbWF0Y2gpKSB7CisgICAgICAgIHJldHVybiAnJzsKKyAgICAgIH0KKyAgICAgIGlmICghKGdyb3VwLmFjdGl2ZV9vcHRpb25zID4gMCkpIHsKKyAgICAgICAgcmV0dXJuICcnOworICAgICAgfQorICAgICAgcmV0dXJuICI8bGkgY2xhc3M9XCJncm91cC1yZXN1bHRcIj4iICsgZ3JvdXAuc2VhcmNoX3RleHQgKyAiPC9saT4iOworICAgIH07CisKKyAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzdWx0c191cGRhdGVfZmllbGQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMuc2V0X2RlZmF1bHRfdGV4dCgpOworICAgICAgaWYgKCF0aGlzLmlzX211bHRpcGxlKSB7CisgICAgICAgIHRoaXMucmVzdWx0c19yZXNldF9jbGVhbnVwKCk7CisgICAgICB9CisgICAgICB0aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKTsKKyAgICAgIHRoaXMucmVzdWx0X3NpbmdsZV9zZWxlY3RlZCA9IG51bGw7CisgICAgICB0aGlzLnJlc3VsdHNfYnVpbGQoKTsKKyAgICAgIGlmICh0aGlzLnJlc3VsdHNfc2hvd2luZykgeworICAgICAgICByZXR1cm4gdGhpcy53aW5ub3dfcmVzdWx0cygpOworICAgICAgfQorICAgIH07CisKKyAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzdWx0c190b2dnbGUgPSBmdW5jdGlvbigpIHsKKyAgICAgIGlmICh0aGlzLnJlc3VsdHNfc2hvd2luZykgeworICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzX2hpZGUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc3VsdHNfc2hvdygpOworICAgICAgfQorICAgIH07CisKKyAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzdWx0c19zZWFyY2ggPSBmdW5jdGlvbihldnQpIHsKKyAgICAgIGlmICh0aGlzLnJlc3VsdHNfc2hvd2luZykgeworICAgICAgICByZXR1cm4gdGhpcy53aW5ub3dfcmVzdWx0cygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0c19zaG93KCk7CisgICAgICB9CisgICAgfTsKKworICAgIEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS53aW5ub3dfcmVzdWx0cyA9IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGVzY2FwZWRTZWFyY2hUZXh0LCBvcHRpb24sIHJlZ2V4LCByZWdleEFuY2hvciwgcmVzdWx0cywgcmVzdWx0c19ncm91cCwgc2VhcmNoVGV4dCwgc3RhcnRwb3MsIHRleHQsIHpyZWdleCwgX2ksIF9sZW4sIF9yZWY7CisKKyAgICAgIHRoaXMubm9fcmVzdWx0c19jbGVhcigpOworICAgICAgcmVzdWx0cyA9IDA7CisgICAgICBzZWFyY2hUZXh0ID0gdGhpcy5nZXRfc2VhcmNoX3RleHQoKTsKKyAgICAgIGVzY2FwZWRTZWFyY2hUZXh0ID0gc2VhcmNoVGV4dC5yZXBsYWNlKC9bLVtcXXt9KCkqKz8uLFxcXiR8I1xzXS9nLCAiXFwkJiIpOworICAgICAgcmVnZXhBbmNob3IgPSB0aGlzLnNlYXJjaF9jb250YWlucyA/ICIiIDogIl4iOworICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4QW5jaG9yICsgZXNjYXBlZFNlYXJjaFRleHQsICdpJyk7CisgICAgICB6cmVnZXggPSBuZXcgUmVnRXhwKGVzY2FwZWRTZWFyY2hUZXh0LCAnaScpOworICAgICAgX3JlZiA9IHRoaXMucmVzdWx0c19kYXRhOworICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7CisgICAgICAgIG9wdGlvbiA9IF9yZWZbX2ldOworICAgICAgICBvcHRpb24uc2VhcmNoX21hdGNoID0gZmFsc2U7CisgICAgICAgIHJlc3VsdHNfZ3JvdXAgPSBudWxsOworICAgICAgICBpZiAodGhpcy5pbmNsdWRlX29wdGlvbl9pbl9yZXN1bHRzKG9wdGlvbikpIHsKKyAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwKSB7CisgICAgICAgICAgICBvcHRpb24uZ3JvdXBfbWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgIG9wdGlvbi5hY3RpdmVfb3B0aW9ucyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgob3B0aW9uLmdyb3VwX2FycmF5X2luZGV4ICE9IG51bGwpICYmIHRoaXMucmVzdWx0c19kYXRhW29wdGlvbi5ncm91cF9hcnJheV9pbmRleF0pIHsKKyAgICAgICAgICAgIHJlc3VsdHNfZ3JvdXAgPSB0aGlzLnJlc3VsdHNfZGF0YVtvcHRpb24uZ3JvdXBfYXJyYXlfaW5kZXhdOworICAgICAgICAgICAgaWYgKHJlc3VsdHNfZ3JvdXAuYWN0aXZlX29wdGlvbnMgPT09IDAgJiYgcmVzdWx0c19ncm91cC5zZWFyY2hfbWF0Y2gpIHsKKyAgICAgICAgICAgICAgcmVzdWx0cyArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0c19ncm91cC5hY3RpdmVfb3B0aW9ucyArPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIShvcHRpb24uZ3JvdXAgJiYgIXRoaXMuZ3JvdXBfc2VhcmNoKSkgeworICAgICAgICAgICAgb3B0aW9uLnNlYXJjaF90ZXh0ID0gb3B0aW9uLmdyb3VwID8gb3B0aW9uLmxhYmVsIDogb3B0aW9uLmh0bWw7CisgICAgICAgICAgICBvcHRpb24uc2VhcmNoX21hdGNoID0gdGhpcy5zZWFyY2hfc3RyaW5nX21hdGNoKG9wdGlvbi5zZWFyY2hfdGV4dCwgcmVnZXgpOworICAgICAgICAgICAgaWYgKG9wdGlvbi5zZWFyY2hfbWF0Y2ggJiYgIW9wdGlvbi5ncm91cCkgeworICAgICAgICAgICAgICByZXN1bHRzICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3B0aW9uLnNlYXJjaF9tYXRjaCkgeworICAgICAgICAgICAgICBpZiAoc2VhcmNoVGV4dC5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBzdGFydHBvcyA9IG9wdGlvbi5zZWFyY2hfdGV4dC5zZWFyY2goenJlZ2V4KTsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gb3B0aW9uLnNlYXJjaF90ZXh0LnN1YnN0cigwLCBzdGFydHBvcyArIHNlYXJjaFRleHQubGVuZ3RoKSArICc8L2VtPicgKyBvcHRpb24uc2VhcmNoX3RleHQuc3Vic3RyKHN0YXJ0cG9zICsgc2VhcmNoVGV4dC5sZW5ndGgpOworICAgICAgICAgICAgICAgIG9wdGlvbi5zZWFyY2hfdGV4dCA9IHRleHQuc3Vic3RyKDAsIHN0YXJ0cG9zKSArICc8ZW0+JyArIHRleHQuc3Vic3RyKHN0YXJ0cG9zKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAocmVzdWx0c19ncm91cCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0c19ncm91cC5ncm91cF9tYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKG9wdGlvbi5ncm91cF9hcnJheV9pbmRleCAhPSBudWxsKSAmJiB0aGlzLnJlc3VsdHNfZGF0YVtvcHRpb24uZ3JvdXBfYXJyYXlfaW5kZXhdLnNlYXJjaF9tYXRjaCkgeworICAgICAgICAgICAgICBvcHRpb24uc2VhcmNoX21hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRoaXMucmVzdWx0X2NsZWFyX2hpZ2hsaWdodCgpOworICAgICAgaWYgKHJlc3VsdHMgPCAxICYmIHNlYXJjaFRleHQubGVuZ3RoKSB7CisgICAgICAgIHRoaXMudXBkYXRlX3Jlc3VsdHNfY29udGVudCgiIik7CisgICAgICAgIHJldHVybiB0aGlzLm5vX3Jlc3VsdHMoc2VhcmNoVGV4dCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLnVwZGF0ZV9yZXN1bHRzX2NvbnRlbnQodGhpcy5yZXN1bHRzX29wdGlvbl9idWlsZCgpKTsKKyAgICAgICAgcmV0dXJuIHRoaXMud2lubm93X3Jlc3VsdHNfc2V0X2hpZ2hsaWdodCgpOworICAgICAgfQorICAgIH07CisKKyAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUuc2VhcmNoX3N0cmluZ19tYXRjaCA9IGZ1bmN0aW9uKHNlYXJjaF9zdHJpbmcsIHJlZ2V4KSB7CisgICAgICB2YXIgcGFydCwgcGFydHMsIF9pLCBfbGVuOworCisgICAgICBpZiAocmVnZXgudGVzdChzZWFyY2hfc3RyaW5nKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5lbmFibGVfc3BsaXRfd29yZF9zZWFyY2ggJiYgKHNlYXJjaF9zdHJpbmcuaW5kZXhPZigiICIpID49IDAgfHwgc2VhcmNoX3N0cmluZy5pbmRleE9mKCJbIikgPT09IDApKSB7CisgICAgICAgIHBhcnRzID0gc2VhcmNoX3N0cmluZy5yZXBsYWNlKC9cW3xcXS9nLCAiIikuc3BsaXQoIiAiKTsKKyAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCkgeworICAgICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gcGFydHMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKKyAgICAgICAgICAgIHBhcnQgPSBwYXJ0c1tfaV07CisgICAgICAgICAgICBpZiAocmVnZXgudGVzdChwYXJ0KSkgeworICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworCisgICAgQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLmNob2ljZXNfY291bnQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBvcHRpb24sIF9pLCBfbGVuLCBfcmVmOworCisgICAgICBpZiAodGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQ7CisgICAgICB9CisgICAgICB0aGlzLnNlbGVjdGVkX29wdGlvbl9jb3VudCA9IDA7CisgICAgICBfcmVmID0gdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnM7CisgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHsKKyAgICAgICAgb3B0aW9uID0gX3JlZltfaV07CisgICAgICAgIGlmIChvcHRpb24uc2VsZWN0ZWQpIHsKKyAgICAgICAgICB0aGlzLnNlbGVjdGVkX29wdGlvbl9jb3VudCArPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQ7CisgICAgfTsKKworICAgIEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5jaG9pY2VzX2NsaWNrID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgICBldnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgIGlmICghKHRoaXMucmVzdWx0c19zaG93aW5nIHx8IHRoaXMuaXNfZGlzYWJsZWQpKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc3VsdHNfc2hvdygpOworICAgICAgfQorICAgIH07CisKKyAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUua2V5dXBfY2hlY2tlciA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgdmFyIHN0cm9rZSwgX3JlZjsKKworICAgICAgc3Ryb2tlID0gKF9yZWYgPSBldnQud2hpY2gpICE9IG51bGwgPyBfcmVmIDogZXZ0LmtleUNvZGU7CisgICAgICB0aGlzLnNlYXJjaF9maWVsZF9zY2FsZSgpOworICAgICAgc3dpdGNoIChzdHJva2UpIHsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgIGlmICh0aGlzLmlzX211bHRpcGxlICYmIHRoaXMuYmFja3N0cm9rZV9sZW5ndGggPCAxICYmIHRoaXMuY2hvaWNlc19jb3VudCgpID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMua2V5ZG93bl9iYWNrc3Ryb2tlKCk7CisgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5wZW5kaW5nX2JhY2tzdHJva2UpIHsKKyAgICAgICAgICAgIHRoaXMucmVzdWx0X2NsZWFyX2hpZ2hsaWdodCgpOworICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0c19zZWFyY2goKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgaWYgKHRoaXMucmVzdWx0c19zaG93aW5nKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRfc2VsZWN0KGV2dCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI3OgorICAgICAgICAgIGlmICh0aGlzLnJlc3VsdHNfc2hvd2luZykgeworICAgICAgICAgICAgdGhpcy5yZXN1bHRzX2hpZGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgY2FzZSAzODoKKyAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgY2FzZSA5MToKKyAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzX3NlYXJjaCgpOworICAgICAgfQorICAgIH07CisKKyAgICBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUuY29udGFpbmVyX3dpZHRoID0gZnVuY3Rpb24oKSB7CisgICAgICBpZiAodGhpcy5vcHRpb25zLndpZHRoICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53aWR0aDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiIiArIHRoaXMuZm9ybV9maWVsZC5vZmZzZXRXaWR0aCArICJweCI7CisgICAgICB9CisgICAgfTsKKworICAgIEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5pbmNsdWRlX29wdGlvbl9pbl9yZXN1bHRzID0gZnVuY3Rpb24ob3B0aW9uKSB7CisgICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSAmJiAoIXRoaXMuZGlzcGxheV9zZWxlY3RlZF9vcHRpb25zICYmIG9wdGlvbi5zZWxlY3RlZCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKCF0aGlzLmRpc3BsYXlfZGlzYWJsZWRfb3B0aW9ucyAmJiBvcHRpb24uZGlzYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKG9wdGlvbi5lbXB0eSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgQWJzdHJhY3RDaG9zZW4uYnJvd3Nlcl9pc19zdXBwb3J0ZWQgPSBmdW5jdGlvbigpIHsKKyAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLmFwcE5hbWUgPT09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiKSB7CisgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPj0gODsKKyAgICAgIH0KKyAgICAgIGlmICgvaVAob2R8aG9uZSkvaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoL0FuZHJvaWQvaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSkgeworICAgICAgICBpZiAoL01vYmlsZS9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgQWJzdHJhY3RDaG9zZW4uZGVmYXVsdF9tdWx0aXBsZV90ZXh0ID0gIlNlbGVjdCBTb21lIE9wdGlvbnMiOworCisgICAgQWJzdHJhY3RDaG9zZW4uZGVmYXVsdF9zaW5nbGVfdGV4dCA9ICJTZWxlY3QgYW4gT3B0aW9uIjsKKworICAgIEFic3RyYWN0Q2hvc2VuLmRlZmF1bHRfbm9fcmVzdWx0X3RleHQgPSAiTm8gcmVzdWx0cyBtYXRjaCI7CisKKyAgICByZXR1cm4gQWJzdHJhY3RDaG9zZW47CisKKyAgfSkoKTsKKworICAkID0galF1ZXJ5OworCisgICQuZm4uZXh0ZW5kKHsKKyAgICBjaG9zZW46IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICAgIGlmICghQWJzdHJhY3RDaG9zZW4uYnJvd3Nlcl9pc19zdXBwb3J0ZWQoKSkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaW5wdXRfZmllbGQpIHsKKyAgICAgICAgdmFyICR0aGlzLCBjaG9zZW47CisKKyAgICAgICAgJHRoaXMgPSAkKHRoaXMpOworICAgICAgICBjaG9zZW4gPSAkdGhpcy5kYXRhKCdjaG9zZW4nKTsKKyAgICAgICAgaWYgKG9wdGlvbnMgPT09ICdkZXN0cm95JyAmJiBjaG9zZW4pIHsKKyAgICAgICAgICBjaG9zZW4uZGVzdHJveSgpOworICAgICAgICB9IGVsc2UgaWYgKCFjaG9zZW4pIHsKKyAgICAgICAgICAkdGhpcy5kYXRhKCdjaG9zZW4nLCBuZXcgQ2hvc2VuKHRoaXMsIG9wdGlvbnMpKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorICB9KTsKKworICBDaG9zZW4gPSAoZnVuY3Rpb24oX3N1cGVyKSB7CisgICAgX19leHRlbmRzKENob3NlbiwgX3N1cGVyKTsKKworICAgIGZ1bmN0aW9uIENob3NlbigpIHsKKyAgICAgIF9yZWYgPSBDaG9zZW4uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICByZXR1cm4gX3JlZjsKKyAgICB9CisKKyAgICBDaG9zZW4ucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLmZvcm1fZmllbGRfanEgPSAkKHRoaXMuZm9ybV9maWVsZCk7CisgICAgICB0aGlzLmN1cnJlbnRfc2VsZWN0ZWRJbmRleCA9IHRoaXMuZm9ybV9maWVsZC5zZWxlY3RlZEluZGV4OworICAgICAgcmV0dXJuIHRoaXMuaXNfcnRsID0gdGhpcy5mb3JtX2ZpZWxkX2pxLmhhc0NsYXNzKCJjaG9zZW4tcnRsIik7CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUuc2V0X3VwX2h0bWwgPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBjb250YWluZXJfY2xhc3NlcywgY29udGFpbmVyX3Byb3BzOworCisgICAgICBjb250YWluZXJfY2xhc3NlcyA9IFsiY2hvc2VuLWNvbnRhaW5lciJdOworICAgICAgY29udGFpbmVyX2NsYXNzZXMucHVzaCgiY2hvc2VuLWNvbnRhaW5lci0iICsgKHRoaXMuaXNfbXVsdGlwbGUgPyAibXVsdGkiIDogInNpbmdsZSIpKTsKKyAgICAgIGlmICh0aGlzLmluaGVyaXRfc2VsZWN0X2NsYXNzZXMgJiYgdGhpcy5mb3JtX2ZpZWxkLmNsYXNzTmFtZSkgeworICAgICAgICBjb250YWluZXJfY2xhc3Nlcy5wdXNoKHRoaXMuZm9ybV9maWVsZC5jbGFzc05hbWUpOworICAgICAgfQorICAgICAgaWYgKHRoaXMuaXNfcnRsKSB7CisgICAgICAgIGNvbnRhaW5lcl9jbGFzc2VzLnB1c2goImNob3Nlbi1ydGwiKTsKKyAgICAgIH0KKyAgICAgIGNvbnRhaW5lcl9wcm9wcyA9IHsKKyAgICAgICAgJ2NsYXNzJzogY29udGFpbmVyX2NsYXNzZXMuam9pbignICcpLAorICAgICAgICAnc3R5bGUnOiAid2lkdGg6ICIgKyAodGhpcy5jb250YWluZXJfd2lkdGgoKSkgKyAiOyIsCisgICAgICAgICd0aXRsZSc6IHRoaXMuZm9ybV9maWVsZC50aXRsZQorICAgICAgfTsKKyAgICAgIGlmICh0aGlzLmZvcm1fZmllbGQuaWQubGVuZ3RoKSB7CisgICAgICAgIGNvbnRhaW5lcl9wcm9wcy5pZCA9IHRoaXMuZm9ybV9maWVsZC5pZC5yZXBsYWNlKC9bXlx3XS9nLCAnXycpICsgIl9jaG9zZW4iOworICAgICAgfQorICAgICAgdGhpcy5jb250YWluZXIgPSAkKCI8ZGl2IC8+IiwgY29udGFpbmVyX3Byb3BzKTsKKyAgICAgIGlmICh0aGlzLmlzX211bHRpcGxlKSB7CisgICAgICAgIHRoaXMuY29udGFpbmVyLmh0bWwoJzx1bCBjbGFzcz0iY2hvc2VuLWNob2ljZXMiPjxsaSBjbGFzcz0ic2VhcmNoLWZpZWxkIj48aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9IicgKyB0aGlzLmRlZmF1bHRfdGV4dCArICciIGNsYXNzPSJkZWZhdWx0IiBhdXRvY29tcGxldGU9Im9mZiIgc3R5bGU9IndpZHRoOjI1cHg7IiAvPjwvbGk+PC91bD48ZGl2IGNsYXNzPSJjaG9zZW4tZHJvcCI+PHVsIGNsYXNzPSJjaG9zZW4tcmVzdWx0cyI+PC91bD48L2Rpdj4nKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuY29udGFpbmVyLmh0bWwoJzxhIGNsYXNzPSJjaG9zZW4tc2luZ2xlIGNob3Nlbi1kZWZhdWx0IiB0YWJpbmRleD0iLTEiPjxzcGFuPicgKyB0aGlzLmRlZmF1bHRfdGV4dCArICc8L3NwYW4+PGRpdj48Yj48L2I+PC9kaXY+PC9hPjxkaXYgY2xhc3M9ImNob3Nlbi1kcm9wIj48ZGl2IGNsYXNzPSJjaG9zZW4tc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+PC9kaXY+PHVsIGNsYXNzPSJjaG9zZW4tcmVzdWx0cyI+PC91bD48L2Rpdj4nKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuZm9ybV9maWVsZF9qcS5oaWRlKCkuYWZ0ZXIodGhpcy5jb250YWluZXIpOworICAgICAgdGhpcy5kcm9wZG93biA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ2Rpdi5jaG9zZW4tZHJvcCcpLmZpcnN0KCk7CisgICAgICB0aGlzLnNlYXJjaF9maWVsZCA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ2lucHV0JykuZmlyc3QoKTsKKyAgICAgIHRoaXMuc2VhcmNoX3Jlc3VsdHMgPSB0aGlzLmNvbnRhaW5lci5maW5kKCd1bC5jaG9zZW4tcmVzdWx0cycpLmZpcnN0KCk7CisgICAgICB0aGlzLnNlYXJjaF9maWVsZF9zY2FsZSgpOworICAgICAgdGhpcy5zZWFyY2hfbm9fcmVzdWx0cyA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ2xpLm5vLXJlc3VsdHMnKS5maXJzdCgpOworICAgICAgaWYgKHRoaXMuaXNfbXVsdGlwbGUpIHsKKyAgICAgICAgdGhpcy5zZWFyY2hfY2hvaWNlcyA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ3VsLmNob3Nlbi1jaG9pY2VzJykuZmlyc3QoKTsKKyAgICAgICAgdGhpcy5zZWFyY2hfY29udGFpbmVyID0gdGhpcy5jb250YWluZXIuZmluZCgnbGkuc2VhcmNoLWZpZWxkJykuZmlyc3QoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMuc2VhcmNoX2NvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLmZpbmQoJ2Rpdi5jaG9zZW4tc2VhcmNoJykuZmlyc3QoKTsKKyAgICAgICAgdGhpcy5zZWxlY3RlZF9pdGVtID0gdGhpcy5jb250YWluZXIuZmluZCgnLmNob3Nlbi1zaW5nbGUnKS5maXJzdCgpOworICAgICAgfQorICAgICAgdGhpcy5yZXN1bHRzX2J1aWxkKCk7CisgICAgICB0aGlzLnNldF90YWJfaW5kZXgoKTsKKyAgICAgIHRoaXMuc2V0X2xhYmVsX2JlaGF2aW9yKCk7CisgICAgICByZXR1cm4gdGhpcy5mb3JtX2ZpZWxkX2pxLnRyaWdnZXIoImNob3NlbjpyZWFkeSIsIHsKKyAgICAgICAgY2hvc2VuOiB0aGlzCisgICAgICB9KTsKKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5yZWdpc3Rlcl9vYnNlcnZlcnMgPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisKKyAgICAgIHRoaXMuY29udGFpbmVyLmJpbmQoJ21vdXNlZG93bi5jaG9zZW4nLCBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgX3RoaXMuY29udGFpbmVyX21vdXNlZG93bihldnQpOworICAgICAgfSk7CisgICAgICB0aGlzLmNvbnRhaW5lci5iaW5kKCdtb3VzZXVwLmNob3NlbicsIGZ1bmN0aW9uKGV2dCkgeworICAgICAgICBfdGhpcy5jb250YWluZXJfbW91c2V1cChldnQpOworICAgICAgfSk7CisgICAgICB0aGlzLmNvbnRhaW5lci5iaW5kKCdtb3VzZWVudGVyLmNob3NlbicsIGZ1bmN0aW9uKGV2dCkgeworICAgICAgICBfdGhpcy5tb3VzZV9lbnRlcihldnQpOworICAgICAgfSk7CisgICAgICB0aGlzLmNvbnRhaW5lci5iaW5kKCdtb3VzZWxlYXZlLmNob3NlbicsIGZ1bmN0aW9uKGV2dCkgeworICAgICAgICBfdGhpcy5tb3VzZV9sZWF2ZShldnQpOworICAgICAgfSk7CisgICAgICB0aGlzLnNlYXJjaF9yZXN1bHRzLmJpbmQoJ21vdXNldXAuY2hvc2VuJywgZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgIF90aGlzLnNlYXJjaF9yZXN1bHRzX21vdXNldXAoZXZ0KTsKKyAgICAgIH0pOworICAgICAgdGhpcy5zZWFyY2hfcmVzdWx0cy5iaW5kKCdtb3VzZW92ZXIuY2hvc2VuJywgZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgIF90aGlzLnNlYXJjaF9yZXN1bHRzX21vdXNlb3ZlcihldnQpOworICAgICAgfSk7CisgICAgICB0aGlzLnNlYXJjaF9yZXN1bHRzLmJpbmQoJ21vdXNlb3V0LmNob3NlbicsIGZ1bmN0aW9uKGV2dCkgeworICAgICAgICBfdGhpcy5zZWFyY2hfcmVzdWx0c19tb3VzZW91dChldnQpOworICAgICAgfSk7CisgICAgICB0aGlzLnNlYXJjaF9yZXN1bHRzLmJpbmQoJ21vdXNld2hlZWwuY2hvc2VuIERPTU1vdXNlU2Nyb2xsLmNob3NlbicsIGZ1bmN0aW9uKGV2dCkgeworICAgICAgICBfdGhpcy5zZWFyY2hfcmVzdWx0c19tb3VzZXdoZWVsKGV2dCk7CisgICAgICB9KTsKKyAgICAgIHRoaXMuZm9ybV9maWVsZF9qcS5iaW5kKCJjaG9zZW46dXBkYXRlZC5jaG9zZW4iLCBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgX3RoaXMucmVzdWx0c191cGRhdGVfZmllbGQoZXZ0KTsKKyAgICAgIH0pOworICAgICAgdGhpcy5mb3JtX2ZpZWxkX2pxLmJpbmQoImNob3NlbjphY3RpdmF0ZS5jaG9zZW4iLCBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgX3RoaXMuYWN0aXZhdGVfZmllbGQoZXZ0KTsKKyAgICAgIH0pOworICAgICAgdGhpcy5mb3JtX2ZpZWxkX2pxLmJpbmQoImNob3NlbjpvcGVuLmNob3NlbiIsIGZ1bmN0aW9uKGV2dCkgeworICAgICAgICBfdGhpcy5jb250YWluZXJfbW91c2Vkb3duKGV2dCk7CisgICAgICB9KTsKKyAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkLmJpbmQoJ2JsdXIuY2hvc2VuJywgZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgIF90aGlzLmlucHV0X2JsdXIoZXZ0KTsKKyAgICAgIH0pOworICAgICAgdGhpcy5zZWFyY2hfZmllbGQuYmluZCgna2V5dXAuY2hvc2VuJywgZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgIF90aGlzLmtleXVwX2NoZWNrZXIoZXZ0KTsKKyAgICAgIH0pOworICAgICAgdGhpcy5zZWFyY2hfZmllbGQuYmluZCgna2V5ZG93bi5jaG9zZW4nLCBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgX3RoaXMua2V5ZG93bl9jaGVja2VyKGV2dCk7CisgICAgICB9KTsKKyAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkLmJpbmQoJ2ZvY3VzLmNob3NlbicsIGZ1bmN0aW9uKGV2dCkgeworICAgICAgICBfdGhpcy5pbnB1dF9mb2N1cyhldnQpOworICAgICAgfSk7CisgICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSkgeworICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hfY2hvaWNlcy5iaW5kKCdjbGljay5jaG9zZW4nLCBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgICBfdGhpcy5jaG9pY2VzX2NsaWNrKGV2dCk7CisgICAgICAgIH0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmJpbmQoJ2NsaWNrLmNob3NlbicsIGZ1bmN0aW9uKGV2dCkgeworICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7CisgICAgICAkKGRvY3VtZW50KS51bmJpbmQoImNsaWNrLmNob3NlbiIsIHRoaXMuY2xpY2tfdGVzdF9hY3Rpb24pOworICAgICAgaWYgKHRoaXMuc2VhcmNoX2ZpZWxkWzBdLnRhYkluZGV4KSB7CisgICAgICAgIHRoaXMuZm9ybV9maWVsZF9qcVswXS50YWJJbmRleCA9IHRoaXMuc2VhcmNoX2ZpZWxkWzBdLnRhYkluZGV4OworICAgICAgfQorICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7CisgICAgICB0aGlzLmZvcm1fZmllbGRfanEucmVtb3ZlRGF0YSgnY2hvc2VuJyk7CisgICAgICByZXR1cm4gdGhpcy5mb3JtX2ZpZWxkX2pxLnNob3coKTsKKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfZmllbGRfZGlzYWJsZWQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMuaXNfZGlzYWJsZWQgPSB0aGlzLmZvcm1fZmllbGRfanFbMF0uZGlzYWJsZWQ7CisgICAgICBpZiAodGhpcy5pc19kaXNhYmxlZCkgeworICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcygnY2hvc2VuLWRpc2FibGVkJyk7CisgICAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkWzBdLmRpc2FibGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCF0aGlzLmlzX211bHRpcGxlKSB7CisgICAgICAgICAgdGhpcy5zZWxlY3RlZF9pdGVtLnVuYmluZCgiZm9jdXMuY2hvc2VuIiwgdGhpcy5hY3RpdmF0ZV9hY3Rpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmNsb3NlX2ZpZWxkKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcygnY2hvc2VuLWRpc2FibGVkJyk7CisgICAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkWzBdLmRpc2FibGVkID0gZmFsc2U7CisgICAgICAgIGlmICghdGhpcy5pc19tdWx0aXBsZSkgeworICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkX2l0ZW0uYmluZCgiZm9jdXMuY2hvc2VuIiwgdGhpcy5hY3RpdmF0ZV9hY3Rpb24pOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUuY29udGFpbmVyX21vdXNlZG93biA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgaWYgKCF0aGlzLmlzX2Rpc2FibGVkKSB7CisgICAgICAgIGlmIChldnQgJiYgZXZ0LnR5cGUgPT09ICJtb3VzZWRvd24iICYmICF0aGlzLnJlc3VsdHNfc2hvd2luZykgeworICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICB9CisgICAgICAgIGlmICghKChldnQgIT0gbnVsbCkgJiYgKCQoZXZ0LnRhcmdldCkpLmhhc0NsYXNzKCJzZWFyY2gtY2hvaWNlLWNsb3NlIikpKSB7CisgICAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZV9maWVsZCkgeworICAgICAgICAgICAgaWYgKHRoaXMuaXNfbXVsdGlwbGUpIHsKKyAgICAgICAgICAgICAgdGhpcy5zZWFyY2hfZmllbGQudmFsKCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICQoZG9jdW1lbnQpLmJpbmQoJ2NsaWNrLmNob3NlbicsIHRoaXMuY2xpY2tfdGVzdF9hY3Rpb24pOworICAgICAgICAgICAgdGhpcy5yZXN1bHRzX3Nob3coKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzX211bHRpcGxlICYmIGV2dCAmJiAoKCQoZXZ0LnRhcmdldClbMF0gPT09IHRoaXMuc2VsZWN0ZWRfaXRlbVswXSkgfHwgJChldnQudGFyZ2V0KS5wYXJlbnRzKCJhLmNob3Nlbi1zaW5nbGUiKS5sZW5ndGgpKSB7CisgICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgICAgIHRoaXMucmVzdWx0c190b2dnbGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVfZmllbGQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgICBDaG9zZW4ucHJvdG90eXBlLmNvbnRhaW5lcl9tb3VzZXVwID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgICBpZiAoZXZ0LnRhcmdldC5ub2RlTmFtZSA9PT0gIkFCQlIiICYmICF0aGlzLmlzX2Rpc2FibGVkKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc3VsdHNfcmVzZXQoZXZ0KTsKKyAgICAgIH0KKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfcmVzdWx0c19tb3VzZXdoZWVsID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgICB2YXIgZGVsdGEsIF9yZWYxLCBfcmVmMjsKKworICAgICAgZGVsdGEgPSAtKChfcmVmMSA9IGV2dC5vcmlnaW5hbEV2ZW50KSAhPSBudWxsID8gX3JlZjEud2hlZWxEZWx0YSA6IHZvaWQgMCkgfHwgKChfcmVmMiA9IGV2dC5vcmlnaW5pYWxFdmVudCkgIT0gbnVsbCA/IF9yZWYyLmRldGFpbCA6IHZvaWQgMCk7CisgICAgICBpZiAoZGVsdGEgIT0gbnVsbCkgeworICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgaWYgKGV2dC50eXBlID09PSAnRE9NTW91c2VTY3JvbGwnKSB7CisgICAgICAgICAgZGVsdGEgPSBkZWx0YSAqIDQwOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnNlYXJjaF9yZXN1bHRzLnNjcm9sbFRvcChkZWx0YSArIHRoaXMuc2VhcmNoX3Jlc3VsdHMuc2Nyb2xsVG9wKCkpOworICAgICAgfQorICAgIH07CisKKyAgICBDaG9zZW4ucHJvdG90eXBlLmJsdXJfdGVzdCA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgaWYgKCF0aGlzLmFjdGl2ZV9maWVsZCAmJiB0aGlzLmNvbnRhaW5lci5oYXNDbGFzcygiY2hvc2VuLWNvbnRhaW5lci1hY3RpdmUiKSkgeworICAgICAgICByZXR1cm4gdGhpcy5jbG9zZV9maWVsZCgpOworICAgICAgfQorICAgIH07CisKKyAgICBDaG9zZW4ucHJvdG90eXBlLmNsb3NlX2ZpZWxkID0gZnVuY3Rpb24oKSB7CisgICAgICAkKGRvY3VtZW50KS51bmJpbmQoImNsaWNrLmNob3NlbiIsIHRoaXMuY2xpY2tfdGVzdF9hY3Rpb24pOworICAgICAgdGhpcy5hY3RpdmVfZmllbGQgPSBmYWxzZTsKKyAgICAgIHRoaXMucmVzdWx0c19oaWRlKCk7CisgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcygiY2hvc2VuLWNvbnRhaW5lci1hY3RpdmUiKTsKKyAgICAgIHRoaXMuY2xlYXJfYmFja3N0cm9rZSgpOworICAgICAgdGhpcy5zaG93X3NlYXJjaF9maWVsZF9kZWZhdWx0KCk7CisgICAgICByZXR1cm4gdGhpcy5zZWFyY2hfZmllbGRfc2NhbGUoKTsKKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5hY3RpdmF0ZV9maWVsZCA9IGZ1bmN0aW9uKCkgeworICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoImNob3Nlbi1jb250YWluZXItYWN0aXZlIik7CisgICAgICB0aGlzLmFjdGl2ZV9maWVsZCA9IHRydWU7CisgICAgICB0aGlzLnNlYXJjaF9maWVsZC52YWwodGhpcy5zZWFyY2hfZmllbGQudmFsKCkpOworICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoX2ZpZWxkLmZvY3VzKCk7CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUudGVzdF9hY3RpdmVfY2xpY2sgPSBmdW5jdGlvbihldnQpIHsKKyAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5pcygkKGV2dC50YXJnZXQpLmNsb3Nlc3QoJy5jaG9zZW4tY29udGFpbmVyJykpKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZV9maWVsZCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdGhpcy5jbG9zZV9maWVsZCgpOworICAgICAgfQorICAgIH07CisKKyAgICBDaG9zZW4ucHJvdG90eXBlLnJlc3VsdHNfYnVpbGQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMucGFyc2luZyA9IHRydWU7CisgICAgICB0aGlzLnNlbGVjdGVkX29wdGlvbl9jb3VudCA9IG51bGw7CisgICAgICB0aGlzLnJlc3VsdHNfZGF0YSA9IFNlbGVjdFBhcnNlci5zZWxlY3RfdG9fYXJyYXkodGhpcy5mb3JtX2ZpZWxkKTsKKyAgICAgIGlmICh0aGlzLmlzX211bHRpcGxlKSB7CisgICAgICAgIHRoaXMuc2VhcmNoX2Nob2ljZXMuZmluZCgibGkuc2VhcmNoLWNob2ljZSIpLnJlbW92ZSgpOworICAgICAgfSBlbHNlIGlmICghdGhpcy5pc19tdWx0aXBsZSkgeworICAgICAgICB0aGlzLnNpbmdsZV9zZXRfc2VsZWN0ZWRfdGV4dCgpOworICAgICAgICBpZiAodGhpcy5kaXNhYmxlX3NlYXJjaCB8fCB0aGlzLmZvcm1fZmllbGQub3B0aW9ucy5sZW5ndGggPD0gdGhpcy5kaXNhYmxlX3NlYXJjaF90aHJlc2hvbGQpIHsKKyAgICAgICAgICB0aGlzLnNlYXJjaF9maWVsZFswXS5yZWFkT25seSA9IHRydWU7CisgICAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoImNob3Nlbi1jb250YWluZXItc2luZ2xlLW5vc2VhcmNoIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5zZWFyY2hfZmllbGRbMF0ucmVhZE9ubHkgPSBmYWxzZTsKKyAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcygiY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUtbm9zZWFyY2giKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdGhpcy51cGRhdGVfcmVzdWx0c19jb250ZW50KHRoaXMucmVzdWx0c19vcHRpb25fYnVpbGQoeworICAgICAgICBmaXJzdDogdHJ1ZQorICAgICAgfSkpOworICAgICAgdGhpcy5zZWFyY2hfZmllbGRfZGlzYWJsZWQoKTsKKyAgICAgIHRoaXMuc2hvd19zZWFyY2hfZmllbGRfZGVmYXVsdCgpOworICAgICAgdGhpcy5zZWFyY2hfZmllbGRfc2NhbGUoKTsKKyAgICAgIHJldHVybiB0aGlzLnBhcnNpbmcgPSBmYWxzZTsKKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5yZXN1bHRfZG9faGlnaGxpZ2h0ID0gZnVuY3Rpb24oZWwpIHsKKyAgICAgIHZhciBoaWdoX2JvdHRvbSwgaGlnaF90b3AsIG1heEhlaWdodCwgdmlzaWJsZV9ib3R0b20sIHZpc2libGVfdG9wOworCisgICAgICBpZiAoZWwubGVuZ3RoKSB7CisgICAgICAgIHRoaXMucmVzdWx0X2NsZWFyX2hpZ2hsaWdodCgpOworICAgICAgICB0aGlzLnJlc3VsdF9oaWdobGlnaHQgPSBlbDsKKyAgICAgICAgdGhpcy5yZXN1bHRfaGlnaGxpZ2h0LmFkZENsYXNzKCJoaWdobGlnaHRlZCIpOworICAgICAgICBtYXhIZWlnaHQgPSBwYXJzZUludCh0aGlzLnNlYXJjaF9yZXN1bHRzLmNzcygibWF4SGVpZ2h0IiksIDEwKTsKKyAgICAgICAgdmlzaWJsZV90b3AgPSB0aGlzLnNlYXJjaF9yZXN1bHRzLnNjcm9sbFRvcCgpOworICAgICAgICB2aXNpYmxlX2JvdHRvbSA9IG1heEhlaWdodCArIHZpc2libGVfdG9wOworICAgICAgICBoaWdoX3RvcCA9IHRoaXMucmVzdWx0X2hpZ2hsaWdodC5wb3NpdGlvbigpLnRvcCArIHRoaXMuc2VhcmNoX3Jlc3VsdHMuc2Nyb2xsVG9wKCk7CisgICAgICAgIGhpZ2hfYm90dG9tID0gaGlnaF90b3AgKyB0aGlzLnJlc3VsdF9oaWdobGlnaHQub3V0ZXJIZWlnaHQoKTsKKyAgICAgICAgaWYgKGhpZ2hfYm90dG9tID49IHZpc2libGVfYm90dG9tKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoX3Jlc3VsdHMuc2Nyb2xsVG9wKChoaWdoX2JvdHRvbSAtIG1heEhlaWdodCkgPiAwID8gaGlnaF9ib3R0b20gLSBtYXhIZWlnaHQgOiAwKTsKKyAgICAgICAgfSBlbHNlIGlmIChoaWdoX3RvcCA8IHZpc2libGVfdG9wKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoX3Jlc3VsdHMuc2Nyb2xsVG9wKGhpZ2hfdG9wKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgICBDaG9zZW4ucHJvdG90eXBlLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQgPSBmdW5jdGlvbigpIHsKKyAgICAgIGlmICh0aGlzLnJlc3VsdF9oaWdobGlnaHQpIHsKKyAgICAgICAgdGhpcy5yZXN1bHRfaGlnaGxpZ2h0LnJlbW92ZUNsYXNzKCJoaWdobGlnaHRlZCIpOworICAgICAgfQorICAgICAgcmV0dXJuIHRoaXMucmVzdWx0X2hpZ2hsaWdodCA9IG51bGw7CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUucmVzdWx0c19zaG93ID0gZnVuY3Rpb24oKSB7CisgICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSAmJiB0aGlzLm1heF9zZWxlY3RlZF9vcHRpb25zIDw9IHRoaXMuY2hvaWNlc19jb3VudCgpKSB7CisgICAgICAgIHRoaXMuZm9ybV9maWVsZF9qcS50cmlnZ2VyKCJjaG9zZW46bWF4c2VsZWN0ZWQiLCB7CisgICAgICAgICAgY2hvc2VuOiB0aGlzCisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDbGFzcygiY2hvc2VuLXdpdGgtZHJvcCIpOworICAgICAgdGhpcy5mb3JtX2ZpZWxkX2pxLnRyaWdnZXIoImNob3NlbjpzaG93aW5nX2Ryb3Bkb3duIiwgeworICAgICAgICBjaG9zZW46IHRoaXMKKyAgICAgIH0pOworICAgICAgdGhpcy5yZXN1bHRzX3Nob3dpbmcgPSB0cnVlOworICAgICAgdGhpcy5zZWFyY2hfZmllbGQuZm9jdXMoKTsKKyAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCh0aGlzLnNlYXJjaF9maWVsZC52YWwoKSk7CisgICAgICByZXR1cm4gdGhpcy53aW5ub3dfcmVzdWx0cygpOworICAgIH07CisKKyAgICBDaG9zZW4ucHJvdG90eXBlLnVwZGF0ZV9yZXN1bHRzX2NvbnRlbnQgPSBmdW5jdGlvbihjb250ZW50KSB7CisgICAgICByZXR1cm4gdGhpcy5zZWFyY2hfcmVzdWx0cy5odG1sKGNvbnRlbnQpOworICAgIH07CisKKyAgICBDaG9zZW4ucHJvdG90eXBlLnJlc3VsdHNfaGlkZSA9IGZ1bmN0aW9uKCkgeworICAgICAgaWYgKHRoaXMucmVzdWx0c19zaG93aW5nKSB7CisgICAgICAgIHRoaXMucmVzdWx0X2NsZWFyX2hpZ2hsaWdodCgpOworICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcygiY2hvc2VuLXdpdGgtZHJvcCIpOworICAgICAgICB0aGlzLmZvcm1fZmllbGRfanEudHJpZ2dlcigiY2hvc2VuOmhpZGluZ19kcm9wZG93biIsIHsKKyAgICAgICAgICBjaG9zZW46IHRoaXMKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzX3Nob3dpbmcgPSBmYWxzZTsKKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5zZXRfdGFiX2luZGV4ID0gZnVuY3Rpb24oZWwpIHsKKyAgICAgIHZhciB0aTsKKworICAgICAgaWYgKHRoaXMuZm9ybV9maWVsZC50YWJJbmRleCkgeworICAgICAgICB0aSA9IHRoaXMuZm9ybV9maWVsZC50YWJJbmRleDsKKyAgICAgICAgdGhpcy5mb3JtX2ZpZWxkLnRhYkluZGV4ID0gLTE7CisgICAgICAgIHJldHVybiB0aGlzLnNlYXJjaF9maWVsZFswXS50YWJJbmRleCA9IHRpOworICAgICAgfQorICAgIH07CisKKyAgICBDaG9zZW4ucHJvdG90eXBlLnNldF9sYWJlbF9iZWhhdmlvciA9IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIF90aGlzID0gdGhpczsKKworICAgICAgdGhpcy5mb3JtX2ZpZWxkX2xhYmVsID0gdGhpcy5mb3JtX2ZpZWxkX2pxLnBhcmVudHMoImxhYmVsIik7CisgICAgICBpZiAoIXRoaXMuZm9ybV9maWVsZF9sYWJlbC5sZW5ndGggJiYgdGhpcy5mb3JtX2ZpZWxkLmlkLmxlbmd0aCkgeworICAgICAgICB0aGlzLmZvcm1fZmllbGRfbGFiZWwgPSAkKCJsYWJlbFtmb3I9JyIgKyB0aGlzLmZvcm1fZmllbGQuaWQgKyAiJ10iKTsKKyAgICAgIH0KKyAgICAgIGlmICh0aGlzLmZvcm1fZmllbGRfbGFiZWwubGVuZ3RoID4gMCkgeworICAgICAgICByZXR1cm4gdGhpcy5mb3JtX2ZpZWxkX2xhYmVsLmJpbmQoJ2NsaWNrLmNob3NlbicsIGZ1bmN0aW9uKGV2dCkgeworICAgICAgICAgIGlmIChfdGhpcy5pc19tdWx0aXBsZSkgeworICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNvbnRhaW5lcl9tb3VzZWRvd24oZXZ0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIF90aGlzLmFjdGl2YXRlX2ZpZWxkKCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5zaG93X3NlYXJjaF9maWVsZF9kZWZhdWx0ID0gZnVuY3Rpb24oKSB7CisgICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSAmJiB0aGlzLmNob2ljZXNfY291bnQoKSA8IDEgJiYgIXRoaXMuYWN0aXZlX2ZpZWxkKSB7CisgICAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCh0aGlzLmRlZmF1bHRfdGV4dCk7CisgICAgICAgIHJldHVybiB0aGlzLnNlYXJjaF9maWVsZC5hZGRDbGFzcygiZGVmYXVsdCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5zZWFyY2hfZmllbGQudmFsKCIiKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoX2ZpZWxkLnJlbW92ZUNsYXNzKCJkZWZhdWx0Iik7CisgICAgICB9CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUuc2VhcmNoX3Jlc3VsdHNfbW91c2V1cCA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgdmFyIHRhcmdldDsKKworICAgICAgdGFyZ2V0ID0gJChldnQudGFyZ2V0KS5oYXNDbGFzcygiYWN0aXZlLXJlc3VsdCIpID8gJChldnQudGFyZ2V0KSA6ICQoZXZ0LnRhcmdldCkucGFyZW50cygiLmFjdGl2ZS1yZXN1bHQiKS5maXJzdCgpOworICAgICAgaWYgKHRhcmdldC5sZW5ndGgpIHsKKyAgICAgICAgdGhpcy5yZXN1bHRfaGlnaGxpZ2h0ID0gdGFyZ2V0OworICAgICAgICB0aGlzLnJlc3VsdF9zZWxlY3QoZXZ0KTsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoX2ZpZWxkLmZvY3VzKCk7CisgICAgICB9CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUuc2VhcmNoX3Jlc3VsdHNfbW91c2VvdmVyID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgICB2YXIgdGFyZ2V0OworCisgICAgICB0YXJnZXQgPSAkKGV2dC50YXJnZXQpLmhhc0NsYXNzKCJhY3RpdmUtcmVzdWx0IikgPyAkKGV2dC50YXJnZXQpIDogJChldnQudGFyZ2V0KS5wYXJlbnRzKCIuYWN0aXZlLXJlc3VsdCIpLmZpcnN0KCk7CisgICAgICBpZiAodGFyZ2V0KSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc3VsdF9kb19oaWdobGlnaHQodGFyZ2V0KTsKKyAgICAgIH0KKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfcmVzdWx0c19tb3VzZW91dCA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgaWYgKCQoZXZ0LnRhcmdldCkuaGFzQ2xhc3MoImFjdGl2ZS1yZXN1bHQiIHx8ICQoZXZ0LnRhcmdldCkucGFyZW50cygnLmFjdGl2ZS1yZXN1bHQnKS5maXJzdCgpKSkgeworICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0KCk7CisgICAgICB9CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUuY2hvaWNlX2J1aWxkID0gZnVuY3Rpb24oaXRlbSkgeworICAgICAgdmFyIGNob2ljZSwgY2xvc2VfbGluaywKKyAgICAgICAgX3RoaXMgPSB0aGlzOworCisgICAgICBjaG9pY2UgPSAkKCc8bGkgLz4nLCB7CisgICAgICAgICJjbGFzcyI6ICJzZWFyY2gtY2hvaWNlIgorICAgICAgfSkuaHRtbCgiPHNwYW4+IiArIGl0ZW0uaHRtbCArICI8L3NwYW4+Iik7CisgICAgICBpZiAoaXRlbS5kaXNhYmxlZCkgeworICAgICAgICBjaG9pY2UuYWRkQ2xhc3MoJ3NlYXJjaC1jaG9pY2UtZGlzYWJsZWQnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNsb3NlX2xpbmsgPSAkKCc8YSAvPicsIHsKKyAgICAgICAgICAiY2xhc3MiOiAnc2VhcmNoLWNob2ljZS1jbG9zZScsCisgICAgICAgICAgJ2RhdGEtb3B0aW9uLWFycmF5LWluZGV4JzogaXRlbS5hcnJheV9pbmRleAorICAgICAgICB9KTsKKyAgICAgICAgY2xvc2VfbGluay5iaW5kKCdjbGljay5jaG9zZW4nLCBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgICByZXR1cm4gX3RoaXMuY2hvaWNlX2Rlc3Ryb3lfbGlua19jbGljayhldnQpOworICAgICAgICB9KTsKKyAgICAgICAgY2hvaWNlLmFwcGVuZChjbG9zZV9saW5rKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzLnNlYXJjaF9jb250YWluZXIuYmVmb3JlKGNob2ljZSk7CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUuY2hvaWNlX2Rlc3Ryb3lfbGlua19jbGljayA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7CisgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7CisgICAgICBpZiAoIXRoaXMuaXNfZGlzYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2hvaWNlX2Rlc3Ryb3koJChldnQudGFyZ2V0KSk7CisgICAgICB9CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUuY2hvaWNlX2Rlc3Ryb3kgPSBmdW5jdGlvbihsaW5rKSB7CisgICAgICBpZiAodGhpcy5yZXN1bHRfZGVzZWxlY3QobGlua1swXS5nZXRBdHRyaWJ1dGUoImRhdGEtb3B0aW9uLWFycmF5LWluZGV4IikpKSB7CisgICAgICAgIHRoaXMuc2hvd19zZWFyY2hfZmllbGRfZGVmYXVsdCgpOworICAgICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSAmJiB0aGlzLmNob2ljZXNfY291bnQoKSA+IDAgJiYgdGhpcy5zZWFyY2hfZmllbGQudmFsKCkubGVuZ3RoIDwgMSkgeworICAgICAgICAgIHRoaXMucmVzdWx0c19oaWRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbGluay5wYXJlbnRzKCdsaScpLmZpcnN0KCkucmVtb3ZlKCk7CisgICAgICAgIHJldHVybiB0aGlzLnNlYXJjaF9maWVsZF9zY2FsZSgpOworICAgICAgfQorICAgIH07CisKKyAgICBDaG9zZW4ucHJvdG90eXBlLnJlc3VsdHNfcmVzZXQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMuZm9ybV9maWVsZC5vcHRpb25zWzBdLnNlbGVjdGVkID0gdHJ1ZTsKKyAgICAgIHRoaXMuc2VsZWN0ZWRfb3B0aW9uX2NvdW50ID0gbnVsbDsKKyAgICAgIHRoaXMuc2luZ2xlX3NldF9zZWxlY3RlZF90ZXh0KCk7CisgICAgICB0aGlzLnNob3dfc2VhcmNoX2ZpZWxkX2RlZmF1bHQoKTsKKyAgICAgIHRoaXMucmVzdWx0c19yZXNldF9jbGVhbnVwKCk7CisgICAgICB0aGlzLmZvcm1fZmllbGRfanEudHJpZ2dlcigiY2hhbmdlIik7CisgICAgICBpZiAodGhpcy5hY3RpdmVfZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0c19oaWRlKCk7CisgICAgICB9CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUucmVzdWx0c19yZXNldF9jbGVhbnVwID0gZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLmN1cnJlbnRfc2VsZWN0ZWRJbmRleCA9IHRoaXMuZm9ybV9maWVsZC5zZWxlY3RlZEluZGV4OworICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRfaXRlbS5maW5kKCJhYmJyIikucmVtb3ZlKCk7CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUucmVzdWx0X3NlbGVjdCA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgdmFyIGhpZ2gsIGl0ZW0sIHNlbGVjdGVkX2luZGV4OworCisgICAgICBpZiAodGhpcy5yZXN1bHRfaGlnaGxpZ2h0KSB7CisgICAgICAgIGhpZ2ggPSB0aGlzLnJlc3VsdF9oaWdobGlnaHQ7CisgICAgICAgIHRoaXMucmVzdWx0X2NsZWFyX2hpZ2hsaWdodCgpOworICAgICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSAmJiB0aGlzLm1heF9zZWxlY3RlZF9vcHRpb25zIDw9IHRoaXMuY2hvaWNlc19jb3VudCgpKSB7CisgICAgICAgICAgdGhpcy5mb3JtX2ZpZWxkX2pxLnRyaWdnZXIoImNob3NlbjptYXhzZWxlY3RlZCIsIHsKKyAgICAgICAgICAgIGNob3NlbjogdGhpcworICAgICAgICAgIH0pOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSkgeworICAgICAgICAgIGhpZ2gucmVtb3ZlQ2xhc3MoImFjdGl2ZS1yZXN1bHQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAodGhpcy5yZXN1bHRfc2luZ2xlX3NlbGVjdGVkKSB7CisgICAgICAgICAgICB0aGlzLnJlc3VsdF9zaW5nbGVfc2VsZWN0ZWQucmVtb3ZlQ2xhc3MoInJlc3VsdC1zZWxlY3RlZCIpOworICAgICAgICAgICAgc2VsZWN0ZWRfaW5kZXggPSB0aGlzLnJlc3VsdF9zaW5nbGVfc2VsZWN0ZWRbMF0uZ2V0QXR0cmlidXRlKCdkYXRhLW9wdGlvbi1hcnJheS1pbmRleCcpOworICAgICAgICAgICAgdGhpcy5yZXN1bHRzX2RhdGFbc2VsZWN0ZWRfaW5kZXhdLnNlbGVjdGVkID0gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICAgIHRoaXMucmVzdWx0X3NpbmdsZV9zZWxlY3RlZCA9IGhpZ2g7CisgICAgICAgIH0KKyAgICAgICAgaGlnaC5hZGRDbGFzcygicmVzdWx0LXNlbGVjdGVkIik7CisgICAgICAgIGl0ZW0gPSB0aGlzLnJlc3VsdHNfZGF0YVtoaWdoWzBdLmdldEF0dHJpYnV0ZSgiZGF0YS1vcHRpb24tYXJyYXktaW5kZXgiKV07CisgICAgICAgIGl0ZW0uc2VsZWN0ZWQgPSB0cnVlOworICAgICAgICB0aGlzLmZvcm1fZmllbGQub3B0aW9uc1tpdGVtLm9wdGlvbnNfaW5kZXhdLnNlbGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQgPSBudWxsOworICAgICAgICBpZiAodGhpcy5pc19tdWx0aXBsZSkgeworICAgICAgICAgIHRoaXMuY2hvaWNlX2J1aWxkKGl0ZW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMuc2luZ2xlX3NldF9zZWxlY3RlZF90ZXh0KGl0ZW0udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoKGV2dC5tZXRhS2V5IHx8IGV2dC5jdHJsS2V5KSAmJiB0aGlzLmlzX211bHRpcGxlKSkgeworICAgICAgICAgIHRoaXMucmVzdWx0c19oaWRlKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zZWFyY2hfZmllbGQudmFsKCIiKTsKKyAgICAgICAgaWYgKHRoaXMuaXNfbXVsdGlwbGUgfHwgdGhpcy5mb3JtX2ZpZWxkLnNlbGVjdGVkSW5kZXggIT09IHRoaXMuY3VycmVudF9zZWxlY3RlZEluZGV4KSB7CisgICAgICAgICAgdGhpcy5mb3JtX2ZpZWxkX2pxLnRyaWdnZXIoImNoYW5nZSIsIHsKKyAgICAgICAgICAgICdzZWxlY3RlZCc6IHRoaXMuZm9ybV9maWVsZC5vcHRpb25zW2l0ZW0ub3B0aW9uc19pbmRleF0udmFsdWUKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmN1cnJlbnRfc2VsZWN0ZWRJbmRleCA9IHRoaXMuZm9ybV9maWVsZC5zZWxlY3RlZEluZGV4OworICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hfZmllbGRfc2NhbGUoKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5zaW5nbGVfc2V0X3NlbGVjdGVkX3RleHQgPSBmdW5jdGlvbih0ZXh0KSB7CisgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgIHRleHQgPSB0aGlzLmRlZmF1bHRfdGV4dDsKKyAgICAgIH0KKyAgICAgIGlmICh0ZXh0ID09PSB0aGlzLmRlZmF1bHRfdGV4dCkgeworICAgICAgICB0aGlzLnNlbGVjdGVkX2l0ZW0uYWRkQ2xhc3MoImNob3Nlbi1kZWZhdWx0Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLnNpbmdsZV9kZXNlbGVjdF9jb250cm9sX2J1aWxkKCk7CisgICAgICAgIHRoaXMuc2VsZWN0ZWRfaXRlbS5yZW1vdmVDbGFzcygiY2hvc2VuLWRlZmF1bHQiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkX2l0ZW0uZmluZCgic3BhbiIpLnRleHQodGV4dCk7CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUucmVzdWx0X2Rlc2VsZWN0ID0gZnVuY3Rpb24ocG9zKSB7CisgICAgICB2YXIgcmVzdWx0X2RhdGE7CisKKyAgICAgIHJlc3VsdF9kYXRhID0gdGhpcy5yZXN1bHRzX2RhdGFbcG9zXTsKKyAgICAgIGlmICghdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbcmVzdWx0X2RhdGEub3B0aW9uc19pbmRleF0uZGlzYWJsZWQpIHsKKyAgICAgICAgcmVzdWx0X2RhdGEuc2VsZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbcmVzdWx0X2RhdGEub3B0aW9uc19pbmRleF0uc2VsZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQgPSBudWxsOworICAgICAgICB0aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKTsKKyAgICAgICAgaWYgKHRoaXMucmVzdWx0c19zaG93aW5nKSB7CisgICAgICAgICAgdGhpcy53aW5ub3dfcmVzdWx0cygpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZm9ybV9maWVsZF9qcS50cmlnZ2VyKCJjaGFuZ2UiLCB7CisgICAgICAgICAgZGVzZWxlY3RlZDogdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbcmVzdWx0X2RhdGEub3B0aW9uc19pbmRleF0udmFsdWUKKyAgICAgICAgfSk7CisgICAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkX3NjYWxlKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH07CisKKyAgICBDaG9zZW4ucHJvdG90eXBlLnNpbmdsZV9kZXNlbGVjdF9jb250cm9sX2J1aWxkID0gZnVuY3Rpb24oKSB7CisgICAgICBpZiAoIXRoaXMuYWxsb3dfc2luZ2xlX2Rlc2VsZWN0KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmICghdGhpcy5zZWxlY3RlZF9pdGVtLmZpbmQoImFiYnIiKS5sZW5ndGgpIHsKKyAgICAgICAgdGhpcy5zZWxlY3RlZF9pdGVtLmZpbmQoInNwYW4iKS5maXJzdCgpLmFmdGVyKCI8YWJiciBjbGFzcz1cInNlYXJjaC1jaG9pY2UtY2xvc2VcIj48L2FiYnI+Iik7CisgICAgICB9CisgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZF9pdGVtLmFkZENsYXNzKCJjaG9zZW4tc2luZ2xlLXdpdGgtZGVzZWxlY3QiKTsKKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5nZXRfc2VhcmNoX3RleHQgPSBmdW5jdGlvbigpIHsKKyAgICAgIGlmICh0aGlzLnNlYXJjaF9maWVsZC52YWwoKSA9PT0gdGhpcy5kZWZhdWx0X3RleHQpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICQoJzxkaXYvPicpLnRleHQoJC50cmltKHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgpKSkuaHRtbCgpOworICAgICAgfQorICAgIH07CisKKyAgICBDaG9zZW4ucHJvdG90eXBlLndpbm5vd19yZXN1bHRzX3NldF9oaWdobGlnaHQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBkb19oaWdoLCBzZWxlY3RlZF9yZXN1bHRzOworCisgICAgICBzZWxlY3RlZF9yZXN1bHRzID0gIXRoaXMuaXNfbXVsdGlwbGUgPyB0aGlzLnNlYXJjaF9yZXN1bHRzLmZpbmQoIi5yZXN1bHQtc2VsZWN0ZWQuYWN0aXZlLXJlc3VsdCIpIDogW107CisgICAgICBkb19oaWdoID0gc2VsZWN0ZWRfcmVzdWx0cy5sZW5ndGggPyBzZWxlY3RlZF9yZXN1bHRzLmZpcnN0KCkgOiB0aGlzLnNlYXJjaF9yZXN1bHRzLmZpbmQoIi5hY3RpdmUtcmVzdWx0IikuZmlyc3QoKTsKKyAgICAgIGlmIChkb19oaWdoICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0X2RvX2hpZ2hsaWdodChkb19oaWdoKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5ub19yZXN1bHRzID0gZnVuY3Rpb24odGVybXMpIHsKKyAgICAgIHZhciBub19yZXN1bHRzX2h0bWw7CisKKyAgICAgIG5vX3Jlc3VsdHNfaHRtbCA9ICQoJzxsaSBjbGFzcz0ibm8tcmVzdWx0cyI+JyArIHRoaXMucmVzdWx0c19ub25lX2ZvdW5kICsgJyAiPHNwYW4+PC9zcGFuPiI8L2xpPicpOworICAgICAgbm9fcmVzdWx0c19odG1sLmZpbmQoInNwYW4iKS5maXJzdCgpLmh0bWwodGVybXMpOworICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoX3Jlc3VsdHMuYXBwZW5kKG5vX3Jlc3VsdHNfaHRtbCk7CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUubm9fcmVzdWx0c19jbGVhciA9IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoX3Jlc3VsdHMuZmluZCgiLm5vLXJlc3VsdHMiKS5yZW1vdmUoKTsKKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5rZXlkb3duX2Fycm93ID0gZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbmV4dF9zaWI7CisKKyAgICAgIGlmICh0aGlzLnJlc3VsdHNfc2hvd2luZyAmJiB0aGlzLnJlc3VsdF9oaWdobGlnaHQpIHsKKyAgICAgICAgbmV4dF9zaWIgPSB0aGlzLnJlc3VsdF9oaWdobGlnaHQubmV4dEFsbCgibGkuYWN0aXZlLXJlc3VsdCIpLmZpcnN0KCk7CisgICAgICAgIGlmIChuZXh0X3NpYikgeworICAgICAgICAgIHJldHVybiB0aGlzLnJlc3VsdF9kb19oaWdobGlnaHQobmV4dF9zaWIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzX3Nob3coKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5rZXl1cF9hcnJvdyA9IGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHByZXZfc2liczsKKworICAgICAgaWYgKCF0aGlzLnJlc3VsdHNfc2hvd2luZyAmJiAhdGhpcy5pc19tdWx0aXBsZSkgeworICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzX3Nob3coKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXN1bHRfaGlnaGxpZ2h0KSB7CisgICAgICAgIHByZXZfc2licyA9IHRoaXMucmVzdWx0X2hpZ2hsaWdodC5wcmV2QWxsKCJsaS5hY3RpdmUtcmVzdWx0Iik7CisgICAgICAgIGlmIChwcmV2X3NpYnMubGVuZ3RoKSB7CisgICAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0X2RvX2hpZ2hsaWdodChwcmV2X3NpYnMuZmlyc3QoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHRoaXMuY2hvaWNlc19jb3VudCgpID4gMCkgeworICAgICAgICAgICAgdGhpcy5yZXN1bHRzX2hpZGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0X2NsZWFyX2hpZ2hsaWdodCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUua2V5ZG93bl9iYWNrc3Ryb2tlID0gZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbmV4dF9hdmFpbGFibGVfZGVzdHJveTsKKworICAgICAgaWYgKHRoaXMucGVuZGluZ19iYWNrc3Ryb2tlKSB7CisgICAgICAgIHRoaXMuY2hvaWNlX2Rlc3Ryb3kodGhpcy5wZW5kaW5nX2JhY2tzdHJva2UuZmluZCgiYSIpLmZpcnN0KCkpOworICAgICAgICByZXR1cm4gdGhpcy5jbGVhcl9iYWNrc3Ryb2tlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBuZXh0X2F2YWlsYWJsZV9kZXN0cm95ID0gdGhpcy5zZWFyY2hfY29udGFpbmVyLnNpYmxpbmdzKCJsaS5zZWFyY2gtY2hvaWNlIikubGFzdCgpOworICAgICAgICBpZiAobmV4dF9hdmFpbGFibGVfZGVzdHJveS5sZW5ndGggJiYgIW5leHRfYXZhaWxhYmxlX2Rlc3Ryb3kuaGFzQ2xhc3MoInNlYXJjaC1jaG9pY2UtZGlzYWJsZWQiKSkgeworICAgICAgICAgIHRoaXMucGVuZGluZ19iYWNrc3Ryb2tlID0gbmV4dF9hdmFpbGFibGVfZGVzdHJveTsKKyAgICAgICAgICBpZiAodGhpcy5zaW5nbGVfYmFja3N0cm9rZV9kZWxldGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmtleWRvd25fYmFja3N0cm9rZSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nX2JhY2tzdHJva2UuYWRkQ2xhc3MoInNlYXJjaC1jaG9pY2UtZm9jdXMiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5jbGVhcl9iYWNrc3Ryb2tlID0gZnVuY3Rpb24oKSB7CisgICAgICBpZiAodGhpcy5wZW5kaW5nX2JhY2tzdHJva2UpIHsKKyAgICAgICAgdGhpcy5wZW5kaW5nX2JhY2tzdHJva2UucmVtb3ZlQ2xhc3MoInNlYXJjaC1jaG9pY2UtZm9jdXMiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzLnBlbmRpbmdfYmFja3N0cm9rZSA9IG51bGw7CisgICAgfTsKKworICAgIENob3Nlbi5wcm90b3R5cGUua2V5ZG93bl9jaGVja2VyID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgICB2YXIgc3Ryb2tlLCBfcmVmMTsKKworICAgICAgc3Ryb2tlID0gKF9yZWYxID0gZXZ0LndoaWNoKSAhPSBudWxsID8gX3JlZjEgOiBldnQua2V5Q29kZTsKKyAgICAgIHRoaXMuc2VhcmNoX2ZpZWxkX3NjYWxlKCk7CisgICAgICBpZiAoc3Ryb2tlICE9PSA4ICYmIHRoaXMucGVuZGluZ19iYWNrc3Ryb2tlKSB7CisgICAgICAgIHRoaXMuY2xlYXJfYmFja3N0cm9rZSgpOworICAgICAgfQorICAgICAgc3dpdGNoIChzdHJva2UpIHsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgIHRoaXMuYmFja3N0cm9rZV9sZW5ndGggPSB0aGlzLnNlYXJjaF9maWVsZC52YWwoKS5sZW5ndGg7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICBpZiAodGhpcy5yZXN1bHRzX3Nob3dpbmcgJiYgIXRoaXMuaXNfbXVsdGlwbGUpIHsKKyAgICAgICAgICAgIHRoaXMucmVzdWx0X3NlbGVjdChldnQpOworICAgICAgICAgIH0KKyAgICAgICAgICB0aGlzLm1vdXNlX29uX2NvbnRhaW5lciA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOgorICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM4OgorICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgIHRoaXMua2V5dXBfYXJyb3coKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgICB0aGlzLmtleWRvd25fYXJyb3coKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9OworCisgICAgQ2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfZmllbGRfc2NhbGUgPSBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBkaXYsIGZfd2lkdGgsIGgsIHN0eWxlLCBzdHlsZV9ibG9jaywgc3R5bGVzLCB3LCBfaSwgX2xlbjsKKworICAgICAgaWYgKHRoaXMuaXNfbXVsdGlwbGUpIHsKKyAgICAgICAgaCA9IDA7CisgICAgICAgIHcgPSAwOworICAgICAgICBzdHlsZV9ibG9jayA9ICJwb3NpdGlvbjphYnNvbHV0ZTsgbGVmdDogLTEwMDBweDsgdG9wOiAtMTAwMHB4OyBkaXNwbGF5Om5vbmU7IjsKKyAgICAgICAgc3R5bGVzID0gWydmb250LXNpemUnLCAnZm9udC1zdHlsZScsICdmb250LXdlaWdodCcsICdmb250LWZhbWlseScsICdsaW5lLWhlaWdodCcsICd0ZXh0LXRyYW5zZm9ybScsICdsZXR0ZXItc3BhY2luZyddOworICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IHN0eWxlcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykgeworICAgICAgICAgIHN0eWxlID0gc3R5bGVzW19pXTsKKyAgICAgICAgICBzdHlsZV9ibG9jayArPSBzdHlsZSArICI6IiArIHRoaXMuc2VhcmNoX2ZpZWxkLmNzcyhzdHlsZSkgKyAiOyI7CisgICAgICAgIH0KKyAgICAgICAgZGl2ID0gJCgnPGRpdiAvPicsIHsKKyAgICAgICAgICAnc3R5bGUnOiBzdHlsZV9ibG9jaworICAgICAgICB9KTsKKyAgICAgICAgZGl2LnRleHQodGhpcy5zZWFyY2hfZmllbGQudmFsKCkpOworICAgICAgICAkKCdib2R5JykuYXBwZW5kKGRpdik7CisgICAgICAgIHcgPSBkaXYud2lkdGgoKSArIDI1OworICAgICAgICBkaXYucmVtb3ZlKCk7CisgICAgICAgIGZfd2lkdGggPSB0aGlzLmNvbnRhaW5lci5vdXRlcldpZHRoKCk7CisgICAgICAgIGlmICh3ID4gZl93aWR0aCAtIDEwKSB7CisgICAgICAgICAgdyA9IGZfd2lkdGggLSAxMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hfZmllbGQuY3NzKHsKKyAgICAgICAgICAnd2lkdGgnOiB3ICsgJ3B4JworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9OworCisgICAgcmV0dXJuIENob3NlbjsKKworICB9KShBYnN0cmFjdENob3Nlbik7CisKK30pLmNhbGwodGhpcyk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9jaG9zZW4uanF1ZXJ5Lm1pbi5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2Nob3Nlbi5qcXVlcnkubWluLmpzCmluZGV4IDAxNjYyZmUuLjM1OTk0MjQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2Nob3Nlbi5qcXVlcnkubWluLmpzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2Nob3Nlbi5qcXVlcnkubWluLmpzCkBAIC0xLDMwICsxLDMwIEBACi0vKg0KLQ0KLUNob3Nlbg0KLQ0KLS0gYnkgUGF0cmljayBGaWxsZXIgZm9yIEhhcnZlc3QgaHR0cDovL2dldGhhcnZlc3QuY29tDQotLSBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMyBieSBIYXJ2ZXN0DQotDQotQXZhaWxhYmxlIGZvciB1c2UgdW5kZXIgdGhlIE1JVCBMaWNlbnNlDQotDQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0KLW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsDQotaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCi1jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMNCi1mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluDQotYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQotDQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQotTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElODQotVEhFIFNPRlRXQVJFLg0KLQ0KLSovDQotLyogQ2hvc2VuIHYxLjMuMCB8IChjKSAyMDExLTIwMTQgYnkgSGFydmVzdCB8IE1JVCBMaWNlbnNlLCBodHRwczovL2dpdGh1Yi5jb20vaGFydmVzdGhxL2Nob3Nlbi9ibG9iL21hc3Rlci9MSUNFTlNFLm1kICovDQotIWZ1bmN0aW9uKCl7dmFyIGEsQWJzdHJhY3RDaG9zZW4sQ2hvc2VuLFNlbGVjdFBhcnNlcixiLGM9e30uaGFzT3duUHJvcGVydHksZD1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoKXt0aGlzLmNvbnN0cnVjdG9yPWF9Zm9yKHZhciBlIGluIGIpYy5jYWxsKGIsZSkmJihhW2VdPWJbZV0pO3JldHVybiBkLnByb3RvdHlwZT1iLnByb3RvdHlwZSxhLnByb3RvdHlwZT1uZXcgZCxhLl9fc3VwZXJfXz1iLnByb3RvdHlwZSxhfTtTZWxlY3RQYXJzZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBTZWxlY3RQYXJzZXIoKXt0aGlzLm9wdGlvbnNfaW5kZXg9MCx0aGlzLnBhcnNlZD1bXX1yZXR1cm4gU2VsZWN0UGFyc2VyLnByb3RvdHlwZS5hZGRfbm9kZT1mdW5jdGlvbihhKXtyZXR1cm4iT1BUR1JPVVAiPT09YS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpP3RoaXMuYWRkX2dyb3VwKGEpOnRoaXMuYWRkX29wdGlvbihhKX0sU2VsZWN0UGFyc2VyLnByb3RvdHlwZS5hZGRfZ3JvdXA9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnO2ZvcihiPXRoaXMucGFyc2VkLmxlbmd0aCx0aGlzLnBhcnNlZC5wdXNoKHthcnJheV9pbmRleDpiLGdyb3VwOiEwLGxhYmVsOnRoaXMuZXNjYXBlRXhwcmVzc2lvbihhLmxhYmVsKSxjaGlsZHJlbjowLGRpc2FibGVkOmEuZGlzYWJsZWQsY2xhc3NlczphLmNsYXNzTmFtZX0pLGY9YS5jaGlsZE5vZGVzLGc9W10sZD0wLGU9Zi5sZW5ndGg7ZT5kO2QrKyljPWZbZF0sZy5wdXNoKHRoaXMuYWRkX29wdGlvbihjLGIsYS5kaXNhYmxlZCkpO3JldHVybiBnfSxTZWxlY3RQYXJzZXIucHJvdG90eXBlLmFkZF9vcHRpb249ZnVuY3Rpb24oYSxiLGMpe3JldHVybiJPUFRJT04iPT09YS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPygiIiE9PWEudGV4dD8obnVsbCE9YiYmKHRoaXMucGFyc2VkW2JdLmNoaWxkcmVuKz0xKSx0aGlzLnBhcnNlZC5wdXNoKHthcnJheV9pbmRleDp0aGlzLnBhcnNlZC5sZW5ndGgsb3B0aW9uc19pbmRleDp0aGlzLm9wdGlvbnNfaW5kZXgsdmFsdWU6YS52YWx1ZSx0ZXh0OmEudGV4dCxodG1sOmEuaW5uZXJIVE1MLHNlbGVjdGVkOmEuc2VsZWN0ZWQsZGlzYWJsZWQ6Yz09PSEwP2M6YS5kaXNhYmxlZCxncm91cF9hcnJheV9pbmRleDpiLGNsYXNzZXM6YS5jbGFzc05hbWUsc3R5bGU6YS5zdHlsZS5jc3NUZXh0fSkpOnRoaXMucGFyc2VkLnB1c2goe2FycmF5X2luZGV4OnRoaXMucGFyc2VkLmxlbmd0aCxvcHRpb25zX2luZGV4OnRoaXMub3B0aW9uc19pbmRleCxlbXB0eTohMH0pLHRoaXMub3B0aW9uc19pbmRleCs9MSk6dm9pZCAwfSxTZWxlY3RQYXJzZXIucHJvdG90eXBlLmVzY2FwZUV4cHJlc3Npb249ZnVuY3Rpb24oYSl7dmFyIGIsYztyZXR1cm4gbnVsbD09YXx8YT09PSExPyIiOi9bXCZcPFw+XCJcJ1xgXS8udGVzdChhKT8oYj17IjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjeDI3OyIsImAiOiImI3g2MDsifSxjPS8mKD8hXHcrOyl8W1w8XD5cIlwnXGBdL2csYS5yZXBsYWNlKGMsZnVuY3Rpb24oYSl7cmV0dXJuIGJbYV18fCImYW1wOyJ9KSk6YX0sU2VsZWN0UGFyc2VyfSgpLFNlbGVjdFBhcnNlci5zZWxlY3RfdG9fYXJyYXk9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZjtmb3IoYz1uZXcgU2VsZWN0UGFyc2VyLGY9YS5jaGlsZE5vZGVzLGQ9MCxlPWYubGVuZ3RoO2U+ZDtkKyspYj1mW2RdLGMuYWRkX25vZGUoYik7cmV0dXJuIGMucGFyc2VkfSxBYnN0cmFjdENob3Nlbj1mdW5jdGlvbigpe2Z1bmN0aW9uIEFic3RyYWN0Q2hvc2VuKGEsYil7dGhpcy5mb3JtX2ZpZWxkPWEsdGhpcy5vcHRpb25zPW51bGwhPWI/Yjp7fSxBYnN0cmFjdENob3Nlbi5icm93c2VyX2lzX3N1cHBvcnRlZCgpJiYodGhpcy5pc19tdWx0aXBsZT10aGlzLmZvcm1fZmllbGQubXVsdGlwbGUsdGhpcy5zZXRfZGVmYXVsdF90ZXh0KCksdGhpcy5zZXRfZGVmYXVsdF92YWx1ZXMoKSx0aGlzLnNldHVwKCksdGhpcy5zZXRfdXBfaHRtbCgpLHRoaXMucmVnaXN0ZXJfb2JzZXJ2ZXJzKCksdGhpcy5vbl9yZWFkeSgpKX1yZXR1cm4gQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnNldF9kZWZhdWx0X3ZhbHVlcz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIHRoaXMuY2xpY2tfdGVzdF9hY3Rpb249ZnVuY3Rpb24oYil7cmV0dXJuIGEudGVzdF9hY3RpdmVfY2xpY2soYil9LHRoaXMuYWN0aXZhdGVfYWN0aW9uPWZ1bmN0aW9uKGIpe3JldHVybiBhLmFjdGl2YXRlX2ZpZWxkKGIpfSx0aGlzLmFjdGl2ZV9maWVsZD0hMSx0aGlzLm1vdXNlX29uX2NvbnRhaW5lcj0hMSx0aGlzLnJlc3VsdHNfc2hvd2luZz0hMSx0aGlzLnJlc3VsdF9oaWdobGlnaHRlZD1udWxsLHRoaXMuYWxsb3dfc2luZ2xlX2Rlc2VsZWN0PW51bGwhPXRoaXMub3B0aW9ucy5hbGxvd19zaW5nbGVfZGVzZWxlY3QmJm51bGwhPXRoaXMuZm9ybV9maWVsZC5vcHRpb25zWzBdJiYiIj09PXRoaXMuZm9ybV9maWVsZC5vcHRpb25zWzBdLnRleHQ/dGhpcy5vcHRpb25zLmFsbG93X3NpbmdsZV9kZXNlbGVjdDohMSx0aGlzLmRpc2FibGVfc2VhcmNoX3RocmVzaG9sZD10aGlzLm9wdGlvbnMuZGlzYWJsZV9zZWFyY2hfdGhyZXNob2xkfHwwLHRoaXMuZGlzYWJsZV9zZWFyY2g9dGhpcy5vcHRpb25zLmRpc2FibGVfc2VhcmNofHwhMSx0aGlzLmVuYWJsZV9zcGxpdF93b3JkX3NlYXJjaD1udWxsIT10aGlzLm9wdGlvbnMuZW5hYmxlX3NwbGl0X3dvcmRfc2VhcmNoP3RoaXMub3B0aW9ucy5lbmFibGVfc3BsaXRfd29yZF9zZWFyY2g6ITAsdGhpcy5ncm91cF9zZWFyY2g9bnVsbCE9dGhpcy5vcHRpb25zLmdyb3VwX3NlYXJjaD90aGlzLm9wdGlvbnMuZ3JvdXBfc2VhcmNoOiEwLHRoaXMuc2VhcmNoX2NvbnRhaW5zPXRoaXMub3B0aW9ucy5zZWFyY2hfY29udGFpbnN8fCExLHRoaXMuc2luZ2xlX2JhY2tzdHJva2VfZGVsZXRlPW51bGwhPXRoaXMub3B0aW9ucy5zaW5nbGVfYmFja3N0cm9rZV9kZWxldGU/dGhpcy5vcHRpb25zLnNpbmdsZV9iYWNrc3Ryb2tlX2RlbGV0ZTohMCx0aGlzLm1heF9zZWxlY3RlZF9vcHRpb25zPXRoaXMub3B0aW9ucy5tYXhfc2VsZWN0ZWRfb3B0aW9uc3x8MS8wLHRoaXMuaW5oZXJpdF9zZWxlY3RfY2xhc3Nlcz10aGlzLm9wdGlvbnMuaW5oZXJpdF9zZWxlY3RfY2xhc3Nlc3x8ITEsdGhpcy5kaXNwbGF5X3NlbGVjdGVkX29wdGlvbnM9bnVsbCE9dGhpcy5vcHRpb25zLmRpc3BsYXlfc2VsZWN0ZWRfb3B0aW9ucz90aGlzLm9wdGlvbnMuZGlzcGxheV9zZWxlY3RlZF9vcHRpb25zOiEwLHRoaXMuZGlzcGxheV9kaXNhYmxlZF9vcHRpb25zPW51bGwhPXRoaXMub3B0aW9ucy5kaXNwbGF5X2Rpc2FibGVkX29wdGlvbnM/dGhpcy5vcHRpb25zLmRpc3BsYXlfZGlzYWJsZWRfb3B0aW9uczohMH0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnNldF9kZWZhdWx0X3RleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWZhdWx0X3RleHQ9dGhpcy5mb3JtX2ZpZWxkLmdldEF0dHJpYnV0ZSgiZGF0YS1wbGFjZWhvbGRlciIpP3RoaXMuZm9ybV9maWVsZC5nZXRBdHRyaWJ1dGUoImRhdGEtcGxhY2Vob2xkZXIiKTp0aGlzLmlzX211bHRpcGxlP3RoaXMub3B0aW9ucy5wbGFjZWhvbGRlcl90ZXh0X211bHRpcGxlfHx0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXJfdGV4dHx8QWJzdHJhY3RDaG9zZW4uZGVmYXVsdF9tdWx0aXBsZV90ZXh0OnRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcl90ZXh0X3NpbmdsZXx8dGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyX3RleHR8fEFic3RyYWN0Q2hvc2VuLmRlZmF1bHRfc2luZ2xlX3RleHQsdGhpcy5yZXN1bHRzX25vbmVfZm91bmQ9dGhpcy5mb3JtX2ZpZWxkLmdldEF0dHJpYnV0ZSgiZGF0YS1ub19yZXN1bHRzX3RleHQiKXx8dGhpcy5vcHRpb25zLm5vX3Jlc3VsdHNfdGV4dHx8QWJzdHJhY3RDaG9zZW4uZGVmYXVsdF9ub19yZXN1bHRfdGV4dH0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLm1vdXNlX2VudGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubW91c2Vfb25fY29udGFpbmVyPSEwfSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUubW91c2VfbGVhdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb3VzZV9vbl9jb250YWluZXI9ITF9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5pbnB1dF9mb2N1cz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYodGhpcy5pc19tdWx0aXBsZSl7aWYoIXRoaXMuYWN0aXZlX2ZpZWxkKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGEuY29udGFpbmVyX21vdXNlZG93bigpfSw1MCl9ZWxzZSBpZighdGhpcy5hY3RpdmVfZmllbGQpcmV0dXJuIHRoaXMuYWN0aXZhdGVfZmllbGQoKX0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLmlucHV0X2JsdXI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiB0aGlzLm1vdXNlX29uX2NvbnRhaW5lcj92b2lkIDA6KHRoaXMuYWN0aXZlX2ZpZWxkPSExLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gYS5ibHVyX3Rlc3QoKX0sMTAwKSl9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5yZXN1bHRzX29wdGlvbl9idWlsZD1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmO2ZvcihiPSIiLGY9dGhpcy5yZXN1bHRzX2RhdGEsZD0wLGU9Zi5sZW5ndGg7ZT5kO2QrKyljPWZbZF0sYis9Yy5ncm91cD90aGlzLnJlc3VsdF9hZGRfZ3JvdXAoYyk6dGhpcy5yZXN1bHRfYWRkX29wdGlvbihjKSwobnVsbCE9YT9hLmZpcnN0OnZvaWQgMCkmJihjLnNlbGVjdGVkJiZ0aGlzLmlzX211bHRpcGxlP3RoaXMuY2hvaWNlX2J1aWxkKGMpOmMuc2VsZWN0ZWQmJiF0aGlzLmlzX211bHRpcGxlJiZ0aGlzLnNpbmdsZV9zZXRfc2VsZWN0ZWRfdGV4dChjLnRleHQpKTtyZXR1cm4gYn0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnJlc3VsdF9hZGRfb3B0aW9uPWZ1bmN0aW9uKGEpe3ZhciBiLGM7cmV0dXJuIGEuc2VhcmNoX21hdGNoP3RoaXMuaW5jbHVkZV9vcHRpb25faW5fcmVzdWx0cyhhKT8oYj1bXSxhLmRpc2FibGVkfHxhLnNlbGVjdGVkJiZ0aGlzLmlzX211bHRpcGxlfHxiLnB1c2goImFjdGl2ZS1yZXN1bHQiKSwhYS5kaXNhYmxlZHx8YS5zZWxlY3RlZCYmdGhpcy5pc19tdWx0aXBsZXx8Yi5wdXNoKCJkaXNhYmxlZC1yZXN1bHQiKSxhLnNlbGVjdGVkJiZiLnB1c2goInJlc3VsdC1zZWxlY3RlZCIpLG51bGwhPWEuZ3JvdXBfYXJyYXlfaW5kZXgmJmIucHVzaCgiZ3JvdXAtb3B0aW9uIiksIiIhPT1hLmNsYXNzZXMmJmIucHVzaChhLmNsYXNzZXMpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxjLmNsYXNzTmFtZT1iLmpvaW4oIiAiKSxjLnN0eWxlLmNzc1RleHQ9YS5zdHlsZSxjLnNldEF0dHJpYnV0ZSgiZGF0YS1vcHRpb24tYXJyYXktaW5kZXgiLGEuYXJyYXlfaW5kZXgpLGMuaW5uZXJIVE1MPWEuc2VhcmNoX3RleHQsdGhpcy5vdXRlckhUTUwoYykpOiIiOiIifSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzdWx0X2FkZF9ncm91cD1mdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiBhLnNlYXJjaF9tYXRjaHx8YS5ncm91cF9tYXRjaD9hLmFjdGl2ZV9vcHRpb25zPjA/KGI9W10sYi5wdXNoKCJncm91cC1yZXN1bHQiKSxhLmNsYXNzZXMmJmIucHVzaChhLmNsYXNzZXMpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxjLmNsYXNzTmFtZT1iLmpvaW4oIiAiKSxjLmlubmVySFRNTD1hLnNlYXJjaF90ZXh0LHRoaXMub3V0ZXJIVE1MKGMpKToiIjoiIn0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnJlc3VsdHNfdXBkYXRlX2ZpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0X2RlZmF1bHRfdGV4dCgpLHRoaXMuaXNfbXVsdGlwbGV8fHRoaXMucmVzdWx0c19yZXNldF9jbGVhbnVwKCksdGhpcy5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0KCksdGhpcy5yZXN1bHRzX2J1aWxkKCksdGhpcy5yZXN1bHRzX3Nob3dpbmc/dGhpcy53aW5ub3dfcmVzdWx0cygpOnZvaWQgMH0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnJlc2V0X3NpbmdsZV9zZWxlY3Rfb3B0aW9ucz1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU7Zm9yKGQ9dGhpcy5yZXN1bHRzX2RhdGEsZT1bXSxiPTAsYz1kLmxlbmd0aDtjPmI7YisrKWE9ZFtiXSxhLnNlbGVjdGVkP2UucHVzaChhLnNlbGVjdGVkPSExKTplLnB1c2godm9pZCAwKTtyZXR1cm4gZX0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnJlc3VsdHNfdG9nZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzdWx0c19zaG93aW5nP3RoaXMucmVzdWx0c19oaWRlKCk6dGhpcy5yZXN1bHRzX3Nob3coKX0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnJlc3VsdHNfc2VhcmNoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzdWx0c19zaG93aW5nP3RoaXMud2lubm93X3Jlc3VsdHMoKTp0aGlzLnJlc3VsdHNfc2hvdygpfSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUud2lubm93X3Jlc3VsdHM9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZyxoLGksaixrLGw7Zm9yKHRoaXMubm9fcmVzdWx0c19jbGVhcigpLGQ9MCxmPXRoaXMuZ2V0X3NlYXJjaF90ZXh0KCksYT1mLnJlcGxhY2UoL1stW1xde30oKSorPy4sXFxeJHwjXHNdL2csIlxcJCYiKSxpPW5ldyBSZWdFeHAoYSwiaSIpLGM9dGhpcy5nZXRfc2VhcmNoX3JlZ2V4KGEpLGw9dGhpcy5yZXN1bHRzX2RhdGEsaj0wLGs9bC5sZW5ndGg7az5qO2orKyliPWxbal0sYi5zZWFyY2hfbWF0Y2g9ITEsZT1udWxsLHRoaXMuaW5jbHVkZV9vcHRpb25faW5fcmVzdWx0cyhiKSYmKGIuZ3JvdXAmJihiLmdyb3VwX21hdGNoPSExLGIuYWN0aXZlX29wdGlvbnM9MCksbnVsbCE9Yi5ncm91cF9hcnJheV9pbmRleCYmdGhpcy5yZXN1bHRzX2RhdGFbYi5ncm91cF9hcnJheV9pbmRleF0mJihlPXRoaXMucmVzdWx0c19kYXRhW2IuZ3JvdXBfYXJyYXlfaW5kZXhdLDA9PT1lLmFjdGl2ZV9vcHRpb25zJiZlLnNlYXJjaF9tYXRjaCYmKGQrPTEpLGUuYWN0aXZlX29wdGlvbnMrPTEpLCghYi5ncm91cHx8dGhpcy5ncm91cF9zZWFyY2gpJiYoYi5zZWFyY2hfdGV4dD1iLmdyb3VwP2IubGFiZWw6Yi50ZXh0LGIuc2VhcmNoX21hdGNoPXRoaXMuc2VhcmNoX3N0cmluZ19tYXRjaChiLnNlYXJjaF90ZXh0LGMpLGIuc2VhcmNoX21hdGNoJiYhYi5ncm91cCYmKGQrPTEpLGIuc2VhcmNoX21hdGNoPyhmLmxlbmd0aCYmKGc9Yi5zZWFyY2hfdGV4dC5zZWFyY2goaSksaD1iLnNlYXJjaF90ZXh0LnN1YnN0cigwLGcrZi5sZW5ndGgpKyI8L2VtPiIrYi5zZWFyY2hfdGV4dC5zdWJzdHIoZytmLmxlbmd0aCksYi5zZWFyY2hfdGV4dD1oLnN1YnN0cigwLGcpKyI8ZW0+IitoLnN1YnN0cihnKSksbnVsbCE9ZSYmKGUuZ3JvdXBfbWF0Y2g9ITApKTpudWxsIT1iLmdyb3VwX2FycmF5X2luZGV4JiZ0aGlzLnJlc3VsdHNfZGF0YVtiLmdyb3VwX2FycmF5X2luZGV4XS5zZWFyY2hfbWF0Y2gmJihiLnNlYXJjaF9tYXRjaD0hMCkpKTtyZXR1cm4gdGhpcy5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0KCksMT5kJiZmLmxlbmd0aD8odGhpcy51cGRhdGVfcmVzdWx0c19jb250ZW50KCIiKSx0aGlzLm5vX3Jlc3VsdHMoZikpOih0aGlzLnVwZGF0ZV9yZXN1bHRzX2NvbnRlbnQodGhpcy5yZXN1bHRzX29wdGlvbl9idWlsZCgpKSx0aGlzLndpbm5vd19yZXN1bHRzX3NldF9oaWdobGlnaHQoKSl9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5nZXRfc2VhcmNoX3JlZ2V4PWZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBiPXRoaXMuc2VhcmNoX2NvbnRhaW5zPyIiOiJeIixuZXcgUmVnRXhwKGIrYSwiaSIpfSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUuc2VhcmNoX3N0cmluZ19tYXRjaD1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmO2lmKGIudGVzdChhKSlyZXR1cm4hMDtpZih0aGlzLmVuYWJsZV9zcGxpdF93b3JkX3NlYXJjaCYmKGEuaW5kZXhPZigiICIpPj0wfHwwPT09YS5pbmRleE9mKCJbIikpJiYoZD1hLnJlcGxhY2UoL1xbfFxdL2csIiIpLnNwbGl0KCIgIiksZC5sZW5ndGgpKWZvcihlPTAsZj1kLmxlbmd0aDtmPmU7ZSsrKWlmKGM9ZFtlXSxiLnRlc3QoYykpcmV0dXJuITB9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5jaG9pY2VzX2NvdW50PWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7aWYobnVsbCE9dGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQpcmV0dXJuIHRoaXMuc2VsZWN0ZWRfb3B0aW9uX2NvdW50O2Zvcih0aGlzLnNlbGVjdGVkX29wdGlvbl9jb3VudD0wLGQ9dGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnMsYj0wLGM9ZC5sZW5ndGg7Yz5iO2IrKylhPWRbYl0sYS5zZWxlY3RlZCYmKHRoaXMuc2VsZWN0ZWRfb3B0aW9uX2NvdW50Kz0xKTtyZXR1cm4gdGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnR9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5jaG9pY2VzX2NsaWNrPWZ1bmN0aW9uKGEpe3JldHVybiBhLnByZXZlbnREZWZhdWx0KCksdGhpcy5yZXN1bHRzX3Nob3dpbmd8fHRoaXMuaXNfZGlzYWJsZWQ/dm9pZCAwOnRoaXMucmVzdWx0c19zaG93KCl9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5rZXl1cF9jaGVja2VyPWZ1bmN0aW9uKGEpe3ZhciBiLGM7c3dpdGNoKGI9bnVsbCE9KGM9YS53aGljaCk/YzphLmtleUNvZGUsdGhpcy5zZWFyY2hfZmllbGRfc2NhbGUoKSxiKXtjYXNlIDg6aWYodGhpcy5pc19tdWx0aXBsZSYmdGhpcy5iYWNrc3Ryb2tlX2xlbmd0aDwxJiZ0aGlzLmNob2ljZXNfY291bnQoKT4wKXJldHVybiB0aGlzLmtleWRvd25fYmFja3N0cm9rZSgpO2lmKCF0aGlzLnBlbmRpbmdfYmFja3N0cm9rZSlyZXR1cm4gdGhpcy5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0KCksdGhpcy5yZXN1bHRzX3NlYXJjaCgpO2JyZWFrO2Nhc2UgMTM6aWYoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMucmVzdWx0c19zaG93aW5nKXJldHVybiB0aGlzLnJlc3VsdF9zZWxlY3QoYSk7YnJlYWs7Y2FzZSAyNzpyZXR1cm4gdGhpcy5yZXN1bHRzX3Nob3dpbmcmJnRoaXMucmVzdWx0c19oaWRlKCksITA7Y2FzZSA5OmNhc2UgMzg6Y2FzZSA0MDpjYXNlIDE2OmNhc2UgOTE6Y2FzZSAxNzpicmVhaztkZWZhdWx0OnJldHVybiB0aGlzLnJlc3VsdHNfc2VhcmNoKCl9fSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUuY2xpcGJvYXJkX2V2ZW50X2NoZWNrZXI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGEucmVzdWx0c19zZWFyY2goKX0sNTApfSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUuY29udGFpbmVyX3dpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMub3B0aW9ucy53aWR0aD90aGlzLm9wdGlvbnMud2lkdGg6IiIrdGhpcy5mb3JtX2ZpZWxkLm9mZnNldFdpZHRoKyJweCJ9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5pbmNsdWRlX29wdGlvbl9pbl9yZXN1bHRzPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlzX211bHRpcGxlJiYhdGhpcy5kaXNwbGF5X3NlbGVjdGVkX29wdGlvbnMmJmEuc2VsZWN0ZWQ/ITE6IXRoaXMuZGlzcGxheV9kaXNhYmxlZF9vcHRpb25zJiZhLmRpc2FibGVkPyExOmEuZW1wdHk/ITE6ITB9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfcmVzdWx0c190b3VjaHN0YXJ0PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRvdWNoX3N0YXJ0ZWQ9ITAsdGhpcy5zZWFyY2hfcmVzdWx0c19tb3VzZW92ZXIoYSl9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfcmVzdWx0c190b3VjaG1vdmU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudG91Y2hfc3RhcnRlZD0hMSx0aGlzLnNlYXJjaF9yZXN1bHRzX21vdXNlb3V0KGEpfSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUuc2VhcmNoX3Jlc3VsdHNfdG91Y2hlbmQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudG91Y2hfc3RhcnRlZD90aGlzLnNlYXJjaF9yZXN1bHRzX21vdXNldXAoYSk6dm9pZCAwfSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUub3V0ZXJIVE1MPWZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBhLm91dGVySFRNTD9hLm91dGVySFRNTDooYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxiLmFwcGVuZENoaWxkKGEpLGIuaW5uZXJIVE1MKX0sQWJzdHJhY3RDaG9zZW4uYnJvd3Nlcl9pc19zdXBwb3J0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIj09PXdpbmRvdy5uYXZpZ2F0b3IuYXBwTmFtZT9kb2N1bWVudC5kb2N1bWVudE1vZGU+PTg6L2lQKG9kfGhvbmUpL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk/ITE6L0FuZHJvaWQvaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSYmL01vYmlsZS9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpPyExOiEwfSxBYnN0cmFjdENob3Nlbi5kZWZhdWx0X211bHRpcGxlX3RleHQ9IlNlbGVjdCBTb21lIE9wdGlvbnMiLEFic3RyYWN0Q2hvc2VuLmRlZmF1bHRfc2luZ2xlX3RleHQ9IlNlbGVjdCBhbiBPcHRpb24iLEFic3RyYWN0Q2hvc2VuLmRlZmF1bHRfbm9fcmVzdWx0X3RleHQ9Ik5vIHJlc3VsdHMgbWF0Y2giLEFic3RyYWN0Q2hvc2VufSgpLGE9alF1ZXJ5LGEuZm4uZXh0ZW5kKHtjaG9zZW46ZnVuY3Rpb24oYil7cmV0dXJuIEFic3RyYWN0Q2hvc2VuLmJyb3dzZXJfaXNfc3VwcG9ydGVkKCk/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGMsZDtjPWEodGhpcyksZD1jLmRhdGEoImNob3NlbiIpLCJkZXN0cm95Ij09PWImJmQgaW5zdGFuY2VvZiBDaG9zZW4/ZC5kZXN0cm95KCk6ZCBpbnN0YW5jZW9mIENob3Nlbnx8Yy5kYXRhKCJjaG9zZW4iLG5ldyBDaG9zZW4odGhpcyxiKSl9KTp0aGlzfX0pLENob3Nlbj1mdW5jdGlvbihjKXtmdW5jdGlvbiBDaG9zZW4oKXtyZXR1cm4gYj1DaG9zZW4uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gZChDaG9zZW4sYyksQ2hvc2VuLnByb3RvdHlwZS5zZXR1cD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZvcm1fZmllbGRfanE9YSh0aGlzLmZvcm1fZmllbGQpLHRoaXMuY3VycmVudF9zZWxlY3RlZEluZGV4PXRoaXMuZm9ybV9maWVsZC5zZWxlY3RlZEluZGV4LHRoaXMuaXNfcnRsPXRoaXMuZm9ybV9maWVsZF9qcS5oYXNDbGFzcygiY2hvc2VuLXJ0bCIpfSxDaG9zZW4ucHJvdG90eXBlLnNldF91cF9odG1sPWZ1bmN0aW9uKCl7dmFyIGIsYztyZXR1cm4gYj1bImNob3Nlbi1jb250YWluZXIiXSxiLnB1c2goImNob3Nlbi1jb250YWluZXItIisodGhpcy5pc19tdWx0aXBsZT8ibXVsdGkiOiJzaW5nbGUiKSksdGhpcy5pbmhlcml0X3NlbGVjdF9jbGFzc2VzJiZ0aGlzLmZvcm1fZmllbGQuY2xhc3NOYW1lJiZiLnB1c2godGhpcy5mb3JtX2ZpZWxkLmNsYXNzTmFtZSksdGhpcy5pc19ydGwmJmIucHVzaCgiY2hvc2VuLXJ0bCIpLGM9eyJjbGFzcyI6Yi5qb2luKCIgIiksc3R5bGU6IndpZHRoOiAiK3RoaXMuY29udGFpbmVyX3dpZHRoKCkrIjsiLHRpdGxlOnRoaXMuZm9ybV9maWVsZC50aXRsZX0sdGhpcy5mb3JtX2ZpZWxkLmlkLmxlbmd0aCYmKGMuaWQ9dGhpcy5mb3JtX2ZpZWxkLmlkLnJlcGxhY2UoL1teXHddL2csIl8iKSsiX2Nob3NlbiIpLHRoaXMuY29udGFpbmVyPWEoIjxkaXYgLz4iLGMpLHRoaXMuaXNfbXVsdGlwbGU/dGhpcy5jb250YWluZXIuaHRtbCgnPHVsIGNsYXNzPSJjaG9zZW4tY2hvaWNlcyI+PGxpIGNsYXNzPSJzZWFyY2gtZmllbGQiPjxpbnB1dCB0eXBlPSJ0ZXh0IiB2YWx1ZT0iJyt0aGlzLmRlZmF1bHRfdGV4dCsnIiBjbGFzcz0iZGVmYXVsdCIgYXV0b2NvbXBsZXRlPSJvZmYiIHN0eWxlPSJ3aWR0aDoyNXB4OyIgLz48L2xpPjwvdWw+PGRpdiBjbGFzcz0iY2hvc2VuLWRyb3AiPjx1bCBjbGFzcz0iY2hvc2VuLXJlc3VsdHMiPjwvdWw+PC9kaXY+Jyk6dGhpcy5jb250YWluZXIuaHRtbCgnPGEgY2xhc3M9ImNob3Nlbi1zaW5nbGUgY2hvc2VuLWRlZmF1bHQiIHRhYmluZGV4PSItMSI+PHNwYW4+Jyt0aGlzLmRlZmF1bHRfdGV4dCsnPC9zcGFuPjxkaXY+PGI+PC9iPjwvZGl2PjwvYT48ZGl2IGNsYXNzPSJjaG9zZW4tZHJvcCI+PGRpdiBjbGFzcz0iY2hvc2VuLXNlYXJjaCI+PGlucHV0IHR5cGU9InRleHQiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2Pjx1bCBjbGFzcz0iY2hvc2VuLXJlc3VsdHMiPjwvdWw+PC9kaXY+JyksdGhpcy5mb3JtX2ZpZWxkX2pxLmhpZGUoKS5hZnRlcih0aGlzLmNvbnRhaW5lciksdGhpcy5kcm9wZG93bj10aGlzLmNvbnRhaW5lci5maW5kKCJkaXYuY2hvc2VuLWRyb3AiKS5maXJzdCgpLHRoaXMuc2VhcmNoX2ZpZWxkPXRoaXMuY29udGFpbmVyLmZpbmQoImlucHV0IikuZmlyc3QoKSx0aGlzLnNlYXJjaF9yZXN1bHRzPXRoaXMuY29udGFpbmVyLmZpbmQoInVsLmNob3Nlbi1yZXN1bHRzIikuZmlyc3QoKSx0aGlzLnNlYXJjaF9maWVsZF9zY2FsZSgpLHRoaXMuc2VhcmNoX25vX3Jlc3VsdHM9dGhpcy5jb250YWluZXIuZmluZCgibGkubm8tcmVzdWx0cyIpLmZpcnN0KCksdGhpcy5pc19tdWx0aXBsZT8odGhpcy5zZWFyY2hfY2hvaWNlcz10aGlzLmNvbnRhaW5lci5maW5kKCJ1bC5jaG9zZW4tY2hvaWNlcyIpLmZpcnN0KCksdGhpcy5zZWFyY2hfY29udGFpbmVyPXRoaXMuY29udGFpbmVyLmZpbmQoImxpLnNlYXJjaC1maWVsZCIpLmZpcnN0KCkpOih0aGlzLnNlYXJjaF9jb250YWluZXI9dGhpcy5jb250YWluZXIuZmluZCgiZGl2LmNob3Nlbi1zZWFyY2giKS5maXJzdCgpLHRoaXMuc2VsZWN0ZWRfaXRlbT10aGlzLmNvbnRhaW5lci5maW5kKCIuY2hvc2VuLXNpbmdsZSIpLmZpcnN0KCkpLHRoaXMucmVzdWx0c19idWlsZCgpLHRoaXMuc2V0X3RhYl9pbmRleCgpLHRoaXMuc2V0X2xhYmVsX2JlaGF2aW9yKCl9LENob3Nlbi5wcm90b3R5cGUub25fcmVhZHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mb3JtX2ZpZWxkX2pxLnRyaWdnZXIoImNob3NlbjpyZWFkeSIse2Nob3Nlbjp0aGlzfSl9LENob3Nlbi5wcm90b3R5cGUucmVnaXN0ZXJfb2JzZXJ2ZXJzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gdGhpcy5jb250YWluZXIuYmluZCgidG91Y2hzdGFydC5jaG9zZW4iLGZ1bmN0aW9uKGIpe2EuY29udGFpbmVyX21vdXNlZG93bihiKX0pLHRoaXMuY29udGFpbmVyLmJpbmQoInRvdWNoZW5kLmNob3NlbiIsZnVuY3Rpb24oYil7YS5jb250YWluZXJfbW91c2V1cChiKX0pLHRoaXMuY29udGFpbmVyLmJpbmQoIm1vdXNlZG93bi5jaG9zZW4iLGZ1bmN0aW9uKGIpe2EuY29udGFpbmVyX21vdXNlZG93bihiKX0pLHRoaXMuY29udGFpbmVyLmJpbmQoIm1vdXNldXAuY2hvc2VuIixmdW5jdGlvbihiKXthLmNvbnRhaW5lcl9tb3VzZXVwKGIpfSksdGhpcy5jb250YWluZXIuYmluZCgibW91c2VlbnRlci5jaG9zZW4iLGZ1bmN0aW9uKGIpe2EubW91c2VfZW50ZXIoYil9KSx0aGlzLmNvbnRhaW5lci5iaW5kKCJtb3VzZWxlYXZlLmNob3NlbiIsZnVuY3Rpb24oYil7YS5tb3VzZV9sZWF2ZShiKX0pLHRoaXMuc2VhcmNoX3Jlc3VsdHMuYmluZCgibW91c2V1cC5jaG9zZW4iLGZ1bmN0aW9uKGIpe2Euc2VhcmNoX3Jlc3VsdHNfbW91c2V1cChiKX0pLHRoaXMuc2VhcmNoX3Jlc3VsdHMuYmluZCgibW91c2VvdmVyLmNob3NlbiIsZnVuY3Rpb24oYil7YS5zZWFyY2hfcmVzdWx0c19tb3VzZW92ZXIoYil9KSx0aGlzLnNlYXJjaF9yZXN1bHRzLmJpbmQoIm1vdXNlb3V0LmNob3NlbiIsZnVuY3Rpb24oYil7YS5zZWFyY2hfcmVzdWx0c19tb3VzZW91dChiKX0pLHRoaXMuc2VhcmNoX3Jlc3VsdHMuYmluZCgibW91c2V3aGVlbC5jaG9zZW4gRE9NTW91c2VTY3JvbGwuY2hvc2VuIixmdW5jdGlvbihiKXthLnNlYXJjaF9yZXN1bHRzX21vdXNld2hlZWwoYil9KSx0aGlzLnNlYXJjaF9yZXN1bHRzLmJpbmQoInRvdWNoc3RhcnQuY2hvc2VuIixmdW5jdGlvbihiKXthLnNlYXJjaF9yZXN1bHRzX3RvdWNoc3RhcnQoYil9KSx0aGlzLnNlYXJjaF9yZXN1bHRzLmJpbmQoInRvdWNobW92ZS5jaG9zZW4iLGZ1bmN0aW9uKGIpe2Euc2VhcmNoX3Jlc3VsdHNfdG91Y2htb3ZlKGIpfSksdGhpcy5zZWFyY2hfcmVzdWx0cy5iaW5kKCJ0b3VjaGVuZC5jaG9zZW4iLGZ1bmN0aW9uKGIpe2Euc2VhcmNoX3Jlc3VsdHNfdG91Y2hlbmQoYil9KSx0aGlzLmZvcm1fZmllbGRfanEuYmluZCgiY2hvc2VuOnVwZGF0ZWQuY2hvc2VuIixmdW5jdGlvbihiKXthLnJlc3VsdHNfdXBkYXRlX2ZpZWxkKGIpfSksdGhpcy5mb3JtX2ZpZWxkX2pxLmJpbmQoImNob3NlbjphY3RpdmF0ZS5jaG9zZW4iLGZ1bmN0aW9uKGIpe2EuYWN0aXZhdGVfZmllbGQoYil9KSx0aGlzLmZvcm1fZmllbGRfanEuYmluZCgiY2hvc2VuOm9wZW4uY2hvc2VuIixmdW5jdGlvbihiKXthLmNvbnRhaW5lcl9tb3VzZWRvd24oYil9KSx0aGlzLmZvcm1fZmllbGRfanEuYmluZCgiY2hvc2VuOmNsb3NlLmNob3NlbiIsZnVuY3Rpb24oYil7YS5pbnB1dF9ibHVyKGIpfSksdGhpcy5zZWFyY2hfZmllbGQuYmluZCgiYmx1ci5jaG9zZW4iLGZ1bmN0aW9uKGIpe2EuaW5wdXRfYmx1cihiKX0pLHRoaXMuc2VhcmNoX2ZpZWxkLmJpbmQoImtleXVwLmNob3NlbiIsZnVuY3Rpb24oYil7YS5rZXl1cF9jaGVja2VyKGIpfSksdGhpcy5zZWFyY2hfZmllbGQuYmluZCgia2V5ZG93bi5jaG9zZW4iLGZ1bmN0aW9uKGIpe2Eua2V5ZG93bl9jaGVja2VyKGIpfSksdGhpcy5zZWFyY2hfZmllbGQuYmluZCgiZm9jdXMuY2hvc2VuIixmdW5jdGlvbihiKXthLmlucHV0X2ZvY3VzKGIpfSksdGhpcy5zZWFyY2hfZmllbGQuYmluZCgiY3V0LmNob3NlbiIsZnVuY3Rpb24oYil7YS5jbGlwYm9hcmRfZXZlbnRfY2hlY2tlcihiKX0pLHRoaXMuc2VhcmNoX2ZpZWxkLmJpbmQoInBhc3RlLmNob3NlbiIsZnVuY3Rpb24oYil7YS5jbGlwYm9hcmRfZXZlbnRfY2hlY2tlcihiKX0pLHRoaXMuaXNfbXVsdGlwbGU/dGhpcy5zZWFyY2hfY2hvaWNlcy5iaW5kKCJjbGljay5jaG9zZW4iLGZ1bmN0aW9uKGIpe2EuY2hvaWNlc19jbGljayhiKX0pOnRoaXMuY29udGFpbmVyLmJpbmQoImNsaWNrLmNob3NlbiIsZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSl9LENob3Nlbi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3JldHVybiBhKHRoaXMuY29udGFpbmVyWzBdLm93bmVyRG9jdW1lbnQpLnVuYmluZCgiY2xpY2suY2hvc2VuIix0aGlzLmNsaWNrX3Rlc3RfYWN0aW9uKSx0aGlzLnNlYXJjaF9maWVsZFswXS50YWJJbmRleCYmKHRoaXMuZm9ybV9maWVsZF9qcVswXS50YWJJbmRleD10aGlzLnNlYXJjaF9maWVsZFswXS50YWJJbmRleCksdGhpcy5jb250YWluZXIucmVtb3ZlKCksdGhpcy5mb3JtX2ZpZWxkX2pxLnJlbW92ZURhdGEoImNob3NlbiIpLHRoaXMuZm9ybV9maWVsZF9qcS5zaG93KCl9LENob3Nlbi5wcm90b3R5cGUuc2VhcmNoX2ZpZWxkX2Rpc2FibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNfZGlzYWJsZWQ9dGhpcy5mb3JtX2ZpZWxkX2pxWzBdLmRpc2FibGVkLHRoaXMuaXNfZGlzYWJsZWQ/KHRoaXMuY29udGFpbmVyLmFkZENsYXNzKCJjaG9zZW4tZGlzYWJsZWQiKSx0aGlzLnNlYXJjaF9maWVsZFswXS5kaXNhYmxlZD0hMCx0aGlzLmlzX211bHRpcGxlfHx0aGlzLnNlbGVjdGVkX2l0ZW0udW5iaW5kKCJmb2N1cy5jaG9zZW4iLHRoaXMuYWN0aXZhdGVfYWN0aW9uKSx0aGlzLmNsb3NlX2ZpZWxkKCkpOih0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcygiY2hvc2VuLWRpc2FibGVkIiksdGhpcy5zZWFyY2hfZmllbGRbMF0uZGlzYWJsZWQ9ITEsdGhpcy5pc19tdWx0aXBsZT92b2lkIDA6dGhpcy5zZWxlY3RlZF9pdGVtLmJpbmQoImZvY3VzLmNob3NlbiIsdGhpcy5hY3RpdmF0ZV9hY3Rpb24pKX0sQ2hvc2VuLnByb3RvdHlwZS5jb250YWluZXJfbW91c2Vkb3duPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmlzX2Rpc2FibGVkfHwoYiYmIm1vdXNlZG93biI9PT1iLnR5cGUmJiF0aGlzLnJlc3VsdHNfc2hvd2luZyYmYi5wcmV2ZW50RGVmYXVsdCgpLG51bGwhPWImJmEoYi50YXJnZXQpLmhhc0NsYXNzKCJzZWFyY2gtY2hvaWNlLWNsb3NlIikpP3ZvaWQgMDoodGhpcy5hY3RpdmVfZmllbGQ/dGhpcy5pc19tdWx0aXBsZXx8IWJ8fGEoYi50YXJnZXQpWzBdIT09dGhpcy5zZWxlY3RlZF9pdGVtWzBdJiYhYShiLnRhcmdldCkucGFyZW50cygiYS5jaG9zZW4tc2luZ2xlIikubGVuZ3RofHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMucmVzdWx0c190b2dnbGUoKSk6KHRoaXMuaXNfbXVsdGlwbGUmJnRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgiIiksYSh0aGlzLmNvbnRhaW5lclswXS5vd25lckRvY3VtZW50KS5iaW5kKCJjbGljay5jaG9zZW4iLHRoaXMuY2xpY2tfdGVzdF9hY3Rpb24pLHRoaXMucmVzdWx0c19zaG93KCkpLHRoaXMuYWN0aXZhdGVfZmllbGQoKSl9LENob3Nlbi5wcm90b3R5cGUuY29udGFpbmVyX21vdXNldXA9ZnVuY3Rpb24oYSl7cmV0dXJuIkFCQlIiIT09YS50YXJnZXQubm9kZU5hbWV8fHRoaXMuaXNfZGlzYWJsZWQ/dm9pZCAwOnRoaXMucmVzdWx0c19yZXNldChhKX0sQ2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfcmVzdWx0c19tb3VzZXdoZWVsPWZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBhLm9yaWdpbmFsRXZlbnQmJihiPWEub3JpZ2luYWxFdmVudC5kZWx0YVl8fC1hLm9yaWdpbmFsRXZlbnQud2hlZWxEZWx0YXx8YS5vcmlnaW5hbEV2ZW50LmRldGFpbCksbnVsbCE9Yj8oYS5wcmV2ZW50RGVmYXVsdCgpLCJET01Nb3VzZVNjcm9sbCI9PT1hLnR5cGUmJihiPTQwKmIpLHRoaXMuc2VhcmNoX3Jlc3VsdHMuc2Nyb2xsVG9wKGIrdGhpcy5zZWFyY2hfcmVzdWx0cy5zY3JvbGxUb3AoKSkpOnZvaWQgMH0sQ2hvc2VuLnByb3RvdHlwZS5ibHVyX3Rlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5hY3RpdmVfZmllbGQmJnRoaXMuY29udGFpbmVyLmhhc0NsYXNzKCJjaG9zZW4tY29udGFpbmVyLWFjdGl2ZSIpP3RoaXMuY2xvc2VfZmllbGQoKTp2b2lkIDB9LENob3Nlbi5wcm90b3R5cGUuY2xvc2VfZmllbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLmNvbnRhaW5lclswXS5vd25lckRvY3VtZW50KS51bmJpbmQoImNsaWNrLmNob3NlbiIsdGhpcy5jbGlja190ZXN0X2FjdGlvbiksdGhpcy5hY3RpdmVfZmllbGQ9ITEsdGhpcy5yZXN1bHRzX2hpZGUoKSx0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcygiY2hvc2VuLWNvbnRhaW5lci1hY3RpdmUiKSx0aGlzLmNsZWFyX2JhY2tzdHJva2UoKSx0aGlzLnNob3dfc2VhcmNoX2ZpZWxkX2RlZmF1bHQoKSx0aGlzLnNlYXJjaF9maWVsZF9zY2FsZSgpfSxDaG9zZW4ucHJvdG90eXBlLmFjdGl2YXRlX2ZpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyLmFkZENsYXNzKCJjaG9zZW4tY29udGFpbmVyLWFjdGl2ZSIpLHRoaXMuYWN0aXZlX2ZpZWxkPSEwLHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCh0aGlzLnNlYXJjaF9maWVsZC52YWwoKSksdGhpcy5zZWFyY2hfZmllbGQuZm9jdXMoKX0sQ2hvc2VuLnByb3RvdHlwZS50ZXN0X2FjdGl2ZV9jbGljaz1mdW5jdGlvbihiKXt2YXIgYztyZXR1cm4gYz1hKGIudGFyZ2V0KS5jbG9zZXN0KCIuY2hvc2VuLWNvbnRhaW5lciIpLGMubGVuZ3RoJiZ0aGlzLmNvbnRhaW5lclswXT09PWNbMF0/dGhpcy5hY3RpdmVfZmllbGQ9ITA6dGhpcy5jbG9zZV9maWVsZCgpfSxDaG9zZW4ucHJvdG90eXBlLnJlc3VsdHNfYnVpbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJzaW5nPSEwLHRoaXMuc2VsZWN0ZWRfb3B0aW9uX2NvdW50PW51bGwsdGhpcy5yZXN1bHRzX2RhdGE9U2VsZWN0UGFyc2VyLnNlbGVjdF90b19hcnJheSh0aGlzLmZvcm1fZmllbGQpLHRoaXMuaXNfbXVsdGlwbGU/dGhpcy5zZWFyY2hfY2hvaWNlcy5maW5kKCJsaS5zZWFyY2gtY2hvaWNlIikucmVtb3ZlKCk6dGhpcy5pc19tdWx0aXBsZXx8KHRoaXMuc2luZ2xlX3NldF9zZWxlY3RlZF90ZXh0KCksdGhpcy5kaXNhYmxlX3NlYXJjaHx8dGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnMubGVuZ3RoPD10aGlzLmRpc2FibGVfc2VhcmNoX3RocmVzaG9sZD8odGhpcy5zZWFyY2hfZmllbGRbMF0ucmVhZE9ubHk9ITAsdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoImNob3Nlbi1jb250YWluZXItc2luZ2xlLW5vc2VhcmNoIikpOih0aGlzLnNlYXJjaF9maWVsZFswXS5yZWFkT25seT0hMSx0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcygiY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUtbm9zZWFyY2giKSkpLHRoaXMudXBkYXRlX3Jlc3VsdHNfY29udGVudCh0aGlzLnJlc3VsdHNfb3B0aW9uX2J1aWxkKHtmaXJzdDohMH0pKSx0aGlzLnNlYXJjaF9maWVsZF9kaXNhYmxlZCgpLHRoaXMuc2hvd19zZWFyY2hfZmllbGRfZGVmYXVsdCgpLHRoaXMuc2VhcmNoX2ZpZWxkX3NjYWxlKCksdGhpcy5wYXJzaW5nPSExfSxDaG9zZW4ucHJvdG90eXBlLnJlc3VsdF9kb19oaWdobGlnaHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZjtpZihhLmxlbmd0aCl7aWYodGhpcy5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0KCksdGhpcy5yZXN1bHRfaGlnaGxpZ2h0PWEsdGhpcy5yZXN1bHRfaGlnaGxpZ2h0LmFkZENsYXNzKCJoaWdobGlnaHRlZCIpLGQ9cGFyc2VJbnQodGhpcy5zZWFyY2hfcmVzdWx0cy5jc3MoIm1heEhlaWdodCIpLDEwKSxmPXRoaXMuc2VhcmNoX3Jlc3VsdHMuc2Nyb2xsVG9wKCksZT1kK2YsYz10aGlzLnJlc3VsdF9oaWdobGlnaHQucG9zaXRpb24oKS50b3ArdGhpcy5zZWFyY2hfcmVzdWx0cy5zY3JvbGxUb3AoKSxiPWMrdGhpcy5yZXN1bHRfaGlnaGxpZ2h0Lm91dGVySGVpZ2h0KCksYj49ZSlyZXR1cm4gdGhpcy5zZWFyY2hfcmVzdWx0cy5zY3JvbGxUb3AoYi1kPjA/Yi1kOjApO2lmKGY+YylyZXR1cm4gdGhpcy5zZWFyY2hfcmVzdWx0cy5zY3JvbGxUb3AoYyl9fSxDaG9zZW4ucHJvdG90eXBlLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXN1bHRfaGlnaGxpZ2h0JiZ0aGlzLnJlc3VsdF9oaWdobGlnaHQucmVtb3ZlQ2xhc3MoImhpZ2hsaWdodGVkIiksdGhpcy5yZXN1bHRfaGlnaGxpZ2h0PW51bGx9LENob3Nlbi5wcm90b3R5cGUucmVzdWx0c19zaG93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNfbXVsdGlwbGUmJnRoaXMubWF4X3NlbGVjdGVkX29wdGlvbnM8PXRoaXMuY2hvaWNlc19jb3VudCgpPyh0aGlzLmZvcm1fZmllbGRfanEudHJpZ2dlcigiY2hvc2VuOm1heHNlbGVjdGVkIix7Y2hvc2VuOnRoaXN9KSwhMSk6KHRoaXMuY29udGFpbmVyLmFkZENsYXNzKCJjaG9zZW4td2l0aC1kcm9wIiksdGhpcy5yZXN1bHRzX3Nob3dpbmc9ITAsdGhpcy5zZWFyY2hfZmllbGQuZm9jdXMoKSx0aGlzLnNlYXJjaF9maWVsZC52YWwodGhpcy5zZWFyY2hfZmllbGQudmFsKCkpLHRoaXMud2lubm93X3Jlc3VsdHMoKSx0aGlzLmZvcm1fZmllbGRfanEudHJpZ2dlcigiY2hvc2VuOnNob3dpbmdfZHJvcGRvd24iLHtjaG9zZW46dGhpc30pKX0sQ2hvc2VuLnByb3RvdHlwZS51cGRhdGVfcmVzdWx0c19jb250ZW50PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNlYXJjaF9yZXN1bHRzLmh0bWwoYSl9LENob3Nlbi5wcm90b3R5cGUucmVzdWx0c19oaWRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzdWx0c19zaG93aW5nJiYodGhpcy5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0KCksdGhpcy5jb250YWluZXIucmVtb3ZlQ2xhc3MoImNob3Nlbi13aXRoLWRyb3AiKSx0aGlzLmZvcm1fZmllbGRfanEudHJpZ2dlcigiY2hvc2VuOmhpZGluZ19kcm9wZG93biIse2Nob3Nlbjp0aGlzfSkpLHRoaXMucmVzdWx0c19zaG93aW5nPSExfSxDaG9zZW4ucHJvdG90eXBlLnNldF90YWJfaW5kZXg9ZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gdGhpcy5mb3JtX2ZpZWxkLnRhYkluZGV4PyhhPXRoaXMuZm9ybV9maWVsZC50YWJJbmRleCx0aGlzLmZvcm1fZmllbGQudGFiSW5kZXg9LTEsdGhpcy5zZWFyY2hfZmllbGRbMF0udGFiSW5kZXg9YSk6dm9pZCAwfSxDaG9zZW4ucHJvdG90eXBlLnNldF9sYWJlbF9iZWhhdmlvcj1mdW5jdGlvbigpe3ZhciBiPXRoaXM7cmV0dXJuIHRoaXMuZm9ybV9maWVsZF9sYWJlbD10aGlzLmZvcm1fZmllbGRfanEucGFyZW50cygibGFiZWwiKSwhdGhpcy5mb3JtX2ZpZWxkX2xhYmVsLmxlbmd0aCYmdGhpcy5mb3JtX2ZpZWxkLmlkLmxlbmd0aCYmKHRoaXMuZm9ybV9maWVsZF9sYWJlbD1hKCJsYWJlbFtmb3I9JyIrdGhpcy5mb3JtX2ZpZWxkLmlkKyInXSIpKSx0aGlzLmZvcm1fZmllbGRfbGFiZWwubGVuZ3RoPjA/dGhpcy5mb3JtX2ZpZWxkX2xhYmVsLmJpbmQoImNsaWNrLmNob3NlbiIsZnVuY3Rpb24oYSl7cmV0dXJuIGIuaXNfbXVsdGlwbGU/Yi5jb250YWluZXJfbW91c2Vkb3duKGEpOmIuYWN0aXZhdGVfZmllbGQoKX0pOnZvaWQgMH0sQ2hvc2VuLnByb3RvdHlwZS5zaG93X3NlYXJjaF9maWVsZF9kZWZhdWx0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNfbXVsdGlwbGUmJnRoaXMuY2hvaWNlc19jb3VudCgpPDEmJiF0aGlzLmFjdGl2ZV9maWVsZD8odGhpcy5zZWFyY2hfZmllbGQudmFsKHRoaXMuZGVmYXVsdF90ZXh0KSx0aGlzLnNlYXJjaF9maWVsZC5hZGRDbGFzcygiZGVmYXVsdCIpKToodGhpcy5zZWFyY2hfZmllbGQudmFsKCIiKSx0aGlzLnNlYXJjaF9maWVsZC5yZW1vdmVDbGFzcygiZGVmYXVsdCIpKX0sQ2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfcmVzdWx0c19tb3VzZXVwPWZ1bmN0aW9uKGIpe3ZhciBjO3JldHVybiBjPWEoYi50YXJnZXQpLmhhc0NsYXNzKCJhY3RpdmUtcmVzdWx0Iik/YShiLnRhcmdldCk6YShiLnRhcmdldCkucGFyZW50cygiLmFjdGl2ZS1yZXN1bHQiKS5maXJzdCgpLGMubGVuZ3RoPyh0aGlzLnJlc3VsdF9oaWdobGlnaHQ9Yyx0aGlzLnJlc3VsdF9zZWxlY3QoYiksdGhpcy5zZWFyY2hfZmllbGQuZm9jdXMoKSk6dm9pZCAwfSxDaG9zZW4ucHJvdG90eXBlLnNlYXJjaF9yZXN1bHRzX21vdXNlb3Zlcj1mdW5jdGlvbihiKXt2YXIgYztyZXR1cm4gYz1hKGIudGFyZ2V0KS5oYXNDbGFzcygiYWN0aXZlLXJlc3VsdCIpP2EoYi50YXJnZXQpOmEoYi50YXJnZXQpLnBhcmVudHMoIi5hY3RpdmUtcmVzdWx0IikuZmlyc3QoKSxjP3RoaXMucmVzdWx0X2RvX2hpZ2hsaWdodChjKTp2b2lkIDB9LENob3Nlbi5wcm90b3R5cGUuc2VhcmNoX3Jlc3VsdHNfbW91c2VvdXQ9ZnVuY3Rpb24oYil7cmV0dXJuIGEoYi50YXJnZXQpLmhhc0NsYXNzKCJhY3RpdmUtcmVzdWx0Iik/dGhpcy5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0KCk6dm9pZCAwfSxDaG9zZW4ucHJvdG90eXBlLmNob2ljZV9idWlsZD1mdW5jdGlvbihiKXt2YXIgYyxkLGU9dGhpcztyZXR1cm4gYz1hKCI8bGkgLz4iLHsiY2xhc3MiOiJzZWFyY2gtY2hvaWNlIn0pLmh0bWwoIjxzcGFuPiIrYi5odG1sKyI8L3NwYW4+IiksYi5kaXNhYmxlZD9jLmFkZENsYXNzKCJzZWFyY2gtY2hvaWNlLWRpc2FibGVkIik6KGQ9YSgiPGEgLz4iLHsiY2xhc3MiOiJzZWFyY2gtY2hvaWNlLWNsb3NlIiwiZGF0YS1vcHRpb24tYXJyYXktaW5kZXgiOmIuYXJyYXlfaW5kZXh9KSxkLmJpbmQoImNsaWNrLmNob3NlbiIsZnVuY3Rpb24oYSl7cmV0dXJuIGUuY2hvaWNlX2Rlc3Ryb3lfbGlua19jbGljayhhKX0pLGMuYXBwZW5kKGQpKSx0aGlzLnNlYXJjaF9jb250YWluZXIuYmVmb3JlKGMpfSxDaG9zZW4ucHJvdG90eXBlLmNob2ljZV9kZXN0cm95X2xpbmtfY2xpY2s9ZnVuY3Rpb24oYil7cmV0dXJuIGIucHJldmVudERlZmF1bHQoKSxiLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuaXNfZGlzYWJsZWQ/dm9pZCAwOnRoaXMuY2hvaWNlX2Rlc3Ryb3koYShiLnRhcmdldCkpfSxDaG9zZW4ucHJvdG90eXBlLmNob2ljZV9kZXN0cm95PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlc3VsdF9kZXNlbGVjdChhWzBdLmdldEF0dHJpYnV0ZSgiZGF0YS1vcHRpb24tYXJyYXktaW5kZXgiKSk/KHRoaXMuc2hvd19zZWFyY2hfZmllbGRfZGVmYXVsdCgpLHRoaXMuaXNfbXVsdGlwbGUmJnRoaXMuY2hvaWNlc19jb3VudCgpPjAmJnRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgpLmxlbmd0aDwxJiZ0aGlzLnJlc3VsdHNfaGlkZSgpLGEucGFyZW50cygibGkiKS5maXJzdCgpLnJlbW92ZSgpLHRoaXMuc2VhcmNoX2ZpZWxkX3NjYWxlKCkpOnZvaWQgMH0sQ2hvc2VuLnByb3RvdHlwZS5yZXN1bHRzX3Jlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzZXRfc2luZ2xlX3NlbGVjdF9vcHRpb25zKCksdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbMF0uc2VsZWN0ZWQ9ITAsdGhpcy5zaW5nbGVfc2V0X3NlbGVjdGVkX3RleHQoKSx0aGlzLnNob3dfc2VhcmNoX2ZpZWxkX2RlZmF1bHQoKSx0aGlzLnJlc3VsdHNfcmVzZXRfY2xlYW51cCgpLHRoaXMuZm9ybV9maWVsZF9qcS50cmlnZ2VyKCJjaGFuZ2UiKSx0aGlzLmFjdGl2ZV9maWVsZD90aGlzLnJlc3VsdHNfaGlkZSgpOnZvaWQgMH0sQ2hvc2VuLnByb3RvdHlwZS5yZXN1bHRzX3Jlc2V0X2NsZWFudXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJyZW50X3NlbGVjdGVkSW5kZXg9dGhpcy5mb3JtX2ZpZWxkLnNlbGVjdGVkSW5kZXgsdGhpcy5zZWxlY3RlZF9pdGVtLmZpbmQoImFiYnIiKS5yZW1vdmUoKX0sQ2hvc2VuLnByb3RvdHlwZS5yZXN1bHRfc2VsZWN0PWZ1bmN0aW9uKGEpe3ZhciBiLGM7cmV0dXJuIHRoaXMucmVzdWx0X2hpZ2hsaWdodD8oYj10aGlzLnJlc3VsdF9oaWdobGlnaHQsdGhpcy5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0KCksdGhpcy5pc19tdWx0aXBsZSYmdGhpcy5tYXhfc2VsZWN0ZWRfb3B0aW9uczw9dGhpcy5jaG9pY2VzX2NvdW50KCk/KHRoaXMuZm9ybV9maWVsZF9qcS50cmlnZ2VyKCJjaG9zZW46bWF4c2VsZWN0ZWQiLHtjaG9zZW46dGhpc30pLCExKToodGhpcy5pc19tdWx0aXBsZT9iLnJlbW92ZUNsYXNzKCJhY3RpdmUtcmVzdWx0Iik6dGhpcy5yZXNldF9zaW5nbGVfc2VsZWN0X29wdGlvbnMoKSxjPXRoaXMucmVzdWx0c19kYXRhW2JbMF0uZ2V0QXR0cmlidXRlKCJkYXRhLW9wdGlvbi1hcnJheS1pbmRleCIpXSxjLnNlbGVjdGVkPSEwLHRoaXMuZm9ybV9maWVsZC5vcHRpb25zW2Mub3B0aW9uc19pbmRleF0uc2VsZWN0ZWQ9ITAsdGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQ9bnVsbCx0aGlzLmlzX211bHRpcGxlP3RoaXMuY2hvaWNlX2J1aWxkKGMpOnRoaXMuc2luZ2xlX3NldF9zZWxlY3RlZF90ZXh0KGMudGV4dCksKGEubWV0YUtleXx8YS5jdHJsS2V5KSYmdGhpcy5pc19tdWx0aXBsZXx8dGhpcy5yZXN1bHRzX2hpZGUoKSx0aGlzLnNlYXJjaF9maWVsZC52YWwoIiIpLCh0aGlzLmlzX211bHRpcGxlfHx0aGlzLmZvcm1fZmllbGQuc2VsZWN0ZWRJbmRleCE9PXRoaXMuY3VycmVudF9zZWxlY3RlZEluZGV4KSYmdGhpcy5mb3JtX2ZpZWxkX2pxLnRyaWdnZXIoImNoYW5nZSIse3NlbGVjdGVkOnRoaXMuZm9ybV9maWVsZC5vcHRpb25zW2Mub3B0aW9uc19pbmRleF0udmFsdWV9KSx0aGlzLmN1cnJlbnRfc2VsZWN0ZWRJbmRleD10aGlzLmZvcm1fZmllbGQuc2VsZWN0ZWRJbmRleCx0aGlzLnNlYXJjaF9maWVsZF9zY2FsZSgpKSk6dm9pZCAwfSxDaG9zZW4ucHJvdG90eXBlLnNpbmdsZV9zZXRfc2VsZWN0ZWRfdGV4dD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YSYmKGE9dGhpcy5kZWZhdWx0X3RleHQpLGE9PT10aGlzLmRlZmF1bHRfdGV4dD90aGlzLnNlbGVjdGVkX2l0ZW0uYWRkQ2xhc3MoImNob3Nlbi1kZWZhdWx0Iik6KHRoaXMuc2luZ2xlX2Rlc2VsZWN0X2NvbnRyb2xfYnVpbGQoKSx0aGlzLnNlbGVjdGVkX2l0ZW0ucmVtb3ZlQ2xhc3MoImNob3Nlbi1kZWZhdWx0IikpLHRoaXMuc2VsZWN0ZWRfaXRlbS5maW5kKCJzcGFuIikudGV4dChhKX0sQ2hvc2VuLnByb3RvdHlwZS5yZXN1bHRfZGVzZWxlY3Q9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGI9dGhpcy5yZXN1bHRzX2RhdGFbYV0sdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbYi5vcHRpb25zX2luZGV4XS5kaXNhYmxlZD8hMTooYi5zZWxlY3RlZD0hMSx0aGlzLmZvcm1fZmllbGQub3B0aW9uc1tiLm9wdGlvbnNfaW5kZXhdLnNlbGVjdGVkPSExLHRoaXMuc2VsZWN0ZWRfb3B0aW9uX2NvdW50PW51bGwsdGhpcy5yZXN1bHRfY2xlYXJfaGlnaGxpZ2h0KCksdGhpcy5yZXN1bHRzX3Nob3dpbmcmJnRoaXMud2lubm93X3Jlc3VsdHMoKSx0aGlzLmZvcm1fZmllbGRfanEudHJpZ2dlcigiY2hhbmdlIix7ZGVzZWxlY3RlZDp0aGlzLmZvcm1fZmllbGQub3B0aW9uc1tiLm9wdGlvbnNfaW5kZXhdLnZhbHVlfSksdGhpcy5zZWFyY2hfZmllbGRfc2NhbGUoKSwhMCl9LENob3Nlbi5wcm90b3R5cGUuc2luZ2xlX2Rlc2VsZWN0X2NvbnRyb2xfYnVpbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbGxvd19zaW5nbGVfZGVzZWxlY3Q/KHRoaXMuc2VsZWN0ZWRfaXRlbS5maW5kKCJhYmJyIikubGVuZ3RofHx0aGlzLnNlbGVjdGVkX2l0ZW0uZmluZCgic3BhbiIpLmZpcnN0KCkuYWZ0ZXIoJzxhYmJyIGNsYXNzPSJzZWFyY2gtY2hvaWNlLWNsb3NlIj48L2FiYnI+JyksdGhpcy5zZWxlY3RlZF9pdGVtLmFkZENsYXNzKCJjaG9zZW4tc2luZ2xlLXdpdGgtZGVzZWxlY3QiKSk6dm9pZCAwfSxDaG9zZW4ucHJvdG90eXBlLmdldF9zZWFyY2hfdGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlYXJjaF9maWVsZC52YWwoKT09PXRoaXMuZGVmYXVsdF90ZXh0PyIiOmEoIjxkaXYvPiIpLnRleHQoYS50cmltKHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgpKSkuaHRtbCgpfSxDaG9zZW4ucHJvdG90eXBlLndpbm5vd19yZXN1bHRzX3NldF9oaWdobGlnaHQ9ZnVuY3Rpb24oKXt2YXIgYSxiO3JldHVybiBiPXRoaXMuaXNfbXVsdGlwbGU/W106dGhpcy5zZWFyY2hfcmVzdWx0cy5maW5kKCIucmVzdWx0LXNlbGVjdGVkLmFjdGl2ZS1yZXN1bHQiKSxhPWIubGVuZ3RoP2IuZmlyc3QoKTp0aGlzLnNlYXJjaF9yZXN1bHRzLmZpbmQoIi5hY3RpdmUtcmVzdWx0IikuZmlyc3QoKSxudWxsIT1hP3RoaXMucmVzdWx0X2RvX2hpZ2hsaWdodChhKTp2b2lkIDB9LENob3Nlbi5wcm90b3R5cGUubm9fcmVzdWx0cz1mdW5jdGlvbihiKXt2YXIgYztyZXR1cm4gYz1hKCc8bGkgY2xhc3M9Im5vLXJlc3VsdHMiPicrdGhpcy5yZXN1bHRzX25vbmVfZm91bmQrJyAiPHNwYW4+PC9zcGFuPiI8L2xpPicpLGMuZmluZCgic3BhbiIpLmZpcnN0KCkuaHRtbChiKSx0aGlzLnNlYXJjaF9yZXN1bHRzLmFwcGVuZChjKSx0aGlzLmZvcm1fZmllbGRfanEudHJpZ2dlcigiY2hvc2VuOm5vX3Jlc3VsdHMiLHtjaG9zZW46dGhpc30pfSxDaG9zZW4ucHJvdG90eXBlLm5vX3Jlc3VsdHNfY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWFyY2hfcmVzdWx0cy5maW5kKCIubm8tcmVzdWx0cyIpLnJlbW92ZSgpfSxDaG9zZW4ucHJvdG90eXBlLmtleWRvd25fYXJyb3c9ZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gdGhpcy5yZXN1bHRzX3Nob3dpbmcmJnRoaXMucmVzdWx0X2hpZ2hsaWdodD8oYT10aGlzLnJlc3VsdF9oaWdobGlnaHQubmV4dEFsbCgibGkuYWN0aXZlLXJlc3VsdCIpLmZpcnN0KCkpP3RoaXMucmVzdWx0X2RvX2hpZ2hsaWdodChhKTp2b2lkIDA6dGhpcy5yZXN1bHRzX3Nob3coKX0sQ2hvc2VuLnByb3RvdHlwZS5rZXl1cF9hcnJvdz1mdW5jdGlvbigpe3ZhciBhO3JldHVybiB0aGlzLnJlc3VsdHNfc2hvd2luZ3x8dGhpcy5pc19tdWx0aXBsZT90aGlzLnJlc3VsdF9oaWdobGlnaHQ/KGE9dGhpcy5yZXN1bHRfaGlnaGxpZ2h0LnByZXZBbGwoImxpLmFjdGl2ZS1yZXN1bHQiKSxhLmxlbmd0aD90aGlzLnJlc3VsdF9kb19oaWdobGlnaHQoYS5maXJzdCgpKToodGhpcy5jaG9pY2VzX2NvdW50KCk+MCYmdGhpcy5yZXN1bHRzX2hpZGUoKSx0aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKSkpOnZvaWQgMDp0aGlzLnJlc3VsdHNfc2hvdygpfSxDaG9zZW4ucHJvdG90eXBlLmtleWRvd25fYmFja3N0cm9rZT1mdW5jdGlvbigpe3ZhciBhO3JldHVybiB0aGlzLnBlbmRpbmdfYmFja3N0cm9rZT8odGhpcy5jaG9pY2VfZGVzdHJveSh0aGlzLnBlbmRpbmdfYmFja3N0cm9rZS5maW5kKCJhIikuZmlyc3QoKSksdGhpcy5jbGVhcl9iYWNrc3Ryb2tlKCkpOihhPXRoaXMuc2VhcmNoX2NvbnRhaW5lci5zaWJsaW5ncygibGkuc2VhcmNoLWNob2ljZSIpLmxhc3QoKSxhLmxlbmd0aCYmIWEuaGFzQ2xhc3MoInNlYXJjaC1jaG9pY2UtZGlzYWJsZWQiKT8odGhpcy5wZW5kaW5nX2JhY2tzdHJva2U9YSx0aGlzLnNpbmdsZV9iYWNrc3Ryb2tlX2RlbGV0ZT90aGlzLmtleWRvd25fYmFja3N0cm9rZSgpOnRoaXMucGVuZGluZ19iYWNrc3Ryb2tlLmFkZENsYXNzKCJzZWFyY2gtY2hvaWNlLWZvY3VzIikpOnZvaWQgMCl9LENob3Nlbi5wcm90b3R5cGUuY2xlYXJfYmFja3N0cm9rZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBlbmRpbmdfYmFja3N0cm9rZSYmdGhpcy5wZW5kaW5nX2JhY2tzdHJva2UucmVtb3ZlQ2xhc3MoInNlYXJjaC1jaG9pY2UtZm9jdXMiKSx0aGlzLnBlbmRpbmdfYmFja3N0cm9rZT1udWxsfSxDaG9zZW4ucHJvdG90eXBlLmtleWRvd25fY2hlY2tlcj1mdW5jdGlvbihhKXt2YXIgYixjO3N3aXRjaChiPW51bGwhPShjPWEud2hpY2gpP2M6YS5rZXlDb2RlLHRoaXMuc2VhcmNoX2ZpZWxkX3NjYWxlKCksOCE9PWImJnRoaXMucGVuZGluZ19iYWNrc3Ryb2tlJiZ0aGlzLmNsZWFyX2JhY2tzdHJva2UoKSxiKXtjYXNlIDg6dGhpcy5iYWNrc3Ryb2tlX2xlbmd0aD10aGlzLnNlYXJjaF9maWVsZC52YWwoKS5sZW5ndGg7YnJlYWs7Y2FzZSA5OnRoaXMucmVzdWx0c19zaG93aW5nJiYhdGhpcy5pc19tdWx0aXBsZSYmdGhpcy5yZXN1bHRfc2VsZWN0KGEpLHRoaXMubW91c2Vfb25fY29udGFpbmVyPSExO2JyZWFrO2Nhc2UgMTM6dGhpcy5yZXN1bHRzX3Nob3dpbmcmJmEucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIDMyOnRoaXMuZGlzYWJsZV9zZWFyY2gmJmEucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIDM4OmEucHJldmVudERlZmF1bHQoKSx0aGlzLmtleXVwX2Fycm93KCk7YnJlYWs7Y2FzZSA0MDphLnByZXZlbnREZWZhdWx0KCksdGhpcy5rZXlkb3duX2Fycm93KCl9fSxDaG9zZW4ucHJvdG90eXBlLnNlYXJjaF9maWVsZF9zY2FsZT1mdW5jdGlvbigpe3ZhciBiLGMsZCxlLGYsZyxoLGksajtpZih0aGlzLmlzX211bHRpcGxlKXtmb3IoZD0wLGg9MCxmPSJwb3NpdGlvbjphYnNvbHV0ZTsgbGVmdDogLTEwMDBweDsgdG9wOiAtMTAwMHB4OyBkaXNwbGF5Om5vbmU7IixnPVsiZm9udC1zaXplIiwiZm9udC1zdHlsZSIsImZvbnQtd2VpZ2h0IiwiZm9udC1mYW1pbHkiLCJsaW5lLWhlaWdodCIsInRleHQtdHJhbnNmb3JtIiwibGV0dGVyLXNwYWNpbmciXSxpPTAsaj1nLmxlbmd0aDtqPmk7aSsrKWU9Z1tpXSxmKz1lKyI6Iit0aGlzLnNlYXJjaF9maWVsZC5jc3MoZSkrIjsiO3JldHVybiBiPWEoIjxkaXYgLz4iLHtzdHlsZTpmfSksYi50ZXh0KHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgpKSxhKCJib2R5IikuYXBwZW5kKGIpLGg9Yi53aWR0aCgpKzI1LGIucmVtb3ZlKCksYz10aGlzLmNvbnRhaW5lci5vdXRlcldpZHRoKCksaD5jLTEwJiYoaD1jLTEwKSx0aGlzLnNlYXJjaF9maWVsZC5jc3Moe3dpZHRoOmgrInB4In0pfX0sQ2hvc2VufShBYnN0cmFjdENob3Nlbil9LmNhbGwodGhpcyk7DQorLyoKKworQ2hvc2VuCisKKy0gYnkgUGF0cmljayBGaWxsZXIgZm9yIEhhcnZlc3QgaHR0cDovL2dldGhhcnZlc3QuY29tCistIENvcHlyaWdodCAoYykgMjAxMS0yMDEzIGJ5IEhhcnZlc3QKKworQXZhaWxhYmxlIGZvciB1c2UgdW5kZXIgdGhlIE1JVCBMaWNlbnNlCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorCisqLworLyogQ2hvc2VuIHYxLjMuMCB8IChjKSAyMDExLTIwMTQgYnkgSGFydmVzdCB8IE1JVCBMaWNlbnNlLCBodHRwczovL2dpdGh1Yi5jb20vaGFydmVzdGhxL2Nob3Nlbi9ibG9iL21hc3Rlci9MSUNFTlNFLm1kICovCishZnVuY3Rpb24oKXt2YXIgYSxBYnN0cmFjdENob3NlbixDaG9zZW4sU2VsZWN0UGFyc2VyLGIsYz17fS5oYXNPd25Qcm9wZXJ0eSxkPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZCgpe3RoaXMuY29uc3RydWN0b3I9YX1mb3IodmFyIGUgaW4gYiljLmNhbGwoYixlKSYmKGFbZV09YltlXSk7cmV0dXJuIGQucHJvdG90eXBlPWIucHJvdG90eXBlLGEucHJvdG90eXBlPW5ldyBkLGEuX19zdXBlcl9fPWIucHJvdG90eXBlLGF9O1NlbGVjdFBhcnNlcj1mdW5jdGlvbigpe2Z1bmN0aW9uIFNlbGVjdFBhcnNlcigpe3RoaXMub3B0aW9uc19pbmRleD0wLHRoaXMucGFyc2VkPVtdfXJldHVybiBTZWxlY3RQYXJzZXIucHJvdG90eXBlLmFkZF9ub2RlPWZ1bmN0aW9uKGEpe3JldHVybiJPUFRHUk9VUCI9PT1hLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk/dGhpcy5hZGRfZ3JvdXAoYSk6dGhpcy5hZGRfb3B0aW9uKGEpfSxTZWxlY3RQYXJzZXIucHJvdG90eXBlLmFkZF9ncm91cD1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGc7Zm9yKGI9dGhpcy5wYXJzZWQubGVuZ3RoLHRoaXMucGFyc2VkLnB1c2goe2FycmF5X2luZGV4OmIsZ3JvdXA6ITAsbGFiZWw6dGhpcy5lc2NhcGVFeHByZXNzaW9uKGEubGFiZWwpLGNoaWxkcmVuOjAsZGlzYWJsZWQ6YS5kaXNhYmxlZCxjbGFzc2VzOmEuY2xhc3NOYW1lfSksZj1hLmNoaWxkTm9kZXMsZz1bXSxkPTAsZT1mLmxlbmd0aDtlPmQ7ZCsrKWM9ZltkXSxnLnB1c2godGhpcy5hZGRfb3B0aW9uKGMsYixhLmRpc2FibGVkKSk7cmV0dXJuIGd9LFNlbGVjdFBhcnNlci5wcm90b3R5cGUuYWRkX29wdGlvbj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIk9QVElPTiI9PT1hLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk/KCIiIT09YS50ZXh0PyhudWxsIT1iJiYodGhpcy5wYXJzZWRbYl0uY2hpbGRyZW4rPTEpLHRoaXMucGFyc2VkLnB1c2goe2FycmF5X2luZGV4OnRoaXMucGFyc2VkLmxlbmd0aCxvcHRpb25zX2luZGV4OnRoaXMub3B0aW9uc19pbmRleCx2YWx1ZTphLnZhbHVlLHRleHQ6YS50ZXh0LGh0bWw6YS5pbm5lckhUTUwsc2VsZWN0ZWQ6YS5zZWxlY3RlZCxkaXNhYmxlZDpjPT09ITA/YzphLmRpc2FibGVkLGdyb3VwX2FycmF5X2luZGV4OmIsY2xhc3NlczphLmNsYXNzTmFtZSxzdHlsZTphLnN0eWxlLmNzc1RleHR9KSk6dGhpcy5wYXJzZWQucHVzaCh7YXJyYXlfaW5kZXg6dGhpcy5wYXJzZWQubGVuZ3RoLG9wdGlvbnNfaW5kZXg6dGhpcy5vcHRpb25zX2luZGV4LGVtcHR5OiEwfSksdGhpcy5vcHRpb25zX2luZGV4Kz0xKTp2b2lkIDB9LFNlbGVjdFBhcnNlci5wcm90b3R5cGUuZXNjYXBlRXhwcmVzc2lvbj1mdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiBudWxsPT1hfHxhPT09ITE/IiI6L1tcJlw8XD5cIlwnXGBdLy50ZXN0KGEpPyhiPXsiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsiLCInIjoiJiN4Mjc7IiwiYCI6IiYjeDYwOyJ9LGM9LyYoPyFcdys7KXxbXDxcPlwiXCdcYF0vZyxhLnJlcGxhY2UoYyxmdW5jdGlvbihhKXtyZXR1cm4gYlthXXx8IiZhbXA7In0pKTphfSxTZWxlY3RQYXJzZXJ9KCksU2VsZWN0UGFyc2VyLnNlbGVjdF90b19hcnJheT1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmO2ZvcihjPW5ldyBTZWxlY3RQYXJzZXIsZj1hLmNoaWxkTm9kZXMsZD0wLGU9Zi5sZW5ndGg7ZT5kO2QrKyliPWZbZF0sYy5hZGRfbm9kZShiKTtyZXR1cm4gYy5wYXJzZWR9LEFic3RyYWN0Q2hvc2VuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQWJzdHJhY3RDaG9zZW4oYSxiKXt0aGlzLmZvcm1fZmllbGQ9YSx0aGlzLm9wdGlvbnM9bnVsbCE9Yj9iOnt9LEFic3RyYWN0Q2hvc2VuLmJyb3dzZXJfaXNfc3VwcG9ydGVkKCkmJih0aGlzLmlzX211bHRpcGxlPXRoaXMuZm9ybV9maWVsZC5tdWx0aXBsZSx0aGlzLnNldF9kZWZhdWx0X3RleHQoKSx0aGlzLnNldF9kZWZhdWx0X3ZhbHVlcygpLHRoaXMuc2V0dXAoKSx0aGlzLnNldF91cF9odG1sKCksdGhpcy5yZWdpc3Rlcl9vYnNlcnZlcnMoKSx0aGlzLm9uX3JlYWR5KCkpfXJldHVybiBBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUuc2V0X2RlZmF1bHRfdmFsdWVzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gdGhpcy5jbGlja190ZXN0X2FjdGlvbj1mdW5jdGlvbihiKXtyZXR1cm4gYS50ZXN0X2FjdGl2ZV9jbGljayhiKX0sdGhpcy5hY3RpdmF0ZV9hY3Rpb249ZnVuY3Rpb24oYil7cmV0dXJuIGEuYWN0aXZhdGVfZmllbGQoYil9LHRoaXMuYWN0aXZlX2ZpZWxkPSExLHRoaXMubW91c2Vfb25fY29udGFpbmVyPSExLHRoaXMucmVzdWx0c19zaG93aW5nPSExLHRoaXMucmVzdWx0X2hpZ2hsaWdodGVkPW51bGwsdGhpcy5hbGxvd19zaW5nbGVfZGVzZWxlY3Q9bnVsbCE9dGhpcy5vcHRpb25zLmFsbG93X3NpbmdsZV9kZXNlbGVjdCYmbnVsbCE9dGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbMF0mJiIiPT09dGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbMF0udGV4dD90aGlzLm9wdGlvbnMuYWxsb3dfc2luZ2xlX2Rlc2VsZWN0OiExLHRoaXMuZGlzYWJsZV9zZWFyY2hfdGhyZXNob2xkPXRoaXMub3B0aW9ucy5kaXNhYmxlX3NlYXJjaF90aHJlc2hvbGR8fDAsdGhpcy5kaXNhYmxlX3NlYXJjaD10aGlzLm9wdGlvbnMuZGlzYWJsZV9zZWFyY2h8fCExLHRoaXMuZW5hYmxlX3NwbGl0X3dvcmRfc2VhcmNoPW51bGwhPXRoaXMub3B0aW9ucy5lbmFibGVfc3BsaXRfd29yZF9zZWFyY2g/dGhpcy5vcHRpb25zLmVuYWJsZV9zcGxpdF93b3JkX3NlYXJjaDohMCx0aGlzLmdyb3VwX3NlYXJjaD1udWxsIT10aGlzLm9wdGlvbnMuZ3JvdXBfc2VhcmNoP3RoaXMub3B0aW9ucy5ncm91cF9zZWFyY2g6ITAsdGhpcy5zZWFyY2hfY29udGFpbnM9dGhpcy5vcHRpb25zLnNlYXJjaF9jb250YWluc3x8ITEsdGhpcy5zaW5nbGVfYmFja3N0cm9rZV9kZWxldGU9bnVsbCE9dGhpcy5vcHRpb25zLnNpbmdsZV9iYWNrc3Ryb2tlX2RlbGV0ZT90aGlzLm9wdGlvbnMuc2luZ2xlX2JhY2tzdHJva2VfZGVsZXRlOiEwLHRoaXMubWF4X3NlbGVjdGVkX29wdGlvbnM9dGhpcy5vcHRpb25zLm1heF9zZWxlY3RlZF9vcHRpb25zfHwxLzAsdGhpcy5pbmhlcml0X3NlbGVjdF9jbGFzc2VzPXRoaXMub3B0aW9ucy5pbmhlcml0X3NlbGVjdF9jbGFzc2VzfHwhMSx0aGlzLmRpc3BsYXlfc2VsZWN0ZWRfb3B0aW9ucz1udWxsIT10aGlzLm9wdGlvbnMuZGlzcGxheV9zZWxlY3RlZF9vcHRpb25zP3RoaXMub3B0aW9ucy5kaXNwbGF5X3NlbGVjdGVkX29wdGlvbnM6ITAsdGhpcy5kaXNwbGF5X2Rpc2FibGVkX29wdGlvbnM9bnVsbCE9dGhpcy5vcHRpb25zLmRpc3BsYXlfZGlzYWJsZWRfb3B0aW9ucz90aGlzLm9wdGlvbnMuZGlzcGxheV9kaXNhYmxlZF9vcHRpb25zOiEwfSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUuc2V0X2RlZmF1bHRfdGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmF1bHRfdGV4dD10aGlzLmZvcm1fZmllbGQuZ2V0QXR0cmlidXRlKCJkYXRhLXBsYWNlaG9sZGVyIik/dGhpcy5mb3JtX2ZpZWxkLmdldEF0dHJpYnV0ZSgiZGF0YS1wbGFjZWhvbGRlciIpOnRoaXMuaXNfbXVsdGlwbGU/dGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyX3RleHRfbXVsdGlwbGV8fHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcl90ZXh0fHxBYnN0cmFjdENob3Nlbi5kZWZhdWx0X211bHRpcGxlX3RleHQ6dGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyX3RleHRfc2luZ2xlfHx0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXJfdGV4dHx8QWJzdHJhY3RDaG9zZW4uZGVmYXVsdF9zaW5nbGVfdGV4dCx0aGlzLnJlc3VsdHNfbm9uZV9mb3VuZD10aGlzLmZvcm1fZmllbGQuZ2V0QXR0cmlidXRlKCJkYXRhLW5vX3Jlc3VsdHNfdGV4dCIpfHx0aGlzLm9wdGlvbnMubm9fcmVzdWx0c190ZXh0fHxBYnN0cmFjdENob3Nlbi5kZWZhdWx0X25vX3Jlc3VsdF90ZXh0fSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUubW91c2VfZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb3VzZV9vbl9jb250YWluZXI9ITB9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5tb3VzZV9sZWF2ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1vdXNlX29uX2NvbnRhaW5lcj0hMX0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLmlucHV0X2ZvY3VzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztpZih0aGlzLmlzX211bHRpcGxlKXtpZighdGhpcy5hY3RpdmVfZmllbGQpcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gYS5jb250YWluZXJfbW91c2Vkb3duKCl9LDUwKX1lbHNlIGlmKCF0aGlzLmFjdGl2ZV9maWVsZClyZXR1cm4gdGhpcy5hY3RpdmF0ZV9maWVsZCgpfSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUuaW5wdXRfYmx1cj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIHRoaXMubW91c2Vfb25fY29udGFpbmVyP3ZvaWQgMDoodGhpcy5hY3RpdmVfZmllbGQ9ITEsc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBhLmJsdXJfdGVzdCgpfSwxMDApKX0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnJlc3VsdHNfb3B0aW9uX2J1aWxkPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGY7Zm9yKGI9IiIsZj10aGlzLnJlc3VsdHNfZGF0YSxkPTAsZT1mLmxlbmd0aDtlPmQ7ZCsrKWM9ZltkXSxiKz1jLmdyb3VwP3RoaXMucmVzdWx0X2FkZF9ncm91cChjKTp0aGlzLnJlc3VsdF9hZGRfb3B0aW9uKGMpLChudWxsIT1hP2EuZmlyc3Q6dm9pZCAwKSYmKGMuc2VsZWN0ZWQmJnRoaXMuaXNfbXVsdGlwbGU/dGhpcy5jaG9pY2VfYnVpbGQoYyk6Yy5zZWxlY3RlZCYmIXRoaXMuaXNfbXVsdGlwbGUmJnRoaXMuc2luZ2xlX3NldF9zZWxlY3RlZF90ZXh0KGMudGV4dCkpO3JldHVybiBifSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzdWx0X2FkZF9vcHRpb249ZnVuY3Rpb24oYSl7dmFyIGIsYztyZXR1cm4gYS5zZWFyY2hfbWF0Y2g/dGhpcy5pbmNsdWRlX29wdGlvbl9pbl9yZXN1bHRzKGEpPyhiPVtdLGEuZGlzYWJsZWR8fGEuc2VsZWN0ZWQmJnRoaXMuaXNfbXVsdGlwbGV8fGIucHVzaCgiYWN0aXZlLXJlc3VsdCIpLCFhLmRpc2FibGVkfHxhLnNlbGVjdGVkJiZ0aGlzLmlzX211bHRpcGxlfHxiLnB1c2goImRpc2FibGVkLXJlc3VsdCIpLGEuc2VsZWN0ZWQmJmIucHVzaCgicmVzdWx0LXNlbGVjdGVkIiksbnVsbCE9YS5ncm91cF9hcnJheV9pbmRleCYmYi5wdXNoKCJncm91cC1vcHRpb24iKSwiIiE9PWEuY2xhc3NlcyYmYi5wdXNoKGEuY2xhc3NlcyksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpLGMuY2xhc3NOYW1lPWIuam9pbigiICIpLGMuc3R5bGUuY3NzVGV4dD1hLnN0eWxlLGMuc2V0QXR0cmlidXRlKCJkYXRhLW9wdGlvbi1hcnJheS1pbmRleCIsYS5hcnJheV9pbmRleCksYy5pbm5lckhUTUw9YS5zZWFyY2hfdGV4dCx0aGlzLm91dGVySFRNTChjKSk6IiI6IiJ9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5yZXN1bHRfYWRkX2dyb3VwPWZ1bmN0aW9uKGEpe3ZhciBiLGM7cmV0dXJuIGEuc2VhcmNoX21hdGNofHxhLmdyb3VwX21hdGNoP2EuYWN0aXZlX29wdGlvbnM+MD8oYj1bXSxiLnB1c2goImdyb3VwLXJlc3VsdCIpLGEuY2xhc3NlcyYmYi5wdXNoKGEuY2xhc3NlcyksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpLGMuY2xhc3NOYW1lPWIuam9pbigiICIpLGMuaW5uZXJIVE1MPWEuc2VhcmNoX3RleHQsdGhpcy5vdXRlckhUTUwoYykpOiIiOiIifSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzdWx0c191cGRhdGVfZmllbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXRfZGVmYXVsdF90ZXh0KCksdGhpcy5pc19tdWx0aXBsZXx8dGhpcy5yZXN1bHRzX3Jlc2V0X2NsZWFudXAoKSx0aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKSx0aGlzLnJlc3VsdHNfYnVpbGQoKSx0aGlzLnJlc3VsdHNfc2hvd2luZz90aGlzLndpbm5vd19yZXN1bHRzKCk6dm9pZCAwfSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzZXRfc2luZ2xlX3NlbGVjdF9vcHRpb25zPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZTtmb3IoZD10aGlzLnJlc3VsdHNfZGF0YSxlPVtdLGI9MCxjPWQubGVuZ3RoO2M+YjtiKyspYT1kW2JdLGEuc2VsZWN0ZWQ/ZS5wdXNoKGEuc2VsZWN0ZWQ9ITEpOmUucHVzaCh2b2lkIDApO3JldHVybiBlfSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzdWx0c190b2dnbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXN1bHRzX3Nob3dpbmc/dGhpcy5yZXN1bHRzX2hpZGUoKTp0aGlzLnJlc3VsdHNfc2hvdygpfSxBYnN0cmFjdENob3Nlbi5wcm90b3R5cGUucmVzdWx0c19zZWFyY2g9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXN1bHRzX3Nob3dpbmc/dGhpcy53aW5ub3dfcmVzdWx0cygpOnRoaXMucmVzdWx0c19zaG93KCl9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS53aW5ub3dfcmVzdWx0cz1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnLGgsaSxqLGssbDtmb3IodGhpcy5ub19yZXN1bHRzX2NsZWFyKCksZD0wLGY9dGhpcy5nZXRfc2VhcmNoX3RleHQoKSxhPWYucmVwbGFjZSgvWy1bXF17fSgpKis/LixcXF4kfCNcc10vZywiXFwkJiIpLGk9bmV3IFJlZ0V4cChhLCJpIiksYz10aGlzLmdldF9zZWFyY2hfcmVnZXgoYSksbD10aGlzLnJlc3VsdHNfZGF0YSxqPTAsaz1sLmxlbmd0aDtrPmo7aisrKWI9bFtqXSxiLnNlYXJjaF9tYXRjaD0hMSxlPW51bGwsdGhpcy5pbmNsdWRlX29wdGlvbl9pbl9yZXN1bHRzKGIpJiYoYi5ncm91cCYmKGIuZ3JvdXBfbWF0Y2g9ITEsYi5hY3RpdmVfb3B0aW9ucz0wKSxudWxsIT1iLmdyb3VwX2FycmF5X2luZGV4JiZ0aGlzLnJlc3VsdHNfZGF0YVtiLmdyb3VwX2FycmF5X2luZGV4XSYmKGU9dGhpcy5yZXN1bHRzX2RhdGFbYi5ncm91cF9hcnJheV9pbmRleF0sMD09PWUuYWN0aXZlX29wdGlvbnMmJmUuc2VhcmNoX21hdGNoJiYoZCs9MSksZS5hY3RpdmVfb3B0aW9ucys9MSksKCFiLmdyb3VwfHx0aGlzLmdyb3VwX3NlYXJjaCkmJihiLnNlYXJjaF90ZXh0PWIuZ3JvdXA/Yi5sYWJlbDpiLnRleHQsYi5zZWFyY2hfbWF0Y2g9dGhpcy5zZWFyY2hfc3RyaW5nX21hdGNoKGIuc2VhcmNoX3RleHQsYyksYi5zZWFyY2hfbWF0Y2gmJiFiLmdyb3VwJiYoZCs9MSksYi5zZWFyY2hfbWF0Y2g/KGYubGVuZ3RoJiYoZz1iLnNlYXJjaF90ZXh0LnNlYXJjaChpKSxoPWIuc2VhcmNoX3RleHQuc3Vic3RyKDAsZytmLmxlbmd0aCkrIjwvZW0+IitiLnNlYXJjaF90ZXh0LnN1YnN0cihnK2YubGVuZ3RoKSxiLnNlYXJjaF90ZXh0PWguc3Vic3RyKDAsZykrIjxlbT4iK2guc3Vic3RyKGcpKSxudWxsIT1lJiYoZS5ncm91cF9tYXRjaD0hMCkpOm51bGwhPWIuZ3JvdXBfYXJyYXlfaW5kZXgmJnRoaXMucmVzdWx0c19kYXRhW2IuZ3JvdXBfYXJyYXlfaW5kZXhdLnNlYXJjaF9tYXRjaCYmKGIuc2VhcmNoX21hdGNoPSEwKSkpO3JldHVybiB0aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKSwxPmQmJmYubGVuZ3RoPyh0aGlzLnVwZGF0ZV9yZXN1bHRzX2NvbnRlbnQoIiIpLHRoaXMubm9fcmVzdWx0cyhmKSk6KHRoaXMudXBkYXRlX3Jlc3VsdHNfY29udGVudCh0aGlzLnJlc3VsdHNfb3B0aW9uX2J1aWxkKCkpLHRoaXMud2lubm93X3Jlc3VsdHNfc2V0X2hpZ2hsaWdodCgpKX0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLmdldF9zZWFyY2hfcmVnZXg9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGI9dGhpcy5zZWFyY2hfY29udGFpbnM/IiI6Il4iLG5ldyBSZWdFeHAoYithLCJpIil9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfc3RyaW5nX21hdGNoPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY7aWYoYi50ZXN0KGEpKXJldHVybiEwO2lmKHRoaXMuZW5hYmxlX3NwbGl0X3dvcmRfc2VhcmNoJiYoYS5pbmRleE9mKCIgIik+PTB8fDA9PT1hLmluZGV4T2YoIlsiKSkmJihkPWEucmVwbGFjZSgvXFt8XF0vZywiIikuc3BsaXQoIiAiKSxkLmxlbmd0aCkpZm9yKGU9MCxmPWQubGVuZ3RoO2Y+ZTtlKyspaWYoYz1kW2VdLGIudGVzdChjKSlyZXR1cm4hMH0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLmNob2ljZXNfY291bnQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZDtpZihudWxsIT10aGlzLnNlbGVjdGVkX29wdGlvbl9jb3VudClyZXR1cm4gdGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQ7Zm9yKHRoaXMuc2VsZWN0ZWRfb3B0aW9uX2NvdW50PTAsZD10aGlzLmZvcm1fZmllbGQub3B0aW9ucyxiPTAsYz1kLmxlbmd0aDtjPmI7YisrKWE9ZFtiXSxhLnNlbGVjdGVkJiYodGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQrPTEpO3JldHVybiB0aGlzLnNlbGVjdGVkX29wdGlvbl9jb3VudH0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLmNob2ljZXNfY2xpY2s9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucHJldmVudERlZmF1bHQoKSx0aGlzLnJlc3VsdHNfc2hvd2luZ3x8dGhpcy5pc19kaXNhYmxlZD92b2lkIDA6dGhpcy5yZXN1bHRzX3Nob3coKX0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLmtleXVwX2NoZWNrZXI9ZnVuY3Rpb24oYSl7dmFyIGIsYztzd2l0Y2goYj1udWxsIT0oYz1hLndoaWNoKT9jOmEua2V5Q29kZSx0aGlzLnNlYXJjaF9maWVsZF9zY2FsZSgpLGIpe2Nhc2UgODppZih0aGlzLmlzX211bHRpcGxlJiZ0aGlzLmJhY2tzdHJva2VfbGVuZ3RoPDEmJnRoaXMuY2hvaWNlc19jb3VudCgpPjApcmV0dXJuIHRoaXMua2V5ZG93bl9iYWNrc3Ryb2tlKCk7aWYoIXRoaXMucGVuZGluZ19iYWNrc3Ryb2tlKXJldHVybiB0aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKSx0aGlzLnJlc3VsdHNfc2VhcmNoKCk7YnJlYWs7Y2FzZSAxMzppZihhLnByZXZlbnREZWZhdWx0KCksdGhpcy5yZXN1bHRzX3Nob3dpbmcpcmV0dXJuIHRoaXMucmVzdWx0X3NlbGVjdChhKTticmVhaztjYXNlIDI3OnJldHVybiB0aGlzLnJlc3VsdHNfc2hvd2luZyYmdGhpcy5yZXN1bHRzX2hpZGUoKSwhMDtjYXNlIDk6Y2FzZSAzODpjYXNlIDQwOmNhc2UgMTY6Y2FzZSA5MTpjYXNlIDE3OmJyZWFrO2RlZmF1bHQ6cmV0dXJuIHRoaXMucmVzdWx0c19zZWFyY2goKX19LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5jbGlwYm9hcmRfZXZlbnRfY2hlY2tlcj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gYS5yZXN1bHRzX3NlYXJjaCgpfSw1MCl9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5jb250YWluZXJfd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9dGhpcy5vcHRpb25zLndpZHRoP3RoaXMub3B0aW9ucy53aWR0aDoiIit0aGlzLmZvcm1fZmllbGQub2Zmc2V0V2lkdGgrInB4In0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLmluY2x1ZGVfb3B0aW9uX2luX3Jlc3VsdHM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXNfbXVsdGlwbGUmJiF0aGlzLmRpc3BsYXlfc2VsZWN0ZWRfb3B0aW9ucyYmYS5zZWxlY3RlZD8hMTohdGhpcy5kaXNwbGF5X2Rpc2FibGVkX29wdGlvbnMmJmEuZGlzYWJsZWQ/ITE6YS5lbXB0eT8hMTohMH0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnNlYXJjaF9yZXN1bHRzX3RvdWNoc3RhcnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudG91Y2hfc3RhcnRlZD0hMCx0aGlzLnNlYXJjaF9yZXN1bHRzX21vdXNlb3ZlcihhKX0sQWJzdHJhY3RDaG9zZW4ucHJvdG90eXBlLnNlYXJjaF9yZXN1bHRzX3RvdWNobW92ZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50b3VjaF9zdGFydGVkPSExLHRoaXMuc2VhcmNoX3Jlc3VsdHNfbW91c2VvdXQoYSl9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfcmVzdWx0c190b3VjaGVuZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50b3VjaF9zdGFydGVkP3RoaXMuc2VhcmNoX3Jlc3VsdHNfbW91c2V1cChhKTp2b2lkIDB9LEFic3RyYWN0Q2hvc2VuLnByb3RvdHlwZS5vdXRlckhUTUw9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGEub3V0ZXJIVE1MP2Eub3V0ZXJIVE1MOihiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGIuYXBwZW5kQ2hpbGQoYSksYi5pbm5lckhUTUwpfSxBYnN0cmFjdENob3Nlbi5icm93c2VyX2lzX3N1cHBvcnRlZD1mdW5jdGlvbigpe3JldHVybiJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiPT09d2luZG93Lm5hdmlnYXRvci5hcHBOYW1lP2RvY3VtZW50LmRvY3VtZW50TW9kZT49ODovaVAob2R8aG9uZSkvaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KT8hMTovQW5kcm9pZC9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpJiYvTW9iaWxlL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk/ITE6ITB9LEFic3RyYWN0Q2hvc2VuLmRlZmF1bHRfbXVsdGlwbGVfdGV4dD0iU2VsZWN0IFNvbWUgT3B0aW9ucyIsQWJzdHJhY3RDaG9zZW4uZGVmYXVsdF9zaW5nbGVfdGV4dD0iU2VsZWN0IGFuIE9wdGlvbiIsQWJzdHJhY3RDaG9zZW4uZGVmYXVsdF9ub19yZXN1bHRfdGV4dD0iTm8gcmVzdWx0cyBtYXRjaCIsQWJzdHJhY3RDaG9zZW59KCksYT1qUXVlcnksYS5mbi5leHRlbmQoe2Nob3NlbjpmdW5jdGlvbihiKXtyZXR1cm4gQWJzdHJhY3RDaG9zZW4uYnJvd3Nlcl9pc19zdXBwb3J0ZWQoKT90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYyxkO2M9YSh0aGlzKSxkPWMuZGF0YSgiY2hvc2VuIiksImRlc3Ryb3kiPT09YiYmZCBpbnN0YW5jZW9mIENob3Nlbj9kLmRlc3Ryb3koKTpkIGluc3RhbmNlb2YgQ2hvc2VufHxjLmRhdGEoImNob3NlbiIsbmV3IENob3Nlbih0aGlzLGIpKX0pOnRoaXN9fSksQ2hvc2VuPWZ1bmN0aW9uKGMpe2Z1bmN0aW9uIENob3Nlbigpe3JldHVybiBiPUNob3Nlbi5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBkKENob3NlbixjKSxDaG9zZW4ucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZm9ybV9maWVsZF9qcT1hKHRoaXMuZm9ybV9maWVsZCksdGhpcy5jdXJyZW50X3NlbGVjdGVkSW5kZXg9dGhpcy5mb3JtX2ZpZWxkLnNlbGVjdGVkSW5kZXgsdGhpcy5pc19ydGw9dGhpcy5mb3JtX2ZpZWxkX2pxLmhhc0NsYXNzKCJjaG9zZW4tcnRsIil9LENob3Nlbi5wcm90b3R5cGUuc2V0X3VwX2h0bWw9ZnVuY3Rpb24oKXt2YXIgYixjO3JldHVybiBiPVsiY2hvc2VuLWNvbnRhaW5lciJdLGIucHVzaCgiY2hvc2VuLWNvbnRhaW5lci0iKyh0aGlzLmlzX211bHRpcGxlPyJtdWx0aSI6InNpbmdsZSIpKSx0aGlzLmluaGVyaXRfc2VsZWN0X2NsYXNzZXMmJnRoaXMuZm9ybV9maWVsZC5jbGFzc05hbWUmJmIucHVzaCh0aGlzLmZvcm1fZmllbGQuY2xhc3NOYW1lKSx0aGlzLmlzX3J0bCYmYi5wdXNoKCJjaG9zZW4tcnRsIiksYz17ImNsYXNzIjpiLmpvaW4oIiAiKSxzdHlsZToid2lkdGg6ICIrdGhpcy5jb250YWluZXJfd2lkdGgoKSsiOyIsdGl0bGU6dGhpcy5mb3JtX2ZpZWxkLnRpdGxlfSx0aGlzLmZvcm1fZmllbGQuaWQubGVuZ3RoJiYoYy5pZD10aGlzLmZvcm1fZmllbGQuaWQucmVwbGFjZSgvW15cd10vZywiXyIpKyJfY2hvc2VuIiksdGhpcy5jb250YWluZXI9YSgiPGRpdiAvPiIsYyksdGhpcy5pc19tdWx0aXBsZT90aGlzLmNvbnRhaW5lci5odG1sKCc8dWwgY2xhc3M9ImNob3Nlbi1jaG9pY2VzIj48bGkgY2xhc3M9InNlYXJjaC1maWVsZCI+PGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSInK3RoaXMuZGVmYXVsdF90ZXh0KyciIGNsYXNzPSJkZWZhdWx0IiBhdXRvY29tcGxldGU9Im9mZiIgc3R5bGU9IndpZHRoOjI1cHg7IiAvPjwvbGk+PC91bD48ZGl2IGNsYXNzPSJjaG9zZW4tZHJvcCI+PHVsIGNsYXNzPSJjaG9zZW4tcmVzdWx0cyI+PC91bD48L2Rpdj4nKTp0aGlzLmNvbnRhaW5lci5odG1sKCc8YSBjbGFzcz0iY2hvc2VuLXNpbmdsZSBjaG9zZW4tZGVmYXVsdCIgdGFiaW5kZXg9Ii0xIj48c3Bhbj4nK3RoaXMuZGVmYXVsdF90ZXh0Kyc8L3NwYW4+PGRpdj48Yj48L2I+PC9kaXY+PC9hPjxkaXYgY2xhc3M9ImNob3Nlbi1kcm9wIj48ZGl2IGNsYXNzPSJjaG9zZW4tc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+PC9kaXY+PHVsIGNsYXNzPSJjaG9zZW4tcmVzdWx0cyI+PC91bD48L2Rpdj4nKSx0aGlzLmZvcm1fZmllbGRfanEuaGlkZSgpLmFmdGVyKHRoaXMuY29udGFpbmVyKSx0aGlzLmRyb3Bkb3duPXRoaXMuY29udGFpbmVyLmZpbmQoImRpdi5jaG9zZW4tZHJvcCIpLmZpcnN0KCksdGhpcy5zZWFyY2hfZmllbGQ9dGhpcy5jb250YWluZXIuZmluZCgiaW5wdXQiKS5maXJzdCgpLHRoaXMuc2VhcmNoX3Jlc3VsdHM9dGhpcy5jb250YWluZXIuZmluZCgidWwuY2hvc2VuLXJlc3VsdHMiKS5maXJzdCgpLHRoaXMuc2VhcmNoX2ZpZWxkX3NjYWxlKCksdGhpcy5zZWFyY2hfbm9fcmVzdWx0cz10aGlzLmNvbnRhaW5lci5maW5kKCJsaS5uby1yZXN1bHRzIikuZmlyc3QoKSx0aGlzLmlzX211bHRpcGxlPyh0aGlzLnNlYXJjaF9jaG9pY2VzPXRoaXMuY29udGFpbmVyLmZpbmQoInVsLmNob3Nlbi1jaG9pY2VzIikuZmlyc3QoKSx0aGlzLnNlYXJjaF9jb250YWluZXI9dGhpcy5jb250YWluZXIuZmluZCgibGkuc2VhcmNoLWZpZWxkIikuZmlyc3QoKSk6KHRoaXMuc2VhcmNoX2NvbnRhaW5lcj10aGlzLmNvbnRhaW5lci5maW5kKCJkaXYuY2hvc2VuLXNlYXJjaCIpLmZpcnN0KCksdGhpcy5zZWxlY3RlZF9pdGVtPXRoaXMuY29udGFpbmVyLmZpbmQoIi5jaG9zZW4tc2luZ2xlIikuZmlyc3QoKSksdGhpcy5yZXN1bHRzX2J1aWxkKCksdGhpcy5zZXRfdGFiX2luZGV4KCksdGhpcy5zZXRfbGFiZWxfYmVoYXZpb3IoKX0sQ2hvc2VuLnByb3RvdHlwZS5vbl9yZWFkeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZvcm1fZmllbGRfanEudHJpZ2dlcigiY2hvc2VuOnJlYWR5Iix7Y2hvc2VuOnRoaXN9KX0sQ2hvc2VuLnByb3RvdHlwZS5yZWdpc3Rlcl9vYnNlcnZlcnM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiB0aGlzLmNvbnRhaW5lci5iaW5kKCJ0b3VjaHN0YXJ0LmNob3NlbiIsZnVuY3Rpb24oYil7YS5jb250YWluZXJfbW91c2Vkb3duKGIpfSksdGhpcy5jb250YWluZXIuYmluZCgidG91Y2hlbmQuY2hvc2VuIixmdW5jdGlvbihiKXthLmNvbnRhaW5lcl9tb3VzZXVwKGIpfSksdGhpcy5jb250YWluZXIuYmluZCgibW91c2Vkb3duLmNob3NlbiIsZnVuY3Rpb24oYil7YS5jb250YWluZXJfbW91c2Vkb3duKGIpfSksdGhpcy5jb250YWluZXIuYmluZCgibW91c2V1cC5jaG9zZW4iLGZ1bmN0aW9uKGIpe2EuY29udGFpbmVyX21vdXNldXAoYil9KSx0aGlzLmNvbnRhaW5lci5iaW5kKCJtb3VzZWVudGVyLmNob3NlbiIsZnVuY3Rpb24oYil7YS5tb3VzZV9lbnRlcihiKX0pLHRoaXMuY29udGFpbmVyLmJpbmQoIm1vdXNlbGVhdmUuY2hvc2VuIixmdW5jdGlvbihiKXthLm1vdXNlX2xlYXZlKGIpfSksdGhpcy5zZWFyY2hfcmVzdWx0cy5iaW5kKCJtb3VzZXVwLmNob3NlbiIsZnVuY3Rpb24oYil7YS5zZWFyY2hfcmVzdWx0c19tb3VzZXVwKGIpfSksdGhpcy5zZWFyY2hfcmVzdWx0cy5iaW5kKCJtb3VzZW92ZXIuY2hvc2VuIixmdW5jdGlvbihiKXthLnNlYXJjaF9yZXN1bHRzX21vdXNlb3ZlcihiKX0pLHRoaXMuc2VhcmNoX3Jlc3VsdHMuYmluZCgibW91c2VvdXQuY2hvc2VuIixmdW5jdGlvbihiKXthLnNlYXJjaF9yZXN1bHRzX21vdXNlb3V0KGIpfSksdGhpcy5zZWFyY2hfcmVzdWx0cy5iaW5kKCJtb3VzZXdoZWVsLmNob3NlbiBET01Nb3VzZVNjcm9sbC5jaG9zZW4iLGZ1bmN0aW9uKGIpe2Euc2VhcmNoX3Jlc3VsdHNfbW91c2V3aGVlbChiKX0pLHRoaXMuc2VhcmNoX3Jlc3VsdHMuYmluZCgidG91Y2hzdGFydC5jaG9zZW4iLGZ1bmN0aW9uKGIpe2Euc2VhcmNoX3Jlc3VsdHNfdG91Y2hzdGFydChiKX0pLHRoaXMuc2VhcmNoX3Jlc3VsdHMuYmluZCgidG91Y2htb3ZlLmNob3NlbiIsZnVuY3Rpb24oYil7YS5zZWFyY2hfcmVzdWx0c190b3VjaG1vdmUoYil9KSx0aGlzLnNlYXJjaF9yZXN1bHRzLmJpbmQoInRvdWNoZW5kLmNob3NlbiIsZnVuY3Rpb24oYil7YS5zZWFyY2hfcmVzdWx0c190b3VjaGVuZChiKX0pLHRoaXMuZm9ybV9maWVsZF9qcS5iaW5kKCJjaG9zZW46dXBkYXRlZC5jaG9zZW4iLGZ1bmN0aW9uKGIpe2EucmVzdWx0c191cGRhdGVfZmllbGQoYil9KSx0aGlzLmZvcm1fZmllbGRfanEuYmluZCgiY2hvc2VuOmFjdGl2YXRlLmNob3NlbiIsZnVuY3Rpb24oYil7YS5hY3RpdmF0ZV9maWVsZChiKX0pLHRoaXMuZm9ybV9maWVsZF9qcS5iaW5kKCJjaG9zZW46b3Blbi5jaG9zZW4iLGZ1bmN0aW9uKGIpe2EuY29udGFpbmVyX21vdXNlZG93bihiKX0pLHRoaXMuZm9ybV9maWVsZF9qcS5iaW5kKCJjaG9zZW46Y2xvc2UuY2hvc2VuIixmdW5jdGlvbihiKXthLmlucHV0X2JsdXIoYil9KSx0aGlzLnNlYXJjaF9maWVsZC5iaW5kKCJibHVyLmNob3NlbiIsZnVuY3Rpb24oYil7YS5pbnB1dF9ibHVyKGIpfSksdGhpcy5zZWFyY2hfZmllbGQuYmluZCgia2V5dXAuY2hvc2VuIixmdW5jdGlvbihiKXthLmtleXVwX2NoZWNrZXIoYil9KSx0aGlzLnNlYXJjaF9maWVsZC5iaW5kKCJrZXlkb3duLmNob3NlbiIsZnVuY3Rpb24oYil7YS5rZXlkb3duX2NoZWNrZXIoYil9KSx0aGlzLnNlYXJjaF9maWVsZC5iaW5kKCJmb2N1cy5jaG9zZW4iLGZ1bmN0aW9uKGIpe2EuaW5wdXRfZm9jdXMoYil9KSx0aGlzLnNlYXJjaF9maWVsZC5iaW5kKCJjdXQuY2hvc2VuIixmdW5jdGlvbihiKXthLmNsaXBib2FyZF9ldmVudF9jaGVja2VyKGIpfSksdGhpcy5zZWFyY2hfZmllbGQuYmluZCgicGFzdGUuY2hvc2VuIixmdW5jdGlvbihiKXthLmNsaXBib2FyZF9ldmVudF9jaGVja2VyKGIpfSksdGhpcy5pc19tdWx0aXBsZT90aGlzLnNlYXJjaF9jaG9pY2VzLmJpbmQoImNsaWNrLmNob3NlbiIsZnVuY3Rpb24oYil7YS5jaG9pY2VzX2NsaWNrKGIpfSk6dGhpcy5jb250YWluZXIuYmluZCgiY2xpY2suY2hvc2VuIixmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCl9KX0sQ2hvc2VuLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcy5jb250YWluZXJbMF0ub3duZXJEb2N1bWVudCkudW5iaW5kKCJjbGljay5jaG9zZW4iLHRoaXMuY2xpY2tfdGVzdF9hY3Rpb24pLHRoaXMuc2VhcmNoX2ZpZWxkWzBdLnRhYkluZGV4JiYodGhpcy5mb3JtX2ZpZWxkX2pxWzBdLnRhYkluZGV4PXRoaXMuc2VhcmNoX2ZpZWxkWzBdLnRhYkluZGV4KSx0aGlzLmNvbnRhaW5lci5yZW1vdmUoKSx0aGlzLmZvcm1fZmllbGRfanEucmVtb3ZlRGF0YSgiY2hvc2VuIiksdGhpcy5mb3JtX2ZpZWxkX2pxLnNob3coKX0sQ2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfZmllbGRfZGlzYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc19kaXNhYmxlZD10aGlzLmZvcm1fZmllbGRfanFbMF0uZGlzYWJsZWQsdGhpcy5pc19kaXNhYmxlZD8odGhpcy5jb250YWluZXIuYWRkQ2xhc3MoImNob3Nlbi1kaXNhYmxlZCIpLHRoaXMuc2VhcmNoX2ZpZWxkWzBdLmRpc2FibGVkPSEwLHRoaXMuaXNfbXVsdGlwbGV8fHRoaXMuc2VsZWN0ZWRfaXRlbS51bmJpbmQoImZvY3VzLmNob3NlbiIsdGhpcy5hY3RpdmF0ZV9hY3Rpb24pLHRoaXMuY2xvc2VfZmllbGQoKSk6KHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKCJjaG9zZW4tZGlzYWJsZWQiKSx0aGlzLnNlYXJjaF9maWVsZFswXS5kaXNhYmxlZD0hMSx0aGlzLmlzX211bHRpcGxlP3ZvaWQgMDp0aGlzLnNlbGVjdGVkX2l0ZW0uYmluZCgiZm9jdXMuY2hvc2VuIix0aGlzLmFjdGl2YXRlX2FjdGlvbikpfSxDaG9zZW4ucHJvdG90eXBlLmNvbnRhaW5lcl9tb3VzZWRvd249ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuaXNfZGlzYWJsZWR8fChiJiYibW91c2Vkb3duIj09PWIudHlwZSYmIXRoaXMucmVzdWx0c19zaG93aW5nJiZiLnByZXZlbnREZWZhdWx0KCksbnVsbCE9YiYmYShiLnRhcmdldCkuaGFzQ2xhc3MoInNlYXJjaC1jaG9pY2UtY2xvc2UiKSk/dm9pZCAwOih0aGlzLmFjdGl2ZV9maWVsZD90aGlzLmlzX211bHRpcGxlfHwhYnx8YShiLnRhcmdldClbMF0hPT10aGlzLnNlbGVjdGVkX2l0ZW1bMF0mJiFhKGIudGFyZ2V0KS5wYXJlbnRzKCJhLmNob3Nlbi1zaW5nbGUiKS5sZW5ndGh8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5yZXN1bHRzX3RvZ2dsZSgpKToodGhpcy5pc19tdWx0aXBsZSYmdGhpcy5zZWFyY2hfZmllbGQudmFsKCIiKSxhKHRoaXMuY29udGFpbmVyWzBdLm93bmVyRG9jdW1lbnQpLmJpbmQoImNsaWNrLmNob3NlbiIsdGhpcy5jbGlja190ZXN0X2FjdGlvbiksdGhpcy5yZXN1bHRzX3Nob3coKSksdGhpcy5hY3RpdmF0ZV9maWVsZCgpKX0sQ2hvc2VuLnByb3RvdHlwZS5jb250YWluZXJfbW91c2V1cD1mdW5jdGlvbihhKXtyZXR1cm4iQUJCUiIhPT1hLnRhcmdldC5ub2RlTmFtZXx8dGhpcy5pc19kaXNhYmxlZD92b2lkIDA6dGhpcy5yZXN1bHRzX3Jlc2V0KGEpfSxDaG9zZW4ucHJvdG90eXBlLnNlYXJjaF9yZXN1bHRzX21vdXNld2hlZWw9ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGEub3JpZ2luYWxFdmVudCYmKGI9YS5vcmlnaW5hbEV2ZW50LmRlbHRhWXx8LWEub3JpZ2luYWxFdmVudC53aGVlbERlbHRhfHxhLm9yaWdpbmFsRXZlbnQuZGV0YWlsKSxudWxsIT1iPyhhLnByZXZlbnREZWZhdWx0KCksIkRPTU1vdXNlU2Nyb2xsIj09PWEudHlwZSYmKGI9NDAqYiksdGhpcy5zZWFyY2hfcmVzdWx0cy5zY3JvbGxUb3AoYit0aGlzLnNlYXJjaF9yZXN1bHRzLnNjcm9sbFRvcCgpKSk6dm9pZCAwfSxDaG9zZW4ucHJvdG90eXBlLmJsdXJfdGVzdD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmFjdGl2ZV9maWVsZCYmdGhpcy5jb250YWluZXIuaGFzQ2xhc3MoImNob3Nlbi1jb250YWluZXItYWN0aXZlIik/dGhpcy5jbG9zZV9maWVsZCgpOnZvaWQgMH0sQ2hvc2VuLnByb3RvdHlwZS5jbG9zZV9maWVsZD1mdW5jdGlvbigpe3JldHVybiBhKHRoaXMuY29udGFpbmVyWzBdLm93bmVyRG9jdW1lbnQpLnVuYmluZCgiY2xpY2suY2hvc2VuIix0aGlzLmNsaWNrX3Rlc3RfYWN0aW9uKSx0aGlzLmFjdGl2ZV9maWVsZD0hMSx0aGlzLnJlc3VsdHNfaGlkZSgpLHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKCJjaG9zZW4tY29udGFpbmVyLWFjdGl2ZSIpLHRoaXMuY2xlYXJfYmFja3N0cm9rZSgpLHRoaXMuc2hvd19zZWFyY2hfZmllbGRfZGVmYXVsdCgpLHRoaXMuc2VhcmNoX2ZpZWxkX3NjYWxlKCl9LENob3Nlbi5wcm90b3R5cGUuYWN0aXZhdGVfZmllbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWluZXIuYWRkQ2xhc3MoImNob3Nlbi1jb250YWluZXItYWN0aXZlIiksdGhpcy5hY3RpdmVfZmllbGQ9ITAsdGhpcy5zZWFyY2hfZmllbGQudmFsKHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgpKSx0aGlzLnNlYXJjaF9maWVsZC5mb2N1cygpfSxDaG9zZW4ucHJvdG90eXBlLnRlc3RfYWN0aXZlX2NsaWNrPWZ1bmN0aW9uKGIpe3ZhciBjO3JldHVybiBjPWEoYi50YXJnZXQpLmNsb3Nlc3QoIi5jaG9zZW4tY29udGFpbmVyIiksYy5sZW5ndGgmJnRoaXMuY29udGFpbmVyWzBdPT09Y1swXT90aGlzLmFjdGl2ZV9maWVsZD0hMDp0aGlzLmNsb3NlX2ZpZWxkKCl9LENob3Nlbi5wcm90b3R5cGUucmVzdWx0c19idWlsZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcnNpbmc9ITAsdGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQ9bnVsbCx0aGlzLnJlc3VsdHNfZGF0YT1TZWxlY3RQYXJzZXIuc2VsZWN0X3RvX2FycmF5KHRoaXMuZm9ybV9maWVsZCksdGhpcy5pc19tdWx0aXBsZT90aGlzLnNlYXJjaF9jaG9pY2VzLmZpbmQoImxpLnNlYXJjaC1jaG9pY2UiKS5yZW1vdmUoKTp0aGlzLmlzX211bHRpcGxlfHwodGhpcy5zaW5nbGVfc2V0X3NlbGVjdGVkX3RleHQoKSx0aGlzLmRpc2FibGVfc2VhcmNofHx0aGlzLmZvcm1fZmllbGQub3B0aW9ucy5sZW5ndGg8PXRoaXMuZGlzYWJsZV9zZWFyY2hfdGhyZXNob2xkPyh0aGlzLnNlYXJjaF9maWVsZFswXS5yZWFkT25seT0hMCx0aGlzLmNvbnRhaW5lci5hZGRDbGFzcygiY2hvc2VuLWNvbnRhaW5lci1zaW5nbGUtbm9zZWFyY2giKSk6KHRoaXMuc2VhcmNoX2ZpZWxkWzBdLnJlYWRPbmx5PSExLHRoaXMuY29udGFpbmVyLnJlbW92ZUNsYXNzKCJjaG9zZW4tY29udGFpbmVyLXNpbmdsZS1ub3NlYXJjaCIpKSksdGhpcy51cGRhdGVfcmVzdWx0c19jb250ZW50KHRoaXMucmVzdWx0c19vcHRpb25fYnVpbGQoe2ZpcnN0OiEwfSkpLHRoaXMuc2VhcmNoX2ZpZWxkX2Rpc2FibGVkKCksdGhpcy5zaG93X3NlYXJjaF9maWVsZF9kZWZhdWx0KCksdGhpcy5zZWFyY2hfZmllbGRfc2NhbGUoKSx0aGlzLnBhcnNpbmc9ITF9LENob3Nlbi5wcm90b3R5cGUucmVzdWx0X2RvX2hpZ2hsaWdodD1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmO2lmKGEubGVuZ3RoKXtpZih0aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKSx0aGlzLnJlc3VsdF9oaWdobGlnaHQ9YSx0aGlzLnJlc3VsdF9oaWdobGlnaHQuYWRkQ2xhc3MoImhpZ2hsaWdodGVkIiksZD1wYXJzZUludCh0aGlzLnNlYXJjaF9yZXN1bHRzLmNzcygibWF4SGVpZ2h0IiksMTApLGY9dGhpcy5zZWFyY2hfcmVzdWx0cy5zY3JvbGxUb3AoKSxlPWQrZixjPXRoaXMucmVzdWx0X2hpZ2hsaWdodC5wb3NpdGlvbigpLnRvcCt0aGlzLnNlYXJjaF9yZXN1bHRzLnNjcm9sbFRvcCgpLGI9Yyt0aGlzLnJlc3VsdF9oaWdobGlnaHQub3V0ZXJIZWlnaHQoKSxiPj1lKXJldHVybiB0aGlzLnNlYXJjaF9yZXN1bHRzLnNjcm9sbFRvcChiLWQ+MD9iLWQ6MCk7aWYoZj5jKXJldHVybiB0aGlzLnNlYXJjaF9yZXN1bHRzLnNjcm9sbFRvcChjKX19LENob3Nlbi5wcm90b3R5cGUucmVzdWx0X2NsZWFyX2hpZ2hsaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlc3VsdF9oaWdobGlnaHQmJnRoaXMucmVzdWx0X2hpZ2hsaWdodC5yZW1vdmVDbGFzcygiaGlnaGxpZ2h0ZWQiKSx0aGlzLnJlc3VsdF9oaWdobGlnaHQ9bnVsbH0sQ2hvc2VuLnByb3RvdHlwZS5yZXN1bHRzX3Nob3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc19tdWx0aXBsZSYmdGhpcy5tYXhfc2VsZWN0ZWRfb3B0aW9uczw9dGhpcy5jaG9pY2VzX2NvdW50KCk/KHRoaXMuZm9ybV9maWVsZF9qcS50cmlnZ2VyKCJjaG9zZW46bWF4c2VsZWN0ZWQiLHtjaG9zZW46dGhpc30pLCExKToodGhpcy5jb250YWluZXIuYWRkQ2xhc3MoImNob3Nlbi13aXRoLWRyb3AiKSx0aGlzLnJlc3VsdHNfc2hvd2luZz0hMCx0aGlzLnNlYXJjaF9maWVsZC5mb2N1cygpLHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCh0aGlzLnNlYXJjaF9maWVsZC52YWwoKSksdGhpcy53aW5ub3dfcmVzdWx0cygpLHRoaXMuZm9ybV9maWVsZF9qcS50cmlnZ2VyKCJjaG9zZW46c2hvd2luZ19kcm9wZG93biIse2Nob3Nlbjp0aGlzfSkpfSxDaG9zZW4ucHJvdG90eXBlLnVwZGF0ZV9yZXN1bHRzX2NvbnRlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2VhcmNoX3Jlc3VsdHMuaHRtbChhKX0sQ2hvc2VuLnByb3RvdHlwZS5yZXN1bHRzX2hpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXN1bHRzX3Nob3dpbmcmJih0aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKSx0aGlzLmNvbnRhaW5lci5yZW1vdmVDbGFzcygiY2hvc2VuLXdpdGgtZHJvcCIpLHRoaXMuZm9ybV9maWVsZF9qcS50cmlnZ2VyKCJjaG9zZW46aGlkaW5nX2Ryb3Bkb3duIix7Y2hvc2VuOnRoaXN9KSksdGhpcy5yZXN1bHRzX3Nob3dpbmc9ITF9LENob3Nlbi5wcm90b3R5cGUuc2V0X3RhYl9pbmRleD1mdW5jdGlvbigpe3ZhciBhO3JldHVybiB0aGlzLmZvcm1fZmllbGQudGFiSW5kZXg/KGE9dGhpcy5mb3JtX2ZpZWxkLnRhYkluZGV4LHRoaXMuZm9ybV9maWVsZC50YWJJbmRleD0tMSx0aGlzLnNlYXJjaF9maWVsZFswXS50YWJJbmRleD1hKTp2b2lkIDB9LENob3Nlbi5wcm90b3R5cGUuc2V0X2xhYmVsX2JlaGF2aW9yPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcztyZXR1cm4gdGhpcy5mb3JtX2ZpZWxkX2xhYmVsPXRoaXMuZm9ybV9maWVsZF9qcS5wYXJlbnRzKCJsYWJlbCIpLCF0aGlzLmZvcm1fZmllbGRfbGFiZWwubGVuZ3RoJiZ0aGlzLmZvcm1fZmllbGQuaWQubGVuZ3RoJiYodGhpcy5mb3JtX2ZpZWxkX2xhYmVsPWEoImxhYmVsW2Zvcj0nIit0aGlzLmZvcm1fZmllbGQuaWQrIiddIikpLHRoaXMuZm9ybV9maWVsZF9sYWJlbC5sZW5ndGg+MD90aGlzLmZvcm1fZmllbGRfbGFiZWwuYmluZCgiY2xpY2suY2hvc2VuIixmdW5jdGlvbihhKXtyZXR1cm4gYi5pc19tdWx0aXBsZT9iLmNvbnRhaW5lcl9tb3VzZWRvd24oYSk6Yi5hY3RpdmF0ZV9maWVsZCgpfSk6dm9pZCAwfSxDaG9zZW4ucHJvdG90eXBlLnNob3dfc2VhcmNoX2ZpZWxkX2RlZmF1bHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc19tdWx0aXBsZSYmdGhpcy5jaG9pY2VzX2NvdW50KCk8MSYmIXRoaXMuYWN0aXZlX2ZpZWxkPyh0aGlzLnNlYXJjaF9maWVsZC52YWwodGhpcy5kZWZhdWx0X3RleHQpLHRoaXMuc2VhcmNoX2ZpZWxkLmFkZENsYXNzKCJkZWZhdWx0IikpOih0aGlzLnNlYXJjaF9maWVsZC52YWwoIiIpLHRoaXMuc2VhcmNoX2ZpZWxkLnJlbW92ZUNsYXNzKCJkZWZhdWx0IikpfSxDaG9zZW4ucHJvdG90eXBlLnNlYXJjaF9yZXN1bHRzX21vdXNldXA9ZnVuY3Rpb24oYil7dmFyIGM7cmV0dXJuIGM9YShiLnRhcmdldCkuaGFzQ2xhc3MoImFjdGl2ZS1yZXN1bHQiKT9hKGIudGFyZ2V0KTphKGIudGFyZ2V0KS5wYXJlbnRzKCIuYWN0aXZlLXJlc3VsdCIpLmZpcnN0KCksYy5sZW5ndGg/KHRoaXMucmVzdWx0X2hpZ2hsaWdodD1jLHRoaXMucmVzdWx0X3NlbGVjdChiKSx0aGlzLnNlYXJjaF9maWVsZC5mb2N1cygpKTp2b2lkIDB9LENob3Nlbi5wcm90b3R5cGUuc2VhcmNoX3Jlc3VsdHNfbW91c2VvdmVyPWZ1bmN0aW9uKGIpe3ZhciBjO3JldHVybiBjPWEoYi50YXJnZXQpLmhhc0NsYXNzKCJhY3RpdmUtcmVzdWx0Iik/YShiLnRhcmdldCk6YShiLnRhcmdldCkucGFyZW50cygiLmFjdGl2ZS1yZXN1bHQiKS5maXJzdCgpLGM/dGhpcy5yZXN1bHRfZG9faGlnaGxpZ2h0KGMpOnZvaWQgMH0sQ2hvc2VuLnByb3RvdHlwZS5zZWFyY2hfcmVzdWx0c19tb3VzZW91dD1mdW5jdGlvbihiKXtyZXR1cm4gYShiLnRhcmdldCkuaGFzQ2xhc3MoImFjdGl2ZS1yZXN1bHQiKT90aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKTp2b2lkIDB9LENob3Nlbi5wcm90b3R5cGUuY2hvaWNlX2J1aWxkPWZ1bmN0aW9uKGIpe3ZhciBjLGQsZT10aGlzO3JldHVybiBjPWEoIjxsaSAvPiIseyJjbGFzcyI6InNlYXJjaC1jaG9pY2UifSkuaHRtbCgiPHNwYW4+IitiLmh0bWwrIjwvc3Bhbj4iKSxiLmRpc2FibGVkP2MuYWRkQ2xhc3MoInNlYXJjaC1jaG9pY2UtZGlzYWJsZWQiKTooZD1hKCI8YSAvPiIseyJjbGFzcyI6InNlYXJjaC1jaG9pY2UtY2xvc2UiLCJkYXRhLW9wdGlvbi1hcnJheS1pbmRleCI6Yi5hcnJheV9pbmRleH0pLGQuYmluZCgiY2xpY2suY2hvc2VuIixmdW5jdGlvbihhKXtyZXR1cm4gZS5jaG9pY2VfZGVzdHJveV9saW5rX2NsaWNrKGEpfSksYy5hcHBlbmQoZCkpLHRoaXMuc2VhcmNoX2NvbnRhaW5lci5iZWZvcmUoYyl9LENob3Nlbi5wcm90b3R5cGUuY2hvaWNlX2Rlc3Ryb3lfbGlua19jbGljaz1mdW5jdGlvbihiKXtyZXR1cm4gYi5wcmV2ZW50RGVmYXVsdCgpLGIuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5pc19kaXNhYmxlZD92b2lkIDA6dGhpcy5jaG9pY2VfZGVzdHJveShhKGIudGFyZ2V0KSl9LENob3Nlbi5wcm90b3R5cGUuY2hvaWNlX2Rlc3Ryb3k9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVzdWx0X2Rlc2VsZWN0KGFbMF0uZ2V0QXR0cmlidXRlKCJkYXRhLW9wdGlvbi1hcnJheS1pbmRleCIpKT8odGhpcy5zaG93X3NlYXJjaF9maWVsZF9kZWZhdWx0KCksdGhpcy5pc19tdWx0aXBsZSYmdGhpcy5jaG9pY2VzX2NvdW50KCk+MCYmdGhpcy5zZWFyY2hfZmllbGQudmFsKCkubGVuZ3RoPDEmJnRoaXMucmVzdWx0c19oaWRlKCksYS5wYXJlbnRzKCJsaSIpLmZpcnN0KCkucmVtb3ZlKCksdGhpcy5zZWFyY2hfZmllbGRfc2NhbGUoKSk6dm9pZCAwfSxDaG9zZW4ucHJvdG90eXBlLnJlc3VsdHNfcmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXNldF9zaW5nbGVfc2VsZWN0X29wdGlvbnMoKSx0aGlzLmZvcm1fZmllbGQub3B0aW9uc1swXS5zZWxlY3RlZD0hMCx0aGlzLnNpbmdsZV9zZXRfc2VsZWN0ZWRfdGV4dCgpLHRoaXMuc2hvd19zZWFyY2hfZmllbGRfZGVmYXVsdCgpLHRoaXMucmVzdWx0c19yZXNldF9jbGVhbnVwKCksdGhpcy5mb3JtX2ZpZWxkX2pxLnRyaWdnZXIoImNoYW5nZSIpLHRoaXMuYWN0aXZlX2ZpZWxkP3RoaXMucmVzdWx0c19oaWRlKCk6dm9pZCAwfSxDaG9zZW4ucHJvdG90eXBlLnJlc3VsdHNfcmVzZXRfY2xlYW51cD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnJlbnRfc2VsZWN0ZWRJbmRleD10aGlzLmZvcm1fZmllbGQuc2VsZWN0ZWRJbmRleCx0aGlzLnNlbGVjdGVkX2l0ZW0uZmluZCgiYWJiciIpLnJlbW92ZSgpfSxDaG9zZW4ucHJvdG90eXBlLnJlc3VsdF9zZWxlY3Q9ZnVuY3Rpb24oYSl7dmFyIGIsYztyZXR1cm4gdGhpcy5yZXN1bHRfaGlnaGxpZ2h0PyhiPXRoaXMucmVzdWx0X2hpZ2hsaWdodCx0aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKSx0aGlzLmlzX211bHRpcGxlJiZ0aGlzLm1heF9zZWxlY3RlZF9vcHRpb25zPD10aGlzLmNob2ljZXNfY291bnQoKT8odGhpcy5mb3JtX2ZpZWxkX2pxLnRyaWdnZXIoImNob3NlbjptYXhzZWxlY3RlZCIse2Nob3Nlbjp0aGlzfSksITEpOih0aGlzLmlzX211bHRpcGxlP2IucmVtb3ZlQ2xhc3MoImFjdGl2ZS1yZXN1bHQiKTp0aGlzLnJlc2V0X3NpbmdsZV9zZWxlY3Rfb3B0aW9ucygpLGM9dGhpcy5yZXN1bHRzX2RhdGFbYlswXS5nZXRBdHRyaWJ1dGUoImRhdGEtb3B0aW9uLWFycmF5LWluZGV4IildLGMuc2VsZWN0ZWQ9ITAsdGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbYy5vcHRpb25zX2luZGV4XS5zZWxlY3RlZD0hMCx0aGlzLnNlbGVjdGVkX29wdGlvbl9jb3VudD1udWxsLHRoaXMuaXNfbXVsdGlwbGU/dGhpcy5jaG9pY2VfYnVpbGQoYyk6dGhpcy5zaW5nbGVfc2V0X3NlbGVjdGVkX3RleHQoYy50ZXh0KSwoYS5tZXRhS2V5fHxhLmN0cmxLZXkpJiZ0aGlzLmlzX211bHRpcGxlfHx0aGlzLnJlc3VsdHNfaGlkZSgpLHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgiIiksKHRoaXMuaXNfbXVsdGlwbGV8fHRoaXMuZm9ybV9maWVsZC5zZWxlY3RlZEluZGV4IT09dGhpcy5jdXJyZW50X3NlbGVjdGVkSW5kZXgpJiZ0aGlzLmZvcm1fZmllbGRfanEudHJpZ2dlcigiY2hhbmdlIix7c2VsZWN0ZWQ6dGhpcy5mb3JtX2ZpZWxkLm9wdGlvbnNbYy5vcHRpb25zX2luZGV4XS52YWx1ZX0pLHRoaXMuY3VycmVudF9zZWxlY3RlZEluZGV4PXRoaXMuZm9ybV9maWVsZC5zZWxlY3RlZEluZGV4LHRoaXMuc2VhcmNoX2ZpZWxkX3NjYWxlKCkpKTp2b2lkIDB9LENob3Nlbi5wcm90b3R5cGUuc2luZ2xlX3NldF9zZWxlY3RlZF90ZXh0PWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hJiYoYT10aGlzLmRlZmF1bHRfdGV4dCksYT09PXRoaXMuZGVmYXVsdF90ZXh0P3RoaXMuc2VsZWN0ZWRfaXRlbS5hZGRDbGFzcygiY2hvc2VuLWRlZmF1bHQiKToodGhpcy5zaW5nbGVfZGVzZWxlY3RfY29udHJvbF9idWlsZCgpLHRoaXMuc2VsZWN0ZWRfaXRlbS5yZW1vdmVDbGFzcygiY2hvc2VuLWRlZmF1bHQiKSksdGhpcy5zZWxlY3RlZF9pdGVtLmZpbmQoInNwYW4iKS50ZXh0KGEpfSxDaG9zZW4ucHJvdG90eXBlLnJlc3VsdF9kZXNlbGVjdD1mdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYj10aGlzLnJlc3VsdHNfZGF0YVthXSx0aGlzLmZvcm1fZmllbGQub3B0aW9uc1tiLm9wdGlvbnNfaW5kZXhdLmRpc2FibGVkPyExOihiLnNlbGVjdGVkPSExLHRoaXMuZm9ybV9maWVsZC5vcHRpb25zW2Iub3B0aW9uc19pbmRleF0uc2VsZWN0ZWQ9ITEsdGhpcy5zZWxlY3RlZF9vcHRpb25fY291bnQ9bnVsbCx0aGlzLnJlc3VsdF9jbGVhcl9oaWdobGlnaHQoKSx0aGlzLnJlc3VsdHNfc2hvd2luZyYmdGhpcy53aW5ub3dfcmVzdWx0cygpLHRoaXMuZm9ybV9maWVsZF9qcS50cmlnZ2VyKCJjaGFuZ2UiLHtkZXNlbGVjdGVkOnRoaXMuZm9ybV9maWVsZC5vcHRpb25zW2Iub3B0aW9uc19pbmRleF0udmFsdWV9KSx0aGlzLnNlYXJjaF9maWVsZF9zY2FsZSgpLCEwKX0sQ2hvc2VuLnByb3RvdHlwZS5zaW5nbGVfZGVzZWxlY3RfY29udHJvbF9idWlsZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFsbG93X3NpbmdsZV9kZXNlbGVjdD8odGhpcy5zZWxlY3RlZF9pdGVtLmZpbmQoImFiYnIiKS5sZW5ndGh8fHRoaXMuc2VsZWN0ZWRfaXRlbS5maW5kKCJzcGFuIikuZmlyc3QoKS5hZnRlcignPGFiYnIgY2xhc3M9InNlYXJjaC1jaG9pY2UtY2xvc2UiPjwvYWJicj4nKSx0aGlzLnNlbGVjdGVkX2l0ZW0uYWRkQ2xhc3MoImNob3Nlbi1zaW5nbGUtd2l0aC1kZXNlbGVjdCIpKTp2b2lkIDB9LENob3Nlbi5wcm90b3R5cGUuZ2V0X3NlYXJjaF90ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgpPT09dGhpcy5kZWZhdWx0X3RleHQ/IiI6YSgiPGRpdi8+IikudGV4dChhLnRyaW0odGhpcy5zZWFyY2hfZmllbGQudmFsKCkpKS5odG1sKCl9LENob3Nlbi5wcm90b3R5cGUud2lubm93X3Jlc3VsdHNfc2V0X2hpZ2hsaWdodD1mdW5jdGlvbigpe3ZhciBhLGI7cmV0dXJuIGI9dGhpcy5pc19tdWx0aXBsZT9bXTp0aGlzLnNlYXJjaF9yZXN1bHRzLmZpbmQoIi5yZXN1bHQtc2VsZWN0ZWQuYWN0aXZlLXJlc3VsdCIpLGE9Yi5sZW5ndGg/Yi5maXJzdCgpOnRoaXMuc2VhcmNoX3Jlc3VsdHMuZmluZCgiLmFjdGl2ZS1yZXN1bHQiKS5maXJzdCgpLG51bGwhPWE/dGhpcy5yZXN1bHRfZG9faGlnaGxpZ2h0KGEpOnZvaWQgMH0sQ2hvc2VuLnByb3RvdHlwZS5ub19yZXN1bHRzPWZ1bmN0aW9uKGIpe3ZhciBjO3JldHVybiBjPWEoJzxsaSBjbGFzcz0ibm8tcmVzdWx0cyI+Jyt0aGlzLnJlc3VsdHNfbm9uZV9mb3VuZCsnICI8c3Bhbj48L3NwYW4+IjwvbGk+JyksYy5maW5kKCJzcGFuIikuZmlyc3QoKS5odG1sKGIpLHRoaXMuc2VhcmNoX3Jlc3VsdHMuYXBwZW5kKGMpLHRoaXMuZm9ybV9maWVsZF9qcS50cmlnZ2VyKCJjaG9zZW46bm9fcmVzdWx0cyIse2Nob3Nlbjp0aGlzfSl9LENob3Nlbi5wcm90b3R5cGUubm9fcmVzdWx0c19jbGVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlYXJjaF9yZXN1bHRzLmZpbmQoIi5uby1yZXN1bHRzIikucmVtb3ZlKCl9LENob3Nlbi5wcm90b3R5cGUua2V5ZG93bl9hcnJvdz1mdW5jdGlvbigpe3ZhciBhO3JldHVybiB0aGlzLnJlc3VsdHNfc2hvd2luZyYmdGhpcy5yZXN1bHRfaGlnaGxpZ2h0PyhhPXRoaXMucmVzdWx0X2hpZ2hsaWdodC5uZXh0QWxsKCJsaS5hY3RpdmUtcmVzdWx0IikuZmlyc3QoKSk/dGhpcy5yZXN1bHRfZG9faGlnaGxpZ2h0KGEpOnZvaWQgMDp0aGlzLnJlc3VsdHNfc2hvdygpfSxDaG9zZW4ucHJvdG90eXBlLmtleXVwX2Fycm93PWZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIHRoaXMucmVzdWx0c19zaG93aW5nfHx0aGlzLmlzX211bHRpcGxlP3RoaXMucmVzdWx0X2hpZ2hsaWdodD8oYT10aGlzLnJlc3VsdF9oaWdobGlnaHQucHJldkFsbCgibGkuYWN0aXZlLXJlc3VsdCIpLGEubGVuZ3RoP3RoaXMucmVzdWx0X2RvX2hpZ2hsaWdodChhLmZpcnN0KCkpOih0aGlzLmNob2ljZXNfY291bnQoKT4wJiZ0aGlzLnJlc3VsdHNfaGlkZSgpLHRoaXMucmVzdWx0X2NsZWFyX2hpZ2hsaWdodCgpKSk6dm9pZCAwOnRoaXMucmVzdWx0c19zaG93KCl9LENob3Nlbi5wcm90b3R5cGUua2V5ZG93bl9iYWNrc3Ryb2tlPWZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIHRoaXMucGVuZGluZ19iYWNrc3Ryb2tlPyh0aGlzLmNob2ljZV9kZXN0cm95KHRoaXMucGVuZGluZ19iYWNrc3Ryb2tlLmZpbmQoImEiKS5maXJzdCgpKSx0aGlzLmNsZWFyX2JhY2tzdHJva2UoKSk6KGE9dGhpcy5zZWFyY2hfY29udGFpbmVyLnNpYmxpbmdzKCJsaS5zZWFyY2gtY2hvaWNlIikubGFzdCgpLGEubGVuZ3RoJiYhYS5oYXNDbGFzcygic2VhcmNoLWNob2ljZS1kaXNhYmxlZCIpPyh0aGlzLnBlbmRpbmdfYmFja3N0cm9rZT1hLHRoaXMuc2luZ2xlX2JhY2tzdHJva2VfZGVsZXRlP3RoaXMua2V5ZG93bl9iYWNrc3Ryb2tlKCk6dGhpcy5wZW5kaW5nX2JhY2tzdHJva2UuYWRkQ2xhc3MoInNlYXJjaC1jaG9pY2UtZm9jdXMiKSk6dm9pZCAwKX0sQ2hvc2VuLnByb3RvdHlwZS5jbGVhcl9iYWNrc3Ryb2tlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGVuZGluZ19iYWNrc3Ryb2tlJiZ0aGlzLnBlbmRpbmdfYmFja3N0cm9rZS5yZW1vdmVDbGFzcygic2VhcmNoLWNob2ljZS1mb2N1cyIpLHRoaXMucGVuZGluZ19iYWNrc3Ryb2tlPW51bGx9LENob3Nlbi5wcm90b3R5cGUua2V5ZG93bl9jaGVja2VyPWZ1bmN0aW9uKGEpe3ZhciBiLGM7c3dpdGNoKGI9bnVsbCE9KGM9YS53aGljaCk/YzphLmtleUNvZGUsdGhpcy5zZWFyY2hfZmllbGRfc2NhbGUoKSw4IT09YiYmdGhpcy5wZW5kaW5nX2JhY2tzdHJva2UmJnRoaXMuY2xlYXJfYmFja3N0cm9rZSgpLGIpe2Nhc2UgODp0aGlzLmJhY2tzdHJva2VfbGVuZ3RoPXRoaXMuc2VhcmNoX2ZpZWxkLnZhbCgpLmxlbmd0aDticmVhaztjYXNlIDk6dGhpcy5yZXN1bHRzX3Nob3dpbmcmJiF0aGlzLmlzX211bHRpcGxlJiZ0aGlzLnJlc3VsdF9zZWxlY3QoYSksdGhpcy5tb3VzZV9vbl9jb250YWluZXI9ITE7YnJlYWs7Y2FzZSAxMzp0aGlzLnJlc3VsdHNfc2hvd2luZyYmYS5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgMzI6dGhpcy5kaXNhYmxlX3NlYXJjaCYmYS5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgMzg6YS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMua2V5dXBfYXJyb3coKTticmVhaztjYXNlIDQwOmEucHJldmVudERlZmF1bHQoKSx0aGlzLmtleWRvd25fYXJyb3coKX19LENob3Nlbi5wcm90b3R5cGUuc2VhcmNoX2ZpZWxkX3NjYWxlPWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGUsZixnLGgsaSxqO2lmKHRoaXMuaXNfbXVsdGlwbGUpe2ZvcihkPTAsaD0wLGY9InBvc2l0aW9uOmFic29sdXRlOyBsZWZ0OiAtMTAwMHB4OyB0b3A6IC0xMDAwcHg7IGRpc3BsYXk6bm9uZTsiLGc9WyJmb250LXNpemUiLCJmb250LXN0eWxlIiwiZm9udC13ZWlnaHQiLCJmb250LWZhbWlseSIsImxpbmUtaGVpZ2h0IiwidGV4dC10cmFuc2Zvcm0iLCJsZXR0ZXItc3BhY2luZyJdLGk9MCxqPWcubGVuZ3RoO2o+aTtpKyspZT1nW2ldLGYrPWUrIjoiK3RoaXMuc2VhcmNoX2ZpZWxkLmNzcyhlKSsiOyI7cmV0dXJuIGI9YSgiPGRpdiAvPiIse3N0eWxlOmZ9KSxiLnRleHQodGhpcy5zZWFyY2hfZmllbGQudmFsKCkpLGEoImJvZHkiKS5hcHBlbmQoYiksaD1iLndpZHRoKCkrMjUsYi5yZW1vdmUoKSxjPXRoaXMuY29udGFpbmVyLm91dGVyV2lkdGgoKSxoPmMtMTAmJihoPWMtMTApLHRoaXMuc2VhcmNoX2ZpZWxkLmNzcyh7d2lkdGg6aCsicHgifSl9fSxDaG9zZW59KEFic3RyYWN0Q2hvc2VuKX0uY2FsbCh0aGlzKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2QzLmpzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvZDMuanMKaW5kZXggZWU5OTY4ZC4uZWU0NjQ3YSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvZDMuanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvZDMuanMKQEAgLTEsOTM3MyArMSw5MzczIEBACi0vKg0KLQ0KLUNvcHlyaWdodCAoYykgMjAxMywgTWljaGFlbCBCb3N0b2NrDQotQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0NCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCi0NCi0qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcw0KLSAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotDQotKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQotICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uDQotICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCi0NCi0qIFRoZSBuYW1lIE1pY2hhZWwgQm9zdG9jayBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzDQotICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0NCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyINCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFDQotRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgTUlDSEFFTCBCT1NUT0NLIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwNCi1JTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywNCi1CVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLA0KLURBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkNCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwNCi1FVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLQ0KLSovDQotDQotKGZ1bmN0aW9uKCl7aWYgKCFEYXRlLm5vdykgRGF0ZS5ub3cgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiArbmV3IERhdGU7DQotfTsNCi10cnkgew0KLSAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLCAwLCAiIik7DQotfSBjYXRjaCAoZXJyb3IpIHsNCi0gIHZhciBkM19zdHlsZV9wcm90b3R5cGUgPSBDU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZSwNCi0gICAgICBkM19zdHlsZV9zZXRQcm9wZXJ0eSA9IGQzX3N0eWxlX3Byb3RvdHlwZS5zZXRQcm9wZXJ0eTsNCi0gIGQzX3N0eWxlX3Byb3RvdHlwZS5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgew0KLSAgICBkM19zdHlsZV9zZXRQcm9wZXJ0eS5jYWxsKHRoaXMsIG5hbWUsIHZhbHVlICsgIiIsIHByaW9yaXR5KTsNCi0gIH07DQotfQ0KLWQzID0ge3ZlcnNpb246ICIyLjguMSJ9OyAvLyBzZW12ZXINCi1mdW5jdGlvbiBkM19jbGFzcyhjdG9yLCBwcm9wZXJ0aWVzKSB7DQotICB0cnkgew0KLSAgICBmb3IgKHZhciBrZXkgaW4gcHJvcGVydGllcykgew0KLSAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdG9yLnByb3RvdHlwZSwga2V5LCB7DQotICAgICAgICB2YWx1ZTogcHJvcGVydGllc1trZXldLA0KLSAgICAgICAgZW51bWVyYWJsZTogZmFsc2UNCi0gICAgICB9KTsNCi0gICAgfQ0KLSAgfSBjYXRjaCAoZSkgew0KLSAgICBjdG9yLnByb3RvdHlwZSA9IHByb3BlcnRpZXM7DQotICB9DQotfQ0KLXZhciBkM19hcnJheSA9IGQzX2FycmF5U2xpY2U7IC8vIGNvbnZlcnNpb24gZm9yIE5vZGVMaXN0cw0KLQ0KLWZ1bmN0aW9uIGQzX2FycmF5Q29weShwc2V1ZG9hcnJheSkgew0KLSAgdmFyIGkgPSAtMSwgbiA9IHBzZXVkb2FycmF5Lmxlbmd0aCwgYXJyYXkgPSBbXTsNCi0gIHdoaWxlICgrK2kgPCBuKSBhcnJheS5wdXNoKHBzZXVkb2FycmF5W2ldKTsNCi0gIHJldHVybiBhcnJheTsNCi19DQotDQotZnVuY3Rpb24gZDNfYXJyYXlTbGljZShwc2V1ZG9hcnJheSkgew0KLSAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHBzZXVkb2FycmF5KTsNCi19DQotDQotdHJ5IHsNCi0gIGQzX2FycmF5KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKVswXS5ub2RlVHlwZTsNCi19IGNhdGNoKGUpIHsNCi0gIGQzX2FycmF5ID0gZDNfYXJyYXlDb3B5Ow0KLX0NCi0NCi12YXIgZDNfYXJyYXlTdWJjbGFzcyA9IFtdLl9fcHJvdG9fXz8NCi0NCi0vLyBVbnRpbCBFQ01BU2NyaXB0IHN1cHBvcnRzIGFycmF5IHN1YmNsYXNzaW5nLCBwcm90b3R5cGUgaW5qZWN0aW9uIHdvcmtzIHdlbGwuDQotZnVuY3Rpb24oYXJyYXksIHByb3RvdHlwZSkgew0KLSAgYXJyYXkuX19wcm90b19fID0gcHJvdG90eXBlOw0KLX06DQotDQotLy8gQW5kIGlmIHlvdXIgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgX19wcm90b19fLCB3ZSdsbCB1c2UgZGlyZWN0IGV4dGVuc2lvbi4NCi1mdW5jdGlvbihhcnJheSwgcHJvdG90eXBlKSB7DQotICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm90b3R5cGUpIGFycmF5W3Byb3BlcnR5XSA9IHByb3RvdHlwZVtwcm9wZXJ0eV07DQotfTsNCi1kMy5tYXAgPSBmdW5jdGlvbihvYmplY3QpIHsNCi0gIHZhciBtYXAgPSBuZXcgZDNfTWFwOw0KLSAgZm9yICh2YXIga2V5IGluIG9iamVjdCkgbWFwLnNldChrZXksIG9iamVjdFtrZXldKTsNCi0gIHJldHVybiBtYXA7DQotfTsNCi0NCi1mdW5jdGlvbiBkM19NYXAoKSB7fQ0KLQ0KLWQzX2NsYXNzKGQzX01hcCwgew0KLSAgaGFzOiBmdW5jdGlvbihrZXkpIHsNCi0gICAgcmV0dXJuIGQzX21hcF9wcmVmaXggKyBrZXkgaW4gdGhpczsNCi0gIH0sDQotICBnZXQ6IGZ1bmN0aW9uKGtleSkgew0KLSAgICByZXR1cm4gdGhpc1tkM19tYXBfcHJlZml4ICsga2V5XTsNCi0gIH0sDQotICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsNCi0gICAgcmV0dXJuIHRoaXNbZDNfbWFwX3ByZWZpeCArIGtleV0gPSB2YWx1ZTsNCi0gIH0sDQotICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgew0KLSAgICBrZXkgPSBkM19tYXBfcHJlZml4ICsga2V5Ow0KLSAgICByZXR1cm4ga2V5IGluIHRoaXMgJiYgZGVsZXRlIHRoaXNba2V5XTsNCi0gIH0sDQotICBrZXlzOiBmdW5jdGlvbigpIHsNCi0gICAgdmFyIGtleXMgPSBbXTsNCi0gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgeyBrZXlzLnB1c2goa2V5KTsgfSk7DQotICAgIHJldHVybiBrZXlzOw0KLSAgfSwNCi0gIHZhbHVlczogZnVuY3Rpb24oKSB7DQotICAgIHZhciB2YWx1ZXMgPSBbXTsNCi0gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsgdmFsdWVzLnB1c2godmFsdWUpOyB9KTsNCi0gICAgcmV0dXJuIHZhbHVlczsNCi0gIH0sDQotICBlbnRyaWVzOiBmdW5jdGlvbigpIHsNCi0gICAgdmFyIGVudHJpZXMgPSBbXTsNCi0gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsgZW50cmllcy5wdXNoKHtrZXk6IGtleSwgdmFsdWU6IHZhbHVlfSk7IH0pOw0KLSAgICByZXR1cm4gZW50cmllczsNCi0gIH0sDQotICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7DQotICAgIGZvciAodmFyIGtleSBpbiB0aGlzKSB7DQotICAgICAgaWYgKGtleS5jaGFyQ29kZUF0KDApID09PSBkM19tYXBfcHJlZml4Q29kZSkgew0KLSAgICAgICAgZi5jYWxsKHRoaXMsIGtleS5zdWJzdHJpbmcoMSksIHRoaXNba2V5XSk7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotfSk7DQotDQotdmFyIGQzX21hcF9wcmVmaXggPSAiXDAiLCAvLyBwcmV2ZW50IGNvbGxpc2lvbiB3aXRoIGJ1aWx0LWlucw0KLSAgICBkM19tYXBfcHJlZml4Q29kZSA9IGQzX21hcF9wcmVmaXguY2hhckNvZGVBdCgwKTsNCi1mdW5jdGlvbiBkM190aGlzKCkgew0KLSAgcmV0dXJuIHRoaXM7DQotfQ0KLWQzLmZ1bmN0b3IgPSBmdW5jdGlvbih2KSB7DQotICByZXR1cm4gdHlwZW9mIHYgPT09ICJmdW5jdGlvbiIgPyB2IDogZnVuY3Rpb24oKSB7IHJldHVybiB2OyB9Ow0KLX07DQotLy8gQ29waWVzIGEgdmFyaWFibGUgbnVtYmVyIG9mIG1ldGhvZHMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0Lg0KLWQzLnJlYmluZCA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7DQotICB2YXIgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBtZXRob2Q7DQotICB3aGlsZSAoKytpIDwgbikgdGFyZ2V0W21ldGhvZCA9IGFyZ3VtZW50c1tpXV0gPSBkM19yZWJpbmQodGFyZ2V0LCBzb3VyY2UsIHNvdXJjZVttZXRob2RdKTsNCi0gIHJldHVybiB0YXJnZXQ7DQotfTsNCi0NCi0vLyBNZXRob2QgaXMgYXNzdW1lZCB0byBiZSBhIHN0YW5kYXJkIEQzIGdldHRlci1zZXR0ZXI6DQotLy8gSWYgcGFzc2VkIHdpdGggbm8gYXJndW1lbnRzLCBnZXRzIHRoZSB2YWx1ZS4NCi0vLyBJZiBwYXNzZWQgd2l0aCBhcmd1bWVudHMsIHNldHMgdGhlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSB0YXJnZXQuDQotZnVuY3Rpb24gZDNfcmViaW5kKHRhcmdldCwgc291cmNlLCBtZXRob2QpIHsNCi0gIHJldHVybiBmdW5jdGlvbigpIHsNCi0gICAgdmFyIHZhbHVlID0gbWV0aG9kLmFwcGx5KHNvdXJjZSwgYXJndW1lbnRzKTsNCi0gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0YXJnZXQgOiB2YWx1ZTsNCi0gIH07DQotfQ0KLWQzLmFzY2VuZGluZyA9IGZ1bmN0aW9uKGEsIGIpIHsNCi0gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsNCi19Ow0KLWQzLmRlc2NlbmRpbmcgPSBmdW5jdGlvbihhLCBiKSB7DQotICByZXR1cm4gYiA8IGEgPyAtMSA6IGIgPiBhID8gMSA6IGIgPj0gYSA/IDAgOiBOYU47DQotfTsNCi1kMy5tZWFuID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCi0gIHZhciBuID0gYXJyYXkubGVuZ3RoLA0KLSAgICAgIGEsDQotICAgICAgbSA9IDAsDQotICAgICAgaSA9IC0xLA0KLSAgICAgIGogPSAwOw0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsNCi0gICAgd2hpbGUgKCsraSA8IG4pIGlmIChkM19udW1iZXIoYSA9IGFycmF5W2ldKSkgbSArPSAoYSAtIG0pIC8gKytqOw0KLSAgfSBlbHNlIHsNCi0gICAgd2hpbGUgKCsraSA8IG4pIGlmIChkM19udW1iZXIoYSA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSkgbSArPSAoYSAtIG0pIC8gKytqOw0KLSAgfQ0KLSAgcmV0dXJuIGogPyBtIDogdW5kZWZpbmVkOw0KLX07DQotZDMubWVkaWFuID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgYXJyYXkgPSBhcnJheS5tYXAoZik7DQotICBhcnJheSA9IGFycmF5LmZpbHRlcihkM19udW1iZXIpOw0KLSAgcmV0dXJuIGFycmF5Lmxlbmd0aCA/IGQzLnF1YW50aWxlKGFycmF5LnNvcnQoZDMuYXNjZW5kaW5nKSwgLjUpIDogdW5kZWZpbmVkOw0KLX07DQotZDMubWluID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCi0gIHZhciBpID0gLTEsDQotICAgICAgbiA9IGFycmF5Lmxlbmd0aCwNCi0gICAgICBhLA0KLSAgICAgIGI7DQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgew0KLSAgICB3aGlsZSAoKytpIDwgbiAmJiAoKGEgPSBhcnJheVtpXSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gdW5kZWZpbmVkOw0KLSAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYSA+IGIpIGEgPSBiOw0KLSAgfSBlbHNlIHsNCi0gICAgd2hpbGUgKCsraSA8IG4gJiYgKChhID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpID09IG51bGwgfHwgYSAhPSBhKSkgYSA9IHVuZGVmaW5lZDsNCi0gICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsICYmIGEgPiBiKSBhID0gYjsNCi0gIH0NCi0gIHJldHVybiBhOw0KLX07DQotZDMubWF4ID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCi0gIHZhciBpID0gLTEsDQotICAgICAgbiA9IGFycmF5Lmxlbmd0aCwNCi0gICAgICBhLA0KLSAgICAgIGI7DQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgew0KLSAgICB3aGlsZSAoKytpIDwgbiAmJiAoKGEgPSBhcnJheVtpXSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gdW5kZWZpbmVkOw0KLSAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+IGEpIGEgPSBiOw0KLSAgfSBlbHNlIHsNCi0gICAgd2hpbGUgKCsraSA8IG4gJiYgKChhID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpID09IG51bGwgfHwgYSAhPSBhKSkgYSA9IHVuZGVmaW5lZDsNCi0gICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsICYmIGIgPiBhKSBhID0gYjsNCi0gIH0NCi0gIHJldHVybiBhOw0KLX07DQotZDMuZXh0ZW50ID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCi0gIHZhciBpID0gLTEsDQotICAgICAgbiA9IGFycmF5Lmxlbmd0aCwNCi0gICAgICBhLA0KLSAgICAgIGIsDQotICAgICAgYzsNCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7DQotICAgIHdoaWxlICgrK2kgPCBuICYmICgoYSA9IGMgPSBhcnJheVtpXSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gYyA9IHVuZGVmaW5lZDsNCi0gICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsKSB7DQotICAgICAgaWYgKGEgPiBiKSBhID0gYjsNCi0gICAgICBpZiAoYyA8IGIpIGMgPSBiOw0KLSAgICB9DQotICB9IGVsc2Ugew0KLSAgICB3aGlsZSAoKytpIDwgbiAmJiAoKGEgPSBjID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpID09IG51bGwgfHwgYSAhPSBhKSkgYSA9IHVuZGVmaW5lZDsNCi0gICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsKSB7DQotICAgICAgaWYgKGEgPiBiKSBhID0gYjsNCi0gICAgICBpZiAoYyA8IGIpIGMgPSBiOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gW2EsIGNdOw0KLX07DQotZDMucmFuZG9tID0gew0KLSAgbm9ybWFsOiBmdW5jdGlvbihtZWFuLCBkZXZpYXRpb24pIHsNCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBkZXZpYXRpb24gPSAxOw0KLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIG1lYW4gPSAwOw0KLSAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQotICAgICAgdmFyIHgsIHksIHI7DQotICAgICAgZG8gew0KLSAgICAgICAgeCA9IE1hdGgucmFuZG9tKCkgKiAyIC0gMTsNCi0gICAgICAgIHkgPSBNYXRoLnJhbmRvbSgpICogMiAtIDE7DQotICAgICAgICByID0geCAqIHggKyB5ICogeTsNCi0gICAgICB9IHdoaWxlICghciB8fCByID4gMSk7DQotICAgICAgcmV0dXJuIG1lYW4gKyBkZXZpYXRpb24gKiB4ICogTWF0aC5zcXJ0KC0yICogTWF0aC5sb2cocikgLyByKTsNCi0gICAgfTsNCi0gIH0NCi19Ow0KLWZ1bmN0aW9uIGQzX251bWJlcih4KSB7DQotICByZXR1cm4geCAhPSBudWxsICYmICFpc05hTih4KTsNCi19DQotZDMuc3VtID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCi0gIHZhciBzID0gMCwNCi0gICAgICBuID0gYXJyYXkubGVuZ3RoLA0KLSAgICAgIGEsDQotICAgICAgaSA9IC0xOw0KLQ0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsNCi0gICAgd2hpbGUgKCsraSA8IG4pIGlmICghaXNOYU4oYSA9ICthcnJheVtpXSkpIHMgKz0gYTsNCi0gIH0gZWxzZSB7DQotICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWlzTmFOKGEgPSArZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpKSBzICs9IGE7DQotICB9DQotDQotICByZXR1cm4gczsNCi19Ow0KLS8vIFItNyBwZXIgPGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUXVhbnRpbGU+DQotZDMucXVhbnRpbGUgPSBmdW5jdGlvbih2YWx1ZXMsIHApIHsNCi0gIHZhciBIID0gKHZhbHVlcy5sZW5ndGggLSAxKSAqIHAgKyAxLA0KLSAgICAgIGggPSBNYXRoLmZsb29yKEgpLA0KLSAgICAgIHYgPSB2YWx1ZXNbaCAtIDFdLA0KLSAgICAgIGUgPSBIIC0gaDsNCi0gIHJldHVybiBlID8gdiArIGUgKiAodmFsdWVzW2hdIC0gdikgOiB2Ow0KLX07DQotZDMudHJhbnNwb3NlID0gZnVuY3Rpb24obWF0cml4KSB7DQotICByZXR1cm4gZDMuemlwLmFwcGx5KGQzLCBtYXRyaXgpOw0KLX07DQotZDMuemlwID0gZnVuY3Rpb24oKSB7DQotICBpZiAoIShuID0gYXJndW1lbnRzLmxlbmd0aCkpIHJldHVybiBbXTsNCi0gIGZvciAodmFyIGkgPSAtMSwgbSA9IGQzLm1pbihhcmd1bWVudHMsIGQzX3ppcExlbmd0aCksIHppcHMgPSBuZXcgQXJyYXkobSk7ICsraSA8IG07KSB7DQotICAgIGZvciAodmFyIGogPSAtMSwgbiwgemlwID0gemlwc1tpXSA9IG5ldyBBcnJheShuKTsgKytqIDwgbjspIHsNCi0gICAgICB6aXBbal0gPSBhcmd1bWVudHNbal1baV07DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiB6aXBzOw0KLX07DQotDQotZnVuY3Rpb24gZDNfemlwTGVuZ3RoKGQpIHsNCi0gIHJldHVybiBkLmxlbmd0aDsNCi19DQotZDMuYmlzZWN0b3IgPSBmdW5jdGlvbihmKSB7DQotICByZXR1cm4gew0KLSAgICBsZWZ0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsNCi0gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGxvID0gMDsNCi0gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDQpIGhpID0gYS5sZW5ndGg7DQotICAgICAgd2hpbGUgKGxvIDwgaGkpIHsNCi0gICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+IDE7DQotICAgICAgICBpZiAoZi5jYWxsKGEsIGFbbWlkXSwgbWlkKSA8IHgpIGxvID0gbWlkICsgMTsNCi0gICAgICAgIGVsc2UgaGkgPSBtaWQ7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBsbzsNCi0gICAgfSwNCi0gICAgcmlnaHQ6IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSkgew0KLSAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgbG8gPSAwOw0KLSAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNCkgaGkgPSBhLmxlbmd0aDsNCi0gICAgICB3aGlsZSAobG8gPCBoaSkgew0KLSAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4gMTsNCi0gICAgICAgIGlmICh4IDwgZi5jYWxsKGEsIGFbbWlkXSwgbWlkKSkgaGkgPSBtaWQ7DQotICAgICAgICBlbHNlIGxvID0gbWlkICsgMTsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIGxvOw0KLSAgICB9DQotICB9Ow0KLX07DQotDQotdmFyIGQzX2Jpc2VjdG9yID0gZDMuYmlzZWN0b3IoZnVuY3Rpb24oZCkgeyByZXR1cm4gZDsgfSk7DQotZDMuYmlzZWN0TGVmdCA9IGQzX2Jpc2VjdG9yLmxlZnQ7DQotZDMuYmlzZWN0ID0gZDMuYmlzZWN0UmlnaHQgPSBkM19iaXNlY3Rvci5yaWdodDsNCi1kMy5maXJzdCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7DQotICB2YXIgaSA9IDAsDQotICAgICAgbiA9IGFycmF5Lmxlbmd0aCwNCi0gICAgICBhID0gYXJyYXlbMF0sDQotICAgICAgYjsNCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSBmID0gZDMuYXNjZW5kaW5nOw0KLSAgd2hpbGUgKCsraSA8IG4pIHsNCi0gICAgaWYgKGYuY2FsbChhcnJheSwgYSwgYiA9IGFycmF5W2ldKSA+IDApIHsNCi0gICAgICBhID0gYjsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIGE7DQotfTsNCi1kMy5sYXN0ID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCi0gIHZhciBpID0gMCwNCi0gICAgICBuID0gYXJyYXkubGVuZ3RoLA0KLSAgICAgIGEgPSBhcnJheVswXSwNCi0gICAgICBiOw0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIGYgPSBkMy5hc2NlbmRpbmc7DQotICB3aGlsZSAoKytpIDwgbikgew0KLSAgICBpZiAoZi5jYWxsKGFycmF5LCBhLCBiID0gYXJyYXlbaV0pIDw9IDApIHsNCi0gICAgICBhID0gYjsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIGE7DQotfTsNCi1kMy5uZXN0ID0gZnVuY3Rpb24oKSB7DQotICB2YXIgbmVzdCA9IHt9LA0KLSAgICAgIGtleXMgPSBbXSwNCi0gICAgICBzb3J0S2V5cyA9IFtdLA0KLSAgICAgIHNvcnRWYWx1ZXMsDQotICAgICAgcm9sbHVwOw0KLQ0KLSAgZnVuY3Rpb24gbWFwKGFycmF5LCBkZXB0aCkgew0KLSAgICBpZiAoZGVwdGggPj0ga2V5cy5sZW5ndGgpIHJldHVybiByb2xsdXANCi0gICAgICAgID8gcm9sbHVwLmNhbGwobmVzdCwgYXJyYXkpIDogKHNvcnRWYWx1ZXMNCi0gICAgICAgID8gYXJyYXkuc29ydChzb3J0VmFsdWVzKQ0KLSAgICAgICAgOiBhcnJheSk7DQotDQotICAgIHZhciBpID0gLTEsDQotICAgICAgICBuID0gYXJyYXkubGVuZ3RoLA0KLSAgICAgICAga2V5ID0ga2V5c1tkZXB0aCsrXSwNCi0gICAgICAgIGtleVZhbHVlLA0KLSAgICAgICAgb2JqZWN0LA0KLSAgICAgICAgdmFsdWVzQnlLZXkgPSBuZXcgZDNfTWFwLA0KLSAgICAgICAgdmFsdWVzLA0KLSAgICAgICAgbyA9IHt9Ow0KLQ0KLSAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXkob2JqZWN0ID0gYXJyYXlbaV0pKSkgew0KLSAgICAgICAgdmFsdWVzLnB1c2gob2JqZWN0KTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgdmFsdWVzQnlLZXkuc2V0KGtleVZhbHVlLCBbb2JqZWN0XSk7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIHZhbHVlc0J5S2V5LmZvckVhY2goZnVuY3Rpb24oa2V5VmFsdWUpIHsNCi0gICAgICBvW2tleVZhbHVlXSA9IG1hcCh2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUpLCBkZXB0aCk7DQotICAgIH0pOw0KLQ0KLSAgICByZXR1cm4gbzsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGVudHJpZXMobWFwLCBkZXB0aCkgew0KLSAgICBpZiAoZGVwdGggPj0ga2V5cy5sZW5ndGgpIHJldHVybiBtYXA7DQotDQotICAgIHZhciBhID0gW10sDQotICAgICAgICBzb3J0S2V5ID0gc29ydEtleXNbZGVwdGgrK10sDQotICAgICAgICBrZXk7DQotDQotICAgIGZvciAoa2V5IGluIG1hcCkgew0KLSAgICAgIGEucHVzaCh7a2V5OiBrZXksIHZhbHVlczogZW50cmllcyhtYXBba2V5XSwgZGVwdGgpfSk7DQotICAgIH0NCi0NCi0gICAgaWYgKHNvcnRLZXkpIGEuc29ydChmdW5jdGlvbihhLCBiKSB7DQotICAgICAgcmV0dXJuIHNvcnRLZXkoYS5rZXksIGIua2V5KTsNCi0gICAgfSk7DQotDQotICAgIHJldHVybiBhOw0KLSAgfQ0KLQ0KLSAgbmVzdC5tYXAgPSBmdW5jdGlvbihhcnJheSkgew0KLSAgICByZXR1cm4gbWFwKGFycmF5LCAwKTsNCi0gIH07DQotDQotICBuZXN0LmVudHJpZXMgPSBmdW5jdGlvbihhcnJheSkgew0KLSAgICByZXR1cm4gZW50cmllcyhtYXAoYXJyYXksIDApLCAwKTsNCi0gIH07DQotDQotICBuZXN0LmtleSA9IGZ1bmN0aW9uKGQpIHsNCi0gICAga2V5cy5wdXNoKGQpOw0KLSAgICByZXR1cm4gbmVzdDsNCi0gIH07DQotDQotICAvLyBTcGVjaWZpZXMgdGhlIG9yZGVyIGZvciB0aGUgbW9zdC1yZWNlbnRseSBzcGVjaWZpZWQga2V5Lg0KLSAgLy8gTm90ZTogb25seSBhcHBsaWVzIHRvIGVudHJpZXMuIE1hcCBrZXlzIGFyZSB1bm9yZGVyZWQhDQotICBuZXN0LnNvcnRLZXlzID0gZnVuY3Rpb24ob3JkZXIpIHsNCi0gICAgc29ydEtleXNba2V5cy5sZW5ndGggLSAxXSA9IG9yZGVyOw0KLSAgICByZXR1cm4gbmVzdDsNCi0gIH07DQotDQotICAvLyBTcGVjaWZpZXMgdGhlIG9yZGVyIGZvciBsZWFmIHZhbHVlcy4NCi0gIC8vIEFwcGxpZXMgdG8gYm90aCBtYXBzIGFuZCBlbnRyaWVzIGFycmF5Lg0KLSAgbmVzdC5zb3J0VmFsdWVzID0gZnVuY3Rpb24ob3JkZXIpIHsNCi0gICAgc29ydFZhbHVlcyA9IG9yZGVyOw0KLSAgICByZXR1cm4gbmVzdDsNCi0gIH07DQotDQotICBuZXN0LnJvbGx1cCA9IGZ1bmN0aW9uKGYpIHsNCi0gICAgcm9sbHVwID0gZjsNCi0gICAgcmV0dXJuIG5lc3Q7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIG5lc3Q7DQotfTsNCi1kMy5rZXlzID0gZnVuY3Rpb24obWFwKSB7DQotICB2YXIga2V5cyA9IFtdOw0KLSAgZm9yICh2YXIga2V5IGluIG1hcCkga2V5cy5wdXNoKGtleSk7DQotICByZXR1cm4ga2V5czsNCi19Ow0KLWQzLnZhbHVlcyA9IGZ1bmN0aW9uKG1hcCkgew0KLSAgdmFyIHZhbHVlcyA9IFtdOw0KLSAgZm9yICh2YXIga2V5IGluIG1hcCkgdmFsdWVzLnB1c2gobWFwW2tleV0pOw0KLSAgcmV0dXJuIHZhbHVlczsNCi19Ow0KLWQzLmVudHJpZXMgPSBmdW5jdGlvbihtYXApIHsNCi0gIHZhciBlbnRyaWVzID0gW107DQotICBmb3IgKHZhciBrZXkgaW4gbWFwKSBlbnRyaWVzLnB1c2goe2tleToga2V5LCB2YWx1ZTogbWFwW2tleV19KTsNCi0gIHJldHVybiBlbnRyaWVzOw0KLX07DQotZDMucGVybXV0ZSA9IGZ1bmN0aW9uKGFycmF5LCBpbmRleGVzKSB7DQotICB2YXIgcGVybXV0ZXMgPSBbXSwNCi0gICAgICBpID0gLTEsDQotICAgICAgbiA9IGluZGV4ZXMubGVuZ3RoOw0KLSAgd2hpbGUgKCsraSA8IG4pIHBlcm11dGVzW2ldID0gYXJyYXlbaW5kZXhlc1tpXV07DQotICByZXR1cm4gcGVybXV0ZXM7DQotfTsNCi1kMy5tZXJnZSA9IGZ1bmN0aW9uKGFycmF5cykgew0KLSAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIGFycmF5cyk7DQotfTsNCi1kMy5zcGxpdCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7DQotICB2YXIgYXJyYXlzID0gW10sDQotICAgICAgdmFsdWVzID0gW10sDQotICAgICAgdmFsdWUsDQotICAgICAgaSA9IC0xLA0KLSAgICAgIG4gPSBhcnJheS5sZW5ndGg7DQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIGYgPSBkM19zcGxpdHRlcjsNCi0gIHdoaWxlICgrK2kgPCBuKSB7DQotICAgIGlmIChmLmNhbGwodmFsdWVzLCB2YWx1ZSA9IGFycmF5W2ldLCBpKSkgew0KLSAgICAgIHZhbHVlcyA9IFtdOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGlmICghdmFsdWVzLmxlbmd0aCkgYXJyYXlzLnB1c2godmFsdWVzKTsNCi0gICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBhcnJheXM7DQotfTsNCi0NCi1mdW5jdGlvbiBkM19zcGxpdHRlcihkKSB7DQotICByZXR1cm4gZCA9PSBudWxsOw0KLX0NCi1mdW5jdGlvbiBkM19jb2xsYXBzZShzKSB7DQotICByZXR1cm4gcy5yZXBsYWNlKC8oXlxzKyl8KFxzKyQpL2csICIiKS5yZXBsYWNlKC9ccysvZywgIiAiKTsNCi19DQotZDMucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkgew0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7DQotICAgIHN0ZXAgPSAxOw0KLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsNCi0gICAgICBzdG9wID0gc3RhcnQ7DQotICAgICAgc3RhcnQgPSAwOw0KLSAgICB9DQotICB9DQotICBpZiAoKHN0b3AgLSBzdGFydCkgLyBzdGVwID09PSBJbmZpbml0eSkgdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpOw0KLSAgdmFyIHJhbmdlID0gW10sDQotICAgICAgIGsgPSBkM19yYW5nZV9pbnRlZ2VyU2NhbGUoTWF0aC5hYnMoc3RlcCkpLA0KLSAgICAgICBpID0gLTEsDQotICAgICAgIGo7DQotICBzdGFydCAqPSBrLCBzdG9wICo9IGssIHN0ZXAgKj0gazsNCi0gIGlmIChzdGVwIDwgMCkgd2hpbGUgKChqID0gc3RhcnQgKyBzdGVwICogKytpKSA+IHN0b3ApIHJhbmdlLnB1c2goaiAvIGspOw0KLSAgZWxzZSB3aGlsZSAoKGogPSBzdGFydCArIHN0ZXAgKiArK2kpIDwgc3RvcCkgcmFuZ2UucHVzaChqIC8gayk7DQotICByZXR1cm4gcmFuZ2U7DQotfTsNCi0NCi1mdW5jdGlvbiBkM19yYW5nZV9pbnRlZ2VyU2NhbGUoeCkgew0KLSAgdmFyIGsgPSAxOw0KLSAgd2hpbGUgKHggKiBrICUgMSkgayAqPSAxMDsNCi0gIHJldHVybiBrOw0KLX0NCi1kMy5yZXF1b3RlID0gZnVuY3Rpb24ocykgew0KLSAgcmV0dXJuIHMucmVwbGFjZShkM19yZXF1b3RlX3JlLCAiXFwkJiIpOw0KLX07DQotDQotdmFyIGQzX3JlcXVvdGVfcmUgPSAvW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2c7DQotZDMucm91bmQgPSBmdW5jdGlvbih4LCBuKSB7DQotICByZXR1cm4gbg0KLSAgICAgID8gTWF0aC5yb3VuZCh4ICogKG4gPSBNYXRoLnBvdygxMCwgbikpKSAvIG4NCi0gICAgICA6IE1hdGgucm91bmQoeCk7DQotfTsNCi1kMy54aHIgPSBmdW5jdGlvbih1cmwsIG1pbWUsIGNhbGxiYWNrKSB7DQotICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0Ow0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBjYWxsYmFjayA9IG1pbWUsIG1pbWUgPSBudWxsOw0KLSAgZWxzZSBpZiAobWltZSAmJiByZXEub3ZlcnJpZGVNaW1lVHlwZSkgcmVxLm92ZXJyaWRlTWltZVR5cGUobWltZSk7DQotICByZXEub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsNCi0gIGlmIChtaW1lKSByZXEuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IiwgbWltZSk7DQotICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7DQotICAgIGlmIChyZXEucmVhZHlTdGF0ZSA9PT0gNCkgY2FsbGJhY2socmVxLnN0YXR1cyA8IDMwMCA/IHJlcSA6IG51bGwpOw0KLSAgfTsNCi0gIHJlcS5zZW5kKG51bGwpOw0KLX07DQotZDMudGV4dCA9IGZ1bmN0aW9uKHVybCwgbWltZSwgY2FsbGJhY2spIHsNCi0gIGZ1bmN0aW9uIHJlYWR5KHJlcSkgew0KLSAgICBjYWxsYmFjayhyZXEgJiYgcmVxLnJlc3BvbnNlVGV4dCk7DQotICB9DQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHsNCi0gICAgY2FsbGJhY2sgPSBtaW1lOw0KLSAgICBtaW1lID0gbnVsbDsNCi0gIH0NCi0gIGQzLnhocih1cmwsIG1pbWUsIHJlYWR5KTsNCi19Ow0KLWQzLmpzb24gPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7DQotICBkMy50ZXh0KHVybCwgImFwcGxpY2F0aW9uL2pzb24iLCBmdW5jdGlvbih0ZXh0KSB7DQotICAgIGNhbGxiYWNrKHRleHQgPyBKU09OLnBhcnNlKHRleHQpIDogbnVsbCk7DQotICB9KTsNCi19Ow0KLWQzLmh0bWwgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7DQotICBkMy50ZXh0KHVybCwgInRleHQvaHRtbCIsIGZ1bmN0aW9uKHRleHQpIHsNCi0gICAgaWYgKHRleHQgIT0gbnVsbCkgeyAvLyBUcmVhdCBlbXB0eSBzdHJpbmcgYXMgdmFsaWQgSFRNTC4NCi0gICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOw0KLSAgICAgIHJhbmdlLnNlbGVjdE5vZGUoZG9jdW1lbnQuYm9keSk7DQotICAgICAgdGV4dCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0ZXh0KTsNCi0gICAgfQ0KLSAgICBjYWxsYmFjayh0ZXh0KTsNCi0gIH0pOw0KLX07DQotZDMueG1sID0gZnVuY3Rpb24odXJsLCBtaW1lLCBjYWxsYmFjaykgew0KLSAgZnVuY3Rpb24gcmVhZHkocmVxKSB7DQotICAgIGNhbGxiYWNrKHJlcSAmJiByZXEucmVzcG9uc2VYTUwpOw0KLSAgfQ0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7DQotICAgIGNhbGxiYWNrID0gbWltZTsNCi0gICAgbWltZSA9IG51bGw7DQotICB9DQotICBkMy54aHIodXJsLCBtaW1lLCByZWFkeSk7DQotfTsNCi12YXIgZDNfbnNQcmVmaXggPSB7DQotICBzdmc6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsDQotICB4aHRtbDogImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLA0KLSAgeGxpbms6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwNCi0gIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsDQotICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIg0KLX07DQotDQotZDMubnMgPSB7DQotICBwcmVmaXg6IGQzX25zUHJlZml4LA0KLSAgcXVhbGlmeTogZnVuY3Rpb24obmFtZSkgew0KLSAgICB2YXIgaSA9IG5hbWUuaW5kZXhPZigiOiIpLA0KLSAgICAgICAgcHJlZml4ID0gbmFtZTsNCi0gICAgaWYgKGkgPj0gMCkgew0KLSAgICAgIHByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKDAsIGkpOw0KLSAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpICsgMSk7DQotICAgIH0NCi0gICAgcmV0dXJuIGQzX25zUHJlZml4Lmhhc093blByb3BlcnR5KHByZWZpeCkNCi0gICAgICAgID8ge3NwYWNlOiBkM19uc1ByZWZpeFtwcmVmaXhdLCBsb2NhbDogbmFtZX0NCi0gICAgICAgIDogbmFtZTsNCi0gIH0NCi19Ow0KLWQzLmRpc3BhdGNoID0gZnVuY3Rpb24oKSB7DQotICB2YXIgZGlzcGF0Y2ggPSBuZXcgZDNfZGlzcGF0Y2gsDQotICAgICAgaSA9IC0xLA0KLSAgICAgIG4gPSBhcmd1bWVudHMubGVuZ3RoOw0KLSAgd2hpbGUgKCsraSA8IG4pIGRpc3BhdGNoW2FyZ3VtZW50c1tpXV0gPSBkM19kaXNwYXRjaF9ldmVudChkaXNwYXRjaCk7DQotICByZXR1cm4gZGlzcGF0Y2g7DQotfTsNCi0NCi1mdW5jdGlvbiBkM19kaXNwYXRjaCgpIHt9DQotDQotZDNfZGlzcGF0Y2gucHJvdG90eXBlLm9uID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHsNCi0gIHZhciBpID0gdHlwZS5pbmRleE9mKCIuIiksDQotICAgICAgbmFtZSA9ICIiOw0KLQ0KLSAgLy8gRXh0cmFjdCBvcHRpb25hbCBuYW1lc3BhY2UsIGUuZy4sICJjbGljay5mb28iDQotICBpZiAoaSA+IDApIHsNCi0gICAgbmFtZSA9IHR5cGUuc3Vic3RyaW5nKGkgKyAxKTsNCi0gICAgdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDAsIGkpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyDQotICAgICAgPyB0aGlzW3R5cGVdLm9uKG5hbWUpDQotICAgICAgOiB0aGlzW3R5cGVdLm9uKG5hbWUsIGxpc3RlbmVyKTsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX2Rpc3BhdGNoX2V2ZW50KGRpc3BhdGNoKSB7DQotICB2YXIgbGlzdGVuZXJzID0gW10sDQotICAgICAgbGlzdGVuZXJCeU5hbWUgPSBuZXcgZDNfTWFwOw0KLQ0KLSAgZnVuY3Rpb24gZXZlbnQoKSB7DQotICAgIHZhciB6ID0gbGlzdGVuZXJzLCAvLyBkZWZlbnNpdmUgcmVmZXJlbmNlDQotICAgICAgICBpID0gLTEsDQotICAgICAgICBuID0gei5sZW5ndGgsDQotICAgICAgICBsOw0KLSAgICB3aGlsZSAoKytpIDwgbikgaWYgKGwgPSB6W2ldLm9uKSBsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQotICAgIHJldHVybiBkaXNwYXRjaDsNCi0gIH0NCi0NCi0gIGV2ZW50Lm9uID0gZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHsNCi0gICAgdmFyIGwgPSBsaXN0ZW5lckJ5TmFtZS5nZXQobmFtZSksDQotICAgICAgICBpOw0KLQ0KLSAgICAvLyByZXR1cm4gdGhlIGN1cnJlbnQgbGlzdGVuZXIsIGlmIGFueQ0KLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBsICYmIGwub247DQotDQotICAgIC8vIHJlbW92ZSB0aGUgb2xkIGxpc3RlbmVyLCBpZiBhbnkgKHdpdGggY29weS1vbi13cml0ZSkNCi0gICAgaWYgKGwpIHsNCi0gICAgICBsLm9uID0gbnVsbDsNCi0gICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoMCwgaSA9IGxpc3RlbmVycy5pbmRleE9mKGwpKS5jb25jYXQobGlzdGVuZXJzLnNsaWNlKGkgKyAxKSk7DQotICAgICAgbGlzdGVuZXJCeU5hbWUucmVtb3ZlKG5hbWUpOw0KLSAgICB9DQotDQotICAgIC8vIGFkZCB0aGUgbmV3IGxpc3RlbmVyLCBpZiBhbnkNCi0gICAgaWYgKGxpc3RlbmVyKSBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lckJ5TmFtZS5zZXQobmFtZSwge29uOiBsaXN0ZW5lcn0pKTsNCi0NCi0gICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgfTsNCi0NCi0gIHJldHVybiBldmVudDsNCi19DQotLy8gVE9ETyBhbGlnbg0KLWQzLmZvcm1hdCA9IGZ1bmN0aW9uKHNwZWNpZmllcikgew0KLSAgdmFyIG1hdGNoID0gZDNfZm9ybWF0X3JlLmV4ZWMoc3BlY2lmaWVyKSwNCi0gICAgICBmaWxsID0gbWF0Y2hbMV0gfHwgIiAiLA0KLSAgICAgIHNpZ24gPSBtYXRjaFszXSB8fCAiIiwNCi0gICAgICB6ZmlsbCA9IG1hdGNoWzVdLA0KLSAgICAgIHdpZHRoID0gK21hdGNoWzZdLA0KLSAgICAgIGNvbW1hID0gbWF0Y2hbN10sDQotICAgICAgcHJlY2lzaW9uID0gbWF0Y2hbOF0sDQotICAgICAgdHlwZSA9IG1hdGNoWzldLA0KLSAgICAgIHNjYWxlID0gMSwNCi0gICAgICBzdWZmaXggPSAiIiwNCi0gICAgICBpbnRlZ2VyID0gZmFsc2U7DQotDQotICBpZiAocHJlY2lzaW9uKSBwcmVjaXNpb24gPSArcHJlY2lzaW9uLnN1YnN0cmluZygxKTsNCi0NCi0gIGlmICh6ZmlsbCkgew0KLSAgICBmaWxsID0gIjAiOyAvLyBUT0RPIGFsaWduID0gIj0iOw0KLSAgICBpZiAoY29tbWEpIHdpZHRoIC09IE1hdGguZmxvb3IoKHdpZHRoIC0gMSkgLyA0KTsNCi0gIH0NCi0NCi0gIHN3aXRjaCAodHlwZSkgew0KLSAgICBjYXNlICJuIjogY29tbWEgPSB0cnVlOyB0eXBlID0gImciOyBicmVhazsNCi0gICAgY2FzZSAiJSI6IHNjYWxlID0gMTAwOyBzdWZmaXggPSAiJSI7IHR5cGUgPSAiZiI7IGJyZWFrOw0KLSAgICBjYXNlICJwIjogc2NhbGUgPSAxMDA7IHN1ZmZpeCA9ICIlIjsgdHlwZSA9ICJyIjsgYnJlYWs7DQotICAgIGNhc2UgImQiOiBpbnRlZ2VyID0gdHJ1ZTsgcHJlY2lzaW9uID0gMDsgYnJlYWs7DQotICAgIGNhc2UgInMiOiBzY2FsZSA9IC0xOyB0eXBlID0gInIiOyBicmVhazsNCi0gIH0NCi0NCi0gIC8vIElmIG5vIHByZWNpc2lvbiBpcyBzcGVjaWZpZWQgZm9yIHIsIGZhbGxiYWNrIHRvIGdlbmVyYWwgbm90YXRpb24uDQotICBpZiAodHlwZSA9PSAiciIgJiYgIXByZWNpc2lvbikgdHlwZSA9ICJnIjsNCi0NCi0gIHR5cGUgPSBkM19mb3JtYXRfdHlwZXMuZ2V0KHR5cGUpIHx8IGQzX2Zvcm1hdF90eXBlRGVmYXVsdDsNCi0NCi0gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgew0KLQ0KLSAgICAvLyBSZXR1cm4gdGhlIGVtcHR5IHN0cmluZyBmb3IgZmxvYXRzIGZvcm1hdHRlZCBhcyBpbnRzLg0KLSAgICBpZiAoaW50ZWdlciAmJiAodmFsdWUgJSAxKSkgcmV0dXJuICIiOw0KLQ0KLSAgICAvLyBDb252ZXJ0IG5lZ2F0aXZlIHRvIHBvc2l0aXZlLCBhbmQgcmVjb3JkIHRoZSBzaWduIHByZWZpeC4NCi0gICAgdmFyIG5lZ2F0aXZlID0gKHZhbHVlIDwgMCkgJiYgKHZhbHVlID0gLXZhbHVlKSA/ICJcdTIyMTIiIDogc2lnbjsNCi0NCi0gICAgLy8gQXBwbHkgdGhlIHNjYWxlLCBjb21wdXRpbmcgaXQgZnJvbSB0aGUgdmFsdWUncyBleHBvbmVudCBmb3Igc2kgZm9ybWF0Lg0KLSAgICBpZiAoc2NhbGUgPCAwKSB7DQotICAgICAgdmFyIHByZWZpeCA9IGQzLmZvcm1hdFByZWZpeCh2YWx1ZSwgcHJlY2lzaW9uKTsNCi0gICAgICB2YWx1ZSAqPSBwcmVmaXguc2NhbGU7DQotICAgICAgc3VmZml4ID0gcHJlZml4LnN5bWJvbDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICB2YWx1ZSAqPSBzY2FsZTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBDb252ZXJ0IHRvIHRoZSBkZXNpcmVkIHByZWNpc2lvbi4NCi0gICAgdmFsdWUgPSB0eXBlKHZhbHVlLCBwcmVjaXNpb24pOw0KLQ0KLSAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgMCwgdGhlIHNpZ24gYW5kIGdyb3VwIGlzIGFwcGxpZWQgYWZ0ZXIgdGhlIGZpbGwuDQotICAgIGlmICh6ZmlsbCkgew0KLSAgICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGggKyBuZWdhdGl2ZS5sZW5ndGg7DQotICAgICAgaWYgKGxlbmd0aCA8IHdpZHRoKSB2YWx1ZSA9IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgKyB2YWx1ZTsNCi0gICAgICBpZiAoY29tbWEpIHZhbHVlID0gZDNfZm9ybWF0X2dyb3VwKHZhbHVlKTsNCi0gICAgICB2YWx1ZSA9IG5lZ2F0aXZlICsgdmFsdWU7DQotICAgIH0NCi0NCi0gICAgLy8gT3RoZXJ3aXNlIChlLmcuLCBzcGFjZS1maWxsaW5nKSwgdGhlIHNpZ24gYW5kIGdyb3VwIGlzIGFwcGxpZWQgYmVmb3JlLg0KLSAgICBlbHNlIHsNCi0gICAgICBpZiAoY29tbWEpIHZhbHVlID0gZDNfZm9ybWF0X2dyb3VwKHZhbHVlKTsNCi0gICAgICB2YWx1ZSA9IG5lZ2F0aXZlICsgdmFsdWU7DQotICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsNCi0gICAgICBpZiAobGVuZ3RoIDwgd2lkdGgpIHZhbHVlID0gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSArIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHJldHVybiB2YWx1ZSArIHN1ZmZpeDsNCi0gIH07DQotfTsNCi0NCi0vLyBbW2ZpbGxdYWxpZ25dW3NpZ25dWyNdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt0eXBlXQ0KLXZhciBkM19mb3JtYXRfcmUgPSAvKD86KFtee10pPyhbPD49Xl0pKT8oWytcLSBdKT8oIyk/KDApPyhbMC05XSspPygsKT8oXC5bMC05XSspPyhbYS16QS1aJV0pPy87DQotDQotdmFyIGQzX2Zvcm1hdF90eXBlcyA9IGQzLm1hcCh7DQotICBnOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvUHJlY2lzaW9uKHApOyB9LA0KLSAgZTogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0V4cG9uZW50aWFsKHApOyB9LA0KLSAgZjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0ZpeGVkKHApOyB9LA0KLSAgcjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4gZDMucm91bmQoeCwgcCA9IGQzX2Zvcm1hdF9wcmVjaXNpb24oeCwgcCkpLnRvRml4ZWQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHApKSk7IH0NCi19KTsNCi0NCi1mdW5jdGlvbiBkM19mb3JtYXRfcHJlY2lzaW9uKHgsIHApIHsNCi0gIHJldHVybiBwIC0gKHggPyAxICsgTWF0aC5mbG9vcihNYXRoLmxvZyh4ICsgTWF0aC5wb3coMTAsIDEgKyBNYXRoLmZsb29yKE1hdGgubG9nKHgpIC8gTWF0aC5MTjEwKSAtIHApKSAvIE1hdGguTE4xMCkgOiAxKTsNCi19DQotDQotZnVuY3Rpb24gZDNfZm9ybWF0X3R5cGVEZWZhdWx0KHgpIHsNCi0gIHJldHVybiB4ICsgIiI7DQotfQ0KLQ0KLS8vIEFwcGx5IGNvbW1hIGdyb3VwaW5nIGZvciB0aG91c2FuZHMuDQotZnVuY3Rpb24gZDNfZm9ybWF0X2dyb3VwKHZhbHVlKSB7DQotICB2YXIgaSA9IHZhbHVlLmxhc3RJbmRleE9mKCIuIiksDQotICAgICAgZiA9IGkgPj0gMCA/IHZhbHVlLnN1YnN0cmluZyhpKSA6IChpID0gdmFsdWUubGVuZ3RoLCAiIiksDQotICAgICAgdCA9IFtdOw0KLSAgd2hpbGUgKGkgPiAwKSB0LnB1c2godmFsdWUuc3Vic3RyaW5nKGkgLT0gMywgaSArIDMpKTsNCi0gIHJldHVybiB0LnJldmVyc2UoKS5qb2luKCIsIikgKyBmOw0KLX0NCi12YXIgZDNfZm9ybWF0UHJlZml4ZXMgPSBbInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIs68IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl0ubWFwKGQzX2Zvcm1hdFByZWZpeCk7DQotDQotZDMuZm9ybWF0UHJlZml4ID0gZnVuY3Rpb24odmFsdWUsIHByZWNpc2lvbikgew0KLSAgdmFyIGkgPSAwOw0KLSAgaWYgKHZhbHVlKSB7DQotICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlICo9IC0xOw0KLSAgICBpZiAocHJlY2lzaW9uKSB2YWx1ZSA9IGQzLnJvdW5kKHZhbHVlLCBkM19mb3JtYXRfcHJlY2lzaW9uKHZhbHVlLCBwcmVjaXNpb24pKTsNCi0gICAgaSA9IDEgKyBNYXRoLmZsb29yKDFlLTEyICsgTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjEwKTsNCi0gICAgaSA9IE1hdGgubWF4KC0yNCwgTWF0aC5taW4oMjQsIE1hdGguZmxvb3IoKGkgPD0gMCA/IGkgKyAxIDogaSAtIDEpIC8gMykgKiAzKSk7DQotICB9DQotICByZXR1cm4gZDNfZm9ybWF0UHJlZml4ZXNbOCArIGkgLyAzXTsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX2Zvcm1hdFByZWZpeChkLCBpKSB7DQotICByZXR1cm4gew0KLSAgICBzY2FsZTogTWF0aC5wb3coMTAsICg4IC0gaSkgKiAzKSwNCi0gICAgc3ltYm9sOiBkDQotICB9Ow0KLX0NCi0NCi0vKg0KLSAqIFRFUk1TIE9GIFVTRSAtIEVBU0lORyBFUVVBVElPTlMNCi0gKg0KLSAqIE9wZW4gc291cmNlIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4NCi0gKg0KLSAqIENvcHlyaWdodCAyMDAxIFJvYmVydCBQZW5uZXINCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqDQotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQotICoNCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcw0KLSAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotICoNCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCi0gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24NCi0gKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KLSAqDQotICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8NCi0gKiAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljDQotICogICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotICoNCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyINCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UNCi0gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUNCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SDQotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YNCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MNCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTg0KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpDQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUNCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0gKi8NCi0NCi12YXIgZDNfZWFzZV9xdWFkID0gZDNfZWFzZV9wb2x5KDIpLA0KLSAgICBkM19lYXNlX2N1YmljID0gZDNfZWFzZV9wb2x5KDMpLA0KLSAgICBkM19lYXNlX2RlZmF1bHQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGQzX2Vhc2VfaWRlbnRpdHk7IH07DQotDQotdmFyIGQzX2Vhc2UgPSBkMy5tYXAoew0KLSAgbGluZWFyOiBkM19lYXNlX2RlZmF1bHQsDQotICBwb2x5OiBkM19lYXNlX3BvbHksDQotICBxdWFkOiBmdW5jdGlvbigpIHsgcmV0dXJuIGQzX2Vhc2VfcXVhZDsgfSwNCi0gIGN1YmljOiBmdW5jdGlvbigpIHsgcmV0dXJuIGQzX2Vhc2VfY3ViaWM7IH0sDQotICBzaW46IGZ1bmN0aW9uKCkgeyByZXR1cm4gZDNfZWFzZV9zaW47IH0sDQotICBleHA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZDNfZWFzZV9leHA7IH0sDQotICBjaXJjbGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZDNfZWFzZV9jaXJjbGU7IH0sDQotICBlbGFzdGljOiBkM19lYXNlX2VsYXN0aWMsDQotICBiYWNrOiBkM19lYXNlX2JhY2ssDQotICBib3VuY2U6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZDNfZWFzZV9ib3VuY2U7IH0NCi19KTsNCi0NCi12YXIgZDNfZWFzZV9tb2RlID0gZDMubWFwKHsNCi0gICJpbiI6IGQzX2Vhc2VfaWRlbnRpdHksDQotICAib3V0IjogZDNfZWFzZV9yZXZlcnNlLA0KLSAgImluLW91dCI6IGQzX2Vhc2VfcmVmbGVjdCwNCi0gICJvdXQtaW4iOiBmdW5jdGlvbihmKSB7IHJldHVybiBkM19lYXNlX3JlZmxlY3QoZDNfZWFzZV9yZXZlcnNlKGYpKTsgfQ0KLX0pOw0KLQ0KLWQzLmVhc2UgPSBmdW5jdGlvbihuYW1lKSB7DQotICB2YXIgaSA9IG5hbWUuaW5kZXhPZigiLSIpLA0KLSAgICAgIHQgPSBpID49IDAgPyBuYW1lLnN1YnN0cmluZygwLCBpKSA6IG5hbWUsDQotICAgICAgbSA9IGkgPj0gMCA/IG5hbWUuc3Vic3RyaW5nKGkgKyAxKSA6ICJpbiI7DQotICB0ID0gZDNfZWFzZS5nZXQodCkgfHwgZDNfZWFzZV9kZWZhdWx0Ow0KLSAgbSA9IGQzX2Vhc2VfbW9kZS5nZXQobSkgfHwgZDNfZWFzZV9pZGVudGl0eTsNCi0gIHJldHVybiBkM19lYXNlX2NsYW1wKG0odC5hcHBseShudWxsLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSkpOw0KLX07DQotDQotZnVuY3Rpb24gZDNfZWFzZV9jbGFtcChmKSB7DQotICByZXR1cm4gZnVuY3Rpb24odCkgew0KLSAgICByZXR1cm4gdCA8PSAwID8gMCA6IHQgPj0gMSA/IDEgOiBmKHQpOw0KLSAgfTsNCi19DQotDQotZnVuY3Rpb24gZDNfZWFzZV9yZXZlcnNlKGYpIHsNCi0gIHJldHVybiBmdW5jdGlvbih0KSB7DQotICAgIHJldHVybiAxIC0gZigxIC0gdCk7DQotICB9Ow0KLX0NCi0NCi1mdW5jdGlvbiBkM19lYXNlX3JlZmxlY3QoZikgew0KLSAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCi0gICAgcmV0dXJuIC41ICogKHQgPCAuNSA/IGYoMiAqIHQpIDogKDIgLSBmKDIgLSAyICogdCkpKTsNCi0gIH07DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2Vhc2VfaWRlbnRpdHkodCkgew0KLSAgcmV0dXJuIHQ7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2Vhc2VfcG9seShlKSB7DQotICByZXR1cm4gZnVuY3Rpb24odCkgew0KLSAgICByZXR1cm4gTWF0aC5wb3codCwgZSk7DQotICB9Ow0KLX0NCi0NCi1mdW5jdGlvbiBkM19lYXNlX3Npbih0KSB7DQotICByZXR1cm4gMSAtIE1hdGguY29zKHQgKiBNYXRoLlBJIC8gMik7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2Vhc2VfZXhwKHQpIHsNCi0gIHJldHVybiBNYXRoLnBvdygyLCAxMCAqICh0IC0gMSkpOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19lYXNlX2NpcmNsZSh0KSB7DQotICByZXR1cm4gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19lYXNlX2VsYXN0aWMoYSwgcCkgew0KLSAgdmFyIHM7DQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHAgPSAwLjQ1Ow0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7IGEgPSAxOyBzID0gcCAvIDQ7IH0NCi0gIGVsc2UgcyA9IHAgLyAoMiAqIE1hdGguUEkpICogTWF0aC5hc2luKDEgLyBhKTsNCi0gIHJldHVybiBmdW5jdGlvbih0KSB7DQotICAgIHJldHVybiAxICsgYSAqIE1hdGgucG93KDIsIDEwICogLXQpICogTWF0aC5zaW4oKHQgLSBzKSAqIDIgKiBNYXRoLlBJIC8gcCk7DQotICB9Ow0KLX0NCi0NCi1mdW5jdGlvbiBkM19lYXNlX2JhY2socykgew0KLSAgaWYgKCFzKSBzID0gMS43MDE1ODsNCi0gIHJldHVybiBmdW5jdGlvbih0KSB7DQotICAgIHJldHVybiB0ICogdCAqICgocyArIDEpICogdCAtIHMpOw0KLSAgfTsNCi19DQotDQotZnVuY3Rpb24gZDNfZWFzZV9ib3VuY2UodCkgew0KLSAgcmV0dXJuIHQgPCAxIC8gMi43NSA/IDcuNTYyNSAqIHQgKiB0DQotICAgICAgOiB0IDwgMiAvIDIuNzUgPyA3LjU2MjUgKiAodCAtPSAxLjUgLyAyLjc1KSAqIHQgKyAuNzUNCi0gICAgICA6IHQgPCAyLjUgLyAyLjc1ID8gNy41NjI1ICogKHQgLT0gMi4yNSAvIDIuNzUpICogdCArIC45Mzc1DQotICAgICAgOiA3LjU2MjUgKiAodCAtPSAyLjYyNSAvIDIuNzUpICogdCArIC45ODQzNzU7DQotfQ0KLWQzLmV2ZW50ID0gbnVsbDsNCi0NCi1mdW5jdGlvbiBkM19ldmVudENhbmNlbCgpIHsNCi0gIGQzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KLSAgZDMuZXZlbnQucHJldmVudERlZmF1bHQoKTsNCi19DQotDQotZnVuY3Rpb24gZDNfZXZlbnRTb3VyY2UoKSB7DQotICB2YXIgZSA9IGQzLmV2ZW50LCBzOw0KLSAgd2hpbGUgKHMgPSBlLnNvdXJjZUV2ZW50KSBlID0gczsNCi0gIHJldHVybiBlOw0KLX0NCi0NCi0vLyBMaWtlIGQzLmRpc3BhdGNoLCBidXQgZm9yIGN1c3RvbSBldmVudHMgYWJzdHJhY3RpbmcgbmF0aXZlIFVJIGV2ZW50cy4gVGhlc2UNCi0vLyBldmVudHMgaGF2ZSBhIHRhcmdldCBjb21wb25lbnQgKHN1Y2ggYXMgYSBicnVzaCksIGEgdGFyZ2V0IGVsZW1lbnQgKHN1Y2ggYXMNCi0vLyB0aGUgc3ZnOmcgZWxlbWVudCBjb250YWluaW5nIHRoZSBicnVzaCkgYW5kIHRoZSBzdGFuZGFyZCBhcmd1bWVudHMgYGRgICh0aGUNCi0vLyB0YXJnZXQgZWxlbWVudCdzIGRhdGEpIGFuZCBgaWAgKHRoZSBzZWxlY3Rpb24gaW5kZXggb2YgdGhlIHRhcmdldCBlbGVtZW50KS4NCi1mdW5jdGlvbiBkM19ldmVudERpc3BhdGNoKHRhcmdldCkgew0KLSAgdmFyIGRpc3BhdGNoID0gbmV3IGQzX2Rpc3BhdGNoLA0KLSAgICAgIGkgPSAwLA0KLSAgICAgIG4gPSBhcmd1bWVudHMubGVuZ3RoOw0KLQ0KLSAgd2hpbGUgKCsraSA8IG4pIGRpc3BhdGNoW2FyZ3VtZW50c1tpXV0gPSBkM19kaXNwYXRjaF9ldmVudChkaXNwYXRjaCk7DQotDQotICAvLyBDcmVhdGVzIGEgZGlzcGF0Y2ggY29udGV4dCBmb3IgdGhlIHNwZWNpZmllZCBgdGhpemAgKHR5cGljYWxseSwgdGhlIHRhcmdldA0KLSAgLy8gRE9NIGVsZW1lbnQgdGhhdCByZWNlaXZlZCB0aGUgc291cmNlIGV2ZW50KSBhbmQgYGFyZ3VtZW50emAgKHR5cGljYWxseSwgdGhlDQotICAvLyBkYXRhIGBkYCBhbmQgaW5kZXggYGlgIG9mIHRoZSB0YXJnZXQgZWxlbWVudCkuIFRoZSByZXR1cm5lZCBmdW5jdGlvbiBjYW4gYmUNCi0gIC8vIHVzZWQgdG8gZGlzcGF0Y2ggYW4gZXZlbnQgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzOyB0aGUgZnVuY3Rpb24gdGFrZXMgYQ0KLSAgLy8gc2luZ2xlIGFyZ3VtZW50IGFzIGlucHV0LCBiZWluZyB0aGUgZXZlbnQgdG8gZGlzcGF0Y2guIFRoZSBldmVudCBtdXN0IGhhdmUNCi0gIC8vIGEgInR5cGUiIGF0dHJpYnV0ZSB3aGljaCBjb3JyZXNwb25kcyB0byBhIHR5cGUgcmVnaXN0ZXJlZCBpbiB0aGUNCi0gIC8vIGNvbnN0cnVjdG9yLiBUaGlzIGNvbnRleHQgd2lsbCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlIHRoZSAic291cmNlRXZlbnQiIGFuZA0KLSAgLy8gInRhcmdldCIgYXR0cmlidXRlcyBvZiB0aGUgZXZlbnQsIGFzIHdlbGwgYXMgc2V0dGluZyB0aGUgYGQzLmV2ZW50YCBnbG9iYWwNCi0gIC8vIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIG5vdGlmaWNhdGlvbi4NCi0gIGRpc3BhdGNoLm9mID0gZnVuY3Rpb24odGhpeiwgYXJndW1lbnR6KSB7DQotICAgIHJldHVybiBmdW5jdGlvbihlMSkgew0KLSAgICAgIHRyeSB7DQotICAgICAgICB2YXIgZTAgPQ0KLSAgICAgICAgZTEuc291cmNlRXZlbnQgPSBkMy5ldmVudDsNCi0gICAgICAgIGUxLnRhcmdldCA9IHRhcmdldDsNCi0gICAgICAgIGQzLmV2ZW50ID0gZTE7DQotICAgICAgICBkaXNwYXRjaFtlMS50eXBlXS5hcHBseSh0aGl6LCBhcmd1bWVudHopOw0KLSAgICAgIH0gZmluYWxseSB7DQotICAgICAgICBkMy5ldmVudCA9IGUwOw0KLSAgICAgIH0NCi0gICAgfTsNCi0gIH07DQotDQotICByZXR1cm4gZGlzcGF0Y2g7DQotfQ0KLWQzLmludGVycG9sYXRlID0gZnVuY3Rpb24oYSwgYikgew0KLSAgdmFyIGkgPSBkMy5pbnRlcnBvbGF0b3JzLmxlbmd0aCwgZjsNCi0gIHdoaWxlICgtLWkgPj0gMCAmJiAhKGYgPSBkMy5pbnRlcnBvbGF0b3JzW2ldKGEsIGIpKSk7DQotICByZXR1cm4gZjsNCi19Ow0KLQ0KLWQzLmludGVycG9sYXRlTnVtYmVyID0gZnVuY3Rpb24oYSwgYikgew0KLSAgYiAtPSBhOw0KLSAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsgcmV0dXJuIGEgKyBiICogdDsgfTsNCi19Ow0KLQ0KLWQzLmludGVycG9sYXRlUm91bmQgPSBmdW5jdGlvbihhLCBiKSB7DQotICBiIC09IGE7DQotICByZXR1cm4gZnVuY3Rpb24odCkgeyByZXR1cm4gTWF0aC5yb3VuZChhICsgYiAqIHQpOyB9Ow0KLX07DQotDQotZDMuaW50ZXJwb2xhdGVTdHJpbmcgPSBmdW5jdGlvbihhLCBiKSB7DQotICB2YXIgbSwgLy8gY3VycmVudCBtYXRjaA0KLSAgICAgIGksIC8vIGN1cnJlbnQgaW5kZXgNCi0gICAgICBqLCAvLyBjdXJyZW50IGluZGV4IChmb3IgY29hbGxlc2NpbmcpDQotICAgICAgczAgPSAwLCAvLyBzdGFydCBpbmRleCBvZiBjdXJyZW50IHN0cmluZyBwcmVmaXgNCi0gICAgICBzMSA9IDAsIC8vIGVuZCBpbmRleCBvZiBjdXJyZW50IHN0cmluZyBwcmVmaXgNCi0gICAgICBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVycw0KLSAgICAgIHEgPSBbXSwgLy8gbnVtYmVyIGludGVycG9sYXRvcnMNCi0gICAgICBuLCAvLyBxLmxlbmd0aA0KLSAgICAgIG87DQotDQotICAvLyBSZXNldCBvdXIgcmVndWxhciBleHByZXNzaW9uIQ0KLSAgZDNfaW50ZXJwb2xhdGVfbnVtYmVyLmxhc3RJbmRleCA9IDA7DQotDQotICAvLyBGaW5kIGFsbCBudW1iZXJzIGluIGIuDQotICBmb3IgKGkgPSAwOyBtID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyLmV4ZWMoYik7ICsraSkgew0KLSAgICBpZiAobS5pbmRleCkgcy5wdXNoKGIuc3Vic3RyaW5nKHMwLCBzMSA9IG0uaW5kZXgpKTsNCi0gICAgcS5wdXNoKHtpOiBzLmxlbmd0aCwgeDogbVswXX0pOw0KLSAgICBzLnB1c2gobnVsbCk7DQotICAgIHMwID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyLmxhc3RJbmRleDsNCi0gIH0NCi0gIGlmIChzMCA8IGIubGVuZ3RoKSBzLnB1c2goYi5zdWJzdHJpbmcoczApKTsNCi0NCi0gIC8vIEZpbmQgYWxsIG51bWJlcnMgaW4gYS4NCi0gIGZvciAoaSA9IDAsIG4gPSBxLmxlbmd0aDsgKG0gPSBkM19pbnRlcnBvbGF0ZV9udW1iZXIuZXhlYyhhKSkgJiYgaSA8IG47ICsraSkgew0KLSAgICBvID0gcVtpXTsNCi0gICAgaWYgKG8ueCA9PSBtWzBdKSB7IC8vIFRoZSBudW1iZXJzIG1hdGNoLCBzbyBjb2FsbGVzY2UuDQotICAgICAgaWYgKG8uaSkgew0KLSAgICAgICAgaWYgKHNbby5pICsgMV0gPT0gbnVsbCkgeyAvLyBUaGlzIG1hdGNoIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgbnVtYmVyLg0KLSAgICAgICAgICBzW28uaSAtIDFdICs9IG8ueDsNCi0gICAgICAgICAgcy5zcGxpY2Uoby5pLCAxKTsNCi0gICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBuOyArK2opIHFbal0uaS0tOw0KLSAgICAgICAgfSBlbHNlIHsgLy8gVGhpcyBtYXRjaCBpcyBmb2xsb3dlZCBieSBhIHN0cmluZywgc28gY29hbGxlc2NlIHR3aWNlLg0KLSAgICAgICAgICBzW28uaSAtIDFdICs9IG8ueCArIHNbby5pICsgMV07DQotICAgICAgICAgIHMuc3BsaWNlKG8uaSwgMik7DQotICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgbjsgKytqKSBxW2pdLmkgLT0gMjsNCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBpZiAoc1tvLmkgKyAxXSA9PSBudWxsKSB7IC8vIFRoaXMgbWF0Y2ggaXMgZm9sbG93ZWQgYnkgYW5vdGhlciBudW1iZXIuDQotICAgICAgICAgIHNbby5pXSA9IG8ueDsNCi0gICAgICAgIH0gZWxzZSB7IC8vIFRoaXMgbWF0Y2ggaXMgZm9sbG93ZWQgYnkgYSBzdHJpbmcsIHNvIGNvYWxsZXNjZSB0d2ljZS4NCi0gICAgICAgICAgc1tvLmldID0gby54ICsgc1tvLmkgKyAxXTsNCi0gICAgICAgICAgcy5zcGxpY2Uoby5pICsgMSwgMSk7DQotICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgbjsgKytqKSBxW2pdLmktLTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgcS5zcGxpY2UoaSwgMSk7DQotICAgICAgbi0tOw0KLSAgICAgIGktLTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBvLnggPSBkMy5pbnRlcnBvbGF0ZU51bWJlcihwYXJzZUZsb2F0KG1bMF0pLCBwYXJzZUZsb2F0KG8ueCkpOw0KLSAgICB9DQotICB9DQotDQotICAvLyBSZW1vdmUgYW55IG51bWJlcnMgaW4gYiBub3QgZm91bmQgaW4gYS4NCi0gIHdoaWxlIChpIDwgbikgew0KLSAgICBvID0gcS5wb3AoKTsNCi0gICAgaWYgKHNbby5pICsgMV0gPT0gbnVsbCkgeyAvLyBUaGlzIG1hdGNoIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgbnVtYmVyLg0KLSAgICAgIHNbby5pXSA9IG8ueDsNCi0gICAgfSBlbHNlIHsgLy8gVGhpcyBtYXRjaCBpcyBmb2xsb3dlZCBieSBhIHN0cmluZywgc28gY29hbGxlc2NlIHR3aWNlLg0KLSAgICAgIHNbby5pXSA9IG8ueCArIHNbby5pICsgMV07DQotICAgICAgcy5zcGxpY2Uoby5pICsgMSwgMSk7DQotICAgIH0NCi0gICAgbi0tOw0KLSAgfQ0KLQ0KLSAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guDQotICBpZiAocy5sZW5ndGggPT09IDEpIHsNCi0gICAgcmV0dXJuIHNbMF0gPT0gbnVsbCA/IHFbMF0ueCA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gYjsgfTsNCi0gIH0NCi0NCi0gIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuDQotICByZXR1cm4gZnVuY3Rpb24odCkgew0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7DQotICAgIHJldHVybiBzLmpvaW4oIiIpOw0KLSAgfTsNCi19Ow0KLQ0KLWQzLmludGVycG9sYXRlVHJhbnNmb3JtID0gZnVuY3Rpb24oYSwgYikgew0KLSAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzDQotICAgICAgcSA9IFtdLCAvLyBudW1iZXIgaW50ZXJwb2xhdG9ycw0KLSAgICAgIG4sDQotICAgICAgQSA9IGQzLnRyYW5zZm9ybShhKSwNCi0gICAgICBCID0gZDMudHJhbnNmb3JtKGIpLA0KLSAgICAgIHRhID0gQS50cmFuc2xhdGUsDQotICAgICAgdGIgPSBCLnRyYW5zbGF0ZSwNCi0gICAgICByYSA9IEEucm90YXRlLA0KLSAgICAgIHJiID0gQi5yb3RhdGUsDQotICAgICAgd2EgPSBBLnNrZXcsDQotICAgICAgd2IgPSBCLnNrZXcsDQotICAgICAga2EgPSBBLnNjYWxlLA0KLSAgICAgIGtiID0gQi5zY2FsZTsNCi0NCi0gIGlmICh0YVswXSAhPSB0YlswXSB8fCB0YVsxXSAhPSB0YlsxXSkgew0KLSAgICBzLnB1c2goInRyYW5zbGF0ZSgiLCBudWxsLCAiLCIsIG51bGwsICIpIik7DQotICAgIHEucHVzaCh7aTogMSwgeDogZDMuaW50ZXJwb2xhdGVOdW1iZXIodGFbMF0sIHRiWzBdKX0sIHtpOiAzLCB4OiBkMy5pbnRlcnBvbGF0ZU51bWJlcih0YVsxXSwgdGJbMV0pfSk7DQotICB9IGVsc2UgaWYgKHRiWzBdIHx8IHRiWzFdKSB7DQotICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB0YiArICIpIik7DQotICB9IGVsc2Ugew0KLSAgICBzLnB1c2goIiIpOw0KLSAgfQ0KLQ0KLSAgaWYgKHJhICE9IHJiKSB7DQotICAgIHEucHVzaCh7aTogcy5wdXNoKHMucG9wKCkgKyAicm90YXRlKCIsIG51bGwsICIpIikgLSAyLCB4OiBkMy5pbnRlcnBvbGF0ZU51bWJlcihyYSwgcmIpfSk7DQotICB9IGVsc2UgaWYgKHJiKSB7DQotICAgIHMucHVzaChzLnBvcCgpICsgInJvdGF0ZSgiICsgcmIgKyAiKSIpOw0KLSAgfQ0KLQ0KLSAgaWYgKHdhICE9IHdiKSB7DQotICAgIHEucHVzaCh7aTogcy5wdXNoKHMucG9wKCkgKyAic2tld1goIiwgbnVsbCwgIikiKSAtIDIsIHg6IGQzLmludGVycG9sYXRlTnVtYmVyKHdhLCB3Yil9KTsNCi0gIH0gZWxzZSBpZiAod2IpIHsNCi0gICAgcy5wdXNoKHMucG9wKCkgKyAic2tld1goIiArIHdiICsgIikiKTsNCi0gIH0NCi0NCi0gIGlmIChrYVswXSAhPSBrYlswXSB8fCBrYVsxXSAhPSBrYlsxXSkgew0KLSAgICBuID0gcy5wdXNoKHMucG9wKCkgKyAic2NhbGUoIiwgbnVsbCwgIiwiLCBudWxsLCAiKSIpOw0KLSAgICBxLnB1c2goe2k6IG4gLSA0LCB4OiBkMy5pbnRlcnBvbGF0ZU51bWJlcihrYVswXSwga2JbMF0pfSwge2k6IG4gLSAyLCB4OiBkMy5pbnRlcnBvbGF0ZU51bWJlcihrYVsxXSwga2JbMV0pfSk7DQotICB9IGVsc2UgaWYgKGtiWzBdICE9IDEgfHwga2JbMV0gIT0gMSkgew0KLSAgICBzLnB1c2gocy5wb3AoKSArICJzY2FsZSgiICsga2IgKyAiKSIpOw0KLSAgfQ0KLQ0KLSAgbiA9IHEubGVuZ3RoOw0KLSAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCi0gICAgdmFyIGkgPSAtMSwgbzsNCi0gICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsNCi0gICAgcmV0dXJuIHMuam9pbigiIik7DQotICB9Ow0KLX07DQotDQotZDMuaW50ZXJwb2xhdGVSZ2IgPSBmdW5jdGlvbihhLCBiKSB7DQotICBhID0gZDMucmdiKGEpOw0KLSAgYiA9IGQzLnJnYihiKTsNCi0gIHZhciBhciA9IGEuciwNCi0gICAgICBhZyA9IGEuZywNCi0gICAgICBhYiA9IGEuYiwNCi0gICAgICBiciA9IGIuciAtIGFyLA0KLSAgICAgIGJnID0gYi5nIC0gYWcsDQotICAgICAgYmIgPSBiLmIgLSBhYjsNCi0gIHJldHVybiBmdW5jdGlvbih0KSB7DQotICAgIHJldHVybiAiIyINCi0gICAgICAgICsgZDNfcmdiX2hleChNYXRoLnJvdW5kKGFyICsgYnIgKiB0KSkNCi0gICAgICAgICsgZDNfcmdiX2hleChNYXRoLnJvdW5kKGFnICsgYmcgKiB0KSkNCi0gICAgICAgICsgZDNfcmdiX2hleChNYXRoLnJvdW5kKGFiICsgYmIgKiB0KSk7DQotICB9Ow0KLX07DQotDQotLy8gaW50ZXJwb2xhdGVzIEhTTCBzcGFjZSwgYnV0IG91dHB1dHMgUkdCIHN0cmluZyAoZm9yIGNvbXBhdGliaWxpdHkpDQotZDMuaW50ZXJwb2xhdGVIc2wgPSBmdW5jdGlvbihhLCBiKSB7DQotICBhID0gZDMuaHNsKGEpOw0KLSAgYiA9IGQzLmhzbChiKTsNCi0gIHZhciBoMCA9IGEuaCwNCi0gICAgICBzMCA9IGEucywNCi0gICAgICBsMCA9IGEubCwNCi0gICAgICBoMSA9IGIuaCAtIGgwLA0KLSAgICAgIHMxID0gYi5zIC0gczAsDQotICAgICAgbDEgPSBiLmwgLSBsMDsNCi0gIHJldHVybiBmdW5jdGlvbih0KSB7DQotICAgIHJldHVybiBkM19oc2xfcmdiKGgwICsgaDEgKiB0LCBzMCArIHMxICogdCwgbDAgKyBsMSAqIHQpLnRvU3RyaW5nKCk7DQotICB9Ow0KLX07DQotDQotZDMuaW50ZXJwb2xhdGVBcnJheSA9IGZ1bmN0aW9uKGEsIGIpIHsNCi0gIHZhciB4ID0gW10sDQotICAgICAgYyA9IFtdLA0KLSAgICAgIG5hID0gYS5sZW5ndGgsDQotICAgICAgbmIgPSBiLmxlbmd0aCwNCi0gICAgICBuMCA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCksDQotICAgICAgaTsNCi0gIGZvciAoaSA9IDA7IGkgPCBuMDsgKytpKSB4LnB1c2goZDMuaW50ZXJwb2xhdGUoYVtpXSwgYltpXSkpOw0KLSAgZm9yICg7IGkgPCBuYTsgKytpKSBjW2ldID0gYVtpXTsNCi0gIGZvciAoOyBpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07DQotICByZXR1cm4gZnVuY3Rpb24odCkgew0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbjA7ICsraSkgY1tpXSA9IHhbaV0odCk7DQotICAgIHJldHVybiBjOw0KLSAgfTsNCi19Ow0KLQ0KLWQzLmludGVycG9sYXRlT2JqZWN0ID0gZnVuY3Rpb24oYSwgYikgew0KLSAgdmFyIGkgPSB7fSwNCi0gICAgICBjID0ge30sDQotICAgICAgazsNCi0gIGZvciAoayBpbiBhKSB7DQotICAgIGlmIChrIGluIGIpIHsNCi0gICAgICBpW2tdID0gZDNfaW50ZXJwb2xhdGVCeU5hbWUoaykoYVtrXSwgYltrXSk7DQotICAgIH0gZWxzZSB7DQotICAgICAgY1trXSA9IGFba107DQotICAgIH0NCi0gIH0NCi0gIGZvciAoayBpbiBiKSB7DQotICAgIGlmICghKGsgaW4gYSkpIHsNCi0gICAgICBjW2tdID0gYltrXTsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCi0gICAgZm9yIChrIGluIGkpIGNba10gPSBpW2tdKHQpOw0KLSAgICByZXR1cm4gYzsNCi0gIH07DQotfQ0KLQ0KLXZhciBkM19pbnRlcnBvbGF0ZV9udW1iZXIgPSAvWy0rXT8oPzpcZCpcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZzsNCi0NCi1mdW5jdGlvbiBkM19pbnRlcnBvbGF0ZUJ5TmFtZShuKSB7DQotICByZXR1cm4gbiA9PSAidHJhbnNmb3JtIg0KLSAgICAgID8gZDMuaW50ZXJwb2xhdGVUcmFuc2Zvcm0NCi0gICAgICA6IGQzLmludGVycG9sYXRlOw0KLX0NCi0NCi1kMy5pbnRlcnBvbGF0b3JzID0gWw0KLSAgZDMuaW50ZXJwb2xhdGVPYmplY3QsDQotICBmdW5jdGlvbihhLCBiKSB7IHJldHVybiAoYiBpbnN0YW5jZW9mIEFycmF5KSAmJiBkMy5pbnRlcnBvbGF0ZUFycmF5KGEsIGIpOyB9LA0KLSAgZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gKHR5cGVvZiBhID09PSAic3RyaW5nIiB8fCB0eXBlb2YgYiA9PT0gInN0cmluZyIpICYmIGQzLmludGVycG9sYXRlU3RyaW5nKGEgKyAiIiwgYiArICIiKTsgfSwNCi0gIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuICh0eXBlb2YgYiA9PT0gInN0cmluZyIgPyBkM19yZ2JfbmFtZXMuaGFzKGIpIHx8IC9eKCN8cmdiXCh8aHNsXCgpLy50ZXN0KGIpIDogYiBpbnN0YW5jZW9mIGQzX1JnYiB8fCBiIGluc3RhbmNlb2YgZDNfSHNsKSAmJiBkMy5pbnRlcnBvbGF0ZVJnYihhLCBiKTsgfSwNCi0gIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuICFpc05hTihhID0gK2EpICYmICFpc05hTihiID0gK2IpICYmIGQzLmludGVycG9sYXRlTnVtYmVyKGEsIGIpOyB9DQotXTsNCi1mdW5jdGlvbiBkM191bmludGVycG9sYXRlTnVtYmVyKGEsIGIpIHsNCi0gIGIgPSBiIC0gKGEgPSArYSkgPyAxIC8gKGIgLSBhKSA6IDA7DQotICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4gKHggLSBhKSAqIGI7IH07DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3VuaW50ZXJwb2xhdGVDbGFtcChhLCBiKSB7DQotICBiID0gYiAtIChhID0gK2EpID8gMSAvIChiIC0gYSkgOiAwOw0KLSAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsICh4IC0gYSkgKiBiKSk7IH07DQotfQ0KLWQzLnJnYiA9IGZ1bmN0aW9uKHIsIGcsIGIpIHsNCi0gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxDQotICAgICAgPyAociBpbnN0YW5jZW9mIGQzX1JnYiA/IGQzX3JnYihyLnIsIHIuZywgci5iKQ0KLSAgICAgIDogZDNfcmdiX3BhcnNlKCIiICsgciwgZDNfcmdiLCBkM19oc2xfcmdiKSkNCi0gICAgICA6IGQzX3JnYih+fnIsIH5+Zywgfn5iKTsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX3JnYihyLCBnLCBiKSB7DQotICByZXR1cm4gbmV3IGQzX1JnYihyLCBnLCBiKTsNCi19DQotDQotZnVuY3Rpb24gZDNfUmdiKHIsIGcsIGIpIHsNCi0gIHRoaXMuciA9IHI7DQotICB0aGlzLmcgPSBnOw0KLSAgdGhpcy5iID0gYjsNCi19DQotDQotZDNfUmdiLnByb3RvdHlwZS5icmlnaHRlciA9IGZ1bmN0aW9uKGspIHsNCi0gIGsgPSBNYXRoLnBvdygwLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7DQotICB2YXIgciA9IHRoaXMuciwNCi0gICAgICBnID0gdGhpcy5nLA0KLSAgICAgIGIgPSB0aGlzLmIsDQotICAgICAgaSA9IDMwOw0KLSAgaWYgKCFyICYmICFnICYmICFiKSByZXR1cm4gZDNfcmdiKGksIGksIGkpOw0KLSAgaWYgKHIgJiYgciA8IGkpIHIgPSBpOw0KLSAgaWYgKGcgJiYgZyA8IGkpIGcgPSBpOw0KLSAgaWYgKGIgJiYgYiA8IGkpIGIgPSBpOw0KLSAgcmV0dXJuIGQzX3JnYigNCi0gICAgICBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IociAvIGspKSwNCi0gICAgICBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IoZyAvIGspKSwNCi0gICAgICBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IoYiAvIGspKSk7DQotfTsNCi0NCi1kM19SZ2IucHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHsNCi0gIGsgPSBNYXRoLnBvdygwLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7DQotICByZXR1cm4gZDNfcmdiKA0KLSAgICAgIE1hdGguZmxvb3IoayAqIHRoaXMuciksDQotICAgICAgTWF0aC5mbG9vcihrICogdGhpcy5nKSwNCi0gICAgICBNYXRoLmZsb29yKGsgKiB0aGlzLmIpKTsNCi19Ow0KLQ0KLWQzX1JnYi5wcm90b3R5cGUuaHNsID0gZnVuY3Rpb24oKSB7DQotICByZXR1cm4gZDNfcmdiX2hzbCh0aGlzLnIsIHRoaXMuZywgdGhpcy5iKTsNCi19Ow0KLQ0KLWQzX1JnYi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiAiIyIgKyBkM19yZ2JfaGV4KHRoaXMucikgKyBkM19yZ2JfaGV4KHRoaXMuZykgKyBkM19yZ2JfaGV4KHRoaXMuYik7DQotfTsNCi0NCi1mdW5jdGlvbiBkM19yZ2JfaGV4KHYpIHsNCi0gIHJldHVybiB2IDwgMHgxMA0KLSAgICAgID8gIjAiICsgTWF0aC5tYXgoMCwgdikudG9TdHJpbmcoMTYpDQotICAgICAgOiBNYXRoLm1pbigyNTUsIHYpLnRvU3RyaW5nKDE2KTsNCi19DQotDQotZnVuY3Rpb24gZDNfcmdiX3BhcnNlKGZvcm1hdCwgcmdiLCBoc2wpIHsNCi0gIHZhciByID0gMCwgLy8gcmVkIGNoYW5uZWw7IGludCBpbiBbMCwgMjU1XQ0KLSAgICAgIGcgPSAwLCAvLyBncmVlbiBjaGFubmVsOyBpbnQgaW4gWzAsIDI1NV0NCi0gICAgICBiID0gMCwgLy8gYmx1ZSBjaGFubmVsOyBpbnQgaW4gWzAsIDI1NV0NCi0gICAgICBtMSwgLy8gQ1NTIGNvbG9yIHNwZWNpZmljYXRpb24gbWF0Y2gNCi0gICAgICBtMiwgLy8gQ1NTIGNvbG9yIHNwZWNpZmljYXRpb24gdHlwZSAoZS5nLiwgcmdiKQ0KLSAgICAgIG5hbWU7DQotDQotICAvKiBIYW5kbGUgaHNsLCByZ2IuICovDQotICBtMSA9IC8oW2Etel0rKVwoKC4qKVwpL2kuZXhlYyhmb3JtYXQpOw0KLSAgaWYgKG0xKSB7DQotICAgIG0yID0gbTFbMl0uc3BsaXQoIiwiKTsNCi0gICAgc3dpdGNoIChtMVsxXSkgew0KLSAgICAgIGNhc2UgImhzbCI6IHsNCi0gICAgICAgIHJldHVybiBoc2woDQotICAgICAgICAgIHBhcnNlRmxvYXQobTJbMF0pLCAvLyBkZWdyZWVzDQotICAgICAgICAgIHBhcnNlRmxvYXQobTJbMV0pIC8gMTAwLCAvLyBwZXJjZW50YWdlDQotICAgICAgICAgIHBhcnNlRmxvYXQobTJbMl0pIC8gMTAwIC8vIHBlcmNlbnRhZ2UNCi0gICAgICAgICk7DQotICAgICAgfQ0KLSAgICAgIGNhc2UgInJnYiI6IHsNCi0gICAgICAgIHJldHVybiByZ2IoDQotICAgICAgICAgIGQzX3JnYl9wYXJzZU51bWJlcihtMlswXSksDQotICAgICAgICAgIGQzX3JnYl9wYXJzZU51bWJlcihtMlsxXSksDQotICAgICAgICAgIGQzX3JnYl9wYXJzZU51bWJlcihtMlsyXSkNCi0gICAgICAgICk7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICAvKiBOYW1lZCBjb2xvcnMuICovDQotICBpZiAobmFtZSA9IGQzX3JnYl9uYW1lcy5nZXQoZm9ybWF0KSkgcmV0dXJuIHJnYihuYW1lLnIsIG5hbWUuZywgbmFtZS5iKTsNCi0NCi0gIC8qIEhleGFkZWNpbWFsIGNvbG9yczogI3JnYiBhbmQgI3JyZ2diYi4gKi8NCi0gIGlmIChmb3JtYXQgIT0gbnVsbCAmJiBmb3JtYXQuY2hhckF0KDApID09PSAiIyIpIHsNCi0gICAgaWYgKGZvcm1hdC5sZW5ndGggPT09IDQpIHsNCi0gICAgICByID0gZm9ybWF0LmNoYXJBdCgxKTsgciArPSByOw0KLSAgICAgIGcgPSBmb3JtYXQuY2hhckF0KDIpOyBnICs9IGc7DQotICAgICAgYiA9IGZvcm1hdC5jaGFyQXQoMyk7IGIgKz0gYjsNCi0gICAgfSBlbHNlIGlmIChmb3JtYXQubGVuZ3RoID09PSA3KSB7DQotICAgICAgciA9IGZvcm1hdC5zdWJzdHJpbmcoMSwgMyk7DQotICAgICAgZyA9IGZvcm1hdC5zdWJzdHJpbmcoMywgNSk7DQotICAgICAgYiA9IGZvcm1hdC5zdWJzdHJpbmcoNSwgNyk7DQotICAgIH0NCi0gICAgciA9IHBhcnNlSW50KHIsIDE2KTsNCi0gICAgZyA9IHBhcnNlSW50KGcsIDE2KTsNCi0gICAgYiA9IHBhcnNlSW50KGIsIDE2KTsNCi0gIH0NCi0NCi0gIHJldHVybiByZ2IociwgZywgYik7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3JnYl9oc2wociwgZywgYikgew0KLSAgdmFyIG1pbiA9IE1hdGgubWluKHIgLz0gMjU1LCBnIC89IDI1NSwgYiAvPSAyNTUpLA0KLSAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLA0KLSAgICAgIGQgPSBtYXggLSBtaW4sDQotICAgICAgaCwNCi0gICAgICBzLA0KLSAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7DQotICBpZiAoZCkgew0KLSAgICBzID0gbCA8IC41ID8gZCAvIChtYXggKyBtaW4pIDogZCAvICgyIC0gbWF4IC0gbWluKTsNCi0gICAgaWYgKHIgPT0gbWF4KSBoID0gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCk7DQotICAgIGVsc2UgaWYgKGcgPT0gbWF4KSBoID0gKGIgLSByKSAvIGQgKyAyOw0KLSAgICBlbHNlIGggPSAociAtIGcpIC8gZCArIDQ7DQotICAgIGggKj0gNjA7DQotICB9IGVsc2Ugew0KLSAgICBzID0gaCA9IDA7DQotICB9DQotICByZXR1cm4gZDNfaHNsKGgsIHMsIGwpOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19yZ2JfcGFyc2VOdW1iZXIoYykgeyAvLyBlaXRoZXIgaW50ZWdlciBvciBwZXJjZW50YWdlDQotICB2YXIgZiA9IHBhcnNlRmxvYXQoYyk7DQotICByZXR1cm4gYy5jaGFyQXQoYy5sZW5ndGggLSAxKSA9PT0gIiUiID8gTWF0aC5yb3VuZChmICogMi41NSkgOiBmOw0KLX0NCi0NCi12YXIgZDNfcmdiX25hbWVzID0gZDMubWFwKHsNCi0gIGFsaWNlYmx1ZTogIiNmMGY4ZmYiLA0KLSAgYW50aXF1ZXdoaXRlOiAiI2ZhZWJkNyIsDQotICBhcXVhOiAiIzAwZmZmZiIsDQotICBhcXVhbWFyaW5lOiAiIzdmZmZkNCIsDQotICBhenVyZTogIiNmMGZmZmYiLA0KLSAgYmVpZ2U6ICIjZjVmNWRjIiwNCi0gIGJpc3F1ZTogIiNmZmU0YzQiLA0KLSAgYmxhY2s6ICIjMDAwMDAwIiwNCi0gIGJsYW5jaGVkYWxtb25kOiAiI2ZmZWJjZCIsDQotICBibHVlOiAiIzAwMDBmZiIsDQotICBibHVldmlvbGV0OiAiIzhhMmJlMiIsDQotICBicm93bjogIiNhNTJhMmEiLA0KLSAgYnVybHl3b29kOiAiI2RlYjg4NyIsDQotICBjYWRldGJsdWU6ICIjNWY5ZWEwIiwNCi0gIGNoYXJ0cmV1c2U6ICIjN2ZmZjAwIiwNCi0gIGNob2NvbGF0ZTogIiNkMjY5MWUiLA0KLSAgY29yYWw6ICIjZmY3ZjUwIiwNCi0gIGNvcm5mbG93ZXJibHVlOiAiIzY0OTVlZCIsDQotICBjb3Juc2lsazogIiNmZmY4ZGMiLA0KLSAgY3JpbXNvbjogIiNkYzE0M2MiLA0KLSAgY3lhbjogIiMwMGZmZmYiLA0KLSAgZGFya2JsdWU6ICIjMDAwMDhiIiwNCi0gIGRhcmtjeWFuOiAiIzAwOGI4YiIsDQotICBkYXJrZ29sZGVucm9kOiAiI2I4ODYwYiIsDQotICBkYXJrZ3JheTogIiNhOWE5YTkiLA0KLSAgZGFya2dyZWVuOiAiIzAwNjQwMCIsDQotICBkYXJrZ3JleTogIiNhOWE5YTkiLA0KLSAgZGFya2toYWtpOiAiI2JkYjc2YiIsDQotICBkYXJrbWFnZW50YTogIiM4YjAwOGIiLA0KLSAgZGFya29saXZlZ3JlZW46ICIjNTU2YjJmIiwNCi0gIGRhcmtvcmFuZ2U6ICIjZmY4YzAwIiwNCi0gIGRhcmtvcmNoaWQ6ICIjOTkzMmNjIiwNCi0gIGRhcmtyZWQ6ICIjOGIwMDAwIiwNCi0gIGRhcmtzYWxtb246ICIjZTk5NjdhIiwNCi0gIGRhcmtzZWFncmVlbjogIiM4ZmJjOGYiLA0KLSAgZGFya3NsYXRlYmx1ZTogIiM0ODNkOGIiLA0KLSAgZGFya3NsYXRlZ3JheTogIiMyZjRmNGYiLA0KLSAgZGFya3NsYXRlZ3JleTogIiMyZjRmNGYiLA0KLSAgZGFya3R1cnF1b2lzZTogIiMwMGNlZDEiLA0KLSAgZGFya3Zpb2xldDogIiM5NDAwZDMiLA0KLSAgZGVlcHBpbms6ICIjZmYxNDkzIiwNCi0gIGRlZXBza3libHVlOiAiIzAwYmZmZiIsDQotICBkaW1ncmF5OiAiIzY5Njk2OSIsDQotICBkaW1ncmV5OiAiIzY5Njk2OSIsDQotICBkb2RnZXJibHVlOiAiIzFlOTBmZiIsDQotICBmaXJlYnJpY2s6ICIjYjIyMjIyIiwNCi0gIGZsb3JhbHdoaXRlOiAiI2ZmZmFmMCIsDQotICBmb3Jlc3RncmVlbjogIiMyMjhiMjIiLA0KLSAgZnVjaHNpYTogIiNmZjAwZmYiLA0KLSAgZ2FpbnNib3JvOiAiI2RjZGNkYyIsDQotICBnaG9zdHdoaXRlOiAiI2Y4ZjhmZiIsDQotICBnb2xkOiAiI2ZmZDcwMCIsDQotICBnb2xkZW5yb2Q6ICIjZGFhNTIwIiwNCi0gIGdyYXk6ICIjODA4MDgwIiwNCi0gIGdyZWVuOiAiIzAwODAwMCIsDQotICBncmVlbnllbGxvdzogIiNhZGZmMmYiLA0KLSAgZ3JleTogIiM4MDgwODAiLA0KLSAgaG9uZXlkZXc6ICIjZjBmZmYwIiwNCi0gIGhvdHBpbms6ICIjZmY2OWI0IiwNCi0gIGluZGlhbnJlZDogIiNjZDVjNWMiLA0KLSAgaW5kaWdvOiAiIzRiMDA4MiIsDQotICBpdm9yeTogIiNmZmZmZjAiLA0KLSAga2hha2k6ICIjZjBlNjhjIiwNCi0gIGxhdmVuZGVyOiAiI2U2ZTZmYSIsDQotICBsYXZlbmRlcmJsdXNoOiAiI2ZmZjBmNSIsDQotICBsYXduZ3JlZW46ICIjN2NmYzAwIiwNCi0gIGxlbW9uY2hpZmZvbjogIiNmZmZhY2QiLA0KLSAgbGlnaHRibHVlOiAiI2FkZDhlNiIsDQotICBsaWdodGNvcmFsOiAiI2YwODA4MCIsDQotICBsaWdodGN5YW46ICIjZTBmZmZmIiwNCi0gIGxpZ2h0Z29sZGVucm9keWVsbG93OiAiI2ZhZmFkMiIsDQotICBsaWdodGdyYXk6ICIjZDNkM2QzIiwNCi0gIGxpZ2h0Z3JlZW46ICIjOTBlZTkwIiwNCi0gIGxpZ2h0Z3JleTogIiNkM2QzZDMiLA0KLSAgbGlnaHRwaW5rOiAiI2ZmYjZjMSIsDQotICBsaWdodHNhbG1vbjogIiNmZmEwN2EiLA0KLSAgbGlnaHRzZWFncmVlbjogIiMyMGIyYWEiLA0KLSAgbGlnaHRza3libHVlOiAiIzg3Y2VmYSIsDQotICBsaWdodHNsYXRlZ3JheTogIiM3Nzg4OTkiLA0KLSAgbGlnaHRzbGF0ZWdyZXk6ICIjNzc4ODk5IiwNCi0gIGxpZ2h0c3RlZWxibHVlOiAiI2IwYzRkZSIsDQotICBsaWdodHllbGxvdzogIiNmZmZmZTAiLA0KLSAgbGltZTogIiMwMGZmMDAiLA0KLSAgbGltZWdyZWVuOiAiIzMyY2QzMiIsDQotICBsaW5lbjogIiNmYWYwZTYiLA0KLSAgbWFnZW50YTogIiNmZjAwZmYiLA0KLSAgbWFyb29uOiAiIzgwMDAwMCIsDQotICBtZWRpdW1hcXVhbWFyaW5lOiAiIzY2Y2RhYSIsDQotICBtZWRpdW1ibHVlOiAiIzAwMDBjZCIsDQotICBtZWRpdW1vcmNoaWQ6ICIjYmE1NWQzIiwNCi0gIG1lZGl1bXB1cnBsZTogIiM5MzcwZGIiLA0KLSAgbWVkaXVtc2VhZ3JlZW46ICIjM2NiMzcxIiwNCi0gIG1lZGl1bXNsYXRlYmx1ZTogIiM3YjY4ZWUiLA0KLSAgbWVkaXVtc3ByaW5nZ3JlZW46ICIjMDBmYTlhIiwNCi0gIG1lZGl1bXR1cnF1b2lzZTogIiM0OGQxY2MiLA0KLSAgbWVkaXVtdmlvbGV0cmVkOiAiI2M3MTU4NSIsDQotICBtaWRuaWdodGJsdWU6ICIjMTkxOTcwIiwNCi0gIG1pbnRjcmVhbTogIiNmNWZmZmEiLA0KLSAgbWlzdHlyb3NlOiAiI2ZmZTRlMSIsDQotICBtb2NjYXNpbjogIiNmZmU0YjUiLA0KLSAgbmF2YWpvd2hpdGU6ICIjZmZkZWFkIiwNCi0gIG5hdnk6ICIjMDAwMDgwIiwNCi0gIG9sZGxhY2U6ICIjZmRmNWU2IiwNCi0gIG9saXZlOiAiIzgwODAwMCIsDQotICBvbGl2ZWRyYWI6ICIjNmI4ZTIzIiwNCi0gIG9yYW5nZTogIiNmZmE1MDAiLA0KLSAgb3JhbmdlcmVkOiAiI2ZmNDUwMCIsDQotICBvcmNoaWQ6ICIjZGE3MGQ2IiwNCi0gIHBhbGVnb2xkZW5yb2Q6ICIjZWVlOGFhIiwNCi0gIHBhbGVncmVlbjogIiM5OGZiOTgiLA0KLSAgcGFsZXR1cnF1b2lzZTogIiNhZmVlZWUiLA0KLSAgcGFsZXZpb2xldHJlZDogIiNkYjcwOTMiLA0KLSAgcGFwYXlhd2hpcDogIiNmZmVmZDUiLA0KLSAgcGVhY2hwdWZmOiAiI2ZmZGFiOSIsDQotICBwZXJ1OiAiI2NkODUzZiIsDQotICBwaW5rOiAiI2ZmYzBjYiIsDQotICBwbHVtOiAiI2RkYTBkZCIsDQotICBwb3dkZXJibHVlOiAiI2IwZTBlNiIsDQotICBwdXJwbGU6ICIjODAwMDgwIiwNCi0gIHJlZDogIiNmZjAwMDAiLA0KLSAgcm9zeWJyb3duOiAiI2JjOGY4ZiIsDQotICByb3lhbGJsdWU6ICIjNDE2OWUxIiwNCi0gIHNhZGRsZWJyb3duOiAiIzhiNDUxMyIsDQotICBzYWxtb246ICIjZmE4MDcyIiwNCi0gIHNhbmR5YnJvd246ICIjZjRhNDYwIiwNCi0gIHNlYWdyZWVuOiAiIzJlOGI1NyIsDQotICBzZWFzaGVsbDogIiNmZmY1ZWUiLA0KLSAgc2llbm5hOiAiI2EwNTIyZCIsDQotICBzaWx2ZXI6ICIjYzBjMGMwIiwNCi0gIHNreWJsdWU6ICIjODdjZWViIiwNCi0gIHNsYXRlYmx1ZTogIiM2YTVhY2QiLA0KLSAgc2xhdGVncmF5OiAiIzcwODA5MCIsDQotICBzbGF0ZWdyZXk6ICIjNzA4MDkwIiwNCi0gIHNub3c6ICIjZmZmYWZhIiwNCi0gIHNwcmluZ2dyZWVuOiAiIzAwZmY3ZiIsDQotICBzdGVlbGJsdWU6ICIjNDY4MmI0IiwNCi0gIHRhbjogIiNkMmI0OGMiLA0KLSAgdGVhbDogIiMwMDgwODAiLA0KLSAgdGhpc3RsZTogIiNkOGJmZDgiLA0KLSAgdG9tYXRvOiAiI2ZmNjM0NyIsDQotICB0dXJxdW9pc2U6ICIjNDBlMGQwIiwNCi0gIHZpb2xldDogIiNlZTgyZWUiLA0KLSAgd2hlYXQ6ICIjZjVkZWIzIiwNCi0gIHdoaXRlOiAiI2ZmZmZmZiIsDQotICB3aGl0ZXNtb2tlOiAiI2Y1ZjVmNSIsDQotICB5ZWxsb3c6ICIjZmZmZjAwIiwNCi0gIHllbGxvd2dyZWVuOiAiIzlhY2QzMiINCi19KTsNCi0NCi1kM19yZ2JfbmFtZXMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7DQotICBkM19yZ2JfbmFtZXMuc2V0KGtleSwgZDNfcmdiX3BhcnNlKHZhbHVlLCBkM19yZ2IsIGQzX2hzbF9yZ2IpKTsNCi19KTsNCi1kMy5oc2wgPSBmdW5jdGlvbihoLCBzLCBsKSB7DQotICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMQ0KLSAgICAgID8gKGggaW5zdGFuY2VvZiBkM19Ic2wgPyBkM19oc2woaC5oLCBoLnMsIGgubCkNCi0gICAgICA6IGQzX3JnYl9wYXJzZSgiIiArIGgsIGQzX3JnYl9oc2wsIGQzX2hzbCkpDQotICAgICAgOiBkM19oc2woK2gsICtzLCArbCk7DQotfTsNCi0NCi1mdW5jdGlvbiBkM19oc2woaCwgcywgbCkgew0KLSAgcmV0dXJuIG5ldyBkM19Ic2woaCwgcywgbCk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX0hzbChoLCBzLCBsKSB7DQotICB0aGlzLmggPSBoOw0KLSAgdGhpcy5zID0gczsNCi0gIHRoaXMubCA9IGw7DQotfQ0KLQ0KLWQzX0hzbC5wcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7DQotICBrID0gTWF0aC5wb3coMC43LCBhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpOw0KLSAgcmV0dXJuIGQzX2hzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sIC8gayk7DQotfTsNCi0NCi1kM19Ic2wucHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHsNCi0gIGsgPSBNYXRoLnBvdygwLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7DQotICByZXR1cm4gZDNfaHNsKHRoaXMuaCwgdGhpcy5zLCBrICogdGhpcy5sKTsNCi19Ow0KLQ0KLWQzX0hzbC5wcm90b3R5cGUucmdiID0gZnVuY3Rpb24oKSB7DQotICByZXR1cm4gZDNfaHNsX3JnYih0aGlzLmgsIHRoaXMucywgdGhpcy5sKTsNCi19Ow0KLQ0KLWQzX0hzbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiB0aGlzLnJnYigpLnRvU3RyaW5nKCk7DQotfTsNCi0NCi1mdW5jdGlvbiBkM19oc2xfcmdiKGgsIHMsIGwpIHsNCi0gIHZhciBtMSwNCi0gICAgICBtMjsNCi0NCi0gIC8qIFNvbWUgc2ltcGxlIGNvcnJlY3Rpb25zIGZvciBoLCBzIGFuZCBsLiAqLw0KLSAgaCA9IGggJSAzNjA7IGlmIChoIDwgMCkgaCArPSAzNjA7DQotICBzID0gcyA8IDAgPyAwIDogcyA+IDEgPyAxIDogczsNCi0gIGwgPSBsIDwgMCA/IDAgOiBsID4gMSA/IDEgOiBsOw0KLQ0KLSAgLyogRnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqLw0KLSAgbTIgPSBsIDw9IC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzOw0KLSAgbTEgPSAyICogbCAtIG0yOw0KLQ0KLSAgZnVuY3Rpb24gdihoKSB7DQotICAgIGlmIChoID4gMzYwKSBoIC09IDM2MDsNCi0gICAgZWxzZSBpZiAoaCA8IDApIGggKz0gMzYwOw0KLSAgICBpZiAoaCA8IDYwKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjA7DQotICAgIGlmIChoIDwgMTgwKSByZXR1cm4gbTI7DQotICAgIGlmIChoIDwgMjQwKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MDsNCi0gICAgcmV0dXJuIG0xOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gdnYoaCkgew0KLSAgICByZXR1cm4gTWF0aC5yb3VuZCh2KGgpICogMjU1KTsNCi0gIH0NCi0NCi0gIHJldHVybiBkM19yZ2IodnYoaCArIDEyMCksIHZ2KGgpLCB2dihoIC0gMTIwKSk7DQotfQ0KLWZ1bmN0aW9uIGQzX3NlbGVjdGlvbihncm91cHMpIHsNCi0gIGQzX2FycmF5U3ViY2xhc3MoZ3JvdXBzLCBkM19zZWxlY3Rpb25Qcm90b3R5cGUpOw0KLSAgcmV0dXJuIGdyb3VwczsNCi19DQotDQotdmFyIGQzX3NlbGVjdCA9IGZ1bmN0aW9uKHMsIG4pIHsgcmV0dXJuIG4ucXVlcnlTZWxlY3RvcihzKTsgfSwNCi0gICAgZDNfc2VsZWN0QWxsID0gZnVuY3Rpb24ocywgbikgeyByZXR1cm4gbi5xdWVyeVNlbGVjdG9yQWxsKHMpOyB9LA0KLSAgICBkM19zZWxlY3RSb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LA0KLSAgICBkM19zZWxlY3RNYXRjaGVyID0gZDNfc2VsZWN0Um9vdC5tYXRjaGVzU2VsZWN0b3IgfHwgZDNfc2VsZWN0Um9vdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZDNfc2VsZWN0Um9vdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZDNfc2VsZWN0Um9vdC5tc01hdGNoZXNTZWxlY3RvciB8fCBkM19zZWxlY3RSb290Lm9NYXRjaGVzU2VsZWN0b3IsDQotICAgIGQzX3NlbGVjdE1hdGNoZXMgPSBmdW5jdGlvbihuLCBzKSB7IHJldHVybiBkM19zZWxlY3RNYXRjaGVyLmNhbGwobiwgcyk7IH07DQotDQotLy8gUHJlZmVyIFNpenpsZSwgaWYgYXZhaWxhYmxlLg0KLWlmICh0eXBlb2YgU2l6emxlID09PSAiZnVuY3Rpb24iKSB7DQotICBkM19zZWxlY3QgPSBmdW5jdGlvbihzLCBuKSB7IHJldHVybiBTaXp6bGUocywgbilbMF07IH07DQotICBkM19zZWxlY3RBbGwgPSBmdW5jdGlvbihzLCBuKSB7IHJldHVybiBTaXp6bGUudW5pcXVlU29ydChTaXp6bGUocywgbikpOyB9Ow0KLSAgZDNfc2VsZWN0TWF0Y2hlcyA9IFNpenpsZS5tYXRjaGVzU2VsZWN0b3I7DQotfQ0KLQ0KLXZhciBkM19zZWxlY3Rpb25Qcm90b3R5cGUgPSBbXTsNCi0NCi1kMy5zZWxlY3Rpb24gPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiBkM19zZWxlY3Rpb25Sb290Ow0KLX07DQotDQotZDMuc2VsZWN0aW9uLnByb3RvdHlwZSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZTsNCi1kM19zZWxlY3Rpb25Qcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsNCi0gIHZhciBzdWJncm91cHMgPSBbXSwNCi0gICAgICBzdWJncm91cCwNCi0gICAgICBzdWJub2RlLA0KLSAgICAgIGdyb3VwLA0KLSAgICAgIG5vZGU7DQotDQotICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAiZnVuY3Rpb24iKSBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvcihzZWxlY3Rvcik7DQotDQotICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTspIHsNCi0gICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7DQotICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSAoZ3JvdXAgPSB0aGlzW2pdKS5wYXJlbnROb2RlOw0KLSAgICBmb3IgKHZhciBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7DQotICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgew0KLSAgICAgICAgc3ViZ3JvdXAucHVzaChzdWJub2RlID0gc2VsZWN0b3IuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpKSk7DQotICAgICAgICBpZiAoc3Vibm9kZSAmJiAiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBzdWJncm91cC5wdXNoKG51bGwpOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGQzX3NlbGVjdGlvbihzdWJncm91cHMpOw0KLX07DQotDQotZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NlbGVjdG9yKHNlbGVjdG9yKSB7DQotICByZXR1cm4gZnVuY3Rpb24oKSB7DQotICAgIHJldHVybiBkM19zZWxlY3Qoc2VsZWN0b3IsIHRoaXMpOw0KLSAgfTsNCi19DQotZDNfc2VsZWN0aW9uUHJvdG90eXBlLnNlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQotICB2YXIgc3ViZ3JvdXBzID0gW10sDQotICAgICAgc3ViZ3JvdXAsDQotICAgICAgbm9kZTsNCi0NCi0gIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICJmdW5jdGlvbiIpIHNlbGVjdG9yID0gZDNfc2VsZWN0aW9uX3NlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCi0NCi0gIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgew0KLSAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjspIHsNCi0gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQotICAgICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IGQzX2FycmF5KHNlbGVjdG9yLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpKTsNCi0gICAgICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSBub2RlOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGQzX3NlbGVjdGlvbihzdWJncm91cHMpOw0KLX07DQotDQotZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NlbGVjdG9yQWxsKHNlbGVjdG9yKSB7DQotICByZXR1cm4gZnVuY3Rpb24oKSB7DQotICAgIHJldHVybiBkM19zZWxlY3RBbGwoc2VsZWN0b3IsIHRoaXMpOw0KLSAgfTsNCi19DQotZDNfc2VsZWN0aW9uUHJvdG90eXBlLmF0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KLSAgbmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZSk7DQotDQotICAvLyBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgZmlyc3QgdmFsdWUuDQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsNCi0gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTsNCi0gICAgcmV0dXJuIG5hbWUubG9jYWwNCi0gICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKQ0KLSAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShuYW1lKTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGF0dHJOdWxsKCkgew0KLSAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGF0dHJOdWxsTlMoKSB7DQotICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCk7DQotICB9DQotDQotICBmdW5jdGlvbiBhdHRyQ29uc3RhbnQoKSB7DQotICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKCkgew0KLSAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwsIHZhbHVlKTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbigpIHsNCi0gICAgdmFyIHggPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KLSAgICBpZiAoeCA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsNCi0gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB4KTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKCkgew0KLSAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQotICAgIGlmICh4ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCk7DQotICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsLCB4KTsNCi0gIH0NCi0NCi0gIHJldHVybiB0aGlzLmVhY2godmFsdWUgPT0gbnVsbA0KLSAgICAgID8gKG5hbWUubG9jYWwgPyBhdHRyTnVsbE5TIDogYXR0ck51bGwpIDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KLSAgICAgID8gKG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikNCi0gICAgICA6IChuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSk7DQotfTsNCi1kM19zZWxlY3Rpb25Qcm90b3R5cGUuY2xhc3NlZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7DQotICB2YXIgbmFtZXMgPSBuYW1lLnNwbGl0KGQzX3NlbGVjdGlvbl9jbGFzc2VkV2hpdGVzcGFjZSksDQotICAgICAgbiA9IG5hbWVzLmxlbmd0aCwNCi0gICAgICBpID0gLTE7DQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsNCi0gICAgd2hpbGUgKCsraSA8IG4pIGQzX3NlbGVjdGlvbl9jbGFzc2VkLmNhbGwodGhpcywgbmFtZXNbaV0sIHZhbHVlKTsNCi0gICAgcmV0dXJuIHRoaXM7DQotICB9IGVsc2Ugew0KLSAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFkM19zZWxlY3Rpb25fY2xhc3NlZC5jYWxsKHRoaXMsIG5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlOw0KLSAgICByZXR1cm4gdHJ1ZTsNCi0gIH0NCi19Ow0KLQ0KLXZhciBkM19zZWxlY3Rpb25fY2xhc3NlZFdoaXRlc3BhY2UgPSAvXHMrL2c7DQotDQotZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2NsYXNzZWQobmFtZSwgdmFsdWUpIHsNCi0gIHZhciByZSA9IG5ldyBSZWdFeHAoIihefFxccyspIiArIGQzLnJlcXVvdGUobmFtZSkgKyAiKFxccyt8JCkiLCAiZyIpOw0KLQ0KLSAgLy8gSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGZpcnN0IHZhbHVlLg0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7DQotICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7DQotICAgIGlmIChjID0gbm9kZS5jbGFzc0xpc3QpIHJldHVybiBjLmNvbnRhaW5zKG5hbWUpOw0KLSAgICB2YXIgYyA9IG5vZGUuY2xhc3NOYW1lOw0KLSAgICByZS5sYXN0SW5kZXggPSAwOw0KLSAgICByZXR1cm4gcmUudGVzdChjLmJhc2VWYWwgIT0gbnVsbCA/IGMuYmFzZVZhbCA6IGMpOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gY2xhc3NlZEFkZCgpIHsNCi0gICAgaWYgKGMgPSB0aGlzLmNsYXNzTGlzdCkgcmV0dXJuIGMuYWRkKG5hbWUpOw0KLSAgICB2YXIgYyA9IHRoaXMuY2xhc3NOYW1lLA0KLSAgICAgICAgY2IgPSBjLmJhc2VWYWwgIT0gbnVsbCwNCi0gICAgICAgIGN2ID0gY2IgPyBjLmJhc2VWYWwgOiBjOw0KLSAgICByZS5sYXN0SW5kZXggPSAwOw0KLSAgICBpZiAoIXJlLnRlc3QoY3YpKSB7DQotICAgICAgY3YgPSBkM19jb2xsYXBzZShjdiArICIgIiArIG5hbWUpOw0KLSAgICAgIGlmIChjYikgYy5iYXNlVmFsID0gY3Y7DQotICAgICAgZWxzZSB0aGlzLmNsYXNzTmFtZSA9IGN2Ow0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKCkgew0KLSAgICBpZiAoYyA9IHRoaXMuY2xhc3NMaXN0KSByZXR1cm4gYy5yZW1vdmUobmFtZSk7DQotICAgIHZhciBjID0gdGhpcy5jbGFzc05hbWUsDQotICAgICAgICBjYiA9IGMuYmFzZVZhbCAhPSBudWxsLA0KLSAgICAgICAgY3YgPSBjYiA/IGMuYmFzZVZhbCA6IGM7DQotICAgIGN2ID0gZDNfY29sbGFwc2UoY3YucmVwbGFjZShyZSwgIiAiKSk7DQotICAgIGlmIChjYikgYy5iYXNlVmFsID0gY3Y7DQotICAgIGVsc2UgdGhpcy5jbGFzc05hbWUgPSBjdjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbigpIHsNCi0gICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykNCi0gICAgICAgID8gY2xhc3NlZEFkZA0KLSAgICAgICAgOiBjbGFzc2VkUmVtb3ZlKS5jYWxsKHRoaXMpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHRoaXMuZWFjaCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCi0gICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlDQotICAgICAgPyBjbGFzc2VkQWRkDQotICAgICAgOiBjbGFzc2VkUmVtb3ZlKTsNCi19DQotZDNfc2VsZWN0aW9uUHJvdG90eXBlLnN0eWxlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7DQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHByaW9yaXR5ID0gIiI7DQotDQotICAvLyBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgZmlyc3QgdmFsdWUuDQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiB3aW5kb3cNCi0gICAgICAuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5vZGUoKSwgbnVsbCkNCi0gICAgICAuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTsNCi0NCi0gIGZ1bmN0aW9uIHN0eWxlTnVsbCgpIHsNCi0gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQoKSB7DQotICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24oKSB7DQotICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCi0gICAgaWYgKHggPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsNCi0gICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHgsIHByaW9yaXR5KTsNCi0gIH0NCi0NCi0gIHJldHVybiB0aGlzLmVhY2godmFsdWUgPT0gbnVsbA0KLSAgICAgID8gc3R5bGVOdWxsIDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KLSAgICAgID8gc3R5bGVGdW5jdGlvbiA6IHN0eWxlQ29uc3RhbnQpKTsNCi19Ow0KLWQzX3NlbGVjdGlvblByb3RvdHlwZS5wcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7DQotDQotICAvLyBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgZmlyc3QgdmFsdWUuDQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzLm5vZGUoKVtuYW1lXTsNCi0NCi0gIGZ1bmN0aW9uIHByb3BlcnR5TnVsbCgpIHsNCi0gICAgZGVsZXRlIHRoaXNbbmFtZV07DQotICB9DQotDQotICBmdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KCkgew0KLSAgICB0aGlzW25hbWVdID0gdmFsdWU7DQotICB9DQotDQotICBmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKCkgew0KLSAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQotICAgIGlmICh4ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdOw0KLSAgICBlbHNlIHRoaXNbbmFtZV0gPSB4Ow0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsDQotICAgICAgPyBwcm9wZXJ0eU51bGwgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iDQotICAgICAgPyBwcm9wZXJ0eUZ1bmN0aW9uIDogcHJvcGVydHlDb25zdGFudCkpOw0KLX07DQotZDNfc2VsZWN0aW9uUHJvdG90eXBlLnRleHQgPSBmdW5jdGlvbih2YWx1ZSkgew0KLSAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAxDQotICAgICAgPyB0aGlzLm5vZGUoKS50ZXh0Q29udGVudCA6IHRoaXMuZWFjaCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCi0gICAgICA/IGZ1bmN0aW9uKCkgeyB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyAiIiA6IHY7IH0gOiB2YWx1ZSA9PSBudWxsDQotICAgICAgPyBmdW5jdGlvbigpIHsgdGhpcy50ZXh0Q29udGVudCA9ICIiOyB9DQotICAgICAgOiBmdW5jdGlvbigpIHsgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOyB9KTsNCi19Ow0KLWQzX3NlbGVjdGlvblByb3RvdHlwZS5odG1sID0gZnVuY3Rpb24odmFsdWUpIHsNCi0gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMQ0KLSAgICAgID8gdGhpcy5ub2RlKCkuaW5uZXJIVE1MIDogdGhpcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KLSAgICAgID8gZnVuY3Rpb24oKSB7IHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyAiIiA6IHY7IH0gOiB2YWx1ZSA9PSBudWxsDQotICAgICAgPyBmdW5jdGlvbigpIHsgdGhpcy5pbm5lckhUTUwgPSAiIjsgfQ0KLSAgICAgIDogZnVuY3Rpb24oKSB7IHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7IH0pOw0KLX07DQotLy8gVE9ETyBhcHBlbmQobm9kZSk/DQotLy8gVE9ETyBhcHBlbmQoZnVuY3Rpb24pPw0KLWQzX3NlbGVjdGlvblByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihuYW1lKSB7DQotICBuYW1lID0gZDMubnMucXVhbGlmeShuYW1lKTsNCi0NCi0gIGZ1bmN0aW9uIGFwcGVuZCgpIHsNCi0gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLCBuYW1lKSk7DQotICB9DQotDQotICBmdW5jdGlvbiBhcHBlbmROUygpIHsNCi0gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpKTsNCi0gIH0NCi0NCi0gIHJldHVybiB0aGlzLnNlbGVjdChuYW1lLmxvY2FsID8gYXBwZW5kTlMgOiBhcHBlbmQpOw0KLX07DQotLy8gVE9ETyBpbnNlcnQobm9kZSwgZnVuY3Rpb24pPw0KLS8vIFRPRE8gaW5zZXJ0KGZ1bmN0aW9uLCBzdHJpbmcpPw0KLS8vIFRPRE8gaW5zZXJ0KGZ1bmN0aW9uLCBmdW5jdGlvbik/DQotZDNfc2VsZWN0aW9uUHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkgew0KLSAgbmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZSk7DQotDQotICBmdW5jdGlvbiBpbnNlcnQoKSB7DQotICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZSgNCi0gICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5hbWVzcGFjZVVSSSwgbmFtZSksDQotICAgICAgICBkM19zZWxlY3QoYmVmb3JlLCB0aGlzKSk7DQotICB9DQotDQotICBmdW5jdGlvbiBpbnNlcnROUygpIHsNCi0gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKA0KLSAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpLA0KLSAgICAgICAgZDNfc2VsZWN0KGJlZm9yZSwgdGhpcykpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHRoaXMuc2VsZWN0KG5hbWUubG9jYWwgPyBpbnNlcnROUyA6IGluc2VydCk7DQotfTsNCi0vLyBUT0RPIHJlbW92ZShzZWxlY3Rvcik/DQotLy8gVE9ETyByZW1vdmUobm9kZSk/DQotLy8gVE9ETyByZW1vdmUoZnVuY3Rpb24pPw0KLWQzX3NlbGVjdGlvblByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7DQotICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7DQotICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsNCi0gIH0pOw0KLX07DQotZDNfc2VsZWN0aW9uUHJvdG90eXBlLmRhdGEgPSBmdW5jdGlvbih2YWx1ZSwga2V5KSB7DQotICB2YXIgaSA9IC0xLA0KLSAgICAgIG4gPSB0aGlzLmxlbmd0aCwNCi0gICAgICBncm91cCwNCi0gICAgICBub2RlOw0KLQ0KLSAgLy8gSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGZpcnN0IHZhbHVlLg0KLSAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7DQotICAgIHZhbHVlID0gbmV3IEFycmF5KG4gPSAoZ3JvdXAgPSB0aGlzWzBdKS5sZW5ndGgpOw0KLSAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsNCi0gICAgICAgIHZhbHVlW2ldID0gbm9kZS5fX2RhdGFfXzsNCi0gICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIHZhbHVlOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gYmluZChncm91cCwgZ3JvdXBEYXRhKSB7DQotICAgIHZhciBpLA0KLSAgICAgICAgbiA9IGdyb3VwLmxlbmd0aCwNCi0gICAgICAgIG0gPSBncm91cERhdGEubGVuZ3RoLA0KLSAgICAgICAgbjAgPSBNYXRoLm1pbihuLCBtKSwNCi0gICAgICAgIG4xID0gTWF0aC5tYXgobiwgbSksDQotICAgICAgICB1cGRhdGVOb2RlcyA9IFtdLA0KLSAgICAgICAgZW50ZXJOb2RlcyA9IFtdLA0KLSAgICAgICAgZXhpdE5vZGVzID0gW10sDQotICAgICAgICBub2RlLA0KLSAgICAgICAgbm9kZURhdGE7DQotDQotICAgIGlmIChrZXkpIHsNCi0gICAgICB2YXIgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgZDNfTWFwLA0KLSAgICAgICAgICBrZXlWYWx1ZXMgPSBbXSwNCi0gICAgICAgICAga2V5VmFsdWUsDQotICAgICAgICAgIGogPSBncm91cERhdGEubGVuZ3RoOw0KLQ0KLSAgICAgIGZvciAoaSA9IC0xOyArK2kgPCBuOykgew0KLSAgICAgICAga2V5VmFsdWUgPSBrZXkuY2FsbChub2RlID0gZ3JvdXBbaV0sIG5vZGUuX19kYXRhX18sIGkpOw0KLSAgICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHsNCi0gICAgICAgICAgZXhpdE5vZGVzW2orK10gPSBub2RlOyAvLyBkdXBsaWNhdGUga2V5DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAga2V5VmFsdWVzLnB1c2goa2V5VmFsdWUpOw0KLSAgICAgIH0NCi0NCi0gICAgICBmb3IgKGkgPSAtMTsgKytpIDwgbTspIHsNCi0gICAgICAgIGtleVZhbHVlID0ga2V5LmNhbGwoZ3JvdXBEYXRhLCBub2RlRGF0YSA9IGdyb3VwRGF0YVtpXSwgaSkNCi0gICAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWUpKSB7DQotICAgICAgICAgIHVwZGF0ZU5vZGVzW2ldID0gbm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSk7DQotICAgICAgICAgIG5vZGUuX19kYXRhX18gPSBub2RlRGF0YTsNCi0gICAgICAgICAgZW50ZXJOb2Rlc1tpXSA9IGV4aXROb2Rlc1tpXSA9IG51bGw7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBlbnRlck5vZGVzW2ldID0gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKG5vZGVEYXRhKTsNCi0gICAgICAgICAgdXBkYXRlTm9kZXNbaV0gPSBleGl0Tm9kZXNbaV0gPSBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbm9kZUJ5S2V5VmFsdWUucmVtb3ZlKGtleVZhbHVlKTsNCi0gICAgICB9DQotDQotICAgICAgZm9yIChpID0gLTE7ICsraSA8IG47KSB7DQotICAgICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlc1tpXSkpIHsNCi0gICAgICAgICAgZXhpdE5vZGVzW2ldID0gZ3JvdXBbaV07DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGZvciAoaSA9IC0xOyArK2kgPCBuMDspIHsNCi0gICAgICAgIG5vZGUgPSBncm91cFtpXTsNCi0gICAgICAgIG5vZGVEYXRhID0gZ3JvdXBEYXRhW2ldOw0KLSAgICAgICAgaWYgKG5vZGUpIHsNCi0gICAgICAgICAgbm9kZS5fX2RhdGFfXyA9IG5vZGVEYXRhOw0KLSAgICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IG5vZGU7DQotICAgICAgICAgIGVudGVyTm9kZXNbaV0gPSBleGl0Tm9kZXNbaV0gPSBudWxsOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgZW50ZXJOb2Rlc1tpXSA9IGQzX3NlbGVjdGlvbl9kYXRhTm9kZShub2RlRGF0YSk7DQotICAgICAgICAgIHVwZGF0ZU5vZGVzW2ldID0gZXhpdE5vZGVzW2ldID0gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgZm9yICg7IGkgPCBtOyArK2kpIHsNCi0gICAgICAgIGVudGVyTm9kZXNbaV0gPSBkM19zZWxlY3Rpb25fZGF0YU5vZGUoZ3JvdXBEYXRhW2ldKTsNCi0gICAgICAgIHVwZGF0ZU5vZGVzW2ldID0gZXhpdE5vZGVzW2ldID0gbnVsbDsNCi0gICAgICB9DQotICAgICAgZm9yICg7IGkgPCBuMTsgKytpKSB7DQotICAgICAgICBleGl0Tm9kZXNbaV0gPSBncm91cFtpXTsNCi0gICAgICAgIGVudGVyTm9kZXNbaV0gPSB1cGRhdGVOb2Rlc1tpXSA9IG51bGw7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIGVudGVyTm9kZXMudXBkYXRlDQotICAgICAgICA9IHVwZGF0ZU5vZGVzOw0KLQ0KLSAgICBlbnRlck5vZGVzLnBhcmVudE5vZGUNCi0gICAgICAgID0gdXBkYXRlTm9kZXMucGFyZW50Tm9kZQ0KLSAgICAgICAgPSBleGl0Tm9kZXMucGFyZW50Tm9kZQ0KLSAgICAgICAgPSBncm91cC5wYXJlbnROb2RlOw0KLQ0KLSAgICBlbnRlci5wdXNoKGVudGVyTm9kZXMpOw0KLSAgICB1cGRhdGUucHVzaCh1cGRhdGVOb2Rlcyk7DQotICAgIGV4aXQucHVzaChleGl0Tm9kZXMpOw0KLSAgfQ0KLQ0KLSAgdmFyIGVudGVyID0gZDNfc2VsZWN0aW9uX2VudGVyKFtdKSwNCi0gICAgICB1cGRhdGUgPSBkM19zZWxlY3Rpb24oW10pLA0KLSAgICAgIGV4aXQgPSBkM19zZWxlY3Rpb24oW10pOw0KLQ0KLSAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIikgew0KLSAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgIGJpbmQoZ3JvdXAgPSB0aGlzW2ldLCB2YWx1ZS5jYWxsKGdyb3VwLCBncm91cC5wYXJlbnROb2RlLl9fZGF0YV9fLCBpKSk7DQotICAgIH0NCi0gIH0gZWxzZSB7DQotICAgIHdoaWxlICgrK2kgPCBuKSB7DQotICAgICAgYmluZChncm91cCA9IHRoaXNbaV0sIHZhbHVlKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgdXBkYXRlLmVudGVyID0gZnVuY3Rpb24oKSB7IHJldHVybiBlbnRlcjsgfTsNCi0gIHVwZGF0ZS5leGl0ID0gZnVuY3Rpb24oKSB7IHJldHVybiBleGl0OyB9Ow0KLSAgcmV0dXJuIHVwZGF0ZTsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9kYXRhTm9kZShkYXRhKSB7DQotICByZXR1cm4ge19fZGF0YV9fOiBkYXRhfTsNCi19DQotZDNfc2VsZWN0aW9uUHJvdG90eXBlLmRhdHVtID0NCi1kM19zZWxlY3Rpb25Qcm90b3R5cGUubWFwID0gZnVuY3Rpb24odmFsdWUpIHsNCi0gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMQ0KLSAgICAgID8gdGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iKQ0KLSAgICAgIDogdGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLCB2YWx1ZSk7DQotfTsNCi1kM19zZWxlY3Rpb25Qcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24oZmlsdGVyKSB7DQotICB2YXIgc3ViZ3JvdXBzID0gW10sDQotICAgICAgc3ViZ3JvdXAsDQotICAgICAgZ3JvdXAsDQotICAgICAgbm9kZTsNCi0NCi0gIGlmICh0eXBlb2YgZmlsdGVyICE9PSAiZnVuY3Rpb24iKSBmaWx0ZXIgPSBkM19zZWxlY3Rpb25fZmlsdGVyKGZpbHRlcik7DQotDQotICBmb3IgKHZhciBqID0gMCwgbSA9IHRoaXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7DQotICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOw0KLSAgICBzdWJncm91cC5wYXJlbnROb2RlID0gKGdyb3VwID0gdGhpc1tqXSkucGFyZW50Tm9kZTsNCi0gICAgZm9yICh2YXIgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCi0gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgZmlsdGVyLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpIHsNCi0gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7DQotfTsNCi0NCi1mdW5jdGlvbiBkM19zZWxlY3Rpb25fZmlsdGVyKHNlbGVjdG9yKSB7DQotICByZXR1cm4gZnVuY3Rpb24oKSB7DQotICAgIHJldHVybiBkM19zZWxlY3RNYXRjaGVzKHRoaXMsIHNlbGVjdG9yKTsNCi0gIH07DQotfQ0KLWQzX3NlbGVjdGlvblByb3RvdHlwZS5vcmRlciA9IGZ1bmN0aW9uKCkgew0KLSAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7DQotICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7DQotICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgew0KLSAgICAgICAgaWYgKG5leHQgJiYgbmV4dCAhPT0gbm9kZS5uZXh0U2libGluZykgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTsNCi0gICAgICAgIG5leHQgPSBub2RlOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIHRoaXM7DQotfTsNCi1kM19zZWxlY3Rpb25Qcm90b3R5cGUuc29ydCA9IGZ1bmN0aW9uKGNvbXBhcmF0b3IpIHsNCi0gIGNvbXBhcmF0b3IgPSBkM19zZWxlY3Rpb25fc29ydENvbXBhcmF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCi0gIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgdGhpc1tqXS5zb3J0KGNvbXBhcmF0b3IpOw0KLSAgcmV0dXJuIHRoaXMub3JkZXIoKTsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9zb3J0Q29tcGFyYXRvcihjb21wYXJhdG9yKSB7DQotICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIGNvbXBhcmF0b3IgPSBkMy5hc2NlbmRpbmc7DQotICByZXR1cm4gZnVuY3Rpb24oYSwgYikgew0KLSAgICByZXR1cm4gY29tcGFyYXRvcihhICYmIGEuX19kYXRhX18sIGIgJiYgYi5fX2RhdGFfXyk7DQotICB9Ow0KLX0NCi0vLyB0eXBlIGNhbiBiZSBuYW1lc3BhY2VkLCBlLmcuLCAiY2xpY2suZm9vIg0KLS8vIGxpc3RlbmVyIGNhbiBiZSBudWxsIGZvciByZW1vdmFsDQotZDNfc2VsZWN0aW9uUHJvdG90eXBlLm9uID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpIHsNCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgY2FwdHVyZSA9IGZhbHNlOw0KLQ0KLSAgLy8gcGFyc2UgdGhlIHR5cGUgc3BlY2lmaWVyDQotICB2YXIgbmFtZSA9ICJfX29uIiArIHR5cGUsIGkgPSB0eXBlLmluZGV4T2YoIi4iKTsNCi0gIGlmIChpID4gMCkgdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDAsIGkpOw0KLQ0KLSAgLy8gaWYgY2FsbGVkIHdpdGggb25seSBvbmUgYXJndW1lbnQsIHJldHVybiB0aGUgY3VycmVudCBsaXN0ZW5lcg0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGkgPSB0aGlzLm5vZGUoKVtuYW1lXSkgJiYgaS5fOw0KLQ0KLSAgLy8gcmVtb3ZlIHRoZSBvbGQgZXZlbnQgbGlzdGVuZXIsIGFuZCBhZGQgdGhlIG5ldyBldmVudCBsaXN0ZW5lcg0KLSAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkLCBpKSB7DQotICAgIHZhciBub2RlID0gdGhpcywNCi0gICAgICAgIG8gPSBub2RlW25hbWVdOw0KLQ0KLSAgICAvLyByZW1vdmUgdGhlIG9sZCBsaXN0ZW5lciwgaWYgYW55ICh1c2luZyB0aGUgcHJldmlvdXNseS1zZXQgY2FwdHVyZSkNCi0gICAgaWYgKG8pIHsNCi0gICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbywgby4kKTsNCi0gICAgICBkZWxldGUgbm9kZVtuYW1lXTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBhZGQgdGhlIG5ldyBsaXN0ZW5lciwgaWYgYW55IChyZW1lbWJlcmluZyB0aGUgY2FwdHVyZSBmbGFnKQ0KLSAgICBpZiAobGlzdGVuZXIpIHsNCi0gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbm9kZVtuYW1lXSA9IGwsIGwuJCA9IGNhcHR1cmUpOw0KLSAgICAgIGwuXyA9IGxpc3RlbmVyOyAvLyBzdGFzaCB0aGUgdW53cmFwcGVkIGxpc3RlbmVyIGZvciBnZXQNCi0gICAgfQ0KLQ0KLSAgICAvLyB3cmFwcGVkIGV2ZW50IGxpc3RlbmVyIHRoYXQgcHJlc2VydmVzIGkNCi0gICAgZnVuY3Rpb24gbChlKSB7DQotICAgICAgdmFyIG8gPSBkMy5ldmVudDsgLy8gRXZlbnRzIGNhbiBiZSByZWVudHJhbnQgKGUuZy4sIGZvY3VzKS4NCi0gICAgICBkMy5ldmVudCA9IGU7DQotICAgICAgdHJ5IHsNCi0gICAgICAgIGxpc3RlbmVyLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSk7DQotICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgIGQzLmV2ZW50ID0gbzsNCi0gICAgICB9DQotICAgIH0NCi0gIH0pOw0KLX07DQotZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaykgew0KLSAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7DQotICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOykgew0KLSAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07DQotICAgICAgaWYgKG5vZGUpIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaik7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiB0aGlzOw0KLX07DQotLy8NCi0vLyBOb3RlOiBhc3NpZ25pbmcgdG8gdGhlIGFyZ3VtZW50cyBhcnJheSBzaW11bHRhbmVvdXNseSBjaGFuZ2VzIHRoZSB2YWx1ZSBvZg0KLS8vIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IQ0KLS8vDQotLy8gVE9ETyBUaGUgYHRoaXNgIGFyZ3VtZW50IHByb2JhYmx5IHNob3VsZG4ndCBiZSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlDQotLy8gY2FsbGJhY2ssIGFueXdheSwgc2luY2UgaXQncyByZWR1bmRhbnQuIEhvd2V2ZXIsIHRoYXQgd2lsbCByZXF1aXJlIGEgbWFqb3INCi0vLyB2ZXJzaW9uIGJ1bXAgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzbyBJJ20gbm90IGNoYW5naW5nIGl0IHJpZ2h0DQotLy8gYXdheS4NCi0vLw0KLWQzX3NlbGVjdGlvblByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24oY2FsbGJhY2spIHsNCi0gIGNhbGxiYWNrLmFwcGx5KHRoaXMsIChhcmd1bWVudHNbMF0gPSB0aGlzLCBhcmd1bWVudHMpKTsNCi0gIHJldHVybiB0aGlzOw0KLX07DQotZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24oKSB7DQotICByZXR1cm4gIXRoaXMubm9kZSgpOw0KLX07DQotZDNfc2VsZWN0aW9uUHJvdG90eXBlLm5vZGUgPSBmdW5jdGlvbihjYWxsYmFjaykgew0KLSAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykgew0KLSAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQotICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsNCi0gICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybiBudWxsOw0KLX07DQotZDNfc2VsZWN0aW9uUHJvdG90eXBlLnRyYW5zaXRpb24gPSBmdW5jdGlvbigpIHsNCi0gIHZhciBzdWJncm91cHMgPSBbXSwNCi0gICAgICBzdWJncm91cCwNCi0gICAgICBub2RlOw0KLQ0KLSAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7DQotICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOw0KLSAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjspIHsNCi0gICAgICBzdWJncm91cC5wdXNoKChub2RlID0gZ3JvdXBbaV0pID8ge25vZGU6IG5vZGUsIGRlbGF5OiBkM190cmFuc2l0aW9uRGVsYXksIGR1cmF0aW9uOiBkM190cmFuc2l0aW9uRHVyYXRpb259IDogbnVsbCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgZDNfdHJhbnNpdGlvbklkIHx8ICsrZDNfdHJhbnNpdGlvbk5leHRJZCwgRGF0ZS5ub3coKSk7DQotfTsNCi12YXIgZDNfc2VsZWN0aW9uUm9vdCA9IGQzX3NlbGVjdGlvbihbW2RvY3VtZW50XV0pOw0KLQ0KLWQzX3NlbGVjdGlvblJvb3RbMF0ucGFyZW50Tm9kZSA9IGQzX3NlbGVjdFJvb3Q7DQotDQotLy8gVE9ETyBmYXN0IHNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiENCi0vLyBUT0RPIHNlbGVjdChmdW5jdGlvbikNCi1kMy5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3Rvcikgew0KLSAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyINCi0gICAgICA/IGQzX3NlbGVjdGlvblJvb3Quc2VsZWN0KHNlbGVjdG9yKQ0KLSAgICAgIDogZDNfc2VsZWN0aW9uKFtbc2VsZWN0b3JdXSk7IC8vIGFzc3VtZSBub2RlDQotfTsNCi0NCi0vLyBUT0RPIHNlbGVjdEFsbChmdW5jdGlvbikNCi1kMy5zZWxlY3RBbGwgPSBmdW5jdGlvbihzZWxlY3Rvcikgew0KLSAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyINCi0gICAgICA/IGQzX3NlbGVjdGlvblJvb3Quc2VsZWN0QWxsKHNlbGVjdG9yKQ0KLSAgICAgIDogZDNfc2VsZWN0aW9uKFtkM19hcnJheShzZWxlY3RvcildKTsgLy8gYXNzdW1lIG5vZGVbXQ0KLX07DQotZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2VudGVyKHNlbGVjdGlvbikgew0KLSAgZDNfYXJyYXlTdWJjbGFzcyhzZWxlY3Rpb24sIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZSk7DQotICByZXR1cm4gc2VsZWN0aW9uOw0KLX0NCi0NCi12YXIgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlID0gW107DQotDQotZDMuc2VsZWN0aW9uLmVudGVyID0gZDNfc2VsZWN0aW9uX2VudGVyOw0KLWQzLnNlbGVjdGlvbi5lbnRlci5wcm90b3R5cGUgPSBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGU7DQotDQotZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLmFwcGVuZCA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5hcHBlbmQ7DQotZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLmluc2VydCA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5pbnNlcnQ7DQotZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLmVtcHR5ID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVtcHR5Ow0KLWQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5ub2RlID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLm5vZGU7DQotZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQotICB2YXIgc3ViZ3JvdXBzID0gW10sDQotICAgICAgc3ViZ3JvdXAsDQotICAgICAgc3Vibm9kZSwNCi0gICAgICB1cGdyb3VwLA0KLSAgICAgIGdyb3VwLA0KLSAgICAgIG5vZGU7DQotDQotICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTspIHsNCi0gICAgdXBncm91cCA9IChncm91cCA9IHRoaXNbal0pLnVwZGF0ZTsNCi0gICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7DQotICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSBncm91cC5wYXJlbnROb2RlOw0KLSAgICBmb3IgKHZhciBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7DQotICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgew0KLSAgICAgICAgc3ViZ3JvdXAucHVzaCh1cGdyb3VwW2ldID0gc3Vibm9kZSA9IHNlbGVjdG9yLmNhbGwoZ3JvdXAucGFyZW50Tm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpOw0KLSAgICAgICAgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIHN1Ymdyb3VwLnB1c2gobnVsbCk7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7DQotfTsNCi1mdW5jdGlvbiBkM190cmFuc2l0aW9uKGdyb3VwcywgaWQsIHRpbWUpIHsNCi0gIGQzX2FycmF5U3ViY2xhc3MoZ3JvdXBzLCBkM190cmFuc2l0aW9uUHJvdG90eXBlKTsNCi0NCi0gIHZhciB0d2VlbnMgPSBuZXcgZDNfTWFwLA0KLSAgICAgIGV2ZW50ID0gZDMuZGlzcGF0Y2goInN0YXJ0IiwgImVuZCIpLA0KLSAgICAgIGVhc2UgPSBkM190cmFuc2l0aW9uRWFzZTsNCi0NCi0gIGdyb3Vwcy5pZCA9IGlkOw0KLQ0KLSAgZ3JvdXBzLnRpbWUgPSB0aW1lOw0KLQ0KLSAgZ3JvdXBzLnR3ZWVuID0gZnVuY3Rpb24obmFtZSwgdHdlZW4pIHsNCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gdHdlZW5zLmdldChuYW1lKTsNCi0gICAgaWYgKHR3ZWVuID09IG51bGwpIHR3ZWVucy5yZW1vdmUobmFtZSk7DQotICAgIGVsc2UgdHdlZW5zLnNldChuYW1lLCB0d2Vlbik7DQotICAgIHJldHVybiBncm91cHM7DQotICB9Ow0KLQ0KLSAgZ3JvdXBzLmVhc2UgPSBmdW5jdGlvbih2YWx1ZSkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBlYXNlOw0KLSAgICBlYXNlID0gdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdmFsdWUgOiBkMy5lYXNlLmFwcGx5KGQzLCBhcmd1bWVudHMpOw0KLSAgICByZXR1cm4gZ3JvdXBzOw0KLSAgfTsNCi0NCi0gIGdyb3Vwcy5lYWNoID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHsNCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gZDNfdHJhbnNpdGlvbl9lYWNoLmNhbGwoZ3JvdXBzLCB0eXBlKTsNCi0gICAgZXZlbnQub24odHlwZSwgbGlzdGVuZXIpOw0KLSAgICByZXR1cm4gZ3JvdXBzOw0KLSAgfTsNCi0NCi0gIGQzLnRpbWVyKGZ1bmN0aW9uKGVsYXBzZWQpIHsNCi0gICAgZ3JvdXBzLmVhY2goZnVuY3Rpb24oZCwgaSwgaikgew0KLSAgICAgIHZhciB0d2VlbmVkID0gW10sDQotICAgICAgICAgIG5vZGUgPSB0aGlzLA0KLSAgICAgICAgICBkZWxheSA9IGdyb3Vwc1tqXVtpXS5kZWxheSwNCi0gICAgICAgICAgZHVyYXRpb24gPSBncm91cHNbal1baV0uZHVyYXRpb24sDQotICAgICAgICAgIGxvY2sgPSBub2RlLl9fdHJhbnNpdGlvbl9fIHx8IChub2RlLl9fdHJhbnNpdGlvbl9fID0ge2FjdGl2ZTogMCwgY291bnQ6IDB9KTsNCi0NCi0gICAgICArK2xvY2suY291bnQ7DQotDQotICAgICAgZGVsYXkgPD0gZWxhcHNlZCA/IHN0YXJ0KGVsYXBzZWQpIDogZDMudGltZXIoc3RhcnQsIGRlbGF5LCB0aW1lKTsNCi0NCi0gICAgICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7DQotICAgICAgICBpZiAobG9jay5hY3RpdmUgPiBpZCkgcmV0dXJuIHN0b3AoKTsNCi0gICAgICAgIGxvY2suYWN0aXZlID0gaWQ7DQotDQotICAgICAgICB0d2VlbnMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7DQotICAgICAgICAgIGlmICh0d2VlbiA9IHZhbHVlLmNhbGwobm9kZSwgZCwgaSkpIHsNCi0gICAgICAgICAgICB0d2VlbmVkLnB1c2godHdlZW4pOw0KLSAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIGV2ZW50LnN0YXJ0LmNhbGwobm9kZSwgZCwgaSk7DQotICAgICAgICBpZiAoIXRpY2soZWxhcHNlZCkpIGQzLnRpbWVyKHRpY2ssIDAsIHRpbWUpOw0KLSAgICAgICAgcmV0dXJuIDE7DQotICAgICAgfQ0KLQ0KLSAgICAgIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkgew0KLSAgICAgICAgaWYgKGxvY2suYWN0aXZlICE9PSBpZCkgcmV0dXJuIHN0b3AoKTsNCi0NCi0gICAgICAgIHZhciB0ID0gKGVsYXBzZWQgLSBkZWxheSkgLyBkdXJhdGlvbiwNCi0gICAgICAgICAgICBlID0gZWFzZSh0KSwNCi0gICAgICAgICAgICBuID0gdHdlZW5lZC5sZW5ndGg7DQotDQotICAgICAgICB3aGlsZSAobiA+IDApIHsNCi0gICAgICAgICAgdHdlZW5lZFstLW5dLmNhbGwobm9kZSwgZSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodCA+PSAxKSB7DQotICAgICAgICAgIHN0b3AoKTsNCi0gICAgICAgICAgZDNfdHJhbnNpdGlvbklkID0gaWQ7DQotICAgICAgICAgIGV2ZW50LmVuZC5jYWxsKG5vZGUsIGQsIGkpOw0KLSAgICAgICAgICBkM190cmFuc2l0aW9uSWQgPSAwOw0KLSAgICAgICAgICByZXR1cm4gMTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotICAgICAgZnVuY3Rpb24gc3RvcCgpIHsNCi0gICAgICAgIGlmICghLS1sb2NrLmNvdW50KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb25fXzsNCi0gICAgICAgIHJldHVybiAxOw0KLSAgICAgIH0NCi0gICAgfSk7DQotICAgIHJldHVybiAxOw0KLSAgfSwgMCwgdGltZSk7DQotDQotICByZXR1cm4gZ3JvdXBzOw0KLX0NCi0NCi12YXIgZDNfdHJhbnNpdGlvblJlbW92ZSA9IHt9Ow0KLQ0KLWZ1bmN0aW9uIGQzX3RyYW5zaXRpb25OdWxsKGQsIGksIGEpIHsNCi0gIHJldHVybiBhICE9ICIiICYmIGQzX3RyYW5zaXRpb25SZW1vdmU7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3RyYW5zaXRpb25Ud2VlbihuYW1lLCBiKSB7DQotICB2YXIgaW50ZXJwb2xhdGUgPSBkM19pbnRlcnBvbGF0ZUJ5TmFtZShuYW1lKTsNCi0NCi0gIGZ1bmN0aW9uIHRyYW5zaXRpb25GdW5jdGlvbihkLCBpLCBhKSB7DQotICAgIHZhciB2ID0gYi5jYWxsKHRoaXMsIGQsIGkpOw0KLSAgICByZXR1cm4gdiA9PSBudWxsDQotICAgICAgICA/IGEgIT0gIiIgJiYgZDNfdHJhbnNpdGlvblJlbW92ZQ0KLSAgICAgICAgOiBhICE9IHYgJiYgaW50ZXJwb2xhdGUoYSwgdik7DQotICB9DQotDQotICBmdW5jdGlvbiB0cmFuc2l0aW9uU3RyaW5nKGQsIGksIGEpIHsNCi0gICAgcmV0dXJuIGEgIT0gYiAmJiBpbnRlcnBvbGF0ZShhLCBiKTsNCi0gIH0NCi0NCi0gIHJldHVybiB0eXBlb2YgYiA9PT0gImZ1bmN0aW9uIiA/IHRyYW5zaXRpb25GdW5jdGlvbg0KLSAgICAgIDogYiA9PSBudWxsID8gZDNfdHJhbnNpdGlvbk51bGwNCi0gICAgICA6IChiICs9ICIiLCB0cmFuc2l0aW9uU3RyaW5nKTsNCi19DQotDQotdmFyIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUgPSBbXSwNCi0gICAgZDNfdHJhbnNpdGlvbk5leHRJZCA9IDAsDQotICAgIGQzX3RyYW5zaXRpb25JZCA9IDAsDQotICAgIGQzX3RyYW5zaXRpb25EZWZhdWx0RGVsYXkgPSAwLA0KLSAgICBkM190cmFuc2l0aW9uRGVmYXVsdER1cmF0aW9uID0gMjUwLA0KLSAgICBkM190cmFuc2l0aW9uRGVmYXVsdEVhc2UgPSBkMy5lYXNlKCJjdWJpYy1pbi1vdXQiKSwNCi0gICAgZDNfdHJhbnNpdGlvbkRlbGF5ID0gZDNfdHJhbnNpdGlvbkRlZmF1bHREZWxheSwNCi0gICAgZDNfdHJhbnNpdGlvbkR1cmF0aW9uID0gZDNfdHJhbnNpdGlvbkRlZmF1bHREdXJhdGlvbiwNCi0gICAgZDNfdHJhbnNpdGlvbkVhc2UgPSBkM190cmFuc2l0aW9uRGVmYXVsdEVhc2U7DQotDQotZDNfdHJhbnNpdGlvblByb3RvdHlwZS5jYWxsID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmNhbGw7DQotDQotZDMudHJhbnNpdGlvbiA9IGZ1bmN0aW9uKHNlbGVjdGlvbikgew0KLSAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgNCi0gICAgICA/IChkM190cmFuc2l0aW9uSWQgPyBzZWxlY3Rpb24udHJhbnNpdGlvbigpIDogc2VsZWN0aW9uKQ0KLSAgICAgIDogZDNfc2VsZWN0aW9uUm9vdC50cmFuc2l0aW9uKCk7DQotfTsNCi0NCi1kMy50cmFuc2l0aW9uLnByb3RvdHlwZSA9IGQzX3RyYW5zaXRpb25Qcm90b3R5cGU7DQotZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3Rvcikgew0KLSAgdmFyIHN1Ymdyb3VwcyA9IFtdLA0KLSAgICAgIHN1Ymdyb3VwLA0KLSAgICAgIHN1Ym5vZGUsDQotICAgICAgbm9kZTsNCi0NCi0gIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICJmdW5jdGlvbiIpIHNlbGVjdG9yID0gZDNfc2VsZWN0aW9uX3NlbGVjdG9yKHNlbGVjdG9yKTsNCi0NCi0gIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgew0KLSAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTsNCi0gICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7DQotICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0b3IuY2FsbChub2RlLm5vZGUsIG5vZGUubm9kZS5fX2RhdGFfXywgaSkpKSB7DQotICAgICAgICBpZiAoIl9fZGF0YV9fIiBpbiBub2RlLm5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLm5vZGUuX19kYXRhX187DQotICAgICAgICBzdWJncm91cC5wdXNoKHtub2RlOiBzdWJub2RlLCBkZWxheTogbm9kZS5kZWxheSwgZHVyYXRpb246IG5vZGUuZHVyYXRpb259KTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5pZCwgdGhpcy50aW1lKS5lYXNlKHRoaXMuZWFzZSgpKTsNCi19Ow0KLWQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsNCi0gIHZhciBzdWJncm91cHMgPSBbXSwNCi0gICAgICBzdWJncm91cCwNCi0gICAgICBzdWJub2RlcywNCi0gICAgICBub2RlOw0KLQ0KLSAgaWYgKHR5cGVvZiBzZWxlY3RvciAhPT0gImZ1bmN0aW9uIikgc2VsZWN0b3IgPSBkM19zZWxlY3Rpb25fc2VsZWN0b3JBbGwoc2VsZWN0b3IpOw0KLQ0KLSAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7DQotICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOykgew0KLSAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsNCi0gICAgICAgIHN1Ym5vZGVzID0gc2VsZWN0b3IuY2FsbChub2RlLm5vZGUsIG5vZGUubm9kZS5fX2RhdGFfXywgaSk7DQotICAgICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTsNCi0gICAgICAgIGZvciAodmFyIGsgPSAtMSwgbyA9IHN1Ym5vZGVzLmxlbmd0aDsgKytrIDwgbzspIHsNCi0gICAgICAgICAgc3ViZ3JvdXAucHVzaCh7bm9kZTogc3Vibm9kZXNba10sIGRlbGF5OiBub2RlLmRlbGF5LCBkdXJhdGlvbjogbm9kZS5kdXJhdGlvbn0pOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLmlkLCB0aGlzLnRpbWUpLmVhc2UodGhpcy5lYXNlKCkpOw0KLX07DQotZDNfdHJhbnNpdGlvblByb3RvdHlwZS5hdHRyID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsNCi0gIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCBkM190cmFuc2l0aW9uVHdlZW4obmFtZSwgdmFsdWUpKTsNCi19Ow0KLQ0KLWQzX3RyYW5zaXRpb25Qcm90b3R5cGUuYXR0clR3ZWVuID0gZnVuY3Rpb24obmFtZU5TLCB0d2Vlbikgew0KLSAgdmFyIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWVOUyk7DQotDQotICBmdW5jdGlvbiBhdHRyVHdlZW4oZCwgaSkgew0KLSAgICB2YXIgZiA9IHR3ZWVuLmNhbGwodGhpcywgZCwgaSwgdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSkpOw0KLSAgICByZXR1cm4gZiA9PT0gZDNfdHJhbnNpdGlvblJlbW92ZQ0KLSAgICAgICAgPyAodGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSksIG51bGwpDQotICAgICAgICA6IGYgJiYgZnVuY3Rpb24odCkgeyB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBmKHQpKTsgfTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGQsIGkpIHsNCi0gICAgdmFyIGYgPSB0d2Vlbi5jYWxsKHRoaXMsIGQsIGksIHRoaXMuZ2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCkpOw0KLSAgICByZXR1cm4gZiA9PT0gZDNfdHJhbnNpdGlvblJlbW92ZQ0KLSAgICAgICAgPyAodGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSwgbnVsbCkNCi0gICAgICAgIDogZiAmJiBmdW5jdGlvbih0KSB7IHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgZih0KSk7IH07DQotICB9DQotDQotICByZXR1cm4gdGhpcy50d2VlbigiYXR0ci4iICsgbmFtZU5TLCBuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pOw0KLX07DQotZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zdHlsZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgew0KLSAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBwcmlvcml0eSA9ICIiOw0KLSAgcmV0dXJuIHRoaXMuc3R5bGVUd2VlbihuYW1lLCBkM190cmFuc2l0aW9uVHdlZW4obmFtZSwgdmFsdWUpLCBwcmlvcml0eSk7DQotfTsNCi0NCi1kM190cmFuc2l0aW9uUHJvdG90eXBlLnN0eWxlVHdlZW4gPSBmdW5jdGlvbihuYW1lLCB0d2VlbiwgcHJpb3JpdHkpIHsNCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgcHJpb3JpdHkgPSAiIjsNCi0gIHJldHVybiB0aGlzLnR3ZWVuKCJzdHlsZS4iICsgbmFtZSwgZnVuY3Rpb24oZCwgaSkgew0KLSAgICB2YXIgZiA9IHR3ZWVuLmNhbGwodGhpcywgZCwgaSwgd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcywgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSk7DQotICAgIHJldHVybiBmID09PSBkM190cmFuc2l0aW9uUmVtb3ZlDQotICAgICAgICA/ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBudWxsKQ0KLSAgICAgICAgOiBmICYmIGZ1bmN0aW9uKHQpIHsgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBmKHQpLCBwcmlvcml0eSk7IH07DQotICB9KTsNCi19Ow0KLWQzX3RyYW5zaXRpb25Qcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7DQotICByZXR1cm4gdGhpcy50d2VlbigidGV4dCIsIGZ1bmN0aW9uKGQsIGkpIHsNCi0gICAgdGhpcy50ZXh0Q29udGVudCA9IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KLSAgICAgICAgPyB2YWx1ZS5jYWxsKHRoaXMsIGQsIGkpDQotICAgICAgICA6IHZhbHVlOw0KLSAgfSk7DQotfTsNCi1kM190cmFuc2l0aW9uUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkgew0KLSAgcmV0dXJuIHRoaXMuZWFjaCgiZW5kLnRyYW5zaXRpb24iLCBmdW5jdGlvbigpIHsNCi0gICAgdmFyIHA7DQotICAgIGlmICghdGhpcy5fX3RyYW5zaXRpb25fXyAmJiAocCA9IHRoaXMucGFyZW50Tm9kZSkpIHAucmVtb3ZlQ2hpbGQodGhpcyk7DQotICB9KTsNCi19Ow0KLWQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbih2YWx1ZSkgew0KLSAgdmFyIGdyb3VwcyA9IHRoaXM7DQotICByZXR1cm4gZ3JvdXBzLmVhY2godHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iDQotICAgICAgPyBmdW5jdGlvbihkLCBpLCBqKSB7IGdyb3Vwc1tqXVtpXS5kZWxheSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfCAwOyB9DQotICAgICAgOiAodmFsdWUgPSB2YWx1ZSB8IDAsIGZ1bmN0aW9uKGQsIGksIGopIHsgZ3JvdXBzW2pdW2ldLmRlbGF5ID0gdmFsdWU7IH0pKTsNCi19Ow0KLWQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZHVyYXRpb24gPSBmdW5jdGlvbih2YWx1ZSkgew0KLSAgdmFyIGdyb3VwcyA9IHRoaXM7DQotICByZXR1cm4gZ3JvdXBzLmVhY2godHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iDQotICAgICAgPyBmdW5jdGlvbihkLCBpLCBqKSB7IGdyb3Vwc1tqXVtpXS5kdXJhdGlvbiA9IE1hdGgubWF4KDEsIHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfCAwKTsgfQ0KLSAgICAgIDogKHZhbHVlID0gTWF0aC5tYXgoMSwgdmFsdWUgfCAwKSwgZnVuY3Rpb24oZCwgaSwgaikgeyBncm91cHNbal1baV0uZHVyYXRpb24gPSB2YWx1ZTsgfSkpOw0KLX07DQotZnVuY3Rpb24gZDNfdHJhbnNpdGlvbl9lYWNoKGNhbGxiYWNrKSB7DQotICB2YXIgaWQgPSBkM190cmFuc2l0aW9uSWQsDQotICAgICAgZWFzZSA9IGQzX3RyYW5zaXRpb25FYXNlLA0KLSAgICAgIGRlbGF5ID0gZDNfdHJhbnNpdGlvbkRlbGF5LA0KLSAgICAgIGR1cmF0aW9uID0gZDNfdHJhbnNpdGlvbkR1cmF0aW9uOw0KLQ0KLSAgZDNfdHJhbnNpdGlvbklkID0gdGhpcy5pZDsNCi0gIGQzX3RyYW5zaXRpb25FYXNlID0gdGhpcy5lYXNlKCk7DQotICBmb3IgKHZhciBqID0gMCwgbSA9IHRoaXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7DQotICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCi0gICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldOw0KLSAgICAgIGlmIChub2RlKSB7DQotICAgICAgICBkM190cmFuc2l0aW9uRGVsYXkgPSB0aGlzW2pdW2ldLmRlbGF5Ow0KLSAgICAgICAgZDNfdHJhbnNpdGlvbkR1cmF0aW9uID0gdGhpc1tqXVtpXS5kdXJhdGlvbjsNCi0gICAgICAgIGNhbGxiYWNrLmNhbGwobm9kZSA9IG5vZGUubm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaik7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotDQotICBkM190cmFuc2l0aW9uSWQgPSBpZDsNCi0gIGQzX3RyYW5zaXRpb25FYXNlID0gZWFzZTsNCi0gIGQzX3RyYW5zaXRpb25EZWxheSA9IGRlbGF5Ow0KLSAgZDNfdHJhbnNpdGlvbkR1cmF0aW9uID0gZHVyYXRpb247DQotICByZXR1cm4gdGhpczsNCi19DQotZDNfdHJhbnNpdGlvblByb3RvdHlwZS50cmFuc2l0aW9uID0gZnVuY3Rpb24oKSB7DQotICByZXR1cm4gdGhpcy5zZWxlY3QoZDNfdGhpcyk7DQotfTsNCi12YXIgZDNfdGltZXJfcXVldWUgPSBudWxsLA0KLSAgICBkM190aW1lcl9pbnRlcnZhbCwgLy8gaXMgYW4gaW50ZXJ2YWwgKG9yIGZyYW1lKSBhY3RpdmU/DQotICAgIGQzX3RpbWVyX3RpbWVvdXQ7IC8vIGlzIGEgdGltZW91dCBhY3RpdmU/DQotDQotLy8gVGhlIHRpbWVyIHdpbGwgY29udGludWUgdG8gZmlyZSB1bnRpbCBjYWxsYmFjayByZXR1cm5zIHRydWUuDQotZDMudGltZXIgPSBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRoZW4pIHsNCi0gIHZhciBmb3VuZCA9IGZhbHNlLA0KLSAgICAgIHQwLA0KLSAgICAgIHQxID0gZDNfdGltZXJfcXVldWU7DQotDQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHsNCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBkZWxheSA9IDA7DQotICAgIGVsc2UgaWYgKCFpc0Zpbml0ZShkZWxheSkpIHJldHVybjsNCi0gICAgdGhlbiA9IERhdGUubm93KCk7DQotICB9DQotDQotICAvLyBTZWUgaWYgdGhlIGNhbGxiYWNrJ3MgYWxyZWFkeSBpbiB0aGUgcXVldWUuDQotICB3aGlsZSAodDEpIHsNCi0gICAgaWYgKHQxLmNhbGxiYWNrID09PSBjYWxsYmFjaykgew0KLSAgICAgIHQxLnRoZW4gPSB0aGVuOw0KLSAgICAgIHQxLmRlbGF5ID0gZGVsYXk7DQotICAgICAgZm91bmQgPSB0cnVlOw0KLSAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHQwID0gdDE7DQotICAgIHQxID0gdDEubmV4dDsNCi0gIH0NCi0NCi0gIC8vIE90aGVyd2lzZSwgYWRkIHRoZSBjYWxsYmFjayB0byB0aGUgcXVldWUuDQotICBpZiAoIWZvdW5kKSBkM190aW1lcl9xdWV1ZSA9IHsNCi0gICAgY2FsbGJhY2s6IGNhbGxiYWNrLA0KLSAgICB0aGVuOiB0aGVuLA0KLSAgICBkZWxheTogZGVsYXksDQotICAgIG5leHQ6IGQzX3RpbWVyX3F1ZXVlDQotICB9Ow0KLQ0KLSAgLy8gU3RhcnQgYW5pbWF0aW4nIQ0KLSAgaWYgKCFkM190aW1lcl9pbnRlcnZhbCkgew0KLSAgICBkM190aW1lcl90aW1lb3V0ID0gY2xlYXJUaW1lb3V0KGQzX3RpbWVyX3RpbWVvdXQpOw0KLSAgICBkM190aW1lcl9pbnRlcnZhbCA9IDE7DQotICAgIGQzX3RpbWVyX2ZyYW1lKGQzX3RpbWVyX3N0ZXApOw0KLSAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBkM190aW1lcl9zdGVwKCkgew0KLSAgdmFyIGVsYXBzZWQsDQotICAgICAgbm93ID0gRGF0ZS5ub3coKSwNCi0gICAgICB0MSA9IGQzX3RpbWVyX3F1ZXVlOw0KLQ0KLSAgd2hpbGUgKHQxKSB7DQotICAgIGVsYXBzZWQgPSBub3cgLSB0MS50aGVuOw0KLSAgICBpZiAoZWxhcHNlZCA+PSB0MS5kZWxheSkgdDEuZmx1c2ggPSB0MS5jYWxsYmFjayhlbGFwc2VkKTsNCi0gICAgdDEgPSB0MS5uZXh0Ow0KLSAgfQ0KLQ0KLSAgdmFyIGRlbGF5ID0gZDNfdGltZXJfZmx1c2goKSAtIG5vdzsNCi0gIGlmIChkZWxheSA+IDI0KSB7DQotICAgIGlmIChpc0Zpbml0ZShkZWxheSkpIHsNCi0gICAgICBjbGVhclRpbWVvdXQoZDNfdGltZXJfdGltZW91dCk7DQotICAgICAgZDNfdGltZXJfdGltZW91dCA9IHNldFRpbWVvdXQoZDNfdGltZXJfc3RlcCwgZGVsYXkpOw0KLSAgICB9DQotICAgIGQzX3RpbWVyX2ludGVydmFsID0gMDsNCi0gIH0gZWxzZSB7DQotICAgIGQzX3RpbWVyX2ludGVydmFsID0gMTsNCi0gICAgZDNfdGltZXJfZnJhbWUoZDNfdGltZXJfc3RlcCk7DQotICB9DQotfQ0KLQ0KLWQzLnRpbWVyLmZsdXNoID0gZnVuY3Rpb24oKSB7DQotICB2YXIgZWxhcHNlZCwNCi0gICAgICBub3cgPSBEYXRlLm5vdygpLA0KLSAgICAgIHQxID0gZDNfdGltZXJfcXVldWU7DQotDQotICB3aGlsZSAodDEpIHsNCi0gICAgZWxhcHNlZCA9IG5vdyAtIHQxLnRoZW47DQotICAgIGlmICghdDEuZGVsYXkpIHQxLmZsdXNoID0gdDEuY2FsbGJhY2soZWxhcHNlZCk7DQotICAgIHQxID0gdDEubmV4dDsNCi0gIH0NCi0NCi0gIGQzX3RpbWVyX2ZsdXNoKCk7DQotfTsNCi0NCi0vLyBGbHVzaCBhZnRlciBjYWxsYmFja3MsIHRvIGF2b2lkIGNvbmN1cnJlbnQgcXVldWUgbW9kaWZpY2F0aW9uLg0KLWZ1bmN0aW9uIGQzX3RpbWVyX2ZsdXNoKCkgew0KLSAgdmFyIHQwID0gbnVsbCwNCi0gICAgICB0MSA9IGQzX3RpbWVyX3F1ZXVlLA0KLSAgICAgIHRoZW4gPSBJbmZpbml0eTsNCi0gIHdoaWxlICh0MSkgew0KLSAgICBpZiAodDEuZmx1c2gpIHsNCi0gICAgICB0MSA9IHQwID8gdDAubmV4dCA9IHQxLm5leHQgOiBkM190aW1lcl9xdWV1ZSA9IHQxLm5leHQ7DQotICAgIH0gZWxzZSB7DQotICAgICAgdGhlbiA9IE1hdGgubWluKHRoZW4sIHQxLnRoZW4gKyB0MS5kZWxheSk7DQotICAgICAgdDEgPSAodDAgPSB0MSkubmV4dDsNCi0gICAgfQ0KLSAgfQ0KLSAgcmV0dXJuIHRoZW47DQotfQ0KLQ0KLXZhciBkM190aW1lcl9mcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUNCi0gICAgfHwgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZQ0KLSAgICB8fCB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lDQotICAgIHx8IHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lDQotICAgIHx8IHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZQ0KLSAgICB8fCBmdW5jdGlvbihjYWxsYmFjaykgeyBzZXRUaW1lb3V0KGNhbGxiYWNrLCAxNyk7IH07DQotZDMudHJhbnNmb3JtID0gZnVuY3Rpb24oc3RyaW5nKSB7DQotICB2YXIgZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkMy5ucy5wcmVmaXguc3ZnLCAiZyIpLA0KLSAgICAgIGlkZW50aXR5ID0ge2E6IDEsIGI6IDAsIGM6IDAsIGQ6IDEsIGU6IDAsIGY6IDB9Ow0KLSAgcmV0dXJuIChkMy50cmFuc2Zvcm0gPSBmdW5jdGlvbihzdHJpbmcpIHsNCi0gICAgZy5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsIHN0cmluZyk7DQotICAgIHZhciB0ID0gZy50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpOw0KLSAgICByZXR1cm4gbmV3IGQzX3RyYW5zZm9ybSh0ID8gdC5tYXRyaXggOiBpZGVudGl0eSk7DQotICB9KShzdHJpbmcpOw0KLX07DQotDQotLy8gQ29tcHV0ZSB4LXNjYWxlIGFuZCBub3JtYWxpemUgdGhlIGZpcnN0IHJvdy4NCi0vLyBDb21wdXRlIHNoZWFyIGFuZCBtYWtlIHNlY29uZCByb3cgb3J0aG9nb25hbCB0byBmaXJzdC4NCi0vLyBDb21wdXRlIHktc2NhbGUgYW5kIG5vcm1hbGl6ZSB0aGUgc2Vjb25kIHJvdy4NCi0vLyBGaW5hbGx5LCBjb21wdXRlIHRoZSByb3RhdGlvbi4NCi1mdW5jdGlvbiBkM190cmFuc2Zvcm0obSkgew0KLSAgdmFyIHIwID0gW20uYSwgbS5iXSwNCi0gICAgICByMSA9IFttLmMsIG0uZF0sDQotICAgICAga3ggPSBkM190cmFuc2Zvcm1Ob3JtYWxpemUocjApLA0KLSAgICAgIGt6ID0gZDNfdHJhbnNmb3JtRG90KHIwLCByMSksDQotICAgICAga3kgPSBkM190cmFuc2Zvcm1Ob3JtYWxpemUoZDNfdHJhbnNmb3JtQ29tYmluZShyMSwgcjAsIC1reikpIHx8IDA7DQotICBpZiAocjBbMF0gKiByMVsxXSA8IHIxWzBdICogcjBbMV0pIHsNCi0gICAgcjBbMF0gKj0gLTE7DQotICAgIHIwWzFdICo9IC0xOw0KLSAgICBreCAqPSAtMTsNCi0gICAga3ogKj0gLTE7DQotICB9DQotICB0aGlzLnJvdGF0ZSA9IChreCA/IE1hdGguYXRhbjIocjBbMV0sIHIwWzBdKSA6IE1hdGguYXRhbjIoLXIxWzBdLCByMVsxXSkpICogZDNfdHJhbnNmb3JtRGVncmVlczsNCi0gIHRoaXMudHJhbnNsYXRlID0gW20uZSwgbS5mXTsNCi0gIHRoaXMuc2NhbGUgPSBba3gsIGt5XTsNCi0gIHRoaXMuc2tldyA9IGt5ID8gTWF0aC5hdGFuMihreiwga3kpICogZDNfdHJhbnNmb3JtRGVncmVlcyA6IDA7DQotfTsNCi0NCi1kM190cmFuc2Zvcm0ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQotICByZXR1cm4gInRyYW5zbGF0ZSgiICsgdGhpcy50cmFuc2xhdGUNCi0gICAgICArICIpcm90YXRlKCIgKyB0aGlzLnJvdGF0ZQ0KLSAgICAgICsgIilza2V3WCgiICsgdGhpcy5za2V3DQotICAgICAgKyAiKXNjYWxlKCIgKyB0aGlzLnNjYWxlDQotICAgICAgKyAiKSI7DQotfTsNCi0NCi1mdW5jdGlvbiBkM190cmFuc2Zvcm1Eb3QoYSwgYikgew0KLSAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV07DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3RyYW5zZm9ybU5vcm1hbGl6ZShhKSB7DQotICB2YXIgayA9IE1hdGguc3FydChkM190cmFuc2Zvcm1Eb3QoYSwgYSkpOw0KLSAgaWYgKGspIHsNCi0gICAgYVswXSAvPSBrOw0KLSAgICBhWzFdIC89IGs7DQotICB9DQotICByZXR1cm4gazsNCi19DQotDQotZnVuY3Rpb24gZDNfdHJhbnNmb3JtQ29tYmluZShhLCBiLCBrKSB7DQotICBhWzBdICs9IGsgKiBiWzBdOw0KLSAgYVsxXSArPSBrICogYlsxXTsNCi0gIHJldHVybiBhOw0KLX0NCi0NCi12YXIgZDNfdHJhbnNmb3JtRGVncmVlcyA9IDE4MCAvIE1hdGguUEk7DQotZDMubW91c2UgPSBmdW5jdGlvbihjb250YWluZXIpIHsNCi0gIHJldHVybiBkM19tb3VzZVBvaW50KGNvbnRhaW5lciwgZDNfZXZlbnRTb3VyY2UoKSk7DQotfTsNCi0NCi0vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDQwODMNCi12YXIgZDNfbW91c2VfYnVnNDQwODMgPSAvV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpID8gLTEgOiAwOw0KLQ0KLWZ1bmN0aW9uIGQzX21vdXNlUG9pbnQoY29udGFpbmVyLCBlKSB7DQotICB2YXIgc3ZnID0gY29udGFpbmVyLm93bmVyU1ZHRWxlbWVudCB8fCBjb250YWluZXI7DQotICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7DQotICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpOw0KLSAgICBpZiAoKGQzX21vdXNlX2J1ZzQ0MDgzIDwgMCkgJiYgKHdpbmRvdy5zY3JvbGxYIHx8IHdpbmRvdy5zY3JvbGxZKSkgew0KLSAgICAgIHN2ZyA9IGQzLnNlbGVjdChkb2N1bWVudC5ib2R5KQ0KLSAgICAgICAgLmFwcGVuZCgic3ZnIikNCi0gICAgICAgICAgLnN0eWxlKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpDQotICAgICAgICAgIC5zdHlsZSgidG9wIiwgMCkNCi0gICAgICAgICAgLnN0eWxlKCJsZWZ0IiwgMCk7DQotICAgICAgdmFyIGN0bSA9IHN2Z1swXVswXS5nZXRTY3JlZW5DVE0oKTsNCi0gICAgICBkM19tb3VzZV9idWc0NDA4MyA9ICEoY3RtLmYgfHwgY3RtLmUpOw0KLSAgICAgIHN2Zy5yZW1vdmUoKTsNCi0gICAgfQ0KLSAgICBpZiAoZDNfbW91c2VfYnVnNDQwODMpIHsNCi0gICAgICBwb2ludC54ID0gZS5wYWdlWDsNCi0gICAgICBwb2ludC55ID0gZS5wYWdlWTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBwb2ludC54ID0gZS5jbGllbnRYOw0KLSAgICAgIHBvaW50LnkgPSBlLmNsaWVudFk7DQotICAgIH0NCi0gICAgcG9pbnQgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0oY29udGFpbmVyLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7DQotICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07DQotICB9DQotICB2YXIgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCi0gIHJldHVybiBbZS5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gY29udGFpbmVyLmNsaWVudExlZnQsIGUuY2xpZW50WSAtIHJlY3QudG9wIC0gY29udGFpbmVyLmNsaWVudFRvcF07DQotfTsNCi1kMy50b3VjaGVzID0gZnVuY3Rpb24oY29udGFpbmVyLCB0b3VjaGVzKSB7DQotICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHRvdWNoZXMgPSBkM19ldmVudFNvdXJjZSgpLnRvdWNoZXM7DQotICByZXR1cm4gdG91Y2hlcyA/IGQzX2FycmF5KHRvdWNoZXMpLm1hcChmdW5jdGlvbih0b3VjaCkgew0KLSAgICB2YXIgcG9pbnQgPSBkM19tb3VzZVBvaW50KGNvbnRhaW5lciwgdG91Y2gpOw0KLSAgICBwb2ludC5pZGVudGlmaWVyID0gdG91Y2guaWRlbnRpZmllcjsNCi0gICAgcmV0dXJuIHBvaW50Ow0KLSAgfSkgOiBbXTsNCi19Ow0KLWZ1bmN0aW9uIGQzX25vb3AoKSB7fQ0KLWQzLnNjYWxlID0ge307DQotDQotZnVuY3Rpb24gZDNfc2NhbGVFeHRlbnQoZG9tYWluKSB7DQotICB2YXIgc3RhcnQgPSBkb21haW5bMF0sIHN0b3AgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdOw0KLSAgcmV0dXJuIHN0YXJ0IDwgc3RvcCA/IFtzdGFydCwgc3RvcF0gOiBbc3RvcCwgc3RhcnRdOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19zY2FsZVJhbmdlKHNjYWxlKSB7DQotICByZXR1cm4gc2NhbGUucmFuZ2VFeHRlbnQgPyBzY2FsZS5yYW5nZUV4dGVudCgpIDogZDNfc2NhbGVFeHRlbnQoc2NhbGUucmFuZ2UoKSk7DQotfQ0KLWZ1bmN0aW9uIGQzX3NjYWxlX25pY2UoZG9tYWluLCBuaWNlKSB7DQotICB2YXIgaTAgPSAwLA0KLSAgICAgIGkxID0gZG9tYWluLmxlbmd0aCAtIDEsDQotICAgICAgeDAgPSBkb21haW5baTBdLA0KLSAgICAgIHgxID0gZG9tYWluW2kxXSwNCi0gICAgICBkeDsNCi0NCi0gIGlmICh4MSA8IHgwKSB7DQotICAgIGR4ID0gaTA7IGkwID0gaTE7IGkxID0gZHg7DQotICAgIGR4ID0geDA7IHgwID0geDE7IHgxID0gZHg7DQotICB9DQotDQotICBpZiAoZHggPSB4MSAtIHgwKSB7DQotICAgIG5pY2UgPSBuaWNlKGR4KTsNCi0gICAgZG9tYWluW2kwXSA9IG5pY2UuZmxvb3IoeDApOw0KLSAgICBkb21haW5baTFdID0gbmljZS5jZWlsKHgxKTsNCi0gIH0NCi0NCi0gIHJldHVybiBkb21haW47DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3NjYWxlX25pY2VEZWZhdWx0KCkgew0KLSAgcmV0dXJuIE1hdGg7DQotfQ0KLWQzLnNjYWxlLmxpbmVhciA9IGZ1bmN0aW9uKCkgew0KLSAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhcihbMCwgMV0sIFswLCAxXSwgZDMuaW50ZXJwb2xhdGUsIGZhbHNlKTsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhcihkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSwgY2xhbXApIHsNCi0gIHZhciBvdXRwdXQsDQotICAgICAgaW5wdXQ7DQotDQotICBmdW5jdGlvbiByZXNjYWxlKCkgew0KLSAgICB2YXIgbGluZWFyID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKSA+IDIgPyBkM19zY2FsZV9wb2x5bGluZWFyIDogZDNfc2NhbGVfYmlsaW5lYXIsDQotICAgICAgICB1bmludGVycG9sYXRlID0gY2xhbXAgPyBkM191bmludGVycG9sYXRlQ2xhbXAgOiBkM191bmludGVycG9sYXRlTnVtYmVyOw0KLSAgICBvdXRwdXQgPSBsaW5lYXIoZG9tYWluLCByYW5nZSwgdW5pbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGUpOw0KLSAgICBpbnB1dCA9IGxpbmVhcihyYW5nZSwgZG9tYWluLCB1bmludGVycG9sYXRlLCBkMy5pbnRlcnBvbGF0ZSk7DQotICAgIHJldHVybiBzY2FsZTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNjYWxlKHgpIHsNCi0gICAgcmV0dXJuIG91dHB1dCh4KTsNCi0gIH0NCi0NCi0gIC8vIE5vdGU6IHJlcXVpcmVzIHJhbmdlIGlzIGNvZXJjaWJsZSB0byBudW1iZXIhDQotICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7DQotICAgIHJldHVybiBpbnB1dCh5KTsNCi0gIH07DQotDQotICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjsNCi0gICAgZG9tYWluID0geC5tYXAoTnVtYmVyKTsNCi0gICAgcmV0dXJuIHJlc2NhbGUoKTsNCi0gIH07DQotDQotICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7DQotICAgIHJhbmdlID0geDsNCi0gICAgcmV0dXJuIHJlc2NhbGUoKTsNCi0gIH07DQotDQotICBzY2FsZS5yYW5nZVJvdW5kID0gZnVuY3Rpb24oeCkgew0KLSAgICByZXR1cm4gc2NhbGUucmFuZ2UoeCkuaW50ZXJwb2xhdGUoZDMuaW50ZXJwb2xhdGVSb3VuZCk7DQotICB9Ow0KLQ0KLSAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNsYW1wOw0KLSAgICBjbGFtcCA9IHg7DQotICAgIHJldHVybiByZXNjYWxlKCk7DQotICB9Ow0KLQ0KLSAgc2NhbGUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGludGVycG9sYXRlOw0KLSAgICBpbnRlcnBvbGF0ZSA9IHg7DQotICAgIHJldHVybiByZXNjYWxlKCk7DQotICB9Ow0KLQ0KLSAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihtKSB7DQotICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrcyhkb21haW4sIG0pOw0KLSAgfTsNCi0NCi0gIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihtKSB7DQotICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KGRvbWFpbiwgbSk7DQotICB9Ow0KLQ0KLSAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgew0KLSAgICBkM19zY2FsZV9uaWNlKGRvbWFpbiwgZDNfc2NhbGVfbGluZWFyTmljZSk7DQotICAgIHJldHVybiByZXNjYWxlKCk7DQotICB9Ow0KLQ0KLSAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KLSAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyKGRvbWFpbiwgcmFuZ2UsIGludGVycG9sYXRlLCBjbGFtcCk7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIHJlc2NhbGUoKTsNCi19DQotDQotZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpIHsNCi0gIHJldHVybiBkMy5yZWJpbmQoc2NhbGUsIGxpbmVhciwgInJhbmdlIiwgInJhbmdlUm91bmQiLCAiaW50ZXJwb2xhdGUiLCAiY2xhbXAiKTsNCi19DQotDQotZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyTmljZShkeCkgew0KLSAgZHggPSBNYXRoLnBvdygxMCwgTWF0aC5yb3VuZChNYXRoLmxvZyhkeCkgLyBNYXRoLkxOMTApIC0gMSk7DQotICByZXR1cm4gew0KLSAgICBmbG9vcjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5mbG9vcih4IC8gZHgpICogZHg7IH0sDQotICAgIGNlaWw6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGguY2VpbCh4IC8gZHgpICogZHg7IH0NCi0gIH07DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pIHsNCi0gIHZhciBleHRlbnQgPSBkM19zY2FsZUV4dGVudChkb21haW4pLA0KLSAgICAgIHNwYW4gPSBleHRlbnRbMV0gLSBleHRlbnRbMF0sDQotICAgICAgc3RlcCA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHNwYW4gLyBtKSAvIE1hdGguTE4xMCkpLA0KLSAgICAgIGVyciA9IG0gLyBzcGFuICogc3RlcDsNCi0NCi0gIC8vIEZpbHRlciB0aWNrcyB0byBnZXQgY2xvc2VyIHRvIHRoZSBkZXNpcmVkIGNvdW50Lg0KLSAgaWYgKGVyciA8PSAuMTUpIHN0ZXAgKj0gMTA7DQotICBlbHNlIGlmIChlcnIgPD0gLjM1KSBzdGVwICo9IDU7DQotICBlbHNlIGlmIChlcnIgPD0gLjc1KSBzdGVwICo9IDI7DQotDQotICAvLyBSb3VuZCBzdGFydCBhbmQgc3RvcCB2YWx1ZXMgdG8gc3RlcCBpbnRlcnZhbC4NCi0gIGV4dGVudFswXSA9IE1hdGguY2VpbChleHRlbnRbMF0gLyBzdGVwKSAqIHN0ZXA7DQotICBleHRlbnRbMV0gPSBNYXRoLmZsb29yKGV4dGVudFsxXSAvIHN0ZXApICogc3RlcCArIHN0ZXAgKiAuNTsgLy8gaW5jbHVzaXZlDQotICBleHRlbnRbMl0gPSBzdGVwOw0KLSAgcmV0dXJuIGV4dGVudDsNCi19DQotDQotZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKSB7DQotICByZXR1cm4gZDMucmFuZ2UuYXBwbHkoZDMsIGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pKTsNCi19DQotDQotZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChkb21haW4sIG0pIHsNCi0gIHJldHVybiBkMy5mb3JtYXQoIiwuIiArIE1hdGgubWF4KDAsIC1NYXRoLmZsb29yKE1hdGgubG9nKGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pWzJdKSAvIE1hdGguTE4xMCArIC4wMSkpICsgImYiKTsNCi19DQotZnVuY3Rpb24gZDNfc2NhbGVfYmlsaW5lYXIoZG9tYWluLCByYW5nZSwgdW5pbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGUpIHsNCi0gIHZhciB1ID0gdW5pbnRlcnBvbGF0ZShkb21haW5bMF0sIGRvbWFpblsxXSksDQotICAgICAgaSA9IGludGVycG9sYXRlKHJhbmdlWzBdLCByYW5nZVsxXSk7DQotICByZXR1cm4gZnVuY3Rpb24oeCkgew0KLSAgICByZXR1cm4gaSh1KHgpKTsNCi0gIH07DQotfQ0KLWZ1bmN0aW9uIGQzX3NjYWxlX3BvbHlsaW5lYXIoZG9tYWluLCByYW5nZSwgdW5pbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGUpIHsNCi0gIHZhciB1ID0gW10sDQotICAgICAgaSA9IFtdLA0KLSAgICAgIGogPSAwLA0KLSAgICAgIGsgPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZS5sZW5ndGgpIC0gMTsNCi0NCi0gIC8vIEhhbmRsZSBkZXNjZW5kaW5nIGRvbWFpbnMuDQotICBpZiAoZG9tYWluW2tdIDwgZG9tYWluWzBdKSB7DQotICAgIGRvbWFpbiA9IGRvbWFpbi5zbGljZSgpLnJldmVyc2UoKTsNCi0gICAgcmFuZ2UgPSByYW5nZS5zbGljZSgpLnJldmVyc2UoKTsNCi0gIH0NCi0NCi0gIHdoaWxlICgrK2ogPD0gaykgew0KLSAgICB1LnB1c2godW5pbnRlcnBvbGF0ZShkb21haW5baiAtIDFdLCBkb21haW5bal0pKTsNCi0gICAgaS5wdXNoKGludGVycG9sYXRlKHJhbmdlW2ogLSAxXSwgcmFuZ2Vbal0pKTsNCi0gIH0NCi0NCi0gIHJldHVybiBmdW5jdGlvbih4KSB7DQotICAgIHZhciBqID0gZDMuYmlzZWN0KGRvbWFpbiwgeCwgMSwgaykgLSAxOw0KLSAgICByZXR1cm4gaVtqXSh1W2pdKHgpKTsNCi0gIH07DQotfQ0KLWQzLnNjYWxlLmxvZyA9IGZ1bmN0aW9uKCkgew0KLSAgcmV0dXJuIGQzX3NjYWxlX2xvZyhkMy5zY2FsZS5saW5lYXIoKSwgZDNfc2NhbGVfbG9ncCk7DQotfTsNCi0NCi1mdW5jdGlvbiBkM19zY2FsZV9sb2cobGluZWFyLCBsb2cpIHsNCi0gIHZhciBwb3cgPSBsb2cucG93Ow0KLQ0KLSAgZnVuY3Rpb24gc2NhbGUoeCkgew0KLSAgICByZXR1cm4gbGluZWFyKGxvZyh4KSk7DQotICB9DQotDQotICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih4KSB7DQotICAgIHJldHVybiBwb3cobGluZWFyLmludmVydCh4KSk7DQotICB9Ow0KLQ0KLSAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5lYXIuZG9tYWluKCkubWFwKHBvdyk7DQotICAgIGxvZyA9IHhbMF0gPCAwID8gZDNfc2NhbGVfbG9nbiA6IGQzX3NjYWxlX2xvZ3A7DQotICAgIHBvdyA9IGxvZy5wb3c7DQotICAgIGxpbmVhci5kb21haW4oeC5tYXAobG9nKSk7DQotICAgIHJldHVybiBzY2FsZTsNCi0gIH07DQotDQotICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oKSB7DQotICAgIGxpbmVhci5kb21haW4oZDNfc2NhbGVfbmljZShsaW5lYXIuZG9tYWluKCksIGQzX3NjYWxlX25pY2VEZWZhdWx0KSk7DQotICAgIHJldHVybiBzY2FsZTsNCi0gIH07DQotDQotICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKCkgew0KLSAgICB2YXIgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQobGluZWFyLmRvbWFpbigpKSwNCi0gICAgICAgIHRpY2tzID0gW107DQotICAgIGlmIChleHRlbnQuZXZlcnkoaXNGaW5pdGUpKSB7DQotICAgICAgdmFyIGkgPSBNYXRoLmZsb29yKGV4dGVudFswXSksDQotICAgICAgICAgIGogPSBNYXRoLmNlaWwoZXh0ZW50WzFdKSwNCi0gICAgICAgICAgdSA9IHBvdyhleHRlbnRbMF0pLA0KLSAgICAgICAgICB2ID0gcG93KGV4dGVudFsxXSk7DQotICAgICAgaWYgKGxvZyA9PT0gZDNfc2NhbGVfbG9nbikgew0KLSAgICAgICAgdGlja3MucHVzaChwb3coaSkpOw0KLSAgICAgICAgZm9yICg7IGkrKyA8IGo7KSBmb3IgKHZhciBrID0gOTsgayA+IDA7IGstLSkgdGlja3MucHVzaChwb3coaSkgKiBrKTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgZm9yICg7IGkgPCBqOyBpKyspIGZvciAodmFyIGsgPSAxOyBrIDwgMTA7IGsrKykgdGlja3MucHVzaChwb3coaSkgKiBrKTsNCi0gICAgICAgIHRpY2tzLnB1c2gocG93KGkpKTsNCi0gICAgICB9DQotICAgICAgZm9yIChpID0gMDsgdGlja3NbaV0gPCB1OyBpKyspIHt9IC8vIHN0cmlwIHNtYWxsIHZhbHVlcw0KLSAgICAgIGZvciAoaiA9IHRpY2tzLmxlbmd0aDsgdGlja3NbaiAtIDFdID4gdjsgai0tKSB7fSAvLyBzdHJpcCBiaWcgdmFsdWVzDQotICAgICAgdGlja3MgPSB0aWNrcy5zbGljZShpLCBqKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gdGlja3M7DQotICB9Ow0KLQ0KLSAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKG4sIGZvcm1hdCkgew0KLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIGZvcm1hdCA9IGQzX3NjYWxlX2xvZ0Zvcm1hdDsNCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gZm9ybWF0Ow0KLSAgICB2YXIgayA9IG4gLyBzY2FsZS50aWNrcygpLmxlbmd0aCwNCi0gICAgICAgIGYgPSBsb2cgPT09IGQzX3NjYWxlX2xvZ24gPyAoZSA9IC0xZS0xMiwgTWF0aC5mbG9vcikgOiAoZSA9IDFlLTEyLCBNYXRoLmNlaWwpLA0KLSAgICAgICAgZTsNCi0gICAgcmV0dXJuIGZ1bmN0aW9uKGQpIHsNCi0gICAgICByZXR1cm4gZCAvIHBvdyhmKGxvZyhkKSArIGUpKSA8IGsgPyBmb3JtYXQoZCkgOiAiIjsNCi0gICAgfTsNCi0gIH07DQotDQotICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQotICAgIHJldHVybiBkM19zY2FsZV9sb2cobGluZWFyLmNvcHkoKSwgbG9nKTsNCi0gIH07DQotDQotICByZXR1cm4gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpOw0KLX0NCi0NCi12YXIgZDNfc2NhbGVfbG9nRm9ybWF0ID0gZDMuZm9ybWF0KCIuMGUiKTsNCi0NCi1mdW5jdGlvbiBkM19zY2FsZV9sb2dwKHgpIHsNCi0gIHJldHVybiBNYXRoLmxvZyh4IDwgMCA/IDAgOiB4KSAvIE1hdGguTE4xMDsNCi19DQotDQotZnVuY3Rpb24gZDNfc2NhbGVfbG9nbih4KSB7DQotICByZXR1cm4gLU1hdGgubG9nKHggPiAwID8gMCA6IC14KSAvIE1hdGguTE4xMDsNCi19DQotDQotZDNfc2NhbGVfbG9ncC5wb3cgPSBmdW5jdGlvbih4KSB7DQotICByZXR1cm4gTWF0aC5wb3coMTAsIHgpOw0KLX07DQotDQotZDNfc2NhbGVfbG9nbi5wb3cgPSBmdW5jdGlvbih4KSB7DQotICByZXR1cm4gLU1hdGgucG93KDEwLCAteCk7DQotfTsNCi1kMy5zY2FsZS5wb3cgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiBkM19zY2FsZV9wb3coZDMuc2NhbGUubGluZWFyKCksIDEpOw0KLX07DQotDQotZnVuY3Rpb24gZDNfc2NhbGVfcG93KGxpbmVhciwgZXhwb25lbnQpIHsNCi0gIHZhciBwb3dwID0gZDNfc2NhbGVfcG93UG93KGV4cG9uZW50KSwNCi0gICAgICBwb3diID0gZDNfc2NhbGVfcG93UG93KDEgLyBleHBvbmVudCk7DQotDQotICBmdW5jdGlvbiBzY2FsZSh4KSB7DQotICAgIHJldHVybiBsaW5lYXIocG93cCh4KSk7DQotICB9DQotDQotICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih4KSB7DQotICAgIHJldHVybiBwb3diKGxpbmVhci5pbnZlcnQoeCkpOw0KLSAgfTsNCi0NCi0gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGluZWFyLmRvbWFpbigpLm1hcChwb3diKTsNCi0gICAgbGluZWFyLmRvbWFpbih4Lm1hcChwb3dwKSk7DQotICAgIHJldHVybiBzY2FsZTsNCi0gIH07DQotDQotICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKG0pIHsNCi0gICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tzKHNjYWxlLmRvbWFpbigpLCBtKTsNCi0gIH07DQotDQotICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSkgew0KLSAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChzY2FsZS5kb21haW4oKSwgbSk7DQotICB9Ow0KLQ0KLSAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgew0KLSAgICByZXR1cm4gc2NhbGUuZG9tYWluKGQzX3NjYWxlX25pY2Uoc2NhbGUuZG9tYWluKCksIGQzX3NjYWxlX2xpbmVhck5pY2UpKTsNCi0gIH07DQotDQotICBzY2FsZS5leHBvbmVudCA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZXhwb25lbnQ7DQotICAgIHZhciBkb21haW4gPSBzY2FsZS5kb21haW4oKTsNCi0gICAgcG93cCA9IGQzX3NjYWxlX3Bvd1BvdyhleHBvbmVudCA9IHgpOw0KLSAgICBwb3diID0gZDNfc2NhbGVfcG93UG93KDEgLyBleHBvbmVudCk7DQotICAgIHJldHVybiBzY2FsZS5kb21haW4oZG9tYWluKTsNCi0gIH07DQotDQotICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQotICAgIHJldHVybiBkM19zY2FsZV9wb3cobGluZWFyLmNvcHkoKSwgZXhwb25lbnQpOw0KLSAgfTsNCi0NCi0gIHJldHVybiBkM19zY2FsZV9saW5lYXJSZWJpbmQoc2NhbGUsIGxpbmVhcik7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3NjYWxlX3Bvd1BvdyhlKSB7DQotICByZXR1cm4gZnVuY3Rpb24oeCkgew0KLSAgICByZXR1cm4geCA8IDAgPyAtTWF0aC5wb3coLXgsIGUpIDogTWF0aC5wb3coeCwgZSk7DQotICB9Ow0KLX0NCi1kMy5zY2FsZS5zcXJ0ID0gZnVuY3Rpb24oKSB7DQotICByZXR1cm4gZDMuc2NhbGUucG93KCkuZXhwb25lbnQoLjUpOw0KLX07DQotZDMuc2NhbGUub3JkaW5hbCA9IGZ1bmN0aW9uKCkgew0KLSAgcmV0dXJuIGQzX3NjYWxlX29yZGluYWwoW10sIHt0OiAicmFuZ2UiLCB4OiBbXX0pOw0KLX07DQotDQotZnVuY3Rpb24gZDNfc2NhbGVfb3JkaW5hbChkb21haW4sIHJhbmdlcikgew0KLSAgdmFyIGluZGV4LA0KLSAgICAgIHJhbmdlLA0KLSAgICAgIHJhbmdlQmFuZDsNCi0NCi0gIGZ1bmN0aW9uIHNjYWxlKHgpIHsNCi0gICAgcmV0dXJuIHJhbmdlWygoaW5kZXguZ2V0KHgpIHx8IGluZGV4LnNldCh4LCBkb21haW4ucHVzaCh4KSkpIC0gMSkgJSByYW5nZS5sZW5ndGhdOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc3RlcHMoc3RhcnQsIHN0ZXApIHsNCi0gICAgcmV0dXJuIGQzLnJhbmdlKGRvbWFpbi5sZW5ndGgpLm1hcChmdW5jdGlvbihpKSB7IHJldHVybiBzdGFydCArIHN0ZXAgKiBpOyB9KTsNCi0gIH0NCi0NCi0gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluOw0KLSAgICBkb21haW4gPSBbXTsNCi0gICAgaW5kZXggPSBuZXcgZDNfTWFwOw0KLSAgICB2YXIgaSA9IC0xLCBuID0geC5sZW5ndGgsIHhpOw0KLSAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpbmRleC5oYXMoeGkgPSB4W2ldKSkgaW5kZXguc2V0KHhpLCBkb21haW4ucHVzaCh4aSkpOw0KLSAgICByZXR1cm4gc2NhbGVbcmFuZ2VyLnRdKHJhbmdlci54LCByYW5nZXIucCk7DQotICB9Ow0KLQ0KLSAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlOw0KLSAgICByYW5nZSA9IHg7DQotICAgIHJhbmdlQmFuZCA9IDA7DQotICAgIHJhbmdlciA9IHt0OiAicmFuZ2UiLCB4OiB4fTsNCi0gICAgcmV0dXJuIHNjYWxlOw0KLSAgfTsNCi0NCi0gIHNjYWxlLnJhbmdlUG9pbnRzID0gZnVuY3Rpb24oeCwgcGFkZGluZykgew0KLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHBhZGRpbmcgPSAwOw0KLSAgICB2YXIgc3RhcnQgPSB4WzBdLA0KLSAgICAgICAgc3RvcCA9IHhbMV0sDQotICAgICAgICBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyAoZG9tYWluLmxlbmd0aCAtIDEgKyBwYWRkaW5nKTsNCi0gICAgcmFuZ2UgPSBzdGVwcyhkb21haW4ubGVuZ3RoIDwgMiA/IChzdGFydCArIHN0b3ApIC8gMiA6IHN0YXJ0ICsgc3RlcCAqIHBhZGRpbmcgLyAyLCBzdGVwKTsNCi0gICAgcmFuZ2VCYW5kID0gMDsNCi0gICAgcmFuZ2VyID0ge3Q6ICJyYW5nZVBvaW50cyIsIHg6IHgsIHA6IHBhZGRpbmd9Ow0KLSAgICByZXR1cm4gc2NhbGU7DQotICB9Ow0KLQ0KLSAgc2NhbGUucmFuZ2VCYW5kcyA9IGZ1bmN0aW9uKHgsIHBhZGRpbmcpIHsNCi0gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBwYWRkaW5nID0gMDsNCi0gICAgdmFyIHJldmVyc2UgPSB4WzFdIDwgeFswXSwNCi0gICAgICAgIHN0YXJ0ID0geFtyZXZlcnNlIC0gMF0sDQotICAgICAgICBzdG9wID0geFsxIC0gcmV2ZXJzZV0sDQotICAgICAgICBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyAoZG9tYWluLmxlbmd0aCArIHBhZGRpbmcpOw0KLSAgICByYW5nZSA9IHN0ZXBzKHN0YXJ0ICsgc3RlcCAqIHBhZGRpbmcsIHN0ZXApOw0KLSAgICBpZiAocmV2ZXJzZSkgcmFuZ2UucmV2ZXJzZSgpOw0KLSAgICByYW5nZUJhbmQgPSBzdGVwICogKDEgLSBwYWRkaW5nKTsNCi0gICAgcmFuZ2VyID0ge3Q6ICJyYW5nZUJhbmRzIiwgeDogeCwgcDogcGFkZGluZ307DQotICAgIHJldHVybiBzY2FsZTsNCi0gIH07DQotDQotICBzY2FsZS5yYW5nZVJvdW5kQmFuZHMgPSBmdW5jdGlvbih4LCBwYWRkaW5nKSB7DQotICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7DQotICAgIHZhciByZXZlcnNlID0geFsxXSA8IHhbMF0sDQotICAgICAgICBzdGFydCA9IHhbcmV2ZXJzZSAtIDBdLA0KLSAgICAgICAgc3RvcCA9IHhbMSAtIHJldmVyc2VdLA0KLSAgICAgICAgc3RlcCA9IE1hdGguZmxvb3IoKHN0b3AgLSBzdGFydCkgLyAoZG9tYWluLmxlbmd0aCArIHBhZGRpbmcpKSwNCi0gICAgICAgIGVycm9yID0gc3RvcCAtIHN0YXJ0IC0gKGRvbWFpbi5sZW5ndGggLSBwYWRkaW5nKSAqIHN0ZXA7DQotICAgIHJhbmdlID0gc3RlcHMoc3RhcnQgKyBNYXRoLnJvdW5kKGVycm9yIC8gMiksIHN0ZXApOw0KLSAgICBpZiAocmV2ZXJzZSkgcmFuZ2UucmV2ZXJzZSgpOw0KLSAgICByYW5nZUJhbmQgPSBNYXRoLnJvdW5kKHN0ZXAgKiAoMSAtIHBhZGRpbmcpKTsNCi0gICAgcmFuZ2VyID0ge3Q6ICJyYW5nZVJvdW5kQmFuZHMiLCB4OiB4LCBwOiBwYWRkaW5nfTsNCi0gICAgcmV0dXJuIHNjYWxlOw0KLSAgfTsNCi0NCi0gIHNjYWxlLnJhbmdlQmFuZCA9IGZ1bmN0aW9uKCkgew0KLSAgICByZXR1cm4gcmFuZ2VCYW5kOw0KLSAgfTsNCi0NCi0gIHNjYWxlLnJhbmdlRXh0ZW50ID0gZnVuY3Rpb24oKSB7DQotICAgIHJldHVybiBkM19zY2FsZUV4dGVudChyYW5nZXIueCk7DQotICB9Ow0KLQ0KLSAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KLSAgICByZXR1cm4gZDNfc2NhbGVfb3JkaW5hbChkb21haW4sIHJhbmdlcik7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIHNjYWxlLmRvbWFpbihkb21haW4pOw0KLX0NCi0vKg0KLSAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjb2xvciBzcGVjaWZpY2F0aW9ucyBhbmQgZGVzaWducyBkZXZlbG9wZWQgYnkgQ3ludGhpYQ0KLSAqIEJyZXdlciAoaHR0cDovL2NvbG9yYnJld2VyLm9yZy8pLiBTZWUgbGliL2NvbG9yYnJld2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KLSAqLw0KLQ0KLWQzLnNjYWxlLmNhdGVnb3J5MTAgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkxMCk7DQotfTsNCi0NCi1kMy5zY2FsZS5jYXRlZ29yeTIwID0gZnVuY3Rpb24oKSB7DQotICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MjApOw0KLX07DQotDQotZDMuc2NhbGUuY2F0ZWdvcnkyMGIgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkyMGIpOw0KLX07DQotDQotZDMuc2NhbGUuY2F0ZWdvcnkyMGMgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkyMGMpOw0KLX07DQotDQotdmFyIGQzX2NhdGVnb3J5MTAgPSBbDQotICAiIzFmNzdiNCIsICIjZmY3ZjBlIiwgIiMyY2EwMmMiLCAiI2Q2MjcyOCIsICIjOTQ2N2JkIiwNCi0gICIjOGM1NjRiIiwgIiNlMzc3YzIiLCAiIzdmN2Y3ZiIsICIjYmNiZDIyIiwgIiMxN2JlY2YiDQotXTsNCi0NCi12YXIgZDNfY2F0ZWdvcnkyMCA9IFsNCi0gICIjMWY3N2I0IiwgIiNhZWM3ZTgiLA0KLSAgIiNmZjdmMGUiLCAiI2ZmYmI3OCIsDQotICAiIzJjYTAyYyIsICIjOThkZjhhIiwNCi0gICIjZDYyNzI4IiwgIiNmZjk4OTYiLA0KLSAgIiM5NDY3YmQiLCAiI2M1YjBkNSIsDQotICAiIzhjNTY0YiIsICIjYzQ5Yzk0IiwNCi0gICIjZTM3N2MyIiwgIiNmN2I2ZDIiLA0KLSAgIiM3ZjdmN2YiLCAiI2M3YzdjNyIsDQotICAiI2JjYmQyMiIsICIjZGJkYjhkIiwNCi0gICIjMTdiZWNmIiwgIiM5ZWRhZTUiDQotXTsNCi0NCi12YXIgZDNfY2F0ZWdvcnkyMGIgPSBbDQotICAiIzM5M2I3OSIsICIjNTI1NGEzIiwgIiM2YjZlY2YiLCAiIzljOWVkZSIsDQotICAiIzYzNzkzOSIsICIjOGNhMjUyIiwgIiNiNWNmNmIiLCAiI2NlZGI5YyIsDQotICAiIzhjNmQzMSIsICIjYmQ5ZTM5IiwgIiNlN2JhNTIiLCAiI2U3Y2I5NCIsDQotICAiIzg0M2MzOSIsICIjYWQ0OTRhIiwgIiNkNjYxNmIiLCAiI2U3OTY5YyIsDQotICAiIzdiNDE3MyIsICIjYTU1MTk0IiwgIiNjZTZkYmQiLCAiI2RlOWVkNiINCi1dOw0KLQ0KLXZhciBkM19jYXRlZ29yeTIwYyA9IFsNCi0gICIjMzE4MmJkIiwgIiM2YmFlZDYiLCAiIzllY2FlMSIsICIjYzZkYmVmIiwNCi0gICIjZTY1NTBkIiwgIiNmZDhkM2MiLCAiI2ZkYWU2YiIsICIjZmRkMGEyIiwNCi0gICIjMzFhMzU0IiwgIiM3NGM0NzYiLCAiI2ExZDk5YiIsICIjYzdlOWMwIiwNCi0gICIjNzU2YmIxIiwgIiM5ZTlhYzgiLCAiI2JjYmRkYyIsICIjZGFkYWViIiwNCi0gICIjNjM2MzYzIiwgIiM5Njk2OTYiLCAiI2JkYmRiZCIsICIjZDlkOWQ5Ig0KLV07DQotZDMuc2NhbGUucXVhbnRpbGUgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiBkM19zY2FsZV9xdWFudGlsZShbXSwgW10pOw0KLX07DQotDQotZnVuY3Rpb24gZDNfc2NhbGVfcXVhbnRpbGUoZG9tYWluLCByYW5nZSkgew0KLSAgdmFyIHRocmVzaG9sZHM7DQotDQotICBmdW5jdGlvbiByZXNjYWxlKCkgew0KLSAgICB2YXIgayA9IDAsDQotICAgICAgICBuID0gZG9tYWluLmxlbmd0aCwNCi0gICAgICAgIHEgPSByYW5nZS5sZW5ndGg7DQotICAgIHRocmVzaG9sZHMgPSBbXTsNCi0gICAgd2hpbGUgKCsrayA8IHEpIHRocmVzaG9sZHNbayAtIDFdID0gZDMucXVhbnRpbGUoZG9tYWluLCBrIC8gcSk7DQotICAgIHJldHVybiBzY2FsZTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHNjYWxlKHgpIHsNCi0gICAgaWYgKGlzTmFOKHggPSAreCkpIHJldHVybiBOYU47DQotICAgIHJldHVybiByYW5nZVtkMy5iaXNlY3QodGhyZXNob2xkcywgeCldOw0KLSAgfQ0KLQ0KLSAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47DQotICAgIGRvbWFpbiA9IHguZmlsdGVyKGZ1bmN0aW9uKGQpIHsgcmV0dXJuICFpc05hTihkKTsgfSkuc29ydChkMy5hc2NlbmRpbmcpOw0KLSAgICByZXR1cm4gcmVzY2FsZSgpOw0KLSAgfTsNCi0NCi0gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTsNCi0gICAgcmFuZ2UgPSB4Ow0KLSAgICByZXR1cm4gcmVzY2FsZSgpOw0KLSAgfTsNCi0NCi0gIHNjYWxlLnF1YW50aWxlcyA9IGZ1bmN0aW9uKCkgew0KLSAgICByZXR1cm4gdGhyZXNob2xkczsNCi0gIH07DQotDQotICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQotICAgIHJldHVybiBkM19zY2FsZV9xdWFudGlsZShkb21haW4sIHJhbmdlKTsgLy8gY29weSBvbiB3cml0ZSENCi0gIH07DQotDQotICByZXR1cm4gcmVzY2FsZSgpOw0KLX0NCi1kMy5zY2FsZS5xdWFudGl6ZSA9IGZ1bmN0aW9uKCkgew0KLSAgcmV0dXJuIGQzX3NjYWxlX3F1YW50aXplKDAsIDEsIFswLCAxXSk7DQotfTsNCi0NCi1mdW5jdGlvbiBkM19zY2FsZV9xdWFudGl6ZSh4MCwgeDEsIHJhbmdlKSB7DQotICB2YXIga3gsIGk7DQotDQotICBmdW5jdGlvbiBzY2FsZSh4KSB7DQotICAgIHJldHVybiByYW5nZVtNYXRoLm1heCgwLCBNYXRoLm1pbihpLCBNYXRoLmZsb29yKGt4ICogKHggLSB4MCkpKSldOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gcmVzY2FsZSgpIHsNCi0gICAga3ggPSByYW5nZS5sZW5ndGggLyAoeDEgLSB4MCk7DQotICAgIGkgPSByYW5nZS5sZW5ndGggLSAxOw0KLSAgICByZXR1cm4gc2NhbGU7DQotICB9DQotDQotICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFt4MCwgeDFdOw0KLSAgICB4MCA9ICt4WzBdOw0KLSAgICB4MSA9ICt4W3gubGVuZ3RoIC0gMV07DQotICAgIHJldHVybiByZXNjYWxlKCk7DQotICB9Ow0KLQ0KLSAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlOw0KLSAgICByYW5nZSA9IHg7DQotICAgIHJldHVybiByZXNjYWxlKCk7DQotICB9Ow0KLQ0KLSAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KLSAgICByZXR1cm4gZDNfc2NhbGVfcXVhbnRpemUoeDAsIHgxLCByYW5nZSk7IC8vIGNvcHkgb24gd3JpdGUNCi0gIH07DQotDQotICByZXR1cm4gcmVzY2FsZSgpOw0KLX0NCi1kMy5zY2FsZS5pZGVudGl0eSA9IGZ1bmN0aW9uKCkgew0KLSAgcmV0dXJuIGQzX3NjYWxlX2lkZW50aXR5KFswLCAxXSk7DQotfTsNCi0NCi1mdW5jdGlvbiBkM19zY2FsZV9pZGVudGl0eShkb21haW4pIHsNCi0NCi0gIGZ1bmN0aW9uIGlkZW50aXR5KHgpIHsgcmV0dXJuICt4OyB9DQotDQotICBpZGVudGl0eS5pbnZlcnQgPSBpZGVudGl0eTsNCi0NCi0gIGlkZW50aXR5LmRvbWFpbiA9IGlkZW50aXR5LnJhbmdlID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47DQotICAgIGRvbWFpbiA9IHgubWFwKGlkZW50aXR5KTsNCi0gICAgcmV0dXJuIGlkZW50aXR5Ow0KLSAgfTsNCi0NCi0gIGlkZW50aXR5LnRpY2tzID0gZnVuY3Rpb24obSkgew0KLSAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKTsNCi0gIH07DQotDQotICBpZGVudGl0eS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSkgew0KLSAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChkb21haW4sIG0pOw0KLSAgfTsNCi0NCi0gIGlkZW50aXR5LmNvcHkgPSBmdW5jdGlvbigpIHsNCi0gICAgcmV0dXJuIGQzX3NjYWxlX2lkZW50aXR5KGRvbWFpbik7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGlkZW50aXR5Ow0KLX0NCi1kMy5zdmcgPSB7fTsNCi1kMy5zdmcuYXJjID0gZnVuY3Rpb24oKSB7DQotICB2YXIgaW5uZXJSYWRpdXMgPSBkM19zdmdfYXJjSW5uZXJSYWRpdXMsDQotICAgICAgb3V0ZXJSYWRpdXMgPSBkM19zdmdfYXJjT3V0ZXJSYWRpdXMsDQotICAgICAgc3RhcnRBbmdsZSA9IGQzX3N2Z19hcmNTdGFydEFuZ2xlLA0KLSAgICAgIGVuZEFuZ2xlID0gZDNfc3ZnX2FyY0VuZEFuZ2xlOw0KLQ0KLSAgZnVuY3Rpb24gYXJjKCkgew0KLSAgICB2YXIgcjAgPSBpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLA0KLSAgICAgICAgcjEgPSBvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLA0KLSAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyBkM19zdmdfYXJjT2Zmc2V0LA0KLSAgICAgICAgYTEgPSBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgZDNfc3ZnX2FyY09mZnNldCwNCi0gICAgICAgIGRhID0gKGExIDwgYTAgJiYgKGRhID0gYTAsIGEwID0gYTEsIGExID0gZGEpLCBhMSAtIGEwKSwNCi0gICAgICAgIGRmID0gZGEgPCBNYXRoLlBJID8gIjAiIDogIjEiLA0KLSAgICAgICAgYzAgPSBNYXRoLmNvcyhhMCksDQotICAgICAgICBzMCA9IE1hdGguc2luKGEwKSwNCi0gICAgICAgIGMxID0gTWF0aC5jb3MoYTEpLA0KLSAgICAgICAgczEgPSBNYXRoLnNpbihhMSk7DQotICAgIHJldHVybiBkYSA+PSBkM19zdmdfYXJjTWF4DQotICAgICAgPyAocjANCi0gICAgICA/ICJNMCwiICsgcjENCi0gICAgICArICJBIiArIHIxICsgIiwiICsgcjEgKyAiIDAgMSwxIDAsIiArICgtcjEpDQotICAgICAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyByMQ0KLSAgICAgICsgIk0wLCIgKyByMA0KLSAgICAgICsgIkEiICsgcjAgKyAiLCIgKyByMCArICIgMCAxLDAgMCwiICsgKC1yMCkNCi0gICAgICArICJBIiArIHIwICsgIiwiICsgcjAgKyAiIDAgMSwwIDAsIiArIHIwDQotICAgICAgKyAiWiINCi0gICAgICA6ICJNMCwiICsgcjENCi0gICAgICArICJBIiArIHIxICsgIiwiICsgcjEgKyAiIDAgMSwxIDAsIiArICgtcjEpDQotICAgICAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyByMQ0KLSAgICAgICsgIloiKQ0KLSAgICAgIDogKHIwDQotICAgICAgPyAiTSIgKyByMSAqIGMwICsgIiwiICsgcjEgKiBzMA0KLSAgICAgICsgIkEiICsgcjEgKyAiLCIgKyByMSArICIgMCAiICsgZGYgKyAiLDEgIiArIHIxICogYzEgKyAiLCIgKyByMSAqIHMxDQotICAgICAgKyAiTCIgKyByMCAqIGMxICsgIiwiICsgcjAgKiBzMQ0KLSAgICAgICsgIkEiICsgcjAgKyAiLCIgKyByMCArICIgMCAiICsgZGYgKyAiLDAgIiArIHIwICogYzAgKyAiLCIgKyByMCAqIHMwDQotICAgICAgKyAiWiINCi0gICAgICA6ICJNIiArIHIxICogYzAgKyAiLCIgKyByMSAqIHMwDQotICAgICAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwICIgKyBkZiArICIsMSAiICsgcjEgKiBjMSArICIsIiArIHIxICogczENCi0gICAgICArICJMMCwwIg0KLSAgICAgICsgIloiKTsNCi0gIH0NCi0NCi0gIGFyYy5pbm5lclJhZGl1cyA9IGZ1bmN0aW9uKHYpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW5uZXJSYWRpdXM7DQotICAgIGlubmVyUmFkaXVzID0gZDMuZnVuY3Rvcih2KTsNCi0gICAgcmV0dXJuIGFyYzsNCi0gIH07DQotDQotICBhcmMub3V0ZXJSYWRpdXMgPSBmdW5jdGlvbih2KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG91dGVyUmFkaXVzOw0KLSAgICBvdXRlclJhZGl1cyA9IGQzLmZ1bmN0b3Iodik7DQotICAgIHJldHVybiBhcmM7DQotICB9Ow0KLQ0KLSAgYXJjLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbih2KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7DQotICAgIHN0YXJ0QW5nbGUgPSBkMy5mdW5jdG9yKHYpOw0KLSAgICByZXR1cm4gYXJjOw0KLSAgfTsNCi0NCi0gIGFyYy5lbmRBbmdsZSA9IGZ1bmN0aW9uKHYpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZW5kQW5nbGU7DQotICAgIGVuZEFuZ2xlID0gZDMuZnVuY3Rvcih2KTsNCi0gICAgcmV0dXJuIGFyYzsNCi0gIH07DQotDQotICBhcmMuY2VudHJvaWQgPSBmdW5jdGlvbigpIHsNCi0gICAgdmFyIHIgPSAoaW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKQ0KLSAgICAgICAgKyBvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIsDQotICAgICAgICBhID0gKHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKQ0KLSAgICAgICAgKyBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgKyBkM19zdmdfYXJjT2Zmc2V0Ow0KLSAgICByZXR1cm4gW01hdGguY29zKGEpICogciwgTWF0aC5zaW4oYSkgKiByXTsNCi0gIH07DQotDQotICByZXR1cm4gYXJjOw0KLX07DQotDQotdmFyIGQzX3N2Z19hcmNPZmZzZXQgPSAtTWF0aC5QSSAvIDIsDQotICAgIGQzX3N2Z19hcmNNYXggPSAyICogTWF0aC5QSSAtIDFlLTY7DQotDQotZnVuY3Rpb24gZDNfc3ZnX2FyY0lubmVyUmFkaXVzKGQpIHsNCi0gIHJldHVybiBkLmlubmVyUmFkaXVzOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19zdmdfYXJjT3V0ZXJSYWRpdXMoZCkgew0KLSAgcmV0dXJuIGQub3V0ZXJSYWRpdXM7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3N2Z19hcmNTdGFydEFuZ2xlKGQpIHsNCi0gIHJldHVybiBkLnN0YXJ0QW5nbGU7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3N2Z19hcmNFbmRBbmdsZShkKSB7DQotICByZXR1cm4gZC5lbmRBbmdsZTsNCi19DQotZnVuY3Rpb24gZDNfc3ZnX2xpbmUocHJvamVjdGlvbikgew0KLSAgdmFyIHggPSBkM19zdmdfbGluZVgsDQotICAgICAgeSA9IGQzX3N2Z19saW5lWSwNCi0gICAgICBpbnRlcnBvbGF0ZSA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9yRGVmYXVsdCwNCi0gICAgICBpbnRlcnBvbGF0b3IgPSBkM19zdmdfbGluZUludGVycG9sYXRvcnMuZ2V0KGludGVycG9sYXRlKSwNCi0gICAgICB0ZW5zaW9uID0gLjc7DQotDQotICBmdW5jdGlvbiBsaW5lKGQpIHsNCi0gICAgcmV0dXJuIGQubGVuZ3RoIDwgMSA/IG51bGwgOiAiTSIgKyBpbnRlcnBvbGF0b3IocHJvamVjdGlvbihkM19zdmdfbGluZVBvaW50cyh0aGlzLCBkLCB4LCB5KSksIHRlbnNpb24pOw0KLSAgfQ0KLQ0KLSAgbGluZS54ID0gZnVuY3Rpb24odikgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4Ow0KLSAgICB4ID0gdjsNCi0gICAgcmV0dXJuIGxpbmU7DQotICB9Ow0KLQ0KLSAgbGluZS55ID0gZnVuY3Rpb24odikgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5Ow0KLSAgICB5ID0gdjsNCi0gICAgcmV0dXJuIGxpbmU7DQotICB9Ow0KLQ0KLSAgbGluZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHYpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW50ZXJwb2xhdGU7DQotICAgIGlmICghZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmhhcyh2ICs9ICIiKSkgdiA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9yRGVmYXVsdDsNCi0gICAgaW50ZXJwb2xhdG9yID0gZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmdldChpbnRlcnBvbGF0ZSA9IHYpOw0KLSAgICByZXR1cm4gbGluZTsNCi0gIH07DQotDQotICBsaW5lLnRlbnNpb24gPSBmdW5jdGlvbih2KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRlbnNpb247DQotICAgIHRlbnNpb24gPSB2Ow0KLSAgICByZXR1cm4gbGluZTsNCi0gIH07DQotDQotICByZXR1cm4gbGluZTsNCi19DQotDQotZDMuc3ZnLmxpbmUgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiBkM19zdmdfbGluZShPYmplY3QpOw0KLX07DQotDQotLy8gQ29udmVydHMgdGhlIHNwZWNpZmllZCBhcnJheSBvZiBkYXRhIGludG8gYW4gYXJyYXkgb2YgcG9pbnRzDQotLy8gKHgteSB0dXBsZXMpLCBieSBldmFsdWF0aW5nIHRoZSBzcGVjaWZpZWQgYHhgIGFuZCBgeWAgZnVuY3Rpb25zIG9uIGVhY2gNCi0vLyBkYXRhIHBvaW50LiBUaGUgYHRoaXNgIGNvbnRleHQgb2YgdGhlIGV2YWx1YXRlZCBmdW5jdGlvbnMgaXMgdGhlIHNwZWNpZmllZA0KLS8vICJzZWxmIiBvYmplY3Q7IGVhY2ggZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBjdXJyZW50IGRhdHVtIGFuZCBpbmRleC4NCi1mdW5jdGlvbiBkM19zdmdfbGluZVBvaW50cyhzZWxmLCBkLCB4LCB5KSB7DQotICB2YXIgcG9pbnRzID0gW10sDQotICAgICAgaSA9IC0xLA0KLSAgICAgIG4gPSBkLmxlbmd0aCwNCi0gICAgICBmeCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iLA0KLSAgICAgIGZ5ID0gdHlwZW9mIHkgPT09ICJmdW5jdGlvbiIsDQotICAgICAgdmFsdWU7DQotICBpZiAoZnggJiYgZnkpIHsNCi0gICAgd2hpbGUgKCsraSA8IG4pIHBvaW50cy5wdXNoKFsNCi0gICAgICB4LmNhbGwoc2VsZiwgdmFsdWUgPSBkW2ldLCBpKSwNCi0gICAgICB5LmNhbGwoc2VsZiwgdmFsdWUsIGkpDQotICAgIF0pOw0KLSAgfSBlbHNlIGlmIChmeCkgew0KLSAgICB3aGlsZSAoKytpIDwgbikgcG9pbnRzLnB1c2goW3guY2FsbChzZWxmLCBkW2ldLCBpKSwgeV0pOw0KLSAgfSBlbHNlIGlmIChmeSkgew0KLSAgICB3aGlsZSAoKytpIDwgbikgcG9pbnRzLnB1c2goW3gsIHkuY2FsbChzZWxmLCBkW2ldLCBpKV0pOw0KLSAgfSBlbHNlIHsNCi0gICAgd2hpbGUgKCsraSA8IG4pIHBvaW50cy5wdXNoKFt4LCB5XSk7DQotICB9DQotICByZXR1cm4gcG9pbnRzOw0KLX0NCi0NCi0vLyBUaGUgZGVmYXVsdCBgeGAgcHJvcGVydHksIHdoaWNoIHJlZmVyZW5jZXMgZFswXS4NCi1mdW5jdGlvbiBkM19zdmdfbGluZVgoZCkgew0KLSAgcmV0dXJuIGRbMF07DQotfQ0KLQ0KLS8vIFRoZSBkZWZhdWx0IGB5YCBwcm9wZXJ0eSwgd2hpY2ggcmVmZXJlbmNlcyBkWzFdLg0KLWZ1bmN0aW9uIGQzX3N2Z19saW5lWShkKSB7DQotICByZXR1cm4gZFsxXTsNCi19DQotDQotdmFyIGQzX3N2Z19saW5lSW50ZXJwb2xhdG9yRGVmYXVsdCA9ICJsaW5lYXIiOw0KLQ0KLS8vIFRoZSB2YXJpb3VzIGludGVycG9sYXRvcnMgc3VwcG9ydGVkIGJ5IHRoZSBgbGluZWAgY2xhc3MuDQotdmFyIGQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycyA9IGQzLm1hcCh7DQotICAibGluZWFyIjogZDNfc3ZnX2xpbmVMaW5lYXIsDQotICAic3RlcC1iZWZvcmUiOiBkM19zdmdfbGluZVN0ZXBCZWZvcmUsDQotICAic3RlcC1hZnRlciI6IGQzX3N2Z19saW5lU3RlcEFmdGVyLA0KLSAgImJhc2lzIjogZDNfc3ZnX2xpbmVCYXNpcywNCi0gICJiYXNpcy1vcGVuIjogZDNfc3ZnX2xpbmVCYXNpc09wZW4sDQotICAiYmFzaXMtY2xvc2VkIjogZDNfc3ZnX2xpbmVCYXNpc0Nsb3NlZCwNCi0gICJidW5kbGUiOiBkM19zdmdfbGluZUJ1bmRsZSwNCi0gICJjYXJkaW5hbCI6IGQzX3N2Z19saW5lQ2FyZGluYWwsDQotICAiY2FyZGluYWwtb3BlbiI6IGQzX3N2Z19saW5lQ2FyZGluYWxPcGVuLA0KLSAgImNhcmRpbmFsLWNsb3NlZCI6IGQzX3N2Z19saW5lQ2FyZGluYWxDbG9zZWQsDQotICAibW9ub3RvbmUiOiBkM19zdmdfbGluZU1vbm90b25lDQotfSk7DQotDQotLy8gTGluZWFyIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiTCIgY29tbWFuZHMuDQotZnVuY3Rpb24gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKSB7DQotICB2YXIgaSA9IDAsDQotICAgICAgbiA9IHBvaW50cy5sZW5ndGgsDQotICAgICAgcCA9IHBvaW50c1swXSwNCi0gICAgICBwYXRoID0gW3BbMF0sICIsIiwgcFsxXV07DQotICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKCJMIiwgKHAgPSBwb2ludHNbaV0pWzBdLCAiLCIsIHBbMV0pOw0KLSAgcmV0dXJuIHBhdGguam9pbigiIik7DQotfQ0KLQ0KLS8vIFN0ZXAgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJIIiBhbmQgIlYiIGNvbW1hbmRzLg0KLWZ1bmN0aW9uIGQzX3N2Z19saW5lU3RlcEJlZm9yZShwb2ludHMpIHsNCi0gIHZhciBpID0gMCwNCi0gICAgICBuID0gcG9pbnRzLmxlbmd0aCwNCi0gICAgICBwID0gcG9pbnRzWzBdLA0KLSAgICAgIHBhdGggPSBbcFswXSwgIiwiLCBwWzFdXTsNCi0gIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2goIlYiLCAocCA9IHBvaW50c1tpXSlbMV0sICJIIiwgcFswXSk7DQotICByZXR1cm4gcGF0aC5qb2luKCIiKTsNCi19DQotDQotLy8gU3RlcCBpbnRlcnBvbGF0aW9uOyBnZW5lcmF0ZXMgIkgiIGFuZCAiViIgY29tbWFuZHMuDQotZnVuY3Rpb24gZDNfc3ZnX2xpbmVTdGVwQWZ0ZXIocG9pbnRzKSB7DQotICB2YXIgaSA9IDAsDQotICAgICAgbiA9IHBvaW50cy5sZW5ndGgsDQotICAgICAgcCA9IHBvaW50c1swXSwNCi0gICAgICBwYXRoID0gW3BbMF0sICIsIiwgcFsxXV07DQotICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKCJIIiwgKHAgPSBwb2ludHNbaV0pWzBdLCAiViIsIHBbMV0pOw0KLSAgcmV0dXJuIHBhdGguam9pbigiIik7DQotfQ0KLQ0KLS8vIE9wZW4gY2FyZGluYWwgc3BsaW5lIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiQyIgY29tbWFuZHMuDQotZnVuY3Rpb24gZDNfc3ZnX2xpbmVDYXJkaW5hbE9wZW4ocG9pbnRzLCB0ZW5zaW9uKSB7DQotICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDQNCi0gICAgICA/IGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykNCi0gICAgICA6IHBvaW50c1sxXSArIGQzX3N2Z19saW5lSGVybWl0ZShwb2ludHMuc2xpY2UoMSwgcG9pbnRzLmxlbmd0aCAtIDEpLA0KLSAgICAgICAgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikpOw0KLX0NCi0NCi0vLyBDbG9zZWQgY2FyZGluYWwgc3BsaW5lIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiQyIgY29tbWFuZHMuDQotZnVuY3Rpb24gZDNfc3ZnX2xpbmVDYXJkaW5hbENsb3NlZChwb2ludHMsIHRlbnNpb24pIHsNCi0gIHJldHVybiBwb2ludHMubGVuZ3RoIDwgMw0KLSAgICAgID8gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKQ0KLSAgICAgIDogcG9pbnRzWzBdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKChwb2ludHMucHVzaChwb2ludHNbMF0pLCBwb2ludHMpLA0KLSAgICAgICAgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKFtwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDJdXQ0KLSAgICAgICAgLmNvbmNhdChwb2ludHMsIFtwb2ludHNbMV1dKSwgdGVuc2lvbikpOw0KLX0NCi0NCi0vLyBDYXJkaW5hbCBzcGxpbmUgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJDIiBjb21tYW5kcy4NCi1mdW5jdGlvbiBkM19zdmdfbGluZUNhcmRpbmFsKHBvaW50cywgdGVuc2lvbiwgY2xvc2VkKSB7DQotICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDMNCi0gICAgICA/IGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykNCi0gICAgICA6IHBvaW50c1swXSArIGQzX3N2Z19saW5lSGVybWl0ZShwb2ludHMsDQotICAgICAgICBkM19zdmdfbGluZUNhcmRpbmFsVGFuZ2VudHMocG9pbnRzLCB0ZW5zaW9uKSk7DQotfQ0KLQ0KLS8vIEhlcm1pdGUgc3BsaW5lIGNvbnN0cnVjdGlvbjsgZ2VuZXJhdGVzICJDIiBjb21tYW5kcy4NCi1mdW5jdGlvbiBkM19zdmdfbGluZUhlcm1pdGUocG9pbnRzLCB0YW5nZW50cykgew0KLSAgaWYgKHRhbmdlbnRzLmxlbmd0aCA8IDENCi0gICAgICB8fCAocG9pbnRzLmxlbmd0aCAhPSB0YW5nZW50cy5sZW5ndGgNCi0gICAgICAmJiBwb2ludHMubGVuZ3RoICE9IHRhbmdlbnRzLmxlbmd0aCArIDIpKSB7DQotICAgIHJldHVybiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpOw0KLSAgfQ0KLQ0KLSAgdmFyIHF1YWQgPSBwb2ludHMubGVuZ3RoICE9IHRhbmdlbnRzLmxlbmd0aCwNCi0gICAgICBwYXRoID0gIiIsDQotICAgICAgcDAgPSBwb2ludHNbMF0sDQotICAgICAgcCA9IHBvaW50c1sxXSwNCi0gICAgICB0MCA9IHRhbmdlbnRzWzBdLA0KLSAgICAgIHQgPSB0MCwNCi0gICAgICBwaSA9IDE7DQotDQotICBpZiAocXVhZCkgew0KLSAgICBwYXRoICs9ICJRIiArIChwWzBdIC0gdDBbMF0gKiAyIC8gMykgKyAiLCIgKyAocFsxXSAtIHQwWzFdICogMiAvIDMpDQotICAgICAgICArICIsIiArIHBbMF0gKyAiLCIgKyBwWzFdOw0KLSAgICBwMCA9IHBvaW50c1sxXTsNCi0gICAgcGkgPSAyOw0KLSAgfQ0KLQ0KLSAgaWYgKHRhbmdlbnRzLmxlbmd0aCA+IDEpIHsNCi0gICAgdCA9IHRhbmdlbnRzWzFdOw0KLSAgICBwID0gcG9pbnRzW3BpXTsNCi0gICAgcGkrKzsNCi0gICAgcGF0aCArPSAiQyIgKyAocDBbMF0gKyB0MFswXSkgKyAiLCIgKyAocDBbMV0gKyB0MFsxXSkNCi0gICAgICAgICsgIiwiICsgKHBbMF0gLSB0WzBdKSArICIsIiArIChwWzFdIC0gdFsxXSkNCi0gICAgICAgICsgIiwiICsgcFswXSArICIsIiArIHBbMV07DQotICAgIGZvciAodmFyIGkgPSAyOyBpIDwgdGFuZ2VudHMubGVuZ3RoOyBpKyssIHBpKyspIHsNCi0gICAgICBwID0gcG9pbnRzW3BpXTsNCi0gICAgICB0ID0gdGFuZ2VudHNbaV07DQotICAgICAgcGF0aCArPSAiUyIgKyAocFswXSAtIHRbMF0pICsgIiwiICsgKHBbMV0gLSB0WzFdKQ0KLSAgICAgICAgICArICIsIiArIHBbMF0gKyAiLCIgKyBwWzFdOw0KLSAgICB9DQotICB9DQotDQotICBpZiAocXVhZCkgew0KLSAgICB2YXIgbHAgPSBwb2ludHNbcGldOw0KLSAgICBwYXRoICs9ICJRIiArIChwWzBdICsgdFswXSAqIDIgLyAzKSArICIsIiArIChwWzFdICsgdFsxXSAqIDIgLyAzKQ0KLSAgICAgICAgKyAiLCIgKyBscFswXSArICIsIiArIGxwWzFdOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIHBhdGg7DQotfQ0KLQ0KLS8vIEdlbmVyYXRlcyB0YW5nZW50cyBmb3IgYSBjYXJkaW5hbCBzcGxpbmUuDQotZnVuY3Rpb24gZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikgew0KLSAgdmFyIHRhbmdlbnRzID0gW10sDQotICAgICAgYSA9ICgxIC0gdGVuc2lvbikgLyAyLA0KLSAgICAgIHAwLA0KLSAgICAgIHAxID0gcG9pbnRzWzBdLA0KLSAgICAgIHAyID0gcG9pbnRzWzFdLA0KLSAgICAgIGkgPSAxLA0KLSAgICAgIG4gPSBwb2ludHMubGVuZ3RoOw0KLSAgd2hpbGUgKCsraSA8IG4pIHsNCi0gICAgcDAgPSBwMTsNCi0gICAgcDEgPSBwMjsNCi0gICAgcDIgPSBwb2ludHNbaV07DQotICAgIHRhbmdlbnRzLnB1c2goW2EgKiAocDJbMF0gLSBwMFswXSksIGEgKiAocDJbMV0gLSBwMFsxXSldKTsNCi0gIH0NCi0gIHJldHVybiB0YW5nZW50czsNCi19DQotDQotLy8gQi1zcGxpbmUgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJDIiBjb21tYW5kcy4NCi1mdW5jdGlvbiBkM19zdmdfbGluZUJhc2lzKHBvaW50cykgew0KLSAgaWYgKHBvaW50cy5sZW5ndGggPCAzKSByZXR1cm4gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKTsNCi0gIHZhciBpID0gMSwNCi0gICAgICBuID0gcG9pbnRzLmxlbmd0aCwNCi0gICAgICBwaSA9IHBvaW50c1swXSwNCi0gICAgICB4MCA9IHBpWzBdLA0KLSAgICAgIHkwID0gcGlbMV0sDQotICAgICAgcHggPSBbeDAsIHgwLCB4MCwgKHBpID0gcG9pbnRzWzFdKVswXV0sDQotICAgICAgcHkgPSBbeTAsIHkwLCB5MCwgcGlbMV1dLA0KLSAgICAgIHBhdGggPSBbeDAsICIsIiwgeTBdOw0KLSAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOw0KLSAgd2hpbGUgKCsraSA8IG4pIHsNCi0gICAgcGkgPSBwb2ludHNbaV07DQotICAgIHB4LnNoaWZ0KCk7IHB4LnB1c2gocGlbMF0pOw0KLSAgICBweS5zaGlmdCgpOyBweS5wdXNoKHBpWzFdKTsNCi0gICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOw0KLSAgfQ0KLSAgaSA9IC0xOw0KLSAgd2hpbGUgKCsraSA8IDIpIHsNCi0gICAgcHguc2hpZnQoKTsgcHgucHVzaChwaVswXSk7DQotICAgIHB5LnNoaWZ0KCk7IHB5LnB1c2gocGlbMV0pOw0KLSAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHB4LCBweSk7DQotICB9DQotICByZXR1cm4gcGF0aC5qb2luKCIiKTsNCi19DQotDQotLy8gT3BlbiBCLXNwbGluZSBpbnRlcnBvbGF0aW9uOyBnZW5lcmF0ZXMgIkMiIGNvbW1hbmRzLg0KLWZ1bmN0aW9uIGQzX3N2Z19saW5lQmFzaXNPcGVuKHBvaW50cykgew0KLSAgaWYgKHBvaW50cy5sZW5ndGggPCA0KSByZXR1cm4gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKTsNCi0gIHZhciBwYXRoID0gW10sDQotICAgICAgaSA9IC0xLA0KLSAgICAgIG4gPSBwb2ludHMubGVuZ3RoLA0KLSAgICAgIHBpLA0KLSAgICAgIHB4ID0gWzBdLA0KLSAgICAgIHB5ID0gWzBdOw0KLSAgd2hpbGUgKCsraSA8IDMpIHsNCi0gICAgcGkgPSBwb2ludHNbaV07DQotICAgIHB4LnB1c2gocGlbMF0pOw0KLSAgICBweS5wdXNoKHBpWzFdKTsNCi0gIH0NCi0gIHBhdGgucHVzaChkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB4KQ0KLSAgICArICIsIiArIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHkpKTsNCi0gIC0taTsgd2hpbGUgKCsraSA8IG4pIHsNCi0gICAgcGkgPSBwb2ludHNbaV07DQotICAgIHB4LnNoaWZ0KCk7IHB4LnB1c2gocGlbMF0pOw0KLSAgICBweS5zaGlmdCgpOyBweS5wdXNoKHBpWzFdKTsNCi0gICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOw0KLSAgfQ0KLSAgcmV0dXJuIHBhdGguam9pbigiIik7DQotfQ0KLQ0KLS8vIENsb3NlZCBCLXNwbGluZSBpbnRlcnBvbGF0aW9uOyBnZW5lcmF0ZXMgIkMiIGNvbW1hbmRzLg0KLWZ1bmN0aW9uIGQzX3N2Z19saW5lQmFzaXNDbG9zZWQocG9pbnRzKSB7DQotICB2YXIgcGF0aCwNCi0gICAgICBpID0gLTEsDQotICAgICAgbiA9IHBvaW50cy5sZW5ndGgsDQotICAgICAgbSA9IG4gKyA0LA0KLSAgICAgIHBpLA0KLSAgICAgIHB4ID0gW10sDQotICAgICAgcHkgPSBbXTsNCi0gIHdoaWxlICgrK2kgPCA0KSB7DQotICAgIHBpID0gcG9pbnRzW2kgJSBuXTsNCi0gICAgcHgucHVzaChwaVswXSk7DQotICAgIHB5LnB1c2gocGlbMV0pOw0KLSAgfQ0KLSAgcGF0aCA9IFsNCi0gICAgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweCksICIsIiwNCi0gICAgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweSkNCi0gIF07DQotICAtLWk7IHdoaWxlICgrK2kgPCBtKSB7DQotICAgIHBpID0gcG9pbnRzW2kgJSBuXTsNCi0gICAgcHguc2hpZnQoKTsgcHgucHVzaChwaVswXSk7DQotICAgIHB5LnNoaWZ0KCk7IHB5LnB1c2gocGlbMV0pOw0KLSAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHB4LCBweSk7DQotICB9DQotICByZXR1cm4gcGF0aC5qb2luKCIiKTsNCi19DQotDQotZnVuY3Rpb24gZDNfc3ZnX2xpbmVCdW5kbGUocG9pbnRzLCB0ZW5zaW9uKSB7DQotICB2YXIgbiA9IHBvaW50cy5sZW5ndGggLSAxLA0KLSAgICAgIHgwID0gcG9pbnRzWzBdWzBdLA0KLSAgICAgIHkwID0gcG9pbnRzWzBdWzFdLA0KLSAgICAgIGR4ID0gcG9pbnRzW25dWzBdIC0geDAsDQotICAgICAgZHkgPSBwb2ludHNbbl1bMV0gLSB5MCwNCi0gICAgICBpID0gLTEsDQotICAgICAgcCwNCi0gICAgICB0Ow0KLSAgd2hpbGUgKCsraSA8PSBuKSB7DQotICAgIHAgPSBwb2ludHNbaV07DQotICAgIHQgPSBpIC8gbjsNCi0gICAgcFswXSA9IHRlbnNpb24gKiBwWzBdICsgKDEgLSB0ZW5zaW9uKSAqICh4MCArIHQgKiBkeCk7DQotICAgIHBbMV0gPSB0ZW5zaW9uICogcFsxXSArICgxIC0gdGVuc2lvbikgKiAoeTAgKyB0ICogZHkpOw0KLSAgfQ0KLSAgcmV0dXJuIGQzX3N2Z19saW5lQmFzaXMocG9pbnRzKTsNCi19DQotDQotLy8gUmV0dXJucyB0aGUgZG90IHByb2R1Y3Qgb2YgdGhlIGdpdmVuIGZvdXItZWxlbWVudCB2ZWN0b3JzLg0KLWZ1bmN0aW9uIGQzX3N2Z19saW5lRG90NChhLCBiKSB7DQotICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdICsgYVszXSAqIGJbM107DQotfQ0KLQ0KLS8vIE1hdHJpeCB0byB0cmFuc2Zvcm0gYmFzaXMgKGItc3BsaW5lKSBjb250cm9sIHBvaW50cyB0byBiZXppZXINCi0vLyBjb250cm9sIHBvaW50cy4gRGVyaXZlZCBmcm9tIEZ2RCAxMS4yLjguDQotdmFyIGQzX3N2Z19saW5lQmFzaXNCZXppZXIxID0gWzAsIDIvMywgMS8zLCAwXSwNCi0gICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcjIgPSBbMCwgMS8zLCAyLzMsIDBdLA0KLSAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyMyA9IFswLCAxLzYsIDIvMywgMS82XTsNCi0NCi0vLyBQdXNoZXMgYSAiQyIgQsOpemllciBjdXJ2ZSBvbnRvIHRoZSBzcGVjaWZpZWQgcGF0aCBhcnJheSwgZ2l2ZW4gdGhlDQotLy8gdHdvIHNwZWNpZmllZCBmb3VyLWVsZW1lbnQgYXJyYXlzIHdoaWNoIGRlZmluZSB0aGUgY29udHJvbCBwb2ludHMuDQotZnVuY3Rpb24gZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCB4LCB5KSB7DQotICBwYXRoLnB1c2goDQotICAgICAgIkMiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjEsIHgpLA0KLSAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIxLCB5KSwNCi0gICAgICAiLCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMiwgeCksDQotICAgICAgIiwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjIsIHkpLA0KLSAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCB4KSwNCi0gICAgICAiLCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgeSkpOw0KLX0NCi0NCi0vLyBDb21wdXRlcyB0aGUgc2xvcGUgZnJvbSBwb2ludHMgcDAgdG8gcDEuDQotZnVuY3Rpb24gZDNfc3ZnX2xpbmVTbG9wZShwMCwgcDEpIHsNCi0gIHJldHVybiAocDFbMV0gLSBwMFsxXSkgLyAocDFbMF0gLSBwMFswXSk7DQotfQ0KLQ0KLS8vIENvbXB1dGUgdGhyZWUtcG9pbnQgZGlmZmVyZW5jZXMgZm9yIHRoZSBnaXZlbiBwb2ludHMuDQotLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdWJpY19IZXJtaXRlX3NwbGluZSNGaW5pdGVfZGlmZmVyZW5jZQ0KLWZ1bmN0aW9uIGQzX3N2Z19saW5lRmluaXRlRGlmZmVyZW5jZXMocG9pbnRzKSB7DQotICB2YXIgaSA9IDAsDQotICAgICAgaiA9IHBvaW50cy5sZW5ndGggLSAxLA0KLSAgICAgIG0gPSBbXSwNCi0gICAgICBwMCA9IHBvaW50c1swXSwNCi0gICAgICBwMSA9IHBvaW50c1sxXSwNCi0gICAgICBkID0gbVswXSA9IGQzX3N2Z19saW5lU2xvcGUocDAsIHAxKTsNCi0gIHdoaWxlICgrK2kgPCBqKSB7DQotICAgIG1baV0gPSBkICsgKGQgPSBkM19zdmdfbGluZVNsb3BlKHAwID0gcDEsIHAxID0gcG9pbnRzW2kgKyAxXSkpOw0KLSAgfQ0KLSAgbVtpXSA9IGQ7DQotICByZXR1cm4gbTsNCi19DQotDQotLy8gSW50ZXJwb2xhdGVzIHRoZSBnaXZlbiBwb2ludHMgdXNpbmcgRnJpdHNjaC1DYXJsc29uIE1vbm90b25lIGN1YmljIEhlcm1pdGUNCi0vLyBpbnRlcnBvbGF0aW9uLiBSZXR1cm5zIGFuIGFycmF5IG9mIHRhbmdlbnQgdmVjdG9ycy4gRm9yIGRldGFpbHMsIHNlZQ0KLS8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9ub3RvbmVfY3ViaWNfaW50ZXJwb2xhdGlvbg0KLWZ1bmN0aW9uIGQzX3N2Z19saW5lTW9ub3RvbmVUYW5nZW50cyhwb2ludHMpIHsNCi0gIHZhciB0YW5nZW50cyA9IFtdLA0KLSAgICAgIGQsDQotICAgICAgYSwNCi0gICAgICBiLA0KLSAgICAgIHMsDQotICAgICAgbSA9IGQzX3N2Z19saW5lRmluaXRlRGlmZmVyZW5jZXMocG9pbnRzKSwNCi0gICAgICBpID0gLTEsDQotICAgICAgaiA9IHBvaW50cy5sZW5ndGggLSAxOw0KLQ0KLSAgLy8gVGhlIGZpcnN0IHR3byBzdGVwcyBhcmUgZG9uZSBieSBjb21wdXRpbmcgZmluaXRlLWRpZmZlcmVuY2VzOg0KLSAgLy8gMS4gQ29tcHV0ZSB0aGUgc2xvcGVzIG9mIHRoZSBzZWNhbnQgbGluZXMgYmV0d2VlbiBzdWNjZXNzaXZlIHBvaW50cy4NCi0gIC8vIDIuIEluaXRpYWxpemUgdGhlIHRhbmdlbnRzIGF0IGV2ZXJ5IHBvaW50IGFzIHRoZSBhdmVyYWdlIG9mIHRoZSBzZWNhbnRzLg0KLQ0KLSAgLy8gVGhlbiwgZm9yIGVhY2ggc2VnbWVudOKAPw0KLSAgd2hpbGUgKCsraSA8IGopIHsNCi0gICAgZCA9IGQzX3N2Z19saW5lU2xvcGUocG9pbnRzW2ldLCBwb2ludHNbaSArIDFdKTsNCi0NCi0gICAgLy8gMy4gSWYgdHdvIHN1Y2Nlc3NpdmUgeWsgPSB5e2sgKyAxfSBhcmUgZXF1YWwgKGkuZS4sIGQgaXMgemVybyksIHRoZW4gc2V0DQotICAgIC8vIG1rID0gbXtrICsgMX0gPSAwIGFzIHRoZSBzcGxpbmUgY29ubmVjdGluZyB0aGVzZSBwb2ludHMgbXVzdCBiZSBmbGF0IHRvDQotICAgIC8vIHByZXNlcnZlIG1vbm90b25pY2l0eS4gSWdub3JlIHN0ZXAgNCBhbmQgNSBmb3IgdGhvc2Ugay4NCi0NCi0gICAgaWYgKE1hdGguYWJzKGQpIDwgMWUtNikgew0KLSAgICAgIG1baV0gPSBtW2kgKyAxXSA9IDA7DQotICAgIH0gZWxzZSB7DQotICAgICAgLy8gNC4gTGV0IGFrID0gbWsgLyBkayBhbmQgYmsgPSBte2sgKyAxfSAvIGRrLg0KLSAgICAgIGEgPSBtW2ldIC8gZDsNCi0gICAgICBiID0gbVtpICsgMV0gLyBkOw0KLQ0KLSAgICAgIC8vIDUuIFByZXZlbnQgb3ZlcnNob290IGFuZCBlbnN1cmUgbW9ub3RvbmljaXR5IGJ5IHJlc3RyaWN0aW5nIHRoZQ0KLSAgICAgIC8vIG1hZ25pdHVkZSBvZiB2ZWN0b3IgPGFrLCBiaz4gdG8gYSBjaXJjbGUgb2YgcmFkaXVzIDMuDQotICAgICAgcyA9IGEgKiBhICsgYiAqIGI7DQotICAgICAgaWYgKHMgPiA5KSB7DQotICAgICAgICBzID0gZCAqIDMgLyBNYXRoLnNxcnQocyk7DQotICAgICAgICBtW2ldID0gcyAqIGE7DQotICAgICAgICBtW2kgKyAxXSA9IHMgKiBiOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gQ29tcHV0ZSB0aGUgbm9ybWFsaXplZCB0YW5nZW50IHZlY3RvciBmcm9tIHRoZSBzbG9wZXMuIE5vdGUgdGhhdCBpZiB4IGlzDQotICAvLyBub3QgbW9ub3RvbmljLCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNsb3BlIHdpbGwgYmUgaW5maW5pdGUsIHNvIHdlIHByb3RlY3QNCi0gIC8vIGFnYWluc3QgTmFOIGJ5IHNldHRpbmcgdGhlIGNvb3JkaW5hdGUgdG8gemVyby4NCi0gIGkgPSAtMTsgd2hpbGUgKCsraSA8PSBqKSB7DQotICAgIHMgPSAocG9pbnRzW01hdGgubWluKGosIGkgKyAxKV1bMF0gLSBwb2ludHNbTWF0aC5tYXgoMCwgaSAtIDEpXVswXSkNCi0gICAgICAvICg2ICogKDEgKyBtW2ldICogbVtpXSkpOw0KLSAgICB0YW5nZW50cy5wdXNoKFtzIHx8IDAsIG1baV0gKiBzIHx8IDBdKTsNCi0gIH0NCi0NCi0gIHJldHVybiB0YW5nZW50czsNCi19DQotDQotZnVuY3Rpb24gZDNfc3ZnX2xpbmVNb25vdG9uZShwb2ludHMpIHsNCi0gIHJldHVybiBwb2ludHMubGVuZ3RoIDwgMw0KLSAgICAgID8gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKQ0KLSAgICAgIDogcG9pbnRzWzBdICsNCi0gICAgICAgIGQzX3N2Z19saW5lSGVybWl0ZShwb2ludHMsIGQzX3N2Z19saW5lTW9ub3RvbmVUYW5nZW50cyhwb2ludHMpKTsNCi19DQotZDMuc3ZnLmxpbmUucmFkaWFsID0gZnVuY3Rpb24oKSB7DQotICB2YXIgbGluZSA9IGQzX3N2Z19saW5lKGQzX3N2Z19saW5lUmFkaWFsKTsNCi0gIGxpbmUucmFkaXVzID0gbGluZS54LCBkZWxldGUgbGluZS54Ow0KLSAgbGluZS5hbmdsZSA9IGxpbmUueSwgZGVsZXRlIGxpbmUueTsNCi0gIHJldHVybiBsaW5lOw0KLX07DQotDQotZnVuY3Rpb24gZDNfc3ZnX2xpbmVSYWRpYWwocG9pbnRzKSB7DQotICB2YXIgcG9pbnQsDQotICAgICAgaSA9IC0xLA0KLSAgICAgIG4gPSBwb2ludHMubGVuZ3RoLA0KLSAgICAgIHIsDQotICAgICAgYTsNCi0gIHdoaWxlICgrK2kgPCBuKSB7DQotICAgIHBvaW50ID0gcG9pbnRzW2ldOw0KLSAgICByID0gcG9pbnRbMF07DQotICAgIGEgPSBwb2ludFsxXSArIGQzX3N2Z19hcmNPZmZzZXQ7DQotICAgIHBvaW50WzBdID0gciAqIE1hdGguY29zKGEpOw0KLSAgICBwb2ludFsxXSA9IHIgKiBNYXRoLnNpbihhKTsNCi0gIH0NCi0gIHJldHVybiBwb2ludHM7DQotfQ0KLWZ1bmN0aW9uIGQzX3N2Z19hcmVhKHByb2plY3Rpb24pIHsNCi0gIHZhciB4MCA9IGQzX3N2Z19saW5lWCwNCi0gICAgICB4MSA9IGQzX3N2Z19saW5lWCwNCi0gICAgICB5MCA9IDAsDQotICAgICAgeTEgPSBkM19zdmdfbGluZVksDQotICAgICAgaW50ZXJwb2xhdGUsDQotICAgICAgaTAsDQotICAgICAgaTEsDQotICAgICAgdGVuc2lvbiA9IC43Ow0KLQ0KLSAgZnVuY3Rpb24gYXJlYShkKSB7DQotICAgIGlmIChkLmxlbmd0aCA8IDEpIHJldHVybiBudWxsOw0KLSAgICB2YXIgcG9pbnRzMCA9IGQzX3N2Z19saW5lUG9pbnRzKHRoaXMsIGQsIHgwLCB5MCksDQotICAgICAgICBwb2ludHMxID0gZDNfc3ZnX2xpbmVQb2ludHModGhpcywgZCwgeDAgPT09IHgxID8gZDNfc3ZnX2FyZWFYKHBvaW50czApIDogeDEsIHkwID09PSB5MSA/IGQzX3N2Z19hcmVhWShwb2ludHMwKSA6IHkxKTsNCi0gICAgcmV0dXJuICJNIiArIGkwKHByb2plY3Rpb24ocG9pbnRzMSksIHRlbnNpb24pDQotICAgICAgICAgKyAiTCIgKyBpMShwcm9qZWN0aW9uKHBvaW50czAucmV2ZXJzZSgpKSwgdGVuc2lvbikNCi0gICAgICAgICArICJaIjsNCi0gIH0NCi0NCi0gIGFyZWEueCA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDE7DQotICAgIHgwID0geDEgPSB4Ow0KLSAgICByZXR1cm4gYXJlYTsNCi0gIH07DQotDQotICBhcmVhLngwID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4MDsNCi0gICAgeDAgPSB4Ow0KLSAgICByZXR1cm4gYXJlYTsNCi0gIH07DQotDQotICBhcmVhLngxID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4MTsNCi0gICAgeDEgPSB4Ow0KLSAgICByZXR1cm4gYXJlYTsNCi0gIH07DQotDQotICBhcmVhLnkgPSBmdW5jdGlvbih5KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkxOw0KLSAgICB5MCA9IHkxID0geTsNCi0gICAgcmV0dXJuIGFyZWE7DQotICB9Ow0KLQ0KLSAgYXJlYS55MCA9IGZ1bmN0aW9uKHkpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTA7DQotICAgIHkwID0geTsNCi0gICAgcmV0dXJuIGFyZWE7DQotICB9Ow0KLQ0KLSAgYXJlYS55MSA9IGZ1bmN0aW9uKHkpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTE7DQotICAgIHkxID0geTsNCi0gICAgcmV0dXJuIGFyZWE7DQotICB9Ow0KLQ0KLSAgYXJlYS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW50ZXJwb2xhdGU7DQotICAgIGlmICghZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmhhcyh4ICs9ICIiKSkgeCA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9yRGVmYXVsdDsNCi0gICAgaTAgPSBkM19zdmdfbGluZUludGVycG9sYXRvcnMuZ2V0KGludGVycG9sYXRlID0geCk7DQotICAgIGkxID0gaTAucmV2ZXJzZSB8fCBpMDsNCi0gICAgcmV0dXJuIGFyZWE7DQotICB9Ow0KLQ0KLSAgYXJlYS50ZW5zaW9uID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0ZW5zaW9uOw0KLSAgICB0ZW5zaW9uID0geDsNCi0gICAgcmV0dXJuIGFyZWE7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGFyZWEuaW50ZXJwb2xhdGUoImxpbmVhciIpOw0KLX0NCi0NCi1kM19zdmdfbGluZVN0ZXBCZWZvcmUucmV2ZXJzZSA9IGQzX3N2Z19saW5lU3RlcEFmdGVyOw0KLWQzX3N2Z19saW5lU3RlcEFmdGVyLnJldmVyc2UgPSBkM19zdmdfbGluZVN0ZXBCZWZvcmU7DQotDQotZDMuc3ZnLmFyZWEgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiBkM19zdmdfYXJlYShPYmplY3QpOw0KLX07DQotDQotZnVuY3Rpb24gZDNfc3ZnX2FyZWFYKHBvaW50cykgew0KLSAgcmV0dXJuIGZ1bmN0aW9uKGQsIGkpIHsNCi0gICAgcmV0dXJuIHBvaW50c1tpXVswXTsNCi0gIH07DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3N2Z19hcmVhWShwb2ludHMpIHsNCi0gIHJldHVybiBmdW5jdGlvbihkLCBpKSB7DQotICAgIHJldHVybiBwb2ludHNbaV1bMV07DQotICB9Ow0KLX0NCi1kMy5zdmcuYXJlYS5yYWRpYWwgPSBmdW5jdGlvbigpIHsNCi0gIHZhciBhcmVhID0gZDNfc3ZnX2FyZWEoZDNfc3ZnX2xpbmVSYWRpYWwpOw0KLSAgYXJlYS5yYWRpdXMgPSBhcmVhLngsIGRlbGV0ZSBhcmVhLng7DQotICBhcmVhLmlubmVyUmFkaXVzID0gYXJlYS54MCwgZGVsZXRlIGFyZWEueDA7DQotICBhcmVhLm91dGVyUmFkaXVzID0gYXJlYS54MSwgZGVsZXRlIGFyZWEueDE7DQotICBhcmVhLmFuZ2xlID0gYXJlYS55LCBkZWxldGUgYXJlYS55Ow0KLSAgYXJlYS5zdGFydEFuZ2xlID0gYXJlYS55MCwgZGVsZXRlIGFyZWEueTA7DQotICBhcmVhLmVuZEFuZ2xlID0gYXJlYS55MSwgZGVsZXRlIGFyZWEueTE7DQotICByZXR1cm4gYXJlYTsNCi19Ow0KLWQzLnN2Zy5jaG9yZCA9IGZ1bmN0aW9uKCkgew0KLSAgdmFyIHNvdXJjZSA9IGQzX3N2Z19jaG9yZFNvdXJjZSwNCi0gICAgICB0YXJnZXQgPSBkM19zdmdfY2hvcmRUYXJnZXQsDQotICAgICAgcmFkaXVzID0gZDNfc3ZnX2Nob3JkUmFkaXVzLA0KLSAgICAgIHN0YXJ0QW5nbGUgPSBkM19zdmdfYXJjU3RhcnRBbmdsZSwNCi0gICAgICBlbmRBbmdsZSA9IGQzX3N2Z19hcmNFbmRBbmdsZTsNCi0NCi0gIC8vIFRPRE8gQWxsb3cgY29udHJvbCBwb2ludCB0byBiZSBjdXN0b21pemVkLg0KLQ0KLSAgZnVuY3Rpb24gY2hvcmQoZCwgaSkgew0KLSAgICB2YXIgcyA9IHN1Ymdyb3VwKHRoaXMsIHNvdXJjZSwgZCwgaSksDQotICAgICAgICB0ID0gc3ViZ3JvdXAodGhpcywgdGFyZ2V0LCBkLCBpKTsNCi0gICAgcmV0dXJuICJNIiArIHMucDANCi0gICAgICArIGFyYyhzLnIsIHMucDEsIHMuYTEgLSBzLmEwKSArIChlcXVhbHMocywgdCkNCi0gICAgICA/IGN1cnZlKHMuciwgcy5wMSwgcy5yLCBzLnAwKQ0KLSAgICAgIDogY3VydmUocy5yLCBzLnAxLCB0LnIsIHQucDApDQotICAgICAgKyBhcmModC5yLCB0LnAxLCB0LmExIC0gdC5hMCkNCi0gICAgICArIGN1cnZlKHQuciwgdC5wMSwgcy5yLCBzLnAwKSkNCi0gICAgICArICJaIjsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHN1Ymdyb3VwKHNlbGYsIGYsIGQsIGkpIHsNCi0gICAgdmFyIHN1Ymdyb3VwID0gZi5jYWxsKHNlbGYsIGQsIGkpLA0KLSAgICAgICAgciA9IHJhZGl1cy5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSwNCi0gICAgICAgIGEwID0gc3RhcnRBbmdsZS5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSArIGQzX3N2Z19hcmNPZmZzZXQsDQotICAgICAgICBhMSA9IGVuZEFuZ2xlLmNhbGwoc2VsZiwgc3ViZ3JvdXAsIGkpICsgZDNfc3ZnX2FyY09mZnNldDsNCi0gICAgcmV0dXJuIHsNCi0gICAgICByOiByLA0KLSAgICAgIGEwOiBhMCwNCi0gICAgICBhMTogYTEsDQotICAgICAgcDA6IFtyICogTWF0aC5jb3MoYTApLCByICogTWF0aC5zaW4oYTApXSwNCi0gICAgICBwMTogW3IgKiBNYXRoLmNvcyhhMSksIHIgKiBNYXRoLnNpbihhMSldDQotICAgIH07DQotICB9DQotDQotICBmdW5jdGlvbiBlcXVhbHMoYSwgYikgew0KLSAgICByZXR1cm4gYS5hMCA9PSBiLmEwICYmIGEuYTEgPT0gYi5hMTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGFyYyhyLCBwLCBhKSB7DQotICAgIHJldHVybiAiQSIgKyByICsgIiwiICsgciArICIgMCAiICsgKyhhID4gTWF0aC5QSSkgKyAiLDEgIiArIHA7DQotICB9DQotDQotICBmdW5jdGlvbiBjdXJ2ZShyMCwgcDAsIHIxLCBwMSkgew0KLSAgICByZXR1cm4gIlEgMCwwICIgKyBwMTsNCi0gIH0NCi0NCi0gIGNob3JkLnJhZGl1cyA9IGZ1bmN0aW9uKHYpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFkaXVzOw0KLSAgICByYWRpdXMgPSBkMy5mdW5jdG9yKHYpOw0KLSAgICByZXR1cm4gY2hvcmQ7DQotICB9Ow0KLQ0KLSAgY2hvcmQuc291cmNlID0gZnVuY3Rpb24odikgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3VyY2U7DQotICAgIHNvdXJjZSA9IGQzLmZ1bmN0b3Iodik7DQotICAgIHJldHVybiBjaG9yZDsNCi0gIH07DQotDQotICBjaG9yZC50YXJnZXQgPSBmdW5jdGlvbih2KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRhcmdldDsNCi0gICAgdGFyZ2V0ID0gZDMuZnVuY3Rvcih2KTsNCi0gICAgcmV0dXJuIGNob3JkOw0KLSAgfTsNCi0NCi0gIGNob3JkLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbih2KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7DQotICAgIHN0YXJ0QW5nbGUgPSBkMy5mdW5jdG9yKHYpOw0KLSAgICByZXR1cm4gY2hvcmQ7DQotICB9Ow0KLQ0KLSAgY2hvcmQuZW5kQW5nbGUgPSBmdW5jdGlvbih2KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGVuZEFuZ2xlOw0KLSAgICBlbmRBbmdsZSA9IGQzLmZ1bmN0b3Iodik7DQotICAgIHJldHVybiBjaG9yZDsNCi0gIH07DQotDQotICByZXR1cm4gY2hvcmQ7DQotfTsNCi0NCi1mdW5jdGlvbiBkM19zdmdfY2hvcmRTb3VyY2UoZCkgew0KLSAgcmV0dXJuIGQuc291cmNlOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19zdmdfY2hvcmRUYXJnZXQoZCkgew0KLSAgcmV0dXJuIGQudGFyZ2V0Ow0KLX0NCi0NCi1mdW5jdGlvbiBkM19zdmdfY2hvcmRSYWRpdXMoZCkgew0KLSAgcmV0dXJuIGQucmFkaXVzOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19zdmdfY2hvcmRTdGFydEFuZ2xlKGQpIHsNCi0gIHJldHVybiBkLnN0YXJ0QW5nbGU7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3N2Z19jaG9yZEVuZEFuZ2xlKGQpIHsNCi0gIHJldHVybiBkLmVuZEFuZ2xlOw0KLX0NCi1kMy5zdmcuZGlhZ29uYWwgPSBmdW5jdGlvbigpIHsNCi0gIHZhciBzb3VyY2UgPSBkM19zdmdfY2hvcmRTb3VyY2UsDQotICAgICAgdGFyZ2V0ID0gZDNfc3ZnX2Nob3JkVGFyZ2V0LA0KLSAgICAgIHByb2plY3Rpb24gPSBkM19zdmdfZGlhZ29uYWxQcm9qZWN0aW9uOw0KLQ0KLSAgZnVuY3Rpb24gZGlhZ29uYWwoZCwgaSkgew0KLSAgICB2YXIgcDAgPSBzb3VyY2UuY2FsbCh0aGlzLCBkLCBpKSwNCi0gICAgICAgIHAzID0gdGFyZ2V0LmNhbGwodGhpcywgZCwgaSksDQotICAgICAgICBtID0gKHAwLnkgKyBwMy55KSAvIDIsDQotICAgICAgICBwID0gW3AwLCB7eDogcDAueCwgeTogbX0sIHt4OiBwMy54LCB5OiBtfSwgcDNdOw0KLSAgICBwID0gcC5tYXAocHJvamVjdGlvbik7DQotICAgIHJldHVybiAiTSIgKyBwWzBdICsgIkMiICsgcFsxXSArICIgIiArIHBbMl0gKyAiICIgKyBwWzNdOw0KLSAgfQ0KLQ0KLSAgZGlhZ29uYWwuc291cmNlID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3VyY2U7DQotICAgIHNvdXJjZSA9IGQzLmZ1bmN0b3IoeCk7DQotICAgIHJldHVybiBkaWFnb25hbDsNCi0gIH07DQotDQotICBkaWFnb25hbC50YXJnZXQgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRhcmdldDsNCi0gICAgdGFyZ2V0ID0gZDMuZnVuY3Rvcih4KTsNCi0gICAgcmV0dXJuIGRpYWdvbmFsOw0KLSAgfTsNCi0NCi0gIGRpYWdvbmFsLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByb2plY3Rpb247DQotICAgIHByb2plY3Rpb24gPSB4Ow0KLSAgICByZXR1cm4gZGlhZ29uYWw7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGRpYWdvbmFsOw0KLX07DQotDQotZnVuY3Rpb24gZDNfc3ZnX2RpYWdvbmFsUHJvamVjdGlvbihkKSB7DQotICByZXR1cm4gW2QueCwgZC55XTsNCi19DQotZDMuc3ZnLmRpYWdvbmFsLnJhZGlhbCA9IGZ1bmN0aW9uKCkgew0KLSAgdmFyIGRpYWdvbmFsID0gZDMuc3ZnLmRpYWdvbmFsKCksDQotICAgICAgcHJvamVjdGlvbiA9IGQzX3N2Z19kaWFnb25hbFByb2plY3Rpb24sDQotICAgICAgcHJvamVjdGlvbl8gPSBkaWFnb25hbC5wcm9qZWN0aW9uOw0KLQ0KLSAgZGlhZ29uYWwucHJvamVjdGlvbiA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgNCi0gICAgICAgID8gcHJvamVjdGlvbl8oZDNfc3ZnX2RpYWdvbmFsUmFkaWFsUHJvamVjdGlvbihwcm9qZWN0aW9uID0geCkpDQotICAgICAgICA6IHByb2plY3Rpb247DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGRpYWdvbmFsOw0KLX07DQotDQotZnVuY3Rpb24gZDNfc3ZnX2RpYWdvbmFsUmFkaWFsUHJvamVjdGlvbihwcm9qZWN0aW9uKSB7DQotICByZXR1cm4gZnVuY3Rpb24oKSB7DQotICAgIHZhciBkID0gcHJvamVjdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpLA0KLSAgICAgICAgciA9IGRbMF0sDQotICAgICAgICBhID0gZFsxXSArIGQzX3N2Z19hcmNPZmZzZXQ7DQotICAgIHJldHVybiBbciAqIE1hdGguY29zKGEpLCByICogTWF0aC5zaW4oYSldOw0KLSAgfTsNCi19DQotZDMuc3ZnLm1vdXNlID0gZDMubW91c2U7DQotZDMuc3ZnLnRvdWNoZXMgPSBkMy50b3VjaGVzOw0KLWQzLnN2Zy5zeW1ib2wgPSBmdW5jdGlvbigpIHsNCi0gIHZhciB0eXBlID0gZDNfc3ZnX3N5bWJvbFR5cGUsDQotICAgICAgc2l6ZSA9IGQzX3N2Z19zeW1ib2xTaXplOw0KLQ0KLSAgZnVuY3Rpb24gc3ltYm9sKGQsIGkpIHsNCi0gICAgcmV0dXJuIChkM19zdmdfc3ltYm9scy5nZXQodHlwZS5jYWxsKHRoaXMsIGQsIGkpKQ0KLSAgICAgICAgfHwgZDNfc3ZnX3N5bWJvbENpcmNsZSkNCi0gICAgICAgIChzaXplLmNhbGwodGhpcywgZCwgaSkpOw0KLSAgfQ0KLQ0KLSAgc3ltYm9sLnR5cGUgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHR5cGU7DQotICAgIHR5cGUgPSBkMy5mdW5jdG9yKHgpOw0KLSAgICByZXR1cm4gc3ltYm9sOw0KLSAgfTsNCi0NCi0gIC8vIHNpemUgb2Ygc3ltYm9sIGluIHNxdWFyZSBwaXhlbHMNCi0gIHN5bWJvbC5zaXplID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOw0KLSAgICBzaXplID0gZDMuZnVuY3Rvcih4KTsNCi0gICAgcmV0dXJuIHN5bWJvbDsNCi0gIH07DQotDQotICByZXR1cm4gc3ltYm9sOw0KLX07DQotDQotZnVuY3Rpb24gZDNfc3ZnX3N5bWJvbFNpemUoKSB7DQotICByZXR1cm4gNjQ7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3N2Z19zeW1ib2xUeXBlKCkgew0KLSAgcmV0dXJuICJjaXJjbGUiOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19zdmdfc3ltYm9sQ2lyY2xlKHNpemUpIHsNCi0gIHZhciByID0gTWF0aC5zcXJ0KHNpemUgLyBNYXRoLlBJKTsNCi0gIHJldHVybiAiTTAsIiArIHINCi0gICAgICArICJBIiArIHIgKyAiLCIgKyByICsgIiAwIDEsMSAwLCIgKyAoLXIpDQotICAgICAgKyAiQSIgKyByICsgIiwiICsgciArICIgMCAxLDEgMCwiICsgcg0KLSAgICAgICsgIloiOw0KLX0NCi0NCi0vLyBUT0RPIGNyb3NzLWRpYWdvbmFsPw0KLXZhciBkM19zdmdfc3ltYm9scyA9IGQzLm1hcCh7DQotICAiY2lyY2xlIjogZDNfc3ZnX3N5bWJvbENpcmNsZSwNCi0gICJjcm9zcyI6IGZ1bmN0aW9uKHNpemUpIHsNCi0gICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIDUpIC8gMjsNCi0gICAgcmV0dXJuICJNIiArIC0zICogciArICIsIiArIC1yDQotICAgICAgICArICJIIiArIC1yDQotICAgICAgICArICJWIiArIC0zICogcg0KLSAgICAgICAgKyAiSCIgKyByDQotICAgICAgICArICJWIiArIC1yDQotICAgICAgICArICJIIiArIDMgKiByDQotICAgICAgICArICJWIiArIHINCi0gICAgICAgICsgIkgiICsgcg0KLSAgICAgICAgKyAiViIgKyAzICogcg0KLSAgICAgICAgKyAiSCIgKyAtcg0KLSAgICAgICAgKyAiViIgKyByDQotICAgICAgICArICJIIiArIC0zICogcg0KLSAgICAgICAgKyAiWiI7DQotICB9LA0KLSAgImRpYW1vbmQiOiBmdW5jdGlvbihzaXplKSB7DQotICAgIHZhciByeSA9IE1hdGguc3FydChzaXplIC8gKDIgKiBkM19zdmdfc3ltYm9sVGFuMzApKSwNCi0gICAgICAgIHJ4ID0gcnkgKiBkM19zdmdfc3ltYm9sVGFuMzA7DQotICAgIHJldHVybiAiTTAsIiArIC1yeQ0KLSAgICAgICAgKyAiTCIgKyByeCArICIsMCINCi0gICAgICAgICsgIiAwLCIgKyByeQ0KLSAgICAgICAgKyAiICIgKyAtcnggKyAiLDAiDQotICAgICAgICArICJaIjsNCi0gIH0sDQotICAic3F1YXJlIjogZnVuY3Rpb24oc2l6ZSkgew0KLSAgICB2YXIgciA9IE1hdGguc3FydChzaXplKSAvIDI7DQotICAgIHJldHVybiAiTSIgKyAtciArICIsIiArIC1yDQotICAgICAgICArICJMIiArIHIgKyAiLCIgKyAtcg0KLSAgICAgICAgKyAiICIgKyByICsgIiwiICsgcg0KLSAgICAgICAgKyAiICIgKyAtciArICIsIiArIHINCi0gICAgICAgICsgIloiOw0KLSAgfSwNCi0gICJ0cmlhbmdsZS1kb3duIjogZnVuY3Rpb24oc2l6ZSkgew0KLSAgICB2YXIgcnggPSBNYXRoLnNxcnQoc2l6ZSAvIGQzX3N2Z19zeW1ib2xTcXJ0MyksDQotICAgICAgICByeSA9IHJ4ICogZDNfc3ZnX3N5bWJvbFNxcnQzIC8gMjsNCi0gICAgcmV0dXJuICJNMCwiICsgcnkNCi0gICAgICAgICsgIkwiICsgcnggKyIsIiArIC1yeQ0KLSAgICAgICAgKyAiICIgKyAtcnggKyAiLCIgKyAtcnkNCi0gICAgICAgICsgIloiOw0KLSAgfSwNCi0gICJ0cmlhbmdsZS11cCI6IGZ1bmN0aW9uKHNpemUpIHsNCi0gICAgdmFyIHJ4ID0gTWF0aC5zcXJ0KHNpemUgLyBkM19zdmdfc3ltYm9sU3FydDMpLA0KLSAgICAgICAgcnkgPSByeCAqIGQzX3N2Z19zeW1ib2xTcXJ0MyAvIDI7DQotICAgIHJldHVybiAiTTAsIiArIC1yeQ0KLSAgICAgICAgKyAiTCIgKyByeCArIiwiICsgcnkNCi0gICAgICAgICsgIiAiICsgLXJ4ICsgIiwiICsgcnkNCi0gICAgICAgICsgIloiOw0KLSAgfQ0KLX0pOw0KLQ0KLWQzLnN2Zy5zeW1ib2xUeXBlcyA9IGQzX3N2Z19zeW1ib2xzLmtleXMoKTsNCi0NCi12YXIgZDNfc3ZnX3N5bWJvbFNxcnQzID0gTWF0aC5zcXJ0KDMpLA0KLSAgICBkM19zdmdfc3ltYm9sVGFuMzAgPSBNYXRoLnRhbigzMCAqIE1hdGguUEkgLyAxODApOw0KLWQzLnN2Zy5heGlzID0gZnVuY3Rpb24oKSB7DQotICB2YXIgc2NhbGUgPSBkMy5zY2FsZS5saW5lYXIoKSwNCi0gICAgICBvcmllbnQgPSAiYm90dG9tIiwNCi0gICAgICB0aWNrTWFqb3JTaXplID0gNiwNCi0gICAgICB0aWNrTWlub3JTaXplID0gNiwNCi0gICAgICB0aWNrRW5kU2l6ZSA9IDYsDQotICAgICAgdGlja1BhZGRpbmcgPSAzLA0KLSAgICAgIHRpY2tBcmd1bWVudHNfID0gWzEwXSwNCi0gICAgICB0aWNrVmFsdWVzID0gbnVsbCwNCi0gICAgICB0aWNrRm9ybWF0XywNCi0gICAgICB0aWNrU3ViZGl2aWRlID0gMDsNCi0NCi0gIGZ1bmN0aW9uIGF4aXMoZykgew0KLSAgICBnLmVhY2goZnVuY3Rpb24oKSB7DQotICAgICAgdmFyIGcgPSBkMy5zZWxlY3QodGhpcyk7DQotDQotICAgICAgLy8gVGlja3MsIG9yIGRvbWFpbiB2YWx1ZXMgZm9yIG9yZGluYWwgc2NhbGVzLg0KLSAgICAgIHZhciB0aWNrcyA9IHRpY2tWYWx1ZXMgPT0gbnVsbCA/IChzY2FsZS50aWNrcyA/IHNjYWxlLnRpY2tzLmFwcGx5KHNjYWxlLCB0aWNrQXJndW1lbnRzXykgOiBzY2FsZS5kb21haW4oKSkgOiB0aWNrVmFsdWVzLA0KLSAgICAgICAgICB0aWNrRm9ybWF0ID0gdGlja0Zvcm1hdF8gPT0gbnVsbCA/IChzY2FsZS50aWNrRm9ybWF0ID8gc2NhbGUudGlja0Zvcm1hdC5hcHBseShzY2FsZSwgdGlja0FyZ3VtZW50c18pIDogU3RyaW5nKSA6IHRpY2tGb3JtYXRfOw0KLQ0KLSAgICAgIC8vIE1pbm9yIHRpY2tzLg0KLSAgICAgIHZhciBzdWJ0aWNrcyA9IGQzX3N2Z19heGlzU3ViZGl2aWRlKHNjYWxlLCB0aWNrcywgdGlja1N1YmRpdmlkZSksDQotICAgICAgICAgIHN1YnRpY2sgPSBnLnNlbGVjdEFsbCgiLm1pbm9yIikuZGF0YShzdWJ0aWNrcywgU3RyaW5nKSwNCi0gICAgICAgICAgc3VidGlja0VudGVyID0gc3VidGljay5lbnRlcigpLmluc2VydCgibGluZSIsICJnIikuYXR0cigiY2xhc3MiLCAidGljayBtaW5vciIpLnN0eWxlKCJvcGFjaXR5IiwgMWUtNiksDQotICAgICAgICAgIHN1YnRpY2tFeGl0ID0gZDMudHJhbnNpdGlvbihzdWJ0aWNrLmV4aXQoKSkuc3R5bGUoIm9wYWNpdHkiLCAxZS02KS5yZW1vdmUoKSwNCi0gICAgICAgICAgc3VidGlja1VwZGF0ZSA9IGQzLnRyYW5zaXRpb24oc3VidGljaykuc3R5bGUoIm9wYWNpdHkiLCAxKTsNCi0NCi0gICAgICAvLyBNYWpvciB0aWNrcy4NCi0gICAgICB2YXIgdGljayA9IGcuc2VsZWN0QWxsKCJnIikuZGF0YSh0aWNrcywgU3RyaW5nKSwNCi0gICAgICAgICAgdGlja0VudGVyID0gdGljay5lbnRlcigpLmluc2VydCgiZyIsICJwYXRoIikuc3R5bGUoIm9wYWNpdHkiLCAxZS02KSwNCi0gICAgICAgICAgdGlja0V4aXQgPSBkMy50cmFuc2l0aW9uKHRpY2suZXhpdCgpKS5zdHlsZSgib3BhY2l0eSIsIDFlLTYpLnJlbW92ZSgpLA0KLSAgICAgICAgICB0aWNrVXBkYXRlID0gZDMudHJhbnNpdGlvbih0aWNrKS5zdHlsZSgib3BhY2l0eSIsIDEpLA0KLSAgICAgICAgICB0aWNrVHJhbnNmb3JtOw0KLQ0KLSAgICAgIC8vIERvbWFpbi4NCi0gICAgICB2YXIgcmFuZ2UgPSBkM19zY2FsZVJhbmdlKHNjYWxlKSwNCi0gICAgICAgICAgcGF0aCA9IGcuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbMF0pLA0KLSAgICAgICAgICBwYXRoRW50ZXIgPSBwYXRoLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCAiZG9tYWluIiksDQotICAgICAgICAgIHBhdGhVcGRhdGUgPSBkMy50cmFuc2l0aW9uKHBhdGgpOw0KLQ0KLSAgICAgIC8vIFN0YXNoIGEgc25hcHNob3Qgb2YgdGhlIG5ldyBzY2FsZSwgYW5kIHJldHJpZXZlIHRoZSBvbGQgc25hcHNob3QuDQotICAgICAgdmFyIHNjYWxlMSA9IHNjYWxlLmNvcHkoKSwNCi0gICAgICAgICAgc2NhbGUwID0gdGhpcy5fX2NoYXJ0X18gfHwgc2NhbGUxOw0KLSAgICAgIHRoaXMuX19jaGFydF9fID0gc2NhbGUxOw0KLQ0KLSAgICAgIHRpY2tFbnRlci5hcHBlbmQoImxpbmUiKS5hdHRyKCJjbGFzcyIsICJ0aWNrIik7DQotICAgICAgdGlja0VudGVyLmFwcGVuZCgidGV4dCIpOw0KLSAgICAgIHRpY2tVcGRhdGUuc2VsZWN0KCJ0ZXh0IikudGV4dCh0aWNrRm9ybWF0KTsNCi0NCi0gICAgICBzd2l0Y2ggKG9yaWVudCkgew0KLSAgICAgICAgY2FzZSAiYm90dG9tIjogew0KLSAgICAgICAgICB0aWNrVHJhbnNmb3JtID0gZDNfc3ZnX2F4aXNYOw0KLSAgICAgICAgICBzdWJ0aWNrRW50ZXIuYXR0cigieTIiLCB0aWNrTWlub3JTaXplKTsNCi0gICAgICAgICAgc3VidGlja1VwZGF0ZS5hdHRyKCJ4MiIsIDApLmF0dHIoInkyIiwgdGlja01pbm9yU2l6ZSk7DQotICAgICAgICAgIHRpY2tFbnRlci5zZWxlY3QoImxpbmUiKS5hdHRyKCJ5MiIsIHRpY2tNYWpvclNpemUpOw0KLSAgICAgICAgICB0aWNrRW50ZXIuc2VsZWN0KCJ0ZXh0IikuYXR0cigieSIsIE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpOw0KLSAgICAgICAgICB0aWNrVXBkYXRlLnNlbGVjdCgibGluZSIpLmF0dHIoIngyIiwgMCkuYXR0cigieTIiLCB0aWNrTWFqb3JTaXplKTsNCi0gICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoInRleHQiKS5hdHRyKCJ4IiwgMCkuYXR0cigieSIsIE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpLmF0dHIoImR5IiwgIi43MWVtIikuYXR0cigidGV4dC1hbmNob3IiLCAibWlkZGxlIik7DQotICAgICAgICAgIHBhdGhVcGRhdGUuYXR0cigiZCIsICJNIiArIHJhbmdlWzBdICsgIiwiICsgdGlja0VuZFNpemUgKyAiVjBIIiArIHJhbmdlWzFdICsgIlYiICsgdGlja0VuZFNpemUpOw0KLSAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhc2UgInRvcCI6IHsNCi0gICAgICAgICAgdGlja1RyYW5zZm9ybSA9IGQzX3N2Z19heGlzWDsNCi0gICAgICAgICAgc3VidGlja0VudGVyLmF0dHIoInkyIiwgLXRpY2tNaW5vclNpemUpOw0KLSAgICAgICAgICBzdWJ0aWNrVXBkYXRlLmF0dHIoIngyIiwgMCkuYXR0cigieTIiLCAtdGlja01pbm9yU2l6ZSk7DQotICAgICAgICAgIHRpY2tFbnRlci5zZWxlY3QoImxpbmUiKS5hdHRyKCJ5MiIsIC10aWNrTWFqb3JTaXplKTsNCi0gICAgICAgICAgdGlja0VudGVyLnNlbGVjdCgidGV4dCIpLmF0dHIoInkiLCAtKE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpKTsNCi0gICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoImxpbmUiKS5hdHRyKCJ4MiIsIDApLmF0dHIoInkyIiwgLXRpY2tNYWpvclNpemUpOw0KLSAgICAgICAgICB0aWNrVXBkYXRlLnNlbGVjdCgidGV4dCIpLmF0dHIoIngiLCAwKS5hdHRyKCJ5IiwgLShNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKSkuYXR0cigiZHkiLCAiMGVtIikuYXR0cigidGV4dC1hbmNob3IiLCAibWlkZGxlIik7DQotICAgICAgICAgIHBhdGhVcGRhdGUuYXR0cigiZCIsICJNIiArIHJhbmdlWzBdICsgIiwiICsgLXRpY2tFbmRTaXplICsgIlYwSCIgKyByYW5nZVsxXSArICJWIiArIC10aWNrRW5kU2l6ZSk7DQotICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2FzZSAibGVmdCI6IHsNCi0gICAgICAgICAgdGlja1RyYW5zZm9ybSA9IGQzX3N2Z19heGlzWTsNCi0gICAgICAgICAgc3VidGlja0VudGVyLmF0dHIoIngyIiwgLXRpY2tNaW5vclNpemUpOw0KLSAgICAgICAgICBzdWJ0aWNrVXBkYXRlLmF0dHIoIngyIiwgLXRpY2tNaW5vclNpemUpLmF0dHIoInkyIiwgMCk7DQotICAgICAgICAgIHRpY2tFbnRlci5zZWxlY3QoImxpbmUiKS5hdHRyKCJ4MiIsIC10aWNrTWFqb3JTaXplKTsNCi0gICAgICAgICAgdGlja0VudGVyLnNlbGVjdCgidGV4dCIpLmF0dHIoIngiLCAtKE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpKTsNCi0gICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoImxpbmUiKS5hdHRyKCJ4MiIsIC10aWNrTWFqb3JTaXplKS5hdHRyKCJ5MiIsIDApOw0KLSAgICAgICAgICB0aWNrVXBkYXRlLnNlbGVjdCgidGV4dCIpLmF0dHIoIngiLCAtKE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpKS5hdHRyKCJ5IiwgMCkuYXR0cigiZHkiLCAiLjMyZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsICJlbmQiKTsNCi0gICAgICAgICAgcGF0aFVwZGF0ZS5hdHRyKCJkIiwgIk0iICsgLXRpY2tFbmRTaXplICsgIiwiICsgcmFuZ2VbMF0gKyAiSDBWIiArIHJhbmdlWzFdICsgIkgiICsgLXRpY2tFbmRTaXplKTsNCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBjYXNlICJyaWdodCI6IHsNCi0gICAgICAgICAgdGlja1RyYW5zZm9ybSA9IGQzX3N2Z19heGlzWTsNCi0gICAgICAgICAgc3VidGlja0VudGVyLmF0dHIoIngyIiwgdGlja01pbm9yU2l6ZSk7DQotICAgICAgICAgIHN1YnRpY2tVcGRhdGUuYXR0cigieDIiLCB0aWNrTWlub3JTaXplKS5hdHRyKCJ5MiIsIDApOw0KLSAgICAgICAgICB0aWNrRW50ZXIuc2VsZWN0KCJsaW5lIikuYXR0cigieDIiLCB0aWNrTWFqb3JTaXplKTsNCi0gICAgICAgICAgdGlja0VudGVyLnNlbGVjdCgidGV4dCIpLmF0dHIoIngiLCBNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKTsNCi0gICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoImxpbmUiKS5hdHRyKCJ4MiIsIHRpY2tNYWpvclNpemUpLmF0dHIoInkyIiwgMCk7DQotICAgICAgICAgIHRpY2tVcGRhdGUuc2VsZWN0KCJ0ZXh0IikuYXR0cigieCIsIE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpLmF0dHIoInkiLCAwKS5hdHRyKCJkeSIsICIuMzJlbSIpLmF0dHIoInRleHQtYW5jaG9yIiwgInN0YXJ0Iik7DQotICAgICAgICAgIHBhdGhVcGRhdGUuYXR0cigiZCIsICJNIiArIHRpY2tFbmRTaXplICsgIiwiICsgcmFuZ2VbMF0gKyAiSDBWIiArIHJhbmdlWzFdICsgIkgiICsgdGlja0VuZFNpemUpOw0KLSAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotICAgICAgLy8gRm9yIHF1YW50aXRhdGl2ZSBzY2FsZXM6DQotICAgICAgLy8gLSBlbnRlciBuZXcgdGlja3MgZnJvbSB0aGUgb2xkIHNjYWxlDQotICAgICAgLy8gLSBleGl0IG9sZCB0aWNrcyB0byB0aGUgbmV3IHNjYWxlDQotICAgICAgaWYgKHNjYWxlLnRpY2tzKSB7DQotICAgICAgICB0aWNrRW50ZXIuY2FsbCh0aWNrVHJhbnNmb3JtLCBzY2FsZTApOw0KLSAgICAgICAgdGlja1VwZGF0ZS5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSk7DQotICAgICAgICB0aWNrRXhpdC5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSk7DQotICAgICAgICBzdWJ0aWNrRW50ZXIuY2FsbCh0aWNrVHJhbnNmb3JtLCBzY2FsZTApOw0KLSAgICAgICAgc3VidGlja1VwZGF0ZS5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSk7DQotICAgICAgICBzdWJ0aWNrRXhpdC5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSk7DQotICAgICAgfQ0KLQ0KLSAgICAgIC8vIEZvciBvcmRpbmFsIHNjYWxlczoNCi0gICAgICAvLyAtIGFueSBlbnRlcmluZyB0aWNrcyBhcmUgdW5kZWZpbmVkIGluIHRoZSBvbGQgc2NhbGUNCi0gICAgICAvLyAtIGFueSBleGl0aW5nIHRpY2tzIGFyZSB1bmRlZmluZWQgaW4gdGhlIG5ldyBzY2FsZQ0KLSAgICAgIC8vIFRoZXJlZm9yZSwgd2Ugb25seSBuZWVkIHRvIHRyYW5zaXRpb24gdXBkYXRpbmcgdGlja3MuDQotICAgICAgZWxzZSB7DQotICAgICAgICB2YXIgZHggPSBzY2FsZTEucmFuZ2VCYW5kKCkgLyAyLCB4ID0gZnVuY3Rpb24oZCkgeyByZXR1cm4gc2NhbGUxKGQpICsgZHg7IH07DQotICAgICAgICB0aWNrRW50ZXIuY2FsbCh0aWNrVHJhbnNmb3JtLCB4KTsNCi0gICAgICAgIHRpY2tVcGRhdGUuY2FsbCh0aWNrVHJhbnNmb3JtLCB4KTsNCi0gICAgICB9DQotICAgIH0pOw0KLSAgfQ0KLQ0KLSAgYXhpcy5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2NhbGU7DQotICAgIHNjYWxlID0geDsNCi0gICAgcmV0dXJuIGF4aXM7DQotICB9Ow0KLQ0KLSAgYXhpcy5vcmllbnQgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yaWVudDsNCi0gICAgb3JpZW50ID0geDsNCi0gICAgcmV0dXJuIGF4aXM7DQotICB9Ow0KLQ0KLSAgYXhpcy50aWNrcyA9IGZ1bmN0aW9uKCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aWNrQXJndW1lbnRzXzsNCi0gICAgdGlja0FyZ3VtZW50c18gPSBhcmd1bWVudHM7DQotICAgIHJldHVybiBheGlzOw0KLSAgfTsNCi0NCi0gIGF4aXMudGlja1ZhbHVlcyA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja1ZhbHVlczsNCi0gICAgdGlja1ZhbHVlcyA9IHg7DQotICAgIHJldHVybiBheGlzOw0KLSAgfTsNCi0NCi0gIGF4aXMudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja0Zvcm1hdF87DQotICAgIHRpY2tGb3JtYXRfID0geDsNCi0gICAgcmV0dXJuIGF4aXM7DQotICB9Ow0KLQ0KLSAgYXhpcy50aWNrU2l6ZSA9IGZ1bmN0aW9uKHgsIHksIHopIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja01ham9yU2l6ZTsNCi0gICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsNCi0gICAgdGlja01ham9yU2l6ZSA9ICt4Ow0KLSAgICB0aWNrTWlub3JTaXplID0gbiA+IDEgPyAreSA6IHRpY2tNYWpvclNpemU7DQotICAgIHRpY2tFbmRTaXplID0gbiA+IDAgPyArYXJndW1lbnRzW25dIDogdGlja01ham9yU2l6ZTsNCi0gICAgcmV0dXJuIGF4aXM7DQotICB9Ow0KLQ0KLSAgYXhpcy50aWNrUGFkZGluZyA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja1BhZGRpbmc7DQotICAgIHRpY2tQYWRkaW5nID0gK3g7DQotICAgIHJldHVybiBheGlzOw0KLSAgfTsNCi0NCi0gIGF4aXMudGlja1N1YmRpdmlkZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja1N1YmRpdmlkZTsNCi0gICAgdGlja1N1YmRpdmlkZSA9ICt4Ow0KLSAgICByZXR1cm4gYXhpczsNCi0gIH07DQotDQotICByZXR1cm4gYXhpczsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX3N2Z19heGlzWChzZWxlY3Rpb24sIHgpIHsNCi0gIHNlbGVjdGlvbi5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7IHJldHVybiAidHJhbnNsYXRlKCIgKyB4KGQpICsgIiwwKSI7IH0pOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19zdmdfYXhpc1koc2VsZWN0aW9uLCB5KSB7DQotICBzZWxlY3Rpb24uYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gInRyYW5zbGF0ZSgwLCIgKyB5KGQpICsgIikiOyB9KTsNCi19DQotDQotZnVuY3Rpb24gZDNfc3ZnX2F4aXNTdWJkaXZpZGUoc2NhbGUsIHRpY2tzLCBtKSB7DQotICBzdWJ0aWNrcyA9IFtdOw0KLSAgaWYgKG0gJiYgdGlja3MubGVuZ3RoID4gMSkgew0KLSAgICB2YXIgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQoc2NhbGUuZG9tYWluKCkpLA0KLSAgICAgICAgc3VidGlja3MsDQotICAgICAgICBpID0gLTEsDQotICAgICAgICBuID0gdGlja3MubGVuZ3RoLA0KLSAgICAgICAgZCA9ICh0aWNrc1sxXSAtIHRpY2tzWzBdKSAvICsrbSwNCi0gICAgICAgIGosDQotICAgICAgICB2Ow0KLSAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgIGZvciAoaiA9IG07IC0taiA+IDA7KSB7DQotICAgICAgICBpZiAoKHYgPSArdGlja3NbaV0gLSBqICogZCkgPj0gZXh0ZW50WzBdKSB7DQotICAgICAgICAgIHN1YnRpY2tzLnB1c2godik7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICAgIGZvciAoLS1pLCBqID0gMDsgKytqIDwgbSAmJiAodiA9ICt0aWNrc1tpXSArIGogKiBkKSA8IGV4dGVudFsxXTspIHsNCi0gICAgICBzdWJ0aWNrcy5wdXNoKHYpOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gc3VidGlja3M7DQotfQ0KLWQzLnN2Zy5icnVzaCA9IGZ1bmN0aW9uKCkgew0KLSAgdmFyIGV2ZW50ID0gZDNfZXZlbnREaXNwYXRjaChicnVzaCwgImJydXNoc3RhcnQiLCAiYnJ1c2giLCAiYnJ1c2hlbmQiKSwNCi0gICAgICB4ID0gbnVsbCwgLy8geC1zY2FsZSwgb3B0aW9uYWwNCi0gICAgICB5ID0gbnVsbCwgLy8geS1zY2FsZSwgb3B0aW9uYWwNCi0gICAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1swXSwNCi0gICAgICBleHRlbnQgPSBbWzAsIDBdLCBbMCwgMF1dLCAvLyBbeDAsIHkwXSwgW3gxLCB5MV0sIGluIHBpeGVscyAoaW50ZWdlcnMpDQotICAgICAgZXh0ZW50RG9tYWluOyAvLyB0aGUgZXh0ZW50IGluIGRhdGEgc3BhY2UsIGxhemlseSBjcmVhdGVkDQotDQotICBmdW5jdGlvbiBicnVzaChnKSB7DQotICAgIGcuZWFjaChmdW5jdGlvbigpIHsNCi0gICAgICB2YXIgZyA9IGQzLnNlbGVjdCh0aGlzKSwNCi0gICAgICAgICAgYmcgPSBnLnNlbGVjdEFsbCgiLmJhY2tncm91bmQiKS5kYXRhKFswXSksDQotICAgICAgICAgIGZnID0gZy5zZWxlY3RBbGwoIi5leHRlbnQiKS5kYXRhKFswXSksDQotICAgICAgICAgIHR6ID0gZy5zZWxlY3RBbGwoIi5yZXNpemUiKS5kYXRhKHJlc2l6ZXMsIFN0cmluZyksDQotICAgICAgICAgIGU7DQotDQotICAgICAgLy8gUHJlcGFyZSB0aGUgYnJ1c2ggY29udGFpbmVyIGZvciBldmVudHMuDQotICAgICAgZw0KLSAgICAgICAgICAuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwgImFsbCIpDQotICAgICAgICAgIC5vbigibW91c2Vkb3duLmJydXNoIiwgYnJ1c2hzdGFydCkNCi0gICAgICAgICAgLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIiwgYnJ1c2hzdGFydCk7DQotDQotICAgICAgLy8gQW4gaW52aXNpYmxlLCBtb3VzZWFibGUgYXJlYSBmb3Igc3RhcnRpbmcgYSBuZXcgYnJ1c2guDQotICAgICAgYmcuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQ0KLSAgICAgICAgICAuYXR0cigiY2xhc3MiLCAiYmFja2dyb3VuZCIpDQotICAgICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKQ0KLSAgICAgICAgICAuc3R5bGUoImN1cnNvciIsICJjcm9zc2hhaXIiKTsNCi0NCi0gICAgICAvLyBUaGUgdmlzaWJsZSBicnVzaCBleHRlbnQ7IHN0eWxlIHRoaXMgYXMgeW91IGxpa2UhDQotICAgICAgZmcuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQ0KLSAgICAgICAgICAuYXR0cigiY2xhc3MiLCAiZXh0ZW50IikNCi0gICAgICAgICAgLnN0eWxlKCJjdXJzb3IiLCAibW92ZSIpOw0KLQ0KLSAgICAgIC8vIE1vcmUgaW52aXNpYmxlIHJlY3RzIGZvciByZXNpemluZyB0aGUgZXh0ZW50Lg0KLSAgICAgIHR6LmVudGVyKCkuYXBwZW5kKCJnIikNCi0gICAgICAgICAgLmF0dHIoImNsYXNzIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gInJlc2l6ZSAiICsgZDsgfSkNCi0gICAgICAgICAgLnN0eWxlKCJjdXJzb3IiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkM19zdmdfYnJ1c2hDdXJzb3JbZF07IH0pDQotICAgICAgICAuYXBwZW5kKCJyZWN0IikNCi0gICAgICAgICAgLmF0dHIoIngiLCBmdW5jdGlvbihkKSB7IHJldHVybiAvW2V3XSQvLnRlc3QoZCkgPyAtMyA6IG51bGw7IH0pDQotICAgICAgICAgIC5hdHRyKCJ5IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gL15bbnNdLy50ZXN0KGQpID8gLTMgOiBudWxsOyB9KQ0KLSAgICAgICAgICAuYXR0cigid2lkdGgiLCA2KQ0KLSAgICAgICAgICAuYXR0cigiaGVpZ2h0IiwgNikNCi0gICAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOw0KLQ0KLSAgICAgIC8vIFNob3cgb3IgaGlkZSB0aGUgcmVzaXplcnMuDQotICAgICAgdHouc3R5bGUoImRpc3BsYXkiLCBicnVzaC5lbXB0eSgpID8gIm5vbmUiIDogbnVsbCk7DQotDQotICAgICAgLy8gUmVtb3ZlIGFueSBzdXBlcmZsdW91cyByZXNpemVycy4NCi0gICAgICB0ei5leGl0KCkucmVtb3ZlKCk7DQotDQotICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYmFja2dyb3VuZCB0byBmaWxsIHRoZSBkZWZpbmVkIHJhbmdlLg0KLSAgICAgIC8vIElmIHRoZSByYW5nZSBpc24ndCBkZWZpbmVkLCB5b3UgY2FuIHBvc3QtcHJvY2Vzcy4NCi0gICAgICBpZiAoeCkgew0KLSAgICAgICAgZSA9IGQzX3NjYWxlUmFuZ2UoeCk7DQotICAgICAgICBiZy5hdHRyKCJ4IiwgZVswXSkuYXR0cigid2lkdGgiLCBlWzFdIC0gZVswXSk7DQotICAgICAgICByZWRyYXdYKGcpOw0KLSAgICAgIH0NCi0gICAgICBpZiAoeSkgew0KLSAgICAgICAgZSA9IGQzX3NjYWxlUmFuZ2UoeSk7DQotICAgICAgICBiZy5hdHRyKCJ5IiwgZVswXSkuYXR0cigiaGVpZ2h0IiwgZVsxXSAtIGVbMF0pOw0KLSAgICAgICAgcmVkcmF3WShnKTsNCi0gICAgICB9DQotICAgICAgcmVkcmF3KGcpOw0KLSAgICB9KTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHJlZHJhdyhnKSB7DQotICAgIGcuc2VsZWN0QWxsKCIucmVzaXplIikuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgew0KLSAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyBleHRlbnRbKy9lJC8udGVzdChkKV1bMF0gKyAiLCIgKyBleHRlbnRbKy9ecy8udGVzdChkKV1bMV0gKyAiKSI7DQotICAgIH0pOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gcmVkcmF3WChnKSB7DQotICAgIGcuc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieCIsIGV4dGVudFswXVswXSk7DQotICAgIGcuc2VsZWN0QWxsKCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdCIpLmF0dHIoIndpZHRoIiwgZXh0ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdKTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHJlZHJhd1koZykgew0KLSAgICBnLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoInkiLCBleHRlbnRbMF1bMV0pOw0KLSAgICBnLnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLCBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0pOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gYnJ1c2hzdGFydCgpIHsNCi0gICAgdmFyIHRhcmdldCA9IHRoaXMsDQotICAgICAgICBldmVudFRhcmdldCA9IGQzLnNlbGVjdChkMy5ldmVudC50YXJnZXQpLA0KLSAgICAgICAgZXZlbnRfID0gZXZlbnQub2YodGFyZ2V0LCBhcmd1bWVudHMpLA0KLSAgICAgICAgZyA9IGQzLnNlbGVjdCh0YXJnZXQpLA0KLSAgICAgICAgcmVzaXppbmcgPSBldmVudFRhcmdldC5kYXR1bSgpLA0KLSAgICAgICAgcmVzaXppbmdYID0gIS9eKG58cykkLy50ZXN0KHJlc2l6aW5nKSAmJiB4LA0KLSAgICAgICAgcmVzaXppbmdZID0gIS9eKGV8dykkLy50ZXN0KHJlc2l6aW5nKSAmJiB5LA0KLSAgICAgICAgZHJhZ2dpbmcgPSBldmVudFRhcmdldC5jbGFzc2VkKCJleHRlbnQiKSwNCi0gICAgICAgIGNlbnRlciwNCi0gICAgICAgIG9yaWdpbiA9IG1vdXNlKCksDQotICAgICAgICBvZmZzZXQ7DQotDQotICAgIHZhciB3ID0gZDMuc2VsZWN0KHdpbmRvdykNCi0gICAgICAgIC5vbigibW91c2Vtb3ZlLmJydXNoIiwgYnJ1c2htb3ZlKQ0KLSAgICAgICAgLm9uKCJtb3VzZXVwLmJydXNoIiwgYnJ1c2hlbmQpDQotICAgICAgICAub24oInRvdWNobW92ZS5icnVzaCIsIGJydXNobW92ZSkNCi0gICAgICAgIC5vbigidG91Y2hlbmQuYnJ1c2giLCBicnVzaGVuZCkNCi0gICAgICAgIC5vbigia2V5ZG93bi5icnVzaCIsIGtleWRvd24pDQotICAgICAgICAub24oImtleXVwLmJydXNoIiwga2V5dXApOw0KLQ0KLSAgICAvLyBJZiB0aGUgZXh0ZW50IHdhcyBjbGlja2VkIG9uLCBkcmFnIHJhdGhlciB0aGFuIGJydXNoOw0KLSAgICAvLyBzdG9yZSB0aGUgcG9pbnQgYmV0d2VlbiB0aGUgbW91c2UgYW5kIGV4dGVudCBvcmlnaW4gaW5zdGVhZC4NCi0gICAgaWYgKGRyYWdnaW5nKSB7DQotICAgICAgb3JpZ2luWzBdID0gZXh0ZW50WzBdWzBdIC0gb3JpZ2luWzBdOw0KLSAgICAgIG9yaWdpblsxXSA9IGV4dGVudFswXVsxXSAtIG9yaWdpblsxXTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBJZiBhIHJlc2l6ZXIgd2FzIGNsaWNrZWQgb24sIHJlY29yZCB3aGljaCBzaWRlIGlzIHRvIGJlIHJlc2l6ZWQuDQotICAgIC8vIEFsc28sIHNldCB0aGUgb3JpZ2luIHRvIHRoZSBvcHBvc2l0ZSBzaWRlLg0KLSAgICBlbHNlIGlmIChyZXNpemluZykgew0KLSAgICAgIHZhciBleCA9ICsvdyQvLnRlc3QocmVzaXppbmcpLA0KLSAgICAgICAgICBleSA9ICsvXm4vLnRlc3QocmVzaXppbmcpOw0KLSAgICAgIG9mZnNldCA9IFtleHRlbnRbMSAtIGV4XVswXSAtIG9yaWdpblswXSwgZXh0ZW50WzEgLSBleV1bMV0gLSBvcmlnaW5bMV1dOw0KLSAgICAgIG9yaWdpblswXSA9IGV4dGVudFtleF1bMF07DQotICAgICAgb3JpZ2luWzFdID0gZXh0ZW50W2V5XVsxXTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBJZiB0aGUgQUxUIGtleSBpcyBkb3duIHdoZW4gc3RhcnRpbmcgYSBicnVzaCwgdGhlIGNlbnRlciBpcyBhdCB0aGUgbW91c2UuDQotICAgIGVsc2UgaWYgKGQzLmV2ZW50LmFsdEtleSkgY2VudGVyID0gb3JpZ2luLnNsaWNlKCk7DQotDQotICAgIC8vIFByb3BhZ2F0ZSB0aGUgYWN0aXZlIGN1cnNvciB0byB0aGUgYm9keSBmb3IgdGhlIGRyYWcgZHVyYXRpb24uDQotICAgIGcuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwgIm5vbmUiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsIG51bGwpOw0KLSAgICBkMy5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIiwgZXZlbnRUYXJnZXQuc3R5bGUoImN1cnNvciIpKTsNCi0NCi0gICAgLy8gTm90aWZ5IGxpc3RlbmVycy4NCi0gICAgZXZlbnRfKHt0eXBlOiAiYnJ1c2hzdGFydCJ9KTsNCi0gICAgYnJ1c2htb3ZlKCk7DQotICAgIGQzX2V2ZW50Q2FuY2VsKCk7DQotDQotICAgIGZ1bmN0aW9uIG1vdXNlKCkgew0KLSAgICAgIHZhciB0b3VjaGVzID0gZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXM7DQotICAgICAgcmV0dXJuIHRvdWNoZXMgPyBkMy50b3VjaGVzKHRhcmdldCwgdG91Y2hlcylbMF0gOiBkMy5tb3VzZSh0YXJnZXQpOw0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGtleWRvd24oKSB7DQotICAgICAgaWYgKGQzLmV2ZW50LmtleUNvZGUgPT0gMzIpIHsNCi0gICAgICAgIGlmICghZHJhZ2dpbmcpIHsNCi0gICAgICAgICAgY2VudGVyID0gbnVsbDsNCi0gICAgICAgICAgb3JpZ2luWzBdIC09IGV4dGVudFsxXVswXTsNCi0gICAgICAgICAgb3JpZ2luWzFdIC09IGV4dGVudFsxXVsxXTsNCi0gICAgICAgICAgZHJhZ2dpbmcgPSAyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZDNfZXZlbnRDYW5jZWwoKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24ga2V5dXAoKSB7DQotICAgICAgaWYgKGQzLmV2ZW50LmtleUNvZGUgPT0gMzIgJiYgZHJhZ2dpbmcgPT0gMikgew0KLSAgICAgICAgb3JpZ2luWzBdICs9IGV4dGVudFsxXVswXTsNCi0gICAgICAgIG9yaWdpblsxXSArPSBleHRlbnRbMV1bMV07DQotICAgICAgICBkcmFnZ2luZyA9IDA7DQotICAgICAgICBkM19ldmVudENhbmNlbCgpOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBicnVzaG1vdmUoKSB7DQotICAgICAgdmFyIHBvaW50ID0gbW91c2UoKSwNCi0gICAgICAgICAgbW92ZWQgPSBmYWxzZTsNCi0NCi0gICAgICAvLyBQcmVzZXJ2ZSB0aGUgb2Zmc2V0IGZvciB0aGljayByZXNpemVycy4NCi0gICAgICBpZiAob2Zmc2V0KSB7DQotICAgICAgICBwb2ludFswXSArPSBvZmZzZXRbMF07DQotICAgICAgICBwb2ludFsxXSArPSBvZmZzZXRbMV07DQotICAgICAgfQ0KLQ0KLSAgICAgIGlmICghZHJhZ2dpbmcpIHsNCi0NCi0gICAgICAgIC8vIElmIG5lZWRlZCwgZGV0ZXJtaW5lIHRoZSBjZW50ZXIgZnJvbSB0aGUgY3VycmVudCBleHRlbnQuDQotICAgICAgICBpZiAoZDMuZXZlbnQuYWx0S2V5KSB7DQotICAgICAgICAgIGlmICghY2VudGVyKSBjZW50ZXIgPSBbKGV4dGVudFswXVswXSArIGV4dGVudFsxXVswXSkgLyAyLCAoZXh0ZW50WzBdWzFdICsgZXh0ZW50WzFdWzFdKSAvIDJdOw0KLQ0KLSAgICAgICAgICAvLyBVcGRhdGUgdGhlIG9yaWdpbiwgZm9yIHdoZW4gdGhlIEFMVCBrZXkgaXMgcmVsZWFzZWQuDQotICAgICAgICAgIG9yaWdpblswXSA9IGV4dGVudFsrKHBvaW50WzBdIDwgY2VudGVyWzBdKV1bMF07DQotICAgICAgICAgIG9yaWdpblsxXSA9IGV4dGVudFsrKHBvaW50WzFdIDwgY2VudGVyWzFdKV1bMV07DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBXaGVuIHRoZSBBTFQga2V5IGlzIHJlbGVhc2VkLCB3ZSBjbGVhciB0aGUgY2VudGVyLg0KLSAgICAgICAgZWxzZSBjZW50ZXIgPSBudWxsOw0KLSAgICAgIH0NCi0NCi0gICAgICAvLyBVcGRhdGUgdGhlIGJydXNoIGV4dGVudCBmb3IgZWFjaCBkaW1lbnNpb24uDQotICAgICAgaWYgKHJlc2l6aW5nWCAmJiBtb3ZlMShwb2ludCwgeCwgMCkpIHsNCi0gICAgICAgIHJlZHJhd1goZyk7DQotICAgICAgICBtb3ZlZCA9IHRydWU7DQotICAgICAgfQ0KLSAgICAgIGlmIChyZXNpemluZ1kgJiYgbW92ZTEocG9pbnQsIHksIDEpKSB7DQotICAgICAgICByZWRyYXdZKGcpOw0KLSAgICAgICAgbW92ZWQgPSB0cnVlOw0KLSAgICAgIH0NCi0NCi0gICAgICAvLyBGaW5hbCByZWRyYXcgYW5kIG5vdGlmeSBsaXN0ZW5lcnMuDQotICAgICAgaWYgKG1vdmVkKSB7DQotICAgICAgICByZWRyYXcoZyk7DQotICAgICAgICBldmVudF8oe3R5cGU6ICJicnVzaCIsIG1vZGU6IGRyYWdnaW5nID8gIm1vdmUiIDogInJlc2l6ZSJ9KTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gbW92ZTEocG9pbnQsIHNjYWxlLCBpKSB7DQotICAgICAgdmFyIHJhbmdlID0gZDNfc2NhbGVSYW5nZShzY2FsZSksDQotICAgICAgICAgIHIwID0gcmFuZ2VbMF0sDQotICAgICAgICAgIHIxID0gcmFuZ2VbMV0sDQotICAgICAgICAgIHBvc2l0aW9uID0gb3JpZ2luW2ldLA0KLSAgICAgICAgICBzaXplID0gZXh0ZW50WzFdW2ldIC0gZXh0ZW50WzBdW2ldLA0KLSAgICAgICAgICBtaW4sDQotICAgICAgICAgIG1heDsNCi0NCi0gICAgICAvLyBXaGVuIGRyYWdnaW5nLCByZWR1Y2UgdGhlIHJhbmdlIGJ5IHRoZSBleHRlbnQgc2l6ZSBhbmQgcG9zaXRpb24uDQotICAgICAgaWYgKGRyYWdnaW5nKSB7DQotICAgICAgICByMCAtPSBwb3NpdGlvbjsNCi0gICAgICAgIHIxIC09IHNpemUgKyBwb3NpdGlvbjsNCi0gICAgICB9DQotDQotICAgICAgLy8gQ2xhbXAgdGhlIHBvaW50IHNvIHRoYXQgdGhlIGV4dGVudCBmaXRzIHdpdGhpbiB0aGUgcmFuZ2UgZXh0ZW50Lg0KLSAgICAgIG1pbiA9IE1hdGgubWF4KHIwLCBNYXRoLm1pbihyMSwgcG9pbnRbaV0pKTsNCi0NCi0gICAgICAvLyBDb21wdXRlIHRoZSBuZXcgZXh0ZW50IGJvdW5kcy4NCi0gICAgICBpZiAoZHJhZ2dpbmcpIHsNCi0gICAgICAgIG1heCA9IChtaW4gKz0gcG9zaXRpb24pICsgc2l6ZTsNCi0gICAgICB9IGVsc2Ugew0KLQ0KLSAgICAgICAgLy8gSWYgdGhlIEFMVCBrZXkgaXMgcHJlc3NlZCwgdGhlbiBwcmVzZXJ2ZSB0aGUgY2VudGVyIG9mIHRoZSBleHRlbnQuDQotICAgICAgICBpZiAoY2VudGVyKSBwb3NpdGlvbiA9IE1hdGgubWF4KHIwLCBNYXRoLm1pbihyMSwgMiAqIGNlbnRlcltpXSAtIG1pbikpOw0KLQ0KLSAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbWluIGFuZCBtYXggb2YgdGhlIHBvc2l0aW9uIGFuZCBwb2ludC4NCi0gICAgICAgIGlmIChwb3NpdGlvbiA8IG1pbikgew0KLSAgICAgICAgICBtYXggPSBtaW47DQotICAgICAgICAgIG1pbiA9IHBvc2l0aW9uOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgbWF4ID0gcG9zaXRpb247DQotICAgICAgICB9DQotICAgICAgfQ0KLQ0KLSAgICAgIC8vIFVwZGF0ZSB0aGUgc3RvcmVkIGJvdW5kcy4NCi0gICAgICBpZiAoZXh0ZW50WzBdW2ldICE9PSBtaW4gfHwgZXh0ZW50WzFdW2ldICE9PSBtYXgpIHsNCi0gICAgICAgIGV4dGVudERvbWFpbiA9IG51bGw7DQotICAgICAgICBleHRlbnRbMF1baV0gPSBtaW47DQotICAgICAgICBleHRlbnRbMV1baV0gPSBtYXg7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gYnJ1c2hlbmQoKSB7DQotICAgICAgYnJ1c2htb3ZlKCk7DQotDQotICAgICAgLy8gcmVzZXQgdGhlIGN1cnNvciBzdHlsZXMNCi0gICAgICBnLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsIGJydXNoLmVtcHR5KCkgPyAibm9uZSIgOiBudWxsKTsNCi0gICAgICBkMy5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIiwgbnVsbCk7DQotDQotICAgICAgdyAub24oIm1vdXNlbW92ZS5icnVzaCIsIG51bGwpDQotICAgICAgICAub24oIm1vdXNldXAuYnJ1c2giLCBudWxsKQ0KLSAgICAgICAgLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLCBudWxsKQ0KLSAgICAgICAgLm9uKCJ0b3VjaGVuZC5icnVzaCIsIG51bGwpDQotICAgICAgICAub24oImtleWRvd24uYnJ1c2giLCBudWxsKQ0KLSAgICAgICAgLm9uKCJrZXl1cC5icnVzaCIsIG51bGwpOw0KLQ0KLSAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoZW5kIn0pOw0KLSAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGJydXNoLnggPSBmdW5jdGlvbih6KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHg7DQotICAgIHggPSB6Ow0KLSAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1sheCA8PCAxIHwgIXldOyAvLyBmb3JlIQ0KLSAgICByZXR1cm4gYnJ1c2g7DQotICB9Ow0KLQ0KLSAgYnJ1c2gueSA9IGZ1bmN0aW9uKHopIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTsNCi0gICAgeSA9IHo7DQotICAgIHJlc2l6ZXMgPSBkM19zdmdfYnJ1c2hSZXNpemVzWyF4IDw8IDEgfCAheV07IC8vIGZvcmUhDQotICAgIHJldHVybiBicnVzaDsNCi0gIH07DQotDQotICBicnVzaC5leHRlbnQgPSBmdW5jdGlvbih6KSB7DQotICAgIHZhciB4MCwgeDEsIHkwLCB5MSwgdDsNCi0NCi0gICAgLy8gSW52ZXJ0IHRoZSBwaXhlbCBleHRlbnQgdG8gZGF0YS1zcGFjZS4NCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7DQotICAgICAgeiA9IGV4dGVudERvbWFpbiB8fCBleHRlbnQ7DQotICAgICAgaWYgKHgpIHsNCi0gICAgICAgIHgwID0gelswXVswXSwgeDEgPSB6WzFdWzBdOw0KLSAgICAgICAgaWYgKCFleHRlbnREb21haW4pIHsNCi0gICAgICAgICAgeDAgPSBleHRlbnRbMF1bMF0sIHgxID0gZXh0ZW50WzFdWzBdOw0KLSAgICAgICAgICBpZiAoeC5pbnZlcnQpIHgwID0geC5pbnZlcnQoeDApLCB4MSA9IHguaW52ZXJ0KHgxKTsNCi0gICAgICAgICAgaWYgKHgxIDwgeDApIHQgPSB4MCwgeDAgPSB4MSwgeDEgPSB0Ow0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICBpZiAoeSkgew0KLSAgICAgICAgeTAgPSB6WzBdWzFdLCB5MSA9IHpbMV1bMV07DQotICAgICAgICBpZiAoIWV4dGVudERvbWFpbikgew0KLSAgICAgICAgICB5MCA9IGV4dGVudFswXVsxXSwgeTEgPSBleHRlbnRbMV1bMV07DQotICAgICAgICAgIGlmICh5LmludmVydCkgeTAgPSB5LmludmVydCh5MCksIHkxID0geS5pbnZlcnQoeTEpOw0KLSAgICAgICAgICBpZiAoeTEgPCB5MCkgdCA9IHkwLCB5MCA9IHkxLCB5MSA9IHQ7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB4ICYmIHkgPyBbW3gwLCB5MF0sIFt4MSwgeTFdXSA6IHggPyBbeDAsIHgxXSA6IHkgJiYgW3kwLCB5MV07DQotICAgIH0NCi0NCi0gICAgLy8gU2NhbGUgdGhlIGRhdGEtc3BhY2UgZXh0ZW50IHRvIHBpeGVscy4NCi0gICAgZXh0ZW50RG9tYWluID0gW1swLCAwXSwgWzAsIDBdXTsNCi0gICAgaWYgKHgpIHsNCi0gICAgICB4MCA9IHpbMF0sIHgxID0gelsxXTsNCi0gICAgICBpZiAoeSkgeDAgPSB4MFswXSwgeDEgPSB4MVswXTsNCi0gICAgICBleHRlbnREb21haW5bMF1bMF0gPSB4MCwgZXh0ZW50RG9tYWluWzFdWzBdID0geDE7DQotICAgICAgaWYgKHguaW52ZXJ0KSB4MCA9IHgoeDApLCB4MSA9IHgoeDEpOw0KLSAgICAgIGlmICh4MSA8IHgwKSB0ID0geDAsIHgwID0geDEsIHgxID0gdDsNCi0gICAgICBleHRlbnRbMF1bMF0gPSB4MCB8IDAsIGV4dGVudFsxXVswXSA9IHgxIHwgMDsNCi0gICAgfQ0KLSAgICBpZiAoeSkgew0KLSAgICAgIHkwID0gelswXSwgeTEgPSB6WzFdOw0KLSAgICAgIGlmICh4KSB5MCA9IHkwWzFdLCB5MSA9IHkxWzFdOw0KLSAgICAgIGV4dGVudERvbWFpblswXVsxXSA9IHkwLCBleHRlbnREb21haW5bMV1bMV0gPSB5MTsNCi0gICAgICBpZiAoeS5pbnZlcnQpIHkwID0geSh5MCksIHkxID0geSh5MSk7DQotICAgICAgaWYgKHkxIDwgeTApIHQgPSB5MCwgeTAgPSB5MSwgeTEgPSB0Ow0KLSAgICAgIGV4dGVudFswXVsxXSA9IHkwIHwgMCwgZXh0ZW50WzFdWzFdID0geTEgfCAwOw0KLSAgICB9DQotDQotICAgIHJldHVybiBicnVzaDsNCi0gIH07DQotDQotICBicnVzaC5jbGVhciA9IGZ1bmN0aW9uKCkgew0KLSAgICBleHRlbnREb21haW4gPSBudWxsOw0KLSAgICBleHRlbnRbMF1bMF0gPQ0KLSAgICBleHRlbnRbMF1bMV0gPQ0KLSAgICBleHRlbnRbMV1bMF0gPQ0KLSAgICBleHRlbnRbMV1bMV0gPSAwOw0KLSAgICByZXR1cm4gYnJ1c2g7DQotICB9Ow0KLQ0KLSAgYnJ1c2guZW1wdHkgPSBmdW5jdGlvbigpIHsNCi0gICAgcmV0dXJuICh4ICYmIGV4dGVudFswXVswXSA9PT0gZXh0ZW50WzFdWzBdKQ0KLSAgICAgICAgfHwgKHkgJiYgZXh0ZW50WzBdWzFdID09PSBleHRlbnRbMV1bMV0pOw0KLSAgfTsNCi0NCi0gIHJldHVybiBkMy5yZWJpbmQoYnJ1c2gsIGV2ZW50LCAib24iKTsNCi19Ow0KLQ0KLXZhciBkM19zdmdfYnJ1c2hDdXJzb3IgPSB7DQotICBuOiAibnMtcmVzaXplIiwNCi0gIGU6ICJldy1yZXNpemUiLA0KLSAgczogIm5zLXJlc2l6ZSIsDQotICB3OiAiZXctcmVzaXplIiwNCi0gIG53OiAibndzZS1yZXNpemUiLA0KLSAgbmU6ICJuZXN3LXJlc2l6ZSIsDQotICBzZTogIm53c2UtcmVzaXplIiwNCi0gIHN3OiAibmVzdy1yZXNpemUiDQotfTsNCi0NCi12YXIgZDNfc3ZnX2JydXNoUmVzaXplcyA9IFsNCi0gIFsibiIsICJlIiwgInMiLCAidyIsICJudyIsICJuZSIsICJzZSIsICJzdyJdLA0KLSAgWyJlIiwgInciXSwNCi0gIFsibiIsICJzIl0sDQotICBbXQ0KLV07DQotZDMuYmVoYXZpb3IgPSB7fTsNCi0vLyBUT0RPIFRyYWNrIHRvdWNoIHBvaW50cyBieSBpZGVudGlmaWVyLg0KLQ0KLWQzLmJlaGF2aW9yLmRyYWcgPSBmdW5jdGlvbigpIHsNCi0gIHZhciBldmVudCA9IGQzX2V2ZW50RGlzcGF0Y2goZHJhZywgImRyYWciLCAiZHJhZ3N0YXJ0IiwgImRyYWdlbmQiKSwNCi0gICAgICBvcmlnaW4gPSBudWxsOw0KLQ0KLSAgZnVuY3Rpb24gZHJhZygpIHsNCi0gICAgdGhpcy5vbigibW91c2Vkb3duLmRyYWciLCBtb3VzZWRvd24pDQotICAgICAgICAub24oInRvdWNoc3RhcnQuZHJhZyIsIG1vdXNlZG93bik7DQotICB9DQotDQotICBmdW5jdGlvbiBtb3VzZWRvd24oKSB7DQotICAgIHZhciB0YXJnZXQgPSB0aGlzLA0KLSAgICAgICAgZXZlbnRfID0gZXZlbnQub2YodGFyZ2V0LCBhcmd1bWVudHMpLA0KLSAgICAgICAgZXZlbnRUYXJnZXQgPSBkMy5ldmVudC50YXJnZXQsDQotICAgICAgICBvZmZzZXQsDQotICAgICAgICBvcmlnaW5fID0gcG9pbnQoKSwNCi0gICAgICAgIG1vdmVkID0gMDsNCi0NCi0gICAgdmFyIHcgPSBkMy5zZWxlY3Qod2luZG93KQ0KLSAgICAgICAgLm9uKCJtb3VzZW1vdmUuZHJhZyIsIGRyYWdtb3ZlKQ0KLSAgICAgICAgLm9uKCJ0b3VjaG1vdmUuZHJhZyIsIGRyYWdtb3ZlKQ0KLSAgICAgICAgLm9uKCJtb3VzZXVwLmRyYWciLCBkcmFnZW5kLCB0cnVlKQ0KLSAgICAgICAgLm9uKCJ0b3VjaGVuZC5kcmFnIiwgZHJhZ2VuZCwgdHJ1ZSk7DQotDQotICAgIGlmIChvcmlnaW4pIHsNCi0gICAgICBvZmZzZXQgPSBvcmlnaW4uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOw0KLSAgICAgIG9mZnNldCA9IFtvZmZzZXQueCAtIG9yaWdpbl9bMF0sIG9mZnNldC55IC0gb3JpZ2luX1sxXV07DQotICAgIH0gZWxzZSB7DQotICAgICAgb2Zmc2V0ID0gWzAsIDBdOw0KLSAgICB9DQotDQotICAgIGV2ZW50Xyh7dHlwZTogImRyYWdzdGFydCJ9KTsNCi0NCi0gICAgZnVuY3Rpb24gcG9pbnQoKSB7DQotICAgICAgdmFyIHAgPSB0YXJnZXQucGFyZW50Tm9kZSwNCi0gICAgICAgICAgdCA9IGQzLmV2ZW50LmNoYW5nZWRUb3VjaGVzOw0KLSAgICAgIHJldHVybiB0ID8gZDMudG91Y2hlcyhwLCB0KVswXSA6IGQzLm1vdXNlKHApOw0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIGRyYWdtb3ZlKCkgew0KLSAgICAgIGlmICghdGFyZ2V0LnBhcmVudE5vZGUpIHJldHVybiBkcmFnZW5kKCk7IC8vIHRhcmdldCByZW1vdmVkIGZyb20gRE9NDQotDQotICAgICAgdmFyIHAgPSBwb2ludCgpLA0KLSAgICAgICAgICBkeCA9IHBbMF0gLSBvcmlnaW5fWzBdLA0KLSAgICAgICAgICBkeSA9IHBbMV0gLSBvcmlnaW5fWzFdOw0KLQ0KLSAgICAgIG1vdmVkIHw9IGR4IHwgZHk7DQotICAgICAgb3JpZ2luXyA9IHA7DQotICAgICAgZDNfZXZlbnRDYW5jZWwoKTsNCi0NCi0gICAgICBldmVudF8oe3R5cGU6ICJkcmFnIiwgeDogcFswXSArIG9mZnNldFswXSwgeTogcFsxXSArIG9mZnNldFsxXSwgZHg6IGR4LCBkeTogZHl9KTsNCi0gICAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBkcmFnZW5kKCkgew0KLSAgICAgIGV2ZW50Xyh7dHlwZTogImRyYWdlbmQifSk7DQotDQotICAgICAgLy8gaWYgbW92ZWQsIHByZXZlbnQgdGhlIG1vdXNldXAgKGFuZCBwb3NzaWJseSBjbGljaykgZnJvbSBwcm9wYWdhdGluZw0KLSAgICAgIGlmIChtb3ZlZCkgew0KLSAgICAgICAgZDNfZXZlbnRDYW5jZWwoKTsNCi0gICAgICAgIGlmIChkMy5ldmVudC50YXJnZXQgPT09IGV2ZW50VGFyZ2V0KSB3Lm9uKCJjbGljay5kcmFnIiwgY2xpY2ssIHRydWUpOw0KLSAgICAgIH0NCi0NCi0gICAgICB3IC5vbigibW91c2Vtb3ZlLmRyYWciLCBudWxsKQ0KLSAgICAgICAgLm9uKCJ0b3VjaG1vdmUuZHJhZyIsIG51bGwpDQotICAgICAgICAub24oIm1vdXNldXAuZHJhZyIsIG51bGwpDQotICAgICAgICAub24oInRvdWNoZW5kLmRyYWciLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBwcmV2ZW50IHRoZSBzdWJzZXF1ZW50IGNsaWNrIGZyb20gcHJvcGFnYXRpbmcgKGUuZy4sIGZvciBhbmNob3JzKQ0KLSAgICBmdW5jdGlvbiBjbGljaygpIHsNCi0gICAgICBkM19ldmVudENhbmNlbCgpOw0KLSAgICAgIHcub24oImNsaWNrLmRyYWciLCBudWxsKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZHJhZy5vcmlnaW4gPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yaWdpbjsNCi0gICAgb3JpZ2luID0geDsNCi0gICAgcmV0dXJuIGRyYWc7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGQzLnJlYmluZChkcmFnLCBldmVudCwgIm9uIik7DQotfTsNCi1kMy5iZWhhdmlvci56b29tID0gZnVuY3Rpb24oKSB7DQotICB2YXIgdHJhbnNsYXRlID0gWzAsIDBdLA0KLSAgICAgIHRyYW5zbGF0ZTAsIC8vIHRyYW5zbGF0ZSB3aGVuIHdlIHN0YXJ0ZWQgem9vbWluZyAodG8gYXZvaWQgZHJpZnQpDQotICAgICAgc2NhbGUgPSAxLA0KLSAgICAgIHNjYWxlMCwgLy8gc2NhbGUgd2hlbiB3ZSBzdGFydGVkIHRvdWNoaW5nDQotICAgICAgc2NhbGVFeHRlbnQgPSBkM19iZWhhdmlvcl96b29tSW5maW5pdHksDQotICAgICAgZXZlbnQgPSBkM19ldmVudERpc3BhdGNoKHpvb20sICJ6b29tIiksDQotICAgICAgeDAsDQotICAgICAgeDEsDQotICAgICAgeTAsDQotICAgICAgeTEsDQotICAgICAgdG91Y2h0aW1lOyAvLyB0aW1lIG9mIGxhc3QgdG91Y2hzdGFydCAodG8gZGV0ZWN0IGRvdWJsZS10YXApDQotDQotICBmdW5jdGlvbiB6b29tKCkgew0KLSAgICB0aGlzDQotICAgICAgICAub24oIm1vdXNlZG93bi56b29tIiwgbW91c2Vkb3duKQ0KLSAgICAgICAgLm9uKCJtb3VzZXdoZWVsLnpvb20iLCBtb3VzZXdoZWVsKQ0KLSAgICAgICAgLm9uKCJtb3VzZW1vdmUuem9vbSIsIG1vdXNlbW92ZSkNCi0gICAgICAgIC5vbigiRE9NTW91c2VTY3JvbGwuem9vbSIsIG1vdXNld2hlZWwpDQotICAgICAgICAub24oImRibGNsaWNrLnpvb20iLCBkYmxjbGljaykNCi0gICAgICAgIC5vbigidG91Y2hzdGFydC56b29tIiwgdG91Y2hzdGFydCkNCi0gICAgICAgIC5vbigidG91Y2htb3ZlLnpvb20iLCB0b3VjaG1vdmUpDQotICAgICAgICAub24oInRvdWNoZW5kLnpvb20iLCB0b3VjaHN0YXJ0KTsNCi0gIH0NCi0NCi0gIHpvb20udHJhbnNsYXRlID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0cmFuc2xhdGU7DQotICAgIHRyYW5zbGF0ZSA9IHgubWFwKE51bWJlcik7DQotICAgIHJldHVybiB6b29tOw0KLSAgfTsNCi0NCi0gIHpvb20uc2NhbGUgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlOw0KLSAgICBzY2FsZSA9ICt4Ow0KLSAgICByZXR1cm4gem9vbTsNCi0gIH07DQotDQotICB6b29tLnNjYWxlRXh0ZW50ID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZUV4dGVudDsNCi0gICAgc2NhbGVFeHRlbnQgPSB4ID09IG51bGwgPyBkM19iZWhhdmlvcl96b29tSW5maW5pdHkgOiB4Lm1hcChOdW1iZXIpOw0KLSAgICByZXR1cm4gem9vbTsNCi0gIH07DQotDQotICB6b29tLnggPSBmdW5jdGlvbih6KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxOw0KLSAgICB4MSA9IHo7DQotICAgIHgwID0gei5jb3B5KCk7DQotICAgIHJldHVybiB6b29tOw0KLSAgfTsNCi0NCi0gIHpvb20ueSA9IGZ1bmN0aW9uKHopIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTE7DQotICAgIHkxID0gejsNCi0gICAgeTAgPSB6LmNvcHkoKTsNCi0gICAgcmV0dXJuIHpvb207DQotICB9Ow0KLQ0KLSAgZnVuY3Rpb24gbG9jYXRpb24ocCkgew0KLSAgICByZXR1cm4gWyhwWzBdIC0gdHJhbnNsYXRlWzBdKSAvIHNjYWxlLCAocFsxXSAtIHRyYW5zbGF0ZVsxXSkgLyBzY2FsZV07DQotICB9DQotDQotICBmdW5jdGlvbiBwb2ludChsKSB7DQotICAgIHJldHVybiBbbFswXSAqIHNjYWxlICsgdHJhbnNsYXRlWzBdLCBsWzFdICogc2NhbGUgKyB0cmFuc2xhdGVbMV1dOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gc2NhbGVUbyhzKSB7DQotICAgIHNjYWxlID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBzKSk7DQotICB9DQotDQotICBmdW5jdGlvbiB0cmFuc2xhdGVUbyhwLCBsKSB7DQotICAgIGwgPSBwb2ludChsKTsNCi0gICAgdHJhbnNsYXRlWzBdICs9IHBbMF0gLSBsWzBdOw0KLSAgICB0cmFuc2xhdGVbMV0gKz0gcFsxXSAtIGxbMV07DQotICB9DQotDQotICBmdW5jdGlvbiBkaXNwYXRjaChldmVudCkgew0KLSAgICBpZiAoeDEpIHgxLmRvbWFpbih4MC5yYW5nZSgpLm1hcChmdW5jdGlvbih4KSB7IHJldHVybiAoeCAtIHRyYW5zbGF0ZVswXSkgLyBzY2FsZTsgfSkubWFwKHgwLmludmVydCkpOw0KLSAgICBpZiAoeTEpIHkxLmRvbWFpbih5MC5yYW5nZSgpLm1hcChmdW5jdGlvbih5KSB7IHJldHVybiAoeSAtIHRyYW5zbGF0ZVsxXSkgLyBzY2FsZTsgfSkubWFwKHkwLmludmVydCkpOw0KLSAgICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KLSAgICBldmVudCh7dHlwZTogInpvb20iLCBzY2FsZTogc2NhbGUsIHRyYW5zbGF0ZTogdHJhbnNsYXRlfSk7DQotICB9DQotDQotICBmdW5jdGlvbiBtb3VzZWRvd24oKSB7DQotICAgIHZhciB0YXJnZXQgPSB0aGlzLA0KLSAgICAgICAgZXZlbnRfID0gZXZlbnQub2YodGFyZ2V0LCBhcmd1bWVudHMpLA0KLSAgICAgICAgZXZlbnRUYXJnZXQgPSBkMy5ldmVudC50YXJnZXQsDQotICAgICAgICBtb3ZlZCA9IDAsDQotICAgICAgICB3ID0gZDMuc2VsZWN0KHdpbmRvdykub24oIm1vdXNlbW92ZS56b29tIiwgbW91c2Vtb3ZlKS5vbigibW91c2V1cC56b29tIiwgbW91c2V1cCksDQotICAgICAgICBsID0gbG9jYXRpb24oZDMubW91c2UodGFyZ2V0KSk7DQotDQotICAgIHdpbmRvdy5mb2N1cygpOw0KLSAgICBkM19ldmVudENhbmNlbCgpOw0KLQ0KLSAgICBmdW5jdGlvbiBtb3VzZW1vdmUoKSB7DQotICAgICAgbW92ZWQgPSAxOw0KLSAgICAgIHRyYW5zbGF0ZVRvKGQzLm1vdXNlKHRhcmdldCksIGwpOw0KLSAgICAgIGRpc3BhdGNoKGV2ZW50Xyk7DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gbW91c2V1cCgpIHsNCi0gICAgICBpZiAobW92ZWQpIGQzX2V2ZW50Q2FuY2VsKCk7DQotICAgICAgdy5vbigibW91c2Vtb3ZlLnpvb20iLCBudWxsKS5vbigibW91c2V1cC56b29tIiwgbnVsbCk7DQotICAgICAgaWYgKG1vdmVkICYmIGQzLmV2ZW50LnRhcmdldCA9PT0gZXZlbnRUYXJnZXQpIHcub24oImNsaWNrLnpvb20iLCBjbGljayk7DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gY2xpY2soKSB7DQotICAgICAgZDNfZXZlbnRDYW5jZWwoKTsNCi0gICAgICB3Lm9uKCJjbGljay56b29tIiwgbnVsbCk7DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIG1vdXNld2hlZWwoKSB7DQotICAgIGlmICghdHJhbnNsYXRlMCkgdHJhbnNsYXRlMCA9IGxvY2F0aW9uKGQzLm1vdXNlKHRoaXMpKTsNCi0gICAgc2NhbGVUbyhNYXRoLnBvdygyLCBkM19iZWhhdmlvcl96b29tRGVsdGEoKSAqIC4wMDIpICogc2NhbGUpOw0KLSAgICB0cmFuc2xhdGVUbyhkMy5tb3VzZSh0aGlzKSwgdHJhbnNsYXRlMCk7DQotICAgIGRpc3BhdGNoKGV2ZW50Lm9mKHRoaXMsIGFyZ3VtZW50cykpOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gbW91c2Vtb3ZlKCkgew0KLSAgICB0cmFuc2xhdGUwID0gbnVsbDsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGRibGNsaWNrKCkgew0KLSAgICB2YXIgcCA9IGQzLm1vdXNlKHRoaXMpLCBsID0gbG9jYXRpb24ocCk7DQotICAgIHNjYWxlVG8oZDMuZXZlbnQuc2hpZnRLZXkgPyBzY2FsZSAvIDIgOiBzY2FsZSAqIDIpOw0KLSAgICB0cmFuc2xhdGVUbyhwLCBsKTsNCi0gICAgZGlzcGF0Y2goZXZlbnQub2YodGhpcywgYXJndW1lbnRzKSk7DQotICB9DQotDQotICBmdW5jdGlvbiB0b3VjaHN0YXJ0KCkgew0KLSAgICB2YXIgdG91Y2hlcyA9IGQzLnRvdWNoZXModGhpcyksDQotICAgICAgICBub3cgPSBEYXRlLm5vdygpOw0KLQ0KLSAgICBzY2FsZTAgPSBzY2FsZTsNCi0gICAgdHJhbnNsYXRlMCA9IHt9Ow0KLSAgICB0b3VjaGVzLmZvckVhY2goZnVuY3Rpb24odCkgeyB0cmFuc2xhdGUwW3QuaWRlbnRpZmllcl0gPSBsb2NhdGlvbih0KTsgfSk7DQotICAgIGQzX2V2ZW50Q2FuY2VsKCk7DQotDQotICAgIGlmICgodG91Y2hlcy5sZW5ndGggPT09IDEpICYmIChub3cgLSB0b3VjaHRpbWUgPCA1MDApKSB7IC8vIGRibHRhcA0KLSAgICAgIHZhciBwID0gdG91Y2hlc1swXSwgbCA9IGxvY2F0aW9uKHRvdWNoZXNbMF0pOw0KLSAgICAgIHNjYWxlVG8oc2NhbGUgKiAyKTsNCi0gICAgICB0cmFuc2xhdGVUbyhwLCBsKTsNCi0gICAgICBkaXNwYXRjaChldmVudC5vZih0aGlzLCBhcmd1bWVudHMpKTsNCi0gICAgfQ0KLSAgICB0b3VjaHRpbWUgPSBub3c7DQotICB9DQotDQotICBmdW5jdGlvbiB0b3VjaG1vdmUoKSB7DQotICAgIHZhciB0b3VjaGVzID0gZDMudG91Y2hlcyh0aGlzKSwNCi0gICAgICAgIHAwID0gdG91Y2hlc1swXSwNCi0gICAgICAgIGwwID0gdHJhbnNsYXRlMFtwMC5pZGVudGlmaWVyXTsNCi0gICAgaWYgKHAxID0gdG91Y2hlc1sxXSkgew0KLSAgICAgIHZhciBwMSwgbDEgPSB0cmFuc2xhdGUwW3AxLmlkZW50aWZpZXJdOw0KLSAgICAgIHAwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSArIHAxWzFdKSAvIDJdOw0KLSAgICAgIGwwID0gWyhsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwxWzFdKSAvIDJdOw0KLSAgICAgIHNjYWxlVG8oZDMuZXZlbnQuc2NhbGUgKiBzY2FsZTApOw0KLSAgICB9DQotICAgIHRyYW5zbGF0ZVRvKHAwLCBsMCk7DQotICAgIGRpc3BhdGNoKGV2ZW50Lm9mKHRoaXMsIGFyZ3VtZW50cykpOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGQzLnJlYmluZCh6b29tLCBldmVudCwgIm9uIik7DQotfTsNCi0NCi12YXIgZDNfYmVoYXZpb3Jfem9vbURpdiwgLy8gZm9yIGludGVycHJldGluZyBtb3VzZXdoZWVsIGV2ZW50cw0KLSAgICBkM19iZWhhdmlvcl96b29tSW5maW5pdHkgPSBbMCwgSW5maW5pdHldOyAvLyBkZWZhdWx0IHNjYWxlIGV4dGVudA0KLQ0KLWZ1bmN0aW9uIGQzX2JlaGF2aW9yX3pvb21EZWx0YSgpIHsNCi0NCi0gIC8vIG1vdXNld2hlZWwgZXZlbnRzIGFyZSB0b3RhbGx5IGJyb2tlbiENCi0gIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MDQ0MQ0KLSAgLy8gbm90IG9ubHkgdGhhdCwgYnV0IENocm9tZSBhbmQgU2FmYXJpIGRpZmZlciBpbiByZS4gdG8gYWNjZWxlcmF0aW9uIQ0KLSAgaWYgKCFkM19iZWhhdmlvcl96b29tRGl2KSB7DQotICAgIGQzX2JlaGF2aW9yX3pvb21EaXYgPSBkMy5zZWxlY3QoImJvZHkiKS5hcHBlbmQoImRpdiIpDQotICAgICAgICAuc3R5bGUoInZpc2liaWxpdHkiLCAiaGlkZGVuIikNCi0gICAgICAgIC5zdHlsZSgidG9wIiwgMCkNCi0gICAgICAgIC5zdHlsZSgiaGVpZ2h0IiwgMCkNCi0gICAgICAgIC5zdHlsZSgid2lkdGgiLCAwKQ0KLSAgICAgICAgLnN0eWxlKCJvdmVyZmxvdy15IiwgInNjcm9sbCIpDQotICAgICAgLmFwcGVuZCgiZGl2IikNCi0gICAgICAgIC5zdHlsZSgiaGVpZ2h0IiwgIjIwMDBweCIpDQotICAgICAgLm5vZGUoKS5wYXJlbnROb2RlOw0KLSAgfQ0KLQ0KLSAgdmFyIGUgPSBkMy5ldmVudCwgZGVsdGE7DQotICB0cnkgew0KLSAgICBkM19iZWhhdmlvcl96b29tRGl2LnNjcm9sbFRvcCA9IDEwMDA7DQotICAgIGQzX2JlaGF2aW9yX3pvb21EaXYuZGlzcGF0Y2hFdmVudChlKTsNCi0gICAgZGVsdGEgPSAxMDAwIC0gZDNfYmVoYXZpb3Jfem9vbURpdi5zY3JvbGxUb3A7DQotICB9IGNhdGNoIChlcnJvcikgew0KLSAgICBkZWx0YSA9IGUud2hlZWxEZWx0YSB8fCAoLWUuZGV0YWlsICogNSk7DQotICB9DQotDQotICByZXR1cm4gZGVsdGE7DQotfQ0KLWQzLmxheW91dCA9IHt9Ow0KLS8vIEltcGxlbWVudHMgaGllcmFyY2hpY2FsIGVkZ2UgYnVuZGxpbmcgdXNpbmcgSG9sdGVuJ3MgYWxnb3JpdGhtLiBGb3IgZWFjaA0KLS8vIGlucHV0IGxpbmssIGEgcGF0aCBpcyBjb21wdXRlZCB0aGF0IHRyYXZlbHMgdGhyb3VnaCB0aGUgdHJlZSwgdXAgdGhlIHBhcmVudA0KLS8vIGhpZXJhcmNoeSB0byB0aGUgbGVhc3QgY29tbW9uIGFuY2VzdG9yLCBhbmQgdGhlbiBiYWNrIGRvd24gdG8gdGhlIGRlc3RpbmF0aW9uDQotLy8gbm9kZS4gRWFjaCBwYXRoIGlzIHNpbXBseSBhbiBhcnJheSBvZiBub2Rlcy4NCi1kMy5sYXlvdXQuYnVuZGxlID0gZnVuY3Rpb24oKSB7DQotICByZXR1cm4gZnVuY3Rpb24obGlua3MpIHsNCi0gICAgdmFyIHBhdGhzID0gW10sDQotICAgICAgICBpID0gLTEsDQotICAgICAgICBuID0gbGlua3MubGVuZ3RoOw0KLSAgICB3aGlsZSAoKytpIDwgbikgcGF0aHMucHVzaChkM19sYXlvdXRfYnVuZGxlUGF0aChsaW5rc1tpXSkpOw0KLSAgICByZXR1cm4gcGF0aHM7DQotICB9Ow0KLX07DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X2J1bmRsZVBhdGgobGluaykgew0KLSAgdmFyIHN0YXJ0ID0gbGluay5zb3VyY2UsDQotICAgICAgZW5kID0gbGluay50YXJnZXQsDQotICAgICAgbGNhID0gZDNfbGF5b3V0X2J1bmRsZUxlYXN0Q29tbW9uQW5jZXN0b3Ioc3RhcnQsIGVuZCksDQotICAgICAgcG9pbnRzID0gW3N0YXJ0XTsNCi0gIHdoaWxlIChzdGFydCAhPT0gbGNhKSB7DQotICAgIHN0YXJ0ID0gc3RhcnQucGFyZW50Ow0KLSAgICBwb2ludHMucHVzaChzdGFydCk7DQotICB9DQotICB2YXIgayA9IHBvaW50cy5sZW5ndGg7DQotICB3aGlsZSAoZW5kICE9PSBsY2EpIHsNCi0gICAgcG9pbnRzLnNwbGljZShrLCAwLCBlbmQpOw0KLSAgICBlbmQgPSBlbmQucGFyZW50Ow0KLSAgfQ0KLSAgcmV0dXJuIHBvaW50czsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X2J1bmRsZUFuY2VzdG9ycyhub2RlKSB7DQotICB2YXIgYW5jZXN0b3JzID0gW10sDQotICAgICAgcGFyZW50ID0gbm9kZS5wYXJlbnQ7DQotICB3aGlsZSAocGFyZW50ICE9IG51bGwpIHsNCi0gICAgYW5jZXN0b3JzLnB1c2gobm9kZSk7DQotICAgIG5vZGUgPSBwYXJlbnQ7DQotICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7DQotICB9DQotICBhbmNlc3RvcnMucHVzaChub2RlKTsNCi0gIHJldHVybiBhbmNlc3RvcnM7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF9idW5kbGVMZWFzdENvbW1vbkFuY2VzdG9yKGEsIGIpIHsNCi0gIGlmIChhID09PSBiKSByZXR1cm4gYTsNCi0gIHZhciBhTm9kZXMgPSBkM19sYXlvdXRfYnVuZGxlQW5jZXN0b3JzKGEpLA0KLSAgICAgIGJOb2RlcyA9IGQzX2xheW91dF9idW5kbGVBbmNlc3RvcnMoYiksDQotICAgICAgYU5vZGUgPSBhTm9kZXMucG9wKCksDQotICAgICAgYk5vZGUgPSBiTm9kZXMucG9wKCksDQotICAgICAgc2hhcmVkTm9kZSA9IG51bGw7DQotICB3aGlsZSAoYU5vZGUgPT09IGJOb2RlKSB7DQotICAgIHNoYXJlZE5vZGUgPSBhTm9kZTsNCi0gICAgYU5vZGUgPSBhTm9kZXMucG9wKCk7DQotICAgIGJOb2RlID0gYk5vZGVzLnBvcCgpOw0KLSAgfQ0KLSAgcmV0dXJuIHNoYXJlZE5vZGU7DQotfQ0KLWQzLmxheW91dC5jaG9yZCA9IGZ1bmN0aW9uKCkgew0KLSAgdmFyIGNob3JkID0ge30sDQotICAgICAgY2hvcmRzLA0KLSAgICAgIGdyb3VwcywNCi0gICAgICBtYXRyaXgsDQotICAgICAgbiwNCi0gICAgICBwYWRkaW5nID0gMCwNCi0gICAgICBzb3J0R3JvdXBzLA0KLSAgICAgIHNvcnRTdWJncm91cHMsDQotICAgICAgc29ydENob3JkczsNCi0NCi0gIGZ1bmN0aW9uIHJlbGF5b3V0KCkgew0KLSAgICB2YXIgc3ViZ3JvdXBzID0ge30sDQotICAgICAgICBncm91cFN1bXMgPSBbXSwNCi0gICAgICAgIGdyb3VwSW5kZXggPSBkMy5yYW5nZShuKSwNCi0gICAgICAgIHN1Ymdyb3VwSW5kZXggPSBbXSwNCi0gICAgICAgIGssDQotICAgICAgICB4LA0KLSAgICAgICAgeDAsDQotICAgICAgICBpLA0KLSAgICAgICAgajsNCi0NCi0gICAgY2hvcmRzID0gW107DQotICAgIGdyb3VwcyA9IFtdOw0KLQ0KLSAgICAvLyBDb21wdXRlIHRoZSBzdW0uDQotICAgIGsgPSAwLCBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7DQotICAgICAgeCA9IDAsIGogPSAtMTsgd2hpbGUgKCsraiA8IG4pIHsNCi0gICAgICAgIHggKz0gbWF0cml4W2ldW2pdOw0KLSAgICAgIH0NCi0gICAgICBncm91cFN1bXMucHVzaCh4KTsNCi0gICAgICBzdWJncm91cEluZGV4LnB1c2goZDMucmFuZ2UobikpOw0KLSAgICAgIGsgKz0geDsNCi0gICAgfQ0KLQ0KLSAgICAvLyBTb3J0IGdyb3Vwc+KAPw0KLSAgICBpZiAoc29ydEdyb3Vwcykgew0KLSAgICAgIGdyb3VwSW5kZXguc29ydChmdW5jdGlvbihhLCBiKSB7DQotICAgICAgICByZXR1cm4gc29ydEdyb3Vwcyhncm91cFN1bXNbYV0sIGdyb3VwU3Vtc1tiXSk7DQotICAgICAgfSk7DQotICAgIH0NCi0NCi0gICAgLy8gU29ydCBzdWJncm91cHPigD8NCi0gICAgaWYgKHNvcnRTdWJncm91cHMpIHsNCi0gICAgICBzdWJncm91cEluZGV4LmZvckVhY2goZnVuY3Rpb24oZCwgaSkgew0KLSAgICAgICAgZC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsNCi0gICAgICAgICAgcmV0dXJuIHNvcnRTdWJncm91cHMobWF0cml4W2ldW2FdLCBtYXRyaXhbaV1bYl0pOw0KLSAgICAgICAgfSk7DQotICAgICAgfSk7DQotICAgIH0NCi0NCi0gICAgLy8gQ29udmVydCB0aGUgc3VtIHRvIHNjYWxpbmcgZmFjdG9yIGZvciBbMCwgMnBpXS4NCi0gICAgLy8gVE9ETyBBbGxvdyBzdGFydCBhbmQgZW5kIGFuZ2xlIHRvIGJlIHNwZWNpZmllZC4NCi0gICAgLy8gVE9ETyBBbGxvdyBwYWRkaW5nIHRvIGJlIHNwZWNpZmllZCBhcyBwZXJjZW50YWdlPw0KLSAgICBrID0gKDIgKiBNYXRoLlBJIC0gcGFkZGluZyAqIG4pIC8gazsNCi0NCi0gICAgLy8gQ29tcHV0ZSB0aGUgc3RhcnQgYW5kIGVuZCBhbmdsZSBmb3IgZWFjaCBncm91cCBhbmQgc3ViZ3JvdXAuDQotICAgIC8vIE5vdGU6IE9wZXJhIGhhcyBhIGJ1ZyByZW9yZGVyaW5nIG9iamVjdCBsaXRlcmFsIHByb3BlcnRpZXMhDQotICAgIHggPSAwLCBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7DQotICAgICAgeDAgPSB4LCBqID0gLTE7IHdoaWxlICgrK2ogPCBuKSB7DQotICAgICAgICB2YXIgZGkgPSBncm91cEluZGV4W2ldLA0KLSAgICAgICAgICAgIGRqID0gc3ViZ3JvdXBJbmRleFtkaV1bal0sDQotICAgICAgICAgICAgdiA9IG1hdHJpeFtkaV1bZGpdLA0KLSAgICAgICAgICAgIGEwID0geCwNCi0gICAgICAgICAgICBhMSA9IHggKz0gdiAqIGs7DQotICAgICAgICBzdWJncm91cHNbZGkgKyAiLSIgKyBkal0gPSB7DQotICAgICAgICAgIGluZGV4OiBkaSwNCi0gICAgICAgICAgc3ViaW5kZXg6IGRqLA0KLSAgICAgICAgICBzdGFydEFuZ2xlOiBhMCwNCi0gICAgICAgICAgZW5kQW5nbGU6IGExLA0KLSAgICAgICAgICB2YWx1ZTogdg0KLSAgICAgICAgfTsNCi0gICAgICB9DQotICAgICAgZ3JvdXBzLnB1c2goew0KLSAgICAgICAgaW5kZXg6IGRpLA0KLSAgICAgICAgc3RhcnRBbmdsZTogeDAsDQotICAgICAgICBlbmRBbmdsZTogeCwNCi0gICAgICAgIHZhbHVlOiAoeCAtIHgwKSAvIGsNCi0gICAgICB9KTsNCi0gICAgICB4ICs9IHBhZGRpbmc7DQotICAgIH0NCi0NCi0gICAgLy8gR2VuZXJhdGUgY2hvcmRzIGZvciBlYWNoIChub24tZW1wdHkpIHN1Ymdyb3VwLXN1Ymdyb3VwIGxpbmsuDQotICAgIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHsNCi0gICAgICBqID0gaSAtIDE7IHdoaWxlICgrK2ogPCBuKSB7DQotICAgICAgICB2YXIgc291cmNlID0gc3ViZ3JvdXBzW2kgKyAiLSIgKyBqXSwNCi0gICAgICAgICAgICB0YXJnZXQgPSBzdWJncm91cHNbaiArICItIiArIGldOw0KLSAgICAgICAgaWYgKHNvdXJjZS52YWx1ZSB8fCB0YXJnZXQudmFsdWUpIHsNCi0gICAgICAgICAgY2hvcmRzLnB1c2goc291cmNlLnZhbHVlIDwgdGFyZ2V0LnZhbHVlDQotICAgICAgICAgICAgICA/IHtzb3VyY2U6IHRhcmdldCwgdGFyZ2V0OiBzb3VyY2V9DQotICAgICAgICAgICAgICA6IHtzb3VyY2U6IHNvdXJjZSwgdGFyZ2V0OiB0YXJnZXR9KTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgaWYgKHNvcnRDaG9yZHMpIHJlc29ydCgpOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gcmVzb3J0KCkgew0KLSAgICBjaG9yZHMuc29ydChmdW5jdGlvbihhLCBiKSB7DQotICAgICAgcmV0dXJuIHNvcnRDaG9yZHMoDQotICAgICAgICAgIChhLnNvdXJjZS52YWx1ZSArIGEudGFyZ2V0LnZhbHVlKSAvIDIsDQotICAgICAgICAgIChiLnNvdXJjZS52YWx1ZSArIGIudGFyZ2V0LnZhbHVlKSAvIDIpOw0KLSAgICB9KTsNCi0gIH0NCi0NCi0gIGNob3JkLm1hdHJpeCA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbWF0cml4Ow0KLSAgICBuID0gKG1hdHJpeCA9IHgpICYmIG1hdHJpeC5sZW5ndGg7DQotICAgIGNob3JkcyA9IGdyb3VwcyA9IG51bGw7DQotICAgIHJldHVybiBjaG9yZDsNCi0gIH07DQotDQotICBjaG9yZC5wYWRkaW5nID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRkaW5nOw0KLSAgICBwYWRkaW5nID0geDsNCi0gICAgY2hvcmRzID0gZ3JvdXBzID0gbnVsbDsNCi0gICAgcmV0dXJuIGNob3JkOw0KLSAgfTsNCi0NCi0gIGNob3JkLnNvcnRHcm91cHMgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnRHcm91cHM7DQotICAgIHNvcnRHcm91cHMgPSB4Ow0KLSAgICBjaG9yZHMgPSBncm91cHMgPSBudWxsOw0KLSAgICByZXR1cm4gY2hvcmQ7DQotICB9Ow0KLQ0KLSAgY2hvcmQuc29ydFN1Ymdyb3VwcyA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydFN1Ymdyb3VwczsNCi0gICAgc29ydFN1Ymdyb3VwcyA9IHg7DQotICAgIGNob3JkcyA9IG51bGw7DQotICAgIHJldHVybiBjaG9yZDsNCi0gIH07DQotDQotICBjaG9yZC5zb3J0Q2hvcmRzID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3J0Q2hvcmRzOw0KLSAgICBzb3J0Q2hvcmRzID0geDsNCi0gICAgaWYgKGNob3JkcykgcmVzb3J0KCk7DQotICAgIHJldHVybiBjaG9yZDsNCi0gIH07DQotDQotICBjaG9yZC5jaG9yZHMgPSBmdW5jdGlvbigpIHsNCi0gICAgaWYgKCFjaG9yZHMpIHJlbGF5b3V0KCk7DQotICAgIHJldHVybiBjaG9yZHM7DQotICB9Ow0KLQ0KLSAgY2hvcmQuZ3JvdXBzID0gZnVuY3Rpb24oKSB7DQotICAgIGlmICghZ3JvdXBzKSByZWxheW91dCgpOw0KLSAgICByZXR1cm4gZ3JvdXBzOw0KLSAgfTsNCi0NCi0gIHJldHVybiBjaG9yZDsNCi19Ow0KLS8vIEEgcnVkaW1lbnRhcnkgZm9yY2UgbGF5b3V0IHVzaW5nIEdhdXNzLVNlaWRlbC4NCi1kMy5sYXlvdXQuZm9yY2UgPSBmdW5jdGlvbigpIHsNCi0gIHZhciBmb3JjZSA9IHt9LA0KLSAgICAgIGV2ZW50ID0gZDMuZGlzcGF0Y2goInN0YXJ0IiwgInRpY2siLCAiZW5kIiksDQotICAgICAgc2l6ZSA9IFsxLCAxXSwNCi0gICAgICBkcmFnLA0KLSAgICAgIGFscGhhLA0KLSAgICAgIGZyaWN0aW9uID0gLjksDQotICAgICAgbGlua0Rpc3RhbmNlID0gZDNfbGF5b3V0X2ZvcmNlTGlua0Rpc3RhbmNlLA0KLSAgICAgIGxpbmtTdHJlbmd0aCA9IGQzX2xheW91dF9mb3JjZUxpbmtTdHJlbmd0aCwNCi0gICAgICBjaGFyZ2UgPSAtMzAsDQotICAgICAgZ3Jhdml0eSA9IC4xLA0KLSAgICAgIHRoZXRhID0gLjgsDQotICAgICAgaW50ZXJ2YWwsDQotICAgICAgbm9kZXMgPSBbXSwNCi0gICAgICBsaW5rcyA9IFtdLA0KLSAgICAgIGRpc3RhbmNlcywNCi0gICAgICBzdHJlbmd0aHMsDQotICAgICAgY2hhcmdlczsNCi0NCi0gIGZ1bmN0aW9uIHJlcHVsc2Uobm9kZSkgew0KLSAgICByZXR1cm4gZnVuY3Rpb24ocXVhZCwgeDEsIHkxLCB4MiwgeTIpIHsNCi0gICAgICBpZiAocXVhZC5wb2ludCAhPT0gbm9kZSkgew0KLSAgICAgICAgdmFyIGR4ID0gcXVhZC5jeCAtIG5vZGUueCwNCi0gICAgICAgICAgICBkeSA9IHF1YWQuY3kgLSBub2RlLnksDQotICAgICAgICAgICAgZG4gPSAxIC8gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsNCi0NCi0gICAgICAgIC8qIEJhcm5lcy1IdXQgY3JpdGVyaW9uLiAqLw0KLSAgICAgICAgaWYgKCh4MiAtIHgxKSAqIGRuIDwgdGhldGEpIHsNCi0gICAgICAgICAgdmFyIGsgPSBxdWFkLmNoYXJnZSAqIGRuICogZG47DQotICAgICAgICAgIG5vZGUucHggLT0gZHggKiBrOw0KLSAgICAgICAgICBub2RlLnB5IC09IGR5ICogazsNCi0gICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocXVhZC5wb2ludCAmJiBpc0Zpbml0ZShkbikpIHsNCi0gICAgICAgICAgdmFyIGsgPSBxdWFkLnBvaW50Q2hhcmdlICogZG4gKiBkbjsNCi0gICAgICAgICAgbm9kZS5weCAtPSBkeCAqIGs7DQotICAgICAgICAgIG5vZGUucHkgLT0gZHkgKiBrOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gIXF1YWQuY2hhcmdlOw0KLSAgICB9Ow0KLSAgfQ0KLQ0KLSAgZm9yY2UudGljayA9IGZ1bmN0aW9uKCkgew0KLSAgICAvLyBzaW11bGF0ZWQgYW5uZWFsaW5nLCBiYXNpY2FsbHkNCi0gICAgaWYgKChhbHBoYSAqPSAuOTkpIDwgLjAwNSkgew0KLSAgICAgIGV2ZW50LmVuZCh7dHlwZTogImVuZCIsIGFscGhhOiBhbHBoYSA9IDB9KTsNCi0gICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICB2YXIgbiA9IG5vZGVzLmxlbmd0aCwNCi0gICAgICAgIG0gPSBsaW5rcy5sZW5ndGgsDQotICAgICAgICBxLA0KLSAgICAgICAgaSwgLy8gY3VycmVudCBpbmRleA0KLSAgICAgICAgbywgLy8gY3VycmVudCBvYmplY3QNCi0gICAgICAgIHMsIC8vIGN1cnJlbnQgc291cmNlDQotICAgICAgICB0LCAvLyBjdXJyZW50IHRhcmdldA0KLSAgICAgICAgbCwgLy8gY3VycmVudCBkaXN0YW5jZQ0KLSAgICAgICAgaywgLy8gY3VycmVudCBmb3JjZQ0KLSAgICAgICAgeCwgLy8geC1kaXN0YW5jZQ0KLSAgICAgICAgeTsgLy8geS1kaXN0YW5jZQ0KLQ0KLSAgICAvLyBnYXVzcy1zZWlkZWwgcmVsYXhhdGlvbiBmb3IgbGlua3MNCi0gICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgew0KLSAgICAgIG8gPSBsaW5rc1tpXTsNCi0gICAgICBzID0gby5zb3VyY2U7DQotICAgICAgdCA9IG8udGFyZ2V0Ow0KLSAgICAgIHggPSB0LnggLSBzLng7DQotICAgICAgeSA9IHQueSAtIHMueTsNCi0gICAgICBpZiAobCA9ICh4ICogeCArIHkgKiB5KSkgew0KLSAgICAgICAgbCA9IGFscGhhICogc3RyZW5ndGhzW2ldICogKChsID0gTWF0aC5zcXJ0KGwpKSAtIGRpc3RhbmNlc1tpXSkgLyBsOw0KLSAgICAgICAgeCAqPSBsOw0KLSAgICAgICAgeSAqPSBsOw0KLSAgICAgICAgdC54IC09IHggKiAoayA9IHMud2VpZ2h0IC8gKHQud2VpZ2h0ICsgcy53ZWlnaHQpKTsNCi0gICAgICAgIHQueSAtPSB5ICogazsNCi0gICAgICAgIHMueCArPSB4ICogKGsgPSAxIC0gayk7DQotICAgICAgICBzLnkgKz0geSAqIGs7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8vIGFwcGx5IGdyYXZpdHkgZm9yY2VzDQotICAgIGlmIChrID0gYWxwaGEgKiBncmF2aXR5KSB7DQotICAgICAgeCA9IHNpemVbMF0gLyAyOw0KLSAgICAgIHkgPSBzaXplWzFdIC8gMjsNCi0gICAgICBpID0gLTE7IGlmIChrKSB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgICAgbyA9IG5vZGVzW2ldOw0KLSAgICAgICAgby54ICs9ICh4IC0gby54KSAqIGs7DQotICAgICAgICBvLnkgKz0gKHkgLSBvLnkpICogazsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgLy8gY29tcHV0ZSBxdWFkdHJlZSBjZW50ZXIgb2YgbWFzcyBhbmQgYXBwbHkgY2hhcmdlIGZvcmNlcw0KLSAgICBpZiAoY2hhcmdlKSB7DQotICAgICAgZDNfbGF5b3V0X2ZvcmNlQWNjdW11bGF0ZShxID0gZDMuZ2VvbS5xdWFkdHJlZShub2RlcyksIGFscGhhLCBjaGFyZ2VzKTsNCi0gICAgICBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7DQotICAgICAgICBpZiAoIShvID0gbm9kZXNbaV0pLmZpeGVkKSB7DQotICAgICAgICAgIHEudmlzaXQocmVwdWxzZShvKSk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8vIHBvc2l0aW9uIHZlcmxldCBpbnRlZ3JhdGlvbg0KLSAgICBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7DQotICAgICAgbyA9IG5vZGVzW2ldOw0KLSAgICAgIGlmIChvLmZpeGVkKSB7DQotICAgICAgICBvLnggPSBvLnB4Ow0KLSAgICAgICAgby55ID0gby5weTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgby54IC09IChvLnB4IC0gKG8ucHggPSBvLngpKSAqIGZyaWN0aW9uOw0KLSAgICAgICAgby55IC09IChvLnB5IC0gKG8ucHkgPSBvLnkpKSAqIGZyaWN0aW9uOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBldmVudC50aWNrKHt0eXBlOiAidGljayIsIGFscGhhOiBhbHBoYX0pOw0KLSAgfTsNCi0NCi0gIGZvcmNlLm5vZGVzID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlczsNCi0gICAgbm9kZXMgPSB4Ow0KLSAgICByZXR1cm4gZm9yY2U7DQotICB9Ow0KLQ0KLSAgZm9yY2UubGlua3MgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmtzOw0KLSAgICBsaW5rcyA9IHg7DQotICAgIHJldHVybiBmb3JjZTsNCi0gIH07DQotDQotICBmb3JjZS5zaXplID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOw0KLSAgICBzaXplID0geDsNCi0gICAgcmV0dXJuIGZvcmNlOw0KLSAgfTsNCi0NCi0gIGZvcmNlLmxpbmtEaXN0YW5jZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGlua0Rpc3RhbmNlOw0KLSAgICBsaW5rRGlzdGFuY2UgPSBkMy5mdW5jdG9yKHgpOw0KLSAgICByZXR1cm4gZm9yY2U7DQotICB9Ow0KLQ0KLSAgLy8gRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5Lg0KLSAgZm9yY2UuZGlzdGFuY2UgPSBmb3JjZS5saW5rRGlzdGFuY2U7DQotDQotICBmb3JjZS5saW5rU3RyZW5ndGggPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmtTdHJlbmd0aDsNCi0gICAgbGlua1N0cmVuZ3RoID0gZDMuZnVuY3Rvcih4KTsNCi0gICAgcmV0dXJuIGZvcmNlOw0KLSAgfTsNCi0NCi0gIGZvcmNlLmZyaWN0aW9uID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmcmljdGlvbjsNCi0gICAgZnJpY3Rpb24gPSB4Ow0KLSAgICByZXR1cm4gZm9yY2U7DQotICB9Ow0KLQ0KLSAgZm9yY2UuY2hhcmdlID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjaGFyZ2U7DQotICAgIGNoYXJnZSA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6ICt4Ow0KLSAgICByZXR1cm4gZm9yY2U7DQotICB9Ow0KLQ0KLSAgZm9yY2UuZ3Jhdml0eSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZ3Jhdml0eTsNCi0gICAgZ3Jhdml0eSA9IHg7DQotICAgIHJldHVybiBmb3JjZTsNCi0gIH07DQotDQotICBmb3JjZS50aGV0YSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhldGE7DQotICAgIHRoZXRhID0geDsNCi0gICAgcmV0dXJuIGZvcmNlOw0KLSAgfTsNCi0NCi0gIGZvcmNlLmFscGhhID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBhbHBoYTsNCi0NCi0gICAgaWYgKGFscGhhKSB7IC8vIGlmIHdlJ3JlIGFscmVhZHkgcnVubmluZw0KLSAgICAgIGlmICh4ID4gMCkgYWxwaGEgPSB4OyAvLyB3ZSBtaWdodCBrZWVwIGl0IGhvdA0KLSAgICAgIGVsc2UgYWxwaGEgPSAwOyAvLyBvciwgbmV4dCB0aWNrIHdpbGwgZGlzcGF0Y2ggImVuZCINCi0gICAgfSBlbHNlIGlmICh4ID4gMCkgeyAvLyBvdGhlcndpc2UsIGZpcmUgaXQgdXAhDQotICAgICAgZXZlbnQuc3RhcnQoe3R5cGU6ICJzdGFydCIsIGFscGhhOiBhbHBoYSA9IHh9KTsNCi0gICAgICBkMy50aW1lcihmb3JjZS50aWNrKTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gZm9yY2U7DQotICB9Ow0KLQ0KLSAgZm9yY2Uuc3RhcnQgPSBmdW5jdGlvbigpIHsNCi0gICAgdmFyIGksDQotICAgICAgICBqLA0KLSAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCwNCi0gICAgICAgIG0gPSBsaW5rcy5sZW5ndGgsDQotICAgICAgICB3ID0gc2l6ZVswXSwNCi0gICAgICAgIGggPSBzaXplWzFdLA0KLSAgICAgICAgbmVpZ2hib3JzLA0KLSAgICAgICAgbzsNCi0NCi0gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgew0KLSAgICAgIChvID0gbm9kZXNbaV0pLmluZGV4ID0gaTsNCi0gICAgICBvLndlaWdodCA9IDA7DQotICAgIH0NCi0NCi0gICAgZGlzdGFuY2VzID0gW107DQotICAgIHN0cmVuZ3RocyA9IFtdOw0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7DQotICAgICAgbyA9IGxpbmtzW2ldOw0KLSAgICAgIGlmICh0eXBlb2Ygby5zb3VyY2UgPT0gIm51bWJlciIpIG8uc291cmNlID0gbm9kZXNbby5zb3VyY2VdOw0KLSAgICAgIGlmICh0eXBlb2Ygby50YXJnZXQgPT0gIm51bWJlciIpIG8udGFyZ2V0ID0gbm9kZXNbby50YXJnZXRdOw0KLSAgICAgIGRpc3RhbmNlc1tpXSA9IGxpbmtEaXN0YW5jZS5jYWxsKHRoaXMsIG8sIGkpOw0KLSAgICAgIHN0cmVuZ3Roc1tpXSA9IGxpbmtTdHJlbmd0aC5jYWxsKHRoaXMsIG8sIGkpOw0KLSAgICAgICsrby5zb3VyY2Uud2VpZ2h0Ow0KLSAgICAgICsrby50YXJnZXQud2VpZ2h0Ow0KLSAgICB9DQotDQotICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsNCi0gICAgICBvID0gbm9kZXNbaV07DQotICAgICAgaWYgKGlzTmFOKG8ueCkpIG8ueCA9IHBvc2l0aW9uKCJ4Iiwgdyk7DQotICAgICAgaWYgKGlzTmFOKG8ueSkpIG8ueSA9IHBvc2l0aW9uKCJ5IiwgaCk7DQotICAgICAgaWYgKGlzTmFOKG8ucHgpKSBvLnB4ID0gby54Ow0KLSAgICAgIGlmIChpc05hTihvLnB5KSkgby5weSA9IG8ueTsNCi0gICAgfQ0KLQ0KLSAgICBjaGFyZ2VzID0gW107DQotICAgIGlmICh0eXBlb2YgY2hhcmdlID09PSAiZnVuY3Rpb24iKSB7DQotICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgew0KLSAgICAgICAgY2hhcmdlc1tpXSA9ICtjaGFyZ2UuY2FsbCh0aGlzLCBub2Rlc1tpXSwgaSk7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsNCi0gICAgICAgIGNoYXJnZXNbaV0gPSBjaGFyZ2U7DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8vIGluaXRpYWxpemUgbm9kZSBwb3NpdGlvbiBiYXNlZCBvbiBmaXJzdCBuZWlnaGJvcg0KLSAgICBmdW5jdGlvbiBwb3NpdGlvbihkaW1lbnNpb24sIHNpemUpIHsNCi0gICAgICB2YXIgbmVpZ2hib3JzID0gbmVpZ2hib3IoaSksDQotICAgICAgICAgIGogPSAtMSwNCi0gICAgICAgICAgbSA9IG5laWdoYm9ycy5sZW5ndGgsDQotICAgICAgICAgIHg7DQotICAgICAgd2hpbGUgKCsraiA8IG0pIGlmICghaXNOYU4oeCA9IG5laWdoYm9yc1tqXVtkaW1lbnNpb25dKSkgcmV0dXJuIHg7DQotICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiBzaXplOw0KLSAgICB9DQotDQotICAgIC8vIGluaXRpYWxpemUgbmVpZ2hib3JzIGxhemlseQ0KLSAgICBmdW5jdGlvbiBuZWlnaGJvcigpIHsNCi0gICAgICBpZiAoIW5laWdoYm9ycykgew0KLSAgICAgICAgbmVpZ2hib3JzID0gW107DQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7DQotICAgICAgICAgIG5laWdoYm9yc1tqXSA9IFtdOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgew0KLSAgICAgICAgICB2YXIgbyA9IGxpbmtzW2pdOw0KLSAgICAgICAgICBuZWlnaGJvcnNbby5zb3VyY2UuaW5kZXhdLnB1c2goby50YXJnZXQpOw0KLSAgICAgICAgICBuZWlnaGJvcnNbby50YXJnZXQuaW5kZXhdLnB1c2goby5zb3VyY2UpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gbmVpZ2hib3JzW2ldOw0KLSAgICB9DQotDQotICAgIHJldHVybiBmb3JjZS5yZXN1bWUoKTsNCi0gIH07DQotDQotICBmb3JjZS5yZXN1bWUgPSBmdW5jdGlvbigpIHsNCi0gICAgcmV0dXJuIGZvcmNlLmFscGhhKC4xKTsNCi0gIH07DQotDQotICBmb3JjZS5zdG9wID0gZnVuY3Rpb24oKSB7DQotICAgIHJldHVybiBmb3JjZS5hbHBoYSgwKTsNCi0gIH07DQotDQotICAvLyB1c2UgYG5vZGUuY2FsbChmb3JjZS5kcmFnKWAgdG8gbWFrZSBub2RlcyBkcmFnZ2FibGUNCi0gIGZvcmNlLmRyYWcgPSBmdW5jdGlvbigpIHsNCi0gICAgaWYgKCFkcmFnKSBkcmFnID0gZDMuYmVoYXZpb3IuZHJhZygpDQotICAgICAgICAub3JpZ2luKE9iamVjdCkNCi0gICAgICAgIC5vbigiZHJhZ3N0YXJ0IiwgZHJhZ3N0YXJ0KQ0KLSAgICAgICAgLm9uKCJkcmFnIiwgZDNfbGF5b3V0X2ZvcmNlRHJhZykNCi0gICAgICAgIC5vbigiZHJhZ2VuZCIsIGQzX2xheW91dF9mb3JjZURyYWdFbmQpOw0KLQ0KLSAgICB0aGlzLm9uKCJtb3VzZW92ZXIuZm9yY2UiLCBkM19sYXlvdXRfZm9yY2VEcmFnT3ZlcikNCi0gICAgICAgIC5vbigibW91c2VvdXQuZm9yY2UiLCBkM19sYXlvdXRfZm9yY2VEcmFnT3V0KQ0KLSAgICAgICAgLmNhbGwoZHJhZyk7DQotICB9Ow0KLQ0KLSAgZnVuY3Rpb24gZHJhZ3N0YXJ0KGQpIHsNCi0gICAgZDNfbGF5b3V0X2ZvcmNlRHJhZ092ZXIoZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGUgPSBkKTsNCi0gICAgZDNfbGF5b3V0X2ZvcmNlRHJhZ0ZvcmNlID0gZm9yY2U7DQotICB9DQotDQotICByZXR1cm4gZDMucmViaW5kKGZvcmNlLCBldmVudCwgIm9uIik7DQotfTsNCi0NCi12YXIgZDNfbGF5b3V0X2ZvcmNlRHJhZ0ZvcmNlLA0KLSAgICBkM19sYXlvdXRfZm9yY2VEcmFnTm9kZTsNCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VEcmFnT3ZlcihkKSB7DQotICBkLmZpeGVkIHw9IDI7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF9mb3JjZURyYWdPdXQoZCkgew0KLSAgaWYgKGQgIT09IGQzX2xheW91dF9mb3JjZURyYWdOb2RlKSBkLmZpeGVkICY9IDE7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF9mb3JjZURyYWdFbmQoKSB7DQotICBkM19sYXlvdXRfZm9yY2VEcmFnTm9kZS5maXhlZCAmPSAxOw0KLSAgZDNfbGF5b3V0X2ZvcmNlRHJhZ0ZvcmNlID0gZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGUgPSBudWxsOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VEcmFnKCkgew0KLSAgZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGUucHggPSBkMy5ldmVudC54Ow0KLSAgZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGUucHkgPSBkMy5ldmVudC55Ow0KLSAgZDNfbGF5b3V0X2ZvcmNlRHJhZ0ZvcmNlLnJlc3VtZSgpOyAvLyByZXN0YXJ0IGFubmVhbGluZw0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VBY2N1bXVsYXRlKHF1YWQsIGFscGhhLCBjaGFyZ2VzKSB7DQotICB2YXIgY3ggPSAwLA0KLSAgICAgIGN5ID0gMDsNCi0gIHF1YWQuY2hhcmdlID0gMDsNCi0gIGlmICghcXVhZC5sZWFmKSB7DQotICAgIHZhciBub2RlcyA9IHF1YWQubm9kZXMsDQotICAgICAgICBuID0gbm9kZXMubGVuZ3RoLA0KLSAgICAgICAgaSA9IC0xLA0KLSAgICAgICAgYzsNCi0gICAgd2hpbGUgKCsraSA8IG4pIHsNCi0gICAgICBjID0gbm9kZXNbaV07DQotICAgICAgaWYgKGMgPT0gbnVsbCkgY29udGludWU7DQotICAgICAgZDNfbGF5b3V0X2ZvcmNlQWNjdW11bGF0ZShjLCBhbHBoYSwgY2hhcmdlcyk7DQotICAgICAgcXVhZC5jaGFyZ2UgKz0gYy5jaGFyZ2U7DQotICAgICAgY3ggKz0gYy5jaGFyZ2UgKiBjLmN4Ow0KLSAgICAgIGN5ICs9IGMuY2hhcmdlICogYy5jeTsNCi0gICAgfQ0KLSAgfQ0KLSAgaWYgKHF1YWQucG9pbnQpIHsNCi0gICAgLy8gaml0dGVyIGludGVybmFsIG5vZGVzIHRoYXQgYXJlIGNvaW5jaWRlbnQNCi0gICAgaWYgKCFxdWFkLmxlYWYpIHsNCi0gICAgICBxdWFkLnBvaW50LnggKz0gTWF0aC5yYW5kb20oKSAtIC41Ow0KLSAgICAgIHF1YWQucG9pbnQueSArPSBNYXRoLnJhbmRvbSgpIC0gLjU7DQotICAgIH0NCi0gICAgdmFyIGsgPSBhbHBoYSAqIGNoYXJnZXNbcXVhZC5wb2ludC5pbmRleF07DQotICAgIHF1YWQuY2hhcmdlICs9IHF1YWQucG9pbnRDaGFyZ2UgPSBrOw0KLSAgICBjeCArPSBrICogcXVhZC5wb2ludC54Ow0KLSAgICBjeSArPSBrICogcXVhZC5wb2ludC55Ow0KLSAgfQ0KLSAgcXVhZC5jeCA9IGN4IC8gcXVhZC5jaGFyZ2U7DQotICBxdWFkLmN5ID0gY3kgLyBxdWFkLmNoYXJnZTsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlTGlua0Rpc3RhbmNlKGxpbmspIHsNCi0gIHJldHVybiAyMDsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlTGlua1N0cmVuZ3RoKGxpbmspIHsNCi0gIHJldHVybiAxOw0KLX0NCi1kMy5sYXlvdXQucGFydGl0aW9uID0gZnVuY3Rpb24oKSB7DQotICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLA0KLSAgICAgIHNpemUgPSBbMSwgMV07IC8vIHdpZHRoLCBoZWlnaHQNCi0NCi0gIGZ1bmN0aW9uIHBvc2l0aW9uKG5vZGUsIHgsIGR4LCBkeSkgew0KLSAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOw0KLSAgICBub2RlLnggPSB4Ow0KLSAgICBub2RlLnkgPSBub2RlLmRlcHRoICogZHk7DQotICAgIG5vZGUuZHggPSBkeDsNCi0gICAgbm9kZS5keSA9IGR5Ow0KLSAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7DQotICAgICAgdmFyIGkgPSAtMSwNCi0gICAgICAgICAgbiwNCi0gICAgICAgICAgYywNCi0gICAgICAgICAgZDsNCi0gICAgICBkeCA9IG5vZGUudmFsdWUgPyBkeCAvIG5vZGUudmFsdWUgOiAwOw0KLSAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQotICAgICAgICBwb3NpdGlvbihjID0gY2hpbGRyZW5baV0sIHgsIGQgPSBjLnZhbHVlICogZHgsIGR5KTsNCi0gICAgICAgIHggKz0gZDsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGRlcHRoKG5vZGUpIHsNCi0gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwNCi0gICAgICAgIGQgPSAwOw0KLSAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7DQotICAgICAgdmFyIGkgPSAtMSwNCi0gICAgICAgICAgbjsNCi0gICAgICB3aGlsZSAoKytpIDwgbikgZCA9IE1hdGgubWF4KGQsIGRlcHRoKGNoaWxkcmVuW2ldKSk7DQotICAgIH0NCi0gICAgcmV0dXJuIDEgKyBkOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gcGFydGl0aW9uKGQsIGkpIHsNCi0gICAgdmFyIG5vZGVzID0gaGllcmFyY2h5LmNhbGwodGhpcywgZCwgaSk7DQotICAgIHBvc2l0aW9uKG5vZGVzWzBdLCAwLCBzaXplWzBdLCBzaXplWzFdIC8gZGVwdGgobm9kZXNbMF0pKTsNCi0gICAgcmV0dXJuIG5vZGVzOw0KLSAgfQ0KLQ0KLSAgcGFydGl0aW9uLnNpemUgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7DQotICAgIHNpemUgPSB4Ow0KLSAgICByZXR1cm4gcGFydGl0aW9uOw0KLSAgfTsNCi0NCi0gIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKHBhcnRpdGlvbiwgaGllcmFyY2h5KTsNCi19Ow0KLWQzLmxheW91dC5waWUgPSBmdW5jdGlvbigpIHsNCi0gIHZhciB2YWx1ZSA9IE51bWJlciwNCi0gICAgICBzb3J0ID0gZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlLA0KLSAgICAgIHN0YXJ0QW5nbGUgPSAwLA0KLSAgICAgIGVuZEFuZ2xlID0gMiAqIE1hdGguUEk7DQotDQotICBmdW5jdGlvbiBwaWUoZGF0YSwgaSkgew0KLQ0KLSAgICAvLyBDb21wdXRlIHRoZSBudW1lcmljIHZhbHVlcyBmb3IgZWFjaCBkYXRhIGVsZW1lbnQuDQotICAgIHZhciB2YWx1ZXMgPSBkYXRhLm1hcChmdW5jdGlvbihkLCBpKSB7IHJldHVybiArdmFsdWUuY2FsbChwaWUsIGQsIGkpOyB9KTsNCi0NCi0gICAgLy8gQ29tcHV0ZSB0aGUgc3RhcnQgYW5nbGUuDQotICAgIHZhciBhID0gKyh0eXBlb2Ygc3RhcnRBbmdsZSA9PT0gImZ1bmN0aW9uIg0KLSAgICAgICAgPyBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykNCi0gICAgICAgIDogc3RhcnRBbmdsZSk7DQotDQotICAgIC8vIENvbXB1dGUgdGhlIGFuZ3VsYXIgc2NhbGUgZmFjdG9yOiBmcm9tIHZhbHVlIHRvIHJhZGlhbnMuDQotICAgIHZhciBrID0gKCh0eXBlb2YgZW5kQW5nbGUgPT09ICJmdW5jdGlvbiINCi0gICAgICAgID8gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKQ0KLSAgICAgICAgOiBlbmRBbmdsZSkgLSBzdGFydEFuZ2xlKQ0KLSAgICAgICAgLyBkMy5zdW0odmFsdWVzKTsNCi0NCi0gICAgLy8gT3B0aW9uYWxseSBzb3J0IHRoZSBkYXRhLg0KLSAgICB2YXIgaW5kZXggPSBkMy5yYW5nZShkYXRhLmxlbmd0aCk7DQotICAgIGlmIChzb3J0ICE9IG51bGwpIGluZGV4LnNvcnQoc29ydCA9PT0gZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlDQotICAgICAgICA/IGZ1bmN0aW9uKGksIGopIHsgcmV0dXJuIHZhbHVlc1tqXSAtIHZhbHVlc1tpXTsgfQ0KLSAgICAgICAgOiBmdW5jdGlvbihpLCBqKSB7IHJldHVybiBzb3J0KGRhdGFbaV0sIGRhdGFbal0pOyB9KTsNCi0NCi0gICAgLy8gQ29tcHV0ZSB0aGUgYXJjcyENCi0gICAgLy8gVGhleSBhcmUgc3RvcmVkIGluIHRoZSBvcmlnaW5hbCBkYXRhJ3Mgb3JkZXIuDQotICAgIHZhciBhcmNzID0gW107DQotICAgIGluZGV4LmZvckVhY2goZnVuY3Rpb24oaSkgew0KLSAgICAgIGFyY3NbaV0gPSB7DQotICAgICAgICBkYXRhOiBkYXRhW2ldLA0KLSAgICAgICAgdmFsdWU6IGQgPSB2YWx1ZXNbaV0sDQotICAgICAgICBzdGFydEFuZ2xlOiBhLA0KLSAgICAgICAgZW5kQW5nbGU6IGEgKz0gZCAqIGsNCi0gICAgICB9Ow0KLSAgICB9KTsNCi0gICAgcmV0dXJuIGFyY3M7DQotICB9DQotDQotICAvKioNCi0gICAqIFNwZWNpZmllcyB0aGUgdmFsdWUgZnVuY3Rpb24gKngqLCB3aGljaCByZXR1cm5zIGEgbm9ubmVnYXRpdmUgbnVtZXJpYyB2YWx1ZQ0KLSAgICogZm9yIGVhY2ggZGF0dW0uIFRoZSBkZWZhdWx0IHZhbHVlIGZ1bmN0aW9uIGlzIGBOdW1iZXJgLiBUaGUgdmFsdWUgZnVuY3Rpb24NCi0gICAqIGlzIHBhc3NlZCB0d28gYXJndW1lbnRzOiB0aGUgY3VycmVudCBkYXR1bSBhbmQgdGhlIGN1cnJlbnQgaW5kZXguDQotICAgKi8NCi0gIHBpZS52YWx1ZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWU7DQotICAgIHZhbHVlID0geDsNCi0gICAgcmV0dXJuIHBpZTsNCi0gIH07DQotDQotICAvKioNCi0gICAqIFNwZWNpZmllcyBhIHNvcnQgY29tcGFyaXNvbiBvcGVyYXRvciAqeCouIFRoZSBjb21wYXJhdG9yIGlzIHBhc3NlZCB0d28gZGF0YQ0KLSAgICogZWxlbWVudHMgZnJvbSB0aGUgZGF0YSBhcnJheSwgYSBhbmQgYjsgaXQgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGlmIGEgaXMNCi0gICAqIGxlc3MgdGhhbiBiLCBhIHBvc2l0aXZlIHZhbHVlIGlmIGEgaXMgZ3JlYXRlciB0aGFuIGIsIGFuZCB6ZXJvIGlmIGEgZXF1YWxzDQotICAgKiBiLg0KLSAgICovDQotICBwaWUuc29ydCA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydDsNCi0gICAgc29ydCA9IHg7DQotICAgIHJldHVybiBwaWU7DQotICB9Ow0KLQ0KLSAgLyoqDQotICAgKiBTcGVjaWZpZXMgdGhlIG92ZXJhbGwgc3RhcnQgYW5nbGUgb2YgdGhlIHBpZSBjaGFydC4gRGVmYXVsdHMgdG8gMC4gVGhlDQotICAgKiBzdGFydCBhbmdsZSBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBhIGNvbnN0YW50IG9yIGFzIGEgZnVuY3Rpb247IGluIHRoZQ0KLSAgICogY2FzZSBvZiBhIGZ1bmN0aW9uLCBpdCBpcyBldmFsdWF0ZWQgb25jZSBwZXIgYXJyYXkgKGFzIG9wcG9zZWQgdG8gcGVyDQotICAgKiBlbGVtZW50KS4NCi0gICAqLw0KLSAgcGllLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7DQotICAgIHN0YXJ0QW5nbGUgPSB4Ow0KLSAgICByZXR1cm4gcGllOw0KLSAgfTsNCi0NCi0gIC8qKg0KLSAgICogU3BlY2lmaWVzIHRoZSBvdmVyYWxsIGVuZCBhbmdsZSBvZiB0aGUgcGllIGNoYXJ0LiBEZWZhdWx0cyB0byAyz4AuIFRoZQ0KLSAgICogZW5kIGFuZ2xlIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgY29uc3RhbnQgb3IgYXMgYSBmdW5jdGlvbjsgaW4gdGhlDQotICAgKiBjYXNlIG9mIGEgZnVuY3Rpb24sIGl0IGlzIGV2YWx1YXRlZCBvbmNlIHBlciBhcnJheSAoYXMgb3Bwb3NlZCB0byBwZXINCi0gICAqIGVsZW1lbnQpLg0KLSAgICovDQotICBwaWUuZW5kQW5nbGUgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGVuZEFuZ2xlOw0KLSAgICBlbmRBbmdsZSA9IHg7DQotICAgIHJldHVybiBwaWU7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIHBpZTsNCi19Ow0KLQ0KLXZhciBkM19sYXlvdXRfcGllU29ydEJ5VmFsdWUgPSB7fTsNCi0vLyBkYXRhIGlzIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiB4LHk7IHdlIHBvcHVsYXRlIHkwDQotZDMubGF5b3V0LnN0YWNrID0gZnVuY3Rpb24oKSB7DQotICB2YXIgdmFsdWVzID0gT2JqZWN0LA0KLSAgICAgIG9yZGVyID0gZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0LA0KLSAgICAgIG9mZnNldCA9IGQzX2xheW91dF9zdGFja09mZnNldFplcm8sDQotICAgICAgb3V0ID0gZDNfbGF5b3V0X3N0YWNrT3V0LA0KLSAgICAgIHggPSBkM19sYXlvdXRfc3RhY2tYLA0KLSAgICAgIHkgPSBkM19sYXlvdXRfc3RhY2tZOw0KLQ0KLSAgZnVuY3Rpb24gc3RhY2soZGF0YSwgaW5kZXgpIHsNCi0NCi0gICAgLy8gQ29udmVydCBzZXJpZXMgdG8gY2Fub25pY2FsIHR3by1kaW1lbnNpb25hbCByZXByZXNlbnRhdGlvbi4NCi0gICAgdmFyIHNlcmllcyA9IGRhdGEubWFwKGZ1bmN0aW9uKGQsIGkpIHsNCi0gICAgICByZXR1cm4gdmFsdWVzLmNhbGwoc3RhY2ssIGQsIGkpOw0KLSAgICB9KTsNCi0NCi0gICAgLy8gQ29udmVydCBlYWNoIHNlcmllcyB0byBjYW5vbmljYWwgW1t4LHldXSByZXByZXNlbnRhdGlvbi4NCi0gICAgdmFyIHBvaW50cyA9IHNlcmllcy5tYXAoZnVuY3Rpb24oZCwgaSkgew0KLSAgICAgIHJldHVybiBkLm1hcChmdW5jdGlvbih2LCBpKSB7DQotICAgICAgICByZXR1cm4gW3guY2FsbChzdGFjaywgdiwgaSksIHkuY2FsbChzdGFjaywgdiwgaSldOw0KLSAgICAgIH0pOw0KLSAgICB9KTsNCi0NCi0gICAgLy8gQ29tcHV0ZSB0aGUgb3JkZXIgb2Ygc2VyaWVzLCBhbmQgcGVybXV0ZSB0aGVtLg0KLSAgICB2YXIgb3JkZXJzID0gb3JkZXIuY2FsbChzdGFjaywgcG9pbnRzLCBpbmRleCk7DQotICAgIHNlcmllcyA9IGQzLnBlcm11dGUoc2VyaWVzLCBvcmRlcnMpOw0KLSAgICBwb2ludHMgPSBkMy5wZXJtdXRlKHBvaW50cywgb3JkZXJzKTsNCi0NCi0gICAgLy8gQ29tcHV0ZSB0aGUgYmFzZWxpbmXigD8NCi0gICAgdmFyIG9mZnNldHMgPSBvZmZzZXQuY2FsbChzdGFjaywgcG9pbnRzLCBpbmRleCk7DQotDQotICAgIC8vIEFuZCBwcm9wYWdhdGUgaXQgdG8gb3RoZXIgc2VyaWVzLg0KLSAgICB2YXIgbiA9IHNlcmllcy5sZW5ndGgsDQotICAgICAgICBtID0gc2VyaWVzWzBdLmxlbmd0aCwNCi0gICAgICAgIGksDQotICAgICAgICBqLA0KLSAgICAgICAgbzsNCi0gICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgew0KLSAgICAgIG91dC5jYWxsKHN0YWNrLCBzZXJpZXNbMF1bal0sIG8gPSBvZmZzZXRzW2pdLCBwb2ludHNbMF1bal1bMV0pOw0KLSAgICAgIGZvciAoaSA9IDE7IGkgPCBuOyArK2kpIHsNCi0gICAgICAgIG91dC5jYWxsKHN0YWNrLCBzZXJpZXNbaV1bal0sIG8gKz0gcG9pbnRzW2kgLSAxXVtqXVsxXSwgcG9pbnRzW2ldW2pdWzFdKTsNCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIGRhdGE7DQotICB9DQotDQotICBzdGFjay52YWx1ZXMgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlczsNCi0gICAgdmFsdWVzID0geDsNCi0gICAgcmV0dXJuIHN0YWNrOw0KLSAgfTsNCi0NCi0gIHN0YWNrLm9yZGVyID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmRlcjsNCi0gICAgb3JkZXIgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBkM19sYXlvdXRfc3RhY2tPcmRlcnMuZ2V0KHgpIHx8IGQzX2xheW91dF9zdGFja09yZGVyRGVmYXVsdDsNCi0gICAgcmV0dXJuIHN0YWNrOw0KLSAgfTsNCi0NCi0gIHN0YWNrLm9mZnNldCA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb2Zmc2V0Ow0KLSAgICBvZmZzZXQgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBkM19sYXlvdXRfc3RhY2tPZmZzZXRzLmdldCh4KSB8fCBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvOw0KLSAgICByZXR1cm4gc3RhY2s7DQotICB9Ow0KLQ0KLSAgc3RhY2sueCA9IGZ1bmN0aW9uKHopIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDsNCi0gICAgeCA9IHo7DQotICAgIHJldHVybiBzdGFjazsNCi0gIH07DQotDQotICBzdGFjay55ID0gZnVuY3Rpb24oeikgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5Ow0KLSAgICB5ID0gejsNCi0gICAgcmV0dXJuIHN0YWNrOw0KLSAgfTsNCi0NCi0gIHN0YWNrLm91dCA9IGZ1bmN0aW9uKHopIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3V0Ow0KLSAgICBvdXQgPSB6Ow0KLSAgICByZXR1cm4gc3RhY2s7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIHN0YWNrOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tYKGQpIHsNCi0gIHJldHVybiBkLng7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF9zdGFja1koZCkgew0KLSAgcmV0dXJuIGQueTsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrT3V0KGQsIHkwLCB5KSB7DQotICBkLnkwID0geTA7DQotICBkLnkgPSB5Ow0KLX0NCi0NCi12YXIgZDNfbGF5b3V0X3N0YWNrT3JkZXJzID0gZDMubWFwKHsNCi0NCi0gICJpbnNpZGUtb3V0IjogZnVuY3Rpb24oZGF0YSkgew0KLSAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLA0KLSAgICAgICAgaSwNCi0gICAgICAgIGosDQotICAgICAgICBtYXggPSBkYXRhLm1hcChkM19sYXlvdXRfc3RhY2tNYXhJbmRleCksDQotICAgICAgICBzdW1zID0gZGF0YS5tYXAoZDNfbGF5b3V0X3N0YWNrUmVkdWNlU3VtKSwNCi0gICAgICAgIGluZGV4ID0gZDMucmFuZ2Uobikuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBtYXhbYV0gLSBtYXhbYl07IH0pLA0KLSAgICAgICAgdG9wID0gMCwNCi0gICAgICAgIGJvdHRvbSA9IDAsDQotICAgICAgICB0b3BzID0gW10sDQotICAgICAgICBib3R0b21zID0gW107DQotICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsNCi0gICAgICBqID0gaW5kZXhbaV07DQotICAgICAgaWYgKHRvcCA8IGJvdHRvbSkgew0KLSAgICAgICAgdG9wICs9IHN1bXNbal07DQotICAgICAgICB0b3BzLnB1c2goaik7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGJvdHRvbSArPSBzdW1zW2pdOw0KLSAgICAgICAgYm90dG9tcy5wdXNoKGopOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gYm90dG9tcy5yZXZlcnNlKCkuY29uY2F0KHRvcHMpOw0KLSAgfSwNCi0NCi0gICJyZXZlcnNlIjogZnVuY3Rpb24oZGF0YSkgew0KLSAgICByZXR1cm4gZDMucmFuZ2UoZGF0YS5sZW5ndGgpLnJldmVyc2UoKTsNCi0gIH0sDQotDQotICAiZGVmYXVsdCI6IGQzX2xheW91dF9zdGFja09yZGVyRGVmYXVsdA0KLQ0KLX0pOw0KLQ0KLXZhciBkM19sYXlvdXRfc3RhY2tPZmZzZXRzID0gZDMubWFwKHsNCi0NCi0gICJzaWxob3VldHRlIjogZnVuY3Rpb24oZGF0YSkgew0KLSAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLA0KLSAgICAgICAgbSA9IGRhdGFbMF0ubGVuZ3RoLA0KLSAgICAgICAgc3VtcyA9IFtdLA0KLSAgICAgICAgbWF4ID0gMCwNCi0gICAgICAgIGksDQotICAgICAgICBqLA0KLSAgICAgICAgbywNCi0gICAgICAgIHkwID0gW107DQotICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsNCi0gICAgICBmb3IgKGkgPSAwLCBvID0gMDsgaSA8IG47IGkrKykgbyArPSBkYXRhW2ldW2pdWzFdOw0KLSAgICAgIGlmIChvID4gbWF4KSBtYXggPSBvOw0KLSAgICAgIHN1bXMucHVzaChvKTsNCi0gICAgfQ0KLSAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7DQotICAgICAgeTBbal0gPSAobWF4IC0gc3Vtc1tqXSkgLyAyOw0KLSAgICB9DQotICAgIHJldHVybiB5MDsNCi0gIH0sDQotDQotICAid2lnZ2xlIjogZnVuY3Rpb24oZGF0YSkgew0KLSAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLA0KLSAgICAgICAgeCA9IGRhdGFbMF0sDQotICAgICAgICBtID0geC5sZW5ndGgsDQotICAgICAgICBtYXggPSAwLA0KLSAgICAgICAgaSwNCi0gICAgICAgIGosDQotICAgICAgICBrLA0KLSAgICAgICAgczEsDQotICAgICAgICBzMiwNCi0gICAgICAgIHMzLA0KLSAgICAgICAgZHgsDQotICAgICAgICBvLA0KLSAgICAgICAgbzAsDQotICAgICAgICB5MCA9IFtdOw0KLSAgICB5MFswXSA9IG8gPSBvMCA9IDA7DQotICAgIGZvciAoaiA9IDE7IGogPCBtOyArK2opIHsNCi0gICAgICBmb3IgKGkgPSAwLCBzMSA9IDA7IGkgPCBuOyArK2kpIHMxICs9IGRhdGFbaV1bal1bMV07DQotICAgICAgZm9yIChpID0gMCwgczIgPSAwLCBkeCA9IHhbal1bMF0gLSB4W2ogLSAxXVswXTsgaSA8IG47ICsraSkgew0KLSAgICAgICAgZm9yIChrID0gMCwgczMgPSAoZGF0YVtpXVtqXVsxXSAtIGRhdGFbaV1baiAtIDFdWzFdKSAvICgyICogZHgpOyBrIDwgaTsgKytrKSB7DQotICAgICAgICAgIHMzICs9IChkYXRhW2tdW2pdWzFdIC0gZGF0YVtrXVtqIC0gMV1bMV0pIC8gZHg7DQotICAgICAgICB9DQotICAgICAgICBzMiArPSBzMyAqIGRhdGFbaV1bal1bMV07DQotICAgICAgfQ0KLSAgICAgIHkwW2pdID0gbyAtPSBzMSA/IHMyIC8gczEgKiBkeCA6IDA7DQotICAgICAgaWYgKG8gPCBvMCkgbzAgPSBvOw0KLSAgICB9DQotICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHkwW2pdIC09IG8wOw0KLSAgICByZXR1cm4geTA7DQotICB9LA0KLQ0KLSAgImV4cGFuZCI6IGZ1bmN0aW9uKGRhdGEpIHsNCi0gICAgdmFyIG4gPSBkYXRhLmxlbmd0aCwNCi0gICAgICAgIG0gPSBkYXRhWzBdLmxlbmd0aCwNCi0gICAgICAgIGsgPSAxIC8gbiwNCi0gICAgICAgIGksDQotICAgICAgICBqLA0KLSAgICAgICAgbywNCi0gICAgICAgIHkwID0gW107DQotICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsNCi0gICAgICBmb3IgKGkgPSAwLCBvID0gMDsgaSA8IG47IGkrKykgbyArPSBkYXRhW2ldW2pdWzFdOw0KLSAgICAgIGlmIChvKSBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBkYXRhW2ldW2pdWzFdIC89IG87DQotICAgICAgZWxzZSBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBkYXRhW2ldW2pdWzFdID0gazsNCi0gICAgfQ0KLSAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB5MFtqXSA9IDA7DQotICAgIHJldHVybiB5MDsNCi0gIH0sDQotDQotICAiemVybyI6IGQzX2xheW91dF9zdGFja09mZnNldFplcm8NCi0NCi19KTsNCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tPcmRlckRlZmF1bHQoZGF0YSkgew0KLSAgcmV0dXJuIGQzLnJhbmdlKGRhdGEubGVuZ3RoKTsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrT2Zmc2V0WmVybyhkYXRhKSB7DQotICB2YXIgaiA9IC0xLA0KLSAgICAgIG0gPSBkYXRhWzBdLmxlbmd0aCwNCi0gICAgICB5MCA9IFtdOw0KLSAgd2hpbGUgKCsraiA8IG0pIHkwW2pdID0gMDsNCi0gIHJldHVybiB5MDsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrTWF4SW5kZXgoYXJyYXkpIHsNCi0gIHZhciBpID0gMSwNCi0gICAgICBqID0gMCwNCi0gICAgICB2ID0gYXJyYXlbMF1bMV0sDQotICAgICAgaywNCi0gICAgICBuID0gYXJyYXkubGVuZ3RoOw0KLSAgZm9yICg7IGkgPCBuOyArK2kpIHsNCi0gICAgaWYgKChrID0gYXJyYXlbaV1bMV0pID4gdikgew0KLSAgICAgIGogPSBpOw0KLSAgICAgIHYgPSBrOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gajsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrUmVkdWNlU3VtKGQpIHsNCi0gIHJldHVybiBkLnJlZHVjZShkM19sYXlvdXRfc3RhY2tTdW0sIDApOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tTdW0ocCwgZCkgew0KLSAgcmV0dXJuIHAgKyBkWzFdOw0KLX0NCi1kMy5sYXlvdXQuaGlzdG9ncmFtID0gZnVuY3Rpb24oKSB7DQotICB2YXIgZnJlcXVlbmN5ID0gdHJ1ZSwNCi0gICAgICB2YWx1ZXIgPSBOdW1iZXIsDQotICAgICAgcmFuZ2VyID0gZDNfbGF5b3V0X2hpc3RvZ3JhbVJhbmdlLA0KLSAgICAgIGJpbm5lciA9IGQzX2xheW91dF9oaXN0b2dyYW1CaW5TdHVyZ2VzOw0KLQ0KLSAgZnVuY3Rpb24gaGlzdG9ncmFtKGRhdGEsIGkpIHsNCi0gICAgdmFyIGJpbnMgPSBbXSwNCi0gICAgICAgIHZhbHVlcyA9IGRhdGEubWFwKHZhbHVlciwgdGhpcyksDQotICAgICAgICByYW5nZSA9IHJhbmdlci5jYWxsKHRoaXMsIHZhbHVlcywgaSksDQotICAgICAgICB0aHJlc2hvbGRzID0gYmlubmVyLmNhbGwodGhpcywgcmFuZ2UsIHZhbHVlcywgaSksDQotICAgICAgICBiaW4sDQotICAgICAgICBpID0gLTEsDQotICAgICAgICBuID0gdmFsdWVzLmxlbmd0aCwNCi0gICAgICAgIG0gPSB0aHJlc2hvbGRzLmxlbmd0aCAtIDEsDQotICAgICAgICBrID0gZnJlcXVlbmN5ID8gMSA6IDEgLyBuLA0KLSAgICAgICAgeDsNCi0NCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgYmlucy4NCi0gICAgd2hpbGUgKCsraSA8IG0pIHsNCi0gICAgICBiaW4gPSBiaW5zW2ldID0gW107DQotICAgICAgYmluLmR4ID0gdGhyZXNob2xkc1tpICsgMV0gLSAoYmluLnggPSB0aHJlc2hvbGRzW2ldKTsNCi0gICAgICBiaW4ueSA9IDA7DQotICAgIH0NCi0NCi0gICAgLy8gRmlsbCB0aGUgYmlucywgaWdub3JpbmcgdmFsdWVzIG91dHNpZGUgdGhlIHJhbmdlLg0KLSAgICBpID0gLTE7IHdoaWxlKCsraSA8IG4pIHsNCi0gICAgICB4ID0gdmFsdWVzW2ldOw0KLSAgICAgIGlmICgoeCA+PSByYW5nZVswXSkgJiYgKHggPD0gcmFuZ2VbMV0pKSB7DQotICAgICAgICBiaW4gPSBiaW5zW2QzLmJpc2VjdCh0aHJlc2hvbGRzLCB4LCAxLCBtKSAtIDFdOw0KLSAgICAgICAgYmluLnkgKz0gazsNCi0gICAgICAgIGJpbi5wdXNoKGRhdGFbaV0pOw0KLSAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gYmluczsNCi0gIH0NCi0NCi0gIC8vIFNwZWNpZmllcyBob3cgdG8gZXh0cmFjdCBhIHZhbHVlIGZyb20gdGhlIGFzc29jaWF0ZWQgZGF0YS4gVGhlIGRlZmF1bHQNCi0gIC8vIHZhbHVlIGZ1bmN0aW9uIGlzIGBOdW1iZXJgLCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBpZGVudGl0eSBmdW5jdGlvbi4NCi0gIGhpc3RvZ3JhbS52YWx1ZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWVyOw0KLSAgICB2YWx1ZXIgPSB4Ow0KLSAgICByZXR1cm4gaGlzdG9ncmFtOw0KLSAgfTsNCi0NCi0gIC8vIFNwZWNpZmllcyB0aGUgcmFuZ2Ugb2YgdGhlIGhpc3RvZ3JhbS4gVmFsdWVzIG91dHNpZGUgdGhlIHNwZWNpZmllZCByYW5nZQ0KLSAgLy8gd2lsbCBiZSBpZ25vcmVkLiBUaGUgYXJndW1lbnQgYHhgIG1heSBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgdHdvLWVsZW1lbnQNCi0gIC8vIGFycmF5IHJlcHJlc2VudGluZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2UsIG9yIGFzIGENCi0gIC8vIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmFuZ2UgZ2l2ZW4gdGhlIGFycmF5IG9mIHZhbHVlcyBhbmQgdGhlIGN1cnJlbnQNCi0gIC8vIGluZGV4IGBpYC4gVGhlIGRlZmF1bHQgcmFuZ2UgaXMgdGhlIGV4dGVudCAobWluaW11bSBhbmQgbWF4aW11bSkgb2YgdGhlDQotICAvLyB2YWx1ZXMuDQotICBoaXN0b2dyYW0ucmFuZ2UgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlcjsNCi0gICAgcmFuZ2VyID0gZDMuZnVuY3Rvcih4KTsNCi0gICAgcmV0dXJuIGhpc3RvZ3JhbTsNCi0gIH07DQotDQotICAvLyBTcGVjaWZpZXMgaG93IHRvIGJpbiB2YWx1ZXMgaW4gdGhlIGhpc3RvZ3JhbS4gVGhlIGFyZ3VtZW50IGB4YCBtYXkgYmUNCi0gIC8vIHNwZWNpZmllZCBhcyBhIG51bWJlciwgaW4gd2hpY2ggY2FzZSB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHdpbGwgYmUgc3BsaXQNCi0gIC8vIHVuaWZvcm1seSBpbnRvIHRoZSBnaXZlbiBudW1iZXIgb2YgYmlucy4gT3IsIGB4YCBtYXkgYmUgYW4gYXJyYXkgb2YNCi0gIC8vIHRocmVzaG9sZCB2YWx1ZXMsIGRlZmluaW5nIHRoZSBiaW5zOyB0aGUgc3BlY2lmaWVkIGFycmF5IG11c3QgY29udGFpbiB0aGUNCi0gIC8vIHJpZ2h0bW9zdCAodXBwZXIpIHZhbHVlLCB0aHVzIHNwZWNpZnlpbmcgbiArIDEgdmFsdWVzIGZvciBuIGJpbnMuIE9yLCBgeGANCi0gIC8vIG1heSBiZSBhIGZ1bmN0aW9uIHdoaWNoIGlzIGV2YWx1YXRlZCwgYmVpbmcgcGFzc2VkIHRoZSByYW5nZSwgdGhlIGFycmF5IG9mDQotICAvLyB2YWx1ZXMsIGFuZCB0aGUgY3VycmVudCBpbmRleCBgaWAsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aHJlc2hvbGRzLiBUaGUNCi0gIC8vIGRlZmF1bHQgYmluIGZ1bmN0aW9uIHdpbGwgZGl2aWRlIHRoZSB2YWx1ZXMgaW50byB1bmlmb3JtIGJpbnMgdXNpbmcNCi0gIC8vIFN0dXJnZXMnIGZvcm11bGEuDQotICBoaXN0b2dyYW0uYmlucyA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gYmlubmVyOw0KLSAgICBiaW5uZXIgPSB0eXBlb2YgeCA9PT0gIm51bWJlciINCi0gICAgICAgID8gZnVuY3Rpb24ocmFuZ2UpIHsgcmV0dXJuIGQzX2xheW91dF9oaXN0b2dyYW1CaW5GaXhlZChyYW5nZSwgeCk7IH0NCi0gICAgICAgIDogZDMuZnVuY3Rvcih4KTsNCi0gICAgcmV0dXJuIGhpc3RvZ3JhbTsNCi0gIH07DQotDQotICAvLyBTcGVjaWZpZXMgd2hldGhlciB0aGUgaGlzdG9ncmFtJ3MgYHlgIHZhbHVlIGlzIGEgY291bnQgKGZyZXF1ZW5jeSkgb3IgYQ0KLSAgLy8gcHJvYmFiaWxpdHkgKGRlbnNpdHkpLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLg0KLSAgaGlzdG9ncmFtLmZyZXF1ZW5jeSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZnJlcXVlbmN5Ow0KLSAgICBmcmVxdWVuY3kgPSAhIXg7DQotICAgIHJldHVybiBoaXN0b2dyYW07DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGhpc3RvZ3JhbTsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1CaW5TdHVyZ2VzKHJhbmdlLCB2YWx1ZXMpIHsNCi0gIHJldHVybiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZXMubGVuZ3RoKSAvIE1hdGguTE4yICsgMSkpOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIG4pIHsNCi0gIHZhciB4ID0gLTEsDQotICAgICAgYiA9ICtyYW5nZVswXSwNCi0gICAgICBtID0gKHJhbmdlWzFdIC0gYikgLyBuLA0KLSAgICAgIGYgPSBbXTsNCi0gIHdoaWxlICgrK3ggPD0gbikgZlt4XSA9IG0gKiB4ICsgYjsNCi0gIHJldHVybiBmOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfaGlzdG9ncmFtUmFuZ2UodmFsdWVzKSB7DQotICByZXR1cm4gW2QzLm1pbih2YWx1ZXMpLCBkMy5tYXgodmFsdWVzKV07DQotfQ0KLWQzLmxheW91dC5oaWVyYXJjaHkgPSBmdW5jdGlvbigpIHsNCi0gIHZhciBzb3J0ID0gZDNfbGF5b3V0X2hpZXJhcmNoeVNvcnQsDQotICAgICAgY2hpbGRyZW4gPSBkM19sYXlvdXRfaGllcmFyY2h5Q2hpbGRyZW4sDQotICAgICAgdmFsdWUgPSBkM19sYXlvdXRfaGllcmFyY2h5VmFsdWU7DQotDQotICAvLyBSZWN1cnNpdmVseSBjb21wdXRlIHRoZSBub2RlIGRlcHRoIGFuZCB2YWx1ZS4NCi0gIC8vIEFsc28gY29udmVydHMgdGhlIGRhdGEgcmVwcmVzZW50YXRpb24gaW50byBhIHN0YW5kYXJkIGhpZXJhcmNoeSBzdHJ1Y3R1cmUuDQotICBmdW5jdGlvbiByZWN1cnNlKGRhdGEsIGRlcHRoLCBub2Rlcykgew0KLSAgICB2YXIgY2hpbGRzID0gY2hpbGRyZW4uY2FsbChoaWVyYXJjaHksIGRhdGEsIGRlcHRoKSwNCi0gICAgICAgIG5vZGUgPSBkM19sYXlvdXRfaGllcmFyY2h5SW5saW5lID8gZGF0YSA6IHtkYXRhOiBkYXRhfTsNCi0gICAgbm9kZS5kZXB0aCA9IGRlcHRoOw0KLSAgICBub2Rlcy5wdXNoKG5vZGUpOw0KLSAgICBpZiAoY2hpbGRzICYmIChuID0gY2hpbGRzLmxlbmd0aCkpIHsNCi0gICAgICB2YXIgaSA9IC0xLA0KLSAgICAgICAgICBuLA0KLSAgICAgICAgICBjID0gbm9kZS5jaGlsZHJlbiA9IFtdLA0KLSAgICAgICAgICB2ID0gMCwNCi0gICAgICAgICAgaiA9IGRlcHRoICsgMTsNCi0gICAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgICAgZCA9IHJlY3Vyc2UoY2hpbGRzW2ldLCBqLCBub2Rlcyk7DQotICAgICAgICBkLnBhcmVudCA9IG5vZGU7DQotICAgICAgICBjLnB1c2goZCk7DQotICAgICAgICB2ICs9IGQudmFsdWU7DQotICAgICAgfQ0KLSAgICAgIGlmIChzb3J0KSBjLnNvcnQoc29ydCk7DQotICAgICAgaWYgKHZhbHVlKSBub2RlLnZhbHVlID0gdjsNCi0gICAgfSBlbHNlIGlmICh2YWx1ZSkgew0KLSAgICAgIG5vZGUudmFsdWUgPSArdmFsdWUuY2FsbChoaWVyYXJjaHksIGRhdGEsIGRlcHRoKSB8fCAwOw0KLSAgICB9DQotICAgIHJldHVybiBub2RlOw0KLSAgfQ0KLQ0KLSAgLy8gUmVjdXJzaXZlbHkgcmUtZXZhbHVhdGVzIHRoZSBub2RlIHZhbHVlLg0KLSAgZnVuY3Rpb24gcmV2YWx1ZShub2RlLCBkZXB0aCkgew0KLSAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLA0KLSAgICAgICAgdiA9IDA7DQotICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsNCi0gICAgICB2YXIgaSA9IC0xLA0KLSAgICAgICAgICBuLA0KLSAgICAgICAgICBqID0gZGVwdGggKyAxOw0KLSAgICAgIHdoaWxlICgrK2kgPCBuKSB2ICs9IHJldmFsdWUoY2hpbGRyZW5baV0sIGopOw0KLSAgICB9IGVsc2UgaWYgKHZhbHVlKSB7DQotICAgICAgdiA9ICt2YWx1ZS5jYWxsKGhpZXJhcmNoeSwgZDNfbGF5b3V0X2hpZXJhcmNoeUlubGluZSA/IG5vZGUgOiBub2RlLmRhdGEsIGRlcHRoKSB8fCAwOw0KLSAgICB9DQotICAgIGlmICh2YWx1ZSkgbm9kZS52YWx1ZSA9IHY7DQotICAgIHJldHVybiB2Ow0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gaGllcmFyY2h5KGQpIHsNCi0gICAgdmFyIG5vZGVzID0gW107DQotICAgIHJlY3Vyc2UoZCwgMCwgbm9kZXMpOw0KLSAgICByZXR1cm4gbm9kZXM7DQotICB9DQotDQotICBoaWVyYXJjaHkuc29ydCA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydDsNCi0gICAgc29ydCA9IHg7DQotICAgIHJldHVybiBoaWVyYXJjaHk7DQotICB9Ow0KLQ0KLSAgaGllcmFyY2h5LmNoaWxkcmVuID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjaGlsZHJlbjsNCi0gICAgY2hpbGRyZW4gPSB4Ow0KLSAgICByZXR1cm4gaGllcmFyY2h5Ow0KLSAgfTsNCi0NCi0gIGhpZXJhcmNoeS52YWx1ZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWU7DQotICAgIHZhbHVlID0geDsNCi0gICAgcmV0dXJuIGhpZXJhcmNoeTsNCi0gIH07DQotDQotICAvLyBSZS1ldmFsdWF0ZXMgdGhlIGB2YWx1ZWAgcHJvcGVydHkgZm9yIHRoZSBzcGVjaWZpZWQgaGllcmFyY2h5Lg0KLSAgaGllcmFyY2h5LnJldmFsdWUgPSBmdW5jdGlvbihyb290KSB7DQotICAgIHJldmFsdWUocm9vdCwgMCk7DQotICAgIHJldHVybiByb290Ow0KLSAgfTsNCi0NCi0gIHJldHVybiBoaWVyYXJjaHk7DQotfTsNCi0NCi0vLyBBIG1ldGhvZCBhc3NpZ25tZW50IGhlbHBlciBmb3IgaGllcmFyY2h5IHN1YmNsYXNzZXMuDQotZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZChvYmplY3QsIGhpZXJhcmNoeSkgew0KLSAgZDMucmViaW5kKG9iamVjdCwgaGllcmFyY2h5LCAic29ydCIsICJjaGlsZHJlbiIsICJ2YWx1ZSIpOw0KLQ0KLSAgLy8gQWRkIGFuIGFsaWFzIGZvciBsaW5rcywgZm9yIGNvbnZlbmllbmNlLg0KLSAgb2JqZWN0LmxpbmtzID0gZDNfbGF5b3V0X2hpZXJhcmNoeUxpbmtzOw0KLQ0KLSAgLy8gSWYgdGhlIG5ldyBBUEkgaXMgdXNlZCwgZW5hYmxpbmcgaW5saW5pbmcuDQotICBvYmplY3Qubm9kZXMgPSBmdW5jdGlvbihkKSB7DQotICAgIGQzX2xheW91dF9oaWVyYXJjaHlJbmxpbmUgPSB0cnVlOw0KLSAgICByZXR1cm4gKG9iamVjdC5ub2RlcyA9IG9iamVjdCkoZCk7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIG9iamVjdDsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeUNoaWxkcmVuKGQpIHsNCi0gIHJldHVybiBkLmNoaWxkcmVuOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5VmFsdWUoZCkgew0KLSAgcmV0dXJuIGQudmFsdWU7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlTb3J0KGEsIGIpIHsNCi0gIHJldHVybiBiLnZhbHVlIC0gYS52YWx1ZTsNCi19DQotDQotLy8gUmV0dXJucyBhbiBhcnJheSBzb3VyY2UrdGFyZ2V0IG9iamVjdHMgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZXMuDQotZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeUxpbmtzKG5vZGVzKSB7DQotICByZXR1cm4gZDMubWVyZ2Uobm9kZXMubWFwKGZ1bmN0aW9uKHBhcmVudCkgew0KLSAgICByZXR1cm4gKHBhcmVudC5jaGlsZHJlbiB8fCBbXSkubWFwKGZ1bmN0aW9uKGNoaWxkKSB7DQotICAgICAgcmV0dXJuIHtzb3VyY2U6IHBhcmVudCwgdGFyZ2V0OiBjaGlsZH07DQotICAgIH0pOw0KLSAgfSkpOw0KLX0NCi0NCi0vLyBGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHksIGRvbid0IGVuYWJsZSBpbmxpbmluZyBieSBkZWZhdWx0Lg0KLXZhciBkM19sYXlvdXRfaGllcmFyY2h5SW5saW5lID0gZmFsc2U7DQotZDMubGF5b3V0LnBhY2sgPSBmdW5jdGlvbigpIHsNCi0gIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChkM19sYXlvdXRfcGFja1NvcnQpLA0KLSAgICAgIHNpemUgPSBbMSwgMV07DQotDQotICBmdW5jdGlvbiBwYWNrKGQsIGkpIHsNCi0gICAgdmFyIG5vZGVzID0gaGllcmFyY2h5LmNhbGwodGhpcywgZCwgaSksDQotICAgICAgICByb290ID0gbm9kZXNbMF07DQotDQotICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXB1dGUgdGhlIGxheW91dC4NCi0gICAgcm9vdC54ID0gMDsNCi0gICAgcm9vdC55ID0gMDsNCi0gICAgZDNfbGF5b3V0X3BhY2tUcmVlKHJvb3QpOw0KLQ0KLSAgICAvLyBTY2FsZSB0aGUgbGF5b3V0IHRvIGZpdCB0aGUgcmVxdWVzdGVkIHNpemUuDQotICAgIHZhciB3ID0gc2l6ZVswXSwNCi0gICAgICAgIGggPSBzaXplWzFdLA0KLSAgICAgICAgayA9IDEgLyBNYXRoLm1heCgyICogcm9vdC5yIC8gdywgMiAqIHJvb3QuciAvIGgpOw0KLSAgICBkM19sYXlvdXRfcGFja1RyYW5zZm9ybShyb290LCB3IC8gMiwgaCAvIDIsIGspOw0KLQ0KLSAgICByZXR1cm4gbm9kZXM7DQotICB9DQotDQotICBwYWNrLnNpemUgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7DQotICAgIHNpemUgPSB4Ow0KLSAgICByZXR1cm4gcGFjazsNCi0gIH07DQotDQotICByZXR1cm4gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZChwYWNrLCBoaWVyYXJjaHkpOw0KLX07DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tTb3J0KGEsIGIpIHsNCi0gIHJldHVybiBhLnZhbHVlIC0gYi52YWx1ZTsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tJbnNlcnQoYSwgYikgew0KLSAgdmFyIGMgPSBhLl9wYWNrX25leHQ7DQotICBhLl9wYWNrX25leHQgPSBiOw0KLSAgYi5fcGFja19wcmV2ID0gYTsNCi0gIGIuX3BhY2tfbmV4dCA9IGM7DQotICBjLl9wYWNrX3ByZXYgPSBiOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfcGFja1NwbGljZShhLCBiKSB7DQotICBhLl9wYWNrX25leHQgPSBiOw0KLSAgYi5fcGFja19wcmV2ID0gYTsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGEsIGIpIHsNCi0gIHZhciBkeCA9IGIueCAtIGEueCwNCi0gICAgICBkeSA9IGIueSAtIGEueSwNCi0gICAgICBkciA9IGEuciArIGIucjsNCi0gIHJldHVybiBkciAqIGRyIC0gZHggKiBkeCAtIGR5ICogZHkgPiAuMDAxOyAvLyB3aXRoaW4gZXBzaWxvbg0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfcGFja0NpcmNsZShub2Rlcykgew0KLSAgdmFyIHhNaW4gPSBJbmZpbml0eSwNCi0gICAgICB4TWF4ID0gLUluZmluaXR5LA0KLSAgICAgIHlNaW4gPSBJbmZpbml0eSwNCi0gICAgICB5TWF4ID0gLUluZmluaXR5LA0KLSAgICAgIG4gPSBub2Rlcy5sZW5ndGgsDQotICAgICAgYSwgYiwgYywgaiwgazsNCi0NCi0gIGZ1bmN0aW9uIGJvdW5kKG5vZGUpIHsNCi0gICAgeE1pbiA9IE1hdGgubWluKG5vZGUueCAtIG5vZGUuciwgeE1pbik7DQotICAgIHhNYXggPSBNYXRoLm1heChub2RlLnggKyBub2RlLnIsIHhNYXgpOw0KLSAgICB5TWluID0gTWF0aC5taW4obm9kZS55IC0gbm9kZS5yLCB5TWluKTsNCi0gICAgeU1heCA9IE1hdGgubWF4KG5vZGUueSArIG5vZGUuciwgeU1heCk7DQotICB9DQotDQotICAvLyBDcmVhdGUgbm9kZSBsaW5rcy4NCi0gIG5vZGVzLmZvckVhY2goZDNfbGF5b3V0X3BhY2tMaW5rKTsNCi0NCi0gIC8vIENyZWF0ZSBmaXJzdCBub2RlLg0KLSAgYSA9IG5vZGVzWzBdOw0KLSAgYS54ID0gLWEucjsNCi0gIGEueSA9IDA7DQotICBib3VuZChhKTsNCi0NCi0gIC8vIENyZWF0ZSBzZWNvbmQgbm9kZS4NCi0gIGlmIChuID4gMSkgew0KLSAgICBiID0gbm9kZXNbMV07DQotICAgIGIueCA9IGIucjsNCi0gICAgYi55ID0gMDsNCi0gICAgYm91bmQoYik7DQotDQotICAgIC8vIENyZWF0ZSB0aGlyZCBub2RlIGFuZCBidWlsZCBjaGFpbi4NCi0gICAgaWYgKG4gPiAyKSB7DQotICAgICAgYyA9IG5vZGVzWzJdOw0KLSAgICAgIGQzX2xheW91dF9wYWNrUGxhY2UoYSwgYiwgYyk7DQotICAgICAgYm91bmQoYyk7DQotICAgICAgZDNfbGF5b3V0X3BhY2tJbnNlcnQoYSwgYyk7DQotICAgICAgYS5fcGFja19wcmV2ID0gYzsNCi0gICAgICBkM19sYXlvdXRfcGFja0luc2VydChjLCBiKTsNCi0gICAgICBiID0gYS5fcGFja19uZXh0Ow0KLQ0KLSAgICAgIC8vIE5vdyBpdGVyYXRlIHRocm91Z2ggdGhlIHJlc3QuDQotICAgICAgZm9yICh2YXIgaSA9IDM7IGkgPCBuOyBpKyspIHsNCi0gICAgICAgIGQzX2xheW91dF9wYWNrUGxhY2UoYSwgYiwgYyA9IG5vZGVzW2ldKTsNCi0NCi0gICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGNsb3Nlc3QgaW50ZXJzZWN0aW9uLg0KLSAgICAgICAgdmFyIGlzZWN0ID0gMCwgczEgPSAxLCBzMiA9IDE7DQotICAgICAgICBmb3IgKGogPSBiLl9wYWNrX25leHQ7IGogIT09IGI7IGogPSBqLl9wYWNrX25leHQsIHMxKyspIHsNCi0gICAgICAgICAgaWYgKGQzX2xheW91dF9wYWNrSW50ZXJzZWN0cyhqLCBjKSkgew0KLSAgICAgICAgICAgIGlzZWN0ID0gMTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlzZWN0ID09IDEpIHsNCi0gICAgICAgICAgZm9yIChrID0gYS5fcGFja19wcmV2OyBrICE9PSBqLl9wYWNrX3ByZXY7IGsgPSBrLl9wYWNrX3ByZXYsIHMyKyspIHsNCi0gICAgICAgICAgICBpZiAoZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGssIGMpKSB7DQotICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFVwZGF0ZSBub2RlIGNoYWluLg0KLSAgICAgICAgaWYgKGlzZWN0KSB7DQotICAgICAgICAgIGlmIChzMSA8IHMyIHx8IChzMSA9PSBzMiAmJiBiLnIgPCBhLnIpKSBkM19sYXlvdXRfcGFja1NwbGljZShhLCBiID0gaik7DQotICAgICAgICAgIGVsc2UgZDNfbGF5b3V0X3BhY2tTcGxpY2UoYSA9IGssIGIpOw0KLSAgICAgICAgICBpLS07DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBkM19sYXlvdXRfcGFja0luc2VydChhLCBjKTsNCi0gICAgICAgICAgYiA9IGM7DQotICAgICAgICAgIGJvdW5kKGMpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gUmUtY2VudGVyIHRoZSBjaXJjbGVzIGFuZCByZXR1cm4gdGhlIGVuY29tcGFzc2luZyByYWRpdXMuDQotICB2YXIgY3ggPSAoeE1pbiArIHhNYXgpIC8gMiwNCi0gICAgICBjeSA9ICh5TWluICsgeU1heCkgLyAyLA0KLSAgICAgIGNyID0gMDsNCi0gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7DQotICAgIHZhciBub2RlID0gbm9kZXNbaV07DQotICAgIG5vZGUueCAtPSBjeDsNCi0gICAgbm9kZS55IC09IGN5Ow0KLSAgICBjciA9IE1hdGgubWF4KGNyLCBub2RlLnIgKyBNYXRoLnNxcnQobm9kZS54ICogbm9kZS54ICsgbm9kZS55ICogbm9kZS55KSk7DQotICB9DQotDQotICAvLyBSZW1vdmUgbm9kZSBsaW5rcy4NCi0gIG5vZGVzLmZvckVhY2goZDNfbGF5b3V0X3BhY2tVbmxpbmspOw0KLQ0KLSAgcmV0dXJuIGNyOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfcGFja0xpbmsobm9kZSkgew0KLSAgbm9kZS5fcGFja19uZXh0ID0gbm9kZS5fcGFja19wcmV2ID0gbm9kZTsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tVbmxpbmsobm9kZSkgew0KLSAgZGVsZXRlIG5vZGUuX3BhY2tfbmV4dDsNCi0gIGRlbGV0ZSBub2RlLl9wYWNrX3ByZXY7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF9wYWNrVHJlZShub2RlKSB7DQotICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOw0KLSAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgew0KLSAgICBjaGlsZHJlbi5mb3JFYWNoKGQzX2xheW91dF9wYWNrVHJlZSk7DQotICAgIG5vZGUuciA9IGQzX2xheW91dF9wYWNrQ2lyY2xlKGNoaWxkcmVuKTsNCi0gIH0gZWxzZSB7DQotICAgIG5vZGUuciA9IE1hdGguc3FydChub2RlLnZhbHVlKTsNCi0gIH0NCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tUcmFuc2Zvcm0obm9kZSwgeCwgeSwgaykgew0KLSAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsNCi0gIG5vZGUueCA9ICh4ICs9IGsgKiBub2RlLngpOw0KLSAgbm9kZS55ID0gKHkgKz0gayAqIG5vZGUueSk7DQotICBub2RlLnIgKj0gazsNCi0gIGlmIChjaGlsZHJlbikgew0KLSAgICB2YXIgaSA9IC0xLCBuID0gY2hpbGRyZW4ubGVuZ3RoOw0KLSAgICB3aGlsZSAoKytpIDwgbikgZDNfbGF5b3V0X3BhY2tUcmFuc2Zvcm0oY2hpbGRyZW5baV0sIHgsIHksIGspOw0KLSAgfQ0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfcGFja1BsYWNlKGEsIGIsIGMpIHsNCi0gIHZhciBkYiA9IGEuciArIGMuciwNCi0gICAgICBkeCA9IGIueCAtIGEueCwNCi0gICAgICBkeSA9IGIueSAtIGEueTsNCi0gIGlmIChkYiAmJiAoZHggfHwgZHkpKSB7DQotICAgIHZhciBkYSA9IGIuciArIGMuciwNCi0gICAgICAgIGRjID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KSwNCi0gICAgICAgIGNvcyA9IE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCAoZGIgKiBkYiArIGRjICogZGMgLSBkYSAqIGRhKSAvICgyICogZGIgKiBkYykpKSwNCi0gICAgICAgIHRoZXRhID0gTWF0aC5hY29zKGNvcyksDQotICAgICAgICB4ID0gY29zICogKGRiIC89IGRjKSwNCi0gICAgICAgIHkgPSBNYXRoLnNpbih0aGV0YSkgKiBkYjsNCi0gICAgYy54ID0gYS54ICsgeCAqIGR4ICsgeSAqIGR5Ow0KLSAgICBjLnkgPSBhLnkgKyB4ICogZHkgLSB5ICogZHg7DQotICB9IGVsc2Ugew0KLSAgICBjLnggPSBhLnggKyBkYjsNCi0gICAgYy55ID0gYS55Ow0KLSAgfQ0KLX0NCi0vLyBJbXBsZW1lbnRzIGEgaGllcmFyY2hpY2FsIGxheW91dCB1c2luZyB0aGUgY2x1c3RlciAob3IgZGVuZHJvZ3JhbSkNCi0vLyBhbGdvcml0aG0uDQotZDMubGF5b3V0LmNsdXN0ZXIgPSBmdW5jdGlvbigpIHsNCi0gIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSwNCi0gICAgICBzZXBhcmF0aW9uID0gZDNfbGF5b3V0X3RyZWVTZXBhcmF0aW9uLA0KLSAgICAgIHNpemUgPSBbMSwgMV07IC8vIHdpZHRoLCBoZWlnaHQNCi0NCi0gIGZ1bmN0aW9uIGNsdXN0ZXIoZCwgaSkgew0KLSAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKSwNCi0gICAgICAgIHJvb3QgPSBub2Rlc1swXSwNCi0gICAgICAgIHByZXZpb3VzTm9kZSwNCi0gICAgICAgIHggPSAwLA0KLSAgICAgICAga3gsDQotICAgICAgICBreTsNCi0NCi0gICAgLy8gRmlyc3Qgd2FsaywgY29tcHV0aW5nIHRoZSBpbml0aWFsIHggJiB5IHZhbHVlcy4NCi0gICAgZDNfbGF5b3V0X3RyZWVWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUpIHsNCi0gICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOw0KLSAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsNCi0gICAgICAgIG5vZGUueCA9IGQzX2xheW91dF9jbHVzdGVyWChjaGlsZHJlbik7DQotICAgICAgICBub2RlLnkgPSBkM19sYXlvdXRfY2x1c3RlclkoY2hpbGRyZW4pOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBub2RlLnggPSBwcmV2aW91c05vZGUgPyB4ICs9IHNlcGFyYXRpb24obm9kZSwgcHJldmlvdXNOb2RlKSA6IDA7DQotICAgICAgICBub2RlLnkgPSAwOw0KLSAgICAgICAgcHJldmlvdXNOb2RlID0gbm9kZTsNCi0gICAgICB9DQotICAgIH0pOw0KLQ0KLSAgICAvLyBDb21wdXRlIHRoZSBsZWZ0LW1vc3QsIHJpZ2h0LW1vc3QsIGFuZCBkZXB0aC1tb3N0IG5vZGVzIGZvciBleHRlbnRzLg0KLSAgICB2YXIgbGVmdCA9IGQzX2xheW91dF9jbHVzdGVyTGVmdChyb290KSwNCi0gICAgICAgIHJpZ2h0ID0gZDNfbGF5b3V0X2NsdXN0ZXJSaWdodChyb290KSwNCi0gICAgICAgIHgwID0gbGVmdC54IC0gc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLA0KLSAgICAgICAgeDEgPSByaWdodC54ICsgc2VwYXJhdGlvbihyaWdodCwgbGVmdCkgLyAyOw0KLQ0KLSAgICAvLyBTZWNvbmQgd2Fsaywgbm9ybWFsaXppbmcgeCAmIHkgdG8gdGhlIGRlc2lyZWQgc2l6ZS4NCi0gICAgZDNfbGF5b3V0X3RyZWVWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUpIHsNCi0gICAgICBub2RlLnggPSAobm9kZS54IC0geDApIC8gKHgxIC0geDApICogc2l6ZVswXTsNCi0gICAgICBub2RlLnkgPSAoMSAtIChyb290LnkgPyBub2RlLnkgLyByb290LnkgOiAxKSkgKiBzaXplWzFdOw0KLSAgICB9KTsNCi0NCi0gICAgcmV0dXJuIG5vZGVzOw0KLSAgfQ0KLQ0KLSAgY2x1c3Rlci5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzZXBhcmF0aW9uOw0KLSAgICBzZXBhcmF0aW9uID0geDsNCi0gICAgcmV0dXJuIGNsdXN0ZXI7DQotICB9Ow0KLQ0KLSAgY2x1c3Rlci5zaXplID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOw0KLSAgICBzaXplID0geDsNCi0gICAgcmV0dXJuIGNsdXN0ZXI7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQoY2x1c3RlciwgaGllcmFyY2h5KTsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyWShjaGlsZHJlbikgew0KLSAgcmV0dXJuIDEgKyBkMy5tYXgoY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7DQotICAgIHJldHVybiBjaGlsZC55Ow0KLSAgfSk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyWChjaGlsZHJlbikgew0KLSAgcmV0dXJuIGNoaWxkcmVuLnJlZHVjZShmdW5jdGlvbih4LCBjaGlsZCkgew0KLSAgICByZXR1cm4geCArIGNoaWxkLng7DQotICB9LCAwKSAvIGNoaWxkcmVuLmxlbmd0aDsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X2NsdXN0ZXJMZWZ0KG5vZGUpIHsNCi0gIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47DQotICByZXR1cm4gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID8gZDNfbGF5b3V0X2NsdXN0ZXJMZWZ0KGNoaWxkcmVuWzBdKSA6IG5vZGU7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyUmlnaHQobm9kZSkgew0KLSAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwgbjsNCi0gIHJldHVybiBjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkgPyBkM19sYXlvdXRfY2x1c3RlclJpZ2h0KGNoaWxkcmVuW24gLSAxXSkgOiBub2RlOw0KLX0NCi0vLyBOb2RlLWxpbmsgdHJlZSBkaWFncmFtIHVzaW5nIHRoZSBSZWluZ29sZC1UaWxmb3JkICJ0aWR5IiBhbGdvcml0aG0NCi1kMy5sYXlvdXQudHJlZSA9IGZ1bmN0aW9uKCkgew0KLSAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLA0KLSAgICAgIHNlcGFyYXRpb24gPSBkM19sYXlvdXRfdHJlZVNlcGFyYXRpb24sDQotICAgICAgc2l6ZSA9IFsxLCAxXTsgLy8gd2lkdGgsIGhlaWdodA0KLQ0KLSAgZnVuY3Rpb24gdHJlZShkLCBpKSB7DQotICAgIHZhciBub2RlcyA9IGhpZXJhcmNoeS5jYWxsKHRoaXMsIGQsIGkpLA0KLSAgICAgICAgcm9vdCA9IG5vZGVzWzBdOw0KLQ0KLSAgICBmdW5jdGlvbiBmaXJzdFdhbGsobm9kZSwgcHJldmlvdXNTaWJsaW5nKSB7DQotICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwNCi0gICAgICAgICAgbGF5b3V0ID0gbm9kZS5fdHJlZTsNCi0gICAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7DQotICAgICAgICB2YXIgbiwNCi0gICAgICAgICAgICBmaXJzdENoaWxkID0gY2hpbGRyZW5bMF0sDQotICAgICAgICAgICAgcHJldmlvdXNDaGlsZCwNCi0gICAgICAgICAgICBhbmNlc3RvciA9IGZpcnN0Q2hpbGQsDQotICAgICAgICAgICAgY2hpbGQsDQotICAgICAgICAgICAgaSA9IC0xOw0KLSAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsNCi0gICAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTsNCi0gICAgICAgICAgZmlyc3RXYWxrKGNoaWxkLCBwcmV2aW91c0NoaWxkKTsNCi0gICAgICAgICAgYW5jZXN0b3IgPSBhcHBvcnRpb24oY2hpbGQsIHByZXZpb3VzQ2hpbGQsIGFuY2VzdG9yKTsNCi0gICAgICAgICAgcHJldmlvdXNDaGlsZCA9IGNoaWxkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZDNfbGF5b3V0X3RyZWVTaGlmdChub2RlKTsNCi0gICAgICAgIHZhciBtaWRwb2ludCA9IC41ICogKGZpcnN0Q2hpbGQuX3RyZWUucHJlbGltICsgY2hpbGQuX3RyZWUucHJlbGltKTsNCi0gICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcpIHsNCi0gICAgICAgICAgbGF5b3V0LnByZWxpbSA9IHByZXZpb3VzU2libGluZy5fdHJlZS5wcmVsaW0gKyBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzU2libGluZyk7DQotICAgICAgICAgIGxheW91dC5tb2QgPSBsYXlvdXQucHJlbGltIC0gbWlkcG9pbnQ7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICBsYXlvdXQucHJlbGltID0gbWlkcG9pbnQ7DQotICAgICAgICB9DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcpIHsNCi0gICAgICAgICAgbGF5b3V0LnByZWxpbSA9IHByZXZpb3VzU2libGluZy5fdHJlZS5wcmVsaW0gKyBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzU2libGluZyk7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotDQotICAgIGZ1bmN0aW9uIHNlY29uZFdhbGsobm9kZSwgeCkgew0KLSAgICAgIG5vZGUueCA9IG5vZGUuX3RyZWUucHJlbGltICsgeDsNCi0gICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOw0KLSAgICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsNCi0gICAgICAgIHZhciBpID0gLTEsDQotICAgICAgICAgICAgbjsNCi0gICAgICAgIHggKz0gbm9kZS5fdHJlZS5tb2Q7DQotICAgICAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgICAgICBzZWNvbmRXYWxrKGNoaWxkcmVuW2ldLCB4KTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0NCi0gICAgZnVuY3Rpb24gYXBwb3J0aW9uKG5vZGUsIHByZXZpb3VzU2libGluZywgYW5jZXN0b3IpIHsNCi0gICAgICBpZiAocHJldmlvdXNTaWJsaW5nKSB7DQotICAgICAgICB2YXIgdmlwID0gbm9kZSwNCi0gICAgICAgICAgICB2b3AgPSBub2RlLA0KLSAgICAgICAgICAgIHZpbSA9IHByZXZpb3VzU2libGluZywNCi0gICAgICAgICAgICB2b20gPSBub2RlLnBhcmVudC5jaGlsZHJlblswXSwNCi0gICAgICAgICAgICBzaXAgPSB2aXAuX3RyZWUubW9kLA0KLSAgICAgICAgICAgIHNvcCA9IHZvcC5fdHJlZS5tb2QsDQotICAgICAgICAgICAgc2ltID0gdmltLl90cmVlLm1vZCwNCi0gICAgICAgICAgICBzb20gPSB2b20uX3RyZWUubW9kLA0KLSAgICAgICAgICAgIHNoaWZ0Ow0KLSAgICAgICAgd2hpbGUgKHZpbSA9IGQzX2xheW91dF90cmVlUmlnaHQodmltKSwgdmlwID0gZDNfbGF5b3V0X3RyZWVMZWZ0KHZpcCksIHZpbSAmJiB2aXApIHsNCi0gICAgICAgICAgdm9tID0gZDNfbGF5b3V0X3RyZWVMZWZ0KHZvbSk7DQotICAgICAgICAgIHZvcCA9IGQzX2xheW91dF90cmVlUmlnaHQodm9wKTsNCi0gICAgICAgICAgdm9wLl90cmVlLmFuY2VzdG9yID0gbm9kZTsNCi0gICAgICAgICAgc2hpZnQgPSB2aW0uX3RyZWUucHJlbGltICsgc2ltIC0gdmlwLl90cmVlLnByZWxpbSAtIHNpcCArIHNlcGFyYXRpb24odmltLCB2aXApOw0KLSAgICAgICAgICBpZiAoc2hpZnQgPiAwKSB7DQotICAgICAgICAgICAgZDNfbGF5b3V0X3RyZWVNb3ZlKGQzX2xheW91dF90cmVlQW5jZXN0b3IodmltLCBub2RlLCBhbmNlc3RvciksIG5vZGUsIHNoaWZ0KTsNCi0gICAgICAgICAgICBzaXAgKz0gc2hpZnQ7DQotICAgICAgICAgICAgc29wICs9IHNoaWZ0Ow0KLSAgICAgICAgICB9DQotICAgICAgICAgIHNpbSArPSB2aW0uX3RyZWUubW9kOw0KLSAgICAgICAgICBzaXAgKz0gdmlwLl90cmVlLm1vZDsNCi0gICAgICAgICAgc29tICs9IHZvbS5fdHJlZS5tb2Q7DQotICAgICAgICAgIHNvcCArPSB2b3AuX3RyZWUubW9kOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHZpbSAmJiAhZDNfbGF5b3V0X3RyZWVSaWdodCh2b3ApKSB7DQotICAgICAgICAgIHZvcC5fdHJlZS50aHJlYWQgPSB2aW07DQotICAgICAgICAgIHZvcC5fdHJlZS5tb2QgKz0gc2ltIC0gc29wOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHZpcCAmJiAhZDNfbGF5b3V0X3RyZWVMZWZ0KHZvbSkpIHsNCi0gICAgICAgICAgdm9tLl90cmVlLnRocmVhZCA9IHZpcDsNCi0gICAgICAgICAgdm9tLl90cmVlLm1vZCArPSBzaXAgLSBzb207DQotICAgICAgICAgIGFuY2VzdG9yID0gbm9kZTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgcmV0dXJuIGFuY2VzdG9yOw0KLSAgICB9DQotDQotICAgIC8vIEluaXRpYWxpemUgdGVtcG9yYXJ5IGxheW91dCB2YXJpYWJsZXMuDQotICAgIGQzX2xheW91dF90cmVlVmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihub2RlLCBwcmV2aW91c1NpYmxpbmcpIHsNCi0gICAgICBub2RlLl90cmVlID0gew0KLSAgICAgICAgYW5jZXN0b3I6IG5vZGUsDQotICAgICAgICBwcmVsaW06IDAsDQotICAgICAgICBtb2Q6IDAsDQotICAgICAgICBjaGFuZ2U6IDAsDQotICAgICAgICBzaGlmdDogMCwNCi0gICAgICAgIG51bWJlcjogcHJldmlvdXNTaWJsaW5nID8gcHJldmlvdXNTaWJsaW5nLl90cmVlLm51bWJlciArIDEgOiAwDQotICAgICAgfTsNCi0gICAgfSk7DQotDQotICAgIC8vIENvbXB1dGUgdGhlIGxheW91dCB1c2luZyBCdWNoaGVpbSBldCBhbC4ncyBhbGdvcml0aG0uDQotICAgIGZpcnN0V2Fsayhyb290KTsNCi0gICAgc2Vjb25kV2Fsayhyb290LCAtcm9vdC5fdHJlZS5wcmVsaW0pOw0KLQ0KLSAgICAvLyBDb21wdXRlIHRoZSBsZWZ0LW1vc3QsIHJpZ2h0LW1vc3QsIGFuZCBkZXB0aC1tb3N0IG5vZGVzIGZvciBleHRlbnRzLg0KLSAgICB2YXIgbGVmdCA9IGQzX2xheW91dF90cmVlU2VhcmNoKHJvb3QsIGQzX2xheW91dF90cmVlTGVmdG1vc3QpLA0KLSAgICAgICAgcmlnaHQgPSBkM19sYXlvdXRfdHJlZVNlYXJjaChyb290LCBkM19sYXlvdXRfdHJlZVJpZ2h0bW9zdCksDQotICAgICAgICBkZWVwID0gZDNfbGF5b3V0X3RyZWVTZWFyY2gocm9vdCwgZDNfbGF5b3V0X3RyZWVEZWVwZXN0KSwNCi0gICAgICAgIHgwID0gbGVmdC54IC0gc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLA0KLSAgICAgICAgeDEgPSByaWdodC54ICsgc2VwYXJhdGlvbihyaWdodCwgbGVmdCkgLyAyLA0KLSAgICAgICAgeTEgPSBkZWVwLmRlcHRoIHx8IDE7DQotDQotICAgIC8vIENsZWFyIHRlbXBvcmFyeSBsYXlvdXQgdmFyaWFibGVzOyB0cmFuc2Zvcm0geCBhbmQgeS4NCi0gICAgZDNfbGF5b3V0X3RyZWVWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUpIHsNCi0gICAgICBub2RlLnggPSAobm9kZS54IC0geDApIC8gKHgxIC0geDApICogc2l6ZVswXTsNCi0gICAgICBub2RlLnkgPSBub2RlLmRlcHRoIC8geTEgKiBzaXplWzFdOw0KLSAgICAgIGRlbGV0ZSBub2RlLl90cmVlOw0KLSAgICB9KTsNCi0NCi0gICAgcmV0dXJuIG5vZGVzOw0KLSAgfQ0KLQ0KLSAgdHJlZS5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzZXBhcmF0aW9uOw0KLSAgICBzZXBhcmF0aW9uID0geDsNCi0gICAgcmV0dXJuIHRyZWU7DQotICB9Ow0KLQ0KLSAgdHJlZS5zaXplID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOw0KLSAgICBzaXplID0geDsNCi0gICAgcmV0dXJuIHRyZWU7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQodHJlZSwgaGllcmFyY2h5KTsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF90cmVlU2VwYXJhdGlvbihhLCBiKSB7DQotICByZXR1cm4gYS5wYXJlbnQgPT0gYi5wYXJlbnQgPyAxIDogMjsNCi19DQotDQotLy8gZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVTZXBhcmF0aW9uUmFkaWFsKGEsIGIpIHsNCi0vLyAgIHJldHVybiAoYS5wYXJlbnQgPT0gYi5wYXJlbnQgPyAxIDogMikgLyBhLmRlcHRoOw0KLS8vIH0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfdHJlZUxlZnQobm9kZSkgew0KLSAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsNCi0gIHJldHVybiBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPyBjaGlsZHJlblswXSA6IG5vZGUuX3RyZWUudGhyZWFkOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfdHJlZVJpZ2h0KG5vZGUpIHsNCi0gIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sDQotICAgICAgbjsNCi0gIHJldHVybiBjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkgPyBjaGlsZHJlbltuIC0gMV0gOiBub2RlLl90cmVlLnRocmVhZDsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVTZWFyY2gobm9kZSwgY29tcGFyZSkgew0KLSAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsNCi0gIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsNCi0gICAgdmFyIGNoaWxkLA0KLSAgICAgICAgbiwNCi0gICAgICAgIGkgPSAtMTsNCi0gICAgd2hpbGUgKCsraSA8IG4pIHsNCi0gICAgICBpZiAoY29tcGFyZShjaGlsZCA9IGQzX2xheW91dF90cmVlU2VhcmNoKGNoaWxkcmVuW2ldLCBjb21wYXJlKSwgbm9kZSkgPiAwKSB7DQotICAgICAgICBub2RlID0gY2hpbGQ7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotICByZXR1cm4gbm9kZTsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVSaWdodG1vc3QoYSwgYikgew0KLSAgcmV0dXJuIGEueCAtIGIueDsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVMZWZ0bW9zdChhLCBiKSB7DQotICByZXR1cm4gYi54IC0gYS54Ow0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfdHJlZURlZXBlc3QoYSwgYikgew0KLSAgcmV0dXJuIGEuZGVwdGggLSBiLmRlcHRoOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19sYXlvdXRfdHJlZVZpc2l0QWZ0ZXIobm9kZSwgY2FsbGJhY2spIHsNCi0gIGZ1bmN0aW9uIHZpc2l0KG5vZGUsIHByZXZpb3VzU2libGluZykgew0KLSAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOw0KLSAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7DQotICAgICAgdmFyIGNoaWxkLA0KLSAgICAgICAgICBwcmV2aW91c0NoaWxkID0gbnVsbCwNCi0gICAgICAgICAgaSA9IC0xLA0KLSAgICAgICAgICBuOw0KLSAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQotICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KLSAgICAgICAgdmlzaXQoY2hpbGQsIHByZXZpb3VzQ2hpbGQpOw0KLSAgICAgICAgcHJldmlvdXNDaGlsZCA9IGNoaWxkOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBjYWxsYmFjayhub2RlLCBwcmV2aW91c1NpYmxpbmcpOw0KLSAgfQ0KLSAgdmlzaXQobm9kZSwgbnVsbCk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF90cmVlU2hpZnQobm9kZSkgew0KLSAgdmFyIHNoaWZ0ID0gMCwNCi0gICAgICBjaGFuZ2UgPSAwLA0KLSAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwNCi0gICAgICBpID0gY2hpbGRyZW4ubGVuZ3RoLA0KLSAgICAgIGNoaWxkOw0KLSAgd2hpbGUgKC0taSA+PSAwKSB7DQotICAgIGNoaWxkID0gY2hpbGRyZW5baV0uX3RyZWU7DQotICAgIGNoaWxkLnByZWxpbSArPSBzaGlmdDsNCi0gICAgY2hpbGQubW9kICs9IHNoaWZ0Ow0KLSAgICBzaGlmdCArPSBjaGlsZC5zaGlmdCArIChjaGFuZ2UgKz0gY2hpbGQuY2hhbmdlKTsNCi0gIH0NCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVNb3ZlKGFuY2VzdG9yLCBub2RlLCBzaGlmdCkgew0KLSAgYW5jZXN0b3IgPSBhbmNlc3Rvci5fdHJlZTsNCi0gIG5vZGUgPSBub2RlLl90cmVlOw0KLSAgdmFyIGNoYW5nZSA9IHNoaWZ0IC8gKG5vZGUubnVtYmVyIC0gYW5jZXN0b3IubnVtYmVyKTsNCi0gIGFuY2VzdG9yLmNoYW5nZSArPSBjaGFuZ2U7DQotICBub2RlLmNoYW5nZSAtPSBjaGFuZ2U7DQotICBub2RlLnNoaWZ0ICs9IHNoaWZ0Ow0KLSAgbm9kZS5wcmVsaW0gKz0gc2hpZnQ7DQotICBub2RlLm1vZCArPSBzaGlmdDsNCi19DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVBbmNlc3Rvcih2aW0sIG5vZGUsIGFuY2VzdG9yKSB7DQotICByZXR1cm4gdmltLl90cmVlLmFuY2VzdG9yLnBhcmVudCA9PSBub2RlLnBhcmVudA0KLSAgICAgID8gdmltLl90cmVlLmFuY2VzdG9yDQotICAgICAgOiBhbmNlc3RvcjsNCi19DQotLy8gU3F1YXJpZmllZCBUcmVlbWFwcyBieSBNYXJrIEJydWxzLCBLZWVzIEh1aXppbmcsIGFuZCBKYXJrZSBKLiB2YW4gV2lqaw0KLS8vIE1vZGlmaWVkIHRvIHN1cHBvcnQgYSB0YXJnZXQgYXNwZWN0IHJhdGlvIGJ5IEplZmYgSGVlcg0KLWQzLmxheW91dC50cmVlbWFwID0gZnVuY3Rpb24oKSB7DQotICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLA0KLSAgICAgIHJvdW5kID0gTWF0aC5yb3VuZCwNCi0gICAgICBzaXplID0gWzEsIDFdLCAvLyB3aWR0aCwgaGVpZ2h0DQotICAgICAgcGFkZGluZyA9IG51bGwsDQotICAgICAgcGFkID0gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsLA0KLSAgICAgIHN0aWNreSA9IGZhbHNlLA0KLSAgICAgIHN0aWNraWVzLA0KLSAgICAgIHJhdGlvID0gMC41ICogKDEgKyBNYXRoLnNxcnQoNSkpOyAvLyBnb2xkZW4gcmF0aW8NCi0NCi0gIC8vIENvbXB1dGUgdGhlIGFyZWEgZm9yIGVhY2ggY2hpbGQgYmFzZWQgb24gdmFsdWUgJiBzY2FsZS4NCi0gIGZ1bmN0aW9uIHNjYWxlKGNoaWxkcmVuLCBrKSB7DQotICAgIHZhciBpID0gLTEsDQotICAgICAgICBuID0gY2hpbGRyZW4ubGVuZ3RoLA0KLSAgICAgICAgY2hpbGQsDQotICAgICAgICBhcmVhOw0KLSAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgIGFyZWEgPSAoY2hpbGQgPSBjaGlsZHJlbltpXSkudmFsdWUgKiAoayA8IDAgPyAwIDogayk7DQotICAgICAgY2hpbGQuYXJlYSA9IGlzTmFOKGFyZWEpIHx8IGFyZWEgPD0gMCA/IDAgOiBhcmVhOw0KLSAgICB9DQotICB9DQotDQotICAvLyBSZWN1cnNpdmVseSBhcnJhbmdlcyB0aGUgc3BlY2lmaWVkIG5vZGUncyBjaGlsZHJlbiBpbnRvIHNxdWFyaWZpZWQgcm93cy4NCi0gIGZ1bmN0aW9uIHNxdWFyaWZ5KG5vZGUpIHsNCi0gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsNCi0gICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgew0KLSAgICAgIHZhciByZWN0ID0gcGFkKG5vZGUpLA0KLSAgICAgICAgICByb3cgPSBbXSwNCi0gICAgICAgICAgcmVtYWluaW5nID0gY2hpbGRyZW4uc2xpY2UoKSwgLy8gY29weS1vbi13cml0ZQ0KLSAgICAgICAgICBjaGlsZCwNCi0gICAgICAgICAgYmVzdCA9IEluZmluaXR5LCAvLyB0aGUgYmVzdCByb3cgc2NvcmUgc28gZmFyDQotICAgICAgICAgIHNjb3JlLCAvLyB0aGUgY3VycmVudCByb3cgc2NvcmUNCi0gICAgICAgICAgdSA9IE1hdGgubWluKHJlY3QuZHgsIHJlY3QuZHkpLCAvLyBpbml0aWFsIG9yaWVudGF0aW9uDQotICAgICAgICAgIG47DQotICAgICAgc2NhbGUocmVtYWluaW5nLCByZWN0LmR4ICogcmVjdC5keSAvIG5vZGUudmFsdWUpOw0KLSAgICAgIHJvdy5hcmVhID0gMDsNCi0gICAgICB3aGlsZSAoKG4gPSByZW1haW5pbmcubGVuZ3RoKSA+IDApIHsNCi0gICAgICAgIHJvdy5wdXNoKGNoaWxkID0gcmVtYWluaW5nW24gLSAxXSk7DQotICAgICAgICByb3cuYXJlYSArPSBjaGlsZC5hcmVhOw0KLSAgICAgICAgaWYgKChzY29yZSA9IHdvcnN0KHJvdywgdSkpIDw9IGJlc3QpIHsgLy8gY29udGludWUgd2l0aCB0aGlzIG9yaWVudGF0aW9uDQotICAgICAgICAgIHJlbWFpbmluZy5wb3AoKTsNCi0gICAgICAgICAgYmVzdCA9IHNjb3JlOw0KLSAgICAgICAgfSBlbHNlIHsgLy8gYWJvcnQsIGFuZCB0cnkgYSBkaWZmZXJlbnQgb3JpZW50YXRpb24NCi0gICAgICAgICAgcm93LmFyZWEgLT0gcm93LnBvcCgpLmFyZWE7DQotICAgICAgICAgIHBvc2l0aW9uKHJvdywgdSwgcmVjdCwgZmFsc2UpOw0KLSAgICAgICAgICB1ID0gTWF0aC5taW4ocmVjdC5keCwgcmVjdC5keSk7DQotICAgICAgICAgIHJvdy5sZW5ndGggPSByb3cuYXJlYSA9IDA7DQotICAgICAgICAgIGJlc3QgPSBJbmZpbml0eTsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgaWYgKHJvdy5sZW5ndGgpIHsNCi0gICAgICAgIHBvc2l0aW9uKHJvdywgdSwgcmVjdCwgdHJ1ZSk7DQotICAgICAgICByb3cubGVuZ3RoID0gcm93LmFyZWEgPSAwOw0KLSAgICAgIH0NCi0gICAgICBjaGlsZHJlbi5mb3JFYWNoKHNxdWFyaWZ5KTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gUmVjdXJzaXZlbHkgcmVzaXplcyB0aGUgc3BlY2lmaWVkIG5vZGUncyBjaGlsZHJlbiBpbnRvIGV4aXN0aW5nIHJvd3MuDQotICAvLyBQcmVzZXJ2ZXMgdGhlIGV4aXN0aW5nIGxheW91dCENCi0gIGZ1bmN0aW9uIHN0aWNraWZ5KG5vZGUpIHsNCi0gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsNCi0gICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgew0KLSAgICAgIHZhciByZWN0ID0gcGFkKG5vZGUpLA0KLSAgICAgICAgICByZW1haW5pbmcgPSBjaGlsZHJlbi5zbGljZSgpLCAvLyBjb3B5LW9uLXdyaXRlDQotICAgICAgICAgIGNoaWxkLA0KLSAgICAgICAgICByb3cgPSBbXTsNCi0gICAgICBzY2FsZShyZW1haW5pbmcsIHJlY3QuZHggKiByZWN0LmR5IC8gbm9kZS52YWx1ZSk7DQotICAgICAgcm93LmFyZWEgPSAwOw0KLSAgICAgIHdoaWxlIChjaGlsZCA9IHJlbWFpbmluZy5wb3AoKSkgew0KLSAgICAgICAgcm93LnB1c2goY2hpbGQpOw0KLSAgICAgICAgcm93LmFyZWEgKz0gY2hpbGQuYXJlYTsNCi0gICAgICAgIGlmIChjaGlsZC56ICE9IG51bGwpIHsNCi0gICAgICAgICAgcG9zaXRpb24ocm93LCBjaGlsZC56ID8gcmVjdC5keCA6IHJlY3QuZHksIHJlY3QsICFyZW1haW5pbmcubGVuZ3RoKTsNCi0gICAgICAgICAgcm93Lmxlbmd0aCA9IHJvdy5hcmVhID0gMDsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgY2hpbGRyZW4uZm9yRWFjaChzdGlja2lmeSk7DQotICAgIH0NCi0gIH0NCi0NCi0gIC8vIENvbXB1dGVzIHRoZSBzY29yZSBmb3IgdGhlIHNwZWNpZmllZCByb3csIGFzIHRoZSB3b3JzdCBhc3BlY3QgcmF0aW8uDQotICBmdW5jdGlvbiB3b3JzdChyb3csIHUpIHsNCi0gICAgdmFyIHMgPSByb3cuYXJlYSwNCi0gICAgICAgIHIsDQotICAgICAgICBybWF4ID0gMCwNCi0gICAgICAgIHJtaW4gPSBJbmZpbml0eSwNCi0gICAgICAgIGkgPSAtMSwNCi0gICAgICAgIG4gPSByb3cubGVuZ3RoOw0KLSAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgIGlmICghKHIgPSByb3dbaV0uYXJlYSkpIGNvbnRpbnVlOw0KLSAgICAgIGlmIChyIDwgcm1pbikgcm1pbiA9IHI7DQotICAgICAgaWYgKHIgPiBybWF4KSBybWF4ID0gcjsNCi0gICAgfQ0KLSAgICBzICo9IHM7DQotICAgIHUgKj0gdTsNCi0gICAgcmV0dXJuIHMNCi0gICAgICAgID8gTWF0aC5tYXgoKHUgKiBybWF4ICogcmF0aW8pIC8gcywgcyAvICh1ICogcm1pbiAqIHJhdGlvKSkNCi0gICAgICAgIDogSW5maW5pdHk7DQotICB9DQotDQotICAvLyBQb3NpdGlvbnMgdGhlIHNwZWNpZmllZCByb3cgb2Ygbm9kZXMuIE1vZGlmaWVzIGByZWN0YC4NCi0gIGZ1bmN0aW9uIHBvc2l0aW9uKHJvdywgdSwgcmVjdCwgZmx1c2gpIHsNCi0gICAgdmFyIGkgPSAtMSwNCi0gICAgICAgIG4gPSByb3cubGVuZ3RoLA0KLSAgICAgICAgeCA9IHJlY3QueCwNCi0gICAgICAgIHkgPSByZWN0LnksDQotICAgICAgICB2ID0gdSA/IHJvdW5kKHJvdy5hcmVhIC8gdSkgOiAwLA0KLSAgICAgICAgbzsNCi0gICAgaWYgKHUgPT0gcmVjdC5keCkgeyAvLyBob3Jpem9udGFsIHN1YmRpdmlzaW9uDQotICAgICAgaWYgKGZsdXNoIHx8IHYgPiByZWN0LmR5KSB2ID0gcmVjdC5keTsgLy8gb3Zlcit1bmRlcmZsb3cNCi0gICAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgICAgbyA9IHJvd1tpXTsNCi0gICAgICAgIG8ueCA9IHg7DQotICAgICAgICBvLnkgPSB5Ow0KLSAgICAgICAgby5keSA9IHY7DQotICAgICAgICB4ICs9IG8uZHggPSBNYXRoLm1pbihyZWN0LnggKyByZWN0LmR4IC0geCwgdiA/IHJvdW5kKG8uYXJlYSAvIHYpIDogMCk7DQotICAgICAgfQ0KLSAgICAgIG8ueiA9IHRydWU7DQotICAgICAgby5keCArPSByZWN0LnggKyByZWN0LmR4IC0geDsgLy8gcm91bmRpbmcgZXJyb3INCi0gICAgICByZWN0LnkgKz0gdjsNCi0gICAgICByZWN0LmR5IC09IHY7DQotICAgIH0gZWxzZSB7IC8vIHZlcnRpY2FsIHN1YmRpdmlzaW9uDQotICAgICAgaWYgKGZsdXNoIHx8IHYgPiByZWN0LmR4KSB2ID0gcmVjdC5keDsgLy8gb3Zlcit1bmRlcmZsb3cNCi0gICAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgICAgbyA9IHJvd1tpXTsNCi0gICAgICAgIG8ueCA9IHg7DQotICAgICAgICBvLnkgPSB5Ow0KLSAgICAgICAgby5keCA9IHY7DQotICAgICAgICB5ICs9IG8uZHkgPSBNYXRoLm1pbihyZWN0LnkgKyByZWN0LmR5IC0geSwgdiA/IHJvdW5kKG8uYXJlYSAvIHYpIDogMCk7DQotICAgICAgfQ0KLSAgICAgIG8ueiA9IGZhbHNlOw0KLSAgICAgIG8uZHkgKz0gcmVjdC55ICsgcmVjdC5keSAtIHk7IC8vIHJvdW5kaW5nIGVycm9yDQotICAgICAgcmVjdC54ICs9IHY7DQotICAgICAgcmVjdC5keCAtPSB2Ow0KLSAgICB9DQotICB9DQotDQotICBmdW5jdGlvbiB0cmVlbWFwKGQpIHsNCi0gICAgdmFyIG5vZGVzID0gc3RpY2tpZXMgfHwgaGllcmFyY2h5KGQpLA0KLSAgICAgICAgcm9vdCA9IG5vZGVzWzBdOw0KLSAgICByb290LnggPSAwOw0KLSAgICByb290LnkgPSAwOw0KLSAgICByb290LmR4ID0gc2l6ZVswXTsNCi0gICAgcm9vdC5keSA9IHNpemVbMV07DQotICAgIGlmIChzdGlja2llcykgaGllcmFyY2h5LnJldmFsdWUocm9vdCk7DQotICAgIHNjYWxlKFtyb290XSwgcm9vdC5keCAqIHJvb3QuZHkgLyByb290LnZhbHVlKTsNCi0gICAgKHN0aWNraWVzID8gc3RpY2tpZnkgOiBzcXVhcmlmeSkocm9vdCk7DQotICAgIGlmIChzdGlja3kpIHN0aWNraWVzID0gbm9kZXM7DQotICAgIHJldHVybiBub2RlczsNCi0gIH0NCi0NCi0gIHRyZWVtYXAuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTsNCi0gICAgc2l6ZSA9IHg7DQotICAgIHJldHVybiB0cmVlbWFwOw0KLSAgfTsNCi0NCi0gIHRyZWVtYXAucGFkZGluZyA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkZGluZzsNCi0NCi0gICAgZnVuY3Rpb24gcGFkRnVuY3Rpb24obm9kZSkgew0KLSAgICAgIHZhciBwID0geC5jYWxsKHRyZWVtYXAsIG5vZGUsIG5vZGUuZGVwdGgpOw0KLSAgICAgIHJldHVybiBwID09IG51bGwNCi0gICAgICAgICAgPyBkM19sYXlvdXRfdHJlZW1hcFBhZE51bGwobm9kZSkNCi0gICAgICAgICAgOiBkM19sYXlvdXRfdHJlZW1hcFBhZChub2RlLCB0eXBlb2YgcCA9PT0gIm51bWJlciIgPyBbcCwgcCwgcCwgcF0gOiBwKTsNCi0gICAgfQ0KLQ0KLSAgICBmdW5jdGlvbiBwYWRDb25zdGFudChub2RlKSB7DQotICAgICAgcmV0dXJuIGQzX2xheW91dF90cmVlbWFwUGFkKG5vZGUsIHgpOw0KLSAgICB9DQotDQotICAgIHZhciB0eXBlOw0KLSAgICBwYWQgPSAocGFkZGluZyA9IHgpID09IG51bGwgPyBkM19sYXlvdXRfdHJlZW1hcFBhZE51bGwNCi0gICAgICAgIDogKHR5cGUgPSB0eXBlb2YgeCkgPT09ICJmdW5jdGlvbiIgPyBwYWRGdW5jdGlvbg0KLSAgICAgICAgOiB0eXBlID09PSAibnVtYmVyIiA/ICh4ID0gW3gsIHgsIHgsIHhdLCBwYWRDb25zdGFudCkNCi0gICAgICAgIDogcGFkQ29uc3RhbnQ7DQotICAgIHJldHVybiB0cmVlbWFwOw0KLSAgfTsNCi0NCi0gIHRyZWVtYXAucm91bmQgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJvdW5kICE9IE51bWJlcjsNCi0gICAgcm91bmQgPSB4ID8gTWF0aC5yb3VuZCA6IE51bWJlcjsNCi0gICAgcmV0dXJuIHRyZWVtYXA7DQotICB9Ow0KLQ0KLSAgdHJlZW1hcC5zdGlja3kgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0aWNreTsNCi0gICAgc3RpY2t5ID0geDsNCi0gICAgc3RpY2tpZXMgPSBudWxsOw0KLSAgICByZXR1cm4gdHJlZW1hcDsNCi0gIH07DQotDQotICB0cmVlbWFwLnJhdGlvID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYXRpbzsNCi0gICAgcmF0aW8gPSB4Ow0KLSAgICByZXR1cm4gdHJlZW1hcDsNCi0gIH07DQotDQotICByZXR1cm4gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZCh0cmVlbWFwLCBoaWVyYXJjaHkpOw0KLX07DQotDQotZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsKG5vZGUpIHsNCi0gIHJldHVybiB7eDogbm9kZS54LCB5OiBub2RlLnksIGR4OiBub2RlLmR4LCBkeTogbm9kZS5keX07DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2xheW91dF90cmVlbWFwUGFkKG5vZGUsIHBhZGRpbmcpIHsNCi0gIHZhciB4ID0gbm9kZS54ICsgcGFkZGluZ1szXSwNCi0gICAgICB5ID0gbm9kZS55ICsgcGFkZGluZ1swXSwNCi0gICAgICBkeCA9IG5vZGUuZHggLSBwYWRkaW5nWzFdIC0gcGFkZGluZ1szXSwNCi0gICAgICBkeSA9IG5vZGUuZHkgLSBwYWRkaW5nWzBdIC0gcGFkZGluZ1syXTsNCi0gIGlmIChkeCA8IDApIHsgeCArPSBkeCAvIDI7IGR4ID0gMDsgfQ0KLSAgaWYgKGR5IDwgMCkgeyB5ICs9IGR5IC8gMjsgZHkgPSAwOyB9DQotICByZXR1cm4ge3g6IHgsIHk6IHksIGR4OiBkeCwgZHk6IGR5fTsNCi19DQotZDMuY3N2ID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgew0KLSAgZDMudGV4dCh1cmwsICJ0ZXh0L2NzdiIsIGZ1bmN0aW9uKHRleHQpIHsNCi0gICAgY2FsbGJhY2sodGV4dCAmJiBkMy5jc3YucGFyc2UodGV4dCkpOw0KLSAgfSk7DQotfTsNCi1kMy5jc3YucGFyc2UgPSBmdW5jdGlvbih0ZXh0KSB7DQotICB2YXIgaGVhZGVyOw0KLSAgcmV0dXJuIGQzLmNzdi5wYXJzZVJvd3ModGV4dCwgZnVuY3Rpb24ocm93LCBpKSB7DQotICAgIGlmIChpKSB7DQotICAgICAgdmFyIG8gPSB7fSwgaiA9IC0xLCBtID0gaGVhZGVyLmxlbmd0aDsNCi0gICAgICB3aGlsZSAoKytqIDwgbSkgb1toZWFkZXJbal1dID0gcm93W2pdOw0KLSAgICAgIHJldHVybiBvOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGhlYWRlciA9IHJvdzsNCi0gICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgfSk7DQotfTsNCi0NCi1kMy5jc3YucGFyc2VSb3dzID0gZnVuY3Rpb24odGV4dCwgZikgew0KLSAgdmFyIEVPTCA9IHt9LCAvLyBzZW50aW5lbCB2YWx1ZSBmb3IgZW5kLW9mLWxpbmUNCi0gICAgICBFT0YgPSB7fSwgLy8gc2VudGluZWwgdmFsdWUgZm9yIGVuZC1vZi1maWxlDQotICAgICAgcm93cyA9IFtdLCAvLyBvdXRwdXQgcm93cw0KLSAgICAgIHJlID0gL1xyXG58WyxcclxuXS9nLCAvLyBmaWVsZCBzZXBhcmF0b3IgcmVnZXgNCi0gICAgICBuID0gMCwgLy8gdGhlIGN1cnJlbnQgbGluZSBudW1iZXINCi0gICAgICB0LCAvLyB0aGUgY3VycmVudCB0b2tlbg0KLSAgICAgIGVvbDsgLy8gaXMgdGhlIGN1cnJlbnQgdG9rZW4gZm9sbG93ZWQgYnkgRU9MPw0KLQ0KLSAgcmUubGFzdEluZGV4ID0gMDsgLy8gd29yay1hcm91bmQgYnVnIGluIEZGIDMuNg0KLQ0KLSAgLyoqIEBwcml2YXRlIFJldHVybnMgdGhlIG5leHQgdG9rZW4uICovDQotICBmdW5jdGlvbiB0b2tlbigpIHsNCi0gICAgaWYgKHJlLmxhc3RJbmRleCA+PSB0ZXh0Lmxlbmd0aCkgcmV0dXJuIEVPRjsgLy8gc3BlY2lhbCBjYXNlOiBlbmQgb2YgZmlsZQ0KLSAgICBpZiAoZW9sKSB7IGVvbCA9IGZhbHNlOyByZXR1cm4gRU9MOyB9IC8vIHNwZWNpYWwgY2FzZTogZW5kIG9mIGxpbmUNCi0NCi0gICAgLy8gc3BlY2lhbCBjYXNlOiBxdW90ZXMNCi0gICAgdmFyIGogPSByZS5sYXN0SW5kZXg7DQotICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaikgPT09IDM0KSB7DQotICAgICAgdmFyIGkgPSBqOw0KLSAgICAgIHdoaWxlIChpKysgPCB0ZXh0Lmxlbmd0aCkgew0KLSAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpKSA9PT0gMzQpIHsNCi0gICAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpICsgMSkgIT09IDM0KSBicmVhazsNCi0gICAgICAgICAgaSsrOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICByZS5sYXN0SW5kZXggPSBpICsgMjsNCi0gICAgICB2YXIgYyA9IHRleHQuY2hhckNvZGVBdChpICsgMSk7DQotICAgICAgaWYgKGMgPT09IDEzKSB7DQotICAgICAgICBlb2wgPSB0cnVlOw0KLSAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpICsgMikgPT09IDEwKSByZS5sYXN0SW5kZXgrKzsNCi0gICAgICB9IGVsc2UgaWYgKGMgPT09IDEwKSB7DQotICAgICAgICBlb2wgPSB0cnVlOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoaiArIDEsIGkpLnJlcGxhY2UoLyIiL2csICJcIiIpOw0KLSAgICB9DQotDQotICAgIC8vIGNvbW1vbiBjYXNlDQotICAgIHZhciBtID0gcmUuZXhlYyh0ZXh0KTsNCi0gICAgaWYgKG0pIHsNCi0gICAgICBlb2wgPSBtWzBdLmNoYXJDb2RlQXQoMCkgIT09IDQ0Ow0KLSAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZyhqLCBtLmluZGV4KTsNCi0gICAgfQ0KLSAgICByZS5sYXN0SW5kZXggPSB0ZXh0Lmxlbmd0aDsNCi0gICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKGopOw0KLSAgfQ0KLQ0KLSAgd2hpbGUgKCh0ID0gdG9rZW4oKSkgIT09IEVPRikgew0KLSAgICB2YXIgYSA9IFtdOw0KLSAgICB3aGlsZSAoKHQgIT09IEVPTCkgJiYgKHQgIT09IEVPRikpIHsNCi0gICAgICBhLnB1c2godCk7DQotICAgICAgdCA9IHRva2VuKCk7DQotICAgIH0NCi0gICAgaWYgKGYgJiYgIShhID0gZihhLCBuKyspKSkgY29udGludWU7DQotICAgIHJvd3MucHVzaChhKTsNCi0gIH0NCi0NCi0gIHJldHVybiByb3dzOw0KLX07DQotZDMuY3N2LmZvcm1hdCA9IGZ1bmN0aW9uKHJvd3MpIHsNCi0gIHJldHVybiByb3dzLm1hcChkM19jc3ZfZm9ybWF0Um93KS5qb2luKCJcbiIpOw0KLX07DQotDQotZnVuY3Rpb24gZDNfY3N2X2Zvcm1hdFJvdyhyb3cpIHsNCi0gIHJldHVybiByb3cubWFwKGQzX2Nzdl9mb3JtYXRWYWx1ZSkuam9pbigiLCIpOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19jc3ZfZm9ybWF0VmFsdWUodGV4dCkgew0KLSAgcmV0dXJuIC9bIixcbl0vLnRlc3QodGV4dCkNCi0gICAgICA/ICJcIiIgKyB0ZXh0LnJlcGxhY2UoL1wiL2csICJcIlwiIikgKyAiXCIiDQotICAgICAgOiB0ZXh0Ow0KLX0NCi1kMy5nZW8gPSB7fTsNCi0NCi12YXIgZDNfZ2VvX3JhZGlhbnMgPSBNYXRoLlBJIC8gMTgwOw0KLS8vIFRPRE8gY2xpcCBpbnB1dCBjb29yZGluYXRlcyBvbiBvcHBvc2l0ZSBoZW1pc3BoZXJlDQotZDMuZ2VvLmF6aW11dGhhbCA9IGZ1bmN0aW9uKCkgew0KLSAgdmFyIG1vZGUgPSAib3J0aG9ncmFwaGljIiwgLy8gb3Igc3RlcmVvZ3JhcGhpYywgZ25vbW9uaWMsIGVxdWlkaXN0YW50IG9yIGVxdWFsYXJlYQ0KLSAgICAgIG9yaWdpbiwNCi0gICAgICBzY2FsZSA9IDIwMCwNCi0gICAgICB0cmFuc2xhdGUgPSBbNDgwLCAyNTBdLA0KLSAgICAgIHgwLA0KLSAgICAgIHkwLA0KLSAgICAgIGN5MCwNCi0gICAgICBzeTA7DQotDQotICBmdW5jdGlvbiBhemltdXRoYWwoY29vcmRpbmF0ZXMpIHsNCi0gICAgdmFyIHgxID0gY29vcmRpbmF0ZXNbMF0gKiBkM19nZW9fcmFkaWFucyAtIHgwLA0KLSAgICAgICAgeTEgPSBjb29yZGluYXRlc1sxXSAqIGQzX2dlb19yYWRpYW5zLA0KLSAgICAgICAgY3gxID0gTWF0aC5jb3MoeDEpLA0KLSAgICAgICAgc3gxID0gTWF0aC5zaW4oeDEpLA0KLSAgICAgICAgY3kxID0gTWF0aC5jb3MoeTEpLA0KLSAgICAgICAgc3kxID0gTWF0aC5zaW4oeTEpLA0KLSAgICAgICAgY2MgPSBtb2RlICE9PSAib3J0aG9ncmFwaGljIiA/IHN5MCAqIHN5MSArIGN5MCAqIGN5MSAqIGN4MSA6IG51bGwsDQotICAgICAgICBjLA0KLSAgICAgICAgayA9IG1vZGUgPT09ICJzdGVyZW9ncmFwaGljIiA/IDEgLyAoMSArIGNjKQ0KLSAgICAgICAgICA6IG1vZGUgPT09ICJnbm9tb25pYyIgPyAxIC8gY2MNCi0gICAgICAgICAgOiBtb2RlID09PSAiZXF1aWRpc3RhbnQiID8gKGMgPSBNYXRoLmFjb3MoY2MpLCBjID8gYyAvIE1hdGguc2luKGMpIDogMCkNCi0gICAgICAgICAgOiBtb2RlID09PSAiZXF1YWxhcmVhIiA/IE1hdGguc3FydCgyIC8gKDEgKyBjYykpDQotICAgICAgICAgIDogMSwNCi0gICAgICAgIHggPSBrICogY3kxICogc3gxLA0KLSAgICAgICAgeSA9IGsgKiAoc3kwICogY3kxICogY3gxIC0gY3kwICogc3kxKTsNCi0gICAgcmV0dXJuIFsNCi0gICAgICBzY2FsZSAqIHggKyB0cmFuc2xhdGVbMF0sDQotICAgICAgc2NhbGUgKiB5ICsgdHJhbnNsYXRlWzFdDQotICAgIF07DQotICB9DQotDQotICBhemltdXRoYWwuaW52ZXJ0ID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHsNCi0gICAgdmFyIHggPSAoY29vcmRpbmF0ZXNbMF0gLSB0cmFuc2xhdGVbMF0pIC8gc2NhbGUsDQotICAgICAgICB5ID0gKGNvb3JkaW5hdGVzWzFdIC0gdHJhbnNsYXRlWzFdKSAvIHNjYWxlLA0KLSAgICAgICAgcCA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KSwNCi0gICAgICAgIGMgPSBtb2RlID09PSAic3RlcmVvZ3JhcGhpYyIgPyAyICogTWF0aC5hdGFuKHApDQotICAgICAgICAgIDogbW9kZSA9PT0gImdub21vbmljIiA/IE1hdGguYXRhbihwKQ0KLSAgICAgICAgICA6IG1vZGUgPT09ICJlcXVpZGlzdGFudCIgPyBwDQotICAgICAgICAgIDogbW9kZSA9PT0gImVxdWFsYXJlYSIgPyAyICogTWF0aC5hc2luKC41ICogcCkNCi0gICAgICAgICAgOiBNYXRoLmFzaW4ocCksDQotICAgICAgICBzYyA9IE1hdGguc2luKGMpLA0KLSAgICAgICAgY2MgPSBNYXRoLmNvcyhjKTsNCi0gICAgcmV0dXJuIFsNCi0gICAgICAoeDAgKyBNYXRoLmF0YW4yKHggKiBzYywgcCAqIGN5MCAqIGNjICsgeSAqIHN5MCAqIHNjKSkgLyBkM19nZW9fcmFkaWFucywNCi0gICAgICBNYXRoLmFzaW4oY2MgKiBzeTAgLSAocCA/ICh5ICogc2MgKiBjeTApIC8gcCA6IDApKSAvIGQzX2dlb19yYWRpYW5zDQotICAgIF07DQotICB9Ow0KLQ0KLSAgYXppbXV0aGFsLm1vZGUgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG1vZGU7DQotICAgIG1vZGUgPSB4ICsgIiI7DQotICAgIHJldHVybiBhemltdXRoYWw7DQotICB9Ow0KLQ0KLSAgYXppbXV0aGFsLm9yaWdpbiA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZ2luOw0KLSAgICBvcmlnaW4gPSB4Ow0KLSAgICB4MCA9IG9yaWdpblswXSAqIGQzX2dlb19yYWRpYW5zOw0KLSAgICB5MCA9IG9yaWdpblsxXSAqIGQzX2dlb19yYWRpYW5zOw0KLSAgICBjeTAgPSBNYXRoLmNvcyh5MCk7DQotICAgIHN5MCA9IE1hdGguc2luKHkwKTsNCi0gICAgcmV0dXJuIGF6aW11dGhhbDsNCi0gIH07DQotDQotICBhemltdXRoYWwuc2NhbGUgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlOw0KLSAgICBzY2FsZSA9ICt4Ow0KLSAgICByZXR1cm4gYXppbXV0aGFsOw0KLSAgfTsNCi0NCi0gIGF6aW11dGhhbC50cmFuc2xhdGUgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRyYW5zbGF0ZTsNCi0gICAgdHJhbnNsYXRlID0gWyt4WzBdLCAreFsxXV07DQotICAgIHJldHVybiBhemltdXRoYWw7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGF6aW11dGhhbC5vcmlnaW4oWzAsIDBdKTsNCi19Ow0KLS8vIERlcml2ZWQgZnJvbSBUb20gQ2FyZGVuJ3MgQWxiZXJzIGltcGxlbWVudGF0aW9uIGZvciBQcm90b3Zpcy4NCi0vLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzQ3NjIzOA0KLS8vIGh0dHA6Ly9tYXRod29ybGQud29sZnJhbS5jb20vQWxiZXJzRXF1YWwtQXJlYUNvbmljUHJvamVjdGlvbi5odG1sDQotDQotZDMuZ2VvLmFsYmVycyA9IGZ1bmN0aW9uKCkgew0KLSAgdmFyIG9yaWdpbiA9IFstOTgsIDM4XSwNCi0gICAgICBwYXJhbGxlbHMgPSBbMjkuNSwgNDUuNV0sDQotICAgICAgc2NhbGUgPSAxMDAwLA0KLSAgICAgIHRyYW5zbGF0ZSA9IFs0ODAsIDI1MF0sDQotICAgICAgbG5nMCwgLy8gZDNfZ2VvX3JhZGlhbnMgKiBvcmlnaW5bMF0NCi0gICAgICBuLA0KLSAgICAgIEMsDQotICAgICAgcDA7DQotDQotICBmdW5jdGlvbiBhbGJlcnMoY29vcmRpbmF0ZXMpIHsNCi0gICAgdmFyIHQgPSBuICogKGQzX2dlb19yYWRpYW5zICogY29vcmRpbmF0ZXNbMF0gLSBsbmcwKSwNCi0gICAgICAgIHAgPSBNYXRoLnNxcnQoQyAtIDIgKiBuICogTWF0aC5zaW4oZDNfZ2VvX3JhZGlhbnMgKiBjb29yZGluYXRlc1sxXSkpIC8gbjsNCi0gICAgcmV0dXJuIFsNCi0gICAgICBzY2FsZSAqIHAgKiBNYXRoLnNpbih0KSArIHRyYW5zbGF0ZVswXSwNCi0gICAgICBzY2FsZSAqIChwICogTWF0aC5jb3ModCkgLSBwMCkgKyB0cmFuc2xhdGVbMV0NCi0gICAgXTsNCi0gIH0NCi0NCi0gIGFsYmVycy5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgew0KLSAgICB2YXIgeCA9IChjb29yZGluYXRlc1swXSAtIHRyYW5zbGF0ZVswXSkgLyBzY2FsZSwNCi0gICAgICAgIHkgPSAoY29vcmRpbmF0ZXNbMV0gLSB0cmFuc2xhdGVbMV0pIC8gc2NhbGUsDQotICAgICAgICBwMHkgPSBwMCArIHksDQotICAgICAgICB0ID0gTWF0aC5hdGFuMih4LCBwMHkpLA0KLSAgICAgICAgcCA9IE1hdGguc3FydCh4ICogeCArIHAweSAqIHAweSk7DQotICAgIHJldHVybiBbDQotICAgICAgKGxuZzAgKyB0IC8gbikgLyBkM19nZW9fcmFkaWFucywNCi0gICAgICBNYXRoLmFzaW4oKEMgLSBwICogcCAqIG4gKiBuKSAvICgyICogbikpIC8gZDNfZ2VvX3JhZGlhbnMNCi0gICAgXTsNCi0gIH07DQotDQotICBmdW5jdGlvbiByZWxvYWQoKSB7DQotICAgIHZhciBwaGkxID0gZDNfZ2VvX3JhZGlhbnMgKiBwYXJhbGxlbHNbMF0sDQotICAgICAgICBwaGkyID0gZDNfZ2VvX3JhZGlhbnMgKiBwYXJhbGxlbHNbMV0sDQotICAgICAgICBsYXQwID0gZDNfZ2VvX3JhZGlhbnMgKiBvcmlnaW5bMV0sDQotICAgICAgICBzID0gTWF0aC5zaW4ocGhpMSksDQotICAgICAgICBjID0gTWF0aC5jb3MocGhpMSk7DQotICAgIGxuZzAgPSBkM19nZW9fcmFkaWFucyAqIG9yaWdpblswXTsNCi0gICAgbiA9IC41ICogKHMgKyBNYXRoLnNpbihwaGkyKSk7DQotICAgIEMgPSBjICogYyArIDIgKiBuICogczsNCi0gICAgcDAgPSBNYXRoLnNxcnQoQyAtIDIgKiBuICogTWF0aC5zaW4obGF0MCkpIC8gbjsNCi0gICAgcmV0dXJuIGFsYmVyczsNCi0gIH0NCi0NCi0gIGFsYmVycy5vcmlnaW4gPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yaWdpbjsNCi0gICAgb3JpZ2luID0gWyt4WzBdLCAreFsxXV07DQotICAgIHJldHVybiByZWxvYWQoKTsNCi0gIH07DQotDQotICBhbGJlcnMucGFyYWxsZWxzID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYXJhbGxlbHM7DQotICAgIHBhcmFsbGVscyA9IFsreFswXSwgK3hbMV1dOw0KLSAgICByZXR1cm4gcmVsb2FkKCk7DQotICB9Ow0KLQ0KLSAgYWxiZXJzLnNjYWxlID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsNCi0gICAgc2NhbGUgPSAreDsNCi0gICAgcmV0dXJuIGFsYmVyczsNCi0gIH07DQotDQotICBhbGJlcnMudHJhbnNsYXRlID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0cmFuc2xhdGU7DQotICAgIHRyYW5zbGF0ZSA9IFsreFswXSwgK3hbMV1dOw0KLSAgICByZXR1cm4gYWxiZXJzOw0KLSAgfTsNCi0NCi0gIHJldHVybiByZWxvYWQoKTsNCi19Ow0KLQ0KLS8vIEEgY29tcG9zaXRlIHByb2plY3Rpb24gZm9yIHRoZSBVbml0ZWQgU3RhdGVzLCA5NjB4NTAwLiBUaGUgc2V0IG9mIHN0YW5kYXJkDQotLy8gcGFyYWxsZWxzIGZvciBlYWNoIHJlZ2lvbiBjb21lcyBmcm9tIFVTR1MsIHdoaWNoIGlzIHB1Ymxpc2hlZCBoZXJlOg0KLS8vIGh0dHA6Ly9lZ3NjLnVzZ3MuZ292L2lzYi9wdWJzL01hcFByb2plY3Rpb25zL3Byb2plY3Rpb25zLmh0bWwjYWxiZXJzDQotLy8gVE9ETyBhbGxvdyB0aGUgY29tcG9zaXRlIHByb2plY3Rpb24gdG8gYmUgcmVzY2FsZWQ/DQotZDMuZ2VvLmFsYmVyc1VzYSA9IGZ1bmN0aW9uKCkgew0KLSAgdmFyIGxvd2VyNDggPSBkMy5nZW8uYWxiZXJzKCk7DQotDQotICB2YXIgYWxhc2thID0gZDMuZ2VvLmFsYmVycygpDQotICAgICAgLm9yaWdpbihbLTE2MCwgNjBdKQ0KLSAgICAgIC5wYXJhbGxlbHMoWzU1LCA2NV0pOw0KLQ0KLSAgdmFyIGhhd2FpaSA9IGQzLmdlby5hbGJlcnMoKQ0KLSAgICAgIC5vcmlnaW4oWy0xNjAsIDIwXSkNCi0gICAgICAucGFyYWxsZWxzKFs4LCAxOF0pOw0KLQ0KLSAgdmFyIHB1ZXJ0b1JpY28gPSBkMy5nZW8uYWxiZXJzKCkNCi0gICAgICAub3JpZ2luKFstNjAsIDEwXSkNCi0gICAgICAucGFyYWxsZWxzKFs4LCAxOF0pOw0KLQ0KLSAgZnVuY3Rpb24gYWxiZXJzVXNhKGNvb3JkaW5hdGVzKSB7DQotICAgIHZhciBsb24gPSBjb29yZGluYXRlc1swXSwNCi0gICAgICAgIGxhdCA9IGNvb3JkaW5hdGVzWzFdOw0KLSAgICByZXR1cm4gKGxhdCA+IDUwID8gYWxhc2thDQotICAgICAgICA6IGxvbiA8IC0xNDAgPyBoYXdhaWkNCi0gICAgICAgIDogbGF0IDwgMjEgPyBwdWVydG9SaWNvDQotICAgICAgICA6IGxvd2VyNDgpKGNvb3JkaW5hdGVzKTsNCi0gIH0NCi0NCi0gIGFsYmVyc1VzYS5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC5zY2FsZSgpOw0KLSAgICBsb3dlcjQ4LnNjYWxlKHgpOw0KLSAgICBhbGFza2Euc2NhbGUoeCAqIC42KTsNCi0gICAgaGF3YWlpLnNjYWxlKHgpOw0KLSAgICBwdWVydG9SaWNvLnNjYWxlKHggKiAxLjUpOw0KLSAgICByZXR1cm4gYWxiZXJzVXNhLnRyYW5zbGF0ZShsb3dlcjQ4LnRyYW5zbGF0ZSgpKTsNCi0gIH07DQotDQotICBhbGJlcnNVc2EudHJhbnNsYXRlID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnRyYW5zbGF0ZSgpOw0KLSAgICB2YXIgZHogPSBsb3dlcjQ4LnNjYWxlKCkgLyAxMDAwLA0KLSAgICAgICAgZHggPSB4WzBdLA0KLSAgICAgICAgZHkgPSB4WzFdOw0KLSAgICBsb3dlcjQ4LnRyYW5zbGF0ZSh4KTsNCi0gICAgYWxhc2thLnRyYW5zbGF0ZShbZHggLSA0MDAgKiBkeiwgZHkgKyAxNzAgKiBkel0pOw0KLSAgICBoYXdhaWkudHJhbnNsYXRlKFtkeCAtIDE5MCAqIGR6LCBkeSArIDIwMCAqIGR6XSk7DQotICAgIHB1ZXJ0b1JpY28udHJhbnNsYXRlKFtkeCArIDU4MCAqIGR6LCBkeSArIDQzMCAqIGR6XSk7DQotICAgIHJldHVybiBhbGJlcnNVc2E7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGFsYmVyc1VzYS5zY2FsZShsb3dlcjQ4LnNjYWxlKCkpOw0KLX07DQotZDMuZ2VvLmJvbm5lID0gZnVuY3Rpb24oKSB7DQotICB2YXIgc2NhbGUgPSAyMDAsDQotICAgICAgdHJhbnNsYXRlID0gWzQ4MCwgMjUwXSwNCi0gICAgICB4MCwgLy8gb3JpZ2luIGxvbmdpdHVkZSBpbiByYWRpYW5zDQotICAgICAgeTAsIC8vIG9yaWdpbiBsYXRpdHVkZSBpbiByYWRpYW5zDQotICAgICAgeTEsIC8vIHBhcmFsbGVsIGxhdGl0dWRlIGluIHJhZGlhbnMNCi0gICAgICBjMTsgLy8gY290KHkxKQ0KLQ0KLSAgZnVuY3Rpb24gYm9ubmUoY29vcmRpbmF0ZXMpIHsNCi0gICAgdmFyIHggPSBjb29yZGluYXRlc1swXSAqIGQzX2dlb19yYWRpYW5zIC0geDAsDQotICAgICAgICB5ID0gY29vcmRpbmF0ZXNbMV0gKiBkM19nZW9fcmFkaWFucyAtIHkwOw0KLSAgICBpZiAoeTEpIHsNCi0gICAgICB2YXIgcCA9IGMxICsgeTEgLSB5LCBFID0geCAqIE1hdGguY29zKHkpIC8gcDsNCi0gICAgICB4ID0gcCAqIE1hdGguc2luKEUpOw0KLSAgICAgIHkgPSBwICogTWF0aC5jb3MoRSkgLSBjMTsNCi0gICAgfSBlbHNlIHsNCi0gICAgICB4ICo9IE1hdGguY29zKHkpOw0KLSAgICAgIHkgKj0gLTE7DQotICAgIH0NCi0gICAgcmV0dXJuIFsNCi0gICAgICBzY2FsZSAqIHggKyB0cmFuc2xhdGVbMF0sDQotICAgICAgc2NhbGUgKiB5ICsgdHJhbnNsYXRlWzFdDQotICAgIF07DQotICB9DQotDQotICBib25uZS5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgew0KLSAgICB2YXIgeCA9IChjb29yZGluYXRlc1swXSAtIHRyYW5zbGF0ZVswXSkgLyBzY2FsZSwNCi0gICAgICAgIHkgPSAoY29vcmRpbmF0ZXNbMV0gLSB0cmFuc2xhdGVbMV0pIC8gc2NhbGU7DQotICAgIGlmICh5MSkgew0KLSAgICAgIHZhciBjID0gYzEgKyB5LCBwID0gTWF0aC5zcXJ0KHggKiB4ICsgYyAqIGMpOw0KLSAgICAgIHkgPSBjMSArIHkxIC0gcDsNCi0gICAgICB4ID0geDAgKyBwICogTWF0aC5hdGFuMih4LCBjKSAvIE1hdGguY29zKHkpOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHkgKj0gLTE7DQotICAgICAgeCAvPSBNYXRoLmNvcyh5KTsNCi0gICAgfQ0KLSAgICByZXR1cm4gWw0KLSAgICAgIHggLyBkM19nZW9fcmFkaWFucywNCi0gICAgICB5IC8gZDNfZ2VvX3JhZGlhbnMNCi0gICAgXTsNCi0gIH07DQotDQotICAvLyA5MMKwIGZvciBXZXJuZXIsIDDCsCBmb3IgU2ludXNvaWRhbA0KLSAgYm9ubmUucGFyYWxsZWwgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkxIC8gZDNfZ2VvX3JhZGlhbnM7DQotICAgIGMxID0gMSAvIE1hdGgudGFuKHkxID0geCAqIGQzX2dlb19yYWRpYW5zKTsNCi0gICAgcmV0dXJuIGJvbm5lOw0KLSAgfTsNCi0NCi0gIGJvbm5lLm9yaWdpbiA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW3gwIC8gZDNfZ2VvX3JhZGlhbnMsIHkwIC8gZDNfZ2VvX3JhZGlhbnNdOw0KLSAgICB4MCA9IHhbMF0gKiBkM19nZW9fcmFkaWFuczsNCi0gICAgeTAgPSB4WzFdICogZDNfZ2VvX3JhZGlhbnM7DQotICAgIHJldHVybiBib25uZTsNCi0gIH07DQotDQotICBib25uZS5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2NhbGU7DQotICAgIHNjYWxlID0gK3g7DQotICAgIHJldHVybiBib25uZTsNCi0gIH07DQotDQotICBib25uZS50cmFuc2xhdGUgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRyYW5zbGF0ZTsNCi0gICAgdHJhbnNsYXRlID0gWyt4WzBdLCAreFsxXV07DQotICAgIHJldHVybiBib25uZTsNCi0gIH07DQotDQotICByZXR1cm4gYm9ubmUub3JpZ2luKFswLCAwXSkucGFyYWxsZWwoNDUpOw0KLX07DQotZDMuZ2VvLmVxdWlyZWN0YW5ndWxhciA9IGZ1bmN0aW9uKCkgew0KLSAgdmFyIHNjYWxlID0gNTAwLA0KLSAgICAgIHRyYW5zbGF0ZSA9IFs0ODAsIDI1MF07DQotDQotICBmdW5jdGlvbiBlcXVpcmVjdGFuZ3VsYXIoY29vcmRpbmF0ZXMpIHsNCi0gICAgdmFyIHggPSBjb29yZGluYXRlc1swXSAvIDM2MCwNCi0gICAgICAgIHkgPSAtY29vcmRpbmF0ZXNbMV0gLyAzNjA7DQotICAgIHJldHVybiBbDQotICAgICAgc2NhbGUgKiB4ICsgdHJhbnNsYXRlWzBdLA0KLSAgICAgIHNjYWxlICogeSArIHRyYW5zbGF0ZVsxXQ0KLSAgICBdOw0KLSAgfQ0KLQ0KLSAgZXF1aXJlY3Rhbmd1bGFyLmludmVydCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7DQotICAgIHZhciB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdHJhbnNsYXRlWzBdKSAvIHNjYWxlLA0KLSAgICAgICAgeSA9IChjb29yZGluYXRlc1sxXSAtIHRyYW5zbGF0ZVsxXSkgLyBzY2FsZTsNCi0gICAgcmV0dXJuIFsNCi0gICAgICAzNjAgKiB4LA0KLSAgICAgIC0zNjAgKiB5DQotICAgIF07DQotICB9Ow0KLQ0KLSAgZXF1aXJlY3Rhbmd1bGFyLnNjYWxlID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsNCi0gICAgc2NhbGUgPSAreDsNCi0gICAgcmV0dXJuIGVxdWlyZWN0YW5ndWxhcjsNCi0gIH07DQotDQotICBlcXVpcmVjdGFuZ3VsYXIudHJhbnNsYXRlID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0cmFuc2xhdGU7DQotICAgIHRyYW5zbGF0ZSA9IFsreFswXSwgK3hbMV1dOw0KLSAgICByZXR1cm4gZXF1aXJlY3Rhbmd1bGFyOw0KLSAgfTsNCi0NCi0gIHJldHVybiBlcXVpcmVjdGFuZ3VsYXI7DQotfTsNCi1kMy5nZW8ubWVyY2F0b3IgPSBmdW5jdGlvbigpIHsNCi0gIHZhciBzY2FsZSA9IDUwMCwNCi0gICAgICB0cmFuc2xhdGUgPSBbNDgwLCAyNTBdOw0KLQ0KLSAgZnVuY3Rpb24gbWVyY2F0b3IoY29vcmRpbmF0ZXMpIHsNCi0gICAgdmFyIHggPSBjb29yZGluYXRlc1swXSAvIDM2MCwNCi0gICAgICAgIHkgPSAtKE1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkgLyA0ICsgY29vcmRpbmF0ZXNbMV0gKiBkM19nZW9fcmFkaWFucyAvIDIpKSAvIGQzX2dlb19yYWRpYW5zKSAvIDM2MDsNCi0gICAgcmV0dXJuIFsNCi0gICAgICBzY2FsZSAqIHggKyB0cmFuc2xhdGVbMF0sDQotICAgICAgc2NhbGUgKiBNYXRoLm1heCgtLjUsIE1hdGgubWluKC41LCB5KSkgKyB0cmFuc2xhdGVbMV0NCi0gICAgXTsNCi0gIH0NCi0NCi0gIG1lcmNhdG9yLmludmVydCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7DQotICAgIHZhciB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdHJhbnNsYXRlWzBdKSAvIHNjYWxlLA0KLSAgICAgICAgeSA9IChjb29yZGluYXRlc1sxXSAtIHRyYW5zbGF0ZVsxXSkgLyBzY2FsZTsNCi0gICAgcmV0dXJuIFsNCi0gICAgICAzNjAgKiB4LA0KLSAgICAgIDIgKiBNYXRoLmF0YW4oTWF0aC5leHAoLTM2MCAqIHkgKiBkM19nZW9fcmFkaWFucykpIC8gZDNfZ2VvX3JhZGlhbnMgLSA5MA0KLSAgICBdOw0KLSAgfTsNCi0NCi0gIG1lcmNhdG9yLnNjYWxlID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsNCi0gICAgc2NhbGUgPSAreDsNCi0gICAgcmV0dXJuIG1lcmNhdG9yOw0KLSAgfTsNCi0NCi0gIG1lcmNhdG9yLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdHJhbnNsYXRlOw0KLSAgICB0cmFuc2xhdGUgPSBbK3hbMF0sICt4WzFdXTsNCi0gICAgcmV0dXJuIG1lcmNhdG9yOw0KLSAgfTsNCi0NCi0gIHJldHVybiBtZXJjYXRvcjsNCi19Ow0KLWZ1bmN0aW9uIGQzX2dlb190eXBlKHR5cGVzLCBkZWZhdWx0VmFsdWUpIHsNCi0gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHsNCi0gICAgcmV0dXJuIG9iamVjdCAmJiB0eXBlcy5oYXNPd25Qcm9wZXJ0eShvYmplY3QudHlwZSkgPyB0eXBlc1tvYmplY3QudHlwZV0ob2JqZWN0KSA6IGRlZmF1bHRWYWx1ZTsNCi0gIH07DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0LCBnaXZlbiBhIEdlb0pTT04gb2JqZWN0IChlLmcuLCBhIGZlYXR1cmUpLCByZXR1cm5zDQotICogdGhlIGNvcnJlc3BvbmRpbmcgU1ZHIHBhdGguIFRoZSBmdW5jdGlvbiBjYW4gYmUgY3VzdG9taXplZCBieSBvdmVycmlkaW5nIHRoZQ0KLSAqIHByb2plY3Rpb24uIFBvaW50IGZlYXR1cmVzIGFyZSBtYXBwZWQgdG8gY2lyY2xlcyB3aXRoIGEgZGVmYXVsdCByYWRpdXMgb2YNCi0gKiA0LjVweDsgdGhlIHJhZGl1cyBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBhIGNvbnN0YW50IG9yIGEgZnVuY3Rpb24gdGhhdA0KLSAqIGlzIGV2YWx1YXRlZCBwZXIgb2JqZWN0Lg0KLSAqLw0KLWQzLmdlby5wYXRoID0gZnVuY3Rpb24oKSB7DQotICB2YXIgcG9pbnRSYWRpdXMgPSA0LjUsDQotICAgICAgcG9pbnRDaXJjbGUgPSBkM19wYXRoX2NpcmNsZShwb2ludFJhZGl1cyksDQotICAgICAgcHJvamVjdGlvbiA9IGQzLmdlby5hbGJlcnNVc2EoKTsNCi0NCi0gIGZ1bmN0aW9uIHBhdGgoZCwgaSkgew0KLSAgICBpZiAodHlwZW9mIHBvaW50UmFkaXVzID09PSAiZnVuY3Rpb24iKSB7DQotICAgICAgcG9pbnRDaXJjbGUgPSBkM19wYXRoX2NpcmNsZShwb2ludFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcGF0aFR5cGUoZCkgfHwgbnVsbDsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHByb2plY3QoY29vcmRpbmF0ZXMpIHsNCi0gICAgcmV0dXJuIHByb2plY3Rpb24oY29vcmRpbmF0ZXMpLmpvaW4oIiwiKTsNCi0gIH0NCi0NCi0gIHZhciBwYXRoVHlwZSA9IGQzX2dlb190eXBlKHsNCi0NCi0gICAgRmVhdHVyZUNvbGxlY3Rpb246IGZ1bmN0aW9uKG8pIHsNCi0gICAgICB2YXIgcGF0aCA9IFtdLA0KLSAgICAgICAgICBmZWF0dXJlcyA9IG8uZmVhdHVyZXMsDQotICAgICAgICAgIGkgPSAtMSwgLy8gZmVhdHVyZXMuaW5kZXgNCi0gICAgICAgICAgbiA9IGZlYXR1cmVzLmxlbmd0aDsNCi0gICAgICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKHBhdGhUeXBlKGZlYXR1cmVzW2ldLmdlb21ldHJ5KSk7DQotICAgICAgcmV0dXJuIHBhdGguam9pbigiIik7DQotICAgIH0sDQotDQotICAgIEZlYXR1cmU6IGZ1bmN0aW9uKG8pIHsNCi0gICAgICByZXR1cm4gcGF0aFR5cGUoby5nZW9tZXRyeSk7DQotICAgIH0sDQotDQotICAgIFBvaW50OiBmdW5jdGlvbihvKSB7DQotICAgICAgcmV0dXJuICJNIiArIHByb2plY3Qoby5jb29yZGluYXRlcykgKyBwb2ludENpcmNsZTsNCi0gICAgfSwNCi0NCi0gICAgTXVsdGlQb2ludDogZnVuY3Rpb24obykgew0KLSAgICAgIHZhciBwYXRoID0gW10sDQotICAgICAgICAgIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcywNCi0gICAgICAgICAgaSA9IC0xLCAvLyBjb29yZGluYXRlcy5pbmRleA0KLSAgICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOw0KLSAgICAgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2goIk0iLCBwcm9qZWN0KGNvb3JkaW5hdGVzW2ldKSwgcG9pbnRDaXJjbGUpOw0KLSAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOw0KLSAgICB9LA0KLQ0KLSAgICBMaW5lU3RyaW5nOiBmdW5jdGlvbihvKSB7DQotICAgICAgdmFyIHBhdGggPSBbIk0iXSwNCi0gICAgICAgICAgY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLA0KLSAgICAgICAgICBpID0gLTEsIC8vIGNvb3JkaW5hdGVzLmluZGV4DQotICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7DQotICAgICAgd2hpbGUgKCsraSA8IG4pIHBhdGgucHVzaChwcm9qZWN0KGNvb3JkaW5hdGVzW2ldKSwgIkwiKTsNCi0gICAgICBwYXRoLnBvcCgpOw0KLSAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOw0KLSAgICB9LA0KLQ0KLSAgICBNdWx0aUxpbmVTdHJpbmc6IGZ1bmN0aW9uKG8pIHsNCi0gICAgICB2YXIgcGF0aCA9IFtdLA0KLSAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsDQotICAgICAgICAgIGkgPSAtMSwgLy8gY29vcmRpbmF0ZXMuaW5kZXgNCi0gICAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCwNCi0gICAgICAgICAgc3ViY29vcmRpbmF0ZXMsIC8vIGNvb3JkaW5hdGVzW2ldDQotICAgICAgICAgIGosIC8vIHN1YmNvb3JkaW5hdGVzLmluZGV4DQotICAgICAgICAgIG07IC8vIHN1YmNvb3JkaW5hdGVzLmxlbmd0aA0KLSAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQotICAgICAgICBzdWJjb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzW2ldOw0KLSAgICAgICAgaiA9IC0xOw0KLSAgICAgICAgbSA9IHN1YmNvb3JkaW5hdGVzLmxlbmd0aDsNCi0gICAgICAgIHBhdGgucHVzaCgiTSIpOw0KLSAgICAgICAgd2hpbGUgKCsraiA8IG0pIHBhdGgucHVzaChwcm9qZWN0KHN1YmNvb3JkaW5hdGVzW2pdKSwgIkwiKTsNCi0gICAgICAgIHBhdGgucG9wKCk7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOw0KLSAgICB9LA0KLQ0KLSAgICBQb2x5Z29uOiBmdW5jdGlvbihvKSB7DQotICAgICAgdmFyIHBhdGggPSBbXSwNCi0gICAgICAgICAgY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLA0KLSAgICAgICAgICBpID0gLTEsIC8vIGNvb3JkaW5hdGVzLmluZGV4DQotICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsDQotICAgICAgICAgIHN1YmNvb3JkaW5hdGVzLCAvLyBjb29yZGluYXRlc1tpXQ0KLSAgICAgICAgICBqLCAvLyBzdWJjb29yZGluYXRlcy5pbmRleA0KLSAgICAgICAgICBtOyAvLyBzdWJjb29yZGluYXRlcy5sZW5ndGgNCi0gICAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgICAgc3ViY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlc1tpXTsNCi0gICAgICAgIGogPSAtMTsNCi0gICAgICAgIGlmICgobSA9IHN1YmNvb3JkaW5hdGVzLmxlbmd0aCAtIDEpID4gMCkgew0KLSAgICAgICAgICBwYXRoLnB1c2goIk0iKTsNCi0gICAgICAgICAgd2hpbGUgKCsraiA8IG0pIHBhdGgucHVzaChwcm9qZWN0KHN1YmNvb3JkaW5hdGVzW2pdKSwgIkwiKTsNCi0gICAgICAgICAgcGF0aFtwYXRoLmxlbmd0aCAtIDFdID0gIloiOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gcGF0aC5qb2luKCIiKTsNCi0gICAgfSwNCi0NCi0gICAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihvKSB7DQotICAgICAgdmFyIHBhdGggPSBbXSwNCi0gICAgICAgICAgY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLA0KLSAgICAgICAgICBpID0gLTEsIC8vIGNvb3JkaW5hdGVzIGluZGV4DQotICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsDQotICAgICAgICAgIHN1YmNvb3JkaW5hdGVzLCAvLyBjb29yZGluYXRlc1tpXQ0KLSAgICAgICAgICBqLCAvLyBzdWJjb29yZGluYXRlcyBpbmRleA0KLSAgICAgICAgICBtLCAvLyBzdWJjb29yZGluYXRlcy5sZW5ndGgNCi0gICAgICAgICAgc3Vic3ViY29vcmRpbmF0ZXMsIC8vIHN1YmNvb3JkaW5hdGVzW2pdDQotICAgICAgICAgIGssIC8vIHN1YnN1YmNvb3JkaW5hdGVzIGluZGV4DQotICAgICAgICAgIHA7IC8vIHN1YnN1YmNvb3JkaW5hdGVzLmxlbmd0aA0KLSAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQotICAgICAgICBzdWJjb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzW2ldOw0KLSAgICAgICAgaiA9IC0xOw0KLSAgICAgICAgbSA9IHN1YmNvb3JkaW5hdGVzLmxlbmd0aDsNCi0gICAgICAgIHdoaWxlICgrK2ogPCBtKSB7DQotICAgICAgICAgIHN1YnN1YmNvb3JkaW5hdGVzID0gc3ViY29vcmRpbmF0ZXNbal07DQotICAgICAgICAgIGsgPSAtMTsNCi0gICAgICAgICAgaWYgKChwID0gc3Vic3ViY29vcmRpbmF0ZXMubGVuZ3RoIC0gMSkgPiAwKSB7DQotICAgICAgICAgICAgcGF0aC5wdXNoKCJNIik7DQotICAgICAgICAgICAgd2hpbGUgKCsrayA8IHApIHBhdGgucHVzaChwcm9qZWN0KHN1YnN1YmNvb3JkaW5hdGVzW2tdKSwgIkwiKTsNCi0gICAgICAgICAgICBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPSAiWiI7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgICAgcmV0dXJuIHBhdGguam9pbigiIik7DQotICAgIH0sDQotDQotICAgIEdlb21ldHJ5Q29sbGVjdGlvbjogZnVuY3Rpb24obykgew0KLSAgICAgIHZhciBwYXRoID0gW10sDQotICAgICAgICAgIGdlb21ldHJpZXMgPSBvLmdlb21ldHJpZXMsDQotICAgICAgICAgIGkgPSAtMSwgLy8gZ2VvbWV0cmllcyBpbmRleA0KLSAgICAgICAgICBuID0gZ2VvbWV0cmllcy5sZW5ndGg7DQotICAgICAgd2hpbGUgKCsraSA8IG4pIHBhdGgucHVzaChwYXRoVHlwZShnZW9tZXRyaWVzW2ldKSk7DQotICAgICAgcmV0dXJuIHBhdGguam9pbigiIik7DQotICAgIH0NCi0NCi0gIH0pOw0KLQ0KLSAgdmFyIGFyZWFUeXBlID0gcGF0aC5hcmVhID0gZDNfZ2VvX3R5cGUoew0KLQ0KLSAgICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24obykgew0KLSAgICAgIHZhciBhcmVhID0gMCwNCi0gICAgICAgICAgZmVhdHVyZXMgPSBvLmZlYXR1cmVzLA0KLSAgICAgICAgICBpID0gLTEsIC8vIGZlYXR1cmVzLmluZGV4DQotICAgICAgICAgIG4gPSBmZWF0dXJlcy5sZW5ndGg7DQotICAgICAgd2hpbGUgKCsraSA8IG4pIGFyZWEgKz0gYXJlYVR5cGUoZmVhdHVyZXNbaV0pOw0KLSAgICAgIHJldHVybiBhcmVhOw0KLSAgICB9LA0KLQ0KLSAgICBGZWF0dXJlOiBmdW5jdGlvbihvKSB7DQotICAgICAgcmV0dXJuIGFyZWFUeXBlKG8uZ2VvbWV0cnkpOw0KLSAgICB9LA0KLQ0KLSAgICBQb2x5Z29uOiBmdW5jdGlvbihvKSB7DQotICAgICAgcmV0dXJuIHBvbHlnb25BcmVhKG8uY29vcmRpbmF0ZXMpOw0KLSAgICB9LA0KLQ0KLSAgICBNdWx0aVBvbHlnb246IGZ1bmN0aW9uKG8pIHsNCi0gICAgICB2YXIgc3VtID0gMCwNCi0gICAgICAgICAgY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLA0KLSAgICAgICAgICBpID0gLTEsIC8vIGNvb3JkaW5hdGVzIGluZGV4DQotICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7DQotICAgICAgd2hpbGUgKCsraSA8IG4pIHN1bSArPSBwb2x5Z29uQXJlYShjb29yZGluYXRlc1tpXSk7DQotICAgICAgcmV0dXJuIHN1bTsNCi0gICAgfSwNCi0NCi0gICAgR2VvbWV0cnlDb2xsZWN0aW9uOiBmdW5jdGlvbihvKSB7DQotICAgICAgdmFyIHN1bSA9IDAsDQotICAgICAgICAgIGdlb21ldHJpZXMgPSBvLmdlb21ldHJpZXMsDQotICAgICAgICAgIGkgPSAtMSwgLy8gZ2VvbWV0cmllcyBpbmRleA0KLSAgICAgICAgICBuID0gZ2VvbWV0cmllcy5sZW5ndGg7DQotICAgICAgd2hpbGUgKCsraSA8IG4pIHN1bSArPSBhcmVhVHlwZShnZW9tZXRyaWVzW2ldKTsNCi0gICAgICByZXR1cm4gc3VtOw0KLSAgICB9DQotDQotICB9LCAwKTsNCi0NCi0gIGZ1bmN0aW9uIHBvbHlnb25BcmVhKGNvb3JkaW5hdGVzKSB7DQotICAgIHZhciBzdW0gPSBhcmVhKGNvb3JkaW5hdGVzWzBdKSwgLy8gZXh0ZXJpb3IgcmluZw0KLSAgICAgICAgaSA9IDAsIC8vIGNvb3JkaW5hdGVzLmluZGV4DQotICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOw0KLSAgICB3aGlsZSAoKytpIDwgbikgc3VtIC09IGFyZWEoY29vcmRpbmF0ZXNbaV0pOyAvLyBob2xlcw0KLSAgICByZXR1cm4gc3VtOw0KLSAgfQ0KLQ0KLSAgZnVuY3Rpb24gcG9seWdvbkNlbnRyb2lkKGNvb3JkaW5hdGVzKSB7DQotICAgIHZhciBwb2x5Z29uID0gZDMuZ2VvbS5wb2x5Z29uKGNvb3JkaW5hdGVzWzBdLm1hcChwcm9qZWN0aW9uKSksIC8vIGV4dGVyaW9yIHJpbmcNCi0gICAgICAgIGFyZWEgPSBwb2x5Z29uLmFyZWEoKSwNCi0gICAgICAgIGNlbnRyb2lkID0gcG9seWdvbi5jZW50cm9pZChhcmVhIDwgMCA/IChhcmVhICo9IC0xLCAxKSA6IC0xKSwNCi0gICAgICAgIHggPSBjZW50cm9pZFswXSwNCi0gICAgICAgIHkgPSBjZW50cm9pZFsxXSwNCi0gICAgICAgIHogPSBhcmVhLA0KLSAgICAgICAgaSA9IDAsIC8vIGNvb3JkaW5hdGVzIGluZGV4DQotICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOw0KLSAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgIHBvbHlnb24gPSBkMy5nZW9tLnBvbHlnb24oY29vcmRpbmF0ZXNbaV0ubWFwKHByb2plY3Rpb24pKTsgLy8gaG9sZXMNCi0gICAgICBhcmVhID0gcG9seWdvbi5hcmVhKCk7DQotICAgICAgY2VudHJvaWQgPSBwb2x5Z29uLmNlbnRyb2lkKGFyZWEgPCAwID8gKGFyZWEgKj0gLTEsIDEpIDogLTEpOw0KLSAgICAgIHggLT0gY2VudHJvaWRbMF07DQotICAgICAgeSAtPSBjZW50cm9pZFsxXTsNCi0gICAgICB6IC09IGFyZWE7DQotICAgIH0NCi0gICAgcmV0dXJuIFt4LCB5LCA2ICogel07IC8vIHdlaWdodGVkIGNlbnRyb2lkDQotICB9DQotDQotICB2YXIgY2VudHJvaWRUeXBlID0gcGF0aC5jZW50cm9pZCA9IGQzX2dlb190eXBlKHsNCi0NCi0gICAgLy8gVE9ETyBGZWF0dXJlQ29sbGVjdGlvbg0KLSAgICAvLyBUT0RPIFBvaW50DQotICAgIC8vIFRPRE8gTXVsdGlQb2ludA0KLSAgICAvLyBUT0RPIExpbmVTdHJpbmcNCi0gICAgLy8gVE9ETyBNdWx0aUxpbmVTdHJpbmcNCi0gICAgLy8gVE9ETyBHZW9tZXRyeUNvbGxlY3Rpb24NCi0NCi0gICAgRmVhdHVyZTogZnVuY3Rpb24obykgew0KLSAgICAgIHJldHVybiBjZW50cm9pZFR5cGUoby5nZW9tZXRyeSk7DQotICAgIH0sDQotDQotICAgIFBvbHlnb246IGZ1bmN0aW9uKG8pIHsNCi0gICAgICB2YXIgY2VudHJvaWQgPSBwb2x5Z29uQ2VudHJvaWQoby5jb29yZGluYXRlcyk7DQotICAgICAgcmV0dXJuIFtjZW50cm9pZFswXSAvIGNlbnRyb2lkWzJdLCBjZW50cm9pZFsxXSAvIGNlbnRyb2lkWzJdXTsNCi0gICAgfSwNCi0NCi0gICAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihvKSB7DQotICAgICAgdmFyIGFyZWEgPSAwLA0KLSAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsDQotICAgICAgICAgIGNlbnRyb2lkLA0KLSAgICAgICAgICB4ID0gMCwNCi0gICAgICAgICAgeSA9IDAsDQotICAgICAgICAgIHogPSAwLA0KLSAgICAgICAgICBpID0gLTEsIC8vIGNvb3JkaW5hdGVzIGluZGV4DQotICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7DQotICAgICAgd2hpbGUgKCsraSA8IG4pIHsNCi0gICAgICAgIGNlbnRyb2lkID0gcG9seWdvbkNlbnRyb2lkKGNvb3JkaW5hdGVzW2ldKTsNCi0gICAgICAgIHggKz0gY2VudHJvaWRbMF07DQotICAgICAgICB5ICs9IGNlbnRyb2lkWzFdOw0KLSAgICAgICAgeiArPSBjZW50cm9pZFsyXTsNCi0gICAgICB9DQotICAgICAgcmV0dXJuIFt4IC8geiwgeSAvIHpdOw0KLSAgICB9DQotDQotICB9KTsNCi0NCi0gIGZ1bmN0aW9uIGFyZWEoY29vcmRpbmF0ZXMpIHsNCi0gICAgcmV0dXJuIE1hdGguYWJzKGQzLmdlb20ucG9seWdvbihjb29yZGluYXRlcy5tYXAocHJvamVjdGlvbikpLmFyZWEoKSk7DQotICB9DQotDQotICBwYXRoLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7DQotICAgIHByb2plY3Rpb24gPSB4Ow0KLSAgICByZXR1cm4gcGF0aDsNCi0gIH07DQotDQotICBwYXRoLnBvaW50UmFkaXVzID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAodHlwZW9mIHggPT09ICJmdW5jdGlvbiIpIHBvaW50UmFkaXVzID0geDsNCi0gICAgZWxzZSB7DQotICAgICAgcG9pbnRSYWRpdXMgPSAreDsNCi0gICAgICBwb2ludENpcmNsZSA9IGQzX3BhdGhfY2lyY2xlKHBvaW50UmFkaXVzKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gcGF0aDsNCi0gIH07DQotDQotICByZXR1cm4gcGF0aDsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX3BhdGhfY2lyY2xlKHJhZGl1cykgew0KLSAgcmV0dXJuICJtMCwiICsgcmFkaXVzDQotICAgICAgKyAiYSIgKyByYWRpdXMgKyAiLCIgKyByYWRpdXMgKyAiIDAgMSwxIDAsIiArICgtMiAqIHJhZGl1cykNCi0gICAgICArICJhIiArIHJhZGl1cyArICIsIiArIHJhZGl1cyArICIgMCAxLDEgMCwiICsgKCsyICogcmFkaXVzKQ0KLSAgICAgICsgInoiOw0KLX0NCi0vKioNCi0gKiBHaXZlbiBhIEdlb0pTT04gb2JqZWN0LCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGJvdW5kaW5nIGJveC4gVGhlIGJvdW5kaW5nDQotICogYm94IGlzIHJlcHJlc2VudGVkIGJ5IGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5OiBbW2xlZnQsIGJvdHRvbV0sIFtyaWdodCwNCi0gKiB0b3BdXSwgd2hlcmUgbGVmdCBpcyB0aGUgbWluaW11bSBsb25naXR1ZGUsIGJvdHRvbSBpcyB0aGUgbWluaW11bSBsYXRpdHVkZSwNCi0gKiByaWdodCBpcyBtYXhpbXVtIGxvbmdpdHVkZSwgYW5kIHRvcCBpcyB0aGUgbWF4aW11bSBsYXRpdHVkZS4NCi0gKi8NCi1kMy5nZW8uYm91bmRzID0gZnVuY3Rpb24oZmVhdHVyZSkgew0KLSAgdmFyIGxlZnQgPSBJbmZpbml0eSwNCi0gICAgICBib3R0b20gPSBJbmZpbml0eSwNCi0gICAgICByaWdodCA9IC1JbmZpbml0eSwNCi0gICAgICB0b3AgPSAtSW5maW5pdHk7DQotICBkM19nZW9fYm91bmRzKGZlYXR1cmUsIGZ1bmN0aW9uKHgsIHkpIHsNCi0gICAgaWYgKHggPCBsZWZ0KSBsZWZ0ID0geDsNCi0gICAgaWYgKHggPiByaWdodCkgcmlnaHQgPSB4Ow0KLSAgICBpZiAoeSA8IGJvdHRvbSkgYm90dG9tID0geTsNCi0gICAgaWYgKHkgPiB0b3ApIHRvcCA9IHk7DQotICB9KTsNCi0gIHJldHVybiBbW2xlZnQsIGJvdHRvbV0sIFtyaWdodCwgdG9wXV07DQotfTsNCi0NCi1mdW5jdGlvbiBkM19nZW9fYm91bmRzKG8sIGYpIHsNCi0gIGlmIChkM19nZW9fYm91bmRzVHlwZXMuaGFzT3duUHJvcGVydHkoby50eXBlKSkgZDNfZ2VvX2JvdW5kc1R5cGVzW28udHlwZV0obywgZik7DQotfQ0KLQ0KLXZhciBkM19nZW9fYm91bmRzVHlwZXMgPSB7DQotICBGZWF0dXJlOiBkM19nZW9fYm91bmRzRmVhdHVyZSwNCi0gIEZlYXR1cmVDb2xsZWN0aW9uOiBkM19nZW9fYm91bmRzRmVhdHVyZUNvbGxlY3Rpb24sDQotICBHZW9tZXRyeUNvbGxlY3Rpb246IGQzX2dlb19ib3VuZHNHZW9tZXRyeUNvbGxlY3Rpb24sDQotICBMaW5lU3RyaW5nOiBkM19nZW9fYm91bmRzTGluZVN0cmluZywNCi0gIE11bHRpTGluZVN0cmluZzogZDNfZ2VvX2JvdW5kc011bHRpTGluZVN0cmluZywNCi0gIE11bHRpUG9pbnQ6IGQzX2dlb19ib3VuZHNMaW5lU3RyaW5nLA0KLSAgTXVsdGlQb2x5Z29uOiBkM19nZW9fYm91bmRzTXVsdGlQb2x5Z29uLA0KLSAgUG9pbnQ6IGQzX2dlb19ib3VuZHNQb2ludCwNCi0gIFBvbHlnb246IGQzX2dlb19ib3VuZHNQb2x5Z29uDQotfTsNCi0NCi1mdW5jdGlvbiBkM19nZW9fYm91bmRzRmVhdHVyZShvLCBmKSB7DQotICBkM19nZW9fYm91bmRzKG8uZ2VvbWV0cnksIGYpOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19nZW9fYm91bmRzRmVhdHVyZUNvbGxlY3Rpb24obywgZikgew0KLSAgZm9yICh2YXIgYSA9IG8uZmVhdHVyZXMsIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCi0gICAgZDNfZ2VvX2JvdW5kcyhhW2ldLmdlb21ldHJ5LCBmKTsNCi0gIH0NCi19DQotDQotZnVuY3Rpb24gZDNfZ2VvX2JvdW5kc0dlb21ldHJ5Q29sbGVjdGlvbihvLCBmKSB7DQotICBmb3IgKHZhciBhID0gby5nZW9tZXRyaWVzLCBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQotICAgIGQzX2dlb19ib3VuZHMoYVtpXSwgZik7DQotICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2dlb19ib3VuZHNMaW5lU3RyaW5nKG8sIGYpIHsNCi0gIGZvciAodmFyIGEgPSBvLmNvb3JkaW5hdGVzLCBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7DQotICAgIGYuYXBwbHkobnVsbCwgYVtpXSk7DQotICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2dlb19ib3VuZHNNdWx0aUxpbmVTdHJpbmcobywgZikgew0KLSAgZm9yICh2YXIgYSA9IG8uY29vcmRpbmF0ZXMsIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCi0gICAgZm9yICh2YXIgYiA9IGFbaV0sIGogPSAwLCBtID0gYi5sZW5ndGg7IGogPCBtOyBqKyspIHsNCi0gICAgICBmLmFwcGx5KG51bGwsIGJbal0pOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2dlb19ib3VuZHNNdWx0aVBvbHlnb24obywgZikgew0KLSAgZm9yICh2YXIgYSA9IG8uY29vcmRpbmF0ZXMsIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCi0gICAgZm9yICh2YXIgYiA9IGFbaV1bMF0sIGogPSAwLCBtID0gYi5sZW5ndGg7IGogPCBtOyBqKyspIHsNCi0gICAgICBmLmFwcGx5KG51bGwsIGJbal0pOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX2dlb19ib3VuZHNQb2ludChvLCBmKSB7DQotICBmLmFwcGx5KG51bGwsIG8uY29vcmRpbmF0ZXMpOw0KLX0NCi0NCi1mdW5jdGlvbiBkM19nZW9fYm91bmRzUG9seWdvbihvLCBmKSB7DQotICBmb3IgKHZhciBhID0gby5jb29yZGluYXRlc1swXSwgaSA9IDAsIG4gPSBhLmxlbmd0aDsgaSA8IG47IGkrKykgew0KLSAgICBmLmFwcGx5KG51bGwsIGFbaV0pOw0KLSAgfQ0KLX0NCi0vLyBUT0RPIGJyZWFrQXREYXRlTGluZT8NCi0NCi1kMy5nZW8uY2lyY2xlID0gZnVuY3Rpb24oKSB7DQotICB2YXIgb3JpZ2luID0gWzAsIDBdLA0KLSAgICAgIGRlZ3JlZXMgPSA5MCAtIDFlLTIsDQotICAgICAgcmFkaWFucyA9IGRlZ3JlZXMgKiBkM19nZW9fcmFkaWFucywNCi0gICAgICBhcmMgPSBkMy5nZW8uZ3JlYXRBcmMoKS50YXJnZXQoT2JqZWN0KTsNCi0NCi0gIGZ1bmN0aW9uIGNpcmNsZSgpIHsNCi0gICAgLy8gVE9ETyByZW5kZXIgYSBjaXJjbGUgYXMgYSBQb2x5Z29uDQotICB9DQotDQotICBmdW5jdGlvbiB2aXNpYmxlKHBvaW50KSB7DQotICAgIHJldHVybiBhcmMuZGlzdGFuY2UocG9pbnQpIDwgcmFkaWFuczsNCi0gIH0NCi0NCi0gIGNpcmNsZS5jbGlwID0gZnVuY3Rpb24oZCkgew0KLSAgICBhcmMuc291cmNlKHR5cGVvZiBvcmlnaW4gPT09ICJmdW5jdGlvbiIgPyBvcmlnaW4uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IG9yaWdpbik7DQotICAgIHJldHVybiBjbGlwVHlwZShkKTsNCi0gIH07DQotDQotICB2YXIgY2xpcFR5cGUgPSBkM19nZW9fdHlwZSh7DQotDQotICAgIEZlYXR1cmVDb2xsZWN0aW9uOiBmdW5jdGlvbihvKSB7DQotICAgICAgdmFyIGZlYXR1cmVzID0gby5mZWF0dXJlcy5tYXAoY2xpcFR5cGUpLmZpbHRlcihPYmplY3QpOw0KLSAgICAgIHJldHVybiBmZWF0dXJlcyAmJiAobyA9IE9iamVjdC5jcmVhdGUobyksIG8uZmVhdHVyZXMgPSBmZWF0dXJlcywgbyk7DQotICAgIH0sDQotDQotICAgIEZlYXR1cmU6IGZ1bmN0aW9uKG8pIHsNCi0gICAgICB2YXIgZ2VvbWV0cnkgPSBjbGlwVHlwZShvLmdlb21ldHJ5KTsNCi0gICAgICByZXR1cm4gZ2VvbWV0cnkgJiYgKG8gPSBPYmplY3QuY3JlYXRlKG8pLCBvLmdlb21ldHJ5ID0gZ2VvbWV0cnksIG8pOw0KLSAgICB9LA0KLQ0KLSAgICBQb2ludDogZnVuY3Rpb24obykgew0KLSAgICAgIHJldHVybiB2aXNpYmxlKG8uY29vcmRpbmF0ZXMpICYmIG87DQotICAgIH0sDQotDQotICAgIE11bHRpUG9pbnQ6IGZ1bmN0aW9uKG8pIHsNCi0gICAgICB2YXIgY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLmZpbHRlcih2aXNpYmxlKTsNCi0gICAgICByZXR1cm4gY29vcmRpbmF0ZXMubGVuZ3RoICYmIHsNCi0gICAgICAgIHR5cGU6IG8udHlwZSwNCi0gICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlcw0KLSAgICAgIH07DQotICAgIH0sDQotDQotICAgIExpbmVTdHJpbmc6IGZ1bmN0aW9uKG8pIHsNCi0gICAgICB2YXIgY29vcmRpbmF0ZXMgPSBjbGlwKG8uY29vcmRpbmF0ZXMpOw0KLSAgICAgIHJldHVybiBjb29yZGluYXRlcy5sZW5ndGggJiYgKG8gPSBPYmplY3QuY3JlYXRlKG8pLCBvLmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXMsIG8pOw0KLSAgICB9LA0KLQ0KLSAgICBNdWx0aUxpbmVTdHJpbmc6IGZ1bmN0aW9uKG8pIHsNCi0gICAgICB2YXIgY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLm1hcChjbGlwKS5maWx0ZXIoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sZW5ndGg7IH0pOw0KLSAgICAgIHJldHVybiBjb29yZGluYXRlcy5sZW5ndGggJiYgKG8gPSBPYmplY3QuY3JlYXRlKG8pLCBvLmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXMsIG8pOw0KLSAgICB9LA0KLQ0KLSAgICBQb2x5Z29uOiBmdW5jdGlvbihvKSB7DQotICAgICAgdmFyIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcy5tYXAoY2xpcCk7DQotICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdLmxlbmd0aCAmJiAobyA9IE9iamVjdC5jcmVhdGUobyksIG8uY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcywgbyk7DQotICAgIH0sDQotDQotICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24obykgew0KLSAgICAgIHZhciBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMubWFwKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQubWFwKGNsaXApOyB9KS5maWx0ZXIoZnVuY3Rpb24oZCkgeyByZXR1cm4gZFswXS5sZW5ndGg7IH0pOw0KLSAgICAgIHJldHVybiBjb29yZGluYXRlcy5sZW5ndGggJiYgKG8gPSBPYmplY3QuY3JlYXRlKG8pLCBvLmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXMsIG8pOw0KLSAgICB9LA0KLQ0KLSAgICBHZW9tZXRyeUNvbGxlY3Rpb246IGZ1bmN0aW9uKG8pIHsNCi0gICAgICB2YXIgZ2VvbWV0cmllcyA9IG8uZ2VvbWV0cmllcy5tYXAoY2xpcFR5cGUpLmZpbHRlcihPYmplY3QpOw0KLSAgICAgIHJldHVybiBnZW9tZXRyaWVzLmxlbmd0aCAmJiAobyA9IE9iamVjdC5jcmVhdGUobyksIG8uZ2VvbWV0cmllcyA9IGdlb21ldHJpZXMsIG8pOw0KLSAgICB9DQotDQotICB9KTsNCi0NCi0gIGZ1bmN0aW9uIGNsaXAoY29vcmRpbmF0ZXMpIHsNCi0gICAgdmFyIGkgPSAtMSwNCi0gICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsDQotICAgICAgICBjbGlwcGVkID0gW10sDQotICAgICAgICBwMCwNCi0gICAgICAgIHAxLA0KLSAgICAgICAgcDIsDQotICAgICAgICBkMCwNCi0gICAgICAgIGQxOw0KLQ0KLSAgICB3aGlsZSAoKytpIDwgbikgew0KLSAgICAgIGQxID0gYXJjLmRpc3RhbmNlKHAyID0gY29vcmRpbmF0ZXNbaV0pOw0KLSAgICAgIGlmIChkMSA8IHJhZGlhbnMpIHsNCi0gICAgICAgIGlmIChwMSkgY2xpcHBlZC5wdXNoKGQzX2dlb19ncmVhdEFyY0ludGVycG9sYXRlKHAxLCBwMikoKGQwIC0gcmFkaWFucykgLyAoZDAgLSBkMSkpKTsNCi0gICAgICAgIGNsaXBwZWQucHVzaChwMik7DQotICAgICAgICBwMCA9IHAxID0gbnVsbDsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgcDEgPSBwMjsNCi0gICAgICAgIGlmICghcDAgJiYgY2xpcHBlZC5sZW5ndGgpIHsNCi0gICAgICAgICAgY2xpcHBlZC5wdXNoKGQzX2dlb19ncmVhdEFyY0ludGVycG9sYXRlKGNsaXBwZWRbY2xpcHBlZC5sZW5ndGggLSAxXSwgcDEpKChyYWRpYW5zIC0gZDApIC8gKGQxIC0gZDApKSk7DQotICAgICAgICAgIHAwID0gcDE7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIGQwID0gZDE7DQotICAgIH0NCi0NCi0gICAgaWYgKHAxICYmIGNsaXBwZWQubGVuZ3RoKSB7DQotICAgICAgZDEgPSBhcmMuZGlzdGFuY2UocDIgPSBjbGlwcGVkWzBdKTsNCi0gICAgICBjbGlwcGVkLnB1c2goZDNfZ2VvX2dyZWF0QXJjSW50ZXJwb2xhdGUocDEsIHAyKSgoZDAgLSByYWRpYW5zKSAvIChkMCAtIGQxKSkpOw0KLSAgICB9DQotDQotICAgIHJldHVybiByZXNhbXBsZShjbGlwcGVkKTsNCi0gIH0NCi0NCi0gIC8vIFJlc2FtcGxlIGNvb3JkaW5hdGVzLCBjcmVhdGluZyBncmVhdCBhcmNzIGJldHdlZW4gZWFjaC4NCi0gIGZ1bmN0aW9uIHJlc2FtcGxlKGNvb3JkaW5hdGVzKSB7DQotICAgIHZhciBpID0gMCwNCi0gICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsDQotICAgICAgICBqLA0KLSAgICAgICAgbSwNCi0gICAgICAgIHJlc2FtcGxlZCA9IG4gPyBbY29vcmRpbmF0ZXNbMF1dIDogY29vcmRpbmF0ZXMsDQotICAgICAgICByZXNhbXBsZXMsDQotICAgICAgICBvcmlnaW4gPSBhcmMuc291cmNlKCk7DQotDQotICAgIHdoaWxlICgrK2kgPCBuKSB7DQotICAgICAgcmVzYW1wbGVzID0gYXJjLnNvdXJjZShjb29yZGluYXRlc1tpIC0gMV0pKGNvb3JkaW5hdGVzW2ldKS5jb29yZGluYXRlczsNCi0gICAgICBmb3IgKGogPSAwLCBtID0gcmVzYW1wbGVzLmxlbmd0aDsgKytqIDwgbTspIHJlc2FtcGxlZC5wdXNoKHJlc2FtcGxlc1tqXSk7DQotICAgIH0NCi0NCi0gICAgYXJjLnNvdXJjZShvcmlnaW4pOw0KLSAgICByZXR1cm4gcmVzYW1wbGVkOw0KLSAgfQ0KLQ0KLSAgY2lyY2xlLm9yaWdpbiA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZ2luOw0KLSAgICBvcmlnaW4gPSB4Ow0KLSAgICByZXR1cm4gY2lyY2xlOw0KLSAgfTsNCi0NCi0gIGNpcmNsZS5hbmdsZSA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZGVncmVlczsNCi0gICAgcmFkaWFucyA9IChkZWdyZWVzID0gK3gpICogZDNfZ2VvX3JhZGlhbnM7DQotICAgIHJldHVybiBjaXJjbGU7DQotICB9Ow0KLQ0KLSAgLy8gUHJlY2lzaW9uIGlzIHNwZWNpZmllZCBpbiBkZWdyZWVzLg0KLSAgY2lyY2xlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gYXJjLnByZWNpc2lvbigpOw0KLSAgICBhcmMucHJlY2lzaW9uKHgpOw0KLSAgICByZXR1cm4gY2lyY2xlOw0KLSAgfTsNCi0NCi0gIHJldHVybiBjaXJjbGU7DQotfQ0KLWQzLmdlby5ncmVhdEFyYyA9IGZ1bmN0aW9uKCkgew0KLSAgdmFyIHNvdXJjZSA9IGQzX2dlb19ncmVhdEFyY1NvdXJjZSwNCi0gICAgICB0YXJnZXQgPSBkM19nZW9fZ3JlYXRBcmNUYXJnZXQsDQotICAgICAgcHJlY2lzaW9uID0gNiAqIGQzX2dlb19yYWRpYW5zOw0KLQ0KLSAgZnVuY3Rpb24gZ3JlYXRBcmMoKSB7DQotICAgIHZhciBhID0gdHlwZW9mIHNvdXJjZSA9PT0gImZ1bmN0aW9uIiA/IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogc291cmNlLA0KLSAgICAgICAgYiA9IHR5cGVvZiB0YXJnZXQgPT09ICJmdW5jdGlvbiIgPyB0YXJnZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRhcmdldCwNCi0gICAgICAgIGkgPSBkM19nZW9fZ3JlYXRBcmNJbnRlcnBvbGF0ZShhLCBiKSwNCi0gICAgICAgIGR0ID0gcHJlY2lzaW9uIC8gaS5kLA0KLSAgICAgICAgdCA9IDAsDQotICAgICAgICBjb29yZGluYXRlcyA9IFthXTsNCi0gICAgd2hpbGUgKCh0ICs9IGR0KSA8IDEpIGNvb3JkaW5hdGVzLnB1c2goaSh0KSk7DQotICAgIGNvb3JkaW5hdGVzLnB1c2goYik7DQotICAgIHJldHVybiB7DQotICAgICAgdHlwZTogIkxpbmVTdHJpbmciLA0KLSAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlcw0KLSAgICB9Ow0KLSAgfQ0KLQ0KLSAgLy8gTGVuZ3RoIHJldHVybmVkIGluIHJhZGlhbnM7IG11bHRpcGx5IGJ5IHJhZGl1cyBmb3IgZGlzdGFuY2UuDQotICBncmVhdEFyYy5kaXN0YW5jZSA9IGZ1bmN0aW9uKCkgew0KLSAgICB2YXIgYSA9IHR5cGVvZiBzb3VyY2UgPT09ICJmdW5jdGlvbiIgPyBzb3VyY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNvdXJjZSwNCi0gICAgICAgIGIgPSB0eXBlb2YgdGFyZ2V0ID09PSAiZnVuY3Rpb24iID8gdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB0YXJnZXQ7DQotICAgICByZXR1cm4gZDNfZ2VvX2dyZWF0QXJjSW50ZXJwb2xhdGUoYSwgYikuZDsNCi0gIH07DQotDQotICBncmVhdEFyYy5zb3VyY2UgPSBmdW5jdGlvbih4KSB7DQotICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvdXJjZTsNCi0gICAgc291cmNlID0geDsNCi0gICAgcmV0dXJuIGdyZWF0QXJjOw0KLSAgfTsNCi0NCi0gIGdyZWF0QXJjLnRhcmdldCA9IGZ1bmN0aW9uKHgpIHsNCi0gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0Ow0KLSAgICB0YXJnZXQgPSB4Ow0KLSAgICByZXR1cm4gZ3JlYXRBcmM7DQotICB9Ow0KLQ0KLSAgLy8gUHJlY2lzaW9uIGlzIHNwZWNpZmllZCBpbiBkZWdyZWVzLg0KLSAgZ3JlYXRBcmMucHJlY2lzaW9uID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwcmVjaXNpb24gLyBkM19nZW9fcmFkaWFuczsNCi0gICAgcHJlY2lzaW9uID0geCAqIGQzX2dlb19yYWRpYW5zOw0KLSAgICByZXR1cm4gZ3JlYXRBcmM7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGdyZWF0QXJjOw0KLX07DQotDQotZnVuY3Rpb24gZDNfZ2VvX2dyZWF0QXJjU291cmNlKGQpIHsNCi0gIHJldHVybiBkLnNvdXJjZTsNCi19DQotDQotZnVuY3Rpb24gZDNfZ2VvX2dyZWF0QXJjVGFyZ2V0KGQpIHsNCi0gIHJldHVybiBkLnRhcmdldDsNCi19DQotDQotZnVuY3Rpb24gZDNfZ2VvX2dyZWF0QXJjSW50ZXJwb2xhdGUoYSwgYikgew0KLSAgdmFyIHgwID0gYVswXSAqIGQzX2dlb19yYWRpYW5zLCBjeDAgPSBNYXRoLmNvcyh4MCksIHN4MCA9IE1hdGguc2luKHgwKSwNCi0gICAgICB5MCA9IGFbMV0gKiBkM19nZW9fcmFkaWFucywgY3kwID0gTWF0aC5jb3MoeTApLCBzeTAgPSBNYXRoLnNpbih5MCksDQotICAgICAgeDEgPSBiWzBdICogZDNfZ2VvX3JhZGlhbnMsIGN4MSA9IE1hdGguY29zKHgxKSwgc3gxID0gTWF0aC5zaW4oeDEpLA0KLSAgICAgIHkxID0gYlsxXSAqIGQzX2dlb19yYWRpYW5zLCBjeTEgPSBNYXRoLmNvcyh5MSksIHN5MSA9IE1hdGguc2luKHkxKSwNCi0gICAgICBkID0gaW50ZXJwb2xhdGUuZCA9IE1hdGguYWNvcyhNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgc3kwICogc3kxICsgY3kwICogY3kxICogTWF0aC5jb3MoeDEgLSB4MCkpKSksDQotICAgICAgc2QgPSBNYXRoLnNpbihkKTsNCi0NCi0gIC8vIEZyb20gaHR0cDovL3dpbGxpYW1zLmJlc3QudndoLm5ldC9hdmZvcm0uaHRtI0ludGVybWVkaWF0ZQ0KLSAgZnVuY3Rpb24gaW50ZXJwb2xhdGUodCkgew0KLSAgICB2YXIgQSA9IE1hdGguc2luKGQgLSAodCAqPSBkKSkgLyBzZCwNCi0gICAgICAgIEIgPSBNYXRoLnNpbih0KSAvIHNkLA0KLSAgICAgICAgeCA9IEEgKiBjeTAgKiBjeDAgKyBCICogY3kxICogY3gxLA0KLSAgICAgICAgeSA9IEEgKiBjeTAgKiBzeDAgKyBCICogY3kxICogc3gxLA0KLSAgICAgICAgeiA9IEEgKiBzeTAgICAgICAgKyBCICogc3kxOw0KLSAgICByZXR1cm4gWw0KLSAgICAgIE1hdGguYXRhbjIoeSwgeCkgLyBkM19nZW9fcmFkaWFucywNCi0gICAgICBNYXRoLmF0YW4yKHosIE1hdGguc3FydCh4ICogeCArIHkgKiB5KSkgLyBkM19nZW9fcmFkaWFucw0KLSAgICBdOw0KLSAgfQ0KLQ0KLSAgcmV0dXJuIGludGVycG9sYXRlOw0KLX0NCi1kMy5nZW8uZ3JlYXRDaXJjbGUgPSBkMy5nZW8uY2lyY2xlOw0KLWQzLmdlb20gPSB7fTsNCi0vKioNCi0gKiBDb21wdXRlcyBhIGNvbnRvdXIgZm9yIGEgZ2l2ZW4gaW5wdXQgZ3JpZCBmdW5jdGlvbiB1c2luZyB0aGUgPGENCi0gKiBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01hcmNoaW5nX3NxdWFyZXMiPm1hcmNoaW5nDQotICogc3F1YXJlczwvYT4gYWxnb3JpdGhtLiBSZXR1cm5zIHRoZSBjb250b3VyIHBvbHlnb24gYXMgYW4gYXJyYXkgb2YgcG9pbnRzLg0KLSAqDQotICogQHBhcmFtIGdyaWQgYSB0d28taW5wdXQgZnVuY3Rpb24oeCwgeSkgdGhhdCByZXR1cm5zIHRydWUgZm9yIHZhbHVlcw0KLSAqIGluc2lkZSB0aGUgY29udG91ciBhbmQgZmFsc2UgZm9yIHZhbHVlcyBvdXRzaWRlIHRoZSBjb250b3VyLg0KLSAqIEBwYXJhbSBzdGFydCBhbiBvcHRpb25hbCBzdGFydGluZyBwb2ludCBbeCwgeV0gb24gdGhlIGdyaWQuDQotICogQHJldHVybnMgcG9seWdvbiBbW3gxLCB5MV0sIFt4MiwgeTJdLCDigKZdDQotICovDQotZDMuZ2VvbS5jb250b3VyID0gZnVuY3Rpb24oZ3JpZCwgc3RhcnQpIHsNCi0gIHZhciBzID0gc3RhcnQgfHwgZDNfZ2VvbV9jb250b3VyU3RhcnQoZ3JpZCksIC8vIHN0YXJ0aW5nIHBvaW50DQotICAgICAgYyA9IFtdLCAgICAvLyBjb250b3VyIHBvbHlnb24NCi0gICAgICB4ID0gc1swXSwgIC8vIGN1cnJlbnQgeCBwb3NpdGlvbg0KLSAgICAgIHkgPSBzWzFdLCAgLy8gY3VycmVudCB5IHBvc2l0aW9uDQotICAgICAgZHggPSAwLCAgICAvLyBuZXh0IHggZGlyZWN0aW9uDQotICAgICAgZHkgPSAwLCAgICAvLyBuZXh0IHkgZGlyZWN0aW9uDQotICAgICAgcGR4ID0gTmFOLCAvLyBwcmV2aW91cyB4IGRpcmVjdGlvbg0KLSAgICAgIHBkeSA9IE5hTiwgLy8gcHJldmlvdXMgeSBkaXJlY3Rpb24NCi0gICAgICBpID0gMDsNCi0NCi0gIGRvIHsNCi0gICAgLy8gZGV0ZXJtaW5lIG1hcmNoaW5nIHNxdWFyZXMgaW5kZXgNCi0gICAgaSA9IDA7DQotICAgIGlmIChncmlkKHgtMSwgeS0xKSkgaSArPSAxOw0KLSAgICBpZiAoZ3JpZCh4LCAgIHktMSkpIGkgKz0gMjsNCi0gICAgaWYgKGdyaWQoeC0xLCB5ICApKSBpICs9IDQ7DQotICAgIGlmIChncmlkKHgsICAgeSAgKSkgaSArPSA4Ow0KLQ0KLSAgICAvLyBkZXRlcm1pbmUgbmV4dCBkaXJlY3Rpb24NCi0gICAgaWYgKGkgPT09IDYpIHsNCi0gICAgICBkeCA9IHBkeSA9PT0gLTEgPyAtMSA6IDE7DQotICAgICAgZHkgPSAwOw0KLSAgICB9IGVsc2UgaWYgKGkgPT09IDkpIHsNCi0gICAgICBkeCA9IDA7DQotICAgICAgZHkgPSBwZHggPT09IDEgPyAtMSA6IDE7DQotICAgIH0gZWxzZSB7DQotICAgICAgZHggPSBkM19nZW9tX2NvbnRvdXJEeFtpXTsNCi0gICAgICBkeSA9IGQzX2dlb21fY29udG91ckR5W2ldOw0KLSAgICB9DQotDQotICAgIC8vIHVwZGF0ZSBjb250b3VyIHBvbHlnb24NCi0gICAgaWYgKGR4ICE9IHBkeCAmJiBkeSAhPSBwZHkpIHsNCi0gICAgICBjLnB1c2goW3gsIHldKTsNCi0gICAgICBwZHggPSBkeDsNCi0gICAgICBwZHkgPSBkeTsNCi0gICAgfQ0KLQ0KLSAgICB4ICs9IGR4Ow0KLSAgICB5ICs9IGR5Ow0KLSAgfSB3aGlsZSAoc1swXSAhPSB4IHx8IHNbMV0gIT0geSk7DQotDQotICByZXR1cm4gYzsNCi19Ow0KLQ0KLS8vIGxvb2t1cCB0YWJsZXMgZm9yIG1hcmNoaW5nIGRpcmVjdGlvbnMNCi12YXIgZDNfZ2VvbV9jb250b3VyRHggPSBbMSwgMCwgMSwgMSwtMSwgMCwtMSwgMSwwLCAwLDAsMCwtMSwgMCwtMSxOYU5dLA0KLSAgICBkM19nZW9tX2NvbnRvdXJEeSA9IFswLC0xLCAwLCAwLCAwLC0xLCAwLCAwLDEsLTEsMSwxLCAwLC0xLCAwLE5hTl07DQotDQotZnVuY3Rpb24gZDNfZ2VvbV9jb250b3VyU3RhcnQoZ3JpZCkgew0KLSAgdmFyIHggPSAwLA0KLSAgICAgIHkgPSAwOw0KLQ0KLSAgLy8gc2VhcmNoIGZvciBhIHN0YXJ0aW5nIHBvaW50OyBiZWdpbiBhdCBvcmlnaW4NCi0gIC8vIGFuZCBwcm9jZWVkIGFsb25nIG91dHdhcmQtZXhwYW5kaW5nIGRpYWdvbmFscw0KLSAgd2hpbGUgKHRydWUpIHsNCi0gICAgaWYgKGdyaWQoeCx5KSkgew0KLSAgICAgIHJldHVybiBbeCx5XTsNCi0gICAgfQ0KLSAgICBpZiAoeCA9PT0gMCkgew0KLSAgICAgIHggPSB5ICsgMTsNCi0gICAgICB5ID0gMDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICB4ID0geCAtIDE7DQotICAgICAgeSA9IHkgKyAxOw0KLSAgICB9DQotICB9DQotfQ0KLS8qKg0KLSAqIENvbXB1dGVzIHRoZSAyRCBjb252ZXggaHVsbCBvZiBhIHNldCBvZiBwb2ludHMgdXNpbmcgR3JhaGFtJ3Mgc2Nhbm5pbmcNCi0gKiBhbGdvcml0aG0uIFRoZSBhbGdvcml0aG0gaGFzIGJlZW4gaW1wbGVtZW50ZWQgYXMgZGVzY3JpYmVkIGluIENvcm1lbiwNCi0gKiBMZWlzZXJzb24sIGFuZCBSaXZlc3QncyBJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtcy4gVGhlIHJ1bm5pbmcgdGltZSBvZg0KLSAqIHRoaXMgYWxnb3JpdGhtIGlzIE8obiBsb2cgbiksIHdoZXJlIG4gaXMgdGhlIG51bWJlciBvZiBpbnB1dCBwb2ludHMuDQotICoNCi0gKiBAcGFyYW0gdmVydGljZXMgW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXQ0KLSAqIEByZXR1cm5zIHBvbHlnb24gW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXQ0KLSAqLw0KLWQzLmdlb20uaHVsbCA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7DQotICBpZiAodmVydGljZXMubGVuZ3RoIDwgMykgcmV0dXJuIFtdOw0KLQ0KLSAgdmFyIGxlbiA9IHZlcnRpY2VzLmxlbmd0aCwNCi0gICAgICBwbGVuID0gbGVuIC0gMSwNCi0gICAgICBwb2ludHMgPSBbXSwNCi0gICAgICBzdGFjayA9IFtdLA0KLSAgICAgIGksIGosIGggPSAwLCB4MSwgeTEsIHgyLCB5MiwgdSwgdiwgYSwgc3A7DQotDQotICAvLyBmaW5kIHRoZSBzdGFydGluZyByZWYgcG9pbnQ6IGxlZnRtb3N0IHBvaW50IHdpdGggdGhlIG1pbmltdW0geSBjb29yZA0KLSAgZm9yIChpPTE7IGk8bGVuOyArK2kpIHsNCi0gICAgaWYgKHZlcnRpY2VzW2ldWzFdIDwgdmVydGljZXNbaF1bMV0pIHsNCi0gICAgICBoID0gaTsNCi0gICAgfSBlbHNlIGlmICh2ZXJ0aWNlc1tpXVsxXSA9PSB2ZXJ0aWNlc1toXVsxXSkgew0KLSAgICAgIGggPSAodmVydGljZXNbaV1bMF0gPCB2ZXJ0aWNlc1toXVswXSA/IGkgOiBoKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gY2FsY3VsYXRlIHBvbGFyIGFuZ2xlcyBmcm9tIHJlZiBwb2ludCBhbmQgc29ydA0KLSAgZm9yIChpPTA7IGk8bGVuOyArK2kpIHsNCi0gICAgaWYgKGkgPT09IGgpIGNvbnRpbnVlOw0KLSAgICB5MSA9IHZlcnRpY2VzW2ldWzFdIC0gdmVydGljZXNbaF1bMV07DQotICAgIHgxID0gdmVydGljZXNbaV1bMF0gLSB2ZXJ0aWNlc1toXVswXTsNCi0gICAgcG9pbnRzLnB1c2goe2FuZ2xlOiBNYXRoLmF0YW4yKHkxLCB4MSksIGluZGV4OiBpfSk7DQotICB9DQotICBwb2ludHMuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBhLmFuZ2xlIC0gYi5hbmdsZTsgfSk7DQotDQotICAvLyB0b3NzIG91dCBkdXBsaWNhdGUgYW5nbGVzDQotICBhID0gcG9pbnRzWzBdLmFuZ2xlOw0KLSAgdiA9IHBvaW50c1swXS5pbmRleDsNCi0gIHUgPSAwOw0KLSAgZm9yIChpPTE7IGk8cGxlbjsgKytpKSB7DQotICAgIGogPSBwb2ludHNbaV0uaW5kZXg7DQotICAgIGlmIChhID09IHBvaW50c1tpXS5hbmdsZSkgew0KLSAgICAgIC8vIGtlZXAgYW5nbGUgZm9yIHBvaW50IG1vc3QgZGlzdGFudCBmcm9tIHRoZSByZWZlcmVuY2UNCi0gICAgICB4MSA9IHZlcnRpY2VzW3ZdWzBdIC0gdmVydGljZXNbaF1bMF07DQotICAgICAgeTEgPSB2ZXJ0aWNlc1t2XVsxXSAtIHZlcnRpY2VzW2hdWzFdOw0KLSAgICAgIHgyID0gdmVydGljZXNbal1bMF0gLSB2ZXJ0aWNlc1toXVswXTsNCi0gICAgICB5MiA9IHZlcnRpY2VzW2pdWzFdIC0gdmVydGljZXNbaF1bMV07DQotICAgICAgaWYgKCh4MSp4MSArIHkxKnkxKSA+PSAoeDIqeDIgKyB5Mip5MikpIHsNCi0gICAgICAgIHBvaW50c1tpXS5pbmRleCA9IC0xOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBwb2ludHNbdV0uaW5kZXggPSAtMTsNCi0gICAgICAgIGEgPSBwb2ludHNbaV0uYW5nbGU7DQotICAgICAgICB1ID0gaTsNCi0gICAgICAgIHYgPSBqOw0KLSAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0gICAgICBhID0gcG9pbnRzW2ldLmFuZ2xlOw0KLSAgICAgIHUgPSBpOw0KLSAgICAgIHYgPSBqOw0KLSAgICB9DQotICB9DQotDQotICAvLyBpbml0aWFsaXplIHRoZSBzdGFjaw0KLSAgc3RhY2sucHVzaChoKTsNCi0gIGZvciAoaT0wLCBqPTA7IGk8MjsgKytqKSB7DQotICAgIGlmIChwb2ludHNbal0uaW5kZXggIT09IC0xKSB7DQotICAgICAgc3RhY2sucHVzaChwb2ludHNbal0uaW5kZXgpOw0KLSAgICAgIGkrKzsNCi0gICAgfQ0KLSAgfQ0KLSAgc3AgPSBzdGFjay5sZW5ndGg7DQotDQotICAvLyBkbyBncmFoYW0ncyBzY2FuDQotICBmb3IgKDsgajxwbGVuOyArK2opIHsNCi0gICAgaWYgKHBvaW50c1tqXS5pbmRleCA9PT0gLTEpIGNvbnRpbnVlOyAvLyBza2lwIHRvc3NlZCBvdXQgcG9pbnRzDQotICAgIHdoaWxlICghZDNfZ2VvbV9odWxsQ0NXKHN0YWNrW3NwLTJdLCBzdGFja1tzcC0xXSwgcG9pbnRzW2pdLmluZGV4LCB2ZXJ0aWNlcykpIHsNCi0gICAgICAtLXNwOw0KLSAgICB9DQotICAgIHN0YWNrW3NwKytdID0gcG9pbnRzW2pdLmluZGV4Ow0KLSAgfQ0KLQ0KLSAgLy8gY29uc3RydWN0IHRoZSBodWxsDQotICB2YXIgcG9seSA9IFtdOw0KLSAgZm9yIChpPTA7IGk8c3A7ICsraSkgew0KLSAgICBwb2x5LnB1c2godmVydGljZXNbc3RhY2tbaV1dKTsNCi0gIH0NCi0gIHJldHVybiBwb2x5Ow0KLX0NCi0NCi0vLyBhcmUgdGhyZWUgcG9pbnRzIGluIGNvdW50ZXItY2xvY2t3aXNlIG9yZGVyPw0KLWZ1bmN0aW9uIGQzX2dlb21faHVsbENDVyhpMSwgaTIsIGkzLCB2KSB7DQotICB2YXIgdCwgYSwgYiwgYywgZCwgZSwgZjsNCi0gIHQgPSB2W2kxXTsgYSA9IHRbMF07IGIgPSB0WzFdOw0KLSAgdCA9IHZbaTJdOyBjID0gdFswXTsgZCA9IHRbMV07DQotICB0ID0gdltpM107IGUgPSB0WzBdOyBmID0gdFsxXTsNCi0gIHJldHVybiAoKGYtYikqKGMtYSkgLSAoZC1iKSooZS1hKSkgPiAwOw0KLX0NCi0vLyBOb3RlOiByZXF1aXJlcyBjb29yZGluYXRlcyB0byBiZSBjb3VudGVyY2xvY2t3aXNlIGFuZCBjb252ZXghDQotZDMuZ2VvbS5wb2x5Z29uID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHsNCi0NCi0gIGNvb3JkaW5hdGVzLmFyZWEgPSBmdW5jdGlvbigpIHsNCi0gICAgdmFyIGkgPSAwLA0KLSAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCwNCi0gICAgICAgIGEgPSBjb29yZGluYXRlc1tuIC0gMV1bMF0gKiBjb29yZGluYXRlc1swXVsxXSwNCi0gICAgICAgIGIgPSBjb29yZGluYXRlc1tuIC0gMV1bMV0gKiBjb29yZGluYXRlc1swXVswXTsNCi0gICAgd2hpbGUgKCsraSA8IG4pIHsNCi0gICAgICBhICs9IGNvb3JkaW5hdGVzW2kgLSAxXVswXSAqIGNvb3JkaW5hdGVzW2ldWzFdOw0KLSAgICAgIGIgKz0gY29vcmRpbmF0ZXNbaSAtIDFdWzFdICogY29vcmRpbmF0ZXNbaV1bMF07DQotICAgIH0NCi0gICAgcmV0dXJuIChiIC0gYSkgKiAuNTsNCi0gIH07DQotDQotICBjb29yZGluYXRlcy5jZW50cm9pZCA9IGZ1bmN0aW9uKGspIHsNCi0gICAgdmFyIGkgPSAtMSwNCi0gICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsDQotICAgICAgICB4ID0gMCwNCi0gICAgICAgIHkgPSAwLA0KLSAgICAgICAgYSwNCi0gICAgICAgIGIgPSBjb29yZGluYXRlc1tuIC0gMV0sDQotICAgICAgICBjOw0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIGsgPSAtMSAvICg2ICogY29vcmRpbmF0ZXMuYXJlYSgpKTsNCi0gICAgd2hpbGUgKCsraSA8IG4pIHsNCi0gICAgICBhID0gYjsNCi0gICAgICBiID0gY29vcmRpbmF0ZXNbaV07DQotICAgICAgYyA9IGFbMF0gKiBiWzFdIC0gYlswXSAqIGFbMV07DQotICAgICAgeCArPSAoYVswXSArIGJbMF0pICogYzsNCi0gICAgICB5ICs9IChhWzFdICsgYlsxXSkgKiBjOw0KLSAgICB9DQotICAgIHJldHVybiBbeCAqIGssIHkgKiBrXTsNCi0gIH07DQotDQotICAvLyBUaGUgU3V0aGVybGFuZC1Ib2RnbWFuIGNsaXBwaW5nIGFsZ29yaXRobS4NCi0gIGNvb3JkaW5hdGVzLmNsaXAgPSBmdW5jdGlvbihzdWJqZWN0KSB7DQotICAgIHZhciBpbnB1dCwNCi0gICAgICAgIGkgPSAtMSwNCi0gICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsDQotICAgICAgICBqLA0KLSAgICAgICAgbSwNCi0gICAgICAgIGEgPSBjb29yZGluYXRlc1tuIC0gMV0sDQotICAgICAgICBiLA0KLSAgICAgICAgYywNCi0gICAgICAgIGQ7DQotICAgIHdoaWxlICgrK2kgPCBuKSB7DQotICAgICAgaW5wdXQgPSBzdWJqZWN0LnNsaWNlKCk7DQotICAgICAgc3ViamVjdC5sZW5ndGggPSAwOw0KLSAgICAgIGIgPSBjb29yZGluYXRlc1tpXTsNCi0gICAgICBjID0gaW5wdXRbKG0gPSBpbnB1dC5sZW5ndGgpIC0gMV07DQotICAgICAgaiA9IC0xOw0KLSAgICAgIHdoaWxlICgrK2ogPCBtKSB7DQotICAgICAgICBkID0gaW5wdXRbal07DQotICAgICAgICBpZiAoZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKGQsIGEsIGIpKSB7DQotICAgICAgICAgIGlmICghZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKGMsIGEsIGIpKSB7DQotICAgICAgICAgICAgc3ViamVjdC5wdXNoKGQzX2dlb21fcG9seWdvbkludGVyc2VjdChjLCBkLCBhLCBiKSk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgc3ViamVjdC5wdXNoKGQpOw0KLSAgICAgICAgfSBlbHNlIGlmIChkM19nZW9tX3BvbHlnb25JbnNpZGUoYywgYSwgYikpIHsNCi0gICAgICAgICAgc3ViamVjdC5wdXNoKGQzX2dlb21fcG9seWdvbkludGVyc2VjdChjLCBkLCBhLCBiKSk7DQotICAgICAgICB9DQotICAgICAgICBjID0gZDsNCi0gICAgICB9DQotICAgICAgYSA9IGI7DQotICAgIH0NCi0gICAgcmV0dXJuIHN1YmplY3Q7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGNvb3JkaW5hdGVzOw0KLX07DQotDQotZnVuY3Rpb24gZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKHAsIGEsIGIpIHsNCi0gIHJldHVybiAoYlswXSAtIGFbMF0pICogKHBbMV0gLSBhWzFdKSA8IChiWzFdIC0gYVsxXSkgKiAocFswXSAtIGFbMF0pOw0KLX0NCi0NCi0vLyBJbnRlcnNlY3QgdHdvIGluZmluaXRlIGxpbmVzIGNkIGFuZCBhYi4NCi1mdW5jdGlvbiBkM19nZW9tX3BvbHlnb25JbnRlcnNlY3QoYywgZCwgYSwgYikgew0KLSAgdmFyIHgxID0gY1swXSwgeDIgPSBkWzBdLCB4MyA9IGFbMF0sIHg0ID0gYlswXSwNCi0gICAgICB5MSA9IGNbMV0sIHkyID0gZFsxXSwgeTMgPSBhWzFdLCB5NCA9IGJbMV0sDQotICAgICAgeDEzID0geDEgLSB4MywNCi0gICAgICB4MjEgPSB4MiAtIHgxLA0KLSAgICAgIHg0MyA9IHg0IC0geDMsDQotICAgICAgeTEzID0geTEgLSB5MywNCi0gICAgICB5MjEgPSB5MiAtIHkxLA0KLSAgICAgIHk0MyA9IHk0IC0geTMsDQotICAgICAgdWEgPSAoeDQzICogeTEzIC0geTQzICogeDEzKSAvICh5NDMgKiB4MjEgLSB4NDMgKiB5MjEpOw0KLSAgcmV0dXJuIFt4MSArIHVhICogeDIxLCB5MSArIHVhICogeTIxXTsNCi19DQotLy8gQWRhcHRlZCBmcm9tIE5pY29sYXMgR2FyY2lhIEJlbG1vbnRlJ3MgSklUIGltcGxlbWVudGF0aW9uOg0KLS8vIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvMjAxMC8wMi8xMi92b3Jvbm9pLXRlc3NlbGxhdGlvbi8NCi0vLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL2Fzc2V0cy92b3Jvbm9panMvdm9yb25vaS5qcw0KLS8vIFNlZSBsaWIvaml0L0xJQ0VOU0UgZm9yIGRldGFpbHMuDQotDQotLy8gTm90ZXM6DQotLy8NCi0vLyBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGNsaXAgdGhlIHJldHVybmVkIHBvbHlnb25zLCBzbyBpZiB5b3Ugd2FudCB0bw0KLS8vIGNsaXAgdGhlbSB0byBhIHBhcnRpY3VsYXIgc2hhcGUgeW91IHdpbGwgbmVlZCB0byBkbyB0aGF0IGVpdGhlciBpbiBTVkcgb3IgYnkNCi0vLyBwb3N0LXByb2Nlc3Npbmcgd2l0aCBkMy5nZW9tLnBvbHlnb24ncyBjbGlwIG1ldGhvZC4NCi0vLw0KLS8vIElmIGFueSB2ZXJ0aWNlcyBhcmUgY29pbmNpZGVudCBvciBoYXZlIE5hTiBwb3NpdGlvbnMsIHRoZSBiZWhhdmlvciBvZiB0aGlzDQotLy8gbWV0aG9kIGlzIHVuZGVmaW5lZC4gTW9zdCBsaWtlbHkgaW52YWxpZCBwb2x5Z29ucyB3aWxsIGJlIHJldHVybmVkLiBZb3UNCi0vLyBzaG91bGQgZmlsdGVyIGludmFsaWQgcG9pbnRzLCBhbmQgY29uc29saWRhdGUgY29pbmNpZGVudCBwb2ludHMsIGJlZm9yZQ0KLS8vIGNvbXB1dGluZyB0aGUgdGVzc2VsbGF0aW9uLg0KLQ0KLS8qKg0KLSAqIEBwYXJhbSB2ZXJ0aWNlcyBbW3gxLCB5MV0sIFt4MiwgeTJdLCDigKZdDQotICogQHJldHVybnMgcG9seWdvbnMgW1tbeDEsIHkxXSwgW3gyLCB5Ml0sIOKApl0sIOKApl0NCi0gKi8NCi1kMy5nZW9tLnZvcm9ub2kgPSBmdW5jdGlvbih2ZXJ0aWNlcykgew0KLSAgdmFyIHBvbHlnb25zID0gdmVydGljZXMubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0pOw0KLQ0KLSAgZDNfdm9yb25vaV90ZXNzZWxsYXRlKHZlcnRpY2VzLCBmdW5jdGlvbihlKSB7DQotICAgIHZhciBzMSwNCi0gICAgICAgIHMyLA0KLSAgICAgICAgeDEsDQotICAgICAgICB4MiwNCi0gICAgICAgIHkxLA0KLSAgICAgICAgeTI7DQotICAgIGlmIChlLmEgPT09IDEgJiYgZS5iID49IDApIHsNCi0gICAgICBzMSA9IGUuZXAucjsNCi0gICAgICBzMiA9IGUuZXAubDsNCi0gICAgfSBlbHNlIHsNCi0gICAgICBzMSA9IGUuZXAubDsNCi0gICAgICBzMiA9IGUuZXAucjsNCi0gICAgfQ0KLSAgICBpZiAoZS5hID09PSAxKSB7DQotICAgICAgeTEgPSBzMSA/IHMxLnkgOiAtMWU2Ow0KLSAgICAgIHgxID0gZS5jIC0gZS5iICogeTE7DQotICAgICAgeTIgPSBzMiA/IHMyLnkgOiAxZTY7DQotICAgICAgeDIgPSBlLmMgLSBlLmIgKiB5MjsNCi0gICAgfSBlbHNlIHsNCi0gICAgICB4MSA9IHMxID8gczEueCA6IC0xZTY7DQotICAgICAgeTEgPSBlLmMgLSBlLmEgKiB4MTsNCi0gICAgICB4MiA9IHMyID8gczIueCA6IDFlNjsNCi0gICAgICB5MiA9IGUuYyAtIGUuYSAqIHgyOw0KLSAgICB9DQotICAgIHZhciB2MSA9IFt4MSwgeTFdLA0KLSAgICAgICAgdjIgPSBbeDIsIHkyXTsNCi0gICAgcG9seWdvbnNbZS5yZWdpb24ubC5pbmRleF0ucHVzaCh2MSwgdjIpOw0KLSAgICBwb2x5Z29uc1tlLnJlZ2lvbi5yLmluZGV4XS5wdXNoKHYxLCB2Mik7DQotICB9KTsNCi0NCi0gIC8vIFJlY29ubmVjdCB0aGUgcG9seWdvbiBzZWdtZW50cyBpbnRvIGNvdW50ZXJjbG9ja3dpc2UgbG9vcHMuDQotICByZXR1cm4gcG9seWdvbnMubWFwKGZ1bmN0aW9uKHBvbHlnb24sIGkpIHsNCi0gICAgdmFyIGN4ID0gdmVydGljZXNbaV1bMF0sDQotICAgICAgICBjeSA9IHZlcnRpY2VzW2ldWzFdOw0KLSAgICBwb2x5Z29uLmZvckVhY2goZnVuY3Rpb24odikgew0KLSAgICAgIHYuYW5nbGUgPSBNYXRoLmF0YW4yKHZbMF0gLSBjeCwgdlsxXSAtIGN5KTsNCi0gICAgfSk7DQotICAgIHJldHVybiBwb2x5Z29uLnNvcnQoZnVuY3Rpb24oYSwgYikgew0KLSAgICAgIHJldHVybiBhLmFuZ2xlIC0gYi5hbmdsZTsNCi0gICAgfSkuZmlsdGVyKGZ1bmN0aW9uKGQsIGkpIHsNCi0gICAgICByZXR1cm4gIWkgfHwgKGQuYW5nbGUgLSBwb2x5Z29uW2kgLSAxXS5hbmdsZSA+IDFlLTEwKTsNCi0gICAgfSk7DQotICB9KTsNCi19Ow0KLQ0KLXZhciBkM192b3Jvbm9pX29wcG9zaXRlID0geyJsIjogInIiLCAiciI6ICJsIn07DQotDQotZnVuY3Rpb24gZDNfdm9yb25vaV90ZXNzZWxsYXRlKHZlcnRpY2VzLCBjYWxsYmFjaykgew0KLQ0KLSAgdmFyIFNpdGVzID0gew0KLSAgICBsaXN0OiB2ZXJ0aWNlcw0KLSAgICAgIC5tYXAoZnVuY3Rpb24odiwgaSkgew0KLSAgICAgICAgcmV0dXJuIHsNCi0gICAgICAgICAgaW5kZXg6IGksDQotICAgICAgICAgIHg6IHZbMF0sDQotICAgICAgICAgIHk6IHZbMV0NCi0gICAgICAgIH07DQotICAgICAgfSkNCi0gICAgICAuc29ydChmdW5jdGlvbihhLCBiKSB7DQotICAgICAgICByZXR1cm4gYS55IDwgYi55ID8gLTENCi0gICAgICAgICAgOiBhLnkgPiBiLnkgPyAxDQotICAgICAgICAgIDogYS54IDwgYi54ID8gLTENCi0gICAgICAgICAgOiBhLnggPiBiLnggPyAxDQotICAgICAgICAgIDogMDsNCi0gICAgICB9KSwNCi0gICAgYm90dG9tU2l0ZTogbnVsbA0KLSAgfTsNCi0NCi0gIHZhciBFZGdlTGlzdCA9IHsNCi0gICAgbGlzdDogW10sDQotICAgIGxlZnRFbmQ6IG51bGwsDQotICAgIHJpZ2h0RW5kOiBudWxsLA0KLQ0KLSAgICBpbml0OiBmdW5jdGlvbigpIHsNCi0gICAgICBFZGdlTGlzdC5sZWZ0RW5kID0gRWRnZUxpc3QuY3JlYXRlSGFsZkVkZ2UobnVsbCwgImwiKTsNCi0gICAgICBFZGdlTGlzdC5yaWdodEVuZCA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKG51bGwsICJsIik7DQotICAgICAgRWRnZUxpc3QubGVmdEVuZC5yID0gRWRnZUxpc3QucmlnaHRFbmQ7DQotICAgICAgRWRnZUxpc3QucmlnaHRFbmQubCA9IEVkZ2VMaXN0LmxlZnRFbmQ7DQotICAgICAgRWRnZUxpc3QubGlzdC51bnNoaWZ0KEVkZ2VMaXN0LmxlZnRFbmQsIEVkZ2VMaXN0LnJpZ2h0RW5kKTsNCi0gICAgfSwNCi0NCi0gICAgY3JlYXRlSGFsZkVkZ2U6IGZ1bmN0aW9uKGVkZ2UsIHNpZGUpIHsNCi0gICAgICByZXR1cm4gew0KLSAgICAgICAgZWRnZTogZWRnZSwNCi0gICAgICAgIHNpZGU6IHNpZGUsDQotICAgICAgICB2ZXJ0ZXg6IG51bGwsDQotICAgICAgICAibCI6IG51bGwsDQotICAgICAgICAiciI6IG51bGwNCi0gICAgICB9Ow0KLSAgICB9LA0KLQ0KLSAgICBpbnNlcnQ6IGZ1bmN0aW9uKGxiLCBoZSkgew0KLSAgICAgIGhlLmwgPSBsYjsNCi0gICAgICBoZS5yID0gbGIucjsNCi0gICAgICBsYi5yLmwgPSBoZTsNCi0gICAgICBsYi5yID0gaGU7DQotICAgIH0sDQotDQotICAgIGxlZnRCb3VuZDogZnVuY3Rpb24ocCkgew0KLSAgICAgIHZhciBoZSA9IEVkZ2VMaXN0LmxlZnRFbmQ7DQotICAgICAgZG8gew0KLSAgICAgICAgaGUgPSBoZS5yOw0KLSAgICAgIH0gd2hpbGUgKGhlICE9IEVkZ2VMaXN0LnJpZ2h0RW5kICYmIEdlb20ucmlnaHRPZihoZSwgcCkpOw0KLSAgICAgIGhlID0gaGUubDsNCi0gICAgICByZXR1cm4gaGU7DQotICAgIH0sDQotDQotICAgIGRlbDogZnVuY3Rpb24oaGUpIHsNCi0gICAgICBoZS5sLnIgPSBoZS5yOw0KLSAgICAgIGhlLnIubCA9IGhlLmw7DQotICAgICAgaGUuZWRnZSA9IG51bGw7DQotICAgIH0sDQotDQotICAgIHJpZ2h0OiBmdW5jdGlvbihoZSkgew0KLSAgICAgIHJldHVybiBoZS5yOw0KLSAgICB9LA0KLQ0KLSAgICBsZWZ0OiBmdW5jdGlvbihoZSkgew0KLSAgICAgIHJldHVybiBoZS5sOw0KLSAgICB9LA0KLQ0KLSAgICBsZWZ0UmVnaW9uOiBmdW5jdGlvbihoZSkgew0KLSAgICAgIHJldHVybiBoZS5lZGdlID09IG51bGwNCi0gICAgICAgICAgPyBTaXRlcy5ib3R0b21TaXRlDQotICAgICAgICAgIDogaGUuZWRnZS5yZWdpb25baGUuc2lkZV07DQotICAgIH0sDQotDQotICAgIHJpZ2h0UmVnaW9uOiBmdW5jdGlvbihoZSkgew0KLSAgICAgIHJldHVybiBoZS5lZGdlID09IG51bGwNCi0gICAgICAgICAgPyBTaXRlcy5ib3R0b21TaXRlDQotICAgICAgICAgIDogaGUuZWRnZS5yZWdpb25bZDNfdm9yb25vaV9vcHBvc2l0ZVtoZS5zaWRlXV07DQotICAgIH0NCi0gIH07DQotDQotICB2YXIgR2VvbSA9IHsNCi0NCi0gICAgYmlzZWN0OiBmdW5jdGlvbihzMSwgczIpIHsNCi0gICAgICB2YXIgbmV3RWRnZSA9IHsNCi0gICAgICAgIHJlZ2lvbjogeyJsIjogczEsICJyIjogczJ9LA0KLSAgICAgICAgZXA6IHsibCI6IG51bGwsICJyIjogbnVsbH0NCi0gICAgICB9Ow0KLQ0KLSAgICAgIHZhciBkeCA9IHMyLnggLSBzMS54LA0KLSAgICAgICAgICBkeSA9IHMyLnkgLSBzMS55LA0KLSAgICAgICAgICBhZHggPSBkeCA+IDAgPyBkeCA6IC1keCwNCi0gICAgICAgICAgYWR5ID0gZHkgPiAwID8gZHkgOiAtZHk7DQotDQotICAgICAgbmV3RWRnZS5jID0gczEueCAqIGR4ICsgczEueSAqIGR5DQotICAgICAgICAgICsgKGR4ICogZHggKyBkeSAqIGR5KSAqIC41Ow0KLQ0KLSAgICAgIGlmIChhZHggPiBhZHkpIHsNCi0gICAgICAgIG5ld0VkZ2UuYSA9IDE7DQotICAgICAgICBuZXdFZGdlLmIgPSBkeSAvIGR4Ow0KLSAgICAgICAgbmV3RWRnZS5jIC89IGR4Ow0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBuZXdFZGdlLmIgPSAxOw0KLSAgICAgICAgbmV3RWRnZS5hID0gZHggLyBkeTsNCi0gICAgICAgIG5ld0VkZ2UuYyAvPSBkeTsNCi0gICAgICB9DQotDQotICAgICAgcmV0dXJuIG5ld0VkZ2U7DQotICAgIH0sDQotDQotICAgIGludGVyc2VjdDogZnVuY3Rpb24oZWwxLCBlbDIpIHsNCi0gICAgICB2YXIgZTEgPSBlbDEuZWRnZSwNCi0gICAgICAgICAgZTIgPSBlbDIuZWRnZTsNCi0gICAgICBpZiAoIWUxIHx8ICFlMiB8fCAoZTEucmVnaW9uLnIgPT0gZTIucmVnaW9uLnIpKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICB9DQotICAgICAgdmFyIGQgPSAoZTEuYSAqIGUyLmIpIC0gKGUxLmIgKiBlMi5hKTsNCi0gICAgICBpZiAoTWF0aC5hYnMoZCkgPCAxZS0xMCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgfQ0KLSAgICAgIHZhciB4aW50ID0gKGUxLmMgKiBlMi5iIC0gZTIuYyAqIGUxLmIpIC8gZCwNCi0gICAgICAgICAgeWludCA9IChlMi5jICogZTEuYSAtIGUxLmMgKiBlMi5hKSAvIGQsDQotICAgICAgICAgIGUxciA9IGUxLnJlZ2lvbi5yLA0KLSAgICAgICAgICBlMnIgPSBlMi5yZWdpb24uciwNCi0gICAgICAgICAgZWwsDQotICAgICAgICAgIGU7DQotICAgICAgaWYgKChlMXIueSA8IGUyci55KSB8fA0KLSAgICAgICAgIChlMXIueSA9PSBlMnIueSAmJiBlMXIueCA8IGUyci54KSkgew0KLSAgICAgICAgZWwgPSBlbDE7DQotICAgICAgICBlID0gZTE7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGVsID0gZWwyOw0KLSAgICAgICAgZSA9IGUyOw0KLSAgICAgIH0NCi0gICAgICB2YXIgcmlnaHRPZlNpdGUgPSAoeGludCA+PSBlLnJlZ2lvbi5yLngpOw0KLSAgICAgIGlmICgocmlnaHRPZlNpdGUgJiYgKGVsLnNpZGUgPT09ICJsIikpIHx8DQotICAgICAgICAoIXJpZ2h0T2ZTaXRlICYmIChlbC5zaWRlID09PSAiciIpKSkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiB7DQotICAgICAgICB4OiB4aW50LA0KLSAgICAgICAgeTogeWludA0KLSAgICAgIH07DQotICAgIH0sDQotDQotICAgIHJpZ2h0T2Y6IGZ1bmN0aW9uKGhlLCBwKSB7DQotICAgICAgdmFyIGUgPSBoZS5lZGdlLA0KLSAgICAgICAgICB0b3BzaXRlID0gZS5yZWdpb24uciwNCi0gICAgICAgICAgcmlnaHRPZlNpdGUgPSAocC54ID4gdG9wc2l0ZS54KTsNCi0NCi0gICAgICBpZiAocmlnaHRPZlNpdGUgJiYgKGhlLnNpZGUgPT09ICJsIikpIHsNCi0gICAgICAgIHJldHVybiAxOw0KLSAgICAgIH0NCi0gICAgICBpZiAoIXJpZ2h0T2ZTaXRlICYmIChoZS5zaWRlID09PSAiciIpKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgICB9DQotICAgICAgaWYgKGUuYSA9PT0gMSkgew0KLSAgICAgICAgdmFyIGR5cCA9IHAueSAtIHRvcHNpdGUueSwNCi0gICAgICAgICAgICBkeHAgPSBwLnggLSB0b3BzaXRlLngsDQotICAgICAgICAgICAgZmFzdCA9IDAsDQotICAgICAgICAgICAgYWJvdmUgPSAwOw0KLQ0KLSAgICAgICAgaWYgKCghcmlnaHRPZlNpdGUgJiYgKGUuYiA8IDApKSB8fA0KLSAgICAgICAgICAocmlnaHRPZlNpdGUgJiYgKGUuYiA+PSAwKSkpIHsNCi0gICAgICAgICAgYWJvdmUgPSBmYXN0ID0gKGR5cCA+PSBlLmIgKiBkeHApOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgYWJvdmUgPSAoKHAueCArIHAueSAqIGUuYikgPiBlLmMpOw0KLSAgICAgICAgICBpZiAoZS5iIDwgMCkgew0KLSAgICAgICAgICAgIGFib3ZlID0gIWFib3ZlOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmICghYWJvdmUpIHsNCi0gICAgICAgICAgICBmYXN0ID0gMTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFmYXN0KSB7DQotICAgICAgICAgIHZhciBkeHMgPSB0b3BzaXRlLnggLSBlLnJlZ2lvbi5sLng7DQotICAgICAgICAgIGFib3ZlID0gKGUuYiAqIChkeHAgKiBkeHAgLSBkeXAgKiBkeXApKSA8DQotICAgICAgICAgICAgKGR4cyAqIGR5cCAqICgxICsgMiAqIGR4cCAvIGR4cyArIGUuYiAqIGUuYikpOw0KLQ0KLSAgICAgICAgICBpZiAoZS5iIDwgMCkgew0KLSAgICAgICAgICAgIGFib3ZlID0gIWFib3ZlOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgfSBlbHNlIC8qIGUuYiA9PSAxICovIHsNCi0gICAgICAgIHZhciB5bCA9IGUuYyAtIGUuYSAqIHAueCwNCi0gICAgICAgICAgICB0MSA9IHAueSAtIHlsLA0KLSAgICAgICAgICAgIHQyID0gcC54IC0gdG9wc2l0ZS54LA0KLSAgICAgICAgICAgIHQzID0geWwgLSB0b3BzaXRlLnk7DQotDQotICAgICAgICBhYm92ZSA9ICh0MSAqIHQxKSA+ICh0MiAqIHQyICsgdDMgKiB0Myk7DQotICAgICAgfQ0KLSAgICAgIHJldHVybiBoZS5zaWRlID09PSAibCIgPyBhYm92ZSA6ICFhYm92ZTsNCi0gICAgfSwNCi0NCi0gICAgZW5kUG9pbnQ6IGZ1bmN0aW9uKGVkZ2UsIHNpZGUsIHNpdGUpIHsNCi0gICAgICBlZGdlLmVwW3NpZGVdID0gc2l0ZTsNCi0gICAgICBpZiAoIWVkZ2UuZXBbZDNfdm9yb25vaV9vcHBvc2l0ZVtzaWRlXV0pIHJldHVybjsNCi0gICAgICBjYWxsYmFjayhlZGdlKTsNCi0gICAgfSwNCi0NCi0gICAgZGlzdGFuY2U6IGZ1bmN0aW9uKHMsIHQpIHsNCi0gICAgICB2YXIgZHggPSBzLnggLSB0LngsDQotICAgICAgICAgIGR5ID0gcy55IC0gdC55Ow0KLSAgICAgIHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpOw0KLSAgICB9DQotICB9Ow0KLQ0KLSAgdmFyIEV2ZW50UXVldWUgPSB7DQotICAgIGxpc3Q6IFtdLA0KLQ0KLSAgICBpbnNlcnQ6IGZ1bmN0aW9uKGhlLCBzaXRlLCBvZmZzZXQpIHsNCi0gICAgICBoZS52ZXJ0ZXggPSBzaXRlOw0KLSAgICAgIGhlLnlzdGFyID0gc2l0ZS55ICsgb2Zmc2V0Ow0KLSAgICAgIGZvciAodmFyIGk9MCwgbGlzdD1FdmVudFF1ZXVlLmxpc3QsIGw9bGlzdC5sZW5ndGg7IGk8bDsgaSsrKSB7DQotICAgICAgICB2YXIgbmV4dCA9IGxpc3RbaV07DQotICAgICAgICBpZiAoaGUueXN0YXIgPiBuZXh0LnlzdGFyIHx8DQotICAgICAgICAgIChoZS55c3RhciA9PSBuZXh0LnlzdGFyICYmDQotICAgICAgICAgIHNpdGUueCA+IG5leHQudmVydGV4LngpKSB7DQotICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIGxpc3Quc3BsaWNlKGksIDAsIGhlKTsNCi0gICAgfSwNCi0NCi0gICAgZGVsOiBmdW5jdGlvbihoZSkgew0KLSAgICAgIGZvciAodmFyIGk9MCwgbHM9RXZlbnRRdWV1ZS5saXN0LCBsPWxzLmxlbmd0aDsgaTxsICYmIChsc1tpXSAhPSBoZSk7ICsraSkge30NCi0gICAgICBscy5zcGxpY2UoaSwgMSk7DQotICAgIH0sDQotDQotICAgIGVtcHR5OiBmdW5jdGlvbigpIHsgcmV0dXJuIEV2ZW50UXVldWUubGlzdC5sZW5ndGggPT09IDA7IH0sDQotDQotICAgIG5leHRFdmVudDogZnVuY3Rpb24oaGUpIHsNCi0gICAgICBmb3IgKHZhciBpPTAsIGxzPUV2ZW50UXVldWUubGlzdCwgbD1scy5sZW5ndGg7IGk8bDsgKytpKSB7DQotICAgICAgICBpZiAobHNbaV0gPT0gaGUpIHJldHVybiBsc1tpKzFdOw0KLSAgICAgIH0NCi0gICAgICByZXR1cm4gbnVsbDsNCi0gICAgfSwNCi0NCi0gICAgbWluOiBmdW5jdGlvbigpIHsNCi0gICAgICB2YXIgZWxlbSA9IEV2ZW50UXVldWUubGlzdFswXTsNCi0gICAgICByZXR1cm4gew0KLSAgICAgICAgeDogZWxlbS52ZXJ0ZXgueCwNCi0gICAgICAgIHk6IGVsZW0ueXN0YXINCi0gICAgICB9Ow0KLSAgICB9LA0KLQ0KLSAgICBleHRyYWN0TWluOiBmdW5jdGlvbigpIHsNCi0gICAgICByZXR1cm4gRXZlbnRRdWV1ZS5saXN0LnNoaWZ0KCk7DQotICAgIH0NCi0gIH07DQotDQotICBFZGdlTGlzdC5pbml0KCk7DQotICBTaXRlcy5ib3R0b21TaXRlID0gU2l0ZXMubGlzdC5zaGlmdCgpOw0KLQ0KLSAgdmFyIG5ld1NpdGUgPSBTaXRlcy5saXN0LnNoaWZ0KCksIG5ld0ludFN0YXI7DQotICB2YXIgbGJuZCwgcmJuZCwgbGxibmQsIHJyYm5kLCBiaXNlY3RvcjsNCi0gIHZhciBib3QsIHRvcCwgdGVtcCwgcCwgdjsNCi0gIHZhciBlLCBwbTsNCi0NCi0gIHdoaWxlICh0cnVlKSB7DQotICAgIGlmICghRXZlbnRRdWV1ZS5lbXB0eSgpKSB7DQotICAgICAgbmV3SW50U3RhciA9IEV2ZW50UXVldWUubWluKCk7DQotICAgIH0NCi0gICAgaWYgKG5ld1NpdGUgJiYgKEV2ZW50UXVldWUuZW1wdHkoKQ0KLSAgICAgIHx8IG5ld1NpdGUueSA8IG5ld0ludFN0YXIueQ0KLSAgICAgIHx8IChuZXdTaXRlLnkgPT0gbmV3SW50U3Rhci55DQotICAgICAgJiYgbmV3U2l0ZS54IDwgbmV3SW50U3Rhci54KSkpIHsgLy9uZXcgc2l0ZSBpcyBzbWFsbGVzdA0KLSAgICAgIGxibmQgPSBFZGdlTGlzdC5sZWZ0Qm91bmQobmV3U2l0ZSk7DQotICAgICAgcmJuZCA9IEVkZ2VMaXN0LnJpZ2h0KGxibmQpOw0KLSAgICAgIGJvdCA9IEVkZ2VMaXN0LnJpZ2h0UmVnaW9uKGxibmQpOw0KLSAgICAgIGUgPSBHZW9tLmJpc2VjdChib3QsIG5ld1NpdGUpOw0KLSAgICAgIGJpc2VjdG9yID0gRWRnZUxpc3QuY3JlYXRlSGFsZkVkZ2UoZSwgImwiKTsNCi0gICAgICBFZGdlTGlzdC5pbnNlcnQobGJuZCwgYmlzZWN0b3IpOw0KLSAgICAgIHAgPSBHZW9tLmludGVyc2VjdChsYm5kLCBiaXNlY3Rvcik7DQotICAgICAgaWYgKHApIHsNCi0gICAgICAgIEV2ZW50UXVldWUuZGVsKGxibmQpOw0KLSAgICAgICAgRXZlbnRRdWV1ZS5pbnNlcnQobGJuZCwgcCwgR2VvbS5kaXN0YW5jZShwLCBuZXdTaXRlKSk7DQotICAgICAgfQ0KLSAgICAgIGxibmQgPSBiaXNlY3RvcjsNCi0gICAgICBiaXNlY3RvciA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKGUsICJyIik7DQotICAgICAgRWRnZUxpc3QuaW5zZXJ0KGxibmQsIGJpc2VjdG9yKTsNCi0gICAgICBwID0gR2VvbS5pbnRlcnNlY3QoYmlzZWN0b3IsIHJibmQpOw0KLSAgICAgIGlmIChwKSB7DQotICAgICAgICBFdmVudFF1ZXVlLmluc2VydChiaXNlY3RvciwgcCwgR2VvbS5kaXN0YW5jZShwLCBuZXdTaXRlKSk7DQotICAgICAgfQ0KLSAgICAgIG5ld1NpdGUgPSBTaXRlcy5saXN0LnNoaWZ0KCk7DQotICAgIH0gZWxzZSBpZiAoIUV2ZW50UXVldWUuZW1wdHkoKSkgeyAvL2ludGVyc2VjdGlvbiBpcyBzbWFsbGVzdA0KLSAgICAgIGxibmQgPSBFdmVudFF1ZXVlLmV4dHJhY3RNaW4oKTsNCi0gICAgICBsbGJuZCA9IEVkZ2VMaXN0LmxlZnQobGJuZCk7DQotICAgICAgcmJuZCA9IEVkZ2VMaXN0LnJpZ2h0KGxibmQpOw0KLSAgICAgIHJyYm5kID0gRWRnZUxpc3QucmlnaHQocmJuZCk7DQotICAgICAgYm90ID0gRWRnZUxpc3QubGVmdFJlZ2lvbihsYm5kKTsNCi0gICAgICB0b3AgPSBFZGdlTGlzdC5yaWdodFJlZ2lvbihyYm5kKTsNCi0gICAgICB2ID0gbGJuZC52ZXJ0ZXg7DQotICAgICAgR2VvbS5lbmRQb2ludChsYm5kLmVkZ2UsIGxibmQuc2lkZSwgdik7DQotICAgICAgR2VvbS5lbmRQb2ludChyYm5kLmVkZ2UsIHJibmQuc2lkZSwgdik7DQotICAgICAgRWRnZUxpc3QuZGVsKGxibmQpOw0KLSAgICAgIEV2ZW50UXVldWUuZGVsKHJibmQpOw0KLSAgICAgIEVkZ2VMaXN0LmRlbChyYm5kKTsNCi0gICAgICBwbSA9ICJsIjsNCi0gICAgICBpZiAoYm90LnkgPiB0b3AueSkgew0KLSAgICAgICAgdGVtcCA9IGJvdDsNCi0gICAgICAgIGJvdCA9IHRvcDsNCi0gICAgICAgIHRvcCA9IHRlbXA7DQotICAgICAgICBwbSA9ICJyIjsNCi0gICAgICB9DQotICAgICAgZSA9IEdlb20uYmlzZWN0KGJvdCwgdG9wKTsNCi0gICAgICBiaXNlY3RvciA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKGUsIHBtKTsNCi0gICAgICBFZGdlTGlzdC5pbnNlcnQobGxibmQsIGJpc2VjdG9yKTsNCi0gICAgICBHZW9tLmVuZFBvaW50KGUsIGQzX3Zvcm9ub2lfb3Bwb3NpdGVbcG1dLCB2KTsNCi0gICAgICBwID0gR2VvbS5pbnRlcnNlY3QobGxibmQsIGJpc2VjdG9yKTsNCi0gICAgICBpZiAocCkgew0KLSAgICAgICAgRXZlbnRRdWV1ZS5kZWwobGxibmQpOw0KLSAgICAgICAgRXZlbnRRdWV1ZS5pbnNlcnQobGxibmQsIHAsIEdlb20uZGlzdGFuY2UocCwgYm90KSk7DQotICAgICAgfQ0KLSAgICAgIHAgPSBHZW9tLmludGVyc2VjdChiaXNlY3RvciwgcnJibmQpOw0KLSAgICAgIGlmIChwKSB7DQotICAgICAgICBFdmVudFF1ZXVlLmluc2VydChiaXNlY3RvciwgcCwgR2VvbS5kaXN0YW5jZShwLCBib3QpKTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgYnJlYWs7DQotICAgIH0NCi0gIH0vL2VuZCB3aGlsZQ0KLQ0KLSAgZm9yIChsYm5kID0gRWRnZUxpc3QucmlnaHQoRWRnZUxpc3QubGVmdEVuZCk7DQotICAgICAgbGJuZCAhPSBFZGdlTGlzdC5yaWdodEVuZDsNCi0gICAgICBsYm5kID0gRWRnZUxpc3QucmlnaHQobGJuZCkpIHsNCi0gICAgY2FsbGJhY2sobGJuZC5lZGdlKTsNCi0gIH0NCi19DQotLyoqDQotKiBAcGFyYW0gdmVydGljZXMgW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXQ0KLSogQHJldHVybnMgdHJpYW5nbGVzIFtbW3gxLCB5MV0sIFt4MiwgeTJdLCBbeDMsIHkzXV0sIOKApl0NCi0gKi8NCi1kMy5nZW9tLmRlbGF1bmF5ID0gZnVuY3Rpb24odmVydGljZXMpIHsNCi0gIHZhciBlZGdlcyA9IHZlcnRpY2VzLm1hcChmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9KSwNCi0gICAgICB0cmlhbmdsZXMgPSBbXTsNCi0NCi0gIC8vIFVzZSB0aGUgVm9yb25vaSB0ZXNzZWxsYXRpb24gdG8gZGV0ZXJtaW5lIERlbGF1bmF5IGVkZ2VzLg0KLSAgZDNfdm9yb25vaV90ZXNzZWxsYXRlKHZlcnRpY2VzLCBmdW5jdGlvbihlKSB7DQotICAgIGVkZ2VzW2UucmVnaW9uLmwuaW5kZXhdLnB1c2godmVydGljZXNbZS5yZWdpb24uci5pbmRleF0pOw0KLSAgfSk7DQotDQotICAvLyBSZWNvbm5lY3QgdGhlIGVkZ2VzIGludG8gY291bnRlcmNsb2Nrd2lzZSB0cmlhbmdsZXMuDQotICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2UsIGkpIHsNCi0gICAgdmFyIHYgPSB2ZXJ0aWNlc1tpXSwNCi0gICAgICAgIGN4ID0gdlswXSwNCi0gICAgICAgIGN5ID0gdlsxXTsNCi0gICAgZWRnZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsNCi0gICAgICB2LmFuZ2xlID0gTWF0aC5hdGFuMih2WzBdIC0gY3gsIHZbMV0gLSBjeSk7DQotICAgIH0pOw0KLSAgICBlZGdlLnNvcnQoZnVuY3Rpb24oYSwgYikgew0KLSAgICAgIHJldHVybiBhLmFuZ2xlIC0gYi5hbmdsZTsNCi0gICAgfSk7DQotICAgIGZvciAodmFyIGogPSAwLCBtID0gZWRnZS5sZW5ndGggLSAxOyBqIDwgbTsgaisrKSB7DQotICAgICAgdHJpYW5nbGVzLnB1c2goW3YsIGVkZ2Vbal0sIGVkZ2VbaiArIDFdXSk7DQotICAgIH0NCi0gIH0pOw0KLQ0KLSAgcmV0dXJuIHRyaWFuZ2xlczsNCi19Ow0KLS8vIENvbnN0cnVjdHMgYSBuZXcgcXVhZHRyZWUgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgcG9pbnRzLiBBIHF1YWR0cmVlIGlzIGENCi0vLyB0d28tZGltZW5zaW9uYWwgcmVjdXJzaXZlIHNwYXRpYWwgc3ViZGl2aXNpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcw0KLS8vIHNxdWFyZSBwYXJ0aXRpb25zLCBkaXZpZGluZyBlYWNoIHNxdWFyZSBpbnRvIGZvdXIgZXF1YWxseS1zaXplZCBzcXVhcmVzLiBFYWNoDQotLy8gcG9pbnQgZXhpc3RzIGluIGEgdW5pcXVlIG5vZGU7IGlmIG11bHRpcGxlIHBvaW50cyBhcmUgaW4gdGhlIHNhbWUgcG9zaXRpb24sDQotLy8gc29tZSBwb2ludHMgbWF5IGJlIHN0b3JlZCBvbiBpbnRlcm5hbCBub2RlcyByYXRoZXIgdGhhbiBsZWFmIG5vZGVzLiBRdWFkdHJlZXMNCi0vLyBjYW4gYmUgdXNlZCB0byBhY2NlbGVyYXRlIHZhcmlvdXMgc3BhdGlhbCBvcGVyYXRpb25zLCBzdWNoIGFzIHRoZSBCYXJuZXMtSHV0DQotLy8gYXBwcm94aW1hdGlvbiBmb3IgY29tcHV0aW5nIG4tYm9keSBmb3JjZXMsIG9yIGNvbGxpc2lvbiBkZXRlY3Rpb24uDQotZDMuZ2VvbS5xdWFkdHJlZSA9IGZ1bmN0aW9uKHBvaW50cywgeDEsIHkxLCB4MiwgeTIpIHsNCi0gIHZhciBwLA0KLSAgICAgIGkgPSAtMSwNCi0gICAgICBuID0gcG9pbnRzLmxlbmd0aDsNCi0NCi0gIC8vIFR5cGUgY29udmVyc2lvbiBmb3IgZGVwcmVjYXRlZCBBUEkuDQotICBpZiAobiAmJiBpc05hTihwb2ludHNbMF0ueCkpIHBvaW50cyA9IHBvaW50cy5tYXAoZDNfZ2VvbV9xdWFkdHJlZVBvaW50KTsNCi0NCi0gIC8vIEFsbG93IGJvdW5kcyB0byBiZSBzcGVjaWZpZWQgZXhwbGljaXRseS4NCi0gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNSkgew0KLSAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykgew0KLSAgICAgIHkyID0geDIgPSB5MTsNCi0gICAgICB5MSA9IHgxOw0KLSAgICB9IGVsc2Ugew0KLSAgICAgIHgxID0geTEgPSBJbmZpbml0eTsNCi0gICAgICB4MiA9IHkyID0gLUluZmluaXR5Ow0KLQ0KLSAgICAgIC8vIENvbXB1dGUgYm91bmRzLg0KLSAgICAgIHdoaWxlICgrK2kgPCBuKSB7DQotICAgICAgICBwID0gcG9pbnRzW2ldOw0KLSAgICAgICAgaWYgKHAueCA8IHgxKSB4MSA9IHAueDsNCi0gICAgICAgIGlmIChwLnkgPCB5MSkgeTEgPSBwLnk7DQotICAgICAgICBpZiAocC54ID4geDIpIHgyID0gcC54Ow0KLSAgICAgICAgaWYgKHAueSA+IHkyKSB5MiA9IHAueTsNCi0gICAgICB9DQotDQotICAgICAgLy8gU3F1YXJpZnkgdGhlIGJvdW5kcy4NCi0gICAgICB2YXIgZHggPSB4MiAtIHgxLA0KLSAgICAgICAgICBkeSA9IHkyIC0geTE7DQotICAgICAgaWYgKGR4ID4gZHkpIHkyID0geTEgKyBkeDsNCi0gICAgICBlbHNlIHgyID0geDEgKyBkeTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gUmVjdXJzaXZlbHkgaW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBvaW50IHAgYXQgdGhlIG5vZGUgbiBvciBvbmUgb2YgaXRzDQotICAvLyBkZXNjZW5kYW50cy4gVGhlIGJvdW5kcyBhcmUgZGVmaW5lZCBieSBbeDEsIHgyXSBhbmQgW3kxLCB5Ml0uDQotICBmdW5jdGlvbiBpbnNlcnQobiwgcCwgeDEsIHkxLCB4MiwgeTIpIHsNCi0gICAgaWYgKGlzTmFOKHAueCkgfHwgaXNOYU4ocC55KSkgcmV0dXJuOyAvLyBpZ25vcmUgaW52YWxpZCBwb2ludHMNCi0gICAgaWYgKG4ubGVhZikgew0KLSAgICAgIHZhciB2ID0gbi5wb2ludDsNCi0gICAgICBpZiAodikgew0KLSAgICAgICAgLy8gSWYgdGhlIHBvaW50IGF0IHRoaXMgbGVhZiBub2RlIGlzIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzIHRoZSBuZXcNCi0gICAgICAgIC8vIHBvaW50IHdlIGFyZSBhZGRpbmcsIHdlIGxlYXZlIHRoZSBwb2ludCBhc3NvY2lhdGVkIHdpdGggdGhlDQotICAgICAgICAvLyBpbnRlcm5hbCBub2RlIHdoaWxlIGFkZGluZyB0aGUgbmV3IHBvaW50IHRvIGEgY2hpbGQgbm9kZS4gVGhpcw0KLSAgICAgICAgLy8gYXZvaWRzIGluZmluaXRlIHJlY3Vyc2lvbi4NCi0gICAgICAgIGlmICgoTWF0aC5hYnModi54IC0gcC54KSArIE1hdGguYWJzKHYueSAtIHAueSkpIDwgLjAxKSB7DQotICAgICAgICAgIGluc2VydENoaWxkKG4sIHAsIHgxLCB5MSwgeDIsIHkyKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgIG4ucG9pbnQgPSBudWxsOw0KLSAgICAgICAgICBpbnNlcnRDaGlsZChuLCB2LCB4MSwgeTEsIHgyLCB5Mik7DQotICAgICAgICAgIGluc2VydENoaWxkKG4sIHAsIHgxLCB5MSwgeDIsIHkyKTsNCi0gICAgICAgIH0NCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgbi5wb2ludCA9IHA7DQotICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLSAgICAgIGluc2VydENoaWxkKG4sIHAsIHgxLCB5MSwgeDIsIHkyKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLy8gUmVjdXJzaXZlbHkgaW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBvaW50IHAgaW50byBhIGRlc2NlbmRhbnQgb2Ygbm9kZSBuLiBUaGUNCi0gIC8vIGJvdW5kcyBhcmUgZGVmaW5lZCBieSBbeDEsIHgyXSBhbmQgW3kxLCB5Ml0uDQotICBmdW5jdGlvbiBpbnNlcnRDaGlsZChuLCBwLCB4MSwgeTEsIHgyLCB5Mikgew0KLSAgICAvLyBDb21wdXRlIHRoZSBzcGxpdCBwb2ludCwgYW5kIHRoZSBxdWFkcmFudCBpbiB3aGljaCB0byBpbnNlcnQgcC4NCi0gICAgdmFyIHN4ID0gKHgxICsgeDIpICogLjUsDQotICAgICAgICBzeSA9ICh5MSArIHkyKSAqIC41LA0KLSAgICAgICAgcmlnaHQgPSBwLnggPj0gc3gsDQotICAgICAgICBib3R0b20gPSBwLnkgPj0gc3ksDQotICAgICAgICBpID0gKGJvdHRvbSA8PCAxKSArIHJpZ2h0Ow0KLQ0KLSAgICAvLyBSZWN1cnNpdmVseSBpbnNlcnQgaW50byB0aGUgY2hpbGQgbm9kZS4NCi0gICAgbi5sZWFmID0gZmFsc2U7DQotICAgIG4gPSBuLm5vZGVzW2ldIHx8IChuLm5vZGVzW2ldID0gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKSk7DQotDQotICAgIC8vIFVwZGF0ZSB0aGUgYm91bmRzIGFzIHdlIHJlY3Vyc2UuDQotICAgIGlmIChyaWdodCkgeDEgPSBzeDsgZWxzZSB4MiA9IHN4Ow0KLSAgICBpZiAoYm90dG9tKSB5MSA9IHN5OyBlbHNlIHkyID0gc3k7DQotICAgIGluc2VydChuLCBwLCB4MSwgeTEsIHgyLCB5Mik7DQotICB9DQotDQotICAvLyBDcmVhdGUgdGhlIHJvb3Qgbm9kZS4NCi0gIHZhciByb290ID0gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKTsNCi0NCi0gIHJvb3QuYWRkID0gZnVuY3Rpb24ocCkgew0KLSAgICBpbnNlcnQocm9vdCwgcCwgeDEsIHkxLCB4MiwgeTIpOw0KLSAgfTsNCi0NCi0gIHJvb3QudmlzaXQgPSBmdW5jdGlvbihmKSB7DQotICAgIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCByb290LCB4MSwgeTEsIHgyLCB5Mik7DQotICB9Ow0KLQ0KLSAgLy8gSW5zZXJ0IGFsbCBwb2ludHMuDQotICBwb2ludHMuZm9yRWFjaChyb290LmFkZCk7DQotICByZXR1cm4gcm9vdDsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVOb2RlKCkgew0KLSAgcmV0dXJuIHsNCi0gICAgbGVhZjogdHJ1ZSwNCi0gICAgbm9kZXM6IFtdLA0KLSAgICBwb2ludDogbnVsbA0KLSAgfTsNCi19DQotDQotZnVuY3Rpb24gZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIG5vZGUsIHgxLCB5MSwgeDIsIHkyKSB7DQotICBpZiAoIWYobm9kZSwgeDEsIHkxLCB4MiwgeTIpKSB7DQotICAgIHZhciBzeCA9ICh4MSArIHgyKSAqIC41LA0KLSAgICAgICAgc3kgPSAoeTEgKyB5MikgKiAuNSwNCi0gICAgICAgIGNoaWxkcmVuID0gbm9kZS5ub2RlczsNCi0gICAgaWYgKGNoaWxkcmVuWzBdKSBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgY2hpbGRyZW5bMF0sIHgxLCB5MSwgc3gsIHN5KTsNCi0gICAgaWYgKGNoaWxkcmVuWzFdKSBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgY2hpbGRyZW5bMV0sIHN4LCB5MSwgeDIsIHN5KTsNCi0gICAgaWYgKGNoaWxkcmVuWzJdKSBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgY2hpbGRyZW5bMl0sIHgxLCBzeSwgc3gsIHkyKTsNCi0gICAgaWYgKGNoaWxkcmVuWzNdKSBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgY2hpbGRyZW5bM10sIHN4LCBzeSwgeDIsIHkyKTsNCi0gIH0NCi19DQotDQotZnVuY3Rpb24gZDNfZ2VvbV9xdWFkdHJlZVBvaW50KHApIHsNCi0gIHJldHVybiB7DQotICAgIHg6IHBbMF0sDQotICAgIHk6IHBbMV0NCi0gIH07DQotfQ0KLWQzLnRpbWUgPSB7fTsNCi0NCi12YXIgZDNfdGltZSA9IERhdGU7DQotDQotZnVuY3Rpb24gZDNfdGltZV91dGMoKSB7DQotICB0aGlzLl8gPSBuZXcgRGF0ZShhcmd1bWVudHMubGVuZ3RoID4gMQ0KLSAgICAgID8gRGF0ZS5VVEMuYXBwbHkodGhpcywgYXJndW1lbnRzKQ0KLSAgICAgIDogYXJndW1lbnRzWzBdKTsNCi19DQotDQotZDNfdGltZV91dGMucHJvdG90eXBlID0gew0KLSAgZ2V0RGF0ZTogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDRGF0ZSgpOyB9LA0KLSAgZ2V0RGF5OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRVVENEYXkoKTsgfSwNCi0gIGdldEZ1bGxZZWFyOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRVVENGdWxsWWVhcigpOyB9LA0KLSAgZ2V0SG91cnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fLmdldFVUQ0hvdXJzKCk7IH0sDQotICBnZXRNaWxsaXNlY29uZHM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fLmdldFVUQ01pbGxpc2Vjb25kcygpOyB9LA0KLSAgZ2V0TWludXRlczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDTWludXRlcygpOyB9LA0KLSAgZ2V0TW9udGg6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fLmdldFVUQ01vbnRoKCk7IH0sDQotICBnZXRTZWNvbmRzOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRVVENTZWNvbmRzKCk7IH0sDQotICBnZXRUaW1lOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRUaW1lKCk7IH0sDQotICBnZXRUaW1lem9uZU9mZnNldDogZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9LA0KLSAgdmFsdWVPZjogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8udmFsdWVPZigpOyB9LA0KLSAgc2V0RGF0ZTogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0RhdGUuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOyB9LA0KLSAgc2V0RGF5OiBmdW5jdGlvbigpIHsgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDRGF5LmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsgfSwNCi0gIHNldEZ1bGxZZWFyOiBmdW5jdGlvbigpIHsgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDRnVsbFllYXIuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOyB9LA0KLSAgc2V0SG91cnM6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENIb3Vycy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7IH0sDQotICBzZXRNaWxsaXNlY29uZHM6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOyB9LA0KLSAgc2V0TWludXRlczogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ01pbnV0ZXMuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOyB9LA0KLSAgc2V0TW9udGg6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNb250aC5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7IH0sDQotICBzZXRTZWNvbmRzOiBmdW5jdGlvbigpIHsgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7IH0sDQotICBzZXRUaW1lOiBmdW5jdGlvbigpIHsgZDNfdGltZV9wcm90b3R5cGUuc2V0VGltZS5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7IH0NCi19Ow0KLQ0KLXZhciBkM190aW1lX3Byb3RvdHlwZSA9IERhdGUucHJvdG90eXBlOw0KLWQzLnRpbWUuZm9ybWF0ID0gZnVuY3Rpb24odGVtcGxhdGUpIHsNCi0gIHZhciBuID0gdGVtcGxhdGUubGVuZ3RoOw0KLQ0KLSAgZnVuY3Rpb24gZm9ybWF0KGRhdGUpIHsNCi0gICAgdmFyIHN0cmluZyA9IFtdLA0KLSAgICAgICAgaSA9IC0xLA0KLSAgICAgICAgaiA9IDAsDQotICAgICAgICBjLA0KLSAgICAgICAgZjsNCi0gICAgd2hpbGUgKCsraSA8IG4pIHsNCi0gICAgICBpZiAodGVtcGxhdGUuY2hhckNvZGVBdChpKSA9PSAzNykgew0KLSAgICAgICAgc3RyaW5nLnB1c2goDQotICAgICAgICAgICAgdGVtcGxhdGUuc3Vic3RyaW5nKGosIGkpLA0KLSAgICAgICAgICAgIChmID0gZDNfdGltZV9mb3JtYXRzW2MgPSB0ZW1wbGF0ZS5jaGFyQXQoKytpKV0pDQotICAgICAgICAgICAgPyBmKGRhdGUpIDogYyk7DQotICAgICAgICBqID0gaSArIDE7DQotICAgICAgfQ0KLSAgICB9DQotICAgIHN0cmluZy5wdXNoKHRlbXBsYXRlLnN1YnN0cmluZyhqLCBpKSk7DQotICAgIHJldHVybiBzdHJpbmcuam9pbigiIik7DQotICB9DQotDQotICBmb3JtYXQucGFyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHsNCi0gICAgdmFyIGQgPSB7eTogMTkwMCwgbTogMCwgZDogMSwgSDogMCwgTTogMCwgUzogMCwgTDogMH0sDQotICAgICAgICBpID0gZDNfdGltZV9wYXJzZShkLCB0ZW1wbGF0ZSwgc3RyaW5nLCAwKTsNCi0gICAgaWYgKGkgIT0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIG51bGw7DQotDQotICAgIC8vIFRoZSBhbS1wbSBmbGFnIGlzIDAgZm9yIEFNLCBhbmQgMSBmb3IgUE0uDQotICAgIGlmICgicCIgaW4gZCkgZC5IID0gZC5IICUgMTIgKyBkLnAgKiAxMjsNCi0NCi0gICAgdmFyIGRhdGUgPSBuZXcgZDNfdGltZSgpOw0KLSAgICBkYXRlLnNldEZ1bGxZZWFyKGQueSwgZC5tLCBkLmQpOw0KLSAgICBkYXRlLnNldEhvdXJzKGQuSCwgZC5NLCBkLlMsIGQuTCk7DQotICAgIHJldHVybiBkYXRlOw0KLSAgfTsNCi0NCi0gIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgew0KLSAgICByZXR1cm4gdGVtcGxhdGU7DQotICB9Ow0KLQ0KLSAgcmV0dXJuIGZvcm1hdDsNCi19Ow0KLQ0KLWZ1bmN0aW9uIGQzX3RpbWVfcGFyc2UoZGF0ZSwgdGVtcGxhdGUsIHN0cmluZywgaikgew0KLSAgdmFyIGMsDQotICAgICAgcCwNCi0gICAgICBpID0gMCwNCi0gICAgICBuID0gdGVtcGxhdGUubGVuZ3RoLA0KLSAgICAgIG0gPSBzdHJpbmcubGVuZ3RoOw0KLSAgd2hpbGUgKGkgPCBuKSB7DQotICAgIGlmIChqID49IG0pIHJldHVybiAtMTsNCi0gICAgYyA9IHRlbXBsYXRlLmNoYXJDb2RlQXQoaSsrKTsNCi0gICAgaWYgKGMgPT0gMzcpIHsNCi0gICAgICBwID0gZDNfdGltZV9wYXJzZXJzW3RlbXBsYXRlLmNoYXJBdChpKyspXTsNCi0gICAgICBpZiAoIXAgfHwgKChqID0gcChkYXRlLCBzdHJpbmcsIGopKSA8IDApKSByZXR1cm4gLTE7DQotICAgIH0gZWxzZSBpZiAoYyAhPSBzdHJpbmcuY2hhckNvZGVBdChqKyspKSB7DQotICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICB9DQotICByZXR1cm4gajsNCi19DQotDQotdmFyIGQzX3RpbWVfemZpbGwyID0gZDMuZm9ybWF0KCIwMmQiKSwNCi0gICAgZDNfdGltZV96ZmlsbDMgPSBkMy5mb3JtYXQoIjAzZCIpLA0KLSAgICBkM190aW1lX3pmaWxsNCA9IGQzLmZvcm1hdCgiMDRkIiksDQotICAgIGQzX3RpbWVfc2ZpbGwyID0gZDMuZm9ybWF0KCIyZCIpOw0KLQ0KLXZhciBkM190aW1lX2Zvcm1hdHMgPSB7DQotICBhOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3dlZWtkYXlzW2QuZ2V0RGF5KCldLnN1YnN0cmluZygwLCAzKTsgfSwNCi0gIEE6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfd2Vla2RheXNbZC5nZXREYXkoKV07IH0sDQotICBiOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX21vbnRoc1tkLmdldE1vbnRoKCldLnN1YnN0cmluZygwLCAzKTsgfSwNCi0gIEI6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfbW9udGhzW2QuZ2V0TW9udGgoKV07IH0sDQotICBjOiBkMy50aW1lLmZvcm1hdCgiJWEgJWIgJWUgJUg6JU06JVMgJVkiKSwNCi0gIGQ6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQuZ2V0RGF0ZSgpKTsgfSwNCi0gIGU6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfc2ZpbGwyKGQuZ2V0RGF0ZSgpKTsgfSwNCi0gIEg6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQuZ2V0SG91cnMoKSk7IH0sDQotICBJOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMihkLmdldEhvdXJzKCkgJSAxMiB8fCAxMik7IH0sDQotICBqOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMygxICsgZDMudGltZS5kYXlPZlllYXIoZCkpOyB9LA0KLSAgTDogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDMoZC5nZXRNaWxsaXNlY29uZHMoKSk7IH0sDQotICBtOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMihkLmdldE1vbnRoKCkgKyAxKTsgfSwNCi0gIE06IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQuZ2V0TWludXRlcygpKTsgfSwNCi0gIHA6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0SG91cnMoKSA+PSAxMiA/ICJQTSIgOiAiQU0iOyB9LA0KLSAgUzogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDIoZC5nZXRTZWNvbmRzKCkpOyB9LA0KLSAgVTogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDIoZDMudGltZS5zdW5kYXlPZlllYXIoZCkpOyB9LA0KLSAgdzogZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXREYXkoKTsgfSwNCi0gIFc6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQzLnRpbWUubW9uZGF5T2ZZZWFyKGQpKTsgfSwNCi0gIHg6IGQzLnRpbWUuZm9ybWF0KCIlbS8lZC8leSIpLA0KLSAgWDogZDMudGltZS5mb3JtYXQoIiVIOiVNOiVTIiksDQotICB5OiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMihkLmdldEZ1bGxZZWFyKCkgJSAxMDApOyB9LA0KLSAgWTogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDQoZC5nZXRGdWxsWWVhcigpICUgMTAwMDApOyB9LA0KLSAgWjogZDNfdGltZV96b25lLA0KLSAgIiUiOiBmdW5jdGlvbihkKSB7IHJldHVybiAiJSI7IH0NCi19Ow0KLQ0KLXZhciBkM190aW1lX3BhcnNlcnMgPSB7DQotICBhOiBkM190aW1lX3BhcnNlV2Vla2RheUFiYnJldiwNCi0gIEE6IGQzX3RpbWVfcGFyc2VXZWVrZGF5LA0KLSAgYjogZDNfdGltZV9wYXJzZU1vbnRoQWJicmV2LA0KLSAgQjogZDNfdGltZV9wYXJzZU1vbnRoLA0KLSAgYzogZDNfdGltZV9wYXJzZUxvY2FsZUZ1bGwsDQotICBkOiBkM190aW1lX3BhcnNlRGF5LA0KLSAgZTogZDNfdGltZV9wYXJzZURheSwNCi0gIEg6IGQzX3RpbWVfcGFyc2VIb3VyMjQsDQotICBJOiBkM190aW1lX3BhcnNlSG91cjI0LA0KLSAgLy8gajogZnVuY3Rpb24oZCwgcywgaSkgeyAvKlRPRE8gZGF5IG9mIHllYXIgWzAwMSwzNjZdICovIHJldHVybiBpOyB9LA0KLSAgTDogZDNfdGltZV9wYXJzZU1pbGxpc2Vjb25kcywNCi0gIG06IGQzX3RpbWVfcGFyc2VNb250aE51bWJlciwNCi0gIE06IGQzX3RpbWVfcGFyc2VNaW51dGVzLA0KLSAgcDogZDNfdGltZV9wYXJzZUFtUG0sDQotICBTOiBkM190aW1lX3BhcnNlU2Vjb25kcywNCi0gIC8vIFU6IGZ1bmN0aW9uKGQsIHMsIGkpIHsgLypUT0RPIHdlZWsgbnVtYmVyIChzdW5kYXkpIFswMCw1M10gKi8gcmV0dXJuIGk7IH0sDQotICAvLyB3OiBmdW5jdGlvbihkLCBzLCBpKSB7IC8qVE9ETyB3ZWVrZGF5IFswLDZdICovIHJldHVybiBpOyB9LA0KLSAgLy8gVzogZnVuY3Rpb24oZCwgcywgaSkgeyAvKlRPRE8gd2VlayBudW1iZXIgKG1vbmRheSkgWzAwLDUzXSAqLyByZXR1cm4gaTsgfSwNCi0gIHg6IGQzX3RpbWVfcGFyc2VMb2NhbGVEYXRlLA0KLSAgWDogZDNfdGltZV9wYXJzZUxvY2FsZVRpbWUsDQotICB5OiBkM190aW1lX3BhcnNlWWVhciwNCi0gIFk6IGQzX3RpbWVfcGFyc2VGdWxsWWVhcg0KLSAgLy8gLA0KLSAgLy8gWjogZnVuY3Rpb24oZCwgcywgaSkgeyAvKlRPRE8gdGltZSB6b25lICovIHJldHVybiBpOyB9LA0KLSAgLy8gIiUiOiBmdW5jdGlvbihkLCBzLCBpKSB7IC8qVE9ETyBsaXRlcmFsICUgKi8gcmV0dXJuIGk7IH0NCi19Ow0KLQ0KLS8vIE5vdGU6IHdlZWtkYXkgaXMgdmFsaWRhdGVkLCBidXQgZG9lcyBub3Qgc2V0IHRoZSBkYXRlLg0KLWZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrZGF5QWJicmV2KGRhdGUsIHN0cmluZywgaSkgew0KLSAgcmV0dXJuIGQzX3RpbWVfd2Vla2RheUFiYnJldlJlLnRlc3Qoc3RyaW5nLnN1YnN0cmluZyhpLCBpICs9IDMpKSA/IGkgOiAtMTsNCi19DQotDQotLy8gTm90ZTogd2Vla2RheSBpcyB2YWxpZGF0ZWQsIGJ1dCBkb2VzIG5vdCBzZXQgdGhlIGRhdGUuDQotZnVuY3Rpb24gZDNfdGltZV9wYXJzZVdlZWtkYXkoZGF0ZSwgc3RyaW5nLCBpKSB7DQotICBkM190aW1lX3dlZWtkYXlSZS5sYXN0SW5kZXggPSAwOw0KLSAgdmFyIG4gPSBkM190aW1lX3dlZWtkYXlSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDEwKSk7DQotICByZXR1cm4gbiA/IGkgKz0gblswXS5sZW5ndGggOiAtMTsNCi19DQotDQotdmFyIGQzX3RpbWVfd2Vla2RheUFiYnJldlJlID0gL14oPzpzdW58bW9ufHR1ZXx3ZWR8dGh1fGZyaXxzYXQpL2ksDQotICAgIGQzX3RpbWVfd2Vla2RheVJlID0gL14oPzpTdW5kYXl8TW9uZGF5fFR1ZXNkYXl8V2VkbmVzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheSkvaTsNCi0gICAgZDNfdGltZV93ZWVrZGF5cyA9IFsiU3VuZGF5IiwgIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiXTsNCi0NCi1mdW5jdGlvbiBkM190aW1lX3BhcnNlTW9udGhBYmJyZXYoZGF0ZSwgc3RyaW5nLCBpKSB7DQotICB2YXIgbiA9IGQzX3RpbWVfbW9udGhBYmJyZXZMb29rdXAuZ2V0KHN0cmluZy5zdWJzdHJpbmcoaSwgaSArPSAzKS50b0xvd2VyQ2FzZSgpKTsNCi0gIHJldHVybiBuID09IG51bGwgPyAtMSA6IChkYXRlLm0gPSBuLCBpKTsNCi19DQotDQotdmFyIGQzX3RpbWVfbW9udGhBYmJyZXZMb29rdXAgPSBkMy5tYXAoew0KLSAgamFuOiAwLA0KLSAgZmViOiAxLA0KLSAgbWFyOiAyLA0KLSAgYXByOiAzLA0KLSAgbWF5OiA0LA0KLSAganVuOiA1LA0KLSAganVsOiA2LA0KLSAgYXVnOiA3LA0KLSAgc2VwOiA4LA0KLSAgb2N0OiA5LA0KLSAgbm92OiAxMCwNCi0gIGRlYzogMTENCi19KTsNCi0NCi1mdW5jdGlvbiBkM190aW1lX3BhcnNlTW9udGgoZGF0ZSwgc3RyaW5nLCBpKSB7DQotICBkM190aW1lX21vbnRoUmUubGFzdEluZGV4ID0gMDsNCi0gIHZhciBuID0gZDNfdGltZV9tb250aFJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMTIpKTsNCi0gIHJldHVybiBuID8gKGRhdGUubSA9IGQzX3RpbWVfbW9udGhMb29rdXAuZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSksIGkgKz0gblswXS5sZW5ndGgpIDogLTE7DQotfQ0KLQ0KLXZhciBkM190aW1lX21vbnRoUmUgPSAvXig/OkphbnVhcnl8RmVicnVhcnl8TWFyY2h8QXByaWx8TWF5fEp1bmV8SnVseXxBdWd1c3R8U2VwdGVtYmVyfE9jdG9iZXJ8Tm92ZW1iZXJ8RGVjZW1iZXIpL2lnOw0KLQ0KLXZhciBkM190aW1lX21vbnRoTG9va3VwID0gZDMubWFwKHsNCi0gIGphbnVhcnk6IDAsDQotICBmZWJydWFyeTogMSwNCi0gIG1hcmNoOiAyLA0KLSAgYXByaWw6IDMsDQotICBtYXk6IDQsDQotICBqdW5lOiA1LA0KLSAganVseTogNiwNCi0gIGF1Z3VzdDogNywNCi0gIHNlcHRlbWJlcjogOCwNCi0gIG9jdG9iZXI6IDksDQotICBub3ZlbWJlcjogMTAsDQotICBkZWNlbWJlcjogMTENCi19KTsNCi0NCi12YXIgZDNfdGltZV9tb250aHMgPSBbDQotICAiSmFudWFyeSIsDQotICAiRmVicnVhcnkiLA0KLSAgIk1hcmNoIiwNCi0gICJBcHJpbCIsDQotICAiTWF5IiwNCi0gICJKdW5lIiwNCi0gICJKdWx5IiwNCi0gICJBdWd1c3QiLA0KLSAgIlNlcHRlbWJlciIsDQotICAiT2N0b2JlciIsDQotICAiTm92ZW1iZXIiLA0KLSAgIkRlY2VtYmVyIg0KLV07DQotDQotZnVuY3Rpb24gZDNfdGltZV9wYXJzZUxvY2FsZUZ1bGwoZGF0ZSwgc3RyaW5nLCBpKSB7DQotICByZXR1cm4gZDNfdGltZV9wYXJzZShkYXRlLCBkM190aW1lX2Zvcm1hdHMuYy50b1N0cmluZygpLCBzdHJpbmcsIGkpOw0KLX0NCi0NCi1mdW5jdGlvbiBkM190aW1lX3BhcnNlTG9jYWxlRGF0ZShkYXRlLCBzdHJpbmcsIGkpIHsNCi0gIHJldHVybiBkM190aW1lX3BhcnNlKGRhdGUsIGQzX3RpbWVfZm9ybWF0cy54LnRvU3RyaW5nKCksIHN0cmluZywgaSk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VMb2NhbGVUaW1lKGRhdGUsIHN0cmluZywgaSkgew0KLSAgcmV0dXJuIGQzX3RpbWVfcGFyc2UoZGF0ZSwgZDNfdGltZV9mb3JtYXRzLlgudG9TdHJpbmcoKSwgc3RyaW5nLCBpKTsNCi19DQotDQotZnVuY3Rpb24gZDNfdGltZV9wYXJzZUZ1bGxZZWFyKGRhdGUsIHN0cmluZywgaSkgew0KLSAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOw0KLSAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgNCkpOw0KLSAgcmV0dXJuIG4gPyAoZGF0ZS55ID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VZZWFyKGRhdGUsIHN0cmluZywgaSkgew0KLSAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOw0KLSAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMikpOw0KLSAgcmV0dXJuIG4gPyAoZGF0ZS55ID0gZDNfdGltZV9jZW50dXJ5KCkgKyArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsNCi19DQotDQotZnVuY3Rpb24gZDNfdGltZV9jZW50dXJ5KCkgew0KLSAgcmV0dXJuIH5+KG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAvIDEwMDApICogMTAwMDsNCi19DQotDQotZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1vbnRoTnVtYmVyKGRhdGUsIHN0cmluZywgaSkgew0KLSAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOw0KLSAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMikpOw0KLSAgcmV0dXJuIG4gPyAoZGF0ZS5tID0gblswXSAtIDEsIGkgKz0gblswXS5sZW5ndGgpIDogLTE7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VEYXkoZGF0ZSwgc3RyaW5nLCBpKSB7DQotICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7DQotICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAyKSk7DQotICByZXR1cm4gbiA/IChkYXRlLmQgPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsNCi19DQotDQotLy8gTm90ZTogd2UgZG9uJ3QgdmFsaWRhdGUgdGhhdCB0aGUgaG91ciBpcyBpbiB0aGUgcmFuZ2UgWzAsMjNdIG9yIFsxLDEyXS4NCi1mdW5jdGlvbiBkM190aW1lX3BhcnNlSG91cjI0KGRhdGUsIHN0cmluZywgaSkgew0KLSAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOw0KLSAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMikpOw0KLSAgcmV0dXJuIG4gPyAoZGF0ZS5IID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNaW51dGVzKGRhdGUsIHN0cmluZywgaSkgew0KLSAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOw0KLSAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMikpOw0KLSAgcmV0dXJuIG4gPyAoZGF0ZS5NID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VTZWNvbmRzKGRhdGUsIHN0cmluZywgaSkgew0KLSAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOw0KLSAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMikpOw0KLSAgcmV0dXJuIG4gPyAoZGF0ZS5TID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNaWxsaXNlY29uZHMoZGF0ZSwgc3RyaW5nLCBpKSB7DQotICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7DQotICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAzKSk7DQotICByZXR1cm4gbiA/IChkYXRlLkwgPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsNCi19DQotDQotLy8gTm90ZTogd2UgZG9uJ3QgbG9vayBhdCB0aGUgbmV4dCBkaXJlY3RpdmUuDQotdmFyIGQzX3RpbWVfbnVtYmVyUmUgPSAvXHMqXGQrLzsNCi0NCi1mdW5jdGlvbiBkM190aW1lX3BhcnNlQW1QbShkYXRlLCBzdHJpbmcsIGkpIHsNCi0gIHZhciBuID0gZDNfdGltZV9hbVBtTG9va3VwLmdldChzdHJpbmcuc3Vic3RyaW5nKGksIGkgKz0gMikudG9Mb3dlckNhc2UoKSk7DQotICByZXR1cm4gbiA9PSBudWxsID8gLTEgOiAoZGF0ZS5wID0gbiwgaSk7DQotfQ0KLQ0KLXZhciBkM190aW1lX2FtUG1Mb29rdXAgPSBkMy5tYXAoew0KLSAgYW06IDAsDQotICBwbTogMQ0KLX0pOw0KLQ0KLS8vIFRPRE8gdGFibGUgb2YgdGltZSB6b25lIG9mZnNldCBuYW1lcz8NCi1mdW5jdGlvbiBkM190aW1lX3pvbmUoZCkgew0KLSAgdmFyIHogPSBkLmdldFRpbWV6b25lT2Zmc2V0KCksDQotICAgICAgenMgPSB6ID4gMCA/ICItIiA6ICIrIiwNCi0gICAgICB6aCA9IH5+KE1hdGguYWJzKHopIC8gNjApLA0KLSAgICAgIHptID0gTWF0aC5hYnMoeikgJSA2MDsNCi0gIHJldHVybiB6cyArIGQzX3RpbWVfemZpbGwyKHpoKSArIGQzX3RpbWVfemZpbGwyKHptKTsNCi19DQotZDMudGltZS5mb3JtYXQudXRjID0gZnVuY3Rpb24odGVtcGxhdGUpIHsNCi0gIHZhciBsb2NhbCA9IGQzLnRpbWUuZm9ybWF0KHRlbXBsYXRlKTsNCi0NCi0gIGZ1bmN0aW9uIGZvcm1hdChkYXRlKSB7DQotICAgIHRyeSB7DQotICAgICAgZDNfdGltZSA9IGQzX3RpbWVfdXRjOw0KLSAgICAgIHZhciB1dGMgPSBuZXcgZDNfdGltZSgpOw0KLSAgICAgIHV0Yy5fID0gZGF0ZTsNCi0gICAgICByZXR1cm4gbG9jYWwodXRjKTsNCi0gICAgfSBmaW5hbGx5IHsNCi0gICAgICBkM190aW1lID0gRGF0ZTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgZm9ybWF0LnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7DQotICAgIHRyeSB7DQotICAgICAgZDNfdGltZSA9IGQzX3RpbWVfdXRjOw0KLSAgICAgIHZhciBkYXRlID0gbG9jYWwucGFyc2Uoc3RyaW5nKTsNCi0gICAgICByZXR1cm4gZGF0ZSAmJiBkYXRlLl87DQotICAgIH0gZmluYWxseSB7DQotICAgICAgZDNfdGltZSA9IERhdGU7DQotICAgIH0NCi0gIH07DQotDQotICBmb3JtYXQudG9TdHJpbmcgPSBsb2NhbC50b1N0cmluZzsNCi0NCi0gIHJldHVybiBmb3JtYXQ7DQotfTsNCi12YXIgZDNfdGltZV9mb3JtYXRJc28gPSBkMy50aW1lLmZvcm1hdC51dGMoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpOw0KLQ0KLWQzLnRpbWUuZm9ybWF0LmlzbyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID8gZDNfdGltZV9mb3JtYXRJc29OYXRpdmUgOiBkM190aW1lX2Zvcm1hdElzbzsNCi0NCi1mdW5jdGlvbiBkM190aW1lX2Zvcm1hdElzb05hdGl2ZShkYXRlKSB7DQotICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpOw0KLX0NCi0NCi1kM190aW1lX2Zvcm1hdElzb05hdGl2ZS5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgew0KLSAgcmV0dXJuIG5ldyBEYXRlKHN0cmluZyk7DQotfTsNCi0NCi1kM190aW1lX2Zvcm1hdElzb05hdGl2ZS50b1N0cmluZyA9IGQzX3RpbWVfZm9ybWF0SXNvLnRvU3RyaW5nOw0KLWZ1bmN0aW9uIGQzX3RpbWVfaW50ZXJ2YWwobG9jYWwsIHN0ZXAsIG51bWJlcikgew0KLQ0KLSAgZnVuY3Rpb24gcm91bmQoZGF0ZSkgew0KLSAgICB2YXIgZDAgPSBsb2NhbChkYXRlKSwgZDEgPSBvZmZzZXQoZDAsIDEpOw0KLSAgICByZXR1cm4gZGF0ZSAtIGQwIDwgZDEgLSBkYXRlID8gZDAgOiBkMTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIGNlaWwoZGF0ZSkgew0KLSAgICBzdGVwKGRhdGUgPSBsb2NhbChuZXcgZDNfdGltZShkYXRlIC0gMSkpLCAxKTsNCi0gICAgcmV0dXJuIGRhdGU7DQotICB9DQotDQotICBmdW5jdGlvbiBvZmZzZXQoZGF0ZSwgaykgew0KLSAgICBzdGVwKGRhdGUgPSBuZXcgZDNfdGltZSgrZGF0ZSksIGspOw0KLSAgICByZXR1cm4gZGF0ZTsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHJhbmdlKHQwLCB0MSwgZHQpIHsNCi0gICAgdmFyIHRpbWUgPSBjZWlsKHQwKSwgdGltZXMgPSBbXTsNCi0gICAgaWYgKGR0ID4gMSkgew0KLSAgICAgIHdoaWxlICh0aW1lIDwgdDEpIHsNCi0gICAgICAgIGlmICghKG51bWJlcih0aW1lKSAlIGR0KSkgdGltZXMucHVzaChuZXcgRGF0ZSgrdGltZSkpOw0KLSAgICAgICAgc3RlcCh0aW1lLCAxKTsNCi0gICAgICB9DQotICAgIH0gZWxzZSB7DQotICAgICAgd2hpbGUgKHRpbWUgPCB0MSkgdGltZXMucHVzaChuZXcgRGF0ZSgrdGltZSkpLCBzdGVwKHRpbWUsIDEpOw0KLSAgICB9DQotICAgIHJldHVybiB0aW1lczsNCi0gIH0NCi0NCi0gIGZ1bmN0aW9uIHJhbmdlX3V0Yyh0MCwgdDEsIGR0KSB7DQotICAgIHRyeSB7DQotICAgICAgZDNfdGltZSA9IGQzX3RpbWVfdXRjOw0KLSAgICAgIHZhciB1dGMgPSBuZXcgZDNfdGltZV91dGMoKTsNCi0gICAgICB1dGMuXyA9IHQwOw0KLSAgICAgIHJldHVybiByYW5nZSh1dGMsIHQxLCBkdCk7DQotICAgIH0gZmluYWxseSB7DQotICAgICAgZDNfdGltZSA9IERhdGU7DQotICAgIH0NCi0gIH0NCi0NCi0gIGxvY2FsLmZsb29yID0gbG9jYWw7DQotICBsb2NhbC5yb3VuZCA9IHJvdW5kOw0KLSAgbG9jYWwuY2VpbCA9IGNlaWw7DQotICBsb2NhbC5vZmZzZXQgPSBvZmZzZXQ7DQotICBsb2NhbC5yYW5nZSA9IHJhbmdlOw0KLQ0KLSAgdmFyIHV0YyA9IGxvY2FsLnV0YyA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKGxvY2FsKTsNCi0gIHV0Yy5mbG9vciA9IHV0YzsNCi0gIHV0Yy5yb3VuZCA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKHJvdW5kKTsNCi0gIHV0Yy5jZWlsID0gZDNfdGltZV9pbnRlcnZhbF91dGMoY2VpbCk7DQotICB1dGMub2Zmc2V0ID0gZDNfdGltZV9pbnRlcnZhbF91dGMob2Zmc2V0KTsNCi0gIHV0Yy5yYW5nZSA9IHJhbmdlX3V0YzsNCi0NCi0gIHJldHVybiBsb2NhbDsNCi19DQotDQotZnVuY3Rpb24gZDNfdGltZV9pbnRlcnZhbF91dGMobWV0aG9kKSB7DQotICByZXR1cm4gZnVuY3Rpb24oZGF0ZSwgaykgew0KLSAgICB0cnkgew0KLSAgICAgIGQzX3RpbWUgPSBkM190aW1lX3V0YzsNCi0gICAgICB2YXIgdXRjID0gbmV3IGQzX3RpbWVfdXRjKCk7DQotICAgICAgdXRjLl8gPSBkYXRlOw0KLSAgICAgIHJldHVybiBtZXRob2QodXRjLCBrKS5fOw0KLSAgICB9IGZpbmFsbHkgew0KLSAgICAgIGQzX3RpbWUgPSBEYXRlOw0KLSAgICB9DQotICB9Ow0KLX0NCi1kMy50aW1lLnNlY29uZCA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KLSAgcmV0dXJuIG5ldyBkM190aW1lKE1hdGguZmxvb3IoZGF0ZSAvIDFlMykgKiAxZTMpOw0KLX0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgew0KLSAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgTWF0aC5mbG9vcihvZmZzZXQpICogMWUzKTsgLy8gRFNUIGJyZWFrcyBzZXRTZWNvbmRzDQotfSwgZnVuY3Rpb24oZGF0ZSkgew0KLSAgcmV0dXJuIGRhdGUuZ2V0U2Vjb25kcygpOw0KLX0pOw0KLQ0KLWQzLnRpbWUuc2Vjb25kcyA9IGQzLnRpbWUuc2Vjb25kLnJhbmdlOw0KLWQzLnRpbWUuc2Vjb25kcy51dGMgPSBkMy50aW1lLnNlY29uZC51dGMucmFuZ2U7DQotZDMudGltZS5taW51dGUgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCi0gIHJldHVybiBuZXcgZDNfdGltZShNYXRoLmZsb29yKGRhdGUgLyA2ZTQpICogNmU0KTsNCi19LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHsNCi0gIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDZlNCk7IC8vIERTVCBicmVha3Mgc2V0TWludXRlcw0KLX0sIGZ1bmN0aW9uKGRhdGUpIHsNCi0gIHJldHVybiBkYXRlLmdldE1pbnV0ZXMoKTsNCi19KTsNCi0NCi1kMy50aW1lLm1pbnV0ZXMgPSBkMy50aW1lLm1pbnV0ZS5yYW5nZTsNCi1kMy50aW1lLm1pbnV0ZXMudXRjID0gZDMudGltZS5taW51dGUudXRjLnJhbmdlOw0KLWQzLnRpbWUuaG91ciA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KLSAgdmFyIHRpbWV6b25lID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjA7DQotICByZXR1cm4gbmV3IGQzX3RpbWUoKE1hdGguZmxvb3IoZGF0ZSAvIDM2ZTUgLSB0aW1lem9uZSkgKyB0aW1lem9uZSkgKiAzNmU1KTsNCi19LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHsNCi0gIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDM2ZTUpOyAvLyBEU1QgYnJlYWtzIHNldEhvdXJzDQotfSwgZnVuY3Rpb24oZGF0ZSkgew0KLSAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKTsNCi19KTsNCi0NCi1kMy50aW1lLmhvdXJzID0gZDMudGltZS5ob3VyLnJhbmdlOw0KLWQzLnRpbWUuaG91cnMudXRjID0gZDMudGltZS5ob3VyLnV0Yy5yYW5nZTsNCi1kMy50aW1lLmRheSA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KLSAgcmV0dXJuIG5ldyBkM190aW1lKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7DQotfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7DQotICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBvZmZzZXQpOw0KLX0sIGZ1bmN0aW9uKGRhdGUpIHsNCi0gIHJldHVybiBkYXRlLmdldERhdGUoKSAtIDE7DQotfSk7DQotDQotZDMudGltZS5kYXlzID0gZDMudGltZS5kYXkucmFuZ2U7DQotZDMudGltZS5kYXlzLnV0YyA9IGQzLnRpbWUuZGF5LnV0Yy5yYW5nZTsNCi0NCi1kMy50aW1lLmRheU9mWWVhciA9IGZ1bmN0aW9uKGRhdGUpIHsNCi0gIHZhciB5ZWFyID0gZDMudGltZS55ZWFyKGRhdGUpOw0KLSAgcmV0dXJuIE1hdGguZmxvb3IoKGRhdGUgLSB5ZWFyKSAvIDg2NGU1IC0gKGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAtIHllYXIuZ2V0VGltZXpvbmVPZmZzZXQoKSkgLyAxNDQwKTsNCi19Ow0KLWQzX3RpbWVfd2Vla2RheXMuZm9yRWFjaChmdW5jdGlvbihkYXksIGkpIHsNCi0gIGRheSA9IGRheS50b0xvd2VyQ2FzZSgpOw0KLSAgaSA9IDcgLSBpOw0KLQ0KLSAgdmFyIGludGVydmFsID0gZDMudGltZVtkYXldID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQotICAgIChkYXRlID0gZDMudGltZS5kYXkoZGF0ZSkpLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIGkpICUgNyk7DQotICAgIHJldHVybiBkYXRlOw0KLSAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7DQotICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDcpOw0KLSAgfSwgZnVuY3Rpb24oZGF0ZSkgew0KLSAgICB2YXIgZGF5ID0gZDMudGltZS55ZWFyKGRhdGUpLmdldERheSgpOw0KLSAgICByZXR1cm4gTWF0aC5mbG9vcigoZDMudGltZS5kYXlPZlllYXIoZGF0ZSkgKyAoZGF5ICsgaSkgJSA3KSAvIDcpIC0gKGRheSAhPT0gaSk7DQotICB9KTsNCi0NCi0gIGQzLnRpbWVbZGF5ICsgInMiXSA9IGludGVydmFsLnJhbmdlOw0KLSAgZDMudGltZVtkYXkgKyAicyJdLnV0YyA9IGludGVydmFsLnV0Yy5yYW5nZTsNCi0NCi0gIGQzLnRpbWVbZGF5ICsgIk9mWWVhciJdID0gZnVuY3Rpb24oZGF0ZSkgew0KLSAgICB2YXIgZGF5ID0gZDMudGltZS55ZWFyKGRhdGUpLmdldERheSgpOw0KLSAgICByZXR1cm4gTWF0aC5mbG9vcigoZDMudGltZS5kYXlPZlllYXIoZGF0ZSkgKyAoZGF5ICsgaSkgJSA3KSAvIDcpOw0KLSAgfTsNCi19KTsNCi0NCi1kMy50aW1lLndlZWsgPSBkMy50aW1lLnN1bmRheTsNCi1kMy50aW1lLndlZWtzID0gZDMudGltZS5zdW5kYXkucmFuZ2U7DQotZDMudGltZS53ZWVrcy51dGMgPSBkMy50aW1lLnN1bmRheS51dGMucmFuZ2U7DQotZDMudGltZS53ZWVrT2ZZZWFyID0gZDMudGltZS5zdW5kYXlPZlllYXI7DQotZDMudGltZS5tb250aCA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KLSAgcmV0dXJuIG5ldyBkM190aW1lKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCAxKTsNCi19LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHsNCi0gIGRhdGUuc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgb2Zmc2V0KTsNCi19LCBmdW5jdGlvbihkYXRlKSB7DQotICByZXR1cm4gZGF0ZS5nZXRNb250aCgpOw0KLX0pOw0KLQ0KLWQzLnRpbWUubW9udGhzID0gZDMudGltZS5tb250aC5yYW5nZTsNCi1kMy50aW1lLm1vbnRocy51dGMgPSBkMy50aW1lLm1vbnRoLnV0Yy5yYW5nZTsNCi1kMy50aW1lLnllYXIgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCi0gIHJldHVybiBuZXcgZDNfdGltZShkYXRlLmdldEZ1bGxZZWFyKCksIDAsIDEpOw0KLX0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgew0KLSAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBvZmZzZXQpOw0KLX0sIGZ1bmN0aW9uKGRhdGUpIHsNCi0gIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk7DQotfSk7DQotDQotZDMudGltZS55ZWFycyA9IGQzLnRpbWUueWVhci5yYW5nZTsNCi1kMy50aW1lLnllYXJzLnV0YyA9IGQzLnRpbWUueWVhci51dGMucmFuZ2U7DQotZnVuY3Rpb24gZDNfdGltZV9zY2FsZShsaW5lYXIsIG1ldGhvZHMsIGZvcm1hdCkgew0KLQ0KLSAgZnVuY3Rpb24gc2NhbGUoeCkgew0KLSAgICByZXR1cm4gbGluZWFyKHgpOw0KLSAgfQ0KLQ0KLSAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeCkgew0KLSAgICByZXR1cm4gZDNfdGltZV9zY2FsZURhdGUobGluZWFyLmludmVydCh4KSk7DQotICB9Ow0KLQ0KLSAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgew0KLSAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5lYXIuZG9tYWluKCkubWFwKGQzX3RpbWVfc2NhbGVEYXRlKTsNCi0gICAgbGluZWFyLmRvbWFpbih4KTsNCi0gICAgcmV0dXJuIHNjYWxlOw0KLSAgfTsNCi0NCi0gIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihtKSB7DQotICAgIHZhciBleHRlbnQgPSBkM190aW1lX3NjYWxlRXh0ZW50KHNjYWxlLmRvbWFpbigpKTsNCi0gICAgcmV0dXJuIHNjYWxlLmRvbWFpbihbbS5mbG9vcihleHRlbnRbMF0pLCBtLmNlaWwoZXh0ZW50WzFdKV0pOw0KLSAgfTsNCi0NCi0gIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24obSwgaykgew0KLSAgICB2YXIgZXh0ZW50ID0gZDNfdGltZV9zY2FsZUV4dGVudChzY2FsZS5kb21haW4oKSk7DQotICAgIGlmICh0eXBlb2YgbSAhPT0gImZ1bmN0aW9uIikgew0KLSAgICAgIHZhciBzcGFuID0gZXh0ZW50WzFdIC0gZXh0ZW50WzBdLA0KLSAgICAgICAgICB0YXJnZXQgPSBzcGFuIC8gbSwNCi0gICAgICAgICAgaSA9IGQzLmJpc2VjdChkM190aW1lX3NjYWxlU3RlcHMsIHRhcmdldCk7DQotICAgICAgaWYgKGkgPT0gZDNfdGltZV9zY2FsZVN0ZXBzLmxlbmd0aCkgcmV0dXJuIG1ldGhvZHMueWVhcihleHRlbnQsIG0pOw0KLSAgICAgIGlmICghaSkgcmV0dXJuIGxpbmVhci50aWNrcyhtKS5tYXAoZDNfdGltZV9zY2FsZURhdGUpOw0KLSAgICAgIGlmIChNYXRoLmxvZyh0YXJnZXQgLyBkM190aW1lX3NjYWxlU3RlcHNbaSAtIDFdKSA8IE1hdGgubG9nKGQzX3RpbWVfc2NhbGVTdGVwc1tpXSAvIHRhcmdldCkpIC0taTsNCi0gICAgICBtID0gbWV0aG9kc1tpXTsNCi0gICAgICBrID0gbVsxXTsNCi0gICAgICBtID0gbVswXS5yYW5nZTsNCi0gICAgfQ0KLSAgICByZXR1cm4gbShleHRlbnRbMF0sIG5ldyBEYXRlKCtleHRlbnRbMV0gKyAxKSwgayk7IC8vIGluY2x1c2l2ZSB1cHBlciBib3VuZA0KLSAgfTsNCi0NCi0gIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbigpIHsNCi0gICAgcmV0dXJuIGZvcm1hdDsNCi0gIH07DQotDQotICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQotICAgIHJldHVybiBkM190aW1lX3NjYWxlKGxpbmVhci5jb3B5KCksIG1ldGhvZHMsIGZvcm1hdCk7DQotICB9Ow0KLQ0KLSAgLy8gVE9PRCBleHBvc2UgZDNfc2NhbGVfbGluZWFyX3JlYmluZD8NCi0gIHJldHVybiBkMy5yZWJpbmQoc2NhbGUsIGxpbmVhciwgInJhbmdlIiwgInJhbmdlUm91bmQiLCAiaW50ZXJwb2xhdGUiLCAiY2xhbXAiKTsNCi19DQotDQotLy8gVE9ETyBleHBvc2UgZDNfc2NhbGVFeHRlbnQ/DQotZnVuY3Rpb24gZDNfdGltZV9zY2FsZUV4dGVudChkb21haW4pIHsNCi0gIHZhciBzdGFydCA9IGRvbWFpblswXSwgc3RvcCA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV07DQotICByZXR1cm4gc3RhcnQgPCBzdG9wID8gW3N0YXJ0LCBzdG9wXSA6IFtzdG9wLCBzdGFydF07DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3RpbWVfc2NhbGVEYXRlKHQpIHsNCi0gIHJldHVybiBuZXcgRGF0ZSh0KTsNCi19DQotDQotZnVuY3Rpb24gZDNfdGltZV9zY2FsZUZvcm1hdChmb3JtYXRzKSB7DQotICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkgew0KLSAgICB2YXIgaSA9IGZvcm1hdHMubGVuZ3RoIC0gMSwgZiA9IGZvcm1hdHNbaV07DQotICAgIHdoaWxlICghZlsxXShkYXRlKSkgZiA9IGZvcm1hdHNbLS1pXTsNCi0gICAgcmV0dXJuIGZbMF0oZGF0ZSk7DQotICB9Ow0KLX0NCi0NCi1mdW5jdGlvbiBkM190aW1lX3NjYWxlU2V0WWVhcih5KSB7DQotICB2YXIgZCA9IG5ldyBEYXRlKHksIDAsIDEpOw0KLSAgZC5zZXRGdWxsWWVhcih5KTsgLy8gWTJLIGZhaWwNCi0gIHJldHVybiBkOw0KLX0NCi0NCi1mdW5jdGlvbiBkM190aW1lX3NjYWxlR2V0WWVhcihkKSB7DQotICB2YXIgeSA9IGQuZ2V0RnVsbFllYXIoKSwNCi0gICAgICBkMCA9IGQzX3RpbWVfc2NhbGVTZXRZZWFyKHkpLA0KLSAgICAgIGQxID0gZDNfdGltZV9zY2FsZVNldFllYXIoeSArIDEpOw0KLSAgcmV0dXJuIHkgKyAoZCAtIGQwKSAvIChkMSAtIGQwKTsNCi19DQotDQotdmFyIGQzX3RpbWVfc2NhbGVTdGVwcyA9IFsNCi0gIDFlMywgICAgLy8gMS1zZWNvbmQNCi0gIDVlMywgICAgLy8gNS1zZWNvbmQNCi0gIDE1ZTMsICAgLy8gMTUtc2Vjb25kDQotICAzZTQsICAgIC8vIDMwLXNlY29uZA0KLSAgNmU0LCAgICAvLyAxLW1pbnV0ZQ0KLSAgM2U1LCAgICAvLyA1LW1pbnV0ZQ0KLSAgOWU1LCAgICAvLyAxNS1taW51dGUNCi0gIDE4ZTUsICAgLy8gMzAtbWludXRlDQotICAzNmU1LCAgIC8vIDEtaG91cg0KLSAgMTA4ZTUsICAvLyAzLWhvdXINCi0gIDIxNmU1LCAgLy8gNi1ob3VyDQotICA0MzJlNSwgIC8vIDEyLWhvdXINCi0gIDg2NGU1LCAgLy8gMS1kYXkNCi0gIDE3MjhlNSwgLy8gMi1kYXkNCi0gIDYwNDhlNSwgLy8gMS13ZWVrDQotICAyNTkyZTYsIC8vIDEtbW9udGgNCi0gIDc3NzZlNiwgLy8gMy1tb250aA0KLSAgMzE1MzZlNiAvLyAxLXllYXINCi1dOw0KLQ0KLXZhciBkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzID0gWw0KLSAgW2QzLnRpbWUuc2Vjb25kLCAxXSwNCi0gIFtkMy50aW1lLnNlY29uZCwgNV0sDQotICBbZDMudGltZS5zZWNvbmQsIDE1XSwNCi0gIFtkMy50aW1lLnNlY29uZCwgMzBdLA0KLSAgW2QzLnRpbWUubWludXRlLCAxXSwNCi0gIFtkMy50aW1lLm1pbnV0ZSwgNV0sDQotICBbZDMudGltZS5taW51dGUsIDE1XSwNCi0gIFtkMy50aW1lLm1pbnV0ZSwgMzBdLA0KLSAgW2QzLnRpbWUuaG91ciwgMV0sDQotICBbZDMudGltZS5ob3VyLCAzXSwNCi0gIFtkMy50aW1lLmhvdXIsIDZdLA0KLSAgW2QzLnRpbWUuaG91ciwgMTJdLA0KLSAgW2QzLnRpbWUuZGF5LCAxXSwNCi0gIFtkMy50aW1lLmRheSwgMl0sDQotICBbZDMudGltZS53ZWVrLCAxXSwNCi0gIFtkMy50aW1lLm1vbnRoLCAxXSwNCi0gIFtkMy50aW1lLm1vbnRoLCAzXSwNCi0gIFtkMy50aW1lLnllYXIsIDFdDQotXTsNCi0NCi12YXIgZDNfdGltZV9zY2FsZUxvY2FsRm9ybWF0cyA9IFsNCi0gIFtkMy50aW1lLmZvcm1hdCgiJVkiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gdHJ1ZTsgfV0sDQotICBbZDMudGltZS5mb3JtYXQoIiVCIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0TW9udGgoKTsgfV0sDQotICBbZDMudGltZS5mb3JtYXQoIiViICVkIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0RGF0ZSgpICE9IDE7IH1dLA0KLSAgW2QzLnRpbWUuZm9ybWF0KCIlYSAlZCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldERheSgpICYmIGQuZ2V0RGF0ZSgpICE9IDE7IH1dLA0KLSAgW2QzLnRpbWUuZm9ybWF0KCIlSSAlcCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldEhvdXJzKCk7IH1dLA0KLSAgW2QzLnRpbWUuZm9ybWF0KCIlSTolTSIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldE1pbnV0ZXMoKTsgfV0sDQotICBbZDMudGltZS5mb3JtYXQoIjolUyIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFNlY29uZHMoKTsgfV0sDQotICBbZDMudGltZS5mb3JtYXQoIi4lTCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldE1pbGxpc2Vjb25kcygpOyB9XQ0KLV07DQotDQotdmFyIGQzX3RpbWVfc2NhbGVMaW5lYXIgPSBkMy5zY2FsZS5saW5lYXIoKSwNCi0gICAgZDNfdGltZV9zY2FsZUxvY2FsRm9ybWF0ID0gZDNfdGltZV9zY2FsZUZvcm1hdChkM190aW1lX3NjYWxlTG9jYWxGb3JtYXRzKTsNCi0NCi1kM190aW1lX3NjYWxlTG9jYWxNZXRob2RzLnllYXIgPSBmdW5jdGlvbihleHRlbnQsIG0pIHsNCi0gIHJldHVybiBkM190aW1lX3NjYWxlTGluZWFyLmRvbWFpbihleHRlbnQubWFwKGQzX3RpbWVfc2NhbGVHZXRZZWFyKSkudGlja3MobSkubWFwKGQzX3RpbWVfc2NhbGVTZXRZZWFyKTsNCi19Ow0KLQ0KLWQzLnRpbWUuc2NhbGUgPSBmdW5jdGlvbigpIHsNCi0gIHJldHVybiBkM190aW1lX3NjYWxlKGQzLnNjYWxlLmxpbmVhcigpLCBkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzLCBkM190aW1lX3NjYWxlTG9jYWxGb3JtYXQpOw0KLX07DQotdmFyIGQzX3RpbWVfc2NhbGVVVENNZXRob2RzID0gZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcy5tYXAoZnVuY3Rpb24obSkgew0KLSAgcmV0dXJuIFttWzBdLnV0YywgbVsxXV07DQotfSk7DQotDQotdmFyIGQzX3RpbWVfc2NhbGVVVENGb3JtYXRzID0gWw0KLSAgW2QzLnRpbWUuZm9ybWF0LnV0YygiJVkiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gdHJ1ZTsgfV0sDQotICBbZDMudGltZS5mb3JtYXQudXRjKCIlQiIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ01vbnRoKCk7IH1dLA0KLSAgW2QzLnRpbWUuZm9ybWF0LnV0YygiJWIgJWQiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXRVVENEYXRlKCkgIT0gMTsgfV0sDQotICBbZDMudGltZS5mb3JtYXQudXRjKCIlYSAlZCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ0RheSgpICYmIGQuZ2V0VVRDRGF0ZSgpICE9IDE7IH1dLA0KLSAgW2QzLnRpbWUuZm9ybWF0LnV0YygiJUkgJXAiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXRVVENIb3VycygpOyB9XSwNCi0gIFtkMy50aW1lLmZvcm1hdC51dGMoIiVJOiVNIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0VVRDTWludXRlcygpOyB9XSwNCi0gIFtkMy50aW1lLmZvcm1hdC51dGMoIjolUyIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ1NlY29uZHMoKTsgfV0sDQotICBbZDMudGltZS5mb3JtYXQudXRjKCIuJUwiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXRVVENNaWxsaXNlY29uZHMoKTsgfV0NCi1dOw0KLQ0KLXZhciBkM190aW1lX3NjYWxlVVRDRm9ybWF0ID0gZDNfdGltZV9zY2FsZUZvcm1hdChkM190aW1lX3NjYWxlVVRDRm9ybWF0cyk7DQotDQotZnVuY3Rpb24gZDNfdGltZV9zY2FsZVVUQ1NldFllYXIoeSkgew0KLSAgdmFyIGQgPSBuZXcgRGF0ZShEYXRlLlVUQyh5LCAwLCAxKSk7DQotICBkLnNldFVUQ0Z1bGxZZWFyKHkpOyAvLyBZMksgZmFpbA0KLSAgcmV0dXJuIGQ7DQotfQ0KLQ0KLWZ1bmN0aW9uIGQzX3RpbWVfc2NhbGVVVENHZXRZZWFyKGQpIHsNCi0gIHZhciB5ID0gZC5nZXRVVENGdWxsWWVhcigpLA0KLSAgICAgIGQwID0gZDNfdGltZV9zY2FsZVVUQ1NldFllYXIoeSksDQotICAgICAgZDEgPSBkM190aW1lX3NjYWxlVVRDU2V0WWVhcih5ICsgMSk7DQotICByZXR1cm4geSArIChkIC0gZDApIC8gKGQxIC0gZDApOw0KLX0NCi0NCi1kM190aW1lX3NjYWxlVVRDTWV0aG9kcy55ZWFyID0gZnVuY3Rpb24oZXh0ZW50LCBtKSB7DQotICByZXR1cm4gZDNfdGltZV9zY2FsZUxpbmVhci5kb21haW4oZXh0ZW50Lm1hcChkM190aW1lX3NjYWxlVVRDR2V0WWVhcikpLnRpY2tzKG0pLm1hcChkM190aW1lX3NjYWxlVVRDU2V0WWVhcik7DQotfTsNCi0NCi1kMy50aW1lLnNjYWxlLnV0YyA9IGZ1bmN0aW9uKCkgew0KLSAgcmV0dXJuIGQzX3RpbWVfc2NhbGUoZDMuc2NhbGUubGluZWFyKCksIGQzX3RpbWVfc2NhbGVVVENNZXRob2RzLCBkM190aW1lX3NjYWxlVVRDRm9ybWF0KTsNCi19Ow0KLX0pKCk7DQorLyoKKworQ29weXJpZ2h0IChjKSAyMDEzLCBNaWNoYWVsIEJvc3RvY2sKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworKiBUaGUgbmFtZSBNaWNoYWVsIEJvc3RvY2sgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCitBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIE1JQ0hBRUwgQk9TVE9DSyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCitJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKK0JVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCitPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworKi8KKworKGZ1bmN0aW9uKCl7aWYgKCFEYXRlLm5vdykgRGF0ZS5ub3cgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuICtuZXcgRGF0ZTsKK307Cit0cnkgeworICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsIDAsICIiKTsKK30gY2F0Y2ggKGVycm9yKSB7CisgIHZhciBkM19zdHlsZV9wcm90b3R5cGUgPSBDU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZSwKKyAgICAgIGQzX3N0eWxlX3NldFByb3BlcnR5ID0gZDNfc3R5bGVfcHJvdG90eXBlLnNldFByb3BlcnR5OworICBkM19zdHlsZV9wcm90b3R5cGUuc2V0UHJvcGVydHkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKKyAgICBkM19zdHlsZV9zZXRQcm9wZXJ0eS5jYWxsKHRoaXMsIG5hbWUsIHZhbHVlICsgIiIsIHByaW9yaXR5KTsKKyAgfTsKK30KK2QzID0ge3ZlcnNpb246ICIyLjguMSJ9OyAvLyBzZW12ZXIKK2Z1bmN0aW9uIGQzX2NsYXNzKGN0b3IsIHByb3BlcnRpZXMpIHsKKyAgdHJ5IHsKKyAgICBmb3IgKHZhciBrZXkgaW4gcHJvcGVydGllcykgeworICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0b3IucHJvdG90eXBlLCBrZXksIHsKKyAgICAgICAgdmFsdWU6IHByb3BlcnRpZXNba2V5XSwKKyAgICAgICAgZW51bWVyYWJsZTogZmFsc2UKKyAgICAgIH0pOworICAgIH0KKyAgfSBjYXRjaCAoZSkgeworICAgIGN0b3IucHJvdG90eXBlID0gcHJvcGVydGllczsKKyAgfQorfQordmFyIGQzX2FycmF5ID0gZDNfYXJyYXlTbGljZTsgLy8gY29udmVyc2lvbiBmb3IgTm9kZUxpc3RzCisKK2Z1bmN0aW9uIGQzX2FycmF5Q29weShwc2V1ZG9hcnJheSkgeworICB2YXIgaSA9IC0xLCBuID0gcHNldWRvYXJyYXkubGVuZ3RoLCBhcnJheSA9IFtdOworICB3aGlsZSAoKytpIDwgbikgYXJyYXkucHVzaChwc2V1ZG9hcnJheVtpXSk7CisgIHJldHVybiBhcnJheTsKK30KKworZnVuY3Rpb24gZDNfYXJyYXlTbGljZShwc2V1ZG9hcnJheSkgeworICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocHNldWRvYXJyYXkpOworfQorCit0cnkgeworICBkM19hcnJheShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcylbMF0ubm9kZVR5cGU7Cit9IGNhdGNoKGUpIHsKKyAgZDNfYXJyYXkgPSBkM19hcnJheUNvcHk7Cit9CisKK3ZhciBkM19hcnJheVN1YmNsYXNzID0gW10uX19wcm90b19fPworCisvLyBVbnRpbCBFQ01BU2NyaXB0IHN1cHBvcnRzIGFycmF5IHN1YmNsYXNzaW5nLCBwcm90b3R5cGUgaW5qZWN0aW9uIHdvcmtzIHdlbGwuCitmdW5jdGlvbihhcnJheSwgcHJvdG90eXBlKSB7CisgIGFycmF5Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKK306CisKKy8vIEFuZCBpZiB5b3VyIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IF9fcHJvdG9fXywgd2UnbGwgdXNlIGRpcmVjdCBleHRlbnNpb24uCitmdW5jdGlvbihhcnJheSwgcHJvdG90eXBlKSB7CisgIGZvciAodmFyIHByb3BlcnR5IGluIHByb3RvdHlwZSkgYXJyYXlbcHJvcGVydHldID0gcHJvdG90eXBlW3Byb3BlcnR5XTsKK307CitkMy5tYXAgPSBmdW5jdGlvbihvYmplY3QpIHsKKyAgdmFyIG1hcCA9IG5ldyBkM19NYXA7CisgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIG1hcC5zZXQoa2V5LCBvYmplY3Rba2V5XSk7CisgIHJldHVybiBtYXA7Cit9OworCitmdW5jdGlvbiBkM19NYXAoKSB7fQorCitkM19jbGFzcyhkM19NYXAsIHsKKyAgaGFzOiBmdW5jdGlvbihrZXkpIHsKKyAgICByZXR1cm4gZDNfbWFwX3ByZWZpeCArIGtleSBpbiB0aGlzOworICB9LAorICBnZXQ6IGZ1bmN0aW9uKGtleSkgeworICAgIHJldHVybiB0aGlzW2QzX21hcF9wcmVmaXggKyBrZXldOworICB9LAorICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICByZXR1cm4gdGhpc1tkM19tYXBfcHJlZml4ICsga2V5XSA9IHZhbHVlOworICB9LAorICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgeworICAgIGtleSA9IGQzX21hcF9wcmVmaXggKyBrZXk7CisgICAgcmV0dXJuIGtleSBpbiB0aGlzICYmIGRlbGV0ZSB0aGlzW2tleV07CisgIH0sCisgIGtleXM6IGZ1bmN0aW9uKCkgeworICAgIHZhciBrZXlzID0gW107CisgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgeyBrZXlzLnB1c2goa2V5KTsgfSk7CisgICAgcmV0dXJuIGtleXM7CisgIH0sCisgIHZhbHVlczogZnVuY3Rpb24oKSB7CisgICAgdmFyIHZhbHVlcyA9IFtdOworICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7IHZhbHVlcy5wdXNoKHZhbHVlKTsgfSk7CisgICAgcmV0dXJuIHZhbHVlczsKKyAgfSwKKyAgZW50cmllczogZnVuY3Rpb24oKSB7CisgICAgdmFyIGVudHJpZXMgPSBbXTsKKyAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeyBlbnRyaWVzLnB1c2goe2tleToga2V5LCB2YWx1ZTogdmFsdWV9KTsgfSk7CisgICAgcmV0dXJuIGVudHJpZXM7CisgIH0sCisgIGZvckVhY2g6IGZ1bmN0aW9uKGYpIHsKKyAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykgeworICAgICAgaWYgKGtleS5jaGFyQ29kZUF0KDApID09PSBkM19tYXBfcHJlZml4Q29kZSkgeworICAgICAgICBmLmNhbGwodGhpcywga2V5LnN1YnN0cmluZygxKSwgdGhpc1trZXldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30pOworCit2YXIgZDNfbWFwX3ByZWZpeCA9ICJcMCIsIC8vIHByZXZlbnQgY29sbGlzaW9uIHdpdGggYnVpbHQtaW5zCisgICAgZDNfbWFwX3ByZWZpeENvZGUgPSBkM19tYXBfcHJlZml4LmNoYXJDb2RlQXQoMCk7CitmdW5jdGlvbiBkM190aGlzKCkgeworICByZXR1cm4gdGhpczsKK30KK2QzLmZ1bmN0b3IgPSBmdW5jdGlvbih2KSB7CisgIHJldHVybiB0eXBlb2YgdiA9PT0gImZ1bmN0aW9uIiA/IHYgOiBmdW5jdGlvbigpIHsgcmV0dXJuIHY7IH07Cit9OworLy8gQ29waWVzIGEgdmFyaWFibGUgbnVtYmVyIG9mIG1ldGhvZHMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0LgorZDMucmViaW5kID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsKKyAgdmFyIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgbWV0aG9kOworICB3aGlsZSAoKytpIDwgbikgdGFyZ2V0W21ldGhvZCA9IGFyZ3VtZW50c1tpXV0gPSBkM19yZWJpbmQodGFyZ2V0LCBzb3VyY2UsIHNvdXJjZVttZXRob2RdKTsKKyAgcmV0dXJuIHRhcmdldDsKK307CisKKy8vIE1ldGhvZCBpcyBhc3N1bWVkIHRvIGJlIGEgc3RhbmRhcmQgRDMgZ2V0dGVyLXNldHRlcjoKKy8vIElmIHBhc3NlZCB3aXRoIG5vIGFyZ3VtZW50cywgZ2V0cyB0aGUgdmFsdWUuCisvLyBJZiBwYXNzZWQgd2l0aCBhcmd1bWVudHMsIHNldHMgdGhlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSB0YXJnZXQuCitmdW5jdGlvbiBkM19yZWJpbmQodGFyZ2V0LCBzb3VyY2UsIG1ldGhvZCkgeworICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgdmFyIHZhbHVlID0gbWV0aG9kLmFwcGx5KHNvdXJjZSwgYXJndW1lbnRzKTsKKyAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRhcmdldCA6IHZhbHVlOworICB9OworfQorZDMuYXNjZW5kaW5nID0gZnVuY3Rpb24oYSwgYikgeworICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47Cit9OworZDMuZGVzY2VuZGluZyA9IGZ1bmN0aW9uKGEsIGIpIHsKKyAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOOworfTsKK2QzLm1lYW4gPSBmdW5jdGlvbihhcnJheSwgZikgeworICB2YXIgbiA9IGFycmF5Lmxlbmd0aCwKKyAgICAgIGEsCisgICAgICBtID0gMCwKKyAgICAgIGkgPSAtMSwKKyAgICAgIGogPSAwOworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgeworICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoZDNfbnVtYmVyKGEgPSBhcnJheVtpXSkpIG0gKz0gKGEgLSBtKSAvICsrajsKKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAoKytpIDwgbikgaWYgKGQzX251bWJlcihhID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpKSBtICs9IChhIC0gbSkgLyArK2o7CisgIH0KKyAgcmV0dXJuIGogPyBtIDogdW5kZWZpbmVkOworfTsKK2QzLm1lZGlhbiA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CisgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgYXJyYXkgPSBhcnJheS5tYXAoZik7CisgIGFycmF5ID0gYXJyYXkuZmlsdGVyKGQzX251bWJlcik7CisgIHJldHVybiBhcnJheS5sZW5ndGggPyBkMy5xdWFudGlsZShhcnJheS5zb3J0KGQzLmFzY2VuZGluZyksIC41KSA6IHVuZGVmaW5lZDsKK307CitkMy5taW4gPSBmdW5jdGlvbihhcnJheSwgZikgeworICB2YXIgaSA9IC0xLAorICAgICAgbiA9IGFycmF5Lmxlbmd0aCwKKyAgICAgIGEsCisgICAgICBiOworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgeworICAgIHdoaWxlICgrK2kgPCBuICYmICgoYSA9IGFycmF5W2ldKSA9PSBudWxsIHx8IGEgIT0gYSkpIGEgPSB1bmRlZmluZWQ7CisgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGEgPiBiKSBhID0gYjsKKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAoKytpIDwgbiAmJiAoKGEgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gdW5kZWZpbmVkOworICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgIT0gbnVsbCAmJiBhID4gYikgYSA9IGI7CisgIH0KKyAgcmV0dXJuIGE7Cit9OworZDMubWF4ID0gZnVuY3Rpb24oYXJyYXksIGYpIHsKKyAgdmFyIGkgPSAtMSwKKyAgICAgIG4gPSBhcnJheS5sZW5ndGgsCisgICAgICBhLAorICAgICAgYjsKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKKyAgICB3aGlsZSAoKytpIDwgbiAmJiAoKGEgPSBhcnJheVtpXSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gdW5kZWZpbmVkOworICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID4gYSkgYSA9IGI7CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKCsraSA8IG4gJiYgKChhID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpID09IG51bGwgfHwgYSAhPSBhKSkgYSA9IHVuZGVmaW5lZDsKKyAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwgJiYgYiA+IGEpIGEgPSBiOworICB9CisgIHJldHVybiBhOworfTsKK2QzLmV4dGVudCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CisgIHZhciBpID0gLTEsCisgICAgICBuID0gYXJyYXkubGVuZ3RoLAorICAgICAgYSwKKyAgICAgIGIsCisgICAgICBjOworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgeworICAgIHdoaWxlICgrK2kgPCBuICYmICgoYSA9IGMgPSBhcnJheVtpXSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gYyA9IHVuZGVmaW5lZDsKKyAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwpIHsKKyAgICAgIGlmIChhID4gYikgYSA9IGI7CisgICAgICBpZiAoYyA8IGIpIGMgPSBiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAoKytpIDwgbiAmJiAoKGEgPSBjID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpID09IG51bGwgfHwgYSAhPSBhKSkgYSA9IHVuZGVmaW5lZDsKKyAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwpIHsKKyAgICAgIGlmIChhID4gYikgYSA9IGI7CisgICAgICBpZiAoYyA8IGIpIGMgPSBiOworICAgIH0KKyAgfQorICByZXR1cm4gW2EsIGNdOworfTsKK2QzLnJhbmRvbSA9IHsKKyAgbm9ybWFsOiBmdW5jdGlvbihtZWFuLCBkZXZpYXRpb24pIHsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIGRldmlhdGlvbiA9IDE7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSBtZWFuID0gMDsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICB2YXIgeCwgeSwgcjsKKyAgICAgIGRvIHsKKyAgICAgICAgeCA9IE1hdGgucmFuZG9tKCkgKiAyIC0gMTsKKyAgICAgICAgeSA9IE1hdGgucmFuZG9tKCkgKiAyIC0gMTsKKyAgICAgICAgciA9IHggKiB4ICsgeSAqIHk7CisgICAgICB9IHdoaWxlICghciB8fCByID4gMSk7CisgICAgICByZXR1cm4gbWVhbiArIGRldmlhdGlvbiAqIHggKiBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpOworICAgIH07CisgIH0KK307CitmdW5jdGlvbiBkM19udW1iZXIoeCkgeworICByZXR1cm4geCAhPSBudWxsICYmICFpc05hTih4KTsKK30KK2QzLnN1bSA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CisgIHZhciBzID0gMCwKKyAgICAgIG4gPSBhcnJheS5sZW5ndGgsCisgICAgICBhLAorICAgICAgaSA9IC0xOworCisgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CisgICAgd2hpbGUgKCsraSA8IG4pIGlmICghaXNOYU4oYSA9ICthcnJheVtpXSkpIHMgKz0gYTsKKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpc05hTihhID0gK2YuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSkgcyArPSBhOworICB9CisKKyAgcmV0dXJuIHM7Cit9OworLy8gUi03IHBlciA8aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9RdWFudGlsZT4KK2QzLnF1YW50aWxlID0gZnVuY3Rpb24odmFsdWVzLCBwKSB7CisgIHZhciBIID0gKHZhbHVlcy5sZW5ndGggLSAxKSAqIHAgKyAxLAorICAgICAgaCA9IE1hdGguZmxvb3IoSCksCisgICAgICB2ID0gdmFsdWVzW2ggLSAxXSwKKyAgICAgIGUgPSBIIC0gaDsKKyAgcmV0dXJuIGUgPyB2ICsgZSAqICh2YWx1ZXNbaF0gLSB2KSA6IHY7Cit9OworZDMudHJhbnNwb3NlID0gZnVuY3Rpb24obWF0cml4KSB7CisgIHJldHVybiBkMy56aXAuYXBwbHkoZDMsIG1hdHJpeCk7Cit9OworZDMuemlwID0gZnVuY3Rpb24oKSB7CisgIGlmICghKG4gPSBhcmd1bWVudHMubGVuZ3RoKSkgcmV0dXJuIFtdOworICBmb3IgKHZhciBpID0gLTEsIG0gPSBkMy5taW4oYXJndW1lbnRzLCBkM196aXBMZW5ndGgpLCB6aXBzID0gbmV3IEFycmF5KG0pOyArK2kgPCBtOykgeworICAgIGZvciAodmFyIGogPSAtMSwgbiwgemlwID0gemlwc1tpXSA9IG5ldyBBcnJheShuKTsgKytqIDwgbjspIHsKKyAgICAgIHppcFtqXSA9IGFyZ3VtZW50c1tqXVtpXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHppcHM7Cit9OworCitmdW5jdGlvbiBkM196aXBMZW5ndGgoZCkgeworICByZXR1cm4gZC5sZW5ndGg7Cit9CitkMy5iaXNlY3RvciA9IGZ1bmN0aW9uKGYpIHsKKyAgcmV0dXJuIHsKKyAgICBsZWZ0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsKKyAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgbG8gPSAwOworICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSBoaSA9IGEubGVuZ3RoOworICAgICAgd2hpbGUgKGxvIDwgaGkpIHsKKyAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4gMTsKKyAgICAgICAgaWYgKGYuY2FsbChhLCBhW21pZF0sIG1pZCkgPCB4KSBsbyA9IG1pZCArIDE7CisgICAgICAgIGVsc2UgaGkgPSBtaWQ7CisgICAgICB9CisgICAgICByZXR1cm4gbG87CisgICAgfSwKKyAgICByaWdodDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7CisgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGxvID0gMDsKKyAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNCkgaGkgPSBhLmxlbmd0aDsKKyAgICAgIHdoaWxlIChsbyA8IGhpKSB7CisgICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+IDE7CisgICAgICAgIGlmICh4IDwgZi5jYWxsKGEsIGFbbWlkXSwgbWlkKSkgaGkgPSBtaWQ7CisgICAgICAgIGVsc2UgbG8gPSBtaWQgKyAxOworICAgICAgfQorICAgICAgcmV0dXJuIGxvOworICAgIH0KKyAgfTsKK307CisKK3ZhciBkM19iaXNlY3RvciA9IGQzLmJpc2VjdG9yKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQ7IH0pOworZDMuYmlzZWN0TGVmdCA9IGQzX2Jpc2VjdG9yLmxlZnQ7CitkMy5iaXNlY3QgPSBkMy5iaXNlY3RSaWdodCA9IGQzX2Jpc2VjdG9yLnJpZ2h0OworZDMuZmlyc3QgPSBmdW5jdGlvbihhcnJheSwgZikgeworICB2YXIgaSA9IDAsCisgICAgICBuID0gYXJyYXkubGVuZ3RoLAorICAgICAgYSA9IGFycmF5WzBdLAorICAgICAgYjsKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIGYgPSBkMy5hc2NlbmRpbmc7CisgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgaWYgKGYuY2FsbChhcnJheSwgYSwgYiA9IGFycmF5W2ldKSA+IDApIHsKKyAgICAgIGEgPSBiOworICAgIH0KKyAgfQorICByZXR1cm4gYTsKK307CitkMy5sYXN0ID0gZnVuY3Rpb24oYXJyYXksIGYpIHsKKyAgdmFyIGkgPSAwLAorICAgICAgbiA9IGFycmF5Lmxlbmd0aCwKKyAgICAgIGEgPSBhcnJheVswXSwKKyAgICAgIGI7CisgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSBmID0gZDMuYXNjZW5kaW5nOworICB3aGlsZSAoKytpIDwgbikgeworICAgIGlmIChmLmNhbGwoYXJyYXksIGEsIGIgPSBhcnJheVtpXSkgPD0gMCkgeworICAgICAgYSA9IGI7CisgICAgfQorICB9CisgIHJldHVybiBhOworfTsKK2QzLm5lc3QgPSBmdW5jdGlvbigpIHsKKyAgdmFyIG5lc3QgPSB7fSwKKyAgICAgIGtleXMgPSBbXSwKKyAgICAgIHNvcnRLZXlzID0gW10sCisgICAgICBzb3J0VmFsdWVzLAorICAgICAgcm9sbHVwOworCisgIGZ1bmN0aW9uIG1hcChhcnJheSwgZGVwdGgpIHsKKyAgICBpZiAoZGVwdGggPj0ga2V5cy5sZW5ndGgpIHJldHVybiByb2xsdXAKKyAgICAgICAgPyByb2xsdXAuY2FsbChuZXN0LCBhcnJheSkgOiAoc29ydFZhbHVlcworICAgICAgICA/IGFycmF5LnNvcnQoc29ydFZhbHVlcykKKyAgICAgICAgOiBhcnJheSk7CisKKyAgICB2YXIgaSA9IC0xLAorICAgICAgICBuID0gYXJyYXkubGVuZ3RoLAorICAgICAgICBrZXkgPSBrZXlzW2RlcHRoKytdLAorICAgICAgICBrZXlWYWx1ZSwKKyAgICAgICAgb2JqZWN0LAorICAgICAgICB2YWx1ZXNCeUtleSA9IG5ldyBkM19NYXAsCisgICAgICAgIHZhbHVlcywKKyAgICAgICAgbyA9IHt9OworCisgICAgd2hpbGUgKCsraSA8IG4pIHsKKyAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXkob2JqZWN0ID0gYXJyYXlbaV0pKSkgeworICAgICAgICB2YWx1ZXMucHVzaChvYmplY3QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzQnlLZXkuc2V0KGtleVZhbHVlLCBbb2JqZWN0XSk7CisgICAgICB9CisgICAgfQorCisgICAgdmFsdWVzQnlLZXkuZm9yRWFjaChmdW5jdGlvbihrZXlWYWx1ZSkgeworICAgICAgb1trZXlWYWx1ZV0gPSBtYXAodmFsdWVzQnlLZXkuZ2V0KGtleVZhbHVlKSwgZGVwdGgpOworICAgIH0pOworCisgICAgcmV0dXJuIG87CisgIH0KKworICBmdW5jdGlvbiBlbnRyaWVzKG1hcCwgZGVwdGgpIHsKKyAgICBpZiAoZGVwdGggPj0ga2V5cy5sZW5ndGgpIHJldHVybiBtYXA7CisKKyAgICB2YXIgYSA9IFtdLAorICAgICAgICBzb3J0S2V5ID0gc29ydEtleXNbZGVwdGgrK10sCisgICAgICAgIGtleTsKKworICAgIGZvciAoa2V5IGluIG1hcCkgeworICAgICAgYS5wdXNoKHtrZXk6IGtleSwgdmFsdWVzOiBlbnRyaWVzKG1hcFtrZXldLCBkZXB0aCl9KTsKKyAgICB9CisKKyAgICBpZiAoc29ydEtleSkgYS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKKyAgICAgIHJldHVybiBzb3J0S2V5KGEua2V5LCBiLmtleSk7CisgICAgfSk7CisKKyAgICByZXR1cm4gYTsKKyAgfQorCisgIG5lc3QubWFwID0gZnVuY3Rpb24oYXJyYXkpIHsKKyAgICByZXR1cm4gbWFwKGFycmF5LCAwKTsKKyAgfTsKKworICBuZXN0LmVudHJpZXMgPSBmdW5jdGlvbihhcnJheSkgeworICAgIHJldHVybiBlbnRyaWVzKG1hcChhcnJheSwgMCksIDApOworICB9OworCisgIG5lc3Qua2V5ID0gZnVuY3Rpb24oZCkgeworICAgIGtleXMucHVzaChkKTsKKyAgICByZXR1cm4gbmVzdDsKKyAgfTsKKworICAvLyBTcGVjaWZpZXMgdGhlIG9yZGVyIGZvciB0aGUgbW9zdC1yZWNlbnRseSBzcGVjaWZpZWQga2V5LgorICAvLyBOb3RlOiBvbmx5IGFwcGxpZXMgdG8gZW50cmllcy4gTWFwIGtleXMgYXJlIHVub3JkZXJlZCEKKyAgbmVzdC5zb3J0S2V5cyA9IGZ1bmN0aW9uKG9yZGVyKSB7CisgICAgc29ydEtleXNba2V5cy5sZW5ndGggLSAxXSA9IG9yZGVyOworICAgIHJldHVybiBuZXN0OworICB9OworCisgIC8vIFNwZWNpZmllcyB0aGUgb3JkZXIgZm9yIGxlYWYgdmFsdWVzLgorICAvLyBBcHBsaWVzIHRvIGJvdGggbWFwcyBhbmQgZW50cmllcyBhcnJheS4KKyAgbmVzdC5zb3J0VmFsdWVzID0gZnVuY3Rpb24ob3JkZXIpIHsKKyAgICBzb3J0VmFsdWVzID0gb3JkZXI7CisgICAgcmV0dXJuIG5lc3Q7CisgIH07CisKKyAgbmVzdC5yb2xsdXAgPSBmdW5jdGlvbihmKSB7CisgICAgcm9sbHVwID0gZjsKKyAgICByZXR1cm4gbmVzdDsKKyAgfTsKKworICByZXR1cm4gbmVzdDsKK307CitkMy5rZXlzID0gZnVuY3Rpb24obWFwKSB7CisgIHZhciBrZXlzID0gW107CisgIGZvciAodmFyIGtleSBpbiBtYXApIGtleXMucHVzaChrZXkpOworICByZXR1cm4ga2V5czsKK307CitkMy52YWx1ZXMgPSBmdW5jdGlvbihtYXApIHsKKyAgdmFyIHZhbHVlcyA9IFtdOworICBmb3IgKHZhciBrZXkgaW4gbWFwKSB2YWx1ZXMucHVzaChtYXBba2V5XSk7CisgIHJldHVybiB2YWx1ZXM7Cit9OworZDMuZW50cmllcyA9IGZ1bmN0aW9uKG1hcCkgeworICB2YXIgZW50cmllcyA9IFtdOworICBmb3IgKHZhciBrZXkgaW4gbWFwKSBlbnRyaWVzLnB1c2goe2tleToga2V5LCB2YWx1ZTogbWFwW2tleV19KTsKKyAgcmV0dXJuIGVudHJpZXM7Cit9OworZDMucGVybXV0ZSA9IGZ1bmN0aW9uKGFycmF5LCBpbmRleGVzKSB7CisgIHZhciBwZXJtdXRlcyA9IFtdLAorICAgICAgaSA9IC0xLAorICAgICAgbiA9IGluZGV4ZXMubGVuZ3RoOworICB3aGlsZSAoKytpIDwgbikgcGVybXV0ZXNbaV0gPSBhcnJheVtpbmRleGVzW2ldXTsKKyAgcmV0dXJuIHBlcm11dGVzOworfTsKK2QzLm1lcmdlID0gZnVuY3Rpb24oYXJyYXlzKSB7CisgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcnJheXMpOworfTsKK2QzLnNwbGl0ID0gZnVuY3Rpb24oYXJyYXksIGYpIHsKKyAgdmFyIGFycmF5cyA9IFtdLAorICAgICAgdmFsdWVzID0gW10sCisgICAgICB2YWx1ZSwKKyAgICAgIGkgPSAtMSwKKyAgICAgIG4gPSBhcnJheS5sZW5ndGg7CisgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgZiA9IGQzX3NwbGl0dGVyOworICB3aGlsZSAoKytpIDwgbikgeworICAgIGlmIChmLmNhbGwodmFsdWVzLCB2YWx1ZSA9IGFycmF5W2ldLCBpKSkgeworICAgICAgdmFsdWVzID0gW107CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghdmFsdWVzLmxlbmd0aCkgYXJyYXlzLnB1c2godmFsdWVzKTsKKyAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGFycmF5czsKK307CisKK2Z1bmN0aW9uIGQzX3NwbGl0dGVyKGQpIHsKKyAgcmV0dXJuIGQgPT0gbnVsbDsKK30KK2Z1bmN0aW9uIGQzX2NvbGxhcHNlKHMpIHsKKyAgcmV0dXJuIHMucmVwbGFjZSgvKF5ccyspfChccyskKS9nLCAiIikucmVwbGFjZSgvXHMrL2csICIgIik7Cit9CitkMy5yYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7CisgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgeworICAgIHN0ZXAgPSAxOworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgeworICAgICAgc3RvcCA9IHN0YXJ0OworICAgICAgc3RhcnQgPSAwOworICAgIH0KKyAgfQorICBpZiAoKHN0b3AgLSBzdGFydCkgLyBzdGVwID09PSBJbmZpbml0eSkgdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpOworICB2YXIgcmFuZ2UgPSBbXSwKKyAgICAgICBrID0gZDNfcmFuZ2VfaW50ZWdlclNjYWxlKE1hdGguYWJzKHN0ZXApKSwKKyAgICAgICBpID0gLTEsCisgICAgICAgajsKKyAgc3RhcnQgKj0gaywgc3RvcCAqPSBrLCBzdGVwICo9IGs7CisgIGlmIChzdGVwIDwgMCkgd2hpbGUgKChqID0gc3RhcnQgKyBzdGVwICogKytpKSA+IHN0b3ApIHJhbmdlLnB1c2goaiAvIGspOworICBlbHNlIHdoaWxlICgoaiA9IHN0YXJ0ICsgc3RlcCAqICsraSkgPCBzdG9wKSByYW5nZS5wdXNoKGogLyBrKTsKKyAgcmV0dXJuIHJhbmdlOworfTsKKworZnVuY3Rpb24gZDNfcmFuZ2VfaW50ZWdlclNjYWxlKHgpIHsKKyAgdmFyIGsgPSAxOworICB3aGlsZSAoeCAqIGsgJSAxKSBrICo9IDEwOworICByZXR1cm4gazsKK30KK2QzLnJlcXVvdGUgPSBmdW5jdGlvbihzKSB7CisgIHJldHVybiBzLnJlcGxhY2UoZDNfcmVxdW90ZV9yZSwgIlxcJCYiKTsKK307CisKK3ZhciBkM19yZXF1b3RlX3JlID0gL1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nOworZDMucm91bmQgPSBmdW5jdGlvbih4LCBuKSB7CisgIHJldHVybiBuCisgICAgICA/IE1hdGgucm91bmQoeCAqIChuID0gTWF0aC5wb3coMTAsIG4pKSkgLyBuCisgICAgICA6IE1hdGgucm91bmQoeCk7Cit9OworZDMueGhyID0gZnVuY3Rpb24odXJsLCBtaW1lLCBjYWxsYmFjaykgeworICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0OworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGNhbGxiYWNrID0gbWltZSwgbWltZSA9IG51bGw7CisgIGVsc2UgaWYgKG1pbWUgJiYgcmVxLm92ZXJyaWRlTWltZVR5cGUpIHJlcS5vdmVycmlkZU1pbWVUeXBlKG1pbWUpOworICByZXEub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsKKyAgaWYgKG1pbWUpIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLCBtaW1lKTsKKyAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgeworICAgIGlmIChyZXEucmVhZHlTdGF0ZSA9PT0gNCkgY2FsbGJhY2socmVxLnN0YXR1cyA8IDMwMCA/IHJlcSA6IG51bGwpOworICB9OworICByZXEuc2VuZChudWxsKTsKK307CitkMy50ZXh0ID0gZnVuY3Rpb24odXJsLCBtaW1lLCBjYWxsYmFjaykgeworICBmdW5jdGlvbiByZWFkeShyZXEpIHsKKyAgICBjYWxsYmFjayhyZXEgJiYgcmVxLnJlc3BvbnNlVGV4dCk7CisgIH0KKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7CisgICAgY2FsbGJhY2sgPSBtaW1lOworICAgIG1pbWUgPSBudWxsOworICB9CisgIGQzLnhocih1cmwsIG1pbWUsIHJlYWR5KTsKK307CitkMy5qc29uID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgeworICBkMy50ZXh0KHVybCwgImFwcGxpY2F0aW9uL2pzb24iLCBmdW5jdGlvbih0ZXh0KSB7CisgICAgY2FsbGJhY2sodGV4dCA/IEpTT04ucGFyc2UodGV4dCkgOiBudWxsKTsKKyAgfSk7Cit9OworZDMuaHRtbCA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHsKKyAgZDMudGV4dCh1cmwsICJ0ZXh0L2h0bWwiLCBmdW5jdGlvbih0ZXh0KSB7CisgICAgaWYgKHRleHQgIT0gbnVsbCkgeyAvLyBUcmVhdCBlbXB0eSBzdHJpbmcgYXMgdmFsaWQgSFRNTC4KKyAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CisgICAgICByYW5nZS5zZWxlY3ROb2RlKGRvY3VtZW50LmJvZHkpOworICAgICAgdGV4dCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0ZXh0KTsKKyAgICB9CisgICAgY2FsbGJhY2sodGV4dCk7CisgIH0pOworfTsKK2QzLnhtbCA9IGZ1bmN0aW9uKHVybCwgbWltZSwgY2FsbGJhY2spIHsKKyAgZnVuY3Rpb24gcmVhZHkocmVxKSB7CisgICAgY2FsbGJhY2socmVxICYmIHJlcS5yZXNwb25zZVhNTCk7CisgIH0KKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7CisgICAgY2FsbGJhY2sgPSBtaW1lOworICAgIG1pbWUgPSBudWxsOworICB9CisgIGQzLnhocih1cmwsIG1pbWUsIHJlYWR5KTsKK307Cit2YXIgZDNfbnNQcmVmaXggPSB7CisgIHN2ZzogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwKKyAgeGh0bWw6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwKKyAgeGxpbms6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwKKyAgeG1sOiAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwKKyAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIKK307CisKK2QzLm5zID0geworICBwcmVmaXg6IGQzX25zUHJlZml4LAorICBxdWFsaWZ5OiBmdW5jdGlvbihuYW1lKSB7CisgICAgdmFyIGkgPSBuYW1lLmluZGV4T2YoIjoiKSwKKyAgICAgICAgcHJlZml4ID0gbmFtZTsKKyAgICBpZiAoaSA+PSAwKSB7CisgICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpKTsKKyAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpICsgMSk7CisgICAgfQorICAgIHJldHVybiBkM19uc1ByZWZpeC5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpCisgICAgICAgID8ge3NwYWNlOiBkM19uc1ByZWZpeFtwcmVmaXhdLCBsb2NhbDogbmFtZX0KKyAgICAgICAgOiBuYW1lOworICB9Cit9OworZDMuZGlzcGF0Y2ggPSBmdW5jdGlvbigpIHsKKyAgdmFyIGRpc3BhdGNoID0gbmV3IGQzX2Rpc3BhdGNoLAorICAgICAgaSA9IC0xLAorICAgICAgbiA9IGFyZ3VtZW50cy5sZW5ndGg7CisgIHdoaWxlICgrK2kgPCBuKSBkaXNwYXRjaFthcmd1bWVudHNbaV1dID0gZDNfZGlzcGF0Y2hfZXZlbnQoZGlzcGF0Y2gpOworICByZXR1cm4gZGlzcGF0Y2g7Cit9OworCitmdW5jdGlvbiBkM19kaXNwYXRjaCgpIHt9CisKK2QzX2Rpc3BhdGNoLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7CisgIHZhciBpID0gdHlwZS5pbmRleE9mKCIuIiksCisgICAgICBuYW1lID0gIiI7CisKKyAgLy8gRXh0cmFjdCBvcHRpb25hbCBuYW1lc3BhY2UsIGUuZy4sICJjbGljay5mb28iCisgIGlmIChpID4gMCkgeworICAgIG5hbWUgPSB0eXBlLnN1YnN0cmluZyhpICsgMSk7CisgICAgdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDAsIGkpOworICB9CisKKyAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyCisgICAgICA/IHRoaXNbdHlwZV0ub24obmFtZSkKKyAgICAgIDogdGhpc1t0eXBlXS5vbihuYW1lLCBsaXN0ZW5lcik7Cit9OworCitmdW5jdGlvbiBkM19kaXNwYXRjaF9ldmVudChkaXNwYXRjaCkgeworICB2YXIgbGlzdGVuZXJzID0gW10sCisgICAgICBsaXN0ZW5lckJ5TmFtZSA9IG5ldyBkM19NYXA7CisKKyAgZnVuY3Rpb24gZXZlbnQoKSB7CisgICAgdmFyIHogPSBsaXN0ZW5lcnMsIC8vIGRlZmVuc2l2ZSByZWZlcmVuY2UKKyAgICAgICAgaSA9IC0xLAorICAgICAgICBuID0gei5sZW5ndGgsCisgICAgICAgIGw7CisgICAgd2hpbGUgKCsraSA8IG4pIGlmIChsID0geltpXS5vbikgbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIHJldHVybiBkaXNwYXRjaDsKKyAgfQorCisgIGV2ZW50Lm9uID0gZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHsKKyAgICB2YXIgbCA9IGxpc3RlbmVyQnlOYW1lLmdldChuYW1lKSwKKyAgICAgICAgaTsKKworICAgIC8vIHJldHVybiB0aGUgY3VycmVudCBsaXN0ZW5lciwgaWYgYW55CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gbCAmJiBsLm9uOworCisgICAgLy8gcmVtb3ZlIHRoZSBvbGQgbGlzdGVuZXIsIGlmIGFueSAod2l0aCBjb3B5LW9uLXdyaXRlKQorICAgIGlmIChsKSB7CisgICAgICBsLm9uID0gbnVsbDsKKyAgICAgIGxpc3RlbmVycyA9IGxpc3RlbmVycy5zbGljZSgwLCBpID0gbGlzdGVuZXJzLmluZGV4T2YobCkpLmNvbmNhdChsaXN0ZW5lcnMuc2xpY2UoaSArIDEpKTsKKyAgICAgIGxpc3RlbmVyQnlOYW1lLnJlbW92ZShuYW1lKTsKKyAgICB9CisKKyAgICAvLyBhZGQgdGhlIG5ldyBsaXN0ZW5lciwgaWYgYW55CisgICAgaWYgKGxpc3RlbmVyKSBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lckJ5TmFtZS5zZXQobmFtZSwge29uOiBsaXN0ZW5lcn0pKTsKKworICAgIHJldHVybiBkaXNwYXRjaDsKKyAgfTsKKworICByZXR1cm4gZXZlbnQ7Cit9CisvLyBUT0RPIGFsaWduCitkMy5mb3JtYXQgPSBmdW5jdGlvbihzcGVjaWZpZXIpIHsKKyAgdmFyIG1hdGNoID0gZDNfZm9ybWF0X3JlLmV4ZWMoc3BlY2lmaWVyKSwKKyAgICAgIGZpbGwgPSBtYXRjaFsxXSB8fCAiICIsCisgICAgICBzaWduID0gbWF0Y2hbM10gfHwgIiIsCisgICAgICB6ZmlsbCA9IG1hdGNoWzVdLAorICAgICAgd2lkdGggPSArbWF0Y2hbNl0sCisgICAgICBjb21tYSA9IG1hdGNoWzddLAorICAgICAgcHJlY2lzaW9uID0gbWF0Y2hbOF0sCisgICAgICB0eXBlID0gbWF0Y2hbOV0sCisgICAgICBzY2FsZSA9IDEsCisgICAgICBzdWZmaXggPSAiIiwKKyAgICAgIGludGVnZXIgPSBmYWxzZTsKKworICBpZiAocHJlY2lzaW9uKSBwcmVjaXNpb24gPSArcHJlY2lzaW9uLnN1YnN0cmluZygxKTsKKworICBpZiAoemZpbGwpIHsKKyAgICBmaWxsID0gIjAiOyAvLyBUT0RPIGFsaWduID0gIj0iOworICAgIGlmIChjb21tYSkgd2lkdGggLT0gTWF0aC5mbG9vcigod2lkdGggLSAxKSAvIDQpOworICB9CisKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSAibiI6IGNvbW1hID0gdHJ1ZTsgdHlwZSA9ICJnIjsgYnJlYWs7CisgICAgY2FzZSAiJSI6IHNjYWxlID0gMTAwOyBzdWZmaXggPSAiJSI7IHR5cGUgPSAiZiI7IGJyZWFrOworICAgIGNhc2UgInAiOiBzY2FsZSA9IDEwMDsgc3VmZml4ID0gIiUiOyB0eXBlID0gInIiOyBicmVhazsKKyAgICBjYXNlICJkIjogaW50ZWdlciA9IHRydWU7IHByZWNpc2lvbiA9IDA7IGJyZWFrOworICAgIGNhc2UgInMiOiBzY2FsZSA9IC0xOyB0eXBlID0gInIiOyBicmVhazsKKyAgfQorCisgIC8vIElmIG5vIHByZWNpc2lvbiBpcyBzcGVjaWZpZWQgZm9yIHIsIGZhbGxiYWNrIHRvIGdlbmVyYWwgbm90YXRpb24uCisgIGlmICh0eXBlID09ICJyIiAmJiAhcHJlY2lzaW9uKSB0eXBlID0gImciOworCisgIHR5cGUgPSBkM19mb3JtYXRfdHlwZXMuZ2V0KHR5cGUpIHx8IGQzX2Zvcm1hdF90eXBlRGVmYXVsdDsKKworICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKKworICAgIC8vIFJldHVybiB0aGUgZW1wdHkgc3RyaW5nIGZvciBmbG9hdHMgZm9ybWF0dGVkIGFzIGludHMuCisgICAgaWYgKGludGVnZXIgJiYgKHZhbHVlICUgMSkpIHJldHVybiAiIjsKKworICAgIC8vIENvbnZlcnQgbmVnYXRpdmUgdG8gcG9zaXRpdmUsIGFuZCByZWNvcmQgdGhlIHNpZ24gcHJlZml4LgorICAgIHZhciBuZWdhdGl2ZSA9ICh2YWx1ZSA8IDApICYmICh2YWx1ZSA9IC12YWx1ZSkgPyAiXHUyMjEyIiA6IHNpZ247CisKKyAgICAvLyBBcHBseSB0aGUgc2NhbGUsIGNvbXB1dGluZyBpdCBmcm9tIHRoZSB2YWx1ZSdzIGV4cG9uZW50IGZvciBzaSBmb3JtYXQuCisgICAgaWYgKHNjYWxlIDwgMCkgeworICAgICAgdmFyIHByZWZpeCA9IGQzLmZvcm1hdFByZWZpeCh2YWx1ZSwgcHJlY2lzaW9uKTsKKyAgICAgIHZhbHVlICo9IHByZWZpeC5zY2FsZTsKKyAgICAgIHN1ZmZpeCA9IHByZWZpeC5zeW1ib2w7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhbHVlICo9IHNjYWxlOworICAgIH0KKworICAgIC8vIENvbnZlcnQgdG8gdGhlIGRlc2lyZWQgcHJlY2lzaW9uLgorICAgIHZhbHVlID0gdHlwZSh2YWx1ZSwgcHJlY2lzaW9uKTsKKworICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyAwLCB0aGUgc2lnbiBhbmQgZ3JvdXAgaXMgYXBwbGllZCBhZnRlciB0aGUgZmlsbC4KKyAgICBpZiAoemZpbGwpIHsKKyAgICAgIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGggKyBuZWdhdGl2ZS5sZW5ndGg7CisgICAgICBpZiAobGVuZ3RoIDwgd2lkdGgpIHZhbHVlID0gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSArIHZhbHVlOworICAgICAgaWYgKGNvbW1hKSB2YWx1ZSA9IGQzX2Zvcm1hdF9ncm91cCh2YWx1ZSk7CisgICAgICB2YWx1ZSA9IG5lZ2F0aXZlICsgdmFsdWU7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlIChlLmcuLCBzcGFjZS1maWxsaW5nKSwgdGhlIHNpZ24gYW5kIGdyb3VwIGlzIGFwcGxpZWQgYmVmb3JlLgorICAgIGVsc2UgeworICAgICAgaWYgKGNvbW1hKSB2YWx1ZSA9IGQzX2Zvcm1hdF9ncm91cCh2YWx1ZSk7CisgICAgICB2YWx1ZSA9IG5lZ2F0aXZlICsgdmFsdWU7CisgICAgICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoOworICAgICAgaWYgKGxlbmd0aCA8IHdpZHRoKSB2YWx1ZSA9IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgKyB2YWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWUgKyBzdWZmaXg7CisgIH07Cit9OworCisvLyBbW2ZpbGxdYWxpZ25dW3NpZ25dWyNdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt0eXBlXQordmFyIGQzX2Zvcm1hdF9yZSA9IC8oPzooW157XSk/KFs8Pj1eXSkpPyhbK1wtIF0pPygjKT8oMCk/KFswLTldKyk/KCwpPyhcLlswLTldKyk/KFthLXpBLVolXSk/LzsKKwordmFyIGQzX2Zvcm1hdF90eXBlcyA9IGQzLm1hcCh7CisgIGc6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9QcmVjaXNpb24ocCk7IH0sCisgIGU6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9FeHBvbmVudGlhbChwKTsgfSwKKyAgZjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0ZpeGVkKHApOyB9LAorICByOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiBkMy5yb3VuZCh4LCBwID0gZDNfZm9ybWF0X3ByZWNpc2lvbih4LCBwKSkudG9GaXhlZChNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcCkpKTsgfQorfSk7CisKK2Z1bmN0aW9uIGQzX2Zvcm1hdF9wcmVjaXNpb24oeCwgcCkgeworICByZXR1cm4gcCAtICh4ID8gMSArIE1hdGguZmxvb3IoTWF0aC5sb2coeCArIE1hdGgucG93KDEwLCAxICsgTWF0aC5mbG9vcihNYXRoLmxvZyh4KSAvIE1hdGguTE4xMCkgLSBwKSkgLyBNYXRoLkxOMTApIDogMSk7Cit9CisKK2Z1bmN0aW9uIGQzX2Zvcm1hdF90eXBlRGVmYXVsdCh4KSB7CisgIHJldHVybiB4ICsgIiI7Cit9CisKKy8vIEFwcGx5IGNvbW1hIGdyb3VwaW5nIGZvciB0aG91c2FuZHMuCitmdW5jdGlvbiBkM19mb3JtYXRfZ3JvdXAodmFsdWUpIHsKKyAgdmFyIGkgPSB2YWx1ZS5sYXN0SW5kZXhPZigiLiIpLAorICAgICAgZiA9IGkgPj0gMCA/IHZhbHVlLnN1YnN0cmluZyhpKSA6IChpID0gdmFsdWUubGVuZ3RoLCAiIiksCisgICAgICB0ID0gW107CisgIHdoaWxlIChpID4gMCkgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IDMsIGkgKyAzKSk7CisgIHJldHVybiB0LnJldmVyc2UoKS5qb2luKCIsIikgKyBmOworfQordmFyIGQzX2Zvcm1hdFByZWZpeGVzID0gWyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLOvCIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdLm1hcChkM19mb3JtYXRQcmVmaXgpOworCitkMy5mb3JtYXRQcmVmaXggPSBmdW5jdGlvbih2YWx1ZSwgcHJlY2lzaW9uKSB7CisgIHZhciBpID0gMDsKKyAgaWYgKHZhbHVlKSB7CisgICAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgKj0gLTE7CisgICAgaWYgKHByZWNpc2lvbikgdmFsdWUgPSBkMy5yb3VuZCh2YWx1ZSwgZDNfZm9ybWF0X3ByZWNpc2lvbih2YWx1ZSwgcHJlY2lzaW9uKSk7CisgICAgaSA9IDEgKyBNYXRoLmZsb29yKDFlLTEyICsgTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjEwKTsKKyAgICBpID0gTWF0aC5tYXgoLTI0LCBNYXRoLm1pbigyNCwgTWF0aC5mbG9vcigoaSA8PSAwID8gaSArIDEgOiBpIC0gMSkgLyAzKSAqIDMpKTsKKyAgfQorICByZXR1cm4gZDNfZm9ybWF0UHJlZml4ZXNbOCArIGkgLyAzXTsKK307CisKK2Z1bmN0aW9uIGQzX2Zvcm1hdFByZWZpeChkLCBpKSB7CisgIHJldHVybiB7CisgICAgc2NhbGU6IE1hdGgucG93KDEwLCAoOCAtIGkpICogMyksCisgICAgc3ltYm9sOiBkCisgIH07Cit9CisKKy8qCisgKiBURVJNUyBPRiBVU0UgLSBFQVNJTkcgRVFVQVRJT05TCisgKgorICogT3BlbiBzb3VyY2UgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAyMDAxIFJvYmVydCBQZW5uZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0bworICogICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYworICogICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit2YXIgZDNfZWFzZV9xdWFkID0gZDNfZWFzZV9wb2x5KDIpLAorICAgIGQzX2Vhc2VfY3ViaWMgPSBkM19lYXNlX3BvbHkoMyksCisgICAgZDNfZWFzZV9kZWZhdWx0ID0gZnVuY3Rpb24oKSB7IHJldHVybiBkM19lYXNlX2lkZW50aXR5OyB9OworCit2YXIgZDNfZWFzZSA9IGQzLm1hcCh7CisgIGxpbmVhcjogZDNfZWFzZV9kZWZhdWx0LAorICBwb2x5OiBkM19lYXNlX3BvbHksCisgIHF1YWQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZDNfZWFzZV9xdWFkOyB9LAorICBjdWJpYzogZnVuY3Rpb24oKSB7IHJldHVybiBkM19lYXNlX2N1YmljOyB9LAorICBzaW46IGZ1bmN0aW9uKCkgeyByZXR1cm4gZDNfZWFzZV9zaW47IH0sCisgIGV4cDogZnVuY3Rpb24oKSB7IHJldHVybiBkM19lYXNlX2V4cDsgfSwKKyAgY2lyY2xlOiBmdW5jdGlvbigpIHsgcmV0dXJuIGQzX2Vhc2VfY2lyY2xlOyB9LAorICBlbGFzdGljOiBkM19lYXNlX2VsYXN0aWMsCisgIGJhY2s6IGQzX2Vhc2VfYmFjaywKKyAgYm91bmNlOiBmdW5jdGlvbigpIHsgcmV0dXJuIGQzX2Vhc2VfYm91bmNlOyB9Cit9KTsKKwordmFyIGQzX2Vhc2VfbW9kZSA9IGQzLm1hcCh7CisgICJpbiI6IGQzX2Vhc2VfaWRlbnRpdHksCisgICJvdXQiOiBkM19lYXNlX3JldmVyc2UsCisgICJpbi1vdXQiOiBkM19lYXNlX3JlZmxlY3QsCisgICJvdXQtaW4iOiBmdW5jdGlvbihmKSB7IHJldHVybiBkM19lYXNlX3JlZmxlY3QoZDNfZWFzZV9yZXZlcnNlKGYpKTsgfQorfSk7CisKK2QzLmVhc2UgPSBmdW5jdGlvbihuYW1lKSB7CisgIHZhciBpID0gbmFtZS5pbmRleE9mKCItIiksCisgICAgICB0ID0gaSA+PSAwID8gbmFtZS5zdWJzdHJpbmcoMCwgaSkgOiBuYW1lLAorICAgICAgbSA9IGkgPj0gMCA/IG5hbWUuc3Vic3RyaW5nKGkgKyAxKSA6ICJpbiI7CisgIHQgPSBkM19lYXNlLmdldCh0KSB8fCBkM19lYXNlX2RlZmF1bHQ7CisgIG0gPSBkM19lYXNlX21vZGUuZ2V0KG0pIHx8IGQzX2Vhc2VfaWRlbnRpdHk7CisgIHJldHVybiBkM19lYXNlX2NsYW1wKG0odC5hcHBseShudWxsLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSkpOworfTsKKworZnVuY3Rpb24gZDNfZWFzZV9jbGFtcChmKSB7CisgIHJldHVybiBmdW5jdGlvbih0KSB7CisgICAgcmV0dXJuIHQgPD0gMCA/IDAgOiB0ID49IDEgPyAxIDogZih0KTsKKyAgfTsKK30KKworZnVuY3Rpb24gZDNfZWFzZV9yZXZlcnNlKGYpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKKyAgICByZXR1cm4gMSAtIGYoMSAtIHQpOworICB9OworfQorCitmdW5jdGlvbiBkM19lYXNlX3JlZmxlY3QoZikgeworICByZXR1cm4gZnVuY3Rpb24odCkgeworICAgIHJldHVybiAuNSAqICh0IDwgLjUgPyBmKDIgKiB0KSA6ICgyIC0gZigyIC0gMiAqIHQpKSk7CisgIH07Cit9CisKK2Z1bmN0aW9uIGQzX2Vhc2VfaWRlbnRpdHkodCkgeworICByZXR1cm4gdDsKK30KKworZnVuY3Rpb24gZDNfZWFzZV9wb2x5KGUpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKKyAgICByZXR1cm4gTWF0aC5wb3codCwgZSk7CisgIH07Cit9CisKK2Z1bmN0aW9uIGQzX2Vhc2Vfc2luKHQpIHsKKyAgcmV0dXJuIDEgLSBNYXRoLmNvcyh0ICogTWF0aC5QSSAvIDIpOworfQorCitmdW5jdGlvbiBkM19lYXNlX2V4cCh0KSB7CisgIHJldHVybiBNYXRoLnBvdygyLCAxMCAqICh0IC0gMSkpOworfQorCitmdW5jdGlvbiBkM19lYXNlX2NpcmNsZSh0KSB7CisgIHJldHVybiAxIC0gTWF0aC5zcXJ0KDEgLSB0ICogdCk7Cit9CisKK2Z1bmN0aW9uIGQzX2Vhc2VfZWxhc3RpYyhhLCBwKSB7CisgIHZhciBzOworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHAgPSAwLjQ1OworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHsgYSA9IDE7IHMgPSBwIC8gNDsgfQorICBlbHNlIHMgPSBwIC8gKDIgKiBNYXRoLlBJKSAqIE1hdGguYXNpbigxIC8gYSk7CisgIHJldHVybiBmdW5jdGlvbih0KSB7CisgICAgcmV0dXJuIDEgKyBhICogTWF0aC5wb3coMiwgMTAgKiAtdCkgKiBNYXRoLnNpbigodCAtIHMpICogMiAqIE1hdGguUEkgLyBwKTsKKyAgfTsKK30KKworZnVuY3Rpb24gZDNfZWFzZV9iYWNrKHMpIHsKKyAgaWYgKCFzKSBzID0gMS43MDE1ODsKKyAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKKyAgICByZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTsKKyAgfTsKK30KKworZnVuY3Rpb24gZDNfZWFzZV9ib3VuY2UodCkgeworICByZXR1cm4gdCA8IDEgLyAyLjc1ID8gNy41NjI1ICogdCAqIHQKKyAgICAgIDogdCA8IDIgLyAyLjc1ID8gNy41NjI1ICogKHQgLT0gMS41IC8gMi43NSkgKiB0ICsgLjc1CisgICAgICA6IHQgPCAyLjUgLyAyLjc1ID8gNy41NjI1ICogKHQgLT0gMi4yNSAvIDIuNzUpICogdCArIC45Mzc1CisgICAgICA6IDcuNTYyNSAqICh0IC09IDIuNjI1IC8gMi43NSkgKiB0ICsgLjk4NDM3NTsKK30KK2QzLmV2ZW50ID0gbnVsbDsKKworZnVuY3Rpb24gZDNfZXZlbnRDYW5jZWwoKSB7CisgIGQzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOworfQorCitmdW5jdGlvbiBkM19ldmVudFNvdXJjZSgpIHsKKyAgdmFyIGUgPSBkMy5ldmVudCwgczsKKyAgd2hpbGUgKHMgPSBlLnNvdXJjZUV2ZW50KSBlID0gczsKKyAgcmV0dXJuIGU7Cit9CisKKy8vIExpa2UgZDMuZGlzcGF0Y2gsIGJ1dCBmb3IgY3VzdG9tIGV2ZW50cyBhYnN0cmFjdGluZyBuYXRpdmUgVUkgZXZlbnRzLiBUaGVzZQorLy8gZXZlbnRzIGhhdmUgYSB0YXJnZXQgY29tcG9uZW50IChzdWNoIGFzIGEgYnJ1c2gpLCBhIHRhcmdldCBlbGVtZW50IChzdWNoIGFzCisvLyB0aGUgc3ZnOmcgZWxlbWVudCBjb250YWluaW5nIHRoZSBicnVzaCkgYW5kIHRoZSBzdGFuZGFyZCBhcmd1bWVudHMgYGRgICh0aGUKKy8vIHRhcmdldCBlbGVtZW50J3MgZGF0YSkgYW5kIGBpYCAodGhlIHNlbGVjdGlvbiBpbmRleCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQpLgorZnVuY3Rpb24gZDNfZXZlbnREaXNwYXRjaCh0YXJnZXQpIHsKKyAgdmFyIGRpc3BhdGNoID0gbmV3IGQzX2Rpc3BhdGNoLAorICAgICAgaSA9IDAsCisgICAgICBuID0gYXJndW1lbnRzLmxlbmd0aDsKKworICB3aGlsZSAoKytpIDwgbikgZGlzcGF0Y2hbYXJndW1lbnRzW2ldXSA9IGQzX2Rpc3BhdGNoX2V2ZW50KGRpc3BhdGNoKTsKKworICAvLyBDcmVhdGVzIGEgZGlzcGF0Y2ggY29udGV4dCBmb3IgdGhlIHNwZWNpZmllZCBgdGhpemAgKHR5cGljYWxseSwgdGhlIHRhcmdldAorICAvLyBET00gZWxlbWVudCB0aGF0IHJlY2VpdmVkIHRoZSBzb3VyY2UgZXZlbnQpIGFuZCBgYXJndW1lbnR6YCAodHlwaWNhbGx5LCB0aGUKKyAgLy8gZGF0YSBgZGAgYW5kIGluZGV4IGBpYCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQpLiBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gY2FuIGJlCisgIC8vIHVzZWQgdG8gZGlzcGF0Y2ggYW4gZXZlbnQgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzOyB0aGUgZnVuY3Rpb24gdGFrZXMgYQorICAvLyBzaW5nbGUgYXJndW1lbnQgYXMgaW5wdXQsIGJlaW5nIHRoZSBldmVudCB0byBkaXNwYXRjaC4gVGhlIGV2ZW50IG11c3QgaGF2ZQorICAvLyBhICJ0eXBlIiBhdHRyaWJ1dGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSB0eXBlIHJlZ2lzdGVyZWQgaW4gdGhlCisgIC8vIGNvbnN0cnVjdG9yLiBUaGlzIGNvbnRleHQgd2lsbCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlIHRoZSAic291cmNlRXZlbnQiIGFuZAorICAvLyAidGFyZ2V0IiBhdHRyaWJ1dGVzIG9mIHRoZSBldmVudCwgYXMgd2VsbCBhcyBzZXR0aW5nIHRoZSBgZDMuZXZlbnRgIGdsb2JhbAorICAvLyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBub3RpZmljYXRpb24uCisgIGRpc3BhdGNoLm9mID0gZnVuY3Rpb24odGhpeiwgYXJndW1lbnR6KSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uKGUxKSB7CisgICAgICB0cnkgeworICAgICAgICB2YXIgZTAgPQorICAgICAgICBlMS5zb3VyY2VFdmVudCA9IGQzLmV2ZW50OworICAgICAgICBlMS50YXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIGQzLmV2ZW50ID0gZTE7CisgICAgICAgIGRpc3BhdGNoW2UxLnR5cGVdLmFwcGx5KHRoaXosIGFyZ3VtZW50eik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBkMy5ldmVudCA9IGUwOworICAgICAgfQorICAgIH07CisgIH07CisKKyAgcmV0dXJuIGRpc3BhdGNoOworfQorZDMuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihhLCBiKSB7CisgIHZhciBpID0gZDMuaW50ZXJwb2xhdG9ycy5sZW5ndGgsIGY7CisgIHdoaWxlICgtLWkgPj0gMCAmJiAhKGYgPSBkMy5pbnRlcnBvbGF0b3JzW2ldKGEsIGIpKSk7CisgIHJldHVybiBmOworfTsKKworZDMuaW50ZXJwb2xhdGVOdW1iZXIgPSBmdW5jdGlvbihhLCBiKSB7CisgIGIgLT0gYTsKKyAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsgcmV0dXJuIGEgKyBiICogdDsgfTsKK307CisKK2QzLmludGVycG9sYXRlUm91bmQgPSBmdW5jdGlvbihhLCBiKSB7CisgIGIgLT0gYTsKKyAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsgcmV0dXJuIE1hdGgucm91bmQoYSArIGIgKiB0KTsgfTsKK307CisKK2QzLmludGVycG9sYXRlU3RyaW5nID0gZnVuY3Rpb24oYSwgYikgeworICB2YXIgbSwgLy8gY3VycmVudCBtYXRjaAorICAgICAgaSwgLy8gY3VycmVudCBpbmRleAorICAgICAgaiwgLy8gY3VycmVudCBpbmRleCAoZm9yIGNvYWxsZXNjaW5nKQorICAgICAgczAgPSAwLCAvLyBzdGFydCBpbmRleCBvZiBjdXJyZW50IHN0cmluZyBwcmVmaXgKKyAgICAgIHMxID0gMCwgLy8gZW5kIGluZGV4IG9mIGN1cnJlbnQgc3RyaW5nIHByZWZpeAorICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnMKKyAgICAgIHEgPSBbXSwgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKKyAgICAgIG4sIC8vIHEubGVuZ3RoCisgICAgICBvOworCisgIC8vIFJlc2V0IG91ciByZWd1bGFyIGV4cHJlc3Npb24hCisgIGQzX2ludGVycG9sYXRlX251bWJlci5sYXN0SW5kZXggPSAwOworCisgIC8vIEZpbmQgYWxsIG51bWJlcnMgaW4gYi4KKyAgZm9yIChpID0gMDsgbSA9IGQzX2ludGVycG9sYXRlX251bWJlci5leGVjKGIpOyArK2kpIHsKKyAgICBpZiAobS5pbmRleCkgcy5wdXNoKGIuc3Vic3RyaW5nKHMwLCBzMSA9IG0uaW5kZXgpKTsKKyAgICBxLnB1c2goe2k6IHMubGVuZ3RoLCB4OiBtWzBdfSk7CisgICAgcy5wdXNoKG51bGwpOworICAgIHMwID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyLmxhc3RJbmRleDsKKyAgfQorICBpZiAoczAgPCBiLmxlbmd0aCkgcy5wdXNoKGIuc3Vic3RyaW5nKHMwKSk7CisKKyAgLy8gRmluZCBhbGwgbnVtYmVycyBpbiBhLgorICBmb3IgKGkgPSAwLCBuID0gcS5sZW5ndGg7IChtID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyLmV4ZWMoYSkpICYmIGkgPCBuOyArK2kpIHsKKyAgICBvID0gcVtpXTsKKyAgICBpZiAoby54ID09IG1bMF0pIHsgLy8gVGhlIG51bWJlcnMgbWF0Y2gsIHNvIGNvYWxsZXNjZS4KKyAgICAgIGlmIChvLmkpIHsKKyAgICAgICAgaWYgKHNbby5pICsgMV0gPT0gbnVsbCkgeyAvLyBUaGlzIG1hdGNoIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgbnVtYmVyLgorICAgICAgICAgIHNbby5pIC0gMV0gKz0gby54OworICAgICAgICAgIHMuc3BsaWNlKG8uaSwgMSk7CisgICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBuOyArK2opIHFbal0uaS0tOworICAgICAgICB9IGVsc2UgeyAvLyBUaGlzIG1hdGNoIGlzIGZvbGxvd2VkIGJ5IGEgc3RyaW5nLCBzbyBjb2FsbGVzY2UgdHdpY2UuCisgICAgICAgICAgc1tvLmkgLSAxXSArPSBvLnggKyBzW28uaSArIDFdOworICAgICAgICAgIHMuc3BsaWNlKG8uaSwgMik7CisgICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBuOyArK2opIHFbal0uaSAtPSAyOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChzW28uaSArIDFdID09IG51bGwpIHsgLy8gVGhpcyBtYXRjaCBpcyBmb2xsb3dlZCBieSBhbm90aGVyIG51bWJlci4KKyAgICAgICAgICBzW28uaV0gPSBvLng7CisgICAgICAgIH0gZWxzZSB7IC8vIFRoaXMgbWF0Y2ggaXMgZm9sbG93ZWQgYnkgYSBzdHJpbmcsIHNvIGNvYWxsZXNjZSB0d2ljZS4KKyAgICAgICAgICBzW28uaV0gPSBvLnggKyBzW28uaSArIDFdOworICAgICAgICAgIHMuc3BsaWNlKG8uaSArIDEsIDEpOworICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgbjsgKytqKSBxW2pdLmktLTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcS5zcGxpY2UoaSwgMSk7CisgICAgICBuLS07CisgICAgICBpLS07CisgICAgfSBlbHNlIHsKKyAgICAgIG8ueCA9IGQzLmludGVycG9sYXRlTnVtYmVyKHBhcnNlRmxvYXQobVswXSksIHBhcnNlRmxvYXQoby54KSk7CisgICAgfQorICB9CisKKyAgLy8gUmVtb3ZlIGFueSBudW1iZXJzIGluIGIgbm90IGZvdW5kIGluIGEuCisgIHdoaWxlIChpIDwgbikgeworICAgIG8gPSBxLnBvcCgpOworICAgIGlmIChzW28uaSArIDFdID09IG51bGwpIHsgLy8gVGhpcyBtYXRjaCBpcyBmb2xsb3dlZCBieSBhbm90aGVyIG51bWJlci4KKyAgICAgIHNbby5pXSA9IG8ueDsKKyAgICB9IGVsc2UgeyAvLyBUaGlzIG1hdGNoIGlzIGZvbGxvd2VkIGJ5IGEgc3RyaW5nLCBzbyBjb2FsbGVzY2UgdHdpY2UuCisgICAgICBzW28uaV0gPSBvLnggKyBzW28uaSArIDFdOworICAgICAgcy5zcGxpY2Uoby5pICsgMSwgMSk7CisgICAgfQorICAgIG4tLTsKKyAgfQorCisgIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLgorICBpZiAocy5sZW5ndGggPT09IDEpIHsKKyAgICByZXR1cm4gc1swXSA9PSBudWxsID8gcVswXS54IDogZnVuY3Rpb24oKSB7IHJldHVybiBiOyB9OworICB9CisKKyAgLy8gT3RoZXJ3aXNlLCBpbnRlcnBvbGF0ZSBlYWNoIG9mIHRoZSBudW1iZXJzIGFuZCByZWpvaW4gdGhlIHN0cmluZy4KKyAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7CisgICAgcmV0dXJuIHMuam9pbigiIik7CisgIH07Cit9OworCitkMy5pbnRlcnBvbGF0ZVRyYW5zZm9ybSA9IGZ1bmN0aW9uKGEsIGIpIHsKKyAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCisgICAgICBxID0gW10sIC8vIG51bWJlciBpbnRlcnBvbGF0b3JzCisgICAgICBuLAorICAgICAgQSA9IGQzLnRyYW5zZm9ybShhKSwKKyAgICAgIEIgPSBkMy50cmFuc2Zvcm0oYiksCisgICAgICB0YSA9IEEudHJhbnNsYXRlLAorICAgICAgdGIgPSBCLnRyYW5zbGF0ZSwKKyAgICAgIHJhID0gQS5yb3RhdGUsCisgICAgICByYiA9IEIucm90YXRlLAorICAgICAgd2EgPSBBLnNrZXcsCisgICAgICB3YiA9IEIuc2tldywKKyAgICAgIGthID0gQS5zY2FsZSwKKyAgICAgIGtiID0gQi5zY2FsZTsKKworICBpZiAodGFbMF0gIT0gdGJbMF0gfHwgdGFbMV0gIT0gdGJbMV0pIHsKKyAgICBzLnB1c2goInRyYW5zbGF0ZSgiLCBudWxsLCAiLCIsIG51bGwsICIpIik7CisgICAgcS5wdXNoKHtpOiAxLCB4OiBkMy5pbnRlcnBvbGF0ZU51bWJlcih0YVswXSwgdGJbMF0pfSwge2k6IDMsIHg6IGQzLmludGVycG9sYXRlTnVtYmVyKHRhWzFdLCB0YlsxXSl9KTsKKyAgfSBlbHNlIGlmICh0YlswXSB8fCB0YlsxXSkgeworICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB0YiArICIpIik7CisgIH0gZWxzZSB7CisgICAgcy5wdXNoKCIiKTsKKyAgfQorCisgIGlmIChyYSAhPSByYikgeworICAgIHEucHVzaCh7aTogcy5wdXNoKHMucG9wKCkgKyAicm90YXRlKCIsIG51bGwsICIpIikgLSAyLCB4OiBkMy5pbnRlcnBvbGF0ZU51bWJlcihyYSwgcmIpfSk7CisgIH0gZWxzZSBpZiAocmIpIHsKKyAgICBzLnB1c2gocy5wb3AoKSArICJyb3RhdGUoIiArIHJiICsgIikiKTsKKyAgfQorCisgIGlmICh3YSAhPSB3YikgeworICAgIHEucHVzaCh7aTogcy5wdXNoKHMucG9wKCkgKyAic2tld1goIiwgbnVsbCwgIikiKSAtIDIsIHg6IGQzLmludGVycG9sYXRlTnVtYmVyKHdhLCB3Yil9KTsKKyAgfSBlbHNlIGlmICh3YikgeworICAgIHMucHVzaChzLnBvcCgpICsgInNrZXdYKCIgKyB3YiArICIpIik7CisgIH0KKworICBpZiAoa2FbMF0gIT0ga2JbMF0gfHwga2FbMV0gIT0ga2JbMV0pIHsKKyAgICBuID0gcy5wdXNoKHMucG9wKCkgKyAic2NhbGUoIiwgbnVsbCwgIiwiLCBudWxsLCAiKSIpOworICAgIHEucHVzaCh7aTogbiAtIDQsIHg6IGQzLmludGVycG9sYXRlTnVtYmVyKGthWzBdLCBrYlswXSl9LCB7aTogbiAtIDIsIHg6IGQzLmludGVycG9sYXRlTnVtYmVyKGthWzFdLCBrYlsxXSl9KTsKKyAgfSBlbHNlIGlmIChrYlswXSAhPSAxIHx8IGtiWzFdICE9IDEpIHsKKyAgICBzLnB1c2gocy5wb3AoKSArICJzY2FsZSgiICsga2IgKyAiKSIpOworICB9CisKKyAgbiA9IHEubGVuZ3RoOworICByZXR1cm4gZnVuY3Rpb24odCkgeworICAgIHZhciBpID0gLTEsIG87CisgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsKKyAgICByZXR1cm4gcy5qb2luKCIiKTsKKyAgfTsKK307CisKK2QzLmludGVycG9sYXRlUmdiID0gZnVuY3Rpb24oYSwgYikgeworICBhID0gZDMucmdiKGEpOworICBiID0gZDMucmdiKGIpOworICB2YXIgYXIgPSBhLnIsCisgICAgICBhZyA9IGEuZywKKyAgICAgIGFiID0gYS5iLAorICAgICAgYnIgPSBiLnIgLSBhciwKKyAgICAgIGJnID0gYi5nIC0gYWcsCisgICAgICBiYiA9IGIuYiAtIGFiOworICByZXR1cm4gZnVuY3Rpb24odCkgeworICAgIHJldHVybiAiIyIKKyAgICAgICAgKyBkM19yZ2JfaGV4KE1hdGgucm91bmQoYXIgKyBiciAqIHQpKQorICAgICAgICArIGQzX3JnYl9oZXgoTWF0aC5yb3VuZChhZyArIGJnICogdCkpCisgICAgICAgICsgZDNfcmdiX2hleChNYXRoLnJvdW5kKGFiICsgYmIgKiB0KSk7CisgIH07Cit9OworCisvLyBpbnRlcnBvbGF0ZXMgSFNMIHNwYWNlLCBidXQgb3V0cHV0cyBSR0Igc3RyaW5nIChmb3IgY29tcGF0aWJpbGl0eSkKK2QzLmludGVycG9sYXRlSHNsID0gZnVuY3Rpb24oYSwgYikgeworICBhID0gZDMuaHNsKGEpOworICBiID0gZDMuaHNsKGIpOworICB2YXIgaDAgPSBhLmgsCisgICAgICBzMCA9IGEucywKKyAgICAgIGwwID0gYS5sLAorICAgICAgaDEgPSBiLmggLSBoMCwKKyAgICAgIHMxID0gYi5zIC0gczAsCisgICAgICBsMSA9IGIubCAtIGwwOworICByZXR1cm4gZnVuY3Rpb24odCkgeworICAgIHJldHVybiBkM19oc2xfcmdiKGgwICsgaDEgKiB0LCBzMCArIHMxICogdCwgbDAgKyBsMSAqIHQpLnRvU3RyaW5nKCk7CisgIH07Cit9OworCitkMy5pbnRlcnBvbGF0ZUFycmF5ID0gZnVuY3Rpb24oYSwgYikgeworICB2YXIgeCA9IFtdLAorICAgICAgYyA9IFtdLAorICAgICAgbmEgPSBhLmxlbmd0aCwKKyAgICAgIG5iID0gYi5sZW5ndGgsCisgICAgICBuMCA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCksCisgICAgICBpOworICBmb3IgKGkgPSAwOyBpIDwgbjA7ICsraSkgeC5wdXNoKGQzLmludGVycG9sYXRlKGFbaV0sIGJbaV0pKTsKKyAgZm9yICg7IGkgPCBuYTsgKytpKSBjW2ldID0gYVtpXTsKKyAgZm9yICg7IGkgPCBuYjsgKytpKSBjW2ldID0gYltpXTsKKyAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjA7ICsraSkgY1tpXSA9IHhbaV0odCk7CisgICAgcmV0dXJuIGM7CisgIH07Cit9OworCitkMy5pbnRlcnBvbGF0ZU9iamVjdCA9IGZ1bmN0aW9uKGEsIGIpIHsKKyAgdmFyIGkgPSB7fSwKKyAgICAgIGMgPSB7fSwKKyAgICAgIGs7CisgIGZvciAoayBpbiBhKSB7CisgICAgaWYgKGsgaW4gYikgeworICAgICAgaVtrXSA9IGQzX2ludGVycG9sYXRlQnlOYW1lKGspKGFba10sIGJba10pOworICAgIH0gZWxzZSB7CisgICAgICBjW2tdID0gYVtrXTsKKyAgICB9CisgIH0KKyAgZm9yIChrIGluIGIpIHsKKyAgICBpZiAoIShrIGluIGEpKSB7CisgICAgICBjW2tdID0gYltrXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKKyAgICBmb3IgKGsgaW4gaSkgY1trXSA9IGlba10odCk7CisgICAgcmV0dXJuIGM7CisgIH07Cit9CisKK3ZhciBkM19pbnRlcnBvbGF0ZV9udW1iZXIgPSAvWy0rXT8oPzpcZCpcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZzsKKworZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVCeU5hbWUobikgeworICByZXR1cm4gbiA9PSAidHJhbnNmb3JtIgorICAgICAgPyBkMy5pbnRlcnBvbGF0ZVRyYW5zZm9ybQorICAgICAgOiBkMy5pbnRlcnBvbGF0ZTsKK30KKworZDMuaW50ZXJwb2xhdG9ycyA9IFsKKyAgZDMuaW50ZXJwb2xhdGVPYmplY3QsCisgIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIChiIGluc3RhbmNlb2YgQXJyYXkpICYmIGQzLmludGVycG9sYXRlQXJyYXkoYSwgYik7IH0sCisgIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuICh0eXBlb2YgYSA9PT0gInN0cmluZyIgfHwgdHlwZW9mIGIgPT09ICJzdHJpbmciKSAmJiBkMy5pbnRlcnBvbGF0ZVN0cmluZyhhICsgIiIsIGIgKyAiIik7IH0sCisgIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuICh0eXBlb2YgYiA9PT0gInN0cmluZyIgPyBkM19yZ2JfbmFtZXMuaGFzKGIpIHx8IC9eKCN8cmdiXCh8aHNsXCgpLy50ZXN0KGIpIDogYiBpbnN0YW5jZW9mIGQzX1JnYiB8fCBiIGluc3RhbmNlb2YgZDNfSHNsKSAmJiBkMy5pbnRlcnBvbGF0ZVJnYihhLCBiKTsgfSwKKyAgZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gIWlzTmFOKGEgPSArYSkgJiYgIWlzTmFOKGIgPSArYikgJiYgZDMuaW50ZXJwb2xhdGVOdW1iZXIoYSwgYik7IH0KK107CitmdW5jdGlvbiBkM191bmludGVycG9sYXRlTnVtYmVyKGEsIGIpIHsKKyAgYiA9IGIgLSAoYSA9ICthKSA/IDEgLyAoYiAtIGEpIDogMDsKKyAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuICh4IC0gYSkgKiBiOyB9OworfQorCitmdW5jdGlvbiBkM191bmludGVycG9sYXRlQ2xhbXAoYSwgYikgeworICBiID0gYiAtIChhID0gK2EpID8gMSAvIChiIC0gYSkgOiAwOworICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKHggLSBhKSAqIGIpKTsgfTsKK30KK2QzLnJnYiA9IGZ1bmN0aW9uKHIsIGcsIGIpIHsKKyAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEKKyAgICAgID8gKHIgaW5zdGFuY2VvZiBkM19SZ2IgPyBkM19yZ2Ioci5yLCByLmcsIHIuYikKKyAgICAgIDogZDNfcmdiX3BhcnNlKCIiICsgciwgZDNfcmdiLCBkM19oc2xfcmdiKSkKKyAgICAgIDogZDNfcmdiKH5+ciwgfn5nLCB+fmIpOworfTsKKworZnVuY3Rpb24gZDNfcmdiKHIsIGcsIGIpIHsKKyAgcmV0dXJuIG5ldyBkM19SZ2IociwgZywgYik7Cit9CisKK2Z1bmN0aW9uIGQzX1JnYihyLCBnLCBiKSB7CisgIHRoaXMuciA9IHI7CisgIHRoaXMuZyA9IGc7CisgIHRoaXMuYiA9IGI7Cit9CisKK2QzX1JnYi5wcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7CisgIGsgPSBNYXRoLnBvdygwLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7CisgIHZhciByID0gdGhpcy5yLAorICAgICAgZyA9IHRoaXMuZywKKyAgICAgIGIgPSB0aGlzLmIsCisgICAgICBpID0gMzA7CisgIGlmICghciAmJiAhZyAmJiAhYikgcmV0dXJuIGQzX3JnYihpLCBpLCBpKTsKKyAgaWYgKHIgJiYgciA8IGkpIHIgPSBpOworICBpZiAoZyAmJiBnIDwgaSkgZyA9IGk7CisgIGlmIChiICYmIGIgPCBpKSBiID0gaTsKKyAgcmV0dXJuIGQzX3JnYigKKyAgICAgIE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihyIC8gaykpLAorICAgICAgTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGcgLyBrKSksCisgICAgICBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IoYiAvIGspKSk7Cit9OworCitkM19SZ2IucHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHsKKyAgayA9IE1hdGgucG93KDAuNywgYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKTsKKyAgcmV0dXJuIGQzX3JnYigKKyAgICAgIE1hdGguZmxvb3IoayAqIHRoaXMuciksCisgICAgICBNYXRoLmZsb29yKGsgKiB0aGlzLmcpLAorICAgICAgTWF0aC5mbG9vcihrICogdGhpcy5iKSk7Cit9OworCitkM19SZ2IucHJvdG90eXBlLmhzbCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gZDNfcmdiX2hzbCh0aGlzLnIsIHRoaXMuZywgdGhpcy5iKTsKK307CisKK2QzX1JnYi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuICIjIiArIGQzX3JnYl9oZXgodGhpcy5yKSArIGQzX3JnYl9oZXgodGhpcy5nKSArIGQzX3JnYl9oZXgodGhpcy5iKTsKK307CisKK2Z1bmN0aW9uIGQzX3JnYl9oZXgodikgeworICByZXR1cm4gdiA8IDB4MTAKKyAgICAgID8gIjAiICsgTWF0aC5tYXgoMCwgdikudG9TdHJpbmcoMTYpCisgICAgICA6IE1hdGgubWluKDI1NSwgdikudG9TdHJpbmcoMTYpOworfQorCitmdW5jdGlvbiBkM19yZ2JfcGFyc2UoZm9ybWF0LCByZ2IsIGhzbCkgeworICB2YXIgciA9IDAsIC8vIHJlZCBjaGFubmVsOyBpbnQgaW4gWzAsIDI1NV0KKyAgICAgIGcgPSAwLCAvLyBncmVlbiBjaGFubmVsOyBpbnQgaW4gWzAsIDI1NV0KKyAgICAgIGIgPSAwLCAvLyBibHVlIGNoYW5uZWw7IGludCBpbiBbMCwgMjU1XQorICAgICAgbTEsIC8vIENTUyBjb2xvciBzcGVjaWZpY2F0aW9uIG1hdGNoCisgICAgICBtMiwgLy8gQ1NTIGNvbG9yIHNwZWNpZmljYXRpb24gdHlwZSAoZS5nLiwgcmdiKQorICAgICAgbmFtZTsKKworICAvKiBIYW5kbGUgaHNsLCByZ2IuICovCisgIG0xID0gLyhbYS16XSspXCgoLiopXCkvaS5leGVjKGZvcm1hdCk7CisgIGlmIChtMSkgeworICAgIG0yID0gbTFbMl0uc3BsaXQoIiwiKTsKKyAgICBzd2l0Y2ggKG0xWzFdKSB7CisgICAgICBjYXNlICJoc2wiOiB7CisgICAgICAgIHJldHVybiBoc2woCisgICAgICAgICAgcGFyc2VGbG9hdChtMlswXSksIC8vIGRlZ3JlZXMKKyAgICAgICAgICBwYXJzZUZsb2F0KG0yWzFdKSAvIDEwMCwgLy8gcGVyY2VudGFnZQorICAgICAgICAgIHBhcnNlRmxvYXQobTJbMl0pIC8gMTAwIC8vIHBlcmNlbnRhZ2UKKyAgICAgICAgKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgInJnYiI6IHsKKyAgICAgICAgcmV0dXJuIHJnYigKKyAgICAgICAgICBkM19yZ2JfcGFyc2VOdW1iZXIobTJbMF0pLAorICAgICAgICAgIGQzX3JnYl9wYXJzZU51bWJlcihtMlsxXSksCisgICAgICAgICAgZDNfcmdiX3BhcnNlTnVtYmVyKG0yWzJdKQorICAgICAgICApOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIE5hbWVkIGNvbG9ycy4gKi8KKyAgaWYgKG5hbWUgPSBkM19yZ2JfbmFtZXMuZ2V0KGZvcm1hdCkpIHJldHVybiByZ2IobmFtZS5yLCBuYW1lLmcsIG5hbWUuYik7CisKKyAgLyogSGV4YWRlY2ltYWwgY29sb3JzOiAjcmdiIGFuZCAjcnJnZ2JiLiAqLworICBpZiAoZm9ybWF0ICE9IG51bGwgJiYgZm9ybWF0LmNoYXJBdCgwKSA9PT0gIiMiKSB7CisgICAgaWYgKGZvcm1hdC5sZW5ndGggPT09IDQpIHsKKyAgICAgIHIgPSBmb3JtYXQuY2hhckF0KDEpOyByICs9IHI7CisgICAgICBnID0gZm9ybWF0LmNoYXJBdCgyKTsgZyArPSBnOworICAgICAgYiA9IGZvcm1hdC5jaGFyQXQoMyk7IGIgKz0gYjsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdC5sZW5ndGggPT09IDcpIHsKKyAgICAgIHIgPSBmb3JtYXQuc3Vic3RyaW5nKDEsIDMpOworICAgICAgZyA9IGZvcm1hdC5zdWJzdHJpbmcoMywgNSk7CisgICAgICBiID0gZm9ybWF0LnN1YnN0cmluZyg1LCA3KTsKKyAgICB9CisgICAgciA9IHBhcnNlSW50KHIsIDE2KTsKKyAgICBnID0gcGFyc2VJbnQoZywgMTYpOworICAgIGIgPSBwYXJzZUludChiLCAxNik7CisgIH0KKworICByZXR1cm4gcmdiKHIsIGcsIGIpOworfQorCitmdW5jdGlvbiBkM19yZ2JfaHNsKHIsIGcsIGIpIHsKKyAgdmFyIG1pbiA9IE1hdGgubWluKHIgLz0gMjU1LCBnIC89IDI1NSwgYiAvPSAyNTUpLAorICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksCisgICAgICBkID0gbWF4IC0gbWluLAorICAgICAgaCwKKyAgICAgIHMsCisgICAgICBsID0gKG1heCArIG1pbikgLyAyOworICBpZiAoZCkgeworICAgIHMgPSBsIDwgLjUgPyBkIC8gKG1heCArIG1pbikgOiBkIC8gKDIgLSBtYXggLSBtaW4pOworICAgIGlmIChyID09IG1heCkgaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOworICAgIGVsc2UgaWYgKGcgPT0gbWF4KSBoID0gKGIgLSByKSAvIGQgKyAyOworICAgIGVsc2UgaCA9IChyIC0gZykgLyBkICsgNDsKKyAgICBoICo9IDYwOworICB9IGVsc2UgeworICAgIHMgPSBoID0gMDsKKyAgfQorICByZXR1cm4gZDNfaHNsKGgsIHMsIGwpOworfQorCitmdW5jdGlvbiBkM19yZ2JfcGFyc2VOdW1iZXIoYykgeyAvLyBlaXRoZXIgaW50ZWdlciBvciBwZXJjZW50YWdlCisgIHZhciBmID0gcGFyc2VGbG9hdChjKTsKKyAgcmV0dXJuIGMuY2hhckF0KGMubGVuZ3RoIC0gMSkgPT09ICIlIiA/IE1hdGgucm91bmQoZiAqIDIuNTUpIDogZjsKK30KKwordmFyIGQzX3JnYl9uYW1lcyA9IGQzLm1hcCh7CisgIGFsaWNlYmx1ZTogIiNmMGY4ZmYiLAorICBhbnRpcXVld2hpdGU6ICIjZmFlYmQ3IiwKKyAgYXF1YTogIiMwMGZmZmYiLAorICBhcXVhbWFyaW5lOiAiIzdmZmZkNCIsCisgIGF6dXJlOiAiI2YwZmZmZiIsCisgIGJlaWdlOiAiI2Y1ZjVkYyIsCisgIGJpc3F1ZTogIiNmZmU0YzQiLAorICBibGFjazogIiMwMDAwMDAiLAorICBibGFuY2hlZGFsbW9uZDogIiNmZmViY2QiLAorICBibHVlOiAiIzAwMDBmZiIsCisgIGJsdWV2aW9sZXQ6ICIjOGEyYmUyIiwKKyAgYnJvd246ICIjYTUyYTJhIiwKKyAgYnVybHl3b29kOiAiI2RlYjg4NyIsCisgIGNhZGV0Ymx1ZTogIiM1ZjllYTAiLAorICBjaGFydHJldXNlOiAiIzdmZmYwMCIsCisgIGNob2NvbGF0ZTogIiNkMjY5MWUiLAorICBjb3JhbDogIiNmZjdmNTAiLAorICBjb3JuZmxvd2VyYmx1ZTogIiM2NDk1ZWQiLAorICBjb3Juc2lsazogIiNmZmY4ZGMiLAorICBjcmltc29uOiAiI2RjMTQzYyIsCisgIGN5YW46ICIjMDBmZmZmIiwKKyAgZGFya2JsdWU6ICIjMDAwMDhiIiwKKyAgZGFya2N5YW46ICIjMDA4YjhiIiwKKyAgZGFya2dvbGRlbnJvZDogIiNiODg2MGIiLAorICBkYXJrZ3JheTogIiNhOWE5YTkiLAorICBkYXJrZ3JlZW46ICIjMDA2NDAwIiwKKyAgZGFya2dyZXk6ICIjYTlhOWE5IiwKKyAgZGFya2toYWtpOiAiI2JkYjc2YiIsCisgIGRhcmttYWdlbnRhOiAiIzhiMDA4YiIsCisgIGRhcmtvbGl2ZWdyZWVuOiAiIzU1NmIyZiIsCisgIGRhcmtvcmFuZ2U6ICIjZmY4YzAwIiwKKyAgZGFya29yY2hpZDogIiM5OTMyY2MiLAorICBkYXJrcmVkOiAiIzhiMDAwMCIsCisgIGRhcmtzYWxtb246ICIjZTk5NjdhIiwKKyAgZGFya3NlYWdyZWVuOiAiIzhmYmM4ZiIsCisgIGRhcmtzbGF0ZWJsdWU6ICIjNDgzZDhiIiwKKyAgZGFya3NsYXRlZ3JheTogIiMyZjRmNGYiLAorICBkYXJrc2xhdGVncmV5OiAiIzJmNGY0ZiIsCisgIGRhcmt0dXJxdW9pc2U6ICIjMDBjZWQxIiwKKyAgZGFya3Zpb2xldDogIiM5NDAwZDMiLAorICBkZWVwcGluazogIiNmZjE0OTMiLAorICBkZWVwc2t5Ymx1ZTogIiMwMGJmZmYiLAorICBkaW1ncmF5OiAiIzY5Njk2OSIsCisgIGRpbWdyZXk6ICIjNjk2OTY5IiwKKyAgZG9kZ2VyYmx1ZTogIiMxZTkwZmYiLAorICBmaXJlYnJpY2s6ICIjYjIyMjIyIiwKKyAgZmxvcmFsd2hpdGU6ICIjZmZmYWYwIiwKKyAgZm9yZXN0Z3JlZW46ICIjMjI4YjIyIiwKKyAgZnVjaHNpYTogIiNmZjAwZmYiLAorICBnYWluc2Jvcm86ICIjZGNkY2RjIiwKKyAgZ2hvc3R3aGl0ZTogIiNmOGY4ZmYiLAorICBnb2xkOiAiI2ZmZDcwMCIsCisgIGdvbGRlbnJvZDogIiNkYWE1MjAiLAorICBncmF5OiAiIzgwODA4MCIsCisgIGdyZWVuOiAiIzAwODAwMCIsCisgIGdyZWVueWVsbG93OiAiI2FkZmYyZiIsCisgIGdyZXk6ICIjODA4MDgwIiwKKyAgaG9uZXlkZXc6ICIjZjBmZmYwIiwKKyAgaG90cGluazogIiNmZjY5YjQiLAorICBpbmRpYW5yZWQ6ICIjY2Q1YzVjIiwKKyAgaW5kaWdvOiAiIzRiMDA4MiIsCisgIGl2b3J5OiAiI2ZmZmZmMCIsCisgIGtoYWtpOiAiI2YwZTY4YyIsCisgIGxhdmVuZGVyOiAiI2U2ZTZmYSIsCisgIGxhdmVuZGVyYmx1c2g6ICIjZmZmMGY1IiwKKyAgbGF3bmdyZWVuOiAiIzdjZmMwMCIsCisgIGxlbW9uY2hpZmZvbjogIiNmZmZhY2QiLAorICBsaWdodGJsdWU6ICIjYWRkOGU2IiwKKyAgbGlnaHRjb3JhbDogIiNmMDgwODAiLAorICBsaWdodGN5YW46ICIjZTBmZmZmIiwKKyAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6ICIjZmFmYWQyIiwKKyAgbGlnaHRncmF5OiAiI2QzZDNkMyIsCisgIGxpZ2h0Z3JlZW46ICIjOTBlZTkwIiwKKyAgbGlnaHRncmV5OiAiI2QzZDNkMyIsCisgIGxpZ2h0cGluazogIiNmZmI2YzEiLAorICBsaWdodHNhbG1vbjogIiNmZmEwN2EiLAorICBsaWdodHNlYWdyZWVuOiAiIzIwYjJhYSIsCisgIGxpZ2h0c2t5Ymx1ZTogIiM4N2NlZmEiLAorICBsaWdodHNsYXRlZ3JheTogIiM3Nzg4OTkiLAorICBsaWdodHNsYXRlZ3JleTogIiM3Nzg4OTkiLAorICBsaWdodHN0ZWVsYmx1ZTogIiNiMGM0ZGUiLAorICBsaWdodHllbGxvdzogIiNmZmZmZTAiLAorICBsaW1lOiAiIzAwZmYwMCIsCisgIGxpbWVncmVlbjogIiMzMmNkMzIiLAorICBsaW5lbjogIiNmYWYwZTYiLAorICBtYWdlbnRhOiAiI2ZmMDBmZiIsCisgIG1hcm9vbjogIiM4MDAwMDAiLAorICBtZWRpdW1hcXVhbWFyaW5lOiAiIzY2Y2RhYSIsCisgIG1lZGl1bWJsdWU6ICIjMDAwMGNkIiwKKyAgbWVkaXVtb3JjaGlkOiAiI2JhNTVkMyIsCisgIG1lZGl1bXB1cnBsZTogIiM5MzcwZGIiLAorICBtZWRpdW1zZWFncmVlbjogIiMzY2IzNzEiLAorICBtZWRpdW1zbGF0ZWJsdWU6ICIjN2I2OGVlIiwKKyAgbWVkaXVtc3ByaW5nZ3JlZW46ICIjMDBmYTlhIiwKKyAgbWVkaXVtdHVycXVvaXNlOiAiIzQ4ZDFjYyIsCisgIG1lZGl1bXZpb2xldHJlZDogIiNjNzE1ODUiLAorICBtaWRuaWdodGJsdWU6ICIjMTkxOTcwIiwKKyAgbWludGNyZWFtOiAiI2Y1ZmZmYSIsCisgIG1pc3R5cm9zZTogIiNmZmU0ZTEiLAorICBtb2NjYXNpbjogIiNmZmU0YjUiLAorICBuYXZham93aGl0ZTogIiNmZmRlYWQiLAorICBuYXZ5OiAiIzAwMDA4MCIsCisgIG9sZGxhY2U6ICIjZmRmNWU2IiwKKyAgb2xpdmU6ICIjODA4MDAwIiwKKyAgb2xpdmVkcmFiOiAiIzZiOGUyMyIsCisgIG9yYW5nZTogIiNmZmE1MDAiLAorICBvcmFuZ2VyZWQ6ICIjZmY0NTAwIiwKKyAgb3JjaGlkOiAiI2RhNzBkNiIsCisgIHBhbGVnb2xkZW5yb2Q6ICIjZWVlOGFhIiwKKyAgcGFsZWdyZWVuOiAiIzk4ZmI5OCIsCisgIHBhbGV0dXJxdW9pc2U6ICIjYWZlZWVlIiwKKyAgcGFsZXZpb2xldHJlZDogIiNkYjcwOTMiLAorICBwYXBheWF3aGlwOiAiI2ZmZWZkNSIsCisgIHBlYWNocHVmZjogIiNmZmRhYjkiLAorICBwZXJ1OiAiI2NkODUzZiIsCisgIHBpbms6ICIjZmZjMGNiIiwKKyAgcGx1bTogIiNkZGEwZGQiLAorICBwb3dkZXJibHVlOiAiI2IwZTBlNiIsCisgIHB1cnBsZTogIiM4MDAwODAiLAorICByZWQ6ICIjZmYwMDAwIiwKKyAgcm9zeWJyb3duOiAiI2JjOGY4ZiIsCisgIHJveWFsYmx1ZTogIiM0MTY5ZTEiLAorICBzYWRkbGVicm93bjogIiM4YjQ1MTMiLAorICBzYWxtb246ICIjZmE4MDcyIiwKKyAgc2FuZHlicm93bjogIiNmNGE0NjAiLAorICBzZWFncmVlbjogIiMyZThiNTciLAorICBzZWFzaGVsbDogIiNmZmY1ZWUiLAorICBzaWVubmE6ICIjYTA1MjJkIiwKKyAgc2lsdmVyOiAiI2MwYzBjMCIsCisgIHNreWJsdWU6ICIjODdjZWViIiwKKyAgc2xhdGVibHVlOiAiIzZhNWFjZCIsCisgIHNsYXRlZ3JheTogIiM3MDgwOTAiLAorICBzbGF0ZWdyZXk6ICIjNzA4MDkwIiwKKyAgc25vdzogIiNmZmZhZmEiLAorICBzcHJpbmdncmVlbjogIiMwMGZmN2YiLAorICBzdGVlbGJsdWU6ICIjNDY4MmI0IiwKKyAgdGFuOiAiI2QyYjQ4YyIsCisgIHRlYWw6ICIjMDA4MDgwIiwKKyAgdGhpc3RsZTogIiNkOGJmZDgiLAorICB0b21hdG86ICIjZmY2MzQ3IiwKKyAgdHVycXVvaXNlOiAiIzQwZTBkMCIsCisgIHZpb2xldDogIiNlZTgyZWUiLAorICB3aGVhdDogIiNmNWRlYjMiLAorICB3aGl0ZTogIiNmZmZmZmYiLAorICB3aGl0ZXNtb2tlOiAiI2Y1ZjVmNSIsCisgIHllbGxvdzogIiNmZmZmMDAiLAorICB5ZWxsb3dncmVlbjogIiM5YWNkMzIiCit9KTsKKworZDNfcmdiX25hbWVzLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICBkM19yZ2JfbmFtZXMuc2V0KGtleSwgZDNfcmdiX3BhcnNlKHZhbHVlLCBkM19yZ2IsIGQzX2hzbF9yZ2IpKTsKK30pOworZDMuaHNsID0gZnVuY3Rpb24oaCwgcywgbCkgeworICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMQorICAgICAgPyAoaCBpbnN0YW5jZW9mIGQzX0hzbCA/IGQzX2hzbChoLmgsIGgucywgaC5sKQorICAgICAgOiBkM19yZ2JfcGFyc2UoIiIgKyBoLCBkM19yZ2JfaHNsLCBkM19oc2wpKQorICAgICAgOiBkM19oc2woK2gsICtzLCArbCk7Cit9OworCitmdW5jdGlvbiBkM19oc2woaCwgcywgbCkgeworICByZXR1cm4gbmV3IGQzX0hzbChoLCBzLCBsKTsKK30KKworZnVuY3Rpb24gZDNfSHNsKGgsIHMsIGwpIHsKKyAgdGhpcy5oID0gaDsKKyAgdGhpcy5zID0gczsKKyAgdGhpcy5sID0gbDsKK30KKworZDNfSHNsLnByb3RvdHlwZS5icmlnaHRlciA9IGZ1bmN0aW9uKGspIHsKKyAgayA9IE1hdGgucG93KDAuNywgYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKTsKKyAgcmV0dXJuIGQzX2hzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sIC8gayk7Cit9OworCitkM19Ic2wucHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHsKKyAgayA9IE1hdGgucG93KDAuNywgYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKTsKKyAgcmV0dXJuIGQzX2hzbCh0aGlzLmgsIHRoaXMucywgayAqIHRoaXMubCk7Cit9OworCitkM19Ic2wucHJvdG90eXBlLnJnYiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gZDNfaHNsX3JnYih0aGlzLmgsIHRoaXMucywgdGhpcy5sKTsKK307CisKK2QzX0hzbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmdiKCkudG9TdHJpbmcoKTsKK307CisKK2Z1bmN0aW9uIGQzX2hzbF9yZ2IoaCwgcywgbCkgeworICB2YXIgbTEsCisgICAgICBtMjsKKworICAvKiBTb21lIHNpbXBsZSBjb3JyZWN0aW9ucyBmb3IgaCwgcyBhbmQgbC4gKi8KKyAgaCA9IGggJSAzNjA7IGlmIChoIDwgMCkgaCArPSAzNjA7CisgIHMgPSBzIDwgMCA/IDAgOiBzID4gMSA/IDEgOiBzOworICBsID0gbCA8IDAgPyAwIDogbCA+IDEgPyAxIDogbDsKKworICAvKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovCisgIG0yID0gbCA8PSAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogczsKKyAgbTEgPSAyICogbCAtIG0yOworCisgIGZ1bmN0aW9uIHYoaCkgeworICAgIGlmIChoID4gMzYwKSBoIC09IDM2MDsKKyAgICBlbHNlIGlmIChoIDwgMCkgaCArPSAzNjA7CisgICAgaWYgKGggPCA2MCkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAvIDYwOworICAgIGlmIChoIDwgMTgwKSByZXR1cm4gbTI7CisgICAgaWYgKGggPCAyNDApIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwOworICAgIHJldHVybiBtMTsKKyAgfQorCisgIGZ1bmN0aW9uIHZ2KGgpIHsKKyAgICByZXR1cm4gTWF0aC5yb3VuZCh2KGgpICogMjU1KTsKKyAgfQorCisgIHJldHVybiBkM19yZ2IodnYoaCArIDEyMCksIHZ2KGgpLCB2dihoIC0gMTIwKSk7Cit9CitmdW5jdGlvbiBkM19zZWxlY3Rpb24oZ3JvdXBzKSB7CisgIGQzX2FycmF5U3ViY2xhc3MoZ3JvdXBzLCBkM19zZWxlY3Rpb25Qcm90b3R5cGUpOworICByZXR1cm4gZ3JvdXBzOworfQorCit2YXIgZDNfc2VsZWN0ID0gZnVuY3Rpb24ocywgbikgeyByZXR1cm4gbi5xdWVyeVNlbGVjdG9yKHMpOyB9LAorICAgIGQzX3NlbGVjdEFsbCA9IGZ1bmN0aW9uKHMsIG4pIHsgcmV0dXJuIG4ucXVlcnlTZWxlY3RvckFsbChzKTsgfSwKKyAgICBkM19zZWxlY3RSb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAorICAgIGQzX3NlbGVjdE1hdGNoZXIgPSBkM19zZWxlY3RSb290Lm1hdGNoZXNTZWxlY3RvciB8fCBkM19zZWxlY3RSb290LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBkM19zZWxlY3RSb290Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBkM19zZWxlY3RSb290Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGQzX3NlbGVjdFJvb3Qub01hdGNoZXNTZWxlY3RvciwKKyAgICBkM19zZWxlY3RNYXRjaGVzID0gZnVuY3Rpb24obiwgcykgeyByZXR1cm4gZDNfc2VsZWN0TWF0Y2hlci5jYWxsKG4sIHMpOyB9OworCisvLyBQcmVmZXIgU2l6emxlLCBpZiBhdmFpbGFibGUuCitpZiAodHlwZW9mIFNpenpsZSA9PT0gImZ1bmN0aW9uIikgeworICBkM19zZWxlY3QgPSBmdW5jdGlvbihzLCBuKSB7IHJldHVybiBTaXp6bGUocywgbilbMF07IH07CisgIGQzX3NlbGVjdEFsbCA9IGZ1bmN0aW9uKHMsIG4pIHsgcmV0dXJuIFNpenpsZS51bmlxdWVTb3J0KFNpenpsZShzLCBuKSk7IH07CisgIGQzX3NlbGVjdE1hdGNoZXMgPSBTaXp6bGUubWF0Y2hlc1NlbGVjdG9yOworfQorCit2YXIgZDNfc2VsZWN0aW9uUHJvdG90eXBlID0gW107CisKK2QzLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gZDNfc2VsZWN0aW9uUm9vdDsKK307CisKK2QzLnNlbGVjdGlvbi5wcm90b3R5cGUgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGU7CitkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKKyAgdmFyIHN1Ymdyb3VwcyA9IFtdLAorICAgICAgc3ViZ3JvdXAsCisgICAgICBzdWJub2RlLAorICAgICAgZ3JvdXAsCisgICAgICBub2RlOworCisgIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICJmdW5jdGlvbiIpIHNlbGVjdG9yID0gZDNfc2VsZWN0aW9uX3NlbGVjdG9yKHNlbGVjdG9yKTsKKworICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTspIHsKKyAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTsKKyAgICBzdWJncm91cC5wYXJlbnROb2RlID0gKGdyb3VwID0gdGhpc1tqXSkucGFyZW50Tm9kZTsKKyAgICBmb3IgKHZhciBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7CisgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CisgICAgICAgIHN1Ymdyb3VwLnB1c2goc3Vibm9kZSA9IHNlbGVjdG9yLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpOworICAgICAgICBpZiAoc3Vibm9kZSAmJiAiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7Cit9OworCitmdW5jdGlvbiBkM19zZWxlY3Rpb25fc2VsZWN0b3Ioc2VsZWN0b3IpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBkM19zZWxlY3Qoc2VsZWN0b3IsIHRoaXMpOworICB9OworfQorZDNfc2VsZWN0aW9uUHJvdG90eXBlLnNlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CisgIHZhciBzdWJncm91cHMgPSBbXSwKKyAgICAgIHN1Ymdyb3VwLAorICAgICAgbm9kZTsKKworICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAiZnVuY3Rpb24iKSBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvckFsbChzZWxlY3Rvcik7CisKKyAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7CisgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7CisgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CisgICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gZDNfYXJyYXkoc2VsZWN0b3IuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpKSkpOworICAgICAgICBzdWJncm91cC5wYXJlbnROb2RlID0gbm9kZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7Cit9OworCitmdW5jdGlvbiBkM19zZWxlY3Rpb25fc2VsZWN0b3JBbGwoc2VsZWN0b3IpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBkM19zZWxlY3RBbGwoc2VsZWN0b3IsIHRoaXMpOworICB9OworfQorZDNfc2VsZWN0aW9uUHJvdG90eXBlLmF0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgeworICBuYW1lID0gZDMubnMucXVhbGlmeShuYW1lKTsKKworICAvLyBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgZmlyc3QgdmFsdWUuCisgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgeworICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7CisgICAgcmV0dXJuIG5hbWUubG9jYWwKKyAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpCisgICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CisgIH0KKworICBmdW5jdGlvbiBhdHRyTnVsbCgpIHsKKyAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgfQorCisgIGZ1bmN0aW9uIGF0dHJOdWxsTlMoKSB7CisgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTsKKyAgfQorCisgIGZ1bmN0aW9uIGF0dHJDb25zdGFudCgpIHsKKyAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisgIH0KKworICBmdW5jdGlvbiBhdHRyQ29uc3RhbnROUygpIHsKKyAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwsIHZhbHVlKTsKKyAgfQorCisgIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbigpIHsKKyAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgaWYgKHggPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB4KTsKKyAgfQorCisgIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKCkgeworICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICBpZiAoeCA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpOworICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsLCB4KTsKKyAgfQorCisgIHJldHVybiB0aGlzLmVhY2godmFsdWUgPT0gbnVsbAorICAgICAgPyAobmFtZS5sb2NhbCA/IGF0dHJOdWxsTlMgOiBhdHRyTnVsbCkgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCisgICAgICA/IChuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pCisgICAgICA6IChuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSk7Cit9OworZDNfc2VsZWN0aW9uUHJvdG90eXBlLmNsYXNzZWQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgeworICB2YXIgbmFtZXMgPSBuYW1lLnNwbGl0KGQzX3NlbGVjdGlvbl9jbGFzc2VkV2hpdGVzcGFjZSksCisgICAgICBuID0gbmFtZXMubGVuZ3RoLAorICAgICAgaSA9IC0xOworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKKyAgICB3aGlsZSAoKytpIDwgbikgZDNfc2VsZWN0aW9uX2NsYXNzZWQuY2FsbCh0aGlzLCBuYW1lc1tpXSwgdmFsdWUpOworICAgIHJldHVybiB0aGlzOworICB9IGVsc2UgeworICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWQzX3NlbGVjdGlvbl9jbGFzc2VkLmNhbGwodGhpcywgbmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK3ZhciBkM19zZWxlY3Rpb25fY2xhc3NlZFdoaXRlc3BhY2UgPSAvXHMrL2c7CisKK2Z1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSB7CisgIHZhciByZSA9IG5ldyBSZWdFeHAoIihefFxccyspIiArIGQzLnJlcXVvdGUobmFtZSkgKyAiKFxccyt8JCkiLCAiZyIpOworCisgIC8vIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBmaXJzdCB2YWx1ZS4KKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CisgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTsKKyAgICBpZiAoYyA9IG5vZGUuY2xhc3NMaXN0KSByZXR1cm4gYy5jb250YWlucyhuYW1lKTsKKyAgICB2YXIgYyA9IG5vZGUuY2xhc3NOYW1lOworICAgIHJlLmxhc3RJbmRleCA9IDA7CisgICAgcmV0dXJuIHJlLnRlc3QoYy5iYXNlVmFsICE9IG51bGwgPyBjLmJhc2VWYWwgOiBjKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNsYXNzZWRBZGQoKSB7CisgICAgaWYgKGMgPSB0aGlzLmNsYXNzTGlzdCkgcmV0dXJuIGMuYWRkKG5hbWUpOworICAgIHZhciBjID0gdGhpcy5jbGFzc05hbWUsCisgICAgICAgIGNiID0gYy5iYXNlVmFsICE9IG51bGwsCisgICAgICAgIGN2ID0gY2IgPyBjLmJhc2VWYWwgOiBjOworICAgIHJlLmxhc3RJbmRleCA9IDA7CisgICAgaWYgKCFyZS50ZXN0KGN2KSkgeworICAgICAgY3YgPSBkM19jb2xsYXBzZShjdiArICIgIiArIG5hbWUpOworICAgICAgaWYgKGNiKSBjLmJhc2VWYWwgPSBjdjsKKyAgICAgIGVsc2UgdGhpcy5jbGFzc05hbWUgPSBjdjsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKCkgeworICAgIGlmIChjID0gdGhpcy5jbGFzc0xpc3QpIHJldHVybiBjLnJlbW92ZShuYW1lKTsKKyAgICB2YXIgYyA9IHRoaXMuY2xhc3NOYW1lLAorICAgICAgICBjYiA9IGMuYmFzZVZhbCAhPSBudWxsLAorICAgICAgICBjdiA9IGNiID8gYy5iYXNlVmFsIDogYzsKKyAgICBjdiA9IGQzX2NvbGxhcHNlKGN2LnJlcGxhY2UocmUsICIgIikpOworICAgIGlmIChjYikgYy5iYXNlVmFsID0gY3Y7CisgICAgZWxzZSB0aGlzLmNsYXNzTmFtZSA9IGN2OworICB9CisKKyAgZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKCkgeworICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpCisgICAgICAgID8gY2xhc3NlZEFkZAorICAgICAgICA6IGNsYXNzZWRSZW1vdmUpLmNhbGwodGhpcyk7CisgIH0KKworICByZXR1cm4gdGhpcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgorICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZQorICAgICAgPyBjbGFzc2VkQWRkCisgICAgICA6IGNsYXNzZWRSZW1vdmUpOworfQorZDNfc2VsZWN0aW9uUHJvdG90eXBlLnN0eWxlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CisgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgcHJpb3JpdHkgPSAiIjsKKworICAvLyBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgZmlyc3QgdmFsdWUuCisgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHdpbmRvdworICAgICAgLmdldENvbXB1dGVkU3R5bGUodGhpcy5ub2RlKCksIG51bGwpCisgICAgICAuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTsKKworICBmdW5jdGlvbiBzdHlsZU51bGwoKSB7CisgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKKyAgfQorCisgIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQoKSB7CisgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpOworICB9CisKKyAgZnVuY3Rpb24gc3R5bGVGdW5jdGlvbigpIHsKKyAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgaWYgKHggPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKKyAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgeCwgcHJpb3JpdHkpOworICB9CisKKyAgcmV0dXJuIHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsCisgICAgICA/IHN0eWxlTnVsbCA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKKyAgICAgID8gc3R5bGVGdW5jdGlvbiA6IHN0eWxlQ29uc3RhbnQpKTsKK307CitkM19zZWxlY3Rpb25Qcm90b3R5cGUucHJvcGVydHkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgeworCisgIC8vIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBmaXJzdCB2YWx1ZS4KKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gdGhpcy5ub2RlKClbbmFtZV07CisKKyAgZnVuY3Rpb24gcHJvcGVydHlOdWxsKCkgeworICAgIGRlbGV0ZSB0aGlzW25hbWVdOworICB9CisKKyAgZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudCgpIHsKKyAgICB0aGlzW25hbWVdID0gdmFsdWU7CisgIH0KKworICBmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKCkgeworICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICBpZiAoeCA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTsKKyAgICBlbHNlIHRoaXNbbmFtZV0gPSB4OworICB9CisKKyAgcmV0dXJuIHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsCisgICAgICA/IHByb3BlcnR5TnVsbCA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKKyAgICAgID8gcHJvcGVydHlGdW5jdGlvbiA6IHByb3BlcnR5Q29uc3RhbnQpKTsKK307CitkM19zZWxlY3Rpb25Qcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMQorICAgICAgPyB0aGlzLm5vZGUoKS50ZXh0Q29udGVudCA6IHRoaXMuZWFjaCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKKyAgICAgID8gZnVuY3Rpb24oKSB7IHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/ICIiIDogdjsgfSA6IHZhbHVlID09IG51bGwKKyAgICAgID8gZnVuY3Rpb24oKSB7IHRoaXMudGV4dENvbnRlbnQgPSAiIjsgfQorICAgICAgOiBmdW5jdGlvbigpIHsgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOyB9KTsKK307CitkM19zZWxlY3Rpb25Qcm90b3R5cGUuaHRtbCA9IGZ1bmN0aW9uKHZhbHVlKSB7CisgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMQorICAgICAgPyB0aGlzLm5vZGUoKS5pbm5lckhUTUwgOiB0aGlzLmVhY2godHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCisgICAgICA/IGZ1bmN0aW9uKCkgeyB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gIiIgOiB2OyB9IDogdmFsdWUgPT0gbnVsbAorICAgICAgPyBmdW5jdGlvbigpIHsgdGhpcy5pbm5lckhUTUwgPSAiIjsgfQorICAgICAgOiBmdW5jdGlvbigpIHsgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTsgfSk7Cit9OworLy8gVE9ETyBhcHBlbmQobm9kZSk/CisvLyBUT0RPIGFwcGVuZChmdW5jdGlvbik/CitkM19zZWxlY3Rpb25Qcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSkgeworICBuYW1lID0gZDMubnMucXVhbGlmeShuYW1lKTsKKworICBmdW5jdGlvbiBhcHBlbmQoKSB7CisgICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLCBuYW1lKSk7CisgIH0KKworICBmdW5jdGlvbiBhcHBlbmROUygpIHsKKyAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCkpOworICB9CisKKyAgcmV0dXJuIHRoaXMuc2VsZWN0KG5hbWUubG9jYWwgPyBhcHBlbmROUyA6IGFwcGVuZCk7Cit9OworLy8gVE9ETyBpbnNlcnQobm9kZSwgZnVuY3Rpb24pPworLy8gVE9ETyBpbnNlcnQoZnVuY3Rpb24sIHN0cmluZyk/CisvLyBUT0RPIGluc2VydChmdW5jdGlvbiwgZnVuY3Rpb24pPworZDNfc2VsZWN0aW9uUHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkgeworICBuYW1lID0gZDMubnMucXVhbGlmeShuYW1lKTsKKworICBmdW5jdGlvbiBpbnNlcnQoKSB7CisgICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKAorICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksIG5hbWUpLAorICAgICAgICBkM19zZWxlY3QoYmVmb3JlLCB0aGlzKSk7CisgIH0KKworICBmdW5jdGlvbiBpbnNlcnROUygpIHsKKyAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoCisgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSwKKyAgICAgICAgZDNfc2VsZWN0KGJlZm9yZSwgdGhpcykpOworICB9CisKKyAgcmV0dXJuIHRoaXMuc2VsZWN0KG5hbWUubG9jYWwgPyBpbnNlcnROUyA6IGluc2VydCk7Cit9OworLy8gVE9ETyByZW1vdmUoc2VsZWN0b3IpPworLy8gVE9ETyByZW1vdmUobm9kZSk/CisvLyBUT0RPIHJlbW92ZShmdW5jdGlvbik/CitkM19zZWxlY3Rpb25Qcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKKyAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CisgIH0pOworfTsKK2QzX3NlbGVjdGlvblByb3RvdHlwZS5kYXRhID0gZnVuY3Rpb24odmFsdWUsIGtleSkgeworICB2YXIgaSA9IC0xLAorICAgICAgbiA9IHRoaXMubGVuZ3RoLAorICAgICAgZ3JvdXAsCisgICAgICBub2RlOworCisgIC8vIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBmaXJzdCB2YWx1ZS4KKyAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CisgICAgdmFsdWUgPSBuZXcgQXJyYXkobiA9IChncm91cCA9IHRoaXNbMF0pLmxlbmd0aCk7CisgICAgd2hpbGUgKCsraSA8IG4pIHsKKyAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKKyAgICAgICAgdmFsdWVbaV0gPSBub2RlLl9fZGF0YV9fOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBmdW5jdGlvbiBiaW5kKGdyb3VwLCBncm91cERhdGEpIHsKKyAgICB2YXIgaSwKKyAgICAgICAgbiA9IGdyb3VwLmxlbmd0aCwKKyAgICAgICAgbSA9IGdyb3VwRGF0YS5sZW5ndGgsCisgICAgICAgIG4wID0gTWF0aC5taW4obiwgbSksCisgICAgICAgIG4xID0gTWF0aC5tYXgobiwgbSksCisgICAgICAgIHVwZGF0ZU5vZGVzID0gW10sCisgICAgICAgIGVudGVyTm9kZXMgPSBbXSwKKyAgICAgICAgZXhpdE5vZGVzID0gW10sCisgICAgICAgIG5vZGUsCisgICAgICAgIG5vZGVEYXRhOworCisgICAgaWYgKGtleSkgeworICAgICAgdmFyIG5vZGVCeUtleVZhbHVlID0gbmV3IGQzX01hcCwKKyAgICAgICAgICBrZXlWYWx1ZXMgPSBbXSwKKyAgICAgICAgICBrZXlWYWx1ZSwKKyAgICAgICAgICBqID0gZ3JvdXBEYXRhLmxlbmd0aDsKKworICAgICAgZm9yIChpID0gLTE7ICsraSA8IG47KSB7CisgICAgICAgIGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSA9IGdyb3VwW2ldLCBub2RlLl9fZGF0YV9fLCBpKTsKKyAgICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHsKKyAgICAgICAgICBleGl0Tm9kZXNbaisrXSA9IG5vZGU7IC8vIGR1cGxpY2F0ZSBrZXkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpOworICAgICAgICB9CisgICAgICAgIGtleVZhbHVlcy5wdXNoKGtleVZhbHVlKTsKKyAgICAgIH0KKworICAgICAgZm9yIChpID0gLTE7ICsraSA8IG07KSB7CisgICAgICAgIGtleVZhbHVlID0ga2V5LmNhbGwoZ3JvdXBEYXRhLCBub2RlRGF0YSA9IGdyb3VwRGF0YVtpXSwgaSkKKyAgICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHsKKyAgICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IG5vZGUgPSBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWUpOworICAgICAgICAgIG5vZGUuX19kYXRhX18gPSBub2RlRGF0YTsKKyAgICAgICAgICBlbnRlck5vZGVzW2ldID0gZXhpdE5vZGVzW2ldID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlbnRlck5vZGVzW2ldID0gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKG5vZGVEYXRhKTsKKyAgICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IGV4aXROb2Rlc1tpXSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgbm9kZUJ5S2V5VmFsdWUucmVtb3ZlKGtleVZhbHVlKTsKKyAgICAgIH0KKworICAgICAgZm9yIChpID0gLTE7ICsraSA8IG47KSB7CisgICAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWVzW2ldKSkgeworICAgICAgICAgIGV4aXROb2Rlc1tpXSA9IGdyb3VwW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaSA9IC0xOyArK2kgPCBuMDspIHsKKyAgICAgICAgbm9kZSA9IGdyb3VwW2ldOworICAgICAgICBub2RlRGF0YSA9IGdyb3VwRGF0YVtpXTsKKyAgICAgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgICBub2RlLl9fZGF0YV9fID0gbm9kZURhdGE7CisgICAgICAgICAgdXBkYXRlTm9kZXNbaV0gPSBub2RlOworICAgICAgICAgIGVudGVyTm9kZXNbaV0gPSBleGl0Tm9kZXNbaV0gPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGVudGVyTm9kZXNbaV0gPSBkM19zZWxlY3Rpb25fZGF0YU5vZGUobm9kZURhdGEpOworICAgICAgICAgIHVwZGF0ZU5vZGVzW2ldID0gZXhpdE5vZGVzW2ldID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yICg7IGkgPCBtOyArK2kpIHsKKyAgICAgICAgZW50ZXJOb2Rlc1tpXSA9IGQzX3NlbGVjdGlvbl9kYXRhTm9kZShncm91cERhdGFbaV0pOworICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IGV4aXROb2Rlc1tpXSA9IG51bGw7CisgICAgICB9CisgICAgICBmb3IgKDsgaSA8IG4xOyArK2kpIHsKKyAgICAgICAgZXhpdE5vZGVzW2ldID0gZ3JvdXBbaV07CisgICAgICAgIGVudGVyTm9kZXNbaV0gPSB1cGRhdGVOb2Rlc1tpXSA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgZW50ZXJOb2Rlcy51cGRhdGUKKyAgICAgICAgPSB1cGRhdGVOb2RlczsKKworICAgIGVudGVyTm9kZXMucGFyZW50Tm9kZQorICAgICAgICA9IHVwZGF0ZU5vZGVzLnBhcmVudE5vZGUKKyAgICAgICAgPSBleGl0Tm9kZXMucGFyZW50Tm9kZQorICAgICAgICA9IGdyb3VwLnBhcmVudE5vZGU7CisKKyAgICBlbnRlci5wdXNoKGVudGVyTm9kZXMpOworICAgIHVwZGF0ZS5wdXNoKHVwZGF0ZU5vZGVzKTsKKyAgICBleGl0LnB1c2goZXhpdE5vZGVzKTsKKyAgfQorCisgIHZhciBlbnRlciA9IGQzX3NlbGVjdGlvbl9lbnRlcihbXSksCisgICAgICB1cGRhdGUgPSBkM19zZWxlY3Rpb24oW10pLAorICAgICAgZXhpdCA9IGQzX3NlbGVjdGlvbihbXSk7CisKKyAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIikgeworICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICBiaW5kKGdyb3VwID0gdGhpc1tpXSwgdmFsdWUuY2FsbChncm91cCwgZ3JvdXAucGFyZW50Tm9kZS5fX2RhdGFfXywgaSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAoKytpIDwgbikgeworICAgICAgYmluZChncm91cCA9IHRoaXNbaV0sIHZhbHVlKTsKKyAgICB9CisgIH0KKworICB1cGRhdGUuZW50ZXIgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGVudGVyOyB9OworICB1cGRhdGUuZXhpdCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gZXhpdDsgfTsKKyAgcmV0dXJuIHVwZGF0ZTsKK307CisKK2Z1bmN0aW9uIGQzX3NlbGVjdGlvbl9kYXRhTm9kZShkYXRhKSB7CisgIHJldHVybiB7X19kYXRhX186IGRhdGF9OworfQorZDNfc2VsZWN0aW9uUHJvdG90eXBlLmRhdHVtID0KK2QzX3NlbGVjdGlvblByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbih2YWx1ZSkgeworICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDEKKyAgICAgID8gdGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iKQorICAgICAgOiB0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsIHZhbHVlKTsKK307CitkM19zZWxlY3Rpb25Qcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24oZmlsdGVyKSB7CisgIHZhciBzdWJncm91cHMgPSBbXSwKKyAgICAgIHN1Ymdyb3VwLAorICAgICAgZ3JvdXAsCisgICAgICBub2RlOworCisgIGlmICh0eXBlb2YgZmlsdGVyICE9PSAiZnVuY3Rpb24iKSBmaWx0ZXIgPSBkM19zZWxlY3Rpb25fZmlsdGVyKGZpbHRlcik7CisKKyAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykgeworICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOworICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSAoZ3JvdXAgPSB0aGlzW2pdKS5wYXJlbnROb2RlOworICAgIGZvciAodmFyIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CisgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgZmlsdGVyLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpIHsKKyAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7Cit9OworCitmdW5jdGlvbiBkM19zZWxlY3Rpb25fZmlsdGVyKHNlbGVjdG9yKSB7CisgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZDNfc2VsZWN0TWF0Y2hlcyh0aGlzLCBzZWxlY3Rvcik7CisgIH07Cit9CitkM19zZWxlY3Rpb25Qcm90b3R5cGUub3JkZXIgPSBmdW5jdGlvbigpIHsKKyAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7CisgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsKKyAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKKyAgICAgICAgaWYgKG5leHQgJiYgbmV4dCAhPT0gbm9kZS5uZXh0U2libGluZykgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTsKKyAgICAgICAgbmV4dCA9IG5vZGU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0aGlzOworfTsKK2QzX3NlbGVjdGlvblByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24oY29tcGFyYXRvcikgeworICBjb21wYXJhdG9yID0gZDNfc2VsZWN0aW9uX3NvcnRDb21wYXJhdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgdGhpc1tqXS5zb3J0KGNvbXBhcmF0b3IpOworICByZXR1cm4gdGhpcy5vcmRlcigpOworfTsKKworZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NvcnRDb21wYXJhdG9yKGNvbXBhcmF0b3IpIHsKKyAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSBjb21wYXJhdG9yID0gZDMuYXNjZW5kaW5nOworICByZXR1cm4gZnVuY3Rpb24oYSwgYikgeworICAgIHJldHVybiBjb21wYXJhdG9yKGEgJiYgYS5fX2RhdGFfXywgYiAmJiBiLl9fZGF0YV9fKTsKKyAgfTsKK30KKy8vIHR5cGUgY2FuIGJlIG5hbWVzcGFjZWQsIGUuZy4sICJjbGljay5mb28iCisvLyBsaXN0ZW5lciBjYW4gYmUgbnVsbCBmb3IgcmVtb3ZhbAorZDNfc2VsZWN0aW9uUHJvdG90eXBlLm9uID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpIHsKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBjYXB0dXJlID0gZmFsc2U7CisKKyAgLy8gcGFyc2UgdGhlIHR5cGUgc3BlY2lmaWVyCisgIHZhciBuYW1lID0gIl9fb24iICsgdHlwZSwgaSA9IHR5cGUuaW5kZXhPZigiLiIpOworICBpZiAoaSA+IDApIHR5cGUgPSB0eXBlLnN1YnN0cmluZygwLCBpKTsKKworICAvLyBpZiBjYWxsZWQgd2l0aCBvbmx5IG9uZSBhcmd1bWVudCwgcmV0dXJuIHRoZSBjdXJyZW50IGxpc3RlbmVyCisgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChpID0gdGhpcy5ub2RlKClbbmFtZV0pICYmIGkuXzsKKworICAvLyByZW1vdmUgdGhlIG9sZCBldmVudCBsaXN0ZW5lciwgYW5kIGFkZCB0aGUgbmV3IGV2ZW50IGxpc3RlbmVyCisgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZCwgaSkgeworICAgIHZhciBub2RlID0gdGhpcywKKyAgICAgICAgbyA9IG5vZGVbbmFtZV07CisKKyAgICAvLyByZW1vdmUgdGhlIG9sZCBsaXN0ZW5lciwgaWYgYW55ICh1c2luZyB0aGUgcHJldmlvdXNseS1zZXQgY2FwdHVyZSkKKyAgICBpZiAobykgeworICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIG8sIG8uJCk7CisgICAgICBkZWxldGUgbm9kZVtuYW1lXTsKKyAgICB9CisKKyAgICAvLyBhZGQgdGhlIG5ldyBsaXN0ZW5lciwgaWYgYW55IChyZW1lbWJlcmluZyB0aGUgY2FwdHVyZSBmbGFnKQorICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIG5vZGVbbmFtZV0gPSBsLCBsLiQgPSBjYXB0dXJlKTsKKyAgICAgIGwuXyA9IGxpc3RlbmVyOyAvLyBzdGFzaCB0aGUgdW53cmFwcGVkIGxpc3RlbmVyIGZvciBnZXQKKyAgICB9CisKKyAgICAvLyB3cmFwcGVkIGV2ZW50IGxpc3RlbmVyIHRoYXQgcHJlc2VydmVzIGkKKyAgICBmdW5jdGlvbiBsKGUpIHsKKyAgICAgIHZhciBvID0gZDMuZXZlbnQ7IC8vIEV2ZW50cyBjYW4gYmUgcmVlbnRyYW50IChlLmcuLCBmb2N1cykuCisgICAgICBkMy5ldmVudCA9IGU7CisgICAgICB0cnkgeworICAgICAgICBsaXN0ZW5lci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGkpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgZDMuZXZlbnQgPSBvOworICAgICAgfQorICAgIH0KKyAgfSk7Cit9OworZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaykgeworICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTspIHsKKyAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjspIHsKKyAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07CisgICAgICBpZiAobm9kZSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRoaXM7Cit9OworLy8KKy8vIE5vdGU6IGFzc2lnbmluZyB0byB0aGUgYXJndW1lbnRzIGFycmF5IHNpbXVsdGFuZW91c2x5IGNoYW5nZXMgdGhlIHZhbHVlIG9mCisvLyB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudCEKKy8vCisvLyBUT0RPIFRoZSBgdGhpc2AgYXJndW1lbnQgcHJvYmFibHkgc2hvdWxkbid0IGJlIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUKKy8vIGNhbGxiYWNrLCBhbnl3YXksIHNpbmNlIGl0J3MgcmVkdW5kYW50LiBIb3dldmVyLCB0aGF0IHdpbGwgcmVxdWlyZSBhIG1ham9yCisvLyB2ZXJzaW9uIGJ1bXAgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzbyBJJ20gbm90IGNoYW5naW5nIGl0IHJpZ2h0CisvLyBhd2F5LgorLy8KK2QzX3NlbGVjdGlvblByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKKyAgY2FsbGJhY2suYXBwbHkodGhpcywgKGFyZ3VtZW50c1swXSA9IHRoaXMsIGFyZ3VtZW50cykpOworICByZXR1cm4gdGhpczsKK307CitkM19zZWxlY3Rpb25Qcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuICF0aGlzLm5vZGUoKTsKK307CitkM19zZWxlY3Rpb25Qcm90b3R5cGUubm9kZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CisgIGZvciAodmFyIGogPSAwLCBtID0gdGhpcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKKyAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CisgICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldOworICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlOworICAgIH0KKyAgfQorICByZXR1cm4gbnVsbDsKK307CitkM19zZWxlY3Rpb25Qcm90b3R5cGUudHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgc3ViZ3JvdXBzID0gW10sCisgICAgICBzdWJncm91cCwKKyAgICAgIG5vZGU7CisKKyAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7CisgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7CisgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7CisgICAgICBzdWJncm91cC5wdXNoKChub2RlID0gZ3JvdXBbaV0pID8ge25vZGU6IG5vZGUsIGRlbGF5OiBkM190cmFuc2l0aW9uRGVsYXksIGR1cmF0aW9uOiBkM190cmFuc2l0aW9uRHVyYXRpb259IDogbnVsbCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCBkM190cmFuc2l0aW9uSWQgfHwgKytkM190cmFuc2l0aW9uTmV4dElkLCBEYXRlLm5vdygpKTsKK307Cit2YXIgZDNfc2VsZWN0aW9uUm9vdCA9IGQzX3NlbGVjdGlvbihbW2RvY3VtZW50XV0pOworCitkM19zZWxlY3Rpb25Sb290WzBdLnBhcmVudE5vZGUgPSBkM19zZWxlY3RSb290OworCisvLyBUT0RPIGZhc3Qgc2luZ2xldG9uIGltcGxlbWVudGF0aW9uIQorLy8gVE9ETyBzZWxlY3QoZnVuY3Rpb24pCitkMy5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3RvcikgeworICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIgorICAgICAgPyBkM19zZWxlY3Rpb25Sb290LnNlbGVjdChzZWxlY3RvcikKKyAgICAgIDogZDNfc2VsZWN0aW9uKFtbc2VsZWN0b3JdXSk7IC8vIGFzc3VtZSBub2RlCit9OworCisvLyBUT0RPIHNlbGVjdEFsbChmdW5jdGlvbikKK2QzLnNlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CisgIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciCisgICAgICA/IGQzX3NlbGVjdGlvblJvb3Quc2VsZWN0QWxsKHNlbGVjdG9yKQorICAgICAgOiBkM19zZWxlY3Rpb24oW2QzX2FycmF5KHNlbGVjdG9yKV0pOyAvLyBhc3N1bWUgbm9kZVtdCit9OworZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2VudGVyKHNlbGVjdGlvbikgeworICBkM19hcnJheVN1YmNsYXNzKHNlbGVjdGlvbiwgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlKTsKKyAgcmV0dXJuIHNlbGVjdGlvbjsKK30KKwordmFyIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZSA9IFtdOworCitkMy5zZWxlY3Rpb24uZW50ZXIgPSBkM19zZWxlY3Rpb25fZW50ZXI7CitkMy5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlID0gZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlOworCitkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUuYXBwZW5kID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmFwcGVuZDsKK2QzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5pbnNlcnQgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuaW5zZXJ0OworZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLmVtcHR5ID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVtcHR5OworZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLm5vZGUgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUubm9kZTsKK2QzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3RvcikgeworICB2YXIgc3ViZ3JvdXBzID0gW10sCisgICAgICBzdWJncm91cCwKKyAgICAgIHN1Ym5vZGUsCisgICAgICB1cGdyb3VwLAorICAgICAgZ3JvdXAsCisgICAgICBub2RlOworCisgIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgeworICAgIHVwZ3JvdXAgPSAoZ3JvdXAgPSB0aGlzW2pdKS51cGRhdGU7CisgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7CisgICAgc3ViZ3JvdXAucGFyZW50Tm9kZSA9IGdyb3VwLnBhcmVudE5vZGU7CisgICAgZm9yICh2YXIgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOykgeworICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgeworICAgICAgICBzdWJncm91cC5wdXNoKHVwZ3JvdXBbaV0gPSBzdWJub2RlID0gc2VsZWN0b3IuY2FsbChncm91cC5wYXJlbnROb2RlLCBub2RlLl9fZGF0YV9fLCBpKSk7CisgICAgICAgIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7Cit9OworZnVuY3Rpb24gZDNfdHJhbnNpdGlvbihncm91cHMsIGlkLCB0aW1lKSB7CisgIGQzX2FycmF5U3ViY2xhc3MoZ3JvdXBzLCBkM190cmFuc2l0aW9uUHJvdG90eXBlKTsKKworICB2YXIgdHdlZW5zID0gbmV3IGQzX01hcCwKKyAgICAgIGV2ZW50ID0gZDMuZGlzcGF0Y2goInN0YXJ0IiwgImVuZCIpLAorICAgICAgZWFzZSA9IGQzX3RyYW5zaXRpb25FYXNlOworCisgIGdyb3Vwcy5pZCA9IGlkOworCisgIGdyb3Vwcy50aW1lID0gdGltZTsKKworICBncm91cHMudHdlZW4gPSBmdW5jdGlvbihuYW1lLCB0d2VlbikgeworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHR3ZWVucy5nZXQobmFtZSk7CisgICAgaWYgKHR3ZWVuID09IG51bGwpIHR3ZWVucy5yZW1vdmUobmFtZSk7CisgICAgZWxzZSB0d2VlbnMuc2V0KG5hbWUsIHR3ZWVuKTsKKyAgICByZXR1cm4gZ3JvdXBzOworICB9OworCisgIGdyb3Vwcy5lYXNlID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBlYXNlOworICAgIGVhc2UgPSB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyB2YWx1ZSA6IGQzLmVhc2UuYXBwbHkoZDMsIGFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGdyb3VwczsKKyAgfTsKKworICBncm91cHMuZWFjaCA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gZDNfdHJhbnNpdGlvbl9lYWNoLmNhbGwoZ3JvdXBzLCB0eXBlKTsKKyAgICBldmVudC5vbih0eXBlLCBsaXN0ZW5lcik7CisgICAgcmV0dXJuIGdyb3VwczsKKyAgfTsKKworICBkMy50aW1lcihmdW5jdGlvbihlbGFwc2VkKSB7CisgICAgZ3JvdXBzLmVhY2goZnVuY3Rpb24oZCwgaSwgaikgeworICAgICAgdmFyIHR3ZWVuZWQgPSBbXSwKKyAgICAgICAgICBub2RlID0gdGhpcywKKyAgICAgICAgICBkZWxheSA9IGdyb3Vwc1tqXVtpXS5kZWxheSwKKyAgICAgICAgICBkdXJhdGlvbiA9IGdyb3Vwc1tqXVtpXS5kdXJhdGlvbiwKKyAgICAgICAgICBsb2NrID0gbm9kZS5fX3RyYW5zaXRpb25fXyB8fCAobm9kZS5fX3RyYW5zaXRpb25fXyA9IHthY3RpdmU6IDAsIGNvdW50OiAwfSk7CisKKyAgICAgICsrbG9jay5jb3VudDsKKworICAgICAgZGVsYXkgPD0gZWxhcHNlZCA/IHN0YXJ0KGVsYXBzZWQpIDogZDMudGltZXIoc3RhcnQsIGRlbGF5LCB0aW1lKTsKKworICAgICAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkgeworICAgICAgICBpZiAobG9jay5hY3RpdmUgPiBpZCkgcmV0dXJuIHN0b3AoKTsKKyAgICAgICAgbG9jay5hY3RpdmUgPSBpZDsKKworICAgICAgICB0d2VlbnMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgICAgICAgaWYgKHR3ZWVuID0gdmFsdWUuY2FsbChub2RlLCBkLCBpKSkgeworICAgICAgICAgICAgdHdlZW5lZC5wdXNoKHR3ZWVuKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGV2ZW50LnN0YXJ0LmNhbGwobm9kZSwgZCwgaSk7CisgICAgICAgIGlmICghdGljayhlbGFwc2VkKSkgZDMudGltZXIodGljaywgMCwgdGltZSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHsKKyAgICAgICAgaWYgKGxvY2suYWN0aXZlICE9PSBpZCkgcmV0dXJuIHN0b3AoKTsKKworICAgICAgICB2YXIgdCA9IChlbGFwc2VkIC0gZGVsYXkpIC8gZHVyYXRpb24sCisgICAgICAgICAgICBlID0gZWFzZSh0KSwKKyAgICAgICAgICAgIG4gPSB0d2VlbmVkLmxlbmd0aDsKKworICAgICAgICB3aGlsZSAobiA+IDApIHsKKyAgICAgICAgICB0d2VlbmVkWy0tbl0uY2FsbChub2RlLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0ID49IDEpIHsKKyAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgZDNfdHJhbnNpdGlvbklkID0gaWQ7CisgICAgICAgICAgZXZlbnQuZW5kLmNhbGwobm9kZSwgZCwgaSk7CisgICAgICAgICAgZDNfdHJhbnNpdGlvbklkID0gMDsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmdW5jdGlvbiBzdG9wKCkgeworICAgICAgICBpZiAoIS0tbG9jay5jb3VudCkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uX187CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0pOworICAgIHJldHVybiAxOworICB9LCAwLCB0aW1lKTsKKworICByZXR1cm4gZ3JvdXBzOworfQorCit2YXIgZDNfdHJhbnNpdGlvblJlbW92ZSA9IHt9OworCitmdW5jdGlvbiBkM190cmFuc2l0aW9uTnVsbChkLCBpLCBhKSB7CisgIHJldHVybiBhICE9ICIiICYmIGQzX3RyYW5zaXRpb25SZW1vdmU7Cit9CisKK2Z1bmN0aW9uIGQzX3RyYW5zaXRpb25Ud2VlbihuYW1lLCBiKSB7CisgIHZhciBpbnRlcnBvbGF0ZSA9IGQzX2ludGVycG9sYXRlQnlOYW1lKG5hbWUpOworCisgIGZ1bmN0aW9uIHRyYW5zaXRpb25GdW5jdGlvbihkLCBpLCBhKSB7CisgICAgdmFyIHYgPSBiLmNhbGwodGhpcywgZCwgaSk7CisgICAgcmV0dXJuIHYgPT0gbnVsbAorICAgICAgICA/IGEgIT0gIiIgJiYgZDNfdHJhbnNpdGlvblJlbW92ZQorICAgICAgICA6IGEgIT0gdiAmJiBpbnRlcnBvbGF0ZShhLCB2KTsKKyAgfQorCisgIGZ1bmN0aW9uIHRyYW5zaXRpb25TdHJpbmcoZCwgaSwgYSkgeworICAgIHJldHVybiBhICE9IGIgJiYgaW50ZXJwb2xhdGUoYSwgYik7CisgIH0KKworICByZXR1cm4gdHlwZW9mIGIgPT09ICJmdW5jdGlvbiIgPyB0cmFuc2l0aW9uRnVuY3Rpb24KKyAgICAgIDogYiA9PSBudWxsID8gZDNfdHJhbnNpdGlvbk51bGwKKyAgICAgIDogKGIgKz0gIiIsIHRyYW5zaXRpb25TdHJpbmcpOworfQorCit2YXIgZDNfdHJhbnNpdGlvblByb3RvdHlwZSA9IFtdLAorICAgIGQzX3RyYW5zaXRpb25OZXh0SWQgPSAwLAorICAgIGQzX3RyYW5zaXRpb25JZCA9IDAsCisgICAgZDNfdHJhbnNpdGlvbkRlZmF1bHREZWxheSA9IDAsCisgICAgZDNfdHJhbnNpdGlvbkRlZmF1bHREdXJhdGlvbiA9IDI1MCwKKyAgICBkM190cmFuc2l0aW9uRGVmYXVsdEVhc2UgPSBkMy5lYXNlKCJjdWJpYy1pbi1vdXQiKSwKKyAgICBkM190cmFuc2l0aW9uRGVsYXkgPSBkM190cmFuc2l0aW9uRGVmYXVsdERlbGF5LAorICAgIGQzX3RyYW5zaXRpb25EdXJhdGlvbiA9IGQzX3RyYW5zaXRpb25EZWZhdWx0RHVyYXRpb24sCisgICAgZDNfdHJhbnNpdGlvbkVhc2UgPSBkM190cmFuc2l0aW9uRGVmYXVsdEVhc2U7CisKK2QzX3RyYW5zaXRpb25Qcm90b3R5cGUuY2FsbCA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5jYWxsOworCitkMy50cmFuc2l0aW9uID0gZnVuY3Rpb24oc2VsZWN0aW9uKSB7CisgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCisgICAgICA/IChkM190cmFuc2l0aW9uSWQgPyBzZWxlY3Rpb24udHJhbnNpdGlvbigpIDogc2VsZWN0aW9uKQorICAgICAgOiBkM19zZWxlY3Rpb25Sb290LnRyYW5zaXRpb24oKTsKK307CisKK2QzLnRyYW5zaXRpb24ucHJvdG90eXBlID0gZDNfdHJhbnNpdGlvblByb3RvdHlwZTsKK2QzX3RyYW5zaXRpb25Qcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKKyAgdmFyIHN1Ymdyb3VwcyA9IFtdLAorICAgICAgc3ViZ3JvdXAsCisgICAgICBzdWJub2RlLAorICAgICAgbm9kZTsKKworICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAiZnVuY3Rpb24iKSBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvcihzZWxlY3Rvcik7CisKKyAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7CisgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7CisgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7CisgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3Rvci5jYWxsKG5vZGUubm9kZSwgbm9kZS5ub2RlLl9fZGF0YV9fLCBpKSkpIHsKKyAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZS5ub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5ub2RlLl9fZGF0YV9fOworICAgICAgICBzdWJncm91cC5wdXNoKHtub2RlOiBzdWJub2RlLCBkZWxheTogbm9kZS5kZWxheSwgZHVyYXRpb246IG5vZGUuZHVyYXRpb259KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN1Ymdyb3VwLnB1c2gobnVsbCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLmlkLCB0aGlzLnRpbWUpLmVhc2UodGhpcy5lYXNlKCkpOworfTsKK2QzX3RyYW5zaXRpb25Qcm90b3R5cGUuc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKKyAgdmFyIHN1Ymdyb3VwcyA9IFtdLAorICAgICAgc3ViZ3JvdXAsCisgICAgICBzdWJub2RlcywKKyAgICAgIG5vZGU7CisKKyAgaWYgKHR5cGVvZiBzZWxlY3RvciAhPT0gImZ1bmN0aW9uIikgc2VsZWN0b3IgPSBkM19zZWxlY3Rpb25fc2VsZWN0b3JBbGwoc2VsZWN0b3IpOworCisgIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgeworICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOykgeworICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgeworICAgICAgICBzdWJub2RlcyA9IHNlbGVjdG9yLmNhbGwobm9kZS5ub2RlLCBub2RlLm5vZGUuX19kYXRhX18sIGkpOworICAgICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTsKKyAgICAgICAgZm9yICh2YXIgayA9IC0xLCBvID0gc3Vibm9kZXMubGVuZ3RoOyArK2sgPCBvOykgeworICAgICAgICAgIHN1Ymdyb3VwLnB1c2goe25vZGU6IHN1Ym5vZGVzW2tdLCBkZWxheTogbm9kZS5kZWxheSwgZHVyYXRpb246IG5vZGUuZHVyYXRpb259KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5pZCwgdGhpcy50aW1lKS5lYXNlKHRoaXMuZWFzZSgpKTsKK307CitkM190cmFuc2l0aW9uUHJvdG90eXBlLmF0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgeworICByZXR1cm4gdGhpcy5hdHRyVHdlZW4obmFtZSwgZDNfdHJhbnNpdGlvblR3ZWVuKG5hbWUsIHZhbHVlKSk7Cit9OworCitkM190cmFuc2l0aW9uUHJvdG90eXBlLmF0dHJUd2VlbiA9IGZ1bmN0aW9uKG5hbWVOUywgdHdlZW4pIHsKKyAgdmFyIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWVOUyk7CisKKyAgZnVuY3Rpb24gYXR0clR3ZWVuKGQsIGkpIHsKKyAgICB2YXIgZiA9IHR3ZWVuLmNhbGwodGhpcywgZCwgaSwgdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSkpOworICAgIHJldHVybiBmID09PSBkM190cmFuc2l0aW9uUmVtb3ZlCisgICAgICAgID8gKHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpLCBudWxsKQorICAgICAgICA6IGYgJiYgZnVuY3Rpb24odCkgeyB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBmKHQpKTsgfTsKKyAgfQorCisgIGZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGQsIGkpIHsKKyAgICB2YXIgZiA9IHR3ZWVuLmNhbGwodGhpcywgZCwgaSwgdGhpcy5nZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSk7CisgICAgcmV0dXJuIGYgPT09IGQzX3RyYW5zaXRpb25SZW1vdmUKKyAgICAgICAgPyAodGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSwgbnVsbCkKKyAgICAgICAgOiBmICYmIGZ1bmN0aW9uKHQpIHsgdGhpcy5zZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsLCBmKHQpKTsgfTsKKyAgfQorCisgIHJldHVybiB0aGlzLnR3ZWVuKCJhdHRyLiIgKyBuYW1lTlMsIG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2Vlbik7Cit9OworZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zdHlsZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgeworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHByaW9yaXR5ID0gIiI7CisgIHJldHVybiB0aGlzLnN0eWxlVHdlZW4obmFtZSwgZDNfdHJhbnNpdGlvblR3ZWVuKG5hbWUsIHZhbHVlKSwgcHJpb3JpdHkpOworfTsKKworZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zdHlsZVR3ZWVuID0gZnVuY3Rpb24obmFtZSwgdHdlZW4sIHByaW9yaXR5KSB7CisgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgcHJpb3JpdHkgPSAiIjsKKyAgcmV0dXJuIHRoaXMudHdlZW4oInN0eWxlLiIgKyBuYW1lLCBmdW5jdGlvbihkLCBpKSB7CisgICAgdmFyIGYgPSB0d2Vlbi5jYWxsKHRoaXMsIGQsIGksIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSkpOworICAgIHJldHVybiBmID09PSBkM190cmFuc2l0aW9uUmVtb3ZlCisgICAgICAgID8gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIG51bGwpCisgICAgICAgIDogZiAmJiBmdW5jdGlvbih0KSB7IHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgZih0KSwgcHJpb3JpdHkpOyB9OworICB9KTsKK307CitkM190cmFuc2l0aW9uUHJvdG90eXBlLnRleHQgPSBmdW5jdGlvbih2YWx1ZSkgeworICByZXR1cm4gdGhpcy50d2VlbigidGV4dCIsIGZ1bmN0aW9uKGQsIGkpIHsKKyAgICB0aGlzLnRleHRDb250ZW50ID0gdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCisgICAgICAgID8gdmFsdWUuY2FsbCh0aGlzLCBkLCBpKQorICAgICAgICA6IHZhbHVlOworICB9KTsKK307CitkM190cmFuc2l0aW9uUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5lYWNoKCJlbmQudHJhbnNpdGlvbiIsIGZ1bmN0aW9uKCkgeworICAgIHZhciBwOworICAgIGlmICghdGhpcy5fX3RyYW5zaXRpb25fXyAmJiAocCA9IHRoaXMucGFyZW50Tm9kZSkpIHAucmVtb3ZlQ2hpbGQodGhpcyk7CisgIH0pOworfTsKK2QzX3RyYW5zaXRpb25Qcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbih2YWx1ZSkgeworICB2YXIgZ3JvdXBzID0gdGhpczsKKyAgcmV0dXJuIGdyb3Vwcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgorICAgICAgPyBmdW5jdGlvbihkLCBpLCBqKSB7IGdyb3Vwc1tqXVtpXS5kZWxheSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfCAwOyB9CisgICAgICA6ICh2YWx1ZSA9IHZhbHVlIHwgMCwgZnVuY3Rpb24oZCwgaSwgaikgeyBncm91cHNbal1baV0uZGVsYXkgPSB2YWx1ZTsgfSkpOworfTsKK2QzX3RyYW5zaXRpb25Qcm90b3R5cGUuZHVyYXRpb24gPSBmdW5jdGlvbih2YWx1ZSkgeworICB2YXIgZ3JvdXBzID0gdGhpczsKKyAgcmV0dXJuIGdyb3Vwcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgorICAgICAgPyBmdW5jdGlvbihkLCBpLCBqKSB7IGdyb3Vwc1tqXVtpXS5kdXJhdGlvbiA9IE1hdGgubWF4KDEsIHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfCAwKTsgfQorICAgICAgOiAodmFsdWUgPSBNYXRoLm1heCgxLCB2YWx1ZSB8IDApLCBmdW5jdGlvbihkLCBpLCBqKSB7IGdyb3Vwc1tqXVtpXS5kdXJhdGlvbiA9IHZhbHVlOyB9KSk7Cit9OworZnVuY3Rpb24gZDNfdHJhbnNpdGlvbl9lYWNoKGNhbGxiYWNrKSB7CisgIHZhciBpZCA9IGQzX3RyYW5zaXRpb25JZCwKKyAgICAgIGVhc2UgPSBkM190cmFuc2l0aW9uRWFzZSwKKyAgICAgIGRlbGF5ID0gZDNfdHJhbnNpdGlvbkRlbGF5LAorICAgICAgZHVyYXRpb24gPSBkM190cmFuc2l0aW9uRHVyYXRpb247CisKKyAgZDNfdHJhbnNpdGlvbklkID0gdGhpcy5pZDsKKyAgZDNfdHJhbnNpdGlvbkVhc2UgPSB0aGlzLmVhc2UoKTsKKyAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykgeworICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyBpKyspIHsKKyAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07CisgICAgICBpZiAobm9kZSkgeworICAgICAgICBkM190cmFuc2l0aW9uRGVsYXkgPSB0aGlzW2pdW2ldLmRlbGF5OworICAgICAgICBkM190cmFuc2l0aW9uRHVyYXRpb24gPSB0aGlzW2pdW2ldLmR1cmF0aW9uOworICAgICAgICBjYWxsYmFjay5jYWxsKG5vZGUgPSBub2RlLm5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGQzX3RyYW5zaXRpb25JZCA9IGlkOworICBkM190cmFuc2l0aW9uRWFzZSA9IGVhc2U7CisgIGQzX3RyYW5zaXRpb25EZWxheSA9IGRlbGF5OworICBkM190cmFuc2l0aW9uRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgcmV0dXJuIHRoaXM7Cit9CitkM190cmFuc2l0aW9uUHJvdG90eXBlLnRyYW5zaXRpb24gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuc2VsZWN0KGQzX3RoaXMpOworfTsKK3ZhciBkM190aW1lcl9xdWV1ZSA9IG51bGwsCisgICAgZDNfdGltZXJfaW50ZXJ2YWwsIC8vIGlzIGFuIGludGVydmFsIChvciBmcmFtZSkgYWN0aXZlPworICAgIGQzX3RpbWVyX3RpbWVvdXQ7IC8vIGlzIGEgdGltZW91dCBhY3RpdmU/CisKKy8vIFRoZSB0aW1lciB3aWxsIGNvbnRpbnVlIHRvIGZpcmUgdW50aWwgY2FsbGJhY2sgcmV0dXJucyB0cnVlLgorZDMudGltZXIgPSBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRoZW4pIHsKKyAgdmFyIGZvdW5kID0gZmFsc2UsCisgICAgICB0MCwKKyAgICAgIHQxID0gZDNfdGltZXJfcXVldWU7CisKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBkZWxheSA9IDA7CisgICAgZWxzZSBpZiAoIWlzRmluaXRlKGRlbGF5KSkgcmV0dXJuOworICAgIHRoZW4gPSBEYXRlLm5vdygpOworICB9CisKKyAgLy8gU2VlIGlmIHRoZSBjYWxsYmFjaydzIGFscmVhZHkgaW4gdGhlIHF1ZXVlLgorICB3aGlsZSAodDEpIHsKKyAgICBpZiAodDEuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSB7CisgICAgICB0MS50aGVuID0gdGhlbjsKKyAgICAgIHQxLmRlbGF5ID0gZGVsYXk7CisgICAgICBmb3VuZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgdDAgPSB0MTsKKyAgICB0MSA9IHQxLm5leHQ7CisgIH0KKworICAvLyBPdGhlcndpc2UsIGFkZCB0aGUgY2FsbGJhY2sgdG8gdGhlIHF1ZXVlLgorICBpZiAoIWZvdW5kKSBkM190aW1lcl9xdWV1ZSA9IHsKKyAgICBjYWxsYmFjazogY2FsbGJhY2ssCisgICAgdGhlbjogdGhlbiwKKyAgICBkZWxheTogZGVsYXksCisgICAgbmV4dDogZDNfdGltZXJfcXVldWUKKyAgfTsKKworICAvLyBTdGFydCBhbmltYXRpbichCisgIGlmICghZDNfdGltZXJfaW50ZXJ2YWwpIHsKKyAgICBkM190aW1lcl90aW1lb3V0ID0gY2xlYXJUaW1lb3V0KGQzX3RpbWVyX3RpbWVvdXQpOworICAgIGQzX3RpbWVyX2ludGVydmFsID0gMTsKKyAgICBkM190aW1lcl9mcmFtZShkM190aW1lcl9zdGVwKTsKKyAgfQorfQorCitmdW5jdGlvbiBkM190aW1lcl9zdGVwKCkgeworICB2YXIgZWxhcHNlZCwKKyAgICAgIG5vdyA9IERhdGUubm93KCksCisgICAgICB0MSA9IGQzX3RpbWVyX3F1ZXVlOworCisgIHdoaWxlICh0MSkgeworICAgIGVsYXBzZWQgPSBub3cgLSB0MS50aGVuOworICAgIGlmIChlbGFwc2VkID49IHQxLmRlbGF5KSB0MS5mbHVzaCA9IHQxLmNhbGxiYWNrKGVsYXBzZWQpOworICAgIHQxID0gdDEubmV4dDsKKyAgfQorCisgIHZhciBkZWxheSA9IGQzX3RpbWVyX2ZsdXNoKCkgLSBub3c7CisgIGlmIChkZWxheSA+IDI0KSB7CisgICAgaWYgKGlzRmluaXRlKGRlbGF5KSkgeworICAgICAgY2xlYXJUaW1lb3V0KGQzX3RpbWVyX3RpbWVvdXQpOworICAgICAgZDNfdGltZXJfdGltZW91dCA9IHNldFRpbWVvdXQoZDNfdGltZXJfc3RlcCwgZGVsYXkpOworICAgIH0KKyAgICBkM190aW1lcl9pbnRlcnZhbCA9IDA7CisgIH0gZWxzZSB7CisgICAgZDNfdGltZXJfaW50ZXJ2YWwgPSAxOworICAgIGQzX3RpbWVyX2ZyYW1lKGQzX3RpbWVyX3N0ZXApOworICB9Cit9CisKK2QzLnRpbWVyLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHZhciBlbGFwc2VkLAorICAgICAgbm93ID0gRGF0ZS5ub3coKSwKKyAgICAgIHQxID0gZDNfdGltZXJfcXVldWU7CisKKyAgd2hpbGUgKHQxKSB7CisgICAgZWxhcHNlZCA9IG5vdyAtIHQxLnRoZW47CisgICAgaWYgKCF0MS5kZWxheSkgdDEuZmx1c2ggPSB0MS5jYWxsYmFjayhlbGFwc2VkKTsKKyAgICB0MSA9IHQxLm5leHQ7CisgIH0KKworICBkM190aW1lcl9mbHVzaCgpOworfTsKKworLy8gRmx1c2ggYWZ0ZXIgY2FsbGJhY2tzLCB0byBhdm9pZCBjb25jdXJyZW50IHF1ZXVlIG1vZGlmaWNhdGlvbi4KK2Z1bmN0aW9uIGQzX3RpbWVyX2ZsdXNoKCkgeworICB2YXIgdDAgPSBudWxsLAorICAgICAgdDEgPSBkM190aW1lcl9xdWV1ZSwKKyAgICAgIHRoZW4gPSBJbmZpbml0eTsKKyAgd2hpbGUgKHQxKSB7CisgICAgaWYgKHQxLmZsdXNoKSB7CisgICAgICB0MSA9IHQwID8gdDAubmV4dCA9IHQxLm5leHQgOiBkM190aW1lcl9xdWV1ZSA9IHQxLm5leHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoZW4gPSBNYXRoLm1pbih0aGVuLCB0MS50aGVuICsgdDEuZGVsYXkpOworICAgICAgdDEgPSAodDAgPSB0MSkubmV4dDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRoZW47Cit9CisKK3ZhciBkM190aW1lcl9mcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUKKyAgICB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lCisgICAgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZQorICAgIHx8IHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lCisgICAgfHwgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lCisgICAgfHwgZnVuY3Rpb24oY2FsbGJhY2spIHsgc2V0VGltZW91dChjYWxsYmFjaywgMTcpOyB9OworZDMudHJhbnNmb3JtID0gZnVuY3Rpb24oc3RyaW5nKSB7CisgIHZhciBnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGQzLm5zLnByZWZpeC5zdmcsICJnIiksCisgICAgICBpZGVudGl0eSA9IHthOiAxLCBiOiAwLCBjOiAwLCBkOiAxLCBlOiAwLCBmOiAwfTsKKyAgcmV0dXJuIChkMy50cmFuc2Zvcm0gPSBmdW5jdGlvbihzdHJpbmcpIHsKKyAgICBnLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwgc3RyaW5nKTsKKyAgICB2YXIgdCA9IGcudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKTsKKyAgICByZXR1cm4gbmV3IGQzX3RyYW5zZm9ybSh0ID8gdC5tYXRyaXggOiBpZGVudGl0eSk7CisgIH0pKHN0cmluZyk7Cit9OworCisvLyBDb21wdXRlIHgtc2NhbGUgYW5kIG5vcm1hbGl6ZSB0aGUgZmlyc3Qgcm93LgorLy8gQ29tcHV0ZSBzaGVhciBhbmQgbWFrZSBzZWNvbmQgcm93IG9ydGhvZ29uYWwgdG8gZmlyc3QuCisvLyBDb21wdXRlIHktc2NhbGUgYW5kIG5vcm1hbGl6ZSB0aGUgc2Vjb25kIHJvdy4KKy8vIEZpbmFsbHksIGNvbXB1dGUgdGhlIHJvdGF0aW9uLgorZnVuY3Rpb24gZDNfdHJhbnNmb3JtKG0pIHsKKyAgdmFyIHIwID0gW20uYSwgbS5iXSwKKyAgICAgIHIxID0gW20uYywgbS5kXSwKKyAgICAgIGt4ID0gZDNfdHJhbnNmb3JtTm9ybWFsaXplKHIwKSwKKyAgICAgIGt6ID0gZDNfdHJhbnNmb3JtRG90KHIwLCByMSksCisgICAgICBreSA9IGQzX3RyYW5zZm9ybU5vcm1hbGl6ZShkM190cmFuc2Zvcm1Db21iaW5lKHIxLCByMCwgLWt6KSkgfHwgMDsKKyAgaWYgKHIwWzBdICogcjFbMV0gPCByMVswXSAqIHIwWzFdKSB7CisgICAgcjBbMF0gKj0gLTE7CisgICAgcjBbMV0gKj0gLTE7CisgICAga3ggKj0gLTE7CisgICAga3ogKj0gLTE7CisgIH0KKyAgdGhpcy5yb3RhdGUgPSAoa3ggPyBNYXRoLmF0YW4yKHIwWzFdLCByMFswXSkgOiBNYXRoLmF0YW4yKC1yMVswXSwgcjFbMV0pKSAqIGQzX3RyYW5zZm9ybURlZ3JlZXM7CisgIHRoaXMudHJhbnNsYXRlID0gW20uZSwgbS5mXTsKKyAgdGhpcy5zY2FsZSA9IFtreCwga3ldOworICB0aGlzLnNrZXcgPSBreSA/IE1hdGguYXRhbjIoa3osIGt5KSAqIGQzX3RyYW5zZm9ybURlZ3JlZXMgOiAwOworfTsKKworZDNfdHJhbnNmb3JtLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gInRyYW5zbGF0ZSgiICsgdGhpcy50cmFuc2xhdGUKKyAgICAgICsgIilyb3RhdGUoIiArIHRoaXMucm90YXRlCisgICAgICArICIpc2tld1goIiArIHRoaXMuc2tldworICAgICAgKyAiKXNjYWxlKCIgKyB0aGlzLnNjYWxlCisgICAgICArICIpIjsKK307CisKK2Z1bmN0aW9uIGQzX3RyYW5zZm9ybURvdChhLCBiKSB7CisgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdOworfQorCitmdW5jdGlvbiBkM190cmFuc2Zvcm1Ob3JtYWxpemUoYSkgeworICB2YXIgayA9IE1hdGguc3FydChkM190cmFuc2Zvcm1Eb3QoYSwgYSkpOworICBpZiAoaykgeworICAgIGFbMF0gLz0gazsKKyAgICBhWzFdIC89IGs7CisgIH0KKyAgcmV0dXJuIGs7Cit9CisKK2Z1bmN0aW9uIGQzX3RyYW5zZm9ybUNvbWJpbmUoYSwgYiwgaykgeworICBhWzBdICs9IGsgKiBiWzBdOworICBhWzFdICs9IGsgKiBiWzFdOworICByZXR1cm4gYTsKK30KKwordmFyIGQzX3RyYW5zZm9ybURlZ3JlZXMgPSAxODAgLyBNYXRoLlBJOworZDMubW91c2UgPSBmdW5jdGlvbihjb250YWluZXIpIHsKKyAgcmV0dXJuIGQzX21vdXNlUG9pbnQoY29udGFpbmVyLCBkM19ldmVudFNvdXJjZSgpKTsKK307CisKKy8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NDA4MwordmFyIGQzX21vdXNlX2J1ZzQ0MDgzID0gL1dlYktpdC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA/IC0xIDogMDsKKworZnVuY3Rpb24gZDNfbW91c2VQb2ludChjb250YWluZXIsIGUpIHsKKyAgdmFyIHN2ZyA9IGNvbnRhaW5lci5vd25lclNWR0VsZW1lbnQgfHwgY29udGFpbmVyOworICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7CisgICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7CisgICAgaWYgKChkM19tb3VzZV9idWc0NDA4MyA8IDApICYmICh3aW5kb3cuc2Nyb2xsWCB8fCB3aW5kb3cuc2Nyb2xsWSkpIHsKKyAgICAgIHN2ZyA9IGQzLnNlbGVjdChkb2N1bWVudC5ib2R5KQorICAgICAgICAuYXBwZW5kKCJzdmciKQorICAgICAgICAgIC5zdHlsZSgicG9zaXRpb24iLCAiYWJzb2x1dGUiKQorICAgICAgICAgIC5zdHlsZSgidG9wIiwgMCkKKyAgICAgICAgICAuc3R5bGUoImxlZnQiLCAwKTsKKyAgICAgIHZhciBjdG0gPSBzdmdbMF1bMF0uZ2V0U2NyZWVuQ1RNKCk7CisgICAgICBkM19tb3VzZV9idWc0NDA4MyA9ICEoY3RtLmYgfHwgY3RtLmUpOworICAgICAgc3ZnLnJlbW92ZSgpOworICAgIH0KKyAgICBpZiAoZDNfbW91c2VfYnVnNDQwODMpIHsKKyAgICAgIHBvaW50LnggPSBlLnBhZ2VYOworICAgICAgcG9pbnQueSA9IGUucGFnZVk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBvaW50LnggPSBlLmNsaWVudFg7CisgICAgICBwb2ludC55ID0gZS5jbGllbnRZOworICAgIH0KKyAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShjb250YWluZXIuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTsKKyAgICByZXR1cm4gW3BvaW50LngsIHBvaW50LnldOworICB9CisgIHZhciByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOworICByZXR1cm4gW2UuY2xpZW50WCAtIHJlY3QubGVmdCAtIGNvbnRhaW5lci5jbGllbnRMZWZ0LCBlLmNsaWVudFkgLSByZWN0LnRvcCAtIGNvbnRhaW5lci5jbGllbnRUb3BdOworfTsKK2QzLnRvdWNoZXMgPSBmdW5jdGlvbihjb250YWluZXIsIHRvdWNoZXMpIHsKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB0b3VjaGVzID0gZDNfZXZlbnRTb3VyY2UoKS50b3VjaGVzOworICByZXR1cm4gdG91Y2hlcyA/IGQzX2FycmF5KHRvdWNoZXMpLm1hcChmdW5jdGlvbih0b3VjaCkgeworICAgIHZhciBwb2ludCA9IGQzX21vdXNlUG9pbnQoY29udGFpbmVyLCB0b3VjaCk7CisgICAgcG9pbnQuaWRlbnRpZmllciA9IHRvdWNoLmlkZW50aWZpZXI7CisgICAgcmV0dXJuIHBvaW50OworICB9KSA6IFtdOworfTsKK2Z1bmN0aW9uIGQzX25vb3AoKSB7fQorZDMuc2NhbGUgPSB7fTsKKworZnVuY3Rpb24gZDNfc2NhbGVFeHRlbnQoZG9tYWluKSB7CisgIHZhciBzdGFydCA9IGRvbWFpblswXSwgc3RvcCA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV07CisgIHJldHVybiBzdGFydCA8IHN0b3AgPyBbc3RhcnQsIHN0b3BdIDogW3N0b3AsIHN0YXJ0XTsKK30KKworZnVuY3Rpb24gZDNfc2NhbGVSYW5nZShzY2FsZSkgeworICByZXR1cm4gc2NhbGUucmFuZ2VFeHRlbnQgPyBzY2FsZS5yYW5nZUV4dGVudCgpIDogZDNfc2NhbGVFeHRlbnQoc2NhbGUucmFuZ2UoKSk7Cit9CitmdW5jdGlvbiBkM19zY2FsZV9uaWNlKGRvbWFpbiwgbmljZSkgeworICB2YXIgaTAgPSAwLAorICAgICAgaTEgPSBkb21haW4ubGVuZ3RoIC0gMSwKKyAgICAgIHgwID0gZG9tYWluW2kwXSwKKyAgICAgIHgxID0gZG9tYWluW2kxXSwKKyAgICAgIGR4OworCisgIGlmICh4MSA8IHgwKSB7CisgICAgZHggPSBpMDsgaTAgPSBpMTsgaTEgPSBkeDsKKyAgICBkeCA9IHgwOyB4MCA9IHgxOyB4MSA9IGR4OworICB9CisKKyAgaWYgKGR4ID0geDEgLSB4MCkgeworICAgIG5pY2UgPSBuaWNlKGR4KTsKKyAgICBkb21haW5baTBdID0gbmljZS5mbG9vcih4MCk7CisgICAgZG9tYWluW2kxXSA9IG5pY2UuY2VpbCh4MSk7CisgIH0KKworICByZXR1cm4gZG9tYWluOworfQorCitmdW5jdGlvbiBkM19zY2FsZV9uaWNlRGVmYXVsdCgpIHsKKyAgcmV0dXJuIE1hdGg7Cit9CitkMy5zY2FsZS5saW5lYXIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhcihbMCwgMV0sIFswLCAxXSwgZDMuaW50ZXJwb2xhdGUsIGZhbHNlKTsKK307CisKK2Z1bmN0aW9uIGQzX3NjYWxlX2xpbmVhcihkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSwgY2xhbXApIHsKKyAgdmFyIG91dHB1dCwKKyAgICAgIGlucHV0OworCisgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CisgICAgdmFyIGxpbmVhciA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgPiAyID8gZDNfc2NhbGVfcG9seWxpbmVhciA6IGQzX3NjYWxlX2JpbGluZWFyLAorICAgICAgICB1bmludGVycG9sYXRlID0gY2xhbXAgPyBkM191bmludGVycG9sYXRlQ2xhbXAgOiBkM191bmludGVycG9sYXRlTnVtYmVyOworICAgIG91dHB1dCA9IGxpbmVhcihkb21haW4sIHJhbmdlLCB1bmludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSk7CisgICAgaW5wdXQgPSBsaW5lYXIocmFuZ2UsIGRvbWFpbiwgdW5pbnRlcnBvbGF0ZSwgZDMuaW50ZXJwb2xhdGUpOworICAgIHJldHVybiBzY2FsZTsKKyAgfQorCisgIGZ1bmN0aW9uIHNjYWxlKHgpIHsKKyAgICByZXR1cm4gb3V0cHV0KHgpOworICB9CisKKyAgLy8gTm90ZTogcmVxdWlyZXMgcmFuZ2UgaXMgY29lcmNpYmxlIHRvIG51bWJlciEKKyAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkgeworICAgIHJldHVybiBpbnB1dCh5KTsKKyAgfTsKKworICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluOworICAgIGRvbWFpbiA9IHgubWFwKE51bWJlcik7CisgICAgcmV0dXJuIHJlc2NhbGUoKTsKKyAgfTsKKworICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTsKKyAgICByYW5nZSA9IHg7CisgICAgcmV0dXJuIHJlc2NhbGUoKTsKKyAgfTsKKworICBzY2FsZS5yYW5nZVJvdW5kID0gZnVuY3Rpb24oeCkgeworICAgIHJldHVybiBzY2FsZS5yYW5nZSh4KS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZVJvdW5kKTsKKyAgfTsKKworICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGFtcDsKKyAgICBjbGFtcCA9IHg7CisgICAgcmV0dXJuIHJlc2NhbGUoKTsKKyAgfTsKKworICBzY2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbnRlcnBvbGF0ZTsKKyAgICBpbnRlcnBvbGF0ZSA9IHg7CisgICAgcmV0dXJuIHJlc2NhbGUoKTsKKyAgfTsKKworICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKG0pIHsKKyAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKTsKKyAgfTsKKworICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSkgeworICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KGRvbWFpbiwgbSk7CisgIH07CisKKyAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgeworICAgIGQzX3NjYWxlX25pY2UoZG9tYWluLCBkM19zY2FsZV9saW5lYXJOaWNlKTsKKyAgICByZXR1cm4gcmVzY2FsZSgpOworICB9OworCisgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyKGRvbWFpbiwgcmFuZ2UsIGludGVycG9sYXRlLCBjbGFtcCk7CisgIH07CisKKyAgcmV0dXJuIHJlc2NhbGUoKTsKK30KKworZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpIHsKKyAgcmV0dXJuIGQzLnJlYmluZChzY2FsZSwgbGluZWFyLCAicmFuZ2UiLCAicmFuZ2VSb3VuZCIsICJpbnRlcnBvbGF0ZSIsICJjbGFtcCIpOworfQorCitmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJOaWNlKGR4KSB7CisgIGR4ID0gTWF0aC5wb3coMTAsIE1hdGgucm91bmQoTWF0aC5sb2coZHgpIC8gTWF0aC5MTjEwKSAtIDEpOworICByZXR1cm4geworICAgIGZsb29yOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmZsb29yKHggLyBkeCkgKiBkeDsgfSwKKyAgICBjZWlsOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmNlaWwoeCAvIGR4KSAqIGR4OyB9CisgIH07Cit9CisKK2Z1bmN0aW9uIGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pIHsKKyAgdmFyIGV4dGVudCA9IGQzX3NjYWxlRXh0ZW50KGRvbWFpbiksCisgICAgICBzcGFuID0gZXh0ZW50WzFdIC0gZXh0ZW50WzBdLAorICAgICAgc3RlcCA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHNwYW4gLyBtKSAvIE1hdGguTE4xMCkpLAorICAgICAgZXJyID0gbSAvIHNwYW4gKiBzdGVwOworCisgIC8vIEZpbHRlciB0aWNrcyB0byBnZXQgY2xvc2VyIHRvIHRoZSBkZXNpcmVkIGNvdW50LgorICBpZiAoZXJyIDw9IC4xNSkgc3RlcCAqPSAxMDsKKyAgZWxzZSBpZiAoZXJyIDw9IC4zNSkgc3RlcCAqPSA1OworICBlbHNlIGlmIChlcnIgPD0gLjc1KSBzdGVwICo9IDI7CisKKyAgLy8gUm91bmQgc3RhcnQgYW5kIHN0b3AgdmFsdWVzIHRvIHN0ZXAgaW50ZXJ2YWwuCisgIGV4dGVudFswXSA9IE1hdGguY2VpbChleHRlbnRbMF0gLyBzdGVwKSAqIHN0ZXA7CisgIGV4dGVudFsxXSA9IE1hdGguZmxvb3IoZXh0ZW50WzFdIC8gc3RlcCkgKiBzdGVwICsgc3RlcCAqIC41OyAvLyBpbmNsdXNpdmUKKyAgZXh0ZW50WzJdID0gc3RlcDsKKyAgcmV0dXJuIGV4dGVudDsKK30KKworZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKSB7CisgIHJldHVybiBkMy5yYW5nZS5hcHBseShkMywgZDNfc2NhbGVfbGluZWFyVGlja1JhbmdlKGRvbWFpbiwgbSkpOworfQorCitmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KGRvbWFpbiwgbSkgeworICByZXR1cm4gZDMuZm9ybWF0KCIsLiIgKyBNYXRoLm1heCgwLCAtTWF0aC5mbG9vcihNYXRoLmxvZyhkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZG9tYWluLCBtKVsyXSkgLyBNYXRoLkxOMTAgKyAuMDEpKSArICJmIik7Cit9CitmdW5jdGlvbiBkM19zY2FsZV9iaWxpbmVhcihkb21haW4sIHJhbmdlLCB1bmludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSkgeworICB2YXIgdSA9IHVuaW50ZXJwb2xhdGUoZG9tYWluWzBdLCBkb21haW5bMV0pLAorICAgICAgaSA9IGludGVycG9sYXRlKHJhbmdlWzBdLCByYW5nZVsxXSk7CisgIHJldHVybiBmdW5jdGlvbih4KSB7CisgICAgcmV0dXJuIGkodSh4KSk7CisgIH07Cit9CitmdW5jdGlvbiBkM19zY2FsZV9wb2x5bGluZWFyKGRvbWFpbiwgcmFuZ2UsIHVuaW50ZXJwb2xhdGUsIGludGVycG9sYXRlKSB7CisgIHZhciB1ID0gW10sCisgICAgICBpID0gW10sCisgICAgICBqID0gMCwKKyAgICAgIGsgPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZS5sZW5ndGgpIC0gMTsKKworICAvLyBIYW5kbGUgZGVzY2VuZGluZyBkb21haW5zLgorICBpZiAoZG9tYWluW2tdIDwgZG9tYWluWzBdKSB7CisgICAgZG9tYWluID0gZG9tYWluLnNsaWNlKCkucmV2ZXJzZSgpOworICAgIHJhbmdlID0gcmFuZ2Uuc2xpY2UoKS5yZXZlcnNlKCk7CisgIH0KKworICB3aGlsZSAoKytqIDw9IGspIHsKKyAgICB1LnB1c2godW5pbnRlcnBvbGF0ZShkb21haW5baiAtIDFdLCBkb21haW5bal0pKTsKKyAgICBpLnB1c2goaW50ZXJwb2xhdGUocmFuZ2VbaiAtIDFdLCByYW5nZVtqXSkpOworICB9CisKKyAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKKyAgICB2YXIgaiA9IGQzLmJpc2VjdChkb21haW4sIHgsIDEsIGspIC0gMTsKKyAgICByZXR1cm4gaVtqXSh1W2pdKHgpKTsKKyAgfTsKK30KK2QzLnNjYWxlLmxvZyA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gZDNfc2NhbGVfbG9nKGQzLnNjYWxlLmxpbmVhcigpLCBkM19zY2FsZV9sb2dwKTsKK307CisKK2Z1bmN0aW9uIGQzX3NjYWxlX2xvZyhsaW5lYXIsIGxvZykgeworICB2YXIgcG93ID0gbG9nLnBvdzsKKworICBmdW5jdGlvbiBzY2FsZSh4KSB7CisgICAgcmV0dXJuIGxpbmVhcihsb2coeCkpOworICB9CisKKyAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeCkgeworICAgIHJldHVybiBwb3cobGluZWFyLmludmVydCh4KSk7CisgIH07CisKKyAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmVhci5kb21haW4oKS5tYXAocG93KTsKKyAgICBsb2cgPSB4WzBdIDwgMCA/IGQzX3NjYWxlX2xvZ24gOiBkM19zY2FsZV9sb2dwOworICAgIHBvdyA9IGxvZy5wb3c7CisgICAgbGluZWFyLmRvbWFpbih4Lm1hcChsb2cpKTsKKyAgICByZXR1cm4gc2NhbGU7CisgIH07CisKKyAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgeworICAgIGxpbmVhci5kb21haW4oZDNfc2NhbGVfbmljZShsaW5lYXIuZG9tYWluKCksIGQzX3NjYWxlX25pY2VEZWZhdWx0KSk7CisgICAgcmV0dXJuIHNjYWxlOworICB9OworCisgIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIGV4dGVudCA9IGQzX3NjYWxlRXh0ZW50KGxpbmVhci5kb21haW4oKSksCisgICAgICAgIHRpY2tzID0gW107CisgICAgaWYgKGV4dGVudC5ldmVyeShpc0Zpbml0ZSkpIHsKKyAgICAgIHZhciBpID0gTWF0aC5mbG9vcihleHRlbnRbMF0pLAorICAgICAgICAgIGogPSBNYXRoLmNlaWwoZXh0ZW50WzFdKSwKKyAgICAgICAgICB1ID0gcG93KGV4dGVudFswXSksCisgICAgICAgICAgdiA9IHBvdyhleHRlbnRbMV0pOworICAgICAgaWYgKGxvZyA9PT0gZDNfc2NhbGVfbG9nbikgeworICAgICAgICB0aWNrcy5wdXNoKHBvdyhpKSk7CisgICAgICAgIGZvciAoOyBpKysgPCBqOykgZm9yICh2YXIgayA9IDk7IGsgPiAwOyBrLS0pIHRpY2tzLnB1c2gocG93KGkpICogayk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKDsgaSA8IGo7IGkrKykgZm9yICh2YXIgayA9IDE7IGsgPCAxMDsgaysrKSB0aWNrcy5wdXNoKHBvdyhpKSAqIGspOworICAgICAgICB0aWNrcy5wdXNoKHBvdyhpKSk7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyB0aWNrc1tpXSA8IHU7IGkrKykge30gLy8gc3RyaXAgc21hbGwgdmFsdWVzCisgICAgICBmb3IgKGogPSB0aWNrcy5sZW5ndGg7IHRpY2tzW2ogLSAxXSA+IHY7IGotLSkge30gLy8gc3RyaXAgYmlnIHZhbHVlcworICAgICAgdGlja3MgPSB0aWNrcy5zbGljZShpLCBqKTsKKyAgICB9CisgICAgcmV0dXJuIHRpY2tzOworICB9OworCisgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihuLCBmb3JtYXQpIHsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIGZvcm1hdCA9IGQzX3NjYWxlX2xvZ0Zvcm1hdDsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiBmb3JtYXQ7CisgICAgdmFyIGsgPSBuIC8gc2NhbGUudGlja3MoKS5sZW5ndGgsCisgICAgICAgIGYgPSBsb2cgPT09IGQzX3NjYWxlX2xvZ24gPyAoZSA9IC0xZS0xMiwgTWF0aC5mbG9vcikgOiAoZSA9IDFlLTEyLCBNYXRoLmNlaWwpLAorICAgICAgICBlOworICAgIHJldHVybiBmdW5jdGlvbihkKSB7CisgICAgICByZXR1cm4gZCAvIHBvdyhmKGxvZyhkKSArIGUpKSA8IGsgPyBmb3JtYXQoZCkgOiAiIjsKKyAgICB9OworICB9OworCisgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZDNfc2NhbGVfbG9nKGxpbmVhci5jb3B5KCksIGxvZyk7CisgIH07CisKKyAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclJlYmluZChzY2FsZSwgbGluZWFyKTsKK30KKwordmFyIGQzX3NjYWxlX2xvZ0Zvcm1hdCA9IGQzLmZvcm1hdCgiLjBlIik7CisKK2Z1bmN0aW9uIGQzX3NjYWxlX2xvZ3AoeCkgeworICByZXR1cm4gTWF0aC5sb2coeCA8IDAgPyAwIDogeCkgLyBNYXRoLkxOMTA7Cit9CisKK2Z1bmN0aW9uIGQzX3NjYWxlX2xvZ24oeCkgeworICByZXR1cm4gLU1hdGgubG9nKHggPiAwID8gMCA6IC14KSAvIE1hdGguTE4xMDsKK30KKworZDNfc2NhbGVfbG9ncC5wb3cgPSBmdW5jdGlvbih4KSB7CisgIHJldHVybiBNYXRoLnBvdygxMCwgeCk7Cit9OworCitkM19zY2FsZV9sb2duLnBvdyA9IGZ1bmN0aW9uKHgpIHsKKyAgcmV0dXJuIC1NYXRoLnBvdygxMCwgLXgpOworfTsKK2QzLnNjYWxlLnBvdyA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gZDNfc2NhbGVfcG93KGQzLnNjYWxlLmxpbmVhcigpLCAxKTsKK307CisKK2Z1bmN0aW9uIGQzX3NjYWxlX3BvdyhsaW5lYXIsIGV4cG9uZW50KSB7CisgIHZhciBwb3dwID0gZDNfc2NhbGVfcG93UG93KGV4cG9uZW50KSwKKyAgICAgIHBvd2IgPSBkM19zY2FsZV9wb3dQb3coMSAvIGV4cG9uZW50KTsKKworICBmdW5jdGlvbiBzY2FsZSh4KSB7CisgICAgcmV0dXJuIGxpbmVhcihwb3dwKHgpKTsKKyAgfQorCisgIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHgpIHsKKyAgICByZXR1cm4gcG93YihsaW5lYXIuaW52ZXJ0KHgpKTsKKyAgfTsKKworICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGluZWFyLmRvbWFpbigpLm1hcChwb3diKTsKKyAgICBsaW5lYXIuZG9tYWluKHgubWFwKHBvd3ApKTsKKyAgICByZXR1cm4gc2NhbGU7CisgIH07CisKKyAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihtKSB7CisgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tzKHNjYWxlLmRvbWFpbigpLCBtKTsKKyAgfTsKKworICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSkgeworICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KHNjYWxlLmRvbWFpbigpLCBtKTsKKyAgfTsKKworICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHNjYWxlLmRvbWFpbihkM19zY2FsZV9uaWNlKHNjYWxlLmRvbWFpbigpLCBkM19zY2FsZV9saW5lYXJOaWNlKSk7CisgIH07CisKKyAgc2NhbGUuZXhwb25lbnQgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZXhwb25lbnQ7CisgICAgdmFyIGRvbWFpbiA9IHNjYWxlLmRvbWFpbigpOworICAgIHBvd3AgPSBkM19zY2FsZV9wb3dQb3coZXhwb25lbnQgPSB4KTsKKyAgICBwb3diID0gZDNfc2NhbGVfcG93UG93KDEgLyBleHBvbmVudCk7CisgICAgcmV0dXJuIHNjYWxlLmRvbWFpbihkb21haW4pOworICB9OworCisgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZDNfc2NhbGVfcG93KGxpbmVhci5jb3B5KCksIGV4cG9uZW50KTsKKyAgfTsKKworICByZXR1cm4gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpOworfQorCitmdW5jdGlvbiBkM19zY2FsZV9wb3dQb3coZSkgeworICByZXR1cm4gZnVuY3Rpb24oeCkgeworICAgIHJldHVybiB4IDwgMCA/IC1NYXRoLnBvdygteCwgZSkgOiBNYXRoLnBvdyh4LCBlKTsKKyAgfTsKK30KK2QzLnNjYWxlLnNxcnQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIGQzLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KTsKK307CitkMy5zY2FsZS5vcmRpbmFsID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiBkM19zY2FsZV9vcmRpbmFsKFtdLCB7dDogInJhbmdlIiwgeDogW119KTsKK307CisKK2Z1bmN0aW9uIGQzX3NjYWxlX29yZGluYWwoZG9tYWluLCByYW5nZXIpIHsKKyAgdmFyIGluZGV4LAorICAgICAgcmFuZ2UsCisgICAgICByYW5nZUJhbmQ7CisKKyAgZnVuY3Rpb24gc2NhbGUoeCkgeworICAgIHJldHVybiByYW5nZVsoKGluZGV4LmdldCh4KSB8fCBpbmRleC5zZXQoeCwgZG9tYWluLnB1c2goeCkpKSAtIDEpICUgcmFuZ2UubGVuZ3RoXTsKKyAgfQorCisgIGZ1bmN0aW9uIHN0ZXBzKHN0YXJ0LCBzdGVwKSB7CisgICAgcmV0dXJuIGQzLnJhbmdlKGRvbWFpbi5sZW5ndGgpLm1hcChmdW5jdGlvbihpKSB7IHJldHVybiBzdGFydCArIHN0ZXAgKiBpOyB9KTsKKyAgfQorCisgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47CisgICAgZG9tYWluID0gW107CisgICAgaW5kZXggPSBuZXcgZDNfTWFwOworICAgIHZhciBpID0gLTEsIG4gPSB4Lmxlbmd0aCwgeGk7CisgICAgd2hpbGUgKCsraSA8IG4pIGlmICghaW5kZXguaGFzKHhpID0geFtpXSkpIGluZGV4LnNldCh4aSwgZG9tYWluLnB1c2goeGkpKTsKKyAgICByZXR1cm4gc2NhbGVbcmFuZ2VyLnRdKHJhbmdlci54LCByYW5nZXIucCk7CisgIH07CisKKyAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7CisgICAgcmFuZ2UgPSB4OworICAgIHJhbmdlQmFuZCA9IDA7CisgICAgcmFuZ2VyID0ge3Q6ICJyYW5nZSIsIHg6IHh9OworICAgIHJldHVybiBzY2FsZTsKKyAgfTsKKworICBzY2FsZS5yYW5nZVBvaW50cyA9IGZ1bmN0aW9uKHgsIHBhZGRpbmcpIHsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHBhZGRpbmcgPSAwOworICAgIHZhciBzdGFydCA9IHhbMF0sCisgICAgICAgIHN0b3AgPSB4WzFdLAorICAgICAgICBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyAoZG9tYWluLmxlbmd0aCAtIDEgKyBwYWRkaW5nKTsKKyAgICByYW5nZSA9IHN0ZXBzKGRvbWFpbi5sZW5ndGggPCAyID8gKHN0YXJ0ICsgc3RvcCkgLyAyIDogc3RhcnQgKyBzdGVwICogcGFkZGluZyAvIDIsIHN0ZXApOworICAgIHJhbmdlQmFuZCA9IDA7CisgICAgcmFuZ2VyID0ge3Q6ICJyYW5nZVBvaW50cyIsIHg6IHgsIHA6IHBhZGRpbmd9OworICAgIHJldHVybiBzY2FsZTsKKyAgfTsKKworICBzY2FsZS5yYW5nZUJhbmRzID0gZnVuY3Rpb24oeCwgcGFkZGluZykgeworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7CisgICAgdmFyIHJldmVyc2UgPSB4WzFdIDwgeFswXSwKKyAgICAgICAgc3RhcnQgPSB4W3JldmVyc2UgLSAwXSwKKyAgICAgICAgc3RvcCA9IHhbMSAtIHJldmVyc2VdLAorICAgICAgICBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyAoZG9tYWluLmxlbmd0aCArIHBhZGRpbmcpOworICAgIHJhbmdlID0gc3RlcHMoc3RhcnQgKyBzdGVwICogcGFkZGluZywgc3RlcCk7CisgICAgaWYgKHJldmVyc2UpIHJhbmdlLnJldmVyc2UoKTsKKyAgICByYW5nZUJhbmQgPSBzdGVwICogKDEgLSBwYWRkaW5nKTsKKyAgICByYW5nZXIgPSB7dDogInJhbmdlQmFuZHMiLCB4OiB4LCBwOiBwYWRkaW5nfTsKKyAgICByZXR1cm4gc2NhbGU7CisgIH07CisKKyAgc2NhbGUucmFuZ2VSb3VuZEJhbmRzID0gZnVuY3Rpb24oeCwgcGFkZGluZykgeworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7CisgICAgdmFyIHJldmVyc2UgPSB4WzFdIDwgeFswXSwKKyAgICAgICAgc3RhcnQgPSB4W3JldmVyc2UgLSAwXSwKKyAgICAgICAgc3RvcCA9IHhbMSAtIHJldmVyc2VdLAorICAgICAgICBzdGVwID0gTWF0aC5mbG9vcigoc3RvcCAtIHN0YXJ0KSAvIChkb21haW4ubGVuZ3RoICsgcGFkZGluZykpLAorICAgICAgICBlcnJvciA9IHN0b3AgLSBzdGFydCAtIChkb21haW4ubGVuZ3RoIC0gcGFkZGluZykgKiBzdGVwOworICAgIHJhbmdlID0gc3RlcHMoc3RhcnQgKyBNYXRoLnJvdW5kKGVycm9yIC8gMiksIHN0ZXApOworICAgIGlmIChyZXZlcnNlKSByYW5nZS5yZXZlcnNlKCk7CisgICAgcmFuZ2VCYW5kID0gTWF0aC5yb3VuZChzdGVwICogKDEgLSBwYWRkaW5nKSk7CisgICAgcmFuZ2VyID0ge3Q6ICJyYW5nZVJvdW5kQmFuZHMiLCB4OiB4LCBwOiBwYWRkaW5nfTsKKyAgICByZXR1cm4gc2NhbGU7CisgIH07CisKKyAgc2NhbGUucmFuZ2VCYW5kID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHJhbmdlQmFuZDsKKyAgfTsKKworICBzY2FsZS5yYW5nZUV4dGVudCA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBkM19zY2FsZUV4dGVudChyYW5nZXIueCk7CisgIH07CisKKyAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBkM19zY2FsZV9vcmRpbmFsKGRvbWFpbiwgcmFuZ2VyKTsKKyAgfTsKKworICByZXR1cm4gc2NhbGUuZG9tYWluKGRvbWFpbik7Cit9CisvKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNvbG9yIHNwZWNpZmljYXRpb25zIGFuZCBkZXNpZ25zIGRldmVsb3BlZCBieSBDeW50aGlhCisgKiBCcmV3ZXIgKGh0dHA6Ly9jb2xvcmJyZXdlci5vcmcvKS4gU2VlIGxpYi9jb2xvcmJyZXdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworCitkMy5zY2FsZS5jYXRlZ29yeTEwID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkxMCk7Cit9OworCitkMy5zY2FsZS5jYXRlZ29yeTIwID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkyMCk7Cit9OworCitkMy5zY2FsZS5jYXRlZ29yeTIwYiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MjBiKTsKK307CisKK2QzLnNjYWxlLmNhdGVnb3J5MjBjID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkyMGMpOworfTsKKwordmFyIGQzX2NhdGVnb3J5MTAgPSBbCisgICIjMWY3N2I0IiwgIiNmZjdmMGUiLCAiIzJjYTAyYyIsICIjZDYyNzI4IiwgIiM5NDY3YmQiLAorICAiIzhjNTY0YiIsICIjZTM3N2MyIiwgIiM3ZjdmN2YiLCAiI2JjYmQyMiIsICIjMTdiZWNmIgorXTsKKwordmFyIGQzX2NhdGVnb3J5MjAgPSBbCisgICIjMWY3N2I0IiwgIiNhZWM3ZTgiLAorICAiI2ZmN2YwZSIsICIjZmZiYjc4IiwKKyAgIiMyY2EwMmMiLCAiIzk4ZGY4YSIsCisgICIjZDYyNzI4IiwgIiNmZjk4OTYiLAorICAiIzk0NjdiZCIsICIjYzViMGQ1IiwKKyAgIiM4YzU2NGIiLCAiI2M0OWM5NCIsCisgICIjZTM3N2MyIiwgIiNmN2I2ZDIiLAorICAiIzdmN2Y3ZiIsICIjYzdjN2M3IiwKKyAgIiNiY2JkMjIiLCAiI2RiZGI4ZCIsCisgICIjMTdiZWNmIiwgIiM5ZWRhZTUiCitdOworCit2YXIgZDNfY2F0ZWdvcnkyMGIgPSBbCisgICIjMzkzYjc5IiwgIiM1MjU0YTMiLCAiIzZiNmVjZiIsICIjOWM5ZWRlIiwKKyAgIiM2Mzc5MzkiLCAiIzhjYTI1MiIsICIjYjVjZjZiIiwgIiNjZWRiOWMiLAorICAiIzhjNmQzMSIsICIjYmQ5ZTM5IiwgIiNlN2JhNTIiLCAiI2U3Y2I5NCIsCisgICIjODQzYzM5IiwgIiNhZDQ5NGEiLCAiI2Q2NjE2YiIsICIjZTc5NjljIiwKKyAgIiM3YjQxNzMiLCAiI2E1NTE5NCIsICIjY2U2ZGJkIiwgIiNkZTllZDYiCitdOworCit2YXIgZDNfY2F0ZWdvcnkyMGMgPSBbCisgICIjMzE4MmJkIiwgIiM2YmFlZDYiLCAiIzllY2FlMSIsICIjYzZkYmVmIiwKKyAgIiNlNjU1MGQiLCAiI2ZkOGQzYyIsICIjZmRhZTZiIiwgIiNmZGQwYTIiLAorICAiIzMxYTM1NCIsICIjNzRjNDc2IiwgIiNhMWQ5OWIiLCAiI2M3ZTljMCIsCisgICIjNzU2YmIxIiwgIiM5ZTlhYzgiLCAiI2JjYmRkYyIsICIjZGFkYWViIiwKKyAgIiM2MzYzNjMiLCAiIzk2OTY5NiIsICIjYmRiZGJkIiwgIiNkOWQ5ZDkiCitdOworZDMuc2NhbGUucXVhbnRpbGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIGQzX3NjYWxlX3F1YW50aWxlKFtdLCBbXSk7Cit9OworCitmdW5jdGlvbiBkM19zY2FsZV9xdWFudGlsZShkb21haW4sIHJhbmdlKSB7CisgIHZhciB0aHJlc2hvbGRzOworCisgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CisgICAgdmFyIGsgPSAwLAorICAgICAgICBuID0gZG9tYWluLmxlbmd0aCwKKyAgICAgICAgcSA9IHJhbmdlLmxlbmd0aDsKKyAgICB0aHJlc2hvbGRzID0gW107CisgICAgd2hpbGUgKCsrayA8IHEpIHRocmVzaG9sZHNbayAtIDFdID0gZDMucXVhbnRpbGUoZG9tYWluLCBrIC8gcSk7CisgICAgcmV0dXJuIHNjYWxlOworICB9CisKKyAgZnVuY3Rpb24gc2NhbGUoeCkgeworICAgIGlmIChpc05hTih4ID0gK3gpKSByZXR1cm4gTmFOOworICAgIHJldHVybiByYW5nZVtkMy5iaXNlY3QodGhyZXNob2xkcywgeCldOworICB9CisKKyAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjsKKyAgICBkb21haW4gPSB4LmZpbHRlcihmdW5jdGlvbihkKSB7IHJldHVybiAhaXNOYU4oZCk7IH0pLnNvcnQoZDMuYXNjZW5kaW5nKTsKKyAgICByZXR1cm4gcmVzY2FsZSgpOworICB9OworCisgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlOworICAgIHJhbmdlID0geDsKKyAgICByZXR1cm4gcmVzY2FsZSgpOworICB9OworCisgIHNjYWxlLnF1YW50aWxlcyA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aHJlc2hvbGRzOworICB9OworCisgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZDNfc2NhbGVfcXVhbnRpbGUoZG9tYWluLCByYW5nZSk7IC8vIGNvcHkgb24gd3JpdGUhCisgIH07CisKKyAgcmV0dXJuIHJlc2NhbGUoKTsKK30KK2QzLnNjYWxlLnF1YW50aXplID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiBkM19zY2FsZV9xdWFudGl6ZSgwLCAxLCBbMCwgMV0pOworfTsKKworZnVuY3Rpb24gZDNfc2NhbGVfcXVhbnRpemUoeDAsIHgxLCByYW5nZSkgeworICB2YXIga3gsIGk7CisKKyAgZnVuY3Rpb24gc2NhbGUoeCkgeworICAgIHJldHVybiByYW5nZVtNYXRoLm1heCgwLCBNYXRoLm1pbihpLCBNYXRoLmZsb29yKGt4ICogKHggLSB4MCkpKSldOworICB9CisKKyAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKKyAgICBreCA9IHJhbmdlLmxlbmd0aCAvICh4MSAtIHgwKTsKKyAgICBpID0gcmFuZ2UubGVuZ3RoIC0gMTsKKyAgICByZXR1cm4gc2NhbGU7CisgIH0KKworICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW3gwLCB4MV07CisgICAgeDAgPSAreFswXTsKKyAgICB4MSA9ICt4W3gubGVuZ3RoIC0gMV07CisgICAgcmV0dXJuIHJlc2NhbGUoKTsKKyAgfTsKKworICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTsKKyAgICByYW5nZSA9IHg7CisgICAgcmV0dXJuIHJlc2NhbGUoKTsKKyAgfTsKKworICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIGQzX3NjYWxlX3F1YW50aXplKHgwLCB4MSwgcmFuZ2UpOyAvLyBjb3B5IG9uIHdyaXRlCisgIH07CisKKyAgcmV0dXJuIHJlc2NhbGUoKTsKK30KK2QzLnNjYWxlLmlkZW50aXR5ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiBkM19zY2FsZV9pZGVudGl0eShbMCwgMV0pOworfTsKKworZnVuY3Rpb24gZDNfc2NhbGVfaWRlbnRpdHkoZG9tYWluKSB7CisKKyAgZnVuY3Rpb24gaWRlbnRpdHkoeCkgeyByZXR1cm4gK3g7IH0KKworICBpZGVudGl0eS5pbnZlcnQgPSBpZGVudGl0eTsKKworICBpZGVudGl0eS5kb21haW4gPSBpZGVudGl0eS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47CisgICAgZG9tYWluID0geC5tYXAoaWRlbnRpdHkpOworICAgIHJldHVybiBpZGVudGl0eTsKKyAgfTsKKworICBpZGVudGl0eS50aWNrcyA9IGZ1bmN0aW9uKG0pIHsKKyAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKTsKKyAgfTsKKworICBpZGVudGl0eS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSkgeworICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KGRvbWFpbiwgbSk7CisgIH07CisKKyAgaWRlbnRpdHkuY29weSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBkM19zY2FsZV9pZGVudGl0eShkb21haW4pOworICB9OworCisgIHJldHVybiBpZGVudGl0eTsKK30KK2QzLnN2ZyA9IHt9OworZDMuc3ZnLmFyYyA9IGZ1bmN0aW9uKCkgeworICB2YXIgaW5uZXJSYWRpdXMgPSBkM19zdmdfYXJjSW5uZXJSYWRpdXMsCisgICAgICBvdXRlclJhZGl1cyA9IGQzX3N2Z19hcmNPdXRlclJhZGl1cywKKyAgICAgIHN0YXJ0QW5nbGUgPSBkM19zdmdfYXJjU3RhcnRBbmdsZSwKKyAgICAgIGVuZEFuZ2xlID0gZDNfc3ZnX2FyY0VuZEFuZ2xlOworCisgIGZ1bmN0aW9uIGFyYygpIHsKKyAgICB2YXIgcjAgPSBpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLAorICAgICAgICByMSA9IG91dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCisgICAgICAgIGEwID0gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgZDNfc3ZnX2FyY09mZnNldCwKKyAgICAgICAgYTEgPSBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgZDNfc3ZnX2FyY09mZnNldCwKKyAgICAgICAgZGEgPSAoYTEgPCBhMCAmJiAoZGEgPSBhMCwgYTAgPSBhMSwgYTEgPSBkYSksIGExIC0gYTApLAorICAgICAgICBkZiA9IGRhIDwgTWF0aC5QSSA/ICIwIiA6ICIxIiwKKyAgICAgICAgYzAgPSBNYXRoLmNvcyhhMCksCisgICAgICAgIHMwID0gTWF0aC5zaW4oYTApLAorICAgICAgICBjMSA9IE1hdGguY29zKGExKSwKKyAgICAgICAgczEgPSBNYXRoLnNpbihhMSk7CisgICAgcmV0dXJuIGRhID49IGQzX3N2Z19hcmNNYXgKKyAgICAgID8gKHIwCisgICAgICA/ICJNMCwiICsgcjEKKyAgICAgICsgIkEiICsgcjEgKyAiLCIgKyByMSArICIgMCAxLDEgMCwiICsgKC1yMSkKKyAgICAgICsgIkEiICsgcjEgKyAiLCIgKyByMSArICIgMCAxLDEgMCwiICsgcjEKKyAgICAgICsgIk0wLCIgKyByMAorICAgICAgKyAiQSIgKyByMCArICIsIiArIHIwICsgIiAwIDEsMCAwLCIgKyAoLXIwKQorICAgICAgKyAiQSIgKyByMCArICIsIiArIHIwICsgIiAwIDEsMCAwLCIgKyByMAorICAgICAgKyAiWiIKKyAgICAgIDogIk0wLCIgKyByMQorICAgICAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyAoLXIxKQorICAgICAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyByMQorICAgICAgKyAiWiIpCisgICAgICA6IChyMAorICAgICAgPyAiTSIgKyByMSAqIGMwICsgIiwiICsgcjEgKiBzMAorICAgICAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwICIgKyBkZiArICIsMSAiICsgcjEgKiBjMSArICIsIiArIHIxICogczEKKyAgICAgICsgIkwiICsgcjAgKiBjMSArICIsIiArIHIwICogczEKKyAgICAgICsgIkEiICsgcjAgKyAiLCIgKyByMCArICIgMCAiICsgZGYgKyAiLDAgIiArIHIwICogYzAgKyAiLCIgKyByMCAqIHMwCisgICAgICArICJaIgorICAgICAgOiAiTSIgKyByMSAqIGMwICsgIiwiICsgcjEgKiBzMAorICAgICAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwICIgKyBkZiArICIsMSAiICsgcjEgKiBjMSArICIsIiArIHIxICogczEKKyAgICAgICsgIkwwLDAiCisgICAgICArICJaIik7CisgIH0KKworICBhcmMuaW5uZXJSYWRpdXMgPSBmdW5jdGlvbih2KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW5uZXJSYWRpdXM7CisgICAgaW5uZXJSYWRpdXMgPSBkMy5mdW5jdG9yKHYpOworICAgIHJldHVybiBhcmM7CisgIH07CisKKyAgYXJjLm91dGVyUmFkaXVzID0gZnVuY3Rpb24odikgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG91dGVyUmFkaXVzOworICAgIG91dGVyUmFkaXVzID0gZDMuZnVuY3Rvcih2KTsKKyAgICByZXR1cm4gYXJjOworICB9OworCisgIGFyYy5zdGFydEFuZ2xlID0gZnVuY3Rpb24odikgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7CisgICAgc3RhcnRBbmdsZSA9IGQzLmZ1bmN0b3Iodik7CisgICAgcmV0dXJuIGFyYzsKKyAgfTsKKworICBhcmMuZW5kQW5nbGUgPSBmdW5jdGlvbih2KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZW5kQW5nbGU7CisgICAgZW5kQW5nbGUgPSBkMy5mdW5jdG9yKHYpOworICAgIHJldHVybiBhcmM7CisgIH07CisKKyAgYXJjLmNlbnRyb2lkID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIHIgPSAoaW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKQorICAgICAgICArIG91dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMiwKKyAgICAgICAgYSA9IChzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykKKyAgICAgICAgKyBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgKyBkM19zdmdfYXJjT2Zmc2V0OworICAgIHJldHVybiBbTWF0aC5jb3MoYSkgKiByLCBNYXRoLnNpbihhKSAqIHJdOworICB9OworCisgIHJldHVybiBhcmM7Cit9OworCit2YXIgZDNfc3ZnX2FyY09mZnNldCA9IC1NYXRoLlBJIC8gMiwKKyAgICBkM19zdmdfYXJjTWF4ID0gMiAqIE1hdGguUEkgLSAxZS02OworCitmdW5jdGlvbiBkM19zdmdfYXJjSW5uZXJSYWRpdXMoZCkgeworICByZXR1cm4gZC5pbm5lclJhZGl1czsKK30KKworZnVuY3Rpb24gZDNfc3ZnX2FyY091dGVyUmFkaXVzKGQpIHsKKyAgcmV0dXJuIGQub3V0ZXJSYWRpdXM7Cit9CisKK2Z1bmN0aW9uIGQzX3N2Z19hcmNTdGFydEFuZ2xlKGQpIHsKKyAgcmV0dXJuIGQuc3RhcnRBbmdsZTsKK30KKworZnVuY3Rpb24gZDNfc3ZnX2FyY0VuZEFuZ2xlKGQpIHsKKyAgcmV0dXJuIGQuZW5kQW5nbGU7Cit9CitmdW5jdGlvbiBkM19zdmdfbGluZShwcm9qZWN0aW9uKSB7CisgIHZhciB4ID0gZDNfc3ZnX2xpbmVYLAorICAgICAgeSA9IGQzX3N2Z19saW5lWSwKKyAgICAgIGludGVycG9sYXRlID0gZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JEZWZhdWx0LAorICAgICAgaW50ZXJwb2xhdG9yID0gZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmdldChpbnRlcnBvbGF0ZSksCisgICAgICB0ZW5zaW9uID0gLjc7CisKKyAgZnVuY3Rpb24gbGluZShkKSB7CisgICAgcmV0dXJuIGQubGVuZ3RoIDwgMSA/IG51bGwgOiAiTSIgKyBpbnRlcnBvbGF0b3IocHJvamVjdGlvbihkM19zdmdfbGluZVBvaW50cyh0aGlzLCBkLCB4LCB5KSksIHRlbnNpb24pOworICB9CisKKyAgbGluZS54ID0gZnVuY3Rpb24odikgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHg7CisgICAgeCA9IHY7CisgICAgcmV0dXJuIGxpbmU7CisgIH07CisKKyAgbGluZS55ID0gZnVuY3Rpb24odikgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHk7CisgICAgeSA9IHY7CisgICAgcmV0dXJuIGxpbmU7CisgIH07CisKKyAgbGluZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHYpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbnRlcnBvbGF0ZTsKKyAgICBpZiAoIWQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycy5oYXModiArPSAiIikpIHYgPSBkM19zdmdfbGluZUludGVycG9sYXRvckRlZmF1bHQ7CisgICAgaW50ZXJwb2xhdG9yID0gZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmdldChpbnRlcnBvbGF0ZSA9IHYpOworICAgIHJldHVybiBsaW5lOworICB9OworCisgIGxpbmUudGVuc2lvbiA9IGZ1bmN0aW9uKHYpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0ZW5zaW9uOworICAgIHRlbnNpb24gPSB2OworICAgIHJldHVybiBsaW5lOworICB9OworCisgIHJldHVybiBsaW5lOworfQorCitkMy5zdmcubGluZSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gZDNfc3ZnX2xpbmUoT2JqZWN0KTsKK307CisKKy8vIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZGF0YSBpbnRvIGFuIGFycmF5IG9mIHBvaW50cworLy8gKHgteSB0dXBsZXMpLCBieSBldmFsdWF0aW5nIHRoZSBzcGVjaWZpZWQgYHhgIGFuZCBgeWAgZnVuY3Rpb25zIG9uIGVhY2gKKy8vIGRhdGEgcG9pbnQuIFRoZSBgdGhpc2AgY29udGV4dCBvZiB0aGUgZXZhbHVhdGVkIGZ1bmN0aW9ucyBpcyB0aGUgc3BlY2lmaWVkCisvLyAic2VsZiIgb2JqZWN0OyBlYWNoIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgY3VycmVudCBkYXR1bSBhbmQgaW5kZXguCitmdW5jdGlvbiBkM19zdmdfbGluZVBvaW50cyhzZWxmLCBkLCB4LCB5KSB7CisgIHZhciBwb2ludHMgPSBbXSwKKyAgICAgIGkgPSAtMSwKKyAgICAgIG4gPSBkLmxlbmd0aCwKKyAgICAgIGZ4ID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIsCisgICAgICBmeSA9IHR5cGVvZiB5ID09PSAiZnVuY3Rpb24iLAorICAgICAgdmFsdWU7CisgIGlmIChmeCAmJiBmeSkgeworICAgIHdoaWxlICgrK2kgPCBuKSBwb2ludHMucHVzaChbCisgICAgICB4LmNhbGwoc2VsZiwgdmFsdWUgPSBkW2ldLCBpKSwKKyAgICAgIHkuY2FsbChzZWxmLCB2YWx1ZSwgaSkKKyAgICBdKTsKKyAgfSBlbHNlIGlmIChmeCkgeworICAgIHdoaWxlICgrK2kgPCBuKSBwb2ludHMucHVzaChbeC5jYWxsKHNlbGYsIGRbaV0sIGkpLCB5XSk7CisgIH0gZWxzZSBpZiAoZnkpIHsKKyAgICB3aGlsZSAoKytpIDwgbikgcG9pbnRzLnB1c2goW3gsIHkuY2FsbChzZWxmLCBkW2ldLCBpKV0pOworICB9IGVsc2UgeworICAgIHdoaWxlICgrK2kgPCBuKSBwb2ludHMucHVzaChbeCwgeV0pOworICB9CisgIHJldHVybiBwb2ludHM7Cit9CisKKy8vIFRoZSBkZWZhdWx0IGB4YCBwcm9wZXJ0eSwgd2hpY2ggcmVmZXJlbmNlcyBkWzBdLgorZnVuY3Rpb24gZDNfc3ZnX2xpbmVYKGQpIHsKKyAgcmV0dXJuIGRbMF07Cit9CisKKy8vIFRoZSBkZWZhdWx0IGB5YCBwcm9wZXJ0eSwgd2hpY2ggcmVmZXJlbmNlcyBkWzFdLgorZnVuY3Rpb24gZDNfc3ZnX2xpbmVZKGQpIHsKKyAgcmV0dXJuIGRbMV07Cit9CisKK3ZhciBkM19zdmdfbGluZUludGVycG9sYXRvckRlZmF1bHQgPSAibGluZWFyIjsKKworLy8gVGhlIHZhcmlvdXMgaW50ZXJwb2xhdG9ycyBzdXBwb3J0ZWQgYnkgdGhlIGBsaW5lYCBjbGFzcy4KK3ZhciBkM19zdmdfbGluZUludGVycG9sYXRvcnMgPSBkMy5tYXAoeworICAibGluZWFyIjogZDNfc3ZnX2xpbmVMaW5lYXIsCisgICJzdGVwLWJlZm9yZSI6IGQzX3N2Z19saW5lU3RlcEJlZm9yZSwKKyAgInN0ZXAtYWZ0ZXIiOiBkM19zdmdfbGluZVN0ZXBBZnRlciwKKyAgImJhc2lzIjogZDNfc3ZnX2xpbmVCYXNpcywKKyAgImJhc2lzLW9wZW4iOiBkM19zdmdfbGluZUJhc2lzT3BlbiwKKyAgImJhc2lzLWNsb3NlZCI6IGQzX3N2Z19saW5lQmFzaXNDbG9zZWQsCisgICJidW5kbGUiOiBkM19zdmdfbGluZUJ1bmRsZSwKKyAgImNhcmRpbmFsIjogZDNfc3ZnX2xpbmVDYXJkaW5hbCwKKyAgImNhcmRpbmFsLW9wZW4iOiBkM19zdmdfbGluZUNhcmRpbmFsT3BlbiwKKyAgImNhcmRpbmFsLWNsb3NlZCI6IGQzX3N2Z19saW5lQ2FyZGluYWxDbG9zZWQsCisgICJtb25vdG9uZSI6IGQzX3N2Z19saW5lTW9ub3RvbmUKK30pOworCisvLyBMaW5lYXIgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJMIiBjb21tYW5kcy4KK2Z1bmN0aW9uIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykgeworICB2YXIgaSA9IDAsCisgICAgICBuID0gcG9pbnRzLmxlbmd0aCwKKyAgICAgIHAgPSBwb2ludHNbMF0sCisgICAgICBwYXRoID0gW3BbMF0sICIsIiwgcFsxXV07CisgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2goIkwiLCAocCA9IHBvaW50c1tpXSlbMF0sICIsIiwgcFsxXSk7CisgIHJldHVybiBwYXRoLmpvaW4oIiIpOworfQorCisvLyBTdGVwIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiSCIgYW5kICJWIiBjb21tYW5kcy4KK2Z1bmN0aW9uIGQzX3N2Z19saW5lU3RlcEJlZm9yZShwb2ludHMpIHsKKyAgdmFyIGkgPSAwLAorICAgICAgbiA9IHBvaW50cy5sZW5ndGgsCisgICAgICBwID0gcG9pbnRzWzBdLAorICAgICAgcGF0aCA9IFtwWzBdLCAiLCIsIHBbMV1dOworICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKCJWIiwgKHAgPSBwb2ludHNbaV0pWzFdLCAiSCIsIHBbMF0pOworICByZXR1cm4gcGF0aC5qb2luKCIiKTsKK30KKworLy8gU3RlcCBpbnRlcnBvbGF0aW9uOyBnZW5lcmF0ZXMgIkgiIGFuZCAiViIgY29tbWFuZHMuCitmdW5jdGlvbiBkM19zdmdfbGluZVN0ZXBBZnRlcihwb2ludHMpIHsKKyAgdmFyIGkgPSAwLAorICAgICAgbiA9IHBvaW50cy5sZW5ndGgsCisgICAgICBwID0gcG9pbnRzWzBdLAorICAgICAgcGF0aCA9IFtwWzBdLCAiLCIsIHBbMV1dOworICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKCJIIiwgKHAgPSBwb2ludHNbaV0pWzBdLCAiViIsIHBbMV0pOworICByZXR1cm4gcGF0aC5qb2luKCIiKTsKK30KKworLy8gT3BlbiBjYXJkaW5hbCBzcGxpbmUgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJDIiBjb21tYW5kcy4KK2Z1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWxPcGVuKHBvaW50cywgdGVuc2lvbikgeworICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDQKKyAgICAgID8gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKQorICAgICAgOiBwb2ludHNbMV0gKyBkM19zdmdfbGluZUhlcm1pdGUocG9pbnRzLnNsaWNlKDEsIHBvaW50cy5sZW5ndGggLSAxKSwKKyAgICAgICAgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikpOworfQorCisvLyBDbG9zZWQgY2FyZGluYWwgc3BsaW5lIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiQyIgY29tbWFuZHMuCitmdW5jdGlvbiBkM19zdmdfbGluZUNhcmRpbmFsQ2xvc2VkKHBvaW50cywgdGVuc2lvbikgeworICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDMKKyAgICAgID8gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKQorICAgICAgOiBwb2ludHNbMF0gKyBkM19zdmdfbGluZUhlcm1pdGUoKHBvaW50cy5wdXNoKHBvaW50c1swXSksIHBvaW50cyksCisgICAgICAgIGQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyhbcG9pbnRzW3BvaW50cy5sZW5ndGggLSAyXV0KKyAgICAgICAgLmNvbmNhdChwb2ludHMsIFtwb2ludHNbMV1dKSwgdGVuc2lvbikpOworfQorCisvLyBDYXJkaW5hbCBzcGxpbmUgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJDIiBjb21tYW5kcy4KK2Z1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWwocG9pbnRzLCB0ZW5zaW9uLCBjbG9zZWQpIHsKKyAgcmV0dXJuIHBvaW50cy5sZW5ndGggPCAzCisgICAgICA/IGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykKKyAgICAgIDogcG9pbnRzWzBdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKHBvaW50cywKKyAgICAgICAgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikpOworfQorCisvLyBIZXJtaXRlIHNwbGluZSBjb25zdHJ1Y3Rpb247IGdlbmVyYXRlcyAiQyIgY29tbWFuZHMuCitmdW5jdGlvbiBkM19zdmdfbGluZUhlcm1pdGUocG9pbnRzLCB0YW5nZW50cykgeworICBpZiAodGFuZ2VudHMubGVuZ3RoIDwgMQorICAgICAgfHwgKHBvaW50cy5sZW5ndGggIT0gdGFuZ2VudHMubGVuZ3RoCisgICAgICAmJiBwb2ludHMubGVuZ3RoICE9IHRhbmdlbnRzLmxlbmd0aCArIDIpKSB7CisgICAgcmV0dXJuIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cyk7CisgIH0KKworICB2YXIgcXVhZCA9IHBvaW50cy5sZW5ndGggIT0gdGFuZ2VudHMubGVuZ3RoLAorICAgICAgcGF0aCA9ICIiLAorICAgICAgcDAgPSBwb2ludHNbMF0sCisgICAgICBwID0gcG9pbnRzWzFdLAorICAgICAgdDAgPSB0YW5nZW50c1swXSwKKyAgICAgIHQgPSB0MCwKKyAgICAgIHBpID0gMTsKKworICBpZiAocXVhZCkgeworICAgIHBhdGggKz0gIlEiICsgKHBbMF0gLSB0MFswXSAqIDIgLyAzKSArICIsIiArIChwWzFdIC0gdDBbMV0gKiAyIC8gMykKKyAgICAgICAgKyAiLCIgKyBwWzBdICsgIiwiICsgcFsxXTsKKyAgICBwMCA9IHBvaW50c1sxXTsKKyAgICBwaSA9IDI7CisgIH0KKworICBpZiAodGFuZ2VudHMubGVuZ3RoID4gMSkgeworICAgIHQgPSB0YW5nZW50c1sxXTsKKyAgICBwID0gcG9pbnRzW3BpXTsKKyAgICBwaSsrOworICAgIHBhdGggKz0gIkMiICsgKHAwWzBdICsgdDBbMF0pICsgIiwiICsgKHAwWzFdICsgdDBbMV0pCisgICAgICAgICsgIiwiICsgKHBbMF0gLSB0WzBdKSArICIsIiArIChwWzFdIC0gdFsxXSkKKyAgICAgICAgKyAiLCIgKyBwWzBdICsgIiwiICsgcFsxXTsKKyAgICBmb3IgKHZhciBpID0gMjsgaSA8IHRhbmdlbnRzLmxlbmd0aDsgaSsrLCBwaSsrKSB7CisgICAgICBwID0gcG9pbnRzW3BpXTsKKyAgICAgIHQgPSB0YW5nZW50c1tpXTsKKyAgICAgIHBhdGggKz0gIlMiICsgKHBbMF0gLSB0WzBdKSArICIsIiArIChwWzFdIC0gdFsxXSkKKyAgICAgICAgICArICIsIiArIHBbMF0gKyAiLCIgKyBwWzFdOworICAgIH0KKyAgfQorCisgIGlmIChxdWFkKSB7CisgICAgdmFyIGxwID0gcG9pbnRzW3BpXTsKKyAgICBwYXRoICs9ICJRIiArIChwWzBdICsgdFswXSAqIDIgLyAzKSArICIsIiArIChwWzFdICsgdFsxXSAqIDIgLyAzKQorICAgICAgICArICIsIiArIGxwWzBdICsgIiwiICsgbHBbMV07CisgIH0KKworICByZXR1cm4gcGF0aDsKK30KKworLy8gR2VuZXJhdGVzIHRhbmdlbnRzIGZvciBhIGNhcmRpbmFsIHNwbGluZS4KK2Z1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyhwb2ludHMsIHRlbnNpb24pIHsKKyAgdmFyIHRhbmdlbnRzID0gW10sCisgICAgICBhID0gKDEgLSB0ZW5zaW9uKSAvIDIsCisgICAgICBwMCwKKyAgICAgIHAxID0gcG9pbnRzWzBdLAorICAgICAgcDIgPSBwb2ludHNbMV0sCisgICAgICBpID0gMSwKKyAgICAgIG4gPSBwb2ludHMubGVuZ3RoOworICB3aGlsZSAoKytpIDwgbikgeworICAgIHAwID0gcDE7CisgICAgcDEgPSBwMjsKKyAgICBwMiA9IHBvaW50c1tpXTsKKyAgICB0YW5nZW50cy5wdXNoKFthICogKHAyWzBdIC0gcDBbMF0pLCBhICogKHAyWzFdIC0gcDBbMV0pXSk7CisgIH0KKyAgcmV0dXJuIHRhbmdlbnRzOworfQorCisvLyBCLXNwbGluZSBpbnRlcnBvbGF0aW9uOyBnZW5lcmF0ZXMgIkMiIGNvbW1hbmRzLgorZnVuY3Rpb24gZDNfc3ZnX2xpbmVCYXNpcyhwb2ludHMpIHsKKyAgaWYgKHBvaW50cy5sZW5ndGggPCAzKSByZXR1cm4gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKTsKKyAgdmFyIGkgPSAxLAorICAgICAgbiA9IHBvaW50cy5sZW5ndGgsCisgICAgICBwaSA9IHBvaW50c1swXSwKKyAgICAgIHgwID0gcGlbMF0sCisgICAgICB5MCA9IHBpWzFdLAorICAgICAgcHggPSBbeDAsIHgwLCB4MCwgKHBpID0gcG9pbnRzWzFdKVswXV0sCisgICAgICBweSA9IFt5MCwgeTAsIHkwLCBwaVsxXV0sCisgICAgICBwYXRoID0gW3gwLCAiLCIsIHkwXTsKKyAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOworICB3aGlsZSAoKytpIDwgbikgeworICAgIHBpID0gcG9pbnRzW2ldOworICAgIHB4LnNoaWZ0KCk7IHB4LnB1c2gocGlbMF0pOworICAgIHB5LnNoaWZ0KCk7IHB5LnB1c2gocGlbMV0pOworICAgIGQzX3N2Z19saW5lQmFzaXNCZXppZXIocGF0aCwgcHgsIHB5KTsKKyAgfQorICBpID0gLTE7CisgIHdoaWxlICgrK2kgPCAyKSB7CisgICAgcHguc2hpZnQoKTsgcHgucHVzaChwaVswXSk7CisgICAgcHkuc2hpZnQoKTsgcHkucHVzaChwaVsxXSk7CisgICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOworICB9CisgIHJldHVybiBwYXRoLmpvaW4oIiIpOworfQorCisvLyBPcGVuIEItc3BsaW5lIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiQyIgY29tbWFuZHMuCitmdW5jdGlvbiBkM19zdmdfbGluZUJhc2lzT3Blbihwb2ludHMpIHsKKyAgaWYgKHBvaW50cy5sZW5ndGggPCA0KSByZXR1cm4gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKTsKKyAgdmFyIHBhdGggPSBbXSwKKyAgICAgIGkgPSAtMSwKKyAgICAgIG4gPSBwb2ludHMubGVuZ3RoLAorICAgICAgcGksCisgICAgICBweCA9IFswXSwKKyAgICAgIHB5ID0gWzBdOworICB3aGlsZSAoKytpIDwgMykgeworICAgIHBpID0gcG9pbnRzW2ldOworICAgIHB4LnB1c2gocGlbMF0pOworICAgIHB5LnB1c2gocGlbMV0pOworICB9CisgIHBhdGgucHVzaChkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB4KQorICAgICsgIiwiICsgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweSkpOworICAtLWk7IHdoaWxlICgrK2kgPCBuKSB7CisgICAgcGkgPSBwb2ludHNbaV07CisgICAgcHguc2hpZnQoKTsgcHgucHVzaChwaVswXSk7CisgICAgcHkuc2hpZnQoKTsgcHkucHVzaChwaVsxXSk7CisgICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOworICB9CisgIHJldHVybiBwYXRoLmpvaW4oIiIpOworfQorCisvLyBDbG9zZWQgQi1zcGxpbmUgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJDIiBjb21tYW5kcy4KK2Z1bmN0aW9uIGQzX3N2Z19saW5lQmFzaXNDbG9zZWQocG9pbnRzKSB7CisgIHZhciBwYXRoLAorICAgICAgaSA9IC0xLAorICAgICAgbiA9IHBvaW50cy5sZW5ndGgsCisgICAgICBtID0gbiArIDQsCisgICAgICBwaSwKKyAgICAgIHB4ID0gW10sCisgICAgICBweSA9IFtdOworICB3aGlsZSAoKytpIDwgNCkgeworICAgIHBpID0gcG9pbnRzW2kgJSBuXTsKKyAgICBweC5wdXNoKHBpWzBdKTsKKyAgICBweS5wdXNoKHBpWzFdKTsKKyAgfQorICBwYXRoID0gWworICAgIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHgpLCAiLCIsCisgICAgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweSkKKyAgXTsKKyAgLS1pOyB3aGlsZSAoKytpIDwgbSkgeworICAgIHBpID0gcG9pbnRzW2kgJSBuXTsKKyAgICBweC5zaGlmdCgpOyBweC5wdXNoKHBpWzBdKTsKKyAgICBweS5zaGlmdCgpOyBweS5wdXNoKHBpWzFdKTsKKyAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHB4LCBweSk7CisgIH0KKyAgcmV0dXJuIHBhdGguam9pbigiIik7Cit9CisKK2Z1bmN0aW9uIGQzX3N2Z19saW5lQnVuZGxlKHBvaW50cywgdGVuc2lvbikgeworICB2YXIgbiA9IHBvaW50cy5sZW5ndGggLSAxLAorICAgICAgeDAgPSBwb2ludHNbMF1bMF0sCisgICAgICB5MCA9IHBvaW50c1swXVsxXSwKKyAgICAgIGR4ID0gcG9pbnRzW25dWzBdIC0geDAsCisgICAgICBkeSA9IHBvaW50c1tuXVsxXSAtIHkwLAorICAgICAgaSA9IC0xLAorICAgICAgcCwKKyAgICAgIHQ7CisgIHdoaWxlICgrK2kgPD0gbikgeworICAgIHAgPSBwb2ludHNbaV07CisgICAgdCA9IGkgLyBuOworICAgIHBbMF0gPSB0ZW5zaW9uICogcFswXSArICgxIC0gdGVuc2lvbikgKiAoeDAgKyB0ICogZHgpOworICAgIHBbMV0gPSB0ZW5zaW9uICogcFsxXSArICgxIC0gdGVuc2lvbikgKiAoeTAgKyB0ICogZHkpOworICB9CisgIHJldHVybiBkM19zdmdfbGluZUJhc2lzKHBvaW50cyk7Cit9CisKKy8vIFJldHVybnMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoZSBnaXZlbiBmb3VyLWVsZW1lbnQgdmVjdG9ycy4KK2Z1bmN0aW9uIGQzX3N2Z19saW5lRG90NChhLCBiKSB7CisgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl0gKyBhWzNdICogYlszXTsKK30KKworLy8gTWF0cml4IHRvIHRyYW5zZm9ybSBiYXNpcyAoYi1zcGxpbmUpIGNvbnRyb2wgcG9pbnRzIHRvIGJlemllcgorLy8gY29udHJvbCBwb2ludHMuIERlcml2ZWQgZnJvbSBGdkQgMTEuMi44LgordmFyIGQzX3N2Z19saW5lQmFzaXNCZXppZXIxID0gWzAsIDIvMywgMS8zLCAwXSwKKyAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyMiA9IFswLCAxLzMsIDIvMywgMF0sCisgICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMgPSBbMCwgMS82LCAyLzMsIDEvNl07CisKKy8vIFB1c2hlcyBhICJDIiBCw6l6aWVyIGN1cnZlIG9udG8gdGhlIHNwZWNpZmllZCBwYXRoIGFycmF5LCBnaXZlbiB0aGUKKy8vIHR3byBzcGVjaWZpZWQgZm91ci1lbGVtZW50IGFycmF5cyB3aGljaCBkZWZpbmUgdGhlIGNvbnRyb2wgcG9pbnRzLgorZnVuY3Rpb24gZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCB4LCB5KSB7CisgIHBhdGgucHVzaCgKKyAgICAgICJDIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIxLCB4KSwKKyAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIxLCB5KSwKKyAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIyLCB4KSwKKyAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIyLCB5KSwKKyAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCB4KSwKKyAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCB5KSk7Cit9CisKKy8vIENvbXB1dGVzIHRoZSBzbG9wZSBmcm9tIHBvaW50cyBwMCB0byBwMS4KK2Z1bmN0aW9uIGQzX3N2Z19saW5lU2xvcGUocDAsIHAxKSB7CisgIHJldHVybiAocDFbMV0gLSBwMFsxXSkgLyAocDFbMF0gLSBwMFswXSk7Cit9CisKKy8vIENvbXB1dGUgdGhyZWUtcG9pbnQgZGlmZmVyZW5jZXMgZm9yIHRoZSBnaXZlbiBwb2ludHMuCisvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1YmljX0hlcm1pdGVfc3BsaW5lI0Zpbml0ZV9kaWZmZXJlbmNlCitmdW5jdGlvbiBkM19zdmdfbGluZUZpbml0ZURpZmZlcmVuY2VzKHBvaW50cykgeworICB2YXIgaSA9IDAsCisgICAgICBqID0gcG9pbnRzLmxlbmd0aCAtIDEsCisgICAgICBtID0gW10sCisgICAgICBwMCA9IHBvaW50c1swXSwKKyAgICAgIHAxID0gcG9pbnRzWzFdLAorICAgICAgZCA9IG1bMF0gPSBkM19zdmdfbGluZVNsb3BlKHAwLCBwMSk7CisgIHdoaWxlICgrK2kgPCBqKSB7CisgICAgbVtpXSA9IGQgKyAoZCA9IGQzX3N2Z19saW5lU2xvcGUocDAgPSBwMSwgcDEgPSBwb2ludHNbaSArIDFdKSk7CisgIH0KKyAgbVtpXSA9IGQ7CisgIHJldHVybiBtOworfQorCisvLyBJbnRlcnBvbGF0ZXMgdGhlIGdpdmVuIHBvaW50cyB1c2luZyBGcml0c2NoLUNhcmxzb24gTW9ub3RvbmUgY3ViaWMgSGVybWl0ZQorLy8gaW50ZXJwb2xhdGlvbi4gUmV0dXJucyBhbiBhcnJheSBvZiB0YW5nZW50IHZlY3RvcnMuIEZvciBkZXRhaWxzLCBzZWUKKy8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9ub3RvbmVfY3ViaWNfaW50ZXJwb2xhdGlvbgorZnVuY3Rpb24gZDNfc3ZnX2xpbmVNb25vdG9uZVRhbmdlbnRzKHBvaW50cykgeworICB2YXIgdGFuZ2VudHMgPSBbXSwKKyAgICAgIGQsCisgICAgICBhLAorICAgICAgYiwKKyAgICAgIHMsCisgICAgICBtID0gZDNfc3ZnX2xpbmVGaW5pdGVEaWZmZXJlbmNlcyhwb2ludHMpLAorICAgICAgaSA9IC0xLAorICAgICAgaiA9IHBvaW50cy5sZW5ndGggLSAxOworCisgIC8vIFRoZSBmaXJzdCB0d28gc3RlcHMgYXJlIGRvbmUgYnkgY29tcHV0aW5nIGZpbml0ZS1kaWZmZXJlbmNlczoKKyAgLy8gMS4gQ29tcHV0ZSB0aGUgc2xvcGVzIG9mIHRoZSBzZWNhbnQgbGluZXMgYmV0d2VlbiBzdWNjZXNzaXZlIHBvaW50cy4KKyAgLy8gMi4gSW5pdGlhbGl6ZSB0aGUgdGFuZ2VudHMgYXQgZXZlcnkgcG9pbnQgYXMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHNlY2FudHMuCisKKyAgLy8gVGhlbiwgZm9yIGVhY2ggc2VnbWVudOKAPworICB3aGlsZSAoKytpIDwgaikgeworICAgIGQgPSBkM19zdmdfbGluZVNsb3BlKHBvaW50c1tpXSwgcG9pbnRzW2kgKyAxXSk7CisKKyAgICAvLyAzLiBJZiB0d28gc3VjY2Vzc2l2ZSB5ayA9IHl7ayArIDF9IGFyZSBlcXVhbCAoaS5lLiwgZCBpcyB6ZXJvKSwgdGhlbiBzZXQKKyAgICAvLyBtayA9IG17ayArIDF9ID0gMCBhcyB0aGUgc3BsaW5lIGNvbm5lY3RpbmcgdGhlc2UgcG9pbnRzIG11c3QgYmUgZmxhdCB0bworICAgIC8vIHByZXNlcnZlIG1vbm90b25pY2l0eS4gSWdub3JlIHN0ZXAgNCBhbmQgNSBmb3IgdGhvc2Ugay4KKworICAgIGlmIChNYXRoLmFicyhkKSA8IDFlLTYpIHsKKyAgICAgIG1baV0gPSBtW2kgKyAxXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIDQuIExldCBhayA9IG1rIC8gZGsgYW5kIGJrID0gbXtrICsgMX0gLyBkay4KKyAgICAgIGEgPSBtW2ldIC8gZDsKKyAgICAgIGIgPSBtW2kgKyAxXSAvIGQ7CisKKyAgICAgIC8vIDUuIFByZXZlbnQgb3ZlcnNob290IGFuZCBlbnN1cmUgbW9ub3RvbmljaXR5IGJ5IHJlc3RyaWN0aW5nIHRoZQorICAgICAgLy8gbWFnbml0dWRlIG9mIHZlY3RvciA8YWssIGJrPiB0byBhIGNpcmNsZSBvZiByYWRpdXMgMy4KKyAgICAgIHMgPSBhICogYSArIGIgKiBiOworICAgICAgaWYgKHMgPiA5KSB7CisgICAgICAgIHMgPSBkICogMyAvIE1hdGguc3FydChzKTsKKyAgICAgICAgbVtpXSA9IHMgKiBhOworICAgICAgICBtW2kgKyAxXSA9IHMgKiBiOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENvbXB1dGUgdGhlIG5vcm1hbGl6ZWQgdGFuZ2VudCB2ZWN0b3IgZnJvbSB0aGUgc2xvcGVzLiBOb3RlIHRoYXQgaWYgeCBpcworICAvLyBub3QgbW9ub3RvbmljLCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNsb3BlIHdpbGwgYmUgaW5maW5pdGUsIHNvIHdlIHByb3RlY3QKKyAgLy8gYWdhaW5zdCBOYU4gYnkgc2V0dGluZyB0aGUgY29vcmRpbmF0ZSB0byB6ZXJvLgorICBpID0gLTE7IHdoaWxlICgrK2kgPD0gaikgeworICAgIHMgPSAocG9pbnRzW01hdGgubWluKGosIGkgKyAxKV1bMF0gLSBwb2ludHNbTWF0aC5tYXgoMCwgaSAtIDEpXVswXSkKKyAgICAgIC8gKDYgKiAoMSArIG1baV0gKiBtW2ldKSk7CisgICAgdGFuZ2VudHMucHVzaChbcyB8fCAwLCBtW2ldICogcyB8fCAwXSk7CisgIH0KKworICByZXR1cm4gdGFuZ2VudHM7Cit9CisKK2Z1bmN0aW9uIGQzX3N2Z19saW5lTW9ub3RvbmUocG9pbnRzKSB7CisgIHJldHVybiBwb2ludHMubGVuZ3RoIDwgMworICAgICAgPyBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpCisgICAgICA6IHBvaW50c1swXSArCisgICAgICAgIGQzX3N2Z19saW5lSGVybWl0ZShwb2ludHMsIGQzX3N2Z19saW5lTW9ub3RvbmVUYW5nZW50cyhwb2ludHMpKTsKK30KK2QzLnN2Zy5saW5lLnJhZGlhbCA9IGZ1bmN0aW9uKCkgeworICB2YXIgbGluZSA9IGQzX3N2Z19saW5lKGQzX3N2Z19saW5lUmFkaWFsKTsKKyAgbGluZS5yYWRpdXMgPSBsaW5lLngsIGRlbGV0ZSBsaW5lLng7CisgIGxpbmUuYW5nbGUgPSBsaW5lLnksIGRlbGV0ZSBsaW5lLnk7CisgIHJldHVybiBsaW5lOworfTsKKworZnVuY3Rpb24gZDNfc3ZnX2xpbmVSYWRpYWwocG9pbnRzKSB7CisgIHZhciBwb2ludCwKKyAgICAgIGkgPSAtMSwKKyAgICAgIG4gPSBwb2ludHMubGVuZ3RoLAorICAgICAgciwKKyAgICAgIGE7CisgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgcG9pbnQgPSBwb2ludHNbaV07CisgICAgciA9IHBvaW50WzBdOworICAgIGEgPSBwb2ludFsxXSArIGQzX3N2Z19hcmNPZmZzZXQ7CisgICAgcG9pbnRbMF0gPSByICogTWF0aC5jb3MoYSk7CisgICAgcG9pbnRbMV0gPSByICogTWF0aC5zaW4oYSk7CisgIH0KKyAgcmV0dXJuIHBvaW50czsKK30KK2Z1bmN0aW9uIGQzX3N2Z19hcmVhKHByb2plY3Rpb24pIHsKKyAgdmFyIHgwID0gZDNfc3ZnX2xpbmVYLAorICAgICAgeDEgPSBkM19zdmdfbGluZVgsCisgICAgICB5MCA9IDAsCisgICAgICB5MSA9IGQzX3N2Z19saW5lWSwKKyAgICAgIGludGVycG9sYXRlLAorICAgICAgaTAsCisgICAgICBpMSwKKyAgICAgIHRlbnNpb24gPSAuNzsKKworICBmdW5jdGlvbiBhcmVhKGQpIHsKKyAgICBpZiAoZC5sZW5ndGggPCAxKSByZXR1cm4gbnVsbDsKKyAgICB2YXIgcG9pbnRzMCA9IGQzX3N2Z19saW5lUG9pbnRzKHRoaXMsIGQsIHgwLCB5MCksCisgICAgICAgIHBvaW50czEgPSBkM19zdmdfbGluZVBvaW50cyh0aGlzLCBkLCB4MCA9PT0geDEgPyBkM19zdmdfYXJlYVgocG9pbnRzMCkgOiB4MSwgeTAgPT09IHkxID8gZDNfc3ZnX2FyZWFZKHBvaW50czApIDogeTEpOworICAgIHJldHVybiAiTSIgKyBpMChwcm9qZWN0aW9uKHBvaW50czEpLCB0ZW5zaW9uKQorICAgICAgICAgKyAiTCIgKyBpMShwcm9qZWN0aW9uKHBvaW50czAucmV2ZXJzZSgpKSwgdGVuc2lvbikKKyAgICAgICAgICsgIloiOworICB9CisKKyAgYXJlYS54ID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxOworICAgIHgwID0geDEgPSB4OworICAgIHJldHVybiBhcmVhOworICB9OworCisgIGFyZWEueDAgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDA7CisgICAgeDAgPSB4OworICAgIHJldHVybiBhcmVhOworICB9OworCisgIGFyZWEueDEgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDE7CisgICAgeDEgPSB4OworICAgIHJldHVybiBhcmVhOworICB9OworCisgIGFyZWEueSA9IGZ1bmN0aW9uKHkpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5MTsKKyAgICB5MCA9IHkxID0geTsKKyAgICByZXR1cm4gYXJlYTsKKyAgfTsKKworICBhcmVhLnkwID0gZnVuY3Rpb24oeSkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkwOworICAgIHkwID0geTsKKyAgICByZXR1cm4gYXJlYTsKKyAgfTsKKworICBhcmVhLnkxID0gZnVuY3Rpb24oeSkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkxOworICAgIHkxID0geTsKKyAgICByZXR1cm4gYXJlYTsKKyAgfTsKKworICBhcmVhLmludGVycG9sYXRlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGludGVycG9sYXRlOworICAgIGlmICghZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmhhcyh4ICs9ICIiKSkgeCA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9yRGVmYXVsdDsKKyAgICBpMCA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycy5nZXQoaW50ZXJwb2xhdGUgPSB4KTsKKyAgICBpMSA9IGkwLnJldmVyc2UgfHwgaTA7CisgICAgcmV0dXJuIGFyZWE7CisgIH07CisKKyAgYXJlYS50ZW5zaW9uID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRlbnNpb247CisgICAgdGVuc2lvbiA9IHg7CisgICAgcmV0dXJuIGFyZWE7CisgIH07CisKKyAgcmV0dXJuIGFyZWEuaW50ZXJwb2xhdGUoImxpbmVhciIpOworfQorCitkM19zdmdfbGluZVN0ZXBCZWZvcmUucmV2ZXJzZSA9IGQzX3N2Z19saW5lU3RlcEFmdGVyOworZDNfc3ZnX2xpbmVTdGVwQWZ0ZXIucmV2ZXJzZSA9IGQzX3N2Z19saW5lU3RlcEJlZm9yZTsKKworZDMuc3ZnLmFyZWEgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIGQzX3N2Z19hcmVhKE9iamVjdCk7Cit9OworCitmdW5jdGlvbiBkM19zdmdfYXJlYVgocG9pbnRzKSB7CisgIHJldHVybiBmdW5jdGlvbihkLCBpKSB7CisgICAgcmV0dXJuIHBvaW50c1tpXVswXTsKKyAgfTsKK30KKworZnVuY3Rpb24gZDNfc3ZnX2FyZWFZKHBvaW50cykgeworICByZXR1cm4gZnVuY3Rpb24oZCwgaSkgeworICAgIHJldHVybiBwb2ludHNbaV1bMV07CisgIH07Cit9CitkMy5zdmcuYXJlYS5yYWRpYWwgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGFyZWEgPSBkM19zdmdfYXJlYShkM19zdmdfbGluZVJhZGlhbCk7CisgIGFyZWEucmFkaXVzID0gYXJlYS54LCBkZWxldGUgYXJlYS54OworICBhcmVhLmlubmVyUmFkaXVzID0gYXJlYS54MCwgZGVsZXRlIGFyZWEueDA7CisgIGFyZWEub3V0ZXJSYWRpdXMgPSBhcmVhLngxLCBkZWxldGUgYXJlYS54MTsKKyAgYXJlYS5hbmdsZSA9IGFyZWEueSwgZGVsZXRlIGFyZWEueTsKKyAgYXJlYS5zdGFydEFuZ2xlID0gYXJlYS55MCwgZGVsZXRlIGFyZWEueTA7CisgIGFyZWEuZW5kQW5nbGUgPSBhcmVhLnkxLCBkZWxldGUgYXJlYS55MTsKKyAgcmV0dXJuIGFyZWE7Cit9OworZDMuc3ZnLmNob3JkID0gZnVuY3Rpb24oKSB7CisgIHZhciBzb3VyY2UgPSBkM19zdmdfY2hvcmRTb3VyY2UsCisgICAgICB0YXJnZXQgPSBkM19zdmdfY2hvcmRUYXJnZXQsCisgICAgICByYWRpdXMgPSBkM19zdmdfY2hvcmRSYWRpdXMsCisgICAgICBzdGFydEFuZ2xlID0gZDNfc3ZnX2FyY1N0YXJ0QW5nbGUsCisgICAgICBlbmRBbmdsZSA9IGQzX3N2Z19hcmNFbmRBbmdsZTsKKworICAvLyBUT0RPIEFsbG93IGNvbnRyb2wgcG9pbnQgdG8gYmUgY3VzdG9taXplZC4KKworICBmdW5jdGlvbiBjaG9yZChkLCBpKSB7CisgICAgdmFyIHMgPSBzdWJncm91cCh0aGlzLCBzb3VyY2UsIGQsIGkpLAorICAgICAgICB0ID0gc3ViZ3JvdXAodGhpcywgdGFyZ2V0LCBkLCBpKTsKKyAgICByZXR1cm4gIk0iICsgcy5wMAorICAgICAgKyBhcmMocy5yLCBzLnAxLCBzLmExIC0gcy5hMCkgKyAoZXF1YWxzKHMsIHQpCisgICAgICA/IGN1cnZlKHMuciwgcy5wMSwgcy5yLCBzLnAwKQorICAgICAgOiBjdXJ2ZShzLnIsIHMucDEsIHQuciwgdC5wMCkKKyAgICAgICsgYXJjKHQuciwgdC5wMSwgdC5hMSAtIHQuYTApCisgICAgICArIGN1cnZlKHQuciwgdC5wMSwgcy5yLCBzLnAwKSkKKyAgICAgICsgIloiOworICB9CisKKyAgZnVuY3Rpb24gc3ViZ3JvdXAoc2VsZiwgZiwgZCwgaSkgeworICAgIHZhciBzdWJncm91cCA9IGYuY2FsbChzZWxmLCBkLCBpKSwKKyAgICAgICAgciA9IHJhZGl1cy5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSwKKyAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmNhbGwoc2VsZiwgc3ViZ3JvdXAsIGkpICsgZDNfc3ZnX2FyY09mZnNldCwKKyAgICAgICAgYTEgPSBlbmRBbmdsZS5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSArIGQzX3N2Z19hcmNPZmZzZXQ7CisgICAgcmV0dXJuIHsKKyAgICAgIHI6IHIsCisgICAgICBhMDogYTAsCisgICAgICBhMTogYTEsCisgICAgICBwMDogW3IgKiBNYXRoLmNvcyhhMCksIHIgKiBNYXRoLnNpbihhMCldLAorICAgICAgcDE6IFtyICogTWF0aC5jb3MoYTEpLCByICogTWF0aC5zaW4oYTEpXQorICAgIH07CisgIH0KKworICBmdW5jdGlvbiBlcXVhbHMoYSwgYikgeworICAgIHJldHVybiBhLmEwID09IGIuYTAgJiYgYS5hMSA9PSBiLmExOworICB9CisKKyAgZnVuY3Rpb24gYXJjKHIsIHAsIGEpIHsKKyAgICByZXR1cm4gIkEiICsgciArICIsIiArIHIgKyAiIDAgIiArICsoYSA+IE1hdGguUEkpICsgIiwxICIgKyBwOworICB9CisKKyAgZnVuY3Rpb24gY3VydmUocjAsIHAwLCByMSwgcDEpIHsKKyAgICByZXR1cm4gIlEgMCwwICIgKyBwMTsKKyAgfQorCisgIGNob3JkLnJhZGl1cyA9IGZ1bmN0aW9uKHYpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYWRpdXM7CisgICAgcmFkaXVzID0gZDMuZnVuY3Rvcih2KTsKKyAgICByZXR1cm4gY2hvcmQ7CisgIH07CisKKyAgY2hvcmQuc291cmNlID0gZnVuY3Rpb24odikgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvdXJjZTsKKyAgICBzb3VyY2UgPSBkMy5mdW5jdG9yKHYpOworICAgIHJldHVybiBjaG9yZDsKKyAgfTsKKworICBjaG9yZC50YXJnZXQgPSBmdW5jdGlvbih2KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0OworICAgIHRhcmdldCA9IGQzLmZ1bmN0b3Iodik7CisgICAgcmV0dXJuIGNob3JkOworICB9OworCisgIGNob3JkLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbih2KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc3RhcnRBbmdsZTsKKyAgICBzdGFydEFuZ2xlID0gZDMuZnVuY3Rvcih2KTsKKyAgICByZXR1cm4gY2hvcmQ7CisgIH07CisKKyAgY2hvcmQuZW5kQW5nbGUgPSBmdW5jdGlvbih2KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZW5kQW5nbGU7CisgICAgZW5kQW5nbGUgPSBkMy5mdW5jdG9yKHYpOworICAgIHJldHVybiBjaG9yZDsKKyAgfTsKKworICByZXR1cm4gY2hvcmQ7Cit9OworCitmdW5jdGlvbiBkM19zdmdfY2hvcmRTb3VyY2UoZCkgeworICByZXR1cm4gZC5zb3VyY2U7Cit9CisKK2Z1bmN0aW9uIGQzX3N2Z19jaG9yZFRhcmdldChkKSB7CisgIHJldHVybiBkLnRhcmdldDsKK30KKworZnVuY3Rpb24gZDNfc3ZnX2Nob3JkUmFkaXVzKGQpIHsKKyAgcmV0dXJuIGQucmFkaXVzOworfQorCitmdW5jdGlvbiBkM19zdmdfY2hvcmRTdGFydEFuZ2xlKGQpIHsKKyAgcmV0dXJuIGQuc3RhcnRBbmdsZTsKK30KKworZnVuY3Rpb24gZDNfc3ZnX2Nob3JkRW5kQW5nbGUoZCkgeworICByZXR1cm4gZC5lbmRBbmdsZTsKK30KK2QzLnN2Zy5kaWFnb25hbCA9IGZ1bmN0aW9uKCkgeworICB2YXIgc291cmNlID0gZDNfc3ZnX2Nob3JkU291cmNlLAorICAgICAgdGFyZ2V0ID0gZDNfc3ZnX2Nob3JkVGFyZ2V0LAorICAgICAgcHJvamVjdGlvbiA9IGQzX3N2Z19kaWFnb25hbFByb2plY3Rpb247CisKKyAgZnVuY3Rpb24gZGlhZ29uYWwoZCwgaSkgeworICAgIHZhciBwMCA9IHNvdXJjZS5jYWxsKHRoaXMsIGQsIGkpLAorICAgICAgICBwMyA9IHRhcmdldC5jYWxsKHRoaXMsIGQsIGkpLAorICAgICAgICBtID0gKHAwLnkgKyBwMy55KSAvIDIsCisgICAgICAgIHAgPSBbcDAsIHt4OiBwMC54LCB5OiBtfSwge3g6IHAzLngsIHk6IG19LCBwM107CisgICAgcCA9IHAubWFwKHByb2plY3Rpb24pOworICAgIHJldHVybiAiTSIgKyBwWzBdICsgIkMiICsgcFsxXSArICIgIiArIHBbMl0gKyAiICIgKyBwWzNdOworICB9CisKKyAgZGlhZ29uYWwuc291cmNlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvdXJjZTsKKyAgICBzb3VyY2UgPSBkMy5mdW5jdG9yKHgpOworICAgIHJldHVybiBkaWFnb25hbDsKKyAgfTsKKworICBkaWFnb25hbC50YXJnZXQgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0OworICAgIHRhcmdldCA9IGQzLmZ1bmN0b3IoeCk7CisgICAgcmV0dXJuIGRpYWdvbmFsOworICB9OworCisgIGRpYWdvbmFsLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcHJvamVjdGlvbjsKKyAgICBwcm9qZWN0aW9uID0geDsKKyAgICByZXR1cm4gZGlhZ29uYWw7CisgIH07CisKKyAgcmV0dXJuIGRpYWdvbmFsOworfTsKKworZnVuY3Rpb24gZDNfc3ZnX2RpYWdvbmFsUHJvamVjdGlvbihkKSB7CisgIHJldHVybiBbZC54LCBkLnldOworfQorZDMuc3ZnLmRpYWdvbmFsLnJhZGlhbCA9IGZ1bmN0aW9uKCkgeworICB2YXIgZGlhZ29uYWwgPSBkMy5zdmcuZGlhZ29uYWwoKSwKKyAgICAgIHByb2plY3Rpb24gPSBkM19zdmdfZGlhZ29uYWxQcm9qZWN0aW9uLAorICAgICAgcHJvamVjdGlvbl8gPSBkaWFnb25hbC5wcm9qZWN0aW9uOworCisgIGRpYWdvbmFsLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7CisgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKKyAgICAgICAgPyBwcm9qZWN0aW9uXyhkM19zdmdfZGlhZ29uYWxSYWRpYWxQcm9qZWN0aW9uKHByb2plY3Rpb24gPSB4KSkKKyAgICAgICAgOiBwcm9qZWN0aW9uOworICB9OworCisgIHJldHVybiBkaWFnb25hbDsKK307CisKK2Z1bmN0aW9uIGQzX3N2Z19kaWFnb25hbFJhZGlhbFByb2plY3Rpb24ocHJvamVjdGlvbikgeworICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgdmFyIGQgPSBwcm9qZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCisgICAgICAgIHIgPSBkWzBdLAorICAgICAgICBhID0gZFsxXSArIGQzX3N2Z19hcmNPZmZzZXQ7CisgICAgcmV0dXJuIFtyICogTWF0aC5jb3MoYSksIHIgKiBNYXRoLnNpbihhKV07CisgIH07Cit9CitkMy5zdmcubW91c2UgPSBkMy5tb3VzZTsKK2QzLnN2Zy50b3VjaGVzID0gZDMudG91Y2hlczsKK2QzLnN2Zy5zeW1ib2wgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHR5cGUgPSBkM19zdmdfc3ltYm9sVHlwZSwKKyAgICAgIHNpemUgPSBkM19zdmdfc3ltYm9sU2l6ZTsKKworICBmdW5jdGlvbiBzeW1ib2woZCwgaSkgeworICAgIHJldHVybiAoZDNfc3ZnX3N5bWJvbHMuZ2V0KHR5cGUuY2FsbCh0aGlzLCBkLCBpKSkKKyAgICAgICAgfHwgZDNfc3ZnX3N5bWJvbENpcmNsZSkKKyAgICAgICAgKHNpemUuY2FsbCh0aGlzLCBkLCBpKSk7CisgIH0KKworICBzeW1ib2wudHlwZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0eXBlOworICAgIHR5cGUgPSBkMy5mdW5jdG9yKHgpOworICAgIHJldHVybiBzeW1ib2w7CisgIH07CisKKyAgLy8gc2l6ZSBvZiBzeW1ib2wgaW4gc3F1YXJlIHBpeGVscworICBzeW1ib2wuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOworICAgIHNpemUgPSBkMy5mdW5jdG9yKHgpOworICAgIHJldHVybiBzeW1ib2w7CisgIH07CisKKyAgcmV0dXJuIHN5bWJvbDsKK307CisKK2Z1bmN0aW9uIGQzX3N2Z19zeW1ib2xTaXplKCkgeworICByZXR1cm4gNjQ7Cit9CisKK2Z1bmN0aW9uIGQzX3N2Z19zeW1ib2xUeXBlKCkgeworICByZXR1cm4gImNpcmNsZSI7Cit9CisKK2Z1bmN0aW9uIGQzX3N2Z19zeW1ib2xDaXJjbGUoc2l6ZSkgeworICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gTWF0aC5QSSk7CisgIHJldHVybiAiTTAsIiArIHIKKyAgICAgICsgIkEiICsgciArICIsIiArIHIgKyAiIDAgMSwxIDAsIiArICgtcikKKyAgICAgICsgIkEiICsgciArICIsIiArIHIgKyAiIDAgMSwxIDAsIiArIHIKKyAgICAgICsgIloiOworfQorCisvLyBUT0RPIGNyb3NzLWRpYWdvbmFsPwordmFyIGQzX3N2Z19zeW1ib2xzID0gZDMubWFwKHsKKyAgImNpcmNsZSI6IGQzX3N2Z19zeW1ib2xDaXJjbGUsCisgICJjcm9zcyI6IGZ1bmN0aW9uKHNpemUpIHsKKyAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gNSkgLyAyOworICAgIHJldHVybiAiTSIgKyAtMyAqIHIgKyAiLCIgKyAtcgorICAgICAgICArICJIIiArIC1yCisgICAgICAgICsgIlYiICsgLTMgKiByCisgICAgICAgICsgIkgiICsgcgorICAgICAgICArICJWIiArIC1yCisgICAgICAgICsgIkgiICsgMyAqIHIKKyAgICAgICAgKyAiViIgKyByCisgICAgICAgICsgIkgiICsgcgorICAgICAgICArICJWIiArIDMgKiByCisgICAgICAgICsgIkgiICsgLXIKKyAgICAgICAgKyAiViIgKyByCisgICAgICAgICsgIkgiICsgLTMgKiByCisgICAgICAgICsgIloiOworICB9LAorICAiZGlhbW9uZCI6IGZ1bmN0aW9uKHNpemUpIHsKKyAgICB2YXIgcnkgPSBNYXRoLnNxcnQoc2l6ZSAvICgyICogZDNfc3ZnX3N5bWJvbFRhbjMwKSksCisgICAgICAgIHJ4ID0gcnkgKiBkM19zdmdfc3ltYm9sVGFuMzA7CisgICAgcmV0dXJuICJNMCwiICsgLXJ5CisgICAgICAgICsgIkwiICsgcnggKyAiLDAiCisgICAgICAgICsgIiAwLCIgKyByeQorICAgICAgICArICIgIiArIC1yeCArICIsMCIKKyAgICAgICAgKyAiWiI7CisgIH0sCisgICJzcXVhcmUiOiBmdW5jdGlvbihzaXplKSB7CisgICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSkgLyAyOworICAgIHJldHVybiAiTSIgKyAtciArICIsIiArIC1yCisgICAgICAgICsgIkwiICsgciArICIsIiArIC1yCisgICAgICAgICsgIiAiICsgciArICIsIiArIHIKKyAgICAgICAgKyAiICIgKyAtciArICIsIiArIHIKKyAgICAgICAgKyAiWiI7CisgIH0sCisgICJ0cmlhbmdsZS1kb3duIjogZnVuY3Rpb24oc2l6ZSkgeworICAgIHZhciByeCA9IE1hdGguc3FydChzaXplIC8gZDNfc3ZnX3N5bWJvbFNxcnQzKSwKKyAgICAgICAgcnkgPSByeCAqIGQzX3N2Z19zeW1ib2xTcXJ0MyAvIDI7CisgICAgcmV0dXJuICJNMCwiICsgcnkKKyAgICAgICAgKyAiTCIgKyByeCArIiwiICsgLXJ5CisgICAgICAgICsgIiAiICsgLXJ4ICsgIiwiICsgLXJ5CisgICAgICAgICsgIloiOworICB9LAorICAidHJpYW5nbGUtdXAiOiBmdW5jdGlvbihzaXplKSB7CisgICAgdmFyIHJ4ID0gTWF0aC5zcXJ0KHNpemUgLyBkM19zdmdfc3ltYm9sU3FydDMpLAorICAgICAgICByeSA9IHJ4ICogZDNfc3ZnX3N5bWJvbFNxcnQzIC8gMjsKKyAgICByZXR1cm4gIk0wLCIgKyAtcnkKKyAgICAgICAgKyAiTCIgKyByeCArIiwiICsgcnkKKyAgICAgICAgKyAiICIgKyAtcnggKyAiLCIgKyByeQorICAgICAgICArICJaIjsKKyAgfQorfSk7CisKK2QzLnN2Zy5zeW1ib2xUeXBlcyA9IGQzX3N2Z19zeW1ib2xzLmtleXMoKTsKKwordmFyIGQzX3N2Z19zeW1ib2xTcXJ0MyA9IE1hdGguc3FydCgzKSwKKyAgICBkM19zdmdfc3ltYm9sVGFuMzAgPSBNYXRoLnRhbigzMCAqIE1hdGguUEkgLyAxODApOworZDMuc3ZnLmF4aXMgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHNjYWxlID0gZDMuc2NhbGUubGluZWFyKCksCisgICAgICBvcmllbnQgPSAiYm90dG9tIiwKKyAgICAgIHRpY2tNYWpvclNpemUgPSA2LAorICAgICAgdGlja01pbm9yU2l6ZSA9IDYsCisgICAgICB0aWNrRW5kU2l6ZSA9IDYsCisgICAgICB0aWNrUGFkZGluZyA9IDMsCisgICAgICB0aWNrQXJndW1lbnRzXyA9IFsxMF0sCisgICAgICB0aWNrVmFsdWVzID0gbnVsbCwKKyAgICAgIHRpY2tGb3JtYXRfLAorICAgICAgdGlja1N1YmRpdmlkZSA9IDA7CisKKyAgZnVuY3Rpb24gYXhpcyhnKSB7CisgICAgZy5lYWNoKGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGcgPSBkMy5zZWxlY3QodGhpcyk7CisKKyAgICAgIC8vIFRpY2tzLCBvciBkb21haW4gdmFsdWVzIGZvciBvcmRpbmFsIHNjYWxlcy4KKyAgICAgIHZhciB0aWNrcyA9IHRpY2tWYWx1ZXMgPT0gbnVsbCA/IChzY2FsZS50aWNrcyA/IHNjYWxlLnRpY2tzLmFwcGx5KHNjYWxlLCB0aWNrQXJndW1lbnRzXykgOiBzY2FsZS5kb21haW4oKSkgOiB0aWNrVmFsdWVzLAorICAgICAgICAgIHRpY2tGb3JtYXQgPSB0aWNrRm9ybWF0XyA9PSBudWxsID8gKHNjYWxlLnRpY2tGb3JtYXQgPyBzY2FsZS50aWNrRm9ybWF0LmFwcGx5KHNjYWxlLCB0aWNrQXJndW1lbnRzXykgOiBTdHJpbmcpIDogdGlja0Zvcm1hdF87CisKKyAgICAgIC8vIE1pbm9yIHRpY2tzLgorICAgICAgdmFyIHN1YnRpY2tzID0gZDNfc3ZnX2F4aXNTdWJkaXZpZGUoc2NhbGUsIHRpY2tzLCB0aWNrU3ViZGl2aWRlKSwKKyAgICAgICAgICBzdWJ0aWNrID0gZy5zZWxlY3RBbGwoIi5taW5vciIpLmRhdGEoc3VidGlja3MsIFN0cmluZyksCisgICAgICAgICAgc3VidGlja0VudGVyID0gc3VidGljay5lbnRlcigpLmluc2VydCgibGluZSIsICJnIikuYXR0cigiY2xhc3MiLCAidGljayBtaW5vciIpLnN0eWxlKCJvcGFjaXR5IiwgMWUtNiksCisgICAgICAgICAgc3VidGlja0V4aXQgPSBkMy50cmFuc2l0aW9uKHN1YnRpY2suZXhpdCgpKS5zdHlsZSgib3BhY2l0eSIsIDFlLTYpLnJlbW92ZSgpLAorICAgICAgICAgIHN1YnRpY2tVcGRhdGUgPSBkMy50cmFuc2l0aW9uKHN1YnRpY2spLnN0eWxlKCJvcGFjaXR5IiwgMSk7CisKKyAgICAgIC8vIE1ham9yIHRpY2tzLgorICAgICAgdmFyIHRpY2sgPSBnLnNlbGVjdEFsbCgiZyIpLmRhdGEodGlja3MsIFN0cmluZyksCisgICAgICAgICAgdGlja0VudGVyID0gdGljay5lbnRlcigpLmluc2VydCgiZyIsICJwYXRoIikuc3R5bGUoIm9wYWNpdHkiLCAxZS02KSwKKyAgICAgICAgICB0aWNrRXhpdCA9IGQzLnRyYW5zaXRpb24odGljay5leGl0KCkpLnN0eWxlKCJvcGFjaXR5IiwgMWUtNikucmVtb3ZlKCksCisgICAgICAgICAgdGlja1VwZGF0ZSA9IGQzLnRyYW5zaXRpb24odGljaykuc3R5bGUoIm9wYWNpdHkiLCAxKSwKKyAgICAgICAgICB0aWNrVHJhbnNmb3JtOworCisgICAgICAvLyBEb21haW4uCisgICAgICB2YXIgcmFuZ2UgPSBkM19zY2FsZVJhbmdlKHNjYWxlKSwKKyAgICAgICAgICBwYXRoID0gZy5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFswXSksCisgICAgICAgICAgcGF0aEVudGVyID0gcGF0aC5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwgImRvbWFpbiIpLAorICAgICAgICAgIHBhdGhVcGRhdGUgPSBkMy50cmFuc2l0aW9uKHBhdGgpOworCisgICAgICAvLyBTdGFzaCBhIHNuYXBzaG90IG9mIHRoZSBuZXcgc2NhbGUsIGFuZCByZXRyaWV2ZSB0aGUgb2xkIHNuYXBzaG90LgorICAgICAgdmFyIHNjYWxlMSA9IHNjYWxlLmNvcHkoKSwKKyAgICAgICAgICBzY2FsZTAgPSB0aGlzLl9fY2hhcnRfXyB8fCBzY2FsZTE7CisgICAgICB0aGlzLl9fY2hhcnRfXyA9IHNjYWxlMTsKKworICAgICAgdGlja0VudGVyLmFwcGVuZCgibGluZSIpLmF0dHIoImNsYXNzIiwgInRpY2siKTsKKyAgICAgIHRpY2tFbnRlci5hcHBlbmQoInRleHQiKTsKKyAgICAgIHRpY2tVcGRhdGUuc2VsZWN0KCJ0ZXh0IikudGV4dCh0aWNrRm9ybWF0KTsKKworICAgICAgc3dpdGNoIChvcmllbnQpIHsKKyAgICAgICAgY2FzZSAiYm90dG9tIjogeworICAgICAgICAgIHRpY2tUcmFuc2Zvcm0gPSBkM19zdmdfYXhpc1g7CisgICAgICAgICAgc3VidGlja0VudGVyLmF0dHIoInkyIiwgdGlja01pbm9yU2l6ZSk7CisgICAgICAgICAgc3VidGlja1VwZGF0ZS5hdHRyKCJ4MiIsIDApLmF0dHIoInkyIiwgdGlja01pbm9yU2l6ZSk7CisgICAgICAgICAgdGlja0VudGVyLnNlbGVjdCgibGluZSIpLmF0dHIoInkyIiwgdGlja01ham9yU2l6ZSk7CisgICAgICAgICAgdGlja0VudGVyLnNlbGVjdCgidGV4dCIpLmF0dHIoInkiLCBNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKTsKKyAgICAgICAgICB0aWNrVXBkYXRlLnNlbGVjdCgibGluZSIpLmF0dHIoIngyIiwgMCkuYXR0cigieTIiLCB0aWNrTWFqb3JTaXplKTsKKyAgICAgICAgICB0aWNrVXBkYXRlLnNlbGVjdCgidGV4dCIpLmF0dHIoIngiLCAwKS5hdHRyKCJ5IiwgTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZykuYXR0cigiZHkiLCAiLjcxZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsICJtaWRkbGUiKTsKKyAgICAgICAgICBwYXRoVXBkYXRlLmF0dHIoImQiLCAiTSIgKyByYW5nZVswXSArICIsIiArIHRpY2tFbmRTaXplICsgIlYwSCIgKyByYW5nZVsxXSArICJWIiArIHRpY2tFbmRTaXplKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlICJ0b3AiOiB7CisgICAgICAgICAgdGlja1RyYW5zZm9ybSA9IGQzX3N2Z19heGlzWDsKKyAgICAgICAgICBzdWJ0aWNrRW50ZXIuYXR0cigieTIiLCAtdGlja01pbm9yU2l6ZSk7CisgICAgICAgICAgc3VidGlja1VwZGF0ZS5hdHRyKCJ4MiIsIDApLmF0dHIoInkyIiwgLXRpY2tNaW5vclNpemUpOworICAgICAgICAgIHRpY2tFbnRlci5zZWxlY3QoImxpbmUiKS5hdHRyKCJ5MiIsIC10aWNrTWFqb3JTaXplKTsKKyAgICAgICAgICB0aWNrRW50ZXIuc2VsZWN0KCJ0ZXh0IikuYXR0cigieSIsIC0oTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZykpOworICAgICAgICAgIHRpY2tVcGRhdGUuc2VsZWN0KCJsaW5lIikuYXR0cigieDIiLCAwKS5hdHRyKCJ5MiIsIC10aWNrTWFqb3JTaXplKTsKKyAgICAgICAgICB0aWNrVXBkYXRlLnNlbGVjdCgidGV4dCIpLmF0dHIoIngiLCAwKS5hdHRyKCJ5IiwgLShNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKSkuYXR0cigiZHkiLCAiMGVtIikuYXR0cigidGV4dC1hbmNob3IiLCAibWlkZGxlIik7CisgICAgICAgICAgcGF0aFVwZGF0ZS5hdHRyKCJkIiwgIk0iICsgcmFuZ2VbMF0gKyAiLCIgKyAtdGlja0VuZFNpemUgKyAiVjBIIiArIHJhbmdlWzFdICsgIlYiICsgLXRpY2tFbmRTaXplKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlICJsZWZ0IjogeworICAgICAgICAgIHRpY2tUcmFuc2Zvcm0gPSBkM19zdmdfYXhpc1k7CisgICAgICAgICAgc3VidGlja0VudGVyLmF0dHIoIngyIiwgLXRpY2tNaW5vclNpemUpOworICAgICAgICAgIHN1YnRpY2tVcGRhdGUuYXR0cigieDIiLCAtdGlja01pbm9yU2l6ZSkuYXR0cigieTIiLCAwKTsKKyAgICAgICAgICB0aWNrRW50ZXIuc2VsZWN0KCJsaW5lIikuYXR0cigieDIiLCAtdGlja01ham9yU2l6ZSk7CisgICAgICAgICAgdGlja0VudGVyLnNlbGVjdCgidGV4dCIpLmF0dHIoIngiLCAtKE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpKTsKKyAgICAgICAgICB0aWNrVXBkYXRlLnNlbGVjdCgibGluZSIpLmF0dHIoIngyIiwgLXRpY2tNYWpvclNpemUpLmF0dHIoInkyIiwgMCk7CisgICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoInRleHQiKS5hdHRyKCJ4IiwgLShNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKSkuYXR0cigieSIsIDApLmF0dHIoImR5IiwgIi4zMmVtIikuYXR0cigidGV4dC1hbmNob3IiLCAiZW5kIik7CisgICAgICAgICAgcGF0aFVwZGF0ZS5hdHRyKCJkIiwgIk0iICsgLXRpY2tFbmRTaXplICsgIiwiICsgcmFuZ2VbMF0gKyAiSDBWIiArIHJhbmdlWzFdICsgIkgiICsgLXRpY2tFbmRTaXplKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlICJyaWdodCI6IHsKKyAgICAgICAgICB0aWNrVHJhbnNmb3JtID0gZDNfc3ZnX2F4aXNZOworICAgICAgICAgIHN1YnRpY2tFbnRlci5hdHRyKCJ4MiIsIHRpY2tNaW5vclNpemUpOworICAgICAgICAgIHN1YnRpY2tVcGRhdGUuYXR0cigieDIiLCB0aWNrTWlub3JTaXplKS5hdHRyKCJ5MiIsIDApOworICAgICAgICAgIHRpY2tFbnRlci5zZWxlY3QoImxpbmUiKS5hdHRyKCJ4MiIsIHRpY2tNYWpvclNpemUpOworICAgICAgICAgIHRpY2tFbnRlci5zZWxlY3QoInRleHQiKS5hdHRyKCJ4IiwgTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZyk7CisgICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoImxpbmUiKS5hdHRyKCJ4MiIsIHRpY2tNYWpvclNpemUpLmF0dHIoInkyIiwgMCk7CisgICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoInRleHQiKS5hdHRyKCJ4IiwgTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZykuYXR0cigieSIsIDApLmF0dHIoImR5IiwgIi4zMmVtIikuYXR0cigidGV4dC1hbmNob3IiLCAic3RhcnQiKTsKKyAgICAgICAgICBwYXRoVXBkYXRlLmF0dHIoImQiLCAiTSIgKyB0aWNrRW5kU2l6ZSArICIsIiArIHJhbmdlWzBdICsgIkgwViIgKyByYW5nZVsxXSArICJIIiArIHRpY2tFbmRTaXplKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBGb3IgcXVhbnRpdGF0aXZlIHNjYWxlczoKKyAgICAgIC8vIC0gZW50ZXIgbmV3IHRpY2tzIGZyb20gdGhlIG9sZCBzY2FsZQorICAgICAgLy8gLSBleGl0IG9sZCB0aWNrcyB0byB0aGUgbmV3IHNjYWxlCisgICAgICBpZiAoc2NhbGUudGlja3MpIHsKKyAgICAgICAgdGlja0VudGVyLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUwKTsKKyAgICAgICAgdGlja1VwZGF0ZS5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSk7CisgICAgICAgIHRpY2tFeGl0LmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxKTsKKyAgICAgICAgc3VidGlja0VudGVyLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUwKTsKKyAgICAgICAgc3VidGlja1VwZGF0ZS5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSk7CisgICAgICAgIHN1YnRpY2tFeGl0LmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxKTsKKyAgICAgIH0KKworICAgICAgLy8gRm9yIG9yZGluYWwgc2NhbGVzOgorICAgICAgLy8gLSBhbnkgZW50ZXJpbmcgdGlja3MgYXJlIHVuZGVmaW5lZCBpbiB0aGUgb2xkIHNjYWxlCisgICAgICAvLyAtIGFueSBleGl0aW5nIHRpY2tzIGFyZSB1bmRlZmluZWQgaW4gdGhlIG5ldyBzY2FsZQorICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBvbmx5IG5lZWQgdG8gdHJhbnNpdGlvbiB1cGRhdGluZyB0aWNrcy4KKyAgICAgIGVsc2UgeworICAgICAgICB2YXIgZHggPSBzY2FsZTEucmFuZ2VCYW5kKCkgLyAyLCB4ID0gZnVuY3Rpb24oZCkgeyByZXR1cm4gc2NhbGUxKGQpICsgZHg7IH07CisgICAgICAgIHRpY2tFbnRlci5jYWxsKHRpY2tUcmFuc2Zvcm0sIHgpOworICAgICAgICB0aWNrVXBkYXRlLmNhbGwodGlja1RyYW5zZm9ybSwgeCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBheGlzLnNjYWxlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlOworICAgIHNjYWxlID0geDsKKyAgICByZXR1cm4gYXhpczsKKyAgfTsKKworICBheGlzLm9yaWVudCA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmllbnQ7CisgICAgb3JpZW50ID0geDsKKyAgICByZXR1cm4gYXhpczsKKyAgfTsKKworICBheGlzLnRpY2tzID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja0FyZ3VtZW50c187CisgICAgdGlja0FyZ3VtZW50c18gPSBhcmd1bWVudHM7CisgICAgcmV0dXJuIGF4aXM7CisgIH07CisKKyAgYXhpcy50aWNrVmFsdWVzID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tWYWx1ZXM7CisgICAgdGlja1ZhbHVlcyA9IHg7CisgICAgcmV0dXJuIGF4aXM7CisgIH07CisKKyAgYXhpcy50aWNrRm9ybWF0ID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tGb3JtYXRfOworICAgIHRpY2tGb3JtYXRfID0geDsKKyAgICByZXR1cm4gYXhpczsKKyAgfTsKKworICBheGlzLnRpY2tTaXplID0gZnVuY3Rpb24oeCwgeSwgeikgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tNYWpvclNpemU7CisgICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsKKyAgICB0aWNrTWFqb3JTaXplID0gK3g7CisgICAgdGlja01pbm9yU2l6ZSA9IG4gPiAxID8gK3kgOiB0aWNrTWFqb3JTaXplOworICAgIHRpY2tFbmRTaXplID0gbiA+IDAgPyArYXJndW1lbnRzW25dIDogdGlja01ham9yU2l6ZTsKKyAgICByZXR1cm4gYXhpczsKKyAgfTsKKworICBheGlzLnRpY2tQYWRkaW5nID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tQYWRkaW5nOworICAgIHRpY2tQYWRkaW5nID0gK3g7CisgICAgcmV0dXJuIGF4aXM7CisgIH07CisKKyAgYXhpcy50aWNrU3ViZGl2aWRlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tTdWJkaXZpZGU7CisgICAgdGlja1N1YmRpdmlkZSA9ICt4OworICAgIHJldHVybiBheGlzOworICB9OworCisgIHJldHVybiBheGlzOworfTsKKworZnVuY3Rpb24gZDNfc3ZnX2F4aXNYKHNlbGVjdGlvbiwgeCkgeworICBzZWxlY3Rpb24uYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gInRyYW5zbGF0ZSgiICsgeChkKSArICIsMCkiOyB9KTsKK30KKworZnVuY3Rpb24gZDNfc3ZnX2F4aXNZKHNlbGVjdGlvbiwgeSkgeworICBzZWxlY3Rpb24uYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gInRyYW5zbGF0ZSgwLCIgKyB5KGQpICsgIikiOyB9KTsKK30KKworZnVuY3Rpb24gZDNfc3ZnX2F4aXNTdWJkaXZpZGUoc2NhbGUsIHRpY2tzLCBtKSB7CisgIHN1YnRpY2tzID0gW107CisgIGlmIChtICYmIHRpY2tzLmxlbmd0aCA+IDEpIHsKKyAgICB2YXIgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQoc2NhbGUuZG9tYWluKCkpLAorICAgICAgICBzdWJ0aWNrcywKKyAgICAgICAgaSA9IC0xLAorICAgICAgICBuID0gdGlja3MubGVuZ3RoLAorICAgICAgICBkID0gKHRpY2tzWzFdIC0gdGlja3NbMF0pIC8gKyttLAorICAgICAgICBqLAorICAgICAgICB2OworICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICBmb3IgKGogPSBtOyAtLWogPiAwOykgeworICAgICAgICBpZiAoKHYgPSArdGlja3NbaV0gLSBqICogZCkgPj0gZXh0ZW50WzBdKSB7CisgICAgICAgICAgc3VidGlja3MucHVzaCh2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmb3IgKC0taSwgaiA9IDA7ICsraiA8IG0gJiYgKHYgPSArdGlja3NbaV0gKyBqICogZCkgPCBleHRlbnRbMV07KSB7CisgICAgICBzdWJ0aWNrcy5wdXNoKHYpOworICAgIH0KKyAgfQorICByZXR1cm4gc3VidGlja3M7Cit9CitkMy5zdmcuYnJ1c2ggPSBmdW5jdGlvbigpIHsKKyAgdmFyIGV2ZW50ID0gZDNfZXZlbnREaXNwYXRjaChicnVzaCwgImJydXNoc3RhcnQiLCAiYnJ1c2giLCAiYnJ1c2hlbmQiKSwKKyAgICAgIHggPSBudWxsLCAvLyB4LXNjYWxlLCBvcHRpb25hbAorICAgICAgeSA9IG51bGwsIC8vIHktc2NhbGUsIG9wdGlvbmFsCisgICAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1swXSwKKyAgICAgIGV4dGVudCA9IFtbMCwgMF0sIFswLCAwXV0sIC8vIFt4MCwgeTBdLCBbeDEsIHkxXSwgaW4gcGl4ZWxzIChpbnRlZ2VycykKKyAgICAgIGV4dGVudERvbWFpbjsgLy8gdGhlIGV4dGVudCBpbiBkYXRhIHNwYWNlLCBsYXppbHkgY3JlYXRlZAorCisgIGZ1bmN0aW9uIGJydXNoKGcpIHsKKyAgICBnLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICB2YXIgZyA9IGQzLnNlbGVjdCh0aGlzKSwKKyAgICAgICAgICBiZyA9IGcuc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpLmRhdGEoWzBdKSwKKyAgICAgICAgICBmZyA9IGcuc2VsZWN0QWxsKCIuZXh0ZW50IikuZGF0YShbMF0pLAorICAgICAgICAgIHR6ID0gZy5zZWxlY3RBbGwoIi5yZXNpemUiKS5kYXRhKHJlc2l6ZXMsIFN0cmluZyksCisgICAgICAgICAgZTsKKworICAgICAgLy8gUHJlcGFyZSB0aGUgYnJ1c2ggY29udGFpbmVyIGZvciBldmVudHMuCisgICAgICBnCisgICAgICAgICAgLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKQorICAgICAgICAgIC5vbigibW91c2Vkb3duLmJydXNoIiwgYnJ1c2hzdGFydCkKKyAgICAgICAgICAub24oInRvdWNoc3RhcnQuYnJ1c2giLCBicnVzaHN0YXJ0KTsKKworICAgICAgLy8gQW4gaW52aXNpYmxlLCBtb3VzZWFibGUgYXJlYSBmb3Igc3RhcnRpbmcgYSBuZXcgYnJ1c2guCisgICAgICBiZy5lbnRlcigpLmFwcGVuZCgicmVjdCIpCisgICAgICAgICAgLmF0dHIoImNsYXNzIiwgImJhY2tncm91bmQiKQorICAgICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKQorICAgICAgICAgIC5zdHlsZSgiY3Vyc29yIiwgImNyb3NzaGFpciIpOworCisgICAgICAvLyBUaGUgdmlzaWJsZSBicnVzaCBleHRlbnQ7IHN0eWxlIHRoaXMgYXMgeW91IGxpa2UhCisgICAgICBmZy5lbnRlcigpLmFwcGVuZCgicmVjdCIpCisgICAgICAgICAgLmF0dHIoImNsYXNzIiwgImV4dGVudCIpCisgICAgICAgICAgLnN0eWxlKCJjdXJzb3IiLCAibW92ZSIpOworCisgICAgICAvLyBNb3JlIGludmlzaWJsZSByZWN0cyBmb3IgcmVzaXppbmcgdGhlIGV4dGVudC4KKyAgICAgIHR6LmVudGVyKCkuYXBwZW5kKCJnIikKKyAgICAgICAgICAuYXR0cigiY2xhc3MiLCBmdW5jdGlvbihkKSB7IHJldHVybiAicmVzaXplICIgKyBkOyB9KQorICAgICAgICAgIC5zdHlsZSgiY3Vyc29yIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfc3ZnX2JydXNoQ3Vyc29yW2RdOyB9KQorICAgICAgICAuYXBwZW5kKCJyZWN0IikKKyAgICAgICAgICAuYXR0cigieCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIC9bZXddJC8udGVzdChkKSA/IC0zIDogbnVsbDsgfSkKKyAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIC9eW25zXS8udGVzdChkKSA/IC0zIDogbnVsbDsgfSkKKyAgICAgICAgICAuYXR0cigid2lkdGgiLCA2KQorICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCA2KQorICAgICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKKworICAgICAgLy8gU2hvdyBvciBoaWRlIHRoZSByZXNpemVycy4KKyAgICAgIHR6LnN0eWxlKCJkaXNwbGF5IiwgYnJ1c2guZW1wdHkoKSA/ICJub25lIiA6IG51bGwpOworCisgICAgICAvLyBSZW1vdmUgYW55IHN1cGVyZmx1b3VzIHJlc2l6ZXJzLgorICAgICAgdHouZXhpdCgpLnJlbW92ZSgpOworCisgICAgICAvLyBJbml0aWFsaXplIHRoZSBiYWNrZ3JvdW5kIHRvIGZpbGwgdGhlIGRlZmluZWQgcmFuZ2UuCisgICAgICAvLyBJZiB0aGUgcmFuZ2UgaXNuJ3QgZGVmaW5lZCwgeW91IGNhbiBwb3N0LXByb2Nlc3MuCisgICAgICBpZiAoeCkgeworICAgICAgICBlID0gZDNfc2NhbGVSYW5nZSh4KTsKKyAgICAgICAgYmcuYXR0cigieCIsIGVbMF0pLmF0dHIoIndpZHRoIiwgZVsxXSAtIGVbMF0pOworICAgICAgICByZWRyYXdYKGcpOworICAgICAgfQorICAgICAgaWYgKHkpIHsKKyAgICAgICAgZSA9IGQzX3NjYWxlUmFuZ2UoeSk7CisgICAgICAgIGJnLmF0dHIoInkiLCBlWzBdKS5hdHRyKCJoZWlnaHQiLCBlWzFdIC0gZVswXSk7CisgICAgICAgIHJlZHJhd1koZyk7CisgICAgICB9CisgICAgICByZWRyYXcoZyk7CisgICAgfSk7CisgIH0KKworICBmdW5jdGlvbiByZWRyYXcoZykgeworICAgIGcuc2VsZWN0QWxsKCIucmVzaXplIikuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeworICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIGV4dGVudFsrL2UkLy50ZXN0KGQpXVswXSArICIsIiArIGV4dGVudFsrL15zLy50ZXN0KGQpXVsxXSArICIpIjsKKyAgICB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIHJlZHJhd1goZykgeworICAgIGcuc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieCIsIGV4dGVudFswXVswXSk7CisgICAgZy5zZWxlY3RBbGwoIi5leHRlbnQsLm4+cmVjdCwucz5yZWN0IikuYXR0cigid2lkdGgiLCBleHRlbnRbMV1bMF0gLSBleHRlbnRbMF1bMF0pOworICB9CisKKyAgZnVuY3Rpb24gcmVkcmF3WShnKSB7CisgICAgZy5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IiwgZXh0ZW50WzBdWzFdKTsKKyAgICBnLnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLCBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0pOworICB9CisKKyAgZnVuY3Rpb24gYnJ1c2hzdGFydCgpIHsKKyAgICB2YXIgdGFyZ2V0ID0gdGhpcywKKyAgICAgICAgZXZlbnRUYXJnZXQgPSBkMy5zZWxlY3QoZDMuZXZlbnQudGFyZ2V0KSwKKyAgICAgICAgZXZlbnRfID0gZXZlbnQub2YodGFyZ2V0LCBhcmd1bWVudHMpLAorICAgICAgICBnID0gZDMuc2VsZWN0KHRhcmdldCksCisgICAgICAgIHJlc2l6aW5nID0gZXZlbnRUYXJnZXQuZGF0dW0oKSwKKyAgICAgICAgcmVzaXppbmdYID0gIS9eKG58cykkLy50ZXN0KHJlc2l6aW5nKSAmJiB4LAorICAgICAgICByZXNpemluZ1kgPSAhL14oZXx3KSQvLnRlc3QocmVzaXppbmcpICYmIHksCisgICAgICAgIGRyYWdnaW5nID0gZXZlbnRUYXJnZXQuY2xhc3NlZCgiZXh0ZW50IiksCisgICAgICAgIGNlbnRlciwKKyAgICAgICAgb3JpZ2luID0gbW91c2UoKSwKKyAgICAgICAgb2Zmc2V0OworCisgICAgdmFyIHcgPSBkMy5zZWxlY3Qod2luZG93KQorICAgICAgICAub24oIm1vdXNlbW92ZS5icnVzaCIsIGJydXNobW92ZSkKKyAgICAgICAgLm9uKCJtb3VzZXVwLmJydXNoIiwgYnJ1c2hlbmQpCisgICAgICAgIC5vbigidG91Y2htb3ZlLmJydXNoIiwgYnJ1c2htb3ZlKQorICAgICAgICAub24oInRvdWNoZW5kLmJydXNoIiwgYnJ1c2hlbmQpCisgICAgICAgIC5vbigia2V5ZG93bi5icnVzaCIsIGtleWRvd24pCisgICAgICAgIC5vbigia2V5dXAuYnJ1c2giLCBrZXl1cCk7CisKKyAgICAvLyBJZiB0aGUgZXh0ZW50IHdhcyBjbGlja2VkIG9uLCBkcmFnIHJhdGhlciB0aGFuIGJydXNoOworICAgIC8vIHN0b3JlIHRoZSBwb2ludCBiZXR3ZWVuIHRoZSBtb3VzZSBhbmQgZXh0ZW50IG9yaWdpbiBpbnN0ZWFkLgorICAgIGlmIChkcmFnZ2luZykgeworICAgICAgb3JpZ2luWzBdID0gZXh0ZW50WzBdWzBdIC0gb3JpZ2luWzBdOworICAgICAgb3JpZ2luWzFdID0gZXh0ZW50WzBdWzFdIC0gb3JpZ2luWzFdOworICAgIH0KKworICAgIC8vIElmIGEgcmVzaXplciB3YXMgY2xpY2tlZCBvbiwgcmVjb3JkIHdoaWNoIHNpZGUgaXMgdG8gYmUgcmVzaXplZC4KKyAgICAvLyBBbHNvLCBzZXQgdGhlIG9yaWdpbiB0byB0aGUgb3Bwb3NpdGUgc2lkZS4KKyAgICBlbHNlIGlmIChyZXNpemluZykgeworICAgICAgdmFyIGV4ID0gKy93JC8udGVzdChyZXNpemluZyksCisgICAgICAgICAgZXkgPSArL15uLy50ZXN0KHJlc2l6aW5nKTsKKyAgICAgIG9mZnNldCA9IFtleHRlbnRbMSAtIGV4XVswXSAtIG9yaWdpblswXSwgZXh0ZW50WzEgLSBleV1bMV0gLSBvcmlnaW5bMV1dOworICAgICAgb3JpZ2luWzBdID0gZXh0ZW50W2V4XVswXTsKKyAgICAgIG9yaWdpblsxXSA9IGV4dGVudFtleV1bMV07CisgICAgfQorCisgICAgLy8gSWYgdGhlIEFMVCBrZXkgaXMgZG93biB3aGVuIHN0YXJ0aW5nIGEgYnJ1c2gsIHRoZSBjZW50ZXIgaXMgYXQgdGhlIG1vdXNlLgorICAgIGVsc2UgaWYgKGQzLmV2ZW50LmFsdEtleSkgY2VudGVyID0gb3JpZ2luLnNsaWNlKCk7CisKKyAgICAvLyBQcm9wYWdhdGUgdGhlIGFjdGl2ZSBjdXJzb3IgdG8gdGhlIGJvZHkgZm9yIHRoZSBkcmFnIGR1cmF0aW9uLgorICAgIGcuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwgIm5vbmUiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsIG51bGwpOworICAgIGQzLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLCBldmVudFRhcmdldC5zdHlsZSgiY3Vyc29yIikpOworCisgICAgLy8gTm90aWZ5IGxpc3RlbmVycy4KKyAgICBldmVudF8oe3R5cGU6ICJicnVzaHN0YXJ0In0pOworICAgIGJydXNobW92ZSgpOworICAgIGQzX2V2ZW50Q2FuY2VsKCk7CisKKyAgICBmdW5jdGlvbiBtb3VzZSgpIHsKKyAgICAgIHZhciB0b3VjaGVzID0gZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXM7CisgICAgICByZXR1cm4gdG91Y2hlcyA/IGQzLnRvdWNoZXModGFyZ2V0LCB0b3VjaGVzKVswXSA6IGQzLm1vdXNlKHRhcmdldCk7CisgICAgfQorCisgICAgZnVuY3Rpb24ga2V5ZG93bigpIHsKKyAgICAgIGlmIChkMy5ldmVudC5rZXlDb2RlID09IDMyKSB7CisgICAgICAgIGlmICghZHJhZ2dpbmcpIHsKKyAgICAgICAgICBjZW50ZXIgPSBudWxsOworICAgICAgICAgIG9yaWdpblswXSAtPSBleHRlbnRbMV1bMF07CisgICAgICAgICAgb3JpZ2luWzFdIC09IGV4dGVudFsxXVsxXTsKKyAgICAgICAgICBkcmFnZ2luZyA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZDNfZXZlbnRDYW5jZWwoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBrZXl1cCgpIHsKKyAgICAgIGlmIChkMy5ldmVudC5rZXlDb2RlID09IDMyICYmIGRyYWdnaW5nID09IDIpIHsKKyAgICAgICAgb3JpZ2luWzBdICs9IGV4dGVudFsxXVswXTsKKyAgICAgICAgb3JpZ2luWzFdICs9IGV4dGVudFsxXVsxXTsKKyAgICAgICAgZHJhZ2dpbmcgPSAwOworICAgICAgICBkM19ldmVudENhbmNlbCgpOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIGJydXNobW92ZSgpIHsKKyAgICAgIHZhciBwb2ludCA9IG1vdXNlKCksCisgICAgICAgICAgbW92ZWQgPSBmYWxzZTsKKworICAgICAgLy8gUHJlc2VydmUgdGhlIG9mZnNldCBmb3IgdGhpY2sgcmVzaXplcnMuCisgICAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgIHBvaW50WzBdICs9IG9mZnNldFswXTsKKyAgICAgICAgcG9pbnRbMV0gKz0gb2Zmc2V0WzFdOworICAgICAgfQorCisgICAgICBpZiAoIWRyYWdnaW5nKSB7CisKKyAgICAgICAgLy8gSWYgbmVlZGVkLCBkZXRlcm1pbmUgdGhlIGNlbnRlciBmcm9tIHRoZSBjdXJyZW50IGV4dGVudC4KKyAgICAgICAgaWYgKGQzLmV2ZW50LmFsdEtleSkgeworICAgICAgICAgIGlmICghY2VudGVyKSBjZW50ZXIgPSBbKGV4dGVudFswXVswXSArIGV4dGVudFsxXVswXSkgLyAyLCAoZXh0ZW50WzBdWzFdICsgZXh0ZW50WzFdWzFdKSAvIDJdOworCisgICAgICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW4sIGZvciB3aGVuIHRoZSBBTFQga2V5IGlzIHJlbGVhc2VkLgorICAgICAgICAgIG9yaWdpblswXSA9IGV4dGVudFsrKHBvaW50WzBdIDwgY2VudGVyWzBdKV1bMF07CisgICAgICAgICAgb3JpZ2luWzFdID0gZXh0ZW50WysocG9pbnRbMV0gPCBjZW50ZXJbMV0pXVsxXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdoZW4gdGhlIEFMVCBrZXkgaXMgcmVsZWFzZWQsIHdlIGNsZWFyIHRoZSBjZW50ZXIuCisgICAgICAgIGVsc2UgY2VudGVyID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgLy8gVXBkYXRlIHRoZSBicnVzaCBleHRlbnQgZm9yIGVhY2ggZGltZW5zaW9uLgorICAgICAgaWYgKHJlc2l6aW5nWCAmJiBtb3ZlMShwb2ludCwgeCwgMCkpIHsKKyAgICAgICAgcmVkcmF3WChnKTsKKyAgICAgICAgbW92ZWQgPSB0cnVlOworICAgICAgfQorICAgICAgaWYgKHJlc2l6aW5nWSAmJiBtb3ZlMShwb2ludCwgeSwgMSkpIHsKKyAgICAgICAgcmVkcmF3WShnKTsKKyAgICAgICAgbW92ZWQgPSB0cnVlOworICAgICAgfQorCisgICAgICAvLyBGaW5hbCByZWRyYXcgYW5kIG5vdGlmeSBsaXN0ZW5lcnMuCisgICAgICBpZiAobW92ZWQpIHsKKyAgICAgICAgcmVkcmF3KGcpOworICAgICAgICBldmVudF8oe3R5cGU6ICJicnVzaCIsIG1vZGU6IGRyYWdnaW5nID8gIm1vdmUiIDogInJlc2l6ZSJ9KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBtb3ZlMShwb2ludCwgc2NhbGUsIGkpIHsKKyAgICAgIHZhciByYW5nZSA9IGQzX3NjYWxlUmFuZ2Uoc2NhbGUpLAorICAgICAgICAgIHIwID0gcmFuZ2VbMF0sCisgICAgICAgICAgcjEgPSByYW5nZVsxXSwKKyAgICAgICAgICBwb3NpdGlvbiA9IG9yaWdpbltpXSwKKyAgICAgICAgICBzaXplID0gZXh0ZW50WzFdW2ldIC0gZXh0ZW50WzBdW2ldLAorICAgICAgICAgIG1pbiwKKyAgICAgICAgICBtYXg7CisKKyAgICAgIC8vIFdoZW4gZHJhZ2dpbmcsIHJlZHVjZSB0aGUgcmFuZ2UgYnkgdGhlIGV4dGVudCBzaXplIGFuZCBwb3NpdGlvbi4KKyAgICAgIGlmIChkcmFnZ2luZykgeworICAgICAgICByMCAtPSBwb3NpdGlvbjsKKyAgICAgICAgcjEgLT0gc2l6ZSArIHBvc2l0aW9uOworICAgICAgfQorCisgICAgICAvLyBDbGFtcCB0aGUgcG9pbnQgc28gdGhhdCB0aGUgZXh0ZW50IGZpdHMgd2l0aGluIHRoZSByYW5nZSBleHRlbnQuCisgICAgICBtaW4gPSBNYXRoLm1heChyMCwgTWF0aC5taW4ocjEsIHBvaW50W2ldKSk7CisKKyAgICAgIC8vIENvbXB1dGUgdGhlIG5ldyBleHRlbnQgYm91bmRzLgorICAgICAgaWYgKGRyYWdnaW5nKSB7CisgICAgICAgIG1heCA9IChtaW4gKz0gcG9zaXRpb24pICsgc2l6ZTsKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgLy8gSWYgdGhlIEFMVCBrZXkgaXMgcHJlc3NlZCwgdGhlbiBwcmVzZXJ2ZSB0aGUgY2VudGVyIG9mIHRoZSBleHRlbnQuCisgICAgICAgIGlmIChjZW50ZXIpIHBvc2l0aW9uID0gTWF0aC5tYXgocjAsIE1hdGgubWluKHIxLCAyICogY2VudGVyW2ldIC0gbWluKSk7CisKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbWluIGFuZCBtYXggb2YgdGhlIHBvc2l0aW9uIGFuZCBwb2ludC4KKyAgICAgICAgaWYgKHBvc2l0aW9uIDwgbWluKSB7CisgICAgICAgICAgbWF4ID0gbWluOworICAgICAgICAgIG1pbiA9IHBvc2l0aW9uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1heCA9IHBvc2l0aW9uOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFVwZGF0ZSB0aGUgc3RvcmVkIGJvdW5kcy4KKyAgICAgIGlmIChleHRlbnRbMF1baV0gIT09IG1pbiB8fCBleHRlbnRbMV1baV0gIT09IG1heCkgeworICAgICAgICBleHRlbnREb21haW4gPSBudWxsOworICAgICAgICBleHRlbnRbMF1baV0gPSBtaW47CisgICAgICAgIGV4dGVudFsxXVtpXSA9IG1heDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gYnJ1c2hlbmQoKSB7CisgICAgICBicnVzaG1vdmUoKTsKKworICAgICAgLy8gcmVzZXQgdGhlIGN1cnNvciBzdHlsZXMKKyAgICAgIGcuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwgImFsbCIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IiwgYnJ1c2guZW1wdHkoKSA/ICJub25lIiA6IG51bGwpOworICAgICAgZDMuc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsIG51bGwpOworCisgICAgICB3IC5vbigibW91c2Vtb3ZlLmJydXNoIiwgbnVsbCkKKyAgICAgICAgLm9uKCJtb3VzZXVwLmJydXNoIiwgbnVsbCkKKyAgICAgICAgLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLCBudWxsKQorICAgICAgICAub24oInRvdWNoZW5kLmJydXNoIiwgbnVsbCkKKyAgICAgICAgLm9uKCJrZXlkb3duLmJydXNoIiwgbnVsbCkKKyAgICAgICAgLm9uKCJrZXl1cC5icnVzaCIsIG51bGwpOworCisgICAgICBldmVudF8oe3R5cGU6ICJicnVzaGVuZCJ9KTsKKyAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7CisgICAgfQorICB9CisKKyAgYnJ1c2gueCA9IGZ1bmN0aW9uKHopIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4OworICAgIHggPSB6OworICAgIHJlc2l6ZXMgPSBkM19zdmdfYnJ1c2hSZXNpemVzWyF4IDw8IDEgfCAheV07IC8vIGZvcmUhCisgICAgcmV0dXJuIGJydXNoOworICB9OworCisgIGJydXNoLnkgPSBmdW5jdGlvbih6KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTsKKyAgICB5ID0gejsKKyAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1sheCA8PCAxIHwgIXldOyAvLyBmb3JlIQorICAgIHJldHVybiBicnVzaDsKKyAgfTsKKworICBicnVzaC5leHRlbnQgPSBmdW5jdGlvbih6KSB7CisgICAgdmFyIHgwLCB4MSwgeTAsIHkxLCB0OworCisgICAgLy8gSW52ZXJ0IHRoZSBwaXhlbCBleHRlbnQgdG8gZGF0YS1zcGFjZS4KKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKKyAgICAgIHogPSBleHRlbnREb21haW4gfHwgZXh0ZW50OworICAgICAgaWYgKHgpIHsKKyAgICAgICAgeDAgPSB6WzBdWzBdLCB4MSA9IHpbMV1bMF07CisgICAgICAgIGlmICghZXh0ZW50RG9tYWluKSB7CisgICAgICAgICAgeDAgPSBleHRlbnRbMF1bMF0sIHgxID0gZXh0ZW50WzFdWzBdOworICAgICAgICAgIGlmICh4LmludmVydCkgeDAgPSB4LmludmVydCh4MCksIHgxID0geC5pbnZlcnQoeDEpOworICAgICAgICAgIGlmICh4MSA8IHgwKSB0ID0geDAsIHgwID0geDEsIHgxID0gdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHkpIHsKKyAgICAgICAgeTAgPSB6WzBdWzFdLCB5MSA9IHpbMV1bMV07CisgICAgICAgIGlmICghZXh0ZW50RG9tYWluKSB7CisgICAgICAgICAgeTAgPSBleHRlbnRbMF1bMV0sIHkxID0gZXh0ZW50WzFdWzFdOworICAgICAgICAgIGlmICh5LmludmVydCkgeTAgPSB5LmludmVydCh5MCksIHkxID0geS5pbnZlcnQoeTEpOworICAgICAgICAgIGlmICh5MSA8IHkwKSB0ID0geTAsIHkwID0geTEsIHkxID0gdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHggJiYgeSA/IFtbeDAsIHkwXSwgW3gxLCB5MV1dIDogeCA/IFt4MCwgeDFdIDogeSAmJiBbeTAsIHkxXTsKKyAgICB9CisKKyAgICAvLyBTY2FsZSB0aGUgZGF0YS1zcGFjZSBleHRlbnQgdG8gcGl4ZWxzLgorICAgIGV4dGVudERvbWFpbiA9IFtbMCwgMF0sIFswLCAwXV07CisgICAgaWYgKHgpIHsKKyAgICAgIHgwID0gelswXSwgeDEgPSB6WzFdOworICAgICAgaWYgKHkpIHgwID0geDBbMF0sIHgxID0geDFbMF07CisgICAgICBleHRlbnREb21haW5bMF1bMF0gPSB4MCwgZXh0ZW50RG9tYWluWzFdWzBdID0geDE7CisgICAgICBpZiAoeC5pbnZlcnQpIHgwID0geCh4MCksIHgxID0geCh4MSk7CisgICAgICBpZiAoeDEgPCB4MCkgdCA9IHgwLCB4MCA9IHgxLCB4MSA9IHQ7CisgICAgICBleHRlbnRbMF1bMF0gPSB4MCB8IDAsIGV4dGVudFsxXVswXSA9IHgxIHwgMDsKKyAgICB9CisgICAgaWYgKHkpIHsKKyAgICAgIHkwID0gelswXSwgeTEgPSB6WzFdOworICAgICAgaWYgKHgpIHkwID0geTBbMV0sIHkxID0geTFbMV07CisgICAgICBleHRlbnREb21haW5bMF1bMV0gPSB5MCwgZXh0ZW50RG9tYWluWzFdWzFdID0geTE7CisgICAgICBpZiAoeS5pbnZlcnQpIHkwID0geSh5MCksIHkxID0geSh5MSk7CisgICAgICBpZiAoeTEgPCB5MCkgdCA9IHkwLCB5MCA9IHkxLCB5MSA9IHQ7CisgICAgICBleHRlbnRbMF1bMV0gPSB5MCB8IDAsIGV4dGVudFsxXVsxXSA9IHkxIHwgMDsKKyAgICB9CisKKyAgICByZXR1cm4gYnJ1c2g7CisgIH07CisKKyAgYnJ1c2guY2xlYXIgPSBmdW5jdGlvbigpIHsKKyAgICBleHRlbnREb21haW4gPSBudWxsOworICAgIGV4dGVudFswXVswXSA9CisgICAgZXh0ZW50WzBdWzFdID0KKyAgICBleHRlbnRbMV1bMF0gPQorICAgIGV4dGVudFsxXVsxXSA9IDA7CisgICAgcmV0dXJuIGJydXNoOworICB9OworCisgIGJydXNoLmVtcHR5ID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuICh4ICYmIGV4dGVudFswXVswXSA9PT0gZXh0ZW50WzFdWzBdKQorICAgICAgICB8fCAoeSAmJiBleHRlbnRbMF1bMV0gPT09IGV4dGVudFsxXVsxXSk7CisgIH07CisKKyAgcmV0dXJuIGQzLnJlYmluZChicnVzaCwgZXZlbnQsICJvbiIpOworfTsKKwordmFyIGQzX3N2Z19icnVzaEN1cnNvciA9IHsKKyAgbjogIm5zLXJlc2l6ZSIsCisgIGU6ICJldy1yZXNpemUiLAorICBzOiAibnMtcmVzaXplIiwKKyAgdzogImV3LXJlc2l6ZSIsCisgIG53OiAibndzZS1yZXNpemUiLAorICBuZTogIm5lc3ctcmVzaXplIiwKKyAgc2U6ICJud3NlLXJlc2l6ZSIsCisgIHN3OiAibmVzdy1yZXNpemUiCit9OworCit2YXIgZDNfc3ZnX2JydXNoUmVzaXplcyA9IFsKKyAgWyJuIiwgImUiLCAicyIsICJ3IiwgIm53IiwgIm5lIiwgInNlIiwgInN3Il0sCisgIFsiZSIsICJ3Il0sCisgIFsibiIsICJzIl0sCisgIFtdCitdOworZDMuYmVoYXZpb3IgPSB7fTsKKy8vIFRPRE8gVHJhY2sgdG91Y2ggcG9pbnRzIGJ5IGlkZW50aWZpZXIuCisKK2QzLmJlaGF2aW9yLmRyYWcgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGV2ZW50ID0gZDNfZXZlbnREaXNwYXRjaChkcmFnLCAiZHJhZyIsICJkcmFnc3RhcnQiLCAiZHJhZ2VuZCIpLAorICAgICAgb3JpZ2luID0gbnVsbDsKKworICBmdW5jdGlvbiBkcmFnKCkgeworICAgIHRoaXMub24oIm1vdXNlZG93bi5kcmFnIiwgbW91c2Vkb3duKQorICAgICAgICAub24oInRvdWNoc3RhcnQuZHJhZyIsIG1vdXNlZG93bik7CisgIH0KKworICBmdW5jdGlvbiBtb3VzZWRvd24oKSB7CisgICAgdmFyIHRhcmdldCA9IHRoaXMsCisgICAgICAgIGV2ZW50XyA9IGV2ZW50Lm9mKHRhcmdldCwgYXJndW1lbnRzKSwKKyAgICAgICAgZXZlbnRUYXJnZXQgPSBkMy5ldmVudC50YXJnZXQsCisgICAgICAgIG9mZnNldCwKKyAgICAgICAgb3JpZ2luXyA9IHBvaW50KCksCisgICAgICAgIG1vdmVkID0gMDsKKworICAgIHZhciB3ID0gZDMuc2VsZWN0KHdpbmRvdykKKyAgICAgICAgLm9uKCJtb3VzZW1vdmUuZHJhZyIsIGRyYWdtb3ZlKQorICAgICAgICAub24oInRvdWNobW92ZS5kcmFnIiwgZHJhZ21vdmUpCisgICAgICAgIC5vbigibW91c2V1cC5kcmFnIiwgZHJhZ2VuZCwgdHJ1ZSkKKyAgICAgICAgLm9uKCJ0b3VjaGVuZC5kcmFnIiwgZHJhZ2VuZCwgdHJ1ZSk7CisKKyAgICBpZiAob3JpZ2luKSB7CisgICAgICBvZmZzZXQgPSBvcmlnaW4uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOworICAgICAgb2Zmc2V0ID0gW29mZnNldC54IC0gb3JpZ2luX1swXSwgb2Zmc2V0LnkgLSBvcmlnaW5fWzFdXTsKKyAgICB9IGVsc2UgeworICAgICAgb2Zmc2V0ID0gWzAsIDBdOworICAgIH0KKworICAgIGV2ZW50Xyh7dHlwZTogImRyYWdzdGFydCJ9KTsKKworICAgIGZ1bmN0aW9uIHBvaW50KCkgeworICAgICAgdmFyIHAgPSB0YXJnZXQucGFyZW50Tm9kZSwKKyAgICAgICAgICB0ID0gZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXM7CisgICAgICByZXR1cm4gdCA/IGQzLnRvdWNoZXMocCwgdClbMF0gOiBkMy5tb3VzZShwKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBkcmFnbW92ZSgpIHsKKyAgICAgIGlmICghdGFyZ2V0LnBhcmVudE5vZGUpIHJldHVybiBkcmFnZW5kKCk7IC8vIHRhcmdldCByZW1vdmVkIGZyb20gRE9NCisKKyAgICAgIHZhciBwID0gcG9pbnQoKSwKKyAgICAgICAgICBkeCA9IHBbMF0gLSBvcmlnaW5fWzBdLAorICAgICAgICAgIGR5ID0gcFsxXSAtIG9yaWdpbl9bMV07CisKKyAgICAgIG1vdmVkIHw9IGR4IHwgZHk7CisgICAgICBvcmlnaW5fID0gcDsKKyAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7CisKKyAgICAgIGV2ZW50Xyh7dHlwZTogImRyYWciLCB4OiBwWzBdICsgb2Zmc2V0WzBdLCB5OiBwWzFdICsgb2Zmc2V0WzFdLCBkeDogZHgsIGR5OiBkeX0pOworICAgIH0KKworICAgIGZ1bmN0aW9uIGRyYWdlbmQoKSB7CisgICAgICBldmVudF8oe3R5cGU6ICJkcmFnZW5kIn0pOworCisgICAgICAvLyBpZiBtb3ZlZCwgcHJldmVudCB0aGUgbW91c2V1cCAoYW5kIHBvc3NpYmx5IGNsaWNrKSBmcm9tIHByb3BhZ2F0aW5nCisgICAgICBpZiAobW92ZWQpIHsKKyAgICAgICAgZDNfZXZlbnRDYW5jZWwoKTsKKyAgICAgICAgaWYgKGQzLmV2ZW50LnRhcmdldCA9PT0gZXZlbnRUYXJnZXQpIHcub24oImNsaWNrLmRyYWciLCBjbGljaywgdHJ1ZSk7CisgICAgICB9CisKKyAgICAgIHcgLm9uKCJtb3VzZW1vdmUuZHJhZyIsIG51bGwpCisgICAgICAgIC5vbigidG91Y2htb3ZlLmRyYWciLCBudWxsKQorICAgICAgICAub24oIm1vdXNldXAuZHJhZyIsIG51bGwpCisgICAgICAgIC5vbigidG91Y2hlbmQuZHJhZyIsIG51bGwpOworICAgIH0KKworICAgIC8vIHByZXZlbnQgdGhlIHN1YnNlcXVlbnQgY2xpY2sgZnJvbSBwcm9wYWdhdGluZyAoZS5nLiwgZm9yIGFuY2hvcnMpCisgICAgZnVuY3Rpb24gY2xpY2soKSB7CisgICAgICBkM19ldmVudENhbmNlbCgpOworICAgICAgdy5vbigiY2xpY2suZHJhZyIsIG51bGwpOworICAgIH0KKyAgfQorCisgIGRyYWcub3JpZ2luID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yaWdpbjsKKyAgICBvcmlnaW4gPSB4OworICAgIHJldHVybiBkcmFnOworICB9OworCisgIHJldHVybiBkMy5yZWJpbmQoZHJhZywgZXZlbnQsICJvbiIpOworfTsKK2QzLmJlaGF2aW9yLnpvb20gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHRyYW5zbGF0ZSA9IFswLCAwXSwKKyAgICAgIHRyYW5zbGF0ZTAsIC8vIHRyYW5zbGF0ZSB3aGVuIHdlIHN0YXJ0ZWQgem9vbWluZyAodG8gYXZvaWQgZHJpZnQpCisgICAgICBzY2FsZSA9IDEsCisgICAgICBzY2FsZTAsIC8vIHNjYWxlIHdoZW4gd2Ugc3RhcnRlZCB0b3VjaGluZworICAgICAgc2NhbGVFeHRlbnQgPSBkM19iZWhhdmlvcl96b29tSW5maW5pdHksCisgICAgICBldmVudCA9IGQzX2V2ZW50RGlzcGF0Y2goem9vbSwgInpvb20iKSwKKyAgICAgIHgwLAorICAgICAgeDEsCisgICAgICB5MCwKKyAgICAgIHkxLAorICAgICAgdG91Y2h0aW1lOyAvLyB0aW1lIG9mIGxhc3QgdG91Y2hzdGFydCAodG8gZGV0ZWN0IGRvdWJsZS10YXApCisKKyAgZnVuY3Rpb24gem9vbSgpIHsKKyAgICB0aGlzCisgICAgICAgIC5vbigibW91c2Vkb3duLnpvb20iLCBtb3VzZWRvd24pCisgICAgICAgIC5vbigibW91c2V3aGVlbC56b29tIiwgbW91c2V3aGVlbCkKKyAgICAgICAgLm9uKCJtb3VzZW1vdmUuem9vbSIsIG1vdXNlbW92ZSkKKyAgICAgICAgLm9uKCJET01Nb3VzZVNjcm9sbC56b29tIiwgbW91c2V3aGVlbCkKKyAgICAgICAgLm9uKCJkYmxjbGljay56b29tIiwgZGJsY2xpY2spCisgICAgICAgIC5vbigidG91Y2hzdGFydC56b29tIiwgdG91Y2hzdGFydCkKKyAgICAgICAgLm9uKCJ0b3VjaG1vdmUuem9vbSIsIHRvdWNobW92ZSkKKyAgICAgICAgLm9uKCJ0b3VjaGVuZC56b29tIiwgdG91Y2hzdGFydCk7CisgIH0KKworICB6b29tLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0cmFuc2xhdGU7CisgICAgdHJhbnNsYXRlID0geC5tYXAoTnVtYmVyKTsKKyAgICByZXR1cm4gem9vbTsKKyAgfTsKKworICB6b29tLnNjYWxlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlOworICAgIHNjYWxlID0gK3g7CisgICAgcmV0dXJuIHpvb207CisgIH07CisKKyAgem9vbS5zY2FsZUV4dGVudCA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZUV4dGVudDsKKyAgICBzY2FsZUV4dGVudCA9IHggPT0gbnVsbCA/IGQzX2JlaGF2aW9yX3pvb21JbmZpbml0eSA6IHgubWFwKE51bWJlcik7CisgICAgcmV0dXJuIHpvb207CisgIH07CisKKyAgem9vbS54ID0gZnVuY3Rpb24oeikgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxOworICAgIHgxID0gejsKKyAgICB4MCA9IHouY29weSgpOworICAgIHJldHVybiB6b29tOworICB9OworCisgIHpvb20ueSA9IGZ1bmN0aW9uKHopIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5MTsKKyAgICB5MSA9IHo7CisgICAgeTAgPSB6LmNvcHkoKTsKKyAgICByZXR1cm4gem9vbTsKKyAgfTsKKworICBmdW5jdGlvbiBsb2NhdGlvbihwKSB7CisgICAgcmV0dXJuIFsocFswXSAtIHRyYW5zbGF0ZVswXSkgLyBzY2FsZSwgKHBbMV0gLSB0cmFuc2xhdGVbMV0pIC8gc2NhbGVdOworICB9CisKKyAgZnVuY3Rpb24gcG9pbnQobCkgeworICAgIHJldHVybiBbbFswXSAqIHNjYWxlICsgdHJhbnNsYXRlWzBdLCBsWzFdICogc2NhbGUgKyB0cmFuc2xhdGVbMV1dOworICB9CisKKyAgZnVuY3Rpb24gc2NhbGVUbyhzKSB7CisgICAgc2NhbGUgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIHMpKTsKKyAgfQorCisgIGZ1bmN0aW9uIHRyYW5zbGF0ZVRvKHAsIGwpIHsKKyAgICBsID0gcG9pbnQobCk7CisgICAgdHJhbnNsYXRlWzBdICs9IHBbMF0gLSBsWzBdOworICAgIHRyYW5zbGF0ZVsxXSArPSBwWzFdIC0gbFsxXTsKKyAgfQorCisgIGZ1bmN0aW9uIGRpc3BhdGNoKGV2ZW50KSB7CisgICAgaWYgKHgxKSB4MS5kb21haW4oeDAucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeCkgeyByZXR1cm4gKHggLSB0cmFuc2xhdGVbMF0pIC8gc2NhbGU7IH0pLm1hcCh4MC5pbnZlcnQpKTsKKyAgICBpZiAoeTEpIHkxLmRvbWFpbih5MC5yYW5nZSgpLm1hcChmdW5jdGlvbih5KSB7IHJldHVybiAoeSAtIHRyYW5zbGF0ZVsxXSkgLyBzY2FsZTsgfSkubWFwKHkwLmludmVydCkpOworICAgIGQzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgZXZlbnQoe3R5cGU6ICJ6b29tIiwgc2NhbGU6IHNjYWxlLCB0cmFuc2xhdGU6IHRyYW5zbGF0ZX0pOworICB9CisKKyAgZnVuY3Rpb24gbW91c2Vkb3duKCkgeworICAgIHZhciB0YXJnZXQgPSB0aGlzLAorICAgICAgICBldmVudF8gPSBldmVudC5vZih0YXJnZXQsIGFyZ3VtZW50cyksCisgICAgICAgIGV2ZW50VGFyZ2V0ID0gZDMuZXZlbnQudGFyZ2V0LAorICAgICAgICBtb3ZlZCA9IDAsCisgICAgICAgIHcgPSBkMy5zZWxlY3Qod2luZG93KS5vbigibW91c2Vtb3ZlLnpvb20iLCBtb3VzZW1vdmUpLm9uKCJtb3VzZXVwLnpvb20iLCBtb3VzZXVwKSwKKyAgICAgICAgbCA9IGxvY2F0aW9uKGQzLm1vdXNlKHRhcmdldCkpOworCisgICAgd2luZG93LmZvY3VzKCk7CisgICAgZDNfZXZlbnRDYW5jZWwoKTsKKworICAgIGZ1bmN0aW9uIG1vdXNlbW92ZSgpIHsKKyAgICAgIG1vdmVkID0gMTsKKyAgICAgIHRyYW5zbGF0ZVRvKGQzLm1vdXNlKHRhcmdldCksIGwpOworICAgICAgZGlzcGF0Y2goZXZlbnRfKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBtb3VzZXVwKCkgeworICAgICAgaWYgKG1vdmVkKSBkM19ldmVudENhbmNlbCgpOworICAgICAgdy5vbigibW91c2Vtb3ZlLnpvb20iLCBudWxsKS5vbigibW91c2V1cC56b29tIiwgbnVsbCk7CisgICAgICBpZiAobW92ZWQgJiYgZDMuZXZlbnQudGFyZ2V0ID09PSBldmVudFRhcmdldCkgdy5vbigiY2xpY2suem9vbSIsIGNsaWNrKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjbGljaygpIHsKKyAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7CisgICAgICB3Lm9uKCJjbGljay56b29tIiwgbnVsbCk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gbW91c2V3aGVlbCgpIHsKKyAgICBpZiAoIXRyYW5zbGF0ZTApIHRyYW5zbGF0ZTAgPSBsb2NhdGlvbihkMy5tb3VzZSh0aGlzKSk7CisgICAgc2NhbGVUbyhNYXRoLnBvdygyLCBkM19iZWhhdmlvcl96b29tRGVsdGEoKSAqIC4wMDIpICogc2NhbGUpOworICAgIHRyYW5zbGF0ZVRvKGQzLm1vdXNlKHRoaXMpLCB0cmFuc2xhdGUwKTsKKyAgICBkaXNwYXRjaChldmVudC5vZih0aGlzLCBhcmd1bWVudHMpKTsKKyAgfQorCisgIGZ1bmN0aW9uIG1vdXNlbW92ZSgpIHsKKyAgICB0cmFuc2xhdGUwID0gbnVsbDsKKyAgfQorCisgIGZ1bmN0aW9uIGRibGNsaWNrKCkgeworICAgIHZhciBwID0gZDMubW91c2UodGhpcyksIGwgPSBsb2NhdGlvbihwKTsKKyAgICBzY2FsZVRvKGQzLmV2ZW50LnNoaWZ0S2V5ID8gc2NhbGUgLyAyIDogc2NhbGUgKiAyKTsKKyAgICB0cmFuc2xhdGVUbyhwLCBsKTsKKyAgICBkaXNwYXRjaChldmVudC5vZih0aGlzLCBhcmd1bWVudHMpKTsKKyAgfQorCisgIGZ1bmN0aW9uIHRvdWNoc3RhcnQoKSB7CisgICAgdmFyIHRvdWNoZXMgPSBkMy50b3VjaGVzKHRoaXMpLAorICAgICAgICBub3cgPSBEYXRlLm5vdygpOworCisgICAgc2NhbGUwID0gc2NhbGU7CisgICAgdHJhbnNsYXRlMCA9IHt9OworICAgIHRvdWNoZXMuZm9yRWFjaChmdW5jdGlvbih0KSB7IHRyYW5zbGF0ZTBbdC5pZGVudGlmaWVyXSA9IGxvY2F0aW9uKHQpOyB9KTsKKyAgICBkM19ldmVudENhbmNlbCgpOworCisgICAgaWYgKCh0b3VjaGVzLmxlbmd0aCA9PT0gMSkgJiYgKG5vdyAtIHRvdWNodGltZSA8IDUwMCkpIHsgLy8gZGJsdGFwCisgICAgICB2YXIgcCA9IHRvdWNoZXNbMF0sIGwgPSBsb2NhdGlvbih0b3VjaGVzWzBdKTsKKyAgICAgIHNjYWxlVG8oc2NhbGUgKiAyKTsKKyAgICAgIHRyYW5zbGF0ZVRvKHAsIGwpOworICAgICAgZGlzcGF0Y2goZXZlbnQub2YodGhpcywgYXJndW1lbnRzKSk7CisgICAgfQorICAgIHRvdWNodGltZSA9IG5vdzsKKyAgfQorCisgIGZ1bmN0aW9uIHRvdWNobW92ZSgpIHsKKyAgICB2YXIgdG91Y2hlcyA9IGQzLnRvdWNoZXModGhpcyksCisgICAgICAgIHAwID0gdG91Y2hlc1swXSwKKyAgICAgICAgbDAgPSB0cmFuc2xhdGUwW3AwLmlkZW50aWZpZXJdOworICAgIGlmIChwMSA9IHRvdWNoZXNbMV0pIHsKKyAgICAgIHZhciBwMSwgbDEgPSB0cmFuc2xhdGUwW3AxLmlkZW50aWZpZXJdOworICAgICAgcDAgPSBbKHAwWzBdICsgcDFbMF0pIC8gMiwgKHAwWzFdICsgcDFbMV0pIC8gMl07CisgICAgICBsMCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTsKKyAgICAgIHNjYWxlVG8oZDMuZXZlbnQuc2NhbGUgKiBzY2FsZTApOworICAgIH0KKyAgICB0cmFuc2xhdGVUbyhwMCwgbDApOworICAgIGRpc3BhdGNoKGV2ZW50Lm9mKHRoaXMsIGFyZ3VtZW50cykpOworICB9CisKKyAgcmV0dXJuIGQzLnJlYmluZCh6b29tLCBldmVudCwgIm9uIik7Cit9OworCit2YXIgZDNfYmVoYXZpb3Jfem9vbURpdiwgLy8gZm9yIGludGVycHJldGluZyBtb3VzZXdoZWVsIGV2ZW50cworICAgIGQzX2JlaGF2aW9yX3pvb21JbmZpbml0eSA9IFswLCBJbmZpbml0eV07IC8vIGRlZmF1bHQgc2NhbGUgZXh0ZW50CisKK2Z1bmN0aW9uIGQzX2JlaGF2aW9yX3pvb21EZWx0YSgpIHsKKworICAvLyBtb3VzZXdoZWVsIGV2ZW50cyBhcmUgdG90YWxseSBicm9rZW4hCisgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MDQ0MQorICAvLyBub3Qgb25seSB0aGF0LCBidXQgQ2hyb21lIGFuZCBTYWZhcmkgZGlmZmVyIGluIHJlLiB0byBhY2NlbGVyYXRpb24hCisgIGlmICghZDNfYmVoYXZpb3Jfem9vbURpdikgeworICAgIGQzX2JlaGF2aW9yX3pvb21EaXYgPSBkMy5zZWxlY3QoImJvZHkiKS5hcHBlbmQoImRpdiIpCisgICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKQorICAgICAgICAuc3R5bGUoInRvcCIsIDApCisgICAgICAgIC5zdHlsZSgiaGVpZ2h0IiwgMCkKKyAgICAgICAgLnN0eWxlKCJ3aWR0aCIsIDApCisgICAgICAgIC5zdHlsZSgib3ZlcmZsb3cteSIsICJzY3JvbGwiKQorICAgICAgLmFwcGVuZCgiZGl2IikKKyAgICAgICAgLnN0eWxlKCJoZWlnaHQiLCAiMjAwMHB4IikKKyAgICAgIC5ub2RlKCkucGFyZW50Tm9kZTsKKyAgfQorCisgIHZhciBlID0gZDMuZXZlbnQsIGRlbHRhOworICB0cnkgeworICAgIGQzX2JlaGF2aW9yX3pvb21EaXYuc2Nyb2xsVG9wID0gMTAwMDsKKyAgICBkM19iZWhhdmlvcl96b29tRGl2LmRpc3BhdGNoRXZlbnQoZSk7CisgICAgZGVsdGEgPSAxMDAwIC0gZDNfYmVoYXZpb3Jfem9vbURpdi5zY3JvbGxUb3A7CisgIH0gY2F0Y2ggKGVycm9yKSB7CisgICAgZGVsdGEgPSBlLndoZWVsRGVsdGEgfHwgKC1lLmRldGFpbCAqIDUpOworICB9CisKKyAgcmV0dXJuIGRlbHRhOworfQorZDMubGF5b3V0ID0ge307CisvLyBJbXBsZW1lbnRzIGhpZXJhcmNoaWNhbCBlZGdlIGJ1bmRsaW5nIHVzaW5nIEhvbHRlbidzIGFsZ29yaXRobS4gRm9yIGVhY2gKKy8vIGlucHV0IGxpbmssIGEgcGF0aCBpcyBjb21wdXRlZCB0aGF0IHRyYXZlbHMgdGhyb3VnaCB0aGUgdHJlZSwgdXAgdGhlIHBhcmVudAorLy8gaGllcmFyY2h5IHRvIHRoZSBsZWFzdCBjb21tb24gYW5jZXN0b3IsIGFuZCB0aGVuIGJhY2sgZG93biB0byB0aGUgZGVzdGluYXRpb24KKy8vIG5vZGUuIEVhY2ggcGF0aCBpcyBzaW1wbHkgYW4gYXJyYXkgb2Ygbm9kZXMuCitkMy5sYXlvdXQuYnVuZGxlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiBmdW5jdGlvbihsaW5rcykgeworICAgIHZhciBwYXRocyA9IFtdLAorICAgICAgICBpID0gLTEsCisgICAgICAgIG4gPSBsaW5rcy5sZW5ndGg7CisgICAgd2hpbGUgKCsraSA8IG4pIHBhdGhzLnB1c2goZDNfbGF5b3V0X2J1bmRsZVBhdGgobGlua3NbaV0pKTsKKyAgICByZXR1cm4gcGF0aHM7CisgIH07Cit9OworCitmdW5jdGlvbiBkM19sYXlvdXRfYnVuZGxlUGF0aChsaW5rKSB7CisgIHZhciBzdGFydCA9IGxpbmsuc291cmNlLAorICAgICAgZW5kID0gbGluay50YXJnZXQsCisgICAgICBsY2EgPSBkM19sYXlvdXRfYnVuZGxlTGVhc3RDb21tb25BbmNlc3RvcihzdGFydCwgZW5kKSwKKyAgICAgIHBvaW50cyA9IFtzdGFydF07CisgIHdoaWxlIChzdGFydCAhPT0gbGNhKSB7CisgICAgc3RhcnQgPSBzdGFydC5wYXJlbnQ7CisgICAgcG9pbnRzLnB1c2goc3RhcnQpOworICB9CisgIHZhciBrID0gcG9pbnRzLmxlbmd0aDsKKyAgd2hpbGUgKGVuZCAhPT0gbGNhKSB7CisgICAgcG9pbnRzLnNwbGljZShrLCAwLCBlbmQpOworICAgIGVuZCA9IGVuZC5wYXJlbnQ7CisgIH0KKyAgcmV0dXJuIHBvaW50czsKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X2J1bmRsZUFuY2VzdG9ycyhub2RlKSB7CisgIHZhciBhbmNlc3RvcnMgPSBbXSwKKyAgICAgIHBhcmVudCA9IG5vZGUucGFyZW50OworICB3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKKyAgICBhbmNlc3RvcnMucHVzaChub2RlKTsKKyAgICBub2RlID0gcGFyZW50OworICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CisgIH0KKyAgYW5jZXN0b3JzLnB1c2gobm9kZSk7CisgIHJldHVybiBhbmNlc3RvcnM7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9idW5kbGVMZWFzdENvbW1vbkFuY2VzdG9yKGEsIGIpIHsKKyAgaWYgKGEgPT09IGIpIHJldHVybiBhOworICB2YXIgYU5vZGVzID0gZDNfbGF5b3V0X2J1bmRsZUFuY2VzdG9ycyhhKSwKKyAgICAgIGJOb2RlcyA9IGQzX2xheW91dF9idW5kbGVBbmNlc3RvcnMoYiksCisgICAgICBhTm9kZSA9IGFOb2Rlcy5wb3AoKSwKKyAgICAgIGJOb2RlID0gYk5vZGVzLnBvcCgpLAorICAgICAgc2hhcmVkTm9kZSA9IG51bGw7CisgIHdoaWxlIChhTm9kZSA9PT0gYk5vZGUpIHsKKyAgICBzaGFyZWROb2RlID0gYU5vZGU7CisgICAgYU5vZGUgPSBhTm9kZXMucG9wKCk7CisgICAgYk5vZGUgPSBiTm9kZXMucG9wKCk7CisgIH0KKyAgcmV0dXJuIHNoYXJlZE5vZGU7Cit9CitkMy5sYXlvdXQuY2hvcmQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGNob3JkID0ge30sCisgICAgICBjaG9yZHMsCisgICAgICBncm91cHMsCisgICAgICBtYXRyaXgsCisgICAgICBuLAorICAgICAgcGFkZGluZyA9IDAsCisgICAgICBzb3J0R3JvdXBzLAorICAgICAgc29ydFN1Ymdyb3VwcywKKyAgICAgIHNvcnRDaG9yZHM7CisKKyAgZnVuY3Rpb24gcmVsYXlvdXQoKSB7CisgICAgdmFyIHN1Ymdyb3VwcyA9IHt9LAorICAgICAgICBncm91cFN1bXMgPSBbXSwKKyAgICAgICAgZ3JvdXBJbmRleCA9IGQzLnJhbmdlKG4pLAorICAgICAgICBzdWJncm91cEluZGV4ID0gW10sCisgICAgICAgIGssCisgICAgICAgIHgsCisgICAgICAgIHgwLAorICAgICAgICBpLAorICAgICAgICBqOworCisgICAgY2hvcmRzID0gW107CisgICAgZ3JvdXBzID0gW107CisKKyAgICAvLyBDb21wdXRlIHRoZSBzdW0uCisgICAgayA9IDAsIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHsKKyAgICAgIHggPSAwLCBqID0gLTE7IHdoaWxlICgrK2ogPCBuKSB7CisgICAgICAgIHggKz0gbWF0cml4W2ldW2pdOworICAgICAgfQorICAgICAgZ3JvdXBTdW1zLnB1c2goeCk7CisgICAgICBzdWJncm91cEluZGV4LnB1c2goZDMucmFuZ2UobikpOworICAgICAgayArPSB4OworICAgIH0KKworICAgIC8vIFNvcnQgZ3JvdXBz4oA/CisgICAgaWYgKHNvcnRHcm91cHMpIHsKKyAgICAgIGdyb3VwSW5kZXguc29ydChmdW5jdGlvbihhLCBiKSB7CisgICAgICAgIHJldHVybiBzb3J0R3JvdXBzKGdyb3VwU3Vtc1thXSwgZ3JvdXBTdW1zW2JdKTsKKyAgICAgIH0pOworICAgIH0KKworICAgIC8vIFNvcnQgc3ViZ3JvdXBz4oA/CisgICAgaWYgKHNvcnRTdWJncm91cHMpIHsKKyAgICAgIHN1Ymdyb3VwSW5kZXguZm9yRWFjaChmdW5jdGlvbihkLCBpKSB7CisgICAgICAgIGQuc29ydChmdW5jdGlvbihhLCBiKSB7CisgICAgICAgICAgcmV0dXJuIHNvcnRTdWJncm91cHMobWF0cml4W2ldW2FdLCBtYXRyaXhbaV1bYl0pOworICAgICAgICB9KTsKKyAgICAgIH0pOworICAgIH0KKworICAgIC8vIENvbnZlcnQgdGhlIHN1bSB0byBzY2FsaW5nIGZhY3RvciBmb3IgWzAsIDJwaV0uCisgICAgLy8gVE9ETyBBbGxvdyBzdGFydCBhbmQgZW5kIGFuZ2xlIHRvIGJlIHNwZWNpZmllZC4KKyAgICAvLyBUT0RPIEFsbG93IHBhZGRpbmcgdG8gYmUgc3BlY2lmaWVkIGFzIHBlcmNlbnRhZ2U/CisgICAgayA9ICgyICogTWF0aC5QSSAtIHBhZGRpbmcgKiBuKSAvIGs7CisKKyAgICAvLyBDb21wdXRlIHRoZSBzdGFydCBhbmQgZW5kIGFuZ2xlIGZvciBlYWNoIGdyb3VwIGFuZCBzdWJncm91cC4KKyAgICAvLyBOb3RlOiBPcGVyYSBoYXMgYSBidWcgcmVvcmRlcmluZyBvYmplY3QgbGl0ZXJhbCBwcm9wZXJ0aWVzIQorICAgIHggPSAwLCBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7CisgICAgICB4MCA9IHgsIGogPSAtMTsgd2hpbGUgKCsraiA8IG4pIHsKKyAgICAgICAgdmFyIGRpID0gZ3JvdXBJbmRleFtpXSwKKyAgICAgICAgICAgIGRqID0gc3ViZ3JvdXBJbmRleFtkaV1bal0sCisgICAgICAgICAgICB2ID0gbWF0cml4W2RpXVtkal0sCisgICAgICAgICAgICBhMCA9IHgsCisgICAgICAgICAgICBhMSA9IHggKz0gdiAqIGs7CisgICAgICAgIHN1Ymdyb3Vwc1tkaSArICItIiArIGRqXSA9IHsKKyAgICAgICAgICBpbmRleDogZGksCisgICAgICAgICAgc3ViaW5kZXg6IGRqLAorICAgICAgICAgIHN0YXJ0QW5nbGU6IGEwLAorICAgICAgICAgIGVuZEFuZ2xlOiBhMSwKKyAgICAgICAgICB2YWx1ZTogdgorICAgICAgICB9OworICAgICAgfQorICAgICAgZ3JvdXBzLnB1c2goeworICAgICAgICBpbmRleDogZGksCisgICAgICAgIHN0YXJ0QW5nbGU6IHgwLAorICAgICAgICBlbmRBbmdsZTogeCwKKyAgICAgICAgdmFsdWU6ICh4IC0geDApIC8gaworICAgICAgfSk7CisgICAgICB4ICs9IHBhZGRpbmc7CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgY2hvcmRzIGZvciBlYWNoIChub24tZW1wdHkpIHN1Ymdyb3VwLXN1Ymdyb3VwIGxpbmsuCisgICAgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgeworICAgICAgaiA9IGkgLSAxOyB3aGlsZSAoKytqIDwgbikgeworICAgICAgICB2YXIgc291cmNlID0gc3ViZ3JvdXBzW2kgKyAiLSIgKyBqXSwKKyAgICAgICAgICAgIHRhcmdldCA9IHN1Ymdyb3Vwc1tqICsgIi0iICsgaV07CisgICAgICAgIGlmIChzb3VyY2UudmFsdWUgfHwgdGFyZ2V0LnZhbHVlKSB7CisgICAgICAgICAgY2hvcmRzLnB1c2goc291cmNlLnZhbHVlIDwgdGFyZ2V0LnZhbHVlCisgICAgICAgICAgICAgID8ge3NvdXJjZTogdGFyZ2V0LCB0YXJnZXQ6IHNvdXJjZX0KKyAgICAgICAgICAgICAgOiB7c291cmNlOiBzb3VyY2UsIHRhcmdldDogdGFyZ2V0fSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc29ydENob3JkcykgcmVzb3J0KCk7CisgIH0KKworICBmdW5jdGlvbiByZXNvcnQoKSB7CisgICAgY2hvcmRzLnNvcnQoZnVuY3Rpb24oYSwgYikgeworICAgICAgcmV0dXJuIHNvcnRDaG9yZHMoCisgICAgICAgICAgKGEuc291cmNlLnZhbHVlICsgYS50YXJnZXQudmFsdWUpIC8gMiwKKyAgICAgICAgICAoYi5zb3VyY2UudmFsdWUgKyBiLnRhcmdldC52YWx1ZSkgLyAyKTsKKyAgICB9KTsKKyAgfQorCisgIGNob3JkLm1hdHJpeCA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBtYXRyaXg7CisgICAgbiA9IChtYXRyaXggPSB4KSAmJiBtYXRyaXgubGVuZ3RoOworICAgIGNob3JkcyA9IGdyb3VwcyA9IG51bGw7CisgICAgcmV0dXJuIGNob3JkOworICB9OworCisgIGNob3JkLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkZGluZzsKKyAgICBwYWRkaW5nID0geDsKKyAgICBjaG9yZHMgPSBncm91cHMgPSBudWxsOworICAgIHJldHVybiBjaG9yZDsKKyAgfTsKKworICBjaG9yZC5zb3J0R3JvdXBzID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnRHcm91cHM7CisgICAgc29ydEdyb3VwcyA9IHg7CisgICAgY2hvcmRzID0gZ3JvdXBzID0gbnVsbDsKKyAgICByZXR1cm4gY2hvcmQ7CisgIH07CisKKyAgY2hvcmQuc29ydFN1Ymdyb3VwcyA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3J0U3ViZ3JvdXBzOworICAgIHNvcnRTdWJncm91cHMgPSB4OworICAgIGNob3JkcyA9IG51bGw7CisgICAgcmV0dXJuIGNob3JkOworICB9OworCisgIGNob3JkLnNvcnRDaG9yZHMgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydENob3JkczsKKyAgICBzb3J0Q2hvcmRzID0geDsKKyAgICBpZiAoY2hvcmRzKSByZXNvcnQoKTsKKyAgICByZXR1cm4gY2hvcmQ7CisgIH07CisKKyAgY2hvcmQuY2hvcmRzID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKCFjaG9yZHMpIHJlbGF5b3V0KCk7CisgICAgcmV0dXJuIGNob3JkczsKKyAgfTsKKworICBjaG9yZC5ncm91cHMgPSBmdW5jdGlvbigpIHsKKyAgICBpZiAoIWdyb3VwcykgcmVsYXlvdXQoKTsKKyAgICByZXR1cm4gZ3JvdXBzOworICB9OworCisgIHJldHVybiBjaG9yZDsKK307CisvLyBBIHJ1ZGltZW50YXJ5IGZvcmNlIGxheW91dCB1c2luZyBHYXVzcy1TZWlkZWwuCitkMy5sYXlvdXQuZm9yY2UgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGZvcmNlID0ge30sCisgICAgICBldmVudCA9IGQzLmRpc3BhdGNoKCJzdGFydCIsICJ0aWNrIiwgImVuZCIpLAorICAgICAgc2l6ZSA9IFsxLCAxXSwKKyAgICAgIGRyYWcsCisgICAgICBhbHBoYSwKKyAgICAgIGZyaWN0aW9uID0gLjksCisgICAgICBsaW5rRGlzdGFuY2UgPSBkM19sYXlvdXRfZm9yY2VMaW5rRGlzdGFuY2UsCisgICAgICBsaW5rU3RyZW5ndGggPSBkM19sYXlvdXRfZm9yY2VMaW5rU3RyZW5ndGgsCisgICAgICBjaGFyZ2UgPSAtMzAsCisgICAgICBncmF2aXR5ID0gLjEsCisgICAgICB0aGV0YSA9IC44LAorICAgICAgaW50ZXJ2YWwsCisgICAgICBub2RlcyA9IFtdLAorICAgICAgbGlua3MgPSBbXSwKKyAgICAgIGRpc3RhbmNlcywKKyAgICAgIHN0cmVuZ3RocywKKyAgICAgIGNoYXJnZXM7CisKKyAgZnVuY3Rpb24gcmVwdWxzZShub2RlKSB7CisgICAgcmV0dXJuIGZ1bmN0aW9uKHF1YWQsIHgxLCB5MSwgeDIsIHkyKSB7CisgICAgICBpZiAocXVhZC5wb2ludCAhPT0gbm9kZSkgeworICAgICAgICB2YXIgZHggPSBxdWFkLmN4IC0gbm9kZS54LAorICAgICAgICAgICAgZHkgPSBxdWFkLmN5IC0gbm9kZS55LAorICAgICAgICAgICAgZG4gPSAxIC8gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsKKworICAgICAgICAvKiBCYXJuZXMtSHV0IGNyaXRlcmlvbi4gKi8KKyAgICAgICAgaWYgKCh4MiAtIHgxKSAqIGRuIDwgdGhldGEpIHsKKyAgICAgICAgICB2YXIgayA9IHF1YWQuY2hhcmdlICogZG4gKiBkbjsKKyAgICAgICAgICBub2RlLnB4IC09IGR4ICogazsKKyAgICAgICAgICBub2RlLnB5IC09IGR5ICogazsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWFkLnBvaW50ICYmIGlzRmluaXRlKGRuKSkgeworICAgICAgICAgIHZhciBrID0gcXVhZC5wb2ludENoYXJnZSAqIGRuICogZG47CisgICAgICAgICAgbm9kZS5weCAtPSBkeCAqIGs7CisgICAgICAgICAgbm9kZS5weSAtPSBkeSAqIGs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAhcXVhZC5jaGFyZ2U7CisgICAgfTsKKyAgfQorCisgIGZvcmNlLnRpY2sgPSBmdW5jdGlvbigpIHsKKyAgICAvLyBzaW11bGF0ZWQgYW5uZWFsaW5nLCBiYXNpY2FsbHkKKyAgICBpZiAoKGFscGhhICo9IC45OSkgPCAuMDA1KSB7CisgICAgICBldmVudC5lbmQoe3R5cGU6ICJlbmQiLCBhbHBoYTogYWxwaGEgPSAwfSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2YXIgbiA9IG5vZGVzLmxlbmd0aCwKKyAgICAgICAgbSA9IGxpbmtzLmxlbmd0aCwKKyAgICAgICAgcSwKKyAgICAgICAgaSwgLy8gY3VycmVudCBpbmRleAorICAgICAgICBvLCAvLyBjdXJyZW50IG9iamVjdAorICAgICAgICBzLCAvLyBjdXJyZW50IHNvdXJjZQorICAgICAgICB0LCAvLyBjdXJyZW50IHRhcmdldAorICAgICAgICBsLCAvLyBjdXJyZW50IGRpc3RhbmNlCisgICAgICAgIGssIC8vIGN1cnJlbnQgZm9yY2UKKyAgICAgICAgeCwgLy8geC1kaXN0YW5jZQorICAgICAgICB5OyAvLyB5LWRpc3RhbmNlCisKKyAgICAvLyBnYXVzcy1zZWlkZWwgcmVsYXhhdGlvbiBmb3IgbGlua3MKKyAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CisgICAgICBvID0gbGlua3NbaV07CisgICAgICBzID0gby5zb3VyY2U7CisgICAgICB0ID0gby50YXJnZXQ7CisgICAgICB4ID0gdC54IC0gcy54OworICAgICAgeSA9IHQueSAtIHMueTsKKyAgICAgIGlmIChsID0gKHggKiB4ICsgeSAqIHkpKSB7CisgICAgICAgIGwgPSBhbHBoYSAqIHN0cmVuZ3Roc1tpXSAqICgobCA9IE1hdGguc3FydChsKSkgLSBkaXN0YW5jZXNbaV0pIC8gbDsKKyAgICAgICAgeCAqPSBsOworICAgICAgICB5ICo9IGw7CisgICAgICAgIHQueCAtPSB4ICogKGsgPSBzLndlaWdodCAvICh0LndlaWdodCArIHMud2VpZ2h0KSk7CisgICAgICAgIHQueSAtPSB5ICogazsKKyAgICAgICAgcy54ICs9IHggKiAoayA9IDEgLSBrKTsKKyAgICAgICAgcy55ICs9IHkgKiBrOworICAgICAgfQorICAgIH0KKworICAgIC8vIGFwcGx5IGdyYXZpdHkgZm9yY2VzCisgICAgaWYgKGsgPSBhbHBoYSAqIGdyYXZpdHkpIHsKKyAgICAgIHggPSBzaXplWzBdIC8gMjsKKyAgICAgIHkgPSBzaXplWzFdIC8gMjsKKyAgICAgIGkgPSAtMTsgaWYgKGspIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICAgIG8gPSBub2Rlc1tpXTsKKyAgICAgICAgby54ICs9ICh4IC0gby54KSAqIGs7CisgICAgICAgIG8ueSArPSAoeSAtIG8ueSkgKiBrOworICAgICAgfQorICAgIH0KKworICAgIC8vIGNvbXB1dGUgcXVhZHRyZWUgY2VudGVyIG9mIG1hc3MgYW5kIGFwcGx5IGNoYXJnZSBmb3JjZXMKKyAgICBpZiAoY2hhcmdlKSB7CisgICAgICBkM19sYXlvdXRfZm9yY2VBY2N1bXVsYXRlKHEgPSBkMy5nZW9tLnF1YWR0cmVlKG5vZGVzKSwgYWxwaGEsIGNoYXJnZXMpOworICAgICAgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgeworICAgICAgICBpZiAoIShvID0gbm9kZXNbaV0pLmZpeGVkKSB7CisgICAgICAgICAgcS52aXNpdChyZXB1bHNlKG8pKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIHBvc2l0aW9uIHZlcmxldCBpbnRlZ3JhdGlvbgorICAgIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHsKKyAgICAgIG8gPSBub2Rlc1tpXTsKKyAgICAgIGlmIChvLmZpeGVkKSB7CisgICAgICAgIG8ueCA9IG8ucHg7CisgICAgICAgIG8ueSA9IG8ucHk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvLnggLT0gKG8ucHggLSAoby5weCA9IG8ueCkpICogZnJpY3Rpb247CisgICAgICAgIG8ueSAtPSAoby5weSAtIChvLnB5ID0gby55KSkgKiBmcmljdGlvbjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBldmVudC50aWNrKHt0eXBlOiAidGljayIsIGFscGhhOiBhbHBoYX0pOworICB9OworCisgIGZvcmNlLm5vZGVzID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVzOworICAgIG5vZGVzID0geDsKKyAgICByZXR1cm4gZm9yY2U7CisgIH07CisKKyAgZm9yY2UubGlua3MgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGlua3M7CisgICAgbGlua3MgPSB4OworICAgIHJldHVybiBmb3JjZTsKKyAgfTsKKworICBmb3JjZS5zaXplID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7CisgICAgc2l6ZSA9IHg7CisgICAgcmV0dXJuIGZvcmNlOworICB9OworCisgIGZvcmNlLmxpbmtEaXN0YW5jZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5rRGlzdGFuY2U7CisgICAgbGlua0Rpc3RhbmNlID0gZDMuZnVuY3Rvcih4KTsKKyAgICByZXR1cm4gZm9yY2U7CisgIH07CisKKyAgLy8gRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgorICBmb3JjZS5kaXN0YW5jZSA9IGZvcmNlLmxpbmtEaXN0YW5jZTsKKworICBmb3JjZS5saW5rU3RyZW5ndGggPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGlua1N0cmVuZ3RoOworICAgIGxpbmtTdHJlbmd0aCA9IGQzLmZ1bmN0b3IoeCk7CisgICAgcmV0dXJuIGZvcmNlOworICB9OworCisgIGZvcmNlLmZyaWN0aW9uID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGZyaWN0aW9uOworICAgIGZyaWN0aW9uID0geDsKKyAgICByZXR1cm4gZm9yY2U7CisgIH07CisKKyAgZm9yY2UuY2hhcmdlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNoYXJnZTsKKyAgICBjaGFyZ2UgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiAreDsKKyAgICByZXR1cm4gZm9yY2U7CisgIH07CisKKyAgZm9yY2UuZ3Jhdml0eSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBncmF2aXR5OworICAgIGdyYXZpdHkgPSB4OworICAgIHJldHVybiBmb3JjZTsKKyAgfTsKKworICBmb3JjZS50aGV0YSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGV0YTsKKyAgICB0aGV0YSA9IHg7CisgICAgcmV0dXJuIGZvcmNlOworICB9OworCisgIGZvcmNlLmFscGhhID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGFscGhhOworCisgICAgaWYgKGFscGhhKSB7IC8vIGlmIHdlJ3JlIGFscmVhZHkgcnVubmluZworICAgICAgaWYgKHggPiAwKSBhbHBoYSA9IHg7IC8vIHdlIG1pZ2h0IGtlZXAgaXQgaG90CisgICAgICBlbHNlIGFscGhhID0gMDsgLy8gb3IsIG5leHQgdGljayB3aWxsIGRpc3BhdGNoICJlbmQiCisgICAgfSBlbHNlIGlmICh4ID4gMCkgeyAvLyBvdGhlcndpc2UsIGZpcmUgaXQgdXAhCisgICAgICBldmVudC5zdGFydCh7dHlwZTogInN0YXJ0IiwgYWxwaGE6IGFscGhhID0geH0pOworICAgICAgZDMudGltZXIoZm9yY2UudGljayk7CisgICAgfQorCisgICAgcmV0dXJuIGZvcmNlOworICB9OworCisgIGZvcmNlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIGksCisgICAgICAgIGosCisgICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsCisgICAgICAgIG0gPSBsaW5rcy5sZW5ndGgsCisgICAgICAgIHcgPSBzaXplWzBdLAorICAgICAgICBoID0gc2l6ZVsxXSwKKyAgICAgICAgbmVpZ2hib3JzLAorICAgICAgICBvOworCisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgKG8gPSBub2Rlc1tpXSkuaW5kZXggPSBpOworICAgICAgby53ZWlnaHQgPSAwOworICAgIH0KKworICAgIGRpc3RhbmNlcyA9IFtdOworICAgIHN0cmVuZ3RocyA9IFtdOworICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKKyAgICAgIG8gPSBsaW5rc1tpXTsKKyAgICAgIGlmICh0eXBlb2Ygby5zb3VyY2UgPT0gIm51bWJlciIpIG8uc291cmNlID0gbm9kZXNbby5zb3VyY2VdOworICAgICAgaWYgKHR5cGVvZiBvLnRhcmdldCA9PSAibnVtYmVyIikgby50YXJnZXQgPSBub2Rlc1tvLnRhcmdldF07CisgICAgICBkaXN0YW5jZXNbaV0gPSBsaW5rRGlzdGFuY2UuY2FsbCh0aGlzLCBvLCBpKTsKKyAgICAgIHN0cmVuZ3Roc1tpXSA9IGxpbmtTdHJlbmd0aC5jYWxsKHRoaXMsIG8sIGkpOworICAgICAgKytvLnNvdXJjZS53ZWlnaHQ7CisgICAgICArK28udGFyZ2V0LndlaWdodDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICBvID0gbm9kZXNbaV07CisgICAgICBpZiAoaXNOYU4oby54KSkgby54ID0gcG9zaXRpb24oIngiLCB3KTsKKyAgICAgIGlmIChpc05hTihvLnkpKSBvLnkgPSBwb3NpdGlvbigieSIsIGgpOworICAgICAgaWYgKGlzTmFOKG8ucHgpKSBvLnB4ID0gby54OworICAgICAgaWYgKGlzTmFOKG8ucHkpKSBvLnB5ID0gby55OworICAgIH0KKworICAgIGNoYXJnZXMgPSBbXTsKKyAgICBpZiAodHlwZW9mIGNoYXJnZSA9PT0gImZ1bmN0aW9uIikgeworICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBjaGFyZ2VzW2ldID0gK2NoYXJnZS5jYWxsKHRoaXMsIG5vZGVzW2ldLCBpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBjaGFyZ2VzW2ldID0gY2hhcmdlOworICAgICAgfQorICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgbm9kZSBwb3NpdGlvbiBiYXNlZCBvbiBmaXJzdCBuZWlnaGJvcgorICAgIGZ1bmN0aW9uIHBvc2l0aW9uKGRpbWVuc2lvbiwgc2l6ZSkgeworICAgICAgdmFyIG5laWdoYm9ycyA9IG5laWdoYm9yKGkpLAorICAgICAgICAgIGogPSAtMSwKKyAgICAgICAgICBtID0gbmVpZ2hib3JzLmxlbmd0aCwKKyAgICAgICAgICB4OworICAgICAgd2hpbGUgKCsraiA8IG0pIGlmICghaXNOYU4oeCA9IG5laWdoYm9yc1tqXVtkaW1lbnNpb25dKSkgcmV0dXJuIHg7CisgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIHNpemU7CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBuZWlnaGJvcnMgbGF6aWx5CisgICAgZnVuY3Rpb24gbmVpZ2hib3IoKSB7CisgICAgICBpZiAoIW5laWdoYm9ycykgeworICAgICAgICBuZWlnaGJvcnMgPSBbXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgeworICAgICAgICAgIG5laWdoYm9yc1tqXSA9IFtdOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKKyAgICAgICAgICB2YXIgbyA9IGxpbmtzW2pdOworICAgICAgICAgIG5laWdoYm9yc1tvLnNvdXJjZS5pbmRleF0ucHVzaChvLnRhcmdldCk7CisgICAgICAgICAgbmVpZ2hib3JzW28udGFyZ2V0LmluZGV4XS5wdXNoKG8uc291cmNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG5laWdoYm9yc1tpXTsKKyAgICB9CisKKyAgICByZXR1cm4gZm9yY2UucmVzdW1lKCk7CisgIH07CisKKyAgZm9yY2UucmVzdW1lID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIGZvcmNlLmFscGhhKC4xKTsKKyAgfTsKKworICBmb3JjZS5zdG9wID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIGZvcmNlLmFscGhhKDApOworICB9OworCisgIC8vIHVzZSBgbm9kZS5jYWxsKGZvcmNlLmRyYWcpYCB0byBtYWtlIG5vZGVzIGRyYWdnYWJsZQorICBmb3JjZS5kcmFnID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKCFkcmFnKSBkcmFnID0gZDMuYmVoYXZpb3IuZHJhZygpCisgICAgICAgIC5vcmlnaW4oT2JqZWN0KQorICAgICAgICAub24oImRyYWdzdGFydCIsIGRyYWdzdGFydCkKKyAgICAgICAgLm9uKCJkcmFnIiwgZDNfbGF5b3V0X2ZvcmNlRHJhZykKKyAgICAgICAgLm9uKCJkcmFnZW5kIiwgZDNfbGF5b3V0X2ZvcmNlRHJhZ0VuZCk7CisKKyAgICB0aGlzLm9uKCJtb3VzZW92ZXIuZm9yY2UiLCBkM19sYXlvdXRfZm9yY2VEcmFnT3ZlcikKKyAgICAgICAgLm9uKCJtb3VzZW91dC5mb3JjZSIsIGQzX2xheW91dF9mb3JjZURyYWdPdXQpCisgICAgICAgIC5jYWxsKGRyYWcpOworICB9OworCisgIGZ1bmN0aW9uIGRyYWdzdGFydChkKSB7CisgICAgZDNfbGF5b3V0X2ZvcmNlRHJhZ092ZXIoZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGUgPSBkKTsKKyAgICBkM19sYXlvdXRfZm9yY2VEcmFnRm9yY2UgPSBmb3JjZTsKKyAgfQorCisgIHJldHVybiBkMy5yZWJpbmQoZm9yY2UsIGV2ZW50LCAib24iKTsKK307CisKK3ZhciBkM19sYXlvdXRfZm9yY2VEcmFnRm9yY2UsCisgICAgZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGU7CisKK2Z1bmN0aW9uIGQzX2xheW91dF9mb3JjZURyYWdPdmVyKGQpIHsKKyAgZC5maXhlZCB8PSAyOworfQorCitmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VEcmFnT3V0KGQpIHsKKyAgaWYgKGQgIT09IGQzX2xheW91dF9mb3JjZURyYWdOb2RlKSBkLmZpeGVkICY9IDE7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9mb3JjZURyYWdFbmQoKSB7CisgIGQzX2xheW91dF9mb3JjZURyYWdOb2RlLmZpeGVkICY9IDE7CisgIGQzX2xheW91dF9mb3JjZURyYWdGb3JjZSA9IGQzX2xheW91dF9mb3JjZURyYWdOb2RlID0gbnVsbDsKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlRHJhZygpIHsKKyAgZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGUucHggPSBkMy5ldmVudC54OworICBkM19sYXlvdXRfZm9yY2VEcmFnTm9kZS5weSA9IGQzLmV2ZW50Lnk7CisgIGQzX2xheW91dF9mb3JjZURyYWdGb3JjZS5yZXN1bWUoKTsgLy8gcmVzdGFydCBhbm5lYWxpbmcKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlQWNjdW11bGF0ZShxdWFkLCBhbHBoYSwgY2hhcmdlcykgeworICB2YXIgY3ggPSAwLAorICAgICAgY3kgPSAwOworICBxdWFkLmNoYXJnZSA9IDA7CisgIGlmICghcXVhZC5sZWFmKSB7CisgICAgdmFyIG5vZGVzID0gcXVhZC5ub2RlcywKKyAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKKyAgICAgICAgaSA9IC0xLAorICAgICAgICBjOworICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICBjID0gbm9kZXNbaV07CisgICAgICBpZiAoYyA9PSBudWxsKSBjb250aW51ZTsKKyAgICAgIGQzX2xheW91dF9mb3JjZUFjY3VtdWxhdGUoYywgYWxwaGEsIGNoYXJnZXMpOworICAgICAgcXVhZC5jaGFyZ2UgKz0gYy5jaGFyZ2U7CisgICAgICBjeCArPSBjLmNoYXJnZSAqIGMuY3g7CisgICAgICBjeSArPSBjLmNoYXJnZSAqIGMuY3k7CisgICAgfQorICB9CisgIGlmIChxdWFkLnBvaW50KSB7CisgICAgLy8gaml0dGVyIGludGVybmFsIG5vZGVzIHRoYXQgYXJlIGNvaW5jaWRlbnQKKyAgICBpZiAoIXF1YWQubGVhZikgeworICAgICAgcXVhZC5wb2ludC54ICs9IE1hdGgucmFuZG9tKCkgLSAuNTsKKyAgICAgIHF1YWQucG9pbnQueSArPSBNYXRoLnJhbmRvbSgpIC0gLjU7CisgICAgfQorICAgIHZhciBrID0gYWxwaGEgKiBjaGFyZ2VzW3F1YWQucG9pbnQuaW5kZXhdOworICAgIHF1YWQuY2hhcmdlICs9IHF1YWQucG9pbnRDaGFyZ2UgPSBrOworICAgIGN4ICs9IGsgKiBxdWFkLnBvaW50Lng7CisgICAgY3kgKz0gayAqIHF1YWQucG9pbnQueTsKKyAgfQorICBxdWFkLmN4ID0gY3ggLyBxdWFkLmNoYXJnZTsKKyAgcXVhZC5jeSA9IGN5IC8gcXVhZC5jaGFyZ2U7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9mb3JjZUxpbmtEaXN0YW5jZShsaW5rKSB7CisgIHJldHVybiAyMDsKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlTGlua1N0cmVuZ3RoKGxpbmspIHsKKyAgcmV0dXJuIDE7Cit9CitkMy5sYXlvdXQucGFydGl0aW9uID0gZnVuY3Rpb24oKSB7CisgIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCksCisgICAgICBzaXplID0gWzEsIDFdOyAvLyB3aWR0aCwgaGVpZ2h0CisKKyAgZnVuY3Rpb24gcG9zaXRpb24obm9kZSwgeCwgZHgsIGR5KSB7CisgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKKyAgICBub2RlLnggPSB4OworICAgIG5vZGUueSA9IG5vZGUuZGVwdGggKiBkeTsKKyAgICBub2RlLmR4ID0gZHg7CisgICAgbm9kZS5keSA9IGR5OworICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsKKyAgICAgIHZhciBpID0gLTEsCisgICAgICAgICAgbiwKKyAgICAgICAgICBjLAorICAgICAgICAgIGQ7CisgICAgICBkeCA9IG5vZGUudmFsdWUgPyBkeCAvIG5vZGUudmFsdWUgOiAwOworICAgICAgd2hpbGUgKCsraSA8IG4pIHsKKyAgICAgICAgcG9zaXRpb24oYyA9IGNoaWxkcmVuW2ldLCB4LCBkID0gYy52YWx1ZSAqIGR4LCBkeSk7CisgICAgICAgIHggKz0gZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBkZXB0aChub2RlKSB7CisgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwKKyAgICAgICAgZCA9IDA7CisgICAgaWYgKGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkgeworICAgICAgdmFyIGkgPSAtMSwKKyAgICAgICAgICBuOworICAgICAgd2hpbGUgKCsraSA8IG4pIGQgPSBNYXRoLm1heChkLCBkZXB0aChjaGlsZHJlbltpXSkpOworICAgIH0KKyAgICByZXR1cm4gMSArIGQ7CisgIH0KKworICBmdW5jdGlvbiBwYXJ0aXRpb24oZCwgaSkgeworICAgIHZhciBub2RlcyA9IGhpZXJhcmNoeS5jYWxsKHRoaXMsIGQsIGkpOworICAgIHBvc2l0aW9uKG5vZGVzWzBdLCAwLCBzaXplWzBdLCBzaXplWzFdIC8gZGVwdGgobm9kZXNbMF0pKTsKKyAgICByZXR1cm4gbm9kZXM7CisgIH0KKworICBwYXJ0aXRpb24uc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOworICAgIHNpemUgPSB4OworICAgIHJldHVybiBwYXJ0aXRpb247CisgIH07CisKKyAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQocGFydGl0aW9uLCBoaWVyYXJjaHkpOworfTsKK2QzLmxheW91dC5waWUgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHZhbHVlID0gTnVtYmVyLAorICAgICAgc29ydCA9IGQzX2xheW91dF9waWVTb3J0QnlWYWx1ZSwKKyAgICAgIHN0YXJ0QW5nbGUgPSAwLAorICAgICAgZW5kQW5nbGUgPSAyICogTWF0aC5QSTsKKworICBmdW5jdGlvbiBwaWUoZGF0YSwgaSkgeworCisgICAgLy8gQ29tcHV0ZSB0aGUgbnVtZXJpYyB2YWx1ZXMgZm9yIGVhY2ggZGF0YSBlbGVtZW50LgorICAgIHZhciB2YWx1ZXMgPSBkYXRhLm1hcChmdW5jdGlvbihkLCBpKSB7IHJldHVybiArdmFsdWUuY2FsbChwaWUsIGQsIGkpOyB9KTsKKworICAgIC8vIENvbXB1dGUgdGhlIHN0YXJ0IGFuZ2xlLgorICAgIHZhciBhID0gKyh0eXBlb2Ygc3RhcnRBbmdsZSA9PT0gImZ1bmN0aW9uIgorICAgICAgICA/IHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKQorICAgICAgICA6IHN0YXJ0QW5nbGUpOworCisgICAgLy8gQ29tcHV0ZSB0aGUgYW5ndWxhciBzY2FsZSBmYWN0b3I6IGZyb20gdmFsdWUgdG8gcmFkaWFucy4KKyAgICB2YXIgayA9ICgodHlwZW9mIGVuZEFuZ2xlID09PSAiZnVuY3Rpb24iCisgICAgICAgID8gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKQorICAgICAgICA6IGVuZEFuZ2xlKSAtIHN0YXJ0QW5nbGUpCisgICAgICAgIC8gZDMuc3VtKHZhbHVlcyk7CisKKyAgICAvLyBPcHRpb25hbGx5IHNvcnQgdGhlIGRhdGEuCisgICAgdmFyIGluZGV4ID0gZDMucmFuZ2UoZGF0YS5sZW5ndGgpOworICAgIGlmIChzb3J0ICE9IG51bGwpIGluZGV4LnNvcnQoc29ydCA9PT0gZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlCisgICAgICAgID8gZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gdmFsdWVzW2pdIC0gdmFsdWVzW2ldOyB9CisgICAgICAgIDogZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gc29ydChkYXRhW2ldLCBkYXRhW2pdKTsgfSk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBhcmNzIQorICAgIC8vIFRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgb3JpZ2luYWwgZGF0YSdzIG9yZGVyLgorICAgIHZhciBhcmNzID0gW107CisgICAgaW5kZXguZm9yRWFjaChmdW5jdGlvbihpKSB7CisgICAgICBhcmNzW2ldID0geworICAgICAgICBkYXRhOiBkYXRhW2ldLAorICAgICAgICB2YWx1ZTogZCA9IHZhbHVlc1tpXSwKKyAgICAgICAgc3RhcnRBbmdsZTogYSwKKyAgICAgICAgZW5kQW5nbGU6IGEgKz0gZCAqIGsKKyAgICAgIH07CisgICAgfSk7CisgICAgcmV0dXJuIGFyY3M7CisgIH0KKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBmdW5jdGlvbiAqeCosIHdoaWNoIHJldHVybnMgYSBub25uZWdhdGl2ZSBudW1lcmljIHZhbHVlCisgICAqIGZvciBlYWNoIGRhdHVtLiBUaGUgZGVmYXVsdCB2YWx1ZSBmdW5jdGlvbiBpcyBgTnVtYmVyYC4gVGhlIHZhbHVlIGZ1bmN0aW9uCisgICAqIGlzIHBhc3NlZCB0d28gYXJndW1lbnRzOiB0aGUgY3VycmVudCBkYXR1bSBhbmQgdGhlIGN1cnJlbnQgaW5kZXguCisgICAqLworICBwaWUudmFsdWUgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWU7CisgICAgdmFsdWUgPSB4OworICAgIHJldHVybiBwaWU7CisgIH07CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyBhIHNvcnQgY29tcGFyaXNvbiBvcGVyYXRvciAqeCouIFRoZSBjb21wYXJhdG9yIGlzIHBhc3NlZCB0d28gZGF0YQorICAgKiBlbGVtZW50cyBmcm9tIHRoZSBkYXRhIGFycmF5LCBhIGFuZCBiOyBpdCByZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgaWYgYSBpcworICAgKiBsZXNzIHRoYW4gYiwgYSBwb3NpdGl2ZSB2YWx1ZSBpZiBhIGlzIGdyZWF0ZXIgdGhhbiBiLCBhbmQgemVybyBpZiBhIGVxdWFscworICAgKiBiLgorICAgKi8KKyAgcGllLnNvcnQgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydDsKKyAgICBzb3J0ID0geDsKKyAgICByZXR1cm4gcGllOworICB9OworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhlIG92ZXJhbGwgc3RhcnQgYW5nbGUgb2YgdGhlIHBpZSBjaGFydC4gRGVmYXVsdHMgdG8gMC4gVGhlCisgICAqIHN0YXJ0IGFuZ2xlIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgY29uc3RhbnQgb3IgYXMgYSBmdW5jdGlvbjsgaW4gdGhlCisgICAqIGNhc2Ugb2YgYSBmdW5jdGlvbiwgaXQgaXMgZXZhbHVhdGVkIG9uY2UgcGVyIGFycmF5IChhcyBvcHBvc2VkIHRvIHBlcgorICAgKiBlbGVtZW50KS4KKyAgICovCisgIHBpZS5zdGFydEFuZ2xlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7CisgICAgc3RhcnRBbmdsZSA9IHg7CisgICAgcmV0dXJuIHBpZTsKKyAgfTsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoZSBvdmVyYWxsIGVuZCBhbmdsZSBvZiB0aGUgcGllIGNoYXJ0LiBEZWZhdWx0cyB0byAyz4AuIFRoZQorICAgKiBlbmQgYW5nbGUgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgYXMgYSBjb25zdGFudCBvciBhcyBhIGZ1bmN0aW9uOyBpbiB0aGUKKyAgICogY2FzZSBvZiBhIGZ1bmN0aW9uLCBpdCBpcyBldmFsdWF0ZWQgb25jZSBwZXIgYXJyYXkgKGFzIG9wcG9zZWQgdG8gcGVyCisgICAqIGVsZW1lbnQpLgorICAgKi8KKyAgcGllLmVuZEFuZ2xlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGVuZEFuZ2xlOworICAgIGVuZEFuZ2xlID0geDsKKyAgICByZXR1cm4gcGllOworICB9OworCisgIHJldHVybiBwaWU7Cit9OworCit2YXIgZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlID0ge307CisvLyBkYXRhIGlzIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiB4LHk7IHdlIHBvcHVsYXRlIHkwCitkMy5sYXlvdXQuc3RhY2sgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHZhbHVlcyA9IE9iamVjdCwKKyAgICAgIG9yZGVyID0gZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0LAorICAgICAgb2Zmc2V0ID0gZDNfbGF5b3V0X3N0YWNrT2Zmc2V0WmVybywKKyAgICAgIG91dCA9IGQzX2xheW91dF9zdGFja091dCwKKyAgICAgIHggPSBkM19sYXlvdXRfc3RhY2tYLAorICAgICAgeSA9IGQzX2xheW91dF9zdGFja1k7CisKKyAgZnVuY3Rpb24gc3RhY2soZGF0YSwgaW5kZXgpIHsKKworICAgIC8vIENvbnZlcnQgc2VyaWVzIHRvIGNhbm9uaWNhbCB0d28tZGltZW5zaW9uYWwgcmVwcmVzZW50YXRpb24uCisgICAgdmFyIHNlcmllcyA9IGRhdGEubWFwKGZ1bmN0aW9uKGQsIGkpIHsKKyAgICAgIHJldHVybiB2YWx1ZXMuY2FsbChzdGFjaywgZCwgaSk7CisgICAgfSk7CisKKyAgICAvLyBDb252ZXJ0IGVhY2ggc2VyaWVzIHRvIGNhbm9uaWNhbCBbW3gseV1dIHJlcHJlc2VudGF0aW9uLgorICAgIHZhciBwb2ludHMgPSBzZXJpZXMubWFwKGZ1bmN0aW9uKGQsIGkpIHsKKyAgICAgIHJldHVybiBkLm1hcChmdW5jdGlvbih2LCBpKSB7CisgICAgICAgIHJldHVybiBbeC5jYWxsKHN0YWNrLCB2LCBpKSwgeS5jYWxsKHN0YWNrLCB2LCBpKV07CisgICAgICB9KTsKKyAgICB9KTsKKworICAgIC8vIENvbXB1dGUgdGhlIG9yZGVyIG9mIHNlcmllcywgYW5kIHBlcm11dGUgdGhlbS4KKyAgICB2YXIgb3JkZXJzID0gb3JkZXIuY2FsbChzdGFjaywgcG9pbnRzLCBpbmRleCk7CisgICAgc2VyaWVzID0gZDMucGVybXV0ZShzZXJpZXMsIG9yZGVycyk7CisgICAgcG9pbnRzID0gZDMucGVybXV0ZShwb2ludHMsIG9yZGVycyk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBiYXNlbGluZeKAPworICAgIHZhciBvZmZzZXRzID0gb2Zmc2V0LmNhbGwoc3RhY2ssIHBvaW50cywgaW5kZXgpOworCisgICAgLy8gQW5kIHByb3BhZ2F0ZSBpdCB0byBvdGhlciBzZXJpZXMuCisgICAgdmFyIG4gPSBzZXJpZXMubGVuZ3RoLAorICAgICAgICBtID0gc2VyaWVzWzBdLmxlbmd0aCwKKyAgICAgICAgaSwKKyAgICAgICAgaiwKKyAgICAgICAgbzsKKyAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CisgICAgICBvdXQuY2FsbChzdGFjaywgc2VyaWVzWzBdW2pdLCBvID0gb2Zmc2V0c1tqXSwgcG9pbnRzWzBdW2pdWzFdKTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgb3V0LmNhbGwoc3RhY2ssIHNlcmllc1tpXVtqXSwgbyArPSBwb2ludHNbaSAtIDFdW2pdWzFdLCBwb2ludHNbaV1bal1bMV0pOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkYXRhOworICB9CisKKyAgc3RhY2sudmFsdWVzID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlczsKKyAgICB2YWx1ZXMgPSB4OworICAgIHJldHVybiBzdGFjazsKKyAgfTsKKworICBzdGFjay5vcmRlciA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmRlcjsKKyAgICBvcmRlciA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGQzX2xheW91dF9zdGFja09yZGVycy5nZXQoeCkgfHwgZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0OworICAgIHJldHVybiBzdGFjazsKKyAgfTsKKworICBzdGFjay5vZmZzZXQgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb2Zmc2V0OworICAgIG9mZnNldCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGQzX2xheW91dF9zdGFja09mZnNldHMuZ2V0KHgpIHx8IGQzX2xheW91dF9zdGFja09mZnNldFplcm87CisgICAgcmV0dXJuIHN0YWNrOworICB9OworCisgIHN0YWNrLnggPSBmdW5jdGlvbih6KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDsKKyAgICB4ID0gejsKKyAgICByZXR1cm4gc3RhY2s7CisgIH07CisKKyAgc3RhY2sueSA9IGZ1bmN0aW9uKHopIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5OworICAgIHkgPSB6OworICAgIHJldHVybiBzdGFjazsKKyAgfTsKKworICBzdGFjay5vdXQgPSBmdW5jdGlvbih6KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3V0OworICAgIG91dCA9IHo7CisgICAgcmV0dXJuIHN0YWNrOworICB9OworCisgIHJldHVybiBzdGFjazsKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrWChkKSB7CisgIHJldHVybiBkLng7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9zdGFja1koZCkgeworICByZXR1cm4gZC55OworfQorCitmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tPdXQoZCwgeTAsIHkpIHsKKyAgZC55MCA9IHkwOworICBkLnkgPSB5OworfQorCit2YXIgZDNfbGF5b3V0X3N0YWNrT3JkZXJzID0gZDMubWFwKHsKKworICAiaW5zaWRlLW91dCI6IGZ1bmN0aW9uKGRhdGEpIHsKKyAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLAorICAgICAgICBpLAorICAgICAgICBqLAorICAgICAgICBtYXggPSBkYXRhLm1hcChkM19sYXlvdXRfc3RhY2tNYXhJbmRleCksCisgICAgICAgIHN1bXMgPSBkYXRhLm1hcChkM19sYXlvdXRfc3RhY2tSZWR1Y2VTdW0pLAorICAgICAgICBpbmRleCA9IGQzLnJhbmdlKG4pLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gbWF4W2FdIC0gbWF4W2JdOyB9KSwKKyAgICAgICAgdG9wID0gMCwKKyAgICAgICAgYm90dG9tID0gMCwKKyAgICAgICAgdG9wcyA9IFtdLAorICAgICAgICBib3R0b21zID0gW107CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgaiA9IGluZGV4W2ldOworICAgICAgaWYgKHRvcCA8IGJvdHRvbSkgeworICAgICAgICB0b3AgKz0gc3Vtc1tqXTsKKyAgICAgICAgdG9wcy5wdXNoKGopOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYm90dG9tICs9IHN1bXNbal07CisgICAgICAgIGJvdHRvbXMucHVzaChqKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJvdHRvbXMucmV2ZXJzZSgpLmNvbmNhdCh0b3BzKTsKKyAgfSwKKworICAicmV2ZXJzZSI6IGZ1bmN0aW9uKGRhdGEpIHsKKyAgICByZXR1cm4gZDMucmFuZ2UoZGF0YS5sZW5ndGgpLnJldmVyc2UoKTsKKyAgfSwKKworICAiZGVmYXVsdCI6IGQzX2xheW91dF9zdGFja09yZGVyRGVmYXVsdAorCit9KTsKKwordmFyIGQzX2xheW91dF9zdGFja09mZnNldHMgPSBkMy5tYXAoeworCisgICJzaWxob3VldHRlIjogZnVuY3Rpb24oZGF0YSkgeworICAgIHZhciBuID0gZGF0YS5sZW5ndGgsCisgICAgICAgIG0gPSBkYXRhWzBdLmxlbmd0aCwKKyAgICAgICAgc3VtcyA9IFtdLAorICAgICAgICBtYXggPSAwLAorICAgICAgICBpLAorICAgICAgICBqLAorICAgICAgICBvLAorICAgICAgICB5MCA9IFtdOworICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKKyAgICAgIGZvciAoaSA9IDAsIG8gPSAwOyBpIDwgbjsgaSsrKSBvICs9IGRhdGFbaV1bal1bMV07CisgICAgICBpZiAobyA+IG1heCkgbWF4ID0gbzsKKyAgICAgIHN1bXMucHVzaChvKTsKKyAgICB9CisgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgeworICAgICAgeTBbal0gPSAobWF4IC0gc3Vtc1tqXSkgLyAyOworICAgIH0KKyAgICByZXR1cm4geTA7CisgIH0sCisKKyAgIndpZ2dsZSI6IGZ1bmN0aW9uKGRhdGEpIHsKKyAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLAorICAgICAgICB4ID0gZGF0YVswXSwKKyAgICAgICAgbSA9IHgubGVuZ3RoLAorICAgICAgICBtYXggPSAwLAorICAgICAgICBpLAorICAgICAgICBqLAorICAgICAgICBrLAorICAgICAgICBzMSwKKyAgICAgICAgczIsCisgICAgICAgIHMzLAorICAgICAgICBkeCwKKyAgICAgICAgbywKKyAgICAgICAgbzAsCisgICAgICAgIHkwID0gW107CisgICAgeTBbMF0gPSBvID0gbzAgPSAwOworICAgIGZvciAoaiA9IDE7IGogPCBtOyArK2opIHsKKyAgICAgIGZvciAoaSA9IDAsIHMxID0gMDsgaSA8IG47ICsraSkgczEgKz0gZGF0YVtpXVtqXVsxXTsKKyAgICAgIGZvciAoaSA9IDAsIHMyID0gMCwgZHggPSB4W2pdWzBdIC0geFtqIC0gMV1bMF07IGkgPCBuOyArK2kpIHsKKyAgICAgICAgZm9yIChrID0gMCwgczMgPSAoZGF0YVtpXVtqXVsxXSAtIGRhdGFbaV1baiAtIDFdWzFdKSAvICgyICogZHgpOyBrIDwgaTsgKytrKSB7CisgICAgICAgICAgczMgKz0gKGRhdGFba11bal1bMV0gLSBkYXRhW2tdW2ogLSAxXVsxXSkgLyBkeDsKKyAgICAgICAgfQorICAgICAgICBzMiArPSBzMyAqIGRhdGFbaV1bal1bMV07CisgICAgICB9CisgICAgICB5MFtqXSA9IG8gLT0gczEgPyBzMiAvIHMxICogZHggOiAwOworICAgICAgaWYgKG8gPCBvMCkgbzAgPSBvOworICAgIH0KKyAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB5MFtqXSAtPSBvMDsKKyAgICByZXR1cm4geTA7CisgIH0sCisKKyAgImV4cGFuZCI6IGZ1bmN0aW9uKGRhdGEpIHsKKyAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLAorICAgICAgICBtID0gZGF0YVswXS5sZW5ndGgsCisgICAgICAgIGsgPSAxIC8gbiwKKyAgICAgICAgaSwKKyAgICAgICAgaiwKKyAgICAgICAgbywKKyAgICAgICAgeTAgPSBbXTsKKyAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CisgICAgICBmb3IgKGkgPSAwLCBvID0gMDsgaSA8IG47IGkrKykgbyArPSBkYXRhW2ldW2pdWzFdOworICAgICAgaWYgKG8pIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIGRhdGFbaV1bal1bMV0gLz0gbzsKKyAgICAgIGVsc2UgZm9yIChpID0gMDsgaSA8IG47IGkrKykgZGF0YVtpXVtqXVsxXSA9IGs7CisgICAgfQorICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHkwW2pdID0gMDsKKyAgICByZXR1cm4geTA7CisgIH0sCisKKyAgInplcm8iOiBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvCisKK30pOworCitmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tPcmRlckRlZmF1bHQoZGF0YSkgeworICByZXR1cm4gZDMucmFuZ2UoZGF0YS5sZW5ndGgpOworfQorCitmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvKGRhdGEpIHsKKyAgdmFyIGogPSAtMSwKKyAgICAgIG0gPSBkYXRhWzBdLmxlbmd0aCwKKyAgICAgIHkwID0gW107CisgIHdoaWxlICgrK2ogPCBtKSB5MFtqXSA9IDA7CisgIHJldHVybiB5MDsKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrTWF4SW5kZXgoYXJyYXkpIHsKKyAgdmFyIGkgPSAxLAorICAgICAgaiA9IDAsCisgICAgICB2ID0gYXJyYXlbMF1bMV0sCisgICAgICBrLAorICAgICAgbiA9IGFycmF5Lmxlbmd0aDsKKyAgZm9yICg7IGkgPCBuOyArK2kpIHsKKyAgICBpZiAoKGsgPSBhcnJheVtpXVsxXSkgPiB2KSB7CisgICAgICBqID0gaTsKKyAgICAgIHYgPSBrOworICAgIH0KKyAgfQorICByZXR1cm4gajsKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrUmVkdWNlU3VtKGQpIHsKKyAgcmV0dXJuIGQucmVkdWNlKGQzX2xheW91dF9zdGFja1N1bSwgMCk7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9zdGFja1N1bShwLCBkKSB7CisgIHJldHVybiBwICsgZFsxXTsKK30KK2QzLmxheW91dC5oaXN0b2dyYW0gPSBmdW5jdGlvbigpIHsKKyAgdmFyIGZyZXF1ZW5jeSA9IHRydWUsCisgICAgICB2YWx1ZXIgPSBOdW1iZXIsCisgICAgICByYW5nZXIgPSBkM19sYXlvdXRfaGlzdG9ncmFtUmFuZ2UsCisgICAgICBiaW5uZXIgPSBkM19sYXlvdXRfaGlzdG9ncmFtQmluU3R1cmdlczsKKworICBmdW5jdGlvbiBoaXN0b2dyYW0oZGF0YSwgaSkgeworICAgIHZhciBiaW5zID0gW10sCisgICAgICAgIHZhbHVlcyA9IGRhdGEubWFwKHZhbHVlciwgdGhpcyksCisgICAgICAgIHJhbmdlID0gcmFuZ2VyLmNhbGwodGhpcywgdmFsdWVzLCBpKSwKKyAgICAgICAgdGhyZXNob2xkcyA9IGJpbm5lci5jYWxsKHRoaXMsIHJhbmdlLCB2YWx1ZXMsIGkpLAorICAgICAgICBiaW4sCisgICAgICAgIGkgPSAtMSwKKyAgICAgICAgbiA9IHZhbHVlcy5sZW5ndGgsCisgICAgICAgIG0gPSB0aHJlc2hvbGRzLmxlbmd0aCAtIDEsCisgICAgICAgIGsgPSBmcmVxdWVuY3kgPyAxIDogMSAvIG4sCisgICAgICAgIHg7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBiaW5zLgorICAgIHdoaWxlICgrK2kgPCBtKSB7CisgICAgICBiaW4gPSBiaW5zW2ldID0gW107CisgICAgICBiaW4uZHggPSB0aHJlc2hvbGRzW2kgKyAxXSAtIChiaW4ueCA9IHRocmVzaG9sZHNbaV0pOworICAgICAgYmluLnkgPSAwOworICAgIH0KKworICAgIC8vIEZpbGwgdGhlIGJpbnMsIGlnbm9yaW5nIHZhbHVlcyBvdXRzaWRlIHRoZSByYW5nZS4KKyAgICBpID0gLTE7IHdoaWxlKCsraSA8IG4pIHsKKyAgICAgIHggPSB2YWx1ZXNbaV07CisgICAgICBpZiAoKHggPj0gcmFuZ2VbMF0pICYmICh4IDw9IHJhbmdlWzFdKSkgeworICAgICAgICBiaW4gPSBiaW5zW2QzLmJpc2VjdCh0aHJlc2hvbGRzLCB4LCAxLCBtKSAtIDFdOworICAgICAgICBiaW4ueSArPSBrOworICAgICAgICBiaW4ucHVzaChkYXRhW2ldKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmluczsKKyAgfQorCisgIC8vIFNwZWNpZmllcyBob3cgdG8gZXh0cmFjdCBhIHZhbHVlIGZyb20gdGhlIGFzc29jaWF0ZWQgZGF0YS4gVGhlIGRlZmF1bHQKKyAgLy8gdmFsdWUgZnVuY3Rpb24gaXMgYE51bWJlcmAsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGlkZW50aXR5IGZ1bmN0aW9uLgorICBoaXN0b2dyYW0udmFsdWUgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWVyOworICAgIHZhbHVlciA9IHg7CisgICAgcmV0dXJuIGhpc3RvZ3JhbTsKKyAgfTsKKworICAvLyBTcGVjaWZpZXMgdGhlIHJhbmdlIG9mIHRoZSBoaXN0b2dyYW0uIFZhbHVlcyBvdXRzaWRlIHRoZSBzcGVjaWZpZWQgcmFuZ2UKKyAgLy8gd2lsbCBiZSBpZ25vcmVkLiBUaGUgYXJndW1lbnQgYHhgIG1heSBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgdHdvLWVsZW1lbnQKKyAgLy8gYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlIG9mIHRoZSByYW5nZSwgb3IgYXMgYQorICAvLyBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHJhbmdlIGdpdmVuIHRoZSBhcnJheSBvZiB2YWx1ZXMgYW5kIHRoZSBjdXJyZW50CisgIC8vIGluZGV4IGBpYC4gVGhlIGRlZmF1bHQgcmFuZ2UgaXMgdGhlIGV4dGVudCAobWluaW11bSBhbmQgbWF4aW11bSkgb2YgdGhlCisgIC8vIHZhbHVlcy4KKyAgaGlzdG9ncmFtLnJhbmdlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlcjsKKyAgICByYW5nZXIgPSBkMy5mdW5jdG9yKHgpOworICAgIHJldHVybiBoaXN0b2dyYW07CisgIH07CisKKyAgLy8gU3BlY2lmaWVzIGhvdyB0byBiaW4gdmFsdWVzIGluIHRoZSBoaXN0b2dyYW0uIFRoZSBhcmd1bWVudCBgeGAgbWF5IGJlCisgIC8vIHNwZWNpZmllZCBhcyBhIG51bWJlciwgaW4gd2hpY2ggY2FzZSB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHdpbGwgYmUgc3BsaXQKKyAgLy8gdW5pZm9ybWx5IGludG8gdGhlIGdpdmVuIG51bWJlciBvZiBiaW5zLiBPciwgYHhgIG1heSBiZSBhbiBhcnJheSBvZgorICAvLyB0aHJlc2hvbGQgdmFsdWVzLCBkZWZpbmluZyB0aGUgYmluczsgdGhlIHNwZWNpZmllZCBhcnJheSBtdXN0IGNvbnRhaW4gdGhlCisgIC8vIHJpZ2h0bW9zdCAodXBwZXIpIHZhbHVlLCB0aHVzIHNwZWNpZnlpbmcgbiArIDEgdmFsdWVzIGZvciBuIGJpbnMuIE9yLCBgeGAKKyAgLy8gbWF5IGJlIGEgZnVuY3Rpb24gd2hpY2ggaXMgZXZhbHVhdGVkLCBiZWluZyBwYXNzZWQgdGhlIHJhbmdlLCB0aGUgYXJyYXkgb2YKKyAgLy8gdmFsdWVzLCBhbmQgdGhlIGN1cnJlbnQgaW5kZXggYGlgLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhyZXNob2xkcy4gVGhlCisgIC8vIGRlZmF1bHQgYmluIGZ1bmN0aW9uIHdpbGwgZGl2aWRlIHRoZSB2YWx1ZXMgaW50byB1bmlmb3JtIGJpbnMgdXNpbmcKKyAgLy8gU3R1cmdlcycgZm9ybXVsYS4KKyAgaGlzdG9ncmFtLmJpbnMgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gYmlubmVyOworICAgIGJpbm5lciA9IHR5cGVvZiB4ID09PSAibnVtYmVyIgorICAgICAgICA/IGZ1bmN0aW9uKHJhbmdlKSB7IHJldHVybiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIHgpOyB9CisgICAgICAgIDogZDMuZnVuY3Rvcih4KTsKKyAgICByZXR1cm4gaGlzdG9ncmFtOworICB9OworCisgIC8vIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBoaXN0b2dyYW0ncyBgeWAgdmFsdWUgaXMgYSBjb3VudCAoZnJlcXVlbmN5KSBvciBhCisgIC8vIHByb2JhYmlsaXR5IChkZW5zaXR5KS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KKyAgaGlzdG9ncmFtLmZyZXF1ZW5jeSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmcmVxdWVuY3k7CisgICAgZnJlcXVlbmN5ID0gISF4OworICAgIHJldHVybiBoaXN0b2dyYW07CisgIH07CisKKyAgcmV0dXJuIGhpc3RvZ3JhbTsKK307CisKK2Z1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1CaW5TdHVyZ2VzKHJhbmdlLCB2YWx1ZXMpIHsKKyAgcmV0dXJuIGQzX2xheW91dF9oaXN0b2dyYW1CaW5GaXhlZChyYW5nZSwgTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlcy5sZW5ndGgpIC8gTWF0aC5MTjIgKyAxKSk7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1CaW5GaXhlZChyYW5nZSwgbikgeworICB2YXIgeCA9IC0xLAorICAgICAgYiA9ICtyYW5nZVswXSwKKyAgICAgIG0gPSAocmFuZ2VbMV0gLSBiKSAvIG4sCisgICAgICBmID0gW107CisgIHdoaWxlICgrK3ggPD0gbikgZlt4XSA9IG0gKiB4ICsgYjsKKyAgcmV0dXJuIGY7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1SYW5nZSh2YWx1ZXMpIHsKKyAgcmV0dXJuIFtkMy5taW4odmFsdWVzKSwgZDMubWF4KHZhbHVlcyldOworfQorZDMubGF5b3V0LmhpZXJhcmNoeSA9IGZ1bmN0aW9uKCkgeworICB2YXIgc29ydCA9IGQzX2xheW91dF9oaWVyYXJjaHlTb3J0LAorICAgICAgY2hpbGRyZW4gPSBkM19sYXlvdXRfaGllcmFyY2h5Q2hpbGRyZW4sCisgICAgICB2YWx1ZSA9IGQzX2xheW91dF9oaWVyYXJjaHlWYWx1ZTsKKworICAvLyBSZWN1cnNpdmVseSBjb21wdXRlIHRoZSBub2RlIGRlcHRoIGFuZCB2YWx1ZS4KKyAgLy8gQWxzbyBjb252ZXJ0cyB0aGUgZGF0YSByZXByZXNlbnRhdGlvbiBpbnRvIGEgc3RhbmRhcmQgaGllcmFyY2h5IHN0cnVjdHVyZS4KKyAgZnVuY3Rpb24gcmVjdXJzZShkYXRhLCBkZXB0aCwgbm9kZXMpIHsKKyAgICB2YXIgY2hpbGRzID0gY2hpbGRyZW4uY2FsbChoaWVyYXJjaHksIGRhdGEsIGRlcHRoKSwKKyAgICAgICAgbm9kZSA9IGQzX2xheW91dF9oaWVyYXJjaHlJbmxpbmUgPyBkYXRhIDoge2RhdGE6IGRhdGF9OworICAgIG5vZGUuZGVwdGggPSBkZXB0aDsKKyAgICBub2Rlcy5wdXNoKG5vZGUpOworICAgIGlmIChjaGlsZHMgJiYgKG4gPSBjaGlsZHMubGVuZ3RoKSkgeworICAgICAgdmFyIGkgPSAtMSwKKyAgICAgICAgICBuLAorICAgICAgICAgIGMgPSBub2RlLmNoaWxkcmVuID0gW10sCisgICAgICAgICAgdiA9IDAsCisgICAgICAgICAgaiA9IGRlcHRoICsgMTsKKyAgICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICAgIGQgPSByZWN1cnNlKGNoaWxkc1tpXSwgaiwgbm9kZXMpOworICAgICAgICBkLnBhcmVudCA9IG5vZGU7CisgICAgICAgIGMucHVzaChkKTsKKyAgICAgICAgdiArPSBkLnZhbHVlOworICAgICAgfQorICAgICAgaWYgKHNvcnQpIGMuc29ydChzb3J0KTsKKyAgICAgIGlmICh2YWx1ZSkgbm9kZS52YWx1ZSA9IHY7CisgICAgfSBlbHNlIGlmICh2YWx1ZSkgeworICAgICAgbm9kZS52YWx1ZSA9ICt2YWx1ZS5jYWxsKGhpZXJhcmNoeSwgZGF0YSwgZGVwdGgpIHx8IDA7CisgICAgfQorICAgIHJldHVybiBub2RlOworICB9CisKKyAgLy8gUmVjdXJzaXZlbHkgcmUtZXZhbHVhdGVzIHRoZSBub2RlIHZhbHVlLgorICBmdW5jdGlvbiByZXZhbHVlKG5vZGUsIGRlcHRoKSB7CisgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwKKyAgICAgICAgdiA9IDA7CisgICAgaWYgKGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkgeworICAgICAgdmFyIGkgPSAtMSwKKyAgICAgICAgICBuLAorICAgICAgICAgIGogPSBkZXB0aCArIDE7CisgICAgICB3aGlsZSAoKytpIDwgbikgdiArPSByZXZhbHVlKGNoaWxkcmVuW2ldLCBqKTsKKyAgICB9IGVsc2UgaWYgKHZhbHVlKSB7CisgICAgICB2ID0gK3ZhbHVlLmNhbGwoaGllcmFyY2h5LCBkM19sYXlvdXRfaGllcmFyY2h5SW5saW5lID8gbm9kZSA6IG5vZGUuZGF0YSwgZGVwdGgpIHx8IDA7CisgICAgfQorICAgIGlmICh2YWx1ZSkgbm9kZS52YWx1ZSA9IHY7CisgICAgcmV0dXJuIHY7CisgIH0KKworICBmdW5jdGlvbiBoaWVyYXJjaHkoZCkgeworICAgIHZhciBub2RlcyA9IFtdOworICAgIHJlY3Vyc2UoZCwgMCwgbm9kZXMpOworICAgIHJldHVybiBub2RlczsKKyAgfQorCisgIGhpZXJhcmNoeS5zb3J0ID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnQ7CisgICAgc29ydCA9IHg7CisgICAgcmV0dXJuIGhpZXJhcmNoeTsKKyAgfTsKKworICBoaWVyYXJjaHkuY2hpbGRyZW4gPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2hpbGRyZW47CisgICAgY2hpbGRyZW4gPSB4OworICAgIHJldHVybiBoaWVyYXJjaHk7CisgIH07CisKKyAgaGllcmFyY2h5LnZhbHVlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlOworICAgIHZhbHVlID0geDsKKyAgICByZXR1cm4gaGllcmFyY2h5OworICB9OworCisgIC8vIFJlLWV2YWx1YXRlcyB0aGUgYHZhbHVlYCBwcm9wZXJ0eSBmb3IgdGhlIHNwZWNpZmllZCBoaWVyYXJjaHkuCisgIGhpZXJhcmNoeS5yZXZhbHVlID0gZnVuY3Rpb24ocm9vdCkgeworICAgIHJldmFsdWUocm9vdCwgMCk7CisgICAgcmV0dXJuIHJvb3Q7CisgIH07CisKKyAgcmV0dXJuIGhpZXJhcmNoeTsKK307CisKKy8vIEEgbWV0aG9kIGFzc2lnbm1lbnQgaGVscGVyIGZvciBoaWVyYXJjaHkgc3ViY2xhc3Nlcy4KK2Z1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQob2JqZWN0LCBoaWVyYXJjaHkpIHsKKyAgZDMucmViaW5kKG9iamVjdCwgaGllcmFyY2h5LCAic29ydCIsICJjaGlsZHJlbiIsICJ2YWx1ZSIpOworCisgIC8vIEFkZCBhbiBhbGlhcyBmb3IgbGlua3MsIGZvciBjb252ZW5pZW5jZS4KKyAgb2JqZWN0LmxpbmtzID0gZDNfbGF5b3V0X2hpZXJhcmNoeUxpbmtzOworCisgIC8vIElmIHRoZSBuZXcgQVBJIGlzIHVzZWQsIGVuYWJsaW5nIGlubGluaW5nLgorICBvYmplY3Qubm9kZXMgPSBmdW5jdGlvbihkKSB7CisgICAgZDNfbGF5b3V0X2hpZXJhcmNoeUlubGluZSA9IHRydWU7CisgICAgcmV0dXJuIChvYmplY3Qubm9kZXMgPSBvYmplY3QpKGQpOworICB9OworCisgIHJldHVybiBvYmplY3Q7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlDaGlsZHJlbihkKSB7CisgIHJldHVybiBkLmNoaWxkcmVuOworfQorCitmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5VmFsdWUoZCkgeworICByZXR1cm4gZC52YWx1ZTsKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeVNvcnQoYSwgYikgeworICByZXR1cm4gYi52YWx1ZSAtIGEudmFsdWU7Cit9CisKKy8vIFJldHVybnMgYW4gYXJyYXkgc291cmNlK3RhcmdldCBvYmplY3RzIGZvciB0aGUgc3BlY2lmaWVkIG5vZGVzLgorZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeUxpbmtzKG5vZGVzKSB7CisgIHJldHVybiBkMy5tZXJnZShub2Rlcy5tYXAoZnVuY3Rpb24ocGFyZW50KSB7CisgICAgcmV0dXJuIChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLm1hcChmdW5jdGlvbihjaGlsZCkgeworICAgICAgcmV0dXJuIHtzb3VyY2U6IHBhcmVudCwgdGFyZ2V0OiBjaGlsZH07CisgICAgfSk7CisgIH0pKTsKK30KKworLy8gRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LCBkb24ndCBlbmFibGUgaW5saW5pbmcgYnkgZGVmYXVsdC4KK3ZhciBkM19sYXlvdXRfaGllcmFyY2h5SW5saW5lID0gZmFsc2U7CitkMy5sYXlvdXQucGFjayA9IGZ1bmN0aW9uKCkgeworICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQoZDNfbGF5b3V0X3BhY2tTb3J0KSwKKyAgICAgIHNpemUgPSBbMSwgMV07CisKKyAgZnVuY3Rpb24gcGFjayhkLCBpKSB7CisgICAgdmFyIG5vZGVzID0gaGllcmFyY2h5LmNhbGwodGhpcywgZCwgaSksCisgICAgICAgIHJvb3QgPSBub2Rlc1swXTsKKworICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXB1dGUgdGhlIGxheW91dC4KKyAgICByb290LnggPSAwOworICAgIHJvb3QueSA9IDA7CisgICAgZDNfbGF5b3V0X3BhY2tUcmVlKHJvb3QpOworCisgICAgLy8gU2NhbGUgdGhlIGxheW91dCB0byBmaXQgdGhlIHJlcXVlc3RlZCBzaXplLgorICAgIHZhciB3ID0gc2l6ZVswXSwKKyAgICAgICAgaCA9IHNpemVbMV0sCisgICAgICAgIGsgPSAxIC8gTWF0aC5tYXgoMiAqIHJvb3QuciAvIHcsIDIgKiByb290LnIgLyBoKTsKKyAgICBkM19sYXlvdXRfcGFja1RyYW5zZm9ybShyb290LCB3IC8gMiwgaCAvIDIsIGspOworCisgICAgcmV0dXJuIG5vZGVzOworICB9CisKKyAgcGFjay5zaXplID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7CisgICAgc2l6ZSA9IHg7CisgICAgcmV0dXJuIHBhY2s7CisgIH07CisKKyAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQocGFjaywgaGllcmFyY2h5KTsKK307CisKK2Z1bmN0aW9uIGQzX2xheW91dF9wYWNrU29ydChhLCBiKSB7CisgIHJldHVybiBhLnZhbHVlIC0gYi52YWx1ZTsKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tJbnNlcnQoYSwgYikgeworICB2YXIgYyA9IGEuX3BhY2tfbmV4dDsKKyAgYS5fcGFja19uZXh0ID0gYjsKKyAgYi5fcGFja19wcmV2ID0gYTsKKyAgYi5fcGFja19uZXh0ID0gYzsKKyAgYy5fcGFja19wcmV2ID0gYjsKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tTcGxpY2UoYSwgYikgeworICBhLl9wYWNrX25leHQgPSBiOworICBiLl9wYWNrX3ByZXYgPSBhOworfQorCitmdW5jdGlvbiBkM19sYXlvdXRfcGFja0ludGVyc2VjdHMoYSwgYikgeworICB2YXIgZHggPSBiLnggLSBhLngsCisgICAgICBkeSA9IGIueSAtIGEueSwKKyAgICAgIGRyID0gYS5yICsgYi5yOworICByZXR1cm4gZHIgKiBkciAtIGR4ICogZHggLSBkeSAqIGR5ID4gLjAwMTsgLy8gd2l0aGluIGVwc2lsb24KK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tDaXJjbGUobm9kZXMpIHsKKyAgdmFyIHhNaW4gPSBJbmZpbml0eSwKKyAgICAgIHhNYXggPSAtSW5maW5pdHksCisgICAgICB5TWluID0gSW5maW5pdHksCisgICAgICB5TWF4ID0gLUluZmluaXR5LAorICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKKyAgICAgIGEsIGIsIGMsIGosIGs7CisKKyAgZnVuY3Rpb24gYm91bmQobm9kZSkgeworICAgIHhNaW4gPSBNYXRoLm1pbihub2RlLnggLSBub2RlLnIsIHhNaW4pOworICAgIHhNYXggPSBNYXRoLm1heChub2RlLnggKyBub2RlLnIsIHhNYXgpOworICAgIHlNaW4gPSBNYXRoLm1pbihub2RlLnkgLSBub2RlLnIsIHlNaW4pOworICAgIHlNYXggPSBNYXRoLm1heChub2RlLnkgKyBub2RlLnIsIHlNYXgpOworICB9CisKKyAgLy8gQ3JlYXRlIG5vZGUgbGlua3MuCisgIG5vZGVzLmZvckVhY2goZDNfbGF5b3V0X3BhY2tMaW5rKTsKKworICAvLyBDcmVhdGUgZmlyc3Qgbm9kZS4KKyAgYSA9IG5vZGVzWzBdOworICBhLnggPSAtYS5yOworICBhLnkgPSAwOworICBib3VuZChhKTsKKworICAvLyBDcmVhdGUgc2Vjb25kIG5vZGUuCisgIGlmIChuID4gMSkgeworICAgIGIgPSBub2Rlc1sxXTsKKyAgICBiLnggPSBiLnI7CisgICAgYi55ID0gMDsKKyAgICBib3VuZChiKTsKKworICAgIC8vIENyZWF0ZSB0aGlyZCBub2RlIGFuZCBidWlsZCBjaGFpbi4KKyAgICBpZiAobiA+IDIpIHsKKyAgICAgIGMgPSBub2Rlc1syXTsKKyAgICAgIGQzX2xheW91dF9wYWNrUGxhY2UoYSwgYiwgYyk7CisgICAgICBib3VuZChjKTsKKyAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGEsIGMpOworICAgICAgYS5fcGFja19wcmV2ID0gYzsKKyAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGMsIGIpOworICAgICAgYiA9IGEuX3BhY2tfbmV4dDsKKworICAgICAgLy8gTm93IGl0ZXJhdGUgdGhyb3VnaCB0aGUgcmVzdC4KKyAgICAgIGZvciAodmFyIGkgPSAzOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGQzX2xheW91dF9wYWNrUGxhY2UoYSwgYiwgYyA9IG5vZGVzW2ldKTsKKworICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBjbG9zZXN0IGludGVyc2VjdGlvbi4KKyAgICAgICAgdmFyIGlzZWN0ID0gMCwgczEgPSAxLCBzMiA9IDE7CisgICAgICAgIGZvciAoaiA9IGIuX3BhY2tfbmV4dDsgaiAhPT0gYjsgaiA9IGouX3BhY2tfbmV4dCwgczErKykgeworICAgICAgICAgIGlmIChkM19sYXlvdXRfcGFja0ludGVyc2VjdHMoaiwgYykpIHsKKyAgICAgICAgICAgIGlzZWN0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXNlY3QgPT0gMSkgeworICAgICAgICAgIGZvciAoayA9IGEuX3BhY2tfcHJldjsgayAhPT0gai5fcGFja19wcmV2OyBrID0gay5fcGFja19wcmV2LCBzMisrKSB7CisgICAgICAgICAgICBpZiAoZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGssIGMpKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSBub2RlIGNoYWluLgorICAgICAgICBpZiAoaXNlY3QpIHsKKyAgICAgICAgICBpZiAoczEgPCBzMiB8fCAoczEgPT0gczIgJiYgYi5yIDwgYS5yKSkgZDNfbGF5b3V0X3BhY2tTcGxpY2UoYSwgYiA9IGopOworICAgICAgICAgIGVsc2UgZDNfbGF5b3V0X3BhY2tTcGxpY2UoYSA9IGssIGIpOworICAgICAgICAgIGktLTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkM19sYXlvdXRfcGFja0luc2VydChhLCBjKTsKKyAgICAgICAgICBiID0gYzsKKyAgICAgICAgICBib3VuZChjKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFJlLWNlbnRlciB0aGUgY2lyY2xlcyBhbmQgcmV0dXJuIHRoZSBlbmNvbXBhc3NpbmcgcmFkaXVzLgorICB2YXIgY3ggPSAoeE1pbiArIHhNYXgpIC8gMiwKKyAgICAgIGN5ID0gKHlNaW4gKyB5TWF4KSAvIDIsCisgICAgICBjciA9IDA7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTsKKyAgICBub2RlLnggLT0gY3g7CisgICAgbm9kZS55IC09IGN5OworICAgIGNyID0gTWF0aC5tYXgoY3IsIG5vZGUuciArIE1hdGguc3FydChub2RlLnggKiBub2RlLnggKyBub2RlLnkgKiBub2RlLnkpKTsKKyAgfQorCisgIC8vIFJlbW92ZSBub2RlIGxpbmtzLgorICBub2Rlcy5mb3JFYWNoKGQzX2xheW91dF9wYWNrVW5saW5rKTsKKworICByZXR1cm4gY3I7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9wYWNrTGluayhub2RlKSB7CisgIG5vZGUuX3BhY2tfbmV4dCA9IG5vZGUuX3BhY2tfcHJldiA9IG5vZGU7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9wYWNrVW5saW5rKG5vZGUpIHsKKyAgZGVsZXRlIG5vZGUuX3BhY2tfbmV4dDsKKyAgZGVsZXRlIG5vZGUuX3BhY2tfcHJldjsKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tUcmVlKG5vZGUpIHsKKyAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKKyAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgeworICAgIGNoaWxkcmVuLmZvckVhY2goZDNfbGF5b3V0X3BhY2tUcmVlKTsKKyAgICBub2RlLnIgPSBkM19sYXlvdXRfcGFja0NpcmNsZShjaGlsZHJlbik7CisgIH0gZWxzZSB7CisgICAgbm9kZS5yID0gTWF0aC5zcXJ0KG5vZGUudmFsdWUpOworICB9Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9wYWNrVHJhbnNmb3JtKG5vZGUsIHgsIHksIGspIHsKKyAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKKyAgbm9kZS54ID0gKHggKz0gayAqIG5vZGUueCk7CisgIG5vZGUueSA9ICh5ICs9IGsgKiBub2RlLnkpOworICBub2RlLnIgKj0gazsKKyAgaWYgKGNoaWxkcmVuKSB7CisgICAgdmFyIGkgPSAtMSwgbiA9IGNoaWxkcmVuLmxlbmd0aDsKKyAgICB3aGlsZSAoKytpIDwgbikgZDNfbGF5b3V0X3BhY2tUcmFuc2Zvcm0oY2hpbGRyZW5baV0sIHgsIHksIGspOworICB9Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9wYWNrUGxhY2UoYSwgYiwgYykgeworICB2YXIgZGIgPSBhLnIgKyBjLnIsCisgICAgICBkeCA9IGIueCAtIGEueCwKKyAgICAgIGR5ID0gYi55IC0gYS55OworICBpZiAoZGIgJiYgKGR4IHx8IGR5KSkgeworICAgIHZhciBkYSA9IGIuciArIGMuciwKKyAgICAgICAgZGMgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpLAorICAgICAgICBjb3MgPSBNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgKGRiICogZGIgKyBkYyAqIGRjIC0gZGEgKiBkYSkgLyAoMiAqIGRiICogZGMpKSksCisgICAgICAgIHRoZXRhID0gTWF0aC5hY29zKGNvcyksCisgICAgICAgIHggPSBjb3MgKiAoZGIgLz0gZGMpLAorICAgICAgICB5ID0gTWF0aC5zaW4odGhldGEpICogZGI7CisgICAgYy54ID0gYS54ICsgeCAqIGR4ICsgeSAqIGR5OworICAgIGMueSA9IGEueSArIHggKiBkeSAtIHkgKiBkeDsKKyAgfSBlbHNlIHsKKyAgICBjLnggPSBhLnggKyBkYjsKKyAgICBjLnkgPSBhLnk7CisgIH0KK30KKy8vIEltcGxlbWVudHMgYSBoaWVyYXJjaGljYWwgbGF5b3V0IHVzaW5nIHRoZSBjbHVzdGVyIChvciBkZW5kcm9ncmFtKQorLy8gYWxnb3JpdGhtLgorZDMubGF5b3V0LmNsdXN0ZXIgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLAorICAgICAgc2VwYXJhdGlvbiA9IGQzX2xheW91dF90cmVlU2VwYXJhdGlvbiwKKyAgICAgIHNpemUgPSBbMSwgMV07IC8vIHdpZHRoLCBoZWlnaHQKKworICBmdW5jdGlvbiBjbHVzdGVyKGQsIGkpIHsKKyAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKSwKKyAgICAgICAgcm9vdCA9IG5vZGVzWzBdLAorICAgICAgICBwcmV2aW91c05vZGUsCisgICAgICAgIHggPSAwLAorICAgICAgICBreCwKKyAgICAgICAga3k7CisKKyAgICAvLyBGaXJzdCB3YWxrLCBjb21wdXRpbmcgdGhlIGluaXRpYWwgeCAmIHkgdmFsdWVzLgorICAgIGQzX2xheW91dF90cmVlVmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihub2RlKSB7CisgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOworICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgeworICAgICAgICBub2RlLnggPSBkM19sYXlvdXRfY2x1c3RlclgoY2hpbGRyZW4pOworICAgICAgICBub2RlLnkgPSBkM19sYXlvdXRfY2x1c3RlclkoY2hpbGRyZW4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbm9kZS54ID0gcHJldmlvdXNOb2RlID8geCArPSBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzTm9kZSkgOiAwOworICAgICAgICBub2RlLnkgPSAwOworICAgICAgICBwcmV2aW91c05vZGUgPSBub2RlOworICAgICAgfQorICAgIH0pOworCisgICAgLy8gQ29tcHV0ZSB0aGUgbGVmdC1tb3N0LCByaWdodC1tb3N0LCBhbmQgZGVwdGgtbW9zdCBub2RlcyBmb3IgZXh0ZW50cy4KKyAgICB2YXIgbGVmdCA9IGQzX2xheW91dF9jbHVzdGVyTGVmdChyb290KSwKKyAgICAgICAgcmlnaHQgPSBkM19sYXlvdXRfY2x1c3RlclJpZ2h0KHJvb3QpLAorICAgICAgICB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwKKyAgICAgICAgeDEgPSByaWdodC54ICsgc2VwYXJhdGlvbihyaWdodCwgbGVmdCkgLyAyOworCisgICAgLy8gU2Vjb25kIHdhbGssIG5vcm1hbGl6aW5nIHggJiB5IHRvIHRoZSBkZXNpcmVkIHNpemUuCisgICAgZDNfbGF5b3V0X3RyZWVWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUpIHsKKyAgICAgIG5vZGUueCA9IChub2RlLnggLSB4MCkgLyAoeDEgLSB4MCkgKiBzaXplWzBdOworICAgICAgbm9kZS55ID0gKDEgLSAocm9vdC55ID8gbm9kZS55IC8gcm9vdC55IDogMSkpICogc2l6ZVsxXTsKKyAgICB9KTsKKworICAgIHJldHVybiBub2RlczsKKyAgfQorCisgIGNsdXN0ZXIuc2VwYXJhdGlvbiA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzZXBhcmF0aW9uOworICAgIHNlcGFyYXRpb24gPSB4OworICAgIHJldHVybiBjbHVzdGVyOworICB9OworCisgIGNsdXN0ZXIuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOworICAgIHNpemUgPSB4OworICAgIHJldHVybiBjbHVzdGVyOworICB9OworCisgIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKGNsdXN0ZXIsIGhpZXJhcmNoeSk7Cit9OworCitmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlclkoY2hpbGRyZW4pIHsKKyAgcmV0dXJuIDEgKyBkMy5tYXgoY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7CisgICAgcmV0dXJuIGNoaWxkLnk7CisgIH0pOworfQorCitmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlclgoY2hpbGRyZW4pIHsKKyAgcmV0dXJuIGNoaWxkcmVuLnJlZHVjZShmdW5jdGlvbih4LCBjaGlsZCkgeworICAgIHJldHVybiB4ICsgY2hpbGQueDsKKyAgfSwgMCkgLyBjaGlsZHJlbi5sZW5ndGg7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyTGVmdChub2RlKSB7CisgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CisgIHJldHVybiBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPyBkM19sYXlvdXRfY2x1c3RlckxlZnQoY2hpbGRyZW5bMF0pIDogbm9kZTsKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X2NsdXN0ZXJSaWdodChub2RlKSB7CisgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIG47CisgIHJldHVybiBjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkgPyBkM19sYXlvdXRfY2x1c3RlclJpZ2h0KGNoaWxkcmVuW24gLSAxXSkgOiBub2RlOworfQorLy8gTm9kZS1saW5rIHRyZWUgZGlhZ3JhbSB1c2luZyB0aGUgUmVpbmdvbGQtVGlsZm9yZCAidGlkeSIgYWxnb3JpdGhtCitkMy5sYXlvdXQudHJlZSA9IGZ1bmN0aW9uKCkgeworICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksCisgICAgICBzZXBhcmF0aW9uID0gZDNfbGF5b3V0X3RyZWVTZXBhcmF0aW9uLAorICAgICAgc2l6ZSA9IFsxLCAxXTsgLy8gd2lkdGgsIGhlaWdodAorCisgIGZ1bmN0aW9uIHRyZWUoZCwgaSkgeworICAgIHZhciBub2RlcyA9IGhpZXJhcmNoeS5jYWxsKHRoaXMsIGQsIGkpLAorICAgICAgICByb290ID0gbm9kZXNbMF07CisKKyAgICBmdW5jdGlvbiBmaXJzdFdhbGsobm9kZSwgcHJldmlvdXNTaWJsaW5nKSB7CisgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLAorICAgICAgICAgIGxheW91dCA9IG5vZGUuX3RyZWU7CisgICAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7CisgICAgICAgIHZhciBuLAorICAgICAgICAgICAgZmlyc3RDaGlsZCA9IGNoaWxkcmVuWzBdLAorICAgICAgICAgICAgcHJldmlvdXNDaGlsZCwKKyAgICAgICAgICAgIGFuY2VzdG9yID0gZmlyc3RDaGlsZCwKKyAgICAgICAgICAgIGNoaWxkLAorICAgICAgICAgICAgaSA9IC0xOworICAgICAgICB3aGlsZSAoKytpIDwgbikgeworICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07CisgICAgICAgICAgZmlyc3RXYWxrKGNoaWxkLCBwcmV2aW91c0NoaWxkKTsKKyAgICAgICAgICBhbmNlc3RvciA9IGFwcG9ydGlvbihjaGlsZCwgcHJldmlvdXNDaGlsZCwgYW5jZXN0b3IpOworICAgICAgICAgIHByZXZpb3VzQ2hpbGQgPSBjaGlsZDsKKyAgICAgICAgfQorICAgICAgICBkM19sYXlvdXRfdHJlZVNoaWZ0KG5vZGUpOworICAgICAgICB2YXIgbWlkcG9pbnQgPSAuNSAqIChmaXJzdENoaWxkLl90cmVlLnByZWxpbSArIGNoaWxkLl90cmVlLnByZWxpbSk7CisgICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcpIHsKKyAgICAgICAgICBsYXlvdXQucHJlbGltID0gcHJldmlvdXNTaWJsaW5nLl90cmVlLnByZWxpbSArIHNlcGFyYXRpb24obm9kZSwgcHJldmlvdXNTaWJsaW5nKTsKKyAgICAgICAgICBsYXlvdXQubW9kID0gbGF5b3V0LnByZWxpbSAtIG1pZHBvaW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxheW91dC5wcmVsaW0gPSBtaWRwb2ludDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHByZXZpb3VzU2libGluZykgeworICAgICAgICAgIGxheW91dC5wcmVsaW0gPSBwcmV2aW91c1NpYmxpbmcuX3RyZWUucHJlbGltICsgc2VwYXJhdGlvbihub2RlLCBwcmV2aW91c1NpYmxpbmcpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gc2Vjb25kV2Fsayhub2RlLCB4KSB7CisgICAgICBub2RlLnggPSBub2RlLl90cmVlLnByZWxpbSArIHg7CisgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOworICAgICAgaWYgKGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkgeworICAgICAgICB2YXIgaSA9IC0xLAorICAgICAgICAgICAgbjsKKyAgICAgICAgeCArPSBub2RlLl90cmVlLm1vZDsKKyAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKKyAgICAgICAgICBzZWNvbmRXYWxrKGNoaWxkcmVuW2ldLCB4KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIGFwcG9ydGlvbihub2RlLCBwcmV2aW91c1NpYmxpbmcsIGFuY2VzdG9yKSB7CisgICAgICBpZiAocHJldmlvdXNTaWJsaW5nKSB7CisgICAgICAgIHZhciB2aXAgPSBub2RlLAorICAgICAgICAgICAgdm9wID0gbm9kZSwKKyAgICAgICAgICAgIHZpbSA9IHByZXZpb3VzU2libGluZywKKyAgICAgICAgICAgIHZvbSA9IG5vZGUucGFyZW50LmNoaWxkcmVuWzBdLAorICAgICAgICAgICAgc2lwID0gdmlwLl90cmVlLm1vZCwKKyAgICAgICAgICAgIHNvcCA9IHZvcC5fdHJlZS5tb2QsCisgICAgICAgICAgICBzaW0gPSB2aW0uX3RyZWUubW9kLAorICAgICAgICAgICAgc29tID0gdm9tLl90cmVlLm1vZCwKKyAgICAgICAgICAgIHNoaWZ0OworICAgICAgICB3aGlsZSAodmltID0gZDNfbGF5b3V0X3RyZWVSaWdodCh2aW0pLCB2aXAgPSBkM19sYXlvdXRfdHJlZUxlZnQodmlwKSwgdmltICYmIHZpcCkgeworICAgICAgICAgIHZvbSA9IGQzX2xheW91dF90cmVlTGVmdCh2b20pOworICAgICAgICAgIHZvcCA9IGQzX2xheW91dF90cmVlUmlnaHQodm9wKTsKKyAgICAgICAgICB2b3AuX3RyZWUuYW5jZXN0b3IgPSBub2RlOworICAgICAgICAgIHNoaWZ0ID0gdmltLl90cmVlLnByZWxpbSArIHNpbSAtIHZpcC5fdHJlZS5wcmVsaW0gLSBzaXAgKyBzZXBhcmF0aW9uKHZpbSwgdmlwKTsKKyAgICAgICAgICBpZiAoc2hpZnQgPiAwKSB7CisgICAgICAgICAgICBkM19sYXlvdXRfdHJlZU1vdmUoZDNfbGF5b3V0X3RyZWVBbmNlc3Rvcih2aW0sIG5vZGUsIGFuY2VzdG9yKSwgbm9kZSwgc2hpZnQpOworICAgICAgICAgICAgc2lwICs9IHNoaWZ0OworICAgICAgICAgICAgc29wICs9IHNoaWZ0OworICAgICAgICAgIH0KKyAgICAgICAgICBzaW0gKz0gdmltLl90cmVlLm1vZDsKKyAgICAgICAgICBzaXAgKz0gdmlwLl90cmVlLm1vZDsKKyAgICAgICAgICBzb20gKz0gdm9tLl90cmVlLm1vZDsKKyAgICAgICAgICBzb3AgKz0gdm9wLl90cmVlLm1vZDsKKyAgICAgICAgfQorICAgICAgICBpZiAodmltICYmICFkM19sYXlvdXRfdHJlZVJpZ2h0KHZvcCkpIHsKKyAgICAgICAgICB2b3AuX3RyZWUudGhyZWFkID0gdmltOworICAgICAgICAgIHZvcC5fdHJlZS5tb2QgKz0gc2ltIC0gc29wOworICAgICAgICB9CisgICAgICAgIGlmICh2aXAgJiYgIWQzX2xheW91dF90cmVlTGVmdCh2b20pKSB7CisgICAgICAgICAgdm9tLl90cmVlLnRocmVhZCA9IHZpcDsKKyAgICAgICAgICB2b20uX3RyZWUubW9kICs9IHNpcCAtIHNvbTsKKyAgICAgICAgICBhbmNlc3RvciA9IG5vZGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBhbmNlc3RvcjsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIHRlbXBvcmFyeSBsYXlvdXQgdmFyaWFibGVzLgorICAgIGQzX2xheW91dF90cmVlVmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihub2RlLCBwcmV2aW91c1NpYmxpbmcpIHsKKyAgICAgIG5vZGUuX3RyZWUgPSB7CisgICAgICAgIGFuY2VzdG9yOiBub2RlLAorICAgICAgICBwcmVsaW06IDAsCisgICAgICAgIG1vZDogMCwKKyAgICAgICAgY2hhbmdlOiAwLAorICAgICAgICBzaGlmdDogMCwKKyAgICAgICAgbnVtYmVyOiBwcmV2aW91c1NpYmxpbmcgPyBwcmV2aW91c1NpYmxpbmcuX3RyZWUubnVtYmVyICsgMSA6IDAKKyAgICAgIH07CisgICAgfSk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBsYXlvdXQgdXNpbmcgQnVjaGhlaW0gZXQgYWwuJ3MgYWxnb3JpdGhtLgorICAgIGZpcnN0V2Fsayhyb290KTsKKyAgICBzZWNvbmRXYWxrKHJvb3QsIC1yb290Ll90cmVlLnByZWxpbSk7CisKKyAgICAvLyBDb21wdXRlIHRoZSBsZWZ0LW1vc3QsIHJpZ2h0LW1vc3QsIGFuZCBkZXB0aC1tb3N0IG5vZGVzIGZvciBleHRlbnRzLgorICAgIHZhciBsZWZ0ID0gZDNfbGF5b3V0X3RyZWVTZWFyY2gocm9vdCwgZDNfbGF5b3V0X3RyZWVMZWZ0bW9zdCksCisgICAgICAgIHJpZ2h0ID0gZDNfbGF5b3V0X3RyZWVTZWFyY2gocm9vdCwgZDNfbGF5b3V0X3RyZWVSaWdodG1vc3QpLAorICAgICAgICBkZWVwID0gZDNfbGF5b3V0X3RyZWVTZWFyY2gocm9vdCwgZDNfbGF5b3V0X3RyZWVEZWVwZXN0KSwKKyAgICAgICAgeDAgPSBsZWZ0LnggLSBzZXBhcmF0aW9uKGxlZnQsIHJpZ2h0KSAvIDIsCisgICAgICAgIHgxID0gcmlnaHQueCArIHNlcGFyYXRpb24ocmlnaHQsIGxlZnQpIC8gMiwKKyAgICAgICAgeTEgPSBkZWVwLmRlcHRoIHx8IDE7CisKKyAgICAvLyBDbGVhciB0ZW1wb3JhcnkgbGF5b3V0IHZhcmlhYmxlczsgdHJhbnNmb3JtIHggYW5kIHkuCisgICAgZDNfbGF5b3V0X3RyZWVWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUpIHsKKyAgICAgIG5vZGUueCA9IChub2RlLnggLSB4MCkgLyAoeDEgLSB4MCkgKiBzaXplWzBdOworICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAvIHkxICogc2l6ZVsxXTsKKyAgICAgIGRlbGV0ZSBub2RlLl90cmVlOworICAgIH0pOworCisgICAgcmV0dXJuIG5vZGVzOworICB9CisKKyAgdHJlZS5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNlcGFyYXRpb247CisgICAgc2VwYXJhdGlvbiA9IHg7CisgICAgcmV0dXJuIHRyZWU7CisgIH07CisKKyAgdHJlZS5zaXplID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7CisgICAgc2l6ZSA9IHg7CisgICAgcmV0dXJuIHRyZWU7CisgIH07CisKKyAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQodHJlZSwgaGllcmFyY2h5KTsKK307CisKK2Z1bmN0aW9uIGQzX2xheW91dF90cmVlU2VwYXJhdGlvbihhLCBiKSB7CisgIHJldHVybiBhLnBhcmVudCA9PSBiLnBhcmVudCA/IDEgOiAyOworfQorCisvLyBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVNlcGFyYXRpb25SYWRpYWwoYSwgYikgeworLy8gICByZXR1cm4gKGEucGFyZW50ID09IGIucGFyZW50ID8gMSA6IDIpIC8gYS5kZXB0aDsKKy8vIH0KKworZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVMZWZ0KG5vZGUpIHsKKyAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKKyAgcmV0dXJuIGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA/IGNoaWxkcmVuWzBdIDogbm9kZS5fdHJlZS50aHJlYWQ7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF90cmVlUmlnaHQobm9kZSkgeworICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLAorICAgICAgbjsKKyAgcmV0dXJuIGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSA/IGNoaWxkcmVuW24gLSAxXSA6IG5vZGUuX3RyZWUudGhyZWFkOworfQorCitmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVNlYXJjaChub2RlLCBjb21wYXJlKSB7CisgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CisgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsKKyAgICB2YXIgY2hpbGQsCisgICAgICAgIG4sCisgICAgICAgIGkgPSAtMTsKKyAgICB3aGlsZSAoKytpIDwgbikgeworICAgICAgaWYgKGNvbXBhcmUoY2hpbGQgPSBkM19sYXlvdXRfdHJlZVNlYXJjaChjaGlsZHJlbltpXSwgY29tcGFyZSksIG5vZGUpID4gMCkgeworICAgICAgICBub2RlID0gY2hpbGQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBub2RlOworfQorCitmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVJpZ2h0bW9zdChhLCBiKSB7CisgIHJldHVybiBhLnggLSBiLng7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF90cmVlTGVmdG1vc3QoYSwgYikgeworICByZXR1cm4gYi54IC0gYS54OworfQorCitmdW5jdGlvbiBkM19sYXlvdXRfdHJlZURlZXBlc3QoYSwgYikgeworICByZXR1cm4gYS5kZXB0aCAtIGIuZGVwdGg7Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF90cmVlVmlzaXRBZnRlcihub2RlLCBjYWxsYmFjaykgeworICBmdW5jdGlvbiB2aXNpdChub2RlLCBwcmV2aW91c1NpYmxpbmcpIHsKKyAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOworICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsKKyAgICAgIHZhciBjaGlsZCwKKyAgICAgICAgICBwcmV2aW91c0NoaWxkID0gbnVsbCwKKyAgICAgICAgICBpID0gLTEsCisgICAgICAgICAgbjsKKyAgICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07CisgICAgICAgIHZpc2l0KGNoaWxkLCBwcmV2aW91c0NoaWxkKTsKKyAgICAgICAgcHJldmlvdXNDaGlsZCA9IGNoaWxkOworICAgICAgfQorICAgIH0KKyAgICBjYWxsYmFjayhub2RlLCBwcmV2aW91c1NpYmxpbmcpOworICB9CisgIHZpc2l0KG5vZGUsIG51bGwpOworfQorCitmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVNoaWZ0KG5vZGUpIHsKKyAgdmFyIHNoaWZ0ID0gMCwKKyAgICAgIGNoYW5nZSA9IDAsCisgICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sCisgICAgICBpID0gY2hpbGRyZW4ubGVuZ3RoLAorICAgICAgY2hpbGQ7CisgIHdoaWxlICgtLWkgPj0gMCkgeworICAgIGNoaWxkID0gY2hpbGRyZW5baV0uX3RyZWU7CisgICAgY2hpbGQucHJlbGltICs9IHNoaWZ0OworICAgIGNoaWxkLm1vZCArPSBzaGlmdDsKKyAgICBzaGlmdCArPSBjaGlsZC5zaGlmdCArIChjaGFuZ2UgKz0gY2hpbGQuY2hhbmdlKTsKKyAgfQorfQorCitmdW5jdGlvbiBkM19sYXlvdXRfdHJlZU1vdmUoYW5jZXN0b3IsIG5vZGUsIHNoaWZ0KSB7CisgIGFuY2VzdG9yID0gYW5jZXN0b3IuX3RyZWU7CisgIG5vZGUgPSBub2RlLl90cmVlOworICB2YXIgY2hhbmdlID0gc2hpZnQgLyAobm9kZS5udW1iZXIgLSBhbmNlc3Rvci5udW1iZXIpOworICBhbmNlc3Rvci5jaGFuZ2UgKz0gY2hhbmdlOworICBub2RlLmNoYW5nZSAtPSBjaGFuZ2U7CisgIG5vZGUuc2hpZnQgKz0gc2hpZnQ7CisgIG5vZGUucHJlbGltICs9IHNoaWZ0OworICBub2RlLm1vZCArPSBzaGlmdDsKK30KKworZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVBbmNlc3Rvcih2aW0sIG5vZGUsIGFuY2VzdG9yKSB7CisgIHJldHVybiB2aW0uX3RyZWUuYW5jZXN0b3IucGFyZW50ID09IG5vZGUucGFyZW50CisgICAgICA/IHZpbS5fdHJlZS5hbmNlc3RvcgorICAgICAgOiBhbmNlc3RvcjsKK30KKy8vIFNxdWFyaWZpZWQgVHJlZW1hcHMgYnkgTWFyayBCcnVscywgS2VlcyBIdWl6aW5nLCBhbmQgSmFya2UgSi4gdmFuIFdpamsKKy8vIE1vZGlmaWVkIHRvIHN1cHBvcnQgYSB0YXJnZXQgYXNwZWN0IHJhdGlvIGJ5IEplZmYgSGVlcgorZDMubGF5b3V0LnRyZWVtYXAgPSBmdW5jdGlvbigpIHsKKyAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKSwKKyAgICAgIHJvdW5kID0gTWF0aC5yb3VuZCwKKyAgICAgIHNpemUgPSBbMSwgMV0sIC8vIHdpZHRoLCBoZWlnaHQKKyAgICAgIHBhZGRpbmcgPSBudWxsLAorICAgICAgcGFkID0gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsLAorICAgICAgc3RpY2t5ID0gZmFsc2UsCisgICAgICBzdGlja2llcywKKyAgICAgIHJhdGlvID0gMC41ICogKDEgKyBNYXRoLnNxcnQoNSkpOyAvLyBnb2xkZW4gcmF0aW8KKworICAvLyBDb21wdXRlIHRoZSBhcmVhIGZvciBlYWNoIGNoaWxkIGJhc2VkIG9uIHZhbHVlICYgc2NhbGUuCisgIGZ1bmN0aW9uIHNjYWxlKGNoaWxkcmVuLCBrKSB7CisgICAgdmFyIGkgPSAtMSwKKyAgICAgICAgbiA9IGNoaWxkcmVuLmxlbmd0aCwKKyAgICAgICAgY2hpbGQsCisgICAgICAgIGFyZWE7CisgICAgd2hpbGUgKCsraSA8IG4pIHsKKyAgICAgIGFyZWEgPSAoY2hpbGQgPSBjaGlsZHJlbltpXSkudmFsdWUgKiAoayA8IDAgPyAwIDogayk7CisgICAgICBjaGlsZC5hcmVhID0gaXNOYU4oYXJlYSkgfHwgYXJlYSA8PSAwID8gMCA6IGFyZWE7CisgICAgfQorICB9CisKKyAgLy8gUmVjdXJzaXZlbHkgYXJyYW5nZXMgdGhlIHNwZWNpZmllZCBub2RlJ3MgY2hpbGRyZW4gaW50byBzcXVhcmlmaWVkIHJvd3MuCisgIGZ1bmN0aW9uIHNxdWFyaWZ5KG5vZGUpIHsKKyAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOworICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKKyAgICAgIHZhciByZWN0ID0gcGFkKG5vZGUpLAorICAgICAgICAgIHJvdyA9IFtdLAorICAgICAgICAgIHJlbWFpbmluZyA9IGNoaWxkcmVuLnNsaWNlKCksIC8vIGNvcHktb24td3JpdGUKKyAgICAgICAgICBjaGlsZCwKKyAgICAgICAgICBiZXN0ID0gSW5maW5pdHksIC8vIHRoZSBiZXN0IHJvdyBzY29yZSBzbyBmYXIKKyAgICAgICAgICBzY29yZSwgLy8gdGhlIGN1cnJlbnQgcm93IHNjb3JlCisgICAgICAgICAgdSA9IE1hdGgubWluKHJlY3QuZHgsIHJlY3QuZHkpLCAvLyBpbml0aWFsIG9yaWVudGF0aW9uCisgICAgICAgICAgbjsKKyAgICAgIHNjYWxlKHJlbWFpbmluZywgcmVjdC5keCAqIHJlY3QuZHkgLyBub2RlLnZhbHVlKTsKKyAgICAgIHJvdy5hcmVhID0gMDsKKyAgICAgIHdoaWxlICgobiA9IHJlbWFpbmluZy5sZW5ndGgpID4gMCkgeworICAgICAgICByb3cucHVzaChjaGlsZCA9IHJlbWFpbmluZ1tuIC0gMV0pOworICAgICAgICByb3cuYXJlYSArPSBjaGlsZC5hcmVhOworICAgICAgICBpZiAoKHNjb3JlID0gd29yc3Qocm93LCB1KSkgPD0gYmVzdCkgeyAvLyBjb250aW51ZSB3aXRoIHRoaXMgb3JpZW50YXRpb24KKyAgICAgICAgICByZW1haW5pbmcucG9wKCk7CisgICAgICAgICAgYmVzdCA9IHNjb3JlOworICAgICAgICB9IGVsc2UgeyAvLyBhYm9ydCwgYW5kIHRyeSBhIGRpZmZlcmVudCBvcmllbnRhdGlvbgorICAgICAgICAgIHJvdy5hcmVhIC09IHJvdy5wb3AoKS5hcmVhOworICAgICAgICAgIHBvc2l0aW9uKHJvdywgdSwgcmVjdCwgZmFsc2UpOworICAgICAgICAgIHUgPSBNYXRoLm1pbihyZWN0LmR4LCByZWN0LmR5KTsKKyAgICAgICAgICByb3cubGVuZ3RoID0gcm93LmFyZWEgPSAwOworICAgICAgICAgIGJlc3QgPSBJbmZpbml0eTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHJvdy5sZW5ndGgpIHsKKyAgICAgICAgcG9zaXRpb24ocm93LCB1LCByZWN0LCB0cnVlKTsKKyAgICAgICAgcm93Lmxlbmd0aCA9IHJvdy5hcmVhID0gMDsKKyAgICAgIH0KKyAgICAgIGNoaWxkcmVuLmZvckVhY2goc3F1YXJpZnkpOworICAgIH0KKyAgfQorCisgIC8vIFJlY3Vyc2l2ZWx5IHJlc2l6ZXMgdGhlIHNwZWNpZmllZCBub2RlJ3MgY2hpbGRyZW4gaW50byBleGlzdGluZyByb3dzLgorICAvLyBQcmVzZXJ2ZXMgdGhlIGV4aXN0aW5nIGxheW91dCEKKyAgZnVuY3Rpb24gc3RpY2tpZnkobm9kZSkgeworICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CisgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgeworICAgICAgdmFyIHJlY3QgPSBwYWQobm9kZSksCisgICAgICAgICAgcmVtYWluaW5nID0gY2hpbGRyZW4uc2xpY2UoKSwgLy8gY29weS1vbi13cml0ZQorICAgICAgICAgIGNoaWxkLAorICAgICAgICAgIHJvdyA9IFtdOworICAgICAgc2NhbGUocmVtYWluaW5nLCByZWN0LmR4ICogcmVjdC5keSAvIG5vZGUudmFsdWUpOworICAgICAgcm93LmFyZWEgPSAwOworICAgICAgd2hpbGUgKGNoaWxkID0gcmVtYWluaW5nLnBvcCgpKSB7CisgICAgICAgIHJvdy5wdXNoKGNoaWxkKTsKKyAgICAgICAgcm93LmFyZWEgKz0gY2hpbGQuYXJlYTsKKyAgICAgICAgaWYgKGNoaWxkLnogIT0gbnVsbCkgeworICAgICAgICAgIHBvc2l0aW9uKHJvdywgY2hpbGQueiA/IHJlY3QuZHggOiByZWN0LmR5LCByZWN0LCAhcmVtYWluaW5nLmxlbmd0aCk7CisgICAgICAgICAgcm93Lmxlbmd0aCA9IHJvdy5hcmVhID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2hpbGRyZW4uZm9yRWFjaChzdGlja2lmeSk7CisgICAgfQorICB9CisKKyAgLy8gQ29tcHV0ZXMgdGhlIHNjb3JlIGZvciB0aGUgc3BlY2lmaWVkIHJvdywgYXMgdGhlIHdvcnN0IGFzcGVjdCByYXRpby4KKyAgZnVuY3Rpb24gd29yc3Qocm93LCB1KSB7CisgICAgdmFyIHMgPSByb3cuYXJlYSwKKyAgICAgICAgciwKKyAgICAgICAgcm1heCA9IDAsCisgICAgICAgIHJtaW4gPSBJbmZpbml0eSwKKyAgICAgICAgaSA9IC0xLAorICAgICAgICBuID0gcm93Lmxlbmd0aDsKKyAgICB3aGlsZSAoKytpIDwgbikgeworICAgICAgaWYgKCEociA9IHJvd1tpXS5hcmVhKSkgY29udGludWU7CisgICAgICBpZiAociA8IHJtaW4pIHJtaW4gPSByOworICAgICAgaWYgKHIgPiBybWF4KSBybWF4ID0gcjsKKyAgICB9CisgICAgcyAqPSBzOworICAgIHUgKj0gdTsKKyAgICByZXR1cm4gcworICAgICAgICA/IE1hdGgubWF4KCh1ICogcm1heCAqIHJhdGlvKSAvIHMsIHMgLyAodSAqIHJtaW4gKiByYXRpbykpCisgICAgICAgIDogSW5maW5pdHk7CisgIH0KKworICAvLyBQb3NpdGlvbnMgdGhlIHNwZWNpZmllZCByb3cgb2Ygbm9kZXMuIE1vZGlmaWVzIGByZWN0YC4KKyAgZnVuY3Rpb24gcG9zaXRpb24ocm93LCB1LCByZWN0LCBmbHVzaCkgeworICAgIHZhciBpID0gLTEsCisgICAgICAgIG4gPSByb3cubGVuZ3RoLAorICAgICAgICB4ID0gcmVjdC54LAorICAgICAgICB5ID0gcmVjdC55LAorICAgICAgICB2ID0gdSA/IHJvdW5kKHJvdy5hcmVhIC8gdSkgOiAwLAorICAgICAgICBvOworICAgIGlmICh1ID09IHJlY3QuZHgpIHsgLy8gaG9yaXpvbnRhbCBzdWJkaXZpc2lvbgorICAgICAgaWYgKGZsdXNoIHx8IHYgPiByZWN0LmR5KSB2ID0gcmVjdC5keTsgLy8gb3Zlcit1bmRlcmZsb3cKKyAgICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICAgIG8gPSByb3dbaV07CisgICAgICAgIG8ueCA9IHg7CisgICAgICAgIG8ueSA9IHk7CisgICAgICAgIG8uZHkgPSB2OworICAgICAgICB4ICs9IG8uZHggPSBNYXRoLm1pbihyZWN0LnggKyByZWN0LmR4IC0geCwgdiA/IHJvdW5kKG8uYXJlYSAvIHYpIDogMCk7CisgICAgICB9CisgICAgICBvLnogPSB0cnVlOworICAgICAgby5keCArPSByZWN0LnggKyByZWN0LmR4IC0geDsgLy8gcm91bmRpbmcgZXJyb3IKKyAgICAgIHJlY3QueSArPSB2OworICAgICAgcmVjdC5keSAtPSB2OworICAgIH0gZWxzZSB7IC8vIHZlcnRpY2FsIHN1YmRpdmlzaW9uCisgICAgICBpZiAoZmx1c2ggfHwgdiA+IHJlY3QuZHgpIHYgPSByZWN0LmR4OyAvLyBvdmVyK3VuZGVyZmxvdworICAgICAgd2hpbGUgKCsraSA8IG4pIHsKKyAgICAgICAgbyA9IHJvd1tpXTsKKyAgICAgICAgby54ID0geDsKKyAgICAgICAgby55ID0geTsKKyAgICAgICAgby5keCA9IHY7CisgICAgICAgIHkgKz0gby5keSA9IE1hdGgubWluKHJlY3QueSArIHJlY3QuZHkgLSB5LCB2ID8gcm91bmQoby5hcmVhIC8gdikgOiAwKTsKKyAgICAgIH0KKyAgICAgIG8ueiA9IGZhbHNlOworICAgICAgby5keSArPSByZWN0LnkgKyByZWN0LmR5IC0geTsgLy8gcm91bmRpbmcgZXJyb3IKKyAgICAgIHJlY3QueCArPSB2OworICAgICAgcmVjdC5keCAtPSB2OworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIHRyZWVtYXAoZCkgeworICAgIHZhciBub2RlcyA9IHN0aWNraWVzIHx8IGhpZXJhcmNoeShkKSwKKyAgICAgICAgcm9vdCA9IG5vZGVzWzBdOworICAgIHJvb3QueCA9IDA7CisgICAgcm9vdC55ID0gMDsKKyAgICByb290LmR4ID0gc2l6ZVswXTsKKyAgICByb290LmR5ID0gc2l6ZVsxXTsKKyAgICBpZiAoc3RpY2tpZXMpIGhpZXJhcmNoeS5yZXZhbHVlKHJvb3QpOworICAgIHNjYWxlKFtyb290XSwgcm9vdC5keCAqIHJvb3QuZHkgLyByb290LnZhbHVlKTsKKyAgICAoc3RpY2tpZXMgPyBzdGlja2lmeSA6IHNxdWFyaWZ5KShyb290KTsKKyAgICBpZiAoc3RpY2t5KSBzdGlja2llcyA9IG5vZGVzOworICAgIHJldHVybiBub2RlczsKKyAgfQorCisgIHRyZWVtYXAuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOworICAgIHNpemUgPSB4OworICAgIHJldHVybiB0cmVlbWFwOworICB9OworCisgIHRyZWVtYXAucGFkZGluZyA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRkaW5nOworCisgICAgZnVuY3Rpb24gcGFkRnVuY3Rpb24obm9kZSkgeworICAgICAgdmFyIHAgPSB4LmNhbGwodHJlZW1hcCwgbm9kZSwgbm9kZS5kZXB0aCk7CisgICAgICByZXR1cm4gcCA9PSBudWxsCisgICAgICAgICAgPyBkM19sYXlvdXRfdHJlZW1hcFBhZE51bGwobm9kZSkKKyAgICAgICAgICA6IGQzX2xheW91dF90cmVlbWFwUGFkKG5vZGUsIHR5cGVvZiBwID09PSAibnVtYmVyIiA/IFtwLCBwLCBwLCBwXSA6IHApOworICAgIH0KKworICAgIGZ1bmN0aW9uIHBhZENvbnN0YW50KG5vZGUpIHsKKyAgICAgIHJldHVybiBkM19sYXlvdXRfdHJlZW1hcFBhZChub2RlLCB4KTsKKyAgICB9CisKKyAgICB2YXIgdHlwZTsKKyAgICBwYWQgPSAocGFkZGluZyA9IHgpID09IG51bGwgPyBkM19sYXlvdXRfdHJlZW1hcFBhZE51bGwKKyAgICAgICAgOiAodHlwZSA9IHR5cGVvZiB4KSA9PT0gImZ1bmN0aW9uIiA/IHBhZEZ1bmN0aW9uCisgICAgICAgIDogdHlwZSA9PT0gIm51bWJlciIgPyAoeCA9IFt4LCB4LCB4LCB4XSwgcGFkQ29uc3RhbnQpCisgICAgICAgIDogcGFkQ29uc3RhbnQ7CisgICAgcmV0dXJuIHRyZWVtYXA7CisgIH07CisKKyAgdHJlZW1hcC5yb3VuZCA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByb3VuZCAhPSBOdW1iZXI7CisgICAgcm91bmQgPSB4ID8gTWF0aC5yb3VuZCA6IE51bWJlcjsKKyAgICByZXR1cm4gdHJlZW1hcDsKKyAgfTsKKworICB0cmVlbWFwLnN0aWNreSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzdGlja3k7CisgICAgc3RpY2t5ID0geDsKKyAgICBzdGlja2llcyA9IG51bGw7CisgICAgcmV0dXJuIHRyZWVtYXA7CisgIH07CisKKyAgdHJlZW1hcC5yYXRpbyA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYXRpbzsKKyAgICByYXRpbyA9IHg7CisgICAgcmV0dXJuIHRyZWVtYXA7CisgIH07CisKKyAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQodHJlZW1hcCwgaGllcmFyY2h5KTsKK307CisKK2Z1bmN0aW9uIGQzX2xheW91dF90cmVlbWFwUGFkTnVsbChub2RlKSB7CisgIHJldHVybiB7eDogbm9kZS54LCB5OiBub2RlLnksIGR4OiBub2RlLmR4LCBkeTogbm9kZS5keX07Cit9CisKK2Z1bmN0aW9uIGQzX2xheW91dF90cmVlbWFwUGFkKG5vZGUsIHBhZGRpbmcpIHsKKyAgdmFyIHggPSBub2RlLnggKyBwYWRkaW5nWzNdLAorICAgICAgeSA9IG5vZGUueSArIHBhZGRpbmdbMF0sCisgICAgICBkeCA9IG5vZGUuZHggLSBwYWRkaW5nWzFdIC0gcGFkZGluZ1szXSwKKyAgICAgIGR5ID0gbm9kZS5keSAtIHBhZGRpbmdbMF0gLSBwYWRkaW5nWzJdOworICBpZiAoZHggPCAwKSB7IHggKz0gZHggLyAyOyBkeCA9IDA7IH0KKyAgaWYgKGR5IDwgMCkgeyB5ICs9IGR5IC8gMjsgZHkgPSAwOyB9CisgIHJldHVybiB7eDogeCwgeTogeSwgZHg6IGR4LCBkeTogZHl9OworfQorZDMuY3N2ID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgeworICBkMy50ZXh0KHVybCwgInRleHQvY3N2IiwgZnVuY3Rpb24odGV4dCkgeworICAgIGNhbGxiYWNrKHRleHQgJiYgZDMuY3N2LnBhcnNlKHRleHQpKTsKKyAgfSk7Cit9OworZDMuY3N2LnBhcnNlID0gZnVuY3Rpb24odGV4dCkgeworICB2YXIgaGVhZGVyOworICByZXR1cm4gZDMuY3N2LnBhcnNlUm93cyh0ZXh0LCBmdW5jdGlvbihyb3csIGkpIHsKKyAgICBpZiAoaSkgeworICAgICAgdmFyIG8gPSB7fSwgaiA9IC0xLCBtID0gaGVhZGVyLmxlbmd0aDsKKyAgICAgIHdoaWxlICgrK2ogPCBtKSBvW2hlYWRlcltqXV0gPSByb3dbal07CisgICAgICByZXR1cm4gbzsKKyAgICB9IGVsc2UgeworICAgICAgaGVhZGVyID0gcm93OworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9KTsKK307CisKK2QzLmNzdi5wYXJzZVJvd3MgPSBmdW5jdGlvbih0ZXh0LCBmKSB7CisgIHZhciBFT0wgPSB7fSwgLy8gc2VudGluZWwgdmFsdWUgZm9yIGVuZC1vZi1saW5lCisgICAgICBFT0YgPSB7fSwgLy8gc2VudGluZWwgdmFsdWUgZm9yIGVuZC1vZi1maWxlCisgICAgICByb3dzID0gW10sIC8vIG91dHB1dCByb3dzCisgICAgICByZSA9IC9cclxufFssXHJcbl0vZywgLy8gZmllbGQgc2VwYXJhdG9yIHJlZ2V4CisgICAgICBuID0gMCwgLy8gdGhlIGN1cnJlbnQgbGluZSBudW1iZXIKKyAgICAgIHQsIC8vIHRoZSBjdXJyZW50IHRva2VuCisgICAgICBlb2w7IC8vIGlzIHRoZSBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPTD8KKworICByZS5sYXN0SW5kZXggPSAwOyAvLyB3b3JrLWFyb3VuZCBidWcgaW4gRkYgMy42CisKKyAgLyoqIEBwcml2YXRlIFJldHVybnMgdGhlIG5leHQgdG9rZW4uICovCisgIGZ1bmN0aW9uIHRva2VuKCkgeworICAgIGlmIChyZS5sYXN0SW5kZXggPj0gdGV4dC5sZW5ndGgpIHJldHVybiBFT0Y7IC8vIHNwZWNpYWwgY2FzZTogZW5kIG9mIGZpbGUKKyAgICBpZiAoZW9sKSB7IGVvbCA9IGZhbHNlOyByZXR1cm4gRU9MOyB9IC8vIHNwZWNpYWwgY2FzZTogZW5kIG9mIGxpbmUKKworICAgIC8vIHNwZWNpYWwgY2FzZTogcXVvdGVzCisgICAgdmFyIGogPSByZS5sYXN0SW5kZXg7CisgICAgaWYgKHRleHQuY2hhckNvZGVBdChqKSA9PT0gMzQpIHsKKyAgICAgIHZhciBpID0gajsKKyAgICAgIHdoaWxlIChpKysgPCB0ZXh0Lmxlbmd0aCkgeworICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkpID09PSAzNCkgeworICAgICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSArIDEpICE9PSAzNCkgYnJlYWs7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICB9CisgICAgICByZS5sYXN0SW5kZXggPSBpICsgMjsKKyAgICAgIHZhciBjID0gdGV4dC5jaGFyQ29kZUF0KGkgKyAxKTsKKyAgICAgIGlmIChjID09PSAxMykgeworICAgICAgICBlb2wgPSB0cnVlOworICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkgKyAyKSA9PT0gMTApIHJlLmxhc3RJbmRleCsrOworICAgICAgfSBlbHNlIGlmIChjID09PSAxMCkgeworICAgICAgICBlb2wgPSB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKGogKyAxLCBpKS5yZXBsYWNlKC8iIi9nLCAiXCIiKTsKKyAgICB9CisKKyAgICAvLyBjb21tb24gY2FzZQorICAgIHZhciBtID0gcmUuZXhlYyh0ZXh0KTsKKyAgICBpZiAobSkgeworICAgICAgZW9sID0gbVswXS5jaGFyQ29kZUF0KDApICE9PSA0NDsKKyAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZyhqLCBtLmluZGV4KTsKKyAgICB9CisgICAgcmUubGFzdEluZGV4ID0gdGV4dC5sZW5ndGg7CisgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKGopOworICB9CisKKyAgd2hpbGUgKCh0ID0gdG9rZW4oKSkgIT09IEVPRikgeworICAgIHZhciBhID0gW107CisgICAgd2hpbGUgKCh0ICE9PSBFT0wpICYmICh0ICE9PSBFT0YpKSB7CisgICAgICBhLnB1c2godCk7CisgICAgICB0ID0gdG9rZW4oKTsKKyAgICB9CisgICAgaWYgKGYgJiYgIShhID0gZihhLCBuKyspKSkgY29udGludWU7CisgICAgcm93cy5wdXNoKGEpOworICB9CisKKyAgcmV0dXJuIHJvd3M7Cit9OworZDMuY3N2LmZvcm1hdCA9IGZ1bmN0aW9uKHJvd3MpIHsKKyAgcmV0dXJuIHJvd3MubWFwKGQzX2Nzdl9mb3JtYXRSb3cpLmpvaW4oIlxuIik7Cit9OworCitmdW5jdGlvbiBkM19jc3ZfZm9ybWF0Um93KHJvdykgeworICByZXR1cm4gcm93Lm1hcChkM19jc3ZfZm9ybWF0VmFsdWUpLmpvaW4oIiwiKTsKK30KKworZnVuY3Rpb24gZDNfY3N2X2Zvcm1hdFZhbHVlKHRleHQpIHsKKyAgcmV0dXJuIC9bIixcbl0vLnRlc3QodGV4dCkKKyAgICAgID8gIlwiIiArIHRleHQucmVwbGFjZSgvXCIvZywgIlwiXCIiKSArICJcIiIKKyAgICAgIDogdGV4dDsKK30KK2QzLmdlbyA9IHt9OworCit2YXIgZDNfZ2VvX3JhZGlhbnMgPSBNYXRoLlBJIC8gMTgwOworLy8gVE9ETyBjbGlwIGlucHV0IGNvb3JkaW5hdGVzIG9uIG9wcG9zaXRlIGhlbWlzcGhlcmUKK2QzLmdlby5hemltdXRoYWwgPSBmdW5jdGlvbigpIHsKKyAgdmFyIG1vZGUgPSAib3J0aG9ncmFwaGljIiwgLy8gb3Igc3RlcmVvZ3JhcGhpYywgZ25vbW9uaWMsIGVxdWlkaXN0YW50IG9yIGVxdWFsYXJlYQorICAgICAgb3JpZ2luLAorICAgICAgc2NhbGUgPSAyMDAsCisgICAgICB0cmFuc2xhdGUgPSBbNDgwLCAyNTBdLAorICAgICAgeDAsCisgICAgICB5MCwKKyAgICAgIGN5MCwKKyAgICAgIHN5MDsKKworICBmdW5jdGlvbiBhemltdXRoYWwoY29vcmRpbmF0ZXMpIHsKKyAgICB2YXIgeDEgPSBjb29yZGluYXRlc1swXSAqIGQzX2dlb19yYWRpYW5zIC0geDAsCisgICAgICAgIHkxID0gY29vcmRpbmF0ZXNbMV0gKiBkM19nZW9fcmFkaWFucywKKyAgICAgICAgY3gxID0gTWF0aC5jb3MoeDEpLAorICAgICAgICBzeDEgPSBNYXRoLnNpbih4MSksCisgICAgICAgIGN5MSA9IE1hdGguY29zKHkxKSwKKyAgICAgICAgc3kxID0gTWF0aC5zaW4oeTEpLAorICAgICAgICBjYyA9IG1vZGUgIT09ICJvcnRob2dyYXBoaWMiID8gc3kwICogc3kxICsgY3kwICogY3kxICogY3gxIDogbnVsbCwKKyAgICAgICAgYywKKyAgICAgICAgayA9IG1vZGUgPT09ICJzdGVyZW9ncmFwaGljIiA/IDEgLyAoMSArIGNjKQorICAgICAgICAgIDogbW9kZSA9PT0gImdub21vbmljIiA/IDEgLyBjYworICAgICAgICAgIDogbW9kZSA9PT0gImVxdWlkaXN0YW50IiA/IChjID0gTWF0aC5hY29zKGNjKSwgYyA/IGMgLyBNYXRoLnNpbihjKSA6IDApCisgICAgICAgICAgOiBtb2RlID09PSAiZXF1YWxhcmVhIiA/IE1hdGguc3FydCgyIC8gKDEgKyBjYykpCisgICAgICAgICAgOiAxLAorICAgICAgICB4ID0gayAqIGN5MSAqIHN4MSwKKyAgICAgICAgeSA9IGsgKiAoc3kwICogY3kxICogY3gxIC0gY3kwICogc3kxKTsKKyAgICByZXR1cm4gWworICAgICAgc2NhbGUgKiB4ICsgdHJhbnNsYXRlWzBdLAorICAgICAgc2NhbGUgKiB5ICsgdHJhbnNsYXRlWzFdCisgICAgXTsKKyAgfQorCisgIGF6aW11dGhhbC5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgeworICAgIHZhciB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdHJhbnNsYXRlWzBdKSAvIHNjYWxlLAorICAgICAgICB5ID0gKGNvb3JkaW5hdGVzWzFdIC0gdHJhbnNsYXRlWzFdKSAvIHNjYWxlLAorICAgICAgICBwID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpLAorICAgICAgICBjID0gbW9kZSA9PT0gInN0ZXJlb2dyYXBoaWMiID8gMiAqIE1hdGguYXRhbihwKQorICAgICAgICAgIDogbW9kZSA9PT0gImdub21vbmljIiA/IE1hdGguYXRhbihwKQorICAgICAgICAgIDogbW9kZSA9PT0gImVxdWlkaXN0YW50IiA/IHAKKyAgICAgICAgICA6IG1vZGUgPT09ICJlcXVhbGFyZWEiID8gMiAqIE1hdGguYXNpbiguNSAqIHApCisgICAgICAgICAgOiBNYXRoLmFzaW4ocCksCisgICAgICAgIHNjID0gTWF0aC5zaW4oYyksCisgICAgICAgIGNjID0gTWF0aC5jb3MoYyk7CisgICAgcmV0dXJuIFsKKyAgICAgICh4MCArIE1hdGguYXRhbjIoeCAqIHNjLCBwICogY3kwICogY2MgKyB5ICogc3kwICogc2MpKSAvIGQzX2dlb19yYWRpYW5zLAorICAgICAgTWF0aC5hc2luKGNjICogc3kwIC0gKHAgPyAoeSAqIHNjICogY3kwKSAvIHAgOiAwKSkgLyBkM19nZW9fcmFkaWFucworICAgIF07CisgIH07CisKKyAgYXppbXV0aGFsLm1vZGUgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbW9kZTsKKyAgICBtb2RlID0geCArICIiOworICAgIHJldHVybiBhemltdXRoYWw7CisgIH07CisKKyAgYXppbXV0aGFsLm9yaWdpbiA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmlnaW47CisgICAgb3JpZ2luID0geDsKKyAgICB4MCA9IG9yaWdpblswXSAqIGQzX2dlb19yYWRpYW5zOworICAgIHkwID0gb3JpZ2luWzFdICogZDNfZ2VvX3JhZGlhbnM7CisgICAgY3kwID0gTWF0aC5jb3MoeTApOworICAgIHN5MCA9IE1hdGguc2luKHkwKTsKKyAgICByZXR1cm4gYXppbXV0aGFsOworICB9OworCisgIGF6aW11dGhhbC5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsKKyAgICBzY2FsZSA9ICt4OworICAgIHJldHVybiBhemltdXRoYWw7CisgIH07CisKKyAgYXppbXV0aGFsLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0cmFuc2xhdGU7CisgICAgdHJhbnNsYXRlID0gWyt4WzBdLCAreFsxXV07CisgICAgcmV0dXJuIGF6aW11dGhhbDsKKyAgfTsKKworICByZXR1cm4gYXppbXV0aGFsLm9yaWdpbihbMCwgMF0pOworfTsKKy8vIERlcml2ZWQgZnJvbSBUb20gQ2FyZGVuJ3MgQWxiZXJzIGltcGxlbWVudGF0aW9uIGZvciBQcm90b3Zpcy4KKy8vIGh0dHA6Ly9naXN0LmdpdGh1Yi5jb20vNDc2MjM4CisvLyBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0FsYmVyc0VxdWFsLUFyZWFDb25pY1Byb2plY3Rpb24uaHRtbAorCitkMy5nZW8uYWxiZXJzID0gZnVuY3Rpb24oKSB7CisgIHZhciBvcmlnaW4gPSBbLTk4LCAzOF0sCisgICAgICBwYXJhbGxlbHMgPSBbMjkuNSwgNDUuNV0sCisgICAgICBzY2FsZSA9IDEwMDAsCisgICAgICB0cmFuc2xhdGUgPSBbNDgwLCAyNTBdLAorICAgICAgbG5nMCwgLy8gZDNfZ2VvX3JhZGlhbnMgKiBvcmlnaW5bMF0KKyAgICAgIG4sCisgICAgICBDLAorICAgICAgcDA7CisKKyAgZnVuY3Rpb24gYWxiZXJzKGNvb3JkaW5hdGVzKSB7CisgICAgdmFyIHQgPSBuICogKGQzX2dlb19yYWRpYW5zICogY29vcmRpbmF0ZXNbMF0gLSBsbmcwKSwKKyAgICAgICAgcCA9IE1hdGguc3FydChDIC0gMiAqIG4gKiBNYXRoLnNpbihkM19nZW9fcmFkaWFucyAqIGNvb3JkaW5hdGVzWzFdKSkgLyBuOworICAgIHJldHVybiBbCisgICAgICBzY2FsZSAqIHAgKiBNYXRoLnNpbih0KSArIHRyYW5zbGF0ZVswXSwKKyAgICAgIHNjYWxlICogKHAgKiBNYXRoLmNvcyh0KSAtIHAwKSArIHRyYW5zbGF0ZVsxXQorICAgIF07CisgIH0KKworICBhbGJlcnMuaW52ZXJ0ID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHsKKyAgICB2YXIgeCA9IChjb29yZGluYXRlc1swXSAtIHRyYW5zbGF0ZVswXSkgLyBzY2FsZSwKKyAgICAgICAgeSA9IChjb29yZGluYXRlc1sxXSAtIHRyYW5zbGF0ZVsxXSkgLyBzY2FsZSwKKyAgICAgICAgcDB5ID0gcDAgKyB5LAorICAgICAgICB0ID0gTWF0aC5hdGFuMih4LCBwMHkpLAorICAgICAgICBwID0gTWF0aC5zcXJ0KHggKiB4ICsgcDB5ICogcDB5KTsKKyAgICByZXR1cm4gWworICAgICAgKGxuZzAgKyB0IC8gbikgLyBkM19nZW9fcmFkaWFucywKKyAgICAgIE1hdGguYXNpbigoQyAtIHAgKiBwICogbiAqIG4pIC8gKDIgKiBuKSkgLyBkM19nZW9fcmFkaWFucworICAgIF07CisgIH07CisKKyAgZnVuY3Rpb24gcmVsb2FkKCkgeworICAgIHZhciBwaGkxID0gZDNfZ2VvX3JhZGlhbnMgKiBwYXJhbGxlbHNbMF0sCisgICAgICAgIHBoaTIgPSBkM19nZW9fcmFkaWFucyAqIHBhcmFsbGVsc1sxXSwKKyAgICAgICAgbGF0MCA9IGQzX2dlb19yYWRpYW5zICogb3JpZ2luWzFdLAorICAgICAgICBzID0gTWF0aC5zaW4ocGhpMSksCisgICAgICAgIGMgPSBNYXRoLmNvcyhwaGkxKTsKKyAgICBsbmcwID0gZDNfZ2VvX3JhZGlhbnMgKiBvcmlnaW5bMF07CisgICAgbiA9IC41ICogKHMgKyBNYXRoLnNpbihwaGkyKSk7CisgICAgQyA9IGMgKiBjICsgMiAqIG4gKiBzOworICAgIHAwID0gTWF0aC5zcXJ0KEMgLSAyICogbiAqIE1hdGguc2luKGxhdDApKSAvIG47CisgICAgcmV0dXJuIGFsYmVyczsKKyAgfQorCisgIGFsYmVycy5vcmlnaW4gPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZ2luOworICAgIG9yaWdpbiA9IFsreFswXSwgK3hbMV1dOworICAgIHJldHVybiByZWxvYWQoKTsKKyAgfTsKKworICBhbGJlcnMucGFyYWxsZWxzID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBhcmFsbGVsczsKKyAgICBwYXJhbGxlbHMgPSBbK3hbMF0sICt4WzFdXTsKKyAgICByZXR1cm4gcmVsb2FkKCk7CisgIH07CisKKyAgYWxiZXJzLnNjYWxlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlOworICAgIHNjYWxlID0gK3g7CisgICAgcmV0dXJuIGFsYmVyczsKKyAgfTsKKworICBhbGJlcnMudHJhbnNsYXRlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRyYW5zbGF0ZTsKKyAgICB0cmFuc2xhdGUgPSBbK3hbMF0sICt4WzFdXTsKKyAgICByZXR1cm4gYWxiZXJzOworICB9OworCisgIHJldHVybiByZWxvYWQoKTsKK307CisKKy8vIEEgY29tcG9zaXRlIHByb2plY3Rpb24gZm9yIHRoZSBVbml0ZWQgU3RhdGVzLCA5NjB4NTAwLiBUaGUgc2V0IG9mIHN0YW5kYXJkCisvLyBwYXJhbGxlbHMgZm9yIGVhY2ggcmVnaW9uIGNvbWVzIGZyb20gVVNHUywgd2hpY2ggaXMgcHVibGlzaGVkIGhlcmU6CisvLyBodHRwOi8vZWdzYy51c2dzLmdvdi9pc2IvcHVicy9NYXBQcm9qZWN0aW9ucy9wcm9qZWN0aW9ucy5odG1sI2FsYmVycworLy8gVE9ETyBhbGxvdyB0aGUgY29tcG9zaXRlIHByb2plY3Rpb24gdG8gYmUgcmVzY2FsZWQ/CitkMy5nZW8uYWxiZXJzVXNhID0gZnVuY3Rpb24oKSB7CisgIHZhciBsb3dlcjQ4ID0gZDMuZ2VvLmFsYmVycygpOworCisgIHZhciBhbGFza2EgPSBkMy5nZW8uYWxiZXJzKCkKKyAgICAgIC5vcmlnaW4oWy0xNjAsIDYwXSkKKyAgICAgIC5wYXJhbGxlbHMoWzU1LCA2NV0pOworCisgIHZhciBoYXdhaWkgPSBkMy5nZW8uYWxiZXJzKCkKKyAgICAgIC5vcmlnaW4oWy0xNjAsIDIwXSkKKyAgICAgIC5wYXJhbGxlbHMoWzgsIDE4XSk7CisKKyAgdmFyIHB1ZXJ0b1JpY28gPSBkMy5nZW8uYWxiZXJzKCkKKyAgICAgIC5vcmlnaW4oWy02MCwgMTBdKQorICAgICAgLnBhcmFsbGVscyhbOCwgMThdKTsKKworICBmdW5jdGlvbiBhbGJlcnNVc2EoY29vcmRpbmF0ZXMpIHsKKyAgICB2YXIgbG9uID0gY29vcmRpbmF0ZXNbMF0sCisgICAgICAgIGxhdCA9IGNvb3JkaW5hdGVzWzFdOworICAgIHJldHVybiAobGF0ID4gNTAgPyBhbGFza2EKKyAgICAgICAgOiBsb24gPCAtMTQwID8gaGF3YWlpCisgICAgICAgIDogbGF0IDwgMjEgPyBwdWVydG9SaWNvCisgICAgICAgIDogbG93ZXI0OCkoY29vcmRpbmF0ZXMpOworICB9CisKKyAgYWxiZXJzVXNhLnNjYWxlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxvd2VyNDguc2NhbGUoKTsKKyAgICBsb3dlcjQ4LnNjYWxlKHgpOworICAgIGFsYXNrYS5zY2FsZSh4ICogLjYpOworICAgIGhhd2FpaS5zY2FsZSh4KTsKKyAgICBwdWVydG9SaWNvLnNjYWxlKHggKiAxLjUpOworICAgIHJldHVybiBhbGJlcnNVc2EudHJhbnNsYXRlKGxvd2VyNDgudHJhbnNsYXRlKCkpOworICB9OworCisgIGFsYmVyc1VzYS50cmFuc2xhdGUgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC50cmFuc2xhdGUoKTsKKyAgICB2YXIgZHogPSBsb3dlcjQ4LnNjYWxlKCkgLyAxMDAwLAorICAgICAgICBkeCA9IHhbMF0sCisgICAgICAgIGR5ID0geFsxXTsKKyAgICBsb3dlcjQ4LnRyYW5zbGF0ZSh4KTsKKyAgICBhbGFza2EudHJhbnNsYXRlKFtkeCAtIDQwMCAqIGR6LCBkeSArIDE3MCAqIGR6XSk7CisgICAgaGF3YWlpLnRyYW5zbGF0ZShbZHggLSAxOTAgKiBkeiwgZHkgKyAyMDAgKiBkel0pOworICAgIHB1ZXJ0b1JpY28udHJhbnNsYXRlKFtkeCArIDU4MCAqIGR6LCBkeSArIDQzMCAqIGR6XSk7CisgICAgcmV0dXJuIGFsYmVyc1VzYTsKKyAgfTsKKworICByZXR1cm4gYWxiZXJzVXNhLnNjYWxlKGxvd2VyNDguc2NhbGUoKSk7Cit9OworZDMuZ2VvLmJvbm5lID0gZnVuY3Rpb24oKSB7CisgIHZhciBzY2FsZSA9IDIwMCwKKyAgICAgIHRyYW5zbGF0ZSA9IFs0ODAsIDI1MF0sCisgICAgICB4MCwgLy8gb3JpZ2luIGxvbmdpdHVkZSBpbiByYWRpYW5zCisgICAgICB5MCwgLy8gb3JpZ2luIGxhdGl0dWRlIGluIHJhZGlhbnMKKyAgICAgIHkxLCAvLyBwYXJhbGxlbCBsYXRpdHVkZSBpbiByYWRpYW5zCisgICAgICBjMTsgLy8gY290KHkxKQorCisgIGZ1bmN0aW9uIGJvbm5lKGNvb3JkaW5hdGVzKSB7CisgICAgdmFyIHggPSBjb29yZGluYXRlc1swXSAqIGQzX2dlb19yYWRpYW5zIC0geDAsCisgICAgICAgIHkgPSBjb29yZGluYXRlc1sxXSAqIGQzX2dlb19yYWRpYW5zIC0geTA7CisgICAgaWYgKHkxKSB7CisgICAgICB2YXIgcCA9IGMxICsgeTEgLSB5LCBFID0geCAqIE1hdGguY29zKHkpIC8gcDsKKyAgICAgIHggPSBwICogTWF0aC5zaW4oRSk7CisgICAgICB5ID0gcCAqIE1hdGguY29zKEUpIC0gYzE7CisgICAgfSBlbHNlIHsKKyAgICAgIHggKj0gTWF0aC5jb3MoeSk7CisgICAgICB5ICo9IC0xOworICAgIH0KKyAgICByZXR1cm4gWworICAgICAgc2NhbGUgKiB4ICsgdHJhbnNsYXRlWzBdLAorICAgICAgc2NhbGUgKiB5ICsgdHJhbnNsYXRlWzFdCisgICAgXTsKKyAgfQorCisgIGJvbm5lLmludmVydCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7CisgICAgdmFyIHggPSAoY29vcmRpbmF0ZXNbMF0gLSB0cmFuc2xhdGVbMF0pIC8gc2NhbGUsCisgICAgICAgIHkgPSAoY29vcmRpbmF0ZXNbMV0gLSB0cmFuc2xhdGVbMV0pIC8gc2NhbGU7CisgICAgaWYgKHkxKSB7CisgICAgICB2YXIgYyA9IGMxICsgeSwgcCA9IE1hdGguc3FydCh4ICogeCArIGMgKiBjKTsKKyAgICAgIHkgPSBjMSArIHkxIC0gcDsKKyAgICAgIHggPSB4MCArIHAgKiBNYXRoLmF0YW4yKHgsIGMpIC8gTWF0aC5jb3MoeSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHkgKj0gLTE7CisgICAgICB4IC89IE1hdGguY29zKHkpOworICAgIH0KKyAgICByZXR1cm4gWworICAgICAgeCAvIGQzX2dlb19yYWRpYW5zLAorICAgICAgeSAvIGQzX2dlb19yYWRpYW5zCisgICAgXTsKKyAgfTsKKworICAvLyA5MMKwIGZvciBXZXJuZXIsIDDCsCBmb3IgU2ludXNvaWRhbAorICBib25uZS5wYXJhbGxlbCA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5MSAvIGQzX2dlb19yYWRpYW5zOworICAgIGMxID0gMSAvIE1hdGgudGFuKHkxID0geCAqIGQzX2dlb19yYWRpYW5zKTsKKyAgICByZXR1cm4gYm9ubmU7CisgIH07CisKKyAgYm9ubmUub3JpZ2luID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFt4MCAvIGQzX2dlb19yYWRpYW5zLCB5MCAvIGQzX2dlb19yYWRpYW5zXTsKKyAgICB4MCA9IHhbMF0gKiBkM19nZW9fcmFkaWFuczsKKyAgICB5MCA9IHhbMV0gKiBkM19nZW9fcmFkaWFuczsKKyAgICByZXR1cm4gYm9ubmU7CisgIH07CisKKyAgYm9ubmUuc2NhbGUgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2NhbGU7CisgICAgc2NhbGUgPSAreDsKKyAgICByZXR1cm4gYm9ubmU7CisgIH07CisKKyAgYm9ubmUudHJhbnNsYXRlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRyYW5zbGF0ZTsKKyAgICB0cmFuc2xhdGUgPSBbK3hbMF0sICt4WzFdXTsKKyAgICByZXR1cm4gYm9ubmU7CisgIH07CisKKyAgcmV0dXJuIGJvbm5lLm9yaWdpbihbMCwgMF0pLnBhcmFsbGVsKDQ1KTsKK307CitkMy5nZW8uZXF1aXJlY3Rhbmd1bGFyID0gZnVuY3Rpb24oKSB7CisgIHZhciBzY2FsZSA9IDUwMCwKKyAgICAgIHRyYW5zbGF0ZSA9IFs0ODAsIDI1MF07CisKKyAgZnVuY3Rpb24gZXF1aXJlY3Rhbmd1bGFyKGNvb3JkaW5hdGVzKSB7CisgICAgdmFyIHggPSBjb29yZGluYXRlc1swXSAvIDM2MCwKKyAgICAgICAgeSA9IC1jb29yZGluYXRlc1sxXSAvIDM2MDsKKyAgICByZXR1cm4gWworICAgICAgc2NhbGUgKiB4ICsgdHJhbnNsYXRlWzBdLAorICAgICAgc2NhbGUgKiB5ICsgdHJhbnNsYXRlWzFdCisgICAgXTsKKyAgfQorCisgIGVxdWlyZWN0YW5ndWxhci5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgeworICAgIHZhciB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdHJhbnNsYXRlWzBdKSAvIHNjYWxlLAorICAgICAgICB5ID0gKGNvb3JkaW5hdGVzWzFdIC0gdHJhbnNsYXRlWzFdKSAvIHNjYWxlOworICAgIHJldHVybiBbCisgICAgICAzNjAgKiB4LAorICAgICAgLTM2MCAqIHkKKyAgICBdOworICB9OworCisgIGVxdWlyZWN0YW5ndWxhci5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsKKyAgICBzY2FsZSA9ICt4OworICAgIHJldHVybiBlcXVpcmVjdGFuZ3VsYXI7CisgIH07CisKKyAgZXF1aXJlY3Rhbmd1bGFyLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0cmFuc2xhdGU7CisgICAgdHJhbnNsYXRlID0gWyt4WzBdLCAreFsxXV07CisgICAgcmV0dXJuIGVxdWlyZWN0YW5ndWxhcjsKKyAgfTsKKworICByZXR1cm4gZXF1aXJlY3Rhbmd1bGFyOworfTsKK2QzLmdlby5tZXJjYXRvciA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2NhbGUgPSA1MDAsCisgICAgICB0cmFuc2xhdGUgPSBbNDgwLCAyNTBdOworCisgIGZ1bmN0aW9uIG1lcmNhdG9yKGNvb3JkaW5hdGVzKSB7CisgICAgdmFyIHggPSBjb29yZGluYXRlc1swXSAvIDM2MCwKKyAgICAgICAgeSA9IC0oTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSSAvIDQgKyBjb29yZGluYXRlc1sxXSAqIGQzX2dlb19yYWRpYW5zIC8gMikpIC8gZDNfZ2VvX3JhZGlhbnMpIC8gMzYwOworICAgIHJldHVybiBbCisgICAgICBzY2FsZSAqIHggKyB0cmFuc2xhdGVbMF0sCisgICAgICBzY2FsZSAqIE1hdGgubWF4KC0uNSwgTWF0aC5taW4oLjUsIHkpKSArIHRyYW5zbGF0ZVsxXQorICAgIF07CisgIH0KKworICBtZXJjYXRvci5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgeworICAgIHZhciB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdHJhbnNsYXRlWzBdKSAvIHNjYWxlLAorICAgICAgICB5ID0gKGNvb3JkaW5hdGVzWzFdIC0gdHJhbnNsYXRlWzFdKSAvIHNjYWxlOworICAgIHJldHVybiBbCisgICAgICAzNjAgKiB4LAorICAgICAgMiAqIE1hdGguYXRhbihNYXRoLmV4cCgtMzYwICogeSAqIGQzX2dlb19yYWRpYW5zKSkgLyBkM19nZW9fcmFkaWFucyAtIDkwCisgICAgXTsKKyAgfTsKKworICBtZXJjYXRvci5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsKKyAgICBzY2FsZSA9ICt4OworICAgIHJldHVybiBtZXJjYXRvcjsKKyAgfTsKKworICBtZXJjYXRvci50cmFuc2xhdGUgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdHJhbnNsYXRlOworICAgIHRyYW5zbGF0ZSA9IFsreFswXSwgK3hbMV1dOworICAgIHJldHVybiBtZXJjYXRvcjsKKyAgfTsKKworICByZXR1cm4gbWVyY2F0b3I7Cit9OworZnVuY3Rpb24gZDNfZ2VvX3R5cGUodHlwZXMsIGRlZmF1bHRWYWx1ZSkgeworICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuIG9iamVjdCAmJiB0eXBlcy5oYXNPd25Qcm9wZXJ0eShvYmplY3QudHlwZSkgPyB0eXBlc1tvYmplY3QudHlwZV0ob2JqZWN0KSA6IGRlZmF1bHRWYWx1ZTsKKyAgfTsKK30KKy8qKgorICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQsIGdpdmVuIGEgR2VvSlNPTiBvYmplY3QgKGUuZy4sIGEgZmVhdHVyZSksIHJldHVybnMKKyAqIHRoZSBjb3JyZXNwb25kaW5nIFNWRyBwYXRoLiBUaGUgZnVuY3Rpb24gY2FuIGJlIGN1c3RvbWl6ZWQgYnkgb3ZlcnJpZGluZyB0aGUKKyAqIHByb2plY3Rpb24uIFBvaW50IGZlYXR1cmVzIGFyZSBtYXBwZWQgdG8gY2lyY2xlcyB3aXRoIGEgZGVmYXVsdCByYWRpdXMgb2YKKyAqIDQuNXB4OyB0aGUgcmFkaXVzIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgY29uc3RhbnQgb3IgYSBmdW5jdGlvbiB0aGF0CisgKiBpcyBldmFsdWF0ZWQgcGVyIG9iamVjdC4KKyAqLworZDMuZ2VvLnBhdGggPSBmdW5jdGlvbigpIHsKKyAgdmFyIHBvaW50UmFkaXVzID0gNC41LAorICAgICAgcG9pbnRDaXJjbGUgPSBkM19wYXRoX2NpcmNsZShwb2ludFJhZGl1cyksCisgICAgICBwcm9qZWN0aW9uID0gZDMuZ2VvLmFsYmVyc1VzYSgpOworCisgIGZ1bmN0aW9uIHBhdGgoZCwgaSkgeworICAgIGlmICh0eXBlb2YgcG9pbnRSYWRpdXMgPT09ICJmdW5jdGlvbiIpIHsKKyAgICAgIHBvaW50Q2lyY2xlID0gZDNfcGF0aF9jaXJjbGUocG9pbnRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CisgICAgfQorICAgIHJldHVybiBwYXRoVHlwZShkKSB8fCBudWxsOworICB9CisKKyAgZnVuY3Rpb24gcHJvamVjdChjb29yZGluYXRlcykgeworICAgIHJldHVybiBwcm9qZWN0aW9uKGNvb3JkaW5hdGVzKS5qb2luKCIsIik7CisgIH0KKworICB2YXIgcGF0aFR5cGUgPSBkM19nZW9fdHlwZSh7CisKKyAgICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24obykgeworICAgICAgdmFyIHBhdGggPSBbXSwKKyAgICAgICAgICBmZWF0dXJlcyA9IG8uZmVhdHVyZXMsCisgICAgICAgICAgaSA9IC0xLCAvLyBmZWF0dXJlcy5pbmRleAorICAgICAgICAgIG4gPSBmZWF0dXJlcy5sZW5ndGg7CisgICAgICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKHBhdGhUeXBlKGZlYXR1cmVzW2ldLmdlb21ldHJ5KSk7CisgICAgICByZXR1cm4gcGF0aC5qb2luKCIiKTsKKyAgICB9LAorCisgICAgRmVhdHVyZTogZnVuY3Rpb24obykgeworICAgICAgcmV0dXJuIHBhdGhUeXBlKG8uZ2VvbWV0cnkpOworICAgIH0sCisKKyAgICBQb2ludDogZnVuY3Rpb24obykgeworICAgICAgcmV0dXJuICJNIiArIHByb2plY3Qoby5jb29yZGluYXRlcykgKyBwb2ludENpcmNsZTsKKyAgICB9LAorCisgICAgTXVsdGlQb2ludDogZnVuY3Rpb24obykgeworICAgICAgdmFyIHBhdGggPSBbXSwKKyAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsCisgICAgICAgICAgaSA9IC0xLCAvLyBjb29yZGluYXRlcy5pbmRleAorICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CisgICAgICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKCJNIiwgcHJvamVjdChjb29yZGluYXRlc1tpXSksIHBvaW50Q2lyY2xlKTsKKyAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOworICAgIH0sCisKKyAgICBMaW5lU3RyaW5nOiBmdW5jdGlvbihvKSB7CisgICAgICB2YXIgcGF0aCA9IFsiTSJdLAorICAgICAgICAgIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcywKKyAgICAgICAgICBpID0gLTEsIC8vIGNvb3JkaW5hdGVzLmluZGV4CisgICAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKKyAgICAgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2gocHJvamVjdChjb29yZGluYXRlc1tpXSksICJMIik7CisgICAgICBwYXRoLnBvcCgpOworICAgICAgcmV0dXJuIHBhdGguam9pbigiIik7CisgICAgfSwKKworICAgIE11bHRpTGluZVN0cmluZzogZnVuY3Rpb24obykgeworICAgICAgdmFyIHBhdGggPSBbXSwKKyAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsCisgICAgICAgICAgaSA9IC0xLCAvLyBjb29yZGluYXRlcy5pbmRleAorICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsCisgICAgICAgICAgc3ViY29vcmRpbmF0ZXMsIC8vIGNvb3JkaW5hdGVzW2ldCisgICAgICAgICAgaiwgLy8gc3ViY29vcmRpbmF0ZXMuaW5kZXgKKyAgICAgICAgICBtOyAvLyBzdWJjb29yZGluYXRlcy5sZW5ndGgKKyAgICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICAgIHN1YmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXNbaV07CisgICAgICAgIGogPSAtMTsKKyAgICAgICAgbSA9IHN1YmNvb3JkaW5hdGVzLmxlbmd0aDsKKyAgICAgICAgcGF0aC5wdXNoKCJNIik7CisgICAgICAgIHdoaWxlICgrK2ogPCBtKSBwYXRoLnB1c2gocHJvamVjdChzdWJjb29yZGluYXRlc1tqXSksICJMIik7CisgICAgICAgIHBhdGgucG9wKCk7CisgICAgICB9CisgICAgICByZXR1cm4gcGF0aC5qb2luKCIiKTsKKyAgICB9LAorCisgICAgUG9seWdvbjogZnVuY3Rpb24obykgeworICAgICAgdmFyIHBhdGggPSBbXSwKKyAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsCisgICAgICAgICAgaSA9IC0xLCAvLyBjb29yZGluYXRlcy5pbmRleAorICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsCisgICAgICAgICAgc3ViY29vcmRpbmF0ZXMsIC8vIGNvb3JkaW5hdGVzW2ldCisgICAgICAgICAgaiwgLy8gc3ViY29vcmRpbmF0ZXMuaW5kZXgKKyAgICAgICAgICBtOyAvLyBzdWJjb29yZGluYXRlcy5sZW5ndGgKKyAgICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICAgIHN1YmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXNbaV07CisgICAgICAgIGogPSAtMTsKKyAgICAgICAgaWYgKChtID0gc3ViY29vcmRpbmF0ZXMubGVuZ3RoIC0gMSkgPiAwKSB7CisgICAgICAgICAgcGF0aC5wdXNoKCJNIik7CisgICAgICAgICAgd2hpbGUgKCsraiA8IG0pIHBhdGgucHVzaChwcm9qZWN0KHN1YmNvb3JkaW5hdGVzW2pdKSwgIkwiKTsKKyAgICAgICAgICBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPSAiWiI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOworICAgIH0sCisKKyAgICBNdWx0aVBvbHlnb246IGZ1bmN0aW9uKG8pIHsKKyAgICAgIHZhciBwYXRoID0gW10sCisgICAgICAgICAgY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLAorICAgICAgICAgIGkgPSAtMSwgLy8gY29vcmRpbmF0ZXMgaW5kZXgKKyAgICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoLAorICAgICAgICAgIHN1YmNvb3JkaW5hdGVzLCAvLyBjb29yZGluYXRlc1tpXQorICAgICAgICAgIGosIC8vIHN1YmNvb3JkaW5hdGVzIGluZGV4CisgICAgICAgICAgbSwgLy8gc3ViY29vcmRpbmF0ZXMubGVuZ3RoCisgICAgICAgICAgc3Vic3ViY29vcmRpbmF0ZXMsIC8vIHN1YmNvb3JkaW5hdGVzW2pdCisgICAgICAgICAgaywgLy8gc3Vic3ViY29vcmRpbmF0ZXMgaW5kZXgKKyAgICAgICAgICBwOyAvLyBzdWJzdWJjb29yZGluYXRlcy5sZW5ndGgKKyAgICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICAgIHN1YmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXNbaV07CisgICAgICAgIGogPSAtMTsKKyAgICAgICAgbSA9IHN1YmNvb3JkaW5hdGVzLmxlbmd0aDsKKyAgICAgICAgd2hpbGUgKCsraiA8IG0pIHsKKyAgICAgICAgICBzdWJzdWJjb29yZGluYXRlcyA9IHN1YmNvb3JkaW5hdGVzW2pdOworICAgICAgICAgIGsgPSAtMTsKKyAgICAgICAgICBpZiAoKHAgPSBzdWJzdWJjb29yZGluYXRlcy5sZW5ndGggLSAxKSA+IDApIHsKKyAgICAgICAgICAgIHBhdGgucHVzaCgiTSIpOworICAgICAgICAgICAgd2hpbGUgKCsrayA8IHApIHBhdGgucHVzaChwcm9qZWN0KHN1YnN1YmNvb3JkaW5hdGVzW2tdKSwgIkwiKTsKKyAgICAgICAgICAgIHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9ICJaIjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOworICAgIH0sCisKKyAgICBHZW9tZXRyeUNvbGxlY3Rpb246IGZ1bmN0aW9uKG8pIHsKKyAgICAgIHZhciBwYXRoID0gW10sCisgICAgICAgICAgZ2VvbWV0cmllcyA9IG8uZ2VvbWV0cmllcywKKyAgICAgICAgICBpID0gLTEsIC8vIGdlb21ldHJpZXMgaW5kZXgKKyAgICAgICAgICBuID0gZ2VvbWV0cmllcy5sZW5ndGg7CisgICAgICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKHBhdGhUeXBlKGdlb21ldHJpZXNbaV0pKTsKKyAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOworICAgIH0KKworICB9KTsKKworICB2YXIgYXJlYVR5cGUgPSBwYXRoLmFyZWEgPSBkM19nZW9fdHlwZSh7CisKKyAgICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24obykgeworICAgICAgdmFyIGFyZWEgPSAwLAorICAgICAgICAgIGZlYXR1cmVzID0gby5mZWF0dXJlcywKKyAgICAgICAgICBpID0gLTEsIC8vIGZlYXR1cmVzLmluZGV4CisgICAgICAgICAgbiA9IGZlYXR1cmVzLmxlbmd0aDsKKyAgICAgIHdoaWxlICgrK2kgPCBuKSBhcmVhICs9IGFyZWFUeXBlKGZlYXR1cmVzW2ldKTsKKyAgICAgIHJldHVybiBhcmVhOworICAgIH0sCisKKyAgICBGZWF0dXJlOiBmdW5jdGlvbihvKSB7CisgICAgICByZXR1cm4gYXJlYVR5cGUoby5nZW9tZXRyeSk7CisgICAgfSwKKworICAgIFBvbHlnb246IGZ1bmN0aW9uKG8pIHsKKyAgICAgIHJldHVybiBwb2x5Z29uQXJlYShvLmNvb3JkaW5hdGVzKTsKKyAgICB9LAorCisgICAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihvKSB7CisgICAgICB2YXIgc3VtID0gMCwKKyAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsCisgICAgICAgICAgaSA9IC0xLCAvLyBjb29yZGluYXRlcyBpbmRleAorICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CisgICAgICB3aGlsZSAoKytpIDwgbikgc3VtICs9IHBvbHlnb25BcmVhKGNvb3JkaW5hdGVzW2ldKTsKKyAgICAgIHJldHVybiBzdW07CisgICAgfSwKKworICAgIEdlb21ldHJ5Q29sbGVjdGlvbjogZnVuY3Rpb24obykgeworICAgICAgdmFyIHN1bSA9IDAsCisgICAgICAgICAgZ2VvbWV0cmllcyA9IG8uZ2VvbWV0cmllcywKKyAgICAgICAgICBpID0gLTEsIC8vIGdlb21ldHJpZXMgaW5kZXgKKyAgICAgICAgICBuID0gZ2VvbWV0cmllcy5sZW5ndGg7CisgICAgICB3aGlsZSAoKytpIDwgbikgc3VtICs9IGFyZWFUeXBlKGdlb21ldHJpZXNbaV0pOworICAgICAgcmV0dXJuIHN1bTsKKyAgICB9CisKKyAgfSwgMCk7CisKKyAgZnVuY3Rpb24gcG9seWdvbkFyZWEoY29vcmRpbmF0ZXMpIHsKKyAgICB2YXIgc3VtID0gYXJlYShjb29yZGluYXRlc1swXSksIC8vIGV4dGVyaW9yIHJpbmcKKyAgICAgICAgaSA9IDAsIC8vIGNvb3JkaW5hdGVzLmluZGV4CisgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CisgICAgd2hpbGUgKCsraSA8IG4pIHN1bSAtPSBhcmVhKGNvb3JkaW5hdGVzW2ldKTsgLy8gaG9sZXMKKyAgICByZXR1cm4gc3VtOworICB9CisKKyAgZnVuY3Rpb24gcG9seWdvbkNlbnRyb2lkKGNvb3JkaW5hdGVzKSB7CisgICAgdmFyIHBvbHlnb24gPSBkMy5nZW9tLnBvbHlnb24oY29vcmRpbmF0ZXNbMF0ubWFwKHByb2plY3Rpb24pKSwgLy8gZXh0ZXJpb3IgcmluZworICAgICAgICBhcmVhID0gcG9seWdvbi5hcmVhKCksCisgICAgICAgIGNlbnRyb2lkID0gcG9seWdvbi5jZW50cm9pZChhcmVhIDwgMCA/IChhcmVhICo9IC0xLCAxKSA6IC0xKSwKKyAgICAgICAgeCA9IGNlbnRyb2lkWzBdLAorICAgICAgICB5ID0gY2VudHJvaWRbMV0sCisgICAgICAgIHogPSBhcmVhLAorICAgICAgICBpID0gMCwgLy8gY29vcmRpbmF0ZXMgaW5kZXgKKyAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKKyAgICB3aGlsZSAoKytpIDwgbikgeworICAgICAgcG9seWdvbiA9IGQzLmdlb20ucG9seWdvbihjb29yZGluYXRlc1tpXS5tYXAocHJvamVjdGlvbikpOyAvLyBob2xlcworICAgICAgYXJlYSA9IHBvbHlnb24uYXJlYSgpOworICAgICAgY2VudHJvaWQgPSBwb2x5Z29uLmNlbnRyb2lkKGFyZWEgPCAwID8gKGFyZWEgKj0gLTEsIDEpIDogLTEpOworICAgICAgeCAtPSBjZW50cm9pZFswXTsKKyAgICAgIHkgLT0gY2VudHJvaWRbMV07CisgICAgICB6IC09IGFyZWE7CisgICAgfQorICAgIHJldHVybiBbeCwgeSwgNiAqIHpdOyAvLyB3ZWlnaHRlZCBjZW50cm9pZAorICB9CisKKyAgdmFyIGNlbnRyb2lkVHlwZSA9IHBhdGguY2VudHJvaWQgPSBkM19nZW9fdHlwZSh7CisKKyAgICAvLyBUT0RPIEZlYXR1cmVDb2xsZWN0aW9uCisgICAgLy8gVE9ETyBQb2ludAorICAgIC8vIFRPRE8gTXVsdGlQb2ludAorICAgIC8vIFRPRE8gTGluZVN0cmluZworICAgIC8vIFRPRE8gTXVsdGlMaW5lU3RyaW5nCisgICAgLy8gVE9ETyBHZW9tZXRyeUNvbGxlY3Rpb24KKworICAgIEZlYXR1cmU6IGZ1bmN0aW9uKG8pIHsKKyAgICAgIHJldHVybiBjZW50cm9pZFR5cGUoby5nZW9tZXRyeSk7CisgICAgfSwKKworICAgIFBvbHlnb246IGZ1bmN0aW9uKG8pIHsKKyAgICAgIHZhciBjZW50cm9pZCA9IHBvbHlnb25DZW50cm9pZChvLmNvb3JkaW5hdGVzKTsKKyAgICAgIHJldHVybiBbY2VudHJvaWRbMF0gLyBjZW50cm9pZFsyXSwgY2VudHJvaWRbMV0gLyBjZW50cm9pZFsyXV07CisgICAgfSwKKworICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24obykgeworICAgICAgdmFyIGFyZWEgPSAwLAorICAgICAgICAgIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcywKKyAgICAgICAgICBjZW50cm9pZCwKKyAgICAgICAgICB4ID0gMCwKKyAgICAgICAgICB5ID0gMCwKKyAgICAgICAgICB6ID0gMCwKKyAgICAgICAgICBpID0gLTEsIC8vIGNvb3JkaW5hdGVzIGluZGV4CisgICAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKKyAgICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICAgIGNlbnRyb2lkID0gcG9seWdvbkNlbnRyb2lkKGNvb3JkaW5hdGVzW2ldKTsKKyAgICAgICAgeCArPSBjZW50cm9pZFswXTsKKyAgICAgICAgeSArPSBjZW50cm9pZFsxXTsKKyAgICAgICAgeiArPSBjZW50cm9pZFsyXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBbeCAvIHosIHkgLyB6XTsKKyAgICB9CisKKyAgfSk7CisKKyAgZnVuY3Rpb24gYXJlYShjb29yZGluYXRlcykgeworICAgIHJldHVybiBNYXRoLmFicyhkMy5nZW9tLnBvbHlnb24oY29vcmRpbmF0ZXMubWFwKHByb2plY3Rpb24pKS5hcmVhKCkpOworICB9CisKKyAgcGF0aC5wcm9qZWN0aW9uID0gZnVuY3Rpb24oeCkgeworICAgIHByb2plY3Rpb24gPSB4OworICAgIHJldHVybiBwYXRoOworICB9OworCisgIHBhdGgucG9pbnRSYWRpdXMgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iKSBwb2ludFJhZGl1cyA9IHg7CisgICAgZWxzZSB7CisgICAgICBwb2ludFJhZGl1cyA9ICt4OworICAgICAgcG9pbnRDaXJjbGUgPSBkM19wYXRoX2NpcmNsZShwb2ludFJhZGl1cyk7CisgICAgfQorICAgIHJldHVybiBwYXRoOworICB9OworCisgIHJldHVybiBwYXRoOworfTsKKworZnVuY3Rpb24gZDNfcGF0aF9jaXJjbGUocmFkaXVzKSB7CisgIHJldHVybiAibTAsIiArIHJhZGl1cworICAgICAgKyAiYSIgKyByYWRpdXMgKyAiLCIgKyByYWRpdXMgKyAiIDAgMSwxIDAsIiArICgtMiAqIHJhZGl1cykKKyAgICAgICsgImEiICsgcmFkaXVzICsgIiwiICsgcmFkaXVzICsgIiAwIDEsMSAwLCIgKyAoKzIgKiByYWRpdXMpCisgICAgICArICJ6IjsKK30KKy8qKgorICogR2l2ZW4gYSBHZW9KU09OIG9iamVjdCwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBib3VuZGluZyBib3guIFRoZSBib3VuZGluZworICogYm94IGlzIHJlcHJlc2VudGVkIGJ5IGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5OiBbW2xlZnQsIGJvdHRvbV0sIFtyaWdodCwKKyAqIHRvcF1dLCB3aGVyZSBsZWZ0IGlzIHRoZSBtaW5pbXVtIGxvbmdpdHVkZSwgYm90dG9tIGlzIHRoZSBtaW5pbXVtIGxhdGl0dWRlLAorICogcmlnaHQgaXMgbWF4aW11bSBsb25naXR1ZGUsIGFuZCB0b3AgaXMgdGhlIG1heGltdW0gbGF0aXR1ZGUuCisgKi8KK2QzLmdlby5ib3VuZHMgPSBmdW5jdGlvbihmZWF0dXJlKSB7CisgIHZhciBsZWZ0ID0gSW5maW5pdHksCisgICAgICBib3R0b20gPSBJbmZpbml0eSwKKyAgICAgIHJpZ2h0ID0gLUluZmluaXR5LAorICAgICAgdG9wID0gLUluZmluaXR5OworICBkM19nZW9fYm91bmRzKGZlYXR1cmUsIGZ1bmN0aW9uKHgsIHkpIHsKKyAgICBpZiAoeCA8IGxlZnQpIGxlZnQgPSB4OworICAgIGlmICh4ID4gcmlnaHQpIHJpZ2h0ID0geDsKKyAgICBpZiAoeSA8IGJvdHRvbSkgYm90dG9tID0geTsKKyAgICBpZiAoeSA+IHRvcCkgdG9wID0geTsKKyAgfSk7CisgIHJldHVybiBbW2xlZnQsIGJvdHRvbV0sIFtyaWdodCwgdG9wXV07Cit9OworCitmdW5jdGlvbiBkM19nZW9fYm91bmRzKG8sIGYpIHsKKyAgaWYgKGQzX2dlb19ib3VuZHNUeXBlcy5oYXNPd25Qcm9wZXJ0eShvLnR5cGUpKSBkM19nZW9fYm91bmRzVHlwZXNbby50eXBlXShvLCBmKTsKK30KKwordmFyIGQzX2dlb19ib3VuZHNUeXBlcyA9IHsKKyAgRmVhdHVyZTogZDNfZ2VvX2JvdW5kc0ZlYXR1cmUsCisgIEZlYXR1cmVDb2xsZWN0aW9uOiBkM19nZW9fYm91bmRzRmVhdHVyZUNvbGxlY3Rpb24sCisgIEdlb21ldHJ5Q29sbGVjdGlvbjogZDNfZ2VvX2JvdW5kc0dlb21ldHJ5Q29sbGVjdGlvbiwKKyAgTGluZVN0cmluZzogZDNfZ2VvX2JvdW5kc0xpbmVTdHJpbmcsCisgIE11bHRpTGluZVN0cmluZzogZDNfZ2VvX2JvdW5kc011bHRpTGluZVN0cmluZywKKyAgTXVsdGlQb2ludDogZDNfZ2VvX2JvdW5kc0xpbmVTdHJpbmcsCisgIE11bHRpUG9seWdvbjogZDNfZ2VvX2JvdW5kc011bHRpUG9seWdvbiwKKyAgUG9pbnQ6IGQzX2dlb19ib3VuZHNQb2ludCwKKyAgUG9seWdvbjogZDNfZ2VvX2JvdW5kc1BvbHlnb24KK307CisKK2Z1bmN0aW9uIGQzX2dlb19ib3VuZHNGZWF0dXJlKG8sIGYpIHsKKyAgZDNfZ2VvX2JvdW5kcyhvLmdlb21ldHJ5LCBmKTsKK30KKworZnVuY3Rpb24gZDNfZ2VvX2JvdW5kc0ZlYXR1cmVDb2xsZWN0aW9uKG8sIGYpIHsKKyAgZm9yICh2YXIgYSA9IG8uZmVhdHVyZXMsIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsKKyAgICBkM19nZW9fYm91bmRzKGFbaV0uZ2VvbWV0cnksIGYpOworICB9Cit9CisKK2Z1bmN0aW9uIGQzX2dlb19ib3VuZHNHZW9tZXRyeUNvbGxlY3Rpb24obywgZikgeworICBmb3IgKHZhciBhID0gby5nZW9tZXRyaWVzLCBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CisgICAgZDNfZ2VvX2JvdW5kcyhhW2ldLCBmKTsKKyAgfQorfQorCitmdW5jdGlvbiBkM19nZW9fYm91bmRzTGluZVN0cmluZyhvLCBmKSB7CisgIGZvciAodmFyIGEgPSBvLmNvb3JkaW5hdGVzLCBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CisgICAgZi5hcHBseShudWxsLCBhW2ldKTsKKyAgfQorfQorCitmdW5jdGlvbiBkM19nZW9fYm91bmRzTXVsdGlMaW5lU3RyaW5nKG8sIGYpIHsKKyAgZm9yICh2YXIgYSA9IG8uY29vcmRpbmF0ZXMsIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsKKyAgICBmb3IgKHZhciBiID0gYVtpXSwgaiA9IDAsIG0gPSBiLmxlbmd0aDsgaiA8IG07IGorKykgeworICAgICAgZi5hcHBseShudWxsLCBiW2pdKTsKKyAgICB9CisgIH0KK30KKworZnVuY3Rpb24gZDNfZ2VvX2JvdW5kc011bHRpUG9seWdvbihvLCBmKSB7CisgIGZvciAodmFyIGEgPSBvLmNvb3JkaW5hdGVzLCBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CisgICAgZm9yICh2YXIgYiA9IGFbaV1bMF0sIGogPSAwLCBtID0gYi5sZW5ndGg7IGogPCBtOyBqKyspIHsKKyAgICAgIGYuYXBwbHkobnVsbCwgYltqXSk7CisgICAgfQorICB9Cit9CisKK2Z1bmN0aW9uIGQzX2dlb19ib3VuZHNQb2ludChvLCBmKSB7CisgIGYuYXBwbHkobnVsbCwgby5jb29yZGluYXRlcyk7Cit9CisKK2Z1bmN0aW9uIGQzX2dlb19ib3VuZHNQb2x5Z29uKG8sIGYpIHsKKyAgZm9yICh2YXIgYSA9IG8uY29vcmRpbmF0ZXNbMF0sIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsKKyAgICBmLmFwcGx5KG51bGwsIGFbaV0pOworICB9Cit9CisvLyBUT0RPIGJyZWFrQXREYXRlTGluZT8KKworZDMuZ2VvLmNpcmNsZSA9IGZ1bmN0aW9uKCkgeworICB2YXIgb3JpZ2luID0gWzAsIDBdLAorICAgICAgZGVncmVlcyA9IDkwIC0gMWUtMiwKKyAgICAgIHJhZGlhbnMgPSBkZWdyZWVzICogZDNfZ2VvX3JhZGlhbnMsCisgICAgICBhcmMgPSBkMy5nZW8uZ3JlYXRBcmMoKS50YXJnZXQoT2JqZWN0KTsKKworICBmdW5jdGlvbiBjaXJjbGUoKSB7CisgICAgLy8gVE9ETyByZW5kZXIgYSBjaXJjbGUgYXMgYSBQb2x5Z29uCisgIH0KKworICBmdW5jdGlvbiB2aXNpYmxlKHBvaW50KSB7CisgICAgcmV0dXJuIGFyYy5kaXN0YW5jZShwb2ludCkgPCByYWRpYW5zOworICB9CisKKyAgY2lyY2xlLmNsaXAgPSBmdW5jdGlvbihkKSB7CisgICAgYXJjLnNvdXJjZSh0eXBlb2Ygb3JpZ2luID09PSAiZnVuY3Rpb24iID8gb3JpZ2luLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBvcmlnaW4pOworICAgIHJldHVybiBjbGlwVHlwZShkKTsKKyAgfTsKKworICB2YXIgY2xpcFR5cGUgPSBkM19nZW9fdHlwZSh7CisKKyAgICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24obykgeworICAgICAgdmFyIGZlYXR1cmVzID0gby5mZWF0dXJlcy5tYXAoY2xpcFR5cGUpLmZpbHRlcihPYmplY3QpOworICAgICAgcmV0dXJuIGZlYXR1cmVzICYmIChvID0gT2JqZWN0LmNyZWF0ZShvKSwgby5mZWF0dXJlcyA9IGZlYXR1cmVzLCBvKTsKKyAgICB9LAorCisgICAgRmVhdHVyZTogZnVuY3Rpb24obykgeworICAgICAgdmFyIGdlb21ldHJ5ID0gY2xpcFR5cGUoby5nZW9tZXRyeSk7CisgICAgICByZXR1cm4gZ2VvbWV0cnkgJiYgKG8gPSBPYmplY3QuY3JlYXRlKG8pLCBvLmdlb21ldHJ5ID0gZ2VvbWV0cnksIG8pOworICAgIH0sCisKKyAgICBQb2ludDogZnVuY3Rpb24obykgeworICAgICAgcmV0dXJuIHZpc2libGUoby5jb29yZGluYXRlcykgJiYgbzsKKyAgICB9LAorCisgICAgTXVsdGlQb2ludDogZnVuY3Rpb24obykgeworICAgICAgdmFyIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcy5maWx0ZXIodmlzaWJsZSk7CisgICAgICByZXR1cm4gY29vcmRpbmF0ZXMubGVuZ3RoICYmIHsKKyAgICAgICAgdHlwZTogby50eXBlLAorICAgICAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXMKKyAgICAgIH07CisgICAgfSwKKworICAgIExpbmVTdHJpbmc6IGZ1bmN0aW9uKG8pIHsKKyAgICAgIHZhciBjb29yZGluYXRlcyA9IGNsaXAoby5jb29yZGluYXRlcyk7CisgICAgICByZXR1cm4gY29vcmRpbmF0ZXMubGVuZ3RoICYmIChvID0gT2JqZWN0LmNyZWF0ZShvKSwgby5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzLCBvKTsKKyAgICB9LAorCisgICAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvKSB7CisgICAgICB2YXIgY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLm1hcChjbGlwKS5maWx0ZXIoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sZW5ndGg7IH0pOworICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzLmxlbmd0aCAmJiAobyA9IE9iamVjdC5jcmVhdGUobyksIG8uY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcywgbyk7CisgICAgfSwKKworICAgIFBvbHlnb246IGZ1bmN0aW9uKG8pIHsKKyAgICAgIHZhciBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMubWFwKGNsaXApOworICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdLmxlbmd0aCAmJiAobyA9IE9iamVjdC5jcmVhdGUobyksIG8uY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcywgbyk7CisgICAgfSwKKworICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24obykgeworICAgICAgdmFyIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcy5tYXAoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5tYXAoY2xpcCk7IH0pLmZpbHRlcihmdW5jdGlvbihkKSB7IHJldHVybiBkWzBdLmxlbmd0aDsgfSk7CisgICAgICByZXR1cm4gY29vcmRpbmF0ZXMubGVuZ3RoICYmIChvID0gT2JqZWN0LmNyZWF0ZShvKSwgby5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzLCBvKTsKKyAgICB9LAorCisgICAgR2VvbWV0cnlDb2xsZWN0aW9uOiBmdW5jdGlvbihvKSB7CisgICAgICB2YXIgZ2VvbWV0cmllcyA9IG8uZ2VvbWV0cmllcy5tYXAoY2xpcFR5cGUpLmZpbHRlcihPYmplY3QpOworICAgICAgcmV0dXJuIGdlb21ldHJpZXMubGVuZ3RoICYmIChvID0gT2JqZWN0LmNyZWF0ZShvKSwgby5nZW9tZXRyaWVzID0gZ2VvbWV0cmllcywgbyk7CisgICAgfQorCisgIH0pOworCisgIGZ1bmN0aW9uIGNsaXAoY29vcmRpbmF0ZXMpIHsKKyAgICB2YXIgaSA9IC0xLAorICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoLAorICAgICAgICBjbGlwcGVkID0gW10sCisgICAgICAgIHAwLAorICAgICAgICBwMSwKKyAgICAgICAgcDIsCisgICAgICAgIGQwLAorICAgICAgICBkMTsKKworICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICBkMSA9IGFyYy5kaXN0YW5jZShwMiA9IGNvb3JkaW5hdGVzW2ldKTsKKyAgICAgIGlmIChkMSA8IHJhZGlhbnMpIHsKKyAgICAgICAgaWYgKHAxKSBjbGlwcGVkLnB1c2goZDNfZ2VvX2dyZWF0QXJjSW50ZXJwb2xhdGUocDEsIHAyKSgoZDAgLSByYWRpYW5zKSAvIChkMCAtIGQxKSkpOworICAgICAgICBjbGlwcGVkLnB1c2gocDIpOworICAgICAgICBwMCA9IHAxID0gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHAxID0gcDI7CisgICAgICAgIGlmICghcDAgJiYgY2xpcHBlZC5sZW5ndGgpIHsKKyAgICAgICAgICBjbGlwcGVkLnB1c2goZDNfZ2VvX2dyZWF0QXJjSW50ZXJwb2xhdGUoY2xpcHBlZFtjbGlwcGVkLmxlbmd0aCAtIDFdLCBwMSkoKHJhZGlhbnMgLSBkMCkgLyAoZDEgLSBkMCkpKTsKKyAgICAgICAgICBwMCA9IHAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBkMCA9IGQxOworICAgIH0KKworICAgIGlmIChwMSAmJiBjbGlwcGVkLmxlbmd0aCkgeworICAgICAgZDEgPSBhcmMuZGlzdGFuY2UocDIgPSBjbGlwcGVkWzBdKTsKKyAgICAgIGNsaXBwZWQucHVzaChkM19nZW9fZ3JlYXRBcmNJbnRlcnBvbGF0ZShwMSwgcDIpKChkMCAtIHJhZGlhbnMpIC8gKGQwIC0gZDEpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc2FtcGxlKGNsaXBwZWQpOworICB9CisKKyAgLy8gUmVzYW1wbGUgY29vcmRpbmF0ZXMsIGNyZWF0aW5nIGdyZWF0IGFyY3MgYmV0d2VlbiBlYWNoLgorICBmdW5jdGlvbiByZXNhbXBsZShjb29yZGluYXRlcykgeworICAgIHZhciBpID0gMCwKKyAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCwKKyAgICAgICAgaiwKKyAgICAgICAgbSwKKyAgICAgICAgcmVzYW1wbGVkID0gbiA/IFtjb29yZGluYXRlc1swXV0gOiBjb29yZGluYXRlcywKKyAgICAgICAgcmVzYW1wbGVzLAorICAgICAgICBvcmlnaW4gPSBhcmMuc291cmNlKCk7CisKKyAgICB3aGlsZSAoKytpIDwgbikgeworICAgICAgcmVzYW1wbGVzID0gYXJjLnNvdXJjZShjb29yZGluYXRlc1tpIC0gMV0pKGNvb3JkaW5hdGVzW2ldKS5jb29yZGluYXRlczsKKyAgICAgIGZvciAoaiA9IDAsIG0gPSByZXNhbXBsZXMubGVuZ3RoOyArK2ogPCBtOykgcmVzYW1wbGVkLnB1c2gocmVzYW1wbGVzW2pdKTsKKyAgICB9CisKKyAgICBhcmMuc291cmNlKG9yaWdpbik7CisgICAgcmV0dXJuIHJlc2FtcGxlZDsKKyAgfQorCisgIGNpcmNsZS5vcmlnaW4gPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZ2luOworICAgIG9yaWdpbiA9IHg7CisgICAgcmV0dXJuIGNpcmNsZTsKKyAgfTsKKworICBjaXJjbGUuYW5nbGUgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZGVncmVlczsKKyAgICByYWRpYW5zID0gKGRlZ3JlZXMgPSAreCkgKiBkM19nZW9fcmFkaWFuczsKKyAgICByZXR1cm4gY2lyY2xlOworICB9OworCisgIC8vIFByZWNpc2lvbiBpcyBzcGVjaWZpZWQgaW4gZGVncmVlcy4KKyAgY2lyY2xlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKHgpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBhcmMucHJlY2lzaW9uKCk7CisgICAgYXJjLnByZWNpc2lvbih4KTsKKyAgICByZXR1cm4gY2lyY2xlOworICB9OworCisgIHJldHVybiBjaXJjbGU7Cit9CitkMy5nZW8uZ3JlYXRBcmMgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHNvdXJjZSA9IGQzX2dlb19ncmVhdEFyY1NvdXJjZSwKKyAgICAgIHRhcmdldCA9IGQzX2dlb19ncmVhdEFyY1RhcmdldCwKKyAgICAgIHByZWNpc2lvbiA9IDYgKiBkM19nZW9fcmFkaWFuczsKKworICBmdW5jdGlvbiBncmVhdEFyYygpIHsKKyAgICB2YXIgYSA9IHR5cGVvZiBzb3VyY2UgPT09ICJmdW5jdGlvbiIgPyBzb3VyY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNvdXJjZSwKKyAgICAgICAgYiA9IHR5cGVvZiB0YXJnZXQgPT09ICJmdW5jdGlvbiIgPyB0YXJnZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRhcmdldCwKKyAgICAgICAgaSA9IGQzX2dlb19ncmVhdEFyY0ludGVycG9sYXRlKGEsIGIpLAorICAgICAgICBkdCA9IHByZWNpc2lvbiAvIGkuZCwKKyAgICAgICAgdCA9IDAsCisgICAgICAgIGNvb3JkaW5hdGVzID0gW2FdOworICAgIHdoaWxlICgodCArPSBkdCkgPCAxKSBjb29yZGluYXRlcy5wdXNoKGkodCkpOworICAgIGNvb3JkaW5hdGVzLnB1c2goYik7CisgICAgcmV0dXJuIHsKKyAgICAgIHR5cGU6ICJMaW5lU3RyaW5nIiwKKyAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlcworICAgIH07CisgIH0KKworICAvLyBMZW5ndGggcmV0dXJuZWQgaW4gcmFkaWFuczsgbXVsdGlwbHkgYnkgcmFkaXVzIGZvciBkaXN0YW5jZS4KKyAgZ3JlYXRBcmMuZGlzdGFuY2UgPSBmdW5jdGlvbigpIHsKKyAgICB2YXIgYSA9IHR5cGVvZiBzb3VyY2UgPT09ICJmdW5jdGlvbiIgPyBzb3VyY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNvdXJjZSwKKyAgICAgICAgYiA9IHR5cGVvZiB0YXJnZXQgPT09ICJmdW5jdGlvbiIgPyB0YXJnZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRhcmdldDsKKyAgICAgcmV0dXJuIGQzX2dlb19ncmVhdEFyY0ludGVycG9sYXRlKGEsIGIpLmQ7CisgIH07CisKKyAgZ3JlYXRBcmMuc291cmNlID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvdXJjZTsKKyAgICBzb3VyY2UgPSB4OworICAgIHJldHVybiBncmVhdEFyYzsKKyAgfTsKKworICBncmVhdEFyYy50YXJnZXQgPSBmdW5jdGlvbih4KSB7CisgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0OworICAgIHRhcmdldCA9IHg7CisgICAgcmV0dXJuIGdyZWF0QXJjOworICB9OworCisgIC8vIFByZWNpc2lvbiBpcyBzcGVjaWZpZWQgaW4gZGVncmVlcy4KKyAgZ3JlYXRBcmMucHJlY2lzaW9uID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByZWNpc2lvbiAvIGQzX2dlb19yYWRpYW5zOworICAgIHByZWNpc2lvbiA9IHggKiBkM19nZW9fcmFkaWFuczsKKyAgICByZXR1cm4gZ3JlYXRBcmM7CisgIH07CisKKyAgcmV0dXJuIGdyZWF0QXJjOworfTsKKworZnVuY3Rpb24gZDNfZ2VvX2dyZWF0QXJjU291cmNlKGQpIHsKKyAgcmV0dXJuIGQuc291cmNlOworfQorCitmdW5jdGlvbiBkM19nZW9fZ3JlYXRBcmNUYXJnZXQoZCkgeworICByZXR1cm4gZC50YXJnZXQ7Cit9CisKK2Z1bmN0aW9uIGQzX2dlb19ncmVhdEFyY0ludGVycG9sYXRlKGEsIGIpIHsKKyAgdmFyIHgwID0gYVswXSAqIGQzX2dlb19yYWRpYW5zLCBjeDAgPSBNYXRoLmNvcyh4MCksIHN4MCA9IE1hdGguc2luKHgwKSwKKyAgICAgIHkwID0gYVsxXSAqIGQzX2dlb19yYWRpYW5zLCBjeTAgPSBNYXRoLmNvcyh5MCksIHN5MCA9IE1hdGguc2luKHkwKSwKKyAgICAgIHgxID0gYlswXSAqIGQzX2dlb19yYWRpYW5zLCBjeDEgPSBNYXRoLmNvcyh4MSksIHN4MSA9IE1hdGguc2luKHgxKSwKKyAgICAgIHkxID0gYlsxXSAqIGQzX2dlb19yYWRpYW5zLCBjeTEgPSBNYXRoLmNvcyh5MSksIHN5MSA9IE1hdGguc2luKHkxKSwKKyAgICAgIGQgPSBpbnRlcnBvbGF0ZS5kID0gTWF0aC5hY29zKE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCBzeTAgKiBzeTEgKyBjeTAgKiBjeTEgKiBNYXRoLmNvcyh4MSAtIHgwKSkpKSwKKyAgICAgIHNkID0gTWF0aC5zaW4oZCk7CisKKyAgLy8gRnJvbSBodHRwOi8vd2lsbGlhbXMuYmVzdC52d2gubmV0L2F2Zm9ybS5odG0jSW50ZXJtZWRpYXRlCisgIGZ1bmN0aW9uIGludGVycG9sYXRlKHQpIHsKKyAgICB2YXIgQSA9IE1hdGguc2luKGQgLSAodCAqPSBkKSkgLyBzZCwKKyAgICAgICAgQiA9IE1hdGguc2luKHQpIC8gc2QsCisgICAgICAgIHggPSBBICogY3kwICogY3gwICsgQiAqIGN5MSAqIGN4MSwKKyAgICAgICAgeSA9IEEgKiBjeTAgKiBzeDAgKyBCICogY3kxICogc3gxLAorICAgICAgICB6ID0gQSAqIHN5MCAgICAgICArIEIgKiBzeTE7CisgICAgcmV0dXJuIFsKKyAgICAgIE1hdGguYXRhbjIoeSwgeCkgLyBkM19nZW9fcmFkaWFucywKKyAgICAgIE1hdGguYXRhbjIoeiwgTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpKSAvIGQzX2dlb19yYWRpYW5zCisgICAgXTsKKyAgfQorCisgIHJldHVybiBpbnRlcnBvbGF0ZTsKK30KK2QzLmdlby5ncmVhdENpcmNsZSA9IGQzLmdlby5jaXJjbGU7CitkMy5nZW9tID0ge307CisvKioKKyAqIENvbXB1dGVzIGEgY29udG91ciBmb3IgYSBnaXZlbiBpbnB1dCBncmlkIGZ1bmN0aW9uIHVzaW5nIHRoZSA8YQorICogaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NYXJjaGluZ19zcXVhcmVzIj5tYXJjaGluZworICogc3F1YXJlczwvYT4gYWxnb3JpdGhtLiBSZXR1cm5zIHRoZSBjb250b3VyIHBvbHlnb24gYXMgYW4gYXJyYXkgb2YgcG9pbnRzLgorICoKKyAqIEBwYXJhbSBncmlkIGEgdHdvLWlucHV0IGZ1bmN0aW9uKHgsIHkpIHRoYXQgcmV0dXJucyB0cnVlIGZvciB2YWx1ZXMKKyAqIGluc2lkZSB0aGUgY29udG91ciBhbmQgZmFsc2UgZm9yIHZhbHVlcyBvdXRzaWRlIHRoZSBjb250b3VyLgorICogQHBhcmFtIHN0YXJ0IGFuIG9wdGlvbmFsIHN0YXJ0aW5nIHBvaW50IFt4LCB5XSBvbiB0aGUgZ3JpZC4KKyAqIEByZXR1cm5zIHBvbHlnb24gW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXQorICovCitkMy5nZW9tLmNvbnRvdXIgPSBmdW5jdGlvbihncmlkLCBzdGFydCkgeworICB2YXIgcyA9IHN0YXJ0IHx8IGQzX2dlb21fY29udG91clN0YXJ0KGdyaWQpLCAvLyBzdGFydGluZyBwb2ludAorICAgICAgYyA9IFtdLCAgICAvLyBjb250b3VyIHBvbHlnb24KKyAgICAgIHggPSBzWzBdLCAgLy8gY3VycmVudCB4IHBvc2l0aW9uCisgICAgICB5ID0gc1sxXSwgIC8vIGN1cnJlbnQgeSBwb3NpdGlvbgorICAgICAgZHggPSAwLCAgICAvLyBuZXh0IHggZGlyZWN0aW9uCisgICAgICBkeSA9IDAsICAgIC8vIG5leHQgeSBkaXJlY3Rpb24KKyAgICAgIHBkeCA9IE5hTiwgLy8gcHJldmlvdXMgeCBkaXJlY3Rpb24KKyAgICAgIHBkeSA9IE5hTiwgLy8gcHJldmlvdXMgeSBkaXJlY3Rpb24KKyAgICAgIGkgPSAwOworCisgIGRvIHsKKyAgICAvLyBkZXRlcm1pbmUgbWFyY2hpbmcgc3F1YXJlcyBpbmRleAorICAgIGkgPSAwOworICAgIGlmIChncmlkKHgtMSwgeS0xKSkgaSArPSAxOworICAgIGlmIChncmlkKHgsICAgeS0xKSkgaSArPSAyOworICAgIGlmIChncmlkKHgtMSwgeSAgKSkgaSArPSA0OworICAgIGlmIChncmlkKHgsICAgeSAgKSkgaSArPSA4OworCisgICAgLy8gZGV0ZXJtaW5lIG5leHQgZGlyZWN0aW9uCisgICAgaWYgKGkgPT09IDYpIHsKKyAgICAgIGR4ID0gcGR5ID09PSAtMSA/IC0xIDogMTsKKyAgICAgIGR5ID0gMDsKKyAgICB9IGVsc2UgaWYgKGkgPT09IDkpIHsKKyAgICAgIGR4ID0gMDsKKyAgICAgIGR5ID0gcGR4ID09PSAxID8gLTEgOiAxOworICAgIH0gZWxzZSB7CisgICAgICBkeCA9IGQzX2dlb21fY29udG91ckR4W2ldOworICAgICAgZHkgPSBkM19nZW9tX2NvbnRvdXJEeVtpXTsKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgY29udG91ciBwb2x5Z29uCisgICAgaWYgKGR4ICE9IHBkeCAmJiBkeSAhPSBwZHkpIHsKKyAgICAgIGMucHVzaChbeCwgeV0pOworICAgICAgcGR4ID0gZHg7CisgICAgICBwZHkgPSBkeTsKKyAgICB9CisKKyAgICB4ICs9IGR4OworICAgIHkgKz0gZHk7CisgIH0gd2hpbGUgKHNbMF0gIT0geCB8fCBzWzFdICE9IHkpOworCisgIHJldHVybiBjOworfTsKKworLy8gbG9va3VwIHRhYmxlcyBmb3IgbWFyY2hpbmcgZGlyZWN0aW9ucwordmFyIGQzX2dlb21fY29udG91ckR4ID0gWzEsIDAsIDEsIDEsLTEsIDAsLTEsIDEsMCwgMCwwLDAsLTEsIDAsLTEsTmFOXSwKKyAgICBkM19nZW9tX2NvbnRvdXJEeSA9IFswLC0xLCAwLCAwLCAwLC0xLCAwLCAwLDEsLTEsMSwxLCAwLC0xLCAwLE5hTl07CisKK2Z1bmN0aW9uIGQzX2dlb21fY29udG91clN0YXJ0KGdyaWQpIHsKKyAgdmFyIHggPSAwLAorICAgICAgeSA9IDA7CisKKyAgLy8gc2VhcmNoIGZvciBhIHN0YXJ0aW5nIHBvaW50OyBiZWdpbiBhdCBvcmlnaW4KKyAgLy8gYW5kIHByb2NlZWQgYWxvbmcgb3V0d2FyZC1leHBhbmRpbmcgZGlhZ29uYWxzCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKGdyaWQoeCx5KSkgeworICAgICAgcmV0dXJuIFt4LHldOworICAgIH0KKyAgICBpZiAoeCA9PT0gMCkgeworICAgICAgeCA9IHkgKyAxOworICAgICAgeSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHggPSB4IC0gMTsKKyAgICAgIHkgPSB5ICsgMTsKKyAgICB9CisgIH0KK30KKy8qKgorICogQ29tcHV0ZXMgdGhlIDJEIGNvbnZleCBodWxsIG9mIGEgc2V0IG9mIHBvaW50cyB1c2luZyBHcmFoYW0ncyBzY2FubmluZworICogYWxnb3JpdGhtLiBUaGUgYWxnb3JpdGhtIGhhcyBiZWVuIGltcGxlbWVudGVkIGFzIGRlc2NyaWJlZCBpbiBDb3JtZW4sCisgKiBMZWlzZXJzb24sIGFuZCBSaXZlc3QncyBJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtcy4gVGhlIHJ1bm5pbmcgdGltZSBvZgorICogdGhpcyBhbGdvcml0aG0gaXMgTyhuIGxvZyBuKSwgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mIGlucHV0IHBvaW50cy4KKyAqCisgKiBAcGFyYW0gdmVydGljZXMgW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXQorICogQHJldHVybnMgcG9seWdvbiBbW3gxLCB5MV0sIFt4MiwgeTJdLCDigKZdCisgKi8KK2QzLmdlb20uaHVsbCA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7CisgIGlmICh2ZXJ0aWNlcy5sZW5ndGggPCAzKSByZXR1cm4gW107CisKKyAgdmFyIGxlbiA9IHZlcnRpY2VzLmxlbmd0aCwKKyAgICAgIHBsZW4gPSBsZW4gLSAxLAorICAgICAgcG9pbnRzID0gW10sCisgICAgICBzdGFjayA9IFtdLAorICAgICAgaSwgaiwgaCA9IDAsIHgxLCB5MSwgeDIsIHkyLCB1LCB2LCBhLCBzcDsKKworICAvLyBmaW5kIHRoZSBzdGFydGluZyByZWYgcG9pbnQ6IGxlZnRtb3N0IHBvaW50IHdpdGggdGhlIG1pbmltdW0geSBjb29yZAorICBmb3IgKGk9MTsgaTxsZW47ICsraSkgeworICAgIGlmICh2ZXJ0aWNlc1tpXVsxXSA8IHZlcnRpY2VzW2hdWzFdKSB7CisgICAgICBoID0gaTsKKyAgICB9IGVsc2UgaWYgKHZlcnRpY2VzW2ldWzFdID09IHZlcnRpY2VzW2hdWzFdKSB7CisgICAgICBoID0gKHZlcnRpY2VzW2ldWzBdIDwgdmVydGljZXNbaF1bMF0gPyBpIDogaCk7CisgICAgfQorICB9CisKKyAgLy8gY2FsY3VsYXRlIHBvbGFyIGFuZ2xlcyBmcm9tIHJlZiBwb2ludCBhbmQgc29ydAorICBmb3IgKGk9MDsgaTxsZW47ICsraSkgeworICAgIGlmIChpID09PSBoKSBjb250aW51ZTsKKyAgICB5MSA9IHZlcnRpY2VzW2ldWzFdIC0gdmVydGljZXNbaF1bMV07CisgICAgeDEgPSB2ZXJ0aWNlc1tpXVswXSAtIHZlcnRpY2VzW2hdWzBdOworICAgIHBvaW50cy5wdXNoKHthbmdsZTogTWF0aC5hdGFuMih5MSwgeDEpLCBpbmRleDogaX0pOworICB9CisgIHBvaW50cy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEuYW5nbGUgLSBiLmFuZ2xlOyB9KTsKKworICAvLyB0b3NzIG91dCBkdXBsaWNhdGUgYW5nbGVzCisgIGEgPSBwb2ludHNbMF0uYW5nbGU7CisgIHYgPSBwb2ludHNbMF0uaW5kZXg7CisgIHUgPSAwOworICBmb3IgKGk9MTsgaTxwbGVuOyArK2kpIHsKKyAgICBqID0gcG9pbnRzW2ldLmluZGV4OworICAgIGlmIChhID09IHBvaW50c1tpXS5hbmdsZSkgeworICAgICAgLy8ga2VlcCBhbmdsZSBmb3IgcG9pbnQgbW9zdCBkaXN0YW50IGZyb20gdGhlIHJlZmVyZW5jZQorICAgICAgeDEgPSB2ZXJ0aWNlc1t2XVswXSAtIHZlcnRpY2VzW2hdWzBdOworICAgICAgeTEgPSB2ZXJ0aWNlc1t2XVsxXSAtIHZlcnRpY2VzW2hdWzFdOworICAgICAgeDIgPSB2ZXJ0aWNlc1tqXVswXSAtIHZlcnRpY2VzW2hdWzBdOworICAgICAgeTIgPSB2ZXJ0aWNlc1tqXVsxXSAtIHZlcnRpY2VzW2hdWzFdOworICAgICAgaWYgKCh4MSp4MSArIHkxKnkxKSA+PSAoeDIqeDIgKyB5Mip5MikpIHsKKyAgICAgICAgcG9pbnRzW2ldLmluZGV4ID0gLTE7CisgICAgICB9IGVsc2UgeworICAgICAgICBwb2ludHNbdV0uaW5kZXggPSAtMTsKKyAgICAgICAgYSA9IHBvaW50c1tpXS5hbmdsZTsKKyAgICAgICAgdSA9IGk7CisgICAgICAgIHYgPSBqOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBhID0gcG9pbnRzW2ldLmFuZ2xlOworICAgICAgdSA9IGk7CisgICAgICB2ID0gajsKKyAgICB9CisgIH0KKworICAvLyBpbml0aWFsaXplIHRoZSBzdGFjaworICBzdGFjay5wdXNoKGgpOworICBmb3IgKGk9MCwgaj0wOyBpPDI7ICsraikgeworICAgIGlmIChwb2ludHNbal0uaW5kZXggIT09IC0xKSB7CisgICAgICBzdGFjay5wdXNoKHBvaW50c1tqXS5pbmRleCk7CisgICAgICBpKys7CisgICAgfQorICB9CisgIHNwID0gc3RhY2subGVuZ3RoOworCisgIC8vIGRvIGdyYWhhbSdzIHNjYW4KKyAgZm9yICg7IGo8cGxlbjsgKytqKSB7CisgICAgaWYgKHBvaW50c1tqXS5pbmRleCA9PT0gLTEpIGNvbnRpbnVlOyAvLyBza2lwIHRvc3NlZCBvdXQgcG9pbnRzCisgICAgd2hpbGUgKCFkM19nZW9tX2h1bGxDQ1coc3RhY2tbc3AtMl0sIHN0YWNrW3NwLTFdLCBwb2ludHNbal0uaW5kZXgsIHZlcnRpY2VzKSkgeworICAgICAgLS1zcDsKKyAgICB9CisgICAgc3RhY2tbc3ArK10gPSBwb2ludHNbal0uaW5kZXg7CisgIH0KKworICAvLyBjb25zdHJ1Y3QgdGhlIGh1bGwKKyAgdmFyIHBvbHkgPSBbXTsKKyAgZm9yIChpPTA7IGk8c3A7ICsraSkgeworICAgIHBvbHkucHVzaCh2ZXJ0aWNlc1tzdGFja1tpXV0pOworICB9CisgIHJldHVybiBwb2x5OworfQorCisvLyBhcmUgdGhyZWUgcG9pbnRzIGluIGNvdW50ZXItY2xvY2t3aXNlIG9yZGVyPworZnVuY3Rpb24gZDNfZ2VvbV9odWxsQ0NXKGkxLCBpMiwgaTMsIHYpIHsKKyAgdmFyIHQsIGEsIGIsIGMsIGQsIGUsIGY7CisgIHQgPSB2W2kxXTsgYSA9IHRbMF07IGIgPSB0WzFdOworICB0ID0gdltpMl07IGMgPSB0WzBdOyBkID0gdFsxXTsKKyAgdCA9IHZbaTNdOyBlID0gdFswXTsgZiA9IHRbMV07CisgIHJldHVybiAoKGYtYikqKGMtYSkgLSAoZC1iKSooZS1hKSkgPiAwOworfQorLy8gTm90ZTogcmVxdWlyZXMgY29vcmRpbmF0ZXMgdG8gYmUgY291bnRlcmNsb2Nrd2lzZSBhbmQgY29udmV4IQorZDMuZ2VvbS5wb2x5Z29uID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHsKKworICBjb29yZGluYXRlcy5hcmVhID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIGkgPSAwLAorICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoLAorICAgICAgICBhID0gY29vcmRpbmF0ZXNbbiAtIDFdWzBdICogY29vcmRpbmF0ZXNbMF1bMV0sCisgICAgICAgIGIgPSBjb29yZGluYXRlc1tuIC0gMV1bMV0gKiBjb29yZGluYXRlc1swXVswXTsKKyAgICB3aGlsZSAoKytpIDwgbikgeworICAgICAgYSArPSBjb29yZGluYXRlc1tpIC0gMV1bMF0gKiBjb29yZGluYXRlc1tpXVsxXTsKKyAgICAgIGIgKz0gY29vcmRpbmF0ZXNbaSAtIDFdWzFdICogY29vcmRpbmF0ZXNbaV1bMF07CisgICAgfQorICAgIHJldHVybiAoYiAtIGEpICogLjU7CisgIH07CisKKyAgY29vcmRpbmF0ZXMuY2VudHJvaWQgPSBmdW5jdGlvbihrKSB7CisgICAgdmFyIGkgPSAtMSwKKyAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCwKKyAgICAgICAgeCA9IDAsCisgICAgICAgIHkgPSAwLAorICAgICAgICBhLAorICAgICAgICBiID0gY29vcmRpbmF0ZXNbbiAtIDFdLAorICAgICAgICBjOworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgayA9IC0xIC8gKDYgKiBjb29yZGluYXRlcy5hcmVhKCkpOworICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICBhID0gYjsKKyAgICAgIGIgPSBjb29yZGluYXRlc1tpXTsKKyAgICAgIGMgPSBhWzBdICogYlsxXSAtIGJbMF0gKiBhWzFdOworICAgICAgeCArPSAoYVswXSArIGJbMF0pICogYzsKKyAgICAgIHkgKz0gKGFbMV0gKyBiWzFdKSAqIGM7CisgICAgfQorICAgIHJldHVybiBbeCAqIGssIHkgKiBrXTsKKyAgfTsKKworICAvLyBUaGUgU3V0aGVybGFuZC1Ib2RnbWFuIGNsaXBwaW5nIGFsZ29yaXRobS4KKyAgY29vcmRpbmF0ZXMuY2xpcCA9IGZ1bmN0aW9uKHN1YmplY3QpIHsKKyAgICB2YXIgaW5wdXQsCisgICAgICAgIGkgPSAtMSwKKyAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCwKKyAgICAgICAgaiwKKyAgICAgICAgbSwKKyAgICAgICAgYSA9IGNvb3JkaW5hdGVzW24gLSAxXSwKKyAgICAgICAgYiwKKyAgICAgICAgYywKKyAgICAgICAgZDsKKyAgICB3aGlsZSAoKytpIDwgbikgeworICAgICAgaW5wdXQgPSBzdWJqZWN0LnNsaWNlKCk7CisgICAgICBzdWJqZWN0Lmxlbmd0aCA9IDA7CisgICAgICBiID0gY29vcmRpbmF0ZXNbaV07CisgICAgICBjID0gaW5wdXRbKG0gPSBpbnB1dC5sZW5ndGgpIC0gMV07CisgICAgICBqID0gLTE7CisgICAgICB3aGlsZSAoKytqIDwgbSkgeworICAgICAgICBkID0gaW5wdXRbal07CisgICAgICAgIGlmIChkM19nZW9tX3BvbHlnb25JbnNpZGUoZCwgYSwgYikpIHsKKyAgICAgICAgICBpZiAoIWQzX2dlb21fcG9seWdvbkluc2lkZShjLCBhLCBiKSkgeworICAgICAgICAgICAgc3ViamVjdC5wdXNoKGQzX2dlb21fcG9seWdvbkludGVyc2VjdChjLCBkLCBhLCBiKSk7CisgICAgICAgICAgfQorICAgICAgICAgIHN1YmplY3QucHVzaChkKTsKKyAgICAgICAgfSBlbHNlIGlmIChkM19nZW9tX3BvbHlnb25JbnNpZGUoYywgYSwgYikpIHsKKyAgICAgICAgICBzdWJqZWN0LnB1c2goZDNfZ2VvbV9wb2x5Z29uSW50ZXJzZWN0KGMsIGQsIGEsIGIpKTsKKyAgICAgICAgfQorICAgICAgICBjID0gZDsKKyAgICAgIH0KKyAgICAgIGEgPSBiOworICAgIH0KKyAgICByZXR1cm4gc3ViamVjdDsKKyAgfTsKKworICByZXR1cm4gY29vcmRpbmF0ZXM7Cit9OworCitmdW5jdGlvbiBkM19nZW9tX3BvbHlnb25JbnNpZGUocCwgYSwgYikgeworICByZXR1cm4gKGJbMF0gLSBhWzBdKSAqIChwWzFdIC0gYVsxXSkgPCAoYlsxXSAtIGFbMV0pICogKHBbMF0gLSBhWzBdKTsKK30KKworLy8gSW50ZXJzZWN0IHR3byBpbmZpbml0ZSBsaW5lcyBjZCBhbmQgYWIuCitmdW5jdGlvbiBkM19nZW9tX3BvbHlnb25JbnRlcnNlY3QoYywgZCwgYSwgYikgeworICB2YXIgeDEgPSBjWzBdLCB4MiA9IGRbMF0sIHgzID0gYVswXSwgeDQgPSBiWzBdLAorICAgICAgeTEgPSBjWzFdLCB5MiA9IGRbMV0sIHkzID0gYVsxXSwgeTQgPSBiWzFdLAorICAgICAgeDEzID0geDEgLSB4MywKKyAgICAgIHgyMSA9IHgyIC0geDEsCisgICAgICB4NDMgPSB4NCAtIHgzLAorICAgICAgeTEzID0geTEgLSB5MywKKyAgICAgIHkyMSA9IHkyIC0geTEsCisgICAgICB5NDMgPSB5NCAtIHkzLAorICAgICAgdWEgPSAoeDQzICogeTEzIC0geTQzICogeDEzKSAvICh5NDMgKiB4MjEgLSB4NDMgKiB5MjEpOworICByZXR1cm4gW3gxICsgdWEgKiB4MjEsIHkxICsgdWEgKiB5MjFdOworfQorLy8gQWRhcHRlZCBmcm9tIE5pY29sYXMgR2FyY2lhIEJlbG1vbnRlJ3MgSklUIGltcGxlbWVudGF0aW9uOgorLy8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy8yMDEwLzAyLzEyL3Zvcm9ub2ktdGVzc2VsbGF0aW9uLworLy8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9hc3NldHMvdm9yb25vaWpzL3Zvcm9ub2kuanMKKy8vIFNlZSBsaWIvaml0L0xJQ0VOU0UgZm9yIGRldGFpbHMuCisKKy8vIE5vdGVzOgorLy8KKy8vIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY2xpcCB0aGUgcmV0dXJuZWQgcG9seWdvbnMsIHNvIGlmIHlvdSB3YW50IHRvCisvLyBjbGlwIHRoZW0gdG8gYSBwYXJ0aWN1bGFyIHNoYXBlIHlvdSB3aWxsIG5lZWQgdG8gZG8gdGhhdCBlaXRoZXIgaW4gU1ZHIG9yIGJ5CisvLyBwb3N0LXByb2Nlc3Npbmcgd2l0aCBkMy5nZW9tLnBvbHlnb24ncyBjbGlwIG1ldGhvZC4KKy8vCisvLyBJZiBhbnkgdmVydGljZXMgYXJlIGNvaW5jaWRlbnQgb3IgaGF2ZSBOYU4gcG9zaXRpb25zLCB0aGUgYmVoYXZpb3Igb2YgdGhpcworLy8gbWV0aG9kIGlzIHVuZGVmaW5lZC4gTW9zdCBsaWtlbHkgaW52YWxpZCBwb2x5Z29ucyB3aWxsIGJlIHJldHVybmVkLiBZb3UKKy8vIHNob3VsZCBmaWx0ZXIgaW52YWxpZCBwb2ludHMsIGFuZCBjb25zb2xpZGF0ZSBjb2luY2lkZW50IHBvaW50cywgYmVmb3JlCisvLyBjb21wdXRpbmcgdGhlIHRlc3NlbGxhdGlvbi4KKworLyoqCisgKiBAcGFyYW0gdmVydGljZXMgW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXQorICogQHJldHVybnMgcG9seWdvbnMgW1tbeDEsIHkxXSwgW3gyLCB5Ml0sIOKApl0sIOKApl0KKyAqLworZDMuZ2VvbS52b3Jvbm9pID0gZnVuY3Rpb24odmVydGljZXMpIHsKKyAgdmFyIHBvbHlnb25zID0gdmVydGljZXMubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0pOworCisgIGQzX3Zvcm9ub2lfdGVzc2VsbGF0ZSh2ZXJ0aWNlcywgZnVuY3Rpb24oZSkgeworICAgIHZhciBzMSwKKyAgICAgICAgczIsCisgICAgICAgIHgxLAorICAgICAgICB4MiwKKyAgICAgICAgeTEsCisgICAgICAgIHkyOworICAgIGlmIChlLmEgPT09IDEgJiYgZS5iID49IDApIHsKKyAgICAgIHMxID0gZS5lcC5yOworICAgICAgczIgPSBlLmVwLmw7CisgICAgfSBlbHNlIHsKKyAgICAgIHMxID0gZS5lcC5sOworICAgICAgczIgPSBlLmVwLnI7CisgICAgfQorICAgIGlmIChlLmEgPT09IDEpIHsKKyAgICAgIHkxID0gczEgPyBzMS55IDogLTFlNjsKKyAgICAgIHgxID0gZS5jIC0gZS5iICogeTE7CisgICAgICB5MiA9IHMyID8gczIueSA6IDFlNjsKKyAgICAgIHgyID0gZS5jIC0gZS5iICogeTI7CisgICAgfSBlbHNlIHsKKyAgICAgIHgxID0gczEgPyBzMS54IDogLTFlNjsKKyAgICAgIHkxID0gZS5jIC0gZS5hICogeDE7CisgICAgICB4MiA9IHMyID8gczIueCA6IDFlNjsKKyAgICAgIHkyID0gZS5jIC0gZS5hICogeDI7CisgICAgfQorICAgIHZhciB2MSA9IFt4MSwgeTFdLAorICAgICAgICB2MiA9IFt4MiwgeTJdOworICAgIHBvbHlnb25zW2UucmVnaW9uLmwuaW5kZXhdLnB1c2godjEsIHYyKTsKKyAgICBwb2x5Z29uc1tlLnJlZ2lvbi5yLmluZGV4XS5wdXNoKHYxLCB2Mik7CisgIH0pOworCisgIC8vIFJlY29ubmVjdCB0aGUgcG9seWdvbiBzZWdtZW50cyBpbnRvIGNvdW50ZXJjbG9ja3dpc2UgbG9vcHMuCisgIHJldHVybiBwb2x5Z29ucy5tYXAoZnVuY3Rpb24ocG9seWdvbiwgaSkgeworICAgIHZhciBjeCA9IHZlcnRpY2VzW2ldWzBdLAorICAgICAgICBjeSA9IHZlcnRpY2VzW2ldWzFdOworICAgIHBvbHlnb24uZm9yRWFjaChmdW5jdGlvbih2KSB7CisgICAgICB2LmFuZ2xlID0gTWF0aC5hdGFuMih2WzBdIC0gY3gsIHZbMV0gLSBjeSk7CisgICAgfSk7CisgICAgcmV0dXJuIHBvbHlnb24uc29ydChmdW5jdGlvbihhLCBiKSB7CisgICAgICByZXR1cm4gYS5hbmdsZSAtIGIuYW5nbGU7CisgICAgfSkuZmlsdGVyKGZ1bmN0aW9uKGQsIGkpIHsKKyAgICAgIHJldHVybiAhaSB8fCAoZC5hbmdsZSAtIHBvbHlnb25baSAtIDFdLmFuZ2xlID4gMWUtMTApOworICAgIH0pOworICB9KTsKK307CisKK3ZhciBkM192b3Jvbm9pX29wcG9zaXRlID0geyJsIjogInIiLCAiciI6ICJsIn07CisKK2Z1bmN0aW9uIGQzX3Zvcm9ub2lfdGVzc2VsbGF0ZSh2ZXJ0aWNlcywgY2FsbGJhY2spIHsKKworICB2YXIgU2l0ZXMgPSB7CisgICAgbGlzdDogdmVydGljZXMKKyAgICAgIC5tYXAoZnVuY3Rpb24odiwgaSkgeworICAgICAgICByZXR1cm4geworICAgICAgICAgIGluZGV4OiBpLAorICAgICAgICAgIHg6IHZbMF0sCisgICAgICAgICAgeTogdlsxXQorICAgICAgICB9OworICAgICAgfSkKKyAgICAgIC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKKyAgICAgICAgcmV0dXJuIGEueSA8IGIueSA/IC0xCisgICAgICAgICAgOiBhLnkgPiBiLnkgPyAxCisgICAgICAgICAgOiBhLnggPCBiLnggPyAtMQorICAgICAgICAgIDogYS54ID4gYi54ID8gMQorICAgICAgICAgIDogMDsKKyAgICAgIH0pLAorICAgIGJvdHRvbVNpdGU6IG51bGwKKyAgfTsKKworICB2YXIgRWRnZUxpc3QgPSB7CisgICAgbGlzdDogW10sCisgICAgbGVmdEVuZDogbnVsbCwKKyAgICByaWdodEVuZDogbnVsbCwKKworICAgIGluaXQ6IGZ1bmN0aW9uKCkgeworICAgICAgRWRnZUxpc3QubGVmdEVuZCA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKG51bGwsICJsIik7CisgICAgICBFZGdlTGlzdC5yaWdodEVuZCA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKG51bGwsICJsIik7CisgICAgICBFZGdlTGlzdC5sZWZ0RW5kLnIgPSBFZGdlTGlzdC5yaWdodEVuZDsKKyAgICAgIEVkZ2VMaXN0LnJpZ2h0RW5kLmwgPSBFZGdlTGlzdC5sZWZ0RW5kOworICAgICAgRWRnZUxpc3QubGlzdC51bnNoaWZ0KEVkZ2VMaXN0LmxlZnRFbmQsIEVkZ2VMaXN0LnJpZ2h0RW5kKTsKKyAgICB9LAorCisgICAgY3JlYXRlSGFsZkVkZ2U6IGZ1bmN0aW9uKGVkZ2UsIHNpZGUpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIGVkZ2U6IGVkZ2UsCisgICAgICAgIHNpZGU6IHNpZGUsCisgICAgICAgIHZlcnRleDogbnVsbCwKKyAgICAgICAgImwiOiBudWxsLAorICAgICAgICAiciI6IG51bGwKKyAgICAgIH07CisgICAgfSwKKworICAgIGluc2VydDogZnVuY3Rpb24obGIsIGhlKSB7CisgICAgICBoZS5sID0gbGI7CisgICAgICBoZS5yID0gbGIucjsKKyAgICAgIGxiLnIubCA9IGhlOworICAgICAgbGIuciA9IGhlOworICAgIH0sCisKKyAgICBsZWZ0Qm91bmQ6IGZ1bmN0aW9uKHApIHsKKyAgICAgIHZhciBoZSA9IEVkZ2VMaXN0LmxlZnRFbmQ7CisgICAgICBkbyB7CisgICAgICAgIGhlID0gaGUucjsKKyAgICAgIH0gd2hpbGUgKGhlICE9IEVkZ2VMaXN0LnJpZ2h0RW5kICYmIEdlb20ucmlnaHRPZihoZSwgcCkpOworICAgICAgaGUgPSBoZS5sOworICAgICAgcmV0dXJuIGhlOworICAgIH0sCisKKyAgICBkZWw6IGZ1bmN0aW9uKGhlKSB7CisgICAgICBoZS5sLnIgPSBoZS5yOworICAgICAgaGUuci5sID0gaGUubDsKKyAgICAgIGhlLmVkZ2UgPSBudWxsOworICAgIH0sCisKKyAgICByaWdodDogZnVuY3Rpb24oaGUpIHsKKyAgICAgIHJldHVybiBoZS5yOworICAgIH0sCisKKyAgICBsZWZ0OiBmdW5jdGlvbihoZSkgeworICAgICAgcmV0dXJuIGhlLmw7CisgICAgfSwKKworICAgIGxlZnRSZWdpb246IGZ1bmN0aW9uKGhlKSB7CisgICAgICByZXR1cm4gaGUuZWRnZSA9PSBudWxsCisgICAgICAgICAgPyBTaXRlcy5ib3R0b21TaXRlCisgICAgICAgICAgOiBoZS5lZGdlLnJlZ2lvbltoZS5zaWRlXTsKKyAgICB9LAorCisgICAgcmlnaHRSZWdpb246IGZ1bmN0aW9uKGhlKSB7CisgICAgICByZXR1cm4gaGUuZWRnZSA9PSBudWxsCisgICAgICAgICAgPyBTaXRlcy5ib3R0b21TaXRlCisgICAgICAgICAgOiBoZS5lZGdlLnJlZ2lvbltkM192b3Jvbm9pX29wcG9zaXRlW2hlLnNpZGVdXTsKKyAgICB9CisgIH07CisKKyAgdmFyIEdlb20gPSB7CisKKyAgICBiaXNlY3Q6IGZ1bmN0aW9uKHMxLCBzMikgeworICAgICAgdmFyIG5ld0VkZ2UgPSB7CisgICAgICAgIHJlZ2lvbjogeyJsIjogczEsICJyIjogczJ9LAorICAgICAgICBlcDogeyJsIjogbnVsbCwgInIiOiBudWxsfQorICAgICAgfTsKKworICAgICAgdmFyIGR4ID0gczIueCAtIHMxLngsCisgICAgICAgICAgZHkgPSBzMi55IC0gczEueSwKKyAgICAgICAgICBhZHggPSBkeCA+IDAgPyBkeCA6IC1keCwKKyAgICAgICAgICBhZHkgPSBkeSA+IDAgPyBkeSA6IC1keTsKKworICAgICAgbmV3RWRnZS5jID0gczEueCAqIGR4ICsgczEueSAqIGR5CisgICAgICAgICAgKyAoZHggKiBkeCArIGR5ICogZHkpICogLjU7CisKKyAgICAgIGlmIChhZHggPiBhZHkpIHsKKyAgICAgICAgbmV3RWRnZS5hID0gMTsKKyAgICAgICAgbmV3RWRnZS5iID0gZHkgLyBkeDsKKyAgICAgICAgbmV3RWRnZS5jIC89IGR4OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3RWRnZS5iID0gMTsKKyAgICAgICAgbmV3RWRnZS5hID0gZHggLyBkeTsKKyAgICAgICAgbmV3RWRnZS5jIC89IGR5OworICAgICAgfQorCisgICAgICByZXR1cm4gbmV3RWRnZTsKKyAgICB9LAorCisgICAgaW50ZXJzZWN0OiBmdW5jdGlvbihlbDEsIGVsMikgeworICAgICAgdmFyIGUxID0gZWwxLmVkZ2UsCisgICAgICAgICAgZTIgPSBlbDIuZWRnZTsKKyAgICAgIGlmICghZTEgfHwgIWUyIHx8IChlMS5yZWdpb24uciA9PSBlMi5yZWdpb24ucikpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICB2YXIgZCA9IChlMS5hICogZTIuYikgLSAoZTEuYiAqIGUyLmEpOworICAgICAgaWYgKE1hdGguYWJzKGQpIDwgMWUtMTApIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICB2YXIgeGludCA9IChlMS5jICogZTIuYiAtIGUyLmMgKiBlMS5iKSAvIGQsCisgICAgICAgICAgeWludCA9IChlMi5jICogZTEuYSAtIGUxLmMgKiBlMi5hKSAvIGQsCisgICAgICAgICAgZTFyID0gZTEucmVnaW9uLnIsCisgICAgICAgICAgZTJyID0gZTIucmVnaW9uLnIsCisgICAgICAgICAgZWwsCisgICAgICAgICAgZTsKKyAgICAgIGlmICgoZTFyLnkgPCBlMnIueSkgfHwKKyAgICAgICAgIChlMXIueSA9PSBlMnIueSAmJiBlMXIueCA8IGUyci54KSkgeworICAgICAgICBlbCA9IGVsMTsKKyAgICAgICAgZSA9IGUxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZWwgPSBlbDI7CisgICAgICAgIGUgPSBlMjsKKyAgICAgIH0KKyAgICAgIHZhciByaWdodE9mU2l0ZSA9ICh4aW50ID49IGUucmVnaW9uLnIueCk7CisgICAgICBpZiAoKHJpZ2h0T2ZTaXRlICYmIChlbC5zaWRlID09PSAibCIpKSB8fAorICAgICAgICAoIXJpZ2h0T2ZTaXRlICYmIChlbC5zaWRlID09PSAiciIpKSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIHJldHVybiB7CisgICAgICAgIHg6IHhpbnQsCisgICAgICAgIHk6IHlpbnQKKyAgICAgIH07CisgICAgfSwKKworICAgIHJpZ2h0T2Y6IGZ1bmN0aW9uKGhlLCBwKSB7CisgICAgICB2YXIgZSA9IGhlLmVkZ2UsCisgICAgICAgICAgdG9wc2l0ZSA9IGUucmVnaW9uLnIsCisgICAgICAgICAgcmlnaHRPZlNpdGUgPSAocC54ID4gdG9wc2l0ZS54KTsKKworICAgICAgaWYgKHJpZ2h0T2ZTaXRlICYmIChoZS5zaWRlID09PSAibCIpKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgaWYgKCFyaWdodE9mU2l0ZSAmJiAoaGUuc2lkZSA9PT0gInIiKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmIChlLmEgPT09IDEpIHsKKyAgICAgICAgdmFyIGR5cCA9IHAueSAtIHRvcHNpdGUueSwKKyAgICAgICAgICAgIGR4cCA9IHAueCAtIHRvcHNpdGUueCwKKyAgICAgICAgICAgIGZhc3QgPSAwLAorICAgICAgICAgICAgYWJvdmUgPSAwOworCisgICAgICAgIGlmICgoIXJpZ2h0T2ZTaXRlICYmIChlLmIgPCAwKSkgfHwKKyAgICAgICAgICAocmlnaHRPZlNpdGUgJiYgKGUuYiA+PSAwKSkpIHsKKyAgICAgICAgICBhYm92ZSA9IGZhc3QgPSAoZHlwID49IGUuYiAqIGR4cCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWJvdmUgPSAoKHAueCArIHAueSAqIGUuYikgPiBlLmMpOworICAgICAgICAgIGlmIChlLmIgPCAwKSB7CisgICAgICAgICAgICBhYm92ZSA9ICFhYm92ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFhYm92ZSkgeworICAgICAgICAgICAgZmFzdCA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZmFzdCkgeworICAgICAgICAgIHZhciBkeHMgPSB0b3BzaXRlLnggLSBlLnJlZ2lvbi5sLng7CisgICAgICAgICAgYWJvdmUgPSAoZS5iICogKGR4cCAqIGR4cCAtIGR5cCAqIGR5cCkpIDwKKyAgICAgICAgICAgIChkeHMgKiBkeXAgKiAoMSArIDIgKiBkeHAgLyBkeHMgKyBlLmIgKiBlLmIpKTsKKworICAgICAgICAgIGlmIChlLmIgPCAwKSB7CisgICAgICAgICAgICBhYm92ZSA9ICFhYm92ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSAvKiBlLmIgPT0gMSAqLyB7CisgICAgICAgIHZhciB5bCA9IGUuYyAtIGUuYSAqIHAueCwKKyAgICAgICAgICAgIHQxID0gcC55IC0geWwsCisgICAgICAgICAgICB0MiA9IHAueCAtIHRvcHNpdGUueCwKKyAgICAgICAgICAgIHQzID0geWwgLSB0b3BzaXRlLnk7CisKKyAgICAgICAgYWJvdmUgPSAodDEgKiB0MSkgPiAodDIgKiB0MiArIHQzICogdDMpOworICAgICAgfQorICAgICAgcmV0dXJuIGhlLnNpZGUgPT09ICJsIiA/IGFib3ZlIDogIWFib3ZlOworICAgIH0sCisKKyAgICBlbmRQb2ludDogZnVuY3Rpb24oZWRnZSwgc2lkZSwgc2l0ZSkgeworICAgICAgZWRnZS5lcFtzaWRlXSA9IHNpdGU7CisgICAgICBpZiAoIWVkZ2UuZXBbZDNfdm9yb25vaV9vcHBvc2l0ZVtzaWRlXV0pIHJldHVybjsKKyAgICAgIGNhbGxiYWNrKGVkZ2UpOworICAgIH0sCisKKyAgICBkaXN0YW5jZTogZnVuY3Rpb24ocywgdCkgeworICAgICAgdmFyIGR4ID0gcy54IC0gdC54LAorICAgICAgICAgIGR5ID0gcy55IC0gdC55OworICAgICAgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7CisgICAgfQorICB9OworCisgIHZhciBFdmVudFF1ZXVlID0geworICAgIGxpc3Q6IFtdLAorCisgICAgaW5zZXJ0OiBmdW5jdGlvbihoZSwgc2l0ZSwgb2Zmc2V0KSB7CisgICAgICBoZS52ZXJ0ZXggPSBzaXRlOworICAgICAgaGUueXN0YXIgPSBzaXRlLnkgKyBvZmZzZXQ7CisgICAgICBmb3IgKHZhciBpPTAsIGxpc3Q9RXZlbnRRdWV1ZS5saXN0LCBsPWxpc3QubGVuZ3RoOyBpPGw7IGkrKykgeworICAgICAgICB2YXIgbmV4dCA9IGxpc3RbaV07CisgICAgICAgIGlmIChoZS55c3RhciA+IG5leHQueXN0YXIgfHwKKyAgICAgICAgICAoaGUueXN0YXIgPT0gbmV4dC55c3RhciAmJgorICAgICAgICAgIHNpdGUueCA+IG5leHQudmVydGV4LngpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxpc3Quc3BsaWNlKGksIDAsIGhlKTsKKyAgICB9LAorCisgICAgZGVsOiBmdW5jdGlvbihoZSkgeworICAgICAgZm9yICh2YXIgaT0wLCBscz1FdmVudFF1ZXVlLmxpc3QsIGw9bHMubGVuZ3RoOyBpPGwgJiYgKGxzW2ldICE9IGhlKTsgKytpKSB7fQorICAgICAgbHMuc3BsaWNlKGksIDEpOworICAgIH0sCisKKyAgICBlbXB0eTogZnVuY3Rpb24oKSB7IHJldHVybiBFdmVudFF1ZXVlLmxpc3QubGVuZ3RoID09PSAwOyB9LAorCisgICAgbmV4dEV2ZW50OiBmdW5jdGlvbihoZSkgeworICAgICAgZm9yICh2YXIgaT0wLCBscz1FdmVudFF1ZXVlLmxpc3QsIGw9bHMubGVuZ3RoOyBpPGw7ICsraSkgeworICAgICAgICBpZiAobHNbaV0gPT0gaGUpIHJldHVybiBsc1tpKzFdOworICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKworICAgIG1pbjogZnVuY3Rpb24oKSB7CisgICAgICB2YXIgZWxlbSA9IEV2ZW50UXVldWUubGlzdFswXTsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHg6IGVsZW0udmVydGV4LngsCisgICAgICAgIHk6IGVsZW0ueXN0YXIKKyAgICAgIH07CisgICAgfSwKKworICAgIGV4dHJhY3RNaW46IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIEV2ZW50UXVldWUubGlzdC5zaGlmdCgpOworICAgIH0KKyAgfTsKKworICBFZGdlTGlzdC5pbml0KCk7CisgIFNpdGVzLmJvdHRvbVNpdGUgPSBTaXRlcy5saXN0LnNoaWZ0KCk7CisKKyAgdmFyIG5ld1NpdGUgPSBTaXRlcy5saXN0LnNoaWZ0KCksIG5ld0ludFN0YXI7CisgIHZhciBsYm5kLCByYm5kLCBsbGJuZCwgcnJibmQsIGJpc2VjdG9yOworICB2YXIgYm90LCB0b3AsIHRlbXAsIHAsIHY7CisgIHZhciBlLCBwbTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICghRXZlbnRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICBuZXdJbnRTdGFyID0gRXZlbnRRdWV1ZS5taW4oKTsKKyAgICB9CisgICAgaWYgKG5ld1NpdGUgJiYgKEV2ZW50UXVldWUuZW1wdHkoKQorICAgICAgfHwgbmV3U2l0ZS55IDwgbmV3SW50U3Rhci55CisgICAgICB8fCAobmV3U2l0ZS55ID09IG5ld0ludFN0YXIueQorICAgICAgJiYgbmV3U2l0ZS54IDwgbmV3SW50U3Rhci54KSkpIHsgLy9uZXcgc2l0ZSBpcyBzbWFsbGVzdAorICAgICAgbGJuZCA9IEVkZ2VMaXN0LmxlZnRCb3VuZChuZXdTaXRlKTsKKyAgICAgIHJibmQgPSBFZGdlTGlzdC5yaWdodChsYm5kKTsKKyAgICAgIGJvdCA9IEVkZ2VMaXN0LnJpZ2h0UmVnaW9uKGxibmQpOworICAgICAgZSA9IEdlb20uYmlzZWN0KGJvdCwgbmV3U2l0ZSk7CisgICAgICBiaXNlY3RvciA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKGUsICJsIik7CisgICAgICBFZGdlTGlzdC5pbnNlcnQobGJuZCwgYmlzZWN0b3IpOworICAgICAgcCA9IEdlb20uaW50ZXJzZWN0KGxibmQsIGJpc2VjdG9yKTsKKyAgICAgIGlmIChwKSB7CisgICAgICAgIEV2ZW50UXVldWUuZGVsKGxibmQpOworICAgICAgICBFdmVudFF1ZXVlLmluc2VydChsYm5kLCBwLCBHZW9tLmRpc3RhbmNlKHAsIG5ld1NpdGUpKTsKKyAgICAgIH0KKyAgICAgIGxibmQgPSBiaXNlY3RvcjsKKyAgICAgIGJpc2VjdG9yID0gRWRnZUxpc3QuY3JlYXRlSGFsZkVkZ2UoZSwgInIiKTsKKyAgICAgIEVkZ2VMaXN0Lmluc2VydChsYm5kLCBiaXNlY3Rvcik7CisgICAgICBwID0gR2VvbS5pbnRlcnNlY3QoYmlzZWN0b3IsIHJibmQpOworICAgICAgaWYgKHApIHsKKyAgICAgICAgRXZlbnRRdWV1ZS5pbnNlcnQoYmlzZWN0b3IsIHAsIEdlb20uZGlzdGFuY2UocCwgbmV3U2l0ZSkpOworICAgICAgfQorICAgICAgbmV3U2l0ZSA9IFNpdGVzLmxpc3Quc2hpZnQoKTsKKyAgICB9IGVsc2UgaWYgKCFFdmVudFF1ZXVlLmVtcHR5KCkpIHsgLy9pbnRlcnNlY3Rpb24gaXMgc21hbGxlc3QKKyAgICAgIGxibmQgPSBFdmVudFF1ZXVlLmV4dHJhY3RNaW4oKTsKKyAgICAgIGxsYm5kID0gRWRnZUxpc3QubGVmdChsYm5kKTsKKyAgICAgIHJibmQgPSBFZGdlTGlzdC5yaWdodChsYm5kKTsKKyAgICAgIHJyYm5kID0gRWRnZUxpc3QucmlnaHQocmJuZCk7CisgICAgICBib3QgPSBFZGdlTGlzdC5sZWZ0UmVnaW9uKGxibmQpOworICAgICAgdG9wID0gRWRnZUxpc3QucmlnaHRSZWdpb24ocmJuZCk7CisgICAgICB2ID0gbGJuZC52ZXJ0ZXg7CisgICAgICBHZW9tLmVuZFBvaW50KGxibmQuZWRnZSwgbGJuZC5zaWRlLCB2KTsKKyAgICAgIEdlb20uZW5kUG9pbnQocmJuZC5lZGdlLCByYm5kLnNpZGUsIHYpOworICAgICAgRWRnZUxpc3QuZGVsKGxibmQpOworICAgICAgRXZlbnRRdWV1ZS5kZWwocmJuZCk7CisgICAgICBFZGdlTGlzdC5kZWwocmJuZCk7CisgICAgICBwbSA9ICJsIjsKKyAgICAgIGlmIChib3QueSA+IHRvcC55KSB7CisgICAgICAgIHRlbXAgPSBib3Q7CisgICAgICAgIGJvdCA9IHRvcDsKKyAgICAgICAgdG9wID0gdGVtcDsKKyAgICAgICAgcG0gPSAiciI7CisgICAgICB9CisgICAgICBlID0gR2VvbS5iaXNlY3QoYm90LCB0b3ApOworICAgICAgYmlzZWN0b3IgPSBFZGdlTGlzdC5jcmVhdGVIYWxmRWRnZShlLCBwbSk7CisgICAgICBFZGdlTGlzdC5pbnNlcnQobGxibmQsIGJpc2VjdG9yKTsKKyAgICAgIEdlb20uZW5kUG9pbnQoZSwgZDNfdm9yb25vaV9vcHBvc2l0ZVtwbV0sIHYpOworICAgICAgcCA9IEdlb20uaW50ZXJzZWN0KGxsYm5kLCBiaXNlY3Rvcik7CisgICAgICBpZiAocCkgeworICAgICAgICBFdmVudFF1ZXVlLmRlbChsbGJuZCk7CisgICAgICAgIEV2ZW50UXVldWUuaW5zZXJ0KGxsYm5kLCBwLCBHZW9tLmRpc3RhbmNlKHAsIGJvdCkpOworICAgICAgfQorICAgICAgcCA9IEdlb20uaW50ZXJzZWN0KGJpc2VjdG9yLCBycmJuZCk7CisgICAgICBpZiAocCkgeworICAgICAgICBFdmVudFF1ZXVlLmluc2VydChiaXNlY3RvciwgcCwgR2VvbS5kaXN0YW5jZShwLCBib3QpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9Ly9lbmQgd2hpbGUKKworICBmb3IgKGxibmQgPSBFZGdlTGlzdC5yaWdodChFZGdlTGlzdC5sZWZ0RW5kKTsKKyAgICAgIGxibmQgIT0gRWRnZUxpc3QucmlnaHRFbmQ7CisgICAgICBsYm5kID0gRWRnZUxpc3QucmlnaHQobGJuZCkpIHsKKyAgICBjYWxsYmFjayhsYm5kLmVkZ2UpOworICB9Cit9CisvKioKKyogQHBhcmFtIHZlcnRpY2VzIFtbeDEsIHkxXSwgW3gyLCB5Ml0sIOKApl0KKyogQHJldHVybnMgdHJpYW5nbGVzIFtbW3gxLCB5MV0sIFt4MiwgeTJdLCBbeDMsIHkzXV0sIOKApl0KKyAqLworZDMuZ2VvbS5kZWxhdW5heSA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7CisgIHZhciBlZGdlcyA9IHZlcnRpY2VzLm1hcChmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9KSwKKyAgICAgIHRyaWFuZ2xlcyA9IFtdOworCisgIC8vIFVzZSB0aGUgVm9yb25vaSB0ZXNzZWxsYXRpb24gdG8gZGV0ZXJtaW5lIERlbGF1bmF5IGVkZ2VzLgorICBkM192b3Jvbm9pX3Rlc3NlbGxhdGUodmVydGljZXMsIGZ1bmN0aW9uKGUpIHsKKyAgICBlZGdlc1tlLnJlZ2lvbi5sLmluZGV4XS5wdXNoKHZlcnRpY2VzW2UucmVnaW9uLnIuaW5kZXhdKTsKKyAgfSk7CisKKyAgLy8gUmVjb25uZWN0IHRoZSBlZGdlcyBpbnRvIGNvdW50ZXJjbG9ja3dpc2UgdHJpYW5nbGVzLgorICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2UsIGkpIHsKKyAgICB2YXIgdiA9IHZlcnRpY2VzW2ldLAorICAgICAgICBjeCA9IHZbMF0sCisgICAgICAgIGN5ID0gdlsxXTsKKyAgICBlZGdlLmZvckVhY2goZnVuY3Rpb24odikgeworICAgICAgdi5hbmdsZSA9IE1hdGguYXRhbjIodlswXSAtIGN4LCB2WzFdIC0gY3kpOworICAgIH0pOworICAgIGVkZ2Uuc29ydChmdW5jdGlvbihhLCBiKSB7CisgICAgICByZXR1cm4gYS5hbmdsZSAtIGIuYW5nbGU7CisgICAgfSk7CisgICAgZm9yICh2YXIgaiA9IDAsIG0gPSBlZGdlLmxlbmd0aCAtIDE7IGogPCBtOyBqKyspIHsKKyAgICAgIHRyaWFuZ2xlcy5wdXNoKFt2LCBlZGdlW2pdLCBlZGdlW2ogKyAxXV0pOworICAgIH0KKyAgfSk7CisKKyAgcmV0dXJuIHRyaWFuZ2xlczsKK307CisvLyBDb25zdHJ1Y3RzIGEgbmV3IHF1YWR0cmVlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5IG9mIHBvaW50cy4gQSBxdWFkdHJlZSBpcyBhCisvLyB0d28tZGltZW5zaW9uYWwgcmVjdXJzaXZlIHNwYXRpYWwgc3ViZGl2aXNpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworLy8gc3F1YXJlIHBhcnRpdGlvbnMsIGRpdmlkaW5nIGVhY2ggc3F1YXJlIGludG8gZm91ciBlcXVhbGx5LXNpemVkIHNxdWFyZXMuIEVhY2gKKy8vIHBvaW50IGV4aXN0cyBpbiBhIHVuaXF1ZSBub2RlOyBpZiBtdWx0aXBsZSBwb2ludHMgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uLAorLy8gc29tZSBwb2ludHMgbWF5IGJlIHN0b3JlZCBvbiBpbnRlcm5hbCBub2RlcyByYXRoZXIgdGhhbiBsZWFmIG5vZGVzLiBRdWFkdHJlZXMKKy8vIGNhbiBiZSB1c2VkIHRvIGFjY2VsZXJhdGUgdmFyaW91cyBzcGF0aWFsIG9wZXJhdGlvbnMsIHN1Y2ggYXMgdGhlIEJhcm5lcy1IdXQKKy8vIGFwcHJveGltYXRpb24gZm9yIGNvbXB1dGluZyBuLWJvZHkgZm9yY2VzLCBvciBjb2xsaXNpb24gZGV0ZWN0aW9uLgorZDMuZ2VvbS5xdWFkdHJlZSA9IGZ1bmN0aW9uKHBvaW50cywgeDEsIHkxLCB4MiwgeTIpIHsKKyAgdmFyIHAsCisgICAgICBpID0gLTEsCisgICAgICBuID0gcG9pbnRzLmxlbmd0aDsKKworICAvLyBUeXBlIGNvbnZlcnNpb24gZm9yIGRlcHJlY2F0ZWQgQVBJLgorICBpZiAobiAmJiBpc05hTihwb2ludHNbMF0ueCkpIHBvaW50cyA9IHBvaW50cy5tYXAoZDNfZ2VvbV9xdWFkdHJlZVBvaW50KTsKKworICAvLyBBbGxvdyBib3VuZHMgdG8gYmUgc3BlY2lmaWVkIGV4cGxpY2l0bHkuCisgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNSkgeworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7CisgICAgICB5MiA9IHgyID0geTE7CisgICAgICB5MSA9IHgxOworICAgIH0gZWxzZSB7CisgICAgICB4MSA9IHkxID0gSW5maW5pdHk7CisgICAgICB4MiA9IHkyID0gLUluZmluaXR5OworCisgICAgICAvLyBDb21wdXRlIGJvdW5kcy4KKyAgICAgIHdoaWxlICgrK2kgPCBuKSB7CisgICAgICAgIHAgPSBwb2ludHNbaV07CisgICAgICAgIGlmIChwLnggPCB4MSkgeDEgPSBwLng7CisgICAgICAgIGlmIChwLnkgPCB5MSkgeTEgPSBwLnk7CisgICAgICAgIGlmIChwLnggPiB4MikgeDIgPSBwLng7CisgICAgICAgIGlmIChwLnkgPiB5MikgeTIgPSBwLnk7CisgICAgICB9CisKKyAgICAgIC8vIFNxdWFyaWZ5IHRoZSBib3VuZHMuCisgICAgICB2YXIgZHggPSB4MiAtIHgxLAorICAgICAgICAgIGR5ID0geTIgLSB5MTsKKyAgICAgIGlmIChkeCA+IGR5KSB5MiA9IHkxICsgZHg7CisgICAgICBlbHNlIHgyID0geDEgKyBkeTsKKyAgICB9CisgIH0KKworICAvLyBSZWN1cnNpdmVseSBpbnNlcnRzIHRoZSBzcGVjaWZpZWQgcG9pbnQgcCBhdCB0aGUgbm9kZSBuIG9yIG9uZSBvZiBpdHMKKyAgLy8gZGVzY2VuZGFudHMuIFRoZSBib3VuZHMgYXJlIGRlZmluZWQgYnkgW3gxLCB4Ml0gYW5kIFt5MSwgeTJdLgorICBmdW5jdGlvbiBpbnNlcnQobiwgcCwgeDEsIHkxLCB4MiwgeTIpIHsKKyAgICBpZiAoaXNOYU4ocC54KSB8fCBpc05hTihwLnkpKSByZXR1cm47IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50cworICAgIGlmIChuLmxlYWYpIHsKKyAgICAgIHZhciB2ID0gbi5wb2ludDsKKyAgICAgIGlmICh2KSB7CisgICAgICAgIC8vIElmIHRoZSBwb2ludCBhdCB0aGlzIGxlYWYgbm9kZSBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgbmV3CisgICAgICAgIC8vIHBvaW50IHdlIGFyZSBhZGRpbmcsIHdlIGxlYXZlIHRoZSBwb2ludCBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICAgIC8vIGludGVybmFsIG5vZGUgd2hpbGUgYWRkaW5nIHRoZSBuZXcgcG9pbnQgdG8gYSBjaGlsZCBub2RlLiBUaGlzCisgICAgICAgIC8vIGF2b2lkcyBpbmZpbml0ZSByZWN1cnNpb24uCisgICAgICAgIGlmICgoTWF0aC5hYnModi54IC0gcC54KSArIE1hdGguYWJzKHYueSAtIHAueSkpIDwgLjAxKSB7CisgICAgICAgICAgaW5zZXJ0Q2hpbGQobiwgcCwgeDEsIHkxLCB4MiwgeTIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG4ucG9pbnQgPSBudWxsOworICAgICAgICAgIGluc2VydENoaWxkKG4sIHYsIHgxLCB5MSwgeDIsIHkyKTsKKyAgICAgICAgICBpbnNlcnRDaGlsZChuLCBwLCB4MSwgeTEsIHgyLCB5Mik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG4ucG9pbnQgPSBwOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbnNlcnRDaGlsZChuLCBwLCB4MSwgeTEsIHgyLCB5Mik7CisgICAgfQorICB9CisKKyAgLy8gUmVjdXJzaXZlbHkgaW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBvaW50IHAgaW50byBhIGRlc2NlbmRhbnQgb2Ygbm9kZSBuLiBUaGUKKyAgLy8gYm91bmRzIGFyZSBkZWZpbmVkIGJ5IFt4MSwgeDJdIGFuZCBbeTEsIHkyXS4KKyAgZnVuY3Rpb24gaW5zZXJ0Q2hpbGQobiwgcCwgeDEsIHkxLCB4MiwgeTIpIHsKKyAgICAvLyBDb21wdXRlIHRoZSBzcGxpdCBwb2ludCwgYW5kIHRoZSBxdWFkcmFudCBpbiB3aGljaCB0byBpbnNlcnQgcC4KKyAgICB2YXIgc3ggPSAoeDEgKyB4MikgKiAuNSwKKyAgICAgICAgc3kgPSAoeTEgKyB5MikgKiAuNSwKKyAgICAgICAgcmlnaHQgPSBwLnggPj0gc3gsCisgICAgICAgIGJvdHRvbSA9IHAueSA+PSBzeSwKKyAgICAgICAgaSA9IChib3R0b20gPDwgMSkgKyByaWdodDsKKworICAgIC8vIFJlY3Vyc2l2ZWx5IGluc2VydCBpbnRvIHRoZSBjaGlsZCBub2RlLgorICAgIG4ubGVhZiA9IGZhbHNlOworICAgIG4gPSBuLm5vZGVzW2ldIHx8IChuLm5vZGVzW2ldID0gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKSk7CisKKyAgICAvLyBVcGRhdGUgdGhlIGJvdW5kcyBhcyB3ZSByZWN1cnNlLgorICAgIGlmIChyaWdodCkgeDEgPSBzeDsgZWxzZSB4MiA9IHN4OworICAgIGlmIChib3R0b20pIHkxID0gc3k7IGVsc2UgeTIgPSBzeTsKKyAgICBpbnNlcnQobiwgcCwgeDEsIHkxLCB4MiwgeTIpOworICB9CisKKyAgLy8gQ3JlYXRlIHRoZSByb290IG5vZGUuCisgIHZhciByb290ID0gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKTsKKworICByb290LmFkZCA9IGZ1bmN0aW9uKHApIHsKKyAgICBpbnNlcnQocm9vdCwgcCwgeDEsIHkxLCB4MiwgeTIpOworICB9OworCisgIHJvb3QudmlzaXQgPSBmdW5jdGlvbihmKSB7CisgICAgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIHJvb3QsIHgxLCB5MSwgeDIsIHkyKTsKKyAgfTsKKworICAvLyBJbnNlcnQgYWxsIHBvaW50cy4KKyAgcG9pbnRzLmZvckVhY2gocm9vdC5hZGQpOworICByZXR1cm4gcm9vdDsKK307CisKK2Z1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVOb2RlKCkgeworICByZXR1cm4geworICAgIGxlYWY6IHRydWUsCisgICAgbm9kZXM6IFtdLAorICAgIHBvaW50OiBudWxsCisgIH07Cit9CisKK2Z1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCBub2RlLCB4MSwgeTEsIHgyLCB5MikgeworICBpZiAoIWYobm9kZSwgeDEsIHkxLCB4MiwgeTIpKSB7CisgICAgdmFyIHN4ID0gKHgxICsgeDIpICogLjUsCisgICAgICAgIHN5ID0gKHkxICsgeTIpICogLjUsCisgICAgICAgIGNoaWxkcmVuID0gbm9kZS5ub2RlczsKKyAgICBpZiAoY2hpbGRyZW5bMF0pIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCBjaGlsZHJlblswXSwgeDEsIHkxLCBzeCwgc3kpOworICAgIGlmIChjaGlsZHJlblsxXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzFdLCBzeCwgeTEsIHgyLCBzeSk7CisgICAgaWYgKGNoaWxkcmVuWzJdKSBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgY2hpbGRyZW5bMl0sIHgxLCBzeSwgc3gsIHkyKTsKKyAgICBpZiAoY2hpbGRyZW5bM10pIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCBjaGlsZHJlblszXSwgc3gsIHN5LCB4MiwgeTIpOworICB9Cit9CisKK2Z1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVQb2ludChwKSB7CisgIHJldHVybiB7CisgICAgeDogcFswXSwKKyAgICB5OiBwWzFdCisgIH07Cit9CitkMy50aW1lID0ge307CisKK3ZhciBkM190aW1lID0gRGF0ZTsKKworZnVuY3Rpb24gZDNfdGltZV91dGMoKSB7CisgIHRoaXMuXyA9IG5ldyBEYXRlKGFyZ3VtZW50cy5sZW5ndGggPiAxCisgICAgICA/IERhdGUuVVRDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykKKyAgICAgIDogYXJndW1lbnRzWzBdKTsKK30KKworZDNfdGltZV91dGMucHJvdG90eXBlID0geworICBnZXREYXRlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRVVENEYXRlKCk7IH0sCisgIGdldERheTogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCk7IH0sCisgIGdldEZ1bGxZZWFyOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRVVENGdWxsWWVhcigpOyB9LAorICBnZXRIb3VyczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDSG91cnMoKTsgfSwKKyAgZ2V0TWlsbGlzZWNvbmRzOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKTsgfSwKKyAgZ2V0TWludXRlczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDTWludXRlcygpOyB9LAorICBnZXRNb250aDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDTW9udGgoKTsgfSwKKyAgZ2V0U2Vjb25kczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpOyB9LAorICBnZXRUaW1lOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRUaW1lKCk7IH0sCisgIGdldFRpbWV6b25lT2Zmc2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH0sCisgIHZhbHVlT2Y6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fLnZhbHVlT2YoKTsgfSwKKyAgc2V0RGF0ZTogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0RhdGUuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOyB9LAorICBzZXREYXk6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENEYXkuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOyB9LAorICBzZXRGdWxsWWVhcjogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsgfSwKKyAgc2V0SG91cnM6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENIb3Vycy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7IH0sCisgIHNldE1pbGxpc2Vjb25kczogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ01pbGxpc2Vjb25kcy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7IH0sCisgIHNldE1pbnV0ZXM6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsgfSwKKyAgc2V0TW9udGg6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNb250aC5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7IH0sCisgIHNldFNlY29uZHM6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENTZWNvbmRzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsgfSwKKyAgc2V0VGltZTogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFRpbWUuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOyB9Cit9OworCit2YXIgZDNfdGltZV9wcm90b3R5cGUgPSBEYXRlLnByb3RvdHlwZTsKK2QzLnRpbWUuZm9ybWF0ID0gZnVuY3Rpb24odGVtcGxhdGUpIHsKKyAgdmFyIG4gPSB0ZW1wbGF0ZS5sZW5ndGg7CisKKyAgZnVuY3Rpb24gZm9ybWF0KGRhdGUpIHsKKyAgICB2YXIgc3RyaW5nID0gW10sCisgICAgICAgIGkgPSAtMSwKKyAgICAgICAgaiA9IDAsCisgICAgICAgIGMsCisgICAgICAgIGY7CisgICAgd2hpbGUgKCsraSA8IG4pIHsKKyAgICAgIGlmICh0ZW1wbGF0ZS5jaGFyQ29kZUF0KGkpID09IDM3KSB7CisgICAgICAgIHN0cmluZy5wdXNoKAorICAgICAgICAgICAgdGVtcGxhdGUuc3Vic3RyaW5nKGosIGkpLAorICAgICAgICAgICAgKGYgPSBkM190aW1lX2Zvcm1hdHNbYyA9IHRlbXBsYXRlLmNoYXJBdCgrK2kpXSkKKyAgICAgICAgICAgID8gZihkYXRlKSA6IGMpOworICAgICAgICBqID0gaSArIDE7CisgICAgICB9CisgICAgfQorICAgIHN0cmluZy5wdXNoKHRlbXBsYXRlLnN1YnN0cmluZyhqLCBpKSk7CisgICAgcmV0dXJuIHN0cmluZy5qb2luKCIiKTsKKyAgfQorCisgIGZvcm1hdC5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgeworICAgIHZhciBkID0ge3k6IDE5MDAsIG06IDAsIGQ6IDEsIEg6IDAsIE06IDAsIFM6IDAsIEw6IDB9LAorICAgICAgICBpID0gZDNfdGltZV9wYXJzZShkLCB0ZW1wbGF0ZSwgc3RyaW5nLCAwKTsKKyAgICBpZiAoaSAhPSBzdHJpbmcubGVuZ3RoKSByZXR1cm4gbnVsbDsKKworICAgIC8vIFRoZSBhbS1wbSBmbGFnIGlzIDAgZm9yIEFNLCBhbmQgMSBmb3IgUE0uCisgICAgaWYgKCJwIiBpbiBkKSBkLkggPSBkLkggJSAxMiArIGQucCAqIDEyOworCisgICAgdmFyIGRhdGUgPSBuZXcgZDNfdGltZSgpOworICAgIGRhdGUuc2V0RnVsbFllYXIoZC55LCBkLm0sIGQuZCk7CisgICAgZGF0ZS5zZXRIb3VycyhkLkgsIGQuTSwgZC5TLCBkLkwpOworICAgIHJldHVybiBkYXRlOworICB9OworCisgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0ZW1wbGF0ZTsKKyAgfTsKKworICByZXR1cm4gZm9ybWF0OworfTsKKworZnVuY3Rpb24gZDNfdGltZV9wYXJzZShkYXRlLCB0ZW1wbGF0ZSwgc3RyaW5nLCBqKSB7CisgIHZhciBjLAorICAgICAgcCwKKyAgICAgIGkgPSAwLAorICAgICAgbiA9IHRlbXBsYXRlLmxlbmd0aCwKKyAgICAgIG0gPSBzdHJpbmcubGVuZ3RoOworICB3aGlsZSAoaSA8IG4pIHsKKyAgICBpZiAoaiA+PSBtKSByZXR1cm4gLTE7CisgICAgYyA9IHRlbXBsYXRlLmNoYXJDb2RlQXQoaSsrKTsKKyAgICBpZiAoYyA9PSAzNykgeworICAgICAgcCA9IGQzX3RpbWVfcGFyc2Vyc1t0ZW1wbGF0ZS5jaGFyQXQoaSsrKV07CisgICAgICBpZiAoIXAgfHwgKChqID0gcChkYXRlLCBzdHJpbmcsIGopKSA8IDApKSByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmIChjICE9IHN0cmluZy5jaGFyQ29kZUF0KGorKykpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGo7Cit9CisKK3ZhciBkM190aW1lX3pmaWxsMiA9IGQzLmZvcm1hdCgiMDJkIiksCisgICAgZDNfdGltZV96ZmlsbDMgPSBkMy5mb3JtYXQoIjAzZCIpLAorICAgIGQzX3RpbWVfemZpbGw0ID0gZDMuZm9ybWF0KCIwNGQiKSwKKyAgICBkM190aW1lX3NmaWxsMiA9IGQzLmZvcm1hdCgiMmQiKTsKKwordmFyIGQzX3RpbWVfZm9ybWF0cyA9IHsKKyAgYTogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV93ZWVrZGF5c1tkLmdldERheSgpXS5zdWJzdHJpbmcoMCwgMyk7IH0sCisgIEE6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfd2Vla2RheXNbZC5nZXREYXkoKV07IH0sCisgIGI6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfbW9udGhzW2QuZ2V0TW9udGgoKV0uc3Vic3RyaW5nKDAsIDMpOyB9LAorICBCOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX21vbnRoc1tkLmdldE1vbnRoKCldOyB9LAorICBjOiBkMy50aW1lLmZvcm1hdCgiJWEgJWIgJWUgJUg6JU06JVMgJVkiKSwKKyAgZDogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDIoZC5nZXREYXRlKCkpOyB9LAorICBlOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3NmaWxsMihkLmdldERhdGUoKSk7IH0sCisgIEg6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQuZ2V0SG91cnMoKSk7IH0sCisgIEk6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyKTsgfSwKKyAgajogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDMoMSArIGQzLnRpbWUuZGF5T2ZZZWFyKGQpKTsgfSwKKyAgTDogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDMoZC5nZXRNaWxsaXNlY29uZHMoKSk7IH0sCisgIG06IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQuZ2V0TW9udGgoKSArIDEpOyB9LAorICBNOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMihkLmdldE1pbnV0ZXMoKSk7IH0sCisgIHA6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0SG91cnMoKSA+PSAxMiA/ICJQTSIgOiAiQU0iOyB9LAorICBTOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMihkLmdldFNlY29uZHMoKSk7IH0sCisgIFU6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQzLnRpbWUuc3VuZGF5T2ZZZWFyKGQpKTsgfSwKKyAgdzogZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXREYXkoKTsgfSwKKyAgVzogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDIoZDMudGltZS5tb25kYXlPZlllYXIoZCkpOyB9LAorICB4OiBkMy50aW1lLmZvcm1hdCgiJW0vJWQvJXkiKSwKKyAgWDogZDMudGltZS5mb3JtYXQoIiVIOiVNOiVTIiksCisgIHk6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQuZ2V0RnVsbFllYXIoKSAlIDEwMCk7IH0sCisgIFk6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGw0KGQuZ2V0RnVsbFllYXIoKSAlIDEwMDAwKTsgfSwKKyAgWjogZDNfdGltZV96b25lLAorICAiJSI6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuICIlIjsgfQorfTsKKwordmFyIGQzX3RpbWVfcGFyc2VycyA9IHsKKyAgYTogZDNfdGltZV9wYXJzZVdlZWtkYXlBYmJyZXYsCisgIEE6IGQzX3RpbWVfcGFyc2VXZWVrZGF5LAorICBiOiBkM190aW1lX3BhcnNlTW9udGhBYmJyZXYsCisgIEI6IGQzX3RpbWVfcGFyc2VNb250aCwKKyAgYzogZDNfdGltZV9wYXJzZUxvY2FsZUZ1bGwsCisgIGQ6IGQzX3RpbWVfcGFyc2VEYXksCisgIGU6IGQzX3RpbWVfcGFyc2VEYXksCisgIEg6IGQzX3RpbWVfcGFyc2VIb3VyMjQsCisgIEk6IGQzX3RpbWVfcGFyc2VIb3VyMjQsCisgIC8vIGo6IGZ1bmN0aW9uKGQsIHMsIGkpIHsgLypUT0RPIGRheSBvZiB5ZWFyIFswMDEsMzY2XSAqLyByZXR1cm4gaTsgfSwKKyAgTDogZDNfdGltZV9wYXJzZU1pbGxpc2Vjb25kcywKKyAgbTogZDNfdGltZV9wYXJzZU1vbnRoTnVtYmVyLAorICBNOiBkM190aW1lX3BhcnNlTWludXRlcywKKyAgcDogZDNfdGltZV9wYXJzZUFtUG0sCisgIFM6IGQzX3RpbWVfcGFyc2VTZWNvbmRzLAorICAvLyBVOiBmdW5jdGlvbihkLCBzLCBpKSB7IC8qVE9ETyB3ZWVrIG51bWJlciAoc3VuZGF5KSBbMDAsNTNdICovIHJldHVybiBpOyB9LAorICAvLyB3OiBmdW5jdGlvbihkLCBzLCBpKSB7IC8qVE9ETyB3ZWVrZGF5IFswLDZdICovIHJldHVybiBpOyB9LAorICAvLyBXOiBmdW5jdGlvbihkLCBzLCBpKSB7IC8qVE9ETyB3ZWVrIG51bWJlciAobW9uZGF5KSBbMDAsNTNdICovIHJldHVybiBpOyB9LAorICB4OiBkM190aW1lX3BhcnNlTG9jYWxlRGF0ZSwKKyAgWDogZDNfdGltZV9wYXJzZUxvY2FsZVRpbWUsCisgIHk6IGQzX3RpbWVfcGFyc2VZZWFyLAorICBZOiBkM190aW1lX3BhcnNlRnVsbFllYXIKKyAgLy8gLAorICAvLyBaOiBmdW5jdGlvbihkLCBzLCBpKSB7IC8qVE9ETyB0aW1lIHpvbmUgKi8gcmV0dXJuIGk7IH0sCisgIC8vICIlIjogZnVuY3Rpb24oZCwgcywgaSkgeyAvKlRPRE8gbGl0ZXJhbCAlICovIHJldHVybiBpOyB9Cit9OworCisvLyBOb3RlOiB3ZWVrZGF5IGlzIHZhbGlkYXRlZCwgYnV0IGRvZXMgbm90IHNldCB0aGUgZGF0ZS4KK2Z1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrZGF5QWJicmV2KGRhdGUsIHN0cmluZywgaSkgeworICByZXR1cm4gZDNfdGltZV93ZWVrZGF5QWJicmV2UmUudGVzdChzdHJpbmcuc3Vic3RyaW5nKGksIGkgKz0gMykpID8gaSA6IC0xOworfQorCisvLyBOb3RlOiB3ZWVrZGF5IGlzIHZhbGlkYXRlZCwgYnV0IGRvZXMgbm90IHNldCB0aGUgZGF0ZS4KK2Z1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrZGF5KGRhdGUsIHN0cmluZywgaSkgeworICBkM190aW1lX3dlZWtkYXlSZS5sYXN0SW5kZXggPSAwOworICB2YXIgbiA9IGQzX3RpbWVfd2Vla2RheVJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMTApKTsKKyAgcmV0dXJuIG4gPyBpICs9IG5bMF0ubGVuZ3RoIDogLTE7Cit9CisKK3ZhciBkM190aW1lX3dlZWtkYXlBYmJyZXZSZSA9IC9eKD86c3VufG1vbnx0dWV8d2VkfHRodXxmcml8c2F0KS9pLAorICAgIGQzX3RpbWVfd2Vla2RheVJlID0gL14oPzpTdW5kYXl8TW9uZGF5fFR1ZXNkYXl8V2VkbmVzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheSkvaTsKKyAgICBkM190aW1lX3dlZWtkYXlzID0gWyJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSJdOworCitmdW5jdGlvbiBkM190aW1lX3BhcnNlTW9udGhBYmJyZXYoZGF0ZSwgc3RyaW5nLCBpKSB7CisgIHZhciBuID0gZDNfdGltZV9tb250aEFiYnJldkxvb2t1cC5nZXQoc3RyaW5nLnN1YnN0cmluZyhpLCBpICs9IDMpLnRvTG93ZXJDYXNlKCkpOworICByZXR1cm4gbiA9PSBudWxsID8gLTEgOiAoZGF0ZS5tID0gbiwgaSk7Cit9CisKK3ZhciBkM190aW1lX21vbnRoQWJicmV2TG9va3VwID0gZDMubWFwKHsKKyAgamFuOiAwLAorICBmZWI6IDEsCisgIG1hcjogMiwKKyAgYXByOiAzLAorICBtYXk6IDQsCisgIGp1bjogNSwKKyAganVsOiA2LAorICBhdWc6IDcsCisgIHNlcDogOCwKKyAgb2N0OiA5LAorICBub3Y6IDEwLAorICBkZWM6IDExCit9KTsKKworZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1vbnRoKGRhdGUsIHN0cmluZywgaSkgeworICBkM190aW1lX21vbnRoUmUubGFzdEluZGV4ID0gMDsKKyAgdmFyIG4gPSBkM190aW1lX21vbnRoUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAxMikpOworICByZXR1cm4gbiA/IChkYXRlLm0gPSBkM190aW1lX21vbnRoTG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOworfQorCit2YXIgZDNfdGltZV9tb250aFJlID0gL14oPzpKYW51YXJ5fEZlYnJ1YXJ5fE1hcmNofEFwcmlsfE1heXxKdW5lfEp1bHl8QXVndXN0fFNlcHRlbWJlcnxPY3RvYmVyfE5vdmVtYmVyfERlY2VtYmVyKS9pZzsKKwordmFyIGQzX3RpbWVfbW9udGhMb29rdXAgPSBkMy5tYXAoeworICBqYW51YXJ5OiAwLAorICBmZWJydWFyeTogMSwKKyAgbWFyY2g6IDIsCisgIGFwcmlsOiAzLAorICBtYXk6IDQsCisgIGp1bmU6IDUsCisgIGp1bHk6IDYsCisgIGF1Z3VzdDogNywKKyAgc2VwdGVtYmVyOiA4LAorICBvY3RvYmVyOiA5LAorICBub3ZlbWJlcjogMTAsCisgIGRlY2VtYmVyOiAxMQorfSk7CisKK3ZhciBkM190aW1lX21vbnRocyA9IFsKKyAgIkphbnVhcnkiLAorICAiRmVicnVhcnkiLAorICAiTWFyY2giLAorICAiQXByaWwiLAorICAiTWF5IiwKKyAgIkp1bmUiLAorICAiSnVseSIsCisgICJBdWd1c3QiLAorICAiU2VwdGVtYmVyIiwKKyAgIk9jdG9iZXIiLAorICAiTm92ZW1iZXIiLAorICAiRGVjZW1iZXIiCitdOworCitmdW5jdGlvbiBkM190aW1lX3BhcnNlTG9jYWxlRnVsbChkYXRlLCBzdHJpbmcsIGkpIHsKKyAgcmV0dXJuIGQzX3RpbWVfcGFyc2UoZGF0ZSwgZDNfdGltZV9mb3JtYXRzLmMudG9TdHJpbmcoKSwgc3RyaW5nLCBpKTsKK30KKworZnVuY3Rpb24gZDNfdGltZV9wYXJzZUxvY2FsZURhdGUoZGF0ZSwgc3RyaW5nLCBpKSB7CisgIHJldHVybiBkM190aW1lX3BhcnNlKGRhdGUsIGQzX3RpbWVfZm9ybWF0cy54LnRvU3RyaW5nKCksIHN0cmluZywgaSk7Cit9CisKK2Z1bmN0aW9uIGQzX3RpbWVfcGFyc2VMb2NhbGVUaW1lKGRhdGUsIHN0cmluZywgaSkgeworICByZXR1cm4gZDNfdGltZV9wYXJzZShkYXRlLCBkM190aW1lX2Zvcm1hdHMuWC50b1N0cmluZygpLCBzdHJpbmcsIGkpOworfQorCitmdW5jdGlvbiBkM190aW1lX3BhcnNlRnVsbFllYXIoZGF0ZSwgc3RyaW5nLCBpKSB7CisgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsKKyAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgNCkpOworICByZXR1cm4gbiA/IChkYXRlLnkgPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsKK30KKworZnVuY3Rpb24gZDNfdGltZV9wYXJzZVllYXIoZGF0ZSwgc3RyaW5nLCBpKSB7CisgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsKKyAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMikpOworICByZXR1cm4gbiA/IChkYXRlLnkgPSBkM190aW1lX2NlbnR1cnkoKSArICtuWzBdLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOworfQorCitmdW5jdGlvbiBkM190aW1lX2NlbnR1cnkoKSB7CisgIHJldHVybiB+fihuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLyAxMDAwKSAqIDEwMDA7Cit9CisKK2Z1bmN0aW9uIGQzX3RpbWVfcGFyc2VNb250aE51bWJlcihkYXRlLCBzdHJpbmcsIGkpIHsKKyAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOworICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAyKSk7CisgIHJldHVybiBuID8gKGRhdGUubSA9IG5bMF0gLSAxLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOworfQorCitmdW5jdGlvbiBkM190aW1lX3BhcnNlRGF5KGRhdGUsIHN0cmluZywgaSkgeworICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CisgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDIpKTsKKyAgcmV0dXJuIG4gPyAoZGF0ZS5kID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7Cit9CisKKy8vIE5vdGU6IHdlIGRvbid0IHZhbGlkYXRlIHRoYXQgdGhlIGhvdXIgaXMgaW4gdGhlIHJhbmdlIFswLDIzXSBvciBbMSwxMl0uCitmdW5jdGlvbiBkM190aW1lX3BhcnNlSG91cjI0KGRhdGUsIHN0cmluZywgaSkgeworICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CisgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDIpKTsKKyAgcmV0dXJuIG4gPyAoZGF0ZS5IID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7Cit9CisKK2Z1bmN0aW9uIGQzX3RpbWVfcGFyc2VNaW51dGVzKGRhdGUsIHN0cmluZywgaSkgeworICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CisgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDIpKTsKKyAgcmV0dXJuIG4gPyAoZGF0ZS5NID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7Cit9CisKK2Z1bmN0aW9uIGQzX3RpbWVfcGFyc2VTZWNvbmRzKGRhdGUsIHN0cmluZywgaSkgeworICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CisgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDIpKTsKKyAgcmV0dXJuIG4gPyAoZGF0ZS5TID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7Cit9CisKK2Z1bmN0aW9uIGQzX3RpbWVfcGFyc2VNaWxsaXNlY29uZHMoZGF0ZSwgc3RyaW5nLCBpKSB7CisgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsKKyAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMykpOworICByZXR1cm4gbiA/IChkYXRlLkwgPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsKK30KKworLy8gTm90ZTogd2UgZG9uJ3QgbG9vayBhdCB0aGUgbmV4dCBkaXJlY3RpdmUuCit2YXIgZDNfdGltZV9udW1iZXJSZSA9IC9ccypcZCsvOworCitmdW5jdGlvbiBkM190aW1lX3BhcnNlQW1QbShkYXRlLCBzdHJpbmcsIGkpIHsKKyAgdmFyIG4gPSBkM190aW1lX2FtUG1Mb29rdXAuZ2V0KHN0cmluZy5zdWJzdHJpbmcoaSwgaSArPSAyKS50b0xvd2VyQ2FzZSgpKTsKKyAgcmV0dXJuIG4gPT0gbnVsbCA/IC0xIDogKGRhdGUucCA9IG4sIGkpOworfQorCit2YXIgZDNfdGltZV9hbVBtTG9va3VwID0gZDMubWFwKHsKKyAgYW06IDAsCisgIHBtOiAxCit9KTsKKworLy8gVE9ETyB0YWJsZSBvZiB0aW1lIHpvbmUgb2Zmc2V0IG5hbWVzPworZnVuY3Rpb24gZDNfdGltZV96b25lKGQpIHsKKyAgdmFyIHogPSBkLmdldFRpbWV6b25lT2Zmc2V0KCksCisgICAgICB6cyA9IHogPiAwID8gIi0iIDogIisiLAorICAgICAgemggPSB+fihNYXRoLmFicyh6KSAvIDYwKSwKKyAgICAgIHptID0gTWF0aC5hYnMoeikgJSA2MDsKKyAgcmV0dXJuIHpzICsgZDNfdGltZV96ZmlsbDIoemgpICsgZDNfdGltZV96ZmlsbDIoem0pOworfQorZDMudGltZS5mb3JtYXQudXRjID0gZnVuY3Rpb24odGVtcGxhdGUpIHsKKyAgdmFyIGxvY2FsID0gZDMudGltZS5mb3JtYXQodGVtcGxhdGUpOworCisgIGZ1bmN0aW9uIGZvcm1hdChkYXRlKSB7CisgICAgdHJ5IHsKKyAgICAgIGQzX3RpbWUgPSBkM190aW1lX3V0YzsKKyAgICAgIHZhciB1dGMgPSBuZXcgZDNfdGltZSgpOworICAgICAgdXRjLl8gPSBkYXRlOworICAgICAgcmV0dXJuIGxvY2FsKHV0Yyk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGQzX3RpbWUgPSBEYXRlOworICAgIH0KKyAgfQorCisgIGZvcm1hdC5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgeworICAgIHRyeSB7CisgICAgICBkM190aW1lID0gZDNfdGltZV91dGM7CisgICAgICB2YXIgZGF0ZSA9IGxvY2FsLnBhcnNlKHN0cmluZyk7CisgICAgICByZXR1cm4gZGF0ZSAmJiBkYXRlLl87CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGQzX3RpbWUgPSBEYXRlOworICAgIH0KKyAgfTsKKworICBmb3JtYXQudG9TdHJpbmcgPSBsb2NhbC50b1N0cmluZzsKKworICByZXR1cm4gZm9ybWF0OworfTsKK3ZhciBkM190aW1lX2Zvcm1hdElzbyA9IGQzLnRpbWUuZm9ybWF0LnV0YygiJVktJW0tJWRUJUg6JU06JVMuJUxaIik7CisKK2QzLnRpbWUuZm9ybWF0LmlzbyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID8gZDNfdGltZV9mb3JtYXRJc29OYXRpdmUgOiBkM190aW1lX2Zvcm1hdElzbzsKKworZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRJc29OYXRpdmUoZGF0ZSkgeworICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpOworfQorCitkM190aW1lX2Zvcm1hdElzb05hdGl2ZS5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgeworICByZXR1cm4gbmV3IERhdGUoc3RyaW5nKTsKK307CisKK2QzX3RpbWVfZm9ybWF0SXNvTmF0aXZlLnRvU3RyaW5nID0gZDNfdGltZV9mb3JtYXRJc28udG9TdHJpbmc7CitmdW5jdGlvbiBkM190aW1lX2ludGVydmFsKGxvY2FsLCBzdGVwLCBudW1iZXIpIHsKKworICBmdW5jdGlvbiByb3VuZChkYXRlKSB7CisgICAgdmFyIGQwID0gbG9jYWwoZGF0ZSksIGQxID0gb2Zmc2V0KGQwLCAxKTsKKyAgICByZXR1cm4gZGF0ZSAtIGQwIDwgZDEgLSBkYXRlID8gZDAgOiBkMTsKKyAgfQorCisgIGZ1bmN0aW9uIGNlaWwoZGF0ZSkgeworICAgIHN0ZXAoZGF0ZSA9IGxvY2FsKG5ldyBkM190aW1lKGRhdGUgLSAxKSksIDEpOworICAgIHJldHVybiBkYXRlOworICB9CisKKyAgZnVuY3Rpb24gb2Zmc2V0KGRhdGUsIGspIHsKKyAgICBzdGVwKGRhdGUgPSBuZXcgZDNfdGltZSgrZGF0ZSksIGspOworICAgIHJldHVybiBkYXRlOworICB9CisKKyAgZnVuY3Rpb24gcmFuZ2UodDAsIHQxLCBkdCkgeworICAgIHZhciB0aW1lID0gY2VpbCh0MCksIHRpbWVzID0gW107CisgICAgaWYgKGR0ID4gMSkgeworICAgICAgd2hpbGUgKHRpbWUgPCB0MSkgeworICAgICAgICBpZiAoIShudW1iZXIodGltZSkgJSBkdCkpIHRpbWVzLnB1c2gobmV3IERhdGUoK3RpbWUpKTsKKyAgICAgICAgc3RlcCh0aW1lLCAxKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgd2hpbGUgKHRpbWUgPCB0MSkgdGltZXMucHVzaChuZXcgRGF0ZSgrdGltZSkpLCBzdGVwKHRpbWUsIDEpOworICAgIH0KKyAgICByZXR1cm4gdGltZXM7CisgIH0KKworICBmdW5jdGlvbiByYW5nZV91dGModDAsIHQxLCBkdCkgeworICAgIHRyeSB7CisgICAgICBkM190aW1lID0gZDNfdGltZV91dGM7CisgICAgICB2YXIgdXRjID0gbmV3IGQzX3RpbWVfdXRjKCk7CisgICAgICB1dGMuXyA9IHQwOworICAgICAgcmV0dXJuIHJhbmdlKHV0YywgdDEsIGR0KTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZDNfdGltZSA9IERhdGU7CisgICAgfQorICB9CisKKyAgbG9jYWwuZmxvb3IgPSBsb2NhbDsKKyAgbG9jYWwucm91bmQgPSByb3VuZDsKKyAgbG9jYWwuY2VpbCA9IGNlaWw7CisgIGxvY2FsLm9mZnNldCA9IG9mZnNldDsKKyAgbG9jYWwucmFuZ2UgPSByYW5nZTsKKworICB2YXIgdXRjID0gbG9jYWwudXRjID0gZDNfdGltZV9pbnRlcnZhbF91dGMobG9jYWwpOworICB1dGMuZmxvb3IgPSB1dGM7CisgIHV0Yy5yb3VuZCA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKHJvdW5kKTsKKyAgdXRjLmNlaWwgPSBkM190aW1lX2ludGVydmFsX3V0YyhjZWlsKTsKKyAgdXRjLm9mZnNldCA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKG9mZnNldCk7CisgIHV0Yy5yYW5nZSA9IHJhbmdlX3V0YzsKKworICByZXR1cm4gbG9jYWw7Cit9CisKK2Z1bmN0aW9uIGQzX3RpbWVfaW50ZXJ2YWxfdXRjKG1ldGhvZCkgeworICByZXR1cm4gZnVuY3Rpb24oZGF0ZSwgaykgeworICAgIHRyeSB7CisgICAgICBkM190aW1lID0gZDNfdGltZV91dGM7CisgICAgICB2YXIgdXRjID0gbmV3IGQzX3RpbWVfdXRjKCk7CisgICAgICB1dGMuXyA9IGRhdGU7CisgICAgICByZXR1cm4gbWV0aG9kKHV0YywgaykuXzsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZDNfdGltZSA9IERhdGU7CisgICAgfQorICB9OworfQorZDMudGltZS5zZWNvbmQgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKKyAgcmV0dXJuIG5ldyBkM190aW1lKE1hdGguZmxvb3IoZGF0ZSAvIDFlMykgKiAxZTMpOworfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7CisgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDFlMyk7IC8vIERTVCBicmVha3Mgc2V0U2Vjb25kcworfSwgZnVuY3Rpb24oZGF0ZSkgeworICByZXR1cm4gZGF0ZS5nZXRTZWNvbmRzKCk7Cit9KTsKKworZDMudGltZS5zZWNvbmRzID0gZDMudGltZS5zZWNvbmQucmFuZ2U7CitkMy50aW1lLnNlY29uZHMudXRjID0gZDMudGltZS5zZWNvbmQudXRjLnJhbmdlOworZDMudGltZS5taW51dGUgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKKyAgcmV0dXJuIG5ldyBkM190aW1lKE1hdGguZmxvb3IoZGF0ZSAvIDZlNCkgKiA2ZTQpOworfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7CisgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDZlNCk7IC8vIERTVCBicmVha3Mgc2V0TWludXRlcworfSwgZnVuY3Rpb24oZGF0ZSkgeworICByZXR1cm4gZGF0ZS5nZXRNaW51dGVzKCk7Cit9KTsKKworZDMudGltZS5taW51dGVzID0gZDMudGltZS5taW51dGUucmFuZ2U7CitkMy50aW1lLm1pbnV0ZXMudXRjID0gZDMudGltZS5taW51dGUudXRjLnJhbmdlOworZDMudGltZS5ob3VyID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CisgIHZhciB0aW1lem9uZSA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwOworICByZXR1cm4gbmV3IGQzX3RpbWUoKE1hdGguZmxvb3IoZGF0ZSAvIDM2ZTUgLSB0aW1lem9uZSkgKyB0aW1lem9uZSkgKiAzNmU1KTsKK30sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgeworICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiAzNmU1KTsgLy8gRFNUIGJyZWFrcyBzZXRIb3VycworfSwgZnVuY3Rpb24oZGF0ZSkgeworICByZXR1cm4gZGF0ZS5nZXRIb3VycygpOworfSk7CisKK2QzLnRpbWUuaG91cnMgPSBkMy50aW1lLmhvdXIucmFuZ2U7CitkMy50aW1lLmhvdXJzLnV0YyA9IGQzLnRpbWUuaG91ci51dGMucmFuZ2U7CitkMy50aW1lLmRheSA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgeworICByZXR1cm4gbmV3IGQzX3RpbWUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTsKK30sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgeworICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBvZmZzZXQpOworfSwgZnVuY3Rpb24oZGF0ZSkgeworICByZXR1cm4gZGF0ZS5nZXREYXRlKCkgLSAxOworfSk7CisKK2QzLnRpbWUuZGF5cyA9IGQzLnRpbWUuZGF5LnJhbmdlOworZDMudGltZS5kYXlzLnV0YyA9IGQzLnRpbWUuZGF5LnV0Yy5yYW5nZTsKKworZDMudGltZS5kYXlPZlllYXIgPSBmdW5jdGlvbihkYXRlKSB7CisgIHZhciB5ZWFyID0gZDMudGltZS55ZWFyKGRhdGUpOworICByZXR1cm4gTWF0aC5mbG9vcigoZGF0ZSAtIHllYXIpIC8gODY0ZTUgLSAoZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpIC0geWVhci5nZXRUaW1lem9uZU9mZnNldCgpKSAvIDE0NDApOworfTsKK2QzX3RpbWVfd2Vla2RheXMuZm9yRWFjaChmdW5jdGlvbihkYXksIGkpIHsKKyAgZGF5ID0gZGF5LnRvTG93ZXJDYXNlKCk7CisgIGkgPSA3IC0gaTsKKworICB2YXIgaW50ZXJ2YWwgPSBkMy50aW1lW2RheV0gPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKKyAgICAoZGF0ZSA9IGQzLnRpbWUuZGF5KGRhdGUpKS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gKGRhdGUuZ2V0RGF5KCkgKyBpKSAlIDcpOworICAgIHJldHVybiBkYXRlOworICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHsKKyAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiA3KTsKKyAgfSwgZnVuY3Rpb24oZGF0ZSkgeworICAgIHZhciBkYXkgPSBkMy50aW1lLnllYXIoZGF0ZSkuZ2V0RGF5KCk7CisgICAgcmV0dXJuIE1hdGguZmxvb3IoKGQzLnRpbWUuZGF5T2ZZZWFyKGRhdGUpICsgKGRheSArIGkpICUgNykgLyA3KSAtIChkYXkgIT09IGkpOworICB9KTsKKworICBkMy50aW1lW2RheSArICJzIl0gPSBpbnRlcnZhbC5yYW5nZTsKKyAgZDMudGltZVtkYXkgKyAicyJdLnV0YyA9IGludGVydmFsLnV0Yy5yYW5nZTsKKworICBkMy50aW1lW2RheSArICJPZlllYXIiXSA9IGZ1bmN0aW9uKGRhdGUpIHsKKyAgICB2YXIgZGF5ID0gZDMudGltZS55ZWFyKGRhdGUpLmdldERheSgpOworICAgIHJldHVybiBNYXRoLmZsb29yKChkMy50aW1lLmRheU9mWWVhcihkYXRlKSArIChkYXkgKyBpKSAlIDcpIC8gNyk7CisgIH07Cit9KTsKKworZDMudGltZS53ZWVrID0gZDMudGltZS5zdW5kYXk7CitkMy50aW1lLndlZWtzID0gZDMudGltZS5zdW5kYXkucmFuZ2U7CitkMy50aW1lLndlZWtzLnV0YyA9IGQzLnRpbWUuc3VuZGF5LnV0Yy5yYW5nZTsKK2QzLnRpbWUud2Vla09mWWVhciA9IGQzLnRpbWUuc3VuZGF5T2ZZZWFyOworZDMudGltZS5tb250aCA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgeworICByZXR1cm4gbmV3IGQzX3RpbWUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIDEpOworfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7CisgIGRhdGUuc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgb2Zmc2V0KTsKK30sIGZ1bmN0aW9uKGRhdGUpIHsKKyAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTsKK30pOworCitkMy50aW1lLm1vbnRocyA9IGQzLnRpbWUubW9udGgucmFuZ2U7CitkMy50aW1lLm1vbnRocy51dGMgPSBkMy50aW1lLm1vbnRoLnV0Yy5yYW5nZTsKK2QzLnRpbWUueWVhciA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgeworICByZXR1cm4gbmV3IGQzX3RpbWUoZGF0ZS5nZXRGdWxsWWVhcigpLCAwLCAxKTsKK30sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgeworICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIG9mZnNldCk7Cit9LCBmdW5jdGlvbihkYXRlKSB7CisgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk7Cit9KTsKKworZDMudGltZS55ZWFycyA9IGQzLnRpbWUueWVhci5yYW5nZTsKK2QzLnRpbWUueWVhcnMudXRjID0gZDMudGltZS55ZWFyLnV0Yy5yYW5nZTsKK2Z1bmN0aW9uIGQzX3RpbWVfc2NhbGUobGluZWFyLCBtZXRob2RzLCBmb3JtYXQpIHsKKworICBmdW5jdGlvbiBzY2FsZSh4KSB7CisgICAgcmV0dXJuIGxpbmVhcih4KTsKKyAgfQorCisgIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHgpIHsKKyAgICByZXR1cm4gZDNfdGltZV9zY2FsZURhdGUobGluZWFyLmludmVydCh4KSk7CisgIH07CisKKyAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmVhci5kb21haW4oKS5tYXAoZDNfdGltZV9zY2FsZURhdGUpOworICAgIGxpbmVhci5kb21haW4oeCk7CisgICAgcmV0dXJuIHNjYWxlOworICB9OworCisgIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihtKSB7CisgICAgdmFyIGV4dGVudCA9IGQzX3RpbWVfc2NhbGVFeHRlbnQoc2NhbGUuZG9tYWluKCkpOworICAgIHJldHVybiBzY2FsZS5kb21haW4oW20uZmxvb3IoZXh0ZW50WzBdKSwgbS5jZWlsKGV4dGVudFsxXSldKTsKKyAgfTsKKworICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKG0sIGspIHsKKyAgICB2YXIgZXh0ZW50ID0gZDNfdGltZV9zY2FsZUV4dGVudChzY2FsZS5kb21haW4oKSk7CisgICAgaWYgKHR5cGVvZiBtICE9PSAiZnVuY3Rpb24iKSB7CisgICAgICB2YXIgc3BhbiA9IGV4dGVudFsxXSAtIGV4dGVudFswXSwKKyAgICAgICAgICB0YXJnZXQgPSBzcGFuIC8gbSwKKyAgICAgICAgICBpID0gZDMuYmlzZWN0KGQzX3RpbWVfc2NhbGVTdGVwcywgdGFyZ2V0KTsKKyAgICAgIGlmIChpID09IGQzX3RpbWVfc2NhbGVTdGVwcy5sZW5ndGgpIHJldHVybiBtZXRob2RzLnllYXIoZXh0ZW50LCBtKTsKKyAgICAgIGlmICghaSkgcmV0dXJuIGxpbmVhci50aWNrcyhtKS5tYXAoZDNfdGltZV9zY2FsZURhdGUpOworICAgICAgaWYgKE1hdGgubG9nKHRhcmdldCAvIGQzX3RpbWVfc2NhbGVTdGVwc1tpIC0gMV0pIDwgTWF0aC5sb2coZDNfdGltZV9zY2FsZVN0ZXBzW2ldIC8gdGFyZ2V0KSkgLS1pOworICAgICAgbSA9IG1ldGhvZHNbaV07CisgICAgICBrID0gbVsxXTsKKyAgICAgIG0gPSBtWzBdLnJhbmdlOworICAgIH0KKyAgICByZXR1cm4gbShleHRlbnRbMF0sIG5ldyBEYXRlKCtleHRlbnRbMV0gKyAxKSwgayk7IC8vIGluY2x1c2l2ZSB1cHBlciBib3VuZAorICB9OworCisgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZm9ybWF0OworICB9OworCisgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gZDNfdGltZV9zY2FsZShsaW5lYXIuY29weSgpLCBtZXRob2RzLCBmb3JtYXQpOworICB9OworCisgIC8vIFRPT0QgZXhwb3NlIGQzX3NjYWxlX2xpbmVhcl9yZWJpbmQ/CisgIHJldHVybiBkMy5yZWJpbmQoc2NhbGUsIGxpbmVhciwgInJhbmdlIiwgInJhbmdlUm91bmQiLCAiaW50ZXJwb2xhdGUiLCAiY2xhbXAiKTsKK30KKworLy8gVE9ETyBleHBvc2UgZDNfc2NhbGVFeHRlbnQ/CitmdW5jdGlvbiBkM190aW1lX3NjYWxlRXh0ZW50KGRvbWFpbikgeworICB2YXIgc3RhcnQgPSBkb21haW5bMF0sIHN0b3AgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdOworICByZXR1cm4gc3RhcnQgPCBzdG9wID8gW3N0YXJ0LCBzdG9wXSA6IFtzdG9wLCBzdGFydF07Cit9CisKK2Z1bmN0aW9uIGQzX3RpbWVfc2NhbGVEYXRlKHQpIHsKKyAgcmV0dXJuIG5ldyBEYXRlKHQpOworfQorCitmdW5jdGlvbiBkM190aW1lX3NjYWxlRm9ybWF0KGZvcm1hdHMpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUpIHsKKyAgICB2YXIgaSA9IGZvcm1hdHMubGVuZ3RoIC0gMSwgZiA9IGZvcm1hdHNbaV07CisgICAgd2hpbGUgKCFmWzFdKGRhdGUpKSBmID0gZm9ybWF0c1stLWldOworICAgIHJldHVybiBmWzBdKGRhdGUpOworICB9OworfQorCitmdW5jdGlvbiBkM190aW1lX3NjYWxlU2V0WWVhcih5KSB7CisgIHZhciBkID0gbmV3IERhdGUoeSwgMCwgMSk7CisgIGQuc2V0RnVsbFllYXIoeSk7IC8vIFkySyBmYWlsCisgIHJldHVybiBkOworfQorCitmdW5jdGlvbiBkM190aW1lX3NjYWxlR2V0WWVhcihkKSB7CisgIHZhciB5ID0gZC5nZXRGdWxsWWVhcigpLAorICAgICAgZDAgPSBkM190aW1lX3NjYWxlU2V0WWVhcih5KSwKKyAgICAgIGQxID0gZDNfdGltZV9zY2FsZVNldFllYXIoeSArIDEpOworICByZXR1cm4geSArIChkIC0gZDApIC8gKGQxIC0gZDApOworfQorCit2YXIgZDNfdGltZV9zY2FsZVN0ZXBzID0gWworICAxZTMsICAgIC8vIDEtc2Vjb25kCisgIDVlMywgICAgLy8gNS1zZWNvbmQKKyAgMTVlMywgICAvLyAxNS1zZWNvbmQKKyAgM2U0LCAgICAvLyAzMC1zZWNvbmQKKyAgNmU0LCAgICAvLyAxLW1pbnV0ZQorICAzZTUsICAgIC8vIDUtbWludXRlCisgIDllNSwgICAgLy8gMTUtbWludXRlCisgIDE4ZTUsICAgLy8gMzAtbWludXRlCisgIDM2ZTUsICAgLy8gMS1ob3VyCisgIDEwOGU1LCAgLy8gMy1ob3VyCisgIDIxNmU1LCAgLy8gNi1ob3VyCisgIDQzMmU1LCAgLy8gMTItaG91cgorICA4NjRlNSwgIC8vIDEtZGF5CisgIDE3MjhlNSwgLy8gMi1kYXkKKyAgNjA0OGU1LCAvLyAxLXdlZWsKKyAgMjU5MmU2LCAvLyAxLW1vbnRoCisgIDc3NzZlNiwgLy8gMy1tb250aAorICAzMTUzNmU2IC8vIDEteWVhcgorXTsKKwordmFyIGQzX3RpbWVfc2NhbGVMb2NhbE1ldGhvZHMgPSBbCisgIFtkMy50aW1lLnNlY29uZCwgMV0sCisgIFtkMy50aW1lLnNlY29uZCwgNV0sCisgIFtkMy50aW1lLnNlY29uZCwgMTVdLAorICBbZDMudGltZS5zZWNvbmQsIDMwXSwKKyAgW2QzLnRpbWUubWludXRlLCAxXSwKKyAgW2QzLnRpbWUubWludXRlLCA1XSwKKyAgW2QzLnRpbWUubWludXRlLCAxNV0sCisgIFtkMy50aW1lLm1pbnV0ZSwgMzBdLAorICBbZDMudGltZS5ob3VyLCAxXSwKKyAgW2QzLnRpbWUuaG91ciwgM10sCisgIFtkMy50aW1lLmhvdXIsIDZdLAorICBbZDMudGltZS5ob3VyLCAxMl0sCisgIFtkMy50aW1lLmRheSwgMV0sCisgIFtkMy50aW1lLmRheSwgMl0sCisgIFtkMy50aW1lLndlZWssIDFdLAorICBbZDMudGltZS5tb250aCwgMV0sCisgIFtkMy50aW1lLm1vbnRoLCAzXSwKKyAgW2QzLnRpbWUueWVhciwgMV0KK107CisKK3ZhciBkM190aW1lX3NjYWxlTG9jYWxGb3JtYXRzID0gWworICBbZDMudGltZS5mb3JtYXQoIiVZIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIHRydWU7IH1dLAorICBbZDMudGltZS5mb3JtYXQoIiVCIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0TW9udGgoKTsgfV0sCisgIFtkMy50aW1lLmZvcm1hdCgiJWIgJWQiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXREYXRlKCkgIT0gMTsgfV0sCisgIFtkMy50aW1lLmZvcm1hdCgiJWEgJWQiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXREYXkoKSAmJiBkLmdldERhdGUoKSAhPSAxOyB9XSwKKyAgW2QzLnRpbWUuZm9ybWF0KCIlSSAlcCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldEhvdXJzKCk7IH1dLAorICBbZDMudGltZS5mb3JtYXQoIiVJOiVNIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0TWludXRlcygpOyB9XSwKKyAgW2QzLnRpbWUuZm9ybWF0KCI6JVMiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXRTZWNvbmRzKCk7IH1dLAorICBbZDMudGltZS5mb3JtYXQoIi4lTCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldE1pbGxpc2Vjb25kcygpOyB9XQorXTsKKwordmFyIGQzX3RpbWVfc2NhbGVMaW5lYXIgPSBkMy5zY2FsZS5saW5lYXIoKSwKKyAgICBkM190aW1lX3NjYWxlTG9jYWxGb3JtYXQgPSBkM190aW1lX3NjYWxlRm9ybWF0KGQzX3RpbWVfc2NhbGVMb2NhbEZvcm1hdHMpOworCitkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzLnllYXIgPSBmdW5jdGlvbihleHRlbnQsIG0pIHsKKyAgcmV0dXJuIGQzX3RpbWVfc2NhbGVMaW5lYXIuZG9tYWluKGV4dGVudC5tYXAoZDNfdGltZV9zY2FsZUdldFllYXIpKS50aWNrcyhtKS5tYXAoZDNfdGltZV9zY2FsZVNldFllYXIpOworfTsKKworZDMudGltZS5zY2FsZSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gZDNfdGltZV9zY2FsZShkMy5zY2FsZS5saW5lYXIoKSwgZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcywgZDNfdGltZV9zY2FsZUxvY2FsRm9ybWF0KTsKK307Cit2YXIgZDNfdGltZV9zY2FsZVVUQ01ldGhvZHMgPSBkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzLm1hcChmdW5jdGlvbihtKSB7CisgIHJldHVybiBbbVswXS51dGMsIG1bMV1dOworfSk7CisKK3ZhciBkM190aW1lX3NjYWxlVVRDRm9ybWF0cyA9IFsKKyAgW2QzLnRpbWUuZm9ybWF0LnV0YygiJVkiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gdHJ1ZTsgfV0sCisgIFtkMy50aW1lLmZvcm1hdC51dGMoIiVCIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0VVRDTW9udGgoKTsgfV0sCisgIFtkMy50aW1lLmZvcm1hdC51dGMoIiViICVkIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0VVRDRGF0ZSgpICE9IDE7IH1dLAorICBbZDMudGltZS5mb3JtYXQudXRjKCIlYSAlZCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ0RheSgpICYmIGQuZ2V0VVRDRGF0ZSgpICE9IDE7IH1dLAorICBbZDMudGltZS5mb3JtYXQudXRjKCIlSSAlcCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ0hvdXJzKCk7IH1dLAorICBbZDMudGltZS5mb3JtYXQudXRjKCIlSTolTSIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ01pbnV0ZXMoKTsgfV0sCisgIFtkMy50aW1lLmZvcm1hdC51dGMoIjolUyIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ1NlY29uZHMoKTsgfV0sCisgIFtkMy50aW1lLmZvcm1hdC51dGMoIi4lTCIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ01pbGxpc2Vjb25kcygpOyB9XQorXTsKKwordmFyIGQzX3RpbWVfc2NhbGVVVENGb3JtYXQgPSBkM190aW1lX3NjYWxlRm9ybWF0KGQzX3RpbWVfc2NhbGVVVENGb3JtYXRzKTsKKworZnVuY3Rpb24gZDNfdGltZV9zY2FsZVVUQ1NldFllYXIoeSkgeworICB2YXIgZCA9IG5ldyBEYXRlKERhdGUuVVRDKHksIDAsIDEpKTsKKyAgZC5zZXRVVENGdWxsWWVhcih5KTsgLy8gWTJLIGZhaWwKKyAgcmV0dXJuIGQ7Cit9CisKK2Z1bmN0aW9uIGQzX3RpbWVfc2NhbGVVVENHZXRZZWFyKGQpIHsKKyAgdmFyIHkgPSBkLmdldFVUQ0Z1bGxZZWFyKCksCisgICAgICBkMCA9IGQzX3RpbWVfc2NhbGVVVENTZXRZZWFyKHkpLAorICAgICAgZDEgPSBkM190aW1lX3NjYWxlVVRDU2V0WWVhcih5ICsgMSk7CisgIHJldHVybiB5ICsgKGQgLSBkMCkgLyAoZDEgLSBkMCk7Cit9CisKK2QzX3RpbWVfc2NhbGVVVENNZXRob2RzLnllYXIgPSBmdW5jdGlvbihleHRlbnQsIG0pIHsKKyAgcmV0dXJuIGQzX3RpbWVfc2NhbGVMaW5lYXIuZG9tYWluKGV4dGVudC5tYXAoZDNfdGltZV9zY2FsZVVUQ0dldFllYXIpKS50aWNrcyhtKS5tYXAoZDNfdGltZV9zY2FsZVVUQ1NldFllYXIpOworfTsKKworZDMudGltZS5zY2FsZS51dGMgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIGQzX3RpbWVfc2NhbGUoZDMuc2NhbGUubGluZWFyKCksIGQzX3RpbWVfc2NhbGVVVENNZXRob2RzLCBkM190aW1lX3NjYWxlVVRDRm9ybWF0KTsKK307Cit9KSgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvaGlnaGxpZ2h0LmpzIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvaGlnaGxpZ2h0LmpzCmluZGV4IDAxYjA5MmUuLjUyN2MzNDAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2hpZ2hsaWdodC5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9oaWdobGlnaHQuanMKQEAgLTEsMzEgKzEsMzEgQEAKLS8qDQotDQotQ29weXJpZ2h0IChjKSAyMDA2LCBJdmFuIFNhZ2FsYWV2DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0NCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCi0NCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUNCi0gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KLSAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgaGlnaGxpZ2h0LmpzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyANCi0gICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgDQotICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotDQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZDQotRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRA0KLVdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUNCi1ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZDQotRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMNCi0oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7DQotTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EDQotT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUw0KLVNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLQ0KLSovDQotDQotdmFyIGhsanM9bmV3IGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbChvKXtyZXR1cm4gby5yZXBsYWNlKC8mL2dtLCImYW1wOyIpLnJlcGxhY2UoLzwvZ20sIiZsdDsiKS5yZXBsYWNlKC8+L2dtLCImZ3Q7Iil9ZnVuY3Rpb24gYihwKXtmb3IodmFyIG89cC5maXJzdENoaWxkO287bz1vLm5leHRTaWJsaW5nKXtpZihvLm5vZGVOYW1lPT0iQ09ERSIpe3JldHVybiBvfWlmKCEoby5ub2RlVHlwZT09MyYmby5ub2RlVmFsdWUubWF0Y2goL1xzKy8pKSl7YnJlYWt9fX1mdW5jdGlvbiBoKHAsbyl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChwLmNoaWxkTm9kZXMsZnVuY3Rpb24ocSl7aWYocS5ub2RlVHlwZT09Myl7cmV0dXJuIG8/cS5ub2RlVmFsdWUucmVwbGFjZSgvXG4vZywiIik6cS5ub2RlVmFsdWV9aWYocS5ub2RlTmFtZT09IkJSIil7cmV0dXJuIlxuIn1yZXR1cm4gaChxLG8pfSkuam9pbigiIil9ZnVuY3Rpb24gYShxKXt2YXIgcD0ocS5jbGFzc05hbWUrIiAiK3EucGFyZW50Tm9kZS5jbGFzc05hbWUpLnNwbGl0KC9ccysvKTtwPXAubWFwKGZ1bmN0aW9uKHIpe3JldHVybiByLnJlcGxhY2UoL15sYW5ndWFnZS0vLCIiKX0pO2Zvcih2YXIgbz0wO288cC5sZW5ndGg7bysrKXtpZihlW3Bbb11dfHxwW29dPT0ibm8taGlnaGxpZ2h0Iil7cmV0dXJuIHBbb119fX1mdW5jdGlvbiBjKHEpe3ZhciBvPVtdOyhmdW5jdGlvbiBwKHIscyl7Zm9yKHZhciB0PXIuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyl7aWYodC5ub2RlVHlwZT09Myl7cys9dC5ub2RlVmFsdWUubGVuZ3RofWVsc2V7aWYodC5ub2RlTmFtZT09IkJSIil7cys9MX1lbHNle2lmKHQubm9kZVR5cGU9PTEpe28ucHVzaCh7ZXZlbnQ6InN0YXJ0IixvZmZzZXQ6cyxub2RlOnR9KTtzPXAodCxzKTtvLnB1c2goe2V2ZW50OiJzdG9wIixvZmZzZXQ6cyxub2RlOnR9KX19fX1yZXR1cm4gc30pKHEsMCk7cmV0dXJuIG99ZnVuY3Rpb24gaih4LHYsdyl7dmFyIHA9MDt2YXIgeT0iIjt2YXIgcj1bXTtmdW5jdGlvbiB0KCl7aWYoeC5sZW5ndGgmJnYubGVuZ3RoKXtpZih4WzBdLm9mZnNldCE9dlswXS5vZmZzZXQpe3JldHVybih4WzBdLm9mZnNldDx2WzBdLm9mZnNldCk/eDp2fWVsc2V7cmV0dXJuIHZbMF0uZXZlbnQ9PSJzdGFydCI/eDp2fX1lbHNle3JldHVybiB4Lmxlbmd0aD94OnZ9fWZ1bmN0aW9uIHMoQSl7ZnVuY3Rpb24geihCKXtyZXR1cm4iICIrQi5ub2RlTmFtZSsnPSInK2woQi52YWx1ZSkrJyInfXJldHVybiI8IitBLm5vZGVOYW1lK0FycmF5LnByb3RvdHlwZS5tYXAuY2FsbChBLmF0dHJpYnV0ZXMseikuam9pbigiIikrIj4ifXdoaWxlKHgubGVuZ3RofHx2Lmxlbmd0aCl7dmFyIHU9dCgpLnNwbGljZSgwLDEpWzBdO3krPWwody5zdWJzdHIocCx1Lm9mZnNldC1wKSk7cD11Lm9mZnNldDtpZih1LmV2ZW50PT0ic3RhcnQiKXt5Kz1zKHUubm9kZSk7ci5wdXNoKHUubm9kZSl9ZWxzZXtpZih1LmV2ZW50PT0ic3RvcCIpe3ZhciBvLHE9ci5sZW5ndGg7ZG97cS0tO289cltxXTt5Kz0oIjwvIitvLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkrIj4iKX13aGlsZShvIT11Lm5vZGUpO3Iuc3BsaWNlKHEsMSk7d2hpbGUocTxyLmxlbmd0aCl7eSs9cyhyW3FdKTtxKyt9fX19cmV0dXJuIHkrbCh3LnN1YnN0cihwKSl9ZnVuY3Rpb24gZihxKXtmdW5jdGlvbiBvKHMscil7cmV0dXJuIFJlZ0V4cChzLCJtIisocS5jST8iaSI6IiIpKyhyPyJnIjoiIikpfWZ1bmN0aW9uIHAoeSx3KXtpZih5LmNvbXBpbGVkKXtyZXR1cm59eS5jb21waWxlZD10cnVlO3ZhciBzPVtdO2lmKHkuayl7dmFyIHI9e307ZnVuY3Rpb24geihBLHQpe3Quc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBDPUIuc3BsaXQoInwiKTtyW0NbMF1dPVtBLENbMV0/TnVtYmVyKENbMV0pOjFdO3MucHVzaChDWzBdKX0pfXkubFI9byh5Lmx8fGhsanMuSVIsdHJ1ZSk7aWYodHlwZW9mIHkuaz09InN0cmluZyIpe3ooImtleXdvcmQiLHkuayl9ZWxzZXtmb3IodmFyIHggaW4geS5rKXtpZigheS5rLmhhc093blByb3BlcnR5KHgpKXtjb250aW51ZX16KHgseS5rW3hdKX19eS5rPXJ9aWYodyl7aWYoeS5iV0spe3kuYj0iXFxiKCIrcy5qb2luKCJ8IikrIilcXHMifXkuYlI9byh5LmI/eS5iOiJcXEJ8XFxiIik7aWYoIXkuZSYmIXkuZVcpe3kuZT0iXFxCfFxcYiJ9aWYoeS5lKXt5LmVSPW8oeS5lKX15LnRFPXkuZXx8IiI7aWYoeS5lVyYmdy50RSl7eS50RSs9KHkuZT8ifCI6IiIpK3cudEV9fWlmKHkuaSl7eS5pUj1vKHkuaSl9aWYoeS5yPT09dW5kZWZpbmVkKXt5LnI9MX1pZigheS5jKXt5LmM9W119Zm9yKHZhciB2PTA7djx5LmMubGVuZ3RoO3YrKyl7aWYoeS5jW3ZdPT0ic2VsZiIpe3kuY1t2XT15fXAoeS5jW3ZdLHkpfWlmKHkuc3RhcnRzKXtwKHkuc3RhcnRzLHcpfXZhciB1PVtdO2Zvcih2YXIgdj0wO3Y8eS5jLmxlbmd0aDt2Kyspe3UucHVzaCh5LmNbdl0uYil9aWYoeS50RSl7dS5wdXNoKHkudEUpfWlmKHkuaSl7dS5wdXNoKHkuaSl9eS50PXUubGVuZ3RoP28odS5qb2luKCJ8IiksdHJ1ZSk6e2V4ZWM6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGx9fX1wKHEpfWZ1bmN0aW9uIGQoRCxFKXtmdW5jdGlvbiBvKHIsTSl7Zm9yKHZhciBMPTA7TDxNLmMubGVuZ3RoO0wrKyl7dmFyIEs9TS5jW0xdLmJSLmV4ZWMocik7aWYoSyYmSy5pbmRleD09MCl7cmV0dXJuIE0uY1tMXX19fWZ1bmN0aW9uIHMoSyxyKXtpZihLLmUmJksuZVIudGVzdChyKSl7cmV0dXJuIEt9aWYoSy5lVyl7cmV0dXJuIHMoSy5wYXJlbnQscil9fWZ1bmN0aW9uIHQocixLKXtyZXR1cm4gSy5pJiZLLmlSLnRlc3Qocil9ZnVuY3Rpb24geShMLHIpe3ZhciBLPUYuY0k/clswXS50b0xvd2VyQ2FzZSgpOnJbMF07cmV0dXJuIEwuay5oYXNPd25Qcm9wZXJ0eShLKSYmTC5rW0tdfWZ1bmN0aW9uIEcoKXt2YXIgSz1sKHcpO2lmKCFBLmspe3JldHVybiBLfXZhciByPSIiO3ZhciBOPTA7QS5sUi5sYXN0SW5kZXg9MDt2YXIgTD1BLmxSLmV4ZWMoSyk7d2hpbGUoTCl7cis9Sy5zdWJzdHIoTixMLmluZGV4LU4pO3ZhciBNPXkoQSxMKTtpZihNKXt2Kz1NWzFdO3IrPSc8c3BhbiBjbGFzcz0iJytNWzBdKyciPicrTFswXSsiPC9zcGFuPiJ9ZWxzZXtyKz1MWzBdfU49QS5sUi5sYXN0SW5kZXg7TD1BLmxSLmV4ZWMoSyl9cmV0dXJuIHIrSy5zdWJzdHIoTil9ZnVuY3Rpb24geigpe2lmKEEuc0wmJiFlW0Euc0xdKXtyZXR1cm4gbCh3KX12YXIgcj1BLnNMP2QoQS5zTCx3KTpnKHcpO2lmKEEucj4wKXt2Kz1yLmtleXdvcmRfY291bnQ7Qis9ci5yfXJldHVybic8c3BhbiBjbGFzcz0iJytyLmxhbmd1YWdlKyciPicrci52YWx1ZSsiPC9zcGFuPiJ9ZnVuY3Rpb24gSigpe3JldHVybiBBLnNMIT09dW5kZWZpbmVkP3ooKTpHKCl9ZnVuY3Rpb24gSShMLHIpe3ZhciBLPUwuY04/JzxzcGFuIGNsYXNzPSInK0wuY04rJyI+JzoiIjtpZihMLnJCKXt4Kz1LO3c9IiJ9ZWxzZXtpZihMLmVCKXt4Kz1sKHIpK0s7dz0iIn1lbHNle3grPUs7dz1yfX1BPU9iamVjdC5jcmVhdGUoTCx7cGFyZW50Ont2YWx1ZTpBfX0pO0IrPUwucn1mdW5jdGlvbiBDKEsscil7dys9SztpZihyPT09dW5kZWZpbmVkKXt4Kz1KKCk7cmV0dXJuIDB9dmFyIEw9byhyLEEpO2lmKEwpe3grPUooKTtJKEwscik7cmV0dXJuIEwuckI/MDpyLmxlbmd0aH12YXIgTT1zKEEscik7aWYoTSl7aWYoIShNLnJFfHxNLmVFKSl7dys9cn14Kz1KKCk7ZG97aWYoQS5jTil7eCs9Ijwvc3Bhbj4ifUE9QS5wYXJlbnR9d2hpbGUoQSE9TS5wYXJlbnQpO2lmKE0uZUUpe3grPWwocil9dz0iIjtpZihNLnN0YXJ0cyl7SShNLnN0YXJ0cywiIil9cmV0dXJuIE0uckU/MDpyLmxlbmd0aH1pZih0KHIsQSkpe3Rocm93IklsbGVnYWwifXcrPXI7cmV0dXJuIHIubGVuZ3RofHwxfXZhciBGPWVbRF07ZihGKTt2YXIgQT1GO3ZhciB3PSIiO3ZhciBCPTA7dmFyIHY9MDt2YXIgeD0iIjt0cnl7dmFyIHUscSxwPTA7d2hpbGUodHJ1ZSl7QS50Lmxhc3RJbmRleD1wO3U9QS50LmV4ZWMoRSk7aWYoIXUpe2JyZWFrfXE9QyhFLnN1YnN0cihwLHUuaW5kZXgtcCksdVswXSk7cD11LmluZGV4K3F9QyhFLnN1YnN0cihwKSk7cmV0dXJue3I6QixrZXl3b3JkX2NvdW50OnYsdmFsdWU6eCxsYW5ndWFnZTpEfX1jYXRjaChIKXtpZihIPT0iSWxsZWdhbCIpe3JldHVybntyOjAsa2V5d29yZF9jb3VudDowLHZhbHVlOmwoRSl9fWVsc2V7dGhyb3cgSH19fWZ1bmN0aW9uIGcocyl7dmFyIG89e2tleXdvcmRfY291bnQ6MCxyOjAsdmFsdWU6bChzKX07dmFyIHE9bztmb3IodmFyIHAgaW4gZSl7aWYoIWUuaGFzT3duUHJvcGVydHkocCkpe2NvbnRpbnVlfXZhciByPWQocCxzKTtyLmxhbmd1YWdlPXA7aWYoci5rZXl3b3JkX2NvdW50K3Iucj5xLmtleXdvcmRfY291bnQrcS5yKXtxPXJ9aWYoci5rZXl3b3JkX2NvdW50K3Iucj5vLmtleXdvcmRfY291bnQrby5yKXtxPW87bz1yfX1pZihxLmxhbmd1YWdlKXtvLnNlY29uZF9iZXN0PXF9cmV0dXJuIG99ZnVuY3Rpb24gaShxLHAsbyl7aWYocCl7cT1xLnJlcGxhY2UoL14oKDxbXj5dKz58XHQpKykvZ20sZnVuY3Rpb24ocix2LHUsdCl7cmV0dXJuIHYucmVwbGFjZSgvXHQvZyxwKX0pfWlmKG8pe3E9cS5yZXBsYWNlKC9cbi9nLCI8YnI+Iil9cmV0dXJuIHF9ZnVuY3Rpb24gbShyLHUscCl7dmFyIHY9aChyLHApO3ZhciB0PWEocik7aWYodD09Im5vLWhpZ2hsaWdodCIpe3JldHVybn12YXIgdz10P2QodCx2KTpnKHYpO3Q9dy5sYW5ndWFnZTt2YXIgbz1jKHIpO2lmKG8ubGVuZ3RoKXt2YXIgcT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwcmUiKTtxLmlubmVySFRNTD13LnZhbHVlO3cudmFsdWU9aihvLGMocSksdil9dy52YWx1ZT1pKHcudmFsdWUsdSxwKTt2YXIgcz1yLmNsYXNzTmFtZTtpZighcy5tYXRjaCgiKFxcc3xeKShsYW5ndWFnZS0pPyIrdCsiKFxcc3wkKSIpKXtzPXM/KHMrIiAiK3QpOnR9ci5pbm5lckhUTUw9dy52YWx1ZTtyLmNsYXNzTmFtZT1zO3IucmVzdWx0PXtsYW5ndWFnZTp0LGt3Oncua2V5d29yZF9jb3VudCxyZTp3LnJ9O2lmKHcuc2Vjb25kX2Jlc3Qpe3Iuc2Vjb25kX2Jlc3Q9e2xhbmd1YWdlOncuc2Vjb25kX2Jlc3QubGFuZ3VhZ2Usa3c6dy5zZWNvbmRfYmVzdC5rZXl3b3JkX2NvdW50LHJlOncuc2Vjb25kX2Jlc3Qucn19fWZ1bmN0aW9uIG4oKXtpZihuLmNhbGxlZCl7cmV0dXJufW4uY2FsbGVkPXRydWU7QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwcmUiKSxiKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbihvKXttKG8saGxqcy50YWJSZXBsYWNlKX0pfWZ1bmN0aW9uIGsoKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsbixmYWxzZSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLG4sZmFsc2UpfXZhciBlPXt9O3RoaXMuTEFOR1VBR0VTPWU7dGhpcy5oaWdobGlnaHQ9ZDt0aGlzLmhpZ2hsaWdodEF1dG89Zzt0aGlzLmZpeE1hcmt1cD1pO3RoaXMuaGlnaGxpZ2h0QmxvY2s9bTt0aGlzLmluaXRIaWdobGlnaHRpbmc9bjt0aGlzLmluaXRIaWdobGlnaHRpbmdPbkxvYWQ9azt0aGlzLklSPSJbYS16QS1aXVthLXpBLVowLTlfXSoiO3RoaXMuVUlSPSJbYS16QS1aX11bYS16QS1aMC05X10qIjt0aGlzLk5SPSJcXGJcXGQrKFxcLlxcZCspPyI7dGhpcy5DTlI9IihcXGIwW3hYXVthLWZBLUYwLTldK3woXFxiXFxkKyhcXC5cXGQqKT98XFwuXFxkKykoW2VFXVstK10/XFxkKyk/KSI7dGhpcy5CTlI9IlxcYigwYlswMV0rKSI7dGhpcy5SU1I9IiF8IT18IT09fCV8JT18JnwmJnwmPXxcXCp8XFwqPXxcXCt8XFwrPXwsfFxcLnwtfC09fC98Lz18Onw7fDx8PDx8PDw9fDw9fD18PT18PT09fD58Pj18Pj58Pj49fD4+Pnw+Pj49fFxcP3xcXFt8XFx7fFxcKHxcXF58XFxePXxcXHx8XFx8PXxcXHxcXHx8fiI7dGhpcy5CRT17YjoiXFxcXFtcXHNcXFNdIixyOjB9O3RoaXMuQVNNPXtjTjoic3RyaW5nIixiOiInIixlOiInIixpOiJcXG4iLGM6W3RoaXMuQkVdLHI6MH07dGhpcy5RU009e2NOOiJzdHJpbmciLGI6JyInLGU6JyInLGk6IlxcbiIsYzpbdGhpcy5CRV0scjowfTt0aGlzLkNMQ009e2NOOiJjb21tZW50IixiOiIvLyIsZToiJCJ9O3RoaXMuQ0JMQ0xNPXtjTjoiY29tbWVudCIsYjoiL1xcKiIsZToiXFwqLyJ9O3RoaXMuSENNPXtjTjoiY29tbWVudCIsYjoiIyIsZToiJCJ9O3RoaXMuTk09e2NOOiJudW1iZXIiLGI6dGhpcy5OUixyOjB9O3RoaXMuQ05NPXtjTjoibnVtYmVyIixiOnRoaXMuQ05SLHI6MH07dGhpcy5CTk09e2NOOiJudW1iZXIiLGI6dGhpcy5CTlIscjowfTt0aGlzLmluaGVyaXQ9ZnVuY3Rpb24ocSxyKXt2YXIgbz17fTtmb3IodmFyIHAgaW4gcSl7b1twXT1xW3BdfWlmKHIpe2Zvcih2YXIgcCBpbiByKXtvW3BdPXJbcF19fXJldHVybiBvfX0oKTtobGpzLkxBTkdVQUdFUy5ydWJ5PWZ1bmN0aW9uKGUpe3ZhciBhPSJbYS16QS1aX11bYS16QS1aMC05X10qKFxcIXxcXD8pPyI7dmFyIGo9IlthLXpBLVpfXVxcdypbIT89XT98Wy0rfl1cXEB8PDx8Pj58PX58PT09P3w8PT58Wzw+XT0/fFxcKlxcKnxbLS8rJV4mKn5gfF18XFxbXFxdPT8iO3ZhciBnPXtrZXl3b3JkOiJhbmQgZmFsc2UgdGhlbiBkZWZpbmVkIG1vZHVsZSBpbiByZXR1cm4gcmVkbyBpZiBCRUdJTiByZXRyeSBlbmQgZm9yIHRydWUgc2VsZiB3aGVuIG5leHQgdW50aWwgZG8gYmVnaW4gdW5sZXNzIEVORCByZXNjdWUgbmlsIGVsc2UgYnJlYWsgdW5kZWYgbm90IHN1cGVyIGNsYXNzIGNhc2UgcmVxdWlyZSB5aWVsZCBhbGlhcyB3aGlsZSBlbnN1cmUgZWxzaWYgb3IgaW5jbHVkZSJ9O3ZhciBjPXtjTjoieWFyZG9jdGFnIixiOiJAW0EtWmEtel0rIn07dmFyIGs9W3tjTjoiY29tbWVudCIsYjoiIyIsZToiJCIsYzpbY119LHtjTjoiY29tbWVudCIsYjoiXlxcPWJlZ2luIixlOiJeXFw9ZW5kIixjOltjXSxyOjEwfSx7Y046ImNvbW1lbnQiLGI6Il5fX0VORF9fIixlOiJcXG4kIn1dO3ZhciBkPXtjTjoic3Vic3QiLGI6IiNcXHsiLGU6In0iLGw6YSxrOmd9O3ZhciBpPVtlLkJFLGRdO3ZhciBiPVt7Y046InN0cmluZyIsYjoiJyIsZToiJyIsYzppLHI6MH0se2NOOiJzdHJpbmciLGI6JyInLGU6JyInLGM6aSxyOjB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT9cXCgiLGU6IlxcKSIsYzppfSx7Y046InN0cmluZyIsYjoiJVtxd10/XFxbIixlOiJcXF0iLGM6aX0se2NOOiJzdHJpbmciLGI6IiVbcXddP3siLGU6In0iLGM6aX0se2NOOiJzdHJpbmciLGI6IiVbcXddPzwiLGU6Ij4iLGM6aSxyOjEwfSx7Y046InN0cmluZyIsYjoiJVtxd10/LyIsZToiLyIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT8lIixlOiIlIixjOmkscjoxMH0se2NOOiJzdHJpbmciLGI6IiVbcXddPy0iLGU6Ii0iLGM6aSxyOjEwfSx7Y046InN0cmluZyIsYjoiJVtxd10/XFx8IixlOiJcXHwiLGM6aSxyOjEwfV07dmFyIGg9e2NOOiJmdW5jdGlvbiIsYldLOnRydWUsZToiIHwkfDsiLGs6ImRlZiIsYzpbe2NOOiJ0aXRsZSIsYjpqLGw6YSxrOmd9LHtjTjoicGFyYW1zIixiOiJcXCgiLGU6IlxcKSIsbDphLGs6Z31dLmNvbmNhdChrKX07dmFyIGY9ay5jb25jYXQoYi5jb25jYXQoW3tjTjoiY2xhc3MiLGJXSzp0cnVlLGU6IiR8OyIsazoiY2xhc3MgbW9kdWxlIixjOlt7Y046InRpdGxlIixiOiJbQS1aYS16X11cXHcqKDo6XFx3KykqKFxcP3xcXCEpPyIscjowfSx7Y046ImluaGVyaXRhbmNlIixiOiI8XFxzKiIsYzpbe2NOOiJwYXJlbnQiLGI6IigiK2UuSVIrIjo6KT8iK2UuSVJ9XX1dLmNvbmNhdChrKX0saCx7Y046ImNvbnN0YW50IixiOiIoOjopPyhcXGJbQS1aXVxcdyooOjopPykrIixyOjB9LHtjTjoic3ltYm9sIixiOiI6IixjOmIuY29uY2F0KFt7YjpqfV0pLHI6MH0se2NOOiJzeW1ib2wiLGI6YSsiOiIscjowfSx7Y046Im51bWJlciIsYjoiKFxcYjBbMC03X10rKXwoXFxiMHhbMC05YS1mQS1GX10rKXwoXFxiWzEtOV1bMC05X10qKFxcLlswLTlfXSspPyl8WzBfXVxcYiIscjowfSx7Y046Im51bWJlciIsYjoiXFw/XFx3In0se2NOOiJ2YXJpYWJsZSIsYjoiKFxcJFxcVyl8KChcXCR8XFxAXFxAPykoXFx3KykpIn0se2I6IigiK2UuUlNSKyIpXFxzKiIsYzprLmNvbmNhdChbe2NOOiJyZWdleHAiLGI6Ii8iLGU6Ii9bYS16XSoiLGk6IlxcbiIsYzpbZS5CRSxkXX1dKSxyOjB9XSkpO2QuYz1mO2guY1sxXS5jPWY7cmV0dXJue2w6YSxrOmcsYzpmfX0oaGxqcyk7aGxqcy5MQU5HVUFHRVMuZGlmZj1mdW5jdGlvbihhKXtyZXR1cm57Yzpbe2NOOiJjaHVuayIsYjoiXlxcQFxcQCArXFwtXFxkKyxcXGQrICtcXCtcXGQrLFxcZCsgK1xcQFxcQCQiLHI6MTB9LHtjTjoiY2h1bmsiLGI6Il5cXCpcXCpcXCogK1xcZCssXFxkKyArXFwqXFwqXFwqXFwqJCIscjoxMH0se2NOOiJjaHVuayIsYjoiXlxcLVxcLVxcLSArXFxkKyxcXGQrICtcXC1cXC1cXC1cXC0kIixyOjEwfSx7Y046ImhlYWRlciIsYjoiSW5kZXg6ICIsZToiJCJ9LHtjTjoiaGVhZGVyIixiOiI9PT09PSIsZToiPT09PT0kIn0se2NOOiJoZWFkZXIiLGI6Il5cXC1cXC1cXC0iLGU6IiQifSx7Y046ImhlYWRlciIsYjoiXlxcKnszfSAiLGU6IiQifSx7Y046ImhlYWRlciIsYjoiXlxcK1xcK1xcKyIsZToiJCJ9LHtjTjoiaGVhZGVyIixiOiJcXCp7NX0iLGU6IlxcKns1fSQifSx7Y046ImFkZGl0aW9uIixiOiJeXFwrIixlOiIkIn0se2NOOiJkZWxldGlvbiIsYjoiXlxcLSIsZToiJCJ9LHtjTjoiY2hhbmdlIixiOiJeXFwhIixlOiIkIn1dfX0oaGxqcyk7aGxqcy5MQU5HVUFHRVMuamF2YXNjcmlwdD1mdW5jdGlvbihhKXtyZXR1cm57azp7a2V5d29yZDoiaW4gaWYgZm9yIHdoaWxlIGZpbmFsbHkgdmFyIG5ldyBmdW5jdGlvbiBkbyByZXR1cm4gdm9pZCBlbHNlIGJyZWFrIGNhdGNoIGluc3RhbmNlb2Ygd2l0aCB0aHJvdyBjYXNlIGRlZmF1bHQgdHJ5IHRoaXMgc3dpdGNoIGNvbnRpbnVlIHR5cGVvZiBkZWxldGUgbGV0IHlpZWxkIGNvbnN0IixsaXRlcmFsOiJ0cnVlIGZhbHNlIG51bGwgdW5kZWZpbmVkIE5hTiBJbmZpbml0eSJ9LGM6W2EuQVNNLGEuUVNNLGEuQ0xDTSxhLkNCTENMTSxhLkNOTSx7YjoiKCIrYS5SU1IrInxcXGIoY2FzZXxyZXR1cm58dGhyb3cpXFxiKVxccyoiLGs6InJldHVybiB0aHJvdyBjYXNlIixjOlthLkNMQ00sYS5DQkxDTE0se2NOOiJyZWdleHAiLGI6Ii8iLGU6Ii9bZ2ltXSoiLGk6IlxcbiIsYzpbe2I6IlxcXFwvIn1dfSx7YjoiPCIsZToiPjsiLHNMOiJ4bWwifV0scjowfSx7Y046ImZ1bmN0aW9uIixiV0s6dHJ1ZSxlOiJ7IixrOiJmdW5jdGlvbiIsYzpbe2NOOiJ0aXRsZSIsYjoiW0EtWmEteiRfXVswLTlBLVphLXokX10qIn0se2NOOiJwYXJhbXMiLGI6IlxcKCIsZToiXFwpIixjOlthLkNMQ00sYS5DQkxDTE1dLGk6IltcIidcXChdIn1dLGk6IlxcW3wlIn1dfX0oaGxqcyk7aGxqcy5MQU5HVUFHRVMueG1sPWZ1bmN0aW9uKGEpe3ZhciBjPSJbQS1aYS16MC05XFwuXzotXSsiO3ZhciBiPXtlVzp0cnVlLGM6W3tjTjoiYXR0cmlidXRlIixiOmMscjowfSx7YjonPSInLHJCOnRydWUsZTonIicsYzpbe2NOOiJ2YWx1ZSIsYjonIicsZVc6dHJ1ZX1dfSx7YjoiPSciLHJCOnRydWUsZToiJyIsYzpbe2NOOiJ2YWx1ZSIsYjoiJyIsZVc6dHJ1ZX1dfSx7YjoiPSIsYzpbe2NOOiJ2YWx1ZSIsYjoiW15cXHMvPl0rIn1dfV19O3JldHVybntjSTp0cnVlLGM6W3tjTjoicGkiLGI6IjxcXD8iLGU6IlxcPz4iLHI6MTB9LHtjTjoiZG9jdHlwZSIsYjoiPCFET0NUWVBFIixlOiI+IixyOjEwLGM6W3tiOiJcXFsiLGU6IlxcXSJ9XX0se2NOOiJjb21tZW50IixiOiI8IS0tIixlOiItLT4iLHI6MTB9LHtjTjoiY2RhdGEiLGI6IjxcXCFcXFtDREFUQVxcWyIsZToiXFxdXFxdPiIscjoxMH0se2NOOiJ0YWciLGI6IjxzdHlsZSg/PVxcc3w+fCQpIixlOiI+IixrOnt0aXRsZToic3R5bGUifSxjOltiXSxzdGFydHM6e2U6Ijwvc3R5bGU+IixyRTp0cnVlLHNMOiJjc3MifX0se2NOOiJ0YWciLGI6IjxzY3JpcHQoPz1cXHN8PnwkKSIsZToiPiIsazp7dGl0bGU6InNjcmlwdCJ9LGM6W2JdLHN0YXJ0czp7ZToiPFwvc2NyaXB0PiIsckU6dHJ1ZSxzTDoiamF2YXNjcmlwdCJ9fSx7YjoiPCUiLGU6IiU+IixzTDoidmJzY3JpcHQifSx7Y046InRhZyIsYjoiPC8/IixlOiIvPz4iLGM6W3tjTjoidGl0bGUiLGI6IlteIC8+XSsifSxiXX1dfX0oaGxqcyk7aGxqcy5MQU5HVUFHRVMucGhwPWZ1bmN0aW9uKGEpe3ZhciBlPXtjTjoidmFyaWFibGUiLGI6IlxcJCtbYS16QS1aX1x4N2YtXHhmZl1bYS16QS1aMC05X1x4N2YtXHhmZl0qIn07dmFyIGI9W2EuaW5oZXJpdChhLkFTTSx7aTpudWxsfSksYS5pbmhlcml0KGEuUVNNLHtpOm51bGx9KSx7Y046InN0cmluZyIsYjonYiInLGU6JyInLGM6W2EuQkVdfSx7Y046InN0cmluZyIsYjoiYiciLGU6IiciLGM6W2EuQkVdfV07dmFyIGM9W2EuQk5NLGEuQ05NXTt2YXIgZD17Y046InRpdGxlIixiOmEuVUlSfTtyZXR1cm57Y0k6dHJ1ZSxrOiJhbmQgaW5jbHVkZV9vbmNlIGxpc3QgYWJzdHJhY3QgZ2xvYmFsIHByaXZhdGUgZWNobyBpbnRlcmZhY2UgYXMgc3RhdGljIGVuZHN3aXRjaCBhcnJheSBudWxsIGlmIGVuZHdoaWxlIG9yIGNvbnN0IGZvciBlbmRmb3JlYWNoIHNlbGYgdmFyIHdoaWxlIGlzc2V0IHB1YmxpYyBwcm90ZWN0ZWQgZXhpdCBmb3JlYWNoIHRocm93IGVsc2VpZiBpbmNsdWRlIF9fRklMRV9fIGVtcHR5IHJlcXVpcmVfb25jZSBkbyB4b3IgcmV0dXJuIGltcGxlbWVudHMgcGFyZW50IGNsb25lIHVzZSBfX0NMQVNTX18gX19MSU5FX18gZWxzZSBicmVhayBwcmludCBldmFsIG5ldyBjYXRjaCBfX01FVEhPRF9fIGNhc2UgZXhjZXB0aW9uIHBocF91c2VyX2ZpbHRlciBkZWZhdWx0IGRpZSByZXF1aXJlIF9fRlVOQ1RJT05fXyBlbmRkZWNsYXJlIGZpbmFsIHRyeSB0aGlzIHN3aXRjaCBjb250aW51ZSBlbmRmb3IgZW5kaWYgZGVjbGFyZSB1bnNldCB0cnVlIGZhbHNlIG5hbWVzcGFjZSB0cmFpdCBnb3RvIGluc3RhbmNlb2YgaW5zdGVhZG9mIF9fRElSX18gX19OQU1FU1BBQ0VfXyBfX2hhbHRfY29tcGlsZXIiLGM6W2EuQ0xDTSxhLkhDTSx7Y046ImNvbW1lbnQiLGI6Ii9cXCoiLGU6IlxcKi8iLGM6W3tjTjoicGhwZG9jIixiOiJcXHNAW0EtWmEtel0rIn1dfSx7Y046ImNvbW1lbnQiLGVCOnRydWUsYjoiX19oYWx0X2NvbXBpbGVyLis/OyIsZVc6dHJ1ZX0se2NOOiJzdHJpbmciLGI6Ijw8PFsnXCJdP1xcdytbJ1wiXT8kIixlOiJeXFx3KzsiLGM6W2EuQkVdfSx7Y046InByZXByb2Nlc3NvciIsYjoiPFxcP3BocCIscjoxMH0se2NOOiJwcmVwcm9jZXNzb3IiLGI6IlxcPz4ifSxlLHtjTjoiZnVuY3Rpb24iLGJXSzp0cnVlLGU6InsiLGs6ImZ1bmN0aW9uIixpOiJcXCR8XFxbfCUiLGM6W2Qse2NOOiJwYXJhbXMiLGI6IlxcKCIsZToiXFwpIixjOlsic2VsZiIsZSxhLkNCTENMTV0uY29uY2F0KGIpLmNvbmNhdChjKX1dfSx7Y046ImNsYXNzIixiV0s6dHJ1ZSxlOiJ7IixrOiJjbGFzcyIsaToiWzpcXChcXCRdIixjOlt7YldLOnRydWUsZVc6dHJ1ZSxrOiJleHRlbmRzIixjOltkXX0sZF19LHtiOiI9PiJ9XS5jb25jYXQoYikuY29uY2F0KGMpfX0oaGxqcyk7aGxqcy5MQU5HVUFHRVMucHl0aG9uPWZ1bmN0aW9uKGEpe3ZhciBmPXtjTjoicHJvbXB0IixiOiJeKD4+PnxcXC5cXC5cXC4pICJ9O3ZhciBjPVt7Y046InN0cmluZyIsYjoiKHV8Yik/cj8nJyciLGU6IicnJyIsYzpbZl0scjoxMH0se2NOOiJzdHJpbmciLGI6Jyh1fGIpP3I/IiIiJyxlOiciIiInLGM6W2ZdLHI6MTB9LHtjTjoic3RyaW5nIixiOiIodXxyfHVyKSciLGU6IiciLGM6W2EuQkVdLHI6MTB9LHtjTjoic3RyaW5nIixiOicodXxyfHVyKSInLGU6JyInLGM6W2EuQkVdLHI6MTB9LHtjTjoic3RyaW5nIixiOiIoYnxiciknIixlOiInIixjOlthLkJFXX0se2NOOiJzdHJpbmciLGI6JyhifGJyKSInLGU6JyInLGM6W2EuQkVdfV0uY29uY2F0KFthLkFTTSxhLlFTTV0pO3ZhciBlPXtjTjoidGl0bGUiLGI6YS5VSVJ9O3ZhciBkPXtjTjoicGFyYW1zIixiOiJcXCgiLGU6IlxcKSIsYzpbInNlbGYiLGEuQ05NLGZdLmNvbmNhdChjKX07dmFyIGI9e2JXSzp0cnVlLGU6IjoiLGk6Ilskez07XFxuXSIsYzpbZSxkXSxyOjEwfTtyZXR1cm57azp7a2V5d29yZDoiYW5kIGVsaWYgaXMgZ2xvYmFsIGFzIGluIGlmIGZyb20gcmFpc2UgZm9yIGV4Y2VwdCBmaW5hbGx5IHByaW50IGltcG9ydCBwYXNzIHJldHVybiBleGVjIGVsc2UgYnJlYWsgbm90IHdpdGggY2xhc3MgYXNzZXJ0IHlpZWxkIHRyeSB3aGlsZSBjb250aW51ZSBkZWwgb3IgZGVmIGxhbWJkYSBub25sb2NhbHwxMCIsYnVpbHRfaW46Ik5vbmUgVHJ1ZSBGYWxzZSBFbGxpcHNpcyBOb3RJbXBsZW1lbnRlZCJ9LGk6Iig8L3wtPnxcXD8pIixjOmMuY29uY2F0KFtmLGEuSENNLGEuaW5oZXJpdChiLHtjTjoiZnVuY3Rpb24iLGs6ImRlZiJ9KSxhLmluaGVyaXQoYix7Y046ImNsYXNzIixrOiJjbGFzcyJ9KSxhLkNOTSx7Y046ImRlY29yYXRvciIsYjoiQCIsZToiJCJ9LHtiOiJcXGIocHJpbnR8ZXhlYylcXCgifV0pfX0oaGxqcyk7aGxqcy5MQU5HVUFHRVMuanNvbj1mdW5jdGlvbihhKXt2YXIgZT17bGl0ZXJhbDoidHJ1ZSBmYWxzZSBudWxsIn07dmFyIGQ9W2EuUVNNLGEuQ05NXTt2YXIgYz17Y046InZhbHVlIixlOiIsIixlVzp0cnVlLGVFOnRydWUsYzpkLGs6ZX07dmFyIGI9e2I6InsiLGU6In0iLGM6W3tjTjoiYXR0cmlidXRlIixiOidcXHMqIicsZTonIlxccyo6XFxzKicsZUI6dHJ1ZSxlRTp0cnVlLGM6W2EuQkVdLGk6IlxcbiIsc3RhcnRzOmN9XSxpOiJcXFMifTt2YXIgZj17YjoiXFxbIixlOiJcXF0iLGM6W2EuaW5oZXJpdChjLHtjTjpudWxsfSldLGk6IlxcUyJ9O2Quc3BsaWNlKGQubGVuZ3RoLDAsYixmKTtyZXR1cm57YzpkLGs6ZSxpOiJcXFMifX0oaGxqcyk7DQorLyoKKworQ29weXJpZ2h0IChjKSAyMDA2LCBJdmFuIFNhZ2FsYWV2CitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIGhpZ2hsaWdodC5qcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgCisgICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgCisgICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCitFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECitPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisqLworCit2YXIgaGxqcz1uZXcgZnVuY3Rpb24oKXtmdW5jdGlvbiBsKG8pe3JldHVybiBvLnJlcGxhY2UoLyYvZ20sIiZhbXA7IikucmVwbGFjZSgvPC9nbSwiJmx0OyIpLnJlcGxhY2UoLz4vZ20sIiZndDsiKX1mdW5jdGlvbiBiKHApe2Zvcih2YXIgbz1wLmZpcnN0Q2hpbGQ7bztvPW8ubmV4dFNpYmxpbmcpe2lmKG8ubm9kZU5hbWU9PSJDT0RFIil7cmV0dXJuIG99aWYoIShvLm5vZGVUeXBlPT0zJiZvLm5vZGVWYWx1ZS5tYXRjaCgvXHMrLykpKXticmVha319fWZ1bmN0aW9uIGgocCxvKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHAuY2hpbGROb2RlcyxmdW5jdGlvbihxKXtpZihxLm5vZGVUeXBlPT0zKXtyZXR1cm4gbz9xLm5vZGVWYWx1ZS5yZXBsYWNlKC9cbi9nLCIiKTpxLm5vZGVWYWx1ZX1pZihxLm5vZGVOYW1lPT0iQlIiKXtyZXR1cm4iXG4ifXJldHVybiBoKHEsbyl9KS5qb2luKCIiKX1mdW5jdGlvbiBhKHEpe3ZhciBwPShxLmNsYXNzTmFtZSsiICIrcS5wYXJlbnROb2RlLmNsYXNzTmFtZSkuc3BsaXQoL1xzKy8pO3A9cC5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIucmVwbGFjZSgvXmxhbmd1YWdlLS8sIiIpfSk7Zm9yKHZhciBvPTA7bzxwLmxlbmd0aDtvKyspe2lmKGVbcFtvXV18fHBbb109PSJuby1oaWdobGlnaHQiKXtyZXR1cm4gcFtvXX19fWZ1bmN0aW9uIGMocSl7dmFyIG89W107KGZ1bmN0aW9uIHAocixzKXtmb3IodmFyIHQ9ci5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKXtpZih0Lm5vZGVUeXBlPT0zKXtzKz10Lm5vZGVWYWx1ZS5sZW5ndGh9ZWxzZXtpZih0Lm5vZGVOYW1lPT0iQlIiKXtzKz0xfWVsc2V7aWYodC5ub2RlVHlwZT09MSl7by5wdXNoKHtldmVudDoic3RhcnQiLG9mZnNldDpzLG5vZGU6dH0pO3M9cCh0LHMpO28ucHVzaCh7ZXZlbnQ6InN0b3AiLG9mZnNldDpzLG5vZGU6dH0pfX19fXJldHVybiBzfSkocSwwKTtyZXR1cm4gb31mdW5jdGlvbiBqKHgsdix3KXt2YXIgcD0wO3ZhciB5PSIiO3ZhciByPVtdO2Z1bmN0aW9uIHQoKXtpZih4Lmxlbmd0aCYmdi5sZW5ndGgpe2lmKHhbMF0ub2Zmc2V0IT12WzBdLm9mZnNldCl7cmV0dXJuKHhbMF0ub2Zmc2V0PHZbMF0ub2Zmc2V0KT94OnZ9ZWxzZXtyZXR1cm4gdlswXS5ldmVudD09InN0YXJ0Ij94OnZ9fWVsc2V7cmV0dXJuIHgubGVuZ3RoP3g6dn19ZnVuY3Rpb24gcyhBKXtmdW5jdGlvbiB6KEIpe3JldHVybiIgIitCLm5vZGVOYW1lKyc9IicrbChCLnZhbHVlKSsnIid9cmV0dXJuIjwiK0Eubm9kZU5hbWUrQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKEEuYXR0cmlidXRlcyx6KS5qb2luKCIiKSsiPiJ9d2hpbGUoeC5sZW5ndGh8fHYubGVuZ3RoKXt2YXIgdT10KCkuc3BsaWNlKDAsMSlbMF07eSs9bCh3LnN1YnN0cihwLHUub2Zmc2V0LXApKTtwPXUub2Zmc2V0O2lmKHUuZXZlbnQ9PSJzdGFydCIpe3krPXModS5ub2RlKTtyLnB1c2godS5ub2RlKX1lbHNle2lmKHUuZXZlbnQ9PSJzdG9wIil7dmFyIG8scT1yLmxlbmd0aDtkb3txLS07bz1yW3FdO3krPSgiPC8iK28ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSsiPiIpfXdoaWxlKG8hPXUubm9kZSk7ci5zcGxpY2UocSwxKTt3aGlsZShxPHIubGVuZ3RoKXt5Kz1zKHJbcV0pO3ErK319fX1yZXR1cm4geStsKHcuc3Vic3RyKHApKX1mdW5jdGlvbiBmKHEpe2Z1bmN0aW9uIG8ocyxyKXtyZXR1cm4gUmVnRXhwKHMsIm0iKyhxLmNJPyJpIjoiIikrKHI/ImciOiIiKSl9ZnVuY3Rpb24gcCh5LHcpe2lmKHkuY29tcGlsZWQpe3JldHVybn15LmNvbXBpbGVkPXRydWU7dmFyIHM9W107aWYoeS5rKXt2YXIgcj17fTtmdW5jdGlvbiB6KEEsdCl7dC5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oQil7dmFyIEM9Qi5zcGxpdCgifCIpO3JbQ1swXV09W0EsQ1sxXT9OdW1iZXIoQ1sxXSk6MV07cy5wdXNoKENbMF0pfSl9eS5sUj1vKHkubHx8aGxqcy5JUix0cnVlKTtpZih0eXBlb2YgeS5rPT0ic3RyaW5nIil7eigia2V5d29yZCIseS5rKX1lbHNle2Zvcih2YXIgeCBpbiB5Lmspe2lmKCF5LmsuaGFzT3duUHJvcGVydHkoeCkpe2NvbnRpbnVlfXooeCx5LmtbeF0pfX15Lms9cn1pZih3KXtpZih5LmJXSyl7eS5iPSJcXGIoIitzLmpvaW4oInwiKSsiKVxccyJ9eS5iUj1vKHkuYj95LmI6IlxcQnxcXGIiKTtpZigheS5lJiYheS5lVyl7eS5lPSJcXEJ8XFxiIn1pZih5LmUpe3kuZVI9byh5LmUpfXkudEU9eS5lfHwiIjtpZih5LmVXJiZ3LnRFKXt5LnRFKz0oeS5lPyJ8IjoiIikrdy50RX19aWYoeS5pKXt5LmlSPW8oeS5pKX1pZih5LnI9PT11bmRlZmluZWQpe3kucj0xfWlmKCF5LmMpe3kuYz1bXX1mb3IodmFyIHY9MDt2PHkuYy5sZW5ndGg7disrKXtpZih5LmNbdl09PSJzZWxmIil7eS5jW3ZdPXl9cCh5LmNbdl0seSl9aWYoeS5zdGFydHMpe3AoeS5zdGFydHMsdyl9dmFyIHU9W107Zm9yKHZhciB2PTA7djx5LmMubGVuZ3RoO3YrKyl7dS5wdXNoKHkuY1t2XS5iKX1pZih5LnRFKXt1LnB1c2goeS50RSl9aWYoeS5pKXt1LnB1c2goeS5pKX15LnQ9dS5sZW5ndGg/byh1LmpvaW4oInwiKSx0cnVlKTp7ZXhlYzpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbH19fXAocSl9ZnVuY3Rpb24gZChELEUpe2Z1bmN0aW9uIG8ocixNKXtmb3IodmFyIEw9MDtMPE0uYy5sZW5ndGg7TCsrKXt2YXIgSz1NLmNbTF0uYlIuZXhlYyhyKTtpZihLJiZLLmluZGV4PT0wKXtyZXR1cm4gTS5jW0xdfX19ZnVuY3Rpb24gcyhLLHIpe2lmKEsuZSYmSy5lUi50ZXN0KHIpKXtyZXR1cm4gS31pZihLLmVXKXtyZXR1cm4gcyhLLnBhcmVudCxyKX19ZnVuY3Rpb24gdChyLEspe3JldHVybiBLLmkmJksuaVIudGVzdChyKX1mdW5jdGlvbiB5KEwscil7dmFyIEs9Ri5jST9yWzBdLnRvTG93ZXJDYXNlKCk6clswXTtyZXR1cm4gTC5rLmhhc093blByb3BlcnR5KEspJiZMLmtbS119ZnVuY3Rpb24gRygpe3ZhciBLPWwodyk7aWYoIUEuayl7cmV0dXJuIEt9dmFyIHI9IiI7dmFyIE49MDtBLmxSLmxhc3RJbmRleD0wO3ZhciBMPUEubFIuZXhlYyhLKTt3aGlsZShMKXtyKz1LLnN1YnN0cihOLEwuaW5kZXgtTik7dmFyIE09eShBLEwpO2lmKE0pe3YrPU1bMV07cis9JzxzcGFuIGNsYXNzPSInK01bMF0rJyI+JytMWzBdKyI8L3NwYW4+In1lbHNle3IrPUxbMF19Tj1BLmxSLmxhc3RJbmRleDtMPUEubFIuZXhlYyhLKX1yZXR1cm4gcitLLnN1YnN0cihOKX1mdW5jdGlvbiB6KCl7aWYoQS5zTCYmIWVbQS5zTF0pe3JldHVybiBsKHcpfXZhciByPUEuc0w/ZChBLnNMLHcpOmcodyk7aWYoQS5yPjApe3YrPXIua2V5d29yZF9jb3VudDtCKz1yLnJ9cmV0dXJuJzxzcGFuIGNsYXNzPSInK3IubGFuZ3VhZ2UrJyI+JytyLnZhbHVlKyI8L3NwYW4+In1mdW5jdGlvbiBKKCl7cmV0dXJuIEEuc0whPT11bmRlZmluZWQ/eigpOkcoKX1mdW5jdGlvbiBJKEwscil7dmFyIEs9TC5jTj8nPHNwYW4gY2xhc3M9IicrTC5jTisnIj4nOiIiO2lmKEwuckIpe3grPUs7dz0iIn1lbHNle2lmKEwuZUIpe3grPWwocikrSzt3PSIifWVsc2V7eCs9Szt3PXJ9fUE9T2JqZWN0LmNyZWF0ZShMLHtwYXJlbnQ6e3ZhbHVlOkF9fSk7Qis9TC5yfWZ1bmN0aW9uIEMoSyxyKXt3Kz1LO2lmKHI9PT11bmRlZmluZWQpe3grPUooKTtyZXR1cm4gMH12YXIgTD1vKHIsQSk7aWYoTCl7eCs9SigpO0koTCxyKTtyZXR1cm4gTC5yQj8wOnIubGVuZ3RofXZhciBNPXMoQSxyKTtpZihNKXtpZighKE0uckV8fE0uZUUpKXt3Kz1yfXgrPUooKTtkb3tpZihBLmNOKXt4Kz0iPC9zcGFuPiJ9QT1BLnBhcmVudH13aGlsZShBIT1NLnBhcmVudCk7aWYoTS5lRSl7eCs9bChyKX13PSIiO2lmKE0uc3RhcnRzKXtJKE0uc3RhcnRzLCIiKX1yZXR1cm4gTS5yRT8wOnIubGVuZ3RofWlmKHQocixBKSl7dGhyb3ciSWxsZWdhbCJ9dys9cjtyZXR1cm4gci5sZW5ndGh8fDF9dmFyIEY9ZVtEXTtmKEYpO3ZhciBBPUY7dmFyIHc9IiI7dmFyIEI9MDt2YXIgdj0wO3ZhciB4PSIiO3RyeXt2YXIgdSxxLHA9MDt3aGlsZSh0cnVlKXtBLnQubGFzdEluZGV4PXA7dT1BLnQuZXhlYyhFKTtpZighdSl7YnJlYWt9cT1DKEUuc3Vic3RyKHAsdS5pbmRleC1wKSx1WzBdKTtwPXUuaW5kZXgrcX1DKEUuc3Vic3RyKHApKTtyZXR1cm57cjpCLGtleXdvcmRfY291bnQ6dix2YWx1ZTp4LGxhbmd1YWdlOkR9fWNhdGNoKEgpe2lmKEg9PSJJbGxlZ2FsIil7cmV0dXJue3I6MCxrZXl3b3JkX2NvdW50OjAsdmFsdWU6bChFKX19ZWxzZXt0aHJvdyBIfX19ZnVuY3Rpb24gZyhzKXt2YXIgbz17a2V5d29yZF9jb3VudDowLHI6MCx2YWx1ZTpsKHMpfTt2YXIgcT1vO2Zvcih2YXIgcCBpbiBlKXtpZighZS5oYXNPd25Qcm9wZXJ0eShwKSl7Y29udGludWV9dmFyIHI9ZChwLHMpO3IubGFuZ3VhZ2U9cDtpZihyLmtleXdvcmRfY291bnQrci5yPnEua2V5d29yZF9jb3VudCtxLnIpe3E9cn1pZihyLmtleXdvcmRfY291bnQrci5yPm8ua2V5d29yZF9jb3VudCtvLnIpe3E9bztvPXJ9fWlmKHEubGFuZ3VhZ2Upe28uc2Vjb25kX2Jlc3Q9cX1yZXR1cm4gb31mdW5jdGlvbiBpKHEscCxvKXtpZihwKXtxPXEucmVwbGFjZSgvXigoPFtePl0rPnxcdCkrKS9nbSxmdW5jdGlvbihyLHYsdSx0KXtyZXR1cm4gdi5yZXBsYWNlKC9cdC9nLHApfSl9aWYobyl7cT1xLnJlcGxhY2UoL1xuL2csIjxicj4iKX1yZXR1cm4gcX1mdW5jdGlvbiBtKHIsdSxwKXt2YXIgdj1oKHIscCk7dmFyIHQ9YShyKTtpZih0PT0ibm8taGlnaGxpZ2h0Iil7cmV0dXJufXZhciB3PXQ/ZCh0LHYpOmcodik7dD13Lmxhbmd1YWdlO3ZhciBvPWMocik7aWYoby5sZW5ndGgpe3ZhciBxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByZSIpO3EuaW5uZXJIVE1MPXcudmFsdWU7dy52YWx1ZT1qKG8sYyhxKSx2KX13LnZhbHVlPWkody52YWx1ZSx1LHApO3ZhciBzPXIuY2xhc3NOYW1lO2lmKCFzLm1hdGNoKCIoXFxzfF4pKGxhbmd1YWdlLSk/Iit0KyIoXFxzfCQpIikpe3M9cz8ocysiICIrdCk6dH1yLmlubmVySFRNTD13LnZhbHVlO3IuY2xhc3NOYW1lPXM7ci5yZXN1bHQ9e2xhbmd1YWdlOnQsa3c6dy5rZXl3b3JkX2NvdW50LHJlOncucn07aWYody5zZWNvbmRfYmVzdCl7ci5zZWNvbmRfYmVzdD17bGFuZ3VhZ2U6dy5zZWNvbmRfYmVzdC5sYW5ndWFnZSxrdzp3LnNlY29uZF9iZXN0LmtleXdvcmRfY291bnQscmU6dy5zZWNvbmRfYmVzdC5yfX19ZnVuY3Rpb24gbigpe2lmKG4uY2FsbGVkKXtyZXR1cm59bi5jYWxsZWQ9dHJ1ZTtBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByZSIpLGIpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe20obyxobGpzLnRhYlJlcGxhY2UpfSl9ZnVuY3Rpb24gaygpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixuLGZhbHNlKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsbixmYWxzZSl9dmFyIGU9e307dGhpcy5MQU5HVUFHRVM9ZTt0aGlzLmhpZ2hsaWdodD1kO3RoaXMuaGlnaGxpZ2h0QXV0bz1nO3RoaXMuZml4TWFya3VwPWk7dGhpcy5oaWdobGlnaHRCbG9jaz1tO3RoaXMuaW5pdEhpZ2hsaWdodGluZz1uO3RoaXMuaW5pdEhpZ2hsaWdodGluZ09uTG9hZD1rO3RoaXMuSVI9IlthLXpBLVpdW2EtekEtWjAtOV9dKiI7dGhpcy5VSVI9IlthLXpBLVpfXVthLXpBLVowLTlfXSoiO3RoaXMuTlI9IlxcYlxcZCsoXFwuXFxkKyk/Ijt0aGlzLkNOUj0iKFxcYjBbeFhdW2EtZkEtRjAtOV0rfChcXGJcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWy0rXT9cXGQrKT8pIjt0aGlzLkJOUj0iXFxiKDBiWzAxXSspIjt0aGlzLlJTUj0iIXwhPXwhPT18JXwlPXwmfCYmfCY9fFxcKnxcXCo9fFxcK3xcXCs9fCx8XFwufC18LT18L3wvPXw6fDt8PHw8PHw8PD18PD18PXw9PXw9PT18Pnw+PXw+Pnw+Pj18Pj4+fD4+Pj18XFw/fFxcW3xcXHt8XFwofFxcXnxcXF49fFxcfHxcXHw9fFxcfFxcfHx+Ijt0aGlzLkJFPXtiOiJcXFxcW1xcc1xcU10iLHI6MH07dGhpcy5BU009e2NOOiJzdHJpbmciLGI6IiciLGU6IiciLGk6IlxcbiIsYzpbdGhpcy5CRV0scjowfTt0aGlzLlFTTT17Y046InN0cmluZyIsYjonIicsZTonIicsaToiXFxuIixjOlt0aGlzLkJFXSxyOjB9O3RoaXMuQ0xDTT17Y046ImNvbW1lbnQiLGI6Ii8vIixlOiIkIn07dGhpcy5DQkxDTE09e2NOOiJjb21tZW50IixiOiIvXFwqIixlOiJcXCovIn07dGhpcy5IQ009e2NOOiJjb21tZW50IixiOiIjIixlOiIkIn07dGhpcy5OTT17Y046Im51bWJlciIsYjp0aGlzLk5SLHI6MH07dGhpcy5DTk09e2NOOiJudW1iZXIiLGI6dGhpcy5DTlIscjowfTt0aGlzLkJOTT17Y046Im51bWJlciIsYjp0aGlzLkJOUixyOjB9O3RoaXMuaW5oZXJpdD1mdW5jdGlvbihxLHIpe3ZhciBvPXt9O2Zvcih2YXIgcCBpbiBxKXtvW3BdPXFbcF19aWYocil7Zm9yKHZhciBwIGluIHIpe29bcF09cltwXX19cmV0dXJuIG99fSgpO2hsanMuTEFOR1VBR0VTLnJ1Ynk9ZnVuY3Rpb24oZSl7dmFyIGE9IlthLXpBLVpfXVthLXpBLVowLTlfXSooXFwhfFxcPyk/Ijt2YXIgaj0iW2EtekEtWl9dXFx3KlshPz1dP3xbLSt+XVxcQHw8PHw+Pnw9fnw9PT0/fDw9PnxbPD5dPT98XFwqXFwqfFstLyslXiYqfmB8XXxcXFtcXF09PyI7dmFyIGc9e2tleXdvcmQ6ImFuZCBmYWxzZSB0aGVuIGRlZmluZWQgbW9kdWxlIGluIHJldHVybiByZWRvIGlmIEJFR0lOIHJldHJ5IGVuZCBmb3IgdHJ1ZSBzZWxmIHdoZW4gbmV4dCB1bnRpbCBkbyBiZWdpbiB1bmxlc3MgRU5EIHJlc2N1ZSBuaWwgZWxzZSBicmVhayB1bmRlZiBub3Qgc3VwZXIgY2xhc3MgY2FzZSByZXF1aXJlIHlpZWxkIGFsaWFzIHdoaWxlIGVuc3VyZSBlbHNpZiBvciBpbmNsdWRlIn07dmFyIGM9e2NOOiJ5YXJkb2N0YWciLGI6IkBbQS1aYS16XSsifTt2YXIgaz1be2NOOiJjb21tZW50IixiOiIjIixlOiIkIixjOltjXX0se2NOOiJjb21tZW50IixiOiJeXFw9YmVnaW4iLGU6Il5cXD1lbmQiLGM6W2NdLHI6MTB9LHtjTjoiY29tbWVudCIsYjoiXl9fRU5EX18iLGU6IlxcbiQifV07dmFyIGQ9e2NOOiJzdWJzdCIsYjoiI1xceyIsZToifSIsbDphLGs6Z307dmFyIGk9W2UuQkUsZF07dmFyIGI9W3tjTjoic3RyaW5nIixiOiInIixlOiInIixjOmkscjowfSx7Y046InN0cmluZyIsYjonIicsZTonIicsYzppLHI6MH0se2NOOiJzdHJpbmciLGI6IiVbcXddP1xcKCIsZToiXFwpIixjOml9LHtjTjoic3RyaW5nIixiOiIlW3F3XT9cXFsiLGU6IlxcXSIsYzppfSx7Y046InN0cmluZyIsYjoiJVtxd10/eyIsZToifSIsYzppfSx7Y046InN0cmluZyIsYjoiJVtxd10/PCIsZToiPiIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT8vIixlOiIvIixjOmkscjoxMH0se2NOOiJzdHJpbmciLGI6IiVbcXddPyUiLGU6IiUiLGM6aSxyOjEwfSx7Y046InN0cmluZyIsYjoiJVtxd10/LSIsZToiLSIsYzppLHI6MTB9LHtjTjoic3RyaW5nIixiOiIlW3F3XT9cXHwiLGU6IlxcfCIsYzppLHI6MTB9XTt2YXIgaD17Y046ImZ1bmN0aW9uIixiV0s6dHJ1ZSxlOiIgfCR8OyIsazoiZGVmIixjOlt7Y046InRpdGxlIixiOmosbDphLGs6Z30se2NOOiJwYXJhbXMiLGI6IlxcKCIsZToiXFwpIixsOmEsazpnfV0uY29uY2F0KGspfTt2YXIgZj1rLmNvbmNhdChiLmNvbmNhdChbe2NOOiJjbGFzcyIsYldLOnRydWUsZToiJHw7IixrOiJjbGFzcyBtb2R1bGUiLGM6W3tjTjoidGl0bGUiLGI6IltBLVphLXpfXVxcdyooOjpcXHcrKSooXFw/fFxcISk/IixyOjB9LHtjTjoiaW5oZXJpdGFuY2UiLGI6IjxcXHMqIixjOlt7Y046InBhcmVudCIsYjoiKCIrZS5JUisiOjopPyIrZS5JUn1dfV0uY29uY2F0KGspfSxoLHtjTjoiY29uc3RhbnQiLGI6Iig6Oik/KFxcYltBLVpdXFx3Kig6Oik/KSsiLHI6MH0se2NOOiJzeW1ib2wiLGI6IjoiLGM6Yi5jb25jYXQoW3tiOmp9XSkscjowfSx7Y046InN5bWJvbCIsYjphKyI6IixyOjB9LHtjTjoibnVtYmVyIixiOiIoXFxiMFswLTdfXSspfChcXGIweFswLTlhLWZBLUZfXSspfChcXGJbMS05XVswLTlfXSooXFwuWzAtOV9dKyk/KXxbMF9dXFxiIixyOjB9LHtjTjoibnVtYmVyIixiOiJcXD9cXHcifSx7Y046InZhcmlhYmxlIixiOiIoXFwkXFxXKXwoKFxcJHxcXEBcXEA/KShcXHcrKSkifSx7YjoiKCIrZS5SU1IrIilcXHMqIixjOmsuY29uY2F0KFt7Y046InJlZ2V4cCIsYjoiLyIsZToiL1thLXpdKiIsaToiXFxuIixjOltlLkJFLGRdfV0pLHI6MH1dKSk7ZC5jPWY7aC5jWzFdLmM9ZjtyZXR1cm57bDphLGs6ZyxjOmZ9fShobGpzKTtobGpzLkxBTkdVQUdFUy5kaWZmPWZ1bmN0aW9uKGEpe3JldHVybntjOlt7Y046ImNodW5rIixiOiJeXFxAXFxAICtcXC1cXGQrLFxcZCsgK1xcK1xcZCssXFxkKyArXFxAXFxAJCIscjoxMH0se2NOOiJjaHVuayIsYjoiXlxcKlxcKlxcKiArXFxkKyxcXGQrICtcXCpcXCpcXCpcXCokIixyOjEwfSx7Y046ImNodW5rIixiOiJeXFwtXFwtXFwtICtcXGQrLFxcZCsgK1xcLVxcLVxcLVxcLSQiLHI6MTB9LHtjTjoiaGVhZGVyIixiOiJJbmRleDogIixlOiIkIn0se2NOOiJoZWFkZXIiLGI6Ij09PT09IixlOiI9PT09PSQifSx7Y046ImhlYWRlciIsYjoiXlxcLVxcLVxcLSIsZToiJCJ9LHtjTjoiaGVhZGVyIixiOiJeXFwqezN9ICIsZToiJCJ9LHtjTjoiaGVhZGVyIixiOiJeXFwrXFwrXFwrIixlOiIkIn0se2NOOiJoZWFkZXIiLGI6IlxcKns1fSIsZToiXFwqezV9JCJ9LHtjTjoiYWRkaXRpb24iLGI6Il5cXCsiLGU6IiQifSx7Y046ImRlbGV0aW9uIixiOiJeXFwtIixlOiIkIn0se2NOOiJjaGFuZ2UiLGI6Il5cXCEiLGU6IiQifV19fShobGpzKTtobGpzLkxBTkdVQUdFUy5qYXZhc2NyaXB0PWZ1bmN0aW9uKGEpe3JldHVybntrOntrZXl3b3JkOiJpbiBpZiBmb3Igd2hpbGUgZmluYWxseSB2YXIgbmV3IGZ1bmN0aW9uIGRvIHJldHVybiB2b2lkIGVsc2UgYnJlYWsgY2F0Y2ggaW5zdGFuY2VvZiB3aXRoIHRocm93IGNhc2UgZGVmYXVsdCB0cnkgdGhpcyBzd2l0Y2ggY29udGludWUgdHlwZW9mIGRlbGV0ZSBsZXQgeWllbGQgY29uc3QiLGxpdGVyYWw6InRydWUgZmFsc2UgbnVsbCB1bmRlZmluZWQgTmFOIEluZmluaXR5In0sYzpbYS5BU00sYS5RU00sYS5DTENNLGEuQ0JMQ0xNLGEuQ05NLHtiOiIoIithLlJTUisifFxcYihjYXNlfHJldHVybnx0aHJvdylcXGIpXFxzKiIsazoicmV0dXJuIHRocm93IGNhc2UiLGM6W2EuQ0xDTSxhLkNCTENMTSx7Y046InJlZ2V4cCIsYjoiLyIsZToiL1tnaW1dKiIsaToiXFxuIixjOlt7YjoiXFxcXC8ifV19LHtiOiI8IixlOiI+OyIsc0w6InhtbCJ9XSxyOjB9LHtjTjoiZnVuY3Rpb24iLGJXSzp0cnVlLGU6InsiLGs6ImZ1bmN0aW9uIixjOlt7Y046InRpdGxlIixiOiJbQS1aYS16JF9dWzAtOUEtWmEteiRfXSoifSx7Y046InBhcmFtcyIsYjoiXFwoIixlOiJcXCkiLGM6W2EuQ0xDTSxhLkNCTENMTV0saToiW1wiJ1xcKF0ifV0saToiXFxbfCUifV19fShobGpzKTtobGpzLkxBTkdVQUdFUy54bWw9ZnVuY3Rpb24oYSl7dmFyIGM9IltBLVphLXowLTlcXC5fOi1dKyI7dmFyIGI9e2VXOnRydWUsYzpbe2NOOiJhdHRyaWJ1dGUiLGI6YyxyOjB9LHtiOic9IicsckI6dHJ1ZSxlOiciJyxjOlt7Y046InZhbHVlIixiOiciJyxlVzp0cnVlfV19LHtiOiI9JyIsckI6dHJ1ZSxlOiInIixjOlt7Y046InZhbHVlIixiOiInIixlVzp0cnVlfV19LHtiOiI9IixjOlt7Y046InZhbHVlIixiOiJbXlxccy8+XSsifV19XX07cmV0dXJue2NJOnRydWUsYzpbe2NOOiJwaSIsYjoiPFxcPyIsZToiXFw/PiIscjoxMH0se2NOOiJkb2N0eXBlIixiOiI8IURPQ1RZUEUiLGU6Ij4iLHI6MTAsYzpbe2I6IlxcWyIsZToiXFxdIn1dfSx7Y046ImNvbW1lbnQiLGI6IjwhLS0iLGU6Ii0tPiIscjoxMH0se2NOOiJjZGF0YSIsYjoiPFxcIVxcW0NEQVRBXFxbIixlOiJcXF1cXF0+IixyOjEwfSx7Y046InRhZyIsYjoiPHN0eWxlKD89XFxzfD58JCkiLGU6Ij4iLGs6e3RpdGxlOiJzdHlsZSJ9LGM6W2JdLHN0YXJ0czp7ZToiPC9zdHlsZT4iLHJFOnRydWUsc0w6ImNzcyJ9fSx7Y046InRhZyIsYjoiPHNjcmlwdCg/PVxcc3w+fCQpIixlOiI+IixrOnt0aXRsZToic2NyaXB0In0sYzpbYl0sc3RhcnRzOntlOiI8XC9zY3JpcHQ+IixyRTp0cnVlLHNMOiJqYXZhc2NyaXB0In19LHtiOiI8JSIsZToiJT4iLHNMOiJ2YnNjcmlwdCJ9LHtjTjoidGFnIixiOiI8Lz8iLGU6Ii8/PiIsYzpbe2NOOiJ0aXRsZSIsYjoiW14gLz5dKyJ9LGJdfV19fShobGpzKTtobGpzLkxBTkdVQUdFUy5waHA9ZnVuY3Rpb24oYSl7dmFyIGU9e2NOOiJ2YXJpYWJsZSIsYjoiXFwkK1thLXpBLVpfXHg3Zi1ceGZmXVthLXpBLVowLTlfXHg3Zi1ceGZmXSoifTt2YXIgYj1bYS5pbmhlcml0KGEuQVNNLHtpOm51bGx9KSxhLmluaGVyaXQoYS5RU00se2k6bnVsbH0pLHtjTjoic3RyaW5nIixiOidiIicsZTonIicsYzpbYS5CRV19LHtjTjoic3RyaW5nIixiOiJiJyIsZToiJyIsYzpbYS5CRV19XTt2YXIgYz1bYS5CTk0sYS5DTk1dO3ZhciBkPXtjTjoidGl0bGUiLGI6YS5VSVJ9O3JldHVybntjSTp0cnVlLGs6ImFuZCBpbmNsdWRlX29uY2UgbGlzdCBhYnN0cmFjdCBnbG9iYWwgcHJpdmF0ZSBlY2hvIGludGVyZmFjZSBhcyBzdGF0aWMgZW5kc3dpdGNoIGFycmF5IG51bGwgaWYgZW5kd2hpbGUgb3IgY29uc3QgZm9yIGVuZGZvcmVhY2ggc2VsZiB2YXIgd2hpbGUgaXNzZXQgcHVibGljIHByb3RlY3RlZCBleGl0IGZvcmVhY2ggdGhyb3cgZWxzZWlmIGluY2x1ZGUgX19GSUxFX18gZW1wdHkgcmVxdWlyZV9vbmNlIGRvIHhvciByZXR1cm4gaW1wbGVtZW50cyBwYXJlbnQgY2xvbmUgdXNlIF9fQ0xBU1NfXyBfX0xJTkVfXyBlbHNlIGJyZWFrIHByaW50IGV2YWwgbmV3IGNhdGNoIF9fTUVUSE9EX18gY2FzZSBleGNlcHRpb24gcGhwX3VzZXJfZmlsdGVyIGRlZmF1bHQgZGllIHJlcXVpcmUgX19GVU5DVElPTl9fIGVuZGRlY2xhcmUgZmluYWwgdHJ5IHRoaXMgc3dpdGNoIGNvbnRpbnVlIGVuZGZvciBlbmRpZiBkZWNsYXJlIHVuc2V0IHRydWUgZmFsc2UgbmFtZXNwYWNlIHRyYWl0IGdvdG8gaW5zdGFuY2VvZiBpbnN0ZWFkb2YgX19ESVJfXyBfX05BTUVTUEFDRV9fIF9faGFsdF9jb21waWxlciIsYzpbYS5DTENNLGEuSENNLHtjTjoiY29tbWVudCIsYjoiL1xcKiIsZToiXFwqLyIsYzpbe2NOOiJwaHBkb2MiLGI6Ilxcc0BbQS1aYS16XSsifV19LHtjTjoiY29tbWVudCIsZUI6dHJ1ZSxiOiJfX2hhbHRfY29tcGlsZXIuKz87IixlVzp0cnVlfSx7Y046InN0cmluZyIsYjoiPDw8WydcIl0/XFx3K1snXCJdPyQiLGU6Il5cXHcrOyIsYzpbYS5CRV19LHtjTjoicHJlcHJvY2Vzc29yIixiOiI8XFw/cGhwIixyOjEwfSx7Y046InByZXByb2Nlc3NvciIsYjoiXFw/PiJ9LGUse2NOOiJmdW5jdGlvbiIsYldLOnRydWUsZToieyIsazoiZnVuY3Rpb24iLGk6IlxcJHxcXFt8JSIsYzpbZCx7Y046InBhcmFtcyIsYjoiXFwoIixlOiJcXCkiLGM6WyJzZWxmIixlLGEuQ0JMQ0xNXS5jb25jYXQoYikuY29uY2F0KGMpfV19LHtjTjoiY2xhc3MiLGJXSzp0cnVlLGU6InsiLGs6ImNsYXNzIixpOiJbOlxcKFxcJF0iLGM6W3tiV0s6dHJ1ZSxlVzp0cnVlLGs6ImV4dGVuZHMiLGM6W2RdfSxkXX0se2I6Ij0+In1dLmNvbmNhdChiKS5jb25jYXQoYyl9fShobGpzKTtobGpzLkxBTkdVQUdFUy5weXRob249ZnVuY3Rpb24oYSl7dmFyIGY9e2NOOiJwcm9tcHQiLGI6Il4oPj4+fFxcLlxcLlxcLikgIn07dmFyIGM9W3tjTjoic3RyaW5nIixiOiIodXxiKT9yPycnJyIsZToiJycnIixjOltmXSxyOjEwfSx7Y046InN0cmluZyIsYjonKHV8Yik/cj8iIiInLGU6JyIiIicsYzpbZl0scjoxMH0se2NOOiJzdHJpbmciLGI6Iih1fHJ8dXIpJyIsZToiJyIsYzpbYS5CRV0scjoxMH0se2NOOiJzdHJpbmciLGI6Jyh1fHJ8dXIpIicsZTonIicsYzpbYS5CRV0scjoxMH0se2NOOiJzdHJpbmciLGI6IihifGJyKSciLGU6IiciLGM6W2EuQkVdfSx7Y046InN0cmluZyIsYjonKGJ8YnIpIicsZTonIicsYzpbYS5CRV19XS5jb25jYXQoW2EuQVNNLGEuUVNNXSk7dmFyIGU9e2NOOiJ0aXRsZSIsYjphLlVJUn07dmFyIGQ9e2NOOiJwYXJhbXMiLGI6IlxcKCIsZToiXFwpIixjOlsic2VsZiIsYS5DTk0sZl0uY29uY2F0KGMpfTt2YXIgYj17YldLOnRydWUsZToiOiIsaToiWyR7PTtcXG5dIixjOltlLGRdLHI6MTB9O3JldHVybntrOntrZXl3b3JkOiJhbmQgZWxpZiBpcyBnbG9iYWwgYXMgaW4gaWYgZnJvbSByYWlzZSBmb3IgZXhjZXB0IGZpbmFsbHkgcHJpbnQgaW1wb3J0IHBhc3MgcmV0dXJuIGV4ZWMgZWxzZSBicmVhayBub3Qgd2l0aCBjbGFzcyBhc3NlcnQgeWllbGQgdHJ5IHdoaWxlIGNvbnRpbnVlIGRlbCBvciBkZWYgbGFtYmRhIG5vbmxvY2FsfDEwIixidWlsdF9pbjoiTm9uZSBUcnVlIEZhbHNlIEVsbGlwc2lzIE5vdEltcGxlbWVudGVkIn0saToiKDwvfC0+fFxcPykiLGM6Yy5jb25jYXQoW2YsYS5IQ00sYS5pbmhlcml0KGIse2NOOiJmdW5jdGlvbiIsazoiZGVmIn0pLGEuaW5oZXJpdChiLHtjTjoiY2xhc3MiLGs6ImNsYXNzIn0pLGEuQ05NLHtjTjoiZGVjb3JhdG9yIixiOiJAIixlOiIkIn0se2I6IlxcYihwcmludHxleGVjKVxcKCJ9XSl9fShobGpzKTtobGpzLkxBTkdVQUdFUy5qc29uPWZ1bmN0aW9uKGEpe3ZhciBlPXtsaXRlcmFsOiJ0cnVlIGZhbHNlIG51bGwifTt2YXIgZD1bYS5RU00sYS5DTk1dO3ZhciBjPXtjTjoidmFsdWUiLGU6IiwiLGVXOnRydWUsZUU6dHJ1ZSxjOmQsazplfTt2YXIgYj17YjoieyIsZToifSIsYzpbe2NOOiJhdHRyaWJ1dGUiLGI6J1xccyoiJyxlOiciXFxzKjpcXHMqJyxlQjp0cnVlLGVFOnRydWUsYzpbYS5CRV0saToiXFxuIixzdGFydHM6Y31dLGk6IlxcUyJ9O3ZhciBmPXtiOiJcXFsiLGU6IlxcXSIsYzpbYS5pbmhlcml0KGMse2NOOm51bGx9KV0saToiXFxTIn07ZC5zcGxpY2UoZC5sZW5ndGgsMCxiLGYpO3JldHVybntjOmQsazplLGk6IlxcUyJ9fShobGpzKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2pxdWVyeS0yLjEuMy5taW4uanMgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9qcXVlcnktMi4xLjMubWluLmpzCmluZGV4IDViMzU5ZGUuLjE3Y2I2YTggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2pxdWVyeS0yLjEuMy5taW4uanMKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvanF1ZXJ5LTIuMS4zLm1pbi5qcwpAQCAtMSwyOSArMSwyOSBAQAotLyohDQotDQotQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycw0KLWh0dHA6Ly9qcXVlcnkuY29tLw0KLQ0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZw0KLWEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQ0KLSJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcNCi13aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsDQotZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvDQotcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvDQotdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlDQotaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQotDQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsDQotRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GDQotTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQNCi1OT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFDQotTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTg0KLU9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTg0KLVdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLg0KLQ0KLSovDQotLyohIGpRdWVyeSB2Mi4xLjMgfCAoYykgMjAwNSwgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLw0KLSFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEuZG9jdW1lbnQ/YihhLCEwKTpmdW5jdGlvbihhKXtpZighYS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gYihhKX06YihhKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPWMuc2xpY2UsZT1jLmNvbmNhdCxmPWMucHVzaCxnPWMuaW5kZXhPZixoPXt9LGk9aC50b1N0cmluZyxqPWguaGFzT3duUHJvcGVydHksaz17fSxsPWEuZG9jdW1lbnQsbT0iMi4xLjMiLG49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IG4uZm4uaW5pdChhLGIpfSxvPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZyxwPS9eLW1zLS8scT0vLShbXGRhLXpdKS9naSxyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX07bi5mbj1uLnByb3RvdHlwZT17anF1ZXJ5Om0sY29uc3RydWN0b3I6bixzZWxlY3RvcjoiIixsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGQuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hPzA+YT90aGlzW2ErdGhpcy5sZW5ndGhdOnRoaXNbYV06ZC5jYWxsKHRoaXMpfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSl7dmFyIGI9bi5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksYSk7cmV0dXJuIGIucHJldk9iamVjdD10aGlzLGIuY29udGV4dD10aGlzLmNvbnRleHQsYn0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBuLmVhY2godGhpcyxhLGIpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6Zixzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LG4uZXh0ZW5kPW4uZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxuLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2k+aDtoKyspaWYobnVsbCE9KGE9YXJndW1lbnRzW2hdKSlmb3IoYiBpbiBhKWM9Z1tiXSxkPWFbYl0sZyE9PWQmJihqJiZkJiYobi5pc1BsYWluT2JqZWN0KGQpfHwoZT1uLmlzQXJyYXkoZCkpKT8oZT8oZT0hMSxmPWMmJm4uaXNBcnJheShjKT9jOltdKTpmPWMmJm4uaXNQbGFpbk9iamVjdChjKT9jOnt9LGdbYl09bi5leHRlbmQoaixmLGQpKTp2b2lkIDAhPT1kJiYoZ1tiXT1kKSk7cmV0dXJuIGd9LG4uZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhtK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxub29wOmZ1bmN0aW9uKCl7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PT1uLnR5cGUoYSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09PWEud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIW4uaXNBcnJheShhKSYmYS1wYXJzZUZsb2F0KGEpKzE+PTB9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIm9iamVjdCIhPT1uLnR5cGUoYSl8fGEubm9kZVR5cGV8fG4uaXNXaW5kb3coYSk/ITE6YS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpPyExOiEwfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2ZvcihiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/YSsiIjoib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhP2hbaS5jYWxsKGEpXXx8Im9iamVjdCI6dHlwZW9mIGF9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYz1ldmFsO2E9bi50cmltKGEpLGEmJigxPT09YS5pbmRleE9mKCJ1c2Ugc3RyaWN0Iik/KGI9bC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLnRleHQ9YSxsLmhlYWQuYXBwZW5kQ2hpbGQoYikucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSk6YyhhKSl9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKHAsIm1zLSIpLnJlcGxhY2UocSxyKX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yi50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPTAsZj1hLmxlbmd0aCxnPXMoYSk7aWYoYyl7aWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5hcHBseShhW2VdLGMpLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgaWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWt9ZWxzZSBmb3IoZSBpbiBhKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6KGErIiIpLnJlcGxhY2UobywiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO3JldHVybiBudWxsIT1hJiYocyhPYmplY3QoYSkpP24ubWVyZ2UoYywic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEpOmYuY2FsbChjLGEpKSxjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbD09Yj8tMTpnLmNhbGwoYixhLGMpfSxtZXJnZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7Yz5kO2QrKylhW2UrK109YltkXTtyZXR1cm4gYS5sZW5ndGg9ZSxhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQsZT1bXSxmPTAsZz1hLmxlbmd0aCxoPSFjO2c+ZjtmKyspZD0hYihhW2ZdLGYpLGQhPT1oJiZlLnB1c2goYVtmXSk7cmV0dXJuIGV9LG1hcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj0wLGc9YS5sZW5ndGgsaD1zKGEpLGk9W107aWYoaClmb3IoO2c+ZjtmKyspZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7ZWxzZSBmb3IoZiBpbiBhKWQ9YihhW2ZdLGYsYyksbnVsbCE9ZCYmaS5wdXNoKGQpO3JldHVybiBlLmFwcGx5KFtdLGkpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGY7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBiJiYoYz1hW2JdLGI9YSxhPWMpLG4uaXNGdW5jdGlvbihhKT8oZT1kLmNhbGwoYXJndW1lbnRzLDIpLGY9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShifHx0aGlzLGUuY29uY2F0KGQuY2FsbChhcmd1bWVudHMpKSl9LGYuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxuLmd1aWQrKyxmKTp2b2lkIDB9LG5vdzpEYXRlLm5vdyxzdXBwb3J0Omt9KSxuLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtoWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHMoYSl7dmFyIGI9YS5sZW5ndGgsYz1uLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG4uaXNXaW5kb3coYSk/ITE6MT09PWEubm9kZVR5cGUmJmI/ITA6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9aGIoKSx6PWhiKCksQT1oYigpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE49TS5yZXBsYWNlKCJ3IiwidyMiKSxPPSJcXFsiK0wrIiooIitNKyIpKD86IitMKyIqKFsqXiR8IX5dPz0pIitMKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTisiKSl8KSIrTCsiKlxcXSIsUD0iOigiK00rIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK08rIikqKXwuKilcXCl8KSIsUT1uZXcgUmVnRXhwKEwrIisiLCJnIiksUj1uZXcgUmVnRXhwKCJeIitMKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK0wrIiskIiwiZyIpLFM9bmV3IFJlZ0V4cCgiXiIrTCsiKiwiK0wrIioiKSxUPW5ldyBSZWdFeHAoIl4iK0wrIiooWz4rfl18IitMKyIpIitMKyIqIiksVT1uZXcgUmVnRXhwKCI9IitMKyIqKFteXFxdJ1wiXSo/KSIrTCsiKlxcXSIsImciKSxWPW5ldyBSZWdFeHAoUCksVz1uZXcgUmVnRXhwKCJeIitOKyIkIiksWD17SUQ6bmV3IFJlZ0V4cCgiXiMoIitNKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK00rIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK00ucmVwbGFjZSgidyIsIncqIikrIikiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK08pLFBTRVVETzpuZXcgUmVnRXhwKCJeIitQKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK0wrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK0wrIiooPzooWystXXwpIitMKyIqKFxcZCspfCkpIitMKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitLKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitMKyIqKCg/Oi1cXGQpP1xcZCopIitMKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWj0vXmhcZCQvaSwkPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxfPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sYWI9L1srfl0vLGJiPS8nfFxcL2csY2I9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitMKyI/fCgiK0wrIil8LikiLCJpZyIpLGRiPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6MD5kP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxlYj1mdW5jdGlvbigpe20oKX07dHJ5e0guYXBwbHkoRT1JLmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLEVbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZmIpe0g9e2FwcGx5OkUubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ry5hcHBseShhLEkuY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGdiKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHMsdyx4O2lmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLGQ9ZHx8W10saz1iLm5vZGVUeXBlLCJzdHJpbmciIT10eXBlb2YgYXx8IWF8fDEhPT1rJiY5IT09ayYmMTEhPT1rKXJldHVybiBkO2lmKCFlJiZwKXtpZigxMSE9PWsmJihmPV8uZXhlYyhhKSkpaWYoaj1mWzFdKXtpZig5PT09ayl7aWYoaD1iLmdldEVsZW1lbnRCeUlkKGopLCFofHwhaC5wYXJlbnROb2RlKXJldHVybiBkO2lmKGguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNlIGlmKGIub3duZXJEb2N1bWVudCYmKGg9Yi5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGopKSYmdChiLGgpJiZoLmlkPT09ailyZXR1cm4gZC5wdXNoKGgpLGR9ZWxzZXtpZihmWzJdKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoaj1mWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGopKSxkfWlmKGMucXNhJiYoIXF8fCFxLnRlc3QoYSkpKXtpZihzPXI9dSx3PWIseD0xIT09ayYmYSwxPT09ayYmIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe289ZyhhKSwocj1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1yLnJlcGxhY2UoYmIsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLHMpLHM9IltpZD0nIitzKyInXSAiLGw9by5sZW5ndGg7d2hpbGUobC0tKW9bbF09cytyYihvW2xdKTt3PWFiLnRlc3QoYSkmJnBiKGIucGFyZW50Tm9kZSl8fGIseD1vLmpvaW4oIiwiKX1pZih4KXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbCh4KSksZH1jYXRjaCh5KXt9ZmluYWxseXtyfHxiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShSLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBoYigpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaWIoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBqYihhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWEoYil9Y2F0Y2goYyl7cmV0dXJuITF9ZmluYWxseXtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGx9fWZ1bmN0aW9uIGtiKGEsYil7dmFyIGM9YS5zcGxpdCgifCIpLGU9YS5sZW5ndGg7d2hpbGUoZS0tKWQuYXR0ckhhbmRsZVtjW2VdXT1ifWZ1bmN0aW9uIGxiKGEsYil7dmFyIGM9YiYmYSxkPWMmJjE9PT1hLm5vZGVUeXBlJiYxPT09Yi5ub2RlVHlwZSYmKH5iLnNvdXJjZUluZGV4fHxDKS0ofmEuc291cmNlSW5kZXh8fEMpO2lmKGQpcmV0dXJuIGQ7aWYoYyl3aGlsZShjPWMubmV4dFNpYmxpbmcpaWYoYz09PWIpcmV0dXJuLTE7cmV0dXJuIGE/MTotMX1mdW5jdGlvbiBtYihhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1jJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBuYihhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09Y3x8ImJ1dHRvbiI9PT1jKSYmYi50eXBlPT09YX19ZnVuY3Rpb24gb2IoYSl7cmV0dXJuIGliKGZ1bmN0aW9uKGIpe3JldHVybiBiPStiLGliKGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKFtdLGMubGVuZ3RoLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWNbZT1mW2ddXSYmKGNbZV09IShkW2VdPWNbZV0pKX0pfSl9ZnVuY3Rpb24gcGIoYSl7cmV0dXJuIGEmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmYX1jPWdiLnN1cHBvcnQ9e30sZj1nYi5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGI/IkhUTUwiIT09Yi5ub2RlTmFtZTohMX0sbT1nYi5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89Zy5kb2N1bWVudEVsZW1lbnQsZT1nLmRlZmF1bHRWaWV3LGUmJmUhPT1lLnRvcCYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZWIsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixlYikpLHA9IWYoZyksYy5hdHRyaWJ1dGVzPWpiKGZ1bmN0aW9uKGEpe3JldHVybiBhLmNsYXNzTmFtZT0iaSIsIWEuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLGMuZ2V0RWxlbWVudHNCeVRhZ05hbWU9amIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZy5jcmVhdGVDb21tZW50KCIiKSksIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxjLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9JC50ZXN0KGcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksYy5nZXRCeUlkPWpiKGZ1bmN0aW9uKGEpe3JldHVybiBvLmFwcGVuZENoaWxkKGEpLmlkPXUsIWcuZ2V0RWxlbWVudHNCeU5hbWV8fCFnLmdldEVsZW1lbnRzQnlOYW1lKHUpLmxlbmd0aH0pLGMuZ2V0QnlJZD8oZC5maW5kLklEPWZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRCeUlkJiZwKXt2YXIgYz1iLmdldEVsZW1lbnRCeUlkKGEpO3JldHVybiBjJiZjLnBhcmVudE5vZGU/W2NdOltdfX0sZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGNiLGRiKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn19KTooZGVsZXRlIGQuZmluZC5JRCxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2IsZGIpO3JldHVybiBmdW5jdGlvbihhKXt2YXIgYz0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSYmYS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBjJiZjLnZhbHVlPT09Yn19KSxkLmZpbmQuVEFHPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWU/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTpjLnFzYT9iLnF1ZXJ5U2VsZWN0b3JBbGwoYSk6dm9pZCAwfTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT0wLGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTtpZigiKiI9PT1hKXt3aGlsZShjPWZbZSsrXSkxPT09Yy5ub2RlVHlwZSYmZC5wdXNoKGMpO3JldHVybiBkfXJldHVybiBmfSxkLmZpbmQuQ0xBU1M9Yy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihhLGIpe3JldHVybiBwP2IuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKTp2b2lkIDB9LHI9W10scT1bXSwoYy5xc2E9JC50ZXN0KGcucXVlcnlTZWxlY3RvckFsbCkpJiYoamIoZnVuY3Rpb24oYSl7by5hcHBlbmRDaGlsZChhKS5pbm5lckhUTUw9IjxhIGlkPSciK3UrIic+PC9hPjxzZWxlY3QgaWQ9JyIrdSsiLVxmXScgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitMKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitMKyIqKD86dmFsdWV8IitLKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGpiKGZ1bmN0aW9uKGEpe3ZhciBiPWcuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrTCsiKlsqXiR8IX5dPz0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPSQudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmamIoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiZGl2Iikscy5jYWxsKGEsIltzIT0nJ106eCIpLHIucHVzaCgiIT0iLFApfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oInwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oInwiKSksYj0kLnRlc3Qoby5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksdD1ifHwkLnRlc3Qoby5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxCPWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1nfHxhLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYSk/LTE6Yj09PWd8fGIub3duZXJEb2N1bWVudD09PXYmJnQodixiKT8xOms/SihrLGEpLUooayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxlPWEucGFyZW50Tm9kZSxmPWIucGFyZW50Tm9kZSxoPVthXSxpPVtiXTtpZighZXx8IWYpcmV0dXJuIGE9PT1nPy0xOmI9PT1nPzE6ZT8tMTpmPzE6az9KKGssYSktSihrLGIpOjA7aWYoZT09PWYpcmV0dXJuIGxiKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaS51bnNoaWZ0KGMpO3doaWxlKGhbZF09PT1pW2RdKWQrKztyZXR1cm4gZD9sYihoW2RdLGlbZF0pOmhbZF09PT12Py0xOmlbZF09PT12PzE6MH0sZyk6bn0sZ2IubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBnYihhLG51bGwsbnVsbCxiKX0sZ2IubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFUsIj0nJDEnXSIpLCEoIWMubWF0Y2hlc1NlbGVjdG9yfHwhcHx8ciYmci50ZXN0KGIpfHxxJiZxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBnYihiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxnYi5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGdiLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZELmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxnYi5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGdiLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1nYi5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9Z2Iuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aWIsbWF0Y2g6WCxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKGNiLGRiKSxhWzNdPShhWzNdfHxhWzRdfHxhWzVdfHwiIikucmVwbGFjZShjYixkYiksIn49Ij09PWFbMl0mJihhWzNdPSIgIithWzNdKyIgIiksYS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1hWzFdLnNsaWNlKDAsMyk/KGFbM118fGdiLmVycm9yKGFbMF0pLGFbNF09KyhhWzRdP2FbNV0rKGFbNl18fDEpOjIqKCJldmVuIj09PWFbM118fCJvZGQiPT09YVszXSkpLGFbNV09KyhhWzddK2FbOF18fCJvZGQiPT09YVszXSkpOmFbM10mJmdiLmVycm9yKGFbMF0pLGF9LFBTRVVETzpmdW5jdGlvbihhKXt2YXIgYixjPSFhWzZdJiZhWzJdO3JldHVybiBYLkNISUxELnRlc3QoYVswXSk/bnVsbDooYVszXT9hWzJdPWFbNF18fGFbNV18fCIiOmMmJlYudGVzdChjKSYmKGI9ZyhjLCEwKSkmJihiPWMuaW5kZXhPZigiKSIsYy5sZW5ndGgtYiktYy5sZW5ndGgpJiYoYVswXT1hWzBdLnNsaWNlKDAsYiksYVsyXT1jLnNsaWNlKDAsYikpLGEuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2IsZGIpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK0wrIikiK2ErIigiK0wrInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWdiLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjpiPyhlKz0iIiwiPSI9PT1iP2U9PT1jOiIhPSI9PT1iP2UhPT1jOiJePSI9PT1iP2MmJjA9PT1lLmluZGV4T2YoYyk6Iio9Ij09PWI/YyYmZS5pbmRleE9mKGMpPi0xOiIkPSI9PT1iP2MmJmUuc2xpY2UoLWMubGVuZ3RoKT09PWM6In49Ij09PWI/KCIgIitlLnJlcGxhY2UoUSwiICIpKyIgIikuaW5kZXhPZihjKT4tMToifD0iPT09Yj9lPT09Y3x8ZS5zbGljZSgwLGMubGVuZ3RoKzEpPT09YysiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj0ibnRoIiE9PWEuc2xpY2UoMCwzKSxnPSJsYXN0IiE9PWEuc2xpY2UoLTQpLGg9Im9mLXR5cGUiPT09YjtyZXR1cm4gMT09PWQmJjA9PT1lP2Z1bmN0aW9uKGEpe3JldHVybiEhYS5wYXJlbnROb2RlfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG0sbixvLHA9ZiE9PWc/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixxPWIucGFyZW50Tm9kZSxyPWgmJmIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxzPSFpJiYhaDtpZihxKXtpZihmKXt3aGlsZShwKXtsPWI7d2hpbGUobD1sW3BdKWlmKGg/bC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bC5ub2RlVHlwZSlyZXR1cm4hMTtvPXA9Im9ubHkiPT09YSYmIW8mJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYobz1bZz9xLmZpcnN0Q2hpbGQ6cS5sYXN0Q2hpbGRdLGcmJnMpe2s9cVt1XXx8KHFbdV09e30pLGo9a1thXXx8W10sbj1qWzBdPT09dyYmalsxXSxtPWpbMF09PT13JiZqWzJdLGw9biYmcS5jaGlsZE5vZGVzW25dO3doaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKDE9PT1sLm5vZGVUeXBlJiYrK20mJmw9PT1iKXtrW2FdPVt3LG4sbV07YnJlYWt9fWVsc2UgaWYocyYmKGo9KGJbdV18fChiW3VdPXt9KSlbYV0pJiZqWzBdPT09dyltPWpbMV07ZWxzZSB3aGlsZShsPSsrbiYmbCYmbFtwXXx8KG09bj0wKXx8by5wb3AoKSlpZigoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKSYmKyttJiYocyYmKChsW3VdfHwobFt1XT17fSkpW2FdPVt3LG1dKSxsPT09YikpYnJlYWs7cmV0dXJuIG0tPWUsbT09PWR8fG0lZD09PTAmJm0vZD49MH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxlPWQucHNldWRvc1thXXx8ZC5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGdiLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGVbdV0/ZShiKTplLmxlbmd0aD4xPyhjPVthLGEsIiIsYl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/aWIoZnVuY3Rpb24oYSxjKXt2YXIgZCxmPWUoYSxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSlkPUooYSxmW2ddKSxhW2RdPSEoY1tkXT1mW2ddKX0pOmZ1bmN0aW9uKGEpe3JldHVybiBlKGEsMCxjKX0pOmV9fSxwc2V1ZG9zOntub3Q6aWIoZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxkPWgoYS5yZXBsYWNlKFIsIiQxIikpO3JldHVybiBkW3VdP2liKGZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmLGc9ZChhLG51bGwsZSxbXSksaD1hLmxlbmd0aDt3aGlsZShoLS0pKGY9Z1toXSkmJihhW2hdPSEoYltoXT1mKSl9KTpmdW5jdGlvbihhLGUsZil7cmV0dXJuIGJbMF09YSxkKGIsbnVsbCxmLGMpLGJbMF09bnVsbCwhYy5wb3AoKX19KSxoYXM6aWIoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBnYihhLGIpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmliKGZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZShjYixkYiksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aWIoZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhfHwiIil8fGdiLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKGNiLGRiKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGIpe3ZhciBjO2RvIGlmKGM9cD9iLmxhbmc6Yi5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGIuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIGM9Yy50b0xvd2VyQ2FzZSgpLGM9PT1hfHwwPT09Yy5pbmRleE9mKGErIi0iKTt3aGlsZSgoYj1iLnBhcmVudE5vZGUpJiYxPT09Yi5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGIpe3ZhciBjPWEubG9jYXRpb24mJmEubG9jYXRpb24uaGFzaDtyZXR1cm4gYyYmYy5zbGljZSgxKT09PWIuaWR9LHJvb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1vfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW4uYWN0aXZlRWxlbWVudCYmKCFuLmhhc0ZvY3VzfHxuLmhhc0ZvY3VzKCkpJiYhIShhLnR5cGV8fGEuaHJlZnx8fmEudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYhIWEuY2hlY2tlZHx8Im9wdGlvbiI9PT1iJiYhIWEuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGEuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWlmKGEubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoYSl9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gWi50ZXN0KGEubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gWS50ZXN0KGEubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYiYnV0dG9uIj09PWEudHlwZXx8ImJ1dHRvbiI9PT1ifSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWEudHlwZSYmKG51bGw9PShiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1iLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpvYihmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6b2IoZnVuY3Rpb24oYSxiKXtyZXR1cm5bYi0xXX0pLGVxOm9iKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm5bMD5jP2MrYjpjXX0pLGV2ZW46b2IoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxvZGQ6b2IoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MTtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxsdDpvYihmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzstLWQ+PTA7KWEucHVzaChkKTtyZXR1cm4gYX0pLGd0Om9iKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOysrZDxiOylhLnB1c2goZCk7cmV0dXJuIGF9KX19LGQucHNldWRvcy5udGg9ZC5wc2V1ZG9zLmVxO2ZvcihiIGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWQucHNldWRvc1tiXT1tYihiKTtmb3IoYiBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWQucHNldWRvc1tiXT1uYihiKTtmdW5jdGlvbiBxYigpe31xYi5wcm90b3R5cGU9ZC5maWx0ZXJzPWQucHNldWRvcyxkLnNldEZpbHRlcnM9bmV3IHFiLGc9Z2IudG9rZW5pemU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXpbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1TLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9VC5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShSLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9WFtnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2diLmVycm9yKGEpOnooYSxpKS5zbGljZSgwKX07ZnVuY3Rpb24gcmIoYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aCxkPSIiO2M+YjtiKyspZCs9YVtiXS52YWx1ZTtyZXR1cm4gZH1mdW5jdGlvbiBzYihhLGIsYyl7dmFyIGQ9Yi5kaXIsZT1jJiYicGFyZW50Tm9kZSI9PT1kLGY9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxmKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpcmV0dXJuIGEoYixjLGYpfTpmdW5jdGlvbihiLGMsZyl7dmFyIGgsaSxqPVt3LGZdO2lmKGcpe3doaWxlKGI9YltkXSlpZigoMT09PWIubm9kZVR5cGV8fGUpJiZhKGIsYyxnKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSl7aWYoaT1iW3VdfHwoYlt1XT17fSksKGg9aVtkXSkmJmhbMF09PT13JiZoWzFdPT09ZilyZXR1cm4galsyXT1oWzJdO2lmKGlbZF09aixqWzJdPWEoYixjLGcpKXJldHVybiEwfX19ZnVuY3Rpb24gdGIoYSl7cmV0dXJuIGEubGVuZ3RoPjE/ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEubGVuZ3RoO3doaWxlKGUtLSlpZighYVtlXShiLGMsZCkpcmV0dXJuITE7cmV0dXJuITB9OmFbMF19ZnVuY3Rpb24gdWIoYSxiLGMpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKylnYihhLGJbZF0sYyk7cmV0dXJuIGN9ZnVuY3Rpb24gdmIoYSxiLGMsZCxlKXtmb3IodmFyIGYsZz1bXSxoPTAsaT1hLmxlbmd0aCxqPW51bGwhPWI7aT5oO2grKykoZj1hW2hdKSYmKCFjfHxjKGYsZCxlKSkmJihnLnB1c2goZiksaiYmYi5wdXNoKGgpKTtyZXR1cm4gZ31mdW5jdGlvbiB3YihhLGIsYyxkLGUsZil7cmV0dXJuIGQmJiFkW3VdJiYoZD13YihkKSksZSYmIWVbdV0mJihlPXdiKGUsZikpLGliKGZ1bmN0aW9uKGYsZyxoLGkpe3ZhciBqLGssbCxtPVtdLG49W10sbz1nLmxlbmd0aCxwPWZ8fHViKGJ8fCIqIixoLm5vZGVUeXBlP1toXTpoLFtdKSxxPSFhfHwhZiYmYj9wOnZiKHAsbSxhLGgsaSkscj1jP2V8fChmP2E6b3x8ZCk/W106ZzpxO2lmKGMmJmMocSxyLGgsaSksZCl7aj12YihyLG4pLGQoaixbXSxoLGkpLGs9ai5sZW5ndGg7d2hpbGUoay0tKShsPWpba10pJiYocltuW2tdXT0hKHFbbltrXV09bCkpfWlmKGYpe2lmKGV8fGEpe2lmKGUpe2o9W10saz1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJmoucHVzaChxW2tdPWwpO2UobnVsbCxyPVtdLGosaSl9az1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJihqPWU/SihmLGwpOm1ba10pPi0xJiYoZltqXT0hKGdbal09bCkpfX1lbHNlIHI9dmIocj09PWc/ci5zcGxpY2UobyxyLmxlbmd0aCk6ciksZT9lKG51bGwsZyxyLGkpOkguYXBwbHkoZyxyKX0pfWZ1bmN0aW9uIHhiKGEpe2Zvcih2YXIgYixjLGUsZj1hLmxlbmd0aCxnPWQucmVsYXRpdmVbYVswXS50eXBlXSxoPWd8fGQucmVsYXRpdmVbIiAiXSxpPWc/MTowLGs9c2IoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifSxoLCEwKSxsPXNiKGZ1bmN0aW9uKGEpe3JldHVybiBKKGIsYSk+LTF9LGgsITApLG09W2Z1bmN0aW9uKGEsYyxkKXt2YXIgZT0hZyYmKGR8fGMhPT1qKXx8KChiPWMpLm5vZGVUeXBlP2soYSxjLGQpOmwoYSxjLGQpKTtyZXR1cm4gYj1udWxsLGV9XTtmPmk7aSsrKWlmKGM9ZC5yZWxhdGl2ZVthW2ldLnR5cGVdKW09W3NiKHRiKG0pLGMpXTtlbHNle2lmKGM9ZC5maWx0ZXJbYVtpXS50eXBlXS5hcHBseShudWxsLGFbaV0ubWF0Y2hlcyksY1t1XSl7Zm9yKGU9KytpO2Y+ZTtlKyspaWYoZC5yZWxhdGl2ZVthW2VdLnR5cGVdKWJyZWFrO3JldHVybiB3YihpPjEmJnRiKG0pLGk+MSYmcmIoYS5zbGljZSgwLGktMSkuY29uY2F0KHt2YWx1ZToiICI9PT1hW2ktMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShSLCIkMSIpLGMsZT5pJiZ4YihhLnNsaWNlKGksZSkpLGY+ZSYmeGIoYT1hLnNsaWNlKGUpKSxmPmUmJnJiKGEpKX1tLnB1c2goYyl9cmV0dXJuIHRiKG0pfWZ1bmN0aW9uIHliKGEsYil7dmFyIGM9Yi5sZW5ndGg+MCxlPWEubGVuZ3RoPjAsZj1mdW5jdGlvbihmLGcsaCxpLGspe3ZhciBsLG0sbyxwPTAscT0iMCIscj1mJiZbXSxzPVtdLHQ9aix1PWZ8fGUmJmQuZmluZC5UQUcoIioiLGspLHY9dys9bnVsbD09dD8xOk1hdGgucmFuZG9tKCl8fC4xLHg9dS5sZW5ndGg7Zm9yKGsmJihqPWchPT1uJiZnKTtxIT09eCYmbnVsbCE9KGw9dVtxXSk7cSsrKXtpZihlJiZsKXttPTA7d2hpbGUobz1hW20rK10paWYobyhsLGcsaCkpe2kucHVzaChsKTticmVha31rJiYodz12KX1jJiYoKGw9IW8mJmwpJiZwLS0sZiYmci5wdXNoKGwpKX1pZihwKz1xLGMmJnEhPT1wKXttPTA7d2hpbGUobz1iW20rK10pbyhyLHMsZyxoKTtpZihmKXtpZihwPjApd2hpbGUocS0tKXJbcV18fHNbcV18fChzW3FdPUYuY2FsbChpKSk7cz12YihzKX1ILmFwcGx5KGkscyksayYmIWYmJnMubGVuZ3RoPjAmJnArYi5sZW5ndGg+MSYmZ2IudW5pcXVlU29ydChpKX1yZXR1cm4gayYmKHc9dixqPXQpLHJ9O3JldHVybiBjP2liKGYpOmZ9cmV0dXJuIGg9Z2IuY29tcGlsZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1bXSxmPUFbYSsiICJdO2lmKCFmKXtifHwoYj1nKGEpKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlmPXhiKGJbY10pLGZbdV0/ZC5wdXNoKGYpOmUucHVzaChmKTtmPUEoYSx5YihlLGQpKSxmLnNlbGVjdG9yPWF9cmV0dXJuIGZ9LGk9Z2Iuc2VsZWN0PWZ1bmN0aW9uKGEsYixlLGYpe3ZhciBpLGosayxsLG0sbj0iZnVuY3Rpb24iPT10eXBlb2YgYSYmYSxvPSFmJiZnKGE9bi5zZWxlY3Rvcnx8YSk7aWYoZT1lfHxbXSwxPT09by5sZW5ndGgpe2lmKGo9b1swXT1vWzBdLnNsaWNlKDApLGoubGVuZ3RoPjImJiJJRCI9PT0oaz1qWzBdKS50eXBlJiZjLmdldEJ5SWQmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2pbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChrLm1hdGNoZXNbMF0ucmVwbGFjZShjYixkYiksYil8fFtdKVswXSwhYilyZXR1cm4gZTtuJiYoYj1iLnBhcmVudE5vZGUpLGE9YS5zbGljZShqLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPVgubmVlZHNDb250ZXh0LnRlc3QoYSk/MDpqLmxlbmd0aDt3aGlsZShpLS0pe2lmKGs9altpXSxkLnJlbGF0aXZlW2w9ay50eXBlXSlicmVhaztpZigobT1kLmZpbmRbbF0pJiYoZj1tKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNiLGRiKSxhYi50ZXN0KGpbMF0udHlwZSkmJnBiKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZyYihqKSwhYSlyZXR1cm4gSC5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSxhYi50ZXN0KGEpJiZwYihiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9amIoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGpiKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGtiKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmpiKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGtiKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGpiKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxrYihLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxnYn0oYSk7bi5maW5kPXQsbi5leHByPXQuc2VsZWN0b3JzLG4uZXhwclsiOiJdPW4uZXhwci5wc2V1ZG9zLG4udW5pcXVlPXQudW5pcXVlU29ydCxuLnRleHQ9dC5nZXRUZXh0LG4uaXNYTUxEb2M9dC5pc1hNTCxuLmNvbnRhaW5zPXQuY29udGFpbnM7dmFyIHU9bi5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx2PS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sdz0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHgoYSxiLGMpe2lmKG4uaXNGdW5jdGlvbihiKSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYody50ZXN0KGIpKXJldHVybiBuLmZpbHRlcihiLGEsYyk7Yj1uLmZpbHRlcihiLGEpfXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gZy5jYWxsKGIsYSk+PTAhPT1jfSl9bi5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bi5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTpuLmZpbmQubWF0Y2hlcyhhLG4uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbi5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz10aGlzLmxlbmd0aCxkPVtdLGU9dGhpcztpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG4oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtjPmI7YisrKWlmKG4uY29udGFpbnMoZVtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2M+YjtiKyspbi5maW5kKGEsZVtiXSxkKTtyZXR1cm4gZD10aGlzLnB1c2hTdGFjayhjPjE/bi51bmlxdWUoZCk6ZCksZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxkfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXgodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJnUudGVzdChhKT9uKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIHksej0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEE9bi5mbi5pbml0PWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtpZighYSlyZXR1cm4gdGhpcztpZigic3RyaW5nIj09dHlwZW9mIGEpe2lmKGM9IjwiPT09YVswXSYmIj4iPT09YVthLmxlbmd0aC0xXSYmYS5sZW5ndGg+PTM/W251bGwsYSxudWxsXTp6LmV4ZWMoYSksIWN8fCFjWzFdJiZiKXJldHVybiFifHxiLmpxdWVyeT8oYnx8eSkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGIpLmZpbmQoYSk7aWYoY1sxXSl7aWYoYj1iIGluc3RhbmNlb2Ygbj9iWzBdOmIsbi5tZXJnZSh0aGlzLG4ucGFyc2VIVE1MKGNbMV0sYiYmYi5ub2RlVHlwZT9iLm93bmVyRG9jdW1lbnR8fGI6bCwhMCkpLHYudGVzdChjWzFdKSYmbi5pc1BsYWluT2JqZWN0KGIpKWZvcihjIGluIGIpbi5pc0Z1bmN0aW9uKHRoaXNbY10pP3RoaXNbY10oYltjXSk6dGhpcy5hdHRyKGMsYltjXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGQ9bC5nZXRFbGVtZW50QnlJZChjWzJdKSxkJiZkLnBhcmVudE5vZGUmJih0aGlzLmxlbmd0aD0xLHRoaXNbMF09ZCksdGhpcy5jb250ZXh0PWwsdGhpcy5zZWxlY3Rvcj1hLHRoaXN9cmV0dXJuIGEubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTpuLmlzRnVuY3Rpb24oYSk/InVuZGVmaW5lZCIhPXR5cGVvZiB5LnJlYWR5P3kucmVhZHkoYSk6YShuKToodm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KSxuLm1ha2VBcnJheShhLHRoaXMpKX07QS5wcm90b3R5cGU9bi5mbix5PW4obCk7dmFyIEI9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sQz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtuLmV4dGVuZCh7ZGlyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPXZvaWQgMCE9PWM7d2hpbGUoKGE9YVtiXSkmJjkhPT1hLm5vZGVUeXBlKWlmKDE9PT1hLm5vZGVUeXBlKXtpZihlJiZuKGEpLmlzKGMpKWJyZWFrO2QucHVzaChhKX1yZXR1cm4gZH0sc2libGluZzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXTthO2E9YS5uZXh0U2libGluZykxPT09YS5ub2RlVHlwZSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY319KSxuLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGEpe3ZhciBiPW4oYSx0aGlzKSxjPWIubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2M+YTthKyspaWYobi5jb250YWlucyh0aGlzLGJbYV0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXUudGVzdChhKXx8InN0cmluZyIhPXR5cGVvZiBhP24oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm4uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9uLnVuaXF1ZShmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP2cuY2FsbChuKGEpLHRoaXNbMF0pOmcuY2FsbCh0aGlzLGEuanF1ZXJ5P2FbMF06YSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi51bmlxdWUobi5tZXJnZSh0aGlzLmdldCgpLG4oYSxiKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09YT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gRChhLGIpe3doaWxlKChhPWFbYl0pJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJuIGF9bi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYxMSE9PWIubm9kZVR5cGU/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBuLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBEKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBuLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBuLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29udGVudERvY3VtZW50fHxuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihDW2FdfHxuLnVuaXF1ZShlKSxCLnRlc3QoYSkmJmUucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgRT0vXFMrL2csRj17fTtmdW5jdGlvbiBHKGEpe3ZhciBiPUZbYV09e307cmV0dXJuIG4uZWFjaChhLm1hdGNoKEUpfHxbXSxmdW5jdGlvbihhLGMpe2JbY109ITB9KSxifW4uQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9InN0cmluZyI9PXR5cGVvZiBhP0ZbYV18fEcoYSk6bi5leHRlbmQoe30sYSk7dmFyIGIsYyxkLGUsZixnLGg9W10saT0hYS5vbmNlJiZbXSxqPWZ1bmN0aW9uKGwpe2ZvcihiPWEubWVtb3J5JiZsLGM9ITAsZz1lfHwwLGU9MCxmPWgubGVuZ3RoLGQ9ITA7aCYmZj5nO2crKylpZihoW2ddLmFwcGx5KGxbMF0sbFsxXSk9PT0hMSYmYS5zdG9wT25GYWxzZSl7Yj0hMTticmVha31kPSExLGgmJihpP2kubGVuZ3RoJiZqKGkuc2hpZnQoKSk6Yj9oPVtdOmsuZGlzYWJsZSgpKX0saz17YWRkOmZ1bmN0aW9uKCl7aWYoaCl7dmFyIGM9aC5sZW5ndGg7IWZ1bmN0aW9uIGcoYil7bi5lYWNoKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1uLnR5cGUoYyk7ImZ1bmN0aW9uIj09PWQ/YS51bmlxdWUmJmsuaGFzKGMpfHxoLnB1c2goYyk6YyYmYy5sZW5ndGgmJiJzdHJpbmciIT09ZCYmZyhjKX0pfShhcmd1bWVudHMpLGQ/Zj1oLmxlbmd0aDpiJiYoZT1jLGooYikpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gaCYmbi5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihhLGIpe3ZhciBjO3doaWxlKChjPW4uaW5BcnJheShiLGgsYykpPi0xKWguc3BsaWNlKGMsMSksZCYmKGY+PWMmJmYtLSxnPj1jJiZnLS0pfSksdGhpc30saGFzOmZ1bmN0aW9uKGEpe3JldHVybiBhP24uaW5BcnJheShhLGgpPi0xOiEoIWh8fCFoLmxlbmd0aCl9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGg9W10sZj0wLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gaD1pPWI9dm9pZCAwLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWh9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gaT12b2lkIDAsYnx8ay5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIWl9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIWh8fGMmJiFpfHwoYj1ifHxbXSxiPVthLGIuc2xpY2U/Yi5zbGljZSgpOmJdLGQ/aS5wdXNoKGIpOmooYikpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gay5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWN9fTtyZXR1cm4ga30sbi5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGEpe3ZhciBiPVtbInJlc29sdmUiLCJkb25lIixuLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLG4uQ2FsbGJhY2tzKCJtZW1vcnkiKV1dLGM9InBlbmRpbmciLGQ9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGN9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBlLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50cztyZXR1cm4gbi5EZWZlcnJlZChmdW5jdGlvbihjKXtuLmVhY2goYixmdW5jdGlvbihiLGYpe3ZhciBnPW4uaXNGdW5jdGlvbihhW2JdKSYmYVtiXTtlW2ZbMV1dKGZ1bmN0aW9uKCl7dmFyIGE9ZyYmZy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YSYmbi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YS5wcm9taXNlKCkuZG9uZShjLnJlc29sdmUpLmZhaWwoYy5yZWplY3QpLnByb2dyZXNzKGMubm90aWZ5KTpjW2ZbMF0rIldpdGgiXSh0aGlzPT09ZD9jLnByb21pc2UoKTp0aGlzLGc/W2FdOmFyZ3VtZW50cyl9KX0pLGE9bnVsbH0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT9uLmV4dGVuZChhLGQpOmR9fSxlPXt9O3JldHVybiBkLnBpcGU9ZC50aGVuLG4uZWFjaChiLGZ1bmN0aW9uKGEsZil7dmFyIGc9ZlsyXSxoPWZbM107ZFtmWzFdXT1nLmFkZCxoJiZnLmFkZChmdW5jdGlvbigpe2M9aH0sYlsxXmFdWzJdLmRpc2FibGUsYlsyXVsyXS5sb2NrKSxlW2ZbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGVbZlswXSsiV2l0aCJdKHRoaXM9PT1lP2Q6dGhpcyxhcmd1bWVudHMpLHRoaXN9LGVbZlswXSsiV2l0aCJdPWcuZmlyZVdpdGh9KSxkLnByb21pc2UoZSksYSYmYS5jYWxsKGUsZSksZX0sd2hlbjpmdW5jdGlvbihhKXt2YXIgYj0wLGM9ZC5jYWxsKGFyZ3VtZW50cyksZT1jLmxlbmd0aCxmPTEhPT1lfHxhJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9lOjAsZz0xPT09Zj9hOm4uRGVmZXJyZWQoKSxoPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZSl7YlthXT10aGlzLGNbYV09YXJndW1lbnRzLmxlbmd0aD4xP2QuY2FsbChhcmd1bWVudHMpOmUsYz09PWk/Zy5ub3RpZnlXaXRoKGIsYyk6LS1mfHxnLnJlc29sdmVXaXRoKGIsYyl9fSxpLGosaztpZihlPjEpZm9yKGk9bmV3IEFycmF5KGUpLGo9bmV3IEFycmF5KGUpLGs9bmV3IEFycmF5KGUpO2U+YjtiKyspY1tiXSYmbi5pc0Z1bmN0aW9uKGNbYl0ucHJvbWlzZSk/Y1tiXS5wcm9taXNlKCkuZG9uZShoKGIsayxjKSkuZmFpbChnLnJlamVjdCkucHJvZ3Jlc3MoaChiLGosaSkpOi0tZjtyZXR1cm4gZnx8Zy5yZXNvbHZlV2l0aChrLGMpLGcucHJvbWlzZSgpfX0pO3ZhciBIO24uZm4ucmVhZHk9ZnVuY3Rpb24oYSl7cmV0dXJuIG4ucmVhZHkucHJvbWlzZSgpLmRvbmUoYSksdGhpc30sbi5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGEpe2E/bi5yZWFkeVdhaXQrKzpuLnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oYSl7KGE9PT0hMD8tLW4ucmVhZHlXYWl0Om4uaXNSZWFkeSl8fChuLmlzUmVhZHk9ITAsYSE9PSEwJiYtLW4ucmVhZHlXYWl0PjB8fChILnJlc29sdmVXaXRoKGwsW25dKSxuLmZuLnRyaWdnZXJIYW5kbGVyJiYobihsKS50cmlnZ2VySGFuZGxlcigicmVhZHkiKSxuKGwpLm9mZigicmVhZHkiKSkpKX19KTtmdW5jdGlvbiBJKCl7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixJLCExKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLEksITEpLG4ucmVhZHkoKX1uLnJlYWR5LnByb21pc2U9ZnVuY3Rpb24oYil7cmV0dXJuIEh8fChIPW4uRGVmZXJyZWQoKSwiY29tcGxldGUiPT09bC5yZWFkeVN0YXRlP3NldFRpbWVvdXQobi5yZWFkeSk6KGwuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSSwhMSksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixJLCExKSkpLEgucHJvbWlzZShiKX0sbi5yZWFkeS5wcm9taXNlKCk7dmFyIEo9bi5hY2Nlc3M9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9MCxpPWEubGVuZ3RoLGo9bnVsbD09YztpZigib2JqZWN0Ij09PW4udHlwZShjKSl7ZT0hMDtmb3IoaCBpbiBjKW4uYWNjZXNzKGEsYixoLGNbaF0sITAsZixnKX1lbHNlIGlmKHZvaWQgMCE9PWQmJihlPSEwLG4uaXNGdW5jdGlvbihkKXx8KGc9ITApLGomJihnPyhiLmNhbGwoYSxkKSxiPW51bGwpOihqPWIsYj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGouY2FsbChuKGEpLGMpfSkpLGIpKWZvcig7aT5oO2grKyliKGFbaF0sYyxnP2Q6ZC5jYWxsKGFbaF0saCxiKGFbaF0sYykpKTtyZXR1cm4gZT9hOmo/Yi5jYWxsKGEpOmk/YihhWzBdLGMpOmZ9O24uYWNjZXB0RGF0YT1mdW5jdGlvbihhKXtyZXR1cm4gMT09PWEubm9kZVR5cGV8fDk9PT1hLm5vZGVUeXBlfHwhK2Eubm9kZVR5cGV9O2Z1bmN0aW9uIEsoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5jYWNoZT17fSwwLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX19KSx0aGlzLmV4cGFuZG89bi5leHBhbmRvK0sudWlkKyt9Sy51aWQ9MSxLLmFjY2VwdHM9bi5hY2NlcHREYXRhLEsucHJvdG90eXBlPXtrZXk6ZnVuY3Rpb24oYSl7aWYoIUsuYWNjZXB0cyhhKSlyZXR1cm4gMDt2YXIgYj17fSxjPWFbdGhpcy5leHBhbmRvXTtpZighYyl7Yz1LLnVpZCsrO3RyeXtiW3RoaXMuZXhwYW5kb109e3ZhbHVlOmN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEsYil9Y2F0Y2goZCl7Ylt0aGlzLmV4cGFuZG9dPWMsbi5leHRlbmQoYSxiKX19cmV0dXJuIHRoaXMuY2FjaGVbY118fCh0aGlzLmNhY2hlW2NdPXt9KSxjfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9dGhpcy5rZXkoYSksZj10aGlzLmNhY2hlW2VdO2lmKCJzdHJpbmciPT10eXBlb2YgYilmW2JdPWM7ZWxzZSBpZihuLmlzRW1wdHlPYmplY3QoZikpbi5leHRlbmQodGhpcy5jYWNoZVtlXSxiKTtlbHNlIGZvcihkIGluIGIpZltkXT1iW2RdO3JldHVybiBmfSxnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNhY2hlW3RoaXMua2V5KGEpXTtyZXR1cm4gdm9pZCAwPT09Yj9jOmNbYl19LGFjY2VzczpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIHZvaWQgMD09PWJ8fGImJiJzdHJpbmciPT10eXBlb2YgYiYmdm9pZCAwPT09Yz8oZD10aGlzLmdldChhLGIpLHZvaWQgMCE9PWQ/ZDp0aGlzLmdldChhLG4uY2FtZWxDYXNlKGIpKSk6KHRoaXMuc2V0KGEsYixjKSx2b2lkIDAhPT1jP2M6Yil9LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPXRoaXMua2V5KGEpLGc9dGhpcy5jYWNoZVtmXTtpZih2b2lkIDA9PT1iKXRoaXMuY2FjaGVbZl09e307ZWxzZXtuLmlzQXJyYXkoYik/ZD1iLmNvbmNhdChiLm1hcChuLmNhbWVsQ2FzZSkpOihlPW4uY2FtZWxDYXNlKGIpLGIgaW4gZz9kPVtiLGVdOihkPWUsZD1kIGluIGc/W2RdOmQubWF0Y2goRSl8fFtdKSksYz1kLmxlbmd0aDt3aGlsZShjLS0pZGVsZXRlIGdbZFtjXV19fSxoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiFuLmlzRW1wdHlPYmplY3QodGhpcy5jYWNoZVthW3RoaXMuZXhwYW5kb11dfHx7fSl9LGRpc2NhcmQ6ZnVuY3Rpb24oYSl7YVt0aGlzLmV4cGFuZG9dJiZkZWxldGUgdGhpcy5jYWNoZVthW3RoaXMuZXhwYW5kb11dfX07dmFyIEw9bmV3IEssTT1uZXcgSyxOPS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sTz0vKFtBLVpdKS9nO2Z1bmN0aW9uIFAoYSxiLGMpe3ZhciBkO2lmKHZvaWQgMD09PWMmJjE9PT1hLm5vZGVUeXBlKWlmKGQ9ImRhdGEtIitiLnJlcGxhY2UoTywiLSQxIikudG9Mb3dlckNhc2UoKSxjPWEuZ2V0QXR0cmlidXRlKGQpLCJzdHJpbmciPT10eXBlb2YgYyl7dHJ5e2M9InRydWUiPT09Yz8hMDoiZmFsc2UiPT09Yz8hMToibnVsbCI9PT1jP251bGw6K2MrIiI9PT1jPytjOk4udGVzdChjKT9uLnBhcnNlSlNPTihjKTpjfWNhdGNoKGUpe31NLnNldChhLGIsYyl9ZWxzZSBjPXZvaWQgMDtyZXR1cm4gY31uLmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gTS5oYXNEYXRhKGEpfHxMLmhhc0RhdGEoYSl9LGRhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBNLmFjY2VzcyhhLGIsYykNCi19LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtNLnJlbW92ZShhLGIpfSxfZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEwuYWNjZXNzKGEsYixjKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtMLnJlbW92ZShhLGIpfX0pLG4uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9TS5nZXQoZiksMT09PWYubm9kZVR5cGUmJiFMLmdldChmLCJoYXNEYXRhQXR0cnMiKSkpe2M9Zy5sZW5ndGg7d2hpbGUoYy0tKWdbY10mJihkPWdbY10ubmFtZSwwPT09ZC5pbmRleE9mKCJkYXRhLSIpJiYoZD1uLmNhbWVsQ2FzZShkLnNsaWNlKDUpKSxQKGYsZCxlW2RdKSkpO0wuc2V0KGYsImhhc0RhdGFBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXtNLnNldCh0aGlzLGEpfSk6Sih0aGlzLGZ1bmN0aW9uKGIpe3ZhciBjLGQ9bi5jYW1lbENhc2UoYSk7aWYoZiYmdm9pZCAwPT09Yil7aWYoYz1NLmdldChmLGEpLHZvaWQgMCE9PWMpcmV0dXJuIGM7aWYoYz1NLmdldChmLGQpLHZvaWQgMCE9PWMpcmV0dXJuIGM7aWYoYz1QKGYsZCx2b2lkIDApLHZvaWQgMCE9PWMpcmV0dXJuIGN9ZWxzZSB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1NLmdldCh0aGlzLGQpO00uc2V0KHRoaXMsZCxiKSwtMSE9PWEuaW5kZXhPZigiLSIpJiZ2b2lkIDAhPT1jJiZNLnNldCh0aGlzLGEsYil9KX0sbnVsbCxiLGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TS5yZW1vdmUodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1MLmdldChhLGIpLGMmJighZHx8bi5pc0FycmF5KGMpP2Q9TC5hY2Nlc3MoYSxiLG4ubWFrZUFycmF5KGMpKTpkLnB1c2goYykpLGR8fFtdKTp2b2lkIDB9LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9bi5xdWV1ZShhLGIpLGQ9Yy5sZW5ndGgsZT1jLnNoaWZ0KCksZj1uLl9xdWV1ZUhvb2tzKGEsYiksZz1mdW5jdGlvbigpe24uZGVxdWV1ZShhLGIpfTsiaW5wcm9ncmVzcyI9PT1lJiYoZT1jLnNoaWZ0KCksZC0tKSxlJiYoImZ4Ij09PWImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBmLnN0b3AsZS5jYWxsKGEsZyxmKSksIWQmJmYmJmYuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihhLGIpe3ZhciBjPWIrInF1ZXVlSG9va3MiO3JldHVybiBMLmdldChhLGMpfHxMLmFjY2VzcyhhLGMse2VtcHR5Om4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe0wucmVtb3ZlKGEsW2IrInF1ZXVlIixjXSl9KX0pfX0pLG4uZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9ImZ4IixjLS0pLGFyZ3VtZW50cy5sZW5ndGg8Yz9uLnF1ZXVlKHRoaXNbMF0sYSk6dm9pZCAwPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPW4ucXVldWUodGhpcyxhLGIpO24uX3F1ZXVlSG9va3ModGhpcyxhKSwiZngiPT09YSYmImlucHJvZ3Jlc3MiIT09Y1swXSYmbi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5kZXF1ZXVlKHRoaXMsYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MSxlPW4uRGVmZXJyZWQoKSxmPXRoaXMsZz10aGlzLmxlbmd0aCxoPWZ1bmN0aW9uKCl7LS1kfHxlLnJlc29sdmVXaXRoKGYsW2ZdKX07InN0cmluZyIhPXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxhPWF8fCJmeCI7d2hpbGUoZy0tKWM9TC5nZXQoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFE9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsUj1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW4uY3NzKGEsImRpc3BsYXkiKXx8IW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxUPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPWwuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGI9YS5hcHBlbmRDaGlsZChsLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxjPWwuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtjLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYy5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksYy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksYi5hcHBlbmRDaGlsZChjKSxrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYi5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLGsubm9DbG9uZUNoZWNrZWQ9ISFiLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZX0oKTt2YXIgVT0idW5kZWZpbmVkIjtrLmZvY3VzaW5CdWJibGVzPSJvbmZvY3VzaW4iaW4gYTt2YXIgVj0vXmtleS8sVz0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLyxYPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxZPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gWigpe3JldHVybiEwfWZ1bmN0aW9uICQoKXtyZXR1cm4hMX1mdW5jdGlvbiBfKCl7dHJ5e3JldHVybiBsLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1uLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPUwuZ2V0KGEpO2lmKHIpe2MuaGFuZGxlciYmKGY9YyxjPWYuaGFuZGxlcixlPWYuc2VsZWN0b3IpLGMuZ3VpZHx8KGMuZ3VpZD1uLmd1aWQrKyksKGk9ci5ldmVudHMpfHwoaT1yLmV2ZW50cz17fSksKGc9ci5oYW5kbGUpfHwoZz1yLmhhbmRsZT1mdW5jdGlvbihiKXtyZXR1cm4gdHlwZW9mIG4hPT1VJiZuLmV2ZW50LnRyaWdnZXJlZCE9PWIudHlwZT9uLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGEsYXJndW1lbnRzKTp2b2lkIDB9KSxiPShifHwiIikubWF0Y2goRSl8fFsiIl0saj1iLmxlbmd0aDt3aGlsZShqLS0paD1ZLmV4ZWMoYltqXSl8fFtdLG89cT1oWzFdLHA9KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxvJiYobD1uLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGU/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbD1uLmV2ZW50LnNwZWNpYWxbb118fHt9LGs9bi5leHRlbmQoe3R5cGU6byxvcmlnVHlwZTpxLGRhdGE6ZCxoYW5kbGVyOmMsZ3VpZDpjLmd1aWQsc2VsZWN0b3I6ZSxuZWVkc0NvbnRleHQ6ZSYmbi5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGUpLG5hbWVzcGFjZTpwLmpvaW4oIi4iKX0sZiksKG09aVtvXSl8fChtPWlbb109W10sbS5kZWxlZ2F0ZUNvdW50PTAsbC5zZXR1cCYmbC5zZXR1cC5jYWxsKGEsZCxwLGcpIT09ITF8fGEuYWRkRXZlbnRMaXN0ZW5lciYmYS5hZGRFdmVudExpc3RlbmVyKG8sZywhMSkpLGwuYWRkJiYobC5hZGQuY2FsbChhLGspLGsuaGFuZGxlci5ndWlkfHwoay5oYW5kbGVyLmd1aWQ9Yy5ndWlkKSksZT9tLnNwbGljZShtLmRlbGVnYXRlQ291bnQrKywwLGspOm0ucHVzaChrKSxuLmV2ZW50Lmdsb2JhbFtvXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9TC5oYXNEYXRhKGEpJiZMLmdldChhKTtpZihyJiYoaT1yLmV2ZW50cykpe2I9KGJ8fCIiKS5tYXRjaChFKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSlpZihoPVkuZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8pe2w9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShkP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLG09aVtvXXx8W10saD1oWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGc9Zj1tLmxlbmd0aDt3aGlsZShmLS0paz1tW2ZdLCFlJiZxIT09ay5vcmlnVHlwZXx8YyYmYy5ndWlkIT09ay5ndWlkfHxoJiYhaC50ZXN0KGsubmFtZXNwYWNlKXx8ZCYmZCE9PWsuc2VsZWN0b3ImJigiKioiIT09ZHx8IWsuc2VsZWN0b3IpfHwobS5zcGxpY2UoZiwxKSxrLnNlbGVjdG9yJiZtLmRlbGVnYXRlQ291bnQtLSxsLnJlbW92ZSYmbC5yZW1vdmUuY2FsbChhLGspKTtnJiYhbS5sZW5ndGgmJihsLnRlYXJkb3duJiZsLnRlYXJkb3duLmNhbGwoYSxwLHIuaGFuZGxlKSE9PSExfHxuLnJlbW92ZUV2ZW50KGEsbyxyLmhhbmRsZSksZGVsZXRlIGlbb10pfWVsc2UgZm9yKG8gaW4gaSluLmV2ZW50LnJlbW92ZShhLG8rYltqXSxjLGQsITApO24uaXNFbXB0eU9iamVjdChpKSYmKGRlbGV0ZSByLmhhbmRsZSxMLnJlbW92ZShhLCJldmVudHMiKSl9fSx0cmlnZ2VyOmZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmLGcsaCxpLGssbSxvLHA9W2R8fGxdLHE9ai5jYWxsKGIsInR5cGUiKT9iLnR5cGU6YixyPWouY2FsbChiLCJuYW1lc3BhY2UiKT9iLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKGc9aD1kPWR8fGwsMyE9PWQubm9kZVR5cGUmJjghPT1kLm5vZGVUeXBlJiYhWC50ZXN0KHErbi5ldmVudC50cmlnZ2VyZWQpJiYocS5pbmRleE9mKCIuIik+PTAmJihyPXEuc3BsaXQoIi4iKSxxPXIuc2hpZnQoKSxyLnNvcnQoKSksaz1xLmluZGV4T2YoIjoiKTwwJiYib24iK3EsYj1iW24uZXhwYW5kb10/YjpuZXcgbi5FdmVudChxLCJvYmplY3QiPT10eXBlb2YgYiYmYiksYi5pc1RyaWdnZXI9ZT8yOjMsYi5uYW1lc3BhY2U9ci5qb2luKCIuIiksYi5uYW1lc3BhY2VfcmU9Yi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrci5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGIucmVzdWx0PXZvaWQgMCxiLnRhcmdldHx8KGIudGFyZ2V0PWQpLGM9bnVsbD09Yz9bYl06bi5tYWtlQXJyYXkoYyxbYl0pLG89bi5ldmVudC5zcGVjaWFsW3FdfHx7fSxlfHwhby50cmlnZ2VyfHxvLnRyaWdnZXIuYXBwbHkoZCxjKSE9PSExKSl7aWYoIWUmJiFvLm5vQnViYmxlJiYhbi5pc1dpbmRvdyhkKSl7Zm9yKGk9by5kZWxlZ2F0ZVR5cGV8fHEsWC50ZXN0KGkrcSl8fChnPWcucGFyZW50Tm9kZSk7ZztnPWcucGFyZW50Tm9kZSlwLnB1c2goZyksaD1nO2g9PT0oZC5vd25lckRvY3VtZW50fHxsKSYmcC5wdXNoKGguZGVmYXVsdFZpZXd8fGgucGFyZW50V2luZG93fHxhKX1mPTA7d2hpbGUoKGc9cFtmKytdKSYmIWIuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSliLnR5cGU9Zj4xP2k6by5iaW5kVHlwZXx8cSxtPShMLmdldChnLCJldmVudHMiKXx8e30pW2IudHlwZV0mJkwuZ2V0KGcsImhhbmRsZSIpLG0mJm0uYXBwbHkoZyxjKSxtPWsmJmdba10sbSYmbS5hcHBseSYmbi5hY2NlcHREYXRhKGcpJiYoYi5yZXN1bHQ9bS5hcHBseShnLGMpLGIucmVzdWx0PT09ITEmJmIucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGIudHlwZT1xLGV8fGIuaXNEZWZhdWx0UHJldmVudGVkKCl8fG8uX2RlZmF1bHQmJm8uX2RlZmF1bHQuYXBwbHkocC5wb3AoKSxjKSE9PSExfHwhbi5hY2NlcHREYXRhKGQpfHxrJiZuLmlzRnVuY3Rpb24oZFtxXSkmJiFuLmlzV2luZG93KGQpJiYoaD1kW2tdLGgmJihkW2tdPW51bGwpLG4uZXZlbnQudHJpZ2dlcmVkPXEsZFtxXSgpLG4uZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxoJiYoZFtrXT1oKSksYi5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihhKXthPW4uZXZlbnQuZml4KGEpO3ZhciBiLGMsZSxmLGcsaD1bXSxpPWQuY2FsbChhcmd1bWVudHMpLGo9KEwuZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1uLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1uLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGM9MDt3aGlsZSgoZz1mLmhhbmRsZXJzW2MrK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZy5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWcsYS5kYXRhPWcuZGF0YSxlPSgobi5ldmVudC5zcGVjaWFsW2cub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxnLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1lJiYoYS5yZXN1bHQ9ZSk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPT10aGlzO2k9aS5wYXJlbnROb2RlfHx0aGlzKWlmKGkuZGlzYWJsZWQhPT0hMHx8ImNsaWNrIiE9PWEudHlwZSl7Zm9yKGQ9W10sYz0wO2g+YztjKyspZj1iW2NdLGU9Zi5zZWxlY3RvcisiICIsdm9pZCAwPT09ZFtlXSYmKGRbZV09Zi5uZWVkc0NvbnRleHQ/bihlLHRoaXMpLmluZGV4KGkpPj0wOm4uZmluZChlLHRoaXMsbnVsbCxbaV0pLmxlbmd0aCksZFtlXSYmZC5wdXNoKGYpO2QubGVuZ3RoJiZnLnB1c2goe2VsZW06aSxoYW5kbGVyczpkfSl9cmV0dXJuIGg8Yi5sZW5ndGgmJmcucHVzaCh7ZWxlbTp0aGlzLGhhbmRsZXJzOmIuc2xpY2UoaCl9KSxnfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b247cmV0dXJuIG51bGw9PWEucGFnZVgmJm51bGwhPWIuY2xpZW50WCYmKGM9YS50YXJnZXQub3duZXJEb2N1bWVudHx8bCxkPWMuZG9jdW1lbnRFbGVtZW50LGU9Yy5ib2R5LGEucGFnZVg9Yi5jbGllbnRYKyhkJiZkLnNjcm9sbExlZnR8fGUmJmUuc2Nyb2xsTGVmdHx8MCktKGQmJmQuY2xpZW50TGVmdHx8ZSYmZS5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWIuY2xpZW50WSsoZCYmZC5zY3JvbGxUb3B8fGUmJmUuc2Nyb2xsVG9wfHwwKS0oZCYmZC5jbGllbnRUb3B8fGUmJmUuY2xpZW50VG9wfHwwKSksYS53aGljaHx8dm9pZCAwPT09Znx8KGEud2hpY2g9MSZmPzE6MiZmPzM6NCZmPzI6MCksYX19LGZpeDpmdW5jdGlvbihhKXtpZihhW24uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1XLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlYudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBuLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9bCksMz09PWEudGFyZ2V0Lm5vZGVUeXBlJiYoYS50YXJnZXQ9YS50YXJnZXQucGFyZW50Tm9kZSksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyE9PV8oKSYmdGhpcy5mb2N1cz8odGhpcy5mb2N1cygpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PV8oKSYmdGhpcy5ibHVyPyh0aGlzLmJsdXIoKSwhMSk6dm9pZCAwfSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4iY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrJiZuLm5vZGVOYW1lKHRoaXMsImlucHV0Iik/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbi5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bi5leHRlbmQobmV3IG4uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP24uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bi5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbi5yZW1vdmVFdmVudD1mdW5jdGlvbihhLGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX0sbi5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbi5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/WjokKTp0aGlzLnR5cGU9YSxiJiZuLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxuLm5vdygpLHZvaWQodGhpc1tuLmV4cGFuZG9dPSEwKSk6bmV3IG4uRXZlbnQoYSxiKX0sbi5FdmVudC5wcm90b3R5cGU9e2lzRGVmYXVsdFByZXZlbnRlZDokLGlzUHJvcGFnYXRpb25TdG9wcGVkOiQsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6JCxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1aLGEmJmEucHJldmVudERlZmF1bHQmJmEucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9WixhJiZhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9WixhJiZhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sbi5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihhLGIpe24uZXZlbnQuc3BlY2lhbFthXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGMsZD10aGlzLGU9YS5yZWxhdGVkVGFyZ2V0LGY9YS5oYW5kbGVPYmo7cmV0dXJuKCFlfHxlIT09ZCYmIW4uY29udGFpbnMoZCxlKSkmJihhLnR5cGU9Zi5vcmlnVHlwZSxjPWYuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWIpLGN9fX0pLGsuZm9jdXNpbkJ1YmJsZXN8fG4uZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz1mdW5jdGlvbihhKXtuLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsbi5ldmVudC5maXgoYSksITApfTtuLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9TC5hY2Nlc3MoZCxiKTtlfHxkLmFkZEV2ZW50TGlzdGVuZXIoYSxjLCEwKSxMLmFjY2VzcyhkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPUwuYWNjZXNzKGQsYiktMTtlP0wuYWNjZXNzKGQsYixlKTooZC5yZW1vdmVFdmVudExpc3RlbmVyKGEsYywhMCksTC5yZW1vdmUoZCxiKSl9fX0pLG4uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihnIGluIGEpdGhpcy5vbihnLGIsYyxhW2ddLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9JDtlbHNlIGlmKCFkKXJldHVybiB0aGlzO3JldHVybiAxPT09ZSYmKGY9ZCxkPWZ1bmN0aW9uKGEpe3JldHVybiBuKCkub2ZmKGEpLGYuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxkLmd1aWQ9Zi5ndWlkfHwoZi5ndWlkPW4uZ3VpZCsrKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC5hZGQodGhpcyxhLGQsYyxiKX0pfSxvbmU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYSxiLGMsZCwxKX0sb2ZmOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXJldHVybiBkPWEuaGFuZGxlT2JqLG4oYS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGQubmFtZXNwYWNlP2Qub3JpZ1R5cGUrIi4iK2QubmFtZXNwYWNlOmQub3JpZ1R5cGUsZC5zZWxlY3RvcixkLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXtmb3IoZSBpbiBhKXRoaXMub2ZmKGUsYixhW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4oYj09PSExfHwiZnVuY3Rpb24iPT10eXBlb2YgYikmJihjPWIsYj12b2lkIDApLGM9PT0hMSYmKGM9JCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC5yZW1vdmUodGhpcyxhLGMsYil9KX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpc1swXTtyZXR1cm4gYz9uLmV2ZW50LnRyaWdnZXIoYSxiLGMsITApOnZvaWQgMH19KTt2YXIgYWI9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSxiYj0vPChbXHc6XSspLyxjYj0vPHwmIz9cdys7LyxkYj0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLGViPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGZiPS9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxnYj0vXnRydWVcLyguKikvLGhiPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZyxpYj17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2liLm9wdGdyb3VwPWliLm9wdGlvbixpYi50Ym9keT1pYi50Zm9vdD1pYi5jb2xncm91cD1pYi5jYXB0aW9uPWliLnRoZWFkLGliLnRoPWliLnRkO2Z1bmN0aW9uIGpiKGEsYil7cmV0dXJuIG4ubm9kZU5hbWUoYSwidGFibGUiKSYmbi5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBrYihhKXtyZXR1cm4gYS50eXBlPShudWxsIT09YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2EudHlwZSxhfWZ1bmN0aW9uIGxiKGEpe3ZhciBiPWdiLmV4ZWMoYS50eXBlKTtyZXR1cm4gYj9hLnR5cGU9YlsxXTphLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGF9ZnVuY3Rpb24gbWIoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspTC5zZXQoYVtjXSwiZ2xvYmFsRXZhbCIsIWJ8fEwuZ2V0KGJbY10sImdsb2JhbEV2YWwiKSl9ZnVuY3Rpb24gbmIoYSxiKXt2YXIgYyxkLGUsZixnLGgsaSxqO2lmKDE9PT1iLm5vZGVUeXBlKXtpZihMLmhhc0RhdGEoYSkmJihmPUwuYWNjZXNzKGEpLGc9TC5zZXQoYixmKSxqPWYuZXZlbnRzKSl7ZGVsZXRlIGcuaGFuZGxlLGcuZXZlbnRzPXt9O2ZvcihlIGluIGopZm9yKGM9MCxkPWpbZV0ubGVuZ3RoO2Q+YztjKyspbi5ldmVudC5hZGQoYixlLGpbZV1bY10pfU0uaGFzRGF0YShhKSYmKGg9TS5hY2Nlc3MoYSksaT1uLmV4dGVuZCh7fSxoKSxNLnNldChiLGkpKX19ZnVuY3Rpb24gb2IoYSxiKXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYnx8IioiKTphLnF1ZXJ5U2VsZWN0b3JBbGw/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6W107cmV0dXJuIHZvaWQgMD09PWJ8fGImJm4ubm9kZU5hbWUoYSxiKT9uLm1lcmdlKFthXSxjKTpjfWZ1bmN0aW9uIHBiKGEsYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1jJiZULnRlc3QoYS50eXBlKT9iLmNoZWNrZWQ9YS5jaGVja2VkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfW4uZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLmNsb25lTm9kZSghMCksaT1uLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZighKGsubm9DbG9uZUNoZWNrZWR8fDEhPT1hLm5vZGVUeXBlJiYxMSE9PWEubm9kZVR5cGV8fG4uaXNYTUxEb2MoYSkpKWZvcihnPW9iKGgpLGY9b2IoYSksZD0wLGU9Zi5sZW5ndGg7ZT5kO2QrKylwYihmW2RdLGdbZF0pO2lmKGIpaWYoYylmb3IoZj1mfHxvYihhKSxnPWd8fG9iKGgpLGQ9MCxlPWYubGVuZ3RoO2U+ZDtkKyspbmIoZltkXSxnW2RdKTtlbHNlIG5iKGEsaCk7cmV0dXJuIGc9b2IoaCwic2NyaXB0IiksZy5sZW5ndGg+MCYmbWIoZywhaSYmb2IoYSwic2NyaXB0IikpLGh9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixrPWIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGw9W10sbT0wLG89YS5sZW5ndGg7bz5tO20rKylpZihlPWFbbV0sZXx8MD09PWUpaWYoIm9iamVjdCI9PT1uLnR5cGUoZSkpbi5tZXJnZShsLGUubm9kZVR5cGU/W2VdOmUpO2Vsc2UgaWYoY2IudGVzdChlKSl7Zj1mfHxrLmFwcGVuZENoaWxkKGIuY3JlYXRlRWxlbWVudCgiZGl2IikpLGc9KGJiLmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksaD1pYltnXXx8aWIuX2RlZmF1bHQsZi5pbm5lckhUTUw9aFsxXStlLnJlcGxhY2UoYWIsIjwkMT48LyQyPiIpK2hbMl0saj1oWzBdO3doaWxlKGotLSlmPWYubGFzdENoaWxkO24ubWVyZ2UobCxmLmNoaWxkTm9kZXMpLGY9ay5maXJzdENoaWxkLGYudGV4dENvbnRlbnQ9IiJ9ZWxzZSBsLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShlKSk7ay50ZXh0Q29udGVudD0iIixtPTA7d2hpbGUoZT1sW20rK10paWYoKCFkfHwtMT09PW4uaW5BcnJheShlLGQpKSYmKGk9bi5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSksZj1vYihrLmFwcGVuZENoaWxkKGUpLCJzY3JpcHQiKSxpJiZtYihmKSxjKSl7aj0wO3doaWxlKGU9ZltqKytdKWZiLnRlc3QoZS50eXBlfHwiIikmJmMucHVzaChlKX1yZXR1cm4ga30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQsZSxmPW4uZXZlbnQuc3BlY2lhbCxnPTA7dm9pZCAwIT09KGM9YVtnXSk7ZysrKXtpZihuLmFjY2VwdERhdGEoYykmJihlPWNbTC5leHBhbmRvXSxlJiYoYj1MLmNhY2hlW2VdKSkpe2lmKGIuZXZlbnRzKWZvcihkIGluIGIuZXZlbnRzKWZbZF0/bi5ldmVudC5yZW1vdmUoYyxkKTpuLnJlbW92ZUV2ZW50KGMsZCxiLmhhbmRsZSk7TC5jYWNoZVtlXSYmZGVsZXRlIEwuY2FjaGVbZV19ZGVsZXRlIE0uY2FjaGVbY1tNLmV4cGFuZG9dXX19fSksbi5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEoodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9uLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpJiYodGhpcy50ZXh0Q29udGVudD1hKX0pfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9amIodGhpcyxhKTtiLmFwcGVuZENoaWxkKGEpfX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj1qYih0aGlzLGEpO2IuaW5zZXJ0QmVmb3JlKGEsYi5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSl9LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPWE/bi5maWx0ZXIoYSx0aGlzKTp0aGlzLGU9MDtudWxsIT0oYz1kW2VdKTtlKyspYnx8MSE9PWMubm9kZVR5cGV8fG4uY2xlYW5EYXRhKG9iKGMpKSxjLnBhcmVudE5vZGUmJihiJiZuLmNvbnRhaW5zKGMub3duZXJEb2N1bWVudCxjKSYmbWIob2IoYywic2NyaXB0IikpLGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKSk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhLGI9MDtudWxsIT0oYT10aGlzW2JdKTtiKyspMT09PWEubm9kZVR5cGUmJihuLmNsZWFuRGF0YShvYihhLCExKSksYS50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gSih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEmJjE9PT1iLm5vZGVUeXBlKXJldHVybiBiLmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIGEmJiFkYi50ZXN0KGEpJiYhaWJbKGJiLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPWEucmVwbGFjZShhYiwiPCQxPjwvJDI+Iik7dHJ5e2Zvcig7ZD5jO2MrKyliPXRoaXNbY118fHt9LDE9PT1iLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEob2IoYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGIpe2E9dGhpcy5wYXJlbnROb2RlLG4uY2xlYW5EYXRhKG9iKHRoaXMpKSxhJiZhLnJlcGxhY2VDaGlsZChiLHRoaXMpfSksYSYmKGEubGVuZ3RofHxhLm5vZGVUeXBlKT90aGlzOnRoaXMucmVtb3ZlKCl9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYil7YT1lLmFwcGx5KFtdLGEpO3ZhciBjLGQsZixnLGgsaSxqPTAsbD10aGlzLmxlbmd0aCxtPXRoaXMsbz1sLTEscD1hWzBdLHE9bi5pc0Z1bmN0aW9uKHApO2lmKHF8fGw+MSYmInN0cmluZyI9PXR5cGVvZiBwJiYhay5jaGVja0Nsb25lJiZlYi50ZXN0KHApKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9bS5lcShjKTtxJiYoYVswXT1wLmNhbGwodGhpcyxjLGQuaHRtbCgpKSksZC5kb21NYW5pcChhLGIpfSk7aWYobCYmKGM9bi5idWlsZEZyYWdtZW50KGEsdGhpc1swXS5vd25lckRvY3VtZW50LCExLHRoaXMpLGQ9Yy5maXJzdENoaWxkLDE9PT1jLmNoaWxkTm9kZXMubGVuZ3RoJiYoYz1kKSxkKSl7Zm9yKGY9bi5tYXAob2IoYywic2NyaXB0Iiksa2IpLGc9Zi5sZW5ndGg7bD5qO2orKyloPWMsaiE9PW8mJihoPW4uY2xvbmUoaCwhMCwhMCksZyYmbi5tZXJnZShmLG9iKGgsInNjcmlwdCIpKSksYi5jYWxsKHRoaXNbal0saCxqKTtpZihnKWZvcihpPWZbZi5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxuLm1hcChmLGxiKSxqPTA7Zz5qO2orKyloPWZbal0sZmIudGVzdChoLnR5cGV8fCIiKSYmIUwuYWNjZXNzKGgsImdsb2JhbEV2YWwiKSYmbi5jb250YWlucyhpLGgpJiYoaC5zcmM/bi5fZXZhbFVybCYmbi5fZXZhbFVybChoLnNyYyk6bi5nbG9iYWxFdmFsKGgudGV4dENvbnRlbnQucmVwbGFjZShoYiwiIikpKX1yZXR1cm4gdGhpc319KSxuLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYSl7Zm9yKHZhciBjLGQ9W10sZT1uKGEpLGc9ZS5sZW5ndGgtMSxoPTA7Zz49aDtoKyspYz1oPT09Zz90aGlzOnRoaXMuY2xvbmUoITApLG4oZVtoXSlbYl0oYyksZi5hcHBseShkLGMuZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhkKX19KTt2YXIgcWIscmI9e307ZnVuY3Rpb24gc2IoYixjKXt2YXIgZCxlPW4oYy5jcmVhdGVFbGVtZW50KGIpKS5hcHBlbmRUbyhjLmJvZHkpLGY9YS5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSYmKGQ9YS5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZShlWzBdKSk/ZC5kaXNwbGF5Om4uY3NzKGVbMF0sImRpc3BsYXkiKTtyZXR1cm4gZS5kZXRhY2goKSxmfWZ1bmN0aW9uIHRiKGEpe3ZhciBiPWwsYz1yYlthXTtyZXR1cm4gY3x8KGM9c2IoYSxiKSwibm9uZSIhPT1jJiZjfHwocWI9KHFifHxuKCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikpLmFwcGVuZFRvKGIuZG9jdW1lbnRFbGVtZW50KSxiPXFiWzBdLmNvbnRlbnREb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9c2IoYSxiKSxxYi5kZXRhY2goKSkscmJbYV09YyksY312YXIgdWI9L15tYXJnaW4vLHZiPW5ldyBSZWdFeHAoIl4oIitRKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksd2I9ZnVuY3Rpb24oYil7cmV0dXJuIGIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5vcGVuZXI/Yi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoYixudWxsKTphLmdldENvbXB1dGVkU3R5bGUoYixudWxsKX07ZnVuY3Rpb24geGIoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHx3YihhKSxjJiYoZz1jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl0pLGMmJigiIiE9PWd8fG4uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1uLnN0eWxlKGEsYikpLHZiLnRlc3QoZykmJnViLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMCE9PWc/ZysiIjpnfWZ1bmN0aW9uIHliKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3JldHVybiBhKCk/dm9pZCBkZWxldGUgdGhpcy5nZXQ6KHRoaXMuZ2V0PWIpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fSFmdW5jdGlvbigpe3ZhciBiLGMsZD1sLmRvY3VtZW50RWxlbWVudCxlPWwuY3JlYXRlRWxlbWVudCgiZGl2IiksZj1sLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKGYuc3R5bGUpe2Yuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixmLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWYuc3R5bGUuYmFja2dyb3VuZENsaXAsZS5zdHlsZS5jc3NUZXh0PSJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweDttYXJnaW4tdG9wOjFweDtwb3NpdGlvbjphYnNvbHV0ZSIsZS5hcHBlbmRDaGlsZChmKTtmdW5jdGlvbiBnKCl7Zi5zdHlsZS5jc3NUZXh0PSItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjElO3RvcDoxJTtib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjRweDtwb3NpdGlvbjphYnNvbHV0ZSIsZi5pbm5lckhUTUw9IiIsZC5hcHBlbmRDaGlsZChlKTt2YXIgZz1hLmdldENvbXB1dGVkU3R5bGUoZixudWxsKTtiPSIxJSIhPT1nLnRvcCxjPSI0cHgiPT09Zy53aWR0aCxkLnJlbW92ZUNoaWxkKGUpfWEuZ2V0Q29tcHV0ZWRTdHlsZSYmbi5leHRlbmQoayx7cGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBnKCksYn0sYm94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09YyYmZygpLGN9LHJlbGlhYmxlTWFyZ2luUmlnaHQ6ZnVuY3Rpb24oKXt2YXIgYixjPWYuYXBwZW5kQ2hpbGQobC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmV0dXJuIGMuc3R5bGUuY3NzVGV4dD1mLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MCIsYy5zdHlsZS5tYXJnaW5SaWdodD1jLnN0eWxlLndpZHRoPSIwIixmLnN0eWxlLndpZHRoPSIxcHgiLGQuYXBwZW5kQ2hpbGQoZSksYj0hcGFyc2VGbG9hdChhLmdldENvbXB1dGVkU3R5bGUoYyxudWxsKS5tYXJnaW5SaWdodCksZC5yZW1vdmVDaGlsZChlKSxmLnJlbW92ZUNoaWxkKGMpLGJ9fSl9fSgpLG4uc3dhcD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGc9e307Zm9yKGYgaW4gYilnW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5hcHBseShhLGR8fFtdKTtmb3IoZiBpbiBiKWEuc3R5bGVbZl09Z1tmXTtyZXR1cm4gZX07dmFyIHpiPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxBYj1uZXcgUmVnRXhwKCJeKCIrUSsiKSguKikkIiwiaSIpLEJiPW5ldyBSZWdFeHAoIl4oWystXSk9KCIrUSsiKSIsImkiKSxDYj17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sRGI9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9LEViPVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl07ZnVuY3Rpb24gRmIoYSxiKXtpZihiIGluIGEpcmV0dXJuIGI7dmFyIGM9YlswXS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSksZD1iLGU9RWIubGVuZ3RoO3doaWxlKGUtLSlpZihiPUViW2VdK2MsYiBpbiBhKXJldHVybiBiO3JldHVybiBkfWZ1bmN0aW9uIEdiKGEsYixjKXt2YXIgZD1BYi5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIEhiKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1uLmNzcyhhLGMrUltmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW4uY3NzKGEsInBhZGRpbmciK1JbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW4uY3NzKGEsImJvcmRlciIrUltmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW4uY3NzKGEsInBhZGRpbmciK1JbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW4uY3NzKGEsImJvcmRlciIrUltmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gSWIoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPXdiKGEpLGc9ImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxmKTtpZigwPj1lfHxudWxsPT1lKXtpZihlPXhiKGEsYixmKSwoMD5lfHxudWxsPT1lKSYmKGU9YS5zdHlsZVtiXSksdmIudGVzdChlKSlyZXR1cm4gZTtkPWcmJihrLmJveFNpemluZ1JlbGlhYmxlKCl8fGU9PT1hLnN0eWxlW2JdKSxlPXBhcnNlRmxvYXQoZSl8fDB9cmV0dXJuIGUrSGIoYSxiLGN8fChnPyJib3JkZXIiOiJjb250ZW50IiksZCxmKSsicHgifWZ1bmN0aW9uIEpiKGEsYil7Zm9yKHZhciBjLGQsZSxmPVtdLGc9MCxoPWEubGVuZ3RoO2g+ZztnKyspZD1hW2ddLGQuc3R5bGUmJihmW2ddPUwuZ2V0KGQsIm9sZGRpc3BsYXkiKSxjPWQuc3R5bGUuZGlzcGxheSxiPyhmW2ddfHwibm9uZSIhPT1jfHwoZC5zdHlsZS5kaXNwbGF5PSIiKSwiIj09PWQuc3R5bGUuZGlzcGxheSYmUyhkKSYmKGZbZ109TC5hY2Nlc3MoZCwib2xkZGlzcGxheSIsdGIoZC5ub2RlTmFtZSkpKSk6KGU9UyhkKSwibm9uZSI9PT1jJiZlfHxMLnNldChkLCJvbGRkaXNwbGF5IixlP2M6bi5jc3MoZCwiZGlzcGxheSIpKSkpO2ZvcihnPTA7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGImJiJub25lIiE9PWQuc3R5bGUuZGlzcGxheSYmIiIhPT1kLnN0eWxlLmRpc3BsYXl8fChkLnN0eWxlLmRpc3BsYXk9Yj9mW2ddfHwiIjoibm9uZSIpKTtyZXR1cm4gYX1uLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPXhiKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ImNzc0Zsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7cmV0dXJuIGI9bi5jc3NQcm9wc1toXXx8KG4uY3NzUHJvcHNbaF09RmIoaSxoKSksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLHZvaWQgMD09PWM/ZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl06KGY9dHlwZW9mIGMsInN0cmluZyI9PT1mJiYoZT1CYi5leGVjKGMpKSYmKGM9KGVbMV0rMSkqZVsyXStwYXJzZUZsb2F0KG4uY3NzKGEsYikpLGY9Im51bWJlciIpLG51bGwhPWMmJmM9PT1jJiYoIm51bWJlciIhPT1mfHxuLmNzc051bWJlcltoXXx8KGMrPSJweCIpLGsuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PWN8fDAhPT1iLmluZGV4T2YoImJhY2tncm91bmQiKXx8KGlbYl09ImluaGVyaXQiKSxnJiYic2V0ImluIGcmJnZvaWQgMD09PShjPWcuc2V0KGEsYyxkKSl8fChpW2JdPWMpKSx2b2lkIDApfX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW4uY2FtZWxDYXNlKGIpO3JldHVybiBiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPUZiKGEuc3R5bGUsaCkpLGc9bi5jc3NIb29rc1tiXXx8bi5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihlPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWUmJihlPXhiKGEsYixkKSksIm5vcm1hbCI9PT1lJiZiIGluIERiJiYoZT1EYltiXSksIiI9PT1jfHxjPyhmPXBhcnNlRmxvYXQoZSksYz09PSEwfHxuLmlzTnVtZXJpYyhmKT9mfHwwOmUpOmV9fSksbi5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe24uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/emIudGVzdChuLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9uLnN3YXAoYSxDYixmdW5jdGlvbigpe3JldHVybiBJYihhLGIsZCl9KTpJYihhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJndiKGEpO3JldHVybiBHYihhLGMsZD9IYihhLGIsZCwiYm9yZGVyLWJveCI9PT1uLmNzcyhhLCJib3hTaXppbmciLCExLGUpLGUpOjApfX19KSxuLmNzc0hvb2tzLm1hcmdpblJpZ2h0PXliKGsucmVsaWFibGVNYXJnaW5SaWdodCxmdW5jdGlvbihhLGIpe3JldHVybiBiP24uc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSx4YixbYSwibWFyZ2luUmlnaHQiXSk6dm9pZCAwfSksbi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ND5kO2QrKyllW2ErUltkXStiXT1mW2RdfHxmW2QtMl18fGZbMF07cmV0dXJuIGV9fSx1Yi50ZXN0KGEpfHwobi5jc3NIb29rc1thK2JdLnNldD1HYil9KSxuLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoodGhpcyxmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXt9LGc9MDtpZihuLmlzQXJyYXkoYikpe2ZvcihkPXdiKGEpLGU9Yi5sZW5ndGg7ZT5nO2crKylmW2JbZ11dPW4uY3NzKGEsYltnXSwhMSxkKTtyZXR1cm4gZn1yZXR1cm4gdm9pZCAwIT09Yz9uLnN0eWxlKGEsYixjKTpuLmNzcyhhLGIpfSxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBKYih0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBKYih0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGE/YT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtTKHRoaXMpP24odGhpcykuc2hvdygpOm4odGhpcykuaGlkZSgpfSl9fSk7ZnVuY3Rpb24gS2IoYSxiLGMsZCxlKXtyZXR1cm4gbmV3IEtiLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bi5Ud2Vlbj1LYixLYi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOktiLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fCJzd2luZyIsdGhpcy5vcHRpb25zPWIsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPWQsdGhpcy51bml0PWZ8fChuLmNzc051bWJlcltjXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGE9S2IucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGEmJmEuZ2V0P2EuZ2V0KHRoaXMpOktiLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihhKXt2YXIgYixjPUtiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLnBvcz1iPXRoaXMub3B0aW9ucy5kdXJhdGlvbj9uLmVhc2luZ1t0aGlzLmVhc2luZ10oYSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qYSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTphLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOktiLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LEtiLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1LYi5wcm90b3R5cGUsS2IucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBudWxsPT1hLmVsZW1bYS5wcm9wXXx8YS5lbGVtLnN0eWxlJiZudWxsIT1hLmVsZW0uc3R5bGVbYS5wcm9wXT8oYj1uLmNzcyhhLmVsZW0sYS5wcm9wLCIiKSxiJiYiYXV0byIhPT1iP2I6MCk6YS5lbGVtW2EucHJvcF19LHNldDpmdW5jdGlvbihhKXtuLmZ4LnN0ZXBbYS5wcm9wXT9uLmZ4LnN0ZXBbYS5wcm9wXShhKTphLmVsZW0uc3R5bGUmJihudWxsIT1hLmVsZW0uc3R5bGVbbi5jc3NQcm9wc1thLnByb3BdXXx8bi5jc3NIb29rc1thLnByb3BdKT9uLnN0eWxlKGEuZWxlbSxhLnByb3AsYS5ub3crYS51bml0KTphLmVsZW1bYS5wcm9wXT1hLm5vd319fSxLYi5wcm9wSG9va3Muc2Nyb2xsVG9wPUtiLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oYSl7YS5lbGVtLm5vZGVUeXBlJiZhLmVsZW0ucGFyZW50Tm9kZSYmKGEuZWxlbVthLnByb3BdPWEubm93KX19LG4uZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LHN3aW5nOmZ1bmN0aW9uKGEpe3JldHVybi41LU1hdGguY29zKGEqTWF0aC5QSSkvMn19LG4uZng9S2IucHJvdG90eXBlLmluaXQsbi5meC5zdGVwPXt9O3ZhciBMYixNYixOYj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sT2I9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1ErIikoW2EteiVdKikkIiwiaSIpLFBiPS9xdWV1ZUhvb2tzJC8sUWI9W1ZiXSxSYj17IioiOltmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY3JlYXRlVHdlZW4oYSxiKSxkPWMuY3VyKCksZT1PYi5leGVjKGIpLGY9ZSYmZVszXXx8KG4uY3NzTnVtYmVyW2FdPyIiOiJweCIpLGc9KG4uY3NzTnVtYmVyW2FdfHwicHgiIT09ZiYmK2QpJiZPYi5leGVjKG4uY3NzKGMuZWxlbSxhKSksaD0xLGk9MjA7aWYoZyYmZ1szXSE9PWYpe2Y9Znx8Z1szXSxlPWV8fFtdLGc9K2R8fDE7ZG8gaD1ofHwiLjUiLGcvPWgsbi5zdHlsZShjLmVsZW0sYSxnK2YpO3doaWxlKGghPT0oaD1jLmN1cigpL2QpJiYxIT09aCYmLS1pKX1yZXR1cm4gZSYmKGc9Yy5zdGFydD0rZ3x8K2R8fDAsYy51bml0PWYsYy5lbmQ9ZVsxXT9nKyhlWzFdKzEpKmVbMl06K2VbMl0pLGN9XX07ZnVuY3Rpb24gU2IoKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe0xiPXZvaWQgMH0pLExiPW4ubm93KCl9ZnVuY3Rpb24gVGIoYSxiKXt2YXIgYyxkPTAsZT17aGVpZ2h0OmF9O2ZvcihiPWI/MTowOzQ+ZDtkKz0yLWIpYz1SW2RdLGVbIm1hcmdpbiIrY109ZVsicGFkZGluZyIrY109YTtyZXR1cm4gYiYmKGUub3BhY2l0eT1lLndpZHRoPWEpLGV9ZnVuY3Rpb24gVWIoYSxiLGMpe2Zvcih2YXIgZCxlPShSYltiXXx8W10pLmNvbmNhdChSYlsiKiJdKSxmPTAsZz1lLmxlbmd0aDtnPmY7ZisrKWlmKGQ9ZVtmXS5jYWxsKGMsYixhKSlyZXR1cm4gZH1mdW5jdGlvbiBWYihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosayxsPXRoaXMsbT17fSxvPWEuc3R5bGUscD1hLm5vZGVUeXBlJiZTKGEpLHE9TC5nZXQoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bi5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLGwuYWx3YXlzKGZ1bmN0aW9uKCl7bC5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bby5vdmVyZmxvdyxvLm92ZXJmbG93WCxvLm92ZXJmbG93WV0saj1uLmNzcyhhLCJkaXNwbGF5Iiksaz0ibm9uZSI9PT1qP0wuZ2V0KGEsIm9sZGRpc3BsYXkiKXx8dGIoYS5ub2RlTmFtZSk6aiwiaW5saW5lIj09PWsmJiJub25lIj09PW4uY3NzKGEsImZsb2F0IikmJihvLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYoby5vdmVyZmxvdz0iaGlkZGVuIixsLmFsd2F5cyhmdW5jdGlvbigpe28ub3ZlcmZsb3c9Yy5vdmVyZmxvd1swXSxvLm92ZXJmbG93WD1jLm92ZXJmbG93WzFdLG8ub3ZlcmZsb3dZPWMub3ZlcmZsb3dbMl19KSk7Zm9yKGQgaW4gYilpZihlPWJbZF0sTmIuZXhlYyhlKSl7aWYoZGVsZXRlIGJbZF0sZj1mfHwidG9nZ2xlIj09PWUsZT09PShwPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1lfHwhcXx8dm9pZCAwPT09cVtkXSljb250aW51ZTtwPSEwfW1bZF09cSYmcVtkXXx8bi5zdHlsZShhLGQpfWVsc2Ugaj12b2lkIDA7aWYobi5pc0VtcHR5T2JqZWN0KG0pKSJpbmxpbmUiPT09KCJub25lIj09PWo/dGIoYS5ub2RlTmFtZSk6aikmJihvLmRpc3BsYXk9aik7ZWxzZXtxPyJoaWRkZW4iaW4gcSYmKHA9cS5oaWRkZW4pOnE9TC5hY2Nlc3MoYSwiZnhzaG93Iix7fSksZiYmKHEuaGlkZGVuPSFwKSxwP24oYSkuc2hvdygpOmwuZG9uZShmdW5jdGlvbigpe24oYSkuaGlkZSgpfSksbC5kb25lKGZ1bmN0aW9uKCl7dmFyIGI7TC5yZW1vdmUoYSwiZnhzaG93Iik7Zm9yKGIgaW4gbSluLnN0eWxlKGEsYixtW2JdKX0pO2ZvcihkIGluIG0pZz1VYihwP3FbZF06MCxkLGwpLGQgaW4gcXx8KHFbZF09Zy5zdGFydCxwJiYoZy5lbmQ9Zy5zdGFydCxnLnN0YXJ0PSJ3aWR0aCI9PT1kfHwiaGVpZ2h0Ij09PWQ/MTowKSl9fWZ1bmN0aW9uIFdiKGEsYil7dmFyIGMsZCxlLGYsZztmb3IoYyBpbiBhKWlmKGQ9bi5jYW1lbENhc2UoYyksZT1iW2RdLGY9YVtjXSxuLmlzQXJyYXkoZikmJihlPWZbMV0sZj1hW2NdPWZbMF0pLGMhPT1kJiYoYVtkXT1mLGRlbGV0ZSBhW2NdKSxnPW4uY3NzSG9va3NbZF0sZyYmImV4cGFuZCJpbiBnKXtmPWcuZXhwYW5kKGYpLGRlbGV0ZSBhW2RdO2ZvcihjIGluIGYpYyBpbiBhfHwoYVtjXT1mW2NdLGJbY109ZSl9ZWxzZSBiW2RdPWV9ZnVuY3Rpb24gWGIoYSxiLGMpe3ZhciBkLGUsZj0wLGc9UWIubGVuZ3RoLGg9bi5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7aWYoZSlyZXR1cm4hMTtmb3IodmFyIGI9TGJ8fFNiKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD1jL2ouZHVyYXRpb258fDAsZj0xLWQsZz0wLGk9ai50d2VlbnMubGVuZ3RoO2k+ZztnKyspai50d2VlbnNbZ10ucnVuKGYpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixmLGNdKSwxPmYmJmk/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOm4uZXh0ZW5kKHt9LGIpLG9wdHM6bi5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTpMYnx8U2IoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMpe3ZhciBkPW4uVHdlZW4oYSxqLm9wdHMsYixjLGoub3B0cy5zcGVjaWFsRWFzaW5nW2JdfHxqLm9wdHMuZWFzaW5nKTtyZXR1cm4gai50d2VlbnMucHVzaChkKSxkfSxzdG9wOmZ1bmN0aW9uKGIpe3ZhciBjPTAsZD1iP2oudHdlZW5zLmxlbmd0aDowO2lmKGUpcmV0dXJuIHRoaXM7Zm9yKGU9ITA7ZD5jO2MrKylqLnR3ZWVuc1tjXS5ydW4oMSk7cmV0dXJuIGI/aC5yZXNvbHZlV2l0aChhLFtqLGJdKTpoLnJlamVjdFdpdGgoYSxbaixiXSksdGhpc319KSxrPWoucHJvcHM7Zm9yKFdiKGssai5vcHRzLnNwZWNpYWxFYXNpbmcpO2c+ZjtmKyspaWYoZD1RYltmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIGQ7cmV0dXJuIG4ubWFwKGssVWIsaiksbi5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaiksbi5meC50aW1lcihuLmV4dGVuZChpLHtlbGVtOmEsYW5pbTpqLHF1ZXVlOmoub3B0cy5xdWV1ZX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1uLkFuaW1hdGlvbj1uLmV4dGVuZChYYix7dHdlZW5lcjpmdW5jdGlvbihhLGIpe24uaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWM9YVtkXSxSYltjXT1SYltjXXx8W10sUmJbY10udW5zaGlmdChiKX0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9RYi51bnNoaWZ0KGEpOlFiLnB1c2goYSl9fSksbi5zcGVlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmIm9iamVjdCI9PXR5cGVvZiBhP24uZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8bi5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFuLmlzRnVuY3Rpb24oYikmJmJ9O3JldHVybiBkLmR1cmF0aW9uPW4uZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiBkLmR1cmF0aW9uP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBuLmZ4LnNwZWVkcz9uLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTpuLmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ZC5xdWV1ZXx8ZC5xdWV1ZT09PSEwKSYmKGQucXVldWU9ImZ4IiksZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bi5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZuLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0sbi5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoUykuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bi5pc0VtcHR5T2JqZWN0KGEpLGY9bi5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPVhiKHRoaXMsbi5leHRlbmQoe30sYSksZik7KGV8fEwuZ2V0KHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9bi50aW1lcnMsZz1MLmdldCh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZQYi50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyhifHwhYykmJm4uZGVxdWV1ZSh0aGlzLGEpfSl9LGZpbmlzaDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9PSExJiYoYT1hfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYixjPUwuZ2V0KHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1uLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbi5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxuLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bi5mbltiXTtuLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoVGIoYiwhMCksYSxkLGUpfX0pLG4uZWFjaCh7c2xpZGVEb3duOlRiKCJzaG93Iiksc2xpZGVVcDpUYigiaGlkZSIpLHNsaWRlVG9nZ2xlOlRiKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxuLnRpbWVycz1bXSxuLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPTAsYz1uLnRpbWVycztmb3IoTGI9bi5ub3coKTtiPGMubGVuZ3RoO2IrKylhPWNbYl0sYSgpfHxjW2JdIT09YXx8Yy5zcGxpY2UoYi0tLDEpO2MubGVuZ3RofHxuLmZ4LnN0b3AoKSxMYj12b2lkIDB9LG4uZngudGltZXI9ZnVuY3Rpb24oYSl7bi50aW1lcnMucHVzaChhKSxhKCk/bi5meC5zdGFydCgpOm4udGltZXJzLnBvcCgpfSxuLmZ4LmludGVydmFsPTEzLG4uZnguc3RhcnQ9ZnVuY3Rpb24oKXtNYnx8KE1iPXNldEludGVydmFsKG4uZngudGljayxuLmZ4LmludGVydmFsKSl9LG4uZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoTWIpLE1iPW51bGx9LG4uZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LG4uZm4uZGVsYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1uLmZ4P24uZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiLHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGZ1bmN0aW9uKCl7dmFyIGE9bC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGI9bC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSxjPWIuYXBwZW5kQ2hpbGQobC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7YS50eXBlPSJjaGVja2JveCIsay5jaGVja09uPSIiIT09YS52YWx1ZSxrLm9wdFNlbGVjdGVkPWMuc2VsZWN0ZWQsYi5kaXNhYmxlZD0hMCxrLm9wdERpc2FibGVkPSFjLmRpc2FibGVkLGE9bC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGEudmFsdWU9InQiLGEudHlwZT0icmFkaW8iLGsucmFkaW9WYWx1ZT0idCI9PT1hLnZhbHVlfSgpO3ZhciBZYixaYiwkYj1uLmV4cHIuYXR0ckhhbmRsZTtuLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBKKHRoaXMsbi5hdHRyLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLnJlbW92ZUF0dHIodGhpcyxhKX0pfX0pLG4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9YS5ub2RlVHlwZTtpZihhJiYzIT09ZiYmOCE9PWYmJjIhPT1mKXJldHVybiB0eXBlb2YgYS5nZXRBdHRyaWJ1dGU9PT1VP24ucHJvcChhLGIsYyk6KDE9PT1mJiZuLmlzWE1MRG9jKGEpfHwoYj1iLnRvTG93ZXJDYXNlKCksZD1uLmF0dHJIb29rc1tiXXx8KG4uZXhwci5tYXRjaC5ib29sLnRlc3QoYik/WmI6WWIpKSx2b2lkIDA9PT1jP2QmJiJnZXQiaW4gZCYmbnVsbCE9PShlPWQuZ2V0KGEsYikpP2U6KGU9bi5maW5kLmF0dHIoYSxiKSxudWxsPT1lP3ZvaWQgMDplKTpudWxsIT09Yz9kJiYic2V0ImluIGQmJnZvaWQgMCE9PShlPWQuc2V0KGEsYyxiKSk/ZTooYS5zZXRBdHRyaWJ1dGUoYixjKyIiKSxjKTp2b2lkIG4ucmVtb3ZlQXR0cihhLGIpKQ0KLX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT0wLGY9YiYmYi5tYXRjaChFKTtpZihmJiYxPT09YS5ub2RlVHlwZSl3aGlsZShjPWZbZSsrXSlkPW4ucHJvcEZpeFtjXXx8YyxuLmV4cHIubWF0Y2guYm9vbC50ZXN0KGMpJiYoYVtkXT0hMSksYS5yZW1vdmVBdHRyaWJ1dGUoYyl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWsucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJm4ubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksWmI9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9uLnJlbW92ZUF0dHIoYSxjKTphLnNldEF0dHJpYnV0ZShjLGMpLGN9fSxuLmVhY2gobi5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oYSxiKXt2YXIgYz0kYltiXXx8bi5maW5kLmF0dHI7JGJbYl09ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGY7cmV0dXJuIGR8fChmPSRiW2JdLCRiW2JdPWUsZT1udWxsIT1jKGEsYixkKT9iLnRvTG93ZXJDYXNlKCk6bnVsbCwkYltiXT1mKSxlfX0pO3ZhciBfYj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pO24uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoodGhpcyxuLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW24ucHJvcEZpeFthXXx8YV19KX19KSxuLmV4dGVuZCh7cHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW4uaXNYTUxEb2MoYSksZiYmKGI9bi5wcm9wRml4W2JdfHxiLGU9bi5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJiJnZXQiaW4gZSYmbnVsbCE9PShkPWUuZ2V0KGEsYikpP2Q6YVtiXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8X2IudGVzdChhLm5vZGVOYW1lKXx8YS5ocmVmP2EudGFiSW5kZXg6LTF9fX19KSxrLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJmIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH19KSxuLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe24ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KTt2YXIgYWM9L1tcdFxyXG5cZl0vZztuLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9InN0cmluZyI9PXR5cGVvZiBhJiZhLGk9MCxqPXRoaXMubGVuZ3RoO2lmKG4uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoaClmb3IoYj0oYXx8IiIpLm1hdGNoKEUpfHxbXTtqPmk7aSsrKWlmKGM9dGhpc1tpXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoYWMsIiAiKToiICIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKCIgIitlKyIgIik8MCYmKGQrPWUrIiAiKTtnPW4udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYSxpPTAsaj10aGlzLmxlbmd0aDtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGgpZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aj5pO2krKylpZihjPXRoaXNbaV0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKGFjLCIgIik6IiIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKCIgIitlKyIgIik+PTApZD1kLnJlcGxhY2UoIiAiK2UrIiAiLCIgIik7Zz1hP24udHJpbShkKToiIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6dGhpcy5lYWNoKG4uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihjKXtuKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9OmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1jKXt2YXIgYixkPTAsZT1uKHRoaXMpLGY9YS5tYXRjaChFKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09VXx8ImJvb2xlYW4iPT09YykmJih0aGlzLmNsYXNzTmFtZSYmTC5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6TC5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIil9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIgIithKyIgIixjPTAsZD10aGlzLmxlbmd0aDtkPmM7YysrKWlmKDE9PT10aGlzW2NdLm5vZGVUeXBlJiYoIiAiK3RoaXNbY10uY2xhc3NOYW1lKyIgIikucmVwbGFjZShhYywiICIpLmluZGV4T2YoYik+PTApcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIGJjPS9cci9nO24uZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD1uLmlzRnVuY3Rpb24oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlOzE9PT10aGlzLm5vZGVUeXBlJiYoZT1kP2EuY2FsbCh0aGlzLGMsbih0aGlzKS52YWwoKSk6YSxudWxsPT1lP2U9IiI6Im51bWJlciI9PXR5cGVvZiBlP2UrPSIiOm4uaXNBcnJheShlKSYmKGU9bi5tYXAoZSxmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjphKyIifSkpLGI9bi52YWxIb29rc1t0aGlzLnR5cGVdfHxuLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmInNldCJpbiBiJiZ2b2lkIDAhPT1iLnNldCh0aGlzLGUsInZhbHVlIil8fCh0aGlzLnZhbHVlPWUpKX0pO2lmKGUpcmV0dXJuIGI9bi52YWxIb29rc1tlLnR5cGVdfHxuLnZhbEhvb2tzW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmImdldCJpbiBiJiZ2b2lkIDAhPT0oYz1iLmdldChlLCJ2YWx1ZSIpKT9jOihjPWUudmFsdWUsInN0cmluZyI9PXR5cGVvZiBjP2MucmVwbGFjZShiYywiIik6bnVsbD09Yz8iIjpjKX19fSksbi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1uLmZpbmQuYXR0cihhLCJ2YWx1ZSIpO3JldHVybiBudWxsIT1iP2I6bi50cmltKG4udGV4dChhKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkPWEub3B0aW9ucyxlPWEuc2VsZWN0ZWRJbmRleCxmPSJzZWxlY3Qtb25lIj09PWEudHlwZXx8MD5lLGc9Zj9udWxsOltdLGg9Zj9lKzE6ZC5sZW5ndGgsaT0wPmU/aDpmP2U6MDtoPmk7aSsrKWlmKGM9ZFtpXSwhKCFjLnNlbGVjdGVkJiZpIT09ZXx8KGsub3B0RGlzYWJsZWQ/Yy5kaXNhYmxlZDpudWxsIT09Yy5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpfHxjLnBhcmVudE5vZGUuZGlzYWJsZWQmJm4ubm9kZU5hbWUoYy5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoYj1uKGMpLnZhbCgpLGYpcmV0dXJuIGI7Zy5wdXNoKGIpfXJldHVybiBnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5vcHRpb25zLGY9bi5tYWtlQXJyYXkoYiksZz1lLmxlbmd0aDt3aGlsZShnLS0pZD1lW2ddLChkLnNlbGVjdGVkPW4uaW5BcnJheShkLnZhbHVlLGYpPj0wKSYmKGM9ITApO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxmfX19fSksbi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bi52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uaXNBcnJheShiKT9hLmNoZWNrZWQ9bi5pbkFycmF5KG4oYSkudmFsKCksYik+PTA6dm9pZCAwfX0say5jaGVja09ufHwobi52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pLG4uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe24uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG4uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9fSk7dmFyIGNjPW4ubm93KCksZGM9L1w/LztuLnBhcnNlSlNPTj1mdW5jdGlvbihhKXtyZXR1cm4gSlNPTi5wYXJzZShhKyIiKX0sbi5wYXJzZVhNTD1mdW5jdGlvbihhKXt2YXIgYixjO2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7dHJ5e2M9bmV3IERPTVBhcnNlcixiPWMucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2goZCl7Yj12b2lkIDB9cmV0dXJuKCFifHxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aCkmJm4uZXJyb3IoIkludmFsaWQgWE1MOiAiK2EpLGJ9O3ZhciBlYz0vIy4qJC8sZmM9LyhbPyZdKV89W14mXSovLGdjPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20saGM9L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8saWM9L14oPzpHRVR8SEVBRCkkLyxqYz0vXlwvXC8vLGtjPS9eKFtcdy4rLV0rOikoPzpcL1wvKD86W15cLz8jXSpAfCkoW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLGxjPXt9LG1jPXt9LG5jPSIqLyIuY29uY2F0KCIqIiksb2M9YS5sb2NhdGlvbi5ocmVmLHBjPWtjLmV4ZWMob2MudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIHFjKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZFswXT8oZD1kLnNsaWNlKDEpfHwiKiIsKGFbZF09YVtkXXx8W10pLnVuc2hpZnQoYykpOihhW2RdPWFbZF18fFtdKS5wdXNoKGMpfX1mdW5jdGlvbiByYyhhLGIsYyxkKXt2YXIgZT17fSxmPWE9PT1tYztmdW5jdGlvbiBnKGgpe3ZhciBpO3JldHVybiBlW2hdPSEwLG4uZWFjaChhW2hdfHxbXSxmdW5jdGlvbihhLGgpe3ZhciBqPWgoYixjLGQpO3JldHVybiJzdHJpbmciIT10eXBlb2Yganx8Znx8ZVtqXT9mPyEoaT1qKTp2b2lkIDA6KGIuZGF0YVR5cGVzLnVuc2hpZnQoaiksZyhqKSwhMSl9KSxpfXJldHVybiBnKGIuZGF0YVR5cGVzWzBdKXx8IWVbIioiXSYmZygiKiIpfWZ1bmN0aW9uIHNjKGEsYil7dmFyIGMsZCxlPW4uYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoYyBpbiBiKXZvaWQgMCE9PWJbY10mJigoZVtjXT9hOmR8fChkPXt9KSlbY109YltjXSk7cmV0dXJuIGQmJm4uZXh0ZW5kKCEwLGEsZCksYX1mdW5jdGlvbiB0YyhhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLmNvbnRlbnRzLGk9YS5kYXRhVHlwZXM7d2hpbGUoIioiPT09aVswXSlpLnNoaWZ0KCksdm9pZCAwPT09ZCYmKGQ9YS5taW1lVHlwZXx8Yi5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKGQpZm9yKGUgaW4gaClpZihoW2VdJiZoW2VdLnRlc3QoZCkpe2kudW5zaGlmdChlKTticmVha31pZihpWzBdaW4gYylmPWlbMF07ZWxzZXtmb3IoZSBpbiBjKXtpZighaVswXXx8YS5jb252ZXJ0ZXJzW2UrIiAiK2lbMF1dKXtmPWU7YnJlYWt9Z3x8KGc9ZSl9Zj1mfHxnfXJldHVybiBmPyhmIT09aVswXSYmaS51bnNoaWZ0KGYpLGNbZl0pOnZvaWQgMH1mdW5jdGlvbiB1YyhhLGIsYyxkKXt2YXIgZSxmLGcsaCxpLGo9e30saz1hLmRhdGFUeXBlcy5zbGljZSgpO2lmKGtbMV0pZm9yKGcgaW4gYS5jb252ZXJ0ZXJzKWpbZy50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbZ107Zj1rLnNoaWZ0KCk7d2hpbGUoZilpZihhLnJlc3BvbnNlRmllbGRzW2ZdJiYoY1thLnJlc3BvbnNlRmllbGRzW2ZdXT1iKSwhaSYmZCYmYS5kYXRhRmlsdGVyJiYoYj1hLmRhdGFGaWx0ZXIoYixhLmRhdGFUeXBlKSksaT1mLGY9ay5zaGlmdCgpKWlmKCIqIj09PWYpZj1pO2Vsc2UgaWYoIioiIT09aSYmaSE9PWYpe2lmKGc9altpKyIgIitmXXx8alsiKiAiK2ZdLCFnKWZvcihlIGluIGopaWYoaD1lLnNwbGl0KCIgIiksaFsxXT09PWYmJihnPWpbaSsiICIraFswXV18fGpbIiogIitoWzBdXSkpe2c9PT0hMD9nPWpbZV06altlXSE9PSEwJiYoZj1oWzBdLGsudW5zaGlmdChoWzFdKSk7YnJlYWt9aWYoZyE9PSEwKWlmKGcmJmFbInRocm93cyJdKWI9ZyhiKTtlbHNlIHRyeXtiPWcoYil9Y2F0Y2gobCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6Zz9sOiJObyBjb252ZXJzaW9uIGZyb20gIitpKyIgdG8gIitmfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOmJ9fW4uZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpvYyx0eXBlOiJHRVQiLGlzTG9jYWw6aGMudGVzdChwY1sxXSksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpuYyx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOm4ucGFyc2VKU09OLCJ0ZXh0IHhtbCI6bi5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/c2Moc2MoYSxuLmFqYXhTZXR0aW5ncyksYik6c2Mobi5hamF4U2V0dGluZ3MsYSl9LGFqYXhQcmVmaWx0ZXI6cWMobGMpLGFqYXhUcmFuc3BvcnQ6cWMobWMpLGFqYXg6ZnVuY3Rpb24oYSxiKXsib2JqZWN0Ij09dHlwZW9mIGEmJihiPWEsYT12b2lkIDApLGI9Ynx8e307dmFyIGMsZCxlLGYsZyxoLGksaixrPW4uYWpheFNldHVwKHt9LGIpLGw9ay5jb250ZXh0fHxrLG09ay5jb250ZXh0JiYobC5ub2RlVHlwZXx8bC5qcXVlcnkpP24obCk6bi5ldmVudCxvPW4uRGVmZXJyZWQoKSxwPW4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHE9ay5zdGF0dXNDb2RlfHx7fSxyPXt9LHM9e30sdD0wLHU9ImNhbmNlbGVkIix2PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoMj09PXQpe2lmKCFmKXtmPXt9O3doaWxlKGI9Z2MuZXhlYyhlKSlmW2JbMV0udG9Mb3dlckNhc2UoKV09YlsyXX1iPWZbYS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09Yj9udWxsOmJ9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09dD9lOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHR8fChhPXNbY109c1tjXXx8YSxyW2FdPWIpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHR8fChrLm1pbWVUeXBlPWEpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoYSlpZigyPnQpZm9yKGIgaW4gYSlxW2JdPVtxW2JdLGFbYl1dO2Vsc2Ugdi5hbHdheXMoYVt2LnN0YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihhKXt2YXIgYj1hfHx1O3JldHVybiBjJiZjLmFib3J0KGIpLHgoMCxiKSx0aGlzfX07aWYoby5wcm9taXNlKHYpLmNvbXBsZXRlPXAuYWRkLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsay51cmw9KChhfHxrLnVybHx8b2MpKyIiKS5yZXBsYWNlKGVjLCIiKS5yZXBsYWNlKGpjLHBjWzFdKyIvLyIpLGsudHlwZT1iLm1ldGhvZHx8Yi50eXBlfHxrLm1ldGhvZHx8ay50eXBlLGsuZGF0YVR5cGVzPW4udHJpbShrLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goRSl8fFsiIl0sbnVsbD09ay5jcm9zc0RvbWFpbiYmKGg9a2MuZXhlYyhrLnVybC50b0xvd2VyQ2FzZSgpKSxrLmNyb3NzRG9tYWluPSEoIWh8fGhbMV09PT1wY1sxXSYmaFsyXT09PXBjWzJdJiYoaFszXXx8KCJodHRwOiI9PT1oWzFdPyI4MCI6IjQ0MyIpKT09PShwY1szXXx8KCJodHRwOiI9PT1wY1sxXT8iODAiOiI0NDMiKSkpKSxrLmRhdGEmJmsucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygay5kYXRhJiYoay5kYXRhPW4ucGFyYW0oay5kYXRhLGsudHJhZGl0aW9uYWwpKSxyYyhsYyxrLGIsdiksMj09PXQpcmV0dXJuIHY7aT1uLmV2ZW50JiZrLmdsb2JhbCxpJiYwPT09bi5hY3RpdmUrKyYmbi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxrLnR5cGU9ay50eXBlLnRvVXBwZXJDYXNlKCksay5oYXNDb250ZW50PSFpYy50ZXN0KGsudHlwZSksZD1rLnVybCxrLmhhc0NvbnRlbnR8fChrLmRhdGEmJihkPWsudXJsKz0oZGMudGVzdChkKT8iJiI6Ij8iKStrLmRhdGEsZGVsZXRlIGsuZGF0YSksay5jYWNoZT09PSExJiYoay51cmw9ZmMudGVzdChkKT9kLnJlcGxhY2UoZmMsIiQxXz0iK2NjKyspOmQrKGRjLnRlc3QoZCk/IiYiOiI/IikrIl89IitjYysrKSksay5pZk1vZGlmaWVkJiYobi5sYXN0TW9kaWZpZWRbZF0mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLG4ubGFzdE1vZGlmaWVkW2RdKSxuLmV0YWdbZF0mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsbi5ldGFnW2RdKSksKGsuZGF0YSYmay5oYXNDb250ZW50JiZrLmNvbnRlbnRUeXBlIT09ITF8fGIuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsay5jb250ZW50VHlwZSksdi5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGsuZGF0YVR5cGVzWzBdJiZrLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dP2suYWNjZXB0c1trLmRhdGFUeXBlc1swXV0rKCIqIiE9PWsuZGF0YVR5cGVzWzBdPyIsICIrbmMrIjsgcT0wLjAxIjoiIik6ay5hY2NlcHRzWyIqIl0pO2ZvcihqIGluIGsuaGVhZGVycyl2LnNldFJlcXVlc3RIZWFkZXIoaixrLmhlYWRlcnNbal0pO2lmKGsuYmVmb3JlU2VuZCYmKGsuYmVmb3JlU2VuZC5jYWxsKGwsdixrKT09PSExfHwyPT09dCkpcmV0dXJuIHYuYWJvcnQoKTt1PSJhYm9ydCI7Zm9yKGogaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pdltqXShrW2pdKTtpZihjPXJjKG1jLGssYix2KSl7di5yZWFkeVN0YXRlPTEsaSYmbS50cmlnZ2VyKCJhamF4U2VuZCIsW3Ysa10pLGsuYXN5bmMmJmsudGltZW91dD4wJiYoZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7di5hYm9ydCgidGltZW91dCIpfSxrLnRpbWVvdXQpKTt0cnl7dD0xLGMuc2VuZChyLHgpfWNhdGNoKHcpe2lmKCEoMj50KSl0aHJvdyB3O3goLTEsdyl9fWVsc2UgeCgtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24geChhLGIsZixoKXt2YXIgaixyLHMsdSx3LHg9YjsyIT09dCYmKHQ9MixnJiZjbGVhclRpbWVvdXQoZyksYz12b2lkIDAsZT1ofHwiIix2LnJlYWR5U3RhdGU9YT4wPzQ6MCxqPWE+PTIwMCYmMzAwPmF8fDMwND09PWEsZiYmKHU9dGMoayx2LGYpKSx1PXVjKGssdSx2LGopLGo/KGsuaWZNb2RpZmllZCYmKHc9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJihuLmxhc3RNb2RpZmllZFtkXT13KSx3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYobi5ldGFnW2RdPXcpKSwyMDQ9PT1hfHwiSEVBRCI9PT1rLnR5cGU/eD0ibm9jb250ZW50IjozMDQ9PT1hP3g9Im5vdG1vZGlmaWVkIjooeD11LnN0YXRlLHI9dS5kYXRhLHM9dS5lcnJvcixqPSFzKSk6KHM9eCwoYXx8IXgpJiYoeD0iZXJyb3IiLDA+YSYmKGE9MCkpKSx2LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0oYnx8eCkrIiIsaj9vLnJlc29sdmVXaXRoKGwsW3IseCx2XSk6by5yZWplY3RXaXRoKGwsW3YseCxzXSksdi5zdGF0dXNDb2RlKHEpLHE9dm9pZCAwLGkmJm0udHJpZ2dlcihqPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW3YsayxqP3I6c10pLHAuZmlyZVdpdGgobCxbdix4XSksaSYmKG0udHJpZ2dlcigiYWpheENvbXBsZXRlIixbdixrXSksLS1uLmFjdGl2ZXx8bi5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIHZ9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmdldChhLGIsYywianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5nZXQoYSx2b2lkIDAsYiwic2NyaXB0Iil9fSksbi5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGEsYil7bltiXT1mdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gbi5pc0Z1bmN0aW9uKGMpJiYoZT1lfHxkLGQ9YyxjPXZvaWQgMCksbi5hamF4KHt1cmw6YSx0eXBlOmIsZGF0YVR5cGU6ZSxkYXRhOmMsc3VjY2VzczpkfSl9fSksbi5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gbi5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxuLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk6KHRoaXNbMF0mJihiPW4oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0RWxlbWVudENoaWxkKWE9YS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKSksdGhpcyl9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG4uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXtuKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1uLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG4odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG4uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB9LG4uZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIW4uZXhwci5maWx0ZXJzLmhpZGRlbihhKX07dmFyIHZjPS8lMjAvZyx3Yz0vXFtcXSQvLHhjPS9ccj9cbi9nLHljPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSx6Yz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gQWMoYSxiLGMsZCl7dmFyIGU7aWYobi5pc0FycmF5KGIpKW4uZWFjaChiLGZ1bmN0aW9uKGIsZSl7Y3x8d2MudGVzdChhKT9kKGEsZSk6QWMoYSsiWyIrKCJvYmplY3QiPT10eXBlb2YgZT9iOiIiKSsiXSIsZSxjLGQpfSk7ZWxzZSBpZihjfHwib2JqZWN0IiE9PW4udHlwZShiKSlkKGEsYik7ZWxzZSBmb3IoZSBpbiBiKUFjKGErIlsiK2UrIl0iLGJbZV0sYyxkKX1uLnBhcmFtPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1uLmlzRnVuY3Rpb24oYik/YigpOm51bGw9PWI/IiI6YixkW2QubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoYSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiKX07aWYodm9pZCAwPT09YiYmKGI9bi5hamF4U2V0dGluZ3MmJm4uYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxuLmlzQXJyYXkoYSl8fGEuanF1ZXJ5JiYhbi5pc1BsYWluT2JqZWN0KGEpKW4uZWFjaChhLGZ1bmN0aW9uKCl7ZSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihjIGluIGEpQWMoYyxhW2NdLGIsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UodmMsIisiKX0sbi5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBuLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9bi5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGE/bi5tYWtlQXJyYXkoYSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBhPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhbih0aGlzKS5pcygiOmRpc2FibGVkIikmJnpjLnRlc3QodGhpcy5ub2RlTmFtZSkmJiF5Yy50ZXN0KGEpJiYodGhpcy5jaGVja2VkfHwhVC50ZXN0KGEpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPW4odGhpcykudmFsKCk7cmV0dXJuIG51bGw9PWM/bnVsbDpuLmlzQXJyYXkoYyk/bi5tYXAoYyxmdW5jdGlvbihhKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKHhjLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZSh4YywiXHJcbiIpfX0pLmdldCgpfX0pLG4uYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fWNhdGNoKGEpe319O3ZhciBCYz0wLENjPXt9LERjPXswOjIwMCwxMjIzOjIwNH0sRWM9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIENjKUNjW2FdKCl9KSxrLmNvcnM9ISFFYyYmIndpdGhDcmVkZW50aWFscyJpbiBFYyxrLmFqYXg9RWM9ISFFYyxuLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGsuY29yc3x8RWMmJiFhLmNyb3NzRG9tYWluP3tzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytCYztpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKWYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0pO2I9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7YiYmKGRlbGV0ZSBDY1tnXSxiPWYub25sb2FkPWYub25lcnJvcj1udWxsLCJhYm9ydCI9PT1hP2YuYWJvcnQoKToiZXJyb3IiPT09YT9kKGYuc3RhdHVzLGYuc3RhdHVzVGV4dCk6ZChEY1tmLnN0YXR1c118fGYuc3RhdHVzLGYuc3RhdHVzVGV4dCwic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0P3t0ZXh0OmYucmVzcG9uc2VUZXh0fTp2b2lkIDAsZi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sZi5vbmxvYWQ9YigpLGYub25lcnJvcj1iKCJlcnJvciIpLGI9Q2NbZ109YigiYWJvcnQiKTt0cnl7Zi5zZW5kKGEuaGFzQ29udGVudCYmYS5kYXRhfHxudWxsKX1jYXRjaChoKXtpZihiKXRocm93IGh9fSxhYm9ydDpmdW5jdGlvbigpe2ImJmIoKX19OnZvaWQgMH0pLG4uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovKD86amF2YXxlY21hKXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ2xvYmFsRXZhbChhKSxhfX19KSxuLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7dm9pZCAwPT09YS5jYWNoZSYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIpfSksbi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBiLGM7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZCxlKXtiPW4oIjxzY3JpcHQ+IikucHJvcCh7YXN5bmM6ITAsY2hhcnNldDphLnNjcmlwdENoYXJzZXQsc3JjOmEudXJsfSkub24oImxvYWQgZXJyb3IiLGM9ZnVuY3Rpb24oYSl7Yi5yZW1vdmUoKSxjPW51bGwsYSYmZSgiZXJyb3IiPT09YS50eXBlPzQwNDoyMDAsYS50eXBlKX0pLGwuaGVhZC5hcHBlbmRDaGlsZChiWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX19KTt2YXIgRmM9W10sR2M9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9RmMucG9wKCl8fG4uZXhwYW5kbysiXyIrY2MrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKEdjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmR2MudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKEdjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPShkYy50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssRmMucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fGw7dmFyIGQ9di5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW4uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbihlKS5yZW1vdmUoKSxuLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgSGM9bi5mbi5sb2FkO24uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZIYylyZXR1cm4gSGMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9bi50cmltKGEuc2xpY2UoaCkpLGE9YS5zbGljZSgwLGgpKSxuLmlzRnVuY3Rpb24oYik/KGM9YixiPXZvaWQgMCk6YiYmIm9iamVjdCI9PXR5cGVvZiBiJiYoZT0iUE9TVCIpLGcubGVuZ3RoPjAmJm4uYWpheCh7dXJsOmEsdHlwZTplLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP24oIjxkaXY+IikuYXBwZW5kKG4ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuY29tcGxldGUoYyYmZnVuY3Rpb24oYSxiKXtnLmVhY2goYyxmfHxbYS5yZXNwb25zZVRleHQsYixhXSl9KSx0aGlzfSxuLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihhLGIpe24uZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxuLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gbi5ncmVwKG4udGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofTt2YXIgSWM9YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZnVuY3Rpb24gSmMoYSl7cmV0dXJuIG4uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZSYmYS5kZWZhdWx0Vmlld31uLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW4uY3NzKGEsInBvc2l0aW9uIiksbD1uKGEpLG09e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1uLmNzcyhhLCJ0b3AiKSxpPW4uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiYoZitpKS5pbmRleE9mKCJhdXRvIik+LTEsaj8oZD1sLnBvc2l0aW9uKCksZz1kLnRvcCxlPWQubGVmdCk6KGc9cGFyc2VGbG9hdChmKXx8MCxlPXBhcnNlRmxvYXQoaSl8fDApLG4uaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxoKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXRoaXNbMF0sZT17dG9wOjAsbGVmdDowfSxmPWQmJmQub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixkKT8odHlwZW9mIGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09VSYmKGU9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1KYyhmKSx7dG9wOmUudG9wK2MucGFnZVlPZmZzZXQtYi5jbGllbnRUb3AsbGVmdDplLmxlZnQrYy5wYWdlWE9mZnNldC1iLmNsaWVudExlZnR9KTplfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBhLGIsYz10aGlzWzBdLGQ9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PW4uY3NzKGMsInBvc2l0aW9uIik/Yj1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihhPXRoaXMub2Zmc2V0UGFyZW50KCksYj10aGlzLm9mZnNldCgpLG4ubm9kZU5hbWUoYVswXSwiaHRtbCIpfHwoZD1hLm9mZnNldCgpKSxkLnRvcCs9bi5jc3MoYVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxkLmxlZnQrPW4uY3NzKGFbMF0sImJvcmRlckxlZnRXaWR0aCIsITApKSx7dG9wOmIudG9wLWQudG9wLW4uY3NzKGMsIm1hcmdpblRvcCIsITApLGxlZnQ6Yi5sZWZ0LWQubGVmdC1uLmNzcyhjLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fEljO3doaWxlKGEmJiFuLm5vZGVOYW1lKGEsImh0bWwiKSYmInN0YXRpYyI9PT1uLmNzcyhhLCJwb3NpdGlvbiIpKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF8fEljfSl9fSksbi5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9InBhZ2VZT2Zmc2V0Ij09PWM7bi5mbltiXT1mdW5jdGlvbihlKXtyZXR1cm4gSih0aGlzLGZ1bmN0aW9uKGIsZSxmKXt2YXIgZz1KYyhiKTtyZXR1cm4gdm9pZCAwPT09Zj9nP2dbY106YltlXTp2b2lkKGc/Zy5zY3JvbGxUbyhkP2EucGFnZVhPZmZzZXQ6ZixkP2Y6YS5wYWdlWU9mZnNldCk6YltlXT1mKX0sYixlLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT15YihrLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz14YihhLGIpLHZiLnRlc3QoYyk/bihhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxuLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe24uZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpiLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24oYyxkKXtuLmZuW2RdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aCYmKGN8fCJib29sZWFuIiE9dHlwZW9mIGQpLGc9Y3x8KGQ9PT0hMHx8ZT09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gSih0aGlzLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZTtyZXR1cm4gbi5pc1dpbmRvdyhiKT9iLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09Yi5ub2RlVHlwZT8oZT1iLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChiLmJvZHlbInNjcm9sbCIrYV0sZVsic2Nyb2xsIithXSxiLmJvZHlbIm9mZnNldCIrYV0sZVsib2Zmc2V0IithXSxlWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09ZD9uLmNzcyhiLGMsZyk6bi5zdHlsZShiLGMsZCxnKX0sYixmP2Q6dm9pZCAwLGYsbnVsbCl9fSl9KSxuLmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LG4uZm4uYW5kU2VsZj1uLmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG59KTt2YXIgS2M9YS5qUXVlcnksTGM9YS4kO3JldHVybiBuLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW4mJihhLiQ9TGMpLGImJmEualF1ZXJ5PT09biYmKGEualF1ZXJ5PUtjKSxufSx0eXBlb2YgYj09PVUmJihhLmpRdWVyeT1hLiQ9biksbn0pOw0KKy8qIQorCitDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCitodHRwOi8vanF1ZXJ5LmNvbS8KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECitOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCisqLworLyohIGpRdWVyeSB2Mi4xLjMgfCAoYykgMjAwNSwgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLworIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPXt9LGw9YS5kb2N1bWVudCxtPSIyLjEuMyIsbj1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbi5mbi5pbml0KGEsYil9LG89L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLHA9L14tbXMtLyxxPS8tKFtcZGEtel0pL2dpLHI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTtuLmZuPW4ucHJvdG90eXBlPXtqcXVlcnk6bSxjb25zdHJ1Y3RvcjpuLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTpkLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1uLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZWFjaCh0aGlzLGEsYil9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbi5leHRlbmQ9bi5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG4uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oYT1hcmd1bWVudHNbaF0pKWZvcihiIGluIGEpYz1nW2JdLGQ9YVtiXSxnIT09ZCYmKGomJmQmJihuLmlzUGxhaW5PYmplY3QoZCl8fChlPW4uaXNBcnJheShkKSkpPyhlPyhlPSExLGY9YyYmbi5pc0FycmF5KGMpP2M6W10pOmY9YyYmbi5pc1BsYWluT2JqZWN0KGMpP2M6e30sZ1tiXT1uLmV4dGVuZChqLGYsZCkpOnZvaWQgMCE9PWQmJihnW2JdPWQpKTtyZXR1cm4gZ30sbi5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKG0rTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW4udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZhPT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4hbi5pc0FycmF5KGEpJiZhLXBhcnNlRmxvYXQoYSkrMT49MH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtyZXR1cm4ib2JqZWN0IiE9PW4udHlwZShhKXx8YS5ub2RlVHlwZXx8bi5pc1dpbmRvdyhhKT8hMTphLmNvbnN0cnVjdG9yJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIik/ITE6ITB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihhKXt2YXIgYixjPWV2YWw7YT1uLnRyaW0oYSksYSYmKDE9PT1hLmluZGV4T2YoInVzZSBzdHJpY3QiKT8oYj1sLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGIudGV4dD1hLGwuaGVhZC5hcHBlbmRDaGlsZChiKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpKTpjKGEpKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cyhhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsPT1iPy0xOmcuY2FsbChiLGEsYyl9LG1lcmdlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPStiLmxlbmd0aCxkPTAsZT1hLmxlbmd0aDtjPmQ7ZCsrKWFbZSsrXT1iW2RdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXMoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihjPWFbYl0sYj1hLGE9Yyksbi5pc0Z1bmN0aW9uKGEpPyhlPWQuY2FsbChhcmd1bWVudHMsMiksZj1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsZS5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZi5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGYpOnZvaWQgMH0sbm93OkRhdGUubm93LHN1cHBvcnQ6a30pLG4uZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2hbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gcyhhKXt2YXIgYj1hLmxlbmd0aCxjPW4udHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iPT09Y3x8bi5pc1dpbmRvdyhhKT8hMToxPT09YS5ub2RlVHlwZSYmYj8hMDoiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYX12YXIgdD1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1PSJzaXp6bGUiKzEqbmV3IERhdGUsdj1hLmRvY3VtZW50LHc9MCx4PTAseT1oYigpLHo9aGIoKSxBPWhiKCksQj1mdW5jdGlvbihhLGIpe3JldHVybiBhPT09YiYmKGw9ITApLDB9LEM9MTw8MzEsRD17fS5oYXNPd25Qcm9wZXJ0eSxFPVtdLEY9RS5wb3AsRz1FLnB1c2gsSD1FLnB1c2gsST1FLnNsaWNlLEo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LEs9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixMPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixNPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTj1NLnJlcGxhY2UoInciLCJ3IyIpLE89IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitOKyIpKXwpIitMKyIqXFxdIixQPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTysiKSopfC4qKVxcKXwpIixRPW5ldyBSZWdFeHAoTCsiKyIsImciKSxSPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUz1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFQ9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxVPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFY9bmV3IFJlZ0V4cChQKSxXPW5ldyBSZWdFeHAoIl4iK04rIiQiKSxYPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTS5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrTyksUFNFVURPOm5ldyBSZWdFeHAoIl4iK1ApLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTCsiKig/OihbKy1dfCkiK0wrIiooXFxkKyl8KSkiK0wrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0srIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitMKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0wrIiooKD86LVxcZCk/XFxkKikiK0wrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxaPS9eaFxkJC9pLCQ9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLF89L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxhYj0vWyt+XS8sYmI9Lyd8XFwvZyxjYj1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksZGI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGViPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChmYil7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZ2IoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3LHg7aWYoKGI/Yi5vd25lckRvY3VtZW50fHxiOnYpIT09biYmbShiKSxiPWJ8fG4sZD1kfHxbXSxrPWIubm9kZVR5cGUsInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIGQ7aWYoIWUmJnApe2lmKDExIT09ayYmKGY9Xy5leGVjKGEpKSlpZihqPWZbMV0pe2lmKDk9PT1rKXtpZihoPWIuZ2V0RWxlbWVudEJ5SWQoaiksIWh8fCFoLnBhcmVudE5vZGUpcmV0dXJuIGQ7aWYoaC5pZD09PWopcmV0dXJuIGQucHVzaChoKSxkfWVsc2UgaWYoYi5vd25lckRvY3VtZW50JiYoaD1iLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaikpJiZ0KGIsaCkmJmguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNle2lmKGZbMl0pcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChqPWZbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaikpLGR9aWYoYy5xc2EmJighcXx8IXEudGVzdChhKSkpe2lmKHM9cj11LHc9Yix4PTEhPT1rJiZhLDE9PT1rJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bz1nKGEpLChyPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXIucmVwbGFjZShiYiwiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscykscz0iW2lkPSciK3MrIiddICIsbD1vLmxlbmd0aDt3aGlsZShsLS0pb1tsXT1zK3JiKG9bbF0pO3c9YWIudGVzdChhKSYmcGIoYi5wYXJlbnROb2RlKXx8Yix4PW8uam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBILmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHgpKSxkfWNhdGNoKHkpe31maW5hbGx5e3J8fGIucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGkoYS5yZXBsYWNlKFIsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGhiKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBpYihhKXtyZXR1cm4gYVt1XT0hMCxhfWZ1bmN0aW9uIGpiKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2IoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGIoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEMpLSh+YS5zb3VyY2VJbmRleHx8Qyk7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1iKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5iKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYihhKXtyZXR1cm4gaWIoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsaWIoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBwYihhKXtyZXR1cm4gYSYmInVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZhfWM9Z2Iuc3VwcG9ydD17fSxmPWdiLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxtPWdiLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGUsZz1hP2Eub3duZXJEb2N1bWVudHx8YTp2O3JldHVybiBnIT09biYmOT09PWcubm9kZVR5cGUmJmcuZG9jdW1lbnRFbGVtZW50PyhuPWcsbz1nLmRvY3VtZW50RWxlbWVudCxlPWcuZGVmYXVsdFZpZXcsZSYmZSE9PWUudG9wJiYoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixlYiwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib251bmxvYWQiLGViKSkscD0hZihnKSxjLmF0dHJpYnV0ZXM9amIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1qYihmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChnLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT0kLnRlc3QoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxjLmdldEJ5SWQ9amIoZnVuY3Rpb24oYSl7cmV0dXJuIG8uYXBwZW5kQ2hpbGQoYSkuaWQ9dSwhZy5nZXRFbGVtZW50c0J5TmFtZXx8IWcuZ2V0RWxlbWVudHNCeU5hbWUodSkubGVuZ3RofSksYy5nZXRCeUlkPyhkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGMmJmMucGFyZW50Tm9kZT9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2IsZGIpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYixkYik7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuIHA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT0kLnRlc3QoZy5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYihmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXGZdJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmcS5wdXNoKCJbKl4kXT0iK0wrIiooPzonJ3xcIlwiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cS5wdXNoKCJcXFsiK0wrIiooPzp2YWx1ZXwiK0srIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit1KyItXSIpLmxlbmd0aHx8cS5wdXNoKCJ+PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHEucHVzaCgiOmNoZWNrZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit1KyIrKiIpLmxlbmd0aHx8cS5wdXNoKCIuIy4rWyt+XSIpfSksamIoZnVuY3Rpb24oYSl7dmFyIGI9Zy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmcS5wdXNoKCJuYW1lIitMKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fHEucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxxLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9JC50ZXN0KHM9by5tYXRjaGVzfHxvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8by5tb3pNYXRjaGVzU2VsZWN0b3J8fG8ub01hdGNoZXNTZWxlY3Rvcnx8by5tc01hdGNoZXNTZWxlY3RvcikpJiZqYihmdW5jdGlvbihhKXtjLmRpc2Nvbm5lY3RlZE1hdGNoPXMuY2FsbChhLCJkaXYiKSxzLmNhbGwoYSwiW3MhPScnXTp4Iiksci5wdXNoKCIhPSIsUCl9KSxxPXEubGVuZ3RoJiZuZXcgUmVnRXhwKHEuam9pbigifCIpKSxyPXIubGVuZ3RoJiZuZXcgUmVnRXhwKHIuam9pbigifCIpKSxiPSQudGVzdChvLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx0PWJ8fCQudGVzdChvLmNvbnRhaW5zKT9mdW5jdGlvbihhLGIpe3ZhciBjPTk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhKCFkfHwxIT09ZC5ub2RlVHlwZXx8IShjLmNvbnRhaW5zP2MuY29udGFpbnMoZCk6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkKSkpfTpmdW5jdGlvbihhLGIpe2lmKGIpd2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LEI9Yj9mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGQ9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIGQ/ZDooZD0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MSwxJmR8fCFjLnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWQ/YT09PWd8fGEub3duZXJEb2N1bWVudD09PXYmJnQodixhKT8tMTpiPT09Z3x8Yi5vd25lckRvY3VtZW50PT09diYmdCh2LGIpPzE6az9KKGssYSktSihrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGU9YS5wYXJlbnROb2RlLGY9Yi5wYXJlbnROb2RlLGg9W2FdLGk9W2JdO2lmKCFlfHwhZilyZXR1cm4gYT09PWc/LTE6Yj09PWc/MTplPy0xOmY/MTprP0ooayxhKS1KKGssYik6MDtpZihlPT09ZilyZXR1cm4gbGIoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSlpLnVuc2hpZnQoYyk7d2hpbGUoaFtkXT09PWlbZF0pZCsrO3JldHVybiBkP2xiKGhbZF0saVtkXSk6aFtkXT09PXY/LTE6aVtkXT09PXY/MTowfSxnKTpufSxnYi5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdiKGEsbnVsbCxudWxsLGIpfSxnYi5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksYj1iLnJlcGxhY2UoVSwiPSckMSddIiksISghYy5tYXRjaGVzU2VsZWN0b3J8fCFwfHxyJiZyLnRlc3QoYil8fHEmJnEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGdiKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGdiLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZ2IuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGdiLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZ2IudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWdiLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1nYi5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzppYixtYXRjaDpYLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoY2IsZGIpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGNiLGRiKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8Z2IuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZ2IuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFguQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVi50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYixkYikudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9Z2IuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShRLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoO2lmKHEpe2lmKGYpe3doaWxlKHApe2w9Yjt3aGlsZShsPWxbcF0paWYoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKXJldHVybiExO289cD0ib25seSI9PT1hJiYhbyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihvPVtnP3EuZmlyc3RDaGlsZDpxLmxhc3RDaGlsZF0sZyYmcyl7az1xW3VdfHwocVt1XT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLG09alswXT09PXcmJmpbMl0sbD1uJiZxLmNoaWxkTm9kZXNbbl07d2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoMT09PWwubm9kZVR5cGUmJisrbSYmbD09PWIpe2tbYV09W3csbixtXTticmVha319ZWxzZSBpZihzJiYoaj0oYlt1XXx8KGJbdV09e30pKVthXSkmJmpbMF09PT13KW09alsxXTtlbHNlIHdoaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKChoP2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PWwubm9kZVR5cGUpJiYrK20mJihzJiYoKGxbdV18fChsW3VdPXt9KSlbYV09W3csbV0pLGw9PT1iKSlicmVhaztyZXR1cm4gbS09ZSxtPT09ZHx8bSVkPT09MCYmbS9kPj0wfX19LFBTRVVETzpmdW5jdGlvbihhLGIpe3ZhciBjLGU9ZC5wc2V1ZG9zW2FdfHxkLnNldEZpbHRlcnNbYS50b0xvd2VyQ2FzZSgpXXx8Z2IuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKTtyZXR1cm4gZVt1XT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSwiIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9pYihmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SihhLGZbZ10pLGFbZF09IShjW2RdPWZbZ10pfSk6ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSwwLGMpfSk6ZX19LHBzZXVkb3M6e25vdDppYihmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGQ9aChhLnJlcGxhY2UoUiwiJDEiKSk7cmV0dXJuIGRbdV0/aWIoZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSkoZj1nW2hdKSYmKGFbaF09IShiW2hdPWYpKX0pOmZ1bmN0aW9uKGEsZSxmKXtyZXR1cm4gYlswXT1hLGQoYixudWxsLGYsYyksYlswXT1udWxsLCFjLnBvcCgpfX0pLGhhczppYihmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGdiKGEsYikubGVuZ3RoPjB9fSksY29udGFpbnM6aWIoZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKGNiLGRiKSxmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGUoYikpLmluZGV4T2YoYSk+LTF9fSksbGFuZzppYihmdW5jdGlvbihhKXtyZXR1cm4gVy50ZXN0KGF8fCIiKXx8Z2IuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrYSksYT1hLnJlcGxhY2UoY2IsZGIpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBaLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBZLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiJidXR0b24iPT09YS50eXBlfHwiYnV0dG9uIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YS50eXBlJiYobnVsbD09KGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0Om9iKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpvYihmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6b2IoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpvYihmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpvYihmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0Om9iKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6b2IoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPW1iKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPW5iKGIpO2Z1bmN0aW9uIHFiKCl7fXFiLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgcWIsZz1nYi50b2tlbml6ZT1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaSxqLGs9elthKyIgIl07aWYoaylyZXR1cm4gYj8wOmsuc2xpY2UoMCk7aD1hLGk9W10saj1kLnByZUZpbHRlcjt3aGlsZShoKXsoIWN8fChlPVMuZXhlYyhoKSkpJiYoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1ULmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFIsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1YW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2IuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiByYihhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHNiKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGo9W3csZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihpPWJbdV18fChiW3VdPXt9KSwoaD1pW2RdKSYmaFswXT09PXcmJmhbMV09PT1mKXJldHVybiBqWzJdPWhbMl07aWYoaVtkXT1qLGpbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiB0YihhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB1YihhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWdiKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB2YihhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoIWN8fGMoZixkLGUpKSYmKGcucHVzaChmKSxqJiZiLnB1c2goaCkpO3JldHVybiBnfWZ1bmN0aW9uIHdiKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXdiKGQpKSxlJiYhZVt1XSYmKGU9d2IoZSxmKSksaWIoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dWIoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6dmIocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXZiKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9KKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj12YihyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SC5hcHBseShnLHIpfSl9ZnVuY3Rpb24geGIoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz1zYihmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9c2IoZnVuY3Rpb24oYSl7cmV0dXJuIEooYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2Y+aTtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bc2IodGIobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHdiKGk+MSYmdGIobSksaT4xJiZyYihhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFIsIiQxIiksYyxlPmkmJnhiKGEuc2xpY2UoaSxlKSksZj5lJiZ4YihhPWEuc2xpY2UoZSkpLGY+ZSYmcmIoYSkpfW0ucHVzaChjKX1yZXR1cm4gdGIobSl9ZnVuY3Rpb24geWIoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbSxvLHA9MCxxPSIwIixyPWYmJltdLHM9W10sdD1qLHU9Znx8ZSYmZC5maW5kLlRBRygiKiIsayksdj13Kz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8LjEseD11Lmxlbmd0aDtmb3IoayYmKGo9ZyE9PW4mJmcpO3EhPT14JiZudWxsIT0obD11W3FdKTtxKyspe2lmKGUmJmwpe209MDt3aGlsZShvPWFbbSsrXSlpZihvKGwsZyxoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXYpfWMmJigobD0hbyYmbCkmJnAtLSxmJiZyLnB1c2gobCkpfWlmKHArPXEsYyYmcSE9PXApe209MDt3aGlsZShvPWJbbSsrXSlvKHIscyxnLGgpO2lmKGYpe2lmKHA+MCl3aGlsZShxLS0pcltxXXx8c1txXXx8KHNbcV09Ri5jYWxsKGkpKTtzPXZiKHMpfUguYXBwbHkoaSxzKSxrJiYhZiYmcy5sZW5ndGg+MCYmcCtiLmxlbmd0aD4xJiZnYi51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz12LGo9dCkscn07cmV0dXJuIGM/aWIoZik6Zn1yZXR1cm4gaD1nYi5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eGIoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHliKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYi5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGUsZil7dmFyIGksaixrLGwsbSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG89IWYmJmcoYT1uLnNlbGVjdG9yfHxhKTtpZihlPWV8fFtdLDE9PT1vLmxlbmd0aCl7aWYoaj1vWzBdPW9bMF0uc2xpY2UoMCksai5sZW5ndGg+MiYmIklEIj09PShrPWpbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJnAmJmQucmVsYXRpdmVbalsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNiLGRiKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO24mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGouc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWk9WC5uZWVkc0NvbnRleHQudGVzdChhKT8wOmoubGVuZ3RoO3doaWxlKGktLSl7aWYoaz1qW2ldLGQucmVsYXRpdmVbbD1rLnR5cGVdKWJyZWFrO2lmKChtPWQuZmluZFtsXSkmJihmPW0oay5tYXRjaGVzWzBdLnJlcGxhY2UoY2IsZGIpLGFiLnRlc3QoalswXS50eXBlKSYmcGIoYi5wYXJlbnROb2RlKXx8YikpKXtpZihqLnNwbGljZShpLDEpLGE9Zi5sZW5ndGgmJnJiKGopLCFhKXJldHVybiBILmFwcGx5KGUsZiksZTticmVha319fXJldHVybihufHxoKGEsbykpKGYsYiwhcCxlLGFiLnRlc3QoYSkmJnBiKGIucGFyZW50Tm9kZSl8fGIpLGV9LGMuc29ydFN0YWJsZT11LnNwbGl0KCIiKS5zb3J0KEIpLmpvaW4oIiIpPT09dSxjLmRldGVjdER1cGxpY2F0ZXM9ISFsLG0oKSxjLnNvcnREZXRhY2hlZD1qYihmdW5jdGlvbihhKXtyZXR1cm4gMSZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG4uY3JlYXRlRWxlbWVudCgiZGl2IikpfSksamIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2IoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYz92b2lkIDA6YS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2IoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGN8fCJpbnB1dCIhPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dm9pZCAwOmEuZGVmYXVsdFZhbHVlfSksamIoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGtiKEssZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDphW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdifShhKTtuLmZpbmQ9dCxuLmV4cHI9dC5zZWxlY3RvcnMsbi5leHByWyI6Il09bi5leHByLnBzZXVkb3Msbi51bmlxdWU9dC51bmlxdWVTb3J0LG4udGV4dD10LmdldFRleHQsbi5pc1hNTERvYz10LmlzWE1MLG4uY29udGFpbnM9dC5jb250YWluczt2YXIgdT1uLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHY9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyx3PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24geChhLGIsYyl7aWYobi5pc0Z1bmN0aW9uKGIpKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih3LnRlc3QoYikpcmV0dXJuIG4uZmlsdGVyKGIsYSxjKTtiPW4uZmlsdGVyKGIsYSl9cmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBnLmNhbGwoYixhKT49MCE9PWN9KX1uLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9uLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm4uZmluZC5tYXRjaGVzKGEsbi5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxuLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPXRoaXMubGVuZ3RoLGQ9W10sZT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2M+YjtiKyspaWYobi5jb250YWlucyhlW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7Yz5iO2IrKyluLmZpbmQoYSxlW2JdLGQpO3JldHVybiBkPXRoaXMucHVzaFN0YWNrKGM+MT9uLnVuaXF1ZShkKTpkKSxkLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGR9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeCh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeCh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEheCh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdS50ZXN0KGEpP24oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgeSx6PS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKikpJC8sQT1uLmZuLmluaXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2lmKCFhKXJldHVybiB0aGlzO2lmKCJzdHJpbmciPT10eXBlb2YgYSl7aWYoYz0iPCI9PT1hWzBdJiYiPiI9PT1hW2EubGVuZ3RoLTFdJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOnouZXhlYyhhKSwhY3x8IWNbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHx5KS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihjWzFdKXtpZihiPWIgaW5zdGFuY2VvZiBuP2JbMF06YixuLm1lcmdlKHRoaXMsbi5wYXJzZUhUTUwoY1sxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8YjpsLCEwKSksdi50ZXN0KGNbMV0pJiZuLmlzUGxhaW5PYmplY3QoYikpZm9yKGMgaW4gYiluLmlzRnVuY3Rpb24odGhpc1tjXSk/dGhpc1tjXShiW2NdKTp0aGlzLmF0dHIoYyxiW2NdKTtyZXR1cm4gdGhpc31yZXR1cm4gZD1sLmdldEVsZW1lbnRCeUlkKGNbMl0pLGQmJmQucGFyZW50Tm9kZSYmKHRoaXMubGVuZ3RoPTEsdGhpc1swXT1kKSx0aGlzLmNvbnRleHQ9bCx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXMpOm4uaXNGdW5jdGlvbihhKT8idW5kZWZpbmVkIiE9dHlwZW9mIHkucmVhZHk/eS5yZWFkeShhKTphKG4pOih2b2lkIDAhPT1hLnNlbGVjdG9yJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpLG4ubWFrZUFycmF5KGEsdGhpcykpfTtBLnByb3RvdHlwZT1uLmZuLHk9bihsKTt2YXIgQj0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxDPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O24uZXh0ZW5kKHtkaXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU9dm9pZCAwIT09Yzt3aGlsZSgoYT1hW2JdKSYmOSE9PWEubm9kZVR5cGUpaWYoMT09PWEubm9kZVR5cGUpe2lmKGUmJm4oYSkuaXMoYykpYnJlYWs7ZC5wdXNoKGEpfXJldHVybiBkfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pLG4uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oYSl7dmFyIGI9bihhLHRoaXMpLGM9Yi5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7Yz5hO2ErKylpZihuLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dS50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bihhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbi5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP24udW5pcXVlKGYpOmYpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT8ic3RyaW5nIj09dHlwZW9mIGE/Zy5jYWxsKG4oYSksdGhpc1swXSk6Zy5jYWxsKHRoaXMsYS5qcXVlcnk/YVswXTphKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnB1c2hTdGFjayhuLnVuaXF1ZShuLm1lcmdlKHRoaXMuZ2V0KCksbihhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBEKGEsYil7d2hpbGUoKGE9YVtiXSkmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1uLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5kaXIoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRChhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbi5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbi5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uc2libGluZygoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIG4uc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYS5jb250ZW50RG9jdW1lbnR8fG4ubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPW4ubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9bi5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKENbYV18fG4udW5pcXVlKGUpLEIudGVzdChhKSYmZS5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBFPS9cUysvZyxGPXt9O2Z1bmN0aW9uIEcoYSl7dmFyIGI9RlthXT17fTtyZXR1cm4gbi5lYWNoKGEubWF0Y2goRSl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/RlthXXx8RyhhKTpuLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmLGcsaD1bXSxpPSFhLm9uY2UmJltdLGo9ZnVuY3Rpb24obCl7Zm9yKGI9YS5tZW1vcnkmJmwsYz0hMCxnPWV8fDAsZT0wLGY9aC5sZW5ndGgsZD0hMDtoJiZmPmc7ZysrKWlmKGhbZ10uYXBwbHkobFswXSxsWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlKXtiPSExO2JyZWFrfWQ9ITEsaCYmKGk/aS5sZW5ndGgmJmooaS5zaGlmdCgpKTpiP2g9W106ay5kaXNhYmxlKCkpfSxrPXthZGQ6ZnVuY3Rpb24oKXtpZihoKXt2YXIgYz1oLmxlbmd0aDshZnVuY3Rpb24gZyhiKXtuLmVhY2goYixmdW5jdGlvbihiLGMpe3ZhciBkPW4udHlwZShjKTsiZnVuY3Rpb24iPT09ZD9hLnVuaXF1ZSYmay5oYXMoYyl8fGgucHVzaChjKTpjJiZjLmxlbmd0aCYmInN0cmluZyIhPT1kJiZnKGMpfSl9KGFyZ3VtZW50cyksZD9mPWgubGVuZ3RoOmImJihlPWMsaihiKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBoJiZuLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYil7dmFyIGM7d2hpbGUoKGM9bi5pbkFycmF5KGIsaCxjKSk+LTEpaC5zcGxpY2UoYywxKSxkJiYoZj49YyYmZi0tLGc+PWMmJmctLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bi5pbkFycmF5KGEsaCk+LTE6ISghaHx8IWgubGVuZ3RoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaD1bXSxmPTAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBoPWk9Yj12b2lkIDAsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haH0sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPXZvaWQgMCxifHxrLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sZmlyZVdpdGg6ZnVuY3Rpb24oYSxiKXtyZXR1cm4haHx8YyYmIWl8fChiPWJ8fFtdLGI9W2EsYi5zbGljZT9iLnNsaWNlKCk6Yl0sZD9pLnB1c2goYik6aihiKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBrLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhY319O3JldHVybiBrfSxuLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuLkRlZmVycmVkKGZ1bmN0aW9uKGMpe24uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bi5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP24uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbi5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1kLmNhbGwoYXJndW1lbnRzKSxlPWMubGVuZ3RoLGY9MSE9PWV8fGEmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2U6MCxnPTE9PT1mP2E6bi5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihlKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6ZSxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGU+MSlmb3IoaT1uZXcgQXJyYXkoZSksaj1uZXcgQXJyYXkoZSksaz1uZXcgQXJyYXkoZSk7ZT5iO2IrKyljW2JdJiZuLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5kb25lKGgoYixrLGMpKS5mYWlsKGcucmVqZWN0KS5wcm9ncmVzcyhoKGIsaixpKSk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEg7bi5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbi5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxuLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9uLnJlYWR5V2FpdCsrOm4ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tbi5yZWFkeVdhaXQ6bi5pc1JlYWR5KXx8KG4uaXNSZWFkeT0hMCxhIT09ITAmJi0tbi5yZWFkeVdhaXQ+MHx8KEgucmVzb2x2ZVdpdGgobCxbbl0pLG4uZm4udHJpZ2dlckhhbmRsZXImJihuKGwpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG4obCkub2ZmKCJyZWFkeSIpKSkpfX0pO2Z1bmN0aW9uIEkoKXtsLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEksITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsSSwhMSksbi5yZWFkeSgpfW4ucmVhZHkucHJvbWlzZT1mdW5jdGlvbihiKXtyZXR1cm4gSHx8KEg9bi5EZWZlcnJlZCgpLCJjb21wbGV0ZSI9PT1sLnJlYWR5U3RhdGU/c2V0VGltZW91dChuLnJlYWR5KToobC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixJLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEksITEpKSksSC5wcm9taXNlKGIpfSxuLnJlYWR5LnByb21pc2UoKTt2YXIgSj1uLmFjY2Vzcz1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD0wLGk9YS5sZW5ndGgsaj1udWxsPT1jO2lmKCJvYmplY3QiPT09bi50eXBlKGMpKXtlPSEwO2ZvcihoIGluIGMpbi5hY2Nlc3MoYSxiLGgsY1toXSwhMCxmLGcpfWVsc2UgaWYodm9pZCAwIT09ZCYmKGU9ITAsbi5pc0Z1bmN0aW9uKGQpfHwoZz0hMCksaiYmKGc/KGIuY2FsbChhLGQpLGI9bnVsbCk6KGo9YixiPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gai5jYWxsKG4oYSksYyl9KSksYikpZm9yKDtpPmg7aCsrKWIoYVtoXSxjLGc/ZDpkLmNhbGwoYVtoXSxoLGIoYVtoXSxjKSkpO3JldHVybiBlP2E6aj9iLmNhbGwoYSk6aT9iKGFbMF0sYyk6Zn07bi5hY2NlcHREYXRhPWZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZXx8OT09PWEubm9kZVR5cGV8fCErYS5ub2RlVHlwZX07ZnVuY3Rpb24gSygpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLmNhY2hlPXt9LDAse2dldDpmdW5jdGlvbigpe3JldHVybnt9fX0pLHRoaXMuZXhwYW5kbz1uLmV4cGFuZG8rSy51aWQrK31LLnVpZD0xLEsuYWNjZXB0cz1uLmFjY2VwdERhdGEsSy5wcm90b3R5cGU9e2tleTpmdW5jdGlvbihhKXtpZighSy5hY2NlcHRzKGEpKXJldHVybiAwO3ZhciBiPXt9LGM9YVt0aGlzLmV4cGFuZG9dO2lmKCFjKXtjPUsudWlkKys7dHJ5e2JbdGhpcy5leHBhbmRvXT17dmFsdWU6Y30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSxiKX1jYXRjaChkKXtiW3RoaXMuZXhwYW5kb109YyxuLmV4dGVuZChhLGIpfX1yZXR1cm4gdGhpcy5jYWNoZVtjXXx8KHRoaXMuY2FjaGVbY109e30pLGN9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZT10aGlzLmtleShhKSxmPXRoaXMuY2FjaGVbZV07aWYoInN0cmluZyI9PXR5cGVvZiBiKWZbYl09YztlbHNlIGlmKG4uaXNFbXB0eU9iamVjdChmKSluLmV4dGVuZCh0aGlzLmNhY2hlW2VdLGIpO2Vsc2UgZm9yKGQgaW4gYilmW2RdPWJbZF07cmV0dXJuIGZ9LGdldDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY2FjaGVbdGhpcy5rZXkoYSldO3JldHVybiB2b2lkIDA9PT1iP2M6Y1tiXX0sYWNjZXNzOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gdm9pZCAwPT09Ynx8YiYmInN0cmluZyI9PXR5cGVvZiBiJiZ2b2lkIDA9PT1jPyhkPXRoaXMuZ2V0KGEsYiksdm9pZCAwIT09ZD9kOnRoaXMuZ2V0KGEsbi5jYW1lbENhc2UoYikpKToodGhpcy5zZXQoYSxiLGMpLHZvaWQgMCE9PWM/YzpiKX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpcy5rZXkoYSksZz10aGlzLmNhY2hlW2ZdO2lmKHZvaWQgMD09PWIpdGhpcy5jYWNoZVtmXT17fTtlbHNle24uaXNBcnJheShiKT9kPWIuY29uY2F0KGIubWFwKG4uY2FtZWxDYXNlKSk6KGU9bi5jYW1lbENhc2UoYiksYiBpbiBnP2Q9W2IsZV06KGQ9ZSxkPWQgaW4gZz9bZF06ZC5tYXRjaChFKXx8W10pKSxjPWQubGVuZ3RoO3doaWxlKGMtLSlkZWxldGUgZ1tkW2NdXX19LGhhc0RhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIW4uaXNFbXB0eU9iamVjdCh0aGlzLmNhY2hlW2FbdGhpcy5leHBhbmRvXV18fHt9KX0sZGlzY2FyZDpmdW5jdGlvbihhKXthW3RoaXMuZXhwYW5kb10mJmRlbGV0ZSB0aGlzLmNhY2hlW2FbdGhpcy5leHBhbmRvXV19fTt2YXIgTD1uZXcgSyxNPW5ldyBLLE49L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxPPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUChhLGIsYyl7dmFyIGQ7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpaWYoZD0iZGF0YS0iK2IucmVwbGFjZShPLCItJDEiKS50b0xvd2VyQ2FzZSgpLGM9YS5nZXRBdHRyaWJ1dGUoZCksInN0cmluZyI9PXR5cGVvZiBjKXt0cnl7Yz0idHJ1ZSI9PT1jPyEwOiJmYWxzZSI9PT1jPyExOiJudWxsIj09PWM/bnVsbDorYysiIj09PWM/K2M6Ti50ZXN0KGMpP24ucGFyc2VKU09OKGMpOmN9Y2F0Y2goZSl7fU0uc2V0KGEsYixjKX1lbHNlIGM9dm9pZCAwO3JldHVybiBjfW4uZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiBNLmhhc0RhdGEoYSl8fEwuaGFzRGF0YShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIE0uYWNjZXNzKGEsYixjKQorfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7TS5yZW1vdmUoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBMLmFjY2VzcyhhLGIsYyl9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7TC5yZW1vdmUoYSxiKX19KSxuLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPXRoaXNbMF0sZz1mJiZmLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09YSl7aWYodGhpcy5sZW5ndGgmJihlPU0uZ2V0KGYpLDE9PT1mLm5vZGVUeXBlJiYhTC5nZXQoZiwiaGFzRGF0YUF0dHJzIikpKXtjPWcubGVuZ3RoO3doaWxlKGMtLSlnW2NdJiYoZD1nW2NdLm5hbWUsMD09PWQuaW5kZXhPZigiZGF0YS0iKSYmKGQ9bi5jYW1lbENhc2UoZC5zbGljZSg1KSksUChmLGQsZVtkXSkpKTtMLnNldChmLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gZX1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7TS5zZXQodGhpcyxhKX0pOkoodGhpcyxmdW5jdGlvbihiKXt2YXIgYyxkPW4uY2FtZWxDYXNlKGEpO2lmKGYmJnZvaWQgMD09PWIpe2lmKGM9TS5nZXQoZixhKSx2b2lkIDAhPT1jKXJldHVybiBjO2lmKGM9TS5nZXQoZixkKSx2b2lkIDAhPT1jKXJldHVybiBjO2lmKGM9UChmLGQsdm9pZCAwKSx2b2lkIDAhPT1jKXJldHVybiBjfWVsc2UgdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9TS5nZXQodGhpcyxkKTtNLnNldCh0aGlzLGQsYiksLTEhPT1hLmluZGV4T2YoIi0iKSYmdm9pZCAwIT09YyYmTS5zZXQodGhpcyxhLGIpfSl9LG51bGwsYixhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe00ucmVtb3ZlKHRoaXMsYSl9KX19KSxuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBhPyhiPShifHwiZngiKSsicXVldWUiLGQ9TC5nZXQoYSxiKSxjJiYoIWR8fG4uaXNBcnJheShjKT9kPUwuYWNjZXNzKGEsYixuLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW4ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bi5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXtuLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gTC5nZXQoYSxjKXx8TC5hY2Nlc3MoYSxjLHtlbXB0eTpuLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtMLnJlbW92ZShhLFtiKyJxdWV1ZSIsY10pfSl9KX19KSxuLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bi5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1uLnF1ZXVlKHRoaXMsYSxiKTtuLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm4uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1uLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPUwuZ2V0KGZbZ10sYSsicXVldWVIb29rcyIpLGMmJmMuZW1wdHkmJihkKyssYy5lbXB0eS5hZGQoaCkpO3JldHVybiBoKCksZS5wcm9taXNlKGIpfX0pO3ZhciBRPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFI9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxTPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9Ynx8YSwibm9uZSI9PT1uLmNzcyhhLCJkaXNwbGF5Iil8fCFuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX0sVD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaTshZnVuY3Rpb24oKXt2YXIgYT1sLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxiPWEuYXBwZW5kQ2hpbGQobC5jcmVhdGVFbGVtZW50KCJkaXYiKSksYz1sLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Yy5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGMuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGMuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGIuYXBwZW5kQ2hpbGQoYyksay5jaGVja0Nsb25lPWIuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWV9KCk7dmFyIFU9InVuZGVmaW5lZCI7ay5mb2N1c2luQnViYmxlcz0ib25mb2N1c2luImluIGE7dmFyIFY9L15rZXkvLFc9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51KXxjbGljay8sWD0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sWT0vXihbXi5dKikoPzpcLiguKyl8KSQvO2Z1bmN0aW9uIFooKXtyZXR1cm4hMH1mdW5jdGlvbiAkKCl7cmV0dXJuITF9ZnVuY3Rpb24gXygpe3RyeXtyZXR1cm4gbC5hY3RpdmVFbGVtZW50fWNhdGNoKGEpe319bi5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG0sbyxwLHEscj1MLmdldChhKTtpZihyKXtjLmhhbmRsZXImJihmPWMsYz1mLmhhbmRsZXIsZT1mLnNlbGVjdG9yKSxjLmd1aWR8fChjLmd1aWQ9bi5ndWlkKyspLChpPXIuZXZlbnRzKXx8KGk9ci5ldmVudHM9e30pLChnPXIuaGFuZGxlKXx8KGc9ci5oYW5kbGU9ZnVuY3Rpb24oYil7cmV0dXJuIHR5cGVvZiBuIT09VSYmbi5ldmVudC50cmlnZ2VyZWQhPT1iLnR5cGU/bi5ldmVudC5kaXNwYXRjaC5hcHBseShhLGFyZ3VtZW50cyk6dm9pZCAwfSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWg9WS5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGw9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLGw9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxrPW4uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm4uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGYpLChtPWlbb10pfHwobT1pW29dPVtdLG0uZGVsZWdhdGVDb3VudD0wLGwuc2V0dXAmJmwuc2V0dXAuY2FsbChhLGQscCxnKSE9PSExfHxhLmFkZEV2ZW50TGlzdGVuZXImJmEuYWRkRXZlbnRMaXN0ZW5lcihvLGcsITEpKSxsLmFkZCYmKGwuYWRkLmNhbGwoYSxrKSxrLmhhbmRsZXIuZ3VpZHx8KGsuaGFuZGxlci5ndWlkPWMuZ3VpZCkpLGU/bS5zcGxpY2UobS5kZWxlZ2F0ZUNvdW50KyssMCxrKTptLnB1c2goayksbi5ldmVudC5nbG9iYWxbb109ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPUwuaGFzRGF0YShhKSYmTC5nZXQoYSk7aWYociYmKGk9ci5ldmVudHMpKXtiPShifHwiIikubWF0Y2goRSl8fFsiIl0saj1iLmxlbmd0aDt3aGlsZShqLS0paWYoaD1ZLmV4ZWMoYltqXSl8fFtdLG89cT1oWzFdLHA9KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxvKXtsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZD9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8byxtPWlbb118fFtdLGg9aFsyXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrcC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxnPWY9bS5sZW5ndGg7d2hpbGUoZi0tKWs9bVtmXSwhZSYmcSE9PWsub3JpZ1R5cGV8fGMmJmMuZ3VpZCE9PWsuZ3VpZHx8aCYmIWgudGVzdChrLm5hbWVzcGFjZSl8fGQmJmQhPT1rLnNlbGVjdG9yJiYoIioqIiE9PWR8fCFrLnNlbGVjdG9yKXx8KG0uc3BsaWNlKGYsMSksay5zZWxlY3RvciYmbS5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwoYSxrKSk7ZyYmIW0ubGVuZ3RoJiYobC50ZWFyZG93biYmbC50ZWFyZG93bi5jYWxsKGEscCxyLmhhbmRsZSkhPT0hMXx8bi5yZW1vdmVFdmVudChhLG8sci5oYW5kbGUpLGRlbGV0ZSBpW29dKX1lbHNlIGZvcihvIGluIGkpbi5ldmVudC5yZW1vdmUoYSxvK2Jbal0sYyxkLCEwKTtuLmlzRW1wdHlPYmplY3QoaSkmJihkZWxldGUgci5oYW5kbGUsTC5yZW1vdmUoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLG0sbyxwPVtkfHxsXSxxPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscj1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihnPWg9ZD1kfHxsLDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmIVgudGVzdChxK24uZXZlbnQudHJpZ2dlcmVkKSYmKHEuaW5kZXhPZigiLiIpPj0wJiYocj1xLnNwbGl0KCIuIikscT1yLnNoaWZ0KCksci5zb3J0KCkpLGs9cS5pbmRleE9mKCI6Iik8MCYmIm9uIitxLGI9YltuLmV4cGFuZG9dP2I6bmV3IG4uRXZlbnQocSwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXIuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Iuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm4ubWFrZUFycmF5KGMsW2JdKSxvPW4uZXZlbnQuc3BlY2lhbFtxXXx8e30sZXx8IW8udHJpZ2dlcnx8by50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhby5ub0J1YmJsZSYmIW4uaXNXaW5kb3coZCkpe2ZvcihpPW8uZGVsZWdhdGVUeXBlfHxxLFgudGVzdChpK3EpfHwoZz1nLnBhcmVudE5vZGUpO2c7Zz1nLnBhcmVudE5vZGUpcC5wdXNoKGcpLGg9ZztoPT09KGQub3duZXJEb2N1bWVudHx8bCkmJnAucHVzaChoLmRlZmF1bHRWaWV3fHxoLnBhcmVudFdpbmRvd3x8YSl9Zj0wO3doaWxlKChnPXBbZisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPWY+MT9pOm8uYmluZFR5cGV8fHEsbT0oTC5nZXQoZywiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZMLmdldChnLCJoYW5kbGUiKSxtJiZtLmFwcGx5KGcsYyksbT1rJiZnW2tdLG0mJm0uYXBwbHkmJm4uYWNjZXB0RGF0YShnKSYmKGIucmVzdWx0PW0uYXBwbHkoZyxjKSxiLnJlc3VsdD09PSExJiZiLnByZXZlbnREZWZhdWx0KCkpO3JldHVybiBiLnR5cGU9cSxlfHxiLmlzRGVmYXVsdFByZXZlbnRlZCgpfHxvLl9kZWZhdWx0JiZvLl9kZWZhdWx0LmFwcGx5KHAucG9wKCksYykhPT0hMXx8IW4uYWNjZXB0RGF0YShkKXx8ayYmbi5pc0Z1bmN0aW9uKGRbcV0pJiYhbi5pc1dpbmRvdyhkKSYmKGg9ZFtrXSxoJiYoZFtrXT1udWxsKSxuLmV2ZW50LnRyaWdnZXJlZD1xLGRbcV0oKSxuLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsaCYmKGRba109aCkpLGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1uLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShMLmdldCh0aGlzLCJldmVudHMiKXx8e30pW2EudHlwZV18fFtdLGs9bi5ldmVudC5zcGVjaWFsW2EudHlwZV18fHt9O2lmKGlbMF09YSxhLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWsucHJlRGlzcGF0Y2h8fGsucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGEpIT09ITEpe2g9bi5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsYSxqKSxiPTA7d2hpbGUoKGY9aFtiKytdKSYmIWEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7YS5jdXJyZW50VGFyZ2V0PWYuZWxlbSxjPTA7d2hpbGUoKGc9Zi5oYW5kbGVyc1tjKytdKSYmIWEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkoIWEubmFtZXNwYWNlX3JlfHxhLm5hbWVzcGFjZV9yZS50ZXN0KGcubmFtZXNwYWNlKSkmJihhLmhhbmRsZU9iaj1nLGEuZGF0YT1nLmRhdGEsZT0oKG4uZXZlbnQuc3BlY2lhbFtnLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8Zy5oYW5kbGVyKS5hcHBseShmLmVsZW0saSksdm9pZCAwIT09ZSYmKGEucmVzdWx0PWUpPT09ITEmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBrLnBvc3REaXNwYXRjaCYmay5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGEpLGEucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnPVtdLGg9Yi5kZWxlZ2F0ZUNvdW50LGk9YS50YXJnZXQ7aWYoaCYmaS5ub2RlVHlwZSYmKCFhLmJ1dHRvbnx8ImNsaWNrIiE9PWEudHlwZSkpZm9yKDtpIT09dGhpcztpPWkucGFyZW50Tm9kZXx8dGhpcylpZihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpe2ZvcihkPVtdLGM9MDtoPmM7YysrKWY9YltjXSxlPWYuc2VsZWN0b3IrIiAiLHZvaWQgMD09PWRbZV0mJihkW2VdPWYubmVlZHNDb250ZXh0P24oZSx0aGlzKS5pbmRleChpKT49MDpuLmZpbmQoZSx0aGlzLG51bGwsW2ldKS5sZW5ndGgpLGRbZV0mJmQucHVzaChmKTtkLmxlbmd0aCYmZy5wdXNoKHtlbGVtOmksaGFuZGxlcnM6ZH0pfXJldHVybiBoPGIubGVuZ3RoJiZnLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczpiLnNsaWNlKGgpfSksZ30scHJvcHM6ImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWEud2hpY2gmJihhLndoaWNoPW51bGwhPWIuY2hhckNvZGU/Yi5jaGFyQ29kZTpiLmtleUNvZGUpLGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWIuYnV0dG9uO3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihjPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGwsZD1jLmRvY3VtZW50RWxlbWVudCxlPWMuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZCYmZC5zY3JvbGxMZWZ0fHxlJiZlLnNjcm9sbExlZnR8fDApLShkJiZkLmNsaWVudExlZnR8fGUmJmUuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGQmJmQuc2Nyb2xsVG9wfHxlJiZlLnNjcm9sbFRvcHx8MCktKGQmJmQuY2xpZW50VG9wfHxlJiZlLmNsaWVudFRvcHx8MCkpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxmaXg6ZnVuY3Rpb24oYSl7aWYoYVtuLmV4cGFuZG9dKXJldHVybiBhO3ZhciBiLGMsZCxlPWEudHlwZSxmPWEsZz10aGlzLmZpeEhvb2tzW2VdO2d8fCh0aGlzLmZpeEhvb2tzW2VdPWc9Vy50ZXN0KGUpP3RoaXMubW91c2VIb29rczpWLnRlc3QoZSk/dGhpcy5rZXlIb29rczp7fSksZD1nLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KGcucHJvcHMpOnRoaXMucHJvcHMsYT1uZXcgbi5FdmVudChmKSxiPWQubGVuZ3RoO3doaWxlKGItLSljPWRbYl0sYVtjXT1mW2NdO3JldHVybiBhLnRhcmdldHx8KGEudGFyZ2V0PWwpLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGcuZmlsdGVyP2cuZmlsdGVyKGEsZik6YX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMhPT1fKCkmJnRoaXMuZm9jdXM/KHRoaXMuZm9jdXMoKSwhMSk6dm9pZCAwfSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1fKCkmJnRoaXMuYmx1cj8odGhpcy5ibHVyKCksITEpOnZvaWQgMH0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljayYmbi5ub2RlTmFtZSh0aGlzLCJpbnB1dCIpPyh0aGlzLmNsaWNrKCksITEpOnZvaWQgMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG4ubm9kZU5hbWUoYS50YXJnZXQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEucmVzdWx0JiZhLm9yaWdpbmFsRXZlbnQmJihhLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9YS5yZXN1bHQpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW4uZXh0ZW5kKG5ldyBuLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7ZD9uLmV2ZW50LnRyaWdnZXIoZSxudWxsLGIpOm4uZXZlbnQuZGlzcGF0Y2guY2FsbChiLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMucHJldmVudERlZmF1bHQoKX19LG4ucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9LG4uRXZlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIG4uRXZlbnQ/KGEmJmEudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWEuZGVmYXVsdFByZXZlbnRlZCYmYS5yZXR1cm5WYWx1ZT09PSExP1o6JCk6dGhpcy50eXBlPWEsYiYmbi5leHRlbmQodGhpcyxiKSx0aGlzLnRpbWVTdGFtcD1hJiZhLnRpbWVTdGFtcHx8bi5ub3coKSx2b2lkKHRoaXNbbi5leHBhbmRvXT0hMCkpOm5ldyBuLkV2ZW50KGEsYil9LG4uRXZlbnQucHJvdG90eXBlPXtpc0RlZmF1bHRQcmV2ZW50ZWQ6JCxpc1Byb3BhZ2F0aW9uU3RvcHBlZDokLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiQscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9WixhJiZhLnByZXZlbnREZWZhdWx0JiZhLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPVosYSYmYS5zdG9wUHJvcGFnYXRpb24mJmEuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPVosYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG4uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXtuLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFuLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLmZvY3VzaW5CdWJibGVzfHxuLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGM9ZnVuY3Rpb24oYSl7bi5ldmVudC5zaW11bGF0ZShiLGEudGFyZ2V0LG4uZXZlbnQuZml4KGEpLCEwKX07bi5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPUwuYWNjZXNzKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksTC5hY2Nlc3MoZCxiLChlfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1MLmFjY2VzcyhkLGIpLTE7ZT9MLmFjY2VzcyhkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLEwucmVtb3ZlKGQsYikpfX19KSxuLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7InN0cmluZyIhPXR5cGVvZiBiJiYoYz1jfHxiLGI9dm9pZCAwKTtmb3IoZyBpbiBhKXRoaXMub24oZyxiLGMsYVtnXSxlKTtyZXR1cm4gdGhpc31pZihudWxsPT1jJiZudWxsPT1kPyhkPWIsYz1iPXZvaWQgMCk6bnVsbD09ZCYmKCJzdHJpbmciPT10eXBlb2YgYj8oZD1jLGM9dm9pZCAwKTooZD1jLGM9YixiPXZvaWQgMCkpLGQ9PT0hMSlkPSQ7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihmPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbigpLm9mZihhKSxmLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWYuZ3VpZHx8KGYuZ3VpZD1uLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixuKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPSQpLHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQucmVtb3ZlKHRoaXMsYSxjLGIpfSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXNbMF07cmV0dXJuIGM/bi5ldmVudC50cmlnZ2VyKGEsYixjLCEwKTp2b2lkIDB9fSk7dmFyIGFiPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksYmI9LzwoW1x3Ol0rKS8sY2I9Lzx8JiM/XHcrOy8sZGI9LzwoPzpzY3JpcHR8c3R5bGV8bGluaykvaSxlYj0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxmYj0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksZ2I9L150cnVlXC8oLiopLyxoYj0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2csaWI9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtpYi5vcHRncm91cD1pYi5vcHRpb24saWIudGJvZHk9aWIudGZvb3Q9aWIuY29sZ3JvdXA9aWIuY2FwdGlvbj1pYi50aGVhZCxpYi50aD1pYi50ZDtmdW5jdGlvbiBqYihhLGIpe3JldHVybiBuLm5vZGVOYW1lKGEsInRhYmxlIikmJm4ubm9kZU5hbWUoMTEhPT1iLm5vZGVUeXBlP2I6Yi5maXJzdENoaWxkLCJ0ciIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24ga2IoYSl7cmV0dXJuIGEudHlwZT0obnVsbCE9PWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpKyIvIithLnR5cGUsYX1mdW5jdGlvbiBsYihhKXt2YXIgYj1nYi5leGVjKGEudHlwZSk7cmV0dXJuIGI/YS50eXBlPWJbMV06YS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxhfWZ1bmN0aW9uIG1iKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKUwuc2V0KGFbY10sImdsb2JhbEV2YWwiLCFifHxMLmdldChiW2NdLCJnbG9iYWxFdmFsIikpfWZ1bmN0aW9uIG5iKGEsYil7dmFyIGMsZCxlLGYsZyxoLGksajtpZigxPT09Yi5ub2RlVHlwZSl7aWYoTC5oYXNEYXRhKGEpJiYoZj1MLmFjY2VzcyhhKSxnPUwuc2V0KGIsZiksaj1mLmV2ZW50cykpe2RlbGV0ZSBnLmhhbmRsZSxnLmV2ZW50cz17fTtmb3IoZSBpbiBqKWZvcihjPTAsZD1qW2VdLmxlbmd0aDtkPmM7YysrKW4uZXZlbnQuYWRkKGIsZSxqW2VdW2NdKX1NLmhhc0RhdGEoYSkmJihoPU0uYWNjZXNzKGEpLGk9bi5leHRlbmQoe30saCksTS5zZXQoYixpKSl9fWZ1bmN0aW9uIG9iKGEsYil7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6YS5xdWVyeVNlbGVjdG9yQWxsP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOltdO3JldHVybiB2b2lkIDA9PT1ifHxiJiZuLm5vZGVOYW1lKGEsYik/bi5tZXJnZShbYV0sYyk6Y31mdW5jdGlvbiBwYihhLGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsiaW5wdXQiPT09YyYmVC50ZXN0KGEudHlwZSk/Yi5jaGVja2VkPWEuY2hlY2tlZDooImlucHV0Ij09PWN8fCJ0ZXh0YXJlYSI9PT1jKSYmKGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX1uLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jbG9uZU5vZGUoITApLGk9bi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSk7aWYoIShrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxuLmlzWE1MRG9jKGEpKSlmb3IoZz1vYihoKSxmPW9iKGEpLGQ9MCxlPWYubGVuZ3RoO2U+ZDtkKyspcGIoZltkXSxnW2RdKTtpZihiKWlmKGMpZm9yKGY9Znx8b2IoYSksZz1nfHxvYihoKSxkPTAsZT1mLmxlbmd0aDtlPmQ7ZCsrKW5iKGZbZF0sZ1tkXSk7ZWxzZSBuYihhLGgpO3JldHVybiBnPW9iKGgsInNjcmlwdCIpLGcubGVuZ3RoPjAmJm1iKGcsIWkmJm9iKGEsInNjcmlwdCIpKSxofSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGEsYixjLGQpe2Zvcih2YXIgZSxmLGcsaCxpLGosaz1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxsPVtdLG09MCxvPWEubGVuZ3RoO28+bTttKyspaWYoZT1hW21dLGV8fDA9PT1lKWlmKCJvYmplY3QiPT09bi50eXBlKGUpKW4ubWVyZ2UobCxlLm5vZGVUeXBlP1tlXTplKTtlbHNlIGlmKGNiLnRlc3QoZSkpe2Y9Znx8ay5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxnPShiYi5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGg9aWJbZ118fGliLl9kZWZhdWx0LGYuaW5uZXJIVE1MPWhbMV0rZS5yZXBsYWNlKGFiLCI8JDE+PC8kMj4iKStoWzJdLGo9aFswXTt3aGlsZShqLS0pZj1mLmxhc3RDaGlsZDtuLm1lcmdlKGwsZi5jaGlsZE5vZGVzKSxmPWsuZmlyc3RDaGlsZCxmLnRleHRDb250ZW50PSIifWVsc2UgbC5wdXNoKGIuY3JlYXRlVGV4dE5vZGUoZSkpO2sudGV4dENvbnRlbnQ9IiIsbT0wO3doaWxlKGU9bFttKytdKWlmKCghZHx8LTE9PT1uLmluQXJyYXkoZSxkKSkmJihpPW4uY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpLGY9b2Ioay5hcHBlbmRDaGlsZChlKSwic2NyaXB0IiksaSYmbWIoZiksYykpe2o9MDt3aGlsZShlPWZbaisrXSlmYi50ZXN0KGUudHlwZXx8IiIpJiZjLnB1c2goZSl9cmV0dXJuIGt9LGNsZWFuRGF0YTpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkLGUsZj1uLmV2ZW50LnNwZWNpYWwsZz0wO3ZvaWQgMCE9PShjPWFbZ10pO2crKyl7aWYobi5hY2NlcHREYXRhKGMpJiYoZT1jW0wuZXhwYW5kb10sZSYmKGI9TC5jYWNoZVtlXSkpKXtpZihiLmV2ZW50cylmb3IoZCBpbiBiLmV2ZW50cylmW2RdP24uZXZlbnQucmVtb3ZlKGMsZCk6bi5yZW1vdmVFdmVudChjLGQsYi5oYW5kbGUpO0wuY2FjaGVbZV0mJmRlbGV0ZSBMLmNhY2hlW2VdfWRlbGV0ZSBNLmNhY2hlW2NbTS5leHBhbmRvXV19fX0pLG4uZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBKKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/bi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7KDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKSYmKHRoaXMudGV4dENvbnRlbnQ9YSl9KX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPWpiKHRoaXMsYSk7Yi5hcHBlbmRDaGlsZChhKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9amIodGhpcyxhKTtiLmluc2VydEJlZm9yZShhLGIuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pfSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD1hP24uZmlsdGVyKGEsdGhpcyk6dGhpcyxlPTA7bnVsbCE9KGM9ZFtlXSk7ZSsrKWJ8fDEhPT1jLm5vZGVUeXBlfHxuLmNsZWFuRGF0YShvYihjKSksYy5wYXJlbnROb2RlJiYoYiYmbi5jb250YWlucyhjLm93bmVyRG9jdW1lbnQsYykmJm1iKG9iKGMsInNjcmlwdCIpKSxjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYykpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYSxiPTA7bnVsbCE9KGE9dGhpc1tiXSk7YisrKTE9PT1hLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEob2IoYSwhMSkpLGEudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGw9PWE/ITE6YSxiPW51bGw9PWI/YTpiLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG4uY2xvbmUodGhpcyxhLGIpfSl9LGh0bWw6ZnVuY3Rpb24oYSl7cmV0dXJuIEoodGhpcyxmdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdfHx7fSxjPTAsZD10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT1hJiYxPT09Yi5ub2RlVHlwZSlyZXR1cm4gYi5pbm5lckhUTUw7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYhZGIudGVzdChhKSYmIWliWyhiYi5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoYWIsIjwkMT48LyQyPiIpO3RyeXtmb3IoO2Q+YztjKyspYj10aGlzW2NdfHx7fSwxPT09Yi5ub2RlVHlwZSYmKG4uY2xlYW5EYXRhKG9iKGIsITEpKSxiLmlubmVySFRNTD1hKTtiPTB9Y2F0Y2goZSl7fX1iJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihiKXthPXRoaXMucGFyZW50Tm9kZSxuLmNsZWFuRGF0YShvYih0aGlzKSksYSYmYS5yZXBsYWNlQ2hpbGQoYix0aGlzKX0pLGEmJihhLmxlbmd0aHx8YS5ub2RlVHlwZSk/dGhpczp0aGlzLnJlbW92ZSgpfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGIpe2E9ZS5hcHBseShbXSxhKTt2YXIgYyxkLGYsZyxoLGksaj0wLGw9dGhpcy5sZW5ndGgsbT10aGlzLG89bC0xLHA9YVswXSxxPW4uaXNGdW5jdGlvbihwKTtpZihxfHxsPjEmJiJzdHJpbmciPT10eXBlb2YgcCYmIWsuY2hlY2tDbG9uZSYmZWIudGVzdChwKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPW0uZXEoYyk7cSYmKGFbMF09cC5jYWxsKHRoaXMsYyxkLmh0bWwoKSkpLGQuZG9tTWFuaXAoYSxiKX0pO2lmKGwmJihjPW4uYnVpbGRGcmFnbWVudChhLHRoaXNbMF0ub3duZXJEb2N1bWVudCwhMSx0aGlzKSxkPWMuZmlyc3RDaGlsZCwxPT09Yy5jaGlsZE5vZGVzLmxlbmd0aCYmKGM9ZCksZCkpe2ZvcihmPW4ubWFwKG9iKGMsInNjcmlwdCIpLGtiKSxnPWYubGVuZ3RoO2w+ajtqKyspaD1jLGohPT1vJiYoaD1uLmNsb25lKGgsITAsITApLGcmJm4ubWVyZ2UoZixvYihoLCJzY3JpcHQiKSkpLGIuY2FsbCh0aGlzW2pdLGgsaik7aWYoZylmb3IoaT1mW2YubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsbi5tYXAoZixsYiksaj0wO2c+ajtqKyspaD1mW2pdLGZiLnRlc3QoaC50eXBlfHwiIikmJiFMLmFjY2VzcyhoLCJnbG9iYWxFdmFsIikmJm4uY29udGFpbnMoaSxoKSYmKGguc3JjP24uX2V2YWxVcmwmJm4uX2V2YWxVcmwoaC5zcmMpOm4uZ2xvYmFsRXZhbChoLnRleHRDb250ZW50LnJlcGxhY2UoaGIsIiIpKSl9cmV0dXJuIHRoaXN9fSksbi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtuLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPVtdLGU9bihhKSxnPWUubGVuZ3RoLTEsaD0wO2c+PWg7aCsrKWM9aD09PWc/dGhpczp0aGlzLmNsb25lKCEwKSxuKGVbaF0pW2JdKGMpLGYuYXBwbHkoZCxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZCl9fSk7dmFyIHFiLHJiPXt9O2Z1bmN0aW9uIHNiKGIsYyl7dmFyIGQsZT1uKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTpuLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiB0YihhKXt2YXIgYj1sLGM9cmJbYV07cmV0dXJuIGN8fChjPXNiKGEsYiksIm5vbmUiIT09YyYmY3x8KHFiPShxYnx8bigiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj1xYlswXS5jb250ZW50RG9jdW1lbnQsYi53cml0ZSgpLGIuY2xvc2UoKSxjPXNiKGEsYikscWIuZGV0YWNoKCkpLHJiW2FdPWMpLGN9dmFyIHViPS9ebWFyZ2luLyx2Yj1uZXcgUmVnRXhwKCJeKCIrUSsiKSg/IXB4KVthLXolXSskIiwiaSIpLHdiPWZ1bmN0aW9uKGIpe3JldHVybiBiLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcub3BlbmVyP2Iub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6YS5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCl9O2Z1bmN0aW9uIHhiKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8d2IoYSksYyYmKGc9Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdKSxjJiYoIiIhPT1nfHxuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bi5zdHlsZShhLGIpKSx2Yi50ZXN0KGcpJiZ1Yi50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpKSx2b2lkIDAhPT1nP2crIiI6Z31mdW5jdGlvbiB5YihhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQ9bC5kb2N1bWVudEVsZW1lbnQsZT1sLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGY9bC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZihmLnN0eWxlKXtmLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsZi5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLGsuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1mLnN0eWxlLmJhY2tncm91bmRDbGlwLGUuc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7bWFyZ2luLXRvcDoxcHg7cG9zaXRpb246YWJzb2x1dGUiLGUuYXBwZW5kQ2hpbGQoZik7ZnVuY3Rpb24gZygpe2Yuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGYuaW5uZXJIVE1MPSIiLGQuYXBwZW5kQ2hpbGQoZSk7dmFyIGc9YS5nZXRDb21wdXRlZFN0eWxlKGYsbnVsbCk7Yj0iMSUiIT09Zy50b3AsYz0iNHB4Ij09PWcud2lkdGgsZC5yZW1vdmVDaGlsZChlKX1hLmdldENvbXB1dGVkU3R5bGUmJm4uZXh0ZW5kKGsse3BpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gZygpLGJ9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWMmJmcoKSxjfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGIsYz1mLmFwcGVuZENoaWxkKGwuY3JlYXRlRWxlbWVudCgiZGl2IikpO3JldHVybiBjLnN0eWxlLmNzc1RleHQ9Zi5zdHlsZS5jc3NUZXh0PSItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjAiLGMuc3R5bGUubWFyZ2luUmlnaHQ9Yy5zdHlsZS53aWR0aD0iMCIsZi5zdHlsZS53aWR0aD0iMXB4IixkLmFwcGVuZENoaWxkKGUpLGI9IXBhcnNlRmxvYXQoYS5nZXRDb21wdXRlZFN0eWxlKGMsbnVsbCkubWFyZ2luUmlnaHQpLGQucmVtb3ZlQ2hpbGQoZSksZi5yZW1vdmVDaGlsZChjKSxifX0pfX0oKSxuLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciB6Yj0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sQWI9bmV3IFJlZ0V4cCgiXigiK1ErIikoLiopJCIsImkiKSxCYj1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1ErIikiLCJpIiksQ2I9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LERiPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxFYj1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIEZiKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWJbMF0udG9VcHBlckNhc2UoKStiLnNsaWNlKDEpLGQ9YixlPUViLmxlbmd0aDt3aGlsZShlLS0paWYoYj1FYltlXStjLGIgaW4gYSlyZXR1cm4gYjtyZXR1cm4gZH1mdW5jdGlvbiBHYihhLGIsYyl7dmFyIGQ9QWIuZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMV0tKGN8fDApKSsoZFsyXXx8InB4Iik6Yn1mdW5jdGlvbiBIYihhLGIsYyxkLGUpe2Zvcih2YXIgZj1jPT09KGQ/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT1iPzE6MCxnPTA7ND5mO2YrPTIpIm1hcmdpbiI9PT1jJiYoZys9bi5jc3MoYSxjK1JbZl0sITAsZSkpLGQ/KCJjb250ZW50Ij09PWMmJihnLT1uLmNzcyhhLCJwYWRkaW5nIitSW2ZdLCEwLGUpKSwibWFyZ2luIiE9PWMmJihnLT1uLmNzcyhhLCJib3JkZXIiK1JbZl0rIldpZHRoIiwhMCxlKSkpOihnKz1uLmNzcyhhLCJwYWRkaW5nIitSW2ZdLCEwLGUpLCJwYWRkaW5nIiE9PWMmJihnKz1uLmNzcyhhLCJib3JkZXIiK1JbZl0rIldpZHRoIiwhMCxlKSkpO3JldHVybiBnfWZ1bmN0aW9uIEliKGEsYixjKXt2YXIgZD0hMCxlPSJ3aWR0aCI9PT1iP2Eub2Zmc2V0V2lkdGg6YS5vZmZzZXRIZWlnaHQsZj13YihhKSxnPSJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT14YihhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLHZiLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK0hiKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1mdW5jdGlvbiBKYihhLGIpe2Zvcih2YXIgYyxkLGUsZj1bXSxnPTAsaD1hLmxlbmd0aDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoZltnXT1MLmdldChkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlMoZCkmJihmW2ddPUwuYWNjZXNzKGQsIm9sZGRpc3BsYXkiLHRiKGQubm9kZU5hbWUpKSkpOihlPVMoZCksIm5vbmUiPT09YyYmZXx8TC5zZXQoZCwib2xkZGlzcGxheSIsZT9jOm4uY3NzKGQsImRpc3BsYXkiKSkpKTtmb3IoZz0wO2g+ZztnKyspZD1hW2ddLGQuc3R5bGUmJihiJiYibm9uZSIhPT1kLnN0eWxlLmRpc3BsYXkmJiIiIT09ZC5zdHlsZS5kaXNwbGF5fHwoZC5zdHlsZS5kaXNwbGF5PWI/ZltnXXx8IiI6Im5vbmUiKSk7cmV0dXJuIGF9bi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz14YihhLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1jPyIxIjpjfX19fSxjc3NOdW1iZXI6e2NvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOiJjc3NGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYixjLGQpe2lmKGEmJjMhPT1hLm5vZGVUeXBlJiY4IT09YS5ub2RlVHlwZSYmYS5zdHlsZSl7dmFyIGUsZixnLGg9bi5jYW1lbENhc2UoYiksaT1hLnN0eWxlO3JldHVybiBiPW4uY3NzUHJvcHNbaF18fChuLmNzc1Byb3BzW2hdPUZiKGksaCkpLGc9bi5jc3NIb29rc1tiXXx8bi5jc3NIb29rc1toXSx2b2lkIDA9PT1jP2cmJiJnZXQiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTppW2JdOihmPXR5cGVvZiBjLCJzdHJpbmciPT09ZiYmKGU9QmIuZXhlYyhjKSkmJihjPShlWzFdKzEpKmVbMl0rcGFyc2VGbG9hdChuLmNzcyhhLGIpKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiIT09Znx8bi5jc3NOdW1iZXJbaF18fChjKz0icHgiKSxrLmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1jfHwwIT09Yi5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChpW2JdPSJpbmhlcml0IiksZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpfHwoaVtiXT1jKSksdm9pZCAwKX19LGNzczpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKTtyZXR1cm4gYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1GYihhLnN0eWxlLGgpKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGMpKSx2b2lkIDA9PT1lJiYoZT14YihhLGIsZCkpLCJub3JtYWwiPT09ZSYmYiBpbiBEYiYmKGU9RGJbYl0pLCIiPT09Y3x8Yz8oZj1wYXJzZUZsb2F0KGUpLGM9PT0hMHx8bi5pc051bWVyaWMoZik/Znx8MDplKTplfX0pLG4uZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBjP3piLnRlc3Qobi5jc3MoYSwiZGlzcGxheSIpKSYmMD09PWEub2Zmc2V0V2lkdGg/bi5zd2FwKGEsQ2IsZnVuY3Rpb24oKXtyZXR1cm4gSWIoYSxiLGQpfSk6SWIoYSxiLGQpOnZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1kJiZ3YihhKTtyZXR1cm4gR2IoYSxjLGQ/SGIoYSxiLGQsImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksbi5jc3NIb29rcy5tYXJnaW5SaWdodD15YihrLnJlbGlhYmxlTWFyZ2luUmlnaHQsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9uLnN3YXAoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0seGIsW2EsIm1hcmdpblJpZ2h0Il0pOnZvaWQgMH0pLG4uZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1thK2JdPXtleHBhbmQ6ZnVuY3Rpb24oYyl7Zm9yKHZhciBkPTAsZT17fSxmPSJzdHJpbmciPT10eXBlb2YgYz9jLnNwbGl0KCIgIik6W2NdOzQ+ZDtkKyspZVthK1JbZF0rYl09ZltkXXx8ZltkLTJdfHxmWzBdO3JldHVybiBlfX0sdWIudGVzdChhKXx8KG4uY3NzSG9va3NbYStiXS5zZXQ9R2IpfSksbi5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihhLGIpe3JldHVybiBKKHRoaXMsZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj17fSxnPTA7aWYobi5pc0FycmF5KGIpKXtmb3IoZD13YihhKSxlPWIubGVuZ3RoO2U+ZztnKyspZltiW2ddXT1uLmNzcyhhLGJbZ10sITEsZCk7cmV0dXJuIGZ9cmV0dXJuIHZvaWQgMCE9PWM/bi5zdHlsZShhLGIsYyk6bi5jc3MoYSxiKX0sYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gSmIodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gSmIodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uyh0aGlzKT9uKHRoaXMpLnNob3coKTpuKHRoaXMpLmhpZGUoKX0pfX0pO2Z1bmN0aW9uIEtiKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBLYi5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfW4uVHdlZW49S2IsS2IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpLYixpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPUtiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpLYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1LYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9Yj10aGlzLm9wdGlvbnMuZHVyYXRpb24/bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTpLYi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxLYi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9S2IucHJvdG90eXBlLEtiLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbnVsbD09YS5lbGVtW2EucHJvcF18fGEuZWxlbS5zdHlsZSYmbnVsbCE9YS5lbGVtLnN0eWxlW2EucHJvcF0/KGI9bi5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApOmEuZWxlbVthLnByb3BdfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6YS5lbGVtLnN0eWxlJiYobnVsbCE9YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV18fG4uY3NzSG9va3NbYS5wcm9wXSk/bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCk6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0sS2IucHJvcEhvb2tzLnNjcm9sbFRvcD1LYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9fSxuLmZ4PUtiLnByb3RvdHlwZS5pbml0LG4uZnguc3RlcD17fTt2YXIgTGIsTWIsTmI9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLE9iPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitRKyIpKFthLXolXSopJCIsImkiKSxQYj0vcXVldWVIb29rcyQvLFFiPVtWYl0sUmI9eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNyZWF0ZVR3ZWVuKGEsYiksZD1jLmN1cigpLGU9T2IuZXhlYyhiKSxmPWUmJmVbM118fChuLmNzc051bWJlclthXT8iIjoicHgiKSxnPShuLmNzc051bWJlclthXXx8InB4IiE9PWYmJitkKSYmT2IuZXhlYyhuLmNzcyhjLmVsZW0sYSkpLGg9MSxpPTIwO2lmKGcmJmdbM10hPT1mKXtmPWZ8fGdbM10sZT1lfHxbXSxnPStkfHwxO2RvIGg9aHx8Ii41IixnLz1oLG4uc3R5bGUoYy5lbGVtLGEsZytmKTt3aGlsZShoIT09KGg9Yy5jdXIoKS9kKSYmMSE9PWgmJi0taSl9cmV0dXJuIGUmJihnPWMuc3RhcnQ9K2d8fCtkfHwwLGMudW5pdD1mLGMuZW5kPWVbMV0/ZysoZVsxXSsxKSplWzJdOitlWzJdKSxjfV19O2Z1bmN0aW9uIFNiKCl7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtMYj12b2lkIDB9KSxMYj1uLm5vdygpfWZ1bmN0aW9uIFRiKGEsYil7dmFyIGMsZD0wLGU9e2hlaWdodDphfTtmb3IoYj1iPzE6MDs0PmQ7ZCs9Mi1iKWM9UltkXSxlWyJtYXJnaW4iK2NdPWVbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihlLm9wYWNpdHk9ZS53aWR0aD1hKSxlfWZ1bmN0aW9uIFViKGEsYixjKXtmb3IodmFyIGQsZT0oUmJbYl18fFtdKS5jb25jYXQoUmJbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gVmIoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbD10aGlzLG09e30sbz1hLnN0eWxlLHA9YS5ub2RlVHlwZSYmUyhhKSxxPUwuZ2V0KGEsImZ4c2hvdyIpO2MucXVldWV8fChoPW4uX3F1ZXVlSG9va3MoYSwiZngiKSxudWxsPT1oLnVucXVldWVkJiYoaC51bnF1ZXVlZD0wLGk9aC5lbXB0eS5maXJlLGguZW1wdHkuZmlyZT1mdW5jdGlvbigpe2gudW5xdWV1ZWR8fGkoKX0pLGgudW5xdWV1ZWQrKyxsLmFsd2F5cyhmdW5jdGlvbigpe2wuYWx3YXlzKGZ1bmN0aW9uKCl7aC51bnF1ZXVlZC0tLG4ucXVldWUoYSwiZngiKS5sZW5ndGh8fGguZW1wdHkuZmlyZSgpfSl9KSksMT09PWEubm9kZVR5cGUmJigiaGVpZ2h0ImluIGJ8fCJ3aWR0aCJpbiBiKSYmKGMub3ZlcmZsb3c9W28ub3ZlcmZsb3csby5vdmVyZmxvd1gsby5vdmVyZmxvd1ldLGo9bi5jc3MoYSwiZGlzcGxheSIpLGs9Im5vbmUiPT09aj9MLmdldChhLCJvbGRkaXNwbGF5Iil8fHRiKGEubm9kZU5hbWUpOmosImlubGluZSI9PT1rJiYibm9uZSI9PT1uLmNzcyhhLCJmbG9hdCIpJiYoby5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksYy5vdmVyZmxvdyYmKG8ub3ZlcmZsb3c9ImhpZGRlbiIsbC5hbHdheXMoZnVuY3Rpb24oKXtvLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0sby5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxvLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLE5iLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocD8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXF8fHZvaWQgMD09PXFbZF0pY29udGludWU7cD0hMH1tW2RdPXEmJnFbZF18fG4uc3R5bGUoYSxkKX1lbHNlIGo9dm9pZCAwO2lmKG4uaXNFbXB0eU9iamVjdChtKSkiaW5saW5lIj09PSgibm9uZSI9PT1qP3RiKGEubm9kZU5hbWUpOmopJiYoby5kaXNwbGF5PWopO2Vsc2V7cT8iaGlkZGVuImluIHEmJihwPXEuaGlkZGVuKTpxPUwuYWNjZXNzKGEsImZ4c2hvdyIse30pLGYmJihxLmhpZGRlbj0hcCkscD9uKGEpLnNob3coKTpsLmRvbmUoZnVuY3Rpb24oKXtuKGEpLmhpZGUoKX0pLGwuZG9uZShmdW5jdGlvbigpe3ZhciBiO0wucmVtb3ZlKGEsImZ4c2hvdyIpO2ZvcihiIGluIG0pbi5zdHlsZShhLGIsbVtiXSl9KTtmb3IoZCBpbiBtKWc9VWIocD9xW2RdOjAsZCxsKSxkIGluIHF8fChxW2RdPWcuc3RhcnQscCYmKGcuZW5kPWcuc3RhcnQsZy5zdGFydD0id2lkdGgiPT09ZHx8ImhlaWdodCI9PT1kPzE6MCkpfX1mdW5jdGlvbiBXYihhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPW4uY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sbi5pc0FycmF5KGYpJiYoZT1mWzFdLGY9YVtjXT1mWzBdKSxjIT09ZCYmKGFbZF09ZixkZWxldGUgYVtjXSksZz1uLmNzc0hvb2tzW2RdLGcmJiJleHBhbmQiaW4gZyl7Zj1nLmV4cGFuZChmKSxkZWxldGUgYVtkXTtmb3IoYyBpbiBmKWMgaW4gYXx8KGFbY109ZltjXSxiW2NdPWUpfWVsc2UgYltkXT1lfWZ1bmN0aW9uIFhiKGEsYixjKXt2YXIgZCxlLGY9MCxnPVFiLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPUxifHxTYigpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxjKSxvcmlnaW5hbFByb3BlcnRpZXM6YixvcmlnaW5hbE9wdGlvbnM6YyxzdGFydFRpbWU6TGJ8fFNiKCksZHVyYXRpb246Yy5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oYixjKXt2YXIgZD1uLlR3ZWVuKGEsai5vcHRzLGIsYyxqLm9wdHMuc3BlY2lhbEVhc2luZ1tiXXx8ai5vcHRzLmVhc2luZyk7cmV0dXJuIGoudHdlZW5zLnB1c2goZCksZH0sc3RvcDpmdW5jdGlvbihiKXt2YXIgYz0wLGQ9Yj9qLnR3ZWVucy5sZW5ndGg6MDtpZihlKXJldHVybiB0aGlzO2ZvcihlPSEwO2Q+YztjKyspai50d2VlbnNbY10ucnVuKDEpO3JldHVybiBiP2gucmVzb2x2ZVdpdGgoYSxbaixiXSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihXYihrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9UWJbZl0uY2FsbChqLGEsayxqLm9wdHMpKXJldHVybiBkO3JldHVybiBuLm1hcChrLFViLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQoWGIse3R3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEuc3BsaXQoIiAiKTtmb3IodmFyIGMsZD0wLGU9YS5sZW5ndGg7ZT5kO2QrKyljPWFbZF0sUmJbY109UmJbY118fFtdLFJiW2NdLnVuc2hpZnQoYil9LHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/UWIudW5zaGlmdChhKTpRYi5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PWQucXVldWV8fGQucXVldWU9PT0hMCkmJihkLnF1ZXVlPSJmeCIpLGQub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbigpe24uaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZSYmbi5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSl9LGR9LG4uZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKFMpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW4uaXNFbXB0eU9iamVjdChhKSxmPW4uc3BlZWQoYixjLGQpLGc9ZnVuY3Rpb24oKXt2YXIgYj1YYih0aGlzLG4uZXh0ZW5kKHt9LGEpLGYpOyhlfHxMLmdldCh0aGlzLCJmaW5pc2giKSkmJmIuc3RvcCghMCl9O3JldHVybiBnLmZpbmlzaD1nLGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGMpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihjPWIsYj1hLGE9dm9pZCAwKSxiJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ITAsZT1udWxsIT1hJiZhKyJxdWV1ZUhvb2tzIixmPW4udGltZXJzLGc9TC5nZXQodGhpcyk7aWYoZSlnW2VdJiZnW2VdLnN0b3AmJmQoZ1tlXSk7ZWxzZSBmb3IoZSBpbiBnKWdbZV0mJmdbZV0uc3RvcCYmUGIudGVzdChlKSYmZChnW2VdKTtmb3IoZT1mLmxlbmd0aDtlLS07KWZbZV0uZWxlbSE9PXRoaXN8fG51bGwhPWEmJmZbZV0ucXVldWUhPT1hfHwoZltlXS5hbmltLnN0b3AoYyksYj0hMSxmLnNwbGljZShlLDEpKTsoYnx8IWMpJiZuLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1MLmdldCh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9bi50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLG4ucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2c+YjtiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksbi5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPW4uZm5bYl07bi5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKFRiKGIsITApLGEsZCxlKX19KSxuLmVhY2goe3NsaWRlRG93bjpUYigic2hvdyIpLHNsaWRlVXA6VGIoImhpZGUiKSxzbGlkZVRvZ2dsZTpUYigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksbi50aW1lcnM9W10sbi5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj0wLGM9bi50aW1lcnM7Zm9yKExiPW4ubm93KCk7YjxjLmxlbmd0aDtiKyspYT1jW2JdLGEoKXx8Y1tiXSE9PWF8fGMuc3BsaWNlKGItLSwxKTtjLmxlbmd0aHx8bi5meC5zdG9wKCksTGI9dm9pZCAwfSxuLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe24udGltZXJzLnB1c2goYSksYSgpP24uZnguc3RhcnQoKTpuLnRpbWVycy5wb3AoKX0sbi5meC5pbnRlcnZhbD0xMyxuLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7TWJ8fChNYj1zZXRJbnRlcnZhbChuLmZ4LnRpY2ssbi5meC5pbnRlcnZhbCkpfSxuLmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKE1iKSxNYj1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bi5meD9uLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4Iix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxmdW5jdGlvbigpe3ZhciBhPWwuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPWwuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksYz1iLmFwcGVuZENoaWxkKGwuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO2EudHlwZT0iY2hlY2tib3giLGsuY2hlY2tPbj0iIiE9PWEudmFsdWUsay5vcHRTZWxlY3RlZD1jLnNlbGVjdGVkLGIuZGlzYWJsZWQ9ITAsay5vcHREaXNhYmxlZD0hYy5kaXNhYmxlZCxhPWwuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnZhbHVlPSJ0IixhLnR5cGU9InJhZGlvIixrLnJhZGlvVmFsdWU9InQiPT09YS52YWx1ZX0oKTt2YXIgWWIsWmIsJGI9bi5leHByLmF0dHJIYW5kbGU7bi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSih0aGlzLG4uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09VT9uLnByb3AoYSxiLGMpOigxPT09ZiYmbi5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bi5hdHRySG9va3NbYl18fChuLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP1piOlliKSksdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBuLnJlbW92ZUF0dHIoYSxiKSkKK30scmVtb3ZlQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT0wLGY9YiYmYi5tYXRjaChFKTtpZihmJiYxPT09YS5ub2RlVHlwZSl3aGlsZShjPWZbZSsrXSlkPW4ucHJvcEZpeFtjXXx8YyxuLmV4cHIubWF0Y2guYm9vbC50ZXN0KGMpJiYoYVtkXT0hMSksYS5yZW1vdmVBdHRyaWJ1dGUoYyl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWsucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJm4ubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksWmI9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9uLnJlbW92ZUF0dHIoYSxjKTphLnNldEF0dHJpYnV0ZShjLGMpLGN9fSxuLmVhY2gobi5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oYSxiKXt2YXIgYz0kYltiXXx8bi5maW5kLmF0dHI7JGJbYl09ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGY7cmV0dXJuIGR8fChmPSRiW2JdLCRiW2JdPWUsZT1udWxsIT1jKGEsYixkKT9iLnRvTG93ZXJDYXNlKCk6bnVsbCwkYltiXT1mKSxlfX0pO3ZhciBfYj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pO24uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoodGhpcyxuLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW24ucHJvcEZpeFthXXx8YV19KX19KSxuLmV4dGVuZCh7cHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW4uaXNYTUxEb2MoYSksZiYmKGI9bi5wcm9wRml4W2JdfHxiLGU9bi5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJiJnZXQiaW4gZSYmbnVsbCE9PShkPWUuZ2V0KGEsYikpP2Q6YVtiXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8X2IudGVzdChhLm5vZGVOYW1lKXx8YS5ocmVmP2EudGFiSW5kZXg6LTF9fX19KSxrLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJmIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH19KSxuLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe24ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KTt2YXIgYWM9L1tcdFxyXG5cZl0vZztuLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9InN0cmluZyI9PXR5cGVvZiBhJiZhLGk9MCxqPXRoaXMubGVuZ3RoO2lmKG4uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoaClmb3IoYj0oYXx8IiIpLm1hdGNoKEUpfHxbXTtqPmk7aSsrKWlmKGM9dGhpc1tpXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoYWMsIiAiKToiICIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKCIgIitlKyIgIik8MCYmKGQrPWUrIiAiKTtnPW4udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYSxpPTAsaj10aGlzLmxlbmd0aDtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGgpZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aj5pO2krKylpZihjPXRoaXNbaV0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKGFjLCIgIik6IiIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKCIgIitlKyIgIik+PTApZD1kLnJlcGxhY2UoIiAiK2UrIiAiLCIgIik7Zz1hP24udHJpbShkKToiIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6dGhpcy5lYWNoKG4uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihjKXtuKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9OmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1jKXt2YXIgYixkPTAsZT1uKHRoaXMpLGY9YS5tYXRjaChFKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09VXx8ImJvb2xlYW4iPT09YykmJih0aGlzLmNsYXNzTmFtZSYmTC5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6TC5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIil9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIgIithKyIgIixjPTAsZD10aGlzLmxlbmd0aDtkPmM7YysrKWlmKDE9PT10aGlzW2NdLm5vZGVUeXBlJiYoIiAiK3RoaXNbY10uY2xhc3NOYW1lKyIgIikucmVwbGFjZShhYywiICIpLmluZGV4T2YoYik+PTApcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIGJjPS9cci9nO24uZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD1uLmlzRnVuY3Rpb24oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlOzE9PT10aGlzLm5vZGVUeXBlJiYoZT1kP2EuY2FsbCh0aGlzLGMsbih0aGlzKS52YWwoKSk6YSxudWxsPT1lP2U9IiI6Im51bWJlciI9PXR5cGVvZiBlP2UrPSIiOm4uaXNBcnJheShlKSYmKGU9bi5tYXAoZSxmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjphKyIifSkpLGI9bi52YWxIb29rc1t0aGlzLnR5cGVdfHxuLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmInNldCJpbiBiJiZ2b2lkIDAhPT1iLnNldCh0aGlzLGUsInZhbHVlIil8fCh0aGlzLnZhbHVlPWUpKX0pO2lmKGUpcmV0dXJuIGI9bi52YWxIb29rc1tlLnR5cGVdfHxuLnZhbEhvb2tzW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmImdldCJpbiBiJiZ2b2lkIDAhPT0oYz1iLmdldChlLCJ2YWx1ZSIpKT9jOihjPWUudmFsdWUsInN0cmluZyI9PXR5cGVvZiBjP2MucmVwbGFjZShiYywiIik6bnVsbD09Yz8iIjpjKX19fSksbi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1uLmZpbmQuYXR0cihhLCJ2YWx1ZSIpO3JldHVybiBudWxsIT1iP2I6bi50cmltKG4udGV4dChhKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkPWEub3B0aW9ucyxlPWEuc2VsZWN0ZWRJbmRleCxmPSJzZWxlY3Qtb25lIj09PWEudHlwZXx8MD5lLGc9Zj9udWxsOltdLGg9Zj9lKzE6ZC5sZW5ndGgsaT0wPmU/aDpmP2U6MDtoPmk7aSsrKWlmKGM9ZFtpXSwhKCFjLnNlbGVjdGVkJiZpIT09ZXx8KGsub3B0RGlzYWJsZWQ/Yy5kaXNhYmxlZDpudWxsIT09Yy5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpfHxjLnBhcmVudE5vZGUuZGlzYWJsZWQmJm4ubm9kZU5hbWUoYy5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoYj1uKGMpLnZhbCgpLGYpcmV0dXJuIGI7Zy5wdXNoKGIpfXJldHVybiBnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5vcHRpb25zLGY9bi5tYWtlQXJyYXkoYiksZz1lLmxlbmd0aDt3aGlsZShnLS0pZD1lW2ddLChkLnNlbGVjdGVkPW4uaW5BcnJheShkLnZhbHVlLGYpPj0wKSYmKGM9ITApO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxmfX19fSksbi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bi52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uaXNBcnJheShiKT9hLmNoZWNrZWQ9bi5pbkFycmF5KG4oYSkudmFsKCksYik+PTA6dm9pZCAwfX0say5jaGVja09ufHwobi52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pLG4uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe24uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG4uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9fSk7dmFyIGNjPW4ubm93KCksZGM9L1w/LztuLnBhcnNlSlNPTj1mdW5jdGlvbihhKXtyZXR1cm4gSlNPTi5wYXJzZShhKyIiKX0sbi5wYXJzZVhNTD1mdW5jdGlvbihhKXt2YXIgYixjO2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7dHJ5e2M9bmV3IERPTVBhcnNlcixiPWMucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2goZCl7Yj12b2lkIDB9cmV0dXJuKCFifHxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aCkmJm4uZXJyb3IoIkludmFsaWQgWE1MOiAiK2EpLGJ9O3ZhciBlYz0vIy4qJC8sZmM9LyhbPyZdKV89W14mXSovLGdjPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20saGM9L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8saWM9L14oPzpHRVR8SEVBRCkkLyxqYz0vXlwvXC8vLGtjPS9eKFtcdy4rLV0rOikoPzpcL1wvKD86W15cLz8jXSpAfCkoW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLGxjPXt9LG1jPXt9LG5jPSIqLyIuY29uY2F0KCIqIiksb2M9YS5sb2NhdGlvbi5ocmVmLHBjPWtjLmV4ZWMob2MudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIHFjKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZFswXT8oZD1kLnNsaWNlKDEpfHwiKiIsKGFbZF09YVtkXXx8W10pLnVuc2hpZnQoYykpOihhW2RdPWFbZF18fFtdKS5wdXNoKGMpfX1mdW5jdGlvbiByYyhhLGIsYyxkKXt2YXIgZT17fSxmPWE9PT1tYztmdW5jdGlvbiBnKGgpe3ZhciBpO3JldHVybiBlW2hdPSEwLG4uZWFjaChhW2hdfHxbXSxmdW5jdGlvbihhLGgpe3ZhciBqPWgoYixjLGQpO3JldHVybiJzdHJpbmciIT10eXBlb2Yganx8Znx8ZVtqXT9mPyEoaT1qKTp2b2lkIDA6KGIuZGF0YVR5cGVzLnVuc2hpZnQoaiksZyhqKSwhMSl9KSxpfXJldHVybiBnKGIuZGF0YVR5cGVzWzBdKXx8IWVbIioiXSYmZygiKiIpfWZ1bmN0aW9uIHNjKGEsYil7dmFyIGMsZCxlPW4uYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoYyBpbiBiKXZvaWQgMCE9PWJbY10mJigoZVtjXT9hOmR8fChkPXt9KSlbY109YltjXSk7cmV0dXJuIGQmJm4uZXh0ZW5kKCEwLGEsZCksYX1mdW5jdGlvbiB0YyhhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLmNvbnRlbnRzLGk9YS5kYXRhVHlwZXM7d2hpbGUoIioiPT09aVswXSlpLnNoaWZ0KCksdm9pZCAwPT09ZCYmKGQ9YS5taW1lVHlwZXx8Yi5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKGQpZm9yKGUgaW4gaClpZihoW2VdJiZoW2VdLnRlc3QoZCkpe2kudW5zaGlmdChlKTticmVha31pZihpWzBdaW4gYylmPWlbMF07ZWxzZXtmb3IoZSBpbiBjKXtpZighaVswXXx8YS5jb252ZXJ0ZXJzW2UrIiAiK2lbMF1dKXtmPWU7YnJlYWt9Z3x8KGc9ZSl9Zj1mfHxnfXJldHVybiBmPyhmIT09aVswXSYmaS51bnNoaWZ0KGYpLGNbZl0pOnZvaWQgMH1mdW5jdGlvbiB1YyhhLGIsYyxkKXt2YXIgZSxmLGcsaCxpLGo9e30saz1hLmRhdGFUeXBlcy5zbGljZSgpO2lmKGtbMV0pZm9yKGcgaW4gYS5jb252ZXJ0ZXJzKWpbZy50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbZ107Zj1rLnNoaWZ0KCk7d2hpbGUoZilpZihhLnJlc3BvbnNlRmllbGRzW2ZdJiYoY1thLnJlc3BvbnNlRmllbGRzW2ZdXT1iKSwhaSYmZCYmYS5kYXRhRmlsdGVyJiYoYj1hLmRhdGFGaWx0ZXIoYixhLmRhdGFUeXBlKSksaT1mLGY9ay5zaGlmdCgpKWlmKCIqIj09PWYpZj1pO2Vsc2UgaWYoIioiIT09aSYmaSE9PWYpe2lmKGc9altpKyIgIitmXXx8alsiKiAiK2ZdLCFnKWZvcihlIGluIGopaWYoaD1lLnNwbGl0KCIgIiksaFsxXT09PWYmJihnPWpbaSsiICIraFswXV18fGpbIiogIitoWzBdXSkpe2c9PT0hMD9nPWpbZV06altlXSE9PSEwJiYoZj1oWzBdLGsudW5zaGlmdChoWzFdKSk7YnJlYWt9aWYoZyE9PSEwKWlmKGcmJmFbInRocm93cyJdKWI9ZyhiKTtlbHNlIHRyeXtiPWcoYil9Y2F0Y2gobCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6Zz9sOiJObyBjb252ZXJzaW9uIGZyb20gIitpKyIgdG8gIitmfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOmJ9fW4uZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpvYyx0eXBlOiJHRVQiLGlzTG9jYWw6aGMudGVzdChwY1sxXSksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpuYyx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOm4ucGFyc2VKU09OLCJ0ZXh0IHhtbCI6bi5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/c2Moc2MoYSxuLmFqYXhTZXR0aW5ncyksYik6c2Mobi5hamF4U2V0dGluZ3MsYSl9LGFqYXhQcmVmaWx0ZXI6cWMobGMpLGFqYXhUcmFuc3BvcnQ6cWMobWMpLGFqYXg6ZnVuY3Rpb24oYSxiKXsib2JqZWN0Ij09dHlwZW9mIGEmJihiPWEsYT12b2lkIDApLGI9Ynx8e307dmFyIGMsZCxlLGYsZyxoLGksaixrPW4uYWpheFNldHVwKHt9LGIpLGw9ay5jb250ZXh0fHxrLG09ay5jb250ZXh0JiYobC5ub2RlVHlwZXx8bC5qcXVlcnkpP24obCk6bi5ldmVudCxvPW4uRGVmZXJyZWQoKSxwPW4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHE9ay5zdGF0dXNDb2RlfHx7fSxyPXt9LHM9e30sdD0wLHU9ImNhbmNlbGVkIix2PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoMj09PXQpe2lmKCFmKXtmPXt9O3doaWxlKGI9Z2MuZXhlYyhlKSlmW2JbMV0udG9Mb3dlckNhc2UoKV09YlsyXX1iPWZbYS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09Yj9udWxsOmJ9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09dD9lOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHR8fChhPXNbY109c1tjXXx8YSxyW2FdPWIpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHR8fChrLm1pbWVUeXBlPWEpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoYSlpZigyPnQpZm9yKGIgaW4gYSlxW2JdPVtxW2JdLGFbYl1dO2Vsc2Ugdi5hbHdheXMoYVt2LnN0YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihhKXt2YXIgYj1hfHx1O3JldHVybiBjJiZjLmFib3J0KGIpLHgoMCxiKSx0aGlzfX07aWYoby5wcm9taXNlKHYpLmNvbXBsZXRlPXAuYWRkLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsay51cmw9KChhfHxrLnVybHx8b2MpKyIiKS5yZXBsYWNlKGVjLCIiKS5yZXBsYWNlKGpjLHBjWzFdKyIvLyIpLGsudHlwZT1iLm1ldGhvZHx8Yi50eXBlfHxrLm1ldGhvZHx8ay50eXBlLGsuZGF0YVR5cGVzPW4udHJpbShrLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goRSl8fFsiIl0sbnVsbD09ay5jcm9zc0RvbWFpbiYmKGg9a2MuZXhlYyhrLnVybC50b0xvd2VyQ2FzZSgpKSxrLmNyb3NzRG9tYWluPSEoIWh8fGhbMV09PT1wY1sxXSYmaFsyXT09PXBjWzJdJiYoaFszXXx8KCJodHRwOiI9PT1oWzFdPyI4MCI6IjQ0MyIpKT09PShwY1szXXx8KCJodHRwOiI9PT1wY1sxXT8iODAiOiI0NDMiKSkpKSxrLmRhdGEmJmsucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygay5kYXRhJiYoay5kYXRhPW4ucGFyYW0oay5kYXRhLGsudHJhZGl0aW9uYWwpKSxyYyhsYyxrLGIsdiksMj09PXQpcmV0dXJuIHY7aT1uLmV2ZW50JiZrLmdsb2JhbCxpJiYwPT09bi5hY3RpdmUrKyYmbi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxrLnR5cGU9ay50eXBlLnRvVXBwZXJDYXNlKCksay5oYXNDb250ZW50PSFpYy50ZXN0KGsudHlwZSksZD1rLnVybCxrLmhhc0NvbnRlbnR8fChrLmRhdGEmJihkPWsudXJsKz0oZGMudGVzdChkKT8iJiI6Ij8iKStrLmRhdGEsZGVsZXRlIGsuZGF0YSksay5jYWNoZT09PSExJiYoay51cmw9ZmMudGVzdChkKT9kLnJlcGxhY2UoZmMsIiQxXz0iK2NjKyspOmQrKGRjLnRlc3QoZCk/IiYiOiI/IikrIl89IitjYysrKSksay5pZk1vZGlmaWVkJiYobi5sYXN0TW9kaWZpZWRbZF0mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLG4ubGFzdE1vZGlmaWVkW2RdKSxuLmV0YWdbZF0mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsbi5ldGFnW2RdKSksKGsuZGF0YSYmay5oYXNDb250ZW50JiZrLmNvbnRlbnRUeXBlIT09ITF8fGIuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsay5jb250ZW50VHlwZSksdi5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGsuZGF0YVR5cGVzWzBdJiZrLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dP2suYWNjZXB0c1trLmRhdGFUeXBlc1swXV0rKCIqIiE9PWsuZGF0YVR5cGVzWzBdPyIsICIrbmMrIjsgcT0wLjAxIjoiIik6ay5hY2NlcHRzWyIqIl0pO2ZvcihqIGluIGsuaGVhZGVycyl2LnNldFJlcXVlc3RIZWFkZXIoaixrLmhlYWRlcnNbal0pO2lmKGsuYmVmb3JlU2VuZCYmKGsuYmVmb3JlU2VuZC5jYWxsKGwsdixrKT09PSExfHwyPT09dCkpcmV0dXJuIHYuYWJvcnQoKTt1PSJhYm9ydCI7Zm9yKGogaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pdltqXShrW2pdKTtpZihjPXJjKG1jLGssYix2KSl7di5yZWFkeVN0YXRlPTEsaSYmbS50cmlnZ2VyKCJhamF4U2VuZCIsW3Ysa10pLGsuYXN5bmMmJmsudGltZW91dD4wJiYoZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7di5hYm9ydCgidGltZW91dCIpfSxrLnRpbWVvdXQpKTt0cnl7dD0xLGMuc2VuZChyLHgpfWNhdGNoKHcpe2lmKCEoMj50KSl0aHJvdyB3O3goLTEsdyl9fWVsc2UgeCgtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24geChhLGIsZixoKXt2YXIgaixyLHMsdSx3LHg9YjsyIT09dCYmKHQ9MixnJiZjbGVhclRpbWVvdXQoZyksYz12b2lkIDAsZT1ofHwiIix2LnJlYWR5U3RhdGU9YT4wPzQ6MCxqPWE+PTIwMCYmMzAwPmF8fDMwND09PWEsZiYmKHU9dGMoayx2LGYpKSx1PXVjKGssdSx2LGopLGo/KGsuaWZNb2RpZmllZCYmKHc9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJihuLmxhc3RNb2RpZmllZFtkXT13KSx3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYobi5ldGFnW2RdPXcpKSwyMDQ9PT1hfHwiSEVBRCI9PT1rLnR5cGU/eD0ibm9jb250ZW50IjozMDQ9PT1hP3g9Im5vdG1vZGlmaWVkIjooeD11LnN0YXRlLHI9dS5kYXRhLHM9dS5lcnJvcixqPSFzKSk6KHM9eCwoYXx8IXgpJiYoeD0iZXJyb3IiLDA+YSYmKGE9MCkpKSx2LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0oYnx8eCkrIiIsaj9vLnJlc29sdmVXaXRoKGwsW3IseCx2XSk6by5yZWplY3RXaXRoKGwsW3YseCxzXSksdi5zdGF0dXNDb2RlKHEpLHE9dm9pZCAwLGkmJm0udHJpZ2dlcihqPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW3YsayxqP3I6c10pLHAuZmlyZVdpdGgobCxbdix4XSksaSYmKG0udHJpZ2dlcigiYWpheENvbXBsZXRlIixbdixrXSksLS1uLmFjdGl2ZXx8bi5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIHZ9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmdldChhLGIsYywianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5nZXQoYSx2b2lkIDAsYiwic2NyaXB0Iil9fSksbi5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGEsYil7bltiXT1mdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gbi5pc0Z1bmN0aW9uKGMpJiYoZT1lfHxkLGQ9YyxjPXZvaWQgMCksbi5hamF4KHt1cmw6YSx0eXBlOmIsZGF0YVR5cGU6ZSxkYXRhOmMsc3VjY2VzczpkfSl9fSksbi5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gbi5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxuLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk6KHRoaXNbMF0mJihiPW4oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0RWxlbWVudENoaWxkKWE9YS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKSksdGhpcyl9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG4uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXtuKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1uLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG4odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG4uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB9LG4uZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIW4uZXhwci5maWx0ZXJzLmhpZGRlbihhKX07dmFyIHZjPS8lMjAvZyx3Yz0vXFtcXSQvLHhjPS9ccj9cbi9nLHljPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSx6Yz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gQWMoYSxiLGMsZCl7dmFyIGU7aWYobi5pc0FycmF5KGIpKW4uZWFjaChiLGZ1bmN0aW9uKGIsZSl7Y3x8d2MudGVzdChhKT9kKGEsZSk6QWMoYSsiWyIrKCJvYmplY3QiPT10eXBlb2YgZT9iOiIiKSsiXSIsZSxjLGQpfSk7ZWxzZSBpZihjfHwib2JqZWN0IiE9PW4udHlwZShiKSlkKGEsYik7ZWxzZSBmb3IoZSBpbiBiKUFjKGErIlsiK2UrIl0iLGJbZV0sYyxkKX1uLnBhcmFtPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1uLmlzRnVuY3Rpb24oYik/YigpOm51bGw9PWI/IiI6YixkW2QubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoYSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiKX07aWYodm9pZCAwPT09YiYmKGI9bi5hamF4U2V0dGluZ3MmJm4uYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxuLmlzQXJyYXkoYSl8fGEuanF1ZXJ5JiYhbi5pc1BsYWluT2JqZWN0KGEpKW4uZWFjaChhLGZ1bmN0aW9uKCl7ZSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihjIGluIGEpQWMoYyxhW2NdLGIsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UodmMsIisiKX0sbi5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBuLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9bi5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGE/bi5tYWtlQXJyYXkoYSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBhPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhbih0aGlzKS5pcygiOmRpc2FibGVkIikmJnpjLnRlc3QodGhpcy5ub2RlTmFtZSkmJiF5Yy50ZXN0KGEpJiYodGhpcy5jaGVja2VkfHwhVC50ZXN0KGEpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPW4odGhpcykudmFsKCk7cmV0dXJuIG51bGw9PWM/bnVsbDpuLmlzQXJyYXkoYyk/bi5tYXAoYyxmdW5jdGlvbihhKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKHhjLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZSh4YywiXHJcbiIpfX0pLmdldCgpfX0pLG4uYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fWNhdGNoKGEpe319O3ZhciBCYz0wLENjPXt9LERjPXswOjIwMCwxMjIzOjIwNH0sRWM9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIENjKUNjW2FdKCl9KSxrLmNvcnM9ISFFYyYmIndpdGhDcmVkZW50aWFscyJpbiBFYyxrLmFqYXg9RWM9ISFFYyxuLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIGsuY29yc3x8RWMmJiFhLmNyb3NzRG9tYWluP3tzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytCYztpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKWYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0pO2I9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7YiYmKGRlbGV0ZSBDY1tnXSxiPWYub25sb2FkPWYub25lcnJvcj1udWxsLCJhYm9ydCI9PT1hP2YuYWJvcnQoKToiZXJyb3IiPT09YT9kKGYuc3RhdHVzLGYuc3RhdHVzVGV4dCk6ZChEY1tmLnN0YXR1c118fGYuc3RhdHVzLGYuc3RhdHVzVGV4dCwic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0P3t0ZXh0OmYucmVzcG9uc2VUZXh0fTp2b2lkIDAsZi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sZi5vbmxvYWQ9YigpLGYub25lcnJvcj1iKCJlcnJvciIpLGI9Q2NbZ109YigiYWJvcnQiKTt0cnl7Zi5zZW5kKGEuaGFzQ29udGVudCYmYS5kYXRhfHxudWxsKX1jYXRjaChoKXtpZihiKXRocm93IGh9fSxhYm9ydDpmdW5jdGlvbigpe2ImJmIoKX19OnZvaWQgMH0pLG4uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovKD86amF2YXxlY21hKXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ2xvYmFsRXZhbChhKSxhfX19KSxuLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7dm9pZCAwPT09YS5jYWNoZSYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIpfSksbi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBiLGM7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZCxlKXtiPW4oIjxzY3JpcHQ+IikucHJvcCh7YXN5bmM6ITAsY2hhcnNldDphLnNjcmlwdENoYXJzZXQsc3JjOmEudXJsfSkub24oImxvYWQgZXJyb3IiLGM9ZnVuY3Rpb24oYSl7Yi5yZW1vdmUoKSxjPW51bGwsYSYmZSgiZXJyb3IiPT09YS50eXBlPzQwNDoyMDAsYS50eXBlKX0pLGwuaGVhZC5hcHBlbmRDaGlsZChiWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX19KTt2YXIgRmM9W10sR2M9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9RmMucG9wKCl8fG4uZXhwYW5kbysiXyIrY2MrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKEdjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmR2MudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKEdjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPShkYy50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssRmMucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fGw7dmFyIGQ9di5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW4uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbihlKS5yZW1vdmUoKSxuLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgSGM9bi5mbi5sb2FkO24uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZIYylyZXR1cm4gSGMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9bi50cmltKGEuc2xpY2UoaCkpLGE9YS5zbGljZSgwLGgpKSxuLmlzRnVuY3Rpb24oYik/KGM9YixiPXZvaWQgMCk6YiYmIm9iamVjdCI9PXR5cGVvZiBiJiYoZT0iUE9TVCIpLGcubGVuZ3RoPjAmJm4uYWpheCh7dXJsOmEsdHlwZTplLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP24oIjxkaXY+IikuYXBwZW5kKG4ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuY29tcGxldGUoYyYmZnVuY3Rpb24oYSxiKXtnLmVhY2goYyxmfHxbYS5yZXNwb25zZVRleHQsYixhXSl9KSx0aGlzfSxuLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihhLGIpe24uZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxuLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gbi5ncmVwKG4udGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofTt2YXIgSWM9YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZnVuY3Rpb24gSmMoYSl7cmV0dXJuIG4uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZSYmYS5kZWZhdWx0Vmlld31uLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW4uY3NzKGEsInBvc2l0aW9uIiksbD1uKGEpLG09e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1uLmNzcyhhLCJ0b3AiKSxpPW4uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiYoZitpKS5pbmRleE9mKCJhdXRvIik+LTEsaj8oZD1sLnBvc2l0aW9uKCksZz1kLnRvcCxlPWQubGVmdCk6KGc9cGFyc2VGbG9hdChmKXx8MCxlPXBhcnNlRmxvYXQoaSl8fDApLG4uaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxoKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXRoaXNbMF0sZT17dG9wOjAsbGVmdDowfSxmPWQmJmQub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixkKT8odHlwZW9mIGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09VSYmKGU9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1KYyhmKSx7dG9wOmUudG9wK2MucGFnZVlPZmZzZXQtYi5jbGllbnRUb3AsbGVmdDplLmxlZnQrYy5wYWdlWE9mZnNldC1iLmNsaWVudExlZnR9KTplfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBhLGIsYz10aGlzWzBdLGQ9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PW4uY3NzKGMsInBvc2l0aW9uIik/Yj1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihhPXRoaXMub2Zmc2V0UGFyZW50KCksYj10aGlzLm9mZnNldCgpLG4ubm9kZU5hbWUoYVswXSwiaHRtbCIpfHwoZD1hLm9mZnNldCgpKSxkLnRvcCs9bi5jc3MoYVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxkLmxlZnQrPW4uY3NzKGFbMF0sImJvcmRlckxlZnRXaWR0aCIsITApKSx7dG9wOmIudG9wLWQudG9wLW4uY3NzKGMsIm1hcmdpblRvcCIsITApLGxlZnQ6Yi5sZWZ0LWQubGVmdC1uLmNzcyhjLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fEljO3doaWxlKGEmJiFuLm5vZGVOYW1lKGEsImh0bWwiKSYmInN0YXRpYyI9PT1uLmNzcyhhLCJwb3NpdGlvbiIpKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF8fEljfSl9fSksbi5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9InBhZ2VZT2Zmc2V0Ij09PWM7bi5mbltiXT1mdW5jdGlvbihlKXtyZXR1cm4gSih0aGlzLGZ1bmN0aW9uKGIsZSxmKXt2YXIgZz1KYyhiKTtyZXR1cm4gdm9pZCAwPT09Zj9nP2dbY106YltlXTp2b2lkKGc/Zy5zY3JvbGxUbyhkP2EucGFnZVhPZmZzZXQ6ZixkP2Y6YS5wYWdlWU9mZnNldCk6YltlXT1mKX0sYixlLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT15YihrLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz14YihhLGIpLHZiLnRlc3QoYyk/bihhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxuLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe24uZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpiLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24oYyxkKXtuLmZuW2RdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aCYmKGN8fCJib29sZWFuIiE9dHlwZW9mIGQpLGc9Y3x8KGQ9PT0hMHx8ZT09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gSih0aGlzLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZTtyZXR1cm4gbi5pc1dpbmRvdyhiKT9iLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09Yi5ub2RlVHlwZT8oZT1iLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChiLmJvZHlbInNjcm9sbCIrYV0sZVsic2Nyb2xsIithXSxiLmJvZHlbIm9mZnNldCIrYV0sZVsib2Zmc2V0IithXSxlWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09ZD9uLmNzcyhiLGMsZyk6bi5zdHlsZShiLGMsZCxnKX0sYixmP2Q6dm9pZCAwLGYsbnVsbCl9fSl9KSxuLmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LG4uZm4uYW5kU2VsZj1uLmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG59KTt2YXIgS2M9YS5qUXVlcnksTGM9YS4kO3JldHVybiBuLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW4mJihhLiQ9TGMpLGImJmEualF1ZXJ5PT09biYmKGEualF1ZXJ5PUtjKSxufSx0eXBlb2YgYj09PVUmJihhLmpRdWVyeT1hLiQ9biksbn0pOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvanF1ZXJ5LmpzdHJlZS5qcyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL2pxdWVyeS5qc3RyZWUuanMKaW5kZXggNzY4YWRmZS4uNTBjMTc2NyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvanF1ZXJ5LmpzdHJlZS5qcworKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9qcXVlcnkuanN0cmVlLmpzCkBAIC0xLDM1MzQgKzEsMzUzNCBAQAotLyoNCi0NCi1UaGUgTUlUIExpY2Vuc2UgKE1JVCkNCi0NCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5DQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCi1pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzDQotdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbA0KLWNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KLWZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4NCi1hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCi0NCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KLUFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLA0KLU9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4NCi1USEUgU09GVFdBUkUuDQotDQotKi8NCi0NCi0vKg0KLSAqIGpzVHJlZSAxLjAtcmMxDQotICogaHR0cDovL2pzdHJlZS5jb20vDQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgSXZhbiBCb3poYW5vdiAodmFrYXRhLmNvbSkNCi0gKg0KLSAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzIChzYW1lIGFzIGpRdWVyeSk6DQotICogICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocA0KLSAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sDQotICoNCi0gKiBEYXRlOiAyMDEwLTA3LTAxIDEwOjUxOjExICswMzAwICjRh9C10YLQsiwgMDEg0Y7Qu9C4IDIwMTApICQNCi0gKiBSZXZpc2lvbjogMTkxICQNCi0gKi8NCi0NCi0vKmpzbGludCBicm93c2VyOiB0cnVlLCBvbmV2YXI6IHRydWUsIHVuZGVmOiB0cnVlLCBiaXR3aXNlOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi8NCi0vKmdsb2JhbCB3aW5kb3cgOiBmYWxzZSwgY2xlYXJJbnRlcnZhbDogZmFsc2UsIGNsZWFyVGltZW91dDogZmFsc2UsIGRvY3VtZW50OiBmYWxzZSwgc2V0SW50ZXJ2YWw6IGZhbHNlLCBzZXRUaW1lb3V0OiBmYWxzZSwgalF1ZXJ5OiBmYWxzZSwgbmF2aWdhdG9yOiBmYWxzZSwgWFNMVFByb2Nlc3NvcjogZmFsc2UsIERPTVBhcnNlcjogZmFsc2UsIFhNTFNlcmlhbGl6ZXI6IGZhbHNlKi8NCi0NCi0idXNlIHN0cmljdCI7DQotLy8gQ29tbW9uIGZ1bmN0aW9ucyBub3QgcmVsYXRlZCB0byBqc1RyZWUgDQotLy8gZGVjaWRlZCB0byBtb3ZlIHRoZW0gdG8gYSBgdmFrYXRhYCAibmFtZXNwYWNlIg0KLShmdW5jdGlvbiAoJCkgew0KLSAgJC52YWthdGEgPSB7fTsNCi0gIC8vIENTUyByZWxhdGVkIGZ1bmN0aW9ucw0KLSAgJC52YWthdGEuY3NzID0gew0KLSAgICBnZXRfY3NzIDogZnVuY3Rpb24ocnVsZV9uYW1lLCBkZWxldGVfZmxhZywgc2hlZXQpIHsNCi0gICAgICBydWxlX25hbWUgPSBydWxlX25hbWUudG9Mb3dlckNhc2UoKTsNCi0gICAgICB2YXIgY3NzX3J1bGVzID0gc2hlZXQuY3NzUnVsZXMgfHwgc2hlZXQucnVsZXMsDQotICAgICAgICBqID0gMDsNCi0gICAgICBkbyB7DQotICAgICAgICBpZihjc3NfcnVsZXMubGVuZ3RoICYmIGogPiBjc3NfcnVsZXMubGVuZ3RoICsgNSkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIGlmKGNzc19ydWxlc1tqXS5zZWxlY3RvclRleHQgJiYgY3NzX3J1bGVzW2pdLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpID09IHJ1bGVfbmFtZSkgew0KLSAgICAgICAgICBpZihkZWxldGVfZmxhZyA9PT0gdHJ1ZSkgew0KLSAgICAgICAgICAgIGlmKHNoZWV0LnJlbW92ZVJ1bGUpIHsgc2hlZXQucmVtb3ZlUnVsZShqKTsgfQ0KLSAgICAgICAgICAgIGlmKHNoZWV0LmRlbGV0ZVJ1bGUpIHsgc2hlZXQuZGVsZXRlUnVsZShqKTsgfQ0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGVsc2UgeyByZXR1cm4gY3NzX3J1bGVzW2pdOyB9DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICAgIHdoaWxlIChjc3NfcnVsZXNbKytqXSk7DQotICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9LA0KLSAgICBhZGRfY3NzIDogZnVuY3Rpb24ocnVsZV9uYW1lLCBzaGVldCkgew0KLSAgICAgIGlmKCQuanN0cmVlLmNzcy5nZXRfY3NzKHJ1bGVfbmFtZSwgZmFsc2UsIHNoZWV0KSkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICBpZihzaGVldC5pbnNlcnRSdWxlKSB7IHNoZWV0Lmluc2VydFJ1bGUocnVsZV9uYW1lICsgJyB7IH0nLCAwKTsgfSBlbHNlIHsgc2hlZXQuYWRkUnVsZShydWxlX25hbWUsIG51bGwsIDApOyB9DQotICAgICAgcmV0dXJuICQudmFrYXRhLmNzcy5nZXRfY3NzKHJ1bGVfbmFtZSk7DQotICAgIH0sDQotICAgIHJlbW92ZV9jc3MgOiBmdW5jdGlvbihydWxlX25hbWUsIHNoZWV0KSB7IA0KLSAgICAgIHJldHVybiAkLnZha2F0YS5jc3MuZ2V0X2NzcyhydWxlX25hbWUsIHRydWUsIHNoZWV0KTsgDQotICAgIH0sDQotICAgIGFkZF9zaGVldCA6IGZ1bmN0aW9uKG9wdHMpIHsNCi0gICAgICB2YXIgdG1wOw0KLSAgICAgIGlmKG9wdHMuc3RyKSB7DQotICAgICAgICB0bXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOw0KLSAgICAgICAgdG1wLnNldEF0dHJpYnV0ZSgndHlwZScsInRleHQvY3NzIik7DQotICAgICAgICBpZih0bXAuc3R5bGVTaGVldCkgew0KLSAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHRtcCk7DQotICAgICAgICAgIHRtcC5zdHlsZVNoZWV0LmNzc1RleHQgPSBvcHRzLnN0cjsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICB0bXAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUob3B0cy5zdHIpKTsNCi0gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZCh0bXApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRtcC5zaGVldCB8fCB0bXAuc3R5bGVTaGVldDsNCi0gICAgICB9DQotICAgICAgaWYob3B0cy51cmwpIHsNCi0gICAgICAgIGlmKGRvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQpIHsNCi0gICAgICAgICAgdHJ5IHsgdG1wID0gZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldChvcHRzLnVybCk7IH0gY2F0Y2ggKGUpIHsgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgIHRtcCAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpOw0KLSAgICAgICAgICB0bXAucmVsICAgID0gJ3N0eWxlc2hlZXQnOw0KLSAgICAgICAgICB0bXAudHlwZSAgPSAndGV4dC9jc3MnOw0KLSAgICAgICAgICB0bXAubWVkaWEgID0gImFsbCI7DQotICAgICAgICAgIHRtcC5ocmVmICA9IG9wdHMudXJsOw0KLSAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHRtcCk7DQotICAgICAgICAgIHJldHVybiB0bXAuc3R5bGVTaGVldDsNCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH07DQotfSkoalF1ZXJ5KTsNCi0NCi0vKiANCi0gKiBqc1RyZWUgY29yZSAxLjANCi0gKi8NCi0oZnVuY3Rpb24gKCQpIHsNCi0gIC8vIHByaXZhdGUgdmFyaWFibGVzIA0KLSAgdmFyIGluc3RhbmNlcyA9IFtdLCAgICAgIC8vIGluc3RhbmNlIGFycmF5ICh1c2VkIGJ5ICQuanN0cmVlLnJlZmVyZW5jZS9jcmVhdGUvZm9jdXNlZCkNCi0gICAgZm9jdXNlZF9pbnN0YW5jZSA9IC0xLCAgLy8gdGhlIGluZGV4IGluIHRoZSBpbnN0YW5jZSBhcnJheSBvZiB0aGUgY3VycmVudGx5IGZvY3VzZWQgaW5zdGFuY2UNCi0gICAgcGx1Z2lucyA9IHt9LCAgICAgIC8vIGxpc3Qgb2YgaW5jbHVkZWQgcGx1Z2lucw0KLSAgICBwcmVwYXJlZF9tb3ZlID0ge30sICAgIC8vIGZvciB0aGUgbW92ZSBwbHVnaW4NCi0gICAgaXNfaWU2ID0gZmFsc2U7DQotDQotICAvLyBqUXVlcnkgcGx1Z2luIHdyYXBwZXIgKHRoYW5rcyB0byBqcXVlcnkgVUkgd2lkZ2V0IGZ1bmN0aW9uKQ0KLSAgJC5mbi5qc3RyZWUgPSBmdW5jdGlvbiAoc2V0dGluZ3MpIHsNCi0gICAgdmFyIGlzTWV0aG9kQ2FsbCA9ICh0eXBlb2Ygc2V0dGluZ3MgPT0gJ3N0cmluZycpLCAvLyBpcyB0aGlzIGEgbWV0aG9kIGNhbGwgbGlrZSAkKCkuanN0cmVlKCJvcGVuX25vZGUiKQ0KLSAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCANCi0gICAgICByZXR1cm5WYWx1ZSA9IHRoaXM7DQotDQotICAgIC8vIGV4dGVuZCBzZXR0aW5ncyBhbmQgYWxsb3cgZm9yIG11bHRpcGxlIGhhc2hlcyBhbmQgbWV0YWRhdGENCi0gICAgaWYoIWlzTWV0aG9kQ2FsbCAmJiAkLm1ldGEpIHsgYXJncy5wdXNoKCQubWV0YWRhdGEuZ2V0KHRoaXMpLmpzdHJlZSk7IH0NCi0gICAgc2V0dGluZ3MgPSAhaXNNZXRob2RDYWxsICYmIGFyZ3MubGVuZ3RoID8gJC5leHRlbmQuYXBwbHkobnVsbCwgW3RydWUsIHNldHRpbmdzXS5jb25jYXQoYXJncykpIDogc2V0dGluZ3M7DQotICAgIC8vIGJsb2NrIGNhbGxzIHRvICJwcml2YXRlIiBtZXRob2RzDQotICAgIGlmKGlzTWV0aG9kQ2FsbCAmJiBzZXR0aW5ncy5zdWJzdHJpbmcoMCwgMSkgPT0gJ18nKSB7IHJldHVybiByZXR1cm5WYWx1ZTsgfQ0KLQ0KLSAgICAvLyBpZiBhIG1ldGhvZCBjYWxsIGV4ZWN1dGUgdGhlIG1ldGhvZCBvbiBhbGwgc2VsZWN0ZWQgaW5zdGFuY2VzDQotICAgIGlmKGlzTWV0aG9kQ2FsbCkgew0KLSAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsNCi0gICAgICAgIHZhciBpbnN0YW5jZSA9IGluc3RhbmNlc1skLmRhdGEodGhpcywgImpzdHJlZS1pbnN0YW5jZS1pZCIpXSwNCi0gICAgICAgICAgbWV0aG9kVmFsdWUgPSAoaW5zdGFuY2UgJiYgJC5pc0Z1bmN0aW9uKGluc3RhbmNlW3NldHRpbmdzXSkpID8gaW5zdGFuY2Vbc2V0dGluZ3NdLmFwcGx5KGluc3RhbmNlLCBhcmdzKSA6IGluc3RhbmNlOw0KLSAgICAgICAgICBpZih0eXBlb2YgbWV0aG9kVmFsdWUgIT09ICJ1bmRlZmluZWQiICYmIChzZXR0aW5ncy5pbmRleE9mKCJpc18iID09PSAwKSB8fCAobWV0aG9kVmFsdWUgIT09IHRydWUgJiYgbWV0aG9kVmFsdWUgIT09IGZhbHNlKSkpIHsgcmV0dXJuVmFsdWUgPSBtZXRob2RWYWx1ZTsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgfSk7DQotICAgIH0NCi0gICAgZWxzZSB7DQotICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgew0KLSAgICAgICAgdmFyIGluc3RhbmNlX2lkID0gJC5kYXRhKHRoaXMsICJqc3RyZWUtaW5zdGFuY2UtaWQiKSwNCi0gICAgICAgICAgcyA9IGZhbHNlOw0KLSAgICAgICAgLy8gaWYgYW4gaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMsIGRlc3Ryb3kgaXQgZmlyc3QNCi0gICAgICAgIGlmKHR5cGVvZiBpbnN0YW5jZV9pZCAhPT0gInVuZGVmaW5lZCIgJiYgaW5zdGFuY2VzW2luc3RhbmNlX2lkXSkgeyBpbnN0YW5jZXNbaW5zdGFuY2VfaWRdLmRlc3Ryb3koKTsgfQ0KLSAgICAgICAgLy8gcHVzaCBhIG5ldyBlbXB0eSBvYmplY3QgdG8gdGhlIGluc3RhbmNlcyBhcnJheQ0KLSAgICAgICAgaW5zdGFuY2VfaWQgPSBwYXJzZUludChpbnN0YW5jZXMucHVzaCh7fSksMTApIC0gMTsNCi0gICAgICAgIC8vIHN0b3JlIHRoZSBqc3RyZWUgaW5zdGFuY2UgaWQgdG8gdGhlIGNvbnRhaW5lciBlbGVtZW50DQotICAgICAgICAkLmRhdGEodGhpcywgImpzdHJlZS1pbnN0YW5jZS1pZCIsIGluc3RhbmNlX2lkKTsNCi0gICAgICAgIC8vIGNsZWFuIHVwIGFsbCBwbHVnaW5zDQotICAgICAgICBpZighc2V0dGluZ3MpIHsgc2V0dGluZ3MgPSB7fTsgfQ0KLSAgICAgICAgc2V0dGluZ3MucGx1Z2lucyA9ICQuaXNBcnJheShzZXR0aW5ncy5wbHVnaW5zKSA/IHNldHRpbmdzLnBsdWdpbnMgOiAkLmpzdHJlZS5kZWZhdWx0cy5wbHVnaW5zOw0KLSAgICAgICAgaWYoJC5pbkFycmF5KCJjb3JlIiwgc2V0dGluZ3MucGx1Z2lucykgPT09IC0xKSB7IHNldHRpbmdzLnBsdWdpbnMudW5zaGlmdCgiY29yZSIpOyB9DQotICAgICAgICANCi0gICAgICAgIC8vIG9ubHkgdW5pcXVlIHBsdWdpbnMgKE5PVCBXT1JLSU5HKQ0KLSAgICAgICAgLy8gc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMuc29ydCgpLmpvaW4oIiwsIikucmVwbGFjZSgvKCx8XikoW14sXSspKCwsXDIpKygsfCQpL2csIiQxJDIkNCIpLnJlcGxhY2UoLywsKy9nLCIsIikucmVwbGFjZSgvLCQvLCIiKS5zcGxpdCgiLCIpOw0KLQ0KLSAgICAgICAgLy8gZXh0ZW5kIGRlZmF1bHRzIHdpdGggcGFzc2VkIGRhdGENCi0gICAgICAgIHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgJC5qc3RyZWUuZGVmYXVsdHMsIHNldHRpbmdzKTsNCi0gICAgICAgIHMucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM7DQotICAgICAgICAkLmVhY2gocGx1Z2lucywgZnVuY3Rpb24gKGksIHZhbCkgeyBpZigkLmluQXJyYXkoaSwgcy5wbHVnaW5zKSA9PT0gLTEpIHsgc1tpXSA9IG51bGw7IGRlbGV0ZSBzW2ldOyB9IH0pOw0KLSAgICAgICAgLy8gcHVzaCB0aGUgbmV3IG9iamVjdCB0byB0aGUgaW5zdGFuY2VzIGFycmF5IChhdCB0aGUgc2FtZSB0aW1lIHNldCB0aGUgZGVmYXVsdCBjbGFzc2VzIHRvIHRoZSBjb250YWluZXIpIGFuZCBpbml0DQotICAgICAgICBpbnN0YW5jZXNbaW5zdGFuY2VfaWRdID0gbmV3ICQuanN0cmVlLl9pbnN0YW5jZShpbnN0YW5jZV9pZCwgJCh0aGlzKS5hZGRDbGFzcygianN0cmVlIGpzdHJlZS0iICsgaW5zdGFuY2VfaWQpLCBzKTsgDQotICAgICAgICAvLyBpbml0IGFsbCBhY3RpdmF0ZWQgcGx1Z2lucyBmb3IgdGhpcyBpbnN0YW5jZQ0KLSAgICAgICAgJC5lYWNoKGluc3RhbmNlc1tpbnN0YW5jZV9pZF0uX2dldF9zZXR0aW5ncygpLnBsdWdpbnMsIGZ1bmN0aW9uIChpLCB2YWwpIHsgaW5zdGFuY2VzW2luc3RhbmNlX2lkXS5kYXRhW3ZhbF0gPSB7fTsgfSk7DQotICAgICAgICAkLmVhY2goaW5zdGFuY2VzW2luc3RhbmNlX2lkXS5fZ2V0X3NldHRpbmdzKCkucGx1Z2lucywgZnVuY3Rpb24gKGksIHZhbCkgeyBpZihwbHVnaW5zW3ZhbF0pIHsgcGx1Z2luc1t2YWxdLl9faW5pdC5hcHBseShpbnN0YW5jZXNbaW5zdGFuY2VfaWRdKTsgfSB9KTsNCi0gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGluc3RhbmNlDQotICAgICAgICBpbnN0YW5jZXNbaW5zdGFuY2VfaWRdLmluaXQoKTsNCi0gICAgICB9KTsNCi0gICAgfQ0KLSAgICAvLyByZXR1cm4gdGhlIGpxdWVyeSBzZWxlY3Rpb24gKG9yIGlmIGl0IHdhcyBhIG1ldGhvZCBjYWxsIHRoYXQgcmV0dXJuZWQgYSB2YWx1ZSAtIHRoZSByZXR1cm5lZCB2YWx1ZSkNCi0gICAgcmV0dXJuIHJldHVyblZhbHVlOw0KLSAgfTsNCi0gIC8vIG9iamVjdCB0byBzdG9yZSBleHBvc2VkIGZ1bmN0aW9ucyBhbmQgb2JqZWN0cw0KLSAgJC5qc3RyZWUgPSB7DQotICAgIGRlZmF1bHRzIDogew0KLSAgICAgIHBsdWdpbnMgOiBbXQ0KLSAgICB9LA0KLSAgICBfZm9jdXNlZCA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGluc3RhbmNlc1tmb2N1c2VkX2luc3RhbmNlXSB8fCBudWxsOyB9LA0KLSAgICBfcmVmZXJlbmNlIDogZnVuY3Rpb24gKG5lZWRsZSkgeyANCi0gICAgICAvLyBnZXQgYnkgaW5zdGFuY2UgaWQNCi0gICAgICBpZihpbnN0YW5jZXNbbmVlZGxlXSkgeyByZXR1cm4gaW5zdGFuY2VzW25lZWRsZV07IH0NCi0gICAgICAvLyBnZXQgYnkgRE9NIChpZiBzdGlsbCBubyBsdWNrIC0gcmV0dXJuIG51bGwNCi0gICAgICB2YXIgbyA9ICQobmVlZGxlKTsgDQotICAgICAgaWYoIW8ubGVuZ3RoICYmIHR5cGVvZiBuZWVkbGUgPT09ICJzdHJpbmciKSB7IG8gPSAkKCIjIiArIG5lZWRsZSk7IH0NCi0gICAgICBpZighby5sZW5ndGgpIHsgcmV0dXJuIG51bGw7IH0NCi0gICAgICByZXR1cm4gaW5zdGFuY2VzW28uY2xvc2VzdCgiLmpzdHJlZSIpLmRhdGEoImpzdHJlZS1pbnN0YW5jZS1pZCIpXSB8fCBudWxsOyANCi0gICAgfSwNCi0gICAgX2luc3RhbmNlIDogZnVuY3Rpb24gKGluZGV4LCBjb250YWluZXIsIHNldHRpbmdzKSB7IA0KLSAgICAgIC8vIGZvciBwbHVnaW5zIHRvIHN0b3JlIGRhdGEgaW4NCi0gICAgICB0aGlzLmRhdGEgPSB7IGNvcmUgOiB7fSB9Ow0KLSAgICAgIHRoaXMuZ2V0X3NldHRpbmdzICA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncyk7IH07DQotICAgICAgdGhpcy5fZ2V0X3NldHRpbmdzICA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNldHRpbmdzOyB9Ow0KLSAgICAgIHRoaXMuZ2V0X2luZGV4ICAgID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gaW5kZXg7IH07DQotICAgICAgdGhpcy5nZXRfY29udGFpbmVyICA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbnRhaW5lcjsgfTsNCi0gICAgICB0aGlzLl9zZXRfc2V0dGluZ3MgID0gZnVuY3Rpb24gKHMpIHsgDQotICAgICAgICBzZXR0aW5ncyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncywgcyk7DQotICAgICAgfTsNCi0gICAgfSwNCi0gICAgX2ZuIDogeyB9LA0KLSAgICBwbHVnaW4gOiBmdW5jdGlvbiAocG5hbWUsIHBkYXRhKSB7DQotICAgICAgcGRhdGEgPSAkLmV4dGVuZCh7fSwgew0KLSAgICAgICAgX19pbml0ICAgIDogJC5ub29wLCANCi0gICAgICAgIF9fZGVzdHJveSAgOiAkLm5vb3AsDQotICAgICAgICBfZm4gICAgICA6IHt9LA0KLSAgICAgICAgZGVmYXVsdHMgIDogZmFsc2UNCi0gICAgICB9LCBwZGF0YSk7DQotICAgICAgcGx1Z2luc1twbmFtZV0gPSBwZGF0YTsNCi0NCi0gICAgICAkLmpzdHJlZS5kZWZhdWx0c1twbmFtZV0gPSBwZGF0YS5kZWZhdWx0czsNCi0gICAgICAkLmVhY2gocGRhdGEuX2ZuLCBmdW5jdGlvbiAoaSwgdmFsKSB7DQotICAgICAgICB2YWwucGx1Z2luICAgID0gcG5hbWU7DQotICAgICAgICB2YWwub2xkICAgICAgPSAkLmpzdHJlZS5fZm5baV07DQotICAgICAgICAkLmpzdHJlZS5fZm5baV0gPSBmdW5jdGlvbiAoKSB7DQotICAgICAgICAgIHZhciByc2x0LA0KLSAgICAgICAgICAgIGZ1bmMgPSB2YWwsDQotICAgICAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksDQotICAgICAgICAgICAgZXZudCA9IG5ldyAkLkV2ZW50KCJiZWZvcmUuanN0cmVlIiksDQotICAgICAgICAgICAgcmxiayA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAvLyBDaGVjayBpZiBmdW5jdGlvbiBiZWxvbmdzIHRvIHRoZSBpbmNsdWRlZCBwbHVnaW5zIG9mIHRoaXMgaW5zdGFuY2UNCi0gICAgICAgICAgZG8gew0KLSAgICAgICAgICAgIGlmKGZ1bmMgJiYgZnVuYy5wbHVnaW4gJiYgJC5pbkFycmF5KGZ1bmMucGx1Z2luLCB0aGlzLl9nZXRfc2V0dGluZ3MoKS5wbHVnaW5zKSAhPT0gLTEpIHsgYnJlYWs7IH0NCi0gICAgICAgICAgICBmdW5jID0gZnVuYy5vbGQ7DQotICAgICAgICAgIH0gd2hpbGUoZnVuYyk7DQotICAgICAgICAgIGlmKCFmdW5jKSB7IHJldHVybjsgfQ0KLQ0KLSAgICAgICAgICAvLyBhIGNoYW5jZSB0byBzdG9wIGV4ZWN1dGlvbiAob3IgY2hhbmdlIGFyZ3VtZW50cyk6IA0KLSAgICAgICAgICAvLyAqIGp1c3QgYmluZCB0byBqc3RyZWUuYmVmb3JlDQotICAgICAgICAgIC8vICogY2hlY2sgdGhlIGFkZGl0aW9uYWwgZGF0YSBvYmplY3QgKGZ1bmMgcHJvcGVydHkpDQotICAgICAgICAgIC8vICogY2FsbCBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKQ0KLSAgICAgICAgICAvLyAqIHJldHVybiBmYWxzZSAob3IgYW4gYXJyYXkgb2YgYXJndW1lbnRzKQ0KLSAgICAgICAgICByc2x0ID0gdGhpcy5nZXRfY29udGFpbmVyKCkudHJpZ2dlckhhbmRsZXIoZXZudCwgeyAiZnVuYyIgOiBpLCAiaW5zdCIgOiB0aGlzLCAiYXJncyIgOiBhcmdzIH0pOw0KLSAgICAgICAgICBpZihyc2x0ID09PSBmYWxzZSkgeyByZXR1cm47IH0NCi0gICAgICAgICAgaWYodHlwZW9mIHJzbHQgIT09ICJ1bmRlZmluZWQiKSB7IGFyZ3MgPSByc2x0OyB9DQotDQotICAgICAgICAgIC8vIGNvbnRleHQgYW5kIGZ1bmN0aW9uIHRvIHRyaWdnZXIgZXZlbnRzLCB0aGVuIGZpbmFsbHkgY2FsbCB0aGUgZnVuY3Rpb24NCi0gICAgICAgICAgaWYoaS5pbmRleE9mKCJfIikgPT09IDApIHsNCi0gICAgICAgICAgICByc2x0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICByc2x0ID0gZnVuYy5hcHBseSgNCi0gICAgICAgICAgICAgICQuZXh0ZW5kKHt9LCB0aGlzLCB7IA0KLSAgICAgICAgICAgICAgICBfX2NhbGxiYWNrIDogZnVuY3Rpb24gKGRhdGEpIHsgDQotICAgICAgICAgICAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkudHJpZ2dlckhhbmRsZXIoIGkgKyAnLmpzdHJlZScsIHsgImluc3QiIDogdGhpcywgImFyZ3MiIDogYXJncywgInJzbHQiIDogZGF0YSwgInJsYmsiIDogcmxiayB9KTsNCi0gICAgICAgICAgICAgICAgfSwNCi0gICAgICAgICAgICAgICAgX19yb2xsYmFjayA6IGZ1bmN0aW9uICgpIHsgDQotICAgICAgICAgICAgICAgICAgcmxiayA9IHRoaXMuZ2V0X3JvbGxiYWNrKCk7DQotICAgICAgICAgICAgICAgICAgcmV0dXJuIHJsYms7DQotICAgICAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgICAgIF9fY2FsbF9vbGQgOiBmdW5jdGlvbiAocmVwbGFjZV9hcmd1bWVudHMpIHsNCi0gICAgICAgICAgICAgICAgICByZXR1cm4gZnVuYy5vbGQuYXBwbHkodGhpcywgKHJlcGxhY2VfYXJndW1lbnRzID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSA6IGFyZ3MgKSApOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICB9KSwgYXJncyk7DQotICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgLy8gcmV0dXJuIHRoZSByZXN1bHQNCi0gICAgICAgICAgcmV0dXJuIHJzbHQ7DQotICAgICAgICB9Ow0KLSAgICAgICAgJC5qc3RyZWUuX2ZuW2ldLm9sZCA9IHZhbC5vbGQ7DQotICAgICAgICAkLmpzdHJlZS5fZm5baV0ucGx1Z2luID0gcG5hbWU7DQotICAgICAgfSk7DQotICAgIH0sDQotICAgIHJvbGxiYWNrIDogZnVuY3Rpb24gKHJiKSB7DQotICAgICAgaWYocmIpIHsNCi0gICAgICAgIGlmKCEkLmlzQXJyYXkocmIpKSB7IHJiID0gWyByYiBdOyB9DQotICAgICAgICAkLmVhY2gocmIsIGZ1bmN0aW9uIChpLCB2YWwpIHsNCi0gICAgICAgICAgaW5zdGFuY2VzW3ZhbC5pXS5zZXRfcm9sbGJhY2sodmFsLmgsIHZhbC5kKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfTsNCi0gIC8vIHNldCB0aGUgcHJvdG90eXBlIGZvciBhbGwgaW5zdGFuY2VzDQotICAkLmpzdHJlZS5fZm4gPSAkLmpzdHJlZS5faW5zdGFuY2UucHJvdG90eXBlID0ge307DQotDQotICAvLyBjc3MgZnVuY3Rpb25zIC0gdXNlZCBpbnRlcm5hbGx5DQotDQotICAvLyBsb2FkIHRoZSBjc3Mgd2hlbiBET00gaXMgcmVhZHkNCi0gICQoZnVuY3Rpb24oKSB7DQotICAgIC8vIGNvZGUgaXMgY29waWVkIGZvcm0galF1ZXJ5ICgkLmJyb3dzZXIgaXMgZGVwcmVjYXRlZCArIHRoZXJlIGlzIGEgYnVnIGluIElFKQ0KLSAgICB2YXIgdSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSwNCi0gICAgICB2ID0gKHUubWF0Y2goIC8uKz8oPzpydnxpdHxyYXxpZSlbXC86IF0oW1xkLl0rKS8gKSB8fCBbMCwnMCddKVsxXSwNCi0gICAgICBjc3Nfc3RyaW5nID0gJycgKyANCi0gICAgICAgICcuanN0cmVlIHVsLCAuanN0cmVlIGxpIHsgZGlzcGxheTpibG9jazsgbWFyZ2luOjAgMCAwIDA7IHBhZGRpbmc6MCAwIDAgMDsgbGlzdC1zdHlsZS10eXBlOm5vbmU7IH0gJyArIA0KLSAgICAgICAgJy5qc3RyZWUgbGkgeyBkaXNwbGF5OmJsb2NrOyBtaW4taGVpZ2h0OjE4cHg7IGxpbmUtaGVpZ2h0OjE4cHg7IHdoaXRlLXNwYWNlOm5vd3JhcDsgbWFyZ2luLWxlZnQ6MThweDsgfSAnICsgDQotICAgICAgICAnLmpzdHJlZS1ydGwgbGkgeyBtYXJnaW4tbGVmdDowOyBtYXJnaW4tcmlnaHQ6MThweDsgfSAnICsgDQotICAgICAgICAnLmpzdHJlZSA+IHVsID4gbGkgeyBtYXJnaW4tbGVmdDowcHg7IH0gJyArIA0KLSAgICAgICAgJy5qc3RyZWUtcnRsID4gdWwgPiBsaSB7IG1hcmdpbi1yaWdodDowcHg7IH0gJyArIA0KLSAgICAgICAgJy5qc3RyZWUgaW5zIHsgZGlzcGxheTppbmxpbmUtYmxvY2s7IHRleHQtZGVjb3JhdGlvbjpub25lOyB3aWR0aDoxOHB4OyBoZWlnaHQ6MThweDsgbWFyZ2luOjAgMCAwIDA7IHBhZGRpbmc6MDsgfSAnICsgDQotICAgICAgICAnLmpzdHJlZSBhIHsgZGlzcGxheTppbmxpbmUtYmxvY2s7IGxpbmUtaGVpZ2h0OjE2cHg7IGhlaWdodDoxNnB4OyBjb2xvcjpibGFjazsgd2hpdGUtc3BhY2U6bm93cmFwOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgcGFkZGluZzoxcHggMnB4OyBtYXJnaW46MDsgfSAnICsgDQotICAgICAgICAnLmpzdHJlZSBhOmZvY3VzIHsgb3V0bGluZTogbm9uZTsgfSAnICsgDQotICAgICAgICAnLmpzdHJlZSBhID4gaW5zIHsgaGVpZ2h0OjE2cHg7IHdpZHRoOjE2cHg7IH0gJyArIA0KLSAgICAgICAgJy5qc3RyZWUgYSA+IC5qc3RyZWUtaWNvbiB7IG1hcmdpbi1yaWdodDozcHg7IH0gJyArIA0KLSAgICAgICAgJy5qc3RyZWUtcnRsIGEgPiAuanN0cmVlLWljb24geyBtYXJnaW4tbGVmdDozcHg7IG1hcmdpbi1yaWdodDowOyB9ICcgKyANCi0gICAgICAgICdsaS5qc3RyZWUtb3BlbiA+IHVsIHsgZGlzcGxheTpibG9jazsgfSAnICsgDQotICAgICAgICAnbGkuanN0cmVlLWNsb3NlZCA+IHVsIHsgZGlzcGxheTpub25lOyB9ICc7DQotICAgIC8vIENvcnJlY3QgSUUgNiAoZG9lcyBub3Qgc3VwcG9ydCB0aGUgPiBDU1Mgc2VsZWN0b3IpDQotICAgIGlmKC9tc2llLy50ZXN0KHUpICYmIHBhcnNlSW50KHYsIDEwKSA9PSA2KSB7IA0KLSAgICAgIGlzX2llNiA9IHRydWU7DQotICAgICAgY3NzX3N0cmluZyArPSAnJyArIA0KLSAgICAgICAgJy5qc3RyZWUgbGkgeyBoZWlnaHQ6MThweDsgbWFyZ2luLWxlZnQ6MDsgbWFyZ2luLXJpZ2h0OjA7IH0gJyArIA0KLSAgICAgICAgJy5qc3RyZWUgbGkgbGkgeyBtYXJnaW4tbGVmdDoxOHB4OyB9ICcgKyANCi0gICAgICAgICcuanN0cmVlLXJ0bCBsaSBsaSB7IG1hcmdpbi1sZWZ0OjBweDsgbWFyZ2luLXJpZ2h0OjE4cHg7IH0gJyArIA0KLSAgICAgICAgJ2xpLmpzdHJlZS1vcGVuIHVsIHsgZGlzcGxheTpibG9jazsgfSAnICsgDQotICAgICAgICAnbGkuanN0cmVlLWNsb3NlZCB1bCB7IGRpc3BsYXk6bm9uZSAhaW1wb3J0YW50OyB9ICcgKyANCi0gICAgICAgICcuanN0cmVlIGxpIGEgeyBkaXNwbGF5OmlubGluZTsgYm9yZGVyLXdpZHRoOjAgIWltcG9ydGFudDsgcGFkZGluZzowcHggMnB4ICFpbXBvcnRhbnQ7IH0gJyArIA0KLSAgICAgICAgJy5qc3RyZWUgbGkgYSBpbnMgeyBoZWlnaHQ6MTZweDsgd2lkdGg6MTZweDsgbWFyZ2luLXJpZ2h0OjNweDsgfSAnICsgDQotICAgICAgICAnLmpzdHJlZS1ydGwgbGkgYSBpbnMgeyBtYXJnaW4tcmlnaHQ6MHB4OyBtYXJnaW4tbGVmdDozcHg7IH0gJzsNCi0gICAgfQ0KLSAgICAvLyBDb3JyZWN0IElFIDcgKHNoaWZ0cyBhbmNob3Igbm9kZXMgb25ob3ZlcikNCi0gICAgaWYoL21zaWUvLnRlc3QodSkgJiYgcGFyc2VJbnQodiwgMTApID09IDcpIHsgDQotICAgICAgY3NzX3N0cmluZyArPSAnLmpzdHJlZSBsaSBhIHsgYm9yZGVyLXdpZHRoOjAgIWltcG9ydGFudDsgcGFkZGluZzowcHggMnB4ICFpbXBvcnRhbnQ7IH0gJzsNCi0gICAgfQ0KLSAgICAkLnZha2F0YS5jc3MuYWRkX3NoZWV0KHsgc3RyIDogY3NzX3N0cmluZyB9KTsNCi0gIH0pOw0KLQ0KLSAgLy8gY29yZSBmdW5jdGlvbnMgKG9wZW4sIGNsb3NlLCBjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKQ0KLSAgJC5qc3RyZWUucGx1Z2luKCJjb3JlIiwgew0KLSAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgdGhpcy5kYXRhLmNvcmUudG9fb3BlbiA9ICQubWFwKCQubWFrZUFycmF5KHRoaXMuZ2V0X3NldHRpbmdzKCkuY29yZS5pbml0aWFsbHlfb3BlbiksIGZ1bmN0aW9uIChuKSB7IHJldHVybiAiIyIgKyBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXiMvLCIiKS5yZXBsYWNlKCdcXC8nLCcvJykucmVwbGFjZSgnLycsJ1xcLycpOyB9KTsNCi0gICAgfSwNCi0gICAgZGVmYXVsdHMgOiB7IA0KLSAgICAgIGh0bWxfdGl0bGVzICA6IGZhbHNlLA0KLSAgICAgIGFuaW1hdGlvbiAgOiA1MDAsDQotICAgICAgaW5pdGlhbGx5X29wZW4gOiBbXSwNCi0gICAgICBydGwgICAgICA6IGZhbHNlLA0KLSAgICAgIHN0cmluZ3MgICAgOiB7DQotICAgICAgICBsb2FkaW5nICAgIDogIkxvYWRpbmcgLi4uIiwNCi0gICAgICAgIG5ld19ub2RlICA6ICJOZXcgbm9kZSINCi0gICAgICB9DQotICAgIH0sDQotICAgIF9mbiA6IHsgDQotICAgICAgaW5pdCAgOiBmdW5jdGlvbiAoKSB7IA0KLSAgICAgICAgdGhpcy5zZXRfZm9jdXMoKTsgDQotICAgICAgICBpZih0aGlzLl9nZXRfc2V0dGluZ3MoKS5jb3JlLnJ0bCkgew0KLSAgICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKS5hZGRDbGFzcygianN0cmVlLXJ0bCIpLmNzcygiZGlyZWN0aW9uIiwgInJ0bCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkuaHRtbCgiPHVsPjxsaSBjbGFzcz0nanN0cmVlLWxhc3QganN0cmVlLWxlYWYnPjxpbnM+JiMxNjA7PC9pbnM+PGEgY2xhc3M9J2pzdHJlZS1sb2FkaW5nJyBocmVmPScjJz48aW5zIGNsYXNzPSdqc3RyZWUtaWNvbic+JiMxNjA7PC9pbnM+IiArIHRoaXMuX2dldF9zZXR0aW5ncygpLmNvcmUuc3RyaW5ncy5sb2FkaW5nICsgIjwvYT48L2xpPjwvdWw+Iik7DQotICAgICAgICB0aGlzLmRhdGEuY29yZS5saV9oZWlnaHQgPSB0aGlzLmdldF9jb250YWluZXIoKS5maW5kKCJ1bCBsaS5qc3RyZWUtY2xvc2VkLCB1bCBsaS5qc3RyZWUtbGVhZiIpLmVxKDApLmhlaWdodCgpIHx8IDE4Ow0KLQ0KLSAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkNCi0gICAgICAgICAgLmRlbGVnYXRlKCJsaSA+IGlucyIsICJjbGljay5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChldmVudCkgew0KLSAgICAgICAgICAgICAgdmFyIHRyZ3QgPSAkKGV2ZW50LnRhcmdldCk7DQotICAgICAgICAgICAgICBpZih0cmd0LmlzKCJpbnMiKSAmJiBldmVudC5wYWdlWSAtIHRyZ3Qub2Zmc2V0KCkudG9wIDwgdGhpcy5kYXRhLmNvcmUubGlfaGVpZ2h0KSB7IHRoaXMudG9nZ2xlX25vZGUodHJndCk7IH0NCi0gICAgICAgICAgICB9LCB0aGlzKSkNCi0gICAgICAgICAgLmJpbmQoIm1vdXNlZG93bi5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHsgDQotICAgICAgICAgICAgICB0aGlzLnNldF9mb2N1cygpOyAvLyBUaGlzIHVzZWQgdG8gYmUgc2V0VGltZW91dChzZXRfZm9jdXMsMCkgLSB3aHk/DQotICAgICAgICAgICAgfSwgdGhpcykpDQotICAgICAgICAgIC5iaW5kKCJkYmxjbGljay5qc3RyZWUiLCBmdW5jdGlvbiAoZXZlbnQpIHsgDQotICAgICAgICAgICAgdmFyIHNlbDsNCi0gICAgICAgICAgICBpZihkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KSB7IGRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSgpOyB9DQotICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICBpZih3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7DQotICAgICAgICAgICAgICAgIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsNCi0gICAgICAgICAgICAgICAgdHJ5IHsgDQotICAgICAgICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpOw0KLSAgICAgICAgICAgICAgICAgIHNlbC5jb2xsYXBzZSgpOw0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsgfQ0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSk7DQotICAgICAgICB0aGlzLl9fY2FsbGJhY2soKTsNCi0gICAgICAgIHRoaXMubG9hZF9ub2RlKC0xLCBmdW5jdGlvbiAoKSB7IHRoaXMubG9hZGVkKCk7IHRoaXMucmVvcGVuKCk7IH0pOw0KLSAgICAgIH0sDQotICAgICAgZGVzdHJveSAgOiBmdW5jdGlvbiAoKSB7IA0KLSAgICAgICAgdmFyIGksDQotICAgICAgICAgIG4gPSB0aGlzLmdldF9pbmRleCgpLA0KLSAgICAgICAgICBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCksDQotICAgICAgICAgIF90aGlzID0gdGhpczsNCi0NCi0gICAgICAgICQuZWFjaChzLnBsdWdpbnMsIGZ1bmN0aW9uIChpLCB2YWwpIHsNCi0gICAgICAgICAgdHJ5IHsgcGx1Z2luc1t2YWxdLl9fZGVzdHJveS5hcHBseShfdGhpcyk7IH0gY2F0Y2goZXJyKSB7IH0NCi0gICAgICAgIH0pOw0KLSAgICAgICAgdGhpcy5fX2NhbGxiYWNrKCk7DQotICAgICAgICAvLyBzZXQgZm9jdXMgdG8gYW5vdGhlciBpbnN0YW5jZSBpZiB0aGlzIG9uZSBpcyBmb2N1c2VkDQotICAgICAgICBpZih0aGlzLmlzX2ZvY3VzZWQoKSkgeyANCi0gICAgICAgICAgZm9yKGkgaW4gaW5zdGFuY2VzKSB7IA0KLSAgICAgICAgICAgIGlmKGluc3RhbmNlcy5oYXNPd25Qcm9wZXJ0eShpKSAmJiBpICE9IG4pIHsgDQotICAgICAgICAgICAgICBpbnN0YW5jZXNbaV0uc2V0X2ZvY3VzKCk7IA0KLSAgICAgICAgICAgICAgYnJlYWs7IA0KLSAgICAgICAgICAgIH0gDQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIC8vIGlmIG5vIG90aGVyIGluc3RhbmNlIGZvdW5kDQotICAgICAgICBpZihuID09PSBmb2N1c2VkX2luc3RhbmNlKSB7IGZvY3VzZWRfaW5zdGFuY2UgPSAtMTsgfQ0KLSAgICAgICAgLy8gcmVtb3ZlIGFsbCB0cmFjZXMgb2YganN0cmVlIGluIHRoZSBET00gKG9ubHkgdGhlIG9uZXMgc2V0IHVzaW5nIGpzdHJlZSopIGFuZCBjbGVhbnMgYWxsIGV2ZW50cw0KLSAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkNCi0gICAgICAgICAgLnVuYmluZCgiLmpzdHJlZSIpDQotICAgICAgICAgIC51bmRlbGVnYXRlKCIuanN0cmVlIikNCi0gICAgICAgICAgLnJlbW92ZURhdGEoImpzdHJlZS1pbnN0YW5jZS1pZCIpDQotICAgICAgICAgIC5maW5kKCJbY2xhc3NePSdqc3RyZWUnXSIpDQotICAgICAgICAgICAgLmFuZFNlbGYoKQ0KLSAgICAgICAgICAgIC5hdHRyKCJjbGFzcyIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoL2pzdHJlZVteIF0qfCQvaWcsJycpOyB9KTsNCi0gICAgICAgIC8vIHJlbW92ZSB0aGUgYWN0dWFsIGRhdGENCi0gICAgICAgIGluc3RhbmNlc1tuXSA9IG51bGw7DQotICAgICAgICBkZWxldGUgaW5zdGFuY2VzW25dOw0KLSAgICAgIH0sDQotICAgICAgc2F2ZV9vcGVuZWQgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KLSAgICAgICAgdGhpcy5kYXRhLmNvcmUudG9fb3BlbiA9IFtdOw0KLSAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkuZmluZCgiLmpzdHJlZS1vcGVuIikuZWFjaChmdW5jdGlvbiAoKSB7IA0KLSAgICAgICAgICBfdGhpcy5kYXRhLmNvcmUudG9fb3Blbi5wdXNoKCIjIiArIHRoaXMuaWQudG9TdHJpbmcoKS5yZXBsYWNlKC9eIy8sIiIpLnJlcGxhY2UoJ1xcLycsJy8nKS5yZXBsYWNlKCcvJywnXFwvJykpOyANCi0gICAgICAgIH0pOw0KLSAgICAgICAgdGhpcy5fX2NhbGxiYWNrKF90aGlzLmRhdGEuY29yZS50b19vcGVuKTsNCi0gICAgICB9LA0KLSAgICAgIHJlb3BlbiA6IGZ1bmN0aW9uIChpc19jYWxsYmFjaykgew0KLSAgICAgICAgdmFyIF90aGlzID0gdGhpcywNCi0gICAgICAgICAgZG9uZSA9IHRydWUsDQotICAgICAgICAgIGN1cnJlbnQgPSBbXSwNCi0gICAgICAgICAgcmVtYWluaW5nID0gW107DQotICAgICAgICBpZighaXNfY2FsbGJhY2spIHsgdGhpcy5kYXRhLmNvcmUucmVvcGVuID0gZmFsc2U7IHRoaXMuZGF0YS5jb3JlLnJlZnJlc2hpbmcgPSB0cnVlOyB9DQotICAgICAgICBpZih0aGlzLmRhdGEuY29yZS50b19vcGVuLmxlbmd0aCkgew0KLSAgICAgICAgICAkLmVhY2godGhpcy5kYXRhLmNvcmUudG9fb3BlbiwgZnVuY3Rpb24gKGksIHZhbCkgew0KLSAgICAgICAgICAgIGlmKHZhbCA9PSAiIyIpIHsgcmV0dXJuIHRydWU7IH0NCi0gICAgICAgICAgICBpZigkKHZhbCkubGVuZ3RoICYmICQodmFsKS5pcygiLmpzdHJlZS1jbG9zZWQiKSkgeyBjdXJyZW50LnB1c2godmFsKTsgfQ0KLSAgICAgICAgICAgIGVsc2UgeyByZW1haW5pbmcucHVzaCh2YWwpOyB9DQotICAgICAgICAgIH0pOw0KLSAgICAgICAgICBpZihjdXJyZW50Lmxlbmd0aCkgew0KLSAgICAgICAgICAgIHRoaXMuZGF0YS5jb3JlLnRvX29wZW4gPSByZW1haW5pbmc7DQotICAgICAgICAgICAgJC5lYWNoKGN1cnJlbnQsIGZ1bmN0aW9uIChpLCB2YWwpIHsgDQotICAgICAgICAgICAgICBfdGhpcy5vcGVuX25vZGUodmFsLCBmdW5jdGlvbiAoKSB7IF90aGlzLnJlb3Blbih0cnVlKTsgfSwgdHJ1ZSk7IA0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIGRvbmUgPSBmYWxzZTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoZG9uZSkgeyANCi0gICAgICAgICAgLy8gVE9ETzogZmluZCBhIG1vcmUgZWxlZ2FudCBhcHByb2FjaCB0byBzeW5jcm9uaXppbmcgcmV0dXJuaW5nIHJlcXVlc3RzDQotICAgICAgICAgIGlmKHRoaXMuZGF0YS5jb3JlLnJlb3BlbikgeyBjbGVhclRpbWVvdXQodGhpcy5kYXRhLmNvcmUucmVvcGVuKTsgfQ0KLSAgICAgICAgICB0aGlzLmRhdGEuY29yZS5yZW9wZW4gPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgX3RoaXMuX19jYWxsYmFjayh7fSwgX3RoaXMpOyB9LCA1MCk7DQotICAgICAgICAgIHRoaXMuZGF0YS5jb3JlLnJlZnJlc2hpbmcgPSBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICB9LA0KLSAgICAgIHJlZnJlc2ggOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KLSAgICAgICAgdGhpcy5zYXZlX29wZW5lZCgpOw0KLSAgICAgICAgaWYoIW9iaikgeyBvYmogPSAtMTsgfQ0KLSAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsNCi0gICAgICAgIGlmKCFvYmopIHsgb2JqID0gLTE7IH0NCi0gICAgICAgIGlmKG9iaiAhPT0gLTEpIHsgb2JqLmNoaWxkcmVuKCJVTCIpLnJlbW92ZSgpOyB9DQotICAgICAgICB0aGlzLmxvYWRfbm9kZShvYmosIGZ1bmN0aW9uICgpIHsgX3RoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqfSk7IF90aGlzLnJlb3BlbigpOyB9KTsNCi0gICAgICB9LA0KLSAgICAgIC8vIER1bW15IGZ1bmN0aW9uIHRvIGZpcmUgYWZ0ZXIgdGhlIGZpcnN0IGxvYWQgKHNvIHRoYXQgdGhlcmUgaXMgYSBqc3RyZWUubG9hZGVkIGV2ZW50KQ0KLSAgICAgIGxvYWRlZCAgOiBmdW5jdGlvbiAoKSB7IA0KLSAgICAgICAgdGhpcy5fX2NhbGxiYWNrKCk7IA0KLSAgICAgIH0sDQotICAgICAgLy8gZGVhbCB3aXRoIGZvY3VzDQotICAgICAgc2V0X2ZvY3VzICA6IGZ1bmN0aW9uICgpIHsgDQotICAgICAgICB2YXIgZiA9ICQuanN0cmVlLl9mb2N1c2VkKCk7DQotICAgICAgICBpZihmICYmIGYgIT09IHRoaXMpIHsNCi0gICAgICAgICAgZi5nZXRfY29udGFpbmVyKCkucmVtb3ZlQ2xhc3MoImpzdHJlZS1mb2N1c2VkIik7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoZiAhPT0gdGhpcykgew0KLSAgICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKS5hZGRDbGFzcygianN0cmVlLWZvY3VzZWQiKTsgDQotICAgICAgICAgIGZvY3VzZWRfaW5zdGFuY2UgPSB0aGlzLmdldF9pbmRleCgpOyANCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuX19jYWxsYmFjaygpOw0KLSAgICAgIH0sDQotICAgICAgaXNfZm9jdXNlZCAgOiBmdW5jdGlvbiAoKSB7IA0KLSAgICAgICAgcmV0dXJuIGZvY3VzZWRfaW5zdGFuY2UgPT0gdGhpcy5nZXRfaW5kZXgoKTsgDQotICAgICAgfSwNCi0NCi0gICAgICAvLyB0cmF2ZXJzZQ0KLSAgICAgIF9nZXRfbm9kZSAgICA6IGZ1bmN0aW9uIChvYmopIHsgDQotICAgICAgICB2YXIgJG9iaiA9ICQob2JqLCB0aGlzLmdldF9jb250YWluZXIoKSk7IA0KLSAgICAgICAgaWYoJG9iai5pcygiLmpzdHJlZSIpIHx8IG9iaiA9PSAtMSkgeyByZXR1cm4gLTE7IH0gDQotICAgICAgICAkb2JqID0gJG9iai5jbG9zZXN0KCJsaSIsIHRoaXMuZ2V0X2NvbnRhaW5lcigpKTsgDQotICAgICAgICByZXR1cm4gJG9iai5sZW5ndGggPyAkb2JqIDogZmFsc2U7IA0KLSAgICAgIH0sDQotICAgICAgX2dldF9uZXh0ICAgIDogZnVuY3Rpb24gKG9iaiwgc3RyaWN0KSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYob2JqID09PSAtMSkgeyByZXR1cm4gdGhpcy5nZXRfY29udGFpbmVyKCkuZmluZCgiPiB1bCA+IGxpOmZpcnN0LWNoaWxkIik7IH0NCi0gICAgICAgIGlmKCFvYmoubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgaWYoc3RyaWN0KSB7IHJldHVybiAob2JqLm5leHRBbGwoImxpIikuc2l6ZSgpID4gMCkgPyBvYmoubmV4dEFsbCgibGk6ZXEoMCkiKSA6IGZhbHNlOyB9DQotDQotICAgICAgICBpZihvYmouaGFzQ2xhc3MoImpzdHJlZS1vcGVuIikpIHsgcmV0dXJuIG9iai5maW5kKCJsaTplcSgwKSIpOyB9DQotICAgICAgICBlbHNlIGlmKG9iai5uZXh0QWxsKCJsaSIpLnNpemUoKSA+IDApIHsgcmV0dXJuIG9iai5uZXh0QWxsKCJsaTplcSgwKSIpOyB9DQotICAgICAgICBlbHNlIHsgcmV0dXJuIG9iai5wYXJlbnRzVW50aWwoIi5qc3RyZWUiLCJsaSIpLm5leHQoImxpIikuZXEoMCk7IH0NCi0gICAgICB9LA0KLSAgICAgIF9nZXRfcHJldiAgICA6IGZ1bmN0aW9uIChvYmosIHN0cmljdCkgew0KLSAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsNCi0gICAgICAgIGlmKG9iaiA9PT0gLTEpIHsgcmV0dXJuIHRoaXMuZ2V0X2NvbnRhaW5lcigpLmZpbmQoIj4gdWwgPiBsaTpsYXN0LWNoaWxkIik7IH0NCi0gICAgICAgIGlmKCFvYmoubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgaWYoc3RyaWN0KSB7IHJldHVybiAob2JqLnByZXZBbGwoImxpIikubGVuZ3RoID4gMCkgPyBvYmoucHJldkFsbCgibGk6ZXEoMCkiKSA6IGZhbHNlOyB9DQotDQotICAgICAgICBpZihvYmoucHJldigibGkiKS5sZW5ndGgpIHsNCi0gICAgICAgICAgb2JqID0gb2JqLnByZXYoImxpIikuZXEoMCk7DQotICAgICAgICAgIHdoaWxlKG9iai5oYXNDbGFzcygianN0cmVlLW9wZW4iKSkgeyBvYmogPSBvYmouY2hpbGRyZW4oInVsOmVxKDApIikuY2hpbGRyZW4oImxpOmxhc3QiKTsgfQ0KLSAgICAgICAgICByZXR1cm4gb2JqOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7IHZhciBvID0gb2JqLnBhcmVudHNVbnRpbCgiLmpzdHJlZSIsImxpOmVxKDApIik7IHJldHVybiBvLmxlbmd0aCA/IG8gOiBmYWxzZTsgfQ0KLSAgICAgIH0sDQotICAgICAgX2dldF9wYXJlbnQgICAgOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYob2JqID09IC0xIHx8ICFvYmoubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgdmFyIG8gPSBvYmoucGFyZW50c1VudGlsKCIuanN0cmVlIiwgImxpOmVxKDApIik7DQotICAgICAgICByZXR1cm4gby5sZW5ndGggPyBvIDogLTE7DQotICAgICAgfSwNCi0gICAgICBfZ2V0X2NoaWxkcmVuICA6IGZ1bmN0aW9uIChvYmopIHsNCi0gICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICBpZihvYmogPT09IC0xKSB7IHJldHVybiB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWw6ZXEoMCkiKS5jaGlsZHJlbigibGkiKTsgfQ0KLSAgICAgICAgaWYoIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICByZXR1cm4gb2JqLmNoaWxkcmVuKCJ1bDplcSgwKSIpLmNoaWxkcmVuKCJsaSIpOw0KLSAgICAgIH0sDQotICAgICAgZ2V0X3BhdGggICAgOiBmdW5jdGlvbiAob2JqLCBpZF9tb2RlKSB7DQotICAgICAgICB2YXIgcCA9IFtdLA0KLSAgICAgICAgICBfdGhpcyA9IHRoaXM7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYob2JqID09PSAtMSB8fCAhb2JqIHx8ICFvYmoubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgb2JqLnBhcmVudHNVbnRpbCgiLmpzdHJlZSIsICJsaSIpLmVhY2goZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICBwLnB1c2goIGlkX21vZGUgPyB0aGlzLmlkIDogX3RoaXMuZ2V0X3RleHQodGhpcykgKTsNCi0gICAgICAgIH0pOw0KLSAgICAgICAgcC5yZXZlcnNlKCk7DQotICAgICAgICBwLnB1c2goIGlkX21vZGUgPyBvYmouYXR0cigiaWQiKSA6IHRoaXMuZ2V0X3RleHQob2JqKSApOw0KLSAgICAgICAgcmV0dXJuIHA7DQotICAgICAgfSwNCi0NCi0gICAgICBpc19vcGVuICAgIDogZnVuY3Rpb24gKG9iaikgeyBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOyByZXR1cm4gb2JqICYmIG9iaiAhPT0gLTEgJiYgb2JqLmhhc0NsYXNzKCJqc3RyZWUtb3BlbiIpOyB9LA0KLSAgICAgIGlzX2Nsb3NlZCAgOiBmdW5jdGlvbiAob2JqKSB7IG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7IHJldHVybiBvYmogJiYgb2JqICE9PSAtMSAmJiBvYmouaGFzQ2xhc3MoImpzdHJlZS1jbG9zZWQiKTsgfSwNCi0gICAgICBpc19sZWFmICAgIDogZnVuY3Rpb24gKG9iaikgeyBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOyByZXR1cm4gb2JqICYmIG9iaiAhPT0gLTEgJiYgb2JqLmhhc0NsYXNzKCJqc3RyZWUtbGVhZiIpOyB9LA0KLSAgICAgIC8vIG9wZW4vY2xvc2UNCi0gICAgICBvcGVuX25vZGUgIDogZnVuY3Rpb24gKG9iaiwgY2FsbGJhY2ssIHNraXBfYW5pbWF0aW9uKSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYoIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICBpZighb2JqLmhhc0NsYXNzKCJqc3RyZWUtY2xvc2VkIikpIHsgaWYoY2FsbGJhY2spIHsgY2FsbGJhY2suY2FsbCgpOyB9IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgdmFyIHMgPSBza2lwX2FuaW1hdGlvbiB8fCBpc19pZTYgPyAwIDogdGhpcy5fZ2V0X3NldHRpbmdzKCkuY29yZS5hbmltYXRpb24sDQotICAgICAgICAgIHQgPSB0aGlzOw0KLSAgICAgICAgaWYoIXRoaXMuX2lzX2xvYWRlZChvYmopKSB7DQotICAgICAgICAgIG9iai5jaGlsZHJlbigiYSIpLmFkZENsYXNzKCJqc3RyZWUtbG9hZGluZyIpOw0KLSAgICAgICAgICB0aGlzLmxvYWRfbm9kZShvYmosIGZ1bmN0aW9uICgpIHsgdC5vcGVuX25vZGUob2JqLCBjYWxsYmFjaywgc2tpcF9hbmltYXRpb24pOyB9LCBjYWxsYmFjayk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgaWYocykgeyBvYmouY2hpbGRyZW4oInVsIikuY3NzKCJkaXNwbGF5Iiwibm9uZSIpOyB9DQotICAgICAgICAgIG9iai5yZW1vdmVDbGFzcygianN0cmVlLWNsb3NlZCIpLmFkZENsYXNzKCJqc3RyZWUtb3BlbiIpLmNoaWxkcmVuKCJhIikucmVtb3ZlQ2xhc3MoImpzdHJlZS1sb2FkaW5nIik7DQotICAgICAgICAgIGlmKHMpIHsgb2JqLmNoaWxkcmVuKCJ1bCIpLnN0b3AodHJ1ZSkuc2xpZGVEb3duKHMsIGZ1bmN0aW9uICgpIHsgdGhpcy5zdHlsZS5kaXNwbGF5ID0gIiI7IH0pOyB9DQotICAgICAgICAgIHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqIH0pOw0KLSAgICAgICAgICBpZihjYWxsYmFjaykgeyBjYWxsYmFjay5jYWxsKCk7IH0NCi0gICAgICAgIH0NCi0gICAgICB9LA0KLSAgICAgIGNsb3NlX25vZGUgIDogZnVuY3Rpb24gKG9iaiwgc2tpcF9hbmltYXRpb24pIHsNCi0gICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICB2YXIgcyA9IHNraXBfYW5pbWF0aW9uIHx8IGlzX2llNiA/IDAgOiB0aGlzLl9nZXRfc2V0dGluZ3MoKS5jb3JlLmFuaW1hdGlvbjsNCi0gICAgICAgIGlmKCFvYmoubGVuZ3RoIHx8ICFvYmouaGFzQ2xhc3MoImpzdHJlZS1vcGVuIikpIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICBpZihzKSB7IG9iai5jaGlsZHJlbigidWwiKS5hdHRyKCJzdHlsZSIsImRpc3BsYXk6YmxvY2sgIWltcG9ydGFudCIpOyB9DQotICAgICAgICBvYmoucmVtb3ZlQ2xhc3MoImpzdHJlZS1vcGVuIikuYWRkQ2xhc3MoImpzdHJlZS1jbG9zZWQiKTsNCi0gICAgICAgIGlmKHMpIHsgb2JqLmNoaWxkcmVuKCJ1bCIpLnN0b3AodHJ1ZSkuc2xpZGVVcChzLCBmdW5jdGlvbiAoKSB7IHRoaXMuc3R5bGUuZGlzcGxheSA9ICIiOyB9KTsgfQ0KLSAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7DQotICAgICAgfSwNCi0gICAgICB0b2dnbGVfbm9kZSAgOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYob2JqLmhhc0NsYXNzKCJqc3RyZWUtY2xvc2VkIikpIHsgcmV0dXJuIHRoaXMub3Blbl9ub2RlKG9iaik7IH0NCi0gICAgICAgIGlmKG9iai5oYXNDbGFzcygianN0cmVlLW9wZW4iKSkgeyByZXR1cm4gdGhpcy5jbG9zZV9ub2RlKG9iaik7IH0NCi0gICAgICB9LA0KLSAgICAgIG9wZW5fYWxsICA6IGZ1bmN0aW9uIChvYmosIG9yaWdpbmFsX29iaikgew0KLSAgICAgICAgb2JqID0gb2JqID8gdGhpcy5fZ2V0X25vZGUob2JqKSA6IHRoaXMuZ2V0X2NvbnRhaW5lcigpOw0KLSAgICAgICAgaWYoIW9iaiB8fCBvYmogPT09IC0xKSB7IG9iaiA9IHRoaXMuZ2V0X2NvbnRhaW5lcigpOyB9DQotICAgICAgICBpZihvcmlnaW5hbF9vYmopIHsgDQotICAgICAgICAgIG9iaiA9IG9iai5maW5kKCJsaS5qc3RyZWUtY2xvc2VkIik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgb3JpZ2luYWxfb2JqID0gb2JqOw0KLSAgICAgICAgICBpZihvYmouaXMoIi5qc3RyZWUtY2xvc2VkIikpIHsgb2JqID0gb2JqLmZpbmQoImxpLmpzdHJlZS1jbG9zZWQiKS5hbmRTZWxmKCk7IH0NCi0gICAgICAgICAgZWxzZSB7IG9iaiA9IG9iai5maW5kKCJsaS5qc3RyZWUtY2xvc2VkIik7IH0NCi0gICAgICAgIH0NCi0gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQotICAgICAgICBvYmouZWFjaChmdW5jdGlvbiAoKSB7IA0KLSAgICAgICAgICB2YXIgX190aGlzID0gdGhpczsgDQotICAgICAgICAgIGlmKCFfdGhpcy5faXNfbG9hZGVkKHRoaXMpKSB7IF90aGlzLm9wZW5fbm9kZSh0aGlzLCBmdW5jdGlvbigpIHsgX3RoaXMub3Blbl9hbGwoX190aGlzLCBvcmlnaW5hbF9vYmopOyB9LCB0cnVlKTsgfQ0KLSAgICAgICAgICBlbHNlIHsgX3RoaXMub3Blbl9ub2RlKHRoaXMsIGZhbHNlLCB0cnVlKTsgfQ0KLSAgICAgICAgfSk7DQotICAgICAgICAvLyBzbyB0aGF0IGNhbGxiYWNrIGlzIGZpcmVkIEFGVEVSIGFsbCBub2RlcyBhcmUgb3Blbg0KLSAgICAgICAgaWYob3JpZ2luYWxfb2JqLmZpbmQoJ2xpLmpzdHJlZS1jbG9zZWQnKS5sZW5ndGggPT09IDApIHsgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvcmlnaW5hbF9vYmogfSk7IH0NCi0gICAgICB9LA0KLSAgICAgIGNsb3NlX2FsbCAgOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KLSAgICAgICAgb2JqID0gb2JqID8gdGhpcy5fZ2V0X25vZGUob2JqKSA6IHRoaXMuZ2V0X2NvbnRhaW5lcigpOw0KLSAgICAgICAgaWYoIW9iaiB8fCBvYmogPT09IC0xKSB7IG9iaiA9IHRoaXMuZ2V0X2NvbnRhaW5lcigpOyB9DQotICAgICAgICBvYmouZmluZCgibGkuanN0cmVlLW9wZW4iKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbiAoKSB7IF90aGlzLmNsb3NlX25vZGUodGhpcyk7IH0pOw0KLSAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7DQotICAgICAgfSwNCi0gICAgICBjbGVhbl9ub2RlICA6IGZ1bmN0aW9uIChvYmopIHsNCi0gICAgICAgIG9iaiA9IG9iaiAmJiBvYmogIT0gLTEgPyAkKG9iaikgOiB0aGlzLmdldF9jb250YWluZXIoKTsNCi0gICAgICAgIG9iaiA9IG9iai5pcygibGkiKSA/IG9iai5maW5kKCJsaSIpLmFuZFNlbGYoKSA6IG9iai5maW5kKCJsaSIpOw0KLSAgICAgICAgb2JqLnJlbW92ZUNsYXNzKCJqc3RyZWUtbGFzdCIpDQotICAgICAgICAgIC5maWx0ZXIoImxpOmxhc3QtY2hpbGQiKS5hZGRDbGFzcygianN0cmVlLWxhc3QiKS5lbmQoKQ0KLSAgICAgICAgICAuZmlsdGVyKCI6aGFzKGxpKSIpDQotICAgICAgICAgICAgLm5vdCgiLmpzdHJlZS1vcGVuIikucmVtb3ZlQ2xhc3MoImpzdHJlZS1sZWFmIikuYWRkQ2xhc3MoImpzdHJlZS1jbG9zZWQiKTsNCi0gICAgICAgIG9iai5ub3QoIi5qc3RyZWUtb3BlbiwgLmpzdHJlZS1jbG9zZWQiKS5hZGRDbGFzcygianN0cmVlLWxlYWYiKS5jaGlsZHJlbigidWwiKS5yZW1vdmUoKTsNCi0gICAgICAgIHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqIH0pOw0KLSAgICAgIH0sDQotICAgICAgLy8gcm9sbGJhY2sNCi0gICAgICBnZXRfcm9sbGJhY2sgOiBmdW5jdGlvbiAoKSB7IA0KLSAgICAgICAgdGhpcy5fX2NhbGxiYWNrKCk7DQotICAgICAgICByZXR1cm4geyBpIDogdGhpcy5nZXRfaW5kZXgoKSwgaCA6IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmNsb25lKHRydWUpLCBkIDogdGhpcy5kYXRhIH07IA0KLSAgICAgIH0sDQotICAgICAgc2V0X3JvbGxiYWNrIDogZnVuY3Rpb24gKGh0bWwsIGRhdGEpIHsNCi0gICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpLmVtcHR5KCkuYXBwZW5kKGh0bWwpOw0KLSAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsNCi0gICAgICAgIHRoaXMuX19jYWxsYmFjaygpOw0KLSAgICAgIH0sDQotICAgICAgLy8gRHVtbXkgZnVuY3Rpb25zIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IGFueSBkYXRhc3RvcmUgcGx1Z2luIGluY2x1ZGVkDQotICAgICAgbG9hZF9ub2RlICA6IGZ1bmN0aW9uIChvYmosIHNfY2FsbCwgZV9jYWxsKSB7IHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqIH0pOyB9LA0KLSAgICAgIF9pc19sb2FkZWQgIDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHJ1ZTsgfSwNCi0NCi0gICAgICAvLyBCYXNpYyBvcGVyYXRpb25zOiBjcmVhdGUNCi0gICAgICBjcmVhdGVfbm9kZSAgOiBmdW5jdGlvbiAob2JqLCBwb3NpdGlvbiwganMsIGNhbGxiYWNrLCBpc19sb2FkZWQpIHsNCi0gICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICBwb3NpdGlvbiA9IHR5cGVvZiBwb3NpdGlvbiA9PT0gInVuZGVmaW5lZCIgPyAibGFzdCIgOiBwb3NpdGlvbjsNCi0gICAgICAgIHZhciBkID0gJCgiPGxpPiIpLA0KLSAgICAgICAgICBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuY29yZSwNCi0gICAgICAgICAgdG1wOw0KLQ0KLSAgICAgICAgaWYob2JqICE9PSAtMSAmJiAhb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIGlmKCFpc19sb2FkZWQgJiYgIXRoaXMuX2lzX2xvYWRlZChvYmopKSB7IHRoaXMubG9hZF9ub2RlKG9iaiwgZnVuY3Rpb24gKCkgeyB0aGlzLmNyZWF0ZV9ub2RlKG9iaiwgcG9zaXRpb24sIGpzLCBjYWxsYmFjaywgdHJ1ZSk7IH0pOyByZXR1cm4gZmFsc2U7IH0NCi0NCi0gICAgICAgIHRoaXMuX19yb2xsYmFjaygpOw0KLQ0KLSAgICAgICAgaWYodHlwZW9mIGpzID09PSAic3RyaW5nIikgeyBqcyA9IHsgImRhdGEiIDoganMgfTsgfQ0KLSAgICAgICAgaWYoIWpzKSB7IGpzID0ge307IH0NCi0gICAgICAgIGlmKGpzLmF0dHIpIHsgZC5hdHRyKGpzLmF0dHIpOyB9DQotICAgICAgICBpZihqcy5zdGF0ZSkgeyBkLmFkZENsYXNzKCJqc3RyZWUtIiArIGpzLnN0YXRlKTsgfQ0KLSAgICAgICAgaWYoIWpzLmRhdGEpIHsganMuZGF0YSA9IHMuc3RyaW5ncy5uZXdfbm9kZTsgfQ0KLSAgICAgICAgaWYoISQuaXNBcnJheShqcy5kYXRhKSkgeyB0bXAgPSBqcy5kYXRhOyBqcy5kYXRhID0gW107IGpzLmRhdGEucHVzaCh0bXApOyB9DQotICAgICAgICAkLmVhY2goanMuZGF0YSwgZnVuY3Rpb24gKGksIG0pIHsNCi0gICAgICAgICAgdG1wID0gJCgiPGE+Iik7DQotICAgICAgICAgIGlmKCQuaXNGdW5jdGlvbihtKSkgeyBtID0gbS5jYWxsKHRoaXMsIGpzKTsgfQ0KLSAgICAgICAgICBpZih0eXBlb2YgbSA9PSAic3RyaW5nIikgeyB0bXAuYXR0cignaHJlZicsJyMnKVsgcy5odG1sX3RpdGxlcyA/ICJodG1sIiA6ICJ0ZXh0IiBdKG0pOyB9DQotICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIGlmKCFtLmF0dHIpIHsgbS5hdHRyID0ge307IH0NCi0gICAgICAgICAgICBpZighbS5hdHRyLmhyZWYpIHsgbS5hdHRyLmhyZWYgPSAnIyc7IH0NCi0gICAgICAgICAgICB0bXAuYXR0cihtLmF0dHIpWyBzLmh0bWxfdGl0bGVzID8gImh0bWwiIDogInRleHQiIF0obS50aXRsZSk7DQotICAgICAgICAgICAgaWYobS5sYW5ndWFnZSkgeyB0bXAuYWRkQ2xhc3MobS5sYW5ndWFnZSk7IH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0bXAucHJlcGVuZCgiPGlucyBjbGFzcz0nanN0cmVlLWljb24nPiYjMTYwOzwvaW5zPiIpOw0KLSAgICAgICAgICBpZihtLmljb24pIHsgDQotICAgICAgICAgICAgaWYobS5pY29uLmluZGV4T2YoIi8iKSA9PT0gLTEpIHsgdG1wLmNoaWxkcmVuKCJpbnMiKS5hZGRDbGFzcyhtLmljb24pOyB9DQotICAgICAgICAgICAgZWxzZSB7IHRtcC5jaGlsZHJlbigiaW5zIikuY3NzKCJiYWNrZ3JvdW5kIiwidXJsKCciICsgbS5pY29uICsgIicpIGNlbnRlciBjZW50ZXIgbm8tcmVwZWF0Iik7IH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBkLmFwcGVuZCh0bXApOw0KLSAgICAgICAgfSk7DQotICAgICAgICBkLnByZXBlbmQoIjxpbnMgY2xhc3M9J2pzdHJlZS1pY29uJz4mIzE2MDs8L2lucz4iKTsNCi0gICAgICAgIGlmKG9iaiA9PT0gLTEpIHsNCi0gICAgICAgICAgb2JqID0gdGhpcy5nZXRfY29udGFpbmVyKCk7DQotICAgICAgICAgIGlmKHBvc2l0aW9uID09PSAiYmVmb3JlIikgeyBwb3NpdGlvbiA9ICJmaXJzdCI7IH0NCi0gICAgICAgICAgaWYocG9zaXRpb24gPT09ICJhZnRlciIpIHsgcG9zaXRpb24gPSAibGFzdCI7IH0NCi0gICAgICAgIH0NCi0gICAgICAgIHN3aXRjaChwb3NpdGlvbikgew0KLSAgICAgICAgICBjYXNlICJiZWZvcmUiOiBvYmouYmVmb3JlKGQpOyB0bXAgPSB0aGlzLl9nZXRfcGFyZW50KG9iaik7IGJyZWFrOw0KLSAgICAgICAgICBjYXNlICJhZnRlciIgOiBvYmouYWZ0ZXIoZCk7ICB0bXAgPSB0aGlzLl9nZXRfcGFyZW50KG9iaik7IGJyZWFrOw0KLSAgICAgICAgICBjYXNlICJpbnNpZGUiOg0KLSAgICAgICAgICBjYXNlICJmaXJzdCIgOg0KLSAgICAgICAgICAgIGlmKCFvYmouY2hpbGRyZW4oInVsIikubGVuZ3RoKSB7IG9iai5hcHBlbmQoIjx1bD4iKTsgfQ0KLSAgICAgICAgICAgIG9iai5jaGlsZHJlbigidWwiKS5wcmVwZW5kKGQpOw0KLSAgICAgICAgICAgIHRtcCA9IG9iajsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgY2FzZSAibGFzdCI6DQotICAgICAgICAgICAgaWYoIW9iai5jaGlsZHJlbigidWwiKS5sZW5ndGgpIHsgb2JqLmFwcGVuZCgiPHVsPiIpOyB9DQotICAgICAgICAgICAgb2JqLmNoaWxkcmVuKCJ1bCIpLmFwcGVuZChkKTsNCi0gICAgICAgICAgICB0bXAgPSBvYmo7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgaWYoIW9iai5jaGlsZHJlbigidWwiKS5sZW5ndGgpIHsgb2JqLmFwcGVuZCgiPHVsPiIpOyB9DQotICAgICAgICAgICAgaWYoIXBvc2l0aW9uKSB7IHBvc2l0aW9uID0gMDsgfQ0KLSAgICAgICAgICAgIHRtcCA9IG9iai5jaGlsZHJlbigidWwiKS5jaGlsZHJlbigibGkiKS5lcShwb3NpdGlvbik7DQotICAgICAgICAgICAgaWYodG1wLmxlbmd0aCkgeyB0bXAuYmVmb3JlKGQpOyB9DQotICAgICAgICAgICAgZWxzZSB7IG9iai5jaGlsZHJlbigidWwiKS5hcHBlbmQoZCk7IH0NCi0gICAgICAgICAgICB0bXAgPSBvYmo7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpZih0bXAgPT09IC0xIHx8IHRtcC5nZXQoMCkgPT09IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmdldCgwKSkgeyB0bXAgPSAtMTsgfQ0KLSAgICAgICAgdGhpcy5jbGVhbl9ub2RlKHRtcCk7DQotICAgICAgICB0aGlzLl9fY2FsbGJhY2soeyAib2JqIiA6IGQsICJwYXJlbnQiIDogdG1wIH0pOw0KLSAgICAgICAgaWYoY2FsbGJhY2spIHsgY2FsbGJhY2suY2FsbCh0aGlzLCBkKTsgfQ0KLSAgICAgICAgcmV0dXJuIGQ7DQotICAgICAgfSwNCi0gICAgICAvLyBCYXNpYyBvcGVyYXRpb25zOiByZW5hbWUgKGRlYWwgd2l0aCB0ZXh0KQ0KLSAgICAgIGdldF90ZXh0ICA6IGZ1bmN0aW9uIChvYmopIHsNCi0gICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICBpZighb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuY29yZS5odG1sX3RpdGxlczsNCi0gICAgICAgIG9iaiA9IG9iai5jaGlsZHJlbigiYTplcSgwKSIpOw0KLSAgICAgICAgaWYocykgew0KLSAgICAgICAgICBvYmogPSBvYmouY2xvbmUoKTsNCi0gICAgICAgICAgb2JqLmNoaWxkcmVuKCJJTlMiKS5yZW1vdmUoKTsNCi0gICAgICAgICAgcmV0dXJuIG9iai5odG1sKCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgb2JqID0gb2JqLmNvbnRlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5ub2RlVHlwZSA9PSAzOyB9KVswXTsNCi0gICAgICAgICAgcmV0dXJuIG9iai5ub2RlVmFsdWU7DQotICAgICAgICB9DQotICAgICAgfSwNCi0gICAgICBzZXRfdGV4dCAgOiBmdW5jdGlvbiAob2JqLCB2YWwpIHsNCi0gICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICBpZighb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIG9iaiA9IG9iai5jaGlsZHJlbigiYTplcSgwKSIpOw0KLSAgICAgICAgaWYodGhpcy5fZ2V0X3NldHRpbmdzKCkuY29yZS5odG1sX3RpdGxlcykgew0KLSAgICAgICAgICB2YXIgdG1wID0gb2JqLmNoaWxkcmVuKCJJTlMiKS5jbG9uZSgpOw0KLSAgICAgICAgICBvYmouaHRtbCh2YWwpLnByZXBlbmQodG1wKTsNCi0gICAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmosICJuYW1lIiA6IHZhbCB9KTsNCi0gICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgb2JqID0gb2JqLmNvbnRlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5ub2RlVHlwZSA9PSAzOyB9KVswXTsNCi0gICAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmosICJuYW1lIiA6IHZhbCB9KTsNCi0gICAgICAgICAgcmV0dXJuIChvYmoubm9kZVZhbHVlID0gdmFsKTsNCi0gICAgICAgIH0NCi0gICAgICB9LA0KLSAgICAgIHJlbmFtZV9ub2RlIDogZnVuY3Rpb24gKG9iaiwgdmFsKSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgdGhpcy5fX3JvbGxiYWNrKCk7DQotICAgICAgICBpZihvYmogJiYgb2JqLmxlbmd0aCAmJiB0aGlzLnNldF90ZXh0LmFwcGx5KHRoaXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKSB7IHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqLCAibmFtZSIgOiB2YWwgfSk7IH0NCi0gICAgICB9LA0KLSAgICAgIC8vIEJhc2ljIG9wZXJhdGlvbnM6IGRlbGV0aW5nIG5vZGVzDQotICAgICAgZGVsZXRlX25vZGUgOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYoIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICB0aGlzLl9fcm9sbGJhY2soKTsNCi0gICAgICAgIHZhciBwID0gdGhpcy5fZ2V0X3BhcmVudChvYmopLCBwcmV2ID0gdGhpcy5fZ2V0X3ByZXYob2JqKTsNCi0gICAgICAgIG9iaiA9IG9iai5yZW1vdmUoKTsNCi0gICAgICAgIGlmKHAgIT09IC0xICYmIHAuZmluZCgiPiB1bCA+IGxpIikubGVuZ3RoID09PSAwKSB7DQotICAgICAgICAgIHAucmVtb3ZlQ2xhc3MoImpzdHJlZS1vcGVuIGpzdHJlZS1jbG9zZWQiKS5hZGRDbGFzcygianN0cmVlLWxlYWYiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuY2xlYW5fbm9kZShwKTsNCi0gICAgICAgIHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqLCAicHJldiIgOiBwcmV2IH0pOw0KLSAgICAgICAgcmV0dXJuIG9iajsNCi0gICAgICB9LA0KLSAgICAgIHByZXBhcmVfbW92ZSA6IGZ1bmN0aW9uIChvLCByLCBwb3MsIGNiLCBpc19jYikgew0KLSAgICAgICAgdmFyIHAgPSB7fTsNCi0NCi0gICAgICAgIHAub3QgPSAkLmpzdHJlZS5fcmVmZXJlbmNlKHAubykgfHwgdGhpczsNCi0gICAgICAgIHAubyA9IHAub3QuX2dldF9ub2RlKG8pOw0KLSAgICAgICAgcC5yID0gciA9PT0gLSAxID8gLTEgOiB0aGlzLl9nZXRfbm9kZShyKTsNCi0gICAgICAgIHAucCA9ICh0eXBlb2YgcCA9PT0gInVuZGVmaW5lZCIpID8gImxhc3QiIDogcG9zOyAvLyBUT0RPOiBtb3ZlIHRvIGEgc2V0dGluZw0KLSAgICAgICAgaWYoIWlzX2NiICYmIHByZXBhcmVkX21vdmUubyAmJiBwcmVwYXJlZF9tb3ZlLm9bMF0gPT09IHAub1swXSAmJiBwcmVwYXJlZF9tb3ZlLnJbMF0gPT09IHAuclswXSAmJiBwcmVwYXJlZF9tb3ZlLnAgPT09IHAucCkgew0KLSAgICAgICAgICB0aGlzLl9fY2FsbGJhY2socHJlcGFyZWRfbW92ZSk7DQotICAgICAgICAgIGlmKGNiKSB7IGNiLmNhbGwodGhpcywgcHJlcGFyZWRfbW92ZSk7IH0NCi0gICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcC5vdCA9ICQuanN0cmVlLl9yZWZlcmVuY2UocC5vKSB8fCB0aGlzOw0KLSAgICAgICAgcC5ydCA9IHIgPT09IC0xID8gcC5vdCA6ICQuanN0cmVlLl9yZWZlcmVuY2UocC5yKSB8fCB0aGlzOw0KLSAgICAgICAgaWYocC5yID09PSAtMSkgew0KLSAgICAgICAgICBwLmNyID0gLTE7DQotICAgICAgICAgIHN3aXRjaChwLnApIHsNCi0gICAgICAgICAgICBjYXNlICJmaXJzdCI6DQotICAgICAgICAgICAgY2FzZSAiYmVmb3JlIjoNCi0gICAgICAgICAgICBjYXNlICJpbnNpZGUiOg0KLSAgICAgICAgICAgICAgcC5jcCA9IDA7IA0KLSAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAiYWZ0ZXIiOg0KLSAgICAgICAgICAgIGNhc2UgImxhc3QiOg0KLSAgICAgICAgICAgICAgcC5jcCA9IHAucnQuZ2V0X2NvbnRhaW5lcigpLmZpbmQoIiA+IHVsID4gbGkiKS5sZW5ndGg7IA0KLSAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgIHAuY3AgPSBwLnA7DQotICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgIGlmKCEvXihiZWZvcmV8YWZ0ZXIpJC8udGVzdChwLnApICYmICF0aGlzLl9pc19sb2FkZWQocC5yKSkgew0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRfbm9kZShwLnIsIGZ1bmN0aW9uICgpIHsgdGhpcy5wcmVwYXJlX21vdmUobywgciwgcG9zLCBjYiwgdHJ1ZSk7IH0pOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHN3aXRjaChwLnApIHsNCi0gICAgICAgICAgICBjYXNlICJiZWZvcmUiOg0KLSAgICAgICAgICAgICAgcC5jcCA9IHAuci5pbmRleCgpOw0KLSAgICAgICAgICAgICAgcC5jciA9IHAucnQuX2dldF9wYXJlbnQocC5yKTsNCi0gICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgImFmdGVyIjoNCi0gICAgICAgICAgICAgIHAuY3AgPSBwLnIuaW5kZXgoKSArIDE7DQotICAgICAgICAgICAgICBwLmNyID0gcC5ydC5fZ2V0X3BhcmVudChwLnIpOw0KLSAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSAiaW5zaWRlIjoNCi0gICAgICAgICAgICBjYXNlICJmaXJzdCI6DQotICAgICAgICAgICAgICBwLmNwID0gMDsNCi0gICAgICAgICAgICAgIHAuY3IgPSBwLnI7DQotICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICJsYXN0IjoNCi0gICAgICAgICAgICAgIHAuY3AgPSBwLnIuZmluZCgiID4gdWwgPiBsaSIpLmxlbmd0aDsgDQotICAgICAgICAgICAgICBwLmNyID0gcC5yOw0KLSAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDogDQotICAgICAgICAgICAgICBwLmNwID0gcC5wOw0KLSAgICAgICAgICAgICAgcC5jciA9IHAucjsNCi0gICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBwLm5wID0gcC5jciA9PSAtMSA/IHAucnQuZ2V0X2NvbnRhaW5lcigpIDogcC5jcjsNCi0gICAgICAgIHAub3AgPSBwLm90Ll9nZXRfcGFyZW50KHAubyk7DQotICAgICAgICBwLm9yID0gcC5ucC5maW5kKCIgPiB1bCA+IGxpOm50aC1jaGlsZCgiICsgKHAuY3AgKyAxKSArICIpIik7DQotDQotICAgICAgICBwcmVwYXJlZF9tb3ZlID0gcDsNCi0gICAgICAgIHRoaXMuX19jYWxsYmFjayhwcmVwYXJlZF9tb3ZlKTsNCi0gICAgICAgIGlmKGNiKSB7IGNiLmNhbGwodGhpcywgcHJlcGFyZWRfbW92ZSk7IH0NCi0gICAgICB9LA0KLSAgICAgIGNoZWNrX21vdmUgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgICB2YXIgb2JqID0gcHJlcGFyZWRfbW92ZSwgcmV0ID0gdHJ1ZTsNCi0gICAgICAgIGlmKG9iai5vclswXSA9PT0gb2JqLm9bMF0pIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICBvYmouby5lYWNoKGZ1bmN0aW9uICgpIHsgDQotICAgICAgICAgIGlmKG9iai5yLnBhcmVudHNVbnRpbCgiLmpzdHJlZSIpLmFuZFNlbGYoKS5maWx0ZXIoImxpIikuaW5kZXgodGhpcykgIT09IC0xKSB7IHJldCA9IGZhbHNlOyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIH0pOw0KLSAgICAgICAgcmV0dXJuIHJldDsNCi0gICAgICB9LA0KLSAgICAgIG1vdmVfbm9kZSA6IGZ1bmN0aW9uIChvYmosIHJlZiwgcG9zaXRpb24sIGlzX2NvcHksIGlzX3ByZXBhcmVkLCBza2lwX2NoZWNrKSB7DQotICAgICAgICBpZighaXNfcHJlcGFyZWQpIHsgDQotICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVfbW92ZShvYmosIHJlZiwgcG9zaXRpb24sIGZ1bmN0aW9uIChwKSB7DQotICAgICAgICAgICAgdGhpcy5tb3ZlX25vZGUocCwgZmFsc2UsIGZhbHNlLCBpc19jb3B5LCB0cnVlLCBza2lwX2NoZWNrKTsNCi0gICAgICAgICAgfSk7DQotICAgICAgICB9DQotICAgICAgICBpZighc2tpcF9jaGVjayAmJiAhdGhpcy5jaGVja19tb3ZlKCkpIHsgcmV0dXJuIGZhbHNlOyB9DQotDQotICAgICAgICB0aGlzLl9fcm9sbGJhY2soKTsNCi0gICAgICAgIHZhciBvID0gZmFsc2U7DQotICAgICAgICBpZihpc19jb3B5KSB7DQotICAgICAgICAgIG8gPSBvYmouby5jbG9uZSgpOw0KLSAgICAgICAgICBvLmZpbmQoIipbaWRdIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICAgIGlmKHRoaXMuaWQpIHsgdGhpcy5pZCA9ICJjb3B5XyIgKyB0aGlzLmlkOyB9DQotICAgICAgICAgIH0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7IG8gPSBvYmoubzsgfQ0KLQ0KLSAgICAgICAgaWYob2JqLm9yLmxlbmd0aCkgeyBvYmoub3IuYmVmb3JlKG8pOyB9DQotICAgICAgICBlbHNlIHsgDQotICAgICAgICAgIGlmKCFvYmoubnAuY2hpbGRyZW4oInVsIikubGVuZ3RoKSB7ICQoIjx1bD4iKS5hcHBlbmRUbyhvYmoubnApOyB9DQotICAgICAgICAgIG9iai5ucC5jaGlsZHJlbigidWw6ZXEoMCkiKS5hcHBlbmQobyk7IA0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJ5IHsgDQotICAgICAgICAgIG9iai5vdC5jbGVhbl9ub2RlKG9iai5vcCk7DQotICAgICAgICAgIG9iai5ydC5jbGVhbl9ub2RlKG9iai5ucCk7DQotICAgICAgICAgIGlmKCFvYmoub3AuZmluZCgiPiB1bCA+IGxpIikubGVuZ3RoKSB7DQotICAgICAgICAgICAgb2JqLm9wLnJlbW92ZUNsYXNzKCJqc3RyZWUtb3BlbiBqc3RyZWUtY2xvc2VkIikuYWRkQ2xhc3MoImpzdHJlZS1sZWFmIikuY2hpbGRyZW4oInVsIikucmVtb3ZlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKGUpIHsgfQ0KLQ0KLSAgICAgICAgaWYoaXNfY29weSkgeyANCi0gICAgICAgICAgcHJlcGFyZWRfbW92ZS5jeSA9IHRydWU7DQotICAgICAgICAgIHByZXBhcmVkX21vdmUub2MgPSBvOyANCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuX19jYWxsYmFjayhwcmVwYXJlZF9tb3ZlKTsNCi0gICAgICAgIHJldHVybiBwcmVwYXJlZF9tb3ZlOw0KLSAgICAgIH0sDQotICAgICAgX2dldF9tb3ZlIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcHJlcGFyZWRfbW92ZTsgfQ0KLSAgICB9DQotICB9KTsNCi19KShqUXVlcnkpOw0KLS8vKi8NCi0NCi0vKiANCi0gKiBqc1RyZWUgdWkgcGx1Z2luIDEuMA0KLSAqIFRoaXMgcGx1Z2lucyBoYW5kbGVzIHNlbGVjdGluZy9kZXNlbGVjdGluZy9ob3ZlcmluZy9kZWhvdmVyaW5nIG5vZGVzDQotICovDQotKGZ1bmN0aW9uICgkKSB7DQotICAkLmpzdHJlZS5wbHVnaW4oInVpIiwgew0KLSAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7IA0KLSAgICAgIHRoaXMuZGF0YS51aS5zZWxlY3RlZCA9ICQoKTsgDQotICAgICAgdGhpcy5kYXRhLnVpLmxhc3Rfc2VsZWN0ZWQgPSBmYWxzZTsgDQotICAgICAgdGhpcy5kYXRhLnVpLmhvdmVyZWQgPSBudWxsOw0KLSAgICAgIHRoaXMuZGF0YS51aS50b19zZWxlY3QgPSB0aGlzLmdldF9zZXR0aW5ncygpLnVpLmluaXRpYWxseV9zZWxlY3Q7DQotDQotICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkNCi0gICAgICAgIC5kZWxlZ2F0ZSgiYSIsICJjbGljay5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChldmVudCkgew0KLSAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICAgICAgdGhpcy5zZWxlY3Rfbm9kZShldmVudC5jdXJyZW50VGFyZ2V0LCB0cnVlLCBldmVudCk7DQotICAgICAgICAgIH0sIHRoaXMpKQ0KLSAgICAgICAgLmRlbGVnYXRlKCJhIiwgIm1vdXNlZW50ZXIuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZXZlbnQpIHsNCi0gICAgICAgICAgICB0aGlzLmhvdmVyX25vZGUoZXZlbnQudGFyZ2V0KTsNCi0gICAgICAgICAgfSwgdGhpcykpDQotICAgICAgICAuZGVsZWdhdGUoImEiLCAibW91c2VsZWF2ZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChldmVudCkgew0KLSAgICAgICAgICAgIHRoaXMuZGVob3Zlcl9ub2RlKGV2ZW50LnRhcmdldCk7DQotICAgICAgICAgIH0sIHRoaXMpKQ0KLSAgICAgICAgLmJpbmQoInJlb3Blbi5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHsgDQotICAgICAgICAgICAgdGhpcy5yZXNlbGVjdCgpOw0KLSAgICAgICAgICB9LCB0aGlzKSkNCi0gICAgICAgIC5iaW5kKCJnZXRfcm9sbGJhY2suanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoKSB7IA0KLSAgICAgICAgICAgIHRoaXMuZGVob3Zlcl9ub2RlKCk7DQotICAgICAgICAgICAgdGhpcy5zYXZlX3NlbGVjdGVkKCk7DQotICAgICAgICAgIH0sIHRoaXMpKQ0KLSAgICAgICAgLmJpbmQoInNldF9yb2xsYmFjay5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHsgDQotICAgICAgICAgICAgdGhpcy5yZXNlbGVjdCgpOw0KLSAgICAgICAgICB9LCB0aGlzKSkNCi0gICAgICAgIC5iaW5kKCJjbG9zZV9ub2RlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7IA0KLSAgICAgICAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkudWksDQotICAgICAgICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShkYXRhLnJzbHQub2JqKSwNCi0gICAgICAgICAgICAgIGNsayA9IChvYmogJiYgb2JqLmxlbmd0aCkgPyBvYmouY2hpbGRyZW4oInVsIikuZmluZCgiLmpzdHJlZS1jbGlja2VkIikgOiAkKCksDQotICAgICAgICAgICAgICBfdGhpcyA9IHRoaXM7DQotICAgICAgICAgICAgaWYocy5zZWxlY3RlZF9wYXJlbnRfY2xvc2UgPT09IGZhbHNlIHx8ICFjbGsubGVuZ3RoKSB7IHJldHVybjsgfQ0KLSAgICAgICAgICAgIGNsay5lYWNoKGZ1bmN0aW9uICgpIHsgDQotICAgICAgICAgICAgICBfdGhpcy5kZXNlbGVjdF9ub2RlKHRoaXMpOw0KLSAgICAgICAgICAgICAgaWYocy5zZWxlY3RlZF9wYXJlbnRfY2xvc2UgPT09ICJzZWxlY3RfcGFyZW50IikgeyBfdGhpcy5zZWxlY3Rfbm9kZShvYmopOyB9DQotICAgICAgICAgICAgfSk7DQotICAgICAgICAgIH0sIHRoaXMpKQ0KLSAgICAgICAgLmJpbmQoImRlbGV0ZV9ub2RlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7IA0KLSAgICAgICAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkudWkuc2VsZWN0X3ByZXZfb25fZGVsZXRlLA0KLSAgICAgICAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUoZGF0YS5yc2x0Lm9iaiksDQotICAgICAgICAgICAgICBjbGsgPSAob2JqICYmIG9iai5sZW5ndGgpID8gb2JqLmZpbmQoIi5qc3RyZWUtY2xpY2tlZCIpIDogW10sDQotICAgICAgICAgICAgICBfdGhpcyA9IHRoaXM7DQotICAgICAgICAgICAgY2xrLmVhY2goZnVuY3Rpb24gKCkgeyBfdGhpcy5kZXNlbGVjdF9ub2RlKHRoaXMpOyB9KTsNCi0gICAgICAgICAgICBpZihzICYmIGNsay5sZW5ndGgpIHsgdGhpcy5zZWxlY3Rfbm9kZShkYXRhLnJzbHQucHJldik7IH0NCi0gICAgICAgICAgfSwgdGhpcykpDQotICAgICAgICAuYmluZCgibW92ZV9ub2RlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7IA0KLSAgICAgICAgICAgIGlmKGRhdGEucnNsdC5jeSkgeyANCi0gICAgICAgICAgICAgIGRhdGEucnNsdC5vYy5maW5kKCIuanN0cmVlLWNsaWNrZWQiKS5yZW1vdmVDbGFzcygianN0cmVlLWNsaWNrZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0sIHRoaXMpKTsNCi0gICAgfSwNCi0gICAgZGVmYXVsdHMgOiB7DQotICAgICAgc2VsZWN0X2xpbWl0IDogLTEsIC8vIDAsIDEsIDIgLi4uIG9yIC0xIGZvciB1bmxpbWl0ZWQNCi0gICAgICBzZWxlY3RfbXVsdGlwbGVfbW9kaWZpZXIgOiAiY3RybCIsIC8vIG9uLCBvciBjdHJsLCBzaGlmdCwgYWx0DQotICAgICAgc2VsZWN0ZWRfcGFyZW50X2Nsb3NlIDogInNlbGVjdF9wYXJlbnQiLCAvLyBmYWxzZSwgImRlc2VsZWN0IiwgInNlbGVjdF9wYXJlbnQiDQotICAgICAgc2VsZWN0X3ByZXZfb25fZGVsZXRlIDogdHJ1ZSwNCi0gICAgICBkaXNhYmxlX3NlbGVjdGluZ19jaGlsZHJlbiA6IGZhbHNlLA0KLSAgICAgIGluaXRpYWxseV9zZWxlY3QgOiBbXQ0KLSAgICB9LA0KLSAgICBfZm4gOiB7IA0KLSAgICAgIF9nZXRfbm9kZSA6IGZ1bmN0aW9uIChvYmosIGFsbG93X211bHRpcGxlKSB7DQotICAgICAgICBpZih0eXBlb2Ygb2JqID09PSAidW5kZWZpbmVkIiB8fCBvYmogPT09IG51bGwpIHsgcmV0dXJuIGFsbG93X211bHRpcGxlID8gdGhpcy5kYXRhLnVpLnNlbGVjdGVkIDogdGhpcy5kYXRhLnVpLmxhc3Rfc2VsZWN0ZWQ7IH0NCi0gICAgICAgIHZhciAkb2JqID0gJChvYmosIHRoaXMuZ2V0X2NvbnRhaW5lcigpKTsgDQotICAgICAgICBpZigkb2JqLmlzKCIuanN0cmVlIikgfHwgb2JqID09IC0xKSB7IHJldHVybiAtMTsgfSANCi0gICAgICAgICRvYmogPSAkb2JqLmNsb3Nlc3QoImxpIiwgdGhpcy5nZXRfY29udGFpbmVyKCkpOyANCi0gICAgICAgIHJldHVybiAkb2JqLmxlbmd0aCA/ICRvYmogOiBmYWxzZTsgDQotICAgICAgfSwNCi0gICAgICBzYXZlX3NlbGVjdGVkIDogZnVuY3Rpb24gKCkgew0KLSAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCi0gICAgICAgIHRoaXMuZGF0YS51aS50b19zZWxlY3QgPSBbXTsNCi0gICAgICAgIHRoaXMuZGF0YS51aS5zZWxlY3RlZC5lYWNoKGZ1bmN0aW9uICgpIHsgX3RoaXMuZGF0YS51aS50b19zZWxlY3QucHVzaCgiIyIgKyB0aGlzLmlkLnRvU3RyaW5nKCkucmVwbGFjZSgvXiMvLCIiKS5yZXBsYWNlKCdcXC8nLCcvJykucmVwbGFjZSgnLycsJ1xcLycpKTsgfSk7DQotICAgICAgICB0aGlzLl9fY2FsbGJhY2sodGhpcy5kYXRhLnVpLnRvX3NlbGVjdCk7DQotICAgICAgfSwNCi0gICAgICByZXNlbGVjdCA6IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgIHZhciBfdGhpcyA9IHRoaXMsDQotICAgICAgICAgIHMgPSB0aGlzLmRhdGEudWkudG9fc2VsZWN0Ow0KLSAgICAgICAgcyA9ICQubWFwKCQubWFrZUFycmF5KHMpLCBmdW5jdGlvbiAobikgeyByZXR1cm4gIiMiICsgbi50b1N0cmluZygpLnJlcGxhY2UoL14jLywiIikucmVwbGFjZSgnXFwvJywnLycpLnJlcGxhY2UoJy8nLCdcXC8nKTsgfSk7DQotICAgICAgICB0aGlzLmRlc2VsZWN0X2FsbCgpOw0KLSAgICAgICAgJC5lYWNoKHMsIGZ1bmN0aW9uIChpLCB2YWwpIHsgaWYodmFsICYmIHZhbCAhPT0gIiMiKSB7IF90aGlzLnNlbGVjdF9ub2RlKHZhbCk7IH0gfSk7DQotICAgICAgICB0aGlzLl9fY2FsbGJhY2soKTsNCi0gICAgICB9LA0KLSAgICAgIHJlZnJlc2ggOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICB0aGlzLnNhdmVfc2VsZWN0ZWQoKTsNCi0gICAgICAgIHJldHVybiB0aGlzLl9fY2FsbF9vbGQoKTsNCi0gICAgICB9LA0KLSAgICAgIGhvdmVyX25vZGUgOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYoIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICAvL2lmKHRoaXMuZGF0YS51aS5ob3ZlcmVkICYmIG9iai5nZXQoMCkgPT09IHRoaXMuZGF0YS51aS5ob3ZlcmVkLmdldCgwKSkgeyByZXR1cm47IH0NCi0gICAgICAgIGlmKCFvYmouaGFzQ2xhc3MoImpzdHJlZS1ob3ZlcmVkIikpIHsgdGhpcy5kZWhvdmVyX25vZGUoKTsgfQ0KLSAgICAgICAgdGhpcy5kYXRhLnVpLmhvdmVyZWQgPSBvYmouY2hpbGRyZW4oImEiKS5hZGRDbGFzcygianN0cmVlLWhvdmVyZWQiKS5wYXJlbnQoKTsNCi0gICAgICAgIHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqIH0pOw0KLSAgICAgIH0sDQotICAgICAgZGVob3Zlcl9ub2RlIDogZnVuY3Rpb24gKCkgew0KLSAgICAgICAgdmFyIG9iaiA9IHRoaXMuZGF0YS51aS5ob3ZlcmVkLCBwOw0KLSAgICAgICAgaWYoIW9iaiB8fCAhb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIHAgPSBvYmouY2hpbGRyZW4oImEiKS5yZW1vdmVDbGFzcygianN0cmVlLWhvdmVyZWQiKS5wYXJlbnQoKTsNCi0gICAgICAgIGlmKHRoaXMuZGF0YS51aS5ob3ZlcmVkWzBdID09PSBwWzBdKSB7IHRoaXMuZGF0YS51aS5ob3ZlcmVkID0gbnVsbDsgfQ0KLSAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7DQotICAgICAgfSwNCi0gICAgICBzZWxlY3Rfbm9kZSA6IGZ1bmN0aW9uIChvYmosIGNoZWNrLCBlKSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYob2JqID09IC0xIHx8ICFvYmogfHwgIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICB2YXIgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLnVpLA0KLSAgICAgICAgICBpc19tdWx0aXBsZSA9IChzLnNlbGVjdF9tdWx0aXBsZV9tb2RpZmllciA9PSAib24iIHx8IChzLnNlbGVjdF9tdWx0aXBsZV9tb2RpZmllciAhPT0gZmFsc2UgJiYgZSAmJiBlW3Muc2VsZWN0X211bHRpcGxlX21vZGlmaWVyICsgIktleSJdKSksDQotICAgICAgICAgIGlzX3NlbGVjdGVkID0gdGhpcy5pc19zZWxlY3RlZChvYmopLA0KLSAgICAgICAgICBwcm9jZWVkID0gdHJ1ZTsNCi0gICAgICAgIGlmKGNoZWNrKSB7DQotICAgICAgICAgIGlmKHMuZGlzYWJsZV9zZWxlY3RpbmdfY2hpbGRyZW4gJiYgaXNfbXVsdGlwbGUgJiYgb2JqLnBhcmVudHMoImxpIiwgdGhpcy5nZXRfY29udGFpbmVyKCkpLmNoaWxkcmVuKCIuanN0cmVlLWNsaWNrZWQiKS5sZW5ndGgpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgcHJvY2VlZCA9IGZhbHNlOw0KLSAgICAgICAgICBzd2l0Y2goITApIHsNCi0gICAgICAgICAgICBjYXNlIChpc19zZWxlY3RlZCAmJiAhaXNfbXVsdGlwbGUpOiANCi0gICAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RfYWxsKCk7DQotICAgICAgICAgICAgICBpc19zZWxlY3RlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgcHJvY2VlZCA9IHRydWU7DQotICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICghaXNfc2VsZWN0ZWQgJiYgIWlzX211bHRpcGxlKTogDQotICAgICAgICAgICAgICBpZihzLnNlbGVjdF9saW1pdCA9PSAtMSB8fCBzLnNlbGVjdF9saW1pdCA+IDApIHsNCi0gICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdF9hbGwoKTsNCi0gICAgICAgICAgICAgICAgcHJvY2VlZCA9IHRydWU7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIChpc19zZWxlY3RlZCAmJiBpc19tdWx0aXBsZSk6IA0KLSAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdF9ub2RlKG9iaik7DQotICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlICghaXNfc2VsZWN0ZWQgJiYgaXNfbXVsdGlwbGUpOiANCi0gICAgICAgICAgICAgIGlmKHMuc2VsZWN0X2xpbWl0ID09IC0xIHx8IHRoaXMuZGF0YS51aS5zZWxlY3RlZC5sZW5ndGggKyAxIDw9IHMuc2VsZWN0X2xpbWl0KSB7IA0KLSAgICAgICAgICAgICAgICBwcm9jZWVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZihwcm9jZWVkICYmICFpc19zZWxlY3RlZCkgew0KLSAgICAgICAgICBvYmouY2hpbGRyZW4oImEiKS5hZGRDbGFzcygianN0cmVlLWNsaWNrZWQiKTsNCi0gICAgICAgICAgdGhpcy5kYXRhLnVpLnNlbGVjdGVkID0gdGhpcy5kYXRhLnVpLnNlbGVjdGVkLmFkZChvYmopOw0KLSAgICAgICAgICB0aGlzLmRhdGEudWkubGFzdF9zZWxlY3RlZCA9IG9iajsNCi0gICAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7DQotICAgICAgICB9DQotICAgICAgfSwNCi0gICAgICBkZXNlbGVjdF9ub2RlIDogZnVuY3Rpb24gKG9iaikgew0KLSAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsNCi0gICAgICAgIGlmKCFvYmoubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgaWYodGhpcy5pc19zZWxlY3RlZChvYmopKSB7DQotICAgICAgICAgIG9iai5jaGlsZHJlbigiYSIpLnJlbW92ZUNsYXNzKCJqc3RyZWUtY2xpY2tlZCIpOw0KLSAgICAgICAgICB0aGlzLmRhdGEudWkuc2VsZWN0ZWQgPSB0aGlzLmRhdGEudWkuc2VsZWN0ZWQubm90KG9iaik7DQotICAgICAgICAgIGlmKHRoaXMuZGF0YS51aS5sYXN0X3NlbGVjdGVkLmdldCgwKSA9PT0gb2JqLmdldCgwKSkgeyB0aGlzLmRhdGEudWkubGFzdF9zZWxlY3RlZCA9IHRoaXMuZGF0YS51aS5zZWxlY3RlZC5lcSgwKTsgfQ0KLSAgICAgICAgICB0aGlzLl9fY2FsbGJhY2soeyAib2JqIiA6IG9iaiB9KTsNCi0gICAgICAgIH0NCi0gICAgICB9LA0KLSAgICAgIHRvZ2dsZV9zZWxlY3QgOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYoIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICBpZih0aGlzLmlzX3NlbGVjdGVkKG9iaikpIHsgdGhpcy5kZXNlbGVjdF9ub2RlKG9iaik7IH0NCi0gICAgICAgIGVsc2UgeyB0aGlzLnNlbGVjdF9ub2RlKG9iaik7IH0NCi0gICAgICB9LA0KLSAgICAgIGlzX3NlbGVjdGVkIDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdGhpcy5kYXRhLnVpLnNlbGVjdGVkLmluZGV4KHRoaXMuX2dldF9ub2RlKG9iaikpID49IDA7IH0sDQotICAgICAgZ2V0X3NlbGVjdGVkIDogZnVuY3Rpb24gKGNvbnRleHQpIHsgDQotICAgICAgICByZXR1cm4gY29udGV4dCA/ICQoY29udGV4dCkuZmluZCgiLmpzdHJlZS1jbGlja2VkIikucGFyZW50KCkgOiB0aGlzLmRhdGEudWkuc2VsZWN0ZWQ7IA0KLSAgICAgIH0sDQotICAgICAgZGVzZWxlY3RfYWxsIDogZnVuY3Rpb24gKGNvbnRleHQpIHsNCi0gICAgICAgIGlmKGNvbnRleHQpIHsgJChjb250ZXh0KS5maW5kKCIuanN0cmVlLWNsaWNrZWQiKS5yZW1vdmVDbGFzcygianN0cmVlLWNsaWNrZWQiKTsgfSANCi0gICAgICAgIGVsc2UgeyB0aGlzLmdldF9jb250YWluZXIoKS5maW5kKCIuanN0cmVlLWNsaWNrZWQiKS5yZW1vdmVDbGFzcygianN0cmVlLWNsaWNrZWQiKTsgfQ0KLSAgICAgICAgdGhpcy5kYXRhLnVpLnNlbGVjdGVkID0gJChbXSk7DQotICAgICAgICB0aGlzLmRhdGEudWkubGFzdF9zZWxlY3RlZCA9IGZhbHNlOw0KLSAgICAgICAgdGhpcy5fX2NhbGxiYWNrKCk7DQotICAgICAgfQ0KLSAgICB9DQotICB9KTsNCi0gIC8vIGluY2x1ZGUgdGhlIHNlbGVjdGlvbiBwbHVnaW4gYnkgZGVmYXVsdA0KLSAgJC5qc3RyZWUuZGVmYXVsdHMucGx1Z2lucy5wdXNoKCJ1aSIpOw0KLX0pKGpRdWVyeSk7DQotLy8qLw0KLQ0KLS8qIA0KLSAqIGpzVHJlZSBDUlJNIHBsdWdpbiAxLjANCi0gKiBIYW5kbGVzIGNyZWF0aW5nL3JlbmFtaW5nL3JlbW92aW5nL21vdmluZyBub2RlcyBieSB1c2VyIGludGVyYWN0aW9uLg0KLSAqLw0KLShmdW5jdGlvbiAoJCkgew0KLSAgJC5qc3RyZWUucGx1Z2luKCJjcnJtIiwgeyANCi0gICAgX19pbml0IDogZnVuY3Rpb24gKCkgew0KLSAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpDQotICAgICAgICAuYmluZCgibW92ZV9ub2RlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHsNCi0gICAgICAgICAgaWYodGhpcy5fZ2V0X3NldHRpbmdzKCkuY3JybS5tb3ZlLm9wZW5fb25tb3ZlKSB7DQotICAgICAgICAgICAgdmFyIHQgPSB0aGlzOw0KLSAgICAgICAgICAgIGRhdGEucnNsdC5ucC5wYXJlbnRzVW50aWwoIi5qc3RyZWUiKS5hbmRTZWxmKCkuZmlsdGVyKCIuanN0cmVlLWNsb3NlZCIpLmVhY2goZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICAgICAgdC5vcGVuX25vZGUodGhpcywgZmFsc2UsIHRydWUpOw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICB9DQotICAgICAgICB9LCB0aGlzKSk7DQotICAgIH0sDQotICAgIGRlZmF1bHRzIDogew0KLSAgICAgIGlucHV0X3dpZHRoX2xpbWl0IDogMjAwLA0KLSAgICAgIG1vdmUgOiB7DQotICAgICAgICBhbHdheXNfY29weSAgICAgIDogZmFsc2UsIC8vIGZhbHNlLCB0cnVlIG9yICJtdWx0aXRyZWUiDQotICAgICAgICBvcGVuX29ubW92ZSAgICAgIDogdHJ1ZSwNCi0gICAgICAgIGRlZmF1bHRfcG9zaXRpb24gIDogImxhc3QiLA0KLSAgICAgICAgY2hlY2tfbW92ZSAgICAgIDogZnVuY3Rpb24gKG0pIHsgcmV0dXJuIHRydWU7IH0NCi0gICAgICB9DQotICAgIH0sDQotICAgIF9mbiA6IHsNCi0gICAgICBfc2hvd19pbnB1dCA6IGZ1bmN0aW9uIChvYmosIGNhbGxiYWNrKSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgdmFyIHJ0bCA9IHRoaXMuX2dldF9zZXR0aW5ncygpLmNvcmUucnRsLA0KLSAgICAgICAgICB3ID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuY3JybS5pbnB1dF93aWR0aF9saW1pdCwNCi0gICAgICAgICAgdzEgPSBvYmouY2hpbGRyZW4oImlucyIpLndpZHRoKCksDQotICAgICAgICAgIHcyID0gb2JqLmZpbmQoIj4gYTp2aXNpYmxlID4gaW5zIikud2lkdGgoKSAqIG9iai5maW5kKCI+IGE6dmlzaWJsZSA+IGlucyIpLmxlbmd0aCwNCi0gICAgICAgICAgdCA9IHRoaXMuZ2V0X3RleHQob2JqKSwNCi0gICAgICAgICAgaDEgPSAkKCI8ZGl2PiIsIHsgY3NzIDogeyAicG9zaXRpb24iIDogImFic29sdXRlIiwgInRvcCIgOiAiLTIwMHB4IiwgImxlZnQiIDogKHJ0bCA/ICIwcHgiIDogIi0xMDAwcHgiKSwgInZpc2liaWxpdHkiIDogImhpZGRlbiIgfSB9KS5hcHBlbmRUbygiYm9keSIpLA0KLSAgICAgICAgICBoMiA9IG9iai5jc3MoInBvc2l0aW9uIiwicmVsYXRpdmUiKS5hcHBlbmQoDQotICAgICAgICAgICQoIjxpbnB1dD4iLCB7IA0KLSAgICAgICAgICAgICJ2YWx1ZSIgOiB0LA0KLSAgICAgICAgICAgIC8vICJzaXplIiA6IHQubGVuZ3RoLA0KLSAgICAgICAgICAgICJjc3MiIDogew0KLSAgICAgICAgICAgICAgInBhZGRpbmciIDogIjAiLA0KLSAgICAgICAgICAgICAgImJvcmRlciIgOiAiMXB4IHNvbGlkIHNpbHZlciIsDQotICAgICAgICAgICAgICAicG9zaXRpb24iIDogImFic29sdXRlIiwNCi0gICAgICAgICAgICAgICJsZWZ0IiAgOiAocnRsID8gImF1dG8iIDogKHcxICsgdzIgKyA0KSArICJweCIpLA0KLSAgICAgICAgICAgICAgInJpZ2h0IiA6IChydGwgPyAodzEgKyB3MiArIDQpICsgInB4IiA6ICJhdXRvIiksDQotICAgICAgICAgICAgICAidG9wIiA6ICIwcHgiLA0KLSAgICAgICAgICAgICAgImhlaWdodCIgOiAodGhpcy5kYXRhLmNvcmUubGlfaGVpZ2h0IC0gMikgKyAicHgiLA0KLSAgICAgICAgICAgICAgImxpbmVIZWlnaHQiIDogKHRoaXMuZGF0YS5jb3JlLmxpX2hlaWdodCAtIDIpICsgInB4IiwNCi0gICAgICAgICAgICAgICJ3aWR0aCIgOiAiMTUwcHgiIC8vIHdpbGwgYmUgc2V0IGEgYml0IGZ1cnRoZXIgZG93bg0KLSAgICAgICAgICAgIH0sDQotICAgICAgICAgICAgImJsdXIiIDogJC5wcm94eShmdW5jdGlvbiAoKSB7DQotICAgICAgICAgICAgICB2YXIgaSA9IG9iai5jaGlsZHJlbigiaW5wdXQiKSwNCi0gICAgICAgICAgICAgICAgdiA9IGkudmFsKCk7DQotICAgICAgICAgICAgICBpZih2ID09PSAiIikgeyB2ID0gdDsgfQ0KLSAgICAgICAgICAgICAgaS5yZW1vdmUoKTsgLy8gcm9sbGJhY2sgcHVycG9zZXMNCi0gICAgICAgICAgICAgIHRoaXMuc2V0X3RleHQob2JqLHQpOyAvLyByb2xsYmFjayBwdXJwb3Nlcw0KLSAgICAgICAgICAgICAgdGhpcy5yZW5hbWVfbm9kZShvYmosIHYpOw0KLSAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBvYmosIHYsIHQpOw0KLSAgICAgICAgICAgICAgb2JqLmNzcygicG9zaXRpb24iLCIiKTsNCi0gICAgICAgICAgICB9LCB0aGlzKSwNCi0gICAgICAgICAgICAia2V5dXAiIDogZnVuY3Rpb24gKGV2ZW50KSB7DQotICAgICAgICAgICAgICB2YXIga2V5ID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaDsNCi0gICAgICAgICAgICAgIGlmKGtleSA9PSAyNykgeyB0aGlzLnZhbHVlID0gdDsgdGhpcy5ibHVyKCk7IHJldHVybjsgfQ0KLSAgICAgICAgICAgICAgZWxzZSBpZihrZXkgPT0gMTMpIHsgdGhpcy5ibHVyKCk7IHJldHVybjsgfQ0KLSAgICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgIGgyLndpZHRoKE1hdGgubWluKGgxLnRleHQoInBXIiArIHRoaXMudmFsdWUpLndpZHRoKCksdykpOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSkNCi0gICAgICAgICkuY2hpbGRyZW4oImlucHV0Iik7IA0KLSAgICAgICAgdGhpcy5zZXRfdGV4dChvYmosICIiKTsNCi0gICAgICAgIGgxLmNzcyh7DQotICAgICAgICAgICAgZm9udEZhbWlseSAgICA6IGgyLmNzcygnZm9udEZhbWlseScpICAgIHx8ICcnLA0KLSAgICAgICAgICAgIGZvbnRTaXplICAgIDogaDIuY3NzKCdmb250U2l6ZScpICAgIHx8ICcnLA0KLSAgICAgICAgICAgIGZvbnRXZWlnaHQgICAgOiBoMi5jc3MoJ2ZvbnRXZWlnaHQnKSAgICB8fCAnJywNCi0gICAgICAgICAgICBmb250U3R5bGUgICAgOiBoMi5jc3MoJ2ZvbnRTdHlsZScpICAgIHx8ICcnLA0KLSAgICAgICAgICAgIGZvbnRTdHJldGNoICAgIDogaDIuY3NzKCdmb250U3RyZXRjaCcpICAgIHx8ICcnLA0KLSAgICAgICAgICAgIGZvbnRWYXJpYW50ICAgIDogaDIuY3NzKCdmb250VmFyaWFudCcpICAgIHx8ICcnLA0KLSAgICAgICAgICAgIGxldHRlclNwYWNpbmcgIDogaDIuY3NzKCdsZXR0ZXJTcGFjaW5nJykgIHx8ICcnLA0KLSAgICAgICAgICAgIHdvcmRTcGFjaW5nICAgIDogaDIuY3NzKCd3b3JkU3BhY2luZycpICAgIHx8ICcnDQotICAgICAgICB9KTsNCi0gICAgICAgIGgyLndpZHRoKE1hdGgubWluKGgxLnRleHQoInBXIiArIGgyWzBdLnZhbHVlKS53aWR0aCgpLHcpKVswXS5zZWxlY3QoKTsNCi0gICAgICB9LA0KLSAgICAgIHJlbmFtZSA6IGZ1bmN0aW9uIChvYmopIHsNCi0gICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICB0aGlzLl9fcm9sbGJhY2soKTsNCi0gICAgICAgIHZhciBmID0gdGhpcy5fX2NhbGxiYWNrOw0KLSAgICAgICAgdGhpcy5fc2hvd19pbnB1dChvYmosIGZ1bmN0aW9uIChvYmosIG5ld19uYW1lLCBvbGRfbmFtZSkgeyANCi0gICAgICAgICAgZi5jYWxsKHRoaXMsIHsgIm9iaiIgOiBvYmosICJuZXdfbmFtZSIgOiBuZXdfbmFtZSwgIm9sZF9uYW1lIiA6IG9sZF9uYW1lIH0pOw0KLSAgICAgICAgfSk7DQotICAgICAgfSwNCi0gICAgICBjcmVhdGUgOiBmdW5jdGlvbiAob2JqLCBwb3NpdGlvbiwganMsIGNhbGxiYWNrLCBza2lwX3JlbmFtZSkgew0KLSAgICAgICAgdmFyIHQsIF90aGlzID0gdGhpczsNCi0gICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICBpZighb2JqKSB7IG9iaiA9IC0xOyB9DQotICAgICAgICB0aGlzLl9fcm9sbGJhY2soKTsNCi0gICAgICAgIHQgPSB0aGlzLmNyZWF0ZV9ub2RlKG9iaiwgcG9zaXRpb24sIGpzLCBmdW5jdGlvbiAodCkgew0KLSAgICAgICAgICB2YXIgcCA9IHRoaXMuX2dldF9wYXJlbnQodCksDQotICAgICAgICAgICAgcG9zID0gJCh0KS5pbmRleCgpOw0KLSAgICAgICAgICBpZihjYWxsYmFjaykgeyBjYWxsYmFjay5jYWxsKHRoaXMsIHQpOyB9DQotICAgICAgICAgIGlmKHAubGVuZ3RoICYmIHAuaGFzQ2xhc3MoImpzdHJlZS1jbG9zZWQiKSkgeyB0aGlzLm9wZW5fbm9kZShwLCBmYWxzZSwgdHJ1ZSk7IH0NCi0gICAgICAgICAgaWYoIXNraXBfcmVuYW1lKSB7IA0KLSAgICAgICAgICAgIHRoaXMuX3Nob3dfaW5wdXQodCwgZnVuY3Rpb24gKG9iaiwgbmV3X25hbWUsIG9sZF9uYW1lKSB7IA0KLSAgICAgICAgICAgICAgX3RoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqLCAibmFtZSIgOiBuZXdfbmFtZSwgInBhcmVudCIgOiBwLCAicG9zaXRpb24iIDogcG9zIH0pOw0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGVsc2UgeyBfdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiB0LCAibmFtZSIgOiB0aGlzLmdldF90ZXh0KHQpLCAicGFyZW50IiA6IHAsICJwb3NpdGlvbiIgOiBwb3MgfSk7IH0NCi0gICAgICAgIH0pOw0KLSAgICAgICAgcmV0dXJuIHQ7DQotICAgICAgfSwNCi0gICAgICByZW1vdmUgOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmosIHRydWUpOw0KLSAgICAgICAgdGhpcy5fX3JvbGxiYWNrKCk7DQotICAgICAgICB0aGlzLmRlbGV0ZV9ub2RlKG9iaik7DQotICAgICAgICB0aGlzLl9fY2FsbGJhY2soeyAib2JqIiA6IG9iaiB9KTsNCi0gICAgICB9LA0KLSAgICAgIGNoZWNrX21vdmUgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgICBpZighdGhpcy5fX2NhbGxfb2xkKCkpIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICB2YXIgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLmNycm0ubW92ZTsNCi0gICAgICAgIGlmKCFzLmNoZWNrX21vdmUuY2FsbCh0aGlzLCB0aGlzLl9nZXRfbW92ZSgpKSkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgIH0sDQotICAgICAgbW92ZV9ub2RlIDogZnVuY3Rpb24gKG9iaiwgcmVmLCBwb3NpdGlvbiwgaXNfY29weSwgaXNfcHJlcGFyZWQsIHNraXBfY2hlY2spIHsNCi0gICAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuY3JybS5tb3ZlOw0KLSAgICAgICAgaWYoIWlzX3ByZXBhcmVkKSB7IA0KLSAgICAgICAgICBpZighcG9zaXRpb24pIHsgcG9zaXRpb24gPSBzLmRlZmF1bHRfcG9zaXRpb247IH0NCi0gICAgICAgICAgaWYocG9zaXRpb24gPT09ICJpbnNpZGUiICYmICFzLmRlZmF1bHRfcG9zaXRpb24ubWF0Y2goL14oYmVmb3JlfGFmdGVyKSQvKSkgeyBwb3NpdGlvbiA9IHMuZGVmYXVsdF9wb3NpdGlvbjsgfQ0KLSAgICAgICAgICByZXR1cm4gdGhpcy5fX2NhbGxfb2xkKHRydWUsIG9iaiwgcmVmLCBwb3NpdGlvbiwgaXNfY29weSwgZmFsc2UsIHNraXBfY2hlY2spOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gaWYgdGhlIG1vdmUgaXMgYWxyZWFkeSBwcmVwYXJlZA0KLSAgICAgICAgaWYocy5hbHdheXNfY29weSA9PT0gdHJ1ZSB8fCAocy5hbHdheXNfY29weSA9PT0gIm11bHRpdHJlZSIgJiYgb2JqLnJ0LmdldF9pbmRleCgpICE9PSBvYmoub3QuZ2V0X2luZGV4KCkgKSkgew0KLSAgICAgICAgICBpc19jb3B5ID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuX19jYWxsX29sZCh0cnVlLCBvYmosIHJlZiwgcG9zaXRpb24sIGlzX2NvcHksIHRydWUsIHNraXBfY2hlY2spOw0KLSAgICAgIH0sDQotDQotICAgICAgY3V0IDogZnVuY3Rpb24gKG9iaikgew0KLSAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsNCi0gICAgICAgIHRoaXMuZGF0YS5jcnJtLmNwX25vZGVzID0gZmFsc2U7DQotICAgICAgICB0aGlzLmRhdGEuY3JybS5jdF9ub2RlcyA9IGZhbHNlOw0KLSAgICAgICAgaWYoIW9iaiB8fCAhb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIHRoaXMuZGF0YS5jcnJtLmN0X25vZGVzID0gb2JqOw0KLSAgICAgIH0sDQotICAgICAgY29weSA6IGZ1bmN0aW9uIChvYmopIHsNCi0gICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICB0aGlzLmRhdGEuY3JybS5jcF9ub2RlcyA9IGZhbHNlOw0KLSAgICAgICAgdGhpcy5kYXRhLmNycm0uY3Rfbm9kZXMgPSBmYWxzZTsNCi0gICAgICAgIGlmKCFvYmogfHwgIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICB0aGlzLmRhdGEuY3JybS5jcF9ub2RlcyA9IG9iajsNCi0gICAgICB9LA0KLSAgICAgIHBhc3RlIDogZnVuY3Rpb24gKG9iaikgeyANCi0gICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICBpZighb2JqIHx8ICFvYmoubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgaWYoIXRoaXMuZGF0YS5jcnJtLmN0X25vZGVzICYmICF0aGlzLmRhdGEuY3JybS5jcF9ub2RlcykgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIGlmKHRoaXMuZGF0YS5jcnJtLmN0X25vZGVzKSB7IHRoaXMubW92ZV9ub2RlKHRoaXMuZGF0YS5jcnJtLmN0X25vZGVzLCBvYmopOyB9DQotICAgICAgICBpZih0aGlzLmRhdGEuY3JybS5jcF9ub2RlcykgeyB0aGlzLm1vdmVfbm9kZSh0aGlzLmRhdGEuY3JybS5jcF9ub2Rlcywgb2JqLCBmYWxzZSwgdHJ1ZSk7IH0NCi0gICAgICAgIHRoaXMuZGF0YS5jcnJtLmNwX25vZGVzID0gZmFsc2U7DQotICAgICAgICB0aGlzLmRhdGEuY3JybS5jdF9ub2RlcyA9IGZhbHNlOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfSk7DQotICAvLyBpbmNsdWRlIHRoZSBjcnIgcGx1Z2luIGJ5IGRlZmF1bHQNCi0gICQuanN0cmVlLmRlZmF1bHRzLnBsdWdpbnMucHVzaCgiY3JybSIpOw0KLX0pKGpRdWVyeSk7DQotDQotLyogDQotICoganNUcmVlIHRoZW1lcyBwbHVnaW4gMS4wDQotICogSGFuZGxlcyBsb2FkaW5nIGFuZCBzZXR0aW5nIHRoZW1lcywgYXMgd2VsbCBhcyBkZXRlY3RpbmcgcGF0aCB0byB0aGVtZXMsIGV0Yy4NCi0gKi8NCi0oZnVuY3Rpb24gKCQpIHsNCi0gIHZhciB0aGVtZXNfbG9hZGVkID0gW107DQotICAvLyB0aGlzIHZhcmlhYmxlIHN0b3JlcyB0aGUgcGF0aCB0byB0aGUgdGhlbWVzIGZvbGRlciAtIGlmIGxlZnQgYXMgZmFsc2UgLSBpdCB3aWxsIGJlIGF1dG9kZXRlY3RlZA0KLSAgJC5qc3RyZWUuX3RoZW1lcyA9IGZhbHNlOw0KLSAgJC5qc3RyZWUucGx1Z2luKCJ0aGVtZXMiLCB7DQotICAgIF9faW5pdCA6IGZ1bmN0aW9uICgpIHsgDQotICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkNCi0gICAgICAgIC5iaW5kKCJpbml0LmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkudGhlbWVzOw0KLSAgICAgICAgICAgIHRoaXMuZGF0YS50aGVtZXMuZG90cyA9IHMuZG90czsgDQotICAgICAgICAgICAgdGhpcy5kYXRhLnRoZW1lcy5pY29ucyA9IHMuaWNvbnM7IA0KLSAgICAgICAgICAgIC8vYWxlcnQocy5kb3RzKTsNCi0gICAgICAgICAgICB0aGlzLnNldF90aGVtZShzLnRoZW1lLCBzLnVybCk7DQotICAgICAgICAgIH0sIHRoaXMpKQ0KLSAgICAgICAgLmJpbmQoImxvYWRlZC5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICAvLyBib3VuZCBoZXJlIHRvbywgYXMgc2ltcGxlIEhUTUwgdHJlZSdzIHdvbid0IGhvbm9yIGRvdHMgJiBpY29ucyBvdGhlcndpc2UNCi0gICAgICAgICAgICBpZighdGhpcy5kYXRhLnRoZW1lcy5kb3RzKSB7IHRoaXMuaGlkZV9kb3RzKCk7IH0NCi0gICAgICAgICAgICBlbHNlIHsgdGhpcy5zaG93X2RvdHMoKTsgfQ0KLSAgICAgICAgICAgIGlmKCF0aGlzLmRhdGEudGhlbWVzLmljb25zKSB7IHRoaXMuaGlkZV9pY29ucygpOyB9DQotICAgICAgICAgICAgZWxzZSB7IHRoaXMuc2hvd19pY29ucygpOyB9DQotICAgICAgICAgIH0sIHRoaXMpKTsNCi0gICAgfSwNCi0gICAgZGVmYXVsdHMgOiB7IA0KLSAgICAgIHRoZW1lIDogImRlZmF1bHQiLCANCi0gICAgICB1cmwgOiBmYWxzZSwNCi0gICAgICBkb3RzIDogdHJ1ZSwNCi0gICAgICBpY29ucyA6IHRydWUNCi0gICAgfSwNCi0gICAgX2ZuIDogew0KLSAgICAgIHNldF90aGVtZSA6IGZ1bmN0aW9uICh0aGVtZV9uYW1lLCB0aGVtZV91cmwpIHsNCi0gICAgICAgIGlmKCF0aGVtZV9uYW1lKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgaWYoIXRoZW1lX3VybCkgeyB0aGVtZV91cmwgPSAkLmpzdHJlZS5fdGhlbWVzICsgdGhlbWVfbmFtZSArICcvc3R5bGUuY3NzJzsgfQ0KLSAgICAgICAgaWYoJC5pbkFycmF5KHRoZW1lX3VybCwgdGhlbWVzX2xvYWRlZCkgPT0gLTEpIHsNCi0gICAgICAgICAgJC52YWthdGEuY3NzLmFkZF9zaGVldCh7ICJ1cmwiIDogdGhlbWVfdXJsLCAicmVsIiA6ICJqc3RyZWUiIH0pOw0KLSAgICAgICAgICB0aGVtZXNfbG9hZGVkLnB1c2godGhlbWVfdXJsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKHRoaXMuZGF0YS50aGVtZXMudGhlbWUgIT0gdGhlbWVfbmFtZSkgew0KLSAgICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKS5yZW1vdmVDbGFzcygnanN0cmVlLScgKyB0aGlzLmRhdGEudGhlbWVzLnRoZW1lKTsNCi0gICAgICAgICAgdGhpcy5kYXRhLnRoZW1lcy50aGVtZSA9IHRoZW1lX25hbWU7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKS5hZGRDbGFzcygnanN0cmVlLScgKyB0aGVtZV9uYW1lKTsNCi0gICAgICAgIGlmKCF0aGlzLmRhdGEudGhlbWVzLmRvdHMpIHsgdGhpcy5oaWRlX2RvdHMoKTsgfQ0KLSAgICAgICAgZWxzZSB7IHRoaXMuc2hvd19kb3RzKCk7IH0NCi0gICAgICAgIGlmKCF0aGlzLmRhdGEudGhlbWVzLmljb25zKSB7IHRoaXMuaGlkZV9pY29ucygpOyB9DQotICAgICAgICBlbHNlIHsgdGhpcy5zaG93X2ljb25zKCk7IH0NCi0gICAgICAgIHRoaXMuX19jYWxsYmFjaygpOw0KLSAgICAgIH0sDQotICAgICAgZ2V0X3RoZW1lICA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZGF0YS50aGVtZXMudGhlbWU7IH0sDQotDQotICAgICAgc2hvd19kb3RzICA6IGZ1bmN0aW9uICgpIHsgdGhpcy5kYXRhLnRoZW1lcy5kb3RzID0gdHJ1ZTsgdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikucmVtb3ZlQ2xhc3MoImpzdHJlZS1uby1kb3RzIik7IH0sDQotICAgICAgaGlkZV9kb3RzICA6IGZ1bmN0aW9uICgpIHsgdGhpcy5kYXRhLnRoZW1lcy5kb3RzID0gZmFsc2U7IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmFkZENsYXNzKCJqc3RyZWUtbm8tZG90cyIpOyB9LA0KLSAgICAgIHRvZ2dsZV9kb3RzICA6IGZ1bmN0aW9uICgpIHsgaWYodGhpcy5kYXRhLnRoZW1lcy5kb3RzKSB7IHRoaXMuaGlkZV9kb3RzKCk7IH0gZWxzZSB7IHRoaXMuc2hvd19kb3RzKCk7IH0gfSwNCi0NCi0gICAgICBzaG93X2ljb25zICA6IGZ1bmN0aW9uICgpIHsgdGhpcy5kYXRhLnRoZW1lcy5pY29ucyA9IHRydWU7IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLnJlbW92ZUNsYXNzKCJqc3RyZWUtbm8taWNvbnMiKTsgfSwNCi0gICAgICBoaWRlX2ljb25zICA6IGZ1bmN0aW9uICgpIHsgdGhpcy5kYXRhLnRoZW1lcy5pY29ucyA9IGZhbHNlOyB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5hZGRDbGFzcygianN0cmVlLW5vLWljb25zIik7IH0sDQotICAgICAgdG9nZ2xlX2ljb25zOiBmdW5jdGlvbiAoKSB7IGlmKHRoaXMuZGF0YS50aGVtZXMuaWNvbnMpIHsgdGhpcy5oaWRlX2ljb25zKCk7IH0gZWxzZSB7IHRoaXMuc2hvd19pY29ucygpOyB9IH0NCi0gICAgfQ0KLSAgfSk7DQotICAvLyBhdXRvZGV0ZWN0IHRoZW1lcyBwYXRoDQotICAkKGZ1bmN0aW9uICgpIHsNCi0gICAgaWYoJC5qc3RyZWUuX3RoZW1lcyA9PT0gZmFsc2UpIHsNCi0gICAgICAkKCJzY3JpcHQiKS5lYWNoKGZ1bmN0aW9uICgpIHsgDQotICAgICAgICBpZih0aGlzLnNyYy50b1N0cmluZygpLm1hdGNoKC9qcXVlcnlcLmpzdHJlZVteXC9dKj9cLmpzKFw/LiopPyQvKSkgeyANCi0gICAgICAgICAgJC5qc3RyZWUuX3RoZW1lcyA9IHRoaXMuc3JjLnRvU3RyaW5nKCkucmVwbGFjZSgvanF1ZXJ5XC5qc3RyZWVbXlwvXSo/XC5qcyhcPy4qKT8kLywgIiIpICsgJ3RoZW1lcy8nOyANCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOyANCi0gICAgICAgIH0NCi0gICAgICB9KTsNCi0gICAgfQ0KLSAgICBpZigkLmpzdHJlZS5fdGhlbWVzID09PSBmYWxzZSkgeyAkLmpzdHJlZS5fdGhlbWVzID0gInRoZW1lcy8iOyB9DQotICB9KTsNCi0gIC8vIGluY2x1ZGUgdGhlIHRoZW1lcyBwbHVnaW4gYnkgZGVmYXVsdA0KLSAgJC5qc3RyZWUuZGVmYXVsdHMucGx1Z2lucy5wdXNoKCJ0aGVtZXMiKTsNCi19KShqUXVlcnkpOw0KLS8vKi8NCi0NCi0vKg0KLSAqIGpzVHJlZSBob3RrZXlzIHBsdWdpbiAxLjANCi0gKiBFbmFibGVzIGtleWJvYXJkIG5hdmlnYXRpb24gZm9yIGFsbCB0cmVlIGluc3RhbmNlcw0KLSAqIERlcGVuZHMgb24gdGhlIGpzdHJlZSB1aSAmIGpxdWVyeSBob3RrZXlzIHBsdWdpbnMNCi0gKi8NCi0oZnVuY3Rpb24gKCQpIHsNCi0gIHZhciBib3VuZCA9IFtdOw0KLSAgZnVuY3Rpb24gZXhlYyhpLCBldmVudCkgew0KLSAgICB2YXIgZiA9ICQuanN0cmVlLl9mb2N1c2VkKCksIHRtcDsNCi0gICAgaWYoZiAmJiBmLmRhdGEgJiYgZi5kYXRhLmhvdGtleXMgJiYgZi5kYXRhLmhvdGtleXMuZW5hYmxlZCkgeyANCi0gICAgICB0bXAgPSBmLl9nZXRfc2V0dGluZ3MoKS5ob3RrZXlzW2ldOw0KLSAgICAgIGlmKHRtcCkgeyByZXR1cm4gdG1wLmNhbGwoZiwgZXZlbnQpOyB9DQotICAgIH0NCi0gIH0NCi0gICQuanN0cmVlLnBsdWdpbigiaG90a2V5cyIsIHsNCi0gICAgX19pbml0IDogZnVuY3Rpb24gKCkgew0KLSAgICAgIGlmKHR5cGVvZiAkLmhvdGtleXMgPT09ICJ1bmRlZmluZWQiKSB7IHRocm93ICJqc1RyZWUgaG90a2V5czogalF1ZXJ5IGhvdGtleXMgcGx1Z2luIG5vdCBpbmNsdWRlZC4iOyB9DQotICAgICAgaWYoIXRoaXMuZGF0YS51aSkgeyB0aHJvdyAianNUcmVlIGhvdGtleXM6IGpzVHJlZSBVSSBwbHVnaW4gbm90IGluY2x1ZGVkLiI7IH0NCi0gICAgICAkLmVhY2godGhpcy5fZ2V0X3NldHRpbmdzKCkuaG90a2V5cywgZnVuY3Rpb24gKGksIHZhbCkgew0KLSAgICAgICAgaWYoJC5pbkFycmF5KGksIGJvdW5kKSA9PSAtMSkgew0KLSAgICAgICAgICAkKGRvY3VtZW50KS5iaW5kKCJrZXlkb3duIiwgaSwgZnVuY3Rpb24gKGV2ZW50KSB7IHJldHVybiBleGVjKGksIGV2ZW50KTsgfSk7DQotICAgICAgICAgIGJvdW5kLnB1c2goaSk7DQotICAgICAgICB9DQotICAgICAgfSk7DQotICAgICAgdGhpcy5lbmFibGVfaG90a2V5cygpOw0KLSAgICB9LA0KLSAgICBkZWZhdWx0cyA6IHsNCi0gICAgICAidXAiIDogZnVuY3Rpb24gKCkgeyANCi0gICAgICAgIHZhciBvID0gdGhpcy5kYXRhLnVpLmhvdmVyZWQgfHwgdGhpcy5kYXRhLnVpLmxhc3Rfc2VsZWN0ZWQgfHwgLTE7DQotICAgICAgICB0aGlzLmhvdmVyX25vZGUodGhpcy5fZ2V0X3ByZXYobykpOw0KLSAgICAgICAgcmV0dXJuIGZhbHNlOyANCi0gICAgICB9LA0KLSAgICAgICJkb3duIiA6IGZ1bmN0aW9uICgpIHsgDQotICAgICAgICB2YXIgbyA9IHRoaXMuZGF0YS51aS5ob3ZlcmVkIHx8IHRoaXMuZGF0YS51aS5sYXN0X3NlbGVjdGVkIHx8IC0xOw0KLSAgICAgICAgdGhpcy5ob3Zlcl9ub2RlKHRoaXMuX2dldF9uZXh0KG8pKTsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICB9LA0KLSAgICAgICJsZWZ0IiA6IGZ1bmN0aW9uICgpIHsgDQotICAgICAgICB2YXIgbyA9IHRoaXMuZGF0YS51aS5ob3ZlcmVkIHx8IHRoaXMuZGF0YS51aS5sYXN0X3NlbGVjdGVkOw0KLSAgICAgICAgaWYobykgew0KLSAgICAgICAgICBpZihvLmhhc0NsYXNzKCJqc3RyZWUtb3BlbiIpKSB7IHRoaXMuY2xvc2Vfbm9kZShvKTsgfQ0KLSAgICAgICAgICBlbHNlIHsgdGhpcy5ob3Zlcl9ub2RlKHRoaXMuX2dldF9wcmV2KG8pKTsgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgIH0sDQotICAgICAgInJpZ2h0IiA6IGZ1bmN0aW9uICgpIHsgDQotICAgICAgICB2YXIgbyA9IHRoaXMuZGF0YS51aS5ob3ZlcmVkIHx8IHRoaXMuZGF0YS51aS5sYXN0X3NlbGVjdGVkOw0KLSAgICAgICAgaWYobyAmJiBvLmxlbmd0aCkgew0KLSAgICAgICAgICBpZihvLmhhc0NsYXNzKCJqc3RyZWUtY2xvc2VkIikpIHsgdGhpcy5vcGVuX25vZGUobyk7IH0NCi0gICAgICAgICAgZWxzZSB7IHRoaXMuaG92ZXJfbm9kZSh0aGlzLl9nZXRfbmV4dChvKSk7IH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICB9LA0KLSAgICAgICJzcGFjZSIgOiBmdW5jdGlvbiAoKSB7IA0KLSAgICAgICAgaWYodGhpcy5kYXRhLnVpLmhvdmVyZWQpIHsgdGhpcy5kYXRhLnVpLmhvdmVyZWQuY2hpbGRyZW4oImE6ZXEoMCkiKS5jbGljaygpOyB9IA0KLSAgICAgICAgcmV0dXJuIGZhbHNlOyANCi0gICAgICB9LA0KLSAgICAgICJjdHJsK3NwYWNlIiA6IGZ1bmN0aW9uIChldmVudCkgeyANCi0gICAgICAgIGV2ZW50LnR5cGUgPSAiY2xpY2siOw0KLSAgICAgICAgaWYodGhpcy5kYXRhLnVpLmhvdmVyZWQpIHsgdGhpcy5kYXRhLnVpLmhvdmVyZWQuY2hpbGRyZW4oImE6ZXEoMCkiKS50cmlnZ2VyKGV2ZW50KTsgfSANCi0gICAgICAgIHJldHVybiBmYWxzZTsgDQotICAgICAgfSwNCi0gICAgICAiZjIiIDogZnVuY3Rpb24gKCkgeyB0aGlzLnJlbmFtZSh0aGlzLmRhdGEudWkuaG92ZXJlZCB8fCB0aGlzLmRhdGEudWkubGFzdF9zZWxlY3RlZCk7IH0sDQotICAgICAgImRlbCIgOiBmdW5jdGlvbiAoKSB7IHRoaXMucmVtb3ZlKHRoaXMuZGF0YS51aS5ob3ZlcmVkIHx8IHRoaXMuX2dldF9ub2RlKG51bGwpKTsgfQ0KLSAgICB9LA0KLSAgICBfZm4gOiB7DQotICAgICAgZW5hYmxlX2hvdGtleXMgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgICB0aGlzLmRhdGEuaG90a2V5cy5lbmFibGVkID0gdHJ1ZTsNCi0gICAgICB9LA0KLSAgICAgIGRpc2FibGVfaG90a2V5cyA6IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgIHRoaXMuZGF0YS5ob3RrZXlzLmVuYWJsZWQgPSBmYWxzZTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0pOw0KLX0pKGpRdWVyeSk7DQotLy8qLw0KLQ0KLS8qIA0KLSAqIGpzVHJlZSBKU09OIDEuMA0KLSAqIFRoZSBKU09OIGRhdGEgc3RvcmUuIERhdGFzdG9yZXMgYXJlIGJ1aWxkIGJ5IG92ZXJyaWRpbmcgdGhlIGBsb2FkX25vZGVgIGFuZCBgX2lzX2xvYWRlZGAgZnVuY3Rpb25zLg0KLSAqLw0KLShmdW5jdGlvbiAoJCkgew0KLSAgJC5qc3RyZWUucGx1Z2luKCJqc29uX2RhdGEiLCB7DQotICAgIGRlZmF1bHRzIDogeyANCi0gICAgICBkYXRhIDogZmFsc2UsDQotICAgICAgYWpheCA6IGZhbHNlLA0KLSAgICAgIGNvcnJlY3Rfc3RhdGUgOiB0cnVlLA0KLSAgICAgIHByb2dyZXNzaXZlX3JlbmRlciA6IGZhbHNlDQotICAgIH0sDQotICAgIF9mbiA6IHsNCi0gICAgICBsb2FkX25vZGUgOiBmdW5jdGlvbiAob2JqLCBzX2NhbGwsIGVfY2FsbCkgeyB2YXIgX3RoaXMgPSB0aGlzOyB0aGlzLmxvYWRfbm9kZV9qc29uKG9iaiwgZnVuY3Rpb24gKCkgeyBfdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7IHNfY2FsbC5jYWxsKHRoaXMpOyB9LCBlX2NhbGwpOyB9LA0KLSAgICAgIF9pc19sb2FkZWQgOiBmdW5jdGlvbiAob2JqKSB7IA0KLSAgICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS5qc29uX2RhdGEsIGQ7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOyANCi0gICAgICAgIGlmKG9iaiAmJiBvYmogIT09IC0xICYmIHMucHJvZ3Jlc3NpdmVfcmVuZGVyICYmICFvYmouaXMoIi5qc3RyZWUtb3BlbiwgLmpzdHJlZS1sZWFmIikgJiYgb2JqLmNoaWxkcmVuKCJ1bCIpLmNoaWxkcmVuKCJsaSIpLmxlbmd0aCA9PT0gMCAmJiBvYmouZGF0YSgianN0cmVlLWNoaWxkcmVuIikpIHsNCi0gICAgICAgICAgZCA9IHRoaXMuX3BhcnNlX2pzb24ob2JqLmRhdGEoImpzdHJlZS1jaGlsZHJlbiIpKTsNCi0gICAgICAgICAgaWYoZCkgew0KLSAgICAgICAgICAgIG9iai5hcHBlbmQoZCk7DQotICAgICAgICAgICAgJC5yZW1vdmVEYXRhKG9iaiwgImpzdHJlZS1jaGlsZHJlbiIpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRoaXMuY2xlYW5fbm9kZShvYmopOw0KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvYmogPT0gLTEgfHwgIW9iaiB8fCAhcy5hamF4IHx8IG9iai5pcygiLmpzdHJlZS1vcGVuLCAuanN0cmVlLWxlYWYiKSB8fCBvYmouY2hpbGRyZW4oInVsIikuY2hpbGRyZW4oImxpIikuc2l6ZSgpID4gMDsNCi0gICAgICB9LA0KLSAgICAgIGxvYWRfbm9kZV9qc29uIDogZnVuY3Rpb24gKG9iaiwgc19jYWxsLCBlX2NhbGwpIHsNCi0gICAgICAgIHZhciBzID0gdGhpcy5nZXRfc2V0dGluZ3MoKS5qc29uX2RhdGEsIGQsDQotICAgICAgICAgIGVycm9yX2Z1bmMgPSBmdW5jdGlvbiAoKSB7fSwNCi0gICAgICAgICAgc3VjY2Vzc19mdW5jID0gZnVuY3Rpb24gKCkge307DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYob2JqICYmIG9iaiAhPT0gLTEpIHsNCi0gICAgICAgICAgaWYob2JqLmRhdGEoImpzdHJlZS1pcy1sb2FkaW5nIikpIHsgcmV0dXJuOyB9DQotICAgICAgICAgIGVsc2UgeyBvYmouZGF0YSgianN0cmVlLWlzLWxvYWRpbmciLHRydWUpOyB9DQotICAgICAgICB9DQotICAgICAgICBzd2l0Y2goITApIHsNCi0gICAgICAgICAgY2FzZSAoIXMuZGF0YSAmJiAhcy5hamF4KTogdGhyb3cgIk5laXRoZXIgZGF0YSBub3IgYWpheCBzZXR0aW5ncyBzdXBwbGllZC4iOw0KLSAgICAgICAgICBjYXNlICghIXMuZGF0YSAmJiAhcy5hamF4KSB8fCAoISFzLmRhdGEgJiYgISFzLmFqYXggJiYgKCFvYmogfHwgb2JqID09PSAtMSkpOg0KLSAgICAgICAgICAgIGlmKCFvYmogfHwgb2JqID09IC0xKSB7DQotICAgICAgICAgICAgICBkID0gdGhpcy5fcGFyc2VfanNvbihzLmRhdGEpOw0KLSAgICAgICAgICAgICAgaWYoZCkgew0KLSAgICAgICAgICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5lbXB0eSgpLmFwcGVuZChkLmNoaWxkcmVuKCkpOw0KLSAgICAgICAgICAgICAgICB0aGlzLmNsZWFuX25vZGUoKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIGVsc2UgeyANCi0gICAgICAgICAgICAgICAgaWYocy5jb3JyZWN0X3N0YXRlKSB7IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCk7IH0NCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoc19jYWxsKSB7IHNfY2FsbC5jYWxsKHRoaXMpOyB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgIGNhc2UgKCFzLmRhdGEgJiYgISFzLmFqYXgpIHx8ICghIXMuZGF0YSAmJiAhIXMuYWpheCAmJiBvYmogJiYgb2JqICE9PSAtMSk6DQotICAgICAgICAgICAgZXJyb3JfZnVuYyA9IGZ1bmN0aW9uICh4LCB0LCBlKSB7DQotICAgICAgICAgICAgICB2YXIgZWYgPSB0aGlzLmdldF9zZXR0aW5ncygpLmpzb25fZGF0YS5hamF4LmVycm9yOyANCi0gICAgICAgICAgICAgIGlmKGVmKSB7IGVmLmNhbGwodGhpcywgeCwgdCwgZSk7IH0NCi0gICAgICAgICAgICAgIGlmKG9iaiAhPSAtMSAmJiBvYmoubGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgIG9iai5jaGlsZHJlbigiLmpzdHJlZS1sb2FkaW5nIikucmVtb3ZlQ2xhc3MoImpzdHJlZS1sb2FkaW5nIik7DQotICAgICAgICAgICAgICAgIG9iai5kYXRhKCJqc3RyZWUtaXMtbG9hZGluZyIsZmFsc2UpOw0KLSAgICAgICAgICAgICAgICBpZih0ID09PSAic3VjY2VzcyIgJiYgcy5jb3JyZWN0X3N0YXRlKSB7IG9iai5yZW1vdmVDbGFzcygianN0cmVlLW9wZW4ganN0cmVlLWNsb3NlZCIpLmFkZENsYXNzKCJqc3RyZWUtbGVhZiIpOyB9DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYodCA9PT0gInN1Y2Nlc3MiICYmIHMuY29ycmVjdF9zdGF0ZSkgeyB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5lbXB0eSgpOyB9DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICBpZihlX2NhbGwpIHsgZV9jYWxsLmNhbGwodGhpcyk7IH0NCi0gICAgICAgICAgICB9Ow0KLSAgICAgICAgICAgIHN1Y2Nlc3NfZnVuYyA9IGZ1bmN0aW9uIChkLCB0LCB4KSB7DQotICAgICAgICAgICAgICB2YXIgc2YgPSB0aGlzLmdldF9zZXR0aW5ncygpLmpzb25fZGF0YS5hamF4LnN1Y2Nlc3M7IA0KLSAgICAgICAgICAgICAgaWYoc2YpIHsgZCA9IHNmLmNhbGwodGhpcyxkLHQseCkgfHwgZDsgfQ0KLSAgICAgICAgICAgICAgaWYoZCA9PT0gIiIgfHwgKCEkLmlzQXJyYXkoZCkgJiYgISQuaXNQbGFpbk9iamVjdChkKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yX2Z1bmMuY2FsbCh0aGlzLCB4LCB0LCAiIik7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICBkID0gdGhpcy5fcGFyc2VfanNvbihkKTsNCi0gICAgICAgICAgICAgIGlmKGQpIHsNCi0gICAgICAgICAgICAgICAgaWYob2JqID09PSAtMSB8fCAhb2JqKSB7IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCkuYXBwZW5kKGQuY2hpbGRyZW4oKSk7IH0NCi0gICAgICAgICAgICAgICAgZWxzZSB7IG9iai5hcHBlbmQoZCkuY2hpbGRyZW4oIi5qc3RyZWUtbG9hZGluZyIpLnJlbW92ZUNsYXNzKCJqc3RyZWUtbG9hZGluZyIpOyBvYmouZGF0YSgianN0cmVlLWlzLWxvYWRpbmciLGZhbHNlKTsgfQ0KLSAgICAgICAgICAgICAgICB0aGlzLmNsZWFuX25vZGUob2JqKTsNCi0gICAgICAgICAgICAgICAgaWYoc19jYWxsKSB7IHNfY2FsbC5jYWxsKHRoaXMpOyB9DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYob2JqID09PSAtMSB8fCAhb2JqKSB7DQotICAgICAgICAgICAgICAgICAgaWYocy5jb3JyZWN0X3N0YXRlKSB7IA0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikuZW1wdHkoKTsgDQotICAgICAgICAgICAgICAgICAgICBpZihzX2NhbGwpIHsgc19jYWxsLmNhbGwodGhpcyk7IH0NCi0gICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgICAgb2JqLmNoaWxkcmVuKCIuanN0cmVlLWxvYWRpbmciKS5yZW1vdmVDbGFzcygianN0cmVlLWxvYWRpbmciKTsNCi0gICAgICAgICAgICAgICAgICBvYmouZGF0YSgianN0cmVlLWlzLWxvYWRpbmciLGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgICBpZihzLmNvcnJlY3Rfc3RhdGUpIHsgDQotICAgICAgICAgICAgICAgICAgICBvYmoucmVtb3ZlQ2xhc3MoImpzdHJlZS1vcGVuIGpzdHJlZS1jbG9zZWQiKS5hZGRDbGFzcygianN0cmVlLWxlYWYiKTsgDQotICAgICAgICAgICAgICAgICAgICBpZihzX2NhbGwpIHsgc19jYWxsLmNhbGwodGhpcyk7IH0gDQotICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICBzLmFqYXguY29udGV4dCA9IHRoaXM7DQotICAgICAgICAgICAgcy5hamF4LmVycm9yID0gZXJyb3JfZnVuYzsNCi0gICAgICAgICAgICBzLmFqYXguc3VjY2VzcyA9IHN1Y2Nlc3NfZnVuYzsNCi0gICAgICAgICAgICBpZighcy5hamF4LmRhdGFUeXBlKSB7IHMuYWpheC5kYXRhVHlwZSA9ICJqc29uIjsgfQ0KLSAgICAgICAgICAgIGlmKCQuaXNGdW5jdGlvbihzLmFqYXgudXJsKSkgeyBzLmFqYXgudXJsID0gcy5hamF4LnVybC5jYWxsKHRoaXMsIG9iaik7IH0NCi0gICAgICAgICAgICBpZigkLmlzRnVuY3Rpb24ocy5hamF4LmRhdGEpKSB7IHMuYWpheC5kYXRhID0gcy5hamF4LmRhdGEuY2FsbCh0aGlzLCBvYmopOyB9DQotICAgICAgICAgICAgJC5hamF4KHMuYWpheCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgfSwNCi0gICAgICBfcGFyc2VfanNvbiA6IGZ1bmN0aW9uIChqcywgaXNfY2FsbGJhY2spIHsNCi0gICAgICAgIHZhciBkID0gZmFsc2UsIA0KLSAgICAgICAgICBwID0gdGhpcy5fZ2V0X3NldHRpbmdzKCksDQotICAgICAgICAgIHMgPSBwLmpzb25fZGF0YSwNCi0gICAgICAgICAgdCA9IHAuY29yZS5odG1sX3RpdGxlcywNCi0gICAgICAgICAgdG1wLCBpLCBqLCB1bDEsIHVsMjsNCi0NCi0gICAgICAgIGlmKCFqcykgeyByZXR1cm4gZDsgfQ0KLSAgICAgICAgaWYoJC5pc0Z1bmN0aW9uKGpzKSkgeyANCi0gICAgICAgICAganMgPSBqcy5jYWxsKHRoaXMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoJC5pc0FycmF5KGpzKSkgew0KLSAgICAgICAgICBkID0gJCgpOw0KLSAgICAgICAgICBpZighanMubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgICBmb3IoaSA9IDAsIGogPSBqcy5sZW5ndGg7IGkgPCBqOyBpKyspIHsNCi0gICAgICAgICAgICB0bXAgPSB0aGlzLl9wYXJzZV9qc29uKGpzW2ldLCB0cnVlKTsNCi0gICAgICAgICAgICBpZih0bXAubGVuZ3RoKSB7IGQgPSBkLmFkZCh0bXApOyB9DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICBpZih0eXBlb2YganMgPT0gInN0cmluZyIpIHsganMgPSB7IGRhdGEgOiBqcyB9OyB9DQotICAgICAgICAgIGlmKCFqcy5kYXRhICYmIGpzLmRhdGEgIT09ICIiKSB7IHJldHVybiBkOyB9DQotICAgICAgICAgIGQgPSAkKCI8bGk+Iik7DQotICAgICAgICAgIGlmKGpzLmF0dHIpIHsgZC5hdHRyKGpzLmF0dHIpOyB9DQotICAgICAgICAgIGlmKGpzLm1ldGFkYXRhKSB7IGQuZGF0YSgianN0cmVlIiwganMubWV0YWRhdGEpOyB9DQotICAgICAgICAgIGlmKGpzLnN0YXRlKSB7IGQuYWRkQ2xhc3MoImpzdHJlZS0iICsganMuc3RhdGUpOyB9DQotICAgICAgICAgIGlmKCEkLmlzQXJyYXkoanMuZGF0YSkpIHsgdG1wID0ganMuZGF0YTsganMuZGF0YSA9IFtdOyBqcy5kYXRhLnB1c2godG1wKTsgfQ0KLSAgICAgICAgICAkLmVhY2goanMuZGF0YSwgZnVuY3Rpb24gKGksIG0pIHsNCi0gICAgICAgICAgICB0bXAgPSAkKCI8YT4iKTsNCi0gICAgICAgICAgICBpZigkLmlzRnVuY3Rpb24obSkpIHsgbSA9IG0uY2FsbCh0aGlzLCBqcyk7IH0NCi0gICAgICAgICAgICBpZih0eXBlb2YgbSA9PSAic3RyaW5nIikgeyB0bXAuYXR0cignaHJlZicsJyMnKVsgdCA/ICJodG1sIiA6ICJ0ZXh0IiBdKG0pOyB9DQotICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICBpZighbS5hdHRyKSB7IG0uYXR0ciA9IHt9OyB9DQotICAgICAgICAgICAgICBpZighbS5hdHRyLmhyZWYpIHsgbS5hdHRyLmhyZWYgPSAnIyc7IH0NCi0gICAgICAgICAgICAgIHRtcC5hdHRyKG0uYXR0cilbIHQgPyAiaHRtbCIgOiAidGV4dCIgXShtLnRpdGxlKTsNCi0gICAgICAgICAgICAgIGlmKG0ubGFuZ3VhZ2UpIHsgdG1wLmFkZENsYXNzKG0ubGFuZ3VhZ2UpOyB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRtcC5wcmVwZW5kKCI8aW5zIGNsYXNzPSdqc3RyZWUtaWNvbic+JiMxNjA7PC9pbnM+Iik7DQotICAgICAgICAgICAgaWYoIW0uaWNvbiAmJiBqcy5pY29uKSB7IG0uaWNvbiA9IGpzLmljb247IH0NCi0gICAgICAgICAgICBpZihtLmljb24pIHsgDQotICAgICAgICAgICAgICBpZihtLmljb24uaW5kZXhPZigiLyIpID09PSAtMSkgeyB0bXAuY2hpbGRyZW4oImlucyIpLmFkZENsYXNzKG0uaWNvbik7IH0NCi0gICAgICAgICAgICAgIGVsc2UgeyB0bXAuY2hpbGRyZW4oImlucyIpLmNzcygiYmFja2dyb3VuZCIsInVybCgnIiArIG0uaWNvbiArICInKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdCIpOyB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGQuYXBwZW5kKHRtcCk7DQotICAgICAgICAgIH0pOw0KLSAgICAgICAgICBkLnByZXBlbmQoIjxpbnMgY2xhc3M9J2pzdHJlZS1pY29uJz4mIzE2MDs8L2lucz4iKTsNCi0gICAgICAgICAgaWYoanMuY2hpbGRyZW4pIHsgDQotICAgICAgICAgICAgaWYocy5wcm9ncmVzc2l2ZV9yZW5kZXIgJiYganMuc3RhdGUgIT09ICJvcGVuIikgew0KLSAgICAgICAgICAgICAgZC5hZGRDbGFzcygianN0cmVlLWNsb3NlZCIpLmRhdGEoImpzdHJlZS1jaGlsZHJlbiIsIGpzLmNoaWxkcmVuKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICBpZigkLmlzRnVuY3Rpb24oanMuY2hpbGRyZW4pKSB7DQotICAgICAgICAgICAgICAgIGpzLmNoaWxkcmVuID0ganMuY2hpbGRyZW4uY2FsbCh0aGlzLCBqcyk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICBpZigkLmlzQXJyYXkoanMuY2hpbGRyZW4pICYmIGpzLmNoaWxkcmVuLmxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICB0bXAgPSB0aGlzLl9wYXJzZV9qc29uKGpzLmNoaWxkcmVuLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgaWYodG1wLmxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAgIHVsMiA9ICQoIjx1bD4iKTsNCi0gICAgICAgICAgICAgICAgICB1bDIuYXBwZW5kKHRtcCk7DQotICAgICAgICAgICAgICAgICAgZC5hcHBlbmQodWwyKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoIWlzX2NhbGxiYWNrKSB7DQotICAgICAgICAgIHVsMSA9ICQoIjx1bD4iKTsNCi0gICAgICAgICAgdWwxLmFwcGVuZChkKTsNCi0gICAgICAgICAgZCA9IHVsMTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBkOw0KLSAgICAgIH0sDQotICAgICAgZ2V0X2pzb24gOiBmdW5jdGlvbiAob2JqLCBsaV9hdHRyLCBhX2F0dHIsIGlzX2NhbGxiYWNrKSB7DQotICAgICAgICB2YXIgcmVzdWx0ID0gW10sIA0KLSAgICAgICAgICBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCksIA0KLSAgICAgICAgICBfdGhpcyA9IHRoaXMsDQotICAgICAgICAgIHRtcDEsIHRtcDIsIGxpLCBhLCB0LCBsYW5nOw0KLSAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsNCi0gICAgICAgIGlmKCFvYmogfHwgb2JqID09PSAtMSkgeyBvYmogPSB0aGlzLmdldF9jb250YWluZXIoKS5maW5kKCI+IHVsID4gbGkiKTsgfQ0KLSAgICAgICAgbGlfYXR0ciA9ICQuaXNBcnJheShsaV9hdHRyKSA/IGxpX2F0dHIgOiBbICJpZCIsICJjbGFzcyIgXTsNCi0gICAgICAgIGlmKCFpc19jYWxsYmFjayAmJiB0aGlzLmRhdGEudHlwZXMpIHsgbGlfYXR0ci5wdXNoKHMudHlwZXMudHlwZV9hdHRyKTsgfQ0KLSAgICAgICAgYV9hdHRyID0gJC5pc0FycmF5KGFfYXR0cikgPyBhX2F0dHIgOiBbIF07DQotDQotICAgICAgICBvYmouZWFjaChmdW5jdGlvbiAoKSB7DQotICAgICAgICAgIGxpID0gJCh0aGlzKTsNCi0gICAgICAgICAgdG1wMSA9IHsgZGF0YSA6IFtdIH07DQotICAgICAgICAgIGlmKGxpX2F0dHIubGVuZ3RoKSB7IHRtcDEuYXR0ciA9IHsgfTsgfQ0KLSAgICAgICAgICAkLmVhY2gobGlfYXR0ciwgZnVuY3Rpb24gKGksIHYpIHsgDQotICAgICAgICAgICAgdG1wMiA9IGxpLmF0dHIodik7IA0KLSAgICAgICAgICAgIGlmKHRtcDIgJiYgdG1wMi5sZW5ndGggJiYgdG1wMi5yZXBsYWNlKC9qc3RyZWVbXiBdKnwkL2lnLCcnKS5sZW5ndGgpIHsNCi0gICAgICAgICAgICAgIHRtcDEuYXR0clt2XSA9IHRtcDIucmVwbGFjZSgvanN0cmVlW14gXSp8JC9pZywnJyk7IA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSk7DQotICAgICAgICAgIGlmKGxpLmhhc0NsYXNzKCJqc3RyZWUtb3BlbiIpKSB7IHRtcDEuc3RhdGUgPSAib3BlbiI7IH0NCi0gICAgICAgICAgaWYobGkuaGFzQ2xhc3MoImpzdHJlZS1jbG9zZWQiKSkgeyB0bXAxLnN0YXRlID0gImNsb3NlZCI7IH0NCi0gICAgICAgICAgYSA9IGxpLmNoaWxkcmVuKCJhIik7DQotICAgICAgICAgIGEuZWFjaChmdW5jdGlvbiAoKSB7DQotICAgICAgICAgICAgdCA9ICQodGhpcyk7DQotICAgICAgICAgICAgaWYoDQotICAgICAgICAgICAgICBhX2F0dHIubGVuZ3RoIHx8IA0KLSAgICAgICAgICAgICAgJC5pbkFycmF5KCJsYW5ndWFnZXMiLCBzLnBsdWdpbnMpICE9PSAtMSB8fCANCi0gICAgICAgICAgICAgIHQuY2hpbGRyZW4oImlucyIpLmdldCgwKS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UubGVuZ3RoIHx8IA0KLSAgICAgICAgICAgICAgKHQuY2hpbGRyZW4oImlucyIpLmdldCgwKS5jbGFzc05hbWUgJiYgdC5jaGlsZHJlbigiaW5zIikuZ2V0KDApLmNsYXNzTmFtZS5yZXBsYWNlKC9qc3RyZWVbXiBdKnwkL2lnLCcnKS5sZW5ndGgpDQotICAgICAgICAgICAgKSB7IA0KLSAgICAgICAgICAgICAgbGFuZyA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgaWYoJC5pbkFycmF5KCJsYW5ndWFnZXMiLCBzLnBsdWdpbnMpICE9PSAtMSAmJiAkLmlzQXJyYXkocy5sYW5ndWFnZXMpICYmIHMubGFuZ3VhZ2VzLmxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICAkLmVhY2gocy5sYW5ndWFnZXMsIGZ1bmN0aW9uIChsLCBsdikgew0KLSAgICAgICAgICAgICAgICAgIGlmKHQuaGFzQ2xhc3MobHYpKSB7DQotICAgICAgICAgICAgICAgICAgICBsYW5nID0gbHY7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIHRtcDIgPSB7IGF0dHIgOiB7IH0sIHRpdGxlIDogX3RoaXMuZ2V0X3RleHQodCwgbGFuZykgfTsgDQotICAgICAgICAgICAgICAkLmVhY2goYV9hdHRyLCBmdW5jdGlvbiAoaywgeikgew0KLSAgICAgICAgICAgICAgICB0bXAxLmF0dHJbel0gPSAodC5hdHRyKHopIHx8ICIiKS5yZXBsYWNlKC9qc3RyZWVbXiBdKnwkL2lnLCcnKTsNCi0gICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgICAgJC5lYWNoKHMubGFuZ3VhZ2VzLCBmdW5jdGlvbiAoaywgeikgew0KLSAgICAgICAgICAgICAgICBpZih0Lmhhc0NsYXNzKHopKSB7IHRtcDIubGFuZ3VhZ2UgPSB6OyByZXR1cm4gdHJ1ZTsgfQ0KLSAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgICBpZih0LmNoaWxkcmVuKCJpbnMiKS5nZXQoMCkuY2xhc3NOYW1lLnJlcGxhY2UoL2pzdHJlZVteIF0qfCQvaWcsJycpLnJlcGxhY2UoL15ccyskL2lnLCIiKS5sZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgdG1wMi5pY29uID0gdC5jaGlsZHJlbigiaW5zIikuZ2V0KDApLmNsYXNzTmFtZS5yZXBsYWNlKC9qc3RyZWVbXiBdKnwkL2lnLCcnKS5yZXBsYWNlKC9eXHMrJC9pZywiIik7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICBpZih0LmNoaWxkcmVuKCJpbnMiKS5nZXQoMCkuc3R5bGUuYmFja2dyb3VuZEltYWdlLmxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICB0bXAyLmljb24gPSB0LmNoaWxkcmVuKCJpbnMiKS5nZXQoMCkuc3R5bGUuYmFja2dyb3VuZEltYWdlLnJlcGxhY2UoInVybCgiLCIiKS5yZXBsYWNlKCIpIiwiIik7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgdG1wMiA9IF90aGlzLmdldF90ZXh0KHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihhLmxlbmd0aCA+IDEpIHsgdG1wMS5kYXRhLnB1c2godG1wMik7IH0NCi0gICAgICAgICAgICBlbHNlIHsgdG1wMS5kYXRhID0gdG1wMjsgfQ0KLSAgICAgICAgICB9KTsNCi0gICAgICAgICAgbGkgPSBsaS5maW5kKCI+IHVsID4gbGkiKTsNCi0gICAgICAgICAgaWYobGkubGVuZ3RoKSB7IHRtcDEuY2hpbGRyZW4gPSBfdGhpcy5nZXRfanNvbihsaSwgbGlfYXR0ciwgYV9hdHRyLCB0cnVlKTsgfQ0KLSAgICAgICAgICByZXN1bHQucHVzaCh0bXAxKTsNCi0gICAgICAgIH0pOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICB9DQotICAgIH0NCi0gIH0pOw0KLX0pKGpRdWVyeSk7DQotLy8qLw0KLQ0KLS8qIA0KLSAqIGpzVHJlZSBsYW5ndWFnZXMgcGx1Z2luIDEuMA0KLSAqIEFkZHMgc3VwcG9ydCBmb3IgbXVsdGlwbGUgbGFuZ3VhZ2UgdmVyc2lvbnMgaW4gb25lIHRyZWUNCi0gKiBUaGlzIGJhc2ljYWxseSBhbGxvd3MgZm9yIG1hbnkgdGl0bGVzIGNvZXhpc3RpbmcgaW4gb25lIG5vZGUsIGJ1dCBvbmx5IG9uZSBvZiB0aGVtIGJlaW5nIHZpc2libGUgYXQgYW55IGdpdmVuIHRpbWUNCi0gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbWFpbnRhaW5pbmcgdGhlIHNhbWUgc3RydWN0dXJlIGluIG1hbnkgbGFuZ3VhZ2VzIChoZW5jZSB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luKQ0KLSAqLw0KLShmdW5jdGlvbiAoJCkgew0KLSAgJC5qc3RyZWUucGx1Z2luKCJsYW5ndWFnZXMiLCB7DQotICAgIF9faW5pdCA6IGZ1bmN0aW9uICgpIHsgdGhpcy5fbG9hZF9jc3MoKTsgIH0sDQotICAgIGRlZmF1bHRzIDogW10sDQotICAgIF9mbiA6IHsNCi0gICAgICBzZXRfbGFuZyA6IGZ1bmN0aW9uIChpKSB7IA0KLSAgICAgICAgdmFyIGxhbmdzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkubGFuZ3VhZ2VzLA0KLSAgICAgICAgICBzdCA9IGZhbHNlLA0KLSAgICAgICAgICBzZWxlY3RvciA9ICIuanN0cmVlLSIgKyB0aGlzLmdldF9pbmRleCgpICsgJyBhJzsNCi0gICAgICAgIGlmKCEkLmlzQXJyYXkobGFuZ3MpIHx8IGxhbmdzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIGlmKCQuaW5BcnJheShpLGxhbmdzKSA9PSAtMSkgew0KLSAgICAgICAgICBpZighIWxhbmdzW2ldKSB7IGkgPSBsYW5nc1tpXTsgfQ0KLSAgICAgICAgICBlbHNlIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICB9DQotICAgICAgICBpZihpID09IHRoaXMuZGF0YS5sYW5ndWFnZXMuY3VycmVudF9sYW5ndWFnZSkgeyByZXR1cm4gdHJ1ZTsgfQ0KLSAgICAgICAgc3QgPSAkLnZha2F0YS5jc3MuZ2V0X2NzcyhzZWxlY3RvciArICIuIiArIHRoaXMuZGF0YS5sYW5ndWFnZXMuY3VycmVudF9sYW5ndWFnZSwgZmFsc2UsIHRoaXMuZGF0YS5sYW5ndWFnZXMubGFuZ3VhZ2VfY3NzKTsNCi0gICAgICAgIGlmKHN0ICE9PSBmYWxzZSkgeyBzdC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOyB9DQotICAgICAgICBzdCA9ICQudmFrYXRhLmNzcy5nZXRfY3NzKHNlbGVjdG9yICsgIi4iICsgaSwgZmFsc2UsIHRoaXMuZGF0YS5sYW5ndWFnZXMubGFuZ3VhZ2VfY3NzKTsNCi0gICAgICAgIGlmKHN0ICE9PSBmYWxzZSkgeyBzdC5zdHlsZS5kaXNwbGF5ID0gIiI7IH0NCi0gICAgICAgIHRoaXMuZGF0YS5sYW5ndWFnZXMuY3VycmVudF9sYW5ndWFnZSA9IGk7DQotICAgICAgICB0aGlzLl9fY2FsbGJhY2soaSk7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICB9LA0KLSAgICAgIGdldF9sYW5nIDogZnVuY3Rpb24gKCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sYW5ndWFnZXMuY3VycmVudF9sYW5ndWFnZTsNCi0gICAgICB9LA0KLSAgICAgIGdldF90ZXh0IDogZnVuY3Rpb24gKG9iaiwgbGFuZykgew0KLSAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKSB8fCB0aGlzLmRhdGEudWkubGFzdF9zZWxlY3RlZDsNCi0gICAgICAgIGlmKCFvYmouc2l6ZSgpKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgdmFyIGxhbmdzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkubGFuZ3VhZ2VzLA0KLSAgICAgICAgICBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuY29yZS5odG1sX3RpdGxlczsNCi0gICAgICAgIGlmKCQuaXNBcnJheShsYW5ncykgJiYgbGFuZ3MubGVuZ3RoKSB7DQotICAgICAgICAgIGxhbmcgPSAobGFuZyAmJiAkLmluQXJyYXkobGFuZyxsYW5ncykgIT0gLTEpID8gbGFuZyA6IHRoaXMuZGF0YS5sYW5ndWFnZXMuY3VycmVudF9sYW5ndWFnZTsNCi0gICAgICAgICAgb2JqID0gb2JqLmNoaWxkcmVuKCJhLiIgKyBsYW5nKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgeyBvYmogPSBvYmouY2hpbGRyZW4oImE6ZXEoMCkiKTsgfQ0KLSAgICAgICAgaWYocykgew0KLSAgICAgICAgICBvYmogPSBvYmouY2xvbmUoKTsNCi0gICAgICAgICAgb2JqLmNoaWxkcmVuKCJJTlMiKS5yZW1vdmUoKTsNCi0gICAgICAgICAgcmV0dXJuIG9iai5odG1sKCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgb2JqID0gb2JqLmNvbnRlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5ub2RlVHlwZSA9PSAzOyB9KVswXTsNCi0gICAgICAgICAgcmV0dXJuIG9iai5ub2RlVmFsdWU7DQotICAgICAgICB9DQotICAgICAgfSwNCi0gICAgICBzZXRfdGV4dCA6IGZ1bmN0aW9uIChvYmosIHZhbCwgbGFuZykgew0KLSAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKSB8fCB0aGlzLmRhdGEudWkubGFzdF9zZWxlY3RlZDsNCi0gICAgICAgIGlmKCFvYmouc2l6ZSgpKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgdmFyIGxhbmdzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkubGFuZ3VhZ2VzLA0KLSAgICAgICAgICBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuY29yZS5odG1sX3RpdGxlcywNCi0gICAgICAgICAgdG1wOw0KLSAgICAgICAgaWYoJC5pc0FycmF5KGxhbmdzKSAmJiBsYW5ncy5sZW5ndGgpIHsNCi0gICAgICAgICAgbGFuZyA9IChsYW5nICYmICQuaW5BcnJheShsYW5nLGxhbmdzKSAhPSAtMSkgPyBsYW5nIDogdGhpcy5kYXRhLmxhbmd1YWdlcy5jdXJyZW50X2xhbmd1YWdlOw0KLSAgICAgICAgICBvYmogPSBvYmouY2hpbGRyZW4oImEuIiArIGxhbmcpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7IG9iaiA9IG9iai5jaGlsZHJlbigiYTplcSgwKSIpOyB9DQotICAgICAgICBpZihzKSB7DQotICAgICAgICAgIHRtcCA9IG9iai5jaGlsZHJlbigiSU5TIikuY2xvbmUoKTsNCi0gICAgICAgICAgb2JqLmh0bWwodmFsKS5wcmVwZW5kKHRtcCk7DQotICAgICAgICAgIHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqLCAibmFtZSIgOiB2YWwsICJsYW5nIiA6IGxhbmcgfSk7DQotICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgIG9iaiA9IG9iai5jb250ZW50cygpLmZpbHRlcihmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMubm9kZVR5cGUgPT0gMzsgfSlbMF07DQotICAgICAgICAgIHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqLCAibmFtZSIgOiB2YWwsICJsYW5nIiA6IGxhbmcgfSk7DQotICAgICAgICAgIHJldHVybiAob2JqLm5vZGVWYWx1ZSA9IHZhbCk7DQotICAgICAgICB9DQotICAgICAgfSwNCi0gICAgICBfbG9hZF9jc3MgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgICB2YXIgbGFuZ3MgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS5sYW5ndWFnZXMsDQotICAgICAgICAgIHN0ciA9ICIvKiBsYW5ndWFnZXMgY3NzICovIiwNCi0gICAgICAgICAgc2VsZWN0b3IgPSAiLmpzdHJlZS0iICsgdGhpcy5nZXRfaW5kZXgoKSArICcgYScsDQotICAgICAgICAgIGxuOw0KLSAgICAgICAgaWYoJC5pc0FycmF5KGxhbmdzKSAmJiBsYW5ncy5sZW5ndGgpIHsNCi0gICAgICAgICAgdGhpcy5kYXRhLmxhbmd1YWdlcy5jdXJyZW50X2xhbmd1YWdlID0gbGFuZ3NbMF07DQotICAgICAgICAgIGZvcihsbiA9IDA7IGxuIDwgbGFuZ3MubGVuZ3RoOyBsbisrKSB7DQotICAgICAgICAgICAgc3RyICs9IHNlbGVjdG9yICsgIi4iICsgbGFuZ3NbbG5dICsgIiB7IjsNCi0gICAgICAgICAgICBpZihsYW5nc1tsbl0gIT0gdGhpcy5kYXRhLmxhbmd1YWdlcy5jdXJyZW50X2xhbmd1YWdlKSB7IHN0ciArPSAiIGRpc3BsYXk6bm9uZTsgIjsgfQ0KLSAgICAgICAgICAgIHN0ciArPSAiIH0gIjsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aGlzLmRhdGEubGFuZ3VhZ2VzLmxhbmd1YWdlX2NzcyA9ICQudmFrYXRhLmNzcy5hZGRfc2hlZXQoeyAnc3RyJyA6IHN0ciB9KTsNCi0gICAgICAgIH0NCi0gICAgICB9LA0KLSAgICAgIGNyZWF0ZV9ub2RlIDogZnVuY3Rpb24gKG9iaiwgcG9zaXRpb24sIGpzLCBjYWxsYmFjaykgew0KLSAgICAgICAgdmFyIHQgPSB0aGlzLl9fY2FsbF9vbGQodHJ1ZSwgb2JqLCBwb3NpdGlvbiwganMsIGZ1bmN0aW9uICh0KSB7DQotICAgICAgICAgIHZhciBsYW5ncyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLmxhbmd1YWdlcywNCi0gICAgICAgICAgICBhID0gdC5jaGlsZHJlbigiYSIpLA0KLSAgICAgICAgICAgIGxuOw0KLSAgICAgICAgICBpZigkLmlzQXJyYXkobGFuZ3MpICYmIGxhbmdzLmxlbmd0aCkgew0KLSAgICAgICAgICAgIGZvcihsbiA9IDA7IGxuIDwgbGFuZ3MubGVuZ3RoOyBsbisrKSB7DQotICAgICAgICAgICAgICBpZighYS5pcygiLiIgKyBsYW5nc1tsbl0pKSB7DQotICAgICAgICAgICAgICAgIHQuYXBwZW5kKGEuZXEoMCkuY2xvbmUoKS5yZW1vdmVDbGFzcyhsYW5ncy5qb2luKCIgIikpLmFkZENsYXNzKGxhbmdzW2xuXSkpOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBhLm5vdCgiLiIgKyBsYW5ncy5qb2luKCIsIC4iKSkucmVtb3ZlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYoY2FsbGJhY2spIHsgY2FsbGJhY2suY2FsbCh0aGlzLCB0KTsgfQ0KLSAgICAgICAgfSk7DQotICAgICAgICByZXR1cm4gdDsNCi0gICAgICB9DQotICAgIH0NCi0gIH0pOw0KLX0pKGpRdWVyeSk7DQotLy8qLw0KLQ0KLS8qDQotICoganNUcmVlIGNvb2tpZXMgcGx1Z2luIDEuMA0KLSAqIFN0b3JlcyB0aGUgY3VycmVudGx5IG9wZW5lZC9zZWxlY3RlZCBub2RlcyBpbiBhIGNvb2tpZSBhbmQgdGhlbiByZXN0b3JlcyB0aGVtDQotICogRGVwZW5kcyBvbiB0aGUganF1ZXJ5LmNvb2tpZSBwbHVnaW4NCi0gKi8NCi0oZnVuY3Rpb24gKCQpIHsNCi0gICQuanN0cmVlLnBsdWdpbigiY29va2llcyIsIHsNCi0gICAgX19pbml0IDogZnVuY3Rpb24gKCkgew0KLSAgICAgIGlmKHR5cGVvZiAkLmNvb2tpZSA9PT0gInVuZGVmaW5lZCIpIHsgdGhyb3cgImpzVHJlZSBjb29raWU6IGpRdWVyeSBjb29raWUgcGx1Z2luIG5vdCBpbmNsdWRlZC4iOyB9DQotDQotICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS5jb29raWVzLA0KLSAgICAgICAgdG1wOw0KLSAgICAgIGlmKCEhcy5zYXZlX29wZW5lZCkgew0KLSAgICAgICAgdG1wID0gJC5jb29raWUocy5zYXZlX29wZW5lZCk7DQotICAgICAgICBpZih0bXAgJiYgdG1wLmxlbmd0aCkgeyB0aGlzLmRhdGEuY29yZS50b19vcGVuID0gdG1wLnNwbGl0KCIsIik7IH0NCi0gICAgICB9DQotICAgICAgaWYoISFzLnNhdmVfc2VsZWN0ZWQpIHsNCi0gICAgICAgIHRtcCA9ICQuY29va2llKHMuc2F2ZV9zZWxlY3RlZCk7DQotICAgICAgICBpZih0bXAgJiYgdG1wLmxlbmd0aCAmJiB0aGlzLmRhdGEudWkpIHsgdGhpcy5kYXRhLnVpLnRvX3NlbGVjdCA9IHRtcC5zcGxpdCgiLCIpOyB9DQotICAgICAgfQ0KLSAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpDQotICAgICAgICAub25lKCAoIHRoaXMuZGF0YS51aSA/ICJyZXNlbGVjdCIgOiAicmVvcGVuIiApICsgIi5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkNCi0gICAgICAgICAgICAuYmluZCgib3Blbl9ub2RlLmpzdHJlZSBjbG9zZV9ub2RlLmpzdHJlZSBzZWxlY3Rfbm9kZS5qc3RyZWUgZGVzZWxlY3Rfbm9kZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7IA0KLSAgICAgICAgICAgICAgICBpZih0aGlzLl9nZXRfc2V0dGluZ3MoKS5jb29raWVzLmF1dG9fc2F2ZSkgeyB0aGlzLnNhdmVfY29va2llKChlLmhhbmRsZU9iai5uYW1lc3BhY2UgKyBlLmhhbmRsZU9iai50eXBlKS5yZXBsYWNlKCJqc3RyZWUiLCIiKSk7IH0NCi0gICAgICAgICAgICAgIH0sIHRoaXMpKTsNCi0gICAgICAgIH0sIHRoaXMpKTsNCi0gICAgfSwNCi0gICAgZGVmYXVsdHMgOiB7DQotICAgICAgc2F2ZV9vcGVuZWQgICAgOiAianN0cmVlX29wZW4iLA0KLSAgICAgIHNhdmVfc2VsZWN0ZWQgIDogImpzdHJlZV9zZWxlY3QiLA0KLSAgICAgIGF1dG9fc2F2ZSAgICA6IHRydWUsDQotICAgICAgY29va2llX29wdGlvbnMgIDoge30NCi0gICAgfSwNCi0gICAgX2ZuIDogew0KLSAgICAgIHNhdmVfY29va2llIDogZnVuY3Rpb24gKGMpIHsNCi0gICAgICAgIGlmKHRoaXMuZGF0YS5jb3JlLnJlZnJlc2hpbmcpIHsgcmV0dXJuOyB9DQotICAgICAgICB2YXIgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLmNvb2tpZXM7DQotICAgICAgICBpZighYykgeyAvLyBpZiBjYWxsZWQgbWFudWFsbHkgYW5kIG5vdCBieSBldmVudA0KLSAgICAgICAgICBpZihzLnNhdmVfb3BlbmVkKSB7DQotICAgICAgICAgICAgdGhpcy5zYXZlX29wZW5lZCgpOw0KLSAgICAgICAgICAgICQuY29va2llKHMuc2F2ZV9vcGVuZWQsIHRoaXMuZGF0YS5jb3JlLnRvX29wZW4uam9pbigiLCIpLCBzLmNvb2tpZV9vcHRpb25zKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZihzLnNhdmVfc2VsZWN0ZWQgJiYgdGhpcy5kYXRhLnVpKSB7DQotICAgICAgICAgICAgdGhpcy5zYXZlX3NlbGVjdGVkKCk7DQotICAgICAgICAgICAgJC5jb29raWUocy5zYXZlX3NlbGVjdGVkLCB0aGlzLmRhdGEudWkudG9fc2VsZWN0LmpvaW4oIiwiKSwgcy5jb29raWVfb3B0aW9ucyk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3dpdGNoKGMpIHsNCi0gICAgICAgICAgY2FzZSAib3Blbl9ub2RlIjoNCi0gICAgICAgICAgY2FzZSAiY2xvc2Vfbm9kZSI6DQotICAgICAgICAgICAgaWYoISFzLnNhdmVfb3BlbmVkKSB7IA0KLSAgICAgICAgICAgICAgdGhpcy5zYXZlX29wZW5lZCgpOyANCi0gICAgICAgICAgICAgICQuY29va2llKHMuc2F2ZV9vcGVuZWQsIHRoaXMuZGF0YS5jb3JlLnRvX29wZW4uam9pbigiLCIpLCBzLmNvb2tpZV9vcHRpb25zKTsgDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICBjYXNlICJzZWxlY3Rfbm9kZSI6DQotICAgICAgICAgIGNhc2UgImRlc2VsZWN0X25vZGUiOg0KLSAgICAgICAgICAgIGlmKCEhcy5zYXZlX3NlbGVjdGVkICYmIHRoaXMuZGF0YS51aSkgeyANCi0gICAgICAgICAgICAgIHRoaXMuc2F2ZV9zZWxlY3RlZCgpOyANCi0gICAgICAgICAgICAgICQuY29va2llKHMuc2F2ZV9zZWxlY3RlZCwgdGhpcy5kYXRhLnVpLnRvX3NlbGVjdC5qb2luKCIsIiksIHMuY29va2llX29wdGlvbnMpOyANCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9KTsNCi0gIC8vIGluY2x1ZGUgY29va2llcyBieSBkZWZhdWx0DQotICAkLmpzdHJlZS5kZWZhdWx0cy5wbHVnaW5zLnB1c2goImNvb2tpZXMiKTsNCi19KShqUXVlcnkpOw0KLS8vKi8NCi0NCi0vKg0KLSAqIGpzVHJlZSBzb3J0IHBsdWdpbiAxLjANCi0gKiBTb3J0cyBpdGVtcyBhbHBoYWJldGljYWxseSAob3IgdXNpbmcgYW55IG90aGVyIGZ1bmN0aW9uKQ0KLSAqLw0KLShmdW5jdGlvbiAoJCkgew0KLSAgJC5qc3RyZWUucGx1Z2luKCJzb3J0Iiwgew0KLSAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkNCi0gICAgICAgIC5iaW5kKCJsb2FkX25vZGUuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkgew0KLSAgICAgICAgICAgIHZhciBvYmogPSB0aGlzLl9nZXRfbm9kZShkYXRhLnJzbHQub2JqKTsNCi0gICAgICAgICAgICBvYmogPSBvYmogPT09IC0xID8gdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikgOiBvYmouY2hpbGRyZW4oInVsIik7DQotICAgICAgICAgICAgdGhpcy5zb3J0KG9iaik7DQotICAgICAgICAgIH0sIHRoaXMpKQ0KLSAgICAgICAgLmJpbmQoInJlbmFtZV9ub2RlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHsNCi0gICAgICAgICAgICB0aGlzLnNvcnQoZGF0YS5yc2x0Lm9iai5wYXJlbnQoKSk7DQotICAgICAgICAgIH0sIHRoaXMpKQ0KLSAgICAgICAgLmJpbmQoIm1vdmVfbm9kZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7DQotICAgICAgICAgICAgdmFyIG0gPSBkYXRhLnJzbHQubnAgPT0gLTEgPyB0aGlzLmdldF9jb250YWluZXIoKSA6IGRhdGEucnNsdC5ucDsNCi0gICAgICAgICAgICB0aGlzLnNvcnQobS5jaGlsZHJlbigidWwiKSk7DQotICAgICAgICAgIH0sIHRoaXMpKTsNCi0gICAgfSwNCi0gICAgZGVmYXVsdHMgOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gdGhpcy5nZXRfdGV4dChhKSA+IHRoaXMuZ2V0X3RleHQoYikgPyAxIDogLTE7IH0sDQotICAgIF9mbiA6IHsNCi0gICAgICBzb3J0IDogZnVuY3Rpb24gKG9iaikgew0KLSAgICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS5zb3J0LA0KLSAgICAgICAgICB0ID0gdGhpczsNCi0gICAgICAgIG9iai5hcHBlbmQoJC5tYWtlQXJyYXkob2JqLmNoaWxkcmVuKCJsaSIpKS5zb3J0KCQucHJveHkocywgdCkpKTsNCi0gICAgICAgIG9iai5maW5kKCI+IGxpID4gdWwiKS5lYWNoKGZ1bmN0aW9uKCkgeyB0LnNvcnQoJCh0aGlzKSk7IH0pOw0KLSAgICAgICAgdGhpcy5jbGVhbl9ub2RlKG9iaik7DQotICAgICAgfQ0KLSAgICB9DQotICB9KTsNCi19KShqUXVlcnkpOw0KLS8vKi8NCi0NCi0vKg0KLSAqIGpzVHJlZSBETkQgcGx1Z2luIDEuMA0KLSAqIERyYWcgYW5kIGRyb3AgcGx1Z2luIGZvciBtb3ZpbmcvY29weWluZyBub2Rlcw0KLSAqLw0KLShmdW5jdGlvbiAoJCkgew0KLSAgdmFyIG8gPSBmYWxzZSwNCi0gICAgciA9IGZhbHNlLA0KLSAgICBtID0gZmFsc2UsDQotICAgIHNsaSA9IGZhbHNlLA0KLSAgICBzdGkgPSBmYWxzZSwNCi0gICAgZGlyMSA9IGZhbHNlLA0KLSAgICBkaXIyID0gZmFsc2U7DQotICAkLnZha2F0YS5kbmQgPSB7DQotICAgIGlzX2Rvd24gOiBmYWxzZSwNCi0gICAgaXNfZHJhZyA6IGZhbHNlLA0KLSAgICBoZWxwZXIgOiBmYWxzZSwNCi0gICAgc2Nyb2xsX3NwZCA6IDEwLA0KLSAgICBpbml0X3ggOiAwLA0KLSAgICBpbml0X3kgOiAwLA0KLSAgICB0aHJlc2hvbGQgOiA1LA0KLSAgICB1c2VyX2RhdGEgOiB7fSwNCi0NCi0gICAgZHJhZ19zdGFydCA6IGZ1bmN0aW9uIChlLCBkYXRhLCBodG1sKSB7IA0KLSAgICAgIGlmKCQudmFrYXRhLmRuZC5pc19kcmFnKSB7ICQudmFrYXRhLmRyYWdfc3RvcCh7fSk7IH0NCi0gICAgICB0cnkgew0KLSAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnVuc2VsZWN0YWJsZSA9ICJvbiI7DQotICAgICAgICBlLmN1cnJlbnRUYXJnZXQub25zZWxlY3RzdGFydCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH07DQotICAgICAgICBpZihlLmN1cnJlbnRUYXJnZXQuc3R5bGUpIHsgZS5jdXJyZW50VGFyZ2V0LnN0eWxlLk1velVzZXJTZWxlY3QgPSAibm9uZSI7IH0NCi0gICAgICB9IGNhdGNoKGVycikgeyB9DQotICAgICAgJC52YWthdGEuZG5kLmluaXRfeCA9IGUucGFnZVg7DQotICAgICAgJC52YWthdGEuZG5kLmluaXRfeSA9IGUucGFnZVk7DQotICAgICAgJC52YWthdGEuZG5kLnVzZXJfZGF0YSA9IGRhdGE7DQotICAgICAgJC52YWthdGEuZG5kLmlzX2Rvd24gPSB0cnVlOw0KLSAgICAgICQudmFrYXRhLmRuZC5oZWxwZXIgPSAkKCI8ZGl2IGlkPSd2YWthdGEtZHJhZ2dlZCc+IikuaHRtbChodG1sKS5jc3MoIm9wYWNpdHkiLCAiMC43NSIpOw0KLSAgICAgICQoZG9jdW1lbnQpLmJpbmQoIm1vdXNlbW92ZSIsICQudmFrYXRhLmRuZC5kcmFnKTsNCi0gICAgICAkKGRvY3VtZW50KS5iaW5kKCJtb3VzZXVwIiwgJC52YWthdGEuZG5kLmRyYWdfc3RvcCk7DQotICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9LA0KLSAgICBkcmFnIDogZnVuY3Rpb24gKGUpIHsgDQotICAgICAgaWYoISQudmFrYXRhLmRuZC5pc19kb3duKSB7IHJldHVybjsgfQ0KLSAgICAgIGlmKCEkLnZha2F0YS5kbmQuaXNfZHJhZykgew0KLSAgICAgICAgaWYoTWF0aC5hYnMoZS5wYWdlWCAtICQudmFrYXRhLmRuZC5pbml0X3gpID4gNSB8fCBNYXRoLmFicyhlLnBhZ2VZIC0gJC52YWthdGEuZG5kLmluaXRfeSkgPiA1KSB7IA0KLSAgICAgICAgICAkLnZha2F0YS5kbmQuaGVscGVyLmFwcGVuZFRvKCJib2R5Iik7DQotICAgICAgICAgICQudmFrYXRhLmRuZC5pc19kcmFnID0gdHJ1ZTsNCi0gICAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlckhhbmRsZXIoImRyYWdfc3RhcnQudmFrYXRhIiwgeyAiZXZlbnQiIDogZSwgImRhdGEiIDogJC52YWthdGEuZG5kLnVzZXJfZGF0YSB9KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgeyByZXR1cm47IH0NCi0gICAgICB9DQotDQotICAgICAgLy8gbWF5YmUgdXNlIGEgc2Nyb2xsaW5nIHBhcmVudCBlbGVtZW50IGluc3RlYWQgb2YgZG9jdW1lbnQ/DQotICAgICAgaWYoZS50eXBlID09PSAibW91c2Vtb3ZlIikgeyAvLyB0aG91Z2h0IG9mIGFkZGluZyBzY3JvbGwgaW4gb3JkZXIgdG8gbW92ZSB0aGUgaGVscGVyLCBidXQgbW91c2UgcG9pc2l0aW9uIGlzIG4vYQ0KLSAgICAgICAgdmFyIGQgPSAkKGRvY3VtZW50KSwgdCA9IGQuc2Nyb2xsVG9wKCksIGwgPSBkLnNjcm9sbExlZnQoKTsNCi0gICAgICAgIGlmKGUucGFnZVkgLSB0IDwgMjApIHsgDQotICAgICAgICAgIGlmKHN0aSAmJiBkaXIxID09PSAiZG93biIpIHsgY2xlYXJJbnRlcnZhbChzdGkpOyBzdGkgPSBmYWxzZTsgfQ0KLSAgICAgICAgICBpZighc3RpKSB7IGRpcjEgPSAidXAiOyBzdGkgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSAtICQudmFrYXRhLmRuZC5zY3JvbGxfc3BkKTsgfSwgMTUwKTsgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7IA0KLSAgICAgICAgICBpZihzdGkgJiYgZGlyMSA9PT0gInVwIikgeyBjbGVhckludGVydmFsKHN0aSk7IHN0aSA9IGZhbHNlOyB9DQotICAgICAgICB9DQotICAgICAgICBpZigkKHdpbmRvdykuaGVpZ2h0KCkgLSAoZS5wYWdlWSAtIHQpIDwgMjApIHsNCi0gICAgICAgICAgaWYoc3RpICYmIGRpcjEgPT09ICJ1cCIpIHsgY2xlYXJJbnRlcnZhbChzdGkpOyBzdGkgPSBmYWxzZTsgfQ0KLSAgICAgICAgICBpZighc3RpKSB7IGRpcjEgPSAiZG93biI7IHN0aSA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsgJChkb2N1bWVudCkuc2Nyb2xsVG9wKCQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpICsgJC52YWthdGEuZG5kLnNjcm9sbF9zcGQpOyB9LCAxNTApOyB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsgDQotICAgICAgICAgIGlmKHN0aSAmJiBkaXIxID09PSAiZG93biIpIHsgY2xlYXJJbnRlcnZhbChzdGkpOyBzdGkgPSBmYWxzZTsgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoZS5wYWdlWCAtIGwgPCAyMCkgew0KLSAgICAgICAgICBpZihzbGkgJiYgZGlyMiA9PT0gInJpZ2h0IikgeyBjbGVhckludGVydmFsKHNsaSk7IHNsaSA9IGZhbHNlOyB9DQotICAgICAgICAgIGlmKCFzbGkpIHsgZGlyMiA9ICJsZWZ0Ijsgc2xpID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgeyAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSAtICQudmFrYXRhLmRuZC5zY3JvbGxfc3BkKTsgfSwgMTUwKTsgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7IA0KLSAgICAgICAgICBpZihzbGkgJiYgZGlyMiA9PT0gImxlZnQiKSB7IGNsZWFySW50ZXJ2YWwoc2xpKTsgc2xpID0gZmFsc2U7IH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmKCQod2luZG93KS53aWR0aCgpIC0gKGUucGFnZVggLSBsKSA8IDIwKSB7DQotICAgICAgICAgIGlmKHNsaSAmJiBkaXIyID09PSAibGVmdCIpIHsgY2xlYXJJbnRlcnZhbChzbGkpOyBzbGkgPSBmYWxzZTsgfQ0KLSAgICAgICAgICBpZighc2xpKSB7IGRpcjIgPSAicmlnaHQiOyBzbGkgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpICsgJC52YWthdGEuZG5kLnNjcm9sbF9zcGQpOyB9LCAxNTApOyB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsgDQotICAgICAgICAgIGlmKHNsaSAmJiBkaXIyID09PSAicmlnaHQiKSB7IGNsZWFySW50ZXJ2YWwoc2xpKTsgc2xpID0gZmFsc2U7IH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotICAgICAgJC52YWthdGEuZG5kLmhlbHBlci5jc3MoeyBsZWZ0IDogKGUucGFnZVggKyA1KSArICJweCIsIHRvcCA6IChlLnBhZ2VZICsgMTApICsgInB4IiB9KTsNCi0gICAgICAkKGRvY3VtZW50KS50cmlnZ2VySGFuZGxlcigiZHJhZy52YWthdGEiLCB7ICJldmVudCIgOiBlLCAiZGF0YSIgOiAkLnZha2F0YS5kbmQudXNlcl9kYXRhIH0pOw0KLSAgICB9LA0KLSAgICBkcmFnX3N0b3AgOiBmdW5jdGlvbiAoZSkgew0KLSAgICAgICQoZG9jdW1lbnQpLnVuYmluZCgibW91c2Vtb3ZlIiwgJC52YWthdGEuZG5kLmRyYWcpOw0KLSAgICAgICQoZG9jdW1lbnQpLnVuYmluZCgibW91c2V1cCIsICQudmFrYXRhLmRuZC5kcmFnX3N0b3ApOw0KLSAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKCJkcmFnX3N0b3AudmFrYXRhIiwgeyAiZXZlbnQiIDogZSwgImRhdGEiIDogJC52YWthdGEuZG5kLnVzZXJfZGF0YSB9KTsNCi0gICAgICAkLnZha2F0YS5kbmQuaGVscGVyLnJlbW92ZSgpOw0KLSAgICAgICQudmFrYXRhLmRuZC5pbml0X3ggPSAwOw0KLSAgICAgICQudmFrYXRhLmRuZC5pbml0X3kgPSAwOw0KLSAgICAgICQudmFrYXRhLmRuZC51c2VyX2RhdGEgPSB7fTsNCi0gICAgICAkLnZha2F0YS5kbmQuaXNfZG93biA9IGZhbHNlOw0KLSAgICAgICQudmFrYXRhLmRuZC5pc19kcmFnID0gZmFsc2U7DQotICAgIH0NCi0gIH07DQotICAkKGZ1bmN0aW9uKCkgew0KLSAgICB2YXIgY3NzX3N0cmluZyA9ICcjdmFrYXRhLWRyYWdnZWQgeyBkaXNwbGF5OmJsb2NrOyBtYXJnaW46MCAwIDAgMDsgcGFkZGluZzo0cHggNHB4IDRweCAyNHB4OyBwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOi0yMDAwcHg7IGxpbmUtaGVpZ2h0OjE2cHg7IHotaW5kZXg6MTAwMDA7IH0gJzsNCi0gICAgJC52YWthdGEuY3NzLmFkZF9zaGVldCh7IHN0ciA6IGNzc19zdHJpbmcgfSk7DQotICB9KTsNCi0NCi0gICQuanN0cmVlLnBsdWdpbigiZG5kIiwgew0KLSAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgdGhpcy5kYXRhLmRuZCA9IHsNCi0gICAgICAgIGFjdGl2ZSA6IGZhbHNlLA0KLSAgICAgICAgYWZ0ZXIgOiBmYWxzZSwNCi0gICAgICAgIGluc2lkZSA6IGZhbHNlLA0KLSAgICAgICAgYmVmb3JlIDogZmFsc2UsDQotICAgICAgICBvZmYgOiBmYWxzZSwNCi0gICAgICAgIHByZXBhcmVkIDogZmFsc2UsDQotICAgICAgICB3IDogMCwNCi0gICAgICAgIHRvMSA6IGZhbHNlLA0KLSAgICAgICAgdG8yIDogZmFsc2UsDQotICAgICAgICBjb2YgOiBmYWxzZSwNCi0gICAgICAgIGN3IDogZmFsc2UsDQotICAgICAgICBjaCA6IGZhbHNlLA0KLSAgICAgICAgaTEgOiBmYWxzZSwNCi0gICAgICAgIGkyIDogZmFsc2UNCi0gICAgICB9Ow0KLSAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpDQotICAgICAgICAuYmluZCgibW91c2VlbnRlci5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICBpZigkLnZha2F0YS5kbmQuaXNfZHJhZyAmJiAkLnZha2F0YS5kbmQudXNlcl9kYXRhLmpzdHJlZSAmJiB0aGlzLmRhdGEudGhlbWVzKSB7DQotICAgICAgICAgICAgICBtLmF0dHIoImNsYXNzIiwgImpzdHJlZS0iICsgdGhpcy5kYXRhLnRoZW1lcy50aGVtZSk7IA0KLSAgICAgICAgICAgICAgJC52YWthdGEuZG5kLmhlbHBlci5hdHRyKCJjbGFzcyIsICJqc3RyZWUtZG5kLWhlbHBlciBqc3RyZWUtIiArIHRoaXMuZGF0YS50aGVtZXMudGhlbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSwgdGhpcykpDQotICAgICAgICAuYmluZCgibW91c2VsZWF2ZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgICBpZigkLnZha2F0YS5kbmQuaXNfZHJhZyAmJiAkLnZha2F0YS5kbmQudXNlcl9kYXRhLmpzdHJlZSkgew0KLSAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmRuZC5pMSkgeyBjbGVhckludGVydmFsKHRoaXMuZGF0YS5kbmQuaTEpOyB9DQotICAgICAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLmkyKSB7IGNsZWFySW50ZXJ2YWwodGhpcy5kYXRhLmRuZC5pMik7IH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0sIHRoaXMpKQ0KLSAgICAgICAgLmJpbmQoIm1vdXNlbW92ZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7DQotICAgICAgICAgICAgaWYoJC52YWthdGEuZG5kLmlzX2RyYWcgJiYgJC52YWthdGEuZG5kLnVzZXJfZGF0YS5qc3RyZWUpIHsNCi0gICAgICAgICAgICAgIHZhciBjbnQgPSB0aGlzLmdldF9jb250YWluZXIoKVswXTsNCi0NCi0gICAgICAgICAgICAgIC8vIEhvcml6b250YWwgc2Nyb2xsDQotICAgICAgICAgICAgICBpZihlLnBhZ2VYICsgMjQgPiB0aGlzLmRhdGEuZG5kLmNvZi5sZWZ0ICsgdGhpcy5kYXRhLmRuZC5jdykgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLmkxKSB7IGNsZWFySW50ZXJ2YWwodGhpcy5kYXRhLmRuZC5pMSk7IH0NCi0gICAgICAgICAgICAgICAgdGhpcy5kYXRhLmRuZC5pMSA9IHNldEludGVydmFsKCQucHJveHkoZnVuY3Rpb24gKCkgeyB0aGlzLnNjcm9sbExlZnQgKz0gJC52YWthdGEuZG5kLnNjcm9sbF9zcGQ7IH0sIGNudCksIDEwMCk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICBlbHNlIGlmKGUucGFnZVggLSAyNCA8IHRoaXMuZGF0YS5kbmQuY29mLmxlZnQpIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmRuZC5pMSkgeyBjbGVhckludGVydmFsKHRoaXMuZGF0YS5kbmQuaTEpOyB9DQotICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQuaTEgPSBzZXRJbnRlcnZhbCgkLnByb3h5KGZ1bmN0aW9uICgpIHsgdGhpcy5zY3JvbGxMZWZ0IC09ICQudmFrYXRhLmRuZC5zY3JvbGxfc3BkOyB9LCBjbnQpLCAxMDApOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmQuaTEpIHsgY2xlYXJJbnRlcnZhbCh0aGlzLmRhdGEuZG5kLmkxKTsgfQ0KLSAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgLy8gVmVydGljYWwgc2Nyb2xsDQotICAgICAgICAgICAgICBpZihlLnBhZ2VZICsgMjQgPiB0aGlzLmRhdGEuZG5kLmNvZi50b3AgKyB0aGlzLmRhdGEuZG5kLmNoKSB7DQotICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmQuaTIpIHsgY2xlYXJJbnRlcnZhbCh0aGlzLmRhdGEuZG5kLmkyKTsgfQ0KLSAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmkyID0gc2V0SW50ZXJ2YWwoJC5wcm94eShmdW5jdGlvbiAoKSB7IHRoaXMuc2Nyb2xsVG9wICs9ICQudmFrYXRhLmRuZC5zY3JvbGxfc3BkOyB9LCBjbnQpLCAxMDApOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgZWxzZSBpZihlLnBhZ2VZIC0gMjQgPCB0aGlzLmRhdGEuZG5kLmNvZi50b3ApIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmRuZC5pMikgeyBjbGVhckludGVydmFsKHRoaXMuZGF0YS5kbmQuaTIpOyB9DQotICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQuaTIgPSBzZXRJbnRlcnZhbCgkLnByb3h5KGZ1bmN0aW9uICgpIHsgdGhpcy5zY3JvbGxUb3AgLT0gJC52YWthdGEuZG5kLnNjcm9sbF9zcGQ7IH0sIGNudCksIDEwMCk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmRuZC5pMikgeyBjbGVhckludGVydmFsKHRoaXMuZGF0YS5kbmQuaTIpOyB9DQotICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9LCB0aGlzKSkNCi0gICAgICAgIC5kZWxlZ2F0ZSgiYSIsICJtb3VzZWRvd24uanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZSkgeyANCi0gICAgICAgICAgICBpZihlLndoaWNoID09PSAxKSB7DQotICAgICAgICAgICAgICB0aGlzLnN0YXJ0X2RyYWcoZS5jdXJyZW50VGFyZ2V0LCBlKTsNCi0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0sIHRoaXMpKQ0KLSAgICAgICAgLmRlbGVnYXRlKCJhIiwgIm1vdXNlZW50ZXIuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZSkgeyANCi0gICAgICAgICAgICBpZigkLnZha2F0YS5kbmQuaXNfZHJhZyAmJiAkLnZha2F0YS5kbmQudXNlcl9kYXRhLmpzdHJlZSkgew0KLSAgICAgICAgICAgICAgdGhpcy5kbmRfZW50ZXIoZS5jdXJyZW50VGFyZ2V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0sIHRoaXMpKQ0KLSAgICAgICAgLmRlbGVnYXRlKCJhIiwgIm1vdXNlbW92ZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7IA0KLSAgICAgICAgICAgIGlmKCQudmFrYXRhLmRuZC5pc19kcmFnICYmICQudmFrYXRhLmRuZC51c2VyX2RhdGEuanN0cmVlKSB7DQotICAgICAgICAgICAgICBpZih0eXBlb2YgdGhpcy5kYXRhLmRuZC5vZmYudG9wID09PSAidW5kZWZpbmVkIikgeyB0aGlzLmRhdGEuZG5kLm9mZiA9ICQoZS50YXJnZXQpLm9mZnNldCgpOyB9DQotICAgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLncgPSAoZS5wYWdlWSAtICh0aGlzLmRhdGEuZG5kLm9mZi50b3AgfHwgMCkpICUgdGhpcy5kYXRhLmNvcmUubGlfaGVpZ2h0Ow0KLSAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmRuZC53IDwgMCkgeyB0aGlzLmRhdGEuZG5kLncgKz0gdGhpcy5kYXRhLmNvcmUubGlfaGVpZ2h0OyB9DQotICAgICAgICAgICAgICB0aGlzLmRuZF9zaG93KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9LCB0aGlzKSkNCi0gICAgICAgIC5kZWxlZ2F0ZSgiYSIsICJtb3VzZWxlYXZlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUpIHsgDQotICAgICAgICAgICAgaWYoJC52YWthdGEuZG5kLmlzX2RyYWcgJiYgJC52YWthdGEuZG5kLnVzZXJfZGF0YS5qc3RyZWUpIHsNCi0gICAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQuYWZ0ZXIgICAgPSBmYWxzZTsNCi0gICAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQuYmVmb3JlICA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgdGhpcy5kYXRhLmRuZC5pbnNpZGUgID0gZmFsc2U7DQotICAgICAgICAgICAgICAkLnZha2F0YS5kbmQuaGVscGVyLmNoaWxkcmVuKCJpbnMiKS5hdHRyKCJjbGFzcyIsImpzdHJlZS1pbnZhbGlkIik7DQotICAgICAgICAgICAgICBtLmhpZGUoKTsNCi0gICAgICAgICAgICAgIGlmKHIgJiYgclswXSA9PT0gZS50YXJnZXQucGFyZW50Tm9kZSkgew0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLnRvMSkgew0KLSAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRhdGEuZG5kLnRvMSk7DQotICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmRuZC50bzEgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLnRvMikgew0KLSAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRhdGEuZG5kLnRvMik7DQotICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmRuZC50bzIgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfSwgdGhpcykpDQotICAgICAgICAuZGVsZWdhdGUoImEiLCAibW91c2V1cC5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7IA0KLSAgICAgICAgICAgIGlmKCQudmFrYXRhLmRuZC5pc19kcmFnICYmICQudmFrYXRhLmRuZC51c2VyX2RhdGEuanN0cmVlKSB7DQotICAgICAgICAgICAgICB0aGlzLmRuZF9maW5pc2goZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9LCB0aGlzKSk7DQotDQotICAgICAgJChkb2N1bWVudCkNCi0gICAgICAgIC5iaW5kKCJkcmFnX3N0b3AudmFrYXRhIiwgJC5wcm94eShmdW5jdGlvbiAoKSB7DQotICAgICAgICAgICAgdGhpcy5kYXRhLmRuZC5hZnRlciAgICA9IGZhbHNlOw0KLSAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQuYmVmb3JlICA9IGZhbHNlOw0KLSAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQuaW5zaWRlICA9IGZhbHNlOw0KLSAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQub2ZmICAgID0gZmFsc2U7DQotICAgICAgICAgICAgdGhpcy5kYXRhLmRuZC5wcmVwYXJlZCAgPSBmYWxzZTsNCi0gICAgICAgICAgICB0aGlzLmRhdGEuZG5kLncgICAgICA9IGZhbHNlOw0KLSAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQudG8xICAgID0gZmFsc2U7DQotICAgICAgICAgICAgdGhpcy5kYXRhLmRuZC50bzIgICAgPSBmYWxzZTsNCi0gICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmFjdGl2ZSAgPSBmYWxzZTsNCi0gICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmZvcmVpZ24gID0gZmFsc2U7DQotICAgICAgICAgICAgaWYobSkgeyBtLmNzcyh7ICJ0b3AiIDogIi0yMDAwcHgiIH0pOyB9DQotICAgICAgICAgIH0sIHRoaXMpKQ0KLSAgICAgICAgLmJpbmQoImRyYWdfc3RhcnQudmFrYXRhIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkgew0KLSAgICAgICAgICAgIGlmKGRhdGEuZGF0YS5qc3RyZWUpIHsgDQotICAgICAgICAgICAgICB2YXIgZXQgPSAkKGRhdGEuZXZlbnQudGFyZ2V0KTsNCi0gICAgICAgICAgICAgIGlmKGV0LmNsb3Nlc3QoIi5qc3RyZWUiKS5oYXNDbGFzcygianN0cmVlLSIgKyB0aGlzLmdldF9pbmRleCgpKSkgew0KLSAgICAgICAgICAgICAgICB0aGlzLmRuZF9lbnRlcihldCk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9LCB0aGlzKSk7DQotDQotICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS5kbmQ7DQotICAgICAgaWYocy5kcmFnX3RhcmdldCkgew0KLSAgICAgICAgJChkb2N1bWVudCkNCi0gICAgICAgICAgLmRlbGVnYXRlKHMuZHJhZ190YXJnZXQsICJtb3VzZWRvd24uanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZSkgew0KLSAgICAgICAgICAgIG8gPSBlLnRhcmdldDsNCi0gICAgICAgICAgICAkLnZha2F0YS5kbmQuZHJhZ19zdGFydChlLCB7IGpzdHJlZSA6IHRydWUsIG9iaiA6IGUudGFyZ2V0IH0sICI8aW5zIGNsYXNzPSdqc3RyZWUtaWNvbic+PC9pbnM+IiArICQoZS50YXJnZXQpLnRleHQoKSApOw0KLSAgICAgICAgICAgIGlmKHRoaXMuZGF0YS50aGVtZXMpIHsgDQotICAgICAgICAgICAgICBtLmF0dHIoImNsYXNzIiwgImpzdHJlZS0iICsgdGhpcy5kYXRhLnRoZW1lcy50aGVtZSk7IA0KLSAgICAgICAgICAgICAgJC52YWthdGEuZG5kLmhlbHBlci5hdHRyKCJjbGFzcyIsICJqc3RyZWUtZG5kLWhlbHBlciBqc3RyZWUtIiArIHRoaXMuZGF0YS50aGVtZXMudGhlbWUpOyANCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgJC52YWthdGEuZG5kLmhlbHBlci5jaGlsZHJlbigiaW5zIikuYXR0cigiY2xhc3MiLCJqc3RyZWUtaW52YWxpZCIpOw0KLSAgICAgICAgICAgIHZhciBjbnQgPSB0aGlzLmdldF9jb250YWluZXIoKTsNCi0gICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmNvZiA9IGNudC5vZmZzZXQoKTsNCi0gICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmN3ID0gcGFyc2VJbnQoY250LndpZHRoKCksMTApOw0KLSAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQuY2ggPSBwYXJzZUludChjbnQuaGVpZ2h0KCksMTApOw0KLSAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQuZm9yZWlnbiA9IHRydWU7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICB9LCB0aGlzKSk7DQotICAgICAgfQ0KLSAgICAgIGlmKHMuZHJvcF90YXJnZXQpIHsNCi0gICAgICAgICQoZG9jdW1lbnQpDQotICAgICAgICAgIC5kZWxlZ2F0ZShzLmRyb3BfdGFyZ2V0LCAibW91c2VlbnRlci5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7DQotICAgICAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLmFjdGl2ZSAmJiB0aGlzLl9nZXRfc2V0dGluZ3MoKS5kbmQuZHJvcF9jaGVjay5jYWxsKHRoaXMsIHsgIm8iIDogbywgInIiIDogJChlLnRhcmdldCkgfSkpIHsNCi0gICAgICAgICAgICAgICAgJC52YWthdGEuZG5kLmhlbHBlci5jaGlsZHJlbigiaW5zIikuYXR0cigiY2xhc3MiLCJqc3RyZWUtb2siKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9LCB0aGlzKSkNCi0gICAgICAgICAgLmRlbGVnYXRlKHMuZHJvcF90YXJnZXQsICJtb3VzZWxlYXZlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUpIHsNCi0gICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmQuYWN0aXZlKSB7DQotICAgICAgICAgICAgICAgICQudmFrYXRhLmRuZC5oZWxwZXIuY2hpbGRyZW4oImlucyIpLmF0dHIoImNsYXNzIiwianN0cmVlLWludmFsaWQiKTsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9LCB0aGlzKSkNCi0gICAgICAgICAgLmRlbGVnYXRlKHMuZHJvcF90YXJnZXQsICJtb3VzZXVwLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUpIHsNCi0gICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmQuYWN0aXZlICYmICQudmFrYXRhLmRuZC5oZWxwZXIuY2hpbGRyZW4oImlucyIpLmhhc0NsYXNzKCJqc3RyZWUtb2siKSkgew0KLSAgICAgICAgICAgICAgICB0aGlzLl9nZXRfc2V0dGluZ3MoKS5kbmQuZHJvcF9maW5pc2guY2FsbCh0aGlzLCB7ICJvIiA6IG8sICJyIiA6ICQoZS50YXJnZXQpIH0pOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0sIHRoaXMpKTsNCi0gICAgICB9DQotICAgIH0sDQotICAgIGRlZmF1bHRzIDogew0KLSAgICAgIGNvcHlfbW9kaWZpZXIgIDogImN0cmwiLA0KLSAgICAgIGNoZWNrX3RpbWVvdXQgIDogMjAwLA0KLSAgICAgIG9wZW5fdGltZW91dCAgOiA1MDAsDQotICAgICAgZHJvcF90YXJnZXQgICAgOiAiLmpzdHJlZS1kcm9wIiwNCi0gICAgICBkcm9wX2NoZWNrICAgIDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIHRydWU7IH0sDQotICAgICAgZHJvcF9maW5pc2ggICAgOiAkLm5vb3AsDQotICAgICAgZHJhZ190YXJnZXQgICAgOiAiLmpzdHJlZS1kcmFnZ2FibGUiLA0KLSAgICAgIGRyYWdfZmluaXNoICAgIDogJC5ub29wLA0KLSAgICAgIGRyYWdfY2hlY2sgICAgOiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4geyBhZnRlciA6IGZhbHNlLCBiZWZvcmUgOiBmYWxzZSwgaW5zaWRlIDogdHJ1ZSB9OyB9DQotICAgIH0sDQotICAgIF9mbiA6IHsNCi0gICAgICBkbmRfcHJlcGFyZSA6IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgIGlmKCFyIHx8ICFyLmxlbmd0aCkgeyByZXR1cm47IH0NCi0gICAgICAgIHRoaXMuZGF0YS5kbmQub2ZmID0gci5vZmZzZXQoKTsNCi0gICAgICAgIGlmKHRoaXMuX2dldF9zZXR0aW5ncygpLmNvcmUucnRsKSB7DQotICAgICAgICAgIHRoaXMuZGF0YS5kbmQub2ZmLnJpZ2h0ID0gdGhpcy5kYXRhLmRuZC5vZmYubGVmdCArIHIud2lkdGgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKHRoaXMuZGF0YS5kbmQuZm9yZWlnbikgew0KLSAgICAgICAgICB2YXIgYSA9IHRoaXMuX2dldF9zZXR0aW5ncygpLmRuZC5kcmFnX2NoZWNrLmNhbGwodGhpcywgeyAibyIgOiBvLCAiciIgOiByIH0pOw0KLSAgICAgICAgICB0aGlzLmRhdGEuZG5kLmFmdGVyID0gYS5hZnRlcjsNCi0gICAgICAgICAgdGhpcy5kYXRhLmRuZC5iZWZvcmUgPSBhLmJlZm9yZTsNCi0gICAgICAgICAgdGhpcy5kYXRhLmRuZC5pbnNpZGUgPSBhLmluc2lkZTsNCi0gICAgICAgICAgdGhpcy5kYXRhLmRuZC5wcmVwYXJlZCA9IHRydWU7DQotICAgICAgICAgIHJldHVybiB0aGlzLmRuZF9zaG93KCk7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLnByZXBhcmVfbW92ZShvLCByLCAiYmVmb3JlIik7DQotICAgICAgICB0aGlzLmRhdGEuZG5kLmJlZm9yZSA9IHRoaXMuY2hlY2tfbW92ZSgpOw0KLSAgICAgICAgdGhpcy5wcmVwYXJlX21vdmUobywgciwgImFmdGVyIik7DQotICAgICAgICB0aGlzLmRhdGEuZG5kLmFmdGVyID0gdGhpcy5jaGVja19tb3ZlKCk7DQotICAgICAgICBpZih0aGlzLl9pc19sb2FkZWQocikpIHsNCi0gICAgICAgICAgdGhpcy5wcmVwYXJlX21vdmUobywgciwgImluc2lkZSIpOw0KLSAgICAgICAgICB0aGlzLmRhdGEuZG5kLmluc2lkZSA9IHRoaXMuY2hlY2tfbW92ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgIHRoaXMuZGF0YS5kbmQuaW5zaWRlID0gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLmRhdGEuZG5kLnByZXBhcmVkID0gdHJ1ZTsNCi0gICAgICAgIHJldHVybiB0aGlzLmRuZF9zaG93KCk7DQotICAgICAgfSwNCi0gICAgICBkbmRfc2hvdyA6IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgIGlmKCF0aGlzLmRhdGEuZG5kLnByZXBhcmVkKSB7IHJldHVybjsgfQ0KLSAgICAgICAgdmFyIG8gPSBbImJlZm9yZSIsImluc2lkZSIsImFmdGVyIl0sDQotICAgICAgICAgIHIgPSBmYWxzZSwNCi0gICAgICAgICAgcnRsID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuY29yZS5ydGwsDQotICAgICAgICAgIHBvczsNCi0gICAgICAgIGlmKHRoaXMuZGF0YS5kbmQudyA8IHRoaXMuZGF0YS5jb3JlLmxpX2hlaWdodC8zKSB7IG8gPSBbImJlZm9yZSIsImluc2lkZSIsImFmdGVyIl07IH0NCi0gICAgICAgIGVsc2UgaWYodGhpcy5kYXRhLmRuZC53IDw9IHRoaXMuZGF0YS5jb3JlLmxpX2hlaWdodCoyLzMpIHsNCi0gICAgICAgICAgbyA9IHRoaXMuZGF0YS5kbmQudyA8IHRoaXMuZGF0YS5jb3JlLmxpX2hlaWdodC8yID8gWyJpbnNpZGUiLCJiZWZvcmUiLCJhZnRlciJdIDogWyJpbnNpZGUiLCJhZnRlciIsImJlZm9yZSJdOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7IG8gPSBbImFmdGVyIiwiaW5zaWRlIiwiYmVmb3JlIl07IH0NCi0gICAgICAgICQuZWFjaChvLCAkLnByb3h5KGZ1bmN0aW9uIChpLCB2YWwpIHsgDQotICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmRbdmFsXSkgew0KLSAgICAgICAgICAgICQudmFrYXRhLmRuZC5oZWxwZXIuY2hpbGRyZW4oImlucyIpLmF0dHIoImNsYXNzIiwianN0cmVlLW9rIik7DQotICAgICAgICAgICAgciA9IHZhbDsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0sIHRoaXMpKTsNCi0gICAgICAgIGlmKHIgPT09IGZhbHNlKSB7ICQudmFrYXRhLmRuZC5oZWxwZXIuY2hpbGRyZW4oImlucyIpLmF0dHIoImNsYXNzIiwianN0cmVlLWludmFsaWQiKTsgfQ0KLSAgICAgICAgDQotICAgICAgICBwb3MgPSBydGwgPyAodGhpcy5kYXRhLmRuZC5vZmYucmlnaHQgLSAxOCkgOiAodGhpcy5kYXRhLmRuZC5vZmYubGVmdCArIDEwKTsNCi0gICAgICAgIHN3aXRjaChyKSB7DQotICAgICAgICAgIGNhc2UgImJlZm9yZSI6DQotICAgICAgICAgICAgbS5jc3MoeyAibGVmdCIgOiBwb3MgKyAicHgiLCAidG9wIiA6ICh0aGlzLmRhdGEuZG5kLm9mZi50b3AgLSA2KSArICJweCIgfSkuc2hvdygpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICBjYXNlICJhZnRlciI6DQotICAgICAgICAgICAgbS5jc3MoeyAibGVmdCIgOiBwb3MgKyAicHgiLCAidG9wIiA6ICh0aGlzLmRhdGEuZG5kLm9mZi50b3AgKyB0aGlzLmRhdGEuY29yZS5saV9oZWlnaHQgLSA3KSArICJweCIgfSkuc2hvdygpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICBjYXNlICJpbnNpZGUiOg0KLSAgICAgICAgICAgIG0uY3NzKHsgImxlZnQiIDogcG9zICsgKCBydGwgPyAtNCA6IDQpICsgInB4IiwgInRvcCIgOiAodGhpcy5kYXRhLmRuZC5vZmYudG9wICsgdGhpcy5kYXRhLmNvcmUubGlfaGVpZ2h0LzIgLSA1KSArICJweCIgfSkuc2hvdygpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIG0uaGlkZSgpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHI7DQotICAgICAgfSwNCi0gICAgICBkbmRfb3BlbiA6IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgIHRoaXMuZGF0YS5kbmQudG8yID0gZmFsc2U7DQotICAgICAgICB0aGlzLm9wZW5fbm9kZShyLCAkLnByb3h5KHRoaXMuZG5kX3ByZXBhcmUsdGhpcyksIHRydWUpOw0KLSAgICAgIH0sDQotICAgICAgZG5kX2ZpbmlzaCA6IGZ1bmN0aW9uIChlKSB7DQotICAgICAgICBpZih0aGlzLmRhdGEuZG5kLmZvcmVpZ24pIHsNCi0gICAgICAgICAgaWYodGhpcy5kYXRhLmRuZC5hZnRlciB8fCB0aGlzLmRhdGEuZG5kLmJlZm9yZSB8fCB0aGlzLmRhdGEuZG5kLmluc2lkZSkgew0KLSAgICAgICAgICAgIHRoaXMuX2dldF9zZXR0aW5ncygpLmRuZC5kcmFnX2ZpbmlzaC5jYWxsKHRoaXMsIHsgIm8iIDogbywgInIiIDogciB9KTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgIHRoaXMuZG5kX3ByZXBhcmUoKTsNCi0gICAgICAgICAgdGhpcy5tb3ZlX25vZGUobywgciwgdGhpcy5kbmRfc2hvdygpLCBlW3RoaXMuX2dldF9zZXR0aW5ncygpLmRuZC5jb3B5X21vZGlmaWVyICsgIktleSJdKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG8gPSBmYWxzZTsNCi0gICAgICAgIHIgPSBmYWxzZTsNCi0gICAgICAgIG0uaGlkZSgpOw0KLSAgICAgIH0sDQotICAgICAgZG5kX2VudGVyIDogZnVuY3Rpb24gKG9iaikgew0KLSAgICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS5kbmQ7DQotICAgICAgICB0aGlzLmRhdGEuZG5kLnByZXBhcmVkID0gZmFsc2U7DQotICAgICAgICByID0gdGhpcy5fZ2V0X25vZGUob2JqKTsNCi0gICAgICAgIGlmKHMuY2hlY2tfdGltZW91dCkgeyANCi0gICAgICAgICAgLy8gZG8gdGhlIGNhbGN1bGF0aW9ucyBhZnRlciBhIG1pbmltYWwgdGltZW91dCAodXNlcnMgdGVuZCB0byBkcmFnIHF1aWNrbHkgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24pDQotICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmQudG8xKSB7IGNsZWFyVGltZW91dCh0aGlzLmRhdGEuZG5kLnRvMSk7IH0NCi0gICAgICAgICAgdGhpcy5kYXRhLmRuZC50bzEgPSBzZXRUaW1lb3V0KCQucHJveHkodGhpcy5kbmRfcHJlcGFyZSwgdGhpcyksIHMuY2hlY2tfdGltZW91dCk7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7IA0KLSAgICAgICAgICB0aGlzLmRuZF9wcmVwYXJlKCk7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYocy5vcGVuX3RpbWVvdXQpIHsgDQotICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmQudG8yKSB7IGNsZWFyVGltZW91dCh0aGlzLmRhdGEuZG5kLnRvMik7IH0NCi0gICAgICAgICAgaWYociAmJiByLmxlbmd0aCAmJiByLmhhc0NsYXNzKCJqc3RyZWUtY2xvc2VkIikpIHsgDQotICAgICAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXMgY2xvc2VkIC0gb3BlbiBpdCwgdGhlbiByZWNhbGN1bGF0ZQ0KLSAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQudG8yID0gc2V0VGltZW91dCgkLnByb3h5KHRoaXMuZG5kX29wZW4sIHRoaXMpLCBzLm9wZW5fdGltZW91dCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICBpZihyICYmIHIubGVuZ3RoICYmIHIuaGFzQ2xhc3MoImpzdHJlZS1jbG9zZWQiKSkgeyANCi0gICAgICAgICAgICB0aGlzLmRuZF9vcGVuKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9LA0KLSAgICAgIHN0YXJ0X2RyYWcgOiBmdW5jdGlvbiAob2JqLCBlKSB7DQotICAgICAgICBvID0gdGhpcy5fZ2V0X25vZGUob2JqKTsNCi0gICAgICAgIGlmKHRoaXMuZGF0YS51aSAmJiB0aGlzLmlzX3NlbGVjdGVkKG8pKSB7IG8gPSB0aGlzLl9nZXRfbm9kZShudWxsLCB0cnVlKTsgfQ0KLSAgICAgICAgJC52YWthdGEuZG5kLmRyYWdfc3RhcnQoZSwgeyBqc3RyZWUgOiB0cnVlLCBvYmogOiBvIH0sICI8aW5zIGNsYXNzPSdqc3RyZWUtaWNvbic+PC9pbnM+IiArIChvLmxlbmd0aCA+IDEgPyAiTXVsdGlwbGUgc2VsZWN0aW9uIiA6IHRoaXMuZ2V0X3RleHQobykpICk7DQotICAgICAgICBpZih0aGlzLmRhdGEudGhlbWVzKSB7IA0KLSAgICAgICAgICBtLmF0dHIoImNsYXNzIiwgImpzdHJlZS0iICsgdGhpcy5kYXRhLnRoZW1lcy50aGVtZSk7IA0KLSAgICAgICAgICAkLnZha2F0YS5kbmQuaGVscGVyLmF0dHIoImNsYXNzIiwgImpzdHJlZS1kbmQtaGVscGVyIGpzdHJlZS0iICsgdGhpcy5kYXRhLnRoZW1lcy50aGVtZSk7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgdmFyIGNudCA9IHRoaXMuZ2V0X2NvbnRhaW5lcigpOw0KLSAgICAgICAgdGhpcy5kYXRhLmRuZC5jb2YgPSBjbnQuY2hpbGRyZW4oInVsIikub2Zmc2V0KCk7DQotICAgICAgICB0aGlzLmRhdGEuZG5kLmN3ID0gcGFyc2VJbnQoY250LndpZHRoKCksMTApOw0KLSAgICAgICAgdGhpcy5kYXRhLmRuZC5jaCA9IHBhcnNlSW50KGNudC5oZWlnaHQoKSwxMCk7DQotICAgICAgICB0aGlzLmRhdGEuZG5kLmFjdGl2ZSA9IHRydWU7DQotICAgICAgfQ0KLSAgICB9DQotICB9KTsNCi0gICQoZnVuY3Rpb24oKSB7DQotICAgIHZhciBjc3Nfc3RyaW5nID0gJycgKyANCi0gICAgICAnI3Zha2F0YS1kcmFnZ2VkIGlucyB7IGRpc3BsYXk6YmxvY2s7IHRleHQtZGVjb3JhdGlvbjpub25lOyB3aWR0aDoxNnB4OyBoZWlnaHQ6MTZweDsgbWFyZ2luOjAgMCAwIDA7IHBhZGRpbmc6MDsgcG9zaXRpb246YWJzb2x1dGU7IHRvcDo0cHg7IGxlZnQ6NHB4OyB9ICcgKyANCi0gICAgICAnI3Zha2F0YS1kcmFnZ2VkIC5qc3RyZWUtb2sgeyBiYWNrZ3JvdW5kOmdyZWVuOyB9ICcgKyANCi0gICAgICAnI3Zha2F0YS1kcmFnZ2VkIC5qc3RyZWUtaW52YWxpZCB7IGJhY2tncm91bmQ6cmVkOyB9ICcgKyANCi0gICAgICAnI2pzdHJlZS1tYXJrZXIgeyBwYWRkaW5nOjA7IG1hcmdpbjowOyBsaW5lLWhlaWdodDoxMnB4OyBmb250LXNpemU6MXB4OyBvdmVyZmxvdzpoaWRkZW47IGhlaWdodDoxMnB4OyB3aWR0aDo4cHg7IHBvc2l0aW9uOmFic29sdXRlOyB0b3A6LTMwcHg7IHotaW5kZXg6MTAwMDA7IGJhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDsgZGlzcGxheTpub25lOyBiYWNrZ3JvdW5kLWNvbG9yOnNpbHZlcjsgfSAnOw0KLSAgICAkLnZha2F0YS5jc3MuYWRkX3NoZWV0KHsgc3RyIDogY3NzX3N0cmluZyB9KTsNCi0gICAgbSA9ICQoIjxkaXY+IikuYXR0cih7IGlkIDogImpzdHJlZS1tYXJrZXIiIH0pLmhpZGUoKS5hcHBlbmRUbygiYm9keSIpOw0KLSAgICAkKGRvY3VtZW50KS5iaW5kKCJkcmFnX3N0YXJ0LnZha2F0YSIsIGZ1bmN0aW9uIChlLCBkYXRhKSB7DQotICAgICAgaWYoZGF0YS5kYXRhLmpzdHJlZSkgeyANCi0gICAgICAgIG0uc2hvdygpOyANCi0gICAgICB9DQotICAgIH0pOw0KLSAgICAkKGRvY3VtZW50KS5iaW5kKCJkcmFnX3N0b3AudmFrYXRhIiwgZnVuY3Rpb24gKGUsIGRhdGEpIHsNCi0gICAgICBpZihkYXRhLmRhdGEuanN0cmVlKSB7IG0uaGlkZSgpOyB9DQotICAgIH0pOw0KLSAgfSk7DQotfSkoalF1ZXJ5KTsNCi0vLyovDQotDQotLyoNCi0gKiBqc1RyZWUgY2hlY2tib3ggcGx1Z2luIDEuMA0KLSAqIEluc2VydHMgY2hlY2tib3hlcyBpbiBmcm9udCBvZiBldmVyeSBub2RlDQotICogRGVwZW5kcyBvbiB0aGUgdWkgcGx1Z2luDQotICogRE9FUyBOT1QgV09SSyBOSUNFTFkgV0lUSCBNVUxUSVRSRUUgRFJBRydOJ0RST1ANCi0gKi8NCi0oZnVuY3Rpb24gKCQpIHsNCi0gICQuanN0cmVlLnBsdWdpbigiY2hlY2tib3giLCB7DQotICAgIF9faW5pdCA6IGZ1bmN0aW9uICgpIHsNCi0gICAgICB0aGlzLnNlbGVjdF9ub2RlID0gdGhpcy5kZXNlbGVjdF9ub2RlID0gdGhpcy5kZXNlbGVjdF9hbGwgPSAkLm5vb3A7DQotICAgICAgdGhpcy5nZXRfc2VsZWN0ZWQgPSB0aGlzLmdldF9jaGVja2VkOw0KLQ0KLSAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpDQotICAgICAgICAuYmluZCgib3Blbl9ub2RlLmpzdHJlZSBjcmVhdGVfbm9kZS5qc3RyZWUgY2xlYW5fbm9kZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7IA0KLSAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVfY2hlY2tib3hlcyhkYXRhLnJzbHQub2JqKTsNCi0gICAgICAgICAgfSwgdGhpcykpDQotICAgICAgICAuYmluZCgibG9hZGVkLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUpIHsNCi0gICAgICAgICAgICB0aGlzLl9wcmVwYXJlX2NoZWNrYm94ZXMoKTsNCi0gICAgICAgICAgfSwgdGhpcykpDQotICAgICAgICAuZGVsZWdhdGUoImEiLCAiY2xpY2suanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZSkgew0KLSAgICAgICAgICAgIGlmKHRoaXMuX2dldF9ub2RlKGUudGFyZ2V0KS5oYXNDbGFzcygianN0cmVlLWNoZWNrZWQiKSkgeyB0aGlzLnVuY2hlY2tfbm9kZShlLnRhcmdldCk7IH0NCi0gICAgICAgICAgICBlbHNlIHsgdGhpcy5jaGVja19ub2RlKGUudGFyZ2V0KTsgfQ0KLSAgICAgICAgICAgIGlmKHRoaXMuZGF0YS51aSkgeyB0aGlzLnNhdmVfc2VsZWN0ZWQoKTsgfQ0KLSAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5jb29raWVzKSB7IHRoaXMuc2F2ZV9jb29raWUoInNlbGVjdF9ub2RlIik7IH0NCi0gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICAgIH0sIHRoaXMpKTsNCi0gICAgfSwNCi0gICAgX19kZXN0cm95IDogZnVuY3Rpb24gKCkgew0KLSAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpLmZpbmQoIi5qc3RyZWUtY2hlY2tib3giKS5yZW1vdmUoKTsNCi0gICAgfSwNCi0gICAgX2ZuIDogew0KLSAgICAgIF9wcmVwYXJlX2NoZWNrYm94ZXMgOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICBvYmogPSAhb2JqIHx8IG9iaiA9PSAtMSA/IHRoaXMuZ2V0X2NvbnRhaW5lcigpIDogdGhpcy5fZ2V0X25vZGUob2JqKTsNCi0gICAgICAgIHZhciBjLCBfdGhpcyA9IHRoaXMsIHQ7DQotICAgICAgICBvYmouZWFjaChmdW5jdGlvbiAoKSB7DQotICAgICAgICAgIHQgPSAkKHRoaXMpOw0KLSAgICAgICAgICBjID0gdC5pcygibGkiKSAmJiB0Lmhhc0NsYXNzKCJqc3RyZWUtY2hlY2tlZCIpID8gImpzdHJlZS1jaGVja2VkIiA6ICJqc3RyZWUtdW5jaGVja2VkIjsNCi0gICAgICAgICAgdC5maW5kKCJhIikubm90KCI6aGFzKC5qc3RyZWUtY2hlY2tib3gpIikucHJlcGVuZCgiPGlucyBjbGFzcz0nanN0cmVlLWNoZWNrYm94Jz4mIzE2MDs8L2lucz4iKS5wYXJlbnQoKS5ub3QoIi5qc3RyZWUtY2hlY2tlZCwgLmpzdHJlZS11bmNoZWNrZWQiKS5hZGRDbGFzcyhjKTsNCi0gICAgICAgIH0pOw0KLSAgICAgICAgaWYob2JqLmlzKCJsaSIpKSB7IHRoaXMuX3JlcGFpcl9zdGF0ZShvYmopOyB9DQotICAgICAgICBlbHNlIHsgb2JqLmZpbmQoIj4gdWwgPiBsaSIpLmVhY2goZnVuY3Rpb24gKCkgeyBfdGhpcy5fcmVwYWlyX3N0YXRlKHRoaXMpOyB9KTsgfQ0KLSAgICAgIH0sDQotICAgICAgY2hhbmdlX3N0YXRlIDogZnVuY3Rpb24gKG9iaiwgc3RhdGUpIHsNCi0gICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICBzdGF0ZSA9IChzdGF0ZSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IHRydWUpID8gc3RhdGUgOiBvYmouaGFzQ2xhc3MoImpzdHJlZS1jaGVja2VkIik7DQotICAgICAgICBpZihzdGF0ZSkgeyBvYmouZmluZCgibGkiKS5hbmRTZWxmKCkucmVtb3ZlQ2xhc3MoImpzdHJlZS1jaGVja2VkIGpzdHJlZS11bmRldGVybWluZWQiKS5hZGRDbGFzcygianN0cmVlLXVuY2hlY2tlZCIpOyB9DQotICAgICAgICBlbHNlIHsgDQotICAgICAgICAgIG9iai5maW5kKCJsaSIpLmFuZFNlbGYoKS5yZW1vdmVDbGFzcygianN0cmVlLXVuY2hlY2tlZCBqc3RyZWUtdW5kZXRlcm1pbmVkIikuYWRkQ2xhc3MoImpzdHJlZS1jaGVja2VkIik7IA0KLSAgICAgICAgICBpZih0aGlzLmRhdGEudWkpIHsgdGhpcy5kYXRhLnVpLmxhc3Rfc2VsZWN0ZWQgPSBvYmo7IH0NCi0gICAgICAgICAgdGhpcy5kYXRhLmNoZWNrYm94Lmxhc3Rfc2VsZWN0ZWQgPSBvYmo7DQotICAgICAgICB9DQotICAgICAgICBvYmoucGFyZW50c1VudGlsKCIuanN0cmVlIiwgImxpIikuZWFjaChmdW5jdGlvbiAoKSB7DQotICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7DQotICAgICAgICAgIGlmKHN0YXRlKSB7DQotICAgICAgICAgICAgaWYoJHRoaXMuY2hpbGRyZW4oInVsIikuY2hpbGRyZW4oIi5qc3RyZWUtY2hlY2tlZCwgLmpzdHJlZS11bmRldGVybWluZWQiKS5sZW5ndGgpIHsNCi0gICAgICAgICAgICAgICR0aGlzLnBhcmVudHNVbnRpbCgiLmpzdHJlZSIsICJsaSIpLmFuZFNlbGYoKS5yZW1vdmVDbGFzcygianN0cmVlLWNoZWNrZWQganN0cmVlLXVuY2hlY2tlZCIpLmFkZENsYXNzKCJqc3RyZWUtdW5kZXRlcm1pbmVkIik7DQotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgJHRoaXMucmVtb3ZlQ2xhc3MoImpzdHJlZS1jaGVja2VkIGpzdHJlZS11bmRldGVybWluZWQiKS5hZGRDbGFzcygianN0cmVlLXVuY2hlY2tlZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICBpZigkdGhpcy5jaGlsZHJlbigidWwiKS5jaGlsZHJlbigiLmpzdHJlZS11bmNoZWNrZWQsIC5qc3RyZWUtdW5kZXRlcm1pbmVkIikubGVuZ3RoKSB7DQotICAgICAgICAgICAgICAkdGhpcy5wYXJlbnRzVW50aWwoIi5qc3RyZWUiLCAibGkiKS5hbmRTZWxmKCkucmVtb3ZlQ2xhc3MoImpzdHJlZS1jaGVja2VkIGpzdHJlZS11bmNoZWNrZWQiKS5hZGRDbGFzcygianN0cmVlLXVuZGV0ZXJtaW5lZCIpOw0KLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICR0aGlzLnJlbW92ZUNsYXNzKCJqc3RyZWUtdW5jaGVja2VkIGpzdHJlZS11bmRldGVybWluZWQiKS5hZGRDbGFzcygianN0cmVlLWNoZWNrZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICAgICAgaWYodGhpcy5kYXRhLnVpKSB7IHRoaXMuZGF0YS51aS5zZWxlY3RlZCA9IHRoaXMuZ2V0X2NoZWNrZWQoKTsgfQ0KLSAgICAgICAgdGhpcy5fX2NhbGxiYWNrKG9iaik7DQotICAgICAgfSwNCi0gICAgICBjaGVja19ub2RlIDogZnVuY3Rpb24gKG9iaikgew0KLSAgICAgICAgdGhpcy5jaGFuZ2Vfc3RhdGUob2JqLCBmYWxzZSk7DQotICAgICAgfSwNCi0gICAgICB1bmNoZWNrX25vZGUgOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICB0aGlzLmNoYW5nZV9zdGF0ZShvYmosIHRydWUpOw0KLSAgICAgIH0sDQotICAgICAgY2hlY2tfYWxsIDogZnVuY3Rpb24gKCkgew0KLSAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCi0gICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmNoaWxkcmVuKCJsaSIpLmVhY2goZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICBfdGhpcy5jaGVja19ub2RlKHRoaXMsIGZhbHNlKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIH0sDQotICAgICAgdW5jaGVja19hbGwgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KLSAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikuY2hpbGRyZW4oImxpIikuZWFjaChmdW5jdGlvbiAoKSB7DQotICAgICAgICAgIF90aGlzLmNoYW5nZV9zdGF0ZSh0aGlzLCB0cnVlKTsNCi0gICAgICAgIH0pOw0KLSAgICAgIH0sDQotDQotICAgICAgaXNfY2hlY2tlZCA6IGZ1bmN0aW9uKG9iaikgew0KLSAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsNCi0gICAgICAgIHJldHVybiBvYmoubGVuZ3RoID8gb2JqLmlzKCIuanN0cmVlLWNoZWNrZWQiKSA6IGZhbHNlOw0KLSAgICAgIH0sDQotICAgICAgZ2V0X2NoZWNrZWQgOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICBvYmogPSAhb2JqIHx8IG9iaiA9PT0gLTEgPyB0aGlzLmdldF9jb250YWluZXIoKSA6IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICByZXR1cm4gb2JqLmZpbmQoIj4gdWwgPiAuanN0cmVlLWNoZWNrZWQsIC5qc3RyZWUtdW5kZXRlcm1pbmVkID4gdWwgPiAuanN0cmVlLWNoZWNrZWQiKTsNCi0gICAgICB9LA0KLSAgICAgIGdldF91bmNoZWNrZWQgOiBmdW5jdGlvbiAob2JqKSB7IA0KLSAgICAgICAgb2JqID0gIW9iaiB8fCBvYmogPT09IC0xID8gdGhpcy5nZXRfY29udGFpbmVyKCkgOiB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgcmV0dXJuIG9iai5maW5kKCI+IHVsID4gLmpzdHJlZS11bmNoZWNrZWQsIC5qc3RyZWUtdW5kZXRlcm1pbmVkID4gdWwgPiAuanN0cmVlLXVuY2hlY2tlZCIpOw0KLSAgICAgIH0sDQotDQotICAgICAgc2hvd19jaGVja2JveGVzIDogZnVuY3Rpb24gKCkgeyB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5yZW1vdmVDbGFzcygianN0cmVlLW5vLWNoZWNrYm94ZXMiKTsgfSwNCi0gICAgICBoaWRlX2NoZWNrYm94ZXMgOiBmdW5jdGlvbiAoKSB7IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmFkZENsYXNzKCJqc3RyZWUtbm8tY2hlY2tib3hlcyIpOyB9LA0KLQ0KLSAgICAgIF9yZXBhaXJfc3RhdGUgOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYoIW9iai5sZW5ndGgpIHsgcmV0dXJuOyB9DQotICAgICAgICB2YXIgYSA9IG9iai5maW5kKCI+IHVsID4gLmpzdHJlZS1jaGVja2VkIikubGVuZ3RoLA0KLSAgICAgICAgICBiID0gb2JqLmZpbmQoIj4gdWwgPiAuanN0cmVlLXVuZGV0ZXJtaW5lZCIpLmxlbmd0aCwNCi0gICAgICAgICAgYyA9IG9iai5maW5kKCI+IHVsID4gbGkiKS5sZW5ndGg7DQotDQotICAgICAgICBpZihjID09PSAwKSB7IGlmKG9iai5oYXNDbGFzcygianN0cmVlLXVuZGV0ZXJtaW5lZCIpKSB7IHRoaXMuY2hlY2tfbm9kZShvYmopOyB9IH0NCi0gICAgICAgIGVsc2UgaWYoYSA9PT0gMCAmJiBiID09PSAwKSB7IHRoaXMudW5jaGVja19ub2RlKG9iaik7IH0NCi0gICAgICAgIGVsc2UgaWYoYSA9PT0gYykgeyB0aGlzLmNoZWNrX25vZGUob2JqKTsgfQ0KLSAgICAgICAgZWxzZSB7IA0KLSAgICAgICAgICBvYmoucGFyZW50c1VudGlsKCIuanN0cmVlIiwibGkiKS5yZW1vdmVDbGFzcygianN0cmVlLWNoZWNrZWQganN0cmVlLXVuY2hlY2tlZCIpLmFkZENsYXNzKCJqc3RyZWUtdW5kZXRlcm1pbmVkIik7DQotICAgICAgICB9DQotICAgICAgfSwNCi0gICAgICByZXNlbGVjdCA6IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgIGlmKHRoaXMuZGF0YS51aSkgeyANCi0gICAgICAgICAgdmFyIF90aGlzID0gdGhpcywNCi0gICAgICAgICAgICBzID0gdGhpcy5kYXRhLnVpLnRvX3NlbGVjdDsNCi0gICAgICAgICAgcyA9ICQubWFwKCQubWFrZUFycmF5KHMpLCBmdW5jdGlvbiAobikgeyByZXR1cm4gIiMiICsgbi50b1N0cmluZygpLnJlcGxhY2UoL14jLywiIikucmVwbGFjZSgnXFwvJywnLycpLnJlcGxhY2UoJy8nLCdcXC8nKTsgfSk7DQotICAgICAgICAgIHRoaXMuZGVzZWxlY3RfYWxsKCk7DQotICAgICAgICAgICQuZWFjaChzLCBmdW5jdGlvbiAoaSwgdmFsKSB7IF90aGlzLmNoZWNrX25vZGUodmFsKTsgfSk7DQotICAgICAgICAgIHRoaXMuX19jYWxsYmFjaygpOw0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfSk7DQotfSkoalF1ZXJ5KTsNCi0vLyovDQotDQotLyogDQotICoganNUcmVlIFhNTCAxLjANCi0gKiBUaGUgWE1MIGRhdGEgc3RvcmUuIERhdGFzdG9yZXMgYXJlIGJ1aWxkIGJ5IG92ZXJyaWRpbmcgdGhlIGBsb2FkX25vZGVgIGFuZCBgX2lzX2xvYWRlZGAgZnVuY3Rpb25zLg0KLSAqLw0KLShmdW5jdGlvbiAoJCkgew0KLSAgJC52YWthdGEueHNsdCA9IGZ1bmN0aW9uICh4bWwsIHhzbCwgY2FsbGJhY2spIHsNCi0gICAgdmFyIHJzID0gIiIsIHhtLCB4cywgcHJvY2Vzc29yLCBzdXBwb3J0Ow0KLSAgICBpZihkb2N1bWVudC5yZWNhbGMpIHsNCi0gICAgICB4bSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3htbCcpOw0KLSAgICAgIHhzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgneG1sJyk7DQotICAgICAgeG0uaW5uZXJIVE1MID0geG1sOw0KLSAgICAgIHhzLmlubmVySFRNTCA9IHhzbDsNCi0gICAgICAkKCJib2R5IikuYXBwZW5kKHhtKS5hcHBlbmQoeHMpOw0KLSAgICAgIHNldFRpbWVvdXQoIChmdW5jdGlvbiAoeG0sIHhzLCBjYWxsYmFjaykgew0KLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgY2FsbGJhY2suY2FsbChudWxsLCB4bS50cmFuc2Zvcm1Ob2RlKHhzLlhNTERvY3VtZW50KSk7DQotICAgICAgICAgIHNldFRpbWVvdXQoIChmdW5jdGlvbiAoeG0sIHhzKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IGpRdWVyeSgiYm9keSIpLnJlbW92ZSh4bSkucmVtb3ZlKHhzKTsgfTsgfSkoeG0sIHhzKSwgMjAwKTsNCi0gICAgICAgIH07DQotICAgICAgfSkgKHhtLCB4cywgY2FsbGJhY2spLCAxMDApOw0KLSAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIGlmKHR5cGVvZiB3aW5kb3cuRE9NUGFyc2VyICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2Ygd2luZG93LlhNTEh0dHBSZXF1ZXN0ICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2Ygd2luZG93LlhTTFRQcm9jZXNzb3IgIT09ICJ1bmRlZmluZWQiKSB7DQotICAgICAgcHJvY2Vzc29yID0gbmV3IFhTTFRQcm9jZXNzb3IoKTsNCi0gICAgICBzdXBwb3J0ID0gJC5pc0Z1bmN0aW9uKHByb2Nlc3Nvci50cmFuc2Zvcm1Eb2N1bWVudCkgPyAodHlwZW9mIHdpbmRvdy5YTUxTZXJpYWxpemVyICE9PSAidW5kZWZpbmVkIikgOiB0cnVlOw0KLSAgICAgIGlmKCFzdXBwb3J0KSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgIHhtbCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoeG1sLCAidGV4dC94bWwiKTsNCi0gICAgICB4c2wgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHhzbCwgInRleHQveG1sIik7DQotICAgICAgaWYoJC5pc0Z1bmN0aW9uKHByb2Nlc3Nvci50cmFuc2Zvcm1Eb2N1bWVudCkpIHsNCi0gICAgICAgIHJzID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoIiIsICIiLCBudWxsKTsNCi0gICAgICAgIHByb2Nlc3Nvci50cmFuc2Zvcm1Eb2N1bWVudCh4bWwsIHhzbCwgcnMsIG51bGwpOw0KLSAgICAgICAgY2FsbGJhY2suY2FsbChudWxsLCBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcocnMpKTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgIH0NCi0gICAgICBlbHNlIHsNCi0gICAgICAgIHByb2Nlc3Nvci5pbXBvcnRTdHlsZXNoZWV0KHhzbCk7DQotICAgICAgICBycyA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHhtbCwgZG9jdW1lbnQpOw0KLSAgICAgICAgY2FsbGJhY2suY2FsbChudWxsLCAkKCI8ZGl2PiIpLmFwcGVuZChycykuaHRtbCgpKTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gZmFsc2U7DQotICB9Ow0KLSAgdmFyIHhzbCA9IHsNCi0gICAgJ25lc3QnIDogJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PicgKyANCi0gICAgICAnPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iID4nICsgDQotICAgICAgJzx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgZW5jb2Rpbmc9InV0Zi04IiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIiBzdGFuZGFsb25lPSJubyIgaW5kZW50PSJubyIgbWVkaWEtdHlwZT0idGV4dC9odG1sIiAvPicgKyANCi0gICAgICAnPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+JyArIA0KLSAgICAgICcgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJub2RlcyI+JyArIA0KLSAgICAgICcgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iL3Jvb3QiIC8+JyArIA0KLSAgICAgICcgIDwveHNsOmNhbGwtdGVtcGxhdGU+JyArIA0KLSAgICAgICc8L3hzbDp0ZW1wbGF0ZT4nICsgDQotICAgICAgJzx4c2w6dGVtcGxhdGUgbmFtZT0ibm9kZXMiPicgKyANCi0gICAgICAnICA8eHNsOnBhcmFtIG5hbWU9Im5vZGUiIC8+JyArIA0KLSAgICAgICcgIDx1bD4nICsgDQotICAgICAgJyAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRub2RlL2l0ZW0iPicgKyANCi0gICAgICAnICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2hpbGRyZW4iIHNlbGVjdD0iY291bnQoLi9pdGVtKSAmZ3Q7IDAiIC8+JyArIA0KLSAgICAgICcgICAgPGxpPicgKyANCi0gICAgICAnICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPicgKyANCi0gICAgICAnICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgPSBsYXN0KCkiPmpzdHJlZS1sYXN0IDwveHNsOmlmPicgKyANCi0gICAgICAnICAgICAgICA8eHNsOmNob29zZT4nICsgDQotICAgICAgJyAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHN0YXRlID0gXCdvcGVuXCciPmpzdHJlZS1vcGVuIDwveHNsOndoZW4+JyArIA0KLSAgICAgICcgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRjaGlsZHJlbiBvciBAaGFzQ2hpbGRyZW4gb3IgQHN0YXRlID0gXCdjbG9zZWRcJyI+anN0cmVlLWNsb3NlZCA8L3hzbDp3aGVuPicgKyANCi0gICAgICAnICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPmpzdHJlZS1sZWFmIDwveHNsOm90aGVyd2lzZT4nICsgDQotICAgICAgJyAgICAgICAgPC94c2w6Y2hvb3NlPicgKyANCi0gICAgICAnICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNsYXNzIiAvPicgKyANCi0gICAgICAnICAgICAgPC94c2w6YXR0cmlidXRlPicgKyANCi0gICAgICAnICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkAqIj4nICsgDQotICAgICAgJyAgICAgICAgPHhzbDppZiB0ZXN0PSJuYW1lKCkgIT0gXCdjbGFzc1wnIGFuZCBuYW1lKCkgIT0gXCdzdGF0ZVwnIGFuZCBuYW1lKCkgIT0gXCdoYXNDaGlsZHJlblwnIj4nICsgDQotICAgICAgJyAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ7bmFtZSgpfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iIC8+PC94c2w6YXR0cmlidXRlPicgKyANCi0gICAgICAnICAgICAgICA8L3hzbDppZj4nICsgDQotICAgICAgJyAgICAgIDwveHNsOmZvci1lYWNoPicgKyANCi0gICAgICAnICA8aW5zIGNsYXNzPSJqc3RyZWUtaWNvbiI+PHhzbDp0ZXh0PiYjeGEwOzwveHNsOnRleHQ+PC9pbnM+JyArIA0KLSAgICAgICcgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iY29udGVudC9uYW1lIj4nICsgDQotICAgICAgJyAgICAgICAgPGE+JyArIA0KLSAgICAgICcgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPicgKyANCi0gICAgICAnICAgICAgICAgIDx4c2w6Y2hvb3NlPicgKyANCi0gICAgICAnICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBocmVmIiAvPjwveHNsOndoZW4+JyArIA0KLSAgICAgICcgICAgICAgICAgPHhzbDpvdGhlcndpc2U+IzwveHNsOm90aGVyd2lzZT4nICsgDQotICAgICAgJyAgICAgICAgICA8L3hzbDpjaG9vc2U+JyArIA0KLSAgICAgICcgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4nICsgDQotICAgICAgJyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIgLz4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbGFzcyIgLz48L3hzbDphdHRyaWJ1dGU+JyArIA0KLSAgICAgICcgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InN0eWxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0eWxlIiAvPjwveHNsOmF0dHJpYnV0ZT4nICsgDQotICAgICAgJyAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkAqIj4nICsgDQotICAgICAgJyAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5hbWUoKSAhPSBcJ3N0eWxlXCcgYW5kIG5hbWUoKSAhPSBcJ2NsYXNzXCcgYW5kIG5hbWUoKSAhPSBcJ2hyZWZcJyI+JyArIA0KLSAgICAgICcgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ7bmFtZSgpfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iIC8+PC94c2w6YXR0cmlidXRlPicgKyANCi0gICAgICAnICAgICAgICAgIDwveHNsOmlmPicgKyANCi0gICAgICAnICAgICAgICA8L3hzbDpmb3ItZWFjaD4nICsgDQotICAgICAgJyAgICAgICAgICA8aW5zPicgKyANCi0gICAgICAnICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPmpzdHJlZS1pY29uICcgKyANCi0gICAgICAnICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoYXR0cmlidXRlOjppY29uKSA+IDAgYW5kIG5vdChjb250YWlucyhAaWNvbixcJy9cJykpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGljb24iIC8+PC94c2w6aWY+JyArIA0KLSAgICAgICcgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+JyArIA0KLSAgICAgICcgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoYXR0cmlidXRlOjppY29uKSA+IDAgYW5kIGNvbnRhaW5zKEBpY29uLFwnL1wnKSI+PHhzbDphdHRyaWJ1dGUgbmFtZT0ic3R5bGUiPmJhY2tncm91bmQ6dXJsKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWNvbiIgLz4pIGNlbnRlciBjZW50ZXIgbm8tcmVwZWF0OzwveHNsOmF0dHJpYnV0ZT48L3hzbDppZj4nICsgDQotICAgICAgJyAgICAgICAgICAgIDx4c2w6dGV4dD4mI3hhMDs8L3hzbDp0ZXh0PicgKyANCi0gICAgICAnICAgICAgICAgIDwvaW5zPicgKyANCi0gICAgICAnICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjdXJyZW50KCkiIC8+JyArIA0KLSAgICAgICcgICAgICAgIDwvYT4nICsgDQotICAgICAgJyAgICAgIDwveHNsOmZvci1lYWNoPicgKyANCi0gICAgICAnICAgICAgPHhzbDppZiB0ZXN0PSIkY2hpbGRyZW4gb3IgQGhhc0NoaWxkcmVuIj48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibm9kZXMiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9ImN1cnJlbnQoKSIgLz48L3hzbDpjYWxsLXRlbXBsYXRlPjwveHNsOmlmPicgKyANCi0gICAgICAnICAgIDwvbGk+JyArIA0KLSAgICAgICcgIDwveHNsOmZvci1lYWNoPicgKyANCi0gICAgICAnICA8L3VsPicgKyANCi0gICAgICAnPC94c2w6dGVtcGxhdGU+JyArIA0KLSAgICAgICc8L3hzbDpzdHlsZXNoZWV0PicsDQotDQotICAgICdmbGF0JyA6ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4nICsgDQotICAgICAgJzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiA+JyArIA0KLSAgICAgICc8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGVuY29kaW5nPSJ1dGYtOCIgb21pdC14bWwtZGVjbGFyYXRpb249InllcyIgc3RhbmRhbG9uZT0ibm8iIGluZGVudD0ibm8iIG1lZGlhLXR5cGU9InRleHQveG1sIiAvPicgKyANCi0gICAgICAnPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+JyArIA0KLSAgICAgICcgIDx1bD4nICsgDQotICAgICAgJyAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii8vaXRlbVtub3QoQHBhcmVudF9pZCkgb3IgQHBhcmVudF9pZD0wIG9yIG5vdChAcGFyZW50X2lkID0gLy9pdGVtL0BpZCldIj4nICsgLyogdGhlIGxhc3QgYG9yYCBtYXkgYmUgcmVtb3ZlZCAqLw0KLSAgICAgICcgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im5vZGVzIj4nICsgDQotICAgICAgJyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9Ii4iIC8+JyArIA0KLSAgICAgICcgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iaXNfbGFzdCIgc2VsZWN0PSJudW1iZXIocG9zaXRpb24oKSA9IGxhc3QoKSkiIC8+JyArIA0KLSAgICAgICcgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4nICsgDQotICAgICAgJyAgPC94c2w6Zm9yLWVhY2g+JyArIA0KLSAgICAgICcgIDwvdWw+JyArIA0KLSAgICAgICc8L3hzbDp0ZW1wbGF0ZT4nICsgDQotICAgICAgJzx4c2w6dGVtcGxhdGUgbmFtZT0ibm9kZXMiPicgKyANCi0gICAgICAnICA8eHNsOnBhcmFtIG5hbWU9Im5vZGUiIC8+JyArIA0KLSAgICAgICcgIDx4c2w6cGFyYW0gbmFtZT0iaXNfbGFzdCIgLz4nICsgDQotICAgICAgJyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGlsZHJlbiIgc2VsZWN0PSJjb3VudCgvL2l0ZW1bQHBhcmVudF9pZD0kbm9kZS9hdHRyaWJ1dGU6OmlkXSkgJmd0OyAwIiAvPicgKyANCi0gICAgICAnICA8bGk+JyArIA0KLSAgICAgICcgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4nICsgDQotICAgICAgJyAgICA8eHNsOmlmIHRlc3Q9IiRpc19sYXN0ID0gdHJ1ZSgpIj5qc3RyZWUtbGFzdCA8L3hzbDppZj4nICsgDQotICAgICAgJyAgICA8eHNsOmNob29zZT4nICsgDQotICAgICAgJyAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAc3RhdGUgPSBcJ29wZW5cJyI+anN0cmVlLW9wZW4gPC94c2w6d2hlbj4nICsgDQotICAgICAgJyAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hpbGRyZW4gb3IgQGhhc0NoaWxkcmVuIG9yIEBzdGF0ZSA9IFwnY2xvc2VkXCciPmpzdHJlZS1jbG9zZWQgPC94c2w6d2hlbj4nICsgDQotICAgICAgJyAgICAgIDx4c2w6b3RoZXJ3aXNlPmpzdHJlZS1sZWFmIDwveHNsOm90aGVyd2lzZT4nICsgDQotICAgICAgJyAgICA8L3hzbDpjaG9vc2U+JyArIA0KLSAgICAgICcgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbGFzcyIgLz4nICsgDQotICAgICAgJyAgPC94c2w6YXR0cmlidXRlPicgKyANCi0gICAgICAnICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iQCoiPicgKyANCi0gICAgICAnICAgIDx4c2w6aWYgdGVzdD0ibmFtZSgpICE9IFwncGFyZW50X2lkXCcgYW5kIG5hbWUoKSAhPSBcJ2hhc0NoaWxkcmVuXCcgYW5kIG5hbWUoKSAhPSBcJ2NsYXNzXCcgYW5kIG5hbWUoKSAhPSBcJ3N0YXRlXCciPicgKyANCi0gICAgICAnICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9IntuYW1lKCl9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIgLz48L3hzbDphdHRyaWJ1dGU+JyArIA0KLSAgICAgICcgICAgPC94c2w6aWY+JyArIA0KLSAgICAgICcgIDwveHNsOmZvci1lYWNoPicgKyANCi0gICAgICAnICA8aW5zIGNsYXNzPSJqc3RyZWUtaWNvbiI+PHhzbDp0ZXh0PiYjeGEwOzwveHNsOnRleHQ+PC9pbnM+JyArIA0KLSAgICAgICcgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJjb250ZW50L25hbWUiPicgKyANCi0gICAgICAnICAgIDxhPicgKyANCi0gICAgICAnICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPicgKyANCi0gICAgICAnICAgICAgPHhzbDpjaG9vc2U+JyArIA0KLSAgICAgICcgICAgICA8eHNsOndoZW4gdGVzdD0iQGhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaHJlZiIgLz48L3hzbDp3aGVuPicgKyANCi0gICAgICAnICAgICAgPHhzbDpvdGhlcndpc2U+IzwveHNsOm90aGVyd2lzZT4nICsgDQotICAgICAgJyAgICAgIDwveHNsOmNob29zZT4nICsgDQotICAgICAgJyAgICA8L3hzbDphdHRyaWJ1dGU+JyArIA0KLSAgICAgICcgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIgLz4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbGFzcyIgLz48L3hzbDphdHRyaWJ1dGU+JyArIA0KLSAgICAgICcgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3R5bGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc3R5bGUiIC8+PC94c2w6YXR0cmlidXRlPicgKyANCi0gICAgICAnICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJAKiI+JyArIA0KLSAgICAgICcgICAgICA8eHNsOmlmIHRlc3Q9Im5hbWUoKSAhPSBcJ3N0eWxlXCcgYW5kIG5hbWUoKSAhPSBcJ2NsYXNzXCcgYW5kIG5hbWUoKSAhPSBcJ2hyZWZcJyI+JyArIA0KLSAgICAgICcgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9IntuYW1lKCl9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIgLz48L3hzbDphdHRyaWJ1dGU+JyArIA0KLSAgICAgICcgICAgICA8L3hzbDppZj4nICsgDQotICAgICAgJyAgICA8L3hzbDpmb3ItZWFjaD4nICsgDQotICAgICAgJyAgICAgIDxpbnM+JyArIA0KLSAgICAgICcgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5qc3RyZWUtaWNvbiAnICsgDQotICAgICAgJyAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoYXR0cmlidXRlOjppY29uKSA+IDAgYW5kIG5vdChjb250YWlucyhAaWNvbixcJy9cJykpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGljb24iIC8+PC94c2w6aWY+JyArIA0KLSAgICAgICcgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4nICsgDQotICAgICAgJyAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKGF0dHJpYnV0ZTo6aWNvbikgPiAwIGFuZCBjb250YWlucyhAaWNvbixcJy9cJykiPjx4c2w6YXR0cmlidXRlIG5hbWU9InN0eWxlIj5iYWNrZ3JvdW5kOnVybCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGljb24iIC8+KSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDs8L3hzbDphdHRyaWJ1dGU+PC94c2w6aWY+JyArIA0KLSAgICAgICcgICAgICAgIDx4c2w6dGV4dD4mI3hhMDs8L3hzbDp0ZXh0PicgKyANCi0gICAgICAnICAgICAgPC9pbnM+JyArIA0KLSAgICAgICcgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY3VycmVudCgpIiAvPicgKyANCi0gICAgICAnICAgIDwvYT4nICsgDQotICAgICAgJyAgPC94c2w6Zm9yLWVhY2g+JyArIA0KLSAgICAgICcgIDx4c2w6aWYgdGVzdD0iJGNoaWxkcmVuIj4nICsgDQotICAgICAgJyAgICA8dWw+JyArIA0KLSAgICAgICcgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii8vaXRlbVtAcGFyZW50X2lkPSRub2RlL2F0dHJpYnV0ZTo6aWRdIj4nICsgDQotICAgICAgJyAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJub2RlcyI+JyArIA0KLSAgICAgICcgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9Ii4iIC8+JyArIA0KLSAgICAgICcgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpc19sYXN0IiBzZWxlY3Q9Im51bWJlcihwb3NpdGlvbigpID0gbGFzdCgpKSIgLz4nICsgDQotICAgICAgJyAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+JyArIA0KLSAgICAgICcgICAgPC94c2w6Zm9yLWVhY2g+JyArIA0KLSAgICAgICcgICAgPC91bD4nICsgDQotICAgICAgJyAgPC94c2w6aWY+JyArIA0KLSAgICAgICcgIDwvbGk+JyArIA0KLSAgICAgICc8L3hzbDp0ZW1wbGF0ZT4nICsgDQotICAgICAgJzwveHNsOnN0eWxlc2hlZXQ+Jw0KLSAgfTsNCi0gICQuanN0cmVlLnBsdWdpbigieG1sX2RhdGEiLCB7DQotICAgIGRlZmF1bHRzIDogeyANCi0gICAgICBkYXRhIDogZmFsc2UsDQotICAgICAgYWpheCA6IGZhbHNlLA0KLSAgICAgIHhzbCA6ICJmbGF0IiwNCi0gICAgICBjbGVhbl9ub2RlIDogZmFsc2UsDQotICAgICAgY29ycmVjdF9zdGF0ZSA6IHRydWUNCi0gICAgfSwNCi0gICAgX2ZuIDogew0KLSAgICAgIGxvYWRfbm9kZSA6IGZ1bmN0aW9uIChvYmosIHNfY2FsbCwgZV9jYWxsKSB7IHZhciBfdGhpcyA9IHRoaXM7IHRoaXMubG9hZF9ub2RlX3htbChvYmosIGZ1bmN0aW9uICgpIHsgX3RoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqIH0pOyBzX2NhbGwuY2FsbCh0aGlzKTsgfSwgZV9jYWxsKTsgfSwNCi0gICAgICBfaXNfbG9hZGVkIDogZnVuY3Rpb24gKG9iaikgeyANCi0gICAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkueG1sX2RhdGE7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgcmV0dXJuIG9iaiA9PSAtMSB8fCAhb2JqIHx8ICFzLmFqYXggfHwgb2JqLmlzKCIuanN0cmVlLW9wZW4sIC5qc3RyZWUtbGVhZiIpIHx8IG9iai5jaGlsZHJlbigidWwiKS5jaGlsZHJlbigibGkiKS5zaXplKCkgPiAwOw0KLSAgICAgIH0sDQotICAgICAgbG9hZF9ub2RlX3htbCA6IGZ1bmN0aW9uIChvYmosIHNfY2FsbCwgZV9jYWxsKSB7DQotICAgICAgICB2YXIgcyA9IHRoaXMuZ2V0X3NldHRpbmdzKCkueG1sX2RhdGEsDQotICAgICAgICAgIGVycm9yX2Z1bmMgPSBmdW5jdGlvbiAoKSB7fSwNCi0gICAgICAgICAgc3VjY2Vzc19mdW5jID0gZnVuY3Rpb24gKCkge307DQotDQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYob2JqICYmIG9iaiAhPT0gLTEpIHsNCi0gICAgICAgICAgaWYob2JqLmRhdGEoImpzdHJlZS1pcy1sb2FkaW5nIikpIHsgcmV0dXJuOyB9DQotICAgICAgICAgIGVsc2UgeyBvYmouZGF0YSgianN0cmVlLWlzLWxvYWRpbmciLHRydWUpOyB9DQotICAgICAgICB9DQotICAgICAgICBzd2l0Y2goITApIHsNCi0gICAgICAgICAgY2FzZSAoIXMuZGF0YSAmJiAhcy5hamF4KTogdGhyb3cgIk5laXRoZXIgZGF0YSBub3IgYWpheCBzZXR0aW5ncyBzdXBwbGllZC4iOw0KLSAgICAgICAgICBjYXNlICghIXMuZGF0YSAmJiAhcy5hamF4KSB8fCAoISFzLmRhdGEgJiYgISFzLmFqYXggJiYgKCFvYmogfHwgb2JqID09PSAtMSkpOg0KLSAgICAgICAgICAgIGlmKCFvYmogfHwgb2JqID09IC0xKSB7DQotICAgICAgICAgICAgICB0aGlzLnBhcnNlX3htbChzLmRhdGEsICQucHJveHkoZnVuY3Rpb24gKGQpIHsNCi0gICAgICAgICAgICAgICAgaWYoZCkgew0KLSAgICAgICAgICAgICAgICAgIGQgPSBkLnJlcGxhY2UoLyA/eG1sbnM9IlteIl0qIi9pZywgIiIpOw0KLSAgICAgICAgICAgICAgICAgIGlmKGQubGVuZ3RoID4gMTApIHsNCi0gICAgICAgICAgICAgICAgICAgIGQgPSAkKGQpOw0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikuZW1wdHkoKS5hcHBlbmQoZC5jaGlsZHJlbigpKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKHMuY2xlYW5fbm9kZSkgeyB0aGlzLmNsZWFuX25vZGUob2JqKTsgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoc19jYWxsKSB7IHNfY2FsbC5jYWxsKHRoaXMpOyB9DQotICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UgeyANCi0gICAgICAgICAgICAgICAgICBpZihzLmNvcnJlY3Rfc3RhdGUpIHsgDQotICAgICAgICAgICAgICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5lbXB0eSgpOyANCi0gICAgICAgICAgICAgICAgICAgIGlmKHNfY2FsbCkgeyBzX2NhbGwuY2FsbCh0aGlzKTsgfQ0KLSAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgfSwgdGhpcykpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgY2FzZSAoIXMuZGF0YSAmJiAhIXMuYWpheCkgfHwgKCEhcy5kYXRhICYmICEhcy5hamF4ICYmIG9iaiAmJiBvYmogIT09IC0xKToNCi0gICAgICAgICAgICBlcnJvcl9mdW5jID0gZnVuY3Rpb24gKHgsIHQsIGUpIHsNCi0gICAgICAgICAgICAgIHZhciBlZiA9IHRoaXMuZ2V0X3NldHRpbmdzKCkueG1sX2RhdGEuYWpheC5lcnJvcjsgDQotICAgICAgICAgICAgICBpZihlZikgeyBlZi5jYWxsKHRoaXMsIHgsIHQsIGUpOyB9DQotICAgICAgICAgICAgICBpZihvYmogIT09IC0xICYmIG9iai5sZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgb2JqLmNoaWxkcmVuKCIuanN0cmVlLWxvYWRpbmciKS5yZW1vdmVDbGFzcygianN0cmVlLWxvYWRpbmciKTsNCi0gICAgICAgICAgICAgICAgb2JqLmRhdGEoImpzdHJlZS1pcy1sb2FkaW5nIixmYWxzZSk7DQotICAgICAgICAgICAgICAgIGlmKHQgPT09ICJzdWNjZXNzIiAmJiBzLmNvcnJlY3Rfc3RhdGUpIHsgb2JqLnJlbW92ZUNsYXNzKCJqc3RyZWUtb3BlbiBqc3RyZWUtY2xvc2VkIikuYWRkQ2xhc3MoImpzdHJlZS1sZWFmIik7IH0NCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZih0ID09PSAic3VjY2VzcyIgJiYgcy5jb3JyZWN0X3N0YXRlKSB7IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCk7IH0NCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIGlmKGVfY2FsbCkgeyBlX2NhbGwuY2FsbCh0aGlzKTsgfQ0KLSAgICAgICAgICAgIH07DQotICAgICAgICAgICAgc3VjY2Vzc19mdW5jID0gZnVuY3Rpb24gKGQsIHQsIHgpIHsNCi0gICAgICAgICAgICAgIGQgPSB4LnJlc3BvbnNlVGV4dDsNCi0gICAgICAgICAgICAgIHZhciBzZiA9IHRoaXMuZ2V0X3NldHRpbmdzKCkueG1sX2RhdGEuYWpheC5zdWNjZXNzOyANCi0gICAgICAgICAgICAgIGlmKHNmKSB7IGQgPSBzZi5jYWxsKHRoaXMsZCx0LHgpIHx8IGQ7IH0NCi0gICAgICAgICAgICAgIGlmKGQgPT0gIiIpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yX2Z1bmMuY2FsbCh0aGlzLCB4LCB0LCAiIik7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICB0aGlzLnBhcnNlX3htbChkLCAkLnByb3h5KGZ1bmN0aW9uIChkKSB7DQotICAgICAgICAgICAgICAgIGlmKGQpIHsNCi0gICAgICAgICAgICAgICAgICBkID0gZC5yZXBsYWNlKC8gP3htbG5zPSJbXiJdKiIvaWcsICIiKTsNCi0gICAgICAgICAgICAgICAgICBpZihkLmxlbmd0aCA+IDEwKSB7DQotICAgICAgICAgICAgICAgICAgICBkID0gJChkKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmKG9iaiA9PT0gLTEgfHwgIW9iaikgeyB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5lbXB0eSgpLmFwcGVuZChkLmNoaWxkcmVuKCkpOyB9DQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsgb2JqLmNoaWxkcmVuKCIuanN0cmVlLWxvYWRpbmciKS5yZW1vdmVDbGFzcygianN0cmVlLWxvYWRpbmciKTsgb2JqLmFwcGVuZChkKTsgb2JqLmRhdGEoImpzdHJlZS1pcy1sb2FkaW5nIixmYWxzZSk7IH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKHMuY2xlYW5fbm9kZSkgeyB0aGlzLmNsZWFuX25vZGUob2JqKTsgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYoc19jYWxsKSB7IHNfY2FsbC5jYWxsKHRoaXMpOyB9DQotICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaWYob2JqICYmIG9iaiAhPT0gLTEpIHsgDQotICAgICAgICAgICAgICAgICAgICAgIG9iai5jaGlsZHJlbigiLmpzdHJlZS1sb2FkaW5nIikucmVtb3ZlQ2xhc3MoImpzdHJlZS1sb2FkaW5nIik7DQotICAgICAgICAgICAgICAgICAgICAgIG9iai5kYXRhKCJqc3RyZWUtaXMtbG9hZGluZyIsZmFsc2UpOw0KLSAgICAgICAgICAgICAgICAgICAgICBpZihzLmNvcnJlY3Rfc3RhdGUpIHsgDQotICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnJlbW92ZUNsYXNzKCJqc3RyZWUtb3BlbiBqc3RyZWUtY2xvc2VkIikuYWRkQ2xhc3MoImpzdHJlZS1sZWFmIik7IA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNfY2FsbCkgeyBzX2NhbGwuY2FsbCh0aGlzKTsgfSANCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgIGlmKHMuY29ycmVjdF9zdGF0ZSkgeyANCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5lbXB0eSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNfY2FsbCkgeyBzX2NhbGwuY2FsbCh0aGlzKTsgfSANCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgfSwgdGhpcykpOw0KLSAgICAgICAgICAgIH07DQotICAgICAgICAgICAgcy5hamF4LmNvbnRleHQgPSB0aGlzOw0KLSAgICAgICAgICAgIHMuYWpheC5lcnJvciA9IGVycm9yX2Z1bmM7DQotICAgICAgICAgICAgcy5hamF4LnN1Y2Nlc3MgPSBzdWNjZXNzX2Z1bmM7DQotICAgICAgICAgICAgaWYoIXMuYWpheC5kYXRhVHlwZSkgeyBzLmFqYXguZGF0YVR5cGUgPSAieG1sIjsgfQ0KLSAgICAgICAgICAgIGlmKCQuaXNGdW5jdGlvbihzLmFqYXgudXJsKSkgeyBzLmFqYXgudXJsID0gcy5hamF4LnVybC5jYWxsKHRoaXMsIG9iaik7IH0NCi0gICAgICAgICAgICBpZigkLmlzRnVuY3Rpb24ocy5hamF4LmRhdGEpKSB7IHMuYWpheC5kYXRhID0gcy5hamF4LmRhdGEuY2FsbCh0aGlzLCBvYmopOyB9DQotICAgICAgICAgICAgJC5hamF4KHMuYWpheCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgfSwNCi0gICAgICBwYXJzZV94bWwgOiBmdW5jdGlvbiAoeG1sLCBjYWxsYmFjaykgew0KLSAgICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS54bWxfZGF0YTsNCi0gICAgICAgICQudmFrYXRhLnhzbHQoeG1sLCB4c2xbcy54c2xdLCBjYWxsYmFjayk7DQotICAgICAgfSwNCi0gICAgICBnZXRfeG1sIDogZnVuY3Rpb24gKHRwLCBvYmosIGxpX2F0dHIsIGFfYXR0ciwgaXNfY2FsbGJhY2spIHsNCi0gICAgICAgIHZhciByZXN1bHQgPSAiIiwgDQotICAgICAgICAgIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKSwgDQotICAgICAgICAgIF90aGlzID0gdGhpcywNCi0gICAgICAgICAgdG1wMSwgdG1wMiwgbGksIGEsIGxhbmc7DQotICAgICAgICBpZighdHApIHsgdHAgPSAiZmxhdCI7IH0NCi0gICAgICAgIGlmKCFpc19jYWxsYmFjaykgeyBpc19jYWxsYmFjayA9IDA7IH0NCi0gICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICBpZighb2JqIHx8IG9iaiA9PT0gLTEpIHsgb2JqID0gdGhpcy5nZXRfY29udGFpbmVyKCkuZmluZCgiPiB1bCA+IGxpIik7IH0NCi0gICAgICAgIGxpX2F0dHIgPSAkLmlzQXJyYXkobGlfYXR0cikgPyBsaV9hdHRyIDogWyAiaWQiLCAiY2xhc3MiIF07DQotICAgICAgICBpZighaXNfY2FsbGJhY2sgJiYgdGhpcy5kYXRhLnR5cGVzICYmICQuaW5BcnJheShzLnR5cGVzLnR5cGVfYXR0ciwgbGlfYXR0cikgPT09IC0xKSB7IGxpX2F0dHIucHVzaChzLnR5cGVzLnR5cGVfYXR0cik7IH0NCi0NCi0gICAgICAgIGFfYXR0ciA9ICQuaXNBcnJheShhX2F0dHIpID8gYV9hdHRyIDogWyBdOw0KLQ0KLSAgICAgICAgaWYoIWlzX2NhbGxiYWNrKSB7IHJlc3VsdCArPSAiPHJvb3Q+IjsgfQ0KLSAgICAgICAgb2JqLmVhY2goZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICByZXN1bHQgKz0gIjxpdGVtIjsNCi0gICAgICAgICAgbGkgPSAkKHRoaXMpOw0KLSAgICAgICAgICAkLmVhY2gobGlfYXR0ciwgZnVuY3Rpb24gKGksIHYpIHsgcmVzdWx0ICs9ICIgIiArIHYgKyAiPVwiIiArIChsaS5hdHRyKHYpIHx8ICIiKS5yZXBsYWNlKC9qc3RyZWVbXiBdKnwkL2lnLCcnKS5yZXBsYWNlKC9eXHMrJC9pZywiIikgKyAiXCIiOyB9KTsNCi0gICAgICAgICAgaWYobGkuaGFzQ2xhc3MoImpzdHJlZS1vcGVuIikpIHsgcmVzdWx0ICs9ICIgc3RhdGU9XCJvcGVuXCIiOyB9DQotICAgICAgICAgIGlmKGxpLmhhc0NsYXNzKCJqc3RyZWUtY2xvc2VkIikpIHsgcmVzdWx0ICs9ICIgc3RhdGU9XCJjbG9zZWRcIiI7IH0NCi0gICAgICAgICAgaWYodHAgPT09ICJmbGF0IikgeyByZXN1bHQgKz0gIiBwYXJlbnRfaWQ9XCIiICsgaXNfY2FsbGJhY2sgKyAiXCIiOyB9DQotICAgICAgICAgIHJlc3VsdCArPSAiPiI7DQotICAgICAgICAgIHJlc3VsdCArPSAiPGNvbnRlbnQ+IjsNCi0gICAgICAgICAgYSA9IGxpLmNoaWxkcmVuKCJhIik7DQotICAgICAgICAgIGEuZWFjaChmdW5jdGlvbiAoKSB7DQotICAgICAgICAgICAgdG1wMSA9ICQodGhpcyk7DQotICAgICAgICAgICAgbGFuZyA9IGZhbHNlOw0KLSAgICAgICAgICAgIHJlc3VsdCArPSAiPG5hbWUiOw0KLSAgICAgICAgICAgIGlmKCQuaW5BcnJheSgibGFuZ3VhZ2VzIiwgcy5wbHVnaW5zKSAhPT0gLTEpIHsNCi0gICAgICAgICAgICAgICQuZWFjaChzLmxhbmd1YWdlcywgZnVuY3Rpb24gKGssIHopIHsNCi0gICAgICAgICAgICAgICAgaWYodG1wMS5oYXNDbGFzcyh6KSkgeyByZXN1bHQgKz0gIiBsYW5nPVwiIiArIHogKyAiXCIiOyBsYW5nID0gejsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoYV9hdHRyLmxlbmd0aCkgeyANCi0gICAgICAgICAgICAgICQuZWFjaChhX2F0dHIsIGZ1bmN0aW9uIChrLCB6KSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiICIgKyB6ICsgIj1cIiIgKyAodG1wMS5hdHRyKHopIHx8ICIiKS5yZXBsYWNlKC9qc3RyZWVbXiBdKnwkL2lnLCcnKSArICJcIiI7DQotICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYodG1wMS5jaGlsZHJlbigiaW5zIikuZ2V0KDApLmNsYXNzTmFtZS5yZXBsYWNlKC9qc3RyZWVbXiBdKnwkL2lnLCcnKS5yZXBsYWNlKC9eXHMrJC9pZywiIikubGVuZ3RoKSB7DQotICAgICAgICAgICAgICByZXN1bHQgKz0gJyBpY29uPSInICsgdG1wMS5jaGlsZHJlbigiaW5zIikuZ2V0KDApLmNsYXNzTmFtZS5yZXBsYWNlKC9qc3RyZWVbXiBdKnwkL2lnLCcnKS5yZXBsYWNlKC9eXHMrJC9pZywiIikgKyAnIic7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKHRtcDEuY2hpbGRyZW4oImlucyIpLmdldCgwKS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UubGVuZ3RoKSB7DQotICAgICAgICAgICAgICByZXN1bHQgKz0gJyBpY29uPSInICsgdG1wMS5jaGlsZHJlbigiaW5zIikuZ2V0KDApLnN0eWxlLmJhY2tncm91bmRJbWFnZS5yZXBsYWNlKCJ1cmwoIiwiIikucmVwbGFjZSgiKSIsIiIpICsgJyInOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHQgKz0gIj4iOw0KLSAgICAgICAgICAgIHJlc3VsdCArPSAiPCFbQ0RBVEFbIiArIF90aGlzLmdldF90ZXh0KHRtcDEsIGxhbmcpICsgIl1dPiI7DQotICAgICAgICAgICAgcmVzdWx0ICs9ICI8L25hbWU+IjsNCi0gICAgICAgICAgfSk7DQotICAgICAgICAgIHJlc3VsdCArPSAiPC9jb250ZW50PiI7DQotICAgICAgICAgIHRtcDIgPSBsaVswXS5pZDsNCi0gICAgICAgICAgbGkgPSBsaS5maW5kKCI+IHVsID4gbGkiKTsNCi0gICAgICAgICAgaWYobGkubGVuZ3RoKSB7IHRtcDIgPSBfdGhpcy5nZXRfeG1sKHRwLCBsaSwgbGlfYXR0ciwgYV9hdHRyLCB0bXAyKTsgfQ0KLSAgICAgICAgICBlbHNlIHsgdG1wMiA9ICIiOyB9DQotICAgICAgICAgIGlmKHRwID09ICJuZXN0IikgeyByZXN1bHQgKz0gdG1wMjsgfQ0KLSAgICAgICAgICByZXN1bHQgKz0gIjwvaXRlbT4iOw0KLSAgICAgICAgICBpZih0cCA9PSAiZmxhdCIpIHsgcmVzdWx0ICs9IHRtcDI7IH0NCi0gICAgICAgIH0pOw0KLSAgICAgICAgaWYoIWlzX2NhbGxiYWNrKSB7IHJlc3VsdCArPSAiPC9yb290PiI7IH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgfQ0KLSAgICB9DQotICB9KTsNCi19KShqUXVlcnkpOw0KLS8vKi8NCi0NCi0vKg0KLSAqIGpzVHJlZSBzZWFyY2ggcGx1Z2luIDEuMA0KLSAqIEVuYWJsZXMgYm90aCBzeW5jIGFuZCBhc3luYyBzZWFyY2ggb24gdGhlIHRyZWUNCi0gKiBET0VTIE5PVCBXT1JLIFdJVEggSlNPTiBQUk9HUkVTU0lWRSBSRU5ERVINCi0gKi8NCi0oZnVuY3Rpb24gKCQpIHsNCi0gICQuZXhwclsnOiddLmpzdHJlZV9jb250YWlucyA9IGZ1bmN0aW9uKGEsaSxtKXsNCi0gICAgcmV0dXJuIChhLnRleHRDb250ZW50IHx8IGEuaW5uZXJUZXh0IHx8ICIiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YobVszXS50b0xvd2VyQ2FzZSgpKT49MDsNCi0gIH07DQotICAkLmpzdHJlZS5wbHVnaW4oInNlYXJjaCIsIHsNCi0gICAgX19pbml0IDogZnVuY3Rpb24gKCkgew0KLSAgICAgIHRoaXMuZGF0YS5zZWFyY2guc3RyID0gIiI7DQotICAgICAgdGhpcy5kYXRhLnNlYXJjaC5yZXN1bHQgPSAkKCk7DQotICAgIH0sDQotICAgIGRlZmF1bHRzIDogew0KLSAgICAgIGFqYXggOiBmYWxzZSwgLy8gT1IgYWpheCBvYmplY3QNCi0gICAgICBjYXNlX2luc2Vuc2l0aXZlIDogZmFsc2UNCi0gICAgfSwNCi0gICAgX2ZuIDogew0KLSAgICAgIHNlYXJjaCA6IGZ1bmN0aW9uIChzdHIsIHNraXBfYXN5bmMpIHsNCi0gICAgICAgIGlmKHN0ciA9PT0gIiIpIHsgcmV0dXJuOyB9DQotICAgICAgICB2YXIgcyA9IHRoaXMuZ2V0X3NldHRpbmdzKCkuc2VhcmNoLCANCi0gICAgICAgICAgdCA9IHRoaXMsDQotICAgICAgICAgIGVycm9yX2Z1bmMgPSBmdW5jdGlvbiAoKSB7IH0sDQotICAgICAgICAgIHN1Y2Nlc3NfZnVuYyA9IGZ1bmN0aW9uICgpIHsgfTsNCi0gICAgICAgIHRoaXMuZGF0YS5zZWFyY2guc3RyID0gc3RyOw0KLQ0KLSAgICAgICAgaWYoIXNraXBfYXN5bmMgJiYgcy5hamF4ICE9PSBmYWxzZSAmJiB0aGlzLmdldF9jb250YWluZXIoKS5maW5kKCIuanN0cmVlLWNsb3NlZDplcSgwKSIpLmxlbmd0aCA+IDApIHsNCi0gICAgICAgICAgdGhpcy5zZWFyY2guc3VwcmVzc19jYWxsYmFjayA9IHRydWU7DQotICAgICAgICAgIGVycm9yX2Z1bmMgPSBmdW5jdGlvbiAoKSB7IH07DQotICAgICAgICAgIHN1Y2Nlc3NfZnVuYyA9IGZ1bmN0aW9uIChkLCB0LCB4KSB7DQotICAgICAgICAgICAgdmFyIHNmID0gdGhpcy5nZXRfc2V0dGluZ3MoKS5zZWFyY2guYWpheC5zdWNjZXNzOyANCi0gICAgICAgICAgICBpZihzZikgeyBkID0gc2YuY2FsbCh0aGlzLGQsdCx4KSB8fCBkOyB9DQotICAgICAgICAgICAgdGhpcy5kYXRhLnNlYXJjaC50b19vcGVuID0gZDsNCi0gICAgICAgICAgICB0aGlzLl9zZWFyY2hfb3BlbigpOw0KLSAgICAgICAgICB9Ow0KLSAgICAgICAgICBzLmFqYXguY29udGV4dCA9IHRoaXM7DQotICAgICAgICAgIHMuYWpheC5lcnJvciA9IGVycm9yX2Z1bmM7DQotICAgICAgICAgIHMuYWpheC5zdWNjZXNzID0gc3VjY2Vzc19mdW5jOw0KLSAgICAgICAgICBpZigkLmlzRnVuY3Rpb24ocy5hamF4LnVybCkpIHsgcy5hamF4LnVybCA9IHMuYWpheC51cmwuY2FsbCh0aGlzLCBzdHIpOyB9DQotICAgICAgICAgIGlmKCQuaXNGdW5jdGlvbihzLmFqYXguZGF0YSkpIHsgcy5hamF4LmRhdGEgPSBzLmFqYXguZGF0YS5jYWxsKHRoaXMsIHN0cik7IH0NCi0gICAgICAgICAgaWYoIXMuYWpheC5kYXRhKSB7IHMuYWpheC5kYXRhID0geyAic2VhcmNoX3N0cmluZyIgOiBzdHIgfTsgfQ0KLSAgICAgICAgICBpZighcy5hamF4LmRhdGFUeXBlIHx8IC9eanNvbi8uZXhlYyhzLmFqYXguZGF0YVR5cGUpKSB7IHMuYWpheC5kYXRhVHlwZSA9ICJqc29uIjsgfQ0KLSAgICAgICAgICAkLmFqYXgocy5hamF4KTsNCi0gICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYodGhpcy5kYXRhLnNlYXJjaC5yZXN1bHQubGVuZ3RoKSB7IHRoaXMuY2xlYXJfc2VhcmNoKCk7IH0NCi0gICAgICAgIHRoaXMuZGF0YS5zZWFyY2gucmVzdWx0ID0gdGhpcy5nZXRfY29udGFpbmVyKCkuZmluZCgiYSIgKyAodGhpcy5kYXRhLmxhbmd1YWdlcyA/ICIuIiArIHRoaXMuZ2V0X2xhbmcoKSA6ICIiICkgKyAiOiIgKyAocy5jYXNlX2luc2Vuc2l0aXZlID8gImpzdHJlZV9jb250YWlucyIgOiAiY29udGFpbnMiKSArICIoIiArIHRoaXMuZGF0YS5zZWFyY2guc3RyICsgIikiKTsNCi0gICAgICAgIHRoaXMuZGF0YS5zZWFyY2gucmVzdWx0LmFkZENsYXNzKCJqc3RyZWUtc2VhcmNoIikucGFyZW50cygiLmpzdHJlZS1jbG9zZWQiKS5lYWNoKGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgdC5vcGVuX25vZGUodGhpcywgZmFsc2UsIHRydWUpOw0KLSAgICAgICAgfSk7DQotICAgICAgICB0aGlzLl9fY2FsbGJhY2soeyBub2RlcyA6IHRoaXMuZGF0YS5zZWFyY2gucmVzdWx0LCBzdHIgOiBzdHIgfSk7DQotICAgICAgfSwNCi0gICAgICBjbGVhcl9zZWFyY2ggOiBmdW5jdGlvbiAoc3RyKSB7DQotICAgICAgICB0aGlzLmRhdGEuc2VhcmNoLnJlc3VsdC5yZW1vdmVDbGFzcygianN0cmVlLXNlYXJjaCIpOw0KLSAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHRoaXMuZGF0YS5zZWFyY2gucmVzdWx0KTsNCi0gICAgICAgIHRoaXMuZGF0YS5zZWFyY2gucmVzdWx0ID0gJCgpOw0KLSAgICAgIH0sDQotICAgICAgX3NlYXJjaF9vcGVuIDogZnVuY3Rpb24gKGlzX2NhbGxiYWNrKSB7DQotICAgICAgICB2YXIgX3RoaXMgPSB0aGlzLA0KLSAgICAgICAgICBkb25lID0gdHJ1ZSwNCi0gICAgICAgICAgY3VycmVudCA9IFtdLA0KLSAgICAgICAgICByZW1haW5pbmcgPSBbXTsNCi0gICAgICAgIGlmKHRoaXMuZGF0YS5zZWFyY2gudG9fb3Blbi5sZW5ndGgpIHsNCi0gICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YS5zZWFyY2gudG9fb3BlbiwgZnVuY3Rpb24gKGksIHZhbCkgew0KLSAgICAgICAgICAgIGlmKHZhbCA9PSAiIyIpIHsgcmV0dXJuIHRydWU7IH0NCi0gICAgICAgICAgICBpZigkKHZhbCkubGVuZ3RoICYmICQodmFsKS5pcygiLmpzdHJlZS1jbG9zZWQiKSkgeyBjdXJyZW50LnB1c2godmFsKTsgfQ0KLSAgICAgICAgICAgIGVsc2UgeyByZW1haW5pbmcucHVzaCh2YWwpOyB9DQotICAgICAgICAgIH0pOw0KLSAgICAgICAgICBpZihjdXJyZW50Lmxlbmd0aCkgew0KLSAgICAgICAgICAgIHRoaXMuZGF0YS5zZWFyY2gudG9fb3BlbiA9IHJlbWFpbmluZzsNCi0gICAgICAgICAgICAkLmVhY2goY3VycmVudCwgZnVuY3Rpb24gKGksIHZhbCkgeyANCi0gICAgICAgICAgICAgIF90aGlzLm9wZW5fbm9kZSh2YWwsIGZ1bmN0aW9uICgpIHsgX3RoaXMuX3NlYXJjaF9vcGVuKHRydWUpOyB9KTsgDQotICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgZG9uZSA9IGZhbHNlOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZihkb25lKSB7IHRoaXMuc2VhcmNoKHRoaXMuZGF0YS5zZWFyY2guc3RyLCB0cnVlKTsgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfSk7DQotfSkoalF1ZXJ5KTsNCi0vLyovDQotDQotLyoNCi0gKiBqc1RyZWUgY29udGV4dG1lbnUgcGx1Z2luIDEuMA0KLSAqLw0KLShmdW5jdGlvbiAoJCkgew0KLSAgJC52YWthdGEuY29udGV4dCA9IHsNCi0gICAgY250ICAgIDogJCgiPGRpdiBpZD0ndmFrYXRhLWNvbnRleHRtZW51Jz4iKSwNCi0gICAgdmlzICAgIDogZmFsc2UsDQotICAgIHRndCAgICA6IGZhbHNlLA0KLSAgICBwYXIgICAgOiBmYWxzZSwNCi0gICAgZnVuYyAgOiBmYWxzZSwNCi0gICAgZGF0YSAgOiBmYWxzZSwNCi0gICAgc2hvdyAgOiBmdW5jdGlvbiAocywgdCwgeCwgeSwgZCwgcCkgew0KLSAgICAgIHZhciBodG1sID0gJC52YWthdGEuY29udGV4dC5wYXJzZShzKSwgaCwgdzsNCi0gICAgICBpZighaHRtbCkgeyByZXR1cm47IH0NCi0gICAgICAkLnZha2F0YS5jb250ZXh0LnZpcyA9IHRydWU7DQotICAgICAgJC52YWthdGEuY29udGV4dC50Z3QgPSB0Ow0KLSAgICAgICQudmFrYXRhLmNvbnRleHQucGFyID0gcCB8fCB0IHx8IG51bGw7DQotICAgICAgJC52YWthdGEuY29udGV4dC5kYXRhID0gZCB8fCBudWxsOw0KLSAgICAgICQudmFrYXRhLmNvbnRleHQuY250DQotICAgICAgICAuaHRtbChodG1sKQ0KLSAgICAgICAgLmNzcyh7ICJ2aXNpYmlsaXR5IiA6ICJoaWRkZW4iLCAiZGlzcGxheSIgOiAiYmxvY2siLCAibGVmdCIgOiAwLCAidG9wIiA6IDAgfSk7DQotICAgICAgaCA9ICQudmFrYXRhLmNvbnRleHQuY250LmhlaWdodCgpOw0KLSAgICAgIHcgPSAkLnZha2F0YS5jb250ZXh0LmNudC53aWR0aCgpOw0KLSAgICAgIGlmKHggKyB3ID4gJChkb2N1bWVudCkud2lkdGgoKSkgeyANCi0gICAgICAgIHggPSAkKGRvY3VtZW50KS53aWR0aCgpIC0gKHcgKyA1KTsgDQotICAgICAgICAkLnZha2F0YS5jb250ZXh0LmNudC5maW5kKCJsaSA+IHVsIikuYWRkQ2xhc3MoInJpZ2h0Iik7IA0KLSAgICAgIH0NCi0gICAgICBpZih5ICsgaCA+ICQoZG9jdW1lbnQpLmhlaWdodCgpKSB7IA0KLSAgICAgICAgeSA9IHkgLSAoaCArIHRbMF0ub2Zmc2V0SGVpZ2h0KTsgDQotICAgICAgICAkLnZha2F0YS5jb250ZXh0LmNudC5maW5kKCJsaSA+IHVsIikuYWRkQ2xhc3MoImJvdHRvbSIpOyANCi0gICAgICB9DQotDQotICAgICAgJC52YWthdGEuY29udGV4dC5jbnQNCi0gICAgICAgIC5jc3MoeyAibGVmdCIgOiB4LCAidG9wIiA6IHkgfSkNCi0gICAgICAgIC5maW5kKCJsaTpoYXModWwpIikNCi0gICAgICAgICAgLmJpbmQoIm1vdXNlZW50ZXIiLCBmdW5jdGlvbiAoZSkgeyANCi0gICAgICAgICAgICB2YXIgdyA9ICQoZG9jdW1lbnQpLndpZHRoKCksDQotICAgICAgICAgICAgICBoID0gJChkb2N1bWVudCkuaGVpZ2h0KCksDQotICAgICAgICAgICAgICB1bCA9ICQodGhpcykuY2hpbGRyZW4oInVsIikuc2hvdygpOyANCi0gICAgICAgICAgICBpZih3ICE9PSAkKGRvY3VtZW50KS53aWR0aCgpKSB7IHVsLnRvZ2dsZUNsYXNzKCJyaWdodCIpOyB9DQotICAgICAgICAgICAgaWYoaCAhPT0gJChkb2N1bWVudCkuaGVpZ2h0KCkpIHsgdWwudG9nZ2xlQ2xhc3MoImJvdHRvbSIpOyB9DQotICAgICAgICAgIH0pDQotICAgICAgICAgIC5iaW5kKCJtb3VzZWxlYXZlIiwgZnVuY3Rpb24gKGUpIHsgDQotICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigidWwiKS5oaWRlKCk7IA0KLSAgICAgICAgICB9KQ0KLSAgICAgICAgICAuZW5kKCkNCi0gICAgICAgIC5jc3MoeyAidmlzaWJpbGl0eSIgOiAidmlzaWJsZSIgfSkNCi0gICAgICAgIC5zaG93KCk7DQotICAgICAgJChkb2N1bWVudCkudHJpZ2dlckhhbmRsZXIoImNvbnRleHRfc2hvdy52YWthdGEiKTsNCi0gICAgfSwNCi0gICAgaGlkZSAgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgJC52YWthdGEuY29udGV4dC52aXMgPSBmYWxzZTsNCi0gICAgICAkLnZha2F0YS5jb250ZXh0LmNudC5hdHRyKCJjbGFzcyIsIiIpLmhpZGUoKTsNCi0gICAgICAkKGRvY3VtZW50KS50cmlnZ2VySGFuZGxlcigiY29udGV4dF9oaWRlLnZha2F0YSIpOw0KLSAgICB9LA0KLSAgICBwYXJzZSAgOiBmdW5jdGlvbiAocywgaXNfY2FsbGJhY2spIHsNCi0gICAgICBpZighcykgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICB2YXIgc3RyID0gIiIsDQotICAgICAgICB0bXAgPSBmYWxzZSwNCi0gICAgICAgIHdhc19zZXAgPSB0cnVlOw0KLSAgICAgIGlmKCFpc19jYWxsYmFjaykgeyAkLnZha2F0YS5jb250ZXh0LmZ1bmMgPSB7fTsgfQ0KLSAgICAgIHN0ciArPSAiPHVsPiI7DQotICAgICAgJC5lYWNoKHMsIGZ1bmN0aW9uIChpLCB2YWwpIHsNCi0gICAgICAgIGlmKCF2YWwpIHsgcmV0dXJuIHRydWU7IH0NCi0gICAgICAgICQudmFrYXRhLmNvbnRleHQuZnVuY1tpXSA9IHZhbC5hY3Rpb247DQotICAgICAgICBpZighd2FzX3NlcCAmJiB2YWwuc2VwYXJhdG9yX2JlZm9yZSkgew0KLSAgICAgICAgICBzdHIgKz0gIjxsaSBjbGFzcz0ndmFrYXRhLXNlcGFyYXRvciB2YWthdGEtc2VwYXJhdG9yLWJlZm9yZSc+PC9saT4iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd2FzX3NlcCA9IGZhbHNlOw0KLSAgICAgICAgc3RyICs9ICI8bGkgY2xhc3M9JyIgKyAodmFsLl9jbGFzcyB8fCAiIikgKyAodmFsLl9kaXNhYmxlZCA/ICIganN0cmVlLWNvbnRleHRtZW51LWRpc2FibGVkICIgOiAiIikgKyAiJz48aW5zICI7DQotICAgICAgICBpZih2YWwuaWNvbiAmJiB2YWwuaWNvbi5pbmRleE9mKCIvIikgPT09IC0xKSB7IHN0ciArPSAiIGNsYXNzPSciICsgdmFsLmljb24gKyAiJyAiOyB9DQotICAgICAgICBpZih2YWwuaWNvbiAmJiB2YWwuaWNvbi5pbmRleE9mKCIvIikgIT09IC0xKSB7IHN0ciArPSAiIHN0eWxlPSdiYWNrZ3JvdW5kOnVybCgiICsgdmFsLmljb24gKyAiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDsnICI7IH0NCi0gICAgICAgIHN0ciArPSAiPiYjMTYwOzwvaW5zPjxhIGhyZWY9JyMnIHJlbD0nIiArIGkgKyAiJz4iOw0KLSAgICAgICAgaWYodmFsLnN1Ym1lbnUpIHsNCi0gICAgICAgICAgc3RyICs9ICI8c3BhbiBzdHlsZT0nZmxvYXQ6cmlnaHQ7Jz4mcmFxdW87PC9zcGFuPiI7DQotICAgICAgICB9DQotICAgICAgICBzdHIgKz0gdmFsLmxhYmVsICsgIjwvYT4iOw0KLSAgICAgICAgaWYodmFsLnN1Ym1lbnUpIHsNCi0gICAgICAgICAgdG1wID0gJC52YWthdGEuY29udGV4dC5wYXJzZSh2YWwuc3VibWVudSwgdHJ1ZSk7DQotICAgICAgICAgIGlmKHRtcCkgeyBzdHIgKz0gdG1wOyB9DQotICAgICAgICB9DQotICAgICAgICBzdHIgKz0gIjwvbGk+IjsNCi0gICAgICAgIGlmKHZhbC5zZXBhcmF0b3JfYWZ0ZXIpIHsNCi0gICAgICAgICAgc3RyICs9ICI8bGkgY2xhc3M9J3Zha2F0YS1zZXBhcmF0b3IgdmFrYXRhLXNlcGFyYXRvci1hZnRlcic+PC9saT4iOw0KLSAgICAgICAgICB3YXNfc2VwID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICB9KTsNCi0gICAgICBzdHIgPSBzdHIucmVwbGFjZSgvPGxpIGNsYXNzXD0ndmFrYXRhLXNlcGFyYXRvciB2YWthdGEtc2VwYXJhdG9yLWFmdGVyJ1w+PFwvbGlcPiQvLCIiKTsNCi0gICAgICBzdHIgKz0gIjwvdWw+IjsNCi0gICAgICByZXR1cm4gc3RyLmxlbmd0aCA+IDEwID8gc3RyIDogZmFsc2U7DQotICAgIH0sDQotICAgIGV4ZWMgIDogZnVuY3Rpb24gKGkpIHsNCi0gICAgICBpZigkLmlzRnVuY3Rpb24oJC52YWthdGEuY29udGV4dC5mdW5jW2ldKSkgew0KLSAgICAgICAgJC52YWthdGEuY29udGV4dC5mdW5jW2ldLmNhbGwoJC52YWthdGEuY29udGV4dC5kYXRhLCAkLnZha2F0YS5jb250ZXh0LnBhcik7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICB9DQotICAgICAgZWxzZSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICB9DQotICB9Ow0KLSAgJChmdW5jdGlvbiAoKSB7DQotICAgIHZhciBjc3Nfc3RyaW5nID0gJycgKyANCi0gICAgICAnI3Zha2F0YS1jb250ZXh0bWVudSB7IGRpc3BsYXk6bm9uZTsgcG9zaXRpb246YWJzb2x1dGU7IG1hcmdpbjowOyBwYWRkaW5nOjA7IG1pbi13aWR0aDoxODBweDsgYmFja2dyb3VuZDojZWJlYmViOyBib3JkZXI6MXB4IHNvbGlkIHNpbHZlcjsgei1pbmRleDoxMDAwMDsgKndpZHRoOjE4MHB4OyB9ICcgKyANCi0gICAgICAnI3Zha2F0YS1jb250ZXh0bWVudSB1bCB7IG1pbi13aWR0aDoxODBweDsgKndpZHRoOjE4MHB4OyB9ICcgKyANCi0gICAgICAnI3Zha2F0YS1jb250ZXh0bWVudSB1bCwgI3Zha2F0YS1jb250ZXh0bWVudSBsaSB7IG1hcmdpbjowOyBwYWRkaW5nOjA7IGxpc3Qtc3R5bGUtdHlwZTpub25lOyBkaXNwbGF5OmJsb2NrOyB9ICcgKyANCi0gICAgICAnI3Zha2F0YS1jb250ZXh0bWVudSBsaSB7IGxpbmUtaGVpZ2h0OjIwcHg7IG1pbi1oZWlnaHQ6MjBweDsgcG9zaXRpb246cmVsYXRpdmU7IHBhZGRpbmc6MHB4OyB9ICcgKyANCi0gICAgICAnI3Zha2F0YS1jb250ZXh0bWVudSBsaSBhIHsgcGFkZGluZzoxcHggNnB4OyBsaW5lLWhlaWdodDoxN3B4OyBkaXNwbGF5OmJsb2NrOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgbWFyZ2luOjFweCAxcHggMCAxcHg7IH0gJyArIA0KLSAgICAgICcjdmFrYXRhLWNvbnRleHRtZW51IGxpIGlucyB7IGZsb2F0OmxlZnQ7IHdpZHRoOjE2cHg7IGhlaWdodDoxNnB4OyB0ZXh0LWRlY29yYXRpb246bm9uZTsgbWFyZ2luLXJpZ2h0OjJweDsgfSAnICsgDQotICAgICAgJyN2YWthdGEtY29udGV4dG1lbnUgbGkgYTpob3ZlciwgI3Zha2F0YS1jb250ZXh0bWVudSBsaS52YWthdGEtaG92ZXIgPiBhIHsgYmFja2dyb3VuZDpncmF5OyBjb2xvcjp3aGl0ZTsgfSAnICsgDQotICAgICAgJyN2YWthdGEtY29udGV4dG1lbnUgbGkgdWwgeyBkaXNwbGF5Om5vbmU7IHBvc2l0aW9uOmFic29sdXRlOyB0b3A6LTJweDsgbGVmdDoxMDAlOyBiYWNrZ3JvdW5kOiNlYmViZWI7IGJvcmRlcjoxcHggc29saWQgZ3JheTsgfSAnICsgDQotICAgICAgJyN2YWthdGEtY29udGV4dG1lbnUgLnJpZ2h0IHsgcmlnaHQ6MTAwJTsgbGVmdDphdXRvOyB9ICcgKyANCi0gICAgICAnI3Zha2F0YS1jb250ZXh0bWVudSAuYm90dG9tIHsgYm90dG9tOi0xcHg7IHRvcDphdXRvOyB9ICcgKyANCi0gICAgICAnI3Zha2F0YS1jb250ZXh0bWVudSBsaS52YWthdGEtc2VwYXJhdG9yIHsgbWluLWhlaWdodDowOyBoZWlnaHQ6MXB4OyBsaW5lLWhlaWdodDoxcHg7IGZvbnQtc2l6ZToxcHg7IG92ZXJmbG93OmhpZGRlbjsgbWFyZ2luOjAgMnB4OyBiYWNrZ3JvdW5kOnNpbHZlcjsgLyogYm9yZGVyLXRvcDoxcHggc29saWQgI2ZlZmVmZTsgKi8gcGFkZGluZzowOyB9ICc7DQotICAgICQudmFrYXRhLmNzcy5hZGRfc2hlZXQoeyBzdHIgOiBjc3Nfc3RyaW5nIH0pOw0KLSAgICAkLnZha2F0YS5jb250ZXh0LmNudA0KLSAgICAgIC5kZWxlZ2F0ZSgiYSIsImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9KQ0KLSAgICAgIC5kZWxlZ2F0ZSgiYSIsIm1vdXNldXAiLCBmdW5jdGlvbiAoZSkgew0KLSAgICAgICAgaWYoISQodGhpcykucGFyZW50KCkuaGFzQ2xhc3MoImpzdHJlZS1jb250ZXh0bWVudS1kaXNhYmxlZCIpICYmICQudmFrYXRhLmNvbnRleHQuZXhlYygkKHRoaXMpLmF0dHIoInJlbCIpKSkgew0KLSAgICAgICAgICAkLnZha2F0YS5jb250ZXh0LmhpZGUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgeyAkKHRoaXMpLmJsdXIoKTsgfQ0KLSAgICAgIH0pDQotICAgICAgLmRlbGVnYXRlKCJhIiwibW91c2VvdmVyIiwgZnVuY3Rpb24gKCkgew0KLSAgICAgICAgJC52YWthdGEuY29udGV4dC5jbnQuZmluZCgiLnZha2F0YS1ob3ZlciIpLnJlbW92ZUNsYXNzKCJ2YWthdGEtaG92ZXIiKTsNCi0gICAgICB9KQ0KLSAgICAgIC5hcHBlbmRUbygiYm9keSIpOw0KLSAgICAkKGRvY3VtZW50KS5iaW5kKCJtb3VzZWRvd24iLCBmdW5jdGlvbiAoZSkgeyBpZigkLnZha2F0YS5jb250ZXh0LnZpcyAmJiAhJC5jb250YWlucygkLnZha2F0YS5jb250ZXh0LmNudFswXSwgZS50YXJnZXQpKSB7ICQudmFrYXRhLmNvbnRleHQuaGlkZSgpOyB9IH0pOw0KLSAgICBpZih0eXBlb2YgJC5ob3RrZXlzICE9PSAidW5kZWZpbmVkIikgew0KLSAgICAgICQoZG9jdW1lbnQpDQotICAgICAgICAuYmluZCgia2V5ZG93biIsICJ1cCIsIGZ1bmN0aW9uIChlKSB7IA0KLSAgICAgICAgICBpZigkLnZha2F0YS5jb250ZXh0LnZpcykgeyANCi0gICAgICAgICAgICB2YXIgbyA9ICQudmFrYXRhLmNvbnRleHQuY250LmZpbmQoInVsOnZpc2libGUiKS5sYXN0KCkuY2hpbGRyZW4oIi52YWthdGEtaG92ZXIiKS5yZW1vdmVDbGFzcygidmFrYXRhLWhvdmVyIikucHJldkFsbCgibGk6bm90KC52YWthdGEtc2VwYXJhdG9yKSIpLmZpcnN0KCk7DQotICAgICAgICAgICAgaWYoIW8ubGVuZ3RoKSB7IG8gPSAkLnZha2F0YS5jb250ZXh0LmNudC5maW5kKCJ1bDp2aXNpYmxlIikubGFzdCgpLmNoaWxkcmVuKCJsaTpub3QoLnZha2F0YS1zZXBhcmF0b3IpIikubGFzdCgpOyB9DQotICAgICAgICAgICAgby5hZGRDbGFzcygidmFrYXRhLWhvdmVyIik7DQotICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsgDQotICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KLSAgICAgICAgICB9IA0KLSAgICAgICAgfSkNCi0gICAgICAgIC5iaW5kKCJrZXlkb3duIiwgImRvd24iLCBmdW5jdGlvbiAoZSkgeyANCi0gICAgICAgICAgaWYoJC52YWthdGEuY29udGV4dC52aXMpIHsgDQotICAgICAgICAgICAgdmFyIG8gPSAkLnZha2F0YS5jb250ZXh0LmNudC5maW5kKCJ1bDp2aXNpYmxlIikubGFzdCgpLmNoaWxkcmVuKCIudmFrYXRhLWhvdmVyIikucmVtb3ZlQ2xhc3MoInZha2F0YS1ob3ZlciIpLm5leHRBbGwoImxpOm5vdCgudmFrYXRhLXNlcGFyYXRvcikiKS5maXJzdCgpOw0KLSAgICAgICAgICAgIGlmKCFvLmxlbmd0aCkgeyBvID0gJC52YWthdGEuY29udGV4dC5jbnQuZmluZCgidWw6dmlzaWJsZSIpLmxhc3QoKS5jaGlsZHJlbigibGk6bm90KC52YWthdGEtc2VwYXJhdG9yKSIpLmZpcnN0KCk7IH0NCi0gICAgICAgICAgICBvLmFkZENsYXNzKCJ2YWthdGEtaG92ZXIiKTsNCi0gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOyANCi0gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICAgIH0gDQotICAgICAgICB9KQ0KLSAgICAgICAgLmJpbmQoImtleWRvd24iLCAicmlnaHQiLCBmdW5jdGlvbiAoZSkgeyANCi0gICAgICAgICAgaWYoJC52YWthdGEuY29udGV4dC52aXMpIHsgDQotICAgICAgICAgICAgJC52YWthdGEuY29udGV4dC5jbnQuZmluZCgiLnZha2F0YS1ob3ZlciIpLmNoaWxkcmVuKCJ1bCIpLnNob3coKS5jaGlsZHJlbigibGk6bm90KC52YWthdGEtc2VwYXJhdG9yKSIpLnJlbW92ZUNsYXNzKCJ2YWthdGEtaG92ZXIiKS5maXJzdCgpLmFkZENsYXNzKCJ2YWthdGEtaG92ZXIiKTsNCi0gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOyANCi0gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICAgIH0gDQotICAgICAgICB9KQ0KLSAgICAgICAgLmJpbmQoImtleWRvd24iLCAibGVmdCIsIGZ1bmN0aW9uIChlKSB7IA0KLSAgICAgICAgICBpZigkLnZha2F0YS5jb250ZXh0LnZpcykgeyANCi0gICAgICAgICAgICAkLnZha2F0YS5jb250ZXh0LmNudC5maW5kKCIudmFrYXRhLWhvdmVyIikuY2hpbGRyZW4oInVsIikuaGlkZSgpLmNoaWxkcmVuKCIudmFrYXRhLXNlcGFyYXRvciIpLnJlbW92ZUNsYXNzKCJ2YWthdGEtaG92ZXIiKTsNCi0gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOyANCi0gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICAgIH0gDQotICAgICAgICB9KQ0KLSAgICAgICAgLmJpbmQoImtleWRvd24iLCAiZXNjIiwgZnVuY3Rpb24gKGUpIHsgDQotICAgICAgICAgICQudmFrYXRhLmNvbnRleHQuaGlkZSgpOyANCi0gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KLSAgICAgICAgfSkNCi0gICAgICAgIC5iaW5kKCJrZXlkb3duIiwgInNwYWNlIiwgZnVuY3Rpb24gKGUpIHsgDQotICAgICAgICAgICQudmFrYXRhLmNvbnRleHQuY250LmZpbmQoIi52YWthdGEtaG92ZXIiKS5sYXN0KCkuY2hpbGRyZW4oImEiKS5jbGljaygpOw0KLSAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQotICAgICAgICB9KTsNCi0gICAgfQ0KLSAgfSk7DQotDQotICAkLmpzdHJlZS5wbHVnaW4oImNvbnRleHRtZW51Iiwgew0KLSAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkNCi0gICAgICAgIC5kZWxlZ2F0ZSgiYSIsICJjb250ZXh0bWVudS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7DQotICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KLSAgICAgICAgICAgIHRoaXMuc2hvd19jb250ZXh0bWVudShlLmN1cnJlbnRUYXJnZXQsIGUucGFnZVgsIGUucGFnZVkpOw0KLSAgICAgICAgICB9LCB0aGlzKSkNCi0gICAgICAgIC5iaW5kKCJkZXN0cm95LmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5jb250ZXh0bWVudSkgew0KLSAgICAgICAgICAgICAgJC52YWthdGEuY29udGV4dC5oaWRlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9LCB0aGlzKSk7DQotICAgICAgJChkb2N1bWVudCkuYmluZCgiY29udGV4dF9oaWRlLnZha2F0YSIsICQucHJveHkoZnVuY3Rpb24gKCkgeyB0aGlzLmRhdGEuY29udGV4dG1lbnUgPSBmYWxzZTsgfSwgdGhpcykpOw0KLSAgICB9LA0KLSAgICBkZWZhdWx0cyA6IHsgDQotICAgICAgc2VsZWN0X25vZGUgOiBmYWxzZSwgLy8gcmVxdWlyZXMgVUkgcGx1Z2luDQotICAgICAgc2hvd19hdF9ub2RlIDogdHJ1ZSwNCi0gICAgICBpdGVtcyA6IHsgLy8gQ291bGQgYmUgYSBmdW5jdGlvbiB0aGF0IHNob3VsZCByZXR1cm4gYW4gb2JqZWN0IGxpa2UgdGhpcyBvbmUNCi0gICAgICAgICJjcmVhdGUiIDogew0KLSAgICAgICAgICAic2VwYXJhdG9yX2JlZm9yZSIgIDogZmFsc2UsDQotICAgICAgICAgICJzZXBhcmF0b3JfYWZ0ZXIiICA6IHRydWUsDQotICAgICAgICAgICJsYWJlbCIgICAgICAgIDogIkNyZWF0ZSIsDQotICAgICAgICAgICJhY3Rpb24iICAgICAgOiBmdW5jdGlvbiAob2JqKSB7IHRoaXMuY3JlYXRlKG9iaik7IH0NCi0gICAgICAgIH0sDQotICAgICAgICAicmVuYW1lIiA6IHsNCi0gICAgICAgICAgInNlcGFyYXRvcl9iZWZvcmUiICA6IGZhbHNlLA0KLSAgICAgICAgICAic2VwYXJhdG9yX2FmdGVyIiAgOiBmYWxzZSwNCi0gICAgICAgICAgImxhYmVsIiAgICAgICAgOiAiUmVuYW1lIiwNCi0gICAgICAgICAgImFjdGlvbiIgICAgICA6IGZ1bmN0aW9uIChvYmopIHsgdGhpcy5yZW5hbWUob2JqKTsgfQ0KLSAgICAgICAgfSwNCi0gICAgICAgICJyZW1vdmUiIDogew0KLSAgICAgICAgICAic2VwYXJhdG9yX2JlZm9yZSIgIDogZmFsc2UsDQotICAgICAgICAgICJpY29uIiAgICAgICAgOiBmYWxzZSwNCi0gICAgICAgICAgInNlcGFyYXRvcl9hZnRlciIgIDogZmFsc2UsDQotICAgICAgICAgICJsYWJlbCIgICAgICAgIDogIkRlbGV0ZSIsDQotICAgICAgICAgICJhY3Rpb24iICAgICAgOiBmdW5jdGlvbiAob2JqKSB7IHRoaXMucmVtb3ZlKG9iaik7IH0NCi0gICAgICAgIH0sDQotICAgICAgICAiY2NwIiA6IHsNCi0gICAgICAgICAgInNlcGFyYXRvcl9iZWZvcmUiICA6IHRydWUsDQotICAgICAgICAgICJpY29uIiAgICAgICAgOiBmYWxzZSwNCi0gICAgICAgICAgInNlcGFyYXRvcl9hZnRlciIgIDogZmFsc2UsDQotICAgICAgICAgICJsYWJlbCIgICAgICAgIDogIkVkaXQiLA0KLSAgICAgICAgICAiYWN0aW9uIiAgICAgIDogZmFsc2UsDQotICAgICAgICAgICJzdWJtZW51IiA6IHsgDQotICAgICAgICAgICAgImN1dCIgOiB7DQotICAgICAgICAgICAgICAic2VwYXJhdG9yX2JlZm9yZSIgIDogZmFsc2UsDQotICAgICAgICAgICAgICAic2VwYXJhdG9yX2FmdGVyIiAgOiBmYWxzZSwNCi0gICAgICAgICAgICAgICJsYWJlbCIgICAgICAgIDogIkN1dCIsDQotICAgICAgICAgICAgICAiYWN0aW9uIiAgICAgIDogZnVuY3Rpb24gKG9iaikgeyB0aGlzLmN1dChvYmopOyB9DQotICAgICAgICAgICAgfSwNCi0gICAgICAgICAgICAiY29weSIgOiB7DQotICAgICAgICAgICAgICAic2VwYXJhdG9yX2JlZm9yZSIgIDogZmFsc2UsDQotICAgICAgICAgICAgICAiaWNvbiIgICAgICAgIDogZmFsc2UsDQotICAgICAgICAgICAgICAic2VwYXJhdG9yX2FmdGVyIiAgOiBmYWxzZSwNCi0gICAgICAgICAgICAgICJsYWJlbCIgICAgICAgIDogIkNvcHkiLA0KLSAgICAgICAgICAgICAgImFjdGlvbiIgICAgICA6IGZ1bmN0aW9uIChvYmopIHsgdGhpcy5jb3B5KG9iaik7IH0NCi0gICAgICAgICAgICB9LA0KLSAgICAgICAgICAgICJwYXN0ZSIgOiB7DQotICAgICAgICAgICAgICAic2VwYXJhdG9yX2JlZm9yZSIgIDogZmFsc2UsDQotICAgICAgICAgICAgICAiaWNvbiIgICAgICAgIDogZmFsc2UsDQotICAgICAgICAgICAgICAic2VwYXJhdG9yX2FmdGVyIiAgOiBmYWxzZSwNCi0gICAgICAgICAgICAgICJsYWJlbCIgICAgICAgIDogIlBhc3RlIiwNCi0gICAgICAgICAgICAgICJhY3Rpb24iICAgICAgOiBmdW5jdGlvbiAob2JqKSB7IHRoaXMucGFzdGUob2JqKTsgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfSwNCi0gICAgX2ZuIDogew0KLSAgICAgIHNob3dfY29udGV4dG1lbnUgOiBmdW5jdGlvbiAob2JqLCB4LCB5KSB7DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgdmFyIHMgPSB0aGlzLmdldF9zZXR0aW5ncygpLmNvbnRleHRtZW51LA0KLSAgICAgICAgICBhID0gb2JqLmNoaWxkcmVuKCJhOnZpc2libGU6ZXEoMCkiKSwNCi0gICAgICAgICAgbyA9IGZhbHNlOw0KLSAgICAgICAgaWYocy5zZWxlY3Rfbm9kZSAmJiB0aGlzLmRhdGEudWkgJiYgIXRoaXMuaXNfc2VsZWN0ZWQob2JqKSkgew0KLSAgICAgICAgICB0aGlzLmRlc2VsZWN0X2FsbCgpOw0KLSAgICAgICAgICB0aGlzLnNlbGVjdF9ub2RlKG9iaiwgdHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICBpZihzLnNob3dfYXRfbm9kZSB8fCB0eXBlb2YgeCA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIHkgPT09ICJ1bmRlZmluZWQiKSB7DQotICAgICAgICAgIG8gPSBhLm9mZnNldCgpOw0KLSAgICAgICAgICB4ID0gby5sZWZ0Ow0KLSAgICAgICAgICB5ID0gby50b3AgKyB0aGlzLmRhdGEuY29yZS5saV9oZWlnaHQ7DQotICAgICAgICB9DQotICAgICAgICBpZigkLmlzRnVuY3Rpb24ocy5pdGVtcykpIHsgcy5pdGVtcyA9IHMuaXRlbXMuY2FsbCh0aGlzLCBvYmopOyB9DQotICAgICAgICB0aGlzLmRhdGEuY29udGV4dG1lbnUgPSB0cnVlOw0KLSAgICAgICAgJC52YWthdGEuY29udGV4dC5zaG93KHMuaXRlbXMsIGEsIHgsIHksIHRoaXMsIG9iaik7DQotICAgICAgICBpZih0aGlzLmRhdGEudGhlbWVzKSB7ICQudmFrYXRhLmNvbnRleHQuY250LmF0dHIoImNsYXNzIiwgImpzdHJlZS0iICsgdGhpcy5kYXRhLnRoZW1lcy50aGVtZSArICItY29udGV4dCIpOyB9DQotICAgICAgfQ0KLSAgICB9DQotICB9KTsNCi19KShqUXVlcnkpOw0KLS8vKi8NCi0NCi0vKiANCi0gKiBqc1RyZWUgdHlwZXMgcGx1Z2luIDEuMA0KLSAqIEFkZHMgc3VwcG9ydCB0eXBlcyBvZiBub2Rlcw0KLSAqIFlvdSBjYW4gc2V0IGFuIGF0dHJpYnV0ZSBvbiBlYWNoIGxpIG5vZGUsIHRoYXQgcmVwcmVzZW50cyBpdHMgdHlwZS4NCi0gKiBBY2NvcmRpbmcgdG8gdGhlIHR5cGUgc2V0dGluZyB0aGUgbm9kZSBtYXkgZ2V0IGN1c3RvbSBpY29uL3ZhbGlkYXRpb24gcnVsZXMNCi0gKi8NCi0oZnVuY3Rpb24gKCQpIHsNCi0gICQuanN0cmVlLnBsdWdpbigidHlwZXMiLCB7DQotICAgIF9faW5pdCA6IGZ1bmN0aW9uICgpIHsNCi0gICAgICB2YXIgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLnR5cGVzOw0KLSAgICAgIHRoaXMuZGF0YS50eXBlcy5hdHRhY2hfdG8gPSBbXTsNCi0gICAgICB0aGlzLmdldF9jb250YWluZXIoKQ0KLSAgICAgICAgLmJpbmQoImluaXQuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoKSB7IA0KLSAgICAgICAgICAgIHZhciB0eXBlcyA9IHMudHlwZXMsIA0KLSAgICAgICAgICAgICAgYXR0ciAgPSBzLnR5cGVfYXR0ciwgDQotICAgICAgICAgICAgICBpY29uc19jc3MgPSAiIiwgDQotICAgICAgICAgICAgICBfdGhpcyA9IHRoaXM7DQotDQotICAgICAgICAgICAgJC5lYWNoKHR5cGVzLCBmdW5jdGlvbiAoaSwgdHApIHsNCi0gICAgICAgICAgICAgICQuZWFjaCh0cCwgZnVuY3Rpb24gKGssIHYpIHsgDQotICAgICAgICAgICAgICAgIGlmKCEvXihtYXhfZGVwdGh8bWF4X2NoaWxkcmVufGljb258dmFsaWRfY2hpbGRyZW4pJC8udGVzdChrKSkgeyBfdGhpcy5kYXRhLnR5cGVzLmF0dGFjaF90by5wdXNoKGspOyB9DQotICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICAgIGlmKCF0cC5pY29uKSB7IHJldHVybiB0cnVlOyB9DQotICAgICAgICAgICAgICBpZiggdHAuaWNvbi5pbWFnZSB8fCB0cC5pY29uLnBvc2l0aW9uKSB7DQotICAgICAgICAgICAgICAgIGlmKGkgPT0gImRlZmF1bHQiKSAgeyBpY29uc19jc3MgKz0gJy5qc3RyZWUtJyArIF90aGlzLmdldF9pbmRleCgpICsgJyBhID4gLmpzdHJlZS1pY29uIHsgJzsgfQ0KLSAgICAgICAgICAgICAgICBlbHNlICAgICAgICB7IGljb25zX2NzcyArPSAnLmpzdHJlZS0nICsgX3RoaXMuZ2V0X2luZGV4KCkgKyAnIGxpWycgKyBhdHRyICsgJz0nICsgaSArICddID4gYSA+IC5qc3RyZWUtaWNvbiB7ICc7IH0NCi0gICAgICAgICAgICAgICAgaWYodHAuaWNvbi5pbWFnZSkgIHsgaWNvbnNfY3NzICs9ICcgYmFja2dyb3VuZC1pbWFnZTp1cmwoJyArIHRwLmljb24uaW1hZ2UgKyAnKTsgJzsgfQ0KLSAgICAgICAgICAgICAgICBpZih0cC5pY29uLnBvc2l0aW9uKXsgaWNvbnNfY3NzICs9ICcgYmFja2dyb3VuZC1wb3NpdGlvbjonICsgdHAuaWNvbi5wb3NpdGlvbiArICc7ICc7IH0NCi0gICAgICAgICAgICAgICAgZWxzZSAgICAgICAgeyBpY29uc19jc3MgKz0gJyBiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMDsgJzsgfQ0KLSAgICAgICAgICAgICAgICBpY29uc19jc3MgKz0gJ30gJzsNCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICBpZihpY29uc19jc3MgIT0gIiIpIHsgJC52YWthdGEuY3NzLmFkZF9zaGVldCh7ICdzdHInIDogaWNvbnNfY3NzIH0pOyB9DQotICAgICAgICAgIH0sIHRoaXMpKQ0KLSAgICAgICAgLmJpbmQoImJlZm9yZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7IA0KLSAgICAgICAgICAgIGlmKCQuaW5BcnJheShkYXRhLmZ1bmMsIHRoaXMuZGF0YS50eXBlcy5hdHRhY2hfdG8pICE9PSAtMSkgew0KLSAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS50eXBlcy50eXBlcywNCi0gICAgICAgICAgICAgICAgdCA9IHRoaXMuX2dldF90eXBlKGRhdGEuYXJnc1swXSk7DQotICAgICAgICAgICAgICBpZigNCi0gICAgICAgICAgICAgICAgKCANCi0gICAgICAgICAgICAgICAgICAoc1t0XSAmJiB0eXBlb2Ygc1t0XVtkYXRhLmZ1bmNdICE9PSAidW5kZWZpbmVkIikgfHwgDQotICAgICAgICAgICAgICAgICAgKHNbImRlZmF1bHQiXSAmJiB0eXBlb2Ygc1siZGVmYXVsdCJdW2RhdGEuZnVuY10gIT09ICJ1bmRlZmluZWQiKQ0KLSAgICAgICAgICAgICAgICApICYmICF0aGlzLl9jaGVjayhkYXRhLmZ1bmMsIGRhdGEuYXJnc1swXSkNCi0gICAgICAgICAgICAgICkgew0KLSAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICB9LCB0aGlzKSk7DQotICAgIH0sDQotICAgIGRlZmF1bHRzIDogew0KLSAgICAgIC8vIGRlZmluZXMgbWF4aW11bSBudW1iZXIgb2Ygcm9vdCBub2RlcyAoLTEgbWVhbnMgdW5saW1pdGVkLCAtMiBtZWFucyBkaXNhYmxlIG1heF9jaGlsZHJlbiBjaGVja2luZykNCi0gICAgICBtYXhfY2hpbGRyZW4gICAgOiAtMSwNCi0gICAgICAvLyBkZWZpbmVzIHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZSB0cmVlICgtMSBtZWFucyB1bmxpbWl0ZWQsIC0yIG1lYW5zIGRpc2FibGUgbWF4X2RlcHRoIGNoZWNraW5nKQ0KLSAgICAgIG1heF9kZXB0aCAgICAgIDogLTEsDQotICAgICAgLy8gZGVmaW5lcyB2YWxpZCBub2RlIHR5cGVzIGZvciB0aGUgcm9vdCBub2Rlcw0KLSAgICAgIHZhbGlkX2NoaWxkcmVuICAgIDogImFsbCIsDQotDQotICAgICAgLy8gd2hlcmUgaXMgdGhlIHR5cGUgc3RvcmVzICh0aGUgcmVsIGF0dHJpYnV0ZSBvZiB0aGUgTEkgZWxlbWVudCkNCi0gICAgICB0eXBlX2F0dHIgOiAicmVsIiwNCi0gICAgICAvLyBhIGxpc3Qgb2YgdHlwZXMNCi0gICAgICB0eXBlcyA6IHsNCi0gICAgICAgIC8vIHRoZSBkZWZhdWx0IHR5cGUNCi0gICAgICAgICJkZWZhdWx0IiA6IHsNCi0gICAgICAgICAgIm1heF9jaGlsZHJlbiIgIDogLTEsDQotICAgICAgICAgICJtYXhfZGVwdGgiICAgIDogLTEsDQotICAgICAgICAgICJ2YWxpZF9jaGlsZHJlbiI6ICJhbGwiDQotDQotICAgICAgICAgIC8vIEJvdW5kIGZ1bmN0aW9ucyAtIHlvdSBjYW4gYmluZCBhbnkgb3RoZXIgZnVuY3Rpb24gaGVyZSAodXNpbmcgYm9vbGVhbiBvciBmdW5jdGlvbikNCi0gICAgICAgICAgLy8ic2VsZWN0X25vZGUiICA6IHRydWUsDQotICAgICAgICAgIC8vIm9wZW5fbm9kZSIgIDogdHJ1ZSwNCi0gICAgICAgICAgLy8iY2xvc2Vfbm9kZSIgIDogdHJ1ZSwNCi0gICAgICAgICAgLy8iY3JlYXRlX25vZGUiICA6IHRydWUsDQotICAgICAgICAgIC8vImRlbGV0ZV9ub2RlIiAgOiB0cnVlDQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9LA0KLSAgICBfZm4gOiB7DQotICAgICAgX2dldF90eXBlIDogZnVuY3Rpb24gKG9iaikgew0KLSAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsNCi0gICAgICAgIHJldHVybiAoIW9iaiB8fCAhb2JqLmxlbmd0aCkgPyBmYWxzZSA6IG9iai5hdHRyKHRoaXMuX2dldF9zZXR0aW5ncygpLnR5cGVzLnR5cGVfYXR0cikgfHwgImRlZmF1bHQiOw0KLSAgICAgIH0sDQotICAgICAgc2V0X3R5cGUgOiBmdW5jdGlvbiAoc3RyLCBvYmopIHsNCi0gICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7DQotICAgICAgICByZXR1cm4gKCFvYmoubGVuZ3RoIHx8ICFzdHIpID8gZmFsc2UgOiBvYmouYXR0cih0aGlzLl9nZXRfc2V0dGluZ3MoKS50eXBlcy50eXBlX2F0dHIsIHN0cik7DQotICAgICAgfSwNCi0gICAgICBfY2hlY2sgOiBmdW5jdGlvbiAocnVsZSwgb2JqLCBvcHRzKSB7DQotICAgICAgICB2YXIgdiA9IGZhbHNlLCB0ID0gdGhpcy5fZ2V0X3R5cGUob2JqKSwgZCA9IDAsIF90aGlzID0gdGhpcywgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLnR5cGVzOw0KLSAgICAgICAgaWYob2JqID09PSAtMSkgeyANCi0gICAgICAgICAgaWYoISFzW3J1bGVdKSB7IHYgPSBzW3J1bGVdOyB9DQotICAgICAgICAgIGVsc2UgeyByZXR1cm47IH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICBpZih0ID09PSBmYWxzZSkgeyByZXR1cm47IH0NCi0gICAgICAgICAgaWYoISFzLnR5cGVzW3RdICYmICEhcy50eXBlc1t0XVtydWxlXSkgeyB2ID0gcy50eXBlc1t0XVtydWxlXTsgfQ0KLSAgICAgICAgICBlbHNlIGlmKCEhcy50eXBlc1siZGVmYXVsdCJdICYmICEhcy50eXBlc1siZGVmYXVsdCJdW3J1bGVdKSB7IHYgPSBzLnR5cGVzWyJkZWZhdWx0Il1bcnVsZV07IH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmKCQuaXNGdW5jdGlvbih2KSkgeyB2ID0gdi5jYWxsKHRoaXMsIG9iaik7IH0NCi0gICAgICAgIGlmKHJ1bGUgPT09ICJtYXhfZGVwdGgiICYmIG9iaiAhPT0gLTEgJiYgb3B0cyAhPT0gZmFsc2UgJiYgcy5tYXhfZGVwdGggIT09IC0yICYmIHYgIT09IDApIHsNCi0gICAgICAgICAgLy8gYWxzbyBpbmNsdWRlIHRoZSBub2RlIGl0c2VsZiAtIG90aGVyd2lzZSBpZiByb290IG5vZGUgaXQgaXMgbm90IGNoZWNrZWQNCi0gICAgICAgICAgdGhpcy5fZ2V0X25vZGUob2JqKS5jaGlsZHJlbigiYTplcSgwKSIpLnBhcmVudHNVbnRpbCgiLmpzdHJlZSIsImxpIikuZWFjaChmdW5jdGlvbiAoaSkgew0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIGN1cnJlbnQgZGVwdGggYWxyZWFkeSBleGNlZWRzIGdsb2JhbCB0cmVlIGRlcHRoDQotICAgICAgICAgICAgaWYocy5tYXhfZGVwdGggIT09IC0xICYmIHMubWF4X2RlcHRoIC0gKGkgKyAxKSA8PSAwKSB7IHYgPSAwOyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgICAgICBkID0gKGkgPT09IDApID8gdiA6IF90aGlzLl9jaGVjayhydWxlLCB0aGlzLCBmYWxzZSk7DQotICAgICAgICAgICAgLy8gY2hlY2sgaWYgY3VycmVudCBub2RlIG1heCBkZXB0aCBpcyBhbHJlYWR5IG1hdGNoZWQgb3IgZXhjZWVkZWQNCi0gICAgICAgICAgICBpZihkICE9PSAtMSAmJiBkIC0gKGkgKyAxKSA8PSAwKSB7IHYgPSAwOyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UgLSBzZXQgdGhlIG1heCBkZXB0aCB0byB0aGUgY3VycmVudCB2YWx1ZSBtaW51cyBjdXJyZW50IGRlcHRoDQotICAgICAgICAgICAgaWYoZCA+PSAwICYmIChkIC0gKGkgKyAxKSA8IHYgfHwgdiA8IDApICkgeyB2ID0gZCAtIChpICsgMSk7IH0NCi0gICAgICAgICAgICAvLyBpZiB0aGUgZ2xvYmFsIHRyZWUgZGVwdGggZXhpc3RzIGFuZCBpdCBtaW51cyB0aGUgbm9kZXMgY2FsY3VsYXRlZCBzbyBmYXIgaXMgbGVzcyB0aGFuIGB2YCBvciBgdmAgaXMgdW5saW1pdGVkDQotICAgICAgICAgICAgaWYocy5tYXhfZGVwdGggPj0gMCAmJiAocy5tYXhfZGVwdGggLSAoaSArIDEpIDwgdiB8fCB2IDwgMCkgKSB7IHYgPSBzLm1heF9kZXB0aCAtIChpICsgMSk7IH0NCi0gICAgICAgICAgfSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdjsNCi0gICAgICB9LA0KLSAgICAgIGNoZWNrX21vdmUgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgICBpZighdGhpcy5fX2NhbGxfb2xkKCkpIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICB2YXIgbSAgPSB0aGlzLl9nZXRfbW92ZSgpLA0KLSAgICAgICAgICBzICA9IG0ucnQuX2dldF9zZXR0aW5ncygpLnR5cGVzLA0KLSAgICAgICAgICBtYyA9IG0ucnQuX2NoZWNrKCJtYXhfY2hpbGRyZW4iLCBtLmNyKSwNCi0gICAgICAgICAgbWQgPSBtLnJ0Ll9jaGVjaygibWF4X2RlcHRoIiwgbS5jciksDQotICAgICAgICAgIHZjID0gbS5ydC5fY2hlY2soInZhbGlkX2NoaWxkcmVuIiwgbS5jciksDQotICAgICAgICAgIGNoID0gMCwgZCA9IDEsIHQ7DQotDQotICAgICAgICBpZih2YyA9PT0gIm5vbmUiKSB7IHJldHVybiBmYWxzZTsgfSANCi0gICAgICAgIGlmKCQuaXNBcnJheSh2YykgJiYgbS5vdCAmJiBtLm90Ll9nZXRfdHlwZSkgew0KLSAgICAgICAgICBtLm8uZWFjaChmdW5jdGlvbiAoKSB7DQotICAgICAgICAgICAgaWYoJC5pbkFycmF5KG0ub3QuX2dldF90eXBlKHRoaXMpLCB2YykgPT09IC0xKSB7IGQgPSBmYWxzZTsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICAgIH0pOw0KLSAgICAgICAgICBpZihkID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmKHMubWF4X2NoaWxkcmVuICE9PSAtMiAmJiBtYyAhPT0gLTEpIHsNCi0gICAgICAgICAgY2ggPSBtLmNyID09PSAtMSA/IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCI+IHVsID4gbGkiKS5ub3QobS5vKS5sZW5ndGggOiBtLmNyLmNoaWxkcmVuKCI+IHVsID4gbGkiKS5ub3QobS5vKS5sZW5ndGg7DQotICAgICAgICAgIGlmKGNoICsgbS5vLmxlbmd0aCA+IG1jKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYocy5tYXhfZGVwdGggIT09IC0yICYmIG1kICE9PSAtMSkgew0KLSAgICAgICAgICBkID0gMDsNCi0gICAgICAgICAgaWYobWQgPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9DQotICAgICAgICAgIGlmKHR5cGVvZiBtLm8uZCA9PT0gInVuZGVmaW5lZCIpIHsNCi0gICAgICAgICAgICAvLyBUT0RPOiBkZWFsIHdpdGggcHJvZ3Jlc3NpdmUgcmVuZGVyaW5nIGFuZCBhc3luYyB3aGVuIGNoZWNraW5nIG1heF9kZXB0aCAoaG93IHRvIGtub3cgdGhlIGRlcHRoIG9mIHRoZSBtb3ZlZCBub2RlKQ0KLSAgICAgICAgICAgIHQgPSBtLm87DQotICAgICAgICAgICAgd2hpbGUodC5sZW5ndGggPiAwKSB7DQotICAgICAgICAgICAgICB0ID0gdC5maW5kKCI+IHVsID4gbGkiKTsNCi0gICAgICAgICAgICAgIGQgKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG0uby5kID0gZDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZihtZCAtIG0uby5kIDwgMCkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgIH0sDQotICAgICAgY3JlYXRlX25vZGUgOiBmdW5jdGlvbiAob2JqLCBwb3NpdGlvbiwganMsIGNhbGxiYWNrLCBpc19sb2FkZWQsIHNraXBfY2hlY2spIHsNCi0gICAgICAgIGlmKCFza2lwX2NoZWNrICYmIChpc19sb2FkZWQgfHwgdGhpcy5faXNfbG9hZGVkKG9iaikpKSB7DQotICAgICAgICAgIHZhciBwICA9IChwb3NpdGlvbiAmJiBwb3NpdGlvbi5tYXRjaCgvXmJlZm9yZXxhZnRlciQvaSkgJiYgb2JqICE9PSAtMSkgPyB0aGlzLl9nZXRfcGFyZW50KG9iaikgOiB0aGlzLl9nZXRfbm9kZShvYmopLA0KLSAgICAgICAgICAgIHMgID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkudHlwZXMsDQotICAgICAgICAgICAgbWMgPSB0aGlzLl9jaGVjaygibWF4X2NoaWxkcmVuIiwgcCksDQotICAgICAgICAgICAgbWQgPSB0aGlzLl9jaGVjaygibWF4X2RlcHRoIiwgcCksDQotICAgICAgICAgICAgdmMgPSB0aGlzLl9jaGVjaygidmFsaWRfY2hpbGRyZW4iLCBwKSwNCi0gICAgICAgICAgICBjaDsNCi0gICAgICAgICAgaWYoIWpzKSB7IGpzID0ge307IH0NCi0gICAgICAgICAgaWYodmMgPT09ICJub25lIikgeyByZXR1cm4gZmFsc2U7IH0gDQotICAgICAgICAgIGlmKCQuaXNBcnJheSh2YykpIHsNCi0gICAgICAgICAgICBpZighanMuYXR0ciB8fCAhanMuYXR0cltzLnR5cGVfYXR0cl0pIHsgDQotICAgICAgICAgICAgICBpZighanMuYXR0cikgeyBqcy5hdHRyID0ge307IH0NCi0gICAgICAgICAgICAgIGpzLmF0dHJbcy50eXBlX2F0dHJdID0gdmNbMF07IA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgIGlmKCQuaW5BcnJheShqcy5hdHRyW3MudHlwZV9hdHRyXSwgdmMpID09PSAtMSkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYocy5tYXhfY2hpbGRyZW4gIT09IC0yICYmIG1jICE9PSAtMSkgew0KLSAgICAgICAgICAgIGNoID0gcCA9PT0gLTEgPyB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigiPiB1bCA+IGxpIikubGVuZ3RoIDogcC5jaGlsZHJlbigiPiB1bCA+IGxpIikubGVuZ3RoOw0KLSAgICAgICAgICAgIGlmKGNoICsgMSA+IG1jKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmKHMubWF4X2RlcHRoICE9PSAtMiAmJiBtZCAhPT0gLTEgJiYgKG1kIC0gMSkgPCAwKSB7IHJldHVybiBmYWxzZTsgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuX19jYWxsX29sZCh0cnVlLCBvYmosIHBvc2l0aW9uLCBqcywgY2FsbGJhY2ssIGlzX2xvYWRlZCwgc2tpcF9jaGVjayk7DQotICAgICAgfQ0KLSAgICB9DQotICB9KTsNCi19KShqUXVlcnkpOw0KLS8vKi8NCi0NCi0vKiANCi0gKiBqc1RyZWUgSFRNTCBkYXRhIDEuMA0KLSAqIFRoZSBIVE1MIGRhdGEgc3RvcmUuIERhdGFzdG9yZXMgYXJlIGJ1aWxkIGJ5IHJlcGxhY2luZyB0aGUgYGxvYWRfbm9kZWAgYW5kIGBfaXNfbG9hZGVkYCBmdW5jdGlvbnMuDQotICovDQotKGZ1bmN0aW9uICgkKSB7DQotICAkLmpzdHJlZS5wbHVnaW4oImh0bWxfZGF0YSIsIHsNCi0gICAgX19pbml0IDogZnVuY3Rpb24gKCkgeyANCi0gICAgICAvLyB0aGlzIHVzZWQgdG8gdXNlIGh0bWwoKSBhbmQgY2xlYW4gdGhlIHdoaXRlc3BhY2UsIGJ1dCB0aGlzIHdheSBhbnkgYXR0YWNoZWQgZGF0YSB3YXMgbG9zdA0KLSAgICAgIHRoaXMuZGF0YS5odG1sX2RhdGEub3JpZ2luYWxfY29udGFpbmVyX2h0bWwgPSB0aGlzLmdldF9jb250YWluZXIoKS5maW5kKCIgPiB1bCA+IGxpIikuY2xvbmUodHJ1ZSk7DQotICAgICAgLy8gcmVtb3ZlIHdoaXRlIHNwYWNlIGZyb20gTEkgbm9kZSAtIG90aGVyd2lzZSBub2RlcyBhcHBlYXIgYSBiaXQgdG8gdGhlIHJpZ2h0DQotICAgICAgdGhpcy5kYXRhLmh0bWxfZGF0YS5vcmlnaW5hbF9jb250YWluZXJfaHRtbC5maW5kKCJsaSIpLmFuZFNlbGYoKS5jb250ZW50cygpLmZpbHRlcihmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMubm9kZVR5cGUgPT0gMzsgfSkucmVtb3ZlKCk7DQotICAgIH0sDQotICAgIGRlZmF1bHRzIDogeyANCi0gICAgICBkYXRhIDogZmFsc2UsDQotICAgICAgYWpheCA6IGZhbHNlLA0KLSAgICAgIGNvcnJlY3Rfc3RhdGUgOiB0cnVlDQotICAgIH0sDQotICAgIF9mbiA6IHsNCi0gICAgICBsb2FkX25vZGUgOiBmdW5jdGlvbiAob2JqLCBzX2NhbGwsIGVfY2FsbCkgeyB2YXIgX3RoaXMgPSB0aGlzOyB0aGlzLmxvYWRfbm9kZV9odG1sKG9iaiwgZnVuY3Rpb24gKCkgeyBfdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7IHNfY2FsbC5jYWxsKHRoaXMpOyB9LCBlX2NhbGwpOyB9LA0KLSAgICAgIF9pc19sb2FkZWQgOiBmdW5jdGlvbiAob2JqKSB7IA0KLSAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsgDQotICAgICAgICByZXR1cm4gb2JqID09IC0xIHx8ICFvYmogfHwgIXRoaXMuX2dldF9zZXR0aW5ncygpLmh0bWxfZGF0YS5hamF4IHx8IG9iai5pcygiLmpzdHJlZS1vcGVuLCAuanN0cmVlLWxlYWYiKSB8fCBvYmouY2hpbGRyZW4oInVsIikuY2hpbGRyZW4oImxpIikuc2l6ZSgpID4gMDsNCi0gICAgICB9LA0KLSAgICAgIGxvYWRfbm9kZV9odG1sIDogZnVuY3Rpb24gKG9iaiwgc19jYWxsLCBlX2NhbGwpIHsNCi0gICAgICAgIHZhciBkLA0KLSAgICAgICAgICBzID0gdGhpcy5nZXRfc2V0dGluZ3MoKS5odG1sX2RhdGEsDQotICAgICAgICAgIGVycm9yX2Z1bmMgPSBmdW5jdGlvbiAoKSB7fSwNCi0gICAgICAgICAgc3VjY2Vzc19mdW5jID0gZnVuY3Rpb24gKCkge307DQotICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOw0KLSAgICAgICAgaWYob2JqICYmIG9iaiAhPT0gLTEpIHsNCi0gICAgICAgICAgaWYob2JqLmRhdGEoImpzdHJlZS1pcy1sb2FkaW5nIikpIHsgcmV0dXJuOyB9DQotICAgICAgICAgIGVsc2UgeyBvYmouZGF0YSgianN0cmVlLWlzLWxvYWRpbmciLHRydWUpOyB9DQotICAgICAgICB9DQotICAgICAgICBzd2l0Y2goITApIHsNCi0gICAgICAgICAgY2FzZSAoIXMuZGF0YSAmJiAhcy5hamF4KToNCi0gICAgICAgICAgICBpZighb2JqIHx8IG9iaiA9PSAtMSkgew0KLSAgICAgICAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkNCi0gICAgICAgICAgICAgICAgLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCkNCi0gICAgICAgICAgICAgICAgLmFwcGVuZCh0aGlzLmRhdGEuaHRtbF9kYXRhLm9yaWdpbmFsX2NvbnRhaW5lcl9odG1sKQ0KLSAgICAgICAgICAgICAgICAuZmluZCgibGksIGEiKS5maWx0ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5maXJzdENoaWxkLnRhZ05hbWUgIT09ICJJTlMiOyB9KS5wcmVwZW5kKCI8aW5zIGNsYXNzPSdqc3RyZWUtaWNvbic+JiMxNjA7PC9pbnM+IikuZW5kKCkNCi0gICAgICAgICAgICAgICAgLmZpbHRlcigiYSIpLmNoaWxkcmVuKCJpbnM6Zmlyc3QtY2hpbGQiKS5ub3QoIi5qc3RyZWUtaWNvbiIpLmFkZENsYXNzKCJqc3RyZWUtaWNvbiIpOw0KLSAgICAgICAgICAgICAgdGhpcy5jbGVhbl9ub2RlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKHNfY2FsbCkgeyBzX2NhbGwuY2FsbCh0aGlzKTsgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICBjYXNlICghIXMuZGF0YSAmJiAhcy5hamF4KSB8fCAoISFzLmRhdGEgJiYgISFzLmFqYXggJiYgKCFvYmogfHwgb2JqID09PSAtMSkpOg0KLSAgICAgICAgICAgIGlmKCFvYmogfHwgb2JqID09IC0xKSB7DQotICAgICAgICAgICAgICBkID0gJChzLmRhdGEpOw0KLSAgICAgICAgICAgICAgaWYoIWQuaXMoInVsIikpIHsgZCA9ICQoIjx1bD4iKS5hcHBlbmQoZCk7IH0NCi0gICAgICAgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpDQotICAgICAgICAgICAgICAgIC5jaGlsZHJlbigidWwiKS5lbXB0eSgpLmFwcGVuZChkLmNoaWxkcmVuKCkpDQotICAgICAgICAgICAgICAgIC5maW5kKCJsaSwgYSIpLmZpbHRlcihmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmZpcnN0Q2hpbGQudGFnTmFtZSAhPT0gIklOUyI7IH0pLnByZXBlbmQoIjxpbnMgY2xhc3M9J2pzdHJlZS1pY29uJz4mIzE2MDs8L2lucz4iKS5lbmQoKQ0KLSAgICAgICAgICAgICAgICAuZmlsdGVyKCJhIikuY2hpbGRyZW4oImluczpmaXJzdC1jaGlsZCIpLm5vdCgiLmpzdHJlZS1pY29uIikuYWRkQ2xhc3MoImpzdHJlZS1pY29uIik7DQotICAgICAgICAgICAgICB0aGlzLmNsZWFuX25vZGUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoc19jYWxsKSB7IHNfY2FsbC5jYWxsKHRoaXMpOyB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgIGNhc2UgKCFzLmRhdGEgJiYgISFzLmFqYXgpIHx8ICghIXMuZGF0YSAmJiAhIXMuYWpheCAmJiBvYmogJiYgb2JqICE9PSAtMSk6DQotICAgICAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsNCi0gICAgICAgICAgICBlcnJvcl9mdW5jID0gZnVuY3Rpb24gKHgsIHQsIGUpIHsNCi0gICAgICAgICAgICAgIHZhciBlZiA9IHRoaXMuZ2V0X3NldHRpbmdzKCkuaHRtbF9kYXRhLmFqYXguZXJyb3I7IA0KLSAgICAgICAgICAgICAgaWYoZWYpIHsgZWYuY2FsbCh0aGlzLCB4LCB0LCBlKTsgfQ0KLSAgICAgICAgICAgICAgaWYob2JqICE9IC0xICYmIG9iai5sZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgb2JqLmNoaWxkcmVuKCIuanN0cmVlLWxvYWRpbmciKS5yZW1vdmVDbGFzcygianN0cmVlLWxvYWRpbmciKTsNCi0gICAgICAgICAgICAgICAgb2JqLmRhdGEoImpzdHJlZS1pcy1sb2FkaW5nIixmYWxzZSk7DQotICAgICAgICAgICAgICAgIGlmKHQgPT09ICJzdWNjZXNzIiAmJiBzLmNvcnJlY3Rfc3RhdGUpIHsgb2JqLnJlbW92ZUNsYXNzKCJqc3RyZWUtb3BlbiBqc3RyZWUtY2xvc2VkIikuYWRkQ2xhc3MoImpzdHJlZS1sZWFmIik7IH0NCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZih0ID09PSAic3VjY2VzcyIgJiYgcy5jb3JyZWN0X3N0YXRlKSB7IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCk7IH0NCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIGlmKGVfY2FsbCkgeyBlX2NhbGwuY2FsbCh0aGlzKTsgfQ0KLSAgICAgICAgICAgIH07DQotICAgICAgICAgICAgc3VjY2Vzc19mdW5jID0gZnVuY3Rpb24gKGQsIHQsIHgpIHsNCi0gICAgICAgICAgICAgIHZhciBzZiA9IHRoaXMuZ2V0X3NldHRpbmdzKCkuaHRtbF9kYXRhLmFqYXguc3VjY2VzczsgDQotICAgICAgICAgICAgICBpZihzZikgeyBkID0gc2YuY2FsbCh0aGlzLGQsdCx4KSB8fCBkOyB9DQotICAgICAgICAgICAgICBpZihkID09ICIiKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcl9mdW5jLmNhbGwodGhpcywgeCwgdCwgIiIpOw0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgaWYoZCkgew0KLSAgICAgICAgICAgICAgICBkID0gJChkKTsNCi0gICAgICAgICAgICAgICAgaWYoIWQuaXMoInVsIikpIHsgZCA9ICQoIjx1bD4iKS5hcHBlbmQoZCk7IH0NCi0gICAgICAgICAgICAgICAgaWYob2JqID09IC0xIHx8ICFvYmopIHsgdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikuZW1wdHkoKS5hcHBlbmQoZC5jaGlsZHJlbigpKS5maW5kKCJsaSwgYSIpLmZpbHRlcihmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmZpcnN0Q2hpbGQudGFnTmFtZSAhPT0gIklOUyI7IH0pLnByZXBlbmQoIjxpbnMgY2xhc3M9J2pzdHJlZS1pY29uJz4mIzE2MDs8L2lucz4iKS5lbmQoKS5maWx0ZXIoImEiKS5jaGlsZHJlbigiaW5zOmZpcnN0LWNoaWxkIikubm90KCIuanN0cmVlLWljb24iKS5hZGRDbGFzcygianN0cmVlLWljb24iKTsgfQ0KLSAgICAgICAgICAgICAgICBlbHNlIHsgb2JqLmNoaWxkcmVuKCIuanN0cmVlLWxvYWRpbmciKS5yZW1vdmVDbGFzcygianN0cmVlLWxvYWRpbmciKTsgb2JqLmFwcGVuZChkKS5maW5kKCJsaSwgYSIpLmZpbHRlcihmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmZpcnN0Q2hpbGQudGFnTmFtZSAhPT0gIklOUyI7IH0pLnByZXBlbmQoIjxpbnMgY2xhc3M9J2pzdHJlZS1pY29uJz4mIzE2MDs8L2lucz4iKS5lbmQoKS5maWx0ZXIoImEiKS5jaGlsZHJlbigiaW5zOmZpcnN0LWNoaWxkIikubm90KCIuanN0cmVlLWljb24iKS5hZGRDbGFzcygianN0cmVlLWljb24iKTsgb2JqLmRhdGEoImpzdHJlZS1pcy1sb2FkaW5nIixmYWxzZSk7IH0NCi0gICAgICAgICAgICAgICAgdGhpcy5jbGVhbl9ub2RlKG9iaik7DQotICAgICAgICAgICAgICAgIGlmKHNfY2FsbCkgeyBzX2NhbGwuY2FsbCh0aGlzKTsgfQ0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmKG9iaiAmJiBvYmogIT09IC0xKSB7DQotICAgICAgICAgICAgICAgICAgb2JqLmNoaWxkcmVuKCIuanN0cmVlLWxvYWRpbmciKS5yZW1vdmVDbGFzcygianN0cmVlLWxvYWRpbmciKTsNCi0gICAgICAgICAgICAgICAgICBvYmouZGF0YSgianN0cmVlLWlzLWxvYWRpbmciLGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgICBpZihzLmNvcnJlY3Rfc3RhdGUpIHsgDQotICAgICAgICAgICAgICAgICAgICBvYmoucmVtb3ZlQ2xhc3MoImpzdHJlZS1vcGVuIGpzdHJlZS1jbG9zZWQiKS5hZGRDbGFzcygianN0cmVlLWxlYWYiKTsgDQotICAgICAgICAgICAgICAgICAgICBpZihzX2NhbGwpIHsgc19jYWxsLmNhbGwodGhpcyk7IH0gDQotICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgIGlmKHMuY29ycmVjdF9zdGF0ZSkgeyANCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCk7DQotICAgICAgICAgICAgICAgICAgICBpZihzX2NhbGwpIHsgc19jYWxsLmNhbGwodGhpcyk7IH0gDQotICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICBzLmFqYXguY29udGV4dCA9IHRoaXM7DQotICAgICAgICAgICAgcy5hamF4LmVycm9yID0gZXJyb3JfZnVuYzsNCi0gICAgICAgICAgICBzLmFqYXguc3VjY2VzcyA9IHN1Y2Nlc3NfZnVuYzsNCi0gICAgICAgICAgICBpZighcy5hamF4LmRhdGFUeXBlKSB7IHMuYWpheC5kYXRhVHlwZSA9ICJodG1sIjsgfQ0KLSAgICAgICAgICAgIGlmKCQuaXNGdW5jdGlvbihzLmFqYXgudXJsKSkgeyBzLmFqYXgudXJsID0gcy5hamF4LnVybC5jYWxsKHRoaXMsIG9iaik7IH0NCi0gICAgICAgICAgICBpZigkLmlzRnVuY3Rpb24ocy5hamF4LmRhdGEpKSB7IHMuYWpheC5kYXRhID0gcy5hamF4LmRhdGEuY2FsbCh0aGlzLCBvYmopOyB9DQotICAgICAgICAgICAgJC5hamF4KHMuYWpheCk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9KTsNCi0gIC8vIGluY2x1ZGUgdGhlIEhUTUwgZGF0YSBwbHVnaW4gYnkgZGVmYXVsdA0KLSAgJC5qc3RyZWUuZGVmYXVsdHMucGx1Z2lucy5wdXNoKCJodG1sX2RhdGEiKTsNCi19KShqUXVlcnkpOw0KLS8vKi8NCi0NCi0vKiANCi0gKiBqc1RyZWUgdGhlbWVyb2xsZXIgcGx1Z2luIDEuMA0KLSAqIEFkZHMgc3VwcG9ydCBmb3IgalF1ZXJ5IFVJIHRoZW1lcy4gSW5jbHVkZSB0aGlzIGF0IHRoZSBlbmQgb2YgeW91ciBwbHVnaW5zIGxpc3QsIGFsc28gbWFrZSBzdXJlICJ0aGVtZXMiIGlzIG5vdCBpbmNsdWRlZC4NCi0gKi8NCi0oZnVuY3Rpb24gKCQpIHsNCi0gICQuanN0cmVlLnBsdWdpbigidGhlbWVyb2xsZXIiLCB7DQotICAgIF9faW5pdCA6IGZ1bmN0aW9uICgpIHsNCi0gICAgICB2YXIgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLnRoZW1lcm9sbGVyOw0KLSAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpDQotICAgICAgICAuYWRkQ2xhc3MoInVpLXdpZGdldC1jb250ZW50IikNCi0gICAgICAgIC5kZWxlZ2F0ZSgiYSIsIm1vdXNlZW50ZXIuanN0cmVlIiwgZnVuY3Rpb24gKCkgew0KLSAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKHMuaXRlbV9oKTsNCi0gICAgICAgIH0pDQotICAgICAgICAuZGVsZWdhdGUoImEiLCJtb3VzZWxlYXZlLmpzdHJlZSIsIGZ1bmN0aW9uICgpIHsNCi0gICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcyhzLml0ZW1faCk7DQotICAgICAgICB9KQ0KLSAgICAgICAgLmJpbmQoIm9wZW5fbm9kZS5qc3RyZWUgY3JlYXRlX25vZGUuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkgeyANCi0gICAgICAgICAgICB0aGlzLl90aGVtZXJvbGxlcihkYXRhLnJzbHQub2JqKTsNCi0gICAgICAgICAgfSwgdGhpcykpDQotICAgICAgICAuYmluZCgibG9hZGVkLmpzdHJlZSByZWZyZXNoLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUpIHsNCi0gICAgICAgICAgICB0aGlzLl90aGVtZXJvbGxlcigpOw0KLSAgICAgICAgICB9LCB0aGlzKSkNCi0gICAgICAgIC5iaW5kKCJjbG9zZV9ub2RlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHsNCi0gICAgICAgICAgICBkYXRhLnJzbHQub2JqLmNoaWxkcmVuKCJpbnMiKS5yZW1vdmVDbGFzcyhzLm9wZW5lZCkuYWRkQ2xhc3Mocy5jbG9zZWQpOw0KLSAgICAgICAgICB9LCB0aGlzKSkNCi0gICAgICAgIC5iaW5kKCJzZWxlY3Rfbm9kZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7DQotICAgICAgICAgICAgZGF0YS5yc2x0Lm9iai5jaGlsZHJlbigiYSIpLmFkZENsYXNzKHMuaXRlbV9hKTsNCi0gICAgICAgICAgfSwgdGhpcykpDQotICAgICAgICAuYmluZCgiZGVzZWxlY3Rfbm9kZS5qc3RyZWUgZGVzZWxlY3RfYWxsLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHsNCi0gICAgICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKQ0KLSAgICAgICAgICAgICAgLmZpbmQoIi4iICsgcy5pdGVtX2EpLnJlbW92ZUNsYXNzKHMuaXRlbV9hKS5lbmQoKQ0KLSAgICAgICAgICAgICAgLmZpbmQoIi5qc3RyZWUtY2xpY2tlZCIpLmFkZENsYXNzKHMuaXRlbV9hKTsNCi0gICAgICAgICAgfSwgdGhpcykpDQotICAgICAgICAuYmluZCgibW92ZV9ub2RlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHsNCi0gICAgICAgICAgICB0aGlzLl90aGVtZXJvbGxlcihkYXRhLnJzbHQubyk7DQotICAgICAgICAgIH0sIHRoaXMpKTsNCi0gICAgfSwNCi0gICAgX19kZXN0cm95IDogZnVuY3Rpb24gKCkgew0KLSAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkudGhlbWVyb2xsZXIsDQotICAgICAgICBjID0gWyAidWktaWNvbiIgXTsNCi0gICAgICAkLmVhY2gocywgZnVuY3Rpb24gKGksIHYpIHsNCi0gICAgICAgIHYgPSB2LnNwbGl0KCIgIik7DQotICAgICAgICBpZih2Lmxlbmd0aCkgeyBjID0gYy5jb25jYXQodik7IH0NCi0gICAgICB9KTsNCi0gICAgICB0aGlzLmdldF9jb250YWluZXIoKQ0KLSAgICAgICAgLnJlbW92ZUNsYXNzKCJ1aS13aWRnZXQtY29udGVudCIpDQotICAgICAgICAuZmluZCgiLiIgKyBjLmpvaW4oIiwgLiIpKS5yZW1vdmVDbGFzcyhjLmpvaW4oIiAiKSk7DQotICAgIH0sDQotICAgIF9mbiA6IHsNCi0gICAgICBfdGhlbWVyb2xsZXIgOiBmdW5jdGlvbiAob2JqKSB7DQotICAgICAgICB2YXIgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLnRoZW1lcm9sbGVyOw0KLSAgICAgICAgb2JqID0gIW9iaiB8fCBvYmogPT0gLTEgPyB0aGlzLmdldF9jb250YWluZXIoKSA6IHRoaXMuX2dldF9ub2RlKG9iaikucGFyZW50KCk7DQotICAgICAgICBvYmoNCi0gICAgICAgICAgLmZpbmQoImxpLmpzdHJlZS1jbG9zZWQgPiBpbnMuanN0cmVlLWljb24iKS5yZW1vdmVDbGFzcyhzLm9wZW5lZCkuYWRkQ2xhc3MoInVpLWljb24gIiArIHMuY2xvc2VkKS5lbmQoKQ0KLSAgICAgICAgICAuZmluZCgibGkuanN0cmVlLW9wZW4gPiBpbnMuanN0cmVlLWljb24iKS5yZW1vdmVDbGFzcyhzLmNsb3NlZCkuYWRkQ2xhc3MoInVpLWljb24gIiArIHMub3BlbmVkKS5lbmQoKQ0KLSAgICAgICAgICAuZmluZCgiYSIpLmFkZENsYXNzKHMuaXRlbSkNCi0gICAgICAgICAgICAuY2hpbGRyZW4oImlucy5qc3RyZWUtaWNvbiIpLmFkZENsYXNzKCJ1aS1pY29uICIgKyBzLml0ZW1faWNvbik7DQotICAgICAgfQ0KLSAgICB9LA0KLSAgICBkZWZhdWx0cyA6IHsNCi0gICAgICAib3BlbmVkIiA6ICJ1aS1pY29uLXRyaWFuZ2xlLTEtc2UiLA0KLSAgICAgICJjbG9zZWQiIDogInVpLWljb24tdHJpYW5nbGUtMS1lIiwNCi0gICAgICAiaXRlbSIgOiAidWktc3RhdGUtZGVmYXVsdCIsDQotICAgICAgIml0ZW1faCIgOiAidWktc3RhdGUtaG92ZXIiLA0KLSAgICAgICJpdGVtX2EiIDogInVpLXN0YXRlLWFjdGl2ZSIsDQotICAgICAgIml0ZW1faWNvbiIgOiAidWktaWNvbi1mb2xkZXItY29sbGFwc2VkIg0KLSAgICB9DQotICB9KTsNCi0gICQoZnVuY3Rpb24oKSB7DQotICAgIHZhciBjc3Nfc3RyaW5nID0gJy5qc3RyZWUgLnVpLWljb24geyBvdmVyZmxvdzp2aXNpYmxlOyB9IC5qc3RyZWUgYSB7IHBhZGRpbmc6MCAycHg7IH0nOw0KLSAgICAkLnZha2F0YS5jc3MuYWRkX3NoZWV0KHsgc3RyIDogY3NzX3N0cmluZyB9KTsNCi0gIH0pOw0KLX0pKGpRdWVyeSk7DQotLy8qLw0KLQ0KLS8qIA0KLSAqIGpzVHJlZSB1bmlxdWUgcGx1Z2luIDEuMA0KLSAqIEZvcmNlcyBkaWZmZXJlbnQgbmFtZXMgYW1vbmdzdCBzaWJsaW5ncyAoc3RpbGwgYSBiaXQgZXhwZXJpbWVudGFsKQ0KLSAqIE5PVEU6IGRvZXMgbm90IGNoZWNrIGxhbmd1YWdlIHZlcnNpb25zIChpdCB3aWxsIG5vdCBiZSBwb3NzaWJsZSB0byBoYXZlIG5vZGVzIHdpdGggdGhlIHNhbWUgdGl0bGUsIGV2ZW4gaW4gZGlmZmVyZW50IGxhbmd1YWdlcykNCi0gKi8NCi0oZnVuY3Rpb24gKCQpIHsNCi0gICQuanN0cmVlLnBsdWdpbigidW5pcXVlIiwgew0KLSAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7DQotICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkNCi0gICAgICAgIC5iaW5kKCJiZWZvcmUuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkgeyANCi0gICAgICAgICAgICB2YXIgbm1zID0gW10sIHJlcyA9IHRydWUsIHAsIHQ7DQotICAgICAgICAgICAgaWYoZGF0YS5mdW5jID09ICJtb3ZlX25vZGUiKSB7DQotICAgICAgICAgICAgICAvLyBvYmosIHJlZiwgcG9zaXRpb24sIGlzX2NvcHksIGlzX3ByZXBhcmVkLCBza2lwX2NoZWNrDQotICAgICAgICAgICAgICBpZihkYXRhLmFyZ3NbNF0gPT09IHRydWUpIHsNCi0gICAgICAgICAgICAgICAgaWYoZGF0YS5hcmdzWzBdLm8gJiYgZGF0YS5hcmdzWzBdLm8ubGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgICAgZGF0YS5hcmdzWzBdLm8uY2hpbGRyZW4oImEiKS5lYWNoKGZ1bmN0aW9uICgpIHsgbm1zLnB1c2goJCh0aGlzKS50ZXh0KCkucmVwbGFjZSgvXlxzKy9nLCIiKSk7IH0pOw0KLSAgICAgICAgICAgICAgICAgIHJlcyA9IHRoaXMuX2NoZWNrX3VuaXF1ZShubXMsIGRhdGEuYXJnc1swXS5ucC5maW5kKCI+IHVsID4gbGkiKS5ub3QoZGF0YS5hcmdzWzBdLm8pKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihkYXRhLmZ1bmMgPT0gImNyZWF0ZV9ub2RlIikgew0KLSAgICAgICAgICAgICAgLy8gb2JqLCBwb3NpdGlvbiwganMsIGNhbGxiYWNrLCBpc19sb2FkZWQNCi0gICAgICAgICAgICAgIGlmKGRhdGEuYXJnc1s0XSB8fCB0aGlzLl9pc19sb2FkZWQoZGF0YS5hcmdzWzBdKSkgew0KLSAgICAgICAgICAgICAgICBwID0gdGhpcy5fZ2V0X25vZGUoZGF0YS5hcmdzWzBdKTsNCi0gICAgICAgICAgICAgICAgaWYoZGF0YS5hcmdzWzFdICYmIChkYXRhLmFyZ3NbMV0gPT09ICJiZWZvcmUiIHx8IGRhdGEuYXJnc1sxXSA9PT0gImFmdGVyIikpIHsNCi0gICAgICAgICAgICAgICAgICBwID0gdGhpcy5fZ2V0X3BhcmVudChkYXRhLmFyZ3NbMF0pOw0KLSAgICAgICAgICAgICAgICAgIGlmKCFwIHx8IHAgPT09IC0xKSB7IHAgPSB0aGlzLmdldF9jb250YWluZXIoKTsgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBkYXRhLmFyZ3NbMl0gPT09ICJzdHJpbmciKSB7IG5tcy5wdXNoKGRhdGEuYXJnc1syXSk7IH0NCi0gICAgICAgICAgICAgICAgZWxzZSBpZighZGF0YS5hcmdzWzJdIHx8ICFkYXRhLmFyZ3NbMl0uZGF0YSkgeyBubXMucHVzaCh0aGlzLl9nZXRfc2V0dGluZ3MoKS5jb3JlLnN0cmluZ3MubmV3X25vZGUpOyB9DQotICAgICAgICAgICAgICAgIGVsc2UgeyBubXMucHVzaChkYXRhLmFyZ3NbMl0uZGF0YSk7IH0NCi0gICAgICAgICAgICAgICAgcmVzID0gdGhpcy5fY2hlY2tfdW5pcXVlKG5tcywgcC5maW5kKCI+IHVsID4gbGkiKSk7DQotICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKGRhdGEuZnVuYyA9PSAicmVuYW1lX25vZGUiKSB7DQotICAgICAgICAgICAgICAvLyBvYmosIHZhbA0KLSAgICAgICAgICAgICAgbm1zLnB1c2goZGF0YS5hcmdzWzFdKTsNCi0gICAgICAgICAgICAgIHQgPSB0aGlzLl9nZXRfbm9kZShkYXRhLmFyZ3NbMF0pOw0KLSAgICAgICAgICAgICAgcCA9IHRoaXMuX2dldF9wYXJlbnQodCk7DQotICAgICAgICAgICAgICBpZighcCB8fCBwID09PSAtMSkgeyBwID0gdGhpcy5nZXRfY29udGFpbmVyKCk7IH0NCi0gICAgICAgICAgICAgIHJlcyA9IHRoaXMuX2NoZWNrX3VuaXF1ZShubXMsIHAuZmluZCgiPiB1bCA+IGxpIikubm90KHQpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoIXJlcykgew0KLSAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsNCi0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgIH0sIHRoaXMpKTsNCi0gICAgfSwNCi0gICAgX2ZuIDogeyANCi0gICAgICBfY2hlY2tfdW5pcXVlIDogZnVuY3Rpb24gKG5tcywgcCkgew0KLSAgICAgICAgdmFyIGNubXMgPSBbXTsNCi0gICAgICAgIHAuY2hpbGRyZW4oImEiKS5lYWNoKGZ1bmN0aW9uICgpIHsgY25tcy5wdXNoKCQodGhpcykudGV4dCgpLnJlcGxhY2UoL15ccysvZywiIikpOyB9KTsNCi0gICAgICAgIGlmKCFjbm1zLmxlbmd0aCB8fCAhbm1zLmxlbmd0aCkgeyByZXR1cm4gdHJ1ZTsgfQ0KLSAgICAgICAgY25tcyA9IGNubXMuc29ydCgpLmpvaW4oIiwsIikucmVwbGFjZSgvKCx8XikoW14sXSspKCwsXDIpKygsfCQpL2csIiQxJDIkNCIpLnJlcGxhY2UoLywsKy9nLCIsIikucmVwbGFjZSgvLCQvLCIiKS5zcGxpdCgiLCIpOw0KLSAgICAgICAgaWYoKGNubXMubGVuZ3RoICsgbm1zLmxlbmd0aCkgIT0gY25tcy5jb25jYXQobm1zKS5zb3J0KCkuam9pbigiLCwiKS5yZXBsYWNlKC8oLHxeKShbXixdKykoLCxcMikrKCx8JCkvZywiJDEkMiQ0IikucmVwbGFjZSgvLCwrL2csIiwiKS5yZXBsYWNlKC8sJC8sIiIpLnNwbGl0KCIsIikubGVuZ3RoKSB7DQotICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgIH0sDQotICAgICAgY2hlY2tfbW92ZSA6IGZ1bmN0aW9uICgpIHsNCi0gICAgICAgIGlmKCF0aGlzLl9fY2FsbF9vbGQoKSkgeyByZXR1cm4gZmFsc2U7IH0NCi0gICAgICAgIHZhciBwID0gdGhpcy5fZ2V0X21vdmUoKSwgbm1zID0gW107DQotICAgICAgICBpZihwLm8gJiYgcC5vLmxlbmd0aCkgew0KLSAgICAgICAgICBwLm8uY2hpbGRyZW4oImEiKS5lYWNoKGZ1bmN0aW9uICgpIHsgbm1zLnB1c2goJCh0aGlzKS50ZXh0KCkucmVwbGFjZSgvXlxzKy9nLCIiKSk7IH0pOw0KLSAgICAgICAgICByZXR1cm4gdGhpcy5fY2hlY2tfdW5pcXVlKG5tcywgcC5ucC5maW5kKCI+IHVsID4gbGkiKS5ub3QocC5vKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0pOw0KLX0pKGpRdWVyeSk7DQotLy8qLw0KKy8qCisKK1RoZSBNSVQgTGljZW5zZSAoTUlUKQorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworKi8KKworLyoKKyAqIGpzVHJlZSAxLjAtcmMxCisgKiBodHRwOi8vanN0cmVlLmNvbS8KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSXZhbiBCb3poYW5vdiAodmFrYXRhLmNvbSkKKyAqCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlcyAoc2FtZSBhcyBqUXVlcnkpOgorICogICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAorICogICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKKyAqCisgKiBEYXRlOiAyMDEwLTA3LTAxIDEwOjUxOjExICswMzAwICjRh9C10YLQsiwgMDEg0Y7Qu9C4IDIwMTApICQKKyAqIFJldmlzaW9uOiAxOTEgJAorICovCisKKy8qanNsaW50IGJyb3dzZXI6IHRydWUsIG9uZXZhcjogdHJ1ZSwgdW5kZWY6IHRydWUsIGJpdHdpc2U6IHRydWUsIHN0cmljdDogdHJ1ZSAqLworLypnbG9iYWwgd2luZG93IDogZmFsc2UsIGNsZWFySW50ZXJ2YWw6IGZhbHNlLCBjbGVhclRpbWVvdXQ6IGZhbHNlLCBkb2N1bWVudDogZmFsc2UsIHNldEludGVydmFsOiBmYWxzZSwgc2V0VGltZW91dDogZmFsc2UsIGpRdWVyeTogZmFsc2UsIG5hdmlnYXRvcjogZmFsc2UsIFhTTFRQcm9jZXNzb3I6IGZhbHNlLCBET01QYXJzZXI6IGZhbHNlLCBYTUxTZXJpYWxpemVyOiBmYWxzZSovCisKKyJ1c2Ugc3RyaWN0IjsKKy8vIENvbW1vbiBmdW5jdGlvbnMgbm90IHJlbGF0ZWQgdG8ganNUcmVlIAorLy8gZGVjaWRlZCB0byBtb3ZlIHRoZW0gdG8gYSBgdmFrYXRhYCAibmFtZXNwYWNlIgorKGZ1bmN0aW9uICgkKSB7CisgICQudmFrYXRhID0ge307CisgIC8vIENTUyByZWxhdGVkIGZ1bmN0aW9ucworICAkLnZha2F0YS5jc3MgPSB7CisgICAgZ2V0X2NzcyA6IGZ1bmN0aW9uKHJ1bGVfbmFtZSwgZGVsZXRlX2ZsYWcsIHNoZWV0KSB7CisgICAgICBydWxlX25hbWUgPSBydWxlX25hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgIHZhciBjc3NfcnVsZXMgPSBzaGVldC5jc3NSdWxlcyB8fCBzaGVldC5ydWxlcywKKyAgICAgICAgaiA9IDA7CisgICAgICBkbyB7CisgICAgICAgIGlmKGNzc19ydWxlcy5sZW5ndGggJiYgaiA+IGNzc19ydWxlcy5sZW5ndGggKyA1KSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICBpZihjc3NfcnVsZXNbal0uc2VsZWN0b3JUZXh0ICYmIGNzc19ydWxlc1tqXS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKSA9PSBydWxlX25hbWUpIHsKKyAgICAgICAgICBpZihkZWxldGVfZmxhZyA9PT0gdHJ1ZSkgeworICAgICAgICAgICAgaWYoc2hlZXQucmVtb3ZlUnVsZSkgeyBzaGVldC5yZW1vdmVSdWxlKGopOyB9CisgICAgICAgICAgICBpZihzaGVldC5kZWxldGVSdWxlKSB7IHNoZWV0LmRlbGV0ZVJ1bGUoaik7IH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsgcmV0dXJuIGNzc19ydWxlc1tqXTsgfQorICAgICAgICB9CisgICAgICB9CisgICAgICB3aGlsZSAoY3NzX3J1bGVzWysral0pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisgICAgYWRkX2NzcyA6IGZ1bmN0aW9uKHJ1bGVfbmFtZSwgc2hlZXQpIHsKKyAgICAgIGlmKCQuanN0cmVlLmNzcy5nZXRfY3NzKHJ1bGVfbmFtZSwgZmFsc2UsIHNoZWV0KSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgIGlmKHNoZWV0Lmluc2VydFJ1bGUpIHsgc2hlZXQuaW5zZXJ0UnVsZShydWxlX25hbWUgKyAnIHsgfScsIDApOyB9IGVsc2UgeyBzaGVldC5hZGRSdWxlKHJ1bGVfbmFtZSwgbnVsbCwgMCk7IH0KKyAgICAgIHJldHVybiAkLnZha2F0YS5jc3MuZ2V0X2NzcyhydWxlX25hbWUpOworICAgIH0sCisgICAgcmVtb3ZlX2NzcyA6IGZ1bmN0aW9uKHJ1bGVfbmFtZSwgc2hlZXQpIHsgCisgICAgICByZXR1cm4gJC52YWthdGEuY3NzLmdldF9jc3MocnVsZV9uYW1lLCB0cnVlLCBzaGVldCk7IAorICAgIH0sCisgICAgYWRkX3NoZWV0IDogZnVuY3Rpb24ob3B0cykgeworICAgICAgdmFyIHRtcDsKKyAgICAgIGlmKG9wdHMuc3RyKSB7CisgICAgICAgIHRtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CisgICAgICAgIHRtcC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCJ0ZXh0L2NzcyIpOworICAgICAgICBpZih0bXAuc3R5bGVTaGVldCkgeworICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQodG1wKTsKKyAgICAgICAgICB0bXAuc3R5bGVTaGVldC5jc3NUZXh0ID0gb3B0cy5zdHI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdG1wLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG9wdHMuc3RyKSk7CisgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZCh0bXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0bXAuc2hlZXQgfHwgdG1wLnN0eWxlU2hlZXQ7CisgICAgICB9CisgICAgICBpZihvcHRzLnVybCkgeworICAgICAgICBpZihkb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KSB7CisgICAgICAgICAgdHJ5IHsgdG1wID0gZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldChvcHRzLnVybCk7IH0gY2F0Y2ggKGUpIHsgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHRtcCAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpOworICAgICAgICAgIHRtcC5yZWwgICAgPSAnc3R5bGVzaGVldCc7CisgICAgICAgICAgdG1wLnR5cGUgID0gJ3RleHQvY3NzJzsKKyAgICAgICAgICB0bXAubWVkaWEgID0gImFsbCI7CisgICAgICAgICAgdG1wLmhyZWYgID0gb3B0cy51cmw7CisgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZCh0bXApOworICAgICAgICAgIHJldHVybiB0bXAuc3R5bGVTaGVldDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKK30pKGpRdWVyeSk7CisKKy8qIAorICoganNUcmVlIGNvcmUgMS4wCisgKi8KKyhmdW5jdGlvbiAoJCkgeworICAvLyBwcml2YXRlIHZhcmlhYmxlcyAKKyAgdmFyIGluc3RhbmNlcyA9IFtdLCAgICAgIC8vIGluc3RhbmNlIGFycmF5ICh1c2VkIGJ5ICQuanN0cmVlLnJlZmVyZW5jZS9jcmVhdGUvZm9jdXNlZCkKKyAgICBmb2N1c2VkX2luc3RhbmNlID0gLTEsICAvLyB0aGUgaW5kZXggaW4gdGhlIGluc3RhbmNlIGFycmF5IG9mIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBpbnN0YW5jZQorICAgIHBsdWdpbnMgPSB7fSwgICAgICAvLyBsaXN0IG9mIGluY2x1ZGVkIHBsdWdpbnMKKyAgICBwcmVwYXJlZF9tb3ZlID0ge30sICAgIC8vIGZvciB0aGUgbW92ZSBwbHVnaW4KKyAgICBpc19pZTYgPSBmYWxzZTsKKworICAvLyBqUXVlcnkgcGx1Z2luIHdyYXBwZXIgKHRoYW5rcyB0byBqcXVlcnkgVUkgd2lkZ2V0IGZ1bmN0aW9uKQorICAkLmZuLmpzdHJlZSA9IGZ1bmN0aW9uIChzZXR0aW5ncykgeworICAgIHZhciBpc01ldGhvZENhbGwgPSAodHlwZW9mIHNldHRpbmdzID09ICdzdHJpbmcnKSwgLy8gaXMgdGhpcyBhIG1ldGhvZCBjYWxsIGxpa2UgJCgpLmpzdHJlZSgib3Blbl9ub2RlIikKKyAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCAKKyAgICAgIHJldHVyblZhbHVlID0gdGhpczsKKworICAgIC8vIGV4dGVuZCBzZXR0aW5ncyBhbmQgYWxsb3cgZm9yIG11bHRpcGxlIGhhc2hlcyBhbmQgbWV0YWRhdGEKKyAgICBpZighaXNNZXRob2RDYWxsICYmICQubWV0YSkgeyBhcmdzLnB1c2goJC5tZXRhZGF0YS5nZXQodGhpcykuanN0cmVlKTsgfQorICAgIHNldHRpbmdzID0gIWlzTWV0aG9kQ2FsbCAmJiBhcmdzLmxlbmd0aCA/ICQuZXh0ZW5kLmFwcGx5KG51bGwsIFt0cnVlLCBzZXR0aW5nc10uY29uY2F0KGFyZ3MpKSA6IHNldHRpbmdzOworICAgIC8vIGJsb2NrIGNhbGxzIHRvICJwcml2YXRlIiBtZXRob2RzCisgICAgaWYoaXNNZXRob2RDYWxsICYmIHNldHRpbmdzLnN1YnN0cmluZygwLCAxKSA9PSAnXycpIHsgcmV0dXJuIHJldHVyblZhbHVlOyB9CisKKyAgICAvLyBpZiBhIG1ldGhvZCBjYWxsIGV4ZWN1dGUgdGhlIG1ldGhvZCBvbiBhbGwgc2VsZWN0ZWQgaW5zdGFuY2VzCisgICAgaWYoaXNNZXRob2RDYWxsKSB7CisgICAgICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBpbnN0YW5jZSA9IGluc3RhbmNlc1skLmRhdGEodGhpcywgImpzdHJlZS1pbnN0YW5jZS1pZCIpXSwKKyAgICAgICAgICBtZXRob2RWYWx1ZSA9IChpbnN0YW5jZSAmJiAkLmlzRnVuY3Rpb24oaW5zdGFuY2Vbc2V0dGluZ3NdKSkgPyBpbnN0YW5jZVtzZXR0aW5nc10uYXBwbHkoaW5zdGFuY2UsIGFyZ3MpIDogaW5zdGFuY2U7CisgICAgICAgICAgaWYodHlwZW9mIG1ldGhvZFZhbHVlICE9PSAidW5kZWZpbmVkIiAmJiAoc2V0dGluZ3MuaW5kZXhPZigiaXNfIiA9PT0gMCkgfHwgKG1ldGhvZFZhbHVlICE9PSB0cnVlICYmIG1ldGhvZFZhbHVlICE9PSBmYWxzZSkpKSB7IHJldHVyblZhbHVlID0gbWV0aG9kVmFsdWU7IHJldHVybiBmYWxzZTsgfQorICAgICAgfSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgaW5zdGFuY2VfaWQgPSAkLmRhdGEodGhpcywgImpzdHJlZS1pbnN0YW5jZS1pZCIpLAorICAgICAgICAgIHMgPSBmYWxzZTsKKyAgICAgICAgLy8gaWYgYW4gaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMsIGRlc3Ryb3kgaXQgZmlyc3QKKyAgICAgICAgaWYodHlwZW9mIGluc3RhbmNlX2lkICE9PSAidW5kZWZpbmVkIiAmJiBpbnN0YW5jZXNbaW5zdGFuY2VfaWRdKSB7IGluc3RhbmNlc1tpbnN0YW5jZV9pZF0uZGVzdHJveSgpOyB9CisgICAgICAgIC8vIHB1c2ggYSBuZXcgZW1wdHkgb2JqZWN0IHRvIHRoZSBpbnN0YW5jZXMgYXJyYXkKKyAgICAgICAgaW5zdGFuY2VfaWQgPSBwYXJzZUludChpbnN0YW5jZXMucHVzaCh7fSksMTApIC0gMTsKKyAgICAgICAgLy8gc3RvcmUgdGhlIGpzdHJlZSBpbnN0YW5jZSBpZCB0byB0aGUgY29udGFpbmVyIGVsZW1lbnQKKyAgICAgICAgJC5kYXRhKHRoaXMsICJqc3RyZWUtaW5zdGFuY2UtaWQiLCBpbnN0YW5jZV9pZCk7CisgICAgICAgIC8vIGNsZWFuIHVwIGFsbCBwbHVnaW5zCisgICAgICAgIGlmKCFzZXR0aW5ncykgeyBzZXR0aW5ncyA9IHt9OyB9CisgICAgICAgIHNldHRpbmdzLnBsdWdpbnMgPSAkLmlzQXJyYXkoc2V0dGluZ3MucGx1Z2lucykgPyBzZXR0aW5ncy5wbHVnaW5zIDogJC5qc3RyZWUuZGVmYXVsdHMucGx1Z2luczsKKyAgICAgICAgaWYoJC5pbkFycmF5KCJjb3JlIiwgc2V0dGluZ3MucGx1Z2lucykgPT09IC0xKSB7IHNldHRpbmdzLnBsdWdpbnMudW5zaGlmdCgiY29yZSIpOyB9CisgICAgICAgIAorICAgICAgICAvLyBvbmx5IHVuaXF1ZSBwbHVnaW5zIChOT1QgV09SS0lORykKKyAgICAgICAgLy8gc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMuc29ydCgpLmpvaW4oIiwsIikucmVwbGFjZSgvKCx8XikoW14sXSspKCwsXDIpKygsfCQpL2csIiQxJDIkNCIpLnJlcGxhY2UoLywsKy9nLCIsIikucmVwbGFjZSgvLCQvLCIiKS5zcGxpdCgiLCIpOworCisgICAgICAgIC8vIGV4dGVuZCBkZWZhdWx0cyB3aXRoIHBhc3NlZCBkYXRhCisgICAgICAgIHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgJC5qc3RyZWUuZGVmYXVsdHMsIHNldHRpbmdzKTsKKyAgICAgICAgcy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2luczsKKyAgICAgICAgJC5lYWNoKHBsdWdpbnMsIGZ1bmN0aW9uIChpLCB2YWwpIHsgaWYoJC5pbkFycmF5KGksIHMucGx1Z2lucykgPT09IC0xKSB7IHNbaV0gPSBudWxsOyBkZWxldGUgc1tpXTsgfSB9KTsKKyAgICAgICAgLy8gcHVzaCB0aGUgbmV3IG9iamVjdCB0byB0aGUgaW5zdGFuY2VzIGFycmF5IChhdCB0aGUgc2FtZSB0aW1lIHNldCB0aGUgZGVmYXVsdCBjbGFzc2VzIHRvIHRoZSBjb250YWluZXIpIGFuZCBpbml0CisgICAgICAgIGluc3RhbmNlc1tpbnN0YW5jZV9pZF0gPSBuZXcgJC5qc3RyZWUuX2luc3RhbmNlKGluc3RhbmNlX2lkLCAkKHRoaXMpLmFkZENsYXNzKCJqc3RyZWUganN0cmVlLSIgKyBpbnN0YW5jZV9pZCksIHMpOyAKKyAgICAgICAgLy8gaW5pdCBhbGwgYWN0aXZhdGVkIHBsdWdpbnMgZm9yIHRoaXMgaW5zdGFuY2UKKyAgICAgICAgJC5lYWNoKGluc3RhbmNlc1tpbnN0YW5jZV9pZF0uX2dldF9zZXR0aW5ncygpLnBsdWdpbnMsIGZ1bmN0aW9uIChpLCB2YWwpIHsgaW5zdGFuY2VzW2luc3RhbmNlX2lkXS5kYXRhW3ZhbF0gPSB7fTsgfSk7CisgICAgICAgICQuZWFjaChpbnN0YW5jZXNbaW5zdGFuY2VfaWRdLl9nZXRfc2V0dGluZ3MoKS5wbHVnaW5zLCBmdW5jdGlvbiAoaSwgdmFsKSB7IGlmKHBsdWdpbnNbdmFsXSkgeyBwbHVnaW5zW3ZhbF0uX19pbml0LmFwcGx5KGluc3RhbmNlc1tpbnN0YW5jZV9pZF0pOyB9IH0pOworICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBpbnN0YW5jZQorICAgICAgICBpbnN0YW5jZXNbaW5zdGFuY2VfaWRdLmluaXQoKTsKKyAgICAgIH0pOworICAgIH0KKyAgICAvLyByZXR1cm4gdGhlIGpxdWVyeSBzZWxlY3Rpb24gKG9yIGlmIGl0IHdhcyBhIG1ldGhvZCBjYWxsIHRoYXQgcmV0dXJuZWQgYSB2YWx1ZSAtIHRoZSByZXR1cm5lZCB2YWx1ZSkKKyAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgIH07CisgIC8vIG9iamVjdCB0byBzdG9yZSBleHBvc2VkIGZ1bmN0aW9ucyBhbmQgb2JqZWN0cworICAkLmpzdHJlZSA9IHsKKyAgICBkZWZhdWx0cyA6IHsKKyAgICAgIHBsdWdpbnMgOiBbXQorICAgIH0sCisgICAgX2ZvY3VzZWQgOiBmdW5jdGlvbiAoKSB7IHJldHVybiBpbnN0YW5jZXNbZm9jdXNlZF9pbnN0YW5jZV0gfHwgbnVsbDsgfSwKKyAgICBfcmVmZXJlbmNlIDogZnVuY3Rpb24gKG5lZWRsZSkgeyAKKyAgICAgIC8vIGdldCBieSBpbnN0YW5jZSBpZAorICAgICAgaWYoaW5zdGFuY2VzW25lZWRsZV0pIHsgcmV0dXJuIGluc3RhbmNlc1tuZWVkbGVdOyB9CisgICAgICAvLyBnZXQgYnkgRE9NIChpZiBzdGlsbCBubyBsdWNrIC0gcmV0dXJuIG51bGwKKyAgICAgIHZhciBvID0gJChuZWVkbGUpOyAKKyAgICAgIGlmKCFvLmxlbmd0aCAmJiB0eXBlb2YgbmVlZGxlID09PSAic3RyaW5nIikgeyBvID0gJCgiIyIgKyBuZWVkbGUpOyB9CisgICAgICBpZighby5sZW5ndGgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICAgIHJldHVybiBpbnN0YW5jZXNbby5jbG9zZXN0KCIuanN0cmVlIikuZGF0YSgianN0cmVlLWluc3RhbmNlLWlkIildIHx8IG51bGw7IAorICAgIH0sCisgICAgX2luc3RhbmNlIDogZnVuY3Rpb24gKGluZGV4LCBjb250YWluZXIsIHNldHRpbmdzKSB7IAorICAgICAgLy8gZm9yIHBsdWdpbnMgdG8gc3RvcmUgZGF0YSBpbgorICAgICAgdGhpcy5kYXRhID0geyBjb3JlIDoge30gfTsKKyAgICAgIHRoaXMuZ2V0X3NldHRpbmdzICA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICQuZXh0ZW5kKHRydWUsIHt9LCBzZXR0aW5ncyk7IH07CisgICAgICB0aGlzLl9nZXRfc2V0dGluZ3MgID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gc2V0dGluZ3M7IH07CisgICAgICB0aGlzLmdldF9pbmRleCAgICA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGluZGV4OyB9OworICAgICAgdGhpcy5nZXRfY29udGFpbmVyICA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbnRhaW5lcjsgfTsKKyAgICAgIHRoaXMuX3NldF9zZXR0aW5ncyAgPSBmdW5jdGlvbiAocykgeyAKKyAgICAgICAgc2V0dGluZ3MgPSAkLmV4dGVuZCh0cnVlLCB7fSwgc2V0dGluZ3MsIHMpOworICAgICAgfTsKKyAgICB9LAorICAgIF9mbiA6IHsgfSwKKyAgICBwbHVnaW4gOiBmdW5jdGlvbiAocG5hbWUsIHBkYXRhKSB7CisgICAgICBwZGF0YSA9ICQuZXh0ZW5kKHt9LCB7CisgICAgICAgIF9faW5pdCAgICA6ICQubm9vcCwgCisgICAgICAgIF9fZGVzdHJveSAgOiAkLm5vb3AsCisgICAgICAgIF9mbiAgICAgIDoge30sCisgICAgICAgIGRlZmF1bHRzICA6IGZhbHNlCisgICAgICB9LCBwZGF0YSk7CisgICAgICBwbHVnaW5zW3BuYW1lXSA9IHBkYXRhOworCisgICAgICAkLmpzdHJlZS5kZWZhdWx0c1twbmFtZV0gPSBwZGF0YS5kZWZhdWx0czsKKyAgICAgICQuZWFjaChwZGF0YS5fZm4sIGZ1bmN0aW9uIChpLCB2YWwpIHsKKyAgICAgICAgdmFsLnBsdWdpbiAgICA9IHBuYW1lOworICAgICAgICB2YWwub2xkICAgICAgPSAkLmpzdHJlZS5fZm5baV07CisgICAgICAgICQuanN0cmVlLl9mbltpXSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICB2YXIgcnNsdCwKKyAgICAgICAgICAgIGZ1bmMgPSB2YWwsCisgICAgICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSwKKyAgICAgICAgICAgIGV2bnQgPSBuZXcgJC5FdmVudCgiYmVmb3JlLmpzdHJlZSIpLAorICAgICAgICAgICAgcmxiayA9IGZhbHNlOworCisgICAgICAgICAgLy8gQ2hlY2sgaWYgZnVuY3Rpb24gYmVsb25ncyB0byB0aGUgaW5jbHVkZWQgcGx1Z2lucyBvZiB0aGlzIGluc3RhbmNlCisgICAgICAgICAgZG8geworICAgICAgICAgICAgaWYoZnVuYyAmJiBmdW5jLnBsdWdpbiAmJiAkLmluQXJyYXkoZnVuYy5wbHVnaW4sIHRoaXMuX2dldF9zZXR0aW5ncygpLnBsdWdpbnMpICE9PSAtMSkgeyBicmVhazsgfQorICAgICAgICAgICAgZnVuYyA9IGZ1bmMub2xkOworICAgICAgICAgIH0gd2hpbGUoZnVuYyk7CisgICAgICAgICAgaWYoIWZ1bmMpIHsgcmV0dXJuOyB9CisKKyAgICAgICAgICAvLyBhIGNoYW5jZSB0byBzdG9wIGV4ZWN1dGlvbiAob3IgY2hhbmdlIGFyZ3VtZW50cyk6IAorICAgICAgICAgIC8vICoganVzdCBiaW5kIHRvIGpzdHJlZS5iZWZvcmUKKyAgICAgICAgICAvLyAqIGNoZWNrIHRoZSBhZGRpdGlvbmFsIGRhdGEgb2JqZWN0IChmdW5jIHByb3BlcnR5KQorICAgICAgICAgIC8vICogY2FsbCBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKQorICAgICAgICAgIC8vICogcmV0dXJuIGZhbHNlIChvciBhbiBhcnJheSBvZiBhcmd1bWVudHMpCisgICAgICAgICAgcnNsdCA9IHRoaXMuZ2V0X2NvbnRhaW5lcigpLnRyaWdnZXJIYW5kbGVyKGV2bnQsIHsgImZ1bmMiIDogaSwgImluc3QiIDogdGhpcywgImFyZ3MiIDogYXJncyB9KTsKKyAgICAgICAgICBpZihyc2x0ID09PSBmYWxzZSkgeyByZXR1cm47IH0KKyAgICAgICAgICBpZih0eXBlb2YgcnNsdCAhPT0gInVuZGVmaW5lZCIpIHsgYXJncyA9IHJzbHQ7IH0KKworICAgICAgICAgIC8vIGNvbnRleHQgYW5kIGZ1bmN0aW9uIHRvIHRyaWdnZXIgZXZlbnRzLCB0aGVuIGZpbmFsbHkgY2FsbCB0aGUgZnVuY3Rpb24KKyAgICAgICAgICBpZihpLmluZGV4T2YoIl8iKSA9PT0gMCkgeworICAgICAgICAgICAgcnNsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcnNsdCA9IGZ1bmMuYXBwbHkoCisgICAgICAgICAgICAgICQuZXh0ZW5kKHt9LCB0aGlzLCB7IAorICAgICAgICAgICAgICAgIF9fY2FsbGJhY2sgOiBmdW5jdGlvbiAoZGF0YSkgeyAKKyAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpLnRyaWdnZXJIYW5kbGVyKCBpICsgJy5qc3RyZWUnLCB7ICJpbnN0IiA6IHRoaXMsICJhcmdzIiA6IGFyZ3MsICJyc2x0IiA6IGRhdGEsICJybGJrIiA6IHJsYmsgfSk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBfX3JvbGxiYWNrIDogZnVuY3Rpb24gKCkgeyAKKyAgICAgICAgICAgICAgICAgIHJsYmsgPSB0aGlzLmdldF9yb2xsYmFjaygpOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHJsYms7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBfX2NhbGxfb2xkIDogZnVuY3Rpb24gKHJlcGxhY2VfYXJndW1lbnRzKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuYy5vbGQuYXBwbHkodGhpcywgKHJlcGxhY2VfYXJndW1lbnRzID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSA6IGFyZ3MgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSksIGFyZ3MpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIHJldHVybiB0aGUgcmVzdWx0CisgICAgICAgICAgcmV0dXJuIHJzbHQ7CisgICAgICAgIH07CisgICAgICAgICQuanN0cmVlLl9mbltpXS5vbGQgPSB2YWwub2xkOworICAgICAgICAkLmpzdHJlZS5fZm5baV0ucGx1Z2luID0gcG5hbWU7CisgICAgICB9KTsKKyAgICB9LAorICAgIHJvbGxiYWNrIDogZnVuY3Rpb24gKHJiKSB7CisgICAgICBpZihyYikgeworICAgICAgICBpZighJC5pc0FycmF5KHJiKSkgeyByYiA9IFsgcmIgXTsgfQorICAgICAgICAkLmVhY2gocmIsIGZ1bmN0aW9uIChpLCB2YWwpIHsKKyAgICAgICAgICBpbnN0YW5jZXNbdmFsLmldLnNldF9yb2xsYmFjayh2YWwuaCwgdmFsLmQpOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisgIH07CisgIC8vIHNldCB0aGUgcHJvdG90eXBlIGZvciBhbGwgaW5zdGFuY2VzCisgICQuanN0cmVlLl9mbiA9ICQuanN0cmVlLl9pbnN0YW5jZS5wcm90b3R5cGUgPSB7fTsKKworICAvLyBjc3MgZnVuY3Rpb25zIC0gdXNlZCBpbnRlcm5hbGx5CisKKyAgLy8gbG9hZCB0aGUgY3NzIHdoZW4gRE9NIGlzIHJlYWR5CisgICQoZnVuY3Rpb24oKSB7CisgICAgLy8gY29kZSBpcyBjb3BpZWQgZm9ybSBqUXVlcnkgKCQuYnJvd3NlciBpcyBkZXByZWNhdGVkICsgdGhlcmUgaXMgYSBidWcgaW4gSUUpCisgICAgdmFyIHUgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksCisgICAgICB2ID0gKHUubWF0Y2goIC8uKz8oPzpydnxpdHxyYXxpZSlbXC86IF0oW1xkLl0rKS8gKSB8fCBbMCwnMCddKVsxXSwKKyAgICAgIGNzc19zdHJpbmcgPSAnJyArIAorICAgICAgICAnLmpzdHJlZSB1bCwgLmpzdHJlZSBsaSB7IGRpc3BsYXk6YmxvY2s7IG1hcmdpbjowIDAgMCAwOyBwYWRkaW5nOjAgMCAwIDA7IGxpc3Qtc3R5bGUtdHlwZTpub25lOyB9ICcgKyAKKyAgICAgICAgJy5qc3RyZWUgbGkgeyBkaXNwbGF5OmJsb2NrOyBtaW4taGVpZ2h0OjE4cHg7IGxpbmUtaGVpZ2h0OjE4cHg7IHdoaXRlLXNwYWNlOm5vd3JhcDsgbWFyZ2luLWxlZnQ6MThweDsgfSAnICsgCisgICAgICAgICcuanN0cmVlLXJ0bCBsaSB7IG1hcmdpbi1sZWZ0OjA7IG1hcmdpbi1yaWdodDoxOHB4OyB9ICcgKyAKKyAgICAgICAgJy5qc3RyZWUgPiB1bCA+IGxpIHsgbWFyZ2luLWxlZnQ6MHB4OyB9ICcgKyAKKyAgICAgICAgJy5qc3RyZWUtcnRsID4gdWwgPiBsaSB7IG1hcmdpbi1yaWdodDowcHg7IH0gJyArIAorICAgICAgICAnLmpzdHJlZSBpbnMgeyBkaXNwbGF5OmlubGluZS1ibG9jazsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IHdpZHRoOjE4cHg7IGhlaWdodDoxOHB4OyBtYXJnaW46MCAwIDAgMDsgcGFkZGluZzowOyB9ICcgKyAKKyAgICAgICAgJy5qc3RyZWUgYSB7IGRpc3BsYXk6aW5saW5lLWJsb2NrOyBsaW5lLWhlaWdodDoxNnB4OyBoZWlnaHQ6MTZweDsgY29sb3I6YmxhY2s7IHdoaXRlLXNwYWNlOm5vd3JhcDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IHBhZGRpbmc6MXB4IDJweDsgbWFyZ2luOjA7IH0gJyArIAorICAgICAgICAnLmpzdHJlZSBhOmZvY3VzIHsgb3V0bGluZTogbm9uZTsgfSAnICsgCisgICAgICAgICcuanN0cmVlIGEgPiBpbnMgeyBoZWlnaHQ6MTZweDsgd2lkdGg6MTZweDsgfSAnICsgCisgICAgICAgICcuanN0cmVlIGEgPiAuanN0cmVlLWljb24geyBtYXJnaW4tcmlnaHQ6M3B4OyB9ICcgKyAKKyAgICAgICAgJy5qc3RyZWUtcnRsIGEgPiAuanN0cmVlLWljb24geyBtYXJnaW4tbGVmdDozcHg7IG1hcmdpbi1yaWdodDowOyB9ICcgKyAKKyAgICAgICAgJ2xpLmpzdHJlZS1vcGVuID4gdWwgeyBkaXNwbGF5OmJsb2NrOyB9ICcgKyAKKyAgICAgICAgJ2xpLmpzdHJlZS1jbG9zZWQgPiB1bCB7IGRpc3BsYXk6bm9uZTsgfSAnOworICAgIC8vIENvcnJlY3QgSUUgNiAoZG9lcyBub3Qgc3VwcG9ydCB0aGUgPiBDU1Mgc2VsZWN0b3IpCisgICAgaWYoL21zaWUvLnRlc3QodSkgJiYgcGFyc2VJbnQodiwgMTApID09IDYpIHsgCisgICAgICBpc19pZTYgPSB0cnVlOworICAgICAgY3NzX3N0cmluZyArPSAnJyArIAorICAgICAgICAnLmpzdHJlZSBsaSB7IGhlaWdodDoxOHB4OyBtYXJnaW4tbGVmdDowOyBtYXJnaW4tcmlnaHQ6MDsgfSAnICsgCisgICAgICAgICcuanN0cmVlIGxpIGxpIHsgbWFyZ2luLWxlZnQ6MThweDsgfSAnICsgCisgICAgICAgICcuanN0cmVlLXJ0bCBsaSBsaSB7IG1hcmdpbi1sZWZ0OjBweDsgbWFyZ2luLXJpZ2h0OjE4cHg7IH0gJyArIAorICAgICAgICAnbGkuanN0cmVlLW9wZW4gdWwgeyBkaXNwbGF5OmJsb2NrOyB9ICcgKyAKKyAgICAgICAgJ2xpLmpzdHJlZS1jbG9zZWQgdWwgeyBkaXNwbGF5Om5vbmUgIWltcG9ydGFudDsgfSAnICsgCisgICAgICAgICcuanN0cmVlIGxpIGEgeyBkaXNwbGF5OmlubGluZTsgYm9yZGVyLXdpZHRoOjAgIWltcG9ydGFudDsgcGFkZGluZzowcHggMnB4ICFpbXBvcnRhbnQ7IH0gJyArIAorICAgICAgICAnLmpzdHJlZSBsaSBhIGlucyB7IGhlaWdodDoxNnB4OyB3aWR0aDoxNnB4OyBtYXJnaW4tcmlnaHQ6M3B4OyB9ICcgKyAKKyAgICAgICAgJy5qc3RyZWUtcnRsIGxpIGEgaW5zIHsgbWFyZ2luLXJpZ2h0OjBweDsgbWFyZ2luLWxlZnQ6M3B4OyB9ICc7CisgICAgfQorICAgIC8vIENvcnJlY3QgSUUgNyAoc2hpZnRzIGFuY2hvciBub2RlcyBvbmhvdmVyKQorICAgIGlmKC9tc2llLy50ZXN0KHUpICYmIHBhcnNlSW50KHYsIDEwKSA9PSA3KSB7IAorICAgICAgY3NzX3N0cmluZyArPSAnLmpzdHJlZSBsaSBhIHsgYm9yZGVyLXdpZHRoOjAgIWltcG9ydGFudDsgcGFkZGluZzowcHggMnB4ICFpbXBvcnRhbnQ7IH0gJzsKKyAgICB9CisgICAgJC52YWthdGEuY3NzLmFkZF9zaGVldCh7IHN0ciA6IGNzc19zdHJpbmcgfSk7CisgIH0pOworCisgIC8vIGNvcmUgZnVuY3Rpb25zIChvcGVuLCBjbG9zZSwgY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSkKKyAgJC5qc3RyZWUucGx1Z2luKCJjb3JlIiwgeworICAgIF9faW5pdCA6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuZGF0YS5jb3JlLnRvX29wZW4gPSAkLm1hcCgkLm1ha2VBcnJheSh0aGlzLmdldF9zZXR0aW5ncygpLmNvcmUuaW5pdGlhbGx5X29wZW4pLCBmdW5jdGlvbiAobikgeyByZXR1cm4gIiMiICsgbi50b1N0cmluZygpLnJlcGxhY2UoL14jLywiIikucmVwbGFjZSgnXFwvJywnLycpLnJlcGxhY2UoJy8nLCdcXC8nKTsgfSk7CisgICAgfSwKKyAgICBkZWZhdWx0cyA6IHsgCisgICAgICBodG1sX3RpdGxlcyAgOiBmYWxzZSwKKyAgICAgIGFuaW1hdGlvbiAgOiA1MDAsCisgICAgICBpbml0aWFsbHlfb3BlbiA6IFtdLAorICAgICAgcnRsICAgICAgOiBmYWxzZSwKKyAgICAgIHN0cmluZ3MgICAgOiB7CisgICAgICAgIGxvYWRpbmcgICAgOiAiTG9hZGluZyAuLi4iLAorICAgICAgICBuZXdfbm9kZSAgOiAiTmV3IG5vZGUiCisgICAgICB9CisgICAgfSwKKyAgICBfZm4gOiB7IAorICAgICAgaW5pdCAgOiBmdW5jdGlvbiAoKSB7IAorICAgICAgICB0aGlzLnNldF9mb2N1cygpOyAKKyAgICAgICAgaWYodGhpcy5fZ2V0X3NldHRpbmdzKCkuY29yZS5ydGwpIHsKKyAgICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKS5hZGRDbGFzcygianN0cmVlLXJ0bCIpLmNzcygiZGlyZWN0aW9uIiwgInJ0bCIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpLmh0bWwoIjx1bD48bGkgY2xhc3M9J2pzdHJlZS1sYXN0IGpzdHJlZS1sZWFmJz48aW5zPiYjMTYwOzwvaW5zPjxhIGNsYXNzPSdqc3RyZWUtbG9hZGluZycgaHJlZj0nIyc+PGlucyBjbGFzcz0nanN0cmVlLWljb24nPiYjMTYwOzwvaW5zPiIgKyB0aGlzLl9nZXRfc2V0dGluZ3MoKS5jb3JlLnN0cmluZ3MubG9hZGluZyArICI8L2E+PC9saT48L3VsPiIpOworICAgICAgICB0aGlzLmRhdGEuY29yZS5saV9oZWlnaHQgPSB0aGlzLmdldF9jb250YWluZXIoKS5maW5kKCJ1bCBsaS5qc3RyZWUtY2xvc2VkLCB1bCBsaS5qc3RyZWUtbGVhZiIpLmVxKDApLmhlaWdodCgpIHx8IDE4OworCisgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpCisgICAgICAgICAgLmRlbGVnYXRlKCJsaSA+IGlucyIsICJjbGljay5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICAgICAgICB2YXIgdHJndCA9ICQoZXZlbnQudGFyZ2V0KTsKKyAgICAgICAgICAgICAgaWYodHJndC5pcygiaW5zIikgJiYgZXZlbnQucGFnZVkgLSB0cmd0Lm9mZnNldCgpLnRvcCA8IHRoaXMuZGF0YS5jb3JlLmxpX2hlaWdodCkgeyB0aGlzLnRvZ2dsZV9ub2RlKHRyZ3QpOyB9CisgICAgICAgICAgICB9LCB0aGlzKSkKKyAgICAgICAgICAuYmluZCgibW91c2Vkb3duLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKCkgeyAKKyAgICAgICAgICAgICAgdGhpcy5zZXRfZm9jdXMoKTsgLy8gVGhpcyB1c2VkIHRvIGJlIHNldFRpbWVvdXQoc2V0X2ZvY3VzLDApIC0gd2h5PworICAgICAgICAgICAgfSwgdGhpcykpCisgICAgICAgICAgLmJpbmQoImRibGNsaWNrLmpzdHJlZSIsIGZ1bmN0aW9uIChldmVudCkgeyAKKyAgICAgICAgICAgIHZhciBzZWw7CisgICAgICAgICAgICBpZihkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KSB7IGRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSgpOyB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgaWYod2luZG93LmdldFNlbGVjdGlvbikgeworICAgICAgICAgICAgICAgIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICB0cnkgeyAKKyAgICAgICAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKKyAgICAgICAgICAgICAgICAgIHNlbC5jb2xsYXBzZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgdGhpcy5fX2NhbGxiYWNrKCk7CisgICAgICAgIHRoaXMubG9hZF9ub2RlKC0xLCBmdW5jdGlvbiAoKSB7IHRoaXMubG9hZGVkKCk7IHRoaXMucmVvcGVuKCk7IH0pOworICAgICAgfSwKKyAgICAgIGRlc3Ryb3kgIDogZnVuY3Rpb24gKCkgeyAKKyAgICAgICAgdmFyIGksCisgICAgICAgICAgbiA9IHRoaXMuZ2V0X2luZGV4KCksCisgICAgICAgICAgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLAorICAgICAgICAgIF90aGlzID0gdGhpczsKKworICAgICAgICAkLmVhY2gocy5wbHVnaW5zLCBmdW5jdGlvbiAoaSwgdmFsKSB7CisgICAgICAgICAgdHJ5IHsgcGx1Z2luc1t2YWxdLl9fZGVzdHJveS5hcHBseShfdGhpcyk7IH0gY2F0Y2goZXJyKSB7IH0KKyAgICAgICAgfSk7CisgICAgICAgIHRoaXMuX19jYWxsYmFjaygpOworICAgICAgICAvLyBzZXQgZm9jdXMgdG8gYW5vdGhlciBpbnN0YW5jZSBpZiB0aGlzIG9uZSBpcyBmb2N1c2VkCisgICAgICAgIGlmKHRoaXMuaXNfZm9jdXNlZCgpKSB7IAorICAgICAgICAgIGZvcihpIGluIGluc3RhbmNlcykgeyAKKyAgICAgICAgICAgIGlmKGluc3RhbmNlcy5oYXNPd25Qcm9wZXJ0eShpKSAmJiBpICE9IG4pIHsgCisgICAgICAgICAgICAgIGluc3RhbmNlc1tpXS5zZXRfZm9jdXMoKTsgCisgICAgICAgICAgICAgIGJyZWFrOyAKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGlmIG5vIG90aGVyIGluc3RhbmNlIGZvdW5kCisgICAgICAgIGlmKG4gPT09IGZvY3VzZWRfaW5zdGFuY2UpIHsgZm9jdXNlZF9pbnN0YW5jZSA9IC0xOyB9CisgICAgICAgIC8vIHJlbW92ZSBhbGwgdHJhY2VzIG9mIGpzdHJlZSBpbiB0aGUgRE9NIChvbmx5IHRoZSBvbmVzIHNldCB1c2luZyBqc3RyZWUqKSBhbmQgY2xlYW5zIGFsbCBldmVudHMKKyAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkKKyAgICAgICAgICAudW5iaW5kKCIuanN0cmVlIikKKyAgICAgICAgICAudW5kZWxlZ2F0ZSgiLmpzdHJlZSIpCisgICAgICAgICAgLnJlbW92ZURhdGEoImpzdHJlZS1pbnN0YW5jZS1pZCIpCisgICAgICAgICAgLmZpbmQoIltjbGFzc149J2pzdHJlZSddIikKKyAgICAgICAgICAgIC5hbmRTZWxmKCkKKyAgICAgICAgICAgIC5hdHRyKCJjbGFzcyIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuY2xhc3NOYW1lLnJlcGxhY2UoL2pzdHJlZVteIF0qfCQvaWcsJycpOyB9KTsKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSBhY3R1YWwgZGF0YQorICAgICAgICBpbnN0YW5jZXNbbl0gPSBudWxsOworICAgICAgICBkZWxldGUgaW5zdGFuY2VzW25dOworICAgICAgfSwKKyAgICAgIHNhdmVfb3BlbmVkIDogZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOworICAgICAgICB0aGlzLmRhdGEuY29yZS50b19vcGVuID0gW107CisgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpLmZpbmQoIi5qc3RyZWUtb3BlbiIpLmVhY2goZnVuY3Rpb24gKCkgeyAKKyAgICAgICAgICBfdGhpcy5kYXRhLmNvcmUudG9fb3Blbi5wdXNoKCIjIiArIHRoaXMuaWQudG9TdHJpbmcoKS5yZXBsYWNlKC9eIy8sIiIpLnJlcGxhY2UoJ1xcLycsJy8nKS5yZXBsYWNlKCcvJywnXFwvJykpOyAKKyAgICAgICAgfSk7CisgICAgICAgIHRoaXMuX19jYWxsYmFjayhfdGhpcy5kYXRhLmNvcmUudG9fb3Blbik7CisgICAgICB9LAorICAgICAgcmVvcGVuIDogZnVuY3Rpb24gKGlzX2NhbGxiYWNrKSB7CisgICAgICAgIHZhciBfdGhpcyA9IHRoaXMsCisgICAgICAgICAgZG9uZSA9IHRydWUsCisgICAgICAgICAgY3VycmVudCA9IFtdLAorICAgICAgICAgIHJlbWFpbmluZyA9IFtdOworICAgICAgICBpZighaXNfY2FsbGJhY2spIHsgdGhpcy5kYXRhLmNvcmUucmVvcGVuID0gZmFsc2U7IHRoaXMuZGF0YS5jb3JlLnJlZnJlc2hpbmcgPSB0cnVlOyB9CisgICAgICAgIGlmKHRoaXMuZGF0YS5jb3JlLnRvX29wZW4ubGVuZ3RoKSB7CisgICAgICAgICAgJC5lYWNoKHRoaXMuZGF0YS5jb3JlLnRvX29wZW4sIGZ1bmN0aW9uIChpLCB2YWwpIHsKKyAgICAgICAgICAgIGlmKHZhbCA9PSAiIyIpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIGlmKCQodmFsKS5sZW5ndGggJiYgJCh2YWwpLmlzKCIuanN0cmVlLWNsb3NlZCIpKSB7IGN1cnJlbnQucHVzaCh2YWwpOyB9CisgICAgICAgICAgICBlbHNlIHsgcmVtYWluaW5nLnB1c2godmFsKTsgfQorICAgICAgICAgIH0pOworICAgICAgICAgIGlmKGN1cnJlbnQubGVuZ3RoKSB7CisgICAgICAgICAgICB0aGlzLmRhdGEuY29yZS50b19vcGVuID0gcmVtYWluaW5nOworICAgICAgICAgICAgJC5lYWNoKGN1cnJlbnQsIGZ1bmN0aW9uIChpLCB2YWwpIHsgCisgICAgICAgICAgICAgIF90aGlzLm9wZW5fbm9kZSh2YWwsIGZ1bmN0aW9uICgpIHsgX3RoaXMucmVvcGVuKHRydWUpOyB9LCB0cnVlKTsgCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoZG9uZSkgeyAKKyAgICAgICAgICAvLyBUT0RPOiBmaW5kIGEgbW9yZSBlbGVnYW50IGFwcHJvYWNoIHRvIHN5bmNyb25pemluZyByZXR1cm5pbmcgcmVxdWVzdHMKKyAgICAgICAgICBpZih0aGlzLmRhdGEuY29yZS5yZW9wZW4pIHsgY2xlYXJUaW1lb3V0KHRoaXMuZGF0YS5jb3JlLnJlb3Blbik7IH0KKyAgICAgICAgICB0aGlzLmRhdGEuY29yZS5yZW9wZW4gPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgX3RoaXMuX19jYWxsYmFjayh7fSwgX3RoaXMpOyB9LCA1MCk7CisgICAgICAgICAgdGhpcy5kYXRhLmNvcmUucmVmcmVzaGluZyA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9LAorICAgICAgcmVmcmVzaCA6IGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgdmFyIF90aGlzID0gdGhpczsKKyAgICAgICAgdGhpcy5zYXZlX29wZW5lZCgpOworICAgICAgICBpZighb2JqKSB7IG9iaiA9IC0xOyB9CisgICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7CisgICAgICAgIGlmKCFvYmopIHsgb2JqID0gLTE7IH0KKyAgICAgICAgaWYob2JqICE9PSAtMSkgeyBvYmouY2hpbGRyZW4oIlVMIikucmVtb3ZlKCk7IH0KKyAgICAgICAgdGhpcy5sb2FkX25vZGUob2JqLCBmdW5jdGlvbiAoKSB7IF90aGlzLl9fY2FsbGJhY2soeyAib2JqIiA6IG9ian0pOyBfdGhpcy5yZW9wZW4oKTsgfSk7CisgICAgICB9LAorICAgICAgLy8gRHVtbXkgZnVuY3Rpb24gdG8gZmlyZSBhZnRlciB0aGUgZmlyc3QgbG9hZCAoc28gdGhhdCB0aGVyZSBpcyBhIGpzdHJlZS5sb2FkZWQgZXZlbnQpCisgICAgICBsb2FkZWQgIDogZnVuY3Rpb24gKCkgeyAKKyAgICAgICAgdGhpcy5fX2NhbGxiYWNrKCk7IAorICAgICAgfSwKKyAgICAgIC8vIGRlYWwgd2l0aCBmb2N1cworICAgICAgc2V0X2ZvY3VzICA6IGZ1bmN0aW9uICgpIHsgCisgICAgICAgIHZhciBmID0gJC5qc3RyZWUuX2ZvY3VzZWQoKTsKKyAgICAgICAgaWYoZiAmJiBmICE9PSB0aGlzKSB7CisgICAgICAgICAgZi5nZXRfY29udGFpbmVyKCkucmVtb3ZlQ2xhc3MoImpzdHJlZS1mb2N1c2VkIik7IAorICAgICAgICB9CisgICAgICAgIGlmKGYgIT09IHRoaXMpIHsKKyAgICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKS5hZGRDbGFzcygianN0cmVlLWZvY3VzZWQiKTsgCisgICAgICAgICAgZm9jdXNlZF9pbnN0YW5jZSA9IHRoaXMuZ2V0X2luZGV4KCk7IAorICAgICAgICB9CisgICAgICAgIHRoaXMuX19jYWxsYmFjaygpOworICAgICAgfSwKKyAgICAgIGlzX2ZvY3VzZWQgIDogZnVuY3Rpb24gKCkgeyAKKyAgICAgICAgcmV0dXJuIGZvY3VzZWRfaW5zdGFuY2UgPT0gdGhpcy5nZXRfaW5kZXgoKTsgCisgICAgICB9LAorCisgICAgICAvLyB0cmF2ZXJzZQorICAgICAgX2dldF9ub2RlICAgIDogZnVuY3Rpb24gKG9iaikgeyAKKyAgICAgICAgdmFyICRvYmogPSAkKG9iaiwgdGhpcy5nZXRfY29udGFpbmVyKCkpOyAKKyAgICAgICAgaWYoJG9iai5pcygiLmpzdHJlZSIpIHx8IG9iaiA9PSAtMSkgeyByZXR1cm4gLTE7IH0gCisgICAgICAgICRvYmogPSAkb2JqLmNsb3Nlc3QoImxpIiwgdGhpcy5nZXRfY29udGFpbmVyKCkpOyAKKyAgICAgICAgcmV0dXJuICRvYmoubGVuZ3RoID8gJG9iaiA6IGZhbHNlOyAKKyAgICAgIH0sCisgICAgICBfZ2V0X25leHQgICAgOiBmdW5jdGlvbiAob2JqLCBzdHJpY3QpIHsKKyAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsKKyAgICAgICAgaWYob2JqID09PSAtMSkgeyByZXR1cm4gdGhpcy5nZXRfY29udGFpbmVyKCkuZmluZCgiPiB1bCA+IGxpOmZpcnN0LWNoaWxkIik7IH0KKyAgICAgICAgaWYoIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIGlmKHN0cmljdCkgeyByZXR1cm4gKG9iai5uZXh0QWxsKCJsaSIpLnNpemUoKSA+IDApID8gb2JqLm5leHRBbGwoImxpOmVxKDApIikgOiBmYWxzZTsgfQorCisgICAgICAgIGlmKG9iai5oYXNDbGFzcygianN0cmVlLW9wZW4iKSkgeyByZXR1cm4gb2JqLmZpbmQoImxpOmVxKDApIik7IH0KKyAgICAgICAgZWxzZSBpZihvYmoubmV4dEFsbCgibGkiKS5zaXplKCkgPiAwKSB7IHJldHVybiBvYmoubmV4dEFsbCgibGk6ZXEoMCkiKTsgfQorICAgICAgICBlbHNlIHsgcmV0dXJuIG9iai5wYXJlbnRzVW50aWwoIi5qc3RyZWUiLCJsaSIpLm5leHQoImxpIikuZXEoMCk7IH0KKyAgICAgIH0sCisgICAgICBfZ2V0X3ByZXYgICAgOiBmdW5jdGlvbiAob2JqLCBzdHJpY3QpIHsKKyAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsKKyAgICAgICAgaWYob2JqID09PSAtMSkgeyByZXR1cm4gdGhpcy5nZXRfY29udGFpbmVyKCkuZmluZCgiPiB1bCA+IGxpOmxhc3QtY2hpbGQiKTsgfQorICAgICAgICBpZighb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgaWYoc3RyaWN0KSB7IHJldHVybiAob2JqLnByZXZBbGwoImxpIikubGVuZ3RoID4gMCkgPyBvYmoucHJldkFsbCgibGk6ZXEoMCkiKSA6IGZhbHNlOyB9CisKKyAgICAgICAgaWYob2JqLnByZXYoImxpIikubGVuZ3RoKSB7CisgICAgICAgICAgb2JqID0gb2JqLnByZXYoImxpIikuZXEoMCk7CisgICAgICAgICAgd2hpbGUob2JqLmhhc0NsYXNzKCJqc3RyZWUtb3BlbiIpKSB7IG9iaiA9IG9iai5jaGlsZHJlbigidWw6ZXEoMCkiKS5jaGlsZHJlbigibGk6bGFzdCIpOyB9CisgICAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgdmFyIG8gPSBvYmoucGFyZW50c1VudGlsKCIuanN0cmVlIiwibGk6ZXEoMCkiKTsgcmV0dXJuIG8ubGVuZ3RoID8gbyA6IGZhbHNlOyB9CisgICAgICB9LAorICAgICAgX2dldF9wYXJlbnQgICAgOiBmdW5jdGlvbiAob2JqKSB7CisgICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7CisgICAgICAgIGlmKG9iaiA9PSAtMSB8fCAhb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgdmFyIG8gPSBvYmoucGFyZW50c1VudGlsKCIuanN0cmVlIiwgImxpOmVxKDApIik7CisgICAgICAgIHJldHVybiBvLmxlbmd0aCA/IG8gOiAtMTsKKyAgICAgIH0sCisgICAgICBfZ2V0X2NoaWxkcmVuICA6IGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsKKyAgICAgICAgaWYob2JqID09PSAtMSkgeyByZXR1cm4gdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsOmVxKDApIikuY2hpbGRyZW4oImxpIik7IH0KKyAgICAgICAgaWYoIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIHJldHVybiBvYmouY2hpbGRyZW4oInVsOmVxKDApIikuY2hpbGRyZW4oImxpIik7CisgICAgICB9LAorICAgICAgZ2V0X3BhdGggICAgOiBmdW5jdGlvbiAob2JqLCBpZF9tb2RlKSB7CisgICAgICAgIHZhciBwID0gW10sCisgICAgICAgICAgX3RoaXMgPSB0aGlzOworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICBpZihvYmogPT09IC0xIHx8ICFvYmogfHwgIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIG9iai5wYXJlbnRzVW50aWwoIi5qc3RyZWUiLCAibGkiKS5lYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBwLnB1c2goIGlkX21vZGUgPyB0aGlzLmlkIDogX3RoaXMuZ2V0X3RleHQodGhpcykgKTsKKyAgICAgICAgfSk7CisgICAgICAgIHAucmV2ZXJzZSgpOworICAgICAgICBwLnB1c2goIGlkX21vZGUgPyBvYmouYXR0cigiaWQiKSA6IHRoaXMuZ2V0X3RleHQob2JqKSApOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0sCisKKyAgICAgIGlzX29wZW4gICAgOiBmdW5jdGlvbiAob2JqKSB7IG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7IHJldHVybiBvYmogJiYgb2JqICE9PSAtMSAmJiBvYmouaGFzQ2xhc3MoImpzdHJlZS1vcGVuIik7IH0sCisgICAgICBpc19jbG9zZWQgIDogZnVuY3Rpb24gKG9iaikgeyBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOyByZXR1cm4gb2JqICYmIG9iaiAhPT0gLTEgJiYgb2JqLmhhc0NsYXNzKCJqc3RyZWUtY2xvc2VkIik7IH0sCisgICAgICBpc19sZWFmICAgIDogZnVuY3Rpb24gKG9iaikgeyBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOyByZXR1cm4gb2JqICYmIG9iaiAhPT0gLTEgJiYgb2JqLmhhc0NsYXNzKCJqc3RyZWUtbGVhZiIpOyB9LAorICAgICAgLy8gb3Blbi9jbG9zZQorICAgICAgb3Blbl9ub2RlICA6IGZ1bmN0aW9uIChvYmosIGNhbGxiYWNrLCBza2lwX2FuaW1hdGlvbikgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICBpZighb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgaWYoIW9iai5oYXNDbGFzcygianN0cmVlLWNsb3NlZCIpKSB7IGlmKGNhbGxiYWNrKSB7IGNhbGxiYWNrLmNhbGwoKTsgfSByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgdmFyIHMgPSBza2lwX2FuaW1hdGlvbiB8fCBpc19pZTYgPyAwIDogdGhpcy5fZ2V0X3NldHRpbmdzKCkuY29yZS5hbmltYXRpb24sCisgICAgICAgICAgdCA9IHRoaXM7CisgICAgICAgIGlmKCF0aGlzLl9pc19sb2FkZWQob2JqKSkgeworICAgICAgICAgIG9iai5jaGlsZHJlbigiYSIpLmFkZENsYXNzKCJqc3RyZWUtbG9hZGluZyIpOworICAgICAgICAgIHRoaXMubG9hZF9ub2RlKG9iaiwgZnVuY3Rpb24gKCkgeyB0Lm9wZW5fbm9kZShvYmosIGNhbGxiYWNrLCBza2lwX2FuaW1hdGlvbik7IH0sIGNhbGxiYWNrKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZihzKSB7IG9iai5jaGlsZHJlbigidWwiKS5jc3MoImRpc3BsYXkiLCJub25lIik7IH0KKyAgICAgICAgICBvYmoucmVtb3ZlQ2xhc3MoImpzdHJlZS1jbG9zZWQiKS5hZGRDbGFzcygianN0cmVlLW9wZW4iKS5jaGlsZHJlbigiYSIpLnJlbW92ZUNsYXNzKCJqc3RyZWUtbG9hZGluZyIpOworICAgICAgICAgIGlmKHMpIHsgb2JqLmNoaWxkcmVuKCJ1bCIpLnN0b3AodHJ1ZSkuc2xpZGVEb3duKHMsIGZ1bmN0aW9uICgpIHsgdGhpcy5zdHlsZS5kaXNwbGF5ID0gIiI7IH0pOyB9CisgICAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7CisgICAgICAgICAgaWYoY2FsbGJhY2spIHsgY2FsbGJhY2suY2FsbCgpOyB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBjbG9zZV9ub2RlICA6IGZ1bmN0aW9uIChvYmosIHNraXBfYW5pbWF0aW9uKSB7CisgICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7CisgICAgICAgIHZhciBzID0gc2tpcF9hbmltYXRpb24gfHwgaXNfaWU2ID8gMCA6IHRoaXMuX2dldF9zZXR0aW5ncygpLmNvcmUuYW5pbWF0aW9uOworICAgICAgICBpZighb2JqLmxlbmd0aCB8fCAhb2JqLmhhc0NsYXNzKCJqc3RyZWUtb3BlbiIpKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICBpZihzKSB7IG9iai5jaGlsZHJlbigidWwiKS5hdHRyKCJzdHlsZSIsImRpc3BsYXk6YmxvY2sgIWltcG9ydGFudCIpOyB9CisgICAgICAgIG9iai5yZW1vdmVDbGFzcygianN0cmVlLW9wZW4iKS5hZGRDbGFzcygianN0cmVlLWNsb3NlZCIpOworICAgICAgICBpZihzKSB7IG9iai5jaGlsZHJlbigidWwiKS5zdG9wKHRydWUpLnNsaWRlVXAocywgZnVuY3Rpb24gKCkgeyB0aGlzLnN0eWxlLmRpc3BsYXkgPSAiIjsgfSk7IH0KKyAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7CisgICAgICB9LAorICAgICAgdG9nZ2xlX25vZGUgIDogZnVuY3Rpb24gKG9iaikgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICBpZihvYmouaGFzQ2xhc3MoImpzdHJlZS1jbG9zZWQiKSkgeyByZXR1cm4gdGhpcy5vcGVuX25vZGUob2JqKTsgfQorICAgICAgICBpZihvYmouaGFzQ2xhc3MoImpzdHJlZS1vcGVuIikpIHsgcmV0dXJuIHRoaXMuY2xvc2Vfbm9kZShvYmopOyB9CisgICAgICB9LAorICAgICAgb3Blbl9hbGwgIDogZnVuY3Rpb24gKG9iaiwgb3JpZ2luYWxfb2JqKSB7CisgICAgICAgIG9iaiA9IG9iaiA/IHRoaXMuX2dldF9ub2RlKG9iaikgOiB0aGlzLmdldF9jb250YWluZXIoKTsKKyAgICAgICAgaWYoIW9iaiB8fCBvYmogPT09IC0xKSB7IG9iaiA9IHRoaXMuZ2V0X2NvbnRhaW5lcigpOyB9CisgICAgICAgIGlmKG9yaWdpbmFsX29iaikgeyAKKyAgICAgICAgICBvYmogPSBvYmouZmluZCgibGkuanN0cmVlLWNsb3NlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIG9yaWdpbmFsX29iaiA9IG9iajsKKyAgICAgICAgICBpZihvYmouaXMoIi5qc3RyZWUtY2xvc2VkIikpIHsgb2JqID0gb2JqLmZpbmQoImxpLmpzdHJlZS1jbG9zZWQiKS5hbmRTZWxmKCk7IH0KKyAgICAgICAgICBlbHNlIHsgb2JqID0gb2JqLmZpbmQoImxpLmpzdHJlZS1jbG9zZWQiKTsgfQorICAgICAgICB9CisgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisgICAgICAgIG9iai5lYWNoKGZ1bmN0aW9uICgpIHsgCisgICAgICAgICAgdmFyIF9fdGhpcyA9IHRoaXM7IAorICAgICAgICAgIGlmKCFfdGhpcy5faXNfbG9hZGVkKHRoaXMpKSB7IF90aGlzLm9wZW5fbm9kZSh0aGlzLCBmdW5jdGlvbigpIHsgX3RoaXMub3Blbl9hbGwoX190aGlzLCBvcmlnaW5hbF9vYmopOyB9LCB0cnVlKTsgfQorICAgICAgICAgIGVsc2UgeyBfdGhpcy5vcGVuX25vZGUodGhpcywgZmFsc2UsIHRydWUpOyB9CisgICAgICAgIH0pOworICAgICAgICAvLyBzbyB0aGF0IGNhbGxiYWNrIGlzIGZpcmVkIEFGVEVSIGFsbCBub2RlcyBhcmUgb3BlbgorICAgICAgICBpZihvcmlnaW5hbF9vYmouZmluZCgnbGkuanN0cmVlLWNsb3NlZCcpLmxlbmd0aCA9PT0gMCkgeyB0aGlzLl9fY2FsbGJhY2soeyAib2JqIiA6IG9yaWdpbmFsX29iaiB9KTsgfQorICAgICAgfSwKKyAgICAgIGNsb3NlX2FsbCAgOiBmdW5jdGlvbiAob2JqKSB7CisgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CisgICAgICAgIG9iaiA9IG9iaiA/IHRoaXMuX2dldF9ub2RlKG9iaikgOiB0aGlzLmdldF9jb250YWluZXIoKTsKKyAgICAgICAgaWYoIW9iaiB8fCBvYmogPT09IC0xKSB7IG9iaiA9IHRoaXMuZ2V0X2NvbnRhaW5lcigpOyB9CisgICAgICAgIG9iai5maW5kKCJsaS5qc3RyZWUtb3BlbiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uICgpIHsgX3RoaXMuY2xvc2Vfbm9kZSh0aGlzKTsgfSk7CisgICAgICAgIHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqIH0pOworICAgICAgfSwKKyAgICAgIGNsZWFuX25vZGUgIDogZnVuY3Rpb24gKG9iaikgeworICAgICAgICBvYmogPSBvYmogJiYgb2JqICE9IC0xID8gJChvYmopIDogdGhpcy5nZXRfY29udGFpbmVyKCk7CisgICAgICAgIG9iaiA9IG9iai5pcygibGkiKSA/IG9iai5maW5kKCJsaSIpLmFuZFNlbGYoKSA6IG9iai5maW5kKCJsaSIpOworICAgICAgICBvYmoucmVtb3ZlQ2xhc3MoImpzdHJlZS1sYXN0IikKKyAgICAgICAgICAuZmlsdGVyKCJsaTpsYXN0LWNoaWxkIikuYWRkQ2xhc3MoImpzdHJlZS1sYXN0IikuZW5kKCkKKyAgICAgICAgICAuZmlsdGVyKCI6aGFzKGxpKSIpCisgICAgICAgICAgICAubm90KCIuanN0cmVlLW9wZW4iKS5yZW1vdmVDbGFzcygianN0cmVlLWxlYWYiKS5hZGRDbGFzcygianN0cmVlLWNsb3NlZCIpOworICAgICAgICBvYmoubm90KCIuanN0cmVlLW9wZW4sIC5qc3RyZWUtY2xvc2VkIikuYWRkQ2xhc3MoImpzdHJlZS1sZWFmIikuY2hpbGRyZW4oInVsIikucmVtb3ZlKCk7CisgICAgICAgIHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqIH0pOworICAgICAgfSwKKyAgICAgIC8vIHJvbGxiYWNrCisgICAgICBnZXRfcm9sbGJhY2sgOiBmdW5jdGlvbiAoKSB7IAorICAgICAgICB0aGlzLl9fY2FsbGJhY2soKTsKKyAgICAgICAgcmV0dXJuIHsgaSA6IHRoaXMuZ2V0X2luZGV4KCksIGggOiB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5jbG9uZSh0cnVlKSwgZCA6IHRoaXMuZGF0YSB9OyAKKyAgICAgIH0sCisgICAgICBzZXRfcm9sbGJhY2sgOiBmdW5jdGlvbiAoaHRtbCwgZGF0YSkgeworICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKS5lbXB0eSgpLmFwcGVuZChodG1sKTsKKyAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICAgICAgdGhpcy5fX2NhbGxiYWNrKCk7CisgICAgICB9LAorICAgICAgLy8gRHVtbXkgZnVuY3Rpb25zIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IGFueSBkYXRhc3RvcmUgcGx1Z2luIGluY2x1ZGVkCisgICAgICBsb2FkX25vZGUgIDogZnVuY3Rpb24gKG9iaiwgc19jYWxsLCBlX2NhbGwpIHsgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7IH0sCisgICAgICBfaXNfbG9hZGVkICA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHRydWU7IH0sCisKKyAgICAgIC8vIEJhc2ljIG9wZXJhdGlvbnM6IGNyZWF0ZQorICAgICAgY3JlYXRlX25vZGUgIDogZnVuY3Rpb24gKG9iaiwgcG9zaXRpb24sIGpzLCBjYWxsYmFjaywgaXNfbG9hZGVkKSB7CisgICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7CisgICAgICAgIHBvc2l0aW9uID0gdHlwZW9mIHBvc2l0aW9uID09PSAidW5kZWZpbmVkIiA/ICJsYXN0IiA6IHBvc2l0aW9uOworICAgICAgICB2YXIgZCA9ICQoIjxsaT4iKSwKKyAgICAgICAgICBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuY29yZSwKKyAgICAgICAgICB0bXA7CisKKyAgICAgICAgaWYob2JqICE9PSAtMSAmJiAhb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgaWYoIWlzX2xvYWRlZCAmJiAhdGhpcy5faXNfbG9hZGVkKG9iaikpIHsgdGhpcy5sb2FkX25vZGUob2JqLCBmdW5jdGlvbiAoKSB7IHRoaXMuY3JlYXRlX25vZGUob2JqLCBwb3NpdGlvbiwganMsIGNhbGxiYWNrLCB0cnVlKTsgfSk7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgIHRoaXMuX19yb2xsYmFjaygpOworCisgICAgICAgIGlmKHR5cGVvZiBqcyA9PT0gInN0cmluZyIpIHsganMgPSB7ICJkYXRhIiA6IGpzIH07IH0KKyAgICAgICAgaWYoIWpzKSB7IGpzID0ge307IH0KKyAgICAgICAgaWYoanMuYXR0cikgeyBkLmF0dHIoanMuYXR0cik7IH0KKyAgICAgICAgaWYoanMuc3RhdGUpIHsgZC5hZGRDbGFzcygianN0cmVlLSIgKyBqcy5zdGF0ZSk7IH0KKyAgICAgICAgaWYoIWpzLmRhdGEpIHsganMuZGF0YSA9IHMuc3RyaW5ncy5uZXdfbm9kZTsgfQorICAgICAgICBpZighJC5pc0FycmF5KGpzLmRhdGEpKSB7IHRtcCA9IGpzLmRhdGE7IGpzLmRhdGEgPSBbXTsganMuZGF0YS5wdXNoKHRtcCk7IH0KKyAgICAgICAgJC5lYWNoKGpzLmRhdGEsIGZ1bmN0aW9uIChpLCBtKSB7CisgICAgICAgICAgdG1wID0gJCgiPGE+Iik7CisgICAgICAgICAgaWYoJC5pc0Z1bmN0aW9uKG0pKSB7IG0gPSBtLmNhbGwodGhpcywganMpOyB9CisgICAgICAgICAgaWYodHlwZW9mIG0gPT0gInN0cmluZyIpIHsgdG1wLmF0dHIoJ2hyZWYnLCcjJylbIHMuaHRtbF90aXRsZXMgPyAiaHRtbCIgOiAidGV4dCIgXShtKTsgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYoIW0uYXR0cikgeyBtLmF0dHIgPSB7fTsgfQorICAgICAgICAgICAgaWYoIW0uYXR0ci5ocmVmKSB7IG0uYXR0ci5ocmVmID0gJyMnOyB9CisgICAgICAgICAgICB0bXAuYXR0cihtLmF0dHIpWyBzLmh0bWxfdGl0bGVzID8gImh0bWwiIDogInRleHQiIF0obS50aXRsZSk7CisgICAgICAgICAgICBpZihtLmxhbmd1YWdlKSB7IHRtcC5hZGRDbGFzcyhtLmxhbmd1YWdlKTsgfQorICAgICAgICAgIH0KKyAgICAgICAgICB0bXAucHJlcGVuZCgiPGlucyBjbGFzcz0nanN0cmVlLWljb24nPiYjMTYwOzwvaW5zPiIpOworICAgICAgICAgIGlmKG0uaWNvbikgeyAKKyAgICAgICAgICAgIGlmKG0uaWNvbi5pbmRleE9mKCIvIikgPT09IC0xKSB7IHRtcC5jaGlsZHJlbigiaW5zIikuYWRkQ2xhc3MobS5pY29uKTsgfQorICAgICAgICAgICAgZWxzZSB7IHRtcC5jaGlsZHJlbigiaW5zIikuY3NzKCJiYWNrZ3JvdW5kIiwidXJsKCciICsgbS5pY29uICsgIicpIGNlbnRlciBjZW50ZXIgbm8tcmVwZWF0Iik7IH0KKyAgICAgICAgICB9CisgICAgICAgICAgZC5hcHBlbmQodG1wKTsKKyAgICAgICAgfSk7CisgICAgICAgIGQucHJlcGVuZCgiPGlucyBjbGFzcz0nanN0cmVlLWljb24nPiYjMTYwOzwvaW5zPiIpOworICAgICAgICBpZihvYmogPT09IC0xKSB7CisgICAgICAgICAgb2JqID0gdGhpcy5nZXRfY29udGFpbmVyKCk7CisgICAgICAgICAgaWYocG9zaXRpb24gPT09ICJiZWZvcmUiKSB7IHBvc2l0aW9uID0gImZpcnN0IjsgfQorICAgICAgICAgIGlmKHBvc2l0aW9uID09PSAiYWZ0ZXIiKSB7IHBvc2l0aW9uID0gImxhc3QiOyB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKHBvc2l0aW9uKSB7CisgICAgICAgICAgY2FzZSAiYmVmb3JlIjogb2JqLmJlZm9yZShkKTsgdG1wID0gdGhpcy5fZ2V0X3BhcmVudChvYmopOyBicmVhazsKKyAgICAgICAgICBjYXNlICJhZnRlciIgOiBvYmouYWZ0ZXIoZCk7ICB0bXAgPSB0aGlzLl9nZXRfcGFyZW50KG9iaik7IGJyZWFrOworICAgICAgICAgIGNhc2UgImluc2lkZSI6CisgICAgICAgICAgY2FzZSAiZmlyc3QiIDoKKyAgICAgICAgICAgIGlmKCFvYmouY2hpbGRyZW4oInVsIikubGVuZ3RoKSB7IG9iai5hcHBlbmQoIjx1bD4iKTsgfQorICAgICAgICAgICAgb2JqLmNoaWxkcmVuKCJ1bCIpLnByZXBlbmQoZCk7CisgICAgICAgICAgICB0bXAgPSBvYmo7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICJsYXN0IjoKKyAgICAgICAgICAgIGlmKCFvYmouY2hpbGRyZW4oInVsIikubGVuZ3RoKSB7IG9iai5hcHBlbmQoIjx1bD4iKTsgfQorICAgICAgICAgICAgb2JqLmNoaWxkcmVuKCJ1bCIpLmFwcGVuZChkKTsKKyAgICAgICAgICAgIHRtcCA9IG9iajsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZighb2JqLmNoaWxkcmVuKCJ1bCIpLmxlbmd0aCkgeyBvYmouYXBwZW5kKCI8dWw+Iik7IH0KKyAgICAgICAgICAgIGlmKCFwb3NpdGlvbikgeyBwb3NpdGlvbiA9IDA7IH0KKyAgICAgICAgICAgIHRtcCA9IG9iai5jaGlsZHJlbigidWwiKS5jaGlsZHJlbigibGkiKS5lcShwb3NpdGlvbik7CisgICAgICAgICAgICBpZih0bXAubGVuZ3RoKSB7IHRtcC5iZWZvcmUoZCk7IH0KKyAgICAgICAgICAgIGVsc2UgeyBvYmouY2hpbGRyZW4oInVsIikuYXBwZW5kKGQpOyB9CisgICAgICAgICAgICB0bXAgPSBvYmo7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZih0bXAgPT09IC0xIHx8IHRtcC5nZXQoMCkgPT09IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmdldCgwKSkgeyB0bXAgPSAtMTsgfQorICAgICAgICB0aGlzLmNsZWFuX25vZGUodG1wKTsKKyAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBkLCAicGFyZW50IiA6IHRtcCB9KTsKKyAgICAgICAgaWYoY2FsbGJhY2spIHsgY2FsbGJhY2suY2FsbCh0aGlzLCBkKTsgfQorICAgICAgICByZXR1cm4gZDsKKyAgICAgIH0sCisgICAgICAvLyBCYXNpYyBvcGVyYXRpb25zOiByZW5hbWUgKGRlYWwgd2l0aCB0ZXh0KQorICAgICAgZ2V0X3RleHQgIDogZnVuY3Rpb24gKG9iaikgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICBpZighb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS5jb3JlLmh0bWxfdGl0bGVzOworICAgICAgICBvYmogPSBvYmouY2hpbGRyZW4oImE6ZXEoMCkiKTsKKyAgICAgICAgaWYocykgeworICAgICAgICAgIG9iaiA9IG9iai5jbG9uZSgpOworICAgICAgICAgIG9iai5jaGlsZHJlbigiSU5TIikucmVtb3ZlKCk7CisgICAgICAgICAgcmV0dXJuIG9iai5odG1sKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgb2JqID0gb2JqLmNvbnRlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5ub2RlVHlwZSA9PSAzOyB9KVswXTsKKyAgICAgICAgICByZXR1cm4gb2JqLm5vZGVWYWx1ZTsKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIHNldF90ZXh0ICA6IGZ1bmN0aW9uIChvYmosIHZhbCkgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICBpZighb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgb2JqID0gb2JqLmNoaWxkcmVuKCJhOmVxKDApIik7CisgICAgICAgIGlmKHRoaXMuX2dldF9zZXR0aW5ncygpLmNvcmUuaHRtbF90aXRsZXMpIHsKKyAgICAgICAgICB2YXIgdG1wID0gb2JqLmNoaWxkcmVuKCJJTlMiKS5jbG9uZSgpOworICAgICAgICAgIG9iai5odG1sKHZhbCkucHJlcGVuZCh0bXApOworICAgICAgICAgIHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqLCAibmFtZSIgOiB2YWwgfSk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgb2JqID0gb2JqLmNvbnRlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5ub2RlVHlwZSA9PSAzOyB9KVswXTsKKyAgICAgICAgICB0aGlzLl9fY2FsbGJhY2soeyAib2JqIiA6IG9iaiwgIm5hbWUiIDogdmFsIH0pOworICAgICAgICAgIHJldHVybiAob2JqLm5vZGVWYWx1ZSA9IHZhbCk7CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICByZW5hbWVfbm9kZSA6IGZ1bmN0aW9uIChvYmosIHZhbCkgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICB0aGlzLl9fcm9sbGJhY2soKTsKKyAgICAgICAgaWYob2JqICYmIG9iai5sZW5ndGggJiYgdGhpcy5zZXRfdGV4dC5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSkgeyB0aGlzLl9fY2FsbGJhY2soeyAib2JqIiA6IG9iaiwgIm5hbWUiIDogdmFsIH0pOyB9CisgICAgICB9LAorICAgICAgLy8gQmFzaWMgb3BlcmF0aW9uczogZGVsZXRpbmcgbm9kZXMKKyAgICAgIGRlbGV0ZV9ub2RlIDogZnVuY3Rpb24gKG9iaikgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICBpZighb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgdGhpcy5fX3JvbGxiYWNrKCk7CisgICAgICAgIHZhciBwID0gdGhpcy5fZ2V0X3BhcmVudChvYmopLCBwcmV2ID0gdGhpcy5fZ2V0X3ByZXYob2JqKTsKKyAgICAgICAgb2JqID0gb2JqLnJlbW92ZSgpOworICAgICAgICBpZihwICE9PSAtMSAmJiBwLmZpbmQoIj4gdWwgPiBsaSIpLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgIHAucmVtb3ZlQ2xhc3MoImpzdHJlZS1vcGVuIGpzdHJlZS1jbG9zZWQiKS5hZGRDbGFzcygianN0cmVlLWxlYWYiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNsZWFuX25vZGUocCk7CisgICAgICAgIHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqLCAicHJldiIgOiBwcmV2IH0pOworICAgICAgICByZXR1cm4gb2JqOworICAgICAgfSwKKyAgICAgIHByZXBhcmVfbW92ZSA6IGZ1bmN0aW9uIChvLCByLCBwb3MsIGNiLCBpc19jYikgeworICAgICAgICB2YXIgcCA9IHt9OworCisgICAgICAgIHAub3QgPSAkLmpzdHJlZS5fcmVmZXJlbmNlKHAubykgfHwgdGhpczsKKyAgICAgICAgcC5vID0gcC5vdC5fZ2V0X25vZGUobyk7CisgICAgICAgIHAuciA9IHIgPT09IC0gMSA/IC0xIDogdGhpcy5fZ2V0X25vZGUocik7CisgICAgICAgIHAucCA9ICh0eXBlb2YgcCA9PT0gInVuZGVmaW5lZCIpID8gImxhc3QiIDogcG9zOyAvLyBUT0RPOiBtb3ZlIHRvIGEgc2V0dGluZworICAgICAgICBpZighaXNfY2IgJiYgcHJlcGFyZWRfbW92ZS5vICYmIHByZXBhcmVkX21vdmUub1swXSA9PT0gcC5vWzBdICYmIHByZXBhcmVkX21vdmUuclswXSA9PT0gcC5yWzBdICYmIHByZXBhcmVkX21vdmUucCA9PT0gcC5wKSB7CisgICAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHByZXBhcmVkX21vdmUpOworICAgICAgICAgIGlmKGNiKSB7IGNiLmNhbGwodGhpcywgcHJlcGFyZWRfbW92ZSk7IH0KKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcC5vdCA9ICQuanN0cmVlLl9yZWZlcmVuY2UocC5vKSB8fCB0aGlzOworICAgICAgICBwLnJ0ID0gciA9PT0gLTEgPyBwLm90IDogJC5qc3RyZWUuX3JlZmVyZW5jZShwLnIpIHx8IHRoaXM7CisgICAgICAgIGlmKHAuciA9PT0gLTEpIHsKKyAgICAgICAgICBwLmNyID0gLTE7CisgICAgICAgICAgc3dpdGNoKHAucCkgeworICAgICAgICAgICAgY2FzZSAiZmlyc3QiOgorICAgICAgICAgICAgY2FzZSAiYmVmb3JlIjoKKyAgICAgICAgICAgIGNhc2UgImluc2lkZSI6CisgICAgICAgICAgICAgIHAuY3AgPSAwOyAKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICJhZnRlciI6CisgICAgICAgICAgICBjYXNlICJsYXN0IjoKKyAgICAgICAgICAgICAgcC5jcCA9IHAucnQuZ2V0X2NvbnRhaW5lcigpLmZpbmQoIiA+IHVsID4gbGkiKS5sZW5ndGg7IAorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHAuY3AgPSBwLnA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZighL14oYmVmb3JlfGFmdGVyKSQvLnRlc3QocC5wKSAmJiAhdGhpcy5faXNfbG9hZGVkKHAucikpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRfbm9kZShwLnIsIGZ1bmN0aW9uICgpIHsgdGhpcy5wcmVwYXJlX21vdmUobywgciwgcG9zLCBjYiwgdHJ1ZSk7IH0pOworICAgICAgICAgIH0KKyAgICAgICAgICBzd2l0Y2gocC5wKSB7CisgICAgICAgICAgICBjYXNlICJiZWZvcmUiOgorICAgICAgICAgICAgICBwLmNwID0gcC5yLmluZGV4KCk7CisgICAgICAgICAgICAgIHAuY3IgPSBwLnJ0Ll9nZXRfcGFyZW50KHAucik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAiYWZ0ZXIiOgorICAgICAgICAgICAgICBwLmNwID0gcC5yLmluZGV4KCkgKyAxOworICAgICAgICAgICAgICBwLmNyID0gcC5ydC5fZ2V0X3BhcmVudChwLnIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgImluc2lkZSI6CisgICAgICAgICAgICBjYXNlICJmaXJzdCI6CisgICAgICAgICAgICAgIHAuY3AgPSAwOworICAgICAgICAgICAgICBwLmNyID0gcC5yOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgImxhc3QiOgorICAgICAgICAgICAgICBwLmNwID0gcC5yLmZpbmQoIiA+IHVsID4gbGkiKS5sZW5ndGg7IAorICAgICAgICAgICAgICBwLmNyID0gcC5yOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IAorICAgICAgICAgICAgICBwLmNwID0gcC5wOworICAgICAgICAgICAgICBwLmNyID0gcC5yOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcC5ucCA9IHAuY3IgPT0gLTEgPyBwLnJ0LmdldF9jb250YWluZXIoKSA6IHAuY3I7CisgICAgICAgIHAub3AgPSBwLm90Ll9nZXRfcGFyZW50KHAubyk7CisgICAgICAgIHAub3IgPSBwLm5wLmZpbmQoIiA+IHVsID4gbGk6bnRoLWNoaWxkKCIgKyAocC5jcCArIDEpICsgIikiKTsKKworICAgICAgICBwcmVwYXJlZF9tb3ZlID0gcDsKKyAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHByZXBhcmVkX21vdmUpOworICAgICAgICBpZihjYikgeyBjYi5jYWxsKHRoaXMsIHByZXBhcmVkX21vdmUpOyB9CisgICAgICB9LAorICAgICAgY2hlY2tfbW92ZSA6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIG9iaiA9IHByZXBhcmVkX21vdmUsIHJldCA9IHRydWU7CisgICAgICAgIGlmKG9iai5vclswXSA9PT0gb2JqLm9bMF0pIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIG9iai5vLmVhY2goZnVuY3Rpb24gKCkgeyAKKyAgICAgICAgICBpZihvYmouci5wYXJlbnRzVW50aWwoIi5qc3RyZWUiKS5hbmRTZWxmKCkuZmlsdGVyKCJsaSIpLmluZGV4KHRoaXMpICE9PSAtMSkgeyByZXQgPSBmYWxzZTsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfSwKKyAgICAgIG1vdmVfbm9kZSA6IGZ1bmN0aW9uIChvYmosIHJlZiwgcG9zaXRpb24sIGlzX2NvcHksIGlzX3ByZXBhcmVkLCBza2lwX2NoZWNrKSB7CisgICAgICAgIGlmKCFpc19wcmVwYXJlZCkgeyAKKyAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlX21vdmUob2JqLCByZWYsIHBvc2l0aW9uLCBmdW5jdGlvbiAocCkgeworICAgICAgICAgICAgdGhpcy5tb3ZlX25vZGUocCwgZmFsc2UsIGZhbHNlLCBpc19jb3B5LCB0cnVlLCBza2lwX2NoZWNrKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBpZighc2tpcF9jaGVjayAmJiAhdGhpcy5jaGVja19tb3ZlKCkpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgdGhpcy5fX3JvbGxiYWNrKCk7CisgICAgICAgIHZhciBvID0gZmFsc2U7CisgICAgICAgIGlmKGlzX2NvcHkpIHsKKyAgICAgICAgICBvID0gb2JqLm8uY2xvbmUoKTsKKyAgICAgICAgICBvLmZpbmQoIipbaWRdIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgaWYodGhpcy5pZCkgeyB0aGlzLmlkID0gImNvcHlfIiArIHRoaXMuaWQ7IH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgbyA9IG9iai5vOyB9CisKKyAgICAgICAgaWYob2JqLm9yLmxlbmd0aCkgeyBvYmoub3IuYmVmb3JlKG8pOyB9CisgICAgICAgIGVsc2UgeyAKKyAgICAgICAgICBpZighb2JqLm5wLmNoaWxkcmVuKCJ1bCIpLmxlbmd0aCkgeyAkKCI8dWw+IikuYXBwZW5kVG8ob2JqLm5wKTsgfQorICAgICAgICAgIG9iai5ucC5jaGlsZHJlbigidWw6ZXEoMCkiKS5hcHBlbmQobyk7IAorICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsgCisgICAgICAgICAgb2JqLm90LmNsZWFuX25vZGUob2JqLm9wKTsKKyAgICAgICAgICBvYmoucnQuY2xlYW5fbm9kZShvYmoubnApOworICAgICAgICAgIGlmKCFvYmoub3AuZmluZCgiPiB1bCA+IGxpIikubGVuZ3RoKSB7CisgICAgICAgICAgICBvYmoub3AucmVtb3ZlQ2xhc3MoImpzdHJlZS1vcGVuIGpzdHJlZS1jbG9zZWQiKS5hZGRDbGFzcygianN0cmVlLWxlYWYiKS5jaGlsZHJlbigidWwiKS5yZW1vdmUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGUpIHsgfQorCisgICAgICAgIGlmKGlzX2NvcHkpIHsgCisgICAgICAgICAgcHJlcGFyZWRfbW92ZS5jeSA9IHRydWU7CisgICAgICAgICAgcHJlcGFyZWRfbW92ZS5vYyA9IG87IAorICAgICAgICB9CisgICAgICAgIHRoaXMuX19jYWxsYmFjayhwcmVwYXJlZF9tb3ZlKTsKKyAgICAgICAgcmV0dXJuIHByZXBhcmVkX21vdmU7CisgICAgICB9LAorICAgICAgX2dldF9tb3ZlIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcHJlcGFyZWRfbW92ZTsgfQorICAgIH0KKyAgfSk7Cit9KShqUXVlcnkpOworLy8qLworCisvKiAKKyAqIGpzVHJlZSB1aSBwbHVnaW4gMS4wCisgKiBUaGlzIHBsdWdpbnMgaGFuZGxlcyBzZWxlY3RpbmcvZGVzZWxlY3RpbmcvaG92ZXJpbmcvZGVob3ZlcmluZyBub2RlcworICovCisoZnVuY3Rpb24gKCQpIHsKKyAgJC5qc3RyZWUucGx1Z2luKCJ1aSIsIHsKKyAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7IAorICAgICAgdGhpcy5kYXRhLnVpLnNlbGVjdGVkID0gJCgpOyAKKyAgICAgIHRoaXMuZGF0YS51aS5sYXN0X3NlbGVjdGVkID0gZmFsc2U7IAorICAgICAgdGhpcy5kYXRhLnVpLmhvdmVyZWQgPSBudWxsOworICAgICAgdGhpcy5kYXRhLnVpLnRvX3NlbGVjdCA9IHRoaXMuZ2V0X3NldHRpbmdzKCkudWkuaW5pdGlhbGx5X3NlbGVjdDsKKworICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkKKyAgICAgICAgLmRlbGVnYXRlKCJhIiwgImNsaWNrLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgICAgdGhpcy5zZWxlY3Rfbm9kZShldmVudC5jdXJyZW50VGFyZ2V0LCB0cnVlLCBldmVudCk7CisgICAgICAgICAgfSwgdGhpcykpCisgICAgICAgIC5kZWxlZ2F0ZSgiYSIsICJtb3VzZWVudGVyLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICAgICAgICB0aGlzLmhvdmVyX25vZGUoZXZlbnQudGFyZ2V0KTsKKyAgICAgICAgICB9LCB0aGlzKSkKKyAgICAgICAgLmRlbGVnYXRlKCJhIiwgIm1vdXNlbGVhdmUuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgICAgICAgIHRoaXMuZGVob3Zlcl9ub2RlKGV2ZW50LnRhcmdldCk7CisgICAgICAgICAgfSwgdGhpcykpCisgICAgICAgIC5iaW5kKCJyZW9wZW4uanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoKSB7IAorICAgICAgICAgICAgdGhpcy5yZXNlbGVjdCgpOworICAgICAgICAgIH0sIHRoaXMpKQorICAgICAgICAuYmluZCgiZ2V0X3JvbGxiYWNrLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKCkgeyAKKyAgICAgICAgICAgIHRoaXMuZGVob3Zlcl9ub2RlKCk7CisgICAgICAgICAgICB0aGlzLnNhdmVfc2VsZWN0ZWQoKTsKKyAgICAgICAgICB9LCB0aGlzKSkKKyAgICAgICAgLmJpbmQoInNldF9yb2xsYmFjay5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHsgCisgICAgICAgICAgICB0aGlzLnJlc2VsZWN0KCk7CisgICAgICAgICAgfSwgdGhpcykpCisgICAgICAgIC5iaW5kKCJjbG9zZV9ub2RlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7IAorICAgICAgICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS51aSwKKyAgICAgICAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUoZGF0YS5yc2x0Lm9iaiksCisgICAgICAgICAgICAgIGNsayA9IChvYmogJiYgb2JqLmxlbmd0aCkgPyBvYmouY2hpbGRyZW4oInVsIikuZmluZCgiLmpzdHJlZS1jbGlja2VkIikgOiAkKCksCisgICAgICAgICAgICAgIF90aGlzID0gdGhpczsKKyAgICAgICAgICAgIGlmKHMuc2VsZWN0ZWRfcGFyZW50X2Nsb3NlID09PSBmYWxzZSB8fCAhY2xrLmxlbmd0aCkgeyByZXR1cm47IH0KKyAgICAgICAgICAgIGNsay5lYWNoKGZ1bmN0aW9uICgpIHsgCisgICAgICAgICAgICAgIF90aGlzLmRlc2VsZWN0X25vZGUodGhpcyk7CisgICAgICAgICAgICAgIGlmKHMuc2VsZWN0ZWRfcGFyZW50X2Nsb3NlID09PSAic2VsZWN0X3BhcmVudCIpIHsgX3RoaXMuc2VsZWN0X25vZGUob2JqKTsgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSwgdGhpcykpCisgICAgICAgIC5iaW5kKCJkZWxldGVfbm9kZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChldmVudCwgZGF0YSkgeyAKKyAgICAgICAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkudWkuc2VsZWN0X3ByZXZfb25fZGVsZXRlLAorICAgICAgICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShkYXRhLnJzbHQub2JqKSwKKyAgICAgICAgICAgICAgY2xrID0gKG9iaiAmJiBvYmoubGVuZ3RoKSA/IG9iai5maW5kKCIuanN0cmVlLWNsaWNrZWQiKSA6IFtdLAorICAgICAgICAgICAgICBfdGhpcyA9IHRoaXM7CisgICAgICAgICAgICBjbGsuZWFjaChmdW5jdGlvbiAoKSB7IF90aGlzLmRlc2VsZWN0X25vZGUodGhpcyk7IH0pOworICAgICAgICAgICAgaWYocyAmJiBjbGsubGVuZ3RoKSB7IHRoaXMuc2VsZWN0X25vZGUoZGF0YS5yc2x0LnByZXYpOyB9CisgICAgICAgICAgfSwgdGhpcykpCisgICAgICAgIC5iaW5kKCJtb3ZlX25vZGUuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZXZlbnQsIGRhdGEpIHsgCisgICAgICAgICAgICBpZihkYXRhLnJzbHQuY3kpIHsgCisgICAgICAgICAgICAgIGRhdGEucnNsdC5vYy5maW5kKCIuanN0cmVlLWNsaWNrZWQiKS5yZW1vdmVDbGFzcygianN0cmVlLWNsaWNrZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB0aGlzKSk7CisgICAgfSwKKyAgICBkZWZhdWx0cyA6IHsKKyAgICAgIHNlbGVjdF9saW1pdCA6IC0xLCAvLyAwLCAxLCAyIC4uLiBvciAtMSBmb3IgdW5saW1pdGVkCisgICAgICBzZWxlY3RfbXVsdGlwbGVfbW9kaWZpZXIgOiAiY3RybCIsIC8vIG9uLCBvciBjdHJsLCBzaGlmdCwgYWx0CisgICAgICBzZWxlY3RlZF9wYXJlbnRfY2xvc2UgOiAic2VsZWN0X3BhcmVudCIsIC8vIGZhbHNlLCAiZGVzZWxlY3QiLCAic2VsZWN0X3BhcmVudCIKKyAgICAgIHNlbGVjdF9wcmV2X29uX2RlbGV0ZSA6IHRydWUsCisgICAgICBkaXNhYmxlX3NlbGVjdGluZ19jaGlsZHJlbiA6IGZhbHNlLAorICAgICAgaW5pdGlhbGx5X3NlbGVjdCA6IFtdCisgICAgfSwKKyAgICBfZm4gOiB7IAorICAgICAgX2dldF9ub2RlIDogZnVuY3Rpb24gKG9iaiwgYWxsb3dfbXVsdGlwbGUpIHsKKyAgICAgICAgaWYodHlwZW9mIG9iaiA9PT0gInVuZGVmaW5lZCIgfHwgb2JqID09PSBudWxsKSB7IHJldHVybiBhbGxvd19tdWx0aXBsZSA/IHRoaXMuZGF0YS51aS5zZWxlY3RlZCA6IHRoaXMuZGF0YS51aS5sYXN0X3NlbGVjdGVkOyB9CisgICAgICAgIHZhciAkb2JqID0gJChvYmosIHRoaXMuZ2V0X2NvbnRhaW5lcigpKTsgCisgICAgICAgIGlmKCRvYmouaXMoIi5qc3RyZWUiKSB8fCBvYmogPT0gLTEpIHsgcmV0dXJuIC0xOyB9IAorICAgICAgICAkb2JqID0gJG9iai5jbG9zZXN0KCJsaSIsIHRoaXMuZ2V0X2NvbnRhaW5lcigpKTsgCisgICAgICAgIHJldHVybiAkb2JqLmxlbmd0aCA/ICRvYmogOiBmYWxzZTsgCisgICAgICB9LAorICAgICAgc2F2ZV9zZWxlY3RlZCA6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIF90aGlzID0gdGhpczsKKyAgICAgICAgdGhpcy5kYXRhLnVpLnRvX3NlbGVjdCA9IFtdOworICAgICAgICB0aGlzLmRhdGEudWkuc2VsZWN0ZWQuZWFjaChmdW5jdGlvbiAoKSB7IF90aGlzLmRhdGEudWkudG9fc2VsZWN0LnB1c2goIiMiICsgdGhpcy5pZC50b1N0cmluZygpLnJlcGxhY2UoL14jLywiIikucmVwbGFjZSgnXFwvJywnLycpLnJlcGxhY2UoJy8nLCdcXC8nKSk7IH0pOworICAgICAgICB0aGlzLl9fY2FsbGJhY2sodGhpcy5kYXRhLnVpLnRvX3NlbGVjdCk7CisgICAgICB9LAorICAgICAgcmVzZWxlY3QgOiBmdW5jdGlvbiAoKSB7CisgICAgICAgIHZhciBfdGhpcyA9IHRoaXMsCisgICAgICAgICAgcyA9IHRoaXMuZGF0YS51aS50b19zZWxlY3Q7CisgICAgICAgIHMgPSAkLm1hcCgkLm1ha2VBcnJheShzKSwgZnVuY3Rpb24gKG4pIHsgcmV0dXJuICIjIiArIG4udG9TdHJpbmcoKS5yZXBsYWNlKC9eIy8sIiIpLnJlcGxhY2UoJ1xcLycsJy8nKS5yZXBsYWNlKCcvJywnXFwvJyk7IH0pOworICAgICAgICB0aGlzLmRlc2VsZWN0X2FsbCgpOworICAgICAgICAkLmVhY2gocywgZnVuY3Rpb24gKGksIHZhbCkgeyBpZih2YWwgJiYgdmFsICE9PSAiIyIpIHsgX3RoaXMuc2VsZWN0X25vZGUodmFsKTsgfSB9KTsKKyAgICAgICAgdGhpcy5fX2NhbGxiYWNrKCk7CisgICAgICB9LAorICAgICAgcmVmcmVzaCA6IGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgdGhpcy5zYXZlX3NlbGVjdGVkKCk7CisgICAgICAgIHJldHVybiB0aGlzLl9fY2FsbF9vbGQoKTsKKyAgICAgIH0sCisgICAgICBob3Zlcl9ub2RlIDogZnVuY3Rpb24gKG9iaikgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICBpZighb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgLy9pZih0aGlzLmRhdGEudWkuaG92ZXJlZCAmJiBvYmouZ2V0KDApID09PSB0aGlzLmRhdGEudWkuaG92ZXJlZC5nZXQoMCkpIHsgcmV0dXJuOyB9CisgICAgICAgIGlmKCFvYmouaGFzQ2xhc3MoImpzdHJlZS1ob3ZlcmVkIikpIHsgdGhpcy5kZWhvdmVyX25vZGUoKTsgfQorICAgICAgICB0aGlzLmRhdGEudWkuaG92ZXJlZCA9IG9iai5jaGlsZHJlbigiYSIpLmFkZENsYXNzKCJqc3RyZWUtaG92ZXJlZCIpLnBhcmVudCgpOworICAgICAgICB0aGlzLl9fY2FsbGJhY2soeyAib2JqIiA6IG9iaiB9KTsKKyAgICAgIH0sCisgICAgICBkZWhvdmVyX25vZGUgOiBmdW5jdGlvbiAoKSB7CisgICAgICAgIHZhciBvYmogPSB0aGlzLmRhdGEudWkuaG92ZXJlZCwgcDsKKyAgICAgICAgaWYoIW9iaiB8fCAhb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgcCA9IG9iai5jaGlsZHJlbigiYSIpLnJlbW92ZUNsYXNzKCJqc3RyZWUtaG92ZXJlZCIpLnBhcmVudCgpOworICAgICAgICBpZih0aGlzLmRhdGEudWkuaG92ZXJlZFswXSA9PT0gcFswXSkgeyB0aGlzLmRhdGEudWkuaG92ZXJlZCA9IG51bGw7IH0KKyAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7CisgICAgICB9LAorICAgICAgc2VsZWN0X25vZGUgOiBmdW5jdGlvbiAob2JqLCBjaGVjaywgZSkgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICBpZihvYmogPT0gLTEgfHwgIW9iaiB8fCAhb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS51aSwKKyAgICAgICAgICBpc19tdWx0aXBsZSA9IChzLnNlbGVjdF9tdWx0aXBsZV9tb2RpZmllciA9PSAib24iIHx8IChzLnNlbGVjdF9tdWx0aXBsZV9tb2RpZmllciAhPT0gZmFsc2UgJiYgZSAmJiBlW3Muc2VsZWN0X211bHRpcGxlX21vZGlmaWVyICsgIktleSJdKSksCisgICAgICAgICAgaXNfc2VsZWN0ZWQgPSB0aGlzLmlzX3NlbGVjdGVkKG9iaiksCisgICAgICAgICAgcHJvY2VlZCA9IHRydWU7CisgICAgICAgIGlmKGNoZWNrKSB7CisgICAgICAgICAgaWYocy5kaXNhYmxlX3NlbGVjdGluZ19jaGlsZHJlbiAmJiBpc19tdWx0aXBsZSAmJiBvYmoucGFyZW50cygibGkiLCB0aGlzLmdldF9jb250YWluZXIoKSkuY2hpbGRyZW4oIi5qc3RyZWUtY2xpY2tlZCIpLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgICBwcm9jZWVkID0gZmFsc2U7CisgICAgICAgICAgc3dpdGNoKCEwKSB7CisgICAgICAgICAgICBjYXNlIChpc19zZWxlY3RlZCAmJiAhaXNfbXVsdGlwbGUpOiAKKyAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdF9hbGwoKTsKKyAgICAgICAgICAgICAgaXNfc2VsZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgcHJvY2VlZCA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoIWlzX3NlbGVjdGVkICYmICFpc19tdWx0aXBsZSk6IAorICAgICAgICAgICAgICBpZihzLnNlbGVjdF9saW1pdCA9PSAtMSB8fCBzLnNlbGVjdF9saW1pdCA+IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0X2FsbCgpOworICAgICAgICAgICAgICAgIHByb2NlZWQgPSB0cnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoaXNfc2VsZWN0ZWQgJiYgaXNfbXVsdGlwbGUpOiAKKyAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdF9ub2RlKG9iaik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAoIWlzX3NlbGVjdGVkICYmIGlzX211bHRpcGxlKTogCisgICAgICAgICAgICAgIGlmKHMuc2VsZWN0X2xpbWl0ID09IC0xIHx8IHRoaXMuZGF0YS51aS5zZWxlY3RlZC5sZW5ndGggKyAxIDw9IHMuc2VsZWN0X2xpbWl0KSB7IAorICAgICAgICAgICAgICAgIHByb2NlZWQgPSB0cnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihwcm9jZWVkICYmICFpc19zZWxlY3RlZCkgeworICAgICAgICAgIG9iai5jaGlsZHJlbigiYSIpLmFkZENsYXNzKCJqc3RyZWUtY2xpY2tlZCIpOworICAgICAgICAgIHRoaXMuZGF0YS51aS5zZWxlY3RlZCA9IHRoaXMuZGF0YS51aS5zZWxlY3RlZC5hZGQob2JqKTsKKyAgICAgICAgICB0aGlzLmRhdGEudWkubGFzdF9zZWxlY3RlZCA9IG9iajsKKyAgICAgICAgICB0aGlzLl9fY2FsbGJhY2soeyAib2JqIiA6IG9iaiB9KTsKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIGRlc2VsZWN0X25vZGUgOiBmdW5jdGlvbiAob2JqKSB7CisgICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7CisgICAgICAgIGlmKCFvYmoubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICBpZih0aGlzLmlzX3NlbGVjdGVkKG9iaikpIHsKKyAgICAgICAgICBvYmouY2hpbGRyZW4oImEiKS5yZW1vdmVDbGFzcygianN0cmVlLWNsaWNrZWQiKTsKKyAgICAgICAgICB0aGlzLmRhdGEudWkuc2VsZWN0ZWQgPSB0aGlzLmRhdGEudWkuc2VsZWN0ZWQubm90KG9iaik7CisgICAgICAgICAgaWYodGhpcy5kYXRhLnVpLmxhc3Rfc2VsZWN0ZWQuZ2V0KDApID09PSBvYmouZ2V0KDApKSB7IHRoaXMuZGF0YS51aS5sYXN0X3NlbGVjdGVkID0gdGhpcy5kYXRhLnVpLnNlbGVjdGVkLmVxKDApOyB9CisgICAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICB0b2dnbGVfc2VsZWN0IDogZnVuY3Rpb24gKG9iaikgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICBpZighb2JqLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgaWYodGhpcy5pc19zZWxlY3RlZChvYmopKSB7IHRoaXMuZGVzZWxlY3Rfbm9kZShvYmopOyB9CisgICAgICAgIGVsc2UgeyB0aGlzLnNlbGVjdF9ub2RlKG9iaik7IH0KKyAgICAgIH0sCisgICAgICBpc19zZWxlY3RlZCA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHRoaXMuZGF0YS51aS5zZWxlY3RlZC5pbmRleCh0aGlzLl9nZXRfbm9kZShvYmopKSA+PSAwOyB9LAorICAgICAgZ2V0X3NlbGVjdGVkIDogZnVuY3Rpb24gKGNvbnRleHQpIHsgCisgICAgICAgIHJldHVybiBjb250ZXh0ID8gJChjb250ZXh0KS5maW5kKCIuanN0cmVlLWNsaWNrZWQiKS5wYXJlbnQoKSA6IHRoaXMuZGF0YS51aS5zZWxlY3RlZDsgCisgICAgICB9LAorICAgICAgZGVzZWxlY3RfYWxsIDogZnVuY3Rpb24gKGNvbnRleHQpIHsKKyAgICAgICAgaWYoY29udGV4dCkgeyAkKGNvbnRleHQpLmZpbmQoIi5qc3RyZWUtY2xpY2tlZCIpLnJlbW92ZUNsYXNzKCJqc3RyZWUtY2xpY2tlZCIpOyB9IAorICAgICAgICBlbHNlIHsgdGhpcy5nZXRfY29udGFpbmVyKCkuZmluZCgiLmpzdHJlZS1jbGlja2VkIikucmVtb3ZlQ2xhc3MoImpzdHJlZS1jbGlja2VkIik7IH0KKyAgICAgICAgdGhpcy5kYXRhLnVpLnNlbGVjdGVkID0gJChbXSk7CisgICAgICAgIHRoaXMuZGF0YS51aS5sYXN0X3NlbGVjdGVkID0gZmFsc2U7CisgICAgICAgIHRoaXMuX19jYWxsYmFjaygpOworICAgICAgfQorICAgIH0KKyAgfSk7CisgIC8vIGluY2x1ZGUgdGhlIHNlbGVjdGlvbiBwbHVnaW4gYnkgZGVmYXVsdAorICAkLmpzdHJlZS5kZWZhdWx0cy5wbHVnaW5zLnB1c2goInVpIik7Cit9KShqUXVlcnkpOworLy8qLworCisvKiAKKyAqIGpzVHJlZSBDUlJNIHBsdWdpbiAxLjAKKyAqIEhhbmRsZXMgY3JlYXRpbmcvcmVuYW1pbmcvcmVtb3ZpbmcvbW92aW5nIG5vZGVzIGJ5IHVzZXIgaW50ZXJhY3Rpb24uCisgKi8KKyhmdW5jdGlvbiAoJCkgeworICAkLmpzdHJlZS5wbHVnaW4oImNycm0iLCB7IAorICAgIF9faW5pdCA6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpCisgICAgICAgIC5iaW5kKCJtb3ZlX25vZGUuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkgeworICAgICAgICAgIGlmKHRoaXMuX2dldF9zZXR0aW5ncygpLmNycm0ubW92ZS5vcGVuX29ubW92ZSkgeworICAgICAgICAgICAgdmFyIHQgPSB0aGlzOworICAgICAgICAgICAgZGF0YS5yc2x0Lm5wLnBhcmVudHNVbnRpbCgiLmpzdHJlZSIpLmFuZFNlbGYoKS5maWx0ZXIoIi5qc3RyZWUtY2xvc2VkIikuZWFjaChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgIHQub3Blbl9ub2RlKHRoaXMsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAgfSwgdGhpcykpOworICAgIH0sCisgICAgZGVmYXVsdHMgOiB7CisgICAgICBpbnB1dF93aWR0aF9saW1pdCA6IDIwMCwKKyAgICAgIG1vdmUgOiB7CisgICAgICAgIGFsd2F5c19jb3B5ICAgICAgOiBmYWxzZSwgLy8gZmFsc2UsIHRydWUgb3IgIm11bHRpdHJlZSIKKyAgICAgICAgb3Blbl9vbm1vdmUgICAgICA6IHRydWUsCisgICAgICAgIGRlZmF1bHRfcG9zaXRpb24gIDogImxhc3QiLAorICAgICAgICBjaGVja19tb3ZlICAgICAgOiBmdW5jdGlvbiAobSkgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgfQorICAgIH0sCisgICAgX2ZuIDogeworICAgICAgX3Nob3dfaW5wdXQgOiBmdW5jdGlvbiAob2JqLCBjYWxsYmFjaykgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICB2YXIgcnRsID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuY29yZS5ydGwsCisgICAgICAgICAgdyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLmNycm0uaW5wdXRfd2lkdGhfbGltaXQsCisgICAgICAgICAgdzEgPSBvYmouY2hpbGRyZW4oImlucyIpLndpZHRoKCksCisgICAgICAgICAgdzIgPSBvYmouZmluZCgiPiBhOnZpc2libGUgPiBpbnMiKS53aWR0aCgpICogb2JqLmZpbmQoIj4gYTp2aXNpYmxlID4gaW5zIikubGVuZ3RoLAorICAgICAgICAgIHQgPSB0aGlzLmdldF90ZXh0KG9iaiksCisgICAgICAgICAgaDEgPSAkKCI8ZGl2PiIsIHsgY3NzIDogeyAicG9zaXRpb24iIDogImFic29sdXRlIiwgInRvcCIgOiAiLTIwMHB4IiwgImxlZnQiIDogKHJ0bCA/ICIwcHgiIDogIi0xMDAwcHgiKSwgInZpc2liaWxpdHkiIDogImhpZGRlbiIgfSB9KS5hcHBlbmRUbygiYm9keSIpLAorICAgICAgICAgIGgyID0gb2JqLmNzcygicG9zaXRpb24iLCJyZWxhdGl2ZSIpLmFwcGVuZCgKKyAgICAgICAgICAkKCI8aW5wdXQ+IiwgeyAKKyAgICAgICAgICAgICJ2YWx1ZSIgOiB0LAorICAgICAgICAgICAgLy8gInNpemUiIDogdC5sZW5ndGgsCisgICAgICAgICAgICAiY3NzIiA6IHsKKyAgICAgICAgICAgICAgInBhZGRpbmciIDogIjAiLAorICAgICAgICAgICAgICAiYm9yZGVyIiA6ICIxcHggc29saWQgc2lsdmVyIiwKKyAgICAgICAgICAgICAgInBvc2l0aW9uIiA6ICJhYnNvbHV0ZSIsCisgICAgICAgICAgICAgICJsZWZ0IiAgOiAocnRsID8gImF1dG8iIDogKHcxICsgdzIgKyA0KSArICJweCIpLAorICAgICAgICAgICAgICAicmlnaHQiIDogKHJ0bCA/ICh3MSArIHcyICsgNCkgKyAicHgiIDogImF1dG8iKSwKKyAgICAgICAgICAgICAgInRvcCIgOiAiMHB4IiwKKyAgICAgICAgICAgICAgImhlaWdodCIgOiAodGhpcy5kYXRhLmNvcmUubGlfaGVpZ2h0IC0gMikgKyAicHgiLAorICAgICAgICAgICAgICAibGluZUhlaWdodCIgOiAodGhpcy5kYXRhLmNvcmUubGlfaGVpZ2h0IC0gMikgKyAicHgiLAorICAgICAgICAgICAgICAid2lkdGgiIDogIjE1MHB4IiAvLyB3aWxsIGJlIHNldCBhIGJpdCBmdXJ0aGVyIGRvd24KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYmx1ciIgOiAkLnByb3h5KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgICAgdmFyIGkgPSBvYmouY2hpbGRyZW4oImlucHV0IiksCisgICAgICAgICAgICAgICAgdiA9IGkudmFsKCk7CisgICAgICAgICAgICAgIGlmKHYgPT09ICIiKSB7IHYgPSB0OyB9CisgICAgICAgICAgICAgIGkucmVtb3ZlKCk7IC8vIHJvbGxiYWNrIHB1cnBvc2VzCisgICAgICAgICAgICAgIHRoaXMuc2V0X3RleHQob2JqLHQpOyAvLyByb2xsYmFjayBwdXJwb3NlcworICAgICAgICAgICAgICB0aGlzLnJlbmFtZV9ub2RlKG9iaiwgdik7CisgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgb2JqLCB2LCB0KTsKKyAgICAgICAgICAgICAgb2JqLmNzcygicG9zaXRpb24iLCIiKTsKKyAgICAgICAgICAgIH0sIHRoaXMpLAorICAgICAgICAgICAgImtleXVwIiA6IGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICAgICAgICB2YXIga2V5ID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaDsKKyAgICAgICAgICAgICAgaWYoa2V5ID09IDI3KSB7IHRoaXMudmFsdWUgPSB0OyB0aGlzLmJsdXIoKTsgcmV0dXJuOyB9CisgICAgICAgICAgICAgIGVsc2UgaWYoa2V5ID09IDEzKSB7IHRoaXMuYmx1cigpOyByZXR1cm47IH0KKyAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaDIud2lkdGgoTWF0aC5taW4oaDEudGV4dCgicFciICsgdGhpcy52YWx1ZSkud2lkdGgoKSx3KSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KQorICAgICAgICApLmNoaWxkcmVuKCJpbnB1dCIpOyAKKyAgICAgICAgdGhpcy5zZXRfdGV4dChvYmosICIiKTsKKyAgICAgICAgaDEuY3NzKHsKKyAgICAgICAgICAgIGZvbnRGYW1pbHkgICAgOiBoMi5jc3MoJ2ZvbnRGYW1pbHknKSAgICB8fCAnJywKKyAgICAgICAgICAgIGZvbnRTaXplICAgIDogaDIuY3NzKCdmb250U2l6ZScpICAgIHx8ICcnLAorICAgICAgICAgICAgZm9udFdlaWdodCAgICA6IGgyLmNzcygnZm9udFdlaWdodCcpICAgIHx8ICcnLAorICAgICAgICAgICAgZm9udFN0eWxlICAgIDogaDIuY3NzKCdmb250U3R5bGUnKSAgICB8fCAnJywKKyAgICAgICAgICAgIGZvbnRTdHJldGNoICAgIDogaDIuY3NzKCdmb250U3RyZXRjaCcpICAgIHx8ICcnLAorICAgICAgICAgICAgZm9udFZhcmlhbnQgICAgOiBoMi5jc3MoJ2ZvbnRWYXJpYW50JykgICAgfHwgJycsCisgICAgICAgICAgICBsZXR0ZXJTcGFjaW5nICA6IGgyLmNzcygnbGV0dGVyU3BhY2luZycpICB8fCAnJywKKyAgICAgICAgICAgIHdvcmRTcGFjaW5nICAgIDogaDIuY3NzKCd3b3JkU3BhY2luZycpICAgIHx8ICcnCisgICAgICAgIH0pOworICAgICAgICBoMi53aWR0aChNYXRoLm1pbihoMS50ZXh0KCJwVyIgKyBoMlswXS52YWx1ZSkud2lkdGgoKSx3KSlbMF0uc2VsZWN0KCk7CisgICAgICB9LAorICAgICAgcmVuYW1lIDogZnVuY3Rpb24gKG9iaikgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICB0aGlzLl9fcm9sbGJhY2soKTsKKyAgICAgICAgdmFyIGYgPSB0aGlzLl9fY2FsbGJhY2s7CisgICAgICAgIHRoaXMuX3Nob3dfaW5wdXQob2JqLCBmdW5jdGlvbiAob2JqLCBuZXdfbmFtZSwgb2xkX25hbWUpIHsgCisgICAgICAgICAgZi5jYWxsKHRoaXMsIHsgIm9iaiIgOiBvYmosICJuZXdfbmFtZSIgOiBuZXdfbmFtZSwgIm9sZF9uYW1lIiA6IG9sZF9uYW1lIH0pOworICAgICAgICB9KTsKKyAgICAgIH0sCisgICAgICBjcmVhdGUgOiBmdW5jdGlvbiAob2JqLCBwb3NpdGlvbiwganMsIGNhbGxiYWNrLCBza2lwX3JlbmFtZSkgeworICAgICAgICB2YXIgdCwgX3RoaXMgPSB0aGlzOworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICBpZighb2JqKSB7IG9iaiA9IC0xOyB9CisgICAgICAgIHRoaXMuX19yb2xsYmFjaygpOworICAgICAgICB0ID0gdGhpcy5jcmVhdGVfbm9kZShvYmosIHBvc2l0aW9uLCBqcywgZnVuY3Rpb24gKHQpIHsKKyAgICAgICAgICB2YXIgcCA9IHRoaXMuX2dldF9wYXJlbnQodCksCisgICAgICAgICAgICBwb3MgPSAkKHQpLmluZGV4KCk7CisgICAgICAgICAgaWYoY2FsbGJhY2spIHsgY2FsbGJhY2suY2FsbCh0aGlzLCB0KTsgfQorICAgICAgICAgIGlmKHAubGVuZ3RoICYmIHAuaGFzQ2xhc3MoImpzdHJlZS1jbG9zZWQiKSkgeyB0aGlzLm9wZW5fbm9kZShwLCBmYWxzZSwgdHJ1ZSk7IH0KKyAgICAgICAgICBpZighc2tpcF9yZW5hbWUpIHsgCisgICAgICAgICAgICB0aGlzLl9zaG93X2lucHV0KHQsIGZ1bmN0aW9uIChvYmosIG5ld19uYW1lLCBvbGRfbmFtZSkgeyAKKyAgICAgICAgICAgICAgX3RoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqLCAibmFtZSIgOiBuZXdfbmFtZSwgInBhcmVudCIgOiBwLCAicG9zaXRpb24iIDogcG9zIH0pOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeyBfdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiB0LCAibmFtZSIgOiB0aGlzLmdldF90ZXh0KHQpLCAicGFyZW50IiA6IHAsICJwb3NpdGlvbiIgOiBwb3MgfSk7IH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiB0OworICAgICAgfSwKKyAgICAgIHJlbW92ZSA6IGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqLCB0cnVlKTsKKyAgICAgICAgdGhpcy5fX3JvbGxiYWNrKCk7CisgICAgICAgIHRoaXMuZGVsZXRlX25vZGUob2JqKTsKKyAgICAgICAgdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7CisgICAgICB9LAorICAgICAgY2hlY2tfbW92ZSA6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgaWYoIXRoaXMuX19jYWxsX29sZCgpKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB2YXIgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLmNycm0ubW92ZTsKKyAgICAgICAgaWYoIXMuY2hlY2tfbW92ZS5jYWxsKHRoaXMsIHRoaXMuX2dldF9tb3ZlKCkpKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0sCisgICAgICBtb3ZlX25vZGUgOiBmdW5jdGlvbiAob2JqLCByZWYsIHBvc2l0aW9uLCBpc19jb3B5LCBpc19wcmVwYXJlZCwgc2tpcF9jaGVjaykgeworICAgICAgICB2YXIgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLmNycm0ubW92ZTsKKyAgICAgICAgaWYoIWlzX3ByZXBhcmVkKSB7IAorICAgICAgICAgIGlmKCFwb3NpdGlvbikgeyBwb3NpdGlvbiA9IHMuZGVmYXVsdF9wb3NpdGlvbjsgfQorICAgICAgICAgIGlmKHBvc2l0aW9uID09PSAiaW5zaWRlIiAmJiAhcy5kZWZhdWx0X3Bvc2l0aW9uLm1hdGNoKC9eKGJlZm9yZXxhZnRlcikkLykpIHsgcG9zaXRpb24gPSBzLmRlZmF1bHRfcG9zaXRpb247IH0KKyAgICAgICAgICByZXR1cm4gdGhpcy5fX2NhbGxfb2xkKHRydWUsIG9iaiwgcmVmLCBwb3NpdGlvbiwgaXNfY29weSwgZmFsc2UsIHNraXBfY2hlY2spOworICAgICAgICB9CisgICAgICAgIC8vIGlmIHRoZSBtb3ZlIGlzIGFscmVhZHkgcHJlcGFyZWQKKyAgICAgICAgaWYocy5hbHdheXNfY29weSA9PT0gdHJ1ZSB8fCAocy5hbHdheXNfY29weSA9PT0gIm11bHRpdHJlZSIgJiYgb2JqLnJ0LmdldF9pbmRleCgpICE9PSBvYmoub3QuZ2V0X2luZGV4KCkgKSkgeworICAgICAgICAgIGlzX2NvcHkgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHRoaXMuX19jYWxsX29sZCh0cnVlLCBvYmosIHJlZiwgcG9zaXRpb24sIGlzX2NvcHksIHRydWUsIHNraXBfY2hlY2spOworICAgICAgfSwKKworICAgICAgY3V0IDogZnVuY3Rpb24gKG9iaikgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICB0aGlzLmRhdGEuY3JybS5jcF9ub2RlcyA9IGZhbHNlOworICAgICAgICB0aGlzLmRhdGEuY3JybS5jdF9ub2RlcyA9IGZhbHNlOworICAgICAgICBpZighb2JqIHx8ICFvYmoubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB0aGlzLmRhdGEuY3JybS5jdF9ub2RlcyA9IG9iajsKKyAgICAgIH0sCisgICAgICBjb3B5IDogZnVuY3Rpb24gKG9iaikgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICB0aGlzLmRhdGEuY3JybS5jcF9ub2RlcyA9IGZhbHNlOworICAgICAgICB0aGlzLmRhdGEuY3JybS5jdF9ub2RlcyA9IGZhbHNlOworICAgICAgICBpZighb2JqIHx8ICFvYmoubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB0aGlzLmRhdGEuY3JybS5jcF9ub2RlcyA9IG9iajsKKyAgICAgIH0sCisgICAgICBwYXN0ZSA6IGZ1bmN0aW9uIChvYmopIHsgCisgICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7CisgICAgICAgIGlmKCFvYmogfHwgIW9iai5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIGlmKCF0aGlzLmRhdGEuY3JybS5jdF9ub2RlcyAmJiAhdGhpcy5kYXRhLmNycm0uY3Bfbm9kZXMpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIGlmKHRoaXMuZGF0YS5jcnJtLmN0X25vZGVzKSB7IHRoaXMubW92ZV9ub2RlKHRoaXMuZGF0YS5jcnJtLmN0X25vZGVzLCBvYmopOyB9CisgICAgICAgIGlmKHRoaXMuZGF0YS5jcnJtLmNwX25vZGVzKSB7IHRoaXMubW92ZV9ub2RlKHRoaXMuZGF0YS5jcnJtLmNwX25vZGVzLCBvYmosIGZhbHNlLCB0cnVlKTsgfQorICAgICAgICB0aGlzLmRhdGEuY3JybS5jcF9ub2RlcyA9IGZhbHNlOworICAgICAgICB0aGlzLmRhdGEuY3JybS5jdF9ub2RlcyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfSk7CisgIC8vIGluY2x1ZGUgdGhlIGNyciBwbHVnaW4gYnkgZGVmYXVsdAorICAkLmpzdHJlZS5kZWZhdWx0cy5wbHVnaW5zLnB1c2goImNycm0iKTsKK30pKGpRdWVyeSk7CisKKy8qIAorICoganNUcmVlIHRoZW1lcyBwbHVnaW4gMS4wCisgKiBIYW5kbGVzIGxvYWRpbmcgYW5kIHNldHRpbmcgdGhlbWVzLCBhcyB3ZWxsIGFzIGRldGVjdGluZyBwYXRoIHRvIHRoZW1lcywgZXRjLgorICovCisoZnVuY3Rpb24gKCQpIHsKKyAgdmFyIHRoZW1lc19sb2FkZWQgPSBbXTsKKyAgLy8gdGhpcyB2YXJpYWJsZSBzdG9yZXMgdGhlIHBhdGggdG8gdGhlIHRoZW1lcyBmb2xkZXIgLSBpZiBsZWZ0IGFzIGZhbHNlIC0gaXQgd2lsbCBiZSBhdXRvZGV0ZWN0ZWQKKyAgJC5qc3RyZWUuX3RoZW1lcyA9IGZhbHNlOworICAkLmpzdHJlZS5wbHVnaW4oInRoZW1lcyIsIHsKKyAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7IAorICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkKKyAgICAgICAgLmJpbmQoImluaXQuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICB2YXIgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLnRoZW1lczsKKyAgICAgICAgICAgIHRoaXMuZGF0YS50aGVtZXMuZG90cyA9IHMuZG90czsgCisgICAgICAgICAgICB0aGlzLmRhdGEudGhlbWVzLmljb25zID0gcy5pY29uczsgCisgICAgICAgICAgICAvL2FsZXJ0KHMuZG90cyk7CisgICAgICAgICAgICB0aGlzLnNldF90aGVtZShzLnRoZW1lLCBzLnVybCk7CisgICAgICAgICAgfSwgdGhpcykpCisgICAgICAgIC5iaW5kKCJsb2FkZWQuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAvLyBib3VuZCBoZXJlIHRvbywgYXMgc2ltcGxlIEhUTUwgdHJlZSdzIHdvbid0IGhvbm9yIGRvdHMgJiBpY29ucyBvdGhlcndpc2UKKyAgICAgICAgICAgIGlmKCF0aGlzLmRhdGEudGhlbWVzLmRvdHMpIHsgdGhpcy5oaWRlX2RvdHMoKTsgfQorICAgICAgICAgICAgZWxzZSB7IHRoaXMuc2hvd19kb3RzKCk7IH0KKyAgICAgICAgICAgIGlmKCF0aGlzLmRhdGEudGhlbWVzLmljb25zKSB7IHRoaXMuaGlkZV9pY29ucygpOyB9CisgICAgICAgICAgICBlbHNlIHsgdGhpcy5zaG93X2ljb25zKCk7IH0KKyAgICAgICAgICB9LCB0aGlzKSk7CisgICAgfSwKKyAgICBkZWZhdWx0cyA6IHsgCisgICAgICB0aGVtZSA6ICJkZWZhdWx0IiwgCisgICAgICB1cmwgOiBmYWxzZSwKKyAgICAgIGRvdHMgOiB0cnVlLAorICAgICAgaWNvbnMgOiB0cnVlCisgICAgfSwKKyAgICBfZm4gOiB7CisgICAgICBzZXRfdGhlbWUgOiBmdW5jdGlvbiAodGhlbWVfbmFtZSwgdGhlbWVfdXJsKSB7CisgICAgICAgIGlmKCF0aGVtZV9uYW1lKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICBpZighdGhlbWVfdXJsKSB7IHRoZW1lX3VybCA9ICQuanN0cmVlLl90aGVtZXMgKyB0aGVtZV9uYW1lICsgJy9zdHlsZS5jc3MnOyB9CisgICAgICAgIGlmKCQuaW5BcnJheSh0aGVtZV91cmwsIHRoZW1lc19sb2FkZWQpID09IC0xKSB7CisgICAgICAgICAgJC52YWthdGEuY3NzLmFkZF9zaGVldCh7ICJ1cmwiIDogdGhlbWVfdXJsLCAicmVsIiA6ICJqc3RyZWUiIH0pOworICAgICAgICAgIHRoZW1lc19sb2FkZWQucHVzaCh0aGVtZV91cmwpOworICAgICAgICB9CisgICAgICAgIGlmKHRoaXMuZGF0YS50aGVtZXMudGhlbWUgIT0gdGhlbWVfbmFtZSkgeworICAgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpLnJlbW92ZUNsYXNzKCdqc3RyZWUtJyArIHRoaXMuZGF0YS50aGVtZXMudGhlbWUpOworICAgICAgICAgIHRoaXMuZGF0YS50aGVtZXMudGhlbWUgPSB0aGVtZV9uYW1lOworICAgICAgICB9CisgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpLmFkZENsYXNzKCdqc3RyZWUtJyArIHRoZW1lX25hbWUpOworICAgICAgICBpZighdGhpcy5kYXRhLnRoZW1lcy5kb3RzKSB7IHRoaXMuaGlkZV9kb3RzKCk7IH0KKyAgICAgICAgZWxzZSB7IHRoaXMuc2hvd19kb3RzKCk7IH0KKyAgICAgICAgaWYoIXRoaXMuZGF0YS50aGVtZXMuaWNvbnMpIHsgdGhpcy5oaWRlX2ljb25zKCk7IH0KKyAgICAgICAgZWxzZSB7IHRoaXMuc2hvd19pY29ucygpOyB9CisgICAgICAgIHRoaXMuX19jYWxsYmFjaygpOworICAgICAgfSwKKyAgICAgIGdldF90aGVtZSAgOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmRhdGEudGhlbWVzLnRoZW1lOyB9LAorCisgICAgICBzaG93X2RvdHMgIDogZnVuY3Rpb24gKCkgeyB0aGlzLmRhdGEudGhlbWVzLmRvdHMgPSB0cnVlOyB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5yZW1vdmVDbGFzcygianN0cmVlLW5vLWRvdHMiKTsgfSwKKyAgICAgIGhpZGVfZG90cyAgOiBmdW5jdGlvbiAoKSB7IHRoaXMuZGF0YS50aGVtZXMuZG90cyA9IGZhbHNlOyB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5hZGRDbGFzcygianN0cmVlLW5vLWRvdHMiKTsgfSwKKyAgICAgIHRvZ2dsZV9kb3RzICA6IGZ1bmN0aW9uICgpIHsgaWYodGhpcy5kYXRhLnRoZW1lcy5kb3RzKSB7IHRoaXMuaGlkZV9kb3RzKCk7IH0gZWxzZSB7IHRoaXMuc2hvd19kb3RzKCk7IH0gfSwKKworICAgICAgc2hvd19pY29ucyAgOiBmdW5jdGlvbiAoKSB7IHRoaXMuZGF0YS50aGVtZXMuaWNvbnMgPSB0cnVlOyB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5yZW1vdmVDbGFzcygianN0cmVlLW5vLWljb25zIik7IH0sCisgICAgICBoaWRlX2ljb25zICA6IGZ1bmN0aW9uICgpIHsgdGhpcy5kYXRhLnRoZW1lcy5pY29ucyA9IGZhbHNlOyB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5hZGRDbGFzcygianN0cmVlLW5vLWljb25zIik7IH0sCisgICAgICB0b2dnbGVfaWNvbnM6IGZ1bmN0aW9uICgpIHsgaWYodGhpcy5kYXRhLnRoZW1lcy5pY29ucykgeyB0aGlzLmhpZGVfaWNvbnMoKTsgfSBlbHNlIHsgdGhpcy5zaG93X2ljb25zKCk7IH0gfQorICAgIH0KKyAgfSk7CisgIC8vIGF1dG9kZXRlY3QgdGhlbWVzIHBhdGgKKyAgJChmdW5jdGlvbiAoKSB7CisgICAgaWYoJC5qc3RyZWUuX3RoZW1lcyA9PT0gZmFsc2UpIHsKKyAgICAgICQoInNjcmlwdCIpLmVhY2goZnVuY3Rpb24gKCkgeyAKKyAgICAgICAgaWYodGhpcy5zcmMudG9TdHJpbmcoKS5tYXRjaCgvanF1ZXJ5XC5qc3RyZWVbXlwvXSo/XC5qcyhcPy4qKT8kLykpIHsgCisgICAgICAgICAgJC5qc3RyZWUuX3RoZW1lcyA9IHRoaXMuc3JjLnRvU3RyaW5nKCkucmVwbGFjZSgvanF1ZXJ5XC5qc3RyZWVbXlwvXSo/XC5qcyhcPy4qKT8kLywgIiIpICsgJ3RoZW1lcy8nOyAKKyAgICAgICAgICByZXR1cm4gZmFsc2U7IAorICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgICAgaWYoJC5qc3RyZWUuX3RoZW1lcyA9PT0gZmFsc2UpIHsgJC5qc3RyZWUuX3RoZW1lcyA9ICJ0aGVtZXMvIjsgfQorICB9KTsKKyAgLy8gaW5jbHVkZSB0aGUgdGhlbWVzIHBsdWdpbiBieSBkZWZhdWx0CisgICQuanN0cmVlLmRlZmF1bHRzLnBsdWdpbnMucHVzaCgidGhlbWVzIik7Cit9KShqUXVlcnkpOworLy8qLworCisvKgorICoganNUcmVlIGhvdGtleXMgcGx1Z2luIDEuMAorICogRW5hYmxlcyBrZXlib2FyZCBuYXZpZ2F0aW9uIGZvciBhbGwgdHJlZSBpbnN0YW5jZXMKKyAqIERlcGVuZHMgb24gdGhlIGpzdHJlZSB1aSAmIGpxdWVyeSBob3RrZXlzIHBsdWdpbnMKKyAqLworKGZ1bmN0aW9uICgkKSB7CisgIHZhciBib3VuZCA9IFtdOworICBmdW5jdGlvbiBleGVjKGksIGV2ZW50KSB7CisgICAgdmFyIGYgPSAkLmpzdHJlZS5fZm9jdXNlZCgpLCB0bXA7CisgICAgaWYoZiAmJiBmLmRhdGEgJiYgZi5kYXRhLmhvdGtleXMgJiYgZi5kYXRhLmhvdGtleXMuZW5hYmxlZCkgeyAKKyAgICAgIHRtcCA9IGYuX2dldF9zZXR0aW5ncygpLmhvdGtleXNbaV07CisgICAgICBpZih0bXApIHsgcmV0dXJuIHRtcC5jYWxsKGYsIGV2ZW50KTsgfQorICAgIH0KKyAgfQorICAkLmpzdHJlZS5wbHVnaW4oImhvdGtleXMiLCB7CisgICAgX19pbml0IDogZnVuY3Rpb24gKCkgeworICAgICAgaWYodHlwZW9mICQuaG90a2V5cyA9PT0gInVuZGVmaW5lZCIpIHsgdGhyb3cgImpzVHJlZSBob3RrZXlzOiBqUXVlcnkgaG90a2V5cyBwbHVnaW4gbm90IGluY2x1ZGVkLiI7IH0KKyAgICAgIGlmKCF0aGlzLmRhdGEudWkpIHsgdGhyb3cgImpzVHJlZSBob3RrZXlzOiBqc1RyZWUgVUkgcGx1Z2luIG5vdCBpbmNsdWRlZC4iOyB9CisgICAgICAkLmVhY2godGhpcy5fZ2V0X3NldHRpbmdzKCkuaG90a2V5cywgZnVuY3Rpb24gKGksIHZhbCkgeworICAgICAgICBpZigkLmluQXJyYXkoaSwgYm91bmQpID09IC0xKSB7CisgICAgICAgICAgJChkb2N1bWVudCkuYmluZCgia2V5ZG93biIsIGksIGZ1bmN0aW9uIChldmVudCkgeyByZXR1cm4gZXhlYyhpLCBldmVudCk7IH0pOworICAgICAgICAgIGJvdW5kLnB1c2goaSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgdGhpcy5lbmFibGVfaG90a2V5cygpOworICAgIH0sCisgICAgZGVmYXVsdHMgOiB7CisgICAgICAidXAiIDogZnVuY3Rpb24gKCkgeyAKKyAgICAgICAgdmFyIG8gPSB0aGlzLmRhdGEudWkuaG92ZXJlZCB8fCB0aGlzLmRhdGEudWkubGFzdF9zZWxlY3RlZCB8fCAtMTsKKyAgICAgICAgdGhpcy5ob3Zlcl9ub2RlKHRoaXMuX2dldF9wcmV2KG8pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAKKyAgICAgIH0sCisgICAgICAiZG93biIgOiBmdW5jdGlvbiAoKSB7IAorICAgICAgICB2YXIgbyA9IHRoaXMuZGF0YS51aS5ob3ZlcmVkIHx8IHRoaXMuZGF0YS51aS5sYXN0X3NlbGVjdGVkIHx8IC0xOworICAgICAgICB0aGlzLmhvdmVyX25vZGUodGhpcy5fZ2V0X25leHQobykpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9LAorICAgICAgImxlZnQiIDogZnVuY3Rpb24gKCkgeyAKKyAgICAgICAgdmFyIG8gPSB0aGlzLmRhdGEudWkuaG92ZXJlZCB8fCB0aGlzLmRhdGEudWkubGFzdF9zZWxlY3RlZDsKKyAgICAgICAgaWYobykgeworICAgICAgICAgIGlmKG8uaGFzQ2xhc3MoImpzdHJlZS1vcGVuIikpIHsgdGhpcy5jbG9zZV9ub2RlKG8pOyB9CisgICAgICAgICAgZWxzZSB7IHRoaXMuaG92ZXJfbm9kZSh0aGlzLl9nZXRfcHJldihvKSk7IH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9LAorICAgICAgInJpZ2h0IiA6IGZ1bmN0aW9uICgpIHsgCisgICAgICAgIHZhciBvID0gdGhpcy5kYXRhLnVpLmhvdmVyZWQgfHwgdGhpcy5kYXRhLnVpLmxhc3Rfc2VsZWN0ZWQ7CisgICAgICAgIGlmKG8gJiYgby5sZW5ndGgpIHsKKyAgICAgICAgICBpZihvLmhhc0NsYXNzKCJqc3RyZWUtY2xvc2VkIikpIHsgdGhpcy5vcGVuX25vZGUobyk7IH0KKyAgICAgICAgICBlbHNlIHsgdGhpcy5ob3Zlcl9ub2RlKHRoaXMuX2dldF9uZXh0KG8pKTsgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0sCisgICAgICAic3BhY2UiIDogZnVuY3Rpb24gKCkgeyAKKyAgICAgICAgaWYodGhpcy5kYXRhLnVpLmhvdmVyZWQpIHsgdGhpcy5kYXRhLnVpLmhvdmVyZWQuY2hpbGRyZW4oImE6ZXEoMCkiKS5jbGljaygpOyB9IAorICAgICAgICByZXR1cm4gZmFsc2U7IAorICAgICAgfSwKKyAgICAgICJjdHJsK3NwYWNlIiA6IGZ1bmN0aW9uIChldmVudCkgeyAKKyAgICAgICAgZXZlbnQudHlwZSA9ICJjbGljayI7CisgICAgICAgIGlmKHRoaXMuZGF0YS51aS5ob3ZlcmVkKSB7IHRoaXMuZGF0YS51aS5ob3ZlcmVkLmNoaWxkcmVuKCJhOmVxKDApIikudHJpZ2dlcihldmVudCk7IH0gCisgICAgICAgIHJldHVybiBmYWxzZTsgCisgICAgICB9LAorICAgICAgImYyIiA6IGZ1bmN0aW9uICgpIHsgdGhpcy5yZW5hbWUodGhpcy5kYXRhLnVpLmhvdmVyZWQgfHwgdGhpcy5kYXRhLnVpLmxhc3Rfc2VsZWN0ZWQpOyB9LAorICAgICAgImRlbCIgOiBmdW5jdGlvbiAoKSB7IHRoaXMucmVtb3ZlKHRoaXMuZGF0YS51aS5ob3ZlcmVkIHx8IHRoaXMuX2dldF9ub2RlKG51bGwpKTsgfQorICAgIH0sCisgICAgX2ZuIDogeworICAgICAgZW5hYmxlX2hvdGtleXMgOiBmdW5jdGlvbiAoKSB7CisgICAgICAgIHRoaXMuZGF0YS5ob3RrZXlzLmVuYWJsZWQgPSB0cnVlOworICAgICAgfSwKKyAgICAgIGRpc2FibGVfaG90a2V5cyA6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdGhpcy5kYXRhLmhvdGtleXMuZW5hYmxlZCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfSk7Cit9KShqUXVlcnkpOworLy8qLworCisvKiAKKyAqIGpzVHJlZSBKU09OIDEuMAorICogVGhlIEpTT04gZGF0YSBzdG9yZS4gRGF0YXN0b3JlcyBhcmUgYnVpbGQgYnkgb3ZlcnJpZGluZyB0aGUgYGxvYWRfbm9kZWAgYW5kIGBfaXNfbG9hZGVkYCBmdW5jdGlvbnMuCisgKi8KKyhmdW5jdGlvbiAoJCkgeworICAkLmpzdHJlZS5wbHVnaW4oImpzb25fZGF0YSIsIHsKKyAgICBkZWZhdWx0cyA6IHsgCisgICAgICBkYXRhIDogZmFsc2UsCisgICAgICBhamF4IDogZmFsc2UsCisgICAgICBjb3JyZWN0X3N0YXRlIDogdHJ1ZSwKKyAgICAgIHByb2dyZXNzaXZlX3JlbmRlciA6IGZhbHNlCisgICAgfSwKKyAgICBfZm4gOiB7CisgICAgICBsb2FkX25vZGUgOiBmdW5jdGlvbiAob2JqLCBzX2NhbGwsIGVfY2FsbCkgeyB2YXIgX3RoaXMgPSB0aGlzOyB0aGlzLmxvYWRfbm9kZV9qc29uKG9iaiwgZnVuY3Rpb24gKCkgeyBfdGhpcy5fX2NhbGxiYWNrKHsgIm9iaiIgOiBvYmogfSk7IHNfY2FsbC5jYWxsKHRoaXMpOyB9LCBlX2NhbGwpOyB9LAorICAgICAgX2lzX2xvYWRlZCA6IGZ1bmN0aW9uIChvYmopIHsgCisgICAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuanNvbl9kYXRhLCBkOworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOyAKKyAgICAgICAgaWYob2JqICYmIG9iaiAhPT0gLTEgJiYgcy5wcm9ncmVzc2l2ZV9yZW5kZXIgJiYgIW9iai5pcygiLmpzdHJlZS1vcGVuLCAuanN0cmVlLWxlYWYiKSAmJiBvYmouY2hpbGRyZW4oInVsIikuY2hpbGRyZW4oImxpIikubGVuZ3RoID09PSAwICYmIG9iai5kYXRhKCJqc3RyZWUtY2hpbGRyZW4iKSkgeworICAgICAgICAgIGQgPSB0aGlzLl9wYXJzZV9qc29uKG9iai5kYXRhKCJqc3RyZWUtY2hpbGRyZW4iKSk7CisgICAgICAgICAgaWYoZCkgeworICAgICAgICAgICAgb2JqLmFwcGVuZChkKTsKKyAgICAgICAgICAgICQucmVtb3ZlRGF0YShvYmosICJqc3RyZWUtY2hpbGRyZW4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhpcy5jbGVhbl9ub2RlKG9iaik7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9iaiA9PSAtMSB8fCAhb2JqIHx8ICFzLmFqYXggfHwgb2JqLmlzKCIuanN0cmVlLW9wZW4sIC5qc3RyZWUtbGVhZiIpIHx8IG9iai5jaGlsZHJlbigidWwiKS5jaGlsZHJlbigibGkiKS5zaXplKCkgPiAwOworICAgICAgfSwKKyAgICAgIGxvYWRfbm9kZV9qc29uIDogZnVuY3Rpb24gKG9iaiwgc19jYWxsLCBlX2NhbGwpIHsKKyAgICAgICAgdmFyIHMgPSB0aGlzLmdldF9zZXR0aW5ncygpLmpzb25fZGF0YSwgZCwKKyAgICAgICAgICBlcnJvcl9mdW5jID0gZnVuY3Rpb24gKCkge30sCisgICAgICAgICAgc3VjY2Vzc19mdW5jID0gZnVuY3Rpb24gKCkge307CisgICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7CisgICAgICAgIGlmKG9iaiAmJiBvYmogIT09IC0xKSB7CisgICAgICAgICAgaWYob2JqLmRhdGEoImpzdHJlZS1pcy1sb2FkaW5nIikpIHsgcmV0dXJuOyB9CisgICAgICAgICAgZWxzZSB7IG9iai5kYXRhKCJqc3RyZWUtaXMtbG9hZGluZyIsdHJ1ZSk7IH0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2goITApIHsKKyAgICAgICAgICBjYXNlICghcy5kYXRhICYmICFzLmFqYXgpOiB0aHJvdyAiTmVpdGhlciBkYXRhIG5vciBhamF4IHNldHRpbmdzIHN1cHBsaWVkLiI7CisgICAgICAgICAgY2FzZSAoISFzLmRhdGEgJiYgIXMuYWpheCkgfHwgKCEhcy5kYXRhICYmICEhcy5hamF4ICYmICghb2JqIHx8IG9iaiA9PT0gLTEpKToKKyAgICAgICAgICAgIGlmKCFvYmogfHwgb2JqID09IC0xKSB7CisgICAgICAgICAgICAgIGQgPSB0aGlzLl9wYXJzZV9qc29uKHMuZGF0YSk7CisgICAgICAgICAgICAgIGlmKGQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5lbXB0eSgpLmFwcGVuZChkLmNoaWxkcmVuKCkpOworICAgICAgICAgICAgICAgIHRoaXMuY2xlYW5fbm9kZSgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgeyAKKyAgICAgICAgICAgICAgICBpZihzLmNvcnJlY3Rfc3RhdGUpIHsgdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikuZW1wdHkoKTsgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihzX2NhbGwpIHsgc19jYWxsLmNhbGwodGhpcyk7IH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgKCFzLmRhdGEgJiYgISFzLmFqYXgpIHx8ICghIXMuZGF0YSAmJiAhIXMuYWpheCAmJiBvYmogJiYgb2JqICE9PSAtMSk6CisgICAgICAgICAgICBlcnJvcl9mdW5jID0gZnVuY3Rpb24gKHgsIHQsIGUpIHsKKyAgICAgICAgICAgICAgdmFyIGVmID0gdGhpcy5nZXRfc2V0dGluZ3MoKS5qc29uX2RhdGEuYWpheC5lcnJvcjsgCisgICAgICAgICAgICAgIGlmKGVmKSB7IGVmLmNhbGwodGhpcywgeCwgdCwgZSk7IH0KKyAgICAgICAgICAgICAgaWYob2JqICE9IC0xICYmIG9iai5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBvYmouY2hpbGRyZW4oIi5qc3RyZWUtbG9hZGluZyIpLnJlbW92ZUNsYXNzKCJqc3RyZWUtbG9hZGluZyIpOworICAgICAgICAgICAgICAgIG9iai5kYXRhKCJqc3RyZWUtaXMtbG9hZGluZyIsZmFsc2UpOworICAgICAgICAgICAgICAgIGlmKHQgPT09ICJzdWNjZXNzIiAmJiBzLmNvcnJlY3Rfc3RhdGUpIHsgb2JqLnJlbW92ZUNsYXNzKCJqc3RyZWUtb3BlbiBqc3RyZWUtY2xvc2VkIikuYWRkQ2xhc3MoImpzdHJlZS1sZWFmIik7IH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZih0ID09PSAic3VjY2VzcyIgJiYgcy5jb3JyZWN0X3N0YXRlKSB7IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCk7IH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZihlX2NhbGwpIHsgZV9jYWxsLmNhbGwodGhpcyk7IH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzdWNjZXNzX2Z1bmMgPSBmdW5jdGlvbiAoZCwgdCwgeCkgeworICAgICAgICAgICAgICB2YXIgc2YgPSB0aGlzLmdldF9zZXR0aW5ncygpLmpzb25fZGF0YS5hamF4LnN1Y2Nlc3M7IAorICAgICAgICAgICAgICBpZihzZikgeyBkID0gc2YuY2FsbCh0aGlzLGQsdCx4KSB8fCBkOyB9CisgICAgICAgICAgICAgIGlmKGQgPT09ICIiIHx8ICghJC5pc0FycmF5KGQpICYmICEkLmlzUGxhaW5PYmplY3QoZCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yX2Z1bmMuY2FsbCh0aGlzLCB4LCB0LCAiIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZCA9IHRoaXMuX3BhcnNlX2pzb24oZCk7CisgICAgICAgICAgICAgIGlmKGQpIHsKKyAgICAgICAgICAgICAgICBpZihvYmogPT09IC0xIHx8ICFvYmopIHsgdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikuZW1wdHkoKS5hcHBlbmQoZC5jaGlsZHJlbigpKTsgfQorICAgICAgICAgICAgICAgIGVsc2UgeyBvYmouYXBwZW5kKGQpLmNoaWxkcmVuKCIuanN0cmVlLWxvYWRpbmciKS5yZW1vdmVDbGFzcygianN0cmVlLWxvYWRpbmciKTsgb2JqLmRhdGEoImpzdHJlZS1pcy1sb2FkaW5nIixmYWxzZSk7IH0KKyAgICAgICAgICAgICAgICB0aGlzLmNsZWFuX25vZGUob2JqKTsKKyAgICAgICAgICAgICAgICBpZihzX2NhbGwpIHsgc19jYWxsLmNhbGwodGhpcyk7IH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihvYmogPT09IC0xIHx8ICFvYmopIHsKKyAgICAgICAgICAgICAgICAgIGlmKHMuY29ycmVjdF9zdGF0ZSkgeyAKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikuZW1wdHkoKTsgCisgICAgICAgICAgICAgICAgICAgIGlmKHNfY2FsbCkgeyBzX2NhbGwuY2FsbCh0aGlzKTsgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIG9iai5jaGlsZHJlbigiLmpzdHJlZS1sb2FkaW5nIikucmVtb3ZlQ2xhc3MoImpzdHJlZS1sb2FkaW5nIik7CisgICAgICAgICAgICAgICAgICBvYmouZGF0YSgianN0cmVlLWlzLWxvYWRpbmciLGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgIGlmKHMuY29ycmVjdF9zdGF0ZSkgeyAKKyAgICAgICAgICAgICAgICAgICAgb2JqLnJlbW92ZUNsYXNzKCJqc3RyZWUtb3BlbiBqc3RyZWUtY2xvc2VkIikuYWRkQ2xhc3MoImpzdHJlZS1sZWFmIik7IAorICAgICAgICAgICAgICAgICAgICBpZihzX2NhbGwpIHsgc19jYWxsLmNhbGwodGhpcyk7IH0gCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgcy5hamF4LmNvbnRleHQgPSB0aGlzOworICAgICAgICAgICAgcy5hamF4LmVycm9yID0gZXJyb3JfZnVuYzsKKyAgICAgICAgICAgIHMuYWpheC5zdWNjZXNzID0gc3VjY2Vzc19mdW5jOworICAgICAgICAgICAgaWYoIXMuYWpheC5kYXRhVHlwZSkgeyBzLmFqYXguZGF0YVR5cGUgPSAianNvbiI7IH0KKyAgICAgICAgICAgIGlmKCQuaXNGdW5jdGlvbihzLmFqYXgudXJsKSkgeyBzLmFqYXgudXJsID0gcy5hamF4LnVybC5jYWxsKHRoaXMsIG9iaik7IH0KKyAgICAgICAgICAgIGlmKCQuaXNGdW5jdGlvbihzLmFqYXguZGF0YSkpIHsgcy5hamF4LmRhdGEgPSBzLmFqYXguZGF0YS5jYWxsKHRoaXMsIG9iaik7IH0KKyAgICAgICAgICAgICQuYWpheChzLmFqYXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBfcGFyc2VfanNvbiA6IGZ1bmN0aW9uIChqcywgaXNfY2FsbGJhY2spIHsKKyAgICAgICAgdmFyIGQgPSBmYWxzZSwgCisgICAgICAgICAgcCA9IHRoaXMuX2dldF9zZXR0aW5ncygpLAorICAgICAgICAgIHMgPSBwLmpzb25fZGF0YSwKKyAgICAgICAgICB0ID0gcC5jb3JlLmh0bWxfdGl0bGVzLAorICAgICAgICAgIHRtcCwgaSwgaiwgdWwxLCB1bDI7CisKKyAgICAgICAgaWYoIWpzKSB7IHJldHVybiBkOyB9CisgICAgICAgIGlmKCQuaXNGdW5jdGlvbihqcykpIHsgCisgICAgICAgICAganMgPSBqcy5jYWxsKHRoaXMpOworICAgICAgICB9CisgICAgICAgIGlmKCQuaXNBcnJheShqcykpIHsKKyAgICAgICAgICBkID0gJCgpOworICAgICAgICAgIGlmKCFqcy5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgZm9yKGkgPSAwLCBqID0ganMubGVuZ3RoOyBpIDwgajsgaSsrKSB7CisgICAgICAgICAgICB0bXAgPSB0aGlzLl9wYXJzZV9qc29uKGpzW2ldLCB0cnVlKTsKKyAgICAgICAgICAgIGlmKHRtcC5sZW5ndGgpIHsgZCA9IGQuYWRkKHRtcCk7IH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaWYodHlwZW9mIGpzID09ICJzdHJpbmciKSB7IGpzID0geyBkYXRhIDoganMgfTsgfQorICAgICAgICAgIGlmKCFqcy5kYXRhICYmIGpzLmRhdGEgIT09ICIiKSB7IHJldHVybiBkOyB9CisgICAgICAgICAgZCA9ICQoIjxsaT4iKTsKKyAgICAgICAgICBpZihqcy5hdHRyKSB7IGQuYXR0cihqcy5hdHRyKTsgfQorICAgICAgICAgIGlmKGpzLm1ldGFkYXRhKSB7IGQuZGF0YSgianN0cmVlIiwganMubWV0YWRhdGEpOyB9CisgICAgICAgICAgaWYoanMuc3RhdGUpIHsgZC5hZGRDbGFzcygianN0cmVlLSIgKyBqcy5zdGF0ZSk7IH0KKyAgICAgICAgICBpZighJC5pc0FycmF5KGpzLmRhdGEpKSB7IHRtcCA9IGpzLmRhdGE7IGpzLmRhdGEgPSBbXTsganMuZGF0YS5wdXNoKHRtcCk7IH0KKyAgICAgICAgICAkLmVhY2goanMuZGF0YSwgZnVuY3Rpb24gKGksIG0pIHsKKyAgICAgICAgICAgIHRtcCA9ICQoIjxhPiIpOworICAgICAgICAgICAgaWYoJC5pc0Z1bmN0aW9uKG0pKSB7IG0gPSBtLmNhbGwodGhpcywganMpOyB9CisgICAgICAgICAgICBpZih0eXBlb2YgbSA9PSAic3RyaW5nIikgeyB0bXAuYXR0cignaHJlZicsJyMnKVsgdCA/ICJodG1sIiA6ICJ0ZXh0IiBdKG0pOyB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgaWYoIW0uYXR0cikgeyBtLmF0dHIgPSB7fTsgfQorICAgICAgICAgICAgICBpZighbS5hdHRyLmhyZWYpIHsgbS5hdHRyLmhyZWYgPSAnIyc7IH0KKyAgICAgICAgICAgICAgdG1wLmF0dHIobS5hdHRyKVsgdCA/ICJodG1sIiA6ICJ0ZXh0IiBdKG0udGl0bGUpOworICAgICAgICAgICAgICBpZihtLmxhbmd1YWdlKSB7IHRtcC5hZGRDbGFzcyhtLmxhbmd1YWdlKTsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wLnByZXBlbmQoIjxpbnMgY2xhc3M9J2pzdHJlZS1pY29uJz4mIzE2MDs8L2lucz4iKTsKKyAgICAgICAgICAgIGlmKCFtLmljb24gJiYganMuaWNvbikgeyBtLmljb24gPSBqcy5pY29uOyB9CisgICAgICAgICAgICBpZihtLmljb24pIHsgCisgICAgICAgICAgICAgIGlmKG0uaWNvbi5pbmRleE9mKCIvIikgPT09IC0xKSB7IHRtcC5jaGlsZHJlbigiaW5zIikuYWRkQ2xhc3MobS5pY29uKTsgfQorICAgICAgICAgICAgICBlbHNlIHsgdG1wLmNoaWxkcmVuKCJpbnMiKS5jc3MoImJhY2tncm91bmQiLCJ1cmwoJyIgKyBtLmljb24gKyAiJykgY2VudGVyIGNlbnRlciBuby1yZXBlYXQiKTsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZC5hcHBlbmQodG1wKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgICBkLnByZXBlbmQoIjxpbnMgY2xhc3M9J2pzdHJlZS1pY29uJz4mIzE2MDs8L2lucz4iKTsKKyAgICAgICAgICBpZihqcy5jaGlsZHJlbikgeyAKKyAgICAgICAgICAgIGlmKHMucHJvZ3Jlc3NpdmVfcmVuZGVyICYmIGpzLnN0YXRlICE9PSAib3BlbiIpIHsKKyAgICAgICAgICAgICAgZC5hZGRDbGFzcygianN0cmVlLWNsb3NlZCIpLmRhdGEoImpzdHJlZS1jaGlsZHJlbiIsIGpzLmNoaWxkcmVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBpZigkLmlzRnVuY3Rpb24oanMuY2hpbGRyZW4pKSB7CisgICAgICAgICAgICAgICAganMuY2hpbGRyZW4gPSBqcy5jaGlsZHJlbi5jYWxsKHRoaXMsIGpzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZigkLmlzQXJyYXkoanMuY2hpbGRyZW4pICYmIGpzLmNoaWxkcmVuLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRtcCA9IHRoaXMuX3BhcnNlX2pzb24oanMuY2hpbGRyZW4sIHRydWUpOworICAgICAgICAgICAgICAgIGlmKHRtcC5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgIHVsMiA9ICQoIjx1bD4iKTsKKyAgICAgICAgICAgICAgICAgIHVsMi5hcHBlbmQodG1wKTsKKyAgICAgICAgICAgICAgICAgIGQuYXBwZW5kKHVsMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCFpc19jYWxsYmFjaykgeworICAgICAgICAgIHVsMSA9ICQoIjx1bD4iKTsKKyAgICAgICAgICB1bDEuYXBwZW5kKGQpOworICAgICAgICAgIGQgPSB1bDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGQ7CisgICAgICB9LAorICAgICAgZ2V0X2pzb24gOiBmdW5jdGlvbiAob2JqLCBsaV9hdHRyLCBhX2F0dHIsIGlzX2NhbGxiYWNrKSB7CisgICAgICAgIHZhciByZXN1bHQgPSBbXSwgCisgICAgICAgICAgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLCAKKyAgICAgICAgICBfdGhpcyA9IHRoaXMsCisgICAgICAgICAgdG1wMSwgdG1wMiwgbGksIGEsIHQsIGxhbmc7CisgICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7CisgICAgICAgIGlmKCFvYmogfHwgb2JqID09PSAtMSkgeyBvYmogPSB0aGlzLmdldF9jb250YWluZXIoKS5maW5kKCI+IHVsID4gbGkiKTsgfQorICAgICAgICBsaV9hdHRyID0gJC5pc0FycmF5KGxpX2F0dHIpID8gbGlfYXR0ciA6IFsgImlkIiwgImNsYXNzIiBdOworICAgICAgICBpZighaXNfY2FsbGJhY2sgJiYgdGhpcy5kYXRhLnR5cGVzKSB7IGxpX2F0dHIucHVzaChzLnR5cGVzLnR5cGVfYXR0cik7IH0KKyAgICAgICAgYV9hdHRyID0gJC5pc0FycmF5KGFfYXR0cikgPyBhX2F0dHIgOiBbIF07CisKKyAgICAgICAgb2JqLmVhY2goZnVuY3Rpb24gKCkgeworICAgICAgICAgIGxpID0gJCh0aGlzKTsKKyAgICAgICAgICB0bXAxID0geyBkYXRhIDogW10gfTsKKyAgICAgICAgICBpZihsaV9hdHRyLmxlbmd0aCkgeyB0bXAxLmF0dHIgPSB7IH07IH0KKyAgICAgICAgICAkLmVhY2gobGlfYXR0ciwgZnVuY3Rpb24gKGksIHYpIHsgCisgICAgICAgICAgICB0bXAyID0gbGkuYXR0cih2KTsgCisgICAgICAgICAgICBpZih0bXAyICYmIHRtcDIubGVuZ3RoICYmIHRtcDIucmVwbGFjZSgvanN0cmVlW14gXSp8JC9pZywnJykubGVuZ3RoKSB7CisgICAgICAgICAgICAgIHRtcDEuYXR0clt2XSA9IHRtcDIucmVwbGFjZSgvanN0cmVlW14gXSp8JC9pZywnJyk7IAorICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICAgIGlmKGxpLmhhc0NsYXNzKCJqc3RyZWUtb3BlbiIpKSB7IHRtcDEuc3RhdGUgPSAib3BlbiI7IH0KKyAgICAgICAgICBpZihsaS5oYXNDbGFzcygianN0cmVlLWNsb3NlZCIpKSB7IHRtcDEuc3RhdGUgPSAiY2xvc2VkIjsgfQorICAgICAgICAgIGEgPSBsaS5jaGlsZHJlbigiYSIpOworICAgICAgICAgIGEuZWFjaChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICB0ID0gJCh0aGlzKTsKKyAgICAgICAgICAgIGlmKAorICAgICAgICAgICAgICBhX2F0dHIubGVuZ3RoIHx8IAorICAgICAgICAgICAgICAkLmluQXJyYXkoImxhbmd1YWdlcyIsIHMucGx1Z2lucykgIT09IC0xIHx8IAorICAgICAgICAgICAgICB0LmNoaWxkcmVuKCJpbnMiKS5nZXQoMCkuc3R5bGUuYmFja2dyb3VuZEltYWdlLmxlbmd0aCB8fCAKKyAgICAgICAgICAgICAgKHQuY2hpbGRyZW4oImlucyIpLmdldCgwKS5jbGFzc05hbWUgJiYgdC5jaGlsZHJlbigiaW5zIikuZ2V0KDApLmNsYXNzTmFtZS5yZXBsYWNlKC9qc3RyZWVbXiBdKnwkL2lnLCcnKS5sZW5ndGgpCisgICAgICAgICAgICApIHsgCisgICAgICAgICAgICAgIGxhbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgaWYoJC5pbkFycmF5KCJsYW5ndWFnZXMiLCBzLnBsdWdpbnMpICE9PSAtMSAmJiAkLmlzQXJyYXkocy5sYW5ndWFnZXMpICYmIHMubGFuZ3VhZ2VzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICQuZWFjaChzLmxhbmd1YWdlcywgZnVuY3Rpb24gKGwsIGx2KSB7CisgICAgICAgICAgICAgICAgICBpZih0Lmhhc0NsYXNzKGx2KSkgeworICAgICAgICAgICAgICAgICAgICBsYW5nID0gbHY7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB0bXAyID0geyBhdHRyIDogeyB9LCB0aXRsZSA6IF90aGlzLmdldF90ZXh0KHQsIGxhbmcpIH07IAorICAgICAgICAgICAgICAkLmVhY2goYV9hdHRyLCBmdW5jdGlvbiAoaywgeikgeworICAgICAgICAgICAgICAgIHRtcDEuYXR0clt6XSA9ICh0LmF0dHIoeikgfHwgIiIpLnJlcGxhY2UoL2pzdHJlZVteIF0qfCQvaWcsJycpOworICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgJC5lYWNoKHMubGFuZ3VhZ2VzLCBmdW5jdGlvbiAoaywgeikgeworICAgICAgICAgICAgICAgIGlmKHQuaGFzQ2xhc3MoeikpIHsgdG1wMi5sYW5ndWFnZSA9IHo7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICBpZih0LmNoaWxkcmVuKCJpbnMiKS5nZXQoMCkuY2xhc3NOYW1lLnJlcGxhY2UoL2pzdHJlZVteIF0qfCQvaWcsJycpLnJlcGxhY2UoL15ccyskL2lnLCIiKS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0bXAyLmljb24gPSB0LmNoaWxkcmVuKCJpbnMiKS5nZXQoMCkuY2xhc3NOYW1lLnJlcGxhY2UoL2pzdHJlZVteIF0qfCQvaWcsJycpLnJlcGxhY2UoL15ccyskL2lnLCIiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZih0LmNoaWxkcmVuKCJpbnMiKS5nZXQoMCkuc3R5bGUuYmFja2dyb3VuZEltYWdlLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRtcDIuaWNvbiA9IHQuY2hpbGRyZW4oImlucyIpLmdldCgwKS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UucmVwbGFjZSgidXJsKCIsIiIpLnJlcGxhY2UoIikiLCIiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIHRtcDIgPSBfdGhpcy5nZXRfdGV4dCh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGEubGVuZ3RoID4gMSkgeyB0bXAxLmRhdGEucHVzaCh0bXAyKTsgfQorICAgICAgICAgICAgZWxzZSB7IHRtcDEuZGF0YSA9IHRtcDI7IH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgICBsaSA9IGxpLmZpbmQoIj4gdWwgPiBsaSIpOworICAgICAgICAgIGlmKGxpLmxlbmd0aCkgeyB0bXAxLmNoaWxkcmVuID0gX3RoaXMuZ2V0X2pzb24obGksIGxpX2F0dHIsIGFfYXR0ciwgdHJ1ZSk7IH0KKyAgICAgICAgICByZXN1bHQucHVzaCh0bXAxKTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgfQorICB9KTsKK30pKGpRdWVyeSk7CisvLyovCisKKy8qIAorICoganNUcmVlIGxhbmd1YWdlcyBwbHVnaW4gMS4wCisgKiBBZGRzIHN1cHBvcnQgZm9yIG11bHRpcGxlIGxhbmd1YWdlIHZlcnNpb25zIGluIG9uZSB0cmVlCisgKiBUaGlzIGJhc2ljYWxseSBhbGxvd3MgZm9yIG1hbnkgdGl0bGVzIGNvZXhpc3RpbmcgaW4gb25lIG5vZGUsIGJ1dCBvbmx5IG9uZSBvZiB0aGVtIGJlaW5nIHZpc2libGUgYXQgYW55IGdpdmVuIHRpbWUKKyAqIFRoaXMgaXMgdXNlZnVsIGZvciBtYWludGFpbmluZyB0aGUgc2FtZSBzdHJ1Y3R1cmUgaW4gbWFueSBsYW5ndWFnZXMgKGhlbmNlIHRoZSBuYW1lIG9mIHRoZSBwbHVnaW4pCisgKi8KKyhmdW5jdGlvbiAoJCkgeworICAkLmpzdHJlZS5wbHVnaW4oImxhbmd1YWdlcyIsIHsKKyAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7IHRoaXMuX2xvYWRfY3NzKCk7ICB9LAorICAgIGRlZmF1bHRzIDogW10sCisgICAgX2ZuIDogeworICAgICAgc2V0X2xhbmcgOiBmdW5jdGlvbiAoaSkgeyAKKyAgICAgICAgdmFyIGxhbmdzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkubGFuZ3VhZ2VzLAorICAgICAgICAgIHN0ID0gZmFsc2UsCisgICAgICAgICAgc2VsZWN0b3IgPSAiLmpzdHJlZS0iICsgdGhpcy5nZXRfaW5kZXgoKSArICcgYSc7CisgICAgICAgIGlmKCEkLmlzQXJyYXkobGFuZ3MpIHx8IGxhbmdzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgaWYoJC5pbkFycmF5KGksbGFuZ3MpID09IC0xKSB7CisgICAgICAgICAgaWYoISFsYW5nc1tpXSkgeyBpID0gbGFuZ3NbaV07IH0KKyAgICAgICAgICBlbHNlIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIH0KKyAgICAgICAgaWYoaSA9PSB0aGlzLmRhdGEubGFuZ3VhZ2VzLmN1cnJlbnRfbGFuZ3VhZ2UpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgc3QgPSAkLnZha2F0YS5jc3MuZ2V0X2NzcyhzZWxlY3RvciArICIuIiArIHRoaXMuZGF0YS5sYW5ndWFnZXMuY3VycmVudF9sYW5ndWFnZSwgZmFsc2UsIHRoaXMuZGF0YS5sYW5ndWFnZXMubGFuZ3VhZ2VfY3NzKTsKKyAgICAgICAgaWYoc3QgIT09IGZhbHNlKSB7IHN0LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7IH0KKyAgICAgICAgc3QgPSAkLnZha2F0YS5jc3MuZ2V0X2NzcyhzZWxlY3RvciArICIuIiArIGksIGZhbHNlLCB0aGlzLmRhdGEubGFuZ3VhZ2VzLmxhbmd1YWdlX2Nzcyk7CisgICAgICAgIGlmKHN0ICE9PSBmYWxzZSkgeyBzdC5zdHlsZS5kaXNwbGF5ID0gIiI7IH0KKyAgICAgICAgdGhpcy5kYXRhLmxhbmd1YWdlcy5jdXJyZW50X2xhbmd1YWdlID0gaTsKKyAgICAgICAgdGhpcy5fX2NhbGxiYWNrKGkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0sCisgICAgICBnZXRfbGFuZyA6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sYW5ndWFnZXMuY3VycmVudF9sYW5ndWFnZTsKKyAgICAgIH0sCisgICAgICBnZXRfdGV4dCA6IGZ1bmN0aW9uIChvYmosIGxhbmcpIHsKKyAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKSB8fCB0aGlzLmRhdGEudWkubGFzdF9zZWxlY3RlZDsKKyAgICAgICAgaWYoIW9iai5zaXplKCkpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIHZhciBsYW5ncyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLmxhbmd1YWdlcywKKyAgICAgICAgICBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuY29yZS5odG1sX3RpdGxlczsKKyAgICAgICAgaWYoJC5pc0FycmF5KGxhbmdzKSAmJiBsYW5ncy5sZW5ndGgpIHsKKyAgICAgICAgICBsYW5nID0gKGxhbmcgJiYgJC5pbkFycmF5KGxhbmcsbGFuZ3MpICE9IC0xKSA/IGxhbmcgOiB0aGlzLmRhdGEubGFuZ3VhZ2VzLmN1cnJlbnRfbGFuZ3VhZ2U7CisgICAgICAgICAgb2JqID0gb2JqLmNoaWxkcmVuKCJhLiIgKyBsYW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgb2JqID0gb2JqLmNoaWxkcmVuKCJhOmVxKDApIik7IH0KKyAgICAgICAgaWYocykgeworICAgICAgICAgIG9iaiA9IG9iai5jbG9uZSgpOworICAgICAgICAgIG9iai5jaGlsZHJlbigiSU5TIikucmVtb3ZlKCk7CisgICAgICAgICAgcmV0dXJuIG9iai5odG1sKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgb2JqID0gb2JqLmNvbnRlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5ub2RlVHlwZSA9PSAzOyB9KVswXTsKKyAgICAgICAgICByZXR1cm4gb2JqLm5vZGVWYWx1ZTsKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIHNldF90ZXh0IDogZnVuY3Rpb24gKG9iaiwgdmFsLCBsYW5nKSB7CisgICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaikgfHwgdGhpcy5kYXRhLnVpLmxhc3Rfc2VsZWN0ZWQ7CisgICAgICAgIGlmKCFvYmouc2l6ZSgpKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB2YXIgbGFuZ3MgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS5sYW5ndWFnZXMsCisgICAgICAgICAgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLmNvcmUuaHRtbF90aXRsZXMsCisgICAgICAgICAgdG1wOworICAgICAgICBpZigkLmlzQXJyYXkobGFuZ3MpICYmIGxhbmdzLmxlbmd0aCkgeworICAgICAgICAgIGxhbmcgPSAobGFuZyAmJiAkLmluQXJyYXkobGFuZyxsYW5ncykgIT0gLTEpID8gbGFuZyA6IHRoaXMuZGF0YS5sYW5ndWFnZXMuY3VycmVudF9sYW5ndWFnZTsKKyAgICAgICAgICBvYmogPSBvYmouY2hpbGRyZW4oImEuIiArIGxhbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyBvYmogPSBvYmouY2hpbGRyZW4oImE6ZXEoMCkiKTsgfQorICAgICAgICBpZihzKSB7CisgICAgICAgICAgdG1wID0gb2JqLmNoaWxkcmVuKCJJTlMiKS5jbG9uZSgpOworICAgICAgICAgIG9iai5odG1sKHZhbCkucHJlcGVuZCh0bXApOworICAgICAgICAgIHRoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqLCAibmFtZSIgOiB2YWwsICJsYW5nIiA6IGxhbmcgfSk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgb2JqID0gb2JqLmNvbnRlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5ub2RlVHlwZSA9PSAzOyB9KVswXTsKKyAgICAgICAgICB0aGlzLl9fY2FsbGJhY2soeyAib2JqIiA6IG9iaiwgIm5hbWUiIDogdmFsLCAibGFuZyIgOiBsYW5nIH0pOworICAgICAgICAgIHJldHVybiAob2JqLm5vZGVWYWx1ZSA9IHZhbCk7CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBfbG9hZF9jc3MgOiBmdW5jdGlvbiAoKSB7CisgICAgICAgIHZhciBsYW5ncyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLmxhbmd1YWdlcywKKyAgICAgICAgICBzdHIgPSAiLyogbGFuZ3VhZ2VzIGNzcyAqLyIsCisgICAgICAgICAgc2VsZWN0b3IgPSAiLmpzdHJlZS0iICsgdGhpcy5nZXRfaW5kZXgoKSArICcgYScsCisgICAgICAgICAgbG47CisgICAgICAgIGlmKCQuaXNBcnJheShsYW5ncykgJiYgbGFuZ3MubGVuZ3RoKSB7CisgICAgICAgICAgdGhpcy5kYXRhLmxhbmd1YWdlcy5jdXJyZW50X2xhbmd1YWdlID0gbGFuZ3NbMF07CisgICAgICAgICAgZm9yKGxuID0gMDsgbG4gPCBsYW5ncy5sZW5ndGg7IGxuKyspIHsKKyAgICAgICAgICAgIHN0ciArPSBzZWxlY3RvciArICIuIiArIGxhbmdzW2xuXSArICIgeyI7CisgICAgICAgICAgICBpZihsYW5nc1tsbl0gIT0gdGhpcy5kYXRhLmxhbmd1YWdlcy5jdXJyZW50X2xhbmd1YWdlKSB7IHN0ciArPSAiIGRpc3BsYXk6bm9uZTsgIjsgfQorICAgICAgICAgICAgc3RyICs9ICIgfSAiOworICAgICAgICAgIH0KKyAgICAgICAgICB0aGlzLmRhdGEubGFuZ3VhZ2VzLmxhbmd1YWdlX2NzcyA9ICQudmFrYXRhLmNzcy5hZGRfc2hlZXQoeyAnc3RyJyA6IHN0ciB9KTsKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIGNyZWF0ZV9ub2RlIDogZnVuY3Rpb24gKG9iaiwgcG9zaXRpb24sIGpzLCBjYWxsYmFjaykgeworICAgICAgICB2YXIgdCA9IHRoaXMuX19jYWxsX29sZCh0cnVlLCBvYmosIHBvc2l0aW9uLCBqcywgZnVuY3Rpb24gKHQpIHsKKyAgICAgICAgICB2YXIgbGFuZ3MgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS5sYW5ndWFnZXMsCisgICAgICAgICAgICBhID0gdC5jaGlsZHJlbigiYSIpLAorICAgICAgICAgICAgbG47CisgICAgICAgICAgaWYoJC5pc0FycmF5KGxhbmdzKSAmJiBsYW5ncy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGZvcihsbiA9IDA7IGxuIDwgbGFuZ3MubGVuZ3RoOyBsbisrKSB7CisgICAgICAgICAgICAgIGlmKCFhLmlzKCIuIiArIGxhbmdzW2xuXSkpIHsKKyAgICAgICAgICAgICAgICB0LmFwcGVuZChhLmVxKDApLmNsb25lKCkucmVtb3ZlQ2xhc3MobGFuZ3Muam9pbigiICIpKS5hZGRDbGFzcyhsYW5nc1tsbl0pKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYS5ub3QoIi4iICsgbGFuZ3Muam9pbigiLCAuIikpLnJlbW92ZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihjYWxsYmFjaykgeyBjYWxsYmFjay5jYWxsKHRoaXMsIHQpOyB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gdDsKKyAgICAgIH0KKyAgICB9CisgIH0pOworfSkoalF1ZXJ5KTsKKy8vKi8KKworLyoKKyAqIGpzVHJlZSBjb29raWVzIHBsdWdpbiAxLjAKKyAqIFN0b3JlcyB0aGUgY3VycmVudGx5IG9wZW5lZC9zZWxlY3RlZCBub2RlcyBpbiBhIGNvb2tpZSBhbmQgdGhlbiByZXN0b3JlcyB0aGVtCisgKiBEZXBlbmRzIG9uIHRoZSBqcXVlcnkuY29va2llIHBsdWdpbgorICovCisoZnVuY3Rpb24gKCQpIHsKKyAgJC5qc3RyZWUucGx1Z2luKCJjb29raWVzIiwgeworICAgIF9faW5pdCA6IGZ1bmN0aW9uICgpIHsKKyAgICAgIGlmKHR5cGVvZiAkLmNvb2tpZSA9PT0gInVuZGVmaW5lZCIpIHsgdGhyb3cgImpzVHJlZSBjb29raWU6IGpRdWVyeSBjb29raWUgcGx1Z2luIG5vdCBpbmNsdWRlZC4iOyB9CisKKyAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuY29va2llcywKKyAgICAgICAgdG1wOworICAgICAgaWYoISFzLnNhdmVfb3BlbmVkKSB7CisgICAgICAgIHRtcCA9ICQuY29va2llKHMuc2F2ZV9vcGVuZWQpOworICAgICAgICBpZih0bXAgJiYgdG1wLmxlbmd0aCkgeyB0aGlzLmRhdGEuY29yZS50b19vcGVuID0gdG1wLnNwbGl0KCIsIik7IH0KKyAgICAgIH0KKyAgICAgIGlmKCEhcy5zYXZlX3NlbGVjdGVkKSB7CisgICAgICAgIHRtcCA9ICQuY29va2llKHMuc2F2ZV9zZWxlY3RlZCk7CisgICAgICAgIGlmKHRtcCAmJiB0bXAubGVuZ3RoICYmIHRoaXMuZGF0YS51aSkgeyB0aGlzLmRhdGEudWkudG9fc2VsZWN0ID0gdG1wLnNwbGl0KCIsIik7IH0KKyAgICAgIH0KKyAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpCisgICAgICAgIC5vbmUoICggdGhpcy5kYXRhLnVpID8gInJlc2VsZWN0IiA6ICJyZW9wZW4iICkgKyAiLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKCkgeworICAgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpCisgICAgICAgICAgICAuYmluZCgib3Blbl9ub2RlLmpzdHJlZSBjbG9zZV9ub2RlLmpzdHJlZSBzZWxlY3Rfbm9kZS5qc3RyZWUgZGVzZWxlY3Rfbm9kZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7IAorICAgICAgICAgICAgICAgIGlmKHRoaXMuX2dldF9zZXR0aW5ncygpLmNvb2tpZXMuYXV0b19zYXZlKSB7IHRoaXMuc2F2ZV9jb29raWUoKGUuaGFuZGxlT2JqLm5hbWVzcGFjZSArIGUuaGFuZGxlT2JqLnR5cGUpLnJlcGxhY2UoImpzdHJlZSIsIiIpKTsgfQorICAgICAgICAgICAgICB9LCB0aGlzKSk7CisgICAgICAgIH0sIHRoaXMpKTsKKyAgICB9LAorICAgIGRlZmF1bHRzIDogeworICAgICAgc2F2ZV9vcGVuZWQgICAgOiAianN0cmVlX29wZW4iLAorICAgICAgc2F2ZV9zZWxlY3RlZCAgOiAianN0cmVlX3NlbGVjdCIsCisgICAgICBhdXRvX3NhdmUgICAgOiB0cnVlLAorICAgICAgY29va2llX29wdGlvbnMgIDoge30KKyAgICB9LAorICAgIF9mbiA6IHsKKyAgICAgIHNhdmVfY29va2llIDogZnVuY3Rpb24gKGMpIHsKKyAgICAgICAgaWYodGhpcy5kYXRhLmNvcmUucmVmcmVzaGluZykgeyByZXR1cm47IH0KKyAgICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS5jb29raWVzOworICAgICAgICBpZighYykgeyAvLyBpZiBjYWxsZWQgbWFudWFsbHkgYW5kIG5vdCBieSBldmVudAorICAgICAgICAgIGlmKHMuc2F2ZV9vcGVuZWQpIHsKKyAgICAgICAgICAgIHRoaXMuc2F2ZV9vcGVuZWQoKTsKKyAgICAgICAgICAgICQuY29va2llKHMuc2F2ZV9vcGVuZWQsIHRoaXMuZGF0YS5jb3JlLnRvX29wZW4uam9pbigiLCIpLCBzLmNvb2tpZV9vcHRpb25zKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYocy5zYXZlX3NlbGVjdGVkICYmIHRoaXMuZGF0YS51aSkgeworICAgICAgICAgICAgdGhpcy5zYXZlX3NlbGVjdGVkKCk7CisgICAgICAgICAgICAkLmNvb2tpZShzLnNhdmVfc2VsZWN0ZWQsIHRoaXMuZGF0YS51aS50b19zZWxlY3Quam9pbigiLCIpLCBzLmNvb2tpZV9vcHRpb25zKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN3aXRjaChjKSB7CisgICAgICAgICAgY2FzZSAib3Blbl9ub2RlIjoKKyAgICAgICAgICBjYXNlICJjbG9zZV9ub2RlIjoKKyAgICAgICAgICAgIGlmKCEhcy5zYXZlX29wZW5lZCkgeyAKKyAgICAgICAgICAgICAgdGhpcy5zYXZlX29wZW5lZCgpOyAKKyAgICAgICAgICAgICAgJC5jb29raWUocy5zYXZlX29wZW5lZCwgdGhpcy5kYXRhLmNvcmUudG9fb3Blbi5qb2luKCIsIiksIHMuY29va2llX29wdGlvbnMpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgInNlbGVjdF9ub2RlIjoKKyAgICAgICAgICBjYXNlICJkZXNlbGVjdF9ub2RlIjoKKyAgICAgICAgICAgIGlmKCEhcy5zYXZlX3NlbGVjdGVkICYmIHRoaXMuZGF0YS51aSkgeyAKKyAgICAgICAgICAgICAgdGhpcy5zYXZlX3NlbGVjdGVkKCk7IAorICAgICAgICAgICAgICAkLmNvb2tpZShzLnNhdmVfc2VsZWN0ZWQsIHRoaXMuZGF0YS51aS50b19zZWxlY3Quam9pbigiLCIpLCBzLmNvb2tpZV9vcHRpb25zKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSk7CisgIC8vIGluY2x1ZGUgY29va2llcyBieSBkZWZhdWx0CisgICQuanN0cmVlLmRlZmF1bHRzLnBsdWdpbnMucHVzaCgiY29va2llcyIpOworfSkoalF1ZXJ5KTsKKy8vKi8KKworLyoKKyAqIGpzVHJlZSBzb3J0IHBsdWdpbiAxLjAKKyAqIFNvcnRzIGl0ZW1zIGFscGhhYmV0aWNhbGx5IChvciB1c2luZyBhbnkgb3RoZXIgZnVuY3Rpb24pCisgKi8KKyhmdW5jdGlvbiAoJCkgeworICAkLmpzdHJlZS5wbHVnaW4oInNvcnQiLCB7CisgICAgX19pbml0IDogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkKKyAgICAgICAgLmJpbmQoImxvYWRfbm9kZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7CisgICAgICAgICAgICB2YXIgb2JqID0gdGhpcy5fZ2V0X25vZGUoZGF0YS5yc2x0Lm9iaik7CisgICAgICAgICAgICBvYmogPSBvYmogPT09IC0xID8gdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikgOiBvYmouY2hpbGRyZW4oInVsIik7CisgICAgICAgICAgICB0aGlzLnNvcnQob2JqKTsKKyAgICAgICAgICB9LCB0aGlzKSkKKyAgICAgICAgLmJpbmQoInJlbmFtZV9ub2RlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHsKKyAgICAgICAgICAgIHRoaXMuc29ydChkYXRhLnJzbHQub2JqLnBhcmVudCgpKTsKKyAgICAgICAgICB9LCB0aGlzKSkKKyAgICAgICAgLmJpbmQoIm1vdmVfbm9kZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7CisgICAgICAgICAgICB2YXIgbSA9IGRhdGEucnNsdC5ucCA9PSAtMSA/IHRoaXMuZ2V0X2NvbnRhaW5lcigpIDogZGF0YS5yc2x0Lm5wOworICAgICAgICAgICAgdGhpcy5zb3J0KG0uY2hpbGRyZW4oInVsIikpOworICAgICAgICAgIH0sIHRoaXMpKTsKKyAgICB9LAorICAgIGRlZmF1bHRzIDogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRoaXMuZ2V0X3RleHQoYSkgPiB0aGlzLmdldF90ZXh0KGIpID8gMSA6IC0xOyB9LAorICAgIF9mbiA6IHsKKyAgICAgIHNvcnQgOiBmdW5jdGlvbiAob2JqKSB7CisgICAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuc29ydCwKKyAgICAgICAgICB0ID0gdGhpczsKKyAgICAgICAgb2JqLmFwcGVuZCgkLm1ha2VBcnJheShvYmouY2hpbGRyZW4oImxpIikpLnNvcnQoJC5wcm94eShzLCB0KSkpOworICAgICAgICBvYmouZmluZCgiPiBsaSA+IHVsIikuZWFjaChmdW5jdGlvbigpIHsgdC5zb3J0KCQodGhpcykpOyB9KTsKKyAgICAgICAgdGhpcy5jbGVhbl9ub2RlKG9iaik7CisgICAgICB9CisgICAgfQorICB9KTsKK30pKGpRdWVyeSk7CisvLyovCisKKy8qCisgKiBqc1RyZWUgRE5EIHBsdWdpbiAxLjAKKyAqIERyYWcgYW5kIGRyb3AgcGx1Z2luIGZvciBtb3ZpbmcvY29weWluZyBub2RlcworICovCisoZnVuY3Rpb24gKCQpIHsKKyAgdmFyIG8gPSBmYWxzZSwKKyAgICByID0gZmFsc2UsCisgICAgbSA9IGZhbHNlLAorICAgIHNsaSA9IGZhbHNlLAorICAgIHN0aSA9IGZhbHNlLAorICAgIGRpcjEgPSBmYWxzZSwKKyAgICBkaXIyID0gZmFsc2U7CisgICQudmFrYXRhLmRuZCA9IHsKKyAgICBpc19kb3duIDogZmFsc2UsCisgICAgaXNfZHJhZyA6IGZhbHNlLAorICAgIGhlbHBlciA6IGZhbHNlLAorICAgIHNjcm9sbF9zcGQgOiAxMCwKKyAgICBpbml0X3ggOiAwLAorICAgIGluaXRfeSA6IDAsCisgICAgdGhyZXNob2xkIDogNSwKKyAgICB1c2VyX2RhdGEgOiB7fSwKKworICAgIGRyYWdfc3RhcnQgOiBmdW5jdGlvbiAoZSwgZGF0YSwgaHRtbCkgeyAKKyAgICAgIGlmKCQudmFrYXRhLmRuZC5pc19kcmFnKSB7ICQudmFrYXRhLmRyYWdfc3RvcCh7fSk7IH0KKyAgICAgIHRyeSB7CisgICAgICAgIGUuY3VycmVudFRhcmdldC51bnNlbGVjdGFibGUgPSAib24iOworICAgICAgICBlLmN1cnJlbnRUYXJnZXQub25zZWxlY3RzdGFydCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH07CisgICAgICAgIGlmKGUuY3VycmVudFRhcmdldC5zdHlsZSkgeyBlLmN1cnJlbnRUYXJnZXQuc3R5bGUuTW96VXNlclNlbGVjdCA9ICJub25lIjsgfQorICAgICAgfSBjYXRjaChlcnIpIHsgfQorICAgICAgJC52YWthdGEuZG5kLmluaXRfeCA9IGUucGFnZVg7CisgICAgICAkLnZha2F0YS5kbmQuaW5pdF95ID0gZS5wYWdlWTsKKyAgICAgICQudmFrYXRhLmRuZC51c2VyX2RhdGEgPSBkYXRhOworICAgICAgJC52YWthdGEuZG5kLmlzX2Rvd24gPSB0cnVlOworICAgICAgJC52YWthdGEuZG5kLmhlbHBlciA9ICQoIjxkaXYgaWQ9J3Zha2F0YS1kcmFnZ2VkJz4iKS5odG1sKGh0bWwpLmNzcygib3BhY2l0eSIsICIwLjc1Iik7CisgICAgICAkKGRvY3VtZW50KS5iaW5kKCJtb3VzZW1vdmUiLCAkLnZha2F0YS5kbmQuZHJhZyk7CisgICAgICAkKGRvY3VtZW50KS5iaW5kKCJtb3VzZXVwIiwgJC52YWthdGEuZG5kLmRyYWdfc3RvcCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSwKKyAgICBkcmFnIDogZnVuY3Rpb24gKGUpIHsgCisgICAgICBpZighJC52YWthdGEuZG5kLmlzX2Rvd24pIHsgcmV0dXJuOyB9CisgICAgICBpZighJC52YWthdGEuZG5kLmlzX2RyYWcpIHsKKyAgICAgICAgaWYoTWF0aC5hYnMoZS5wYWdlWCAtICQudmFrYXRhLmRuZC5pbml0X3gpID4gNSB8fCBNYXRoLmFicyhlLnBhZ2VZIC0gJC52YWthdGEuZG5kLmluaXRfeSkgPiA1KSB7IAorICAgICAgICAgICQudmFrYXRhLmRuZC5oZWxwZXIuYXBwZW5kVG8oImJvZHkiKTsKKyAgICAgICAgICAkLnZha2F0YS5kbmQuaXNfZHJhZyA9IHRydWU7CisgICAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlckhhbmRsZXIoImRyYWdfc3RhcnQudmFrYXRhIiwgeyAiZXZlbnQiIDogZSwgImRhdGEiIDogJC52YWthdGEuZG5kLnVzZXJfZGF0YSB9KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgcmV0dXJuOyB9CisgICAgICB9CisKKyAgICAgIC8vIG1heWJlIHVzZSBhIHNjcm9sbGluZyBwYXJlbnQgZWxlbWVudCBpbnN0ZWFkIG9mIGRvY3VtZW50PworICAgICAgaWYoZS50eXBlID09PSAibW91c2Vtb3ZlIikgeyAvLyB0aG91Z2h0IG9mIGFkZGluZyBzY3JvbGwgaW4gb3JkZXIgdG8gbW92ZSB0aGUgaGVscGVyLCBidXQgbW91c2UgcG9pc2l0aW9uIGlzIG4vYQorICAgICAgICB2YXIgZCA9ICQoZG9jdW1lbnQpLCB0ID0gZC5zY3JvbGxUb3AoKSwgbCA9IGQuc2Nyb2xsTGVmdCgpOworICAgICAgICBpZihlLnBhZ2VZIC0gdCA8IDIwKSB7IAorICAgICAgICAgIGlmKHN0aSAmJiBkaXIxID09PSAiZG93biIpIHsgY2xlYXJJbnRlcnZhbChzdGkpOyBzdGkgPSBmYWxzZTsgfQorICAgICAgICAgIGlmKCFzdGkpIHsgZGlyMSA9ICJ1cCI7IHN0aSA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsgJChkb2N1bWVudCkuc2Nyb2xsVG9wKCQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIC0gJC52YWthdGEuZG5kLnNjcm9sbF9zcGQpOyB9LCAxNTApOyB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IAorICAgICAgICAgIGlmKHN0aSAmJiBkaXIxID09PSAidXAiKSB7IGNsZWFySW50ZXJ2YWwoc3RpKTsgc3RpID0gZmFsc2U7IH0KKyAgICAgICAgfQorICAgICAgICBpZigkKHdpbmRvdykuaGVpZ2h0KCkgLSAoZS5wYWdlWSAtIHQpIDwgMjApIHsKKyAgICAgICAgICBpZihzdGkgJiYgZGlyMSA9PT0gInVwIikgeyBjbGVhckludGVydmFsKHN0aSk7IHN0aSA9IGZhbHNlOyB9CisgICAgICAgICAgaWYoIXN0aSkgeyBkaXIxID0gImRvd24iOyBzdGkgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSArICQudmFrYXRhLmRuZC5zY3JvbGxfc3BkKTsgfSwgMTUwKTsgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAKKyAgICAgICAgICBpZihzdGkgJiYgZGlyMSA9PT0gImRvd24iKSB7IGNsZWFySW50ZXJ2YWwoc3RpKTsgc3RpID0gZmFsc2U7IH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKGUucGFnZVggLSBsIDwgMjApIHsKKyAgICAgICAgICBpZihzbGkgJiYgZGlyMiA9PT0gInJpZ2h0IikgeyBjbGVhckludGVydmFsKHNsaSk7IHNsaSA9IGZhbHNlOyB9CisgICAgICAgICAgaWYoIXNsaSkgeyBkaXIyID0gImxlZnQiOyBzbGkgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpIC0gJC52YWthdGEuZG5kLnNjcm9sbF9zcGQpOyB9LCAxNTApOyB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IAorICAgICAgICAgIGlmKHNsaSAmJiBkaXIyID09PSAibGVmdCIpIHsgY2xlYXJJbnRlcnZhbChzbGkpOyBzbGkgPSBmYWxzZTsgfQorICAgICAgICB9CisgICAgICAgIGlmKCQod2luZG93KS53aWR0aCgpIC0gKGUucGFnZVggLSBsKSA8IDIwKSB7CisgICAgICAgICAgaWYoc2xpICYmIGRpcjIgPT09ICJsZWZ0IikgeyBjbGVhckludGVydmFsKHNsaSk7IHNsaSA9IGZhbHNlOyB9CisgICAgICAgICAgaWYoIXNsaSkgeyBkaXIyID0gInJpZ2h0Ijsgc2xpID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgeyAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSArICQudmFrYXRhLmRuZC5zY3JvbGxfc3BkKTsgfSwgMTUwKTsgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAKKyAgICAgICAgICBpZihzbGkgJiYgZGlyMiA9PT0gInJpZ2h0IikgeyBjbGVhckludGVydmFsKHNsaSk7IHNsaSA9IGZhbHNlOyB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgJC52YWthdGEuZG5kLmhlbHBlci5jc3MoeyBsZWZ0IDogKGUucGFnZVggKyA1KSArICJweCIsIHRvcCA6IChlLnBhZ2VZICsgMTApICsgInB4IiB9KTsKKyAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKCJkcmFnLnZha2F0YSIsIHsgImV2ZW50IiA6IGUsICJkYXRhIiA6ICQudmFrYXRhLmRuZC51c2VyX2RhdGEgfSk7CisgICAgfSwKKyAgICBkcmFnX3N0b3AgOiBmdW5jdGlvbiAoZSkgeworICAgICAgJChkb2N1bWVudCkudW5iaW5kKCJtb3VzZW1vdmUiLCAkLnZha2F0YS5kbmQuZHJhZyk7CisgICAgICAkKGRvY3VtZW50KS51bmJpbmQoIm1vdXNldXAiLCAkLnZha2F0YS5kbmQuZHJhZ19zdG9wKTsKKyAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKCJkcmFnX3N0b3AudmFrYXRhIiwgeyAiZXZlbnQiIDogZSwgImRhdGEiIDogJC52YWthdGEuZG5kLnVzZXJfZGF0YSB9KTsKKyAgICAgICQudmFrYXRhLmRuZC5oZWxwZXIucmVtb3ZlKCk7CisgICAgICAkLnZha2F0YS5kbmQuaW5pdF94ID0gMDsKKyAgICAgICQudmFrYXRhLmRuZC5pbml0X3kgPSAwOworICAgICAgJC52YWthdGEuZG5kLnVzZXJfZGF0YSA9IHt9OworICAgICAgJC52YWthdGEuZG5kLmlzX2Rvd24gPSBmYWxzZTsKKyAgICAgICQudmFrYXRhLmRuZC5pc19kcmFnID0gZmFsc2U7CisgICAgfQorICB9OworICAkKGZ1bmN0aW9uKCkgeworICAgIHZhciBjc3Nfc3RyaW5nID0gJyN2YWthdGEtZHJhZ2dlZCB7IGRpc3BsYXk6YmxvY2s7IG1hcmdpbjowIDAgMCAwOyBwYWRkaW5nOjRweCA0cHggNHB4IDI0cHg7IHBvc2l0aW9uOmFic29sdXRlOyB0b3A6LTIwMDBweDsgbGluZS1oZWlnaHQ6MTZweDsgei1pbmRleDoxMDAwMDsgfSAnOworICAgICQudmFrYXRhLmNzcy5hZGRfc2hlZXQoeyBzdHIgOiBjc3Nfc3RyaW5nIH0pOworICB9KTsKKworICAkLmpzdHJlZS5wbHVnaW4oImRuZCIsIHsKKyAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLmRhdGEuZG5kID0geworICAgICAgICBhY3RpdmUgOiBmYWxzZSwKKyAgICAgICAgYWZ0ZXIgOiBmYWxzZSwKKyAgICAgICAgaW5zaWRlIDogZmFsc2UsCisgICAgICAgIGJlZm9yZSA6IGZhbHNlLAorICAgICAgICBvZmYgOiBmYWxzZSwKKyAgICAgICAgcHJlcGFyZWQgOiBmYWxzZSwKKyAgICAgICAgdyA6IDAsCisgICAgICAgIHRvMSA6IGZhbHNlLAorICAgICAgICB0bzIgOiBmYWxzZSwKKyAgICAgICAgY29mIDogZmFsc2UsCisgICAgICAgIGN3IDogZmFsc2UsCisgICAgICAgIGNoIDogZmFsc2UsCisgICAgICAgIGkxIDogZmFsc2UsCisgICAgICAgIGkyIDogZmFsc2UKKyAgICAgIH07CisgICAgICB0aGlzLmdldF9jb250YWluZXIoKQorICAgICAgICAuYmluZCgibW91c2VlbnRlci5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGlmKCQudmFrYXRhLmRuZC5pc19kcmFnICYmICQudmFrYXRhLmRuZC51c2VyX2RhdGEuanN0cmVlICYmIHRoaXMuZGF0YS50aGVtZXMpIHsKKyAgICAgICAgICAgICAgbS5hdHRyKCJjbGFzcyIsICJqc3RyZWUtIiArIHRoaXMuZGF0YS50aGVtZXMudGhlbWUpOyAKKyAgICAgICAgICAgICAgJC52YWthdGEuZG5kLmhlbHBlci5hdHRyKCJjbGFzcyIsICJqc3RyZWUtZG5kLWhlbHBlciBqc3RyZWUtIiArIHRoaXMuZGF0YS50aGVtZXMudGhlbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHRoaXMpKQorICAgICAgICAuYmluZCgibW91c2VsZWF2ZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIGlmKCQudmFrYXRhLmRuZC5pc19kcmFnICYmICQudmFrYXRhLmRuZC51c2VyX2RhdGEuanN0cmVlKSB7CisgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmQuaTEpIHsgY2xlYXJJbnRlcnZhbCh0aGlzLmRhdGEuZG5kLmkxKTsgfQorICAgICAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLmkyKSB7IGNsZWFySW50ZXJ2YWwodGhpcy5kYXRhLmRuZC5pMik7IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB0aGlzKSkKKyAgICAgICAgLmJpbmQoIm1vdXNlbW92ZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICBpZigkLnZha2F0YS5kbmQuaXNfZHJhZyAmJiAkLnZha2F0YS5kbmQudXNlcl9kYXRhLmpzdHJlZSkgeworICAgICAgICAgICAgICB2YXIgY250ID0gdGhpcy5nZXRfY29udGFpbmVyKClbMF07CisKKyAgICAgICAgICAgICAgLy8gSG9yaXpvbnRhbCBzY3JvbGwKKyAgICAgICAgICAgICAgaWYoZS5wYWdlWCArIDI0ID4gdGhpcy5kYXRhLmRuZC5jb2YubGVmdCArIHRoaXMuZGF0YS5kbmQuY3cpIHsKKyAgICAgICAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLmkxKSB7IGNsZWFySW50ZXJ2YWwodGhpcy5kYXRhLmRuZC5pMSk7IH0KKyAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmkxID0gc2V0SW50ZXJ2YWwoJC5wcm94eShmdW5jdGlvbiAoKSB7IHRoaXMuc2Nyb2xsTGVmdCArPSAkLnZha2F0YS5kbmQuc2Nyb2xsX3NwZDsgfSwgY250KSwgMTAwKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIGlmKGUucGFnZVggLSAyNCA8IHRoaXMuZGF0YS5kbmQuY29mLmxlZnQpIHsKKyAgICAgICAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLmkxKSB7IGNsZWFySW50ZXJ2YWwodGhpcy5kYXRhLmRuZC5pMSk7IH0KKyAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmkxID0gc2V0SW50ZXJ2YWwoJC5wcm94eShmdW5jdGlvbiAoKSB7IHRoaXMuc2Nyb2xsTGVmdCAtPSAkLnZha2F0YS5kbmQuc2Nyb2xsX3NwZDsgfSwgY250KSwgMTAwKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLmkxKSB7IGNsZWFySW50ZXJ2YWwodGhpcy5kYXRhLmRuZC5pMSk7IH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8vIFZlcnRpY2FsIHNjcm9sbAorICAgICAgICAgICAgICBpZihlLnBhZ2VZICsgMjQgPiB0aGlzLmRhdGEuZG5kLmNvZi50b3AgKyB0aGlzLmRhdGEuZG5kLmNoKSB7CisgICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmRuZC5pMikgeyBjbGVhckludGVydmFsKHRoaXMuZGF0YS5kbmQuaTIpOyB9CisgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmRuZC5pMiA9IHNldEludGVydmFsKCQucHJveHkoZnVuY3Rpb24gKCkgeyB0aGlzLnNjcm9sbFRvcCArPSAkLnZha2F0YS5kbmQuc2Nyb2xsX3NwZDsgfSwgY250KSwgMTAwKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIGlmKGUucGFnZVkgLSAyNCA8IHRoaXMuZGF0YS5kbmQuY29mLnRvcCkgeworICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmQuaTIpIHsgY2xlYXJJbnRlcnZhbCh0aGlzLmRhdGEuZG5kLmkyKTsgfQorICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQuaTIgPSBzZXRJbnRlcnZhbCgkLnByb3h5KGZ1bmN0aW9uICgpIHsgdGhpcy5zY3JvbGxUb3AgLT0gJC52YWthdGEuZG5kLnNjcm9sbF9zcGQ7IH0sIGNudCksIDEwMCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmRuZC5pMikgeyBjbGVhckludGVydmFsKHRoaXMuZGF0YS5kbmQuaTIpOyB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHRoaXMpKQorICAgICAgICAuZGVsZWdhdGUoImEiLCAibW91c2Vkb3duLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUpIHsgCisgICAgICAgICAgICBpZihlLndoaWNoID09PSAxKSB7CisgICAgICAgICAgICAgIHRoaXMuc3RhcnRfZHJhZyhlLmN1cnJlbnRUYXJnZXQsIGUpOworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgdGhpcykpCisgICAgICAgIC5kZWxlZ2F0ZSgiYSIsICJtb3VzZWVudGVyLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUpIHsgCisgICAgICAgICAgICBpZigkLnZha2F0YS5kbmQuaXNfZHJhZyAmJiAkLnZha2F0YS5kbmQudXNlcl9kYXRhLmpzdHJlZSkgeworICAgICAgICAgICAgICB0aGlzLmRuZF9lbnRlcihlLmN1cnJlbnRUYXJnZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHRoaXMpKQorICAgICAgICAuZGVsZWdhdGUoImEiLCAibW91c2Vtb3ZlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUpIHsgCisgICAgICAgICAgICBpZigkLnZha2F0YS5kbmQuaXNfZHJhZyAmJiAkLnZha2F0YS5kbmQudXNlcl9kYXRhLmpzdHJlZSkgeworICAgICAgICAgICAgICBpZih0eXBlb2YgdGhpcy5kYXRhLmRuZC5vZmYudG9wID09PSAidW5kZWZpbmVkIikgeyB0aGlzLmRhdGEuZG5kLm9mZiA9ICQoZS50YXJnZXQpLm9mZnNldCgpOyB9CisgICAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQudyA9IChlLnBhZ2VZIC0gKHRoaXMuZGF0YS5kbmQub2ZmLnRvcCB8fCAwKSkgJSB0aGlzLmRhdGEuY29yZS5saV9oZWlnaHQ7CisgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmQudyA8IDApIHsgdGhpcy5kYXRhLmRuZC53ICs9IHRoaXMuZGF0YS5jb3JlLmxpX2hlaWdodDsgfQorICAgICAgICAgICAgICB0aGlzLmRuZF9zaG93KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgdGhpcykpCisgICAgICAgIC5kZWxlZ2F0ZSgiYSIsICJtb3VzZWxlYXZlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUpIHsgCisgICAgICAgICAgICBpZigkLnZha2F0YS5kbmQuaXNfZHJhZyAmJiAkLnZha2F0YS5kbmQudXNlcl9kYXRhLmpzdHJlZSkgeworICAgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmFmdGVyICAgID0gZmFsc2U7CisgICAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQuYmVmb3JlICA9IGZhbHNlOworICAgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmluc2lkZSAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgJC52YWthdGEuZG5kLmhlbHBlci5jaGlsZHJlbigiaW5zIikuYXR0cigiY2xhc3MiLCJqc3RyZWUtaW52YWxpZCIpOworICAgICAgICAgICAgICBtLmhpZGUoKTsKKyAgICAgICAgICAgICAgaWYociAmJiByWzBdID09PSBlLnRhcmdldC5wYXJlbnROb2RlKSB7CisgICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmRuZC50bzEpIHsKKyAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRhdGEuZG5kLnRvMSk7CisgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLnRvMSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLnRvMikgeworICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZGF0YS5kbmQudG8yKTsKKyAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQudG8yID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgdGhpcykpCisgICAgICAgIC5kZWxlZ2F0ZSgiYSIsICJtb3VzZXVwLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUpIHsgCisgICAgICAgICAgICBpZigkLnZha2F0YS5kbmQuaXNfZHJhZyAmJiAkLnZha2F0YS5kbmQudXNlcl9kYXRhLmpzdHJlZSkgeworICAgICAgICAgICAgICB0aGlzLmRuZF9maW5pc2goZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgdGhpcykpOworCisgICAgICAkKGRvY3VtZW50KQorICAgICAgICAuYmluZCgiZHJhZ19zdG9wLnZha2F0YSIsICQucHJveHkoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgdGhpcy5kYXRhLmRuZC5hZnRlciAgICA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5kYXRhLmRuZC5iZWZvcmUgID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmluc2lkZSAgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQub2ZmICAgID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLnByZXBhcmVkICA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5kYXRhLmRuZC53ICAgICAgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQudG8xICAgID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLnRvMiAgICA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5kYXRhLmRuZC5hY3RpdmUgID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmZvcmVpZ24gID0gZmFsc2U7CisgICAgICAgICAgICBpZihtKSB7IG0uY3NzKHsgInRvcCIgOiAiLTIwMDBweCIgfSk7IH0KKyAgICAgICAgICB9LCB0aGlzKSkKKyAgICAgICAgLmJpbmQoImRyYWdfc3RhcnQudmFrYXRhIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkgeworICAgICAgICAgICAgaWYoZGF0YS5kYXRhLmpzdHJlZSkgeyAKKyAgICAgICAgICAgICAgdmFyIGV0ID0gJChkYXRhLmV2ZW50LnRhcmdldCk7CisgICAgICAgICAgICAgIGlmKGV0LmNsb3Nlc3QoIi5qc3RyZWUiKS5oYXNDbGFzcygianN0cmVlLSIgKyB0aGlzLmdldF9pbmRleCgpKSkgeworICAgICAgICAgICAgICAgIHRoaXMuZG5kX2VudGVyKGV0KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHRoaXMpKTsKKworICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS5kbmQ7CisgICAgICBpZihzLmRyYWdfdGFyZ2V0KSB7CisgICAgICAgICQoZG9jdW1lbnQpCisgICAgICAgICAgLmRlbGVnYXRlKHMuZHJhZ190YXJnZXQsICJtb3VzZWRvd24uanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZSkgeworICAgICAgICAgICAgbyA9IGUudGFyZ2V0OworICAgICAgICAgICAgJC52YWthdGEuZG5kLmRyYWdfc3RhcnQoZSwgeyBqc3RyZWUgOiB0cnVlLCBvYmogOiBlLnRhcmdldCB9LCAiPGlucyBjbGFzcz0nanN0cmVlLWljb24nPjwvaW5zPiIgKyAkKGUudGFyZ2V0KS50ZXh0KCkgKTsKKyAgICAgICAgICAgIGlmKHRoaXMuZGF0YS50aGVtZXMpIHsgCisgICAgICAgICAgICAgIG0uYXR0cigiY2xhc3MiLCAianN0cmVlLSIgKyB0aGlzLmRhdGEudGhlbWVzLnRoZW1lKTsgCisgICAgICAgICAgICAgICQudmFrYXRhLmRuZC5oZWxwZXIuYXR0cigiY2xhc3MiLCAianN0cmVlLWRuZC1oZWxwZXIganN0cmVlLSIgKyB0aGlzLmRhdGEudGhlbWVzLnRoZW1lKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAkLnZha2F0YS5kbmQuaGVscGVyLmNoaWxkcmVuKCJpbnMiKS5hdHRyKCJjbGFzcyIsImpzdHJlZS1pbnZhbGlkIik7CisgICAgICAgICAgICB2YXIgY250ID0gdGhpcy5nZXRfY29udGFpbmVyKCk7CisgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmNvZiA9IGNudC5vZmZzZXQoKTsKKyAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQuY3cgPSBwYXJzZUludChjbnQud2lkdGgoKSwxMCk7CisgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLmNoID0gcGFyc2VJbnQoY250LmhlaWdodCgpLDEwKTsKKyAgICAgICAgICAgIHRoaXMuZGF0YS5kbmQuZm9yZWlnbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfSwgdGhpcykpOworICAgICAgfQorICAgICAgaWYocy5kcm9wX3RhcmdldCkgeworICAgICAgICAkKGRvY3VtZW50KQorICAgICAgICAgIC5kZWxlZ2F0ZShzLmRyb3BfdGFyZ2V0LCAibW91c2VlbnRlci5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmQuYWN0aXZlICYmIHRoaXMuX2dldF9zZXR0aW5ncygpLmRuZC5kcm9wX2NoZWNrLmNhbGwodGhpcywgeyAibyIgOiBvLCAiciIgOiAkKGUudGFyZ2V0KSB9KSkgeworICAgICAgICAgICAgICAgICQudmFrYXRhLmRuZC5oZWxwZXIuY2hpbGRyZW4oImlucyIpLmF0dHIoImNsYXNzIiwianN0cmVlLW9rIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIHRoaXMpKQorICAgICAgICAgIC5kZWxlZ2F0ZShzLmRyb3BfdGFyZ2V0LCAibW91c2VsZWF2ZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmQuYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgJC52YWthdGEuZG5kLmhlbHBlci5jaGlsZHJlbigiaW5zIikuYXR0cigiY2xhc3MiLCJqc3RyZWUtaW52YWxpZCIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCB0aGlzKSkKKyAgICAgICAgICAuZGVsZWdhdGUocy5kcm9wX3RhcmdldCwgIm1vdXNldXAuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZSkgeworICAgICAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLmFjdGl2ZSAmJiAkLnZha2F0YS5kbmQuaGVscGVyLmNoaWxkcmVuKCJpbnMiKS5oYXNDbGFzcygianN0cmVlLW9rIikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9nZXRfc2V0dGluZ3MoKS5kbmQuZHJvcF9maW5pc2guY2FsbCh0aGlzLCB7ICJvIiA6IG8sICJyIiA6ICQoZS50YXJnZXQpIH0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCB0aGlzKSk7CisgICAgICB9CisgICAgfSwKKyAgICBkZWZhdWx0cyA6IHsKKyAgICAgIGNvcHlfbW9kaWZpZXIgIDogImN0cmwiLAorICAgICAgY2hlY2tfdGltZW91dCAgOiAyMDAsCisgICAgICBvcGVuX3RpbWVvdXQgIDogNTAwLAorICAgICAgZHJvcF90YXJnZXQgICAgOiAiLmpzdHJlZS1kcm9wIiwKKyAgICAgIGRyb3BfY2hlY2sgICAgOiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gdHJ1ZTsgfSwKKyAgICAgIGRyb3BfZmluaXNoICAgIDogJC5ub29wLAorICAgICAgZHJhZ190YXJnZXQgICAgOiAiLmpzdHJlZS1kcmFnZ2FibGUiLAorICAgICAgZHJhZ19maW5pc2ggICAgOiAkLm5vb3AsCisgICAgICBkcmFnX2NoZWNrICAgIDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIHsgYWZ0ZXIgOiBmYWxzZSwgYmVmb3JlIDogZmFsc2UsIGluc2lkZSA6IHRydWUgfTsgfQorICAgIH0sCisgICAgX2ZuIDogeworICAgICAgZG5kX3ByZXBhcmUgOiBmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmKCFyIHx8ICFyLmxlbmd0aCkgeyByZXR1cm47IH0KKyAgICAgICAgdGhpcy5kYXRhLmRuZC5vZmYgPSByLm9mZnNldCgpOworICAgICAgICBpZih0aGlzLl9nZXRfc2V0dGluZ3MoKS5jb3JlLnJ0bCkgeworICAgICAgICAgIHRoaXMuZGF0YS5kbmQub2ZmLnJpZ2h0ID0gdGhpcy5kYXRhLmRuZC5vZmYubGVmdCArIHIud2lkdGgoKTsKKyAgICAgICAgfQorICAgICAgICBpZih0aGlzLmRhdGEuZG5kLmZvcmVpZ24pIHsKKyAgICAgICAgICB2YXIgYSA9IHRoaXMuX2dldF9zZXR0aW5ncygpLmRuZC5kcmFnX2NoZWNrLmNhbGwodGhpcywgeyAibyIgOiBvLCAiciIgOiByIH0pOworICAgICAgICAgIHRoaXMuZGF0YS5kbmQuYWZ0ZXIgPSBhLmFmdGVyOworICAgICAgICAgIHRoaXMuZGF0YS5kbmQuYmVmb3JlID0gYS5iZWZvcmU7CisgICAgICAgICAgdGhpcy5kYXRhLmRuZC5pbnNpZGUgPSBhLmluc2lkZTsKKyAgICAgICAgICB0aGlzLmRhdGEuZG5kLnByZXBhcmVkID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gdGhpcy5kbmRfc2hvdygpOworICAgICAgICB9CisgICAgICAgIHRoaXMucHJlcGFyZV9tb3ZlKG8sIHIsICJiZWZvcmUiKTsKKyAgICAgICAgdGhpcy5kYXRhLmRuZC5iZWZvcmUgPSB0aGlzLmNoZWNrX21vdmUoKTsKKyAgICAgICAgdGhpcy5wcmVwYXJlX21vdmUobywgciwgImFmdGVyIik7CisgICAgICAgIHRoaXMuZGF0YS5kbmQuYWZ0ZXIgPSB0aGlzLmNoZWNrX21vdmUoKTsKKyAgICAgICAgaWYodGhpcy5faXNfbG9hZGVkKHIpKSB7CisgICAgICAgICAgdGhpcy5wcmVwYXJlX21vdmUobywgciwgImluc2lkZSIpOworICAgICAgICAgIHRoaXMuZGF0YS5kbmQuaW5zaWRlID0gdGhpcy5jaGVja19tb3ZlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdGhpcy5kYXRhLmRuZC5pbnNpZGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmRhdGEuZG5kLnByZXBhcmVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZG5kX3Nob3coKTsKKyAgICAgIH0sCisgICAgICBkbmRfc2hvdyA6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgaWYoIXRoaXMuZGF0YS5kbmQucHJlcGFyZWQpIHsgcmV0dXJuOyB9CisgICAgICAgIHZhciBvID0gWyJiZWZvcmUiLCJpbnNpZGUiLCJhZnRlciJdLAorICAgICAgICAgIHIgPSBmYWxzZSwKKyAgICAgICAgICBydGwgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS5jb3JlLnJ0bCwKKyAgICAgICAgICBwb3M7CisgICAgICAgIGlmKHRoaXMuZGF0YS5kbmQudyA8IHRoaXMuZGF0YS5jb3JlLmxpX2hlaWdodC8zKSB7IG8gPSBbImJlZm9yZSIsImluc2lkZSIsImFmdGVyIl07IH0KKyAgICAgICAgZWxzZSBpZih0aGlzLmRhdGEuZG5kLncgPD0gdGhpcy5kYXRhLmNvcmUubGlfaGVpZ2h0KjIvMykgeworICAgICAgICAgIG8gPSB0aGlzLmRhdGEuZG5kLncgPCB0aGlzLmRhdGEuY29yZS5saV9oZWlnaHQvMiA/IFsiaW5zaWRlIiwiYmVmb3JlIiwiYWZ0ZXIiXSA6IFsiaW5zaWRlIiwiYWZ0ZXIiLCJiZWZvcmUiXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgbyA9IFsiYWZ0ZXIiLCJpbnNpZGUiLCJiZWZvcmUiXTsgfQorICAgICAgICAkLmVhY2gobywgJC5wcm94eShmdW5jdGlvbiAoaSwgdmFsKSB7IAorICAgICAgICAgIGlmKHRoaXMuZGF0YS5kbmRbdmFsXSkgeworICAgICAgICAgICAgJC52YWthdGEuZG5kLmhlbHBlci5jaGlsZHJlbigiaW5zIikuYXR0cigiY2xhc3MiLCJqc3RyZWUtb2siKTsKKyAgICAgICAgICAgIHIgPSB2YWw7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9LCB0aGlzKSk7CisgICAgICAgIGlmKHIgPT09IGZhbHNlKSB7ICQudmFrYXRhLmRuZC5oZWxwZXIuY2hpbGRyZW4oImlucyIpLmF0dHIoImNsYXNzIiwianN0cmVlLWludmFsaWQiKTsgfQorICAgICAgICAKKyAgICAgICAgcG9zID0gcnRsID8gKHRoaXMuZGF0YS5kbmQub2ZmLnJpZ2h0IC0gMTgpIDogKHRoaXMuZGF0YS5kbmQub2ZmLmxlZnQgKyAxMCk7CisgICAgICAgIHN3aXRjaChyKSB7CisgICAgICAgICAgY2FzZSAiYmVmb3JlIjoKKyAgICAgICAgICAgIG0uY3NzKHsgImxlZnQiIDogcG9zICsgInB4IiwgInRvcCIgOiAodGhpcy5kYXRhLmRuZC5vZmYudG9wIC0gNikgKyAicHgiIH0pLnNob3coKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgImFmdGVyIjoKKyAgICAgICAgICAgIG0uY3NzKHsgImxlZnQiIDogcG9zICsgInB4IiwgInRvcCIgOiAodGhpcy5kYXRhLmRuZC5vZmYudG9wICsgdGhpcy5kYXRhLmNvcmUubGlfaGVpZ2h0IC0gNykgKyAicHgiIH0pLnNob3coKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgImluc2lkZSI6CisgICAgICAgICAgICBtLmNzcyh7ICJsZWZ0IiA6IHBvcyArICggcnRsID8gLTQgOiA0KSArICJweCIsICJ0b3AiIDogKHRoaXMuZGF0YS5kbmQub2ZmLnRvcCArIHRoaXMuZGF0YS5jb3JlLmxpX2hlaWdodC8yIC0gNSkgKyAicHgiIH0pLnNob3coKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtLmhpZGUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByOworICAgICAgfSwKKyAgICAgIGRuZF9vcGVuIDogZnVuY3Rpb24gKCkgeworICAgICAgICB0aGlzLmRhdGEuZG5kLnRvMiA9IGZhbHNlOworICAgICAgICB0aGlzLm9wZW5fbm9kZShyLCAkLnByb3h5KHRoaXMuZG5kX3ByZXBhcmUsdGhpcyksIHRydWUpOworICAgICAgfSwKKyAgICAgIGRuZF9maW5pc2ggOiBmdW5jdGlvbiAoZSkgeworICAgICAgICBpZih0aGlzLmRhdGEuZG5kLmZvcmVpZ24pIHsKKyAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLmFmdGVyIHx8IHRoaXMuZGF0YS5kbmQuYmVmb3JlIHx8IHRoaXMuZGF0YS5kbmQuaW5zaWRlKSB7CisgICAgICAgICAgICB0aGlzLl9nZXRfc2V0dGluZ3MoKS5kbmQuZHJhZ19maW5pc2guY2FsbCh0aGlzLCB7ICJvIiA6IG8sICJyIiA6IHIgfSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHRoaXMuZG5kX3ByZXBhcmUoKTsKKyAgICAgICAgICB0aGlzLm1vdmVfbm9kZShvLCByLCB0aGlzLmRuZF9zaG93KCksIGVbdGhpcy5fZ2V0X3NldHRpbmdzKCkuZG5kLmNvcHlfbW9kaWZpZXIgKyAiS2V5Il0pOworICAgICAgICB9CisgICAgICAgIG8gPSBmYWxzZTsKKyAgICAgICAgciA9IGZhbHNlOworICAgICAgICBtLmhpZGUoKTsKKyAgICAgIH0sCisgICAgICBkbmRfZW50ZXIgOiBmdW5jdGlvbiAob2JqKSB7CisgICAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkuZG5kOworICAgICAgICB0aGlzLmRhdGEuZG5kLnByZXBhcmVkID0gZmFsc2U7CisgICAgICAgIHIgPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICBpZihzLmNoZWNrX3RpbWVvdXQpIHsgCisgICAgICAgICAgLy8gZG8gdGhlIGNhbGN1bGF0aW9ucyBhZnRlciBhIG1pbmltYWwgdGltZW91dCAodXNlcnMgdGVuZCB0byBkcmFnIHF1aWNrbHkgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24pCisgICAgICAgICAgaWYodGhpcy5kYXRhLmRuZC50bzEpIHsgY2xlYXJUaW1lb3V0KHRoaXMuZGF0YS5kbmQudG8xKTsgfQorICAgICAgICAgIHRoaXMuZGF0YS5kbmQudG8xID0gc2V0VGltZW91dCgkLnByb3h5KHRoaXMuZG5kX3ByZXBhcmUsIHRoaXMpLCBzLmNoZWNrX3RpbWVvdXQpOyAKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgCisgICAgICAgICAgdGhpcy5kbmRfcHJlcGFyZSgpOyAKKyAgICAgICAgfQorICAgICAgICBpZihzLm9wZW5fdGltZW91dCkgeyAKKyAgICAgICAgICBpZih0aGlzLmRhdGEuZG5kLnRvMikgeyBjbGVhclRpbWVvdXQodGhpcy5kYXRhLmRuZC50bzIpOyB9CisgICAgICAgICAgaWYociAmJiByLmxlbmd0aCAmJiByLmhhc0NsYXNzKCJqc3RyZWUtY2xvc2VkIikpIHsgCisgICAgICAgICAgICAvLyBpZiB0aGUgbm9kZSBpcyBjbG9zZWQgLSBvcGVuIGl0LCB0aGVuIHJlY2FsY3VsYXRlCisgICAgICAgICAgICB0aGlzLmRhdGEuZG5kLnRvMiA9IHNldFRpbWVvdXQoJC5wcm94eSh0aGlzLmRuZF9vcGVuLCB0aGlzKSwgcy5vcGVuX3RpbWVvdXQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZihyICYmIHIubGVuZ3RoICYmIHIuaGFzQ2xhc3MoImpzdHJlZS1jbG9zZWQiKSkgeyAKKyAgICAgICAgICAgIHRoaXMuZG5kX29wZW4oKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBzdGFydF9kcmFnIDogZnVuY3Rpb24gKG9iaiwgZSkgeworICAgICAgICBvID0gdGhpcy5fZ2V0X25vZGUob2JqKTsKKyAgICAgICAgaWYodGhpcy5kYXRhLnVpICYmIHRoaXMuaXNfc2VsZWN0ZWQobykpIHsgbyA9IHRoaXMuX2dldF9ub2RlKG51bGwsIHRydWUpOyB9CisgICAgICAgICQudmFrYXRhLmRuZC5kcmFnX3N0YXJ0KGUsIHsganN0cmVlIDogdHJ1ZSwgb2JqIDogbyB9LCAiPGlucyBjbGFzcz0nanN0cmVlLWljb24nPjwvaW5zPiIgKyAoby5sZW5ndGggPiAxID8gIk11bHRpcGxlIHNlbGVjdGlvbiIgOiB0aGlzLmdldF90ZXh0KG8pKSApOworICAgICAgICBpZih0aGlzLmRhdGEudGhlbWVzKSB7IAorICAgICAgICAgIG0uYXR0cigiY2xhc3MiLCAianN0cmVlLSIgKyB0aGlzLmRhdGEudGhlbWVzLnRoZW1lKTsgCisgICAgICAgICAgJC52YWthdGEuZG5kLmhlbHBlci5hdHRyKCJjbGFzcyIsICJqc3RyZWUtZG5kLWhlbHBlciBqc3RyZWUtIiArIHRoaXMuZGF0YS50aGVtZXMudGhlbWUpOyAKKyAgICAgICAgfQorICAgICAgICB2YXIgY250ID0gdGhpcy5nZXRfY29udGFpbmVyKCk7CisgICAgICAgIHRoaXMuZGF0YS5kbmQuY29mID0gY250LmNoaWxkcmVuKCJ1bCIpLm9mZnNldCgpOworICAgICAgICB0aGlzLmRhdGEuZG5kLmN3ID0gcGFyc2VJbnQoY250LndpZHRoKCksMTApOworICAgICAgICB0aGlzLmRhdGEuZG5kLmNoID0gcGFyc2VJbnQoY250LmhlaWdodCgpLDEwKTsKKyAgICAgICAgdGhpcy5kYXRhLmRuZC5hY3RpdmUgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgfSk7CisgICQoZnVuY3Rpb24oKSB7CisgICAgdmFyIGNzc19zdHJpbmcgPSAnJyArIAorICAgICAgJyN2YWthdGEtZHJhZ2dlZCBpbnMgeyBkaXNwbGF5OmJsb2NrOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgd2lkdGg6MTZweDsgaGVpZ2h0OjE2cHg7IG1hcmdpbjowIDAgMCAwOyBwYWRkaW5nOjA7IHBvc2l0aW9uOmFic29sdXRlOyB0b3A6NHB4OyBsZWZ0OjRweDsgfSAnICsgCisgICAgICAnI3Zha2F0YS1kcmFnZ2VkIC5qc3RyZWUtb2sgeyBiYWNrZ3JvdW5kOmdyZWVuOyB9ICcgKyAKKyAgICAgICcjdmFrYXRhLWRyYWdnZWQgLmpzdHJlZS1pbnZhbGlkIHsgYmFja2dyb3VuZDpyZWQ7IH0gJyArIAorICAgICAgJyNqc3RyZWUtbWFya2VyIHsgcGFkZGluZzowOyBtYXJnaW46MDsgbGluZS1oZWlnaHQ6MTJweDsgZm9udC1zaXplOjFweDsgb3ZlcmZsb3c6aGlkZGVuOyBoZWlnaHQ6MTJweDsgd2lkdGg6OHB4OyBwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOi0zMHB4OyB6LWluZGV4OjEwMDAwOyBiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7IGRpc3BsYXk6bm9uZTsgYmFja2dyb3VuZC1jb2xvcjpzaWx2ZXI7IH0gJzsKKyAgICAkLnZha2F0YS5jc3MuYWRkX3NoZWV0KHsgc3RyIDogY3NzX3N0cmluZyB9KTsKKyAgICBtID0gJCgiPGRpdj4iKS5hdHRyKHsgaWQgOiAianN0cmVlLW1hcmtlciIgfSkuaGlkZSgpLmFwcGVuZFRvKCJib2R5Iik7CisgICAgJChkb2N1bWVudCkuYmluZCgiZHJhZ19zdGFydC52YWthdGEiLCBmdW5jdGlvbiAoZSwgZGF0YSkgeworICAgICAgaWYoZGF0YS5kYXRhLmpzdHJlZSkgeyAKKyAgICAgICAgbS5zaG93KCk7IAorICAgICAgfQorICAgIH0pOworICAgICQoZG9jdW1lbnQpLmJpbmQoImRyYWdfc3RvcC52YWthdGEiLCBmdW5jdGlvbiAoZSwgZGF0YSkgeworICAgICAgaWYoZGF0YS5kYXRhLmpzdHJlZSkgeyBtLmhpZGUoKTsgfQorICAgIH0pOworICB9KTsKK30pKGpRdWVyeSk7CisvLyovCisKKy8qCisgKiBqc1RyZWUgY2hlY2tib3ggcGx1Z2luIDEuMAorICogSW5zZXJ0cyBjaGVja2JveGVzIGluIGZyb250IG9mIGV2ZXJ5IG5vZGUKKyAqIERlcGVuZHMgb24gdGhlIHVpIHBsdWdpbgorICogRE9FUyBOT1QgV09SSyBOSUNFTFkgV0lUSCBNVUxUSVRSRUUgRFJBRydOJ0RST1AKKyAqLworKGZ1bmN0aW9uICgkKSB7CisgICQuanN0cmVlLnBsdWdpbigiY2hlY2tib3giLCB7CisgICAgX19pbml0IDogZnVuY3Rpb24gKCkgeworICAgICAgdGhpcy5zZWxlY3Rfbm9kZSA9IHRoaXMuZGVzZWxlY3Rfbm9kZSA9IHRoaXMuZGVzZWxlY3RfYWxsID0gJC5ub29wOworICAgICAgdGhpcy5nZXRfc2VsZWN0ZWQgPSB0aGlzLmdldF9jaGVja2VkOworCisgICAgICB0aGlzLmdldF9jb250YWluZXIoKQorICAgICAgICAuYmluZCgib3Blbl9ub2RlLmpzdHJlZSBjcmVhdGVfbm9kZS5qc3RyZWUgY2xlYW5fbm9kZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7IAorICAgICAgICAgICAgdGhpcy5fcHJlcGFyZV9jaGVja2JveGVzKGRhdGEucnNsdC5vYmopOworICAgICAgICAgIH0sIHRoaXMpKQorICAgICAgICAuYmluZCgibG9hZGVkLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVfY2hlY2tib3hlcygpOworICAgICAgICAgIH0sIHRoaXMpKQorICAgICAgICAuZGVsZWdhdGUoImEiLCAiY2xpY2suanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZSkgeworICAgICAgICAgICAgaWYodGhpcy5fZ2V0X25vZGUoZS50YXJnZXQpLmhhc0NsYXNzKCJqc3RyZWUtY2hlY2tlZCIpKSB7IHRoaXMudW5jaGVja19ub2RlKGUudGFyZ2V0KTsgfQorICAgICAgICAgICAgZWxzZSB7IHRoaXMuY2hlY2tfbm9kZShlLnRhcmdldCk7IH0KKyAgICAgICAgICAgIGlmKHRoaXMuZGF0YS51aSkgeyB0aGlzLnNhdmVfc2VsZWN0ZWQoKTsgfQorICAgICAgICAgICAgaWYodGhpcy5kYXRhLmNvb2tpZXMpIHsgdGhpcy5zYXZlX2Nvb2tpZSgic2VsZWN0X25vZGUiKTsgfQorICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgIH0sIHRoaXMpKTsKKyAgICB9LAorICAgIF9fZGVzdHJveSA6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpLmZpbmQoIi5qc3RyZWUtY2hlY2tib3giKS5yZW1vdmUoKTsKKyAgICB9LAorICAgIF9mbiA6IHsKKyAgICAgIF9wcmVwYXJlX2NoZWNrYm94ZXMgOiBmdW5jdGlvbiAob2JqKSB7CisgICAgICAgIG9iaiA9ICFvYmogfHwgb2JqID09IC0xID8gdGhpcy5nZXRfY29udGFpbmVyKCkgOiB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICB2YXIgYywgX3RoaXMgPSB0aGlzLCB0OworICAgICAgICBvYmouZWFjaChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgdCA9ICQodGhpcyk7CisgICAgICAgICAgYyA9IHQuaXMoImxpIikgJiYgdC5oYXNDbGFzcygianN0cmVlLWNoZWNrZWQiKSA/ICJqc3RyZWUtY2hlY2tlZCIgOiAianN0cmVlLXVuY2hlY2tlZCI7CisgICAgICAgICAgdC5maW5kKCJhIikubm90KCI6aGFzKC5qc3RyZWUtY2hlY2tib3gpIikucHJlcGVuZCgiPGlucyBjbGFzcz0nanN0cmVlLWNoZWNrYm94Jz4mIzE2MDs8L2lucz4iKS5wYXJlbnQoKS5ub3QoIi5qc3RyZWUtY2hlY2tlZCwgLmpzdHJlZS11bmNoZWNrZWQiKS5hZGRDbGFzcyhjKTsKKyAgICAgICAgfSk7CisgICAgICAgIGlmKG9iai5pcygibGkiKSkgeyB0aGlzLl9yZXBhaXJfc3RhdGUob2JqKTsgfQorICAgICAgICBlbHNlIHsgb2JqLmZpbmQoIj4gdWwgPiBsaSIpLmVhY2goZnVuY3Rpb24gKCkgeyBfdGhpcy5fcmVwYWlyX3N0YXRlKHRoaXMpOyB9KTsgfQorICAgICAgfSwKKyAgICAgIGNoYW5nZV9zdGF0ZSA6IGZ1bmN0aW9uIChvYmosIHN0YXRlKSB7CisgICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7CisgICAgICAgIHN0YXRlID0gKHN0YXRlID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gdHJ1ZSkgPyBzdGF0ZSA6IG9iai5oYXNDbGFzcygianN0cmVlLWNoZWNrZWQiKTsKKyAgICAgICAgaWYoc3RhdGUpIHsgb2JqLmZpbmQoImxpIikuYW5kU2VsZigpLnJlbW92ZUNsYXNzKCJqc3RyZWUtY2hlY2tlZCBqc3RyZWUtdW5kZXRlcm1pbmVkIikuYWRkQ2xhc3MoImpzdHJlZS11bmNoZWNrZWQiKTsgfQorICAgICAgICBlbHNlIHsgCisgICAgICAgICAgb2JqLmZpbmQoImxpIikuYW5kU2VsZigpLnJlbW92ZUNsYXNzKCJqc3RyZWUtdW5jaGVja2VkIGpzdHJlZS11bmRldGVybWluZWQiKS5hZGRDbGFzcygianN0cmVlLWNoZWNrZWQiKTsgCisgICAgICAgICAgaWYodGhpcy5kYXRhLnVpKSB7IHRoaXMuZGF0YS51aS5sYXN0X3NlbGVjdGVkID0gb2JqOyB9CisgICAgICAgICAgdGhpcy5kYXRhLmNoZWNrYm94Lmxhc3Rfc2VsZWN0ZWQgPSBvYmo7CisgICAgICAgIH0KKyAgICAgICAgb2JqLnBhcmVudHNVbnRpbCgiLmpzdHJlZSIsICJsaSIpLmVhY2goZnVuY3Rpb24gKCkgeworICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7CisgICAgICAgICAgaWYoc3RhdGUpIHsKKyAgICAgICAgICAgIGlmKCR0aGlzLmNoaWxkcmVuKCJ1bCIpLmNoaWxkcmVuKCIuanN0cmVlLWNoZWNrZWQsIC5qc3RyZWUtdW5kZXRlcm1pbmVkIikubGVuZ3RoKSB7CisgICAgICAgICAgICAgICR0aGlzLnBhcmVudHNVbnRpbCgiLmpzdHJlZSIsICJsaSIpLmFuZFNlbGYoKS5yZW1vdmVDbGFzcygianN0cmVlLWNoZWNrZWQganN0cmVlLXVuY2hlY2tlZCIpLmFkZENsYXNzKCJqc3RyZWUtdW5kZXRlcm1pbmVkIik7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAkdGhpcy5yZW1vdmVDbGFzcygianN0cmVlLWNoZWNrZWQganN0cmVlLXVuZGV0ZXJtaW5lZCIpLmFkZENsYXNzKCJqc3RyZWUtdW5jaGVja2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYoJHRoaXMuY2hpbGRyZW4oInVsIikuY2hpbGRyZW4oIi5qc3RyZWUtdW5jaGVja2VkLCAuanN0cmVlLXVuZGV0ZXJtaW5lZCIpLmxlbmd0aCkgeworICAgICAgICAgICAgICAkdGhpcy5wYXJlbnRzVW50aWwoIi5qc3RyZWUiLCAibGkiKS5hbmRTZWxmKCkucmVtb3ZlQ2xhc3MoImpzdHJlZS1jaGVja2VkIGpzdHJlZS11bmNoZWNrZWQiKS5hZGRDbGFzcygianN0cmVlLXVuZGV0ZXJtaW5lZCIpOworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgJHRoaXMucmVtb3ZlQ2xhc3MoImpzdHJlZS11bmNoZWNrZWQganN0cmVlLXVuZGV0ZXJtaW5lZCIpLmFkZENsYXNzKCJqc3RyZWUtY2hlY2tlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGlmKHRoaXMuZGF0YS51aSkgeyB0aGlzLmRhdGEudWkuc2VsZWN0ZWQgPSB0aGlzLmdldF9jaGVja2VkKCk7IH0KKyAgICAgICAgdGhpcy5fX2NhbGxiYWNrKG9iaik7CisgICAgICB9LAorICAgICAgY2hlY2tfbm9kZSA6IGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgdGhpcy5jaGFuZ2Vfc3RhdGUob2JqLCBmYWxzZSk7CisgICAgICB9LAorICAgICAgdW5jaGVja19ub2RlIDogZnVuY3Rpb24gKG9iaikgeworICAgICAgICB0aGlzLmNoYW5nZV9zdGF0ZShvYmosIHRydWUpOworICAgICAgfSwKKyAgICAgIGNoZWNrX2FsbCA6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgdmFyIF90aGlzID0gdGhpczsKKyAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikuY2hpbGRyZW4oImxpIikuZWFjaChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgX3RoaXMuY2hlY2tfbm9kZSh0aGlzLCBmYWxzZSk7CisgICAgICAgIH0pOworICAgICAgfSwKKyAgICAgIHVuY2hlY2tfYWxsIDogZnVuY3Rpb24gKCkgeworICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOworICAgICAgICB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5jaGlsZHJlbigibGkiKS5lYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICBfdGhpcy5jaGFuZ2Vfc3RhdGUodGhpcywgdHJ1ZSk7CisgICAgICAgIH0pOworICAgICAgfSwKKworICAgICAgaXNfY2hlY2tlZCA6IGZ1bmN0aW9uKG9iaikgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICByZXR1cm4gb2JqLmxlbmd0aCA/IG9iai5pcygiLmpzdHJlZS1jaGVja2VkIikgOiBmYWxzZTsKKyAgICAgIH0sCisgICAgICBnZXRfY2hlY2tlZCA6IGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgb2JqID0gIW9iaiB8fCBvYmogPT09IC0xID8gdGhpcy5nZXRfY29udGFpbmVyKCkgOiB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICByZXR1cm4gb2JqLmZpbmQoIj4gdWwgPiAuanN0cmVlLWNoZWNrZWQsIC5qc3RyZWUtdW5kZXRlcm1pbmVkID4gdWwgPiAuanN0cmVlLWNoZWNrZWQiKTsKKyAgICAgIH0sCisgICAgICBnZXRfdW5jaGVja2VkIDogZnVuY3Rpb24gKG9iaikgeyAKKyAgICAgICAgb2JqID0gIW9iaiB8fCBvYmogPT09IC0xID8gdGhpcy5nZXRfY29udGFpbmVyKCkgOiB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICByZXR1cm4gb2JqLmZpbmQoIj4gdWwgPiAuanN0cmVlLXVuY2hlY2tlZCwgLmpzdHJlZS11bmRldGVybWluZWQgPiB1bCA+IC5qc3RyZWUtdW5jaGVja2VkIik7CisgICAgICB9LAorCisgICAgICBzaG93X2NoZWNrYm94ZXMgOiBmdW5jdGlvbiAoKSB7IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLnJlbW92ZUNsYXNzKCJqc3RyZWUtbm8tY2hlY2tib3hlcyIpOyB9LAorICAgICAgaGlkZV9jaGVja2JveGVzIDogZnVuY3Rpb24gKCkgeyB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigidWwiKS5hZGRDbGFzcygianN0cmVlLW5vLWNoZWNrYm94ZXMiKTsgfSwKKworICAgICAgX3JlcGFpcl9zdGF0ZSA6IGZ1bmN0aW9uIChvYmopIHsKKyAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsKKyAgICAgICAgaWYoIW9iai5sZW5ndGgpIHsgcmV0dXJuOyB9CisgICAgICAgIHZhciBhID0gb2JqLmZpbmQoIj4gdWwgPiAuanN0cmVlLWNoZWNrZWQiKS5sZW5ndGgsCisgICAgICAgICAgYiA9IG9iai5maW5kKCI+IHVsID4gLmpzdHJlZS11bmRldGVybWluZWQiKS5sZW5ndGgsCisgICAgICAgICAgYyA9IG9iai5maW5kKCI+IHVsID4gbGkiKS5sZW5ndGg7CisKKyAgICAgICAgaWYoYyA9PT0gMCkgeyBpZihvYmouaGFzQ2xhc3MoImpzdHJlZS11bmRldGVybWluZWQiKSkgeyB0aGlzLmNoZWNrX25vZGUob2JqKTsgfSB9CisgICAgICAgIGVsc2UgaWYoYSA9PT0gMCAmJiBiID09PSAwKSB7IHRoaXMudW5jaGVja19ub2RlKG9iaik7IH0KKyAgICAgICAgZWxzZSBpZihhID09PSBjKSB7IHRoaXMuY2hlY2tfbm9kZShvYmopOyB9CisgICAgICAgIGVsc2UgeyAKKyAgICAgICAgICBvYmoucGFyZW50c1VudGlsKCIuanN0cmVlIiwibGkiKS5yZW1vdmVDbGFzcygianN0cmVlLWNoZWNrZWQganN0cmVlLXVuY2hlY2tlZCIpLmFkZENsYXNzKCJqc3RyZWUtdW5kZXRlcm1pbmVkIik7CisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICByZXNlbGVjdCA6IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgaWYodGhpcy5kYXRhLnVpKSB7IAorICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXMsCisgICAgICAgICAgICBzID0gdGhpcy5kYXRhLnVpLnRvX3NlbGVjdDsKKyAgICAgICAgICBzID0gJC5tYXAoJC5tYWtlQXJyYXkocyksIGZ1bmN0aW9uIChuKSB7IHJldHVybiAiIyIgKyBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXiMvLCIiKS5yZXBsYWNlKCdcXC8nLCcvJykucmVwbGFjZSgnLycsJ1xcLycpOyB9KTsKKyAgICAgICAgICB0aGlzLmRlc2VsZWN0X2FsbCgpOworICAgICAgICAgICQuZWFjaChzLCBmdW5jdGlvbiAoaSwgdmFsKSB7IF90aGlzLmNoZWNrX25vZGUodmFsKTsgfSk7CisgICAgICAgICAgdGhpcy5fX2NhbGxiYWNrKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0pOworfSkoalF1ZXJ5KTsKKy8vKi8KKworLyogCisgKiBqc1RyZWUgWE1MIDEuMAorICogVGhlIFhNTCBkYXRhIHN0b3JlLiBEYXRhc3RvcmVzIGFyZSBidWlsZCBieSBvdmVycmlkaW5nIHRoZSBgbG9hZF9ub2RlYCBhbmQgYF9pc19sb2FkZWRgIGZ1bmN0aW9ucy4KKyAqLworKGZ1bmN0aW9uICgkKSB7CisgICQudmFrYXRhLnhzbHQgPSBmdW5jdGlvbiAoeG1sLCB4c2wsIGNhbGxiYWNrKSB7CisgICAgdmFyIHJzID0gIiIsIHhtLCB4cywgcHJvY2Vzc29yLCBzdXBwb3J0OworICAgIGlmKGRvY3VtZW50LnJlY2FsYykgeworICAgICAgeG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd4bWwnKTsKKyAgICAgIHhzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgneG1sJyk7CisgICAgICB4bS5pbm5lckhUTUwgPSB4bWw7CisgICAgICB4cy5pbm5lckhUTUwgPSB4c2w7CisgICAgICAkKCJib2R5IikuYXBwZW5kKHhtKS5hcHBlbmQoeHMpOworICAgICAgc2V0VGltZW91dCggKGZ1bmN0aW9uICh4bSwgeHMsIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgICAgICAgY2FsbGJhY2suY2FsbChudWxsLCB4bS50cmFuc2Zvcm1Ob2RlKHhzLlhNTERvY3VtZW50KSk7CisgICAgICAgICAgc2V0VGltZW91dCggKGZ1bmN0aW9uICh4bSwgeHMpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgalF1ZXJ5KCJib2R5IikucmVtb3ZlKHhtKS5yZW1vdmUoeHMpOyB9OyB9KSh4bSwgeHMpLCAyMDApOworICAgICAgICB9OworICAgICAgfSkgKHhtLCB4cywgY2FsbGJhY2spLCAxMDApOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmKHR5cGVvZiB3aW5kb3cuRE9NUGFyc2VyICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2Ygd2luZG93LlhNTEh0dHBSZXF1ZXN0ICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2Ygd2luZG93LlhTTFRQcm9jZXNzb3IgIT09ICJ1bmRlZmluZWQiKSB7CisgICAgICBwcm9jZXNzb3IgPSBuZXcgWFNMVFByb2Nlc3NvcigpOworICAgICAgc3VwcG9ydCA9ICQuaXNGdW5jdGlvbihwcm9jZXNzb3IudHJhbnNmb3JtRG9jdW1lbnQpID8gKHR5cGVvZiB3aW5kb3cuWE1MU2VyaWFsaXplciAhPT0gInVuZGVmaW5lZCIpIDogdHJ1ZTsKKyAgICAgIGlmKCFzdXBwb3J0KSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgeG1sID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWwsICJ0ZXh0L3htbCIpOworICAgICAgeHNsID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4c2wsICJ0ZXh0L3htbCIpOworICAgICAgaWYoJC5pc0Z1bmN0aW9uKHByb2Nlc3Nvci50cmFuc2Zvcm1Eb2N1bWVudCkpIHsKKyAgICAgICAgcnMgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgiIiwgIiIsIG51bGwpOworICAgICAgICBwcm9jZXNzb3IudHJhbnNmb3JtRG9jdW1lbnQoeG1sLCB4c2wsIHJzLCBudWxsKTsKKyAgICAgICAgY2FsbGJhY2suY2FsbChudWxsLCBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcocnMpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoeHNsKTsKKyAgICAgICAgcnMgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9GcmFnbWVudCh4bWwsIGRvY3VtZW50KTsKKyAgICAgICAgY2FsbGJhY2suY2FsbChudWxsLCAkKCI8ZGl2PiIpLmFwcGVuZChycykuaHRtbCgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfTsKKyAgdmFyIHhzbCA9IHsKKyAgICAnbmVzdCcgOiAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+JyArIAorICAgICAgJzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiA+JyArIAorICAgICAgJzx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgZW5jb2Rpbmc9InV0Zi04IiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIiBzdGFuZGFsb25lPSJubyIgaW5kZW50PSJubyIgbWVkaWEtdHlwZT0idGV4dC9odG1sIiAvPicgKyAKKyAgICAgICc8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4nICsgCisgICAgICAnICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibm9kZXMiPicgKyAKKyAgICAgICcgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iL3Jvb3QiIC8+JyArIAorICAgICAgJyAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4nICsgCisgICAgICAnPC94c2w6dGVtcGxhdGU+JyArIAorICAgICAgJzx4c2w6dGVtcGxhdGUgbmFtZT0ibm9kZXMiPicgKyAKKyAgICAgICcgIDx4c2w6cGFyYW0gbmFtZT0ibm9kZSIgLz4nICsgCisgICAgICAnICA8dWw+JyArIAorICAgICAgJyAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRub2RlL2l0ZW0iPicgKyAKKyAgICAgICcgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGlsZHJlbiIgc2VsZWN0PSJjb3VudCguL2l0ZW0pICZndDsgMCIgLz4nICsgCisgICAgICAnICAgIDxsaT4nICsgCisgICAgICAnICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPicgKyAKKyAgICAgICcgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSA9IGxhc3QoKSI+anN0cmVlLWxhc3QgPC94c2w6aWY+JyArIAorICAgICAgJyAgICAgICAgPHhzbDpjaG9vc2U+JyArIAorICAgICAgJyAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHN0YXRlID0gXCdvcGVuXCciPmpzdHJlZS1vcGVuIDwveHNsOndoZW4+JyArIAorICAgICAgJyAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNoaWxkcmVuIG9yIEBoYXNDaGlsZHJlbiBvciBAc3RhdGUgPSBcJ2Nsb3NlZFwnIj5qc3RyZWUtY2xvc2VkIDwveHNsOndoZW4+JyArIAorICAgICAgJyAgICAgICAgICA8eHNsOm90aGVyd2lzZT5qc3RyZWUtbGVhZiA8L3hzbDpvdGhlcndpc2U+JyArIAorICAgICAgJyAgICAgICAgPC94c2w6Y2hvb3NlPicgKyAKKyAgICAgICcgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY2xhc3MiIC8+JyArIAorICAgICAgJyAgICAgIDwveHNsOmF0dHJpYnV0ZT4nICsgCisgICAgICAnICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkAqIj4nICsgCisgICAgICAnICAgICAgICA8eHNsOmlmIHRlc3Q9Im5hbWUoKSAhPSBcJ2NsYXNzXCcgYW5kIG5hbWUoKSAhPSBcJ3N0YXRlXCcgYW5kIG5hbWUoKSAhPSBcJ2hhc0NoaWxkcmVuXCciPicgKyAKKyAgICAgICcgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ie25hbWUoKX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIiAvPjwveHNsOmF0dHJpYnV0ZT4nICsgCisgICAgICAnICAgICAgICA8L3hzbDppZj4nICsgCisgICAgICAnICAgICAgPC94c2w6Zm9yLWVhY2g+JyArIAorICAgICAgJyAgPGlucyBjbGFzcz0ianN0cmVlLWljb24iPjx4c2w6dGV4dD4mI3hhMDs8L3hzbDp0ZXh0PjwvaW5zPicgKyAKKyAgICAgICcgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iY29udGVudC9uYW1lIj4nICsgCisgICAgICAnICAgICAgICA8YT4nICsgCisgICAgICAnICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4nICsgCisgICAgICAnICAgICAgICAgIDx4c2w6Y2hvb3NlPicgKyAKKyAgICAgICcgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhyZWYiIC8+PC94c2w6d2hlbj4nICsgCisgICAgICAnICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPiM8L3hzbDpvdGhlcndpc2U+JyArIAorICAgICAgJyAgICAgICAgICA8L3hzbDpjaG9vc2U+JyArIAorICAgICAgJyAgICAgICAgPC94c2w6YXR0cmlidXRlPicgKyAKKyAgICAgICcgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciIC8+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY2xhc3MiIC8+PC94c2w6YXR0cmlidXRlPicgKyAKKyAgICAgICcgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InN0eWxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0eWxlIiAvPjwveHNsOmF0dHJpYnV0ZT4nICsgCisgICAgICAnICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iQCoiPicgKyAKKyAgICAgICcgICAgICAgICAgPHhzbDppZiB0ZXN0PSJuYW1lKCkgIT0gXCdzdHlsZVwnIGFuZCBuYW1lKCkgIT0gXCdjbGFzc1wnIGFuZCBuYW1lKCkgIT0gXCdocmVmXCciPicgKyAKKyAgICAgICcgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ7bmFtZSgpfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iIC8+PC94c2w6YXR0cmlidXRlPicgKyAKKyAgICAgICcgICAgICAgICAgPC94c2w6aWY+JyArIAorICAgICAgJyAgICAgICAgPC94c2w6Zm9yLWVhY2g+JyArIAorICAgICAgJyAgICAgICAgICA8aW5zPicgKyAKKyAgICAgICcgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+anN0cmVlLWljb24gJyArIAorICAgICAgJyAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKGF0dHJpYnV0ZTo6aWNvbikgPiAwIGFuZCBub3QoY29udGFpbnMoQGljb24sXCcvXCcpKSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpY29uIiAvPjwveHNsOmlmPicgKyAKKyAgICAgICcgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+JyArIAorICAgICAgJyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChhdHRyaWJ1dGU6Omljb24pID4gMCBhbmQgY29udGFpbnMoQGljb24sXCcvXCcpIj48eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdHlsZSI+YmFja2dyb3VuZDp1cmwoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpY29uIiAvPikgY2VudGVyIGNlbnRlciBuby1yZXBlYXQ7PC94c2w6YXR0cmlidXRlPjwveHNsOmlmPicgKyAKKyAgICAgICcgICAgICAgICAgICA8eHNsOnRleHQ+JiN4YTA7PC94c2w6dGV4dD4nICsgCisgICAgICAnICAgICAgICAgIDwvaW5zPicgKyAKKyAgICAgICcgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImN1cnJlbnQoKSIgLz4nICsgCisgICAgICAnICAgICAgICA8L2E+JyArIAorICAgICAgJyAgICAgIDwveHNsOmZvci1lYWNoPicgKyAKKyAgICAgICcgICAgICA8eHNsOmlmIHRlc3Q9IiRjaGlsZHJlbiBvciBAaGFzQ2hpbGRyZW4iPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJub2RlcyI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iY3VycmVudCgpIiAvPjwveHNsOmNhbGwtdGVtcGxhdGU+PC94c2w6aWY+JyArIAorICAgICAgJyAgICA8L2xpPicgKyAKKyAgICAgICcgIDwveHNsOmZvci1lYWNoPicgKyAKKyAgICAgICcgIDwvdWw+JyArIAorICAgICAgJzwveHNsOnRlbXBsYXRlPicgKyAKKyAgICAgICc8L3hzbDpzdHlsZXNoZWV0PicsCisKKyAgICAnZmxhdCcgOiAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+JyArIAorICAgICAgJzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiA+JyArIAorICAgICAgJzx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgZW5jb2Rpbmc9InV0Zi04IiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIiBzdGFuZGFsb25lPSJubyIgaW5kZW50PSJubyIgbWVkaWEtdHlwZT0idGV4dC94bWwiIC8+JyArIAorICAgICAgJzx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPicgKyAKKyAgICAgICcgIDx1bD4nICsgCisgICAgICAnICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLy9pdGVtW25vdChAcGFyZW50X2lkKSBvciBAcGFyZW50X2lkPTAgb3Igbm90KEBwYXJlbnRfaWQgPSAvL2l0ZW0vQGlkKV0iPicgKyAvKiB0aGUgbGFzdCBgb3JgIG1heSBiZSByZW1vdmVkICovCisgICAgICAnICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJub2RlcyI+JyArIAorICAgICAgJyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9Ii4iIC8+JyArIAorICAgICAgJyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpc19sYXN0IiBzZWxlY3Q9Im51bWJlcihwb3NpdGlvbigpID0gbGFzdCgpKSIgLz4nICsgCisgICAgICAnICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+JyArIAorICAgICAgJyAgPC94c2w6Zm9yLWVhY2g+JyArIAorICAgICAgJyAgPC91bD4nICsgCisgICAgICAnPC94c2w6dGVtcGxhdGU+JyArIAorICAgICAgJzx4c2w6dGVtcGxhdGUgbmFtZT0ibm9kZXMiPicgKyAKKyAgICAgICcgIDx4c2w6cGFyYW0gbmFtZT0ibm9kZSIgLz4nICsgCisgICAgICAnICA8eHNsOnBhcmFtIG5hbWU9ImlzX2xhc3QiIC8+JyArIAorICAgICAgJyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGlsZHJlbiIgc2VsZWN0PSJjb3VudCgvL2l0ZW1bQHBhcmVudF9pZD0kbm9kZS9hdHRyaWJ1dGU6OmlkXSkgJmd0OyAwIiAvPicgKyAKKyAgICAgICcgIDxsaT4nICsgCisgICAgICAnICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+JyArIAorICAgICAgJyAgICA8eHNsOmlmIHRlc3Q9IiRpc19sYXN0ID0gdHJ1ZSgpIj5qc3RyZWUtbGFzdCA8L3hzbDppZj4nICsgCisgICAgICAnICAgIDx4c2w6Y2hvb3NlPicgKyAKKyAgICAgICcgICAgICA8eHNsOndoZW4gdGVzdD0iQHN0YXRlID0gXCdvcGVuXCciPmpzdHJlZS1vcGVuIDwveHNsOndoZW4+JyArIAorICAgICAgJyAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY2hpbGRyZW4gb3IgQGhhc0NoaWxkcmVuIG9yIEBzdGF0ZSA9IFwnY2xvc2VkXCciPmpzdHJlZS1jbG9zZWQgPC94c2w6d2hlbj4nICsgCisgICAgICAnICAgICAgPHhzbDpvdGhlcndpc2U+anN0cmVlLWxlYWYgPC94c2w6b3RoZXJ3aXNlPicgKyAKKyAgICAgICcgICAgPC94c2w6Y2hvb3NlPicgKyAKKyAgICAgICcgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbGFzcyIgLz4nICsgCisgICAgICAnICA8L3hzbDphdHRyaWJ1dGU+JyArIAorICAgICAgJyAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkAqIj4nICsgCisgICAgICAnICAgIDx4c2w6aWYgdGVzdD0ibmFtZSgpICE9IFwncGFyZW50X2lkXCcgYW5kIG5hbWUoKSAhPSBcJ2hhc0NoaWxkcmVuXCcgYW5kIG5hbWUoKSAhPSBcJ2NsYXNzXCcgYW5kIG5hbWUoKSAhPSBcJ3N0YXRlXCciPicgKyAKKyAgICAgICcgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ie25hbWUoKX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIiAvPjwveHNsOmF0dHJpYnV0ZT4nICsgCisgICAgICAnICAgIDwveHNsOmlmPicgKyAKKyAgICAgICcgIDwveHNsOmZvci1lYWNoPicgKyAKKyAgICAgICcgIDxpbnMgY2xhc3M9ImpzdHJlZS1pY29uIj48eHNsOnRleHQ+JiN4YTA7PC94c2w6dGV4dD48L2lucz4nICsgCisgICAgICAnICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iY29udGVudC9uYW1lIj4nICsgCisgICAgICAnICAgIDxhPicgKyAKKyAgICAgICcgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+JyArIAorICAgICAgJyAgICAgIDx4c2w6Y2hvb3NlPicgKyAKKyAgICAgICcgICAgICA8eHNsOndoZW4gdGVzdD0iQGhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaHJlZiIgLz48L3hzbDp3aGVuPicgKyAKKyAgICAgICcgICAgICA8eHNsOm90aGVyd2lzZT4jPC94c2w6b3RoZXJ3aXNlPicgKyAKKyAgICAgICcgICAgICA8L3hzbDpjaG9vc2U+JyArIAorICAgICAgJyAgICA8L3hzbDphdHRyaWJ1dGU+JyArIAorICAgICAgJyAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIiAvPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNsYXNzIiAvPjwveHNsOmF0dHJpYnV0ZT4nICsgCisgICAgICAnICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InN0eWxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0eWxlIiAvPjwveHNsOmF0dHJpYnV0ZT4nICsgCisgICAgICAnICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJAKiI+JyArIAorICAgICAgJyAgICAgIDx4c2w6aWYgdGVzdD0ibmFtZSgpICE9IFwnc3R5bGVcJyBhbmQgbmFtZSgpICE9IFwnY2xhc3NcJyBhbmQgbmFtZSgpICE9IFwnaHJlZlwnIj4nICsgCisgICAgICAnICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ7bmFtZSgpfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iIC8+PC94c2w6YXR0cmlidXRlPicgKyAKKyAgICAgICcgICAgICA8L3hzbDppZj4nICsgCisgICAgICAnICAgIDwveHNsOmZvci1lYWNoPicgKyAKKyAgICAgICcgICAgICA8aW5zPicgKyAKKyAgICAgICcgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5qc3RyZWUtaWNvbiAnICsgCisgICAgICAnICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChhdHRyaWJ1dGU6Omljb24pID4gMCBhbmQgbm90KGNvbnRhaW5zKEBpY29uLFwnL1wnKSkiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWNvbiIgLz48L3hzbDppZj4nICsgCisgICAgICAnICAgICAgICA8L3hzbDphdHRyaWJ1dGU+JyArIAorICAgICAgJyAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKGF0dHJpYnV0ZTo6aWNvbikgPiAwIGFuZCBjb250YWlucyhAaWNvbixcJy9cJykiPjx4c2w6YXR0cmlidXRlIG5hbWU9InN0eWxlIj5iYWNrZ3JvdW5kOnVybCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGljb24iIC8+KSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDs8L3hzbDphdHRyaWJ1dGU+PC94c2w6aWY+JyArIAorICAgICAgJyAgICAgICAgPHhzbDp0ZXh0PiYjeGEwOzwveHNsOnRleHQ+JyArIAorICAgICAgJyAgICAgIDwvaW5zPicgKyAKKyAgICAgICcgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY3VycmVudCgpIiAvPicgKyAKKyAgICAgICcgICAgPC9hPicgKyAKKyAgICAgICcgIDwveHNsOmZvci1lYWNoPicgKyAKKyAgICAgICcgIDx4c2w6aWYgdGVzdD0iJGNoaWxkcmVuIj4nICsgCisgICAgICAnICAgIDx1bD4nICsgCisgICAgICAnICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvL2l0ZW1bQHBhcmVudF9pZD0kbm9kZS9hdHRyaWJ1dGU6OmlkXSI+JyArIAorICAgICAgJyAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJub2RlcyI+JyArIAorICAgICAgJyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iLiIgLz4nICsgCisgICAgICAnICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iaXNfbGFzdCIgc2VsZWN0PSJudW1iZXIocG9zaXRpb24oKSA9IGxhc3QoKSkiIC8+JyArIAorICAgICAgJyAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+JyArIAorICAgICAgJyAgICA8L3hzbDpmb3ItZWFjaD4nICsgCisgICAgICAnICAgIDwvdWw+JyArIAorICAgICAgJyAgPC94c2w6aWY+JyArIAorICAgICAgJyAgPC9saT4nICsgCisgICAgICAnPC94c2w6dGVtcGxhdGU+JyArIAorICAgICAgJzwveHNsOnN0eWxlc2hlZXQ+JworICB9OworICAkLmpzdHJlZS5wbHVnaW4oInhtbF9kYXRhIiwgeworICAgIGRlZmF1bHRzIDogeyAKKyAgICAgIGRhdGEgOiBmYWxzZSwKKyAgICAgIGFqYXggOiBmYWxzZSwKKyAgICAgIHhzbCA6ICJmbGF0IiwKKyAgICAgIGNsZWFuX25vZGUgOiBmYWxzZSwKKyAgICAgIGNvcnJlY3Rfc3RhdGUgOiB0cnVlCisgICAgfSwKKyAgICBfZm4gOiB7CisgICAgICBsb2FkX25vZGUgOiBmdW5jdGlvbiAob2JqLCBzX2NhbGwsIGVfY2FsbCkgeyB2YXIgX3RoaXMgPSB0aGlzOyB0aGlzLmxvYWRfbm9kZV94bWwob2JqLCBmdW5jdGlvbiAoKSB7IF90aGlzLl9fY2FsbGJhY2soeyAib2JqIiA6IG9iaiB9KTsgc19jYWxsLmNhbGwodGhpcyk7IH0sIGVfY2FsbCk7IH0sCisgICAgICBfaXNfbG9hZGVkIDogZnVuY3Rpb24gKG9iaikgeyAKKyAgICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS54bWxfZGF0YTsKKyAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsKKyAgICAgICAgcmV0dXJuIG9iaiA9PSAtMSB8fCAhb2JqIHx8ICFzLmFqYXggfHwgb2JqLmlzKCIuanN0cmVlLW9wZW4sIC5qc3RyZWUtbGVhZiIpIHx8IG9iai5jaGlsZHJlbigidWwiKS5jaGlsZHJlbigibGkiKS5zaXplKCkgPiAwOworICAgICAgfSwKKyAgICAgIGxvYWRfbm9kZV94bWwgOiBmdW5jdGlvbiAob2JqLCBzX2NhbGwsIGVfY2FsbCkgeworICAgICAgICB2YXIgcyA9IHRoaXMuZ2V0X3NldHRpbmdzKCkueG1sX2RhdGEsCisgICAgICAgICAgZXJyb3JfZnVuYyA9IGZ1bmN0aW9uICgpIHt9LAorICAgICAgICAgIHN1Y2Nlc3NfZnVuYyA9IGZ1bmN0aW9uICgpIHt9OworCisgICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7CisgICAgICAgIGlmKG9iaiAmJiBvYmogIT09IC0xKSB7CisgICAgICAgICAgaWYob2JqLmRhdGEoImpzdHJlZS1pcy1sb2FkaW5nIikpIHsgcmV0dXJuOyB9CisgICAgICAgICAgZWxzZSB7IG9iai5kYXRhKCJqc3RyZWUtaXMtbG9hZGluZyIsdHJ1ZSk7IH0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2goITApIHsKKyAgICAgICAgICBjYXNlICghcy5kYXRhICYmICFzLmFqYXgpOiB0aHJvdyAiTmVpdGhlciBkYXRhIG5vciBhamF4IHNldHRpbmdzIHN1cHBsaWVkLiI7CisgICAgICAgICAgY2FzZSAoISFzLmRhdGEgJiYgIXMuYWpheCkgfHwgKCEhcy5kYXRhICYmICEhcy5hamF4ICYmICghb2JqIHx8IG9iaiA9PT0gLTEpKToKKyAgICAgICAgICAgIGlmKCFvYmogfHwgb2JqID09IC0xKSB7CisgICAgICAgICAgICAgIHRoaXMucGFyc2VfeG1sKHMuZGF0YSwgJC5wcm94eShmdW5jdGlvbiAoZCkgeworICAgICAgICAgICAgICAgIGlmKGQpIHsKKyAgICAgICAgICAgICAgICAgIGQgPSBkLnJlcGxhY2UoLyA/eG1sbnM9IlteIl0qIi9pZywgIiIpOworICAgICAgICAgICAgICAgICAgaWYoZC5sZW5ndGggPiAxMCkgeworICAgICAgICAgICAgICAgICAgICBkID0gJChkKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikuZW1wdHkoKS5hcHBlbmQoZC5jaGlsZHJlbigpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocy5jbGVhbl9ub2RlKSB7IHRoaXMuY2xlYW5fbm9kZShvYmopOyB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNfY2FsbCkgeyBzX2NhbGwuY2FsbCh0aGlzKTsgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsgCisgICAgICAgICAgICAgICAgICBpZihzLmNvcnJlY3Rfc3RhdGUpIHsgCisgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCk7IAorICAgICAgICAgICAgICAgICAgICBpZihzX2NhbGwpIHsgc19jYWxsLmNhbGwodGhpcyk7IH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0sIHRoaXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgKCFzLmRhdGEgJiYgISFzLmFqYXgpIHx8ICghIXMuZGF0YSAmJiAhIXMuYWpheCAmJiBvYmogJiYgb2JqICE9PSAtMSk6CisgICAgICAgICAgICBlcnJvcl9mdW5jID0gZnVuY3Rpb24gKHgsIHQsIGUpIHsKKyAgICAgICAgICAgICAgdmFyIGVmID0gdGhpcy5nZXRfc2V0dGluZ3MoKS54bWxfZGF0YS5hamF4LmVycm9yOyAKKyAgICAgICAgICAgICAgaWYoZWYpIHsgZWYuY2FsbCh0aGlzLCB4LCB0LCBlKTsgfQorICAgICAgICAgICAgICBpZihvYmogIT09IC0xICYmIG9iai5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBvYmouY2hpbGRyZW4oIi5qc3RyZWUtbG9hZGluZyIpLnJlbW92ZUNsYXNzKCJqc3RyZWUtbG9hZGluZyIpOworICAgICAgICAgICAgICAgIG9iai5kYXRhKCJqc3RyZWUtaXMtbG9hZGluZyIsZmFsc2UpOworICAgICAgICAgICAgICAgIGlmKHQgPT09ICJzdWNjZXNzIiAmJiBzLmNvcnJlY3Rfc3RhdGUpIHsgb2JqLnJlbW92ZUNsYXNzKCJqc3RyZWUtb3BlbiBqc3RyZWUtY2xvc2VkIikuYWRkQ2xhc3MoImpzdHJlZS1sZWFmIik7IH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZih0ID09PSAic3VjY2VzcyIgJiYgcy5jb3JyZWN0X3N0YXRlKSB7IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCk7IH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZihlX2NhbGwpIHsgZV9jYWxsLmNhbGwodGhpcyk7IH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzdWNjZXNzX2Z1bmMgPSBmdW5jdGlvbiAoZCwgdCwgeCkgeworICAgICAgICAgICAgICBkID0geC5yZXNwb25zZVRleHQ7CisgICAgICAgICAgICAgIHZhciBzZiA9IHRoaXMuZ2V0X3NldHRpbmdzKCkueG1sX2RhdGEuYWpheC5zdWNjZXNzOyAKKyAgICAgICAgICAgICAgaWYoc2YpIHsgZCA9IHNmLmNhbGwodGhpcyxkLHQseCkgfHwgZDsgfQorICAgICAgICAgICAgICBpZihkID09ICIiKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yX2Z1bmMuY2FsbCh0aGlzLCB4LCB0LCAiIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdGhpcy5wYXJzZV94bWwoZCwgJC5wcm94eShmdW5jdGlvbiAoZCkgeworICAgICAgICAgICAgICAgIGlmKGQpIHsKKyAgICAgICAgICAgICAgICAgIGQgPSBkLnJlcGxhY2UoLyA/eG1sbnM9IlteIl0qIi9pZywgIiIpOworICAgICAgICAgICAgICAgICAgaWYoZC5sZW5ndGggPiAxMCkgeworICAgICAgICAgICAgICAgICAgICBkID0gJChkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYob2JqID09PSAtMSB8fCAhb2JqKSB7IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCkuYXBwZW5kKGQuY2hpbGRyZW4oKSk7IH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IG9iai5jaGlsZHJlbigiLmpzdHJlZS1sb2FkaW5nIikucmVtb3ZlQ2xhc3MoImpzdHJlZS1sb2FkaW5nIik7IG9iai5hcHBlbmQoZCk7IG9iai5kYXRhKCJqc3RyZWUtaXMtbG9hZGluZyIsZmFsc2UpOyB9CisgICAgICAgICAgICAgICAgICAgIGlmKHMuY2xlYW5fbm9kZSkgeyB0aGlzLmNsZWFuX25vZGUob2JqKTsgfQorICAgICAgICAgICAgICAgICAgICBpZihzX2NhbGwpIHsgc19jYWxsLmNhbGwodGhpcyk7IH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZihvYmogJiYgb2JqICE9PSAtMSkgeyAKKyAgICAgICAgICAgICAgICAgICAgICBvYmouY2hpbGRyZW4oIi5qc3RyZWUtbG9hZGluZyIpLnJlbW92ZUNsYXNzKCJqc3RyZWUtbG9hZGluZyIpOworICAgICAgICAgICAgICAgICAgICAgIG9iai5kYXRhKCJqc3RyZWUtaXMtbG9hZGluZyIsZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgIGlmKHMuY29ycmVjdF9zdGF0ZSkgeyAKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iai5yZW1vdmVDbGFzcygianN0cmVlLW9wZW4ganN0cmVlLWNsb3NlZCIpLmFkZENsYXNzKCJqc3RyZWUtbGVhZiIpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNfY2FsbCkgeyBzX2NhbGwuY2FsbCh0aGlzKTsgfSAKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgaWYocy5jb3JyZWN0X3N0YXRlKSB7IAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikuZW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNfY2FsbCkgeyBzX2NhbGwuY2FsbCh0aGlzKTsgfSAKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0sIHRoaXMpKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzLmFqYXguY29udGV4dCA9IHRoaXM7CisgICAgICAgICAgICBzLmFqYXguZXJyb3IgPSBlcnJvcl9mdW5jOworICAgICAgICAgICAgcy5hamF4LnN1Y2Nlc3MgPSBzdWNjZXNzX2Z1bmM7CisgICAgICAgICAgICBpZighcy5hamF4LmRhdGFUeXBlKSB7IHMuYWpheC5kYXRhVHlwZSA9ICJ4bWwiOyB9CisgICAgICAgICAgICBpZigkLmlzRnVuY3Rpb24ocy5hamF4LnVybCkpIHsgcy5hamF4LnVybCA9IHMuYWpheC51cmwuY2FsbCh0aGlzLCBvYmopOyB9CisgICAgICAgICAgICBpZigkLmlzRnVuY3Rpb24ocy5hamF4LmRhdGEpKSB7IHMuYWpheC5kYXRhID0gcy5hamF4LmRhdGEuY2FsbCh0aGlzLCBvYmopOyB9CisgICAgICAgICAgICAkLmFqYXgocy5hamF4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9LAorICAgICAgcGFyc2VfeG1sIDogZnVuY3Rpb24gKHhtbCwgY2FsbGJhY2spIHsKKyAgICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS54bWxfZGF0YTsKKyAgICAgICAgJC52YWthdGEueHNsdCh4bWwsIHhzbFtzLnhzbF0sIGNhbGxiYWNrKTsKKyAgICAgIH0sCisgICAgICBnZXRfeG1sIDogZnVuY3Rpb24gKHRwLCBvYmosIGxpX2F0dHIsIGFfYXR0ciwgaXNfY2FsbGJhY2spIHsKKyAgICAgICAgdmFyIHJlc3VsdCA9ICIiLCAKKyAgICAgICAgICBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCksIAorICAgICAgICAgIF90aGlzID0gdGhpcywKKyAgICAgICAgICB0bXAxLCB0bXAyLCBsaSwgYSwgbGFuZzsKKyAgICAgICAgaWYoIXRwKSB7IHRwID0gImZsYXQiOyB9CisgICAgICAgIGlmKCFpc19jYWxsYmFjaykgeyBpc19jYWxsYmFjayA9IDA7IH0KKyAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsKKyAgICAgICAgaWYoIW9iaiB8fCBvYmogPT09IC0xKSB7IG9iaiA9IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmZpbmQoIj4gdWwgPiBsaSIpOyB9CisgICAgICAgIGxpX2F0dHIgPSAkLmlzQXJyYXkobGlfYXR0cikgPyBsaV9hdHRyIDogWyAiaWQiLCAiY2xhc3MiIF07CisgICAgICAgIGlmKCFpc19jYWxsYmFjayAmJiB0aGlzLmRhdGEudHlwZXMgJiYgJC5pbkFycmF5KHMudHlwZXMudHlwZV9hdHRyLCBsaV9hdHRyKSA9PT0gLTEpIHsgbGlfYXR0ci5wdXNoKHMudHlwZXMudHlwZV9hdHRyKTsgfQorCisgICAgICAgIGFfYXR0ciA9ICQuaXNBcnJheShhX2F0dHIpID8gYV9hdHRyIDogWyBdOworCisgICAgICAgIGlmKCFpc19jYWxsYmFjaykgeyByZXN1bHQgKz0gIjxyb290PiI7IH0KKyAgICAgICAgb2JqLmVhY2goZnVuY3Rpb24gKCkgeworICAgICAgICAgIHJlc3VsdCArPSAiPGl0ZW0iOworICAgICAgICAgIGxpID0gJCh0aGlzKTsKKyAgICAgICAgICAkLmVhY2gobGlfYXR0ciwgZnVuY3Rpb24gKGksIHYpIHsgcmVzdWx0ICs9ICIgIiArIHYgKyAiPVwiIiArIChsaS5hdHRyKHYpIHx8ICIiKS5yZXBsYWNlKC9qc3RyZWVbXiBdKnwkL2lnLCcnKS5yZXBsYWNlKC9eXHMrJC9pZywiIikgKyAiXCIiOyB9KTsKKyAgICAgICAgICBpZihsaS5oYXNDbGFzcygianN0cmVlLW9wZW4iKSkgeyByZXN1bHQgKz0gIiBzdGF0ZT1cIm9wZW5cIiI7IH0KKyAgICAgICAgICBpZihsaS5oYXNDbGFzcygianN0cmVlLWNsb3NlZCIpKSB7IHJlc3VsdCArPSAiIHN0YXRlPVwiY2xvc2VkXCIiOyB9CisgICAgICAgICAgaWYodHAgPT09ICJmbGF0IikgeyByZXN1bHQgKz0gIiBwYXJlbnRfaWQ9XCIiICsgaXNfY2FsbGJhY2sgKyAiXCIiOyB9CisgICAgICAgICAgcmVzdWx0ICs9ICI+IjsKKyAgICAgICAgICByZXN1bHQgKz0gIjxjb250ZW50PiI7CisgICAgICAgICAgYSA9IGxpLmNoaWxkcmVuKCJhIik7CisgICAgICAgICAgYS5lYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAgIHRtcDEgPSAkKHRoaXMpOworICAgICAgICAgICAgbGFuZyA9IGZhbHNlOworICAgICAgICAgICAgcmVzdWx0ICs9ICI8bmFtZSI7CisgICAgICAgICAgICBpZigkLmluQXJyYXkoImxhbmd1YWdlcyIsIHMucGx1Z2lucykgIT09IC0xKSB7CisgICAgICAgICAgICAgICQuZWFjaChzLmxhbmd1YWdlcywgZnVuY3Rpb24gKGssIHopIHsKKyAgICAgICAgICAgICAgICBpZih0bXAxLmhhc0NsYXNzKHopKSB7IHJlc3VsdCArPSAiIGxhbmc9XCIiICsgeiArICJcIiI7IGxhbmcgPSB6OyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihhX2F0dHIubGVuZ3RoKSB7IAorICAgICAgICAgICAgICAkLmVhY2goYV9hdHRyLCBmdW5jdGlvbiAoaywgeikgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiICIgKyB6ICsgIj1cIiIgKyAodG1wMS5hdHRyKHopIHx8ICIiKS5yZXBsYWNlKC9qc3RyZWVbXiBdKnwkL2lnLCcnKSArICJcIiI7CisgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYodG1wMS5jaGlsZHJlbigiaW5zIikuZ2V0KDApLmNsYXNzTmFtZS5yZXBsYWNlKC9qc3RyZWVbXiBdKnwkL2lnLCcnKS5yZXBsYWNlKC9eXHMrJC9pZywiIikubGVuZ3RoKSB7CisgICAgICAgICAgICAgIHJlc3VsdCArPSAnIGljb249IicgKyB0bXAxLmNoaWxkcmVuKCJpbnMiKS5nZXQoMCkuY2xhc3NOYW1lLnJlcGxhY2UoL2pzdHJlZVteIF0qfCQvaWcsJycpLnJlcGxhY2UoL15ccyskL2lnLCIiKSArICciJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHRtcDEuY2hpbGRyZW4oImlucyIpLmdldCgwKS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UubGVuZ3RoKSB7CisgICAgICAgICAgICAgIHJlc3VsdCArPSAnIGljb249IicgKyB0bXAxLmNoaWxkcmVuKCJpbnMiKS5nZXQoMCkuc3R5bGUuYmFja2dyb3VuZEltYWdlLnJlcGxhY2UoInVybCgiLCIiKS5yZXBsYWNlKCIpIiwiIikgKyAnIic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgKz0gIj4iOworICAgICAgICAgICAgcmVzdWx0ICs9ICI8IVtDREFUQVsiICsgX3RoaXMuZ2V0X3RleHQodG1wMSwgbGFuZykgKyAiXV0+IjsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiPC9uYW1lPiI7CisgICAgICAgICAgfSk7CisgICAgICAgICAgcmVzdWx0ICs9ICI8L2NvbnRlbnQ+IjsKKyAgICAgICAgICB0bXAyID0gbGlbMF0uaWQ7CisgICAgICAgICAgbGkgPSBsaS5maW5kKCI+IHVsID4gbGkiKTsKKyAgICAgICAgICBpZihsaS5sZW5ndGgpIHsgdG1wMiA9IF90aGlzLmdldF94bWwodHAsIGxpLCBsaV9hdHRyLCBhX2F0dHIsIHRtcDIpOyB9CisgICAgICAgICAgZWxzZSB7IHRtcDIgPSAiIjsgfQorICAgICAgICAgIGlmKHRwID09ICJuZXN0IikgeyByZXN1bHQgKz0gdG1wMjsgfQorICAgICAgICAgIHJlc3VsdCArPSAiPC9pdGVtPiI7CisgICAgICAgICAgaWYodHAgPT0gImZsYXQiKSB7IHJlc3VsdCArPSB0bXAyOyB9CisgICAgICAgIH0pOworICAgICAgICBpZighaXNfY2FsbGJhY2spIHsgcmVzdWx0ICs9ICI8L3Jvb3Q+IjsgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH0KKyAgfSk7Cit9KShqUXVlcnkpOworLy8qLworCisvKgorICoganNUcmVlIHNlYXJjaCBwbHVnaW4gMS4wCisgKiBFbmFibGVzIGJvdGggc3luYyBhbmQgYXN5bmMgc2VhcmNoIG9uIHRoZSB0cmVlCisgKiBET0VTIE5PVCBXT1JLIFdJVEggSlNPTiBQUk9HUkVTU0lWRSBSRU5ERVIKKyAqLworKGZ1bmN0aW9uICgkKSB7CisgICQuZXhwclsnOiddLmpzdHJlZV9jb250YWlucyA9IGZ1bmN0aW9uKGEsaSxtKXsKKyAgICByZXR1cm4gKGEudGV4dENvbnRlbnQgfHwgYS5pbm5lclRleHQgfHwgIiIpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihtWzNdLnRvTG93ZXJDYXNlKCkpPj0wOworICB9OworICAkLmpzdHJlZS5wbHVnaW4oInNlYXJjaCIsIHsKKyAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLmRhdGEuc2VhcmNoLnN0ciA9ICIiOworICAgICAgdGhpcy5kYXRhLnNlYXJjaC5yZXN1bHQgPSAkKCk7CisgICAgfSwKKyAgICBkZWZhdWx0cyA6IHsKKyAgICAgIGFqYXggOiBmYWxzZSwgLy8gT1IgYWpheCBvYmplY3QKKyAgICAgIGNhc2VfaW5zZW5zaXRpdmUgOiBmYWxzZQorICAgIH0sCisgICAgX2ZuIDogeworICAgICAgc2VhcmNoIDogZnVuY3Rpb24gKHN0ciwgc2tpcF9hc3luYykgeworICAgICAgICBpZihzdHIgPT09ICIiKSB7IHJldHVybjsgfQorICAgICAgICB2YXIgcyA9IHRoaXMuZ2V0X3NldHRpbmdzKCkuc2VhcmNoLCAKKyAgICAgICAgICB0ID0gdGhpcywKKyAgICAgICAgICBlcnJvcl9mdW5jID0gZnVuY3Rpb24gKCkgeyB9LAorICAgICAgICAgIHN1Y2Nlc3NfZnVuYyA9IGZ1bmN0aW9uICgpIHsgfTsKKyAgICAgICAgdGhpcy5kYXRhLnNlYXJjaC5zdHIgPSBzdHI7CisKKyAgICAgICAgaWYoIXNraXBfYXN5bmMgJiYgcy5hamF4ICE9PSBmYWxzZSAmJiB0aGlzLmdldF9jb250YWluZXIoKS5maW5kKCIuanN0cmVlLWNsb3NlZDplcSgwKSIpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICB0aGlzLnNlYXJjaC5zdXByZXNzX2NhbGxiYWNrID0gdHJ1ZTsKKyAgICAgICAgICBlcnJvcl9mdW5jID0gZnVuY3Rpb24gKCkgeyB9OworICAgICAgICAgIHN1Y2Nlc3NfZnVuYyA9IGZ1bmN0aW9uIChkLCB0LCB4KSB7CisgICAgICAgICAgICB2YXIgc2YgPSB0aGlzLmdldF9zZXR0aW5ncygpLnNlYXJjaC5hamF4LnN1Y2Nlc3M7IAorICAgICAgICAgICAgaWYoc2YpIHsgZCA9IHNmLmNhbGwodGhpcyxkLHQseCkgfHwgZDsgfQorICAgICAgICAgICAgdGhpcy5kYXRhLnNlYXJjaC50b19vcGVuID0gZDsKKyAgICAgICAgICAgIHRoaXMuX3NlYXJjaF9vcGVuKCk7CisgICAgICAgICAgfTsKKyAgICAgICAgICBzLmFqYXguY29udGV4dCA9IHRoaXM7CisgICAgICAgICAgcy5hamF4LmVycm9yID0gZXJyb3JfZnVuYzsKKyAgICAgICAgICBzLmFqYXguc3VjY2VzcyA9IHN1Y2Nlc3NfZnVuYzsKKyAgICAgICAgICBpZigkLmlzRnVuY3Rpb24ocy5hamF4LnVybCkpIHsgcy5hamF4LnVybCA9IHMuYWpheC51cmwuY2FsbCh0aGlzLCBzdHIpOyB9CisgICAgICAgICAgaWYoJC5pc0Z1bmN0aW9uKHMuYWpheC5kYXRhKSkgeyBzLmFqYXguZGF0YSA9IHMuYWpheC5kYXRhLmNhbGwodGhpcywgc3RyKTsgfQorICAgICAgICAgIGlmKCFzLmFqYXguZGF0YSkgeyBzLmFqYXguZGF0YSA9IHsgInNlYXJjaF9zdHJpbmciIDogc3RyIH07IH0KKyAgICAgICAgICBpZighcy5hamF4LmRhdGFUeXBlIHx8IC9eanNvbi8uZXhlYyhzLmFqYXguZGF0YVR5cGUpKSB7IHMuYWpheC5kYXRhVHlwZSA9ICJqc29uIjsgfQorICAgICAgICAgICQuYWpheChzLmFqYXgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZih0aGlzLmRhdGEuc2VhcmNoLnJlc3VsdC5sZW5ndGgpIHsgdGhpcy5jbGVhcl9zZWFyY2goKTsgfQorICAgICAgICB0aGlzLmRhdGEuc2VhcmNoLnJlc3VsdCA9IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmZpbmQoImEiICsgKHRoaXMuZGF0YS5sYW5ndWFnZXMgPyAiLiIgKyB0aGlzLmdldF9sYW5nKCkgOiAiIiApICsgIjoiICsgKHMuY2FzZV9pbnNlbnNpdGl2ZSA/ICJqc3RyZWVfY29udGFpbnMiIDogImNvbnRhaW5zIikgKyAiKCIgKyB0aGlzLmRhdGEuc2VhcmNoLnN0ciArICIpIik7CisgICAgICAgIHRoaXMuZGF0YS5zZWFyY2gucmVzdWx0LmFkZENsYXNzKCJqc3RyZWUtc2VhcmNoIikucGFyZW50cygiLmpzdHJlZS1jbG9zZWQiKS5lYWNoKGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICB0Lm9wZW5fbm9kZSh0aGlzLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIH0pOworICAgICAgICB0aGlzLl9fY2FsbGJhY2soeyBub2RlcyA6IHRoaXMuZGF0YS5zZWFyY2gucmVzdWx0LCBzdHIgOiBzdHIgfSk7CisgICAgICB9LAorICAgICAgY2xlYXJfc2VhcmNoIDogZnVuY3Rpb24gKHN0cikgeworICAgICAgICB0aGlzLmRhdGEuc2VhcmNoLnJlc3VsdC5yZW1vdmVDbGFzcygianN0cmVlLXNlYXJjaCIpOworICAgICAgICB0aGlzLl9fY2FsbGJhY2sodGhpcy5kYXRhLnNlYXJjaC5yZXN1bHQpOworICAgICAgICB0aGlzLmRhdGEuc2VhcmNoLnJlc3VsdCA9ICQoKTsKKyAgICAgIH0sCisgICAgICBfc2VhcmNoX29wZW4gOiBmdW5jdGlvbiAoaXNfY2FsbGJhY2spIHsKKyAgICAgICAgdmFyIF90aGlzID0gdGhpcywKKyAgICAgICAgICBkb25lID0gdHJ1ZSwKKyAgICAgICAgICBjdXJyZW50ID0gW10sCisgICAgICAgICAgcmVtYWluaW5nID0gW107CisgICAgICAgIGlmKHRoaXMuZGF0YS5zZWFyY2gudG9fb3Blbi5sZW5ndGgpIHsKKyAgICAgICAgICAkLmVhY2godGhpcy5kYXRhLnNlYXJjaC50b19vcGVuLCBmdW5jdGlvbiAoaSwgdmFsKSB7CisgICAgICAgICAgICBpZih2YWwgPT0gIiMiKSB7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICBpZigkKHZhbCkubGVuZ3RoICYmICQodmFsKS5pcygiLmpzdHJlZS1jbG9zZWQiKSkgeyBjdXJyZW50LnB1c2godmFsKTsgfQorICAgICAgICAgICAgZWxzZSB7IHJlbWFpbmluZy5wdXNoKHZhbCk7IH0KKyAgICAgICAgICB9KTsKKyAgICAgICAgICBpZihjdXJyZW50Lmxlbmd0aCkgeworICAgICAgICAgICAgdGhpcy5kYXRhLnNlYXJjaC50b19vcGVuID0gcmVtYWluaW5nOworICAgICAgICAgICAgJC5lYWNoKGN1cnJlbnQsIGZ1bmN0aW9uIChpLCB2YWwpIHsgCisgICAgICAgICAgICAgIF90aGlzLm9wZW5fbm9kZSh2YWwsIGZ1bmN0aW9uICgpIHsgX3RoaXMuX3NlYXJjaF9vcGVuKHRydWUpOyB9KTsgCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoZG9uZSkgeyB0aGlzLnNlYXJjaCh0aGlzLmRhdGEuc2VhcmNoLnN0ciwgdHJ1ZSk7IH0KKyAgICAgIH0KKyAgICB9CisgIH0pOworfSkoalF1ZXJ5KTsKKy8vKi8KKworLyoKKyAqIGpzVHJlZSBjb250ZXh0bWVudSBwbHVnaW4gMS4wCisgKi8KKyhmdW5jdGlvbiAoJCkgeworICAkLnZha2F0YS5jb250ZXh0ID0geworICAgIGNudCAgICA6ICQoIjxkaXYgaWQ9J3Zha2F0YS1jb250ZXh0bWVudSc+IiksCisgICAgdmlzICAgIDogZmFsc2UsCisgICAgdGd0ICAgIDogZmFsc2UsCisgICAgcGFyICAgIDogZmFsc2UsCisgICAgZnVuYyAgOiBmYWxzZSwKKyAgICBkYXRhICA6IGZhbHNlLAorICAgIHNob3cgIDogZnVuY3Rpb24gKHMsIHQsIHgsIHksIGQsIHApIHsKKyAgICAgIHZhciBodG1sID0gJC52YWthdGEuY29udGV4dC5wYXJzZShzKSwgaCwgdzsKKyAgICAgIGlmKCFodG1sKSB7IHJldHVybjsgfQorICAgICAgJC52YWthdGEuY29udGV4dC52aXMgPSB0cnVlOworICAgICAgJC52YWthdGEuY29udGV4dC50Z3QgPSB0OworICAgICAgJC52YWthdGEuY29udGV4dC5wYXIgPSBwIHx8IHQgfHwgbnVsbDsKKyAgICAgICQudmFrYXRhLmNvbnRleHQuZGF0YSA9IGQgfHwgbnVsbDsKKyAgICAgICQudmFrYXRhLmNvbnRleHQuY250CisgICAgICAgIC5odG1sKGh0bWwpCisgICAgICAgIC5jc3MoeyAidmlzaWJpbGl0eSIgOiAiaGlkZGVuIiwgImRpc3BsYXkiIDogImJsb2NrIiwgImxlZnQiIDogMCwgInRvcCIgOiAwIH0pOworICAgICAgaCA9ICQudmFrYXRhLmNvbnRleHQuY250LmhlaWdodCgpOworICAgICAgdyA9ICQudmFrYXRhLmNvbnRleHQuY250LndpZHRoKCk7CisgICAgICBpZih4ICsgdyA+ICQoZG9jdW1lbnQpLndpZHRoKCkpIHsgCisgICAgICAgIHggPSAkKGRvY3VtZW50KS53aWR0aCgpIC0gKHcgKyA1KTsgCisgICAgICAgICQudmFrYXRhLmNvbnRleHQuY250LmZpbmQoImxpID4gdWwiKS5hZGRDbGFzcygicmlnaHQiKTsgCisgICAgICB9CisgICAgICBpZih5ICsgaCA+ICQoZG9jdW1lbnQpLmhlaWdodCgpKSB7IAorICAgICAgICB5ID0geSAtIChoICsgdFswXS5vZmZzZXRIZWlnaHQpOyAKKyAgICAgICAgJC52YWthdGEuY29udGV4dC5jbnQuZmluZCgibGkgPiB1bCIpLmFkZENsYXNzKCJib3R0b20iKTsgCisgICAgICB9CisKKyAgICAgICQudmFrYXRhLmNvbnRleHQuY250CisgICAgICAgIC5jc3MoeyAibGVmdCIgOiB4LCAidG9wIiA6IHkgfSkKKyAgICAgICAgLmZpbmQoImxpOmhhcyh1bCkiKQorICAgICAgICAgIC5iaW5kKCJtb3VzZWVudGVyIiwgZnVuY3Rpb24gKGUpIHsgCisgICAgICAgICAgICB2YXIgdyA9ICQoZG9jdW1lbnQpLndpZHRoKCksCisgICAgICAgICAgICAgIGggPSAkKGRvY3VtZW50KS5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgdWwgPSAkKHRoaXMpLmNoaWxkcmVuKCJ1bCIpLnNob3coKTsgCisgICAgICAgICAgICBpZih3ICE9PSAkKGRvY3VtZW50KS53aWR0aCgpKSB7IHVsLnRvZ2dsZUNsYXNzKCJyaWdodCIpOyB9CisgICAgICAgICAgICBpZihoICE9PSAkKGRvY3VtZW50KS5oZWlnaHQoKSkgeyB1bC50b2dnbGVDbGFzcygiYm90dG9tIik7IH0KKyAgICAgICAgICB9KQorICAgICAgICAgIC5iaW5kKCJtb3VzZWxlYXZlIiwgZnVuY3Rpb24gKGUpIHsgCisgICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCJ1bCIpLmhpZGUoKTsgCisgICAgICAgICAgfSkKKyAgICAgICAgICAuZW5kKCkKKyAgICAgICAgLmNzcyh7ICJ2aXNpYmlsaXR5IiA6ICJ2aXNpYmxlIiB9KQorICAgICAgICAuc2hvdygpOworICAgICAgJChkb2N1bWVudCkudHJpZ2dlckhhbmRsZXIoImNvbnRleHRfc2hvdy52YWthdGEiKTsKKyAgICB9LAorICAgIGhpZGUgIDogZnVuY3Rpb24gKCkgeworICAgICAgJC52YWthdGEuY29udGV4dC52aXMgPSBmYWxzZTsKKyAgICAgICQudmFrYXRhLmNvbnRleHQuY250LmF0dHIoImNsYXNzIiwiIikuaGlkZSgpOworICAgICAgJChkb2N1bWVudCkudHJpZ2dlckhhbmRsZXIoImNvbnRleHRfaGlkZS52YWthdGEiKTsKKyAgICB9LAorICAgIHBhcnNlICA6IGZ1bmN0aW9uIChzLCBpc19jYWxsYmFjaykgeworICAgICAgaWYoIXMpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICB2YXIgc3RyID0gIiIsCisgICAgICAgIHRtcCA9IGZhbHNlLAorICAgICAgICB3YXNfc2VwID0gdHJ1ZTsKKyAgICAgIGlmKCFpc19jYWxsYmFjaykgeyAkLnZha2F0YS5jb250ZXh0LmZ1bmMgPSB7fTsgfQorICAgICAgc3RyICs9ICI8dWw+IjsKKyAgICAgICQuZWFjaChzLCBmdW5jdGlvbiAoaSwgdmFsKSB7CisgICAgICAgIGlmKCF2YWwpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgJC52YWthdGEuY29udGV4dC5mdW5jW2ldID0gdmFsLmFjdGlvbjsKKyAgICAgICAgaWYoIXdhc19zZXAgJiYgdmFsLnNlcGFyYXRvcl9iZWZvcmUpIHsKKyAgICAgICAgICBzdHIgKz0gIjxsaSBjbGFzcz0ndmFrYXRhLXNlcGFyYXRvciB2YWthdGEtc2VwYXJhdG9yLWJlZm9yZSc+PC9saT4iOworICAgICAgICB9CisgICAgICAgIHdhc19zZXAgPSBmYWxzZTsKKyAgICAgICAgc3RyICs9ICI8bGkgY2xhc3M9JyIgKyAodmFsLl9jbGFzcyB8fCAiIikgKyAodmFsLl9kaXNhYmxlZCA/ICIganN0cmVlLWNvbnRleHRtZW51LWRpc2FibGVkICIgOiAiIikgKyAiJz48aW5zICI7CisgICAgICAgIGlmKHZhbC5pY29uICYmIHZhbC5pY29uLmluZGV4T2YoIi8iKSA9PT0gLTEpIHsgc3RyICs9ICIgY2xhc3M9JyIgKyB2YWwuaWNvbiArICInICI7IH0KKyAgICAgICAgaWYodmFsLmljb24gJiYgdmFsLmljb24uaW5kZXhPZigiLyIpICE9PSAtMSkgeyBzdHIgKz0gIiBzdHlsZT0nYmFja2dyb3VuZDp1cmwoIiArIHZhbC5pY29uICsgIikgY2VudGVyIGNlbnRlciBuby1yZXBlYXQ7JyAiOyB9CisgICAgICAgIHN0ciArPSAiPiYjMTYwOzwvaW5zPjxhIGhyZWY9JyMnIHJlbD0nIiArIGkgKyAiJz4iOworICAgICAgICBpZih2YWwuc3VibWVudSkgeworICAgICAgICAgIHN0ciArPSAiPHNwYW4gc3R5bGU9J2Zsb2F0OnJpZ2h0Oyc+JnJhcXVvOzwvc3Bhbj4iOworICAgICAgICB9CisgICAgICAgIHN0ciArPSB2YWwubGFiZWwgKyAiPC9hPiI7CisgICAgICAgIGlmKHZhbC5zdWJtZW51KSB7CisgICAgICAgICAgdG1wID0gJC52YWthdGEuY29udGV4dC5wYXJzZSh2YWwuc3VibWVudSwgdHJ1ZSk7CisgICAgICAgICAgaWYodG1wKSB7IHN0ciArPSB0bXA7IH0KKyAgICAgICAgfQorICAgICAgICBzdHIgKz0gIjwvbGk+IjsKKyAgICAgICAgaWYodmFsLnNlcGFyYXRvcl9hZnRlcikgeworICAgICAgICAgIHN0ciArPSAiPGxpIGNsYXNzPSd2YWthdGEtc2VwYXJhdG9yIHZha2F0YS1zZXBhcmF0b3ItYWZ0ZXInPjwvbGk+IjsKKyAgICAgICAgICB3YXNfc2VwID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvPGxpIGNsYXNzXD0ndmFrYXRhLXNlcGFyYXRvciB2YWthdGEtc2VwYXJhdG9yLWFmdGVyJ1w+PFwvbGlcPiQvLCIiKTsKKyAgICAgIHN0ciArPSAiPC91bD4iOworICAgICAgcmV0dXJuIHN0ci5sZW5ndGggPiAxMCA/IHN0ciA6IGZhbHNlOworICAgIH0sCisgICAgZXhlYyAgOiBmdW5jdGlvbiAoaSkgeworICAgICAgaWYoJC5pc0Z1bmN0aW9uKCQudmFrYXRhLmNvbnRleHQuZnVuY1tpXSkpIHsKKyAgICAgICAgJC52YWthdGEuY29udGV4dC5mdW5jW2ldLmNhbGwoJC52YWthdGEuY29udGV4dC5kYXRhLCAkLnZha2F0YS5jb250ZXh0LnBhcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgZWxzZSB7IHJldHVybiBmYWxzZTsgfQorICAgIH0KKyAgfTsKKyAgJChmdW5jdGlvbiAoKSB7CisgICAgdmFyIGNzc19zdHJpbmcgPSAnJyArIAorICAgICAgJyN2YWthdGEtY29udGV4dG1lbnUgeyBkaXNwbGF5Om5vbmU7IHBvc2l0aW9uOmFic29sdXRlOyBtYXJnaW46MDsgcGFkZGluZzowOyBtaW4td2lkdGg6MTgwcHg7IGJhY2tncm91bmQ6I2ViZWJlYjsgYm9yZGVyOjFweCBzb2xpZCBzaWx2ZXI7IHotaW5kZXg6MTAwMDA7ICp3aWR0aDoxODBweDsgfSAnICsgCisgICAgICAnI3Zha2F0YS1jb250ZXh0bWVudSB1bCB7IG1pbi13aWR0aDoxODBweDsgKndpZHRoOjE4MHB4OyB9ICcgKyAKKyAgICAgICcjdmFrYXRhLWNvbnRleHRtZW51IHVsLCAjdmFrYXRhLWNvbnRleHRtZW51IGxpIHsgbWFyZ2luOjA7IHBhZGRpbmc6MDsgbGlzdC1zdHlsZS10eXBlOm5vbmU7IGRpc3BsYXk6YmxvY2s7IH0gJyArIAorICAgICAgJyN2YWthdGEtY29udGV4dG1lbnUgbGkgeyBsaW5lLWhlaWdodDoyMHB4OyBtaW4taGVpZ2h0OjIwcHg7IHBvc2l0aW9uOnJlbGF0aXZlOyBwYWRkaW5nOjBweDsgfSAnICsgCisgICAgICAnI3Zha2F0YS1jb250ZXh0bWVudSBsaSBhIHsgcGFkZGluZzoxcHggNnB4OyBsaW5lLWhlaWdodDoxN3B4OyBkaXNwbGF5OmJsb2NrOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgbWFyZ2luOjFweCAxcHggMCAxcHg7IH0gJyArIAorICAgICAgJyN2YWthdGEtY29udGV4dG1lbnUgbGkgaW5zIHsgZmxvYXQ6bGVmdDsgd2lkdGg6MTZweDsgaGVpZ2h0OjE2cHg7IHRleHQtZGVjb3JhdGlvbjpub25lOyBtYXJnaW4tcmlnaHQ6MnB4OyB9ICcgKyAKKyAgICAgICcjdmFrYXRhLWNvbnRleHRtZW51IGxpIGE6aG92ZXIsICN2YWthdGEtY29udGV4dG1lbnUgbGkudmFrYXRhLWhvdmVyID4gYSB7IGJhY2tncm91bmQ6Z3JheTsgY29sb3I6d2hpdGU7IH0gJyArIAorICAgICAgJyN2YWthdGEtY29udGV4dG1lbnUgbGkgdWwgeyBkaXNwbGF5Om5vbmU7IHBvc2l0aW9uOmFic29sdXRlOyB0b3A6LTJweDsgbGVmdDoxMDAlOyBiYWNrZ3JvdW5kOiNlYmViZWI7IGJvcmRlcjoxcHggc29saWQgZ3JheTsgfSAnICsgCisgICAgICAnI3Zha2F0YS1jb250ZXh0bWVudSAucmlnaHQgeyByaWdodDoxMDAlOyBsZWZ0OmF1dG87IH0gJyArIAorICAgICAgJyN2YWthdGEtY29udGV4dG1lbnUgLmJvdHRvbSB7IGJvdHRvbTotMXB4OyB0b3A6YXV0bzsgfSAnICsgCisgICAgICAnI3Zha2F0YS1jb250ZXh0bWVudSBsaS52YWthdGEtc2VwYXJhdG9yIHsgbWluLWhlaWdodDowOyBoZWlnaHQ6MXB4OyBsaW5lLWhlaWdodDoxcHg7IGZvbnQtc2l6ZToxcHg7IG92ZXJmbG93OmhpZGRlbjsgbWFyZ2luOjAgMnB4OyBiYWNrZ3JvdW5kOnNpbHZlcjsgLyogYm9yZGVyLXRvcDoxcHggc29saWQgI2ZlZmVmZTsgKi8gcGFkZGluZzowOyB9ICc7CisgICAgJC52YWthdGEuY3NzLmFkZF9zaGVldCh7IHN0ciA6IGNzc19zdHJpbmcgfSk7CisgICAgJC52YWthdGEuY29udGV4dC5jbnQKKyAgICAgIC5kZWxlZ2F0ZSgiYSIsImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9KQorICAgICAgLmRlbGVnYXRlKCJhIiwibW91c2V1cCIsIGZ1bmN0aW9uIChlKSB7CisgICAgICAgIGlmKCEkKHRoaXMpLnBhcmVudCgpLmhhc0NsYXNzKCJqc3RyZWUtY29udGV4dG1lbnUtZGlzYWJsZWQiKSAmJiAkLnZha2F0YS5jb250ZXh0LmV4ZWMoJCh0aGlzKS5hdHRyKCJyZWwiKSkpIHsKKyAgICAgICAgICAkLnZha2F0YS5jb250ZXh0LmhpZGUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgJCh0aGlzKS5ibHVyKCk7IH0KKyAgICAgIH0pCisgICAgICAuZGVsZWdhdGUoImEiLCJtb3VzZW92ZXIiLCBmdW5jdGlvbiAoKSB7CisgICAgICAgICQudmFrYXRhLmNvbnRleHQuY250LmZpbmQoIi52YWthdGEtaG92ZXIiKS5yZW1vdmVDbGFzcygidmFrYXRhLWhvdmVyIik7CisgICAgICB9KQorICAgICAgLmFwcGVuZFRvKCJib2R5Iik7CisgICAgJChkb2N1bWVudCkuYmluZCgibW91c2Vkb3duIiwgZnVuY3Rpb24gKGUpIHsgaWYoJC52YWthdGEuY29udGV4dC52aXMgJiYgISQuY29udGFpbnMoJC52YWthdGEuY29udGV4dC5jbnRbMF0sIGUudGFyZ2V0KSkgeyAkLnZha2F0YS5jb250ZXh0LmhpZGUoKTsgfSB9KTsKKyAgICBpZih0eXBlb2YgJC5ob3RrZXlzICE9PSAidW5kZWZpbmVkIikgeworICAgICAgJChkb2N1bWVudCkKKyAgICAgICAgLmJpbmQoImtleWRvd24iLCAidXAiLCBmdW5jdGlvbiAoZSkgeyAKKyAgICAgICAgICBpZigkLnZha2F0YS5jb250ZXh0LnZpcykgeyAKKyAgICAgICAgICAgIHZhciBvID0gJC52YWthdGEuY29udGV4dC5jbnQuZmluZCgidWw6dmlzaWJsZSIpLmxhc3QoKS5jaGlsZHJlbigiLnZha2F0YS1ob3ZlciIpLnJlbW92ZUNsYXNzKCJ2YWthdGEtaG92ZXIiKS5wcmV2QWxsKCJsaTpub3QoLnZha2F0YS1zZXBhcmF0b3IpIikuZmlyc3QoKTsKKyAgICAgICAgICAgIGlmKCFvLmxlbmd0aCkgeyBvID0gJC52YWthdGEuY29udGV4dC5jbnQuZmluZCgidWw6dmlzaWJsZSIpLmxhc3QoKS5jaGlsZHJlbigibGk6bm90KC52YWthdGEtc2VwYXJhdG9yKSIpLmxhc3QoKTsgfQorICAgICAgICAgICAgby5hZGRDbGFzcygidmFrYXRhLWhvdmVyIik7CisgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOyAKKyAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgICB9IAorICAgICAgICB9KQorICAgICAgICAuYmluZCgia2V5ZG93biIsICJkb3duIiwgZnVuY3Rpb24gKGUpIHsgCisgICAgICAgICAgaWYoJC52YWthdGEuY29udGV4dC52aXMpIHsgCisgICAgICAgICAgICB2YXIgbyA9ICQudmFrYXRhLmNvbnRleHQuY250LmZpbmQoInVsOnZpc2libGUiKS5sYXN0KCkuY2hpbGRyZW4oIi52YWthdGEtaG92ZXIiKS5yZW1vdmVDbGFzcygidmFrYXRhLWhvdmVyIikubmV4dEFsbCgibGk6bm90KC52YWthdGEtc2VwYXJhdG9yKSIpLmZpcnN0KCk7CisgICAgICAgICAgICBpZighby5sZW5ndGgpIHsgbyA9ICQudmFrYXRhLmNvbnRleHQuY250LmZpbmQoInVsOnZpc2libGUiKS5sYXN0KCkuY2hpbGRyZW4oImxpOm5vdCgudmFrYXRhLXNlcGFyYXRvcikiKS5maXJzdCgpOyB9CisgICAgICAgICAgICBvLmFkZENsYXNzKCJ2YWthdGEtaG92ZXIiKTsKKyAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7IAorICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICAgIH0gCisgICAgICAgIH0pCisgICAgICAgIC5iaW5kKCJrZXlkb3duIiwgInJpZ2h0IiwgZnVuY3Rpb24gKGUpIHsgCisgICAgICAgICAgaWYoJC52YWthdGEuY29udGV4dC52aXMpIHsgCisgICAgICAgICAgICAkLnZha2F0YS5jb250ZXh0LmNudC5maW5kKCIudmFrYXRhLWhvdmVyIikuY2hpbGRyZW4oInVsIikuc2hvdygpLmNoaWxkcmVuKCJsaTpub3QoLnZha2F0YS1zZXBhcmF0b3IpIikucmVtb3ZlQ2xhc3MoInZha2F0YS1ob3ZlciIpLmZpcnN0KCkuYWRkQ2xhc3MoInZha2F0YS1ob3ZlciIpOworICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsgCisgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgfSAKKyAgICAgICAgfSkKKyAgICAgICAgLmJpbmQoImtleWRvd24iLCAibGVmdCIsIGZ1bmN0aW9uIChlKSB7IAorICAgICAgICAgIGlmKCQudmFrYXRhLmNvbnRleHQudmlzKSB7IAorICAgICAgICAgICAgJC52YWthdGEuY29udGV4dC5jbnQuZmluZCgiLnZha2F0YS1ob3ZlciIpLmNoaWxkcmVuKCJ1bCIpLmhpZGUoKS5jaGlsZHJlbigiLnZha2F0YS1zZXBhcmF0b3IiKS5yZW1vdmVDbGFzcygidmFrYXRhLWhvdmVyIik7CisgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOyAKKyAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgICB9IAorICAgICAgICB9KQorICAgICAgICAuYmluZCgia2V5ZG93biIsICJlc2MiLCBmdW5jdGlvbiAoZSkgeyAKKyAgICAgICAgICAkLnZha2F0YS5jb250ZXh0LmhpZGUoKTsgCisgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgICB9KQorICAgICAgICAuYmluZCgia2V5ZG93biIsICJzcGFjZSIsIGZ1bmN0aW9uIChlKSB7IAorICAgICAgICAgICQudmFrYXRhLmNvbnRleHQuY250LmZpbmQoIi52YWthdGEtaG92ZXIiKS5sYXN0KCkuY2hpbGRyZW4oImEiKS5jbGljaygpOworICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKKyAgICAgICAgfSk7CisgICAgfQorICB9KTsKKworICAkLmpzdHJlZS5wbHVnaW4oImNvbnRleHRtZW51IiwgeworICAgIF9faW5pdCA6IGZ1bmN0aW9uICgpIHsKKyAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpCisgICAgICAgIC5kZWxlZ2F0ZSgiYSIsICJjb250ZXh0bWVudS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlKSB7CisgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICB0aGlzLnNob3dfY29udGV4dG1lbnUoZS5jdXJyZW50VGFyZ2V0LCBlLnBhZ2VYLCBlLnBhZ2VZKTsKKyAgICAgICAgICB9LCB0aGlzKSkKKyAgICAgICAgLmJpbmQoImRlc3Ryb3kuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICBpZih0aGlzLmRhdGEuY29udGV4dG1lbnUpIHsKKyAgICAgICAgICAgICAgJC52YWthdGEuY29udGV4dC5oaWRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwgdGhpcykpOworICAgICAgJChkb2N1bWVudCkuYmluZCgiY29udGV4dF9oaWRlLnZha2F0YSIsICQucHJveHkoZnVuY3Rpb24gKCkgeyB0aGlzLmRhdGEuY29udGV4dG1lbnUgPSBmYWxzZTsgfSwgdGhpcykpOworICAgIH0sCisgICAgZGVmYXVsdHMgOiB7IAorICAgICAgc2VsZWN0X25vZGUgOiBmYWxzZSwgLy8gcmVxdWlyZXMgVUkgcGx1Z2luCisgICAgICBzaG93X2F0X25vZGUgOiB0cnVlLAorICAgICAgaXRlbXMgOiB7IC8vIENvdWxkIGJlIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgcmV0dXJuIGFuIG9iamVjdCBsaWtlIHRoaXMgb25lCisgICAgICAgICJjcmVhdGUiIDogeworICAgICAgICAgICJzZXBhcmF0b3JfYmVmb3JlIiAgOiBmYWxzZSwKKyAgICAgICAgICAic2VwYXJhdG9yX2FmdGVyIiAgOiB0cnVlLAorICAgICAgICAgICJsYWJlbCIgICAgICAgIDogIkNyZWF0ZSIsCisgICAgICAgICAgImFjdGlvbiIgICAgICA6IGZ1bmN0aW9uIChvYmopIHsgdGhpcy5jcmVhdGUob2JqKTsgfQorICAgICAgICB9LAorICAgICAgICAicmVuYW1lIiA6IHsKKyAgICAgICAgICAic2VwYXJhdG9yX2JlZm9yZSIgIDogZmFsc2UsCisgICAgICAgICAgInNlcGFyYXRvcl9hZnRlciIgIDogZmFsc2UsCisgICAgICAgICAgImxhYmVsIiAgICAgICAgOiAiUmVuYW1lIiwKKyAgICAgICAgICAiYWN0aW9uIiAgICAgIDogZnVuY3Rpb24gKG9iaikgeyB0aGlzLnJlbmFtZShvYmopOyB9CisgICAgICAgIH0sCisgICAgICAgICJyZW1vdmUiIDogeworICAgICAgICAgICJzZXBhcmF0b3JfYmVmb3JlIiAgOiBmYWxzZSwKKyAgICAgICAgICAiaWNvbiIgICAgICAgIDogZmFsc2UsCisgICAgICAgICAgInNlcGFyYXRvcl9hZnRlciIgIDogZmFsc2UsCisgICAgICAgICAgImxhYmVsIiAgICAgICAgOiAiRGVsZXRlIiwKKyAgICAgICAgICAiYWN0aW9uIiAgICAgIDogZnVuY3Rpb24gKG9iaikgeyB0aGlzLnJlbW92ZShvYmopOyB9CisgICAgICAgIH0sCisgICAgICAgICJjY3AiIDogeworICAgICAgICAgICJzZXBhcmF0b3JfYmVmb3JlIiAgOiB0cnVlLAorICAgICAgICAgICJpY29uIiAgICAgICAgOiBmYWxzZSwKKyAgICAgICAgICAic2VwYXJhdG9yX2FmdGVyIiAgOiBmYWxzZSwKKyAgICAgICAgICAibGFiZWwiICAgICAgICA6ICJFZGl0IiwKKyAgICAgICAgICAiYWN0aW9uIiAgICAgIDogZmFsc2UsCisgICAgICAgICAgInN1Ym1lbnUiIDogeyAKKyAgICAgICAgICAgICJjdXQiIDogeworICAgICAgICAgICAgICAic2VwYXJhdG9yX2JlZm9yZSIgIDogZmFsc2UsCisgICAgICAgICAgICAgICJzZXBhcmF0b3JfYWZ0ZXIiICA6IGZhbHNlLAorICAgICAgICAgICAgICAibGFiZWwiICAgICAgICA6ICJDdXQiLAorICAgICAgICAgICAgICAiYWN0aW9uIiAgICAgIDogZnVuY3Rpb24gKG9iaikgeyB0aGlzLmN1dChvYmopOyB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNvcHkiIDogeworICAgICAgICAgICAgICAic2VwYXJhdG9yX2JlZm9yZSIgIDogZmFsc2UsCisgICAgICAgICAgICAgICJpY29uIiAgICAgICAgOiBmYWxzZSwKKyAgICAgICAgICAgICAgInNlcGFyYXRvcl9hZnRlciIgIDogZmFsc2UsCisgICAgICAgICAgICAgICJsYWJlbCIgICAgICAgIDogIkNvcHkiLAorICAgICAgICAgICAgICAiYWN0aW9uIiAgICAgIDogZnVuY3Rpb24gKG9iaikgeyB0aGlzLmNvcHkob2JqKTsgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJwYXN0ZSIgOiB7CisgICAgICAgICAgICAgICJzZXBhcmF0b3JfYmVmb3JlIiAgOiBmYWxzZSwKKyAgICAgICAgICAgICAgImljb24iICAgICAgICA6IGZhbHNlLAorICAgICAgICAgICAgICAic2VwYXJhdG9yX2FmdGVyIiAgOiBmYWxzZSwKKyAgICAgICAgICAgICAgImxhYmVsIiAgICAgICAgOiAiUGFzdGUiLAorICAgICAgICAgICAgICAiYWN0aW9uIiAgICAgIDogZnVuY3Rpb24gKG9iaikgeyB0aGlzLnBhc3RlKG9iaik7IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgIF9mbiA6IHsKKyAgICAgIHNob3dfY29udGV4dG1lbnUgOiBmdW5jdGlvbiAob2JqLCB4LCB5KSB7CisgICAgICAgIG9iaiA9IHRoaXMuX2dldF9ub2RlKG9iaik7CisgICAgICAgIHZhciBzID0gdGhpcy5nZXRfc2V0dGluZ3MoKS5jb250ZXh0bWVudSwKKyAgICAgICAgICBhID0gb2JqLmNoaWxkcmVuKCJhOnZpc2libGU6ZXEoMCkiKSwKKyAgICAgICAgICBvID0gZmFsc2U7CisgICAgICAgIGlmKHMuc2VsZWN0X25vZGUgJiYgdGhpcy5kYXRhLnVpICYmICF0aGlzLmlzX3NlbGVjdGVkKG9iaikpIHsKKyAgICAgICAgICB0aGlzLmRlc2VsZWN0X2FsbCgpOworICAgICAgICAgIHRoaXMuc2VsZWN0X25vZGUob2JqLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZihzLnNob3dfYXRfbm9kZSB8fCB0eXBlb2YgeCA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZW9mIHkgPT09ICJ1bmRlZmluZWQiKSB7CisgICAgICAgICAgbyA9IGEub2Zmc2V0KCk7CisgICAgICAgICAgeCA9IG8ubGVmdDsKKyAgICAgICAgICB5ID0gby50b3AgKyB0aGlzLmRhdGEuY29yZS5saV9oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYoJC5pc0Z1bmN0aW9uKHMuaXRlbXMpKSB7IHMuaXRlbXMgPSBzLml0ZW1zLmNhbGwodGhpcywgb2JqKTsgfQorICAgICAgICB0aGlzLmRhdGEuY29udGV4dG1lbnUgPSB0cnVlOworICAgICAgICAkLnZha2F0YS5jb250ZXh0LnNob3cocy5pdGVtcywgYSwgeCwgeSwgdGhpcywgb2JqKTsKKyAgICAgICAgaWYodGhpcy5kYXRhLnRoZW1lcykgeyAkLnZha2F0YS5jb250ZXh0LmNudC5hdHRyKCJjbGFzcyIsICJqc3RyZWUtIiArIHRoaXMuZGF0YS50aGVtZXMudGhlbWUgKyAiLWNvbnRleHQiKTsgfQorICAgICAgfQorICAgIH0KKyAgfSk7Cit9KShqUXVlcnkpOworLy8qLworCisvKiAKKyAqIGpzVHJlZSB0eXBlcyBwbHVnaW4gMS4wCisgKiBBZGRzIHN1cHBvcnQgdHlwZXMgb2Ygbm9kZXMKKyAqIFlvdSBjYW4gc2V0IGFuIGF0dHJpYnV0ZSBvbiBlYWNoIGxpIG5vZGUsIHRoYXQgcmVwcmVzZW50cyBpdHMgdHlwZS4KKyAqIEFjY29yZGluZyB0byB0aGUgdHlwZSBzZXR0aW5nIHRoZSBub2RlIG1heSBnZXQgY3VzdG9tIGljb24vdmFsaWRhdGlvbiBydWxlcworICovCisoZnVuY3Rpb24gKCQpIHsKKyAgJC5qc3RyZWUucGx1Z2luKCJ0eXBlcyIsIHsKKyAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLnR5cGVzOworICAgICAgdGhpcy5kYXRhLnR5cGVzLmF0dGFjaF90byA9IFtdOworICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkKKyAgICAgICAgLmJpbmQoImluaXQuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoKSB7IAorICAgICAgICAgICAgdmFyIHR5cGVzID0gcy50eXBlcywgCisgICAgICAgICAgICAgIGF0dHIgID0gcy50eXBlX2F0dHIsIAorICAgICAgICAgICAgICBpY29uc19jc3MgPSAiIiwgCisgICAgICAgICAgICAgIF90aGlzID0gdGhpczsKKworICAgICAgICAgICAgJC5lYWNoKHR5cGVzLCBmdW5jdGlvbiAoaSwgdHApIHsKKyAgICAgICAgICAgICAgJC5lYWNoKHRwLCBmdW5jdGlvbiAoaywgdikgeyAKKyAgICAgICAgICAgICAgICBpZighL14obWF4X2RlcHRofG1heF9jaGlsZHJlbnxpY29ufHZhbGlkX2NoaWxkcmVuKSQvLnRlc3QoaykpIHsgX3RoaXMuZGF0YS50eXBlcy5hdHRhY2hfdG8ucHVzaChrKTsgfQorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgaWYoIXRwLmljb24pIHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgICAgaWYoIHRwLmljb24uaW1hZ2UgfHwgdHAuaWNvbi5wb3NpdGlvbikgeworICAgICAgICAgICAgICAgIGlmKGkgPT0gImRlZmF1bHQiKSAgeyBpY29uc19jc3MgKz0gJy5qc3RyZWUtJyArIF90aGlzLmdldF9pbmRleCgpICsgJyBhID4gLmpzdHJlZS1pY29uIHsgJzsgfQorICAgICAgICAgICAgICAgIGVsc2UgICAgICAgIHsgaWNvbnNfY3NzICs9ICcuanN0cmVlLScgKyBfdGhpcy5nZXRfaW5kZXgoKSArICcgbGlbJyArIGF0dHIgKyAnPScgKyBpICsgJ10gPiBhID4gLmpzdHJlZS1pY29uIHsgJzsgfQorICAgICAgICAgICAgICAgIGlmKHRwLmljb24uaW1hZ2UpICB7IGljb25zX2NzcyArPSAnIGJhY2tncm91bmQtaW1hZ2U6dXJsKCcgKyB0cC5pY29uLmltYWdlICsgJyk7ICc7IH0KKyAgICAgICAgICAgICAgICBpZih0cC5pY29uLnBvc2l0aW9uKXsgaWNvbnNfY3NzICs9ICcgYmFja2dyb3VuZC1wb3NpdGlvbjonICsgdHAuaWNvbi5wb3NpdGlvbiArICc7ICc7IH0KKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICB7IGljb25zX2NzcyArPSAnIGJhY2tncm91bmQtcG9zaXRpb246MCAwOyAnOyB9CisgICAgICAgICAgICAgICAgaWNvbnNfY3NzICs9ICd9ICc7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYoaWNvbnNfY3NzICE9ICIiKSB7ICQudmFrYXRhLmNzcy5hZGRfc2hlZXQoeyAnc3RyJyA6IGljb25zX2NzcyB9KTsgfQorICAgICAgICAgIH0sIHRoaXMpKQorICAgICAgICAuYmluZCgiYmVmb3JlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHsgCisgICAgICAgICAgICBpZigkLmluQXJyYXkoZGF0YS5mdW5jLCB0aGlzLmRhdGEudHlwZXMuYXR0YWNoX3RvKSAhPT0gLTEpIHsKKyAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS50eXBlcy50eXBlcywKKyAgICAgICAgICAgICAgICB0ID0gdGhpcy5fZ2V0X3R5cGUoZGF0YS5hcmdzWzBdKTsKKyAgICAgICAgICAgICAgaWYoCisgICAgICAgICAgICAgICAgKCAKKyAgICAgICAgICAgICAgICAgIChzW3RdICYmIHR5cGVvZiBzW3RdW2RhdGEuZnVuY10gIT09ICJ1bmRlZmluZWQiKSB8fCAKKyAgICAgICAgICAgICAgICAgIChzWyJkZWZhdWx0Il0gJiYgdHlwZW9mIHNbImRlZmF1bHQiXVtkYXRhLmZ1bmNdICE9PSAidW5kZWZpbmVkIikKKyAgICAgICAgICAgICAgICApICYmICF0aGlzLl9jaGVjayhkYXRhLmZ1bmMsIGRhdGEuYXJnc1swXSkKKyAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LCB0aGlzKSk7CisgICAgfSwKKyAgICBkZWZhdWx0cyA6IHsKKyAgICAgIC8vIGRlZmluZXMgbWF4aW11bSBudW1iZXIgb2Ygcm9vdCBub2RlcyAoLTEgbWVhbnMgdW5saW1pdGVkLCAtMiBtZWFucyBkaXNhYmxlIG1heF9jaGlsZHJlbiBjaGVja2luZykKKyAgICAgIG1heF9jaGlsZHJlbiAgICA6IC0xLAorICAgICAgLy8gZGVmaW5lcyB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgdHJlZSAoLTEgbWVhbnMgdW5saW1pdGVkLCAtMiBtZWFucyBkaXNhYmxlIG1heF9kZXB0aCBjaGVja2luZykKKyAgICAgIG1heF9kZXB0aCAgICAgIDogLTEsCisgICAgICAvLyBkZWZpbmVzIHZhbGlkIG5vZGUgdHlwZXMgZm9yIHRoZSByb290IG5vZGVzCisgICAgICB2YWxpZF9jaGlsZHJlbiAgICA6ICJhbGwiLAorCisgICAgICAvLyB3aGVyZSBpcyB0aGUgdHlwZSBzdG9yZXMgKHRoZSByZWwgYXR0cmlidXRlIG9mIHRoZSBMSSBlbGVtZW50KQorICAgICAgdHlwZV9hdHRyIDogInJlbCIsCisgICAgICAvLyBhIGxpc3Qgb2YgdHlwZXMKKyAgICAgIHR5cGVzIDogeworICAgICAgICAvLyB0aGUgZGVmYXVsdCB0eXBlCisgICAgICAgICJkZWZhdWx0IiA6IHsKKyAgICAgICAgICAibWF4X2NoaWxkcmVuIiAgOiAtMSwKKyAgICAgICAgICAibWF4X2RlcHRoIiAgICA6IC0xLAorICAgICAgICAgICJ2YWxpZF9jaGlsZHJlbiI6ICJhbGwiCisKKyAgICAgICAgICAvLyBCb3VuZCBmdW5jdGlvbnMgLSB5b3UgY2FuIGJpbmQgYW55IG90aGVyIGZ1bmN0aW9uIGhlcmUgKHVzaW5nIGJvb2xlYW4gb3IgZnVuY3Rpb24pCisgICAgICAgICAgLy8ic2VsZWN0X25vZGUiICA6IHRydWUsCisgICAgICAgICAgLy8ib3Blbl9ub2RlIiAgOiB0cnVlLAorICAgICAgICAgIC8vImNsb3NlX25vZGUiICA6IHRydWUsCisgICAgICAgICAgLy8iY3JlYXRlX25vZGUiICA6IHRydWUsCisgICAgICAgICAgLy8iZGVsZXRlX25vZGUiICA6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgX2ZuIDogeworICAgICAgX2dldF90eXBlIDogZnVuY3Rpb24gKG9iaikgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICByZXR1cm4gKCFvYmogfHwgIW9iai5sZW5ndGgpID8gZmFsc2UgOiBvYmouYXR0cih0aGlzLl9nZXRfc2V0dGluZ3MoKS50eXBlcy50eXBlX2F0dHIpIHx8ICJkZWZhdWx0IjsKKyAgICAgIH0sCisgICAgICBzZXRfdHlwZSA6IGZ1bmN0aW9uIChzdHIsIG9iaikgeworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICByZXR1cm4gKCFvYmoubGVuZ3RoIHx8ICFzdHIpID8gZmFsc2UgOiBvYmouYXR0cih0aGlzLl9nZXRfc2V0dGluZ3MoKS50eXBlcy50eXBlX2F0dHIsIHN0cik7CisgICAgICB9LAorICAgICAgX2NoZWNrIDogZnVuY3Rpb24gKHJ1bGUsIG9iaiwgb3B0cykgeworICAgICAgICB2YXIgdiA9IGZhbHNlLCB0ID0gdGhpcy5fZ2V0X3R5cGUob2JqKSwgZCA9IDAsIF90aGlzID0gdGhpcywgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLnR5cGVzOworICAgICAgICBpZihvYmogPT09IC0xKSB7IAorICAgICAgICAgIGlmKCEhc1tydWxlXSkgeyB2ID0gc1tydWxlXTsgfQorICAgICAgICAgIGVsc2UgeyByZXR1cm47IH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZih0ID09PSBmYWxzZSkgeyByZXR1cm47IH0KKyAgICAgICAgICBpZighIXMudHlwZXNbdF0gJiYgISFzLnR5cGVzW3RdW3J1bGVdKSB7IHYgPSBzLnR5cGVzW3RdW3J1bGVdOyB9CisgICAgICAgICAgZWxzZSBpZighIXMudHlwZXNbImRlZmF1bHQiXSAmJiAhIXMudHlwZXNbImRlZmF1bHQiXVtydWxlXSkgeyB2ID0gcy50eXBlc1siZGVmYXVsdCJdW3J1bGVdOyB9CisgICAgICAgIH0KKyAgICAgICAgaWYoJC5pc0Z1bmN0aW9uKHYpKSB7IHYgPSB2LmNhbGwodGhpcywgb2JqKTsgfQorICAgICAgICBpZihydWxlID09PSAibWF4X2RlcHRoIiAmJiBvYmogIT09IC0xICYmIG9wdHMgIT09IGZhbHNlICYmIHMubWF4X2RlcHRoICE9PSAtMiAmJiB2ICE9PSAwKSB7CisgICAgICAgICAgLy8gYWxzbyBpbmNsdWRlIHRoZSBub2RlIGl0c2VsZiAtIG90aGVyd2lzZSBpZiByb290IG5vZGUgaXQgaXMgbm90IGNoZWNrZWQKKyAgICAgICAgICB0aGlzLl9nZXRfbm9kZShvYmopLmNoaWxkcmVuKCJhOmVxKDApIikucGFyZW50c1VudGlsKCIuanN0cmVlIiwibGkiKS5lYWNoKGZ1bmN0aW9uIChpKSB7CisgICAgICAgICAgICAvLyBjaGVjayBpZiBjdXJyZW50IGRlcHRoIGFscmVhZHkgZXhjZWVkcyBnbG9iYWwgdHJlZSBkZXB0aAorICAgICAgICAgICAgaWYocy5tYXhfZGVwdGggIT09IC0xICYmIHMubWF4X2RlcHRoIC0gKGkgKyAxKSA8PSAwKSB7IHYgPSAwOyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIGQgPSAoaSA9PT0gMCkgPyB2IDogX3RoaXMuX2NoZWNrKHJ1bGUsIHRoaXMsIGZhbHNlKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIGN1cnJlbnQgbm9kZSBtYXggZGVwdGggaXMgYWxyZWFkeSBtYXRjaGVkIG9yIGV4Y2VlZGVkCisgICAgICAgICAgICBpZihkICE9PSAtMSAmJiBkIC0gKGkgKyAxKSA8PSAwKSB7IHYgPSAwOyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSAtIHNldCB0aGUgbWF4IGRlcHRoIHRvIHRoZSBjdXJyZW50IHZhbHVlIG1pbnVzIGN1cnJlbnQgZGVwdGgKKyAgICAgICAgICAgIGlmKGQgPj0gMCAmJiAoZCAtIChpICsgMSkgPCB2IHx8IHYgPCAwKSApIHsgdiA9IGQgLSAoaSArIDEpOyB9CisgICAgICAgICAgICAvLyBpZiB0aGUgZ2xvYmFsIHRyZWUgZGVwdGggZXhpc3RzIGFuZCBpdCBtaW51cyB0aGUgbm9kZXMgY2FsY3VsYXRlZCBzbyBmYXIgaXMgbGVzcyB0aGFuIGB2YCBvciBgdmAgaXMgdW5saW1pdGVkCisgICAgICAgICAgICBpZihzLm1heF9kZXB0aCA+PSAwICYmIChzLm1heF9kZXB0aCAtIChpICsgMSkgPCB2IHx8IHYgPCAwKSApIHsgdiA9IHMubWF4X2RlcHRoIC0gKGkgKyAxKTsgfQorICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2OworICAgICAgfSwKKyAgICAgIGNoZWNrX21vdmUgOiBmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmKCF0aGlzLl9fY2FsbF9vbGQoKSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgdmFyIG0gID0gdGhpcy5fZ2V0X21vdmUoKSwKKyAgICAgICAgICBzICA9IG0ucnQuX2dldF9zZXR0aW5ncygpLnR5cGVzLAorICAgICAgICAgIG1jID0gbS5ydC5fY2hlY2soIm1heF9jaGlsZHJlbiIsIG0uY3IpLAorICAgICAgICAgIG1kID0gbS5ydC5fY2hlY2soIm1heF9kZXB0aCIsIG0uY3IpLAorICAgICAgICAgIHZjID0gbS5ydC5fY2hlY2soInZhbGlkX2NoaWxkcmVuIiwgbS5jciksCisgICAgICAgICAgY2ggPSAwLCBkID0gMSwgdDsKKworICAgICAgICBpZih2YyA9PT0gIm5vbmUiKSB7IHJldHVybiBmYWxzZTsgfSAKKyAgICAgICAgaWYoJC5pc0FycmF5KHZjKSAmJiBtLm90ICYmIG0ub3QuX2dldF90eXBlKSB7CisgICAgICAgICAgbS5vLmVhY2goZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgaWYoJC5pbkFycmF5KG0ub3QuX2dldF90eXBlKHRoaXMpLCB2YykgPT09IC0xKSB7IGQgPSBmYWxzZTsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgfSk7CisgICAgICAgICAgaWYoZCA9PT0gZmFsc2UpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIH0KKyAgICAgICAgaWYocy5tYXhfY2hpbGRyZW4gIT09IC0yICYmIG1jICE9PSAtMSkgeworICAgICAgICAgIGNoID0gbS5jciA9PT0gLTEgPyB0aGlzLmdldF9jb250YWluZXIoKS5jaGlsZHJlbigiPiB1bCA+IGxpIikubm90KG0ubykubGVuZ3RoIDogbS5jci5jaGlsZHJlbigiPiB1bCA+IGxpIikubm90KG0ubykubGVuZ3RoOworICAgICAgICAgIGlmKGNoICsgbS5vLmxlbmd0aCA+IG1jKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB9CisgICAgICAgIGlmKHMubWF4X2RlcHRoICE9PSAtMiAmJiBtZCAhPT0gLTEpIHsKKyAgICAgICAgICBkID0gMDsKKyAgICAgICAgICBpZihtZCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICBpZih0eXBlb2YgbS5vLmQgPT09ICJ1bmRlZmluZWQiKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBkZWFsIHdpdGggcHJvZ3Jlc3NpdmUgcmVuZGVyaW5nIGFuZCBhc3luYyB3aGVuIGNoZWNraW5nIG1heF9kZXB0aCAoaG93IHRvIGtub3cgdGhlIGRlcHRoIG9mIHRoZSBtb3ZlZCBub2RlKQorICAgICAgICAgICAgdCA9IG0ubzsKKyAgICAgICAgICAgIHdoaWxlKHQubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICB0ID0gdC5maW5kKCI+IHVsID4gbGkiKTsKKyAgICAgICAgICAgICAgZCArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG0uby5kID0gZDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYobWQgLSBtLm8uZCA8IDApIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9LAorICAgICAgY3JlYXRlX25vZGUgOiBmdW5jdGlvbiAob2JqLCBwb3NpdGlvbiwganMsIGNhbGxiYWNrLCBpc19sb2FkZWQsIHNraXBfY2hlY2spIHsKKyAgICAgICAgaWYoIXNraXBfY2hlY2sgJiYgKGlzX2xvYWRlZCB8fCB0aGlzLl9pc19sb2FkZWQob2JqKSkpIHsKKyAgICAgICAgICB2YXIgcCAgPSAocG9zaXRpb24gJiYgcG9zaXRpb24ubWF0Y2goL15iZWZvcmV8YWZ0ZXIkL2kpICYmIG9iaiAhPT0gLTEpID8gdGhpcy5fZ2V0X3BhcmVudChvYmopIDogdGhpcy5fZ2V0X25vZGUob2JqKSwKKyAgICAgICAgICAgIHMgID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkudHlwZXMsCisgICAgICAgICAgICBtYyA9IHRoaXMuX2NoZWNrKCJtYXhfY2hpbGRyZW4iLCBwKSwKKyAgICAgICAgICAgIG1kID0gdGhpcy5fY2hlY2soIm1heF9kZXB0aCIsIHApLAorICAgICAgICAgICAgdmMgPSB0aGlzLl9jaGVjaygidmFsaWRfY2hpbGRyZW4iLCBwKSwKKyAgICAgICAgICAgIGNoOworICAgICAgICAgIGlmKCFqcykgeyBqcyA9IHt9OyB9CisgICAgICAgICAgaWYodmMgPT09ICJub25lIikgeyByZXR1cm4gZmFsc2U7IH0gCisgICAgICAgICAgaWYoJC5pc0FycmF5KHZjKSkgeworICAgICAgICAgICAgaWYoIWpzLmF0dHIgfHwgIWpzLmF0dHJbcy50eXBlX2F0dHJdKSB7IAorICAgICAgICAgICAgICBpZighanMuYXR0cikgeyBqcy5hdHRyID0ge307IH0KKyAgICAgICAgICAgICAganMuYXR0cltzLnR5cGVfYXR0cl0gPSB2Y1swXTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgaWYoJC5pbkFycmF5KGpzLmF0dHJbcy50eXBlX2F0dHJdLCB2YykgPT09IC0xKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZihzLm1heF9jaGlsZHJlbiAhPT0gLTIgJiYgbWMgIT09IC0xKSB7CisgICAgICAgICAgICBjaCA9IHAgPT09IC0xID8gdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oIj4gdWwgPiBsaSIpLmxlbmd0aCA6IHAuY2hpbGRyZW4oIj4gdWwgPiBsaSIpLmxlbmd0aDsKKyAgICAgICAgICAgIGlmKGNoICsgMSA+IG1jKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZihzLm1heF9kZXB0aCAhPT0gLTIgJiYgbWQgIT09IC0xICYmIChtZCAtIDEpIDwgMCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5fX2NhbGxfb2xkKHRydWUsIG9iaiwgcG9zaXRpb24sIGpzLCBjYWxsYmFjaywgaXNfbG9hZGVkLCBza2lwX2NoZWNrKTsKKyAgICAgIH0KKyAgICB9CisgIH0pOworfSkoalF1ZXJ5KTsKKy8vKi8KKworLyogCisgKiBqc1RyZWUgSFRNTCBkYXRhIDEuMAorICogVGhlIEhUTUwgZGF0YSBzdG9yZS4gRGF0YXN0b3JlcyBhcmUgYnVpbGQgYnkgcmVwbGFjaW5nIHRoZSBgbG9hZF9ub2RlYCBhbmQgYF9pc19sb2FkZWRgIGZ1bmN0aW9ucy4KKyAqLworKGZ1bmN0aW9uICgkKSB7CisgICQuanN0cmVlLnBsdWdpbigiaHRtbF9kYXRhIiwgeworICAgIF9faW5pdCA6IGZ1bmN0aW9uICgpIHsgCisgICAgICAvLyB0aGlzIHVzZWQgdG8gdXNlIGh0bWwoKSBhbmQgY2xlYW4gdGhlIHdoaXRlc3BhY2UsIGJ1dCB0aGlzIHdheSBhbnkgYXR0YWNoZWQgZGF0YSB3YXMgbG9zdAorICAgICAgdGhpcy5kYXRhLmh0bWxfZGF0YS5vcmlnaW5hbF9jb250YWluZXJfaHRtbCA9IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmZpbmQoIiA+IHVsID4gbGkiKS5jbG9uZSh0cnVlKTsKKyAgICAgIC8vIHJlbW92ZSB3aGl0ZSBzcGFjZSBmcm9tIExJIG5vZGUgLSBvdGhlcndpc2Ugbm9kZXMgYXBwZWFyIGEgYml0IHRvIHRoZSByaWdodAorICAgICAgdGhpcy5kYXRhLmh0bWxfZGF0YS5vcmlnaW5hbF9jb250YWluZXJfaHRtbC5maW5kKCJsaSIpLmFuZFNlbGYoKS5jb250ZW50cygpLmZpbHRlcihmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMubm9kZVR5cGUgPT0gMzsgfSkucmVtb3ZlKCk7CisgICAgfSwKKyAgICBkZWZhdWx0cyA6IHsgCisgICAgICBkYXRhIDogZmFsc2UsCisgICAgICBhamF4IDogZmFsc2UsCisgICAgICBjb3JyZWN0X3N0YXRlIDogdHJ1ZQorICAgIH0sCisgICAgX2ZuIDogeworICAgICAgbG9hZF9ub2RlIDogZnVuY3Rpb24gKG9iaiwgc19jYWxsLCBlX2NhbGwpIHsgdmFyIF90aGlzID0gdGhpczsgdGhpcy5sb2FkX25vZGVfaHRtbChvYmosIGZ1bmN0aW9uICgpIHsgX3RoaXMuX19jYWxsYmFjayh7ICJvYmoiIDogb2JqIH0pOyBzX2NhbGwuY2FsbCh0aGlzKTsgfSwgZV9jYWxsKTsgfSwKKyAgICAgIF9pc19sb2FkZWQgOiBmdW5jdGlvbiAob2JqKSB7IAorICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOyAKKyAgICAgICAgcmV0dXJuIG9iaiA9PSAtMSB8fCAhb2JqIHx8ICF0aGlzLl9nZXRfc2V0dGluZ3MoKS5odG1sX2RhdGEuYWpheCB8fCBvYmouaXMoIi5qc3RyZWUtb3BlbiwgLmpzdHJlZS1sZWFmIikgfHwgb2JqLmNoaWxkcmVuKCJ1bCIpLmNoaWxkcmVuKCJsaSIpLnNpemUoKSA+IDA7CisgICAgICB9LAorICAgICAgbG9hZF9ub2RlX2h0bWwgOiBmdW5jdGlvbiAob2JqLCBzX2NhbGwsIGVfY2FsbCkgeworICAgICAgICB2YXIgZCwKKyAgICAgICAgICBzID0gdGhpcy5nZXRfc2V0dGluZ3MoKS5odG1sX2RhdGEsCisgICAgICAgICAgZXJyb3JfZnVuYyA9IGZ1bmN0aW9uICgpIHt9LAorICAgICAgICAgIHN1Y2Nlc3NfZnVuYyA9IGZ1bmN0aW9uICgpIHt9OworICAgICAgICBvYmogPSB0aGlzLl9nZXRfbm9kZShvYmopOworICAgICAgICBpZihvYmogJiYgb2JqICE9PSAtMSkgeworICAgICAgICAgIGlmKG9iai5kYXRhKCJqc3RyZWUtaXMtbG9hZGluZyIpKSB7IHJldHVybjsgfQorICAgICAgICAgIGVsc2UgeyBvYmouZGF0YSgianN0cmVlLWlzLWxvYWRpbmciLHRydWUpOyB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKCEwKSB7CisgICAgICAgICAgY2FzZSAoIXMuZGF0YSAmJiAhcy5hamF4KToKKyAgICAgICAgICAgIGlmKCFvYmogfHwgb2JqID09IC0xKSB7CisgICAgICAgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpCisgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKHRoaXMuZGF0YS5odG1sX2RhdGEub3JpZ2luYWxfY29udGFpbmVyX2h0bWwpCisgICAgICAgICAgICAgICAgLmZpbmQoImxpLCBhIikuZmlsdGVyKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZmlyc3RDaGlsZC50YWdOYW1lICE9PSAiSU5TIjsgfSkucHJlcGVuZCgiPGlucyBjbGFzcz0nanN0cmVlLWljb24nPiYjMTYwOzwvaW5zPiIpLmVuZCgpCisgICAgICAgICAgICAgICAgLmZpbHRlcigiYSIpLmNoaWxkcmVuKCJpbnM6Zmlyc3QtY2hpbGQiKS5ub3QoIi5qc3RyZWUtaWNvbiIpLmFkZENsYXNzKCJqc3RyZWUtaWNvbiIpOworICAgICAgICAgICAgICB0aGlzLmNsZWFuX25vZGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHNfY2FsbCkgeyBzX2NhbGwuY2FsbCh0aGlzKTsgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAoISFzLmRhdGEgJiYgIXMuYWpheCkgfHwgKCEhcy5kYXRhICYmICEhcy5hamF4ICYmICghb2JqIHx8IG9iaiA9PT0gLTEpKToKKyAgICAgICAgICAgIGlmKCFvYmogfHwgb2JqID09IC0xKSB7CisgICAgICAgICAgICAgIGQgPSAkKHMuZGF0YSk7CisgICAgICAgICAgICAgIGlmKCFkLmlzKCJ1bCIpKSB7IGQgPSAkKCI8dWw+IikuYXBwZW5kKGQpOyB9CisgICAgICAgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpCisgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCkuYXBwZW5kKGQuY2hpbGRyZW4oKSkKKyAgICAgICAgICAgICAgICAuZmluZCgibGksIGEiKS5maWx0ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5maXJzdENoaWxkLnRhZ05hbWUgIT09ICJJTlMiOyB9KS5wcmVwZW5kKCI8aW5zIGNsYXNzPSdqc3RyZWUtaWNvbic+JiMxNjA7PC9pbnM+IikuZW5kKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKCJhIikuY2hpbGRyZW4oImluczpmaXJzdC1jaGlsZCIpLm5vdCgiLmpzdHJlZS1pY29uIikuYWRkQ2xhc3MoImpzdHJlZS1pY29uIik7CisgICAgICAgICAgICAgIHRoaXMuY2xlYW5fbm9kZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoc19jYWxsKSB7IHNfY2FsbC5jYWxsKHRoaXMpOyB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICghcy5kYXRhICYmICEhcy5hamF4KSB8fCAoISFzLmRhdGEgJiYgISFzLmFqYXggJiYgb2JqICYmIG9iaiAhPT0gLTEpOgorICAgICAgICAgICAgb2JqID0gdGhpcy5fZ2V0X25vZGUob2JqKTsKKyAgICAgICAgICAgIGVycm9yX2Z1bmMgPSBmdW5jdGlvbiAoeCwgdCwgZSkgeworICAgICAgICAgICAgICB2YXIgZWYgPSB0aGlzLmdldF9zZXR0aW5ncygpLmh0bWxfZGF0YS5hamF4LmVycm9yOyAKKyAgICAgICAgICAgICAgaWYoZWYpIHsgZWYuY2FsbCh0aGlzLCB4LCB0LCBlKTsgfQorICAgICAgICAgICAgICBpZihvYmogIT0gLTEgJiYgb2JqLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIG9iai5jaGlsZHJlbigiLmpzdHJlZS1sb2FkaW5nIikucmVtb3ZlQ2xhc3MoImpzdHJlZS1sb2FkaW5nIik7CisgICAgICAgICAgICAgICAgb2JqLmRhdGEoImpzdHJlZS1pcy1sb2FkaW5nIixmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYodCA9PT0gInN1Y2Nlc3MiICYmIHMuY29ycmVjdF9zdGF0ZSkgeyBvYmoucmVtb3ZlQ2xhc3MoImpzdHJlZS1vcGVuIGpzdHJlZS1jbG9zZWQiKS5hZGRDbGFzcygianN0cmVlLWxlYWYiKTsgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmKHQgPT09ICJzdWNjZXNzIiAmJiBzLmNvcnJlY3Rfc3RhdGUpIHsgdGhpcy5nZXRfY29udGFpbmVyKCkuY2hpbGRyZW4oInVsIikuZW1wdHkoKTsgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmKGVfY2FsbCkgeyBlX2NhbGwuY2FsbCh0aGlzKTsgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHN1Y2Nlc3NfZnVuYyA9IGZ1bmN0aW9uIChkLCB0LCB4KSB7CisgICAgICAgICAgICAgIHZhciBzZiA9IHRoaXMuZ2V0X3NldHRpbmdzKCkuaHRtbF9kYXRhLmFqYXguc3VjY2VzczsgCisgICAgICAgICAgICAgIGlmKHNmKSB7IGQgPSBzZi5jYWxsKHRoaXMsZCx0LHgpIHx8IGQ7IH0KKyAgICAgICAgICAgICAgaWYoZCA9PSAiIikgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcl9mdW5jLmNhbGwodGhpcywgeCwgdCwgIiIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmKGQpIHsKKyAgICAgICAgICAgICAgICBkID0gJChkKTsKKyAgICAgICAgICAgICAgICBpZighZC5pcygidWwiKSkgeyBkID0gJCgiPHVsPiIpLmFwcGVuZChkKTsgfQorICAgICAgICAgICAgICAgIGlmKG9iaiA9PSAtMSB8fCAhb2JqKSB7IHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCkuYXBwZW5kKGQuY2hpbGRyZW4oKSkuZmluZCgibGksIGEiKS5maWx0ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5maXJzdENoaWxkLnRhZ05hbWUgIT09ICJJTlMiOyB9KS5wcmVwZW5kKCI8aW5zIGNsYXNzPSdqc3RyZWUtaWNvbic+JiMxNjA7PC9pbnM+IikuZW5kKCkuZmlsdGVyKCJhIikuY2hpbGRyZW4oImluczpmaXJzdC1jaGlsZCIpLm5vdCgiLmpzdHJlZS1pY29uIikuYWRkQ2xhc3MoImpzdHJlZS1pY29uIik7IH0KKyAgICAgICAgICAgICAgICBlbHNlIHsgb2JqLmNoaWxkcmVuKCIuanN0cmVlLWxvYWRpbmciKS5yZW1vdmVDbGFzcygianN0cmVlLWxvYWRpbmciKTsgb2JqLmFwcGVuZChkKS5maW5kKCJsaSwgYSIpLmZpbHRlcihmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmZpcnN0Q2hpbGQudGFnTmFtZSAhPT0gIklOUyI7IH0pLnByZXBlbmQoIjxpbnMgY2xhc3M9J2pzdHJlZS1pY29uJz4mIzE2MDs8L2lucz4iKS5lbmQoKS5maWx0ZXIoImEiKS5jaGlsZHJlbigiaW5zOmZpcnN0LWNoaWxkIikubm90KCIuanN0cmVlLWljb24iKS5hZGRDbGFzcygianN0cmVlLWljb24iKTsgb2JqLmRhdGEoImpzdHJlZS1pcy1sb2FkaW5nIixmYWxzZSk7IH0KKyAgICAgICAgICAgICAgICB0aGlzLmNsZWFuX25vZGUob2JqKTsKKyAgICAgICAgICAgICAgICBpZihzX2NhbGwpIHsgc19jYWxsLmNhbGwodGhpcyk7IH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihvYmogJiYgb2JqICE9PSAtMSkgeworICAgICAgICAgICAgICAgICAgb2JqLmNoaWxkcmVuKCIuanN0cmVlLWxvYWRpbmciKS5yZW1vdmVDbGFzcygianN0cmVlLWxvYWRpbmciKTsKKyAgICAgICAgICAgICAgICAgIG9iai5kYXRhKCJqc3RyZWUtaXMtbG9hZGluZyIsZmFsc2UpOworICAgICAgICAgICAgICAgICAgaWYocy5jb3JyZWN0X3N0YXRlKSB7IAorICAgICAgICAgICAgICAgICAgICBvYmoucmVtb3ZlQ2xhc3MoImpzdHJlZS1vcGVuIGpzdHJlZS1jbG9zZWQiKS5hZGRDbGFzcygianN0cmVlLWxlYWYiKTsgCisgICAgICAgICAgICAgICAgICAgIGlmKHNfY2FsbCkgeyBzX2NhbGwuY2FsbCh0aGlzKTsgfSAKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICBpZihzLmNvcnJlY3Rfc3RhdGUpIHsgCisgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpLmNoaWxkcmVuKCJ1bCIpLmVtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHNfY2FsbCkgeyBzX2NhbGwuY2FsbCh0aGlzKTsgfSAKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzLmFqYXguY29udGV4dCA9IHRoaXM7CisgICAgICAgICAgICBzLmFqYXguZXJyb3IgPSBlcnJvcl9mdW5jOworICAgICAgICAgICAgcy5hamF4LnN1Y2Nlc3MgPSBzdWNjZXNzX2Z1bmM7CisgICAgICAgICAgICBpZighcy5hamF4LmRhdGFUeXBlKSB7IHMuYWpheC5kYXRhVHlwZSA9ICJodG1sIjsgfQorICAgICAgICAgICAgaWYoJC5pc0Z1bmN0aW9uKHMuYWpheC51cmwpKSB7IHMuYWpheC51cmwgPSBzLmFqYXgudXJsLmNhbGwodGhpcywgb2JqKTsgfQorICAgICAgICAgICAgaWYoJC5pc0Z1bmN0aW9uKHMuYWpheC5kYXRhKSkgeyBzLmFqYXguZGF0YSA9IHMuYWpheC5kYXRhLmNhbGwodGhpcywgb2JqKTsgfQorICAgICAgICAgICAgJC5hamF4KHMuYWpheCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSk7CisgIC8vIGluY2x1ZGUgdGhlIEhUTUwgZGF0YSBwbHVnaW4gYnkgZGVmYXVsdAorICAkLmpzdHJlZS5kZWZhdWx0cy5wbHVnaW5zLnB1c2goImh0bWxfZGF0YSIpOworfSkoalF1ZXJ5KTsKKy8vKi8KKworLyogCisgKiBqc1RyZWUgdGhlbWVyb2xsZXIgcGx1Z2luIDEuMAorICogQWRkcyBzdXBwb3J0IGZvciBqUXVlcnkgVUkgdGhlbWVzLiBJbmNsdWRlIHRoaXMgYXQgdGhlIGVuZCBvZiB5b3VyIHBsdWdpbnMgbGlzdCwgYWxzbyBtYWtlIHN1cmUgInRoZW1lcyIgaXMgbm90IGluY2x1ZGVkLgorICovCisoZnVuY3Rpb24gKCQpIHsKKyAgJC5qc3RyZWUucGx1Z2luKCJ0aGVtZXJvbGxlciIsIHsKKyAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7CisgICAgICB2YXIgcyA9IHRoaXMuX2dldF9zZXR0aW5ncygpLnRoZW1lcm9sbGVyOworICAgICAgdGhpcy5nZXRfY29udGFpbmVyKCkKKyAgICAgICAgLmFkZENsYXNzKCJ1aS13aWRnZXQtY29udGVudCIpCisgICAgICAgIC5kZWxlZ2F0ZSgiYSIsIm1vdXNlZW50ZXIuanN0cmVlIiwgZnVuY3Rpb24gKCkgeworICAgICAgICAgICQodGhpcykuYWRkQ2xhc3Mocy5pdGVtX2gpOworICAgICAgICB9KQorICAgICAgICAuZGVsZWdhdGUoImEiLCJtb3VzZWxlYXZlLmpzdHJlZSIsIGZ1bmN0aW9uICgpIHsKKyAgICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKHMuaXRlbV9oKTsKKyAgICAgICAgfSkKKyAgICAgICAgLmJpbmQoIm9wZW5fbm9kZS5qc3RyZWUgY3JlYXRlX25vZGUuanN0cmVlIiwgJC5wcm94eShmdW5jdGlvbiAoZSwgZGF0YSkgeyAKKyAgICAgICAgICAgIHRoaXMuX3RoZW1lcm9sbGVyKGRhdGEucnNsdC5vYmopOworICAgICAgICAgIH0sIHRoaXMpKQorICAgICAgICAuYmluZCgibG9hZGVkLmpzdHJlZSByZWZyZXNoLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUpIHsKKyAgICAgICAgICAgIHRoaXMuX3RoZW1lcm9sbGVyKCk7CisgICAgICAgICAgfSwgdGhpcykpCisgICAgICAgIC5iaW5kKCJjbG9zZV9ub2RlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHsKKyAgICAgICAgICAgIGRhdGEucnNsdC5vYmouY2hpbGRyZW4oImlucyIpLnJlbW92ZUNsYXNzKHMub3BlbmVkKS5hZGRDbGFzcyhzLmNsb3NlZCk7CisgICAgICAgICAgfSwgdGhpcykpCisgICAgICAgIC5iaW5kKCJzZWxlY3Rfbm9kZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7CisgICAgICAgICAgICBkYXRhLnJzbHQub2JqLmNoaWxkcmVuKCJhIikuYWRkQ2xhc3Mocy5pdGVtX2EpOworICAgICAgICAgIH0sIHRoaXMpKQorICAgICAgICAuYmluZCgiZGVzZWxlY3Rfbm9kZS5qc3RyZWUgZGVzZWxlY3RfYWxsLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHsKKyAgICAgICAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpCisgICAgICAgICAgICAgIC5maW5kKCIuIiArIHMuaXRlbV9hKS5yZW1vdmVDbGFzcyhzLml0ZW1fYSkuZW5kKCkKKyAgICAgICAgICAgICAgLmZpbmQoIi5qc3RyZWUtY2xpY2tlZCIpLmFkZENsYXNzKHMuaXRlbV9hKTsKKyAgICAgICAgICB9LCB0aGlzKSkKKyAgICAgICAgLmJpbmQoIm1vdmVfbm9kZS5qc3RyZWUiLCAkLnByb3h5KGZ1bmN0aW9uIChlLCBkYXRhKSB7CisgICAgICAgICAgICB0aGlzLl90aGVtZXJvbGxlcihkYXRhLnJzbHQubyk7CisgICAgICAgICAgfSwgdGhpcykpOworICAgIH0sCisgICAgX19kZXN0cm95IDogZnVuY3Rpb24gKCkgeworICAgICAgdmFyIHMgPSB0aGlzLl9nZXRfc2V0dGluZ3MoKS50aGVtZXJvbGxlciwKKyAgICAgICAgYyA9IFsgInVpLWljb24iIF07CisgICAgICAkLmVhY2gocywgZnVuY3Rpb24gKGksIHYpIHsKKyAgICAgICAgdiA9IHYuc3BsaXQoIiAiKTsKKyAgICAgICAgaWYodi5sZW5ndGgpIHsgYyA9IGMuY29uY2F0KHYpOyB9CisgICAgICB9KTsKKyAgICAgIHRoaXMuZ2V0X2NvbnRhaW5lcigpCisgICAgICAgIC5yZW1vdmVDbGFzcygidWktd2lkZ2V0LWNvbnRlbnQiKQorICAgICAgICAuZmluZCgiLiIgKyBjLmpvaW4oIiwgLiIpKS5yZW1vdmVDbGFzcyhjLmpvaW4oIiAiKSk7CisgICAgfSwKKyAgICBfZm4gOiB7CisgICAgICBfdGhlbWVyb2xsZXIgOiBmdW5jdGlvbiAob2JqKSB7CisgICAgICAgIHZhciBzID0gdGhpcy5fZ2V0X3NldHRpbmdzKCkudGhlbWVyb2xsZXI7CisgICAgICAgIG9iaiA9ICFvYmogfHwgb2JqID09IC0xID8gdGhpcy5nZXRfY29udGFpbmVyKCkgOiB0aGlzLl9nZXRfbm9kZShvYmopLnBhcmVudCgpOworICAgICAgICBvYmoKKyAgICAgICAgICAuZmluZCgibGkuanN0cmVlLWNsb3NlZCA+IGlucy5qc3RyZWUtaWNvbiIpLnJlbW92ZUNsYXNzKHMub3BlbmVkKS5hZGRDbGFzcygidWktaWNvbiAiICsgcy5jbG9zZWQpLmVuZCgpCisgICAgICAgICAgLmZpbmQoImxpLmpzdHJlZS1vcGVuID4gaW5zLmpzdHJlZS1pY29uIikucmVtb3ZlQ2xhc3Mocy5jbG9zZWQpLmFkZENsYXNzKCJ1aS1pY29uICIgKyBzLm9wZW5lZCkuZW5kKCkKKyAgICAgICAgICAuZmluZCgiYSIpLmFkZENsYXNzKHMuaXRlbSkKKyAgICAgICAgICAgIC5jaGlsZHJlbigiaW5zLmpzdHJlZS1pY29uIikuYWRkQ2xhc3MoInVpLWljb24gIiArIHMuaXRlbV9pY29uKTsKKyAgICAgIH0KKyAgICB9LAorICAgIGRlZmF1bHRzIDogeworICAgICAgIm9wZW5lZCIgOiAidWktaWNvbi10cmlhbmdsZS0xLXNlIiwKKyAgICAgICJjbG9zZWQiIDogInVpLWljb24tdHJpYW5nbGUtMS1lIiwKKyAgICAgICJpdGVtIiA6ICJ1aS1zdGF0ZS1kZWZhdWx0IiwKKyAgICAgICJpdGVtX2giIDogInVpLXN0YXRlLWhvdmVyIiwKKyAgICAgICJpdGVtX2EiIDogInVpLXN0YXRlLWFjdGl2ZSIsCisgICAgICAiaXRlbV9pY29uIiA6ICJ1aS1pY29uLWZvbGRlci1jb2xsYXBzZWQiCisgICAgfQorICB9KTsKKyAgJChmdW5jdGlvbigpIHsKKyAgICB2YXIgY3NzX3N0cmluZyA9ICcuanN0cmVlIC51aS1pY29uIHsgb3ZlcmZsb3c6dmlzaWJsZTsgfSAuanN0cmVlIGEgeyBwYWRkaW5nOjAgMnB4OyB9JzsKKyAgICAkLnZha2F0YS5jc3MuYWRkX3NoZWV0KHsgc3RyIDogY3NzX3N0cmluZyB9KTsKKyAgfSk7Cit9KShqUXVlcnkpOworLy8qLworCisvKiAKKyAqIGpzVHJlZSB1bmlxdWUgcGx1Z2luIDEuMAorICogRm9yY2VzIGRpZmZlcmVudCBuYW1lcyBhbW9uZ3N0IHNpYmxpbmdzIChzdGlsbCBhIGJpdCBleHBlcmltZW50YWwpCisgKiBOT1RFOiBkb2VzIG5vdCBjaGVjayBsYW5ndWFnZSB2ZXJzaW9ucyAoaXQgd2lsbCBub3QgYmUgcG9zc2libGUgdG8gaGF2ZSBub2RlcyB3aXRoIHRoZSBzYW1lIHRpdGxlLCBldmVuIGluIGRpZmZlcmVudCBsYW5ndWFnZXMpCisgKi8KKyhmdW5jdGlvbiAoJCkgeworICAkLmpzdHJlZS5wbHVnaW4oInVuaXF1ZSIsIHsKKyAgICBfX2luaXQgOiBmdW5jdGlvbiAoKSB7CisgICAgICB0aGlzLmdldF9jb250YWluZXIoKQorICAgICAgICAuYmluZCgiYmVmb3JlLmpzdHJlZSIsICQucHJveHkoZnVuY3Rpb24gKGUsIGRhdGEpIHsgCisgICAgICAgICAgICB2YXIgbm1zID0gW10sIHJlcyA9IHRydWUsIHAsIHQ7CisgICAgICAgICAgICBpZihkYXRhLmZ1bmMgPT0gIm1vdmVfbm9kZSIpIHsKKyAgICAgICAgICAgICAgLy8gb2JqLCByZWYsIHBvc2l0aW9uLCBpc19jb3B5LCBpc19wcmVwYXJlZCwgc2tpcF9jaGVjaworICAgICAgICAgICAgICBpZihkYXRhLmFyZ3NbNF0gPT09IHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZihkYXRhLmFyZ3NbMF0ubyAmJiBkYXRhLmFyZ3NbMF0uby5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgIGRhdGEuYXJnc1swXS5vLmNoaWxkcmVuKCJhIikuZWFjaChmdW5jdGlvbiAoKSB7IG5tcy5wdXNoKCQodGhpcykudGV4dCgpLnJlcGxhY2UoL15ccysvZywiIikpOyB9KTsKKyAgICAgICAgICAgICAgICAgIHJlcyA9IHRoaXMuX2NoZWNrX3VuaXF1ZShubXMsIGRhdGEuYXJnc1swXS5ucC5maW5kKCI+IHVsID4gbGkiKS5ub3QoZGF0YS5hcmdzWzBdLm8pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGRhdGEuZnVuYyA9PSAiY3JlYXRlX25vZGUiKSB7CisgICAgICAgICAgICAgIC8vIG9iaiwgcG9zaXRpb24sIGpzLCBjYWxsYmFjaywgaXNfbG9hZGVkCisgICAgICAgICAgICAgIGlmKGRhdGEuYXJnc1s0XSB8fCB0aGlzLl9pc19sb2FkZWQoZGF0YS5hcmdzWzBdKSkgeworICAgICAgICAgICAgICAgIHAgPSB0aGlzLl9nZXRfbm9kZShkYXRhLmFyZ3NbMF0pOworICAgICAgICAgICAgICAgIGlmKGRhdGEuYXJnc1sxXSAmJiAoZGF0YS5hcmdzWzFdID09PSAiYmVmb3JlIiB8fCBkYXRhLmFyZ3NbMV0gPT09ICJhZnRlciIpKSB7CisgICAgICAgICAgICAgICAgICBwID0gdGhpcy5fZ2V0X3BhcmVudChkYXRhLmFyZ3NbMF0pOworICAgICAgICAgICAgICAgICAgaWYoIXAgfHwgcCA9PT0gLTEpIHsgcCA9IHRoaXMuZ2V0X2NvbnRhaW5lcigpOyB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBkYXRhLmFyZ3NbMl0gPT09ICJzdHJpbmciKSB7IG5tcy5wdXNoKGRhdGEuYXJnc1syXSk7IH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCFkYXRhLmFyZ3NbMl0gfHwgIWRhdGEuYXJnc1syXS5kYXRhKSB7IG5tcy5wdXNoKHRoaXMuX2dldF9zZXR0aW5ncygpLmNvcmUuc3RyaW5ncy5uZXdfbm9kZSk7IH0KKyAgICAgICAgICAgICAgICBlbHNlIHsgbm1zLnB1c2goZGF0YS5hcmdzWzJdLmRhdGEpOyB9CisgICAgICAgICAgICAgICAgcmVzID0gdGhpcy5fY2hlY2tfdW5pcXVlKG5tcywgcC5maW5kKCI+IHVsID4gbGkiKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGRhdGEuZnVuYyA9PSAicmVuYW1lX25vZGUiKSB7CisgICAgICAgICAgICAgIC8vIG9iaiwgdmFsCisgICAgICAgICAgICAgIG5tcy5wdXNoKGRhdGEuYXJnc1sxXSk7CisgICAgICAgICAgICAgIHQgPSB0aGlzLl9nZXRfbm9kZShkYXRhLmFyZ3NbMF0pOworICAgICAgICAgICAgICBwID0gdGhpcy5fZ2V0X3BhcmVudCh0KTsKKyAgICAgICAgICAgICAgaWYoIXAgfHwgcCA9PT0gLTEpIHsgcCA9IHRoaXMuZ2V0X2NvbnRhaW5lcigpOyB9CisgICAgICAgICAgICAgIHJlcyA9IHRoaXMuX2NoZWNrX3VuaXF1ZShubXMsIHAuZmluZCgiPiB1bCA+IGxpIikubm90KHQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFyZXMpIHsKKyAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0sIHRoaXMpKTsKKyAgICB9LAorICAgIF9mbiA6IHsgCisgICAgICBfY2hlY2tfdW5pcXVlIDogZnVuY3Rpb24gKG5tcywgcCkgeworICAgICAgICB2YXIgY25tcyA9IFtdOworICAgICAgICBwLmNoaWxkcmVuKCJhIikuZWFjaChmdW5jdGlvbiAoKSB7IGNubXMucHVzaCgkKHRoaXMpLnRleHQoKS5yZXBsYWNlKC9eXHMrL2csIiIpKTsgfSk7CisgICAgICAgIGlmKCFjbm1zLmxlbmd0aCB8fCAhbm1zLmxlbmd0aCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICBjbm1zID0gY25tcy5zb3J0KCkuam9pbigiLCwiKS5yZXBsYWNlKC8oLHxeKShbXixdKykoLCxcMikrKCx8JCkvZywiJDEkMiQ0IikucmVwbGFjZSgvLCwrL2csIiwiKS5yZXBsYWNlKC8sJC8sIiIpLnNwbGl0KCIsIik7CisgICAgICAgIGlmKChjbm1zLmxlbmd0aCArIG5tcy5sZW5ndGgpICE9IGNubXMuY29uY2F0KG5tcykuc29ydCgpLmpvaW4oIiwsIikucmVwbGFjZSgvKCx8XikoW14sXSspKCwsXDIpKygsfCQpL2csIiQxJDIkNCIpLnJlcGxhY2UoLywsKy9nLCIsIikucmVwbGFjZSgvLCQvLCIiKS5zcGxpdCgiLCIpLmxlbmd0aCkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0sCisgICAgICBjaGVja19tb3ZlIDogZnVuY3Rpb24gKCkgeworICAgICAgICBpZighdGhpcy5fX2NhbGxfb2xkKCkpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIHZhciBwID0gdGhpcy5fZ2V0X21vdmUoKSwgbm1zID0gW107CisgICAgICAgIGlmKHAubyAmJiBwLm8ubGVuZ3RoKSB7CisgICAgICAgICAgcC5vLmNoaWxkcmVuKCJhIikuZWFjaChmdW5jdGlvbiAoKSB7IG5tcy5wdXNoKCQodGhpcykudGV4dCgpLnJlcGxhY2UoL15ccysvZywiIikpOyB9KTsKKyAgICAgICAgICByZXR1cm4gdGhpcy5fY2hlY2tfdW5pcXVlKG5tcywgcC5ucC5maW5kKCI+IHVsID4gbGkiKS5ub3QocC5vKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9KTsKK30pKGpRdWVyeSk7CisvLyovCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9uZ3RpbWVhZ28uanMgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvbGlicy9uZ3RpbWVhZ28uanMKaW5kZXggYmQ3ZDcxYy4uZjk4YjIxNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL2xpYnMvbmd0aW1lYWdvLmpzCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9saWJzL25ndGltZWFnby5qcwpAQCAtMSwxMDIgKzEsMTAyIEBACi0vKg0KLUNvcHlyaWdodCAoYykgMjAxNCBVdHRlc2ggS3VtYXINCi0NCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcNCi1hIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUNCi0iU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nDQotd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLA0KLWRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bw0KLXBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bw0KLXRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KLWluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KLQ0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KLUVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRg0KLU1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EDQotTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQ0KLUxJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04NCi1PRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04NCi1XSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4NCi0qLw0KLSd1c2Ugc3RyaWN0JzsNCi0NCi12YXIgY2F0YWx5c3QgPSBhbmd1bGFyLm1vZHVsZSgnbmd0aW1lYWdvJywgW10pOw0KLQ0KLQ0KLWNhdGFseXN0LmZpbHRlcigndGltZWFnbycsIGZ1bmN0aW9uKCkgew0KLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBwX2FsbG93RnV0dXJlKSB7DQotDQotICAgICAgICAgICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHsNCi0gICAgICAgICAgICAgIHJldHVybiAiLSI7DQotICAgICAgICAgICAgfQ0KLSAgICANCi0gICAgICAgICAgICB2YXIgc3Vic3RpdHV0ZSA9IGZ1bmN0aW9uIChzdHJpbmdPckZ1bmN0aW9uLCBudW1iZXIsIHN0cmluZ3MpIHsNCi0gICAgICAgICAgICAgICAgICAgIHZhciBzdHJpbmcgPSBhbmd1bGFyLmlzRnVuY3Rpb24oc3RyaW5nT3JGdW5jdGlvbikgPyBzdHJpbmdPckZ1bmN0aW9uKG51bWJlciwgZGF0ZURpZmZlcmVuY2UpIDogc3RyaW5nT3JGdW5jdGlvbjsNCi0gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IChzdHJpbmdzLm51bWJlcnMgJiYgc3RyaW5ncy5udW1iZXJzW251bWJlcl0pIHx8IG51bWJlcjsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvJWQvaSwgdmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9LA0KLSAgICAgICAgICAgICAgICBub3dUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSwNCi0gICAgICAgICAgICAgICAgZGF0ZSA9IChuZXcgRGF0ZShpbnB1dCkpLmdldFRpbWUoKSwNCi0gICAgICAgICAgICAgICAgLy9yZWZyZXNoTWlsbGlzPSA2ZTQsIC8vQSBtaW51dGUNCi0gICAgICAgICAgICAgICAgYWxsb3dGdXR1cmUgPSBwX2FsbG93RnV0dXJlIHx8IGZhbHNlLA0KLSAgICAgICAgICAgICAgICBzdHJpbmdzPSB7DQotICAgICAgICAgICAgICAgICAgICBwcmVmaXhBZ286ICcnLA0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4RnJvbU5vdzogJycsDQotICAgICAgICAgICAgICAgICAgICBzdWZmaXhBZ286ICJhZ28iLA0KLSAgICAgICAgICAgICAgICAgICAgc3VmZml4RnJvbU5vdzogImZyb20gbm93IiwNCi0gICAgICAgICAgICAgICAgICAgIHNlY29uZHM6ICJsZXNzIHRoYW4gYSBtaW51dGUiLA0KLSAgICAgICAgICAgICAgICAgICAgbWludXRlOiAiYWJvdXQgYSBtaW51dGUiLA0KLSAgICAgICAgICAgICAgICAgICAgbWludXRlczogIiVkIG1pbnV0ZXMiLA0KLSAgICAgICAgICAgICAgICAgICAgaG91cjogImFib3V0IGFuIGhvdXIiLA0KLSAgICAgICAgICAgICAgICAgICAgaG91cnM6ICJhYm91dCAlZCBob3VycyIsDQotICAgICAgICAgICAgICAgICAgICBkYXk6ICJhIGRheSIsDQotICAgICAgICAgICAgICAgICAgICBkYXlzOiAiJWQgZGF5cyIsDQotICAgICAgICAgICAgICAgICAgICBtb250aDogImFib3V0IGEgbW9udGgiLA0KLSAgICAgICAgICAgICAgICAgICAgbW9udGhzOiAiJWQgbW9udGhzIiwNCi0gICAgICAgICAgICAgICAgICAgIHllYXI6ICJhYm91dCBhIHllYXIiLA0KLSAgICAgICAgICAgICAgICAgICAgeWVhcnM6ICIlZCB5ZWFycyINCi0gICAgICAgICAgICAgICAgfSwNCi0gICAgICAgICAgICAgICAgZGF0ZURpZmZlcmVuY2UgPSBub3dUaW1lIC0gZGF0ZSwNCi0gICAgICAgICAgICAgICAgd29yZHMsDQotICAgICAgICAgICAgICAgIHNlY29uZHMgPSBNYXRoLmFicyhkYXRlRGlmZmVyZW5jZSkgLyAxMDAwLA0KLSAgICAgICAgICAgICAgICBtaW51dGVzID0gc2Vjb25kcyAvIDYwLA0KLSAgICAgICAgICAgICAgICBob3VycyA9IG1pbnV0ZXMgLyA2MCwNCi0gICAgICAgICAgICAgICAgZGF5cyA9IGhvdXJzIC8gMjQsDQotICAgICAgICAgICAgICAgIHllYXJzID0gZGF5cyAvIDM2NSwNCi0gICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gc3RyaW5ncy53b3JkU2VwYXJhdG9yID09PSB1bmRlZmluZWQgPyAgIiAiIDogc3RyaW5ncy53b3JkU2VwYXJhdG9yLA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBwcmVmaXggPSBzdHJpbmdzLnByZWZpeEFnbywNCi0gICAgICAgICAgICAgICAgc3VmZml4ID0gc3RyaW5ncy5zdWZmaXhBZ287DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChhbGxvd0Z1dHVyZSkgew0KLSAgICAgICAgICAgICAgICBpZiAoZGF0ZURpZmZlcmVuY2UgPCAwKSB7DQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBzdHJpbmdzLnByZWZpeEZyb21Ob3c7DQotICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBzdHJpbmdzLnN1ZmZpeEZyb21Ob3c7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgd29yZHMgPSBzZWNvbmRzIDwgNDUgJiYgc3Vic3RpdHV0ZShzdHJpbmdzLnNlY29uZHMsIE1hdGgucm91bmQoc2Vjb25kcyksIHN0cmluZ3MpIHx8DQotICAgICAgICAgICAgc2Vjb25kcyA8IDkwICYmIHN1YnN0aXR1dGUoc3RyaW5ncy5taW51dGUsIDEsIHN0cmluZ3MpIHx8DQotICAgICAgICAgICAgbWludXRlcyA8IDQ1ICYmIHN1YnN0aXR1dGUoc3RyaW5ncy5taW51dGVzLCBNYXRoLnJvdW5kKG1pbnV0ZXMpLCBzdHJpbmdzKSB8fA0KLSAgICAgICAgICAgIG1pbnV0ZXMgPCA5MCAmJiBzdWJzdGl0dXRlKHN0cmluZ3MuaG91ciwgMSwgc3RyaW5ncykgfHwNCi0gICAgICAgICAgICBob3VycyA8IDI0ICYmIHN1YnN0aXR1dGUoc3RyaW5ncy5ob3VycywgTWF0aC5yb3VuZChob3VycyksIHN0cmluZ3MpIHx8DQotICAgICAgICAgICAgaG91cnMgPCA0MiAmJiBzdWJzdGl0dXRlKHN0cmluZ3MuZGF5LCAxLCBzdHJpbmdzKSB8fA0KLSAgICAgICAgICAgIGRheXMgPCAzMCAmJiBzdWJzdGl0dXRlKHN0cmluZ3MuZGF5cywgTWF0aC5yb3VuZChkYXlzKSwgc3RyaW5ncykgfHwNCi0gICAgICAgICAgICBkYXlzIDwgNDUgJiYgc3Vic3RpdHV0ZShzdHJpbmdzLm1vbnRoLCAxLCBzdHJpbmdzKSB8fA0KLSAgICAgICAgICAgIGRheXMgPCAzNjUgJiYgc3Vic3RpdHV0ZShzdHJpbmdzLm1vbnRocywgTWF0aC5yb3VuZChkYXlzIC8gMzApLCBzdHJpbmdzKSB8fA0KLSAgICAgICAgICAgIHllYXJzIDwgMS41ICYmIHN1YnN0aXR1dGUoc3RyaW5ncy55ZWFyLCAxLCBzdHJpbmdzKSB8fA0KLSAgICAgICAgICAgIHN1YnN0aXR1dGUoc3RyaW5ncy55ZWFycywgTWF0aC5yb3VuZCh5ZWFycyksIHN0cmluZ3MpOw0KLSAgICAgICAgICAgIGNvbnNvbGUubG9nKHByZWZpeCt3b3JkcytzdWZmaXgrc2VwYXJhdG9yKTsNCi0gICAgICAgICAgICBwcmVmaXgucmVwbGFjZSgvIC9nLCAnJykNCi0gICAgICAgICAgICB3b3Jkcy5yZXBsYWNlKC8gL2csICcnKQ0KLSAgICAgICAgICAgIHN1ZmZpeC5yZXBsYWNlKC8gL2csICcnKQ0KLSAgICAgICAgICAgIHJldHVybiAocHJlZml4KycgJyt3b3JkcysnICcrc3VmZml4KycgJytzZXBhcmF0b3IpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfTsNCi0gICAgfSk7DQotDQotICAgIA0KLQ0KKy8qCitDb3B5cmlnaHQgKGMpIDIwMTQgVXR0ZXNoIEt1bWFyCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCit3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCitkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KK3Blcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQoraW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCitXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyovCisndXNlIHN0cmljdCc7CisKK3ZhciBjYXRhbHlzdCA9IGFuZ3VsYXIubW9kdWxlKCduZ3RpbWVhZ28nLCBbXSk7CisKKworY2F0YWx5c3QuZmlsdGVyKCd0aW1lYWdvJywgZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbihpbnB1dCwgcF9hbGxvd0Z1dHVyZSkgeworCisgICAgICAgICAgICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgICByZXR1cm4gIi0iOworICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgdmFyIHN1YnN0aXR1dGUgPSBmdW5jdGlvbiAoc3RyaW5nT3JGdW5jdGlvbiwgbnVtYmVyLCBzdHJpbmdzKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzdHJpbmcgPSBhbmd1bGFyLmlzRnVuY3Rpb24oc3RyaW5nT3JGdW5jdGlvbikgPyBzdHJpbmdPckZ1bmN0aW9uKG51bWJlciwgZGF0ZURpZmZlcmVuY2UpIDogc3RyaW5nT3JGdW5jdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gKHN0cmluZ3MubnVtYmVycyAmJiBzdHJpbmdzLm51bWJlcnNbbnVtYmVyXSkgfHwgbnVtYmVyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyVkL2ksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIG5vd1RpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpLAorICAgICAgICAgICAgICAgIGRhdGUgPSAobmV3IERhdGUoaW5wdXQpKS5nZXRUaW1lKCksCisgICAgICAgICAgICAgICAgLy9yZWZyZXNoTWlsbGlzPSA2ZTQsIC8vQSBtaW51dGUKKyAgICAgICAgICAgICAgICBhbGxvd0Z1dHVyZSA9IHBfYWxsb3dGdXR1cmUgfHwgZmFsc2UsCisgICAgICAgICAgICAgICAgc3RyaW5ncz0geworICAgICAgICAgICAgICAgICAgICBwcmVmaXhBZ286ICcnLAorICAgICAgICAgICAgICAgICAgICBwcmVmaXhGcm9tTm93OiAnJywKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4QWdvOiAiYWdvIiwKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4RnJvbU5vdzogImZyb20gbm93IiwKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kczogImxlc3MgdGhhbiBhIG1pbnV0ZSIsCisgICAgICAgICAgICAgICAgICAgIG1pbnV0ZTogImFib3V0IGEgbWludXRlIiwKKyAgICAgICAgICAgICAgICAgICAgbWludXRlczogIiVkIG1pbnV0ZXMiLAorICAgICAgICAgICAgICAgICAgICBob3VyOiAiYWJvdXQgYW4gaG91ciIsCisgICAgICAgICAgICAgICAgICAgIGhvdXJzOiAiYWJvdXQgJWQgaG91cnMiLAorICAgICAgICAgICAgICAgICAgICBkYXk6ICJhIGRheSIsCisgICAgICAgICAgICAgICAgICAgIGRheXM6ICIlZCBkYXlzIiwKKyAgICAgICAgICAgICAgICAgICAgbW9udGg6ICJhYm91dCBhIG1vbnRoIiwKKyAgICAgICAgICAgICAgICAgICAgbW9udGhzOiAiJWQgbW9udGhzIiwKKyAgICAgICAgICAgICAgICAgICAgeWVhcjogImFib3V0IGEgeWVhciIsCisgICAgICAgICAgICAgICAgICAgIHllYXJzOiAiJWQgeWVhcnMiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBkYXRlRGlmZmVyZW5jZSA9IG5vd1RpbWUgLSBkYXRlLAorICAgICAgICAgICAgICAgIHdvcmRzLAorICAgICAgICAgICAgICAgIHNlY29uZHMgPSBNYXRoLmFicyhkYXRlRGlmZmVyZW5jZSkgLyAxMDAwLAorICAgICAgICAgICAgICAgIG1pbnV0ZXMgPSBzZWNvbmRzIC8gNjAsCisgICAgICAgICAgICAgICAgaG91cnMgPSBtaW51dGVzIC8gNjAsCisgICAgICAgICAgICAgICAgZGF5cyA9IGhvdXJzIC8gMjQsCisgICAgICAgICAgICAgICAgeWVhcnMgPSBkYXlzIC8gMzY1LAorICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9IHN0cmluZ3Mud29yZFNlcGFyYXRvciA9PT0gdW5kZWZpbmVkID8gICIgIiA6IHN0cmluZ3Mud29yZFNlcGFyYXRvciwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcHJlZml4ID0gc3RyaW5ncy5wcmVmaXhBZ28sCisgICAgICAgICAgICAgICAgc3VmZml4ID0gc3RyaW5ncy5zdWZmaXhBZ287CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYWxsb3dGdXR1cmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGF0ZURpZmZlcmVuY2UgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHN0cmluZ3MucHJlZml4RnJvbU5vdzsKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gc3RyaW5ncy5zdWZmaXhGcm9tTm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd29yZHMgPSBzZWNvbmRzIDwgNDUgJiYgc3Vic3RpdHV0ZShzdHJpbmdzLnNlY29uZHMsIE1hdGgucm91bmQoc2Vjb25kcyksIHN0cmluZ3MpIHx8CisgICAgICAgICAgICBzZWNvbmRzIDwgOTAgJiYgc3Vic3RpdHV0ZShzdHJpbmdzLm1pbnV0ZSwgMSwgc3RyaW5ncykgfHwKKyAgICAgICAgICAgIG1pbnV0ZXMgPCA0NSAmJiBzdWJzdGl0dXRlKHN0cmluZ3MubWludXRlcywgTWF0aC5yb3VuZChtaW51dGVzKSwgc3RyaW5ncykgfHwKKyAgICAgICAgICAgIG1pbnV0ZXMgPCA5MCAmJiBzdWJzdGl0dXRlKHN0cmluZ3MuaG91ciwgMSwgc3RyaW5ncykgfHwKKyAgICAgICAgICAgIGhvdXJzIDwgMjQgJiYgc3Vic3RpdHV0ZShzdHJpbmdzLmhvdXJzLCBNYXRoLnJvdW5kKGhvdXJzKSwgc3RyaW5ncykgfHwKKyAgICAgICAgICAgIGhvdXJzIDwgNDIgJiYgc3Vic3RpdHV0ZShzdHJpbmdzLmRheSwgMSwgc3RyaW5ncykgfHwKKyAgICAgICAgICAgIGRheXMgPCAzMCAmJiBzdWJzdGl0dXRlKHN0cmluZ3MuZGF5cywgTWF0aC5yb3VuZChkYXlzKSwgc3RyaW5ncykgfHwKKyAgICAgICAgICAgIGRheXMgPCA0NSAmJiBzdWJzdGl0dXRlKHN0cmluZ3MubW9udGgsIDEsIHN0cmluZ3MpIHx8CisgICAgICAgICAgICBkYXlzIDwgMzY1ICYmIHN1YnN0aXR1dGUoc3RyaW5ncy5tb250aHMsIE1hdGgucm91bmQoZGF5cyAvIDMwKSwgc3RyaW5ncykgfHwKKyAgICAgICAgICAgIHllYXJzIDwgMS41ICYmIHN1YnN0aXR1dGUoc3RyaW5ncy55ZWFyLCAxLCBzdHJpbmdzKSB8fAorICAgICAgICAgICAgc3Vic3RpdHV0ZShzdHJpbmdzLnllYXJzLCBNYXRoLnJvdW5kKHllYXJzKSwgc3RyaW5ncyk7CisgICAgICAgICAgICBjb25zb2xlLmxvZyhwcmVmaXgrd29yZHMrc3VmZml4K3NlcGFyYXRvcik7CisgICAgICAgICAgICBwcmVmaXgucmVwbGFjZSgvIC9nLCAnJykKKyAgICAgICAgICAgIHdvcmRzLnJlcGxhY2UoLyAvZywgJycpCisgICAgICAgICAgICBzdWZmaXgucmVwbGFjZSgvIC9nLCAnJykKKyAgICAgICAgICAgIHJldHVybiAocHJlZml4KycgJyt3b3JkcysnICcrc3VmZml4KycgJytzZXBhcmF0b3IpOworICAgICAgICAgICAgCisgICAgICAgIH07CisgICAgfSk7CisKKyAgICAKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL2FuYWx5c2lzLmh0bWwgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvYW5hbHlzaXMuaHRtbAppbmRleCAzMDE3NjAxLi4zYzFiNDU2IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvYW5hbHlzaXMuaHRtbAorKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvYW5hbHlzaXMuaHRtbApAQCAtMSwxMjggKzEsMTI4IEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZGl2IGlkPSJhbmFseXNpcyI+DQotDQotICA8ZGl2IGNsYXNzPSJibG9jayBhbmFseXNpcy1lcnJvciIgaWQ9ImFuYWx5c2lzLWhhbmRsZXItbWlzc2luZyIgbmctc2hvdz0iaXNIYW5kbGVyTWlzc2luZyI+DQotICAgIDxkaXYgY2xhc3M9ImhlYWQiPlRoaXMgRnVuY3Rpb25hbGl0eSByZXF1aXJlcyB0aGUgPGNvZGU+L2FuYWx5c2lzL2ZpZWxkPC9jb2RlPiBIYW5kbGVyIHRvIGJlIHJlZ2lzdGVyZWQgYW5kIGFjdGl2ZSE8L2Rpdj4NCi0gIDwvZGl2Pg0KLQ0KLSAgPGRpdiBjbGFzcz0iYmxvY2sgYW5hbHlzaXMtZXJyb3IiIGlkPSJhbmFseXNpcy1lcnJvciIgbmctc2hvdz0iYW5hbHlzaXNFcnJvciI+DQotICAgIDxkaXYgY2xhc3M9ImJvZHkiPnt7YW5hbHlzaXNFcnJvcn19PC9kaXY+DQotICA8L2Rpdj4NCi0NCi0gIDxkaXYgaWQ9ImFuYWx5c2lzLWhvbGRlciI+DQotDQotICAgIDxkaXYgaWQ9ImZpZWxkLWFuYWx5c2lzIj4NCi0NCi0gICAgICA8Zm9ybSBtZXRob2Q9ImdldCI+DQotDQotICAgICAgICA8dWwgY2xhc3M9ImNsZWFyZml4Ij4NCi0NCi0gICAgICAgICAgPGxpIGNsYXNzPSJpbmRleCI+DQotDQotICAgICAgICAgICAgPGxhYmVsIGZvcj0iYW5hbHlzaXNfZmllbGR2YWx1ZV9pbmRleCI+RmllbGQgVmFsdWUgKEluZGV4KTwvbGFiZWw+DQotICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9ImFuYWx5c2lzLmZpZWxkdmFsdWUiIGlkPSJhbmFseXNpc19maWVsZHZhbHVlX2luZGV4IiBuZy1tb2RlbD0iaW5kZXhUZXh0Ij48L3RleHRhcmVhPg0KLQ0KLSAgICAgICAgICA8L2xpPg0KLQ0KLSAgICAgICAgICA8bGkgY2xhc3M9InF1ZXJ5Ij4NCi0NCi0gICAgICAgICAgICA8bGFiZWwgZm9yPSJhbmFseXNpc19maWVsZHZhbHVlX3F1ZXJ5Ij5GaWVsZCBWYWx1ZSAoUXVlcnkpPC9sYWJlbD4NCi0gICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iYW5hbHlzaXMucXVlcnkiIGlkPSJhbmFseXNpc19maWVsZHZhbHVlX3F1ZXJ5IiBuZy1tb2RlbD0icXVlcnlUZXh0Ij48L3RleHRhcmVhPg0KLQ0KLSAgICAgICAgICA8L2xpPg0KLQ0KLSAgICAgICAgICA8bGkgY2xhc3M9InNldHRpbmdzLWhvbGRlciBjbGVhcmZpeCI+DQotICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MgY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idHlwZV9vcl9uYW1lIj5BbmFseXNlIEZpZWxkbmFtZSAvIEZpZWxkVHlwZTo8L2xhYmVsPg0KLSAgICAgICAgICAgICAgPHNlbGVjdCBzdHlsZT0id2lkdGg6MTMwcHgiIGNob3NlbiBuZy1jaGFuZ2U9ImNoYW5nZUZpZWxkT3JUeXBlKCkiIGlkPSJ0eXBlX29yX25hbWUiIG5nLW1vZGVsPSJmaWVsZE9yVHlwZSIgbmctb3B0aW9ucz0iZi52YWx1ZSBhcyBmLmxhYmVsIGdyb3VwIGJ5IGYuZ3JvdXAgZm9yIGYgaW4gZmllbGRzQW5kVHlwZXMiPjwvc2VsZWN0Pg0KLQ0KLSAgICAgICAgICAgICAgPGEgaWQ9InRvcl9zY2hlbWEiIG5nLWhyZWY9IiMve3tjb3JlfX0vc2NoZW1hP3t7c2NoZW1hQnJvd3NlclVybH19Ij48c3Bhbj5TY2hlbWEgQnJvd3Nlcjwvc3Bhbj4mbmJzcDs8L2E+DQotDQotICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b25zIGNsZWFyZml4Ij4NCi0NCi0gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5nLWNsaWNrPSJ1cGRhdGVRdWVyeVN0cmluZygpIj48c3Bhbj5BbmFseXNlIFZhbHVlczwvc3Bhbj48L2J1dHRvbj4NCi0NCi0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idmVyYm9zZV9vdXRwdXQiIG5nLWNsYXNzPSJ7YWN0aXZlOnZlcmJvc2V9Ij4NCi0gICAgICAgICAgICAgICAgICA8YSBuZy1jbGljaz0idG9nZ2xlVmVyYm9zZSgpIj5WZXJib3NlIE91dHB1dDwvYT4NCi0gICAgICAgICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgPC9saT4NCi0NCi0gICAgICAgIDwvdWw+DQotDQotICAgICAgPC9mb3JtPg0KLQ0KLSAgICA8L2Rpdj4NCi0NCi0gICAgPGRpdiBpZD0iYW5hbHlzaXMtcmVzdWx0IiBjbGFzcz0iY2xlYXJmaXggdmVyYm9zZV9vdXRwdXQiPg0KLSAgICAgIDxkaXYgbmctY2xhc3M9ImtleSIgbmctcmVwZWF0PSIoa2V5LCB0eXBlKSBpbiByZXN1bHQiPg0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4NCi0gICAgICAgICAgPHRib2R5IG5nLXJlcGVhdD0iY29tcG9uZW50IGluIHR5cGUiPg0KLSAgICAgICAgICAgIDx0ciBjbGFzcz0ic3RlcCI+DQotICAgICAgICAgICAgICA8dGQgY2xhc3M9InBhcnQgYW5hbHl6ZXIiPg0KLSAgICAgICAgICAgICAgICA8ZGl2Pg0KLSAgICAgICAgICAgICAgICAgIDxhYmJyIHRpdGxlPSJ7e2NvbXBvbmVudC5uYW1lfX0iPnt7Y29tcG9uZW50LnNob3J0fX08L2FiYnI+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgPC90ZD4NCi0NCi0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0icGFydCBsZWdlbmQiIG5nLXNob3c9InZlcmJvc2UiPg0KLSAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJob2xkZXIiPg0KLSAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQotICAgICAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG5nLXJlcGVhdD0iY2FwdGlvbiBpbiBjb21wb25lbnQuY2FwdGlvbnMiIGNsYXNzPSJ7e2dlbmVyYXRlX2NsYXNzX25hbWUoIHNob3J0X2tleSApfX0iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgY2FwdGlvbiB9fTwvdGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+DQotICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICAgIDwvdGFibGU+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0icGFydCBkYXRhIiBuZy1jbGFzcz0ie3NwYWNlcjp0b2tlbi5ibGFua30iIGNvbHNwYW49IjEiIG5nLXJlcGVhdD0idG9rZW4gaW4gY29tcG9uZW50LnRva2VucyB0cmFjayBieSB0b2tlbi5pbmRleCI+DQotICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhvbGRlciIgbmctaGlkZT0idG9rZW4uYmxhbmsiPg0KLSAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQotICAgICAgICAgICAgICAgICAgICA8dGJvZHk+DQotICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iZGV0YWlscyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJkZXRhaWxzIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9Int7dmFsdWUubmFtZX19IiBuZy1yZXBlYXQ9InZhbHVlIGluIHRva2VuLmtleXMiIG5nLXNob3c9InZlcmJvc2UgfHwgdmFsdWUubmFtZT09J3RleHQnIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3ZhbHVlLnZhbHVlfX08L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgICAgICA8L3Rib2R5Pg0KLSAgICAgICAgICAgICAgICAgIDwvdGFibGU+DQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJob2xkZXIiIG5nLXNob3c9InRva2VuLmJsYW5rIj4mbmJzcDs8L2Rpdj4NCi0gICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgPC90Ym9keT4NCi0gICAgICAgIDwvdGFibGU+DQotICAgICAgPC9kaXY+DQotICAgIDwvZGl2Pg0KLSAgPC9kaXY+DQotDQotPC9kaXY+DQorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZGl2IGlkPSJhbmFseXNpcyI+CisKKyAgPGRpdiBjbGFzcz0iYmxvY2sgYW5hbHlzaXMtZXJyb3IiIGlkPSJhbmFseXNpcy1oYW5kbGVyLW1pc3NpbmciIG5nLXNob3c9ImlzSGFuZGxlck1pc3NpbmciPgorICAgIDxkaXYgY2xhc3M9ImhlYWQiPlRoaXMgRnVuY3Rpb25hbGl0eSByZXF1aXJlcyB0aGUgPGNvZGU+L2FuYWx5c2lzL2ZpZWxkPC9jb2RlPiBIYW5kbGVyIHRvIGJlIHJlZ2lzdGVyZWQgYW5kIGFjdGl2ZSE8L2Rpdj4KKyAgPC9kaXY+CisKKyAgPGRpdiBjbGFzcz0iYmxvY2sgYW5hbHlzaXMtZXJyb3IiIGlkPSJhbmFseXNpcy1lcnJvciIgbmctc2hvdz0iYW5hbHlzaXNFcnJvciI+CisgICAgPGRpdiBjbGFzcz0iYm9keSI+e3thbmFseXNpc0Vycm9yfX08L2Rpdj4KKyAgPC9kaXY+CisKKyAgPGRpdiBpZD0iYW5hbHlzaXMtaG9sZGVyIj4KKworICAgIDxkaXYgaWQ9ImZpZWxkLWFuYWx5c2lzIj4KKworICAgICAgPGZvcm0gbWV0aG9kPSJnZXQiPgorCisgICAgICAgIDx1bCBjbGFzcz0iY2xlYXJmaXgiPgorCisgICAgICAgICAgPGxpIGNsYXNzPSJpbmRleCI+CisKKyAgICAgICAgICAgIDxsYWJlbCBmb3I9ImFuYWx5c2lzX2ZpZWxkdmFsdWVfaW5kZXgiPkZpZWxkIFZhbHVlIChJbmRleCk8L2xhYmVsPgorICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9ImFuYWx5c2lzLmZpZWxkdmFsdWUiIGlkPSJhbmFseXNpc19maWVsZHZhbHVlX2luZGV4IiBuZy1tb2RlbD0iaW5kZXhUZXh0Ij48L3RleHRhcmVhPgorCisgICAgICAgICAgPC9saT4KKworICAgICAgICAgIDxsaSBjbGFzcz0icXVlcnkiPgorCisgICAgICAgICAgICA8bGFiZWwgZm9yPSJhbmFseXNpc19maWVsZHZhbHVlX3F1ZXJ5Ij5GaWVsZCBWYWx1ZSAoUXVlcnkpPC9sYWJlbD4KKyAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJhbmFseXNpcy5xdWVyeSIgaWQ9ImFuYWx5c2lzX2ZpZWxkdmFsdWVfcXVlcnkiIG5nLW1vZGVsPSJxdWVyeVRleHQiPjwvdGV4dGFyZWE+CisKKyAgICAgICAgICA8L2xpPgorCisgICAgICAgICAgPGxpIGNsYXNzPSJzZXR0aW5ncy1ob2xkZXIgY2xlYXJmaXgiPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MgY2xlYXJmaXgiPgorICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJ0eXBlX29yX25hbWUiPkFuYWx5c2UgRmllbGRuYW1lIC8gRmllbGRUeXBlOjwvbGFiZWw+CisgICAgICAgICAgICAgIDxzZWxlY3Qgc3R5bGU9IndpZHRoOjEzMHB4IiBjaG9zZW4gbmctY2hhbmdlPSJjaGFuZ2VGaWVsZE9yVHlwZSgpIiBpZD0idHlwZV9vcl9uYW1lIiBuZy1tb2RlbD0iZmllbGRPclR5cGUiIG5nLW9wdGlvbnM9ImYudmFsdWUgYXMgZi5sYWJlbCBncm91cCBieSBmLmdyb3VwIGZvciBmIGluIGZpZWxkc0FuZFR5cGVzIj48L3NlbGVjdD4KKworICAgICAgICAgICAgICA8YSBpZD0idG9yX3NjaGVtYSIgbmctaHJlZj0iIy97e2NvcmV9fS9zY2hlbWE/e3tzY2hlbWFCcm93c2VyVXJsfX0iPjxzcGFuPlNjaGVtYSBCcm93c2VyPC9zcGFuPiZuYnNwOzwvYT4KKworICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b25zIGNsZWFyZml4Ij4KKworICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuZy1jbGljaz0idXBkYXRlUXVlcnlTdHJpbmcoKSI+PHNwYW4+QW5hbHlzZSBWYWx1ZXM8L3NwYW4+PC9idXR0b24+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ2ZXJib3NlX291dHB1dCIgbmctY2xhc3M9InthY3RpdmU6dmVyYm9zZX0iPgorICAgICAgICAgICAgICAgICAgPGEgbmctY2xpY2s9InRvZ2dsZVZlcmJvc2UoKSI+VmVyYm9zZSBPdXRwdXQ8L2E+CisgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIDwvbGk+CisKKyAgICAgICAgPC91bD4KKworICAgICAgPC9mb3JtPgorCisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGlkPSJhbmFseXNpcy1yZXN1bHQiIGNsYXNzPSJjbGVhcmZpeCB2ZXJib3NlX291dHB1dCI+CisgICAgICA8ZGl2IG5nLWNsYXNzPSJrZXkiIG5nLXJlcGVhdD0iKGtleSwgdHlwZSkgaW4gcmVzdWx0Ij4KKyAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dGJvZHkgbmctcmVwZWF0PSJjb21wb25lbnQgaW4gdHlwZSI+CisgICAgICAgICAgICA8dHIgY2xhc3M9InN0ZXAiPgorICAgICAgICAgICAgICA8dGQgY2xhc3M9InBhcnQgYW5hbHl6ZXIiPgorICAgICAgICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICAgICAgICA8YWJiciB0aXRsZT0ie3tjb21wb25lbnQubmFtZX19Ij57e2NvbXBvbmVudC5zaG9ydH19PC9hYmJyPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICA8L3RkPgorCisgICAgICAgICAgICAgIDx0ZCBjbGFzcz0icGFydCBsZWdlbmQiIG5nLXNob3c9InZlcmJvc2UiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhvbGRlciI+CisgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG5nLXJlcGVhdD0iY2FwdGlvbiBpbiBjb21wb25lbnQuY2FwdGlvbnMiIGNsYXNzPSJ7e2dlbmVyYXRlX2NsYXNzX25hbWUoIHNob3J0X2tleSApfX0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBjYXB0aW9uIH19PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgIDx0ZCBjbGFzcz0icGFydCBkYXRhIiBuZy1jbGFzcz0ie3NwYWNlcjp0b2tlbi5ibGFua30iIGNvbHNwYW49IjEiIG5nLXJlcGVhdD0idG9rZW4gaW4gY29tcG9uZW50LnRva2VucyB0cmFjayBieSB0b2tlbi5pbmRleCI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaG9sZGVyIiBuZy1oaWRlPSJ0b2tlbi5ibGFuayI+CisgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJkZXRhaWxzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZGV0YWlscyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJ7e3ZhbHVlLm5hbWV9fSIgbmctcmVwZWF0PSJ2YWx1ZSBpbiB0b2tlbi5rZXlzIiBuZy1zaG93PSJ2ZXJib3NlIHx8IHZhbHVlLm5hbWU9PSd0ZXh0JyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3ZhbHVlLnZhbHVlfX08L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJob2xkZXIiIG5nLXNob3c9InRva2VuLmJsYW5rIj4mbmJzcDs8L2Rpdj4KKyAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorICA8L2Rpdj4KKworPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvY2xvdWQuaHRtbCBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9jbG91ZC5odG1sCmluZGV4IGVlODNmN2YuLjQxNWUxMjMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9jbG91ZC5odG1sCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9jbG91ZC5odG1sCkBAIC0xLDEwNSArMSwxMDUgQEAKLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxkaXYgaWQ9ImNsb3VkIiBjbGFzcz0iY2xlYXJmaXgiPg0KLQ0KLSAgPGRpdiBpZD0iZnJhbWUiPg0KLQ0KLSAgICA8ZGl2IGlkPSJ0cmVlLWNvbnRlbnQiIGNsYXNzPSJjb250ZW50IGNsZWFyZml4IiBuZy1zaG93PSJzaG93VHJlZSI+DQotICAgIDxqc3RyZWUgY2xhc3M9InRyZWUiIG9uLXNlbGVjdD0ic2hvd1RyZWVMaW5rKHVybCkiIGlkPSJ0cmVlIiBkYXRhPSJ0cmVlIj48L2pzdHJlZT4NCi0NCi0gICAgICA8ZGl2IGlkPSJmaWxlLWNvbnRlbnQiIGNsYXNzPSJjbGVhcmZpeCI+DQotDQotICAgICAgICA8YSBpZD0idG9nZ2xlIiBuZy1jbGljaz0ic2hvd1Byb3BzID0gIXNob3dQcm9wcyIgbmctc2hvdz0ic2hvd0RhdGEiIG5nLWNsYXNzPSJzaG93UHJvcHMgPyAnbWludXMnIDogJ3BsdXMnIj5NZXRhZGF0YTwvYT4NCi0gICAgICAgIDxkaXYgaWQ9InByb3AiIG5nLXNob3c9Inpub2RlLnByb3AgJiYgc2hvd0RhdGEgJiYgc2hvd1Byb3BzIj4NCi0gICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgIDxsaSBuZy1jbGFzcz0ie29kZDokb2RkfSIgbmctcmVwZWF0PSIoa2V5LCBwcm9wKSBpbiB6bm9kZS5wcm9wIj4NCi0gICAgICAgICAgICAgIDxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgICA8ZHQ+e3sga2V5IH19PC9kdD4NCi0gICAgICAgICAgICAgICAgPGRkPnt7IHByb3AgfX08L2RkPg0KLSAgICAgICAgICAgICAgPC9kbD4NCi0gICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICA8L3VsPg0KLSAgICAgICAgPC9kaXY+DQotDQotICAgICAgICA8ZGl2IGlkPSJkYXRhIiBuZy1zaG93PSJzaG93RGF0YSI+DQotICAgICAgICAgIDxlbSBuZy1zaG93PSIhem5vZGUuZGF0YSI+Tm9kZSAie3t6bm9kZS5wYXRoIH19IiBoYXMgbm8gdXRmOCBDb250ZW50PC9lbT4NCi0gICAgICAgICAgPHByZSBuZy1zaG93PSJ6bm9kZS5kYXRhIiBjbGFzcz0ic3ludGF4IGxhbmd1YWdlLXt7bGFuZ319Ig0KLSAgICAgICAgICAgIG5nLWJpbmQtaHRtbD0iem5vZGUuZGF0YSB8IGhpZ2hsaWdodDpsYW5nIHwgdW5zYWZlIj4NCi0gICAgICAgICAgPC9wcmU+DQotICAgICAgICA8YSBjbGFzcz0iY2xvc2UiIG5nLWNsaWNrPSJoaWRlRGF0YSgpIj48c3Bhbj4mbmJzcDs8L3NwYW4+PC9hPg0KLSAgICAgICAgPC9kaXY+DQotDQotDQotICAgICAgPC9kaXY+DQotDQotICAgIDwvZGl2Pg0KLQ0KLSAgICA8ZGl2IGdyYXBoIGRhdGE9ImdyYXBoRGF0YSIgbGVhZi1jb3VudD0ibGVhZkNvdW50IiBoZWxwZXItZGF0YT0iaGVscGVyRGF0YSIgaXMtcmFkaWFsPSJpc1JhZGlhbCIgaWQ9ImdyYXBoLWNvbnRlbnQiIGNsYXNzPSJjb250ZW50IGNsZWFyZml4IiBuZy1zaG93PSJzaG93R3JhcGgiPg0KLQ0KLSAgICAgIDxkaXYgaWQ9ImNhbnZhcyI+PC9kaXY+DQotDQotICAgICAgPGRpdiBpZD0ibGVnZW5kIj4NCi0gICAgICAgIDx1bD4NCi0gICAgICAgICAgPGxpIGNsYXNzPSJsZWFkZXIiPjxzdmcgd2lkdGg9IjE1IiBoZWlnaHQ9IjE1Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1LDIpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDUpIj48Y2lyY2xlIHI9IjQuNSI+PC9jaXJjbGU+PC9nPjwvZz48L3N2Zz4gTGVhZGVyPC9saT4NCi0gICAgICAgICAgPGxpIGNsYXNzPSJhY3RpdmUiPjxzdmcgd2lkdGg9IjE1IiBoZWlnaHQ9IjE1Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1LDIpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDUpIj48Y2lyY2xlIHI9IjQuNSI+PC9jaXJjbGU+PC9nPjwvZz48L3N2Zz4gQWN0aXZlPC9saT4NCi0gICAgICAgICAgPGxpIGNsYXNzPSJyZWNvdmVyaW5nIj48c3ZnIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSwyKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw1KSI+PGNpcmNsZSByPSI0LjUiPjwvY2lyY2xlPjwvZz48L2c+PC9zdmc+IFJlY292ZXJpbmc8L2xpPg0KLSAgICAgICAgICA8bGkgY2xhc3M9ImRvd24iPjxzdmcgd2lkdGg9IjE1IiBoZWlnaHQ9IjE1Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1LDIpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDUpIj48Y2lyY2xlIHI9IjQuNSI+PC9jaXJjbGU+PC9nPjwvZz48L3N2Zz4gRG93bjwvbGk+DQotICAgICAgICAgIDxsaSBjbGFzcz0icmVjb3ZlcnlfZmFpbGVkIj48c3ZnIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSwyKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw1KSI+PGNpcmNsZSByPSI0LjUiPjwvY2lyY2xlPjwvZz48L2c+PC9zdmc+IFJlY292ZXJ5IEZhaWxlZDwvbGk+DQotICAgICAgICAgIDxsaSBjbGFzcz0iZ29uZSI+PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUsMikiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsNSkiPjxjaXJjbGUgcj0iNC41Ij48L2NpcmNsZT48L2c+PC9nPjwvc3ZnPiBHb25lPC9saT4NCi0gICAgICAgIDwvdWw+DQotICAgICAgPC9kaXY+DQotICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGNlbnRlcjsiIG5nLXNob3c9InNob3dQYWdpbmciPg0KLSAgICAgICAgPGRpdiBpZD0iY2xvdWRHcmFwaFBhZ2luZyI+DQotICAgICAgICAgPGJ1dHRvbiBuZy1zaG93PSJwcmV2RW5hYmxlZCIgbmctY2xpY2s9InByZXZpb3VzKCkiIGlkPSJjbG91ZEdyYXBoUGFnaW5nUHJldiI+Jmx0OyBQcmV2aW91czwvYnV0dG9uPg0KLSAgICAgICAgIDxzcGFuIG5nLXNob3c9InRvdGFsPT0wIj5ObyBjb2xsZWN0aW9ucyBmb3VuZC48L3NwYW4+DQotICAgICAgICAgPHNwYW4gbmctaGlkZT0idG90YWw9PTAiPkNvbGxlY3Rpb25zIHt7c3RhcnR9fSAtIHt7bGFzdH19IG9mIHt7dG90YWx9fS48L3NwYW4+Jm5ic3A7DQotDQotICAgICAgICAgRmlsdGVyIGJ5OiZuYnNwOzxzZWxlY3QgbmctbW9kZWw9ImZpbHRlclR5cGUiIG5nLWNoYW5nZT0iaW5pdEdyYXBoKCkiIGlkPSJjbG91ZEdyYXBoUGFnaW5nRmlsdGVyVHlwZSI+DQotICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJzdGF0dXMiPlN0YXR1czwvb3B0aW9uPg0KLSAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibmFtZSI+TmFtZTwvb3B0aW9uPg0KLSAgICAgICAgIDwvc2VsZWN0PiZuYnNwO1Q6e3tmaWx0ZXJUeXBlfX0NCi0NCi0gICAgICAgICA8c3BhbiBuZy1zaG93PSJmaWx0ZXJUeXBlPT0nc3RhdHVzJyI+DQotICAgICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPSJwYWdpbmdTdGF0dXNGaWx0ZXIiIGlkPSJjbG91ZEdyYXBoUGFnaW5nU3RhdHVzRmlsdGVyIiBuZy1jaGFuZ2U9InJlc2V0R3JhcGgoKSI+DQotICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+IC0gQW55IC0gPC9vcHRpb24+DQotICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImhlYWx0aHkiPkhlYWx0aHk8L29wdGlvbj4NCi0gICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZGVncmFkZWQiPkRlZ3JhZGVkPC9vcHRpb24+DQotICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImRvd25lZF9zaGFyZCI+RG93bmVkIFNoYXJkPC9vcHRpb24+DQotICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InJlY292ZXJpbmciPlJlcGxpY2EgaW4gUmVjb3Zlcnk8L29wdGlvbj4NCi0gICAgICAgICAgIDwvc2VsZWN0Pg0KLSAgICAgICAgIDwvc3Bhbj4NCi0gICAgICAgICA8c3BhbiBuZy1zaG93PSJmaWx0ZXJUeXBlPT0nbmFtZSciPg0KLSAgICAgICAgICAgPGlucHV0IG5nLW1vZGVsPSJwYWdpbmdGaWx0ZXIiIHR5cGU9InRleHQiIHNpemU9IjEwIiBuYW1lPSJmaWx0ZXIiIG5nLWNoYW5nZT0icmVzZXRHcmFwaCgpIi8+Jm5ic3A7DQotICAgICAgICAgPC9zcGFuPg0KLSAgICAgICAgIFNob3cgPGlucHV0IG5nLW1vZGVsPSJyb3dzIiBuZy1jaGFuZ2U9InJlc2V0R3JhcGgoKSIgdHlwZT0idGV4dCIgc2l6ZT0iMiIgbmFtZT0icm93cyIgLz4gcGVyIHBhZ2UuDQotICAgICAgICAgPGJ1dHRvbiBuZy1zaG93PSJuZXh0RW5hYmxlZCIgbmctY2xpY2s9Im5leHQoKSI+TmV4dCAmZ3Q7PC9idXR0b24+DQotICAgICAgICA8L2Rpdj4NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgPC9kaXY+DQotDQotICA8L2Rpdj4NCi0NCi0gIDxkaXYgaWQ9ImRlYnVnIiBuZy1zaG93PSJzaG93RGVidWciPg0KLSAgICA8dWwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICA8bGkgY2xhc3M9ImNsaXBib2FyZCI+PGEgaHJlZj0iIyIgZGF0YS1jb3BpZWQ9IkNvcGllZCB0byBDbGlwYm9hcmQhIj5Db3B5IHRvIENsaXBib2FyZCAoQlVHR1khKTwvYT48L2xpPg0KLSAgICAgIDxsaSBjbGFzcz0iY2xvc2UiPjxhIG5nLWNsaWNrPSJjbG9zZURlYnVnKCkiPkNsb3NlPC9hPjwvbGk+DQotICAgIDwvdWw+DQotICAgIDxwcmUgY2xhc3M9ImRlYnVnIj48L3ByZT4NCi0gIDwvZGl2Pg0KLQ0KLTwvZGl2Pg0KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRpdiBpZD0iY2xvdWQiIGNsYXNzPSJjbGVhcmZpeCI+CisKKyAgPGRpdiBpZD0iZnJhbWUiPgorCisgICAgPGRpdiBpZD0idHJlZS1jb250ZW50IiBjbGFzcz0iY29udGVudCBjbGVhcmZpeCIgbmctc2hvdz0ic2hvd1RyZWUiPgorICAgIDxqc3RyZWUgY2xhc3M9InRyZWUiIG9uLXNlbGVjdD0ic2hvd1RyZWVMaW5rKHVybCkiIGlkPSJ0cmVlIiBkYXRhPSJ0cmVlIj48L2pzdHJlZT4KKworICAgICAgPGRpdiBpZD0iZmlsZS1jb250ZW50IiBjbGFzcz0iY2xlYXJmaXgiPgorCisgICAgICAgIDxhIGlkPSJ0b2dnbGUiIG5nLWNsaWNrPSJzaG93UHJvcHMgPSAhc2hvd1Byb3BzIiBuZy1zaG93PSJzaG93RGF0YSIgbmctY2xhc3M9InNob3dQcm9wcyA/ICdtaW51cycgOiAncGx1cyciPk1ldGFkYXRhPC9hPgorICAgICAgICA8ZGl2IGlkPSJwcm9wIiBuZy1zaG93PSJ6bm9kZS5wcm9wICYmIHNob3dEYXRhICYmIHNob3dQcm9wcyI+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpIG5nLWNsYXNzPSJ7b2RkOiRvZGR9IiBuZy1yZXBlYXQ9IihrZXksIHByb3ApIGluIHpub2RlLnByb3AiPgorICAgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgICA8ZHQ+e3sga2V5IH19PC9kdD4KKyAgICAgICAgICAgICAgICA8ZGQ+e3sgcHJvcCB9fTwvZGQ+CisgICAgICAgICAgICAgIDwvZGw+CisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxkaXYgaWQ9ImRhdGEiIG5nLXNob3c9InNob3dEYXRhIj4KKyAgICAgICAgICA8ZW0gbmctc2hvdz0iIXpub2RlLmRhdGEiPk5vZGUgInt7em5vZGUucGF0aCB9fSIgaGFzIG5vIHV0ZjggQ29udGVudDwvZW0+CisgICAgICAgICAgPHByZSBuZy1zaG93PSJ6bm9kZS5kYXRhIiBjbGFzcz0ic3ludGF4IGxhbmd1YWdlLXt7bGFuZ319IgorICAgICAgICAgICAgbmctYmluZC1odG1sPSJ6bm9kZS5kYXRhIHwgaGlnaGxpZ2h0OmxhbmcgfCB1bnNhZmUiPgorICAgICAgICAgIDwvcHJlPgorICAgICAgICA8YSBjbGFzcz0iY2xvc2UiIG5nLWNsaWNrPSJoaWRlRGF0YSgpIj48c3Bhbj4mbmJzcDs8L3NwYW4+PC9hPgorICAgICAgICA8L2Rpdj4KKworCisgICAgICA8L2Rpdj4KKworICAgIDwvZGl2PgorCisgICAgPGRpdiBncmFwaCBkYXRhPSJncmFwaERhdGEiIGxlYWYtY291bnQ9ImxlYWZDb3VudCIgaGVscGVyLWRhdGE9ImhlbHBlckRhdGEiIGlzLXJhZGlhbD0iaXNSYWRpYWwiIGlkPSJncmFwaC1jb250ZW50IiBjbGFzcz0iY29udGVudCBjbGVhcmZpeCIgbmctc2hvdz0ic2hvd0dyYXBoIj4KKworICAgICAgPGRpdiBpZD0iY2FudmFzIj48L2Rpdj4KKworICAgICAgPGRpdiBpZD0ibGVnZW5kIj4KKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaSBjbGFzcz0ibGVhZGVyIj48c3ZnIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSwyKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw1KSI+PGNpcmNsZSByPSI0LjUiPjwvY2lyY2xlPjwvZz48L2c+PC9zdmc+IExlYWRlcjwvbGk+CisgICAgICAgICAgPGxpIGNsYXNzPSJhY3RpdmUiPjxzdmcgd2lkdGg9IjE1IiBoZWlnaHQ9IjE1Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1LDIpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDUpIj48Y2lyY2xlIHI9IjQuNSI+PC9jaXJjbGU+PC9nPjwvZz48L3N2Zz4gQWN0aXZlPC9saT4KKyAgICAgICAgICA8bGkgY2xhc3M9InJlY292ZXJpbmciPjxzdmcgd2lkdGg9IjE1IiBoZWlnaHQ9IjE1Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1LDIpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDUpIj48Y2lyY2xlIHI9IjQuNSI+PC9jaXJjbGU+PC9nPjwvZz48L3N2Zz4gUmVjb3ZlcmluZzwvbGk+CisgICAgICAgICAgPGxpIGNsYXNzPSJkb3duIj48c3ZnIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSwyKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw1KSI+PGNpcmNsZSByPSI0LjUiPjwvY2lyY2xlPjwvZz48L2c+PC9zdmc+IERvd248L2xpPgorICAgICAgICAgIDxsaSBjbGFzcz0icmVjb3ZlcnlfZmFpbGVkIj48c3ZnIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSwyKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw1KSI+PGNpcmNsZSByPSI0LjUiPjwvY2lyY2xlPjwvZz48L2c+PC9zdmc+IFJlY292ZXJ5IEZhaWxlZDwvbGk+CisgICAgICAgICAgPGxpIGNsYXNzPSJnb25lIj48c3ZnIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSwyKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw1KSI+PGNpcmNsZSByPSI0LjUiPjwvY2lyY2xlPjwvZz48L2c+PC9zdmc+IEdvbmU8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyIgbmctc2hvdz0ic2hvd1BhZ2luZyI+CisgICAgICAgIDxkaXYgaWQ9ImNsb3VkR3JhcGhQYWdpbmciPgorICAgICAgICAgPGJ1dHRvbiBuZy1zaG93PSJwcmV2RW5hYmxlZCIgbmctY2xpY2s9InByZXZpb3VzKCkiIGlkPSJjbG91ZEdyYXBoUGFnaW5nUHJldiI+Jmx0OyBQcmV2aW91czwvYnV0dG9uPgorICAgICAgICAgPHNwYW4gbmctc2hvdz0idG90YWw9PTAiPk5vIGNvbGxlY3Rpb25zIGZvdW5kLjwvc3Bhbj4KKyAgICAgICAgIDxzcGFuIG5nLWhpZGU9InRvdGFsPT0wIj5Db2xsZWN0aW9ucyB7e3N0YXJ0fX0gLSB7e2xhc3R9fSBvZiB7e3RvdGFsfX0uPC9zcGFuPiZuYnNwOworCisgICAgICAgICBGaWx0ZXIgYnk6Jm5ic3A7PHNlbGVjdCBuZy1tb2RlbD0iZmlsdGVyVHlwZSIgbmctY2hhbmdlPSJpbml0R3JhcGgoKSIgaWQ9ImNsb3VkR3JhcGhQYWdpbmdGaWx0ZXJUeXBlIj4KKyAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ic3RhdHVzIj5TdGF0dXM8L29wdGlvbj4KKyAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibmFtZSI+TmFtZTwvb3B0aW9uPgorICAgICAgICAgPC9zZWxlY3Q+Jm5ic3A7VDp7e2ZpbHRlclR5cGV9fQorCisgICAgICAgICA8c3BhbiBuZy1zaG93PSJmaWx0ZXJUeXBlPT0nc3RhdHVzJyI+CisgICAgICAgICAgIDxzZWxlY3QgbmctbW9kZWw9InBhZ2luZ1N0YXR1c0ZpbHRlciIgaWQ9ImNsb3VkR3JhcGhQYWdpbmdTdGF0dXNGaWx0ZXIiIG5nLWNoYW5nZT0icmVzZXRHcmFwaCgpIj4KKyAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPiAtIEFueSAtIDwvb3B0aW9uPgorICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImhlYWx0aHkiPkhlYWx0aHk8L29wdGlvbj4KKyAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJkZWdyYWRlZCI+RGVncmFkZWQ8L29wdGlvbj4KKyAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJkb3duZWRfc2hhcmQiPkRvd25lZCBTaGFyZDwvb3B0aW9uPgorICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InJlY292ZXJpbmciPlJlcGxpY2EgaW4gUmVjb3Zlcnk8L29wdGlvbj4KKyAgICAgICAgICAgPC9zZWxlY3Q+CisgICAgICAgICA8L3NwYW4+CisgICAgICAgICA8c3BhbiBuZy1zaG93PSJmaWx0ZXJUeXBlPT0nbmFtZSciPgorICAgICAgICAgICA8aW5wdXQgbmctbW9kZWw9InBhZ2luZ0ZpbHRlciIgdHlwZT0idGV4dCIgc2l6ZT0iMTAiIG5hbWU9ImZpbHRlciIgbmctY2hhbmdlPSJyZXNldEdyYXBoKCkiLz4mbmJzcDsKKyAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgIFNob3cgPGlucHV0IG5nLW1vZGVsPSJyb3dzIiBuZy1jaGFuZ2U9InJlc2V0R3JhcGgoKSIgdHlwZT0idGV4dCIgc2l6ZT0iMiIgbmFtZT0icm93cyIgLz4gcGVyIHBhZ2UuCisgICAgICAgICA8YnV0dG9uIG5nLXNob3c9Im5leHRFbmFibGVkIiBuZy1jbGljaz0ibmV4dCgpIj5OZXh0ICZndDs8L2J1dHRvbj4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKworICAgIDwvZGl2PgorCisgIDwvZGl2PgorCisgIDxkaXYgaWQ9ImRlYnVnIiBuZy1zaG93PSJzaG93RGVidWciPgorICAgIDx1bCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgPGxpIGNsYXNzPSJjbGlwYm9hcmQiPjxhIGhyZWY9IiMiIGRhdGEtY29waWVkPSJDb3BpZWQgdG8gQ2xpcGJvYXJkISI+Q29weSB0byBDbGlwYm9hcmQgKEJVR0dZISk8L2E+PC9saT4KKyAgICAgIDxsaSBjbGFzcz0iY2xvc2UiPjxhIG5nLWNsaWNrPSJjbG9zZURlYnVnKCkiPkNsb3NlPC9hPjwvbGk+CisgICAgPC91bD4KKyAgICA8cHJlIGNsYXNzPSJkZWJ1ZyI+PC9wcmU+CisgIDwvZGl2PgorCis8L2Rpdj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9jb2xsZWN0aW9uX292ZXJ2aWV3Lmh0bWwgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvY29sbGVjdGlvbl9vdmVydmlldy5odG1sCmluZGV4IDE2NDExMmQuLmJhMDliZDkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9jb2xsZWN0aW9uX292ZXJ2aWV3Lmh0bWwKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL2NvbGxlY3Rpb25fb3ZlcnZpZXcuaHRtbApAQCAtMSw4NSArMSw4NSBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGRpdiBpZD0iZGFzaGJvYXJkIj4NCi0NCi0gIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4NCi0NCi0gICAgPGRpdiBpZD0iY29sbGVjdGlvbiIgY2xhc3M9ImJsb2NrIGZpZWxkbGlzdCI+DQotDQotICAgICAgPGgyPjxzcGFuPkNvbGxlY3Rpb246IHt7c2VsZWN0ZWRDb2xsZWN0aW9uLm5hbWV9fTwvc3Bhbj48L2gyPg0KLQ0KLSAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPGRsPg0KLQ0KLSAgICAgICAgICA8ZHQ+Q29uZmlnIG5hbWU6PC9kdD4NCi0gICAgICAgICAgICA8ZGQgY2xhc3M9InZhbHVlIj57e3NlbGVjdGVkQ29sbGVjdGlvbi5jb25maWdOYW1lfX08L2RkPg0KLQ0KLSAgICAgICAgICA8ZHQ+TWF4IHNoYXJkcyBwZXIgbm9kZTo8L2R0Pg0KLSAgICAgICAgICAgIDxkZCBjbGFzcz0idmFsdWUiPnt7c2VsZWN0ZWRDb2xsZWN0aW9uLm1heFNoYXJkc1Blck5vZGV9fTwvZGQ+DQotDQotICAgICAgICAgIDxkdD5SZXBsaWNhdGlvbiBmYWN0b3I6PC9kdD4NCi0gICAgICAgICAgICA8ZGQgY2xhc3M9InZhbHVlIj57e3NlbGVjdGVkQ29sbGVjdGlvbi5yZXBsaWNhdGlvbkZhY3Rvcn19PC9kZD4NCi0NCi0gICAgICAgICAgPGR0PkF1dG8tYWRkIHJlcGxpY2FzOjwvZHQ+DQotICAgICAgICAgICAgPGRkIGNsYXNzPSJpY28gdmFsdWUiIG5nLWNsYXNzPSJzZWxlY3RlZENvbGxlY3Rpb24uYXV0b0FkZFJlcGxpY2FzPT0ndHJ1ZScgPyAnaWNvLTEnIDogJ2ljby0wJyI+PHNwYW4+eWVzPC9zcGFuPjwvZGQ+DQotDQotICAgICAgICAgIDxkdD5Sb3V0ZXIgbmFtZTo8L2R0Pg0KLSAgICAgICAgICAgIDxkZCBjbGFzcz0idmFsdWUiPnt7c2VsZWN0ZWRDb2xsZWN0aW9uLnJvdXRlci5uYW1lfX08L2RkPg0KLQ0KLSAgICAgICAgPC9kbD4NCi0NCi0gICAgICA8L2Rpdj4NCi0gICAgPC9kaXY+DQotDQotICAgIDxkaXYgaWQ9InNoYXJkcyIgY2xhc3M9ImJsb2NrIGZpZWxkbGlzdCI+DQotDQotICAgICAgPGgyPjxzcGFuPlNoYXJkczwvc3Bhbj48L2gyPg0KLQ0KLSAgICAgIDxkaXY+DQotDQotICAgICAgICA8ZGl2IGNsYXNzPSJzaGFyZCIgbmctcmVwZWF0PSIobmFtZSwgc2hhcmQpIGluIHNlbGVjdGVkQ29sbGVjdGlvbi5zaGFyZHMiPg0KLSAgICAgICAgICA8YSBuZy1jbGljaz0iaGlkZVNoYXJkKHNoYXJkKSI+PGgzIGNsYXNzPSJzaGFyZC10aXRsZSI+e3tuYW1lfX08L2gzPjwvYT4NCi0gICAgICAgICAgPGRsIGNsYXNzPSJzaGFyZC1kZXRhaWwgY2xlYXJmaXgiIG5nLWhpZGU9InNoYXJkLmhpZGUiPg0KLSAgICAgICAgICAgIDxkdD5SYW5nZTo8L2R0Pg0KLSAgICAgICAgICAgIDxkZCBjbGFzcz0idmFsdWUiPnt7IHNoYXJkLnJhbmdlIH19PC9kZD4NCi0NCi0gICAgICAgICAgICA8ZHQ+QWN0aXZlOjwvZHQ+DQotICAgICAgICAgICAgPGRkIGNsYXNzPSJpY28gdmFsdWUiIG5nLWNsYXNzPSJzaGFyZC5zdGF0ZT0nYWN0aXZlJyA/ICdpY28tMScgOiAnaWNvLTAnIj48c3Bhbj55ZXM8L3NwYW4+PC9kZD4NCi0NCi0gICAgICAgICAgICA8ZHQ+UmVwbGljYXM6PC9kdD4NCi0gICAgICAgICAgICA8ZGQ+DQotICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXBsaWNhIGNsZWFyZml4IHt7JG9kZD8nb2RkJzonJ319IiBuZy1yZXBlYXQ9IihuYW1lLCByZXBsaWNhKSBpbiBzaGFyZC5yZXBsaWNhcyI+DQotICAgICAgICAgICAgICAgIDxhIG5nLWNsaWNrPSJzaG93UmVwbGljYShyZXBsaWNhKSI+PGgzPnt7cmVwbGljYS5jb3JlfX08L2gzPjwvYT4NCi0gICAgICAgICAgICAgICAgPGRsIG5nLXNob3c9InJlcGxpY2Euc2hvdyI+DQotICAgICAgICAgICAgICAgICAgPGR0PkJhc2UgVVJMOiA8L2R0PjxkZD57e3JlcGxpY2EuYmFzZV91cmx9fTwvZGQ+DQotICAgICAgICAgICAgICAgICAgPGR0PkNvcmU6IDwvZHQ+PGRkPjxhIGhyZWY9Int7cmVwbGljYS5iYXNlX3VybH19e3tyb290VXJsfX0jL3t7cmVwbGljYS5jb3JlfX0iPnt7cmVwbGljYS5jb3JlfX08L2E+PC9kZD4NCi0gICAgICAgICAgICAgICAgICA8ZHQ+QWN0aXZlOiA8L2R0Pg0KLSAgICAgICAgICAgICAgICAgICAgPGRkIGNsYXNzPSJpY28gdmFsdWUiIG5nLWNsYXNzPSJyZXBsaWNhLnN0YXRlID09ICdhY3RpdmUnID8gJ2ljby0xJyA6ICdpY28tMCciPjxzcGFuPnllczwvc3Bhbj48L2RkPg0KLSAgICAgICAgICAgICAgICAgIDxkdD5MZWFkZXI6IDwvZHQ+DQotICAgICAgICAgICAgICAgICAgICA8ZGQgY2xhc3M9ImljbyB2YWx1ZSIgbmctY2xhc3M9InJlcGxpY2EubGVhZGVyID09ICd0cnVlJyA/ICdpY28tMScgOiAnaWNvLTAnIj48c3Bhbj55ZXM8L3NwYW4+PC9kZD4NCi0gICAgICAgICAgICAgICAgPC9kbD4NCi0gICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvZGQ+DQotICAgICAgICAgIDwvZGw+DQotICAgICAgPC9kaXY+DQotICAgIDwvZGl2Pg0KLQ0KLSAgPC9kaXY+DQotDQotPC9kaXY+DQorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZGl2IGlkPSJkYXNoYm9hcmQiPgorCisgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4KKworICAgIDxkaXYgaWQ9ImNvbGxlY3Rpb24iIGNsYXNzPSJibG9jayBmaWVsZGxpc3QiPgorCisgICAgICA8aDI+PHNwYW4+Q29sbGVjdGlvbjoge3tzZWxlY3RlZENvbGxlY3Rpb24ubmFtZX19PC9zcGFuPjwvaDI+CisKKyAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorCisgICAgICAgIDxkbD4KKworICAgICAgICAgIDxkdD5Db25maWcgbmFtZTo8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJ2YWx1ZSI+e3tzZWxlY3RlZENvbGxlY3Rpb24uY29uZmlnTmFtZX19PC9kZD4KKworICAgICAgICAgIDxkdD5NYXggc2hhcmRzIHBlciBub2RlOjwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9InZhbHVlIj57e3NlbGVjdGVkQ29sbGVjdGlvbi5tYXhTaGFyZHNQZXJOb2RlfX08L2RkPgorCisgICAgICAgICAgPGR0PlJlcGxpY2F0aW9uIGZhY3Rvcjo8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJ2YWx1ZSI+e3tzZWxlY3RlZENvbGxlY3Rpb24ucmVwbGljYXRpb25GYWN0b3J9fTwvZGQ+CisKKyAgICAgICAgICA8ZHQ+QXV0by1hZGQgcmVwbGljYXM6PC9kdD4KKyAgICAgICAgICAgIDxkZCBjbGFzcz0iaWNvIHZhbHVlIiBuZy1jbGFzcz0ic2VsZWN0ZWRDb2xsZWN0aW9uLmF1dG9BZGRSZXBsaWNhcz09J3RydWUnID8gJ2ljby0xJyA6ICdpY28tMCciPjxzcGFuPnllczwvc3Bhbj48L2RkPgorCisgICAgICAgICAgPGR0PlJvdXRlciBuYW1lOjwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9InZhbHVlIj57e3NlbGVjdGVkQ29sbGVjdGlvbi5yb3V0ZXIubmFtZX19PC9kZD4KKworICAgICAgICA8L2RsPgorCisgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICAgIDxkaXYgaWQ9InNoYXJkcyIgY2xhc3M9ImJsb2NrIGZpZWxkbGlzdCI+CisKKyAgICAgIDxoMj48c3Bhbj5TaGFyZHM8L3NwYW4+PC9oMj4KKworICAgICAgPGRpdj4KKworICAgICAgICA8ZGl2IGNsYXNzPSJzaGFyZCIgbmctcmVwZWF0PSIobmFtZSwgc2hhcmQpIGluIHNlbGVjdGVkQ29sbGVjdGlvbi5zaGFyZHMiPgorICAgICAgICAgIDxhIG5nLWNsaWNrPSJoaWRlU2hhcmQoc2hhcmQpIj48aDMgY2xhc3M9InNoYXJkLXRpdGxlIj57e25hbWV9fTwvaDM+PC9hPgorICAgICAgICAgIDxkbCBjbGFzcz0ic2hhcmQtZGV0YWlsIGNsZWFyZml4IiBuZy1oaWRlPSJzaGFyZC5oaWRlIj4KKyAgICAgICAgICAgIDxkdD5SYW5nZTo8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJ2YWx1ZSI+e3sgc2hhcmQucmFuZ2UgfX08L2RkPgorCisgICAgICAgICAgICA8ZHQ+QWN0aXZlOjwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9ImljbyB2YWx1ZSIgbmctY2xhc3M9InNoYXJkLnN0YXRlPSdhY3RpdmUnID8gJ2ljby0xJyA6ICdpY28tMCciPjxzcGFuPnllczwvc3Bhbj48L2RkPgorCisgICAgICAgICAgICA8ZHQ+UmVwbGljYXM6PC9kdD4KKyAgICAgICAgICAgIDxkZD4KKyAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVwbGljYSBjbGVhcmZpeCB7eyRvZGQ/J29kZCc6Jyd9fSIgbmctcmVwZWF0PSIobmFtZSwgcmVwbGljYSkgaW4gc2hhcmQucmVwbGljYXMiPgorICAgICAgICAgICAgICAgIDxhIG5nLWNsaWNrPSJzaG93UmVwbGljYShyZXBsaWNhKSI+PGgzPnt7cmVwbGljYS5jb3JlfX08L2gzPjwvYT4KKyAgICAgICAgICAgICAgICA8ZGwgbmctc2hvdz0icmVwbGljYS5zaG93Ij4KKyAgICAgICAgICAgICAgICAgIDxkdD5CYXNlIFVSTDogPC9kdD48ZGQ+e3tyZXBsaWNhLmJhc2VfdXJsfX08L2RkPgorICAgICAgICAgICAgICAgICAgPGR0PkNvcmU6IDwvZHQ+PGRkPjxhIGhyZWY9Int7cmVwbGljYS5iYXNlX3VybH19e3tyb290VXJsfX0jL3t7cmVwbGljYS5jb3JlfX0iPnt7cmVwbGljYS5jb3JlfX08L2E+PC9kZD4KKyAgICAgICAgICAgICAgICAgIDxkdD5BY3RpdmU6IDwvZHQ+CisgICAgICAgICAgICAgICAgICAgIDxkZCBjbGFzcz0iaWNvIHZhbHVlIiBuZy1jbGFzcz0icmVwbGljYS5zdGF0ZSA9PSAnYWN0aXZlJyA/ICdpY28tMScgOiAnaWNvLTAnIj48c3Bhbj55ZXM8L3NwYW4+PC9kZD4KKyAgICAgICAgICAgICAgICAgIDxkdD5MZWFkZXI6IDwvZHQ+CisgICAgICAgICAgICAgICAgICAgIDxkZCBjbGFzcz0iaWNvIHZhbHVlIiBuZy1jbGFzcz0icmVwbGljYS5sZWFkZXIgPT0gJ3RydWUnID8gJ2ljby0xJyA6ICdpY28tMCciPjxzcGFuPnllczwvc3Bhbj48L2RkPgorICAgICAgICAgICAgICAgIDwvZGw+CisgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8L2RkPgorICAgICAgICAgIDwvZGw+CisgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICA8L2Rpdj4KKworPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvY29sbGVjdGlvbnMuaHRtbCBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9jb2xsZWN0aW9ucy5odG1sCmluZGV4IGMxNTgwOGUuLjk3OTdiOTAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9jb2xsZWN0aW9ucy5odG1sCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9jb2xsZWN0aW9ucy5odG1sCkBAIC0xLDM0MyArMSwzNDMgQEAKLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxkaXYgaWQ9ImNvbGxlY3Rpb25zIiBjbGFzcz0iY2xlYXJmaXggZW1wdHkiPg0KLQ0KLSAgPGRpdiBpZD0idWktYmxvY2siIHN0eWxlPSJkaXNwbGF5Om5vbmUiPiZuYnNwOzwvZGl2PjwhLS0gQHRvZG8gd2hhdCBpcyB0aGlzIGZvcj8gLS0+DQotDQotICA8ZGl2IGlkPSJmcmFtZSI+DQotDQotICAgIDxkaXYgaWQ9ImFjdGlvbnMiIGNsYXNzPSJhY3Rpb25zIGNsZWFyZml4Ij4NCi0NCi0gICAgICA8YnV0dG9uIGlkPSJhZGQiIGNsYXNzPSJhY3Rpb24iIG5nLWNsaWNrPSJzaG93QWRkQ29sbGVjdGlvbigpIj48c3Bhbj5BZGQgQ29sbGVjdGlvbjwvc3Bhbj48L2J1dHRvbj4NCi0NCi0gICAgICA8YnV0dG9uIGlkPSJkZWxldGUiIGNsYXNzPSJ3YXJuIHJlcXVpcmVzLWNvcmUiIG5nLWNsaWNrPSJzaG93RGVsZXRlQ29sbGVjdGlvbigpIiBuZy1zaG93PSJjb2xsZWN0aW9uIj48c3Bhbj5EZWxldGU8L3NwYW4+PC9idXR0b24+DQotICAgICAgPGJ1dHRvbiBpZD0icmVsb2FkIiBjbGFzcz0icmVxdWlyZXMtY29yZSIgbmctY2xpY2s9InJlbG9hZENvbGxlY3Rpb24oKSIgbmctc2hvdz0iY29sbGVjdGlvbiINCi0gICAgICAgICBuZy1jbGFzcz0ie3N1Y2Nlc3M6IHJlbG9hZFN1Y2Nlc3MsIHdhcm46IHJlbG9hZEZhaWx1cmV9Ij48c3Bhbj5SZWxvYWQ8L3NwYW4+PC9idXR0b24+DQotICAgICAgPGJ1dHRvbiBpZD0iY3JlYXRlLWFsaWFzIiBjbGFzcz0iYWN0aW9uIHJlcXVpcmVzLWNvcmUiIG5nLWNsaWNrPSJ0b2dnbGVDcmVhdGVBbGlhcygpIj48c3Bhbj5DcmVhdGUgQWxpYXM8L3NwYW4+PC9idXR0b24+DQotICAgICAgPGJ1dHRvbiBpZD0iZGVsZXRlLWFsaWFzIiBjbGFzcz0iYWN0aW9uIHJlcXVpcmVzLWNvcmUiIG5nLWNsaWNrPSJ0b2dnbGVEZWxldGVBbGlhcygpIj48c3Bhbj5EZWxldGUgQWxpYXM8L3NwYW4+PC9idXR0b24+DQotDQotICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uIGFkZCIgZGF0YS1yZWw9ImFkZCIgbmctc2hvdz0ic2hvd0FkZCIgc3R5bGU9ImxlZnQ6MHB4Ij4NCi0NCi0gICAgICAgIDxmb3JtPg0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9uYW1lIj5uYW1lOjwvbGFiZWw+DQotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJuYW1lIiBpZD0iYWRkX25hbWUiIG5nLW1vZGVsPSJuZXdDb2xsZWN0aW9uLm5hbWUiIHBsYWNlaG9sZGVyPSJuZXcgY29sbGVjdGlvbiI+PC9wPg0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9jb25maWciPmNvbmZpZyBzZXQ6PC9sYWJlbD4mbmJzcDsNCi0gICAgICAgICAgPHNlbGVjdCBjaG9zZW4gbmctb3B0aW9ucz0iY29uZmlnLm5hbWUgYXMgY29uZmlnLm5hbWUgZm9yIGNvbmZpZyBpbiBjb25maWdzIiBuYW1lPSJjb25maWdfbmFtZSIgaWQ9ImFkZF9jb25maWciIG5nLW1vZGVsPSJuZXdDb2xsZWN0aW9uLmNvbmZpZ05hbWUiPg0KLSAgICAgICAgICA8L3NlbGVjdD4NCi0gICAgICAgICAgPC9wPg0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9udW1TaGFyZHMiPm51bVNoYXJkczo8L2xhYmVsPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibnVtU2hhcmRzIiBpZD0iYWRkX251bVNoYXJkcyIgbmctbW9kZWw9Im5ld0NvbGxlY3Rpb24ubnVtU2hhcmRzIj48L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWRkX3JlcGxpY2F0aW9uRmFjdG9yIj5yZXBsaWNhdGlvbkZhY3Rvcjo8L2xhYmVsPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icmVwbGljYXRpb25GYWN0b3IiIGlkPSJhZGRfcmVwbGljYXRpb25GYWN0b3IiIG5nLW1vZGVsPSJuZXdDb2xsZWN0aW9uLnJlcGxpY2F0aW9uRmFjdG9yIj48L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGEgbmctY2xpY2s9InNob3dBZHZhbmNlZD0hc2hvd0FkdmFuY2VkIj4NCi0gICAgICAgICAgICAgIDxzcGFuIGlkPSJhZGRfYWR2YW5jZWQiIG5nLWNsYXNzPSJ7b3Blbjogc2hvd0FkdmFuY2VkfSI+U2hvdyBhZHZhbmNlZDwvc3Bhbj48L2E+PC9wPg0KLSAgICAgICAgICA8ZGl2IG5nLXNob3c9InNob3dBZHZhbmNlZCI+DQotDQotICAgICAgICAgICAgICA8cD5BZHZhbmNlZCBvcHRpb25zOiA8L3A+DQotICAgICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9yb3V0ZXJfbmFtZSI+cm91dGVyOjwvbGFiZWw+DQotICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9InJvdXRlck5hbWUiIGlkPSJhZGRfcm91dGVyX25hbWUiIG5nLW1vZGVsPSJuZXdDb2xsZWN0aW9uLnJvdXRlck5hbWUiPg0KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJjb21wb3NpdGVJZCI+Q29tcG9zaXRlIElEPC9vcHRpb24+DQotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImltcGxpY2l0Ij5JbXBsaWNpdDwvb3B0aW9uPg0KLSAgICAgICAgICAgICAgPC9zZWxlY3Q+DQotICAgICAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9tYXhTaGFyZHNQZXJOb2RlIj5tYXhTaGFyZHNQZXJOb2RlOjwvbGFiZWw+DQotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icmVwbGljYXRpb25GYWN0b3IiIGlkPSJhZGRfbWF4U2hhcmRzUGVyTm9kZSIgbmctbW9kZWw9Im5ld0NvbGxlY3Rpb24ubWF4U2hhcmRzUGVyTm9kZSI+PC9wPg0KLQ0KLSAgICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJhZGRfc2hhcmRzIj5zaGFyZHM6PC9sYWJlbD4NCi0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzaGFyZHMiIGlkPSJhZGRfc2hhcmRzIiBuZy1tb2RlbD0ibmV3Q29sbGVjdGlvbi5zaGFyZHMiPjwvcD4NCi0NCi0gICAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWRkX3JvdXRlckZpZWxkIj5yb3V0ZXJGaWVsZDo8L2xhYmVsPg0KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InJvdXRlckZpZWxkIiBpZD0iYWRkX3JvdXRlckZpZWxkIiBuZy1tb2RlbD0ibmV3Q29sbGVjdGlvbi5yb3V0ZXJGaWVsZCI+PC9wPg0KLQ0KLSAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiIG5nLXNob3c9ImFkZE1lc3NhZ2UiPg0KLSAgICAgICAgICAgIDxzcGFuPnt7YWRkTWVzc2FnZX19PC9zcGFuPg0KLSAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBidXR0b25zIj4NCi0gICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgbmctY2xpY2s9ImFkZENvbGxlY3Rpb24oKSI+PHNwYW4+QWRkIENvbGxlY3Rpb248L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJyZXNldCIgY2xhc3M9InJlc2V0IiBuZy1jbGljaz0iY2FuY2VsQWRkQ29sbGVjdGlvbigpIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgIDwvcD4NCi0NCi0gICAgICAgIDwvZm9ybT4NCi0NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24gZGVsZXRlIiBuZy1zaG93PSJzaG93RGVsZXRlIj4NCi0NCi0gICAgICAgIDxmb3JtPg0KLQ0KLSAgICAgICAgICA8cD5QbGVhc2UgdHlwZSBjb2xsZWN0aW9uIG5hbWUgdG8gY29uZmlybSBkZWxldGlvbjo8L3A+DQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iY29sbGVjdGlvbmRlbGV0ZUNvbmZpcm0iPkNvbGxlY3Rpb248L2xhYmVsPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImNvbGxlY3Rpb25EZWxldGVDb25maXJtIiBpZD0iY29sbGVjdGlvbkRlbGV0ZUNvbmZpcm0iPjwvcD4NCi0NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiIG5nLXNob3c9ImRlbGV0ZU1lc3NhZ2UiPg0KLSAgICAgICAgICAgIDxzcGFuPnt7ZGVsZXRlTWVzc2FnZX19PC9zcGFuPg0KLSAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBidXR0b25zIj4NCi0gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJzdWJtaXQiIG5nLWNsaWNrPSJkZWxldGVDb2xsZWN0aW9uKCkiPjxzcGFuPkRlbGV0ZTwvc3Bhbj48L2J1dHRvbj4NCi0gICAgICAgICAgICA8YnV0dG9uIHR5cGU9InJlc2V0IiBjbGFzcz0icmVzZXQiIG5nLWNsaWNrPSJzaG93RGVsZXRlPWZhbHNlIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgIDwvcD4NCi0gICAgICAgIDwvZm9ybT4NCi0NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24gY3JlYXRlLWFsaWFzIiBuZy1zaG93PSJzaG93Q3JlYXRlQWxpYXMiPg0KLQ0KLSAgICAgICAgPGZvcm0+DQotDQotICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNvcmUiIGRhdGEtY29yZT0iY3VycmVudCI+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWxpYXMiPkFsaWFzIE5hbWU6PC9sYWJlbD4NCi0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImFsaWFzIiBuZy1tb2RlbD0iYWxpYXNUb0NyZWF0ZSIgaWQ9ImFsaWFzIj48L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWxpYXNDb2xsZWN0aW9ucyI+Q29sbGVjdGlvbnM6PC9sYWJlbD4NCi0gICAgICAgICAgPHNlbGVjdCBtdWx0aXBsZSBpZD0iYWxpYXNDb2xsZWN0aW9ucyIgbmctbW9kZWw9ImFsaWFzQ29sbGVjdGlvbnMiIG5nLW9wdGlvbnM9ImNvbGxlY3Rpb24ubmFtZSBmb3IgY29sbGVjdGlvbiBpbiBjb2xsZWN0aW9ucyIgY2xhc3M9Im90aGVyIj4NCi0gICAgICAgICAgPC9zZWxlY3Q+PC9wPg0KLQ0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXggbm90ZSBlcnJvciIgbmctc2hvdz0icmVuYW1lTWVzc2FnZSI+DQotICAgICAgICAgICAgPHNwYW4+e3tyZW5hbWVNZXNzYWdlfX08L3NwYW4+DQotICAgICAgICAgIDwvcD4NCi0NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IGJ1dHRvbnMiPg0KLSAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InN1Ym1pdCIgbmctY2xpY2s9ImNyZWF0ZUFsaWFzKCkiPjxzcGFuPkNyZWF0ZSBBbGlhczwvc3Bhbj48L2J1dHRvbj4NCi0gICAgICAgICAgICA8YnV0dG9uIHR5cGU9InJlc2V0IiBjbGFzcz0icmVzZXQiIG5nLWNsaWNrPSJjYW5jZWxDcmVhdGVBbGlhcygpIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgIDwvcD4NCi0gICAgICAgIDwvZm9ybT4NCi0NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24gZGVsZXRlLWFsaWFzIiBuZy1zaG93PSJzaG93RGVsZXRlQWxpYXMiPg0KLQ0KLSAgICAgICAgPGZvcm0+DQotICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImFsaWFzZXMiPg0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImRlbGV0ZUFsaWFzIj5BbGlhczo8L2xhYmVsPg0KLSAgICAgICAgICA8c2VsZWN0IGlkPSJkZWxldGVBbGlhcyIgbmctbW9kZWw9ImFsaWFzVG9EZWxldGUiIG5nLW9wdGlvbnM9ImFsaWFzIGFzIGFsaWFzIGZvciAoYWxpYXMsIGNvbGxlY3Rpb25zKSBpbiBhbGlhc2VzIiBjbGFzcz0ib3RoZXIiPg0KLSAgICAgICAgICA8L3NlbGVjdD48L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBub3RlIGVycm9yIiBuZy1zaG93PSJzd2FwTWVzc2FnZSI+DQotICAgICAgICAgICAgPHNwYW4+e3tzd2FwTWVzc2FnZX19PC9zcGFuPg0KLSAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBidXR0b25zIj4NCi0gICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgbmctY2xpY2s9ImRlbGV0ZUFsaWFzKCkiPjxzcGFuPkRlbGV0ZSBBbGlhczwvc3Bhbj48L2J1dHRvbj4NCi0gICAgICAgICAgICA8YnV0dG9uIHR5cGU9InJlc2V0IiBjbGFzcz0icmVzZXQiIG5nLWNsaWNrPSJjYW5jZWxEZWxldGVBbGlhcygpIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgIDwvcD4NCi0gICAgICAgICAgPC9zcGFuPg0KLSAgICAgICAgICA8c3BhbiBuZy1oaWRlPSJhbGlhc2VzIj4NCi0gICAgICAgICAgICAgIDxwPk5vIGFsaWFzZXMgdG8gZGVsZXRlLjwvcD4NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IGJ1dHRvbnMiPg0KLSAgICAgICAgICAgIDxidXR0b24gdHlwZT0icmVzZXQiIGNsYXNzPSJyZXNldCIgbmctY2xpY2s9ImNhbmNlbERlbGV0ZUFsaWFzKCkiPjxzcGFuPkNhbmNlbDwvc3Bhbj48L2J1dHRvbj4NCi0gICAgICAgICAgPC9wPg0KLSAgICAgICAgICA8L3NwYW4+DQotDQotICAgICAgICA8L2Zvcm0+DQotDQotICAgICAgPC9kaXY+DQotDQotICAgIDwvZGl2Pg0KLQ0KLQ0KLSAgICA8ZGl2IGNsYXNzPSJyZXF1aXJlcy1jb3JlIiBuZy1oaWRlPSJjb2xsZWN0aW9uIj4NCi0gICAgICA8aDI+UGxlYXNlIHNlbGVjdCBhIGNvbGxlY3Rpb248L2gyPg0KLSAgICA8L2Rpdj4NCi0NCi0gICAgPGRpdiBpZD0iZGF0YSIgY2xhc3M9InJlcXVpcmVzLWNvcmUgY2xlYXJmaXgiIG5nLXNob3c9ImNvbGxlY3Rpb24iPg0KLQ0KLSAgICAgIDxkaXYgY2xhc3M9ImJsb2NrIiBpZD0iY29sbGVjdGlvbi1kYXRhIj4NCi0NCi0gICAgICAgICAgPGgyPkNvbGxlY3Rpb246IHt7Y29sbGVjdGlvbi5uYW1lfX08L2gyPg0KLQ0KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRhaW5lciI+DQotICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj48L2Rpdj4NCi0gICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgICA8dWw+DQotDQotICAgICAgICAgICAgPGxpPg0KLSAgICAgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5TaGFyZCBjb3VudDo8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgICAgIDxkZD57e2NvbGxlY3Rpb24uc2hhcmRzLmxlbmd0aH19PC9kZD4NCi0gICAgICAgICAgICAgICAgPC9kbD4NCi0gICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgIDxsaT48ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgIDxkdD48c3Bhbj5jb25maWdOYW1lOjwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICA8ZGQ+e3tjb2xsZWN0aW9uLmNvbmZpZ05hbWV9fTwvZGQ+DQotICAgICAgICAgICAgPC9kbD48L2xpPg0KLQ0KLSAgICAgICAgICAgIDxsaT48ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgIDxkdD48c3Bhbj5yZXBsaWNhdGlvbkZhY3Rvcjo8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgPGRkPnt7Y29sbGVjdGlvbi5yZXBsaWNhdGlvbkZhY3Rvcn19PC9kZD4NCi0gICAgICAgICAgICA8L2RsPjwvbGk+DQotDQotICAgICAgICAgICAgPGxpPjxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgPGR0PjxzcGFuPm1heFNoYXJkc1Blck5vZGU6PC9zcGFuPjwvZHQ+DQotICAgICAgICAgICAgICAgIDxkZD57e2NvbGxlY3Rpb24ubWF4U2hhcmRzUGVyTm9kZX19PC9kZD4NCi0gICAgICAgICAgICA8L2RsPjwvbGk+DQotDQotICAgICAgICAgICAgPGxpPjxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgPGR0PjxzcGFuPnJvdXRlcjo8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgPGRkPnt7Y29sbGVjdGlvbi5yb3V0ZXIubmFtZX19PC9kZD4NCi0gICAgICAgICAgICA8L2RsPjwvbGk+DQotDQotICAgICAgICAgICAgPGxpPjxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgPGR0PjxzcGFuPmF1dG9BZGRSZXBsaWNhczo8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgPGRkPnt7Y29sbGVjdGlvbi5hdXRvQWRkUmVwbGljYXN9fTwvZGQ+DQotICAgICAgICAgICAgPC9kbD48L2xpPg0KLSAgICAgICAgICA8L3VsPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgICAgPC9kaXY+DQotDQotICAgICAgPGRpdiBjbGFzcz0iYmxvY2siIGlkPSJzaGFyZC1kYXRhIj4NCi0gICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQgc2hhcmQiIG5nLXJlcGVhdD0ic2hhcmQgaW4gY29sbGVjdGlvbi5zaGFyZHMiPg0KLSAgICAgICAgICA8YSBuZy1jbGljaz0idG9nZ2xlU2hhcmQoc2hhcmQpIj48aDI+PHNwYW4gbmctY2xhc3M9IntvcGVuOnNoYXJkLnNob3d9Ij5TaGFyZDoge3tzaGFyZC5uYW1lfX08L3NwYW4+PC9oMj48L2E+DQotICAgICAgICAgIDx1bCBuZy1zaG93PSJzaGFyZC5zaG93Ij4NCi0gICAgICAgICAgICAgIDxsaT4NCi0gICAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICAgICAgIDxsaT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+c3RhdGU6PC9zcGFuPjwvZHQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD57e3NoYXJkLnN0YXRlfX08L2RkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kbD4NCi0gICAgICAgICAgICAgICAgICAgICAgPC9saT4NCi0gICAgICAgICAgICAgICAgICAgICAgPGxpPg0KLSAgICAgICAgICAgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+cmFuZ2U6PC9zcGFuPjwvZHQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRkPnt7c2hhcmQucmFuZ2V9fTwvZGQ+DQotICAgICAgICAgICAgICAgICAgICAgIDwvZGw+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPg0KLSAgICAgICAgICAgICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICA8bGk+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJyZXBsaWNhIiBuZy1yZXBlYXQ9InJlcGxpY2EgaW4gc2hhcmQucmVwbGljYXMiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmctY2xpY2s9InRvZ2dsZVJlcGxpY2EocmVwbGljYSkiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im9wZW5SZXBsaWNhIiBuZy1jbGFzcz0ie29wZW46cmVwbGljYS5zaG93fSI+UmVwbGljYToge3tyZXBsaWNhLm5hbWV9fTwvc3Bhbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZmxvYXQ6cmlnaHQiPjxhIG5nLWNsaWNrPSJ0b2dnbGVSZW1vdmVSZXBsaWNhKHJlcGxpY2EpIj48c3BhbiBjbGFzcz0icmVtIj48L3NwYW4+PC9hPjwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgbmctc2hvdz0icmVwbGljYS5zaG93UmVtb3ZlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz0iZGVsZXRlLXJlcGxpY2EiPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48ZW0+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHJlcGxpY2E/PC9lbT48L3A+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXggYnV0dG9ucyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InN1Ym1pdCIgbmctY2xhc3M9IntzdWNjZXNzOiByZXBsaWNhLmRlbGV0ZWR9IiBuZy1jbGljaz0iZGVsZXRlUmVwbGljYShyZXBsaWNhKSI+PHNwYW4+RGVsZXRlIFJlcGxpY2E8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0icmVzZXQiIGNsYXNzPSJyZXNldCIgbmctY2xpY2s9InRvZ2dsZVJlbW92ZVJlcGxpY2EocmVwbGljYSkiPjxzcGFuPkNhbmNlbDwvc3Bhbj48L2J1dHRvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgbmctc2hvdz0icmVwbGljYS5zaG93Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0PjxzcGFuPmNvcmU6PC9zcGFuPjwvZHQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD57e3JlcGxpY2EuY29yZX19PC9kZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0PjxzcGFuPmJhc2UgVVJMOjwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGQ+PGEgbmctaHJlZj0ie3tyZXBsaWNhLmJhc2VfdXJsfX17e3Jvb3RVcmx9fSI+e3tyZXBsaWNhLmJhc2VfdXJsfX08L2E+PC9kZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0PjxzcGFuPm5vZGUgbmFtZTo8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkPnt7cmVwbGljYS5ub2RlX25hbWV9fTwvZGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5zdGF0ZTo8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkPnt7cmVwbGljYS5zdGF0ZX19PC9kZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0PjxzcGFuPmxlYWRlcjo8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkIGNsYXNzPSJpY28iIG5nLWNsYXNzPSJyZXBsaWNhLmxlYWRlciA/J2ljby0xJyA6ICdpY28tMCciPjxzcGFuPjwvc3Bhbj48L2RkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGw+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICA8bGkgbmctaGlkZT0ic2hhcmQuc2hvd0FkZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYWN0aW9ucyByZXBsaWNhIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uIiBpZD0iYWRkLXJlcGxpY2EiIG5nLWNsaWNrPSJ0b2dnbGVBZGRSZXBsaWNhKHNoYXJkKSI+PHNwYW4+YWRkIHJlcGxpY2E8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+DQotICAgICAgICAgICAgICAgICAgICAgIDwvbGk+DQotICAgICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24gYWRkLXJlcGxpY2EiIG5nLXNob3c9InNoYXJkLnNob3dBZGQiPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPGZvcm0+DQotDQotICAgICAgICAgICAgICAgICAgICAgIDxwIGlkPSJub2RlLW5hbWUiIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0ibm9kZS1uYW1lIj5Ob2RlOjwvbGFiZWw+DQotICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2hvc2VuIG5nLW1vZGVsPSJzaGFyZC5yZXBsaWNhTm9kZU5hbWUiIG5nLW9wdGlvbnM9Im5vZGUgZm9yIG5vZGUgaW4gbm9kZXMiIGNsYXNzPSJvdGhlciI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPk5vIHNwZWNpZmllZCBub2RlPC9vcHRpb24+DQotICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZToge3tzaGFyZC5yZXBsaWNhTm9kZU5hbWV9fQ0KLSAgICAgICAgICAgICAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBub3RlIGVycm9yIiBuZy1zaG93PSJjcmVhdGVSZXBsaWNhTWVzc2FnZSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tjcmVhdGVSZXBsaWNhTWVzc2FnZX19PC9zcGFuPg0KLSAgICAgICAgICAgICAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBidXR0b25zIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJzdWJtaXQgZGVsZXRlIiBuZy1jbGFzcz0ie3N1Y2Nlc3M6IHNoYXJkLnJlcGxpY2FBZGRlZH0iIG5nLWNsaWNrPSJhZGRSZXBsaWNhKHNoYXJkKSI+PHNwYW4+Q3JlYXRlIFJlcGxpY2E8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJyZXNldCIgY2xhc3M9InJlc2V0IiBuZy1jbGljaz0idG9nZ2xlQWRkUmVwbGljYShzaGFyZCkiPjxzcGFuPkNhbmNlbDwvc3Bhbj48L2J1dHRvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgPC9wPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXM9ImNsZWFyZml4Ij4mbmJzcDs8L3A+DQotICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+DQotDQotICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICA8L3VsPg0KLSAgICAgICAgPC9kaXY+DQotICAgICAgPC9kaXY+DQotDQotICAgIDwvZGl2Pg0KLQ0KLSAgPC9kaXY+DQotDQotICA8ZGl2IGlkPSJuYXZpZ2F0aW9uIiBjbGFzcz0icmVxdWlyZXMtY29yZSBjbGVhcmZpeCI+DQotICAgIDx1bD4NCi0gICAgICA8bGkgbmctcmVwZWF0PSJjIGluIGNvbGxlY3Rpb25zIiBuZy1jbGFzcz0ie2N1cnJlbnQ6IGNvbGxlY3Rpb24ubmFtZSA9PSBjLm5hbWV9Ij48YSBocmVmPSIjfmNvbGxlY3Rpb25zL3t7Yy5uYW1lfX0iPnt7Yy5uYW1lfX08L2E+PC9saT4NCi0gICAgPC91bD4NCi0gIDwvZGl2Pg0KLQ0KLTwvZGl2Pg0KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRpdiBpZD0iY29sbGVjdGlvbnMiIGNsYXNzPSJjbGVhcmZpeCBlbXB0eSI+CisKKyAgPGRpdiBpZD0idWktYmxvY2siIHN0eWxlPSJkaXNwbGF5Om5vbmUiPiZuYnNwOzwvZGl2PjwhLS0gQHRvZG8gd2hhdCBpcyB0aGlzIGZvcj8gLS0+CisKKyAgPGRpdiBpZD0iZnJhbWUiPgorCisgICAgPGRpdiBpZD0iYWN0aW9ucyIgY2xhc3M9ImFjdGlvbnMgY2xlYXJmaXgiPgorCisgICAgICA8YnV0dG9uIGlkPSJhZGQiIGNsYXNzPSJhY3Rpb24iIG5nLWNsaWNrPSJzaG93QWRkQ29sbGVjdGlvbigpIj48c3Bhbj5BZGQgQ29sbGVjdGlvbjwvc3Bhbj48L2J1dHRvbj4KKworICAgICAgPGJ1dHRvbiBpZD0iZGVsZXRlIiBjbGFzcz0id2FybiByZXF1aXJlcy1jb3JlIiBuZy1jbGljaz0ic2hvd0RlbGV0ZUNvbGxlY3Rpb24oKSIgbmctc2hvdz0iY29sbGVjdGlvbiI+PHNwYW4+RGVsZXRlPC9zcGFuPjwvYnV0dG9uPgorICAgICAgPGJ1dHRvbiBpZD0icmVsb2FkIiBjbGFzcz0icmVxdWlyZXMtY29yZSIgbmctY2xpY2s9InJlbG9hZENvbGxlY3Rpb24oKSIgbmctc2hvdz0iY29sbGVjdGlvbiIKKyAgICAgICAgIG5nLWNsYXNzPSJ7c3VjY2VzczogcmVsb2FkU3VjY2Vzcywgd2FybjogcmVsb2FkRmFpbHVyZX0iPjxzcGFuPlJlbG9hZDwvc3Bhbj48L2J1dHRvbj4KKyAgICAgIDxidXR0b24gaWQ9ImNyZWF0ZS1hbGlhcyIgY2xhc3M9ImFjdGlvbiByZXF1aXJlcy1jb3JlIiBuZy1jbGljaz0idG9nZ2xlQ3JlYXRlQWxpYXMoKSI+PHNwYW4+Q3JlYXRlIEFsaWFzPC9zcGFuPjwvYnV0dG9uPgorICAgICAgPGJ1dHRvbiBpZD0iZGVsZXRlLWFsaWFzIiBjbGFzcz0iYWN0aW9uIHJlcXVpcmVzLWNvcmUiIG5nLWNsaWNrPSJ0b2dnbGVEZWxldGVBbGlhcygpIj48c3Bhbj5EZWxldGUgQWxpYXM8L3NwYW4+PC9idXR0b24+CisKKyAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbiBhZGQiIGRhdGEtcmVsPSJhZGQiIG5nLXNob3c9InNob3dBZGQiIHN0eWxlPSJsZWZ0OjBweCI+CisKKyAgICAgICAgPGZvcm0+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9uYW1lIj5uYW1lOjwvbGFiZWw+CisgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5hbWUiIGlkPSJhZGRfbmFtZSIgbmctbW9kZWw9Im5ld0NvbGxlY3Rpb24ubmFtZSIgcGxhY2Vob2xkZXI9Im5ldyBjb2xsZWN0aW9uIj48L3A+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9jb25maWciPmNvbmZpZyBzZXQ6PC9sYWJlbD4mbmJzcDsKKyAgICAgICAgICA8c2VsZWN0IGNob3NlbiBuZy1vcHRpb25zPSJjb25maWcubmFtZSBhcyBjb25maWcubmFtZSBmb3IgY29uZmlnIGluIGNvbmZpZ3MiIG5hbWU9ImNvbmZpZ19uYW1lIiBpZD0iYWRkX2NvbmZpZyIgbmctbW9kZWw9Im5ld0NvbGxlY3Rpb24uY29uZmlnTmFtZSI+CisgICAgICAgICAgPC9zZWxlY3Q+CisgICAgICAgICAgPC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJhZGRfbnVtU2hhcmRzIj5udW1TaGFyZHM6PC9sYWJlbD4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibnVtU2hhcmRzIiBpZD0iYWRkX251bVNoYXJkcyIgbmctbW9kZWw9Im5ld0NvbGxlY3Rpb24ubnVtU2hhcmRzIj48L3A+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9yZXBsaWNhdGlvbkZhY3RvciI+cmVwbGljYXRpb25GYWN0b3I6PC9sYWJlbD4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icmVwbGljYXRpb25GYWN0b3IiIGlkPSJhZGRfcmVwbGljYXRpb25GYWN0b3IiIG5nLW1vZGVsPSJuZXdDb2xsZWN0aW9uLnJlcGxpY2F0aW9uRmFjdG9yIj48L3A+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxhIG5nLWNsaWNrPSJzaG93QWR2YW5jZWQ9IXNob3dBZHZhbmNlZCI+CisgICAgICAgICAgICAgIDxzcGFuIGlkPSJhZGRfYWR2YW5jZWQiIG5nLWNsYXNzPSJ7b3Blbjogc2hvd0FkdmFuY2VkfSI+U2hvdyBhZHZhbmNlZDwvc3Bhbj48L2E+PC9wPgorICAgICAgICAgIDxkaXYgbmctc2hvdz0ic2hvd0FkdmFuY2VkIj4KKworICAgICAgICAgICAgICA8cD5BZHZhbmNlZCBvcHRpb25zOiA8L3A+CisgICAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWRkX3JvdXRlcl9uYW1lIj5yb3V0ZXI6PC9sYWJlbD4KKyAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJyb3V0ZXJOYW1lIiBpZD0iYWRkX3JvdXRlcl9uYW1lIiBuZy1tb2RlbD0ibmV3Q29sbGVjdGlvbi5yb3V0ZXJOYW1lIj4KKyAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJjb21wb3NpdGVJZCI+Q29tcG9zaXRlIElEPC9vcHRpb24+CisgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1wbGljaXQiPkltcGxpY2l0PC9vcHRpb24+CisgICAgICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJhZGRfbWF4U2hhcmRzUGVyTm9kZSI+bWF4U2hhcmRzUGVyTm9kZTo8L2xhYmVsPgorICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icmVwbGljYXRpb25GYWN0b3IiIGlkPSJhZGRfbWF4U2hhcmRzUGVyTm9kZSIgbmctbW9kZWw9Im5ld0NvbGxlY3Rpb24ubWF4U2hhcmRzUGVyTm9kZSI+PC9wPgorCisgICAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWRkX3NoYXJkcyI+c2hhcmRzOjwvbGFiZWw+CisgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzaGFyZHMiIGlkPSJhZGRfc2hhcmRzIiBuZy1tb2RlbD0ibmV3Q29sbGVjdGlvbi5zaGFyZHMiPjwvcD4KKworICAgICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9yb3V0ZXJGaWVsZCI+cm91dGVyRmllbGQ6PC9sYWJlbD4KKyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InJvdXRlckZpZWxkIiBpZD0iYWRkX3JvdXRlckZpZWxkIiBuZy1tb2RlbD0ibmV3Q29sbGVjdGlvbi5yb3V0ZXJGaWVsZCI+PC9wPgorCisgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiIG5nLXNob3c9ImFkZE1lc3NhZ2UiPgorICAgICAgICAgICAgPHNwYW4+e3thZGRNZXNzYWdlfX08L3NwYW4+CisgICAgICAgICAgPC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IGJ1dHRvbnMiPgorICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJzdWJtaXQiIG5nLWNsaWNrPSJhZGRDb2xsZWN0aW9uKCkiPjxzcGFuPkFkZCBDb2xsZWN0aW9uPC9zcGFuPjwvYnV0dG9uPgorICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJyZXNldCIgY2xhc3M9InJlc2V0IiBuZy1jbGljaz0iY2FuY2VsQWRkQ29sbGVjdGlvbigpIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgPC9wPgorCisgICAgICAgIDwvZm9ybT4KKworICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbiBkZWxldGUiIG5nLXNob3c9InNob3dEZWxldGUiPgorCisgICAgICAgIDxmb3JtPgorCisgICAgICAgICAgPHA+UGxlYXNlIHR5cGUgY29sbGVjdGlvbiBuYW1lIHRvIGNvbmZpcm0gZGVsZXRpb246PC9wPgorICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iY29sbGVjdGlvbmRlbGV0ZUNvbmZpcm0iPkNvbGxlY3Rpb248L2xhYmVsPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iY29sbGVjdGlvbkRlbGV0ZUNvbmZpcm0iIGlkPSJjb2xsZWN0aW9uRGVsZXRlQ29uZmlybSI+PC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiIG5nLXNob3c9ImRlbGV0ZU1lc3NhZ2UiPgorICAgICAgICAgICAgPHNwYW4+e3tkZWxldGVNZXNzYWdlfX08L3NwYW4+CisgICAgICAgICAgPC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IGJ1dHRvbnMiPgorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ic3VibWl0IiBuZy1jbGljaz0iZGVsZXRlQ29sbGVjdGlvbigpIj48c3Bhbj5EZWxldGU8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InJlc2V0IiBjbGFzcz0icmVzZXQiIG5nLWNsaWNrPSJzaG93RGVsZXRlPWZhbHNlIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgPC9wPgorICAgICAgICA8L2Zvcm0+CisKKyAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24gY3JlYXRlLWFsaWFzIiBuZy1zaG93PSJzaG93Q3JlYXRlQWxpYXMiPgorCisgICAgICAgIDxmb3JtPgorCisgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY29yZSIgZGF0YS1jb3JlPSJjdXJyZW50Ij4KKworICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWxpYXMiPkFsaWFzIE5hbWU6PC9sYWJlbD4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYWxpYXMiIG5nLW1vZGVsPSJhbGlhc1RvQ3JlYXRlIiBpZD0iYWxpYXMiPjwvcD4KKworICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWxpYXNDb2xsZWN0aW9ucyI+Q29sbGVjdGlvbnM6PC9sYWJlbD4KKyAgICAgICAgICA8c2VsZWN0IG11bHRpcGxlIGlkPSJhbGlhc0NvbGxlY3Rpb25zIiBuZy1tb2RlbD0iYWxpYXNDb2xsZWN0aW9ucyIgbmctb3B0aW9ucz0iY29sbGVjdGlvbi5uYW1lIGZvciBjb2xsZWN0aW9uIGluIGNvbGxlY3Rpb25zIiBjbGFzcz0ib3RoZXIiPgorICAgICAgICAgIDwvc2VsZWN0PjwvcD4KKworCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiIG5nLXNob3c9InJlbmFtZU1lc3NhZ2UiPgorICAgICAgICAgICAgPHNwYW4+e3tyZW5hbWVNZXNzYWdlfX08L3NwYW4+CisgICAgICAgICAgPC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IGJ1dHRvbnMiPgorICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ic3VibWl0IiBuZy1jbGljaz0iY3JlYXRlQWxpYXMoKSI+PHNwYW4+Q3JlYXRlIEFsaWFzPC9zcGFuPjwvYnV0dG9uPgorICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJyZXNldCIgY2xhc3M9InJlc2V0IiBuZy1jbGljaz0iY2FuY2VsQ3JlYXRlQWxpYXMoKSI+PHNwYW4+Q2FuY2VsPC9zcGFuPjwvYnV0dG9uPgorICAgICAgICAgIDwvcD4KKyAgICAgICAgPC9mb3JtPgorCisgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uIGRlbGV0ZS1hbGlhcyIgbmctc2hvdz0ic2hvd0RlbGV0ZUFsaWFzIj4KKworICAgICAgICA8Zm9ybT4KKyAgICAgICAgICA8c3BhbiBuZy1zaG93PSJhbGlhc2VzIj4KKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImRlbGV0ZUFsaWFzIj5BbGlhczo8L2xhYmVsPgorICAgICAgICAgIDxzZWxlY3QgaWQ9ImRlbGV0ZUFsaWFzIiBuZy1tb2RlbD0iYWxpYXNUb0RlbGV0ZSIgbmctb3B0aW9ucz0iYWxpYXMgYXMgYWxpYXMgZm9yIChhbGlhcywgY29sbGVjdGlvbnMpIGluIGFsaWFzZXMiIGNsYXNzPSJvdGhlciI+CisgICAgICAgICAgPC9zZWxlY3Q+PC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiIG5nLXNob3c9InN3YXBNZXNzYWdlIj4KKyAgICAgICAgICAgIDxzcGFuPnt7c3dhcE1lc3NhZ2V9fTwvc3Bhbj4KKyAgICAgICAgICA8L3A+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXggYnV0dG9ucyI+CisgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgbmctY2xpY2s9ImRlbGV0ZUFsaWFzKCkiPjxzcGFuPkRlbGV0ZSBBbGlhczwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICAgIDxidXR0b24gdHlwZT0icmVzZXQiIGNsYXNzPSJyZXNldCIgbmctY2xpY2s9ImNhbmNlbERlbGV0ZUFsaWFzKCkiPjxzcGFuPkNhbmNlbDwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICA8L3A+CisgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgIDxzcGFuIG5nLWhpZGU9ImFsaWFzZXMiPgorICAgICAgICAgICAgICA8cD5ObyBhbGlhc2VzIHRvIGRlbGV0ZS48L3A+CisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IGJ1dHRvbnMiPgorICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJyZXNldCIgY2xhc3M9InJlc2V0IiBuZy1jbGljaz0iY2FuY2VsRGVsZXRlQWxpYXMoKSI+PHNwYW4+Q2FuY2VsPC9zcGFuPjwvYnV0dG9uPgorICAgICAgICAgIDwvcD4KKyAgICAgICAgICA8L3NwYW4+CisKKyAgICAgICAgPC9mb3JtPgorCisgICAgICA8L2Rpdj4KKworICAgIDwvZGl2PgorCisKKyAgICA8ZGl2IGNsYXNzPSJyZXF1aXJlcy1jb3JlIiBuZy1oaWRlPSJjb2xsZWN0aW9uIj4KKyAgICAgIDxoMj5QbGVhc2Ugc2VsZWN0IGEgY29sbGVjdGlvbjwvaDI+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGlkPSJkYXRhIiBjbGFzcz0icmVxdWlyZXMtY29yZSBjbGVhcmZpeCIgbmctc2hvdz0iY29sbGVjdGlvbiI+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsb2NrIiBpZD0iY29sbGVjdGlvbi1kYXRhIj4KKworICAgICAgICAgIDxoMj5Db2xsZWN0aW9uOiB7e2NvbGxlY3Rpb24ubmFtZX19PC9oMj4KKworICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+PC9kaXY+CisgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKworICAgICAgICAgIDx1bD4KKworICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIDxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+U2hhcmQgY291bnQ6PC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgICAgIDxkZD57e2NvbGxlY3Rpb24uc2hhcmRzLmxlbmd0aH19PC9kZD4KKyAgICAgICAgICAgICAgICA8L2RsPgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDxsaT48ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgPGR0PjxzcGFuPmNvbmZpZ05hbWU6PC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgPGRkPnt7Y29sbGVjdGlvbi5jb25maWdOYW1lfX08L2RkPgorICAgICAgICAgICAgPC9kbD48L2xpPgorCisgICAgICAgICAgICA8bGk+PGRsIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICAgIDxkdD48c3Bhbj5yZXBsaWNhdGlvbkZhY3Rvcjo8L3NwYW4+PC9kdD4KKyAgICAgICAgICAgICAgICA8ZGQ+e3tjb2xsZWN0aW9uLnJlcGxpY2F0aW9uRmFjdG9yfX08L2RkPgorICAgICAgICAgICAgPC9kbD48L2xpPgorCisgICAgICAgICAgICA8bGk+PGRsIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICAgIDxkdD48c3Bhbj5tYXhTaGFyZHNQZXJOb2RlOjwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgIDxkZD57e2NvbGxlY3Rpb24ubWF4U2hhcmRzUGVyTm9kZX19PC9kZD4KKyAgICAgICAgICAgIDwvZGw+PC9saT4KKworICAgICAgICAgICAgPGxpPjxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICA8ZHQ+PHNwYW4+cm91dGVyOjwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgIDxkZD57e2NvbGxlY3Rpb24ucm91dGVyLm5hbWV9fTwvZGQ+CisgICAgICAgICAgICA8L2RsPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgPGR0PjxzcGFuPmF1dG9BZGRSZXBsaWNhczo8L3NwYW4+PC9kdD4KKyAgICAgICAgICAgICAgICA8ZGQ+e3tjb2xsZWN0aW9uLmF1dG9BZGRSZXBsaWNhc319PC9kZD4KKyAgICAgICAgICAgIDwvZGw+PC9saT4KKyAgICAgICAgICA8L3VsPgorCisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsb2NrIiBpZD0ic2hhcmQtZGF0YSI+CisgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQgc2hhcmQiIG5nLXJlcGVhdD0ic2hhcmQgaW4gY29sbGVjdGlvbi5zaGFyZHMiPgorICAgICAgICAgIDxhIG5nLWNsaWNrPSJ0b2dnbGVTaGFyZChzaGFyZCkiPjxoMj48c3BhbiBuZy1jbGFzcz0ie29wZW46c2hhcmQuc2hvd30iPlNoYXJkOiB7e3NoYXJkLm5hbWV9fTwvc3Bhbj48L2gyPjwvYT4KKyAgICAgICAgICA8dWwgbmctc2hvdz0ic2hhcmQuc2hvdyI+CisgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5zdGF0ZTo8L3NwYW4+PC9kdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGQ+e3tzaGFyZC5zdGF0ZX19PC9kZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kbD4KKyAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5yYW5nZTo8L3NwYW4+PC9kdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkZD57e3NoYXJkLnJhbmdlfX08L2RkPgorICAgICAgICAgICAgICAgICAgICAgIDwvZGw+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CisgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9InJlcGxpY2EiIG5nLXJlcGVhdD0icmVwbGljYSBpbiBzaGFyZC5yZXBsaWNhcyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuZy1jbGljaz0idG9nZ2xlUmVwbGljYShyZXBsaWNhKSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJvcGVuUmVwbGljYSIgbmctY2xhc3M9IntvcGVuOnJlcGxpY2Euc2hvd30iPlJlcGxpY2E6IHt7cmVwbGljYS5uYW1lfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodCI+PGEgbmctY2xpY2s9InRvZ2dsZVJlbW92ZVJlcGxpY2EocmVwbGljYSkiPjxzcGFuIGNsYXNzPSJyZW0iPjwvc3Bhbj48L2E+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIG5nLXNob3c9InJlcGxpY2Euc2hvd1JlbW92ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPSJkZWxldGUtcmVwbGljYSI+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48ZW0+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHJlcGxpY2E/PC9lbT48L3A+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IGJ1dHRvbnMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InN1Ym1pdCIgbmctY2xhc3M9IntzdWNjZXNzOiByZXBsaWNhLmRlbGV0ZWR9IiBuZy1jbGljaz0iZGVsZXRlUmVwbGljYShyZXBsaWNhKSI+PHNwYW4+RGVsZXRlIFJlcGxpY2E8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJyZXNldCIgY2xhc3M9InJlc2V0IiBuZy1jbGljaz0idG9nZ2xlUmVtb3ZlUmVwbGljYShyZXBsaWNhKSI+PHNwYW4+Q2FuY2VsPC9zcGFuPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgbmctc2hvdz0icmVwbGljYS5zaG93Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRsIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0PjxzcGFuPmNvcmU6PC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkPnt7cmVwbGljYS5jb3JlfX08L2RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+YmFzZSBVUkw6PC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkPjxhIG5nLWhyZWY9Int7cmVwbGljYS5iYXNlX3VybH19e3tyb290VXJsfX0iPnt7cmVwbGljYS5iYXNlX3VybH19PC9hPjwvZGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5ub2RlIG5hbWU6PC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkPnt7cmVwbGljYS5ub2RlX25hbWV9fTwvZGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5zdGF0ZTo8L3NwYW4+PC9kdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGQ+e3tyZXBsaWNhLnN0YXRlfX08L2RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+bGVhZGVyOjwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZCBjbGFzcz0iaWNvIiBuZy1jbGFzcz0icmVwbGljYS5sZWFkZXIgPydpY28tMScgOiAnaWNvLTAnIj48c3Bhbj48L3NwYW4+PC9kZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDxsaSBuZy1oaWRlPSJzaGFyZC5zaG93QWRkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFjdGlvbnMgcmVwbGljYSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0aW9uIiBpZD0iYWRkLXJlcGxpY2EiIG5nLWNsaWNrPSJ0b2dnbGVBZGRSZXBsaWNhKHNoYXJkKSI+PHNwYW4+YWRkIHJlcGxpY2E8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbiBhZGQtcmVwbGljYSIgbmctc2hvdz0ic2hhcmQuc2hvd0FkZCI+CisKKyAgICAgICAgICAgICAgICAgICAgPGZvcm0+CisKKyAgICAgICAgICAgICAgICAgICAgICA8cCBpZD0ibm9kZS1uYW1lIiBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9Im5vZGUtbmFtZSI+Tm9kZTo8L2xhYmVsPgorICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2hvc2VuIG5nLW1vZGVsPSJzaGFyZC5yZXBsaWNhTm9kZU5hbWUiIG5nLW9wdGlvbnM9Im5vZGUgZm9yIG5vZGUgaW4gbm9kZXMiIGNsYXNzPSJvdGhlciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+Tm8gc3BlY2lmaWVkIG5vZGU8L29wdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZToge3tzaGFyZC5yZXBsaWNhTm9kZU5hbWV9fQorICAgICAgICAgICAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBub3RlIGVycm9yIiBuZy1zaG93PSJjcmVhdGVSZXBsaWNhTWVzc2FnZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2NyZWF0ZVJlcGxpY2FNZXNzYWdlfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgPC9wPgorCisgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IGJ1dHRvbnMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ic3VibWl0IGRlbGV0ZSIgbmctY2xhc3M9IntzdWNjZXNzOiBzaGFyZC5yZXBsaWNhQWRkZWR9IiBuZy1jbGljaz0iYWRkUmVwbGljYShzaGFyZCkiPjxzcGFuPkNyZWF0ZSBSZXBsaWNhPC9zcGFuPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJyZXNldCIgY2xhc3M9InJlc2V0IiBuZy1jbGljaz0idG9nZ2xlQWRkUmVwbGljYShzaGFyZCkiPjxzcGFuPkNhbmNlbDwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzPSJjbGVhcmZpeCI+Jm5ic3A7PC9wPgorICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CisKKyAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisKKyAgICA8L2Rpdj4KKworICA8L2Rpdj4KKworICA8ZGl2IGlkPSJuYXZpZ2F0aW9uIiBjbGFzcz0icmVxdWlyZXMtY29yZSBjbGVhcmZpeCI+CisgICAgPHVsPgorICAgICAgPGxpIG5nLXJlcGVhdD0iYyBpbiBjb2xsZWN0aW9ucyIgbmctY2xhc3M9IntjdXJyZW50OiBjb2xsZWN0aW9uLm5hbWUgPT0gYy5uYW1lfSI+PGEgaHJlZj0iI35jb2xsZWN0aW9ucy97e2MubmFtZX19Ij57e2MubmFtZX19PC9hPjwvbGk+CisgICAgPC91bD4KKyAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL2NvcmVfb3ZlcnZpZXcuaHRtbCBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9jb3JlX292ZXJ2aWV3Lmh0bWwKaW5kZXggZDUwMzU5Ni4uNWY4NjIyMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL2NvcmVfb3ZlcnZpZXcuaHRtbAorKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvY29yZV9vdmVydmlldy5odG1sCkBAIC0xLDIyNyArMSwyMjcgQEAKLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxkaXYgaWQ9ImRhc2hib2FyZCI+DQotDQotICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCI+DQotDQotICAgIDxkaXYgY2xhc3M9ImJsb2NrIGZpZWxkbGlzdCIgaWQ9InN0YXRpc3RpY3MiIG5nLWNsYXNzPSJ7ZGlzYWJsZWQ6IHN0YXRpc3RpY3NEaXNhYmxlZH0iPg0KLQ0KLSAgICAgIDxoMj48c3Bhbj5TdGF0aXN0aWNzPC9zcGFuPjwvaDI+DQotDQotICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiIG5nLXNob3c9InN0YXRzTWVzc2FnZSI+DQotICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj57e3N0YXRzTWVzc2FnZX19PC9kaXY+DQotICAgICAgPC9kaXY+DQotDQotICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+DQotDQotICAgICAgICA8ZGw+DQotDQotICAgICAgICAgIDxkdD5MYXN0IE1vZGlmaWVkOjwvZHQ+DQotICAgICAgICAgICAgPGRkIGNsYXNzPSJ2YWx1ZSI+e3tpbmRleC5sYXN0TW9kaWZpZWQgfCB0aW1lYWdvfX08L2RkPg0KLQ0KLSAgICAgICAgICA8ZHQgY2xhc3M9ImluZGV4X251bS1kb2NzIj5OdW0gRG9jczo8L2R0Pg0KLSAgICAgICAgICAgIDxkZCBjbGFzcz0idmFsdWUiPnt7aW5kZXgubnVtRG9jc319PC9kZD4NCi0NCi0gICAgICAgICAgPGR0IGNsYXNzPSJpbmRleF9tYXgtZG9jIj5NYXggRG9jOjwvZHQ+DQotICAgICAgICAgICAgPGRkIGNsYXNzPSJpbmRleF9tYXgtZG9jIHZhbHVlIj57e2luZGV4Lm1heERvY319PC9kZD4NCi0NCi0gICAgICAgICAgPGR0IGNsYXNzPSJpbmRleF9oZWFwLXVzYWdlLWJ5dGVzIj5IZWFwIE1lbW9yeSBVc2FnZTo8L2R0Pg0KLSAgICAgICAgICAgIDxkZCBjbGFzcz0iaW5kZXhfaGVhcC11c2FnZS1ieXRlcyB2YWx1ZSI+e3tpbmRleC5pbmRleEhlYXBVc2FnZUJ5dGVzfX08L2RkPg0KLQ0KLSAgICAgICAgICA8ZHQgY2xhc3M9ImluZGV4X2RlbGV0ZWQtZG9jcyI+RGVsZXRlZCBEb2NzOjwvZHQ+DQotICAgICAgICAgICAgPGRkIGNsYXNzPSJpbmRleF9kZWxldGVkLWRvY3MgdmFsdWUiPnt7aW5kZXguZGVsZXRlZERvY3N9fTwvZGQ+DQotDQotICAgICAgICAgIDxkdCBjbGFzcz0iaW5kZXhfdmVyc2lvbiI+VmVyc2lvbjo8L2R0Pg0KLSAgICAgICAgICAgIDxkZCBjbGFzcz0iaW5kZXhfdmVyc2lvbiB2YWx1ZSI+e3tpbmRleC52ZXJzaW9ufX08L2RkPg0KLQ0KLSAgICAgICAgICA8ZHQgY2xhc3M9ImluZGV4X3NlZ21lbnRDb3VudCI+U2VnbWVudCBDb3VudDo8L2R0Pg0KLSAgICAgICAgICAgIDxkZCBjbGFzcz0iaW5kZXhfc2VnbWVudENvdW50IHZhbHVlIj57e2luZGV4LnNlZ21lbnRDb3VudH19PC9kZD4NCi0NCi0gICAgICAgICAgPGR0IGNsYXNzPSJpbmRleF9vcHRpbWl6ZWQiPk9wdGltaXplZDo8L2R0Pg0KLSAgICAgICAgICAgIDxkZCBjbGFzcz0iaW5kZXhfb3B0aW1pemVkIGljbyB2YWx1ZSIgbmctY2xhc3M9ImluZGV4Lmhhc0RlbGV0aW9ucyA/ICdpY28tMCcgOiAnaWNvLTEnIj48c3Bhbj48L3NwYW4+DQotICAgICAgICAgICAgPGEgbmctY2xpY2s9Im9wdGltaXplSW5kZXgoKSIgbmctc2hvdz0iaW5kZXguaGFzRGVsZXRpb25zIj5vcHRpbWl6ZSBub3c8L2E+PC9kZD4NCi0NCi0gICAgICAgICAgPGR0IGNsYXNzPSJpbmRleF9jdXJyZW50Ij5DdXJyZW50OjwvZHQ+DQotICAgICAgICAgICAgPGRkIGNsYXNzPSJpY28iIG5nLWNsYXNzPSJpbmRleC5jdXJyZW50ID8naWNvLTEnIDogJ2ljby0wJyI+PHNwYW4+PC9zcGFuPjwvZGQ+DQotDQotICAgICAgICA8L2RsPg0KLQ0KLSAgICAgIDwvZGl2Pg0KLSAgICA8L2Rpdj4NCi0NCi0gICAgPGRpdiBjbGFzcz0iYmxvY2sgZmllbGRsaXN0IiBpZD0iaW5zdGFuY2UiPg0KLQ0KLSAgICAgIDxoMj48c3Bhbj5JbnN0YW5jZTwvc3Bhbj48L2gyPg0KLQ0KLSAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UtY29udGFpbmVyIiBuZy1zaG93PSJpbmRleE1lc3NhZ2UiPg0KLSAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+e3tpbmRleE1lc3NhZ2V9fTwvZGl2Pg0KLSAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgPGRsPg0KLQ0KLSAgICAgICAgICA8ZHQ+PGFiYnIgdGl0bGU9IkN1cnJlbnQgV29ya2luZyBEaXJlY3RvcnkiPkNXRDwvYWJicj46PC9kdD4NCi0gICAgICAgICAgICA8ZGQgY2xhc3M9InZhbHVlIj57eyBjb3JlLmRpcmVjdG9yeS5jd2QgfX08L2RkPg0KLQ0KLSAgICAgICAgICA8ZHQ+SW5zdGFuY2U6PC9kdD4NCi0gICAgICAgICAgICA8ZGQgY2xhc3M9InZhbHVlIj57eyBjb3JlLmRpcmVjdG9yeS5pbnN0YW5jZSB9fTwvZGQ+DQotDQotICAgICAgICAgIDxkdD5EYXRhOjwvZHQ+DQotICAgICAgICAgICAgPGRkIGNsYXNzPSJ2YWx1ZSI+e3sgY29yZS5kaXJlY3RvcnkuZGF0YSB9fTwvZGQ+DQotDQotICAgICAgICAgIDxkdD5JbmRleDo8L2R0Pg0KLSAgICAgICAgICAgIDxkZCBjbGFzcz0idmFsdWUiPnt7IGNvcmUuZGlyZWN0b3J5LmluZGV4IH19PC9kZD4NCi0NCi0gICAgICAgICAgPGR0PkltcGw6PC9kdD4NCi0gICAgICAgICAgICA8ZGQgY2xhc3M9InZhbHVlIj57eyBjb3JlLmRpcmVjdG9yeS5kaXJpbXBsIH19PC9kZD4NCi0NCi0gICAgICAgIDwvZGw+DQotDQotICAgICAgPC9kaXY+DQotICAgIDwvZGl2Pg0KLQ0KLSAgPC9kaXY+DQotICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCI+DQotDQotICAgIDxkaXYgY2xhc3M9ImJsb2NrIiBpZD0icmVwbGljYXRpb24iPg0KLQ0KLSAgICAgIDxoMj4NCi0gICAgICAgIDxzcGFuIGNsYXNzPSJpcy1yZXBsaWNhdGluZyI+DQotICAgICAgICAgIFJlcGxpY2F0aW9uDQotICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImlzU2xhdmUiPiAoU2xhdmUpPC9zcGFuPg0KLSAgICAgICAgICA8c3BhbiBuZy1zaG93PSJpc01hc3RlciI+IChNYXN0ZXIpPC9zcGFuPg0KLSAgICAgICAgPC9zcGFuPg0KLSAgICAgIDwvaDI+DQotDQotICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiIG5nLXNob3c9InJlcGxpY2F0aW9uTWVzc2FnZSI+DQotICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj57e3JlcGxpY2F0aW9uTWVzc2FnZX19PC9kaXY+DQotICAgICAgPC9kaXY+DQotDQotICAgICAgPGRpdiBjbGFzcz0iY29udGVudCBjbGVhcmZpeCIgaWQ9ImRldGFpbHMiPg0KLQ0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4NCi0NCi0gICAgICAgICAgPHRoZWFkPg0KLQ0KLSAgICAgICAgICAgIDx0cj4NCi0NCi0gICAgICAgICAgICAgIDx0ZD48c3Bhbj5JbmRleDwvc3Bhbj48L3RkPg0KLSAgICAgICAgICAgICAgPHRoPlZlcnNpb248L3RoPg0KLSAgICAgICAgICAgICAgPHRoPjxhYmJyIHRpdGxlPSJHZW5lcmF0aW9uIj5HZW48L2FiYnI+PC90aD4NCi0gICAgICAgICAgICAgIDx0aD5TaXplPC90aD4NCi0NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgICA8L3RoZWFkPg0KLSAgICAgICAgICA8dGJvZHk+DQotDQotICAgICAgICAgICAgPHRyIGNsYXNzPSJtYXN0ZXJTZWFyY2giIG5nLXNob3c9ImlzTWFzdGVyIj4NCi0NCi0gICAgICAgICAgICAgIDx0aD5NYXN0ZXIgKFNlYXJjaGluZyk8L3RoPg0KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ2ZXJzaW9uIj48ZGl2Pnt7cmVwbGljYXRpb24uaW5kZXhWZXJzaW9ufX08L2Rpdj48L3RkPg0KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJnZW5lcmF0aW9uIj48ZGl2Pnt7cmVwbGljYXRpb24uZ2VuZXJhdGlvbn19PC9kaXY+PC90ZD4NCi0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic2l6ZSI+PGRpdj57e3JlcGxpY2F0aW9uLmluZGV4U2l6ZSB8fCAnLSd9fTwvZGl2PjwvdGQ+DQotDQotICAgICAgICAgICAgPC90cj4NCi0NCi0gICAgICAgICAgICA8dHIgY2xhc3M9Im1hc3RlciIgbmctc2hvdz0iaXNNYXN0ZXIiPg0KLQ0KLSAgICAgICAgICAgICAgPHRoPk1hc3RlciAoUmVwbGljYWJsZSk8L3RoPg0KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ2ZXJzaW9uIj48ZGl2Pnt7cmVwbGljYXRpb24ubWFzdGVyLnJlcGxpY2FibGVWZXJzaW9uIHx8ICctJ319PC9kaXY+PC90ZD4NCi0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZ2VuZXJhdGlvbiI+PGRpdj57e3JlcGxpY2F0aW9uLm1hc3Rlci5yZXBsaWNhYmxlR2VuZXJhdGlvbiB8fCAnLSd9fTwvZGl2PjwvdGQ+DQotICAgICAgICAgICAgICA8dGQgY2xhc3M9InNpemUiPjxkaXY+LTwvZGl2PjwvdGQ+DQotDQotICAgICAgICAgICAgPC90cj4NCi0NCi0gICAgICAgICAgICA8dHIgY2xhc3M9Im1hc3RlciIgbmctc2hvdz0iaXNTbGF2ZSI+DQotDQotICAgICAgICAgICAgICA8dGg+TWFzdGVyIChSZXBsaWNhYmxlKTwvdGg+DQotICAgICAgICAgICAgICA8dGQgY2xhc3M9InZlcnNpb24iPjxkaXY+e3tyZXBsaWNhdGlvbi5tYXN0ZXIucmVwbGljYWJsZVZlcnNpb24gfHwgJy0nfX08L2Rpdj48L3RkPg0KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJnZW5lcmF0aW9uIj48ZGl2Pnt7cmVwbGljYXRpb24ubWFzdGVyLnJlcGxpY2FibGVHZW5lcmF0aW9uIHx8ICctJ319PC9kaXY+PC90ZD4NCi0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic2l6ZSI+PGRpdj4tPC9kaXY+PC90ZD4NCi0NCi0gICAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgICAgIDx0ciBjbGFzcz0ibWFzdGVyU2VhcmNoIiBuZy1zaG93PSJpc1NsYXZlIj4NCi0NCi0gICAgICAgICAgICAgIDx0aD5NYXN0ZXIgKFNlYXJjaGluZyk8L3RoPg0KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ2ZXJzaW9uIj48ZGl2Pnt7cmVwbGljYXRpb24uc2xhdmUubWFzdGVyRGV0YWlscy5pbmRleFZlcnNpb259fTwvZGl2PjwvdGQ+DQotICAgICAgICAgICAgICA8dGQgY2xhc3M9ImdlbmVyYXRpb24iPjxkaXY+e3tyZXBsaWNhdGlvbi5zbGF2ZS5tYXN0ZXJEZXRhaWxzLmdlbmVyYXRpb259fTwvZGl2PjwvdGQ+DQotICAgICAgICAgICAgICA8dGQgY2xhc3M9InNpemUiPjxkaXY+e3tyZXBsaWNhdGlvbi5zbGF2ZS5tYXN0ZXJEZXRhaWxzLmluZGV4U2l6ZSB8fCAnLSd9fTwvZGl2PjwvdGQ+DQotDQotICAgICAgICAgICAgPC90cj4NCi0NCi0gICAgICAgICAgICA8dHIgY2xhc3M9InNsYXZlIHNsYXZlT25seSIgbmctc2hvdz0iaXNTbGF2ZSI+DQotDQotICAgICAgICAgICAgICA8dGg+U2xhdmUgKFNlYXJjaGluZyk8L3RoPg0KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ2ZXJzaW9uIj48ZGl2Pnt7cmVwbGljYXRpb24uaW5kZXhWZXJzaW9ufX08L2Rpdj48L3RkPg0KLSAgICAgICAgICAgICAgPHRkIGNsYXNzPSJnZW5lcmF0aW9uIj48ZGl2Pnt7cmVwbGljYXRpb24uZ2VuZXJhdGlvbn19PC9kaXY+PC90ZD4NCi0gICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic2l6ZSI+PGRpdj57e3JlcGxpY2F0aW9uLmluZGV4U2l6ZSB8fCAnLSd9fTwvZGl2PjwvdGQ+DQotDQotICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgPC90Ym9keT4NCi0NCi0gICAgICAgIDwvdGFibGU+DQotDQotICAgICAgPC9kaXY+DQotICAgIDwvZGl2Pg0KLQ0KLSAgICA8ZGl2IGNsYXNzPSJibG9jayBmaWVsZGxpc3QiIGlkPSJoZWFsdGhjaGVjayIgbmctY2xhc3M9IntkaXNhYmxlZDogaGVhbHRoY2hlY2tNZXNzYWdlfSI+DQotDQotICAgICAgPGgyPjxzcGFuPkhlYWx0aGNoZWNrPC9zcGFuPjwvaDI+DQotDQotICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiIG5nLXNob3c9ImhlYWx0aGNoZWNrTWVzc2FnZSI+DQotICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj57e2hlYWx0aGNoZWNrTWVzc2FnZX19PC9kaXY+DQotICAgICAgPC9kaXY+DQotDQotICAgICAgPGRpdiBjbGFzcz0iY29udGVudCIgbmctc2hvdz0iIWhlYWx0aGNoZWNrTWVzc2FnZSI+DQotICAgICAgICA8ZGw+DQotDQotICAgICAgICAgIDxkdCBjbGFzcz0ic3RhdHVzIj5TdGF0dXM6PC9kdD4NCi0gICAgICAgICAgPGRkIGNsYXNzPSJzdGF0dXMgdmFsdWUgaWNvIGljby0xIiBuZy1zaG93PSJoZWFsdGhjaGVja1N0YXR1cyI+DQotICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iaGVhbHRoY2hlY2stc3RhdHVzIGVuYWJsZWQiPkhlYWx0aGNoZWNrIFN0YXR1czwvYnV0dG9uPg0KLSAgICAgICAgICA8L2RkPg0KLSAgICAgICAgICA8ZGQgY2xhc3M9InN0YXR1cyB2YWx1ZSBpY28gaWNvLTAiIG5nLXNob3c9IiFoZWFsdGhjaGVja1N0YXR1cyI+DQotICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iaGVhbHRoY2hlY2stc3RhdHVzIj5lbmFibGUgcGluZzwvYnV0dG9uPg0KLSAgICAgICAgICA8L2RkPg0KLSAgICAgICAgPC9kbD4NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgPC9kaXY+DQotDQotICA8L2Rpdj4NCi0gIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4NCi0NCi0gICAgPGRpdiBjbGFzcz0iYmxvY2siIGlkPSJhZG1pbi1leHRyYSI+DQotDQotICAgICAgPGgyPjxzcGFuPkFkbWluIEV4dHJhPC9zcGFuPjwvaDI+DQotDQotICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiPg0KLSAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+PC9kaXY+DQotICAgICAgPC9kaXY+DQotDQotICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+DQotDQotICAgICAgPC9kaXY+DQotDQotICAgIDwvZGl2Pg0KLQ0KLSAgPC9kaXY+DQotDQotDQotPC9kaXY+DQorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZGl2IGlkPSJkYXNoYm9hcmQiPgorCisgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4KKworICAgIDxkaXYgY2xhc3M9ImJsb2NrIGZpZWxkbGlzdCIgaWQ9InN0YXRpc3RpY3MiIG5nLWNsYXNzPSJ7ZGlzYWJsZWQ6IHN0YXRpc3RpY3NEaXNhYmxlZH0iPgorCisgICAgICA8aDI+PHNwYW4+U3RhdGlzdGljczwvc3Bhbj48L2gyPgorCisgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRhaW5lciIgbmctc2hvdz0ic3RhdHNNZXNzYWdlIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+e3tzdGF0c01lc3NhZ2V9fTwvZGl2PgorICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorCisgICAgICAgIDxkbD4KKworICAgICAgICAgIDxkdD5MYXN0IE1vZGlmaWVkOjwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9InZhbHVlIj57e2luZGV4Lmxhc3RNb2RpZmllZCB8IHRpbWVhZ299fTwvZGQ+CisKKyAgICAgICAgICA8ZHQgY2xhc3M9ImluZGV4X251bS1kb2NzIj5OdW0gRG9jczo8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJ2YWx1ZSI+e3tpbmRleC5udW1Eb2NzfX08L2RkPgorCisgICAgICAgICAgPGR0IGNsYXNzPSJpbmRleF9tYXgtZG9jIj5NYXggRG9jOjwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9ImluZGV4X21heC1kb2MgdmFsdWUiPnt7aW5kZXgubWF4RG9jfX08L2RkPgorCisgICAgICAgICAgPGR0IGNsYXNzPSJpbmRleF9oZWFwLXVzYWdlLWJ5dGVzIj5IZWFwIE1lbW9yeSBVc2FnZTo8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJpbmRleF9oZWFwLXVzYWdlLWJ5dGVzIHZhbHVlIj57e2luZGV4LmluZGV4SGVhcFVzYWdlQnl0ZXN9fTwvZGQ+CisKKyAgICAgICAgICA8ZHQgY2xhc3M9ImluZGV4X2RlbGV0ZWQtZG9jcyI+RGVsZXRlZCBEb2NzOjwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9ImluZGV4X2RlbGV0ZWQtZG9jcyB2YWx1ZSI+e3tpbmRleC5kZWxldGVkRG9jc319PC9kZD4KKworICAgICAgICAgIDxkdCBjbGFzcz0iaW5kZXhfdmVyc2lvbiI+VmVyc2lvbjo8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJpbmRleF92ZXJzaW9uIHZhbHVlIj57e2luZGV4LnZlcnNpb259fTwvZGQ+CisKKyAgICAgICAgICA8ZHQgY2xhc3M9ImluZGV4X3NlZ21lbnRDb3VudCI+U2VnbWVudCBDb3VudDo8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJpbmRleF9zZWdtZW50Q291bnQgdmFsdWUiPnt7aW5kZXguc2VnbWVudENvdW50fX08L2RkPgorCisgICAgICAgICAgPGR0IGNsYXNzPSJpbmRleF9vcHRpbWl6ZWQiPk9wdGltaXplZDo8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJpbmRleF9vcHRpbWl6ZWQgaWNvIHZhbHVlIiBuZy1jbGFzcz0iaW5kZXguaGFzRGVsZXRpb25zID8gJ2ljby0wJyA6ICdpY28tMSciPjxzcGFuPjwvc3Bhbj4KKyAgICAgICAgICAgIDxhIG5nLWNsaWNrPSJvcHRpbWl6ZUluZGV4KCkiIG5nLXNob3c9ImluZGV4Lmhhc0RlbGV0aW9ucyI+b3B0aW1pemUgbm93PC9hPjwvZGQ+CisKKyAgICAgICAgICA8ZHQgY2xhc3M9ImluZGV4X2N1cnJlbnQiPkN1cnJlbnQ6PC9kdD4KKyAgICAgICAgICAgIDxkZCBjbGFzcz0iaWNvIiBuZy1jbGFzcz0iaW5kZXguY3VycmVudCA/J2ljby0xJyA6ICdpY28tMCciPjxzcGFuPjwvc3Bhbj48L2RkPgorCisgICAgICAgIDwvZGw+CisKKyAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorCisgICAgPGRpdiBjbGFzcz0iYmxvY2sgZmllbGRsaXN0IiBpZD0iaW5zdGFuY2UiPgorCisgICAgICA8aDI+PHNwYW4+SW5zdGFuY2U8L3NwYW4+PC9oMj4KKworICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiIG5nLXNob3c9ImluZGV4TWVzc2FnZSI+CisgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPnt7aW5kZXhNZXNzYWdlfX08L2Rpdj4KKyAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKworICAgICAgICA8ZGw+CisKKyAgICAgICAgICA8ZHQ+PGFiYnIgdGl0bGU9IkN1cnJlbnQgV29ya2luZyBEaXJlY3RvcnkiPkNXRDwvYWJicj46PC9kdD4KKyAgICAgICAgICAgIDxkZCBjbGFzcz0idmFsdWUiPnt7IGNvcmUuZGlyZWN0b3J5LmN3ZCB9fTwvZGQ+CisKKyAgICAgICAgICA8ZHQ+SW5zdGFuY2U6PC9kdD4KKyAgICAgICAgICAgIDxkZCBjbGFzcz0idmFsdWUiPnt7IGNvcmUuZGlyZWN0b3J5Lmluc3RhbmNlIH19PC9kZD4KKworICAgICAgICAgIDxkdD5EYXRhOjwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9InZhbHVlIj57eyBjb3JlLmRpcmVjdG9yeS5kYXRhIH19PC9kZD4KKworICAgICAgICAgIDxkdD5JbmRleDo8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJ2YWx1ZSI+e3sgY29yZS5kaXJlY3RvcnkuaW5kZXggfX08L2RkPgorCisgICAgICAgICAgPGR0PkltcGw6PC9kdD4KKyAgICAgICAgICAgIDxkZCBjbGFzcz0idmFsdWUiPnt7IGNvcmUuZGlyZWN0b3J5LmRpcmltcGwgfX08L2RkPgorCisgICAgICAgIDwvZGw+CisKKyAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCI+CisKKyAgICA8ZGl2IGNsYXNzPSJibG9jayIgaWQ9InJlcGxpY2F0aW9uIj4KKworICAgICAgPGgyPgorICAgICAgICA8c3BhbiBjbGFzcz0iaXMtcmVwbGljYXRpbmciPgorICAgICAgICAgIFJlcGxpY2F0aW9uCisgICAgICAgICAgPHNwYW4gbmctc2hvdz0iaXNTbGF2ZSI+IChTbGF2ZSk8L3NwYW4+CisgICAgICAgICAgPHNwYW4gbmctc2hvdz0iaXNNYXN0ZXIiPiAoTWFzdGVyKTwvc3Bhbj4KKyAgICAgICAgPC9zcGFuPgorICAgICAgPC9oMj4KKworICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiIG5nLXNob3c9InJlcGxpY2F0aW9uTWVzc2FnZSI+CisgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPnt7cmVwbGljYXRpb25NZXNzYWdlfX08L2Rpdj4KKyAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50IGNsZWFyZml4IiBpZD0iZGV0YWlscyI+CisKKyAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKworICAgICAgICAgIDx0aGVhZD4KKworICAgICAgICAgICAgPHRyPgorCisgICAgICAgICAgICAgIDx0ZD48c3Bhbj5JbmRleDwvc3Bhbj48L3RkPgorICAgICAgICAgICAgICA8dGg+VmVyc2lvbjwvdGg+CisgICAgICAgICAgICAgIDx0aD48YWJiciB0aXRsZT0iR2VuZXJhdGlvbiI+R2VuPC9hYmJyPjwvdGg+CisgICAgICAgICAgICAgIDx0aD5TaXplPC90aD4KKworICAgICAgICAgICAgPC90cj4KKworICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgPHRib2R5PgorCisgICAgICAgICAgICA8dHIgY2xhc3M9Im1hc3RlclNlYXJjaCIgbmctc2hvdz0iaXNNYXN0ZXIiPgorCisgICAgICAgICAgICAgIDx0aD5NYXN0ZXIgKFNlYXJjaGluZyk8L3RoPgorICAgICAgICAgICAgICA8dGQgY2xhc3M9InZlcnNpb24iPjxkaXY+e3tyZXBsaWNhdGlvbi5pbmRleFZlcnNpb259fTwvZGl2PjwvdGQ+CisgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZ2VuZXJhdGlvbiI+PGRpdj57e3JlcGxpY2F0aW9uLmdlbmVyYXRpb259fTwvZGl2PjwvdGQ+CisgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic2l6ZSI+PGRpdj57e3JlcGxpY2F0aW9uLmluZGV4U2l6ZSB8fCAnLSd9fTwvZGl2PjwvdGQ+CisKKyAgICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICAgIDx0ciBjbGFzcz0ibWFzdGVyIiBuZy1zaG93PSJpc01hc3RlciI+CisKKyAgICAgICAgICAgICAgPHRoPk1hc3RlciAoUmVwbGljYWJsZSk8L3RoPgorICAgICAgICAgICAgICA8dGQgY2xhc3M9InZlcnNpb24iPjxkaXY+e3tyZXBsaWNhdGlvbi5tYXN0ZXIucmVwbGljYWJsZVZlcnNpb24gfHwgJy0nfX08L2Rpdj48L3RkPgorICAgICAgICAgICAgICA8dGQgY2xhc3M9ImdlbmVyYXRpb24iPjxkaXY+e3tyZXBsaWNhdGlvbi5tYXN0ZXIucmVwbGljYWJsZUdlbmVyYXRpb24gfHwgJy0nfX08L2Rpdj48L3RkPgorICAgICAgICAgICAgICA8dGQgY2xhc3M9InNpemUiPjxkaXY+LTwvZGl2PjwvdGQ+CisKKyAgICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICAgIDx0ciBjbGFzcz0ibWFzdGVyIiBuZy1zaG93PSJpc1NsYXZlIj4KKworICAgICAgICAgICAgICA8dGg+TWFzdGVyIChSZXBsaWNhYmxlKTwvdGg+CisgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idmVyc2lvbiI+PGRpdj57e3JlcGxpY2F0aW9uLm1hc3Rlci5yZXBsaWNhYmxlVmVyc2lvbiB8fCAnLSd9fTwvZGl2PjwvdGQ+CisgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZ2VuZXJhdGlvbiI+PGRpdj57e3JlcGxpY2F0aW9uLm1hc3Rlci5yZXBsaWNhYmxlR2VuZXJhdGlvbiB8fCAnLSd9fTwvZGl2PjwvdGQ+CisgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic2l6ZSI+PGRpdj4tPC9kaXY+PC90ZD4KKworICAgICAgICAgICAgPC90cj4KKworICAgICAgICAgICAgPHRyIGNsYXNzPSJtYXN0ZXJTZWFyY2giIG5nLXNob3c9ImlzU2xhdmUiPgorCisgICAgICAgICAgICAgIDx0aD5NYXN0ZXIgKFNlYXJjaGluZyk8L3RoPgorICAgICAgICAgICAgICA8dGQgY2xhc3M9InZlcnNpb24iPjxkaXY+e3tyZXBsaWNhdGlvbi5zbGF2ZS5tYXN0ZXJEZXRhaWxzLmluZGV4VmVyc2lvbn19PC9kaXY+PC90ZD4KKyAgICAgICAgICAgICAgPHRkIGNsYXNzPSJnZW5lcmF0aW9uIj48ZGl2Pnt7cmVwbGljYXRpb24uc2xhdmUubWFzdGVyRGV0YWlscy5nZW5lcmF0aW9ufX08L2Rpdj48L3RkPgorICAgICAgICAgICAgICA8dGQgY2xhc3M9InNpemUiPjxkaXY+e3tyZXBsaWNhdGlvbi5zbGF2ZS5tYXN0ZXJEZXRhaWxzLmluZGV4U2l6ZSB8fCAnLSd9fTwvZGl2PjwvdGQ+CisKKyAgICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICAgIDx0ciBjbGFzcz0ic2xhdmUgc2xhdmVPbmx5IiBuZy1zaG93PSJpc1NsYXZlIj4KKworICAgICAgICAgICAgICA8dGg+U2xhdmUgKFNlYXJjaGluZyk8L3RoPgorICAgICAgICAgICAgICA8dGQgY2xhc3M9InZlcnNpb24iPjxkaXY+e3tyZXBsaWNhdGlvbi5pbmRleFZlcnNpb259fTwvZGl2PjwvdGQ+CisgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZ2VuZXJhdGlvbiI+PGRpdj57e3JlcGxpY2F0aW9uLmdlbmVyYXRpb259fTwvZGl2PjwvdGQ+CisgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ic2l6ZSI+PGRpdj57e3JlcGxpY2F0aW9uLmluZGV4U2l6ZSB8fCAnLSd9fTwvZGl2PjwvdGQ+CisKKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPC90Ym9keT4KKworICAgICAgICA8L3RhYmxlPgorCisgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICAgIDxkaXYgY2xhc3M9ImJsb2NrIGZpZWxkbGlzdCIgaWQ9ImhlYWx0aGNoZWNrIiBuZy1jbGFzcz0ie2Rpc2FibGVkOiBoZWFsdGhjaGVja01lc3NhZ2V9Ij4KKworICAgICAgPGgyPjxzcGFuPkhlYWx0aGNoZWNrPC9zcGFuPjwvaDI+CisKKyAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UtY29udGFpbmVyIiBuZy1zaG93PSJoZWFsdGhjaGVja01lc3NhZ2UiPgorICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj57e2hlYWx0aGNoZWNrTWVzc2FnZX19PC9kaXY+CisgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iY29udGVudCIgbmctc2hvdz0iIWhlYWx0aGNoZWNrTWVzc2FnZSI+CisgICAgICAgIDxkbD4KKworICAgICAgICAgIDxkdCBjbGFzcz0ic3RhdHVzIj5TdGF0dXM6PC9kdD4KKyAgICAgICAgICA8ZGQgY2xhc3M9InN0YXR1cyB2YWx1ZSBpY28gaWNvLTEiIG5nLXNob3c9ImhlYWx0aGNoZWNrU3RhdHVzIj4KKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImhlYWx0aGNoZWNrLXN0YXR1cyBlbmFibGVkIj5IZWFsdGhjaGVjayBTdGF0dXM8L2J1dHRvbj4KKyAgICAgICAgICA8L2RkPgorICAgICAgICAgIDxkZCBjbGFzcz0ic3RhdHVzIHZhbHVlIGljbyBpY28tMCIgbmctc2hvdz0iIWhlYWx0aGNoZWNrU3RhdHVzIj4KKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImhlYWx0aGNoZWNrLXN0YXR1cyI+ZW5hYmxlIHBpbmc8L2J1dHRvbj4KKyAgICAgICAgICA8L2RkPgorICAgICAgICA8L2RsPgorICAgICAgPC9kaXY+CisKKyAgICA8L2Rpdj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0iY2xlYXJmaXgiPgorCisgICAgPGRpdiBjbGFzcz0iYmxvY2siIGlkPSJhZG1pbi1leHRyYSI+CisKKyAgICAgIDxoMj48c3Bhbj5BZG1pbiBFeHRyYTwvc3Bhbj48L2gyPgorCisgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRhaW5lciI+CisgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPjwvZGl2PgorICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorCisgICAgICA8L2Rpdj4KKworICAgIDwvZGl2PgorCisgIDwvZGl2PgorCisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL2NvcmVzLmh0bWwgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvY29yZXMuaHRtbAppbmRleCBlYjQ2OGZmLi43YTk4OWJhIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvY29yZXMuaHRtbAorKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvY29yZXMuaHRtbApAQCAtMSwyMzEgKzEsMjMxIEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZGl2IGlkPSJjb3JlcyIgY2xhc3M9ImNsZWFyZml4IGVtcHR5Ij4NCi0NCi0gIDxkaXYgaWQ9InVpLWJsb2NrIiBzdHlsZT0iZGlzcGxheTpub25lIj4mbmJzcDs8L2Rpdj48IS0tIEB0b2RvIHdoYXQgaXMgdGhpcyBmb3I/IC0tPg0KLQ0KLSAgPGRpdiBpZD0iZnJhbWUiPg0KLQ0KLSAgICA8ZGl2IGlkPSJhY3Rpb25zIiBjbGFzcz0iYWN0aW9ucyBjbGVhcmZpeCI+DQotDQotICAgICAgPGJ1dHRvbiBpZD0iYWRkIiBjbGFzcz0iYWN0aW9uIiBuZy1jbGljaz0ic2hvd0FkZENvcmUoKSI+PHNwYW4+QWRkIENvcmU8L3NwYW4+PC9idXR0b24+DQotICAgICAgPHNwYW4gbmctc2hvdz0iaGFzQ29yZXMiPg0KLSAgICAgIDxidXR0b24gaWQ9InVubG9hZCIgY2xhc3M9Indhcm4gcmVxdWlyZXMtY29yZSIgbmctY2xpY2s9InVubG9hZENvcmUoKSI+PHNwYW4+VW5sb2FkPC9zcGFuPjwvYnV0dG9uPg0KLSAgICAgIDxidXR0b24gaWQ9InJlbmFtZSIgY2xhc3M9ImFjdGlvbiByZXF1aXJlcy1jb3JlIiBuZy1jbGljaz0ic2hvd1JlbmFtZUNvcmUoKSI+PHNwYW4+UmVuYW1lPC9zcGFuPjwvYnV0dG9uPg0KLSAgICAgIDxidXR0b24gaWQ9InN3YXAiIGNsYXNzPSJhY3Rpb24gcmVxdWlyZXMtY29yZSIgbmctY2xpY2s9InNob3dTd2FwQ29yZXMoKSI+PHNwYW4+U3dhcDwvc3Bhbj48L2J1dHRvbj4NCi0gICAgICA8YnV0dG9uIGlkPSJyZWxvYWQiIGNsYXNzPSJyZXF1aXJlcy1jb3JlIiBuZy1jbGljaz0icmVsb2FkQ29yZSgpIg0KLSAgICAgICAgIG5nLWNsYXNzPSJ7c3VjY2VzczogcmVsb2FkU3VjY2Vzcywgd2FybjogcmVsb2FkRmFpbHVyZX0iPjxzcGFuPlJlbG9hZDwvc3Bhbj48L2J1dHRvbj4NCi0gICAgICA8YnV0dG9uIGlkPSJvcHRpbWl6ZSIgY2xhc3M9InJlcXVpcmVzLWNvcmUiIG5nLWNsaWNrPSJvcHRpbWl6ZUNvcmUoKSIgbmctc2hvdz0iY29yZS5pbmRleC5oYXNEZWxldGlvbnMgfHwgb3B0aW1pemVTdWNjZXNzIg0KLSAgICAgICAgIG5nLWNsYXNzPSJ7c3VjY2Vzczogb3B0aW1pemVTdWNjZXNzLCB3YXJuOiBvcHRpbWl6ZUZhaWx1cmV9Ij48c3Bhbj5PcHRpbWl6ZTwvc3Bhbj48L2J1dHRvbj4NCi0gICAgICA8L3NwYW4+DQotICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uIGFkZCIgZGF0YS1yZWw9ImFkZCIgbmctc2hvdz0ic2hvd0FkZCIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7bGVmdDowcHg7Ij4NCi0NCi0gICAgICAgIDxmb3JtPg0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9uYW1lIj5uYW1lOjwvbGFiZWw+DQotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJuYW1lIiBpZD0iYWRkX25hbWUiIG5nLW1vZGVsPSJuZXdDb3JlLm5hbWUiPjwvcD4NCi0NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJhZGRfaW5zdGFuY2VEaXIiPmluc3RhbmNlRGlyOjwvbGFiZWw+DQotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJpbnN0YW5jZURpciIgaWQ9ImFkZF9pbnN0YW5jZURpciIgbmctbW9kZWw9Im5ld0NvcmUuaW5zdGFuY2VEaXIiPjwvcD4NCi0NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJhZGRfZGF0YURpciI+ZGF0YURpcjo8L2xhYmVsPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZGF0YURpciIgaWQ9ImFkZF9kYXRhRGlyIiBuZy1tb2RlbD0ibmV3Q29yZS5kYXRhRGlyIj48L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWRkX2NvbmZpZyI+Y29uZmlnOjwvbGFiZWw+DQotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjb25maWciIGlkPSJhZGRfY29uZmlnIiBuZy1tb2RlbD0ibmV3Q29yZS5jb25maWciPjwvcD4NCi0NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJhZGRfc2NoZW1hIj5zY2hlbWE6PC9sYWJlbD4NCi0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InNjaGVtYSIgaWQ9ImFkZF9zY2hlbWEiIG5nLW1vZGVsPSJuZXdDb3JlLnNjaGVtYSI+PC9wPg0KLQ0KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJjbG91ZCIgbmctc2hvdz0iaXNDbG91ZCI+DQotDQotICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJhZGRfY29sbGVjdGlvbiI+Y29sbGVjdGlvbjo8L2xhYmVsPg0KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjb2xsZWN0aW9uIiBpZD0iYWRkX2NvbGxlY3Rpb24iIG5nLW1vZGVsPSJuZXdDb3JlLmNvbGxlY3Rpb24iPjwvcD4NCi0NCi0gICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9zaGFyZCI+c2hhcmQ6PC9sYWJlbD4NCi0gICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYWRkX3NoYXJkIiBpZD0iYWRkX3NoYXJkIiBuZy1tb2RlbD0ibmV3Q29yZS5zaGFyZCI+PC9wPg0KLQ0KLSAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IG5vdGUgZGlyZWN0b3J5LW5vdGUiPg0KLQ0KLSAgICAgICAgICAgIDxzcGFuPjxjb2RlPmluc3RhbmNlRGlyPC9jb2RlPiBhbmQgPGNvZGU+ZGF0YURpcjwvY29kZT4gbmVlZCB0byBleGlzdCBiZWZvcmUgeW91IGNhbiBjcmVhdGUgdGhlIGNvcmU8L3NwYW4+DQotDQotICAgICAgICAgIDwvcD4NCi0NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiIG5nLXNob3c9ImFkZE1lc3NhZ2UiPg0KLSAgICAgICAgICAgIDxzcGFuPnt7YWRkTWVzc2FnZX19PC9zcGFuPg0KLSAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBidXR0b25zIj4NCi0gICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgbmctY2xpY2s9ImFkZENvcmUoKSI+PHNwYW4+QWRkIENvcmU8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJyZXNldCIgY2xhc3M9InJlc2V0IiBuZy1jbGljaz0iY2FuY2VsQWRkQ29yZSgpIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgIDwvcD4NCi0NCi0gICAgICAgIDwvZm9ybT4NCi0NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24gcmVuYW1lIiBuZy1zaG93PSJzaG93UmVuYW1lIj4NCi0NCi0gICAgICAgIDxmb3JtPg0KLQ0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjb3JlIiBkYXRhLWNvcmU9ImN1cnJlbnQiPg0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9InJlbmFtZV9vdGhlciI+TmV3IE5hbWU6PC9sYWJlbD4NCi0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im90aGVyIiBuZy1tb2RlbD0ib3RoZXIiIGlkPSJyZW5hbWVfb3RoZXIiPjwvcD4NCi0NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiIG5nLXNob3c9InJlbmFtZU1lc3NhZ2UiPg0KLSAgICAgICAgICAgIDxzcGFuPnt7cmVuYW1lTWVzc2FnZX19PC9zcGFuPg0KLSAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBidXR0b25zIj4NCi0gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJzdWJtaXQiIG5nLWNsaWNrPSJyZW5hbWVDb3JlKCkiPjxzcGFuPlJlbmFtZSBDb3JlPC9zcGFuPjwvYnV0dG9uPg0KLSAgICAgICAgICAgIDxidXR0b24gdHlwZT0icmVzZXQiIGNsYXNzPSJyZXNldCIgbmctY2xpY2s9ImNhbmNlbFJlbmFtZUNvcmUoKSI+PHNwYW4+Q2FuY2VsPC9zcGFuPjwvYnV0dG9uPg0KLSAgICAgICAgICA8L3A+DQotICAgICAgICA8L2Zvcm0+DQotDQotICAgICAgPC9kaXY+DQotDQotICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uIHN3YXAiIG5nLXNob3c9InNob3dTd2FwIj4NCi0NCi0gICAgICAgIDxmb3JtPg0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9InN3YXBfY29yZSI+dGhpczo8L2xhYmVsPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InN3YXBfY29yZSIgbmFtZT0iY29yZSIgbmctbW9kZWw9InNlbGVjdGVkQ29yZSIgcmVhZG9ubHk9InJlYWRvbmx5Ij48L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0ic3dhcF9vdGhlciI+YW5kOjwvbGFiZWw+DQotICAgICAgICAgIDxzZWxlY3QgaWQ9InN3YXBfb3RoZXIiIG5nLW1vZGVsPSJzd2FwT3RoZXIiIG5nLW9wdGlvbnM9ImNvcmUubmFtZSBhcyBjb3JlLm5hbWUgZm9yIGNvcmUgaW4gc3dhcENvcmVsaXN0IiBjbGFzcz0ib3RoZXIiPg0KLSAgICAgICAgICA8L3NlbGVjdD48L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBub3RlIGVycm9yIiBuZy1zaG93PSJzd2FwTWVzc2FnZSI+DQotICAgICAgICAgICAgPHNwYW4+e3tzd2FwTWVzc2FnZX19PC9zcGFuPg0KLSAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBidXR0b25zIj4NCi0gICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgbmctY2xpY2s9InN3YXBDb3JlcygpIj48c3Bhbj5Td2FwIENvcmVzPC9zcGFuPjwvYnV0dG9uPg0KLSAgICAgICAgICAgIDxidXR0b24gdHlwZT0icmVzZXQiIGNsYXNzPSJyZXNldCIgbmctY2xpY2s9ImNhbmNlbFN3YXBDb3JlcygpIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgIDwvcD4NCi0NCi0gICAgICAgIDwvZm9ybT4NCi0NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgPC9kaXY+DQotDQotICAgIDxkaXYgaWQ9ImRhdGEiIGNsYXNzPSJyZXF1aXJlcy1jb3JlIiBuZy1zaG93PSJoYXNDb3JlcyI+DQotDQotICAgICAgPGRpdiBjbGFzcz0iYmxvY2siIGlkPSJjb3JlLWRhdGEiPg0KLQ0KLSAgICAgICAgICA8aDI+PHNwYW4+Q29yZTwvc3Bhbj48L2gyPg0KLQ0KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRhaW5lciI+DQotICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj48L2Rpdj4NCi0gICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgICA8dWw+DQotDQotICAgICAgICAgICAgPGxpIGNsYXNzPSJzdGFydFRpbWUiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgPGR0PjxzcGFuPnN0YXJ0VGltZTo8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgPGRkIGNsYXNzPSJ0aW1lYWdvIj57e2NvcmUuc3RhcnRUaW1lIHwgdGltZWFnb319PC9kZD4NCi0gICAgICAgICAgICA8L2RsPjwvbGk+DQotDQotICAgICAgICAgICAgPGxpIGNsYXNzPSJpbnN0YW5jZURpciI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgICA8ZHQ+PHNwYW4+aW5zdGFuY2VEaXI6PC9zcGFuPjwvZHQ+DQotICAgICAgICAgICAgICAgIDxkZD57e2NvcmUuaW5zdGFuY2VEaXJ9fTwvZGQ+DQotICAgICAgICAgICAgPC9kbD48L2xpPg0KLQ0KLSAgICAgICAgICAgIDxsaSBjbGFzcz0iZGF0YURpciI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgICA8ZHQ+PHNwYW4+ZGF0YURpcjo8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgPGRkPnt7Y29yZS5kYXRhRGlyfX08L2RkPg0KLSAgICAgICAgICAgIDwvZGw+PC9saT4NCi0NCi0gICAgICAgICAgPC91bD4NCi0NCi0gICAgICAgIDwvZGl2Pg0KLSAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgIDxkaXYgY2xhc3M9ImJsb2NrIiBpZD0iaW5kZXgtZGF0YSIgbmctc2hvdz0iaGFzQ29yZXMiPg0KLQ0KLSAgICAgICAgICA8aDI+PHNwYW4+SW5kZXg8L3NwYW4+PC9oMj4NCi0NCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiPg0KLSAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+e3tjb3JlLm1lc3NhZ2V9fTwvZGl2Pg0KLSAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+DQotDQotICAgICAgICAgIDx1bD4NCi0NCi0gICAgICAgICAgICA8bGkgY2xhc3M9Imxhc3RNb2RpZmllZCI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgICA8ZHQ+PHNwYW4+bGFzdE1vZGlmaWVkOjwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICA8ZGQgY2xhc3M9InRpbWVhZ28iPnt7Y29yZS5pbmRleC5sYXN0TW9kaWZpZWQgfCB0aW1lYWdvfX08L2RkPg0KLSAgICAgICAgICAgIDwvZGw+PC9saT4NCi0NCi0gICAgICAgICAgICA8bGkgY2xhc3M9InZlcnNpb24iPjxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgPGR0PjxzcGFuPnZlcnNpb246PC9zcGFuPjwvZHQ+DQotICAgICAgICAgICAgICAgIDxkZD57e2NvcmUuaW5kZXgudmVyc2lvbn19PC9kZD4NCi0gICAgICAgICAgICA8L2RsPjwvbGk+DQotDQotICAgICAgICAgICAgPGxpIGNsYXNzPSJudW1Eb2NzIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgIDxkdD48c3Bhbj5udW1Eb2NzOjwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICA8ZGQ+e3tjb3JlLmluZGV4Lm51bURvY3N9fTwvZGQ+DQotICAgICAgICAgICAgPC9kbD48L2xpPg0KLQ0KLSAgICAgICAgICAgIDxsaSBjbGFzcz0ibWF4RG9jIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgIDxkdD48c3Bhbj5tYXhEb2M6PC9zcGFuPjwvZHQ+DQotICAgICAgICAgICAgICAgIDxkZD57e2NvcmUuaW5kZXgubWF4RG9jfX08L2RkPg0KLSAgICAgICAgICAgIDwvZGw+PC9saT4NCi0NCi0gICAgICAgICAgICA8bGkgY2xhc3M9ImRlbGV0ZWREb2NzIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgIDxkdD48c3Bhbj5kZWxldGVkRG9jczo8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgPGRkPnt7Y29yZS5pbmRleC5kZWxldGVkRG9jc319PC9kZD4NCi0gICAgICAgICAgICA8L2RsPjwvbGk+DQotDQotICAgICAgICAgICAgPGxpIGNsYXNzPSJvcHRpbWl6ZWQiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgPGR0PjxzcGFuPm9wdGltaXplZDo8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgPGRkIGNsYXNzPSJpY28iIG5nLWNsYXNzPSJjb3JlLmluZGV4Lmhhc0RlbGV0aW9ucyA/ICdpY28tMCcgOiAnaWNvLTEnIj48c3Bhbj48L3NwYW4+PC9kZD4NCi0gICAgICAgICAgICA8L2RsPjwvbGk+DQotDQotICAgICAgICAgICAgPGxpIGNsYXNzPSJjdXJyZW50Ij48ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgIDxkdD48c3Bhbj5jdXJyZW50Ojwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICA8ZGQgY2xhc3M9ImljbyIgbmctY2xhc3M9ImNvcmUuaW5kZXguY3VycmVudCA/J2ljby0xJyA6ICdpY28tMCciPjxzcGFuPjwvc3Bhbj48L2RkPg0KLSAgICAgICAgICAgIDwvZGw+PC9saT4NCi0NCi0gICAgICAgICAgICA8bGkgY2xhc3M9ImRpcmVjdG9yeSI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgICA8ZHQ+PHNwYW4+ZGlyZWN0b3J5Ojwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICA8ZGQ+e3tjb3JlLmluZGV4LmRpcmVjdG9yeX19PC9kZD4NCi0gICAgICAgICAgICA8L2RsPjwvbGk+DQotDQotICAgICAgICAgIDwvdWw+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgPC9kaXY+DQotDQotICA8L2Rpdj4NCi0NCi0gIDxkaXYgaWQ9Im5hdmlnYXRpb24iIGNsYXNzPSJyZXF1aXJlcy1jb3JlIGNsZWFyZml4IiBuZy1zaG93PSJoYXNDb3JlcyI+DQotICAgIDx1bD4NCi0gICAgICA8bGkgbmctcmVwZWF0PSJjIGluIGNvcmVzIiBuZy1jbGFzcz0ie2N1cnJlbnQ6IGNvcmUubmFtZSA9PSBjLm5hbWV9Ij48YSBocmVmPSIjfmNvcmVzL3t7Yy5uYW1lfX0iPnt7Yy5uYW1lfX08L2E+PC9saT4NCi0gICAgPC91bD4NCi0gIDwvZGl2Pg0KLQ0KLTwvZGl2Pg0KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRpdiBpZD0iY29yZXMiIGNsYXNzPSJjbGVhcmZpeCBlbXB0eSI+CisKKyAgPGRpdiBpZD0idWktYmxvY2siIHN0eWxlPSJkaXNwbGF5Om5vbmUiPiZuYnNwOzwvZGl2PjwhLS0gQHRvZG8gd2hhdCBpcyB0aGlzIGZvcj8gLS0+CisKKyAgPGRpdiBpZD0iZnJhbWUiPgorCisgICAgPGRpdiBpZD0iYWN0aW9ucyIgY2xhc3M9ImFjdGlvbnMgY2xlYXJmaXgiPgorCisgICAgICA8YnV0dG9uIGlkPSJhZGQiIGNsYXNzPSJhY3Rpb24iIG5nLWNsaWNrPSJzaG93QWRkQ29yZSgpIj48c3Bhbj5BZGQgQ29yZTwvc3Bhbj48L2J1dHRvbj4KKyAgICAgIDxzcGFuIG5nLXNob3c9Imhhc0NvcmVzIj4KKyAgICAgIDxidXR0b24gaWQ9InVubG9hZCIgY2xhc3M9Indhcm4gcmVxdWlyZXMtY29yZSIgbmctY2xpY2s9InVubG9hZENvcmUoKSI+PHNwYW4+VW5sb2FkPC9zcGFuPjwvYnV0dG9uPgorICAgICAgPGJ1dHRvbiBpZD0icmVuYW1lIiBjbGFzcz0iYWN0aW9uIHJlcXVpcmVzLWNvcmUiIG5nLWNsaWNrPSJzaG93UmVuYW1lQ29yZSgpIj48c3Bhbj5SZW5hbWU8L3NwYW4+PC9idXR0b24+CisgICAgICA8YnV0dG9uIGlkPSJzd2FwIiBjbGFzcz0iYWN0aW9uIHJlcXVpcmVzLWNvcmUiIG5nLWNsaWNrPSJzaG93U3dhcENvcmVzKCkiPjxzcGFuPlN3YXA8L3NwYW4+PC9idXR0b24+CisgICAgICA8YnV0dG9uIGlkPSJyZWxvYWQiIGNsYXNzPSJyZXF1aXJlcy1jb3JlIiBuZy1jbGljaz0icmVsb2FkQ29yZSgpIgorICAgICAgICAgbmctY2xhc3M9IntzdWNjZXNzOiByZWxvYWRTdWNjZXNzLCB3YXJuOiByZWxvYWRGYWlsdXJlfSI+PHNwYW4+UmVsb2FkPC9zcGFuPjwvYnV0dG9uPgorICAgICAgPGJ1dHRvbiBpZD0ib3B0aW1pemUiIGNsYXNzPSJyZXF1aXJlcy1jb3JlIiBuZy1jbGljaz0ib3B0aW1pemVDb3JlKCkiIG5nLXNob3c9ImNvcmUuaW5kZXguaGFzRGVsZXRpb25zIHx8IG9wdGltaXplU3VjY2VzcyIKKyAgICAgICAgIG5nLWNsYXNzPSJ7c3VjY2Vzczogb3B0aW1pemVTdWNjZXNzLCB3YXJuOiBvcHRpbWl6ZUZhaWx1cmV9Ij48c3Bhbj5PcHRpbWl6ZTwvc3Bhbj48L2J1dHRvbj4KKyAgICAgIDwvc3Bhbj4KKyAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbiBhZGQiIGRhdGEtcmVsPSJhZGQiIG5nLXNob3c9InNob3dBZGQiIHN0eWxlPSJkaXNwbGF5OmJsb2NrO2xlZnQ6MHB4OyI+CisKKyAgICAgICAgPGZvcm0+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9uYW1lIj5uYW1lOjwvbGFiZWw+CisgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5hbWUiIGlkPSJhZGRfbmFtZSIgbmctbW9kZWw9Im5ld0NvcmUubmFtZSI+PC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJhZGRfaW5zdGFuY2VEaXIiPmluc3RhbmNlRGlyOjwvbGFiZWw+CisgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Imluc3RhbmNlRGlyIiBpZD0iYWRkX2luc3RhbmNlRGlyIiBuZy1tb2RlbD0ibmV3Q29yZS5pbnN0YW5jZURpciI+PC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJhZGRfZGF0YURpciI+ZGF0YURpcjo8L2xhYmVsPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJkYXRhRGlyIiBpZD0iYWRkX2RhdGFEaXIiIG5nLW1vZGVsPSJuZXdDb3JlLmRhdGFEaXIiPjwvcD4KKworICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWRkX2NvbmZpZyI+Y29uZmlnOjwvbGFiZWw+CisgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNvbmZpZyIgaWQ9ImFkZF9jb25maWciIG5nLW1vZGVsPSJuZXdDb3JlLmNvbmZpZyI+PC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJhZGRfc2NoZW1hIj5zY2hlbWE6PC9sYWJlbD4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic2NoZW1hIiBpZD0iYWRkX3NjaGVtYSIgbmctbW9kZWw9Im5ld0NvcmUuc2NoZW1hIj48L3A+CisKKyAgICAgICAgICA8ZGl2IGNsYXNzPSJjbG91ZCIgbmctc2hvdz0iaXNDbG91ZCI+CisKKyAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWRkX2NvbGxlY3Rpb24iPmNvbGxlY3Rpb246PC9sYWJlbD4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjb2xsZWN0aW9uIiBpZD0iYWRkX2NvbGxlY3Rpb24iIG5nLW1vZGVsPSJuZXdDb3JlLmNvbGxlY3Rpb24iPjwvcD4KKworICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJhZGRfc2hhcmQiPnNoYXJkOjwvbGFiZWw+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYWRkX3NoYXJkIiBpZD0iYWRkX3NoYXJkIiBuZy1tb2RlbD0ibmV3Q29yZS5zaGFyZCI+PC9wPgorCisgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXggbm90ZSBkaXJlY3Rvcnktbm90ZSI+CisKKyAgICAgICAgICAgIDxzcGFuPjxjb2RlPmluc3RhbmNlRGlyPC9jb2RlPiBhbmQgPGNvZGU+ZGF0YURpcjwvY29kZT4gbmVlZCB0byBleGlzdCBiZWZvcmUgeW91IGNhbiBjcmVhdGUgdGhlIGNvcmU8L3NwYW4+CisKKyAgICAgICAgICA8L3A+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXggbm90ZSBlcnJvciIgbmctc2hvdz0iYWRkTWVzc2FnZSI+CisgICAgICAgICAgICA8c3Bhbj57e2FkZE1lc3NhZ2V9fTwvc3Bhbj4KKyAgICAgICAgICA8L3A+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXggYnV0dG9ucyI+CisgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgbmctY2xpY2s9ImFkZENvcmUoKSI+PHNwYW4+QWRkIENvcmU8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InJlc2V0IiBjbGFzcz0icmVzZXQiIG5nLWNsaWNrPSJjYW5jZWxBZGRDb3JlKCkiPjxzcGFuPkNhbmNlbDwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICA8L3A+CisKKyAgICAgICAgPC9mb3JtPgorCisgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uIHJlbmFtZSIgbmctc2hvdz0ic2hvd1JlbmFtZSI+CisKKyAgICAgICAgPGZvcm0+CisKKyAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjb3JlIiBkYXRhLWNvcmU9ImN1cnJlbnQiPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJyZW5hbWVfb3RoZXIiPk5ldyBOYW1lOjwvbGFiZWw+CisgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im90aGVyIiBuZy1tb2RlbD0ib3RoZXIiIGlkPSJyZW5hbWVfb3RoZXIiPjwvcD4KKworICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBub3RlIGVycm9yIiBuZy1zaG93PSJyZW5hbWVNZXNzYWdlIj4KKyAgICAgICAgICAgIDxzcGFuPnt7cmVuYW1lTWVzc2FnZX19PC9zcGFuPgorICAgICAgICAgIDwvcD4KKworICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBidXR0b25zIj4KKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InN1Ym1pdCIgbmctY2xpY2s9InJlbmFtZUNvcmUoKSI+PHNwYW4+UmVuYW1lIENvcmU8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InJlc2V0IiBjbGFzcz0icmVzZXQiIG5nLWNsaWNrPSJjYW5jZWxSZW5hbWVDb3JlKCkiPjxzcGFuPkNhbmNlbDwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICA8L3A+CisgICAgICAgIDwvZm9ybT4KKworICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbiBzd2FwIiBuZy1zaG93PSJzaG93U3dhcCI+CisKKyAgICAgICAgPGZvcm0+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9InN3YXBfY29yZSI+dGhpczo8L2xhYmVsPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ic3dhcF9jb3JlIiBuYW1lPSJjb3JlIiBuZy1tb2RlbD0ic2VsZWN0ZWRDb3JlIiByZWFkb25seT0icmVhZG9ubHkiPjwvcD4KKworICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0ic3dhcF9vdGhlciI+YW5kOjwvbGFiZWw+CisgICAgICAgICAgPHNlbGVjdCBpZD0ic3dhcF9vdGhlciIgbmctbW9kZWw9InN3YXBPdGhlciIgbmctb3B0aW9ucz0iY29yZS5uYW1lIGFzIGNvcmUubmFtZSBmb3IgY29yZSBpbiBzd2FwQ29yZWxpc3QiIGNsYXNzPSJvdGhlciI+CisgICAgICAgICAgPC9zZWxlY3Q+PC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiIG5nLXNob3c9InN3YXBNZXNzYWdlIj4KKyAgICAgICAgICAgIDxzcGFuPnt7c3dhcE1lc3NhZ2V9fTwvc3Bhbj4KKyAgICAgICAgICA8L3A+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXggYnV0dG9ucyI+CisgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgbmctY2xpY2s9InN3YXBDb3JlcygpIj48c3Bhbj5Td2FwIENvcmVzPC9zcGFuPjwvYnV0dG9uPgorICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJyZXNldCIgY2xhc3M9InJlc2V0IiBuZy1jbGljaz0iY2FuY2VsU3dhcENvcmVzKCkiPjxzcGFuPkNhbmNlbDwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICA8L3A+CisKKyAgICAgICAgPC9mb3JtPgorCisgICAgICA8L2Rpdj4KKworICAgIDwvZGl2PgorCisgICAgPGRpdiBpZD0iZGF0YSIgY2xhc3M9InJlcXVpcmVzLWNvcmUiIG5nLXNob3c9Imhhc0NvcmVzIj4KKworICAgICAgPGRpdiBjbGFzcz0iYmxvY2siIGlkPSJjb3JlLWRhdGEiPgorCisgICAgICAgICAgPGgyPjxzcGFuPkNvcmU8L3NwYW4+PC9oMj4KKworICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UtY29udGFpbmVyIj4KKyAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+PC9kaXY+CisgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKworICAgICAgICAgIDx1bD4KKworICAgICAgICAgICAgPGxpIGNsYXNzPSJzdGFydFRpbWUiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICA8ZHQ+PHNwYW4+c3RhcnRUaW1lOjwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgIDxkZCBjbGFzcz0idGltZWFnbyI+e3tjb3JlLnN0YXJ0VGltZSB8IHRpbWVhZ299fTwvZGQ+CisgICAgICAgICAgICA8L2RsPjwvbGk+CisKKyAgICAgICAgICAgIDxsaSBjbGFzcz0iaW5zdGFuY2VEaXIiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICA8ZHQ+PHNwYW4+aW5zdGFuY2VEaXI6PC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgPGRkPnt7Y29yZS5pbnN0YW5jZURpcn19PC9kZD4KKyAgICAgICAgICAgIDwvZGw+PC9saT4KKworICAgICAgICAgICAgPGxpIGNsYXNzPSJkYXRhRGlyIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgPGR0PjxzcGFuPmRhdGFEaXI6PC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgPGRkPnt7Y29yZS5kYXRhRGlyfX08L2RkPgorICAgICAgICAgICAgPC9kbD48L2xpPgorCisgICAgICAgICAgPC91bD4KKworICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJibG9jayIgaWQ9ImluZGV4LWRhdGEiIG5nLXNob3c9Imhhc0NvcmVzIj4KKworICAgICAgICAgIDxoMj48c3Bhbj5JbmRleDwvc3Bhbj48L2gyPgorCisgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiPgorICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj57e2NvcmUubWVzc2FnZX19PC9kaXY+CisgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKworICAgICAgICAgIDx1bD4KKworICAgICAgICAgICAgPGxpIGNsYXNzPSJsYXN0TW9kaWZpZWQiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICA8ZHQ+PHNwYW4+bGFzdE1vZGlmaWVkOjwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgIDxkZCBjbGFzcz0idGltZWFnbyI+e3tjb3JlLmluZGV4Lmxhc3RNb2RpZmllZCB8IHRpbWVhZ299fTwvZGQ+CisgICAgICAgICAgICA8L2RsPjwvbGk+CisKKyAgICAgICAgICAgIDxsaSBjbGFzcz0idmVyc2lvbiI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICAgIDxkdD48c3Bhbj52ZXJzaW9uOjwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgIDxkZD57e2NvcmUuaW5kZXgudmVyc2lvbn19PC9kZD4KKyAgICAgICAgICAgIDwvZGw+PC9saT4KKworICAgICAgICAgICAgPGxpIGNsYXNzPSJudW1Eb2NzIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgPGR0PjxzcGFuPm51bURvY3M6PC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgPGRkPnt7Y29yZS5pbmRleC5udW1Eb2NzfX08L2RkPgorICAgICAgICAgICAgPC9kbD48L2xpPgorCisgICAgICAgICAgICA8bGkgY2xhc3M9Im1heERvYyI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICAgIDxkdD48c3Bhbj5tYXhEb2M6PC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgPGRkPnt7Y29yZS5pbmRleC5tYXhEb2N9fTwvZGQ+CisgICAgICAgICAgICA8L2RsPjwvbGk+CisKKyAgICAgICAgICAgIDxsaSBjbGFzcz0iZGVsZXRlZERvY3MiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICA8ZHQ+PHNwYW4+ZGVsZXRlZERvY3M6PC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgPGRkPnt7Y29yZS5pbmRleC5kZWxldGVkRG9jc319PC9kZD4KKyAgICAgICAgICAgIDwvZGw+PC9saT4KKworICAgICAgICAgICAgPGxpIGNsYXNzPSJvcHRpbWl6ZWQiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICA8ZHQ+PHNwYW4+b3B0aW1pemVkOjwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgIDxkZCBjbGFzcz0iaWNvIiBuZy1jbGFzcz0iY29yZS5pbmRleC5oYXNEZWxldGlvbnMgPyAnaWNvLTAnIDogJ2ljby0xJyI+PHNwYW4+PC9zcGFuPjwvZGQ+CisgICAgICAgICAgICA8L2RsPjwvbGk+CisKKyAgICAgICAgICAgIDxsaSBjbGFzcz0iY3VycmVudCI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICAgIDxkdD48c3Bhbj5jdXJyZW50Ojwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgIDxkZCBjbGFzcz0iaWNvIiBuZy1jbGFzcz0iY29yZS5pbmRleC5jdXJyZW50ID8naWNvLTEnIDogJ2ljby0wJyI+PHNwYW4+PC9zcGFuPjwvZGQ+CisgICAgICAgICAgICA8L2RsPjwvbGk+CisKKyAgICAgICAgICAgIDxsaSBjbGFzcz0iZGlyZWN0b3J5Ij48ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgPGR0PjxzcGFuPmRpcmVjdG9yeTo8L3NwYW4+PC9kdD4KKyAgICAgICAgICAgICAgICA8ZGQ+e3tjb3JlLmluZGV4LmRpcmVjdG9yeX19PC9kZD4KKyAgICAgICAgICAgIDwvZGw+PC9saT4KKworICAgICAgICAgIDwvdWw+CisKKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKworICAgIDwvZGl2PgorCisgIDwvZGl2PgorCisgIDxkaXYgaWQ9Im5hdmlnYXRpb24iIGNsYXNzPSJyZXF1aXJlcy1jb3JlIGNsZWFyZml4IiBuZy1zaG93PSJoYXNDb3JlcyI+CisgICAgPHVsPgorICAgICAgPGxpIG5nLXJlcGVhdD0iYyBpbiBjb3JlcyIgbmctY2xhc3M9IntjdXJyZW50OiBjb3JlLm5hbWUgPT0gYy5uYW1lfSI+PGEgaHJlZj0iI35jb3Jlcy97e2MubmFtZX19Ij57e2MubmFtZX19PC9hPjwvbGk+CisgICAgPC91bD4KKyAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL2RhdGFpbXBvcnQuaHRtbCBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9kYXRhaW1wb3J0Lmh0bWwKaW5kZXggZjRiOWQ2Yi4uMjNkMDBkNCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL2RhdGFpbXBvcnQuaHRtbAorKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvZGF0YWltcG9ydC5odG1sCkBAIC0xLDIwOSArMSwyMDkgQEAKLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxkaXYgaWQ9ImRhdGFpbXBvcnQiIGNsYXNzPSJjbGVhcmZpeCI+DQotDQotICA8ZGl2IG5nLXNob3c9IiFoYXNIYW5kbGVycyI+U29ycnksIG5vIGRhdGFpbXBvcnQtaGFuZGxlciBkZWZpbmVkITwvZGl2Pg0KLSAgPGRpdiBpZD0iZnJhbWUiIG5nLXNob3c9Imhhc0hhbmRsZXJzIj4NCi0NCi0gICAgPGRpdiBpZD0iZXJyb3IiIG5nLXNob3c9ImVycm9yIj48L2Rpdj4NCi0NCi0gICAgPGRpdiBpZD0iY3VycmVudF9zdGF0ZSIgY2xhc3M9Int7c3RhdHVzfX0iPg0KLQ0KLSAgICAgIDxwIGNsYXNzPSJsYXN0X3VwZGF0ZSI+TGFzdCBVcGRhdGU6IDxhYmJyIHRpdGxlPSJ7e2xhc3RVcGRhdGVVVEN9fSI+e3tsYXN0VXBkYXRlfX08L2FiYnI+PC9wPg0KLSAgICAgIDxkaXYgY2xhc3M9ImluZm8iPg0KLQ0KLSAgICAgICAgPHN0cm9uZz57e2luZm8udGV4dH19PHNwYW4gbmctc2hvdz0iaW5mby50aW1lVGFrZW4iPiAoRHVyYXRpb246IHt7aW5mby50aW1lVGFrZW4gfCByZWFkYWJsZVNlY29uZHMgfX0pPC9zcGFuPg0KLSAgICAgICAgPC9zdHJvbmc+DQotICAgICAgICA8ZGl2IGNsYXNzPSJkZXRhaWxzIiBuZy1zaG93PSJpbmZvLnNob3dEZXRhaWxzIj4NCi0gICAgICAgICAgPGRpdiBjbGFzcz0iZG9jcyI+DQotICAgICAgICAgICAgICA8c3BhbiBuZy1yZXBlYXQ9ImRvYyBpbiBpbmZvLmRvY3MiPg0KLSAgICAgICAgICAgICAgICAgIDxhYmJyIHN0eWxlPSJkaXNwbGF5OmlubGluZSIgdGl0bGU9Int7IGRvYy5kZXNjIH19Ij57eyBkb2MubmFtZSB9fTwvYWJicj46IHt7ZG9jLnZhbHVlIHwgbnVtYmVyfX08IS0tIHJlbW92ZSB3aGl0ZXNwYWNlIQ0KLSAgICAgICAgICAgICAgICAgIC0tPiZuYnNwOzxzcGFuIHN0eWxlPSJkaXNwbGF5OmlubGluZSIgbmctc2hvdz0iZG9jLnNwZWVkIj57eyBkb2Muc3BlZWQgfCBudW1iZXJ9fS9zPC9zcGFuPjwhLS0gcmVtb3ZlIHdoaXRlc3BhY2UhDQotICAgICAgICAgICAgICAgICAgLS0+PHNwYW4gc3R5bGU9ImRpc3BsYXk6aW5saW5lIiBuZy1zaG93PSIhJGxhc3QiPiwgPC9zcGFuPg0KLSAgICAgICAgICAgICAgPC9zcGFuPg0KLSAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgPGRpdiBjbGFzcz0iZGF0ZXMiPg0KLSAgICAgICAgICAgICAgPHNwYW4gbmctcmVwZWF0PSJkYXRlIGluIGluZm8uZGF0ZXMiPg0KLSAgICAgICAgICAgICAgICAgIDxhYmJyIHRpdGxlPSJ7eyBkYXRlLmRlc2MgfX0iPnt7IGRhdGUubmFtZSB9fTwvYWJicj46DQotICAgICAgICAgICAgICAgICAgPGFiYnIgY2xhc3M9InRpbWUiPnt7IGRhdGUudmFsdWUgfCB0aW1lYWdvIH19PC9hYmJyPg0KLSAgICAgICAgICAgICAgPC9zcGFuPg0KLSAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWJvcnQtaW1wb3J0IiBuZy1jbGFzcz0ie3dhcm46IWlzQWJvcnRpbmcsIHN1Y2Nlc3M6IGlzQWJvcnRpbmd9IiBuZy1jbGljaz0iYWJvcnQoKSIgbmctc2hvdz0iaXNSdW5uaW5nIj4NCi0gICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJpc0Fib3J0aW5nIj5BYm9ydGluZyBJbXBvcnQ8L3NwYW4+DQotICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iIWlzQWJvcnRpbmciPkFib3J0IEltcG9ydDwvc3Bhbj4NCi0gICAgICAgIDwvYnV0dG9uPg0KLQ0KLSAgICAgIDwvZGl2Pg0KLSAgICANCi0gICAgPC9kaXY+DQotDQotICAgIDxkaXYgY2xhc3M9ImJsb2NrIiBpZD0icmF3X291dHB1dCIgPg0KLQ0KLSAgICAgIDxoMj4NCi0gICAgICAgIDxhIGNsYXNzPSJ0b2dnbGUiIG5nLWNsaWNrPSJ0b2dnbGVSYXdTdGF0dXMoKSI+PHNwYW4+UmF3IFN0YXR1cy1PdXRwdXQ8L3NwYW4+PC9hPg0KLSAgICAgIDwvaDI+DQotICAgICAgICANCi0gICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRhaW5lciIgbmctc2hvdz0ic2hvd1Jhd1N0YXR1cyI+DQotICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPjwvZGl2Pg0KLSAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiIG5nLXNob3c9InNob3dSYXdTdGF0dXMiPg0KLQ0KLSAgICAgICAgPGRpdiBpZD0icmF3X291dHB1dF9jb250YWluZXIiPjxwcmUgY2xhc3M9InN5bnRheCBsYW5ndWFnZS1qc29uIj48Y29kZSBuZy1iaW5kLWh0bWw9InJhd1N0YXR1cyB8IGhpZ2hsaWdodDonanNvbicgfCB1bnNhZmUiPjwvY29kZT48L3ByZT48L2Rpdj4NCi0NCi0gICAgICA8L2Rpdj4NCi0gICAgDQotICAgIDwvZGl2Pg0KLQ0KLSAgICA8ZGl2IGNsYXNzPSJibG9jayIgaWQ9ImNvbmZpZyIgbmctY2xhc3M9IntkZWJ1Z19tb2RlOmlzRGVidWdNb2RlfSI+DQotDQotICAgICAgPGgyIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICA8YSBjbGFzcz0idG9nZ2xlIiBuZy1jbGljaz0idG9nZ2xlQ29uZmlndXJhdGlvbigpIj48c3Bhbj5Db25maWd1cmF0aW9uPC9zcGFuPjwvYT4NCi0gICAgICAgIDxhIGNsYXNzPSJyIHJlbG9hZF9jb25maWciIG5nLWNsYXNzPSJ7c3VjY2VzczpyZWxvYWRlZH0iIG5nLWNsaWNrPSJyZWxvYWQoKSIgdGl0bGU9IlJlbG9hZCBDb25maWd1cmF0aW9uIj5SZWxvYWQ8L2E+DQotICAgICAgICA8YSBjbGFzcz0iciBkZWJ1Z19tb2RlIiBuZy1jbGljaz0idG9nZ2xlRGVidWcoKSI+RGVidWctTW9kZTwvYT4NCi0gICAgICA8L2gyPg0KLSAgICAgICAgDQotICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiIG5nLXNob3c9InNob3dDb25maWd1cmF0aW9uIj4NCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+PC9kaXY+DQotICAgICAgPC9kaXY+DQotDQotICAgICAgPGRpdiBjbGFzcz0iY29udGVudCIgbmctc2hvdz0ic2hvd0NvbmZpZ3VyYXRpb24iPg0KLSAgICAgICAgPGRpdiBpZD0iZGF0YWltcG9ydF9jb25maWciPg0KLQ0KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtYXR0ZWQiIG5nLXNob3c9IiFpc0RlYnVnTW9kZSI+DQotDQotICAgICAgICAgICAgPHByZSBjbGFzcz0ic3ludGF4IGxhbmd1YWdlLXhtbCI+PGNvZGUgbmctYmluZC1odG1sPSJjb25maWcgfCBoaWdobGlnaHQ6J3htbCd8IHVuc2FmZSI+PC9jb2RlPjwvcHJlPg0KLQ0KLSAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgPGRpdiBjbGFzcz0iZWRpdGFibGUiIG5nLXNob3c9ImlzRGVidWdNb2RlIj4NCi0NCi0gICAgICAgICAgICA8dGV4dGFyZWEgbmctbW9kZWw9ImNvbmZpZyI+PC90ZXh0YXJlYT4NCi0gICAgICAgICAgDQotICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgPC9kaXY+DQotDQotICAgICAgPC9kaXY+DQotICAgIA0KLSAgICA8L2Rpdj4NCi0NCi0gICAgPGRpdiBjbGFzcz0iYmxvY2siIGlkPSJkZWJ1Z19yZXNwb25zZSIgbmctc2hvdz0iZm9ybS5zaG93RGVidWciPg0KLQ0KLSAgICAgIDxoMj4NCi0gICAgICAgIDxhIGNsYXNzPSJ0b2dnbGUiIG5nLWNsaWNrPSJ0b2dnbGVSYXdEZWJ1ZygpIj48c3Bhbj5SYXcgRGVidWctUmVzcG9uc2U8L3NwYW4+PC9hPg0KLSAgICAgIDwvaDI+DQotICAgICAgICANCi0gICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRhaW5lciIgbmctc2hvdz0ic2hvd1Jhd0RlYnVnIj4NCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+PC9kaXY+DQotICAgICAgPC9kaXY+DQotDQotICAgICAgPGRpdiBjbGFzcz0iY29udGVudCIgbmctc2hvdz0ic2hvd1Jhd0RlYnVnIj4NCi0gICAgICAgICAgPHNwYW4gbmctaGlkZT0icmF3UmVzcG9uc2UiPg0KLSAgICAgICAgICAgICAgPGVtPk5vIFJlcXVlc3QgZXhlY3V0ZWQ8L2VtPg0KLSAgICAgICAgICA8L3NwYW4+DQotICAgICAgICAgIDxzcGFuIG5nLXNob3c9InJhd1Jlc3BvbnNlIj4NCi0gICAgICAgICAgICA8cHJlIGNsYXNzPSJzeW50YXggbGFuZ3VhZ2UtanNvbiI+PGNvZGUgbmctYmluZC1odG1sPSJyYXdSZXNwb25zZSB8IGhpZ2hsaWdodDonanNvbicgfCB1bnNhZmUiPjwvY29kZT48L3ByZT4NCi0gICAgICAgICAgPC9zcGFuPg0KLSAgICAgIDwvZGl2Pg0KLSAgICANCi0gICAgPC9kaXY+DQotICANCi0gIDwvZGl2Pg0KLQ0KLSAgPGRpdiBpZD0iZm9ybSIgbmctc2hvdz0iaGFzSGFuZGxlcnMiPg0KLQ0KLSAgICA8ZGl2IGlkPSJuYXZpZ2F0aW9uIj4NCi0NCi0gICAgICA8dWw+DQotICAgICAgICAgIDxsaSBuZy1jbGFzcz0ie2N1cnJlbnQ6IGN1cnJlbnRIYW5kbGVyID09IGhhbmRsZXJ9IiBuZy1yZXBlYXQ9ImhhbmRsZXIgaW4gaGFuZGxlcnMiPg0KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIy97e2Zvcm0uY29yZX19L2RhdGFpbXBvcnQve3toYW5kbGVyfX0iPnt7aGFuZGxlcn19PC9hPg0KLSAgICAgICAgICA8L2xpPg0KLSAgICAgIDwvdWw+DQotDQotICAgIDwvZGl2Pg0KLQ0KLSAgICA8Zm9ybSBhY3Rpb249IiMiIG1ldGhvZD0iZ2V0Ij4NCi0NCi0gICAgICA8bGFiZWwgZm9yPSJjb21tYW5kIj4NCi0gICAgICAgIDxhIHJlbD0iaGVscCI+Q29tbWFuZDwvYT4NCi0gICAgICA8L2xhYmVsPg0KLSAgICAgIDxzZWxlY3QgbmFtZT0iY29tbWFuZCIgaWQ9ImNvbW1hbmQiIG5nLW1vZGVsPSJmb3JtLmNvbW1hbmQiPg0KLSAgICAgICAgPG9wdGlvbj5mdWxsLWltcG9ydDwvb3B0aW9uPg0KLSAgICAgICAgPG9wdGlvbj5kZWx0YS1pbXBvcnQ8L29wdGlvbj4NCi0gICAgICA8L3NlbGVjdD4NCi0NCi0gICAgICA8bGFiZWwgZm9yPSJ2ZXJib3NlIiBjbGFzcz0iY2hlY2tib3giPg0KLSAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ2ZXJib3NlIiBpZD0idmVyYm9zZSIgbmctbW9kZWw9ImZvcm0udmVyYm9zZSI+DQotICAgICAgICBWZXJib3NlDQotICAgICAgPC9sYWJlbD4NCi0NCi0gICAgICA8bGFiZWwgZm9yPSJjbGVhbiIgY2xhc3M9ImNoZWNrYm94Ij4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iY2xlYW4iIGlkPSJjbGVhbiIgbmctbW9kZWw9ImZvcm0uY2xlYW4iPg0KLSAgICAgICAgQ2xlYW4NCi0gICAgICA8L2xhYmVsPg0KLQ0KLSAgICAgIDxsYWJlbCBmb3I9ImNvbW1pdCIgY2xhc3M9ImNoZWNrYm94Ij4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iY29tbWl0IiBpZD0iY29tbWl0IiBuZy1tb2RlbD0iZm9ybS5jb21taXQiPg0KLSAgICAgICAgQ29tbWl0DQotICAgICAgPC9sYWJlbD4NCi0NCi0gICAgICA8bGFiZWwgZm9yPSJvcHRpbWl6ZSIgY2xhc3M9ImNoZWNrYm94Ij4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ib3B0aW1pemUiIGlkPSJvcHRpbWl6ZSIgbmctbW9kZWw9ImZvcm0ub3B0aW1pemUiPg0KLSAgICAgICAgT3B0aW1pemUNCi0gICAgICA8L2xhYmVsPg0KLQ0KLSAgICAgIDxsYWJlbCBmb3I9ImRlYnVnIiBjbGFzcz0iY2hlY2tib3giPg0KLSAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJkZWJ1ZyIgaWQ9ImRlYnVnIiBuZy1tb2RlbD0iZm9ybS5zaG93RGVidWciPg0KLSAgICAgICAgRGVidWcNCi0gICAgICA8L2xhYmVsPg0KLQ0KLSAgICAgIDxsYWJlbCBmb3I9ImVudGl0eSI+DQotICAgICAgICA8YSByZWw9ImhlbHAiPkVudGl0eTwvYT4NCi0gICAgICA8L2xhYmVsPg0KLSAgICAgIDxzZWxlY3QgbmctbW9kZWw9ImZvcm0uZW50aXR5IiBpZD0iZW50aXR5Ij4NCi0gICAgICAgIDxvcHRpb24gdmFsdWU9IiI+PC9vcHRpb24+DQotICAgICAgICA8b3B0aW9uIG5nLXJlcGVhdD0iZW50aXR5IGluIGVudGl0aWVzIj57e2VudGl0eX19PC9vcHRpb24+DQotICAgICAgPC9zZWxlY3Q+DQotDQotICAgICAgPGxhYmVsIGZvcj0ic3RhcnQiPg0KLSAgICAgICAgPGEgcmVsPSJoZWxwIj5TdGFydDwvYT4sDQotICAgICAgICA8YSByZWw9ImhlbHAiPlJvd3M8L2E+DQotICAgICAgPC9sYWJlbD4NCi0gICAgICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InN0YXJ0IiBwbGFjZWhvbGRlcj0iMCIgbmctbW9kZWw9ImZvcm0uc3RhcnQiPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJyb3dzIiBwbGFjZWhvbGRlcj0iMTAiIG5nLW1vZGVsPSJmb3JtLnJvd3MiPg0KLSAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgIDxsYWJlbCBmb3I9ImN1c3RvbV9wYXJhbWV0ZXJzIj4NCi0gICAgICAgIDxhIHJlbD0iaGVscCI+Q3VzdG9tIFBhcmFtZXRlcnM8L2E+DQotICAgICAgPC9sYWJlbD4NCi0gICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImN1c3RvbV9wYXJhbWV0ZXJzIiBuZy1tb2RlbD0iZm9ybS5jdXN0b20iIHBsYWNlaG9sZGVyPSJrZXkxPXZhbDEmYW1wO2tleTI9dmFsMiI+DQotICAgIDwvZm9ybT4NCi0gICAgICA8YnV0dG9uIGNsYXNzPSJleGVjdXRlIiB0eXBlPSJzdWJtaXQiIG5nLWNsaWNrPSJzdWJtaXQoKSI+DQotICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImlzRGVidWdNb2RlIj5FeGVjdXRlIHdpdGggdGhpcyBDb25maWd1cmF0aW9uIOKGPzwvc3Bhbj4NCi0gICAgICAgICAgPHNwYW4gbmctc2hvdz0iIWlzRGVidWdNb2RlIj5FeGVjdXRlPC9zcGFuPg0KLSAgICAgIDwvYnV0dG9uPg0KLSAgICAgIDxidXR0b24gY2xhc3M9InJlZnJlc2gtc3RhdHVzIiBuZy1jbGljaz0icmVmcmVzaFN0YXR1cygpIiBuZy1jbGFzcz0ie2xvYWRlcjogaXNTdGF0dXNMb2FkaW5nLCBzdWNjZXNzOiBzdGF0dXNVcGRhdGVkfSI+PHNwYW4+UmVmcmVzaCBTdGF0dXM8L3NwYW4+PC9idXR0b24+DQotDQotICAgIDxwIGlkPSJhdXRvLXJlZnJlc2gtc3RhdHVzIj48YSBuZy1jbGljaz0idXBkYXRlQXV0b1JlZnJlc2goKSIgbmctY2xhc3M9IntvbjphdXRvcmVmcmVzaH0iPkF1dG8tUmVmcmVzaCBTdGF0dXM8L2E+PC9wPg0KLSAgDQotICA8L2Rpdj4NCi0NCi08L2Rpdj4NCis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkaXYgaWQ9ImRhdGFpbXBvcnQiIGNsYXNzPSJjbGVhcmZpeCI+CisKKyAgPGRpdiBuZy1zaG93PSIhaGFzSGFuZGxlcnMiPlNvcnJ5LCBubyBkYXRhaW1wb3J0LWhhbmRsZXIgZGVmaW5lZCE8L2Rpdj4KKyAgPGRpdiBpZD0iZnJhbWUiIG5nLXNob3c9Imhhc0hhbmRsZXJzIj4KKworICAgIDxkaXYgaWQ9ImVycm9yIiBuZy1zaG93PSJlcnJvciI+PC9kaXY+CisKKyAgICA8ZGl2IGlkPSJjdXJyZW50X3N0YXRlIiBjbGFzcz0ie3tzdGF0dXN9fSI+CisKKyAgICAgIDxwIGNsYXNzPSJsYXN0X3VwZGF0ZSI+TGFzdCBVcGRhdGU6IDxhYmJyIHRpdGxlPSJ7e2xhc3RVcGRhdGVVVEN9fSI+e3tsYXN0VXBkYXRlfX08L2FiYnI+PC9wPgorICAgICAgPGRpdiBjbGFzcz0iaW5mbyI+CisKKyAgICAgICAgPHN0cm9uZz57e2luZm8udGV4dH19PHNwYW4gbmctc2hvdz0iaW5mby50aW1lVGFrZW4iPiAoRHVyYXRpb246IHt7aW5mby50aW1lVGFrZW4gfCByZWFkYWJsZVNlY29uZHMgfX0pPC9zcGFuPgorICAgICAgICA8L3N0cm9uZz4KKyAgICAgICAgPGRpdiBjbGFzcz0iZGV0YWlscyIgbmctc2hvdz0iaW5mby5zaG93RGV0YWlscyI+CisgICAgICAgICAgPGRpdiBjbGFzcz0iZG9jcyI+CisgICAgICAgICAgICAgIDxzcGFuIG5nLXJlcGVhdD0iZG9jIGluIGluZm8uZG9jcyI+CisgICAgICAgICAgICAgICAgICA8YWJiciBzdHlsZT0iZGlzcGxheTppbmxpbmUiIHRpdGxlPSJ7eyBkb2MuZGVzYyB9fSI+e3sgZG9jLm5hbWUgfX08L2FiYnI+OiB7e2RvYy52YWx1ZSB8IG51bWJlcn19PCEtLSByZW1vdmUgd2hpdGVzcGFjZSEKKyAgICAgICAgICAgICAgICAgIC0tPiZuYnNwOzxzcGFuIHN0eWxlPSJkaXNwbGF5OmlubGluZSIgbmctc2hvdz0iZG9jLnNwZWVkIj57eyBkb2Muc3BlZWQgfCBudW1iZXJ9fS9zPC9zcGFuPjwhLS0gcmVtb3ZlIHdoaXRlc3BhY2UhCisgICAgICAgICAgICAgICAgICAtLT48c3BhbiBzdHlsZT0iZGlzcGxheTppbmxpbmUiIG5nLXNob3c9IiEkbGFzdCI+LCA8L3NwYW4+CisgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRlcyI+CisgICAgICAgICAgICAgIDxzcGFuIG5nLXJlcGVhdD0iZGF0ZSBpbiBpbmZvLmRhdGVzIj4KKyAgICAgICAgICAgICAgICAgIDxhYmJyIHRpdGxlPSJ7eyBkYXRlLmRlc2MgfX0iPnt7IGRhdGUubmFtZSB9fTwvYWJicj46CisgICAgICAgICAgICAgICAgICA8YWJiciBjbGFzcz0idGltZSI+e3sgZGF0ZS52YWx1ZSB8IHRpbWVhZ28gfX08L2FiYnI+CisgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYWJvcnQtaW1wb3J0IiBuZy1jbGFzcz0ie3dhcm46IWlzQWJvcnRpbmcsIHN1Y2Nlc3M6IGlzQWJvcnRpbmd9IiBuZy1jbGljaz0iYWJvcnQoKSIgbmctc2hvdz0iaXNSdW5uaW5nIj4KKyAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImlzQWJvcnRpbmciPkFib3J0aW5nIEltcG9ydDwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9IiFpc0Fib3J0aW5nIj5BYm9ydCBJbXBvcnQ8L3NwYW4+CisgICAgICAgIDwvYnV0dG9uPgorCisgICAgICA8L2Rpdj4KKyAgICAKKyAgICA8L2Rpdj4KKworICAgIDxkaXYgY2xhc3M9ImJsb2NrIiBpZD0icmF3X291dHB1dCIgPgorCisgICAgICA8aDI+CisgICAgICAgIDxhIGNsYXNzPSJ0b2dnbGUiIG5nLWNsaWNrPSJ0b2dnbGVSYXdTdGF0dXMoKSI+PHNwYW4+UmF3IFN0YXR1cy1PdXRwdXQ8L3NwYW4+PC9hPgorICAgICAgPC9oMj4KKyAgICAgICAgCisgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRhaW5lciIgbmctc2hvdz0ic2hvd1Jhd1N0YXR1cyI+CisgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+PC9kaXY+CisgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iY29udGVudCIgbmctc2hvdz0ic2hvd1Jhd1N0YXR1cyI+CisKKyAgICAgICAgPGRpdiBpZD0icmF3X291dHB1dF9jb250YWluZXIiPjxwcmUgY2xhc3M9InN5bnRheCBsYW5ndWFnZS1qc29uIj48Y29kZSBuZy1iaW5kLWh0bWw9InJhd1N0YXR1cyB8IGhpZ2hsaWdodDonanNvbicgfCB1bnNhZmUiPjwvY29kZT48L3ByZT48L2Rpdj4KKworICAgICAgPC9kaXY+CisgICAgCisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJibG9jayIgaWQ9ImNvbmZpZyIgbmctY2xhc3M9IntkZWJ1Z19tb2RlOmlzRGVidWdNb2RlfSI+CisKKyAgICAgIDxoMiBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICA8YSBjbGFzcz0idG9nZ2xlIiBuZy1jbGljaz0idG9nZ2xlQ29uZmlndXJhdGlvbigpIj48c3Bhbj5Db25maWd1cmF0aW9uPC9zcGFuPjwvYT4KKyAgICAgICAgPGEgY2xhc3M9InIgcmVsb2FkX2NvbmZpZyIgbmctY2xhc3M9IntzdWNjZXNzOnJlbG9hZGVkfSIgbmctY2xpY2s9InJlbG9hZCgpIiB0aXRsZT0iUmVsb2FkIENvbmZpZ3VyYXRpb24iPlJlbG9hZDwvYT4KKyAgICAgICAgPGEgY2xhc3M9InIgZGVidWdfbW9kZSIgbmctY2xpY2s9InRvZ2dsZURlYnVnKCkiPkRlYnVnLU1vZGU8L2E+CisgICAgICA8L2gyPgorICAgICAgICAKKyAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UtY29udGFpbmVyIiBuZy1zaG93PSJzaG93Q29uZmlndXJhdGlvbiI+CisgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+PC9kaXY+CisgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iY29udGVudCIgbmctc2hvdz0ic2hvd0NvbmZpZ3VyYXRpb24iPgorICAgICAgICA8ZGl2IGlkPSJkYXRhaW1wb3J0X2NvbmZpZyI+CisKKyAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtYXR0ZWQiIG5nLXNob3c9IiFpc0RlYnVnTW9kZSI+CisKKyAgICAgICAgICAgIDxwcmUgY2xhc3M9InN5bnRheCBsYW5ndWFnZS14bWwiPjxjb2RlIG5nLWJpbmQtaHRtbD0iY29uZmlnIHwgaGlnaGxpZ2h0Oid4bWwnfCB1bnNhZmUiPjwvY29kZT48L3ByZT4KKworICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgPGRpdiBjbGFzcz0iZWRpdGFibGUiIG5nLXNob3c9ImlzRGVidWdNb2RlIj4KKworICAgICAgICAgICAgPHRleHRhcmVhIG5nLW1vZGVsPSJjb25maWciPjwvdGV4dGFyZWE+CisgICAgICAgICAgCisgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisKKyAgICAgIDwvZGl2PgorICAgIAorICAgIDwvZGl2PgorCisgICAgPGRpdiBjbGFzcz0iYmxvY2siIGlkPSJkZWJ1Z19yZXNwb25zZSIgbmctc2hvdz0iZm9ybS5zaG93RGVidWciPgorCisgICAgICA8aDI+CisgICAgICAgIDxhIGNsYXNzPSJ0b2dnbGUiIG5nLWNsaWNrPSJ0b2dnbGVSYXdEZWJ1ZygpIj48c3Bhbj5SYXcgRGVidWctUmVzcG9uc2U8L3NwYW4+PC9hPgorICAgICAgPC9oMj4KKyAgICAgICAgCisgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRhaW5lciIgbmctc2hvdz0ic2hvd1Jhd0RlYnVnIj4KKyAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj48L2Rpdj4KKyAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50IiBuZy1zaG93PSJzaG93UmF3RGVidWciPgorICAgICAgICAgIDxzcGFuIG5nLWhpZGU9InJhd1Jlc3BvbnNlIj4KKyAgICAgICAgICAgICAgPGVtPk5vIFJlcXVlc3QgZXhlY3V0ZWQ8L2VtPgorICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICA8c3BhbiBuZy1zaG93PSJyYXdSZXNwb25zZSI+CisgICAgICAgICAgICA8cHJlIGNsYXNzPSJzeW50YXggbGFuZ3VhZ2UtanNvbiI+PGNvZGUgbmctYmluZC1odG1sPSJyYXdSZXNwb25zZSB8IGhpZ2hsaWdodDonanNvbicgfCB1bnNhZmUiPjwvY29kZT48L3ByZT4KKyAgICAgICAgICA8L3NwYW4+CisgICAgICA8L2Rpdj4KKyAgICAKKyAgICA8L2Rpdj4KKyAgCisgIDwvZGl2PgorCisgIDxkaXYgaWQ9ImZvcm0iIG5nLXNob3c9Imhhc0hhbmRsZXJzIj4KKworICAgIDxkaXYgaWQ9Im5hdmlnYXRpb24iPgorCisgICAgICA8dWw+CisgICAgICAgICAgPGxpIG5nLWNsYXNzPSJ7Y3VycmVudDogY3VycmVudEhhbmRsZXIgPT0gaGFuZGxlcn0iIG5nLXJlcGVhdD0iaGFuZGxlciBpbiBoYW5kbGVycyI+CisgICAgICAgICAgICAgIDxhIGhyZWY9IiMve3tmb3JtLmNvcmV9fS9kYXRhaW1wb3J0L3t7aGFuZGxlcn19Ij57e2hhbmRsZXJ9fTwvYT4KKyAgICAgICAgICA8L2xpPgorICAgICAgPC91bD4KKworICAgIDwvZGl2PgorCisgICAgPGZvcm0gYWN0aW9uPSIjIiBtZXRob2Q9ImdldCI+CisKKyAgICAgIDxsYWJlbCBmb3I9ImNvbW1hbmQiPgorICAgICAgICA8YSByZWw9ImhlbHAiPkNvbW1hbmQ8L2E+CisgICAgICA8L2xhYmVsPgorICAgICAgPHNlbGVjdCBuYW1lPSJjb21tYW5kIiBpZD0iY29tbWFuZCIgbmctbW9kZWw9ImZvcm0uY29tbWFuZCI+CisgICAgICAgIDxvcHRpb24+ZnVsbC1pbXBvcnQ8L29wdGlvbj4KKyAgICAgICAgPG9wdGlvbj5kZWx0YS1pbXBvcnQ8L29wdGlvbj4KKyAgICAgIDwvc2VsZWN0PgorCisgICAgICA8bGFiZWwgZm9yPSJ2ZXJib3NlIiBjbGFzcz0iY2hlY2tib3giPgorICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InZlcmJvc2UiIGlkPSJ2ZXJib3NlIiBuZy1tb2RlbD0iZm9ybS52ZXJib3NlIj4KKyAgICAgICAgVmVyYm9zZQorICAgICAgPC9sYWJlbD4KKworICAgICAgPGxhYmVsIGZvcj0iY2xlYW4iIGNsYXNzPSJjaGVja2JveCI+CisgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iY2xlYW4iIGlkPSJjbGVhbiIgbmctbW9kZWw9ImZvcm0uY2xlYW4iPgorICAgICAgICBDbGVhbgorICAgICAgPC9sYWJlbD4KKworICAgICAgPGxhYmVsIGZvcj0iY29tbWl0IiBjbGFzcz0iY2hlY2tib3giPgorICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImNvbW1pdCIgaWQ9ImNvbW1pdCIgbmctbW9kZWw9ImZvcm0uY29tbWl0Ij4KKyAgICAgICAgQ29tbWl0CisgICAgICA8L2xhYmVsPgorCisgICAgICA8bGFiZWwgZm9yPSJvcHRpbWl6ZSIgY2xhc3M9ImNoZWNrYm94Ij4KKyAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJvcHRpbWl6ZSIgaWQ9Im9wdGltaXplIiBuZy1tb2RlbD0iZm9ybS5vcHRpbWl6ZSI+CisgICAgICAgIE9wdGltaXplCisgICAgICA8L2xhYmVsPgorCisgICAgICA8bGFiZWwgZm9yPSJkZWJ1ZyIgY2xhc3M9ImNoZWNrYm94Ij4KKyAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJkZWJ1ZyIgaWQ9ImRlYnVnIiBuZy1tb2RlbD0iZm9ybS5zaG93RGVidWciPgorICAgICAgICBEZWJ1ZworICAgICAgPC9sYWJlbD4KKworICAgICAgPGxhYmVsIGZvcj0iZW50aXR5Ij4KKyAgICAgICAgPGEgcmVsPSJoZWxwIj5FbnRpdHk8L2E+CisgICAgICA8L2xhYmVsPgorICAgICAgPHNlbGVjdCBuZy1tb2RlbD0iZm9ybS5lbnRpdHkiIGlkPSJlbnRpdHkiPgorICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPjwvb3B0aW9uPgorICAgICAgICA8b3B0aW9uIG5nLXJlcGVhdD0iZW50aXR5IGluIGVudGl0aWVzIj57e2VudGl0eX19PC9vcHRpb24+CisgICAgICA8L3NlbGVjdD4KKworICAgICAgPGxhYmVsIGZvcj0ic3RhcnQiPgorICAgICAgICA8YSByZWw9ImhlbHAiPlN0YXJ0PC9hPiwKKyAgICAgICAgPGEgcmVsPSJoZWxwIj5Sb3dzPC9hPgorICAgICAgPC9sYWJlbD4KKyAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJzdGFydCIgcGxhY2Vob2xkZXI9IjAiIG5nLW1vZGVsPSJmb3JtLnN0YXJ0Ij4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJyb3dzIiBwbGFjZWhvbGRlcj0iMTAiIG5nLW1vZGVsPSJmb3JtLnJvd3MiPgorICAgICAgPC9kaXY+CisKKyAgICAgIDxsYWJlbCBmb3I9ImN1c3RvbV9wYXJhbWV0ZXJzIj4KKyAgICAgICAgPGEgcmVsPSJoZWxwIj5DdXN0b20gUGFyYW1ldGVyczwvYT4KKyAgICAgIDwvbGFiZWw+CisgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImN1c3RvbV9wYXJhbWV0ZXJzIiBuZy1tb2RlbD0iZm9ybS5jdXN0b20iIHBsYWNlaG9sZGVyPSJrZXkxPXZhbDEmYW1wO2tleTI9dmFsMiI+CisgICAgPC9mb3JtPgorICAgICAgPGJ1dHRvbiBjbGFzcz0iZXhlY3V0ZSIgdHlwZT0ic3VibWl0IiBuZy1jbGljaz0ic3VibWl0KCkiPgorICAgICAgICAgIDxzcGFuIG5nLXNob3c9ImlzRGVidWdNb2RlIj5FeGVjdXRlIHdpdGggdGhpcyBDb25maWd1cmF0aW9uIOKGPzwvc3Bhbj4KKyAgICAgICAgICA8c3BhbiBuZy1zaG93PSIhaXNEZWJ1Z01vZGUiPkV4ZWN1dGU8L3NwYW4+CisgICAgICA8L2J1dHRvbj4KKyAgICAgIDxidXR0b24gY2xhc3M9InJlZnJlc2gtc3RhdHVzIiBuZy1jbGljaz0icmVmcmVzaFN0YXR1cygpIiBuZy1jbGFzcz0ie2xvYWRlcjogaXNTdGF0dXNMb2FkaW5nLCBzdWNjZXNzOiBzdGF0dXNVcGRhdGVkfSI+PHNwYW4+UmVmcmVzaCBTdGF0dXM8L3NwYW4+PC9idXR0b24+CisKKyAgICA8cCBpZD0iYXV0by1yZWZyZXNoLXN0YXR1cyI+PGEgbmctY2xpY2s9InVwZGF0ZUF1dG9SZWZyZXNoKCkiIG5nLWNsYXNzPSJ7b246YXV0b3JlZnJlc2h9Ij5BdXRvLVJlZnJlc2ggU3RhdHVzPC9hPjwvcD4KKyAgCisgIDwvZGl2PgorCis8L2Rpdj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9kb2N1bWVudHMuaHRtbCBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9kb2N1bWVudHMuaHRtbAppbmRleCA4ODA5NjRjLi43NGQwMzRmIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvZG9jdW1lbnRzLmh0bWwKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL2RvY3VtZW50cy5odG1sCkBAIC0xLDExOCArMSwxMTggQEAKLTwhLS0NCi0vKg0KLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0qIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0qIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0qDQotKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi0tLT4NCi0NCi08ZGl2IGlkPSJkb2N1bWVudHMiIGNsYXNzPSJjbGVhcmZpeCI+DQotICA8ZGl2IGlkPSJmb3JtIj4NCi0gICAgPGZvcm0+DQotICAgICAgPGxhYmVsIGZvcj0icXQiPg0KLSAgICAgICAgPGEgcmVsPSJoZWxwIj5SZXF1ZXN0LUhhbmRsZXIgKHF0KTwvYT4NCi0gICAgICA8L2xhYmVsPg0KLSAgICAgIDxpbnB1dCBuZy1tb2RlbD0iaGFuZGxlciIgdHlwZT0idGV4dCIgaWQ9InF0IiB2YWx1ZT0iL3VwZGF0ZSIgdGl0bGU9IlJlcXVlc3QgaGFuZGxlciBpbiBzb2xyY29uZmlnLnhtbC4iPg0KLSAgICAgIDxsYWJlbCBmb3I9ImRvY3VtZW50LXR5cGUiPg0KLSAgICAgICAgPGEgcmVsPSJoZWxwIj5Eb2N1bWVudCBUeXBlPC9hPg0KLSAgICAgIDwvbGFiZWw+DQotDQotICAgICAgPGRpdj48c2VsZWN0IG5nLW1vZGVsPSJ0eXBlIiBpZD0iZG9jdW1lbnQtdHlwZSIgbmctY2hhbmdlPSJjaGFuZ2VEb2N1bWVudFR5cGUoKSIgcGxhY2Vob2xkZXI9IlRoZSB0eXBlIG9mIHRoZSBkb2N1bWVudCBmaWVsZCI+DQotICAgICAgICA8IS0tIFRPRE86IHN1cHBvcnQgdGhlIEJ1aWxkZXIgLS0+DQotICAgICAgICA8b3B0aW9uIHZhbHVlPSJjc3YiPkNTVjwvb3B0aW9uPg0KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0id2l6YXJkIj5Eb2N1bWVudCBCdWlsZGVyPC9vcHRpb24+DQotICAgICAgICA8b3B0aW9uIHZhbHVlPSJ1cGxvYWQiPkZpbGUgVXBsb2FkPC9vcHRpb24+DQotICAgICAgICA8b3B0aW9uIHZhbHVlPSJqc29uIj5KU09OPC9vcHRpb24+DQotICAgICAgICA8b3B0aW9uIHZhbHVlPSJzb2xyIj5Tb2xyIENvbW1hbmQgKHJhdyBYTUwgb3IgSlNPTik8L29wdGlvbj4NCi0gICAgICAgIDxvcHRpb24gdmFsdWU9InhtbCI+WE1MPC9vcHRpb24+DQotICAgICAgPC9zZWxlY3Q+DQotICAgICAgPC9kaXY+DQotICAgICAgPGRpdiBpZD0iZG9jdW1lbnQtY29udGFpbmVyIj4NCi0gICAgICAgIDxkaXYgaWQ9IndpemFyZCIgbmctc2hvdz0idHlwZT09J3dpemFyZCciPg0KLSAgICAgICAgICA8ZGl2IGlkPSJ3aXphcmQtZmllbGRzIj4NCi0gICAgICAgICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+RmllbGQ8L3NwYW4+OiA8c2VsZWN0IG5nLW1vZGVsPSJmaWVsZE5hbWUiIGlkPSJ3aXotZmllbGQtc2VsZWN0IiBuYW1lPSJ3aXotZmllbGQtc2VsZWN0Ig0KLSAgICAgICAgICAgICAgICAgICAgIG5nLW9wdGlvbnM9ImZpZWxkIGZvciBmaWVsZCBpbiBmaWVsZHMiPjwvc2VsZWN0Pg0KLSAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgIDxkaXY+PHNwYW4gaWQ9Indpei1maWVsZC1kYXRhIj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPkZpZWxkIERhdGE8L3NwYW4+Ojwvc3Bhbj4NCi0gICAgICAgICAgICAgICAgPHRleHRhcmVhIG5nLW1vZGVsPSJmaWVsZERhdGEiDQotICAgICAgICAgICAgICAgICAgICAgICAgICBpZD0id2l6YXJkLWRvYyINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IndpemFyZC1kb2MiDQotICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzPSIxMCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHM9IjQwIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkVudGVyIHlvdXIgZmllbGQgdGV4dCBoZXJlIGFuZCB0aGVuIGNsaWNrICdBZGQgRmllbGQnIHRvIGFkZCB0aGUgZmllbGQgdG8gdGhlIGRvY3VtZW50LiI+DQotICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+DQotICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICA8ZGl2IGlkPSJ3aXphcmQtYWRkIj48YSBuZy1jbGljaz0iYWRkV2l6YXJkRmllbGQoKSIgaWQ9ImFkZC1maWVsZC1ocmVmIj48aW1nIGJvcmRlcj0iMCIgc3JjPSIuL2ltZy9pY28vcGx1cy1idXR0b24ucG5nIi8+QWRkDQotICAgICAgICAgICAgRmllbGQ8L2E+PC9kaXY+DQotICAgICAgICA8L2Rpdj4NCi0gICAgICAgIDxsYWJlbCBmb3I9ImRvY3VtZW50Ij4NCi0gICAgICAgICAgPGEgcmVsPSJoZWxwIj5Eb2N1bWVudChzKTwvYT4NCi0gICAgICAgIDwvbGFiZWw+DQotICAgICAgICA8dGV4dGFyZWEgbmctc2hvdz0idHlwZSE9J3VwbG9hZCciIG5nLW1vZGVsPSJkb2N1bWVudCIgbmFtZT0iZG9jdW1lbnQiIGlkPSJkb2N1bWVudCIgdGl0bGU9IlRoZSBEb2N1bWVudCIgcm93cz0iMTAiDQotICAgICAgICAgICAgICAgICAgY29scz0iNzAiIHBsYWNlaG9sZGVyPSJ7e3BsYWNlaG9sZGVyfX0iPjwvdGV4dGFyZWE+DQotDQotICAgICAgICA8ZGl2IGlkPSJmaWxlLXVwbG9hZCIgbmctc2hvdz0idHlwZT09J3VwbG9hZCciPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9InRoZS1maWxlIiBuYW1lPSJ0aGUtZmlsZSIgZmlsZS1tb2RlbD0iZmlsZVVwbG9hZCIvPg0KLSAgICAgICAgPC9kaXY+DQotICAgICAgPC9kaXY+DQotDQotICAgICAgPGRpdiBpZD0iYWR2YW5jZWQiPg0KLSAgICAgICAgPCEtLSBUT0RPOiBvbmx5IHNob3cgZm9yIEpTT04vWE1MLS0+DQotICAgICAgICA8ZGl2IGlkPSJhdHRyaWJzIj4NCi0gICAgICAgICAgPGRpdiBpZD0idXBsb2FkLW9ubHkiIG5nLXNob3c9InR5cGU9PSd1cGxvYWQnIj4NCi0gICAgICAgICAgICA8bGFiZWwgZm9yPSJlcmgtcGFyYW1zIj48IS0tIFRPRE86IGNsZWFuZXIgd2F5IHRvIGRvIHRoaXM/IC0tPg0KLSAgICAgICAgICAgICAgPGEgcmVsPSJoZWxwIj5FeHRyYWN0aW5nIFJlcS4gSGFuZGxlciBQYXJhbXM8L2E+DQotICAgICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgICAgICA8aW5wdXQgbmctbW9kZWw9ImxpdGVyYWxQYXJhbXMiIHR5cGU9InRleHQiIGlkPSJlcmgtcGFyYW1zIiB2YWx1ZT0iJmxpdGVyYWwuaWQ9Y2hhbmdlLm1lIg0KLSAgICAgICAgICAgICAgICAgICB0aXRsZT0iRXh0cmFjdGluZyBSZXF1ZXN0IEhhbmRsZXIgUGFyYW1ldGVycyIgc2l6ZT0iNTAiPg0KLSAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgPGRpdiBpZD0iZ2VuZXJhbC1hdHRyaWJzIj4NCi0gICAgICAgICAgICA8bGFiZWwgZm9yPSJjb21taXRXaXRoaW4iPg0KLSAgICAgICAgICAgICAgPGEgcmVsPSJoZWxwIj5Db21taXQgV2l0aGluPC9hPg0KLSAgICAgICAgICAgIDwvbGFiZWw+DQotICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJjb21taXRXaXRoaW4iIGlkPSJjb21taXRXaXRoaW4iIHZhbHVlPSIxMDAwIiB0aXRsZT0iQ29tbWl0IFdpdGhpbiAobXMpIj4NCi0gICAgICAgICAgICA8bGFiZWwgZm9yPSJvdmVyd3JpdGUiPg0KLSAgICAgICAgICAgICAgPGEgcmVsPSJoZWxwIj5PdmVyd3JpdGU8L2E+DQotICAgICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgICAgICA8aW5wdXQgbmctbW9kZWw9Im92ZXJ3cml0ZSIgdHlwZT0idGV4dCIgaWQ9Im92ZXJ3cml0ZSIgdmFsdWU9InRydWUiIHRpdGxlPSJPdmVyd3JpdGUiPg0KLSAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgPCEtLSBCb29zdCBpcyBqc29uIG9ubHksIHNpbmNlIHRoZSBYTUwgaGFzIGl0IGVtYmVkZGVkIC0tPg0KLSAgICAgICAgICA8ZGl2IGlkPSJqc29uLW9ubHkiIG5nLXNob3c9InR5cGU9PSdqc29uJyI+DQotICAgICAgICAgICAgPGxhYmVsIGZvcj0iYm9vc3QiPg0KLSAgICAgICAgICAgICAgPGEgcmVsPSJoZWxwIj5Cb29zdDwvYT4NCi0gICAgICAgICAgICA8L2xhYmVsPg0KLSAgICAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD0iYm9vc3QiIHR5cGU9InRleHQiIGlkPSJib29zdCIgdmFsdWU9IjEuMCIgdGl0bGU9IkRvY3VtZW50IEJvb3N0Ij4NCi0gICAgICAgICAgPC9kaXY+DQotICAgICAgICA8L2Rpdj4NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgbmctY2xpY2s9InN1Ym1pdCgpIiBpZD0ic3VibWl0Ij5TdWJtaXQgRG9jdW1lbnQ8L2J1dHRvbj4NCi0gICAgPC9mb3JtPg0KLSAgPC9kaXY+DQotICA8ZGl2IGlkPSJyZXN1bHQiPg0KLSAgICA8ZGl2IGlkPSJyZXNwb25zZSIgbmctc2hvdz0icmVzcG9uc2UiPg0KLSAgICAgICAgPGRpdj4NCi0gICAgICAgICAgPHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj5TdGF0dXM6IDwvc3Bhbj57eyByZXNwb25zZVN0YXR1cyB9fQ0KLSAgICAgICAgPC9kaXY+DQotICAgICAgICA8ZGl2Pg0KLSAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPlJlc3BvbnNlOjwvc3Bhbj4NCi0gICAgICAgICAgPHByZSBjbGFzcz0ic3ludGF4IGxhbmd1YWdlLWpzb24iPjxjb2RlIG5nLWJpbmQtaHRtbD0icmVzcG9uc2UgfCBoaWdobGlnaHQ6J2pzb24nIHwgdW5zYWZlIj48L2NvZGU+PC9wcmU+DQotICAgICAgICA8L2Rpdj4NCi0gICAgPC9kaXY+DQotDQotICA8L2Rpdj4NCi08L2Rpdj4NCi0NCi0NCis8IS0tCisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8ZGl2IGlkPSJkb2N1bWVudHMiIGNsYXNzPSJjbGVhcmZpeCI+CisgIDxkaXYgaWQ9ImZvcm0iPgorICAgIDxmb3JtPgorICAgICAgPGxhYmVsIGZvcj0icXQiPgorICAgICAgICA8YSByZWw9ImhlbHAiPlJlcXVlc3QtSGFuZGxlciAocXQpPC9hPgorICAgICAgPC9sYWJlbD4KKyAgICAgIDxpbnB1dCBuZy1tb2RlbD0iaGFuZGxlciIgdHlwZT0idGV4dCIgaWQ9InF0IiB2YWx1ZT0iL3VwZGF0ZSIgdGl0bGU9IlJlcXVlc3QgaGFuZGxlciBpbiBzb2xyY29uZmlnLnhtbC4iPgorICAgICAgPGxhYmVsIGZvcj0iZG9jdW1lbnQtdHlwZSI+CisgICAgICAgIDxhIHJlbD0iaGVscCI+RG9jdW1lbnQgVHlwZTwvYT4KKyAgICAgIDwvbGFiZWw+CisKKyAgICAgIDxkaXY+PHNlbGVjdCBuZy1tb2RlbD0idHlwZSIgaWQ9ImRvY3VtZW50LXR5cGUiIG5nLWNoYW5nZT0iY2hhbmdlRG9jdW1lbnRUeXBlKCkiIHBsYWNlaG9sZGVyPSJUaGUgdHlwZSBvZiB0aGUgZG9jdW1lbnQgZmllbGQiPgorICAgICAgICA8IS0tIFRPRE86IHN1cHBvcnQgdGhlIEJ1aWxkZXIgLS0+CisgICAgICAgIDxvcHRpb24gdmFsdWU9ImNzdiI+Q1NWPC9vcHRpb24+CisgICAgICAgIDxvcHRpb24gdmFsdWU9IndpemFyZCI+RG9jdW1lbnQgQnVpbGRlcjwvb3B0aW9uPgorICAgICAgICA8b3B0aW9uIHZhbHVlPSJ1cGxvYWQiPkZpbGUgVXBsb2FkPC9vcHRpb24+CisgICAgICAgIDxvcHRpb24gdmFsdWU9Impzb24iPkpTT048L29wdGlvbj4KKyAgICAgICAgPG9wdGlvbiB2YWx1ZT0ic29sciI+U29sciBDb21tYW5kIChyYXcgWE1MIG9yIEpTT04pPC9vcHRpb24+CisgICAgICAgIDxvcHRpb24gdmFsdWU9InhtbCI+WE1MPC9vcHRpb24+CisgICAgICA8L3NlbGVjdD4KKyAgICAgIDwvZGl2PgorICAgICAgPGRpdiBpZD0iZG9jdW1lbnQtY29udGFpbmVyIj4KKyAgICAgICAgPGRpdiBpZD0id2l6YXJkIiBuZy1zaG93PSJ0eXBlPT0nd2l6YXJkJyI+CisgICAgICAgICAgPGRpdiBpZD0id2l6YXJkLWZpZWxkcyI+CisgICAgICAgICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+RmllbGQ8L3NwYW4+OiA8c2VsZWN0IG5nLW1vZGVsPSJmaWVsZE5hbWUiIGlkPSJ3aXotZmllbGQtc2VsZWN0IiBuYW1lPSJ3aXotZmllbGQtc2VsZWN0IgorICAgICAgICAgICAgICAgICAgICAgbmctb3B0aW9ucz0iZmllbGQgZm9yIGZpZWxkIGluIGZpZWxkcyI+PC9zZWxlY3Q+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDxkaXY+PHNwYW4gaWQ9Indpei1maWVsZC1kYXRhIj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPkZpZWxkIERhdGE8L3NwYW4+Ojwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmctbW9kZWw9ImZpZWxkRGF0YSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9IndpemFyZC1kb2MiCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IndpemFyZC1kb2MiCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3M9IjEwIgorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzPSI0MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkVudGVyIHlvdXIgZmllbGQgdGV4dCBoZXJlIGFuZCB0aGVuIGNsaWNrICdBZGQgRmllbGQnIHRvIGFkZCB0aGUgZmllbGQgdG8gdGhlIGRvY3VtZW50LiI+CisgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIDxkaXYgaWQ9IndpemFyZC1hZGQiPjxhIG5nLWNsaWNrPSJhZGRXaXphcmRGaWVsZCgpIiBpZD0iYWRkLWZpZWxkLWhyZWYiPjxpbWcgYm9yZGVyPSIwIiBzcmM9Ii4vaW1nL2ljby9wbHVzLWJ1dHRvbi5wbmciLz5BZGQKKyAgICAgICAgICAgIEZpZWxkPC9hPjwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGxhYmVsIGZvcj0iZG9jdW1lbnQiPgorICAgICAgICAgIDxhIHJlbD0iaGVscCI+RG9jdW1lbnQocyk8L2E+CisgICAgICAgIDwvbGFiZWw+CisgICAgICAgIDx0ZXh0YXJlYSBuZy1zaG93PSJ0eXBlIT0ndXBsb2FkJyIgbmctbW9kZWw9ImRvY3VtZW50IiBuYW1lPSJkb2N1bWVudCIgaWQ9ImRvY3VtZW50IiB0aXRsZT0iVGhlIERvY3VtZW50IiByb3dzPSIxMCIKKyAgICAgICAgICAgICAgICAgIGNvbHM9IjcwIiBwbGFjZWhvbGRlcj0ie3twbGFjZWhvbGRlcn19Ij48L3RleHRhcmVhPgorCisgICAgICAgIDxkaXYgaWQ9ImZpbGUtdXBsb2FkIiBuZy1zaG93PSJ0eXBlPT0ndXBsb2FkJyI+CisgICAgICAgICAgPGlucHV0IHR5cGU9ImZpbGUiIGlkPSJ0aGUtZmlsZSIgbmFtZT0idGhlLWZpbGUiIGZpbGUtbW9kZWw9ImZpbGVVcGxvYWQiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBpZD0iYWR2YW5jZWQiPgorICAgICAgICA8IS0tIFRPRE86IG9ubHkgc2hvdyBmb3IgSlNPTi9YTUwtLT4KKyAgICAgICAgPGRpdiBpZD0iYXR0cmlicyI+CisgICAgICAgICAgPGRpdiBpZD0idXBsb2FkLW9ubHkiIG5nLXNob3c9InR5cGU9PSd1cGxvYWQnIj4KKyAgICAgICAgICAgIDxsYWJlbCBmb3I9ImVyaC1wYXJhbXMiPjwhLS0gVE9ETzogY2xlYW5lciB3YXkgdG8gZG8gdGhpcz8gLS0+CisgICAgICAgICAgICAgIDxhIHJlbD0iaGVscCI+RXh0cmFjdGluZyBSZXEuIEhhbmRsZXIgUGFyYW1zPC9hPgorICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD0ibGl0ZXJhbFBhcmFtcyIgdHlwZT0idGV4dCIgaWQ9ImVyaC1wYXJhbXMiIHZhbHVlPSImbGl0ZXJhbC5pZD1jaGFuZ2UubWUiCisgICAgICAgICAgICAgICAgICAgdGl0bGU9IkV4dHJhY3RpbmcgUmVxdWVzdCBIYW5kbGVyIFBhcmFtZXRlcnMiIHNpemU9IjUwIj4KKyAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8ZGl2IGlkPSJnZW5lcmFsLWF0dHJpYnMiPgorICAgICAgICAgICAgPGxhYmVsIGZvcj0iY29tbWl0V2l0aGluIj4KKyAgICAgICAgICAgICAgPGEgcmVsPSJoZWxwIj5Db21taXQgV2l0aGluPC9hPgorICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iY29tbWl0V2l0aGluIiBpZD0iY29tbWl0V2l0aGluIiB2YWx1ZT0iMTAwMCIgdGl0bGU9IkNvbW1pdCBXaXRoaW4gKG1zKSI+CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJvdmVyd3JpdGUiPgorICAgICAgICAgICAgICA8YSByZWw9ImhlbHAiPk92ZXJ3cml0ZTwvYT4KKyAgICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgICAgICA8aW5wdXQgbmctbW9kZWw9Im92ZXJ3cml0ZSIgdHlwZT0idGV4dCIgaWQ9Im92ZXJ3cml0ZSIgdmFsdWU9InRydWUiIHRpdGxlPSJPdmVyd3JpdGUiPgorICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIDwhLS0gQm9vc3QgaXMganNvbiBvbmx5LCBzaW5jZSB0aGUgWE1MIGhhcyBpdCBlbWJlZGRlZCAtLT4KKyAgICAgICAgICA8ZGl2IGlkPSJqc29uLW9ubHkiIG5nLXNob3c9InR5cGU9PSdqc29uJyI+CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJib29zdCI+CisgICAgICAgICAgICAgIDxhIHJlbD0iaGVscCI+Qm9vc3Q8L2E+CisgICAgICAgICAgICA8L2xhYmVsPgorICAgICAgICAgICAgPGlucHV0IG5nLW1vZGVsPSJib29zdCIgdHlwZT0idGV4dCIgaWQ9ImJvb3N0IiB2YWx1ZT0iMS4wIiB0aXRsZT0iRG9jdW1lbnQgQm9vc3QiPgorICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorCisgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgbmctY2xpY2s9InN1Ym1pdCgpIiBpZD0ic3VibWl0Ij5TdWJtaXQgRG9jdW1lbnQ8L2J1dHRvbj4KKyAgICA8L2Zvcm0+CisgIDwvZGl2PgorICA8ZGl2IGlkPSJyZXN1bHQiPgorICAgIDxkaXYgaWQ9InJlc3BvbnNlIiBuZy1zaG93PSJyZXNwb25zZSI+CisgICAgICAgIDxkaXY+CisgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj5TdGF0dXM6IDwvc3Bhbj57eyByZXNwb25zZVN0YXR1cyB9fQorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdj4KKyAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPlJlc3BvbnNlOjwvc3Bhbj4KKyAgICAgICAgICA8cHJlIGNsYXNzPSJzeW50YXggbGFuZ3VhZ2UtanNvbiI+PGNvZGUgbmctYmluZC1odG1sPSJyZXNwb25zZSB8IGhpZ2hsaWdodDonanNvbicgfCB1bnNhZmUiPjwvY29kZT48L3ByZT4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvZmlsZXMuaHRtbCBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9maWxlcy5odG1sCmluZGV4IDhkNDIxZWYuLmUyNTViNWMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9maWxlcy5odG1sCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9maWxlcy5odG1sCkBAIC0xLDQ3ICsxLDQ3IEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZGl2IGlkPSJmaWxlcyIgY2xhc3M9ImNsZWFyZml4Ij4NCi0NCi0gIDxkaXYgaWQ9ImZyYW1lIj4NCi0NCi0gICAgPGRpdiBpZD0idHJlZS1ob2xkZXIiPg0KLQ0KLSAgICAgPGpzdHJlZSBjbGFzcz0idHJlZSIgb24tc2VsZWN0PSJzaG93VHJlZUxpbmsoZGF0YSkiIGRhdGE9InRyZWUiIGlkPSJ0cmVlIj48L2pzdHJlZT4NCi0NCi0gICAgPC9kaXY+DQotICAgIDxkaXYgaWQ9ImZpbGUtY29udGVudCIgY2xhc3M9ImNsZWFyZml4Ij4NCi0NCi0gICAgICA8ZGl2IGNsYXNzPSJ0b3AgY2xlYXJmaXgiPg0KLQ0KLSAgICAgICAgPGEgaWQ9InVybCIgY2xhc3M9ImFkZHJlc3MtYmFyIiBocmVmPSJ7e3VybH19IiBuZy1zaG93PSJ1cmwiPnt7dXJsfX08L2E+DQotDQotICAgICAgPC9kaXY+DQotDQotICAgICAgPGRpdiBjbGFzcz0idmlldy1maWxlIj4NCi0NCi0gICAgICAgIDxkaXYgY2xhc3M9InJlc3BvbnNlIiBuZy1zaG93PSJjb250ZW50Ij4NCi0gICAgICAgICAgICA8cHJlIGNsYXNzPSJzeW50YXggbGFuZ3VhZ2Ute3tsYW5nfX0iPjxjb2RlIG5nLWJpbmQtaHRtbD0iY29udGVudCB8IGhpZ2hsaWdodDpsYW5nIHwgdW5zYWZlIj48L2NvZGU+PC9wcmU+DQotICAgICAgICA8L2Rpdj4NCi0NCi0NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgPC9kaXY+DQotDQotICA8L2Rpdj4NCi0NCi08L2Rpdj4NCis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkaXYgaWQ9ImZpbGVzIiBjbGFzcz0iY2xlYXJmaXgiPgorCisgIDxkaXYgaWQ9ImZyYW1lIj4KKworICAgIDxkaXYgaWQ9InRyZWUtaG9sZGVyIj4KKworICAgICA8anN0cmVlIGNsYXNzPSJ0cmVlIiBvbi1zZWxlY3Q9InNob3dUcmVlTGluayhkYXRhKSIgZGF0YT0idHJlZSIgaWQ9InRyZWUiPjwvanN0cmVlPgorCisgICAgPC9kaXY+CisgICAgPGRpdiBpZD0iZmlsZS1jb250ZW50IiBjbGFzcz0iY2xlYXJmaXgiPgorCisgICAgICA8ZGl2IGNsYXNzPSJ0b3AgY2xlYXJmaXgiPgorCisgICAgICAgIDxhIGlkPSJ1cmwiIGNsYXNzPSJhZGRyZXNzLWJhciIgaHJlZj0ie3t1cmx9fSIgbmctc2hvdz0idXJsIj57e3VybH19PC9hPgorCisgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0idmlldy1maWxlIj4KKworICAgICAgICA8ZGl2IGNsYXNzPSJyZXNwb25zZSIgbmctc2hvdz0iY29udGVudCI+CisgICAgICAgICAgICA8cHJlIGNsYXNzPSJzeW50YXggbGFuZ3VhZ2Ute3tsYW5nfX0iPjxjb2RlIG5nLWJpbmQtaHRtbD0iY29udGVudCB8IGhpZ2hsaWdodDpsYW5nIHwgdW5zYWZlIj48L2NvZGU+PC9wcmU+CisgICAgICAgIDwvZGl2PgorCisKKyAgICAgIDwvZGl2PgorCisgICAgPC9kaXY+CisKKyAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL2luZGV4Lmh0bWwgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvaW5kZXguaHRtbAppbmRleCA0YjA4YjJmLi42MWMzNDFkIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvaW5kZXguaHRtbAorKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvaW5kZXguaHRtbApAQCAtMSwyNjEgKzEsMjYxIEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZGl2IGlkPSJpbmRleCIgY2xhc3M9ImNsZWFyZml4Ij4NCi0NCi0gIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4NCi0NCi0gICAgPGRpdiBjbGFzcz0iaW5kZXgtbGVmdCI+DQotDQotICAgICAgPGRpdiBjbGFzcz0iYmxvY2siIGlkPSJpbnN0YW5jZSI+DQotDQotICAgICAgICAgIDxoMj48c3Bhbj5JbnN0YW5jZTwvc3Bhbj48L2gyPg0KLQ0KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCi0NCi0gICAgICAgICAgICA8dWwgY2xhc3M9ImRhdGEiIG5nU2hvdz0ic3lzdGVtIj4NCi0NCi0gICAgICAgICAgICAgIDxsaSBjbGFzcz0ic3RhcnRfdGltZSI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5TdGFydDwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICAgIDxkZCBjbGFzcz0idGltZWFnbyI+e3tzeXN0ZW0uanZtLmpteC5zdGFydFRpbWUgfCB0aW1lYWdvfX08L2RkPg0KLSAgICAgICAgICAgICAgPC9kbD48L2xpPg0KLQ0KLTwhLS0NCi0gICAgICAgICAgICAgIDxsaSBjbGFzcz0iaG9zdCI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5Ib3N0PC9zcGFuPjwvZHQ+DQotICAgICAgICAgICAgICAgICAgPGRkPjwvZGQ+DQotICAgICAgICAgICAgICA8L2RsPjwvbGk+DQotDQotICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRpciBkaXJfY3dkIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgICAgPGR0PjxzcGFuPkNXRDwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICA8ZGQ+PC9kZD4NCi0gICAgICAgICAgICAgIDwvZGw+PC9saT4NCi0NCi0gICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGlyIGRpcl9pbnN0YW5jZSI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5JbnN0YW5jZTwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICA8ZGQ+PC9kZD4NCi0gICAgICAgICAgICAgIDwvZGw+PC9saT4NCi0NCi0gICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGlyIGRpcl9kYXRhIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgICAgPGR0PjxzcGFuPkRhdGE8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgPGRkPjwvZGQ+DQotICAgICAgICAgICAgICA8L2RsPjwvbGk+DQotDQotICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRpciBkaXJfaW5kZXgiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+SW5kZXg8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgPGRkPjwvZGQ+DQotICAgICAgICAgICAgICA8L2RsPjwvbGk+DQotLS0+DQotICAgICAgICAgICAgPC91bD4NCi0NCi0gICAgICAgICAgPC9kaXY+DQotDQotICAgICAgPC9kaXY+DQotDQotICAgICAgPGRpdiBjbGFzcz0iYmxvY2siIGlkPSJ2ZXJzaW9ucyI+DQotDQotICAgICAgICAgIDxoMj48c3Bhbj5WZXJzaW9uczwvc3Bhbj48L2gyPg0KLQ0KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCi0NCi0gICAgICAgICAgICA8dWwgY2xhc3M9ImRhdGEiPg0KLQ0KLSAgICAgICAgICAgICAgPGxpIGNsYXNzPSJzb2xyIHNvbHJfc3BlY192ZXJzaW9uIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgICAgPGR0PjxzcGFuPnNvbHItc3BlYzwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICAgIDxkZD57e3N5c3RlbS5sdWNlbmVbInNvbHItc3BlYy12ZXJzaW9uIl19fTwvZGQ+DQotICAgICAgICAgICAgICA8L2RsPjwvbGk+DQotICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgIDxsaSBjbGFzcz0ic29scl9pbXBsX3ZlcnNpb24iPjxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgICA8ZHQgY2xhc3M9IiI+PHNwYW4+c29sci1pbXBsPC9zcGFuPjwvZHQ+DQotICAgICAgICAgICAgICAgICAgPGRkPnt7c3lzdGVtLmx1Y2VuZVsic29sci1pbXBsLXZlcnNpb24iXX19PC9kZD4NCi0gICAgICAgICAgICAgIDwvZGw+PC9saT4NCi0gICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgPGxpIGNsYXNzPSJsdWNlbmUgbHVjZW5lX3NwZWNfdmVyc2lvbiI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5sdWNlbmUtc3BlYzwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICAgIDxkZD57e3N5c3RlbS5sdWNlbmVbImx1Y2VuZS1zcGVjLXZlcnNpb24iXX19PC9kZD4NCi0gICAgICAgICAgICAgIDwvZGw+PC9saT4NCi0NCi0gICAgICAgICAgICAgIDxsaSBjbGFzcz0ibHVjZW5lX2ltcGxfdmVyc2lvbiI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+ICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5sdWNlbmUtaW1wbDwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICAgIDxkZD57e3N5c3RlbS5sdWNlbmVbImx1Y2VuZS1pbXBsLXZlcnNpb24iXX19PC9kZD4NCi0gICAgICAgICAgICAgIDwvZGw+PC9saT4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICA8L3VsPg0KLQ0KLSAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgPC9kaXY+DQotICAgICAgDQotICAgIDxkaXYgY2xhc3M9ImluZGV4LXJpZ2h0Ij4NCi0NCi0gICAgICA8ZGl2IGNsYXNzPSJibG9jayIgaWQ9InN5c3RlbSI+DQotDQotICAgICAgICAgIDxoMj48c3Bhbj5TeXN0ZW08L3NwYW4+DQotICAgIDxzbWFsbCBjbGFzcz0iYmFyLWRlc2MiPnt7bG9hZF9hdmVyYWdlWzBdfX0ge3tsb2FkX2F2ZXJhZ2VbMV19fSB7e2xvYWRfYXZlcmFnZVsyXX19PC9zbWFsbD4NCi0gICAgPC9oMj4NCi0gICAgICAgICAgPGEgY2xhc3M9InJlbG9hZCIgbmctY2xpY2s9InJlbG9hZCgpIj48c3Bhbj5yZWxvYWQ8L3NwYW4+PC9hPg0KLQ0KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4NCi0NCi0gICAgICAgICAgICA8ZGl2IGlkPSJwaHlzaWNhbC1tZW1vcnktYmFyIiBuZy1zaG93PSJzeXN0ZW0uc3lzdGVtLnRvdGFsUGh5c2ljYWxNZW1vcnlTaXplICYmIHN5c3RlbS5zeXN0ZW0uZnJlZVBoeXNpY2FsTWVtb3J5U2l6ZSI+DQotDQotICAgICAgICAgICAgICA8cCBkYXRhLWRlc2M9InBoeXNpY2FsLW1lbW9yeS1iYXIiPlBoeXNpY2FsIE1lbW9yeQ0KLSAgICAgICAgIDxzbWFsbCBjbGFzcz0iYmFyLWRlc2MiPnt7bWVtb3J5UGVyY2VudGFnZX19PC9zbWFsbD4NCi0gICAgICAgIDwvcD4NCi0gICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci1ob2xkZXIgYmFyLWx2bC0yIj4NCi0NCi0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmFyLW1heCBiYXIiPg0KLSAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYXItbWF4IHZhbCI+e3ttZW1vcnlNYXh9fTwvc3Bhbj4NCi0NCi0gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiYXItdG90YWwgYmFyIiBuZy1zdHlsZT0ie3dpZHRoOm1lbW9yeVBlcmNlbnRhZ2V9Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYXItdG90YWwgdmFsIiB0aXRsZT0icmF3OiB7e21lbW9yeVRvdGFsfX1CIj57e21lbW9yeVRvdGFsRGlzcGxheX19PC9zcGFuPg0KLQ0KLSAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDxkaXYgaWQ9InN3YXAtc3BhY2UtYmFyIiBuZy1zaG93PSJzeXN0ZW0uc3lzdGVtLnRvdGFsU3dhcFNwYWNlU2l6ZSAmJiBzeXN0ZW0uc3lzdGVtLmZyZWVTd2FwU3BhY2VTaXplIj4NCi0NCi0gICAgICAgICAgICAgIDxwIGRhdGEtZGVzYz0ic3dhcC1zcGFjZS1iYXIiPlN3YXAgU3BhY2UNCi0gICAgICAgICAgPHNtYWxsIGNsYXNzPSJiYXItZGVzYyI+e3tzd2FwUGVyY2VudGFnZX19PC9zbWFsbD4NCi0gICAgICAgIDwvcD4NCi0gICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci1ob2xkZXIgYmFyLWx2bC0yIj4NCi0NCi0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmFyLW1heCBiYXIiPg0KLSAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYXItbWF4IHZhbCI+e3tzd2FwTWF4fX08L3NwYW4+DQotDQotICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmFyLXRvdGFsIGJhciIgbmctc3R5bGU9Int3aWR0aDpzd2FwUGVyY2VudGFnZX0iPg0KLSAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJhci10b3RhbCB2YWwiIHRpdGxlPSJyYXc6e3tzd2FwVG90YWx9fUIiPnt7c3dhcFRvdGFsRGlzcGxheX19PC9zcGFuPg0KLQ0KLSAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICA8ZGl2IGlkPSJmaWxlLWRlc2NyaXB0b3ItYmFyIiBuZy1zaG93PSJzeXN0ZW0uc3lzdGVtLm1heEZpbGVEZXNjcmlwdG9yQ291bnQgJiYgc3lzdGVtLnN5c3RlbS5vcGVuRmlsZURlc2NyaXB0b3JDb3VudCI+DQotDQotICAgICAgICAgICAgICA8cCBkYXRhLWRlc2M9ImZpbGUtZGVzY3JpcHRvci1iYXIiPkZpbGUgRGVzY3JpcHRvciBDb3VudA0KLSAgICAgICAgICA8c21hbGwgY2xhc3M9ImJhci1kZXNjIj57e2ZpbGVEZXNjcmlwdG9yUGVyY2VudGFnZX19PC9zbWFsbD4NCi0gICAgICAgIDwvcD4NCi0gICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci1ob2xkZXIgYmFyLWx2bC0yIj4NCi0NCi0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmFyLW1heCBiYXIiPg0KLSAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYXItbWF4IHZhbCI+e3tzeXN0ZW0uc3lzdGVtLm1heEZpbGVEZXNjcmlwdG9yQ291bnR9fTwvc3Bhbj4NCi0NCi0gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiYXItdG90YWwgYmFyIiBuZy1zdHlsZT0ie3dpZHRoOmZpbGVEZXNjcmlwdG9yUGVyY2VudGFnZX0iPg0KLSAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJhci10b3RhbCB2YWwiPnt7c3lzdGVtLnN5c3RlbS5vcGVuRmlsZURlc2NyaXB0b3JDb3VudH19PC9zcGFuPg0KLQ0KLSAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgIDxwIGNsYXNzPSJuby1pbmZvIiBuZy1zaG93PSJub0luZm8iPlNvcnJ5LCBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGU8L3A+DQotDQotICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgIDwvZGl2Pg0KLQ0KLSAgICA8L2Rpdj4NCi0NCi0gIDwvZGl2Pg0KLQ0KLSAgPGRpdiBjbGFzcz0iY2xlYXJmaXgiPg0KLQ0KLSAgICA8ZGl2IGNsYXNzPSJpbmRleC1sZWZ0Ij4NCi0NCi0gICAgICA8ZGl2IGNsYXNzPSJibG9jayIgaWQ9Imp2bSI+DQotDQotICAgICAgICAgIDxoMj48c3Bhbj5KVk08L3NwYW4+PC9oMj4NCi0NCi0gICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCBjbGVhcmZpeCI+DQotDQotICAgICAgICAgICAgPHVsIGNsYXNzPSJkYXRhIj4NCi0NCi0gICAgICAgICAgICAgIDxsaSBjbGFzcz0ianZtX3ZlcnNpb24iPjxkbCBjbGFzcz0iY2xlYXJmaXgiPiAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+UnVudGltZTwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICAgIDxkZD57e3N5c3RlbS5qdm0ubmFtZX19IHt7c3lzdGVtLmp2bS52ZXJzaW9ufX08L2RkPg0KLSAgICAgICAgICAgICAgPC9kbD48L2xpPg0KLQ0KLSAgICAgICAgICAgICAgPGxpIGNsYXNzPSJwcm9jZXNzb3JzIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4gICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgPGR0PjxzcGFuPlByb2Nlc3NvcnM8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgICA8ZGQ+e3tzeXN0ZW0uanZtLnByb2Nlc3NvcnN9fTwvZGQ+DQotICAgICAgICAgICAgICA8L2RsPjwvbGk+DQotDQotICAgICAgICAgICAgICA8bGkgY2xhc3M9ImNvbW1hbmRfbGluZV9hcmdzIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgICAgPGR0PjxzcGFuPkFyZ3M8L3NwYW4+PC9kdD4NCi0gICAgICAgICAgICAgICAgPGRkIG5nLXJlcGVhdD0iYXJnIGluIGNvbW1hbmRMaW5lQXJncyIgbmctY2xhc3M9Insnb2RkJzokb2RkfSI+e3thcmd9fTwvZGQ+DQotICAgICAgICAgICAgICA8L2RsPjwvbGk+DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgPC91bD4NCi0NCi0gICAgICAgICAgPC9kaXY+DQotDQotICAgICAgPC9kaXY+DQotDQotICAgIDwvZGl2Pg0KLSAgICA8ZGl2IGNsYXNzPSJpbmRleC1yaWdodCI+DQotDQotICAgICAgPGRpdiBjbGFzcz0iYmxvY2siIGlkPSJqdm0tbWVtb3J5Ij4NCi0NCi0gICAgICAgICAgPGgyPjxzcGFuIGRhdGEtZGVzYz0ianZtLW1lbW9yeS1iYXIiPkpWTS1NZW1vcnkNCi0gICAgICAgPHNtYWxsIGNsYXNzPSJiYXItZGVzYyI+e3tqYXZhTWVtb3J5UGVyY2VudGFnZX19PC9zbWFsbD4NCi0gICAgPC9zcGFuPjwvaDI+DQotDQotICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KLQ0KLSAgICAgICAgICAgIDxkaXYgaWQ9Imp2bS1tZW1vcnktYmFyIj4NCi0gICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci1ob2xkZXIgYmFyLWx2bC0zIj4NCi0NCi0gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmFyLW1heCBiYXIiPg0KLSAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYXItbWF4IHZhbCIgdGl0bGU9InJhdzoge3tqYXZhTWVtb3J5TWF4fX0iPnt7amF2YU1lbW9yeU1heH19PC9zcGFuPg0KLQ0KLSAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci10b3RhbCBiYXIiIG5nLXN0eWxlPSJ7d2lkdGg6IGphdmFNZW1vcnlUb3RhbFBlcmNlbnRhZ2V9Ij4NCi0gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYXItdG90YWwgdmFsIiB0aXRsZT0icmF3OiB7e2phdmFNZW1vcnlUb3RhbH19QiI+e3tqYXZhTWVtb3J5VG90YWxEaXNwbGF5fX08L3NwYW4+DQotDQotICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiYXItdXNlZCBiYXIiIG5nLXN0eWxlPSJ7d2lkdGg6IGphdmFNZW1vcnlVc2VkUGVyY2VudGFnZX0iPg0KLSAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYmFyLXVzZWQgdmFsIiB0aXRsZT0icmF3OiB7e2phdmFNZW1vcnlVc2VkfX1CIj57e2phdmFNZW1vcnlVc2VkRGlzcGxheX19PC9zcGFuPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgIDwvZGl2Pg0KLQ0KLSAgICA8L2Rpdj4NCi0NCi0gIDwvZGl2Pg0KLQ0KLTwvZGl2Pg0KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRpdiBpZD0iaW5kZXgiIGNsYXNzPSJjbGVhcmZpeCI+CisKKyAgPGRpdiBjbGFzcz0iY2xlYXJmaXgiPgorCisgICAgPGRpdiBjbGFzcz0iaW5kZXgtbGVmdCI+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsb2NrIiBpZD0iaW5zdGFuY2UiPgorCisgICAgICAgICAgPGgyPjxzcGFuPkluc3RhbmNlPC9zcGFuPjwvaDI+CisKKyAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKworICAgICAgICAgICAgPHVsIGNsYXNzPSJkYXRhIiBuZ1Nob3c9InN5c3RlbSI+CisKKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJzdGFydF90aW1lIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+U3RhcnQ8L3NwYW4+PC9kdD4KKyAgICAgICAgICAgICAgICAgIDxkZCBjbGFzcz0idGltZWFnbyI+e3tzeXN0ZW0uanZtLmpteC5zdGFydFRpbWUgfCB0aW1lYWdvfX08L2RkPgorICAgICAgICAgICAgICA8L2RsPjwvbGk+CisKKzwhLS0KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJob3N0Ij48ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+SG9zdDwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgICAgPGRkPjwvZGQ+CisgICAgICAgICAgICAgIDwvZGw+PC9saT4KKworICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRpciBkaXJfY3dkIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+Q1dEPC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgPGRkPjwvZGQ+CisgICAgICAgICAgICAgIDwvZGw+PC9saT4KKworICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRpciBkaXJfaW5zdGFuY2UiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5JbnN0YW5jZTwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgIDxkZD48L2RkPgorICAgICAgICAgICAgICA8L2RsPjwvbGk+CisKKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJkaXIgZGlyX2RhdGEiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5EYXRhPC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgPGRkPjwvZGQ+CisgICAgICAgICAgICAgIDwvZGw+PC9saT4KKworICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRpciBkaXJfaW5kZXgiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5JbmRleDwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgIDxkZD48L2RkPgorICAgICAgICAgICAgICA8L2RsPjwvbGk+CistLT4KKyAgICAgICAgICAgIDwvdWw+CisKKyAgICAgICAgICA8L2Rpdj4KKworICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsb2NrIiBpZD0idmVyc2lvbnMiPgorCisgICAgICAgICAgPGgyPjxzcGFuPlZlcnNpb25zPC9zcGFuPjwvaDI+CisKKyAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKworICAgICAgICAgICAgPHVsIGNsYXNzPSJkYXRhIj4KKworICAgICAgICAgICAgICA8bGkgY2xhc3M9InNvbHIgc29scl9zcGVjX3ZlcnNpb24iPjxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5zb2xyLXNwZWM8L3NwYW4+PC9kdD4KKyAgICAgICAgICAgICAgICAgIDxkZD57e3N5c3RlbS5sdWNlbmVbInNvbHItc3BlYy12ZXJzaW9uIl19fTwvZGQ+CisgICAgICAgICAgICAgIDwvZGw+PC9saT4KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic29scl9pbXBsX3ZlcnNpb24iPjxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICAgIDxkdCBjbGFzcz0iIj48c3Bhbj5zb2xyLWltcGw8L3NwYW4+PC9kdD4KKyAgICAgICAgICAgICAgICAgIDxkZD57e3N5c3RlbS5sdWNlbmVbInNvbHItaW1wbC12ZXJzaW9uIl19fTwvZGQ+CisgICAgICAgICAgICAgIDwvZGw+PC9saT4KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibHVjZW5lIGx1Y2VuZV9zcGVjX3ZlcnNpb24iPjxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5sdWNlbmUtc3BlYzwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgICAgPGRkPnt7c3lzdGVtLmx1Y2VuZVsibHVjZW5lLXNwZWMtdmVyc2lvbiJdfX08L2RkPgorICAgICAgICAgICAgICA8L2RsPjwvbGk+CisKKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJsdWNlbmVfaW1wbF92ZXJzaW9uIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4gICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+bHVjZW5lLWltcGw8L3NwYW4+PC9kdD4KKyAgICAgICAgICAgICAgICAgIDxkZD57e3N5c3RlbS5sdWNlbmVbImx1Y2VuZS1pbXBsLXZlcnNpb24iXX19PC9kZD4KKyAgICAgICAgICAgICAgPC9kbD48L2xpPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8L3VsPgorCisgICAgICAgICAgPC9kaXY+CisKKyAgICAgIDwvZGl2PgorCisgICAgPC9kaXY+CisgICAgICAKKyAgICA8ZGl2IGNsYXNzPSJpbmRleC1yaWdodCI+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsb2NrIiBpZD0ic3lzdGVtIj4KKworICAgICAgICAgIDxoMj48c3Bhbj5TeXN0ZW08L3NwYW4+CisgICAgPHNtYWxsIGNsYXNzPSJiYXItZGVzYyI+e3tsb2FkX2F2ZXJhZ2VbMF19fSB7e2xvYWRfYXZlcmFnZVsxXX19IHt7bG9hZF9hdmVyYWdlWzJdfX08L3NtYWxsPgorICAgIDwvaDI+CisgICAgICAgICAgPGEgY2xhc3M9InJlbG9hZCIgbmctY2xpY2s9InJlbG9hZCgpIj48c3Bhbj5yZWxvYWQ8L3NwYW4+PC9hPgorCisgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CisKKyAgICAgICAgICAgIDxkaXYgaWQ9InBoeXNpY2FsLW1lbW9yeS1iYXIiIG5nLXNob3c9InN5c3RlbS5zeXN0ZW0udG90YWxQaHlzaWNhbE1lbW9yeVNpemUgJiYgc3lzdGVtLnN5c3RlbS5mcmVlUGh5c2ljYWxNZW1vcnlTaXplIj4KKworICAgICAgICAgICAgICA8cCBkYXRhLWRlc2M9InBoeXNpY2FsLW1lbW9yeS1iYXIiPlBoeXNpY2FsIE1lbW9yeQorICAgICAgICAgPHNtYWxsIGNsYXNzPSJiYXItZGVzYyI+e3ttZW1vcnlQZXJjZW50YWdlfX08L3NtYWxsPgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci1ob2xkZXIgYmFyLWx2bC0yIj4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci1tYXggYmFyIj4KKyAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYXItbWF4IHZhbCI+e3ttZW1vcnlNYXh9fTwvc3Bhbj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmFyLXRvdGFsIGJhciIgbmctc3R5bGU9Int3aWR0aDptZW1vcnlQZXJjZW50YWdlfSI+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYXItdG90YWwgdmFsIiB0aXRsZT0icmF3OiB7e21lbW9yeVRvdGFsfX1CIj57e21lbW9yeVRvdGFsRGlzcGxheX19PC9zcGFuPgorCisgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPGRpdiBpZD0ic3dhcC1zcGFjZS1iYXIiIG5nLXNob3c9InN5c3RlbS5zeXN0ZW0udG90YWxTd2FwU3BhY2VTaXplICYmIHN5c3RlbS5zeXN0ZW0uZnJlZVN3YXBTcGFjZVNpemUiPgorCisgICAgICAgICAgICAgIDxwIGRhdGEtZGVzYz0ic3dhcC1zcGFjZS1iYXIiPlN3YXAgU3BhY2UKKyAgICAgICAgICA8c21hbGwgY2xhc3M9ImJhci1kZXNjIj57e3N3YXBQZXJjZW50YWdlfX08L3NtYWxsPgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci1ob2xkZXIgYmFyLWx2bC0yIj4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci1tYXggYmFyIj4KKyAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYXItbWF4IHZhbCI+e3tzd2FwTWF4fX08L3NwYW4+CisKKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci10b3RhbCBiYXIiIG5nLXN0eWxlPSJ7d2lkdGg6c3dhcFBlcmNlbnRhZ2V9Ij4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJhci10b3RhbCB2YWwiIHRpdGxlPSJyYXc6e3tzd2FwVG90YWx9fUIiPnt7c3dhcFRvdGFsRGlzcGxheX19PC9zcGFuPgorCisgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgIDxkaXYgaWQ9ImZpbGUtZGVzY3JpcHRvci1iYXIiIG5nLXNob3c9InN5c3RlbS5zeXN0ZW0ubWF4RmlsZURlc2NyaXB0b3JDb3VudCAmJiBzeXN0ZW0uc3lzdGVtLm9wZW5GaWxlRGVzY3JpcHRvckNvdW50Ij4KKworICAgICAgICAgICAgICA8cCBkYXRhLWRlc2M9ImZpbGUtZGVzY3JpcHRvci1iYXIiPkZpbGUgRGVzY3JpcHRvciBDb3VudAorICAgICAgICAgIDxzbWFsbCBjbGFzcz0iYmFyLWRlc2MiPnt7ZmlsZURlc2NyaXB0b3JQZXJjZW50YWdlfX08L3NtYWxsPgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci1ob2xkZXIgYmFyLWx2bC0yIj4KKworICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci1tYXggYmFyIj4KKyAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYXItbWF4IHZhbCI+e3tzeXN0ZW0uc3lzdGVtLm1heEZpbGVEZXNjcmlwdG9yQ291bnR9fTwvc3Bhbj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmFyLXRvdGFsIGJhciIgbmctc3R5bGU9Int3aWR0aDpmaWxlRGVzY3JpcHRvclBlcmNlbnRhZ2V9Ij4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJhci10b3RhbCB2YWwiPnt7c3lzdGVtLnN5c3RlbS5vcGVuRmlsZURlc2NyaXB0b3JDb3VudH19PC9zcGFuPgorCisgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgPHAgY2xhc3M9Im5vLWluZm8iIG5nLXNob3c9Im5vSW5mbyI+U29ycnksIG5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZTwvcD4KKworICAgICAgICAgIDwvZGl2PgorCisgICAgICA8L2Rpdj4KKworICAgIDwvZGl2PgorCisgIDwvZGl2PgorCisgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4KKworICAgIDxkaXYgY2xhc3M9ImluZGV4LWxlZnQiPgorCisgICAgICA8ZGl2IGNsYXNzPSJibG9jayIgaWQ9Imp2bSI+CisKKyAgICAgICAgICA8aDI+PHNwYW4+SlZNPC9zcGFuPjwvaDI+CisKKyAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50IGNsZWFyZml4Ij4KKworICAgICAgICAgICAgPHVsIGNsYXNzPSJkYXRhIj4KKworICAgICAgICAgICAgICA8bGkgY2xhc3M9Imp2bV92ZXJzaW9uIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4gICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+UnVudGltZTwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgICAgPGRkPnt7c3lzdGVtLmp2bS5uYW1lfX0ge3tzeXN0ZW0uanZtLnZlcnNpb259fTwvZGQ+CisgICAgICAgICAgICAgIDwvZGw+PC9saT4KKworICAgICAgICAgICAgICA8bGkgY2xhc3M9InByb2Nlc3NvcnMiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPiAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDxkdD48c3Bhbj5Qcm9jZXNzb3JzPC9zcGFuPjwvZHQ+CisgICAgICAgICAgICAgICAgICA8ZGQ+e3tzeXN0ZW0uanZtLnByb2Nlc3NvcnN9fTwvZGQ+CisgICAgICAgICAgICAgIDwvZGw+PC9saT4KKworICAgICAgICAgICAgICA8bGkgY2xhc3M9ImNvbW1hbmRfbGluZV9hcmdzIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgICA8ZHQ+PHNwYW4+QXJnczwvc3Bhbj48L2R0PgorICAgICAgICAgICAgICAgIDxkZCBuZy1yZXBlYXQ9ImFyZyBpbiBjb21tYW5kTGluZUFyZ3MiIG5nLWNsYXNzPSJ7J29kZCc6JG9kZH0iPnt7YXJnfX08L2RkPgorICAgICAgICAgICAgICA8L2RsPjwvbGk+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDwvdWw+CisKKyAgICAgICAgICA8L2Rpdj4KKworICAgICAgPC9kaXY+CisKKyAgICA8L2Rpdj4KKyAgICA8ZGl2IGNsYXNzPSJpbmRleC1yaWdodCI+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsb2NrIiBpZD0ianZtLW1lbW9yeSI+CisKKyAgICAgICAgICA8aDI+PHNwYW4gZGF0YS1kZXNjPSJqdm0tbWVtb3J5LWJhciI+SlZNLU1lbW9yeQorICAgICAgIDxzbWFsbCBjbGFzcz0iYmFyLWRlc2MiPnt7amF2YU1lbW9yeVBlcmNlbnRhZ2V9fTwvc21hbGw+CisgICAgPC9zcGFuPjwvaDI+CisKKyAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKworICAgICAgICAgICAgPGRpdiBpZD0ianZtLW1lbW9yeS1iYXIiPgorICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiYXItaG9sZGVyIGJhci1sdmwtMyI+CisKKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJiYXItbWF4IGJhciI+CisgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYmFyLW1heCB2YWwiIHRpdGxlPSJyYXc6IHt7amF2YU1lbW9yeU1heH19Ij57e2phdmFNZW1vcnlNYXh9fTwvc3Bhbj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmFyLXRvdGFsIGJhciIgbmctc3R5bGU9Int3aWR0aDogamF2YU1lbW9yeVRvdGFsUGVyY2VudGFnZX0iPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYmFyLXRvdGFsIHZhbCIgdGl0bGU9InJhdzoge3tqYXZhTWVtb3J5VG90YWx9fUIiPnt7amF2YU1lbW9yeVRvdGFsRGlzcGxheX19PC9zcGFuPgorCisgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhci11c2VkIGJhciIgbmctc3R5bGU9Int3aWR0aDogamF2YU1lbW9yeVVzZWRQZXJjZW50YWdlfSI+CisgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJhci11c2VkIHZhbCIgdGl0bGU9InJhdzoge3tqYXZhTWVtb3J5VXNlZH19QiI+e3tqYXZhTWVtb3J5VXNlZERpc3BsYXl9fTwvc3Bhbj4KKworICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgPC9kaXY+CisKKyAgICAgIDwvZGl2PgorCisgICAgPC9kaXY+CisKKyAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL2phdmEtcHJvcGVydGllcy5odG1sIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL2phdmEtcHJvcGVydGllcy5odG1sCmluZGV4IDk3OGYwZjcuLjA0N2RlNDggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9qYXZhLXByb3BlcnRpZXMuaHRtbAorKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvamF2YS1wcm9wZXJ0aWVzLmh0bWwKQEAgLTEsMjcgKzEsMjcgQEAKLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLSAgICA8ZGl2IGlkPSJqYXZhLXByb3BlcnRpZXMiPg0KLSAgICAgIDx1bD4NCi0gICAgICAgIDxsaSBuZy1jbGFzcz0ie29kZDokb2RkfSIgbmctcmVwZWF0PSJwcm9wIGluIHByb3BzIHwgb3JkZXJPYmplY3RCeTonbmFtZSciPg0KLSAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICA8ZHQgbmctYmluZC1odG1sPSJwcm9wLm5hbWUgfCB1bnNhZmUiPjwvZHQ+DQotICAgICAgICAgICAgPGRkIG5nLWNsYXNzPSJ7b2RkOiRvZGQsIG11bHRpOnByb3BzLmxlbmd0aCZndDsxfSIgbmctcmVwZWF0PSJ2YWx1ZSBpbiBwcm9wLnZhbHVlcyI+e3t2YWx1ZS52YWx1ZX19PC9kZD4NCi0gICAgICAgICAgPC9kbD4NCi0gICAgICAgIDwvbGk+DQotICAgICAgPC91bD4NCi0gICAgPC9kaXY+DQotDQorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgPGRpdiBpZD0iamF2YS1wcm9wZXJ0aWVzIj4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpIG5nLWNsYXNzPSJ7b2RkOiRvZGR9IiBuZy1yZXBlYXQ9InByb3AgaW4gcHJvcHMgfCBvcmRlck9iamVjdEJ5OiduYW1lJyI+CisgICAgICAgICAgPGRsIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICA8ZHQgbmctYmluZC1odG1sPSJwcm9wLm5hbWUgfCB1bnNhZmUiPjwvZHQ+CisgICAgICAgICAgICA8ZGQgbmctY2xhc3M9IntvZGQ6JG9kZCwgbXVsdGk6cHJvcHMubGVuZ3RoJmd0OzF9IiBuZy1yZXBlYXQ9InZhbHVlIGluIHByb3AudmFsdWVzIj57e3ZhbHVlLnZhbHVlfX08L2RkPgorICAgICAgICAgIDwvZGw+CisgICAgICAgIDwvbGk+CisgICAgICA8L3VsPgorICAgIDwvZGl2PgorCmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvbG9nZ2luZy1sZXZlbHMuaHRtbCBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9sb2dnaW5nLWxldmVscy5odG1sCmluZGV4IDRlMjEwZjAuLjVhNGEyZDYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9sb2dnaW5nLWxldmVscy5odG1sCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9sb2dnaW5nLWxldmVscy5odG1sCkBAIC0xLDU2ICsxLDU2IEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZGl2IGlkPSJsb2dnaW5nIiBjbGFzcz0iY2xlYXJmaXgiPg0KLQ0KLQ0KLSAgPGRpdiBpZD0iZnJhbWUiPg0KLQ0KLSAgICA8ZGl2IGNsYXNzPSJibG9jayI+DQotICAgICAgPGgyPjxzcGFuPnt7d2F0Y2hlcn19PC9zcGFuPjwvaDI+DQotICAgICAgPHVsIGNsYXNzPSJ0cmVlIGpzdHJlZSI+DQotICAgICAgICA8bGkgY2xhc3M9ImpzdHJlZS1sZWFmIGxldmVsLXt7bG9nZ2VyLmxldmVsLnRvTG93ZXJDYXNlKCl9fSIgbmctY2xhc3M9InsnanN0cmVlLWxhc3QnOiRsYXN0fSIgbmctcmVwZWF0PSJsb2dnZXIgaW4gbG9nZ2luZyIgbmctaW5jbHVkZT0iJ2xvZ2dlci5odG1sJyI+PC9saT4NCi0gICAgICA8L3VsPg0KLSAgICA8L2Rpdj4NCi0gIDwvZGl2Pg0KLTwvZGl2Pg0KLQ0KLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L25nLXRlbXBsYXRlIiAgaWQ9ImxvZ2dlci5odG1sIj4NCi0gICAgICA8aW5zIGNsYXNzPSJ0cmlnZ2VyIGpzdHJlZS1pY29uIj4mbmJzcDs8L2lucz4NCi0gICAgICA8YSBuZy1jbGljaz0idG9nZ2xlT3B0aW9ucyhsb2dnZXIpIiBjbGFzcz0idHJpZ2dlciB7e2xvZ2dlci5sZXZlbC50b0xvd2VyQ2FzZSgpIH19IiBuZy1jbGFzcz0ie251bGw6IWxvZ2dlci5sZXZlbCwgc2V0OiBsb2dnZXIuc2V0fSIgdGl0bGU9Int7IGxvZ2dlci5uYW1lIH19IiByZWw9Int7bG9nZ2VyLmxldmVsfX0iPg0KLSAgICAgICAgPHNwYW4gY2xhc3M9Im5zIj57e2xvZ2dlci5uYW1lfX08L3NwYW4+DQotICAgICAgICA8c3BhbiBjbGFzcz0ibmFtZSIgbmctc2hvdz0ibG9nZ2VyLnNob3J0Ij57eyBsb2dnZXIuc2hvcnQgfX08L3NwYW4+DQotICAgICAgICA8c3BhbiBjbGFzcz0ibmFtZSIgbmctc2hvdz0iIWxvZ2dlci5zaG9ydCI+PGVtPmVtcHR5PC9lbT48L3NwYW4+DQotICAgICAgPC9hPg0KLQ0KLSAgICAgIDxkaXYgY2xhc3M9InNlbGVjdG9yLWhvbGRlciIgbmctY2xhc3M9IntvcGVuOmxvZ2dlci5zaG93T3B0aW9uc30iPg0KLSAgICAgICAgPGRpdiBjbGFzcz0ic2VsZWN0b3IiPg0KLSAgICAgICAgICA8YSBjbGFzcz0idHJpZ2dlciIgbmctY2xpY2s9InRvZ2dsZU9wdGlvbnMobG9nZ2VyKSI+PHNwYW4+PGVtPnt7bG9nZ2VyLmxldmVsIHx8ICJudWxsIn19PC9lbT48L3NwYW4+PC9hPg0KLSAgICAgICAgICA8ZGl2IG5nLXNob3c9ImxvZ2dlci5zaG93T3B0aW9ucyI+DQotICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICA8bGkgbmctcmVwZWF0PSJsZXZlbCBpbiBsZXZlbHMgdHJhY2sgYnkgbGV2ZWwucG9zIj4NCi0gICAgICAgICAgICAgIDxhIG5nLWNsaWNrPSJzZXRMZXZlbChsb2dnZXIsIGxldmVsLm5hbWUpIj57e2xldmVsLm5hbWV9fTwvYT4NCi0gICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgIDxsaSBjbGFzcz0idW5zZXQiPjxhIG5nLWNsaWNrPSJzZXRMZXZlbChsb2dnZXIsICd1bnNldCcpIj5VTlNFVDwvYT48L2xpPg0KLSAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICA8YSBjbGFzcz0iY2xvc2UiIG5nLWNsaWNrPSJ0b2dnbGVPcHRpb25zKGxvZ2dlcikiPjxzcGFuPlt4XTwvc3Bhbj48L2E+DQotICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgPC9kaXY+DQotICAgICAgPC9kaXY+DQotICAgICAgPHVsPg0KLSAgICAgICAgPGxpIGNsYXNzPSJqc3RyZWUtbGVhZiBsZXZlbC17e2xvZ2dlci5sZXZlbC50b0xvd2VyQ2FzZSgpfX0iIG5nLWNsYXNzPSJ7J2pzdHJlZS1sYXN0JzokbGFzdH0iIG5nLXJlcGVhdD0ibG9nZ2VyIGluIGxvZ2dlci5jaGlsZHJlbiIgbmctaW5jbHVkZT0iJ2xvZ2dlci5odG1sJyI+PC9saT4NCi0gICAgICA8L3VsPg0KLSAgPC9zY3JpcHQ+DQorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZGl2IGlkPSJsb2dnaW5nIiBjbGFzcz0iY2xlYXJmaXgiPgorCisKKyAgPGRpdiBpZD0iZnJhbWUiPgorCisgICAgPGRpdiBjbGFzcz0iYmxvY2siPgorICAgICAgPGgyPjxzcGFuPnt7d2F0Y2hlcn19PC9zcGFuPjwvaDI+CisgICAgICA8dWwgY2xhc3M9InRyZWUganN0cmVlIj4KKyAgICAgICAgPGxpIGNsYXNzPSJqc3RyZWUtbGVhZiBsZXZlbC17e2xvZ2dlci5sZXZlbC50b0xvd2VyQ2FzZSgpfX0iIG5nLWNsYXNzPSJ7J2pzdHJlZS1sYXN0JzokbGFzdH0iIG5nLXJlcGVhdD0ibG9nZ2VyIGluIGxvZ2dpbmciIG5nLWluY2x1ZGU9Iidsb2dnZXIuaHRtbCciPjwvbGk+CisgICAgICA8L3VsPgorICAgIDwvZGl2PgorICA8L2Rpdj4KKzwvZGl2PgorCisgIDxzY3JpcHQgdHlwZT0idGV4dC9uZy10ZW1wbGF0ZSIgIGlkPSJsb2dnZXIuaHRtbCI+CisgICAgICA8aW5zIGNsYXNzPSJ0cmlnZ2VyIGpzdHJlZS1pY29uIj4mbmJzcDs8L2lucz4KKyAgICAgIDxhIG5nLWNsaWNrPSJ0b2dnbGVPcHRpb25zKGxvZ2dlcikiIGNsYXNzPSJ0cmlnZ2VyIHt7bG9nZ2VyLmxldmVsLnRvTG93ZXJDYXNlKCkgfX0iIG5nLWNsYXNzPSJ7bnVsbDohbG9nZ2VyLmxldmVsLCBzZXQ6IGxvZ2dlci5zZXR9IiB0aXRsZT0ie3sgbG9nZ2VyLm5hbWUgfX0iIHJlbD0ie3tsb2dnZXIubGV2ZWx9fSI+CisgICAgICAgIDxzcGFuIGNsYXNzPSJucyI+e3tsb2dnZXIubmFtZX19PC9zcGFuPgorICAgICAgICA8c3BhbiBjbGFzcz0ibmFtZSIgbmctc2hvdz0ibG9nZ2VyLnNob3J0Ij57eyBsb2dnZXIuc2hvcnQgfX08L3NwYW4+CisgICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIiBuZy1zaG93PSIhbG9nZ2VyLnNob3J0Ij48ZW0+ZW1wdHk8L2VtPjwvc3Bhbj4KKyAgICAgIDwvYT4KKworICAgICAgPGRpdiBjbGFzcz0ic2VsZWN0b3ItaG9sZGVyIiBuZy1jbGFzcz0ie29wZW46bG9nZ2VyLnNob3dPcHRpb25zfSI+CisgICAgICAgIDxkaXYgY2xhc3M9InNlbGVjdG9yIj4KKyAgICAgICAgICA8YSBjbGFzcz0idHJpZ2dlciIgbmctY2xpY2s9InRvZ2dsZU9wdGlvbnMobG9nZ2VyKSI+PHNwYW4+PGVtPnt7bG9nZ2VyLmxldmVsIHx8ICJudWxsIn19PC9lbT48L3NwYW4+PC9hPgorICAgICAgICAgIDxkaXYgbmctc2hvdz0ibG9nZ2VyLnNob3dPcHRpb25zIj4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGkgbmctcmVwZWF0PSJsZXZlbCBpbiBsZXZlbHMgdHJhY2sgYnkgbGV2ZWwucG9zIj4KKyAgICAgICAgICAgICAgPGEgbmctY2xpY2s9InNldExldmVsKGxvZ2dlciwgbGV2ZWwubmFtZSkiPnt7bGV2ZWwubmFtZX19PC9hPgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDxsaSBjbGFzcz0idW5zZXQiPjxhIG5nLWNsaWNrPSJzZXRMZXZlbChsb2dnZXIsICd1bnNldCcpIj5VTlNFVDwvYT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgICAgPGEgY2xhc3M9ImNsb3NlIiBuZy1jbGljaz0idG9nZ2xlT3B0aW9ucyhsb2dnZXIpIj48c3Bhbj5beF08L3NwYW4+PC9hPgorICAgICAgICAgIDwvZGl2PgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9ImpzdHJlZS1sZWFmIGxldmVsLXt7bG9nZ2VyLmxldmVsLnRvTG93ZXJDYXNlKCl9fSIgbmctY2xhc3M9InsnanN0cmVlLWxhc3QnOiRsYXN0fSIgbmctcmVwZWF0PSJsb2dnZXIgaW4gbG9nZ2VyLmNoaWxkcmVuIiBuZy1pbmNsdWRlPSInbG9nZ2VyLmh0bWwnIj48L2xpPgorICAgICAgPC91bD4KKyAgPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvbG9nZ2luZy5odG1sIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL2xvZ2dpbmcuaHRtbAppbmRleCBlMzIyNTY0Li5kNTg1MGU3IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvbG9nZ2luZy5odG1sCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9sb2dnaW5nLmh0bWwKQEAgLTEsNTYgKzEsNTYgQEAKLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxkaXYgaWQ9ImxvZ2dpbmciIGNsYXNzPSJjbGVhcmZpeCI+DQotDQotICA8ZGl2IGlkPSJ2aWV3ZXIiPg0KLSAgICA8ZGl2IGNsYXNzPSJibG9jayI+DQotICAgICAgPGgyPjxzcGFuPnt7d2F0Y2hlcn19PC9zcGFuPjwvaDI+DQotICAgIDwvZGl2Pg0KLSAgICA8dGFibGUgY2xhc3M9Imhhcy1kYXRhIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+DQotICAgICAgPHRoZWFkPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICA8dGggY2xhc3M9InRpbWUiPlRpbWUgKDxzcGFuPnt7dGltZXpvbmV9fTwvc3Bhbj4pPC90aD4NCi0gICAgICAgICAgPHRoIGNsYXNzPSJsZXZlbCI+TGV2ZWw8L3RoPg0KLSAgICAgICAgICA8dGggY2xhc3M9ImNvcmUiPkNvcmU8L3RoPg0KLSAgICAgICAgICA8dGggY2xhc3M9ImxvZ2dlciI+TG9nZ2VyPC90aD4NCi0gICAgICAgICAgPHRoIGNsYXNzPSJtZXNzYWdlIj5NZXNzYWdlPC90aD4NCi0gICAgICAgIDwvdHI+DQotICAgICAgPC90aGVhZD4NCi0gICAgICA8dGJvZHkgbmctcmVwZWF0PSJldmVudCBpbiBldmVudHMiPg0KLSAgICAgICAgPHRyIG5nLWNsaWNrPSJ0b2dnbGVSb3coZXZlbnQpIiBjbGFzcz0ie3tldmVudC50cmFjZSA/ICdoYXMtdHJhY2UnOiAnJ319IHt7J2xldmVsLScrZXZlbnQubGV2ZWwudG9Mb3dlckNhc2UoKX19Ij4NCi0gICAgICAgICAgPHRkIGNsYXNzPSJzcGFuIj48YT48c3Bhbj57eyB0aW1lem9uZSA9PSAiVVRDIiA/IGV2ZW50LnV0Y190aW1lIDogZXZlbnQubG9jYWxfdGltZSB9fTwvc3Bhbj48L2E+PC90ZD4NCi0gICAgICAgICAgPHRkIGNsYXNzPSJsZXZlbCBzcGFuIj48YT48c3Bhbj57eyBldmVudC5sZXZlbCB9fSB7e2V2ZW50LnNob3dUcmFjZX19PC9zcGFuPjwvc3Bhbj48L2E+PC90ZD4NCi0gICAgICAgICAgPHRkIGNsYXNzPSJzcGFuIj48YT48c3Bhbj57eyBldmVudC5jb3JlIH19PC9zcGFuPjwvYT48L3RkPg0KLSAgICAgICAgICA8dGQgY2xhc3M9InNwYW4iPjxhPjxzcGFuPjxhYmJyIHRpdGxlPSJ7e2V2ZW50LmxvZ2dlcn19Ij57e2V2ZW50LmxvZ2dlckJhc2V9fTwvYWJicj48L3NwYW4+PC9hPjwvdGQ+DQotICAgICAgICAgIDx0ZCBjbGFzcz0ibWVzc2FnZSBzcGFuIj48YT48c3Bhbj57eyBldmVudC5tZXNzYWdlIH19PC9zcGFuPjwvYT48L3RkPg0KLSAgICAgICAgPC90cj4NCi0gICAgICAgIDx0ciBjbGFzcz0idHJhY2UiIG5nLXNob3c9ImV2ZW50LnNob3dUcmFjZSAmJiBldmVudC50cmFjZSI+DQotICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij48cHJlPnt7ZXZlbnQudHJhY2V9fTwvcHJlPjwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgIDwvdGJvZHk+DQotICAgICAgPHRmb290Pg0KLSAgICAgICAgPHRyIG5nLXNob3c9ImV2ZW50cy5sZW5ndGg9PTAiPg0KLSAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+Tm8gRXZlbnRzIGF2YWlsYWJsZTwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgIDwvdGhlYWQ+DQotICAgIDwvdGFibGU+DQotICAgIDxkaXYgaWQ9ImZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICA8ZGl2IGlkPSJzdGF0ZSIgY2xhc3M9ImxvYWRlciI+TGFzdCBDaGVjazoge3tzaW5jZURpc3BsYXl9fTwvZGl2Pg0KLSAgICAgIDxkaXYgaWQ9ImRhdGUtZm9ybWF0IiBuZy1jbGljaz0idG9nZ2xlVGltZXpvbmUoKSI+PGEgbmctY2xhc3M9IntvbjogdGltZXpvbmU9PSdVVEMnfSI+U2hvdyBkYXRlcyBpbiBVVEM8L2E+PC9kaXY+DQotICAgIDwvZGl2Pg0KLSAgPC9kaXY+DQotPC9kaXY+DQorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZGl2IGlkPSJsb2dnaW5nIiBjbGFzcz0iY2xlYXJmaXgiPgorCisgIDxkaXYgaWQ9InZpZXdlciI+CisgICAgPGRpdiBjbGFzcz0iYmxvY2siPgorICAgICAgPGgyPjxzcGFuPnt7d2F0Y2hlcn19PC9zcGFuPjwvaDI+CisgICAgPC9kaXY+CisgICAgPHRhYmxlIGNsYXNzPSJoYXMtZGF0YSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgPHRoZWFkPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRoIGNsYXNzPSJ0aW1lIj5UaW1lICg8c3Bhbj57e3RpbWV6b25lfX08L3NwYW4+KTwvdGg+CisgICAgICAgICAgPHRoIGNsYXNzPSJsZXZlbCI+TGV2ZWw8L3RoPgorICAgICAgICAgIDx0aCBjbGFzcz0iY29yZSI+Q29yZTwvdGg+CisgICAgICAgICAgPHRoIGNsYXNzPSJsb2dnZXIiPkxvZ2dlcjwvdGg+CisgICAgICAgICAgPHRoIGNsYXNzPSJtZXNzYWdlIj5NZXNzYWdlPC90aD4KKyAgICAgICAgPC90cj4KKyAgICAgIDwvdGhlYWQ+CisgICAgICA8dGJvZHkgbmctcmVwZWF0PSJldmVudCBpbiBldmVudHMiPgorICAgICAgICA8dHIgbmctY2xpY2s9InRvZ2dsZVJvdyhldmVudCkiIGNsYXNzPSJ7e2V2ZW50LnRyYWNlID8gJ2hhcy10cmFjZSc6ICcnfX0ge3snbGV2ZWwtJytldmVudC5sZXZlbC50b0xvd2VyQ2FzZSgpfX0iPgorICAgICAgICAgIDx0ZCBjbGFzcz0ic3BhbiI+PGE+PHNwYW4+e3sgdGltZXpvbmUgPT0gIlVUQyIgPyBldmVudC51dGNfdGltZSA6IGV2ZW50LmxvY2FsX3RpbWUgfX08L3NwYW4+PC9hPjwvdGQ+CisgICAgICAgICAgPHRkIGNsYXNzPSJsZXZlbCBzcGFuIj48YT48c3Bhbj57eyBldmVudC5sZXZlbCB9fSB7e2V2ZW50LnNob3dUcmFjZX19PC9zcGFuPjwvc3Bhbj48L2E+PC90ZD4KKyAgICAgICAgICA8dGQgY2xhc3M9InNwYW4iPjxhPjxzcGFuPnt7IGV2ZW50LmNvcmUgfX08L3NwYW4+PC9hPjwvdGQ+CisgICAgICAgICAgPHRkIGNsYXNzPSJzcGFuIj48YT48c3Bhbj48YWJiciB0aXRsZT0ie3tldmVudC5sb2dnZXJ9fSI+e3tldmVudC5sb2dnZXJCYXNlfX08L2FiYnI+PC9zcGFuPjwvYT48L3RkPgorICAgICAgICAgIDx0ZCBjbGFzcz0ibWVzc2FnZSBzcGFuIj48YT48c3Bhbj57eyBldmVudC5tZXNzYWdlIH19PC9zcGFuPjwvYT48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHIgY2xhc3M9InRyYWNlIiBuZy1zaG93PSJldmVudC5zaG93VHJhY2UgJiYgZXZlbnQudHJhY2UiPgorICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij48cHJlPnt7ZXZlbnQudHJhY2V9fTwvcHJlPjwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICA8L3Rib2R5PgorICAgICAgPHRmb290PgorICAgICAgICA8dHIgbmctc2hvdz0iZXZlbnRzLmxlbmd0aD09MCI+CisgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPk5vIEV2ZW50cyBhdmFpbGFibGU8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgPC90aGVhZD4KKyAgICA8L3RhYmxlPgorICAgIDxkaXYgaWQ9ImZvb3RlciIgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgIDxkaXYgaWQ9InN0YXRlIiBjbGFzcz0ibG9hZGVyIj5MYXN0IENoZWNrOiB7e3NpbmNlRGlzcGxheX19PC9kaXY+CisgICAgICA8ZGl2IGlkPSJkYXRlLWZvcm1hdCIgbmctY2xpY2s9InRvZ2dsZVRpbWV6b25lKCkiPjxhIG5nLWNsYXNzPSJ7b246IHRpbWV6b25lPT0nVVRDJ30iPlNob3cgZGF0ZXMgaW4gVVRDPC9hPjwvZGl2PgorICAgIDwvZGl2PgorICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL3BsdWdpbnMuaHRtbCBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9wbHVnaW5zLmh0bWwKaW5kZXggNzUxZmI1ZS4uZDk1ZmM5YiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL3BsdWdpbnMuaHRtbAorKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvcGx1Z2lucy5odG1sCkBAIC0xLDcyICsxLDcyIEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZGl2IGlkPSJwbHVnaW5zIiBjbGFzcz0iY2xlYXJmaXgiPg0KLQ0KLSAgPGRpdiBpZD0iZnJhbWUiPg0KLSAgICAgIDx1bD4NCi0gICAgICA8bGkgY2xhc3M9ImVudHJ5IiBuZy1jbGFzcz0ie2NoYW5nZWQ6IHBsdWdpbi5jaGFuZ2VkfSIgbmctcmVwZWF0PSJwbHVnaW4gaW4gdHlwZS5wbHVnaW5zIj4NCi0gICAgICAgIDxhIG5nLWNsaWNrPSJzZWxlY3RQbHVnaW4ocGx1Z2luKSI+DQotICAgICAgICAgIDxzcGFuPnt7IHBsdWdpbi5uYW1lIH19PC9zcGFuPg0KLSAgICAgICAgPC9hPg0KLSAgICAgICAgPHVsIGNsYXNzPSJkZXRhaWwiIG5nLXNob3c9InBsdWdpbi5vcGVuIj4NCi0gICAgICAgICAgPGxpIG5nLXJlcGVhdD0iKGtleSwgdmFsdWUpIGluIHBsdWdpbi5wcm9wZXJ0aWVzIiBuZy1jbGFzcz0ie29kZDogJG9kZH0iPg0KLSAgICAgICAgICAgIDxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgPGR0Pnt7IGtleSB9fTo8L2R0Pg0KLSAgICAgICAgICAgICAgPCEtLTxkZCBuZy1yZXBlYXQ9InYgaW4gdmFsdWUiPnt7dn19PC9kZD48IS0tIGlzIEFOIEFSUkFZISEtLT4NCi0gICAgICAgICAgICAgIDxkZD57e3ZhbHVlfX08L2RkPg0KLSAgICAgICAgICAgIDwvZGw+DQotICAgICAgICAgIDwvbGk+DQotICAgICAgICAgIDxsaSBjbGFzcz0ic3RhdHMgY2xlYXJmaXgiIG5nLXNob3c9InBsdWdpbi5zdGF0cyI+DQotICAgICAgICAgICAgPHNwYW4+c3RhdHM6PC9zcGFuPg0KLSAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9IihrZXksIHZhbHVlKSBpbiBwbHVnaW4uc3RhdHMiIG5nLWNsYXNzPSJ7b2RkOiAkb2RkfSI+DQotICAgICAgICAgICAgICAgICAgPGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgICAgICAgICAgIDxkdD57e2tleX19OjwvZHQ+DQotICAgICAgICAgICAgICAgICAgICAgIDxkZD57e3ZhbHVlfX08L2RkPg0KLSAgICAgICAgICAgICAgICAgIDwvZGw+DQotICAgICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgIDwvbGk+DQotICAgICAgICA8L3VsPg0KLSAgICAgIDwvdWw+DQotICA8L2Rpdj4NCi0NCi0gIDxkaXYgaWQ9Im5hdmlnYXRpb24iIGNsYXNzPSJjbGVhcmZpeCI+DQotDQotICAgIDx1bD4NCi0gICAgICAgIDxsaSBuZy1yZXBlYXQ9InR5cGUgaW4gdHlwZXMiIGNsYXNzPSJ7e3R5cGUubG93ZXJ9fSI+DQotICAgICAgICAgICAgPGEgbmctY2xpY2s9InNlbGVjdFBsdWdpblR5cGUodHlwZSkiIHJlbD0ie3t0eXBlLm5hbWV9fSI+e3t0eXBlLm5hbWV9fQ0KLSAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJ0eXBlLmNoYW5nZXMiPnt7dHlwZS5jaGFuZ2VzfX08L3NwYW4+DQotICAgICAgICAgICAgPC9hPg0KLSAgICAgICAgPC9saT4NCi0gICAgICAgIDxsaSBjbGFzcz0iUExVR0lOQ0hBTkdFUyI+PGEgbmctY2xpY2s9InN0YXJ0UmVjb3JkaW5nKCkiPldhdGNoIENoYW5nZXM8L2E+PC9saT4NCi0gICAgICAgIDxsaSBjbGFzcz0iUkVMT0FEIj48YSBuZy1jbGljaz0icmVmcmVzaCgpIj5SZWZyZXNoIFZhbHVlczwvYT48L2xpPg0KLSAgICA8L3VsPg0KLSAgDQotICA8L2Rpdj4NCi0NCi0gIDxkaXYgaWQ9InJlY29yZGluZyIgbmctc2hvdz0iaXNSZWNvcmRpbmciPg0KLSAgICA8ZGl2IGNsYXNzPSJ3cmFwcGVyIGNsZWFyZml4Ij4NCi0NCi0gICAgICA8cCBjbGFzcz0ibG9hZGVyIj5XYXRjaGluZyBmb3IgQ2hhbmdlczwvcD4NCi0gICAgICA8YnV0dG9uIGNsYXNzPSJwcmltYXJ5IiBuZy1jbGljaz0ic3RvcFJlY29yZGluZygpIj5TdG9wICZhbXA7IFNob3cgQ2hhbmdlczwvYnV0dG9uPg0KLQ0KLSAgICA8L2Rpdj4NCi0gICAgPGRpdiBpZD0iYmxvY2tVSSI+PC9kaXY+DQotICA8L2Rpdj4NCi0NCi08L2Rpdj4NCis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkaXYgaWQ9InBsdWdpbnMiIGNsYXNzPSJjbGVhcmZpeCI+CisKKyAgPGRpdiBpZD0iZnJhbWUiPgorICAgICAgPHVsPgorICAgICAgPGxpIGNsYXNzPSJlbnRyeSIgbmctY2xhc3M9IntjaGFuZ2VkOiBwbHVnaW4uY2hhbmdlZH0iIG5nLXJlcGVhdD0icGx1Z2luIGluIHR5cGUucGx1Z2lucyI+CisgICAgICAgIDxhIG5nLWNsaWNrPSJzZWxlY3RQbHVnaW4ocGx1Z2luKSI+CisgICAgICAgICAgPHNwYW4+e3sgcGx1Z2luLm5hbWUgfX08L3NwYW4+CisgICAgICAgIDwvYT4KKyAgICAgICAgPHVsIGNsYXNzPSJkZXRhaWwiIG5nLXNob3c9InBsdWdpbi5vcGVuIj4KKyAgICAgICAgICA8bGkgbmctcmVwZWF0PSIoa2V5LCB2YWx1ZSkgaW4gcGx1Z2luLnByb3BlcnRpZXMiIG5nLWNsYXNzPSJ7b2RkOiAkb2RkfSI+CisgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgPGR0Pnt7IGtleSB9fTo8L2R0PgorICAgICAgICAgICAgICA8IS0tPGRkIG5nLXJlcGVhdD0idiBpbiB2YWx1ZSI+e3t2fX08L2RkPjwhLS0gaXMgQU4gQVJSQVkhIS0tPgorICAgICAgICAgICAgICA8ZGQ+e3t2YWx1ZX19PC9kZD4KKyAgICAgICAgICAgIDwvZGw+CisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGkgY2xhc3M9InN0YXRzIGNsZWFyZml4IiBuZy1zaG93PSJwbHVnaW4uc3RhdHMiPgorICAgICAgICAgICAgPHNwYW4+c3RhdHM6PC9zcGFuPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICA8bGkgbmctcmVwZWF0PSIoa2V5LCB2YWx1ZSkgaW4gcGx1Z2luLnN0YXRzIiBuZy1jbGFzcz0ie29kZDogJG9kZH0iPgorICAgICAgICAgICAgICAgICAgPGRsIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICAgICAgICAgICAgPGR0Pnt7a2V5fX06PC9kdD4KKyAgICAgICAgICAgICAgICAgICAgICA8ZGQ+e3t2YWx1ZX19PC9kZD4KKyAgICAgICAgICAgICAgICAgIDwvZGw+CisgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L3VsPgorICA8L2Rpdj4KKworICA8ZGl2IGlkPSJuYXZpZ2F0aW9uIiBjbGFzcz0iY2xlYXJmaXgiPgorCisgICAgPHVsPgorICAgICAgICA8bGkgbmctcmVwZWF0PSJ0eXBlIGluIHR5cGVzIiBjbGFzcz0ie3t0eXBlLmxvd2VyfX0iPgorICAgICAgICAgICAgPGEgbmctY2xpY2s9InNlbGVjdFBsdWdpblR5cGUodHlwZSkiIHJlbD0ie3t0eXBlLm5hbWV9fSI+e3t0eXBlLm5hbWV9fQorICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9InR5cGUuY2hhbmdlcyI+e3t0eXBlLmNoYW5nZXN9fTwvc3Bhbj4KKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJQTFVHSU5DSEFOR0VTIj48YSBuZy1jbGljaz0ic3RhcnRSZWNvcmRpbmcoKSI+V2F0Y2ggQ2hhbmdlczwvYT48L2xpPgorICAgICAgICA8bGkgY2xhc3M9IlJFTE9BRCI+PGEgbmctY2xpY2s9InJlZnJlc2goKSI+UmVmcmVzaCBWYWx1ZXM8L2E+PC9saT4KKyAgICA8L3VsPgorICAKKyAgPC9kaXY+CisKKyAgPGRpdiBpZD0icmVjb3JkaW5nIiBuZy1zaG93PSJpc1JlY29yZGluZyI+CisgICAgPGRpdiBjbGFzcz0id3JhcHBlciBjbGVhcmZpeCI+CisKKyAgICAgIDxwIGNsYXNzPSJsb2FkZXIiPldhdGNoaW5nIGZvciBDaGFuZ2VzPC9wPgorICAgICAgPGJ1dHRvbiBjbGFzcz0icHJpbWFyeSIgbmctY2xpY2s9InN0b3BSZWNvcmRpbmcoKSI+U3RvcCAmYW1wOyBTaG93IENoYW5nZXM8L2J1dHRvbj4KKworICAgIDwvZGl2PgorICAgIDxkaXYgaWQ9ImJsb2NrVUkiPjwvZGl2PgorICA8L2Rpdj4KKworPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvcXVlcnkuaHRtbCBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9xdWVyeS5odG1sCmluZGV4IGI4YWM5MjMuLjMxYmMyNDIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9xdWVyeS5odG1sCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9xdWVyeS5odG1sCkBAIC0xLDM1NiArMSwzNTYgQEAKLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi1jb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0odGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxkaXYgaWQ9InF1ZXJ5IiBjbGFzcz0iY2xlYXJmaXgiPg0KLQ0KLSAgPGRpdiBpZD0iZm9ybSI+DQotICAgIDxmb3JtPg0KLSAgICAgIDxsYWJlbCBmb3I9InF0IiB0aXRsZT0iUmVxdWVzdCBoYW5kbGVyIGluIHNvbHJjb25maWcueG1sLiI+DQotICAgICAgICA8YSByZWw9ImhlbHAiPlJlcXVlc3QtSGFuZGxlciAocXQpPC9hPg0KLSAgICAgIDwvbGFiZWw+DQotICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJxdCIgaWQ9InF0IiB2YWx1ZT0iL3NlbGVjdCIgdGl0bGU9IlJlcXVlc3QgaGFuZGxlciBpbiBzb2xyY29uZmlnLnhtbC4iPg0KLQ0KLSAgICAgIDxmaWVsZHNldCBjbGFzcz0iY29tbW9uIj4NCi0gICAgICAgIDxsZWdlbmQ+Y29tbW9uPC9sZWdlbmQ+DQotICAgICAgICA8ZGl2IGNsYXNzPSJmaWVsZHNldCI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJxIiB0aXRsZT0iVGhlIHF1ZXJ5IHN0cmluZy4iPg0KLSAgICAgICAgICBxDQotICAgICAgICA8L2xhYmVsPg0KLSAgICAgICAgPHRleHRhcmVhIG5hbWU9InEiIG5nLW1vZGVsPSJxdWVyeS5xIiBpZD0icSIgdGl0bGU9IlRoZSBxdWVyeSBzdHJpbmcuIj4qOio8L3RleHRhcmVhPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0iZnEiIHRpdGxlPSJGaWx0ZXIgcXVlcnkuIj4NCi0gICAgICAgICAgPGEgcmVsPSJoZWxwIj5mcTwvYT4NCi0gICAgICAgIDwvbGFiZWw+DQotICAgICAgICA8ZGl2IGNsYXNzPSJtdWx0aXBsZSI+DQotICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBjbGVhcmZpeCIgbmctcmVwZWF0PSJmaWx0ZXIgaW4gZmlsdGVycyI+DQotICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJmaWx0ZXIuZnEiIGlkPSJmcSIgbmFtZT0iZnEiIHRpdGxlPSJGaWx0ZXIgcXVlcnkuIj4NCi0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b25zIj4NCi0gICAgICAgICAgICAgIDxhIGNsYXNzPSJyZW0iIG5nLWNsaWNrPSJyZW1vdmVGaWx0ZXIoJGluZGV4KSI+PHNwYW4+PC9zcGFuPjwvYT4NCi0gICAgICAgICAgICAgIDxhIGNsYXNzPSJhZGQiIG5nLWNsaWNrPSJhZGRGaWx0ZXIoJGluZGV4KSI+PHNwYW4+PC9zcGFuPjwvYT4NCi0gICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgPC9kaXY+DQotICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9InNvcnQiIHRpdGxlPSJTb3J0IGZpZWxkIG9yIGZ1bmN0aW9uIHdpdGggYXNjfGRlc2MuIj4NCi0gICAgICAgICAgPGEgcmVsPSJoZWxwIj5zb3J0PC9hPg0KLSAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0icXVlcnkuc29ydCIgaWQ9InNvcnQiIG5hbWU9InNvcnQiIHRpdGxlPSJTb3J0IGZpZWxkIG9yIGZ1bmN0aW9uIHdpdGggYXNjfGRlc2MuIj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9InN0YXJ0IiB0aXRsZT0iTnVtYmVyIG9mIGxlYWRpbmcgZG9jdW1lbnRzIHRvIHNraXAgYW5kIG51bWJlciBvZiBkb2N1bWVudHMgdG8gcmV0dXJuIGFmdGVyICdzdGFydCcuIChJbnRlZ2VycykiPg0KLSAgICAgICAgICA8YSByZWw9ImhlbHAiPnN0YXJ0PC9hPiwNCi0gICAgICAgICAgPGEgcmVsPSJoZWxwIj5yb3dzPC9hPg0KLSAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InN0YXJ0IiBuZy1tb2RlbD0icXVlcnkuc3RhcnQiIGlkPSJzdGFydCIgcGxhY2Vob2xkZXI9IjAiIHBhdHRlcm49IlswLTldKyIgdGl0bGU9Ik51bWJlciBvZiBsZWFkaW5nIGRvY3VtZW50cyB0byBza2lwLiAoSW50ZWdlcikiPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icm93cyIgbmctbW9kZWw9InF1ZXJ5LnJvd3MiIGlkPSJyb3dzIiBwbGFjZWhvbGRlcj0iMTAiIHBhdHRlcm49IlswLTldKyIgdGl0bGU9Ik51bWJlciBvZiBkb2N1bWVudHMgdG8gcmV0dXJuIGFmdGVyICdzdGFydCcuIChJbnRlZ2VyKSI+DQotICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImZsIiB0aXRsZT0iRmllbGQgbGlzdCwgY29tbWEgc2VwYXJhdGVkLiI+DQotICAgICAgICAgIDxhIHJlbD0iaGVscCI+Zmw8L2E+DQotICAgICAgICA8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJxdWVyeS5mbCIgbmFtZT0iZmwiIGlkPSJmbCIgdmFsdWU9IiIgdGl0bGU9IkZpZWxkIGxpc3QsIGNvbW1hIHNlcGFyYXRlZC4iPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0iZGYiIHRpdGxlPSJEZWZhdWx0IHNlYXJjaCBmaWVsZCI+DQotICAgICAgICAgIDxhIHJlbD0iaGVscCI+ZGY8L2E+DQotICAgICAgICA8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJxdWVyeS5kZiIgbmFtZT0iZGYiIGlkPSJkZiIgdmFsdWU9IiIgdGl0bGU9IkRlZmF1bHQgc2VhcmNoIGZpZWxkIj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImN1c3RvbV9wYXJhbWV0ZXJzIj4NCi0gICAgICAgICAgPGEgcmVsPSJoZWxwIj5SYXcgUXVlcnkgUGFyYW1ldGVyczwvYT4NCi0gICAgICAgIDwvbGFiZWw+DQotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InJhd1BhcmFtcyIgaWQ9ImN1c3RvbV9wYXJhbWV0ZXJzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0ia2V5MT12YWwxJmFtcDtrZXkyPXZhbDIiPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0id3QiIHRpdGxlPSJUaGUgd3JpdGVyIHR5cGUgKHJlc3BvbnNlIGZvcm1hdCkuIj4NCi0gICAgICAgICAgPGEgcmVsPSJoZWxwIj53dDwvYT4NCi0gICAgICAgIDwvbGFiZWw+DQotICAgICAgICA8c2VsZWN0IG5hbWU9Ind0IiBuZy1tb2RlbD0icXVlcnkud3QiIGlkPSJ3dCIgdGl0bGU9IlRoZSB3cml0ZXIgdHlwZSAocmVzcG9uc2UgZm9ybWF0KS4iPg0KLSAgICAgICAgICA8b3B0aW9uPmpzb248L29wdGlvbj4NCi0gICAgICAgICAgPG9wdGlvbj54bWw8L29wdGlvbj4NCi0gICAgICAgICAgPG9wdGlvbj5weXRob248L29wdGlvbj4NCi0gICAgICAgICAgPG9wdGlvbj5ydWJ5PC9vcHRpb24+DQotICAgICAgICAgIDxvcHRpb24+cGhwPC9vcHRpb24+DQotICAgICAgICAgIDxvcHRpb24+Y3N2PC9vcHRpb24+DQotICAgICAgICA8L3NlbGVjdD4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImluZGVudCIgY2xhc3M9ImNoZWNrYm94IiB0aXRsZT0iSW5kZW50IHJlc3VsdHMuIj4NCi0gICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0icXVlcnkuaW5kZW50IiBuYW1lPSJpbmRlbnQiIGlkPSJpbmRlbnQiIHRpdGxlPSJJbmRlbnQgcmVzdWx0cy4iIG5nLXRydWUtdmFsdWU9IidvbiciIG5nLWZhbHNlLXZhbHVlPSInJyI+DQotICAgICAgICAgIGluZGVudA0KLSAgICAgICAgPC9sYWJlbD4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImRlYnVnUXVlcnkiIGNsYXNzPSJjaGVja2JveCIgdGl0bGU9IlNob3cgdGltaW5nIGFuZCBkaWFnbm9zdGljcy4iPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJxdWVyeS5kZWJ1Z1F1ZXJ5IiBuYW1lPSJkZWJ1Z1F1ZXJ5IiBpZD0iZGVidWdRdWVyeSIgdGl0bGU9IlNob3cgdGltaW5nIGFuZCBkaWFnbm9zdGljcy4iIG5nLXRydWUtdmFsdWU9IidvbiciIG5nLWZhbHNlLXZhbHVlPSInJyI+DQotICAgICAgICAgIGRlYnVnUXVlcnkNCi0gICAgICAgIDwvbGFiZWw+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgICA8L2ZpZWxkc2V0Pg0KLQ0KLSAgICAgIDxmaWVsZHNldCBjbGFzcz0iZGlzbWF4IG9wdGlvbmFsIj4NCi0gICAgICAgIDxsZWdlbmQ+DQotICAgICAgICAgIDxsYWJlbCBmb3I9ImRpc21heCIgY2xhc3M9ImNoZWNrYm94IiB0aXRsZT0iRW5hYmxlIGRpc21heC4iPg0KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImlzRGlzbWF4IiBuYW1lPSJkZWZUeXBlIiBpZD0iZGlzbWF4IiB2YWx1ZT0iZGlzbWF4Ij4NCi0gICAgICAgICAgICBkaXNtYXgNCi0gICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgIDwvbGVnZW5kPg0KLSAgICAgICAgPGRpdiBjbGFzcz0iZmllbGRzZXQiIG5nLXNob3c9ImlzRGlzbWF4Ij4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9InFfYWx0IiB0aXRsZT0iQWx0ZXJuYXRlIHF1ZXJ5IHdoZW4gJ3EnIGlzIGFic2VudC4iPnEuYWx0PC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZGlzbWF4WydxLmFsdCddIiBuYW1lPSJxLmFsdCIgaWQ9InFfYWx0IiB0aXRsZT0iQWx0ZXJuYXRlIHF1ZXJ5IHdoZW4gJ3EnIGlzIGFic2VudC4iPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0icWYiIHRpdGxlPSJRdWVyeSBmaWVsZHMgd2l0aCBvcHRpb25hbCBib29zdHMuIj5xZjwvbGFiZWw+DQotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImRpc21heC5xZiIgbmFtZT0icWYiIGlkPSJxZiIgdGl0bGU9IlF1ZXJ5IGZpZWxkcyB3aXRoIG9wdGlvbmFsIGJvb3N0cy4iPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0ibW0iIHRpdGxlPSJNaW4tc2hvdWxkLW1hdGNoIGV4cHJlc3Npb24iPm1tPC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZGlzbWF4Lm1tIiBuYW1lPSJtbSIgaWQ9Im1tIiB0aXRsZT0iTWluLXNob3VsZC1tYXRjaCBleHByZXNzaW9uLiI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJwZiIgdGl0bGU9IlBocmFzZSBib29zdGVkIGZpZWxkcy4iPnBmPC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZGlzbWF4LnBmIiBuYW1lPSJwZiIgaWQ9InBmIiB0aXRsZT0iUGhyYXNlIGJvb3N0ZWQgZmllbGRzLiI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJwcyIgdGl0bGU9IlBocmFzZSBib29zdCBzbG9wLiI+cHM8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJkaXNtYXgucHMiIG5hbWU9InBzIiBpZD0icHMiIHRpdGxlPSJQaHJhc2UgYm9vc3Qgc2xvcC4iPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0icXMiIHRpdGxlPSJRdWVyeSBzdHJpbmcgcGhyYXNlIHNsb3AuIj5xczwvbGFiZWw+DQotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImRpc21heC5xcyIgbmFtZT0icXMiIGlkPSJxcyIgdGl0bGU9IlF1ZXJ5IHN0cmluZyBwaHJhc2Ugc2xvcC4iPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0idGllIiB0aXRsZT0iU2NvcmUgdGllLWJyZWFrZXIuIFRyeSAwLjEuIj50aWU8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJkaXNtYXgudGllIiBuYW1lPSJ0aWUiIGlkPSJ0aWUiIHRpdGxlPSJTY29yZSB0aWUtYnJlYWtlci4gVHJ5IDAuMS4iPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0iYnEiIHRpdGxlPSJCb29zdCBxdWVyeS4iPmJxPC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZGlzbWF4LmJxIiBuYW1lPSJicSIgaWQ9ImJxIiB0aXRsZT0iQm9vc3QgcXVlcnkuIj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImJmIiB0aXRsZT0iQm9vc3QgZnVuY3Rpb24gKGFkZGVkKS4iPmJmPC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZGlzbWF4LmJmIiBuYW1lPSJiZiIgaWQ9ImJmIiB0aXRsZT0iQm9vc3QgZnVuY3Rpb24gKGFkZGVkKS4iPg0KLQ0KLSAgICAgICAgPC9kaXY+DQotICAgICAgPC9maWVsZHNldD4NCi0NCi0gICAgICA8ZmllbGRzZXQgY2xhc3M9ImVkaXNtYXggb3B0aW9uYWwiPg0KLSAgICAgICAgPGxlZ2VuZD4NCi0gICAgICAgICAgPGxhYmVsIGZvcj0iZWRpc21heCIgY2xhc3M9ImNoZWNrYm94IiB0aXRsZT0iRW5hYmxlIGVkaXNtYXguIj4NCi0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJpc0VkaXNtYXgiIG5hbWU9ImRlZlR5cGUiIGlkPSJlZGlzbWF4IiB2YWx1ZT0iZWRpc21heCI+DQotICAgICAgICAgICAgPHN0cm9uZz5lPC9zdHJvbmc+ZGlzbWF4DQotICAgICAgICAgIDwvbGFiZWw+DQotICAgICAgICA8L2xlZ2VuZD4NCi0gICAgICAgIDxkaXYgY2xhc3M9ImZpZWxkc2V0IiBuZy1zaG93PSJpc0VkaXNtYXgiPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0iZWRpc21heF9xX2FsdCIgdGl0bGU9IkFsdGVybmF0ZSBxdWVyeSB3aGVuICdxJyBpcyBhYnNlbnQuIj5xLmFsdDwvbGFiZWw+DQotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXhbJ3EuYWx0J10iIG5hbWU9InEuYWx0IiBpZD0iZWRpc21heF9xX2FsdCIgIHRpdGxlPSJBbHRlcm5hdGUgcXVlcnkgd2hlbiAncScgaXMgYWJzZW50LiI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X3FmIiB0aXRsZT0iUXVlcnkgZmllbGRzIHdpdGggb3B0aW9uYWwgYm9vc3RzLiI+cWY8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJlZGlzbWF4LnFmIiBuYW1lPSJxZiIgaWQ9ImVkaXNtYXhfcWYiIHRpdGxlPSJRdWVyeSBmaWVsZHMgd2l0aCBvcHRpb25hbCBib29zdHMuIj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImVkaXNtYXhfbW0iIHRpdGxlPSJNaW4tc2hvdWxkLW1hdGNoIGV4cHJlc3Npb24uIj5tbTwvbGFiZWw+DQotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXgubW0iIG5hbWU9Im1tIiBpZD0iZWRpc21heF9tbSIgdGl0bGU9Ik1pbi1zaG91bGQtbWF0Y2ggZXhwcmVzc2lvbi4iPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0iZWRpc21heF9wZiIgdGl0bGU9IlBocmFzZSBib29zdGVkIGZpZWxkcy4iPnBmPC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZWRpc21heC5wZiIgbmFtZT0icGYiIGlkPSJlZGlzbWF4X3BmIiB0aXRsZT0iUGhyYXNlIGJvb3N0ZWQgZmllbGRzLiI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X3BzIiB0aXRsZT0iUGhyYXNlIGJvb3N0IHNsb3AuIj5wczwvbGFiZWw+DQotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXgucHMiIG5hbWU9InBzIiBpZD0iZWRpc21heF9wcyIgdGl0bGU9IlBocmFzZSBib29zdCBzbG9wLiI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X3FzIiB0aXRsZT0iUXVlcnkgc3RyaW5nIHBocmFzZSBzbG9wLiI+cXM8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJlZGlzbWF4LnFzIiBuYW1lPSJxcyIgaWQ9ImVkaXNtYXhfcXMiIHRpdGxlPSJRdWVyeSBzdHJpbmcgcGhyYXNlIHNsb3AuIj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImVkaXNtYXhfdGllIiB0aXRsZT0iU2NvcmUgdGllLWJyZWFrZXIuIFRyeSAwLjEuIj50aWU8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJlZGlzbWF4LnRpZSIgbmFtZT0idGllIiBpZD0iZWRpc21heF90aWUiIHRpdGxlPSJTY29yZSB0aWUtYnJlYWtlci4gVHJ5IDAuMS4iPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0iZWRpc21heF9icSIgdGl0bGU9IkJvb3N0IHF1ZXJ5LiI+YnE8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJlZGlzbWF4LmJxIiBuYW1lPSJicSIgaWQ9ImVkaXNtYXhfYnEiIHRpdGxlPSJCb29zdCBxdWVyeS4iPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0iZWRpc21heF9iZiIgdGl0bGU9IkJvb3N0IGZ1bmN0aW9uIChhZGRlZCkuIj5iZjwvbGFiZWw+DQotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXguYmYiIG5hbWU9ImJmIiBpZD0iZWRpc21heF9iZiIgdGl0bGU9IkJvb3N0IGZ1bmN0aW9uIChhZGRlZCkuIj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImVkaXNtYXhfdWYiIHRpdGxlPSJVc2VyIEZpZWxkcyI+dWY8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJlZGlzbWF4LnVmIiBuYW1lPSJ1ZiIgaWQ9ImVkaXNtYXhfdWYiIHRpdGxlPSJVc2VyIEZpZWxkcyI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X3BmMiIgdGl0bGU9ImJpZ3JhbSBwaHJhc2UgYm9vc3QgZmllbGRzIj5wZjI8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJlZGlzbWF4LnBmMiIgbmFtZT0icGYyIiBpZD0iZWRpc21heF9wZjIiIHRpdGxlPSJiaWdyYW0gcGhyYXNlIGJvb3N0IGZpZWxkcyI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X3BmMyIgdGl0bGU9InRyaWdyYW0gcGhyYXNlIGJvb3N0IGZpZWxkcyI+cGYzPC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZWRpc21heC5wZjMiIG5hbWU9InBmMyIgaWQ9ImVkaXNtYXhfcGYzIiB0aXRsZT0idHJpZ3JhbSBwaHJhc2UgYm9vc3QgZmllbGRzIj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImVkaXNtYXhfcHMyIiB0aXRsZT0icGhyYXNlIHNsb3AgZm9yIGJpZ3JhbSBwaHJhc2VzIj5wczI8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJlZGlzbWF4LnBzMiIgbmFtZT0icHMyIiBpZD0iZWRpc21heF9wczIiIHRpdGxlPSJwaHJhc2Ugc2xvcCBmb3IgYmlncmFtIHBocmFzZXMiPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0iZWRpc21heF9wczMiIHRpdGxlPSJwaHJhc2Ugc2xvcCBmb3IgdHJpZ3JhbSBwaHJhc2VzIj5wczM8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJlZGlzbWF4LnBzMyIgbmFtZT0icHMzIiBpZD0iZWRpc21heF9wczMiIHRpdGxlPSJwaHJhc2Ugc2xvcCBmb3IgdHJpZ3JhbSBwaHJhc2VzIj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImVkaXNtYXhfYm9vc3QiIHRpdGxlPSJtdWx0aXBsaWNhdGl2ZSBib29zdCBmdW5jdGlvbiI+Ym9vc3Q8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJlZGlzbWF4LmJvb3N0IiBuYW1lPSJib29zdCIgaWQ9ImVkaXNtYXhfYm9vc3QiIHRpdGxlPSJtdWx0aXBsaWNhdGl2ZSBib29zdCBmdW5jdGlvbiI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X3N0b3B3b3JkcyIgY2xhc3M9ImNoZWNrYm94IiB0aXRsZT0icmVtb3ZlIHN0b3B3b3JkcyBmcm9tIG1hbmRhdG9yeSAnbWF0Y2hpbmcnIGNvbXBvbmVudCI+DQotICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImVkaXNtYXguc3RvcHdvcmRzIiBuYW1lPSJzdG9wd29yZHMiIGlkPSJlZGlzbWF4X3N0b3B3b3JkcyI+DQotICAgICAgICAgIHN0b3B3b3Jkcw0KLSAgICAgICAgPC9sYWJlbD4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImVkaXNtYXhfbG93ZXJjYXNlT3BlcmF0b3JzIiBjbGFzcz0iY2hlY2tib3giIHRpdGxlPSJFbmFibGUgbG93ZXItY2FzZSAnYW5kJyBhbmQgJ29yJyBhcyBvcGVyYXRvcnMiPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJlZGlzbWF4Lmxvd2VyY2FzZU9wZXJhdG9ycyIgbmFtZT0ibG93ZXJjYXNlT3BlcmF0b3JzIiBpZD0iZWRpc21heF9sb3dlcmNhc2VPcGVyYXRvcnMiPg0KLSAgICAgICAgICBsb3dlcmNhc2VPcGVyYXRvcnMNCi0gICAgICAgIDwvbGFiZWw+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgICA8L2ZpZWxkc2V0Pg0KLQ0KLSAgICAgIDxmaWVsZHNldCBjbGFzcz0iaGwgb3B0aW9uYWwiPg0KLSAgICAgICAgPGxlZ2VuZD4NCi0gICAgICAgICAgPGxhYmVsIGZvcj0iaGwiIGNsYXNzPSJjaGVja2JveCIgdGl0bGU9IkVuYWJsZSBoaWdobGlnaHRpbmcuIj4NCi0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJpc0hpZ2hsaWdodCIgbmFtZT0iaGwiIGlkPSJobCIgdmFsdWU9InRydWUiPg0KLSAgICAgICAgICAgIGhsDQotICAgICAgICAgIDwvbGFiZWw+DQotICAgICAgICA8L2xlZ2VuZD4NCi0gICAgICAgIDxkaXYgY2xhc3M9ImZpZWxkc2V0IiBuZy1zaG93PSJpc0hpZ2hsaWdodCI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJobF9mbCIgdGl0bGU9IkZpZWxkcyB0byBoaWdobGlnaHQgb24uIj5obC5mbDwvbGFiZWw+DQotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImhsWydobC5mbCddIiBuYW1lPSJobC5mbCIgaWQ9ImhsX2ZsIiB2YWx1ZT0iIiB0aXRsZT0iRmllbGRzIHRvIGhpZ2hsaWdodCBvbi4iPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0iaGxfc2ltcGxlX3ByZSI+aGwuc2ltcGxlLnByZTwvbGFiZWw+DQotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImhsWydobC5zaW1wbGUucHJlJ10iIG5hbWU9ImhsLnNpbXBsZS5wcmUiIGlkPSJobF9zaW1wbGVfcHJlIiB2YWx1ZT0iPGVtPiI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJobF9zaW1wbGVfcG9zdCI+aGwuc2ltcGxlLnBvc3Q8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJobFsnaGwuc2ltcGxlLnBvc3QnXSIgIG5hbWU9ImhsLnNpbXBsZS5wb3N0IiBpZD0iaGxfc2ltcGxlX3Bvc3QiIHZhbHVlPSI8L2VtPiI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJobF9yZXF1aXJlRmllbGRNYXRjaCIgY2xhc3M9ImNoZWNrYm94Ij4NCi0gICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iaGxbJ2hsLnJlcXVpcmVGaWVsZE1hdGNoJ10iIG5hbWU9ImhsLnJlcXVpcmVGaWVsZE1hdGNoIiBpZD0iaGxfcmVxdWlyZUZpZWxkTWF0Y2giIHZhbHVlPSJ0cnVlIj4NCi0gICAgICAgICAgaGwucmVxdWlyZUZpZWxkTWF0Y2gNCi0gICAgICAgIDwvbGFiZWw+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJobF91c2VQaHJhc2VIaWdobGlnaHRlciIgY2xhc3M9ImNoZWNrYm94Ij4NCi0gICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iaGxbJ3VzZVBocmFzZUhpZ2hMaWdodGVyJ10iIG5hbWU9ImhsLnVzZVBocmFzZUhpZ2hsaWdodGVyIiBpZD0iaGxfdXNlUGhyYXNlSGlnaGxpZ2h0ZXIiIHZhbHVlPSJ0cnVlIj4NCi0gICAgICAgICAgaGwudXNlUGhyYXNlSGlnaGxpZ2h0ZXINCi0gICAgICAgIDwvbGFiZWw+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJobF9oaWdobGlnaHRNdWx0aVRlcm0iIGNsYXNzPSJjaGVja2JveCI+DQotICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImhsWydoaWdodGxpZ2h0TXVsdGlUZXJtJ10iIG5hbWU9ImhsLmhpZ2hsaWdodE11bHRpVGVybSIgaWQ9ImhsX2hpZ2hsaWdodE11bHRpVGVybSIgdmFsdWU9InRydWUiPg0KLSAgICAgICAgICBobC5oaWdobGlnaHRNdWx0aVRlcm0NCi0gICAgICAgIDwvbGFiZWw+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgICA8L2ZpZWxkc2V0Pg0KLQ0KLSAgICAgIDxmaWVsZHNldCBjbGFzcz0iZmFjZXQgb3B0aW9uYWwiPg0KLSAgICAgICAgPGxlZ2VuZD4NCi0gICAgICAgICAgPGxhYmVsIGZvcj0iZmFjZXQiIGNsYXNzPSJjaGVja2JveCIgdGl0bGU9IkVuYWJsZSBmYWNldGluZy4iPg0KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImlzRmFjZXQiIG5hbWU9ImZhY2V0IiBpZD0iZmFjZXQiPg0KLSAgICAgICAgICAgIGZhY2V0DQotICAgICAgICAgIDwvbGFiZWw+DQotICAgICAgICA8L2xlZ2VuZD4NCi0gICAgICAgIDxkaXYgY2xhc3M9ImZpZWxkc2V0IiBuZy1zaG93PSJpc0ZhY2V0Ij4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImZhY2V0X3F1ZXJ5Ij5mYWNldC5xdWVyeTwvbGFiZWw+DQotICAgICAgICA8dGV4dGFyZWEgbmctbW9kZWw9ImZhY2V0WydmYWNldC5xdWVyeSddIiBuYW1lPSJmYWNldC5xdWVyeSIgaWQ9ImZhY2V0X3F1ZXJ5Ij48L3RleHRhcmVhPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0iZmFjZXRfZmllbGQiPmZhY2V0LmZpZWxkPC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZmFjZXRbJ2ZhY2V0LmZpZWxkJ10iIG5hbWU9ImZhY2V0LmZpZWxkIiBpZD0iZmFjZXRfZmllbGQiPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0iZmFjZXRfcHJlZml4Ij5mYWNldC5wcmVmaXg8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJmYWNldFsnZmFjZXQucHJlZml4J10iIG5hbWU9ImZhY2V0LnByZWZpeCIgaWQ9ImZhY2V0X3ByZWZpeCI+DQotDQotICAgICAgICA8L2Rpdj4NCi0gICAgICA8L2ZpZWxkc2V0Pg0KLQ0KLSAgICAgIDxmaWVsZHNldCBjbGFzcz0ic3BhdGlhbCBvcHRpb25hbCI+DQotICAgICAgICA8bGVnZW5kPg0KLSAgICAgICAgICA8bGFiZWwgZm9yPSJzcGF0aWFsIiBjbGFzcz0iY2hlY2tib3giIHRpdGxlPSJTaG93IHNwYXRpYWwgb3B0aW9ucyI+DQotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iaXNTcGF0aWFsIiBuYW1lPSJzcGF0aWFsIiBpZD0ic3BhdGlhbCI+DQotICAgICAgICAgICAgc3BhdGlhbA0KLSAgICAgICAgICA8L2xhYmVsPg0KLSAgICAgICAgPC9sZWdlbmQ+DQotICAgICAgICA8ZGl2IGNsYXNzPSJmaWVsZHNldCIgbmctc2hvdz0iaXNTcGF0aWFsIj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9InB0Ij5wdDwvbGFiZWw+DQotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InNwYXRpYWwucHQiIG5hbWU9InB0IiBpZD0icHQiPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0ic2ZpZWxkIj5zZmllbGQ8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJzcGF0aWFsLnNmaWVsZCIgbmFtZT0ic2ZpZWxkIiBpZD0ic2ZpZWxkIj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9ImQiPmQ8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJzcGF0aWFsLmQiIG5hbWU9ImQiIGlkPSJkIj4NCi0NCi0gICAgICAgIDwvZGl2Pg0KLSAgICAgIDwvZmllbGRzZXQ+DQotDQotICAgICAgPGZpZWxkc2V0IGNsYXNzPSJzcGVsbGNoZWNrIG9wdGlvbmFsIj4NCi0gICAgICAgIDxsZWdlbmQ+DQotICAgICAgICAgIDxsYWJlbCBmb3I9InNwZWxsY2hlY2siIGNsYXNzPSJjaGVja2JveCIgdGl0bGU9IkVuYWJsZSBzcGVsbGNoZWNraW5nLiI+DQotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iaXNTcGVsbGNoZWNrIiBuYW1lPSJzcGVsbGNoZWNrIiBpZD0ic3BlbGxjaGVjayI+DQotICAgICAgICAgICAgc3BlbGxjaGVjaw0KLSAgICAgICAgICA8L2xhYmVsPg0KLSAgICAgICAgPC9sZWdlbmQ+DQotICAgICAgICA8ZGl2IGNsYXNzPSJmaWVsZHNldCIgbmctc2hvdz0iaXNTcGVsbGNoZWNrIj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9InNwZWxsY2hlY2tfYnVpbGQiIGNsYXNzPSJjaGVja2JveCI+DQotICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9InNwZWxsY2hlY2tbJ3NwZWxsY2hlY2suYnVpbGQnXSIgbmFtZT0ic3BlbGxjaGVjay5idWlsZCIgaWQ9InNwZWxsY2hlY2tfYnVpbGQiIHZhbHVlPSJ0cnVlIj4NCi0gICAgICAgICAgc3BlbGxjaGVjay5idWlsZA0KLSAgICAgICAgPC9sYWJlbD4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9InNwZWxsY2hlY2tfcmVsb2FkIiBjbGFzcz0iY2hlY2tib3giPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJzcGVsbGNoZWNrWydzcGVsbGNoZWNrLnJlbG9hZCddIiBuYW1lPSJzcGVsbGNoZWNrLnJlbG9hZCIgaWQ9InNwZWxsY2hlY2tfcmVsb2FkIiB2YWx1ZT0idHJ1ZSI+DQotICAgICAgICAgIHNwZWxsY2hlY2sucmVsb2FkDQotICAgICAgICA8L2xhYmVsPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0ic3BlbGxjaGVja19xIj5zcGVsbGNoZWNrLnE8L2xhYmVsPg0KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJzcGVsbGNoZWNrWydzcGVsbGNoZWNrLnEnXSIgbmFtZT0ic3BlbGxjaGVjay5xIiBpZD0ic3BlbGxjaGVja19xIj4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9InNwZWxsY2hlY2tfZGljdGlvbmFyeSI+c3BlbGxjaGVjay5kaWN0aW9uYXJ5PC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5kaWN0aW9uYXJ5J10iIG5hbWU9InNwZWxsY2hlY2suZGljdGlvbmFyeSIgaWQ9InNwZWxsY2hlY2tfZGljdGlvbmFyeSI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJzcGVsbGNoZWNrX2NvdW50Ij5zcGVsbGNoZWNrLmNvdW50PC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5jb3VudCddIiBuYW1lPSJzcGVsbGNoZWNrLmNvdW50IiBpZD0ic3BlbGxjaGVja19jb3VudCI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJzcGVsbGNoZWNrX29ubHlNb3JlUG9wdWxhciIgY2xhc3M9ImNoZWNrYm94Ij4NCi0gICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5vbmx5TW9yZVBvcHVsYXInXSIgbmFtZT0ic3BlbGxjaGVjay5vbmx5TW9yZVBvcHVsYXIiIGlkPSJzcGVsbGNoZWNrX29ubHlNb3JlUG9wdWxhciIgdmFsdWU9InRydWUiPg0KLSAgICAgICAgICBzcGVsbGNoZWNrLm9ubHlNb3JlUG9wdWxhcg0KLSAgICAgICAgPC9sYWJlbD4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9InNwZWxsY2hlY2tfZXh0ZW5kZWRSZXN1bHRzIiBjbGFzcz0iY2hlY2tib3giPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJzcGVsbGNoZWNrWydzcGVsbGNoZWNrLmV4dGVuZGVkUmVzdWx0cyddIiBuYW1lPSJzcGVsbGNoZWNrLmV4dGVuZGVkUmVzdWx0cyIgaWQ9InNwZWxsY2hlY2tfZXh0ZW5kZWRSZXN1bHRzIiB2YWx1ZT0idHJ1ZSI+DQotICAgICAgICAgIHNwZWxsY2hlY2suZXh0ZW5kZWRSZXN1bHRzDQotICAgICAgICA8L2xhYmVsPg0KLQ0KLSAgICAgICAgPGxhYmVsIGZvcj0ic3BlbGxjaGVja19jb2xsYXRlIiBjbGFzcz0iY2hlY2tib3giPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJzcGVsbGNoZWNrWydzcGVsbGNoZWNrLmNvbGxhdGUnXSIgbmFtZT0ic3BlbGxjaGVjay5jb2xsYXRlIiBpZD0ic3BlbGxjaGVja19jb2xsYXRlIiB2YWx1ZT0idHJ1ZSI+DQotICAgICAgICAgIHNwZWxsY2hlY2suY29sbGF0ZQ0KLSAgICAgICAgPC9sYWJlbD4NCi0NCi0gICAgICAgIDxsYWJlbCBmb3I9InNwZWxsY2hlY2tfbWF4Q29sbGF0aW9ucyI+c3BlbGxjaGVjay5tYXhDb2xsYXRpb25zPC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5tYXhDb2xsYXRpb25zJ10iIG5hbWU9InNwZWxsY2hlY2subWF4Q29sbGF0aW9ucyIgaWQ9InNwZWxsY2hlY2tfbWF4Q29sbGF0aW9ucyI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJzcGVsbGNoZWNrX21heENvbGxhdGlvblRyaWVzIj5zcGVsbGNoZWNrLm1heENvbGxhdGlvblRyaWVzPC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5tYXhDb2xsYXRpb25UcmllcyddIiBuYW1lPSJzcGVsbGNoZWNrLm1heENvbGxhdGlvblRyaWVzIiBpZD0ic3BlbGxjaGVja19tYXhDb2xsYXRpb25UcmllcyI+DQotDQotICAgICAgICA8bGFiZWwgZm9yPSJzcGVsbGNoZWNrX2FjY3VyYWN5Ij5zcGVsbGNoZWNrLmFjY3VyYWN5PC9sYWJlbD4NCi0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5hY2N1cmFjeSddIiBuYW1lPSJzcGVsbGNoZWNrLmFjY3VyYWN5IiBpZD0ic3BlbGxjaGVja19hY2N1cmFjeSI+DQotICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgIDwvZmllbGRzZXQ+DQotDQotDQotICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5nLWNsaWNrPSJkb1F1ZXJ5KCkiPkV4ZWN1dGUgUXVlcnk8L2J1dHRvbj4NCi0gICAgPC9mb3JtPg0KLSAgPC9kaXY+DQotDQotICA8ZGl2IGlkPSJyZXN1bHQiPg0KLQ0KLSAgICA8YSBuZy1zaG93PSJyZXNwb25zZS5kYXRhIiBpZD0idXJsIiBjbGFzcz0iYWRkcmVzcy1iYXIiIG5nLWhyZWY9Int7dXJsfX0iPnt7dXJsfX08L2E+DQotDQotICAgIDxkaXYgaWQ9InJlc3BvbnNlIj4NCi0gICAgICA8cHJlIGNsYXNzPSJzeW50YXggbGFuZ3VhZ2Ute3tsYW5nfX0iPjxjb2RlIG5nLWJpbmQtaHRtbD0icmVzcG9uc2UuZGF0YSB8IGhpZ2hsaWdodDpsYW5nIHwgdW5zYWZlIj48L2NvZGU+PC9wcmU+DQotICAgIDwvZGl2Pg0KLQ0KLSAgPC9kaXY+DQotDQotPC9kaXY+DQorPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZGl2IGlkPSJxdWVyeSIgY2xhc3M9ImNsZWFyZml4Ij4KKworICA8ZGl2IGlkPSJmb3JtIj4KKyAgICA8Zm9ybT4KKyAgICAgIDxsYWJlbCBmb3I9InF0IiB0aXRsZT0iUmVxdWVzdCBoYW5kbGVyIGluIHNvbHJjb25maWcueG1sLiI+CisgICAgICAgIDxhIHJlbD0iaGVscCI+UmVxdWVzdC1IYW5kbGVyIChxdCk8L2E+CisgICAgICA8L2xhYmVsPgorICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJxdCIgaWQ9InF0IiB2YWx1ZT0iL3NlbGVjdCIgdGl0bGU9IlJlcXVlc3QgaGFuZGxlciBpbiBzb2xyY29uZmlnLnhtbC4iPgorCisgICAgICA8ZmllbGRzZXQgY2xhc3M9ImNvbW1vbiI+CisgICAgICAgIDxsZWdlbmQ+Y29tbW9uPC9sZWdlbmQ+CisgICAgICAgIDxkaXYgY2xhc3M9ImZpZWxkc2V0Ij4KKworICAgICAgICA8bGFiZWwgZm9yPSJxIiB0aXRsZT0iVGhlIHF1ZXJ5IHN0cmluZy4iPgorICAgICAgICAgIHEKKyAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgPHRleHRhcmVhIG5hbWU9InEiIG5nLW1vZGVsPSJxdWVyeS5xIiBpZD0icSIgdGl0bGU9IlRoZSBxdWVyeSBzdHJpbmcuIj4qOio8L3RleHRhcmVhPgorCisgICAgICAgIDxsYWJlbCBmb3I9ImZxIiB0aXRsZT0iRmlsdGVyIHF1ZXJ5LiI+CisgICAgICAgICAgPGEgcmVsPSJoZWxwIj5mcTwvYT4KKyAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgPGRpdiBjbGFzcz0ibXVsdGlwbGUiPgorICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBjbGVhcmZpeCIgbmctcmVwZWF0PSJmaWx0ZXIgaW4gZmlsdGVycyI+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImZpbHRlci5mcSIgaWQ9ImZxIiBuYW1lPSJmcSIgdGl0bGU9IkZpbHRlciBxdWVyeS4iPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucyI+CisgICAgICAgICAgICAgIDxhIGNsYXNzPSJyZW0iIG5nLWNsaWNrPSJyZW1vdmVGaWx0ZXIoJGluZGV4KSI+PHNwYW4+PC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgPGEgY2xhc3M9ImFkZCIgbmctY2xpY2s9ImFkZEZpbHRlcigkaW5kZXgpIj48c3Bhbj48L3NwYW4+PC9hPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxsYWJlbCBmb3I9InNvcnQiIHRpdGxlPSJTb3J0IGZpZWxkIG9yIGZ1bmN0aW9uIHdpdGggYXNjfGRlc2MuIj4KKyAgICAgICAgICA8YSByZWw9ImhlbHAiPnNvcnQ8L2E+CisgICAgICAgIDwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0icXVlcnkuc29ydCIgaWQ9InNvcnQiIG5hbWU9InNvcnQiIHRpdGxlPSJTb3J0IGZpZWxkIG9yIGZ1bmN0aW9uIHdpdGggYXNjfGRlc2MuIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJzdGFydCIgdGl0bGU9Ik51bWJlciBvZiBsZWFkaW5nIGRvY3VtZW50cyB0byBza2lwIGFuZCBudW1iZXIgb2YgZG9jdW1lbnRzIHRvIHJldHVybiBhZnRlciAnc3RhcnQnLiAoSW50ZWdlcnMpIj4KKyAgICAgICAgICA8YSByZWw9ImhlbHAiPnN0YXJ0PC9hPiwKKyAgICAgICAgICA8YSByZWw9ImhlbHAiPnJvd3M8L2E+CisgICAgICAgIDwvbGFiZWw+CisgICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic3RhcnQiIG5nLW1vZGVsPSJxdWVyeS5zdGFydCIgaWQ9InN0YXJ0IiBwbGFjZWhvbGRlcj0iMCIgcGF0dGVybj0iWzAtOV0rIiB0aXRsZT0iTnVtYmVyIG9mIGxlYWRpbmcgZG9jdW1lbnRzIHRvIHNraXAuIChJbnRlZ2VyKSI+CisgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InJvd3MiIG5nLW1vZGVsPSJxdWVyeS5yb3dzIiBpZD0icm93cyIgcGxhY2Vob2xkZXI9IjEwIiBwYXR0ZXJuPSJbMC05XSsiIHRpdGxlPSJOdW1iZXIgb2YgZG9jdW1lbnRzIHRvIHJldHVybiBhZnRlciAnc3RhcnQnLiAoSW50ZWdlcikiPgorICAgICAgICA8L2Rpdj4KKworICAgICAgICA8bGFiZWwgZm9yPSJmbCIgdGl0bGU9IkZpZWxkIGxpc3QsIGNvbW1hIHNlcGFyYXRlZC4iPgorICAgICAgICAgIDxhIHJlbD0iaGVscCI+Zmw8L2E+CisgICAgICAgIDwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0icXVlcnkuZmwiIG5hbWU9ImZsIiBpZD0iZmwiIHZhbHVlPSIiIHRpdGxlPSJGaWVsZCBsaXN0LCBjb21tYSBzZXBhcmF0ZWQuIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJkZiIgdGl0bGU9IkRlZmF1bHQgc2VhcmNoIGZpZWxkIj4KKyAgICAgICAgICA8YSByZWw9ImhlbHAiPmRmPC9hPgorICAgICAgICA8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InF1ZXJ5LmRmIiBuYW1lPSJkZiIgaWQ9ImRmIiB2YWx1ZT0iIiB0aXRsZT0iRGVmYXVsdCBzZWFyY2ggZmllbGQiPgorCisgICAgICAgIDxsYWJlbCBmb3I9ImN1c3RvbV9wYXJhbWV0ZXJzIj4KKyAgICAgICAgICA8YSByZWw9ImhlbHAiPlJhdyBRdWVyeSBQYXJhbWV0ZXJzPC9hPgorICAgICAgICA8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InJhd1BhcmFtcyIgaWQ9ImN1c3RvbV9wYXJhbWV0ZXJzIiB2YWx1ZT0iIiBwbGFjZWhvbGRlcj0ia2V5MT12YWwxJmFtcDtrZXkyPXZhbDIiPgorCisgICAgICAgIDxsYWJlbCBmb3I9Ind0IiB0aXRsZT0iVGhlIHdyaXRlciB0eXBlIChyZXNwb25zZSBmb3JtYXQpLiI+CisgICAgICAgICAgPGEgcmVsPSJoZWxwIj53dDwvYT4KKyAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgPHNlbGVjdCBuYW1lPSJ3dCIgbmctbW9kZWw9InF1ZXJ5Lnd0IiBpZD0id3QiIHRpdGxlPSJUaGUgd3JpdGVyIHR5cGUgKHJlc3BvbnNlIGZvcm1hdCkuIj4KKyAgICAgICAgICA8b3B0aW9uPmpzb248L29wdGlvbj4KKyAgICAgICAgICA8b3B0aW9uPnhtbDwvb3B0aW9uPgorICAgICAgICAgIDxvcHRpb24+cHl0aG9uPC9vcHRpb24+CisgICAgICAgICAgPG9wdGlvbj5ydWJ5PC9vcHRpb24+CisgICAgICAgICAgPG9wdGlvbj5waHA8L29wdGlvbj4KKyAgICAgICAgICA8b3B0aW9uPmNzdjwvb3B0aW9uPgorICAgICAgICA8L3NlbGVjdD4KKworICAgICAgICA8bGFiZWwgZm9yPSJpbmRlbnQiIGNsYXNzPSJjaGVja2JveCIgdGl0bGU9IkluZGVudCByZXN1bHRzLiI+CisgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0icXVlcnkuaW5kZW50IiBuYW1lPSJpbmRlbnQiIGlkPSJpbmRlbnQiIHRpdGxlPSJJbmRlbnQgcmVzdWx0cy4iIG5nLXRydWUtdmFsdWU9IidvbiciIG5nLWZhbHNlLXZhbHVlPSInJyI+CisgICAgICAgICAgaW5kZW50CisgICAgICAgIDwvbGFiZWw+CisKKyAgICAgICAgPGxhYmVsIGZvcj0iZGVidWdRdWVyeSIgY2xhc3M9ImNoZWNrYm94IiB0aXRsZT0iU2hvdyB0aW1pbmcgYW5kIGRpYWdub3N0aWNzLiI+CisgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0icXVlcnkuZGVidWdRdWVyeSIgbmFtZT0iZGVidWdRdWVyeSIgaWQ9ImRlYnVnUXVlcnkiIHRpdGxlPSJTaG93IHRpbWluZyBhbmQgZGlhZ25vc3RpY3MuIiBuZy10cnVlLXZhbHVlPSInb24nIiBuZy1mYWxzZS12YWx1ZT0iJyciPgorICAgICAgICAgIGRlYnVnUXVlcnkKKyAgICAgICAgPC9sYWJlbD4KKworICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZmllbGRzZXQ+CisKKyAgICAgIDxmaWVsZHNldCBjbGFzcz0iZGlzbWF4IG9wdGlvbmFsIj4KKyAgICAgICAgPGxlZ2VuZD4KKyAgICAgICAgICA8bGFiZWwgZm9yPSJkaXNtYXgiIGNsYXNzPSJjaGVja2JveCIgdGl0bGU9IkVuYWJsZSBkaXNtYXguIj4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImlzRGlzbWF4IiBuYW1lPSJkZWZUeXBlIiBpZD0iZGlzbWF4IiB2YWx1ZT0iZGlzbWF4Ij4KKyAgICAgICAgICAgIGRpc21heAorICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgIDwvbGVnZW5kPgorICAgICAgICA8ZGl2IGNsYXNzPSJmaWVsZHNldCIgbmctc2hvdz0iaXNEaXNtYXgiPgorCisgICAgICAgIDxsYWJlbCBmb3I9InFfYWx0IiB0aXRsZT0iQWx0ZXJuYXRlIHF1ZXJ5IHdoZW4gJ3EnIGlzIGFic2VudC4iPnEuYWx0PC9sYWJlbD4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJkaXNtYXhbJ3EuYWx0J10iIG5hbWU9InEuYWx0IiBpZD0icV9hbHQiIHRpdGxlPSJBbHRlcm5hdGUgcXVlcnkgd2hlbiAncScgaXMgYWJzZW50LiI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0icWYiIHRpdGxlPSJRdWVyeSBmaWVsZHMgd2l0aCBvcHRpb25hbCBib29zdHMuIj5xZjwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZGlzbWF4LnFmIiBuYW1lPSJxZiIgaWQ9InFmIiB0aXRsZT0iUXVlcnkgZmllbGRzIHdpdGggb3B0aW9uYWwgYm9vc3RzLiI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0ibW0iIHRpdGxlPSJNaW4tc2hvdWxkLW1hdGNoIGV4cHJlc3Npb24iPm1tPC9sYWJlbD4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJkaXNtYXgubW0iIG5hbWU9Im1tIiBpZD0ibW0iIHRpdGxlPSJNaW4tc2hvdWxkLW1hdGNoIGV4cHJlc3Npb24uIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJwZiIgdGl0bGU9IlBocmFzZSBib29zdGVkIGZpZWxkcy4iPnBmPC9sYWJlbD4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJkaXNtYXgucGYiIG5hbWU9InBmIiBpZD0icGYiIHRpdGxlPSJQaHJhc2UgYm9vc3RlZCBmaWVsZHMuIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJwcyIgdGl0bGU9IlBocmFzZSBib29zdCBzbG9wLiI+cHM8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImRpc21heC5wcyIgbmFtZT0icHMiIGlkPSJwcyIgdGl0bGU9IlBocmFzZSBib29zdCBzbG9wLiI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0icXMiIHRpdGxlPSJRdWVyeSBzdHJpbmcgcGhyYXNlIHNsb3AuIj5xczwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZGlzbWF4LnFzIiBuYW1lPSJxcyIgaWQ9InFzIiB0aXRsZT0iUXVlcnkgc3RyaW5nIHBocmFzZSBzbG9wLiI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0idGllIiB0aXRsZT0iU2NvcmUgdGllLWJyZWFrZXIuIFRyeSAwLjEuIj50aWU8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImRpc21heC50aWUiIG5hbWU9InRpZSIgaWQ9InRpZSIgdGl0bGU9IlNjb3JlIHRpZS1icmVha2VyLiBUcnkgMC4xLiI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0iYnEiIHRpdGxlPSJCb29zdCBxdWVyeS4iPmJxPC9sYWJlbD4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJkaXNtYXguYnEiIG5hbWU9ImJxIiBpZD0iYnEiIHRpdGxlPSJCb29zdCBxdWVyeS4iPgorCisgICAgICAgIDxsYWJlbCBmb3I9ImJmIiB0aXRsZT0iQm9vc3QgZnVuY3Rpb24gKGFkZGVkKS4iPmJmPC9sYWJlbD4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJkaXNtYXguYmYiIG5hbWU9ImJmIiBpZD0iYmYiIHRpdGxlPSJCb29zdCBmdW5jdGlvbiAoYWRkZWQpLiI+CisKKyAgICAgICAgPC9kaXY+CisgICAgICA8L2ZpZWxkc2V0PgorCisgICAgICA8ZmllbGRzZXQgY2xhc3M9ImVkaXNtYXggb3B0aW9uYWwiPgorICAgICAgICA8bGVnZW5kPgorICAgICAgICAgIDxsYWJlbCBmb3I9ImVkaXNtYXgiIGNsYXNzPSJjaGVja2JveCIgdGl0bGU9IkVuYWJsZSBlZGlzbWF4LiI+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJpc0VkaXNtYXgiIG5hbWU9ImRlZlR5cGUiIGlkPSJlZGlzbWF4IiB2YWx1ZT0iZWRpc21heCI+CisgICAgICAgICAgICA8c3Ryb25nPmU8L3N0cm9uZz5kaXNtYXgKKyAgICAgICAgICA8L2xhYmVsPgorICAgICAgICA8L2xlZ2VuZD4KKyAgICAgICAgPGRpdiBjbGFzcz0iZmllbGRzZXQiIG5nLXNob3c9ImlzRWRpc21heCI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0iZWRpc21heF9xX2FsdCIgdGl0bGU9IkFsdGVybmF0ZSBxdWVyeSB3aGVuICdxJyBpcyBhYnNlbnQuIj5xLmFsdDwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZWRpc21heFsncS5hbHQnXSIgbmFtZT0icS5hbHQiIGlkPSJlZGlzbWF4X3FfYWx0IiAgdGl0bGU9IkFsdGVybmF0ZSBxdWVyeSB3aGVuICdxJyBpcyBhYnNlbnQuIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X3FmIiB0aXRsZT0iUXVlcnkgZmllbGRzIHdpdGggb3B0aW9uYWwgYm9vc3RzLiI+cWY8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXgucWYiIG5hbWU9InFmIiBpZD0iZWRpc21heF9xZiIgdGl0bGU9IlF1ZXJ5IGZpZWxkcyB3aXRoIG9wdGlvbmFsIGJvb3N0cy4iPgorCisgICAgICAgIDxsYWJlbCBmb3I9ImVkaXNtYXhfbW0iIHRpdGxlPSJNaW4tc2hvdWxkLW1hdGNoIGV4cHJlc3Npb24uIj5tbTwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZWRpc21heC5tbSIgbmFtZT0ibW0iIGlkPSJlZGlzbWF4X21tIiB0aXRsZT0iTWluLXNob3VsZC1tYXRjaCBleHByZXNzaW9uLiI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0iZWRpc21heF9wZiIgdGl0bGU9IlBocmFzZSBib29zdGVkIGZpZWxkcy4iPnBmPC9sYWJlbD4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJlZGlzbWF4LnBmIiBuYW1lPSJwZiIgaWQ9ImVkaXNtYXhfcGYiIHRpdGxlPSJQaHJhc2UgYm9vc3RlZCBmaWVsZHMuIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X3BzIiB0aXRsZT0iUGhyYXNlIGJvb3N0IHNsb3AuIj5wczwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZWRpc21heC5wcyIgbmFtZT0icHMiIGlkPSJlZGlzbWF4X3BzIiB0aXRsZT0iUGhyYXNlIGJvb3N0IHNsb3AuIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X3FzIiB0aXRsZT0iUXVlcnkgc3RyaW5nIHBocmFzZSBzbG9wLiI+cXM8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXgucXMiIG5hbWU9InFzIiBpZD0iZWRpc21heF9xcyIgdGl0bGU9IlF1ZXJ5IHN0cmluZyBwaHJhc2Ugc2xvcC4iPgorCisgICAgICAgIDxsYWJlbCBmb3I9ImVkaXNtYXhfdGllIiB0aXRsZT0iU2NvcmUgdGllLWJyZWFrZXIuIFRyeSAwLjEuIj50aWU8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXgudGllIiBuYW1lPSJ0aWUiIGlkPSJlZGlzbWF4X3RpZSIgdGl0bGU9IlNjb3JlIHRpZS1icmVha2VyLiBUcnkgMC4xLiI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0iZWRpc21heF9icSIgdGl0bGU9IkJvb3N0IHF1ZXJ5LiI+YnE8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXguYnEiIG5hbWU9ImJxIiBpZD0iZWRpc21heF9icSIgdGl0bGU9IkJvb3N0IHF1ZXJ5LiI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0iZWRpc21heF9iZiIgdGl0bGU9IkJvb3N0IGZ1bmN0aW9uIChhZGRlZCkuIj5iZjwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZWRpc21heC5iZiIgbmFtZT0iYmYiIGlkPSJlZGlzbWF4X2JmIiB0aXRsZT0iQm9vc3QgZnVuY3Rpb24gKGFkZGVkKS4iPgorCisgICAgICAgIDxsYWJlbCBmb3I9ImVkaXNtYXhfdWYiIHRpdGxlPSJVc2VyIEZpZWxkcyI+dWY8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXgudWYiIG5hbWU9InVmIiBpZD0iZWRpc21heF91ZiIgdGl0bGU9IlVzZXIgRmllbGRzIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X3BmMiIgdGl0bGU9ImJpZ3JhbSBwaHJhc2UgYm9vc3QgZmllbGRzIj5wZjI8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXgucGYyIiBuYW1lPSJwZjIiIGlkPSJlZGlzbWF4X3BmMiIgdGl0bGU9ImJpZ3JhbSBwaHJhc2UgYm9vc3QgZmllbGRzIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X3BmMyIgdGl0bGU9InRyaWdyYW0gcGhyYXNlIGJvb3N0IGZpZWxkcyI+cGYzPC9sYWJlbD4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJlZGlzbWF4LnBmMyIgbmFtZT0icGYzIiBpZD0iZWRpc21heF9wZjMiIHRpdGxlPSJ0cmlncmFtIHBocmFzZSBib29zdCBmaWVsZHMiPgorCisgICAgICAgIDxsYWJlbCBmb3I9ImVkaXNtYXhfcHMyIiB0aXRsZT0icGhyYXNlIHNsb3AgZm9yIGJpZ3JhbSBwaHJhc2VzIj5wczI8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXgucHMyIiBuYW1lPSJwczIiIGlkPSJlZGlzbWF4X3BzMiIgdGl0bGU9InBocmFzZSBzbG9wIGZvciBiaWdyYW0gcGhyYXNlcyI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0iZWRpc21heF9wczMiIHRpdGxlPSJwaHJhc2Ugc2xvcCBmb3IgdHJpZ3JhbSBwaHJhc2VzIj5wczM8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXgucHMzIiBuYW1lPSJwczMiIGlkPSJlZGlzbWF4X3BzMyIgdGl0bGU9InBocmFzZSBzbG9wIGZvciB0cmlncmFtIHBocmFzZXMiPgorCisgICAgICAgIDxsYWJlbCBmb3I9ImVkaXNtYXhfYm9vc3QiIHRpdGxlPSJtdWx0aXBsaWNhdGl2ZSBib29zdCBmdW5jdGlvbiI+Ym9vc3Q8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImVkaXNtYXguYm9vc3QiIG5hbWU9ImJvb3N0IiBpZD0iZWRpc21heF9ib29zdCIgdGl0bGU9Im11bHRpcGxpY2F0aXZlIGJvb3N0IGZ1bmN0aW9uIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X3N0b3B3b3JkcyIgY2xhc3M9ImNoZWNrYm94IiB0aXRsZT0icmVtb3ZlIHN0b3B3b3JkcyBmcm9tIG1hbmRhdG9yeSAnbWF0Y2hpbmcnIGNvbXBvbmVudCI+CisgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iZWRpc21heC5zdG9wd29yZHMiIG5hbWU9InN0b3B3b3JkcyIgaWQ9ImVkaXNtYXhfc3RvcHdvcmRzIj4KKyAgICAgICAgICBzdG9wd29yZHMKKyAgICAgICAgPC9sYWJlbD4KKworICAgICAgICA8bGFiZWwgZm9yPSJlZGlzbWF4X2xvd2VyY2FzZU9wZXJhdG9ycyIgY2xhc3M9ImNoZWNrYm94IiB0aXRsZT0iRW5hYmxlIGxvd2VyLWNhc2UgJ2FuZCcgYW5kICdvcicgYXMgb3BlcmF0b3JzIj4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJlZGlzbWF4Lmxvd2VyY2FzZU9wZXJhdG9ycyIgbmFtZT0ibG93ZXJjYXNlT3BlcmF0b3JzIiBpZD0iZWRpc21heF9sb3dlcmNhc2VPcGVyYXRvcnMiPgorICAgICAgICAgIGxvd2VyY2FzZU9wZXJhdG9ycworICAgICAgICA8L2xhYmVsPgorCisgICAgICAgIDwvZGl2PgorICAgICAgPC9maWVsZHNldD4KKworICAgICAgPGZpZWxkc2V0IGNsYXNzPSJobCBvcHRpb25hbCI+CisgICAgICAgIDxsZWdlbmQ+CisgICAgICAgICAgPGxhYmVsIGZvcj0iaGwiIGNsYXNzPSJjaGVja2JveCIgdGl0bGU9IkVuYWJsZSBoaWdobGlnaHRpbmcuIj4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImlzSGlnaGxpZ2h0IiBuYW1lPSJobCIgaWQ9ImhsIiB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICBobAorICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgIDwvbGVnZW5kPgorICAgICAgICA8ZGl2IGNsYXNzPSJmaWVsZHNldCIgbmctc2hvdz0iaXNIaWdobGlnaHQiPgorCisgICAgICAgIDxsYWJlbCBmb3I9ImhsX2ZsIiB0aXRsZT0iRmllbGRzIHRvIGhpZ2hsaWdodCBvbi4iPmhsLmZsPC9sYWJlbD4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJobFsnaGwuZmwnXSIgbmFtZT0iaGwuZmwiIGlkPSJobF9mbCIgdmFsdWU9IiIgdGl0bGU9IkZpZWxkcyB0byBoaWdobGlnaHQgb24uIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJobF9zaW1wbGVfcHJlIj5obC5zaW1wbGUucHJlPC9sYWJlbD4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJobFsnaGwuc2ltcGxlLnByZSddIiBuYW1lPSJobC5zaW1wbGUucHJlIiBpZD0iaGxfc2ltcGxlX3ByZSIgdmFsdWU9IjxlbT4iPgorCisgICAgICAgIDxsYWJlbCBmb3I9ImhsX3NpbXBsZV9wb3N0Ij5obC5zaW1wbGUucG9zdDwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iaGxbJ2hsLnNpbXBsZS5wb3N0J10iICBuYW1lPSJobC5zaW1wbGUucG9zdCIgaWQ9ImhsX3NpbXBsZV9wb3N0IiB2YWx1ZT0iPC9lbT4iPgorCisgICAgICAgIDxsYWJlbCBmb3I9ImhsX3JlcXVpcmVGaWVsZE1hdGNoIiBjbGFzcz0iY2hlY2tib3giPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImhsWydobC5yZXF1aXJlRmllbGRNYXRjaCddIiBuYW1lPSJobC5yZXF1aXJlRmllbGRNYXRjaCIgaWQ9ImhsX3JlcXVpcmVGaWVsZE1hdGNoIiB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgaGwucmVxdWlyZUZpZWxkTWF0Y2gKKyAgICAgICAgPC9sYWJlbD4KKworICAgICAgICA8bGFiZWwgZm9yPSJobF91c2VQaHJhc2VIaWdobGlnaHRlciIgY2xhc3M9ImNoZWNrYm94Ij4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJobFsndXNlUGhyYXNlSGlnaExpZ2h0ZXInXSIgbmFtZT0iaGwudXNlUGhyYXNlSGlnaGxpZ2h0ZXIiIGlkPSJobF91c2VQaHJhc2VIaWdobGlnaHRlciIgdmFsdWU9InRydWUiPgorICAgICAgICAgIGhsLnVzZVBocmFzZUhpZ2hsaWdodGVyCisgICAgICAgIDwvbGFiZWw+CisKKyAgICAgICAgPGxhYmVsIGZvcj0iaGxfaGlnaGxpZ2h0TXVsdGlUZXJtIiBjbGFzcz0iY2hlY2tib3giPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9ImhsWydoaWdodGxpZ2h0TXVsdGlUZXJtJ10iIG5hbWU9ImhsLmhpZ2hsaWdodE11bHRpVGVybSIgaWQ9ImhsX2hpZ2hsaWdodE11bHRpVGVybSIgdmFsdWU9InRydWUiPgorICAgICAgICAgIGhsLmhpZ2hsaWdodE11bHRpVGVybQorICAgICAgICA8L2xhYmVsPgorCisgICAgICAgIDwvZGl2PgorICAgICAgPC9maWVsZHNldD4KKworICAgICAgPGZpZWxkc2V0IGNsYXNzPSJmYWNldCBvcHRpb25hbCI+CisgICAgICAgIDxsZWdlbmQ+CisgICAgICAgICAgPGxhYmVsIGZvcj0iZmFjZXQiIGNsYXNzPSJjaGVja2JveCIgdGl0bGU9IkVuYWJsZSBmYWNldGluZy4iPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0iaXNGYWNldCIgbmFtZT0iZmFjZXQiIGlkPSJmYWNldCI+CisgICAgICAgICAgICBmYWNldAorICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgIDwvbGVnZW5kPgorICAgICAgICA8ZGl2IGNsYXNzPSJmaWVsZHNldCIgbmctc2hvdz0iaXNGYWNldCI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0iZmFjZXRfcXVlcnkiPmZhY2V0LnF1ZXJ5PC9sYWJlbD4KKyAgICAgICAgPHRleHRhcmVhIG5nLW1vZGVsPSJmYWNldFsnZmFjZXQucXVlcnknXSIgbmFtZT0iZmFjZXQucXVlcnkiIGlkPSJmYWNldF9xdWVyeSI+PC90ZXh0YXJlYT4KKworICAgICAgICA8bGFiZWwgZm9yPSJmYWNldF9maWVsZCI+ZmFjZXQuZmllbGQ8L2xhYmVsPgorICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9ImZhY2V0WydmYWNldC5maWVsZCddIiBuYW1lPSJmYWNldC5maWVsZCIgaWQ9ImZhY2V0X2ZpZWxkIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJmYWNldF9wcmVmaXgiPmZhY2V0LnByZWZpeDwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0iZmFjZXRbJ2ZhY2V0LnByZWZpeCddIiBuYW1lPSJmYWNldC5wcmVmaXgiIGlkPSJmYWNldF9wcmVmaXgiPgorCisgICAgICAgIDwvZGl2PgorICAgICAgPC9maWVsZHNldD4KKworICAgICAgPGZpZWxkc2V0IGNsYXNzPSJzcGF0aWFsIG9wdGlvbmFsIj4KKyAgICAgICAgPGxlZ2VuZD4KKyAgICAgICAgICA8bGFiZWwgZm9yPSJzcGF0aWFsIiBjbGFzcz0iY2hlY2tib3giIHRpdGxlPSJTaG93IHNwYXRpYWwgb3B0aW9ucyI+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJpc1NwYXRpYWwiIG5hbWU9InNwYXRpYWwiIGlkPSJzcGF0aWFsIj4KKyAgICAgICAgICAgIHNwYXRpYWwKKyAgICAgICAgICA8L2xhYmVsPgorICAgICAgICA8L2xlZ2VuZD4KKyAgICAgICAgPGRpdiBjbGFzcz0iZmllbGRzZXQiIG5nLXNob3c9ImlzU3BhdGlhbCI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0icHQiPnB0PC9sYWJlbD4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJzcGF0aWFsLnB0IiBuYW1lPSJwdCIgaWQ9InB0Ij4KKworICAgICAgICA8bGFiZWwgZm9yPSJzZmllbGQiPnNmaWVsZDwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3BhdGlhbC5zZmllbGQiIG5hbWU9InNmaWVsZCIgaWQ9InNmaWVsZCI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0iZCI+ZDwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3BhdGlhbC5kIiBuYW1lPSJkIiBpZD0iZCI+CisKKyAgICAgICAgPC9kaXY+CisgICAgICA8L2ZpZWxkc2V0PgorCisgICAgICA8ZmllbGRzZXQgY2xhc3M9InNwZWxsY2hlY2sgb3B0aW9uYWwiPgorICAgICAgICA8bGVnZW5kPgorICAgICAgICAgIDxsYWJlbCBmb3I9InNwZWxsY2hlY2siIGNsYXNzPSJjaGVja2JveCIgdGl0bGU9IkVuYWJsZSBzcGVsbGNoZWNraW5nLiI+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJpc1NwZWxsY2hlY2siIG5hbWU9InNwZWxsY2hlY2siIGlkPSJzcGVsbGNoZWNrIj4KKyAgICAgICAgICAgIHNwZWxsY2hlY2sKKyAgICAgICAgICA8L2xhYmVsPgorICAgICAgICA8L2xlZ2VuZD4KKyAgICAgICAgPGRpdiBjbGFzcz0iZmllbGRzZXQiIG5nLXNob3c9ImlzU3BlbGxjaGVjayI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0ic3BlbGxjaGVja19idWlsZCIgY2xhc3M9ImNoZWNrYm94Ij4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJzcGVsbGNoZWNrWydzcGVsbGNoZWNrLmJ1aWxkJ10iIG5hbWU9InNwZWxsY2hlY2suYnVpbGQiIGlkPSJzcGVsbGNoZWNrX2J1aWxkIiB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgc3BlbGxjaGVjay5idWlsZAorICAgICAgICA8L2xhYmVsPgorCisgICAgICAgIDxsYWJlbCBmb3I9InNwZWxsY2hlY2tfcmVsb2FkIiBjbGFzcz0iY2hlY2tib3giPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9InNwZWxsY2hlY2tbJ3NwZWxsY2hlY2sucmVsb2FkJ10iIG5hbWU9InNwZWxsY2hlY2sucmVsb2FkIiBpZD0ic3BlbGxjaGVja19yZWxvYWQiIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICBzcGVsbGNoZWNrLnJlbG9hZAorICAgICAgICA8L2xhYmVsPgorCisgICAgICAgIDxsYWJlbCBmb3I9InNwZWxsY2hlY2tfcSI+c3BlbGxjaGVjay5xPC9sYWJlbD4KKyAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJzcGVsbGNoZWNrWydzcGVsbGNoZWNrLnEnXSIgbmFtZT0ic3BlbGxjaGVjay5xIiBpZD0ic3BlbGxjaGVja19xIj4KKworICAgICAgICA8bGFiZWwgZm9yPSJzcGVsbGNoZWNrX2RpY3Rpb25hcnkiPnNwZWxsY2hlY2suZGljdGlvbmFyeTwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5kaWN0aW9uYXJ5J10iIG5hbWU9InNwZWxsY2hlY2suZGljdGlvbmFyeSIgaWQ9InNwZWxsY2hlY2tfZGljdGlvbmFyeSI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0ic3BlbGxjaGVja19jb3VudCI+c3BlbGxjaGVjay5jb3VudDwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5jb3VudCddIiBuYW1lPSJzcGVsbGNoZWNrLmNvdW50IiBpZD0ic3BlbGxjaGVja19jb3VudCI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0ic3BlbGxjaGVja19vbmx5TW9yZVBvcHVsYXIiIGNsYXNzPSJjaGVja2JveCI+CisgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5vbmx5TW9yZVBvcHVsYXInXSIgbmFtZT0ic3BlbGxjaGVjay5vbmx5TW9yZVBvcHVsYXIiIGlkPSJzcGVsbGNoZWNrX29ubHlNb3JlUG9wdWxhciIgdmFsdWU9InRydWUiPgorICAgICAgICAgIHNwZWxsY2hlY2sub25seU1vcmVQb3B1bGFyCisgICAgICAgIDwvbGFiZWw+CisKKyAgICAgICAgPGxhYmVsIGZvcj0ic3BlbGxjaGVja19leHRlbmRlZFJlc3VsdHMiIGNsYXNzPSJjaGVja2JveCI+CisgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5leHRlbmRlZFJlc3VsdHMnXSIgbmFtZT0ic3BlbGxjaGVjay5leHRlbmRlZFJlc3VsdHMiIGlkPSJzcGVsbGNoZWNrX2V4dGVuZGVkUmVzdWx0cyIgdmFsdWU9InRydWUiPgorICAgICAgICAgIHNwZWxsY2hlY2suZXh0ZW5kZWRSZXN1bHRzCisgICAgICAgIDwvbGFiZWw+CisKKyAgICAgICAgPGxhYmVsIGZvcj0ic3BlbGxjaGVja19jb2xsYXRlIiBjbGFzcz0iY2hlY2tib3giPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9InNwZWxsY2hlY2tbJ3NwZWxsY2hlY2suY29sbGF0ZSddIiBuYW1lPSJzcGVsbGNoZWNrLmNvbGxhdGUiIGlkPSJzcGVsbGNoZWNrX2NvbGxhdGUiIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICBzcGVsbGNoZWNrLmNvbGxhdGUKKyAgICAgICAgPC9sYWJlbD4KKworICAgICAgICA8bGFiZWwgZm9yPSJzcGVsbGNoZWNrX21heENvbGxhdGlvbnMiPnNwZWxsY2hlY2subWF4Q29sbGF0aW9uczwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5tYXhDb2xsYXRpb25zJ10iIG5hbWU9InNwZWxsY2hlY2subWF4Q29sbGF0aW9ucyIgaWQ9InNwZWxsY2hlY2tfbWF4Q29sbGF0aW9ucyI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0ic3BlbGxjaGVja19tYXhDb2xsYXRpb25UcmllcyI+c3BlbGxjaGVjay5tYXhDb2xsYXRpb25UcmllczwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5tYXhDb2xsYXRpb25UcmllcyddIiBuYW1lPSJzcGVsbGNoZWNrLm1heENvbGxhdGlvblRyaWVzIiBpZD0ic3BlbGxjaGVja19tYXhDb2xsYXRpb25UcmllcyI+CisKKyAgICAgICAgPGxhYmVsIGZvcj0ic3BlbGxjaGVja19hY2N1cmFjeSI+c3BlbGxjaGVjay5hY2N1cmFjeTwvbGFiZWw+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuZy1tb2RlbD0ic3BlbGxjaGVja1snc3BlbGxjaGVjay5hY2N1cmFjeSddIiBuYW1lPSJzcGVsbGNoZWNrLmFjY3VyYWN5IiBpZD0ic3BlbGxjaGVja19hY2N1cmFjeSI+CisgICAgICAgPC9kaXY+CisKKyAgICAgIDwvZmllbGRzZXQ+CisKKworICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5nLWNsaWNrPSJkb1F1ZXJ5KCkiPkV4ZWN1dGUgUXVlcnk8L2J1dHRvbj4KKyAgICA8L2Zvcm0+CisgIDwvZGl2PgorCisgIDxkaXYgaWQ9InJlc3VsdCI+CisKKyAgICA8YSBuZy1zaG93PSJyZXNwb25zZS5kYXRhIiBpZD0idXJsIiBjbGFzcz0iYWRkcmVzcy1iYXIiIG5nLWhyZWY9Int7dXJsfX0iPnt7dXJsfX08L2E+CisKKyAgICA8ZGl2IGlkPSJyZXNwb25zZSI+CisgICAgICA8cHJlIGNsYXNzPSJzeW50YXggbGFuZ3VhZ2Ute3tsYW5nfX0iPjxjb2RlIG5nLWJpbmQtaHRtbD0icmVzcG9uc2UuZGF0YSB8IGhpZ2hsaWdodDpsYW5nIHwgdW5zYWZlIj48L2NvZGU+PC9wcmU+CisgICAgPC9kaXY+CisKKyAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL3JlcGxpY2F0aW9uLmh0bWwgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvcmVwbGljYXRpb24uaHRtbAppbmRleCBiNGI3MDZiLi5iM2Q2Njg0IDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvcmVwbGljYXRpb24uaHRtbAorKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvcmVwbGljYXRpb24uaHRtbApAQCAtMSwyMzkgKzEsMjM5IEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZGl2IGlkPSJyZXBsaWNhdGlvbiIgY2xhc3M9ImNsZWFyZml4IiBuZy1jbGFzcz0ie3JlcGxpY2F0aW5nOnNldHRpbmdzLmlzUmVwbGljYXRpbmd9Ij4NCi0NCi0gIDxkaXYgaWQ9ImZyYW1lIj4NCi0NCi0gICAgPGRpdiBpZD0iZXJyb3IiIG5nLXNob3c9InByb2dyZXNzLkVSUk9SIj57eyBwcm9ncmVzcy5FUlJPUiB9fTwvZGl2Pg0KLQ0KLSAgICA8ZGl2IGNsYXNzPSJyZXBsaWNhdGluZyBibG9jayIgbmctc2hvdz0ic2V0dGluZ3MuaXNSZXBsaWNhdGluZyI+DQotDQotICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MiPg0KLQ0KLSAgICAgICAgPGRpdiBpZD0ic3RhcnQiPjxkaXYgY2xhc3M9ImluZm8iPg0KLQ0KLSAgICAgICAgICA8c3Bhbj57e3Byb2dyZXNzLnJlcGxpY2F0aW9uU3RhcnRUaW1lfX08L3NwYW4+DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgPC9kaXY+PC9kaXY+DQotDQotICAgICAgICA8ZGl2IGlkPSJzcGVlZCI+PGRpdiBjbGFzcz0iaW5mbyI+DQotDQotICAgICAgICAgIDxzcGFuPjUuMSBNQjwvc3Bhbj4vcw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIDwvZGl2PjwvZGl2Pg0KLQ0KLSAgICAgICAgPGRpdiBpZD0iYmFyIj4NCi0NCi0gICAgICAgICAgPGRpdiBpZD0iYmFyLWluZm8iPjxkaXYgY2xhc3M9ImluZm8iPg0KLQ0KLSAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZXMiPjxzcGFuPnt7cHJvZ3Jlc3MubnVtRmlsZXNUb0Rvd25sb2FkfX08L3NwYW4+IEZpbGU8c3BhbiBuZy1zaG93PSJwcm9ncmVzcy5udW1GaWxlc1RvRG93bmxvYWQmZ3Q7MSI+czwvc3Bhbj48L2Rpdj4NCi0gICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpemUiPjxzcGFuPnt7cHJvZ3Jlc3MuYnl0ZXNUb0Rvd25sb2FkfX08L3NwYW4+PC9kaXY+DQotDQotICAgICAgICAgIDwvZGl2PjwvZGl2Pg0KLQ0KLSAgICAgICAgICA8ZGl2IGlkPSJldGEiPjxkaXYgY2xhc3M9ImluZm8iPg0KLQ0KLSAgICAgICAgICAgIEVUQTogPHNwYW4+e3twcm9ncmVzcy50aW1lUmVtYWluaW5nIHwgcmVhZGFibGVTZWNvbmRzIH19PC9zcGFuPg0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgIDwvZGl2PjwvZGl2Pg0KLQ0KLSAgICAgICAgICA8ZGl2IGlkPSJkb25lIiBzdHlsZT0id2lkdGg6IHt7cHJvZ3Jlc3MudG90YWxQZXJjZW50V2lkdGh9fSI+DQotDQotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyY2VudCI+DQotDQotICAgICAgICAgICAgICA8c3Bhbj57e3Byb2dyZXNzLnRvdGFsUGVyY2VudH19PC9zcGFuPiUNCi0NCi0gICAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgICA8ZGl2IGlkPSJkb25lLWluZm8iPjxkaXYgY2xhc3M9ImluZm8iPg0KLQ0KLSAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZXMiPjxzcGFuPnt7cHJvZ3Jlc3MubnVtRmlsZXNEb3dubG9hZGVkfX08L3NwYW4+IEZpbGU8c3BhbiBuZy1zaG93PSJwcm9ncmVzcy5udW1GaWxlc0Rvd25sb2FkZWQmZ3Q7MSI+czwvc3Bhbj48L2Rpdj4NCi0gICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpemUiPjxzcGFuPnt7cHJvZ3Jlc3MuYnl0ZXNEb3dubG9hZGVkfX08L3NwYW4+PC9kaXY+DQotDQotICAgICAgICAgICAgPC9kaXY+PC9kaXY+DQotDQotICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgPC9kaXY+DQotDQotICAgICAgPC9kaXY+DQotDQotICAgICAgPGRpdiBpZD0iY3VycmVudC1maWxlIiBjbGFzcz0iY2xlYXJmaXgiPg0KLQ0KLSAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPjxzcGFuIGNsYXNzPSJsb2FkZXIiPkN1cnJlbnQgRmlsZTo8L3NwYW4+PC9kaXY+DQotICAgICAgICA8ZGl2IGNsYXNzPSJmaWxlIj57e3Byb2dyZXNzLmN1cnJlbnRGaWxlfX08L2Rpdj4NCi0gICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzIj4NCi0gICAgICAgICAgPHNwYW4gY2xhc3M9ImRvbmUiPnt7cHJvZ3Jlc3MuY3VycmVudEZpbGVTaXplRG93bmxvYWRlZH19PC9zcGFuPiAvIDxzcGFuIGNsYXNzPSJ0b3RhbCI+e3twcm9ncmVzcy5jdXJyZW50RmlsZVNpemV9fTwvc3Bhbj4gWzxzcGFuIGNsYXNzPSJwZXJjZW50Ij57e3Byb2dyZXNzLmN1cnJlbnRGaWxlU2l6ZVBlcmNlbnR9fTwvc3Bhbj4lXQ0KLSAgICAgICAgPC9kaXY+DQotDQotICAgICAgPC9kaXY+DQotICAgICAgICANCi0gICAgPC9kaXY+DQotDQotICAgIDxkaXYgaWQ9Iml0ZXJhdGlvbnMiIGNsYXNzPSJzbGF2ZU9ubHkgYmxvY2sgY2xlYXJmaXgiIG5nLXNob3c9ImlzU2xhdmUiPg0KLQ0KLSAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj48c3BhbiBjbGFzcz0iIj5JdGVyYXRpb25zOjwvc3Bhbj48L2Rpdj4NCi0gICAgICA8ZGl2IGNsYXNzPSJpdGVyYXRpb25zIiBuZy1zaG93PSJpdGVyYXRpb25zICYmIHNob3dJdGVyYXRpb25zIj4NCi0gICAgICAgIDx1bD4NCi0gICAgICAgICAgICA8bGkgY2xhc3M9Int7aXRlcmF0aW9uLnN0YXR1c319IiBuZy1jbGFzcz0ie2xhdGVzdDppdGVyYXRpb24ubGF0ZXN0fSIgbmctcmVwZWF0PSJpdGVyYXRpb24gaW4gaXRlcmF0aW9ucyB8bGltaXRUbzppdGVyYXRpb25Db3VudCI+e3tpdGVyYXRpb24uZGF0ZX19PC9saT4NCi0gICAgICAgIDwvdWw+DQotICAgICAgICA8c3BhbiBuZy1zaG93PSJpdGVyYXRpb25zLmxlbmd0aCZndDsxIj4NCi0gICAgICAgICAgPGEgbmctc2hvdz0iaXRlcmF0aW9uQ291bnQ9PTEiIG5nLWNsaWNrPSJzaG93SXRlcmF0aW9ucygpIj48c3BhbiBjbGFzcz0iZXhwYW5kIj5TaG93IGFsbCBJdGVyYXRpb25zPC9zcGFuPjwvYT4NCi0gICAgICAgICAgPGEgbmctc2hvdz0iaXRlcmF0aW9uQ291bnQmZ3Q7MSIgbmctY2xpY2s9ImhpZGVJdGVyYXRpb25zKCkiPjxzcGFuIGNsYXNzPSJjb2xsYXBzZSI+SGlkZSBwYXN0IEl0ZXJhdGlvbnM8L3NwYW4+PC9hPg0KLSAgICAgICAgPC9zcGFuPg0KLQ0KLSAgICAgIDwvZGl2Pg0KLSAgICAgICAgDQotICAgIDwvZGl2Pg0KLQ0KLSAgICA8ZGl2IGlkPSJkZXRhaWxzIiBjbGFzcz0iYmxvY2sgY2xlYXJmaXgiPg0KLQ0KLSAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQotDQotICAgICAgICA8dGhlYWQ+DQotDQotICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICA8dGQ+PHNwYW4+SW5kZXg8L3NwYW4+PC90ZD4NCi0gICAgICAgICAgICA8dGg+VmVyc2lvbjwvdGg+DQotICAgICAgICAgICAgPHRoPjxhYmJyIHRpdGxlPSJHZW5lcmF0aW9uIj5HZW48L2FiYnI+PC90aD4NCi0gICAgICAgICAgICA8dGg+U2l6ZTwvdGg+DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICA8L3RoZWFkPg0KLSAgICAgICAgPHRib2R5Pg0KLQ0KLSAgICAgICAgICA8dHIgY2xhc3M9Im1hc3RlclNlYXJjaCI+DQotDQotICAgICAgICAgICAgPHRoPk1hc3RlciAoU2VhcmNoaW5nKTwvdGg+DQotICAgICAgICAgICAgPHRkIGNsYXNzPSJ2ZXJzaW9uIiBuZy1jbGFzcz0ie2RpZmY6dmVyc2lvbnMuY2hhbmdlZFZlcnNpb259Ij4NCi0gICAgICAgICAgICAgICAgPGRpdj57e3ZlcnNpb25zLm1hc3RlclNlYXJjaC52ZXJzaW9ufX08L2Rpdj4NCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0iZ2VuZXJhdGlvbiIgbmctY2xhc3M9IntkaWZmOnZlcnNpb25zLmNoYW5nZWRHZW5lcmF0aW9ufSI+DQotICAgICAgICAgICAgICAgIDxkaXY+e3t2ZXJzaW9ucy5tYXN0ZXJTZWFyY2guZ2VuZXJhdGlvbn19PC9kaXY+DQotICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICA8dGQgY2xhc3M9InNpemUiPg0KLSAgICAgICAgICAgICAgICA8ZGl2Pnt7dmVyc2lvbnMubWFzdGVyU2VhcmNoLnNpemV9fTwvZGl2Pg0KLSAgICAgICAgICAgIDwvdGQ+DQotDQotICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgIDx0ciBjbGFzcz0ibWFzdGVyIj4NCi0NCi0gICAgICAgICAgICA8dGg+TWFzdGVyIChSZXBsaWNhYmxlKTwvdGg+DQotICAgICAgICAgICAgPHRkIGNsYXNzPSJ2ZXJzaW9uIiBuZy1jbGFzcz0ie2RpZmY6dmVyc2lvbnMuY2hhbmdlZFZlcnNpb259Ij4NCi0gICAgICAgICAgICAgICAgPGRpdj57e3ZlcnNpb25zLm1hc3Rlci52ZXJzaW9ufX08L2Rpdj4NCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0iZ2VuZXJhdGlvbiIgbmctY2xhc3M9IntkaWZmOnZlcnNpb25zLmNoYW5nZWRHZW5lcmF0aW9ufSI+DQotICAgICAgICAgICAgICAgIDxkaXY+e3t2ZXJzaW9ucy5tYXN0ZXIuZ2VuZXJhdGlvbn19PC9kaXY+DQotICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICA8dGQgY2xhc3M9InNpemUiPg0KLSAgICAgICAgICAgICAgICA8ZGl2Pnt7dmVyc2lvbnMubWFzdGVyLnNpemV9fTwvZGl2Pg0KLSAgICAgICAgICAgIDwvdGQ+DQotDQotICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgIDx0ciBjbGFzcz0ic2xhdmUgc2xhdmVPbmx5IiBuZy1zaG93PSJpc1NsYXZlIj4NCi0NCi0gICAgICAgICAgICA8dGg+U2xhdmUgKFNlYXJjaGluZyk8L3RoPg0KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0idmVyc2lvbiIgbmctY2xhc3M9IntkaWZmOnZlcnNpb25zLmNoYW5nZWRWZXJzaW9ufSI+DQotICAgICAgICAgICAgICAgIDxkaXY+e3t2ZXJzaW9ucy5zbGF2ZS52ZXJzaW9ufX08L2Rpdj4NCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0iZ2VuZXJhdGlvbiIgbmctY2xhc3M9IntkaWZmOnZlcnNpb25zLmNoYW5nZWRHZW5lcmF0aW9ufSI+DQotICAgICAgICAgICAgICAgIDxkaXY+e3t2ZXJzaW9ucy5zbGF2ZS5nZW5lcmF0aW9ufX08L2Rpdj4NCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ic2l6ZSI+DQotICAgICAgICAgICAgICAgIDxkaXY+e3t2ZXJzaW9ucy5zbGF2ZS5zaXplfX08L2Rpdj4NCi0gICAgICAgICAgICA8L3RkPg0KLQ0KLSAgICAgICAgICA8L3RyPg0KLQ0KLSAgICAgICAgPC90Ym9keT4NCi0NCi0gICAgICA8L3RhYmxlPg0KLQ0KLSAgICA8L2Rpdj4NCi0NCi0gICAgPGRpdiBpZD0ic2V0dGluZ3MiIGNsYXNzPSJzZXR0aW5ncyBibG9jayBjbGVhcmZpeCBzbGF2ZU9ubHkiIG5nLXNob3c9ImlzU2xhdmUiPg0KLQ0KLSAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj48c3Bhbj5TZXR0aW5nczo8L3NwYW4+PC9kaXY+DQotICAgICAgPHVsPg0KLSAgICAgICAgPGxpIGNsYXNzPSJtYXN0ZXJVcmwiIG5nLXNob3c9InNldHRpbmdzLm1hc3RlclVybCI+DQotICAgICAgICAgICAgPGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgICAgIDxkdD5tYXN0ZXIgdXJsOjwvZHQ+DQotICAgICAgICAgICAgICAgIDxkZD57e3NldHRpbmdzLm1hc3RlclVybH19PC9kZD4NCi0gICAgICAgICAgICA8L2RsPg0KLSAgICAgICAgPC9saT4NCi0gICAgICAgIDxsaSBjbGFzcz0iaXNQb2xsaW5nRGlzYWJsZWQiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICA8ZHQ+cG9sbGluZyBlbmFibGU6PC9kdD4NCi0gICAgICAgICAgICA8ZGQgY2xhc3M9ImljbyIgbmctY2xhc3M9InsnaWNvLTAnOnNldHRpbmdzLmlzUG9sbGluZ0Rpc2FibGVkLCAnaWNvLTEnOiFzZXR0aW5ncy5pc1BvbGxpbmdEaXNhYmxlZH0iPg0KLSAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJzZXR0aW5ncy5wb2xsSW50ZXJ2YWwiPihpbnRlcnZhbDoge3tzZXR0aW5ncy5wb2xsSW50ZXJ2YWx9fSk8L3NwYW4+Jm5ic3A7DQotICAgICAgICAgICAgPC9kZD4NCi0gICAgICAgIDwvZGw+PC9saT4NCi0gICAgICA8L3VsPg0KLSAgICAgICAgDQotICAgIDwvZGl2Pg0KLQ0KLSAgICA8ZGl2IGlkPSJtYXN0ZXItc2V0dGluZ3MiIGNsYXNzPSJzZXR0aW5ncyBibG9jayBjbGVhcmZpeCI+DQotDQotICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPjxzcGFuPlNldHRpbmdzIChNYXN0ZXIpOjwvc3Bhbj48L2Rpdj4NCi0gICAgICA8dWw+DQotICAgICAgICA8bGkgY2xhc3M9InJlcGxpY2F0aW9uRW5hYmxlZCI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgIDxkdD5yZXBsaWNhdGlvbiBlbmFibGU6PC9kdD4NCi0gICAgICAgICAgICA8ZGQgY2xhc3M9ImljbyIgbmctY2xhc3M9InsnaWNvLTAnOiFtYXN0ZXIucmVwbGljYXRpb25FbmFibGVkLCAnaWNvLTEnOm1hc3Rlci5yZXBsaWNhdGlvbkVuYWJsZWR9Ij4mbmJzcDs8L2RkPg0KLSAgICAgICAgPC9kbD48L2xpPg0KLSAgICAgICAgPGxpIGNsYXNzPSJyZXBsaWNhdGVBZnRlciI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgIDxkdD5yZXBsaWNhdGVBZnRlcjo8L2R0Pg0KLSAgICAgICAgICAgIDxkZD57e21hc3Rlci5yZXBsaWNhdGVBZnRlcn19PC9kZD4NCi0gICAgICAgIDwvZGw+PC9saT4NCi0gICAgICAgIDxsaSBjbGFzcz0iY29uZkZpbGVzIiBuZy1zaG93PSJtYXN0ZXIuZmlsZXMiPjxkbCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICA8ZHQ+Y29uZkZpbGVzOjwvZHQ+DQotICAgICAgICAgICAgPGRkPjxzcGFuIG5nLXJlcGVhdD0iZmlsZSBpbiBtYXN0ZXIuZmlsZXMiPjxhdHRyIHRpdGxlPSJ7e2ZpbGUudGl0bGV9fSI+e3tmaWxlLm5hbWV9fTwvYXR0cj57eyAkbGFzdCA/ICcnIDonLCAnfX08L3NwYW4+PC9kZD4NCi0gICAgICAgIDwvZGw+PC9saT4NCi0gICAgICA8L3VsPg0KLSAgICAgICAgDQotICAgIDwvZGl2Pg0KLSAgICANCi0gIDwvZGl2Pg0KLQ0KLSAgPGRpdiBpZD0ibmF2aWdhdGlvbiI+DQotDQotICAgIDxkaXYgY2xhc3M9InRpbWVyIiBuZy1zaG93PSJpc1NsYXZlICYmICFzZXR0aW5ncy5pc1BvbGxpbmdEaXNhYmxlZCAmJiFzZXR0aW5ncy5pc1JlcGxpY2F0aW5nIj4NCi0NCi0gICAgICA8cD5OZXh0IFJ1bjogPHNwYW4gY2xhc3M9ImFwcHJveCIgbmctc2hvdz0ic2V0dGluZ3MuaXNBcHByb3giPn48L3NwYW4+PHNwYW4gY2xhc3M9InRpY2siPnt7c2V0dGluZ3MudGljayB8IHJlYWRhYmxlU2Vjb25kc319PC9zcGFuPjwvcD4NCi0gICAgICA8c21hbGwgbmctc2hvdz0ic2V0dGluZ3MubmV4dEV4ZWN1dGlvbkF0Ij57e3NldHRpbmdzLm5leHRFeGVjdXRpb25BdH19PC9zbWFsbD4NCi0gICAgPC9kaXY+DQotDQotICAgIDxidXR0b24gY2xhc3M9InJlZnJlc2gtc3RhdHVzIiBuZy1jbGljaz0icmVmcmVzaCgpIj48c3Bhbj5SZWZyZXNoIFN0YXR1czwvc3Bhbj48L2J1dHRvbj4NCi0NCi0gICAgPGRpdiBjbGFzcz0ic2xhdmVPbmx5IiBuZy1zaG93PSJpc1NsYXZlIj4NCi0gICAgICA8YnV0dG9uIGNsYXNzPSJvcHRpb25hbCByZXBsaWNhdGUtbm93IHByaW1hcnkiIG5nLWNsaWNrPSJleGVjdXRlKCdmZXRjaGluZGV4JykiIG5nLXNob3c9IiFzZXR0aW5ncy5pc1JlcGxpY2F0aW5nIj48c3Bhbj5SZXBsaWNhdGUgbm93PC9zcGFuPjwvYnV0dG9uPg0KLSAgICAgIDxidXR0b24gY2xhc3M9Im9wdGlvbmFsIGFib3J0LXJlcGxpY2F0aW9uIHdhcm4iIG5nLWNsaWNrPSJleGVjdXRlKCdhYm9ydGZldGNoJykiIG5nLXNob3c9InNldHRpbmdzLmlzUmVwbGljYXRpbmciPjxzcGFuPkFib3J0IFJlcGxpY2F0aW9uPC9zcGFuPjwvYnV0dG9uPg0KLQ0KLSAgICAgIDxidXR0b24gY2xhc3M9Im9wdGlvbmFsIGRpc2FibGUtcG9sbGluZyIgbmctY2xpY2s9ImV4ZWN1dGUoJ2Rpc2FibGVwb2xsJykiIG5nLXNob3c9IiFzZXR0aW5ncy5pc1BvbGxpbmdEaXNhYmxlZCI+PHNwYW4+RGlzYWJsZSBQb2xsaW5nPC9zcGFuPjwvYnV0dG9uPg0KLSAgICAgIDxidXR0b24gY2xhc3M9Im9wdGlvbmFsIGVuYWJsZS1wb2xsaW5nIiBuZy1jbGljaz0iZXhlY3V0ZSgnZW5hYmxlcG9sbCcpIiBuZy1zaG93PSJzZXR0aW5ncy5pc1BvbGxpbmdEaXNhYmxlZCI+PHNwYW4+RW5hYmxlIFBvbGxpbmc8L3NwYW4+PC9idXR0b24+DQotICAgIDwvZGl2Pg0KLQ0KLSAgICA8ZGl2IGNsYXNzPSJtYXN0ZXJPbmx5IiBuZy1zaG93PSIhaXNTbGF2ZSI+DQotICAgICAgPGJ1dHRvbiBjbGFzcz0ib3B0aW9uYWwgZGlzYWJsZS1yZXBsaWNhdGlvbiB3YXJuIiBuZy1jbGljaz0iZXhlY3V0ZSgnZGlzYWJsZXJlcGxpY2F0aW9uJykiIG5nLXNob3c9Im1hc3Rlci5yZXBsaWNhdGlvbkVuYWJsZWQiPjxzcGFuPkRpc2FibGUgUmVwbGljYXRpb248L3NwYW4+PC9idXR0b24+DQotICAgICAgPGJ1dHRvbiBjbGFzcz0ib3B0aW9uYWwgZW5hYmxlLXJlcGxpY2F0aW9uIHdhcm4iIG5nLWNsaWNrPSJleGVjdXRlKCdlbmFibGVyZXBsaWNhdGlvbicpIiBuZy1zaG93PSIhbWFzdGVyLnJlcGxpY2F0aW9uRW5hYmxlZCI+PHNwYW4+RW5hYmxlIFJlcGxpY2F0aW9uPC9zcGFuPjwvYnV0dG9uPg0KLSAgICA8L2Rpdj4NCi0gICAgDQotICA8L2Rpdj4NCi0NCi08L2Rpdj4NCis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkaXYgaWQ9InJlcGxpY2F0aW9uIiBjbGFzcz0iY2xlYXJmaXgiIG5nLWNsYXNzPSJ7cmVwbGljYXRpbmc6c2V0dGluZ3MuaXNSZXBsaWNhdGluZ30iPgorCisgIDxkaXYgaWQ9ImZyYW1lIj4KKworICAgIDxkaXYgaWQ9ImVycm9yIiBuZy1zaG93PSJwcm9ncmVzcy5FUlJPUiI+e3sgcHJvZ3Jlc3MuRVJST1IgfX08L2Rpdj4KKworICAgIDxkaXYgY2xhc3M9InJlcGxpY2F0aW5nIGJsb2NrIiBuZy1zaG93PSJzZXR0aW5ncy5pc1JlcGxpY2F0aW5nIj4KKworICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MiPgorCisgICAgICAgIDxkaXYgaWQ9InN0YXJ0Ij48ZGl2IGNsYXNzPSJpbmZvIj4KKworICAgICAgICAgIDxzcGFuPnt7cHJvZ3Jlc3MucmVwbGljYXRpb25TdGFydFRpbWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgPC9kaXY+PC9kaXY+CisKKyAgICAgICAgPGRpdiBpZD0ic3BlZWQiPjxkaXYgY2xhc3M9ImluZm8iPgorCisgICAgICAgICAgPHNwYW4+NS4xIE1CPC9zcGFuPi9zCisgICAgICAgICAgICAgICAgCisgICAgICAgIDwvZGl2PjwvZGl2PgorCisgICAgICAgIDxkaXYgaWQ9ImJhciI+CisKKyAgICAgICAgICA8ZGl2IGlkPSJiYXItaW5mbyI+PGRpdiBjbGFzcz0iaW5mbyI+CisKKyAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZXMiPjxzcGFuPnt7cHJvZ3Jlc3MubnVtRmlsZXNUb0Rvd25sb2FkfX08L3NwYW4+IEZpbGU8c3BhbiBuZy1zaG93PSJwcm9ncmVzcy5udW1GaWxlc1RvRG93bmxvYWQmZ3Q7MSI+czwvc3Bhbj48L2Rpdj4KKyAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2l6ZSI+PHNwYW4+e3twcm9ncmVzcy5ieXRlc1RvRG93bmxvYWR9fTwvc3Bhbj48L2Rpdj4KKworICAgICAgICAgIDwvZGl2PjwvZGl2PgorCisgICAgICAgICAgPGRpdiBpZD0iZXRhIj48ZGl2IGNsYXNzPSJpbmZvIj4KKworICAgICAgICAgICAgRVRBOiA8c3Bhbj57e3Byb2dyZXNzLnRpbWVSZW1haW5pbmcgfCByZWFkYWJsZVNlY29uZHMgfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIDwvZGl2PjwvZGl2PgorCisgICAgICAgICAgPGRpdiBpZD0iZG9uZSIgc3R5bGU9IndpZHRoOiB7e3Byb2dyZXNzLnRvdGFsUGVyY2VudFdpZHRofX0iPgorCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJjZW50Ij4KKworICAgICAgICAgICAgICA8c3Bhbj57e3Byb2dyZXNzLnRvdGFsUGVyY2VudH19PC9zcGFuPiUKKworICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgIDxkaXYgaWQ9ImRvbmUtaW5mbyI+PGRpdiBjbGFzcz0iaW5mbyI+CisKKyAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZXMiPjxzcGFuPnt7cHJvZ3Jlc3MubnVtRmlsZXNEb3dubG9hZGVkfX08L3NwYW4+IEZpbGU8c3BhbiBuZy1zaG93PSJwcm9ncmVzcy5udW1GaWxlc0Rvd25sb2FkZWQmZ3Q7MSI+czwvc3Bhbj48L2Rpdj4KKyAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2l6ZSI+PHNwYW4+e3twcm9ncmVzcy5ieXRlc0Rvd25sb2FkZWR9fTwvc3Bhbj48L2Rpdj4KKworICAgICAgICAgICAgPC9kaXY+PC9kaXY+CisKKyAgICAgICAgICA8L2Rpdj4KKworICAgICAgICA8L2Rpdj4KKworICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgaWQ9ImN1cnJlbnQtZmlsZSIgY2xhc3M9ImNsZWFyZml4Ij4KKworICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+PHNwYW4gY2xhc3M9ImxvYWRlciI+Q3VycmVudCBGaWxlOjwvc3Bhbj48L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0iZmlsZSI+e3twcm9ncmVzcy5jdXJyZW50RmlsZX19PC9kaXY+CisgICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzIj4KKyAgICAgICAgICA8c3BhbiBjbGFzcz0iZG9uZSI+e3twcm9ncmVzcy5jdXJyZW50RmlsZVNpemVEb3dubG9hZGVkfX08L3NwYW4+IC8gPHNwYW4gY2xhc3M9InRvdGFsIj57e3Byb2dyZXNzLmN1cnJlbnRGaWxlU2l6ZX19PC9zcGFuPiBbPHNwYW4gY2xhc3M9InBlcmNlbnQiPnt7cHJvZ3Jlc3MuY3VycmVudEZpbGVTaXplUGVyY2VudH19PC9zcGFuPiVdCisgICAgICAgIDwvZGl2PgorCisgICAgICA8L2Rpdj4KKyAgICAgICAgCisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGlkPSJpdGVyYXRpb25zIiBjbGFzcz0ic2xhdmVPbmx5IGJsb2NrIGNsZWFyZml4IiBuZy1zaG93PSJpc1NsYXZlIj4KKworICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPjxzcGFuIGNsYXNzPSIiPkl0ZXJhdGlvbnM6PC9zcGFuPjwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0iaXRlcmF0aW9ucyIgbmctc2hvdz0iaXRlcmF0aW9ucyAmJiBzaG93SXRlcmF0aW9ucyI+CisgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaSBjbGFzcz0ie3tpdGVyYXRpb24uc3RhdHVzfX0iIG5nLWNsYXNzPSJ7bGF0ZXN0Oml0ZXJhdGlvbi5sYXRlc3R9IiBuZy1yZXBlYXQ9Iml0ZXJhdGlvbiBpbiBpdGVyYXRpb25zIHxsaW1pdFRvOml0ZXJhdGlvbkNvdW50Ij57e2l0ZXJhdGlvbi5kYXRlfX08L2xpPgorICAgICAgICA8L3VsPgorICAgICAgICA8c3BhbiBuZy1zaG93PSJpdGVyYXRpb25zLmxlbmd0aCZndDsxIj4KKyAgICAgICAgICA8YSBuZy1zaG93PSJpdGVyYXRpb25Db3VudD09MSIgbmctY2xpY2s9InNob3dJdGVyYXRpb25zKCkiPjxzcGFuIGNsYXNzPSJleHBhbmQiPlNob3cgYWxsIEl0ZXJhdGlvbnM8L3NwYW4+PC9hPgorICAgICAgICAgIDxhIG5nLXNob3c9Iml0ZXJhdGlvbkNvdW50Jmd0OzEiIG5nLWNsaWNrPSJoaWRlSXRlcmF0aW9ucygpIj48c3BhbiBjbGFzcz0iY29sbGFwc2UiPkhpZGUgcGFzdCBJdGVyYXRpb25zPC9zcGFuPjwvYT4KKyAgICAgICAgPC9zcGFuPgorCisgICAgICA8L2Rpdj4KKyAgICAgICAgCisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGlkPSJkZXRhaWxzIiBjbGFzcz0iYmxvY2sgY2xlYXJmaXgiPgorCisgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorCisgICAgICAgIDx0aGVhZD4KKworICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgPHRkPjxzcGFuPkluZGV4PC9zcGFuPjwvdGQ+CisgICAgICAgICAgICA8dGg+VmVyc2lvbjwvdGg+CisgICAgICAgICAgICA8dGg+PGFiYnIgdGl0bGU9IkdlbmVyYXRpb24iPkdlbjwvYWJicj48L3RoPgorICAgICAgICAgICAgPHRoPlNpemU8L3RoPgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIAorICAgICAgICA8L3RoZWFkPgorICAgICAgICA8dGJvZHk+CisKKyAgICAgICAgICA8dHIgY2xhc3M9Im1hc3RlclNlYXJjaCI+CisKKyAgICAgICAgICAgIDx0aD5NYXN0ZXIgKFNlYXJjaGluZyk8L3RoPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJ2ZXJzaW9uIiBuZy1jbGFzcz0ie2RpZmY6dmVyc2lvbnMuY2hhbmdlZFZlcnNpb259Ij4KKyAgICAgICAgICAgICAgICA8ZGl2Pnt7dmVyc2lvbnMubWFzdGVyU2VhcmNoLnZlcnNpb259fTwvZGl2PgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0iZ2VuZXJhdGlvbiIgbmctY2xhc3M9IntkaWZmOnZlcnNpb25zLmNoYW5nZWRHZW5lcmF0aW9ufSI+CisgICAgICAgICAgICAgICAgPGRpdj57e3ZlcnNpb25zLm1hc3RlclNlYXJjaC5nZW5lcmF0aW9ufX08L2Rpdj4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9InNpemUiPgorICAgICAgICAgICAgICAgIDxkaXY+e3t2ZXJzaW9ucy5tYXN0ZXJTZWFyY2guc2l6ZX19PC9kaXY+CisgICAgICAgICAgICA8L3RkPgorCisgICAgICAgICAgPC90cj4KKworICAgICAgICAgIDx0ciBjbGFzcz0ibWFzdGVyIj4KKworICAgICAgICAgICAgPHRoPk1hc3RlciAoUmVwbGljYWJsZSk8L3RoPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJ2ZXJzaW9uIiBuZy1jbGFzcz0ie2RpZmY6dmVyc2lvbnMuY2hhbmdlZFZlcnNpb259Ij4KKyAgICAgICAgICAgICAgICA8ZGl2Pnt7dmVyc2lvbnMubWFzdGVyLnZlcnNpb259fTwvZGl2PgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0iZ2VuZXJhdGlvbiIgbmctY2xhc3M9IntkaWZmOnZlcnNpb25zLmNoYW5nZWRHZW5lcmF0aW9ufSI+CisgICAgICAgICAgICAgICAgPGRpdj57e3ZlcnNpb25zLm1hc3Rlci5nZW5lcmF0aW9ufX08L2Rpdj4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9InNpemUiPgorICAgICAgICAgICAgICAgIDxkaXY+e3t2ZXJzaW9ucy5tYXN0ZXIuc2l6ZX19PC9kaXY+CisgICAgICAgICAgICA8L3RkPgorCisgICAgICAgICAgPC90cj4KKworICAgICAgICAgIDx0ciBjbGFzcz0ic2xhdmUgc2xhdmVPbmx5IiBuZy1zaG93PSJpc1NsYXZlIj4KKworICAgICAgICAgICAgPHRoPlNsYXZlIChTZWFyY2hpbmcpPC90aD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0idmVyc2lvbiIgbmctY2xhc3M9IntkaWZmOnZlcnNpb25zLmNoYW5nZWRWZXJzaW9ufSI+CisgICAgICAgICAgICAgICAgPGRpdj57e3ZlcnNpb25zLnNsYXZlLnZlcnNpb259fTwvZGl2PgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0iZ2VuZXJhdGlvbiIgbmctY2xhc3M9IntkaWZmOnZlcnNpb25zLmNoYW5nZWRHZW5lcmF0aW9ufSI+CisgICAgICAgICAgICAgICAgPGRpdj57e3ZlcnNpb25zLnNsYXZlLmdlbmVyYXRpb259fTwvZGl2PgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ic2l6ZSI+CisgICAgICAgICAgICAgICAgPGRpdj57e3ZlcnNpb25zLnNsYXZlLnNpemV9fTwvZGl2PgorICAgICAgICAgICAgPC90ZD4KKworICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgPC90Ym9keT4KKworICAgICAgPC90YWJsZT4KKworICAgIDwvZGl2PgorCisgICAgPGRpdiBpZD0ic2V0dGluZ3MiIGNsYXNzPSJzZXR0aW5ncyBibG9jayBjbGVhcmZpeCBzbGF2ZU9ubHkiIG5nLXNob3c9ImlzU2xhdmUiPgorCisgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+PHNwYW4+U2V0dGluZ3M6PC9zcGFuPjwvZGl2PgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9Im1hc3RlclVybCIgbmctc2hvdz0ic2V0dGluZ3MubWFzdGVyVXJsIj4KKyAgICAgICAgICAgIDxkbCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICAgIDxkdD5tYXN0ZXIgdXJsOjwvZHQ+CisgICAgICAgICAgICAgICAgPGRkPnt7c2V0dGluZ3MubWFzdGVyVXJsfX08L2RkPgorICAgICAgICAgICAgPC9kbD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJpc1BvbGxpbmdEaXNhYmxlZCI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgPGR0PnBvbGxpbmcgZW5hYmxlOjwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9ImljbyIgbmctY2xhc3M9InsnaWNvLTAnOnNldHRpbmdzLmlzUG9sbGluZ0Rpc2FibGVkLCAnaWNvLTEnOiFzZXR0aW5ncy5pc1BvbGxpbmdEaXNhYmxlZH0iPgorICAgICAgICAgICAgICAgIDxzcGFuIG5nLXNob3c9InNldHRpbmdzLnBvbGxJbnRlcnZhbCI+KGludGVydmFsOiB7e3NldHRpbmdzLnBvbGxJbnRlcnZhbH19KTwvc3Bhbj4mbmJzcDsKKyAgICAgICAgICAgIDwvZGQ+CisgICAgICAgIDwvZGw+PC9saT4KKyAgICAgIDwvdWw+CisgICAgICAgIAorICAgIDwvZGl2PgorCisgICAgPGRpdiBpZD0ibWFzdGVyLXNldHRpbmdzIiBjbGFzcz0ic2V0dGluZ3MgYmxvY2sgY2xlYXJmaXgiPgorCisgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+PHNwYW4+U2V0dGluZ3MgKE1hc3Rlcik6PC9zcGFuPjwvZGl2PgorICAgICAgPHVsPgorICAgICAgICA8bGkgY2xhc3M9InJlcGxpY2F0aW9uRW5hYmxlZCI+PGRsIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgPGR0PnJlcGxpY2F0aW9uIGVuYWJsZTo8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJpY28iIG5nLWNsYXNzPSJ7J2ljby0wJzohbWFzdGVyLnJlcGxpY2F0aW9uRW5hYmxlZCwgJ2ljby0xJzptYXN0ZXIucmVwbGljYXRpb25FbmFibGVkfSI+Jm5ic3A7PC9kZD4KKyAgICAgICAgPC9kbD48L2xpPgorICAgICAgICA8bGkgY2xhc3M9InJlcGxpY2F0ZUFmdGVyIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICA8ZHQ+cmVwbGljYXRlQWZ0ZXI6PC9kdD4KKyAgICAgICAgICAgIDxkZD57e21hc3Rlci5yZXBsaWNhdGVBZnRlcn19PC9kZD4KKyAgICAgICAgPC9kbD48L2xpPgorICAgICAgICA8bGkgY2xhc3M9ImNvbmZGaWxlcyIgbmctc2hvdz0ibWFzdGVyLmZpbGVzIj48ZGwgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICA8ZHQ+Y29uZkZpbGVzOjwvZHQ+CisgICAgICAgICAgICA8ZGQ+PHNwYW4gbmctcmVwZWF0PSJmaWxlIGluIG1hc3Rlci5maWxlcyI+PGF0dHIgdGl0bGU9Int7ZmlsZS50aXRsZX19Ij57e2ZpbGUubmFtZX19PC9hdHRyPnt7ICRsYXN0ID8gJycgOicsICd9fTwvc3Bhbj48L2RkPgorICAgICAgICA8L2RsPjwvbGk+CisgICAgICA8L3VsPgorICAgICAgICAKKyAgICA8L2Rpdj4KKyAgICAKKyAgPC9kaXY+CisKKyAgPGRpdiBpZD0ibmF2aWdhdGlvbiI+CisKKyAgICA8ZGl2IGNsYXNzPSJ0aW1lciIgbmctc2hvdz0iaXNTbGF2ZSAmJiAhc2V0dGluZ3MuaXNQb2xsaW5nRGlzYWJsZWQgJiYhc2V0dGluZ3MuaXNSZXBsaWNhdGluZyI+CisKKyAgICAgIDxwPk5leHQgUnVuOiA8c3BhbiBjbGFzcz0iYXBwcm94IiBuZy1zaG93PSJzZXR0aW5ncy5pc0FwcHJveCI+fjwvc3Bhbj48c3BhbiBjbGFzcz0idGljayI+e3tzZXR0aW5ncy50aWNrIHwgcmVhZGFibGVTZWNvbmRzfX08L3NwYW4+PC9wPgorICAgICAgPHNtYWxsIG5nLXNob3c9InNldHRpbmdzLm5leHRFeGVjdXRpb25BdCI+e3tzZXR0aW5ncy5uZXh0RXhlY3V0aW9uQXR9fTwvc21hbGw+CisgICAgPC9kaXY+CisKKyAgICA8YnV0dG9uIGNsYXNzPSJyZWZyZXNoLXN0YXR1cyIgbmctY2xpY2s9InJlZnJlc2goKSI+PHNwYW4+UmVmcmVzaCBTdGF0dXM8L3NwYW4+PC9idXR0b24+CisKKyAgICA8ZGl2IGNsYXNzPSJzbGF2ZU9ubHkiIG5nLXNob3c9ImlzU2xhdmUiPgorICAgICAgPGJ1dHRvbiBjbGFzcz0ib3B0aW9uYWwgcmVwbGljYXRlLW5vdyBwcmltYXJ5IiBuZy1jbGljaz0iZXhlY3V0ZSgnZmV0Y2hpbmRleCcpIiBuZy1zaG93PSIhc2V0dGluZ3MuaXNSZXBsaWNhdGluZyI+PHNwYW4+UmVwbGljYXRlIG5vdzwvc3Bhbj48L2J1dHRvbj4KKyAgICAgIDxidXR0b24gY2xhc3M9Im9wdGlvbmFsIGFib3J0LXJlcGxpY2F0aW9uIHdhcm4iIG5nLWNsaWNrPSJleGVjdXRlKCdhYm9ydGZldGNoJykiIG5nLXNob3c9InNldHRpbmdzLmlzUmVwbGljYXRpbmciPjxzcGFuPkFib3J0IFJlcGxpY2F0aW9uPC9zcGFuPjwvYnV0dG9uPgorCisgICAgICA8YnV0dG9uIGNsYXNzPSJvcHRpb25hbCBkaXNhYmxlLXBvbGxpbmciIG5nLWNsaWNrPSJleGVjdXRlKCdkaXNhYmxlcG9sbCcpIiBuZy1zaG93PSIhc2V0dGluZ3MuaXNQb2xsaW5nRGlzYWJsZWQiPjxzcGFuPkRpc2FibGUgUG9sbGluZzwvc3Bhbj48L2J1dHRvbj4KKyAgICAgIDxidXR0b24gY2xhc3M9Im9wdGlvbmFsIGVuYWJsZS1wb2xsaW5nIiBuZy1jbGljaz0iZXhlY3V0ZSgnZW5hYmxlcG9sbCcpIiBuZy1zaG93PSJzZXR0aW5ncy5pc1BvbGxpbmdEaXNhYmxlZCI+PHNwYW4+RW5hYmxlIFBvbGxpbmc8L3NwYW4+PC9idXR0b24+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGNsYXNzPSJtYXN0ZXJPbmx5IiBuZy1zaG93PSIhaXNTbGF2ZSI+CisgICAgICA8YnV0dG9uIGNsYXNzPSJvcHRpb25hbCBkaXNhYmxlLXJlcGxpY2F0aW9uIHdhcm4iIG5nLWNsaWNrPSJleGVjdXRlKCdkaXNhYmxlcmVwbGljYXRpb24nKSIgbmctc2hvdz0ibWFzdGVyLnJlcGxpY2F0aW9uRW5hYmxlZCI+PHNwYW4+RGlzYWJsZSBSZXBsaWNhdGlvbjwvc3Bhbj48L2J1dHRvbj4KKyAgICAgIDxidXR0b24gY2xhc3M9Im9wdGlvbmFsIGVuYWJsZS1yZXBsaWNhdGlvbiB3YXJuIiBuZy1jbGljaz0iZXhlY3V0ZSgnZW5hYmxlcmVwbGljYXRpb24nKSIgbmctc2hvdz0iIW1hc3Rlci5yZXBsaWNhdGlvbkVuYWJsZWQiPjxzcGFuPkVuYWJsZSBSZXBsaWNhdGlvbjwvc3Bhbj48L2J1dHRvbj4KKyAgICA8L2Rpdj4KKyAgICAKKyAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL3NjaGVtYS5odG1sIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL3NjaGVtYS5odG1sCmluZGV4IGQzNjIyZDUuLjFiNTI1ZTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9zY2hlbWEuaHRtbAorKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvc2NoZW1hLmh0bWwKQEAgLTEsNDQ4ICsxLDQ0OCBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGRpdiBpZD0ic2NoZW1hIiBjbGFzcz0ibG9hZGVkIj4NCi0NCi0gIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4NCi0NCi0gICAgPGRpdiBpZD0iZnJhbWUiPg0KLSAgICA8ZGl2IGlkPSJhY3Rpb25zIiBjbGFzcz0iYWN0aW9ucyBjbGVhcmZpeCIgbmctc2hvdz0iaXNTY2hlbWFVcGRhdGFibGUiPg0KLSAgICAgIDxidXR0b24gaWQ9ImFkZEZpZWxkIiBjbGFzcz0iYWN0aW9uIiBuZy1jbGljaz0idG9nZ2xlQWRkRmllbGQoKSI+PHNwYW4+QWRkIEZpZWxkPC9zcGFuPjwvYnV0dG9uPg0KLSAgICAgIDxidXR0b24gaWQ9ImFkZER5bmFtaWNGaWVsZCIgY2xhc3M9ImFjdGlvbiIgbmctY2xpY2s9InRvZ2dsZUFkZER5bmFtaWNGaWVsZCgpIj48c3Bhbj5BZGQgRHluYW1pYyBGaWVsZDwvc3Bhbj48L2J1dHRvbj4NCi0gICAgICA8YnV0dG9uIGlkPSJhZGRDb3B5RmllbGQiIGNsYXNzPSJhY3Rpb24iIG5nLWNsaWNrPSJ0b2dnbGVBZGRDb3B5RmllbGQoKSI+PHNwYW4+QWRkIENvcHkgRmllbGQ8L3NwYW4+PC9idXR0b24+DQotDQotICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uIGFkZCIgZGF0YS1yZWw9ImFkZCIgbmctc2hvdz0ic2hvd0FkZEZpZWxkIiBlc2NhcGUtcHJlc3NlZD0iaGlkZUFsbCgpIj4NCi0NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48bGFiZWwgZm9yPSJhZGRfbmFtZSI+bmFtZTo8L2xhYmVsPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImFkZF9uYW1lIiBuZy1tb2RlbD0ibmV3RmllbGQubmFtZSIgZm9jdXMtd2hlbj0ic2hvd0FkZEZpZWxkIiBwbGFjZWhvbGRlcj0iZW50ZXIgYSBmaWVsZCBuYW1lIj48L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWRkX3R5cGUiPmZpZWxkIHR5cGU6PC9sYWJlbD4NCi0gICAgICAgICAgPHNlbGVjdCBjaG9zZW4gdHlwZT0idGV4dCIgaWQ9ImFkZF90eXBlIiBuZy1tb2RlbD0ibmV3RmllbGQudHlwZSIgbmctb3B0aW9ucz0idHlwZSBmb3IgdHlwZSBpbiB0eXBlcyI+PC9zZWxlY3Q+DQotICAgICAgICAgIDwvcD4NCi0NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IiBuZy1zaG93PSJhZGRpbmc9PSdmaWVsZCciPjxsYWJlbCBmb3I9ImFkZF9kZWZhdWx0Ij5kZWZhdWx0OjwvbGFiZWw+DQotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYWRkX2RlZmF1bHQiIG5nLW1vZGVsPSJuZXdGaWVsZC5kZWZhdWx0IiBwbGFjZWhvbGRlcj0iZW50ZXIgYSBkZWZhdWx0IHZhbHVlIGlmIG5lZWRlZCI+PC9wPg0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX3N0b3JlZCI+DQotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJuZXdGaWVsZC5zdG9yZWQiIGlkPSJhZGRfc3RvcmVkIiB0aXRsZT0iRnVsbCBmaWVsZCBzaG91bGQgYmUgc3RvcmVkIGluIGluZGV4LiIgbmctdHJ1ZS12YWx1ZT0iJ3RydWUnIiBuZy1mYWxzZS12YWx1ZT0iJ2ZhbHNlJyI+DQotICAgICAgICAgICAgc3RvcmVkDQotICAgICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgICAgPC9wPg0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX2luZGV4ZWQiPg0KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ibmV3RmllbGQuaW5kZXhlZCIgaWQ9ImFkZF9pbmRleGVkIiB0aXRsZT0iRmllbGQgc2hvdWxkIGJlIGluZGV4ZWQuIiBuZy10cnVlLXZhbHVlPSIndHJ1ZSciIG5nLWZhbHNlLXZhbHVlPSInZmFsc2UnIj4NCi0gICAgICAgICAgICBpbmRleGVkDQotICAgICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgICAgPC9wPg0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX2RvY1ZhbHVlcyI+DQotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJuZXdGaWVsZC5kb2NWYWx1ZXMiIGlkPSJhZGRfZG9jVmFsdWVzIiB0aXRsZT0iRG9jVmFsdWVzIHNob3VsZCBiZSBzdG9yZWQgZm9yIHRoZSBmaWVsZC4iIG5nLXRydWUtdmFsdWU9Iid0cnVlJyIgbmctZmFsc2UtdmFsdWU9IidmYWxzZSciPg0KLSAgICAgICAgICAgIGRvY1ZhbHVlcw0KLSAgICAgICAgICAgIDwvbGFiZWw+DQotICAgICAgICAgIDwvcD4NCi0NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNoZWNrYm94IiBmb3I9ImFkZF9tdWx0aVZhbHVlZCI+DQotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJuZXdGaWVsZC5tdWx0aVZhbHVlZCIgaWQ9ImFkZF9tdWx0aVZhbHVlZCIgdGl0bGU9Ik11bHRpcGxlIHZhbHVlcyBhcmUgYWxsb3dlZCBmb3IgdGhpcyBmaWVsZC4iIG5nLXRydWUtdmFsdWU9Iid0cnVlJyIgbmctZmFsc2UtdmFsdWU9IidmYWxzZSciPg0KLSAgICAgICAgICAgIG11bHRpVmFsdWVkDQotICAgICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgICAgPC9wPg0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiIG5nLXNob3c9ImFkZGluZz09J2ZpZWxkJyI+DQotICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGVja2JveCIgZm9yPSJhZGRfcmVxdWlyZWQiPg0KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ibmV3RmllbGQucmVxdWlyZWQiIGlkPSJhZGRfcmVxdWlyZWQiIHRpdGxlPSJGaWVsZCBtdXN0IGJlIHByb3ZpZGVkIGZvciBhbGwgZG9jdW1lbnRzLiIgbmctdHJ1ZS12YWx1ZT0iJ3RydWUnIiBuZy1mYWxzZS12YWx1ZT0iJ2ZhbHNlJyI+DQotICAgICAgICAgICAgcmVxdWlyZWQNCi0gICAgICAgICAgICA8L2xhYmVsPg0KLSAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgPGEgbmctY2xpY2s9InNob3dPbWl0PSFzaG93T21pdCI+DQotICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYWRkX3Nob3doaWRlIiBuZy1oaWRlPSJzaG93T21pdCI+U2hvdyBvbWl0IG9wdGlvbnM8L3NwYW4+DQotICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYWRkX3Nob3doaWRlIG9wZW4iIG5nLXNob3c9InNob3dPbWl0Ij5IaWRlIG9taXQgb3B0aW9uczwvc3Bhbj4NCi0gICAgICAgICAgICA8L2E+DQotICAgICAgICAgIDwvcD4NCi0NCi0gICAgICAgICAgPGRpdiBuZy1zaG93PSJzaG93T21pdCI+DQotDQotICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX29taXROb3JtcyI+DQotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9Im5ld0ZpZWxkLm9taXROb3JtcyIgaWQ9ImFkZF9vbWl0Tm9ybXMiIHRpdGxlPSJGdWxsIGZpZWxkIHNob3VsZCBiZSBvbWl0Tm9ybXMgaW4gaW5kZXguIiBuZy10cnVlLXZhbHVlPSIndHJ1ZSciIG5nLWZhbHNlLXZhbHVlPSInZmFsc2UnIj4NCi0gICAgICAgICAgICAgIG9taXROb3Jtcw0KLSAgICAgICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX29taXRUZXJtRnJlcUFuZFBvc2l0aW9ucyI+DQotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9Im5ld0ZpZWxkLm9taXRUZXJtRnJlcUFuZFBvc2l0aW9ucyIgaWQ9ImFkZF9vbWl0VGVybUZyZXFBbmRQb3NpdGlvbnMiIHRpdGxlPSJGdWxsIGZpZWxkIHNob3VsZCBiZSBvbWl0VGVybUZyZXFBbmRQb3NpdGlvbnMgaW4gaW5kZXguIiBuZy10cnVlLXZhbHVlPSIndHJ1ZSciIG5nLWZhbHNlLXZhbHVlPSInZmFsc2UnIj4NCi0gICAgICAgICAgICAgIG9taXRUZXJtRnJlcUFuZFBvc2l0aW9ucw0KLSAgICAgICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX29taXRQb3NpdGlvbnMiPg0KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJuZXdGaWVsZC5vbWl0UG9zaXRpb25zIiBpZD0iYWRkX29taXRQb3NpdGlvbnMiIHRpdGxlPSJGdWxsIGZpZWxkIHNob3VsZCBiZSBvbWl0UG9zaXRpb25zIGluIGluZGV4LiIgbmctdHJ1ZS12YWx1ZT0iJ3RydWUnIiBuZy1mYWxzZS12YWx1ZT0iJ2ZhbHNlJyI+DQotICAgICAgICAgICAgICBvbWl0UG9zaXRpb25zDQotICAgICAgICAgICAgICA8L2xhYmVsPg0KLSAgICAgICAgICAgIDwvcD4NCi0gICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgPGEgbmctY2xpY2s9InNob3dUZXJtVmVjdG9ycz0hc2hvd1Rlcm1WZWN0b3JzIj4NCi0gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJhZGRfc2hvd2hpZGUiIG5nLWhpZGU9InNob3dUZXJtVmVjdG9ycyI+U2hvdyB0ZXJtIHZlY3RvciBvcHRpb25zPC9zcGFuPg0KLSAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFkZF9zaG93aGlkZSBvcGVuIiBuZy1zaG93PSJzaG93VGVybVZlY3RvcnMiPkhpZGUgdGVybSB2ZWN0b3Igb3B0aW9uczwvc3Bhbj4NCi0gICAgICAgICAgICA8L2E+DQotICAgICAgICAgIDwvcD4NCi0gICAgICAgICAgPGRpdiBuZy1zaG93PSJzaG93VGVybVZlY3RvcnMiPg0KLQ0KLSAgICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGVja2JveCIgZm9yPSJhZGRfdGVybVZlY3RvcnMiPg0KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJuZXdGaWVsZC50ZXJtVmVjdG9ycyIgaWQ9ImFkZF90ZXJtVmVjdG9ycyIgdGl0bGU9IkZ1bGwgZmllbGQgc2hvdWxkIGJlIHRlcm1WZWN0b3JzIGluIGluZGV4LiIgbmctdHJ1ZS12YWx1ZT0iJ3RydWUnIiBuZy1mYWxzZS12YWx1ZT0iJ2ZhbHNlJyI+DQotICAgICAgICAgICAgICB0ZXJtVmVjdG9ycw0KLSAgICAgICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX3Rlcm1Qb3NpdGlvbnMiPg0KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJuZXdGaWVsZC50ZXJtUG9zaXRpb25zIiBpZD0iYWRkX3Rlcm1Qb3NpdGlvbnMiIHRpdGxlPSJGdWxsIGZpZWxkIHNob3VsZCBiZSB0ZXJtUG9zaXRpb25zIGluIGluZGV4LiIgbmctdHJ1ZS12YWx1ZT0iJ3RydWUnIiBuZy1mYWxzZS12YWx1ZT0iJ2ZhbHNlJyI+DQotICAgICAgICAgICAgICB0ZXJtUG9zaXRpb25zDQotICAgICAgICAgICAgICA8L2xhYmVsPg0KLSAgICAgICAgICAgIDwvcD4NCi0NCi0gICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGVja2JveCIgZm9yPSJhZGRfdGVybU9mZnNldHMiPg0KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJuZXdGaWVsZC50ZXJtT2Zmc2V0cyIgaWQ9ImFkZF90ZXJtT2Zmc2V0cyIgdGl0bGU9IkZ1bGwgZmllbGQgc2hvdWxkIGJlIHRlcm1PZmZzZXRzIGluIGluZGV4LiIgbmctdHJ1ZS12YWx1ZT0iJ3RydWUnIiBuZy1mYWxzZS12YWx1ZT0iJ2ZhbHNlJyI+DQotICAgICAgICAgICAgICB0ZXJtT2Zmc2V0cw0KLSAgICAgICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX3Rlcm1QYXlsb2FkcyI+DQotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9Im5ld0ZpZWxkLnRlcm1QYXlsb2FkcyIgaWQ9ImFkZF90ZXJtUGF5bG9hZHMiIHRpdGxlPSJGdWxsIGZpZWxkIHNob3VsZCBiZSB0ZXJtUGF5bG9hZHMgaW4gaW5kZXguIiBuZy10cnVlLXZhbHVlPSIndHJ1ZSciIG5nLWZhbHNlLXZhbHVlPSInZmFsc2UnIj4NCi0gICAgICAgICAgICAgIHRlcm1QYXlsb2Fkcw0KLSAgICAgICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgICAgICAgIDxhIG5nLWNsaWNrPSJzaG93U29ydD0hc2hvd1NvcnQiPg0KLSAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFkZF9zaG93aGlkZSIgbmctaGlkZT0ic2hvd1NvcnQiPlNob3cgc29ydCBvcHRpb25zPC9zcGFuPg0KLSAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFkZF9zaG93aGlkZSBvcGVuIiBuZy1zaG93PSJzaG93U29ydCI+U2hvdyBzb3J0IG9wdGlvbnM8L3NwYW4+DQotICAgICAgICAgICAgPC9hPg0KLSAgICAgICAgICA8L3A+DQotICAgICAgICAgIDxkaXYgbmctc2hvdz0ic2hvd1NvcnQiPg0KLSAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+DQotICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNoZWNrYm94IiBmb3I9ImFkZF9zb3J0TWlzc2luZ0ZpcnN0Ij4NCi0gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ibmV3RmllbGQuc29ydE1pc3NpbmdGaXJzdCIgaWQ9ImFkZF9zb3J0TWlzc2luZ0ZpcnN0IiB0aXRsZT0iRnVsbCBmaWVsZCBzaG91bGQgYmUgc29ydE1pc3NpbmdGaXJzdCBpbiBpbmRleC4iIG5nLXRydWUtdmFsdWU9Iid0cnVlJyIgbmctZmFsc2UtdmFsdWU9IidmYWxzZSciPg0KLSAgICAgICAgICAgICAgc29ydE1pc3NpbmdGaXJzdA0KLSAgICAgICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX3NvcnRNaXNzaW5nTGFzdCI+DQotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9Im5ld0ZpZWxkLnNvcnRNaXNzaW5nTGFzdCIgaWQ9ImFkZF9zb3J0TWlzc2luZ0xhc3QiIHRpdGxlPSJGdWxsIGZpZWxkIHNob3VsZCBiZSBzb3J0TWlzc2luZ0xhc3QgaW4gaW5kZXguIiBuZy10cnVlLXZhbHVlPSIndHJ1ZSciIG5nLWZhbHNlLXZhbHVlPSInZmFsc2UnIj4NCi0gICAgICAgICAgICAgIHNvcnRNaXNzaW5nTGFzdA0KLSAgICAgICAgICAgICAgPC9sYWJlbD4NCi0gICAgICAgICAgICA8L3A+DQotDQotICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICA8ZGl2IG5nLXJlcGVhdD0iZXJyb3IgaW4gYWRkRXJyb3JzIiBuZy1zaG93PSJhZGRFcnJvcnMiIGNsYXNzPSJjbGVhcmZpeCBub3RlIGVycm9yIj4NCi0gICAgICAgICAgICA8c3Bhbj57e2Vycm9yfX08L3NwYW4+PC9kaXY+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBidXR0b25zIj4NCi0gICAgICAgICAgICA8YnV0dG9uIG5nLXNob3c9ImFkZGluZz09J2ZpZWxkJyIgdHlwZT0ic3VibWl0IiBjbGFzcz0ic3VibWl0IiBuZy1jbGFzcz0ie3N1Y2Nlc3M6IGFkZGVkfSIgbmctY2xpY2s9ImFkZEZpZWxkKCkiPjxzcGFuPkFkZCBGaWVsZDwvc3Bhbj48L2J1dHRvbj4NCi0gICAgICAgICAgICA8YnV0dG9uIG5nLXNob3c9ImFkZGluZz09J2R5bmFtaWNGaWVsZCciIHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgbmctY2xhc3M9IntzdWNjZXNzOiBhZGRlZH0iIG5nLWNsaWNrPSJhZGREeW5hbWljRmllbGQoKSI+PHNwYW4+QWRkIER5bmFtaWMgRmllbGQ8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJyZXNldCIgY2xhc3M9InJlc2V0IiBuZy1jbGljaz0iaGlkZUFsbCgpIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgIDwvcD4NCi0NCi0NCi0NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24gYWRkIiBkYXRhLXJlbD0iYWRkIiBuZy1zaG93PSJzaG93QWRkQ29weUZpZWxkIiBlc2NhcGUtcHJlc3NlZD0iaGlkZUFsbCgpIj4NCi0NCi0gICAgICAgIDxmb3JtPg0KLQ0KLSAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9zb3VyY2UiPnNvdXJjZTo8L2xhYmVsPg0KLSAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImFkZF9zb3VyY2UiIG5nLW1vZGVsPSJjb3B5RmllbGQuc291cmNlIiBmb2N1cy13aGVuPSJzaG93QWRkQ29weUZpZWxkIiBwbGFjZWhvbGRlcj0ic3BlY2lmeSB5b3VyIHNvdXJjZSBmaWVsZCBvciBwYXR0ZXJuIj48L3A+DQotDQotICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWRkX2Rlc3QiPmRlc3RpbmF0aW9uOjwvbGFiZWw+DQotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYWRkX2Rlc3QiIG5nLW1vZGVsPSJjb3B5RmllbGQuZGVzdCIgcGxhY2Vob2xkZXI9InNwZWNpZnkgeW91ciBkZXN0aW5hdGlvbiBmaWVsZCBvciBwYXR0ZXJuIj48L3A+DQotDQotICAgICAgICAgIDxkaXYgbmctcmVwZWF0PSJlcnJvciBpbiBhZGRDb3B5RmllbGRFcnJvcnMiIG5nLXNob3c9ImFkZENvcHlGaWVsZEVycm9ycyIgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiPg0KLSAgICAgICAgICAgIDxzcGFuPnt7ZXJyb3J9fTwvc3Bhbj48L2Rpdj4NCi0NCi0gICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IGJ1dHRvbnMiPg0KLSAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0ic3VibWl0IiBuZy1jbGFzcz0ie3N1Y2Nlc3M6IGFkZGVkfSIgbmctY2xpY2s9ImFkZENvcHlGaWVsZCgpIj48c3Bhbj5BZGQgQ29weUZpZWxkPC9zcGFuPjwvYnV0dG9uPg0KLSAgICAgICAgICAgIDxidXR0b24gdHlwZT0icmVzZXQiIGNsYXNzPSJyZXNldCIgbmctY2xpY2s9ImhpZGVBbGwoKSI+PHNwYW4+Q2FuY2VsPC9zcGFuPjwvYnV0dG9uPg0KLSAgICAgICAgICA8L3A+DQotDQotICAgICAgICA8L2Zvcm0+DQotDQotICAgICAgPC9kaXY+DQotICAgIDwvZGl2Pg0KLQ0KLSAgICA8ZGl2IGlkPSJkYXRhIj4NCi0NCi0gICAgICA8ZGl2IGlkPSJmaWVsZCI+DQotDQotICAgICAgICA8ZGl2IGNsYXNzPSJmaWVsZC1vcHRpb25zIiBuZy1zaG93PSJzaG93aW5nIj4NCi0NCi0gICAgICAgICAgPGRpdiBjbGFzcz0iYmxvY2sgaGVhZCI+DQotICAgICAgICAgICAgPGgyPg0KLSAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InR5cGUiPnt7c2VsZWN0ZWRUeXBlfX08L3NwYW4+Og0KLSAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPnt7bmFtZX19PC9zcGFuPg0KLSAgICAgICAgICAgIDwvaDI+DQotICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJwYXJ0aWFsIiBuZy1zaG93PSJwYXJ0aWFsU3RhdGUiPg0KLQ0KLSAgICAgICAgICAgIDxwPkJlY2F1c2UgeW91ciBJbmRleCBpcyBlbXB0eSwgd2UgZG8gbm90IGhhdmUgZW5vdWdoIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgRmllbGQ8L3A+DQotDQotICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICA8ZGwgY2xhc3M9Im9wdGlvbnMgY2xlYXJmaXgiPg0KLQ0KLSAgICAgICAgICAgIDxkdCBjbGFzcz0iZmllbGQtdHlwZSI+RmllbGQtVHlwZTo8L2R0Pg0KLSAgICAgICAgICAgIDxkZCBjbGFzcz0iZmllbGQtdHlwZSI+e3thbmFseXNpcy5kYXRhLmNsYXNzTmFtZX19PC9kZD4NCi0NCi0gICAgICAgICAgICA8ZHQgY2xhc3M9InNpbWlsYXJpdHkiIG5nLXNob3c9ImRpc3BsYXkuc2ltaWxhcml0eSI+U2ltaWxhcml0eTo8L2R0Pg0KLSAgICAgICAgICAgIDxkZCBjbGFzcz0ic2ltaWxhcml0eSIgbmctc2hvdz0iZGlzcGxheS5zaW1pbGFyaXR5Ij57eyBkaXNwbGF5LnNpbWlsYXJpdHkuZGV0YWlscyB9fSAoe3sgc2ltaWxhcml0eS5jbGFzc05hbWUgfX0pIDwvZGQ+DQotDQotICAgICAgICAgICAgPGR0IGNsYXNzPSJwb3NpdGlvbi1pbmNyZW1lbnQtZ2FwIiBuZy1zaG93PSJkaXNwbGF5LnBvc2l0aW9uSW5jcmVtZW50R2FwIj48YWJiciB0aXRsZT0iUG9zaXRpb24gSW5jcmVtZW50IEdhcCI+UEkgR2FwPC9hYmJyPjo8L2R0Pg0KLSAgICAgICAgICAgIDxkZCBjbGFzcz0icG9zaXRpb24taW5jcmVtZW50LWdhcCIgbmctc2hvdz0iZGlzcGxheS5wb3NpdGlvbkluY3JlbWVudEdhcCI+e3sgZGlzcGxheS5wb3NpdGlvbkluY3JlbWVudEdhcCB9fTwvZGQ+DQotDQotICAgICAgICAgICAgPGR0IGNsYXNzPSJkb2NzIiBuZy1zaG93PSJkaXNwbGF5LmRvY3MiPkRvY3M6PC9kdD4NCi0gICAgICAgICAgICA8ZGQgY2xhc3M9ImRvY3MiIG5nLXNob3c9ImRpc3BsYXkuZG9jcyI+PGEgaHJlZj0ie3tkaXNwbGF5LmRvY3NVcmx9fSI+e3tkaXNwbGF5LmRvY3MgfCBudW1iZXJ9fTwvYT48L2RkPg0KLQ0KLSAgICAgICAgICAgIDxkdCBjbGFzcz0iZGlzdGluY3QiIG5nLXNob3c9ImRpc3BsYXkuZGlzdGluY3QiPkRpc3RpbmN0OjwvZHQ+DQotICAgICAgICAgICAgPGRkIGNsYXNzPSJkaXN0aW5jdCIgbmctc2hvdz0iZGlzcGxheS5kaXN0aW5jdCI+e3tkaXNwbGF5LmRpc3RpbmN0fX08L2RkPg0KLQ0KLSAgICAgICAgICA8L2RsPg0KLQ0KLSAgICAgICAgICA8dGFibGUgY2xhc3M9ImZsYWdzIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCIgbmctc2hvdz0iZGlzcGxheS5jb2x1bW5zLmxlbmd0aCE9MCI+DQotDQotICAgICAgICAgICAgPHRoZWFkPg0KLQ0KLSAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICA8dGQ+RmxhZ3M6PC90ZD4NCi0gICAgICAgICAgICAgICAgPHRoIG5nLXJlcGVhdD0ia2V5IGluIGRpc3BsYXkuY29sdW1ucyI+e3trZXkubmFtZX19PC90aD4NCi0NCi0gICAgICAgICAgICAgIDwvdHI+DQotDQotICAgICAgICAgICAgPC90aGVhZD4NCi0NCi0gICAgICAgICAgICAgIDx0Ym9keT4NCi0gICAgICAgICAgICAgIDx0ciBuZy1yZXBlYXQ9InJvdyBpbiBkaXNwbGF5LnJvd3MgdHJhY2sgYnkgcm93Lm5hbWUiPg0KLSAgICAgICAgICAgICAgPHRoPnt7cm93Lm5hbWV9fTwvdGg+DQotICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9InRleHQiIG5nLXNob3c9InJvdy5jb21tZW50Ij57e3Jvdy5jb21tZW50fX08L3RkPg0KLSAgICAgICAgICAgICAgPHRkIG5nLXJlcGVhdD0iY2VsbCBpbiByb3cuY2VsbHMiDQotICAgICAgICAgICAgICAgICAgbmctY2xhc3M9InsnY2hlY2snOmNlbGwudmFsdWV9Ij4NCi0gICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJjZWxsLnZhbHVlIj7iiD88L3NwYW4+DQotICAgICAgICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iIWNlbGwudmFsdWUiPiZuYnNwOzwvc3Bhbj4NCi0gICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgPC90Ym9keT4NCi0NCi0gICAgICAgICAgPC90YWJsZT4NCi0NCi0gICAgICAgICAgPHVsIGNsYXNzPSJhbmFseXplciI+DQotICAgICAgICAgICAgPGxpIGNsYXNzPSJjbGVhcmZpeCB7e2FuYWx5emVyLmtleX19IiBuZy1jbGFzcz0ie29wZW46IGFuYWx5emVyLnNob3d9IiBuZy1yZXBlYXQ9ImFuYWx5emVyIGluIGFuYWx5c2lzLmFuYWx5emVycyI+DQotDQotICAgICAgICAgICAgICA8cD48YSBjbGFzcz0iYW5hbHlzaXMiIG5nLWhyZWY9IiMve3tjb3JlfX0vYW5hbHlzaXM/e3thbmFseXNpcy5xdWVyeX19Ij48c3Bhbj57e2FuYWx5emVyLm5hbWV9fSZuYnNwO0FuYWx5emVyOjwvc3Bhbj48L2E+PC9wPg0KLSAgICAgICAgICAgICAgPGRsPg0KLSAgICAgICAgICAgICAgICA8ZHQ+PGEgbmctY2xpY2s9InRvZ2dsZUFuYWx5emVyKGFuYWx5emVyKSIgY2xhc3M9InRvZ2dsZSI+e3thbmFseXplci5kZXRhaWwuY2xhc3NOYW1lfX08L2E+PC9kdD4NCi0gICAgICAgICAgICAgIDwvZGw+DQotICAgICAgICAgICAgICA8dWwgbmctc2hvdz0iYW5hbHl6ZXIuc2hvdyI+DQotICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iY2xlYXJmaXgge3tjb21wb25lbnRUeXBlLmtleX19IGRhdGEiIG5nLXJlcGVhdD0iY29tcG9uZW50VHlwZSBpbiBhbmFseXplci5kZXRhaWwuY29tcG9uZW50VHlwZXMiIG5nLXNob3c9ImNvbXBvbmVudFR5cGUuY29tcG9uZW50cyI+DQotICAgICAgICAgICAgICAgICAgPHA+e3tjb21wb25lbnRUeXBlLmxhYmVsfX06PC9wPg0KLSAgICAgICAgICAgICAgICAgIDxkbD4NCi0gICAgICAgICAgICAgICAgICAgICAgPGR0IG5nLXJlcGVhdC1zdGFydD0iY29tcG9uZW50IGluIGNvbXBvbmVudFR5cGUuY29tcG9uZW50cyI+e3tjb21wb25lbnQuY2xhc3NOYW1lfX08L2R0Pg0KLSAgICAgICAgICAgICAgICAgICAgICA8ZGQgbmctcmVwZWF0LWVuZCBuZy1yZXBlYXQ9ImFyZyBpbiBjb21wb25lbnQuYXJncyINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsYXNzPSJ7J2ljby0xJzogYXJnLmJvb2xlYW5WYWx1ZSwgJ2ljby0wJzogYXJnLmJvb2xlYW5WYWx1ZT09ZmFsc2V9Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXJnLm5hbWV9fTxzcGFuIG5nLXNob3c9ImFyZy52YWx1ZSI+OiB7e2FyZy52YWx1ZX19PC9zcGFuPg0KLSAgICAgICAgICAgICAgICAgICAgICA8L2RkPg0KLSAgICAgICAgICAgICAgICAgIDwvZGw+DQotICAgICAgICAgICAgICAgIDwvbGk+DQotICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgIDwvbGk+DQotICAgICAgICAgIDwvdWw+DQotDQotICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgIDxkaXYgY2xhc3M9InRlcm1pbmZvLWhvbGRlciBsb2FkZWQgY2xlYXJmaXgiIG5nLWNsYXNzPSJ7ZGlzYWJsZWQ6IG5vVGVybURhdGF9IiBuZy1zaG93PSJpcy5maWVsZCI+DQotDQotICAgICAgICAgIDxkaXYgY2xhc3M9InRyaWdnZXIiPg0KLQ0KLSAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InN1Ym1pdCIgbmctY2xpY2s9InRvZ2dsZVRlcm1zKCkiPjxzcGFuIG5nLWNsYXNzPSJ7bG9hZGVyOmlzTG9hZGluZ1Rlcm1zfSI+TG9hZCBUZXJtIEluZm88L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgPGJyLz4NCi0gICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJpc0Nsb3VkRW5hYmxlZCI+Ti5CLiBMb2FkZWQgZnJvbSBhIHNpbmdsZSBjb3JlIC0gbm90IGZyb20gdGhlIHdob2xlIGNvbGxlY3Rpb24uPC9zcGFuPg0KLQ0KLSAgICAgICAgICAgIDxhIG5nLXNob3c9InNob3dUZXJtcyIgbmctY2xpY2s9InRvZ2dsZUF1dG9sb2FkKCkiIG5nLWNsYXNzPSJ7b246aXNBdXRvbG9hZH0iIGNsYXNzPSJhdXRvbG9hZCIgdGl0bGU9IkF1dG9tYXRpY2FsbHkgbG9hZCBUZXJtIEluZm8/Ij48c3Bhbj5BdXRvbG9hZDwvc3Bhbj48L2E+DQotDQotICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICA8cCBuZy1zaG93PSJzaG93VGVybXMgJiYgbm9UZXJtcyIgY2xhc3M9InN0YXR1cyI+U29ycnksIG5vIFRlcm0gSW5mbyBhdmFpbGFibGUgOig8L3A+DQotDQotICAgICAgICAgIDxkaXYgbmctc2hvdz0ic2hvd1Rlcm1zICYmIHRlcm1JbmZvLnRvcFRlcm1zIiBjbGFzcz0idG9wdGVybXMtaG9sZGVyIj4NCi0NCi0gICAgICAgICAgICA8Zm9ybT4NCi0gICAgICAgICAgICA8cCBjbGFzcz0iaGVhZCI+DQotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmctbW9kZWw9InRvcFRlcm1zQ291bnQiIG5nLWNoYW5nZT0ibG9hZFRlcm1JbmZvKCkiPg0KLSAgICAgICAgICAgICAgPGEgY2xhc3M9Im1heC1ob2xkZXIiIG5nLWNsaWNrPSJsb2FkQWxsVG9wVGVybXMoKSIgdGl0bGU9IkxvYWQgYWxsIFRvcC1UZXJtcyI+LzxzcGFuIGNsYXNzPSJtYXgiPnt7dGVybUluZm8ubWF4VGVybXMgfCBudW1iZXJ9fTwvc3Bhbj48L2E+IFRvcC1UZXJtczoNCi0gICAgICAgICAgICAgIDxhIGlkPSJxdWVyeV9saW5rIiBocmVmPSIjL3t7Y29yZX19L3F1ZXJ5P3E9e3tuYW1lfX06WyogVE8gKl0iPjxzcGFuPlF1ZXJ5PC9zcGFuPiZuYnNwOzwvYT4NCi0gICAgICAgICAgICA8L3A+DQotICAgICAgICAgICAgPC9mb3JtPg0KLQ0KLSAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJjbGVhcmZpeCIgbmctcmVwZWF0PSJjb3VudEdyb3VwIGluIHRlcm1JbmZvLnRvcFRlcm1zIj4NCi0gICAgICAgICAgICAgICAgICAgIDxwPjxzcGFuPnt7Y291bnRHcm91cC5jb3VudH19PC9zcGFuPjwvcD4NCi0gICAgICAgICAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8bGkgbmctcmVwZWF0PSJ0ZXJtIGluIGNvdW50R3JvdXAudGVybXMiIG5nLWNsYXNzPSJ7b2RkOiRvZGR9Ij48YSBuZy1ocmVmPSIjL3t7Y29yZX19L3F1ZXJ5P3E9JTdCIXRlcm0rZiUzRHt7bmFtZSB8IHVyaWVuY29kZX19JTdEe3t0ZXJtIHwgdXJpZW5jb2RlfX0iPnt7dGVybX19PC9hPjwvbGk+DQotICAgICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICA8L2xpPg0KLQ0KLSAgICAgICAgICAgIDwvdWw+DQotDQotICAgICAgICAgIDwvZGl2Pg0KLQ0KLSAgICAgICAgICA8ZGl2IG5nLXNob3c9InNob3dUZXJtcyAmJiB0ZXJtSW5mby5oaXN0b2dyYW0iIGNsYXNzPSJoaXN0b2dyYW0taG9sZGVyIj4NCi0NCi0gICAgICAgICAgICA8cCBjbGFzcz0iaGVhZCI+SGlzdG9ncmFtOjwvcD4NCi0gICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgPGxpIG5nLXJlcGVhdD0icm93IGluIHRlcm1JbmZvLmhpc3RvZ3JhbSIgbmctY2xhc3M9IntvZGQ6JG9kZH0iPg0KLSAgICAgICAgICAgICAgICAgPGRsIGNsYXNzPSJjbGVhcmZpeCIgc3R5bGU9IndpZHRoOiB7eygoIHJvdy52YWx1ZSAvIHRlcm1JbmZvLmhpc3RvZ3JhbU1heCApICogMTAwICl9fSU7Ij4NCi0gICAgICAgICAgICAgICAgICAgPGR0PjxzcGFuPnt7IHJvdy5rZXkgfCBudW1iZXJ9fTwvc3Bhbj48L2R0Pg0KLSAgICAgICAgICAgICAgICAgICA8ZGQ+PHNwYW4+e3sgcm93LnZhbHVlIHwgbnVtYmVyIH19PC9zcGFuPjwvZGQ+DQotICAgICAgICAgICAgICAgICA8L2RsPg0KLSAgICAgICAgICAgICAgIDwvbGk+DQotDQotICAgICAgICAgICAgPC91bD4NCi0NCi0gICAgICAgICAgPC9kaXY+DQotDQotICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICA8L2Rpdj4NCi0NCi0gICAgPC9kaXY+DQotDQotICAgIDxkaXYgaWQ9InJlbGF0ZWQiPg0KLSAgICAgPHNlbGVjdCBpZD0idHlwZV9vcl9uYW1lIg0KLSAgICAgICAgICAgICBuZy1tb2RlbD0iZmllbGRPclR5cGUiDQotICAgICAgICAgICAgIGNob3Nlbg0KLSAgICAgICAgICAgICBkYXRhLXBsYWNlaG9sZGVyPSJQbGVhc2Ugc2VsZWN0IC4uLiINCi0gICAgICAgICAgICAgbmctY2hhbmdlPSJzZWxlY3RGaWVsZE9yVHlwZSgpIg0KLSAgICAgICAgICAgICBuZy1vcHRpb25zPSJmLnZhbHVlIGFzIGYubGFiZWwgZ3JvdXAgYnkgZi5ncm91cCBmb3IgZiBpbiBmaWVsZHNBbmRUeXBlcyI+PC9zZWxlY3Q+DQotDQotICAgICAgPGRsIGlkPSJmLWRmLXQiPg0KLQ0KLSAgICAgICAgPGR0IGNsYXNzPSJmaWVsZCIgbmctY2xhc3M9InthY3RpdmU6IHNlbGVjdGVkVHlwZT09J0ZpZWxkJ30iIG5nLXNob3c9ImxlZnRiYXIuZmllbGRzIj5GaWVsZDwvZHQ+DQotICAgICAgICA8ZGQgY2xhc3M9ImZpZWxkIiBuZy1jbGFzcz0ie2FjdGl2ZTogc2VsZWN0ZWRUeXBlPT0nRmllbGQnfSIgbmctcmVwZWF0PSJmaWVsZCBpbiBsZWZ0YmFyLmZpZWxkcyI+PGEgaHJlZj0iIy97e2NvcmV9fS9zY2hlbWE/ZmllbGQ9e3tmaWVsZH19Ij57e2ZpZWxkfX08L2E+PC9kZD4NCi0NCi0gICAgICAgIDxkdCBjbGFzcz0iY29weWZpZWxkIiBuZy1zaG93PSJsZWZ0YmFyLmNvcHlGaWVsZFNvdXJjZXMiPkNvcGllZCBmcm9tPC9kdD4NCi0gICAgICAgIDxkZCBjbGFzcz0iY29weWZpZWxkIiBuZy1yZXBlYXQ9ImZpZWxkIGluIGxlZnRiYXIuY29weUZpZWxkU291cmNlcyI+DQotICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2xlYXJmaXgiIG5nLWhpZGU9ImlzU2NoZW1hVXBkYXRhYmxlIj4NCi0gICAgICAgICAgICAgIDxhIGhyZWY9IiMve3tjb3JlfX0vc2NoZW1hP2ZpZWxkPXt7ZmllbGQubmFtZX19Ij57e2ZpZWxkLm5hbWV9fTwvYT4NCi0gICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCB1cGRhdGFibGUiIG5nLXNob3c9ImlzU2NoZW1hVXBkYXRhYmxlIj4NCi0gICAgICAgICAgICAgIDxhIHN0eWxlPSJmbG9hdDpsZWZ0O3dpZHRoOjgwJSIgaHJlZj0iIy97e2NvcmV9fS9zY2hlbWE/ZmllbGQ9e3tmaWVsZC5uYW1lfX0iPnt7ZmllbGQubmFtZX19PC9hPg0KLSAgICAgICAgICAgICAgPHNwYW4gbmctY2xpY2s9InRvZ2dsZURlbGV0ZUNvcHlGaWVsZChmaWVsZCkiIGNsYXNzPSJyZW0iPiZuYnNwOzwvc3Bhbj4NCi0gICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24gZGVsZXRlIiBuZy1zaG93PSJmaWVsZC5zaG93Ij4NCi0gICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9ImRlbGV0ZSI+DQotDQotICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48ZW0+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIENvcHlGaWVsZD88L2VtPjwvcD4NCi0gICAgICAgICAgICAgICAgICA8ZGl2IG5nLXJlcGVhdD0iZXJyb3IgaW4gZmllbGQuZXJyb3JzIiBuZy1zaG93PSJmaWVsZC5lcnJvcnMiIGNsYXNzPSJjbGVhcmZpeCBub3RlIGVycm9yIj4NCi0gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ZXJyb3J9fTwvc3Bhbj48L2Rpdj4NCi0NCi0gICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXggYnV0dG9ucyI+DQotICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJzdWJtaXQiIG5nLWNsYXNzPSJ7c3VjY2VzczogZmllbGQuZGVsZXRlZH0iIG5nLWNsaWNrPSJkZWxldGVDb3B5RmllbGQoZmllbGQsIGZpZWxkLm5hbWUsIG5hbWUpIj48c3Bhbj5EZWxldGU8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InJlc2V0IiBjbGFzcz0icmVzZXQiIG5nLWNsaWNrPSJ0b2dnbGVEZWxldGVDb3B5RmllbGQoZmllbGQpIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgICAgICAgPC9wPg0KLSAgICAgICAgICAgICAgICA8L2Zvcm0+DQotICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICA8L2RkPg0KLQ0KLSAgICAgICAgPGR0IGNsYXNzPSJjb3B5ZmllbGQiIG5nLXNob3c9ImxlZnRiYXIuY29weUZpZWxkRGVzdHMiPkNvcGllZCB0bzwvZHQ+DQotICAgICAgICA8ZGQgY2xhc3M9ImNvcHlmaWVsZCIgbmctcmVwZWF0PSJmaWVsZCBpbiBsZWZ0YmFyLmNvcHlGaWVsZERlc3RzIj4NCi0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCIgbmctaGlkZT0iaXNTY2hlbWFVcGRhdGFibGUiPg0KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIy97e2NvcmV9fS9zY2hlbWE/ZmllbGQ9e3tmaWVsZC5uYW1lfX0iPnt7ZmllbGQubmFtZX19PC9hPg0KLSAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZml4IHVwZGF0YWJsZSIgbmctc2hvdz0iaXNTY2hlbWFVcGRhdGFibGUiPg0KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIy97e2NvcmV9fS9zY2hlbWE/ZmllbGQ9e3tmaWVsZC5uYW1lfX0iPnt7ZmllbGQubmFtZX19PC9hPg0KLSAgICAgICAgICAgICAgPHNwYW4gbmctY2xpY2s9InRvZ2dsZURlbGV0ZUNvcHlGaWVsZChmaWVsZCkiIGNsYXNzPSJyZW0iPiZuYnNwOzwvc3Bhbj4NCi0gICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24gZGVsZXRlIiBuZy1zaG93PSJmaWVsZC5zaG93Ij4NCi0gICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9ImRlbGV0ZSI+DQotDQotICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48ZW0+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIENvcHlGaWVsZD88L2VtPjwvcD4NCi0gICAgICAgICAgICAgICAgICA8ZGl2IG5nLXJlcGVhdD0iZXJyb3IgaW4gZmllbGQuZXJyb3JzIiBuZy1zaG93PSJmaWVsZC5lcnJvcnMiIGNsYXNzPSJjbGVhcmZpeCBub3RlIGVycm9yIj4NCi0gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ZXJyb3J9fTwvc3Bhbj48L2Rpdj4NCi0NCi0gICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXggYnV0dG9ucyI+DQotICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJzdWJtaXQiIG5nLWNsYXNzPSJ7c3VjY2VzczogZmllbGQuZGVsZXRlZH0iIG5nLWNsaWNrPSJkZWxldGVDb3B5RmllbGQoZmllbGQsIG5hbWUsIGZpZWxkLm5hbWUpIj48c3Bhbj5EZWxldGU8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InJlc2V0IiBjbGFzcz0icmVzZXQiIG5nLWNsaWNrPSJ0b2dnbGVEZWxldGVDb3B5RmllbGQoZmllbGQpIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgICAgICAgPC9wPg0KLSAgICAgICAgICAgICAgICA8L2Zvcm0+DQotICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICA8L2RkPg0KLSAgICAgICAgPGR0IGNsYXNzPSJkeW5hbWljLWZpZWxkIiBuZy1jbGFzcz0ie2FjdGl2ZTogc2VsZWN0ZWRUeXBlPT0nRHluYW1pYyBGaWVsZCd9IiBuZy1zaG93PSJsZWZ0YmFyLmR5bmFtaWNGaWVsZHMiPkR5bmFtaWMgRmllbGQge3tkeW5hbWljRmllbGRzfX0gLyB7e2R5bmFtaWNGaWVsZHMubGVuZ3RoKCl9fTwvZHQ+DQotICAgICAgICA8ZGQgY2xhc3M9ImR5bmFtaWMtZmllbGQiIG5nLWNsYXNzPSJ7YWN0aXZlOiBzZWxlY3RlZFR5cGU9PSdEeW5hbWljIEZpZWxkJ30iIG5nLXJlcGVhdD0iZmllbGQgaW4gbGVmdGJhci5keW5hbWljRmllbGRzIj48YSBocmVmPSIjL3t7Y29yZX19L3NjaGVtYT9keW5hbWljLWZpZWxkPXt7ZmllbGR9fSI+e3tmaWVsZH19PC9hPjwvZGQ+DQotDQotICAgICAgICA8ZHQgY2xhc3M9InR5cGUiIG5nLWNsYXNzPSJ7YWN0aXZlOiBzZWxlY3RlZFR5cGU9PSdUeXBlJ30iIG5nLXNob3c9ImxlZnRiYXIudHlwZXMiPlR5cGU8L2R0Pg0KLSAgICAgICAgPGRkIGNsYXNzPSJ0eXBlIiBuZy1jbGFzcz0ie2FjdGl2ZTogc2VsZWN0ZWRUeXBlPT0nVHlwZSd9IiBuZy1yZXBlYXQ9InR5cGUgaW4gbGVmdGJhci50eXBlcyI+PGEgaHJlZj0iIy97e2NvcmV9fS9zY2hlbWE/dHlwZT17e3R5cGV9fSI+e3t0eXBlfX08L2E+PC9kZD4NCi0NCi0gICAgICAgIDxkdD48L2R0Pg0KLSAgICAgICAgPGRkIGNsYXNzPSJhY3RpdmUgZGVsZXRlLWZpZWxkIiBuZy1zaG93PSJpc1NjaGVtYVVwZGF0YWJsZSAmYW1wOyZhbXA7IGxlZnRiYXIuZmllbGRzICZhbXA7JmFtcDshc2hvd0RlbGV0ZSI+PGJ1dHRvbiBuZy1jbGljaz0idG9nZ2xlRGVsZXRlKCkiPjxzcGFuPmRlbGV0ZSBmaWVsZDwvc3Bhbj48L2J1dHRvbj48L2RkPg0KLSAgICAgICAgPGRkIGNsYXNzPSJhY3RpdmUgZGVsZXRlLWZpZWxkIiBuZy1zaG93PSJpc1NjaGVtYVVwZGF0YWJsZSAmYW1wOyZhbXA7IGxlZnRiYXIuZHluYW1pY0ZpZWxkcyAmYW1wOyZhbXA7IXNob3dEZWxldGUiPjxidXR0b24gbmctY2xpY2s9InRvZ2dsZURlbGV0ZSgpIj48c3Bhbj5kZWxldGUgZHluYW1pYyBmaWVsZDwvc3Bhbj48L2J1dHRvbj48L2RkPg0KLQ0KLSAgICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uIGRlbGV0ZSIgbmctc2hvdz0ic2hvd0RlbGV0ZSI+DQotDQotICAgICAgICAgICAgPGZvcm0gY2xhc3M9ImRlbGV0ZSI+DQotDQotICAgICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxlbT5BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMge3tzZWxlY3RlZFR5cGV9fT88L2VtPjwvcD4NCi0gICAgICAgICAgICAgIDxkaXYgbmctcmVwZWF0PSJlcnJvciBpbiBkZWxldGVFcnJvcnMiIG5nLXNob3c9ImRlbGV0ZUVycm9ycyIgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiPg0KLSAgICAgICAgICAgICAgICA8c3Bhbj57e2Vycm9yfX08L3NwYW4+PC9kaXY+DQotDQotICAgICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXggYnV0dG9ucyI+DQotICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InN1Ym1pdCIgbmctY2xhc3M9IntzdWNjZXNzOiBkZWxldGVkfSIgbmctY2xpY2s9ImRlbGV0ZSgpIj48c3Bhbj5EZWxldGU8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0icmVzZXQiIGNsYXNzPSJyZXNldCIgbmctY2xpY2s9InRvZ2dsZURlbGV0ZSgpIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+DQotICAgICAgICAgICAgICA8L3A+DQotICAgICAgICAgICAgPC9mb3JtPg0KLSAgICAgICAgPC9kaXY+DQotICAgICAgPC9kbD4NCi0NCi0gICAgICA8ZGwgY2xhc3M9InVrZi1kc2YiPg0KLQ0KLSAgICAgICAgPGR0IGNsYXNzPSJ1bmlxdWUta2V5LWZpZWxkIiBuZy1jbGFzcz0ie2FjdGl2ZTogaXNVbmlxdWVLZXlGaWVsZH0iIG5nLXNob3c9InVuaXF1ZUtleUZpZWxkIj5VbmlxdWUgS2V5IEZpZWxkPC9kdD4NCi0gICAgICAgIDxkZCBjbGFzcz0idW5pcXVlLWtleS1maWVsZCIgbmctY2xhc3M9InthY3RpdmU6IGlzVW5pcXVlS2V5RmllbGR9Ij48YSBuZy1ocmVmPSIjL3t7Y29yZX19L3NjaGVtYT9maWVsZD17e3VuaXF1ZUtleUZpZWxkfX0iPnt7dW5pcXVlS2V5RmllbGR9fTwvYT48L2RkPg0KLQ0KLSAgICAgICAgPGR0IGNsYXNzPSJkZWZhdWx0LXNlYXJjaC1maWVsZCIgbmctY2xhc3M9InthY3RpdmU6IGlzRGVmYXVsdFNlYXJjaEZpZWxkfSIgbmctc2hvdz0iZGVmYXVsdFNlYXJjaEZpZWxkIj5EZWZhdWx0IFNlYXJjaCBGaWVsZDwvZHQ+DQotICAgICAgICA8ZGQgY2xhc3M9ImRlZmF1bHQtc2VhcmNoLWZpZWxkIiBuZy1jbGFzcz0ie2FjdGl2ZTogaXNEZWZhdWx0U2VhcmNoRmllbGR9Ij48YSBuZy1ocmVmPSIjL3t7Y29yZX19L3NjaGVtYT9maWVsZD17e2RlZmF1bHRTZWFyY2hGaWVsZH19Ij57e2RlZmF1bHRTZWFyY2hGaWVsZH19PC9hPjwvZGQ+DQotDQotICAgICAgPC9kbD4NCi0NCi0gICAgPC9kaXY+DQotICAgICAgPC9kaXY+DQotDQotICA8L2Rpdj4NCi0NCi08L2Rpdj4NCis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkaXYgaWQ9InNjaGVtYSIgY2xhc3M9ImxvYWRlZCI+CisKKyAgPGRpdiBjbGFzcz0iY2xlYXJmaXgiPgorCisgICAgPGRpdiBpZD0iZnJhbWUiPgorICAgIDxkaXYgaWQ9ImFjdGlvbnMiIGNsYXNzPSJhY3Rpb25zIGNsZWFyZml4IiBuZy1zaG93PSJpc1NjaGVtYVVwZGF0YWJsZSI+CisgICAgICA8YnV0dG9uIGlkPSJhZGRGaWVsZCIgY2xhc3M9ImFjdGlvbiIgbmctY2xpY2s9InRvZ2dsZUFkZEZpZWxkKCkiPjxzcGFuPkFkZCBGaWVsZDwvc3Bhbj48L2J1dHRvbj4KKyAgICAgIDxidXR0b24gaWQ9ImFkZER5bmFtaWNGaWVsZCIgY2xhc3M9ImFjdGlvbiIgbmctY2xpY2s9InRvZ2dsZUFkZER5bmFtaWNGaWVsZCgpIj48c3Bhbj5BZGQgRHluYW1pYyBGaWVsZDwvc3Bhbj48L2J1dHRvbj4KKyAgICAgIDxidXR0b24gaWQ9ImFkZENvcHlGaWVsZCIgY2xhc3M9ImFjdGlvbiIgbmctY2xpY2s9InRvZ2dsZUFkZENvcHlGaWVsZCgpIj48c3Bhbj5BZGQgQ29weSBGaWVsZDwvc3Bhbj48L2J1dHRvbj4KKworICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uIGFkZCIgZGF0YS1yZWw9ImFkZCIgbmctc2hvdz0ic2hvd0FkZEZpZWxkIiBlc2NhcGUtcHJlc3NlZD0iaGlkZUFsbCgpIj4KKworICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWRkX25hbWUiPm5hbWU6PC9sYWJlbD4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImFkZF9uYW1lIiBuZy1tb2RlbD0ibmV3RmllbGQubmFtZSIgZm9jdXMtd2hlbj0ic2hvd0FkZEZpZWxkIiBwbGFjZWhvbGRlcj0iZW50ZXIgYSBmaWVsZCBuYW1lIj48L3A+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF90eXBlIj5maWVsZCB0eXBlOjwvbGFiZWw+CisgICAgICAgICAgPHNlbGVjdCBjaG9zZW4gdHlwZT0idGV4dCIgaWQ9ImFkZF90eXBlIiBuZy1tb2RlbD0ibmV3RmllbGQudHlwZSIgbmctb3B0aW9ucz0idHlwZSBmb3IgdHlwZSBpbiB0eXBlcyI+PC9zZWxlY3Q+CisgICAgICAgICAgPC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IiBuZy1zaG93PSJhZGRpbmc9PSdmaWVsZCciPjxsYWJlbCBmb3I9ImFkZF9kZWZhdWx0Ij5kZWZhdWx0OjwvbGFiZWw+CisgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJhZGRfZGVmYXVsdCIgbmctbW9kZWw9Im5ld0ZpZWxkLmRlZmF1bHQiIHBsYWNlaG9sZGVyPSJlbnRlciBhIGRlZmF1bHQgdmFsdWUgaWYgbmVlZGVkIj48L3A+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGVja2JveCIgZm9yPSJhZGRfc3RvcmVkIj4KKyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ibmV3RmllbGQuc3RvcmVkIiBpZD0iYWRkX3N0b3JlZCIgdGl0bGU9IkZ1bGwgZmllbGQgc2hvdWxkIGJlIHN0b3JlZCBpbiBpbmRleC4iIG5nLXRydWUtdmFsdWU9Iid0cnVlJyIgbmctZmFsc2UtdmFsdWU9IidmYWxzZSciPgorICAgICAgICAgICAgc3RvcmVkCisgICAgICAgICAgICA8L2xhYmVsPgorICAgICAgICAgIDwvcD4KKworICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNoZWNrYm94IiBmb3I9ImFkZF9pbmRleGVkIj4KKyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ibmV3RmllbGQuaW5kZXhlZCIgaWQ9ImFkZF9pbmRleGVkIiB0aXRsZT0iRmllbGQgc2hvdWxkIGJlIGluZGV4ZWQuIiBuZy10cnVlLXZhbHVlPSIndHJ1ZSciIG5nLWZhbHNlLXZhbHVlPSInZmFsc2UnIj4KKyAgICAgICAgICAgIGluZGV4ZWQKKyAgICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgICAgPC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX2RvY1ZhbHVlcyI+CisgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9Im5ld0ZpZWxkLmRvY1ZhbHVlcyIgaWQ9ImFkZF9kb2NWYWx1ZXMiIHRpdGxlPSJEb2NWYWx1ZXMgc2hvdWxkIGJlIHN0b3JlZCBmb3IgdGhlIGZpZWxkLiIgbmctdHJ1ZS12YWx1ZT0iJ3RydWUnIiBuZy1mYWxzZS12YWx1ZT0iJ2ZhbHNlJyI+CisgICAgICAgICAgICBkb2NWYWx1ZXMKKyAgICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgICAgPC9wPgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX211bHRpVmFsdWVkIj4KKyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ibmV3RmllbGQubXVsdGlWYWx1ZWQiIGlkPSJhZGRfbXVsdGlWYWx1ZWQiIHRpdGxlPSJNdWx0aXBsZSB2YWx1ZXMgYXJlIGFsbG93ZWQgZm9yIHRoaXMgZmllbGQuIiBuZy10cnVlLXZhbHVlPSIndHJ1ZSciIG5nLWZhbHNlLXZhbHVlPSInZmFsc2UnIj4KKyAgICAgICAgICAgIG11bHRpVmFsdWVkCisgICAgICAgICAgICA8L2xhYmVsPgorICAgICAgICAgIDwvcD4KKworICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCIgbmctc2hvdz0iYWRkaW5nPT0nZmllbGQnIj4KKyAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX3JlcXVpcmVkIj4KKyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ibmV3RmllbGQucmVxdWlyZWQiIGlkPSJhZGRfcmVxdWlyZWQiIHRpdGxlPSJGaWVsZCBtdXN0IGJlIHByb3ZpZGVkIGZvciBhbGwgZG9jdW1lbnRzLiIgbmctdHJ1ZS12YWx1ZT0iJ3RydWUnIiBuZy1mYWxzZS12YWx1ZT0iJ2ZhbHNlJyI+CisgICAgICAgICAgICByZXF1aXJlZAorICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICA8L3A+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgPGEgbmctY2xpY2s9InNob3dPbWl0PSFzaG93T21pdCI+CisgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJhZGRfc2hvd2hpZGUiIG5nLWhpZGU9InNob3dPbWl0Ij5TaG93IG9taXQgb3B0aW9uczwvc3Bhbj4KKyAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFkZF9zaG93aGlkZSBvcGVuIiBuZy1zaG93PSJzaG93T21pdCI+SGlkZSBvbWl0IG9wdGlvbnM8L3NwYW4+CisgICAgICAgICAgICA8L2E+CisgICAgICAgICAgPC9wPgorCisgICAgICAgICAgPGRpdiBuZy1zaG93PSJzaG93T21pdCI+CisKKyAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX29taXROb3JtcyI+CisgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ibmV3RmllbGQub21pdE5vcm1zIiBpZD0iYWRkX29taXROb3JtcyIgdGl0bGU9IkZ1bGwgZmllbGQgc2hvdWxkIGJlIG9taXROb3JtcyBpbiBpbmRleC4iIG5nLXRydWUtdmFsdWU9Iid0cnVlJyIgbmctZmFsc2UtdmFsdWU9IidmYWxzZSciPgorICAgICAgICAgICAgICBvbWl0Tm9ybXMKKyAgICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGVja2JveCIgZm9yPSJhZGRfb21pdFRlcm1GcmVxQW5kUG9zaXRpb25zIj4KKyAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJuZXdGaWVsZC5vbWl0VGVybUZyZXFBbmRQb3NpdGlvbnMiIGlkPSJhZGRfb21pdFRlcm1GcmVxQW5kUG9zaXRpb25zIiB0aXRsZT0iRnVsbCBmaWVsZCBzaG91bGQgYmUgb21pdFRlcm1GcmVxQW5kUG9zaXRpb25zIGluIGluZGV4LiIgbmctdHJ1ZS12YWx1ZT0iJ3RydWUnIiBuZy1mYWxzZS12YWx1ZT0iJ2ZhbHNlJyI+CisgICAgICAgICAgICAgIG9taXRUZXJtRnJlcUFuZFBvc2l0aW9ucworICAgICAgICAgICAgICA8L2xhYmVsPgorICAgICAgICAgICAgPC9wPgorCisgICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNoZWNrYm94IiBmb3I9ImFkZF9vbWl0UG9zaXRpb25zIj4KKyAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJuZXdGaWVsZC5vbWl0UG9zaXRpb25zIiBpZD0iYWRkX29taXRQb3NpdGlvbnMiIHRpdGxlPSJGdWxsIGZpZWxkIHNob3VsZCBiZSBvbWl0UG9zaXRpb25zIGluIGluZGV4LiIgbmctdHJ1ZS12YWx1ZT0iJ3RydWUnIiBuZy1mYWxzZS12YWx1ZT0iJ2ZhbHNlJyI+CisgICAgICAgICAgICAgIG9taXRQb3NpdGlvbnMKKyAgICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICA8YSBuZy1jbGljaz0ic2hvd1Rlcm1WZWN0b3JzPSFzaG93VGVybVZlY3RvcnMiPgorICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYWRkX3Nob3doaWRlIiBuZy1oaWRlPSJzaG93VGVybVZlY3RvcnMiPlNob3cgdGVybSB2ZWN0b3Igb3B0aW9uczwvc3Bhbj4KKyAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFkZF9zaG93aGlkZSBvcGVuIiBuZy1zaG93PSJzaG93VGVybVZlY3RvcnMiPkhpZGUgdGVybSB2ZWN0b3Igb3B0aW9uczwvc3Bhbj4KKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICA8L3A+CisgICAgICAgICAgPGRpdiBuZy1zaG93PSJzaG93VGVybVZlY3RvcnMiPgorCisgICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGVja2JveCIgZm9yPSJhZGRfdGVybVZlY3RvcnMiPgorICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9Im5ld0ZpZWxkLnRlcm1WZWN0b3JzIiBpZD0iYWRkX3Rlcm1WZWN0b3JzIiB0aXRsZT0iRnVsbCBmaWVsZCBzaG91bGQgYmUgdGVybVZlY3RvcnMgaW4gaW5kZXguIiBuZy10cnVlLXZhbHVlPSIndHJ1ZSciIG5nLWZhbHNlLXZhbHVlPSInZmFsc2UnIj4KKyAgICAgICAgICAgICAgdGVybVZlY3RvcnMKKyAgICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGVja2JveCIgZm9yPSJhZGRfdGVybVBvc2l0aW9ucyI+CisgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ibmV3RmllbGQudGVybVBvc2l0aW9ucyIgaWQ9ImFkZF90ZXJtUG9zaXRpb25zIiB0aXRsZT0iRnVsbCBmaWVsZCBzaG91bGQgYmUgdGVybVBvc2l0aW9ucyBpbiBpbmRleC4iIG5nLXRydWUtdmFsdWU9Iid0cnVlJyIgbmctZmFsc2UtdmFsdWU9IidmYWxzZSciPgorICAgICAgICAgICAgICB0ZXJtUG9zaXRpb25zCisgICAgICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX3Rlcm1PZmZzZXRzIj4KKyAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJuZXdGaWVsZC50ZXJtT2Zmc2V0cyIgaWQ9ImFkZF90ZXJtT2Zmc2V0cyIgdGl0bGU9IkZ1bGwgZmllbGQgc2hvdWxkIGJlIHRlcm1PZmZzZXRzIGluIGluZGV4LiIgbmctdHJ1ZS12YWx1ZT0iJ3RydWUnIiBuZy1mYWxzZS12YWx1ZT0iJ2ZhbHNlJyI+CisgICAgICAgICAgICAgIHRlcm1PZmZzZXRzCisgICAgICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX3Rlcm1QYXlsb2FkcyI+CisgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuZy1tb2RlbD0ibmV3RmllbGQudGVybVBheWxvYWRzIiBpZD0iYWRkX3Rlcm1QYXlsb2FkcyIgdGl0bGU9IkZ1bGwgZmllbGQgc2hvdWxkIGJlIHRlcm1QYXlsb2FkcyBpbiBpbmRleC4iIG5nLXRydWUtdmFsdWU9Iid0cnVlJyIgbmctZmFsc2UtdmFsdWU9IidmYWxzZSciPgorICAgICAgICAgICAgICB0ZXJtUGF5bG9hZHMKKyAgICAgICAgICAgICAgPC9sYWJlbD4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAgICAgICAgIDxhIG5nLWNsaWNrPSJzaG93U29ydD0hc2hvd1NvcnQiPgorICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYWRkX3Nob3doaWRlIiBuZy1oaWRlPSJzaG93U29ydCI+U2hvdyBzb3J0IG9wdGlvbnM8L3NwYW4+CisgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJhZGRfc2hvd2hpZGUgb3BlbiIgbmctc2hvdz0ic2hvd1NvcnQiPlNob3cgc29ydCBvcHRpb25zPC9zcGFuPgorICAgICAgICAgICAgPC9hPgorICAgICAgICAgIDwvcD4KKyAgICAgICAgICA8ZGl2IG5nLXNob3c9InNob3dTb3J0Ij4KKyAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+CisgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY2hlY2tib3giIGZvcj0iYWRkX3NvcnRNaXNzaW5nRmlyc3QiPgorICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9Im5ld0ZpZWxkLnNvcnRNaXNzaW5nRmlyc3QiIGlkPSJhZGRfc29ydE1pc3NpbmdGaXJzdCIgdGl0bGU9IkZ1bGwgZmllbGQgc2hvdWxkIGJlIHNvcnRNaXNzaW5nRmlyc3QgaW4gaW5kZXguIiBuZy10cnVlLXZhbHVlPSIndHJ1ZSciIG5nLWZhbHNlLXZhbHVlPSInZmFsc2UnIj4KKyAgICAgICAgICAgICAgc29ydE1pc3NpbmdGaXJzdAorICAgICAgICAgICAgICA8L2xhYmVsPgorICAgICAgICAgICAgPC9wPgorCisgICAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNoZWNrYm94IiBmb3I9ImFkZF9zb3J0TWlzc2luZ0xhc3QiPgorICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmctbW9kZWw9Im5ld0ZpZWxkLnNvcnRNaXNzaW5nTGFzdCIgaWQ9ImFkZF9zb3J0TWlzc2luZ0xhc3QiIHRpdGxlPSJGdWxsIGZpZWxkIHNob3VsZCBiZSBzb3J0TWlzc2luZ0xhc3QgaW4gaW5kZXguIiBuZy10cnVlLXZhbHVlPSIndHJ1ZSciIG5nLWZhbHNlLXZhbHVlPSInZmFsc2UnIj4KKyAgICAgICAgICAgICAgc29ydE1pc3NpbmdMYXN0CisgICAgICAgICAgICAgIDwvbGFiZWw+CisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgIDxkaXYgbmctcmVwZWF0PSJlcnJvciBpbiBhZGRFcnJvcnMiIG5nLXNob3c9ImFkZEVycm9ycyIgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiPgorICAgICAgICAgICAgPHNwYW4+e3tlcnJvcn19PC9zcGFuPjwvZGl2PgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IGJ1dHRvbnMiPgorICAgICAgICAgICAgPGJ1dHRvbiBuZy1zaG93PSJhZGRpbmc9PSdmaWVsZCciIHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgbmctY2xhc3M9IntzdWNjZXNzOiBhZGRlZH0iIG5nLWNsaWNrPSJhZGRGaWVsZCgpIj48c3Bhbj5BZGQgRmllbGQ8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICA8YnV0dG9uIG5nLXNob3c9ImFkZGluZz09J2R5bmFtaWNGaWVsZCciIHR5cGU9InN1Ym1pdCIgY2xhc3M9InN1Ym1pdCIgbmctY2xhc3M9IntzdWNjZXNzOiBhZGRlZH0iIG5nLWNsaWNrPSJhZGREeW5hbWljRmllbGQoKSI+PHNwYW4+QWRkIER5bmFtaWMgRmllbGQ8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InJlc2V0IiBjbGFzcz0icmVzZXQiIG5nLWNsaWNrPSJoaWRlQWxsKCkiPjxzcGFuPkNhbmNlbDwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICA8L3A+CisKKworCisgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uIGFkZCIgZGF0YS1yZWw9ImFkZCIgbmctc2hvdz0ic2hvd0FkZENvcHlGaWVsZCIgZXNjYXBlLXByZXNzZWQ9ImhpZGVBbGwoKSI+CisKKyAgICAgICAgPGZvcm0+CisKKyAgICAgICAgICA8cCBjbGFzcz0iY2xlYXJmaXgiPjxsYWJlbCBmb3I9ImFkZF9zb3VyY2UiPnNvdXJjZTo8L2xhYmVsPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYWRkX3NvdXJjZSIgbmctbW9kZWw9ImNvcHlGaWVsZC5zb3VyY2UiIGZvY3VzLXdoZW49InNob3dBZGRDb3B5RmllbGQiIHBsYWNlaG9sZGVyPSJzcGVjaWZ5IHlvdXIgc291cmNlIGZpZWxkIG9yIHBhdHRlcm4iPjwvcD4KKworICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGxhYmVsIGZvcj0iYWRkX2Rlc3QiPmRlc3RpbmF0aW9uOjwvbGFiZWw+CisgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJhZGRfZGVzdCIgbmctbW9kZWw9ImNvcHlGaWVsZC5kZXN0IiBwbGFjZWhvbGRlcj0ic3BlY2lmeSB5b3VyIGRlc3RpbmF0aW9uIGZpZWxkIG9yIHBhdHRlcm4iPjwvcD4KKworICAgICAgICAgIDxkaXYgbmctcmVwZWF0PSJlcnJvciBpbiBhZGRDb3B5RmllbGRFcnJvcnMiIG5nLXNob3c9ImFkZENvcHlGaWVsZEVycm9ycyIgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiPgorICAgICAgICAgICAgPHNwYW4+e3tlcnJvcn19PC9zcGFuPjwvZGl2PgorCisgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IGJ1dHRvbnMiPgorICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJzdWJtaXQiIG5nLWNsYXNzPSJ7c3VjY2VzczogYWRkZWR9IiBuZy1jbGljaz0iYWRkQ29weUZpZWxkKCkiPjxzcGFuPkFkZCBDb3B5RmllbGQ8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InJlc2V0IiBjbGFzcz0icmVzZXQiIG5nLWNsaWNrPSJoaWRlQWxsKCkiPjxzcGFuPkNhbmNlbDwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICA8L3A+CisKKyAgICAgICAgPC9mb3JtPgorCisgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICAgIDxkaXYgaWQ9ImRhdGEiPgorCisgICAgICA8ZGl2IGlkPSJmaWVsZCI+CisKKyAgICAgICAgPGRpdiBjbGFzcz0iZmllbGQtb3B0aW9ucyIgbmctc2hvdz0ic2hvd2luZyI+CisKKyAgICAgICAgICA8ZGl2IGNsYXNzPSJibG9jayBoZWFkIj4KKyAgICAgICAgICAgIDxoMj4KKyAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InR5cGUiPnt7c2VsZWN0ZWRUeXBlfX08L3NwYW4+OgorICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibmFtZSI+e3tuYW1lfX08L3NwYW4+CisgICAgICAgICAgICA8L2gyPgorICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgPGRpdiBjbGFzcz0icGFydGlhbCIgbmctc2hvdz0icGFydGlhbFN0YXRlIj4KKworICAgICAgICAgICAgPHA+QmVjYXVzZSB5b3VyIEluZGV4IGlzIGVtcHR5LCB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBGaWVsZDwvcD4KKworICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgPGRsIGNsYXNzPSJvcHRpb25zIGNsZWFyZml4Ij4KKworICAgICAgICAgICAgPGR0IGNsYXNzPSJmaWVsZC10eXBlIj5GaWVsZC1UeXBlOjwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9ImZpZWxkLXR5cGUiPnt7YW5hbHlzaXMuZGF0YS5jbGFzc05hbWV9fTwvZGQ+CisKKyAgICAgICAgICAgIDxkdCBjbGFzcz0ic2ltaWxhcml0eSIgbmctc2hvdz0iZGlzcGxheS5zaW1pbGFyaXR5Ij5TaW1pbGFyaXR5OjwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9InNpbWlsYXJpdHkiIG5nLXNob3c9ImRpc3BsYXkuc2ltaWxhcml0eSI+e3sgZGlzcGxheS5zaW1pbGFyaXR5LmRldGFpbHMgfX0gKHt7IHNpbWlsYXJpdHkuY2xhc3NOYW1lIH19KSA8L2RkPgorCisgICAgICAgICAgICA8ZHQgY2xhc3M9InBvc2l0aW9uLWluY3JlbWVudC1nYXAiIG5nLXNob3c9ImRpc3BsYXkucG9zaXRpb25JbmNyZW1lbnRHYXAiPjxhYmJyIHRpdGxlPSJQb3NpdGlvbiBJbmNyZW1lbnQgR2FwIj5QSSBHYXA8L2FiYnI+OjwvZHQ+CisgICAgICAgICAgICA8ZGQgY2xhc3M9InBvc2l0aW9uLWluY3JlbWVudC1nYXAiIG5nLXNob3c9ImRpc3BsYXkucG9zaXRpb25JbmNyZW1lbnRHYXAiPnt7IGRpc3BsYXkucG9zaXRpb25JbmNyZW1lbnRHYXAgfX08L2RkPgorCisgICAgICAgICAgICA8ZHQgY2xhc3M9ImRvY3MiIG5nLXNob3c9ImRpc3BsYXkuZG9jcyI+RG9jczo8L2R0PgorICAgICAgICAgICAgPGRkIGNsYXNzPSJkb2NzIiBuZy1zaG93PSJkaXNwbGF5LmRvY3MiPjxhIGhyZWY9Int7ZGlzcGxheS5kb2NzVXJsfX0iPnt7ZGlzcGxheS5kb2NzIHwgbnVtYmVyfX08L2E+PC9kZD4KKworICAgICAgICAgICAgPGR0IGNsYXNzPSJkaXN0aW5jdCIgbmctc2hvdz0iZGlzcGxheS5kaXN0aW5jdCI+RGlzdGluY3Q6PC9kdD4KKyAgICAgICAgICAgIDxkZCBjbGFzcz0iZGlzdGluY3QiIG5nLXNob3c9ImRpc3BsYXkuZGlzdGluY3QiPnt7ZGlzcGxheS5kaXN0aW5jdH19PC9kZD4KKworICAgICAgICAgIDwvZGw+CisKKyAgICAgICAgICA8dGFibGUgY2xhc3M9ImZsYWdzIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCIgbmctc2hvdz0iZGlzcGxheS5jb2x1bW5zLmxlbmd0aCE9MCI+CisKKyAgICAgICAgICAgIDx0aGVhZD4KKworICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRkPkZsYWdzOjwvdGQ+CisgICAgICAgICAgICAgICAgPHRoIG5nLXJlcGVhdD0ia2V5IGluIGRpc3BsYXkuY29sdW1ucyI+e3trZXkubmFtZX19PC90aD4KKworICAgICAgICAgICAgICA8L3RyPgorCisgICAgICAgICAgICA8L3RoZWFkPgorCisgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgPHRyIG5nLXJlcGVhdD0icm93IGluIGRpc3BsYXkucm93cyB0cmFjayBieSByb3cubmFtZSI+CisgICAgICAgICAgICAgIDx0aD57e3Jvdy5uYW1lfX08L3RoPgorICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9InRleHQiIG5nLXNob3c9InJvdy5jb21tZW50Ij57e3Jvdy5jb21tZW50fX08L3RkPgorICAgICAgICAgICAgICA8dGQgbmctcmVwZWF0PSJjZWxsIGluIHJvdy5jZWxscyIKKyAgICAgICAgICAgICAgICAgIG5nLWNsYXNzPSJ7J2NoZWNrJzpjZWxsLnZhbHVlfSI+CisgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJjZWxsLnZhbHVlIj7iiD88L3NwYW4+CisgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSIhY2VsbC52YWx1ZSI+Jm5ic3A7PC9zcGFuPgorICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3Rib2R5PgorCisgICAgICAgICAgPC90YWJsZT4KKworICAgICAgICAgIDx1bCBjbGFzcz0iYW5hbHl6ZXIiPgorICAgICAgICAgICAgPGxpIGNsYXNzPSJjbGVhcmZpeCB7e2FuYWx5emVyLmtleX19IiBuZy1jbGFzcz0ie29wZW46IGFuYWx5emVyLnNob3d9IiBuZy1yZXBlYXQ9ImFuYWx5emVyIGluIGFuYWx5c2lzLmFuYWx5emVycyI+CisKKyAgICAgICAgICAgICAgPHA+PGEgY2xhc3M9ImFuYWx5c2lzIiBuZy1ocmVmPSIjL3t7Y29yZX19L2FuYWx5c2lzP3t7YW5hbHlzaXMucXVlcnl9fSI+PHNwYW4+e3thbmFseXplci5uYW1lfX0mbmJzcDtBbmFseXplcjo8L3NwYW4+PC9hPjwvcD4KKyAgICAgICAgICAgICAgPGRsPgorICAgICAgICAgICAgICAgIDxkdD48YSBuZy1jbGljaz0idG9nZ2xlQW5hbHl6ZXIoYW5hbHl6ZXIpIiBjbGFzcz0idG9nZ2xlIj57e2FuYWx5emVyLmRldGFpbC5jbGFzc05hbWV9fTwvYT48L2R0PgorICAgICAgICAgICAgICA8L2RsPgorICAgICAgICAgICAgICA8dWwgbmctc2hvdz0iYW5hbHl6ZXIuc2hvdyI+CisgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJjbGVhcmZpeCB7e2NvbXBvbmVudFR5cGUua2V5fX0gZGF0YSIgbmctcmVwZWF0PSJjb21wb25lbnRUeXBlIGluIGFuYWx5emVyLmRldGFpbC5jb21wb25lbnRUeXBlcyIgbmctc2hvdz0iY29tcG9uZW50VHlwZS5jb21wb25lbnRzIj4KKyAgICAgICAgICAgICAgICAgIDxwPnt7Y29tcG9uZW50VHlwZS5sYWJlbH19OjwvcD4KKyAgICAgICAgICAgICAgICAgIDxkbD4KKyAgICAgICAgICAgICAgICAgICAgICA8ZHQgbmctcmVwZWF0LXN0YXJ0PSJjb21wb25lbnQgaW4gY29tcG9uZW50VHlwZS5jb21wb25lbnRzIj57e2NvbXBvbmVudC5jbGFzc05hbWV9fTwvZHQ+CisgICAgICAgICAgICAgICAgICAgICAgPGRkIG5nLXJlcGVhdC1lbmQgbmctcmVwZWF0PSJhcmcgaW4gY29tcG9uZW50LmFyZ3MiCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsYXNzPSJ7J2ljby0xJzogYXJnLmJvb2xlYW5WYWx1ZSwgJ2ljby0wJzogYXJnLmJvb2xlYW5WYWx1ZT09ZmFsc2V9Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAge3thcmcubmFtZX19PHNwYW4gbmctc2hvdz0iYXJnLnZhbHVlIj46IHt7YXJnLnZhbHVlfX08L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgPC9kZD4KKyAgICAgICAgICAgICAgICAgIDwvZGw+CisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgPC91bD4KKworICAgICAgICA8L2Rpdj4KKworICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXJtaW5mby1ob2xkZXIgbG9hZGVkIGNsZWFyZml4IiBuZy1jbGFzcz0ie2Rpc2FibGVkOiBub1Rlcm1EYXRhfSIgbmctc2hvdz0iaXMuZmllbGQiPgorCisgICAgICAgICAgPGRpdiBjbGFzcz0idHJpZ2dlciI+CisKKyAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InN1Ym1pdCIgbmctY2xpY2s9InRvZ2dsZVRlcm1zKCkiPjxzcGFuIG5nLWNsYXNzPSJ7bG9hZGVyOmlzTG9hZGluZ1Rlcm1zfSI+TG9hZCBUZXJtIEluZm88L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICA8YnIvPgorICAgICAgICAgICAgPHNwYW4gbmctc2hvdz0iaXNDbG91ZEVuYWJsZWQiPk4uQi4gTG9hZGVkIGZyb20gYSBzaW5nbGUgY29yZSAtIG5vdCBmcm9tIHRoZSB3aG9sZSBjb2xsZWN0aW9uLjwvc3Bhbj4KKworICAgICAgICAgICAgPGEgbmctc2hvdz0ic2hvd1Rlcm1zIiBuZy1jbGljaz0idG9nZ2xlQXV0b2xvYWQoKSIgbmctY2xhc3M9Intvbjppc0F1dG9sb2FkfSIgY2xhc3M9ImF1dG9sb2FkIiB0aXRsZT0iQXV0b21hdGljYWxseSBsb2FkIFRlcm0gSW5mbz8iPjxzcGFuPkF1dG9sb2FkPC9zcGFuPjwvYT4KKworICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgPHAgbmctc2hvdz0ic2hvd1Rlcm1zICYmIG5vVGVybXMiIGNsYXNzPSJzdGF0dXMiPlNvcnJ5LCBubyBUZXJtIEluZm8gYXZhaWxhYmxlIDooPC9wPgorCisgICAgICAgICAgPGRpdiBuZy1zaG93PSJzaG93VGVybXMgJiYgdGVybUluZm8udG9wVGVybXMiIGNsYXNzPSJ0b3B0ZXJtcy1ob2xkZXIiPgorCisgICAgICAgICAgICA8Zm9ybT4KKyAgICAgICAgICAgIDxwIGNsYXNzPSJoZWFkIj4KKyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5nLW1vZGVsPSJ0b3BUZXJtc0NvdW50IiBuZy1jaGFuZ2U9ImxvYWRUZXJtSW5mbygpIj4KKyAgICAgICAgICAgICAgPGEgY2xhc3M9Im1heC1ob2xkZXIiIG5nLWNsaWNrPSJsb2FkQWxsVG9wVGVybXMoKSIgdGl0bGU9IkxvYWQgYWxsIFRvcC1UZXJtcyI+LzxzcGFuIGNsYXNzPSJtYXgiPnt7dGVybUluZm8ubWF4VGVybXMgfCBudW1iZXJ9fTwvc3Bhbj48L2E+IFRvcC1UZXJtczoKKyAgICAgICAgICAgICAgPGEgaWQ9InF1ZXJ5X2xpbmsiIGhyZWY9IiMve3tjb3JlfX0vcXVlcnk/cT17e25hbWV9fTpbKiBUTyAqXSI+PHNwYW4+UXVlcnk8L3NwYW4+Jm5ic3A7PC9hPgorICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgPC9mb3JtPgorCisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJjbGVhcmZpeCIgbmctcmVwZWF0PSJjb3VudEdyb3VwIGluIHRlcm1JbmZvLnRvcFRlcm1zIj4KKyAgICAgICAgICAgICAgICAgICAgPHA+PHNwYW4+e3tjb3VudEdyb3VwLmNvdW50fX08L3NwYW4+PC9wPgorICAgICAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGkgbmctcmVwZWF0PSJ0ZXJtIGluIGNvdW50R3JvdXAudGVybXMiIG5nLWNsYXNzPSJ7b2RkOiRvZGR9Ij48YSBuZy1ocmVmPSIjL3t7Y29yZX19L3F1ZXJ5P3E9JTdCIXRlcm0rZiUzRHt7bmFtZSB8IHVyaWVuY29kZX19JTdEe3t0ZXJtIHwgdXJpZW5jb2RlfX0iPnt7dGVybX19PC9hPjwvbGk+CisgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgPC9saT4KKworICAgICAgICAgICAgPC91bD4KKworICAgICAgICAgIDwvZGl2PgorCisgICAgICAgICAgPGRpdiBuZy1zaG93PSJzaG93VGVybXMgJiYgdGVybUluZm8uaGlzdG9ncmFtIiBjbGFzcz0iaGlzdG9ncmFtLWhvbGRlciI+CisKKyAgICAgICAgICAgIDxwIGNsYXNzPSJoZWFkIj5IaXN0b2dyYW06PC9wPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgPGxpIG5nLXJlcGVhdD0icm93IGluIHRlcm1JbmZvLmhpc3RvZ3JhbSIgbmctY2xhc3M9IntvZGQ6JG9kZH0iPgorICAgICAgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4IiBzdHlsZT0id2lkdGg6IHt7KCggcm93LnZhbHVlIC8gdGVybUluZm8uaGlzdG9ncmFtTWF4ICkgKiAxMDAgKX19JTsiPgorICAgICAgICAgICAgICAgICAgIDxkdD48c3Bhbj57eyByb3cua2V5IHwgbnVtYmVyfX08L3NwYW4+PC9kdD4KKyAgICAgICAgICAgICAgICAgICA8ZGQ+PHNwYW4+e3sgcm93LnZhbHVlIHwgbnVtYmVyIH19PC9zcGFuPjwvZGQ+CisgICAgICAgICAgICAgICAgIDwvZGw+CisgICAgICAgICAgICAgICA8L2xpPgorCisgICAgICAgICAgICA8L3VsPgorCisgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPC9kaXY+CisKKyAgICAgIDwvZGl2PgorCisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGlkPSJyZWxhdGVkIj4KKyAgICAgPHNlbGVjdCBpZD0idHlwZV9vcl9uYW1lIgorICAgICAgICAgICAgIG5nLW1vZGVsPSJmaWVsZE9yVHlwZSIKKyAgICAgICAgICAgICBjaG9zZW4KKyAgICAgICAgICAgICBkYXRhLXBsYWNlaG9sZGVyPSJQbGVhc2Ugc2VsZWN0IC4uLiIKKyAgICAgICAgICAgICBuZy1jaGFuZ2U9InNlbGVjdEZpZWxkT3JUeXBlKCkiCisgICAgICAgICAgICAgbmctb3B0aW9ucz0iZi52YWx1ZSBhcyBmLmxhYmVsIGdyb3VwIGJ5IGYuZ3JvdXAgZm9yIGYgaW4gZmllbGRzQW5kVHlwZXMiPjwvc2VsZWN0PgorCisgICAgICA8ZGwgaWQ9ImYtZGYtdCI+CisKKyAgICAgICAgPGR0IGNsYXNzPSJmaWVsZCIgbmctY2xhc3M9InthY3RpdmU6IHNlbGVjdGVkVHlwZT09J0ZpZWxkJ30iIG5nLXNob3c9ImxlZnRiYXIuZmllbGRzIj5GaWVsZDwvZHQ+CisgICAgICAgIDxkZCBjbGFzcz0iZmllbGQiIG5nLWNsYXNzPSJ7YWN0aXZlOiBzZWxlY3RlZFR5cGU9PSdGaWVsZCd9IiBuZy1yZXBlYXQ9ImZpZWxkIGluIGxlZnRiYXIuZmllbGRzIj48YSBocmVmPSIjL3t7Y29yZX19L3NjaGVtYT9maWVsZD17e2ZpZWxkfX0iPnt7ZmllbGR9fTwvYT48L2RkPgorCisgICAgICAgIDxkdCBjbGFzcz0iY29weWZpZWxkIiBuZy1zaG93PSJsZWZ0YmFyLmNvcHlGaWVsZFNvdXJjZXMiPkNvcGllZCBmcm9tPC9kdD4KKyAgICAgICAgPGRkIGNsYXNzPSJjb3B5ZmllbGQiIG5nLXJlcGVhdD0iZmllbGQgaW4gbGVmdGJhci5jb3B5RmllbGRTb3VyY2VzIj4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZml4IiBuZy1oaWRlPSJpc1NjaGVtYVVwZGF0YWJsZSI+CisgICAgICAgICAgICAgIDxhIGhyZWY9IiMve3tjb3JlfX0vc2NoZW1hP2ZpZWxkPXt7ZmllbGQubmFtZX19Ij57e2ZpZWxkLm5hbWV9fTwvYT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2xlYXJmaXggdXBkYXRhYmxlIiBuZy1zaG93PSJpc1NjaGVtYVVwZGF0YWJsZSI+CisgICAgICAgICAgICAgIDxhIHN0eWxlPSJmbG9hdDpsZWZ0O3dpZHRoOjgwJSIgaHJlZj0iIy97e2NvcmV9fS9zY2hlbWE/ZmllbGQ9e3tmaWVsZC5uYW1lfX0iPnt7ZmllbGQubmFtZX19PC9hPgorICAgICAgICAgICAgICA8c3BhbiBuZy1jbGljaz0idG9nZ2xlRGVsZXRlQ29weUZpZWxkKGZpZWxkKSIgY2xhc3M9InJlbSI+Jm5ic3A7PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24gZGVsZXRlIiBuZy1zaG93PSJmaWVsZC5zaG93Ij4KKyAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz0iZGVsZXRlIj4KKworICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48ZW0+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIENvcHlGaWVsZD88L2VtPjwvcD4KKyAgICAgICAgICAgICAgICAgIDxkaXYgbmctcmVwZWF0PSJlcnJvciBpbiBmaWVsZC5lcnJvcnMiIG5nLXNob3c9ImZpZWxkLmVycm9ycyIgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiPgorICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2Vycm9yfX08L3NwYW4+PC9kaXY+CisKKyAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBidXR0b25zIj4KKyAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ic3VibWl0IiBuZy1jbGFzcz0ie3N1Y2Nlc3M6IGZpZWxkLmRlbGV0ZWR9IiBuZy1jbGljaz0iZGVsZXRlQ29weUZpZWxkKGZpZWxkLCBmaWVsZC5uYW1lLCBuYW1lKSI+PHNwYW4+RGVsZXRlPC9zcGFuPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InJlc2V0IiBjbGFzcz0icmVzZXQiIG5nLWNsaWNrPSJ0b2dnbGVEZWxldGVDb3B5RmllbGQoZmllbGQpIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGQ+CisKKyAgICAgICAgPGR0IGNsYXNzPSJjb3B5ZmllbGQiIG5nLXNob3c9ImxlZnRiYXIuY29weUZpZWxkRGVzdHMiPkNvcGllZCB0bzwvZHQ+CisgICAgICAgIDxkZCBjbGFzcz0iY29weWZpZWxkIiBuZy1yZXBlYXQ9ImZpZWxkIGluIGxlZnRiYXIuY29weUZpZWxkRGVzdHMiPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2xlYXJmaXgiIG5nLWhpZGU9ImlzU2NoZW1hVXBkYXRhYmxlIj4KKyAgICAgICAgICAgICAgPGEgaHJlZj0iIy97e2NvcmV9fS9zY2hlbWE/ZmllbGQ9e3tmaWVsZC5uYW1lfX0iPnt7ZmllbGQubmFtZX19PC9hPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCB1cGRhdGFibGUiIG5nLXNob3c9ImlzU2NoZW1hVXBkYXRhYmxlIj4KKyAgICAgICAgICAgICAgPGEgaHJlZj0iIy97e2NvcmV9fS9zY2hlbWE/ZmllbGQ9e3tmaWVsZC5uYW1lfX0iPnt7ZmllbGQubmFtZX19PC9hPgorICAgICAgICAgICAgICA8c3BhbiBuZy1jbGljaz0idG9nZ2xlRGVsZXRlQ29weUZpZWxkKGZpZWxkKSIgY2xhc3M9InJlbSI+Jm5ic3A7PC9zcGFuPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24gZGVsZXRlIiBuZy1zaG93PSJmaWVsZC5zaG93Ij4KKyAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz0iZGVsZXRlIj4KKworICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4Ij48ZW0+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIENvcHlGaWVsZD88L2VtPjwvcD4KKyAgICAgICAgICAgICAgICAgIDxkaXYgbmctcmVwZWF0PSJlcnJvciBpbiBmaWVsZC5lcnJvcnMiIG5nLXNob3c9ImZpZWxkLmVycm9ycyIgY2xhc3M9ImNsZWFyZml4IG5vdGUgZXJyb3IiPgorICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2Vycm9yfX08L3NwYW4+PC9kaXY+CisKKyAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCBidXR0b25zIj4KKyAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ic3VibWl0IiBuZy1jbGFzcz0ie3N1Y2Nlc3M6IGZpZWxkLmRlbGV0ZWR9IiBuZy1jbGljaz0iZGVsZXRlQ29weUZpZWxkKGZpZWxkLCBuYW1lLCBmaWVsZC5uYW1lKSI+PHNwYW4+RGVsZXRlPC9zcGFuPjwvYnV0dG9uPgorICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InJlc2V0IiBjbGFzcz0icmVzZXQiIG5nLWNsaWNrPSJ0b2dnbGVEZWxldGVDb3B5RmllbGQoZmllbGQpIj48c3Bhbj5DYW5jZWw8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGQ+CisgICAgICAgIDxkdCBjbGFzcz0iZHluYW1pYy1maWVsZCIgbmctY2xhc3M9InthY3RpdmU6IHNlbGVjdGVkVHlwZT09J0R5bmFtaWMgRmllbGQnfSIgbmctc2hvdz0ibGVmdGJhci5keW5hbWljRmllbGRzIj5EeW5hbWljIEZpZWxkIHt7ZHluYW1pY0ZpZWxkc319IC8ge3tkeW5hbWljRmllbGRzLmxlbmd0aCgpfX08L2R0PgorICAgICAgICA8ZGQgY2xhc3M9ImR5bmFtaWMtZmllbGQiIG5nLWNsYXNzPSJ7YWN0aXZlOiBzZWxlY3RlZFR5cGU9PSdEeW5hbWljIEZpZWxkJ30iIG5nLXJlcGVhdD0iZmllbGQgaW4gbGVmdGJhci5keW5hbWljRmllbGRzIj48YSBocmVmPSIjL3t7Y29yZX19L3NjaGVtYT9keW5hbWljLWZpZWxkPXt7ZmllbGR9fSI+e3tmaWVsZH19PC9hPjwvZGQ+CisKKyAgICAgICAgPGR0IGNsYXNzPSJ0eXBlIiBuZy1jbGFzcz0ie2FjdGl2ZTogc2VsZWN0ZWRUeXBlPT0nVHlwZSd9IiBuZy1zaG93PSJsZWZ0YmFyLnR5cGVzIj5UeXBlPC9kdD4KKyAgICAgICAgPGRkIGNsYXNzPSJ0eXBlIiBuZy1jbGFzcz0ie2FjdGl2ZTogc2VsZWN0ZWRUeXBlPT0nVHlwZSd9IiBuZy1yZXBlYXQ9InR5cGUgaW4gbGVmdGJhci50eXBlcyI+PGEgaHJlZj0iIy97e2NvcmV9fS9zY2hlbWE/dHlwZT17e3R5cGV9fSI+e3t0eXBlfX08L2E+PC9kZD4KKworICAgICAgICA8ZHQ+PC9kdD4KKyAgICAgICAgPGRkIGNsYXNzPSJhY3RpdmUgZGVsZXRlLWZpZWxkIiBuZy1zaG93PSJpc1NjaGVtYVVwZGF0YWJsZSAmYW1wOyZhbXA7IGxlZnRiYXIuZmllbGRzICZhbXA7JmFtcDshc2hvd0RlbGV0ZSI+PGJ1dHRvbiBuZy1jbGljaz0idG9nZ2xlRGVsZXRlKCkiPjxzcGFuPmRlbGV0ZSBmaWVsZDwvc3Bhbj48L2J1dHRvbj48L2RkPgorICAgICAgICA8ZGQgY2xhc3M9ImFjdGl2ZSBkZWxldGUtZmllbGQiIG5nLXNob3c9ImlzU2NoZW1hVXBkYXRhYmxlICZhbXA7JmFtcDsgbGVmdGJhci5keW5hbWljRmllbGRzICZhbXA7JmFtcDshc2hvd0RlbGV0ZSI+PGJ1dHRvbiBuZy1jbGljaz0idG9nZ2xlRGVsZXRlKCkiPjxzcGFuPmRlbGV0ZSBkeW5hbWljIGZpZWxkPC9zcGFuPjwvYnV0dG9uPjwvZGQ+CisKKyAgICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uIGRlbGV0ZSIgbmctc2hvdz0ic2hvd0RlbGV0ZSI+CisKKyAgICAgICAgICAgIDxmb3JtIGNsYXNzPSJkZWxldGUiPgorCisgICAgICAgICAgICAgIDxwIGNsYXNzPSJjbGVhcmZpeCI+PGVtPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB7e3NlbGVjdGVkVHlwZX19PzwvZW0+PC9wPgorICAgICAgICAgICAgICA8ZGl2IG5nLXJlcGVhdD0iZXJyb3IgaW4gZGVsZXRlRXJyb3JzIiBuZy1zaG93PSJkZWxldGVFcnJvcnMiIGNsYXNzPSJjbGVhcmZpeCBub3RlIGVycm9yIj4KKyAgICAgICAgICAgICAgICA8c3Bhbj57e2Vycm9yfX08L3NwYW4+PC9kaXY+CisKKyAgICAgICAgICAgICAgPHAgY2xhc3M9ImNsZWFyZml4IGJ1dHRvbnMiPgorICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InN1Ym1pdCIgbmctY2xhc3M9IntzdWNjZXNzOiBkZWxldGVkfSIgbmctY2xpY2s9ImRlbGV0ZSgpIj48c3Bhbj5EZWxldGU8L3NwYW4+PC9idXR0b24+CisgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJyZXNldCIgY2xhc3M9InJlc2V0IiBuZy1jbGljaz0idG9nZ2xlRGVsZXRlKCkiPjxzcGFuPkNhbmNlbDwvc3Bhbj48L2J1dHRvbj4KKyAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGw+CisKKyAgICAgIDxkbCBjbGFzcz0idWtmLWRzZiI+CisKKyAgICAgICAgPGR0IGNsYXNzPSJ1bmlxdWUta2V5LWZpZWxkIiBuZy1jbGFzcz0ie2FjdGl2ZTogaXNVbmlxdWVLZXlGaWVsZH0iIG5nLXNob3c9InVuaXF1ZUtleUZpZWxkIj5VbmlxdWUgS2V5IEZpZWxkPC9kdD4KKyAgICAgICAgPGRkIGNsYXNzPSJ1bmlxdWUta2V5LWZpZWxkIiBuZy1jbGFzcz0ie2FjdGl2ZTogaXNVbmlxdWVLZXlGaWVsZH0iPjxhIG5nLWhyZWY9IiMve3tjb3JlfX0vc2NoZW1hP2ZpZWxkPXt7dW5pcXVlS2V5RmllbGR9fSI+e3t1bmlxdWVLZXlGaWVsZH19PC9hPjwvZGQ+CisKKyAgICAgICAgPGR0IGNsYXNzPSJkZWZhdWx0LXNlYXJjaC1maWVsZCIgbmctY2xhc3M9InthY3RpdmU6IGlzRGVmYXVsdFNlYXJjaEZpZWxkfSIgbmctc2hvdz0iZGVmYXVsdFNlYXJjaEZpZWxkIj5EZWZhdWx0IFNlYXJjaCBGaWVsZDwvZHQ+CisgICAgICAgIDxkZCBjbGFzcz0iZGVmYXVsdC1zZWFyY2gtZmllbGQiIG5nLWNsYXNzPSJ7YWN0aXZlOiBpc0RlZmF1bHRTZWFyY2hGaWVsZH0iPjxhIG5nLWhyZWY9IiMve3tjb3JlfX0vc2NoZW1hP2ZpZWxkPXt7ZGVmYXVsdFNlYXJjaEZpZWxkfX0iPnt7ZGVmYXVsdFNlYXJjaEZpZWxkfX08L2E+PC9kZD4KKworICAgICAgPC9kbD4KKworICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisKKyAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL3NlZ21lbnRzLmh0bWwgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvc2VnbWVudHMuaHRtbAppbmRleCA5MWYyZWU2Li5lMTE3NGFiIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvc2VnbWVudHMuaHRtbAorKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvc2VnbWVudHMuaHRtbApAQCAtMSw5OSArMSw5OSBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGRpdiBpZD0ic2VnbWVudHMiPiAgDQotICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCI+DQotICAgIA0KLSAgICA8ZGl2IGNsYXNzPSJibG9jayBmaWVsZGxpc3QiIGlkPSJzdGF0aXN0aWNzIj4NCi0gICAgICANCi0gICAgICA8aDI+PHNwYW4+U2VnbWVudHM8L3NwYW4+PC9oMj4NCi0gICAgICAgICAgICA8cCBpZD0iYXV0by1yZWZyZXNoIj48YSBuZy1jbGljaz0idG9nZ2xlQXV0b1JlZnJlc2goKSIgbmctY2xhc3M9IntvbjphdXRvcmVmcmVzaH0iPkF1dG8tUmVmcmVzaDwvYT48L3A+DQotICAgICAgPGEgY2xhc3M9InJlbG9hZCIgbmctY2xpY2s9InJlZnJlc2goKSI+PHNwYW4+cmVsb2FkPC9zcGFuPjwvYT4NCi0gICAgICANCi0gICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRhaW5lciI+DQotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+PC9kaXY+DQotICAgICAgICAgIDwvZGl2Pg0KLSAgDQotICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPiAgICAgICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAgIDxkaXYgaWQ9InJlc3VsdCI+DQotICAgICAgICAgDQotICAgICAgICAgICAgPGRpdiBpZD0icmVzcG9uc2UiPg0KLSAgICAgICAgDQotICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWdtZW50cy1ob2xkZXIiPg0KLSAgICAgIA0KLSAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkbCBjbGFzcz0iY2xlYXJmaXgiIHN0eWxlPSJ3aWR0aDoxMDAlOyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5TaXplPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXJ0Ij4wPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3NSIgbmctcmVwZWF0PSJ4IGluIHhheGlzIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJ4Jmd0OzAuMDAxIj57e3gudmFsdWV9fTwvc3Bhbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1oaWRlPSJ4Jmd0OzAuMDAxIj4mbmJzcDs8L3NwYW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVuZCI+e3tzZWdtZW50TUIgfCBudW1iZXJ9fSBNQjwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGw+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIG5nLXJlcGVhdD0ic2VnbWVudCBpbiBzZWdtZW50cyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRsIGNsYXNzPSJjbGVhcmZpeCIgbmctc3R5bGU9Int3aWR0aDogc2VnbWVudC50b3RhbFNpemUrJyUnfSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eyBzZWdtZW50Lm5hbWUgfX08L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kdD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGl2ZSIgbmctY2xhc3M9InsnbWVyZ2UtY2FuZGlkYXRlJzpzZWdtZW50Lm1lcmdlQ2FuZGlkYXRlfSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctc3R5bGU9Int3aWR0aDogc2VnbWVudC5hbGl2ZURvY1NpemUrJyUnfSI+Jm5ic3A7PC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sdGlwIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlNlZ21lbnQgPGI+e3tzZWdtZW50Lm5hbWV9fTwvYj46PC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPiNkb2NzOjwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgc2VnbWVudC5zaXplIHwgbnVtYmVyIH19PC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPiNkZWxzOjwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgc2VnbWVudC5kZWxDb3VudCB8IG51bWJlciB9fTwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5zaXplOjwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgc2VnbWVudC5zaXplSW5CeXRlcyB8IG51bWJlciB9fSBieXRlczwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hZ2U6PC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eyBzZWdtZW50LmFnZSB9fTwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5zb3VyY2U6PC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eyBzZWdtZW50LnNvdXJjZSB9fTwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWxldGVkIiBuZy1zaG93PSJzZWdtZW50LmRlbGV0ZWREb2NTaXplIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6IHt7IHNlZ21lbnQuZGVsZXRlZERvY1NpemUgfX0lOyBtYXJnaW4tbGVmdDp7eyBzZWdtZW50LmFsaXZlRG9jU2l6ZX19JTsiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOzwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGw+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkbD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0PjwvZHQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD5EZWxldGlvbnM6IHt7IGRlbGV0aW9uc1BlcmNlbnRhZ2UgfX0lPC9kZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgPC9kaXY+DQotICAgICAgICAgIDwvZGl2Pg0KLSAgICA8L2Rpdj4NCi0gICAgDQotICA8L2Rpdj4gIA0KLQ0KLTwvZGl2Pg0KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRpdiBpZD0ic2VnbWVudHMiPiAgCisgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAKKyAgICA8ZGl2IGNsYXNzPSJibG9jayBmaWVsZGxpc3QiIGlkPSJzdGF0aXN0aWNzIj4KKyAgICAgIAorICAgICAgPGgyPjxzcGFuPlNlZ21lbnRzPC9zcGFuPjwvaDI+CisgICAgICAgICAgICA8cCBpZD0iYXV0by1yZWZyZXNoIj48YSBuZy1jbGljaz0idG9nZ2xlQXV0b1JlZnJlc2goKSIgbmctY2xhc3M9IntvbjphdXRvcmVmcmVzaH0iPkF1dG8tUmVmcmVzaDwvYT48L3A+CisgICAgICA8YSBjbGFzcz0icmVsb2FkIiBuZy1jbGljaz0icmVmcmVzaCgpIj48c3Bhbj5yZWxvYWQ8L3NwYW4+PC9hPgorICAgICAgCisgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRhaW5lciI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj48L2Rpdj4KKyAgICAgICAgICA8L2Rpdj4KKyAgCisgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+ICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICAgIDxkaXYgaWQ9InJlc3VsdCI+CisgICAgICAgICAKKyAgICAgICAgICAgIDxkaXYgaWQ9InJlc3BvbnNlIj4KKyAgICAgICAgCisgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlZ21lbnRzLWhvbGRlciI+CisgICAgICAKKyAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGwgY2xhc3M9ImNsZWFyZml4IiBzdHlsZT0id2lkdGg6MTAwJTsiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlNpemU8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhcnQiPjA8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idzUiIG5nLXJlcGVhdD0ieCBpbiB4YXhpcyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJ4Jmd0OzAuMDAxIj57e3gudmFsdWV9fTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG5nLWhpZGU9IngmZ3Q7MC4wMDEiPiZuYnNwOzwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImVuZCI+e3tzZWdtZW50TUIgfCBudW1iZXJ9fSBNQjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgbmctcmVwZWF0PSJzZWdtZW50IGluIHNlZ21lbnRzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkbCBjbGFzcz0iY2xlYXJmaXgiIG5nLXN0eWxlPSJ7d2lkdGg6IHNlZ21lbnQudG90YWxTaXplKyclJ30iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IHNlZ21lbnQubmFtZSB9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsaXZlIiBuZy1jbGFzcz0ieydtZXJnZS1jYW5kaWRhdGUnOnNlZ21lbnQubWVyZ2VDYW5kaWRhdGV9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLXN0eWxlPSJ7d2lkdGg6IHNlZ21lbnQuYWxpdmVEb2NTaXplKyclJ30iPiZuYnNwOzwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sdGlwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+U2VnbWVudCA8Yj57e3NlZ21lbnQubmFtZX19PC9iPjo8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj4jZG9jczo8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgc2VnbWVudC5zaXplIHwgbnVtYmVyIH19PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+I2RlbHM6PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IHNlZ21lbnQuZGVsQ291bnQgfCBudW1iZXIgfX08L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5zaXplOjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eyBzZWdtZW50LnNpemVJbkJ5dGVzIHwgbnVtYmVyIH19IGJ5dGVzPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YWdlOjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eyBzZWdtZW50LmFnZSB9fTwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnNvdXJjZTo8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgc2VnbWVudC5zb3VyY2UgfX08L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlbGV0ZWQiIG5nLXNob3c9InNlZ21lbnQuZGVsZXRlZERvY1NpemUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiB7eyBzZWdtZW50LmRlbGV0ZWREb2NTaXplIH19JTsgbWFyZ2luLWxlZnQ6e3sgc2VnbWVudC5hbGl2ZURvY1NpemV9fSU7Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOzwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0PjwvZHQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkPkRlbGV0aW9uczoge3sgZGVsZXRpb25zUGVyY2VudGFnZSB9fSU8L2RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgCisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIAorICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICAKKyAgPC9kaXY+ICAKKworPC9kaXY+CmRpZmYgLS1naXQgYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvc3RyZWFtLmh0bWwgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvc3RyZWFtLmh0bWwKaW5kZXggN2QxNjVhNy4uMGQxMTU0ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL3N0cmVhbS5odG1sCisrKyBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy9zdHJlYW0uaHRtbApAQCAtMSw2NCArMSw2NCBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLWNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLXRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGRpdiBpZD0ic3RyZWFtIiBjbGFzcz0iY2xlYXJmaXgiPg0KLQ0KLSAgPGRpdiBpZD0iZm9ybSI+DQotICAgIDxmb3JtPg0KLSAgICAgIDxsYWJlbCBmb3I9ImV4cHIiIHRpdGxlPSJUaGUgZXhwcmVzc2lvbiBzdHJpbmciPg0KLSAgICAgICAgU3RyZWFtaW5nIEV4cHJlc3Npb24gKGV4cHIpDQotICAgICAgPC9sYWJlbD4NCi0gICAgICA8dGV4dGFyZWEgbmFtZT0iZXhwciIgbmctbW9kZWw9ImV4cHIiIGlkPSJleHByIiB0aXRsZT0iVGhlIGV4cHJlc3Npb24gc3RyaW5nLiI+c2VhcmNoKC4uLi4pPC90ZXh0YXJlYT4NCi0NCi0gICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgbmctY2xpY2s9ImRvU3RyZWFtKCkiPkV4ZWN1dGU8L2J1dHRvbj4NCi0gICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJkb0V4cGxhbmF0aW9uIiBuYW1lPSJkb0V4cGxhbmF0aW9uIiBpZD0iZG9FeHBsYW5hdGlvbiIgdmFsdWU9InRydWUiPg0KLSAgICAgIDxsYWJlbCBmb3I9ImV4cGxhaW4iIGNsYXNzPSJjaGVja2JveCIgdGl0bGU9IkVuYWJsZSBFeHBsYW5hdGlvbi4iIG5nLWNsaWNrPSJkb0V4cGxhbmF0aW9uID0gIWRvRXhwbGFuYXRpb24iPg0KLSAgICAgICAgd2l0aCBleHBsYW5hdGlvbg0KLSAgICAgIDwvbGFiZWw+DQotICAgICAgDQotICAgIDwvZm9ybT4NCi0gIDwvZGl2Pg0KLQ0KLSAgPGRpdiBpZD0icmVzdWx0Ij4NCi0NCi0gICAgPGEgbmctc2hvdz0icmVzcG9uc2UuZGF0YSIgaWQ9InVybCIgY2xhc3M9ImFkZHJlc3MtYmFyIiBuZy1ocmVmPSJ7e3VybH19Ij57e3VybH19PC9hPg0KLQ0KLSAgICA8ZGl2IG5nLXNob3c9InNob3dFeHBsYW5hdGlvbiIgaWQ9ImV4cGxhbmF0aW9uIiBjbGFzcz0iY2xlYXJmaXgiPg0KLSAgICAgIDxkaXYgaWQ9ImZyYW1lIj4NCi0gICAgICAgIDxkaXYgZXhwbGFuYXRpb24tZ3JhcGggaWQ9ImV4cGxhbmF0aW9uLWNvbnRlbnQiIGRhdGE9ImV4cGxhbmF0aW9uRGF0YSIgZGVwdGg9ImRlcHRoIiBsZWFmLWNvdW50PSJsZWFmQ291bnQiIGNsYXNzPSJjb250ZW50IGNsZWFyZml4IiBuZy1zaG93PSJzaG93R3JhcGgiPg0KLSAgICAgICAgICA8ZGl2IGlkPSJsZWdlbmQiPg0KLSAgICAgICAgICAgIDxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTUiPg0KLSAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1LDEwKSIgY2xhc3M9InN0cmVhbS1kZWNvcmF0b3IiPjxjaXJjbGUgcj0iNC41Ij48L2NpcmNsZT48L2c+DQotICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1LDE0KSI+PHRleHQ+U3RyZWFtIERlY29yYXRvcjwvdGV4dD48L2c+DQotICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE0MCwxMCkiIGNsYXNzPSJzdHJlYW0tc291cmNlIj48Y2lyY2xlIHI9IjQuNSI+PC9jaXJjbGU+PC9nPg0KLSAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNTAsMTQpIj48dGV4dD5TdHJlYW0gU291cmNlPC90ZXh0PjwvZz4NCi0gICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjYwLDEwKSIgY2xhc3M9ImdyYXBoLXNvdXJjZSI+PGNpcmNsZSByPSI0LjUiPjwvY2lyY2xlPjwvZz4NCi0gICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjcwLDE0KSI+PHRleHQ+R3JhcGggU291cmNlPC90ZXh0PjwvZz4NCi0gICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzc1LDEwKSIgY2xhc3M9ImRhdGFzdG9yZSI+PGNpcmNsZSByPSI0LjUiPjwvY2lyY2xlPjwvZz4NCi0gICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzg1LDE0KSI+PHRleHQ+RGF0YXN0b3JlPC90ZXh0PjwvZz4NCi0gICAgICAgICAgICA8L3N2Zz4NCi0gICAgICAgICAgPC9kaXY+DQotICAgICAgICAgIDxkaXYgaWQ9ImNhbnZhcyI+PC9kaXY+DQotICAgICAgICA8L2Rpdj4NCi0gICAgICA8L2Rpdj4NCi0gICAgPC9kaXY+DQotDQotICAgIDxkaXYgaWQ9InJlc3BvbnNlIj4NCi0gICAgICA8cHJlIGNsYXNzPSJzeW50YXggbGFuZ3VhZ2UtanNvbiI+PGNvZGUgbmctYmluZC1odG1sPSJyZXNwb25zZS5kYXRhIHwgaGlnaGxpZ2h0Ompzb24gfCB1bnNhZmUiPjwvY29kZT48L3ByZT4NCi0gICAgPC9kaXY+DQotICA8L2Rpdj4NCi0NCi08L2Rpdj4NCis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkaXYgaWQ9InN0cmVhbSIgY2xhc3M9ImNsZWFyZml4Ij4KKworICA8ZGl2IGlkPSJmb3JtIj4KKyAgICA8Zm9ybT4KKyAgICAgIDxsYWJlbCBmb3I9ImV4cHIiIHRpdGxlPSJUaGUgZXhwcmVzc2lvbiBzdHJpbmciPgorICAgICAgICBTdHJlYW1pbmcgRXhwcmVzc2lvbiAoZXhwcikKKyAgICAgIDwvbGFiZWw+CisgICAgICA8dGV4dGFyZWEgbmFtZT0iZXhwciIgbmctbW9kZWw9ImV4cHIiIGlkPSJleHByIiB0aXRsZT0iVGhlIGV4cHJlc3Npb24gc3RyaW5nLiI+c2VhcmNoKC4uLi4pPC90ZXh0YXJlYT4KKworICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5nLWNsaWNrPSJkb1N0cmVhbSgpIj5FeGVjdXRlPC9idXR0b24+CisgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nLW1vZGVsPSJkb0V4cGxhbmF0aW9uIiBuYW1lPSJkb0V4cGxhbmF0aW9uIiBpZD0iZG9FeHBsYW5hdGlvbiIgdmFsdWU9InRydWUiPgorICAgICAgPGxhYmVsIGZvcj0iZXhwbGFpbiIgY2xhc3M9ImNoZWNrYm94IiB0aXRsZT0iRW5hYmxlIEV4cGxhbmF0aW9uLiIgbmctY2xpY2s9ImRvRXhwbGFuYXRpb24gPSAhZG9FeHBsYW5hdGlvbiI+CisgICAgICAgIHdpdGggZXhwbGFuYXRpb24KKyAgICAgIDwvbGFiZWw+CisgICAgICAKKyAgICA8L2Zvcm0+CisgIDwvZGl2PgorCisgIDxkaXYgaWQ9InJlc3VsdCI+CisKKyAgICA8YSBuZy1zaG93PSJyZXNwb25zZS5kYXRhIiBpZD0idXJsIiBjbGFzcz0iYWRkcmVzcy1iYXIiIG5nLWhyZWY9Int7dXJsfX0iPnt7dXJsfX08L2E+CisKKyAgICA8ZGl2IG5nLXNob3c9InNob3dFeHBsYW5hdGlvbiIgaWQ9ImV4cGxhbmF0aW9uIiBjbGFzcz0iY2xlYXJmaXgiPgorICAgICAgPGRpdiBpZD0iZnJhbWUiPgorICAgICAgICA8ZGl2IGV4cGxhbmF0aW9uLWdyYXBoIGlkPSJleHBsYW5hdGlvbi1jb250ZW50IiBkYXRhPSJleHBsYW5hdGlvbkRhdGEiIGRlcHRoPSJkZXB0aCIgbGVhZi1jb3VudD0ibGVhZkNvdW50IiBjbGFzcz0iY29udGVudCBjbGVhcmZpeCIgbmctc2hvdz0ic2hvd0dyYXBoIj4KKyAgICAgICAgICA8ZGl2IGlkPSJsZWdlbmQiPgorICAgICAgICAgICAgPHN2ZyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxNSI+CisgICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSwxMCkiIGNsYXNzPSJzdHJlYW0tZGVjb3JhdG9yIj48Y2lyY2xlIHI9IjQuNSI+PC9jaXJjbGU+PC9nPgorICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1LDE0KSI+PHRleHQ+U3RyZWFtIERlY29yYXRvcjwvdGV4dD48L2c+CisgICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQwLDEwKSIgY2xhc3M9InN0cmVhbS1zb3VyY2UiPjxjaXJjbGUgcj0iNC41Ij48L2NpcmNsZT48L2c+CisgICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTUwLDE0KSI+PHRleHQ+U3RyZWFtIFNvdXJjZTwvdGV4dD48L2c+CisgICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjYwLDEwKSIgY2xhc3M9ImdyYXBoLXNvdXJjZSI+PGNpcmNsZSByPSI0LjUiPjwvY2lyY2xlPjwvZz4KKyAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNzAsMTQpIj48dGV4dD5HcmFwaCBTb3VyY2U8L3RleHQ+PC9nPgorICAgICAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM3NSwxMCkiIGNsYXNzPSJkYXRhc3RvcmUiPjxjaXJjbGUgcj0iNC41Ij48L2NpcmNsZT48L2c+CisgICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzg1LDE0KSI+PHRleHQ+RGF0YXN0b3JlPC90ZXh0PjwvZz4KKyAgICAgICAgICAgIDwvc3ZnPgorICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIDxkaXYgaWQ9ImNhbnZhcyI+PC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKyAgICA8ZGl2IGlkPSJyZXNwb25zZSI+CisgICAgICA8cHJlIGNsYXNzPSJzeW50YXggbGFuZ3VhZ2UtanNvbiI+PGNvZGUgbmctYmluZC1odG1sPSJyZXNwb25zZS5kYXRhIHwgaGlnaGxpZ2h0Ompzb24gfCB1bnNhZmUiPjwvY29kZT48L3ByZT4KKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKzwvZGl2PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL3RocmVhZHMuaHRtbCBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci9wYXJ0aWFscy90aHJlYWRzLmh0bWwKaW5kZXggMjk1ZjM5My4uZjFlNmZkZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3BhcnRpYWxzL3RocmVhZHMuaHRtbAorKysgYi9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvcGFydGlhbHMvdGhyZWFkcy5odG1sCkBAIC0xLDY1ICsxLDY1IEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZGl2IGlkPSJ0aHJlYWRzIiBuZy1jbGFzcz0ic2hvd0FsbFN0YWNrdHJhY2VzID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnIj4NCi0NCi0gIDxkaXYgY2xhc3M9ImNvbnRyb2xzIj4NCi0gICAgPGEgbmctY2xpY2s9InRvZ2dsZVN0YWNrdHJhY2VzKCkiPg0KLSAgICAgIDxzcGFuPnt7c2hvd0FsbFN0YWNrdHJhY2VzPyJIaWRlIjoiU2hvdyJ9fSBhbGwgU3RhY2t0cmFjZXM8L3NwYW4+DQotICAgIDwvYT4NCi0gIDwvZGl2Pg0KLQ0KLSAgPGRpdiBpZD0idGhyZWFkLWR1bXAiPg0KLQ0KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPg0KLQ0KLSAgICAgIDx0aGVhZD4NCi0NCi0gICAgICAgIDx0cj4NCi0NCi0gICAgICAgICAgPHRoIGNsYXNzPSJuYW1lIj5uYW1lPC90aD4NCi0gICAgICAgICAgPHRoIGNsYXNzPSJ0aW1lIj5jcHVUaW1lIC8gdXNlclRpbWU8L3RoPg0KLQ0KLSAgICAgICAgPC90cj4NCi0NCi0gICAgICA8L3RoZWFkPg0KLQ0KLSAgICAgIDx0Ym9keT4NCi0gICAgICAgIDx0ciBuZy1yZXBlYXQ9InRocmVhZCBpbiB0aHJlYWRzIiBjbGFzcz0ie3skb2RkPydvZGQnOicnfX0ge3t0aHJlYWQubG9jaz8nbG9jayc6Jyd9fSB7e3RocmVhZC5zdGFja1RyYWNlPydzdGFja3RyYWNlJzonJ319IHt7dGhyZWFkLnN0YXRlfX0iPg0KLSAgICAgICAgICA8dGQgY2xhc3M9Im5hbWUiPg0KLSAgICAgICAgICAgIDxhIHRpdGxlPSJ7e3RocmVhZC5zdGF0ZX19IiBuZy1jbGljaz0idG9nZ2xlU3RhY2t0cmFjZSh0aHJlYWQpIj48c3Bhbj57e3RocmVhZC5uYW1lfX0gKHt7dGhyZWFkLmlkfX0pPC9zcGFuPjwvYT4NCi0gICAgICAgICAgICA8cCB0aXRsZT0iV2FpdGluZyBvbiIgbmctc2hvdz0idGhyZWFkLmxvY2siPnt7dGhyZWFkLmxvY2t9fTwvcD4NCi0gICAgICAgICAgICA8ZGl2IG5nLXNob3c9InRocmVhZC5zaG93U3RhY2tUcmFjZSI+DQotICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9InRyYWNlIGluIHRocmVhZC5zdGFja1RyYWNlIHRyYWNrIGJ5IHRyYWNlLmlkIj57e3RyYWNlLnRyYWNlfX08L2xpPg0KLSAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgPHRkIGNsYXNzPSJ0aW1lIj57e3RocmVhZC5jcHVUaW1lfX08YnI+e3t0aHJlYWQudXNlclRpbWV9fTwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgIDwvdGJvZHk+DQotDQotICAgIDwvdGFibGU+DQotDQotICA8L2Rpdj4NCi0NCi0gIDxkaXYgY2xhc3M9ImNvbnRyb2xzIj4NCi0gICAgPGEgbmctY2xpY2s9InRvZ2dsZVN0YWNrdHJhY2VzKCkiPg0KLSAgICAgIDxzcGFuPnt7c2hvd0FsbFN0YWNrdHJhY2VzPyJIaWRlIjoiU2hvdyJ9fSBhbGwgU3RhY2t0cmFjZXM8L3NwYW4+DQotICAgIDwvYT4NCi0gIDwvZGl2Pg0KLQ0KLTwvZGl2Pg0KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRpdiBpZD0idGhyZWFkcyIgbmctY2xhc3M9InNob3dBbGxTdGFja3RyYWNlcyA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJyI+CisKKyAgPGRpdiBjbGFzcz0iY29udHJvbHMiPgorICAgIDxhIG5nLWNsaWNrPSJ0b2dnbGVTdGFja3RyYWNlcygpIj4KKyAgICAgIDxzcGFuPnt7c2hvd0FsbFN0YWNrdHJhY2VzPyJIaWRlIjoiU2hvdyJ9fSBhbGwgU3RhY2t0cmFjZXM8L3NwYW4+CisgICAgPC9hPgorICA8L2Rpdj4KKworICA8ZGl2IGlkPSJ0aHJlYWQtZHVtcCI+CisKKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorCisgICAgICA8dGhlYWQ+CisKKyAgICAgICAgPHRyPgorCisgICAgICAgICAgPHRoIGNsYXNzPSJuYW1lIj5uYW1lPC90aD4KKyAgICAgICAgICA8dGggY2xhc3M9InRpbWUiPmNwdVRpbWUgLyB1c2VyVGltZTwvdGg+CisKKyAgICAgICAgPC90cj4KKworICAgICAgPC90aGVhZD4KKworICAgICAgPHRib2R5PgorICAgICAgICA8dHIgbmctcmVwZWF0PSJ0aHJlYWQgaW4gdGhyZWFkcyIgY2xhc3M9Int7JG9kZD8nb2RkJzonJ319IHt7dGhyZWFkLmxvY2s/J2xvY2snOicnfX0ge3t0aHJlYWQuc3RhY2tUcmFjZT8nc3RhY2t0cmFjZSc6Jyd9fSB7e3RocmVhZC5zdGF0ZX19Ij4KKyAgICAgICAgICA8dGQgY2xhc3M9Im5hbWUiPgorICAgICAgICAgICAgPGEgdGl0bGU9Int7dGhyZWFkLnN0YXRlfX0iIG5nLWNsaWNrPSJ0b2dnbGVTdGFja3RyYWNlKHRocmVhZCkiPjxzcGFuPnt7dGhyZWFkLm5hbWV9fSAoe3t0aHJlYWQuaWR9fSk8L3NwYW4+PC9hPgorICAgICAgICAgICAgPHAgdGl0bGU9IldhaXRpbmcgb24iIG5nLXNob3c9InRocmVhZC5sb2NrIj57e3RocmVhZC5sb2NrfX08L3A+CisgICAgICAgICAgICA8ZGl2IG5nLXNob3c9InRocmVhZC5zaG93U3RhY2tUcmFjZSI+CisgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICA8bGkgbmctcmVwZWF0PSJ0cmFjZSBpbiB0aHJlYWQuc3RhY2tUcmFjZSB0cmFjayBieSB0cmFjZS5pZCI+e3t0cmFjZS50cmFjZX19PC9saT4KKyAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIGNsYXNzPSJ0aW1lIj57e3RocmVhZC5jcHVUaW1lfX08YnI+e3t0aHJlYWQudXNlclRpbWV9fTwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICA8L3Rib2R5PgorCisgICAgPC90YWJsZT4KKworICA8L2Rpdj4KKworICA8ZGl2IGNsYXNzPSJjb250cm9scyI+CisgICAgPGEgbmctY2xpY2s9InRvZ2dsZVN0YWNrdHJhY2VzKCkiPgorICAgICAgPHNwYW4+e3tzaG93QWxsU3RhY2t0cmFjZXM/IkhpZGUiOiJTaG93In19IGFsbCBTdGFja3RyYWNlczwvc3Bhbj4KKyAgICA8L2E+CisgIDwvZGl2PgorCis8L2Rpdj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci90cGwvc2VnbWVudHMuaHRtbCBiL3BsdWdpbnMvc29sci93ZWJhcHAvc29sci90cGwvc2VnbWVudHMuaHRtbAppbmRleCA1Y2U0ZWRiLi43MGJkOGVkIDEwMDY0NAotLS0gYS9wbHVnaW5zL3NvbHIvd2ViYXBwL3NvbHIvdHBsL3NlZ21lbnRzLmh0bWwKKysrIGIvcGx1Z2lucy9zb2xyL3dlYmFwcC9zb2xyL3RwbC9zZWdtZW50cy5odG1sCkBAIC0xLDQ5ICsxLDQ5IEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLVRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi10aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08ZGl2IGlkPSJzZWdtZW50cyI+ICANCi0gIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4NCi0gICAgDQotICAgIDxkaXYgY2xhc3M9ImJsb2NrIGZpZWxkbGlzdCIgaWQ9InN0YXRpc3RpY3MiPg0KLSAgICAgIA0KLSAgICAgIDxoMj48c3Bhbj5TZWdtZW50czwvc3Bhbj48L2gyPg0KLSAgICAgIDxhIGNsYXNzPSJyZWxvYWQiPjxzcGFuPnJlbG9hZDwvc3Bhbj48L2E+DQotICAgICAgDQotICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiPg0KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPjwvZGl2Pg0KLSAgICAgICAgICA8L2Rpdj4NCi0NCi0gICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+ICAgICAgICAgICAgDQotICAgICAgICANCi0gICAgICAgICAgPGRpdiBpZD0icmVzdWx0Ij4NCi0gICAgICAgICANCi0gICAgICAgICAgICA8ZGl2IGlkPSJyZXNwb25zZSI+DQotICAgICAgICANCi0gICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlZ21lbnRzLWhvbGRlciI+DQotICAgICAgDQotICAgICAgICAgICAgICAgICA8dWw+PC91bD4NCi0gICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgPC9kaXY+DQotICAgICAgICAgIDwvZGl2Pg0KLSAgICA8L2Rpdj4NCi0gICAgDQotICA8L2Rpdj4gIA0KLQ0KLTwvZGl2Pg0KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRpdiBpZD0ic2VnbWVudHMiPiAgCisgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij4KKyAgICAKKyAgICA8ZGl2IGNsYXNzPSJibG9jayBmaWVsZGxpc3QiIGlkPSJzdGF0aXN0aWNzIj4KKyAgICAgIAorICAgICAgPGgyPjxzcGFuPlNlZ21lbnRzPC9zcGFuPjwvaDI+CisgICAgICA8YSBjbGFzcz0icmVsb2FkIj48c3Bhbj5yZWxvYWQ8L3NwYW4+PC9hPgorICAgICAgCisgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRhaW5lciI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj48L2Rpdj4KKyAgICAgICAgICA8L2Rpdj4KKworICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPiAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICA8ZGl2IGlkPSJyZXN1bHQiPgorICAgICAgICAgCisgICAgICAgICAgICA8ZGl2IGlkPSJyZXNwb25zZSI+CisgICAgICAgIAorICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWdtZW50cy1ob2xkZXIiPgorICAgICAgCisgICAgICAgICAgICAgICAgIDx1bD48L3VsPgorICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgCisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIAorICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICAKKyAgPC9kaXY+ICAKKworPC9kaXY+CmRpZmYgLS1naXQgYS90aGVtZXMvYmx1ZWxpZ2h0L3dlYmFwcC9ibHVlbGlnaHQvZG9jYm9vay5jc3MgYi90aGVtZXMvYmx1ZWxpZ2h0L3dlYmFwcC9ibHVlbGlnaHQvZG9jYm9vay5jc3MKaW5kZXggMTMzMWExZS4uNzVlNjkxYSAxMDA2NDQKLS0tIGEvdGhlbWVzL2JsdWVsaWdodC93ZWJhcHAvYmx1ZWxpZ2h0L2RvY2Jvb2suY3NzCisrKyBiL3RoZW1lcy9ibHVlbGlnaHQvd2ViYXBwL2JsdWVsaWdodC9kb2Nib29rLmNzcwpAQCAtMSwzNTAgKzEsMzUwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi1BUEFDSEUgT0ZCSVoNCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLWJvZHkgew0KLSAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoL2ltYWdlcy9vZmJpel9sb2dvLmdpZikgbm8tcmVwZWF0IHNjcm9sbCBsZWZ0IHRvcDsNCi0gICAgY29sb3I6ICMwMDA7DQotICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KLSAgICBmb250LXNpemU6IC43NWVtOw0KLSAgICBsaW5lLWhlaWdodDogMS41ZW07DQotICAgIHBhZGRpbmc6IDUwcHggMCAwOw0KLSAgICBiZ2NvbG9yOiAjZmZmZmNjOw0KLX0NCi0NCi1hOmhvdmVyIHsNCi0gICAgY29sb3I6ICMxMTExMTE7DQotICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KLX0NCi0NCi1hOnZpc2l0ZWQgew0KLSAgICBjb2xvcjogIzAwMDsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQotfQ0KLQ0KLWEgew0KLSAgICBjb2xvcjogIzU1NTsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQotfQ0KLQ0KLWRpdi5hYnN0cmFjdCB7DQotICAgIGJvcmRlcjogc29saWQgMnB4Ow0KLSAgICBwYWRkaW5nLWxlZnQ6IDEwcHQ7DQotICAgIHBhZGRpbmctcmlnaHQ6IDEwcHQ7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmY2M7DQotfQ0KLQ0KLXByZS5zY3JlZW4gew0KLSAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOw0KLSAgICB3aGl0ZS1zcGFjZTogcHJlOw0KLSAgICB3aWR0aDogMTAwJTsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZjYzsNCi0gICAgYm9yZGVyOiBzb2xpZDsNCi0gICAgY29sb3I6ICMwMDAwMDA7DQotICAgIGJvcmRlci1jb2xvcjogIzAwOTk5OTsNCi0gICAgYm9yZGVyLWxlZnQ6IHNvbGlkICMwMDk5OTkgMnB4Ow0KLSAgICBib3JkZXItcmlnaHQ6IHNvbGlkICMwMDk5OTkgMnB4Ow0KLSAgICBib3JkZXItdG9wOiBzb2xpZCAjMDA5OTk5IDJweDsNCi0gICAgYm9yZGVyLWJvdHRvbTogc29saWQgIzAwOTk5OSAycHg7DQotDQotICAgIHBhZGRpbmctbGVmdDogMTVwdDsNCi19DQotDQotcHJlLnByb2dyYW1saXN0aW5nIHsNCi0gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCi0gICAgd2hpdGUtc3BhY2U6IHByZTsNCi0gICAgd2lkdGg6IDEwMCU7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmY2M7DQotICAgIGJvcmRlcjogc29saWQ7DQotICAgIGNvbG9yOiAjMDAwMDAwOw0KLSAgICBib3JkZXItY29sb3I6ICMwMDk5OTk7DQotICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjMDA5OTk5IDJweDsNCi0gICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAjMDA5OTk5IDJweDsNCi0gICAgYm9yZGVyLXRvcDogc29saWQgIzAwOTk5OSAycHg7DQotICAgIGJvcmRlci1ib3R0b206IHNvbGlkICMwMDk5OTkgMnB4Ow0KLQ0KLSAgICBwYWRkaW5nLWxlZnQ6IDE1cHQ7DQotfQ0KLQ0KLWgxIHsNCi0gICAgY29sb3I6ICNmZmZmZmY7DQotICAgIGJvcmRlcjogc29saWQgM3B4ICNhMGEwZDA7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICM2MDYwOTA7DQotICAgIGZvbnQtdmFyaWFudDogc21hbGwtY2FwczsNCi0gICAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLWgxLnRpdGxlIHsNCi0gICAgY29sb3I6ICNmZmZmZmY7DQotICAgIGJvcmRlcjogc29saWQgM3B4ICNhMGEwZDA7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICM2MDYwOTA7DQotICAgIGZvbnQtdmFyaWFudDogc21hbGwtY2FwczsNCi0gICAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLS50aXRsZSBhIHsNCi0gICAgY29sb3I6ICNmZmZmZmM7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotLnRpdGxlIGE6YWN0aXZlIHsNCi0gICAgY29sb3I6ICNmZmZmZmY7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotLnRpdGxlIGE6dmlzaXRlZCB7DQotICAgIGNvbG9yOiAjZmZmZmZmOw0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLWgyIHsNCi0gICAgY29sb3I6ICNmZmZmZmY7DQotICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2EwYTBkMDsNCi0gICAgYm9yZGVyOiBzb2xpZCAzcHggIzYwNjA5MDsNCi0gICAgcGFkZGluZzogMXB4DQotfQ0KLQ0KLXRhYmxlLmltcG9ydGFudCB7DQotICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsNCi0gICAgYm9yZGVyOiBzb2xpZCAycHggI2ZmMDAwMDsNCi0gICAgd2lkdGg6IDcwJTsNCi0gICAgbWFyZ2luLWxlZnQ6IDE1JTsNCi19DQotDQotdGFibGUuY2F1dGlvbiB7DQotICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsNCi0gICAgYm9yZGVyOiByaWRnZSAycHggI2ZmZmYwMDsNCi0gICAgd2lkdGg6IDcwJTsNCi0gICAgbWFyZ2luLWxlZnQ6IDE1JTsNCi19DQotDQotdGFibGUubm90ZSB7DQotICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsNCi0gICAgYm9yZGVyOiBzb2xpZCAxcHggIzAwMDAwMDsNCi0gICAgd2lkdGg6IDcwJTsNCi0gICAgbWFyZ2luLWxlZnQ6IDE1JTsNCi19DQotDQotdGFibGUudGlwIHsNCi0gICAgZm9udC1zdHlsZTogaXRhbGljOw0KLSAgICBib3JkZXI6IHNvbGlkIDFweCAjMDAwMDAwOw0KLSAgICB3aWR0aDogNzAlOw0KLSAgICBtYXJnaW4tbGVmdDogMTUlOw0KLX0NCi0NCi10YWJsZS53YXJuaW5nIHsNCi0gICAgZm9udC1zdHlsZTogaXRhbGljOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgYm9yZGVyOiByaWRnZSA0cHggI2ZmMDAwMDsNCi0NCi0gICAgd2lkdGg6IDcwJTsNCi0gICAgbWFyZ2luLWxlZnQ6IDE1JTsNCi19DQotDQotZGl2LnZhcmlhYmxlbGlzdCB7DQotICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOw0KLSAgICBmb250LXN0eWxlOiBub3JtYWw7DQotICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICAgIHBhZGRpbmctbGVmdDogMjBweDsNCi19DQotDQotLnZhcmxpc3RlbnRyeSB7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICBtYXJnaW4tdG9wOiAxMHB4Ow0KLSAgICBjb2xvcjogI2ZmZmZmZjsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2EwYTBkMDsNCi0gICAgYm9yZGVyOiBzb2xpZCAxcHggIzYwNjA5MDsNCi0gICAgcGFkZGluZzogMXB4DQotfQ0KLQ0KLS8qDQotICogc2VlIGh0dHA6Ly9kaXZlaW50b2FjY2Vzc2liaWxpdHkub3JnL2RheV8yNl91c2luZ19yZWxhdGl2ZV9mb250X3NpemVzLmh0bWwNCi0gKiBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGZvbGxvd2luZyBmZXcgY29tbWFuZHMuDQotICogdGhleSBhcmUgcmVhbGx5IHRvbyBjb21wbGljYXRlZCB0byBleHBsYWluIGhlcmUgaW4gYWxsIGRlcHRoLiA7LSkNCi0gKi8NCi0NCi1wIHsNCi0gICAgZm9udC1zaXplOiAxMnB4Ow0KLX0NCi0NCi0vKmF7fQ0KLWJvZHkgcCB7DQotICAgICAgICBmb250LXNpemU6IHgtc21hbGw7DQotICAgICAgICB2b2ljZS1mYW1pbHk6ICJcIn1cIiI7DQotICAgICAgICB2b2ljZS1mYW1pbHk6IGluaGVyaXQ7DQotICAgICAgICBmb250LXNpemU6IHNtYWxsOw0KLX0NCi0NCi1odG1sPmJvZHkgcCB7DQotICAgICAgICBmb250LXNpemU6IHNtYWxsOw0KLX0NCi0qLw0KLQ0KLS8qIGFkZCBhbiBleHRlcm5hbC1saW5rIGljb24gdG8gYWJzb2x1dGUgbGlua3MgKi8NCi1hW2hyZWZePSJodHRwOiJdIHsNCi0gICAgYmFja2dyb3VuZDogdXJsKGltYWdlcy9yZW1vdGUuZ2lmKSByaWdodCBjZW50ZXIgbm8tcmVwZWF0Ow0KLSAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4Ow0KLX0NCi0NCi1hW2hyZWZePSJodHRwOiJdOmhvdmVyIHsNCi0gICAgYmFja2dyb3VuZDogdXJsKGltYWdlcy9yZW1vdGVfYS5naWYpIHJpZ2h0IGNlbnRlciBuby1yZXBlYXQ7DQotfQ0KLQ0KLS8qIGFkZCBhIG5vdGUgaWNvbiB0byBmb290bm90ZSBsaW5rcyAqLw0KLWFbaHJlZl49IiNmdG4iXSB7DQotICAgIGJhY2tncm91bmQ6IHVybChpbWFnZXMvcWJ1bGxldC1ub3RlLmdpZikgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsNCi0gICAgcGFkZGluZy1yaWdodDogMTJweDsNCi19DQotDQotYVtocmVmXj0iI2Z0biJdOmhvdmVyIHsNCi0gICAgYmFja2dyb3VuZDogdXJsKGltYWdlcy9xYnVsbGV0LW5vdGVfYS5naWYpIHJpZ2h0IGNlbnRlciBuby1yZXBlYXQ7DQotfQ0KLQ0KLS8qIC4uLmFuZCBhIGJhY2sgaWNvbiB0byB0aGUgYmFja2xpbmtzIGluIHRoZSBmb290bm90ZXMgdGhlbXNlbHZlcyAqLw0KLWFbbmFtZV49ImZ0biJdIHsNCi0gICAgYmFja2dyb3VuZDogdXJsKGltYWdlcy9zY3JvbGx1cC5naWYpIHJpZ2h0IGNlbnRlciBuby1yZXBlYXQ7DQotICAgIHBhZGRpbmctcmlnaHQ6IDEycHg7DQotfQ0KLQ0KLWFbbmFtZV49ImZ0biJdOmhvdmVyIHsNCi0gICAgYmFja2dyb3VuZDogdXJsKGltYWdlcy9zY3JvbGx1cF9hLmdpZikgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsNCi19DQotDQotLyogYWRkIGEgZG93bmxvYWQgaWNvbiB0byAuZ3ogbGlua3MgKi8NCi1hW2hyZWYkPSIuZ3oiXSwgYVtocmVmJD0iLnRhciJdLCBhW2hyZWYkPSIuemlwIl0gew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoaW1hZ2VzL2Rpc2suZ2lmKSByaWdodCBjZW50ZXIgbm8tcmVwZWF0Ow0KLSAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4Ow0KLX0NCi0NCi0vKiBhZGQgYW4gYWNyb2JhdCByZWFkZXIgaWNvbiB0byBwZGYgbGlua3MgKi8NCi1hW2hyZWYkPSIucGRmIl0gew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoaW1hZ2VzL2Fjcm9iYXQuZ2lmKSByaWdodCBjZW50ZXIgbm8tcmVwZWF0Ow0KLSAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4Ow0KLX0NCi0NCi1hW2hyZWYkPSIucGRmIl06aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoaW1hZ2VzL2Fjcm9iYXRfYS5naWYpIHJpZ2h0IGNlbnRlciBuby1yZXBlYXQ7DQotfQ0KLQ0KLS8qIGFkZCBhIHdvcmQgaWNvbiB0byBydGYgbGlua3MgKi8NCi1hW2hyZWYkPSIucnRmIl0gew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoaW1hZ2VzL3dvcmQuZ2lmKSByaWdodCBjZW50ZXIgbm8tcmVwZWF0Ow0KLSAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4Ow0KLX0NCi0NCi0vKiAuLi5idXQgbm90IHRvIGFic29sdXRlIGxpbmtzIGluIHRoaXMgZG9tYWluLi4uICovDQotYVtocmVmXj0iaHR0cDovL3d3dy5rYXJha2FzLW9ubGluZS5kZSJdIHsNCi0gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7DQotICAgIHBhZGRpbmctcmlnaHQ6IDBweDsNCi19DQotDQotYVtocmVmXj0iaHR0cDovL3d3dy5rYXJha2FzLW9ubGluZS5kZSJdOmhvdmVyIHsNCi0gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7DQotfQ0KLQ0KLS8qIC4uLm9yIHRvIHRoZSB0cmFuc2xhdGlvbiBsaW5rcyBvbiBlYWNoIHBhZ2UgKi8NCi1kaXYudHJhbnNsYXRlbGluayA+IGFbaHJlZl49Imh0dHA6Il0gew0KLSAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsNCi0gICAgcGFkZGluZy1yaWdodDogMHB4Ow0KLX0NCi0NCi1kaXYudHJhbnNsYXRlbGluayA+IGFbaHJlZl49Imh0dHA6Il06aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsNCi19DQotDQotLyogLi4ub3IgdG8gYW55IGltYWdlcyAgKi8NCi1kaXYuaW1hZ2VsaW5rIGFbaHJlZl49Imh0dHA6Il0gew0KLSAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsNCi0gICAgcGFkZGluZy1yaWdodDogMHB4Ow0KLX0NCi0NCi1kaXYuaW1hZ2VsaW5rIGFbaHJlZl49Imh0dHA6Il06aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsNCi19DQotDQotcC5jMiB7DQotICAgIGNvbG9yOiAjZmZmZmZmOw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTBhMGQwOw0KLSAgICBib3JkZXI6IHNvbGlkIDFweCAjNjA2MDkwOw0KLSAgICBwYWRkaW5nOiAxcHgNCi19DQotDQotZGl2Lm5hdmZvb3RlciB7DQotICAgIGNvbG9yOiAjMDAwMDAwOw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmY4Ow0KLSAgICBwYWRkaW5nOiA1cHg7DQotICAgIG1hcmdpbi10b3A6IDEwcHg7DQotICAgIHdpZHRoOiAxMDAlOw0KLSAgICBib3JkZXI6IHRoaW4gc29saWQgI2EwYTBkMDsNCi19DQotDQotZGl2Lm51a2Vmb290ZXIgew0KLSAgICBjb2xvcjogIzAwMDAwMDsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2IwZTBlNjsNCi0gICAgcGFkZGluZzogNXB4Ow0KLSAgICBtYXJnaW4tdG9wOiAxMHB4Ow0KLSAgICB3aWR0aDogMTAwJTsNCi0gICAgYm9yZGVyOiB0aGluIHNvbGlkICNhMGEwZDA7DQotfQ0KLQ0KLWRpdi5uYXZoZWFkZXIgew0KLSAgICBjb2xvcjogIzAwMDAwMDsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZmODsNCi0gICAgcGFkZGluZzogNXB4Ow0KLSAgICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KLSAgICB3aWR0aDogMTAwJTsNCi0gICAgYm9yZGVyOiB0aGluIHNvbGlkICNhMGEwZDA7DQotfQ0KLQ0KLWRpdi5zZWN0MSwgZGl2LnNlY3QyLCBkaXYuc2VjdDMgew0KLSAgICBtYXJnaW4tbGVmdDogMjBweDsNCi19DQotDQotZGl2LmV4YW1wbGUsIGRpdi50b2Mgew0KLSAgICBib3JkZXI6IHRoaW4gZG90dGVkICM3MGFhZTU7DQotICAgIHBhZGRpbmctbGVmdDogMTBweDsNCi0gICAgcGFkZGluZy1yaWdodDogMTBweDsNCi0gICAgY29sb3I6ICMwMDAwMDA7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmY4Zjg7DQotfQ0KLQ0KLWRpdi50b2Mgew0KLSAgICBtYXJnaW4tbGVmdDogMjBweDsNCi0gICAgbWFyZ2luLXJpZ2h0OiAyMHB4Ow0KLSAgICB3aWR0aDogOTUlOw0KLX0NCi0NCi11bCB7DQotICAgIGxpc3Qtc3R5bGU6IHVybCgiaW1hZ2VzL3R1eC1idWxsZXQucG5nIikgZGlzYzsNCi19DQotDQotZGl2LmV4YW1wbGUsIGRpdi50b2Mgew0KLSAgICBib3JkZXI6IHRoaW4gZG90dGVkICM3MGFhZTU7DQotICAgIHBhZGRpbmctbGVmdDogMTBweDsNCi0gICAgcGFkZGluZy1yaWdodDogMTBweDsNCi0gICAgY29sb3I6ICMwMDAwMDA7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmY4Zjg7DQotfQ0KLQ0KLWRpdi50b2Mgew0KLSAgICBtYXJnaW4tbGVmdDogMjBweDsNCi0gICAgbWFyZ2luLXJpZ2h0OiAyMHB4Ow0KLSAgICB3aWR0aDogOTUlOw0KLX0NCi0NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0FQQUNIRSBPRkJJWgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9keSB7CisgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC9pbWFnZXMvb2ZiaXpfbG9nby5naWYpIG5vLXJlcGVhdCBzY3JvbGwgbGVmdCB0b3A7CisgICAgY29sb3I6ICMwMDA7CisgICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisgICAgZm9udC1zaXplOiAuNzVlbTsKKyAgICBsaW5lLWhlaWdodDogMS41ZW07CisgICAgcGFkZGluZzogNTBweCAwIDA7CisgICAgYmdjb2xvcjogI2ZmZmZjYzsKK30KKworYTpob3ZlciB7CisgICAgY29sb3I6ICMxMTExMTE7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9CisKK2E6dmlzaXRlZCB7CisgICAgY29sb3I6ICMwMDA7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9CisKK2EgeworICAgIGNvbG9yOiAjNTU1OworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCitkaXYuYWJzdHJhY3QgeworICAgIGJvcmRlcjogc29saWQgMnB4OworICAgIHBhZGRpbmctbGVmdDogMTBwdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxMHB0OworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmY2M7Cit9CisKK3ByZS5zY3JlZW4geworICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CisgICAgd2hpdGUtc3BhY2U6IHByZTsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmNjOworICAgIGJvcmRlcjogc29saWQ7CisgICAgY29sb3I6ICMwMDAwMDA7CisgICAgYm9yZGVyLWNvbG9yOiAjMDA5OTk5OworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjMDA5OTk5IDJweDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICMwMDk5OTkgMnB4OworICAgIGJvcmRlci10b3A6IHNvbGlkICMwMDk5OTkgMnB4OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICMwMDk5OTkgMnB4OworCisgICAgcGFkZGluZy1sZWZ0OiAxNXB0OworfQorCitwcmUucHJvZ3JhbWxpc3RpbmcgeworICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CisgICAgd2hpdGUtc3BhY2U6IHByZTsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmNjOworICAgIGJvcmRlcjogc29saWQ7CisgICAgY29sb3I6ICMwMDAwMDA7CisgICAgYm9yZGVyLWNvbG9yOiAjMDA5OTk5OworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAjMDA5OTk5IDJweDsKKyAgICBib3JkZXItcmlnaHQ6IHNvbGlkICMwMDk5OTkgMnB4OworICAgIGJvcmRlci10b3A6IHNvbGlkICMwMDk5OTkgMnB4OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkICMwMDk5OTkgMnB4OworCisgICAgcGFkZGluZy1sZWZ0OiAxNXB0OworfQorCitoMSB7CisgICAgY29sb3I6ICNmZmZmZmY7CisgICAgYm9yZGVyOiBzb2xpZCAzcHggI2EwYTBkMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjA2MDkwOworICAgIGZvbnQtdmFyaWFudDogc21hbGwtY2FwczsKKyAgICB3aWR0aDogMTAwJTsKK30KKworaDEudGl0bGUgeworICAgIGNvbG9yOiAjZmZmZmZmOworICAgIGJvcmRlcjogc29saWQgM3B4ICNhMGEwZDA7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzYwNjA5MDsKKyAgICBmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHM7CisgICAgd2lkdGg6IDEwMCU7Cit9CisKKy50aXRsZSBhIHsKKyAgICBjb2xvcjogI2ZmZmZmYzsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy50aXRsZSBhOmFjdGl2ZSB7CisgICAgY29sb3I6ICNmZmZmZmY7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisudGl0bGUgYTp2aXNpdGVkIHsKKyAgICBjb2xvcjogI2ZmZmZmZjsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2gyIHsKKyAgICBjb2xvcjogI2ZmZmZmZjsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2EwYTBkMDsKKyAgICBib3JkZXI6IHNvbGlkIDNweCAjNjA2MDkwOworICAgIHBhZGRpbmc6IDFweAorfQorCit0YWJsZS5pbXBvcnRhbnQgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBib3JkZXI6IHNvbGlkIDJweCAjZmYwMDAwOworICAgIHdpZHRoOiA3MCU7CisgICAgbWFyZ2luLWxlZnQ6IDE1JTsKK30KKwordGFibGUuY2F1dGlvbiB7CisgICAgZm9udC1zdHlsZTogaXRhbGljOworICAgIGJvcmRlcjogcmlkZ2UgMnB4ICNmZmZmMDA7CisgICAgd2lkdGg6IDcwJTsKKyAgICBtYXJnaW4tbGVmdDogMTUlOworfQorCit0YWJsZS5ub3RlIHsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgYm9yZGVyOiBzb2xpZCAxcHggIzAwMDAwMDsKKyAgICB3aWR0aDogNzAlOworICAgIG1hcmdpbi1sZWZ0OiAxNSU7Cit9CisKK3RhYmxlLnRpcCB7CisgICAgZm9udC1zdHlsZTogaXRhbGljOworICAgIGJvcmRlcjogc29saWQgMXB4ICMwMDAwMDA7CisgICAgd2lkdGg6IDcwJTsKKyAgICBtYXJnaW4tbGVmdDogMTUlOworfQorCit0YWJsZS53YXJuaW5nIHsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgYm9yZGVyOiByaWRnZSA0cHggI2ZmMDAwMDsKKworICAgIHdpZHRoOiA3MCU7CisgICAgbWFyZ2luLWxlZnQ6IDE1JTsKK30KKworZGl2LnZhcmlhYmxlbGlzdCB7CisgICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgcGFkZGluZy1sZWZ0OiAyMHB4OworfQorCisudmFybGlzdGVudHJ5IHsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW4tdG9wOiAxMHB4OworICAgIGNvbG9yOiAjZmZmZmZmOworICAgIGJhY2tncm91bmQtY29sb3I6ICNhMGEwZDA7CisgICAgYm9yZGVyOiBzb2xpZCAxcHggIzYwNjA5MDsKKyAgICBwYWRkaW5nOiAxcHgKK30KKworLyoKKyAqIHNlZSBodHRwOi8vZGl2ZWludG9hY2Nlc3NpYmlsaXR5Lm9yZy9kYXlfMjZfdXNpbmdfcmVsYXRpdmVfZm9udF9zaXplcy5odG1sCisgKiBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGZvbGxvd2luZyBmZXcgY29tbWFuZHMuCisgKiB0aGV5IGFyZSByZWFsbHkgdG9vIGNvbXBsaWNhdGVkIHRvIGV4cGxhaW4gaGVyZSBpbiBhbGwgZGVwdGguIDstKQorICovCisKK3AgeworICAgIGZvbnQtc2l6ZTogMTJweDsKK30KKworLyphe30KK2JvZHkgcCB7CisgICAgICAgIGZvbnQtc2l6ZTogeC1zbWFsbDsKKyAgICAgICAgdm9pY2UtZmFtaWx5OiAiXCJ9XCIiOworICAgICAgICB2b2ljZS1mYW1pbHk6IGluaGVyaXQ7CisgICAgICAgIGZvbnQtc2l6ZTogc21hbGw7Cit9CisKK2h0bWw+Ym9keSBwIHsKKyAgICAgICAgZm9udC1zaXplOiBzbWFsbDsKK30KKyovCisKKy8qIGFkZCBhbiBleHRlcm5hbC1saW5rIGljb24gdG8gYWJzb2x1dGUgbGlua3MgKi8KK2FbaHJlZl49Imh0dHA6Il0geworICAgIGJhY2tncm91bmQ6IHVybChpbWFnZXMvcmVtb3RlLmdpZikgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4OworfQorCithW2hyZWZePSJodHRwOiJdOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoaW1hZ2VzL3JlbW90ZV9hLmdpZikgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsKK30KKworLyogYWRkIGEgbm90ZSBpY29uIHRvIGZvb3Rub3RlIGxpbmtzICovCithW2hyZWZePSIjZnRuIl0geworICAgIGJhY2tncm91bmQ6IHVybChpbWFnZXMvcWJ1bGxldC1ub3RlLmdpZikgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4OworfQorCithW2hyZWZePSIjZnRuIl06aG92ZXIgeworICAgIGJhY2tncm91bmQ6IHVybChpbWFnZXMvcWJ1bGxldC1ub3RlX2EuZ2lmKSByaWdodCBjZW50ZXIgbm8tcmVwZWF0OworfQorCisvKiAuLi5hbmQgYSBiYWNrIGljb24gdG8gdGhlIGJhY2tsaW5rcyBpbiB0aGUgZm9vdG5vdGVzIHRoZW1zZWx2ZXMgKi8KK2FbbmFtZV49ImZ0biJdIHsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoaW1hZ2VzL3Njcm9sbHVwLmdpZikgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4OworfQorCithW25hbWVePSJmdG4iXTpob3ZlciB7CisgICAgYmFja2dyb3VuZDogdXJsKGltYWdlcy9zY3JvbGx1cF9hLmdpZikgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsKK30KKworLyogYWRkIGEgZG93bmxvYWQgaWNvbiB0byAuZ3ogbGlua3MgKi8KK2FbaHJlZiQ9Ii5neiJdLCBhW2hyZWYkPSIudGFyIl0sIGFbaHJlZiQ9Ii56aXAiXSB7CisgICAgYmFja2dyb3VuZDogdXJsKGltYWdlcy9kaXNrLmdpZikgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4OworfQorCisvKiBhZGQgYW4gYWNyb2JhdCByZWFkZXIgaWNvbiB0byBwZGYgbGlua3MgKi8KK2FbaHJlZiQ9Ii5wZGYiXSB7CisgICAgYmFja2dyb3VuZDogdXJsKGltYWdlcy9hY3JvYmF0LmdpZikgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxMnB4OworfQorCithW2hyZWYkPSIucGRmIl06aG92ZXIgeworICAgIGJhY2tncm91bmQ6IHVybChpbWFnZXMvYWNyb2JhdF9hLmdpZikgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsKK30KKworLyogYWRkIGEgd29yZCBpY29uIHRvIHJ0ZiBsaW5rcyAqLworYVtocmVmJD0iLnJ0ZiJdIHsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoaW1hZ2VzL3dvcmQuZ2lmKSByaWdodCBjZW50ZXIgbm8tcmVwZWF0OworICAgIHBhZGRpbmctcmlnaHQ6IDEycHg7Cit9CisKKy8qIC4uLmJ1dCBub3QgdG8gYWJzb2x1dGUgbGlua3MgaW4gdGhpcyBkb21haW4uLi4gKi8KK2FbaHJlZl49Imh0dHA6Ly93d3cua2FyYWthcy1vbmxpbmUuZGUiXSB7CisgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CisgICAgcGFkZGluZy1yaWdodDogMHB4OworfQorCithW2hyZWZePSJodHRwOi8vd3d3LmthcmFrYXMtb25saW5lLmRlIl06aG92ZXIgeworICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OworfQorCisvKiAuLi5vciB0byB0aGUgdHJhbnNsYXRpb24gbGlua3Mgb24gZWFjaCBwYWdlICovCitkaXYudHJhbnNsYXRlbGluayA+IGFbaHJlZl49Imh0dHA6Il0geworICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OworICAgIHBhZGRpbmctcmlnaHQ6IDBweDsKK30KKworZGl2LnRyYW5zbGF0ZWxpbmsgPiBhW2hyZWZePSJodHRwOiJdOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKK30KKworLyogLi4ub3IgdG8gYW55IGltYWdlcyAgKi8KK2Rpdi5pbWFnZWxpbmsgYVtocmVmXj0iaHR0cDoiXSB7CisgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CisgICAgcGFkZGluZy1yaWdodDogMHB4OworfQorCitkaXYuaW1hZ2VsaW5rIGFbaHJlZl49Imh0dHA6Il06aG92ZXIgeworICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OworfQorCitwLmMyIHsKKyAgICBjb2xvcjogI2ZmZmZmZjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTBhMGQwOworICAgIGJvcmRlcjogc29saWQgMXB4ICM2MDYwOTA7CisgICAgcGFkZGluZzogMXB4Cit9CisKK2Rpdi5uYXZmb290ZXIgeworICAgIGNvbG9yOiAjMDAwMDAwOworICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZjg7CisgICAgcGFkZGluZzogNXB4OworICAgIG1hcmdpbi10b3A6IDEwcHg7CisgICAgd2lkdGg6IDEwMCU7CisgICAgYm9yZGVyOiB0aGluIHNvbGlkICNhMGEwZDA7Cit9CisKK2Rpdi5udWtlZm9vdGVyIHsKKyAgICBjb2xvcjogIzAwMDAwMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYjBlMGU2OworICAgIHBhZGRpbmc6IDVweDsKKyAgICBtYXJnaW4tdG9wOiAxMHB4OworICAgIHdpZHRoOiAxMDAlOworICAgIGJvcmRlcjogdGhpbiBzb2xpZCAjYTBhMGQwOworfQorCitkaXYubmF2aGVhZGVyIHsKKyAgICBjb2xvcjogIzAwMDAwMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmY4OworICAgIHBhZGRpbmc6IDVweDsKKyAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgIHdpZHRoOiAxMDAlOworICAgIGJvcmRlcjogdGhpbiBzb2xpZCAjYTBhMGQwOworfQorCitkaXYuc2VjdDEsIGRpdi5zZWN0MiwgZGl2LnNlY3QzIHsKKyAgICBtYXJnaW4tbGVmdDogMjBweDsKK30KKworZGl2LmV4YW1wbGUsIGRpdi50b2MgeworICAgIGJvcmRlcjogdGhpbiBkb3R0ZWQgIzcwYWFlNTsKKyAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgICAgcGFkZGluZy1yaWdodDogMTBweDsKKyAgICBjb2xvcjogIzAwMDAwMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZmOGY4OworfQorCitkaXYudG9jIHsKKyAgICBtYXJnaW4tbGVmdDogMjBweDsKKyAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CisgICAgd2lkdGg6IDk1JTsKK30KKwordWwgeworICAgIGxpc3Qtc3R5bGU6IHVybCgiaW1hZ2VzL3R1eC1idWxsZXQucG5nIikgZGlzYzsKK30KKworZGl2LmV4YW1wbGUsIGRpdi50b2MgeworICAgIGJvcmRlcjogdGhpbiBkb3R0ZWQgIzcwYWFlNTsKKyAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgICAgcGFkZGluZy1yaWdodDogMTBweDsKKyAgICBjb2xvcjogIzAwMDAwMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZmOGY4OworfQorCitkaXYudG9jIHsKKyAgICBtYXJnaW4tbGVmdDogMjBweDsKKyAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CisgICAgd2lkdGg6IDk1JTsKK30KKwpkaWZmIC0tZ2l0IGEvdGhlbWVzL2JsdWVsaWdodC93ZWJhcHAvYmx1ZWxpZ2h0L2hlbHAuY3NzIGIvdGhlbWVzL2JsdWVsaWdodC93ZWJhcHAvYmx1ZWxpZ2h0L2hlbHAuY3NzCmluZGV4IDhmMWU5MDQuLjg0NjJhOGYgMTAwNjQ0Ci0tLSBhL3RoZW1lcy9ibHVlbGlnaHQvd2ViYXBwL2JsdWVsaWdodC9oZWxwLmNzcworKysgYi90aGVtZXMvYmx1ZWxpZ2h0L3dlYmFwcC9ibHVlbGlnaHQvaGVscC5jc3MKQEAgLTEsODIgKzEsODIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLUFQQUNIRSBPRkJJWg0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotdW5kZXIgdGhlIExpY2Vuc2UuDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotYm9keSB7DQotICAgIGJhY2tncm91bmQ6IG5vbmU7DQotICAgIGZvbnQtc2l6ZTogMTA1JTsNCi19DQotDQotLmxlZnQtYm9yZGVyIHsNCi0gICAgZmxvYXQ6IGxlZnQ7DQotICAgIHdpZHRoOiA1MGVtOw0KLX0NCi0NCi1kaXYuY29udGVudGFyZWEgew0KLSAgICBtYXJnaW46IDEwcHggMCAwIDAuNWVtOw0KLSAgICBwYWRkaW5nOiAwIDAgMCAwLjVlbTsNCi19DQotDQotLmxlZnRvbmx5IHsNCi0gICAgZmxvYXQ6IG5vbmU7DQotICAgIG1pbi1oZWlnaHQ6IDI1ZW07DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5sZWZ0b25seSB7DQotICAgIG1hcmdpbi1sZWZ0OiA1MGVtOw0KLSAgICB3aWR0aDogYXV0bzsNCi19DQotDQotZGl2LnNjcmVlbmxldC1ib2R5IHsNCi0gICAgYm9yZGVyOiBub25lOw0KLX0NCi0NCi0jY29udGVudC1tYWluLXNlY3Rpb24gaDEsDQotI2NvbnRlbnQtbWFpbi1zZWN0aW9uIC5oMSB7DQotICAgIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi1vbC5udW1iZXJzIHsNCi0gICAgbGlzdC1zdHlsZTogZGVjaW1hbDsNCi0gICAgcGFkZGluZy1sZWZ0OiAyMHB4Ow0KLX0NCi0NCi11bC5kb3RzIHsNCi0gICAgbGlzdC1zdHlsZTogY2lyY2xlOw0KLSAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7DQotfQ0KLQ0KLXNwYW4uY2F1dGlvbiB7DQotICAgIGNvbG9yOiB5ZWxsb3c7DQotfQ0KLQ0KLXNwYW4uaW1wb3J0YW50IHsNCi0gICAgY29sb3I6ICNmZjQ1MDA7DQotfQ0KLQ0KLXNwYW4ubm90ZSB7DQotICAgIGNvbG9yOiAjYWRmZjJmOw0KLX0NCi0NCi1zcGFuLnRpcCB7DQotICAgIGNvbG9yOiBibHVlOw0KLX0NCi0NCi1zcGFuLndhcm5pbmcgew0KLSAgICBjb2xvcjogcmVkOw0KLX0NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0FQQUNIRSBPRkJJWgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9keSB7CisgICAgYmFja2dyb3VuZDogbm9uZTsKKyAgICBmb250LXNpemU6IDEwNSU7Cit9CisKKy5sZWZ0LWJvcmRlciB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgd2lkdGg6IDUwZW07Cit9CisKK2Rpdi5jb250ZW50YXJlYSB7CisgICAgbWFyZ2luOiAxMHB4IDAgMCAwLjVlbTsKKyAgICBwYWRkaW5nOiAwIDAgMCAwLjVlbTsKK30KKworLmxlZnRvbmx5IHsKKyAgICBmbG9hdDogbm9uZTsKKyAgICBtaW4taGVpZ2h0OiAyNWVtOworfQorCisjY29sdW1uLWNvbnRhaW5lciAubGVmdG9ubHkgeworICAgIG1hcmdpbi1sZWZ0OiA1MGVtOworICAgIHdpZHRoOiBhdXRvOworfQorCitkaXYuc2NyZWVubGV0LWJvZHkgeworICAgIGJvcmRlcjogbm9uZTsKK30KKworI2NvbnRlbnQtbWFpbi1zZWN0aW9uIGgxLAorI2NvbnRlbnQtbWFpbi1zZWN0aW9uIC5oMSB7CisgICAgZGlzcGxheTogYmxvY2s7Cit9CisKK29sLm51bWJlcnMgeworICAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7CisgICAgcGFkZGluZy1sZWZ0OiAyMHB4OworfQorCit1bC5kb3RzIHsKKyAgICBsaXN0LXN0eWxlOiBjaXJjbGU7CisgICAgcGFkZGluZy1sZWZ0OiAyMHB4OworfQorCitzcGFuLmNhdXRpb24geworICAgIGNvbG9yOiB5ZWxsb3c7Cit9CisKK3NwYW4uaW1wb3J0YW50IHsKKyAgICBjb2xvcjogI2ZmNDUwMDsKK30KKworc3Bhbi5ub3RlIHsKKyAgICBjb2xvcjogI2FkZmYyZjsKK30KKworc3Bhbi50aXAgeworICAgIGNvbG9yOiBibHVlOworfQorCitzcGFuLndhcm5pbmcgeworICAgIGNvbG9yOiByZWQ7Cit9CmRpZmYgLS1naXQgYS90aGVtZXMvYmx1ZWxpZ2h0L3dlYmFwcC9ibHVlbGlnaHQvc3R5bGUuY3NzIGIvdGhlbWVzL2JsdWVsaWdodC93ZWJhcHAvYmx1ZWxpZ2h0L3N0eWxlLmNzcwppbmRleCBmMjYyM2I5Li42YzdkZWRhIDEwMDY0NAotLS0gYS90aGVtZXMvYmx1ZWxpZ2h0L3dlYmFwcC9ibHVlbGlnaHQvc3R5bGUuY3NzCisrKyBiL3RoZW1lcy9ibHVlbGlnaHQvd2ViYXBwL2JsdWVsaWdodC9zdHlsZS5jc3MKQEAgLTEsNDA2MyArMSw0MDYzIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLS8qIFRoaXMgQ1NTIGZpbGUgaXMgdXNlZCBmb3IgYWxsIE9GQml6IGFwcGxpY2F0aW9ucyBFWENFUFQgZWNvbW1lcmNlLiAqLw0KLS8qIFNlZSB0aGUgImVjb21tYWluLmNzcyIgZmlsZSBmb3IgZWNvbW1lcmNlLiAqLw0KLS8qID09PT09IFJlc2V0cy9Ccm93c2VyIE5vcm1hbGl6YXRpb24gPT09PT0gKi8NCi0NCi1odG1sLCBib2R5LCBkaXYsIHNwYW4sIGFwcGxldCwgb2JqZWN0LCBpZnJhbWUsDQotaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgcCwgYmxvY2txdW90ZSwgcHJlLA0KLWEsIGFiYnIsIGFjcm9ueW0sIGFkZHJlc3MsIGJpZywgY2l0ZSwgY29kZSwNCi1kZWwsIGRmbiwgZW0sIGZvbnQsIGltZywgaW5zLCBrYmQsIHEsIHMsIHNhbXAsDQotc21hbGwsIHN0cmlrZSwgc3Ryb25nLCBzdWIsIHN1cCwgdHQsIHZhciwNCi1iLCB1LCBpLCBjZW50ZXIsIGRsLCBkdCwgZGQsIG9sLCB1bCwgbGksDQotZmllbGRzZXQsIGZvcm0sIGxhYmVsLCBsZWdlbmQsDQotdGFibGUsIGNhcHRpb24sIHRib2R5LCB0Zm9vdCwgdGhlYWQsIHRyLCB0aCwgdGQgew0KLSAgICBib3JkZXI6IDA7DQotICAgIG1hcmdpbjogMDsNCi0gICAgb3V0bGluZTogMDsNCi0gICAgcGFkZGluZzogMDsNCi0gICAgZm9udC1zaXplOiAxMDAlOyAvKmFkZCBmb250IHNpemUgdG8gcmVzZXQgKi8NCi0gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7DQotICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi19DQotDQotYm9keSB7DQotICAgIGxpbmUtaGVpZ2h0OiAxLjVlbTsNCi0gICAgY29sb3I6IGJsYWNrOw0KLSAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsNCi19DQotDQotLyogcmVzZXQgbGluZSBoZWlnaHQgYW5kIGJhc2VsaW5lIGNvbG9ycyovDQotDQotYmxvY2txdW90ZSwgYm9keSwgZGl2LCBkbCwgZHQsIGRkLCBmaWVsZHNldCwgZm9ybSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgaW1nLCBpbnB1dCwgbGksIG9sLCBwLCBzZWxlY3QsIHNwYW4sIHRkLCB0ZXh0YXJlYSwgdGgsIHVsIHsNCi0gICAgYm9yZGVyLXN0eWxlOiBub25lOw0KLSAgICBtYXJnaW46IDA7DQotICAgIHBhZGRpbmc6IDA7DQotfQ0KLQ0KLWEsIGFkZHJlc3MsIGJvZHksIGNhcHRpb24sIGNpdGUsIGNvZGUsIGRmbiwgZW0sIHN0cm9uZywgdGgsIHZhciB7DQotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsNCi0gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi1ib2R5LCBjYXB0aW9uLCB0aCB7DQotICAgIHRleHQtYWxpZ246IGxlZnQ7DQotfQ0KLQ0KLWgxLCBoMiwgaDMsIGg0LCBoNSwgaDYgew0KLSAgICBmb250LXNpemU6IDEwMCU7DQotfQ0KLQ0KLW9sLCB1bCB7DQotICAgIGxpc3Qtc3R5bGU6IG5vbmU7DQotfQ0KLQ0KLS8qID09PT09IEJhc2ljIEVsZW1lbnQgU3R5bGVzID09PT09ICovDQotYSwgYTp2aXNpdGVkIHsNCi0gICAgY29sb3I6ICMwMDAwOTk7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi1hOmhvdmVyLCBhOmFjdGl2ZSB7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotLmRpc2FibGVkIHsNCi0gICAgY29sb3I6ICMzMzMzNjY7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotYm9keSwgdGV4dGFyZWEsIGlucHV0LCBzZWxlY3Qgew0KLSAgICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCi19DQotDQotYm9keSB7DQotICAgIGJhY2tncm91bmQ6ICNCOERGRkM7DQotICAgIGZvbnQtc2l6ZTogNjIuNSU7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi19DQotDQotaHIgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5Ow0KLSAgICBib3JkZXI6IDA7DQotICAgIGhlaWdodDogMC4xZW07DQotICAgIG1hcmdpbjogMC41ZW0gMCAwLjVlbSAwOw0KLX0NCi0NCi1pbnB1dFt0eXBlPSJyYWRpbyJdLCBpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsNCi0gICAgZm9udC1zaXplOiAxLjFlbTsNCi0gICAgbWFyZ2luOiAwLjJlbTsNCi19DQotDQotaW5wdXRbdHlwZT0idGV4dCJdLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsNCi0gICAgYm9yZGVyOiAjOTk5OTk5IHNvbGlkIDAuMWVtOw0KLSAgICBmb250LXNpemU6IDEuMWVtOw0KLSAgICBtYXJnaW46IDAuMmVtOw0KLSAgICBwYWRkaW5nOiAwLjFlbSAwIDAuMWVtIDA7DQotfQ0KLQ0KLWlucHV0W3R5cGU9InN1Ym1pdCJdLCBpbnB1dFt0eXBlPSJidXR0b24iXSwgaW5wdXRbdHlwZT0icmVzZXQiXSB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQotICAgIGJvcmRlcjogIzk5OTk5OSBzb2xpZCAwLjFlbTsNCi0gICAgY29sb3I6ICMwMDAwOTk7DQotICAgIGZvbnQtc2l6ZTogMWVtOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotaW5wdXRbdHlwZT0ic3VibWl0Il06aG92ZXIgew0KLSAgICBjb2xvcjogI2ZmMDAwMDsNCi0gICAgY3Vyc29yOiBwb2ludGVyOw0KLSAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCi19DQotDQotaW5wdXRbdHlwZT0iZmlsZSJdIHsNCi0gICAgZm9udC1zaXplOiAxLjFlbTsNCi0gICAgaGVpZ2h0OiAxLjZlbTsgLyogZm9yY2UgY3RybCB0byBzY2FsZSB3aXRoIHRleHQgKi8NCi19DQotDQotc2VsZWN0IHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsNCi0gICAgYm9yZGVyOiAjOTk5OTk5IHNvbGlkIDAuMWVtOw0KLSAgICBmb250LXNpemU6IDEuMWVtOw0KLSAgICBoZWlnaHQ6IDEuNmVtOyAvKiBmb3JjZSBjdHJsIHRvIHNjYWxlIHdpdGggdGV4dCAqLw0KLSAgICBtYXJnaW46IDAuMWVtOw0KLX0NCi0NCi1zZWxlY3RbbXVsdGlwbGU9Im11bHRpcGxlIl0gew0KLSAgICBoZWlnaHQ6IDVlbTsNCi19DQotDQotaDEsIC5oMSB7DQotICAgIGZvbnQtc2l6ZTogMS42ZW07DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi1oMiwgLmgyIHsNCi0gICAgZm9udC1zaXplOiAxLjNlbTsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLWgzLCAuaDMgew0KLSAgICBmb250LXNpemU6IDEuMWVtOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotLyogSUU3IGZpeCAqLw0KLXRhYmxlIHsNCi0gICAgZm9udC1zaXplOiAxZW07DQotfQ0KLQ0KLS8qIElFNyBmaXggKi8NCi10YWJsZSBpbnB1dCB7DQotICAgIGJvcmRlcjogIzk5OTk5OSBzb2xpZCAwLjFlbTsNCi19DQotDQotdGV4dGFyZWEgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOw0KLSAgICBib3JkZXI6ICM5OTk5OTkgc29saWQgMC4xZW07DQotICAgIGZvbnQtc2l6ZTogMS4xZW07DQotfQ0KLQ0KLXRoLCB0aCBhIHsNCi0gICAgY29sb3I6ICMwMDAwMDA7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0vKiA9PT09PSBMZWdhY3kgU3R5bGVzID09PT09ICovDQotLyogVGhlICJzbWFsbFN1Ym1pdCIgY2xhc3MgY2FuIGJlIHVzZWQgdG8gZGVjb3JhdGUNCi1saW5rcyAoQSBlbGVtZW50cykgYW5kIG1ha2UgdGhlbSBzaW1pbGFyIHRvIGZvcm0ncyBidXR0b25zLiAqLw0KLS5zbWFsbFN1Ym1pdCwgLnNtYWxsU3VibWl0OnZpc2l0ZWQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOw0KLSAgICBib3JkZXI6ICM5OTk5OTkgc29saWQgMC4xZW07DQotICAgIGNvbG9yOiAjMDAwMDk5Ow0KLSAgICBmb250LXNpemU6IDFlbTsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIG1hcmdpbjogMC4yZW07DQotICAgIHBhZGRpbmc6IDAuMWVtIDAuMmVtIDAuMWVtIDAuMmVtOw0KLX0NCi0NCi0uc21hbGxTdWJtaXQ6aG92ZXIgew0KLSAgICBjb2xvcjogI2ZmMDAwMDsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0uc21hbGxTdWJtaXQ6YWN0aXZlIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsNCi0gICAgY29sb3I6ICMzMzMzNjY7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotLmluZm8gew0KLSAgICBjb2xvcjogIzAwMDAwMDsNCi0gICAgZm9udC1zdHlsZTogbm9ybWFsOw0KLX0NCi0NCi0uYm94aGVhZCB7DQotICAgIGNvbG9yOiAjRkZGRkZGOw0KLSAgICBmb250LXNpemU6IDEuMWVtOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotLmJveGxpbmsgew0KLSAgICBmbG9hdDogcmlnaHQ7DQotfQ0KLQ0KLURJVi5ib3h0b3Agew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDk5Ow0KLSAgICBib3JkZXItY29sb3I6ICM5OTk5OTk7DQotICAgIGJvcmRlci1zdHlsZTogc29saWQ7DQotICAgIG1hcmdpbjogMCBhdXRvIDAgYXV0bzsNCi0gICAgcGFkZGluZzogMC4xZW0gMC40ZW0gMC4xZW0gMC40ZW07DQotICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCi19DQotDQotRElWLmJveGhlYWQtbGVmdCB7DQotICAgIGJvcmRlcjogbm9uZTsNCi0gICAgY29sb3I6ICNGRkZGRkY7DQotICAgIGZsb2F0OiBsZWZ0Ow0KLSAgICBmb250LXNpemU6IDEuMWVtOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgd2lkdGg6IGF1dG87DQotfQ0KLQ0KLURJVi5ib3hoZWFkLWZpbGwgew0KLSAgICBib3JkZXI6IG5vbmU7DQotICAgIGNvbG9yOiAjRkZGRkZGOw0KLSAgICBmb250LXNpemU6IDEuMWVtOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgdGV4dC1hbGlnbjogY2VudGVyOw0KLSAgICB3aWR0aDogMDsNCi19DQotDQotRElWLmJveGhlYWQtcmlnaHQgew0KLSAgICBib3JkZXI6IG5vbmU7DQotICAgIGNvbG9yOiAjRkZGRkZGOw0KLSAgICBmbG9hdDogcmlnaHQ7DQotICAgIGZvbnQtc2l6ZTogMS4xZW07DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICB3aWR0aDogYXV0bzsNCi19DQotDQotQS5ib3hoZWFkYnV0dG9uIHsNCi0gICAgY29sb3I6ICNGRkZGRkY7DQotICAgIGZvbnQtc2l6ZTogMS4xZW07DQotfQ0KLQ0KLUEuYm94aGVhZGJ1dHRvbjpob3ZlciB7DQotICAgIGNvbG9yOiAjZmYwMDAwOw0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLS5ib3hvdXRzaWRlIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsNCi0gICAgYm9yZGVyOiAwLjFlbSBzb2xpZCAjOTk5OTk5Ow0KLX0NCi0NCi0uYm94dG9wIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDA5OTsNCi0gICAgYm9yZGVyOiAwIHNvbGlkICM5OTk5OTk7DQotICAgIHBhZGRpbmc6IDAuMWVtIDAuNGVtIDAuMWVtIDAuNGVtOw0KLX0NCi0NCi0uYm94Ym90dG9tIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsNCi0gICAgYm9yZGVyOiAwIHNvbGlkICM5OTk5OTk7DQotICAgIHBhZGRpbmc6IDAuNGVtOw0KLX0NCi0NCi0uYnV0dG9uIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsNCi0gICAgYm9yZGVyOiAwLjJlbSBvdXRzZXQgIzk5OTlDQzsNCi0gICAgcGFkZGluZy1yaWdodDogMC41ZW07DQotICAgIHBhZGRpbmctbGVmdDogMC41ZW07DQotfQ0KLQ0KLS5icm93c2VjYXRlZ29yeWxpc3Qgew0KLSAgICBtYXJnaW4tbGVmdDogMTBweDsNCi19DQotDQotLmJyb3dzZWNhdGVnb3J5dGV4dCB7DQotICAgIGNvbG9yOiAjMDAwMDk5Ow0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9iZ19idWxsZXRfZnVsbF8yLmdpZikgbm8tcmVwZWF0IDBweCAwLjVlbTsNCi19DQotDQotQS5icm93c2VjYXRlZ29yeWJ1dHRvbiB7DQotICAgIGNvbG9yOiAjMDAwMDk5Ow0KLX0NCi0NCi0uYnJvd3NlY2F0ZWdvcnlidXR0b25kaXNhYmxlZCB7DQotICAgIGNvbG9yOiAjMzMzMzMzOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotQS5idXR0b250ZXh0LCAuYnV0dG9udGV4dGRpc2FibGVkLCAuYnV0dG9uLWJhciBsaS5idXR0b250ZXh0IGEgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOw0KLSAgICBib3JkZXI6ICM5OTk5OTkgc29saWQgMC4xZW07DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICBsaW5lLWhlaWdodDogMS44ZW07DQotICAgIG1hcmdpbjogMC4yZW07DQotICAgIHBhZGRpbmc6IDAuMWVtIDAuNGVtIDAuMWVtIDAuNGVtOw0KLSAgICAvKndoaXRlLXNwYWNlOiBub3dyYXA7Ki8NCi19DQotDQotQS5idXR0b250ZXh0LCAuYnV0dG9uLWJhciBsaS5idXR0b250ZXh0IGEgew0KLSAgICBjb2xvcjogIzAwMDA5OTsNCi19DQotDQotQS5idXR0b250ZXh0OmhvdmVyLCAuYnV0dG9uLWJhciBsaS5idXR0b250ZXh0IGE6aG92ZXIgew0KLSAgICBjb2xvcjogI2ZmMDAwMDsNCi19DQotDQotQS5saW5rdGV4dCB7DQotICAgIGNvbG9yOiAjMDAwMDk5Ow0KLX0NCi0NCi1BLmxpbmt0ZXh0OmhvdmVyIHsNCi0gICAgY29sb3I6ICNmZjAwMDA7DQotfQ0KLQ0KLS5idXR0b250ZXh0ZGlzYWJsZWQgew0KLSAgICBjb2xvcjogIzMzMzMzMzsNCi19DQotDQotQS5oZWFkZXJidXR0b250ZXh0IHsNCi0gICAgY29sb3I6ICMwMDAwOTk7DQotfQ0KLQ0KLUEuaGVhZGVyYnV0dG9udGV4dDpob3ZlciB7DQotICAgIGNvbG9yOiAjMDAwMDAwOw0KLX0NCi0NCi0uc3VibWVudXRleHRpbmZvIHsNCi0gICAgYm9yZGVyLXJpZ2h0OiAwLjFlbSBzb2xpZCAjNTg4NkM2Ow0KLSAgICBjb2xvcjogI2ZmZmZmZjsNCi0gICAgZm9udC1zaXplOiAwLjllbTsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIHBhZGRpbmctbGVmdDogMC41ZW07DQotICAgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KLX0NCi0NCi0uc3VibWVudXRleHQsIEEuc3VibWVudXRleHQsIEEuc3VibWVudXRleHQ6dmlzaXRlZCB7DQotICAgIGJvcmRlci1yaWdodDogMC4xZW0gc29saWQgIzU4ODZDNjsNCi0gICAgY29sb3I6ICNmZmZmMDA7DQotICAgIGZvbnQtc2l6ZTogMC45ZW07DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICBwYWRkaW5nLWxlZnQ6IDAuMmVtOw0KLSAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsNCi19DQotDQotQS5zdWJtZW51dGV4dDpob3ZlciB7DQotICAgIGNvbG9yOiAjZmZmZjAwOw0KLX0NCi0NCi0uc3VibWVudXRleHRkaXNhYmxlZCwgQS5zdWJtZW51dGV4dGRpc2FibGVkIHsNCi0gICAgYm9yZGVyLXJpZ2h0OiAwLjFlbSBzb2xpZCAjNTg4NkM2Ow0KLSAgICBjb2xvcjogI0NDQ0NDQzsNCi0gICAgZm9udC1zaXplOiAwLjllbTsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIHBhZGRpbmctbGVmdDogMC4yZW07DQotICAgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOw0KLX0NCi0NCi1BLnN1Ym1lbnV0ZXh0ZGlzYWJsZWQ6aG92ZXIgew0KLSAgICBjb2xvcjogI2ZmZmYwMDsNCi19DQotDQotLnN1Ym1lbnV0ZXh0aW5mb3JpZ2h0IHsNCi0gICAgY29sb3I6ICNmZmZmZmY7DQotICAgIGZvbnQtc2l6ZTogMC45ZW07DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICBwYWRkaW5nLWxlZnQ6IDAuMmVtOw0KLX0NCi0NCi0uc3VibWVudXRleHRyaWdodCwgQS5zdWJtZW51dGV4dHJpZ2h0IHsNCi0gICAgY29sb3I6ICNmZmZmMDA7DQotICAgIGZvbnQtc2l6ZTogMC45ZW07DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICBwYWRkaW5nLWxlZnQ6IDAuMmVtOw0KLX0NCi0NCi1BLnN1Ym1lbnV0ZXh0cmlnaHQ6aG92ZXIgew0KLSAgICBjb2xvcjogI2ZmZmYwMDsNCi19DQotDQotLnN1Ym1lbnV0ZXh0cmlnaHRkaXNhYmxlZCwgQS5zdWJtZW51dGV4dHJpZ2h0ZGlzYWJsZWQgew0KLSAgICBjb2xvcjogI0NDQ0NDQzsNCi0gICAgZm9udC1zaXplOiAwLjllbTsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIHBhZGRpbmctbGVmdDogMC4yZW07DQotfQ0KLQ0KLUEuc3VibWVudXRleHRyaWdodGRpc2FibGVkOmhvdmVyIHsNCi0gICAgY29sb3I6ICNmZmZmMDA7DQotfQ0KLQ0KLUEubGlnaHRidXR0b250ZXh0IHsNCi0gICAgYm9yZGVyOiBub25lOw0KLSAgICBjb2xvcjogI2ZmZmYwMDsNCi19DQotDQotQS5saWdodGJ1dHRvbnRleHQ6aG92ZXIgew0KLSAgICBjb2xvcjogI2ZmZmYwMDsNCi19DQotDQotQS5saWdodGJ1dHRvbnRleHRzbWFsbCB7DQotICAgIGJvcmRlcjogbm9uZTsNCi0gICAgY29sb3I6ICNmZmZmMDA7DQotICAgIGZvbnQtc2l6ZTogMC44ZW07DQotfQ0KLQ0KLUEubGlnaHRidXR0b250ZXh0c21hbGw6aG92ZXIgew0KLSAgICBjb2xvcjogI2ZmZmYwMDsNCi19DQotDQotLmxpZ2h0YnV0dG9udGV4dGRpc2FibGVkIHsNCi0gICAgY29sb3I6ICNDQ0NDQ0M7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi1BLmJ1dHRvbnRleHRiaWcsIC5idXR0b250ZXh0YmlnZGlzYWJsZWQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOw0KLSAgICBib3JkZXI6ICM5OTk5OTkgc29saWQgMC4xZW07DQotICAgIGZvbnQtc2l6ZTogMS41ZW07DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICBtYXJnaW46IDAuMmVtOw0KLSAgICBwYWRkaW5nOiAwLjFlbSAwLjRlbSAwLjFlbSAwLjRlbTsNCi19DQotDQotQS5idXR0b250ZXh0YmlnIHsNCi0gICAgY29sb3I6ICMwMDAwOTk7DQotfQ0KLQ0KLS5idXR0b250ZXh0YmlnZGlzYWJsZWQgew0KLSAgICBjb2xvcjogI0NDQ0NDQzsNCi19DQotDQotQS5idXR0b250ZXh0YmlnOmhvdmVyIHsNCi0gICAgY29sb3I6ICNmZjAwMDA7DQotfQ0KLQ0KLUEgSU1HLmltYWdlYm9yZGVyIHsNCi0gICAgYm9yZGVyOiAwLjFlbSBzb2xpZCAjOTk5OTk5Ow0KLX0NCi0NCi0jbWVzc2FnZXMtY29udGFpbmVyIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOw0KLSAgICBtYXJnaW46IDAgN3B4IDAgN3B4Ow0KLSAgICBwYWRkaW5nLWJvdHRvbTogMWVtOw0KLX0NCi0NCi0vKiA9PT09PSBTeXN0ZW0gbWVzc2FnZXMgcmVuZGVyaW5nID09PT09ICovDQotLmV2ZW50TWVzc2FnZSwNCi0uZXJyb3JNZXNzYWdlIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI0I4REZGQzsNCi0gICAgZm9udC1zaXplOiAxLjNlbTsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIG1hcmdpbjogMCAxZW0gMCAxZW07DQotICAgIHBhZGRpbmc6IDAgMWVtIDAgNTBweDsNCi19DQotDQotLmV2ZW50TWVzc2FnZSB7DQotICAgIGJhY2tncm91bmQ6ICNGRkZGRkYgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL2luZm9ybWF0aW9uLnBuZykgbm8tcmVwZWF0IDEwcHggNTAlOw0KLSAgICBjb2xvcjogIzAwMDA5OTsNCi0gICAgYm9yZGVyOiBzb2xpZCAzcHggIzAwMDA5OTsNCi19DQotDQotLmVycm9yTWVzc2FnZSB7DQotICAgIGJhY2tncm91bmQ6ICNGRkZGRkYgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL2V4Y2xhbWF0aW9uLnBuZykgbm8tcmVwZWF0IDEwcHggNTAlOw0KLSAgICBjb2xvcjogI0ZGMDAwMDsNCi0gICAgYm9yZGVyOiBzb2xpZCAzcHggI0ZGMDAwMDsNCi19DQotDQotLm1lZGl1bVN1Ym1pdCwgLmxhcmdlU3VibWl0LCAubG9naW5CdXR0b24gew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOw0KLSAgICBib3JkZXI6ICM5OTk5OTkgc29saWQgMC4xZW07DQotICAgIGNvbG9yOiAjMDAwMDk5Ow0KLSAgICBmb250LXNpemU6IDEuNGVtOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgbWFyZ2luOiAwLjJlbTsNCi19DQotDQotLm1lZGl1bVN1Ym1pdDpob3ZlciwgLmxhcmdlU3VibWl0OmhvdmVyLCAubG9naW5CdXR0b246aG92ZXIgew0KLSAgICBjb2xvcjogI2ZmMDAwMDsNCi19DQotDQotLnNtYWxsQWx0U3VibWl0LCAubWVkaXVtQWx0U3VibWl0LCAubGFyZ2VBbHRTdWJtaXQgew0KLSAgICBmb250LXNpemU6IDEuMWVtOw0KLX0NCi0NCi0uYmFzZVByaWNlIHsNCi0gICAgY29sb3I6ICMwMDAwMDA7DQotfQ0KLQ0KLS5ub3JtYWxQcmljZSB7DQotICAgIGNvbG9yOiAjMDA4MDAwOw0KLX0NCi0NCi0uc2FsZVByaWNlIHsNCi0gICAgY29sb3I6ICNmZjAwMDA7DQotfQ0KLQ0KLS8qID09PT09IFByb2R1Y3QgU3VtbWFyeSBTdHlsZXMgPT09PT0gKi8NCi0ucHJvZHVjdC1wcmV2bmV4dCB7DQotICAgIHRleHQtYWxpZ246IHJpZ2h0Ow0KLX0NCi0NCi0ucHJvZHVjdHN1bW1hcnktY29udGFpbmVyIHsNCi0gICAgYm9yZGVyLXRvcDogIzk5OSBzb2xpZCAwLjFlbTsNCi0gICAgbWFyZ2luLXRvcDogMC41ZW07DQotICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOw0KLX0NCi0NCi0ucHJvZHVjdHN1bW1hcnkgew0KLSAgICBib3JkZXItYm90dG9tOiAjOTk5IHNvbGlkIDAuMWVtOw0KLSAgICAvKiB1c2luZyBtaW4taGVpZ2h0IGFzIGFuIGFsdGVybmF0aXZlIHRvIGNsZWFyOiBib3RoOyBiZWNhdXNlIHRoYXQsIGluIHNvbWUgYnJvd3NlcnMsIHdpbGwgY2xlYXIgdGhlIHRvcC1sZXZlbCBjb2x1bW5zIGFuZCBub3QganVzdCBpbiB0aGlzIGRpdiAoTW96aWxsYSBiYXNlZCwgbmFtZWx5KSAqLw0KLSAgICBtaW4taGVpZ2h0OiA2ZW07DQotICAgIG92ZXJmbG93OiB2aXNpYmxlOw0KLSAgICBwYWRkaW5nOiAwLjVlbTsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLX0NCi0NCi0ucHJvZHVjdHN1bW1hcnkgLnNtYWxsaW1hZ2Ugew0KLSAgICBmbG9hdDogbGVmdDsNCi0gICAgLyogcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDVweDsgbGVmdDogNXB4OyAqLw0KLSAgICBtYXJnaW46IDAgMC41ZW0gMC41ZW0gMDsNCi19DQotDQotLnByb2R1Y3RzdW1tYXJ5IC5zbWFsbGltYWdlIGltZyB7DQotICAgIGJvcmRlcjogI0NDQyBzb2xpZCAwLjFlbTsNCi0gICAgaGVpZ2h0OiA1ZW07DQotfQ0KLQ0KLS5wcm9kdWN0c3VtbWFyeSAucHJvZHVjdGJ1eSB7DQotICAgIGZsb2F0OiByaWdodDsNCi0gICAgbWFyZ2luOiAwLjVlbTsNCi0gICAgdGV4dC1hbGlnbjogcmlnaHQ7DQotICAgIHdpZHRoOiAxM2VtOw0KLX0NCi0NCi0ucHJvZHVjdHN1bW1hcnkgLnByb2R1Y3RpbmZvIHsgLyogbWFyZ2luLWxlZnQ6IDYwcHg7ICovDQotICAgIHRleHQtYWxpZ246IGxlZnQ7DQotfQ0KLQ0KLS8qID09PT09IFByb2R1Y3QgRGV0YWlsIFN0eWxlcyA9PT09PSAqLw0KLSNwcm9kdWN0ZGV0YWlsICNsb25nLWRlc2NyaXB0aW9uIHsNCi0gICAgYm9yZGVyLXRvcDogIzk5OSBzb2xpZCAwLjFlbTsNCi0gICAgbWFyZ2luLXRvcDogMWVtOw0KLSAgICBwYWRkaW5nLXRvcDogMC41ZW07DQotfQ0KLQ0KLSNwcm9kdWN0ZGV0YWlsICNyZXZpZXdzIHsNCi0gICAgYm9yZGVyLXRvcDogIzk5OSBzb2xpZCAwLjFlbTsNCi0gICAgbWFyZ2luLXRvcDogMWVtOw0KLSAgICBwYWRkaW5nLXRvcDogMC41ZW07DQotfQ0KLQ0KLSNwcm9kdWN0ZGV0YWlsICNhc3NvY2lhdGVkLXByb2R1Y3RzIHsNCi0gICAgYm9yZGVyLXRvcDogIzk5OSBzb2xpZCAwLjFlbTsNCi0gICAgbWFyZ2luLXRvcDogMWVtOw0KLSAgICBwYWRkaW5nLXRvcDogMC41ZW07DQotfQ0KLQ0KLS50cmVlV3JhcHBlciB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQotICAgIGJvcmRlci10b3A6IDAuMWVtIHNvbGlkICMwMDAwMDA7DQotICAgIGJvcmRlci1sZWZ0OiAwLjFlbSBzb2xpZCAjMDAwMDAwOw0KLSAgICBjb2xvcjogIzAwMDAwMDsNCi0gICAgZm9udC1zaXplOiAxLjZlbTsNCi0gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsNCi0gICAgbWFyZ2luLWxlZnQ6IDEuMmVtOw0KLSAgICBtYXJnaW4tdG9wOiAwLjJlbTsNCi0gICAgdGV4dC1hbGlnbjogbGVmdDsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0ubGVmdGhhbGYgew0KLSAgICBmbG9hdDogbGVmdDsNCi0gICAgaGVpZ2h0OiAxJTsNCi0gICAgbGVmdDogMDsNCi0gICAgbWFyZ2luOiAwJSAxJSAxJSAwJTsNCi0gICAgd2lkdGg6IDQ5JTsNCi19DQotDQotLnJpZ2h0aGFsZiB7DQotICAgIGZsb2F0OiByaWdodDsNCi0gICAgaGVpZ2h0OiAxJTsNCi0gICAgbWFyZ2luOiAwIDAgMSUgMSU7DQotICAgIHJpZ2h0OiAwOw0KLSAgICB3aWR0aDogNDklOw0KLX0NCi0NCi0ubGVmdGNsZWFyIHsNCi0gICAgY2xlYXI6IGxlZnQ7DQotICAgIGhlaWdodDogMSU7DQotfQ0KLQ0KLS8qID09PT0gU3R5bGVzIEZvciBGb3JtIFdpZGdldHMgPT09ICovDQotLmZvcm1UYWJsZUJvcmRlcmVkIHsNCi0gICAgYm9yZGVyOiAwLjFlbSBzb2xpZCAjOTk5OTk5Ow0KLSAgICB3aWR0aDogMTAwJTsNCi19DQotDQotLyogPT09PSBTdHlsZXMgRm9yIFRoZSBIdG1sIExvZyA9PT0gKi8NCi0uREVCVUcgew0KLSAgICBjb2xvcjogIzgwODA4MDsNCi19DQotDQotLldBUk4gew0KLSAgICBjb2xvcjogIzAwMDBmZjsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLS5JTkZPIHsNCi0gICAgY29sb3I6ICMwMDgwMDA7DQotfQ0KLQ0KLS5FUlJPUiB7DQotICAgIGJvcmRlcjogMC4yZW0gc29saWQgI2ZmMDAwMDsNCi0gICAgY29sb3I6ICNmZjAwMDA7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0vKiA9PT09IFN0eWxlcyBDb3BpZWQgRnJvbSB0YWJzdHlsZXMuY3NzID09PSAqLw0KLS50cmVld3JhcHBlciB7DQotICAgIG1hcmdpbi1sZWZ0OiAxZW07DQotfQ0KLQ0KLS50cmVlaXRlbSB7DQotICAgIGJvcmRlcjogIzg4ODg4OCBzb2xpZCAwLjFlbTsNCi0gICAgY29sb3I6ICMwMDAwZmY7DQotICAgIGZvbnQtc2l6ZTogMS40ZW07DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0uYXBwYmFyIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsNCi19DQotDQotLndoaXRlYXJlYSB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7DQotfQ0KLQ0KLS5ibGFja2FyZWEgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOw0KLX0NCi0NCi0ucGFnZS10aXRsZSB7DQotICAgIGRpc3BsYXk6IG5vbmU7DQotfQ0KLQ0KLURJVi5yb3cgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQjRCMEFBOw0KLSAgICBtYXJnaW46IDAgYXV0byAwIGF1dG87DQotICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCi19DQotDQotRElWLmNvbCB7DQotICAgIGJvcmRlcjogbm9uZTsNCi0gICAgZmxvYXQ6IGxlZnQ7DQotICAgIHdpZHRoOiBhdXRvOw0KLX0NCi0NCi1ESVYuY29sLWZpbGwgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQjRCMEFBOw0KLSAgICBib3JkZXI6IG5vbmU7DQotICAgIGNvbG9yOiAjMDAwMDk5Ow0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgdGV4dC1hbGlnbjogY2VudGVyOw0KLSAgICB3aWR0aDogMDsNCi19DQotDQotRElWLmNvbC1yaWdodCB7DQotICAgIGJvcmRlcjogbm9uZTsNCi0gICAgZmxvYXQ6IHJpZ2h0Ow0KLSAgICB3aWR0aDogYXV0bzsNCi19DQotDQotRElWLmNvbnRlbnRhcmVhIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsNCi0gICAgbWFyZ2luOiAwcHggN3B4IDBweCA3cHg7DQotfQ0KLQ0KLURJVi5lbmRjb2x1bW5zIHsgLyogZGVwcmVjYXRlZCAtIHVzZSAuY2xlYXIgKi8NCi0gICAgY2xlYXI6IGJvdGg7DQotfQ0KLQ0KLURJVi5zaW1wbGUtcmlnaHQtc21hbGwgew0KLSAgICBmbG9hdDogcmlnaHQ7DQotICAgIHdpZHRoOiAyZW07DQotICAgIHRleHQtYWxpZ246IHJpZ2h0Ow0KLX0NCi0NCi1ESVYuc2ltcGxlLXJpZ2h0LWhhbGYgew0KLSAgICBmbG9hdDogcmlnaHQ7DQotICAgIHdpZHRoOiA1MCU7DQotICAgIHRleHQtYWxpZ246IHJpZ2h0Ow0KLX0NCi0NCi1ESVYuc2NyZWVubGV0IHsNCi0gICAgYmFja2dyb3VuZDogdXJsKCIvYmx1ZWxpZ2h0L2JveC1oZWFkLXRyLmdpZiIpIG5vLXJlcGVhdCB0b3AgcmlnaHQ7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICM1Q0EzRDc7DQotICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50Ow0KLSAgICBoZWlnaHQ6IDElOw0KLSAgICBtYXJnaW4tYm90dG9tOiAxZW07DQotfQ0KLQ0KLS8qIFNwZWNpYWwgU2NyZWVubGV0IEhhbmRsaW5nIGZvciBsb2NhbHMgYW5kIHRpbWV6b25lIHdpbmRvdyAqLw0KLURJVi5saXN0cy5zY3JlZW5sZXQgew0KLSAgICBtYXJnaW4tbGVmdDogMjUlOw0KLSAgICBtYXJnaW4tcmlnaHQ6IDI1JTsNCi0gICAgbWFyZ2luLXRvcDogMWVtOw0KLX0NCi0NCi1ESVYubGlzdHMuc2NyZWVubGV0IC5iYXNpYy10YWJsZSB0ciB0ZCB7DQotICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCi19DQotDQotRElWLmxpc3RzLnNjcmVlbmxldCAuYmFzaWMtdGFibGUgdHIgdGQgYSB7DQotICAgIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi1ESVYuc2NyZWVubGV0LWJvZHkgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOw0KLSAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsNCi0gICAgaGVpZ2h0OiAxJTsNCi0gICAgcGFkZGluZzogMC40ZW07DQotICAgIGJvcmRlcjogMC4xZW0gc29saWQgIzVDQTNENzsNCi19DQotDQotRElWLm5vLXBhZGRpbmcgew0KLSAgICBwYWRkaW5nOiAwOw0KLSAgICBib3JkZXI6IG5vbmU7DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIHsNCi0gICAgbWFyZ2luOiBhdXRvOw0KLSAgICBwYWRkaW5nOiAwIDFlbSAxZW0gMWVtOw0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIGgxLA0KLSNjb2x1bW4tY29udGFpbmVyIC5oMSwNCi0jY29sdW1uLWNvbnRhaW5lciBoMiwNCi0jY29sdW1uLWNvbnRhaW5lciAuaDIgew0KLSAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgaDEsDQotI2NvbHVtbi1jb250YWluZXIgLmgxIHsNCi0gICAgY29sb3I6ICMwMDAwOTk7DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5sZWZ0IHsNCi0gICAgZmxvYXQ6IGxlZnQ7DQotICAgIC8qIGFsdDogcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyAqLw0KLSAgICB3aWR0aDogMjJlbTsNCi0gICAgbWFyZ2luLXJpZ2h0OiAxZW07DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5sZWZ0LWxhcmdlciB7DQotICAgIGZsb2F0OiBsZWZ0Ow0KLSAgICAvKiBhbHQ6IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwcHg7IGxlZnQ6IDBweDsgKi8NCi0gICAgd2lkdGg6IDI1ZW07DQotICAgIG1hcmdpbi1yaWdodDogMWVtOw0KLX0NCi0NCi0ubGVmdC1ib3JkZXIgew0KLSAgICBmbG9hdDogbGVmdDsNCi0gICAgbWFyZ2luLXJpZ2h0OiAxZW07DQotICAgIHdpZHRoOiAyMmVtOw0KLSAgICBib3JkZXItcmlnaHQ6IDAuNXB4IGRvdHRlZCAjY2NjOw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOw0KLSAgICBoZWlnaHQ6IDEwMCU7DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5yaWdodCB7DQotICAgIGZsb2F0OiByaWdodDsNCi0gICAgbWFyZ2luLWxlZnQ6IDFlbTsNCi0gICAgd2lkdGg6IDIyZW07DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5sZWZ0b25seSB7DQotICAgIG1hcmdpbi1sZWZ0OiAyM2VtOw0KLSAgICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLmxlZnRvbmx5LWxhcmdlciB7DQotICAgIG1hcmdpbi1sZWZ0OiAyNmVtOw0KLSAgICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLnJpZ2h0b25seSB7DQotICAgIG1hcmdpbi1yaWdodDogMjNlbTsNCi0gICAgd2lkdGg6IGF1dG87DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5jZW50ZXIgew0KLSAgICBtYXJnaW4tbGVmdDogMjNlbTsNCi0gICAgbWFyZ2luLXJpZ2h0OiAyM2VtOw0KLSAgICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLm5vY29sdW1ucyB7DQotICAgIHdpZHRoOiBhdXRvOw0KLX0NCi0NCi1ESVYuY29sdW1uLWxlZnQtd2lkZSB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7DQotICAgIGJvcmRlcjogIzAwMDAwMCBzb2xpZCAwLjJlbTsNCi0gICAgZmxvYXQ6IGxlZnQ7DQotICAgIG92ZXJmbG93OiBhdXRvOw0KLSAgICB3aWR0aDogMzBlbTsNCi19DQotDQotRElWLndpZGdldC1jb250YWluZXIgew0KLSAgICBtYXJnaW4tYm90dG9tOiAyZW07DQotfQ0KLQ0KLS8qID09PT09IE5ldyBTdHlsZXMgPT09PT0gKi8NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLS8qID09PT09IFVzZWQgdG8gY2xlYXIgZmxvYXRzID09PT09ICovDQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0NCi0uY2xlYXIgew0KLSAgICBjbGVhcjogYm90aDsNCi0gICAgaGVpZ2h0OiAwOw0KLSAgICB2aXNpYmlsaXR5OiBoaWRkZW47DQotfQ0KLQ0KLS5uby1jbGVhciAuY2xlYXIgew0KLSAgICAvKiBVc2VkIGluIGNvbnRhaW5lciBlbGVtZW50cyB0byBvdmVycmlkZSB0aGUgY2xlYXIgY2xhc3MNCi1pbiBjb250YWluZWQgZWxlbWVudHMuICovDQotICAgIGNsZWFyOiBub25lOw0KLX0NCi0NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0vKiA9PT09PSBTaW5nbGUgRWxlbWVudCBTdHlsZXMgPT09PT0gKi8NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0uYWxlcnQgeyAvKiBVc2VkIGZvciBhbGVydCB0ZXh0ICovDQotICAgIGNvbG9yOiAjZmYwMDAwOw0KLX0NCi0NCi0uY29udGVudC1tZXNzYWdlcyBwIHsNCi0gICAgbWFyZ2luOiAwLjVlbSAwIDAuNWVtIDA7DQotfQ0KLQ0KLS5oaWRkZW4gew0KLSAgICBoZWlnaHQ6IDA7DQotICAgIGRpc3BsYXk6IG5vbmU7DQotfQ0KLQ0KLS5sYWJlbCB7DQotICAgIC8qIFVzZWQgZm9yIDxpbnB1dD4gZWxlbWVudCBsYWJlbHMgKi8NCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIGhlaWdodDogMS4yZW07DQotICAgIC8qIFNhbWUgYXMgPGlucHV0PiBoZWlnaHQgKi8NCi0gICAgcGFkZGluZy1yaWdodDogMS4xZW07DQotICAgIHRleHQtYWxpZ246IHJpZ2h0Ow0KLSAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KLSAgICB3aWR0aDogMSU7DQotICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7DQotfQ0KLQ0KLS5yZXF1aXJlZCwgaW5wdXQucmVxdWlyZWQgew0KLSAgICAvKiByZXF1aXJlZCBzdHlsZSBmb3IgPGlucHV0PiBlbGVtZW50cyAqLw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOw0KLX0NCi0NCi0udG9vbHRpcCB7IC8qIHRvb2x0aXAgc3R5bGUgKi8NCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZiYjsNCi0gICAgYm9yZGVyOiAwLjFlbSBzb2xpZCAjOTk5OTk5Ow0KLSAgICBjb2xvcjogIzAwMDAwMDsNCi0gICAgZm9udC1zdHlsZTogaXRhbGljOw0KLSAgICBtYXJnaW46IDAuNGVtOw0KLSAgICBwYWRkaW5nOiAwLjFlbTsNCi19DQotDQotLnZpc2libGUgew0KLSAgICBoZWlnaHQ6IGF1dG87DQotICAgIHZpc2liaWxpdHk6IHZpc2libGU7DQotfQ0KLQ0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0vKiA9PT09PSBVc2VkIHRvIGFsaWduIGVsZW1lbnRzID09PT09ICovDQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLS5hbGlnbi1mbG9hdCB7DQotICAgIGZsb2F0OiByaWdodDsNCi19DQotDQotLmFsaWduLXRleHQgew0KLSAgICB0ZXh0LWFsaWduOiByaWdodDsNCi19DQotDQotLmFsaWduLXRvcCB7DQotICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQotfQ0KLQ0KLS5jZW50ZXJlZCB7DQotICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCi19DQotDQotLnBhZ2UtY29udGFpbmVyIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI0I4REZGQzsNCi19DQotDQotLnRhYmJhciB7DQotICAgIGhlaWdodDogNDBweDsNCi0gICAgd2lkdGg6IDEwMCU7DQotICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9iYXIyLmdpZiIpIHJlcGVhdC14Ow0KLX0NCi0NCi0udGFiYmFyIC5icmVhZGNydW1icyB7DQotICAgIGNvbG9yOiAjRkZGRkZGOw0KLSAgICBmbG9hdDogbGVmdDsNCi0gICAgaGVpZ2h0OiAxMDAlOw0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoIi9ibHVlbGlnaHQvY29ybmVyLXRsLmdpZiIpIG5vLXJlcGVhdDsNCi19DQotDQotLnRhYmJhciAuYnJlYWRjcnVtYnMtc3RhcnQgew0KLSAgICBmbG9hdDogbGVmdDsNCi0gICAgaGVpZ2h0OiAxMDAlOw0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoIi9ibHVlbGlnaHQvYmFyMS5naWYiKSByZXBlYXQteDsNCi0gICAgbWFyZ2luLWxlZnQ6IDE1cHg7DQotICAgIHBhZGRpbmctdG9wOiAxZW07DQotICAgIGRpc3BsYXk6IGlubGluZTsgLyogSUUgRml4ICovDQotfQ0KLQ0KLS50YWJiYXIgLmJyZWFkY3J1bWJzLXNlcCB7DQotICAgIGZsb2F0OiBsZWZ0Ow0KLSAgICBoZWlnaHQ6IDEwMCU7DQotICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9zZXBhcmF0b3IuZ2lmIikgbm8tcmVwZWF0Ow0KLSAgICBwYWRkaW5nLXRvcDogMC44ZW07DQotICAgIG1hcmdpbi1ib3R0b206IC0xZW07DQotICAgIHBhZGRpbmctbGVmdDogMy41ZW07DQotICAgIGZvbnQtc2l6ZTogMS41ZW07DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0udGFiYmFyIC5icmVhZGNydW1icy1lbmQgew0KLSAgICBmbG9hdDogcmlnaHQ7DQotICAgIGhlaWdodDogMTAwJTsNCi0gICAgYmFja2dyb3VuZDogdXJsKCIvYmx1ZWxpZ2h0L2Nvcm5lci10ci5naWYiKSBuby1yZXBlYXQ7DQotICAgIHdpZHRoOiAxNXB4Ow0KLX0NCi0NCi0uYm90dG9tLWJhciB7DQotICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9iYXIzLmdpZiIpIHJlcGVhdC14Ow0KLSAgICBoZWlnaHQ6IDE1cHg7DQotICAgIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi0uYm90dG9tLWJhciAubGVmdCB7DQotICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9jb3JuZXItYmwuZ2lmIikgdG9wIGxlZnQgbm8tcmVwZWF0Ow0KLX0NCi0NCi0uYm90dG9tLWJhciAucmlnaHQgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoIi9ibHVlbGlnaHQvY29ybmVyLWJyLmdpZiIpIHRvcCByaWdodCBuby1yZXBlYXQ7DQotfQ0KLQ0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLS8qID09PT09IE1hc3RoZWFkIChIZWFkZXIpIFN0eWxlcyA9PT09PSAqLw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLSNtYXN0aGVhZCB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7DQotICAgIGNvbG9yOiAjMDAwMDAwOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgaGVpZ2h0OiAxJTsgLyogSUUgZml4ICovDQotfQ0KLQ0KLSNtYXN0aGVhZCB1bCBsaSB7DQotICAgIGZsb2F0OiBsZWZ0Ow0KLSAgICBwYWRkaW5nOiAwLjRlbTsNCi19DQotDQotI21hc3RoZWFkIHVsIC5sb2dvLWFyZWEgew0KLSAgICAvKiBwbGFjZWhvbGRlciAqLw0KLX0NCi0NCi0jbWFzdGhlYWQgdWwgLm9wcG9zZWQsDQotI21hc3RoZWFkIHVsIC5jb250cm9sLWFyZWEgew0KLSAgICBmbG9hdDogcmlnaHQ7DQotICAgIHRleHQtYWxpZ246IHJpZ2h0Ow0KLX0NCi0NCi11bCNwcmVmZXJlbmNlcy1tZW51IHsNCi0gICAgZm9udC1zaXplOiAxLjFlbTsNCi0gICAgZmxvYXQ6IHJpZ2h0Ow0KLX0NCi0NCi11bCNwcmVmZXJlbmNlcy1tZW51IGxpIHsNCi0gICAgYm9yZGVyLWxlZnQ6IHNvbGlkIDFweCAjQkJCQkJCOw0KLSAgICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsNCi19DQotDQotdWwjcHJlZmVyZW5jZXMtbWVudSBsaS5maXJzdCwNCi11bCNwcmVmZXJlbmNlcy1tZW51IGxpLnVzZXIsDQotdWwjcHJlZmVyZW5jZXMtbWVudSBsaS5vcmcgew0KLSAgICBib3JkZXI6IG5vbmU7DQotfQ0KLQ0KLXVsI3ByZWZlcmVuY2VzLW1lbnUgbGkudXNlciwNCi11bCNwcmVmZXJlbmNlcy1tZW51IGxpLm9yZyB7DQotICAgIHBhZGRpbmc6IDA7DQotICAgIGNvbG9yOiAjNzc3Nzc3Ow0KLX0NCi0NCi11bCNwcmVmZXJlbmNlcy1tZW51IGxpLnVzZXIgYSwNCi11bCNwcmVmZXJlbmNlcy1tZW51IGxpLm9yZyBhIHsNCi0gICAgY29sb3I6ICM3Nzc3Nzc7DQotfQ0KLQ0KLXVsI3ByZWZlcmVuY2VzLW1lbnUgbGkudXNlciBhOmhvdmVyIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogIzc3Nzc3NzsNCi0gICAgY29sb3I6ICNGRkZGRkY7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotdWwjcHJlZmVyZW5jZXMtbWVudSBsaS5leHBhbmRlZCwNCi11bCNwcmVmZXJlbmNlcy1tZW51IGxpLmNvbGxhcHNlZCB7DQotICAgIHBhZGRpbmc6IDAgMCAwIDVweDsNCi0gICAgd2lkdGg6IDMycHg7DQotfQ0KLQ0KLXVsI3ByZWZlcmVuY2VzLW1lbnUgbGkuZXhwYW5kZWQgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvYnVsbGV0X2Fycm93X3VwLnBuZykgbm8tcmVwZWF0IHJpZ2h0Ow0KLX0NCi0NCi11bCNwcmVmZXJlbmNlcy1tZW51IGxpLmNvbGxhcHNlZCB7DQotICAgIGJhY2tncm91bmQ6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy9idWxsZXRfYXJyb3dfZG93bi5wbmcpIG5vLXJlcGVhdCByaWdodDsNCi19DQotDQotdWwjcHJlZmVyZW5jZXMtbWVudSBsaS5jb2xsYXBzZWQgYSwNCi11bCNwcmVmZXJlbmNlcy1tZW51IGxpLmV4cGFuZGVkIGEgew0KLSAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7DQotfQ0KLQ0KLXVsI3ByZWZlcmVuY2VzLW1lbnUgbGkgYSB7DQotICAgIGNvbG9yOiAjNUNBM0Q3Ow0KLSAgICBwYWRkaW5nOiAwLjJlbTsNCi19DQotDQotdWwjcHJlZmVyZW5jZXMtbWVudSBhOmhvdmVyIHsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0uY29udHJvbC1hcmVhIGEgew0KLSAgICBmb250LXNpemU6IDEuMWVtOw0KLSAgICBjb2xvcjogIzVDQTNENzsNCi19DQotDQotdWwjcHJlZmVyZW5jZXMtbWVudSBsaSBhLmhlbHAtbGluayB7DQotICAgIGRpc3BsYXk6IGJsb2NrOw0KLSAgICBoZWlnaHQ6IDEycHg7DQotICAgIHdpZHRoOiAxMHB4Ow0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9oZWxwLnBuZykgbm8tcmVwZWF0Ow0KLX0NCi0NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLS8qID09PT09IEZvb3RlciBTdHlsZXMgPT09PT09PT09PT09PT09PT09PT09ICovDQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0jZm9vdGVyIHsNCi0gICAgdGV4dC1hbGlnbjogY2VudGVyOw0KLSAgICBwYWRkaW5nLWJvdHRvbTogMWVtOw0KLX0NCi0NCi0jZm9vdGVyIHAgew0KLSAgICBtYXJnaW46IDFlbTsNCi19DQotDQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLS8qID09PT09IFNlY29uZGFyeSBOYXZpZ2F0aW9uIChBcHAgTWVudSkgU3R5bGVzID09PT09PT09PT0gKi8NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQotI3NlY29uZGFyeS1uYXZpZ2F0aW9uIHsNCi0NCi19DQotDQotI3NlY29uZGFyeS1uYXZpZ2F0aW9uIGEgew0KLSAgICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsNCi0gICAgYm9yZGVyOiAwLjA1ZW0gc29saWQgIzAwMDA5OTsNCi0gICAgY29sb3I6ICNmZmZmNjY7DQotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvaW1hZ2VzL2dyYWRpZW50X3N1Yl91bnMuZ2lmKTsNCi0gICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14Ow0KLX0NCi0NCi0jc2Vjb25kYXJ5LW5hdmlnYXRpb24gLmRpc2FibGVkIHsNCi0gICAgcGFkZGluZzogMCAxZW0gMCAxZW07DQotICAgIGJvcmRlcjogMC4wNWVtIHNvbGlkICMwMDAwOTk7DQotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvaW1hZ2VzL2dyYWRpZW50X3N1Yl91bnMuZ2lmKTsNCi0gICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14Ow0KLSAgICBjb2xvcjogI0Q0RDBDODsNCi19DQotDQotI3NlY29uZGFyeS1uYXZpZ2F0aW9uIGEuc2VsZWN0ZWQsICNzZWNvbmRhcnktbmF2aWdhdGlvbiBhOmhvdmVyIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogIzI2MjZjMTsNCi0gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC9pbWFnZXMvZ3JhZGllbnRfc3ViX3NlbC5naWYpOw0KLSAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7DQotICAgIGJvcmRlci1ib3R0b206IDAuMDVlbSBzb2xpZCAjMjYyNmMxOw0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICAgIGNvbG9yOiAjZmZmZmZmOw0KLX0NCi0NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLS8qID09PT09IE1haW4gTmF2aWdhdGlvbiAoQXBwIE1lbnUpIFN0eWxlcyA9PT09PT09PT09ICovDQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0vKiA9PT09PSBDb21wb25lbnQgTmF2aWdhdGlvbiAoQXBwIEhlYWRlcikgU3R5bGVzID09PT09PT09PT0gKi8NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0jbWFpbi1uYXZpZ2F0aW9uLCAjYXBwLW5hdmlnYXRpb24gew0KLSAgICBmbG9hdDogbGVmdDsNCi0gICAgZm9udC1zaXplOiAxMzAlOw0KLX0NCi0NCi0jYXBwLW5hdmlnYXRpb24gLmNsZWFyIHsNCi0gICAgY2xlYXI6IG5vbmU7DQotfQ0KLQ0KLSNtYWluLW5hdmlnYXRpb24gaDIsDQotI2FwcC1uYXZpZ2F0aW9uIGgyIHsNCi0gICAgY29sb3I6ICNGRkZGRkY7DQotICAgIGN1cnNvcjogZGVmYXVsdDsNCi0gICAgZm9udC1zaXplOiAxLjJlbTsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIG1hcmdpbi1yaWdodDogMWVtOw0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICAgIHBhZGRpbmctcmlnaHQ6IDIwcHg7DQotICAgIHBhZGRpbmctYm90dG9tOiA3cHg7DQotICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9hcnJvdy13aGl0ZS1ydC5naWYiKSBuby1yZXBlYXQgMTAwJSAwJTsNCi19DQotDQotI21haW4tbmF2aWdhdGlvbiB1bCBsaSB1bCwNCi0jYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgew0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNBQUQ2RjY7DQotICAgIHotaW5kZXg6IDk5OTk7DQotICAgIHdpZHRoOiAyMDBweDsNCi0gICAgYm9yZGVyLWJvdHRvbTogc29saWQgM3B4ICNhYWE7DQotICAgIGJvcmRlci1yaWdodDogc29saWQgM3B4ICNhYWE7DQotICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggI2FhYTsNCi19DQotDQotI21haW4tbmF2aWdhdGlvbiB1bCBsaSB1bCBsaSBhLA0KLSNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaSBhIHsNCi0gICAgZGlzcGxheTogYmxvY2s7DQotICAgIHBhZGRpbmc6IDRweCAxNnB4IDRweCAxNnB4Ow0KLSAgICBib3JkZXItdG9wOiBub25lOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgY29sb3I6ICM0NDQ7DQotfQ0KLQ0KLS8qQ29sb3Igc3ViY2VsbHMgbm9ybWFsIG1vZGUqLw0KLQ0KLSNtYWluLW5hdmlnYXRpb24gdWwgbGkgdWwgbGkgYTpob3ZlciwNCi0jYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGkgYTpob3ZlciB7DQotICAgIGJhY2tncm91bmQ6ICNFQUVBRUE7DQotICAgIGJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsICNGNUY1RjUsICNBQUQ2RjYpOw0KLSAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCi19DQotDQotLypDb2xvciBzdWJjZWxscyBob3ZlcmluZyBtb2RlKi8NCi0NCi0jbWFpbi1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpIGEuZGlzYWJsZWQsDQotI2FwcC1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpIGEuZGlzYWJsZWQgew0KLSAgICBjb2xvcjogIzk5OTk5OTsNCi19DQotDQotLypDb2xvciBzdWJjZWxscyBkaXNhYmxlZCBtb2RlKi8NCi0NCi0jbWFpbi1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpIHVsLnNlY29uZGFyeSB7DQotICAgIGxlZnQ6IDIwNHB4Ow0KLX0NCi0NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQotLyogPT09PT0gU2NyZWVubGV0IFRpdGxlIEJhci9OYXZpZ2F0aW9uIFN0eWxlcyA9PT09PSAqLw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0NCi0uc2NyZWVubGV0LXRpdGxlLWJhciB7DQotICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9ib3gtaGVhZC10bC5naWYiKSBuby1yZXBlYXQ7DQotICAgIGNvbG9yOiAjZmZmZmZmOw0KLSAgICBoZWlnaHQ6IDElOyAvKiBJRSBmaXggKi8NCi0gICAgbWluLWhlaWdodDogMS41ZW07DQotfQ0KLQ0KLS5zY3JlZW5sZXQtdGl0bGUtYmFyIC5oMSwNCi0uc2NyZWVubGV0LXRpdGxlLWJhciAuaDIsDQotLnNjcmVlbmxldC10aXRsZS1iYXIgLmgzLA0KLS5zY3JlZW5sZXQtdGl0bGUtYmFyIGgxLA0KLS5zY3JlZW5sZXQtdGl0bGUtYmFyIGgyLA0KLS5zY3JlZW5sZXQtdGl0bGUtYmFyIGgzIHsNCi0gICAgYmFja2dyb3VuZDogbm9uZTsNCi0gICAgY29sb3I6ICNmZmZmZmY7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICBwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjJlbSAwLjVlbTsNCi19DQotDQotLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgew0KLSAgICBkaXNwbGF5OiBpbmxpbmU7IC8qIElFIEZpeCAqLw0KLX0NCi0NCi0uc2NyZWVubGV0LXRpdGxlLWJhciB1bCBsaSB7DQotICAgIGJhY2tncm91bmQ6IG5vbmU7DQotICAgIGJvcmRlci1sZWZ0OiAwLjFlbSBzb2xpZCAjNWY5ZmNmOw0KLSAgICBjb2xvcjogI2ZmZmZmZjsNCi0gICAgZmxvYXQ6IHJpZ2h0Ow0KLSAgICBmb250LXNpemU6IDFlbTsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIHBhZGRpbmc6IDAuMWVtIDAuNWVtIDAuMmVtIDAuNWVtOw0KLX0NCi0NCi0uc2NyZWVubGV0LXRpdGxlLWJhciB1bCBoMSwNCi0uc2NyZWVubGV0LXRpdGxlLWJhciB1bCBoMiwNCi0uc2NyZWVubGV0LXRpdGxlLWJhciB1bCBoMywNCi0uc2NyZWVubGV0LXRpdGxlLWJhciB1bCAuaDEsDQotLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgLmgyLA0KLS5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIC5oMyB7DQotICAgIGJvcmRlci1sZWZ0OiBub25lOw0KLSAgICBmbG9hdDogbGVmdDsNCi19DQotDQotLnNjcmVlbmxldC10aXRsZS1iYXIgLmgxIHsNCi0gICAgZm9udC1zaXplOiAxLjZlbTsNCi19DQotDQotLnNjcmVlbmxldC10aXRsZS1iYXIgLmgyIHsNCi0gICAgZm9udC1zaXplOiAxLjNlbTsNCi19DQotDQotLnNjcmVlbmxldC10aXRsZS1iYXIgLmgzLCAuc2NyZWVubGV0LXRpdGxlLWJhciAuaGVhZDQgew0KLSAgICBmb250LXNpemU6IDEuMWVtOw0KLX0NCi0NCi0uc2NyZWVubGV0LXRpdGxlLWJhciAuaDMgYSB7DQotICAgIGNvbG9yOiAjZmZmZjY2Ow0KLSAgICBkaXNwbGF5OiBpbmxpbmU7DQotfQ0KLQ0KLS5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIGEgew0KLSAgICBjb2xvcjogI2ZmZmY2NjsNCi0gICAgZGlzcGxheTogYmxvY2s7DQotfQ0KLQ0KLS5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIGE6dmlzaXRlZCB7DQotICAgIGNvbG9yOiAjZmZmZjY2Ow0KLX0NCi0NCi0uc2NyZWVubGV0LXRpdGxlLWJhciB1bCBhOmhvdmVyIHsNCi0gICAgY29sb3I6ICNGRjY7DQotICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KLX0NCi0NCi0uc2NyZWVubGV0LXRpdGxlLWJhciB1bCAuZGlzYWJsZWQgew0KLSAgICBjb2xvcjogI0NDQ0NDQzsNCi19DQotDQotLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgbGkuY29sbGFwc2VkIGEsDQotLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgbGkuY29sbGFwc2VkIGE6aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvYnVsbGV0X2Fycm93X2Rvd24ucG5nKSBuby1yZXBlYXQgY2VudGVyOw0KLSAgICB3aWR0aDogMzJweDsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0uc2NyZWVubGV0LXRpdGxlLWJhciB1bCBsaS5leHBhbmRlZCBhLA0KLS5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIGxpLmV4cGFuZGVkIGE6aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvYnVsbGV0X2Fycm93X3VwLnBuZykgbm8tcmVwZWF0IGNlbnRlcjsNCi0gICAgd2lkdGg6IDMycHg7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgLmNvbGxhcHNlZCBhLA0KLS5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIC5leHBhbmRlZCBhIHsNCi0gICAgLyogSUUgZml4ICovDQotICAgIGN1cnNvcjogZGVmYXVsdDsNCi19DQotDQotLyogbG9naW4gc2NyZWVubGV0IGRlY29yYXRvciAqLw0KLS5sb2dpbi1zY3JlZW5sZXQgew0KLSAgICBtaW4td2lkdGg6IDI1ZW07DQotICAgIHdpZHRoOiAyNSU7DQotfQ0KLQ0KLS5sb2dpbi1zY3JlZW5sZXQgLnNjcmVlbmxldC10aXRsZS1iYXIgew0KLSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLWFqYXggYXV0byBjb21wbGV0ZQ0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLWRpdi5hdXRvY29tcGxldGUgew0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7DQotICAgIC8qIG1pbi13aWR0aDoxNTRweDsgKi8NCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsNCi0gICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTsNCi0gICAgbWFyZ2luOiAwOw0KLSAgICBwYWRkaW5nOiAwOw0KLX0NCi0NCi1kaXYuYXV0b2NvbXBsZXRlIHVsIHsNCi0gICAgbGlzdC1zdHlsZS10eXBlOiBub25lOw0KLSAgICBtYXJnaW46IDA7DQotICAgIHBhZGRpbmc6IDA7DQotfQ0KLQ0KLWRpdi5hdXRvY29tcGxldGUgdWwgbGkuc2VsZWN0ZWQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZiOw0KLX0NCi0NCi1kaXYuYXV0b2NvbXBsZXRlIHVsIGxpIHsNCi0gICAgbGlzdC1zdHlsZS10eXBlOiBub25lOw0KLSAgICBkaXNwbGF5OiBibG9jazsNCi0gICAgZmxvYXQ6IG5vbmU7DQotICAgIG1hcmdpbjogMDsNCi0gICAgcGFkZGluZzogMnB4Ow0KLSAgICAvKmhlaWdodDozMnB4OyovDQotICAgIGN1cnNvcjogcG9pbnRlcjsNCi19DQotDQotLmluZGljYXRvciBpbWcgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hamF4LWxvYWRlci5naWYpIG5vLXJlcGVhdCAwIDA7DQotICAgIGRpc3BsYXk6IGJsb2NrOw0KLSAgICBtYXJnaW46IDNweCAxMHB4IDBweCAyNHB4Ow0KLSAgICB3aWR0aDogMTZweDsNCi0gICAgaGVpZ2h0OiAxNnB4Ow0KLSAgICBib3JkZXI6IG5vbmU7DQotfQ0KLQ0KLS5zY3JlZW5sZXQtdGl0bGUtYmFyIC5pbmRpY2F0b3IgaW1nIHsNCi0gICAgZmxvYXQ6IHJpZ2h0Ow0KLSAgICBtYXJnaW46IDAgM3B4Ow0KLSAgICB3aWR0aDogMTZweDsNCi0gICAgaGVpZ2h0OiAxNnB4Ow0KLSAgICBkaXNwbGF5OiBpbmxpbmU7DQotfQ0KLQ0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0vKiA9PT09PSBCYXNpYyBOYXZpZ2F0aW9uIChWZXJ0aWNhbCBNZW51KSBTdHlsZSA9PT09PT09PT09ICovDQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLS5iYXNpYy1uYXYgeyAvKiBpbmRlbnQgbWVudSAtIGhlbHBmdWwgZm9yIHdpZGdldHMgKi8NCi0gICAgcGFkZGluZy1sZWZ0OiAxZW07DQotfQ0KLQ0KLS5iYXNpYy1uYXYgdWwgeyAvKiBwbGFjZWhvbGRlciAqLw0KLQ0KLX0NCi0NCi0uYmFzaWMtbmF2IHVsIGxpIHsNCi0NCi19DQotDQotLmJhc2ljLW5hdiB1bCBhIHsNCi0gICAgY29sb3I6ICMwMDAwOTk7DQotICAgIGZvbnQtc2l6ZTogMS4xZW07DQotfQ0KLQ0KLS5iYXNpYy1uYXYgdWwgLnNlbGVjdGVkLCAuYmFzaWMtbmF2IHVsIC5zZWxlY3RlZCBhIHsNCi0gICAgY29sb3I6ICMwMDAwZmY7DQotfQ0KLQ0KLS5iYXNpYy1uYXYgdWwgYTpob3ZlciB7DQotICAgIGNvbG9yOiAjMDAwMGZmOw0KLX0NCi0NCi0uYmFzaWMtbmF2IHVsIC5kaXNhYmxlZCwgLmJhc2ljLW5hdiB1bCAuZGlzYWJsZWQgYSB7DQotICAgIGNvbG9yOiAjRDREMEM4Ow0KLX0NCi0NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQotLyogPT09PT0gQnV0dG9uIEJhciBOYXZpZ2F0aW9uIFN0eWxlcyA9PT09PSAqLw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0uYnV0dG9uLWJhciB7DQotICAgIG1hcmdpbjogMCAxZW0gMWVtIDA7DQotfQ0KLQ0KLS5idXR0b24tYmFyIHVsIHsNCi0gICAgZGlzcGxheTogaW5saW5lOyAvKiBJRSBGaXggKi8NCi19DQotDQotLmJ1dHRvbi1iYXIgdWwgbGkgew0KLSAgICBmbG9hdDogbGVmdDsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIHBhZGRpbmc6IDAuMWVtIDAuNGVtIDAuMWVtIDAuNGVtOw0KLX0NCi0NCi0uYnV0dG9uLWJhciB1bCAub3Bwb3NlZCB7DQotICAgIGZsb2F0OiByaWdodDsNCi19DQotDQotLmJ1dHRvbi1iYXIgdWwgYSwgLnRhYkNvbnRhaW5lciB1bCBhIHsNCi0gICAgZGlzcGxheTogYmxvY2s7DQotfQ0KLQ0KLS5idXR0b24tYmFyIHVsIGEsIC5idXR0b24tYmFyIGEgew0KLSAgICBwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjFlbSAwLjVlbTsNCi0gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCi19DQotDQotLmJ1dHRvbi1iYXIgdWwgYTpob3ZlciB7DQotICAgIGNvbG9yOiAjMDAwMGZmOw0KLX0NCi0NCi0uYnV0dG9uLWJhciAub3Bwb3NlZCwgLmJ1dHRvbi1iYXIgLm9wcG9zZWQgbGksIC5idXR0b24tYmFyIHVsIC5vcHBvc2VkIHsNCi0gICAgZmxvYXQ6IHJpZ2h0Ow0KLX0NCi0NCi0vKiA9PT09PSBCdXR0b24gc3R5bGUgZGVjb3JhdG9yID09PT09ICovDQotLmJ1dHRvbi1zdHlsZS0xIHVsIGxpLCAudGFiQ29udGFpbmVyIHVsIGxpIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsNCi0gICAgY29sb3I6ICMwMDAwOTk7DQotfQ0KLQ0KLS5idXR0b24tc3R5bGUtMSBhLCAuYnV0dG9uLXN0eWxlLTEgdWwgYSwgYS5idXR0b24tc3R5bGUtMSB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNENEQwQzg7DQotICAgIGJvcmRlcjogc29saWQgIzAwMDA5OSAwLjFlbTsNCi0gICAgY29sb3I6ICMwMDAwOTk7DQotfQ0KLQ0KLS5idXR0b24tc3R5bGUtMSAuc2VsZWN0ZWQsIC5idXR0b24tc3R5bGUtMSB1bCAuc2VsZWN0ZWQsIC5idXR0b24tc3R5bGUtMSB1bCAuc2VsZWN0ZWQgYSB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwOTk7DQotICAgIGNvbG9yOiAjZmZmZmZmOw0KLX0NCi0NCi0uYnV0dG9uLXN0eWxlLTEgYTpob3ZlciwgLmJ1dHRvbi1zdHlsZS0xIHVsIGE6aG92ZXIsIGEuYnV0dG9uLXN0eWxlLTE6aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDk5Ow0KLSAgICBjb2xvcjogI2ZmZmZmZjsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0vKiA9PT09PSBCdXR0b24gc3R5bGUgZGVjb3JhdG9yID09PT09ICovDQotLmJ1dHRvbi1zdHlsZS0yIHVsIGxpIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsNCi0gICAgY29sb3I6ICMwMDAwOTk7DQotfQ0KLQ0KLS5idXR0b24tc3R5bGUtMiB1bCBhLCAuYnV0dG9uLXN0eWxlLTIgYSwgYS5idXR0b24tc3R5bGUtMiB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQotICAgIGJvcmRlcjogc29saWQgIzAwMDA5OSAwLjFlbTsNCi0gICAgY29sb3I6ICMwMDAwOTk7DQotfQ0KLQ0KLS5idXR0b24tc3R5bGUtMiB1bCAuc2VsZWN0ZWQgYSwgLmJ1dHRvbi1zdHlsZS0yIC5zZWxlY3RlZCB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwOTk7DQotICAgIGNvbG9yOiAjZmZmZmZmOw0KLX0NCi0NCi0uYnV0dG9uLXN0eWxlLTIgdWwgYTpob3ZlciwgLmJ1dHRvbi1zdHlsZS0yIGE6aG92ZXIsIGEuYnV0dG9uLXN0eWxlLTI6aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDk5Ow0KLSAgICBjb2xvcjogI2ZmZmZmZjsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0uYnV0dG9uLXN0eWxlLTIgLmRpc2FibGVkIHsNCi0gICAgYm9yZGVyOiBzb2xpZCAjRDREMEM4IDAuMWVtOw0KLSAgICBjb2xvcjogI0Q0RDBDOA0KLX0NCi0NCi0vKiA9PT09PSBCdXR0b24gYmFyIGRlY29yYXRvcnMgPT09PT0gKi8NCi0udG9vbC1iYXIgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDREMEM4Ow0KLSAgICBib3JkZXI6IDAuMWVtIHNvbGlkICMwMDAwOTk7DQotICAgIHBhZGRpbmc6IDAuMmVtOw0KLX0NCi0NCi0udG9vbC1iYXIgdWwgbGkgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDREMEM4Ow0KLSAgICBwYWRkaW5nOiAwLjFlbTsNCi19DQotDQotLyogdGFiLWJhciBkZWNvcmF0b3IgaW50ZW5kZWQgdG8gYmUgdXNlZCBhdA0KLXRoZSB0b3Agb2YgdGhlIG1haW4gY29udGVudCBhcmVhICovDQotLnRhYi1iYXIgew0KLSAgICBkaXNwbGF5OiB0YWJsZTsNCi19DQotDQotLnRhYi1iYXIgdWwgbGkgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDM2NmIwOw0KLSAgICBtYXJnaW46IDA7DQotfQ0KLQ0KLS50YWItYmFyIHVsIGEsIC50YWItYmFyIHVsIGE6dmlzaXRlZCB7DQotICAgIGNvbG9yOiAjZmZmZmZmOw0KLX0NCi0NCi0udGFiLWJhciB1bCBhOmhvdmVyLCAudGFiLWJhciB1bCAuc2VsZWN0ZWQsIC50YWItYmFyIHVsIC5zZWxlY3RlZCBhLCAudGFiLWJhciB1bCAuc2VsZWN0ZWQgYTpob3ZlciB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICM1ZjlmY2Y7DQotICAgIGNvbG9yOiAjZmZmZmZmOw0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLS50YWItYmFyIHVsIC5kaXNhYmxlZCB7DQotICAgIGNvbG9yOiAjRDREMEM4Ow0KLSAgICBwYWRkaW5nOiAwLjFlbSAwLjRlbSAwLjFlbSAwLjRlbTsNCi19DQotDQotLnRhYi1iYXIgLm9wcG9zZWQsIC50YWItYmFyIC5vcHBvc2VkIGxpLCAudGFiLWJhciB1bCAub3Bwb3NlZCB7DQotICAgIGJvcmRlci1sZWZ0OiAwLjFlbSBzb2xpZCAjNWY5ZmNmOw0KLSAgICBib3JkZXItcmlnaHQ6IG5vbmU7DQotfQ0KLQ0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PSAqLyAvKiA9PT09PSBUYWJsZSBTdHlsZXMgPT09PT0gKi8NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0uYmFzaWMtdGFibGUgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOw0KLSAgICBjb2xvcjogIzAwMDAwMDsNCi0gICAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLWZvcm0gLmJhc2ljLXRhYmxlLCAuc2NyZWVubGV0LWJvZHkgLmJhc2ljLXRhYmxlIHsNCi0gICAgbWFyZ2luLWJvdHRvbTogMDsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIHRkIHsgLyogU3R5bGUgZm9yIGFsbCBjZWxscyAqLw0KLSAgICBwYWRkaW5nOiAwLjFlbTsNCi0gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIC5sYWJlbCwgLmJhc2ljLXRhYmxlIHRyIC5ncm91cC1sYWJlbCB7DQotICAgIC8qIGZpZWxkIGxhYmVscyBmb3IgZm9ybXMgKi8NCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIHRleHQtYWxpZ246IHJpZ2h0Ow0KLSAgICBwYWRkaW5nLXJpZ2h0OiAxLjVlbTsNCi0gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCi0gICAgd2lkdGg6IDElOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgLmdyb3VwLWxhYmVsIHsgLyogImhlYWRlciIgZm9yIGZpZWxkIGxhYmVsIGdyb3VwcyAqLw0KLSAgICBmb250LXNpemU6IDEuMmVtOw0KLSAgICBwYWRkaW5nOiAyZW0gMS41ZW0gMCAwOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgdGgsIC5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdyB7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgdGQgew0KLSAgICBib3JkZXItYm90dG9tOiAwLjFlbSBzb2xpZCAjMDAwMDAwOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgdGQgYSB7DQotICAgIGNvbG9yOiAjMDAwMDAwOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3cgeyAvKiBBbHRlcm5hdGluZyByb3cgc3R5bGUgKi8NCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5zZWxlY3RlZCB7DQotICAgIGJhY2tncm91bmQ6ICNGRkZDQ0Y7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvd1NlbGVjdGVkIHsNCi0gICAgYmFja2dyb3VuZDogI0ZGRjU1RjsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5WYWxpZGF0ZSB7IC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovDQotICAgIGJhY2tncm91bmQ6ICNBMEQ1Rjc7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvd1ZhbGlkYXRlIHsNCi0gICAgLypTdHlsZSB1c2UgYnkgYWx0LXJvdy1zdHlsZSBvbiBsaXN0Ki8NCi0gICAgYmFja2dyb3VuZDogIzcyQThGMjsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5XYXJuIHsgLypTdHlsZSB1c2UgYnkgYWx0LXJvdy1zdHlsZSBvbiBsaXN0Ki8NCi0gICAgYmFja2dyb3VuZDogI2Y1NUM1QzsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93V2FybiB7IC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovDQotICAgIGJhY2tncm91bmQ6ICNGQzc0NTU7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCB7DQotICAgIC8qIGJ1dHRvbiBjb2x1bW4gc3R5bGUgLSBmb3IgdGhlIHNtYWxsDQotICAgY29sbGVjdGlvbiBvZiBidXR0b25zIHVzZWQgaW4gbGlzdHMgKi8NCi0gICAgdmVydGljYWwtYWxpZ246IHRvcDsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGEgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOw0KLSAgICBib3JkZXI6ICM5OTk5OTkgc29saWQgMC4xZW07DQotICAgIGNvbG9yOiAjMDAwMDk5Ow0KLSAgICBmbG9hdDogbGVmdDsNCi0gICAgbWFyZ2luOiAwIDAuMWVtIDAgMC4xZW07DQotICAgIHBhZGRpbmc6IDAuMWVtIDAuNGVtIDAuMWVtIDAuNGVtOw0KLSAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgLnNtYWxsU3VibWl0LCAuYmFzaWMtdGFibGUgdHIgLnNtYWxsU3VibWl0OnZpc2l0ZWQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOw0KLSAgICBib3JkZXI6ICM5OTk5OTkgc29saWQgMC4xZW07DQotICAgIGNvbG9yOiAjMDAwMDk5Ow0KLSAgICBmb250LXNpemU6IDFlbTsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIG1hcmdpbjogMC4yZW07DQotICAgIHBhZGRpbmc6IDAuMWVtIDAuMmVtIDAuMWVtIDAuMmVtOw0KLSAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgYTpob3ZlciwgLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGE6YWN0aXZlLCAuYmFzaWMtdGFibGUgdHIgLnNtYWxsU3VibWl0OmhvdmVyLCAuYmFzaWMtdGFibGUgdHIgLnNtYWxsU3VibWl0OmFjdGl2ZSB7DQotICAgIGNvbG9yOiAjZmYwMDAwOw0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuY29sbGFwc2VkIHsNCi0gICAgdmlzaWJpbGl0eTogY29sbGFwc2U7DQotfQ0KLQ0KLS8qID09PT09IEFsdGVybmF0ZSB0YWJsZSBoZWFkZXIgc3R5bGUgPT09PT0gKi8NCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCwgLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5Ow0KLSAgICBib3JkZXItYm90dG9tOiAwOw0KLSAgICBib3JkZXItbGVmdDogMC4xZW0gc29saWQgI2NjY2NjYzsNCi0gICAgY29sb3I6ICNmZmZmZmY7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KLX0NCi0NCi0vKiA9PT09PSBTb3J0IGZpZWxkIHN0eWxlID09PT09ICovDQotLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGggLnNvcnQtb3JkZXItYXNjLCAuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCAuc29ydC1vcmRlci1hc2Mgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci11cC5wbmcpIG5vLXJlcGVhdCByaWdodDsNCi0gICAgcGFkZGluZy1yaWdodDogMjBweDsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGggLnNvcnQtb3JkZXItZGVzYywgLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGQgLnNvcnQtb3JkZXItZGVzYyB7DQotICAgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LWdyLWR3LnBuZykgbm8tcmVwZWF0IHJpZ2h0Ow0KLSAgICBwYWRkaW5nLXJpZ2h0OiAyMHB4Ow0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCAuc29ydC1vcmRlciwgLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGQgLnNvcnQtb3JkZXIgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci5wbmcpIG5vLXJlcGVhdCByaWdodDsNCi0gICAgcGFkZGluZy1yaWdodDogMjBweDsNCi19DQotDQotLyogPT09PT0gVGFibGUgZGVjb3JhdG9yIC0gSG92ZXIgYmFyID09PT09ICovDQotLmhvdmVyLWJhciB0cjpob3ZlciB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7DQotICAgIGN1cnNvcjogZGVmYXVsdDsNCi19DQotDQotLmhvdmVyLWJhciAuaGVhZGVyLXJvdzpob3ZlciwgLmhvdmVyLWJhciB0ciB0aDpob3ZlciB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQotICAgIGNvbG9yOiAjMDAwMDAwOw0KLX0NCi0NCi0vKiA9PT09PSBUYWJsZSBkZWNvcmF0b3IgLSBHcmlkID09PT09ICovDQotLyogVGhlc2UgZGVjb3JhdG9ycyBuZWVkIGFuIElFIGhhY2suIElFNyBkb2VzIG5vdA0KLXJlbmRlciBib3JkZXJzIGFyb3VuZCBlbXB0eSA8dGQ+IGVsZW1lbnRzICovDQotLmRhcmstZ3JpZCB7IC8qIGRhcmsgZ3JpZCAqLw0KLSAgICBib3JkZXItcmlnaHQ6IDAuMWVtIHNvbGlkICMwMDAwMDA7DQotICAgIGJvcmRlci10b3A6IDAuMWVtIHNvbGlkICMwMDAwMDA7DQotfQ0KLQ0KLS5kYXJrLWdyaWQgdGQsIC5kYXJrLWdyaWQgLmhlYWRlci1yb3ctMiB0aCwgLmRhcmstZ3JpZCAuaGVhZGVyLXJvdy0yIHRkIHsNCi0gICAgYm9yZGVyLWJvdHRvbTogMC4xZW0gc29saWQgIzAwMDAwMDsNCi0gICAgYm9yZGVyLWxlZnQ6IDAuMWVtIHNvbGlkICMwMDAwMDA7DQotfQ0KLQ0KLS5saWdodC1ncmlkIHsgLyogbGlnaHQgZ3JpZCAqLw0KLSAgICBib3JkZXItcmlnaHQ6IDAuMWVtIHNvbGlkICNjY2NjY2M7DQotICAgIGJvcmRlci10b3A6IDAuMWVtIHNvbGlkICNjY2NjY2M7DQotfQ0KLQ0KLS5saWdodC1ncmlkIHRkLCAubGlnaHQtZ3JpZCAuaGVhZGVyLXJvdyB0ZCB7DQotICAgIGJvcmRlci1ib3R0b206IDAuMWVtIHNvbGlkICNjY2NjY2M7DQotICAgIGJvcmRlci1sZWZ0OiAwLjFlbSBzb2xpZCAjY2NjY2NjOw0KLX0NCi0NCi0vKiA9PT09PSBUYWJsZSBkZWNvcmF0b3IgLSBDYWxlbmRhciA9PT09PSAqLw0KLS5jYWxlbmRhciB7DQotICAgIGJvcmRlci1yaWdodDogMC4xZW0gc29saWQgI2NjY2NjYzsNCi19DQotDQotLmNhbGVuZGFyIHRyIHRkIHsNCi0gICAgYm9yZGVyLWJvdHRvbTogMC4xZW0gc29saWQgI2NjY2NjYzsNCi0gICAgYm9yZGVyLWxlZnQ6IDAuMWVtIHNvbGlkICNjY2NjY2M7DQotICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQotICAgIHBhZGRpbmc6IDAuNWVtOw0KLX0NCi0NCi0uY2FsZW5kYXIgLmhlYWRlci1yb3cgdGQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjlhOWQ5Ow0KLSAgICBib3JkZXItYm90dG9tOiAwLjFlbSBzb2xpZCAjY2NjY2NjOw0KLSAgICBib3JkZXItbGVmdDogMC4xZW0gc29saWQgI2NjY2NjYzsNCi0gICAgY29sb3I6ICNmZmZmZmY7DQotICAgIGhlaWdodDogYXV0bzsNCi0gICAgdGV4dC1hbGlnbjogY2VudGVyOw0KLX0NCi0NCi0uY2FsZW5kYXIgdHIgdGQgLmFkZC1uZXcgew0KLSAgICBmbG9hdDogcmlnaHQ7DQotfQ0KLQ0KLS5jYWxlbmRhciB0ciB0ZCAuaDEgew0KLSAgICBjb2xvcjogIzAwMDA5OTsNCi0gICAgZmxvYXQ6IGxlZnQ7DQotfQ0KLQ0KLS5jYWxlbmRhciAuY3VycmVudC1wZXJpb2Qgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmNjOw0KLX0NCi0NCi0uY2FsZW5kYXIgLmFjdGl2ZS1wZXJpb2Qgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOw0KLX0NCi0NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PSAqLyAvKiA9PT09PSBUcmVlIFN0eWxlcyA9PT09PSAqLw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09ICovDQotLmJhc2ljLXRyZWUgeyAvKiBwbGFjZWhvbGRlciAqLw0KLQ0KLX0NCi0NCi0uYmFzaWMtdHJlZSB1bCB7DQotICAgIHBhZGRpbmctbGVmdDogMWVtOw0KLX0NCi0NCi0uYmFzaWMtdHJlZSBsaSB7DQotICAgIHBhZGRpbmctbGVmdDogMWVtOw0KLSAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KLX0NCi0NCi0uYmFzaWMtdHJlZSBsaSAuZXhwYW5kZWQgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9jb2xsYXBzZS5naWYpIG5vLXJlcGVhdCBsZWZ0IGNlbnRlcjsNCi0gICAgcGFkZGluZy1yaWdodDogMWVtOw0KLX0NCi0NCi0uYmFzaWMtdHJlZSBsaSAuY29sbGFwc2VkIHsNCi0gICAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvZXhwYW5kLmdpZikgbm8tcmVwZWF0IGxlZnQgY2VudGVyOw0KLSAgICBwYWRkaW5nLXJpZ2h0OiAxZW07DQotfQ0KLQ0KLS5iYXNpYy10cmVlIGxpIC5sZWFmbm9kZSB7DQotICAgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2V4cGFuZC1jb2xsYXBzZS1wbGFjZWhvbGRlci5naWYpIG5vLXJlcGVhdCBsZWZ0IGNlbnRlcjsNCi0gICAgcGFkZGluZy1yaWdodDogMWVtOw0KLX0NCi0NCi0uYmFzaWMtdHJlZSBsaSAudHJlZWl0ZW0geyAvKiB0cmVlaXRlbSBpcyBkZXByZWNhdGVkICovDQotICAgIGJvcmRlci1zdHlsZTogbm9uZTsNCi0gICAgY29sb3I6ICMwMDAwOTk7DQotICAgIGZvbnQtc2l6ZTogMWVtOw0KLX0NCi0NCi0uYmFzaWMtdHJlZSBsaSBhOmhvdmVyIHsNCi0gICAgY29sb3I6ICMwMDAwZmY7DQotfQ0KLQ0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PSAqLyAvKiA9PT09PSBGb3JtIFN0eWxlcyA9PT09PSAqLw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLS5iYXNpYy1mb3JtIHsNCi0gICAgbWFyZ2luLWJvdHRvbTogMWVtOw0KLX0NCi0NCi0uYmFzaWMtZm9ybSB0YWJsZSB7DQotICAgIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi0uYmFzaWMtZm9ybSB0YWJsZSAuaGVhZGVyLXJvdzpob3ZlciB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQotICAgIGNvbG9yOiAjMDAwMDAwOw0KLX0NCi0NCi0uYmFzaWMtZm9ybSB0YWJsZSB0ciB0ZCB7DQotICAgIHBhZGRpbmc6IDAuMWVtOw0KLX0NCi0NCi0uYmFzaWMtZm9ybSB0YWJsZSB0ciAubGFiZWwsIC5iYXNpYy1mb3JtIHRhYmxlIHRyIC5ncm91cC1sYWJlbCB7DQotICAgIC8qIGZpZWxkIGxhYmVscyBmb3IgZm9ybXMgKi8NCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIHRleHQtYWxpZ246IHJpZ2h0Ow0KLSAgICBwYWRkaW5nLXJpZ2h0OiAxLjVlbTsNCi0gICAgd2lkdGg6IDElOw0KLX0NCi0NCi0uYmFzaWMtZm9ybSB0YWJsZSB0ciAuZ3JvdXAtbGFiZWwgew0KLSAgICAvKiAiaGVhZGVyIiBmb3IgZmllbGQgbGFiZWwgZ3JvdXBzICovDQotICAgIGZvbnQtc2l6ZTogMS4yZW07DQotICAgIHBhZGRpbmc6IDJlbSAxLjVlbSAwIDA7DQotfQ0KLQ0KLS5iYXNpYy1mb3JtIHRhYmxlIHRyIHRoLCAuYmFzaWMtZm9ybSB0YWJsZSAuaGVhZGVyLXJvdyB7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KLX0NCi0NCi0uYmFzaWMtZm9ybSB0YWJsZSAuaGVhZGVyLXJvdzpob3ZlciwgLmJhc2ljLWZvcm0gdGFibGUgdHIgdGg6aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOw0KLSAgICBjb2xvcjogIzAwMDAwMDsNCi19DQotDQotLmJhc2ljLWZvcm0gdGFibGUgLmhlYWRlci1yb3cgdGQgew0KLSAgICBib3JkZXItYm90dG9tOiAwLjFlbSBzb2xpZCAjOTk5OTk5Ow0KLX0NCi0NCi0uYmFzaWMtZm9ybSB0YWJsZSAudmlld01hbnlUUjEsIC5iYXNpYy1mb3JtIHRhYmxlIC5hbHRlcm5hdGUtcm93IHsNCi0gICAgLyogQWx0ZXJuYXRpbmcgcm93IHN0eWxlICovDQotICAgIC8qIC52aWV3TWFueVRSMSBkZXByZWNhdGVkIC0gdXNlIC5hbHRlcm5hdGUtcm93ICovDQotICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7DQotfQ0KLQ0KLS5iYXNpYy1mb3JtIHRhYmxlIHRyIHRkIC5zbWFsbFN1Ym1pdCwgLmJhc2ljLWZvcm0gdGFibGUgdHIgdGQgLnNtYWxsU3VibWl0OnZpc2l0ZWQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOw0KLSAgICBib3JkZXI6ICM5OTk5OTkgc29saWQgMC4xZW07DQotICAgIGNvbG9yOiAjMDAwMDk5Ow0KLSAgICBmb250LXNpemU6IDFlbTsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIG1hcmdpbjogMC4yZW07DQotICAgIHBhZGRpbmc6IDAuMWVtIDAuMmVtIDAuMWVtIDAuMmVtOw0KLX0NCi0NCi0uYmFzaWMtZm9ybSB0YWJsZSB0ciB0ZCAuc21hbGxTdWJtaXQ6aG92ZXIsIC5iYXNpYy1mb3JtIHRhYmxlIHRyIHRkIC5zbWFsbFN1Ym1pdDphY3RpdmUgew0KLSAgICBjb2xvcjogI2ZmMDAwMDsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0uYmFzaWMtZm9ybSB0YWJsZSB0ciB0ZCAuZGlzYWJsZWQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOw0KLSAgICBjb2xvcjogIzMzMzM2NjsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0vKiA9PT09PSBGb3JtIGRlY29yYXRvciAtIEZvcm0gV2lkZ2V0ID09PT09ICovDQotLmZvcm0td2lkZ2V0IHRhYmxlIHRyIC5sYWJlbCwgLmZvcm0td2lkZ2V0LXRhYmxlIHRyIC5sYWJlbCB7DQotICAgIC8qIEFkZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovDQotICAgIHdpZHRoOiAyMCU7DQotfQ0KLQ0KLS5mb3JtLXdpZGdldCB0YWJsZSwgLmZvcm0td2lkZ2V0LXRhYmxlIHsNCi0gICAgd2lkdGg6IGF1dG87DQotfQ0KLQ0KLS5mb3JtLXdpZGdldC10YWJsZSB7DQotICAgIG1hcmdpbi1ib3R0b206IDFlbTsNCi19DQotDQotLyogUGFnZXIgKi8NCi0ubmF2LXBhZ2VyIHsNCi0gICAgaGVpZ2h0OiAyZW07DQotICAgIHBhZGRpbmctYm90dG9tOiAwLjdlbTsNCi0gICAgcGFkZGluZy10b3A6IDAuNGVtOw0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIHsNCi0gICAgZGlzcGxheTogaW5saW5lOyAvKiBJRSBGaXggKi8NCi19DQotDQotLm5hdi1wYWdlciB1bCBsaSB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQotICAgIGZsb2F0OiBsZWZ0Ow0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgbGluZS1oZWlnaHQ6IDEuOGVtOw0KLSAgICBtYXJnaW46IDAuMmVtOw0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIGxpIGEgew0KLSAgICBkaXNwbGF5OiBibG9jazsNCi0gICAgaGVpZ2h0OiAxNnB4Ow0KLSAgICB3aWR0aDogMTZweDsNCi0gICAgdGV4dC1pbmRlbnQ6IC0zMDAwcHg7DQotfQ0KLQ0KLS5uYXYtcGFnZXIgdWwgbGkgc3BhbiB7DQotICAgIGRpc3BsYXk6IG5vbmU7DQotICAgIHZpc2liaWxpdHk6IGhpZGRlbjsNCi0gICAgZGlzcGxheTogYmxvY2s7DQotICAgIGhlaWdodDogMTZweDsNCi0gICAgd2lkdGg6IDE2cHg7DQotfQ0KLQ0KLS5uYXYtcGFnZXIgdWwgLm5hdi1maXJzdCBhIHsNCi0gICAgYmFja2dyb3VuZDogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3Jlc3VsdHNldF9maXJzdC5wbmcpIG5vLXJlcGVhdDsNCi19DQotDQotLm5hdi1wYWdlciB1bCAubmF2LXByZXZpb3VzIGEgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvcmVzdWx0c2V0X3ByZXZpb3VzLnBuZykgbm8tcmVwZWF0Ow0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbmV4dCBhIHsNCi0gICAgYmFja2dyb3VuZDogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3Jlc3VsdHNldF9uZXh0LnBuZykgbm8tcmVwZWF0Ow0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbGFzdCBhIHsNCi0gICAgYmFja2dyb3VuZDogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3Jlc3VsdHNldF9sYXN0LnBuZykgbm8tcmVwZWF0Ow0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIC5uYXYtZmlyc3QtZGlzYWJsZWQgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvcmVzdWx0c2V0X2ZpcnN0X2Rpc2FibGVkLnBuZykgbm8tcmVwZWF0Ow0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIC5uYXYtcHJldmlvdXMtZGlzYWJsZWQgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvcmVzdWx0c2V0X3ByZXZpb3VzX2Rpc2FibGVkLnBuZykgbm8tcmVwZWF0Ow0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbmV4dC1kaXNhYmxlZCB7DQotICAgIGJhY2tncm91bmQ6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy9yZXN1bHRzZXRfbmV4dF9kaXNhYmxlZC5wbmcpIG5vLXJlcGVhdDsNCi19DQotDQotLm5hdi1wYWdlciB1bCAubmF2LWxhc3QtZGlzYWJsZWQgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvcmVzdWx0c2V0X2xhc3RfZGlzYWJsZWQucG5nKSBuby1yZXBlYXQ7DQotfQ0KLQ0KLS5uYXYtcGFnZXIgdWwgLm5hdi1wYWdlc2l6ZSB7DQotICAgIHBhZGRpbmc6IDAgMzBweCAwIDMwcHg7DQotfQ0KLQ0KLS5maWVsZC1sb29rdXAgYSB7DQotICAgIGJhY2tncm91bmQ6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy9hcHBsaWNhdGlvbl92aWV3X2xpc3QucG5nKSBuby1yZXBlYXQgMCAwOw0KLSAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQotICAgIC8qIG1hcmdpbjogM3B4IDEwcHggMHB4IDRweDsgKi8NCi0gICAgdmVydGljYWwtYWxpZ246IHRvcDsNCi0gICAgbWFyZ2luLXRvcDogM3B4Ow0KLSAgICB3aWR0aDogMTZweDsNCi0gICAgaGVpZ2h0OiAxNnB4Ow0KLX0NCi0NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLS8qID09PT09IEZpZWxkR3JvdXAgU3R5bGVzID09PT09ICovDQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0uZmllbGRncm91cC10aXRsZS1iYXIgew0KLSAgICBmb250LXNpemU6IDEuMmVtOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgcGFkZGluZzogNXB4IDAgNXB4IDEwcHg7DQotfQ0KLQ0KLS5maWVsZGdyb3VwLXRpdGxlLWJhciB1bCAuY29sbGFwc2VkLCAuZmllbGRncm91cC10aXRsZS1iYXIgdWwgLmNvbGxhcHNlZDpob3ZlciB7DQotICAgIGJhY2tncm91bmQ6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy9idWxsZXRfdG9nZ2xlX3BsdXMucG5nKSBuby1yZXBlYXQgbGVmdCBjZW50ZXI7DQotfQ0KLQ0KLS5maWVsZGdyb3VwLXRpdGxlLWJhciB1bCAuZXhwYW5kZWQsIC5maWVsZGdyb3VwLXRpdGxlLWJhciB1bCAuZXhwYW5kZWQ6aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvYnVsbGV0X3RvZ2dsZV9taW51cy5wbmcpIG5vLXJlcGVhdCBsZWZ0IGNlbnRlcjsNCi19DQotDQotLmZpZWxkZ3JvdXAtdGl0bGUtYmFyIGEgew0KLSAgICBjdXJzb3I6IHBvaW50ZXI7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gICAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KLSAgICBjb2xvcjogIzAwMDAwMDsNCi19DQotDQotLyogPT0gUG9ydGxldCBjb25maWd1cmF0aW9uIHNjcmVlbmxldCA9PSAqLw0KLS5wb3J0bGV0LWNvbmZpZyB7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNENEQwQzg7DQotICAgIGJvcmRlcjogMnB4IHNvbGlkICNENEQwQzg7DQotICAgIG1hcmdpbi1ib3R0b206IDVweDsNCi19DQotDQotLnBvcnRsZXQtY29uZmlnLXRpdGxlLWJhciAudGl0bGUgew0KLSAgICBjb2xvcjogIzU1NTU1NTsNCi0gICAgZm9udC1zaXplOiAxLjJlbTsNCi0gICAgZmxvYXQ6IGxlZnQ7DQotfQ0KLQ0KLS5wb3J0bGV0LWNvbmZpZy10aXRsZS1iYXIgdWwgew0KLSAgICBkaXNwbGF5OiBpbmxpbmU7IC8qIElFIEZpeCAqLw0KLX0NCi0NCi0ucG9ydGxldC1jb25maWctdGl0bGUtYmFyIHVsIGxpIHsNCi0gICAgZmxvYXQ6IHJpZ2h0Ow0KLSAgICBmb250LXNpemU6IDFlbTsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIHBhZGRpbmc6IDAuMWVtIDAuNWVtIDAuMmVtIDAuNWVtOw0KLX0NCi0NCi0ucG9ydGxldC1jb25maWctdGl0bGUtYmFyIHVsIGxpLm1vdmUtdXAgew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1zaW5nbGUtdXAtZ3JlZW4ucG5nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlcjsNCi19DQotDQotLnBvcnRsZXQtY29uZmlnLXRpdGxlLWJhciB1bCBsaS5tb3ZlLWRvd24gew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1zaW5nbGUtZG93bi1ncmVlbi5wbmcpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyOw0KLX0NCi0NCi0ucG9ydGxldC1jb25maWctdGl0bGUtYmFyIHVsIGxpLm1vdmUtbGVmdCB7DQotICAgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LXNpbmdsZS1sZWZ0LWdyZWVuLnBuZykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXI7DQotfQ0KLQ0KLS5wb3J0bGV0LWNvbmZpZy10aXRsZS1iYXIgdWwgbGkubW92ZS1yaWdodCB7DQotICAgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LXNpbmdsZS1yaWdodC1ncmVlbi5wbmcpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyOw0KLX0NCi0NCi0ucG9ydGxldC1jb25maWctdGl0bGUtYmFyIHVsIGxpLm1vdmUtdG9wIHsNCi0gICAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYXJyb3ctZW5kLXVwLWdyZWVuLnBuZykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXI7DQotfQ0KLQ0KLS5wb3J0bGV0LWNvbmZpZy10aXRsZS1iYXIgdWwgbGkubW92ZS1ib3R0b20gew0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1lbmQtZG93bi1ncmVlbi5wbmcpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyOw0KLX0NCi0NCi0ucG9ydGxldC1jb25maWctdGl0bGUtYmFyIHVsIGxpLnJlbW92ZSB7DQotICAgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL21pbmktdHJhc2gucG5nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlcjsNCi19DQotDQotLnBvcnRsZXQtY29uZmlnLXRpdGxlLWJhciB1bCBsaS5lZGl0IHsNCi0gICAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvbWluaS1lZGl0LnBuZykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXI7DQotfQ0KLQ0KLS8qID09IFBvcnRhbCBNYW5hZ2VyIFRvb2xiYXIgPT0gKi8NCi0jbWFuYWdlLXBvcnRhbC10b29sYmFyIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q0RDBDODsNCi0gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQotfQ0KLQ0KLSNtYW5hZ2UtcG9ydGFsLXRvb2xiYXIgdWwgbGkgew0KLSAgICBmbG9hdDogbGVmdDsNCi0gICAgcGFkZGluZzogMC4xZW0gMC41ZW0gMC4yZW0gMC41ZW07DQotfQ0KLQ0KLSNtYW5hZ2UtcG9ydGFsLXRvb2xiYXIgI2NvbmZpZy1vbi1vZmYsICNtYW5hZ2UtcG9ydGFsLXRvb2xiYXIgI21hbmFnZS1wb3J0YWwtcGFnZSwgI21hbmFnZS1wb3J0YWwtdG9vbGJhciAjYWRkLWNvbHVtbiB7DQotICAgIGZsb2F0OiByaWdodDsNCi19DQotDQotI21hbmFnZS1wb3J0YWwtdG9vbGJhciAjcG9ydGFsLXBhZ2UtbmFtZSB7DQotICAgIGZvbnQtc2l6ZTogMS41ZW07DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0ubWFuYWdlLXBvcnRhbC1jb2x1bW4tdG9vbGJhciAjYWRkLXBvcnRsZXQsIC5tYW5hZ2UtcG9ydGFsLWNvbHVtbi10b29sYmFyICNkZWxldGUtY29sdW1uLCAubWFuYWdlLXBvcnRhbC1jb2x1bW4tdG9vbGJhciAjY29sdW1uLXdpZHRoIHsNCi0gICAgZmxvYXQ6IHJpZ2h0Ow0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi1XZWJ0b29scw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS53ZWJUb29sTGlzdCBoMyB7DQotICAgIG1hcmdpbjogMC43NWVtIDAgMC4wOWVtIDA7DQotICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7DQotfQ0KLQ0KLSN3YWl0LXNwaW5uZXIgew0KLSAgICB6LWluZGV4OiA1MDAwMDsNCi0gICAgcG9zaXRpb246IGFic29sdXRlOw0KLX0NCi0NCi19DQotLndhaXQtc3Bpbm5lciBkaXYgew0KLSAgICBwYWRkaW5nLXRvcDogNHB4Ow0KLX0NCi0NCi0jd2FpdC1zcGlubmVyLWltYWdlIHsNCi0gICAgaGVpZ2h0OiA0NXB4Ow0KLSAgICB3aWR0aDogNDVweDsNCi0gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCi0gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC9pbWFnZXMvc3Bpbm5lci5naWYpOw0KLX0NCi0NCi1pbWcuY3NzSW1nWExhcmdlIHsNCi0gICAgLypib3JkZXI6IDFweCBibGFjayBzb2xpZDsqLw0KLSAgICBtYXgtd2lkdGg6IDIwMHB4Ow0KLSAgICBtYXgtaGVpZ2h0OiAxNTBweDsNCi19DQotDQotaW1nLmNzc0ltZ0xhcmdlIHsNCi0gICAgLypib3JkZXI6IDFweCBibGFjayBzb2xpZDsqLw0KLSAgICBtYXgtd2lkdGg6IDEwMHB4Ow0KLSAgICBtYXgtaGVpZ2h0OiA3NXB4Ow0KLX0NCi0NCi1pbWcuY3NzSW1nU3RhbmRhcmQgew0KLSAgICAvKmJvcmRlcjogMXB4IGJsYWNrIHNvbGlkOyovDQotICAgIG1heC13aWR0aDogNzBweDsNCi0gICAgbWF4LWhlaWdodDogNTJweDsNCi19DQotDQotaW1nLmNzc0ltZ1NtYWxsIHsNCi0gICAgLypib3JkZXI6IDFweCBibGFjayBzb2xpZDsqLw0KLSAgICBtYXgtd2lkdGg6IDUwcHg7DQotICAgIG1heC1oZWlnaHQ6IDM3cHg7DQotfQ0KLQ0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLS8qID09PT09IEphdmFTY3JpcHQgalF1ZXJ5IHdpZGdldHMgU21vb3RobmVzcyBEZXNpZ24gICA9PT09PSAqLw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0NCi0vKiEgalF1ZXJ5IFVJIC0gdjEuOS4wIC0gMjAxMi0xMC0xNg0KLSogaHR0cDovL2pxdWVyeXVpLmNvbQ0KLSogSW5jbHVkZXM6IGpxdWVyeS51aS5jb3JlLmNzcywganF1ZXJ5LnVpLnJlc2l6YWJsZS5jc3MsIGpxdWVyeS51aS5zZWxlY3RhYmxlLmNzcywganF1ZXJ5LnVpLmFjY29yZGlvbi5jc3MsIGpxdWVyeS51aS5hdXRvY29tcGxldGUuY3NzLCBqcXVlcnkudWkuYnV0dG9uLmNzcywganF1ZXJ5LnVpLmRhdGVwaWNrZXIuY3NzLCBqcXVlcnkudWkuZGlhbG9nLmNzcywganF1ZXJ5LnVpLm1lbnUuY3NzLCBqcXVlcnkudWkucHJvZ3Jlc3NiYXIuY3NzLCBqcXVlcnkudWkuc2xpZGVyLmNzcywganF1ZXJ5LnVpLnNwaW5uZXIuY3NzLCBqcXVlcnkudWkudGFicy5jc3MsIGpxdWVyeS51aS50b29sdGlwLmNzcw0KLSogVG8gdmlldyBhbmQgbW9kaWZ5IHRoaXMgdGhlbWUsIHZpc2l0IGh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvP2ZmRGVmYXVsdD1WZXJkYW5hJTJDQXJpYWwlMkNzYW5zLXNlcmlmJmZ3RGVmYXVsdD1ub3JtYWwmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz00cHgmYmdDb2xvckhlYWRlcj1jY2NjY2MmYmdUZXh0dXJlSGVhZGVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIZWFkZXI9NzUmYm9yZGVyQ29sb3JIZWFkZXI9YWFhYWFhJmZjSGVhZGVyPTIyMjIyMiZpY29uQ29sb3JIZWFkZXI9MjIyMjIyJmJnQ29sb3JDb250ZW50PWZmZmZmZiZiZ1RleHR1cmVDb250ZW50PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9NzUmYm9yZGVyQ29sb3JDb250ZW50PWFhYWFhYSZmY0NvbnRlbnQ9MjIyMjIyJmljb25Db2xvckNvbnRlbnQ9MjIyMjIyJmJnQ29sb3JEZWZhdWx0PWU2ZTZlNiZiZ1RleHR1cmVEZWZhdWx0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTc1JmJvcmRlckNvbG9yRGVmYXVsdD1kM2QzZDMmZmNEZWZhdWx0PTU1NTU1NSZpY29uQ29sb3JEZWZhdWx0PTg4ODg4OCZiZ0NvbG9ySG92ZXI9ZGFkYWRhJmJnVGV4dHVyZUhvdmVyPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIb3Zlcj03NSZib3JkZXJDb2xvckhvdmVyPTk5OTk5OSZmY0hvdmVyPTIxMjEyMSZpY29uQ29sb3JIb3Zlcj00NTQ1NDUmYmdDb2xvckFjdGl2ZT1mZmZmZmYmYmdUZXh0dXJlQWN0aXZlPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYm9yZGVyQ29sb3JBY3RpdmU9YWFhYWFhJmZjQWN0aXZlPTIxMjEyMSZpY29uQ29sb3JBY3RpdmU9NDU0NTQ1JmJnQ29sb3JIaWdobGlnaHQ9ZmJmOWVlJmJnVGV4dHVyZUhpZ2hsaWdodD0wMl9nbGFzcy5wbmcmYmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTU1JmJvcmRlckNvbG9ySGlnaGxpZ2h0PWZjZWZhMSZmY0hpZ2hsaWdodD0zNjM2MzYmaWNvbkNvbG9ySGlnaGxpZ2h0PTJlODNmZiZiZ0NvbG9yRXJyb3I9ZmVmMWVjJmJnVGV4dHVyZUVycm9yPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlFcnJvcj05NSZib3JkZXJDb2xvckVycm9yPWNkMGEwYSZmY0Vycm9yPWNkMGEwYSZpY29uQ29sb3JFcnJvcj1jZDBhMGEmYmdDb2xvck92ZXJsYXk9YWFhYWFhJmJnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5T3ZlcmxheT0wJm9wYWNpdHlPdmVybGF5PTMwJmJnQ29sb3JTaGFkb3c9YWFhYWFhJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MCZvcGFjaXR5U2hhZG93PTMwJnRoaWNrbmVzc1NoYWRvdz04cHgmb2Zmc2V0VG9wU2hhZG93PS04cHgmb2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmNvcm5lclJhZGl1c1NoYWRvdz04cHgNCi0qIENvcHlyaWdodCAoYykgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIExpY2Vuc2VkIE1JVCAqLw0KLQ0KLS8qIExheW91dCBoZWxwZXJzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLnVpLWhlbHBlci1oaWRkZW4gew0KLSAgICBkaXNwbGF5OiBub25lOw0KLX0NCi0NCi0udWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIHsNCi0gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7DQotICAgIGNsaXA6IHJlY3QoMXB4IDFweCAxcHggMXB4KTsNCi0gICAgY2xpcDogcmVjdCgxcHgsIDFweCwgMXB4LCAxcHgpOw0KLX0NCi0NCi0udWktaGVscGVyLXJlc2V0IHsNCi0gICAgbWFyZ2luOiAwOw0KLSAgICBwYWRkaW5nOiAwOw0KLSAgICBib3JkZXI6IDA7DQotICAgIG91dGxpbmU6IDA7DQotICAgIGxpbmUtaGVpZ2h0OiAxLjM7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gICAgZm9udC1zaXplOiAxMDAlOw0KLSAgICBsaXN0LXN0eWxlOiBub25lOw0KLX0NCi0NCi0udWktaGVscGVyLWNsZWFyZml4OmJlZm9yZSwgLnVpLWhlbHBlci1jbGVhcmZpeDphZnRlciB7DQotICAgIGNvbnRlbnQ6ICIiOw0KLSAgICBkaXNwbGF5OiB0YWJsZTsNCi19DQotDQotLnVpLWhlbHBlci1jbGVhcmZpeDphZnRlciB7DQotICAgIGNsZWFyOiBib3RoOw0KLX0NCi0NCi0udWktaGVscGVyLWNsZWFyZml4IHsNCi0gICAgem9vbTogMTsNCi19DQotDQotLnVpLWhlbHBlci16Zml4IHsNCi0gICAgd2lkdGg6IDEwMCU7DQotICAgIGhlaWdodDogMTAwJTsNCi0gICAgdG9wOiAwOw0KLSAgICBsZWZ0OiAwOw0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIG9wYWNpdHk6IDA7DQotICAgIGZpbHRlcjogQWxwaGEoT3BhY2l0eT0wKTsNCi19DQotDQotLyogSW50ZXJhY3Rpb24gQ3Vlcw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS51aS1zdGF0ZS1kaXNhYmxlZCB7DQotICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50Ow0KLX0NCi0NCi0vKiBJY29ucw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIHN0YXRlcyBhbmQgaW1hZ2VzICovDQotLnVpLWljb24gew0KLSAgICBkaXNwbGF5OiBibG9jazsNCi0gICAgdGV4dC1pbmRlbnQ6IC05OTk5OXB4Ow0KLSAgICBvdmVyZmxvdzogaGlkZGVuOw0KLSAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KLX0NCi0NCi0vKiBNaXNjIHZpc3VhbHMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBPdmVybGF5cyAqLw0KLS51aS13aWRnZXQtb3ZlcmxheSB7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgdG9wOiAwOw0KLSAgICBsZWZ0OiAwOw0KLSAgICB3aWR0aDogMTAwJTsNCi0gICAgaGVpZ2h0OiAxMDAlOw0KLX0NCi0NCi0udWktcmVzaXphYmxlIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLX0NCi0NCi0udWktcmVzaXphYmxlLWhhbmRsZSB7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgZm9udC1zaXplOiAwLjFweDsNCi0gICAgZGlzcGxheTogYmxvY2s7DQotfQ0KLQ0KLS51aS1yZXNpemFibGUtZGlzYWJsZWQgLnVpLXJlc2l6YWJsZS1oYW5kbGUsIC51aS1yZXNpemFibGUtYXV0b2hpZGUgLnVpLXJlc2l6YWJsZS1oYW5kbGUgew0KLSAgICBkaXNwbGF5OiBub25lOw0KLX0NCi0NCi0udWktcmVzaXphYmxlLW4gew0KLSAgICBjdXJzb3I6IG4tcmVzaXplOw0KLSAgICBoZWlnaHQ6IDdweDsNCi0gICAgd2lkdGg6IDEwMCU7DQotICAgIHRvcDogLTVweDsNCi0gICAgbGVmdDogMDsNCi19DQotDQotLnVpLXJlc2l6YWJsZS1zIHsNCi0gICAgY3Vyc29yOiBzLXJlc2l6ZTsNCi0gICAgaGVpZ2h0OiA3cHg7DQotICAgIHdpZHRoOiAxMDAlOw0KLSAgICBib3R0b206IC01cHg7DQotICAgIGxlZnQ6IDA7DQotfQ0KLQ0KLS51aS1yZXNpemFibGUtZSB7DQotICAgIGN1cnNvcjogZS1yZXNpemU7DQotICAgIHdpZHRoOiA3cHg7DQotICAgIHJpZ2h0OiAtNXB4Ow0KLSAgICB0b3A6IDA7DQotICAgIGhlaWdodDogMTAwJTsNCi19DQotDQotLnVpLXJlc2l6YWJsZS13IHsNCi0gICAgY3Vyc29yOiB3LXJlc2l6ZTsNCi0gICAgd2lkdGg6IDdweDsNCi0gICAgbGVmdDogLTVweDsNCi0gICAgdG9wOiAwOw0KLSAgICBoZWlnaHQ6IDEwMCU7DQotfQ0KLQ0KLS51aS1yZXNpemFibGUtc2Ugew0KLSAgICBjdXJzb3I6IHNlLXJlc2l6ZTsNCi0gICAgd2lkdGg6IDEycHg7DQotICAgIGhlaWdodDogMTJweDsNCi0gICAgcmlnaHQ6IDFweDsNCi0gICAgYm90dG9tOiAxcHg7DQotfQ0KLQ0KLS51aS1yZXNpemFibGUtc3cgew0KLSAgICBjdXJzb3I6IHN3LXJlc2l6ZTsNCi0gICAgd2lkdGg6IDlweDsNCi0gICAgaGVpZ2h0OiA5cHg7DQotICAgIGxlZnQ6IC01cHg7DQotICAgIGJvdHRvbTogLTVweDsNCi19DQotDQotLnVpLXJlc2l6YWJsZS1udyB7DQotICAgIGN1cnNvcjogbnctcmVzaXplOw0KLSAgICB3aWR0aDogOXB4Ow0KLSAgICBoZWlnaHQ6IDlweDsNCi0gICAgbGVmdDogLTVweDsNCi0gICAgdG9wOiAtNXB4Ow0KLX0NCi0NCi0udWktcmVzaXphYmxlLW5lIHsNCi0gICAgY3Vyc29yOiBuZS1yZXNpemU7DQotICAgIHdpZHRoOiA5cHg7DQotICAgIGhlaWdodDogOXB4Ow0KLSAgICByaWdodDogLTVweDsNCi0gICAgdG9wOiAtNXB4Ow0KLX0NCi0NCi0udWktc2VsZWN0YWJsZS1oZWxwZXIgew0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHotaW5kZXg6IDEwMDsNCi0gICAgYm9yZGVyOiAxcHggZG90dGVkIGJsYWNrOw0KLX0NCi0NCi0udWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taGVhZGVyIHsNCi0gICAgZGlzcGxheTogYmxvY2s7DQotICAgIGN1cnNvcjogcG9pbnRlcjsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICBtYXJnaW4tdG9wOiAycHg7DQotICAgIHBhZGRpbmc6IC41ZW0gLjVlbSAuNWVtIC43ZW07DQotICAgIHpvb206IDE7DQotfQ0KLQ0KLS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1pY29ucyB7DQotICAgIHBhZGRpbmctbGVmdDogMi4yZW07DQotfQ0KLQ0KLS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1ub2ljb25zIHsNCi0gICAgcGFkZGluZy1sZWZ0OiAuN2VtOw0KLX0NCi0NCi0udWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taWNvbnMgLnVpLWFjY29yZGlvbi1pY29ucyB7DQotICAgIHBhZGRpbmctbGVmdDogMi4yZW07DQotfQ0KLQ0KLS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1oZWFkZXIgLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiB7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgbGVmdDogLjVlbTsNCi0gICAgdG9wOiA1MCU7DQotICAgIG1hcmdpbi10b3A6IC04cHg7DQotfQ0KLQ0KLS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1jb250ZW50IHsNCi0gICAgcGFkZGluZzogMWVtIDIuMmVtOw0KLSAgICBib3JkZXItdG9wOiAwOw0KLSAgICBvdmVyZmxvdzogYXV0bzsNCi0gICAgem9vbTogMTsNCi19DQotDQotLnVpLWF1dG9jb21wbGV0ZSB7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgY3Vyc29yOiBkZWZhdWx0Ow0KLX0NCi0NCi0vKiB3b3JrYXJvdW5kcyAqLw0KLSogaHRtbCAudWktYXV0b2NvbXBsZXRlIHsNCi0gICAgd2lkdGg6IDFweDsNCi19DQotDQotLyogd2l0aG91dCB0aGlzLCB0aGUgbWVudSBleHBhbmRzIHRvIDEwMCUgaW4gSUU2ICovDQotLnVpLWJ1dHRvbiB7DQotICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICBwYWRkaW5nOiAwOw0KLSAgICBtYXJnaW4tcmlnaHQ6IC4xZW07DQotICAgIGN1cnNvcjogcG9pbnRlcjsNCi0gICAgdGV4dC1hbGlnbjogY2VudGVyOw0KLSAgICB6b29tOiAxOw0KLSAgICBvdmVyZmxvdzogdmlzaWJsZTsNCi19DQotDQotLyogdGhlIG92ZXJmbG93IHByb3BlcnR5IHJlbW92ZXMgZXh0cmEgd2lkdGggaW4gSUUgKi8NCi0udWktYnV0dG9uLCAudWktYnV0dG9uOmxpbmssIC51aS1idXR0b246dmlzaXRlZCwgLnVpLWJ1dHRvbjpob3ZlciwgLnVpLWJ1dHRvbjphY3RpdmUgew0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLS51aS1idXR0b24taWNvbi1vbmx5IHsNCi0gICAgd2lkdGg6IDIuMmVtOw0KLX0NCi0NCi0vKiB0byBtYWtlIHJvb20gZm9yIHRoZSBpY29uLCBhIHdpZHRoIG5lZWRzIHRvIGJlIHNldCBoZXJlICovDQotYnV0dG9uLnVpLWJ1dHRvbi1pY29uLW9ubHkgew0KLSAgICB3aWR0aDogMi40ZW07DQotfQ0KLQ0KLS8qIGJ1dHRvbiBlbGVtZW50cyBzZWVtIHRvIG5lZWQgYSBsaXR0bGUgbW9yZSB3aWR0aCAqLw0KLS51aS1idXR0b24taWNvbnMtb25seSB7DQotICAgIHdpZHRoOiAzLjRlbTsNCi19DQotDQotYnV0dG9uLnVpLWJ1dHRvbi1pY29ucy1vbmx5IHsNCi0gICAgd2lkdGg6IDMuN2VtOw0KLX0NCi0NCi0vKmJ1dHRvbiB0ZXh0IGVsZW1lbnQgKi8NCi0udWktYnV0dG9uIC51aS1idXR0b24tdGV4dCB7DQotICAgIGRpc3BsYXk6IGJsb2NrOw0KLSAgICBsaW5lLWhlaWdodDogMS40Ow0KLX0NCi0NCi0udWktYnV0dG9uLXRleHQtb25seSAudWktYnV0dG9uLXRleHQgew0KLSAgICBwYWRkaW5nOiAuNGVtIDFlbTsNCi19DQotDQotLnVpLWJ1dHRvbi1pY29uLW9ubHkgLnVpLWJ1dHRvbi10ZXh0LCAudWktYnV0dG9uLWljb25zLW9ubHkgLnVpLWJ1dHRvbi10ZXh0IHsNCi0gICAgcGFkZGluZzogLjRlbTsNCi0gICAgdGV4dC1pbmRlbnQ6IC05OTk5OTk5cHg7DQotfQ0KLQ0KLS51aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgLnVpLWJ1dHRvbi10ZXh0LCAudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi10ZXh0IHsNCi0gICAgcGFkZGluZzogLjRlbSAxZW0gLjRlbSAyLjFlbTsNCi19DQotDQotLnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1idXR0b24tdGV4dCwgLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24tdGV4dCB7DQotICAgIHBhZGRpbmc6IC40ZW0gMi4xZW0gLjRlbSAxZW07DQotfQ0KLQ0KLS51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLXRleHQgew0KLSAgICBwYWRkaW5nLWxlZnQ6IDIuMWVtOw0KLSAgICBwYWRkaW5nLXJpZ2h0OiAyLjFlbTsNCi19DQotDQotLyogbm8gaWNvbiBzdXBwb3J0IGZvciBpbnB1dCBlbGVtZW50cywgcHJvdmlkZSBwYWRkaW5nIGJ5IGRlZmF1bHQgKi8NCi1pbnB1dC51aS1idXR0b24gew0KLSAgICBwYWRkaW5nOiAuNGVtIDFlbTsNCi19DQotDQotLypidXR0b24gaWNvbiBlbGVtZW50KHMpICovDQotLnVpLWJ1dHRvbi1pY29uLW9ubHkgLnVpLWljb24sIC51aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgLnVpLWljb24sIC51aS1idXR0b24tdGV4dC1pY29uLXNlY29uZGFyeSAudWktaWNvbiwgLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1pY29uLCAudWktYnV0dG9uLWljb25zLW9ubHkgLnVpLWljb24gew0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHRvcDogNTAlOw0KLSAgICBtYXJnaW4tdG9wOiAtOHB4Ow0KLX0NCi0NCi0udWktYnV0dG9uLWljb24tb25seSAudWktaWNvbiB7DQotICAgIGxlZnQ6IDUwJTsNCi0gICAgbWFyZ2luLWxlZnQ6IC04cHg7DQotfQ0KLQ0KLS51aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgLnVpLWJ1dHRvbi1pY29uLXByaW1hcnksIC51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLWljb24tcHJpbWFyeSwgLnVpLWJ1dHRvbi1pY29ucy1vbmx5IC51aS1idXR0b24taWNvbi1wcmltYXJ5IHsNCi0gICAgbGVmdDogLjVlbTsNCi19DQotDQotLnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1idXR0b24taWNvbi1zZWNvbmRhcnksIC51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLWljb24tc2Vjb25kYXJ5LCAudWktYnV0dG9uLWljb25zLW9ubHkgLnVpLWJ1dHRvbi1pY29uLXNlY29uZGFyeSB7DQotICAgIHJpZ2h0OiAuNWVtOw0KLX0NCi0NCi0udWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi1pY29uLXNlY29uZGFyeSwgLnVpLWJ1dHRvbi1pY29ucy1vbmx5IC51aS1idXR0b24taWNvbi1zZWNvbmRhcnkgew0KLSAgICByaWdodDogLjVlbTsNCi19DQotDQotLypidXR0b24gc2V0cyovDQotLnVpLWJ1dHRvbnNldCB7DQotICAgIG1hcmdpbi1yaWdodDogN3B4Ow0KLX0NCi0NCi0udWktYnV0dG9uc2V0IC51aS1idXR0b24gew0KLSAgICBtYXJnaW4tbGVmdDogMDsNCi0gICAgbWFyZ2luLXJpZ2h0OiAtLjNlbTsNCi19DQotDQotLyogd29ya2Fyb3VuZHMgKi8NCi1idXR0b24udWktYnV0dG9uOjotbW96LWZvY3VzLWlubmVyIHsNCi0gICAgYm9yZGVyOiAwOw0KLSAgICBwYWRkaW5nOiAwOw0KLX0NCi0NCi0vKiByZXNldCBleHRyYSBwYWRkaW5nIGluIEZpcmVmb3ggKi8NCi0udWktZGF0ZXBpY2tlciB7DQotICAgIHdpZHRoOiAxN2VtOw0KLSAgICBwYWRkaW5nOiAuMmVtIC4yZW0gMDsNCi0gICAgZGlzcGxheTogbm9uZTsNCi19DQotDQotLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItaGVhZGVyIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICBwYWRkaW5nOiAuMmVtIDA7DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYsIC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQgew0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHRvcDogMnB4Ow0KLSAgICB3aWR0aDogMS44ZW07DQotICAgIGhlaWdodDogMS44ZW07DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYtaG92ZXIsIC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQtaG92ZXIgew0KLSAgICB0b3A6IDFweDsNCi19DQotDQotLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldiB7DQotICAgIGxlZnQ6IDJweDsNCi19DQotDQotLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dCB7DQotICAgIHJpZ2h0OiAycHg7DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYtaG92ZXIgew0KLSAgICBsZWZ0OiAxcHg7DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQtaG92ZXIgew0KLSAgICByaWdodDogMXB4Ow0KLX0NCi0NCi0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2IHNwYW4sIC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQgc3BhbiB7DQotICAgIGRpc3BsYXk6IGJsb2NrOw0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIGxlZnQ6IDUwJTsNCi0gICAgbWFyZ2luLWxlZnQ6IC04cHg7DQotICAgIHRvcDogNTAlOw0KLSAgICBtYXJnaW4tdG9wOiAtOHB4Ow0KLX0NCi0NCi0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10aXRsZSB7DQotICAgIG1hcmdpbjogMCAyLjNlbTsNCi0gICAgbGluZS1oZWlnaHQ6IDEuOGVtOw0KLSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXRpdGxlIHNlbGVjdCB7DQotICAgIGZvbnQtc2l6ZTogMWVtOw0KLSAgICBtYXJnaW46IDFweCAwOw0KLX0NCi0NCi0udWktZGF0ZXBpY2tlciBzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aC15ZWFyIHsNCi0gICAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyIHNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLA0KLS51aS1kYXRlcGlja2VyIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXIgew0KLSAgICB3aWR0aDogNDklOw0KLX0NCi0NCi0udWktZGF0ZXBpY2tlciB0YWJsZSB7DQotICAgIHdpZHRoOiAxMDAlOw0KLSAgICBmb250LXNpemU6IC45ZW07DQotICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7DQotICAgIG1hcmdpbjogMCAwIC40ZW07DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyIHRoIHsNCi0gICAgcGFkZGluZzogLjdlbSAuM2VtOw0KLSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICBib3JkZXI6IDA7DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyIHRkIHsNCi0gICAgYm9yZGVyOiAwOw0KLSAgICBwYWRkaW5nOiAxcHg7DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyIHRkIHNwYW4sIC51aS1kYXRlcGlja2VyIHRkIGEgew0KLSAgICBkaXNwbGF5OiBibG9jazsNCi0gICAgcGFkZGluZzogLjJlbTsNCi0gICAgdGV4dC1hbGlnbjogcmlnaHQ7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSB7DQotICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7DQotICAgIG1hcmdpbjogLjdlbSAwIDAgMDsNCi0gICAgcGFkZGluZzogMCAuMmVtOw0KLSAgICBib3JkZXItbGVmdDogMDsNCi0gICAgYm9yZGVyLXJpZ2h0OiAwOw0KLSAgICBib3JkZXItYm90dG9tOiAwOw0KLX0NCi0NCi0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbiB7DQotICAgIGZsb2F0OiByaWdodDsNCi0gICAgbWFyZ2luOiAuNWVtIC4yZW0gLjRlbTsNCi0gICAgY3Vyc29yOiBwb2ludGVyOw0KLSAgICBwYWRkaW5nOiAuMmVtIC42ZW0gLjNlbSAuNmVtOw0KLSAgICB3aWR0aDogYXV0bzsNCi0gICAgb3ZlcmZsb3c6IHZpc2libGU7DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9uLnVpLWRhdGVwaWNrZXItY3VycmVudCB7DQotICAgIGZsb2F0OiBsZWZ0Ow0KLX0NCi0NCi0vKiB3aXRoIG11bHRpcGxlIGNhbGVuZGFycyAqLw0KLS51aS1kYXRlcGlja2VyLnVpLWRhdGVwaWNrZXItbXVsdGkgew0KLSAgICB3aWR0aDogYXV0bzsNCi19DQotDQotLnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAgew0KLSAgICBmbG9hdDogbGVmdDsNCi19DQotDQotLnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAgdGFibGUgew0KLSAgICB3aWR0aDogOTUlOw0KLSAgICBtYXJnaW46IDAgYXV0byAuNGVtOw0KLX0NCi0NCi0udWktZGF0ZXBpY2tlci1tdWx0aS0yIC51aS1kYXRlcGlja2VyLWdyb3VwIHsNCi0gICAgd2lkdGg6IDUwJTsNCi19DQotDQotLnVpLWRhdGVwaWNrZXItbXVsdGktMyAudWktZGF0ZXBpY2tlci1ncm91cCB7DQotICAgIHdpZHRoOiAzMy4zJTsNCi19DQotDQotLnVpLWRhdGVwaWNrZXItbXVsdGktNCAudWktZGF0ZXBpY2tlci1ncm91cCB7DQotICAgIHdpZHRoOiAyNSU7DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QgLnVpLWRhdGVwaWNrZXItaGVhZGVyIHsNCi0gICAgYm9yZGVyLWxlZnQtd2lkdGg6IDA7DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSAudWktZGF0ZXBpY2tlci1oZWFkZXIgew0KLSAgICBib3JkZXItbGVmdC13aWR0aDogMDsNCi19DQotDQotLnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSB7DQotICAgIGNsZWFyOiBsZWZ0Ow0KLX0NCi0NCi0udWktZGF0ZXBpY2tlci1yb3ctYnJlYWsgew0KLSAgICBjbGVhcjogYm90aDsNCi0gICAgd2lkdGg6IDEwMCU7DQotICAgIGZvbnQtc2l6ZTogMGVtOw0KLX0NCi0NCi0vKiBSVEwgc3VwcG9ydCAqLw0KLS51aS1kYXRlcGlja2VyLXJ0bCB7DQotICAgIGRpcmVjdGlvbjogcnRsOw0KLX0NCi0NCi0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItcHJldiB7DQotICAgIHJpZ2h0OiAycHg7DQotICAgIGxlZnQ6IGF1dG87DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1uZXh0IHsNCi0gICAgbGVmdDogMnB4Ow0KLSAgICByaWdodDogYXV0bzsNCi19DQotDQotLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLXByZXY6aG92ZXIgew0KLSAgICByaWdodDogMXB4Ow0KLSAgICBsZWZ0OiBhdXRvOw0KLX0NCi0NCi0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItbmV4dDpob3ZlciB7DQotICAgIGxlZnQ6IDFweDsNCi0gICAgcmlnaHQ6IGF1dG87DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIHsNCi0gICAgY2xlYXI6IHJpZ2h0Ow0KLX0NCi0NCi0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b24gew0KLSAgICBmbG9hdDogbGVmdDsNCi19DQotDQotLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9uLnVpLWRhdGVwaWNrZXItY3VycmVudCB7DQotICAgIGZsb2F0OiByaWdodDsNCi19DQotDQotLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3VwIHsNCi0gICAgZmxvYXQ6IHJpZ2h0Ow0KLX0NCi0NCi0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbGFzdCAudWktZGF0ZXBpY2tlci1oZWFkZXIgew0KLSAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7DQotICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7DQotfQ0KLQ0KLS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUgLnVpLWRhdGVwaWNrZXItaGVhZGVyIHsNCi0gICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAwOw0KLSAgICBib3JkZXItbGVmdC13aWR0aDogMXB4Ow0KLX0NCi0NCi0vKiBJRTYgSUZSQU1FIEZJWCAodGFrZW4gZnJvbSBkYXRlcGlja2VyIDEuNS4zICovDQotLnVpLWRhdGVwaWNrZXItY292ZXIgew0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7IC8qbXVzdCBoYXZlKi8NCi0gICAgei1pbmRleDogLTE7IC8qbXVzdCBoYXZlKi8NCi0gICAgZmlsdGVyOiBtYXNrKCk7IC8qbXVzdCBoYXZlKi8NCi0gICAgdG9wOiAtNHB4OyAvKm11c3QgaGF2ZSovDQotICAgIGxlZnQ6IC00cHg7IC8qbXVzdCBoYXZlKi8NCi0gICAgd2lkdGg6IDIwMHB4OyAvKm11c3QgaGF2ZSovDQotICAgIGhlaWdodDogMjAwcHg7IC8qbXVzdCBoYXZlKi8NCi19DQotDQotLnVpLWRpYWxvZyB7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgdG9wOiAwOw0KLSAgICBsZWZ0OiAwOw0KLSAgICBwYWRkaW5nOw0KLSAgICBwYWRkaW5nOiAuMmVtOw0KLSAgICB3aWR0aDogMzAwcHg7DQotICAgIG92ZXJmbG93OiBoaWRkZW47DQotfQ0KLQ0KLS51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZWJhciB7DQotICAgIHBhZGRpbmc6IC40ZW0gMWVtOw0KLSAgICBoZWlnaHQ6IDE2cHg7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi19DQotDQotLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlIHsNCi0gICAgZmxvYXQ6IGxlZnQ7DQotICAgIG1hcmdpbjogLjFlbSAxNnB4IC4xZW0gMDsNCi19DQotDQotLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIHsNCi0gICAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgICByaWdodDogLjNlbTsNCi0gICAgdG9wOiA1MCU7DQotICAgIHdpZHRoOiAxOXB4Ow0KLSAgICBtYXJnaW46IC0xMHB4IDAgMCAwOw0KLSAgICBwYWRkaW5nOiAxcHg7DQotICAgIGhlaWdodDogMThweDsNCi19DQotDQotLyoudWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2Ugc3BhbiB7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IDFweDsgfSovDQotLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlOmhvdmVyLCAudWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2U6Zm9jdXMgew0KLSAgICBwYWRkaW5nOiAwOw0KLX0NCi0NCi0udWktZGlhbG9nIC51aS1kaWFsb2ctY29udGVudCB7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gICAgYm9yZGVyOiAwOw0KLSAgICBwYWRkaW5nOiAuNWVtIDFlbTsNCi0gICAgYmFja2dyb3VuZDogbm9uZTsNCi0gICAgb3ZlcmZsb3c6IGF1dG87DQotICAgIHpvb206IDE7DQotfQ0KLQ0KLS51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIHsNCi0gICAgdGV4dC1hbGlnbjogbGVmdDsNCi0gICAgYm9yZGVyLXdpZHRoOiAxcHggMCAwIDA7DQotICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7DQotICAgIG1hcmdpbjogLjVlbSAwIDAgMDsNCi0gICAgcGFkZGluZzogLjNlbSAxZW0gLjVlbSAuNGVtOw0KLX0NCi0NCi0udWktZGlhbG9nIC51aS1kaWFsb2ctYnV0dG9ucGFuZSAudWktZGlhbG9nLWJ1dHRvbnNldCB7DQotICAgIGZsb2F0OiByaWdodDsNCi19DQotDQotLnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgYnV0dG9uIHsNCi0gICAgbWFyZ2luOiAuNWVtIC40ZW0gLjVlbSAwOw0KLSAgICBjdXJzb3I6IHBvaW50ZXI7DQotfQ0KLQ0KLS51aS1kaWFsb2cgLnVpLXJlc2l6YWJsZS1zZSB7DQotICAgIHdpZHRoOiAxNHB4Ow0KLSAgICBoZWlnaHQ6IDE0cHg7DQotICAgIHJpZ2h0OiAzcHg7DQotICAgIGJvdHRvbTogM3B4Ow0KLX0NCi0NCi0udWktZHJhZ2dhYmxlIC51aS1kaWFsb2ctdGl0bGViYXIgew0KLSAgICBjdXJzb3I6IG1vdmU7DQotfQ0KLQ0KLS51aS1tZW51IHsNCi0gICAgbGlzdC1zdHlsZTogbm9uZTsNCi0gICAgcGFkZGluZzogMnB4Ow0KLSAgICBtYXJnaW46IDA7DQotICAgIGRpc3BsYXk6IGJsb2NrOw0KLSAgICBvdXRsaW5lOiBub25lOw0KLX0NCi0NCi0udWktbWVudSAudWktbWVudSB7DQotICAgIG1hcmdpbi10b3A6IC0zcHg7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi19DQotDQotLnVpLW1lbnUgLnVpLW1lbnUtaXRlbSB7DQotICAgIG1hcmdpbjogMDsNCi0gICAgcGFkZGluZzogMDsNCi0gICAgem9vbTogMTsNCi0gICAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLS51aS1tZW51IC51aS1tZW51LWRpdmlkZXIgew0KLSAgICBtYXJnaW46IDVweCAtMnB4IDVweCAtMnB4Ow0KLSAgICBoZWlnaHQ6IDA7DQotICAgIGZvbnQtc2l6ZTogMDsNCi0gICAgbGluZS1oZWlnaHQ6IDA7DQotICAgIGJvcmRlci13aWR0aDogMXB4IDAgMCAwOw0KLX0NCi0NCi0udWktbWVudSAudWktbWVudS1pdGVtIGEgew0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICAgIGRpc3BsYXk6IGJsb2NrOw0KLSAgICBwYWRkaW5nOiAycHggLjRlbTsNCi0gICAgbGluZS1oZWlnaHQ6IDEuNTsNCi0gICAgem9vbTogMTsNCi0gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsNCi19DQotDQotLnVpLW1lbnUgLnVpLW1lbnUtaXRlbSBhLnVpLXN0YXRlLWZvY3VzLA0KLS51aS1tZW51IC51aS1tZW51LWl0ZW0gYS51aS1zdGF0ZS1hY3RpdmUgew0KLSAgICBmb250LXdlaWdodDogbm9ybWFsOw0KLSAgICBtYXJnaW46IC0xcHg7DQotfQ0KLQ0KLS51aS1tZW51IC51aS1zdGF0ZS1kaXNhYmxlZCB7DQotICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICAgIG1hcmdpbjogLjRlbSAwIC4yZW07DQotICAgIGxpbmUtaGVpZ2h0OiAxLjU7DQotfQ0KLQ0KLS51aS1tZW51IC51aS1zdGF0ZS1kaXNhYmxlZCBhIHsNCi0gICAgY3Vyc29yOiBkZWZhdWx0Ow0KLX0NCi0NCi0vKiBpY29uIHN1cHBvcnQgKi8NCi0udWktbWVudS1pY29ucyB7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi19DQotDQotLnVpLW1lbnUtaWNvbnMgLnVpLW1lbnUtaXRlbSBhIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICBwYWRkaW5nLWxlZnQ6IDJlbTsNCi19DQotDQotLyogbGVmdC1hbGlnbmVkICovDQotLnVpLW1lbnUgLnVpLWljb24gew0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHRvcDogLjJlbTsNCi0gICAgbGVmdDogLjJlbTsNCi19DQotDQotLyogcmlnaHQtYWxpZ25lZCAqLw0KLS51aS1tZW51IC51aS1tZW51LWljb24gew0KLSAgICBwb3NpdGlvbjogc3RhdGljOw0KLSAgICBmbG9hdDogcmlnaHQ7DQotfQ0KLQ0KLS51aS1wcm9ncmVzc2JhciB7DQotICAgIGhlaWdodDogMmVtOw0KLSAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KLSAgICBvdmVyZmxvdzogaGlkZGVuOw0KLX0NCi0NCi0udWktcHJvZ3Jlc3NiYXIgLnVpLXByb2dyZXNzYmFyLXZhbHVlIHsNCi0gICAgbWFyZ2luOiAtMXB4Ow0KLSAgICBoZWlnaHQ6IDEwMCU7DQotfQ0KLQ0KLS51aS1zbGlkZXIgew0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIHRleHQtYWxpZ246IGxlZnQ7DQotfQ0KLQ0KLS51aS1zbGlkZXIgLnVpLXNsaWRlci1oYW5kbGUgew0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHotaW5kZXg6IDI7DQotICAgIHdpZHRoOiAxLjJlbTsNCi0gICAgaGVpZ2h0OiAxLjJlbTsNCi0gICAgY3Vyc29yOiBkZWZhdWx0Ow0KLX0NCi0NCi0udWktc2xpZGVyIC51aS1zbGlkZXItcmFuZ2Ugew0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHotaW5kZXg6IDE7DQotICAgIGZvbnQtc2l6ZTogLjdlbTsNCi0gICAgZGlzcGxheTogYmxvY2s7DQotICAgIGJvcmRlcjogMDsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOw0KLX0NCi0NCi0udWktc2xpZGVyLWhvcml6b250YWwgew0KLSAgICBoZWlnaHQ6IC44ZW07DQotfQ0KLQ0KLS51aS1zbGlkZXItaG9yaXpvbnRhbCAudWktc2xpZGVyLWhhbmRsZSB7DQotICAgIHRvcDogLS4zZW07DQotICAgIG1hcmdpbi1sZWZ0OiAtLjZlbTsNCi19DQotDQotLnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2Ugew0KLSAgICB0b3A6IDA7DQotICAgIGhlaWdodDogMTAwJTsNCi19DQotDQotLnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2UtbWluIHsNCi0gICAgbGVmdDogMDsNCi19DQotDQotLnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2UtbWF4IHsNCi0gICAgcmlnaHQ6IDA7DQotfQ0KLQ0KLS51aS1zbGlkZXItdmVydGljYWwgew0KLSAgICB3aWR0aDogLjhlbTsNCi0gICAgaGVpZ2h0OiAxMDBweDsNCi19DQotDQotLnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLWhhbmRsZSB7DQotICAgIGxlZnQ6IC0uM2VtOw0KLSAgICBtYXJnaW4tbGVmdDogMDsNCi0gICAgbWFyZ2luLWJvdHRvbTogLS42ZW07DQotfQ0KLQ0KLS51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1yYW5nZSB7DQotICAgIGxlZnQ6IDA7DQotICAgIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi0udWktc2xpZGVyLXZlcnRpY2FsIC51aS1zbGlkZXItcmFuZ2UtbWluIHsNCi0gICAgYm90dG9tOiAwOw0KLX0NCi0NCi0udWktc2xpZGVyLXZlcnRpY2FsIC51aS1zbGlkZXItcmFuZ2UtbWF4IHsNCi0gICAgdG9wOiAwOw0KLX0NCi0NCi0udWktc3Bpbm5lciB7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gICAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KLSAgICBvdmVyZmxvdzogaGlkZGVuOw0KLSAgICBwYWRkaW5nOiAwOw0KLSAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KLX0NCi0NCi0udWktc3Bpbm5lci1pbnB1dCB7DQotICAgIGJvcmRlcjogbm9uZTsNCi0gICAgYmFja2dyb3VuZDogbm9uZTsNCi0gICAgcGFkZGluZzogMDsNCi0gICAgbWFyZ2luOiAuMmVtIDA7DQotICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7DQotICAgIG1hcmdpbi1sZWZ0OiAuNGVtOw0KLSAgICBtYXJnaW4tcmlnaHQ6IDIycHg7DQotfQ0KLQ0KLS51aS1zcGlubmVyLWJ1dHRvbiB7DQotICAgIHdpZHRoOiAxNnB4Ow0KLSAgICBoZWlnaHQ6IDUwJTsNCi0gICAgZm9udC1zaXplOiAuNWVtOw0KLSAgICBwYWRkaW5nOiAwOw0KLSAgICBtYXJnaW46IDA7DQotICAgIHotaW5kZXg6IDEwMDsNCi0gICAgdGV4dC1hbGlnbjogY2VudGVyOw0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIGN1cnNvcjogZGVmYXVsdDsNCi0gICAgZGlzcGxheTogYmxvY2s7DQotICAgIG92ZXJmbG93OiBoaWRkZW47DQotICAgIHJpZ2h0OiAwOw0KLX0NCi0NCi0udWktc3Bpbm5lciBhLnVpLXNwaW5uZXItYnV0dG9uIHsNCi0gICAgYm9yZGVyLXRvcDogbm9uZTsNCi0gICAgYm9yZGVyLWJvdHRvbTogbm9uZTsNCi0gICAgYm9yZGVyLXJpZ2h0OiBub25lOw0KLX0NCi0NCi0vKiBtb3JlIHNwZWNpZmljaXR5IHJlcXVpcmVkIGhlcmUgdG8gb3ZlcmlkZSBkZWZhdWx0IGJvcmRlcnMgKi8NCi0udWktc3Bpbm5lciAudWktaWNvbiB7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgbWFyZ2luLXRvcDogLThweDsNCi0gICAgdG9wOiA1MCU7DQotICAgIGxlZnQ6IDA7DQotfQ0KLQ0KLS8qIHZlcnRpY2FsIGNlbnRyZSBpY29uICovDQotLnVpLXNwaW5uZXItdXAgew0KLSAgICB0b3A6IDA7DQotfQ0KLQ0KLS51aS1zcGlubmVyLWRvd24gew0KLSAgICBib3R0b206IDA7DQotfQ0KLQ0KLS8qIFRSIG92ZXJyaWRlcyAqLw0KLXNwYW4udWktc3Bpbm5lciB7DQotICAgIGJhY2tncm91bmQ6IG5vbmU7DQotfQ0KLQ0KLS51aS1zcGlubmVyIC51aS1pY29uLXRyaWFuZ2xlLTEtcyB7DQotICAgIC8qIG5lZWQgdG8gZml4IGljb25zIHNwcml0ZSAqLw0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjVweCAtMTZweDsNCi19DQotDQotLnVpLXRhYnMgew0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIHBhZGRpbmc6IC4yZW07DQotICAgIHpvb206IDE7DQotfQ0KLQ0KLS8qIHBvc2l0aW9uOiByZWxhdGl2ZSBwcmV2ZW50cyBJRSBzY3JvbGwgYnVnIChlbGVtZW50IHdpdGggcG9zaXRpb246IHJlbGF0aXZlIGluc2lkZSBjb250YWluZXIgd2l0aCBvdmVyZmxvdzogYXV0byBhcHBlYXIgYXMgImZpeGVkIikgKi8NCi0udWktdGFicyAudWktdGFicy1uYXYgew0KLSAgICBtYXJnaW46IDA7DQotICAgIHBhZGRpbmc6IC4yZW0gLjJlbSAwOw0KLX0NCi0NCi0udWktdGFicyAudWktdGFicy1uYXYgbGkgew0KLSAgICBsaXN0LXN0eWxlOiBub25lOw0KLSAgICBmbG9hdDogbGVmdDsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICB0b3A6IDA7DQotICAgIG1hcmdpbjogMXB4IC4yZW0gMCAwOw0KLSAgICBib3JkZXItYm90dG9tOiAwOw0KLSAgICBwYWRkaW5nOiAwOw0KLSAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KLX0NCi0NCi0udWktdGFicyAudWktdGFicy1uYXYgbGkgYSB7DQotICAgIGZsb2F0OiBsZWZ0Ow0KLSAgICBwYWRkaW5nOiAuNWVtIDFlbTsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0udWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1hY3RpdmUgew0KLSAgICBtYXJnaW4tYm90dG9tOiAtMXB4Ow0KLSAgICBwYWRkaW5nLWJvdHRvbTogMXB4Ow0KLX0NCi0NCi0udWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1hY3RpdmUgYSwgLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXN0YXRlLWRpc2FibGVkIGEsIC51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWxvYWRpbmcgYSB7DQotICAgIGN1cnNvcjogdGV4dDsNCi19DQotDQotLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEsIC51aS10YWJzLWNvbGxhcHNpYmxlIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWFjdGl2ZSBhIHsNCi0gICAgY3Vyc29yOiBwb2ludGVyOw0KLX0NCi0NCi0vKiBmaXJzdCBzZWxlY3RvciBpbiBncm91cCBzZWVtcyBvYnNvbGV0ZSwgYnV0IHJlcXVpcmVkIHRvIG92ZXJjb21lIGJ1ZyBpbiBPcGVyYSBhcHBseWluZyBjdXJzb3I6IHRleHQgb3ZlcmFsbCBpZiBkZWZpbmVkIGVsc2V3aGVyZS4uLiAqLw0KLS51aS10YWJzIC51aS10YWJzLXBhbmVsIHsNCi0gICAgZGlzcGxheTogYmxvY2s7DQotICAgIGJvcmRlci13aWR0aDogMDsNCi0gICAgcGFkZGluZzogMWVtIDEuNGVtOw0KLSAgICBiYWNrZ3JvdW5kOiBub25lOw0KLX0NCi0NCi0udWktdG9vbHRpcCB7DQotICAgIHBhZGRpbmc6IDhweDsNCi0gICAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgICB6LWluZGV4OiA5OTk5Ow0KLSAgICAtby1ib3gtc2hhZG93OiAwIDAgNXB4ICNhYWE7DQotICAgIC1tb3otYm94LXNoYWRvdzogMCAwIDVweCAjYWFhOw0KLSAgICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA1cHggI2FhYTsNCi0gICAgYm94LXNoYWRvdzogMCAwIDVweCAjYWFhOw0KLX0NCi0NCi0vKiBGYWRlcyBhbmQgYmFja2dyb3VuZC1pbWFnZXMgZG9uJ3Qgd29yayB3ZWxsIHRvZ2V0aGVyIGluIElFNiwgZHJvcCB0aGUgaW1hZ2UgKi8NCi0qIGh0bWwgLnVpLXRvb2x0aXAgew0KLSAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOw0KLX0NCi0NCi1ib2R5IC51aS10b29sdGlwIHsNCi0gICAgYm9yZGVyLXdpZHRoOiAycHg7DQotfQ0KLQ0KLS8qIENvbXBvbmVudCBjb250YWluZXJzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLnVpLXdpZGdldCB7DQotICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsNCi0gICAgZm9udC1zaXplOiAxLjFlbTsNCi19DQotDQotLnVpLXdpZGdldCAudWktd2lkZ2V0IHsNCi0gICAgZm9udC1zaXplOiAxZW07DQotfQ0KLQ0KLS51aS13aWRnZXQgaW5wdXQsIC51aS13aWRnZXQgc2VsZWN0LCAudWktd2lkZ2V0IHRleHRhcmVhLCAudWktd2lkZ2V0IGJ1dHRvbiB7DQotICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsNCi0gICAgZm9udC1zaXplOiAxZW07DQotfQ0KLQ0KLS51aS13aWRnZXQtY29udGVudCB7DQotICAgIGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7DQotICAgIGJhY2tncm91bmQ6ICNmZmZmZmYgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2ZsYXRfNzVfZmZmZmZmXzQweDEwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7DQotICAgIGNvbG9yOiAjMjIyMjIyOw0KLX0NCi0NCi0udWktd2lkZ2V0LWNvbnRlbnQgYSB7DQotICAgIGNvbG9yOiAjMjIyMjIyOw0KLX0NCi0NCi0udWktd2lkZ2V0LWhlYWRlciB7DQotICAgIGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7DQotICAgIGJhY2tncm91bmQ6ICNjY2NjY2MgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0Xzc1X2NjY2NjY18xeDEwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7DQotICAgIGNvbG9yOiAjMjIyMjIyOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotLnVpLXdpZGdldC1oZWFkZXIgYSB7DQotICAgIGNvbG9yOiAjMjIyMjIyOw0KLX0NCi0NCi0vKiBJbnRlcmFjdGlvbiBzdGF0ZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0udWktc3RhdGUtZGVmYXVsdCwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1kZWZhdWx0LCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZGVmYXVsdCB7DQotICAgIGJvcmRlcjogMXB4IHNvbGlkICNkM2QzZDM7DQotICAgIGJhY2tncm91bmQ6ICNlNmU2ZTYgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2dsYXNzXzc1X2U2ZTZlNl8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7DQotICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICAgIGNvbG9yOiAjNTU1NTU1Ow0KLX0NCi0NCi0udWktc3RhdGUtZGVmYXVsdCBhLCAudWktc3RhdGUtZGVmYXVsdCBhOmxpbmssIC51aS1zdGF0ZS1kZWZhdWx0IGE6dmlzaXRlZCB7DQotICAgIGNvbG9yOiAjNTU1NTU1Ow0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLS51aS1zdGF0ZS1ob3ZlciwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1ob3ZlciwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhvdmVyLCAudWktc3RhdGUtZm9jdXMsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZm9jdXMsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1mb2N1cyB7DQotICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk5OTk7DQotICAgIGJhY2tncm91bmQ6ICNkYWRhZGEgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2dsYXNzXzc1X2RhZGFkYV8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7DQotICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICAgIGNvbG9yOiAjMjEyMTIxOw0KLX0NCi0NCi0udWktc3RhdGUtaG92ZXIgYSwgLnVpLXN0YXRlLWhvdmVyIGE6aG92ZXIgew0KLSAgICBjb2xvcjogIzIxMjEyMTsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0udWktc3RhdGUtYWN0aXZlLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWFjdGl2ZSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWFjdGl2ZSB7DQotICAgIGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7DQotICAgIGJhY2tncm91bmQ6ICNmZmZmZmYgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2dsYXNzXzY1X2ZmZmZmZl8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7DQotICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICAgIGNvbG9yOiAjMjEyMTIxOw0KLX0NCi0NCi0udWktc3RhdGUtYWN0aXZlIGEsIC51aS1zdGF0ZS1hY3RpdmUgYTpsaW5rLCAudWktc3RhdGUtYWN0aXZlIGE6dmlzaXRlZCB7DQotICAgIGNvbG9yOiAjMjEyMTIxOw0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLS8qIEludGVyYWN0aW9uIEN1ZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0udWktc3RhdGUtaGlnaGxpZ2h0LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhpZ2hsaWdodCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodCB7DQotICAgIGJvcmRlcjogMXB4IHNvbGlkICNmY2VmYTE7DQotICAgIGJhY2tncm91bmQ6ICNmYmY5ZWUgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2dsYXNzXzU1X2ZiZjllZV8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7DQotICAgIGNvbG9yOiAjMzYzNjM2Ow0KLX0NCi0NCi0udWktc3RhdGUtaGlnaGxpZ2h0IGEsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0IGEsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1oaWdobGlnaHQgYSB7DQotICAgIGNvbG9yOiAjMzYzNjM2Ow0KLX0NCi0NCi0udWktc3RhdGUtZXJyb3IsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3IsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvciB7DQotICAgIGJvcmRlcjogMXB4IHNvbGlkICNjZDBhMGE7DQotICAgIGJhY2tncm91bmQ6ICNmZWYxZWMgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2dsYXNzXzk1X2ZlZjFlY18xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7DQotICAgIGNvbG9yOiAjY2QwYTBhOw0KLX0NCi0NCi0udWktc3RhdGUtZXJyb3IgYSwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvciBhLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3IgYSB7DQotICAgIGNvbG9yOiAjY2QwYTBhOw0KLX0NCi0NCi0udWktc3RhdGUtZXJyb3ItdGV4dCwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvci10ZXh0LCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3ItdGV4dCB7DQotICAgIGNvbG9yOiAjY2QwYTBhOw0KLX0NCi0NCi0udWktcHJpb3JpdHktcHJpbWFyeSwgLnVpLXdpZGdldC1jb250ZW50IC51aS1wcmlvcml0eS1wcmltYXJ5LCAudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktcHJpbWFyeSB7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0udWktcHJpb3JpdHktc2Vjb25kYXJ5LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXByaW9yaXR5LXNlY29uZGFyeSwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXByaW9yaXR5LXNlY29uZGFyeSB7DQotICAgIG9wYWNpdHk6IC43Ow0KLSAgICBmaWx0ZXI6IEFscGhhKE9wYWNpdHk9NzApOw0KLSAgICBmb250LXdlaWdodDogbm9ybWFsOw0KLX0NCi0NCi0udWktc3RhdGUtZGlzYWJsZWQsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZGlzYWJsZWQsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1kaXNhYmxlZCB7DQotICAgIG9wYWNpdHk6IC4zNTsNCi0gICAgZmlsdGVyOiBBbHBoYShPcGFjaXR5PTM1KTsNCi0gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsNCi19DQotDQotLyogSWNvbnMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiBzdGF0ZXMgYW5kIGltYWdlcyAqLw0KLS51aS1pY29uIHsNCi0gICAgd2lkdGg6IDE2cHg7DQotICAgIGhlaWdodDogMTZweDsNCi0gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyk7DQotfQ0KLQ0KLS51aS13aWRnZXQtY29udGVudCAudWktaWNvbiB7DQotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy91aS1pY29uc18yMjIyMjJfMjU2eDI0MC5wbmcpOw0KLX0NCi0NCi0udWktd2lkZ2V0LWhlYWRlciAudWktaWNvbiB7DQotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy91aS1pY29uc18yMjIyMjJfMjU2eDI0MC5wbmcpOw0KLX0NCi0NCi0udWktc3RhdGUtZGVmYXVsdCAudWktaWNvbiB7DQotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy91aS1pY29uc184ODg4ODhfMjU2eDI0MC5wbmcpOw0KLX0NCi0NCi0udWktc3RhdGUtaG92ZXIgLnVpLWljb24sIC51aS1zdGF0ZS1mb2N1cyAudWktaWNvbiB7DQotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy91aS1pY29uc180NTQ1NDVfMjU2eDI0MC5wbmcpOw0KLX0NCi0NCi0udWktc3RhdGUtYWN0aXZlIC51aS1pY29uIHsNCi0gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWljb25zXzQ1NDU0NV8yNTZ4MjQwLnBuZyk7DQotfQ0KLQ0KLS51aS1zdGF0ZS1oaWdobGlnaHQgLnVpLWljb24gew0KLSAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvdWktaWNvbnNfMmU4M2ZmXzI1NngyNDAucG5nKTsNCi19DQotDQotLnVpLXN0YXRlLWVycm9yIC51aS1pY29uLCAudWktc3RhdGUtZXJyb3ItdGV4dCAudWktaWNvbiB7DQotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy91aS1pY29uc19jZDBhMGFfMjU2eDI0MC5wbmcpOw0KLX0NCi0NCi0vKiBwb3NpdGlvbmluZyAqLw0KLS51aS1pY29uLWNhcmF0LTEtbiB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsNCi19DQotDQotLnVpLWljb24tY2FyYXQtMS1uZSB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IDA7DQotfQ0KLQ0KLS51aS1pY29uLWNhcmF0LTEtZSB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IDA7DQotfQ0KLQ0KLS51aS1pY29uLWNhcmF0LTEtc2Ugew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAwOw0KLX0NCi0NCi0udWktaWNvbi1jYXJhdC0xLXMgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAwOw0KLX0NCi0NCi0udWktaWNvbi1jYXJhdC0xLXN3IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggMDsNCi19DQotDQotLnVpLWljb24tY2FyYXQtMS13IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggMDsNCi19DQotDQotLnVpLWljb24tY2FyYXQtMS1udyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAwOw0KLX0NCi0NCi0udWktaWNvbi1jYXJhdC0yLW4tcyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAwOw0KLX0NCi0NCi0udWktaWNvbi1jYXJhdC0yLWUtdyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAwOw0KLX0NCi0NCi0udWktaWNvbi10cmlhbmdsZS0xLW4gew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNnB4Ow0KLX0NCi0NCi0udWktaWNvbi10cmlhbmdsZS0xLW5lIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE2cHg7DQotfQ0KLQ0KLS51aS1pY29uLXRyaWFuZ2xlLTEtZSB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNnB4Ow0KLX0NCi0NCi0udWktaWNvbi10cmlhbmdsZS0xLXNlIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE2cHg7DQotfQ0KLQ0KLS51aS1pY29uLXRyaWFuZ2xlLTEtcyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xNnB4Ow0KLX0NCi0NCi0udWktaWNvbi10cmlhbmdsZS0xLXN3IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE2cHg7DQotfQ0KLQ0KLS51aS1pY29uLXRyaWFuZ2xlLTEtdyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNnB4Ow0KLX0NCi0NCi0udWktaWNvbi10cmlhbmdsZS0xLW53IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xNnB4Ow0KLX0NCi0NCi0udWktaWNvbi10cmlhbmdsZS0yLW4tcyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTZweDsNCi19DQotDQotLnVpLWljb24tdHJpYW5nbGUtMi1lLXcgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTE2cHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93LTEtbiB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTMycHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93LTEtbmUgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMzJweDsNCi19DQotDQotLnVpLWljb24tYXJyb3ctMS1lIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTMycHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93LTEtc2Ugew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMzJweDsNCi19DQotDQotLnVpLWljb24tYXJyb3ctMS1zIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTMycHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93LTEtc3cgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMzJweDsNCi19DQotDQotLnVpLWljb24tYXJyb3ctMS13IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTMycHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93LTEtbncgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTMycHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93LTItbi1zIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0zMnB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvdy0yLW5lLXN3IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0zMnB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvdy0yLWUtdyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtMzJweDsNCi19DQotDQotLnVpLWljb24tYXJyb3ctMi1zZS1udyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMzJweDsNCi19DQotDQotLnVpLWljb24tYXJyb3dzdG9wLTEtbiB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMzJweDsNCi19DQotDQotLnVpLWljb24tYXJyb3dzdG9wLTEtZSB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMzJweDsNCi19DQotDQotLnVpLWljb24tYXJyb3dzdG9wLTEtcyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMzJweDsNCi19DQotDQotLnVpLWljb24tYXJyb3dzdG9wLTEtdyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtMzJweDsNCi19DQotDQotLnVpLWljb24tYXJyb3d0aGljay0xLW4gew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC00OHB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvd3RoaWNrLTEtbmUgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtNDhweDsNCi19DQotDQotLnVpLWljb24tYXJyb3d0aGljay0xLWUgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtNDhweDsNCi19DQotDQotLnVpLWljb24tYXJyb3d0aGljay0xLXNlIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTQ4cHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93dGhpY2stMS1zIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTQ4cHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93dGhpY2stMS1zdyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC00OHB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvd3RoaWNrLTEtdyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC00OHB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvd3RoaWNrLTEtbncgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTQ4cHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93dGhpY2stMi1uLXMgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTQ4cHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93dGhpY2stMi1uZS1zdyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtNDhweDsNCi19DQotDQotLnVpLWljb24tYXJyb3d0aGljay0yLWUtdyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtNDhweDsNCi19DQotDQotLnVpLWljb24tYXJyb3d0aGljay0yLXNlLW53IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC00OHB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLW4gew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTQ4cHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtZSB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtNDhweDsNCi19DQotDQotLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1zIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC00OHB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLXcgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTQ4cHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS13IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNjRweDsNCi19DQotDQotLnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLW4gew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtNjRweDsNCi19DQotDQotLnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLWUgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtNjRweDsNCi19DQotDQotLnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXMgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtNjRweDsNCi19DQotDQotLnVpLWljb24tYXJyb3dyZXR1cm4tMS13IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTY0cHg7DQotfQ0KLQ0KLS51aS1pY29uLWFycm93cmV0dXJuLTEtbiB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC02NHB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvd3JldHVybi0xLWUgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtNjRweDsNCi19DQotDQotLnVpLWljb24tYXJyb3dyZXR1cm4tMS1zIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC02NHB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS13IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC02NHB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS1uIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC02NHB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS1lIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC02NHB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS1zIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC02NHB4Ow0KLX0NCi0NCi0udWktaWNvbi1hcnJvdy00IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtODBweDsNCi19DQotDQotLnVpLWljb24tYXJyb3ctNC1kaWFnIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTgwcHg7DQotfQ0KLQ0KLS51aS1pY29uLWV4dGxpbmsgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtODBweDsNCi19DQotDQotLnVpLWljb24tbmV3d2luIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTgwcHg7DQotfQ0KLQ0KLS51aS1pY29uLXJlZnJlc2ggew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtODBweDsNCi19DQotDQotLnVpLWljb24tc2h1ZmZsZSB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC04MHB4Ow0KLX0NCi0NCi0udWktaWNvbi10cmFuc2Zlci1lLXcgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtODBweDsNCi19DQotDQotLnVpLWljb24tdHJhbnNmZXJ0aGljay1lLXcgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTgwcHg7DQotfQ0KLQ0KLS51aS1pY29uLWZvbGRlci1jb2xsYXBzZWQgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC05NnB4Ow0KLX0NCi0NCi0udWktaWNvbi1mb2xkZXItb3BlbiB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC05NnB4Ow0KLX0NCi0NCi0udWktaWNvbi1kb2N1bWVudCB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC05NnB4Ow0KLX0NCi0NCi0udWktaWNvbi1kb2N1bWVudC1iIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTk2cHg7DQotfQ0KLQ0KLS51aS1pY29uLW5vdGUgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtOTZweDsNCi19DQotDQotLnVpLWljb24tbWFpbC1jbG9zZWQgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtOTZweDsNCi19DQotDQotLnVpLWljb24tbWFpbC1vcGVuIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTk2cHg7DQotfQ0KLQ0KLS51aS1pY29uLXN1aXRjYXNlIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC05NnB4Ow0KLX0NCi0NCi0udWktaWNvbi1jb21tZW50IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC05NnB4Ow0KLX0NCi0NCi0udWktaWNvbi1wZXJzb24gew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTk2cHg7DQotfQ0KLQ0KLS51aS1pY29uLXByaW50IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC05NnB4Ow0KLX0NCi0NCi0udWktaWNvbi10cmFzaCB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtOTZweDsNCi19DQotDQotLnVpLWljb24tbG9ja2VkIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC05NnB4Ow0KLX0NCi0NCi0udWktaWNvbi11bmxvY2tlZCB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtOTZweDsNCi19DQotDQotLnVpLWljb24tYm9va21hcmsgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTk2cHg7DQotfQ0KLQ0KLS51aS1pY29uLXRhZyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtOTZweDsNCi19DQotDQotLnVpLWljb24taG9tZSB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTExMnB4Ow0KLX0NCi0NCi0udWktaWNvbi1mbGFnIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTExMnB4Ow0KLX0NCi0NCi0udWktaWNvbi1jYWxlbmRhciB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xMTJweDsNCi19DQotDQotLnVpLWljb24tY2FydCB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xMTJweDsNCi19DQotDQotLnVpLWljb24tcGVuY2lsIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTExMnB4Ow0KLX0NCi0NCi0udWktaWNvbi1jbG9jayB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xMTJweDsNCi19DQotDQotLnVpLWljb24tZGlzayB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xMTJweDsNCi19DQotDQotLnVpLWljb24tY2FsY3VsYXRvciB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTEycHg7DQotfQ0KLQ0KLS51aS1pY29uLXpvb21pbiB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTEycHg7DQotfQ0KLQ0KLS51aS1pY29uLXpvb21vdXQgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTExMnB4Ow0KLX0NCi0NCi0udWktaWNvbi1zZWFyY2ggew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTExMnB4Ow0KLX0NCi0NCi0udWktaWNvbi13cmVuY2ggew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4Ow0KLX0NCi0NCi0udWktaWNvbi1nZWFyIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xMTJweDsNCi19DQotDQotLnVpLWljb24taGVhcnQgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTExMnB4Ow0KLX0NCi0NCi0udWktaWNvbi1zdGFyIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0xMTJweDsNCi19DQotDQotLnVpLWljb24tbGluayB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtMTEycHg7DQotfQ0KLQ0KLS51aS1pY29uLWNhbmNlbCB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTEyOHB4Ow0KLX0NCi0NCi0udWktaWNvbi1wbHVzIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTEyOHB4Ow0KLX0NCi0NCi0udWktaWNvbi1wbHVzdGhpY2sgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7DQotfQ0KLQ0KLS51aS1pY29uLW1pbnVzIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTEyOHB4Ow0KLX0NCi0NCi0udWktaWNvbi1taW51c3RoaWNrIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTEyOHB4Ow0KLX0NCi0NCi0udWktaWNvbi1jbG9zZSB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xMjhweDsNCi19DQotDQotLnVpLWljb24tY2xvc2V0aGljayB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xMjhweDsNCi19DQotDQotLnVpLWljb24ta2V5IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMjhweDsNCi19DQotDQotLnVpLWljb24tbGlnaHRidWxiIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsNCi19DQotDQotLnVpLWljb24tc2Npc3NvcnMgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTEyOHB4Ow0KLX0NCi0NCi0udWktaWNvbi1jbGlwYm9hcmQgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTEyOHB4Ow0KLX0NCi0NCi0udWktaWNvbi1jb3B5IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMjhweDsNCi19DQotDQotLnVpLWljb24tY29udGFjdCB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMTI4cHg7DQotfQ0KLQ0KLS51aS1pY29uLWltYWdlIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xMjhweDsNCi19DQotDQotLnVpLWljb24tdmlkZW8gew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTEyOHB4Ow0KLX0NCi0NCi0udWktaWNvbi1zY3JpcHQgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTEyOHB4Ow0KLX0NCi0NCi0udWktaWNvbi1hbGVydCB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE0NHB4Ow0KLX0NCi0NCi0udWktaWNvbi1pbmZvIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE0NHB4Ow0KLX0NCi0NCi0udWktaWNvbi1ub3RpY2Ugew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTQ0cHg7DQotfQ0KLQ0KLS51aS1pY29uLWhlbHAgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTQ0cHg7DQotfQ0KLQ0KLS51aS1pY29uLWNoZWNrIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE0NHB4Ow0KLX0NCi0NCi0udWktaWNvbi1idWxsZXQgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTQ0cHg7DQotfQ0KLQ0KLS51aS1pY29uLXJhZGlvLW9uIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE0NHB4Ow0KLX0NCi0NCi0udWktaWNvbi1yYWRpby1vZmYgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE0NHB4Ow0KLX0NCi0NCi0udWktaWNvbi1waW4tdyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTQ0cHg7DQotfQ0KLQ0KLS51aS1pY29uLXBpbi1zIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNDRweDsNCi19DQotDQotLnVpLWljb24tcGxheSB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE2MHB4Ow0KLX0NCi0NCi0udWktaWNvbi1wYXVzZSB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xNjBweDsNCi19DQotDQotLnVpLWljb24tc2Vlay1uZXh0IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTE2MHB4Ow0KLX0NCi0NCi0udWktaWNvbi1zZWVrLXByZXYgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTYwcHg7DQotfQ0KLQ0KLS51aS1pY29uLXNlZWstZW5kIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE2MHB4Ow0KLX0NCi0NCi0udWktaWNvbi1zZWVrLXN0YXJ0IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE2MHB4Ow0KLX0NCi0NCi0vKiB1aS1pY29uLXNlZWstZmlyc3QgaXMgZGVwcmVjYXRlZCwgdXNlIHVpLWljb24tc2Vlay1zdGFydCBpbnN0ZWFkICovDQotLnVpLWljb24tc2Vlay1maXJzdCB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNjBweDsNCi19DQotDQotLnVpLWljb24tc3RvcCB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNjBweDsNCi19DQotDQotLnVpLWljb24tZWplY3Qgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE2MHB4Ow0KLX0NCi0NCi0udWktaWNvbi12b2x1bWUtb2ZmIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xNjBweDsNCi19DQotDQotLnVpLWljb24tdm9sdW1lLW9uIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNjBweDsNCi19DQotDQotLnVpLWljb24tcG93ZXIgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNzZweDsNCi19DQotDQotLnVpLWljb24tc2lnbmFsLWRpYWcgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTc2cHg7DQotfQ0KLQ0KLS51aS1pY29uLXNpZ25hbCB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNzZweDsNCi19DQotDQotLnVpLWljb24tYmF0dGVyeS0wIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE3NnB4Ow0KLX0NCi0NCi0udWktaWNvbi1iYXR0ZXJ5LTEgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTc2cHg7DQotfQ0KLQ0KLS51aS1pY29uLWJhdHRlcnktMiB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNzZweDsNCi19DQotDQotLnVpLWljb24tYmF0dGVyeS0zIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE3NnB4Ow0KLX0NCi0NCi0udWktaWNvbi1jaXJjbGUtcGx1cyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE5MnB4Ow0KLX0NCi0NCi0udWktaWNvbi1jaXJjbGUtbWludXMgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTkycHg7DQotfQ0KLQ0KLS51aS1pY29uLWNpcmNsZS1jbG9zZSB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xOTJweDsNCi19DQotDQotLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLWUgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTkycHg7DQotfQ0KLQ0KLS51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1zIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE5MnB4Ow0KLX0NCi0NCi0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtdyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xOTJweDsNCi19DQotDQotLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLW4gew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTkycHg7DQotfQ0KLQ0KLS51aS1pY29uLWNpcmNsZS1hcnJvdy1lIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xOTJweDsNCi19DQotDQotLnVpLWljb24tY2lyY2xlLWFycm93LXMgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE5MnB4Ow0KLX0NCi0NCi0udWktaWNvbi1jaXJjbGUtYXJyb3ctdyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTkycHg7DQotfQ0KLQ0KLS51aS1pY29uLWNpcmNsZS1hcnJvdy1uIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xOTJweDsNCi19DQotDQotLnVpLWljb24tY2lyY2xlLXpvb21pbiB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTkycHg7DQotfQ0KLQ0KLS51aS1pY29uLWNpcmNsZS16b29tb3V0IHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xOTJweDsNCi19DQotDQotLnVpLWljb24tY2lyY2xlLWNoZWNrIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xOTJweDsNCi19DQotDQotLnVpLWljb24tY2lyY2xlc21hbGwtcGx1cyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTIwOHB4Ow0KLX0NCi0NCi0udWktaWNvbi1jaXJjbGVzbWFsbC1taW51cyB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0yMDhweDsNCi19DQotDQotLnVpLWljb24tY2lyY2xlc21hbGwtY2xvc2Ugew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMjA4cHg7DQotfQ0KLQ0KLS51aS1pY29uLXNxdWFyZXNtYWxsLXBsdXMgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMjA4cHg7DQotfQ0KLQ0KLS51aS1pY29uLXNxdWFyZXNtYWxsLW1pbnVzIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTIwOHB4Ow0KLX0NCi0NCi0udWktaWNvbi1zcXVhcmVzbWFsbC1jbG9zZSB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0yMDhweDsNCi19DQotDQotLnVpLWljb24tZ3JpcC1kb3R0ZWQtdmVydGljYWwgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0yMjRweDsNCi19DQotDQotLnVpLWljb24tZ3JpcC1kb3R0ZWQtaG9yaXpvbnRhbCB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0yMjRweDsNCi19DQotDQotLnVpLWljb24tZ3JpcC1zb2xpZC12ZXJ0aWNhbCB7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0yMjRweDsNCi19DQotDQotLnVpLWljb24tZ3JpcC1zb2xpZC1ob3Jpem9udGFsIHsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTIyNHB4Ow0KLX0NCi0NCi0udWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2Ugew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMjI0cHg7DQotfQ0KLQ0KLS51aS1pY29uLWdyaXAtZGlhZ29uYWwtc2Ugew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMjI0cHg7DQotfQ0KLQ0KLS8qIE1pc2MgdmlzdWFscw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIENvcm5lciByYWRpdXMgKi8NCi0udWktY29ybmVyLWFsbCwgLnVpLWNvcm5lci10b3AsIC51aS1jb3JuZXItbGVmdCwgLnVpLWNvcm5lci10bCB7DQotICAgIC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiA0cHg7DQotICAgIC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4Ow0KLSAgICAta2h0bWwtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4Ow0KLSAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7DQotfQ0KLQ0KLS51aS1jb3JuZXItYWxsLCAudWktY29ybmVyLXRvcCwgLnVpLWNvcm5lci1yaWdodCwgLnVpLWNvcm5lci10ciB7DQotICAgIC1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDogNHB4Ow0KLSAgICAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7DQotICAgIC1raHRtbC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4Ow0KLSAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4Ow0KLX0NCi0NCi0udWktY29ybmVyLWFsbCwgLnVpLWNvcm5lci1ib3R0b20sIC51aS1jb3JuZXItbGVmdCwgLnVpLWNvcm5lci1ibCB7DQotICAgIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA0cHg7DQotICAgIC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4Ow0KLSAgICAta2h0bWwtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4Ow0KLSAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7DQotfQ0KLQ0KLS51aS1jb3JuZXItYWxsLCAudWktY29ybmVyLWJvdHRvbSwgLnVpLWNvcm5lci1yaWdodCwgLnVpLWNvcm5lci1iciB7DQotICAgIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogNHB4Ow0KLSAgICAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7DQotICAgIC1raHRtbC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4Ow0KLSAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4Ow0KLX0NCi0NCi0vKiBPdmVybGF5cyAqLw0KLS51aS13aWRnZXQtb3ZlcmxheSB7DQotICAgIGJhY2tncm91bmQ6ICNhYWFhYWEgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2ZsYXRfMF9hYWFhYWFfNDB4MTAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsNCi0gICAgb3BhY2l0eTogLjM7DQotICAgIGZpbHRlcjogQWxwaGEoT3BhY2l0eT0zMCk7DQotfQ0KLQ0KLS51aS13aWRnZXQtc2hhZG93IHsNCi0gICAgbWFyZ2luOiAtOHB4IDAgMCAtOHB4Ow0KLSAgICBwYWRkaW5nOiA4cHg7DQotICAgIGJhY2tncm91bmQ6ICNhYWFhYWEgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2ZsYXRfMF9hYWFhYWFfNDB4MTAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsNCi0gICAgb3BhY2l0eTogLjM7DQotICAgIGZpbHRlcjogQWxwaGEoT3BhY2l0eT0zMCk7DQotICAgIC1tb3otYm9yZGVyLXJhZGl1czogOHB4Ow0KLSAgICAta2h0bWwtYm9yZGVyLXJhZGl1czogOHB4Ow0KLSAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDhweDsNCi0gICAgYm9yZGVyLXJhZGl1czogOHB4Ow0KLX0NCi0NCi0vKiBDYWxlbmRhciBCdXR0b24gYW5kIEltYWdlICovDQotLnZpZXctY2FsZW5kYXIgYnV0dG9uIHsNCi0gICAgYmFja2dyb3VuZDogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL2NhbC5naWYpIG5vLXJlcGVhdCAhaW1wb3J0YW50Ow0KLSAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQotICAgIGJvcmRlcjogbm9uZTsNCi0gICAgdmVydGljYWwtYWxpZ246IGNlbnRlcjsNCi0gICAgbWFyZ2luLXRvcDogM3B4Ow0KLSAgICBtYXJnaW4tbGVmdDogNnB4Ow0KLSAgICB3aWR0aDogMjJweDsNCi0gICAgaGVpZ2h0OiAyMnB4Ow0KLX0NCi0NCi0vKiBjc3MgZm9yIHRpbWVwaWNrZXIgKi8NCi0udWktdGltZXBpY2tlci1kaXYgLnVpLXdpZGdldC1oZWFkZXIgew0KLSAgICBtYXJnaW4tYm90dG9tOiA4cHg7DQotfQ0KLQ0KLS51aS10aW1lcGlja2VyLWRpdiBkbCB7DQotICAgIHRleHQtYWxpZ246IGxlZnQ7DQotfQ0KLQ0KLS51aS10aW1lcGlja2VyLWRpdiBkbCBkdCB7DQotICAgIGhlaWdodDogMjVweDsNCi0gICAgbWFyZ2luLWJvdHRvbTogLTI1cHg7DQotfQ0KLQ0KLS51aS10aW1lcGlja2VyLWRpdiBkbCBkZCB7DQotICAgIG1hcmdpbjogMCAxMHB4IDEwcHggNjVweDsNCi19DQotDQotLnVpLXRpbWVwaWNrZXItZGl2IHRkIHsNCi0gICAgZm9udC1zaXplOiA5MCU7DQotfQ0KLQ0KLS51aS10cGlja2VyLWdyaWQtbGFiZWwgew0KLSAgICBiYWNrZ3JvdW5kOiBub25lOw0KLSAgICBib3JkZXI6IG5vbmU7DQotICAgIG1hcmdpbjogMDsNCi0gICAgcGFkZGluZzogMDsNCi19DQotDQotLyo9PT09PT09PT09PT09PT09PT09IEZvciB0aGUgcXVpY2thZGQgcGFnZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLS5xdWlja2FkZGFsbCB7DQotICAgIGZsb2F0OiByaWdodDsNCi0gICAgcGFkZGluZy1ib3R0b206IDFlbTsNCi0gICAgcGFkZGluZy10b3A6IDFlbTsNCi19DQotDQotLnF1aWNrYWRkdGFibGUgew0KLSAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQotICAgIGNsZWFyOiBib3RoOw0KLX0NCi0NCi0ucXVpY2thZGR0YWJsZSBzcGFuIHsNCi0gICAgZGlzcGxheTogaW5saW5lOw0KLSAgICBmbG9hdDogbGVmdDsNCi0gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzk5OTk5OTsNCi0gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM5OTk5OTk7DQotICAgIG1hcmdpbjogMHB4Ow0KLSAgICBwYWRkaW5nOiAzcHg7DQotfQ0KLQ0KLS5xdWlja2FkZHRhYmxlIHAgew0KLSAgICBjbGVhcjogbGVmdDsNCi0gICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7DQotICAgIGhlaWdodDogMWVtOw0KLX0NCi0NCi0ucXVpY2thZGR0YWJsZSBzcGFuLnBpZCB7DQotICAgIHdpZHRoOiAxMCU7DQotfQ0KLQ0KLS5xdWlja2FkZHRhYmxlIHNwYW4ubmFtZSB7DQotICAgIHdpZHRoOiA1MCU7DQotICAgIHRleHQtYWxpZ246IGxlZnQ7DQotfQ0KLQ0KLS5xdWlja2FkZHRhYmxlIHNwYW4ubGlzdFByaWNlIHsNCi0gICAgd2lkdGg6IDEwJQ0KLX0NCi0NCi0ucXVpY2thZGR0YWJsZSBzcGFuLnRvdGFsUHJpY2Ugew0KLSAgICB3aWR0aDogMTAlDQotfQ0KLQ0KLS5xdWlja2FkZHRhYmxlIHNwYW4ucXR5IHsNCi0gICAgd2lkdGg6IDEwJQ0KLX0NCi0NCi0vKnNldCBKZ3Jvd2wgY3NzIGhlcmUgdG8gYXZvaWQgc2lkZSBlZmZlY3Qgd2l0aCBvdGhlciBjbGFzcyovDQotLmVycm9yTWVzc2FnZUpHcm93bCB7DQotICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9pbWFnZXMvZXhjbGFtYXRpb24ucG5nIikgbm8tcmVwZWF0IHNjcm9sbCA1cHggNTAlICM4MjBmMDU7DQotICAgIGJvcmRlcjogM3B4IHNvbGlkICNmMGYwZjA7DQotICAgIGNvbG9yOiAjZmZmZmZmOw0KLSAgICBmb250LXNpemU6IDEuM2VtOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgcGFkZGluZzogMTBweCAxMHB4IDEwcHggNTBweDsNCi0gICAgbGluZS1oZWlnaHQ6IDEuM2VtOw0KLSAgICBtaW4td2lkdGg6IDM1MHB4Ow0KLSAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7DQotICAgIGJveC1zaGFkb3c6IC0wcHggLTBweCAyMHB4IDVweCAjODg4ODg4Ow0KLSAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsNCi19DQotDQotLmV2ZW50TWVzc2FnZUpHcm93bCB7DQotICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9pbWFnZXMvaW5mb3JtYXRpb24ucG5nIikgbm8tcmVwZWF0IHNjcm9sbCA1cHggNTAlICMxMDVmYTg7DQotICAgIGJvcmRlcjogM3B4IHNvbGlkICNmMGYwZjA7DQotICAgIGNvbG9yOiAjZmZmZmZmOw0KLSAgICBmb250LXNpemU6IDEuM2VtOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgcGFkZGluZzogMTBweCAxMHB4IDEwcHggNTBweDsNCi0gICAgbGluZS1oZWlnaHQ6IDEuM2VtOw0KLSAgICBtaW4td2lkdGg6IDM1MHB4Ow0KLSAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7DQotICAgIGJveC1zaGFkb3c6IC0wcHggLTBweCAyMHB4IDVweCAjODg4ODg4Ow0KLX0NCi0NCi0uY2xvc2VBbGxKR3Jvd2wgew0KLSAgICBtaW4td2lkdGg6IDM1MHB4Ow0KLSAgICBwYWRkaW5nOiA1cHggNXB4IDVweCA1MHB4Ow0KLSAgICBib3JkZXI6IDFweCBzb2xpZCAjZjBmMGYwOw0KLX0NCi0NCi0uY29udGVudC1tZXNzYWdlcyBwIHsNCi0gICAgZGlzcGxheTogbm9uZTsNCi19DQotDQotLyogRnJvbSBodHRwOi8vanF1ZXJ5dWkuY29tL2RlbW9zL2F1dG9jb21wbGV0ZS9tYXhoZWlnaHQuaHRtbCAqLw0KLS8qIFdoZW4gZGlzcGxheWluZyBhIGxvbmcgbGlzdCBvZiBvcHRpb25zLCB5b3UgY2FuIHNpbXBseSBzZXQgdGhlIG1heC1oZWlnaHQgZm9yIHRoZSBhdXRvY29tcGxldGUgbWVudSB0byBwcmV2ZW50IHRoZSBtZW51IGZyb20gZ3Jvd2luZyB0b28gbGFyZ2UgKi8NCi0udWktYXV0b2NvbXBsZXRlIHsNCi0gICAgbWF4LWhlaWdodDogMjUwcHg7DQotICAgIG92ZXJmbG93LXk6IGF1dG87DQotICAgIC8qIHByZXZlbnQgaG9yaXpvbnRhbCBzY3JvbGxiYXIgKi8NCi0gICAgb3ZlcmZsb3cteDogaGlkZGVuOw0KLSAgICAvKiBhZGQgcGFkZGluZyB0byBhY2NvdW50IGZvciB2ZXJ0aWNhbCBzY3JvbGxiYXIgKi8NCi0gICAgcGFkZGluZy1yaWdodDogMjBweDsNCi19DQotDQotLyogSUUgNiBkb2Vzbid0IHN1cHBvcnQgbWF4LWhlaWdodA0KLSAqIHdlIHVzZSBoZWlnaHQgaW5zdGVhZCwgYnV0IHRoaXMgZm9yY2VzIHRoZSBtZW51IHRvIGFsd2F5cyBiZSB0aGlzIHRhbGwNCi0gKi8NCi0qIGh0bWwgLnVpLWF1dG9jb21wbGV0ZSB7DQotICAgIGhlaWdodDogMjUwcHg7DQotfQ0KLQ0KLS8qIFRoZSBjdXN0b20gQ1NTIGZvciBhZGp1c3QgdGhlIEpzVHJlZSAqLw0KLS5qc3RyZWUtZGVmYXVsdCAuanN0cmVlLWxlYWYgPiBpbnMgew0KLSAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzZweCAwOw0KLSAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KLX0NCi0NCi1odG1sID4gLyoqLyBib2R5IC5qc3RyZWUtZGVmYXVsdCBhIHsNCi0gICAgd2hpdGUtc3BhY2U6IG5vcm1hbCAhaW1wb3J0YW50Ow0KLSAgICBoZWlnaHQ6IGF1dG87DQotfQ0KLQ0KLS8qIElFNiBhbmQgYmVsb3cgKi8NCi0qIGh0bWwgLmpzdHJlZS1kZWZhdWx0IGEgew0KLSAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOw0KLSAgICBoZWlnaHQ6IGF1dG87DQotfQ0KLQ0KLS8qIElFNyAqLw0KLSogKyBodG1sIC5qc3RyZWUtZGVmYXVsdCBhIHsNCi0gICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsNCi0gICAgaGVpZ2h0OiBhdXRvOw0KLX0NCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qIFRoaXMgQ1NTIGZpbGUgaXMgdXNlZCBmb3IgYWxsIE9GQml6IGFwcGxpY2F0aW9ucyBFWENFUFQgZWNvbW1lcmNlLiAqLworLyogU2VlIHRoZSAiZWNvbW1haW4uY3NzIiBmaWxlIGZvciBlY29tbWVyY2UuICovCisvKiA9PT09PSBSZXNldHMvQnJvd3NlciBOb3JtYWxpemF0aW9uID09PT09ICovCisKK2h0bWwsIGJvZHksIGRpdiwgc3BhbiwgYXBwbGV0LCBvYmplY3QsIGlmcmFtZSwKK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHAsIGJsb2NrcXVvdGUsIHByZSwKK2EsIGFiYnIsIGFjcm9ueW0sIGFkZHJlc3MsIGJpZywgY2l0ZSwgY29kZSwKK2RlbCwgZGZuLCBlbSwgZm9udCwgaW1nLCBpbnMsIGtiZCwgcSwgcywgc2FtcCwKK3NtYWxsLCBzdHJpa2UsIHN0cm9uZywgc3ViLCBzdXAsIHR0LCB2YXIsCitiLCB1LCBpLCBjZW50ZXIsIGRsLCBkdCwgZGQsIG9sLCB1bCwgbGksCitmaWVsZHNldCwgZm9ybSwgbGFiZWwsIGxlZ2VuZCwKK3RhYmxlLCBjYXB0aW9uLCB0Ym9keSwgdGZvb3QsIHRoZWFkLCB0ciwgdGgsIHRkIHsKKyAgICBib3JkZXI6IDA7CisgICAgbWFyZ2luOiAwOworICAgIG91dGxpbmU6IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBmb250LXNpemU6IDEwMCU7IC8qYWRkIGZvbnQgc2l6ZSB0byByZXNldCAqLworICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OworICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKK30KKworYm9keSB7CisgICAgbGluZS1oZWlnaHQ6IDEuNWVtOworICAgIGNvbG9yOiBibGFjazsKKyAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKK30KKworLyogcmVzZXQgbGluZSBoZWlnaHQgYW5kIGJhc2VsaW5lIGNvbG9ycyovCisKK2Jsb2NrcXVvdGUsIGJvZHksIGRpdiwgZGwsIGR0LCBkZCwgZmllbGRzZXQsIGZvcm0sIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIGltZywgaW5wdXQsIGxpLCBvbCwgcCwgc2VsZWN0LCBzcGFuLCB0ZCwgdGV4dGFyZWEsIHRoLCB1bCB7CisgICAgYm9yZGVyLXN0eWxlOiBub25lOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorCithLCBhZGRyZXNzLCBib2R5LCBjYXB0aW9uLCBjaXRlLCBjb2RlLCBkZm4sIGVtLCBzdHJvbmcsIHRoLCB2YXIgeworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKKyAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworYm9keSwgY2FwdGlvbiwgdGggeworICAgIHRleHQtYWxpZ246IGxlZnQ7Cit9CisKK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYgeworICAgIGZvbnQtc2l6ZTogMTAwJTsKK30KKworb2wsIHVsIHsKKyAgICBsaXN0LXN0eWxlOiBub25lOworfQorCisvKiA9PT09PSBCYXNpYyBFbGVtZW50IFN0eWxlcyA9PT09PSAqLworYSwgYTp2aXNpdGVkIHsKKyAgICBjb2xvcjogIzAwMDA5OTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30KKworYTpob3ZlciwgYTphY3RpdmUgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLmRpc2FibGVkIHsKKyAgICBjb2xvcjogIzMzMzM2NjsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2JvZHksIHRleHRhcmVhLCBpbnB1dCwgc2VsZWN0IHsKKyAgICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKK30KKworYm9keSB7CisgICAgYmFja2dyb3VuZDogI0I4REZGQzsKKyAgICBmb250LXNpemU6IDYyLjUlOworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworaHIgeworICAgIGJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7CisgICAgYm9yZGVyOiAwOworICAgIGhlaWdodDogMC4xZW07CisgICAgbWFyZ2luOiAwLjVlbSAwIDAuNWVtIDA7Cit9CisKK2lucHV0W3R5cGU9InJhZGlvIl0sIGlucHV0W3R5cGU9ImNoZWNrYm94Il0geworICAgIGZvbnQtc2l6ZTogMS4xZW07CisgICAgbWFyZ2luOiAwLjJlbTsKK30KKworaW5wdXRbdHlwZT0idGV4dCJdLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICAgIGJvcmRlcjogIzk5OTk5OSBzb2xpZCAwLjFlbTsKKyAgICBmb250LXNpemU6IDEuMWVtOworICAgIG1hcmdpbjogMC4yZW07CisgICAgcGFkZGluZzogMC4xZW0gMCAwLjFlbSAwOworfQorCitpbnB1dFt0eXBlPSJzdWJtaXQiXSwgaW5wdXRbdHlwZT0iYnV0dG9uIl0sIGlucHV0W3R5cGU9InJlc2V0Il0geworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CisgICAgYm9yZGVyOiAjOTk5OTk5IHNvbGlkIDAuMWVtOworICAgIGNvbG9yOiAjMDAwMDk5OworICAgIGZvbnQtc2l6ZTogMWVtOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitpbnB1dFt0eXBlPSJzdWJtaXQiXTpob3ZlciB7CisgICAgY29sb3I6ICNmZjAwMDA7CisgICAgY3Vyc29yOiBwb2ludGVyOworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCitpbnB1dFt0eXBlPSJmaWxlIl0geworICAgIGZvbnQtc2l6ZTogMS4xZW07CisgICAgaGVpZ2h0OiAxLjZlbTsgLyogZm9yY2UgY3RybCB0byBzY2FsZSB3aXRoIHRleHQgKi8KK30KKworc2VsZWN0IHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICAgIGJvcmRlcjogIzk5OTk5OSBzb2xpZCAwLjFlbTsKKyAgICBmb250LXNpemU6IDEuMWVtOworICAgIGhlaWdodDogMS42ZW07IC8qIGZvcmNlIGN0cmwgdG8gc2NhbGUgd2l0aCB0ZXh0ICovCisgICAgbWFyZ2luOiAwLjFlbTsKK30KKworc2VsZWN0W211bHRpcGxlPSJtdWx0aXBsZSJdIHsKKyAgICBoZWlnaHQ6IDVlbTsKK30KKworaDEsIC5oMSB7CisgICAgZm9udC1zaXplOiAxLjZlbTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30KKworaDIsIC5oMiB7CisgICAgZm9udC1zaXplOiAxLjNlbTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30KKworaDMsIC5oMyB7CisgICAgZm9udC1zaXplOiAxLjFlbTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30KKworLyogSUU3IGZpeCAqLwordGFibGUgeworICAgIGZvbnQtc2l6ZTogMWVtOworfQorCisvKiBJRTcgZml4ICovCit0YWJsZSBpbnB1dCB7CisgICAgYm9yZGVyOiAjOTk5OTk5IHNvbGlkIDAuMWVtOworfQorCit0ZXh0YXJlYSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgICBib3JkZXI6ICM5OTk5OTkgc29saWQgMC4xZW07CisgICAgZm9udC1zaXplOiAxLjFlbTsKK30KKwordGgsIHRoIGEgeworICAgIGNvbG9yOiAjMDAwMDAwOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisvKiA9PT09PSBMZWdhY3kgU3R5bGVzID09PT09ICovCisvKiBUaGUgInNtYWxsU3VibWl0IiBjbGFzcyBjYW4gYmUgdXNlZCB0byBkZWNvcmF0ZQorbGlua3MgKEEgZWxlbWVudHMpIGFuZCBtYWtlIHRoZW0gc2ltaWxhciB0byBmb3JtJ3MgYnV0dG9ucy4gKi8KKy5zbWFsbFN1Ym1pdCwgLnNtYWxsU3VibWl0OnZpc2l0ZWQgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CisgICAgYm9yZGVyOiAjOTk5OTk5IHNvbGlkIDAuMWVtOworICAgIGNvbG9yOiAjMDAwMDk5OworICAgIGZvbnQtc2l6ZTogMWVtOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIG1hcmdpbjogMC4yZW07CisgICAgcGFkZGluZzogMC4xZW0gMC4yZW0gMC4xZW0gMC4yZW07Cit9CisKKy5zbWFsbFN1Ym1pdDpob3ZlciB7CisgICAgY29sb3I6ICNmZjAwMDA7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisuc21hbGxTdWJtaXQ6YWN0aXZlIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOworICAgIGNvbG9yOiAjMzMzMzY2OworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLmluZm8geworICAgIGNvbG9yOiAjMDAwMDAwOworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKK30KKworLmJveGhlYWQgeworICAgIGNvbG9yOiAjRkZGRkZGOworICAgIGZvbnQtc2l6ZTogMS4xZW07CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5ib3hsaW5rIHsKKyAgICBmbG9hdDogcmlnaHQ7Cit9CisKK0RJVi5ib3h0b3AgeworICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwOTk7CisgICAgYm9yZGVyLWNvbG9yOiAjOTk5OTk5OworICAgIGJvcmRlci1zdHlsZTogc29saWQ7CisgICAgbWFyZ2luOiAwIGF1dG8gMCBhdXRvOworICAgIHBhZGRpbmc6IDAuMWVtIDAuNGVtIDAuMWVtIDAuNGVtOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworRElWLmJveGhlYWQtbGVmdCB7CisgICAgYm9yZGVyOiBub25lOworICAgIGNvbG9yOiAjRkZGRkZGOworICAgIGZsb2F0OiBsZWZ0OworICAgIGZvbnQtc2l6ZTogMS4xZW07CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgd2lkdGg6IGF1dG87Cit9CisKK0RJVi5ib3hoZWFkLWZpbGwgeworICAgIGJvcmRlcjogbm9uZTsKKyAgICBjb2xvcjogI0ZGRkZGRjsKKyAgICBmb250LXNpemU6IDEuMWVtOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICB3aWR0aDogMDsKK30KKworRElWLmJveGhlYWQtcmlnaHQgeworICAgIGJvcmRlcjogbm9uZTsKKyAgICBjb2xvcjogI0ZGRkZGRjsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgZm9udC1zaXplOiAxLjFlbTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICB3aWR0aDogYXV0bzsKK30KKworQS5ib3hoZWFkYnV0dG9uIHsKKyAgICBjb2xvcjogI0ZGRkZGRjsKKyAgICBmb250LXNpemU6IDEuMWVtOworfQorCitBLmJveGhlYWRidXR0b246aG92ZXIgeworICAgIGNvbG9yOiAjZmYwMDAwOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLmJveG91dHNpZGUgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7CisgICAgYm9yZGVyOiAwLjFlbSBzb2xpZCAjOTk5OTk5OworfQorCisuYm94dG9wIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDk5OworICAgIGJvcmRlcjogMCBzb2xpZCAjOTk5OTk5OworICAgIHBhZGRpbmc6IDAuMWVtIDAuNGVtIDAuMWVtIDAuNGVtOworfQorCisuYm94Ym90dG9tIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOworICAgIGJvcmRlcjogMCBzb2xpZCAjOTk5OTk5OworICAgIHBhZGRpbmc6IDAuNGVtOworfQorCisuYnV0dG9uIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkOworICAgIGJvcmRlcjogMC4yZW0gb3V0c2V0ICM5OTk5Q0M7CisgICAgcGFkZGluZy1yaWdodDogMC41ZW07CisgICAgcGFkZGluZy1sZWZ0OiAwLjVlbTsKK30KKworLmJyb3dzZWNhdGVnb3J5bGlzdCB7CisgICAgbWFyZ2luLWxlZnQ6IDEwcHg7Cit9CisKKy5icm93c2VjYXRlZ29yeXRleHQgeworICAgIGNvbG9yOiAjMDAwMDk5OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHBhZGRpbmctbGVmdDogMTBweDsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9iZ19idWxsZXRfZnVsbF8yLmdpZikgbm8tcmVwZWF0IDBweCAwLjVlbTsKK30KKworQS5icm93c2VjYXRlZ29yeWJ1dHRvbiB7CisgICAgY29sb3I6ICMwMDAwOTk7Cit9CisKKy5icm93c2VjYXRlZ29yeWJ1dHRvbmRpc2FibGVkIHsKKyAgICBjb2xvcjogIzMzMzMzMzsKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30KKworQS5idXR0b250ZXh0LCAuYnV0dG9udGV4dGRpc2FibGVkLCAuYnV0dG9uLWJhciBsaS5idXR0b250ZXh0IGEgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CisgICAgYm9yZGVyOiAjOTk5OTk5IHNvbGlkIDAuMWVtOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIGxpbmUtaGVpZ2h0OiAxLjhlbTsKKyAgICBtYXJnaW46IDAuMmVtOworICAgIHBhZGRpbmc6IDAuMWVtIDAuNGVtIDAuMWVtIDAuNGVtOworICAgIC8qd2hpdGUtc3BhY2U6IG5vd3JhcDsqLworfQorCitBLmJ1dHRvbnRleHQsIC5idXR0b24tYmFyIGxpLmJ1dHRvbnRleHQgYSB7CisgICAgY29sb3I6ICMwMDAwOTk7Cit9CisKK0EuYnV0dG9udGV4dDpob3ZlciwgLmJ1dHRvbi1iYXIgbGkuYnV0dG9udGV4dCBhOmhvdmVyIHsKKyAgICBjb2xvcjogI2ZmMDAwMDsKK30KKworQS5saW5rdGV4dCB7CisgICAgY29sb3I6ICMwMDAwOTk7Cit9CisKK0EubGlua3RleHQ6aG92ZXIgeworICAgIGNvbG9yOiAjZmYwMDAwOworfQorCisuYnV0dG9udGV4dGRpc2FibGVkIHsKKyAgICBjb2xvcjogIzMzMzMzMzsKK30KKworQS5oZWFkZXJidXR0b250ZXh0IHsKKyAgICBjb2xvcjogIzAwMDA5OTsKK30KKworQS5oZWFkZXJidXR0b250ZXh0OmhvdmVyIHsKKyAgICBjb2xvcjogIzAwMDAwMDsKK30KKworLnN1Ym1lbnV0ZXh0aW5mbyB7CisgICAgYm9yZGVyLXJpZ2h0OiAwLjFlbSBzb2xpZCAjNTg4NkM2OworICAgIGNvbG9yOiAjZmZmZmZmOworICAgIGZvbnQtc2l6ZTogMC45ZW07CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgcGFkZGluZy1sZWZ0OiAwLjVlbTsKKyAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsKK30KKworLnN1Ym1lbnV0ZXh0LCBBLnN1Ym1lbnV0ZXh0LCBBLnN1Ym1lbnV0ZXh0OnZpc2l0ZWQgeworICAgIGJvcmRlci1yaWdodDogMC4xZW0gc29saWQgIzU4ODZDNjsKKyAgICBjb2xvcjogI2ZmZmYwMDsKKyAgICBmb250LXNpemU6IDAuOWVtOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHBhZGRpbmctbGVmdDogMC4yZW07CisgICAgcGFkZGluZy1yaWdodDogMC41ZW07Cit9CisKK0Euc3VibWVudXRleHQ6aG92ZXIgeworICAgIGNvbG9yOiAjZmZmZjAwOworfQorCisuc3VibWVudXRleHRkaXNhYmxlZCwgQS5zdWJtZW51dGV4dGRpc2FibGVkIHsKKyAgICBib3JkZXItcmlnaHQ6IDAuMWVtIHNvbGlkICM1ODg2QzY7CisgICAgY29sb3I6ICNDQ0NDQ0M7CisgICAgZm9udC1zaXplOiAwLjllbTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBwYWRkaW5nLWxlZnQ6IDAuMmVtOworICAgIHBhZGRpbmctcmlnaHQ6IDAuNWVtOworfQorCitBLnN1Ym1lbnV0ZXh0ZGlzYWJsZWQ6aG92ZXIgeworICAgIGNvbG9yOiAjZmZmZjAwOworfQorCisuc3VibWVudXRleHRpbmZvcmlnaHQgeworICAgIGNvbG9yOiAjZmZmZmZmOworICAgIGZvbnQtc2l6ZTogMC45ZW07CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgcGFkZGluZy1sZWZ0OiAwLjJlbTsKK30KKworLnN1Ym1lbnV0ZXh0cmlnaHQsIEEuc3VibWVudXRleHRyaWdodCB7CisgICAgY29sb3I6ICNmZmZmMDA7CisgICAgZm9udC1zaXplOiAwLjllbTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBwYWRkaW5nLWxlZnQ6IDAuMmVtOworfQorCitBLnN1Ym1lbnV0ZXh0cmlnaHQ6aG92ZXIgeworICAgIGNvbG9yOiAjZmZmZjAwOworfQorCisuc3VibWVudXRleHRyaWdodGRpc2FibGVkLCBBLnN1Ym1lbnV0ZXh0cmlnaHRkaXNhYmxlZCB7CisgICAgY29sb3I6ICNDQ0NDQ0M7CisgICAgZm9udC1zaXplOiAwLjllbTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBwYWRkaW5nLWxlZnQ6IDAuMmVtOworfQorCitBLnN1Ym1lbnV0ZXh0cmlnaHRkaXNhYmxlZDpob3ZlciB7CisgICAgY29sb3I6ICNmZmZmMDA7Cit9CisKK0EubGlnaHRidXR0b250ZXh0IHsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgY29sb3I6ICNmZmZmMDA7Cit9CisKK0EubGlnaHRidXR0b250ZXh0OmhvdmVyIHsKKyAgICBjb2xvcjogI2ZmZmYwMDsKK30KKworQS5saWdodGJ1dHRvbnRleHRzbWFsbCB7CisgICAgYm9yZGVyOiBub25lOworICAgIGNvbG9yOiAjZmZmZjAwOworICAgIGZvbnQtc2l6ZTogMC44ZW07Cit9CisKK0EubGlnaHRidXR0b250ZXh0c21hbGw6aG92ZXIgeworICAgIGNvbG9yOiAjZmZmZjAwOworfQorCisubGlnaHRidXR0b250ZXh0ZGlzYWJsZWQgeworICAgIGNvbG9yOiAjQ0NDQ0NDOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitBLmJ1dHRvbnRleHRiaWcsIC5idXR0b250ZXh0YmlnZGlzYWJsZWQgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CisgICAgYm9yZGVyOiAjOTk5OTk5IHNvbGlkIDAuMWVtOworICAgIGZvbnQtc2l6ZTogMS41ZW07CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwLjJlbTsKKyAgICBwYWRkaW5nOiAwLjFlbSAwLjRlbSAwLjFlbSAwLjRlbTsKK30KKworQS5idXR0b250ZXh0YmlnIHsKKyAgICBjb2xvcjogIzAwMDA5OTsKK30KKworLmJ1dHRvbnRleHRiaWdkaXNhYmxlZCB7CisgICAgY29sb3I6ICNDQ0NDQ0M7Cit9CisKK0EuYnV0dG9udGV4dGJpZzpob3ZlciB7CisgICAgY29sb3I6ICNmZjAwMDA7Cit9CisKK0EgSU1HLmltYWdlYm9yZGVyIHsKKyAgICBib3JkZXI6IDAuMWVtIHNvbGlkICM5OTk5OTk7Cit9CisKKyNtZXNzYWdlcy1jb250YWluZXIgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOworICAgIG1hcmdpbjogMCA3cHggMCA3cHg7CisgICAgcGFkZGluZy1ib3R0b206IDFlbTsKK30KKworLyogPT09PT0gU3lzdGVtIG1lc3NhZ2VzIHJlbmRlcmluZyA9PT09PSAqLworLmV2ZW50TWVzc2FnZSwKKy5lcnJvck1lc3NhZ2UgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNCOERGRkM7CisgICAgZm9udC1zaXplOiAxLjNlbTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDAgMWVtIDAgMWVtOworICAgIHBhZGRpbmc6IDAgMWVtIDAgNTBweDsKK30KKworLmV2ZW50TWVzc2FnZSB7CisgICAgYmFja2dyb3VuZDogI0ZGRkZGRiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvaW5mb3JtYXRpb24ucG5nKSBuby1yZXBlYXQgMTBweCA1MCU7CisgICAgY29sb3I6ICMwMDAwOTk7CisgICAgYm9yZGVyOiBzb2xpZCAzcHggIzAwMDA5OTsKK30KKworLmVycm9yTWVzc2FnZSB7CisgICAgYmFja2dyb3VuZDogI0ZGRkZGRiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvZXhjbGFtYXRpb24ucG5nKSBuby1yZXBlYXQgMTBweCA1MCU7CisgICAgY29sb3I6ICNGRjAwMDA7CisgICAgYm9yZGVyOiBzb2xpZCAzcHggI0ZGMDAwMDsKK30KKworLm1lZGl1bVN1Ym1pdCwgLmxhcmdlU3VibWl0LCAubG9naW5CdXR0b24geworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CisgICAgYm9yZGVyOiAjOTk5OTk5IHNvbGlkIDAuMWVtOworICAgIGNvbG9yOiAjMDAwMDk5OworICAgIGZvbnQtc2l6ZTogMS40ZW07CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwLjJlbTsKK30KKworLm1lZGl1bVN1Ym1pdDpob3ZlciwgLmxhcmdlU3VibWl0OmhvdmVyLCAubG9naW5CdXR0b246aG92ZXIgeworICAgIGNvbG9yOiAjZmYwMDAwOworfQorCisuc21hbGxBbHRTdWJtaXQsIC5tZWRpdW1BbHRTdWJtaXQsIC5sYXJnZUFsdFN1Ym1pdCB7CisgICAgZm9udC1zaXplOiAxLjFlbTsKK30KKworLmJhc2VQcmljZSB7CisgICAgY29sb3I6ICMwMDAwMDA7Cit9CisKKy5ub3JtYWxQcmljZSB7CisgICAgY29sb3I6ICMwMDgwMDA7Cit9CisKKy5zYWxlUHJpY2UgeworICAgIGNvbG9yOiAjZmYwMDAwOworfQorCisvKiA9PT09PSBQcm9kdWN0IFN1bW1hcnkgU3R5bGVzID09PT09ICovCisucHJvZHVjdC1wcmV2bmV4dCB7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKy5wcm9kdWN0c3VtbWFyeS1jb250YWluZXIgeworICAgIGJvcmRlci10b3A6ICM5OTkgc29saWQgMC4xZW07CisgICAgbWFyZ2luLXRvcDogMC41ZW07CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07Cit9CisKKy5wcm9kdWN0c3VtbWFyeSB7CisgICAgYm9yZGVyLWJvdHRvbTogIzk5OSBzb2xpZCAwLjFlbTsKKyAgICAvKiB1c2luZyBtaW4taGVpZ2h0IGFzIGFuIGFsdGVybmF0aXZlIHRvIGNsZWFyOiBib3RoOyBiZWNhdXNlIHRoYXQsIGluIHNvbWUgYnJvd3NlcnMsIHdpbGwgY2xlYXIgdGhlIHRvcC1sZXZlbCBjb2x1bW5zIGFuZCBub3QganVzdCBpbiB0aGlzIGRpdiAoTW96aWxsYSBiYXNlZCwgbmFtZWx5KSAqLworICAgIG1pbi1oZWlnaHQ6IDZlbTsKKyAgICBvdmVyZmxvdzogdmlzaWJsZTsKKyAgICBwYWRkaW5nOiAwLjVlbTsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKy5wcm9kdWN0c3VtbWFyeSAuc21hbGxpbWFnZSB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgLyogcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDVweDsgbGVmdDogNXB4OyAqLworICAgIG1hcmdpbjogMCAwLjVlbSAwLjVlbSAwOworfQorCisucHJvZHVjdHN1bW1hcnkgLnNtYWxsaW1hZ2UgaW1nIHsKKyAgICBib3JkZXI6ICNDQ0Mgc29saWQgMC4xZW07CisgICAgaGVpZ2h0OiA1ZW07Cit9CisKKy5wcm9kdWN0c3VtbWFyeSAucHJvZHVjdGJ1eSB7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIG1hcmdpbjogMC41ZW07CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgd2lkdGg6IDEzZW07Cit9CisKKy5wcm9kdWN0c3VtbWFyeSAucHJvZHVjdGluZm8geyAvKiBtYXJnaW4tbGVmdDogNjBweDsgKi8KKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisvKiA9PT09PSBQcm9kdWN0IERldGFpbCBTdHlsZXMgPT09PT0gKi8KKyNwcm9kdWN0ZGV0YWlsICNsb25nLWRlc2NyaXB0aW9uIHsKKyAgICBib3JkZXItdG9wOiAjOTk5IHNvbGlkIDAuMWVtOworICAgIG1hcmdpbi10b3A6IDFlbTsKKyAgICBwYWRkaW5nLXRvcDogMC41ZW07Cit9CisKKyNwcm9kdWN0ZGV0YWlsICNyZXZpZXdzIHsKKyAgICBib3JkZXItdG9wOiAjOTk5IHNvbGlkIDAuMWVtOworICAgIG1hcmdpbi10b3A6IDFlbTsKKyAgICBwYWRkaW5nLXRvcDogMC41ZW07Cit9CisKKyNwcm9kdWN0ZGV0YWlsICNhc3NvY2lhdGVkLXByb2R1Y3RzIHsKKyAgICBib3JkZXItdG9wOiAjOTk5IHNvbGlkIDAuMWVtOworICAgIG1hcmdpbi10b3A6IDFlbTsKKyAgICBwYWRkaW5nLXRvcDogMC41ZW07Cit9CisKKy50cmVlV3JhcHBlciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgICBib3JkZXItdG9wOiAwLjFlbSBzb2xpZCAjMDAwMDAwOworICAgIGJvcmRlci1sZWZ0OiAwLjFlbSBzb2xpZCAjMDAwMDAwOworICAgIGNvbG9yOiAjMDAwMDAwOworICAgIGZvbnQtc2l6ZTogMS42ZW07CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW4tbGVmdDogMS4yZW07CisgICAgbWFyZ2luLXRvcDogMC4yZW07CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy5sZWZ0aGFsZiB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgaGVpZ2h0OiAxJTsKKyAgICBsZWZ0OiAwOworICAgIG1hcmdpbjogMCUgMSUgMSUgMCU7CisgICAgd2lkdGg6IDQ5JTsKK30KKworLnJpZ2h0aGFsZiB7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIGhlaWdodDogMSU7CisgICAgbWFyZ2luOiAwIDAgMSUgMSU7CisgICAgcmlnaHQ6IDA7CisgICAgd2lkdGg6IDQ5JTsKK30KKworLmxlZnRjbGVhciB7CisgICAgY2xlYXI6IGxlZnQ7CisgICAgaGVpZ2h0OiAxJTsKK30KKworLyogPT09PSBTdHlsZXMgRm9yIEZvcm0gV2lkZ2V0cyA9PT0gKi8KKy5mb3JtVGFibGVCb3JkZXJlZCB7CisgICAgYm9yZGVyOiAwLjFlbSBzb2xpZCAjOTk5OTk5OworICAgIHdpZHRoOiAxMDAlOworfQorCisvKiA9PT09IFN0eWxlcyBGb3IgVGhlIEh0bWwgTG9nID09PSAqLworLkRFQlVHIHsKKyAgICBjb2xvcjogIzgwODA4MDsKK30KKworLldBUk4geworICAgIGNvbG9yOiAjMDAwMGZmOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisuSU5GTyB7CisgICAgY29sb3I6ICMwMDgwMDA7Cit9CisKKy5FUlJPUiB7CisgICAgYm9yZGVyOiAwLjJlbSBzb2xpZCAjZmYwMDAwOworICAgIGNvbG9yOiAjZmYwMDAwOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisvKiA9PT09IFN0eWxlcyBDb3BpZWQgRnJvbSB0YWJzdHlsZXMuY3NzID09PSAqLworLnRyZWV3cmFwcGVyIHsKKyAgICBtYXJnaW4tbGVmdDogMWVtOworfQorCisudHJlZWl0ZW0geworICAgIGJvcmRlcjogIzg4ODg4OCBzb2xpZCAwLjFlbTsKKyAgICBjb2xvcjogIzAwMDBmZjsKKyAgICBmb250LXNpemU6IDEuNGVtOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisuYXBwYmFyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworfQorCisud2hpdGVhcmVhIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOworfQorCisuYmxhY2thcmVhIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOworfQorCisucGFnZS10aXRsZSB7CisgICAgZGlzcGxheTogbm9uZTsKK30KKworRElWLnJvdyB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI0I0QjBBQTsKKyAgICBtYXJnaW46IDAgYXV0byAwIGF1dG87CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCitESVYuY29sIHsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgd2lkdGg6IGF1dG87Cit9CisKK0RJVi5jb2wtZmlsbCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI0I0QjBBQTsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgY29sb3I6ICMwMDAwOTk7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgIHdpZHRoOiAwOworfQorCitESVYuY29sLXJpZ2h0IHsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIHdpZHRoOiBhdXRvOworfQorCitESVYuY29udGVudGFyZWEgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7CisgICAgbWFyZ2luOiAwcHggN3B4IDBweCA3cHg7Cit9CisKK0RJVi5lbmRjb2x1bW5zIHsgLyogZGVwcmVjYXRlZCAtIHVzZSAuY2xlYXIgKi8KKyAgICBjbGVhcjogYm90aDsKK30KKworRElWLnNpbXBsZS1yaWdodC1zbWFsbCB7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIHdpZHRoOiAyZW07CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKK0RJVi5zaW1wbGUtcmlnaHQtaGFsZiB7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIHdpZHRoOiA1MCU7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKK0RJVi5zY3JlZW5sZXQgeworICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9ib3gtaGVhZC10ci5naWYiKSBuby1yZXBlYXQgdG9wIHJpZ2h0OworICAgIGJhY2tncm91bmQtY29sb3I6ICM1Q0EzRDc7CisgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CisgICAgaGVpZ2h0OiAxJTsKKyAgICBtYXJnaW4tYm90dG9tOiAxZW07Cit9CisKKy8qIFNwZWNpYWwgU2NyZWVubGV0IEhhbmRsaW5nIGZvciBsb2NhbHMgYW5kIHRpbWV6b25lIHdpbmRvdyAqLworRElWLmxpc3RzLnNjcmVlbmxldCB7CisgICAgbWFyZ2luLWxlZnQ6IDI1JTsKKyAgICBtYXJnaW4tcmlnaHQ6IDI1JTsKKyAgICBtYXJnaW4tdG9wOiAxZW07Cit9CisKK0RJVi5saXN0cy5zY3JlZW5sZXQgLmJhc2ljLXRhYmxlIHRyIHRkIHsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKK0RJVi5saXN0cy5zY3JlZW5sZXQgLmJhc2ljLXRhYmxlIHRyIHRkIGEgeworICAgIGRpc3BsYXk6IGJsb2NrOworfQorCitESVYuc2NyZWVubGV0LWJvZHkgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7CisgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CisgICAgaGVpZ2h0OiAxJTsKKyAgICBwYWRkaW5nOiAwLjRlbTsKKyAgICBib3JkZXI6IDAuMWVtIHNvbGlkICM1Q0EzRDc7Cit9CisKK0RJVi5uby1wYWRkaW5nIHsKKyAgICBwYWRkaW5nOiAwOworICAgIGJvcmRlcjogbm9uZTsKK30KKworI2NvbHVtbi1jb250YWluZXIgeworICAgIG1hcmdpbjogYXV0bzsKKyAgICBwYWRkaW5nOiAwIDFlbSAxZW0gMWVtOworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworI2NvbHVtbi1jb250YWluZXIgaDEsCisjY29sdW1uLWNvbnRhaW5lciAuaDEsCisjY29sdW1uLWNvbnRhaW5lciBoMiwKKyNjb2x1bW4tY29udGFpbmVyIC5oMiB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIGgxLAorI2NvbHVtbi1jb250YWluZXIgLmgxIHsKKyAgICBjb2xvcjogIzAwMDA5OTsKK30KKworI2NvbHVtbi1jb250YWluZXIgLmxlZnQgeworICAgIGZsb2F0OiBsZWZ0OworICAgIC8qIGFsdDogcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyAqLworICAgIHdpZHRoOiAyMmVtOworICAgIG1hcmdpbi1yaWdodDogMWVtOworfQorCisjY29sdW1uLWNvbnRhaW5lciAubGVmdC1sYXJnZXIgeworICAgIGZsb2F0OiBsZWZ0OworICAgIC8qIGFsdDogcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyAqLworICAgIHdpZHRoOiAyNWVtOworICAgIG1hcmdpbi1yaWdodDogMWVtOworfQorCisubGVmdC1ib3JkZXIgeworICAgIGZsb2F0OiBsZWZ0OworICAgIG1hcmdpbi1yaWdodDogMWVtOworICAgIHdpZHRoOiAyMmVtOworICAgIGJvcmRlci1yaWdodDogMC41cHggZG90dGVkICNjY2M7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKKyAgICBoZWlnaHQ6IDEwMCU7Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5yaWdodCB7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIG1hcmdpbi1sZWZ0OiAxZW07CisgICAgd2lkdGg6IDIyZW07Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5sZWZ0b25seSB7CisgICAgbWFyZ2luLWxlZnQ6IDIzZW07CisgICAgd2lkdGg6IGF1dG87Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5sZWZ0b25seS1sYXJnZXIgeworICAgIG1hcmdpbi1sZWZ0OiAyNmVtOworICAgIHdpZHRoOiBhdXRvOworfQorCisjY29sdW1uLWNvbnRhaW5lciAucmlnaHRvbmx5IHsKKyAgICBtYXJnaW4tcmlnaHQ6IDIzZW07CisgICAgd2lkdGg6IGF1dG87Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5jZW50ZXIgeworICAgIG1hcmdpbi1sZWZ0OiAyM2VtOworICAgIG1hcmdpbi1yaWdodDogMjNlbTsKKyAgICB3aWR0aDogYXV0bzsKK30KKworI2NvbHVtbi1jb250YWluZXIgLm5vY29sdW1ucyB7CisgICAgd2lkdGg6IGF1dG87Cit9CisKK0RJVi5jb2x1bW4tbGVmdC13aWRlIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOworICAgIGJvcmRlcjogIzAwMDAwMCBzb2xpZCAwLjJlbTsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBvdmVyZmxvdzogYXV0bzsKKyAgICB3aWR0aDogMzBlbTsKK30KKworRElWLndpZGdldC1jb250YWluZXIgeworICAgIG1hcmdpbi1ib3R0b206IDJlbTsKK30KKworLyogPT09PT0gTmV3IFN0eWxlcyA9PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09IFVzZWQgdG8gY2xlYXIgZmxvYXRzID09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisuY2xlYXIgeworICAgIGNsZWFyOiBib3RoOworICAgIGhlaWdodDogMDsKKyAgICB2aXNpYmlsaXR5OiBoaWRkZW47Cit9CisKKy5uby1jbGVhciAuY2xlYXIgeworICAgIC8qIFVzZWQgaW4gY29udGFpbmVyIGVsZW1lbnRzIHRvIG92ZXJyaWRlIHRoZSBjbGVhciBjbGFzcworaW4gY29udGFpbmVkIGVsZW1lbnRzLiAqLworICAgIGNsZWFyOiBub25lOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09IFNpbmdsZSBFbGVtZW50IFN0eWxlcyA9PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisuYWxlcnQgeyAvKiBVc2VkIGZvciBhbGVydCB0ZXh0ICovCisgICAgY29sb3I6ICNmZjAwMDA7Cit9CisKKy5jb250ZW50LW1lc3NhZ2VzIHAgeworICAgIG1hcmdpbjogMC41ZW0gMCAwLjVlbSAwOworfQorCisuaGlkZGVuIHsKKyAgICBoZWlnaHQ6IDA7CisgICAgZGlzcGxheTogbm9uZTsKK30KKworLmxhYmVsIHsKKyAgICAvKiBVc2VkIGZvciA8aW5wdXQ+IGVsZW1lbnQgbGFiZWxzICovCisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgaGVpZ2h0OiAxLjJlbTsKKyAgICAvKiBTYW1lIGFzIDxpbnB1dD4gaGVpZ2h0ICovCisgICAgcGFkZGluZy1yaWdodDogMS4xZW07CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICB3aWR0aDogMSU7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKworLnJlcXVpcmVkLCBpbnB1dC5yZXF1aXJlZCB7CisgICAgLyogcmVxdWlyZWQgc3R5bGUgZm9yIDxpbnB1dD4gZWxlbWVudHMgKi8KKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOworfQorCisudG9vbHRpcCB7IC8qIHRvb2x0aXAgc3R5bGUgKi8KKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmJiOworICAgIGJvcmRlcjogMC4xZW0gc29saWQgIzk5OTk5OTsKKyAgICBjb2xvcjogIzAwMDAwMDsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgbWFyZ2luOiAwLjRlbTsKKyAgICBwYWRkaW5nOiAwLjFlbTsKK30KKworLnZpc2libGUgeworICAgIGhlaWdodDogYXV0bzsKKyAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PSBVc2VkIHRvIGFsaWduIGVsZW1lbnRzID09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisuYWxpZ24tZmxvYXQgeworICAgIGZsb2F0OiByaWdodDsKK30KKworLmFsaWduLXRleHQgeworICAgIHRleHQtYWxpZ246IHJpZ2h0OworfQorCisuYWxpZ24tdG9wIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCisuY2VudGVyZWQgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLnBhZ2UtY29udGFpbmVyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQjhERkZDOworfQorCisudGFiYmFyIHsKKyAgICBoZWlnaHQ6IDQwcHg7CisgICAgd2lkdGg6IDEwMCU7CisgICAgYmFja2dyb3VuZDogdXJsKCIvYmx1ZWxpZ2h0L2JhcjIuZ2lmIikgcmVwZWF0LXg7Cit9CisKKy50YWJiYXIgLmJyZWFkY3J1bWJzIHsKKyAgICBjb2xvcjogI0ZGRkZGRjsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBoZWlnaHQ6IDEwMCU7CisgICAgYmFja2dyb3VuZDogdXJsKCIvYmx1ZWxpZ2h0L2Nvcm5lci10bC5naWYiKSBuby1yZXBlYXQ7Cit9CisKKy50YWJiYXIgLmJyZWFkY3J1bWJzLXN0YXJ0IHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBoZWlnaHQ6IDEwMCU7CisgICAgYmFja2dyb3VuZDogdXJsKCIvYmx1ZWxpZ2h0L2JhcjEuZ2lmIikgcmVwZWF0LXg7CisgICAgbWFyZ2luLWxlZnQ6IDE1cHg7CisgICAgcGFkZGluZy10b3A6IDFlbTsKKyAgICBkaXNwbGF5OiBpbmxpbmU7IC8qIElFIEZpeCAqLworfQorCisudGFiYmFyIC5icmVhZGNydW1icy1zZXAgeworICAgIGZsb2F0OiBsZWZ0OworICAgIGhlaWdodDogMTAwJTsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoIi9ibHVlbGlnaHQvc2VwYXJhdG9yLmdpZiIpIG5vLXJlcGVhdDsKKyAgICBwYWRkaW5nLXRvcDogMC44ZW07CisgICAgbWFyZ2luLWJvdHRvbTogLTFlbTsKKyAgICBwYWRkaW5nLWxlZnQ6IDMuNWVtOworICAgIGZvbnQtc2l6ZTogMS41ZW07CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy50YWJiYXIgLmJyZWFkY3J1bWJzLWVuZCB7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIGhlaWdodDogMTAwJTsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoIi9ibHVlbGlnaHQvY29ybmVyLXRyLmdpZiIpIG5vLXJlcGVhdDsKKyAgICB3aWR0aDogMTVweDsKK30KKworLmJvdHRvbS1iYXIgeworICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9iYXIzLmdpZiIpIHJlcGVhdC14OworICAgIGhlaWdodDogMTVweDsKKyAgICB3aWR0aDogMTAwJTsKK30KKworLmJvdHRvbS1iYXIgLmxlZnQgeworICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9jb3JuZXItYmwuZ2lmIikgdG9wIGxlZnQgbm8tcmVwZWF0OworfQorCisuYm90dG9tLWJhciAucmlnaHQgeworICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9jb3JuZXItYnIuZ2lmIikgdG9wIHJpZ2h0IG5vLXJlcGVhdDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PSBNYXN0aGVhZCAoSGVhZGVyKSBTdHlsZXMgPT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI21hc3RoZWFkIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOworICAgIGNvbG9yOiAjMDAwMDAwOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIGhlaWdodDogMSU7IC8qIElFIGZpeCAqLworfQorCisjbWFzdGhlYWQgdWwgbGkgeworICAgIGZsb2F0OiBsZWZ0OworICAgIHBhZGRpbmc6IDAuNGVtOworfQorCisjbWFzdGhlYWQgdWwgLmxvZ28tYXJlYSB7CisgICAgLyogcGxhY2Vob2xkZXIgKi8KK30KKworI21hc3RoZWFkIHVsIC5vcHBvc2VkLAorI21hc3RoZWFkIHVsIC5jb250cm9sLWFyZWEgeworICAgIGZsb2F0OiByaWdodDsKKyAgICB0ZXh0LWFsaWduOiByaWdodDsKK30KKwordWwjcHJlZmVyZW5jZXMtbWVudSB7CisgICAgZm9udC1zaXplOiAxLjFlbTsKKyAgICBmbG9hdDogcmlnaHQ7Cit9CisKK3VsI3ByZWZlcmVuY2VzLW1lbnUgbGkgeworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggI0JCQkJCQjsKKyAgICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsKK30KKwordWwjcHJlZmVyZW5jZXMtbWVudSBsaS5maXJzdCwKK3VsI3ByZWZlcmVuY2VzLW1lbnUgbGkudXNlciwKK3VsI3ByZWZlcmVuY2VzLW1lbnUgbGkub3JnIHsKKyAgICBib3JkZXI6IG5vbmU7Cit9CisKK3VsI3ByZWZlcmVuY2VzLW1lbnUgbGkudXNlciwKK3VsI3ByZWZlcmVuY2VzLW1lbnUgbGkub3JnIHsKKyAgICBwYWRkaW5nOiAwOworICAgIGNvbG9yOiAjNzc3Nzc3OworfQorCit1bCNwcmVmZXJlbmNlcy1tZW51IGxpLnVzZXIgYSwKK3VsI3ByZWZlcmVuY2VzLW1lbnUgbGkub3JnIGEgeworICAgIGNvbG9yOiAjNzc3Nzc3OworfQorCit1bCNwcmVmZXJlbmNlcy1tZW51IGxpLnVzZXIgYTpob3ZlciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzc3Nzc3NzsKKyAgICBjb2xvcjogI0ZGRkZGRjsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK3VsI3ByZWZlcmVuY2VzLW1lbnUgbGkuZXhwYW5kZWQsCit1bCNwcmVmZXJlbmNlcy1tZW51IGxpLmNvbGxhcHNlZCB7CisgICAgcGFkZGluZzogMCAwIDAgNXB4OworICAgIHdpZHRoOiAzMnB4OworfQorCit1bCNwcmVmZXJlbmNlcy1tZW51IGxpLmV4cGFuZGVkIHsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvYnVsbGV0X2Fycm93X3VwLnBuZykgbm8tcmVwZWF0IHJpZ2h0OworfQorCit1bCNwcmVmZXJlbmNlcy1tZW51IGxpLmNvbGxhcHNlZCB7CisgICAgYmFja2dyb3VuZDogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL2J1bGxldF9hcnJvd19kb3duLnBuZykgbm8tcmVwZWF0IHJpZ2h0OworfQorCit1bCNwcmVmZXJlbmNlcy1tZW51IGxpLmNvbGxhcHNlZCBhLAordWwjcHJlZmVyZW5jZXMtbWVudSBsaS5leHBhbmRlZCBhIHsKKyAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7Cit9CisKK3VsI3ByZWZlcmVuY2VzLW1lbnUgbGkgYSB7CisgICAgY29sb3I6ICM1Q0EzRDc7CisgICAgcGFkZGluZzogMC4yZW07Cit9CisKK3VsI3ByZWZlcmVuY2VzLW1lbnUgYTpob3ZlciB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisuY29udHJvbC1hcmVhIGEgeworICAgIGZvbnQtc2l6ZTogMS4xZW07CisgICAgY29sb3I6ICM1Q0EzRDc7Cit9CisKK3VsI3ByZWZlcmVuY2VzLW1lbnUgbGkgYS5oZWxwLWxpbmsgeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIGhlaWdodDogMTJweDsKKyAgICB3aWR0aDogMTBweDsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9oZWxwLnBuZykgbm8tcmVwZWF0OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT0gRm9vdGVyIFN0eWxlcyA9PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZm9vdGVyIHsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgcGFkZGluZy1ib3R0b206IDFlbTsKK30KKworI2Zvb3RlciBwIHsKKyAgICBtYXJnaW46IDFlbTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT0gU2Vjb25kYXJ5IE5hdmlnYXRpb24gKEFwcCBNZW51KSBTdHlsZXMgPT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI3NlY29uZGFyeS1uYXZpZ2F0aW9uIHsKKworfQorCisjc2Vjb25kYXJ5LW5hdmlnYXRpb24gYSB7CisgICAgcGFkZGluZzogMCAxZW0gMCAxZW07CisgICAgYm9yZGVyOiAwLjA1ZW0gc29saWQgIzAwMDA5OTsKKyAgICBjb2xvcjogI2ZmZmY2NjsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoL2ltYWdlcy9ncmFkaWVudF9zdWJfdW5zLmdpZik7CisgICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OworfQorCisjc2Vjb25kYXJ5LW5hdmlnYXRpb24gLmRpc2FibGVkIHsKKyAgICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsKKyAgICBib3JkZXI6IDAuMDVlbSBzb2xpZCAjMDAwMDk5OworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvaW1hZ2VzL2dyYWRpZW50X3N1Yl91bnMuZ2lmKTsKKyAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7CisgICAgY29sb3I6ICNENEQwQzg7Cit9CisKKyNzZWNvbmRhcnktbmF2aWdhdGlvbiBhLnNlbGVjdGVkLCAjc2Vjb25kYXJ5LW5hdmlnYXRpb24gYTpob3ZlciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzI2MjZjMTsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoL2ltYWdlcy9ncmFkaWVudF9zdWJfc2VsLmdpZik7CisgICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OworICAgIGJvcmRlci1ib3R0b206IDAuMDVlbSBzb2xpZCAjMjYyNmMxOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBjb2xvcjogI2ZmZmZmZjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09IE1haW4gTmF2aWdhdGlvbiAoQXBwIE1lbnUpIFN0eWxlcyA9PT09PT09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PSBDb21wb25lbnQgTmF2aWdhdGlvbiAoQXBwIEhlYWRlcikgU3R5bGVzID09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI21haW4tbmF2aWdhdGlvbiwgI2FwcC1uYXZpZ2F0aW9uIHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBmb250LXNpemU6IDEzMCU7Cit9CisKKyNhcHAtbmF2aWdhdGlvbiAuY2xlYXIgeworICAgIGNsZWFyOiBub25lOworfQorCisjbWFpbi1uYXZpZ2F0aW9uIGgyLAorI2FwcC1uYXZpZ2F0aW9uIGgyIHsKKyAgICBjb2xvcjogI0ZGRkZGRjsKKyAgICBjdXJzb3I6IGRlZmF1bHQ7CisgICAgZm9udC1zaXplOiAxLjJlbTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgcGFkZGluZy1yaWdodDogMjBweDsKKyAgICBwYWRkaW5nLWJvdHRvbTogN3B4OworICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9hcnJvdy13aGl0ZS1ydC5naWYiKSBuby1yZXBlYXQgMTAwJSAwJTsKK30KKworI21haW4tbmF2aWdhdGlvbiB1bCBsaSB1bCwKKyNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGJhY2tncm91bmQtY29sb3I6ICNBQUQ2RjY7CisgICAgei1pbmRleDogOTk5OTsKKyAgICB3aWR0aDogMjAwcHg7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgM3B4ICNhYWE7CisgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAzcHggI2FhYTsKKyAgICBib3JkZXItbGVmdDogc29saWQgMXB4ICNhYWE7Cit9CisKKyNtYWluLW5hdmlnYXRpb24gdWwgbGkgdWwgbGkgYSwKKyNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaSBhIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBwYWRkaW5nOiA0cHggMTZweCA0cHggMTZweDsKKyAgICBib3JkZXItdG9wOiBub25lOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIGNvbG9yOiAjNDQ0OworfQorCisvKkNvbG9yIHN1YmNlbGxzIG5vcm1hbCBtb2RlKi8KKworI21haW4tbmF2aWdhdGlvbiB1bCBsaSB1bCBsaSBhOmhvdmVyLAorI2FwcC1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpIGE6aG92ZXIgeworICAgIGJhY2tncm91bmQ6ICNFQUVBRUE7CisgICAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgI0Y1RjVGNSwgI0FBRDZGNik7CisgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9CisKKy8qQ29sb3Igc3ViY2VsbHMgaG92ZXJpbmcgbW9kZSovCisKKyNtYWluLW5hdmlnYXRpb24gdWwgbGkgdWwgbGkgYS5kaXNhYmxlZCwKKyNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaSBhLmRpc2FibGVkIHsKKyAgICBjb2xvcjogIzk5OTk5OTsKK30KKworLypDb2xvciBzdWJjZWxscyBkaXNhYmxlZCBtb2RlKi8KKworI21haW4tbmF2aWdhdGlvbiB1bCBsaSB1bCBsaSB1bC5zZWNvbmRhcnkgeworICAgIGxlZnQ6IDIwNHB4OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PSBTY3JlZW5sZXQgVGl0bGUgQmFyL05hdmlnYXRpb24gU3R5bGVzID09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoIi9ibHVlbGlnaHQvYm94LWhlYWQtdGwuZ2lmIikgbm8tcmVwZWF0OworICAgIGNvbG9yOiAjZmZmZmZmOworICAgIGhlaWdodDogMSU7IC8qIElFIGZpeCAqLworICAgIG1pbi1oZWlnaHQ6IDEuNWVtOworfQorCisuc2NyZWVubGV0LXRpdGxlLWJhciAuaDEsCisuc2NyZWVubGV0LXRpdGxlLWJhciAuaDIsCisuc2NyZWVubGV0LXRpdGxlLWJhciAuaDMsCisuc2NyZWVubGV0LXRpdGxlLWJhciBoMSwKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIGgyLAorLnNjcmVlbmxldC10aXRsZS1iYXIgaDMgeworICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgY29sb3I6ICNmZmZmZmY7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgcGFkZGluZzogMC4xZW0gMC41ZW0gMC4yZW0gMC41ZW07Cit9CisKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIHsKKyAgICBkaXNwbGF5OiBpbmxpbmU7IC8qIElFIEZpeCAqLworfQorCisuc2NyZWVubGV0LXRpdGxlLWJhciB1bCBsaSB7CisgICAgYmFja2dyb3VuZDogbm9uZTsKKyAgICBib3JkZXItbGVmdDogMC4xZW0gc29saWQgIzVmOWZjZjsKKyAgICBjb2xvcjogI2ZmZmZmZjsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgZm9udC1zaXplOiAxZW07CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgcGFkZGluZzogMC4xZW0gMC41ZW0gMC4yZW0gMC41ZW07Cit9CisKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIGgxLAorLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgaDIsCisuc2NyZWVubGV0LXRpdGxlLWJhciB1bCBoMywKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIC5oMSwKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIC5oMiwKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIC5oMyB7CisgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CisgICAgZmxvYXQ6IGxlZnQ7Cit9CisKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIC5oMSB7CisgICAgZm9udC1zaXplOiAxLjZlbTsKK30KKworLnNjcmVlbmxldC10aXRsZS1iYXIgLmgyIHsKKyAgICBmb250LXNpemU6IDEuM2VtOworfQorCisuc2NyZWVubGV0LXRpdGxlLWJhciAuaDMsIC5zY3JlZW5sZXQtdGl0bGUtYmFyIC5oZWFkNCB7CisgICAgZm9udC1zaXplOiAxLjFlbTsKK30KKworLnNjcmVlbmxldC10aXRsZS1iYXIgLmgzIGEgeworICAgIGNvbG9yOiAjZmZmZjY2OworICAgIGRpc3BsYXk6IGlubGluZTsKK30KKworLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgYSB7CisgICAgY29sb3I6ICNmZmZmNjY7CisgICAgZGlzcGxheTogYmxvY2s7Cit9CisKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIGE6dmlzaXRlZCB7CisgICAgY29sb3I6ICNmZmZmNjY7Cit9CisKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIGE6aG92ZXIgeworICAgIGNvbG9yOiAjRkY2OworICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCisuc2NyZWVubGV0LXRpdGxlLWJhciB1bCAuZGlzYWJsZWQgeworICAgIGNvbG9yOiAjQ0NDQ0NDOworfQorCisuc2NyZWVubGV0LXRpdGxlLWJhciB1bCBsaS5jb2xsYXBzZWQgYSwKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIGxpLmNvbGxhcHNlZCBhOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvYnVsbGV0X2Fycm93X2Rvd24ucG5nKSBuby1yZXBlYXQgY2VudGVyOworICAgIHdpZHRoOiAzMnB4OworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgbGkuZXhwYW5kZWQgYSwKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIGxpLmV4cGFuZGVkIGE6aG92ZXIgeworICAgIGJhY2tncm91bmQ6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy9idWxsZXRfYXJyb3dfdXAucG5nKSBuby1yZXBlYXQgY2VudGVyOworICAgIHdpZHRoOiAzMnB4OworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgLmNvbGxhcHNlZCBhLAorLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgLmV4cGFuZGVkIGEgeworICAgIC8qIElFIGZpeCAqLworICAgIGN1cnNvcjogZGVmYXVsdDsKK30KKworLyogbG9naW4gc2NyZWVubGV0IGRlY29yYXRvciAqLworLmxvZ2luLXNjcmVlbmxldCB7CisgICAgbWluLXdpZHRoOiAyNWVtOworICAgIHdpZHRoOiAyNSU7Cit9CisKKy5sb2dpbi1zY3JlZW5sZXQgLnNjcmVlbmxldC10aXRsZS1iYXIgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCithamF4IGF1dG8gY29tcGxldGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZGl2LmF1dG9jb21wbGV0ZSB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CisgICAgLyogbWluLXdpZHRoOjE1NHB4OyAqLworICAgIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7CisgICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKK30KKworZGl2LmF1dG9jb21wbGV0ZSB1bCB7CisgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorCitkaXYuYXV0b2NvbXBsZXRlIHVsIGxpLnNlbGVjdGVkIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZiOworfQorCitkaXYuYXV0b2NvbXBsZXRlIHVsIGxpIHsKKyAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgZmxvYXQ6IG5vbmU7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDJweDsKKyAgICAvKmhlaWdodDozMnB4OyovCisgICAgY3Vyc29yOiBwb2ludGVyOworfQorCisuaW5kaWNhdG9yIGltZyB7CisgICAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYWpheC1sb2FkZXIuZ2lmKSBuby1yZXBlYXQgMCAwOworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIG1hcmdpbjogM3B4IDEwcHggMHB4IDI0cHg7CisgICAgd2lkdGg6IDE2cHg7CisgICAgaGVpZ2h0OiAxNnB4OworICAgIGJvcmRlcjogbm9uZTsKK30KKworLnNjcmVlbmxldC10aXRsZS1iYXIgLmluZGljYXRvciBpbWcgeworICAgIGZsb2F0OiByaWdodDsKKyAgICBtYXJnaW46IDAgM3B4OworICAgIHdpZHRoOiAxNnB4OworICAgIGhlaWdodDogMTZweDsKKyAgICBkaXNwbGF5OiBpbmxpbmU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09IEJhc2ljIE5hdmlnYXRpb24gKFZlcnRpY2FsIE1lbnUpIFN0eWxlID09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy5iYXNpYy1uYXYgeyAvKiBpbmRlbnQgbWVudSAtIGhlbHBmdWwgZm9yIHdpZGdldHMgKi8KKyAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKK30KKworLmJhc2ljLW5hdiB1bCB7IC8qIHBsYWNlaG9sZGVyICovCisKK30KKworLmJhc2ljLW5hdiB1bCBsaSB7CisKK30KKworLmJhc2ljLW5hdiB1bCBhIHsKKyAgICBjb2xvcjogIzAwMDA5OTsKKyAgICBmb250LXNpemU6IDEuMWVtOworfQorCisuYmFzaWMtbmF2IHVsIC5zZWxlY3RlZCwgLmJhc2ljLW5hdiB1bCAuc2VsZWN0ZWQgYSB7CisgICAgY29sb3I6ICMwMDAwZmY7Cit9CisKKy5iYXNpYy1uYXYgdWwgYTpob3ZlciB7CisgICAgY29sb3I6ICMwMDAwZmY7Cit9CisKKy5iYXNpYy1uYXYgdWwgLmRpc2FibGVkLCAuYmFzaWMtbmF2IHVsIC5kaXNhYmxlZCBhIHsKKyAgICBjb2xvcjogI0Q0RDBDODsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT0gQnV0dG9uIEJhciBOYXZpZ2F0aW9uIFN0eWxlcyA9PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLmJ1dHRvbi1iYXIgeworICAgIG1hcmdpbjogMCAxZW0gMWVtIDA7Cit9CisKKy5idXR0b24tYmFyIHVsIHsKKyAgICBkaXNwbGF5OiBpbmxpbmU7IC8qIElFIEZpeCAqLworfQorCisuYnV0dG9uLWJhciB1bCBsaSB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgcGFkZGluZzogMC4xZW0gMC40ZW0gMC4xZW0gMC40ZW07Cit9CisKKy5idXR0b24tYmFyIHVsIC5vcHBvc2VkIHsKKyAgICBmbG9hdDogcmlnaHQ7Cit9CisKKy5idXR0b24tYmFyIHVsIGEsIC50YWJDb250YWluZXIgdWwgYSB7CisgICAgZGlzcGxheTogYmxvY2s7Cit9CisKKy5idXR0b24tYmFyIHVsIGEsIC5idXR0b24tYmFyIGEgeworICAgIHBhZGRpbmc6IDAuMWVtIDAuNWVtIDAuMWVtIDAuNWVtOworICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKy5idXR0b24tYmFyIHVsIGE6aG92ZXIgeworICAgIGNvbG9yOiAjMDAwMGZmOworfQorCisuYnV0dG9uLWJhciAub3Bwb3NlZCwgLmJ1dHRvbi1iYXIgLm9wcG9zZWQgbGksIC5idXR0b24tYmFyIHVsIC5vcHBvc2VkIHsKKyAgICBmbG9hdDogcmlnaHQ7Cit9CisKKy8qID09PT09IEJ1dHRvbiBzdHlsZSBkZWNvcmF0b3IgPT09PT0gKi8KKy5idXR0b24tc3R5bGUtMSB1bCBsaSwgLnRhYkNvbnRhaW5lciB1bCBsaSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgICBjb2xvcjogIzAwMDA5OTsKK30KKworLmJ1dHRvbi1zdHlsZS0xIGEsIC5idXR0b24tc3R5bGUtMSB1bCBhLCBhLmJ1dHRvbi1zdHlsZS0xIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDREMEM4OworICAgIGJvcmRlcjogc29saWQgIzAwMDA5OSAwLjFlbTsKKyAgICBjb2xvcjogIzAwMDA5OTsKK30KKworLmJ1dHRvbi1zdHlsZS0xIC5zZWxlY3RlZCwgLmJ1dHRvbi1zdHlsZS0xIHVsIC5zZWxlY3RlZCwgLmJ1dHRvbi1zdHlsZS0xIHVsIC5zZWxlY3RlZCBhIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDk5OworICAgIGNvbG9yOiAjZmZmZmZmOworfQorCisuYnV0dG9uLXN0eWxlLTEgYTpob3ZlciwgLmJ1dHRvbi1zdHlsZS0xIHVsIGE6aG92ZXIsIGEuYnV0dG9uLXN0eWxlLTE6aG92ZXIgeworICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwOTk7CisgICAgY29sb3I6ICNmZmZmZmY7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisvKiA9PT09PSBCdXR0b24gc3R5bGUgZGVjb3JhdG9yID09PT09ICovCisuYnV0dG9uLXN0eWxlLTIgdWwgbGkgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CisgICAgY29sb3I6ICMwMDAwOTk7Cit9CisKKy5idXR0b24tc3R5bGUtMiB1bCBhLCAuYnV0dG9uLXN0eWxlLTIgYSwgYS5idXR0b24tc3R5bGUtMiB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgICBib3JkZXI6IHNvbGlkICMwMDAwOTkgMC4xZW07CisgICAgY29sb3I6ICMwMDAwOTk7Cit9CisKKy5idXR0b24tc3R5bGUtMiB1bCAuc2VsZWN0ZWQgYSwgLmJ1dHRvbi1zdHlsZS0yIC5zZWxlY3RlZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDA5OTsKKyAgICBjb2xvcjogI2ZmZmZmZjsKK30KKworLmJ1dHRvbi1zdHlsZS0yIHVsIGE6aG92ZXIsIC5idXR0b24tc3R5bGUtMiBhOmhvdmVyLCBhLmJ1dHRvbi1zdHlsZS0yOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDk5OworICAgIGNvbG9yOiAjZmZmZmZmOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLmJ1dHRvbi1zdHlsZS0yIC5kaXNhYmxlZCB7CisgICAgYm9yZGVyOiBzb2xpZCAjRDREMEM4IDAuMWVtOworICAgIGNvbG9yOiAjRDREMEM4Cit9CisKKy8qID09PT09IEJ1dHRvbiBiYXIgZGVjb3JhdG9ycyA9PT09PSAqLworLnRvb2wtYmFyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDREMEM4OworICAgIGJvcmRlcjogMC4xZW0gc29saWQgIzAwMDA5OTsKKyAgICBwYWRkaW5nOiAwLjJlbTsKK30KKworLnRvb2wtYmFyIHVsIGxpIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDREMEM4OworICAgIHBhZGRpbmc6IDAuMWVtOworfQorCisvKiB0YWItYmFyIGRlY29yYXRvciBpbnRlbmRlZCB0byBiZSB1c2VkIGF0Cit0aGUgdG9wIG9mIHRoZSBtYWluIGNvbnRlbnQgYXJlYSAqLworLnRhYi1iYXIgeworICAgIGRpc3BsYXk6IHRhYmxlOworfQorCisudGFiLWJhciB1bCBsaSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzAzNjZiMDsKKyAgICBtYXJnaW46IDA7Cit9CisKKy50YWItYmFyIHVsIGEsIC50YWItYmFyIHVsIGE6dmlzaXRlZCB7CisgICAgY29sb3I6ICNmZmZmZmY7Cit9CisKKy50YWItYmFyIHVsIGE6aG92ZXIsIC50YWItYmFyIHVsIC5zZWxlY3RlZCwgLnRhYi1iYXIgdWwgLnNlbGVjdGVkIGEsIC50YWItYmFyIHVsIC5zZWxlY3RlZCBhOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWY5ZmNmOworICAgIGNvbG9yOiAjZmZmZmZmOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLnRhYi1iYXIgdWwgLmRpc2FibGVkIHsKKyAgICBjb2xvcjogI0Q0RDBDODsKKyAgICBwYWRkaW5nOiAwLjFlbSAwLjRlbSAwLjFlbSAwLjRlbTsKK30KKworLnRhYi1iYXIgLm9wcG9zZWQsIC50YWItYmFyIC5vcHBvc2VkIGxpLCAudGFiLWJhciB1bCAub3Bwb3NlZCB7CisgICAgYm9yZGVyLWxlZnQ6IDAuMWVtIHNvbGlkICM1ZjlmY2Y7CisgICAgYm9yZGVyLXJpZ2h0OiBub25lOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8gLyogPT09PT0gVGFibGUgU3R5bGVzID09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy5iYXNpYy10YWJsZSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgICBjb2xvcjogIzAwMDAwMDsKKyAgICB3aWR0aDogMTAwJTsKK30KKworZm9ybSAuYmFzaWMtdGFibGUsIC5zY3JlZW5sZXQtYm9keSAuYmFzaWMtdGFibGUgeworICAgIG1hcmdpbi1ib3R0b206IDA7Cit9CisKKy5iYXNpYy10YWJsZSB0ciB0ZCB7IC8qIFN0eWxlIGZvciBhbGwgY2VsbHMgKi8KKyAgICBwYWRkaW5nOiAwLjFlbTsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCisuYmFzaWMtdGFibGUgdHIgLmxhYmVsLCAuYmFzaWMtdGFibGUgdHIgLmdyb3VwLWxhYmVsIHsKKyAgICAvKiBmaWVsZCBsYWJlbHMgZm9yIGZvcm1zICovCisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgcGFkZGluZy1yaWdodDogMS41ZW07CisgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICB3aWR0aDogMSU7Cit9CisKKy5iYXNpYy10YWJsZSB0ciAuZ3JvdXAtbGFiZWwgeyAvKiAiaGVhZGVyIiBmb3IgZmllbGQgbGFiZWwgZ3JvdXBzICovCisgICAgZm9udC1zaXplOiAxLjJlbTsKKyAgICBwYWRkaW5nOiAyZW0gMS41ZW0gMCAwOworfQorCisuYmFzaWMtdGFibGUgdHIgdGgsIC5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdyB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKK30KKworLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93IHRkIHsKKyAgICBib3JkZXItYm90dG9tOiAwLjFlbSBzb2xpZCAjMDAwMDAwOworfQorCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgdGQgYSB7CisgICAgY29sb3I6ICMwMDAwMDA7Cit9CisKKy5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvdyB7IC8qIEFsdGVybmF0aW5nIHJvdyBzdHlsZSAqLworICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7Cit9CisKKy5iYXNpYy10YWJsZSAuc2VsZWN0ZWQgeworICAgIGJhY2tncm91bmQ6ICNGRkZDQ0Y7Cit9CisKKy5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvd1NlbGVjdGVkIHsKKyAgICBiYWNrZ3JvdW5kOiAjRkZGNTVGOworfQorCisuYmFzaWMtdGFibGUgLlZhbGlkYXRlIHsgLypTdHlsZSB1c2UgYnkgYWx0LXJvdy1zdHlsZSBvbiBsaXN0Ki8KKyAgICBiYWNrZ3JvdW5kOiAjQTBENUY3OworfQorCisuYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3dWYWxpZGF0ZSB7CisgICAgLypTdHlsZSB1c2UgYnkgYWx0LXJvdy1zdHlsZSBvbiBsaXN0Ki8KKyAgICBiYWNrZ3JvdW5kOiAjNzJBOEYyOworfQorCisuYmFzaWMtdGFibGUgLldhcm4geyAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLworICAgIGJhY2tncm91bmQ6ICNmNTVDNUM7Cit9CisKKy5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvd1dhcm4geyAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLworICAgIGJhY2tncm91bmQ6ICNGQzc0NTU7Cit9CisKKy5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCB7CisgICAgLyogYnV0dG9uIGNvbHVtbiBzdHlsZSAtIGZvciB0aGUgc21hbGwKKyAgIGNvbGxlY3Rpb24gb2YgYnV0dG9ucyB1c2VkIGluIGxpc3RzICovCisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KKworLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGEgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CisgICAgYm9yZGVyOiAjOTk5OTk5IHNvbGlkIDAuMWVtOworICAgIGNvbG9yOiAjMDAwMDk5OworICAgIGZsb2F0OiBsZWZ0OworICAgIG1hcmdpbjogMCAwLjFlbSAwIDAuMWVtOworICAgIHBhZGRpbmc6IDAuMWVtIDAuNGVtIDAuMWVtIDAuNGVtOworICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKy5iYXNpYy10YWJsZSB0ciAuc21hbGxTdWJtaXQsIC5iYXNpYy10YWJsZSB0ciAuc21hbGxTdWJtaXQ6dmlzaXRlZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgICBib3JkZXI6ICM5OTk5OTkgc29saWQgMC4xZW07CisgICAgY29sb3I6ICMwMDAwOTk7CisgICAgZm9udC1zaXplOiAxZW07CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgbWFyZ2luOiAwLjJlbTsKKyAgICBwYWRkaW5nOiAwLjFlbSAwLjJlbSAwLjFlbSAwLjJlbTsKKyAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisuYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgYTpob3ZlciwgLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGE6YWN0aXZlLCAuYmFzaWMtdGFibGUgdHIgLnNtYWxsU3VibWl0OmhvdmVyLCAuYmFzaWMtdGFibGUgdHIgLnNtYWxsU3VibWl0OmFjdGl2ZSB7CisgICAgY29sb3I6ICNmZjAwMDA7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisuYmFzaWMtdGFibGUgLmNvbGxhcHNlZCB7CisgICAgdmlzaWJpbGl0eTogY29sbGFwc2U7Cit9CisKKy8qID09PT09IEFsdGVybmF0ZSB0YWJsZSBoZWFkZXIgc3R5bGUgPT09PT0gKi8KKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoLCAuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKKyAgICBib3JkZXItYm90dG9tOiAwOworICAgIGJvcmRlci1sZWZ0OiAwLjFlbSBzb2xpZCAjY2NjY2NjOworICAgIGNvbG9yOiAjZmZmZmZmOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHRleHQtYWxpZ246IGxlZnQ7Cit9CisKKy8qID09PT09IFNvcnQgZmllbGQgc3R5bGUgPT09PT0gKi8KKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoIC5zb3J0LW9yZGVyLWFzYywgLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGQgLnNvcnQtb3JkZXItYXNjIHsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci11cC5wbmcpIG5vLXJlcGVhdCByaWdodDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAyMHB4OworfQorCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCAuc29ydC1vcmRlci1kZXNjLCAuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCAuc29ydC1vcmRlci1kZXNjIHsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci1kdy5wbmcpIG5vLXJlcGVhdCByaWdodDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAyMHB4OworfQorCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCAuc29ydC1vcmRlciwgLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGQgLnNvcnQtb3JkZXIgeworICAgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LWdyLnBuZykgbm8tcmVwZWF0IHJpZ2h0OworICAgIHBhZGRpbmctcmlnaHQ6IDIwcHg7Cit9CisKKy8qID09PT09IFRhYmxlIGRlY29yYXRvciAtIEhvdmVyIGJhciA9PT09PSAqLworLmhvdmVyLWJhciB0cjpob3ZlciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKKyAgICBjdXJzb3I6IGRlZmF1bHQ7Cit9CisKKy5ob3Zlci1iYXIgLmhlYWRlci1yb3c6aG92ZXIsIC5ob3Zlci1iYXIgdHIgdGg6aG92ZXIgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CisgICAgY29sb3I6ICMwMDAwMDA7Cit9CisKKy8qID09PT09IFRhYmxlIGRlY29yYXRvciAtIEdyaWQgPT09PT0gKi8KKy8qIFRoZXNlIGRlY29yYXRvcnMgbmVlZCBhbiBJRSBoYWNrLiBJRTcgZG9lcyBub3QKK3JlbmRlciBib3JkZXJzIGFyb3VuZCBlbXB0eSA8dGQ+IGVsZW1lbnRzICovCisuZGFyay1ncmlkIHsgLyogZGFyayBncmlkICovCisgICAgYm9yZGVyLXJpZ2h0OiAwLjFlbSBzb2xpZCAjMDAwMDAwOworICAgIGJvcmRlci10b3A6IDAuMWVtIHNvbGlkICMwMDAwMDA7Cit9CisKKy5kYXJrLWdyaWQgdGQsIC5kYXJrLWdyaWQgLmhlYWRlci1yb3ctMiB0aCwgLmRhcmstZ3JpZCAuaGVhZGVyLXJvdy0yIHRkIHsKKyAgICBib3JkZXItYm90dG9tOiAwLjFlbSBzb2xpZCAjMDAwMDAwOworICAgIGJvcmRlci1sZWZ0OiAwLjFlbSBzb2xpZCAjMDAwMDAwOworfQorCisubGlnaHQtZ3JpZCB7IC8qIGxpZ2h0IGdyaWQgKi8KKyAgICBib3JkZXItcmlnaHQ6IDAuMWVtIHNvbGlkICNjY2NjY2M7CisgICAgYm9yZGVyLXRvcDogMC4xZW0gc29saWQgI2NjY2NjYzsKK30KKworLmxpZ2h0LWdyaWQgdGQsIC5saWdodC1ncmlkIC5oZWFkZXItcm93IHRkIHsKKyAgICBib3JkZXItYm90dG9tOiAwLjFlbSBzb2xpZCAjY2NjY2NjOworICAgIGJvcmRlci1sZWZ0OiAwLjFlbSBzb2xpZCAjY2NjY2NjOworfQorCisvKiA9PT09PSBUYWJsZSBkZWNvcmF0b3IgLSBDYWxlbmRhciA9PT09PSAqLworLmNhbGVuZGFyIHsKKyAgICBib3JkZXItcmlnaHQ6IDAuMWVtIHNvbGlkICNjY2NjY2M7Cit9CisKKy5jYWxlbmRhciB0ciB0ZCB7CisgICAgYm9yZGVyLWJvdHRvbTogMC4xZW0gc29saWQgI2NjY2NjYzsKKyAgICBib3JkZXItbGVmdDogMC4xZW0gc29saWQgI2NjY2NjYzsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICAgIHBhZGRpbmc6IDAuNWVtOworfQorCisuY2FsZW5kYXIgLmhlYWRlci1yb3cgdGQgeworICAgIGJhY2tncm91bmQtY29sb3I6ICM2OWE5ZDk7CisgICAgYm9yZGVyLWJvdHRvbTogMC4xZW0gc29saWQgI2NjY2NjYzsKKyAgICBib3JkZXItbGVmdDogMC4xZW0gc29saWQgI2NjY2NjYzsKKyAgICBjb2xvcjogI2ZmZmZmZjsKKyAgICBoZWlnaHQ6IGF1dG87CisgICAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCisuY2FsZW5kYXIgdHIgdGQgLmFkZC1uZXcgeworICAgIGZsb2F0OiByaWdodDsKK30KKworLmNhbGVuZGFyIHRyIHRkIC5oMSB7CisgICAgY29sb3I6ICMwMDAwOTk7CisgICAgZmxvYXQ6IGxlZnQ7Cit9CisKKy5jYWxlbmRhciAuY3VycmVudC1wZXJpb2QgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmY2M7Cit9CisKKy5jYWxlbmRhciAuYWN0aXZlLXBlcmlvZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT0gKi8gLyogPT09PT0gVHJlZSBTdHlsZXMgPT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09ICovCisuYmFzaWMtdHJlZSB7IC8qIHBsYWNlaG9sZGVyICovCisKK30KKworLmJhc2ljLXRyZWUgdWwgeworICAgIHBhZGRpbmctbGVmdDogMWVtOworfQorCisuYmFzaWMtdHJlZSBsaSB7CisgICAgcGFkZGluZy1sZWZ0OiAxZW07CisgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworLmJhc2ljLXRyZWUgbGkgLmV4cGFuZGVkIHsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9jb2xsYXBzZS5naWYpIG5vLXJlcGVhdCBsZWZ0IGNlbnRlcjsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxZW07Cit9CisKKy5iYXNpYy10cmVlIGxpIC5jb2xsYXBzZWQgeworICAgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2V4cGFuZC5naWYpIG5vLXJlcGVhdCBsZWZ0IGNlbnRlcjsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxZW07Cit9CisKKy5iYXNpYy10cmVlIGxpIC5sZWFmbm9kZSB7CisgICAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvZXhwYW5kLWNvbGxhcHNlLXBsYWNlaG9sZGVyLmdpZikgbm8tcmVwZWF0IGxlZnQgY2VudGVyOworICAgIHBhZGRpbmctcmlnaHQ6IDFlbTsKK30KKworLmJhc2ljLXRyZWUgbGkgLnRyZWVpdGVtIHsgLyogdHJlZWl0ZW0gaXMgZGVwcmVjYXRlZCAqLworICAgIGJvcmRlci1zdHlsZTogbm9uZTsKKyAgICBjb2xvcjogIzAwMDA5OTsKKyAgICBmb250LXNpemU6IDFlbTsKK30KKworLmJhc2ljLXRyZWUgbGkgYTpob3ZlciB7CisgICAgY29sb3I6ICMwMDAwZmY7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PSAqLyAvKiA9PT09PSBGb3JtIFN0eWxlcyA9PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09ICovCisuYmFzaWMtZm9ybSB7CisgICAgbWFyZ2luLWJvdHRvbTogMWVtOworfQorCisuYmFzaWMtZm9ybSB0YWJsZSB7CisgICAgd2lkdGg6IDEwMCU7Cit9CisKKy5iYXNpYy1mb3JtIHRhYmxlIC5oZWFkZXItcm93OmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICAgIGNvbG9yOiAjMDAwMDAwOworfQorCisuYmFzaWMtZm9ybSB0YWJsZSB0ciB0ZCB7CisgICAgcGFkZGluZzogMC4xZW07Cit9CisKKy5iYXNpYy1mb3JtIHRhYmxlIHRyIC5sYWJlbCwgLmJhc2ljLWZvcm0gdGFibGUgdHIgLmdyb3VwLWxhYmVsIHsKKyAgICAvKiBmaWVsZCBsYWJlbHMgZm9yIGZvcm1zICovCisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgcGFkZGluZy1yaWdodDogMS41ZW07CisgICAgd2lkdGg6IDElOworfQorCisuYmFzaWMtZm9ybSB0YWJsZSB0ciAuZ3JvdXAtbGFiZWwgeworICAgIC8qICJoZWFkZXIiIGZvciBmaWVsZCBsYWJlbCBncm91cHMgKi8KKyAgICBmb250LXNpemU6IDEuMmVtOworICAgIHBhZGRpbmc6IDJlbSAxLjVlbSAwIDA7Cit9CisKKy5iYXNpYy1mb3JtIHRhYmxlIHRyIHRoLCAuYmFzaWMtZm9ybSB0YWJsZSAuaGVhZGVyLXJvdyB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKK30KKworLmJhc2ljLWZvcm0gdGFibGUgLmhlYWRlci1yb3c6aG92ZXIsIC5iYXNpYy1mb3JtIHRhYmxlIHRyIHRoOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICAgIGNvbG9yOiAjMDAwMDAwOworfQorCisuYmFzaWMtZm9ybSB0YWJsZSAuaGVhZGVyLXJvdyB0ZCB7CisgICAgYm9yZGVyLWJvdHRvbTogMC4xZW0gc29saWQgIzk5OTk5OTsKK30KKworLmJhc2ljLWZvcm0gdGFibGUgLnZpZXdNYW55VFIxLCAuYmFzaWMtZm9ybSB0YWJsZSAuYWx0ZXJuYXRlLXJvdyB7CisgICAgLyogQWx0ZXJuYXRpbmcgcm93IHN0eWxlICovCisgICAgLyogLnZpZXdNYW55VFIxIGRlcHJlY2F0ZWQgLSB1c2UgLmFsdGVybmF0ZS1yb3cgKi8KKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOworfQorCisuYmFzaWMtZm9ybSB0YWJsZSB0ciB0ZCAuc21hbGxTdWJtaXQsIC5iYXNpYy1mb3JtIHRhYmxlIHRyIHRkIC5zbWFsbFN1Ym1pdDp2aXNpdGVkIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICAgIGJvcmRlcjogIzk5OTk5OSBzb2xpZCAwLjFlbTsKKyAgICBjb2xvcjogIzAwMDA5OTsKKyAgICBmb250LXNpemU6IDFlbTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBtYXJnaW46IDAuMmVtOworICAgIHBhZGRpbmc6IDAuMWVtIDAuMmVtIDAuMWVtIDAuMmVtOworfQorCisuYmFzaWMtZm9ybSB0YWJsZSB0ciB0ZCAuc21hbGxTdWJtaXQ6aG92ZXIsIC5iYXNpYy1mb3JtIHRhYmxlIHRyIHRkIC5zbWFsbFN1Ym1pdDphY3RpdmUgeworICAgIGNvbG9yOiAjZmYwMDAwOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLmJhc2ljLWZvcm0gdGFibGUgdHIgdGQgLmRpc2FibGVkIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOworICAgIGNvbG9yOiAjMzMzMzY2OworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLyogPT09PT0gRm9ybSBkZWNvcmF0b3IgLSBGb3JtIFdpZGdldCA9PT09PSAqLworLmZvcm0td2lkZ2V0IHRhYmxlIHRyIC5sYWJlbCwgLmZvcm0td2lkZ2V0LXRhYmxlIHRyIC5sYWJlbCB7CisgICAgLyogQWRkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyAgICB3aWR0aDogMjAlOworfQorCisuZm9ybS13aWRnZXQgdGFibGUsIC5mb3JtLXdpZGdldC10YWJsZSB7CisgICAgd2lkdGg6IGF1dG87Cit9CisKKy5mb3JtLXdpZGdldC10YWJsZSB7CisgICAgbWFyZ2luLWJvdHRvbTogMWVtOworfQorCisvKiBQYWdlciAqLworLm5hdi1wYWdlciB7CisgICAgaGVpZ2h0OiAyZW07CisgICAgcGFkZGluZy1ib3R0b206IDAuN2VtOworICAgIHBhZGRpbmctdG9wOiAwLjRlbTsKK30KKworLm5hdi1wYWdlciB1bCB7CisgICAgZGlzcGxheTogaW5saW5lOyAvKiBJRSBGaXggKi8KK30KKworLm5hdi1wYWdlciB1bCBsaSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBsaW5lLWhlaWdodDogMS44ZW07CisgICAgbWFyZ2luOiAwLjJlbTsKK30KKworLm5hdi1wYWdlciB1bCBsaSBhIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBoZWlnaHQ6IDE2cHg7CisgICAgd2lkdGg6IDE2cHg7CisgICAgdGV4dC1pbmRlbnQ6IC0zMDAwcHg7Cit9CisKKy5uYXYtcGFnZXIgdWwgbGkgc3BhbiB7CisgICAgZGlzcGxheTogbm9uZTsKKyAgICB2aXNpYmlsaXR5OiBoaWRkZW47CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgaGVpZ2h0OiAxNnB4OworICAgIHdpZHRoOiAxNnB4OworfQorCisubmF2LXBhZ2VyIHVsIC5uYXYtZmlyc3QgYSB7CisgICAgYmFja2dyb3VuZDogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3Jlc3VsdHNldF9maXJzdC5wbmcpIG5vLXJlcGVhdDsKK30KKworLm5hdi1wYWdlciB1bCAubmF2LXByZXZpb3VzIGEgeworICAgIGJhY2tncm91bmQ6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy9yZXN1bHRzZXRfcHJldmlvdXMucG5nKSBuby1yZXBlYXQ7Cit9CisKKy5uYXYtcGFnZXIgdWwgLm5hdi1uZXh0IGEgeworICAgIGJhY2tncm91bmQ6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy9yZXN1bHRzZXRfbmV4dC5wbmcpIG5vLXJlcGVhdDsKK30KKworLm5hdi1wYWdlciB1bCAubmF2LWxhc3QgYSB7CisgICAgYmFja2dyb3VuZDogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3Jlc3VsdHNldF9sYXN0LnBuZykgbm8tcmVwZWF0OworfQorCisubmF2LXBhZ2VyIHVsIC5uYXYtZmlyc3QtZGlzYWJsZWQgeworICAgIGJhY2tncm91bmQ6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy9yZXN1bHRzZXRfZmlyc3RfZGlzYWJsZWQucG5nKSBuby1yZXBlYXQ7Cit9CisKKy5uYXYtcGFnZXIgdWwgLm5hdi1wcmV2aW91cy1kaXNhYmxlZCB7CisgICAgYmFja2dyb3VuZDogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3Jlc3VsdHNldF9wcmV2aW91c19kaXNhYmxlZC5wbmcpIG5vLXJlcGVhdDsKK30KKworLm5hdi1wYWdlciB1bCAubmF2LW5leHQtZGlzYWJsZWQgeworICAgIGJhY2tncm91bmQ6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy9yZXN1bHRzZXRfbmV4dF9kaXNhYmxlZC5wbmcpIG5vLXJlcGVhdDsKK30KKworLm5hdi1wYWdlciB1bCAubmF2LWxhc3QtZGlzYWJsZWQgeworICAgIGJhY2tncm91bmQ6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy9yZXN1bHRzZXRfbGFzdF9kaXNhYmxlZC5wbmcpIG5vLXJlcGVhdDsKK30KKworLm5hdi1wYWdlciB1bCAubmF2LXBhZ2VzaXplIHsKKyAgICBwYWRkaW5nOiAwIDMwcHggMCAzMHB4OworfQorCisuZmllbGQtbG9va3VwIGEgeworICAgIGJhY2tncm91bmQ6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy9hcHBsaWNhdGlvbl92aWV3X2xpc3QucG5nKSBuby1yZXBlYXQgMCAwOworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAvKiBtYXJnaW46IDNweCAxMHB4IDBweCA0cHg7ICovCisgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICBtYXJnaW4tdG9wOiAzcHg7CisgICAgd2lkdGg6IDE2cHg7CisgICAgaGVpZ2h0OiAxNnB4OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT0gRmllbGRHcm91cCBTdHlsZXMgPT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisuZmllbGRncm91cC10aXRsZS1iYXIgeworICAgIGZvbnQtc2l6ZTogMS4yZW07CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgcGFkZGluZzogNXB4IDAgNXB4IDEwcHg7Cit9CisKKy5maWVsZGdyb3VwLXRpdGxlLWJhciB1bCAuY29sbGFwc2VkLCAuZmllbGRncm91cC10aXRsZS1iYXIgdWwgLmNvbGxhcHNlZDpob3ZlciB7CisgICAgYmFja2dyb3VuZDogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL2J1bGxldF90b2dnbGVfcGx1cy5wbmcpIG5vLXJlcGVhdCBsZWZ0IGNlbnRlcjsKK30KKworLmZpZWxkZ3JvdXAtdGl0bGUtYmFyIHVsIC5leHBhbmRlZCwgLmZpZWxkZ3JvdXAtdGl0bGUtYmFyIHVsIC5leHBhbmRlZDpob3ZlciB7CisgICAgYmFja2dyb3VuZDogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL2J1bGxldF90b2dnbGVfbWludXMucG5nKSBuby1yZXBlYXQgbGVmdCBjZW50ZXI7Cit9CisKKy5maWVsZGdyb3VwLXRpdGxlLWJhciBhIHsKKyAgICBjdXJzb3I6IHBvaW50ZXI7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIHBhZGRpbmctbGVmdDogMTBweDsKKyAgICBjb2xvcjogIzAwMDAwMDsKK30KKworLyogPT0gUG9ydGxldCBjb25maWd1cmF0aW9uIHNjcmVlbmxldCA9PSAqLworLnBvcnRsZXQtY29uZmlnIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDREMEM4OworICAgIGJvcmRlcjogMnB4IHNvbGlkICNENEQwQzg7CisgICAgbWFyZ2luLWJvdHRvbTogNXB4OworfQorCisucG9ydGxldC1jb25maWctdGl0bGUtYmFyIC50aXRsZSB7CisgICAgY29sb3I6ICM1NTU1NTU7CisgICAgZm9udC1zaXplOiAxLjJlbTsKKyAgICBmbG9hdDogbGVmdDsKK30KKworLnBvcnRsZXQtY29uZmlnLXRpdGxlLWJhciB1bCB7CisgICAgZGlzcGxheTogaW5saW5lOyAvKiBJRSBGaXggKi8KK30KKworLnBvcnRsZXQtY29uZmlnLXRpdGxlLWJhciB1bCBsaSB7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIGZvbnQtc2l6ZTogMWVtOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHBhZGRpbmc6IDAuMWVtIDAuNWVtIDAuMmVtIDAuNWVtOworfQorCisucG9ydGxldC1jb25maWctdGl0bGUtYmFyIHVsIGxpLm1vdmUtdXAgeworICAgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LXNpbmdsZS11cC1ncmVlbi5wbmcpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyOworfQorCisucG9ydGxldC1jb25maWctdGl0bGUtYmFyIHVsIGxpLm1vdmUtZG93biB7CisgICAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYXJyb3ctc2luZ2xlLWRvd24tZ3JlZW4ucG5nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlcjsKK30KKworLnBvcnRsZXQtY29uZmlnLXRpdGxlLWJhciB1bCBsaS5tb3ZlLWxlZnQgeworICAgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LXNpbmdsZS1sZWZ0LWdyZWVuLnBuZykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXI7Cit9CisKKy5wb3J0bGV0LWNvbmZpZy10aXRsZS1iYXIgdWwgbGkubW92ZS1yaWdodCB7CisgICAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYXJyb3ctc2luZ2xlLXJpZ2h0LWdyZWVuLnBuZykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXI7Cit9CisKKy5wb3J0bGV0LWNvbmZpZy10aXRsZS1iYXIgdWwgbGkubW92ZS10b3AgeworICAgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LWVuZC11cC1ncmVlbi5wbmcpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyOworfQorCisucG9ydGxldC1jb25maWctdGl0bGUtYmFyIHVsIGxpLm1vdmUtYm90dG9tIHsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1lbmQtZG93bi1ncmVlbi5wbmcpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyOworfQorCisucG9ydGxldC1jb25maWctdGl0bGUtYmFyIHVsIGxpLnJlbW92ZSB7CisgICAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvbWluaS10cmFzaC5wbmcpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyOworfQorCisucG9ydGxldC1jb25maWctdGl0bGUtYmFyIHVsIGxpLmVkaXQgeworICAgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL21pbmktZWRpdC5wbmcpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyOworfQorCisvKiA9PSBQb3J0YWwgTWFuYWdlciBUb29sYmFyID09ICovCisjbWFuYWdlLXBvcnRhbC10b29sYmFyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDREMEM4OworICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOworfQorCisjbWFuYWdlLXBvcnRhbC10b29sYmFyIHVsIGxpIHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjJlbSAwLjVlbTsKK30KKworI21hbmFnZS1wb3J0YWwtdG9vbGJhciAjY29uZmlnLW9uLW9mZiwgI21hbmFnZS1wb3J0YWwtdG9vbGJhciAjbWFuYWdlLXBvcnRhbC1wYWdlLCAjbWFuYWdlLXBvcnRhbC10b29sYmFyICNhZGQtY29sdW1uIHsKKyAgICBmbG9hdDogcmlnaHQ7Cit9CisKKyNtYW5hZ2UtcG9ydGFsLXRvb2xiYXIgI3BvcnRhbC1wYWdlLW5hbWUgeworICAgIGZvbnQtc2l6ZTogMS41ZW07CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy5tYW5hZ2UtcG9ydGFsLWNvbHVtbi10b29sYmFyICNhZGQtcG9ydGxldCwgLm1hbmFnZS1wb3J0YWwtY29sdW1uLXRvb2xiYXIgI2RlbGV0ZS1jb2x1bW4sIC5tYW5hZ2UtcG9ydGFsLWNvbHVtbi10b29sYmFyICNjb2x1bW4td2lkdGggeworICAgIGZsb2F0OiByaWdodDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitXZWJ0b29scworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisud2ViVG9vbExpc3QgaDMgeworICAgIG1hcmdpbjogMC43NWVtIDAgMC4wOWVtIDA7CisgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKK30KKworI3dhaXQtc3Bpbm5lciB7CisgICAgei1pbmRleDogNTAwMDA7CisgICAgcG9zaXRpb246IGFic29sdXRlOworfQorCit9Cisud2FpdC1zcGlubmVyIGRpdiB7CisgICAgcGFkZGluZy10b3A6IDRweDsKK30KKworI3dhaXQtc3Bpbm5lci1pbWFnZSB7CisgICAgaGVpZ2h0OiA0NXB4OworICAgIHdpZHRoOiA0NXB4OworICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC9pbWFnZXMvc3Bpbm5lci5naWYpOworfQorCitpbWcuY3NzSW1nWExhcmdlIHsKKyAgICAvKmJvcmRlcjogMXB4IGJsYWNrIHNvbGlkOyovCisgICAgbWF4LXdpZHRoOiAyMDBweDsKKyAgICBtYXgtaGVpZ2h0OiAxNTBweDsKK30KKworaW1nLmNzc0ltZ0xhcmdlIHsKKyAgICAvKmJvcmRlcjogMXB4IGJsYWNrIHNvbGlkOyovCisgICAgbWF4LXdpZHRoOiAxMDBweDsKKyAgICBtYXgtaGVpZ2h0OiA3NXB4OworfQorCitpbWcuY3NzSW1nU3RhbmRhcmQgeworICAgIC8qYm9yZGVyOiAxcHggYmxhY2sgc29saWQ7Ki8KKyAgICBtYXgtd2lkdGg6IDcwcHg7CisgICAgbWF4LWhlaWdodDogNTJweDsKK30KKworaW1nLmNzc0ltZ1NtYWxsIHsKKyAgICAvKmJvcmRlcjogMXB4IGJsYWNrIHNvbGlkOyovCisgICAgbWF4LXdpZHRoOiA1MHB4OworICAgIG1heC1oZWlnaHQ6IDM3cHg7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT0gSmF2YVNjcmlwdCBqUXVlcnkgd2lkZ2V0cyBTbW9vdGhuZXNzIERlc2lnbiAgID09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qISBqUXVlcnkgVUkgLSB2MS45LjAgLSAyMDEyLTEwLTE2CisqIGh0dHA6Ly9qcXVlcnl1aS5jb20KKyogSW5jbHVkZXM6IGpxdWVyeS51aS5jb3JlLmNzcywganF1ZXJ5LnVpLnJlc2l6YWJsZS5jc3MsIGpxdWVyeS51aS5zZWxlY3RhYmxlLmNzcywganF1ZXJ5LnVpLmFjY29yZGlvbi5jc3MsIGpxdWVyeS51aS5hdXRvY29tcGxldGUuY3NzLCBqcXVlcnkudWkuYnV0dG9uLmNzcywganF1ZXJ5LnVpLmRhdGVwaWNrZXIuY3NzLCBqcXVlcnkudWkuZGlhbG9nLmNzcywganF1ZXJ5LnVpLm1lbnUuY3NzLCBqcXVlcnkudWkucHJvZ3Jlc3NiYXIuY3NzLCBqcXVlcnkudWkuc2xpZGVyLmNzcywganF1ZXJ5LnVpLnNwaW5uZXIuY3NzLCBqcXVlcnkudWkudGFicy5jc3MsIGpxdWVyeS51aS50b29sdGlwLmNzcworKiBUbyB2aWV3IGFuZCBtb2RpZnkgdGhpcyB0aGVtZSwgdmlzaXQgaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci8/ZmZEZWZhdWx0PVZlcmRhbmElMkNBcmlhbCUyQ3NhbnMtc2VyaWYmZndEZWZhdWx0PW5vcm1hbCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTRweCZiZ0NvbG9ySGVhZGVyPWNjY2NjYyZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj03NSZib3JkZXJDb2xvckhlYWRlcj1hYWFhYWEmZmNIZWFkZXI9MjIyMjIyJmljb25Db2xvckhlYWRlcj0yMjIyMjImYmdDb2xvckNvbnRlbnQ9ZmZmZmZmJmJnVGV4dHVyZUNvbnRlbnQ9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5Q29udGVudD03NSZib3JkZXJDb2xvckNvbnRlbnQ9YWFhYWFhJmZjQ29udGVudD0yMjIyMjImaWNvbkNvbG9yQ29udGVudD0yMjIyMjImYmdDb2xvckRlZmF1bHQ9ZTZlNmU2JmJnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9NzUmYm9yZGVyQ29sb3JEZWZhdWx0PWQzZDNkMyZmY0RlZmF1bHQ9NTU1NTU1Jmljb25Db2xvckRlZmF1bHQ9ODg4ODg4JmJnQ29sb3JIb3Zlcj1kYWRhZGEmYmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTc1JmJvcmRlckNvbG9ySG92ZXI9OTk5OTk5JmZjSG92ZXI9MjEyMTIxJmljb25Db2xvckhvdmVyPTQ1NDU0NSZiZ0NvbG9yQWN0aXZlPWZmZmZmZiZiZ1RleHR1cmVBY3RpdmU9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT02NSZib3JkZXJDb2xvckFjdGl2ZT1hYWFhYWEmZmNBY3RpdmU9MjEyMTIxJmljb25Db2xvckFjdGl2ZT00NTQ1NDUmYmdDb2xvckhpZ2hsaWdodD1mYmY5ZWUmYmdUZXh0dXJlSGlnaGxpZ2h0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZmNlZmExJmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9MmU4M2ZmJmJnQ29sb3JFcnJvcj1mZWYxZWMmYmdUZXh0dXJlRXJyb3I9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUVycm9yPTk1JmJvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmZjRXJyb3I9Y2QwYTBhJmljb25Db2xvckVycm9yPWNkMGEwYSZiZ0NvbG9yT3ZlcmxheT1hYWFhYWEmYmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTAmb3BhY2l0eU92ZXJsYXk9MzAmYmdDb2xvclNoYWRvdz1hYWFhYWEmYmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eVNoYWRvdz0wJm9wYWNpdHlTaGFkb3c9MzAmdGhpY2tuZXNzU2hhZG93PThweCZvZmZzZXRUb3BTaGFkb3c9LThweCZvZmZzZXRMZWZ0U2hhZG93PS04cHgmY29ybmVyUmFkaXVzU2hhZG93PThweAorKiBDb3B5cmlnaHQgKGMpIDIwMTIgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyBMaWNlbnNlZCBNSVQgKi8KKworLyogTGF5b3V0IGhlbHBlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLnVpLWhlbHBlci1oaWRkZW4geworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKy51aS1oZWxwZXItaGlkZGVuLWFjY2Vzc2libGUgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OworICAgIGNsaXA6IHJlY3QoMXB4IDFweCAxcHggMXB4KTsKKyAgICBjbGlwOiByZWN0KDFweCwgMXB4LCAxcHgsIDFweCk7Cit9CisKKy51aS1oZWxwZXItcmVzZXQgeworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIGJvcmRlcjogMDsKKyAgICBvdXRsaW5lOiAwOworICAgIGxpbmUtaGVpZ2h0OiAxLjM7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIGZvbnQtc2l6ZTogMTAwJTsKKyAgICBsaXN0LXN0eWxlOiBub25lOworfQorCisudWktaGVscGVyLWNsZWFyZml4OmJlZm9yZSwgLnVpLWhlbHBlci1jbGVhcmZpeDphZnRlciB7CisgICAgY29udGVudDogIiI7CisgICAgZGlzcGxheTogdGFibGU7Cit9CisKKy51aS1oZWxwZXItY2xlYXJmaXg6YWZ0ZXIgeworICAgIGNsZWFyOiBib3RoOworfQorCisudWktaGVscGVyLWNsZWFyZml4IHsKKyAgICB6b29tOiAxOworfQorCisudWktaGVscGVyLXpmaXggeworICAgIHdpZHRoOiAxMDAlOworICAgIGhlaWdodDogMTAwJTsKKyAgICB0b3A6IDA7CisgICAgbGVmdDogMDsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgb3BhY2l0eTogMDsKKyAgICBmaWx0ZXI6IEFscGhhKE9wYWNpdHk9MCk7Cit9CisKKy8qIEludGVyYWN0aW9uIEN1ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLnVpLXN0YXRlLWRpc2FibGVkIHsKKyAgICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDsKK30KKworLyogSWNvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBzdGF0ZXMgYW5kIGltYWdlcyAqLworLnVpLWljb24geworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIHRleHQtaW5kZW50OiAtOTk5OTlweDsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cit9CisKKy8qIE1pc2MgdmlzdWFscworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE92ZXJsYXlzICovCisudWktd2lkZ2V0LW92ZXJsYXkgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDA7CisgICAgbGVmdDogMDsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBoZWlnaHQ6IDEwMCU7Cit9CisKKy51aS1yZXNpemFibGUgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworLnVpLXJlc2l6YWJsZS1oYW5kbGUgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBmb250LXNpemU6IDAuMXB4OworICAgIGRpc3BsYXk6IGJsb2NrOworfQorCisudWktcmVzaXphYmxlLWRpc2FibGVkIC51aS1yZXNpemFibGUtaGFuZGxlLCAudWktcmVzaXphYmxlLWF1dG9oaWRlIC51aS1yZXNpemFibGUtaGFuZGxlIHsKKyAgICBkaXNwbGF5OiBub25lOworfQorCisudWktcmVzaXphYmxlLW4geworICAgIGN1cnNvcjogbi1yZXNpemU7CisgICAgaGVpZ2h0OiA3cHg7CisgICAgd2lkdGg6IDEwMCU7CisgICAgdG9wOiAtNXB4OworICAgIGxlZnQ6IDA7Cit9CisKKy51aS1yZXNpemFibGUtcyB7CisgICAgY3Vyc29yOiBzLXJlc2l6ZTsKKyAgICBoZWlnaHQ6IDdweDsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBib3R0b206IC01cHg7CisgICAgbGVmdDogMDsKK30KKworLnVpLXJlc2l6YWJsZS1lIHsKKyAgICBjdXJzb3I6IGUtcmVzaXplOworICAgIHdpZHRoOiA3cHg7CisgICAgcmlnaHQ6IC01cHg7CisgICAgdG9wOiAwOworICAgIGhlaWdodDogMTAwJTsKK30KKworLnVpLXJlc2l6YWJsZS13IHsKKyAgICBjdXJzb3I6IHctcmVzaXplOworICAgIHdpZHRoOiA3cHg7CisgICAgbGVmdDogLTVweDsKKyAgICB0b3A6IDA7CisgICAgaGVpZ2h0OiAxMDAlOworfQorCisudWktcmVzaXphYmxlLXNlIHsKKyAgICBjdXJzb3I6IHNlLXJlc2l6ZTsKKyAgICB3aWR0aDogMTJweDsKKyAgICBoZWlnaHQ6IDEycHg7CisgICAgcmlnaHQ6IDFweDsKKyAgICBib3R0b206IDFweDsKK30KKworLnVpLXJlc2l6YWJsZS1zdyB7CisgICAgY3Vyc29yOiBzdy1yZXNpemU7CisgICAgd2lkdGg6IDlweDsKKyAgICBoZWlnaHQ6IDlweDsKKyAgICBsZWZ0OiAtNXB4OworICAgIGJvdHRvbTogLTVweDsKK30KKworLnVpLXJlc2l6YWJsZS1udyB7CisgICAgY3Vyc29yOiBudy1yZXNpemU7CisgICAgd2lkdGg6IDlweDsKKyAgICBoZWlnaHQ6IDlweDsKKyAgICBsZWZ0OiAtNXB4OworICAgIHRvcDogLTVweDsKK30KKworLnVpLXJlc2l6YWJsZS1uZSB7CisgICAgY3Vyc29yOiBuZS1yZXNpemU7CisgICAgd2lkdGg6IDlweDsKKyAgICBoZWlnaHQ6IDlweDsKKyAgICByaWdodDogLTVweDsKKyAgICB0b3A6IC01cHg7Cit9CisKKy51aS1zZWxlY3RhYmxlLWhlbHBlciB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHotaW5kZXg6IDEwMDsKKyAgICBib3JkZXI6IDFweCBkb3R0ZWQgYmxhY2s7Cit9CisKKy51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1oZWFkZXIgeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgbWFyZ2luLXRvcDogMnB4OworICAgIHBhZGRpbmc6IC41ZW0gLjVlbSAuNWVtIC43ZW07CisgICAgem9vbTogMTsKK30KKworLnVpLWFjY29yZGlvbiAudWktYWNjb3JkaW9uLWljb25zIHsKKyAgICBwYWRkaW5nLWxlZnQ6IDIuMmVtOworfQorCisudWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24tbm9pY29ucyB7CisgICAgcGFkZGluZy1sZWZ0OiAuN2VtOworfQorCisudWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taWNvbnMgLnVpLWFjY29yZGlvbi1pY29ucyB7CisgICAgcGFkZGluZy1sZWZ0OiAyLjJlbTsKK30KKworLnVpLWFjY29yZGlvbiAudWktYWNjb3JkaW9uLWhlYWRlciAudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgbGVmdDogLjVlbTsKKyAgICB0b3A6IDUwJTsKKyAgICBtYXJnaW4tdG9wOiAtOHB4OworfQorCisudWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24tY29udGVudCB7CisgICAgcGFkZGluZzogMWVtIDIuMmVtOworICAgIGJvcmRlci10b3A6IDA7CisgICAgb3ZlcmZsb3c6IGF1dG87CisgICAgem9vbTogMTsKK30KKworLnVpLWF1dG9jb21wbGV0ZSB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGN1cnNvcjogZGVmYXVsdDsKK30KKworLyogd29ya2Fyb3VuZHMgKi8KKyogaHRtbCAudWktYXV0b2NvbXBsZXRlIHsKKyAgICB3aWR0aDogMXB4OworfQorCisvKiB3aXRob3V0IHRoaXMsIHRoZSBtZW51IGV4cGFuZHMgdG8gMTAwJSBpbiBJRTYgKi8KKy51aS1idXR0b24geworICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgcGFkZGluZzogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IC4xZW07CisgICAgY3Vyc29yOiBwb2ludGVyOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICB6b29tOiAxOworICAgIG92ZXJmbG93OiB2aXNpYmxlOworfQorCisvKiB0aGUgb3ZlcmZsb3cgcHJvcGVydHkgcmVtb3ZlcyBleHRyYSB3aWR0aCBpbiBJRSAqLworLnVpLWJ1dHRvbiwgLnVpLWJ1dHRvbjpsaW5rLCAudWktYnV0dG9uOnZpc2l0ZWQsIC51aS1idXR0b246aG92ZXIsIC51aS1idXR0b246YWN0aXZlIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy51aS1idXR0b24taWNvbi1vbmx5IHsKKyAgICB3aWR0aDogMi4yZW07Cit9CisKKy8qIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGljb24sIGEgd2lkdGggbmVlZHMgdG8gYmUgc2V0IGhlcmUgKi8KK2J1dHRvbi51aS1idXR0b24taWNvbi1vbmx5IHsKKyAgICB3aWR0aDogMi40ZW07Cit9CisKKy8qIGJ1dHRvbiBlbGVtZW50cyBzZWVtIHRvIG5lZWQgYSBsaXR0bGUgbW9yZSB3aWR0aCAqLworLnVpLWJ1dHRvbi1pY29ucy1vbmx5IHsKKyAgICB3aWR0aDogMy40ZW07Cit9CisKK2J1dHRvbi51aS1idXR0b24taWNvbnMtb25seSB7CisgICAgd2lkdGg6IDMuN2VtOworfQorCisvKmJ1dHRvbiB0ZXh0IGVsZW1lbnQgKi8KKy51aS1idXR0b24gLnVpLWJ1dHRvbi10ZXh0IHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBsaW5lLWhlaWdodDogMS40OworfQorCisudWktYnV0dG9uLXRleHQtb25seSAudWktYnV0dG9uLXRleHQgeworICAgIHBhZGRpbmc6IC40ZW0gMWVtOworfQorCisudWktYnV0dG9uLWljb24tb25seSAudWktYnV0dG9uLXRleHQsIC51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLXRleHQgeworICAgIHBhZGRpbmc6IC40ZW07CisgICAgdGV4dC1pbmRlbnQ6IC05OTk5OTk5cHg7Cit9CisKKy51aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgLnVpLWJ1dHRvbi10ZXh0LCAudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi10ZXh0IHsKKyAgICBwYWRkaW5nOiAuNGVtIDFlbSAuNGVtIDIuMWVtOworfQorCisudWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgLnVpLWJ1dHRvbi10ZXh0LCAudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi10ZXh0IHsKKyAgICBwYWRkaW5nOiAuNGVtIDIuMWVtIC40ZW0gMWVtOworfQorCisudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi10ZXh0IHsKKyAgICBwYWRkaW5nLWxlZnQ6IDIuMWVtOworICAgIHBhZGRpbmctcmlnaHQ6IDIuMWVtOworfQorCisvKiBubyBpY29uIHN1cHBvcnQgZm9yIGlucHV0IGVsZW1lbnRzLCBwcm92aWRlIHBhZGRpbmcgYnkgZGVmYXVsdCAqLworaW5wdXQudWktYnV0dG9uIHsKKyAgICBwYWRkaW5nOiAuNGVtIDFlbTsKK30KKworLypidXR0b24gaWNvbiBlbGVtZW50KHMpICovCisudWktYnV0dG9uLWljb24tb25seSAudWktaWNvbiwgLnVpLWJ1dHRvbi10ZXh0LWljb24tcHJpbWFyeSAudWktaWNvbiwgLnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1pY29uLCAudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWljb24sIC51aS1idXR0b24taWNvbnMtb25seSAudWktaWNvbiB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogNTAlOworICAgIG1hcmdpbi10b3A6IC04cHg7Cit9CisKKy51aS1idXR0b24taWNvbi1vbmx5IC51aS1pY29uIHsKKyAgICBsZWZ0OiA1MCU7CisgICAgbWFyZ2luLWxlZnQ6IC04cHg7Cit9CisKKy51aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgLnVpLWJ1dHRvbi1pY29uLXByaW1hcnksIC51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLWljb24tcHJpbWFyeSwgLnVpLWJ1dHRvbi1pY29ucy1vbmx5IC51aS1idXR0b24taWNvbi1wcmltYXJ5IHsKKyAgICBsZWZ0OiAuNWVtOworfQorCisudWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgLnVpLWJ1dHRvbi1pY29uLXNlY29uZGFyeSwgLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24taWNvbi1zZWNvbmRhcnksIC51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHsKKyAgICByaWdodDogLjVlbTsKK30KKworLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24taWNvbi1zZWNvbmRhcnksIC51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHsKKyAgICByaWdodDogLjVlbTsKK30KKworLypidXR0b24gc2V0cyovCisudWktYnV0dG9uc2V0IHsKKyAgICBtYXJnaW4tcmlnaHQ6IDdweDsKK30KKworLnVpLWJ1dHRvbnNldCAudWktYnV0dG9uIHsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBtYXJnaW4tcmlnaHQ6IC0uM2VtOworfQorCisvKiB3b3JrYXJvdW5kcyAqLworYnV0dG9uLnVpLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciB7CisgICAgYm9yZGVyOiAwOworICAgIHBhZGRpbmc6IDA7Cit9CisKKy8qIHJlc2V0IGV4dHJhIHBhZGRpbmcgaW4gRmlyZWZveCAqLworLnVpLWRhdGVwaWNrZXIgeworICAgIHdpZHRoOiAxN2VtOworICAgIHBhZGRpbmc6IC4yZW0gLjJlbSAwOworICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKKy51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWhlYWRlciB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHBhZGRpbmc6IC4yZW0gMDsKK30KKworLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldiwgLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dCB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogMnB4OworICAgIHdpZHRoOiAxLjhlbTsKKyAgICBoZWlnaHQ6IDEuOGVtOworfQorCisudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyLCAudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIHsKKyAgICB0b3A6IDFweDsKK30KKworLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldiB7CisgICAgbGVmdDogMnB4OworfQorCisudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0IHsKKyAgICByaWdodDogMnB4OworfQorCisudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIHsKKyAgICBsZWZ0OiAxcHg7Cit9CisKKy51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQtaG92ZXIgeworICAgIHJpZ2h0OiAxcHg7Cit9CisKKy51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYgc3BhbiwgLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dCBzcGFuIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgbGVmdDogNTAlOworICAgIG1hcmdpbi1sZWZ0OiAtOHB4OworICAgIHRvcDogNTAlOworICAgIG1hcmdpbi10b3A6IC04cHg7Cit9CisKKy51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXRpdGxlIHsKKyAgICBtYXJnaW46IDAgMi4zZW07CisgICAgbGluZS1oZWlnaHQ6IDEuOGVtOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItdGl0bGUgc2VsZWN0IHsKKyAgICBmb250LXNpemU6IDFlbTsKKyAgICBtYXJnaW46IDFweCAwOworfQorCisudWktZGF0ZXBpY2tlciBzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aC15ZWFyIHsKKyAgICB3aWR0aDogMTAwJTsKK30KKworLnVpLWRhdGVwaWNrZXIgc2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsCisudWktZGF0ZXBpY2tlciBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIHsKKyAgICB3aWR0aDogNDklOworfQorCisudWktZGF0ZXBpY2tlciB0YWJsZSB7CisgICAgd2lkdGg6IDEwMCU7CisgICAgZm9udC1zaXplOiAuOWVtOworICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisgICAgbWFyZ2luOiAwIDAgLjRlbTsKK30KKworLnVpLWRhdGVwaWNrZXIgdGggeworICAgIHBhZGRpbmc6IC43ZW0gLjNlbTsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgYm9yZGVyOiAwOworfQorCisudWktZGF0ZXBpY2tlciB0ZCB7CisgICAgYm9yZGVyOiAwOworICAgIHBhZGRpbmc6IDFweDsKK30KKworLnVpLWRhdGVwaWNrZXIgdGQgc3BhbiwgLnVpLWRhdGVwaWNrZXIgdGQgYSB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgcGFkZGluZzogLjJlbTsKKyAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgeworICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CisgICAgbWFyZ2luOiAuN2VtIDAgMCAwOworICAgIHBhZGRpbmc6IDAgLjJlbTsKKyAgICBib3JkZXItbGVmdDogMDsKKyAgICBib3JkZXItcmlnaHQ6IDA7CisgICAgYm9yZGVyLWJvdHRvbTogMDsKK30KKworLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b24geworICAgIGZsb2F0OiByaWdodDsKKyAgICBtYXJnaW46IC41ZW0gLjJlbSAuNGVtOworICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgICBwYWRkaW5nOiAuMmVtIC42ZW0gLjNlbSAuNmVtOworICAgIHdpZHRoOiBhdXRvOworICAgIG92ZXJmbG93OiB2aXNpYmxlOworfQorCisudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbi51aS1kYXRlcGlja2VyLWN1cnJlbnQgeworICAgIGZsb2F0OiBsZWZ0OworfQorCisvKiB3aXRoIG11bHRpcGxlIGNhbGVuZGFycyAqLworLnVpLWRhdGVwaWNrZXIudWktZGF0ZXBpY2tlci1tdWx0aSB7CisgICAgd2lkdGg6IGF1dG87Cit9CisKKy51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwIHsKKyAgICBmbG9hdDogbGVmdDsKK30KKworLnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAgdGFibGUgeworICAgIHdpZHRoOiA5NSU7CisgICAgbWFyZ2luOiAwIGF1dG8gLjRlbTsKK30KKworLnVpLWRhdGVwaWNrZXItbXVsdGktMiAudWktZGF0ZXBpY2tlci1ncm91cCB7CisgICAgd2lkdGg6IDUwJTsKK30KKworLnVpLWRhdGVwaWNrZXItbXVsdGktMyAudWktZGF0ZXBpY2tlci1ncm91cCB7CisgICAgd2lkdGg6IDMzLjMlOworfQorCisudWktZGF0ZXBpY2tlci1tdWx0aS00IC51aS1kYXRlcGlja2VyLWdyb3VwIHsKKyAgICB3aWR0aDogMjUlOworfQorCisudWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IC51aS1kYXRlcGlja2VyLWhlYWRlciB7CisgICAgYm9yZGVyLWxlZnQtd2lkdGg6IDA7Cit9CisKKy51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSAudWktZGF0ZXBpY2tlci1oZWFkZXIgeworICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAwOworfQorCisudWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIHsKKyAgICBjbGVhcjogbGVmdDsKK30KKworLnVpLWRhdGVwaWNrZXItcm93LWJyZWFrIHsKKyAgICBjbGVhcjogYm90aDsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBmb250LXNpemU6IDBlbTsKK30KKworLyogUlRMIHN1cHBvcnQgKi8KKy51aS1kYXRlcGlja2VyLXJ0bCB7CisgICAgZGlyZWN0aW9uOiBydGw7Cit9CisKKy51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1wcmV2IHsKKyAgICByaWdodDogMnB4OworICAgIGxlZnQ6IGF1dG87Cit9CisKKy51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1uZXh0IHsKKyAgICBsZWZ0OiAycHg7CisgICAgcmlnaHQ6IGF1dG87Cit9CisKKy51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1wcmV2OmhvdmVyIHsKKyAgICByaWdodDogMXB4OworICAgIGxlZnQ6IGF1dG87Cit9CisKKy51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1uZXh0OmhvdmVyIHsKKyAgICBsZWZ0OiAxcHg7CisgICAgcmlnaHQ6IGF1dG87Cit9CisKKy51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIHsKKyAgICBjbGVhcjogcmlnaHQ7Cit9CisKKy51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbiB7CisgICAgZmxvYXQ6IGxlZnQ7Cit9CisKKy51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbi51aS1kYXRlcGlja2VyLWN1cnJlbnQgeworICAgIGZsb2F0OiByaWdodDsKK30KKworLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3VwIHsKKyAgICBmbG9hdDogcmlnaHQ7Cit9CisKKy51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IC51aS1kYXRlcGlja2VyLWhlYWRlciB7CisgICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAwOworICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7Cit9CisKKy51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUgLnVpLWRhdGVwaWNrZXItaGVhZGVyIHsKKyAgICBib3JkZXItcmlnaHQtd2lkdGg6IDA7CisgICAgYm9yZGVyLWxlZnQtd2lkdGg6IDFweDsKK30KKworLyogSUU2IElGUkFNRSBGSVggKHRha2VuIGZyb20gZGF0ZXBpY2tlciAxLjUuMyAqLworLnVpLWRhdGVwaWNrZXItY292ZXIgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgLyptdXN0IGhhdmUqLworICAgIHotaW5kZXg6IC0xOyAvKm11c3QgaGF2ZSovCisgICAgZmlsdGVyOiBtYXNrKCk7IC8qbXVzdCBoYXZlKi8KKyAgICB0b3A6IC00cHg7IC8qbXVzdCBoYXZlKi8KKyAgICBsZWZ0OiAtNHB4OyAvKm11c3QgaGF2ZSovCisgICAgd2lkdGg6IDIwMHB4OyAvKm11c3QgaGF2ZSovCisgICAgaGVpZ2h0OiAyMDBweDsgLyptdXN0IGhhdmUqLworfQorCisudWktZGlhbG9nIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAwOworICAgIGxlZnQ6IDA7CisgICAgcGFkZGluZzsKKyAgICBwYWRkaW5nOiAuMmVtOworICAgIHdpZHRoOiAzMDBweDsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworfQorCisudWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXIgeworICAgIHBhZGRpbmc6IC40ZW0gMWVtOworICAgIGhlaWdodDogMTZweDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKy51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZSB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgbWFyZ2luOiAuMWVtIDE2cHggLjFlbSAwOworfQorCisudWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2UgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICByaWdodDogLjNlbTsKKyAgICB0b3A6IDUwJTsKKyAgICB3aWR0aDogMTlweDsKKyAgICBtYXJnaW46IC0xMHB4IDAgMCAwOworICAgIHBhZGRpbmc6IDFweDsKKyAgICBoZWlnaHQ6IDE4cHg7Cit9CisKKy8qLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIHNwYW4geyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiAxcHg7IH0qLworLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlOmhvdmVyLCAudWktZGlhbG9nIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2U6Zm9jdXMgeworICAgIHBhZGRpbmc6IDA7Cit9CisKKy51aS1kaWFsb2cgLnVpLWRpYWxvZy1jb250ZW50IHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgYm9yZGVyOiAwOworICAgIHBhZGRpbmc6IC41ZW0gMWVtOworICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgb3ZlcmZsb3c6IGF1dG87CisgICAgem9vbTogMTsKK30KKworLnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgeworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgYm9yZGVyLXdpZHRoOiAxcHggMCAwIDA7CisgICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKKyAgICBtYXJnaW46IC41ZW0gMCAwIDA7CisgICAgcGFkZGluZzogLjNlbSAxZW0gLjVlbSAuNGVtOworfQorCisudWktZGlhbG9nIC51aS1kaWFsb2ctYnV0dG9ucGFuZSAudWktZGlhbG9nLWJ1dHRvbnNldCB7CisgICAgZmxvYXQ6IHJpZ2h0OworfQorCisudWktZGlhbG9nIC51aS1kaWFsb2ctYnV0dG9ucGFuZSBidXR0b24geworICAgIG1hcmdpbjogLjVlbSAuNGVtIC41ZW0gMDsKKyAgICBjdXJzb3I6IHBvaW50ZXI7Cit9CisKKy51aS1kaWFsb2cgLnVpLXJlc2l6YWJsZS1zZSB7CisgICAgd2lkdGg6IDE0cHg7CisgICAgaGVpZ2h0OiAxNHB4OworICAgIHJpZ2h0OiAzcHg7CisgICAgYm90dG9tOiAzcHg7Cit9CisKKy51aS1kcmFnZ2FibGUgLnVpLWRpYWxvZy10aXRsZWJhciB7CisgICAgY3Vyc29yOiBtb3ZlOworfQorCisudWktbWVudSB7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICBwYWRkaW5nOiAycHg7CisgICAgbWFyZ2luOiAwOworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIG91dGxpbmU6IG5vbmU7Cit9CisKKy51aS1tZW51IC51aS1tZW51IHsKKyAgICBtYXJnaW4tdG9wOiAtM3B4OworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKK30KKworLnVpLW1lbnUgLnVpLW1lbnUtaXRlbSB7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgem9vbTogMTsKKyAgICB3aWR0aDogMTAwJTsKK30KKworLnVpLW1lbnUgLnVpLW1lbnUtZGl2aWRlciB7CisgICAgbWFyZ2luOiA1cHggLTJweCA1cHggLTJweDsKKyAgICBoZWlnaHQ6IDA7CisgICAgZm9udC1zaXplOiAwOworICAgIGxpbmUtaGVpZ2h0OiAwOworICAgIGJvcmRlci13aWR0aDogMXB4IDAgMCAwOworfQorCisudWktbWVudSAudWktbWVudS1pdGVtIGEgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBwYWRkaW5nOiAycHggLjRlbTsKKyAgICBsaW5lLWhlaWdodDogMS41OworICAgIHpvb206IDE7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKK30KKworLnVpLW1lbnUgLnVpLW1lbnUtaXRlbSBhLnVpLXN0YXRlLWZvY3VzLAorLnVpLW1lbnUgLnVpLW1lbnUtaXRlbSBhLnVpLXN0YXRlLWFjdGl2ZSB7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IC0xcHg7Cit9CisKKy51aS1tZW51IC51aS1zdGF0ZS1kaXNhYmxlZCB7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBtYXJnaW46IC40ZW0gMCAuMmVtOworICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cit9CisKKy51aS1tZW51IC51aS1zdGF0ZS1kaXNhYmxlZCBhIHsKKyAgICBjdXJzb3I6IGRlZmF1bHQ7Cit9CisKKy8qIGljb24gc3VwcG9ydCAqLworLnVpLW1lbnUtaWNvbnMgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworLnVpLW1lbnUtaWNvbnMgLnVpLW1lbnUtaXRlbSBhIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgcGFkZGluZy1sZWZ0OiAyZW07Cit9CisKKy8qIGxlZnQtYWxpZ25lZCAqLworLnVpLW1lbnUgLnVpLWljb24geworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC4yZW07CisgICAgbGVmdDogLjJlbTsKK30KKworLyogcmlnaHQtYWxpZ25lZCAqLworLnVpLW1lbnUgLnVpLW1lbnUtaWNvbiB7CisgICAgcG9zaXRpb246IHN0YXRpYzsKKyAgICBmbG9hdDogcmlnaHQ7Cit9CisKKy51aS1wcm9ncmVzc2JhciB7CisgICAgaGVpZ2h0OiAyZW07CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworfQorCisudWktcHJvZ3Jlc3NiYXIgLnVpLXByb2dyZXNzYmFyLXZhbHVlIHsKKyAgICBtYXJnaW46IC0xcHg7CisgICAgaGVpZ2h0OiAxMDAlOworfQorCisudWktc2xpZGVyIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKK30KKworLnVpLXNsaWRlciAudWktc2xpZGVyLWhhbmRsZSB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHotaW5kZXg6IDI7CisgICAgd2lkdGg6IDEuMmVtOworICAgIGhlaWdodDogMS4yZW07CisgICAgY3Vyc29yOiBkZWZhdWx0OworfQorCisudWktc2xpZGVyIC51aS1zbGlkZXItcmFuZ2UgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB6LWluZGV4OiAxOworICAgIGZvbnQtc2l6ZTogLjdlbTsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBib3JkZXI6IDA7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOworfQorCisudWktc2xpZGVyLWhvcml6b250YWwgeworICAgIGhlaWdodDogLjhlbTsKK30KKworLnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItaGFuZGxlIHsKKyAgICB0b3A6IC0uM2VtOworICAgIG1hcmdpbi1sZWZ0OiAtLjZlbTsKK30KKworLnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2UgeworICAgIHRvcDogMDsKKyAgICBoZWlnaHQ6IDEwMCU7Cit9CisKKy51aS1zbGlkZXItaG9yaXpvbnRhbCAudWktc2xpZGVyLXJhbmdlLW1pbiB7CisgICAgbGVmdDogMDsKK30KKworLnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2UtbWF4IHsKKyAgICByaWdodDogMDsKK30KKworLnVpLXNsaWRlci12ZXJ0aWNhbCB7CisgICAgd2lkdGg6IC44ZW07CisgICAgaGVpZ2h0OiAxMDBweDsKK30KKworLnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLWhhbmRsZSB7CisgICAgbGVmdDogLS4zZW07CisgICAgbWFyZ2luLWxlZnQ6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogLS42ZW07Cit9CisKKy51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1yYW5nZSB7CisgICAgbGVmdDogMDsKKyAgICB3aWR0aDogMTAwJTsKK30KKworLnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdlLW1pbiB7CisgICAgYm90dG9tOiAwOworfQorCisudWktc2xpZGVyLXZlcnRpY2FsIC51aS1zbGlkZXItcmFuZ2UtbWF4IHsKKyAgICB0b3A6IDA7Cit9CisKKy51aS1zcGlubmVyIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgcGFkZGluZzogMDsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCisudWktc3Bpbm5lci1pbnB1dCB7CisgICAgYm9yZGVyOiBub25lOworICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgcGFkZGluZzogMDsKKyAgICBtYXJnaW46IC4yZW0gMDsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgIG1hcmdpbi1sZWZ0OiAuNGVtOworICAgIG1hcmdpbi1yaWdodDogMjJweDsKK30KKworLnVpLXNwaW5uZXItYnV0dG9uIHsKKyAgICB3aWR0aDogMTZweDsKKyAgICBoZWlnaHQ6IDUwJTsKKyAgICBmb250LXNpemU6IC41ZW07CisgICAgcGFkZGluZzogMDsKKyAgICBtYXJnaW46IDA7CisgICAgei1pbmRleDogMTAwOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgY3Vyc29yOiBkZWZhdWx0OworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIG92ZXJmbG93OiBoaWRkZW47CisgICAgcmlnaHQ6IDA7Cit9CisKKy51aS1zcGlubmVyIGEudWktc3Bpbm5lci1idXR0b24geworICAgIGJvcmRlci10b3A6IG5vbmU7CisgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKyAgICBib3JkZXItcmlnaHQ6IG5vbmU7Cit9CisKKy8qIG1vcmUgc3BlY2lmaWNpdHkgcmVxdWlyZWQgaGVyZSB0byBvdmVyaWRlIGRlZmF1bHQgYm9yZGVycyAqLworLnVpLXNwaW5uZXIgLnVpLWljb24geworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICBtYXJnaW4tdG9wOiAtOHB4OworICAgIHRvcDogNTAlOworICAgIGxlZnQ6IDA7Cit9CisKKy8qIHZlcnRpY2FsIGNlbnRyZSBpY29uICovCisudWktc3Bpbm5lci11cCB7CisgICAgdG9wOiAwOworfQorCisudWktc3Bpbm5lci1kb3duIHsKKyAgICBib3R0b206IDA7Cit9CisKKy8qIFRSIG92ZXJyaWRlcyAqLworc3Bhbi51aS1zcGlubmVyIHsKKyAgICBiYWNrZ3JvdW5kOiBub25lOworfQorCisudWktc3Bpbm5lciAudWktaWNvbi10cmlhbmdsZS0xLXMgeworICAgIC8qIG5lZWQgdG8gZml4IGljb25zIHNwcml0ZSAqLworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC02NXB4IC0xNnB4OworfQorCisudWktdGFicyB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHBhZGRpbmc6IC4yZW07CisgICAgem9vbTogMTsKK30KKworLyogcG9zaXRpb246IHJlbGF0aXZlIHByZXZlbnRzIElFIHNjcm9sbCBidWcgKGVsZW1lbnQgd2l0aCBwb3NpdGlvbjogcmVsYXRpdmUgaW5zaWRlIGNvbnRhaW5lciB3aXRoIG92ZXJmbG93OiBhdXRvIGFwcGVhciBhcyAiZml4ZWQiKSAqLworLnVpLXRhYnMgLnVpLXRhYnMtbmF2IHsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogLjJlbSAuMmVtIDA7Cit9CisKKy51aS10YWJzIC51aS10YWJzLW5hdiBsaSB7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgdG9wOiAwOworICAgIG1hcmdpbjogMXB4IC4yZW0gMCAwOworICAgIGJvcmRlci1ib3R0b206IDA7CisgICAgcGFkZGluZzogMDsKKyAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisudWktdGFicyAudWktdGFicy1uYXYgbGkgYSB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgcGFkZGluZzogLjVlbSAxZW07CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisudWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1hY3RpdmUgeworICAgIG1hcmdpbi1ib3R0b206IC0xcHg7CisgICAgcGFkZGluZy1ib3R0b206IDFweDsKK30KKworLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZlIGEsIC51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS1zdGF0ZS1kaXNhYmxlZCBhLCAudWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1sb2FkaW5nIGEgeworICAgIGN1cnNvcjogdGV4dDsKK30KKworLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGEsIC51aS10YWJzLWNvbGxhcHNpYmxlIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWFjdGl2ZSBhIHsKKyAgICBjdXJzb3I6IHBvaW50ZXI7Cit9CisKKy8qIGZpcnN0IHNlbGVjdG9yIGluIGdyb3VwIHNlZW1zIG9ic29sZXRlLCBidXQgcmVxdWlyZWQgdG8gb3ZlcmNvbWUgYnVnIGluIE9wZXJhIGFwcGx5aW5nIGN1cnNvcjogdGV4dCBvdmVyYWxsIGlmIGRlZmluZWQgZWxzZXdoZXJlLi4uICovCisudWktdGFicyAudWktdGFicy1wYW5lbCB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgYm9yZGVyLXdpZHRoOiAwOworICAgIHBhZGRpbmc6IDFlbSAxLjRlbTsKKyAgICBiYWNrZ3JvdW5kOiBub25lOworfQorCisudWktdG9vbHRpcCB7CisgICAgcGFkZGluZzogOHB4OworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB6LWluZGV4OiA5OTk5OworICAgIC1vLWJveC1zaGFkb3c6IDAgMCA1cHggI2FhYTsKKyAgICAtbW96LWJveC1zaGFkb3c6IDAgMCA1cHggI2FhYTsKKyAgICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA1cHggI2FhYTsKKyAgICBib3gtc2hhZG93OiAwIDAgNXB4ICNhYWE7Cit9CisKKy8qIEZhZGVzIGFuZCBiYWNrZ3JvdW5kLWltYWdlcyBkb24ndCB3b3JrIHdlbGwgdG9nZXRoZXIgaW4gSUU2LCBkcm9wIHRoZSBpbWFnZSAqLworKiBodG1sIC51aS10b29sdGlwIHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOworfQorCitib2R5IC51aS10b29sdGlwIHsKKyAgICBib3JkZXItd2lkdGg6IDJweDsKK30KKworLyogQ29tcG9uZW50IGNvbnRhaW5lcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLnVpLXdpZGdldCB7CisgICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOworICAgIGZvbnQtc2l6ZTogMS4xZW07Cit9CisKKy51aS13aWRnZXQgLnVpLXdpZGdldCB7CisgICAgZm9udC1zaXplOiAxZW07Cit9CisKKy51aS13aWRnZXQgaW5wdXQsIC51aS13aWRnZXQgc2VsZWN0LCAudWktd2lkZ2V0IHRleHRhcmVhLCAudWktd2lkZ2V0IGJ1dHRvbiB7CisgICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOworICAgIGZvbnQtc2l6ZTogMWVtOworfQorCisudWktd2lkZ2V0LWNvbnRlbnQgeworICAgIGJvcmRlcjogMXB4IHNvbGlkICNhYWFhYWE7CisgICAgYmFja2dyb3VuZDogI2ZmZmZmZiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvdWktYmdfZmxhdF83NV9mZmZmZmZfNDB4MTAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsKKyAgICBjb2xvcjogIzIyMjIyMjsKK30KKworLnVpLXdpZGdldC1jb250ZW50IGEgeworICAgIGNvbG9yOiAjMjIyMjIyOworfQorCisudWktd2lkZ2V0LWhlYWRlciB7CisgICAgYm9yZGVyOiAxcHggc29saWQgI2FhYWFhYTsKKyAgICBiYWNrZ3JvdW5kOiAjY2NjY2NjIHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF83NV9jY2NjY2NfMXgxMDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OworICAgIGNvbG9yOiAjMjIyMjIyOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisudWktd2lkZ2V0LWhlYWRlciBhIHsKKyAgICBjb2xvcjogIzIyMjIyMjsKK30KKworLyogSW50ZXJhY3Rpb24gc3RhdGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy51aS1zdGF0ZS1kZWZhdWx0LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWRlZmF1bHQsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1kZWZhdWx0IHsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjZDNkM2QzOworICAgIGJhY2tncm91bmQ6ICNlNmU2ZTYgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2dsYXNzXzc1X2U2ZTZlNl8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBjb2xvcjogIzU1NTU1NTsKK30KKworLnVpLXN0YXRlLWRlZmF1bHQgYSwgLnVpLXN0YXRlLWRlZmF1bHQgYTpsaW5rLCAudWktc3RhdGUtZGVmYXVsdCBhOnZpc2l0ZWQgeworICAgIGNvbG9yOiAjNTU1NTU1OworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLnVpLXN0YXRlLWhvdmVyLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhvdmVyLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaG92ZXIsIC51aS1zdGF0ZS1mb2N1cywgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1mb2N1cywgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWZvY3VzIHsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OTk5OworICAgIGJhY2tncm91bmQ6ICNkYWRhZGEgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2dsYXNzXzc1X2RhZGFkYV8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBjb2xvcjogIzIxMjEyMTsKK30KKworLnVpLXN0YXRlLWhvdmVyIGEsIC51aS1zdGF0ZS1ob3ZlciBhOmhvdmVyIHsKKyAgICBjb2xvcjogIzIxMjEyMTsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy51aS1zdGF0ZS1hY3RpdmUsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtYWN0aXZlLCAudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtYWN0aXZlIHsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjYWFhYWFhOworICAgIGJhY2tncm91bmQ6ICNmZmZmZmYgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2dsYXNzXzY1X2ZmZmZmZl8xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICBjb2xvcjogIzIxMjEyMTsKK30KKworLnVpLXN0YXRlLWFjdGl2ZSBhLCAudWktc3RhdGUtYWN0aXZlIGE6bGluaywgLnVpLXN0YXRlLWFjdGl2ZSBhOnZpc2l0ZWQgeworICAgIGNvbG9yOiAjMjEyMTIxOworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLyogSW50ZXJhY3Rpb24gQ3VlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisudWktc3RhdGUtaGlnaGxpZ2h0LCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhpZ2hsaWdodCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodCB7CisgICAgYm9yZGVyOiAxcHggc29saWQgI2ZjZWZhMTsKKyAgICBiYWNrZ3JvdW5kOiAjZmJmOWVlIHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy91aS1iZ19nbGFzc181NV9mYmY5ZWVfMXg0MDAucG5nKSA1MCUgNTAlIHJlcGVhdC14OworICAgIGNvbG9yOiAjMzYzNjM2OworfQorCisudWktc3RhdGUtaGlnaGxpZ2h0IGEsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0IGEsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1oaWdobGlnaHQgYSB7CisgICAgY29sb3I6ICMzNjM2MzY7Cit9CisKKy51aS1zdGF0ZS1lcnJvciwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1lcnJvciwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yIHsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjY2QwYTBhOworICAgIGJhY2tncm91bmQ6ICNmZWYxZWMgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2dsYXNzXzk1X2ZlZjFlY18xeDQwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7CisgICAgY29sb3I6ICNjZDBhMGE7Cit9CisKKy51aS1zdGF0ZS1lcnJvciBhLCAudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yIGEsIC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvciBhIHsKKyAgICBjb2xvcjogI2NkMGEwYTsKK30KKworLnVpLXN0YXRlLWVycm9yLXRleHQsIC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3ItdGV4dCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9yLXRleHQgeworICAgIGNvbG9yOiAjY2QwYTBhOworfQorCisudWktcHJpb3JpdHktcHJpbWFyeSwgLnVpLXdpZGdldC1jb250ZW50IC51aS1wcmlvcml0eS1wcmltYXJ5LCAudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktcHJpbWFyeSB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy51aS1wcmlvcml0eS1zZWNvbmRhcnksIC51aS13aWRnZXQtY29udGVudCAudWktcHJpb3JpdHktc2Vjb25kYXJ5LCAudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktc2Vjb25kYXJ5IHsKKyAgICBvcGFjaXR5OiAuNzsKKyAgICBmaWx0ZXI6IEFscGhhKE9wYWNpdHk9NzApOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7Cit9CisKKy51aS1zdGF0ZS1kaXNhYmxlZCwgLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1kaXNhYmxlZCwgLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRpc2FibGVkIHsKKyAgICBvcGFjaXR5OiAuMzU7CisgICAgZmlsdGVyOiBBbHBoYShPcGFjaXR5PTM1KTsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOworfQorCisvKiBJY29ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHN0YXRlcyBhbmQgaW1hZ2VzICovCisudWktaWNvbiB7CisgICAgd2lkdGg6IDE2cHg7CisgICAgaGVpZ2h0OiAxNnB4OworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy91aS1pY29uc18yMjIyMjJfMjU2eDI0MC5wbmcpOworfQorCisudWktd2lkZ2V0LWNvbnRlbnQgLnVpLWljb24geworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy91aS1pY29uc18yMjIyMjJfMjU2eDI0MC5wbmcpOworfQorCisudWktd2lkZ2V0LWhlYWRlciAudWktaWNvbiB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyk7Cit9CisKKy51aS1zdGF0ZS1kZWZhdWx0IC51aS1pY29uIHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvdWktaWNvbnNfODg4ODg4XzI1NngyNDAucG5nKTsKK30KKworLnVpLXN0YXRlLWhvdmVyIC51aS1pY29uLCAudWktc3RhdGUtZm9jdXMgLnVpLWljb24geworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy91aS1pY29uc180NTQ1NDVfMjU2eDI0MC5wbmcpOworfQorCisudWktc3RhdGUtYWN0aXZlIC51aS1pY29uIHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvdWktaWNvbnNfNDU0NTQ1XzI1NngyNDAucG5nKTsKK30KKworLnVpLXN0YXRlLWhpZ2hsaWdodCAudWktaWNvbiB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWljb25zXzJlODNmZl8yNTZ4MjQwLnBuZyk7Cit9CisKKy51aS1zdGF0ZS1lcnJvciAudWktaWNvbiwgLnVpLXN0YXRlLWVycm9yLXRleHQgLnVpLWljb24geworICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy91aS1pY29uc19jZDBhMGFfMjU2eDI0MC5wbmcpOworfQorCisvKiBwb3NpdGlvbmluZyAqLworLnVpLWljb24tY2FyYXQtMS1uIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7Cit9CisKKy51aS1pY29uLWNhcmF0LTEtbmUgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IDA7Cit9CisKKy51aS1pY29uLWNhcmF0LTEtZSB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggMDsKK30KKworLnVpLWljb24tY2FyYXQtMS1zZSB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggMDsKK30KKworLnVpLWljb24tY2FyYXQtMS1zIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAwOworfQorCisudWktaWNvbi1jYXJhdC0xLXN3IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAwOworfQorCisudWktaWNvbi1jYXJhdC0xLXcgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IDA7Cit9CisKKy51aS1pY29uLWNhcmF0LTEtbncgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAwOworfQorCisudWktaWNvbi1jYXJhdC0yLW4tcyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IDA7Cit9CisKKy51aS1pY29uLWNhcmF0LTItZS13IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggMDsKK30KKworLnVpLWljb24tdHJpYW5nbGUtMS1uIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNnB4OworfQorCisudWktaWNvbi10cmlhbmdsZS0xLW5lIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTZweDsKK30KKworLnVpLWljb24tdHJpYW5nbGUtMS1lIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTZweDsKK30KKworLnVpLWljb24tdHJpYW5nbGUtMS1zZSB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE2cHg7Cit9CisKKy51aS1pY29uLXRyaWFuZ2xlLTEtcyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE2cHg7Cit9CisKKy51aS1pY29uLXRyaWFuZ2xlLTEtc3cgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNnB4OworfQorCisudWktaWNvbi10cmlhbmdsZS0xLXcgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNnB4OworfQorCisudWktaWNvbi10cmlhbmdsZS0xLW53IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE2cHg7Cit9CisKKy51aS1pY29uLXRyaWFuZ2xlLTItbi1zIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE2cHg7Cit9CisKKy51aS1pY29uLXRyaWFuZ2xlLTItZS13IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTE2cHg7Cit9CisKKy51aS1pY29uLWFycm93LTEtbiB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMzJweDsKK30KKworLnVpLWljb24tYXJyb3ctMS1uZSB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTMycHg7Cit9CisKKy51aS1pY29uLWFycm93LTEtZSB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTMycHg7Cit9CisKKy51aS1pY29uLWFycm93LTEtc2UgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0zMnB4OworfQorCisudWktaWNvbi1hcnJvdy0xLXMgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0zMnB4OworfQorCisudWktaWNvbi1hcnJvdy0xLXN3IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMzJweDsKK30KKworLnVpLWljb24tYXJyb3ctMS13IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMzJweDsKK30KKworLnVpLWljb24tYXJyb3ctMS1udyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0zMnB4OworfQorCisudWktaWNvbi1hcnJvdy0yLW4tcyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0zMnB4OworfQorCisudWktaWNvbi1hcnJvdy0yLW5lLXN3IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTMycHg7Cit9CisKKy51aS1pY29uLWFycm93LTItZS13IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTMycHg7Cit9CisKKy51aS1pY29uLWFycm93LTItc2UtbncgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMzJweDsKK30KKworLnVpLWljb24tYXJyb3dzdG9wLTEtbiB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0zMnB4OworfQorCisudWktaWNvbi1hcnJvd3N0b3AtMS1lIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTMycHg7Cit9CisKKy51aS1pY29uLWFycm93c3RvcC0xLXMgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMzJweDsKK30KKworLnVpLWljb24tYXJyb3dzdG9wLTEtdyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC0zMnB4OworfQorCisudWktaWNvbi1hcnJvd3RoaWNrLTEtbiB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNDhweDsKK30KKworLnVpLWljb24tYXJyb3d0aGljay0xLW5lIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtNDhweDsKK30KKworLnVpLWljb24tYXJyb3d0aGljay0xLWUgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC00OHB4OworfQorCisudWktaWNvbi1hcnJvd3RoaWNrLTEtc2UgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC00OHB4OworfQorCisudWktaWNvbi1hcnJvd3RoaWNrLTEtcyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTQ4cHg7Cit9CisKKy51aS1pY29uLWFycm93dGhpY2stMS1zdyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTQ4cHg7Cit9CisKKy51aS1pY29uLWFycm93dGhpY2stMS13IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtNDhweDsKK30KKworLnVpLWljb24tYXJyb3d0aGljay0xLW53IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTQ4cHg7Cit9CisKKy51aS1pY29uLWFycm93dGhpY2stMi1uLXMgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtNDhweDsKK30KKworLnVpLWljb24tYXJyb3d0aGljay0yLW5lLXN3IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTQ4cHg7Cit9CisKKy51aS1pY29uLWFycm93dGhpY2stMi1lLXcgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtNDhweDsKK30KKworLnVpLWljb24tYXJyb3d0aGljay0yLXNlLW53IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTQ4cHg7Cit9CisKKy51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtbiB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC00OHB4OworfQorCisudWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLWUgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtNDhweDsKK30KKworLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1zIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTQ4cHg7Cit9CisKKy51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtdyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC00OHB4OworfQorCisudWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtdyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNjRweDsKK30KKworLnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLW4geworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC02NHB4OworfQorCisudWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtZSB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTY0cHg7Cit9CisKKy51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1zIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtNjRweDsKK30KKworLnVpLWljb24tYXJyb3dyZXR1cm4tMS13IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtNjRweDsKK30KKworLnVpLWljb24tYXJyb3dyZXR1cm4tMS1uIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtNjRweDsKK30KKworLnVpLWljb24tYXJyb3dyZXR1cm4tMS1lIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtNjRweDsKK30KKworLnVpLWljb24tYXJyb3dyZXR1cm4tMS1zIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTY0cHg7Cit9CisKKy51aS1pY29uLWFycm93cmVmcmVzaC0xLXcgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtNjRweDsKK30KKworLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtbiB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC02NHB4OworfQorCisudWktaWNvbi1hcnJvd3JlZnJlc2gtMS1lIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTY0cHg7Cit9CisKKy51aS1pY29uLWFycm93cmVmcmVzaC0xLXMgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtNjRweDsKK30KKworLnVpLWljb24tYXJyb3ctNCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtODBweDsKK30KKworLnVpLWljb24tYXJyb3ctNC1kaWFnIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtODBweDsKK30KKworLnVpLWljb24tZXh0bGluayB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTgwcHg7Cit9CisKKy51aS1pY29uLW5ld3dpbiB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTgwcHg7Cit9CisKKy51aS1pY29uLXJlZnJlc2ggeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC04MHB4OworfQorCisudWktaWNvbi1zaHVmZmxlIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtODBweDsKK30KKworLnVpLWljb24tdHJhbnNmZXItZS13IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtODBweDsKK30KKworLnVpLWljb24tdHJhbnNmZXJ0aGljay1lLXcgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtODBweDsKK30KKworLnVpLWljb24tZm9sZGVyLWNvbGxhcHNlZCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtOTZweDsKK30KKworLnVpLWljb24tZm9sZGVyLW9wZW4geworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC05NnB4OworfQorCisudWktaWNvbi1kb2N1bWVudCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTk2cHg7Cit9CisKKy51aS1pY29uLWRvY3VtZW50LWIgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC05NnB4OworfQorCisudWktaWNvbi1ub3RlIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtOTZweDsKK30KKworLnVpLWljb24tbWFpbC1jbG9zZWQgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC05NnB4OworfQorCisudWktaWNvbi1tYWlsLW9wZW4geworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC05NnB4OworfQorCisudWktaWNvbi1zdWl0Y2FzZSB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC05NnB4OworfQorCisudWktaWNvbi1jb21tZW50IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTk2cHg7Cit9CisKKy51aS1pY29uLXBlcnNvbiB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC05NnB4OworfQorCisudWktaWNvbi1wcmludCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC05NnB4OworfQorCisudWktaWNvbi10cmFzaCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC05NnB4OworfQorCisudWktaWNvbi1sb2NrZWQgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtOTZweDsKK30KKworLnVpLWljb24tdW5sb2NrZWQgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtOTZweDsKK30KKworLnVpLWljb24tYm9va21hcmsgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtOTZweDsKK30KKworLnVpLWljb24tdGFnIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTk2cHg7Cit9CisKKy51aS1pY29uLWhvbWUgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTExMnB4OworfQorCisudWktaWNvbi1mbGFnIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTEycHg7Cit9CisKKy51aS1pY29uLWNhbGVuZGFyIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTEycHg7Cit9CisKKy51aS1pY29uLWNhcnQgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xMTJweDsKK30KKworLnVpLWljb24tcGVuY2lsIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTEycHg7Cit9CisKKy51aS1pY29uLWNsb2NrIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTEycHg7Cit9CisKKy51aS1pY29uLWRpc2sgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xMTJweDsKK30KKworLnVpLWljb24tY2FsY3VsYXRvciB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMTJweDsKK30KKworLnVpLWljb24tem9vbWluIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTExMnB4OworfQorCisudWktaWNvbi16b29tb3V0IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTExMnB4OworfQorCisudWktaWNvbi1zZWFyY2ggeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtMTEycHg7Cit9CisKKy51aS1pY29uLXdyZW5jaCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMTJweDsKK30KKworLnVpLWljb24tZ2VhciB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xMTJweDsKK30KKworLnVpLWljb24taGVhcnQgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTEycHg7Cit9CisKKy51aS1pY29uLXN0YXIgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMTEycHg7Cit9CisKKy51aS1pY29uLWxpbmsgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtMTEycHg7Cit9CisKKy51aS1pY29uLWNhbmNlbCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTI4cHg7Cit9CisKKy51aS1pY29uLXBsdXMgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xMjhweDsKK30KKworLnVpLWljb24tcGx1c3RoaWNrIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7Cit9CisKKy51aS1pY29uLW1pbnVzIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTI4cHg7Cit9CisKKy51aS1pY29uLW1pbnVzdGhpY2sgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xMjhweDsKK30KKworLnVpLWljb24tY2xvc2UgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xMjhweDsKK30KKworLnVpLWljb24tY2xvc2V0aGljayB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTEyOHB4OworfQorCisudWktaWNvbi1rZXkgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHg7Cit9CisKKy51aS1pY29uLWxpZ2h0YnVsYiB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsKK30KKworLnVpLWljb24tc2Npc3NvcnMgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTI4cHg7Cit9CisKKy51aS1pY29uLWNsaXBib2FyZCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xMjhweDsKK30KKworLnVpLWljb24tY29weSB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMjhweDsKK30KKworLnVpLWljb24tY29udGFjdCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xMjhweDsKK30KKworLnVpLWljb24taW1hZ2UgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTI4cHg7Cit9CisKKy51aS1pY29uLXZpZGVvIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTEyOHB4OworfQorCisudWktaWNvbi1zY3JpcHQgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtMTI4cHg7Cit9CisKKy51aS1pY29uLWFsZXJ0IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNDRweDsKK30KKworLnVpLWljb24taW5mbyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE0NHB4OworfQorCisudWktaWNvbi1ub3RpY2UgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNDRweDsKK30KKworLnVpLWljb24taGVscCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE0NHB4OworfQorCisudWktaWNvbi1jaGVjayB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE0NHB4OworfQorCisudWktaWNvbi1idWxsZXQgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNDRweDsKK30KKworLnVpLWljb24tcmFkaW8tb24geworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNDRweDsKK30KKworLnVpLWljb24tcmFkaW8tb2ZmIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE0NHB4OworfQorCisudWktaWNvbi1waW4tdyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xNDRweDsKK30KKworLnVpLWljb24tcGluLXMgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTQ0cHg7Cit9CisKKy51aS1pY29uLXBsYXkgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE2MHB4OworfQorCisudWktaWNvbi1wYXVzZSB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE2MHB4OworfQorCisudWktaWNvbi1zZWVrLW5leHQgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNjBweDsKK30KKworLnVpLWljb24tc2Vlay1wcmV2IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTYwcHg7Cit9CisKKy51aS1pY29uLXNlZWstZW5kIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTYwcHg7Cit9CisKKy51aS1pY29uLXNlZWstc3RhcnQgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNjBweDsKK30KKworLyogdWktaWNvbi1zZWVrLWZpcnN0IGlzIGRlcHJlY2F0ZWQsIHVzZSB1aS1pY29uLXNlZWstc3RhcnQgaW5zdGVhZCAqLworLnVpLWljb24tc2Vlay1maXJzdCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE2MHB4OworfQorCisudWktaWNvbi1zdG9wIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTYwcHg7Cit9CisKKy51aS1pY29uLWVqZWN0IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE2MHB4OworfQorCisudWktaWNvbi12b2x1bWUtb2ZmIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE2MHB4OworfQorCisudWktaWNvbi12b2x1bWUtb24geworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTYwcHg7Cit9CisKKy51aS1pY29uLXBvd2VyIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNzZweDsKK30KKworLnVpLWljb24tc2lnbmFsLWRpYWcgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xNzZweDsKK30KKworLnVpLWljb24tc2lnbmFsIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTc2cHg7Cit9CisKKy51aS1pY29uLWJhdHRlcnktMCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE3NnB4OworfQorCisudWktaWNvbi1iYXR0ZXJ5LTEgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xNzZweDsKK30KKworLnVpLWljb24tYmF0dGVyeS0yIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTc2cHg7Cit9CisKKy51aS1pY29uLWJhdHRlcnktMyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE3NnB4OworfQorCisudWktaWNvbi1jaXJjbGUtcGx1cyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTkycHg7Cit9CisKKy51aS1pY29uLWNpcmNsZS1taW51cyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE5MnB4OworfQorCisudWktaWNvbi1jaXJjbGUtY2xvc2UgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xOTJweDsKK30KKworLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLWUgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xOTJweDsKK30KKworLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLXMgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xOTJweDsKK30KKworLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLXcgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xOTJweDsKK30KKworLnVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLW4geworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xOTJweDsKK30KKworLnVpLWljb24tY2lyY2xlLWFycm93LWUgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTkycHg7Cit9CisKKy51aS1pY29uLWNpcmNsZS1hcnJvdy1zIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE5MnB4OworfQorCisudWktaWNvbi1jaXJjbGUtYXJyb3ctdyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xOTJweDsKK30KKworLnVpLWljb24tY2lyY2xlLWFycm93LW4geworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtMTkycHg7Cit9CisKKy51aS1pY29uLWNpcmNsZS16b29taW4geworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTkycHg7Cit9CisKKy51aS1pY29uLWNpcmNsZS16b29tb3V0IHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTE5MnB4OworfQorCisudWktaWNvbi1jaXJjbGUtY2hlY2sgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTkycHg7Cit9CisKKy51aS1pY29uLWNpcmNsZXNtYWxsLXBsdXMgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTIwOHB4OworfQorCisudWktaWNvbi1jaXJjbGVzbWFsbC1taW51cyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTIwOHB4OworfQorCisudWktaWNvbi1jaXJjbGVzbWFsbC1jbG9zZSB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTIwOHB4OworfQorCisudWktaWNvbi1zcXVhcmVzbWFsbC1wbHVzIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMjA4cHg7Cit9CisKKy51aS1pY29uLXNxdWFyZXNtYWxsLW1pbnVzIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMjA4cHg7Cit9CisKKy51aS1pY29uLXNxdWFyZXNtYWxsLWNsb3NlIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMjA4cHg7Cit9CisKKy51aS1pY29uLWdyaXAtZG90dGVkLXZlcnRpY2FsIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0yMjRweDsKK30KKworLnVpLWljb24tZ3JpcC1kb3R0ZWQtaG9yaXpvbnRhbCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTIyNHB4OworfQorCisudWktaWNvbi1ncmlwLXNvbGlkLXZlcnRpY2FsIHsKKyAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMjI0cHg7Cit9CisKKy51aS1pY29uLWdyaXAtc29saWQtaG9yaXpvbnRhbCB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTIyNHB4OworfQorCisudWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2UgeworICAgIGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0yMjRweDsKK30KKworLnVpLWljb24tZ3JpcC1kaWFnb25hbC1zZSB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTIyNHB4OworfQorCisvKiBNaXNjIHZpc3VhbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBDb3JuZXIgcmFkaXVzICovCisudWktY29ybmVyLWFsbCwgLnVpLWNvcm5lci10b3AsIC51aS1jb3JuZXItbGVmdCwgLnVpLWNvcm5lci10bCB7CisgICAgLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6IDRweDsKKyAgICAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsKKyAgICAta2h0bWwtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OworICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsKK30KKworLnVpLWNvcm5lci1hbGwsIC51aS1jb3JuZXItdG9wLCAudWktY29ybmVyLXJpZ2h0LCAudWktY29ybmVyLXRyIHsKKyAgICAtbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6IDRweDsKKyAgICAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7CisgICAgLWtodG1sLWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7CisgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsKK30KKworLnVpLWNvcm5lci1hbGwsIC51aS1jb3JuZXItYm90dG9tLCAudWktY29ybmVyLWxlZnQsIC51aS1jb3JuZXItYmwgeworICAgIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA0cHg7CisgICAgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CisgICAgLWtodG1sLWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKKyAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7Cit9CisKKy51aS1jb3JuZXItYWxsLCAudWktY29ybmVyLWJvdHRvbSwgLnVpLWNvcm5lci1yaWdodCwgLnVpLWNvcm5lci1iciB7CisgICAgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OiA0cHg7CisgICAgLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OworICAgIC1raHRtbC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OworICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7Cit9CisKKy8qIE92ZXJsYXlzICovCisudWktd2lkZ2V0LW92ZXJsYXkgeworICAgIGJhY2tncm91bmQ6ICNhYWFhYWEgdXJsKC9ibHVlbGlnaHQvaW1hZ2VzL3VpLWJnX2ZsYXRfMF9hYWFhYWFfNDB4MTAwLnBuZykgNTAlIDUwJSByZXBlYXQteDsKKyAgICBvcGFjaXR5OiAuMzsKKyAgICBmaWx0ZXI6IEFscGhhKE9wYWNpdHk9MzApOworfQorCisudWktd2lkZ2V0LXNoYWRvdyB7CisgICAgbWFyZ2luOiAtOHB4IDAgMCAtOHB4OworICAgIHBhZGRpbmc6IDhweDsKKyAgICBiYWNrZ3JvdW5kOiAjYWFhYWFhIHVybCgvYmx1ZWxpZ2h0L2ltYWdlcy91aS1iZ19mbGF0XzBfYWFhYWFhXzQweDEwMC5wbmcpIDUwJSA1MCUgcmVwZWF0LXg7CisgICAgb3BhY2l0eTogLjM7CisgICAgZmlsdGVyOiBBbHBoYShPcGFjaXR5PTMwKTsKKyAgICAtbW96LWJvcmRlci1yYWRpdXM6IDhweDsKKyAgICAta2h0bWwtYm9yZGVyLXJhZGl1czogOHB4OworICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogOHB4OworICAgIGJvcmRlci1yYWRpdXM6IDhweDsKK30KKworLyogQ2FsZW5kYXIgQnV0dG9uIGFuZCBJbWFnZSAqLworLnZpZXctY2FsZW5kYXIgYnV0dG9uIHsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoL2JsdWVsaWdodC9pbWFnZXMvY2FsLmdpZikgbm8tcmVwZWF0ICFpbXBvcnRhbnQ7CisgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOworICAgIGJvcmRlcjogbm9uZTsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogY2VudGVyOworICAgIG1hcmdpbi10b3A6IDNweDsKKyAgICBtYXJnaW4tbGVmdDogNnB4OworICAgIHdpZHRoOiAyMnB4OworICAgIGhlaWdodDogMjJweDsKK30KKworLyogY3NzIGZvciB0aW1lcGlja2VyICovCisudWktdGltZXBpY2tlci1kaXYgLnVpLXdpZGdldC1oZWFkZXIgeworICAgIG1hcmdpbi1ib3R0b206IDhweDsKK30KKworLnVpLXRpbWVwaWNrZXItZGl2IGRsIHsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisudWktdGltZXBpY2tlci1kaXYgZGwgZHQgeworICAgIGhlaWdodDogMjVweDsKKyAgICBtYXJnaW4tYm90dG9tOiAtMjVweDsKK30KKworLnVpLXRpbWVwaWNrZXItZGl2IGRsIGRkIHsKKyAgICBtYXJnaW46IDAgMTBweCAxMHB4IDY1cHg7Cit9CisKKy51aS10aW1lcGlja2VyLWRpdiB0ZCB7CisgICAgZm9udC1zaXplOiA5MCU7Cit9CisKKy51aS10cGlja2VyLWdyaWQtbGFiZWwgeworICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgYm9yZGVyOiBub25lOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT0gRm9yIHRoZSBxdWlja2FkZCBwYWdlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisucXVpY2thZGRhbGwgeworICAgIGZsb2F0OiByaWdodDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMWVtOworICAgIHBhZGRpbmctdG9wOiAxZW07Cit9CisKKy5xdWlja2FkZHRhYmxlIHsKKyAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgY2xlYXI6IGJvdGg7Cit9CisKKy5xdWlja2FkZHRhYmxlIHNwYW4geworICAgIGRpc3BsYXk6IGlubGluZTsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjOTk5OTk5OworICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjOTk5OTk5OworICAgIG1hcmdpbjogMHB4OworICAgIHBhZGRpbmc6IDNweDsKK30KKworLnF1aWNrYWRkdGFibGUgcCB7CisgICAgY2xlYXI6IGxlZnQ7CisgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CisgICAgaGVpZ2h0OiAxZW07Cit9CisKKy5xdWlja2FkZHRhYmxlIHNwYW4ucGlkIHsKKyAgICB3aWR0aDogMTAlOworfQorCisucXVpY2thZGR0YWJsZSBzcGFuLm5hbWUgeworICAgIHdpZHRoOiA1MCU7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKK30KKworLnF1aWNrYWRkdGFibGUgc3Bhbi5saXN0UHJpY2UgeworICAgIHdpZHRoOiAxMCUKK30KKworLnF1aWNrYWRkdGFibGUgc3Bhbi50b3RhbFByaWNlIHsKKyAgICB3aWR0aDogMTAlCit9CisKKy5xdWlja2FkZHRhYmxlIHNwYW4ucXR5IHsKKyAgICB3aWR0aDogMTAlCit9CisKKy8qc2V0IEpncm93bCBjc3MgaGVyZSB0byBhdm9pZCBzaWRlIGVmZmVjdCB3aXRoIG90aGVyIGNsYXNzKi8KKy5lcnJvck1lc3NhZ2VKR3Jvd2wgeworICAgIGJhY2tncm91bmQ6IHVybCgiL2JsdWVsaWdodC9pbWFnZXMvZXhjbGFtYXRpb24ucG5nIikgbm8tcmVwZWF0IHNjcm9sbCA1cHggNTAlICM4MjBmMDU7CisgICAgYm9yZGVyOiAzcHggc29saWQgI2YwZjBmMDsKKyAgICBjb2xvcjogI2ZmZmZmZjsKKyAgICBmb250LXNpemU6IDEuM2VtOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDUwcHg7CisgICAgbGluZS1oZWlnaHQ6IDEuM2VtOworICAgIG1pbi13aWR0aDogMzUwcHg7CisgICAgd29yZC13cmFwOiBicmVhay13b3JkOworICAgIGJveC1zaGFkb3c6IC0wcHggLTBweCAyMHB4IDVweCAjODg4ODg4OworICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworfQorCisuZXZlbnRNZXNzYWdlSkdyb3dsIHsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoIi9ibHVlbGlnaHQvaW1hZ2VzL2luZm9ybWF0aW9uLnBuZyIpIG5vLXJlcGVhdCBzY3JvbGwgNXB4IDUwJSAjMTA1ZmE4OworICAgIGJvcmRlcjogM3B4IHNvbGlkICNmMGYwZjA7CisgICAgY29sb3I6ICNmZmZmZmY7CisgICAgZm9udC1zaXplOiAxLjNlbTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBwYWRkaW5nOiAxMHB4IDEwcHggMTBweCA1MHB4OworICAgIGxpbmUtaGVpZ2h0OiAxLjNlbTsKKyAgICBtaW4td2lkdGg6IDM1MHB4OworICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKKyAgICBib3gtc2hhZG93OiAtMHB4IC0wcHggMjBweCA1cHggIzg4ODg4ODsKK30KKworLmNsb3NlQWxsSkdyb3dsIHsKKyAgICBtaW4td2lkdGg6IDM1MHB4OworICAgIHBhZGRpbmc6IDVweCA1cHggNXB4IDUwcHg7CisgICAgYm9yZGVyOiAxcHggc29saWQgI2YwZjBmMDsKK30KKworLmNvbnRlbnQtbWVzc2FnZXMgcCB7CisgICAgZGlzcGxheTogbm9uZTsKK30KKworLyogRnJvbSBodHRwOi8vanF1ZXJ5dWkuY29tL2RlbW9zL2F1dG9jb21wbGV0ZS9tYXhoZWlnaHQuaHRtbCAqLworLyogV2hlbiBkaXNwbGF5aW5nIGEgbG9uZyBsaXN0IG9mIG9wdGlvbnMsIHlvdSBjYW4gc2ltcGx5IHNldCB0aGUgbWF4LWhlaWdodCBmb3IgdGhlIGF1dG9jb21wbGV0ZSBtZW51IHRvIHByZXZlbnQgdGhlIG1lbnUgZnJvbSBncm93aW5nIHRvbyBsYXJnZSAqLworLnVpLWF1dG9jb21wbGV0ZSB7CisgICAgbWF4LWhlaWdodDogMjUwcHg7CisgICAgb3ZlcmZsb3cteTogYXV0bzsKKyAgICAvKiBwcmV2ZW50IGhvcml6b250YWwgc2Nyb2xsYmFyICovCisgICAgb3ZlcmZsb3cteDogaGlkZGVuOworICAgIC8qIGFkZCBwYWRkaW5nIHRvIGFjY291bnQgZm9yIHZlcnRpY2FsIHNjcm9sbGJhciAqLworICAgIHBhZGRpbmctcmlnaHQ6IDIwcHg7Cit9CisKKy8qIElFIDYgZG9lc24ndCBzdXBwb3J0IG1heC1oZWlnaHQKKyAqIHdlIHVzZSBoZWlnaHQgaW5zdGVhZCwgYnV0IHRoaXMgZm9yY2VzIHRoZSBtZW51IHRvIGFsd2F5cyBiZSB0aGlzIHRhbGwKKyAqLworKiBodG1sIC51aS1hdXRvY29tcGxldGUgeworICAgIGhlaWdodDogMjUwcHg7Cit9CisKKy8qIFRoZSBjdXN0b20gQ1NTIGZvciBhZGp1c3QgdGhlIEpzVHJlZSAqLworLmpzdHJlZS1kZWZhdWx0IC5qc3RyZWUtbGVhZiA+IGlucyB7CisgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTM2cHggMDsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCitodG1sID4gLyoqLyBib2R5IC5qc3RyZWUtZGVmYXVsdCBhIHsKKyAgICB3aGl0ZS1zcGFjZTogbm9ybWFsICFpbXBvcnRhbnQ7CisgICAgaGVpZ2h0OiBhdXRvOworfQorCisvKiBJRTYgYW5kIGJlbG93ICovCisqIGh0bWwgLmpzdHJlZS1kZWZhdWx0IGEgeworICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CisgICAgaGVpZ2h0OiBhdXRvOworfQorCisvKiBJRTcgKi8KKyogKyBodG1sIC5qc3RyZWUtZGVmYXVsdCBhIHsKKyAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOworICAgIGhlaWdodDogYXV0bzsKK30KZGlmZiAtLWdpdCBhL3RoZW1lcy9yYWluYm93c3RvbmUvd2ViYXBwL3JhaW5ib3dzdG9uZS9yYWluYm93c3RvbmUtYW1iZXIubGVzcyBiL3RoZW1lcy9yYWluYm93c3RvbmUvd2ViYXBwL3JhaW5ib3dzdG9uZS9yYWluYm93c3RvbmUtYW1iZXIubGVzcwppbmRleCA1MGY0OTUzLi43ZThhOWFhIDEwMDY0NAotLS0gYS90aGVtZXMvcmFpbmJvd3N0b25lL3dlYmFwcC9yYWluYm93c3RvbmUvcmFpbmJvd3N0b25lLWFtYmVyLmxlc3MKKysrIGIvdGhlbWVzL3JhaW5ib3dzdG9uZS93ZWJhcHAvcmFpbmJvd3N0b25lL3JhaW5ib3dzdG9uZS1hbWJlci5sZXNzCkBAIC0xLDE5OTMgKzEsMTk5MyBAQAotLyogY29tbW9uIGNvbG9ycyAqLw0KLUBibGFjazogIzAwMDsNCi1Ad2hpdGU6ICNmZmY7DQotQGdyZXk6ICNlNmU2ZTY7DQotQGdyZXlkYXJrOiAjOTI5MjkyOw0KLQ0KLUBjb2xvci1zdWNjZXNzOiAjOGNmZjhjOw0KLUBmb250LWNvbG9yLWZvci1zdWNjZXNzOiBAYmxhY2s7DQotQGNvbG9yLWFsZXJ0OiAjZmY4YzhjOw0KLUBmb250LWNvbG9yLWZvci1hbGVydDogQGJsYWNrOw0KLQ0KLUBjb2xvci1zdWNjZXNzLWRhcms6ICMzNTZlMzU7DQotQGZvbnQtY29sb3ItZm9yLXN1Y2Nlc3M6IEBibGFjazsNCi1AY29sb3ItYWxlcnQtZGFyazogIzkzMmYzMzsNCi1AZm9udC1jb2xvci1mb3ItYWxlcnQ6IEBibGFjazsNCi0NCi1AY29sb3ItYmFja2dyb3VuZC1hbGVydDogI2YyZGVkZTsNCi1AY29sb3ItZm9udC1hbGVydDogI2E5NDQ0MjsNCi1AY29sb3ItYm9yZGVyLWFsZXJ0OiAjZWJjY2QxOw0KLQ0KLUBjb2xvci1iYWNrZ3JvdW5kLXN1Y2Nlc3M6ICNkZmYwZDg7DQotQGNvbG9yLWZvbnQtc3VjY2VzczogIzNjNzYzZDsNCi1AY29sb3ItYm9yZGVyLXN1Y2Nlc3M6ICNkNmU5YzY7DQotDQotLyogU2FwaGlyIGNvbG9ycyAqLw0KLUBibHVlLWRhcms6ICMwMDIzMzM7DQotQGJsdWUtbWFpbjogIzAwNTk4MjsNCi1AYmx1ZS1tZWRpdW06ICNjN2RmZmY7DQotQGJsdWUtbGlnaHQ6ICNmMWY3ZmY7DQotQGJsdWUtbGlnaHQyOiAjZTRmMGY1Ow0KLQ0KLS8qIFJ1YnkgY29sb3JzICovDQotQHJlZC1kYXJrOiAjNDIwMDAwOw0KLUByZWQtbWFpbjogI2JmMTYxNjsNCi1AcmVkLW1lZGl1bTogI2Y3YmFiYTsNCi1AcmVkLWxpZ2h0OiAjZmNlN2U3Ow0KLUByZWQtbGlnaHQyOiAjZmVkN2M5Ow0KLQ0KLS8qIEVtZXJhbGQgY29sb3JzICovDQotQGdyZWVuLWRhcms6ICMxOTc5NDg7DQotQGdyZWVuLW1haW46ICMyM2FmOWI7DQotQGdyZWVuLW1lZGl1bTogIzdhZTNhZDsNCi1AZ3JlZW4tbGlnaHQ6ICNlNWY5ZWY7DQotQGdyZWVuLWxpZ2h0MjogI2Q3ZjllZjsNCi0NCi0vKiBBbWJlciBjb2xvcnMgKi8NCi1AYW1iZXItZGFyazogI2JjNDIxNjsNCi1AYW1iZXItbWFpbjogI2YwODkwNjsNCi1AYW1iZXItbWVkaXVtOiAjZjVjNGIzOw0KLUBhbWJlci1saWdodDogI2ZjZWRlODsNCi1AYW1iZXItbGlnaHQyOiAjZmNlZGNkOw0KLQ0KLS8qIFNhcGhpciB0aGVtZSAqLw0KLS8qDQotQG1haW4tY29sb3ItdGhlbWUgOiBAYmx1ZS1tYWluOw0KLUBkYXJrLWNvbG9yLXRoZW1lIDogQGJsdWUtZGFyazsNCi1AbWVkaXVtLWNvbG9yLXRoZW1lIDogQGJsdWUtbWVkaXVtOw0KLUBsaWdodC1jb2xvci10aGVtZSA6IEBibHVlLWxpZ2h0Ow0KLUBsaWdodDItY29sb3ItdGhlbWUgOiBAYmx1ZS1saWdodDI7DQotQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAZ3JleTsNCi1AZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsNCi1AZm9udC1jb2xvci1mb3ItbWVkaXVtIDogQGRhcmstY29sb3ItdGhlbWU7DQotQGZvbnQtY29sb3ItZm9yLWxpZ2h0IDogQGRhcmstY29sb3ItdGhlbWU7DQotQHNoYWRvdy1jb2xvciA6IEBibGFjazsNCi1Ac2hhZG93LWNvbG9yLWxpZ2h0IDogQGdyZXlkYXJrOw0KLSovDQotDQotLyogUnVieSB0aGVtZSAqLw0KLS8qDQotQG1haW4tY29sb3ItdGhlbWUgOiBAcmVkLW1haW47DQotQGRhcmstY29sb3ItdGhlbWUgOiBAcmVkLWRhcms7DQotQG1lZGl1bS1jb2xvci10aGVtZSA6IEByZWQtbWVkaXVtOw0KLUBsaWdodC1jb2xvci10aGVtZSA6IEByZWQtbGlnaHQ7DQotQGxpZ2h0Mi1jb2xvci10aGVtZSA6IEByZWQtbGlnaHQyOw0KLUBmb250LWNvbG9yLWZvci1kYXJrIDogQGdyZXk7DQotQGZvbnQtY29sb3ItZm9yLW1haW4gOiBAd2hpdGU7DQotQGZvbnQtY29sb3ItZm9yLW1lZGl1bSA6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLUBmb250LWNvbG9yLWZvci1saWdodCA6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLUBzaGFkb3ctY29sb3IgOiBAYmxhY2s7DQotQHNoYWRvdy1jb2xvci1saWdodCA6IEBncmV5ZGFyazsNCi0vKg0KLQ0KLS8qIEVtZXJhbGQgdGhlbWUgKi8NCi0vKg0KLUBtYWluLWNvbG9yLXRoZW1lIDogQGdyZWVuLW1haW47DQotQGRhcmstY29sb3ItdGhlbWUgOiBAZ3JlZW4tZGFyazsNCi1AbWVkaXVtLWNvbG9yLXRoZW1lIDogQGdyZWVuLW1lZGl1bTsNCi1AbGlnaHQtY29sb3ItdGhlbWUgOiBAZ3JlZW4tbGlnaHQ7DQotQGxpZ2h0Mi1jb2xvci10aGVtZSA6IEBncmVlbi1saWdodDI7DQotQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAd2hpdGU7DQotQGZvbnQtY29sb3ItZm9yLW1haW4gOiBAd2hpdGU7DQotQGZvbnQtY29sb3ItZm9yLW1lZGl1bSA6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLUBmb250LWNvbG9yLWZvci1saWdodCA6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLUBzaGFkb3ctY29sb3IgOiBAYmxhY2s7DQotQHNoYWRvdy1jb2xvci1saWdodCA6IEBncmV5ZGFyazsNCi0qLw0KLS8qIEFtYmVyIHRoZW1lICovDQotQG1haW4tY29sb3ItdGhlbWUgOiBAYW1iZXItbWFpbjsNCi1AZGFyay1jb2xvci10aGVtZSA6IEBhbWJlci1kYXJrOw0KLUBtZWRpdW0tY29sb3ItdGhlbWUgOiBAYW1iZXItbWVkaXVtOw0KLUBsaWdodC1jb2xvci10aGVtZSA6IEBhbWJlci1saWdodDsNCi1AbGlnaHQyLWNvbG9yLXRoZW1lIDogQGFtYmVyLWxpZ2h0MjsNCi1AZm9udC1jb2xvci1mb3ItZGFyayA6IEB3aGl0ZTsNCi1AZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsNCi1AZm9udC1jb2xvci1mb3ItbWVkaXVtIDogQGRhcmstY29sb3ItdGhlbWU7DQotQGZvbnQtY29sb3ItZm9yLWxpZ2h0IDogQGRhcmstY29sb3ItdGhlbWU7DQotQHNoYWRvdy1jb2xvciA6IEBibGFjazsNCi1Ac2hhZG93LWNvbG9yLWxpZ2h0IDogQGdyZXlkYXJrOw0KLQ0KLQ0KLUBhcHAtYmFyLWhlaWdodDogNjBweDsNCi1Ac3ViLWFwcC1iYXItaGVpZ2h0OiA0MHB4Ow0KLUBmb290ZXItaGVpZ2h0OiAyMHB4Ow0KLUBob21lLWJ0bi13aWR0aDogNDdweDsNCi1AY29sb3ItbGluZS1oZWlnaHQ6IDlweDsNCi0NCi1AaG9tZS1tZW51LXRpbGUtaGVpZ2h0OiA4MHB4Ow0KLUBob21lLW1lbnUtdGlsZS1taW4td2lkdGg6IDEwMHB4Ow0KLUBob21lLW1lbnUtdGlsZS1tYXgtd2lkdGg6IDEwMHB4Ow0KLQ0KLUB0aGlyZC1sdmwtaGVpZ2h0OiA4MHB4Ow0KLUB0aGlyZC1sdmwtd2lkdGggOiAxMDBweDsNCi1AbWluLXNjcmVlbiA6IDExNzBweDsNCi1AbWluLWNvbnRhaW5lci13aWR0aDogMTEzMHB4Ow0KLQ0KLUBib3gtYm9yZGVyLWNvbG9yOiAjZDdkN2Q3Ow0KLQ0KLUBmb250LWZhY2Ugew0KLSAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgc3JjOiB1cmwoJ2ZvbnRzL3F1aWNrc2FuZC9xdWlja3NhbmRib2xkLm90ZicpOw0KLSAgZm9udC13ZWlnaHQ6IG5vcm1hbDsNCi0gIGZvbnQtc3R5bGU6IG5vcm1hbDsNCi19DQotDQotQGZvbnQtZmFjZSB7DQotICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7DQotICBzcmM6IHVybCgnZm9udHMvcXVpY2tzYW5kL3F1aWNrc2FuZGJvbGQub3RmJyk7DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIGZvbnQtc3R5bGU6IG5vcm1hbDsNCi19DQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qIEJlZ2luIHNwZWNpYWwgY2hlY2tib3ggdHlwZSBzd2l0Y2ggKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtY2hrYm94LCBbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1jaGtib3ggew0KLSAgZGlzcGxheTogbm9uZTsNCi19DQotDQotW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtY2hrYm94ICsgbGFiZWwsDQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94ICsgbGFiZWx7DQotICBjdXJzb3I6IHBvaW50ZXI7DQotfQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLWNoa2JveCArIGxhYmVsOmJlZm9yZSwNCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1jaGtib3ggKyBsYWJlbDpiZWZvcmV7DQotICBjb250ZW50OiAiIjsNCi0gIHdpZHRoOiAxNTBweDsNCi0gIG1pbi13aWR0aDogMTUwcHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQtY29sb3ItdGhlbWU7DQotICBwYWRkaW5nOiAycHggMjBweCAycHggMjBweDsNCi0gIGJvcmRlci1yYWRpdXM6IDhweCA4cHggOHB4IDhweDsNCi0NCi0gIGN1cnNvcjogcG9pbnRlcjsNCi19DQotDQotW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtY2hrYm94ICsgbGFiZWw6YWZ0ZXIsDQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94ICsgbGFiZWw6YWZ0ZXJ7DQotICBjb250ZW50OiAiIjsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGxlZnQ6LTM1cHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIG1pbi1oZWlnaHQ6IDEwcHg7DQotICBtaW4td2lkdGg6IDEwcHg7DQotICBwYWRkaW5nLWxlZnQ6IDRweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDVweDsNCi0gIGJvcmRlci1yYWRpdXM6IDhweCA4cHggOHB4IDhweDsNCi0gIHRyYW5zaXRpb246IGFsbCAuMnM7DQotfQ0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCArIGxhYmVsOmFmdGVyew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgbGVmdDogLTE1cHg7DQotICB0cmFuc2l0aW9uOiBhbGwgLjJzOw0KLX0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogRW5kIHNwZWNpYWwgY2hlY2tib3ggdHlwZSBzd2l0Y2ggKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICBCZWdpbiBzcXVhcmUgQ2hlY2tib3ggICAgICAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCwNCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ew0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgbGVmdDogLTk5OTlweDsNCi19DQotDQotW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsLA0KLVt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbHsNCi0gIGNvbnRlbnQ6ICcnOw0KLSAgcGFkZGluZy1sZWZ0OiAzNXB4Ow0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgY3Vyc29yOiBwb2ludGVyOw0KLSAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgZm9udC1zaXplOiAxMnB4Ow0KLQ0KLX0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YmVmb3JlLA0KLVt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDpiZWZvcmV7DQotICBjb250ZW50OiAnJzsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIGxlZnQ6MTBweDsNCi0gIHRvcDogLTRweDsNCi0gIHdpZHRoOiAxN3B4Ow0KLSAgaGVpZ2h0OiAxN3B4OyAvKiBkaW0uIGRlIGxhIGNhc2UgKi8NCi0gIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7DQotICBiYWNrZ3JvdW5kOiBAbGlnaHQtY29sb3ItdGhlbWU7DQotICBib3JkZXItcmFkaXVzOiAycHg7DQotfQ0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDpiZWZvcmUgew0KLSAgYmFja2dyb3VuZDogQGxpZ2h0LWNvbG9yLXRoZW1lOw0KLX0NCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YmVmb3Jlew0KLSAgYmFja2dyb3VuZDogQG1haW4tY29sb3ItdGhlbWU7DQotfQ0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDphZnRlciwNCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YWZ0ZXJ7DQotICBjb250ZW50OiAn4pyUJzsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHRvcDogLTRweDsNCi0gIGxlZnQ6IDE0cHg7DQotICBmb250LXNpemU6IDE2cHg7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICB0cmFuc2l0aW9uOiBhbGwgLjJzOw0KLX0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YWZ0ZXIgew0KLSAgb3BhY2l0eTogMDsNCi0gIHRyYW5zZm9ybTogc2NhbGUoMCk7DQotfQ0KLVt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDphZnRlciB7DQotICBvcGFjaXR5OiAxOw0KLSAgdHJhbnNmb3JtOiBzY2FsZSgxKTsNCi19DQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiAgRW5kIHNxdWFyZSBDaGVja2JveCAgICAgICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiAgQmVnaW4gY2xhc3MgY29udGVudCBtZ210ICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotDQotLmZsZXgtcm93IHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogcm93ICFpbXBvcnRhbnQ7DQotfQ0KLS5mbGV4LWNvbHVtbiB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCi19DQotDQotLmNvbC13aWR0aC0xIHsNCi0gIHdpZHRoOiAxMCU7DQotfQ0KLS5jb2wtd2lkdGgtMiB7DQotICB3aWR0aDogMjAlOw0KLX0NCi0uY29sLXdpZHRoLTMgew0KLSAgd2lkdGg6IDMwJTsNCi19DQotLmNvbC13aWR0aC00IHsNCi0gIHdpZHRoOiA0MCU7DQotfQ0KLS5jb2wtd2lkdGgtNSB7DQotICB3aWR0aDogNTAlOw0KLX0NCi0uY29sLXdpZHRoLTYgew0KLSAgd2lkdGg6IDYwJTsNCi19DQotLmNvbC13aWR0aC03IHsNCi0gIHdpZHRoOiA3MCU7DQotfQ0KLS5jb2wtd2lkdGgtOCB7DQotICB3aWR0aDogODAlOw0KLX0NCi0uY29sLXdpZHRoLTkgew0KLSAgd2lkdGg6IDkwJTsNCi19DQotLmNvbC13aWR0aC0xMCB7DQotICB3aWR0aDogMTAwJTsNCi19DQotDQotLmFsaWduLXYtY2VudGVyIHsNCi0gIGRpc3BsYXk6ZmxleDsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotfQ0KLQ0KLS5hbGlnbi1oLWNlbnRlciB7DQotICBkaXNwbGF5OmZsZXg7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi19DQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0vKiAgICBFbmQgY2xhc3MgY29udGVudCBtZ210ICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICBCZWdpbiBidG4tc29ydCAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS5idG4tc29ydCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICB0b3A6IC02cHg7DQotICBib3JkZXI6bm9uZTsNCi0gIGJhY2tncm91bmQ6bm9uZTsNCi0gIGJvcmRlci1yYWRpdXM6IDA7DQotICBtYXJnaW4tbGVmdDo1cHg7DQotfQ0KLQ0KLS5idG4tc29ydDpiZWZvcmV7DQotICBjb250ZW50OiAnJzsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIGxlZnQ6IC0xcHg7DQotICB3aWR0aDogMDsNCi0gIGhlaWdodDogMDsNCi0gIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi0gIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgQGdyZXlkYXJrOw0KLSAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotfQ0KLQ0KLS5idG4tc29ydDphZnRlcnsNCi0gIGNvbnRlbnQ6ICcnOw0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgcmlnaHQ6IC0xcHg7DQotICB3aWR0aDogMDsNCi0gIGhlaWdodDogMDsNCi0gIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi0gIGJvcmRlci10b3A6IDEwcHggc29saWQgQGdyZXlkYXJrOw0KLSAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMzQ5cHgpIHsNCi0gICAgcmlnaHQ6IC01cHg7DQotICB9DQotfQ0KLQ0KLS5idG4tc29ydC5idG4tc29ydC1hc2M6YmVmb3Jlew0KLSAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsNCi19DQotDQotLmJ0bi1zb3J0LmJ0bi1zb3J0LWRlc2M6YWZ0ZXJ7DQotICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOw0KLX0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogIEVuZCBidG4tc29ydCAgICAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICBCZWdpbiBkZWZhdXQgY29sb3VyIGNsYXNzICAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLmRhcmstY29sb3Igew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyayAhaW1wb3J0YW50Ow0KLX0NCi0ubWFpbi1jb2xvciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluICFpbXBvcnRhbnQ7DQotfQ0KLS5tZWRpdW0tY29sb3Igew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1lZGl1bS1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tZWRpdW0gIWltcG9ydGFudDsNCi19DQotLmxpZ2h0LWNvbG9yIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBsaWdodC1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1saWdodCAhaW1wb3J0YW50Ow0KLX0NCi0ubGlnaHQyLWNvbG9yIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBsaWdodDItY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbGlnaHQgIWltcG9ydGFudDsNCi19DQotDQotLmdyZXktY29sb3Igew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXkgIWltcG9ydGFudDsNCi19DQotLmRhcmtncmV5LWNvbG9yIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBncmV5ZGFyayAhaW1wb3J0YW50Ow0KLX0NCi0NCi0vKiBiZWdpbiBsb29rdXAgd2lkZ2V0ICovDQotLnVpLWRpYWxvZyB7DQotICBvcGFjaXR5OiAxOw0KLSAgei1pbmRleDogNTA7DQotfQ0KLQ0KLS51aS1kaWFsb2ctdGl0bGViYXIudWktd2lkZ2V0LWhlYWRlci51aS1jb3JuZXItYWxsLnVpLWhlbHBlci1jbGVhcmZpeCB7DQotICBiYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgYnV0dG9uIHsNCi0gICAgYmFja2dyb3VuZDogbm9uZTsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lOw0KLSAgfQ0KLX0NCi0vKiBlbmQgbG9va3VwIHdpZGdldCAqLw0KLQ0KLS5tYWluLWJhci1sYWJlbCB7DQotICBjb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lOw0KLSAgcGFkZGluZy1sZWZ0OiAzcHg7DQotICBwYWRkaW5nLXJpZ2h0OiA2cHg7DQotICBmb250LXNpemU6IDE1cHg7DQotICBmb250LXdlaWdodDogYm9sZDsNCi19DQotDQotI2NvbXBhbnktbG9nbyB7DQotICByaWdodDogMTBweDsNCi0gIHRvcDogMnB4Ow0KLSAgYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvb2ZiaXotc2ltcGxlLXdoaXRlLnN2ZyIpIG5vLXJlcGVhdCBsZWZ0IHRvcCAvIGNvdmVyOw0KLSAgbWluLWhlaWdodDogNTBweDsNCi0gIG1pbi13aWR0aDogNTBweDsNCi0gIG1hcmdpbi1yaWdodDogMTVweDsNCi0gIGFsaWduLXNlbGY6IGNlbnRlcjsNCi0gIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGggOiAxMjMycHgpIHsNCi0gICAgbWluLWhlaWdodDogNTBweDsNCi0gICAgbWluLXdpZHRoOiAxMjlweDsNCi0gICAgYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvb2ZiaXotd2hpdGUuc3ZnIikgbm8tcmVwZWF0IGxlZnQgdG9wIC8gY292ZXI7DQotICB9DQotfQ0KLQ0KLS5tb2RhbC1zY3JlZW4gew0KLSAgdmlzaWJpbGl0eTogaGlkZGVuOw0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsNCi0gIG9wYWNpdHk6IC45MzsNCi0gIHBvc2l0aW9uOiBmaXhlZDsNCi0gIHRvcDogMDsNCi0gIGxlZnQ6IDA7DQotICBoZWlnaHQ6IDEwMCU7DQotICB3aWR0aDogMTAwJTsNCi0gIHotaW5kZXg6IDk5OTk7DQotfQ0KLQ0KLS5tb2RhbC1ib3h7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICBvcGFjaXR5OiAxOw0KLSAgbWFyZ2luOiAxMCU7DQotICBib3JkZXItcmFkaXVzOiAxMHB4Ow0KLSAgYm9yZGVyOiBzb2xpZCAycHggQG1haW4tY29sb3ItdGhlbWU7DQotICBwYWRkaW5nIDogMTBweCA0MHB4IDEwcHggNDBweDsNCi0gIC5tb2RhbC1oZWFkZXIgew0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7DQotICAgIGgyIHsNCi0gICAgICBmb250LXNpemU6IDI1cHg7DQotICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsNCi0gICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIH0NCi0gICAgLmJ0bi1jbG9zZS1ucmQgew0KLSAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgICByaWdodDogMDsNCi0gICAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICAgIGJvcmRlcjogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsNCi0gICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgICAgZm9udC1zaXplOiAyNXB4Ow0KLSAgICAgIGhlaWdodDogMzBweDsNCi0gICAgICB3aWR0aDogMzBweDsNCi0gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsNCi0gICAgfQ0KLSAgfQ0KLSAgLm1vZGFsLWJvZHkgew0KLSAgICBwIHsNCi0gICAgICBmb250LXNpemU6IDIwcHg7DQotICAgIH0NCi0gIH0NCi0gIC5tb2RhbC1mb290ZXIgew0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIGhlaWdodDogMzVweDsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsNCi0gICAgLmJ0bi1ucmQgew0KLSAgICAgIGJhY2tncm91bmQ6IG5vbmU7DQotICAgICAgYm9yZGVyOiBub25lOw0KLSAgICAgIHRleHQtc2hhZG93OiBub25lOw0KLSAgICAgIG9wYWNpdHk6IDE7DQotICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4Ow0KLSAgICAgIGZvbnQtc2l6ZTogMjBweDsNCi0gICAgICBwYWRkaW5nOiA1cHg7DQotICAgICAgYm9yZGVyLXJhZGl1czogOHB4Ow0KLSAgICB9DQotICAgIC5idG4tbnJkLW1haW4gew0KLSAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICAgIGNvbG9yOiBAd2hpdGU7DQotICAgIH0NCi0gICAgLmJ0bi1ucmQtc3RkIHsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICAgIGJvcmRlcjogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICAgIH0NCi0gIH0NCi19DQotLmJ0bi1ucmQ6aG92ZXIgew0KLSAgYm94LXNoYWRvdzogNXB4IDVweCAzcHggMCBAYmxhY2s7DQotfQ0KLQ0KLS5idG4tbnJkLXN0ZDpob3ZlciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgY29sb3I6IEB3aGl0ZSAhaW1wb3J0YW50Ow0KLSAgYm9yZGVyOiBzb2xpZCAxcHggQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi19DQotDQotLmJ0bi1jbG9zZS1ucmQ6aG92ZXIgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGNvbG9yOiBAd2hpdGUgIWltcG9ydGFudDsNCi19DQotDQotLmxpc3QtbnJkIHsNCi0gIGJvcmRlcjogc29saWQgMnB4IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMTBweDsNCi0gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAxMHB4Ow0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47DQotICBtYXJnaW4tdG9wOiAxNXB4Ow0KLSAgbWFyZ2luLWJvdHRvbTogMTVweDsNCi0gIC50aXRsZS1saXN0LW5yZCB7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICBjb2xvciA6IEB3aGl0ZTsNCi0gICAgZm9udC1zaXplOiAyMHB4Ow0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgcGFkZGluZy1sZWZ0OiA1cHg7DQotICB9DQotDQotICBsaSB7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gICAgZm9udC1zaXplOiAyMHB4Ow0KLSAgICBwYWRkaW5nLWxlZnQ6IDVweDsNCi0gICAgcGFkZGluZy10b3A6IDJweDsNCi0gICAgcGFkZGluZy1ib3R0b206IDJweDsNCi0gICAgbWFyZ2luLWJvdHRvbTogM3B4Ow0KLSAgICBhIHsNCi0gICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIH0NCi0gICAgc3BhbiB7DQotICAgICAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgICAgIHJpZ2h0OiAwOw0KLSAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgICBmb250LXNpemU6IDMwcHg7DQotICAgIH0NCi0gIH0NCi19DQotbGkubGluZS1vZGQgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lOw0KLX0NCi0NCi0jdXNlci1hdmF0YXIgew0KLSAgaGVpZ2h0OiA0MHB4Ow0KLSAgd2lkdGg6IDQwcHg7DQotICBwYWRkaW5nOiAycHg7DQotDQotICBhbGlnbi1zZWxmOiBjZW50ZXI7DQotDQotICA6aG92ZXIgew0KLSAgICBjdXJzb3I6IHBvaW50ZXI7DQotICB9DQotICBpbWcgew0KLSAgICBtYXgtaGVpZ2h0OiA0MHB4Ow0KLSAgICBtYXgtd2lkdGg6IDQwcHg7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gICAgdG9wOiAtMnB4Ow0KLSAgICBwYWRkaW5nOiAycHg7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gICAgYm9yZGVyLXJhZGl1czogMnB4Ow0KLSAgfQ0KLX0NCi0NCi0jbWFpbi1uYXZpZ2F0aW9uLWJhciB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICB3aWR0aDogMTAwJTsNCi0gIG1pbi13aWR0aDogQG1pbi1jb250YWluZXItd2lkdGg7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQotICBmb250LWZhbWlseTogUXVpY2tzYW5kLHNhbnMtc2VyaWY7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIHotaW5kZXg6IDU7DQotICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodDsNCi19DQotI21haW4tbmF2LWJhci1sZWZ0IHsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLX0NCi0jbWFpbi1uYXYtYmFyLXJpZ2h0IHsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgcGFkZGluZy1yaWdodDogMTVweDsNCi19DQotDQotLmFwcC1idG57DQotICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgZGlzcGxheTogZmxleDsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgbWFyZ2luLXJpZ2h0OiAycHg7DQotICBtYXJnaW4tbGVmdDogMnB4Ow0KLSAgYSB7DQotICAgIHBhZGRpbmc6MTBweDsNCi0gICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLSAgICBmb250LXNpemU6IDEuNGVtICFpbXBvcnRhbnQ7DQotICB9DQotfQ0KLQ0KLS5hcHAtYnRuIGE6dmlzaXRlZCB7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotfQ0KLQ0KLS5hcHAtYnRuOmhvdmVyew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgdG9wOiAtNnB4Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA1cHg7DQotICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNXB4Ow0KLSAgYm94LXNoYWRvdzogMXB4IDFweCAxMnB4IEBzaGFkb3ctY29sb3I7DQotICBhIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICB0b3A6IDZweDsNCi0gICAgY29sb3IgOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gIH0NCi19DQotLmFwcC1idG4uc2VsZWN0ZWQ6aG92ZXIgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICBib3gtc2hhZG93OiBub25lOw0KLSAgdG9wOjA7DQotfQ0KLQ0KLS5hcHAtYnRuIGE6aG92ZXIgew0KLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0jYXBwLXNlbGVjdGVkIHsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBib3gtc2hhZG93OiAxcHggLTJweCAxMnB4IEBzaGFkb3ctY29sb3I7DQotICB6LWluZGV4OiAwOw0KLSAgb3BhY2l0eTogLjk5Ow0KLSAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyA6IDhweCA7DQotICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyA6IDhweCA7DQotICBhIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICB0b3A6IDNweDsNCi0gICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgfQ0KLX0NCi0uYXBwLWJ0bi5zZWxlY3RlZCBhOmhvdmVyIHsNCi0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotI2FwcC1iYXItbGluZSB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICB3aWR0aDogMTAwJTsNCi0gIG1pbi13aWR0aDogQG1pbi1jb250YWluZXItd2lkdGg7DQotICBoZWlnaHQ6IEBjb2xvci1saW5lLWhlaWdodDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgYm94LXNoYWRvdzogMnB4IDJweCA1cHggQHNoYWRvdy1jb2xvcjsNCi19DQotI2NvbG9yLWFkZCB7DQotICB3aWR0aDogMTUwcHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGhlaWdodDogQGNvbG9yLWxpbmUtaGVpZ2h0Ow0KLSAgei1pbmRleDogMjA7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICB0b3A6IEBjb2xvci1saW5lLWhlaWdodDsNCi19DQotDQotI21vcmUtYXBwIHsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIGZvbnQtc2l6ZTogMS40ZW0gIWltcG9ydGFudDsNCi0gIHdpZHRoOiA0MHB4Ow0KLSAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQ7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotfQ0KLSNtb3JlLWFwcDpob3ZlciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotI21vcmUtYXBwOmhvdmVyICNtb3JlLWFwcC1saXN0IHsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0jbW9yZS1hcHAuc2VsZWN0ZWQgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotfQ0KLQ0KLSNtb3JlLWFwcC1saXN0IHsNCi0gIGRpc3BsYXk6IG5vbmU7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICB0b3A6IEBhcHAtYmFyLWhlaWdodDsNCi0gIGxlZnQ6IC0yMHB4Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICB6LWluZGV4OiAxMDsNCi0gIGJvcmRlcjogc29saWQgNHB4IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgYm9yZGVyLXRvcC13aWR0aDogQGNvbG9yLWxpbmUtaGVpZ2h0Ow0KLSAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4Ow0KLSAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDRweDsNCi0gIGxpIHsNCi0gICAgcGFkZGluZy1sZWZ0IDogNHB4Ow0KLSAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7DQotICB9DQotDQotICBhIHsNCi0gICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLSAgICBmb250LXNpemU6IDE1cHg7DQotICB9DQotDQotICA6aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWVkaXVtLWNvbG9yLXRoZW1lOw0KLSAgICBhIHsNCi0gICAgICBib3gtc2hhZG93OiBub25lOw0KLSAgICAgIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gICAgfQ0KLSAgICBhOmhvdmVyew0KLSAgICAgIGJveC1zaGFkb3c6IG5vbmU7DQotICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLSAgICAgIGJvcmRlci1yYWRpdXM6IDA7DQotICAgIH0NCi0gIH0NCi0NCi0gIGxpLnNlbGVjdGVkIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIGEgew0KLSAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gICAgfQ0KLSAgICBhOmhvdmVyIHsNCi0gICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIH0NCi0gIH0NCi19DQotDQotI2hvbWVCdXR0b24gew0KLSAgZGlzcGxheTogZmxleDsNCi0gIC8vdmlzaWJpbGl0eTogaGlkZGVuOw0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgYmFja2dyb3VuZC1jb2xvcjpAZ3JleTsNCi0gIGJvcmRlcjogbm9uZTsNCi0gIGJvcmRlci1yYWRpdXMgOiAwOw0KLQ0KLSAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQ7DQotICB3aWR0aCA6IEBob21lLWJ0bi13aWR0aDsNCi0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gIGltZyB7DQotICAgIGhlaWdodDogMjVweDsNCi0gICAgdHJhbnNpdGlvbjogYWxsIC4ycyBlYXNlLWluLW91dDsNCi0gIH0NCi19DQotDQotI2hvbWVCdXR0b246aG92ZXIgaW1nIHsNCi0gIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsNCi19DQotDQotI2FwcC1iYXItbGlzdCB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLX0NCi0NCi0jdXNlci1kZXRhaWxzIHsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHJpZ2h0OiAyMHB4Ow0KLSAgdG9wIDogNjJweDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgY29sb3IgOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gIGZvbnQtc2l6ZTogMTVweDsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgcGFkZGluZy10b3A6IDVweDsNCi0gIHBhZGRpbmctYm90dG9tOiAxMHB4Ow0KLSAgei1pbmRleDogMTU7DQotICBib3gtc2hhZG93OiAzcHggM3B4IDEycHggQHNoYWRvdy1jb2xvcjsNCi0gIGJvcmRlci1yYWRpdXM6IDNweDsNCi0gIHRyYW5zaXRpb246IGFsbCAuMXMgZWFzZS1pbi1vdXQ7DQotDQotICBpbWcgew0KLSAgICBoZWlnaHQ6IDUwcHg7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gICAgcGFkZGluZzogNHB4Ow0KLSAgICBib3JkZXItcmFkaXVzIDogM3B4Ow0KLSAgICBtYXJnaW4tbGVmdDogMTBweDsNCi0gICAgbWFyZ2luLXJpZ2h0OiA1cHg7DQotICB9DQotICAjbG9nb3V0IHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgICBjb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gICAgYm9yZGVyLXJhZGl1czogMnB4Ow0KLSAgICA6aG92ZXIgew0KLSAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0jdXNlci1kZXRhaWxzOmFmdGVyew0KLSAgY29udGVudDogJyc7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICB0b3A6IC0xMHB4Ow0KLSAgcmlnaHQ6IDVweDsNCi0gIHdpZHRoOiAwOw0KLSAgaGVpZ2h0OiAwOw0KLSAgYm9yZGVyLXJpZ2h0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLSAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCBAZGFyay1jb2xvci10aGVtZTsNCi0gIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLX0NCi0NCi1hLnVzZXItcHJlZi1idG4gew0KLSAgbWFyZ2luLXRvcDogMTVweDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgbWFyZ2luLWxlZnQ6IDEwcHg7DQotICBtYXJnaW4tcmlnaHQ6IDEwcHg7DQotICBwYWRkaW5nLXRvcDogMnB4Ow0KLSAgcGFkZGluZy1ib3R0b206IDJweDsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyayAhaW1wb3J0YW50Ow0KLSAgOmhvdmVyIHsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLSAgfQ0KLX0NCi0NCi0jdXNlci1uYW1lIHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KLSAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICBhbGlnbi1jb250ZW50OiBjZW50ZXI7DQotICBwYWRkaW5nLWxlZnQgOiA1cHg7DQotICBwYWRkaW5nLXJpZ2h0IDogNXB4Ow0KLSAgc3BhbiB7DQotICAgIG1pbi13aWR0aDogMTAwcHg7DQotICAgIHBhZGRpbmctYm90dG9tIDogNXB4Ow0KLSAgICBwYWRkaW5nLXRvcCA6IDVweDsNCi0gIH0NCi19DQotDQotI3VzZXItcm93MSB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgI3VzZXItbGFuZyB7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7DQotICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7DQotICAgIHBhZGRpbmctbGVmdDogMTBweDsNCi0gICAgcGFkZGluZy1yaWdodDogMTBweDsNCi0gICAgc3BhbiB7DQotICAgICAgbWluLXdpZHRoOiAzMHB4Ow0KLSAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0uYXBwYmFyLWJ0bi1pbWcgew0KLSAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQgLSA0MHB4Ow0KLX0NCi0NCi0jaGVscC1idG4gew0KLSAgZm9udC1zaXplOiAxMHB4Ow0KLSAgbWluLXdpZHRoOiAyMHB4Ow0KLSAgbWFyZ2luLXJpZ2h0OiAxNXB4Ow0KLX0NCi0vKiBCZWdpbiBzdWIgTWVudSBzZWN0aW9uICovDQotDQotI2FwcC1uYXZpZ2F0aW9uIHsNCi0gIGhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodDsNCi0gIGJvcmRlci1yaWdodDogc29saWQgMXB4IEBibGFjazsNCi0gIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCBAYmxhY2s7DQotICB3aWR0aDogMTAwJTsNCi0gIG1pbi13aWR0aDogQG1pbi1jb250YWluZXItd2lkdGg7DQotICBoMiB7DQotICAgIGRpc3BsYXk6IG5vbmU7DQotICB9DQotICB1bCB7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBncmV5Ow0KLSAgICBmbGV4LWdyb3c6IDE7DQotICB9DQotICB1bCBsaSB1bCBsaSB7DQotICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggQGJsYWNrOw0KLSAgICBoZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQ7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICAgIGp1c3RpZnktaXRlbXM6IGNlbnRlcjsNCi0gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICAgIG1pbi13aWR0aDogNzVweDsNCi0gICAgcGFkZGluZy1sZWZ0OiA2cHg7DQotICAgIHBhZGRpbmctcmlnaHQ6IDZweDsNCi0gICAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOw0KLSAgICBmb250LXNpemU6IDEycHg7DQotICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDE1MDBweCkgew0KLSAgICAgIGZvbnQtc2l6ZTogMTBweDsNCi0gICAgICBtaW4td2lkdGg6IDY1cHg7DQotICAgIH0NCi0gICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTMwMHB4KSB7DQotICAgICAgZm9udC1zaXplOiAxMHB4Ow0KLSAgICAgIG1pbi13aWR0aDogNTBweDsNCi0gICAgfQ0KLSAgICBhIHsNCi0gICAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KLSAgICAgIGhlaWdodDogMTAwJTsNCi0gICAgICB3aWR0aDogMTAwJTsNCi0gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICAgIH0NCi0gIH0NCi19DQotDQotI2FwcC1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpOmxhc3QtY2hpbGQgew0KLSAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggQGJsYWNrOw0KLX0NCi0NCi0jYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGk6aG92ZXIgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBtaW4taGVpZ2h0OiBAc3ViLWFwcC1iYXItaGVpZ2h0Ow0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgLy90b3A6IC0xcHg7DQotICBhIHsNCi0gICAgY29sb3I6IEB3aGl0ZTsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLSAgfQ0KLX0NCi0jYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGkuc2VsZWN0ZWQ6aG92ZXIgew0KLSAgYSB7DQotICAgIGNvbG9yOiBAYmxhY2sgIWltcG9ydGFudDsNCi0gIH0NCi19DQotDQotI2FwcC1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpLnNlbGVjdGVkIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIHRvcDogMXB4Ow0KLSAgaGVpZ2h0OiBAc3ViLWFwcC1iYXItaGVpZ2h0ICsgMXB4Ow0KLSAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsNCi0gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDJweDsNCi0gIGJvcmRlci1ib3R0b206IG5vbmU7DQotDQotICA6YWZ0ZXIgew0KLSAgICBjb250ZW50OiAnJzsNCi0gICAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgICB0b3A6IC0ycHg7DQotICAgIGxlZnQ6IDVweDsNCi0gICAgd2lkdGg6IDA7DQotICAgIGhlaWdodDogMDsNCi0gICAgYm9yZGVyLXJpZ2h0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLSAgICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICBib3JkZXItbGVmdDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi0gIH0NCi0NCi19DQotDQotDQotLyogRW5kIHN1YiBNZW51IHNlY3Rpb24gKi8NCi0NCi0vKiBiZWdpbiBzdWIgTWVudSBzZWN0aW9uIDNyZCBsZXZlbCAqLw0KLQ0KLS5idXR0b24tYmFyLnRhYi1iYXIgew0KLSAgdWwgbGkgdWwgbGkgew0KLSAgICBib3JkZXI6IHNvbGlkIDFweCBAZ3JleTsNCi0gICAgYm9yZGVyLXJhZGl1czogNHB4Ow0KLSAgICBhIHsNCi0gICAgICB3aWR0aDogMTAwJTsNCi0gICAgICBoZWlnaHQ6IDEwMCU7DQotICAgIH0NCi0gIH0NCi0gIGxpLnNlbGVjdGVkew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgYXsNCi0gICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICAgIH0NCi0gIH0NCi0gIHVsIGxpIHVsIGxpOmhvdmVyIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIGEgew0KLSAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbiA7DQotICAgIH0NCi0gIH0NCi19DQotDQotI3RoaXJkLWxldmVsLW1lbnUtY29udGFpbmVyIHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLX0NCi0jd29ya2luZy1hcmVhIHsNCi0gIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi0jbGVmdC1jb2x1bW4tbWVudSB7DQotICB3aWR0aDogMTAwcHg7DQotfQ0KLQ0KLS50aGlyZC1sdmwtbWVudSB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGxlZnQ6IC0xMHB4Ow0KLSAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsNCi0gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7DQotICBwYWRkaW5nLXRvcDogNHB4Ow0KLSAgcGFkZGluZy1ib3R0b206IDRweDsNCi0gIHVsIHsNCi0gICAgbGkgew0KLSAgICAgIHVsIHsNCi0gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gICAgICAgIHRvcDogNXB4Ow0KLSAgICAgICAgd2lkdGg6IEB0aGlyZC1sdmwtd2lkdGg7DQotICAgICAgfQ0KLSAgICB9DQotICB9DQotICBoMiB7DQotICAgIHZpc2liaWxpdHk6IGhpZGRlbjsNCi0gIH0NCi19DQotLnRoaXJkLWxldmVsLWl0ZW06bGFzdC1jaGlsZCB7DQotICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQG1haW4tY29sb3ItdGhlbWU7DQotfQ0KLQ0KLS50aGlyZC1sZXZlbC1pdGVtIHsNCi0gIG1pbi1oZWlnaHQ6IEB0aGlyZC1sdmwtaGVpZ2h0Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICBwYWRkaW5nLXJpZ2h0OiAzcHg7DQotICBib3JkZXItdG9wOiBzb2xpZCAxcHggQG1haW4tY29sb3ItdGhlbWU7DQotDQotICBhLCBhOnZpc2l0ZWQgew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gICAgd2lkdGg6IDEwMCU7DQotICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyayAhaW1wb3J0YW50Ow0KLSAgICBtaW4taGVpZ2h0OiBAdGhpcmQtbHZsLWhlaWdodDsNCi0gICAgbWF4LXdpZHRoOiBAdGhpcmQtbHZsLXdpZHRoOw0KLSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQotICB9DQotfQ0KLS50aGlyZC1sZXZlbC1pdGVtLnNlbGVjdGVkIHsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGJvcmRlci1sZWZ0OiBzb2xpZCA5cHggQG1haW4tY29sb3ItdGhlbWU7DQotICBhLCBhOnZpc2l0ZWQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICAgIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgfQ0KLSAgOmFmdGVyIHsNCi0gICAgY29udGVudDogJyc7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgdG9wOiA1cHg7DQotICAgIGxlZnQ6IDA7DQotICAgIHdpZHRoOiAwOw0KLSAgICBoZWlnaHQ6IDA7DQotICAgIGJvcmRlci10b3A6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotICAgIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICBib3JkZXItYm90dG9tOiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLSAgfQ0KLX0NCi0NCi0udGhpcmQtbGV2ZWwtaXRlbSBhOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluIDsNCi0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotLyogRW5kIDNyZCBsZXZlbCBtZW51ICovDQotDQotDQotDQotLyogQmVnaW4gSG9tZSBNZW51IGZvciBJQiBzZWN0aW9uICovDQotLmZpeGVkLW5hdi1iYXIgew0KLSAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7DQotICB3aWR0aDogMTAwJTsNCi19DQotI25hdi1iYXItb2Zmc2V0IHsNCi0gIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0IDsNCi19DQotDQotI2hvbWVHbHlwaCB7DQotICBtYXJnaW4tbGVmdDogMjBweDsNCi0gIGhlaWdodDogMjBweDsNCi19DQotDQotI2hvbWVQYWdlVGl0bGUgew0KLSAgY29sb3I6IEB3aGl0ZTsNCi0gIGZvbnQtc2l6ZTogMjBweDsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgbWFyZ2luLXJpZ2h0OiAyMHB4Ow0KLSAgbWFyZ2luLWxlZnQ6IDIwcHg7DQotfQ0KLS5ob21lLW1lbnUtbGlzdCB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotfQ0KLS5ocC1hcHBsaXN0IHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgY29sb3IgOiBAd2hpdGU7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgLmFwcC10aXRsZSB7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gICAgaGVpZ2h0OiBAaG9tZS1tZW51LXRpbGUtaGVpZ2h0Ow0KLSAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTBweDsNCi0gICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBibGFjazsNCi0gICAgc3BhbiB7DQotICAgICAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7DQotICAgICAgZm9udC1zaXplOiAxNXB4Ow0KLSAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICAgIHdpZHRoOiAxMTBweDsNCi0gICAgICBhIHsNCi0gICAgICAgIGRpc3BsYXk6IGZsZXg7DQotICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgICAgIGNvbG9yIDogQHdoaXRlOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLmhwLW1lbnUtaXRlbSB7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIG1hcmdpbi1sZWZ0OiA1cHg7DQotICAgIG1hcmdpbi1yaWdodDogNXB4Ow0KLSAgICBib3JkZXI6IHNvbGlkIDJweCBAZ3JleTsNCi0gICAgYm9yZGVyLXJhZGl1czogOHB4Ow0KLSAgICBoZWlnaHQ6IEBob21lLW1lbnUtdGlsZS1oZWlnaHQgLSA0cHg7DQotICAgIG1pbi13aWR0aDogQGhvbWUtbWVudS10aWxlLW1pbi13aWR0aDsNCi0gICAgbWF4LXdpZHRoOiBAaG9tZS1tZW51LXRpbGUtbWF4LXdpZHRoOw0KLSAgICAubWVudS1saW5rIHsNCi0gICAgICBmb250LXNpemU6IDEwcHg7DQotICAgICAgY29sb3I6IEBibGFjazsNCi0gICAgICBwYWRkaW5nOiAxMHB4Ow0KLSAgICB9DQotICAgIC5zdGFyLWxpbmsgew0KLSAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgICBoZWlnaHQ6IDI1cHg7DQotICAgICAgdG9wOiA1cHg7DQotICAgICAgcmlnaHQ6IDVweDsNCi0gICAgfQ0KLSAgfQ0KLQ0KLX0NCi0uaHAtYXBwbGlzdCAuYXBwLXRpdGxlIHNwYW4gYTpob3ZlciB7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLS5ocC1tZW51LWl0ZW0uZmF2b3JpdGVJdGVtIHsNCi0gIGJvcmRlcjogc29saWQgMnB4IEBkYXJrLWNvbG9yLXRoZW1lOw0KLX0NCi0NCi0uaHAtbWVudS1pdGVtOmhvdmVyIHsNCi0gIGJveC1zaGFkb3c6IDNweCAzcHggMTJweCBAc2hhZG93LWNvbG9yOw0KLSAgYSB7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gIH0NCi19DQotDQotLyogRW5kIEhvbWUgTWVudSBmb3IgSUIgc2VjdGlvbiAqLw0KLQ0KLS8qIEJlZ2luIExvZ2luIHNjcmVlbmxldCAqLw0KLSNsb2dpbi1jb250YWluZXIgew0KLSAgI2NvbnRlbnQtbWVzc2FnZXMgew0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIHRvcDogQGFwcC1iYXItaGVpZ2h0Ow0KLSAgICBib3JkZXItcmFkaXVzOiA0cHg7DQotICAgIHdpZHRoOiA5NyU7DQotICAgICYuZXJyb3JNZXNzYWdlIHsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yIDogQGNvbG9yLWJhY2tncm91bmQtYWxlcnQgIWltcG9ydGFudDsNCi0gICAgICBjb2xvcjogQGNvbG9yLWZvbnQtYWxlcnQgIWltcG9ydGFudDsNCi0gICAgICBib3JkZXIgOiBzb2xpZCAxcHggQGNvbG9yLWJvcmRlci1hbGVydCAhaW1wb3J0YW50Ow0KLSAgICB9DQotICAgICYuZXZlbnRNZXNzYWdlIHsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yIDogQGNvbG9yLWJhY2tncm91bmQtc3VjY2VzcyAhaW1wb3J0YW50Ow0KLSAgICAgIGNvbG9yOiBAY29sb3ItZm9udC1zdWNjZXNzICFpbXBvcnRhbnQ7DQotICAgICAgYm9yZGVyIDogc29saWQgMXB4IEBjb2xvci1ib3JkZXItc3VjY2VzcyAhaW1wb3J0YW50Ow0KLSAgICB9DQotICB9DQotfQ0KLSNsb2dpbkJhciB7DQotICBwb3NpdGlvbjogZml4ZWQ7DQotICB0b3A6MDsNCi0gIGxlZnQ6IDA7DQotICB3aWR0aDogMTAwJTsNCi0gIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICBzcGFuIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA1cHg7DQotICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDVweDsNCi0gICAgZm9udC1zaXplOiAyNXB4Ow0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIHRvcDogQGFwcC1iYXItaGVpZ2h0IC0gMzJweDsNCi0gICAgbGVmdDogMTVweDsNCi0gICAgcGFkZGluZzogNXB4IDEwcHggNXB4IDEwcHg7DQotICB9DQotICAjY29tcGFueS1sb2dvIHsNCi0gICAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgfQ0KLX0NCi0NCi0ubG9naW4tc2NyZWVubGV0IHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KLSAgbWluLXdpZHRoOiAzMDBweDsNCi0gIG1heC13aWR0aDogNTBlbTsNCi0gIGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50Ow0KLSAgbWFyZ2luLXRvcDogMTUlOw0KLSAgYm94LXNoYWRvdzogM3B4IDNweCAxMnB4IEBzaGFkb3ctY29sb3I7DQotICAuc2NyZWVubGV0LXRpdGxlLWJhciB7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICAgIG1hcmdpbjowOw0KLSAgICBwYWRkaW5nOjA7DQotICAgIGgzew0KLSAgICAgIHBhZGRpbmctdG9wOjJweDsNCi0gICAgICBwYWRkaW5nLWJvdHRvbToycHg7DQotICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgICAgaGVpZ2h0OiAxMDAlOw0KLSAgICAgIHdpZHRoOjEwMCU7DQotICAgICAgdGV4dC1zaGFkb3c6IG5vbmU7DQotICAgICAgZm9udC1zaXplOiAyNXB4Ow0KLSAgICB9DQotICB9DQotICAuc2NyZWVubGV0LWJvZHkgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgICBmb3JtIHsNCi0gICAgICAuYnV0dG9uIHsNCi0gICAgICAgIHdpZHRoOiAxNTBweDsNCi0gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCi0gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7DQotICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgICAgIHRleHQtc2hhZG93OiBub25lOw0KLSAgICAgICAgbWFyZ2luLXRvcDogMjBweDsNCi0gICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7DQotICAgICAgfQ0KLQ0KLSAgICAgIHRhYmxlIHsNCi0gICAgICAgIHRyIHsNCi0gICAgICAgICAgd2lkdGg6IDEwMCU7DQotICAgICAgICAgIC5sYWJlbCB7DQotICAgICAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgICAgICAgICAgIHdpZHRoOiAyNSU7DQotICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4Ow0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlucHV0IHsNCi0gICAgICAgICAgICB3aWR0aDogMTAwJTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICAuYnV0dG9udGV4dCwNCi0gICAgICAgICAgW3R5cGU9InN1Ym1pdCJdIHsNCi0gICAgICAgICAgICB3aWR0aDogMTUwcHg7DQotICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4Ow0KLSAgICAgICAgICAgIGJhY2tncm91bmQ6IG5vbmU7DQotICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICAgICAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLSAgICAgICAgICAgIHRleHQtc2hhZG93OiBub25lOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIFtuYW1lPSJHRVRfUEFTU1dPUkRfSElOVCJdIHsNCi0gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgICAgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgICAgICAgICAgYm9yZGVyOiBub25lOw0KLSAgICAgICAgICAgIHdpZHRoOiAxMDAlOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIFtuYW1lPSJFTUFJTF9QQVNTV09SRCJdIHsNCi0gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgICAgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgICAgICAgICAgYm9yZGVyOiBub25lOw0KLSAgICAgICAgICAgIHdpZHRoOiAxMDAlOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRkIHsNCi0gICAgICAgICAgICBwYWRkaW5nOiA1cHg7DQotICAgICAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDsNCi0gICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBhIHsNCi0gICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICAgIH0NCi0gIH0NCi19DQotDQotLmxvZ2luLXNjcmVlbmxldCAuc2NyZWVubGV0LXRpdGxlLWJhciB7DQotICB0ZXh0LWFsaWduOiBjZW50ZXI7DQotfQ0KLQ0KLS8qIEVuZCBMb2dpbiBzY3JlZW5sZXQgKi8NCi0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgIEJlZ2luIFNjcmVlbmxldCBzdHlsZSAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0uc2NyZWVubGV0LXRpdGxlLWJhciB7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmUgOw0KLSAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7DQotICBoZWlnaHQ6IDElOyAvKiBJRSBmaXggKi8NCi0gIG1pbi1oZWlnaHQ6IDEuNWVtOw0KLSAgcGFkZGluZzowLjhlbSAwLjJlbTsNCi19DQotDQotLnNjcmVlbmxldCB7DQotICBib3JkZXItcmFkaXVzOiA1cHg7DQotICBib3JkZXI6IHNvbGlkIDFweCBAZ3JleTsNCi0gIGhlaWdodDogYXV0byAhaW1wb3J0YW50Ow0KLSAgbWFyZ2luLWJvdHRvbTogMWVtOw0KLSAgb3ZlcmZsb3c6IGF1dG87DQotfQ0KLQ0KLS5zY3JlZW5sZXQtYm9keSB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOw0KLSAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7DQotICBoZWlnaHQ6IDElOw0KLSAgcGFkZGluZzogMC40ZW07DQotfQ0KLQ0KLS5zY3JlZW5sZXQtYm9keSBkaXYgew0KLSAgbWFyZ2luOiAwLjhlbSAwLjFlbQ0KLX0NCi0NCi0vKiBTcGVjaWFsIFNjcmVlbmxldCBzdHlsZSBmb3IgbG9jYWxlIGFuZCB0aW1lem9uZSB3aW5kb3cgKi8NCi0ubGlzdHMuc2NyZWVubGV0IHsNCi0gIG1hcmdpbi1sZWZ0OiAyNSU7DQotICBtYXJnaW4tcmlnaHQ6IDI1JTsNCi0gIG1hcmdpbi10b3A6IDFlbTsNCi19DQotDQotLmxpc3RzLnNjcmVlbmxldCAuYmFzaWMtdGFibGUgdHIgdGQgew0KLSAgdGV4dC1hbGlnbjogY2VudGVyOw0KLX0NCi0NCi0ubGlzdHMuc2NyZWVubGV0IC5iYXNpYy10YWJsZSB0ciB0ZCBhIHsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi0vKiAgICAgIEFsdGVybmF0ZSB0YWJsZSBoZWFkZXIgc3R5bGUgICAgICAqLw0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoLA0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBncmV5ZGFyazsNCi0gIGJvcmRlci1ib3R0b206IDA7DQotICBib3JkZXItbGVmdDogMC4xZW0gc29saWQgI2FhYTsNCi0gIGJvcmRlci1yaWdodDogMC4xZW0gc29saWQgIzg4ODsNCi0gIGNvbG9yOiAjZmZmZmZmOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLS8qIE5vIHBhZGRpbmcgc2NyZWVubGV0IGRlY29yYXRvciAqLw0KLS5uby1wYWRkaW5nIHsNCi0gIHBhZGRpbmc6IDA7DQotICBib3JkZXI6IG5vbmU7DQotfQ0KLQ0KLS5uby1wYWRkaW5nIC5oMSwNCi0ubm8tcGFkZGluZyAuaDIsDQotLm5vLXBhZGRpbmcgLmgzLA0KLS5uby1wYWRkaW5nciBoMSwNCi0ubm8tcGFkZGluZyBoMiwNCi0ubm8tcGFkZGluZyBoMyB7DQotICBwYWRkaW5nOiAwLjdlbTsNCi19DQotDQotLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgYTpob3ZlciB7DQotICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgICBFbmQgU2NyZWVubGV0IHN0eWxlICAgICAgICAgICAgICAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICAgICAgVGFibGUgU3R5bGVzICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLmJhc2ljLXRhYmxlIHsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQotICBjb2xvcjogIzAwMDAwMDsNCi0gIG1hcmdpbi1ib3R0b206IDFlbTsNCi0gIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi1mb3JtIHRhYmxlLA0KLWZvcm0gLmJhc2ljLXRhYmxlLA0KLS5zY3JlZW5sZXQtYm9keSAuYmFzaWMtdGFibGUgew0KLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7DQotICBtYXJnaW4tYm90dG9tOiAwOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgdGQgew0KLSAgLyogU3R5bGUgZm9yIGFsbCBjZWxscyAqLw0KLSAgcGFkZGluZzogMC44ZW0gMC4xZW07DQotICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgLmFsaWduLWJvdHRvbSB7DQotICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgLmFsaWduLXRvcCB7DQotICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgLmxhYmVsLA0KLS5iYXNpYy10YWJsZSB0ciAuZ3JvdXAtbGFiZWwgew0KLSAgLyogZmllbGQgbGFiZWxzIGZvciBmb3JtcyAqLw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICB0ZXh0LWFsaWduOiByaWdodDsNCi0gIHBhZGRpbmctcmlnaHQ6IDEuNWVtOw0KLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCi0gIHdpZHRoOiAxJTsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIC5ncm91cC1sYWJlbCB7DQotICAvKiAiaGVhZGVyIiBmb3IgZmllbGQgbGFiZWwgZ3JvdXBzICovDQotICBmb250LXNpemU6IDEuMmVtOw0KLSAgcGFkZGluZzogMmVtIDEuNWVtIDAgMDsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIHRoLA0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdyB7DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIHRleHQtYWxpZ246IGxlZnQ7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdyB0ZCB7DQotICBib3JkZXItYm90dG9tOiAwLjFlbSBzb2xpZCAjMDAwMDAwOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgdGQgYSB7DQotICBjb2xvcjogIzAwMDAwMDsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93IHsNCi0gIC8qIEFsdGVybmF0aW5nIHJvdyBzdHlsZSAqLw0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5zZWxlY3RlZCB7DQotICBiYWNrZ3JvdW5kOiAjRkZGQ0NGOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3dTZWxlY3RlZCB7DQotICBiYWNrZ3JvdW5kOiAjRkZGNTVGOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLlZhbGlkYXRlIHsNCi0gIC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovDQotICBiYWNrZ3JvdW5kOiAjQTBENUY3Ow0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3dWYWxpZGF0ZSB7DQotICAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLw0KLSAgYmFja2dyb3VuZDogIzcyQThGMjsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5XYXJuIHsNCi0gIC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovDQotICBiYWNrZ3JvdW5kOiAjZjU1QzVDOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3dXYXJuIHsNCi0gIC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovDQotICBiYWNrZ3JvdW5kOiAjRkM3NDU1Ow0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgew0KLSAgLyogYnV0dG9uIGNvbHVtbiBzdHlsZSAtIGZvciB0aGUgc21hbGwNCi0gIGNvbGxlY3Rpb24gb2YgYnV0dG9ucyB1c2VkIGluIGxpc3RzICovDQotICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KLSAgcGFkZGluZzogMC4zZW07DQotfQ0KLS5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBhLA0KLS5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBidXR0b24sDQotLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGlucHV0W3R5cGU9InJlc2V0Il0sDQotLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGlucHV0W3R5cGU9InN1Ym1pdCJdLA0KLS5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBpbnB1dFt0eXBlPSJidXR0b24iXSB7DQotICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7DQotICAtbW96LWJvcmRlci1yYWRpdXM6IDFlbTsNCi0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMWVtOw0KLSAgYm9yZGVyLXJhZGl1czogMnB4Ow0KLSAgYm9yZGVyOiAwLjFlbSBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi0gIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGRpc3BsYXk6aW5saW5lLWJsb2NrOw0KLSAgZm9udC1zaXplOiAwLjllbTsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgb3V0bGluZTogMDsNCi0gIG92ZXJmbG93OiB2aXNpYmxlOw0KLSAgcGFkZGluZzogMC4xZW0gMC41ZW0gMC4yZW0gMC41ZW07DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICB3aWR0aDogYXV0bzsNCi0NCi0gICY6aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgY29sb3I6IEB3aGl0ZTsNCi0gIH0NCi19DQotDQotLmJhc2ljLXRhYmxlIC5jb2xsYXBzZWQgew0KLSAgdmlzaWJpbGl0eTogY29sbGFwc2U7DQotfQ0KLQ0KLS8qICAgICAgU29ydCBmaWVsZCBzdHlsZSAgICAgICovDQotLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGggLnNvcnQtb3JkZXItYXNjLA0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIC5zb3J0LW9yZGVyLWFzY3sNCi0gIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LWdyLXVwLnBuZykgbm8tcmVwZWF0IHJpZ2h0Ow0KLSAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCi0gIHBhZGRpbmctcmlnaHQ6IDIwcHg7IC8qIFNldHRpbmcgbXVzdCBiZSBpbiBweCAqLw0KLX0NCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCAuc29ydC1vcmRlci1kZXNjLA0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIC5zb3J0LW9yZGVyLWRlc2N7DQotICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci1kdy5wbmcpIG5vLXJlcGVhdCByaWdodDsNCi0gIHBhZGRpbmctbGVmdDogMC41ZW07DQotICBwYWRkaW5nLXJpZ2h0OiAyMHB4OyAvKiBTZXR0aW5nIG11c3QgYmUgaW4gcHggKi8NCi19DQotLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGggLnNvcnQtb3JkZXIsDQotLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGQgLnNvcnQtb3JkZXJ7DQotICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci5wbmcpIG5vLXJlcGVhdCByaWdodDsNCi0gIHBhZGRpbmctbGVmdDogMC41ZW07DQotICBwYWRkaW5nLXJpZ2h0OiAyMHB4OyAvKiBTZXR0aW5nIG11c3QgYmUgaW4gcHggKi8NCi0gIGNvbG9yOiNmZmYNCi19DQotDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgICBCZWdpbiBNZXNzYWdlIEluZm8gICAgICAgICAgICAgICAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLmNvdW50LW1lc3NhZ2Ugew0KLSAgZGlzcGxheTogZmxleDsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gIG1pbi1oZWlnaHQ6MjBweDsNCi0gIG1pbi13aWR0aDogMjBweDsNCi0gIG1heC1oZWlnaHQ6MjBweDsNCi0gIG1heC13aWR0aDogMjBweDsNCi0gIGJhY2tncm91bmQ6IEB3aGl0ZTsNCi0gIGZvbnQtc2l6ZToxMnB4Ow0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBib3JkZXItcmFkaXVzOiA1MCU7DQotfQ0KLS5pbmZvLW1lc3NhZ2UtdGl0bGUgew0KLSAgbWluLXdpZHRoOjE1MHB4Ow0KLSAgbWFyZ2luOiA1cHg7DQotICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7DQotICBmb250LXNpemU6IDE2cHg7DQotICBmb250LXdlaWdodDogYm9sZDsNCi19DQotLm1lc3NhZ2UtbGlzdCB7DQotICBwb3NpdGlvbjpyZWxhdGl2ZTsNCi0gIG1hcmdpbi10b3A6IDEwcHg7DQotICBib3gtc2hhZG93OiAxcHggM3B4IDVweCBAZ3JleWRhcms7DQotICBib3JkZXItcmFkaXVzOiAwIDVweCA1cHggMDsNCi0gIHRyYW5zaXRpb246IGhlaWdodCAyczsNCi19DQotLm1lc3NhZ2UtbGlzdC1tYWluIHsNCi0gIHBhZGRpbmc6IDVweCAxNXB4IDVweCAxNXB4Ow0KLX0NCi0ubWVzc2FnZS1saXN0LWFsZXJ0IHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBjb2xvci1hbGVydDsNCi0gIGJvcmRlci1sZWZ0IDogc29saWQgNXB4IEBjb2xvci1hbGVydC1kYXJrOw0KLSAgLmNvdW50LW1lc3NhZ2Ugew0KLSAgICBjb2xvcjogQGNvbG9yLWFsZXJ0LWRhcms7DQotICB9DQotfQ0KLS5tZXNzYWdlLWxpc3Qtc3VjY2VzcyB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3Itc3VjY2VzczsNCi0gIGJvcmRlci1sZWZ0OiBzb2xpZCA1cHggQGNvbG9yLXN1Y2Nlc3MtZGFyazsNCi0gIC5jb3VudC1tZXNzYWdlIHsNCi0gICAgY29sb3I6IEBjb2xvci1zdWNjZXNzLWRhcms7DQotICB9DQotfQ0KLS5tZXNzYWdlLWxpc3QtdGFibGUtY29udGFpbmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gIGJvcmRlci1yYWRpdXM6IDVweDsNCi0gIG92ZXJmbG93OiBoaWRkZW47DQotICBoZWlnaHQ6IDA7DQotfQ0KLS5pbmZvLW1lc3NhZ2Utc3VjY2VzcyB7DQotICBkaXNwbGF5OiBub25lOw0KLX0NCi0uaW5mby1tZXNzYWdlLWFsZXJ0IHsNCi0gIGRpc3BsYXk6IG5vbmU7DQotfQ0KLXRhYmxlLm1zZy1saXN0IHsNCi0gIHdpZHRoOiAxMDAlOw0KLSAgZm9udC1zaXplOiAxNnB4Ow0KLSAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgcGFkZGluZzogMDsNCi0gIHRoZWFkIHsNCi0gICAgaGVpZ2h0OiAxMDAlOw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsNCi0gICAgbWFyZ2luOiAwOw0KLSAgICBwYWRkaW5nOiAwOw0KLSAgICB0cnsNCi0gICAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOw0KLSAgICAgIGhlaWdodDogMTAwJTsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsNCi0gICAgICBsaW5lLWhlaWdodDogMzBweDsNCi0gICAgfQ0KLSAgfQ0KLSAgdGJvZHkgew0KLSAgICB0ciB7DQotICAgICAgbGluZS1oZWlnaHQ6IDI1cHg7DQotICAgIH0NCi0gICAgdHIubXNnLXJvdy1zdWNjZXNzIHsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3Itc3VjY2VzczsNCi0gICAgfQ0KLSAgICB0ci5tc2ctcm93LWFsZXJ0IHsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3ItYWxlcnQ7DQotICAgIH0NCi0gIH0NCi0gIHRkIHsNCi0gICAgcGFkZGluZy1sZWZ0OiA1cHg7DQotICB9DQotfQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICAgICAgRW5kICBNZXNzYWdlIEluZm8gICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgUGFnaW5hdGUgU3R5bGUgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS5wYWdpbmF0ZS1iYXItbnJkIHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gIGZvbnQtc2l6ZTogMTVweDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBncmV5Ow0KLSAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KLSAgcGFkZGluZy10b3A6IDNweDsNCi0gIHBhZGRpbmctYm90dG9tOiAzcHg7DQotICBib3gtc2hhZG93OiAwIDJweCA1cHggQHNoYWRvdy1jb2xvcjsNCi0NCi0gIHVsLnBhZ2luYXRlLXBnLWxpc3Qgew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgbWFyZ2luLXJpZ2h0OiAxMHB4Ow0KLSAgICBib3JkZXItcmFkaXVzOiA4cHg7DQotICAgIGJvcmRlcjogc29saWQgMXB4IEBib3gtYm9yZGVyLWNvbG9yOw0KLSAgICBoZWlnaHQ6IDE4cHg7DQotICAgIGxpIHsNCi0gICAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICAgIG1pbi13aWR0aDogMTdweDsNCi0gICAgICBib3JkZXItcmlnaHQ6IHNvbGlkIDFweCBAYm94LWJvcmRlci1jb2xvcjsNCi0gICAgICBwYWRkaW5nLWxlZnQ6IDJweDsNCi0gICAgICBwYWRkaW5nLXJpZ2h0OiAycHg7DQotICAgICAgaGVpZ2h0OjEwMCU7DQotICAgICAgYSB7DQotICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgICAgICAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgICAgICAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgICAgICAgaGVpZ2h0OiAxMDAlOw0KLSAgICAgICAgd2lkdGg6IDEwMCU7DQotICAgICAgfQ0KLSAgICAgIC5wYWdpbmF0ZS1kaXNhYmxlIHsNCi0NCi0gICAgICB9DQotICAgIH0NCi0gICAgbGkuc2VsZWN0ZWQgew0KLSAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICAgIGEgew0KLSAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBsaTpmaXJzdC1jaGlsZCwgbGk6bGFzdC1jaGlsZCB7DQotICAgICAgd2lkdGg6IDIwcHg7DQotICAgIH0NCi0gICAgbGk6Zmlyc3QtY2hpbGQgew0KLSAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDNweDsNCi0gICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAzcHg7DQotICAgIH0NCi0gICAgbGk6bGFzdC1jaGlsZCB7DQotICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOw0KLSAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7DQotICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDsNCi0gICAgfQ0KLSAgfQ0KLQ0KLX0NCi1zZWxlY3QucGFnaW5hdGUtc2VsZWN0IHsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGJhY2tncm91bmQ6IEB3aGl0ZTsNCi0gIGZvbnQtc2l6ZTogMTZweDsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgYm9yZGVyOiAxcHggc29saWQgQGJveC1ib3JkZXItY29sb3I7DQotICBvcHRpb24gew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBqdXN0aWZ5LXNlbGY6IGNlbnRlcjsNCi0gICAgZm9udC1zaXplOiAxNHB4Ow0KLSAgfQ0KLX0NCi0NCi0ucGFnaW5hdGUtc2VsZWN0LWxhYmVsIHsNCi0gIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gIGZvbnQtc2l6ZTogMTZweDsNCi0gIHBhZGRpbmctbGVmdDogMTVweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDE1cHg7DQotfQ0KLQ0KLS5wYWdpbmF0ZS1pbmZvcm1hdGlvbiB7DQotICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7DQotICBmb250LXNpemU6IDE2cHg7DQotICBwYWRkaW5nLWxlZnQ6IDE1cHg7DQotICBwYWRkaW5nLXJpZ2h0OiAxNXB4Ow0KLX0NCi0NCi11bC5wYWdpbmF0ZS1wZy1saXN0IGxpOmhvdmVyew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBhIHsNCi0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLSAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICB9DQotfQ0KLQ0KLS8qIEVuZCBvZiBQYWdpbmF0ZSBTdHlsZSAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICAgICAgTGlzdCBOYXZpZ2F0aW9uIFN0eWxlICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLm5hdi1wYWdlciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleWRhcms7DQotICBjb2xvcjogQHdoaXRlOw0KLSAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgZm9udC1zaXplOiA5cHg7DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIGxpbmUtaGVpZ2h0OiAzLjVlbTsNCi0gIGhlaWdodDogMy41ZW07DQotICBtYXJnaW46IDAuNWVtIDAgMC41ZW0gMDsNCi0gIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwOw0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIHsNCi0gIGRpc3BsYXk6IGlubGluZTsgLyogSUUgRml4ICovDQotfQ0KLQ0KLS5uYXYtcGFnZXIgdWwgbGkgew0KLSAgZmxvYXQ6bGVmdDsNCi0gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7DQotfQ0KLQ0KLS5uYXYtcGFnZXIgdWwgbGkgYSB7DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotLm5hdi1wYWdlciB1bCBhIHsNCi0gIGNvbG9yOiBAd2hpdGU7DQotICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsNCi0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotLm5hdi1wYWdlciB1bCBhOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIC5uYXYtcGFnZXNpemUsDQotLm5hdi1wYWdlciB1bCAubmF2LXBhZ2Utc2VsZWN0LA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1kaXNwbGF5aW5nIHsNCi0gIHBhZGRpbmc6IDAgMWVtIDAgMWVtOw0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIC5uYXYtZmlyc3QtZGlzYWJsZWQsDQotLm5hdi1wYWdlciB1bCAubmF2LXByZXZpb3VzLWRpc2FibGVkLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1uZXh0LWRpc2FibGVkLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1sYXN0LWRpc2FibGVkIHsNCi0gIHBhZGRpbmc6IDAgMWVtIDAgMWVtOw0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIC5uYXYtZmlyc3QtZGlzYWJsZWQ6aG92ZXIsDQotLm5hdi1wYWdlciB1bCAubmF2LXByZXZpb3VzLWRpc2FibGVkOmhvdmVyLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1uZXh0LWRpc2FibGVkOmhvdmVyLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1sYXN0LWRpc2FibGVkOmhvdmVyIHsNCi0gIGN1cnNvcjogbm90LWFsbG93ZWQ7DQotfQ0KLQ0KLQ0KLS5uYXYtcGFnZXIgdWwgLm5hdi1kaXNwbGF5aW5nIHsNCi0gIGJvcmRlci1yaWdodDogbm9uZTsNCi19DQotDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICAgICBNdWx0aS1Db2x1bW4gU3R5bGVzICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotI2NvbHVtbi1jb250YWluZXIgew0KLSAgbWFyZ2luOiBhdXRvOw0KLSAgcGFkZGluZzogMWVtOw0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgbWluLXdpZHRoOiBAbWluLWNvbnRhaW5lci13aWR0aDsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgaDEsDQotI2NvbHVtbi1jb250YWluZXIgLmgxLA0KLSNjb2x1bW4tY29udGFpbmVyIGgyLA0KLSNjb2x1bW4tY29udGFpbmVyIC5oMiB7DQotICBtYXJnaW4tYm90dG9tOiAwLjVlbTsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgaDEsDQotI2NvbHVtbi1jb250YWluZXIgLmgxIHsNCi0gIGNvbG9yOiAjNTU3OTk2Ow0KLX0NCi0NCi0jY29sdW1uLWNvbnRhaW5lciAubGVmdCB7DQotICBmbG9hdDogbGVmdDsNCi0gIC8qIGFsdDogcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyAqLw0KLSAgd2lkdGg6IDIyZW07DQotICBtYXJnaW4tcmlnaHQ6IDFlbTsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLmxlZnQtbGFyZ2VyIHsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgLyogYWx0OiBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7ICovDQotICB3aWR0aDogMjVlbTsNCi0gIG1hcmdpbi1yaWdodDogMWVtOw0KLX0NCi0NCi0ubGVmdGhhbGYgew0KLSAgZmxvYXQ6IGxlZnQ7DQotICBoZWlnaHQ6IDElOw0KLSAgbGVmdDogMDsNCi0gIG1hcmdpbjogMCUgMSUgMSUgMCU7DQotICB3aWR0aDogNDklOw0KLX0NCi0NCi0ucmlnaHRoYWxmIHsNCi0gIGZsb2F0OiByaWdodDsNCi0gIGhlaWdodDogMSU7DQotICBtYXJnaW46IDAgMCAxJSAxJTsNCi0gIHJpZ2h0OiAwOw0KLSAgd2lkdGg6IDQ5JTsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLnJpZ2h0IHsNCi0gIGZsb2F0OiByaWdodDsNCi0gIG1hcmdpbi1sZWZ0OiAxZW07DQotICB3aWR0aDogMjJlbTsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLmxlZnRvbmx5IHsNCi0gIG1hcmdpbi1sZWZ0OiAyM2VtOw0KLSAgd2lkdGg6IGF1dG87DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5sZWZ0b25seS1sYXJnZXIgew0KLSAgbWFyZ2luLWxlZnQ6IDI2ZW07DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLnJpZ2h0b25seSB7DQotICBtYXJnaW4tcmlnaHQ6IDIzZW07DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLmNlbnRlciB7DQotICBtYXJnaW4tbGVmdDogMjNlbTsNCi0gIG1hcmdpbi1yaWdodDogMjNlbTsNCi0gIHdpZHRoOiBhdXRvOw0KLX0NCi0NCi0jY29sdW1uLWNvbnRhaW5lciAubm9jb2x1bW5zIHsNCi0gIHdpZHRoOiBhdXRvOw0KLX0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgICBCdXR0b24gU3R5bGUgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0uYnV0dG9uLWJhciBsaS5idXR0b250ZXh0IGEsDQotYS5idXR0b250ZXh0LA0KLWEuYnV0dG9udGV4dGJpZywNCi0uc21hbGxTdWJtaXQsDQotLnNtYWxsU3VibWl0OmhvdmVyLA0KLS5tZWRpdW1TdWJtaXQsDQotLmxhcmdlU3VibWl0LA0KLS5sb2dpbkJ1dHRvbiwNCi0uYnV0dG9uLXN0eWxlLTEgYSwNCi0uYnV0dG9uLXN0eWxlLTEgdWwgYSwNCi0uYnV0dG9uLXN0eWxlLTIgdWwgYSwNCi0uYnV0dG9uLXN0eWxlLTIgYSwNCi0uYnV0dG9uLA0KLWJ1dHRvbiwNCi1pbnB1dFt0eXBlPSJyZXNldCJdLA0KLWlucHV0W3R5cGU9InN1Ym1pdCJdLA0KLWlucHV0W3R5cGU9ImJ1dHRvbiJdIHsNCi0gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsNCi0gIC1tb3otYm9yZGVyLXJhZGl1czogMS4xZW07DQotICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEuMWVtOw0KLSAgYm9yZGVyLXJhZGl1czogMnB4Ow0KLSAgYm9yZGVyOiAwLjFlbSBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi0gIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGRpc3BsYXk6aW5saW5lLWJsb2NrOw0KLSAgZm9udC1zaXplOiAxZW07DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIG91dGxpbmU6IDA7DQotICBvdmVyZmxvdzogdmlzaWJsZTsNCi0gIHBhZGRpbmc6IDAuNGVtIDFlbSAwLjRlbTsNCi0gIHRleHQtZGVjb3JhdGlvbjpub25lOw0KLSAgLyp0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Ki8NCi0gIHdpZHRoOiBhdXRvOw0KLQ0KLSAgLyogSUU3ICovDQotICAqcGFkZGluZy10b3A6IDAuMmVtOw0KLSAgKnBhZGRpbmctYm90dG9tOiAwOw0KLSAgJjpob3ZlciB7DQotICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICB9DQotfQ0KLQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgIEZvb3RlciBTdHlsZSAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLSNmb290ZXIgew0KLSAgYmFja2dyb3VuZDogQGRhcmstY29sb3ItdGhlbWU7DQotICBib3JkZXItdG9wOiAwLjFlbSBpbnNldCAjMDAwOw0KLSAgcGFkZGluZzogMC41ZW0gMCAwLjVlbSAwLjVlbTsNCi0NCi0gIGhlaWdodDogQGZvb3Rlci1oZWlnaHQ7DQotICBwb3NpdGlvbjogZml4ZWQ7DQotICBib3R0b206IDA7DQotICB3aWR0aDogMTAwJTsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsNCi0gIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZiAhaW1wb3J0YW50Ow0KLSAgei1pbmRleDogMTA7DQotDQotICBzcGFuIHsNCi0gICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLSAgICBwYWRkaW5nOiAxMHB4Ow0KLSAgfQ0KLQ0KLSAgYSB7DQotICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsNCi0gIH0NCi19DQotDQotI2Zvb3RlciBhOmZvY3VzIHsNCi0gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KLX0NCi0NCi0jZm9vdGVyLW9mZnNldCB7DQotICBoZWlnaHQ6IEBmb290ZXItaGVpZ2h0ICsgMTBweDsNCi0gIHdpZHRoOiAxMDAlOw0KLX0NCisvKiBjb21tb24gY29sb3JzICovCitAYmxhY2s6ICMwMDA7CitAd2hpdGU6ICNmZmY7CitAZ3JleTogI2U2ZTZlNjsKK0BncmV5ZGFyazogIzkyOTI5MjsKKworQGNvbG9yLXN1Y2Nlc3M6ICM4Y2ZmOGM7CitAZm9udC1jb2xvci1mb3Itc3VjY2VzczogQGJsYWNrOworQGNvbG9yLWFsZXJ0OiAjZmY4YzhjOworQGZvbnQtY29sb3ItZm9yLWFsZXJ0OiBAYmxhY2s7CisKK0Bjb2xvci1zdWNjZXNzLWRhcms6ICMzNTZlMzU7CitAZm9udC1jb2xvci1mb3Itc3VjY2VzczogQGJsYWNrOworQGNvbG9yLWFsZXJ0LWRhcms6ICM5MzJmMzM7CitAZm9udC1jb2xvci1mb3ItYWxlcnQ6IEBibGFjazsKKworQGNvbG9yLWJhY2tncm91bmQtYWxlcnQ6ICNmMmRlZGU7CitAY29sb3ItZm9udC1hbGVydDogI2E5NDQ0MjsKK0Bjb2xvci1ib3JkZXItYWxlcnQ6ICNlYmNjZDE7CisKK0Bjb2xvci1iYWNrZ3JvdW5kLXN1Y2Nlc3M6ICNkZmYwZDg7CitAY29sb3ItZm9udC1zdWNjZXNzOiAjM2M3NjNkOworQGNvbG9yLWJvcmRlci1zdWNjZXNzOiAjZDZlOWM2OworCisvKiBTYXBoaXIgY29sb3JzICovCitAYmx1ZS1kYXJrOiAjMDAyMzMzOworQGJsdWUtbWFpbjogIzAwNTk4MjsKK0BibHVlLW1lZGl1bTogI2M3ZGZmZjsKK0BibHVlLWxpZ2h0OiAjZjFmN2ZmOworQGJsdWUtbGlnaHQyOiAjZTRmMGY1OworCisvKiBSdWJ5IGNvbG9ycyAqLworQHJlZC1kYXJrOiAjNDIwMDAwOworQHJlZC1tYWluOiAjYmYxNjE2OworQHJlZC1tZWRpdW06ICNmN2JhYmE7CitAcmVkLWxpZ2h0OiAjZmNlN2U3OworQHJlZC1saWdodDI6ICNmZWQ3Yzk7CisKKy8qIEVtZXJhbGQgY29sb3JzICovCitAZ3JlZW4tZGFyazogIzE5Nzk0ODsKK0BncmVlbi1tYWluOiAjMjNhZjliOworQGdyZWVuLW1lZGl1bTogIzdhZTNhZDsKK0BncmVlbi1saWdodDogI2U1ZjllZjsKK0BncmVlbi1saWdodDI6ICNkN2Y5ZWY7CisKKy8qIEFtYmVyIGNvbG9ycyAqLworQGFtYmVyLWRhcms6ICNiYzQyMTY7CitAYW1iZXItbWFpbjogI2YwODkwNjsKK0BhbWJlci1tZWRpdW06ICNmNWM0YjM7CitAYW1iZXItbGlnaHQ6ICNmY2VkZTg7CitAYW1iZXItbGlnaHQyOiAjZmNlZGNkOworCisvKiBTYXBoaXIgdGhlbWUgKi8KKy8qCitAbWFpbi1jb2xvci10aGVtZSA6IEBibHVlLW1haW47CitAZGFyay1jb2xvci10aGVtZSA6IEBibHVlLWRhcms7CitAbWVkaXVtLWNvbG9yLXRoZW1lIDogQGJsdWUtbWVkaXVtOworQGxpZ2h0LWNvbG9yLXRoZW1lIDogQGJsdWUtbGlnaHQ7CitAbGlnaHQyLWNvbG9yLXRoZW1lIDogQGJsdWUtbGlnaHQyOworQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAZ3JleTsKK0Bmb250LWNvbG9yLWZvci1tYWluIDogQHdoaXRlOworQGZvbnQtY29sb3ItZm9yLW1lZGl1bSA6IEBkYXJrLWNvbG9yLXRoZW1lOworQGZvbnQtY29sb3ItZm9yLWxpZ2h0IDogQGRhcmstY29sb3ItdGhlbWU7CitAc2hhZG93LWNvbG9yIDogQGJsYWNrOworQHNoYWRvdy1jb2xvci1saWdodCA6IEBncmV5ZGFyazsKKyovCisKKy8qIFJ1YnkgdGhlbWUgKi8KKy8qCitAbWFpbi1jb2xvci10aGVtZSA6IEByZWQtbWFpbjsKK0BkYXJrLWNvbG9yLXRoZW1lIDogQHJlZC1kYXJrOworQG1lZGl1bS1jb2xvci10aGVtZSA6IEByZWQtbWVkaXVtOworQGxpZ2h0LWNvbG9yLXRoZW1lIDogQHJlZC1saWdodDsKK0BsaWdodDItY29sb3ItdGhlbWUgOiBAcmVkLWxpZ2h0MjsKK0Bmb250LWNvbG9yLWZvci1kYXJrIDogQGdyZXk7CitAZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsKK0Bmb250LWNvbG9yLWZvci1tZWRpdW0gOiBAZGFyay1jb2xvci10aGVtZTsKK0Bmb250LWNvbG9yLWZvci1saWdodCA6IEBkYXJrLWNvbG9yLXRoZW1lOworQHNoYWRvdy1jb2xvciA6IEBibGFjazsKK0BzaGFkb3ctY29sb3ItbGlnaHQgOiBAZ3JleWRhcms7CisvKgorCisvKiBFbWVyYWxkIHRoZW1lICovCisvKgorQG1haW4tY29sb3ItdGhlbWUgOiBAZ3JlZW4tbWFpbjsKK0BkYXJrLWNvbG9yLXRoZW1lIDogQGdyZWVuLWRhcms7CitAbWVkaXVtLWNvbG9yLXRoZW1lIDogQGdyZWVuLW1lZGl1bTsKK0BsaWdodC1jb2xvci10aGVtZSA6IEBncmVlbi1saWdodDsKK0BsaWdodDItY29sb3ItdGhlbWUgOiBAZ3JlZW4tbGlnaHQyOworQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAd2hpdGU7CitAZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsKK0Bmb250LWNvbG9yLWZvci1tZWRpdW0gOiBAZGFyay1jb2xvci10aGVtZTsKK0Bmb250LWNvbG9yLWZvci1saWdodCA6IEBkYXJrLWNvbG9yLXRoZW1lOworQHNoYWRvdy1jb2xvciA6IEBibGFjazsKK0BzaGFkb3ctY29sb3ItbGlnaHQgOiBAZ3JleWRhcms7CisqLworLyogQW1iZXIgdGhlbWUgKi8KK0BtYWluLWNvbG9yLXRoZW1lIDogQGFtYmVyLW1haW47CitAZGFyay1jb2xvci10aGVtZSA6IEBhbWJlci1kYXJrOworQG1lZGl1bS1jb2xvci10aGVtZSA6IEBhbWJlci1tZWRpdW07CitAbGlnaHQtY29sb3ItdGhlbWUgOiBAYW1iZXItbGlnaHQ7CitAbGlnaHQyLWNvbG9yLXRoZW1lIDogQGFtYmVyLWxpZ2h0MjsKK0Bmb250LWNvbG9yLWZvci1kYXJrIDogQHdoaXRlOworQGZvbnQtY29sb3ItZm9yLW1haW4gOiBAd2hpdGU7CitAZm9udC1jb2xvci1mb3ItbWVkaXVtIDogQGRhcmstY29sb3ItdGhlbWU7CitAZm9udC1jb2xvci1mb3ItbGlnaHQgOiBAZGFyay1jb2xvci10aGVtZTsKK0BzaGFkb3ctY29sb3IgOiBAYmxhY2s7CitAc2hhZG93LWNvbG9yLWxpZ2h0IDogQGdyZXlkYXJrOworCisKK0BhcHAtYmFyLWhlaWdodDogNjBweDsKK0BzdWItYXBwLWJhci1oZWlnaHQ6IDQwcHg7CitAZm9vdGVyLWhlaWdodDogMjBweDsKK0Bob21lLWJ0bi13aWR0aDogNDdweDsKK0Bjb2xvci1saW5lLWhlaWdodDogOXB4OworCitAaG9tZS1tZW51LXRpbGUtaGVpZ2h0OiA4MHB4OworQGhvbWUtbWVudS10aWxlLW1pbi13aWR0aDogMTAwcHg7CitAaG9tZS1tZW51LXRpbGUtbWF4LXdpZHRoOiAxMDBweDsKKworQHRoaXJkLWx2bC1oZWlnaHQ6IDgwcHg7CitAdGhpcmQtbHZsLXdpZHRoIDogMTAwcHg7CitAbWluLXNjcmVlbiA6IDExNzBweDsKK0BtaW4tY29udGFpbmVyLXdpZHRoOiAxMTMwcHg7CisKK0Bib3gtYm9yZGVyLWNvbG9yOiAjZDdkN2Q3OworCitAZm9udC1mYWNlIHsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBzcmM6IHVybCgnZm9udHMvcXVpY2tzYW5kL3F1aWNrc2FuZGJvbGQub3RmJyk7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIGZvbnQtc3R5bGU6IG5vcm1hbDsKK30KKworQGZvbnQtZmFjZSB7CisgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsKKyAgc3JjOiB1cmwoJ2ZvbnRzL3F1aWNrc2FuZC9xdWlja3NhbmRib2xkLm90ZicpOworICBmb250LXdlaWdodDogYm9sZDsKKyAgZm9udC1zdHlsZTogbm9ybWFsOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBCZWdpbiBzcGVjaWFsIGNoZWNrYm94IHR5cGUgc3dpdGNoICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1t0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLWNoa2JveCwgW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94IHsKKyAgZGlzcGxheTogbm9uZTsKK30KKworW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtY2hrYm94ICsgbGFiZWwsCitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1jaGtib3ggKyBsYWJlbHsKKyAgY3Vyc29yOiBwb2ludGVyOworfQorW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtY2hrYm94ICsgbGFiZWw6YmVmb3JlLAorW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94ICsgbGFiZWw6YmVmb3JleworICBjb250ZW50OiAiIjsKKyAgd2lkdGg6IDE1MHB4OworICBtaW4td2lkdGg6IDE1MHB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQtY29sb3ItdGhlbWU7CisgIHBhZGRpbmc6IDJweCAyMHB4IDJweCAyMHB4OworICBib3JkZXItcmFkaXVzOiA4cHggOHB4IDhweCA4cHg7CisKKyAgY3Vyc29yOiBwb2ludGVyOworfQorCitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1jaGtib3ggKyBsYWJlbDphZnRlciwKK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCArIGxhYmVsOmFmdGVyeworICBjb250ZW50OiAiIjsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBsZWZ0Oi0zNXB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgbWluLWhlaWdodDogMTBweDsKKyAgbWluLXdpZHRoOiAxMHB4OworICBwYWRkaW5nLWxlZnQ6IDRweDsKKyAgcGFkZGluZy1yaWdodDogNXB4OworICBib3JkZXItcmFkaXVzOiA4cHggOHB4IDhweCA4cHg7CisgIHRyYW5zaXRpb246IGFsbCAuMnM7Cit9CisKK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCArIGxhYmVsOmFmdGVyeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGxlZnQ6IC0xNXB4OworICB0cmFuc2l0aW9uOiBhbGwgLjJzOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRW5kIHNwZWNpYWwgY2hlY2tib3ggdHlwZSBzd2l0Y2ggKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogIEJlZ2luIHNxdWFyZSBDaGVja2JveCAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94LAorW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiAtOTk5OXB4OworfQorCitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWwsCitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWx7CisgIGNvbnRlbnQ6ICcnOworICBwYWRkaW5nLWxlZnQ6IDM1cHg7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgY3Vyc29yOiBwb2ludGVyOworICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogMTJweDsKKworfQorW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmJlZm9yZSwKK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDpiZWZvcmV7CisgIGNvbnRlbnQ6ICcnOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6MTBweDsKKyAgdG9wOiAtNHB4OworICB3aWR0aDogMTdweDsKKyAgaGVpZ2h0OiAxN3B4OyAvKiBkaW0uIGRlIGxhIGNhc2UgKi8KKyAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKKyAgYmFja2dyb3VuZDogQGxpZ2h0LWNvbG9yLXRoZW1lOworICBib3JkZXItcmFkaXVzOiAycHg7Cit9CisKK1t0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDpiZWZvcmUgeworICBiYWNrZ3JvdW5kOiBAbGlnaHQtY29sb3ItdGhlbWU7Cit9CitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YmVmb3JleworICBiYWNrZ3JvdW5kOiBAbWFpbi1jb2xvci10aGVtZTsKK30KKworW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyLAorW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyeworICBjb250ZW50OiAn4pyUJzsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IC00cHg7CisgIGxlZnQ6IDE0cHg7CisgIGZvbnQtc2l6ZTogMTZweDsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICB0cmFuc2l0aW9uOiBhbGwgLjJzOworfQorW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyIHsKKyAgb3BhY2l0eTogMDsKKyAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKK30KK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDphZnRlciB7CisgIG9wYWNpdHk6IDE7CisgIHRyYW5zZm9ybTogc2NhbGUoMSk7Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogIEVuZCBzcXVhcmUgQ2hlY2tib3ggICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgQmVnaW4gY2xhc3MgY29udGVudCBtZ210ICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisuZmxleC1yb3cgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogcm93ICFpbXBvcnRhbnQ7Cit9CisuZmxleC1jb2x1bW4geworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworfQorCisuY29sLXdpZHRoLTEgeworICB3aWR0aDogMTAlOworfQorLmNvbC13aWR0aC0yIHsKKyAgd2lkdGg6IDIwJTsKK30KKy5jb2wtd2lkdGgtMyB7CisgIHdpZHRoOiAzMCU7Cit9CisuY29sLXdpZHRoLTQgeworICB3aWR0aDogNDAlOworfQorLmNvbC13aWR0aC01IHsKKyAgd2lkdGg6IDUwJTsKK30KKy5jb2wtd2lkdGgtNiB7CisgIHdpZHRoOiA2MCU7Cit9CisuY29sLXdpZHRoLTcgeworICB3aWR0aDogNzAlOworfQorLmNvbC13aWR0aC04IHsKKyAgd2lkdGg6IDgwJTsKK30KKy5jb2wtd2lkdGgtOSB7CisgIHdpZHRoOiA5MCU7Cit9CisuY29sLXdpZHRoLTEwIHsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKy5hbGlnbi12LWNlbnRlciB7CisgIGRpc3BsYXk6ZmxleDsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKK30KKworLmFsaWduLWgtY2VudGVyIHsKKyAgZGlzcGxheTpmbGV4OworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgIEVuZCBjbGFzcyBjb250ZW50IG1nbXQgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBCZWdpbiBidG4tc29ydCAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy5idG4tc29ydCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgdG9wOiAtNnB4OworICBib3JkZXI6bm9uZTsKKyAgYmFja2dyb3VuZDpub25lOworICBib3JkZXItcmFkaXVzOiAwOworICBtYXJnaW4tbGVmdDo1cHg7Cit9CisKKy5idG4tc29ydDpiZWZvcmV7CisgIGNvbnRlbnQ6ICcnOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IC0xcHg7CisgIHdpZHRoOiAwOworICBoZWlnaHQ6IDA7CisgIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCBAZ3JleWRhcms7CisgIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50OworfQorCisuYnRuLXNvcnQ6YWZ0ZXJ7CisgIGNvbnRlbnQ6ICcnOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAtMXB4OworICB3aWR0aDogMDsKKyAgaGVpZ2h0OiAwOworICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CisgIGJvcmRlci10b3A6IDEwcHggc29saWQgQGdyZXlkYXJrOworICBib3JkZXItbGVmdDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTM0OXB4KSB7CisgICAgcmlnaHQ6IC01cHg7CisgIH0KK30KKworLmJ0bi1zb3J0LmJ0bi1zb3J0LWFzYzpiZWZvcmV7CisgIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgQG1haW4tY29sb3ItdGhlbWU7Cit9CisKKy5idG4tc29ydC5idG4tc29ydC1kZXNjOmFmdGVyeworICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRW5kIGJ0bi1zb3J0ICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBCZWdpbiBkZWZhdXQgY29sb3VyIGNsYXNzICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLmRhcmstY29sb3IgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcmsgIWltcG9ydGFudDsKK30KKy5tYWluLWNvbG9yIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluICFpbXBvcnRhbnQ7Cit9CisubWVkaXVtLWNvbG9yIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1lZGl1bS1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1lZGl1bSAhaW1wb3J0YW50OworfQorLmxpZ2h0LWNvbG9yIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbGlnaHQgIWltcG9ydGFudDsKK30KKy5saWdodDItY29sb3IgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQyLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbGlnaHQgIWltcG9ydGFudDsKK30KKworLmdyZXktY29sb3IgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleSAhaW1wb3J0YW50OworfQorLmRhcmtncmV5LWNvbG9yIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXlkYXJrICFpbXBvcnRhbnQ7Cit9CisKKy8qIGJlZ2luIGxvb2t1cCB3aWRnZXQgKi8KKy51aS1kaWFsb2cgeworICBvcGFjaXR5OiAxOworICB6LWluZGV4OiA1MDsKK30KKworLnVpLWRpYWxvZy10aXRsZWJhci51aS13aWRnZXQtaGVhZGVyLnVpLWNvcm5lci1hbGwudWktaGVscGVyLWNsZWFyZml4IHsKKyAgYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICBidXR0b24geworICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lOworICB9Cit9CisvKiBlbmQgbG9va3VwIHdpZGdldCAqLworCisubWFpbi1iYXItbGFiZWwgeworICBjb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lOworICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgcGFkZGluZy1yaWdodDogNnB4OworICBmb250LXNpemU6IDE1cHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisjY29tcGFueS1sb2dvIHsKKyAgcmlnaHQ6IDEwcHg7CisgIHRvcDogMnB4OworICBiYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9vZmJpei1zaW1wbGUtd2hpdGUuc3ZnIikgbm8tcmVwZWF0IGxlZnQgdG9wIC8gY292ZXI7CisgIG1pbi1oZWlnaHQ6IDUwcHg7CisgIG1pbi13aWR0aDogNTBweDsKKyAgbWFyZ2luLXJpZ2h0OiAxNXB4OworICBhbGlnbi1zZWxmOiBjZW50ZXI7CisgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGggOiAxMjMycHgpIHsKKyAgICBtaW4taGVpZ2h0OiA1MHB4OworICAgIG1pbi13aWR0aDogMTI5cHg7CisgICAgYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvb2ZiaXotd2hpdGUuc3ZnIikgbm8tcmVwZWF0IGxlZnQgdG9wIC8gY292ZXI7CisgIH0KK30KKworLm1vZGFsLXNjcmVlbiB7CisgIHZpc2liaWxpdHk6IGhpZGRlbjsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7CisgIG9wYWNpdHk6IC45MzsKKyAgcG9zaXRpb246IGZpeGVkOworICB0b3A6IDA7CisgIGxlZnQ6IDA7CisgIGhlaWdodDogMTAwJTsKKyAgd2lkdGg6IDEwMCU7CisgIHotaW5kZXg6IDk5OTk7Cit9CisKKy5tb2RhbC1ib3h7CisgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgb3BhY2l0eTogMTsKKyAgbWFyZ2luOiAxMCU7CisgIGJvcmRlci1yYWRpdXM6IDEwcHg7CisgIGJvcmRlcjogc29saWQgMnB4IEBtYWluLWNvbG9yLXRoZW1lOworICBwYWRkaW5nIDogMTBweCA0MHB4IDEwcHggNDBweDsKKyAgLm1vZGFsLWhlYWRlciB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgICBoMiB7CisgICAgICBmb250LXNpemU6IDI1cHg7CisgICAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIH0KKyAgICAuYnRuLWNsb3NlLW5yZCB7CisgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICByaWdodDogMDsKKyAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICAgIGJvcmRlcjogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgYm9yZGVyLXJhZGl1czogNXB4OworICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgZm9udC1zaXplOiAyNXB4OworICAgICAgaGVpZ2h0OiAzMHB4OworICAgICAgd2lkdGg6IDMwcHg7CisgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKKyAgICB9CisgIH0KKyAgLm1vZGFsLWJvZHkgeworICAgIHAgeworICAgICAgZm9udC1zaXplOiAyMHB4OworICAgIH0KKyAgfQorICAubW9kYWwtZm9vdGVyIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgaGVpZ2h0OiAzNXB4OworICAgIGRpc3BsYXk6IGZsZXg7CisgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKKyAgICAuYnRuLW5yZCB7CisgICAgICBiYWNrZ3JvdW5kOiBub25lOworICAgICAgYm9yZGVyOiBub25lOworICAgICAgdGV4dC1zaGFkb3c6IG5vbmU7CisgICAgICBvcGFjaXR5OiAxOworICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OworICAgICAgZm9udC1zaXplOiAyMHB4OworICAgICAgcGFkZGluZzogNXB4OworICAgICAgYm9yZGVyLXJhZGl1czogOHB4OworICAgIH0KKyAgICAuYnRuLW5yZC1tYWluIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgY29sb3I6IEB3aGl0ZTsKKyAgICB9CisgICAgLmJ0bi1ucmQtc3RkIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICAgIGJvcmRlcjogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgICAgfQorICB9Cit9CisuYnRuLW5yZDpob3ZlciB7CisgIGJveC1zaGFkb3c6IDVweCA1cHggM3B4IDAgQGJsYWNrOworfQorCisuYnRuLW5yZC1zdGQ6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICBjb2xvcjogQHdoaXRlICFpbXBvcnRhbnQ7CisgIGJvcmRlcjogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7Cit9CisKKy5idG4tY2xvc2UtbnJkOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgY29sb3I6IEB3aGl0ZSAhaW1wb3J0YW50OworfQorCisubGlzdC1ucmQgeworICBib3JkZXI6IHNvbGlkIDJweCBAbWFpbi1jb2xvci10aGVtZTsKKyAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMTBweDsKKyAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDEwcHg7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgIG1hcmdpbi10b3A6IDE1cHg7CisgIG1hcmdpbi1ib3R0b206IDE1cHg7CisgIC50aXRsZS1saXN0LW5yZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgY29sb3IgOiBAd2hpdGU7CisgICAgZm9udC1zaXplOiAyMHB4OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHBhZGRpbmctbGVmdDogNXB4OworICB9CisKKyAgbGkgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgICAgZm9udC1zaXplOiAyMHB4OworICAgIHBhZGRpbmctbGVmdDogNXB4OworICAgIHBhZGRpbmctdG9wOiAycHg7CisgICAgcGFkZGluZy1ib3R0b206IDJweDsKKyAgICBtYXJnaW4tYm90dG9tOiAzcHg7CisgICAgYSB7CisgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgfQorICAgIHNwYW4geworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgcmlnaHQ6IDA7CisgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgICBmb250LXNpemU6IDMwcHg7CisgICAgfQorICB9Cit9CitsaS5saW5lLW9kZCB7CisgIGJhY2tncm91bmQtY29sb3I6IEBsaWdodC1jb2xvci10aGVtZTsKK30KKworI3VzZXItYXZhdGFyIHsKKyAgaGVpZ2h0OiA0MHB4OworICB3aWR0aDogNDBweDsKKyAgcGFkZGluZzogMnB4OworCisgIGFsaWduLXNlbGY6IGNlbnRlcjsKKworICA6aG92ZXIgeworICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgfQorICBpbWcgeworICAgIG1heC1oZWlnaHQ6IDQwcHg7CisgICAgbWF4LXdpZHRoOiA0MHB4OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB0b3A6IC0ycHg7CisgICAgcGFkZGluZzogMnB4OworICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgICBib3JkZXItcmFkaXVzOiAycHg7CisgIH0KK30KKworI21haW4tbmF2aWdhdGlvbi1iYXIgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHdpZHRoOiAxMDAlOworICBtaW4td2lkdGg6IEBtaW4tY29udGFpbmVyLXdpZHRoOworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogcm93OworICBhbGlnbi1pdGVtczogY2VudGVyOworICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CisgIGZvbnQtZmFtaWx5OiBRdWlja3NhbmQsc2Fucy1zZXJpZjsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIHotaW5kZXg6IDU7CisgIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0OworfQorI21haW4tbmF2LWJhci1sZWZ0IHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBkaXNwbGF5OiBmbGV4OworICBhbGlnbi1pdGVtczogY2VudGVyOworfQorI21haW4tbmF2LWJhci1yaWdodCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgZGlzcGxheTogZmxleDsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgcGFkZGluZy1yaWdodDogMTVweDsKK30KKworLmFwcC1idG57CisgIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgZGlzcGxheTogZmxleDsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgbWFyZ2luLXJpZ2h0OiAycHg7CisgIG1hcmdpbi1sZWZ0OiAycHg7CisgIGEgeworICAgIHBhZGRpbmc6MTBweDsKKyAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7CisgICAgZm9udC1zaXplOiAxLjRlbSAhaW1wb3J0YW50OworICB9Cit9CisKKy5hcHAtYnRuIGE6dmlzaXRlZCB7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKK30KKworLmFwcC1idG46aG92ZXJ7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgdG9wOiAtNnB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNXB4OworICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNXB4OworICBib3gtc2hhZG93OiAxcHggMXB4IDEycHggQHNoYWRvdy1jb2xvcjsKKyAgYSB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHRvcDogNnB4OworICAgIGNvbG9yIDogQGZvbnQtY29sb3ItZm9yLW1haW47CisgIH0KK30KKy5hcHAtYnRuLnNlbGVjdGVkOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIGJveC1zaGFkb3c6IG5vbmU7CisgIHRvcDowOworfQorCisuYXBwLWJ0biBhOmhvdmVyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorI2FwcC1zZWxlY3RlZCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICBib3gtc2hhZG93OiAxcHggLTJweCAxMnB4IEBzaGFkb3ctY29sb3I7CisgIHotaW5kZXg6IDA7CisgIG9wYWNpdHk6IC45OTsKKyAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyA6IDhweCA7CisgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzIDogOHB4IDsKKyAgYSB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHRvcDogM3B4OworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgfQorfQorLmFwcC1idG4uc2VsZWN0ZWQgYTpob3ZlciB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworI2FwcC1iYXItbGluZSB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgd2lkdGg6IDEwMCU7CisgIG1pbi13aWR0aDogQG1pbi1jb250YWluZXItd2lkdGg7CisgIGhlaWdodDogQGNvbG9yLWxpbmUtaGVpZ2h0OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgYm94LXNoYWRvdzogMnB4IDJweCA1cHggQHNoYWRvdy1jb2xvcjsKK30KKyNjb2xvci1hZGQgeworICB3aWR0aDogMTUwcHg7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICBoZWlnaHQ6IEBjb2xvci1saW5lLWhlaWdodDsKKyAgei1pbmRleDogMjA7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgdG9wOiBAY29sb3ItbGluZS1oZWlnaHQ7Cit9CisKKyNtb3JlLWFwcCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgZGlzcGxheTogZmxleDsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBmb250LXNpemU6IDEuNGVtICFpbXBvcnRhbnQ7CisgIHdpZHRoOiA0MHB4OworICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodDsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworfQorI21vcmUtYXBwOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKyNtb3JlLWFwcDpob3ZlciAjbW9yZS1hcHAtbGlzdCB7CisgIGRpc3BsYXk6IGJsb2NrOworfQorI21vcmUtYXBwLnNlbGVjdGVkIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7Cit9CisKKyNtb3JlLWFwcC1saXN0IHsKKyAgZGlzcGxheTogbm9uZTsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IEBhcHAtYmFyLWhlaWdodDsKKyAgbGVmdDogLTIwcHg7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICB6LWluZGV4OiAxMDsKKyAgYm9yZGVyOiBzb2xpZCA0cHggQG1haW4tY29sb3ItdGhlbWU7CisgIGJvcmRlci10b3Atd2lkdGg6IEBjb2xvci1saW5lLWhlaWdodDsKKyAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OworICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OworICBsaSB7CisgICAgcGFkZGluZy1sZWZ0IDogNHB4OworICAgIHBhZGRpbmctcmlnaHQ6IDRweDsKKyAgfQorCisgIGEgeworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICBmb250LXNpemU6IDE1cHg7CisgIH0KKworICA6aG92ZXIgeworICAgIGJhY2tncm91bmQtY29sb3I6IEBtZWRpdW0tY29sb3ItdGhlbWU7CisgICAgYSB7CisgICAgICBib3gtc2hhZG93OiBub25lOworICAgICAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICAgIH0KKyAgICBhOmhvdmVyeworICAgICAgYm94LXNoYWRvdzogbm9uZTsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgIGJvcmRlci1yYWRpdXM6IDA7CisgICAgfQorICB9CisKKyAgbGkuc2VsZWN0ZWQgeworICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIGEgeworICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICAgIH0KKyAgICBhOmhvdmVyIHsKKyAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIH0KKyAgfQorfQorCisjaG9tZUJ1dHRvbiB7CisgIGRpc3BsYXk6IGZsZXg7CisgIC8vdmlzaWJpbGl0eTogaGlkZGVuOworICBhbGlnbi1pdGVtczogY2VudGVyOworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgYmFja2dyb3VuZC1jb2xvcjpAZ3JleTsKKyAgYm9yZGVyOiBub25lOworICBib3JkZXItcmFkaXVzIDogMDsKKworICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodDsKKyAgd2lkdGggOiBAaG9tZS1idG4td2lkdGg7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgaW1nIHsKKyAgICBoZWlnaHQ6IDI1cHg7CisgICAgdHJhbnNpdGlvbjogYWxsIC4ycyBlYXNlLWluLW91dDsKKyAgfQorfQorCisjaG9tZUJ1dHRvbjpob3ZlciBpbWcgeworICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7Cit9CisKKyNhcHAtYmFyLWxpc3QgeworICBkaXNwbGF5OiBmbGV4OworfQorCisjdXNlci1kZXRhaWxzIHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICByaWdodDogMjBweDsKKyAgdG9wIDogNjJweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIGNvbG9yIDogQGZvbnQtY29sb3ItZm9yLWRhcms7CisgIGZvbnQtc2l6ZTogMTVweDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIHBhZGRpbmctdG9wOiA1cHg7CisgIHBhZGRpbmctYm90dG9tOiAxMHB4OworICB6LWluZGV4OiAxNTsKKyAgYm94LXNoYWRvdzogM3B4IDNweCAxMnB4IEBzaGFkb3ctY29sb3I7CisgIGJvcmRlci1yYWRpdXM6IDNweDsKKyAgdHJhbnNpdGlvbjogYWxsIC4xcyBlYXNlLWluLW91dDsKKworICBpbWcgeworICAgIGhlaWdodDogNTBweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgICAgcGFkZGluZzogNHB4OworICAgIGJvcmRlci1yYWRpdXMgOiAzcHg7CisgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CisgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CisgIH0KKyAgI2xvZ291dCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICAgIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICAgIGJvcmRlci1yYWRpdXM6IDJweDsKKyAgICA6aG92ZXIgeworICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIH0KKyAgfQorfQorCisjdXNlci1kZXRhaWxzOmFmdGVyeworICBjb250ZW50OiAnJzsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IC0xMHB4OworICByaWdodDogNXB4OworICB3aWR0aDogMDsKKyAgaGVpZ2h0OiAwOworICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CisgIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgQGRhcmstY29sb3ItdGhlbWU7CisgIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50OworfQorCithLnVzZXItcHJlZi1idG4geworICBtYXJnaW4tdG9wOiAxNXB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgbWFyZ2luLWxlZnQ6IDEwcHg7CisgIG1hcmdpbi1yaWdodDogMTBweDsKKyAgcGFkZGluZy10b3A6IDJweDsKKyAgcGFkZGluZy1ib3R0b206IDJweDsKKyAgZGlzcGxheTogZmxleDsKKyAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyayAhaW1wb3J0YW50OworICA6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgfQorfQorCisjdXNlci1uYW1lIHsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKKyAgcGFkZGluZy1sZWZ0IDogNXB4OworICBwYWRkaW5nLXJpZ2h0IDogNXB4OworICBzcGFuIHsKKyAgICBtaW4td2lkdGg6IDEwMHB4OworICAgIHBhZGRpbmctYm90dG9tIDogNXB4OworICAgIHBhZGRpbmctdG9wIDogNXB4OworICB9Cit9CisKKyN1c2VyLXJvdzEgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogcm93OworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgI3VzZXItbGFuZyB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBmbGV4LWRpcmVjdGlvbjogcm93OworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKKyAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgICAgcGFkZGluZy1yaWdodDogMTBweDsKKyAgICBzcGFuIHsKKyAgICAgIG1pbi13aWR0aDogMzBweDsKKyAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICB9CisgIH0KK30KKworLmFwcGJhci1idG4taW1nIHsKKyAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQgLSA0MHB4OworfQorCisjaGVscC1idG4geworICBmb250LXNpemU6IDEwcHg7CisgIG1pbi13aWR0aDogMjBweDsKKyAgbWFyZ2luLXJpZ2h0OiAxNXB4OworfQorLyogQmVnaW4gc3ViIE1lbnUgc2VjdGlvbiAqLworCisjYXBwLW5hdmlnYXRpb24geworICBoZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQ7CisgIGJvcmRlci1yaWdodDogc29saWQgMXB4IEBibGFjazsKKyAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBibGFjazsKKyAgd2lkdGg6IDEwMCU7CisgIG1pbi13aWR0aDogQG1pbi1jb250YWluZXItd2lkdGg7CisgIGgyIHsKKyAgICBkaXNwbGF5OiBub25lOworICB9CisgIHVsIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7CisgICAgZmxleC1ncm93OiAxOworICB9CisgIHVsIGxpIHVsIGxpIHsKKyAgICBib3JkZXItbGVmdDogc29saWQgMXB4IEBibGFjazsKKyAgICBoZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQ7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIGp1c3RpZnktaXRlbXM6IGNlbnRlcjsKKyAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICBtaW4td2lkdGg6IDc1cHg7CisgICAgcGFkZGluZy1sZWZ0OiA2cHg7CisgICAgcGFkZGluZy1yaWdodDogNnB4OworICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOworICAgIGZvbnQtc2l6ZTogMTJweDsKKyAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxNTAwcHgpIHsKKyAgICAgIGZvbnQtc2l6ZTogMTBweDsKKyAgICAgIG1pbi13aWR0aDogNjVweDsKKyAgICB9CisgICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTMwMHB4KSB7CisgICAgICBmb250LXNpemU6IDEwcHg7CisgICAgICBtaW4td2lkdGg6IDUwcHg7CisgICAgfQorICAgIGEgeworICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgIHdpZHRoOiAxMDAlOworICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIH0KKyAgfQorfQorCisjYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGk6bGFzdC1jaGlsZCB7CisgIGJvcmRlci1yaWdodDogc29saWQgMXB4IEBibGFjazsKK30KKworI2FwcC1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIG1pbi1oZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQ7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgLy90b3A6IC0xcHg7CisgIGEgeworICAgIGNvbG9yOiBAd2hpdGU7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICB9Cit9CisjYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGkuc2VsZWN0ZWQ6aG92ZXIgeworICBhIHsKKyAgICBjb2xvcjogQGJsYWNrICFpbXBvcnRhbnQ7CisgIH0KK30KKworI2FwcC1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpLnNlbGVjdGVkIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHRvcDogMXB4OworICBoZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQgKyAxcHg7CisgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAycHg7CisgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDJweDsKKyAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKworICA6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICcnOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC0ycHg7CisgICAgbGVmdDogNXB4OworICAgIHdpZHRoOiAwOworICAgIGhlaWdodDogMDsKKyAgICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CisgICAgYm9yZGVyLXRvcDogMTBweCBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsKKyAgICBib3JkZXItbGVmdDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgfQorCit9CisKKworLyogRW5kIHN1YiBNZW51IHNlY3Rpb24gKi8KKworLyogYmVnaW4gc3ViIE1lbnUgc2VjdGlvbiAzcmQgbGV2ZWwgKi8KKworLmJ1dHRvbi1iYXIudGFiLWJhciB7CisgIHVsIGxpIHVsIGxpIHsKKyAgICBib3JkZXI6IHNvbGlkIDFweCBAZ3JleTsKKyAgICBib3JkZXItcmFkaXVzOiA0cHg7CisgICAgYSB7CisgICAgICB3aWR0aDogMTAwJTsKKyAgICAgIGhlaWdodDogMTAwJTsKKyAgICB9CisgIH0KKyAgbGkuc2VsZWN0ZWR7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgYXsKKyAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICB9CisgIH0KKyAgdWwgbGkgdWwgbGk6aG92ZXIgeworICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIGEgeworICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluIDsKKyAgICB9CisgIH0KK30KKworI3RoaXJkLWxldmVsLW1lbnUtY29udGFpbmVyIHsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IHJvdzsKK30KKyN3b3JraW5nLWFyZWEgeworICB3aWR0aDogMTAwJTsKK30KKworI2xlZnQtY29sdW1uLW1lbnUgeworICB3aWR0aDogMTAwcHg7Cit9CisKKy50aGlyZC1sdmwtbWVudSB7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGxlZnQ6IC0xMHB4OworICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OworICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OworICBwYWRkaW5nLXRvcDogNHB4OworICBwYWRkaW5nLWJvdHRvbTogNHB4OworICB1bCB7CisgICAgbGkgeworICAgICAgdWwgeworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIHRvcDogNXB4OworICAgICAgICB3aWR0aDogQHRoaXJkLWx2bC13aWR0aDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaDIgeworICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKKyAgfQorfQorLnRoaXJkLWxldmVsLWl0ZW06bGFzdC1jaGlsZCB7CisgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCBAbWFpbi1jb2xvci10aGVtZTsKK30KKworLnRoaXJkLWxldmVsLWl0ZW0geworICBtaW4taGVpZ2h0OiBAdGhpcmQtbHZsLWhlaWdodDsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIHBhZGRpbmctcmlnaHQ6IDNweDsKKyAgYm9yZGVyLXRvcDogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lOworCisgIGEsIGE6dmlzaXRlZCB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIHdpZHRoOiAxMDAlOworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyayAhaW1wb3J0YW50OworICAgIG1pbi1oZWlnaHQ6IEB0aGlyZC1sdmwtaGVpZ2h0OworICAgIG1heC13aWR0aDogQHRoaXJkLWx2bC13aWR0aDsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIH0KK30KKy50aGlyZC1sZXZlbC1pdGVtLnNlbGVjdGVkIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBib3JkZXItbGVmdDogc29saWQgOXB4IEBtYWluLWNvbG9yLXRoZW1lOworICBhLCBhOnZpc2l0ZWQgeworICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgICBjb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgfQorICA6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICcnOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDVweDsKKyAgICBsZWZ0OiAwOworICAgIHdpZHRoOiAwOworICAgIGhlaWdodDogMDsKKyAgICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50OworICAgIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOworICAgIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CisgIH0KK30KKworLnRoaXJkLWxldmVsLWl0ZW0gYTpob3ZlciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW4gOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisvKiBFbmQgM3JkIGxldmVsIG1lbnUgKi8KKworCisKKy8qIEJlZ2luIEhvbWUgTWVudSBmb3IgSUIgc2VjdGlvbiAqLworLmZpeGVkLW5hdi1iYXIgeworICBwb3NpdGlvbjogZml4ZWQgIWltcG9ydGFudDsKKyAgd2lkdGg6IDEwMCU7Cit9CisjbmF2LWJhci1vZmZzZXQgeworICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodCA7Cit9CisKKyNob21lR2x5cGggeworICBtYXJnaW4tbGVmdDogMjBweDsKKyAgaGVpZ2h0OiAyMHB4OworfQorCisjaG9tZVBhZ2VUaXRsZSB7CisgIGNvbG9yOiBAd2hpdGU7CisgIGZvbnQtc2l6ZTogMjBweDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG1hcmdpbi1yaWdodDogMjBweDsKKyAgbWFyZ2luLWxlZnQ6IDIwcHg7Cit9CisuaG9tZS1tZW51LWxpc3QgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICBhbGlnbi1pdGVtczogY2VudGVyOworfQorLmhwLWFwcGxpc3QgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogcm93OworICBjb2xvciA6IEB3aGl0ZTsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgLmFwcC10aXRsZSB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICAgIGhlaWdodDogQGhvbWUtbWVudS10aWxlLWhlaWdodDsKKyAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTBweDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOworICAgIHNwYW4geworICAgICAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7CisgICAgICBmb250LXNpemU6IDE1cHg7CisgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgIHdpZHRoOiAxMTBweDsKKyAgICAgIGEgeworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICAgICAgY29sb3IgOiBAd2hpdGU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLmhwLW1lbnUtaXRlbSB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBtYXJnaW4tbGVmdDogNXB4OworICAgIG1hcmdpbi1yaWdodDogNXB4OworICAgIGJvcmRlcjogc29saWQgMnB4IEBncmV5OworICAgIGJvcmRlci1yYWRpdXM6IDhweDsKKyAgICBoZWlnaHQ6IEBob21lLW1lbnUtdGlsZS1oZWlnaHQgLSA0cHg7CisgICAgbWluLXdpZHRoOiBAaG9tZS1tZW51LXRpbGUtbWluLXdpZHRoOworICAgIG1heC13aWR0aDogQGhvbWUtbWVudS10aWxlLW1heC13aWR0aDsKKyAgICAubWVudS1saW5rIHsKKyAgICAgIGZvbnQtc2l6ZTogMTBweDsKKyAgICAgIGNvbG9yOiBAYmxhY2s7CisgICAgICBwYWRkaW5nOiAxMHB4OworICAgIH0KKyAgICAuc3Rhci1saW5rIHsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIGhlaWdodDogMjVweDsKKyAgICAgIHRvcDogNXB4OworICAgICAgcmlnaHQ6IDVweDsKKyAgICB9CisgIH0KKworfQorLmhwLWFwcGxpc3QgLmFwcC10aXRsZSBzcGFuIGE6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy5ocC1tZW51LWl0ZW0uZmF2b3JpdGVJdGVtIHsKKyAgYm9yZGVyOiBzb2xpZCAycHggQGRhcmstY29sb3ItdGhlbWU7Cit9CisKKy5ocC1tZW51LWl0ZW06aG92ZXIgeworICBib3gtc2hhZG93OiAzcHggM3B4IDEycHggQHNoYWRvdy1jb2xvcjsKKyAgYSB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICB9Cit9CisKKy8qIEVuZCBIb21lIE1lbnUgZm9yIElCIHNlY3Rpb24gKi8KKworLyogQmVnaW4gTG9naW4gc2NyZWVubGV0ICovCisjbG9naW4tY29udGFpbmVyIHsKKyAgI2NvbnRlbnQtbWVzc2FnZXMgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB0b3A6IEBhcHAtYmFyLWhlaWdodDsKKyAgICBib3JkZXItcmFkaXVzOiA0cHg7CisgICAgd2lkdGg6IDk3JTsKKyAgICAmLmVycm9yTWVzc2FnZSB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDogQGNvbG9yLWJhY2tncm91bmQtYWxlcnQgIWltcG9ydGFudDsKKyAgICAgIGNvbG9yOiBAY29sb3ItZm9udC1hbGVydCAhaW1wb3J0YW50OworICAgICAgYm9yZGVyIDogc29saWQgMXB4IEBjb2xvci1ib3JkZXItYWxlcnQgIWltcG9ydGFudDsKKyAgICB9CisgICAgJi5ldmVudE1lc3NhZ2UgeworICAgICAgYmFja2dyb3VuZC1jb2xvciA6IEBjb2xvci1iYWNrZ3JvdW5kLXN1Y2Nlc3MgIWltcG9ydGFudDsKKyAgICAgIGNvbG9yOiBAY29sb3ItZm9udC1zdWNjZXNzICFpbXBvcnRhbnQ7CisgICAgICBib3JkZXIgOiBzb2xpZCAxcHggQGNvbG9yLWJvcmRlci1zdWNjZXNzICFpbXBvcnRhbnQ7CisgICAgfQorICB9Cit9CisjbG9naW5CYXIgeworICBwb3NpdGlvbjogZml4ZWQ7CisgIHRvcDowOworICBsZWZ0OiAwOworICB3aWR0aDogMTAwJTsKKyAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQ7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICBzcGFuIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA1cHg7CisgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNXB4OworICAgIGZvbnQtc2l6ZTogMjVweDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgdG9wOiBAYXBwLWJhci1oZWlnaHQgLSAzMnB4OworICAgIGxlZnQ6IDE1cHg7CisgICAgcGFkZGluZzogNXB4IDEwcHggNXB4IDEwcHg7CisgIH0KKyAgI2NvbXBhbnktbG9nbyB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICB9Cit9CisKKy5sb2dpbi1zY3JlZW5sZXQgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICBtaW4td2lkdGg6IDMwMHB4OworICBtYXgtd2lkdGg6IDUwZW07CisgIGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50OworICBtYXJnaW4tdG9wOiAxNSU7CisgIGJveC1zaGFkb3c6IDNweCAzcHggMTJweCBAc2hhZG93LWNvbG9yOworICAuc2NyZWVubGV0LXRpdGxlLWJhciB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CisgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgbWFyZ2luOjA7CisgICAgcGFkZGluZzowOworICAgIGgzeworICAgICAgcGFkZGluZy10b3A6MnB4OworICAgICAgcGFkZGluZy1ib3R0b206MnB4OworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgIHdpZHRoOjEwMCU7CisgICAgICB0ZXh0LXNoYWRvdzogbm9uZTsKKyAgICAgIGZvbnQtc2l6ZTogMjVweDsKKyAgICB9CisgIH0KKyAgLnNjcmVlbmxldC1ib2R5IHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICAgIGZvcm0geworICAgICAgLmJ1dHRvbiB7CisgICAgICAgIHdpZHRoOiAxNTBweDsKKyAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OworICAgICAgICBiYWNrZ3JvdW5kOiBub25lOworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgICAgICB0ZXh0LXNoYWRvdzogbm9uZTsKKyAgICAgICAgbWFyZ2luLXRvcDogMjBweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKKyAgICAgIH0KKworICAgICAgdGFibGUgeworICAgICAgICB0ciB7CisgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgLmxhYmVsIHsKKyAgICAgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICAgICAgICAgIHdpZHRoOiAyNSU7CisgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7CisgICAgICAgICAgfQorICAgICAgICAgIGlucHV0IHsKKyAgICAgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICAgIH0KKyAgICAgICAgICAuYnV0dG9udGV4dCwKKyAgICAgICAgICBbdHlwZT0ic3VibWl0Il0geworICAgICAgICAgICAgd2lkdGg6IDE1MHB4OworICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OworICAgICAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICAgICAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgICAgICAgICAgdGV4dC1zaGFkb3c6IG5vbmU7CisgICAgICAgICAgfQorICAgICAgICAgIFtuYW1lPSJHRVRfUEFTU1dPUkRfSElOVCJdIHsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgICAgICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgICAgICAgYm9yZGVyOiBub25lOworICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgfQorICAgICAgICAgIFtuYW1lPSJFTUFJTF9QQVNTV09SRCJdIHsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgICAgICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgICAgICAgYm9yZGVyOiBub25lOworICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgfQorICAgICAgICAgIHRkIHsKKyAgICAgICAgICAgIHBhZGRpbmc6IDVweDsKKyAgICAgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDsKKyAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBhIHsKKyAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICB9CisgIH0KK30KKworLmxvZ2luLXNjcmVlbmxldCAuc2NyZWVubGV0LXRpdGxlLWJhciB7CisgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLyogRW5kIExvZ2luIHNjcmVlbmxldCAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBCZWdpbiBTY3JlZW5sZXQgc3R5bGUgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lIDsKKyAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsKKyAgaGVpZ2h0OiAxJTsgLyogSUUgZml4ICovCisgIG1pbi1oZWlnaHQ6IDEuNWVtOworICBwYWRkaW5nOjAuOGVtIDAuMmVtOworfQorCisuc2NyZWVubGV0IHsKKyAgYm9yZGVyLXJhZGl1czogNXB4OworICBib3JkZXI6IHNvbGlkIDFweCBAZ3JleTsKKyAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CisgIG1hcmdpbi1ib3R0b206IDFlbTsKKyAgb3ZlcmZsb3c6IGF1dG87Cit9CisKKy5zY3JlZW5sZXQtYm9keSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7CisgIGhlaWdodDogYXV0byAhaW1wb3J0YW50OworICBoZWlnaHQ6IDElOworICBwYWRkaW5nOiAwLjRlbTsKK30KKworLnNjcmVlbmxldC1ib2R5IGRpdiB7CisgIG1hcmdpbjogMC44ZW0gMC4xZW0KK30KKworLyogU3BlY2lhbCBTY3JlZW5sZXQgc3R5bGUgZm9yIGxvY2FsZSBhbmQgdGltZXpvbmUgd2luZG93ICovCisubGlzdHMuc2NyZWVubGV0IHsKKyAgbWFyZ2luLWxlZnQ6IDI1JTsKKyAgbWFyZ2luLXJpZ2h0OiAyNSU7CisgIG1hcmdpbi10b3A6IDFlbTsKK30KKworLmxpc3RzLnNjcmVlbmxldCAuYmFzaWMtdGFibGUgdHIgdGQgeworICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKy5saXN0cy5zY3JlZW5sZXQgLmJhc2ljLXRhYmxlIHRyIHRkIGEgeworICBkaXNwbGF5OiBibG9jazsKK30KKworLyogICAgICBBbHRlcm5hdGUgdGFibGUgaGVhZGVyIHN0eWxlICAgICAgKi8KKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoLAorLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleWRhcms7CisgIGJvcmRlci1ib3R0b206IDA7CisgIGJvcmRlci1sZWZ0OiAwLjFlbSBzb2xpZCAjYWFhOworICBib3JkZXItcmlnaHQ6IDAuMWVtIHNvbGlkICM4ODg7CisgIGNvbG9yOiAjZmZmZmZmOworICBmb250LXdlaWdodDogYm9sZDsKK30KKworLyogTm8gcGFkZGluZyBzY3JlZW5sZXQgZGVjb3JhdG9yICovCisubm8tcGFkZGluZyB7CisgIHBhZGRpbmc6IDA7CisgIGJvcmRlcjogbm9uZTsKK30KKworLm5vLXBhZGRpbmcgLmgxLAorLm5vLXBhZGRpbmcgLmgyLAorLm5vLXBhZGRpbmcgLmgzLAorLm5vLXBhZGRpbmdyIGgxLAorLm5vLXBhZGRpbmcgaDIsCisubm8tcGFkZGluZyBoMyB7CisgIHBhZGRpbmc6IDAuN2VtOworfQorCisuc2NyZWVubGV0LXRpdGxlLWJhciB1bCBhOmhvdmVyIHsKKyAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgRW5kIFNjcmVlbmxldCBzdHlsZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgVGFibGUgU3R5bGVzICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLmJhc2ljLXRhYmxlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgY29sb3I6ICMwMDAwMDA7CisgIG1hcmdpbi1ib3R0b206IDFlbTsKKyAgd2lkdGg6IDEwMCU7Cit9CisKK2Zvcm0gdGFibGUsCitmb3JtIC5iYXNpYy10YWJsZSwKKy5zY3JlZW5sZXQtYm9keSAuYmFzaWMtdGFibGUgeworICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKKyAgbWFyZ2luLWJvdHRvbTogMDsKK30KKworLmJhc2ljLXRhYmxlIHRyIHRkIHsKKyAgLyogU3R5bGUgZm9yIGFsbCBjZWxscyAqLworICBwYWRkaW5nOiAwLjhlbSAwLjFlbTsKKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKworLmJhc2ljLXRhYmxlIHRyIC5hbGlnbi1ib3R0b20geworICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworfQorCisuYmFzaWMtdGFibGUgdHIgLmFsaWduLXRvcCB7CisgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKKy5iYXNpYy10YWJsZSB0ciAubGFiZWwsCisuYmFzaWMtdGFibGUgdHIgLmdyb3VwLWxhYmVsIHsKKyAgLyogZmllbGQgbGFiZWxzIGZvciBmb3JtcyAqLworICBmb250LXdlaWdodDogYm9sZDsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7CisgIHBhZGRpbmctcmlnaHQ6IDEuNWVtOworICB3aGl0ZS1zcGFjZTogbm93cmFwOworICB3aWR0aDogMSU7Cit9CisKKy5iYXNpYy10YWJsZSB0ciAuZ3JvdXAtbGFiZWwgeworICAvKiAiaGVhZGVyIiBmb3IgZmllbGQgbGFiZWwgZ3JvdXBzICovCisgIGZvbnQtc2l6ZTogMS4yZW07CisgIHBhZGRpbmc6IDJlbSAxLjVlbSAwIDA7Cit9CisKKy5iYXNpYy10YWJsZSB0ciB0aCwKKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdyB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgdGQgeworICBib3JkZXItYm90dG9tOiAwLjFlbSBzb2xpZCAjMDAwMDAwOworfQorCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgdGQgYSB7CisgIGNvbG9yOiAjMDAwMDAwOworfQorCisuYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3cgeworICAvKiBBbHRlcm5hdGluZyByb3cgc3R5bGUgKi8KKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsKK30KKworLmJhc2ljLXRhYmxlIC5zZWxlY3RlZCB7CisgIGJhY2tncm91bmQ6ICNGRkZDQ0Y7Cit9CisKKy5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvd1NlbGVjdGVkIHsKKyAgYmFja2dyb3VuZDogI0ZGRjU1RjsKK30KKworLmJhc2ljLXRhYmxlIC5WYWxpZGF0ZSB7CisgIC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovCisgIGJhY2tncm91bmQ6ICNBMEQ1Rjc7Cit9CisKKy5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvd1ZhbGlkYXRlIHsKKyAgLypTdHlsZSB1c2UgYnkgYWx0LXJvdy1zdHlsZSBvbiBsaXN0Ki8KKyAgYmFja2dyb3VuZDogIzcyQThGMjsKK30KKworLmJhc2ljLXRhYmxlIC5XYXJuIHsKKyAgLypTdHlsZSB1c2UgYnkgYWx0LXJvdy1zdHlsZSBvbiBsaXN0Ki8KKyAgYmFja2dyb3VuZDogI2Y1NUM1QzsKK30KKworLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93V2FybiB7CisgIC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovCisgIGJhY2tncm91bmQ6ICNGQzc0NTU7Cit9CisKKy5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCB7CisgIC8qIGJ1dHRvbiBjb2x1bW4gc3R5bGUgLSBmb3IgdGhlIHNtYWxsCisgIGNvbGxlY3Rpb24gb2YgYnV0dG9ucyB1c2VkIGluIGxpc3RzICovCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgIHBhZGRpbmc6IDAuM2VtOworfQorLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGEsCisuYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgYnV0dG9uLAorLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGlucHV0W3R5cGU9InJlc2V0Il0sCisuYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgaW5wdXRbdHlwZT0ic3VibWl0Il0sCisuYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgaW5wdXRbdHlwZT0iYnV0dG9uIl0geworICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CisgIC1tb3otYm9yZGVyLXJhZGl1czogMWVtOworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDFlbTsKKyAgYm9yZGVyLXJhZGl1czogMnB4OworICBib3JkZXI6IDAuMWVtIHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOworICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICBkaXNwbGF5OmlubGluZS1ibG9jazsKKyAgZm9udC1zaXplOiAwLjllbTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG91dGxpbmU6IDA7CisgIG92ZXJmbG93OiB2aXNpYmxlOworICBwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjJlbSAwLjVlbTsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICB3aWR0aDogYXV0bzsKKworICAmOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICBjb2xvcjogQHdoaXRlOworICB9Cit9CisKKy5iYXNpYy10YWJsZSAuY29sbGFwc2VkIHsKKyAgdmlzaWJpbGl0eTogY29sbGFwc2U7Cit9CisKKy8qICAgICAgU29ydCBmaWVsZCBzdHlsZSAgICAgICovCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCAuc29ydC1vcmRlci1hc2MsCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCAuc29ydC1vcmRlci1hc2N7CisgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LWdyLXVwLnBuZykgbm8tcmVwZWF0IHJpZ2h0OworICBwYWRkaW5nLWxlZnQ6IDAuNWVtOworICBwYWRkaW5nLXJpZ2h0OiAyMHB4OyAvKiBTZXR0aW5nIG11c3QgYmUgaW4gcHggKi8KK30KKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoIC5zb3J0LW9yZGVyLWRlc2MsCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCAuc29ydC1vcmRlci1kZXNjeworICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci1kdy5wbmcpIG5vLXJlcGVhdCByaWdodDsKKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsKKyAgcGFkZGluZy1yaWdodDogMjBweDsgLyogU2V0dGluZyBtdXN0IGJlIGluIHB4ICovCit9CisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCAuc29ydC1vcmRlciwKKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIC5zb3J0LW9yZGVyeworICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci5wbmcpIG5vLXJlcGVhdCByaWdodDsKKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsKKyAgcGFkZGluZy1yaWdodDogMjBweDsgLyogU2V0dGluZyBtdXN0IGJlIGluIHB4ICovCisgIGNvbG9yOiNmZmYKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgQmVnaW4gTWVzc2FnZSBJbmZvICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisuY291bnQtbWVzc2FnZSB7CisgIGRpc3BsYXk6IGZsZXg7CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICBtaW4taGVpZ2h0OjIwcHg7CisgIG1pbi13aWR0aDogMjBweDsKKyAgbWF4LWhlaWdodDoyMHB4OworICBtYXgtd2lkdGg6IDIwcHg7CisgIGJhY2tncm91bmQ6IEB3aGl0ZTsKKyAgZm9udC1zaXplOjEycHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBib3JkZXItcmFkaXVzOiA1MCU7Cit9CisuaW5mby1tZXNzYWdlLXRpdGxlIHsKKyAgbWluLXdpZHRoOjE1MHB4OworICBtYXJnaW46IDVweDsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDE2cHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorLm1lc3NhZ2UtbGlzdCB7CisgIHBvc2l0aW9uOnJlbGF0aXZlOworICBtYXJnaW4tdG9wOiAxMHB4OworICBib3gtc2hhZG93OiAxcHggM3B4IDVweCBAZ3JleWRhcms7CisgIGJvcmRlci1yYWRpdXM6IDAgNXB4IDVweCAwOworICB0cmFuc2l0aW9uOiBoZWlnaHQgMnM7Cit9CisubWVzc2FnZS1saXN0LW1haW4geworICBwYWRkaW5nOiA1cHggMTVweCA1cHggMTVweDsKK30KKy5tZXNzYWdlLWxpc3QtYWxlcnQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3ItYWxlcnQ7CisgIGJvcmRlci1sZWZ0IDogc29saWQgNXB4IEBjb2xvci1hbGVydC1kYXJrOworICAuY291bnQtbWVzc2FnZSB7CisgICAgY29sb3I6IEBjb2xvci1hbGVydC1kYXJrOworICB9Cit9CisubWVzc2FnZS1saXN0LXN1Y2Nlc3MgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3Itc3VjY2VzczsKKyAgYm9yZGVyLWxlZnQ6IHNvbGlkIDVweCBAY29sb3Itc3VjY2Vzcy1kYXJrOworICAuY291bnQtbWVzc2FnZSB7CisgICAgY29sb3I6IEBjb2xvci1zdWNjZXNzLWRhcms7CisgIH0KK30KKy5tZXNzYWdlLWxpc3QtdGFibGUtY29udGFpbmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICBib3JkZXItcmFkaXVzOiA1cHg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGhlaWdodDogMDsKK30KKy5pbmZvLW1lc3NhZ2Utc3VjY2VzcyB7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisuaW5mby1tZXNzYWdlLWFsZXJ0IHsKKyAgZGlzcGxheTogbm9uZTsKK30KK3RhYmxlLm1zZy1saXN0IHsKKyAgd2lkdGg6IDEwMCU7CisgIGZvbnQtc2l6ZTogMTZweDsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBwYWRkaW5nOiAwOworICB0aGVhZCB7CisgICAgaGVpZ2h0OiAxMDAlOworICAgIGJhY2tncm91bmQtY29sb3I6IEBncmV5OworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIHRyeworICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOworICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7CisgICAgICBsaW5lLWhlaWdodDogMzBweDsKKyAgICB9CisgIH0KKyAgdGJvZHkgeworICAgIHRyIHsKKyAgICAgIGxpbmUtaGVpZ2h0OiAyNXB4OworICAgIH0KKyAgICB0ci5tc2ctcm93LXN1Y2Nlc3MgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLXN1Y2Nlc3M7CisgICAgfQorICAgIHRyLm1zZy1yb3ctYWxlcnQgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLWFsZXJ0OworICAgIH0KKyAgfQorICB0ZCB7CisgICAgcGFkZGluZy1sZWZ0OiA1cHg7CisgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIEVuZCAgTWVzc2FnZSBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgUGFnaW5hdGUgU3R5bGUgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy5wYWdpbmF0ZS1iYXItbnJkIHsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgZm9udC1zaXplOiAxNXB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsKKyAgcGFkZGluZy1sZWZ0OiAxMHB4OworICBwYWRkaW5nLXRvcDogM3B4OworICBwYWRkaW5nLWJvdHRvbTogM3B4OworICBib3gtc2hhZG93OiAwIDJweCA1cHggQHNoYWRvdy1jb2xvcjsKKworICB1bC5wYWdpbmF0ZS1wZy1saXN0IHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CisgICAgYm9yZGVyLXJhZGl1czogOHB4OworICAgIGJvcmRlcjogc29saWQgMXB4IEBib3gtYm9yZGVyLWNvbG9yOworICAgIGhlaWdodDogMThweDsKKyAgICBsaSB7CisgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgICBtaW4td2lkdGg6IDE3cHg7CisgICAgICBib3JkZXItcmlnaHQ6IHNvbGlkIDFweCBAYm94LWJvcmRlci1jb2xvcjsKKyAgICAgIHBhZGRpbmctbGVmdDogMnB4OworICAgICAgcGFkZGluZy1yaWdodDogMnB4OworICAgICAgaGVpZ2h0OjEwMCU7CisgICAgICBhIHsKKyAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsKKyAgICAgICAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICAgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgfQorICAgICAgLnBhZ2luYXRlLWRpc2FibGUgeworCisgICAgICB9CisgICAgfQorICAgIGxpLnNlbGVjdGVkIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgYSB7CisgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGk6Zmlyc3QtY2hpbGQsIGxpOmxhc3QtY2hpbGQgeworICAgICAgd2lkdGg6IDIwcHg7CisgICAgfQorICAgIGxpOmZpcnN0LWNoaWxkIHsKKyAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDNweDsKKyAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDsKKyAgICB9CisgICAgbGk6bGFzdC1jaGlsZCB7CisgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4OworICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDsKKyAgICB9CisgIH0KKworfQorc2VsZWN0LnBhZ2luYXRlLXNlbGVjdCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgYmFja2dyb3VuZDogQHdoaXRlOworICBmb250LXNpemU6IDE2cHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBib3JkZXI6IDFweCBzb2xpZCBAYm94LWJvcmRlci1jb2xvcjsKKyAgb3B0aW9uIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGp1c3RpZnktc2VsZjogY2VudGVyOworICAgIGZvbnQtc2l6ZTogMTRweDsKKyAgfQorfQorCisucGFnaW5hdGUtc2VsZWN0LWxhYmVsIHsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDE2cHg7CisgIHBhZGRpbmctbGVmdDogMTVweDsKKyAgcGFkZGluZy1yaWdodDogMTVweDsKK30KKworLnBhZ2luYXRlLWluZm9ybWF0aW9uIHsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDE2cHg7CisgIHBhZGRpbmctbGVmdDogMTVweDsKKyAgcGFkZGluZy1yaWdodDogMTVweDsKK30KKwordWwucGFnaW5hdGUtcGctbGlzdCBsaTpob3ZlcnsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGEgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47CisgIH0KK30KKworLyogRW5kIG9mIFBhZ2luYXRlIFN0eWxlICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIExpc3QgTmF2aWdhdGlvbiBTdHlsZSAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy5uYXYtcGFnZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleWRhcms7CisgIGNvbG9yOiBAd2hpdGU7CisgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsKKyAgZm9udC1zaXplOiA5cHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBsaW5lLWhlaWdodDogMy41ZW07CisgIGhlaWdodDogMy41ZW07CisgIG1hcmdpbjogMC41ZW0gMCAwLjVlbSAwOworICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsKK30KKworLm5hdi1wYWdlciB1bCB7CisgIGRpc3BsYXk6IGlubGluZTsgLyogSUUgRml4ICovCit9CisKKy5uYXYtcGFnZXIgdWwgbGkgeworICBmbG9hdDpsZWZ0OworICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCisubmF2LXBhZ2VyIHVsIGxpIGEgeworICBkaXNwbGF5OiBibG9jazsKK30KKworLm5hdi1wYWdlciB1bCBhIHsKKyAgY29sb3I6IEB3aGl0ZTsKKyAgcGFkZGluZzogMCAxZW0gMCAxZW07CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLm5hdi1wYWdlciB1bCBhOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKK30KKworLm5hdi1wYWdlciB1bCAubmF2LXBhZ2VzaXplLAorLm5hdi1wYWdlciB1bCAubmF2LXBhZ2Utc2VsZWN0LAorLm5hdi1wYWdlciB1bCAubmF2LWRpc3BsYXlpbmcgeworICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsKK30KKworLm5hdi1wYWdlciB1bCAubmF2LWZpcnN0LWRpc2FibGVkLAorLm5hdi1wYWdlciB1bCAubmF2LXByZXZpb3VzLWRpc2FibGVkLAorLm5hdi1wYWdlciB1bCAubmF2LW5leHQtZGlzYWJsZWQsCisubmF2LXBhZ2VyIHVsIC5uYXYtbGFzdC1kaXNhYmxlZCB7CisgIHBhZGRpbmc6IDAgMWVtIDAgMWVtOworfQorCisubmF2LXBhZ2VyIHVsIC5uYXYtZmlyc3QtZGlzYWJsZWQ6aG92ZXIsCisubmF2LXBhZ2VyIHVsIC5uYXYtcHJldmlvdXMtZGlzYWJsZWQ6aG92ZXIsCisubmF2LXBhZ2VyIHVsIC5uYXYtbmV4dC1kaXNhYmxlZDpob3ZlciwKKy5uYXYtcGFnZXIgdWwgLm5hdi1sYXN0LWRpc2FibGVkOmhvdmVyIHsKKyAgY3Vyc29yOiBub3QtYWxsb3dlZDsKK30KKworCisubmF2LXBhZ2VyIHVsIC5uYXYtZGlzcGxheWluZyB7CisgIGJvcmRlci1yaWdodDogbm9uZTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgTXVsdGktQ29sdW1uIFN0eWxlcyAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNjb2x1bW4tY29udGFpbmVyIHsKKyAgbWFyZ2luOiBhdXRvOworICBwYWRkaW5nOiAxZW07CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgbWluLXdpZHRoOiBAbWluLWNvbnRhaW5lci13aWR0aDsKK30KKworI2NvbHVtbi1jb250YWluZXIgaDEsCisjY29sdW1uLWNvbnRhaW5lciAuaDEsCisjY29sdW1uLWNvbnRhaW5lciBoMiwKKyNjb2x1bW4tY29udGFpbmVyIC5oMiB7CisgIG1hcmdpbi1ib3R0b206IDAuNWVtOworfQorCisjY29sdW1uLWNvbnRhaW5lciBoMSwKKyNjb2x1bW4tY29udGFpbmVyIC5oMSB7CisgIGNvbG9yOiAjNTU3OTk2OworfQorCisjY29sdW1uLWNvbnRhaW5lciAubGVmdCB7CisgIGZsb2F0OiBsZWZ0OworICAvKiBhbHQ6IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwcHg7IGxlZnQ6IDBweDsgKi8KKyAgd2lkdGg6IDIyZW07CisgIG1hcmdpbi1yaWdodDogMWVtOworfQorCisjY29sdW1uLWNvbnRhaW5lciAubGVmdC1sYXJnZXIgeworICBmbG9hdDogbGVmdDsKKyAgLyogYWx0OiBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7ICovCisgIHdpZHRoOiAyNWVtOworICBtYXJnaW4tcmlnaHQ6IDFlbTsKK30KKworLmxlZnRoYWxmIHsKKyAgZmxvYXQ6IGxlZnQ7CisgIGhlaWdodDogMSU7CisgIGxlZnQ6IDA7CisgIG1hcmdpbjogMCUgMSUgMSUgMCU7CisgIHdpZHRoOiA0OSU7Cit9CisKKy5yaWdodGhhbGYgeworICBmbG9hdDogcmlnaHQ7CisgIGhlaWdodDogMSU7CisgIG1hcmdpbjogMCAwIDElIDElOworICByaWdodDogMDsKKyAgd2lkdGg6IDQ5JTsKK30KKworI2NvbHVtbi1jb250YWluZXIgLnJpZ2h0IHsKKyAgZmxvYXQ6IHJpZ2h0OworICBtYXJnaW4tbGVmdDogMWVtOworICB3aWR0aDogMjJlbTsKK30KKworI2NvbHVtbi1jb250YWluZXIgLmxlZnRvbmx5IHsKKyAgbWFyZ2luLWxlZnQ6IDIzZW07CisgIHdpZHRoOiBhdXRvOworfQorCisjY29sdW1uLWNvbnRhaW5lciAubGVmdG9ubHktbGFyZ2VyIHsKKyAgbWFyZ2luLWxlZnQ6IDI2ZW07CisgIHdpZHRoOiBhdXRvOworfQorCisjY29sdW1uLWNvbnRhaW5lciAucmlnaHRvbmx5IHsKKyAgbWFyZ2luLXJpZ2h0OiAyM2VtOworICB3aWR0aDogYXV0bzsKK30KKworI2NvbHVtbi1jb250YWluZXIgLmNlbnRlciB7CisgIG1hcmdpbi1sZWZ0OiAyM2VtOworICBtYXJnaW4tcmlnaHQ6IDIzZW07CisgIHdpZHRoOiBhdXRvOworfQorCisjY29sdW1uLWNvbnRhaW5lciAubm9jb2x1bW5zIHsKKyAgd2lkdGg6IGF1dG87Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgQnV0dG9uIFN0eWxlICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLmJ1dHRvbi1iYXIgbGkuYnV0dG9udGV4dCBhLAorYS5idXR0b250ZXh0LAorYS5idXR0b250ZXh0YmlnLAorLnNtYWxsU3VibWl0LAorLnNtYWxsU3VibWl0OmhvdmVyLAorLm1lZGl1bVN1Ym1pdCwKKy5sYXJnZVN1Ym1pdCwKKy5sb2dpbkJ1dHRvbiwKKy5idXR0b24tc3R5bGUtMSBhLAorLmJ1dHRvbi1zdHlsZS0xIHVsIGEsCisuYnV0dG9uLXN0eWxlLTIgdWwgYSwKKy5idXR0b24tc3R5bGUtMiBhLAorLmJ1dHRvbiwKK2J1dHRvbiwKK2lucHV0W3R5cGU9InJlc2V0Il0sCitpbnB1dFt0eXBlPSJzdWJtaXQiXSwKK2lucHV0W3R5cGU9ImJ1dHRvbiJdIHsKKyAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOworICAtbW96LWJvcmRlci1yYWRpdXM6IDEuMWVtOworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEuMWVtOworICBib3JkZXItcmFkaXVzOiAycHg7CisgIGJvcmRlcjogMC4xZW0gc29saWQgQG1haW4tY29sb3ItdGhlbWU7CisgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgY3Vyc29yOiBwb2ludGVyOworICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGRpc3BsYXk6aW5saW5lLWJsb2NrOworICBmb250LXNpemU6IDFlbTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG91dGxpbmU6IDA7CisgIG92ZXJmbG93OiB2aXNpYmxlOworICBwYWRkaW5nOiAwLjRlbSAxZW0gMC40ZW07CisgIHRleHQtZGVjb3JhdGlvbjpub25lOworICAvKnRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsqLworICB3aWR0aDogYXV0bzsKKworICAvKiBJRTcgKi8KKyAgKnBhZGRpbmctdG9wOiAwLjJlbTsKKyAgKnBhZGRpbmctYm90dG9tOiAwOworICAmOmhvdmVyIHsKKyAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIH0KK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIEZvb3RlciBTdHlsZSAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNmb290ZXIgeworICBiYWNrZ3JvdW5kOiBAZGFyay1jb2xvci10aGVtZTsKKyAgYm9yZGVyLXRvcDogMC4xZW0gaW5zZXQgIzAwMDsKKyAgcGFkZGluZzogMC41ZW0gMCAwLjVlbSAwLjVlbTsKKworICBoZWlnaHQ6IEBmb290ZXItaGVpZ2h0OworICBwb3NpdGlvbjogZml4ZWQ7CisgIGJvdHRvbTogMDsKKyAgd2lkdGg6IDEwMCU7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7CisgIHotaW5kZXg6IDEwOworCisgIHNwYW4geworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICBwYWRkaW5nOiAxMHB4OworICB9CisKKyAgYSB7CisgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIH0KK30KKworI2Zvb3RlciBhOmZvY3VzIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9CisKKyNmb290ZXItb2Zmc2V0IHsKKyAgaGVpZ2h0OiBAZm9vdGVyLWhlaWdodCArIDEwcHg7CisgIHdpZHRoOiAxMDAlOworfQpkaWZmIC0tZ2l0IGEvdGhlbWVzL3JhaW5ib3dzdG9uZS93ZWJhcHAvcmFpbmJvd3N0b25lL3JhaW5ib3dzdG9uZS1lbWVyYWxkLmxlc3MgYi90aGVtZXMvcmFpbmJvd3N0b25lL3dlYmFwcC9yYWluYm93c3RvbmUvcmFpbmJvd3N0b25lLWVtZXJhbGQubGVzcwppbmRleCA2YmE4NjEyLi4wMjBjNzc2IDEwMDY0NAotLS0gYS90aGVtZXMvcmFpbmJvd3N0b25lL3dlYmFwcC9yYWluYm93c3RvbmUvcmFpbmJvd3N0b25lLWVtZXJhbGQubGVzcworKysgYi90aGVtZXMvcmFpbmJvd3N0b25lL3dlYmFwcC9yYWluYm93c3RvbmUvcmFpbmJvd3N0b25lLWVtZXJhbGQubGVzcwpAQCAtMSwxOTk0ICsxLDE5OTQgQEAKLS8qIGNvbW1vbiBjb2xvcnMgKi8NCi1AYmxhY2s6ICMwMDA7DQotQHdoaXRlOiAjZmZmOw0KLUBncmV5OiAjZTZlNmU2Ow0KLUBncmV5ZGFyazogIzkyOTI5MjsNCi0NCi1AY29sb3Itc3VjY2VzczogIzhjZmY4YzsNCi1AZm9udC1jb2xvci1mb3Itc3VjY2VzczogQGJsYWNrOw0KLUBjb2xvci1hbGVydDogI2ZmOGM4YzsNCi1AZm9udC1jb2xvci1mb3ItYWxlcnQ6IEBibGFjazsNCi0NCi1AY29sb3Itc3VjY2Vzcy1kYXJrOiAjMzU2ZTM1Ow0KLUBmb250LWNvbG9yLWZvci1zdWNjZXNzOiBAYmxhY2s7DQotQGNvbG9yLWFsZXJ0LWRhcms6ICM5MzJmMzM7DQotQGZvbnQtY29sb3ItZm9yLWFsZXJ0OiBAYmxhY2s7DQotDQotQGNvbG9yLWJhY2tncm91bmQtYWxlcnQ6ICNmMmRlZGU7DQotQGNvbG9yLWZvbnQtYWxlcnQ6ICNhOTQ0NDI7DQotQGNvbG9yLWJvcmRlci1hbGVydDogI2ViY2NkMTsNCi0NCi1AY29sb3ItYmFja2dyb3VuZC1zdWNjZXNzOiAjZGZmMGQ4Ow0KLUBjb2xvci1mb250LXN1Y2Nlc3M6ICMzYzc2M2Q7DQotQGNvbG9yLWJvcmRlci1zdWNjZXNzOiAjZDZlOWM2Ow0KLQ0KLS8qIFNhcGhpciBjb2xvcnMgKi8NCi1AYmx1ZS1kYXJrOiAjMDAyMzMzOw0KLUBibHVlLW1haW46ICMwMDU5ODI7DQotQGJsdWUtbWVkaXVtOiAjYzdkZmZmOw0KLUBibHVlLWxpZ2h0OiAjZjFmN2ZmOw0KLUBibHVlLWxpZ2h0MjogI2U0ZjBmNTsNCi0NCi0vKiBSdWJ5IGNvbG9ycyAqLw0KLUByZWQtZGFyazogIzQyMDAwMDsNCi1AcmVkLW1haW46ICNiZjE2MTY7DQotQHJlZC1tZWRpdW06ICNmN2JhYmE7DQotQHJlZC1saWdodDogI2ZjZTdlNzsNCi1AcmVkLWxpZ2h0MjogI2ZlZDdjOTsNCi0NCi0vKiBFbWVyYWxkIGNvbG9ycyAqLw0KLUBncmVlbi1kYXJrOiAjMTk3OTQ4Ow0KLUBncmVlbi1tYWluOiAjMjNhZjliOw0KLUBncmVlbi1tZWRpdW06ICM3YWUzYWQ7DQotQGdyZWVuLWxpZ2h0OiAjZTVmOWVmOw0KLUBncmVlbi1saWdodDI6ICNkN2Y5ZWY7DQotDQotLyogQW1iZXIgY29sb3JzICovDQotQGFtYmVyLWRhcms6ICNiYzQyMTY7DQotQGFtYmVyLW1haW46ICNmMDg5MDY7DQotQGFtYmVyLW1lZGl1bTogI2Y1YzRiMzsNCi1AYW1iZXItbGlnaHQ6ICNmY2VkZTg7DQotQGFtYmVyLWxpZ2h0MjogI2ZjZWRjZDsNCi0NCi0vKiBTYXBoaXIgdGhlbWUgKi8NCi0vKg0KLUBtYWluLWNvbG9yLXRoZW1lIDogQGJsdWUtbWFpbjsNCi1AZGFyay1jb2xvci10aGVtZSA6IEBibHVlLWRhcms7DQotQG1lZGl1bS1jb2xvci10aGVtZSA6IEBibHVlLW1lZGl1bTsNCi1AbGlnaHQtY29sb3ItdGhlbWUgOiBAYmx1ZS1saWdodDsNCi1AbGlnaHQyLWNvbG9yLXRoZW1lIDogQGJsdWUtbGlnaHQyOw0KLUBmb250LWNvbG9yLWZvci1kYXJrIDogQGdyZXk7DQotQGZvbnQtY29sb3ItZm9yLW1haW4gOiBAd2hpdGU7DQotQGZvbnQtY29sb3ItZm9yLW1lZGl1bSA6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLUBmb250LWNvbG9yLWZvci1saWdodCA6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLUBzaGFkb3ctY29sb3IgOiBAYmxhY2s7DQotQHNoYWRvdy1jb2xvci1saWdodCA6IEBncmV5ZGFyazsNCi0qLw0KLQ0KLS8qIFJ1YnkgdGhlbWUgKi8NCi0vKg0KLUBtYWluLWNvbG9yLXRoZW1lIDogQHJlZC1tYWluOw0KLUBkYXJrLWNvbG9yLXRoZW1lIDogQHJlZC1kYXJrOw0KLUBtZWRpdW0tY29sb3ItdGhlbWUgOiBAcmVkLW1lZGl1bTsNCi1AbGlnaHQtY29sb3ItdGhlbWUgOiBAcmVkLWxpZ2h0Ow0KLUBsaWdodDItY29sb3ItdGhlbWUgOiBAcmVkLWxpZ2h0MjsNCi1AZm9udC1jb2xvci1mb3ItZGFyayA6IEBncmV5Ow0KLUBmb250LWNvbG9yLWZvci1tYWluIDogQHdoaXRlOw0KLUBmb250LWNvbG9yLWZvci1tZWRpdW0gOiBAZGFyay1jb2xvci10aGVtZTsNCi1AZm9udC1jb2xvci1mb3ItbGlnaHQgOiBAZGFyay1jb2xvci10aGVtZTsNCi1Ac2hhZG93LWNvbG9yIDogQGJsYWNrOw0KLUBzaGFkb3ctY29sb3ItbGlnaHQgOiBAZ3JleWRhcms7DQotLyoNCi0NCi0vKiBFbWVyYWxkIHRoZW1lICovDQotQG1haW4tY29sb3ItdGhlbWUgOiBAZ3JlZW4tbWFpbjsNCi1AZGFyay1jb2xvci10aGVtZSA6IEBncmVlbi1kYXJrOw0KLUBtZWRpdW0tY29sb3ItdGhlbWUgOiBAZ3JlZW4tbWVkaXVtOw0KLUBsaWdodC1jb2xvci10aGVtZSA6IEBncmVlbi1saWdodDsNCi1AbGlnaHQyLWNvbG9yLXRoZW1lIDogQGdyZWVuLWxpZ2h0MjsNCi1AZm9udC1jb2xvci1mb3ItZGFyayA6IEB3aGl0ZTsNCi1AZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsNCi1AZm9udC1jb2xvci1mb3ItbWVkaXVtIDogQGRhcmstY29sb3ItdGhlbWU7DQotQGZvbnQtY29sb3ItZm9yLWxpZ2h0IDogQGRhcmstY29sb3ItdGhlbWU7DQotQHNoYWRvdy1jb2xvciA6IEBibGFjazsNCi1Ac2hhZG93LWNvbG9yLWxpZ2h0IDogQGdyZXlkYXJrOw0KLQ0KLS8qIEFtYmVyIHRoZW1lICovDQotLyoNCi1AbWFpbi1jb2xvci10aGVtZSA6IEBhbWJlci1tYWluOw0KLUBkYXJrLWNvbG9yLXRoZW1lIDogQGFtYmVyLWRhcms7DQotQG1lZGl1bS1jb2xvci10aGVtZSA6IEBhbWJlci1tZWRpdW07DQotQGxpZ2h0LWNvbG9yLXRoZW1lIDogQGFtYmVyLWxpZ2h0Ow0KLUBsaWdodDItY29sb3ItdGhlbWUgOiBAYW1iZXItbGlnaHQyOw0KLUBmb250LWNvbG9yLWZvci1kYXJrIDogQHdoaXRlOw0KLUBmb250LWNvbG9yLWZvci1tYWluIDogQHdoaXRlOw0KLUBmb250LWNvbG9yLWZvci1tZWRpdW0gOiBAZGFyay1jb2xvci10aGVtZTsNCi1AZm9udC1jb2xvci1mb3ItbGlnaHQgOiBAZGFyay1jb2xvci10aGVtZTsNCi1Ac2hhZG93LWNvbG9yIDogQGJsYWNrOw0KLUBzaGFkb3ctY29sb3ItbGlnaHQgOiBAZ3JleWRhcms7DQotKi8NCi0NCi0NCi1AYXBwLWJhci1oZWlnaHQ6IDYwcHg7DQotQHN1Yi1hcHAtYmFyLWhlaWdodDogNDBweDsNCi1AZm9vdGVyLWhlaWdodDogMjBweDsNCi1AaG9tZS1idG4td2lkdGg6IDQ3cHg7DQotQGNvbG9yLWxpbmUtaGVpZ2h0OiA5cHg7DQotDQotQGhvbWUtbWVudS10aWxlLWhlaWdodDogODBweDsNCi1AaG9tZS1tZW51LXRpbGUtbWluLXdpZHRoOiAxMDBweDsNCi1AaG9tZS1tZW51LXRpbGUtbWF4LXdpZHRoOiAxMDBweDsNCi0NCi1AdGhpcmQtbHZsLWhlaWdodDogODBweDsNCi1AdGhpcmQtbHZsLXdpZHRoIDogMTAwcHg7DQotQG1pbi1zY3JlZW4gOiAxMTcwcHg7DQotQG1pbi1jb250YWluZXItd2lkdGg6IDExMzBweDsNCi0NCi1AYm94LWJvcmRlci1jb2xvcjogI2Q3ZDdkNzsNCi0NCi1AZm9udC1mYWNlIHsNCi0gIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gIHNyYzogdXJsKCdmb250cy9xdWlja3NhbmQvcXVpY2tzYW5kYm9sZC5vdGYnKTsNCi0gIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICBmb250LXN0eWxlOiBub3JtYWw7DQotfQ0KLQ0KLUBmb250LWZhY2Ugew0KLSAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgc3JjOiB1cmwoJ2ZvbnRzL3F1aWNrc2FuZC9xdWlja3NhbmRib2xkLm90ZicpOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBmb250LXN0eWxlOiBub3JtYWw7DQotfQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiBCZWdpbiBzcGVjaWFsIGNoZWNrYm94IHR5cGUgc3dpdGNoICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLWNoa2JveCwgW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94IHsNCi0gIGRpc3BsYXk6IG5vbmU7DQotfQ0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLWNoa2JveCArIGxhYmVsLA0KLVt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCArIGxhYmVsew0KLSAgY3Vyc29yOiBwb2ludGVyOw0KLX0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1jaGtib3ggKyBsYWJlbDpiZWZvcmUsDQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94ICsgbGFiZWw6YmVmb3Jlew0KLSAgY29udGVudDogIiI7DQotICB3aWR0aDogMTUwcHg7DQotICBtaW4td2lkdGg6IDE1MHB4Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lOw0KLSAgcGFkZGluZzogMnB4IDIwcHggMnB4IDIwcHg7DQotICBib3JkZXItcmFkaXVzOiA4cHggOHB4IDhweCA4cHg7DQotDQotICBjdXJzb3I6IHBvaW50ZXI7DQotfQ0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLWNoa2JveCArIGxhYmVsOmFmdGVyLA0KLVt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCArIGxhYmVsOmFmdGVyew0KLSAgY29udGVudDogIiI7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBsZWZ0Oi0zNXB4Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICBtaW4taGVpZ2h0OiAxMHB4Ow0KLSAgbWluLXdpZHRoOiAxMHB4Ow0KLSAgcGFkZGluZy1sZWZ0OiA0cHg7DQotICBwYWRkaW5nLXJpZ2h0OiA1cHg7DQotICBib3JkZXItcmFkaXVzOiA4cHggOHB4IDhweCA4cHg7DQotICB0cmFuc2l0aW9uOiBhbGwgLjJzOw0KLX0NCi0NCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1jaGtib3ggKyBsYWJlbDphZnRlcnsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGxlZnQ6IC0xNXB4Ow0KLSAgdHJhbnNpdGlvbjogYWxsIC4yczsNCi19DQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qIEVuZCBzcGVjaWFsIGNoZWNrYm94IHR5cGUgc3dpdGNoICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgQmVnaW4gc3F1YXJlIENoZWNrYm94ICAgICAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3gsDQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveHsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIGxlZnQ6IC05OTk5cHg7DQotfQ0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbCwNCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWx7DQotICBjb250ZW50OiAnJzsNCi0gIHBhZGRpbmctbGVmdDogMzVweDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi0gIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gIGZvbnQtc2l6ZTogMTJweDsNCi0NCi19DQotW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmJlZm9yZSwNCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YmVmb3Jlew0KLSAgY29udGVudDogJyc7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICBsZWZ0OjEwcHg7DQotICB0b3A6IC00cHg7DQotICB3aWR0aDogMTdweDsNCi0gIGhlaWdodDogMTdweDsgLyogZGltLiBkZSBsYSBjYXNlICovDQotICBib3JkZXI6IDFweCBzb2xpZCAjYWFhOw0KLSAgYmFja2dyb3VuZDogQGxpZ2h0LWNvbG9yLXRoZW1lOw0KLSAgYm9yZGVyLXJhZGl1czogMnB4Ow0KLX0NCi0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YmVmb3JlIHsNCi0gIGJhY2tncm91bmQ6IEBsaWdodC1jb2xvci10aGVtZTsNCi19DQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmJlZm9yZXsNCi0gIGJhY2tncm91bmQ6IEBtYWluLWNvbG9yLXRoZW1lOw0KLX0NCi0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YWZ0ZXIsDQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyew0KLSAgY29udGVudDogJ+KclCc7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICB0b3A6IC00cHg7DQotICBsZWZ0OiAxNHB4Ow0KLSAgZm9udC1zaXplOiAxNnB4Ow0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgdHJhbnNpdGlvbjogYWxsIC4yczsNCi19DQotW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyIHsNCi0gIG9wYWNpdHk6IDA7DQotICB0cmFuc2Zvcm06IHNjYWxlKDApOw0KLX0NCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YWZ0ZXIgew0KLSAgb3BhY2l0eTogMTsNCi0gIHRyYW5zZm9ybTogc2NhbGUoMSk7DQotfQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogIEVuZCBzcXVhcmUgQ2hlY2tib3ggICAgICAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogIEJlZ2luIGNsYXNzIGNvbnRlbnQgbWdtdCAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLQ0KLS5mbGV4LXJvdyB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdyAhaW1wb3J0YW50Ow0KLX0NCi0uZmxleC1jb2x1bW4gew0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47DQotfQ0KLQ0KLS5jb2wtd2lkdGgtMSB7DQotICB3aWR0aDogMTAlOw0KLX0NCi0uY29sLXdpZHRoLTIgew0KLSAgd2lkdGg6IDIwJTsNCi19DQotLmNvbC13aWR0aC0zIHsNCi0gIHdpZHRoOiAzMCU7DQotfQ0KLS5jb2wtd2lkdGgtNCB7DQotICB3aWR0aDogNDAlOw0KLX0NCi0uY29sLXdpZHRoLTUgew0KLSAgd2lkdGg6IDUwJTsNCi19DQotLmNvbC13aWR0aC02IHsNCi0gIHdpZHRoOiA2MCU7DQotfQ0KLS5jb2wtd2lkdGgtNyB7DQotICB3aWR0aDogNzAlOw0KLX0NCi0uY29sLXdpZHRoLTggew0KLSAgd2lkdGg6IDgwJTsNCi19DQotLmNvbC13aWR0aC05IHsNCi0gIHdpZHRoOiA5MCU7DQotfQ0KLS5jb2wtd2lkdGgtMTAgew0KLSAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLS5hbGlnbi12LWNlbnRlciB7DQotICBkaXNwbGF5OmZsZXg7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLX0NCi0NCi0uYWxpZ24taC1jZW50ZXIgew0KLSAgZGlzcGxheTpmbGV4Ow0KLSAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotfQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogICAgRW5kIGNsYXNzIGNvbnRlbnQgbWdtdCAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgQmVnaW4gYnRuLXNvcnQgICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0uYnRuLXNvcnQgew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgdG9wOiAtNnB4Ow0KLSAgYm9yZGVyOm5vbmU7DQotICBiYWNrZ3JvdW5kOm5vbmU7DQotICBib3JkZXItcmFkaXVzOiAwOw0KLSAgbWFyZ2luLWxlZnQ6NXB4Ow0KLX0NCi0NCi0uYnRuLXNvcnQ6YmVmb3Jlew0KLSAgY29udGVudDogJyc7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICBsZWZ0OiAtMXB4Ow0KLSAgd2lkdGg6IDA7DQotICBoZWlnaHQ6IDA7DQotICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotICBib3JkZXItYm90dG9tOiAxMHB4IHNvbGlkIEBncmV5ZGFyazsNCi0gIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLX0NCi0NCi0uYnRuLXNvcnQ6YWZ0ZXJ7DQotICBjb250ZW50OiAnJzsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHJpZ2h0OiAtMXB4Ow0KLSAgd2lkdGg6IDA7DQotICBoZWlnaHQ6IDA7DQotICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIEBncmV5ZGFyazsNCi0gIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLSAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTM0OXB4KSB7DQotICAgIHJpZ2h0OiAtNXB4Ow0KLSAgfQ0KLX0NCi0NCi0uYnRuLXNvcnQuYnRuLXNvcnQtYXNjOmJlZm9yZXsNCi0gIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgQG1haW4tY29sb3ItdGhlbWU7DQotfQ0KLQ0KLS5idG4tc29ydC5idG4tc29ydC1kZXNjOmFmdGVyew0KLSAgYm9yZGVyLXRvcDogMTBweCBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsNCi19DQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICBFbmQgYnRuLXNvcnQgICAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgQmVnaW4gZGVmYXV0IGNvbG91ciBjbGFzcyAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS5kYXJrLWNvbG9yIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcmsgIWltcG9ydGFudDsNCi19DQotLm1haW4tY29sb3Igew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbiAhaW1wb3J0YW50Ow0KLX0NCi0ubWVkaXVtLWNvbG9yIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtZWRpdW0tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWVkaXVtICFpbXBvcnRhbnQ7DQotfQ0KLS5saWdodC1jb2xvciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQtY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbGlnaHQgIWltcG9ydGFudDsNCi19DQotLmxpZ2h0Mi1jb2xvciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQyLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWxpZ2h0ICFpbXBvcnRhbnQ7DQotfQ0KLQ0KLS5ncmV5LWNvbG9yIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBncmV5ICFpbXBvcnRhbnQ7DQotfQ0KLS5kYXJrZ3JleS1jb2xvciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleWRhcmsgIWltcG9ydGFudDsNCi19DQotDQotLyogYmVnaW4gbG9va3VwIHdpZGdldCAqLw0KLS51aS1kaWFsb2cgew0KLSAgb3BhY2l0eTogMTsNCi0gIHotaW5kZXg6IDUwOw0KLX0NCi0NCi0udWktZGlhbG9nLXRpdGxlYmFyLnVpLXdpZGdldC1oZWFkZXIudWktY29ybmVyLWFsbC51aS1oZWxwZXItY2xlYXJmaXggew0KLSAgYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGJ1dHRvbiB7DQotICAgIGJhY2tncm91bmQ6IG5vbmU7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBsaWdodC1jb2xvci10aGVtZTsNCi0gIH0NCi19DQotLyogZW5kIGxvb2t1cCB3aWRnZXQgKi8NCi0NCi0ubWFpbi1iYXItbGFiZWwgew0KLSAgY29sb3I6IEBsaWdodC1jb2xvci10aGVtZTsNCi0gIHBhZGRpbmctbGVmdDogM3B4Ow0KLSAgcGFkZGluZy1yaWdodDogNnB4Ow0KLSAgZm9udC1zaXplOiAxNXB4Ow0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLSNjb21wYW55LWxvZ28gew0KLSAgcmlnaHQ6IDEwcHg7DQotICB0b3A6IDJweDsNCi0gIGJhY2tncm91bmQ6IHVybCgiaW1hZ2VzL29mYml6LXNpbXBsZS13aGl0ZS5zdmciKSBuby1yZXBlYXQgbGVmdCB0b3AgLyBjb3ZlcjsNCi0gIG1pbi1oZWlnaHQ6IDUwcHg7DQotICBtaW4td2lkdGg6IDUwcHg7DQotICBtYXJnaW4tcmlnaHQ6IDE1cHg7DQotICBhbGlnbi1zZWxmOiBjZW50ZXI7DQotICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoIDogMTIzMnB4KSB7DQotICAgIG1pbi1oZWlnaHQ6IDUwcHg7DQotICAgIG1pbi13aWR0aDogMTI5cHg7DQotICAgIGJhY2tncm91bmQ6IHVybCgiaW1hZ2VzL29mYml6LXdoaXRlLnN2ZyIpIG5vLXJlcGVhdCBsZWZ0IHRvcCAvIGNvdmVyOw0KLSAgfQ0KLX0NCi0NCi0ubW9kYWwtc2NyZWVuIHsNCi0gIHZpc2liaWxpdHk6IGhpZGRlbjsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7DQotICBvcGFjaXR5OiAuOTM7DQotICBwb3NpdGlvbjogZml4ZWQ7DQotICB0b3A6IDA7DQotICBsZWZ0OiAwOw0KLSAgaGVpZ2h0OiAxMDAlOw0KLSAgd2lkdGg6IDEwMCU7DQotICB6LWluZGV4OiA5OTk5Ow0KLX0NCi0NCi0ubW9kYWwtYm94ew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgb3BhY2l0eTogMTsNCi0gIG1hcmdpbjogMTAlOw0KLSAgYm9yZGVyLXJhZGl1czogMTBweDsNCi0gIGJvcmRlcjogc29saWQgMnB4IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgcGFkZGluZyA6IDEwcHggNDBweCAxMHB4IDQwcHg7DQotICAubW9kYWwtaGVhZGVyIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgICBoMiB7DQotICAgICAgZm9udC1zaXplOiAyNXB4Ow0KLSAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICB9DQotICAgIC5idG4tY2xvc2UtbnJkIHsNCi0gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgICAgcmlnaHQ6IDA7DQotICAgICAgZGlzcGxheTogZmxleDsNCi0gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgICBib3JkZXI6IHNvbGlkIDFweCBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgICBib3JkZXItcmFkaXVzOiA1cHg7DQotICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICAgIGZvbnQtc2l6ZTogMjVweDsNCi0gICAgICBoZWlnaHQ6IDMwcHg7DQotICAgICAgd2lkdGg6IDMwcHg7DQotICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7DQotICAgIH0NCi0gIH0NCi0gIC5tb2RhbC1ib2R5IHsNCi0gICAgcCB7DQotICAgICAgZm9udC1zaXplOiAyMHB4Ow0KLSAgICB9DQotICB9DQotICAubW9kYWwtZm9vdGVyIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICBoZWlnaHQ6IDM1cHg7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7DQotICAgIC5idG4tbnJkIHsNCi0gICAgICBiYWNrZ3JvdW5kOiBub25lOw0KLSAgICAgIGJvcmRlcjogbm9uZTsNCi0gICAgICB0ZXh0LXNoYWRvdzogbm9uZTsNCi0gICAgICBvcGFjaXR5OiAxOw0KLSAgICAgIG1hcmdpbi1yaWdodDogMTBweDsNCi0gICAgICBmb250LXNpemU6IDIwcHg7DQotICAgICAgcGFkZGluZzogNXB4Ow0KLSAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsNCi0gICAgfQ0KLSAgICAuYnRuLW5yZC1tYWluIHsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgICBjb2xvcjogQHdoaXRlOw0KLSAgICB9DQotICAgIC5idG4tbnJkLXN0ZCB7DQotICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgICBib3JkZXI6IHNvbGlkIDFweCBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgICB9DQotICB9DQotfQ0KLS5idG4tbnJkOmhvdmVyIHsNCi0gIGJveC1zaGFkb3c6IDVweCA1cHggM3B4IDAgQGJsYWNrOw0KLX0NCi0NCi0uYnRuLW5yZC1zdGQ6aG92ZXIgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGNvbG9yOiBAd2hpdGUgIWltcG9ydGFudDsNCi0gIGJvcmRlcjogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotfQ0KLQ0KLS5idG4tY2xvc2UtbnJkOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICBjb2xvcjogQHdoaXRlICFpbXBvcnRhbnQ7DQotfQ0KLQ0KLS5saXN0LW5yZCB7DQotICBib3JkZXI6IHNvbGlkIDJweCBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDEwcHg7DQotICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMTBweDsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KLSAgbWFyZ2luLXRvcDogMTVweDsNCi0gIG1hcmdpbi1ib3R0b206IDE1cHg7DQotICAudGl0bGUtbGlzdC1ucmQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgY29sb3IgOiBAd2hpdGU7DQotICAgIGZvbnQtc2l6ZTogMjBweDsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIHBhZGRpbmctbGVmdDogNXB4Ow0KLSAgfQ0KLQ0KLSAgbGkgew0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7DQotICAgIGZvbnQtc2l6ZTogMjBweDsNCi0gICAgcGFkZGluZy1sZWZ0OiA1cHg7DQotICAgIHBhZGRpbmctdG9wOiAycHg7DQotICAgIHBhZGRpbmctYm90dG9tOiAycHg7DQotICAgIG1hcmdpbi1ib3R0b206IDNweDsNCi0gICAgYSB7DQotICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICB9DQotICAgIHNwYW4gew0KLSAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgICByaWdodDogMDsNCi0gICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgICAgZm9udC1zaXplOiAzMHB4Ow0KLSAgICB9DQotICB9DQotfQ0KLWxpLmxpbmUtb2RkIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBsaWdodC1jb2xvci10aGVtZTsNCi19DQotDQotI3VzZXItYXZhdGFyIHsNCi0gIGhlaWdodDogNDBweDsNCi0gIHdpZHRoOiA0MHB4Ow0KLSAgcGFkZGluZzogMnB4Ow0KLQ0KLSAgYWxpZ24tc2VsZjogY2VudGVyOw0KLQ0KLSAgOmhvdmVyIHsNCi0gICAgY3Vyc29yOiBwb2ludGVyOw0KLSAgfQ0KLSAgaW1nIHsNCi0gICAgbWF4LWhlaWdodDogNDBweDsNCi0gICAgbWF4LXdpZHRoOiA0MHB4Ow0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIHRvcDogLTJweDsNCi0gICAgcGFkZGluZzogMnB4Ow0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICAgIGJvcmRlci1yYWRpdXM6IDJweDsNCi0gIH0NCi19DQotDQotI21haW4tbmF2aWdhdGlvbi1iYXIgew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgd2lkdGg6IDEwMCU7DQotICBtaW4td2lkdGg6IEBtaW4tY29udGFpbmVyLXdpZHRoOw0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiByb3c7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KLSAgZm9udC1mYW1pbHk6IFF1aWNrc2FuZCxzYW5zLXNlcmlmOw0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICB6LWluZGV4OiA1Ow0KLSAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQ7DQotfQ0KLSNtYWluLW5hdi1iYXItbGVmdCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi19DQotI21haW4tbmF2LWJhci1yaWdodCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gIHBhZGRpbmctcmlnaHQ6IDE1cHg7DQotfQ0KLQ0KLS5hcHAtYnRuew0KLSAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQ7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gIG1hcmdpbi1yaWdodDogMnB4Ow0KLSAgbWFyZ2luLWxlZnQ6IDJweDsNCi0gIGEgew0KLSAgICBwYWRkaW5nOjEwcHg7DQotICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgZm9udC1zaXplOiAxLjRlbSAhaW1wb3J0YW50Ow0KLSAgfQ0KLX0NCi0NCi0uYXBwLWJ0biBhOnZpc2l0ZWQgew0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLX0NCi0NCi0uYXBwLWJ0bjpob3ZlcnsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIHRvcDogLTZweDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNXB4Ow0KLSAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDVweDsNCi0gIGJveC1zaGFkb3c6IDFweCAxcHggMTJweCBAc2hhZG93LWNvbG9yOw0KLSAgYSB7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gICAgdG9wOiA2cHg7DQotICAgIGNvbG9yIDogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICB9DQotfQ0KLS5hcHAtYnRuLnNlbGVjdGVkOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgYm94LXNoYWRvdzogbm9uZTsNCi0gIHRvcDowOw0KLX0NCi0NCi0uYXBwLWJ0biBhOmhvdmVyIHsNCi0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotI2FwcC1zZWxlY3RlZCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgYm94LXNoYWRvdzogMXB4IC0ycHggMTJweCBAc2hhZG93LWNvbG9yOw0KLSAgei1pbmRleDogMDsNCi0gIG9wYWNpdHk6IC45OTsNCi0gIGJvcmRlci10b3AtbGVmdC1yYWRpdXMgOiA4cHggOw0KLSAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMgOiA4cHggOw0KLSAgYSB7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gICAgdG9wOiAzcHg7DQotICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gIH0NCi19DQotLmFwcC1idG4uc2VsZWN0ZWQgYTpob3ZlciB7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLSNhcHAtYmFyLWxpbmUgew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgd2lkdGg6IDEwMCU7DQotICBtaW4td2lkdGg6IEBtaW4tY29udGFpbmVyLXdpZHRoOw0KLSAgaGVpZ2h0OiBAY29sb3ItbGluZS1oZWlnaHQ7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGJveC1zaGFkb3c6IDJweCAycHggNXB4IEBzaGFkb3ctY29sb3I7DQotfQ0KLSNjb2xvci1hZGQgew0KLSAgd2lkdGg6IDE1MHB4Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBoZWlnaHQ6IEBjb2xvci1saW5lLWhlaWdodDsNCi0gIHotaW5kZXg6IDIwOw0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgdG9wOiBAY29sb3ItbGluZS1oZWlnaHQ7DQotfQ0KLQ0KLSNtb3JlLWFwcCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBmb250LXNpemU6IDEuNGVtICFpbXBvcnRhbnQ7DQotICB3aWR0aDogNDBweDsNCi0gIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0Ow0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLX0NCi0jbW9yZS1hcHA6aG92ZXIgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLSNtb3JlLWFwcDpob3ZlciAjbW9yZS1hcHAtbGlzdCB7DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotI21vcmUtYXBwLnNlbGVjdGVkIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLX0NCi0NCi0jbW9yZS1hcHAtbGlzdCB7DQotICBkaXNwbGF5OiBub25lOw0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgdG9wOiBAYXBwLWJhci1oZWlnaHQ7DQotICBsZWZ0OiAtMjBweDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgei1pbmRleDogMTA7DQotICBib3JkZXI6IHNvbGlkIDRweCBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGJvcmRlci10b3Atd2lkdGg6IEBjb2xvci1saW5lLWhlaWdodDsNCi0gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsNCi0gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7DQotICBsaSB7DQotICAgIHBhZGRpbmctbGVmdCA6IDRweDsNCi0gICAgcGFkZGluZy1yaWdodDogNHB4Ow0KLSAgfQ0KLQ0KLSAgYSB7DQotICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgZm9udC1zaXplOiAxNXB4Ow0KLSAgfQ0KLQ0KLSAgOmhvdmVyIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQG1lZGl1bS1jb2xvci10aGVtZTsNCi0gICAgYSB7DQotICAgICAgYm94LXNoYWRvdzogbm9uZTsNCi0gICAgICBjb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICAgIH0NCi0gICAgYTpob3ZlcnsNCi0gICAgICBib3gtc2hhZG93OiBub25lOw0KLSAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gICAgICBib3JkZXItcmFkaXVzOiAwOw0KLSAgICB9DQotICB9DQotDQotICBsaS5zZWxlY3RlZCB7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICBhIHsNCi0gICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICAgIH0NCi0gICAgYTpob3ZlciB7DQotICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLSNob21lQnV0dG9uIHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICAvL3Zpc2liaWxpdHk6IGhpZGRlbjsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gIGJhY2tncm91bmQtY29sb3I6QGdyZXk7DQotICBib3JkZXI6IG5vbmU7DQotICBib3JkZXItcmFkaXVzIDogMDsNCi0NCi0gIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0Ow0KLSAgd2lkdGggOiBAaG9tZS1idG4td2lkdGg7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICBpbWcgew0KLSAgICBoZWlnaHQ6IDI1cHg7DQotICAgIHRyYW5zaXRpb246IGFsbCAuMnMgZWFzZS1pbi1vdXQ7DQotICB9DQotfQ0KLQ0KLSNob21lQnV0dG9uOmhvdmVyIGltZyB7DQotICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7DQotfQ0KLQ0KLSNhcHAtYmFyLWxpc3Qgew0KLSAgZGlzcGxheTogZmxleDsNCi19DQotDQotI3VzZXItZGV0YWlscyB7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICByaWdodDogMjBweDsNCi0gIHRvcCA6IDYycHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIGNvbG9yIDogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICBmb250LXNpemU6IDE1cHg7DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIHBhZGRpbmctdG9wOiA1cHg7DQotICBwYWRkaW5nLWJvdHRvbTogMTBweDsNCi0gIHotaW5kZXg6IDE1Ow0KLSAgYm94LXNoYWRvdzogM3B4IDNweCAxMnB4IEBzaGFkb3ctY29sb3I7DQotICBib3JkZXItcmFkaXVzOiAzcHg7DQotICB0cmFuc2l0aW9uOiBhbGwgLjFzIGVhc2UtaW4tb3V0Ow0KLQ0KLSAgaW1nIHsNCi0gICAgaGVpZ2h0OiA1MHB4Ow0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICAgIHBhZGRpbmc6IDRweDsNCi0gICAgYm9yZGVyLXJhZGl1cyA6IDNweDsNCi0gICAgbWFyZ2luLWxlZnQ6IDEwcHg7DQotICAgIG1hcmdpbi1yaWdodDogNXB4Ow0KLSAgfQ0KLSAgI2xvZ291dCB7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gICAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICAgIGJvcmRlci1yYWRpdXM6IDJweDsNCi0gICAgOmhvdmVyIHsNCi0gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICAgIH0NCi0gIH0NCi19DQotDQotI3VzZXItZGV0YWlsczphZnRlcnsNCi0gIGNvbnRlbnQ6ICcnOw0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgdG9wOiAtMTBweDsNCi0gIHJpZ2h0OiA1cHg7DQotICB3aWR0aDogMDsNCi0gIGhlaWdodDogMDsNCi0gIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi0gIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgQGRhcmstY29sb3ItdGhlbWU7DQotICBib3JkZXItbGVmdDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi19DQotDQotYS51c2VyLXByZWYtYnRuIHsNCi0gIG1hcmdpbi10b3A6IDE1cHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIG1hcmdpbi1sZWZ0OiAxMHB4Ow0KLSAgbWFyZ2luLXJpZ2h0OiAxMHB4Ow0KLSAgcGFkZGluZy10b3A6IDJweDsNCi0gIHBhZGRpbmctYm90dG9tOiAycHg7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcmsgIWltcG9ydGFudDsNCi0gIDpob3ZlciB7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gIH0NCi19DQotDQotI3VzZXItbmFtZSB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCi0gIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgYWxpZ24tY29udGVudDogY2VudGVyOw0KLSAgcGFkZGluZy1sZWZ0IDogNXB4Ow0KLSAgcGFkZGluZy1yaWdodCA6IDVweDsNCi0gIHNwYW4gew0KLSAgICBtaW4td2lkdGg6IDEwMHB4Ow0KLSAgICBwYWRkaW5nLWJvdHRvbSA6IDVweDsNCi0gICAgcGFkZGluZy10b3AgOiA1cHg7DQotICB9DQotfQ0KLQ0KLSN1c2VyLXJvdzEgew0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiByb3c7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICN1c2VyLWxhbmcgew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgYWxpZ24tY29udGVudDogY2VudGVyOw0KLSAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQotICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7DQotICAgIHNwYW4gew0KLSAgICAgIG1pbi13aWR0aDogMzBweDsNCi0gICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgIH0NCi0gIH0NCi19DQotDQotLmFwcGJhci1idG4taW1nIHsNCi0gIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0IC0gNDBweDsNCi19DQotDQotI2hlbHAtYnRuIHsNCi0gIGZvbnQtc2l6ZTogMTBweDsNCi0gIG1pbi13aWR0aDogMjBweDsNCi0gIG1hcmdpbi1yaWdodDogMTVweDsNCi19DQotLyogQmVnaW4gc3ViIE1lbnUgc2VjdGlvbiAqLw0KLQ0KLSNhcHAtbmF2aWdhdGlvbiB7DQotICBoZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQ7DQotICBib3JkZXItcmlnaHQ6IHNvbGlkIDFweCBAYmxhY2s7DQotICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOw0KLSAgd2lkdGg6IDEwMCU7DQotICBtaW4td2lkdGg6IEBtaW4tY29udGFpbmVyLXdpZHRoOw0KLSAgaDIgew0KLSAgICBkaXNwbGF5OiBub25lOw0KLSAgfQ0KLSAgdWwgew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsNCi0gICAgZmxleC1ncm93OiAxOw0KLSAgfQ0KLSAgdWwgbGkgdWwgbGkgew0KLSAgICBib3JkZXItbGVmdDogc29saWQgMXB4IEBibGFjazsNCi0gICAgaGVpZ2h0OiBAc3ViLWFwcC1iYXItaGVpZ2h0Ow0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgICBqdXN0aWZ5LWl0ZW1zOiBjZW50ZXI7DQotICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICBtaW4td2lkdGg6IDc1cHg7DQotICAgIHBhZGRpbmctbGVmdDogNnB4Ow0KLSAgICBwYWRkaW5nLXJpZ2h0OiA2cHg7DQotICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBibGFjazsNCi0gICAgZm9udC1zaXplOiAxMnB4Ow0KLSAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxNTAwcHgpIHsNCi0gICAgICBmb250LXNpemU6IDEwcHg7DQotICAgICAgbWluLXdpZHRoOiA2NXB4Ow0KLSAgICB9DQotICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEzMDBweCkgew0KLSAgICAgIGZvbnQtc2l6ZTogMTBweDsNCi0gICAgICBtaW4td2lkdGg6IDUwcHg7DQotICAgIH0NCi0gICAgYSB7DQotICAgICAgZGlzcGxheTogZmxleDsNCi0gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCi0gICAgICBoZWlnaHQ6IDEwMCU7DQotICAgICAgd2lkdGg6IDEwMCU7DQotICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLSNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaTpsYXN0LWNoaWxkIHsNCi0gIGJvcmRlci1yaWdodDogc29saWQgMXB4IEBibGFjazsNCi19DQotDQotI2FwcC1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgbWluLWhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIC8vdG9wOiAtMXB4Ow0KLSAgYSB7DQotICAgIGNvbG9yOiBAd2hpdGU7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gIH0NCi19DQotI2FwcC1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpLnNlbGVjdGVkOmhvdmVyIHsNCi0gIGEgew0KLSAgICBjb2xvcjogQGJsYWNrICFpbXBvcnRhbnQ7DQotICB9DQotfQ0KLQ0KLSNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaS5zZWxlY3RlZCB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICB0b3A6IDFweDsNCi0gIGhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodCArIDFweDsNCi0gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAycHg7DQotICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAycHg7DQotICBib3JkZXItYm90dG9tOiBub25lOw0KLQ0KLSAgOmFmdGVyIHsNCi0gICAgY29udGVudDogJyc7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgdG9wOiAtMnB4Ow0KLSAgICBsZWZ0OiA1cHg7DQotICAgIHdpZHRoOiAwOw0KLSAgICBoZWlnaHQ6IDA7DQotICAgIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi0gICAgYm9yZGVyLXRvcDogMTBweCBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotICB9DQotDQotfQ0KLQ0KLQ0KLS8qIEVuZCBzdWIgTWVudSBzZWN0aW9uICovDQotDQotLyogYmVnaW4gc3ViIE1lbnUgc2VjdGlvbiAzcmQgbGV2ZWwgKi8NCi0NCi0uYnV0dG9uLWJhci50YWItYmFyIHsNCi0gIHVsIGxpIHVsIGxpIHsNCi0gICAgYm9yZGVyOiBzb2xpZCAxcHggQGdyZXk7DQotICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCi0gICAgYSB7DQotICAgICAgd2lkdGg6IDEwMCU7DQotICAgICAgaGVpZ2h0OiAxMDAlOw0KLSAgICB9DQotICB9DQotICBsaS5zZWxlY3RlZHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIGF7DQotICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgICB9DQotICB9DQotICB1bCBsaSB1bCBsaTpob3ZlciB7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICBhIHsNCi0gICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW4gOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLSN0aGlyZC1sZXZlbC1tZW51LWNvbnRhaW5lciB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi19DQotI3dvcmtpbmctYXJlYSB7DQotICB3aWR0aDogMTAwJTsNCi19DQotDQotI2xlZnQtY29sdW1uLW1lbnUgew0KLSAgd2lkdGg6IDEwMHB4Ow0KLX0NCi0NCi0udGhpcmQtbHZsLW1lbnUgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBsZWZ0OiAtMTBweDsNCi0gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7DQotICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4Ow0KLSAgcGFkZGluZy10b3A6IDRweDsNCi0gIHBhZGRpbmctYm90dG9tOiA0cHg7DQotICB1bCB7DQotICAgIGxpIHsNCi0gICAgICB1bCB7DQotICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgICAgICB0b3A6IDVweDsNCi0gICAgICAgIHdpZHRoOiBAdGhpcmQtbHZsLXdpZHRoOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSAgaDIgew0KLSAgICB2aXNpYmlsaXR5OiBoaWRkZW47DQotICB9DQotfQ0KLS50aGlyZC1sZXZlbC1pdGVtOmxhc3QtY2hpbGQgew0KLSAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lOw0KLX0NCi0NCi0udGhpcmQtbGV2ZWwtaXRlbSB7DQotICBtaW4taGVpZ2h0OiBAdGhpcmQtbHZsLWhlaWdodDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgcGFkZGluZy1yaWdodDogM3B4Ow0KLSAgYm9yZGVyLXRvcDogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lOw0KLQ0KLSAgYSwgYTp2aXNpdGVkIHsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICAgIHdpZHRoOiAxMDAlOw0KLSAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcmsgIWltcG9ydGFudDsNCi0gICAgbWluLWhlaWdodDogQHRoaXJkLWx2bC1oZWlnaHQ7DQotICAgIG1heC13aWR0aDogQHRoaXJkLWx2bC13aWR0aDsNCi0gICAgdGV4dC1hbGlnbjogY2VudGVyOw0KLSAgfQ0KLX0NCi0udGhpcmQtbGV2ZWwtaXRlbS5zZWxlY3RlZCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBib3JkZXItbGVmdDogc29saWQgOXB4IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgYSwgYTp2aXNpdGVkIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgICBjb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIH0NCi0gIDphZnRlciB7DQotICAgIGNvbnRlbnQ6ICcnOw0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHRvcDogNXB4Ow0KLSAgICBsZWZ0OiAwOw0KLSAgICB3aWR0aDogMDsNCi0gICAgaGVpZ2h0OiAwOw0KLSAgICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLSAgICBib3JkZXItbGVmdDogMTBweCBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi0gIH0NCi19DQotDQotLnRoaXJkLWxldmVsLWl0ZW0gYTpob3ZlciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbiA7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLS8qIEVuZCAzcmQgbGV2ZWwgbWVudSAqLw0KLQ0KLQ0KLQ0KLS8qIEJlZ2luIEhvbWUgTWVudSBmb3IgSUIgc2VjdGlvbiAqLw0KLS5maXhlZC1uYXYtYmFyIHsNCi0gIHBvc2l0aW9uOiBmaXhlZCAhaW1wb3J0YW50Ow0KLSAgd2lkdGg6IDEwMCU7DQotfQ0KLSNuYXYtYmFyLW9mZnNldCB7DQotICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodCA7DQotfQ0KLQ0KLSNob21lR2x5cGggew0KLSAgbWFyZ2luLWxlZnQ6IDIwcHg7DQotICBoZWlnaHQ6IDIwcHg7DQotfQ0KLQ0KLSNob21lUGFnZVRpdGxlIHsNCi0gIGNvbG9yOiBAd2hpdGU7DQotICBmb250LXNpemU6IDIwcHg7DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIG1hcmdpbi1yaWdodDogMjBweDsNCi0gIG1hcmdpbi1sZWZ0OiAyMHB4Ow0KLX0NCi0uaG9tZS1tZW51LWxpc3Qgew0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLX0NCi0uaHAtYXBwbGlzdCB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gIGNvbG9yIDogQHdoaXRlOw0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gIC5hcHAtdGl0bGUgew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICAgIGhlaWdodDogQGhvbWUtbWVudS10aWxlLWhlaWdodDsNCi0gICAgcGFkZGluZzogNXB4IDEwcHggNXB4IDEwcHg7DQotICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCBAYmxhY2s7DQotICAgIHNwYW4gew0KLSAgICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZiAhaW1wb3J0YW50Ow0KLSAgICAgIGZvbnQtc2l6ZTogMTVweDsNCi0gICAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgICB3aWR0aDogMTEwcHg7DQotICAgICAgYSB7DQotICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICAgICAgICBjb2xvciA6IEB3aGl0ZTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIC5ocC1tZW51LWl0ZW0gew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICBtYXJnaW4tbGVmdDogNXB4Ow0KLSAgICBtYXJnaW4tcmlnaHQ6IDVweDsNCi0gICAgYm9yZGVyOiBzb2xpZCAycHggQGdyZXk7DQotICAgIGJvcmRlci1yYWRpdXM6IDhweDsNCi0gICAgaGVpZ2h0OiBAaG9tZS1tZW51LXRpbGUtaGVpZ2h0IC0gNHB4Ow0KLSAgICBtaW4td2lkdGg6IEBob21lLW1lbnUtdGlsZS1taW4td2lkdGg7DQotICAgIG1heC13aWR0aDogQGhvbWUtbWVudS10aWxlLW1heC13aWR0aDsNCi0gICAgLm1lbnUtbGluayB7DQotICAgICAgZm9udC1zaXplOiAxMHB4Ow0KLSAgICAgIGNvbG9yOiBAYmxhY2s7DQotICAgICAgcGFkZGluZzogMTBweDsNCi0gICAgfQ0KLSAgICAuc3Rhci1saW5rIHsNCi0gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgICAgaGVpZ2h0OiAyNXB4Ow0KLSAgICAgIHRvcDogNXB4Ow0KLSAgICAgIHJpZ2h0OiA1cHg7DQotICAgIH0NCi0gIH0NCi0NCi19DQotLmhwLWFwcGxpc3QgLmFwcC10aXRsZSBzcGFuIGE6aG92ZXIgew0KLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0uaHAtbWVudS1pdGVtLmZhdm9yaXRlSXRlbSB7DQotICBib3JkZXI6IHNvbGlkIDJweCBAZGFyay1jb2xvci10aGVtZTsNCi19DQotDQotLmhwLW1lbnUtaXRlbTpob3ZlciB7DQotICBib3gtc2hhZG93OiAzcHggM3B4IDEycHggQHNoYWRvdy1jb2xvcjsNCi0gIGEgew0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICB9DQotfQ0KLQ0KLS8qIEVuZCBIb21lIE1lbnUgZm9yIElCIHNlY3Rpb24gKi8NCi0NCi0vKiBCZWdpbiBMb2dpbiBzY3JlZW5sZXQgKi8NCi0jbG9naW4tY29udGFpbmVyIHsNCi0gICNjb250ZW50LW1lc3NhZ2VzIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICB0b3A6IEBhcHAtYmFyLWhlaWdodDsNCi0gICAgYm9yZGVyLXJhZGl1czogNHB4Ow0KLSAgICB3aWR0aDogOTclOw0KLSAgICAmLmVycm9yTWVzc2FnZSB7DQotICAgICAgYmFja2dyb3VuZC1jb2xvciA6IEBjb2xvci1iYWNrZ3JvdW5kLWFsZXJ0ICFpbXBvcnRhbnQ7DQotICAgICAgY29sb3I6IEBjb2xvci1mb250LWFsZXJ0ICFpbXBvcnRhbnQ7DQotICAgICAgYm9yZGVyIDogc29saWQgMXB4IEBjb2xvci1ib3JkZXItYWxlcnQgIWltcG9ydGFudDsNCi0gICAgfQ0KLSAgICAmLmV2ZW50TWVzc2FnZSB7DQotICAgICAgYmFja2dyb3VuZC1jb2xvciA6IEBjb2xvci1iYWNrZ3JvdW5kLXN1Y2Nlc3MgIWltcG9ydGFudDsNCi0gICAgICBjb2xvcjogQGNvbG9yLWZvbnQtc3VjY2VzcyAhaW1wb3J0YW50Ow0KLSAgICAgIGJvcmRlciA6IHNvbGlkIDFweCBAY29sb3ItYm9yZGVyLXN1Y2Nlc3MgIWltcG9ydGFudDsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0jbG9naW5CYXIgew0KLSAgcG9zaXRpb246IGZpeGVkOw0KLSAgdG9wOjA7DQotICBsZWZ0OiAwOw0KLSAgd2lkdGg6IDEwMCU7DQotICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgc3BhbiB7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNXB4Ow0KLSAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA1cHg7DQotICAgIGZvbnQtc2l6ZTogMjVweDsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICB0b3A6IEBhcHAtYmFyLWhlaWdodCAtIDMycHg7DQotICAgIGxlZnQ6IDE1cHg7DQotICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAxMHB4Ow0KLSAgfQ0KLSAgI2NvbXBhbnktbG9nbyB7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIH0NCi19DQotDQotLmxvZ2luLXNjcmVlbmxldCB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCi0gIG1pbi13aWR0aDogMzAwcHg7DQotICBtYXgtd2lkdGg6IDUwZW07DQotICBib3JkZXItcmFkaXVzOiA4cHggIWltcG9ydGFudDsNCi0gIG1hcmdpbi10b3A6IDE1JTsNCi0gIGJveC1zaGFkb3c6IDNweCAzcHggMTJweCBAc2hhZG93LWNvbG9yOw0KLSAgLnNjcmVlbmxldC10aXRsZS1iYXIgew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7DQotICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICBtYXJnaW46MDsNCi0gICAgcGFkZGluZzowOw0KLSAgICBoM3sNCi0gICAgICBwYWRkaW5nLXRvcDoycHg7DQotICAgICAgcGFkZGluZy1ib3R0b206MnB4Ow0KLSAgICAgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLSAgICAgIGhlaWdodDogMTAwJTsNCi0gICAgICB3aWR0aDoxMDAlOw0KLSAgICAgIHRleHQtc2hhZG93OiBub25lOw0KLSAgICAgIGZvbnQtc2l6ZTogMjVweDsNCi0gICAgfQ0KLSAgfQ0KLSAgLnNjcmVlbmxldC1ib2R5IHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gICAgZm9ybSB7DQotICAgICAgLmJ1dHRvbiB7DQotICAgICAgICB3aWR0aDogMTUwcHg7DQotICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7DQotICAgICAgICBiYWNrZ3JvdW5kOiBub25lOw0KLSAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICAgICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgICAgICB0ZXh0LXNoYWRvdzogbm9uZTsNCi0gICAgICAgIG1hcmdpbi10b3A6IDIwcHg7DQotICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KLSAgICAgIH0NCi0NCi0gICAgICB0YWJsZSB7DQotICAgICAgICB0ciB7DQotICAgICAgICAgIHdpZHRoOiAxMDAlOw0KLSAgICAgICAgICAubGFiZWwgew0KLSAgICAgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gICAgICAgICAgICB3aWR0aDogMjUlOw0KLSAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpbnB1dCB7DQotICAgICAgICAgICAgd2lkdGg6IDEwMCU7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgLmJ1dHRvbnRleHQsDQotICAgICAgICAgIFt0eXBlPSJzdWJtaXQiXSB7DQotICAgICAgICAgICAgd2lkdGg6IDE1MHB4Ow0KLSAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCi0gICAgICAgICAgICBiYWNrZ3JvdW5kOiBub25lOw0KLSAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgICAgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgICAgICAgICB0ZXh0LXNoYWRvdzogbm9uZTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBbbmFtZT0iR0VUX1BBU1NXT1JEX0hJTlQiXSB7DQotICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgICAgICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICAgICAgICAgIGJvcmRlcjogbm9uZTsNCi0gICAgICAgICAgICB3aWR0aDogMTAwJTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBbbmFtZT0iRU1BSUxfUEFTU1dPUkQiXSB7DQotICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgICAgICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICAgICAgICAgIGJvcmRlcjogbm9uZTsNCi0gICAgICAgICAgICB3aWR0aDogMTAwJTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0ZCB7DQotICAgICAgICAgICAgcGFkZGluZzogNXB4Ow0KLSAgICAgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gICAgICAgICAgICBmb250LXNpemU6IDE1cHg7DQotICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gICAgYSB7DQotICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLS5sb2dpbi1zY3JlZW5sZXQgLnNjcmVlbmxldC10aXRsZS1iYXIgew0KLSAgdGV4dC1hbGlnbjogY2VudGVyOw0KLX0NCi0NCi0vKiBFbmQgTG9naW4gc2NyZWVubGV0ICovDQotDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgICBCZWdpbiBTY3JlZW5sZXQgc3R5bGUgICAgICAgICAgICAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLnNjcmVlbmxldC10aXRsZS1iYXIgew0KLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lIDsNCi0gIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBncmV5Ow0KLSAgaGVpZ2h0OiAxJTsgLyogSUUgZml4ICovDQotICBtaW4taGVpZ2h0OiAxLjVlbTsNCi0gIHBhZGRpbmc6MC44ZW0gMC4yZW07DQotfQ0KLQ0KLS5zY3JlZW5sZXQgew0KLSAgYm9yZGVyLXJhZGl1czogNXB4Ow0KLSAgYm9yZGVyOiBzb2xpZCAxcHggQGdyZXk7DQotICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsNCi0gIG1hcmdpbi1ib3R0b206IDFlbTsNCi0gIG92ZXJmbG93OiBhdXRvOw0KLX0NCi0NCi0uc2NyZWVubGV0LWJvZHkgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsNCi0gIGhlaWdodDogYXV0byAhaW1wb3J0YW50Ow0KLSAgaGVpZ2h0OiAxJTsNCi0gIHBhZGRpbmc6IDAuNGVtOw0KLX0NCi0NCi0uc2NyZWVubGV0LWJvZHkgZGl2IHsNCi0gIG1hcmdpbjogMC44ZW0gMC4xZW0NCi19DQotDQotLyogU3BlY2lhbCBTY3JlZW5sZXQgc3R5bGUgZm9yIGxvY2FsZSBhbmQgdGltZXpvbmUgd2luZG93ICovDQotLmxpc3RzLnNjcmVlbmxldCB7DQotICBtYXJnaW4tbGVmdDogMjUlOw0KLSAgbWFyZ2luLXJpZ2h0OiAyNSU7DQotICBtYXJnaW4tdG9wOiAxZW07DQotfQ0KLQ0KLS5saXN0cy5zY3JlZW5sZXQgLmJhc2ljLXRhYmxlIHRyIHRkIHsNCi0gIHRleHQtYWxpZ246IGNlbnRlcjsNCi19DQotDQotLmxpc3RzLnNjcmVlbmxldCAuYmFzaWMtdGFibGUgdHIgdGQgYSB7DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotLyogICAgICBBbHRlcm5hdGUgdGFibGUgaGVhZGVyIHN0eWxlICAgICAgKi8NCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCwNCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleWRhcms7DQotICBib3JkZXItYm90dG9tOiAwOw0KLSAgYm9yZGVyLWxlZnQ6IDAuMWVtIHNvbGlkICNhYWE7DQotICBib3JkZXItcmlnaHQ6IDAuMWVtIHNvbGlkICM4ODg7DQotICBjb2xvcjogI2ZmZmZmZjsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0vKiBObyBwYWRkaW5nIHNjcmVlbmxldCBkZWNvcmF0b3IgKi8NCi0ubm8tcGFkZGluZyB7DQotICBwYWRkaW5nOiAwOw0KLSAgYm9yZGVyOiBub25lOw0KLX0NCi0NCi0ubm8tcGFkZGluZyAuaDEsDQotLm5vLXBhZGRpbmcgLmgyLA0KLS5uby1wYWRkaW5nIC5oMywNCi0ubm8tcGFkZGluZ3IgaDEsDQotLm5vLXBhZGRpbmcgaDIsDQotLm5vLXBhZGRpbmcgaDMgew0KLSAgcGFkZGluZzogMC43ZW07DQotfQ0KLQ0KLS5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIGE6aG92ZXIgew0KLSAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICAgICAgRW5kIFNjcmVlbmxldCBzdHlsZSAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgIFRhYmxlIFN0eWxlcyAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS5iYXNpYy10YWJsZSB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOw0KLSAgY29sb3I6ICMwMDAwMDA7DQotICBtYXJnaW4tYm90dG9tOiAxZW07DQotICB3aWR0aDogMTAwJTsNCi19DQotDQotZm9ybSB0YWJsZSwNCi1mb3JtIC5iYXNpYy10YWJsZSwNCi0uc2NyZWVubGV0LWJvZHkgLmJhc2ljLXRhYmxlIHsNCi0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Ow0KLSAgbWFyZ2luLWJvdHRvbTogMDsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIHRkIHsNCi0gIC8qIFN0eWxlIGZvciBhbGwgY2VsbHMgKi8NCi0gIHBhZGRpbmc6IDAuOGVtIDAuMWVtOw0KLSAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIC5hbGlnbi1ib3R0b20gew0KLSAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIC5hbGlnbi10b3Agew0KLSAgdmVydGljYWwtYWxpZ246IHRvcDsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIC5sYWJlbCwNCi0uYmFzaWMtdGFibGUgdHIgLmdyb3VwLWxhYmVsIHsNCi0gIC8qIGZpZWxkIGxhYmVscyBmb3IgZm9ybXMgKi8NCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgdGV4dC1hbGlnbjogcmlnaHQ7DQotICBwYWRkaW5nLXJpZ2h0OiAxLjVlbTsNCi0gIHdoaXRlLXNwYWNlOiBub3dyYXA7DQotICB3aWR0aDogMSU7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSB0ciAuZ3JvdXAtbGFiZWwgew0KLSAgLyogImhlYWRlciIgZm9yIGZpZWxkIGxhYmVsIGdyb3VwcyAqLw0KLSAgZm9udC1zaXplOiAxLjJlbTsNCi0gIHBhZGRpbmc6IDJlbSAxLjVlbSAwIDA7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSB0ciB0aCwNCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgew0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICB0ZXh0LWFsaWduOiBsZWZ0Ow0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgdGQgew0KLSAgYm9yZGVyLWJvdHRvbTogMC4xZW0gc29saWQgIzAwMDAwMDsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93IHRkIGEgew0KLSAgY29sb3I6ICMwMDAwMDA7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvdyB7DQotICAvKiBBbHRlcm5hdGluZyByb3cgc3R5bGUgKi8NCi0gIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuc2VsZWN0ZWQgew0KLSAgYmFja2dyb3VuZDogI0ZGRkNDRjsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93U2VsZWN0ZWQgew0KLSAgYmFja2dyb3VuZDogI0ZGRjU1RjsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5WYWxpZGF0ZSB7DQotICAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLw0KLSAgYmFja2dyb3VuZDogI0EwRDVGNzsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93VmFsaWRhdGUgew0KLSAgLypTdHlsZSB1c2UgYnkgYWx0LXJvdy1zdHlsZSBvbiBsaXN0Ki8NCi0gIGJhY2tncm91bmQ6ICM3MkE4RjI7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuV2FybiB7DQotICAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLw0KLSAgYmFja2dyb3VuZDogI2Y1NUM1QzsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93V2FybiB7DQotICAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLw0KLSAgYmFja2dyb3VuZDogI0ZDNzQ1NTsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIHsNCi0gIC8qIGJ1dHRvbiBjb2x1bW4gc3R5bGUgLSBmb3IgdGhlIHNtYWxsDQotICBjb2xsZWN0aW9uIG9mIGJ1dHRvbnMgdXNlZCBpbiBsaXN0cyAqLw0KLSAgdmVydGljYWwtYWxpZ246IHRvcDsNCi0gIHBhZGRpbmc6IDAuM2VtOw0KLX0NCi0uYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgYSwNCi0uYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgYnV0dG9uLA0KLS5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBpbnB1dFt0eXBlPSJyZXNldCJdLA0KLS5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBpbnB1dFt0eXBlPSJzdWJtaXQiXSwNCi0uYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgaW5wdXRbdHlwZT0iYnV0dG9uIl0gew0KLSAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOw0KLSAgLW1vei1ib3JkZXItcmFkaXVzOiAxZW07DQotICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDFlbTsNCi0gIGJvcmRlci1yYWRpdXM6IDJweDsNCi0gIGJvcmRlcjogMC4xZW0gc29saWQgQG1haW4tY29sb3ItdGhlbWU7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICBjdXJzb3I6IHBvaW50ZXI7DQotICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBkaXNwbGF5OmlubGluZS1ibG9jazsNCi0gIGZvbnQtc2l6ZTogMC45ZW07DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIG91dGxpbmU6IDA7DQotICBvdmVyZmxvdzogdmlzaWJsZTsNCi0gIHBhZGRpbmc6IDAuMWVtIDAuNWVtIDAuMmVtIDAuNWVtOw0KLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLSAgd2lkdGg6IGF1dG87DQotDQotICAmOmhvdmVyIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIGNvbG9yOiBAd2hpdGU7DQotICB9DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuY29sbGFwc2VkIHsNCi0gIHZpc2liaWxpdHk6IGNvbGxhcHNlOw0KLX0NCi0NCi0vKiAgICAgIFNvcnQgZmllbGQgc3R5bGUgICAgICAqLw0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoIC5zb3J0LW9yZGVyLWFzYywNCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCAuc29ydC1vcmRlci1hc2N7DQotICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci11cC5wbmcpIG5vLXJlcGVhdCByaWdodDsNCi0gIHBhZGRpbmctbGVmdDogMC41ZW07DQotICBwYWRkaW5nLXJpZ2h0OiAyMHB4OyAvKiBTZXR0aW5nIG11c3QgYmUgaW4gcHggKi8NCi19DQotLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGggLnNvcnQtb3JkZXItZGVzYywNCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCAuc29ydC1vcmRlci1kZXNjew0KLSAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYXJyb3ctZ3ItZHcucG5nKSBuby1yZXBlYXQgcmlnaHQ7DQotICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KLSAgcGFkZGluZy1yaWdodDogMjBweDsgLyogU2V0dGluZyBtdXN0IGJlIGluIHB4ICovDQotfQ0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoIC5zb3J0LW9yZGVyLA0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIC5zb3J0LW9yZGVyew0KLSAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYXJyb3ctZ3IucG5nKSBuby1yZXBlYXQgcmlnaHQ7DQotICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KLSAgcGFkZGluZy1yaWdodDogMjBweDsgLyogU2V0dGluZyBtdXN0IGJlIGluIHB4ICovDQotICBjb2xvcjojZmZmDQotfQ0KLQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICAgICAgQmVnaW4gTWVzc2FnZSBJbmZvICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS5jb3VudC1tZXNzYWdlIHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICBtaW4taGVpZ2h0OjIwcHg7DQotICBtaW4td2lkdGg6IDIwcHg7DQotICBtYXgtaGVpZ2h0OjIwcHg7DQotICBtYXgtd2lkdGg6IDIwcHg7DQotICBiYWNrZ3JvdW5kOiBAd2hpdGU7DQotICBmb250LXNpemU6MTJweDsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgYm9yZGVyLXJhZGl1czogNTAlOw0KLX0NCi0uaW5mby1tZXNzYWdlLXRpdGxlIHsNCi0gIG1pbi13aWR0aDoxNTBweDsNCi0gIG1hcmdpbjogNXB4Ow0KLSAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgZm9udC1zaXplOiAxNnB4Ow0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLS5tZXNzYWdlLWxpc3Qgew0KLSAgcG9zaXRpb246cmVsYXRpdmU7DQotICBtYXJnaW4tdG9wOiAxMHB4Ow0KLSAgYm94LXNoYWRvdzogMXB4IDNweCA1cHggQGdyZXlkYXJrOw0KLSAgYm9yZGVyLXJhZGl1czogMCA1cHggNXB4IDA7DQotICB0cmFuc2l0aW9uOiBoZWlnaHQgMnM7DQotfQ0KLS5tZXNzYWdlLWxpc3QtbWFpbiB7DQotICBwYWRkaW5nOiA1cHggMTVweCA1cHggMTVweDsNCi19DQotLm1lc3NhZ2UtbGlzdC1hbGVydCB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3ItYWxlcnQ7DQotICBib3JkZXItbGVmdCA6IHNvbGlkIDVweCBAY29sb3ItYWxlcnQtZGFyazsNCi0gIC5jb3VudC1tZXNzYWdlIHsNCi0gICAgY29sb3I6IEBjb2xvci1hbGVydC1kYXJrOw0KLSAgfQ0KLX0NCi0ubWVzc2FnZS1saXN0LXN1Y2Nlc3Mgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLXN1Y2Nlc3M7DQotICBib3JkZXItbGVmdDogc29saWQgNXB4IEBjb2xvci1zdWNjZXNzLWRhcms7DQotICAuY291bnQtbWVzc2FnZSB7DQotICAgIGNvbG9yOiBAY29sb3Itc3VjY2Vzcy1kYXJrOw0KLSAgfQ0KLX0NCi0ubWVzc2FnZS1saXN0LXRhYmxlLWNvbnRhaW5lciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICBib3JkZXItcmFkaXVzOiA1cHg7DQotICBvdmVyZmxvdzogaGlkZGVuOw0KLSAgaGVpZ2h0OiAwOw0KLX0NCi0uaW5mby1tZXNzYWdlLXN1Y2Nlc3Mgew0KLSAgZGlzcGxheTogbm9uZTsNCi19DQotLmluZm8tbWVzc2FnZS1hbGVydCB7DQotICBkaXNwbGF5OiBub25lOw0KLX0NCi10YWJsZS5tc2ctbGlzdCB7DQotICB3aWR0aDogMTAwJTsNCi0gIGZvbnQtc2l6ZTogMTZweDsNCi0gIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gIHBhZGRpbmc6IDA7DQotICB0aGVhZCB7DQotICAgIGhlaWdodDogMTAwJTsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7DQotICAgIG1hcmdpbjogMDsNCi0gICAgcGFkZGluZzogMDsNCi0gICAgdHJ7DQotICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBibGFjazsNCi0gICAgICBoZWlnaHQ6IDEwMCU7DQotICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7DQotICAgICAgbGluZS1oZWlnaHQ6IDMwcHg7DQotICAgIH0NCi0gIH0NCi0gIHRib2R5IHsNCi0gICAgdHIgew0KLSAgICAgIGxpbmUtaGVpZ2h0OiAyNXB4Ow0KLSAgICB9DQotICAgIHRyLm1zZy1yb3ctc3VjY2VzcyB7DQotICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLXN1Y2Nlc3M7DQotICAgIH0NCi0gICAgdHIubXNnLXJvdy1hbGVydCB7DQotICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLWFsZXJ0Ow0KLSAgICB9DQotICB9DQotICB0ZCB7DQotICAgIHBhZGRpbmctbGVmdDogNXB4Ow0KLSAgfQ0KLX0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgIEVuZCAgTWVzc2FnZSBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgIFBhZ2luYXRlIFN0eWxlICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0ucGFnaW5hdGUtYmFyLW5yZCB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBmb250LXNpemU6IDE1cHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsNCi0gIHBhZGRpbmctbGVmdDogMTBweDsNCi0gIHBhZGRpbmctdG9wOiAzcHg7DQotICBwYWRkaW5nLWJvdHRvbTogM3B4Ow0KLSAgYm94LXNoYWRvdzogMCAycHggNXB4IEBzaGFkb3ctY29sb3I7DQotDQotICB1bC5wYWdpbmF0ZS1wZy1saXN0IHsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIG1hcmdpbi1yaWdodDogMTBweDsNCi0gICAgYm9yZGVyLXJhZGl1czogOHB4Ow0KLSAgICBib3JkZXI6IHNvbGlkIDFweCBAYm94LWJvcmRlci1jb2xvcjsNCi0gICAgaGVpZ2h0OiAxOHB4Ow0KLSAgICBsaSB7DQotICAgICAgZGlzcGxheTogZmxleDsNCi0gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgICBtaW4td2lkdGg6IDE3cHg7DQotICAgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggQGJveC1ib3JkZXItY29sb3I7DQotICAgICAgcGFkZGluZy1sZWZ0OiAycHg7DQotICAgICAgcGFkZGluZy1yaWdodDogMnB4Ow0KLSAgICAgIGhlaWdodDoxMDAlOw0KLSAgICAgIGEgew0KLSAgICAgICAgZGlzcGxheTogZmxleDsNCi0gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gICAgICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gICAgICAgIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gICAgICAgIGhlaWdodDogMTAwJTsNCi0gICAgICAgIHdpZHRoOiAxMDAlOw0KLSAgICAgIH0NCi0gICAgICAucGFnaW5hdGUtZGlzYWJsZSB7DQotDQotICAgICAgfQ0KLSAgICB9DQotICAgIGxpLnNlbGVjdGVkIHsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgICBhIHsNCi0gICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgbGk6Zmlyc3QtY2hpbGQsIGxpOmxhc3QtY2hpbGQgew0KLSAgICAgIHdpZHRoOiAyMHB4Ow0KLSAgICB9DQotICAgIGxpOmZpcnN0LWNoaWxkIHsNCi0gICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAzcHg7DQotICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4Ow0KLSAgICB9DQotICAgIGxpOmxhc3QtY2hpbGQgew0KLSAgICAgIGJvcmRlci1yaWdodDogbm9uZTsNCi0gICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4Ow0KLSAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7DQotICAgIH0NCi0gIH0NCi0NCi19DQotc2VsZWN0LnBhZ2luYXRlLXNlbGVjdCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBiYWNrZ3JvdW5kOiBAd2hpdGU7DQotICBmb250LXNpemU6IDE2cHg7DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIGJvcmRlcjogMXB4IHNvbGlkIEBib3gtYm9yZGVyLWNvbG9yOw0KLSAgb3B0aW9uIHsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAganVzdGlmeS1zZWxmOiBjZW50ZXI7DQotICAgIGZvbnQtc2l6ZTogMTRweDsNCi0gIH0NCi19DQotDQotLnBhZ2luYXRlLXNlbGVjdC1sYWJlbCB7DQotICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7DQotICBmb250LXNpemU6IDE2cHg7DQotICBwYWRkaW5nLWxlZnQ6IDE1cHg7DQotICBwYWRkaW5nLXJpZ2h0OiAxNXB4Ow0KLX0NCi0NCi0ucGFnaW5hdGUtaW5mb3JtYXRpb24gew0KLSAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgZm9udC1zaXplOiAxNnB4Ow0KLSAgcGFkZGluZy1sZWZ0OiAxNXB4Ow0KLSAgcGFkZGluZy1yaWdodDogMTVweDsNCi19DQotDQotdWwucGFnaW5hdGUtcGctbGlzdCBsaTpob3ZlcnsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgYSB7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgfQ0KLX0NCi0NCi0vKiBFbmQgb2YgUGFnaW5hdGUgU3R5bGUgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgIExpc3QgTmF2aWdhdGlvbiBTdHlsZSAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS5uYXYtcGFnZXIgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXlkYXJrOw0KLSAgY29sb3I6IEB3aGl0ZTsNCi0gIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gIGZvbnQtc2l6ZTogOXB4Ow0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBsaW5lLWhlaWdodDogMy41ZW07DQotICBoZWlnaHQ6IDMuNWVtOw0KLSAgbWFyZ2luOiAwLjVlbSAwIDAuNWVtIDA7DQotICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsNCi19DQotDQotLm5hdi1wYWdlciB1bCB7DQotICBkaXNwbGF5OiBpbmxpbmU7IC8qIElFIEZpeCAqLw0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIGxpIHsNCi0gIGZsb2F0OmxlZnQ7DQotICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIGxpIGEgew0KLSAgZGlzcGxheTogYmxvY2s7DQotfQ0KLQ0KLS5uYXYtcGFnZXIgdWwgYSB7DQotICBjb2xvcjogQHdoaXRlOw0KLSAgcGFkZGluZzogMCAxZW0gMCAxZW07DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLS5uYXYtcGFnZXIgdWwgYTpob3ZlciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi19DQotDQotLm5hdi1wYWdlciB1bCAubmF2LXBhZ2VzaXplLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1wYWdlLXNlbGVjdCwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtZGlzcGxheWluZyB7DQotICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsNCi19DQotDQotLm5hdi1wYWdlciB1bCAubmF2LWZpcnN0LWRpc2FibGVkLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1wcmV2aW91cy1kaXNhYmxlZCwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbmV4dC1kaXNhYmxlZCwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbGFzdC1kaXNhYmxlZCB7DQotICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsNCi19DQotDQotLm5hdi1wYWdlciB1bCAubmF2LWZpcnN0LWRpc2FibGVkOmhvdmVyLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1wcmV2aW91cy1kaXNhYmxlZDpob3ZlciwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbmV4dC1kaXNhYmxlZDpob3ZlciwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbGFzdC1kaXNhYmxlZDpob3ZlciB7DQotICBjdXJzb3I6IG5vdC1hbGxvd2VkOw0KLX0NCi0NCi0NCi0ubmF2LXBhZ2VyIHVsIC5uYXYtZGlzcGxheWluZyB7DQotICBib3JkZXItcmlnaHQ6IG5vbmU7DQotfQ0KLQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgTXVsdGktQ29sdW1uIFN0eWxlcyAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIHsNCi0gIG1hcmdpbjogYXV0bzsNCi0gIHBhZGRpbmc6IDFlbTsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIG1pbi13aWR0aDogQG1pbi1jb250YWluZXItd2lkdGg7DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIGgxLA0KLSNjb2x1bW4tY29udGFpbmVyIC5oMSwNCi0jY29sdW1uLWNvbnRhaW5lciBoMiwNCi0jY29sdW1uLWNvbnRhaW5lciAuaDIgew0KLSAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIGgxLA0KLSNjb2x1bW4tY29udGFpbmVyIC5oMSB7DQotICBjb2xvcjogIzU1Nzk5NjsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLmxlZnQgew0KLSAgZmxvYXQ6IGxlZnQ7DQotICAvKiBhbHQ6IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwcHg7IGxlZnQ6IDBweDsgKi8NCi0gIHdpZHRoOiAyMmVtOw0KLSAgbWFyZ2luLXJpZ2h0OiAxZW07DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5sZWZ0LWxhcmdlciB7DQotICBmbG9hdDogbGVmdDsNCi0gIC8qIGFsdDogcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyAqLw0KLSAgd2lkdGg6IDI1ZW07DQotICBtYXJnaW4tcmlnaHQ6IDFlbTsNCi19DQotDQotLmxlZnRoYWxmIHsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgaGVpZ2h0OiAxJTsNCi0gIGxlZnQ6IDA7DQotICBtYXJnaW46IDAlIDElIDElIDAlOw0KLSAgd2lkdGg6IDQ5JTsNCi19DQotDQotLnJpZ2h0aGFsZiB7DQotICBmbG9hdDogcmlnaHQ7DQotICBoZWlnaHQ6IDElOw0KLSAgbWFyZ2luOiAwIDAgMSUgMSU7DQotICByaWdodDogMDsNCi0gIHdpZHRoOiA0OSU7DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5yaWdodCB7DQotICBmbG9hdDogcmlnaHQ7DQotICBtYXJnaW4tbGVmdDogMWVtOw0KLSAgd2lkdGg6IDIyZW07DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5sZWZ0b25seSB7DQotICBtYXJnaW4tbGVmdDogMjNlbTsNCi0gIHdpZHRoOiBhdXRvOw0KLX0NCi0NCi0jY29sdW1uLWNvbnRhaW5lciAubGVmdG9ubHktbGFyZ2VyIHsNCi0gIG1hcmdpbi1sZWZ0OiAyNmVtOw0KLSAgd2lkdGg6IGF1dG87DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5yaWdodG9ubHkgew0KLSAgbWFyZ2luLXJpZ2h0OiAyM2VtOw0KLSAgd2lkdGg6IGF1dG87DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5jZW50ZXIgew0KLSAgbWFyZ2luLWxlZnQ6IDIzZW07DQotICBtYXJnaW4tcmlnaHQ6IDIzZW07DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLm5vY29sdW1ucyB7DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICAgICAgQnV0dG9uIFN0eWxlICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLmJ1dHRvbi1iYXIgbGkuYnV0dG9udGV4dCBhLA0KLWEuYnV0dG9udGV4dCwNCi1hLmJ1dHRvbnRleHRiaWcsDQotLnNtYWxsU3VibWl0LA0KLS5zbWFsbFN1Ym1pdDpob3ZlciwNCi0ubWVkaXVtU3VibWl0LA0KLS5sYXJnZVN1Ym1pdCwNCi0ubG9naW5CdXR0b24sDQotLmJ1dHRvbi1zdHlsZS0xIGEsDQotLmJ1dHRvbi1zdHlsZS0xIHVsIGEsDQotLmJ1dHRvbi1zdHlsZS0yIHVsIGEsDQotLmJ1dHRvbi1zdHlsZS0yIGEsDQotLmJ1dHRvbiwNCi1idXR0b24sDQotaW5wdXRbdHlwZT0icmVzZXQiXSwNCi1pbnB1dFt0eXBlPSJzdWJtaXQiXSwNCi1pbnB1dFt0eXBlPSJidXR0b24iXSB7DQotICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7DQotICAtbW96LWJvcmRlci1yYWRpdXM6IDEuMWVtOw0KLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxLjFlbTsNCi0gIGJvcmRlci1yYWRpdXM6IDJweDsNCi0gIGJvcmRlcjogMC4xZW0gc29saWQgQG1haW4tY29sb3ItdGhlbWU7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICBjdXJzb3I6IHBvaW50ZXI7DQotICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBkaXNwbGF5OmlubGluZS1ibG9jazsNCi0gIGZvbnQtc2l6ZTogMWVtOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBvdXRsaW5lOiAwOw0KLSAgb3ZlcmZsb3c6IHZpc2libGU7DQotICBwYWRkaW5nOiAwLjRlbSAxZW0gMC40ZW07DQotICB0ZXh0LWRlY29yYXRpb246bm9uZTsNCi0gIC8qdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyovDQotICB3aWR0aDogYXV0bzsNCi0NCi0gIC8qIElFNyAqLw0KLSAgKnBhZGRpbmctdG9wOiAwLjJlbTsNCi0gICpwYWRkaW5nLWJvdHRvbTogMDsNCi0gICY6aG92ZXIgew0KLSAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgfQ0KLX0NCi0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgICBGb290ZXIgU3R5bGUgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0jZm9vdGVyIHsNCi0gIGJhY2tncm91bmQ6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgYm9yZGVyLXRvcDogMC4xZW0gaW5zZXQgIzAwMDsNCi0gIHBhZGRpbmc6IDAuNWVtIDAgMC41ZW0gMC41ZW07DQotDQotICBoZWlnaHQ6IEBmb290ZXItaGVpZ2h0Ow0KLSAgcG9zaXRpb246IGZpeGVkOw0KLSAgYm90dG9tOiAwOw0KLSAgd2lkdGg6IDEwMCU7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQotICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWYgIWltcG9ydGFudDsNCi0gIHotaW5kZXg6IDEwOw0KLQ0KLSAgc3BhbiB7DQotICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgcGFkZGluZzogMTBweDsNCi0gIH0NCi0NCi0gIGEgew0KLSAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICB9DQotfQ0KLQ0KLSNmb290ZXIgYTpmb2N1cyB7DQotICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCi19DQotDQotI2Zvb3Rlci1vZmZzZXQgew0KLSAgaGVpZ2h0OiBAZm9vdGVyLWhlaWdodCArIDEwcHg7DQotICB3aWR0aDogMTAwJTsNCi19DQorLyogY29tbW9uIGNvbG9ycyAqLworQGJsYWNrOiAjMDAwOworQHdoaXRlOiAjZmZmOworQGdyZXk6ICNlNmU2ZTY7CitAZ3JleWRhcms6ICM5MjkyOTI7CisKK0Bjb2xvci1zdWNjZXNzOiAjOGNmZjhjOworQGZvbnQtY29sb3ItZm9yLXN1Y2Nlc3M6IEBibGFjazsKK0Bjb2xvci1hbGVydDogI2ZmOGM4YzsKK0Bmb250LWNvbG9yLWZvci1hbGVydDogQGJsYWNrOworCitAY29sb3Itc3VjY2Vzcy1kYXJrOiAjMzU2ZTM1OworQGZvbnQtY29sb3ItZm9yLXN1Y2Nlc3M6IEBibGFjazsKK0Bjb2xvci1hbGVydC1kYXJrOiAjOTMyZjMzOworQGZvbnQtY29sb3ItZm9yLWFsZXJ0OiBAYmxhY2s7CisKK0Bjb2xvci1iYWNrZ3JvdW5kLWFsZXJ0OiAjZjJkZWRlOworQGNvbG9yLWZvbnQtYWxlcnQ6ICNhOTQ0NDI7CitAY29sb3ItYm9yZGVyLWFsZXJ0OiAjZWJjY2QxOworCitAY29sb3ItYmFja2dyb3VuZC1zdWNjZXNzOiAjZGZmMGQ4OworQGNvbG9yLWZvbnQtc3VjY2VzczogIzNjNzYzZDsKK0Bjb2xvci1ib3JkZXItc3VjY2VzczogI2Q2ZTljNjsKKworLyogU2FwaGlyIGNvbG9ycyAqLworQGJsdWUtZGFyazogIzAwMjMzMzsKK0BibHVlLW1haW46ICMwMDU5ODI7CitAYmx1ZS1tZWRpdW06ICNjN2RmZmY7CitAYmx1ZS1saWdodDogI2YxZjdmZjsKK0BibHVlLWxpZ2h0MjogI2U0ZjBmNTsKKworLyogUnVieSBjb2xvcnMgKi8KK0ByZWQtZGFyazogIzQyMDAwMDsKK0ByZWQtbWFpbjogI2JmMTYxNjsKK0ByZWQtbWVkaXVtOiAjZjdiYWJhOworQHJlZC1saWdodDogI2ZjZTdlNzsKK0ByZWQtbGlnaHQyOiAjZmVkN2M5OworCisvKiBFbWVyYWxkIGNvbG9ycyAqLworQGdyZWVuLWRhcms6ICMxOTc5NDg7CitAZ3JlZW4tbWFpbjogIzIzYWY5YjsKK0BncmVlbi1tZWRpdW06ICM3YWUzYWQ7CitAZ3JlZW4tbGlnaHQ6ICNlNWY5ZWY7CitAZ3JlZW4tbGlnaHQyOiAjZDdmOWVmOworCisvKiBBbWJlciBjb2xvcnMgKi8KK0BhbWJlci1kYXJrOiAjYmM0MjE2OworQGFtYmVyLW1haW46ICNmMDg5MDY7CitAYW1iZXItbWVkaXVtOiAjZjVjNGIzOworQGFtYmVyLWxpZ2h0OiAjZmNlZGU4OworQGFtYmVyLWxpZ2h0MjogI2ZjZWRjZDsKKworLyogU2FwaGlyIHRoZW1lICovCisvKgorQG1haW4tY29sb3ItdGhlbWUgOiBAYmx1ZS1tYWluOworQGRhcmstY29sb3ItdGhlbWUgOiBAYmx1ZS1kYXJrOworQG1lZGl1bS1jb2xvci10aGVtZSA6IEBibHVlLW1lZGl1bTsKK0BsaWdodC1jb2xvci10aGVtZSA6IEBibHVlLWxpZ2h0OworQGxpZ2h0Mi1jb2xvci10aGVtZSA6IEBibHVlLWxpZ2h0MjsKK0Bmb250LWNvbG9yLWZvci1kYXJrIDogQGdyZXk7CitAZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsKK0Bmb250LWNvbG9yLWZvci1tZWRpdW0gOiBAZGFyay1jb2xvci10aGVtZTsKK0Bmb250LWNvbG9yLWZvci1saWdodCA6IEBkYXJrLWNvbG9yLXRoZW1lOworQHNoYWRvdy1jb2xvciA6IEBibGFjazsKK0BzaGFkb3ctY29sb3ItbGlnaHQgOiBAZ3JleWRhcms7CisqLworCisvKiBSdWJ5IHRoZW1lICovCisvKgorQG1haW4tY29sb3ItdGhlbWUgOiBAcmVkLW1haW47CitAZGFyay1jb2xvci10aGVtZSA6IEByZWQtZGFyazsKK0BtZWRpdW0tY29sb3ItdGhlbWUgOiBAcmVkLW1lZGl1bTsKK0BsaWdodC1jb2xvci10aGVtZSA6IEByZWQtbGlnaHQ7CitAbGlnaHQyLWNvbG9yLXRoZW1lIDogQHJlZC1saWdodDI7CitAZm9udC1jb2xvci1mb3ItZGFyayA6IEBncmV5OworQGZvbnQtY29sb3ItZm9yLW1haW4gOiBAd2hpdGU7CitAZm9udC1jb2xvci1mb3ItbWVkaXVtIDogQGRhcmstY29sb3ItdGhlbWU7CitAZm9udC1jb2xvci1mb3ItbGlnaHQgOiBAZGFyay1jb2xvci10aGVtZTsKK0BzaGFkb3ctY29sb3IgOiBAYmxhY2s7CitAc2hhZG93LWNvbG9yLWxpZ2h0IDogQGdyZXlkYXJrOworLyoKKworLyogRW1lcmFsZCB0aGVtZSAqLworQG1haW4tY29sb3ItdGhlbWUgOiBAZ3JlZW4tbWFpbjsKK0BkYXJrLWNvbG9yLXRoZW1lIDogQGdyZWVuLWRhcms7CitAbWVkaXVtLWNvbG9yLXRoZW1lIDogQGdyZWVuLW1lZGl1bTsKK0BsaWdodC1jb2xvci10aGVtZSA6IEBncmVlbi1saWdodDsKK0BsaWdodDItY29sb3ItdGhlbWUgOiBAZ3JlZW4tbGlnaHQyOworQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAd2hpdGU7CitAZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsKK0Bmb250LWNvbG9yLWZvci1tZWRpdW0gOiBAZGFyay1jb2xvci10aGVtZTsKK0Bmb250LWNvbG9yLWZvci1saWdodCA6IEBkYXJrLWNvbG9yLXRoZW1lOworQHNoYWRvdy1jb2xvciA6IEBibGFjazsKK0BzaGFkb3ctY29sb3ItbGlnaHQgOiBAZ3JleWRhcms7CisKKy8qIEFtYmVyIHRoZW1lICovCisvKgorQG1haW4tY29sb3ItdGhlbWUgOiBAYW1iZXItbWFpbjsKK0BkYXJrLWNvbG9yLXRoZW1lIDogQGFtYmVyLWRhcms7CitAbWVkaXVtLWNvbG9yLXRoZW1lIDogQGFtYmVyLW1lZGl1bTsKK0BsaWdodC1jb2xvci10aGVtZSA6IEBhbWJlci1saWdodDsKK0BsaWdodDItY29sb3ItdGhlbWUgOiBAYW1iZXItbGlnaHQyOworQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAd2hpdGU7CitAZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsKK0Bmb250LWNvbG9yLWZvci1tZWRpdW0gOiBAZGFyay1jb2xvci10aGVtZTsKK0Bmb250LWNvbG9yLWZvci1saWdodCA6IEBkYXJrLWNvbG9yLXRoZW1lOworQHNoYWRvdy1jb2xvciA6IEBibGFjazsKK0BzaGFkb3ctY29sb3ItbGlnaHQgOiBAZ3JleWRhcms7CisqLworCisKK0BhcHAtYmFyLWhlaWdodDogNjBweDsKK0BzdWItYXBwLWJhci1oZWlnaHQ6IDQwcHg7CitAZm9vdGVyLWhlaWdodDogMjBweDsKK0Bob21lLWJ0bi13aWR0aDogNDdweDsKK0Bjb2xvci1saW5lLWhlaWdodDogOXB4OworCitAaG9tZS1tZW51LXRpbGUtaGVpZ2h0OiA4MHB4OworQGhvbWUtbWVudS10aWxlLW1pbi13aWR0aDogMTAwcHg7CitAaG9tZS1tZW51LXRpbGUtbWF4LXdpZHRoOiAxMDBweDsKKworQHRoaXJkLWx2bC1oZWlnaHQ6IDgwcHg7CitAdGhpcmQtbHZsLXdpZHRoIDogMTAwcHg7CitAbWluLXNjcmVlbiA6IDExNzBweDsKK0BtaW4tY29udGFpbmVyLXdpZHRoOiAxMTMwcHg7CisKK0Bib3gtYm9yZGVyLWNvbG9yOiAjZDdkN2Q3OworCitAZm9udC1mYWNlIHsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBzcmM6IHVybCgnZm9udHMvcXVpY2tzYW5kL3F1aWNrc2FuZGJvbGQub3RmJyk7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIGZvbnQtc3R5bGU6IG5vcm1hbDsKK30KKworQGZvbnQtZmFjZSB7CisgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsKKyAgc3JjOiB1cmwoJ2ZvbnRzL3F1aWNrc2FuZC9xdWlja3NhbmRib2xkLm90ZicpOworICBmb250LXdlaWdodDogYm9sZDsKKyAgZm9udC1zdHlsZTogbm9ybWFsOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBCZWdpbiBzcGVjaWFsIGNoZWNrYm94IHR5cGUgc3dpdGNoICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1t0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLWNoa2JveCwgW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94IHsKKyAgZGlzcGxheTogbm9uZTsKK30KKworW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtY2hrYm94ICsgbGFiZWwsCitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1jaGtib3ggKyBsYWJlbHsKKyAgY3Vyc29yOiBwb2ludGVyOworfQorW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtY2hrYm94ICsgbGFiZWw6YmVmb3JlLAorW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94ICsgbGFiZWw6YmVmb3JleworICBjb250ZW50OiAiIjsKKyAgd2lkdGg6IDE1MHB4OworICBtaW4td2lkdGg6IDE1MHB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQtY29sb3ItdGhlbWU7CisgIHBhZGRpbmc6IDJweCAyMHB4IDJweCAyMHB4OworICBib3JkZXItcmFkaXVzOiA4cHggOHB4IDhweCA4cHg7CisKKyAgY3Vyc29yOiBwb2ludGVyOworfQorCitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1jaGtib3ggKyBsYWJlbDphZnRlciwKK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCArIGxhYmVsOmFmdGVyeworICBjb250ZW50OiAiIjsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBsZWZ0Oi0zNXB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgbWluLWhlaWdodDogMTBweDsKKyAgbWluLXdpZHRoOiAxMHB4OworICBwYWRkaW5nLWxlZnQ6IDRweDsKKyAgcGFkZGluZy1yaWdodDogNXB4OworICBib3JkZXItcmFkaXVzOiA4cHggOHB4IDhweCA4cHg7CisgIHRyYW5zaXRpb246IGFsbCAuMnM7Cit9CisKK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCArIGxhYmVsOmFmdGVyeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGxlZnQ6IC0xNXB4OworICB0cmFuc2l0aW9uOiBhbGwgLjJzOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRW5kIHNwZWNpYWwgY2hlY2tib3ggdHlwZSBzd2l0Y2ggKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogIEJlZ2luIHNxdWFyZSBDaGVja2JveCAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94LAorW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiAtOTk5OXB4OworfQorCitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWwsCitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWx7CisgIGNvbnRlbnQ6ICcnOworICBwYWRkaW5nLWxlZnQ6IDM1cHg7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgY3Vyc29yOiBwb2ludGVyOworICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogMTJweDsKKworfQorW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmJlZm9yZSwKK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDpiZWZvcmV7CisgIGNvbnRlbnQ6ICcnOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6MTBweDsKKyAgdG9wOiAtNHB4OworICB3aWR0aDogMTdweDsKKyAgaGVpZ2h0OiAxN3B4OyAvKiBkaW0uIGRlIGxhIGNhc2UgKi8KKyAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKKyAgYmFja2dyb3VuZDogQGxpZ2h0LWNvbG9yLXRoZW1lOworICBib3JkZXItcmFkaXVzOiAycHg7Cit9CisKK1t0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDpiZWZvcmUgeworICBiYWNrZ3JvdW5kOiBAbGlnaHQtY29sb3ItdGhlbWU7Cit9CitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YmVmb3JleworICBiYWNrZ3JvdW5kOiBAbWFpbi1jb2xvci10aGVtZTsKK30KKworW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyLAorW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyeworICBjb250ZW50OiAn4pyUJzsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IC00cHg7CisgIGxlZnQ6IDE0cHg7CisgIGZvbnQtc2l6ZTogMTZweDsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICB0cmFuc2l0aW9uOiBhbGwgLjJzOworfQorW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyIHsKKyAgb3BhY2l0eTogMDsKKyAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKK30KK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDphZnRlciB7CisgIG9wYWNpdHk6IDE7CisgIHRyYW5zZm9ybTogc2NhbGUoMSk7Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogIEVuZCBzcXVhcmUgQ2hlY2tib3ggICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgQmVnaW4gY2xhc3MgY29udGVudCBtZ210ICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisuZmxleC1yb3cgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogcm93ICFpbXBvcnRhbnQ7Cit9CisuZmxleC1jb2x1bW4geworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworfQorCisuY29sLXdpZHRoLTEgeworICB3aWR0aDogMTAlOworfQorLmNvbC13aWR0aC0yIHsKKyAgd2lkdGg6IDIwJTsKK30KKy5jb2wtd2lkdGgtMyB7CisgIHdpZHRoOiAzMCU7Cit9CisuY29sLXdpZHRoLTQgeworICB3aWR0aDogNDAlOworfQorLmNvbC13aWR0aC01IHsKKyAgd2lkdGg6IDUwJTsKK30KKy5jb2wtd2lkdGgtNiB7CisgIHdpZHRoOiA2MCU7Cit9CisuY29sLXdpZHRoLTcgeworICB3aWR0aDogNzAlOworfQorLmNvbC13aWR0aC04IHsKKyAgd2lkdGg6IDgwJTsKK30KKy5jb2wtd2lkdGgtOSB7CisgIHdpZHRoOiA5MCU7Cit9CisuY29sLXdpZHRoLTEwIHsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKy5hbGlnbi12LWNlbnRlciB7CisgIGRpc3BsYXk6ZmxleDsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKK30KKworLmFsaWduLWgtY2VudGVyIHsKKyAgZGlzcGxheTpmbGV4OworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgIEVuZCBjbGFzcyBjb250ZW50IG1nbXQgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBCZWdpbiBidG4tc29ydCAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy5idG4tc29ydCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgdG9wOiAtNnB4OworICBib3JkZXI6bm9uZTsKKyAgYmFja2dyb3VuZDpub25lOworICBib3JkZXItcmFkaXVzOiAwOworICBtYXJnaW4tbGVmdDo1cHg7Cit9CisKKy5idG4tc29ydDpiZWZvcmV7CisgIGNvbnRlbnQ6ICcnOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IC0xcHg7CisgIHdpZHRoOiAwOworICBoZWlnaHQ6IDA7CisgIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCBAZ3JleWRhcms7CisgIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50OworfQorCisuYnRuLXNvcnQ6YWZ0ZXJ7CisgIGNvbnRlbnQ6ICcnOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAtMXB4OworICB3aWR0aDogMDsKKyAgaGVpZ2h0OiAwOworICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CisgIGJvcmRlci10b3A6IDEwcHggc29saWQgQGdyZXlkYXJrOworICBib3JkZXItbGVmdDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTM0OXB4KSB7CisgICAgcmlnaHQ6IC01cHg7CisgIH0KK30KKworLmJ0bi1zb3J0LmJ0bi1zb3J0LWFzYzpiZWZvcmV7CisgIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgQG1haW4tY29sb3ItdGhlbWU7Cit9CisKKy5idG4tc29ydC5idG4tc29ydC1kZXNjOmFmdGVyeworICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRW5kIGJ0bi1zb3J0ICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBCZWdpbiBkZWZhdXQgY29sb3VyIGNsYXNzICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLmRhcmstY29sb3IgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcmsgIWltcG9ydGFudDsKK30KKy5tYWluLWNvbG9yIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluICFpbXBvcnRhbnQ7Cit9CisubWVkaXVtLWNvbG9yIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1lZGl1bS1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1lZGl1bSAhaW1wb3J0YW50OworfQorLmxpZ2h0LWNvbG9yIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbGlnaHQgIWltcG9ydGFudDsKK30KKy5saWdodDItY29sb3IgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQyLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbGlnaHQgIWltcG9ydGFudDsKK30KKworLmdyZXktY29sb3IgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleSAhaW1wb3J0YW50OworfQorLmRhcmtncmV5LWNvbG9yIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXlkYXJrICFpbXBvcnRhbnQ7Cit9CisKKy8qIGJlZ2luIGxvb2t1cCB3aWRnZXQgKi8KKy51aS1kaWFsb2cgeworICBvcGFjaXR5OiAxOworICB6LWluZGV4OiA1MDsKK30KKworLnVpLWRpYWxvZy10aXRsZWJhci51aS13aWRnZXQtaGVhZGVyLnVpLWNvcm5lci1hbGwudWktaGVscGVyLWNsZWFyZml4IHsKKyAgYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICBidXR0b24geworICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lOworICB9Cit9CisvKiBlbmQgbG9va3VwIHdpZGdldCAqLworCisubWFpbi1iYXItbGFiZWwgeworICBjb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lOworICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgcGFkZGluZy1yaWdodDogNnB4OworICBmb250LXNpemU6IDE1cHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisjY29tcGFueS1sb2dvIHsKKyAgcmlnaHQ6IDEwcHg7CisgIHRvcDogMnB4OworICBiYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9vZmJpei1zaW1wbGUtd2hpdGUuc3ZnIikgbm8tcmVwZWF0IGxlZnQgdG9wIC8gY292ZXI7CisgIG1pbi1oZWlnaHQ6IDUwcHg7CisgIG1pbi13aWR0aDogNTBweDsKKyAgbWFyZ2luLXJpZ2h0OiAxNXB4OworICBhbGlnbi1zZWxmOiBjZW50ZXI7CisgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGggOiAxMjMycHgpIHsKKyAgICBtaW4taGVpZ2h0OiA1MHB4OworICAgIG1pbi13aWR0aDogMTI5cHg7CisgICAgYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvb2ZiaXotd2hpdGUuc3ZnIikgbm8tcmVwZWF0IGxlZnQgdG9wIC8gY292ZXI7CisgIH0KK30KKworLm1vZGFsLXNjcmVlbiB7CisgIHZpc2liaWxpdHk6IGhpZGRlbjsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7CisgIG9wYWNpdHk6IC45MzsKKyAgcG9zaXRpb246IGZpeGVkOworICB0b3A6IDA7CisgIGxlZnQ6IDA7CisgIGhlaWdodDogMTAwJTsKKyAgd2lkdGg6IDEwMCU7CisgIHotaW5kZXg6IDk5OTk7Cit9CisKKy5tb2RhbC1ib3h7CisgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgb3BhY2l0eTogMTsKKyAgbWFyZ2luOiAxMCU7CisgIGJvcmRlci1yYWRpdXM6IDEwcHg7CisgIGJvcmRlcjogc29saWQgMnB4IEBtYWluLWNvbG9yLXRoZW1lOworICBwYWRkaW5nIDogMTBweCA0MHB4IDEwcHggNDBweDsKKyAgLm1vZGFsLWhlYWRlciB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgICBoMiB7CisgICAgICBmb250LXNpemU6IDI1cHg7CisgICAgICBmb250LXdlaWdodDogbm9ybWFsOworICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIH0KKyAgICAuYnRuLWNsb3NlLW5yZCB7CisgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICByaWdodDogMDsKKyAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICAgIGJvcmRlcjogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgYm9yZGVyLXJhZGl1czogNXB4OworICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgZm9udC1zaXplOiAyNXB4OworICAgICAgaGVpZ2h0OiAzMHB4OworICAgICAgd2lkdGg6IDMwcHg7CisgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKKyAgICB9CisgIH0KKyAgLm1vZGFsLWJvZHkgeworICAgIHAgeworICAgICAgZm9udC1zaXplOiAyMHB4OworICAgIH0KKyAgfQorICAubW9kYWwtZm9vdGVyIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgaGVpZ2h0OiAzNXB4OworICAgIGRpc3BsYXk6IGZsZXg7CisgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKKyAgICAuYnRuLW5yZCB7CisgICAgICBiYWNrZ3JvdW5kOiBub25lOworICAgICAgYm9yZGVyOiBub25lOworICAgICAgdGV4dC1zaGFkb3c6IG5vbmU7CisgICAgICBvcGFjaXR5OiAxOworICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OworICAgICAgZm9udC1zaXplOiAyMHB4OworICAgICAgcGFkZGluZzogNXB4OworICAgICAgYm9yZGVyLXJhZGl1czogOHB4OworICAgIH0KKyAgICAuYnRuLW5yZC1tYWluIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgY29sb3I6IEB3aGl0ZTsKKyAgICB9CisgICAgLmJ0bi1ucmQtc3RkIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICAgIGJvcmRlcjogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgICAgfQorICB9Cit9CisuYnRuLW5yZDpob3ZlciB7CisgIGJveC1zaGFkb3c6IDVweCA1cHggM3B4IDAgQGJsYWNrOworfQorCisuYnRuLW5yZC1zdGQ6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICBjb2xvcjogQHdoaXRlICFpbXBvcnRhbnQ7CisgIGJvcmRlcjogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7Cit9CisKKy5idG4tY2xvc2UtbnJkOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgY29sb3I6IEB3aGl0ZSAhaW1wb3J0YW50OworfQorCisubGlzdC1ucmQgeworICBib3JkZXI6IHNvbGlkIDJweCBAbWFpbi1jb2xvci10aGVtZTsKKyAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMTBweDsKKyAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDEwcHg7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgIG1hcmdpbi10b3A6IDE1cHg7CisgIG1hcmdpbi1ib3R0b206IDE1cHg7CisgIC50aXRsZS1saXN0LW5yZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgY29sb3IgOiBAd2hpdGU7CisgICAgZm9udC1zaXplOiAyMHB4OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHBhZGRpbmctbGVmdDogNXB4OworICB9CisKKyAgbGkgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgICAgZm9udC1zaXplOiAyMHB4OworICAgIHBhZGRpbmctbGVmdDogNXB4OworICAgIHBhZGRpbmctdG9wOiAycHg7CisgICAgcGFkZGluZy1ib3R0b206IDJweDsKKyAgICBtYXJnaW4tYm90dG9tOiAzcHg7CisgICAgYSB7CisgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgfQorICAgIHNwYW4geworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgcmlnaHQ6IDA7CisgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgICBmb250LXNpemU6IDMwcHg7CisgICAgfQorICB9Cit9CitsaS5saW5lLW9kZCB7CisgIGJhY2tncm91bmQtY29sb3I6IEBsaWdodC1jb2xvci10aGVtZTsKK30KKworI3VzZXItYXZhdGFyIHsKKyAgaGVpZ2h0OiA0MHB4OworICB3aWR0aDogNDBweDsKKyAgcGFkZGluZzogMnB4OworCisgIGFsaWduLXNlbGY6IGNlbnRlcjsKKworICA6aG92ZXIgeworICAgIGN1cnNvcjogcG9pbnRlcjsKKyAgfQorICBpbWcgeworICAgIG1heC1oZWlnaHQ6IDQwcHg7CisgICAgbWF4LXdpZHRoOiA0MHB4OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB0b3A6IC0ycHg7CisgICAgcGFkZGluZzogMnB4OworICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgICBib3JkZXItcmFkaXVzOiAycHg7CisgIH0KK30KKworI21haW4tbmF2aWdhdGlvbi1iYXIgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHdpZHRoOiAxMDAlOworICBtaW4td2lkdGg6IEBtaW4tY29udGFpbmVyLXdpZHRoOworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogcm93OworICBhbGlnbi1pdGVtczogY2VudGVyOworICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CisgIGZvbnQtZmFtaWx5OiBRdWlja3NhbmQsc2Fucy1zZXJpZjsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIHotaW5kZXg6IDU7CisgIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0OworfQorI21haW4tbmF2LWJhci1sZWZ0IHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBkaXNwbGF5OiBmbGV4OworICBhbGlnbi1pdGVtczogY2VudGVyOworfQorI21haW4tbmF2LWJhci1yaWdodCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgZGlzcGxheTogZmxleDsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgcGFkZGluZy1yaWdodDogMTVweDsKK30KKworLmFwcC1idG57CisgIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgZGlzcGxheTogZmxleDsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgbWFyZ2luLXJpZ2h0OiAycHg7CisgIG1hcmdpbi1sZWZ0OiAycHg7CisgIGEgeworICAgIHBhZGRpbmc6MTBweDsKKyAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7CisgICAgZm9udC1zaXplOiAxLjRlbSAhaW1wb3J0YW50OworICB9Cit9CisKKy5hcHAtYnRuIGE6dmlzaXRlZCB7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKK30KKworLmFwcC1idG46aG92ZXJ7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgdG9wOiAtNnB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNXB4OworICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNXB4OworICBib3gtc2hhZG93OiAxcHggMXB4IDEycHggQHNoYWRvdy1jb2xvcjsKKyAgYSB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHRvcDogNnB4OworICAgIGNvbG9yIDogQGZvbnQtY29sb3ItZm9yLW1haW47CisgIH0KK30KKy5hcHAtYnRuLnNlbGVjdGVkOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIGJveC1zaGFkb3c6IG5vbmU7CisgIHRvcDowOworfQorCisuYXBwLWJ0biBhOmhvdmVyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorI2FwcC1zZWxlY3RlZCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICBib3gtc2hhZG93OiAxcHggLTJweCAxMnB4IEBzaGFkb3ctY29sb3I7CisgIHotaW5kZXg6IDA7CisgIG9wYWNpdHk6IC45OTsKKyAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyA6IDhweCA7CisgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzIDogOHB4IDsKKyAgYSB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHRvcDogM3B4OworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgfQorfQorLmFwcC1idG4uc2VsZWN0ZWQgYTpob3ZlciB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworI2FwcC1iYXItbGluZSB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgd2lkdGg6IDEwMCU7CisgIG1pbi13aWR0aDogQG1pbi1jb250YWluZXItd2lkdGg7CisgIGhlaWdodDogQGNvbG9yLWxpbmUtaGVpZ2h0OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgYm94LXNoYWRvdzogMnB4IDJweCA1cHggQHNoYWRvdy1jb2xvcjsKK30KKyNjb2xvci1hZGQgeworICB3aWR0aDogMTUwcHg7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICBoZWlnaHQ6IEBjb2xvci1saW5lLWhlaWdodDsKKyAgei1pbmRleDogMjA7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgdG9wOiBAY29sb3ItbGluZS1oZWlnaHQ7Cit9CisKKyNtb3JlLWFwcCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgZGlzcGxheTogZmxleDsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBmb250LXNpemU6IDEuNGVtICFpbXBvcnRhbnQ7CisgIHdpZHRoOiA0MHB4OworICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodDsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworfQorI21vcmUtYXBwOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKyNtb3JlLWFwcDpob3ZlciAjbW9yZS1hcHAtbGlzdCB7CisgIGRpc3BsYXk6IGJsb2NrOworfQorI21vcmUtYXBwLnNlbGVjdGVkIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7Cit9CisKKyNtb3JlLWFwcC1saXN0IHsKKyAgZGlzcGxheTogbm9uZTsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IEBhcHAtYmFyLWhlaWdodDsKKyAgbGVmdDogLTIwcHg7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICB6LWluZGV4OiAxMDsKKyAgYm9yZGVyOiBzb2xpZCA0cHggQG1haW4tY29sb3ItdGhlbWU7CisgIGJvcmRlci10b3Atd2lkdGg6IEBjb2xvci1saW5lLWhlaWdodDsKKyAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OworICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OworICBsaSB7CisgICAgcGFkZGluZy1sZWZ0IDogNHB4OworICAgIHBhZGRpbmctcmlnaHQ6IDRweDsKKyAgfQorCisgIGEgeworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICBmb250LXNpemU6IDE1cHg7CisgIH0KKworICA6aG92ZXIgeworICAgIGJhY2tncm91bmQtY29sb3I6IEBtZWRpdW0tY29sb3ItdGhlbWU7CisgICAgYSB7CisgICAgICBib3gtc2hhZG93OiBub25lOworICAgICAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICAgIH0KKyAgICBhOmhvdmVyeworICAgICAgYm94LXNoYWRvdzogbm9uZTsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgIGJvcmRlci1yYWRpdXM6IDA7CisgICAgfQorICB9CisKKyAgbGkuc2VsZWN0ZWQgeworICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIGEgeworICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICAgIH0KKyAgICBhOmhvdmVyIHsKKyAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIH0KKyAgfQorfQorCisjaG9tZUJ1dHRvbiB7CisgIGRpc3BsYXk6IGZsZXg7CisgIC8vdmlzaWJpbGl0eTogaGlkZGVuOworICBhbGlnbi1pdGVtczogY2VudGVyOworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgYmFja2dyb3VuZC1jb2xvcjpAZ3JleTsKKyAgYm9yZGVyOiBub25lOworICBib3JkZXItcmFkaXVzIDogMDsKKworICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodDsKKyAgd2lkdGggOiBAaG9tZS1idG4td2lkdGg7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgaW1nIHsKKyAgICBoZWlnaHQ6IDI1cHg7CisgICAgdHJhbnNpdGlvbjogYWxsIC4ycyBlYXNlLWluLW91dDsKKyAgfQorfQorCisjaG9tZUJ1dHRvbjpob3ZlciBpbWcgeworICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7Cit9CisKKyNhcHAtYmFyLWxpc3QgeworICBkaXNwbGF5OiBmbGV4OworfQorCisjdXNlci1kZXRhaWxzIHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICByaWdodDogMjBweDsKKyAgdG9wIDogNjJweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIGNvbG9yIDogQGZvbnQtY29sb3ItZm9yLWRhcms7CisgIGZvbnQtc2l6ZTogMTVweDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIHBhZGRpbmctdG9wOiA1cHg7CisgIHBhZGRpbmctYm90dG9tOiAxMHB4OworICB6LWluZGV4OiAxNTsKKyAgYm94LXNoYWRvdzogM3B4IDNweCAxMnB4IEBzaGFkb3ctY29sb3I7CisgIGJvcmRlci1yYWRpdXM6IDNweDsKKyAgdHJhbnNpdGlvbjogYWxsIC4xcyBlYXNlLWluLW91dDsKKworICBpbWcgeworICAgIGhlaWdodDogNTBweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgICAgcGFkZGluZzogNHB4OworICAgIGJvcmRlci1yYWRpdXMgOiAzcHg7CisgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CisgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CisgIH0KKyAgI2xvZ291dCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICAgIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICAgIGJvcmRlci1yYWRpdXM6IDJweDsKKyAgICA6aG92ZXIgeworICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIH0KKyAgfQorfQorCisjdXNlci1kZXRhaWxzOmFmdGVyeworICBjb250ZW50OiAnJzsKKyAgcG9zaXRpb246IGFic29sdXRlOworICB0b3A6IC0xMHB4OworICByaWdodDogNXB4OworICB3aWR0aDogMDsKKyAgaGVpZ2h0OiAwOworICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CisgIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgQGRhcmstY29sb3ItdGhlbWU7CisgIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50OworfQorCithLnVzZXItcHJlZi1idG4geworICBtYXJnaW4tdG9wOiAxNXB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgbWFyZ2luLWxlZnQ6IDEwcHg7CisgIG1hcmdpbi1yaWdodDogMTBweDsKKyAgcGFkZGluZy10b3A6IDJweDsKKyAgcGFkZGluZy1ib3R0b206IDJweDsKKyAgZGlzcGxheTogZmxleDsKKyAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyayAhaW1wb3J0YW50OworICA6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgfQorfQorCisjdXNlci1uYW1lIHsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKKyAgcGFkZGluZy1sZWZ0IDogNXB4OworICBwYWRkaW5nLXJpZ2h0IDogNXB4OworICBzcGFuIHsKKyAgICBtaW4td2lkdGg6IDEwMHB4OworICAgIHBhZGRpbmctYm90dG9tIDogNXB4OworICAgIHBhZGRpbmctdG9wIDogNXB4OworICB9Cit9CisKKyN1c2VyLXJvdzEgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogcm93OworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgI3VzZXItbGFuZyB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBmbGV4LWRpcmVjdGlvbjogcm93OworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKKyAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgICAgcGFkZGluZy1yaWdodDogMTBweDsKKyAgICBzcGFuIHsKKyAgICAgIG1pbi13aWR0aDogMzBweDsKKyAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICB9CisgIH0KK30KKworLmFwcGJhci1idG4taW1nIHsKKyAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQgLSA0MHB4OworfQorCisjaGVscC1idG4geworICBmb250LXNpemU6IDEwcHg7CisgIG1pbi13aWR0aDogMjBweDsKKyAgbWFyZ2luLXJpZ2h0OiAxNXB4OworfQorLyogQmVnaW4gc3ViIE1lbnUgc2VjdGlvbiAqLworCisjYXBwLW5hdmlnYXRpb24geworICBoZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQ7CisgIGJvcmRlci1yaWdodDogc29saWQgMXB4IEBibGFjazsKKyAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBibGFjazsKKyAgd2lkdGg6IDEwMCU7CisgIG1pbi13aWR0aDogQG1pbi1jb250YWluZXItd2lkdGg7CisgIGgyIHsKKyAgICBkaXNwbGF5OiBub25lOworICB9CisgIHVsIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7CisgICAgZmxleC1ncm93OiAxOworICB9CisgIHVsIGxpIHVsIGxpIHsKKyAgICBib3JkZXItbGVmdDogc29saWQgMXB4IEBibGFjazsKKyAgICBoZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQ7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIGp1c3RpZnktaXRlbXM6IGNlbnRlcjsKKyAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICBtaW4td2lkdGg6IDc1cHg7CisgICAgcGFkZGluZy1sZWZ0OiA2cHg7CisgICAgcGFkZGluZy1yaWdodDogNnB4OworICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOworICAgIGZvbnQtc2l6ZTogMTJweDsKKyAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxNTAwcHgpIHsKKyAgICAgIGZvbnQtc2l6ZTogMTBweDsKKyAgICAgIG1pbi13aWR0aDogNjVweDsKKyAgICB9CisgICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTMwMHB4KSB7CisgICAgICBmb250LXNpemU6IDEwcHg7CisgICAgICBtaW4td2lkdGg6IDUwcHg7CisgICAgfQorICAgIGEgeworICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgIHdpZHRoOiAxMDAlOworICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIH0KKyAgfQorfQorCisjYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGk6bGFzdC1jaGlsZCB7CisgIGJvcmRlci1yaWdodDogc29saWQgMXB4IEBibGFjazsKK30KKworI2FwcC1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIG1pbi1oZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQ7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgLy90b3A6IC0xcHg7CisgIGEgeworICAgIGNvbG9yOiBAd2hpdGU7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICB9Cit9CisjYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGkuc2VsZWN0ZWQ6aG92ZXIgeworICBhIHsKKyAgICBjb2xvcjogQGJsYWNrICFpbXBvcnRhbnQ7CisgIH0KK30KKworI2FwcC1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpLnNlbGVjdGVkIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHRvcDogMXB4OworICBoZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQgKyAxcHg7CisgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAycHg7CisgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDJweDsKKyAgYm9yZGVyLWJvdHRvbTogbm9uZTsKKworICA6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICcnOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC0ycHg7CisgICAgbGVmdDogNXB4OworICAgIHdpZHRoOiAwOworICAgIGhlaWdodDogMDsKKyAgICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CisgICAgYm9yZGVyLXRvcDogMTBweCBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsKKyAgICBib3JkZXItbGVmdDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgfQorCit9CisKKworLyogRW5kIHN1YiBNZW51IHNlY3Rpb24gKi8KKworLyogYmVnaW4gc3ViIE1lbnUgc2VjdGlvbiAzcmQgbGV2ZWwgKi8KKworLmJ1dHRvbi1iYXIudGFiLWJhciB7CisgIHVsIGxpIHVsIGxpIHsKKyAgICBib3JkZXI6IHNvbGlkIDFweCBAZ3JleTsKKyAgICBib3JkZXItcmFkaXVzOiA0cHg7CisgICAgYSB7CisgICAgICB3aWR0aDogMTAwJTsKKyAgICAgIGhlaWdodDogMTAwJTsKKyAgICB9CisgIH0KKyAgbGkuc2VsZWN0ZWR7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgYXsKKyAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICB9CisgIH0KKyAgdWwgbGkgdWwgbGk6aG92ZXIgeworICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIGEgeworICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluIDsKKyAgICB9CisgIH0KK30KKworI3RoaXJkLWxldmVsLW1lbnUtY29udGFpbmVyIHsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IHJvdzsKK30KKyN3b3JraW5nLWFyZWEgeworICB3aWR0aDogMTAwJTsKK30KKworI2xlZnQtY29sdW1uLW1lbnUgeworICB3aWR0aDogMTAwcHg7Cit9CisKKy50aGlyZC1sdmwtbWVudSB7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGxlZnQ6IC0xMHB4OworICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OworICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4OworICBwYWRkaW5nLXRvcDogNHB4OworICBwYWRkaW5nLWJvdHRvbTogNHB4OworICB1bCB7CisgICAgbGkgeworICAgICAgdWwgeworICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgICAgIHRvcDogNXB4OworICAgICAgICB3aWR0aDogQHRoaXJkLWx2bC13aWR0aDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaDIgeworICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKKyAgfQorfQorLnRoaXJkLWxldmVsLWl0ZW06bGFzdC1jaGlsZCB7CisgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCBAbWFpbi1jb2xvci10aGVtZTsKK30KKworLnRoaXJkLWxldmVsLWl0ZW0geworICBtaW4taGVpZ2h0OiBAdGhpcmQtbHZsLWhlaWdodDsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIHBhZGRpbmctcmlnaHQ6IDNweDsKKyAgYm9yZGVyLXRvcDogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lOworCisgIGEsIGE6dmlzaXRlZCB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIHdpZHRoOiAxMDAlOworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyayAhaW1wb3J0YW50OworICAgIG1pbi1oZWlnaHQ6IEB0aGlyZC1sdmwtaGVpZ2h0OworICAgIG1heC13aWR0aDogQHRoaXJkLWx2bC13aWR0aDsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CisgIH0KK30KKy50aGlyZC1sZXZlbC1pdGVtLnNlbGVjdGVkIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBib3JkZXItbGVmdDogc29saWQgOXB4IEBtYWluLWNvbG9yLXRoZW1lOworICBhLCBhOnZpc2l0ZWQgeworICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgICBjb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgfQorICA6YWZ0ZXIgeworICAgIGNvbnRlbnQ6ICcnOworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IDVweDsKKyAgICBsZWZ0OiAwOworICAgIHdpZHRoOiAwOworICAgIGhlaWdodDogMDsKKyAgICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50OworICAgIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOworICAgIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CisgIH0KK30KKworLnRoaXJkLWxldmVsLWl0ZW0gYTpob3ZlciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW4gOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisvKiBFbmQgM3JkIGxldmVsIG1lbnUgKi8KKworCisKKy8qIEJlZ2luIEhvbWUgTWVudSBmb3IgSUIgc2VjdGlvbiAqLworLmZpeGVkLW5hdi1iYXIgeworICBwb3NpdGlvbjogZml4ZWQgIWltcG9ydGFudDsKKyAgd2lkdGg6IDEwMCU7Cit9CisjbmF2LWJhci1vZmZzZXQgeworICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodCA7Cit9CisKKyNob21lR2x5cGggeworICBtYXJnaW4tbGVmdDogMjBweDsKKyAgaGVpZ2h0OiAyMHB4OworfQorCisjaG9tZVBhZ2VUaXRsZSB7CisgIGNvbG9yOiBAd2hpdGU7CisgIGZvbnQtc2l6ZTogMjBweDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG1hcmdpbi1yaWdodDogMjBweDsKKyAgbWFyZ2luLWxlZnQ6IDIwcHg7Cit9CisuaG9tZS1tZW51LWxpc3QgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICBhbGlnbi1pdGVtczogY2VudGVyOworfQorLmhwLWFwcGxpc3QgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogcm93OworICBjb2xvciA6IEB3aGl0ZTsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgLmFwcC10aXRsZSB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICAgIGhlaWdodDogQGhvbWUtbWVudS10aWxlLWhlaWdodDsKKyAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTBweDsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOworICAgIHNwYW4geworICAgICAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7CisgICAgICBmb250LXNpemU6IDE1cHg7CisgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgIHdpZHRoOiAxMTBweDsKKyAgICAgIGEgeworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICAgICAgY29sb3IgOiBAd2hpdGU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLmhwLW1lbnUtaXRlbSB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBtYXJnaW4tbGVmdDogNXB4OworICAgIG1hcmdpbi1yaWdodDogNXB4OworICAgIGJvcmRlcjogc29saWQgMnB4IEBncmV5OworICAgIGJvcmRlci1yYWRpdXM6IDhweDsKKyAgICBoZWlnaHQ6IEBob21lLW1lbnUtdGlsZS1oZWlnaHQgLSA0cHg7CisgICAgbWluLXdpZHRoOiBAaG9tZS1tZW51LXRpbGUtbWluLXdpZHRoOworICAgIG1heC13aWR0aDogQGhvbWUtbWVudS10aWxlLW1heC13aWR0aDsKKyAgICAubWVudS1saW5rIHsKKyAgICAgIGZvbnQtc2l6ZTogMTBweDsKKyAgICAgIGNvbG9yOiBAYmxhY2s7CisgICAgICBwYWRkaW5nOiAxMHB4OworICAgIH0KKyAgICAuc3Rhci1saW5rIHsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIGhlaWdodDogMjVweDsKKyAgICAgIHRvcDogNXB4OworICAgICAgcmlnaHQ6IDVweDsKKyAgICB9CisgIH0KKworfQorLmhwLWFwcGxpc3QgLmFwcC10aXRsZSBzcGFuIGE6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy5ocC1tZW51LWl0ZW0uZmF2b3JpdGVJdGVtIHsKKyAgYm9yZGVyOiBzb2xpZCAycHggQGRhcmstY29sb3ItdGhlbWU7Cit9CisKKy5ocC1tZW51LWl0ZW06aG92ZXIgeworICBib3gtc2hhZG93OiAzcHggM3B4IDEycHggQHNoYWRvdy1jb2xvcjsKKyAgYSB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICB9Cit9CisKKy8qIEVuZCBIb21lIE1lbnUgZm9yIElCIHNlY3Rpb24gKi8KKworLyogQmVnaW4gTG9naW4gc2NyZWVubGV0ICovCisjbG9naW4tY29udGFpbmVyIHsKKyAgI2NvbnRlbnQtbWVzc2FnZXMgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB0b3A6IEBhcHAtYmFyLWhlaWdodDsKKyAgICBib3JkZXItcmFkaXVzOiA0cHg7CisgICAgd2lkdGg6IDk3JTsKKyAgICAmLmVycm9yTWVzc2FnZSB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDogQGNvbG9yLWJhY2tncm91bmQtYWxlcnQgIWltcG9ydGFudDsKKyAgICAgIGNvbG9yOiBAY29sb3ItZm9udC1hbGVydCAhaW1wb3J0YW50OworICAgICAgYm9yZGVyIDogc29saWQgMXB4IEBjb2xvci1ib3JkZXItYWxlcnQgIWltcG9ydGFudDsKKyAgICB9CisgICAgJi5ldmVudE1lc3NhZ2UgeworICAgICAgYmFja2dyb3VuZC1jb2xvciA6IEBjb2xvci1iYWNrZ3JvdW5kLXN1Y2Nlc3MgIWltcG9ydGFudDsKKyAgICAgIGNvbG9yOiBAY29sb3ItZm9udC1zdWNjZXNzICFpbXBvcnRhbnQ7CisgICAgICBib3JkZXIgOiBzb2xpZCAxcHggQGNvbG9yLWJvcmRlci1zdWNjZXNzICFpbXBvcnRhbnQ7CisgICAgfQorICB9Cit9CisjbG9naW5CYXIgeworICBwb3NpdGlvbjogZml4ZWQ7CisgIHRvcDowOworICBsZWZ0OiAwOworICB3aWR0aDogMTAwJTsKKyAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQ7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICBzcGFuIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA1cHg7CisgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNXB4OworICAgIGZvbnQtc2l6ZTogMjVweDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgdG9wOiBAYXBwLWJhci1oZWlnaHQgLSAzMnB4OworICAgIGxlZnQ6IDE1cHg7CisgICAgcGFkZGluZzogNXB4IDEwcHggNXB4IDEwcHg7CisgIH0KKyAgI2NvbXBhbnktbG9nbyB7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICB9Cit9CisKKy5sb2dpbi1zY3JlZW5sZXQgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICBtaW4td2lkdGg6IDMwMHB4OworICBtYXgtd2lkdGg6IDUwZW07CisgIGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50OworICBtYXJnaW4tdG9wOiAxNSU7CisgIGJveC1zaGFkb3c6IDNweCAzcHggMTJweCBAc2hhZG93LWNvbG9yOworICAuc2NyZWVubGV0LXRpdGxlLWJhciB7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CisgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgbWFyZ2luOjA7CisgICAgcGFkZGluZzowOworICAgIGgzeworICAgICAgcGFkZGluZy10b3A6MnB4OworICAgICAgcGFkZGluZy1ib3R0b206MnB4OworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgIHdpZHRoOjEwMCU7CisgICAgICB0ZXh0LXNoYWRvdzogbm9uZTsKKyAgICAgIGZvbnQtc2l6ZTogMjVweDsKKyAgICB9CisgIH0KKyAgLnNjcmVlbmxldC1ib2R5IHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICAgIGZvcm0geworICAgICAgLmJ1dHRvbiB7CisgICAgICAgIHdpZHRoOiAxNTBweDsKKyAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OworICAgICAgICBiYWNrZ3JvdW5kOiBub25lOworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgICAgICB0ZXh0LXNoYWRvdzogbm9uZTsKKyAgICAgICAgbWFyZ2luLXRvcDogMjBweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKKyAgICAgIH0KKworICAgICAgdGFibGUgeworICAgICAgICB0ciB7CisgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgLmxhYmVsIHsKKyAgICAgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICAgICAgICAgIHdpZHRoOiAyNSU7CisgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7CisgICAgICAgICAgfQorICAgICAgICAgIGlucHV0IHsKKyAgICAgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICAgIH0KKyAgICAgICAgICAuYnV0dG9udGV4dCwKKyAgICAgICAgICBbdHlwZT0ic3VibWl0Il0geworICAgICAgICAgICAgd2lkdGg6IDE1MHB4OworICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OworICAgICAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICAgICAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgICAgICAgICAgdGV4dC1zaGFkb3c6IG5vbmU7CisgICAgICAgICAgfQorICAgICAgICAgIFtuYW1lPSJHRVRfUEFTU1dPUkRfSElOVCJdIHsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgICAgICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgICAgICAgYm9yZGVyOiBub25lOworICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgfQorICAgICAgICAgIFtuYW1lPSJFTUFJTF9QQVNTV09SRCJdIHsKKyAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgICAgICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgICAgICAgYm9yZGVyOiBub25lOworICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgfQorICAgICAgICAgIHRkIHsKKyAgICAgICAgICAgIHBhZGRpbmc6IDVweDsKKyAgICAgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDsKKyAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBhIHsKKyAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICB9CisgIH0KK30KKworLmxvZ2luLXNjcmVlbmxldCAuc2NyZWVubGV0LXRpdGxlLWJhciB7CisgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLyogRW5kIExvZ2luIHNjcmVlbmxldCAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBCZWdpbiBTY3JlZW5sZXQgc3R5bGUgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lIDsKKyAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsKKyAgaGVpZ2h0OiAxJTsgLyogSUUgZml4ICovCisgIG1pbi1oZWlnaHQ6IDEuNWVtOworICBwYWRkaW5nOjAuOGVtIDAuMmVtOworfQorCisuc2NyZWVubGV0IHsKKyAgYm9yZGVyLXJhZGl1czogNXB4OworICBib3JkZXI6IHNvbGlkIDFweCBAZ3JleTsKKyAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CisgIG1hcmdpbi1ib3R0b206IDFlbTsKKyAgb3ZlcmZsb3c6IGF1dG87Cit9CisKKy5zY3JlZW5sZXQtYm9keSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7CisgIGhlaWdodDogYXV0byAhaW1wb3J0YW50OworICBoZWlnaHQ6IDElOworICBwYWRkaW5nOiAwLjRlbTsKK30KKworLnNjcmVlbmxldC1ib2R5IGRpdiB7CisgIG1hcmdpbjogMC44ZW0gMC4xZW0KK30KKworLyogU3BlY2lhbCBTY3JlZW5sZXQgc3R5bGUgZm9yIGxvY2FsZSBhbmQgdGltZXpvbmUgd2luZG93ICovCisubGlzdHMuc2NyZWVubGV0IHsKKyAgbWFyZ2luLWxlZnQ6IDI1JTsKKyAgbWFyZ2luLXJpZ2h0OiAyNSU7CisgIG1hcmdpbi10b3A6IDFlbTsKK30KKworLmxpc3RzLnNjcmVlbmxldCAuYmFzaWMtdGFibGUgdHIgdGQgeworICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKy5saXN0cy5zY3JlZW5sZXQgLmJhc2ljLXRhYmxlIHRyIHRkIGEgeworICBkaXNwbGF5OiBibG9jazsKK30KKworLyogICAgICBBbHRlcm5hdGUgdGFibGUgaGVhZGVyIHN0eWxlICAgICAgKi8KKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoLAorLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleWRhcms7CisgIGJvcmRlci1ib3R0b206IDA7CisgIGJvcmRlci1sZWZ0OiAwLjFlbSBzb2xpZCAjYWFhOworICBib3JkZXItcmlnaHQ6IDAuMWVtIHNvbGlkICM4ODg7CisgIGNvbG9yOiAjZmZmZmZmOworICBmb250LXdlaWdodDogYm9sZDsKK30KKworLyogTm8gcGFkZGluZyBzY3JlZW5sZXQgZGVjb3JhdG9yICovCisubm8tcGFkZGluZyB7CisgIHBhZGRpbmc6IDA7CisgIGJvcmRlcjogbm9uZTsKK30KKworLm5vLXBhZGRpbmcgLmgxLAorLm5vLXBhZGRpbmcgLmgyLAorLm5vLXBhZGRpbmcgLmgzLAorLm5vLXBhZGRpbmdyIGgxLAorLm5vLXBhZGRpbmcgaDIsCisubm8tcGFkZGluZyBoMyB7CisgIHBhZGRpbmc6IDAuN2VtOworfQorCisuc2NyZWVubGV0LXRpdGxlLWJhciB1bCBhOmhvdmVyIHsKKyAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgRW5kIFNjcmVlbmxldCBzdHlsZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgVGFibGUgU3R5bGVzICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLmJhc2ljLXRhYmxlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgY29sb3I6ICMwMDAwMDA7CisgIG1hcmdpbi1ib3R0b206IDFlbTsKKyAgd2lkdGg6IDEwMCU7Cit9CisKK2Zvcm0gdGFibGUsCitmb3JtIC5iYXNpYy10YWJsZSwKKy5zY3JlZW5sZXQtYm9keSAuYmFzaWMtdGFibGUgeworICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKKyAgbWFyZ2luLWJvdHRvbTogMDsKK30KKworLmJhc2ljLXRhYmxlIHRyIHRkIHsKKyAgLyogU3R5bGUgZm9yIGFsbCBjZWxscyAqLworICBwYWRkaW5nOiAwLjhlbSAwLjFlbTsKKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKworLmJhc2ljLXRhYmxlIHRyIC5hbGlnbi1ib3R0b20geworICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOworfQorCisuYmFzaWMtdGFibGUgdHIgLmFsaWduLXRvcCB7CisgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKKy5iYXNpYy10YWJsZSB0ciAubGFiZWwsCisuYmFzaWMtdGFibGUgdHIgLmdyb3VwLWxhYmVsIHsKKyAgLyogZmllbGQgbGFiZWxzIGZvciBmb3JtcyAqLworICBmb250LXdlaWdodDogYm9sZDsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7CisgIHBhZGRpbmctcmlnaHQ6IDEuNWVtOworICB3aGl0ZS1zcGFjZTogbm93cmFwOworICB3aWR0aDogMSU7Cit9CisKKy5iYXNpYy10YWJsZSB0ciAuZ3JvdXAtbGFiZWwgeworICAvKiAiaGVhZGVyIiBmb3IgZmllbGQgbGFiZWwgZ3JvdXBzICovCisgIGZvbnQtc2l6ZTogMS4yZW07CisgIHBhZGRpbmc6IDJlbSAxLjVlbSAwIDA7Cit9CisKKy5iYXNpYy10YWJsZSB0ciB0aCwKKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdyB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgdGQgeworICBib3JkZXItYm90dG9tOiAwLjFlbSBzb2xpZCAjMDAwMDAwOworfQorCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgdGQgYSB7CisgIGNvbG9yOiAjMDAwMDAwOworfQorCisuYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3cgeworICAvKiBBbHRlcm5hdGluZyByb3cgc3R5bGUgKi8KKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsKK30KKworLmJhc2ljLXRhYmxlIC5zZWxlY3RlZCB7CisgIGJhY2tncm91bmQ6ICNGRkZDQ0Y7Cit9CisKKy5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvd1NlbGVjdGVkIHsKKyAgYmFja2dyb3VuZDogI0ZGRjU1RjsKK30KKworLmJhc2ljLXRhYmxlIC5WYWxpZGF0ZSB7CisgIC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovCisgIGJhY2tncm91bmQ6ICNBMEQ1Rjc7Cit9CisKKy5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvd1ZhbGlkYXRlIHsKKyAgLypTdHlsZSB1c2UgYnkgYWx0LXJvdy1zdHlsZSBvbiBsaXN0Ki8KKyAgYmFja2dyb3VuZDogIzcyQThGMjsKK30KKworLmJhc2ljLXRhYmxlIC5XYXJuIHsKKyAgLypTdHlsZSB1c2UgYnkgYWx0LXJvdy1zdHlsZSBvbiBsaXN0Ki8KKyAgYmFja2dyb3VuZDogI2Y1NUM1QzsKK30KKworLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93V2FybiB7CisgIC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovCisgIGJhY2tncm91bmQ6ICNGQzc0NTU7Cit9CisKKy5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCB7CisgIC8qIGJ1dHRvbiBjb2x1bW4gc3R5bGUgLSBmb3IgdGhlIHNtYWxsCisgIGNvbGxlY3Rpb24gb2YgYnV0dG9ucyB1c2VkIGluIGxpc3RzICovCisgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgIHBhZGRpbmc6IDAuM2VtOworfQorLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGEsCisuYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgYnV0dG9uLAorLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGlucHV0W3R5cGU9InJlc2V0Il0sCisuYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgaW5wdXRbdHlwZT0ic3VibWl0Il0sCisuYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgaW5wdXRbdHlwZT0iYnV0dG9uIl0geworICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CisgIC1tb3otYm9yZGVyLXJhZGl1czogMWVtOworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDFlbTsKKyAgYm9yZGVyLXJhZGl1czogMnB4OworICBib3JkZXI6IDAuMWVtIHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOworICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICBkaXNwbGF5OmlubGluZS1ibG9jazsKKyAgZm9udC1zaXplOiAwLjllbTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG91dGxpbmU6IDA7CisgIG92ZXJmbG93OiB2aXNpYmxlOworICBwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjJlbSAwLjVlbTsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICB3aWR0aDogYXV0bzsKKworICAmOmhvdmVyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICBjb2xvcjogQHdoaXRlOworICB9Cit9CisKKy5iYXNpYy10YWJsZSAuY29sbGFwc2VkIHsKKyAgdmlzaWJpbGl0eTogY29sbGFwc2U7Cit9CisKKy8qICAgICAgU29ydCBmaWVsZCBzdHlsZSAgICAgICovCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCAuc29ydC1vcmRlci1hc2MsCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCAuc29ydC1vcmRlci1hc2N7CisgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LWdyLXVwLnBuZykgbm8tcmVwZWF0IHJpZ2h0OworICBwYWRkaW5nLWxlZnQ6IDAuNWVtOworICBwYWRkaW5nLXJpZ2h0OiAyMHB4OyAvKiBTZXR0aW5nIG11c3QgYmUgaW4gcHggKi8KK30KKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoIC5zb3J0LW9yZGVyLWRlc2MsCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCAuc29ydC1vcmRlci1kZXNjeworICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci1kdy5wbmcpIG5vLXJlcGVhdCByaWdodDsKKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsKKyAgcGFkZGluZy1yaWdodDogMjBweDsgLyogU2V0dGluZyBtdXN0IGJlIGluIHB4ICovCit9CisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCAuc29ydC1vcmRlciwKKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIC5zb3J0LW9yZGVyeworICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci5wbmcpIG5vLXJlcGVhdCByaWdodDsKKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsKKyAgcGFkZGluZy1yaWdodDogMjBweDsgLyogU2V0dGluZyBtdXN0IGJlIGluIHB4ICovCisgIGNvbG9yOiNmZmYKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgQmVnaW4gTWVzc2FnZSBJbmZvICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisuY291bnQtbWVzc2FnZSB7CisgIGRpc3BsYXk6IGZsZXg7CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICBtaW4taGVpZ2h0OjIwcHg7CisgIG1pbi13aWR0aDogMjBweDsKKyAgbWF4LWhlaWdodDoyMHB4OworICBtYXgtd2lkdGg6IDIwcHg7CisgIGJhY2tncm91bmQ6IEB3aGl0ZTsKKyAgZm9udC1zaXplOjEycHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBib3JkZXItcmFkaXVzOiA1MCU7Cit9CisuaW5mby1tZXNzYWdlLXRpdGxlIHsKKyAgbWluLXdpZHRoOjE1MHB4OworICBtYXJnaW46IDVweDsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDE2cHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorLm1lc3NhZ2UtbGlzdCB7CisgIHBvc2l0aW9uOnJlbGF0aXZlOworICBtYXJnaW4tdG9wOiAxMHB4OworICBib3gtc2hhZG93OiAxcHggM3B4IDVweCBAZ3JleWRhcms7CisgIGJvcmRlci1yYWRpdXM6IDAgNXB4IDVweCAwOworICB0cmFuc2l0aW9uOiBoZWlnaHQgMnM7Cit9CisubWVzc2FnZS1saXN0LW1haW4geworICBwYWRkaW5nOiA1cHggMTVweCA1cHggMTVweDsKK30KKy5tZXNzYWdlLWxpc3QtYWxlcnQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3ItYWxlcnQ7CisgIGJvcmRlci1sZWZ0IDogc29saWQgNXB4IEBjb2xvci1hbGVydC1kYXJrOworICAuY291bnQtbWVzc2FnZSB7CisgICAgY29sb3I6IEBjb2xvci1hbGVydC1kYXJrOworICB9Cit9CisubWVzc2FnZS1saXN0LXN1Y2Nlc3MgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3Itc3VjY2VzczsKKyAgYm9yZGVyLWxlZnQ6IHNvbGlkIDVweCBAY29sb3Itc3VjY2Vzcy1kYXJrOworICAuY291bnQtbWVzc2FnZSB7CisgICAgY29sb3I6IEBjb2xvci1zdWNjZXNzLWRhcms7CisgIH0KK30KKy5tZXNzYWdlLWxpc3QtdGFibGUtY29udGFpbmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICBib3JkZXItcmFkaXVzOiA1cHg7CisgIG92ZXJmbG93OiBoaWRkZW47CisgIGhlaWdodDogMDsKK30KKy5pbmZvLW1lc3NhZ2Utc3VjY2VzcyB7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisuaW5mby1tZXNzYWdlLWFsZXJ0IHsKKyAgZGlzcGxheTogbm9uZTsKK30KK3RhYmxlLm1zZy1saXN0IHsKKyAgd2lkdGg6IDEwMCU7CisgIGZvbnQtc2l6ZTogMTZweDsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBwYWRkaW5nOiAwOworICB0aGVhZCB7CisgICAgaGVpZ2h0OiAxMDAlOworICAgIGJhY2tncm91bmQtY29sb3I6IEBncmV5OworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIHRyeworICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOworICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7CisgICAgICBsaW5lLWhlaWdodDogMzBweDsKKyAgICB9CisgIH0KKyAgdGJvZHkgeworICAgIHRyIHsKKyAgICAgIGxpbmUtaGVpZ2h0OiAyNXB4OworICAgIH0KKyAgICB0ci5tc2ctcm93LXN1Y2Nlc3MgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLXN1Y2Nlc3M7CisgICAgfQorICAgIHRyLm1zZy1yb3ctYWxlcnQgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLWFsZXJ0OworICAgIH0KKyAgfQorICB0ZCB7CisgICAgcGFkZGluZy1sZWZ0OiA1cHg7CisgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIEVuZCAgTWVzc2FnZSBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgUGFnaW5hdGUgU3R5bGUgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy5wYWdpbmF0ZS1iYXItbnJkIHsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgZm9udC1zaXplOiAxNXB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsKKyAgcGFkZGluZy1sZWZ0OiAxMHB4OworICBwYWRkaW5nLXRvcDogM3B4OworICBwYWRkaW5nLWJvdHRvbTogM3B4OworICBib3gtc2hhZG93OiAwIDJweCA1cHggQHNoYWRvdy1jb2xvcjsKKworICB1bC5wYWdpbmF0ZS1wZy1saXN0IHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CisgICAgYm9yZGVyLXJhZGl1czogOHB4OworICAgIGJvcmRlcjogc29saWQgMXB4IEBib3gtYm9yZGVyLWNvbG9yOworICAgIGhlaWdodDogMThweDsKKyAgICBsaSB7CisgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgICBtaW4td2lkdGg6IDE3cHg7CisgICAgICBib3JkZXItcmlnaHQ6IHNvbGlkIDFweCBAYm94LWJvcmRlci1jb2xvcjsKKyAgICAgIHBhZGRpbmctbGVmdDogMnB4OworICAgICAgcGFkZGluZy1yaWdodDogMnB4OworICAgICAgaGVpZ2h0OjEwMCU7CisgICAgICBhIHsKKyAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsKKyAgICAgICAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICAgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgfQorICAgICAgLnBhZ2luYXRlLWRpc2FibGUgeworCisgICAgICB9CisgICAgfQorICAgIGxpLnNlbGVjdGVkIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgYSB7CisgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGk6Zmlyc3QtY2hpbGQsIGxpOmxhc3QtY2hpbGQgeworICAgICAgd2lkdGg6IDIwcHg7CisgICAgfQorICAgIGxpOmZpcnN0LWNoaWxkIHsKKyAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDNweDsKKyAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDsKKyAgICB9CisgICAgbGk6bGFzdC1jaGlsZCB7CisgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CisgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4OworICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDsKKyAgICB9CisgIH0KKworfQorc2VsZWN0LnBhZ2luYXRlLXNlbGVjdCB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgYmFja2dyb3VuZDogQHdoaXRlOworICBmb250LXNpemU6IDE2cHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBib3JkZXI6IDFweCBzb2xpZCBAYm94LWJvcmRlci1jb2xvcjsKKyAgb3B0aW9uIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGp1c3RpZnktc2VsZjogY2VudGVyOworICAgIGZvbnQtc2l6ZTogMTRweDsKKyAgfQorfQorCisucGFnaW5hdGUtc2VsZWN0LWxhYmVsIHsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDE2cHg7CisgIHBhZGRpbmctbGVmdDogMTVweDsKKyAgcGFkZGluZy1yaWdodDogMTVweDsKK30KKworLnBhZ2luYXRlLWluZm9ybWF0aW9uIHsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDE2cHg7CisgIHBhZGRpbmctbGVmdDogMTVweDsKKyAgcGFkZGluZy1yaWdodDogMTVweDsKK30KKwordWwucGFnaW5hdGUtcGctbGlzdCBsaTpob3ZlcnsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGEgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47CisgIH0KK30KKworLyogRW5kIG9mIFBhZ2luYXRlIFN0eWxlICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIExpc3QgTmF2aWdhdGlvbiBTdHlsZSAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy5uYXYtcGFnZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleWRhcms7CisgIGNvbG9yOiBAd2hpdGU7CisgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsKKyAgZm9udC1zaXplOiA5cHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBsaW5lLWhlaWdodDogMy41ZW07CisgIGhlaWdodDogMy41ZW07CisgIG1hcmdpbjogMC41ZW0gMCAwLjVlbSAwOworICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsKK30KKworLm5hdi1wYWdlciB1bCB7CisgIGRpc3BsYXk6IGlubGluZTsgLyogSUUgRml4ICovCit9CisKKy5uYXYtcGFnZXIgdWwgbGkgeworICBmbG9hdDpsZWZ0OworICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCisubmF2LXBhZ2VyIHVsIGxpIGEgeworICBkaXNwbGF5OiBibG9jazsKK30KKworLm5hdi1wYWdlciB1bCBhIHsKKyAgY29sb3I6IEB3aGl0ZTsKKyAgcGFkZGluZzogMCAxZW0gMCAxZW07CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLm5hdi1wYWdlciB1bCBhOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKK30KKworLm5hdi1wYWdlciB1bCAubmF2LXBhZ2VzaXplLAorLm5hdi1wYWdlciB1bCAubmF2LXBhZ2Utc2VsZWN0LAorLm5hdi1wYWdlciB1bCAubmF2LWRpc3BsYXlpbmcgeworICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsKK30KKworLm5hdi1wYWdlciB1bCAubmF2LWZpcnN0LWRpc2FibGVkLAorLm5hdi1wYWdlciB1bCAubmF2LXByZXZpb3VzLWRpc2FibGVkLAorLm5hdi1wYWdlciB1bCAubmF2LW5leHQtZGlzYWJsZWQsCisubmF2LXBhZ2VyIHVsIC5uYXYtbGFzdC1kaXNhYmxlZCB7CisgIHBhZGRpbmc6IDAgMWVtIDAgMWVtOworfQorCisubmF2LXBhZ2VyIHVsIC5uYXYtZmlyc3QtZGlzYWJsZWQ6aG92ZXIsCisubmF2LXBhZ2VyIHVsIC5uYXYtcHJldmlvdXMtZGlzYWJsZWQ6aG92ZXIsCisubmF2LXBhZ2VyIHVsIC5uYXYtbmV4dC1kaXNhYmxlZDpob3ZlciwKKy5uYXYtcGFnZXIgdWwgLm5hdi1sYXN0LWRpc2FibGVkOmhvdmVyIHsKKyAgY3Vyc29yOiBub3QtYWxsb3dlZDsKK30KKworCisubmF2LXBhZ2VyIHVsIC5uYXYtZGlzcGxheWluZyB7CisgIGJvcmRlci1yaWdodDogbm9uZTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgTXVsdGktQ29sdW1uIFN0eWxlcyAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNjb2x1bW4tY29udGFpbmVyIHsKKyAgbWFyZ2luOiBhdXRvOworICBwYWRkaW5nOiAxZW07CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgbWluLXdpZHRoOiBAbWluLWNvbnRhaW5lci13aWR0aDsKK30KKworI2NvbHVtbi1jb250YWluZXIgaDEsCisjY29sdW1uLWNvbnRhaW5lciAuaDEsCisjY29sdW1uLWNvbnRhaW5lciBoMiwKKyNjb2x1bW4tY29udGFpbmVyIC5oMiB7CisgIG1hcmdpbi1ib3R0b206IDAuNWVtOworfQorCisjY29sdW1uLWNvbnRhaW5lciBoMSwKKyNjb2x1bW4tY29udGFpbmVyIC5oMSB7CisgIGNvbG9yOiAjNTU3OTk2OworfQorCisjY29sdW1uLWNvbnRhaW5lciAubGVmdCB7CisgIGZsb2F0OiBsZWZ0OworICAvKiBhbHQ6IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwcHg7IGxlZnQ6IDBweDsgKi8KKyAgd2lkdGg6IDIyZW07CisgIG1hcmdpbi1yaWdodDogMWVtOworfQorCisjY29sdW1uLWNvbnRhaW5lciAubGVmdC1sYXJnZXIgeworICBmbG9hdDogbGVmdDsKKyAgLyogYWx0OiBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7ICovCisgIHdpZHRoOiAyNWVtOworICBtYXJnaW4tcmlnaHQ6IDFlbTsKK30KKworLmxlZnRoYWxmIHsKKyAgZmxvYXQ6IGxlZnQ7CisgIGhlaWdodDogMSU7CisgIGxlZnQ6IDA7CisgIG1hcmdpbjogMCUgMSUgMSUgMCU7CisgIHdpZHRoOiA0OSU7Cit9CisKKy5yaWdodGhhbGYgeworICBmbG9hdDogcmlnaHQ7CisgIGhlaWdodDogMSU7CisgIG1hcmdpbjogMCAwIDElIDElOworICByaWdodDogMDsKKyAgd2lkdGg6IDQ5JTsKK30KKworI2NvbHVtbi1jb250YWluZXIgLnJpZ2h0IHsKKyAgZmxvYXQ6IHJpZ2h0OworICBtYXJnaW4tbGVmdDogMWVtOworICB3aWR0aDogMjJlbTsKK30KKworI2NvbHVtbi1jb250YWluZXIgLmxlZnRvbmx5IHsKKyAgbWFyZ2luLWxlZnQ6IDIzZW07CisgIHdpZHRoOiBhdXRvOworfQorCisjY29sdW1uLWNvbnRhaW5lciAubGVmdG9ubHktbGFyZ2VyIHsKKyAgbWFyZ2luLWxlZnQ6IDI2ZW07CisgIHdpZHRoOiBhdXRvOworfQorCisjY29sdW1uLWNvbnRhaW5lciAucmlnaHRvbmx5IHsKKyAgbWFyZ2luLXJpZ2h0OiAyM2VtOworICB3aWR0aDogYXV0bzsKK30KKworI2NvbHVtbi1jb250YWluZXIgLmNlbnRlciB7CisgIG1hcmdpbi1sZWZ0OiAyM2VtOworICBtYXJnaW4tcmlnaHQ6IDIzZW07CisgIHdpZHRoOiBhdXRvOworfQorCisjY29sdW1uLWNvbnRhaW5lciAubm9jb2x1bW5zIHsKKyAgd2lkdGg6IGF1dG87Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgQnV0dG9uIFN0eWxlICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLmJ1dHRvbi1iYXIgbGkuYnV0dG9udGV4dCBhLAorYS5idXR0b250ZXh0LAorYS5idXR0b250ZXh0YmlnLAorLnNtYWxsU3VibWl0LAorLnNtYWxsU3VibWl0OmhvdmVyLAorLm1lZGl1bVN1Ym1pdCwKKy5sYXJnZVN1Ym1pdCwKKy5sb2dpbkJ1dHRvbiwKKy5idXR0b24tc3R5bGUtMSBhLAorLmJ1dHRvbi1zdHlsZS0xIHVsIGEsCisuYnV0dG9uLXN0eWxlLTIgdWwgYSwKKy5idXR0b24tc3R5bGUtMiBhLAorLmJ1dHRvbiwKK2J1dHRvbiwKK2lucHV0W3R5cGU9InJlc2V0Il0sCitpbnB1dFt0eXBlPSJzdWJtaXQiXSwKK2lucHV0W3R5cGU9ImJ1dHRvbiJdIHsKKyAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOworICAtbW96LWJvcmRlci1yYWRpdXM6IDEuMWVtOworICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEuMWVtOworICBib3JkZXItcmFkaXVzOiAycHg7CisgIGJvcmRlcjogMC4xZW0gc29saWQgQG1haW4tY29sb3ItdGhlbWU7CisgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgY3Vyc29yOiBwb2ludGVyOworICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGRpc3BsYXk6aW5saW5lLWJsb2NrOworICBmb250LXNpemU6IDFlbTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG91dGxpbmU6IDA7CisgIG92ZXJmbG93OiB2aXNpYmxlOworICBwYWRkaW5nOiAwLjRlbSAxZW0gMC40ZW07CisgIHRleHQtZGVjb3JhdGlvbjpub25lOworICAvKnRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsqLworICB3aWR0aDogYXV0bzsKKworICAvKiBJRTcgKi8KKyAgKnBhZGRpbmctdG9wOiAwLjJlbTsKKyAgKnBhZGRpbmctYm90dG9tOiAwOworICAmOmhvdmVyIHsKKyAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIH0KK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIEZvb3RlciBTdHlsZSAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNmb290ZXIgeworICBiYWNrZ3JvdW5kOiBAZGFyay1jb2xvci10aGVtZTsKKyAgYm9yZGVyLXRvcDogMC4xZW0gaW5zZXQgIzAwMDsKKyAgcGFkZGluZzogMC41ZW0gMCAwLjVlbSAwLjVlbTsKKworICBoZWlnaHQ6IEBmb290ZXItaGVpZ2h0OworICBwb3NpdGlvbjogZml4ZWQ7CisgIGJvdHRvbTogMDsKKyAgd2lkdGg6IDEwMCU7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7CisgIHotaW5kZXg6IDEwOworCisgIHNwYW4geworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICBwYWRkaW5nOiAxMHB4OworICB9CisKKyAgYSB7CisgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIH0KK30KKworI2Zvb3RlciBhOmZvY3VzIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9CisKKyNmb290ZXItb2Zmc2V0IHsKKyAgaGVpZ2h0OiBAZm9vdGVyLWhlaWdodCArIDEwcHg7CisgIHdpZHRoOiAxMDAlOworfQpkaWZmIC0tZ2l0IGEvdGhlbWVzL3JhaW5ib3dzdG9uZS93ZWJhcHAvcmFpbmJvd3N0b25lL3JhaW5ib3dzdG9uZS1ydWJ5Lmxlc3MgYi90aGVtZXMvcmFpbmJvd3N0b25lL3dlYmFwcC9yYWluYm93c3RvbmUvcmFpbmJvd3N0b25lLXJ1YnkubGVzcwppbmRleCAxOTEwNWE4Li5jMzEwNTFiIDEwMDY0NAotLS0gYS90aGVtZXMvcmFpbmJvd3N0b25lL3dlYmFwcC9yYWluYm93c3RvbmUvcmFpbmJvd3N0b25lLXJ1YnkubGVzcworKysgYi90aGVtZXMvcmFpbmJvd3N0b25lL3dlYmFwcC9yYWluYm93c3RvbmUvcmFpbmJvd3N0b25lLXJ1YnkubGVzcwpAQCAtMSwxOTk1ICsxLDE5OTUgQEAKLS8qIGNvbW1vbiBjb2xvcnMgKi8NCi1AYmxhY2s6ICMwMDA7DQotQHdoaXRlOiAjZmZmOw0KLUBncmV5OiAjZTZlNmU2Ow0KLUBncmV5ZGFyazogIzkyOTI5MjsNCi0NCi1AY29sb3Itc3VjY2VzczogIzhjZmY4YzsNCi1AZm9udC1jb2xvci1mb3Itc3VjY2VzczogQGJsYWNrOw0KLUBjb2xvci1hbGVydDogI2ZmOGM4YzsNCi1AZm9udC1jb2xvci1mb3ItYWxlcnQ6IEBibGFjazsNCi0NCi1AY29sb3Itc3VjY2Vzcy1kYXJrOiAjMzU2ZTM1Ow0KLUBmb250LWNvbG9yLWZvci1zdWNjZXNzOiBAYmxhY2s7DQotQGNvbG9yLWFsZXJ0LWRhcms6ICM5MzJmMzM7DQotQGZvbnQtY29sb3ItZm9yLWFsZXJ0OiBAYmxhY2s7DQotDQotQGNvbG9yLWJhY2tncm91bmQtYWxlcnQ6ICNmMmRlZGU7DQotQGNvbG9yLWZvbnQtYWxlcnQ6ICNhOTQ0NDI7DQotQGNvbG9yLWJvcmRlci1hbGVydDogI2ViY2NkMTsNCi0NCi1AY29sb3ItYmFja2dyb3VuZC1zdWNjZXNzOiAjZGZmMGQ4Ow0KLUBjb2xvci1mb250LXN1Y2Nlc3M6ICMzYzc2M2Q7DQotQGNvbG9yLWJvcmRlci1zdWNjZXNzOiAjZDZlOWM2Ow0KLQ0KLS8qIFNhcGhpciBjb2xvcnMgKi8NCi1AYmx1ZS1kYXJrOiAjMDAyMzMzOw0KLUBibHVlLW1haW46ICMwMDU5ODI7DQotQGJsdWUtbWVkaXVtOiAjYzdkZmZmOw0KLUBibHVlLWxpZ2h0OiAjZjFmN2ZmOw0KLUBibHVlLWxpZ2h0MjogI2U0ZjBmNTsNCi0NCi0vKiBSdWJ5IGNvbG9ycyAqLw0KLUByZWQtZGFyazogIzQyMDAwMDsNCi1AcmVkLW1haW46ICNiZjE2MTY7DQotQHJlZC1tZWRpdW06ICNmN2JhYmE7DQotQHJlZC1saWdodDogI2ZjZTdlNzsNCi1AcmVkLWxpZ2h0MjogI2ZlZDdjOTsNCi0NCi0vKiBFbWVyYWxkIGNvbG9ycyAqLw0KLUBncmVlbi1kYXJrOiAjMTk3OTQ4Ow0KLUBncmVlbi1tYWluOiAjMjNhZjliOw0KLUBncmVlbi1tZWRpdW06ICM3YWUzYWQ7DQotQGdyZWVuLWxpZ2h0OiAjZTVmOWVmOw0KLUBncmVlbi1saWdodDI6ICNkN2Y5ZWY7DQotDQotLyogQW1iZXIgY29sb3JzICovDQotQGFtYmVyLWRhcms6ICNiYzQyMTY7DQotQGFtYmVyLW1haW46ICNmMDg5MDY7DQotQGFtYmVyLW1lZGl1bTogI2Y1YzRiMzsNCi1AYW1iZXItbGlnaHQ6ICNmY2VkZTg7DQotQGFtYmVyLWxpZ2h0MjogI2ZjZWRjZDsNCi0NCi0vKiBTYXBoaXIgdGhlbWUgKi8NCi0vKg0KLUBtYWluLWNvbG9yLXRoZW1lIDogQGJsdWUtbWFpbjsNCi1AZGFyay1jb2xvci10aGVtZSA6IEBibHVlLWRhcms7DQotQG1lZGl1bS1jb2xvci10aGVtZSA6IEBibHVlLW1lZGl1bTsNCi1AbGlnaHQtY29sb3ItdGhlbWUgOiBAYmx1ZS1saWdodDsNCi1AbGlnaHQyLWNvbG9yLXRoZW1lIDogQGJsdWUtbGlnaHQyOw0KLUBmb250LWNvbG9yLWZvci1kYXJrIDogQGdyZXk7DQotQGZvbnQtY29sb3ItZm9yLW1haW4gOiBAd2hpdGU7DQotQGZvbnQtY29sb3ItZm9yLW1lZGl1bSA6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLUBmb250LWNvbG9yLWZvci1saWdodCA6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLUBzaGFkb3ctY29sb3IgOiBAYmxhY2s7DQotQHNoYWRvdy1jb2xvci1saWdodCA6IEBncmV5ZGFyazsNCi0qLw0KLQ0KLS8qIFJ1YnkgdGhlbWUgKi8NCi0NCi1AbWFpbi1jb2xvci10aGVtZSA6IEByZWQtbWFpbjsNCi1AZGFyay1jb2xvci10aGVtZSA6IEByZWQtZGFyazsNCi1AbWVkaXVtLWNvbG9yLXRoZW1lIDogQHJlZC1tZWRpdW07DQotQGxpZ2h0LWNvbG9yLXRoZW1lIDogQHJlZC1saWdodDsNCi1AbGlnaHQyLWNvbG9yLXRoZW1lIDogQHJlZC1saWdodDI7DQotQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAZ3JleTsNCi1AZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsNCi1AZm9udC1jb2xvci1mb3ItbWVkaXVtIDogQGRhcmstY29sb3ItdGhlbWU7DQotQGZvbnQtY29sb3ItZm9yLWxpZ2h0IDogQGRhcmstY29sb3ItdGhlbWU7DQotQHNoYWRvdy1jb2xvciA6IEBibGFjazsNCi1Ac2hhZG93LWNvbG9yLWxpZ2h0IDogQGdyZXlkYXJrOw0KLQ0KLQ0KLS8qIEVtZXJhbGQgdGhlbWUgKi8NCi0vKg0KLUBtYWluLWNvbG9yLXRoZW1lIDogQGdyZWVuLW1haW47DQotQGRhcmstY29sb3ItdGhlbWUgOiBAZ3JlZW4tZGFyazsNCi1AbWVkaXVtLWNvbG9yLXRoZW1lIDogQGdyZWVuLW1lZGl1bTsNCi1AbGlnaHQtY29sb3ItdGhlbWUgOiBAZ3JlZW4tbGlnaHQ7DQotQGxpZ2h0Mi1jb2xvci10aGVtZSA6IEBncmVlbi1saWdodDI7DQotQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAd2hpdGU7DQotQGZvbnQtY29sb3ItZm9yLW1haW4gOiBAd2hpdGU7DQotQGZvbnQtY29sb3ItZm9yLW1lZGl1bSA6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLUBmb250LWNvbG9yLWZvci1saWdodCA6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLUBzaGFkb3ctY29sb3IgOiBAYmxhY2s7DQotQHNoYWRvdy1jb2xvci1saWdodCA6IEBncmV5ZGFyazsNCi0qLw0KLS8qIEFtYmVyIHRoZW1lICovDQotLyoNCi1AbWFpbi1jb2xvci10aGVtZSA6IEBhbWJlci1tYWluOw0KLUBkYXJrLWNvbG9yLXRoZW1lIDogQGFtYmVyLWRhcms7DQotQG1lZGl1bS1jb2xvci10aGVtZSA6IEBhbWJlci1tZWRpdW07DQotQGxpZ2h0LWNvbG9yLXRoZW1lIDogQGFtYmVyLWxpZ2h0Ow0KLUBsaWdodDItY29sb3ItdGhlbWUgOiBAYW1iZXItbGlnaHQyOw0KLUBmb250LWNvbG9yLWZvci1kYXJrIDogQHdoaXRlOw0KLUBmb250LWNvbG9yLWZvci1tYWluIDogQHdoaXRlOw0KLUBmb250LWNvbG9yLWZvci1tZWRpdW0gOiBAZGFyay1jb2xvci10aGVtZTsNCi1AZm9udC1jb2xvci1mb3ItbGlnaHQgOiBAZGFyay1jb2xvci10aGVtZTsNCi1Ac2hhZG93LWNvbG9yIDogQGJsYWNrOw0KLUBzaGFkb3ctY29sb3ItbGlnaHQgOiBAZ3JleWRhcms7DQotKi8NCi0NCi0NCi1AYXBwLWJhci1oZWlnaHQ6IDYwcHg7DQotQHN1Yi1hcHAtYmFyLWhlaWdodDogNDBweDsNCi1AZm9vdGVyLWhlaWdodDogMjBweDsNCi1AaG9tZS1idG4td2lkdGg6IDQ3cHg7DQotQGNvbG9yLWxpbmUtaGVpZ2h0OiA5cHg7DQotDQotQGhvbWUtbWVudS10aWxlLWhlaWdodDogODBweDsNCi1AaG9tZS1tZW51LXRpbGUtbWluLXdpZHRoOiAxMDBweDsNCi1AaG9tZS1tZW51LXRpbGUtbWF4LXdpZHRoOiAxMDBweDsNCi0NCi1AdGhpcmQtbHZsLWhlaWdodDogODBweDsNCi1AdGhpcmQtbHZsLXdpZHRoIDogMTAwcHg7DQotQG1pbi1zY3JlZW4gOiAxMTcwcHg7DQotQG1pbi1jb250YWluZXItd2lkdGg6IDExMzBweDsNCi0NCi1AYm94LWJvcmRlci1jb2xvcjogI2Q3ZDdkNzsNCi0NCi1AZm9udC1mYWNlIHsNCi0gIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gIHNyYzogdXJsKCdmb250cy9xdWlja3NhbmQvcXVpY2tzYW5kYm9sZC5vdGYnKTsNCi0gIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICBmb250LXN0eWxlOiBub3JtYWw7DQotfQ0KLQ0KLUBmb250LWZhY2Ugew0KLSAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgc3JjOiB1cmwoJ2ZvbnRzL3F1aWNrc2FuZC9xdWlja3NhbmRib2xkLm90ZicpOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBmb250LXN0eWxlOiBub3JtYWw7DQotfQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiBCZWdpbiBzcGVjaWFsIGNoZWNrYm94IHR5cGUgc3dpdGNoICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLWNoa2JveCwgW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94IHsNCi0gIGRpc3BsYXk6IG5vbmU7DQotfQ0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLWNoa2JveCArIGxhYmVsLA0KLVt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCArIGxhYmVsew0KLSAgY3Vyc29yOiBwb2ludGVyOw0KLX0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1jaGtib3ggKyBsYWJlbDpiZWZvcmUsDQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94ICsgbGFiZWw6YmVmb3Jlew0KLSAgY29udGVudDogIiI7DQotICB3aWR0aDogMTUwcHg7DQotICBtaW4td2lkdGg6IDE1MHB4Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lOw0KLSAgcGFkZGluZzogMnB4IDIwcHggMnB4IDIwcHg7DQotICBib3JkZXItcmFkaXVzOiA4cHggOHB4IDhweCA4cHg7DQotDQotICBjdXJzb3I6IHBvaW50ZXI7DQotfQ0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLWNoa2JveCArIGxhYmVsOmFmdGVyLA0KLVt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCArIGxhYmVsOmFmdGVyew0KLSAgY29udGVudDogIiI7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBsZWZ0Oi0zNXB4Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICBtaW4taGVpZ2h0OiAxMHB4Ow0KLSAgbWluLXdpZHRoOiAxMHB4Ow0KLSAgcGFkZGluZy1sZWZ0OiA0cHg7DQotICBwYWRkaW5nLXJpZ2h0OiA1cHg7DQotICBib3JkZXItcmFkaXVzOiA4cHggOHB4IDhweCA4cHg7DQotICB0cmFuc2l0aW9uOiBhbGwgLjJzOw0KLX0NCi0NCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1jaGtib3ggKyBsYWJlbDphZnRlcnsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGxlZnQ6IC0xNXB4Ow0KLSAgdHJhbnNpdGlvbjogYWxsIC4yczsNCi19DQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qIEVuZCBzcGVjaWFsIGNoZWNrYm94IHR5cGUgc3dpdGNoICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgQmVnaW4gc3F1YXJlIENoZWNrYm94ICAgICAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3gsDQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveHsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIGxlZnQ6IC05OTk5cHg7DQotfQ0KLQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbCwNCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWx7DQotICBjb250ZW50OiAnJzsNCi0gIHBhZGRpbmctbGVmdDogMzVweDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi0gIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gIGZvbnQtc2l6ZTogMTJweDsNCi0NCi19DQotW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmJlZm9yZSwNCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YmVmb3Jlew0KLSAgY29udGVudDogJyc7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICBsZWZ0OjEwcHg7DQotICB0b3A6IC00cHg7DQotICB3aWR0aDogMTdweDsNCi0gIGhlaWdodDogMTdweDsgLyogZGltLiBkZSBsYSBjYXNlICovDQotICBib3JkZXI6IDFweCBzb2xpZCAjYWFhOw0KLSAgYmFja2dyb3VuZDogQGxpZ2h0LWNvbG9yLXRoZW1lOw0KLSAgYm9yZGVyLXJhZGl1czogMnB4Ow0KLX0NCi0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YmVmb3JlIHsNCi0gIGJhY2tncm91bmQ6IEBsaWdodC1jb2xvci10aGVtZTsNCi19DQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmJlZm9yZXsNCi0gIGJhY2tncm91bmQ6IEBtYWluLWNvbG9yLXRoZW1lOw0KLX0NCi0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YWZ0ZXIsDQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyew0KLSAgY29udGVudDogJ+KclCc7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICB0b3A6IC00cHg7DQotICBsZWZ0OiAxNHB4Ow0KLSAgZm9udC1zaXplOiAxNnB4Ow0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgdHJhbnNpdGlvbjogYWxsIC4yczsNCi19DQotW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyIHsNCi0gIG9wYWNpdHk6IDA7DQotICB0cmFuc2Zvcm06IHNjYWxlKDApOw0KLX0NCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YWZ0ZXIgew0KLSAgb3BhY2l0eTogMTsNCi0gIHRyYW5zZm9ybTogc2NhbGUoMSk7DQotfQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogIEVuZCBzcXVhcmUgQ2hlY2tib3ggICAgICAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogIEJlZ2luIGNsYXNzIGNvbnRlbnQgbWdtdCAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLQ0KLS5mbGV4LXJvdyB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdyAhaW1wb3J0YW50Ow0KLX0NCi0uZmxleC1jb2x1bW4gew0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47DQotfQ0KLQ0KLS5jb2wtd2lkdGgtMSB7DQotICB3aWR0aDogMTAlOw0KLX0NCi0uY29sLXdpZHRoLTIgew0KLSAgd2lkdGg6IDIwJTsNCi19DQotLmNvbC13aWR0aC0zIHsNCi0gIHdpZHRoOiAzMCU7DQotfQ0KLS5jb2wtd2lkdGgtNCB7DQotICB3aWR0aDogNDAlOw0KLX0NCi0uY29sLXdpZHRoLTUgew0KLSAgd2lkdGg6IDUwJTsNCi19DQotLmNvbC13aWR0aC02IHsNCi0gIHdpZHRoOiA2MCU7DQotfQ0KLS5jb2wtd2lkdGgtNyB7DQotICB3aWR0aDogNzAlOw0KLX0NCi0uY29sLXdpZHRoLTggew0KLSAgd2lkdGg6IDgwJTsNCi19DQotLmNvbC13aWR0aC05IHsNCi0gIHdpZHRoOiA5MCU7DQotfQ0KLS5jb2wtd2lkdGgtMTAgew0KLSAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLS5hbGlnbi12LWNlbnRlciB7DQotICBkaXNwbGF5OmZsZXg7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLX0NCi0NCi0uYWxpZ24taC1jZW50ZXIgew0KLSAgZGlzcGxheTpmbGV4Ow0KLSAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotfQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQotLyogICAgRW5kIGNsYXNzIGNvbnRlbnQgbWdtdCAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgQmVnaW4gYnRuLXNvcnQgICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0uYnRuLXNvcnQgew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgdG9wOiAtNnB4Ow0KLSAgYm9yZGVyOm5vbmU7DQotICBiYWNrZ3JvdW5kOm5vbmU7DQotICBib3JkZXItcmFkaXVzOiAwOw0KLSAgbWFyZ2luLWxlZnQ6NXB4Ow0KLX0NCi0NCi0uYnRuLXNvcnQ6YmVmb3Jlew0KLSAgY29udGVudDogJyc7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICBsZWZ0OiAtMXB4Ow0KLSAgd2lkdGg6IDA7DQotICBoZWlnaHQ6IDA7DQotICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotICBib3JkZXItYm90dG9tOiAxMHB4IHNvbGlkIEBncmV5ZGFyazsNCi0gIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLX0NCi0NCi0uYnRuLXNvcnQ6YWZ0ZXJ7DQotICBjb250ZW50OiAnJzsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHJpZ2h0OiAtMXB4Ow0KLSAgd2lkdGg6IDA7DQotICBoZWlnaHQ6IDA7DQotICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIEBncmV5ZGFyazsNCi0gIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLSAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTM0OXB4KSB7DQotICAgIHJpZ2h0OiAtNXB4Ow0KLSAgfQ0KLX0NCi0NCi0uYnRuLXNvcnQuYnRuLXNvcnQtYXNjOmJlZm9yZXsNCi0gIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgQG1haW4tY29sb3ItdGhlbWU7DQotfQ0KLQ0KLS5idG4tc29ydC5idG4tc29ydC1kZXNjOmFmdGVyew0KLSAgYm9yZGVyLXRvcDogMTBweCBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsNCi19DQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICBFbmQgYnRuLXNvcnQgICAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgQmVnaW4gZGVmYXV0IGNvbG91ciBjbGFzcyAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS5kYXJrLWNvbG9yIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcmsgIWltcG9ydGFudDsNCi19DQotLm1haW4tY29sb3Igew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbiAhaW1wb3J0YW50Ow0KLX0NCi0ubWVkaXVtLWNvbG9yIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtZWRpdW0tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWVkaXVtICFpbXBvcnRhbnQ7DQotfQ0KLS5saWdodC1jb2xvciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQtY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbGlnaHQgIWltcG9ydGFudDsNCi19DQotLmxpZ2h0Mi1jb2xvciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQyLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWxpZ2h0ICFpbXBvcnRhbnQ7DQotfQ0KLQ0KLS5ncmV5LWNvbG9yIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBncmV5ICFpbXBvcnRhbnQ7DQotfQ0KLS5kYXJrZ3JleS1jb2xvciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleWRhcmsgIWltcG9ydGFudDsNCi19DQotDQotLyogYmVnaW4gbG9va3VwIHdpZGdldCAqLw0KLS51aS1kaWFsb2cgew0KLSAgb3BhY2l0eTogMTsNCi0gIHotaW5kZXg6IDUwOw0KLX0NCi0NCi0udWktZGlhbG9nLXRpdGxlYmFyLnVpLXdpZGdldC1oZWFkZXIudWktY29ybmVyLWFsbC51aS1oZWxwZXItY2xlYXJmaXggew0KLSAgYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGJ1dHRvbiB7DQotICAgIGJhY2tncm91bmQ6IG5vbmU7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBsaWdodC1jb2xvci10aGVtZTsNCi0gIH0NCi19DQotLyogZW5kIGxvb2t1cCB3aWRnZXQgKi8NCi0NCi0ubWFpbi1iYXItbGFiZWwgew0KLSAgY29sb3I6IEBsaWdodC1jb2xvci10aGVtZTsNCi0gIHBhZGRpbmctbGVmdDogM3B4Ow0KLSAgcGFkZGluZy1yaWdodDogNnB4Ow0KLSAgZm9udC1zaXplOiAxNXB4Ow0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLSNjb21wYW55LWxvZ28gew0KLSAgcmlnaHQ6IDEwcHg7DQotICB0b3A6IDJweDsNCi0gIGJhY2tncm91bmQ6IHVybCgiaW1hZ2VzL29mYml6LXNpbXBsZS13aGl0ZS5zdmciKSBuby1yZXBlYXQgbGVmdCB0b3AgLyBjb3ZlcjsNCi0gIG1pbi1oZWlnaHQ6IDUwcHg7DQotICBtaW4td2lkdGg6IDUwcHg7DQotICBtYXJnaW4tcmlnaHQ6IDE1cHg7DQotICBhbGlnbi1zZWxmOiBjZW50ZXI7DQotICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoIDogMTIzMnB4KSB7DQotICAgIG1pbi1oZWlnaHQ6IDUwcHg7DQotICAgIG1pbi13aWR0aDogMTI5cHg7DQotICAgIGJhY2tncm91bmQ6IHVybCgiaW1hZ2VzL29mYml6LXdoaXRlLnN2ZyIpIG5vLXJlcGVhdCBsZWZ0IHRvcCAvIGNvdmVyOw0KLSAgfQ0KLX0NCi0NCi0ubW9kYWwtc2NyZWVuIHsNCi0gIHZpc2liaWxpdHk6IGhpZGRlbjsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7DQotICBvcGFjaXR5OiAuOTM7DQotICBwb3NpdGlvbjogZml4ZWQ7DQotICB0b3A6IDA7DQotICBsZWZ0OiAwOw0KLSAgaGVpZ2h0OiAxMDAlOw0KLSAgd2lkdGg6IDEwMCU7DQotICB6LWluZGV4OiA5OTk5Ow0KLX0NCi0NCi0ubW9kYWwtYm94ew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgb3BhY2l0eTogMTsNCi0gIG1hcmdpbjogMTAlOw0KLSAgYm9yZGVyLXJhZGl1czogMTBweDsNCi0gIGJvcmRlcjogc29saWQgMnB4IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgcGFkZGluZyA6IDEwcHggNDBweCAxMHB4IDQwcHg7DQotICAubW9kYWwtaGVhZGVyIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgICBoMiB7DQotICAgICAgZm9udC1zaXplOiAyNXB4Ow0KLSAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICB9DQotICAgIC5idG4tY2xvc2UtbnJkIHsNCi0gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgICAgcmlnaHQ6IDA7DQotICAgICAgZGlzcGxheTogZmxleDsNCi0gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgICBib3JkZXI6IHNvbGlkIDFweCBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgICBib3JkZXItcmFkaXVzOiA1cHg7DQotICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICAgIGZvbnQtc2l6ZTogMjVweDsNCi0gICAgICBoZWlnaHQ6IDMwcHg7DQotICAgICAgd2lkdGg6IDMwcHg7DQotICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7DQotICAgIH0NCi0gIH0NCi0gIC5tb2RhbC1ib2R5IHsNCi0gICAgcCB7DQotICAgICAgZm9udC1zaXplOiAyMHB4Ow0KLSAgICB9DQotICB9DQotICAubW9kYWwtZm9vdGVyIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICBoZWlnaHQ6IDM1cHg7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7DQotICAgIC5idG4tbnJkIHsNCi0gICAgICBiYWNrZ3JvdW5kOiBub25lOw0KLSAgICAgIGJvcmRlcjogbm9uZTsNCi0gICAgICB0ZXh0LXNoYWRvdzogbm9uZTsNCi0gICAgICBvcGFjaXR5OiAxOw0KLSAgICAgIG1hcmdpbi1yaWdodDogMTBweDsNCi0gICAgICBmb250LXNpemU6IDIwcHg7DQotICAgICAgcGFkZGluZzogNXB4Ow0KLSAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsNCi0gICAgfQ0KLSAgICAuYnRuLW5yZC1tYWluIHsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgICBjb2xvcjogQHdoaXRlOw0KLSAgICB9DQotICAgIC5idG4tbnJkLXN0ZCB7DQotICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgICBib3JkZXI6IHNvbGlkIDFweCBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgICB9DQotICB9DQotfQ0KLS5idG4tbnJkOmhvdmVyIHsNCi0gIGJveC1zaGFkb3c6IDVweCA1cHggM3B4IDAgQGJsYWNrOw0KLX0NCi0NCi0uYnRuLW5yZC1zdGQ6aG92ZXIgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIGNvbG9yOiBAd2hpdGUgIWltcG9ydGFudDsNCi0gIGJvcmRlcjogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotfQ0KLQ0KLS5idG4tY2xvc2UtbnJkOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICBjb2xvcjogQHdoaXRlICFpbXBvcnRhbnQ7DQotfQ0KLQ0KLS5saXN0LW5yZCB7DQotICBib3JkZXI6IHNvbGlkIDJweCBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDEwcHg7DQotICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMTBweDsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KLSAgbWFyZ2luLXRvcDogMTVweDsNCi0gIG1hcmdpbi1ib3R0b206IDE1cHg7DQotICAudGl0bGUtbGlzdC1ucmQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgY29sb3IgOiBAd2hpdGU7DQotICAgIGZvbnQtc2l6ZTogMjBweDsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIHBhZGRpbmctbGVmdDogNXB4Ow0KLSAgfQ0KLQ0KLSAgbGkgew0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7DQotICAgIGZvbnQtc2l6ZTogMjBweDsNCi0gICAgcGFkZGluZy1sZWZ0OiA1cHg7DQotICAgIHBhZGRpbmctdG9wOiAycHg7DQotICAgIHBhZGRpbmctYm90dG9tOiAycHg7DQotICAgIG1hcmdpbi1ib3R0b206IDNweDsNCi0gICAgYSB7DQotICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICB9DQotICAgIHNwYW4gew0KLSAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgICByaWdodDogMDsNCi0gICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgICAgZm9udC1zaXplOiAzMHB4Ow0KLSAgICB9DQotICB9DQotfQ0KLWxpLmxpbmUtb2RkIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBsaWdodC1jb2xvci10aGVtZTsNCi19DQotDQotI3VzZXItYXZhdGFyIHsNCi0gIGhlaWdodDogNDBweDsNCi0gIHdpZHRoOiA0MHB4Ow0KLSAgcGFkZGluZzogMnB4Ow0KLQ0KLSAgYWxpZ24tc2VsZjogY2VudGVyOw0KLQ0KLSAgOmhvdmVyIHsNCi0gICAgY3Vyc29yOiBwb2ludGVyOw0KLSAgfQ0KLSAgaW1nIHsNCi0gICAgbWF4LWhlaWdodDogNDBweDsNCi0gICAgbWF4LXdpZHRoOiA0MHB4Ow0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIHRvcDogLTJweDsNCi0gICAgcGFkZGluZzogMnB4Ow0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICAgIGJvcmRlci1yYWRpdXM6IDJweDsNCi0gIH0NCi19DQotDQotI21haW4tbmF2aWdhdGlvbi1iYXIgew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgd2lkdGg6IDEwMCU7DQotICBtaW4td2lkdGg6IEBtaW4tY29udGFpbmVyLXdpZHRoOw0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiByb3c7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KLSAgZm9udC1mYW1pbHk6IFF1aWNrc2FuZCxzYW5zLXNlcmlmOw0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICB6LWluZGV4OiA1Ow0KLSAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQ7DQotfQ0KLSNtYWluLW5hdi1iYXItbGVmdCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi19DQotI21haW4tbmF2LWJhci1yaWdodCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gIHBhZGRpbmctcmlnaHQ6IDE1cHg7DQotfQ0KLQ0KLS5hcHAtYnRuew0KLSAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQ7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gIG1hcmdpbi1yaWdodDogMnB4Ow0KLSAgbWFyZ2luLWxlZnQ6IDJweDsNCi0gIGEgew0KLSAgICBwYWRkaW5nOjEwcHg7DQotICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgZm9udC1zaXplOiAxLjRlbSAhaW1wb3J0YW50Ow0KLSAgfQ0KLX0NCi0NCi0uYXBwLWJ0biBhOnZpc2l0ZWQgew0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLX0NCi0NCi0uYXBwLWJ0bjpob3ZlcnsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIHRvcDogLTZweDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNXB4Ow0KLSAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDVweDsNCi0gIGJveC1zaGFkb3c6IDFweCAxcHggMTJweCBAc2hhZG93LWNvbG9yOw0KLSAgYSB7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gICAgdG9wOiA2cHg7DQotICAgIGNvbG9yIDogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICB9DQotfQ0KLS5hcHAtYnRuLnNlbGVjdGVkOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgYm94LXNoYWRvdzogbm9uZTsNCi0gIHRvcDowOw0KLX0NCi0NCi0uYXBwLWJ0biBhOmhvdmVyIHsNCi0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotI2FwcC1zZWxlY3RlZCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgYm94LXNoYWRvdzogMXB4IC0ycHggMTJweCBAc2hhZG93LWNvbG9yOw0KLSAgei1pbmRleDogMDsNCi0gIG9wYWNpdHk6IC45OTsNCi0gIGJvcmRlci10b3AtbGVmdC1yYWRpdXMgOiA4cHggOw0KLSAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMgOiA4cHggOw0KLSAgYSB7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gICAgdG9wOiAzcHg7DQotICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gIH0NCi19DQotLmFwcC1idG4uc2VsZWN0ZWQgYTpob3ZlciB7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLSNhcHAtYmFyLWxpbmUgew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgd2lkdGg6IDEwMCU7DQotICBtaW4td2lkdGg6IEBtaW4tY29udGFpbmVyLXdpZHRoOw0KLSAgaGVpZ2h0OiBAY29sb3ItbGluZS1oZWlnaHQ7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGJveC1zaGFkb3c6IDJweCAycHggNXB4IEBzaGFkb3ctY29sb3I7DQotfQ0KLSNjb2xvci1hZGQgew0KLSAgd2lkdGg6IDE1MHB4Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBoZWlnaHQ6IEBjb2xvci1saW5lLWhlaWdodDsNCi0gIHotaW5kZXg6IDIwOw0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgdG9wOiBAY29sb3ItbGluZS1oZWlnaHQ7DQotfQ0KLQ0KLSNtb3JlLWFwcCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBmb250LXNpemU6IDEuNGVtICFpbXBvcnRhbnQ7DQotICB3aWR0aDogNDBweDsNCi0gIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0Ow0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLX0NCi0jbW9yZS1hcHA6aG92ZXIgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLSNtb3JlLWFwcDpob3ZlciAjbW9yZS1hcHAtbGlzdCB7DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotI21vcmUtYXBwLnNlbGVjdGVkIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLX0NCi0NCi0jbW9yZS1hcHAtbGlzdCB7DQotICBkaXNwbGF5OiBub25lOw0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgdG9wOiBAYXBwLWJhci1oZWlnaHQ7DQotICBsZWZ0OiAtMjBweDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgei1pbmRleDogMTA7DQotICBib3JkZXI6IHNvbGlkIDRweCBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGJvcmRlci10b3Atd2lkdGg6IEBjb2xvci1saW5lLWhlaWdodDsNCi0gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsNCi0gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7DQotICBsaSB7DQotICAgIHBhZGRpbmctbGVmdCA6IDRweDsNCi0gICAgcGFkZGluZy1yaWdodDogNHB4Ow0KLSAgfQ0KLQ0KLSAgYSB7DQotICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgZm9udC1zaXplOiAxNXB4Ow0KLSAgfQ0KLQ0KLSAgOmhvdmVyIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQG1lZGl1bS1jb2xvci10aGVtZTsNCi0gICAgYSB7DQotICAgICAgYm94LXNoYWRvdzogbm9uZTsNCi0gICAgICBjb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICAgIH0NCi0gICAgYTpob3ZlcnsNCi0gICAgICBib3gtc2hhZG93OiBub25lOw0KLSAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gICAgICBib3JkZXItcmFkaXVzOiAwOw0KLSAgICB9DQotICB9DQotDQotICBsaS5zZWxlY3RlZCB7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICBhIHsNCi0gICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICAgIH0NCi0gICAgYTpob3ZlciB7DQotICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLSNob21lQnV0dG9uIHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICAvL3Zpc2liaWxpdHk6IGhpZGRlbjsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gIGJhY2tncm91bmQtY29sb3I6QGdyZXk7DQotICBib3JkZXI6IG5vbmU7DQotICBib3JkZXItcmFkaXVzIDogMDsNCi0NCi0gIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0Ow0KLSAgd2lkdGggOiBAaG9tZS1idG4td2lkdGg7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICBpbWcgew0KLSAgICBoZWlnaHQ6IDI1cHg7DQotICAgIHRyYW5zaXRpb246IGFsbCAuMnMgZWFzZS1pbi1vdXQ7DQotICB9DQotfQ0KLQ0KLSNob21lQnV0dG9uOmhvdmVyIGltZyB7DQotICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7DQotfQ0KLQ0KLSNhcHAtYmFyLWxpc3Qgew0KLSAgZGlzcGxheTogZmxleDsNCi19DQotDQotI3VzZXItZGV0YWlscyB7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICByaWdodDogMjBweDsNCi0gIHRvcCA6IDYycHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIGNvbG9yIDogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICBmb250LXNpemU6IDE1cHg7DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIHBhZGRpbmctdG9wOiA1cHg7DQotICBwYWRkaW5nLWJvdHRvbTogMTBweDsNCi0gIHotaW5kZXg6IDE1Ow0KLSAgYm94LXNoYWRvdzogM3B4IDNweCAxMnB4IEBzaGFkb3ctY29sb3I7DQotICBib3JkZXItcmFkaXVzOiAzcHg7DQotICB0cmFuc2l0aW9uOiBhbGwgLjFzIGVhc2UtaW4tb3V0Ow0KLQ0KLSAgaW1nIHsNCi0gICAgaGVpZ2h0OiA1MHB4Ow0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICAgIHBhZGRpbmc6IDRweDsNCi0gICAgYm9yZGVyLXJhZGl1cyA6IDNweDsNCi0gICAgbWFyZ2luLWxlZnQ6IDEwcHg7DQotICAgIG1hcmdpbi1yaWdodDogNXB4Ow0KLSAgfQ0KLSAgI2xvZ291dCB7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gICAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICAgIGJvcmRlci1yYWRpdXM6IDJweDsNCi0gICAgOmhvdmVyIHsNCi0gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICAgIH0NCi0gIH0NCi19DQotDQotI3VzZXItZGV0YWlsczphZnRlcnsNCi0gIGNvbnRlbnQ6ICcnOw0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgdG9wOiAtMTBweDsNCi0gIHJpZ2h0OiA1cHg7DQotICB3aWR0aDogMDsNCi0gIGhlaWdodDogMDsNCi0gIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi0gIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgQGRhcmstY29sb3ItdGhlbWU7DQotICBib3JkZXItbGVmdDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi19DQotDQotYS51c2VyLXByZWYtYnRuIHsNCi0gIG1hcmdpbi10b3A6IDE1cHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIG1hcmdpbi1sZWZ0OiAxMHB4Ow0KLSAgbWFyZ2luLXJpZ2h0OiAxMHB4Ow0KLSAgcGFkZGluZy10b3A6IDJweDsNCi0gIHBhZGRpbmctYm90dG9tOiAycHg7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcmsgIWltcG9ydGFudDsNCi0gIDpob3ZlciB7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gIH0NCi19DQotDQotI3VzZXItbmFtZSB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCi0gIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgYWxpZ24tY29udGVudDogY2VudGVyOw0KLSAgcGFkZGluZy1sZWZ0IDogNXB4Ow0KLSAgcGFkZGluZy1yaWdodCA6IDVweDsNCi0gIHNwYW4gew0KLSAgICBtaW4td2lkdGg6IDEwMHB4Ow0KLSAgICBwYWRkaW5nLWJvdHRvbSA6IDVweDsNCi0gICAgcGFkZGluZy10b3AgOiA1cHg7DQotICB9DQotfQ0KLQ0KLSN1c2VyLXJvdzEgew0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiByb3c7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICN1c2VyLWxhbmcgew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgYWxpZ24tY29udGVudDogY2VudGVyOw0KLSAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQotICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7DQotICAgIHNwYW4gew0KLSAgICAgIG1pbi13aWR0aDogMzBweDsNCi0gICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgIH0NCi0gIH0NCi19DQotDQotLmFwcGJhci1idG4taW1nIHsNCi0gIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0IC0gNDBweDsNCi19DQotDQotI2hlbHAtYnRuIHsNCi0gIGZvbnQtc2l6ZTogMTBweDsNCi0gIG1pbi13aWR0aDogMjBweDsNCi0gIG1hcmdpbi1yaWdodDogMTVweDsNCi19DQotLyogQmVnaW4gc3ViIE1lbnUgc2VjdGlvbiAqLw0KLQ0KLSNhcHAtbmF2aWdhdGlvbiB7DQotICBoZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQ7DQotICBib3JkZXItcmlnaHQ6IHNvbGlkIDFweCBAYmxhY2s7DQotICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOw0KLSAgd2lkdGg6IDEwMCU7DQotICBtaW4td2lkdGg6IEBtaW4tY29udGFpbmVyLXdpZHRoOw0KLSAgaDIgew0KLSAgICBkaXNwbGF5OiBub25lOw0KLSAgfQ0KLSAgdWwgew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsNCi0gICAgZmxleC1ncm93OiAxOw0KLSAgfQ0KLSAgdWwgbGkgdWwgbGkgew0KLSAgICBib3JkZXItbGVmdDogc29saWQgMXB4IEBibGFjazsNCi0gICAgaGVpZ2h0OiBAc3ViLWFwcC1iYXItaGVpZ2h0Ow0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgICBqdXN0aWZ5LWl0ZW1zOiBjZW50ZXI7DQotICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICBtaW4td2lkdGg6IDc1cHg7DQotICAgIHBhZGRpbmctbGVmdDogNnB4Ow0KLSAgICBwYWRkaW5nLXJpZ2h0OiA2cHg7DQotICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBibGFjazsNCi0gICAgZm9udC1zaXplOiAxMnB4Ow0KLSAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxNTAwcHgpIHsNCi0gICAgICBmb250LXNpemU6IDEwcHg7DQotICAgICAgbWluLXdpZHRoOiA2NXB4Ow0KLSAgICB9DQotICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEzMDBweCkgew0KLSAgICAgIGZvbnQtc2l6ZTogMTBweDsNCi0gICAgICBtaW4td2lkdGg6IDUwcHg7DQotICAgIH0NCi0gICAgYSB7DQotICAgICAgZGlzcGxheTogZmxleDsNCi0gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCi0gICAgICBoZWlnaHQ6IDEwMCU7DQotICAgICAgd2lkdGg6IDEwMCU7DQotICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLSNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaTpsYXN0LWNoaWxkIHsNCi0gIGJvcmRlci1yaWdodDogc29saWQgMXB4IEBibGFjazsNCi19DQotDQotI2FwcC1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgbWluLWhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIC8vdG9wOiAtMXB4Ow0KLSAgYSB7DQotICAgIGNvbG9yOiBAd2hpdGU7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gIH0NCi19DQotI2FwcC1uYXZpZ2F0aW9uIHVsIGxpIHVsIGxpLnNlbGVjdGVkOmhvdmVyIHsNCi0gIGEgew0KLSAgICBjb2xvcjogQGJsYWNrICFpbXBvcnRhbnQ7DQotICB9DQotfQ0KLQ0KLSNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaS5zZWxlY3RlZCB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICB0b3A6IDFweDsNCi0gIGhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodCArIDFweDsNCi0gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAycHg7DQotICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAycHg7DQotICBib3JkZXItYm90dG9tOiBub25lOw0KLQ0KLSAgOmFmdGVyIHsNCi0gICAgY29udGVudDogJyc7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgdG9wOiAtMnB4Ow0KLSAgICBsZWZ0OiA1cHg7DQotICAgIHdpZHRoOiAwOw0KLSAgICBoZWlnaHQ6IDA7DQotICAgIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi0gICAgYm9yZGVyLXRvcDogMTBweCBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotICB9DQotDQotfQ0KLQ0KLQ0KLS8qIEVuZCBzdWIgTWVudSBzZWN0aW9uICovDQotDQotLyogYmVnaW4gc3ViIE1lbnUgc2VjdGlvbiAzcmQgbGV2ZWwgKi8NCi0NCi0uYnV0dG9uLWJhci50YWItYmFyIHsNCi0gIHVsIGxpIHVsIGxpIHsNCi0gICAgYm9yZGVyOiBzb2xpZCAxcHggQGdyZXk7DQotICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCi0gICAgYSB7DQotICAgICAgd2lkdGg6IDEwMCU7DQotICAgICAgaGVpZ2h0OiAxMDAlOw0KLSAgICB9DQotICB9DQotICBsaS5zZWxlY3RlZHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIGF7DQotICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgICB9DQotICB9DQotICB1bCBsaSB1bCBsaTpob3ZlciB7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICBhIHsNCi0gICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW4gOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLSN0aGlyZC1sZXZlbC1tZW51LWNvbnRhaW5lciB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi19DQotI3dvcmtpbmctYXJlYSB7DQotICB3aWR0aDogMTAwJTsNCi19DQotDQotI2xlZnQtY29sdW1uLW1lbnUgew0KLSAgd2lkdGg6IDEwMHB4Ow0KLX0NCi0NCi0udGhpcmQtbHZsLW1lbnUgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBsZWZ0OiAtMTBweDsNCi0gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7DQotICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4Ow0KLSAgcGFkZGluZy10b3A6IDRweDsNCi0gIHBhZGRpbmctYm90dG9tOiA0cHg7DQotICB1bCB7DQotICAgIGxpIHsNCi0gICAgICB1bCB7DQotICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgICAgICB0b3A6IDVweDsNCi0gICAgICAgIHdpZHRoOiBAdGhpcmQtbHZsLXdpZHRoOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLSAgaDIgew0KLSAgICB2aXNpYmlsaXR5OiBoaWRkZW47DQotICB9DQotfQ0KLS50aGlyZC1sZXZlbC1pdGVtOmxhc3QtY2hpbGQgew0KLSAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lOw0KLX0NCi0NCi0udGhpcmQtbGV2ZWwtaXRlbSB7DQotICBtaW4taGVpZ2h0OiBAdGhpcmQtbHZsLWhlaWdodDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgcGFkZGluZy1yaWdodDogM3B4Ow0KLSAgYm9yZGVyLXRvcDogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lOw0KLQ0KLSAgYSwgYTp2aXNpdGVkIHsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICAgIHdpZHRoOiAxMDAlOw0KLSAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcmsgIWltcG9ydGFudDsNCi0gICAgbWluLWhlaWdodDogQHRoaXJkLWx2bC1oZWlnaHQ7DQotICAgIG1heC13aWR0aDogQHRoaXJkLWx2bC13aWR0aDsNCi0gICAgdGV4dC1hbGlnbjogY2VudGVyOw0KLSAgfQ0KLX0NCi0udGhpcmQtbGV2ZWwtaXRlbS5zZWxlY3RlZCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBib3JkZXItbGVmdDogc29saWQgOXB4IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgYSwgYTp2aXNpdGVkIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgICBjb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIH0NCi0gIDphZnRlciB7DQotICAgIGNvbnRlbnQ6ICcnOw0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHRvcDogNXB4Ow0KLSAgICBsZWZ0OiAwOw0KLSAgICB3aWR0aDogMDsNCi0gICAgaGVpZ2h0OiAwOw0KLSAgICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLSAgICBib3JkZXItbGVmdDogMTBweCBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi0gIH0NCi19DQotDQotLnRoaXJkLWxldmVsLWl0ZW0gYTpob3ZlciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbiA7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLS8qIEVuZCAzcmQgbGV2ZWwgbWVudSAqLw0KLQ0KLQ0KLQ0KLS8qIEJlZ2luIEhvbWUgTWVudSBmb3IgSUIgc2VjdGlvbiAqLw0KLS5maXhlZC1uYXYtYmFyIHsNCi0gIHBvc2l0aW9uOiBmaXhlZCAhaW1wb3J0YW50Ow0KLSAgd2lkdGg6IDEwMCU7DQotfQ0KLSNuYXYtYmFyLW9mZnNldCB7DQotICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodCA7DQotfQ0KLQ0KLSNob21lR2x5cGggew0KLSAgbWFyZ2luLWxlZnQ6IDIwcHg7DQotICBoZWlnaHQ6IDIwcHg7DQotfQ0KLQ0KLSNob21lUGFnZVRpdGxlIHsNCi0gIGNvbG9yOiBAd2hpdGU7DQotICBmb250LXNpemU6IDIwcHg7DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIG1hcmdpbi1yaWdodDogMjBweDsNCi0gIG1hcmdpbi1sZWZ0OiAyMHB4Ow0KLX0NCi0uaG9tZS1tZW51LWxpc3Qgew0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLX0NCi0uaHAtYXBwbGlzdCB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gIGNvbG9yIDogQHdoaXRlOw0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gIC5hcHAtdGl0bGUgew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICAgIGhlaWdodDogQGhvbWUtbWVudS10aWxlLWhlaWdodDsNCi0gICAgcGFkZGluZzogNXB4IDEwcHggNXB4IDEwcHg7DQotICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCBAYmxhY2s7DQotICAgIHNwYW4gew0KLSAgICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZiAhaW1wb3J0YW50Ow0KLSAgICAgIGZvbnQtc2l6ZTogMTVweDsNCi0gICAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgICB3aWR0aDogMTEwcHg7DQotICAgICAgYSB7DQotICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICAgICAgICBjb2xvciA6IEB3aGl0ZTsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0NCi0gIC5ocC1tZW51LWl0ZW0gew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICBtYXJnaW4tbGVmdDogNXB4Ow0KLSAgICBtYXJnaW4tcmlnaHQ6IDVweDsNCi0gICAgYm9yZGVyOiBzb2xpZCAycHggQGdyZXk7DQotICAgIGJvcmRlci1yYWRpdXM6IDhweDsNCi0gICAgaGVpZ2h0OiBAaG9tZS1tZW51LXRpbGUtaGVpZ2h0IC0gNHB4Ow0KLSAgICBtaW4td2lkdGg6IEBob21lLW1lbnUtdGlsZS1taW4td2lkdGg7DQotICAgIG1heC13aWR0aDogQGhvbWUtbWVudS10aWxlLW1heC13aWR0aDsNCi0gICAgLm1lbnUtbGluayB7DQotICAgICAgZm9udC1zaXplOiAxMHB4Ow0KLSAgICAgIGNvbG9yOiBAYmxhY2s7DQotICAgICAgcGFkZGluZzogMTBweDsNCi0gICAgfQ0KLSAgICAuc3Rhci1saW5rIHsNCi0gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgICAgaGVpZ2h0OiAyNXB4Ow0KLSAgICAgIHRvcDogNXB4Ow0KLSAgICAgIHJpZ2h0OiA1cHg7DQotICAgIH0NCi0gIH0NCi0NCi19DQotLmhwLWFwcGxpc3QgLmFwcC10aXRsZSBzcGFuIGE6aG92ZXIgew0KLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0uaHAtbWVudS1pdGVtLmZhdm9yaXRlSXRlbSB7DQotICBib3JkZXI6IHNvbGlkIDJweCBAZGFyay1jb2xvci10aGVtZTsNCi19DQotDQotLmhwLW1lbnUtaXRlbTpob3ZlciB7DQotICBib3gtc2hhZG93OiAzcHggM3B4IDEycHggQHNoYWRvdy1jb2xvcjsNCi0gIGEgew0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICB9DQotfQ0KLQ0KLS8qIEVuZCBIb21lIE1lbnUgZm9yIElCIHNlY3Rpb24gKi8NCi0NCi0vKiBCZWdpbiBMb2dpbiBzY3JlZW5sZXQgKi8NCi0jbG9naW4tY29udGFpbmVyIHsNCi0gICNjb250ZW50LW1lc3NhZ2VzIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICB0b3A6IEBhcHAtYmFyLWhlaWdodDsNCi0gICAgYm9yZGVyLXJhZGl1czogNHB4Ow0KLSAgICB3aWR0aDogOTclOw0KLSAgICAmLmVycm9yTWVzc2FnZSB7DQotICAgICAgYmFja2dyb3VuZC1jb2xvciA6IEBjb2xvci1iYWNrZ3JvdW5kLWFsZXJ0ICFpbXBvcnRhbnQ7DQotICAgICAgY29sb3I6IEBjb2xvci1mb250LWFsZXJ0ICFpbXBvcnRhbnQ7DQotICAgICAgYm9yZGVyIDogc29saWQgMXB4IEBjb2xvci1ib3JkZXItYWxlcnQgIWltcG9ydGFudDsNCi0gICAgfQ0KLSAgICAmLmV2ZW50TWVzc2FnZSB7DQotICAgICAgYmFja2dyb3VuZC1jb2xvciA6IEBjb2xvci1iYWNrZ3JvdW5kLXN1Y2Nlc3MgIWltcG9ydGFudDsNCi0gICAgICBjb2xvcjogQGNvbG9yLWZvbnQtc3VjY2VzcyAhaW1wb3J0YW50Ow0KLSAgICAgIGJvcmRlciA6IHNvbGlkIDFweCBAY29sb3ItYm9yZGVyLXN1Y2Nlc3MgIWltcG9ydGFudDsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0jbG9naW5CYXIgew0KLSAgcG9zaXRpb246IGZpeGVkOw0KLSAgdG9wOjA7DQotICBsZWZ0OiAwOw0KLSAgd2lkdGg6IDEwMCU7DQotICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgc3BhbiB7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNXB4Ow0KLSAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA1cHg7DQotICAgIGZvbnQtc2l6ZTogMjVweDsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICB0b3A6IEBhcHAtYmFyLWhlaWdodCAtIDMycHg7DQotICAgIGxlZnQ6IDE1cHg7DQotICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAxMHB4Ow0KLSAgfQ0KLSAgI2NvbXBhbnktbG9nbyB7DQotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIH0NCi19DQotDQotLmxvZ2luLXNjcmVlbmxldCB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCi0gIG1pbi13aWR0aDogMzAwcHg7DQotICBtYXgtd2lkdGg6IDUwZW07DQotICBib3JkZXItcmFkaXVzOiA4cHggIWltcG9ydGFudDsNCi0gIG1hcmdpbi10b3A6IDE1JTsNCi0gIGJveC1zaGFkb3c6IDNweCAzcHggMTJweCBAc2hhZG93LWNvbG9yOw0KLSAgLnNjcmVlbmxldC10aXRsZS1iYXIgew0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7DQotICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICBtYXJnaW46MDsNCi0gICAgcGFkZGluZzowOw0KLSAgICBoM3sNCi0gICAgICBwYWRkaW5nLXRvcDoycHg7DQotICAgICAgcGFkZGluZy1ib3R0b206MnB4Ow0KLSAgICAgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLSAgICAgIGhlaWdodDogMTAwJTsNCi0gICAgICB3aWR0aDoxMDAlOw0KLSAgICAgIHRleHQtc2hhZG93OiBub25lOw0KLSAgICAgIGZvbnQtc2l6ZTogMjVweDsNCi0gICAgfQ0KLSAgfQ0KLSAgLnNjcmVlbmxldC1ib2R5IHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gICAgZm9ybSB7DQotICAgICAgLmJ1dHRvbiB7DQotICAgICAgICB3aWR0aDogMTUwcHg7DQotICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7DQotICAgICAgICBiYWNrZ3JvdW5kOiBub25lOw0KLSAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICAgICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgICAgICB0ZXh0LXNoYWRvdzogbm9uZTsNCi0gICAgICAgIG1hcmdpbi10b3A6IDIwcHg7DQotICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KLSAgICAgIH0NCi0NCi0gICAgICB0YWJsZSB7DQotICAgICAgICB0ciB7DQotICAgICAgICAgIHdpZHRoOiAxMDAlOw0KLSAgICAgICAgICAubGFiZWwgew0KLSAgICAgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gICAgICAgICAgICB3aWR0aDogMjUlOw0KLSAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpbnB1dCB7DQotICAgICAgICAgICAgd2lkdGg6IDEwMCU7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgLmJ1dHRvbnRleHQsDQotICAgICAgICAgIFt0eXBlPSJzdWJtaXQiXSB7DQotICAgICAgICAgICAgd2lkdGg6IDE1MHB4Ow0KLSAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCi0gICAgICAgICAgICBiYWNrZ3JvdW5kOiBub25lOw0KLSAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgICAgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgICAgICAgICB0ZXh0LXNoYWRvdzogbm9uZTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBbbmFtZT0iR0VUX1BBU1NXT1JEX0hJTlQiXSB7DQotICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgICAgICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICAgICAgICAgIGJvcmRlcjogbm9uZTsNCi0gICAgICAgICAgICB3aWR0aDogMTAwJTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBbbmFtZT0iRU1BSUxfUEFTU1dPUkQiXSB7DQotICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgICAgICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICAgICAgICAgIGJvcmRlcjogbm9uZTsNCi0gICAgICAgICAgICB3aWR0aDogMTAwJTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0ZCB7DQotICAgICAgICAgICAgcGFkZGluZzogNXB4Ow0KLSAgICAgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gICAgICAgICAgICBmb250LXNpemU6IDE1cHg7DQotICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gICAgYSB7DQotICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLS5sb2dpbi1zY3JlZW5sZXQgLnNjcmVlbmxldC10aXRsZS1iYXIgew0KLSAgdGV4dC1hbGlnbjogY2VudGVyOw0KLX0NCi0NCi0vKiBFbmQgTG9naW4gc2NyZWVubGV0ICovDQotDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgICBCZWdpbiBTY3JlZW5sZXQgc3R5bGUgICAgICAgICAgICAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLnNjcmVlbmxldC10aXRsZS1iYXIgew0KLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lIDsNCi0gIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBncmV5Ow0KLSAgaGVpZ2h0OiAxJTsgLyogSUUgZml4ICovDQotICBtaW4taGVpZ2h0OiAxLjVlbTsNCi0gIHBhZGRpbmc6MC44ZW0gMC4yZW07DQotfQ0KLQ0KLS5zY3JlZW5sZXQgew0KLSAgYm9yZGVyLXJhZGl1czogNXB4Ow0KLSAgYm9yZGVyOiBzb2xpZCAxcHggQGdyZXk7DQotICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsNCi0gIG1hcmdpbi1ib3R0b206IDFlbTsNCi0gIG92ZXJmbG93OiBhdXRvOw0KLX0NCi0NCi0uc2NyZWVubGV0LWJvZHkgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsNCi0gIGhlaWdodDogYXV0byAhaW1wb3J0YW50Ow0KLSAgaGVpZ2h0OiAxJTsNCi0gIHBhZGRpbmc6IDAuNGVtOw0KLX0NCi0NCi0uc2NyZWVubGV0LWJvZHkgZGl2IHsNCi0gIG1hcmdpbjogMC44ZW0gMC4xZW0NCi19DQotDQotLyogU3BlY2lhbCBTY3JlZW5sZXQgc3R5bGUgZm9yIGxvY2FsZSBhbmQgdGltZXpvbmUgd2luZG93ICovDQotLmxpc3RzLnNjcmVlbmxldCB7DQotICBtYXJnaW4tbGVmdDogMjUlOw0KLSAgbWFyZ2luLXJpZ2h0OiAyNSU7DQotICBtYXJnaW4tdG9wOiAxZW07DQotfQ0KLQ0KLS5saXN0cy5zY3JlZW5sZXQgLmJhc2ljLXRhYmxlIHRyIHRkIHsNCi0gIHRleHQtYWxpZ246IGNlbnRlcjsNCi19DQotDQotLmxpc3RzLnNjcmVlbmxldCAuYmFzaWMtdGFibGUgdHIgdGQgYSB7DQotICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotLyogICAgICBBbHRlcm5hdGUgdGFibGUgaGVhZGVyIHN0eWxlICAgICAgKi8NCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCwNCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleWRhcms7DQotICBib3JkZXItYm90dG9tOiAwOw0KLSAgYm9yZGVyLWxlZnQ6IDAuMWVtIHNvbGlkICNhYWE7DQotICBib3JkZXItcmlnaHQ6IDAuMWVtIHNvbGlkICM4ODg7DQotICBjb2xvcjogI2ZmZmZmZjsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0vKiBObyBwYWRkaW5nIHNjcmVlbmxldCBkZWNvcmF0b3IgKi8NCi0ubm8tcGFkZGluZyB7DQotICBwYWRkaW5nOiAwOw0KLSAgYm9yZGVyOiBub25lOw0KLX0NCi0NCi0ubm8tcGFkZGluZyAuaDEsDQotLm5vLXBhZGRpbmcgLmgyLA0KLS5uby1wYWRkaW5nIC5oMywNCi0ubm8tcGFkZGluZ3IgaDEsDQotLm5vLXBhZGRpbmcgaDIsDQotLm5vLXBhZGRpbmcgaDMgew0KLSAgcGFkZGluZzogMC43ZW07DQotfQ0KLQ0KLS5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIGE6aG92ZXIgew0KLSAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICAgICAgRW5kIFNjcmVlbmxldCBzdHlsZSAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgIFRhYmxlIFN0eWxlcyAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS5iYXNpYy10YWJsZSB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOw0KLSAgY29sb3I6ICMwMDAwMDA7DQotICBtYXJnaW4tYm90dG9tOiAxZW07DQotICB3aWR0aDogMTAwJTsNCi19DQotDQotZm9ybSB0YWJsZSwNCi1mb3JtIC5iYXNpYy10YWJsZSwNCi0uc2NyZWVubGV0LWJvZHkgLmJhc2ljLXRhYmxlIHsNCi0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Ow0KLSAgbWFyZ2luLWJvdHRvbTogMDsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIHRkIHsNCi0gIC8qIFN0eWxlIGZvciBhbGwgY2VsbHMgKi8NCi0gIHBhZGRpbmc6IDAuOGVtIDAuMWVtOw0KLSAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIC5hbGlnbi1ib3R0b20gew0KLSAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIC5hbGlnbi10b3Agew0KLSAgdmVydGljYWwtYWxpZ246IHRvcDsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIC5sYWJlbCwNCi0uYmFzaWMtdGFibGUgdHIgLmdyb3VwLWxhYmVsIHsNCi0gIC8qIGZpZWxkIGxhYmVscyBmb3IgZm9ybXMgKi8NCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgdGV4dC1hbGlnbjogcmlnaHQ7DQotICBwYWRkaW5nLXJpZ2h0OiAxLjVlbTsNCi0gIHdoaXRlLXNwYWNlOiBub3dyYXA7DQotICB3aWR0aDogMSU7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSB0ciAuZ3JvdXAtbGFiZWwgew0KLSAgLyogImhlYWRlciIgZm9yIGZpZWxkIGxhYmVsIGdyb3VwcyAqLw0KLSAgZm9udC1zaXplOiAxLjJlbTsNCi0gIHBhZGRpbmc6IDJlbSAxLjVlbSAwIDA7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSB0ciB0aCwNCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgew0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICB0ZXh0LWFsaWduOiBsZWZ0Ow0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgdGQgew0KLSAgYm9yZGVyLWJvdHRvbTogMC4xZW0gc29saWQgIzAwMDAwMDsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93IHRkIGEgew0KLSAgY29sb3I6ICMwMDAwMDA7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvdyB7DQotICAvKiBBbHRlcm5hdGluZyByb3cgc3R5bGUgKi8NCi0gIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuc2VsZWN0ZWQgew0KLSAgYmFja2dyb3VuZDogI0ZGRkNDRjsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93U2VsZWN0ZWQgew0KLSAgYmFja2dyb3VuZDogI0ZGRjU1RjsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5WYWxpZGF0ZSB7DQotICAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLw0KLSAgYmFja2dyb3VuZDogI0EwRDVGNzsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93VmFsaWRhdGUgew0KLSAgLypTdHlsZSB1c2UgYnkgYWx0LXJvdy1zdHlsZSBvbiBsaXN0Ki8NCi0gIGJhY2tncm91bmQ6ICM3MkE4RjI7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuV2FybiB7DQotICAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLw0KLSAgYmFja2dyb3VuZDogI2Y1NUM1QzsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93V2FybiB7DQotICAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLw0KLSAgYmFja2dyb3VuZDogI0ZDNzQ1NTsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIHsNCi0gIC8qIGJ1dHRvbiBjb2x1bW4gc3R5bGUgLSBmb3IgdGhlIHNtYWxsDQotICBjb2xsZWN0aW9uIG9mIGJ1dHRvbnMgdXNlZCBpbiBsaXN0cyAqLw0KLSAgdmVydGljYWwtYWxpZ246IHRvcDsNCi0gIHBhZGRpbmc6IDAuM2VtOw0KLX0NCi0uYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgYSwNCi0uYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgYnV0dG9uLA0KLS5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBpbnB1dFt0eXBlPSJyZXNldCJdLA0KLS5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBpbnB1dFt0eXBlPSJzdWJtaXQiXSwNCi0uYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgaW5wdXRbdHlwZT0iYnV0dG9uIl0gew0KLSAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOw0KLSAgLW1vei1ib3JkZXItcmFkaXVzOiAxZW07DQotICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDFlbTsNCi0gIGJvcmRlci1yYWRpdXM6IDJweDsNCi0gIGJvcmRlcjogMC4xZW0gc29saWQgQG1haW4tY29sb3ItdGhlbWU7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICBjdXJzb3I6IHBvaW50ZXI7DQotICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBkaXNwbGF5OmlubGluZS1ibG9jazsNCi0gIGZvbnQtc2l6ZTogMC45ZW07DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIG91dGxpbmU6IDA7DQotICBvdmVyZmxvdzogdmlzaWJsZTsNCi0gIHBhZGRpbmc6IDAuMWVtIDAuNWVtIDAuMmVtIDAuNWVtOw0KLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLSAgd2lkdGg6IGF1dG87DQotDQotICAmOmhvdmVyIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIGNvbG9yOiBAd2hpdGU7DQotICB9DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuY29sbGFwc2VkIHsNCi0gIHZpc2liaWxpdHk6IGNvbGxhcHNlOw0KLX0NCi0NCi0vKiAgICAgIFNvcnQgZmllbGQgc3R5bGUgICAgICAqLw0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoIC5zb3J0LW9yZGVyLWFzYywNCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCAuc29ydC1vcmRlci1hc2N7DQotICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci11cC5wbmcpIG5vLXJlcGVhdCByaWdodDsNCi0gIHBhZGRpbmctbGVmdDogMC41ZW07DQotICBwYWRkaW5nLXJpZ2h0OiAyMHB4OyAvKiBTZXR0aW5nIG11c3QgYmUgaW4gcHggKi8NCi19DQotLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGggLnNvcnQtb3JkZXItZGVzYywNCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCAuc29ydC1vcmRlci1kZXNjew0KLSAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYXJyb3ctZ3ItZHcucG5nKSBuby1yZXBlYXQgcmlnaHQ7DQotICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KLSAgcGFkZGluZy1yaWdodDogMjBweDsgLyogU2V0dGluZyBtdXN0IGJlIGluIHB4ICovDQotfQ0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoIC5zb3J0LW9yZGVyLA0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIC5zb3J0LW9yZGVyew0KLSAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYXJyb3ctZ3IucG5nKSBuby1yZXBlYXQgcmlnaHQ7DQotICBwYWRkaW5nLWxlZnQ6IDAuNWVtOw0KLSAgcGFkZGluZy1yaWdodDogMjBweDsgLyogU2V0dGluZyBtdXN0IGJlIGluIHB4ICovDQotICBjb2xvcjojZmZmDQotfQ0KLQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICAgICAgQmVnaW4gTWVzc2FnZSBJbmZvICAgICAgICAgICAgICAgICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS5jb3VudC1tZXNzYWdlIHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICBtaW4taGVpZ2h0OjIwcHg7DQotICBtaW4td2lkdGg6IDIwcHg7DQotICBtYXgtaGVpZ2h0OjIwcHg7DQotICBtYXgtd2lkdGg6IDIwcHg7DQotICBiYWNrZ3JvdW5kOiBAd2hpdGU7DQotICBmb250LXNpemU6MTJweDsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgYm9yZGVyLXJhZGl1czogNTAlOw0KLX0NCi0uaW5mby1tZXNzYWdlLXRpdGxlIHsNCi0gIG1pbi13aWR0aDoxNTBweDsNCi0gIG1hcmdpbjogNXB4Ow0KLSAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgZm9udC1zaXplOiAxNnB4Ow0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLS5tZXNzYWdlLWxpc3Qgew0KLSAgcG9zaXRpb246cmVsYXRpdmU7DQotICBtYXJnaW4tdG9wOiAxMHB4Ow0KLSAgYm94LXNoYWRvdzogMXB4IDNweCA1cHggQGdyZXlkYXJrOw0KLSAgYm9yZGVyLXJhZGl1czogMCA1cHggNXB4IDA7DQotICB0cmFuc2l0aW9uOiBoZWlnaHQgMnM7DQotfQ0KLS5tZXNzYWdlLWxpc3QtbWFpbiB7DQotICBwYWRkaW5nOiA1cHggMTVweCA1cHggMTVweDsNCi19DQotLm1lc3NhZ2UtbGlzdC1hbGVydCB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3ItYWxlcnQ7DQotICBib3JkZXItbGVmdCA6IHNvbGlkIDVweCBAY29sb3ItYWxlcnQtZGFyazsNCi0gIC5jb3VudC1tZXNzYWdlIHsNCi0gICAgY29sb3I6IEBjb2xvci1hbGVydC1kYXJrOw0KLSAgfQ0KLX0NCi0ubWVzc2FnZS1saXN0LXN1Y2Nlc3Mgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLXN1Y2Nlc3M7DQotICBib3JkZXItbGVmdDogc29saWQgNXB4IEBjb2xvci1zdWNjZXNzLWRhcms7DQotICAuY291bnQtbWVzc2FnZSB7DQotICAgIGNvbG9yOiBAY29sb3Itc3VjY2Vzcy1kYXJrOw0KLSAgfQ0KLX0NCi0ubWVzc2FnZS1saXN0LXRhYmxlLWNvbnRhaW5lciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICBib3JkZXItcmFkaXVzOiA1cHg7DQotICBvdmVyZmxvdzogaGlkZGVuOw0KLSAgaGVpZ2h0OiAwOw0KLX0NCi0uaW5mby1tZXNzYWdlLXN1Y2Nlc3Mgew0KLSAgZGlzcGxheTogbm9uZTsNCi19DQotLmluZm8tbWVzc2FnZS1hbGVydCB7DQotICBkaXNwbGF5OiBub25lOw0KLX0NCi10YWJsZS5tc2ctbGlzdCB7DQotICB3aWR0aDogMTAwJTsNCi0gIGZvbnQtc2l6ZTogMTZweDsNCi0gIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gIHBhZGRpbmc6IDA7DQotICB0aGVhZCB7DQotICAgIGhlaWdodDogMTAwJTsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7DQotICAgIG1hcmdpbjogMDsNCi0gICAgcGFkZGluZzogMDsNCi0gICAgdHJ7DQotICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBibGFjazsNCi0gICAgICBoZWlnaHQ6IDEwMCU7DQotICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7DQotICAgICAgbGluZS1oZWlnaHQ6IDMwcHg7DQotICAgIH0NCi0gIH0NCi0gIHRib2R5IHsNCi0gICAgdHIgew0KLSAgICAgIGxpbmUtaGVpZ2h0OiAyNXB4Ow0KLSAgICB9DQotICAgIHRyLm1zZy1yb3ctc3VjY2VzcyB7DQotICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLXN1Y2Nlc3M7DQotICAgIH0NCi0gICAgdHIubXNnLXJvdy1hbGVydCB7DQotICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLWFsZXJ0Ow0KLSAgICB9DQotICB9DQotICB0ZCB7DQotICAgIHBhZGRpbmctbGVmdDogNXB4Ow0KLSAgfQ0KLX0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgIEVuZCAgTWVzc2FnZSBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgIFBhZ2luYXRlIFN0eWxlICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0ucGFnaW5hdGUtYmFyLW5yZCB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBmb250LXNpemU6IDE1cHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsNCi0gIHBhZGRpbmctbGVmdDogMTBweDsNCi0gIHBhZGRpbmctdG9wOiAzcHg7DQotICBwYWRkaW5nLWJvdHRvbTogM3B4Ow0KLSAgYm94LXNoYWRvdzogMCAycHggNXB4IEBzaGFkb3ctY29sb3I7DQotDQotICB1bC5wYWdpbmF0ZS1wZy1saXN0IHsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIG1hcmdpbi1yaWdodDogMTBweDsNCi0gICAgYm9yZGVyLXJhZGl1czogOHB4Ow0KLSAgICBib3JkZXI6IHNvbGlkIDFweCBAYm94LWJvcmRlci1jb2xvcjsNCi0gICAgaGVpZ2h0OiAxOHB4Ow0KLSAgICBsaSB7DQotICAgICAgZGlzcGxheTogZmxleDsNCi0gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgICBtaW4td2lkdGg6IDE3cHg7DQotICAgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggQGJveC1ib3JkZXItY29sb3I7DQotICAgICAgcGFkZGluZy1sZWZ0OiAycHg7DQotICAgICAgcGFkZGluZy1yaWdodDogMnB4Ow0KLSAgICAgIGhlaWdodDoxMDAlOw0KLSAgICAgIGEgew0KLSAgICAgICAgZGlzcGxheTogZmxleDsNCi0gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gICAgICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gICAgICAgIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gICAgICAgIGhlaWdodDogMTAwJTsNCi0gICAgICAgIHdpZHRoOiAxMDAlOw0KLSAgICAgIH0NCi0gICAgICAucGFnaW5hdGUtZGlzYWJsZSB7DQotDQotICAgICAgfQ0KLSAgICB9DQotICAgIGxpLnNlbGVjdGVkIHsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgICBhIHsNCi0gICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgbGk6Zmlyc3QtY2hpbGQsIGxpOmxhc3QtY2hpbGQgew0KLSAgICAgIHdpZHRoOiAyMHB4Ow0KLSAgICB9DQotICAgIGxpOmZpcnN0LWNoaWxkIHsNCi0gICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAzcHg7DQotICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4Ow0KLSAgICB9DQotICAgIGxpOmxhc3QtY2hpbGQgew0KLSAgICAgIGJvcmRlci1yaWdodDogbm9uZTsNCi0gICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4Ow0KLSAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7DQotICAgIH0NCi0gIH0NCi0NCi19DQotc2VsZWN0LnBhZ2luYXRlLXNlbGVjdCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBiYWNrZ3JvdW5kOiBAd2hpdGU7DQotICBmb250LXNpemU6IDE2cHg7DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIGJvcmRlcjogMXB4IHNvbGlkIEBib3gtYm9yZGVyLWNvbG9yOw0KLSAgb3B0aW9uIHsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAganVzdGlmeS1zZWxmOiBjZW50ZXI7DQotICAgIGZvbnQtc2l6ZTogMTRweDsNCi0gIH0NCi19DQotDQotLnBhZ2luYXRlLXNlbGVjdC1sYWJlbCB7DQotICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7DQotICBmb250LXNpemU6IDE2cHg7DQotICBwYWRkaW5nLWxlZnQ6IDE1cHg7DQotICBwYWRkaW5nLXJpZ2h0OiAxNXB4Ow0KLX0NCi0NCi0ucGFnaW5hdGUtaW5mb3JtYXRpb24gew0KLSAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgZm9udC1zaXplOiAxNnB4Ow0KLSAgcGFkZGluZy1sZWZ0OiAxNXB4Ow0KLSAgcGFkZGluZy1yaWdodDogMTVweDsNCi19DQotDQotdWwucGFnaW5hdGUtcGctbGlzdCBsaTpob3ZlcnsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgYSB7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgfQ0KLX0NCi0NCi0vKiBFbmQgb2YgUGFnaW5hdGUgU3R5bGUgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgIExpc3QgTmF2aWdhdGlvbiBTdHlsZSAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS5uYXYtcGFnZXIgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXlkYXJrOw0KLSAgY29sb3I6IEB3aGl0ZTsNCi0gIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gIGZvbnQtc2l6ZTogOXB4Ow0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBsaW5lLWhlaWdodDogMy41ZW07DQotICBoZWlnaHQ6IDMuNWVtOw0KLSAgbWFyZ2luOiAwLjVlbSAwIDAuNWVtIDA7DQotICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsNCi19DQotDQotLm5hdi1wYWdlciB1bCB7DQotICBkaXNwbGF5OiBpbmxpbmU7IC8qIElFIEZpeCAqLw0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIGxpIHsNCi0gIGZsb2F0OmxlZnQ7DQotICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIGxpIGEgew0KLSAgZGlzcGxheTogYmxvY2s7DQotfQ0KLQ0KLS5uYXYtcGFnZXIgdWwgYSB7DQotICBjb2xvcjogQHdoaXRlOw0KLSAgcGFkZGluZzogMCAxZW0gMCAxZW07DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLS5uYXYtcGFnZXIgdWwgYTpob3ZlciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi19DQotDQotLm5hdi1wYWdlciB1bCAubmF2LXBhZ2VzaXplLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1wYWdlLXNlbGVjdCwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtZGlzcGxheWluZyB7DQotICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsNCi19DQotDQotLm5hdi1wYWdlciB1bCAubmF2LWZpcnN0LWRpc2FibGVkLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1wcmV2aW91cy1kaXNhYmxlZCwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbmV4dC1kaXNhYmxlZCwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbGFzdC1kaXNhYmxlZCB7DQotICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsNCi19DQotDQotLm5hdi1wYWdlciB1bCAubmF2LWZpcnN0LWRpc2FibGVkOmhvdmVyLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1wcmV2aW91cy1kaXNhYmxlZDpob3ZlciwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbmV4dC1kaXNhYmxlZDpob3ZlciwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbGFzdC1kaXNhYmxlZDpob3ZlciB7DQotICBjdXJzb3I6IG5vdC1hbGxvd2VkOw0KLX0NCi0NCi0NCi0ubmF2LXBhZ2VyIHVsIC5uYXYtZGlzcGxheWluZyB7DQotICBib3JkZXItcmlnaHQ6IG5vbmU7DQotfQ0KLQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgTXVsdGktQ29sdW1uIFN0eWxlcyAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIHsNCi0gIG1hcmdpbjogYXV0bzsNCi0gIHBhZGRpbmc6IDFlbTsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIG1pbi13aWR0aDogQG1pbi1jb250YWluZXItd2lkdGg7DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIGgxLA0KLSNjb2x1bW4tY29udGFpbmVyIC5oMSwNCi0jY29sdW1uLWNvbnRhaW5lciBoMiwNCi0jY29sdW1uLWNvbnRhaW5lciAuaDIgew0KLSAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIGgxLA0KLSNjb2x1bW4tY29udGFpbmVyIC5oMSB7DQotICBjb2xvcjogIzU1Nzk5NjsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLmxlZnQgew0KLSAgZmxvYXQ6IGxlZnQ7DQotICAvKiBhbHQ6IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwcHg7IGxlZnQ6IDBweDsgKi8NCi0gIHdpZHRoOiAyMmVtOw0KLSAgbWFyZ2luLXJpZ2h0OiAxZW07DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5sZWZ0LWxhcmdlciB7DQotICBmbG9hdDogbGVmdDsNCi0gIC8qIGFsdDogcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyAqLw0KLSAgd2lkdGg6IDI1ZW07DQotICBtYXJnaW4tcmlnaHQ6IDFlbTsNCi19DQotDQotLmxlZnRoYWxmIHsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgaGVpZ2h0OiAxJTsNCi0gIGxlZnQ6IDA7DQotICBtYXJnaW46IDAlIDElIDElIDAlOw0KLSAgd2lkdGg6IDQ5JTsNCi19DQotDQotLnJpZ2h0aGFsZiB7DQotICBmbG9hdDogcmlnaHQ7DQotICBoZWlnaHQ6IDElOw0KLSAgbWFyZ2luOiAwIDAgMSUgMSU7DQotICByaWdodDogMDsNCi0gIHdpZHRoOiA0OSU7DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5yaWdodCB7DQotICBmbG9hdDogcmlnaHQ7DQotICBtYXJnaW4tbGVmdDogMWVtOw0KLSAgd2lkdGg6IDIyZW07DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5sZWZ0b25seSB7DQotICBtYXJnaW4tbGVmdDogMjNlbTsNCi0gIHdpZHRoOiBhdXRvOw0KLX0NCi0NCi0jY29sdW1uLWNvbnRhaW5lciAubGVmdG9ubHktbGFyZ2VyIHsNCi0gIG1hcmdpbi1sZWZ0OiAyNmVtOw0KLSAgd2lkdGg6IGF1dG87DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5yaWdodG9ubHkgew0KLSAgbWFyZ2luLXJpZ2h0OiAyM2VtOw0KLSAgd2lkdGg6IGF1dG87DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5jZW50ZXIgew0KLSAgbWFyZ2luLWxlZnQ6IDIzZW07DQotICBtYXJnaW4tcmlnaHQ6IDIzZW07DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLm5vY29sdW1ucyB7DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICAgICAgQnV0dG9uIFN0eWxlICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLmJ1dHRvbi1iYXIgbGkuYnV0dG9udGV4dCBhLA0KLWEuYnV0dG9udGV4dCwNCi1hLmJ1dHRvbnRleHRiaWcsDQotLnNtYWxsU3VibWl0LA0KLS5zbWFsbFN1Ym1pdDpob3ZlciwNCi0ubWVkaXVtU3VibWl0LA0KLS5sYXJnZVN1Ym1pdCwNCi0ubG9naW5CdXR0b24sDQotLmJ1dHRvbi1zdHlsZS0xIGEsDQotLmJ1dHRvbi1zdHlsZS0xIHVsIGEsDQotLmJ1dHRvbi1zdHlsZS0yIHVsIGEsDQotLmJ1dHRvbi1zdHlsZS0yIGEsDQotLmJ1dHRvbiwNCi1idXR0b24sDQotaW5wdXRbdHlwZT0icmVzZXQiXSwNCi1pbnB1dFt0eXBlPSJzdWJtaXQiXSwNCi1pbnB1dFt0eXBlPSJidXR0b24iXSB7DQotICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7DQotICAtbW96LWJvcmRlci1yYWRpdXM6IDEuMWVtOw0KLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxLjFlbTsNCi0gIGJvcmRlci1yYWRpdXM6IDJweDsNCi0gIGJvcmRlcjogMC4xZW0gc29saWQgQG1haW4tY29sb3ItdGhlbWU7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICBjdXJzb3I6IHBvaW50ZXI7DQotICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBkaXNwbGF5OmlubGluZS1ibG9jazsNCi0gIGZvbnQtc2l6ZTogMWVtOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBvdXRsaW5lOiAwOw0KLSAgb3ZlcmZsb3c6IHZpc2libGU7DQotICBwYWRkaW5nOiAwLjRlbSAxZW0gMC40ZW07DQotICB0ZXh0LWRlY29yYXRpb246bm9uZTsNCi0gIC8qdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyovDQotICB3aWR0aDogYXV0bzsNCi0NCi0gIC8qIElFNyAqLw0KLSAgKnBhZGRpbmctdG9wOiAwLjJlbTsNCi0gICpwYWRkaW5nLWJvdHRvbTogMDsNCi0gICY6aG92ZXIgew0KLSAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgfQ0KLX0NCi0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgICBGb290ZXIgU3R5bGUgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0jZm9vdGVyIHsNCi0gIGJhY2tncm91bmQ6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgYm9yZGVyLXRvcDogMC4xZW0gaW5zZXQgIzAwMDsNCi0gIHBhZGRpbmc6IDAuNWVtIDAgMC41ZW0gMC41ZW07DQotDQotICBoZWlnaHQ6IEBmb290ZXItaGVpZ2h0Ow0KLSAgcG9zaXRpb246IGZpeGVkOw0KLSAgYm90dG9tOiAwOw0KLSAgd2lkdGg6IDEwMCU7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQotICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWYgIWltcG9ydGFudDsNCi0gIHotaW5kZXg6IDEwOw0KLQ0KLSAgc3BhbiB7DQotICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgcGFkZGluZzogMTBweDsNCi0gIH0NCi0NCi0gIGEgew0KLSAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICB9DQotfQ0KLQ0KLSNmb290ZXIgYTpmb2N1cyB7DQotICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCi19DQotDQotI2Zvb3Rlci1vZmZzZXQgew0KLSAgaGVpZ2h0OiBAZm9vdGVyLWhlaWdodCArIDEwcHg7DQotICB3aWR0aDogMTAwJTsNCi19DQorLyogY29tbW9uIGNvbG9ycyAqLworQGJsYWNrOiAjMDAwOworQHdoaXRlOiAjZmZmOworQGdyZXk6ICNlNmU2ZTY7CitAZ3JleWRhcms6ICM5MjkyOTI7CisKK0Bjb2xvci1zdWNjZXNzOiAjOGNmZjhjOworQGZvbnQtY29sb3ItZm9yLXN1Y2Nlc3M6IEBibGFjazsKK0Bjb2xvci1hbGVydDogI2ZmOGM4YzsKK0Bmb250LWNvbG9yLWZvci1hbGVydDogQGJsYWNrOworCitAY29sb3Itc3VjY2Vzcy1kYXJrOiAjMzU2ZTM1OworQGZvbnQtY29sb3ItZm9yLXN1Y2Nlc3M6IEBibGFjazsKK0Bjb2xvci1hbGVydC1kYXJrOiAjOTMyZjMzOworQGZvbnQtY29sb3ItZm9yLWFsZXJ0OiBAYmxhY2s7CisKK0Bjb2xvci1iYWNrZ3JvdW5kLWFsZXJ0OiAjZjJkZWRlOworQGNvbG9yLWZvbnQtYWxlcnQ6ICNhOTQ0NDI7CitAY29sb3ItYm9yZGVyLWFsZXJ0OiAjZWJjY2QxOworCitAY29sb3ItYmFja2dyb3VuZC1zdWNjZXNzOiAjZGZmMGQ4OworQGNvbG9yLWZvbnQtc3VjY2VzczogIzNjNzYzZDsKK0Bjb2xvci1ib3JkZXItc3VjY2VzczogI2Q2ZTljNjsKKworLyogU2FwaGlyIGNvbG9ycyAqLworQGJsdWUtZGFyazogIzAwMjMzMzsKK0BibHVlLW1haW46ICMwMDU5ODI7CitAYmx1ZS1tZWRpdW06ICNjN2RmZmY7CitAYmx1ZS1saWdodDogI2YxZjdmZjsKK0BibHVlLWxpZ2h0MjogI2U0ZjBmNTsKKworLyogUnVieSBjb2xvcnMgKi8KK0ByZWQtZGFyazogIzQyMDAwMDsKK0ByZWQtbWFpbjogI2JmMTYxNjsKK0ByZWQtbWVkaXVtOiAjZjdiYWJhOworQHJlZC1saWdodDogI2ZjZTdlNzsKK0ByZWQtbGlnaHQyOiAjZmVkN2M5OworCisvKiBFbWVyYWxkIGNvbG9ycyAqLworQGdyZWVuLWRhcms6ICMxOTc5NDg7CitAZ3JlZW4tbWFpbjogIzIzYWY5YjsKK0BncmVlbi1tZWRpdW06ICM3YWUzYWQ7CitAZ3JlZW4tbGlnaHQ6ICNlNWY5ZWY7CitAZ3JlZW4tbGlnaHQyOiAjZDdmOWVmOworCisvKiBBbWJlciBjb2xvcnMgKi8KK0BhbWJlci1kYXJrOiAjYmM0MjE2OworQGFtYmVyLW1haW46ICNmMDg5MDY7CitAYW1iZXItbWVkaXVtOiAjZjVjNGIzOworQGFtYmVyLWxpZ2h0OiAjZmNlZGU4OworQGFtYmVyLWxpZ2h0MjogI2ZjZWRjZDsKKworLyogU2FwaGlyIHRoZW1lICovCisvKgorQG1haW4tY29sb3ItdGhlbWUgOiBAYmx1ZS1tYWluOworQGRhcmstY29sb3ItdGhlbWUgOiBAYmx1ZS1kYXJrOworQG1lZGl1bS1jb2xvci10aGVtZSA6IEBibHVlLW1lZGl1bTsKK0BsaWdodC1jb2xvci10aGVtZSA6IEBibHVlLWxpZ2h0OworQGxpZ2h0Mi1jb2xvci10aGVtZSA6IEBibHVlLWxpZ2h0MjsKK0Bmb250LWNvbG9yLWZvci1kYXJrIDogQGdyZXk7CitAZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsKK0Bmb250LWNvbG9yLWZvci1tZWRpdW0gOiBAZGFyay1jb2xvci10aGVtZTsKK0Bmb250LWNvbG9yLWZvci1saWdodCA6IEBkYXJrLWNvbG9yLXRoZW1lOworQHNoYWRvdy1jb2xvciA6IEBibGFjazsKK0BzaGFkb3ctY29sb3ItbGlnaHQgOiBAZ3JleWRhcms7CisqLworCisvKiBSdWJ5IHRoZW1lICovCisKK0BtYWluLWNvbG9yLXRoZW1lIDogQHJlZC1tYWluOworQGRhcmstY29sb3ItdGhlbWUgOiBAcmVkLWRhcms7CitAbWVkaXVtLWNvbG9yLXRoZW1lIDogQHJlZC1tZWRpdW07CitAbGlnaHQtY29sb3ItdGhlbWUgOiBAcmVkLWxpZ2h0OworQGxpZ2h0Mi1jb2xvci10aGVtZSA6IEByZWQtbGlnaHQyOworQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAZ3JleTsKK0Bmb250LWNvbG9yLWZvci1tYWluIDogQHdoaXRlOworQGZvbnQtY29sb3ItZm9yLW1lZGl1bSA6IEBkYXJrLWNvbG9yLXRoZW1lOworQGZvbnQtY29sb3ItZm9yLWxpZ2h0IDogQGRhcmstY29sb3ItdGhlbWU7CitAc2hhZG93LWNvbG9yIDogQGJsYWNrOworQHNoYWRvdy1jb2xvci1saWdodCA6IEBncmV5ZGFyazsKKworCisvKiBFbWVyYWxkIHRoZW1lICovCisvKgorQG1haW4tY29sb3ItdGhlbWUgOiBAZ3JlZW4tbWFpbjsKK0BkYXJrLWNvbG9yLXRoZW1lIDogQGdyZWVuLWRhcms7CitAbWVkaXVtLWNvbG9yLXRoZW1lIDogQGdyZWVuLW1lZGl1bTsKK0BsaWdodC1jb2xvci10aGVtZSA6IEBncmVlbi1saWdodDsKK0BsaWdodDItY29sb3ItdGhlbWUgOiBAZ3JlZW4tbGlnaHQyOworQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAd2hpdGU7CitAZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsKK0Bmb250LWNvbG9yLWZvci1tZWRpdW0gOiBAZGFyay1jb2xvci10aGVtZTsKK0Bmb250LWNvbG9yLWZvci1saWdodCA6IEBkYXJrLWNvbG9yLXRoZW1lOworQHNoYWRvdy1jb2xvciA6IEBibGFjazsKK0BzaGFkb3ctY29sb3ItbGlnaHQgOiBAZ3JleWRhcms7CisqLworLyogQW1iZXIgdGhlbWUgKi8KKy8qCitAbWFpbi1jb2xvci10aGVtZSA6IEBhbWJlci1tYWluOworQGRhcmstY29sb3ItdGhlbWUgOiBAYW1iZXItZGFyazsKK0BtZWRpdW0tY29sb3ItdGhlbWUgOiBAYW1iZXItbWVkaXVtOworQGxpZ2h0LWNvbG9yLXRoZW1lIDogQGFtYmVyLWxpZ2h0OworQGxpZ2h0Mi1jb2xvci10aGVtZSA6IEBhbWJlci1saWdodDI7CitAZm9udC1jb2xvci1mb3ItZGFyayA6IEB3aGl0ZTsKK0Bmb250LWNvbG9yLWZvci1tYWluIDogQHdoaXRlOworQGZvbnQtY29sb3ItZm9yLW1lZGl1bSA6IEBkYXJrLWNvbG9yLXRoZW1lOworQGZvbnQtY29sb3ItZm9yLWxpZ2h0IDogQGRhcmstY29sb3ItdGhlbWU7CitAc2hhZG93LWNvbG9yIDogQGJsYWNrOworQHNoYWRvdy1jb2xvci1saWdodCA6IEBncmV5ZGFyazsKKyovCisKKworQGFwcC1iYXItaGVpZ2h0OiA2MHB4OworQHN1Yi1hcHAtYmFyLWhlaWdodDogNDBweDsKK0Bmb290ZXItaGVpZ2h0OiAyMHB4OworQGhvbWUtYnRuLXdpZHRoOiA0N3B4OworQGNvbG9yLWxpbmUtaGVpZ2h0OiA5cHg7CisKK0Bob21lLW1lbnUtdGlsZS1oZWlnaHQ6IDgwcHg7CitAaG9tZS1tZW51LXRpbGUtbWluLXdpZHRoOiAxMDBweDsKK0Bob21lLW1lbnUtdGlsZS1tYXgtd2lkdGg6IDEwMHB4OworCitAdGhpcmQtbHZsLWhlaWdodDogODBweDsKK0B0aGlyZC1sdmwtd2lkdGggOiAxMDBweDsKK0BtaW4tc2NyZWVuIDogMTE3MHB4OworQG1pbi1jb250YWluZXItd2lkdGg6IDExMzBweDsKKworQGJveC1ib3JkZXItY29sb3I6ICNkN2Q3ZDc7CisKK0Bmb250LWZhY2UgeworICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7CisgIHNyYzogdXJsKCdmb250cy9xdWlja3NhbmQvcXVpY2tzYW5kYm9sZC5vdGYnKTsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgZm9udC1zdHlsZTogbm9ybWFsOworfQorCitAZm9udC1mYWNlIHsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBzcmM6IHVybCgnZm9udHMvcXVpY2tzYW5kL3F1aWNrc2FuZGJvbGQub3RmJyk7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBmb250LXN0eWxlOiBub3JtYWw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEJlZ2luIHNwZWNpYWwgY2hlY2tib3ggdHlwZSBzd2l0Y2ggKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtY2hrYm94LCBbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1jaGtib3ggeworICBkaXNwbGF5OiBub25lOworfQorCitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1jaGtib3ggKyBsYWJlbCwKK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCArIGxhYmVseworICBjdXJzb3I6IHBvaW50ZXI7Cit9CitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1jaGtib3ggKyBsYWJlbDpiZWZvcmUsCitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1jaGtib3ggKyBsYWJlbDpiZWZvcmV7CisgIGNvbnRlbnQ6ICIiOworICB3aWR0aDogMTUwcHg7CisgIG1pbi13aWR0aDogMTUwcHg7CisgIGJhY2tncm91bmQtY29sb3I6IEBsaWdodC1jb2xvci10aGVtZTsKKyAgcGFkZGluZzogMnB4IDIwcHggMnB4IDIwcHg7CisgIGJvcmRlci1yYWRpdXM6IDhweCA4cHggOHB4IDhweDsKKworICBjdXJzb3I6IHBvaW50ZXI7Cit9CisKK1t0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLWNoa2JveCArIGxhYmVsOmFmdGVyLAorW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94ICsgbGFiZWw6YWZ0ZXJ7CisgIGNvbnRlbnQ6ICIiOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGxlZnQ6LTM1cHg7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICBtaW4taGVpZ2h0OiAxMHB4OworICBtaW4td2lkdGg6IDEwcHg7CisgIHBhZGRpbmctbGVmdDogNHB4OworICBwYWRkaW5nLXJpZ2h0OiA1cHg7CisgIGJvcmRlci1yYWRpdXM6IDhweCA4cHggOHB4IDhweDsKKyAgdHJhbnNpdGlvbjogYWxsIC4yczsKK30KKworW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94ICsgbGFiZWw6YWZ0ZXJ7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgbGVmdDogLTE1cHg7CisgIHRyYW5zaXRpb246IGFsbCAuMnM7Cit9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBFbmQgc3BlY2lhbCBjaGVja2JveCB0eXBlIHN3aXRjaCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgQmVnaW4gc3F1YXJlIENoZWNrYm94ICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1t0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3gsCitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94eworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IC05OTk5cHg7Cit9CisKK1t0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbCwKK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbHsKKyAgY29udGVudDogJyc7CisgIHBhZGRpbmctbGVmdDogMzVweDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBjdXJzb3I6IHBvaW50ZXI7CisgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsKKyAgZm9udC1zaXplOiAxMnB4OworCit9CitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YmVmb3JlLAorW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmJlZm9yZXsKKyAgY29udGVudDogJyc7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgbGVmdDoxMHB4OworICB0b3A6IC00cHg7CisgIHdpZHRoOiAxN3B4OworICBoZWlnaHQ6IDE3cHg7IC8qIGRpbS4gZGUgbGEgY2FzZSAqLworICBib3JkZXI6IDFweCBzb2xpZCAjYWFhOworICBiYWNrZ3JvdW5kOiBAbGlnaHQtY29sb3ItdGhlbWU7CisgIGJvcmRlci1yYWRpdXM6IDJweDsKK30KKworW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmJlZm9yZSB7CisgIGJhY2tncm91bmQ6IEBsaWdodC1jb2xvci10aGVtZTsKK30KK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDpiZWZvcmV7CisgIGJhY2tncm91bmQ6IEBtYWluLWNvbG9yLXRoZW1lOworfQorCitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YWZ0ZXIsCitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YWZ0ZXJ7CisgIGNvbnRlbnQ6ICfinJQnOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHRvcDogLTRweDsKKyAgbGVmdDogMTRweDsKKyAgZm9udC1zaXplOiAxNnB4OworICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47CisgIHRyYW5zaXRpb246IGFsbCAuMnM7Cit9CitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YWZ0ZXIgeworICBvcGFjaXR5OiAwOworICB0cmFuc2Zvcm06IHNjYWxlKDApOworfQorW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyIHsKKyAgb3BhY2l0eTogMTsKKyAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgRW5kIHNxdWFyZSBDaGVja2JveCAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICBCZWdpbiBjbGFzcyBjb250ZW50IG1nbXQgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy5mbGV4LXJvdyB7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiByb3cgIWltcG9ydGFudDsKK30KKy5mbGV4LWNvbHVtbiB7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cit9CisKKy5jb2wtd2lkdGgtMSB7CisgIHdpZHRoOiAxMCU7Cit9CisuY29sLXdpZHRoLTIgeworICB3aWR0aDogMjAlOworfQorLmNvbC13aWR0aC0zIHsKKyAgd2lkdGg6IDMwJTsKK30KKy5jb2wtd2lkdGgtNCB7CisgIHdpZHRoOiA0MCU7Cit9CisuY29sLXdpZHRoLTUgeworICB3aWR0aDogNTAlOworfQorLmNvbC13aWR0aC02IHsKKyAgd2lkdGg6IDYwJTsKK30KKy5jb2wtd2lkdGgtNyB7CisgIHdpZHRoOiA3MCU7Cit9CisuY29sLXdpZHRoLTggeworICB3aWR0aDogODAlOworfQorLmNvbC13aWR0aC05IHsKKyAgd2lkdGg6IDkwJTsKK30KKy5jb2wtd2lkdGgtMTAgeworICB3aWR0aDogMTAwJTsKK30KKworLmFsaWduLXYtY2VudGVyIHsKKyAgZGlzcGxheTpmbGV4OworICBhbGlnbi1pdGVtczogY2VudGVyOworfQorCisuYWxpZ24taC1jZW50ZXIgeworICBkaXNwbGF5OmZsZXg7CisgIGp1c3RpZnktY29udGVudDogY2VudGVyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgRW5kIGNsYXNzIGNvbnRlbnQgbWdtdCAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogIEJlZ2luIGJ0bi1zb3J0ICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLmJ0bi1zb3J0IHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB0b3A6IC02cHg7CisgIGJvcmRlcjpub25lOworICBiYWNrZ3JvdW5kOm5vbmU7CisgIGJvcmRlci1yYWRpdXM6IDA7CisgIG1hcmdpbi1sZWZ0OjVweDsKK30KKworLmJ0bi1zb3J0OmJlZm9yZXsKKyAgY29udGVudDogJyc7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgbGVmdDogLTFweDsKKyAgd2lkdGg6IDA7CisgIGhlaWdodDogMDsKKyAgYm9yZGVyLXJpZ2h0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50OworICBib3JkZXItYm90dG9tOiAxMHB4IHNvbGlkIEBncmV5ZGFyazsKKyAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7Cit9CisKKy5idG4tc29ydDphZnRlcnsKKyAgY29udGVudDogJyc7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgcmlnaHQ6IC0xcHg7CisgIHdpZHRoOiAwOworICBoZWlnaHQ6IDA7CisgIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgYm9yZGVyLXRvcDogMTBweCBzb2xpZCBAZ3JleWRhcms7CisgIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50OworICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMzQ5cHgpIHsKKyAgICByaWdodDogLTVweDsKKyAgfQorfQorCisuYnRuLXNvcnQuYnRuLXNvcnQtYXNjOmJlZm9yZXsKKyAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsKK30KKworLmJ0bi1zb3J0LmJ0bi1zb3J0LWRlc2M6YWZ0ZXJ7CisgIGJvcmRlci10b3A6IDEwcHggc29saWQgQG1haW4tY29sb3ItdGhlbWU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBFbmQgYnRuLXNvcnQgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogIEJlZ2luIGRlZmF1dCBjb2xvdXIgY2xhc3MgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisuZGFyay1jb2xvciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyayAhaW1wb3J0YW50OworfQorLm1haW4tY29sb3IgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW4gIWltcG9ydGFudDsKK30KKy5tZWRpdW0tY29sb3IgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWVkaXVtLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWVkaXVtICFpbXBvcnRhbnQ7Cit9CisubGlnaHQtY29sb3IgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQtY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1saWdodCAhaW1wb3J0YW50OworfQorLmxpZ2h0Mi1jb2xvciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBsaWdodDItY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1saWdodCAhaW1wb3J0YW50OworfQorCisuZ3JleS1jb2xvciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBncmV5ICFpbXBvcnRhbnQ7Cit9CisuZGFya2dyZXktY29sb3IgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleWRhcmsgIWltcG9ydGFudDsKK30KKworLyogYmVnaW4gbG9va3VwIHdpZGdldCAqLworLnVpLWRpYWxvZyB7CisgIG9wYWNpdHk6IDE7CisgIHotaW5kZXg6IDUwOworfQorCisudWktZGlhbG9nLXRpdGxlYmFyLnVpLXdpZGdldC1oZWFkZXIudWktY29ybmVyLWFsbC51aS1oZWxwZXItY2xlYXJmaXggeworICBiYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgIGJ1dHRvbiB7CisgICAgYmFja2dyb3VuZDogbm9uZTsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQtY29sb3ItdGhlbWU7CisgIH0KK30KKy8qIGVuZCBsb29rdXAgd2lkZ2V0ICovCisKKy5tYWluLWJhci1sYWJlbCB7CisgIGNvbG9yOiBAbGlnaHQtY29sb3ItdGhlbWU7CisgIHBhZGRpbmctbGVmdDogM3B4OworICBwYWRkaW5nLXJpZ2h0OiA2cHg7CisgIGZvbnQtc2l6ZTogMTVweDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKyNjb21wYW55LWxvZ28geworICByaWdodDogMTBweDsKKyAgdG9wOiAycHg7CisgIGJhY2tncm91bmQ6IHVybCgiaW1hZ2VzL29mYml6LXNpbXBsZS13aGl0ZS5zdmciKSBuby1yZXBlYXQgbGVmdCB0b3AgLyBjb3ZlcjsKKyAgbWluLWhlaWdodDogNTBweDsKKyAgbWluLXdpZHRoOiA1MHB4OworICBtYXJnaW4tcmlnaHQ6IDE1cHg7CisgIGFsaWduLXNlbGY6IGNlbnRlcjsKKyAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aCA6IDEyMzJweCkgeworICAgIG1pbi1oZWlnaHQ6IDUwcHg7CisgICAgbWluLXdpZHRoOiAxMjlweDsKKyAgICBiYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9vZmJpei13aGl0ZS5zdmciKSBuby1yZXBlYXQgbGVmdCB0b3AgLyBjb3ZlcjsKKyAgfQorfQorCisubW9kYWwtc2NyZWVuIHsKKyAgdmlzaWJpbGl0eTogaGlkZGVuOworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsKKyAgb3BhY2l0eTogLjkzOworICBwb3NpdGlvbjogZml4ZWQ7CisgIHRvcDogMDsKKyAgbGVmdDogMDsKKyAgaGVpZ2h0OiAxMDAlOworICB3aWR0aDogMTAwJTsKKyAgei1pbmRleDogOTk5OTsKK30KKworLm1vZGFsLWJveHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICBvcGFjaXR5OiAxOworICBtYXJnaW46IDEwJTsKKyAgYm9yZGVyLXJhZGl1czogMTBweDsKKyAgYm9yZGVyOiBzb2xpZCAycHggQG1haW4tY29sb3ItdGhlbWU7CisgIHBhZGRpbmcgOiAxMHB4IDQwcHggMTBweCA0MHB4OworICAubW9kYWwtaGVhZGVyIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBmbGV4LWRpcmVjdGlvbjogcm93OworICAgIGgyIHsKKyAgICAgIGZvbnQtc2l6ZTogMjVweDsKKyAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgfQorICAgIC5idG4tY2xvc2UtbnJkIHsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIHJpZ2h0OiAwOworICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgICAgYm9yZGVyOiBzb2xpZCAxcHggQG1haW4tY29sb3ItdGhlbWU7CisgICAgICBib3JkZXItcmFkaXVzOiA1cHg7CisgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgICBmb250LXNpemU6IDI1cHg7CisgICAgICBoZWlnaHQ6IDMwcHg7CisgICAgICB3aWR0aDogMzBweDsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OworICAgIH0KKyAgfQorICAubW9kYWwtYm9keSB7CisgICAgcCB7CisgICAgICBmb250LXNpemU6IDIwcHg7CisgICAgfQorICB9CisgIC5tb2RhbC1mb290ZXIgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBoZWlnaHQ6IDM1cHg7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOworICAgIC5idG4tbnJkIHsKKyAgICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgICBib3JkZXI6IG5vbmU7CisgICAgICB0ZXh0LXNoYWRvdzogbm9uZTsKKyAgICAgIG9wYWNpdHk6IDE7CisgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CisgICAgICBmb250LXNpemU6IDIwcHg7CisgICAgICBwYWRkaW5nOiA1cHg7CisgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CisgICAgfQorICAgIC5idG4tbnJkLW1haW4geworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgICBjb2xvcjogQHdoaXRlOworICAgIH0KKyAgICAuYnRuLW5yZC1zdGQgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgYm9yZGVyOiBzb2xpZCAxcHggQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgICB9CisgIH0KK30KKy5idG4tbnJkOmhvdmVyIHsKKyAgYm94LXNoYWRvdzogNXB4IDVweCAzcHggMCBAYmxhY2s7Cit9CisKKy5idG4tbnJkLXN0ZDpob3ZlciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgIGNvbG9yOiBAd2hpdGUgIWltcG9ydGFudDsKKyAgYm9yZGVyOiBzb2xpZCAxcHggQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsKK30KKworLmJ0bi1jbG9zZS1ucmQ6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICBjb2xvcjogQHdoaXRlICFpbXBvcnRhbnQ7Cit9CisKKy5saXN0LW5yZCB7CisgIGJvcmRlcjogc29saWQgMnB4IEBtYWluLWNvbG9yLXRoZW1lOworICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxMHB4OworICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMTBweDsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgbWFyZ2luLXRvcDogMTVweDsKKyAgbWFyZ2luLWJvdHRvbTogMTVweDsKKyAgLnRpdGxlLWxpc3QtbnJkIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICBjb2xvciA6IEB3aGl0ZTsKKyAgICBmb250LXNpemU6IDIwcHg7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgcGFkZGluZy1sZWZ0OiA1cHg7CisgIH0KKworICBsaSB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgICBmb250LXNpemU6IDIwcHg7CisgICAgcGFkZGluZy1sZWZ0OiA1cHg7CisgICAgcGFkZGluZy10b3A6IDJweDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMnB4OworICAgIG1hcmdpbi1ib3R0b206IDNweDsKKyAgICBhIHsKKyAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICB9CisgICAgc3BhbiB7CisgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICByaWdodDogMDsKKyAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICAgIGZvbnQtc2l6ZTogMzBweDsKKyAgICB9CisgIH0KK30KK2xpLmxpbmUtb2RkIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lOworfQorCisjdXNlci1hdmF0YXIgeworICBoZWlnaHQ6IDQwcHg7CisgIHdpZHRoOiA0MHB4OworICBwYWRkaW5nOiAycHg7CisKKyAgYWxpZ24tc2VsZjogY2VudGVyOworCisgIDpob3ZlciB7CisgICAgY3Vyc29yOiBwb2ludGVyOworICB9CisgIGltZyB7CisgICAgbWF4LWhlaWdodDogNDBweDsKKyAgICBtYXgtd2lkdGg6IDQwcHg7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHRvcDogLTJweDsKKyAgICBwYWRkaW5nOiAycHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICAgIGJvcmRlci1yYWRpdXM6IDJweDsKKyAgfQorfQorCisjbWFpbi1uYXZpZ2F0aW9uLWJhciB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgd2lkdGg6IDEwMCU7CisgIG1pbi13aWR0aDogQG1pbi1jb250YWluZXItd2lkdGg7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKKyAgZm9udC1mYW1pbHk6IFF1aWNrc2FuZCxzYW5zLXNlcmlmOworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgei1pbmRleDogNTsKKyAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQ7Cit9CisjbWFpbi1uYXYtYmFyLWxlZnQgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGRpc3BsYXk6IGZsZXg7CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cit9CisjbWFpbi1uYXYtYmFyLXJpZ2h0IHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBkaXNwbGF5OiBmbGV4OworICBhbGlnbi1pdGVtczogY2VudGVyOworICBwYWRkaW5nLXJpZ2h0OiAxNXB4OworfQorCisuYXBwLWJ0bnsKKyAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQ7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICBkaXNwbGF5OiBmbGV4OworICBhbGlnbi1pdGVtczogY2VudGVyOworICBmbGV4LWRpcmVjdGlvbjogcm93OworICBtYXJnaW4tcmlnaHQ6IDJweDsKKyAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgYSB7CisgICAgcGFkZGluZzoxMHB4OworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICBmb250LXNpemU6IDEuNGVtICFpbXBvcnRhbnQ7CisgIH0KK30KKworLmFwcC1idG4gYTp2aXNpdGVkIHsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworfQorCisuYXBwLWJ0bjpob3ZlcnsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB0b3A6IC02cHg7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA1cHg7CisgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA1cHg7CisgIGJveC1zaGFkb3c6IDFweCAxcHggMTJweCBAc2hhZG93LWNvbG9yOworICBhIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgdG9wOiA2cHg7CisgICAgY29sb3IgOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgfQorfQorLmFwcC1idG4uc2VsZWN0ZWQ6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgYm94LXNoYWRvdzogbm9uZTsKKyAgdG9wOjA7Cit9CisKKy5hcHAtYnRuIGE6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisjYXBwLXNlbGVjdGVkIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICBhbGlnbi1pdGVtczogY2VudGVyOworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGJveC1zaGFkb3c6IDFweCAtMnB4IDEycHggQHNoYWRvdy1jb2xvcjsKKyAgei1pbmRleDogMDsKKyAgb3BhY2l0eTogLjk5OworICBib3JkZXItdG9wLWxlZnQtcmFkaXVzIDogOHB4IDsKKyAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMgOiA4cHggOworICBhIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgdG9wOiAzcHg7CisgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICB9Cit9CisuYXBwLWJ0bi5zZWxlY3RlZCBhOmhvdmVyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisjYXBwLWJhci1saW5lIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB3aWR0aDogMTAwJTsKKyAgbWluLXdpZHRoOiBAbWluLWNvbnRhaW5lci13aWR0aDsKKyAgaGVpZ2h0OiBAY29sb3ItbGluZS1oZWlnaHQ7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICBib3gtc2hhZG93OiAycHggMnB4IDVweCBAc2hhZG93LWNvbG9yOworfQorI2NvbG9yLWFkZCB7CisgIHdpZHRoOiAxNTBweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGhlaWdodDogQGNvbG9yLWxpbmUtaGVpZ2h0OworICB6LWluZGV4OiAyMDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB0b3A6IEBjb2xvci1saW5lLWhlaWdodDsKK30KKworI21vcmUtYXBwIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBkaXNwbGF5OiBmbGV4OworICBhbGlnbi1pdGVtczogY2VudGVyOworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGZvbnQtc2l6ZTogMS40ZW0gIWltcG9ydGFudDsKKyAgd2lkdGg6IDQwcHg7CisgIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0OworICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7Cit9CisjbW9yZS1hcHA6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorI21vcmUtYXBwOmhvdmVyICNtb3JlLWFwcC1saXN0IHsKKyAgZGlzcGxheTogYmxvY2s7Cit9CisjbW9yZS1hcHAuc2VsZWN0ZWQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKK30KKworI21vcmUtYXBwLWxpc3QgeworICBkaXNwbGF5OiBub25lOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHRvcDogQGFwcC1iYXItaGVpZ2h0OworICBsZWZ0OiAtMjBweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIHotaW5kZXg6IDEwOworICBib3JkZXI6IHNvbGlkIDRweCBAbWFpbi1jb2xvci10aGVtZTsKKyAgYm9yZGVyLXRvcC13aWR0aDogQGNvbG9yLWxpbmUtaGVpZ2h0OworICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CisgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7CisgIGxpIHsKKyAgICBwYWRkaW5nLWxlZnQgOiA0cHg7CisgICAgcGFkZGluZy1yaWdodDogNHB4OworICB9CisKKyAgYSB7CisgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgIGZvbnQtc2l6ZTogMTVweDsKKyAgfQorCisgIDpob3ZlciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1lZGl1bS1jb2xvci10aGVtZTsKKyAgICBhIHsKKyAgICAgIGJveC1zaGFkb3c6IG5vbmU7CisgICAgICBjb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgICAgfQorICAgIGE6aG92ZXJ7CisgICAgICBib3gtc2hhZG93OiBub25lOworICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgYm9yZGVyLXJhZGl1czogMDsKKyAgICB9CisgIH0KKworICBsaS5zZWxlY3RlZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgYSB7CisgICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47CisgICAgfQorICAgIGE6aG92ZXIgeworICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgfQorICB9Cit9CisKKyNob21lQnV0dG9uIHsKKyAgZGlzcGxheTogZmxleDsKKyAgLy92aXNpYmlsaXR5OiBoaWRkZW47CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICBiYWNrZ3JvdW5kLWNvbG9yOkBncmV5OworICBib3JkZXI6IG5vbmU7CisgIGJvcmRlci1yYWRpdXMgOiAwOworCisgIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0OworICB3aWR0aCA6IEBob21lLWJ0bi13aWR0aDsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICBpbWcgeworICAgIGhlaWdodDogMjVweDsKKyAgICB0cmFuc2l0aW9uOiBhbGwgLjJzIGVhc2UtaW4tb3V0OworICB9Cit9CisKKyNob21lQnV0dG9uOmhvdmVyIGltZyB7CisgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsKK30KKworI2FwcC1iYXItbGlzdCB7CisgIGRpc3BsYXk6IGZsZXg7Cit9CisKKyN1c2VyLWRldGFpbHMgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAyMHB4OworICB0b3AgOiA2MnB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgY29sb3IgOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgZm9udC1zaXplOiAxNXB4OworICBmb250LXdlaWdodDogYm9sZDsKKyAgcGFkZGluZy10b3A6IDVweDsKKyAgcGFkZGluZy1ib3R0b206IDEwcHg7CisgIHotaW5kZXg6IDE1OworICBib3gtc2hhZG93OiAzcHggM3B4IDEycHggQHNoYWRvdy1jb2xvcjsKKyAgYm9yZGVyLXJhZGl1czogM3B4OworICB0cmFuc2l0aW9uOiBhbGwgLjFzIGVhc2UtaW4tb3V0OworCisgIGltZyB7CisgICAgaGVpZ2h0OiA1MHB4OworICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgICBwYWRkaW5nOiA0cHg7CisgICAgYm9yZGVyLXJhZGl1cyA6IDNweDsKKyAgICBtYXJnaW4tbGVmdDogMTBweDsKKyAgICBtYXJnaW4tcmlnaHQ6IDVweDsKKyAgfQorICAjbG9nb3V0IHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgICAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgICAgYm9yZGVyLXJhZGl1czogMnB4OworICAgIDpob3ZlciB7CisgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgfQorICB9Cit9CisKKyN1c2VyLWRldGFpbHM6YWZ0ZXJ7CisgIGNvbnRlbnQ6ICcnOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHRvcDogLTEwcHg7CisgIHJpZ2h0OiA1cHg7CisgIHdpZHRoOiAwOworICBoZWlnaHQ6IDA7CisgIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCBAZGFyay1jb2xvci10aGVtZTsKKyAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7Cit9CisKK2EudXNlci1wcmVmLWJ0biB7CisgIG1hcmdpbi10b3A6IDE1cHg7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICBtYXJnaW4tbGVmdDogMTBweDsKKyAgbWFyZ2luLXJpZ2h0OiAxMHB4OworICBwYWRkaW5nLXRvcDogMnB4OworICBwYWRkaW5nLWJvdHRvbTogMnB4OworICBkaXNwbGF5OiBmbGV4OworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrICFpbXBvcnRhbnQ7CisgIDpob3ZlciB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICB9Cit9CisKKyN1c2VyLW5hbWUgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgYWxpZ24tY29udGVudDogY2VudGVyOworICBwYWRkaW5nLWxlZnQgOiA1cHg7CisgIHBhZGRpbmctcmlnaHQgOiA1cHg7CisgIHNwYW4geworICAgIG1pbi13aWR0aDogMTAwcHg7CisgICAgcGFkZGluZy1ib3R0b20gOiA1cHg7CisgICAgcGFkZGluZy10b3AgOiA1cHg7CisgIH0KK30KKworI3VzZXItcm93MSB7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAjdXNlci1sYW5nIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgYWxpZ24tY29udGVudDogY2VudGVyOworICAgIHBhZGRpbmctbGVmdDogMTBweDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4OworICAgIHNwYW4geworICAgICAgbWluLXdpZHRoOiAzMHB4OworICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgIH0KKyAgfQorfQorCisuYXBwYmFyLWJ0bi1pbWcgeworICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodCAtIDQwcHg7Cit9CisKKyNoZWxwLWJ0biB7CisgIGZvbnQtc2l6ZTogMTBweDsKKyAgbWluLXdpZHRoOiAyMHB4OworICBtYXJnaW4tcmlnaHQ6IDE1cHg7Cit9CisvKiBCZWdpbiBzdWIgTWVudSBzZWN0aW9uICovCisKKyNhcHAtbmF2aWdhdGlvbiB7CisgIGhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodDsKKyAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggQGJsYWNrOworICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOworICB3aWR0aDogMTAwJTsKKyAgbWluLXdpZHRoOiBAbWluLWNvbnRhaW5lci13aWR0aDsKKyAgaDIgeworICAgIGRpc3BsYXk6IG5vbmU7CisgIH0KKyAgdWwgeworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsKKyAgICBmbGV4LWdyb3c6IDE7CisgIH0KKyAgdWwgbGkgdWwgbGkgeworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggQGJsYWNrOworICAgIGhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodDsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAganVzdGlmeS1pdGVtczogY2VudGVyOworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIG1pbi13aWR0aDogNzVweDsKKyAgICBwYWRkaW5nLWxlZnQ6IDZweDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA2cHg7CisgICAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCBAYmxhY2s7CisgICAgZm9udC1zaXplOiAxMnB4OworICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDE1MDBweCkgeworICAgICAgZm9udC1zaXplOiAxMHB4OworICAgICAgbWluLXdpZHRoOiA2NXB4OworICAgIH0KKyAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMzAwcHgpIHsKKyAgICAgIGZvbnQtc2l6ZTogMTBweDsKKyAgICAgIG1pbi13aWR0aDogNTBweDsKKyAgICB9CisgICAgYSB7CisgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgd2lkdGg6IDEwMCU7CisgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgfQorICB9Cit9CisKKyNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaTpsYXN0LWNoaWxkIHsKKyAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggQGJsYWNrOworfQorCisjYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGk6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgbWluLWhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICAvL3RvcDogLTFweDsKKyAgYSB7CisgICAgY29sb3I6IEB3aGl0ZTsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIH0KK30KKyNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaS5zZWxlY3RlZDpob3ZlciB7CisgIGEgeworICAgIGNvbG9yOiBAYmxhY2sgIWltcG9ydGFudDsKKyAgfQorfQorCisjYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGkuc2VsZWN0ZWQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgdG9wOiAxcHg7CisgIGhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodCArIDFweDsKKyAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsKKyAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMnB4OworICBib3JkZXItYm90dG9tOiBub25lOworCisgIDphZnRlciB7CisgICAgY29udGVudDogJyc7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogLTJweDsKKyAgICBsZWZ0OiA1cHg7CisgICAgd2lkdGg6IDA7CisgICAgaGVpZ2h0OiAwOworICAgIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOworICAgIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50OworICB9CisKK30KKworCisvKiBFbmQgc3ViIE1lbnUgc2VjdGlvbiAqLworCisvKiBiZWdpbiBzdWIgTWVudSBzZWN0aW9uIDNyZCBsZXZlbCAqLworCisuYnV0dG9uLWJhci50YWItYmFyIHsKKyAgdWwgbGkgdWwgbGkgeworICAgIGJvcmRlcjogc29saWQgMXB4IEBncmV5OworICAgIGJvcmRlci1yYWRpdXM6IDRweDsKKyAgICBhIHsKKyAgICAgIHdpZHRoOiAxMDAlOworICAgICAgaGVpZ2h0OiAxMDAlOworICAgIH0KKyAgfQorICBsaS5zZWxlY3RlZHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICBheworICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICAgIH0KKyAgfQorICB1bCBsaSB1bCBsaTpob3ZlciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgYSB7CisgICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW4gOworICAgIH0KKyAgfQorfQorCisjdGhpcmQtbGV2ZWwtbWVudS1jb250YWluZXIgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogcm93OworfQorI3dvcmtpbmctYXJlYSB7CisgIHdpZHRoOiAxMDAlOworfQorCisjbGVmdC1jb2x1bW4tbWVudSB7CisgIHdpZHRoOiAxMDBweDsKK30KKworLnRoaXJkLWx2bC1tZW51IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgbGVmdDogLTEwcHg7CisgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7CisgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7CisgIHBhZGRpbmctdG9wOiA0cHg7CisgIHBhZGRpbmctYm90dG9tOiA0cHg7CisgIHVsIHsKKyAgICBsaSB7CisgICAgICB1bCB7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgdG9wOiA1cHg7CisgICAgICAgIHdpZHRoOiBAdGhpcmQtbHZsLXdpZHRoOworICAgICAgfQorICAgIH0KKyAgfQorICBoMiB7CisgICAgdmlzaWJpbGl0eTogaGlkZGVuOworICB9Cit9CisudGhpcmQtbGV2ZWwtaXRlbTpsYXN0LWNoaWxkIHsKKyAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lOworfQorCisudGhpcmQtbGV2ZWwtaXRlbSB7CisgIG1pbi1oZWlnaHQ6IEB0aGlyZC1sdmwtaGVpZ2h0OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgcGFkZGluZy1yaWdodDogM3B4OworICBib3JkZXItdG9wOiBzb2xpZCAxcHggQG1haW4tY29sb3ItdGhlbWU7CisKKyAgYSwgYTp2aXNpdGVkIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgd2lkdGg6IDEwMCU7CisgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrICFpbXBvcnRhbnQ7CisgICAgbWluLWhlaWdodDogQHRoaXJkLWx2bC1oZWlnaHQ7CisgICAgbWF4LXdpZHRoOiBAdGhpcmQtbHZsLXdpZHRoOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgfQorfQorLnRoaXJkLWxldmVsLWl0ZW0uc2VsZWN0ZWQgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGJvcmRlci1sZWZ0OiBzb2xpZCA5cHggQG1haW4tY29sb3ItdGhlbWU7CisgIGEsIGE6dmlzaXRlZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICAgIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICB9CisgIDphZnRlciB7CisgICAgY29udGVudDogJyc7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogNXB4OworICAgIGxlZnQ6IDA7CisgICAgd2lkdGg6IDA7CisgICAgaGVpZ2h0OiAwOworICAgIGJvcmRlci10b3A6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CisgICAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgQG1haW4tY29sb3ItdGhlbWU7CisgICAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgfQorfQorCisudGhpcmQtbGV2ZWwtaXRlbSBhOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbiA7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKy8qIEVuZCAzcmQgbGV2ZWwgbWVudSAqLworCisKKworLyogQmVnaW4gSG9tZSBNZW51IGZvciBJQiBzZWN0aW9uICovCisuZml4ZWQtbmF2LWJhciB7CisgIHBvc2l0aW9uOiBmaXhlZCAhaW1wb3J0YW50OworICB3aWR0aDogMTAwJTsKK30KKyNuYXYtYmFyLW9mZnNldCB7CisgIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0IDsKK30KKworI2hvbWVHbHlwaCB7CisgIG1hcmdpbi1sZWZ0OiAyMHB4OworICBoZWlnaHQ6IDIwcHg7Cit9CisKKyNob21lUGFnZVRpdGxlIHsKKyAgY29sb3I6IEB3aGl0ZTsKKyAgZm9udC1zaXplOiAyMHB4OworICBmb250LXdlaWdodDogYm9sZDsKKyAgbWFyZ2luLXJpZ2h0OiAyMHB4OworICBtYXJnaW4tbGVmdDogMjBweDsKK30KKy5ob21lLW1lbnUtbGlzdCB7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cit9CisuaHAtYXBwbGlzdCB7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgIGNvbG9yIDogQHdoaXRlOworICBhbGlnbi1pdGVtczogY2VudGVyOworICAuYXBwLXRpdGxlIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgICAgaGVpZ2h0OiBAaG9tZS1tZW51LXRpbGUtaGVpZ2h0OworICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAxMHB4OworICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCBAYmxhY2s7CisgICAgc3BhbiB7CisgICAgICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWYgIWltcG9ydGFudDsKKyAgICAgIGZvbnQtc2l6ZTogMTVweDsKKyAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgd2lkdGg6IDExMHB4OworICAgICAgYSB7CisgICAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgICAgICBjb2xvciA6IEB3aGl0ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAuaHAtbWVudS1pdGVtIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIG1hcmdpbi1sZWZ0OiA1cHg7CisgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CisgICAgYm9yZGVyOiBzb2xpZCAycHggQGdyZXk7CisgICAgYm9yZGVyLXJhZGl1czogOHB4OworICAgIGhlaWdodDogQGhvbWUtbWVudS10aWxlLWhlaWdodCAtIDRweDsKKyAgICBtaW4td2lkdGg6IEBob21lLW1lbnUtdGlsZS1taW4td2lkdGg7CisgICAgbWF4LXdpZHRoOiBAaG9tZS1tZW51LXRpbGUtbWF4LXdpZHRoOworICAgIC5tZW51LWxpbmsgeworICAgICAgZm9udC1zaXplOiAxMHB4OworICAgICAgY29sb3I6IEBibGFjazsKKyAgICAgIHBhZGRpbmc6IDEwcHg7CisgICAgfQorICAgIC5zdGFyLWxpbmsgeworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgaGVpZ2h0OiAyNXB4OworICAgICAgdG9wOiA1cHg7CisgICAgICByaWdodDogNXB4OworICAgIH0KKyAgfQorCit9CisuaHAtYXBwbGlzdCAuYXBwLXRpdGxlIHNwYW4gYTpob3ZlciB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLmhwLW1lbnUtaXRlbS5mYXZvcml0ZUl0ZW0geworICBib3JkZXI6IHNvbGlkIDJweCBAZGFyay1jb2xvci10aGVtZTsKK30KKworLmhwLW1lbnUtaXRlbTpob3ZlciB7CisgIGJveC1zaGFkb3c6IDNweCAzcHggMTJweCBAc2hhZG93LWNvbG9yOworICBhIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIH0KK30KKworLyogRW5kIEhvbWUgTWVudSBmb3IgSUIgc2VjdGlvbiAqLworCisvKiBCZWdpbiBMb2dpbiBzY3JlZW5sZXQgKi8KKyNsb2dpbi1jb250YWluZXIgeworICAjY29udGVudC1tZXNzYWdlcyB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHRvcDogQGFwcC1iYXItaGVpZ2h0OworICAgIGJvcmRlci1yYWRpdXM6IDRweDsKKyAgICB3aWR0aDogOTclOworICAgICYuZXJyb3JNZXNzYWdlIHsKKyAgICAgIGJhY2tncm91bmQtY29sb3IgOiBAY29sb3ItYmFja2dyb3VuZC1hbGVydCAhaW1wb3J0YW50OworICAgICAgY29sb3I6IEBjb2xvci1mb250LWFsZXJ0ICFpbXBvcnRhbnQ7CisgICAgICBib3JkZXIgOiBzb2xpZCAxcHggQGNvbG9yLWJvcmRlci1hbGVydCAhaW1wb3J0YW50OworICAgIH0KKyAgICAmLmV2ZW50TWVzc2FnZSB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDogQGNvbG9yLWJhY2tncm91bmQtc3VjY2VzcyAhaW1wb3J0YW50OworICAgICAgY29sb3I6IEBjb2xvci1mb250LXN1Y2Nlc3MgIWltcG9ydGFudDsKKyAgICAgIGJvcmRlciA6IHNvbGlkIDFweCBAY29sb3ItYm9yZGVyLXN1Y2Nlc3MgIWltcG9ydGFudDsKKyAgICB9CisgIH0KK30KKyNsb2dpbkJhciB7CisgIHBvc2l0aW9uOiBmaXhlZDsKKyAgdG9wOjA7CisgIGxlZnQ6IDA7CisgIHdpZHRoOiAxMDAlOworICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodDsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIHNwYW4geworICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDVweDsKKyAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA1cHg7CisgICAgZm9udC1zaXplOiAyNXB4OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICB0b3A6IEBhcHAtYmFyLWhlaWdodCAtIDMycHg7CisgICAgbGVmdDogMTVweDsKKyAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTBweDsKKyAgfQorICAjY29tcGFueS1sb2dvIHsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIH0KK30KKworLmxvZ2luLXNjcmVlbmxldCB7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgIG1pbi13aWR0aDogMzAwcHg7CisgIG1heC13aWR0aDogNTBlbTsKKyAgYm9yZGVyLXJhZGl1czogOHB4ICFpbXBvcnRhbnQ7CisgIG1hcmdpbi10b3A6IDE1JTsKKyAgYm94LXNoYWRvdzogM3B4IDNweCAxMnB4IEBzaGFkb3ctY29sb3I7CisgIC5zY3JlZW5sZXQtdGl0bGUtYmFyIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKKyAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICBtYXJnaW46MDsKKyAgICBwYWRkaW5nOjA7CisgICAgaDN7CisgICAgICBwYWRkaW5nLXRvcDoycHg7CisgICAgICBwYWRkaW5nLWJvdHRvbToycHg7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgd2lkdGg6MTAwJTsKKyAgICAgIHRleHQtc2hhZG93OiBub25lOworICAgICAgZm9udC1zaXplOiAyNXB4OworICAgIH0KKyAgfQorICAuc2NyZWVubGV0LWJvZHkgeworICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgICAgZm9ybSB7CisgICAgICAuYnV0dG9uIHsKKyAgICAgICAgd2lkdGg6IDE1MHB4OworICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CisgICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICAgICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7CisgICAgICAgIHRleHQtc2hhZG93OiBub25lOworICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OworICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgICAgfQorCisgICAgICB0YWJsZSB7CisgICAgICAgIHRyIHsKKyAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICAubGFiZWwgeworICAgICAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICAgICAgICAgICAgd2lkdGg6IDI1JTsKKyAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDsKKyAgICAgICAgICB9CisgICAgICAgICAgaW5wdXQgeworICAgICAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgICAgfQorICAgICAgICAgIC5idXR0b250ZXh0LAorICAgICAgICAgIFt0eXBlPSJzdWJtaXQiXSB7CisgICAgICAgICAgICB3aWR0aDogMTUwcHg7CisgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CisgICAgICAgICAgICBiYWNrZ3JvdW5kOiBub25lOworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgICAgICAgICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7CisgICAgICAgICAgICB0ZXh0LXNoYWRvdzogbm9uZTsKKyAgICAgICAgICB9CisgICAgICAgICAgW25hbWU9IkdFVF9QQVNTV09SRF9ISU5UIl0geworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7CisgICAgICAgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICB9CisgICAgICAgICAgW25hbWU9IkVNQUlMX1BBU1NXT1JEIl0geworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7CisgICAgICAgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGQgeworICAgICAgICAgICAgcGFkZGluZzogNXB4OworICAgICAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4OworICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGEgeworICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICAgIH0KKyAgfQorfQorCisubG9naW4tc2NyZWVubGV0IC5zY3JlZW5sZXQtdGl0bGUtYmFyIHsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCisvKiBFbmQgTG9naW4gc2NyZWVubGV0ICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIEJlZ2luIFNjcmVlbmxldCBzdHlsZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLnNjcmVlbmxldC10aXRsZS1iYXIgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmUgOworICBjb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIGJhY2tncm91bmQtY29sb3I6IEBncmV5OworICBoZWlnaHQ6IDElOyAvKiBJRSBmaXggKi8KKyAgbWluLWhlaWdodDogMS41ZW07CisgIHBhZGRpbmc6MC44ZW0gMC4yZW07Cit9CisKKy5zY3JlZW5sZXQgeworICBib3JkZXItcmFkaXVzOiA1cHg7CisgIGJvcmRlcjogc29saWQgMXB4IEBncmV5OworICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsKKyAgbWFyZ2luLWJvdHRvbTogMWVtOworICBvdmVyZmxvdzogYXV0bzsKK30KKworLnNjcmVlbmxldC1ib2R5IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKKyAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CisgIGhlaWdodDogMSU7CisgIHBhZGRpbmc6IDAuNGVtOworfQorCisuc2NyZWVubGV0LWJvZHkgZGl2IHsKKyAgbWFyZ2luOiAwLjhlbSAwLjFlbQorfQorCisvKiBTcGVjaWFsIFNjcmVlbmxldCBzdHlsZSBmb3IgbG9jYWxlIGFuZCB0aW1lem9uZSB3aW5kb3cgKi8KKy5saXN0cy5zY3JlZW5sZXQgeworICBtYXJnaW4tbGVmdDogMjUlOworICBtYXJnaW4tcmlnaHQ6IDI1JTsKKyAgbWFyZ2luLXRvcDogMWVtOworfQorCisubGlzdHMuc2NyZWVubGV0IC5iYXNpYy10YWJsZSB0ciB0ZCB7CisgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLmxpc3RzLnNjcmVlbmxldCAuYmFzaWMtdGFibGUgdHIgdGQgYSB7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisvKiAgICAgIEFsdGVybmF0ZSB0YWJsZSBoZWFkZXIgc3R5bGUgICAgICAqLworLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGgsCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCB7CisgIGJhY2tncm91bmQtY29sb3I6IEBncmV5ZGFyazsKKyAgYm9yZGVyLWJvdHRvbTogMDsKKyAgYm9yZGVyLWxlZnQ6IDAuMWVtIHNvbGlkICNhYWE7CisgIGJvcmRlci1yaWdodDogMC4xZW0gc29saWQgIzg4ODsKKyAgY29sb3I6ICNmZmZmZmY7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisvKiBObyBwYWRkaW5nIHNjcmVlbmxldCBkZWNvcmF0b3IgKi8KKy5uby1wYWRkaW5nIHsKKyAgcGFkZGluZzogMDsKKyAgYm9yZGVyOiBub25lOworfQorCisubm8tcGFkZGluZyAuaDEsCisubm8tcGFkZGluZyAuaDIsCisubm8tcGFkZGluZyAuaDMsCisubm8tcGFkZGluZ3IgaDEsCisubm8tcGFkZGluZyBoMiwKKy5uby1wYWRkaW5nIGgzIHsKKyAgcGFkZGluZzogMC43ZW07Cit9CisKKy5zY3JlZW5sZXQtdGl0bGUtYmFyIHVsIGE6aG92ZXIgeworICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBFbmQgU2NyZWVubGV0IHN0eWxlICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBUYWJsZSBTdHlsZXMgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisuYmFzaWMtdGFibGUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICBjb2xvcjogIzAwMDAwMDsKKyAgbWFyZ2luLWJvdHRvbTogMWVtOworICB3aWR0aDogMTAwJTsKK30KKworZm9ybSB0YWJsZSwKK2Zvcm0gLmJhc2ljLXRhYmxlLAorLnNjcmVlbmxldC1ib2R5IC5iYXNpYy10YWJsZSB7CisgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OworICBtYXJnaW4tYm90dG9tOiAwOworfQorCisuYmFzaWMtdGFibGUgdHIgdGQgeworICAvKiBTdHlsZSBmb3IgYWxsIGNlbGxzICovCisgIHBhZGRpbmc6IDAuOGVtIDAuMWVtOworICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCisuYmFzaWMtdGFibGUgdHIgLmFsaWduLWJvdHRvbSB7CisgIHZlcnRpY2FsLWFsaWduOiBib3R0b207Cit9CisKKy5iYXNpYy10YWJsZSB0ciAuYWxpZ24tdG9wIHsKKyAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KKworLmJhc2ljLXRhYmxlIHRyIC5sYWJlbCwKKy5iYXNpYy10YWJsZSB0ciAuZ3JvdXAtbGFiZWwgeworICAvKiBmaWVsZCBsYWJlbHMgZm9yIGZvcm1zICovCisgIGZvbnQtd2VpZ2h0OiBib2xkOworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgcGFkZGluZy1yaWdodDogMS41ZW07CisgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgIHdpZHRoOiAxJTsKK30KKworLmJhc2ljLXRhYmxlIHRyIC5ncm91cC1sYWJlbCB7CisgIC8qICJoZWFkZXIiIGZvciBmaWVsZCBsYWJlbCBncm91cHMgKi8KKyAgZm9udC1zaXplOiAxLjJlbTsKKyAgcGFkZGluZzogMmVtIDEuNWVtIDAgMDsKK30KKworLmJhc2ljLXRhYmxlIHRyIHRoLAorLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93IHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIHRleHQtYWxpZ246IGxlZnQ7Cit9CisKKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdyB0ZCB7CisgIGJvcmRlci1ib3R0b206IDAuMWVtIHNvbGlkICMwMDAwMDA7Cit9CisKKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdyB0ZCBhIHsKKyAgY29sb3I6ICMwMDAwMDA7Cit9CisKKy5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvdyB7CisgIC8qIEFsdGVybmF0aW5nIHJvdyBzdHlsZSAqLworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOworfQorCisuYmFzaWMtdGFibGUgLnNlbGVjdGVkIHsKKyAgYmFja2dyb3VuZDogI0ZGRkNDRjsKK30KKworLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93U2VsZWN0ZWQgeworICBiYWNrZ3JvdW5kOiAjRkZGNTVGOworfQorCisuYmFzaWMtdGFibGUgLlZhbGlkYXRlIHsKKyAgLypTdHlsZSB1c2UgYnkgYWx0LXJvdy1zdHlsZSBvbiBsaXN0Ki8KKyAgYmFja2dyb3VuZDogI0EwRDVGNzsKK30KKworLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93VmFsaWRhdGUgeworICAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLworICBiYWNrZ3JvdW5kOiAjNzJBOEYyOworfQorCisuYmFzaWMtdGFibGUgLldhcm4geworICAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLworICBiYWNrZ3JvdW5kOiAjZjU1QzVDOworfQorCisuYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3dXYXJuIHsKKyAgLypTdHlsZSB1c2UgYnkgYWx0LXJvdy1zdHlsZSBvbiBsaXN0Ki8KKyAgYmFja2dyb3VuZDogI0ZDNzQ1NTsKK30KKworLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIHsKKyAgLyogYnV0dG9uIGNvbHVtbiBzdHlsZSAtIGZvciB0aGUgc21hbGwKKyAgY29sbGVjdGlvbiBvZiBidXR0b25zIHVzZWQgaW4gbGlzdHMgKi8KKyAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgcGFkZGluZzogMC4zZW07Cit9CisuYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgYSwKKy5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBidXR0b24sCisuYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgaW5wdXRbdHlwZT0icmVzZXQiXSwKKy5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBpbnB1dFt0eXBlPSJzdWJtaXQiXSwKKy5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBpbnB1dFt0eXBlPSJidXR0b24iXSB7CisgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKKyAgLW1vei1ib3JkZXItcmFkaXVzOiAxZW07CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMWVtOworICBib3JkZXItcmFkaXVzOiAycHg7CisgIGJvcmRlcjogMC4xZW0gc29saWQgQG1haW4tY29sb3ItdGhlbWU7CisgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgY3Vyc29yOiBwb2ludGVyOworICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGRpc3BsYXk6aW5saW5lLWJsb2NrOworICBmb250LXNpemU6IDAuOWVtOworICBmb250LXdlaWdodDogYm9sZDsKKyAgb3V0bGluZTogMDsKKyAgb3ZlcmZsb3c6IHZpc2libGU7CisgIHBhZGRpbmc6IDAuMWVtIDAuNWVtIDAuMmVtIDAuNWVtOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIHdpZHRoOiBhdXRvOworCisgICY6aG92ZXIgeworICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIGNvbG9yOiBAd2hpdGU7CisgIH0KK30KKworLmJhc2ljLXRhYmxlIC5jb2xsYXBzZWQgeworICB2aXNpYmlsaXR5OiBjb2xsYXBzZTsKK30KKworLyogICAgICBTb3J0IGZpZWxkIHN0eWxlICAgICAgKi8KKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoIC5zb3J0LW9yZGVyLWFzYywKKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIC5zb3J0LW9yZGVyLWFzY3sKKyAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYXJyb3ctZ3ItdXAucG5nKSBuby1yZXBlYXQgcmlnaHQ7CisgIHBhZGRpbmctbGVmdDogMC41ZW07CisgIHBhZGRpbmctcmlnaHQ6IDIwcHg7IC8qIFNldHRpbmcgbXVzdCBiZSBpbiBweCAqLworfQorLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGggLnNvcnQtb3JkZXItZGVzYywKKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIC5zb3J0LW9yZGVyLWRlc2N7CisgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LWdyLWR3LnBuZykgbm8tcmVwZWF0IHJpZ2h0OworICBwYWRkaW5nLWxlZnQ6IDAuNWVtOworICBwYWRkaW5nLXJpZ2h0OiAyMHB4OyAvKiBTZXR0aW5nIG11c3QgYmUgaW4gcHggKi8KK30KKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoIC5zb3J0LW9yZGVyLAorLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGQgLnNvcnQtb3JkZXJ7CisgIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LWdyLnBuZykgbm8tcmVwZWF0IHJpZ2h0OworICBwYWRkaW5nLWxlZnQ6IDAuNWVtOworICBwYWRkaW5nLXJpZ2h0OiAyMHB4OyAvKiBTZXR0aW5nIG11c3QgYmUgaW4gcHggKi8KKyAgY29sb3I6I2ZmZgorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBCZWdpbiBNZXNzYWdlIEluZm8gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy5jb3VudC1tZXNzYWdlIHsKKyAgZGlzcGxheTogZmxleDsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgIG1pbi1oZWlnaHQ6MjBweDsKKyAgbWluLXdpZHRoOiAyMHB4OworICBtYXgtaGVpZ2h0OjIwcHg7CisgIG1heC13aWR0aDogMjBweDsKKyAgYmFja2dyb3VuZDogQHdoaXRlOworICBmb250LXNpemU6MTJweDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGJvcmRlci1yYWRpdXM6IDUwJTsKK30KKy5pbmZvLW1lc3NhZ2UtdGl0bGUgeworICBtaW4td2lkdGg6MTUwcHg7CisgIG1hcmdpbjogNXB4OworICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogMTZweDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisubWVzc2FnZS1saXN0IHsKKyAgcG9zaXRpb246cmVsYXRpdmU7CisgIG1hcmdpbi10b3A6IDEwcHg7CisgIGJveC1zaGFkb3c6IDFweCAzcHggNXB4IEBncmV5ZGFyazsKKyAgYm9yZGVyLXJhZGl1czogMCA1cHggNXB4IDA7CisgIHRyYW5zaXRpb246IGhlaWdodCAyczsKK30KKy5tZXNzYWdlLWxpc3QtbWFpbiB7CisgIHBhZGRpbmc6IDVweCAxNXB4IDVweCAxNXB4OworfQorLm1lc3NhZ2UtbGlzdC1hbGVydCB7CisgIGJhY2tncm91bmQtY29sb3I6IEBjb2xvci1hbGVydDsKKyAgYm9yZGVyLWxlZnQgOiBzb2xpZCA1cHggQGNvbG9yLWFsZXJ0LWRhcms7CisgIC5jb3VudC1tZXNzYWdlIHsKKyAgICBjb2xvcjogQGNvbG9yLWFsZXJ0LWRhcms7CisgIH0KK30KKy5tZXNzYWdlLWxpc3Qtc3VjY2VzcyB7CisgIGJhY2tncm91bmQtY29sb3I6IEBjb2xvci1zdWNjZXNzOworICBib3JkZXItbGVmdDogc29saWQgNXB4IEBjb2xvci1zdWNjZXNzLWRhcms7CisgIC5jb3VudC1tZXNzYWdlIHsKKyAgICBjb2xvcjogQGNvbG9yLXN1Y2Nlc3MtZGFyazsKKyAgfQorfQorLm1lc3NhZ2UtbGlzdC10YWJsZS1jb250YWluZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgIGJvcmRlci1yYWRpdXM6IDVweDsKKyAgb3ZlcmZsb3c6IGhpZGRlbjsKKyAgaGVpZ2h0OiAwOworfQorLmluZm8tbWVzc2FnZS1zdWNjZXNzIHsKKyAgZGlzcGxheTogbm9uZTsKK30KKy5pbmZvLW1lc3NhZ2UtYWxlcnQgeworICBkaXNwbGF5OiBub25lOworfQordGFibGUubXNnLWxpc3QgeworICB3aWR0aDogMTAwJTsKKyAgZm9udC1zaXplOiAxNnB4OworICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7CisgIHBhZGRpbmc6IDA7CisgIHRoZWFkIHsKKyAgICBoZWlnaHQ6IDEwMCU7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgdHJ7CisgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCBAYmxhY2s7CisgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsKKyAgICAgIGxpbmUtaGVpZ2h0OiAzMHB4OworICAgIH0KKyAgfQorICB0Ym9keSB7CisgICAgdHIgeworICAgICAgbGluZS1oZWlnaHQ6IDI1cHg7CisgICAgfQorICAgIHRyLm1zZy1yb3ctc3VjY2VzcyB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3Itc3VjY2VzczsKKyAgICB9CisgICAgdHIubXNnLXJvdy1hbGVydCB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3ItYWxlcnQ7CisgICAgfQorICB9CisgIHRkIHsKKyAgICBwYWRkaW5nLWxlZnQ6IDVweDsKKyAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgRW5kICBNZXNzYWdlIEluZm8gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICBQYWdpbmF0ZSBTdHlsZSAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLnBhZ2luYXRlLWJhci1ucmQgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogcm93OworICBhbGlnbi1pdGVtczogY2VudGVyOworICBmb250LXNpemU6IDE1cHg7CisgIGJhY2tncm91bmQtY29sb3I6IEBncmV5OworICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgIHBhZGRpbmctdG9wOiAzcHg7CisgIHBhZGRpbmctYm90dG9tOiAzcHg7CisgIGJveC1zaGFkb3c6IDAgMnB4IDVweCBAc2hhZG93LWNvbG9yOworCisgIHVsLnBhZ2luYXRlLXBnLWxpc3QgeworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIG1hcmdpbi1yaWdodDogMTBweDsKKyAgICBib3JkZXItcmFkaXVzOiA4cHg7CisgICAgYm9yZGVyOiBzb2xpZCAxcHggQGJveC1ib3JkZXItY29sb3I7CisgICAgaGVpZ2h0OiAxOHB4OworICAgIGxpIHsKKyAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICAgIG1pbi13aWR0aDogMTdweDsKKyAgICAgIGJvcmRlci1yaWdodDogc29saWQgMXB4IEBib3gtYm9yZGVyLWNvbG9yOworICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CisgICAgICBwYWRkaW5nLXJpZ2h0OiAycHg7CisgICAgICBoZWlnaHQ6MTAwJTsKKyAgICAgIGEgeworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICAgICAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICAgICAgICBjb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgICAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICB9CisgICAgICAucGFnaW5hdGUtZGlzYWJsZSB7CisKKyAgICAgIH0KKyAgICB9CisgICAgbGkuc2VsZWN0ZWQgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgICBhIHsKKyAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICAgICAgfQorICAgIH0KKyAgICBsaTpmaXJzdC1jaGlsZCwgbGk6bGFzdC1jaGlsZCB7CisgICAgICB3aWR0aDogMjBweDsKKyAgICB9CisgICAgbGk6Zmlyc3QtY2hpbGQgeworICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogM3B4OworICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4OworICAgIH0KKyAgICBsaTpsYXN0LWNoaWxkIHsKKyAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7CisgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OworICAgIH0KKyAgfQorCit9CitzZWxlY3QucGFnaW5hdGUtc2VsZWN0IHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBiYWNrZ3JvdW5kOiBAd2hpdGU7CisgIGZvbnQtc2l6ZTogMTZweDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGJvcmRlcjogMXB4IHNvbGlkIEBib3gtYm9yZGVyLWNvbG9yOworICBvcHRpb24geworICAgIGRpc3BsYXk6IGZsZXg7CisgICAganVzdGlmeS1zZWxmOiBjZW50ZXI7CisgICAgZm9udC1zaXplOiAxNHB4OworICB9Cit9CisKKy5wYWdpbmF0ZS1zZWxlY3QtbGFiZWwgeworICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogMTZweDsKKyAgcGFkZGluZy1sZWZ0OiAxNXB4OworICBwYWRkaW5nLXJpZ2h0OiAxNXB4OworfQorCisucGFnaW5hdGUtaW5mb3JtYXRpb24geworICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogMTZweDsKKyAgcGFkZGluZy1sZWZ0OiAxNXB4OworICBwYWRkaW5nLXJpZ2h0OiAxNXB4OworfQorCit1bC5wYWdpbmF0ZS1wZy1saXN0IGxpOmhvdmVyeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgYSB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgfQorfQorCisvKiBFbmQgb2YgUGFnaW5hdGUgU3R5bGUgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgTGlzdCBOYXZpZ2F0aW9uIFN0eWxlICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLm5hdi1wYWdlciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBncmV5ZGFyazsKKyAgY29sb3I6IEB3aGl0ZTsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDlweDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGxpbmUtaGVpZ2h0OiAzLjVlbTsKKyAgaGVpZ2h0OiAzLjVlbTsKKyAgbWFyZ2luOiAwLjVlbSAwIDAuNWVtIDA7CisgIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwOworfQorCisubmF2LXBhZ2VyIHVsIHsKKyAgZGlzcGxheTogaW5saW5lOyAvKiBJRSBGaXggKi8KK30KKworLm5hdi1wYWdlciB1bCBsaSB7CisgIGZsb2F0OmxlZnQ7CisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKKy5uYXYtcGFnZXIgdWwgbGkgYSB7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisubmF2LXBhZ2VyIHVsIGEgeworICBjb2xvcjogQHdoaXRlOworICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisubmF2LXBhZ2VyIHVsIGE6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworfQorCisubmF2LXBhZ2VyIHVsIC5uYXYtcGFnZXNpemUsCisubmF2LXBhZ2VyIHVsIC5uYXYtcGFnZS1zZWxlY3QsCisubmF2LXBhZ2VyIHVsIC5uYXYtZGlzcGxheWluZyB7CisgIHBhZGRpbmc6IDAgMWVtIDAgMWVtOworfQorCisubmF2LXBhZ2VyIHVsIC5uYXYtZmlyc3QtZGlzYWJsZWQsCisubmF2LXBhZ2VyIHVsIC5uYXYtcHJldmlvdXMtZGlzYWJsZWQsCisubmF2LXBhZ2VyIHVsIC5uYXYtbmV4dC1kaXNhYmxlZCwKKy5uYXYtcGFnZXIgdWwgLm5hdi1sYXN0LWRpc2FibGVkIHsKKyAgcGFkZGluZzogMCAxZW0gMCAxZW07Cit9CisKKy5uYXYtcGFnZXIgdWwgLm5hdi1maXJzdC1kaXNhYmxlZDpob3ZlciwKKy5uYXYtcGFnZXIgdWwgLm5hdi1wcmV2aW91cy1kaXNhYmxlZDpob3ZlciwKKy5uYXYtcGFnZXIgdWwgLm5hdi1uZXh0LWRpc2FibGVkOmhvdmVyLAorLm5hdi1wYWdlciB1bCAubmF2LWxhc3QtZGlzYWJsZWQ6aG92ZXIgeworICBjdXJzb3I6IG5vdC1hbGxvd2VkOworfQorCisKKy5uYXYtcGFnZXIgdWwgLm5hdi1kaXNwbGF5aW5nIHsKKyAgYm9yZGVyLXJpZ2h0OiBub25lOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICBNdWx0aS1Db2x1bW4gU3R5bGVzICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2NvbHVtbi1jb250YWluZXIgeworICBtYXJnaW46IGF1dG87CisgIHBhZGRpbmc6IDFlbTsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBtaW4td2lkdGg6IEBtaW4tY29udGFpbmVyLXdpZHRoOworfQorCisjY29sdW1uLWNvbnRhaW5lciBoMSwKKyNjb2x1bW4tY29udGFpbmVyIC5oMSwKKyNjb2x1bW4tY29udGFpbmVyIGgyLAorI2NvbHVtbi1jb250YWluZXIgLmgyIHsKKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIGgxLAorI2NvbHVtbi1jb250YWluZXIgLmgxIHsKKyAgY29sb3I6ICM1NTc5OTY7Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5sZWZ0IHsKKyAgZmxvYXQ6IGxlZnQ7CisgIC8qIGFsdDogcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyAqLworICB3aWR0aDogMjJlbTsKKyAgbWFyZ2luLXJpZ2h0OiAxZW07Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5sZWZ0LWxhcmdlciB7CisgIGZsb2F0OiBsZWZ0OworICAvKiBhbHQ6IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwcHg7IGxlZnQ6IDBweDsgKi8KKyAgd2lkdGg6IDI1ZW07CisgIG1hcmdpbi1yaWdodDogMWVtOworfQorCisubGVmdGhhbGYgeworICBmbG9hdDogbGVmdDsKKyAgaGVpZ2h0OiAxJTsKKyAgbGVmdDogMDsKKyAgbWFyZ2luOiAwJSAxJSAxJSAwJTsKKyAgd2lkdGg6IDQ5JTsKK30KKworLnJpZ2h0aGFsZiB7CisgIGZsb2F0OiByaWdodDsKKyAgaGVpZ2h0OiAxJTsKKyAgbWFyZ2luOiAwIDAgMSUgMSU7CisgIHJpZ2h0OiAwOworICB3aWR0aDogNDklOworfQorCisjY29sdW1uLWNvbnRhaW5lciAucmlnaHQgeworICBmbG9hdDogcmlnaHQ7CisgIG1hcmdpbi1sZWZ0OiAxZW07CisgIHdpZHRoOiAyMmVtOworfQorCisjY29sdW1uLWNvbnRhaW5lciAubGVmdG9ubHkgeworICBtYXJnaW4tbGVmdDogMjNlbTsKKyAgd2lkdGg6IGF1dG87Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5sZWZ0b25seS1sYXJnZXIgeworICBtYXJnaW4tbGVmdDogMjZlbTsKKyAgd2lkdGg6IGF1dG87Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5yaWdodG9ubHkgeworICBtYXJnaW4tcmlnaHQ6IDIzZW07CisgIHdpZHRoOiBhdXRvOworfQorCisjY29sdW1uLWNvbnRhaW5lciAuY2VudGVyIHsKKyAgbWFyZ2luLWxlZnQ6IDIzZW07CisgIG1hcmdpbi1yaWdodDogMjNlbTsKKyAgd2lkdGg6IGF1dG87Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5ub2NvbHVtbnMgeworICB3aWR0aDogYXV0bzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBCdXR0b24gU3R5bGUgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisuYnV0dG9uLWJhciBsaS5idXR0b250ZXh0IGEsCithLmJ1dHRvbnRleHQsCithLmJ1dHRvbnRleHRiaWcsCisuc21hbGxTdWJtaXQsCisuc21hbGxTdWJtaXQ6aG92ZXIsCisubWVkaXVtU3VibWl0LAorLmxhcmdlU3VibWl0LAorLmxvZ2luQnV0dG9uLAorLmJ1dHRvbi1zdHlsZS0xIGEsCisuYnV0dG9uLXN0eWxlLTEgdWwgYSwKKy5idXR0b24tc3R5bGUtMiB1bCBhLAorLmJ1dHRvbi1zdHlsZS0yIGEsCisuYnV0dG9uLAorYnV0dG9uLAoraW5wdXRbdHlwZT0icmVzZXQiXSwKK2lucHV0W3R5cGU9InN1Ym1pdCJdLAoraW5wdXRbdHlwZT0iYnV0dG9uIl0geworICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CisgIC1tb3otYm9yZGVyLXJhZGl1czogMS4xZW07CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMS4xZW07CisgIGJvcmRlci1yYWRpdXM6IDJweDsKKyAgYm9yZGVyOiAwLjFlbSBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICBjdXJzb3I6IHBvaW50ZXI7CisgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgZGlzcGxheTppbmxpbmUtYmxvY2s7CisgIGZvbnQtc2l6ZTogMWVtOworICBmb250LXdlaWdodDogYm9sZDsKKyAgb3V0bGluZTogMDsKKyAgb3ZlcmZsb3c6IHZpc2libGU7CisgIHBhZGRpbmc6IDAuNGVtIDFlbSAwLjRlbTsKKyAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CisgIC8qdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyovCisgIHdpZHRoOiBhdXRvOworCisgIC8qIElFNyAqLworICAqcGFkZGluZy10b3A6IDAuMmVtOworICAqcGFkZGluZy1ib3R0b206IDA7CisgICY6aG92ZXIgeworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgfQorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgRm9vdGVyIFN0eWxlICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2Zvb3RlciB7CisgIGJhY2tncm91bmQ6IEBkYXJrLWNvbG9yLXRoZW1lOworICBib3JkZXItdG9wOiAwLjFlbSBpbnNldCAjMDAwOworICBwYWRkaW5nOiAwLjVlbSAwIDAuNWVtIDAuNWVtOworCisgIGhlaWdodDogQGZvb3Rlci1oZWlnaHQ7CisgIHBvc2l0aW9uOiBmaXhlZDsKKyAgYm90dG9tOiAwOworICB3aWR0aDogMTAwJTsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOworICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWYgIWltcG9ydGFudDsKKyAgei1pbmRleDogMTA7CisKKyAgc3BhbiB7CisgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgIHBhZGRpbmc6IDEwcHg7CisgIH0KKworICBhIHsKKyAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgfQorfQorCisjZm9vdGVyIGE6Zm9jdXMgeworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworI2Zvb3Rlci1vZmZzZXQgeworICBoZWlnaHQ6IEBmb290ZXItaGVpZ2h0ICsgMTBweDsKKyAgd2lkdGg6IDEwMCU7Cit9CmRpZmYgLS1naXQgYS90aGVtZXMvcmFpbmJvd3N0b25lL3dlYmFwcC9yYWluYm93c3RvbmUvcmFpbmJvd3N0b25lLXNhcGhpci5sZXNzIGIvdGhlbWVzL3JhaW5ib3dzdG9uZS93ZWJhcHAvcmFpbmJvd3N0b25lL3JhaW5ib3dzdG9uZS1zYXBoaXIubGVzcwppbmRleCBlYjI2YmEyLi5iYmFhYTExIDEwMDY0NAotLS0gYS90aGVtZXMvcmFpbmJvd3N0b25lL3dlYmFwcC9yYWluYm93c3RvbmUvcmFpbmJvd3N0b25lLXNhcGhpci5sZXNzCisrKyBiL3RoZW1lcy9yYWluYm93c3RvbmUvd2ViYXBwL3JhaW5ib3dzdG9uZS9yYWluYm93c3RvbmUtc2FwaGlyLmxlc3MKQEAgLTEsMTk5NyArMSwxOTk3IEBACi0vKiBjb21tb24gY29sb3JzICovDQotQGJsYWNrOiAjMDAwOw0KLUB3aGl0ZTogI2ZmZjsNCi1AZ3JleTogI2U2ZTZlNjsNCi1AZ3JleWRhcms6ICM5MjkyOTI7DQotDQotQGNvbG9yLXN1Y2Nlc3M6ICM4Y2ZmOGM7DQotQGZvbnQtY29sb3ItZm9yLXN1Y2Nlc3M6IEBibGFjazsNCi1AY29sb3ItYWxlcnQ6ICNmZjhjOGM7DQotQGZvbnQtY29sb3ItZm9yLWFsZXJ0OiBAYmxhY2s7DQotDQotQGNvbG9yLXN1Y2Nlc3MtZGFyazogIzM1NmUzNTsNCi1AZm9udC1jb2xvci1mb3Itc3VjY2VzczogQGJsYWNrOw0KLUBjb2xvci1hbGVydC1kYXJrOiAjOTMyZjMzOw0KLUBmb250LWNvbG9yLWZvci1hbGVydDogQGJsYWNrOw0KLQ0KLUBjb2xvci1iYWNrZ3JvdW5kLWFsZXJ0OiAjZjJkZWRlOw0KLUBjb2xvci1mb250LWFsZXJ0OiAjYTk0NDQyOw0KLUBjb2xvci1ib3JkZXItYWxlcnQ6ICNlYmNjZDE7DQotDQotQGNvbG9yLWJhY2tncm91bmQtc3VjY2VzczogI2RmZjBkODsNCi1AY29sb3ItZm9udC1zdWNjZXNzOiAjM2M3NjNkOw0KLUBjb2xvci1ib3JkZXItc3VjY2VzczogI2Q2ZTljNjsNCi0NCi0vKiBTYXBoaXIgY29sb3JzICovDQotQGJsdWUtZGFyazogIzAwMjMzMzsNCi1AYmx1ZS1tYWluOiAjMDA1OTgyOw0KLUBibHVlLW1lZGl1bTogI2M3ZGZmZjsNCi1AYmx1ZS1saWdodDogI2YxZjdmZjsNCi1AYmx1ZS1saWdodDI6ICNlNGYwZjU7DQotDQotLyogUnVieSBjb2xvcnMgKi8NCi1AcmVkLWRhcms6ICM0MjAwMDA7DQotQHJlZC1tYWluOiAjYmYxNjE2Ow0KLUByZWQtbWVkaXVtOiAjZjdiYWJhOw0KLUByZWQtbGlnaHQ6ICNmY2U3ZTc7DQotQHJlZC1saWdodDI6ICNmZWQ3Yzk7DQotDQotLyogRW1lcmFsZCBjb2xvcnMgKi8NCi1AZ3JlZW4tZGFyazogIzE5Nzk0ODsNCi1AZ3JlZW4tbWFpbjogIzIzYWY5YjsNCi1AZ3JlZW4tbWVkaXVtOiAjN2FlM2FkOw0KLUBncmVlbi1saWdodDogI2U1ZjllZjsNCi1AZ3JlZW4tbGlnaHQyOiAjZDdmOWVmOw0KLQ0KLS8qIEFtYmVyIGNvbG9ycyAqLw0KLUBhbWJlci1kYXJrOiAjYmM0MjE2Ow0KLUBhbWJlci1tYWluOiAjZjA4OTA2Ow0KLUBhbWJlci1tZWRpdW06ICNmNWM0YjM7DQotQGFtYmVyLWxpZ2h0OiAjZmNlZGU4Ow0KLUBhbWJlci1saWdodDI6ICNmY2VkY2Q7DQotDQotLyogU2FwaGlyIHRoZW1lICovDQotQG1haW4tY29sb3ItdGhlbWUgOiBAYmx1ZS1tYWluOw0KLUBkYXJrLWNvbG9yLXRoZW1lIDogQGJsdWUtZGFyazsNCi1AbWVkaXVtLWNvbG9yLXRoZW1lIDogQGJsdWUtbWVkaXVtOw0KLUBsaWdodC1jb2xvci10aGVtZSA6IEBibHVlLWxpZ2h0Ow0KLUBsaWdodDItY29sb3ItdGhlbWUgOiBAYmx1ZS1saWdodDI7DQotQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAZ3JleTsNCi1AZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsNCi1AZm9udC1jb2xvci1mb3ItbWVkaXVtIDogQGRhcmstY29sb3ItdGhlbWU7DQotQGZvbnQtY29sb3ItZm9yLWxpZ2h0IDogQGRhcmstY29sb3ItdGhlbWU7DQotQHNoYWRvdy1jb2xvciA6IEBibGFjazsNCi1Ac2hhZG93LWNvbG9yLWxpZ2h0IDogQGdyZXlkYXJrOw0KLQ0KLS8qIFJ1YnkgdGhlbWUgKi8NCi0vKg0KLUBtYWluLWNvbG9yLXRoZW1lIDogQHJlZC1tYWluOw0KLUBkYXJrLWNvbG9yLXRoZW1lIDogQHJlZC1kYXJrOw0KLUBtZWRpdW0tY29sb3ItdGhlbWUgOiBAcmVkLW1lZGl1bTsNCi1AbGlnaHQtY29sb3ItdGhlbWUgOiBAcmVkLWxpZ2h0Ow0KLUBsaWdodDItY29sb3ItdGhlbWUgOiBAcmVkLWxpZ2h0MjsNCi1AZm9udC1jb2xvci1mb3ItZGFyayA6IEBncmV5Ow0KLUBmb250LWNvbG9yLWZvci1tYWluIDogQHdoaXRlOw0KLUBmb250LWNvbG9yLWZvci1tZWRpdW0gOiBAZGFyay1jb2xvci10aGVtZTsNCi1AZm9udC1jb2xvci1mb3ItbGlnaHQgOiBAZGFyay1jb2xvci10aGVtZTsNCi1Ac2hhZG93LWNvbG9yIDogQGJsYWNrOw0KLUBzaGFkb3ctY29sb3ItbGlnaHQgOiBAZ3JleWRhcms7DQotLyoNCi0NCi0vKiBFbWVyYWxkIHRoZW1lICovDQotLyoNCi1AbWFpbi1jb2xvci10aGVtZSA6IEBncmVlbi1tYWluOw0KLUBkYXJrLWNvbG9yLXRoZW1lIDogQGdyZWVuLWRhcms7DQotQG1lZGl1bS1jb2xvci10aGVtZSA6IEBncmVlbi1tZWRpdW07DQotQGxpZ2h0LWNvbG9yLXRoZW1lIDogQGdyZWVuLWxpZ2h0Ow0KLUBsaWdodDItY29sb3ItdGhlbWUgOiBAZ3JlZW4tbGlnaHQyOw0KLUBmb250LWNvbG9yLWZvci1kYXJrIDogQHdoaXRlOw0KLUBmb250LWNvbG9yLWZvci1tYWluIDogQHdoaXRlOw0KLUBmb250LWNvbG9yLWZvci1tZWRpdW0gOiBAZGFyay1jb2xvci10aGVtZTsNCi1AZm9udC1jb2xvci1mb3ItbGlnaHQgOiBAZGFyay1jb2xvci10aGVtZTsNCi1Ac2hhZG93LWNvbG9yIDogQGJsYWNrOw0KLUBzaGFkb3ctY29sb3ItbGlnaHQgOiBAZ3JleWRhcms7DQotKi8NCi0vKiBBbWJlciB0aGVtZSAqLw0KLS8qDQotQG1haW4tY29sb3ItdGhlbWUgOiBAYW1iZXItbWFpbjsNCi1AZGFyay1jb2xvci10aGVtZSA6IEBhbWJlci1kYXJrOw0KLUBtZWRpdW0tY29sb3ItdGhlbWUgOiBAYW1iZXItbWVkaXVtOw0KLUBsaWdodC1jb2xvci10aGVtZSA6IEBhbWJlci1saWdodDsNCi1AbGlnaHQyLWNvbG9yLXRoZW1lIDogQGFtYmVyLWxpZ2h0MjsNCi1AZm9udC1jb2xvci1mb3ItZGFyayA6IEB3aGl0ZTsNCi1AZm9udC1jb2xvci1mb3ItbWFpbiA6IEB3aGl0ZTsNCi1AZm9udC1jb2xvci1mb3ItbWVkaXVtIDogQGRhcmstY29sb3ItdGhlbWU7DQotQGZvbnQtY29sb3ItZm9yLWxpZ2h0IDogQGRhcmstY29sb3ItdGhlbWU7DQotQHNoYWRvdy1jb2xvciA6IEBibGFjazsNCi1Ac2hhZG93LWNvbG9yLWxpZ2h0IDogQGdyZXlkYXJrOw0KLSovDQotDQotDQotQGFwcC1iYXItaGVpZ2h0OiA2MHB4Ow0KLUBzdWItYXBwLWJhci1oZWlnaHQ6IDQwcHg7DQotQGZvb3Rlci1oZWlnaHQ6IDIwcHg7DQotQGhvbWUtYnRuLXdpZHRoOiA0N3B4Ow0KLUBjb2xvci1saW5lLWhlaWdodDogOXB4Ow0KLQ0KLUBob21lLW1lbnUtdGlsZS1oZWlnaHQ6IDgwcHg7DQotQGhvbWUtbWVudS10aWxlLW1pbi13aWR0aDogMTAwcHg7DQotQGhvbWUtbWVudS10aWxlLW1heC13aWR0aDogMTAwcHg7DQotDQotQHRoaXJkLWx2bC1oZWlnaHQ6IDgwcHg7DQotQHRoaXJkLWx2bC13aWR0aCA6IDEwMHB4Ow0KLUBtaW4tc2NyZWVuIDogMTE3MHB4Ow0KLUBtaW4tY29udGFpbmVyLXdpZHRoOiAxMTMwcHg7DQotDQotQGJveC1ib3JkZXItY29sb3I6ICNkN2Q3ZDc7DQotDQotQGZvbnQtZmFjZSB7DQotICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7DQotICBzcmM6IHVybCgnZm9udHMvcXVpY2tzYW5kL3F1aWNrc2FuZGJvbGQub3RmJyk7DQotICBmb250LXdlaWdodDogbm9ybWFsOw0KLSAgZm9udC1zdHlsZTogbm9ybWFsOw0KLX0NCi0NCi1AZm9udC1mYWNlIHsNCi0gIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gIHNyYzogdXJsKCdmb250cy9xdWlja3NhbmQvcXVpY2tzYW5kYm9sZC5vdGYnKTsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgZm9udC1zdHlsZTogbm9ybWFsOw0KLX0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogQmVnaW4gc3BlY2lhbCBjaGVja2JveCB0eXBlIHN3aXRjaCAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1jaGtib3gsIFt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCB7DQotICBkaXNwbGF5OiBub25lOw0KLX0NCi0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1jaGtib3ggKyBsYWJlbCwNCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1jaGtib3ggKyBsYWJlbHsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi19DQotW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtY2hrYm94ICsgbGFiZWw6YmVmb3JlLA0KLVt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCArIGxhYmVsOmJlZm9yZXsNCi0gIGNvbnRlbnQ6ICIiOw0KLSAgd2lkdGg6IDE1MHB4Ow0KLSAgbWluLXdpZHRoOiAxNTBweDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBsaWdodC1jb2xvci10aGVtZTsNCi0gIHBhZGRpbmc6IDJweCAyMHB4IDJweCAyMHB4Ow0KLSAgYm9yZGVyLXJhZGl1czogOHB4IDhweCA4cHggOHB4Ow0KLQ0KLSAgY3Vyc29yOiBwb2ludGVyOw0KLX0NCi0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1jaGtib3ggKyBsYWJlbDphZnRlciwNCi1bdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1jaGtib3ggKyBsYWJlbDphZnRlcnsNCi0gIGNvbnRlbnQ6ICIiOw0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgbGVmdDotMzVweDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgbWluLWhlaWdodDogMTBweDsNCi0gIG1pbi13aWR0aDogMTBweDsNCi0gIHBhZGRpbmctbGVmdDogNHB4Ow0KLSAgcGFkZGluZy1yaWdodDogNXB4Ow0KLSAgYm9yZGVyLXJhZGl1czogOHB4IDhweCA4cHggOHB4Ow0KLSAgdHJhbnNpdGlvbjogYWxsIC4yczsNCi19DQotDQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94ICsgbGFiZWw6YWZ0ZXJ7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBsZWZ0OiAtMTVweDsNCi0gIHRyYW5zaXRpb246IGFsbCAuMnM7DQotfQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiBFbmQgc3BlY2lhbCBjaGVja2JveCB0eXBlIHN3aXRjaCAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogIEJlZ2luIHNxdWFyZSBDaGVja2JveCAgICAgICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94LA0KLVt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3h7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICBsZWZ0OiAtOTk5OXB4Ow0KLX0NCi0NCi1bdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWwsDQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsew0KLSAgY29udGVudDogJyc7DQotICBwYWRkaW5nLWxlZnQ6IDM1cHg7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBjdXJzb3I6IHBvaW50ZXI7DQotICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7DQotICBmb250LXNpemU6IDEycHg7DQotDQotfQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDpiZWZvcmUsDQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmJlZm9yZXsNCi0gIGNvbnRlbnQ6ICcnOw0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgbGVmdDoxMHB4Ow0KLSAgdG9wOiAtNHB4Ow0KLSAgd2lkdGg6IDE3cHg7DQotICBoZWlnaHQ6IDE3cHg7IC8qIGRpbS4gZGUgbGEgY2FzZSAqLw0KLSAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsNCi0gIGJhY2tncm91bmQ6IEBsaWdodC1jb2xvci10aGVtZTsNCi0gIGJvcmRlci1yYWRpdXM6IDJweDsNCi19DQotDQotW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmJlZm9yZSB7DQotICBiYWNrZ3JvdW5kOiBAbGlnaHQtY29sb3ItdGhlbWU7DQotfQ0KLVt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDpiZWZvcmV7DQotICBiYWNrZ3JvdW5kOiBAbWFpbi1jb2xvci10aGVtZTsNCi19DQotDQotW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyLA0KLVt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDphZnRlcnsNCi0gIGNvbnRlbnQ6ICfinJQnOw0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgdG9wOiAtNHB4Ow0KLSAgbGVmdDogMTRweDsNCi0gIGZvbnQtc2l6ZTogMTZweDsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gIHRyYW5zaXRpb246IGFsbCAuMnM7DQotfQ0KLVt0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDphZnRlciB7DQotICBvcGFjaXR5OiAwOw0KLSAgdHJhbnNmb3JtOiBzY2FsZSgwKTsNCi19DQotW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmFmdGVyIHsNCi0gIG9wYWNpdHk6IDE7DQotICB0cmFuc2Zvcm06IHNjYWxlKDEpOw0KLX0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qICBFbmQgc3F1YXJlIENoZWNrYm94ICAgICAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qICBCZWdpbiBjbGFzcyBjb250ZW50IG1nbXQgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0NCi0uZmxleC1yb3cgew0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiByb3cgIWltcG9ydGFudDsNCi19DQotLmZsZXgtY29sdW1uIHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KLX0NCi0NCi0uY29sLXdpZHRoLTEgew0KLSAgd2lkdGg6IDEwJTsNCi19DQotLmNvbC13aWR0aC0yIHsNCi0gIHdpZHRoOiAyMCU7DQotfQ0KLS5jb2wtd2lkdGgtMyB7DQotICB3aWR0aDogMzAlOw0KLX0NCi0uY29sLXdpZHRoLTQgew0KLSAgd2lkdGg6IDQwJTsNCi19DQotLmNvbC13aWR0aC01IHsNCi0gIHdpZHRoOiA1MCU7DQotfQ0KLS5jb2wtd2lkdGgtNiB7DQotICB3aWR0aDogNjAlOw0KLX0NCi0uY29sLXdpZHRoLTcgew0KLSAgd2lkdGg6IDcwJTsNCi19DQotLmNvbC13aWR0aC04IHsNCi0gIHdpZHRoOiA4MCU7DQotfQ0KLS5jb2wtd2lkdGgtOSB7DQotICB3aWR0aDogOTAlOw0KLX0NCi0uY29sLXdpZHRoLTEwIHsNCi0gIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi0uYWxpZ24tdi1jZW50ZXIgew0KLSAgZGlzcGxheTpmbGV4Ow0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi19DQotDQotLmFsaWduLWgtY2VudGVyIHsNCi0gIGRpc3BsYXk6ZmxleDsNCi0gIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLX0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLS8qICAgIEVuZCBjbGFzcyBjb250ZW50IG1nbXQgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogIEJlZ2luIGJ0bi1zb3J0ICAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLmJ0bi1zb3J0IHsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIHRvcDogLTZweDsNCi0gIGJvcmRlcjpub25lOw0KLSAgYmFja2dyb3VuZDpub25lOw0KLSAgYm9yZGVyLXJhZGl1czogMDsNCi0gIG1hcmdpbi1sZWZ0OjVweDsNCi19DQotDQotLmJ0bi1zb3J0OmJlZm9yZXsNCi0gIGNvbnRlbnQ6ICcnOw0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgbGVmdDogLTFweDsNCi0gIHdpZHRoOiAwOw0KLSAgaGVpZ2h0OiAwOw0KLSAgYm9yZGVyLXJpZ2h0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLSAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCBAZ3JleWRhcms7DQotICBib3JkZXItbGVmdDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi19DQotDQotLmJ0bi1zb3J0OmFmdGVyew0KLSAgY29udGVudDogJyc7DQotICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICByaWdodDogLTFweDsNCi0gIHdpZHRoOiAwOw0KLSAgaGVpZ2h0OiAwOw0KLSAgYm9yZGVyLXJpZ2h0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLSAgYm9yZGVyLXRvcDogMTBweCBzb2xpZCBAZ3JleWRhcms7DQotICBib3JkZXItbGVmdDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi0gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEzNDlweCkgew0KLSAgICByaWdodDogLTVweDsNCi0gIH0NCi19DQotDQotLmJ0bi1zb3J0LmJ0bi1zb3J0LWFzYzpiZWZvcmV7DQotICBib3JkZXItYm90dG9tOiAxMHB4IHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOw0KLX0NCi0NCi0uYnRuLXNvcnQuYnRuLXNvcnQtZGVzYzphZnRlcnsNCi0gIGJvcmRlci10b3A6IDEwcHggc29saWQgQG1haW4tY29sb3ItdGhlbWU7DQotfQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgRW5kIGJ0bi1zb3J0ICAgICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogIEJlZ2luIGRlZmF1dCBjb2xvdXIgY2xhc3MgICAgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0uZGFyay1jb2xvciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrICFpbXBvcnRhbnQ7DQotfQ0KLS5tYWluLWNvbG9yIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW4gIWltcG9ydGFudDsNCi19DQotLm1lZGl1bS1jb2xvciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWVkaXVtLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1lZGl1bSAhaW1wb3J0YW50Ow0KLX0NCi0ubGlnaHQtY29sb3Igew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWxpZ2h0ICFpbXBvcnRhbnQ7DQotfQ0KLS5saWdodDItY29sb3Igew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0Mi1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1saWdodCAhaW1wb3J0YW50Ow0KLX0NCi0NCi0uZ3JleS1jb2xvciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleSAhaW1wb3J0YW50Ow0KLX0NCi0uZGFya2dyZXktY29sb3Igew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXlkYXJrICFpbXBvcnRhbnQ7DQotfQ0KLQ0KLS8qIGJlZ2luIGxvb2t1cCB3aWRnZXQgKi8NCi0udWktZGlhbG9nIHsNCi0gIG9wYWNpdHk6IDE7DQotICB6LWluZGV4OiA1MDsNCi19DQotDQotLnVpLWRpYWxvZy10aXRsZWJhci51aS13aWRnZXQtaGVhZGVyLnVpLWNvcm5lci1hbGwudWktaGVscGVyLWNsZWFyZml4IHsNCi0gIGJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICBidXR0b24gew0KLSAgICBiYWNrZ3JvdW5kOiBub25lOw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQtY29sb3ItdGhlbWU7DQotICB9DQotfQ0KLS8qIGVuZCBsb29rdXAgd2lkZ2V0ICovDQotDQotLm1haW4tYmFyLWxhYmVsIHsNCi0gIGNvbG9yOiBAbGlnaHQtY29sb3ItdGhlbWU7DQotICBwYWRkaW5nLWxlZnQ6IDNweDsNCi0gIHBhZGRpbmctcmlnaHQ6IDZweDsNCi0gIGZvbnQtc2l6ZTogMTVweDsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLX0NCi0NCi0jY29tcGFueS1sb2dvIHsNCi0gIHJpZ2h0OiAxMHB4Ow0KLSAgdG9wOiAycHg7DQotICBiYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9vZmJpei1zaW1wbGUtd2hpdGUuc3ZnIikgbm8tcmVwZWF0IGxlZnQgdG9wIC8gY292ZXI7DQotICBtaW4taGVpZ2h0OiA1MHB4Ow0KLSAgbWluLXdpZHRoOiA1MHB4Ow0KLSAgbWFyZ2luLXJpZ2h0OiAxNXB4Ow0KLSAgYWxpZ24tc2VsZjogY2VudGVyOw0KLSAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aCA6IDEyMzJweCkgew0KLSAgICBtaW4taGVpZ2h0OiA1MHB4Ow0KLSAgICBtaW4td2lkdGg6IDEyOXB4Ow0KLSAgICBiYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9vZmJpei13aGl0ZS5zdmciKSBuby1yZXBlYXQgbGVmdCB0b3AgLyBjb3ZlcjsNCi0gIH0NCi19DQotDQotLm1vZGFsLXNjcmVlbiB7DQotICB2aXNpYmlsaXR5OiBoaWRkZW47DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBncmV5Ow0KLSAgb3BhY2l0eTogLjkzOw0KLSAgcG9zaXRpb246IGZpeGVkOw0KLSAgdG9wOiAwOw0KLSAgbGVmdDogMDsNCi0gIGhlaWdodDogMTAwJTsNCi0gIHdpZHRoOiAxMDAlOw0KLSAgei1pbmRleDogOTk5OTsNCi19DQotDQotLm1vZGFsLWJveHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gIG9wYWNpdHk6IDE7DQotICBtYXJnaW46IDEwJTsNCi0gIGJvcmRlci1yYWRpdXM6IDEwcHg7DQotICBib3JkZXI6IHNvbGlkIDJweCBAbWFpbi1jb2xvci10aGVtZTsNCi0gIHBhZGRpbmcgOiAxMHB4IDQwcHggMTBweCA0MHB4Ow0KLSAgLm1vZGFsLWhlYWRlciB7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gICAgaDIgew0KLSAgICAgIGZvbnQtc2l6ZTogMjVweDsNCi0gICAgICBmb250LXdlaWdodDogbm9ybWFsOw0KLSAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgfQ0KLSAgICAuYnRuLWNsb3NlLW5yZCB7DQotICAgICAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgICAgIHJpZ2h0OiAwOw0KLSAgICAgIGRpc3BsYXk6IGZsZXg7DQotICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICAgICAgYm9yZGVyOiBzb2xpZCAxcHggQG1haW4tY29sb3ItdGhlbWU7DQotICAgICAgYm9yZGVyLXJhZGl1czogNXB4Ow0KLSAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgICBmb250LXNpemU6IDI1cHg7DQotICAgICAgaGVpZ2h0OiAzMHB4Ow0KLSAgICAgIHdpZHRoOiAzMHB4Ow0KLSAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50Ow0KLSAgICB9DQotICB9DQotICAubW9kYWwtYm9keSB7DQotICAgIHAgew0KLSAgICAgIGZvbnQtc2l6ZTogMjBweDsNCi0gICAgfQ0KLSAgfQ0KLSAgLm1vZGFsLWZvb3RlciB7DQotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gICAgaGVpZ2h0OiAzNXB4Ow0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOw0KLSAgICAuYnRuLW5yZCB7DQotICAgICAgYmFja2dyb3VuZDogbm9uZTsNCi0gICAgICBib3JkZXI6IG5vbmU7DQotICAgICAgdGV4dC1zaGFkb3c6IG5vbmU7DQotICAgICAgb3BhY2l0eTogMTsNCi0gICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7DQotICAgICAgZm9udC1zaXplOiAyMHB4Ow0KLSAgICAgIHBhZGRpbmc6IDVweDsNCi0gICAgICBib3JkZXItcmFkaXVzOiA4cHg7DQotICAgIH0NCi0gICAgLmJ0bi1ucmQtbWFpbiB7DQotICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgICAgY29sb3I6IEB3aGl0ZTsNCi0gICAgfQ0KLSAgICAuYnRuLW5yZC1zdGQgew0KLSAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgICAgYm9yZGVyOiBzb2xpZCAxcHggQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0uYnRuLW5yZDpob3ZlciB7DQotICBib3gtc2hhZG93OiA1cHggNXB4IDNweCAwIEBibGFjazsNCi19DQotDQotLmJ0bi1ucmQtc3RkOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICBjb2xvcjogQHdoaXRlICFpbXBvcnRhbnQ7DQotICBib3JkZXI6IHNvbGlkIDFweCBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLX0NCi0NCi0uYnRuLWNsb3NlLW5yZDpob3ZlciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgY29sb3I6IEB3aGl0ZSAhaW1wb3J0YW50Ow0KLX0NCi0NCi0ubGlzdC1ucmQgew0KLSAgYm9yZGVyOiBzb2xpZCAycHggQG1haW4tY29sb3ItdGhlbWU7DQotICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxMHB4Ow0KLSAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDEwcHg7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCi0gIG1hcmdpbi10b3A6IDE1cHg7DQotICBtYXJnaW4tYm90dG9tOiAxNXB4Ow0KLSAgLnRpdGxlLWxpc3QtbnJkIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIGNvbG9yIDogQHdoaXRlOw0KLSAgICBmb250LXNpemU6IDIwcHg7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICBwYWRkaW5nLWxlZnQ6IDVweDsNCi0gIH0NCi0NCi0gIGxpIHsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICBkaXNwbGF5OiBmbGV4Ow0KLSAgICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgICBmb250LXNpemU6IDIwcHg7DQotICAgIHBhZGRpbmctbGVmdDogNXB4Ow0KLSAgICBwYWRkaW5nLXRvcDogMnB4Ow0KLSAgICBwYWRkaW5nLWJvdHRvbTogMnB4Ow0KLSAgICBtYXJnaW4tYm90dG9tOiAzcHg7DQotICAgIGEgew0KLSAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgfQ0KLSAgICBzcGFuIHsNCi0gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgICAgcmlnaHQ6IDA7DQotICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICAgIGZvbnQtc2l6ZTogMzBweDsNCi0gICAgfQ0KLSAgfQ0KLX0NCi1saS5saW5lLW9kZCB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQtY29sb3ItdGhlbWU7DQotfQ0KLQ0KLSN1c2VyLWF2YXRhciB7DQotICBoZWlnaHQ6IDQwcHg7DQotICB3aWR0aDogNDBweDsNCi0gIHBhZGRpbmc6IDJweDsNCi0gIGFsaWduLXNlbGY6IGNlbnRlcjsNCi0NCi0gIDpob3ZlciB7DQotICAgIGN1cnNvcjogcG9pbnRlcjsNCi0gIH0NCi0gIGltZyB7DQotICAgIG1heC1oZWlnaHQ6IDQwcHg7DQotICAgIG1heC13aWR0aDogNDBweDsNCi0gICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICB0b3A6IC0ycHg7DQotICAgIHBhZGRpbmc6IDJweDsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgICBib3JkZXItcmFkaXVzOiAycHg7DQotICB9DQotfQ0KLQ0KLSNtYWluLW5hdmlnYXRpb24tYmFyIHsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIHdpZHRoOiAxMDAlOw0KLSAgbWluLXdpZHRoOiBAbWluLWNvbnRhaW5lci13aWR0aDsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsNCi0gIGZvbnQtZmFtaWx5OiBRdWlja3NhbmQsc2Fucy1zZXJpZjsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgei1pbmRleDogNTsNCi0gIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0Ow0KLX0NCi0jbWFpbi1uYXYtYmFyLWxlZnQgew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgZGlzcGxheTogZmxleDsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotfQ0KLSNtYWluLW5hdi1iYXItcmlnaHQgew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgZGlzcGxheTogZmxleDsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBwYWRkaW5nLXJpZ2h0OiAxNXB4Ow0KLX0NCi0NCi0uYXBwLWJ0bnsNCi0gIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gIGZsZXgtZGlyZWN0aW9uOiByb3c7DQotICBtYXJnaW4tcmlnaHQ6IDJweDsNCi0gIG1hcmdpbi1sZWZ0OiAycHg7DQotICBhIHsNCi0gICAgcGFkZGluZzoxMHB4Ow0KLSAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgIGZvbnQtc2l6ZTogMS40ZW0gIWltcG9ydGFudDsNCi0gIH0NCi19DQotDQotLmFwcC1idG4gYTp2aXNpdGVkIHsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi19DQotDQotLmFwcC1idG46aG92ZXJ7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICB0b3A6IC02cHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDVweDsNCi0gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA1cHg7DQotICBib3gtc2hhZG93OiAxcHggMXB4IDEycHggQHNoYWRvdy1jb2xvcjsNCi0gIGEgew0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIHRvcDogNnB4Ow0KLSAgICBjb2xvciA6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgfQ0KLX0NCi0uYXBwLWJ0bi5zZWxlY3RlZDpob3ZlciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIGJveC1zaGFkb3c6IG5vbmU7DQotICB0b3A6MDsNCi19DQotDQotLmFwcC1idG4gYTpob3ZlciB7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLSNhcHAtc2VsZWN0ZWQgew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGJveC1zaGFkb3c6IDFweCAtMnB4IDEycHggQHNoYWRvdy1jb2xvcjsNCi0gIHotaW5kZXg6IDA7DQotICBvcGFjaXR5OiAuOTk7DQotICBib3JkZXItdG9wLWxlZnQtcmFkaXVzIDogOHB4IDsNCi0gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzIDogOHB4IDsNCi0gIGEgew0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIHRvcDogM3B4Ow0KLSAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICB9DQotfQ0KLS5hcHAtYnRuLnNlbGVjdGVkIGE6aG92ZXIgew0KLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0NCi0jYXBwLWJhci1saW5lIHsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIHdpZHRoOiAxMDAlOw0KLSAgbWluLXdpZHRoOiBAbWluLWNvbnRhaW5lci13aWR0aDsNCi0gIGhlaWdodDogQGNvbG9yLWxpbmUtaGVpZ2h0Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBib3gtc2hhZG93OiAycHggMnB4IDVweCBAc2hhZG93LWNvbG9yOw0KLX0NCi0jY29sb3ItYWRkIHsNCi0gIHdpZHRoOiAxNTBweDsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgaGVpZ2h0OiBAY29sb3ItbGluZS1oZWlnaHQ7DQotICB6LWluZGV4OiAyMDsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIHRvcDogQGNvbG9yLWxpbmUtaGVpZ2h0Ow0KLX0NCi0NCi0jbW9yZS1hcHAgew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgZGlzcGxheTogZmxleDsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgZm9udC1zaXplOiAxLjRlbSAhaW1wb3J0YW50Ow0KLSAgd2lkdGg6IDQwcHg7DQotICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodDsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi19DQotI21vcmUtYXBwOmhvdmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0jbW9yZS1hcHA6aG92ZXIgI21vcmUtYXBwLWxpc3Qgew0KLSAgZGlzcGxheTogYmxvY2s7DQotfQ0KLSNtb3JlLWFwcC5zZWxlY3RlZCB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi19DQotDQotI21vcmUtYXBwLWxpc3Qgew0KLSAgZGlzcGxheTogbm9uZTsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHRvcDogQGFwcC1iYXItaGVpZ2h0Ow0KLSAgbGVmdDogLTIwcHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIHotaW5kZXg6IDEwOw0KLSAgYm9yZGVyOiBzb2xpZCA0cHggQG1haW4tY29sb3ItdGhlbWU7DQotICBib3JkZXItdG9wLXdpZHRoOiBAY29sb3ItbGluZS1oZWlnaHQ7DQotICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7DQotICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNHB4Ow0KLSAgbGkgew0KLSAgICBwYWRkaW5nLWxlZnQgOiA0cHg7DQotICAgIHBhZGRpbmctcmlnaHQ6IDRweDsNCi0gIH0NCi0NCi0gIGEgew0KLSAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgIGZvbnQtc2l6ZTogMTVweDsNCi0gIH0NCi0NCi0gIDpob3ZlciB7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBtZWRpdW0tY29sb3ItdGhlbWU7DQotICAgIGEgew0KLSAgICAgIGJveC1zaGFkb3c6IG5vbmU7DQotICAgICAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgICB9DQotICAgIGE6aG92ZXJ7DQotICAgICAgYm94LXNoYWRvdzogbm9uZTsNCi0gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICAgICAgYm9yZGVyLXJhZGl1czogMDsNCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgbGkuc2VsZWN0ZWQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgYSB7DQotICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgICB9DQotICAgIGE6aG92ZXIgew0KLSAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0jaG9tZUJ1dHRvbiB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgLy92aXNpYmlsaXR5OiBoaWRkZW47DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICBiYWNrZ3JvdW5kLWNvbG9yOkBncmV5Ow0KLSAgYm9yZGVyOiBub25lOw0KLSAgYm9yZGVyLXJhZGl1cyA6IDA7DQotDQotICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodDsNCi0gIHdpZHRoIDogQGhvbWUtYnRuLXdpZHRoOw0KLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLSAgaW1nIHsNCi0gICAgaGVpZ2h0OiAyNXB4Ow0KLSAgICB0cmFuc2l0aW9uOiBhbGwgLjJzIGVhc2UtaW4tb3V0Ow0KLSAgfQ0KLX0NCi0NCi0jaG9tZUJ1dHRvbjpob3ZlciBpbWcgew0KLSAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpOw0KLX0NCi0NCi0jYXBwLWJhci1saXN0IHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotfQ0KLQ0KLSN1c2VyLWRldGFpbHMgew0KLSAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgcmlnaHQ6IDIwcHg7DQotICB0b3AgOiA2MnB4Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICBjb2xvciA6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLSAgZm9udC1zaXplOiAxNXB4Ow0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBwYWRkaW5nLXRvcDogNXB4Ow0KLSAgcGFkZGluZy1ib3R0b206IDEwcHg7DQotICB6LWluZGV4OiAxNTsNCi0gIGJveC1zaGFkb3c6IDNweCAzcHggMTJweCBAc2hhZG93LWNvbG9yOw0KLSAgYm9yZGVyLXJhZGl1czogM3B4Ow0KLSAgdHJhbnNpdGlvbjogYWxsIC4xcyBlYXNlLWluLW91dDsNCi0NCi0gIGltZyB7DQotICAgIGhlaWdodDogNTBweDsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgICBwYWRkaW5nOiA0cHg7DQotICAgIGJvcmRlci1yYWRpdXMgOiAzcHg7DQotICAgIG1hcmdpbi1sZWZ0OiAxMHB4Ow0KLSAgICBtYXJnaW4tcmlnaHQ6IDVweDsNCi0gIH0NCi0gICNsb2dvdXQgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICAgIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgICBib3JkZXItcmFkaXVzOiAycHg7DQotICAgIDpob3ZlciB7DQotICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLSN1c2VyLWRldGFpbHM6YWZ0ZXJ7DQotICBjb250ZW50OiAnJzsNCi0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gIHRvcDogLTEwcHg7DQotICByaWdodDogNXB4Ow0KLSAgd2lkdGg6IDA7DQotICBoZWlnaHQ6IDA7DQotICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotICBib3JkZXItYm90dG9tOiAxMHB4IHNvbGlkIEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotfQ0KLQ0KLWEudXNlci1wcmVmLWJ0biB7DQotICBtYXJnaW4tdG9wOiAxNXB4Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICBtYXJnaW4tbGVmdDogMTBweDsNCi0gIG1hcmdpbi1yaWdodDogMTBweDsNCi0gIHBhZGRpbmctdG9wOiAycHg7DQotICBwYWRkaW5nLWJvdHRvbTogMnB4Ow0KLSAgZGlzcGxheTogZmxleDsNCi0gIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrICFpbXBvcnRhbnQ7DQotICA6aG92ZXIgew0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICB9DQotfQ0KLQ0KLSN1c2VyLW5hbWUgew0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47DQotICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsNCi0gIHBhZGRpbmctbGVmdCA6IDVweDsNCi0gIHBhZGRpbmctcmlnaHQgOiA1cHg7DQotICBzcGFuIHsNCi0gICAgbWluLXdpZHRoOiAxMDBweDsNCi0gICAgcGFkZGluZy1ib3R0b20gOiA1cHg7DQotICAgIHBhZGRpbmctdG9wIDogNXB4Ow0KLSAgfQ0KLX0NCi0NCi0jdXNlci1yb3cxIHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICAjdXNlci1sYW5nIHsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KLSAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4Ow0KLSAgICBzcGFuIHsNCi0gICAgICBtaW4td2lkdGg6IDMwcHg7DQotICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLSAgICB9DQotICB9DQotfQ0KLQ0KLS5hcHBiYXItYnRuLWltZyB7DQotICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodCAtIDQwcHg7DQotfQ0KLQ0KLSNoZWxwLWJ0biB7DQotICBmb250LXNpemU6IDEwcHg7DQotICBtaW4td2lkdGg6IDIwcHg7DQotICBtYXJnaW4tcmlnaHQ6IDE1cHg7DQotfQ0KLS8qIEJlZ2luIHN1YiBNZW51IHNlY3Rpb24gKi8NCi0NCi0jYXBwLW5hdmlnYXRpb24gew0KLSAgaGVpZ2h0OiBAc3ViLWFwcC1iYXItaGVpZ2h0Ow0KLSAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggQGJsYWNrOw0KLSAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBibGFjazsNCi0gIHdpZHRoOiAxMDAlOw0KLSAgbWluLXdpZHRoOiBAbWluLWNvbnRhaW5lci13aWR0aDsNCi0gIGgyIHsNCi0gICAgZGlzcGxheTogbm9uZTsNCi0gIH0NCi0gIHVsIHsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7DQotICAgIGZsZXgtZ3JvdzogMTsNCi0gIH0NCi0gIHVsIGxpIHVsIGxpIHsNCi0gICAgYm9yZGVyLWxlZnQ6IHNvbGlkIDFweCBAYmxhY2s7DQotICAgIGhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodDsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gICAganVzdGlmeS1pdGVtczogY2VudGVyOw0KLSAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgbWluLXdpZHRoOiA3NXB4Ow0KLSAgICBwYWRkaW5nLWxlZnQ6IDZweDsNCi0gICAgcGFkZGluZy1yaWdodDogNnB4Ow0KLSAgICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7DQotICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCBAYmxhY2s7DQotICAgIGZvbnQtc2l6ZTogMTJweDsNCi0gICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTUwMHB4KSB7DQotICAgICAgZm9udC1zaXplOiAxMHB4Ow0KLSAgICAgIG1pbi13aWR0aDogNjVweDsNCi0gICAgfQ0KLSAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMzAwcHgpIHsNCi0gICAgICBmb250LXNpemU6IDEwcHg7DQotICAgICAgbWluLXdpZHRoOiA1MHB4Ow0KLSAgICB9DQotICAgIGEgew0KLSAgICAgIGRpc3BsYXk6IGZsZXg7DQotICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQotICAgICAgaGVpZ2h0OiAxMDAlOw0KLSAgICAgIHdpZHRoOiAxMDAlOw0KLSAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0jYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGk6bGFzdC1jaGlsZCB7DQotICBib3JkZXItcmlnaHQ6IHNvbGlkIDFweCBAYmxhY2s7DQotfQ0KLQ0KLSNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaTpob3ZlciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIG1pbi1oZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQ7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAvL3RvcDogLTFweDsNCi0gIGEgew0KLSAgICBjb2xvcjogQHdoaXRlOw0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICB9DQotfQ0KLSNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaS5zZWxlY3RlZDpob3ZlciB7DQotICBhIHsNCi0gICAgY29sb3I6IEBibGFjayAhaW1wb3J0YW50Ow0KLSAgfQ0KLX0NCi0NCi0jYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGkuc2VsZWN0ZWQgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgdG9wOiAxcHg7DQotICBoZWlnaHQ6IEBzdWItYXBwLWJhci1oZWlnaHQgKyAxcHg7DQotICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMnB4Ow0KLSAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMnB4Ow0KLSAgYm9yZGVyLWJvdHRvbTogbm9uZTsNCi0NCi0gIDphZnRlciB7DQotICAgIGNvbnRlbnQ6ICcnOw0KLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQotICAgIHRvcDogLTJweDsNCi0gICAgbGVmdDogNXB4Ow0KLSAgICB3aWR0aDogMDsNCi0gICAgaGVpZ2h0OiAwOw0KLSAgICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotICAgIGJvcmRlci10b3A6IDEwcHggc29saWQgQG1haW4tY29sb3ItdGhlbWU7DQotICAgIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50Ow0KLSAgfQ0KLQ0KLX0NCi0NCi0NCi0vKiBFbmQgc3ViIE1lbnUgc2VjdGlvbiAqLw0KLQ0KLS8qIGJlZ2luIHN1YiBNZW51IHNlY3Rpb24gM3JkIGxldmVsICovDQotDQotLmJ1dHRvbi1iYXIudGFiLWJhciB7DQotICB1bCBsaSB1bCBsaSB7DQotICAgIGJvcmRlcjogc29saWQgMXB4IEBncmV5Ow0KLSAgICBib3JkZXItcmFkaXVzOiA0cHg7DQotICAgIGEgew0KLSAgICAgIHdpZHRoOiAxMDAlOw0KLSAgICAgIGhlaWdodDogMTAwJTsNCi0gICAgfQ0KLSAgfQ0KLSAgbGkuc2VsZWN0ZWR7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgICBhew0KLSAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gICAgfQ0KLSAgfQ0KLSAgdWwgbGkgdWwgbGk6aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgYSB7DQotICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluIDsNCi0gICAgfQ0KLSAgfQ0KLX0NCi0NCi0jdGhpcmQtbGV2ZWwtbWVudS1jb250YWluZXIgew0KLSAgZGlzcGxheTogZmxleDsNCi0gIGZsZXgtZGlyZWN0aW9uOiByb3c7DQotfQ0KLSN3b3JraW5nLWFyZWEgew0KLSAgd2lkdGg6IDEwMCU7DQotfQ0KLQ0KLSNsZWZ0LWNvbHVtbi1tZW51IHsNCi0gIHdpZHRoOiAxMDBweDsNCi19DQotDQotLnRoaXJkLWx2bC1tZW51IHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgbGVmdDogLTEwcHg7DQotICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4Ow0KLSAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDRweDsNCi0gIHBhZGRpbmctdG9wOiA0cHg7DQotICBwYWRkaW5nLWJvdHRvbTogNHB4Ow0KLSAgdWwgew0KLSAgICBsaSB7DQotICAgICAgdWwgew0KLSAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgICAgICAgdG9wOiA1cHg7DQotICAgICAgICB3aWR0aDogQHRoaXJkLWx2bC13aWR0aDsNCi0gICAgICB9DQotICAgIH0NCi0gIH0NCi0gIGgyIHsNCi0gICAgdmlzaWJpbGl0eTogaGlkZGVuOw0KLSAgfQ0KLX0NCi0udGhpcmQtbGV2ZWwtaXRlbTpsYXN0LWNoaWxkIHsNCi0gIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCBAbWFpbi1jb2xvci10aGVtZTsNCi19DQotDQotLnRoaXJkLWxldmVsLWl0ZW0gew0KLSAgbWluLWhlaWdodDogQHRoaXJkLWx2bC1oZWlnaHQ7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gIHBhZGRpbmctcmlnaHQ6IDNweDsNCi0gIGJvcmRlci10b3A6IHNvbGlkIDFweCBAbWFpbi1jb2xvci10aGVtZTsNCi0NCi0gIGEsIGE6dmlzaXRlZCB7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgICB3aWR0aDogMTAwJTsNCi0gICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrICFpbXBvcnRhbnQ7DQotICAgIG1pbi1oZWlnaHQ6IEB0aGlyZC1sdmwtaGVpZ2h0Ow0KLSAgICBtYXgtd2lkdGg6IEB0aGlyZC1sdmwtd2lkdGg7DQotICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCi0gIH0NCi19DQotLnRoaXJkLWxldmVsLWl0ZW0uc2VsZWN0ZWQgew0KLSAgcG9zaXRpb246IHJlbGF0aXZlOw0KLSAgYm9yZGVyLWxlZnQ6IHNvbGlkIDlweCBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGEsIGE6dmlzaXRlZCB7DQotICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gICAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7DQotICB9DQotICA6YWZ0ZXIgew0KLSAgICBjb250ZW50OiAnJzsNCi0gICAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgICB0b3A6IDVweDsNCi0gICAgbGVmdDogMDsNCi0gICAgd2lkdGg6IDA7DQotICAgIGhlaWdodDogMDsNCi0gICAgYm9yZGVyLXRvcDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsNCi0gICAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgQG1haW4tY29sb3ItdGhlbWU7DQotICAgIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7DQotICB9DQotfQ0KLQ0KLS50aGlyZC1sZXZlbC1pdGVtIGE6aG92ZXIgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW4gOw0KLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLX0NCi0vKiBFbmQgM3JkIGxldmVsIG1lbnUgKi8NCi0NCi0vKiA9PT09PSBTeXN0ZW0gbWVzc2FnZXMgcmVuZGVyaW5nID09PT09ICovDQotLmV2ZW50TWVzc2FnZSwNCi0uZXJyb3JNZXNzYWdlIHsNCi0gIGZvbnQtc2l6ZTogMS4zZW07DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIF9tYXJnaW46IDVweCA3cHggMCA3cHg7DQotICBwYWRkaW5nOiAwIDFlbSAwIDUwcHg7DQotfQ0KLS5ldmVudE1lc3NhZ2Ugew0KLSAgYmFja2dyb3VuZDogIzEwNWZhOCB1cmwoLi4vaW1hZ2VzL2luZm9ybWF0aW9uLnBuZykgbm8tcmVwZWF0IDVweCA1MCU7DQotICBjb2xvcjogI0ZGRkZGRjsNCi0gIGJvcmRlcjogc29saWQgM3B4ICNmMGYwZjA7DQotfQ0KLS5lcnJvck1lc3NhZ2Ugew0KLSAgYmFja2dyb3VuZDogIzgyMGYwNSB1cmwoLi4vaW1hZ2VzL2V4Y2xhbWF0aW9uLnBuZykgbm8tcmVwZWF0IDVweCA1MCU7DQotICBjb2xvcjogI2ZmZmZmZjsNCi0gIGJvcmRlcjogc29saWQgM3B4ICNmMGYwZjA7DQotfQ0KLQ0KLS5jb250ZW50LW1lc3NhZ2VzIHAgew0KLSAgbWFyZ2luOiAwLjVlbSAwIDAuNWVtIDA7DQotfQ0KLQ0KLQ0KLQ0KLS8qIEJlZ2luIEhvbWUgTWVudSovDQotLmZpeGVkLW5hdi1iYXIgew0KLSAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7DQotICB3aWR0aDogMTAwJTsNCi19DQotI25hdi1iYXItb2Zmc2V0IHsNCi0gIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0IDsNCi19DQotDQotI2hvbWVHbHlwaCB7DQotICBtYXJnaW4tbGVmdDogMjBweDsNCi0gIGhlaWdodDogMjBweDsNCi19DQotDQotI2hvbWVQYWdlVGl0bGUgew0KLSAgY29sb3I6IEB3aGl0ZTsNCi0gIGZvbnQtc2l6ZTogMjBweDsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgbWFyZ2luLXJpZ2h0OiAyMHB4Ow0KLSAgbWFyZ2luLWxlZnQ6IDIwcHg7DQotfQ0KLS5ob21lLW1lbnUtbGlzdCB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotfQ0KLS5ocC1hcHBsaXN0IHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogcm93Ow0KLSAgY29sb3IgOiBAd2hpdGU7DQotICBhbGlnbi1pdGVtczogY2VudGVyOw0KLSAgLmFwcC10aXRsZSB7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gICAgaGVpZ2h0OiBAaG9tZS1tZW51LXRpbGUtaGVpZ2h0Ow0KLSAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTBweDsNCi0gICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBibGFjazsNCi0gICAgc3BhbiB7DQotICAgICAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7DQotICAgICAgZm9udC1zaXplOiAxNXB4Ow0KLSAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICAgIHdpZHRoOiAxMTBweDsNCi0gICAgICBhIHsNCi0gICAgICAgIGRpc3BsYXk6IGZsZXg7DQotICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgICAgIGNvbG9yIDogQHdoaXRlOw0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfQ0KLQ0KLSAgLmhwLW1lbnUtaXRlbSB7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIG1hcmdpbi1sZWZ0OiA1cHg7DQotICAgIG1hcmdpbi1yaWdodDogNXB4Ow0KLSAgICBib3JkZXI6IHNvbGlkIDJweCBAZ3JleTsNCi0gICAgYm9yZGVyLXJhZGl1czogOHB4Ow0KLSAgICBoZWlnaHQ6IEBob21lLW1lbnUtdGlsZS1oZWlnaHQgLSA0cHg7DQotICAgIG1pbi13aWR0aDogQGhvbWUtbWVudS10aWxlLW1pbi13aWR0aDsNCi0gICAgbWF4LXdpZHRoOiBAaG9tZS1tZW51LXRpbGUtbWF4LXdpZHRoOw0KLSAgICAubWVudS1saW5rIHsNCi0gICAgICBmb250LXNpemU6IDEwcHg7DQotICAgICAgY29sb3I6IEBibGFjazsNCi0gICAgICBwYWRkaW5nOiAxMHB4Ow0KLSAgICB9DQotICAgIC5zdGFyLWxpbmsgew0KLSAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCi0gICAgICBoZWlnaHQ6IDI1cHg7DQotICAgICAgdG9wOiA1cHg7DQotICAgICAgcmlnaHQ6IDVweDsNCi0gICAgfQ0KLSAgfQ0KLQ0KLX0NCi0uaHAtYXBwbGlzdCAuYXBwLXRpdGxlIHNwYW4gYTpob3ZlciB7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLS5ocC1tZW51LWl0ZW0uZmF2b3JpdGVJdGVtIHsNCi0gIGJvcmRlcjogc29saWQgMnB4IEBkYXJrLWNvbG9yLXRoZW1lOw0KLX0NCi0NCi0uaHAtbWVudS1pdGVtOmhvdmVyIHsNCi0gIGJveC1zaGFkb3c6IDNweCAzcHggMTJweCBAc2hhZG93LWNvbG9yOw0KLSAgYSB7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gIH0NCi19DQotDQotLyogRW5kIEhvbWUgTWVudSAqLw0KLQ0KLS8qIEJlZ2luIExvZ2luIHNjcmVlbmxldCAqLw0KLSNsb2dpbkJhciB7DQotICBwb3NpdGlvbjogZml4ZWQ7DQotICB0b3A6MDsNCi0gIGxlZnQ6IDA7DQotICB3aWR0aDogMTAwJTsNCi0gIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0Ow0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICBzcGFuIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA1cHg7DQotICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDVweDsNCi0gICAgZm9udC1zaXplOiAyNXB4Ow0KLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICAgIHRvcDogQGFwcC1iYXItaGVpZ2h0IC0gMzJweDsNCi0gICAgbGVmdDogMTVweDsNCi0gICAgcGFkZGluZzogNXB4IDEwcHggNXB4IDEwcHg7DQotICB9DQotICAjY29tcGFueS1sb2dvIHsNCi0gICAgcG9zaXRpb246IGFic29sdXRlOw0KLSAgfQ0KLX0NCi0NCi0ubG9naW4tc2NyZWVubGV0IHsNCi0gIGRpc3BsYXk6IGZsZXg7DQotICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KLSAgbWluLXdpZHRoOiAzMDBweDsNCi0gIG1heC13aWR0aDogNTBlbTsNCi0gIGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50Ow0KLSAgbWFyZ2luLXRvcDogMTUlOw0KLSAgYm94LXNoYWRvdzogM3B4IDNweCAxMnB4IEBzaGFkb3ctY29sb3I7DQotICAuc2NyZWVubGV0LXRpdGxlLWJhciB7DQotICAgIGRpc3BsYXk6IGZsZXg7DQotICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQotICAgIG1hcmdpbjowOw0KLSAgICBwYWRkaW5nOjA7DQotICAgIGgzew0KLSAgICAgIHBhZGRpbmctdG9wOjJweDsNCi0gICAgICBwYWRkaW5nLWJvdHRvbToycHg7DQotICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgICAgaGVpZ2h0OiAxMDAlOw0KLSAgICAgIHdpZHRoOjEwMCU7DQotICAgICAgdGV4dC1zaGFkb3c6IG5vbmU7DQotICAgICAgZm9udC1zaXplOiAyNXB4Ow0KLSAgICB9DQotICB9DQotICAuc2NyZWVubGV0LWJvZHkgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50Ow0KLSAgICBmb3JtIHsNCi0gICAgICAuYnV0dG9uIHsNCi0gICAgICAgIHdpZHRoOiAxNTBweDsNCi0gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCi0gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7DQotICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgICAgIHRleHQtc2hhZG93OiBub25lOw0KLSAgICAgICAgbWFyZ2luLXRvcDogMjBweDsNCi0gICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7DQotICAgICAgfQ0KLQ0KLSAgICAgIHRhYmxlIHsNCi0gICAgICAgIHRyIHsNCi0gICAgICAgICAgd2lkdGg6IDEwMCU7DQotICAgICAgICAgIC5sYWJlbCB7DQotICAgICAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgICAgICAgICAgIHdpZHRoOiAyNSU7DQotICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4Ow0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlucHV0IHsNCi0gICAgICAgICAgICB3aWR0aDogMTAwJTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICAuYnV0dG9udGV4dCwNCi0gICAgICAgICAgW3R5cGU9InN1Ym1pdCJdIHsNCi0gICAgICAgICAgICB3aWR0aDogMTUwcHg7DQotICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4Ow0KLSAgICAgICAgICAgIGJhY2tncm91bmQ6IG5vbmU7DQotICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7DQotICAgICAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOw0KLSAgICAgICAgICAgIHRleHQtc2hhZG93OiBub25lOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIFtuYW1lPSJHRVRfUEFTU1dPUkRfSElOVCJdIHsNCi0gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgICAgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgICAgICAgICAgYm9yZGVyOiBub25lOw0KLSAgICAgICAgICAgIHdpZHRoOiAxMDAlOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIFtuYW1lPSJFTUFJTF9QQVNTV09SRCJdIHsNCi0gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgICAgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgICAgICAgICAgYm9yZGVyOiBub25lOw0KLSAgICAgICAgICAgIHdpZHRoOiAxMDAlOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRkIHsNCi0gICAgICAgICAgICBwYWRkaW5nOiA1cHg7DQotICAgICAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDsNCi0gICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgICBhIHsNCi0gICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICAgIH0NCi0gIH0NCi19DQotDQotLmxvZ2luLXNjcmVlbmxldCAuc2NyZWVubGV0LXRpdGxlLWJhciB7DQotICB0ZXh0LWFsaWduOiBjZW50ZXI7DQotfQ0KLQ0KLS8qIEVuZCBMb2dpbiBzY3JlZW5sZXQgKi8NCi0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgIEJlZ2luIFNjcmVlbmxldCBzdHlsZSAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0uc2NyZWVubGV0LXRpdGxlLWJhciB7DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmUgOw0KLSAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7DQotICBoZWlnaHQ6IDElOyAvKiBJRSBmaXggKi8NCi0gIG1pbi1oZWlnaHQ6IDEuNWVtOw0KLSAgcGFkZGluZzowLjhlbSAwLjJlbTsNCi19DQotDQotLnNjcmVlbmxldCB7DQotICBib3JkZXItcmFkaXVzOiA1cHg7DQotICBib3JkZXI6IHNvbGlkIDFweCBAZ3JleTsNCi0gIGhlaWdodDogYXV0byAhaW1wb3J0YW50Ow0KLSAgbWFyZ2luLWJvdHRvbTogMWVtOw0KLSAgb3ZlcmZsb3c6IGF1dG87DQotfQ0KLQ0KLS5zY3JlZW5sZXQtYm9keSB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOw0KLSAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7DQotICBoZWlnaHQ6IDElOw0KLSAgcGFkZGluZzogMC40ZW07DQotfQ0KLQ0KLS5zY3JlZW5sZXQtYm9keSBkaXYgew0KLSAgbWFyZ2luOiAwLjhlbSAwLjFlbQ0KLX0NCi0NCi0vKiBTcGVjaWFsIFNjcmVlbmxldCBzdHlsZSBmb3IgbG9jYWxlIGFuZCB0aW1lem9uZSB3aW5kb3cgKi8NCi0ubGlzdHMuc2NyZWVubGV0IHsNCi0gIG1hcmdpbi1sZWZ0OiAyNSU7DQotICBtYXJnaW4tcmlnaHQ6IDI1JTsNCi0gIG1hcmdpbi10b3A6IDFlbTsNCi19DQotDQotLmxpc3RzLnNjcmVlbmxldCAuYmFzaWMtdGFibGUgdHIgdGQgew0KLSAgdGV4dC1hbGlnbjogY2VudGVyOw0KLX0NCi0NCi0ubGlzdHMuc2NyZWVubGV0IC5iYXNpYy10YWJsZSB0ciB0ZCBhIHsNCi0gIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi0vKiAgICAgIEFsdGVybmF0ZSB0YWJsZSBoZWFkZXIgc3R5bGUgICAgICAqLw0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRoLA0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBncmV5ZGFyazsNCi0gIGJvcmRlci1ib3R0b206IDA7DQotICBib3JkZXItbGVmdDogMC4xZW0gc29saWQgI2FhYTsNCi0gIGJvcmRlci1yaWdodDogMC4xZW0gc29saWQgIzg4ODsNCi0gIGNvbG9yOiAjZmZmZmZmOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotfQ0KLQ0KLS8qIE5vIHBhZGRpbmcgc2NyZWVubGV0IGRlY29yYXRvciAqLw0KLS5uby1wYWRkaW5nIHsNCi0gIHBhZGRpbmc6IDA7DQotICBib3JkZXI6IG5vbmU7DQotfQ0KLQ0KLS5uby1wYWRkaW5nIC5oMSwNCi0ubm8tcGFkZGluZyAuaDIsDQotLm5vLXBhZGRpbmcgLmgzLA0KLS5uby1wYWRkaW5nciBoMSwNCi0ubm8tcGFkZGluZyBoMiwNCi0ubm8tcGFkZGluZyBoMyB7DQotICBwYWRkaW5nOiAwLjdlbTsNCi19DQotDQotLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgYTpob3ZlciB7DQotICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsNCi0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgICBFbmQgU2NyZWVubGV0IHN0eWxlICAgICAgICAgICAgICAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICAgICAgVGFibGUgU3R5bGVzICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLmJhc2ljLXRhYmxlIHsNCi0gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQotICBjb2xvcjogIzAwMDAwMDsNCi0gIG1hcmdpbi1ib3R0b206IDFlbTsNCi0gIHdpZHRoOiAxMDAlOw0KLX0NCi0NCi1mb3JtIHRhYmxlLA0KLWZvcm0gLmJhc2ljLXRhYmxlLA0KLS5zY3JlZW5sZXQtYm9keSAuYmFzaWMtdGFibGUgew0KLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7DQotICBtYXJnaW4tYm90dG9tOiAwOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgdGQgew0KLSAgLyogU3R5bGUgZm9yIGFsbCBjZWxscyAqLw0KLSAgcGFkZGluZzogMC44ZW0gMC4xZW07DQotICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgLmFsaWduLWJvdHRvbSB7DQotICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgLmFsaWduLXRvcCB7DQotICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgLmxhYmVsLA0KLS5iYXNpYy10YWJsZSB0ciAuZ3JvdXAtbGFiZWwgew0KLSAgLyogZmllbGQgbGFiZWxzIGZvciBmb3JtcyAqLw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICB0ZXh0LWFsaWduOiByaWdodDsNCi0gIHBhZGRpbmctcmlnaHQ6IDEuNWVtOw0KLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCi0gIHdpZHRoOiAxJTsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIC5ncm91cC1sYWJlbCB7DQotICAvKiAiaGVhZGVyIiBmb3IgZmllbGQgbGFiZWwgZ3JvdXBzICovDQotICBmb250LXNpemU6IDEuMmVtOw0KLSAgcGFkZGluZzogMmVtIDEuNWVtIDAgMDsNCi19DQotDQotLmJhc2ljLXRhYmxlIHRyIHRoLA0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdyB7DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIHRleHQtYWxpZ246IGxlZnQ7DQotfQ0KLQ0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdyB0ZCB7DQotICBib3JkZXItYm90dG9tOiAwLjFlbSBzb2xpZCAjMDAwMDAwOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgdGQgYSB7DQotICBjb2xvcjogIzAwMDAwMDsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93IHsNCi0gIC8qIEFsdGVybmF0aW5nIHJvdyBzdHlsZSAqLw0KLSAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5zZWxlY3RlZCB7DQotICBiYWNrZ3JvdW5kOiAjRkZGQ0NGOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3dTZWxlY3RlZCB7DQotICBiYWNrZ3JvdW5kOiAjRkZGNTVGOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLlZhbGlkYXRlIHsNCi0gIC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovDQotICBiYWNrZ3JvdW5kOiAjQTBENUY3Ow0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3dWYWxpZGF0ZSB7DQotICAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLw0KLSAgYmFja2dyb3VuZDogIzcyQThGMjsNCi19DQotDQotLmJhc2ljLXRhYmxlIC5XYXJuIHsNCi0gIC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovDQotICBiYWNrZ3JvdW5kOiAjZjU1QzVDOw0KLX0NCi0NCi0uYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3dXYXJuIHsNCi0gIC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovDQotICBiYWNrZ3JvdW5kOiAjRkM3NDU1Ow0KLX0NCi0NCi0uYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgew0KLSAgLyogYnV0dG9uIGNvbHVtbiBzdHlsZSAtIGZvciB0aGUgc21hbGwNCi0gIGNvbGxlY3Rpb24gb2YgYnV0dG9ucyB1c2VkIGluIGxpc3RzICovDQotICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KLSAgcGFkZGluZzogMC4zZW07DQotfQ0KLS5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBhLA0KLS5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBidXR0b24sDQotLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGlucHV0W3R5cGU9InJlc2V0Il0sDQotLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGlucHV0W3R5cGU9InN1Ym1pdCJdLA0KLS5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBpbnB1dFt0eXBlPSJidXR0b24iXSB7DQotICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7DQotICAtbW96LWJvcmRlci1yYWRpdXM6IDFlbTsNCi0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMWVtOw0KLSAgYm9yZGVyLXJhZGl1czogMnB4Ow0KLSAgYm9yZGVyOiAwLjFlbSBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gIGN1cnNvcjogcG9pbnRlcjsNCi0gIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGRpc3BsYXk6aW5saW5lLWJsb2NrOw0KLSAgZm9udC1zaXplOiAwLjllbTsNCi0gIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgb3V0bGluZTogMDsNCi0gIG92ZXJmbG93OiB2aXNpYmxlOw0KLSAgcGFkZGluZzogMC4xZW0gMC41ZW0gMC4yZW0gMC41ZW07DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotICB3aWR0aDogYXV0bzsNCi0NCi0gICY6aG92ZXIgew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgY29sb3I6IEB3aGl0ZTsNCi0gIH0NCi19DQotDQotLmJhc2ljLXRhYmxlIC5jb2xsYXBzZWQgew0KLSAgdmlzaWJpbGl0eTogY29sbGFwc2U7DQotfQ0KLQ0KLS8qICAgICAgU29ydCBmaWVsZCBzdHlsZSAgICAgICovDQotLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGggLnNvcnQtb3JkZXItYXNjLA0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIC5zb3J0LW9yZGVyLWFzY3sNCi0gIGJhY2tncm91bmQ6IHVybCgvaW1hZ2VzL2Fycm93LWdyLXVwLnBuZykgbm8tcmVwZWF0IHJpZ2h0Ow0KLSAgcGFkZGluZy1sZWZ0OiAwLjVlbTsNCi0gIHBhZGRpbmctcmlnaHQ6IDIwcHg7IC8qIFNldHRpbmcgbXVzdCBiZSBpbiBweCAqLw0KLX0NCi0uYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCAuc29ydC1vcmRlci1kZXNjLA0KLS5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIC5zb3J0LW9yZGVyLWRlc2N7DQotICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci1kdy5wbmcpIG5vLXJlcGVhdCByaWdodDsNCi0gIHBhZGRpbmctbGVmdDogMC41ZW07DQotICBwYWRkaW5nLXJpZ2h0OiAyMHB4OyAvKiBTZXR0aW5nIG11c3QgYmUgaW4gcHggKi8NCi19DQotLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGggLnNvcnQtb3JkZXIsDQotLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGQgLnNvcnQtb3JkZXJ7DQotICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci5wbmcpIG5vLXJlcGVhdCByaWdodDsNCi0gIHBhZGRpbmctbGVmdDogMC41ZW07DQotICBwYWRkaW5nLXJpZ2h0OiAyMHB4OyAvKiBTZXR0aW5nIG11c3QgYmUgaW4gcHggKi8NCi0gIGNvbG9yOiNmZmYNCi19DQotDQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgICBCZWdpbiBNZXNzYWdlIEluZm8gICAgICAgICAgICAgICAgICAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLmNvdW50LW1lc3NhZ2Ugew0KLSAgZGlzcGxheTogZmxleDsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gIG1pbi1oZWlnaHQ6MjBweDsNCi0gIG1pbi13aWR0aDogMjBweDsNCi0gIG1heC1oZWlnaHQ6MjBweDsNCi0gIG1heC13aWR0aDogMjBweDsNCi0gIGJhY2tncm91bmQ6IEB3aGl0ZTsNCi0gIGZvbnQtc2l6ZToxMnB4Ow0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBib3JkZXItcmFkaXVzOiA1MCU7DQotfQ0KLS5pbmZvLW1lc3NhZ2UtdGl0bGUgew0KLSAgbWluLXdpZHRoOjE1MHB4Ow0KLSAgbWFyZ2luOiA1cHg7DQotICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7DQotICBmb250LXNpemU6IDE2cHg7DQotICBmb250LXdlaWdodDogYm9sZDsNCi19DQotLm1lc3NhZ2UtbGlzdCB7DQotICBwb3NpdGlvbjpyZWxhdGl2ZTsNCi0gIG1hcmdpbi10b3A6IDEwcHg7DQotICBib3gtc2hhZG93OiAxcHggM3B4IDVweCBAZ3JleWRhcms7DQotICBib3JkZXItcmFkaXVzOiAwIDVweCA1cHggMDsNCi0gIHRyYW5zaXRpb246IGhlaWdodCAyczsNCi19DQotLm1lc3NhZ2UtbGlzdC1tYWluIHsNCi0gIHBhZGRpbmc6IDVweCAxNXB4IDVweCAxNXB4Ow0KLX0NCi0ubWVzc2FnZS1saXN0LWFsZXJ0IHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBjb2xvci1hbGVydDsNCi0gIGJvcmRlci1sZWZ0IDogc29saWQgNXB4IEBjb2xvci1hbGVydC1kYXJrOw0KLSAgLmNvdW50LW1lc3NhZ2Ugew0KLSAgICBjb2xvcjogQGNvbG9yLWFsZXJ0LWRhcms7DQotICB9DQotfQ0KLS5tZXNzYWdlLWxpc3Qtc3VjY2VzcyB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3Itc3VjY2VzczsNCi0gIGJvcmRlci1sZWZ0OiBzb2xpZCA1cHggQGNvbG9yLXN1Y2Nlc3MtZGFyazsNCi0gIC5jb3VudC1tZXNzYWdlIHsNCi0gICAgY29sb3I6IEBjb2xvci1zdWNjZXNzLWRhcms7DQotICB9DQotfQ0KLS5tZXNzYWdlLWxpc3QtdGFibGUtY29udGFpbmVyIHsNCi0gIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsNCi0gIGJvcmRlci1yYWRpdXM6IDVweDsNCi0gIG92ZXJmbG93OiBoaWRkZW47DQotICBoZWlnaHQ6IDA7DQotfQ0KLS5pbmZvLW1lc3NhZ2Utc3VjY2VzcyB7DQotICBkaXNwbGF5OiBub25lOw0KLX0NCi0uaW5mby1tZXNzYWdlLWFsZXJ0IHsNCi0gIGRpc3BsYXk6IG5vbmU7DQotfQ0KLXRhYmxlLm1zZy1saXN0IHsNCi0gIHdpZHRoOiAxMDAlOw0KLSAgZm9udC1zaXplOiAxNnB4Ow0KLSAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgcGFkZGluZzogMDsNCi0gIHRoZWFkIHsNCi0gICAgaGVpZ2h0OiAxMDAlOw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsNCi0gICAgbWFyZ2luOiAwOw0KLSAgICBwYWRkaW5nOiAwOw0KLSAgICB0cnsNCi0gICAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOw0KLSAgICAgIGhlaWdodDogMTAwJTsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsNCi0gICAgICBsaW5lLWhlaWdodDogMzBweDsNCi0gICAgfQ0KLSAgfQ0KLSAgdGJvZHkgew0KLSAgICB0ciB7DQotICAgICAgbGluZS1oZWlnaHQ6IDI1cHg7DQotICAgIH0NCi0gICAgdHIubXNnLXJvdy1zdWNjZXNzIHsNCi0gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBjb2xvci1zdWNjZXNzOw0KLSAgICB9DQotICAgIHRyLm1zZy1yb3ctYWxlcnQgew0KLSAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLWFsZXJ0Ow0KLSAgICB9DQotICB9DQotICB0ZCB7DQotICAgIHBhZGRpbmctbGVmdDogNXB4Ow0KLSAgfQ0KLX0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgIEVuZCAgTWVzc2FnZSBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgIFBhZ2luYXRlIFN0eWxlICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0ucGFnaW5hdGUtYmFyLW5yZCB7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBmb250LXNpemU6IDE1cHg7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsNCi0gIHBhZGRpbmctbGVmdDogMTBweDsNCi0gIHBhZGRpbmctdG9wOiAzcHg7DQotICBwYWRkaW5nLWJvdHRvbTogM3B4Ow0KLSAgYm94LXNoYWRvdzogMCAycHggNXB4IEBzaGFkb3ctY29sb3I7DQotDQotICB1bC5wYWdpbmF0ZS1wZy1saXN0IHsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOw0KLSAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICAgIG1hcmdpbi1yaWdodDogMTBweDsNCi0gICAgYm9yZGVyLXJhZGl1czogOHB4Ow0KLSAgICBib3JkZXI6IHNvbGlkIDFweCBAYm94LWJvcmRlci1jb2xvcjsNCi0gICAgaGVpZ2h0OiAxOHB4Ow0KLSAgICBsaSB7DQotICAgICAgZGlzcGxheTogZmxleDsNCi0gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCi0gICAgICBtaW4td2lkdGg6IDE3cHg7DQotICAgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggQGJveC1ib3JkZXItY29sb3I7DQotICAgICAgcGFkZGluZy1sZWZ0OiAycHg7DQotICAgICAgcGFkZGluZy1yaWdodDogMnB4Ow0KLSAgICAgIGhlaWdodDoxMDAlOw0KLSAgICAgIGEgew0KLSAgICAgICAgZGlzcGxheTogZmxleDsNCi0gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KLSAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCi0gICAgICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gICAgICAgIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsNCi0gICAgICAgIGhlaWdodDogMTAwJTsNCi0gICAgICAgIHdpZHRoOiAxMDAlOw0KLSAgICAgIH0NCi0gICAgICAucGFnaW5hdGUtZGlzYWJsZSB7DQotDQotICAgICAgfQ0KLSAgICB9DQotICAgIGxpLnNlbGVjdGVkIHsNCi0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gICAgICBhIHsNCi0gICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi0gICAgICB9DQotICAgIH0NCi0gICAgbGk6Zmlyc3QtY2hpbGQsIGxpOmxhc3QtY2hpbGQgew0KLSAgICAgIHdpZHRoOiAyMHB4Ow0KLSAgICB9DQotICAgIGxpOmZpcnN0LWNoaWxkIHsNCi0gICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAzcHg7DQotICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4Ow0KLSAgICB9DQotICAgIGxpOmxhc3QtY2hpbGQgew0KLSAgICAgIGJvcmRlci1yaWdodDogbm9uZTsNCi0gICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4Ow0KLSAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7DQotICAgIH0NCi0gIH0NCi0NCi19DQotc2VsZWN0LnBhZ2luYXRlLXNlbGVjdCB7DQotICBwb3NpdGlvbjogcmVsYXRpdmU7DQotICBiYWNrZ3JvdW5kOiBAd2hpdGU7DQotICBmb250LXNpemU6IDE2cHg7DQotICBmb250LXdlaWdodDogYm9sZDsNCi0gIGJvcmRlcjogMXB4IHNvbGlkIEBib3gtYm9yZGVyLWNvbG9yOw0KLSAgb3B0aW9uIHsNCi0gICAgZGlzcGxheTogZmxleDsNCi0gICAganVzdGlmeS1zZWxmOiBjZW50ZXI7DQotICAgIGZvbnQtc2l6ZTogMTRweDsNCi0gIH0NCi19DQotDQotLnBhZ2luYXRlLXNlbGVjdC1sYWJlbCB7DQotICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7DQotICBmb250LXNpemU6IDE2cHg7DQotICBwYWRkaW5nLWxlZnQ6IDE1cHg7DQotICBwYWRkaW5nLXJpZ2h0OiAxNXB4Ow0KLX0NCi0NCi0ucGFnaW5hdGUtaW5mb3JtYXRpb24gew0KLSAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOw0KLSAgZm9udC1zaXplOiAxNnB4Ow0KLSAgcGFkZGluZy1sZWZ0OiAxNXB4Ow0KLSAgcGFkZGluZy1yaWdodDogMTVweDsNCi19DQotDQotdWwucGFnaW5hdGUtcGctbGlzdCBsaTpob3ZlcnsNCi0gIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgYSB7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0gICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOw0KLSAgfQ0KLX0NCi0NCi0vKiBFbmQgb2YgUGFnaW5hdGUgU3R5bGUgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgIExpc3QgTmF2aWdhdGlvbiBTdHlsZSAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLS5uYXYtcGFnZXIgew0KLSAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXlkYXJrOw0KLSAgY29sb3I6IEB3aGl0ZTsNCi0gIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsNCi0gIGZvbnQtc2l6ZTogOXB4Ow0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBsaW5lLWhlaWdodDogMy41ZW07DQotICBoZWlnaHQ6IDMuNWVtOw0KLSAgbWFyZ2luOiAwLjVlbSAwIDAuNWVtIDA7DQotICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsNCi19DQotDQotLm5hdi1wYWdlciB1bCB7DQotICBkaXNwbGF5OiBpbmxpbmU7IC8qIElFIEZpeCAqLw0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIGxpIHsNCi0gIGZsb2F0OmxlZnQ7DQotICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KLX0NCi0NCi0ubmF2LXBhZ2VyIHVsIGxpIGEgew0KLSAgZGlzcGxheTogYmxvY2s7DQotfQ0KLQ0KLS5uYXYtcGFnZXIgdWwgYSB7DQotICBjb2xvcjogQHdoaXRlOw0KLSAgcGFkZGluZzogMCAxZW0gMCAxZW07DQotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLS5uYXYtcGFnZXIgdWwgYTpob3ZlciB7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsNCi0gIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsNCi19DQotDQotLm5hdi1wYWdlciB1bCAubmF2LXBhZ2VzaXplLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1wYWdlLXNlbGVjdCwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtZGlzcGxheWluZyB7DQotICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsNCi19DQotDQotLm5hdi1wYWdlciB1bCAubmF2LWZpcnN0LWRpc2FibGVkLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1wcmV2aW91cy1kaXNhYmxlZCwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbmV4dC1kaXNhYmxlZCwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbGFzdC1kaXNhYmxlZCB7DQotICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsNCi19DQotDQotLm5hdi1wYWdlciB1bCAubmF2LWZpcnN0LWRpc2FibGVkOmhvdmVyLA0KLS5uYXYtcGFnZXIgdWwgLm5hdi1wcmV2aW91cy1kaXNhYmxlZDpob3ZlciwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbmV4dC1kaXNhYmxlZDpob3ZlciwNCi0ubmF2LXBhZ2VyIHVsIC5uYXYtbGFzdC1kaXNhYmxlZDpob3ZlciB7DQotICBjdXJzb3I6IG5vdC1hbGxvd2VkOw0KLX0NCi0NCi0NCi0ubmF2LXBhZ2VyIHVsIC5uYXYtZGlzcGxheWluZyB7DQotICBib3JkZXItcmlnaHQ6IG5vbmU7DQotfQ0KLQ0KLQ0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0vKiAgICAgTXVsdGktQ29sdW1uIFN0eWxlcyAgICAgICovDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIHsNCi0gIG1hcmdpbjogYXV0bzsNCi0gIHBhZGRpbmc6IDFlbTsNCi0gIHBvc2l0aW9uOiByZWxhdGl2ZTsNCi0gIG1pbi13aWR0aDogQG1pbi1jb250YWluZXItd2lkdGg7DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIGgxLA0KLSNjb2x1bW4tY29udGFpbmVyIC5oMSwNCi0jY29sdW1uLWNvbnRhaW5lciBoMiwNCi0jY29sdW1uLWNvbnRhaW5lciAuaDIgew0KLSAgbWFyZ2luLWJvdHRvbTogMC41ZW07DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIGgxLA0KLSNjb2x1bW4tY29udGFpbmVyIC5oMSB7DQotICBjb2xvcjogIzU1Nzk5NjsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLmxlZnQgew0KLSAgZmxvYXQ6IGxlZnQ7DQotICAvKiBhbHQ6IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwcHg7IGxlZnQ6IDBweDsgKi8NCi0gIHdpZHRoOiAyMmVtOw0KLSAgbWFyZ2luLXJpZ2h0OiAxZW07DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5sZWZ0LWxhcmdlciB7DQotICBmbG9hdDogbGVmdDsNCi0gIC8qIGFsdDogcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyAqLw0KLSAgd2lkdGg6IDI1ZW07DQotICBtYXJnaW4tcmlnaHQ6IDFlbTsNCi19DQotDQotLmxlZnRoYWxmIHsNCi0gIGZsb2F0OiBsZWZ0Ow0KLSAgaGVpZ2h0OiAxJTsNCi0gIGxlZnQ6IDA7DQotICBtYXJnaW46IDAlIDElIDElIDAlOw0KLSAgd2lkdGg6IDQ5JTsNCi19DQotDQotLnJpZ2h0aGFsZiB7DQotICBmbG9hdDogcmlnaHQ7DQotICBoZWlnaHQ6IDElOw0KLSAgbWFyZ2luOiAwIDAgMSUgMSU7DQotICByaWdodDogMDsNCi0gIHdpZHRoOiA0OSU7DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5yaWdodCB7DQotICBmbG9hdDogcmlnaHQ7DQotICBtYXJnaW4tbGVmdDogMWVtOw0KLSAgd2lkdGg6IDIyZW07DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5sZWZ0b25seSB7DQotICBtYXJnaW4tbGVmdDogMjNlbTsNCi0gIHdpZHRoOiBhdXRvOw0KLX0NCi0NCi0jY29sdW1uLWNvbnRhaW5lciAubGVmdG9ubHktbGFyZ2VyIHsNCi0gIG1hcmdpbi1sZWZ0OiAyNmVtOw0KLSAgd2lkdGg6IGF1dG87DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5yaWdodG9ubHkgew0KLSAgbWFyZ2luLXJpZ2h0OiAyM2VtOw0KLSAgd2lkdGg6IGF1dG87DQotfQ0KLQ0KLSNjb2x1bW4tY29udGFpbmVyIC5jZW50ZXIgew0KLSAgbWFyZ2luLWxlZnQ6IDIzZW07DQotICBtYXJnaW4tcmlnaHQ6IDIzZW07DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotI2NvbHVtbi1jb250YWluZXIgLm5vY29sdW1ucyB7DQotICB3aWR0aDogYXV0bzsNCi19DQotDQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLS8qICAgICAgQnV0dG9uIFN0eWxlICAgICAgKi8NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotDQotLmJ1dHRvbi1iYXIgbGkuYnV0dG9udGV4dCBhLA0KLWEuYnV0dG9udGV4dCwNCi1hLmJ1dHRvbnRleHRiaWcsDQotLnNtYWxsU3VibWl0LA0KLS5zbWFsbFN1Ym1pdDpob3ZlciwNCi0ubWVkaXVtU3VibWl0LA0KLS5sYXJnZVN1Ym1pdCwNCi0ubG9naW5CdXR0b24sDQotLmJ1dHRvbi1zdHlsZS0xIGEsDQotLmJ1dHRvbi1zdHlsZS0xIHVsIGEsDQotLmJ1dHRvbi1zdHlsZS0yIHVsIGEsDQotLmJ1dHRvbi1zdHlsZS0yIGEsDQotLmJ1dHRvbiwNCi1idXR0b24sDQotaW5wdXRbdHlwZT0icmVzZXQiXSwNCi1pbnB1dFt0eXBlPSJzdWJtaXQiXSwNCi1pbnB1dFt0eXBlPSJidXR0b24iXSB7DQotICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7DQotICAtbW96LWJvcmRlci1yYWRpdXM6IDEuMWVtOw0KLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxLjFlbTsNCi0gIGJvcmRlci1yYWRpdXM6IDJweDsNCi0gIGJvcmRlcjogMC4xZW0gc29saWQgQG1haW4tY29sb3ItdGhlbWU7DQotICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7DQotICBjdXJzb3I6IHBvaW50ZXI7DQotICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7DQotICBkaXNwbGF5OmlubGluZS1ibG9jazsNCi0gIGZvbnQtc2l6ZTogMWVtOw0KLSAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICBvdXRsaW5lOiAwOw0KLSAgb3ZlcmZsb3c6IHZpc2libGU7DQotICBwYWRkaW5nOiAwLjRlbSAxZW0gMC40ZW07DQotICB0ZXh0LWRlY29yYXRpb246bm9uZTsNCi0gIC8qdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyovDQotICB3aWR0aDogYXV0bzsNCi0NCi0gIC8qIElFNyAqLw0KLSAgKnBhZGRpbmctdG9wOiAwLjJlbTsNCi0gICpwYWRkaW5nLWJvdHRvbTogMDsNCi0gICY6aG92ZXIgew0KLSAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47DQotICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOw0KLSAgfQ0KLX0NCi0NCi0NCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotLyogICAgICBGb290ZXIgU3R5bGUgICAgICAqLw0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi0NCi0jZm9vdGVyIHsNCi0gIGJhY2tncm91bmQ6IEBkYXJrLWNvbG9yLXRoZW1lOw0KLSAgYm9yZGVyLXRvcDogMC4xZW0gaW5zZXQgIzAwMDsNCi0gIHBhZGRpbmc6IDAuNWVtIDAgMC41ZW0gMC41ZW07DQotDQotICBoZWlnaHQ6IEBmb290ZXItaGVpZ2h0Ow0KLSAgcG9zaXRpb246IGZpeGVkOw0KLSAgYm90dG9tOiAwOw0KLSAgd2lkdGg6IDEwMCU7DQotICBkaXNwbGF5OiBmbGV4Ow0KLSAgZmxleC1kaXJlY3Rpb246IHJvdzsNCi0gIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQotICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQotICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWYgIWltcG9ydGFudDsNCi0gIHotaW5kZXg6IDEwOw0KLQ0KLSAgc3BhbiB7DQotICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsNCi0gICAgcGFkZGluZzogMTBweDsNCi0gIH0NCi0NCi0gIGEgew0KLSAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7DQotICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQotICB9DQotfQ0KLQ0KLSNmb290ZXIgYTpmb2N1cyB7DQotICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsNCi19DQotDQotI2Zvb3Rlci1vZmZzZXQgew0KLSAgaGVpZ2h0OiBAZm9vdGVyLWhlaWdodCArIDEwcHg7DQotICB3aWR0aDogMTAwJTsNCi19DQorLyogY29tbW9uIGNvbG9ycyAqLworQGJsYWNrOiAjMDAwOworQHdoaXRlOiAjZmZmOworQGdyZXk6ICNlNmU2ZTY7CitAZ3JleWRhcms6ICM5MjkyOTI7CisKK0Bjb2xvci1zdWNjZXNzOiAjOGNmZjhjOworQGZvbnQtY29sb3ItZm9yLXN1Y2Nlc3M6IEBibGFjazsKK0Bjb2xvci1hbGVydDogI2ZmOGM4YzsKK0Bmb250LWNvbG9yLWZvci1hbGVydDogQGJsYWNrOworCitAY29sb3Itc3VjY2Vzcy1kYXJrOiAjMzU2ZTM1OworQGZvbnQtY29sb3ItZm9yLXN1Y2Nlc3M6IEBibGFjazsKK0Bjb2xvci1hbGVydC1kYXJrOiAjOTMyZjMzOworQGZvbnQtY29sb3ItZm9yLWFsZXJ0OiBAYmxhY2s7CisKK0Bjb2xvci1iYWNrZ3JvdW5kLWFsZXJ0OiAjZjJkZWRlOworQGNvbG9yLWZvbnQtYWxlcnQ6ICNhOTQ0NDI7CitAY29sb3ItYm9yZGVyLWFsZXJ0OiAjZWJjY2QxOworCitAY29sb3ItYmFja2dyb3VuZC1zdWNjZXNzOiAjZGZmMGQ4OworQGNvbG9yLWZvbnQtc3VjY2VzczogIzNjNzYzZDsKK0Bjb2xvci1ib3JkZXItc3VjY2VzczogI2Q2ZTljNjsKKworLyogU2FwaGlyIGNvbG9ycyAqLworQGJsdWUtZGFyazogIzAwMjMzMzsKK0BibHVlLW1haW46ICMwMDU5ODI7CitAYmx1ZS1tZWRpdW06ICNjN2RmZmY7CitAYmx1ZS1saWdodDogI2YxZjdmZjsKK0BibHVlLWxpZ2h0MjogI2U0ZjBmNTsKKworLyogUnVieSBjb2xvcnMgKi8KK0ByZWQtZGFyazogIzQyMDAwMDsKK0ByZWQtbWFpbjogI2JmMTYxNjsKK0ByZWQtbWVkaXVtOiAjZjdiYWJhOworQHJlZC1saWdodDogI2ZjZTdlNzsKK0ByZWQtbGlnaHQyOiAjZmVkN2M5OworCisvKiBFbWVyYWxkIGNvbG9ycyAqLworQGdyZWVuLWRhcms6ICMxOTc5NDg7CitAZ3JlZW4tbWFpbjogIzIzYWY5YjsKK0BncmVlbi1tZWRpdW06ICM3YWUzYWQ7CitAZ3JlZW4tbGlnaHQ6ICNlNWY5ZWY7CitAZ3JlZW4tbGlnaHQyOiAjZDdmOWVmOworCisvKiBBbWJlciBjb2xvcnMgKi8KK0BhbWJlci1kYXJrOiAjYmM0MjE2OworQGFtYmVyLW1haW46ICNmMDg5MDY7CitAYW1iZXItbWVkaXVtOiAjZjVjNGIzOworQGFtYmVyLWxpZ2h0OiAjZmNlZGU4OworQGFtYmVyLWxpZ2h0MjogI2ZjZWRjZDsKKworLyogU2FwaGlyIHRoZW1lICovCitAbWFpbi1jb2xvci10aGVtZSA6IEBibHVlLW1haW47CitAZGFyay1jb2xvci10aGVtZSA6IEBibHVlLWRhcms7CitAbWVkaXVtLWNvbG9yLXRoZW1lIDogQGJsdWUtbWVkaXVtOworQGxpZ2h0LWNvbG9yLXRoZW1lIDogQGJsdWUtbGlnaHQ7CitAbGlnaHQyLWNvbG9yLXRoZW1lIDogQGJsdWUtbGlnaHQyOworQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAZ3JleTsKK0Bmb250LWNvbG9yLWZvci1tYWluIDogQHdoaXRlOworQGZvbnQtY29sb3ItZm9yLW1lZGl1bSA6IEBkYXJrLWNvbG9yLXRoZW1lOworQGZvbnQtY29sb3ItZm9yLWxpZ2h0IDogQGRhcmstY29sb3ItdGhlbWU7CitAc2hhZG93LWNvbG9yIDogQGJsYWNrOworQHNoYWRvdy1jb2xvci1saWdodCA6IEBncmV5ZGFyazsKKworLyogUnVieSB0aGVtZSAqLworLyoKK0BtYWluLWNvbG9yLXRoZW1lIDogQHJlZC1tYWluOworQGRhcmstY29sb3ItdGhlbWUgOiBAcmVkLWRhcms7CitAbWVkaXVtLWNvbG9yLXRoZW1lIDogQHJlZC1tZWRpdW07CitAbGlnaHQtY29sb3ItdGhlbWUgOiBAcmVkLWxpZ2h0OworQGxpZ2h0Mi1jb2xvci10aGVtZSA6IEByZWQtbGlnaHQyOworQGZvbnQtY29sb3ItZm9yLWRhcmsgOiBAZ3JleTsKK0Bmb250LWNvbG9yLWZvci1tYWluIDogQHdoaXRlOworQGZvbnQtY29sb3ItZm9yLW1lZGl1bSA6IEBkYXJrLWNvbG9yLXRoZW1lOworQGZvbnQtY29sb3ItZm9yLWxpZ2h0IDogQGRhcmstY29sb3ItdGhlbWU7CitAc2hhZG93LWNvbG9yIDogQGJsYWNrOworQHNoYWRvdy1jb2xvci1saWdodCA6IEBncmV5ZGFyazsKKy8qCisKKy8qIEVtZXJhbGQgdGhlbWUgKi8KKy8qCitAbWFpbi1jb2xvci10aGVtZSA6IEBncmVlbi1tYWluOworQGRhcmstY29sb3ItdGhlbWUgOiBAZ3JlZW4tZGFyazsKK0BtZWRpdW0tY29sb3ItdGhlbWUgOiBAZ3JlZW4tbWVkaXVtOworQGxpZ2h0LWNvbG9yLXRoZW1lIDogQGdyZWVuLWxpZ2h0OworQGxpZ2h0Mi1jb2xvci10aGVtZSA6IEBncmVlbi1saWdodDI7CitAZm9udC1jb2xvci1mb3ItZGFyayA6IEB3aGl0ZTsKK0Bmb250LWNvbG9yLWZvci1tYWluIDogQHdoaXRlOworQGZvbnQtY29sb3ItZm9yLW1lZGl1bSA6IEBkYXJrLWNvbG9yLXRoZW1lOworQGZvbnQtY29sb3ItZm9yLWxpZ2h0IDogQGRhcmstY29sb3ItdGhlbWU7CitAc2hhZG93LWNvbG9yIDogQGJsYWNrOworQHNoYWRvdy1jb2xvci1saWdodCA6IEBncmV5ZGFyazsKKyovCisvKiBBbWJlciB0aGVtZSAqLworLyoKK0BtYWluLWNvbG9yLXRoZW1lIDogQGFtYmVyLW1haW47CitAZGFyay1jb2xvci10aGVtZSA6IEBhbWJlci1kYXJrOworQG1lZGl1bS1jb2xvci10aGVtZSA6IEBhbWJlci1tZWRpdW07CitAbGlnaHQtY29sb3ItdGhlbWUgOiBAYW1iZXItbGlnaHQ7CitAbGlnaHQyLWNvbG9yLXRoZW1lIDogQGFtYmVyLWxpZ2h0MjsKK0Bmb250LWNvbG9yLWZvci1kYXJrIDogQHdoaXRlOworQGZvbnQtY29sb3ItZm9yLW1haW4gOiBAd2hpdGU7CitAZm9udC1jb2xvci1mb3ItbWVkaXVtIDogQGRhcmstY29sb3ItdGhlbWU7CitAZm9udC1jb2xvci1mb3ItbGlnaHQgOiBAZGFyay1jb2xvci10aGVtZTsKK0BzaGFkb3ctY29sb3IgOiBAYmxhY2s7CitAc2hhZG93LWNvbG9yLWxpZ2h0IDogQGdyZXlkYXJrOworKi8KKworCitAYXBwLWJhci1oZWlnaHQ6IDYwcHg7CitAc3ViLWFwcC1iYXItaGVpZ2h0OiA0MHB4OworQGZvb3Rlci1oZWlnaHQ6IDIwcHg7CitAaG9tZS1idG4td2lkdGg6IDQ3cHg7CitAY29sb3ItbGluZS1oZWlnaHQ6IDlweDsKKworQGhvbWUtbWVudS10aWxlLWhlaWdodDogODBweDsKK0Bob21lLW1lbnUtdGlsZS1taW4td2lkdGg6IDEwMHB4OworQGhvbWUtbWVudS10aWxlLW1heC13aWR0aDogMTAwcHg7CisKK0B0aGlyZC1sdmwtaGVpZ2h0OiA4MHB4OworQHRoaXJkLWx2bC13aWR0aCA6IDEwMHB4OworQG1pbi1zY3JlZW4gOiAxMTcwcHg7CitAbWluLWNvbnRhaW5lci13aWR0aDogMTEzMHB4OworCitAYm94LWJvcmRlci1jb2xvcjogI2Q3ZDdkNzsKKworQGZvbnQtZmFjZSB7CisgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsKKyAgc3JjOiB1cmwoJ2ZvbnRzL3F1aWNrc2FuZC9xdWlja3NhbmRib2xkLm90ZicpOworICBmb250LXdlaWdodDogbm9ybWFsOworICBmb250LXN0eWxlOiBub3JtYWw7Cit9CisKK0Bmb250LWZhY2UgeworICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7CisgIHNyYzogdXJsKCdmb250cy9xdWlja3NhbmQvcXVpY2tzYW5kYm9sZC5vdGYnKTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGZvbnQtc3R5bGU6IG5vcm1hbDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogQmVnaW4gc3BlY2lhbCBjaGVja2JveCB0eXBlIHN3aXRjaCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1jaGtib3gsIFt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCB7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKK1t0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLWNoa2JveCArIGxhYmVsLAorW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtY2hrYm94ICsgbGFiZWx7CisgIGN1cnNvcjogcG9pbnRlcjsKK30KK1t0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLWNoa2JveCArIGxhYmVsOmJlZm9yZSwKK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLWNoa2JveCArIGxhYmVsOmJlZm9yZXsKKyAgY29udGVudDogIiI7CisgIHdpZHRoOiAxNTBweDsKKyAgbWluLXdpZHRoOiAxNTBweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0LWNvbG9yLXRoZW1lOworICBwYWRkaW5nOiAycHggMjBweCAycHggMjBweDsKKyAgYm9yZGVyLXJhZGl1czogOHB4IDhweCA4cHggOHB4OworCisgIGN1cnNvcjogcG9pbnRlcjsKK30KKworW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtY2hrYm94ICsgbGFiZWw6YWZ0ZXIsCitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1jaGtib3ggKyBsYWJlbDphZnRlcnsKKyAgY29udGVudDogIiI7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgbGVmdDotMzVweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIG1pbi1oZWlnaHQ6IDEwcHg7CisgIG1pbi13aWR0aDogMTBweDsKKyAgcGFkZGluZy1sZWZ0OiA0cHg7CisgIHBhZGRpbmctcmlnaHQ6IDVweDsKKyAgYm9yZGVyLXJhZGl1czogOHB4IDhweCA4cHggOHB4OworICB0cmFuc2l0aW9uOiBhbGwgLjJzOworfQorCitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1jaGtib3ggKyBsYWJlbDphZnRlcnsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBsZWZ0OiAtMTVweDsKKyAgdHJhbnNpdGlvbjogYWxsIC4yczsKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEVuZCBzcGVjaWFsIGNoZWNrYm94IHR5cGUgc3dpdGNoICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBCZWdpbiBzcXVhcmUgQ2hlY2tib3ggICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCwKK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3h7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgbGVmdDogLTk5OTlweDsKK30KKworW3R5cGU9ImNoZWNrYm94Il06bm90KDpjaGVja2VkKS5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsLAorW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVseworICBjb250ZW50OiAnJzsKKyAgcGFkZGluZy1sZWZ0OiAzNXB4OworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGN1cnNvcjogcG9pbnRlcjsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDEycHg7CisKK30KK1t0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDpiZWZvcmUsCitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YmVmb3JleworICBjb250ZW50OiAnJzsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OjEwcHg7CisgIHRvcDogLTRweDsKKyAgd2lkdGg6IDE3cHg7CisgIGhlaWdodDogMTdweDsgLyogZGltLiBkZSBsYSBjYXNlICovCisgIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7CisgIGJhY2tncm91bmQ6IEBsaWdodC1jb2xvci10aGVtZTsKKyAgYm9yZGVyLXJhZGl1czogMnB4OworfQorCitbdHlwZT0iY2hlY2tib3giXTpub3QoOmNoZWNrZWQpLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YmVmb3JlIHsKKyAgYmFja2dyb3VuZDogQGxpZ2h0LWNvbG9yLXRoZW1lOworfQorW3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZC5ucmQtc3F1YXJlLWNoa2JveCArIGxhYmVsOmJlZm9yZXsKKyAgYmFja2dyb3VuZDogQG1haW4tY29sb3ItdGhlbWU7Cit9CisKK1t0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDphZnRlciwKK1t0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDphZnRlcnsKKyAgY29udGVudDogJ+KclCc7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgdG9wOiAtNHB4OworICBsZWZ0OiAxNHB4OworICBmb250LXNpemU6IDE2cHg7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgdHJhbnNpdGlvbjogYWxsIC4yczsKK30KK1t0eXBlPSJjaGVja2JveCJdOm5vdCg6Y2hlY2tlZCkubnJkLXNxdWFyZS1jaGtib3ggKyBsYWJlbDphZnRlciB7CisgIG9wYWNpdHk6IDA7CisgIHRyYW5zZm9ybTogc2NhbGUoMCk7Cit9CitbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkLm5yZC1zcXVhcmUtY2hrYm94ICsgbGFiZWw6YWZ0ZXIgeworICBvcGFjaXR5OiAxOworICB0cmFuc2Zvcm06IHNjYWxlKDEpOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICBFbmQgc3F1YXJlIENoZWNrYm94ICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogIEJlZ2luIGNsYXNzIGNvbnRlbnQgbWdtdCAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLmZsZXgtcm93IHsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IHJvdyAhaW1wb3J0YW50OworfQorLmZsZXgtY29sdW1uIHsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKK30KKworLmNvbC13aWR0aC0xIHsKKyAgd2lkdGg6IDEwJTsKK30KKy5jb2wtd2lkdGgtMiB7CisgIHdpZHRoOiAyMCU7Cit9CisuY29sLXdpZHRoLTMgeworICB3aWR0aDogMzAlOworfQorLmNvbC13aWR0aC00IHsKKyAgd2lkdGg6IDQwJTsKK30KKy5jb2wtd2lkdGgtNSB7CisgIHdpZHRoOiA1MCU7Cit9CisuY29sLXdpZHRoLTYgeworICB3aWR0aDogNjAlOworfQorLmNvbC13aWR0aC03IHsKKyAgd2lkdGg6IDcwJTsKK30KKy5jb2wtd2lkdGgtOCB7CisgIHdpZHRoOiA4MCU7Cit9CisuY29sLXdpZHRoLTkgeworICB3aWR0aDogOTAlOworfQorLmNvbC13aWR0aC0xMCB7CisgIHdpZHRoOiAxMDAlOworfQorCisuYWxpZ24tdi1jZW50ZXIgeworICBkaXNwbGF5OmZsZXg7CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cit9CisKKy5hbGlnbi1oLWNlbnRlciB7CisgIGRpc3BsYXk6ZmxleDsKKyAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICBFbmQgY2xhc3MgY29udGVudCBtZ210ICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgQmVnaW4gYnRuLXNvcnQgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisuYnRuLXNvcnQgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHRvcDogLTZweDsKKyAgYm9yZGVyOm5vbmU7CisgIGJhY2tncm91bmQ6bm9uZTsKKyAgYm9yZGVyLXJhZGl1czogMDsKKyAgbWFyZ2luLWxlZnQ6NXB4OworfQorCisuYnRuLXNvcnQ6YmVmb3JleworICBjb250ZW50OiAnJzsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiAtMXB4OworICB3aWR0aDogMDsKKyAgaGVpZ2h0OiAwOworICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CisgIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgQGdyZXlkYXJrOworICBib3JkZXItbGVmdDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKK30KKworLmJ0bi1zb3J0OmFmdGVyeworICBjb250ZW50OiAnJzsKKyAgcG9zaXRpb246IGFic29sdXRlOworICByaWdodDogLTFweDsKKyAgd2lkdGg6IDA7CisgIGhlaWdodDogMDsKKyAgYm9yZGVyLXJpZ2h0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50OworICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIEBncmV5ZGFyazsKKyAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CisgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEzNDlweCkgeworICAgIHJpZ2h0OiAtNXB4OworICB9Cit9CisKKy5idG4tc29ydC5idG4tc29ydC1hc2M6YmVmb3JleworICBib3JkZXItYm90dG9tOiAxMHB4IHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOworfQorCisuYnRuLXNvcnQuYnRuLXNvcnQtZGVzYzphZnRlcnsKKyAgYm9yZGVyLXRvcDogMTBweCBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogIEVuZCBidG4tc29ydCAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgQmVnaW4gZGVmYXV0IGNvbG91ciBjbGFzcyAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy5kYXJrLWNvbG9yIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrICFpbXBvcnRhbnQ7Cit9CisubWFpbi1jb2xvciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbiAhaW1wb3J0YW50OworfQorLm1lZGl1bS1jb2xvciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBtZWRpdW0tY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tZWRpdW0gIWltcG9ydGFudDsKK30KKy5saWdodC1jb2xvciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBsaWdodC1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWxpZ2h0ICFpbXBvcnRhbnQ7Cit9CisubGlnaHQyLWNvbG9yIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGxpZ2h0Mi1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWxpZ2h0ICFpbXBvcnRhbnQ7Cit9CisKKy5ncmV5LWNvbG9yIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXkgIWltcG9ydGFudDsKK30KKy5kYXJrZ3JleS1jb2xvciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBncmV5ZGFyayAhaW1wb3J0YW50OworfQorCisvKiBiZWdpbiBsb29rdXAgd2lkZ2V0ICovCisudWktZGlhbG9nIHsKKyAgb3BhY2l0eTogMTsKKyAgei1pbmRleDogNTA7Cit9CisKKy51aS1kaWFsb2ctdGl0bGViYXIudWktd2lkZ2V0LWhlYWRlci51aS1jb3JuZXItYWxsLnVpLWhlbHBlci1jbGVhcmZpeCB7CisgIGJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgYnV0dG9uIHsKKyAgICBiYWNrZ3JvdW5kOiBub25lOworICAgIGJhY2tncm91bmQtY29sb3I6IEBsaWdodC1jb2xvci10aGVtZTsKKyAgfQorfQorLyogZW5kIGxvb2t1cCB3aWRnZXQgKi8KKworLm1haW4tYmFyLWxhYmVsIHsKKyAgY29sb3I6IEBsaWdodC1jb2xvci10aGVtZTsKKyAgcGFkZGluZy1sZWZ0OiAzcHg7CisgIHBhZGRpbmctcmlnaHQ6IDZweDsKKyAgZm9udC1zaXplOiAxNXB4OworICBmb250LXdlaWdodDogYm9sZDsKK30KKworI2NvbXBhbnktbG9nbyB7CisgIHJpZ2h0OiAxMHB4OworICB0b3A6IDJweDsKKyAgYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvb2ZiaXotc2ltcGxlLXdoaXRlLnN2ZyIpIG5vLXJlcGVhdCBsZWZ0IHRvcCAvIGNvdmVyOworICBtaW4taGVpZ2h0OiA1MHB4OworICBtaW4td2lkdGg6IDUwcHg7CisgIG1hcmdpbi1yaWdodDogMTVweDsKKyAgYWxpZ24tc2VsZjogY2VudGVyOworICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoIDogMTIzMnB4KSB7CisgICAgbWluLWhlaWdodDogNTBweDsKKyAgICBtaW4td2lkdGg6IDEyOXB4OworICAgIGJhY2tncm91bmQ6IHVybCgiaW1hZ2VzL29mYml6LXdoaXRlLnN2ZyIpIG5vLXJlcGVhdCBsZWZ0IHRvcCAvIGNvdmVyOworICB9Cit9CisKKy5tb2RhbC1zY3JlZW4geworICB2aXNpYmlsaXR5OiBoaWRkZW47CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CisgIGJhY2tncm91bmQtY29sb3I6IEBncmV5OworICBvcGFjaXR5OiAuOTM7CisgIHBvc2l0aW9uOiBmaXhlZDsKKyAgdG9wOiAwOworICBsZWZ0OiAwOworICBoZWlnaHQ6IDEwMCU7CisgIHdpZHRoOiAxMDAlOworICB6LWluZGV4OiA5OTk5OworfQorCisubW9kYWwtYm94eworICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgIG9wYWNpdHk6IDE7CisgIG1hcmdpbjogMTAlOworICBib3JkZXItcmFkaXVzOiAxMHB4OworICBib3JkZXI6IHNvbGlkIDJweCBAbWFpbi1jb2xvci10aGVtZTsKKyAgcGFkZGluZyA6IDEwcHggNDBweCAxMHB4IDQwcHg7CisgIC5tb2RhbC1oZWFkZXIgeworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgICAgaDIgeworICAgICAgZm9udC1zaXplOiAyNXB4OworICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICB9CisgICAgLmJ0bi1jbG9zZS1ucmQgeworICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgcmlnaHQ6IDA7CisgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgICBib3JkZXI6IHNvbGlkIDFweCBAbWFpbi1jb2xvci10aGVtZTsKKyAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsKKyAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICAgIGZvbnQtc2l6ZTogMjVweDsKKyAgICAgIGhlaWdodDogMzBweDsKKyAgICAgIHdpZHRoOiAzMHB4OworICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7CisgICAgfQorICB9CisgIC5tb2RhbC1ib2R5IHsKKyAgICBwIHsKKyAgICAgIGZvbnQtc2l6ZTogMjBweDsKKyAgICB9CisgIH0KKyAgLm1vZGFsLWZvb3RlciB7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIGhlaWdodDogMzVweDsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CisgICAgLmJ0bi1ucmQgeworICAgICAgYmFja2dyb3VuZDogbm9uZTsKKyAgICAgIGJvcmRlcjogbm9uZTsKKyAgICAgIHRleHQtc2hhZG93OiBub25lOworICAgICAgb3BhY2l0eTogMTsKKyAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKKyAgICAgIGZvbnQtc2l6ZTogMjBweDsKKyAgICAgIHBhZGRpbmc6IDVweDsKKyAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKKyAgICB9CisgICAgLmJ0bi1ucmQtbWFpbiB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICAgIGNvbG9yOiBAd2hpdGU7CisgICAgfQorICAgIC5idG4tbnJkLXN0ZCB7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgICAgICBjb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgICBib3JkZXI6IHNvbGlkIDFweCBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICAgIH0KKyAgfQorfQorLmJ0bi1ucmQ6aG92ZXIgeworICBib3gtc2hhZG93OiA1cHggNXB4IDNweCAwIEBibGFjazsKK30KKworLmJ0bi1ucmQtc3RkOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgY29sb3I6IEB3aGl0ZSAhaW1wb3J0YW50OworICBib3JkZXI6IHNvbGlkIDFweCBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50OworfQorCisuYnRuLWNsb3NlLW5yZDpob3ZlciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgIGNvbG9yOiBAd2hpdGUgIWltcG9ydGFudDsKK30KKworLmxpc3QtbnJkIHsKKyAgYm9yZGVyOiBzb2xpZCAycHggQG1haW4tY29sb3ItdGhlbWU7CisgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDEwcHg7CisgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAxMHB4OworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICBtYXJnaW4tdG9wOiAxNXB4OworICBtYXJnaW4tYm90dG9tOiAxNXB4OworICAudGl0bGUtbGlzdC1ucmQgeworICAgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIGNvbG9yIDogQHdoaXRlOworICAgIGZvbnQtc2l6ZTogMjBweDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBwYWRkaW5nLWxlZnQ6IDVweDsKKyAgfQorCisgIGxpIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgZGlzcGxheTogZmxleDsKKyAgICBmbGV4LWRpcmVjdGlvbjogcm93OworICAgIGZvbnQtc2l6ZTogMjBweDsKKyAgICBwYWRkaW5nLWxlZnQ6IDVweDsKKyAgICBwYWRkaW5nLXRvcDogMnB4OworICAgIHBhZGRpbmctYm90dG9tOiAycHg7CisgICAgbWFyZ2luLWJvdHRvbTogM3B4OworICAgIGEgeworICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIH0KKyAgICBzcGFuIHsKKyAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICAgIHJpZ2h0OiAwOworICAgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgICAgZm9udC1zaXplOiAzMHB4OworICAgIH0KKyAgfQorfQorbGkubGluZS1vZGQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbGlnaHQtY29sb3ItdGhlbWU7Cit9CisKKyN1c2VyLWF2YXRhciB7CisgIGhlaWdodDogNDBweDsKKyAgd2lkdGg6IDQwcHg7CisgIHBhZGRpbmc6IDJweDsKKyAgYWxpZ24tc2VsZjogY2VudGVyOworCisgIDpob3ZlciB7CisgICAgY3Vyc29yOiBwb2ludGVyOworICB9CisgIGltZyB7CisgICAgbWF4LWhlaWdodDogNDBweDsKKyAgICBtYXgtd2lkdGg6IDQwcHg7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHRvcDogLTJweDsKKyAgICBwYWRkaW5nOiAycHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICAgIGJvcmRlci1yYWRpdXM6IDJweDsKKyAgfQorfQorCisjbWFpbi1uYXZpZ2F0aW9uLWJhciB7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgd2lkdGg6IDEwMCU7CisgIG1pbi13aWR0aDogQG1pbi1jb250YWluZXItd2lkdGg7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKKyAgZm9udC1mYW1pbHk6IFF1aWNrc2FuZCxzYW5zLXNlcmlmOworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgei1pbmRleDogNTsKKyAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQ7Cit9CisjbWFpbi1uYXYtYmFyLWxlZnQgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGRpc3BsYXk6IGZsZXg7CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cit9CisjbWFpbi1uYXYtYmFyLXJpZ2h0IHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBkaXNwbGF5OiBmbGV4OworICBhbGlnbi1pdGVtczogY2VudGVyOworICBwYWRkaW5nLXJpZ2h0OiAxNXB4OworfQorCisuYXBwLWJ0bnsKKyAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQ7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICBkaXNwbGF5OiBmbGV4OworICBhbGlnbi1pdGVtczogY2VudGVyOworICBmbGV4LWRpcmVjdGlvbjogcm93OworICBtYXJnaW4tcmlnaHQ6IDJweDsKKyAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgYSB7CisgICAgcGFkZGluZzoxMHB4OworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICBmb250LXNpemU6IDEuNGVtICFpbXBvcnRhbnQ7CisgIH0KK30KKworLmFwcC1idG4gYTp2aXNpdGVkIHsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworfQorCisuYXBwLWJ0bjpob3ZlcnsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB0b3A6IC02cHg7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA1cHg7CisgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA1cHg7CisgIGJveC1zaGFkb3c6IDFweCAxcHggMTJweCBAc2hhZG93LWNvbG9yOworICBhIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgdG9wOiA2cHg7CisgICAgY29sb3IgOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgfQorfQorLmFwcC1idG4uc2VsZWN0ZWQ6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgYm94LXNoYWRvdzogbm9uZTsKKyAgdG9wOjA7Cit9CisKKy5hcHAtYnRuIGE6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisjYXBwLXNlbGVjdGVkIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICBhbGlnbi1pdGVtczogY2VudGVyOworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGJveC1zaGFkb3c6IDFweCAtMnB4IDEycHggQHNoYWRvdy1jb2xvcjsKKyAgei1pbmRleDogMDsKKyAgb3BhY2l0eTogLjk5OworICBib3JkZXItdG9wLWxlZnQtcmFkaXVzIDogOHB4IDsKKyAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMgOiA4cHggOworICBhIHsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgdG9wOiAzcHg7CisgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICB9Cit9CisuYXBwLWJ0bi5zZWxlY3RlZCBhOmhvdmVyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisjYXBwLWJhci1saW5lIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB3aWR0aDogMTAwJTsKKyAgbWluLXdpZHRoOiBAbWluLWNvbnRhaW5lci13aWR0aDsKKyAgaGVpZ2h0OiBAY29sb3ItbGluZS1oZWlnaHQ7CisgIGJhY2tncm91bmQtY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICBib3gtc2hhZG93OiAycHggMnB4IDVweCBAc2hhZG93LWNvbG9yOworfQorI2NvbG9yLWFkZCB7CisgIHdpZHRoOiAxNTBweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGhlaWdodDogQGNvbG9yLWxpbmUtaGVpZ2h0OworICB6LWluZGV4OiAyMDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB0b3A6IEBjb2xvci1saW5lLWhlaWdodDsKK30KKworI21vcmUtYXBwIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBkaXNwbGF5OiBmbGV4OworICBhbGlnbi1pdGVtczogY2VudGVyOworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGZvbnQtc2l6ZTogMS40ZW0gIWltcG9ydGFudDsKKyAgd2lkdGg6IDQwcHg7CisgIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0OworICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7Cit9CisjbW9yZS1hcHA6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorI21vcmUtYXBwOmhvdmVyICNtb3JlLWFwcC1saXN0IHsKKyAgZGlzcGxheTogYmxvY2s7Cit9CisjbW9yZS1hcHAuc2VsZWN0ZWQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKK30KKworI21vcmUtYXBwLWxpc3QgeworICBkaXNwbGF5OiBub25lOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHRvcDogQGFwcC1iYXItaGVpZ2h0OworICBsZWZ0OiAtMjBweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIHotaW5kZXg6IDEwOworICBib3JkZXI6IHNvbGlkIDRweCBAbWFpbi1jb2xvci10aGVtZTsKKyAgYm9yZGVyLXRvcC13aWR0aDogQGNvbG9yLWxpbmUtaGVpZ2h0OworICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CisgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7CisgIGxpIHsKKyAgICBwYWRkaW5nLWxlZnQgOiA0cHg7CisgICAgcGFkZGluZy1yaWdodDogNHB4OworICB9CisKKyAgYSB7CisgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgIGZvbnQtc2l6ZTogMTVweDsKKyAgfQorCisgIDpob3ZlciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1lZGl1bS1jb2xvci10aGVtZTsKKyAgICBhIHsKKyAgICAgIGJveC1zaGFkb3c6IG5vbmU7CisgICAgICBjb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgICAgfQorICAgIGE6aG92ZXJ7CisgICAgICBib3gtc2hhZG93OiBub25lOworICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgYm9yZGVyLXJhZGl1czogMDsKKyAgICB9CisgIH0KKworICBsaS5zZWxlY3RlZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgYSB7CisgICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47CisgICAgfQorICAgIGE6aG92ZXIgeworICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgfQorICB9Cit9CisKKyNob21lQnV0dG9uIHsKKyAgZGlzcGxheTogZmxleDsKKyAgLy92aXNpYmlsaXR5OiBoaWRkZW47CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICBiYWNrZ3JvdW5kLWNvbG9yOkBncmV5OworICBib3JkZXI6IG5vbmU7CisgIGJvcmRlci1yYWRpdXMgOiAwOworCisgIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0OworICB3aWR0aCA6IEBob21lLWJ0bi13aWR0aDsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICBpbWcgeworICAgIGhlaWdodDogMjVweDsKKyAgICB0cmFuc2l0aW9uOiBhbGwgLjJzIGVhc2UtaW4tb3V0OworICB9Cit9CisKKyNob21lQnV0dG9uOmhvdmVyIGltZyB7CisgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsKK30KKworI2FwcC1iYXItbGlzdCB7CisgIGRpc3BsYXk6IGZsZXg7Cit9CisKKyN1c2VyLWRldGFpbHMgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHJpZ2h0OiAyMHB4OworICB0b3AgOiA2MnB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgY29sb3IgOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgZm9udC1zaXplOiAxNXB4OworICBmb250LXdlaWdodDogYm9sZDsKKyAgcGFkZGluZy10b3A6IDVweDsKKyAgcGFkZGluZy1ib3R0b206IDEwcHg7CisgIHotaW5kZXg6IDE1OworICBib3gtc2hhZG93OiAzcHggM3B4IDEycHggQHNoYWRvdy1jb2xvcjsKKyAgYm9yZGVyLXJhZGl1czogM3B4OworICB0cmFuc2l0aW9uOiBhbGwgLjFzIGVhc2UtaW4tb3V0OworCisgIGltZyB7CisgICAgaGVpZ2h0OiA1MHB4OworICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgICBwYWRkaW5nOiA0cHg7CisgICAgYm9yZGVyLXJhZGl1cyA6IDNweDsKKyAgICBtYXJnaW4tbGVmdDogMTBweDsKKyAgICBtYXJnaW4tcmlnaHQ6IDVweDsKKyAgfQorICAjbG9nb3V0IHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgICAgY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgICAgYm9yZGVyLXJhZGl1czogMnB4OworICAgIDpob3ZlciB7CisgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgfQorICB9Cit9CisKKyN1c2VyLWRldGFpbHM6YWZ0ZXJ7CisgIGNvbnRlbnQ6ICcnOworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIHRvcDogLTEwcHg7CisgIHJpZ2h0OiA1cHg7CisgIHdpZHRoOiAwOworICBoZWlnaHQ6IDA7CisgIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCBAZGFyay1jb2xvci10aGVtZTsKKyAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7Cit9CisKK2EudXNlci1wcmVmLWJ0biB7CisgIG1hcmdpbi10b3A6IDE1cHg7CisgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lOworICBtYXJnaW4tbGVmdDogMTBweDsKKyAgbWFyZ2luLXJpZ2h0OiAxMHB4OworICBwYWRkaW5nLXRvcDogMnB4OworICBwYWRkaW5nLWJvdHRvbTogMnB4OworICBkaXNwbGF5OiBmbGV4OworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrICFpbXBvcnRhbnQ7CisgIDpob3ZlciB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICB9Cit9CisKKyN1c2VyLW5hbWUgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgYWxpZ24tY29udGVudDogY2VudGVyOworICBwYWRkaW5nLWxlZnQgOiA1cHg7CisgIHBhZGRpbmctcmlnaHQgOiA1cHg7CisgIHNwYW4geworICAgIG1pbi13aWR0aDogMTAwcHg7CisgICAgcGFkZGluZy1ib3R0b20gOiA1cHg7CisgICAgcGFkZGluZy10b3AgOiA1cHg7CisgIH0KK30KKworI3VzZXItcm93MSB7CisgIGRpc3BsYXk6IGZsZXg7CisgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAjdXNlci1sYW5nIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CisgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgYWxpZ24tY29udGVudDogY2VudGVyOworICAgIHBhZGRpbmctbGVmdDogMTBweDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4OworICAgIHNwYW4geworICAgICAgbWluLXdpZHRoOiAzMHB4OworICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgIH0KKyAgfQorfQorCisuYXBwYmFyLWJ0bi1pbWcgeworICBoZWlnaHQ6IEBhcHAtYmFyLWhlaWdodCAtIDQwcHg7Cit9CisKKyNoZWxwLWJ0biB7CisgIGZvbnQtc2l6ZTogMTBweDsKKyAgbWluLXdpZHRoOiAyMHB4OworICBtYXJnaW4tcmlnaHQ6IDE1cHg7Cit9CisvKiBCZWdpbiBzdWIgTWVudSBzZWN0aW9uICovCisKKyNhcHAtbmF2aWdhdGlvbiB7CisgIGhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodDsKKyAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggQGJsYWNrOworICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggQGJsYWNrOworICB3aWR0aDogMTAwJTsKKyAgbWluLXdpZHRoOiBAbWluLWNvbnRhaW5lci13aWR0aDsKKyAgaDIgeworICAgIGRpc3BsYXk6IG5vbmU7CisgIH0KKyAgdWwgeworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsKKyAgICBmbGV4LWdyb3c6IDE7CisgIH0KKyAgdWwgbGkgdWwgbGkgeworICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggQGJsYWNrOworICAgIGhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodDsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAganVzdGlmeS1pdGVtczogY2VudGVyOworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIG1pbi13aWR0aDogNzVweDsKKyAgICBwYWRkaW5nLWxlZnQ6IDZweDsKKyAgICBwYWRkaW5nLXJpZ2h0OiA2cHg7CisgICAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCBAYmxhY2s7CisgICAgZm9udC1zaXplOiAxMnB4OworICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDE1MDBweCkgeworICAgICAgZm9udC1zaXplOiAxMHB4OworICAgICAgbWluLXdpZHRoOiA2NXB4OworICAgIH0KKyAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMzAwcHgpIHsKKyAgICAgIGZvbnQtc2l6ZTogMTBweDsKKyAgICAgIG1pbi13aWR0aDogNTBweDsKKyAgICB9CisgICAgYSB7CisgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgICBhbGlnbi1pdGVtczogY2VudGVyOworICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworICAgICAgaGVpZ2h0OiAxMDAlOworICAgICAgd2lkdGg6IDEwMCU7CisgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgfQorICB9Cit9CisKKyNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaTpsYXN0LWNoaWxkIHsKKyAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggQGJsYWNrOworfQorCisjYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGk6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgbWluLWhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICAvL3RvcDogLTFweDsKKyAgYSB7CisgICAgY29sb3I6IEB3aGl0ZTsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIH0KK30KKyNhcHAtbmF2aWdhdGlvbiB1bCBsaSB1bCBsaS5zZWxlY3RlZDpob3ZlciB7CisgIGEgeworICAgIGNvbG9yOiBAYmxhY2sgIWltcG9ydGFudDsKKyAgfQorfQorCisjYXBwLW5hdmlnYXRpb24gdWwgbGkgdWwgbGkuc2VsZWN0ZWQgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgdG9wOiAxcHg7CisgIGhlaWdodDogQHN1Yi1hcHAtYmFyLWhlaWdodCArIDFweDsKKyAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsKKyAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMnB4OworICBib3JkZXItYm90dG9tOiBub25lOworCisgIDphZnRlciB7CisgICAgY29udGVudDogJyc7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogLTJweDsKKyAgICBsZWZ0OiA1cHg7CisgICAgd2lkdGg6IDA7CisgICAgaGVpZ2h0OiAwOworICAgIGJvcmRlci1yaWdodDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgICBib3JkZXItdG9wOiAxMHB4IHNvbGlkIEBtYWluLWNvbG9yLXRoZW1lOworICAgIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50OworICB9CisKK30KKworCisvKiBFbmQgc3ViIE1lbnUgc2VjdGlvbiAqLworCisvKiBiZWdpbiBzdWIgTWVudSBzZWN0aW9uIDNyZCBsZXZlbCAqLworCisuYnV0dG9uLWJhci50YWItYmFyIHsKKyAgdWwgbGkgdWwgbGkgeworICAgIGJvcmRlcjogc29saWQgMXB4IEBncmV5OworICAgIGJvcmRlci1yYWRpdXM6IDRweDsKKyAgICBhIHsKKyAgICAgIHdpZHRoOiAxMDAlOworICAgICAgaGVpZ2h0OiAxMDAlOworICAgIH0KKyAgfQorICBsaS5zZWxlY3RlZHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICBheworICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICAgIH0KKyAgfQorICB1bCBsaSB1bCBsaTpob3ZlciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgYSB7CisgICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW4gOworICAgIH0KKyAgfQorfQorCisjdGhpcmQtbGV2ZWwtbWVudS1jb250YWluZXIgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogcm93OworfQorI3dvcmtpbmctYXJlYSB7CisgIHdpZHRoOiAxMDAlOworfQorCisjbGVmdC1jb2x1bW4tbWVudSB7CisgIHdpZHRoOiAxMDBweDsKK30KKworLnRoaXJkLWx2bC1tZW51IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgbGVmdDogLTEwcHg7CisgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7CisgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7CisgIHBhZGRpbmctdG9wOiA0cHg7CisgIHBhZGRpbmctYm90dG9tOiA0cHg7CisgIHVsIHsKKyAgICBsaSB7CisgICAgICB1bCB7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgdG9wOiA1cHg7CisgICAgICAgIHdpZHRoOiBAdGhpcmQtbHZsLXdpZHRoOworICAgICAgfQorICAgIH0KKyAgfQorICBoMiB7CisgICAgdmlzaWJpbGl0eTogaGlkZGVuOworICB9Cit9CisudGhpcmQtbGV2ZWwtaXRlbTpsYXN0LWNoaWxkIHsKKyAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBtYWluLWNvbG9yLXRoZW1lOworfQorCisudGhpcmQtbGV2ZWwtaXRlbSB7CisgIG1pbi1oZWlnaHQ6IEB0aGlyZC1sdmwtaGVpZ2h0OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgcGFkZGluZy1yaWdodDogM3B4OworICBib3JkZXItdG9wOiBzb2xpZCAxcHggQG1haW4tY29sb3ItdGhlbWU7CisKKyAgYSwgYTp2aXNpdGVkIHsKKyAgICBkaXNwbGF5OiBmbGV4OworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgICAgd2lkdGg6IDEwMCU7CisgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrICFpbXBvcnRhbnQ7CisgICAgbWluLWhlaWdodDogQHRoaXJkLWx2bC1oZWlnaHQ7CisgICAgbWF4LXdpZHRoOiBAdGhpcmQtbHZsLXdpZHRoOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgfQorfQorLnRoaXJkLWxldmVsLWl0ZW0uc2VsZWN0ZWQgeworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIGJvcmRlci1sZWZ0OiBzb2xpZCA5cHggQG1haW4tY29sb3ItdGhlbWU7CisgIGEsIGE6dmlzaXRlZCB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICAgIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICB9CisgIDphZnRlciB7CisgICAgY29udGVudDogJyc7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHRvcDogNXB4OworICAgIGxlZnQ6IDA7CisgICAgd2lkdGg6IDA7CisgICAgaGVpZ2h0OiAwOworICAgIGJvcmRlci10b3A6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CisgICAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgQG1haW4tY29sb3ItdGhlbWU7CisgICAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgfQorfQorCisudGhpcmQtbGV2ZWwtaXRlbSBhOmhvdmVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbiA7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKy8qIEVuZCAzcmQgbGV2ZWwgbWVudSAqLworCisvKiA9PT09PSBTeXN0ZW0gbWVzc2FnZXMgcmVuZGVyaW5nID09PT09ICovCisuZXZlbnRNZXNzYWdlLAorLmVycm9yTWVzc2FnZSB7CisgIGZvbnQtc2l6ZTogMS4zZW07CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBfbWFyZ2luOiA1cHggN3B4IDAgN3B4OworICBwYWRkaW5nOiAwIDFlbSAwIDUwcHg7Cit9CisuZXZlbnRNZXNzYWdlIHsKKyAgYmFja2dyb3VuZDogIzEwNWZhOCB1cmwoLi4vaW1hZ2VzL2luZm9ybWF0aW9uLnBuZykgbm8tcmVwZWF0IDVweCA1MCU7CisgIGNvbG9yOiAjRkZGRkZGOworICBib3JkZXI6IHNvbGlkIDNweCAjZjBmMGYwOworfQorLmVycm9yTWVzc2FnZSB7CisgIGJhY2tncm91bmQ6ICM4MjBmMDUgdXJsKC4uL2ltYWdlcy9leGNsYW1hdGlvbi5wbmcpIG5vLXJlcGVhdCA1cHggNTAlOworICBjb2xvcjogI2ZmZmZmZjsKKyAgYm9yZGVyOiBzb2xpZCAzcHggI2YwZjBmMDsKK30KKworLmNvbnRlbnQtbWVzc2FnZXMgcCB7CisgIG1hcmdpbjogMC41ZW0gMCAwLjVlbSAwOworfQorCisKKworLyogQmVnaW4gSG9tZSBNZW51Ki8KKy5maXhlZC1uYXYtYmFyIHsKKyAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7CisgIHdpZHRoOiAxMDAlOworfQorI25hdi1iYXItb2Zmc2V0IHsKKyAgaGVpZ2h0OiBAYXBwLWJhci1oZWlnaHQgOworfQorCisjaG9tZUdseXBoIHsKKyAgbWFyZ2luLWxlZnQ6IDIwcHg7CisgIGhlaWdodDogMjBweDsKK30KKworI2hvbWVQYWdlVGl0bGUgeworICBjb2xvcjogQHdoaXRlOworICBmb250LXNpemU6IDIwcHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBtYXJnaW4tcmlnaHQ6IDIwcHg7CisgIG1hcmdpbi1sZWZ0OiAyMHB4OworfQorLmhvbWUtbWVudS1saXN0IHsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKK30KKy5ocC1hcHBsaXN0IHsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgY29sb3IgOiBAd2hpdGU7CisgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CisgIC5hcHAtdGl0bGUgeworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgICBoZWlnaHQ6IEBob21lLW1lbnUtdGlsZS1oZWlnaHQ7CisgICAgcGFkZGluZzogNXB4IDEwcHggNXB4IDEwcHg7CisgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBibGFjazsKKyAgICBzcGFuIHsKKyAgICAgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZiAhaW1wb3J0YW50OworICAgICAgZm9udC1zaXplOiAxNXB4OworICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICB3aWR0aDogMTEwcHg7CisgICAgICBhIHsKKyAgICAgICAgZGlzcGxheTogZmxleDsKKyAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CisgICAgICAgIGNvbG9yIDogQHdoaXRlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC5ocC1tZW51LWl0ZW0geworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgbWFyZ2luLWxlZnQ6IDVweDsKKyAgICBtYXJnaW4tcmlnaHQ6IDVweDsKKyAgICBib3JkZXI6IHNvbGlkIDJweCBAZ3JleTsKKyAgICBib3JkZXItcmFkaXVzOiA4cHg7CisgICAgaGVpZ2h0OiBAaG9tZS1tZW51LXRpbGUtaGVpZ2h0IC0gNHB4OworICAgIG1pbi13aWR0aDogQGhvbWUtbWVudS10aWxlLW1pbi13aWR0aDsKKyAgICBtYXgtd2lkdGg6IEBob21lLW1lbnUtdGlsZS1tYXgtd2lkdGg7CisgICAgLm1lbnUtbGluayB7CisgICAgICBmb250LXNpemU6IDEwcHg7CisgICAgICBjb2xvcjogQGJsYWNrOworICAgICAgcGFkZGluZzogMTBweDsKKyAgICB9CisgICAgLnN0YXItbGluayB7CisgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICBoZWlnaHQ6IDI1cHg7CisgICAgICB0b3A6IDVweDsKKyAgICAgIHJpZ2h0OiA1cHg7CisgICAgfQorICB9CisKK30KKy5ocC1hcHBsaXN0IC5hcHAtdGl0bGUgc3BhbiBhOmhvdmVyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisuaHAtbWVudS1pdGVtLmZhdm9yaXRlSXRlbSB7CisgIGJvcmRlcjogc29saWQgMnB4IEBkYXJrLWNvbG9yLXRoZW1lOworfQorCisuaHAtbWVudS1pdGVtOmhvdmVyIHsKKyAgYm94LXNoYWRvdzogM3B4IDNweCAxMnB4IEBzaGFkb3ctY29sb3I7CisgIGEgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgfQorfQorCisvKiBFbmQgSG9tZSBNZW51ICovCisKKy8qIEJlZ2luIExvZ2luIHNjcmVlbmxldCAqLworI2xvZ2luQmFyIHsKKyAgcG9zaXRpb246IGZpeGVkOworICB0b3A6MDsKKyAgbGVmdDogMDsKKyAgd2lkdGg6IDEwMCU7CisgIGhlaWdodDogQGFwcC1iYXItaGVpZ2h0OworICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgc3BhbiB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNXB4OworICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDVweDsKKyAgICBmb250LXNpemU6IDI1cHg7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIHRvcDogQGFwcC1iYXItaGVpZ2h0IC0gMzJweDsKKyAgICBsZWZ0OiAxNXB4OworICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAxMHB4OworICB9CisgICNjb21wYW55LWxvZ28geworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgfQorfQorCisubG9naW4tc2NyZWVubGV0IHsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKKyAgbWluLXdpZHRoOiAzMDBweDsKKyAgbWF4LXdpZHRoOiA1MGVtOworICBib3JkZXItcmFkaXVzOiA4cHggIWltcG9ydGFudDsKKyAgbWFyZ2luLXRvcDogMTUlOworICBib3gtc2hhZG93OiAzcHggM3B4IDEycHggQHNoYWRvdy1jb2xvcjsKKyAgLnNjcmVlbmxldC10aXRsZS1iYXIgeworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgYWxpZ24tY29udGVudDogY2VudGVyOworICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOworICAgIG1hcmdpbjowOworICAgIHBhZGRpbmc6MDsKKyAgICBoM3sKKyAgICAgIHBhZGRpbmctdG9wOjJweDsKKyAgICAgIHBhZGRpbmctYm90dG9tOjJweDsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IEBkYXJrLWNvbG9yLXRoZW1lICFpbXBvcnRhbnQ7CisgICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7CisgICAgICBoZWlnaHQ6IDEwMCU7CisgICAgICB3aWR0aDoxMDAlOworICAgICAgdGV4dC1zaGFkb3c6IG5vbmU7CisgICAgICBmb250LXNpemU6IDI1cHg7CisgICAgfQorICB9CisgIC5zY3JlZW5sZXQtYm9keSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWUgIWltcG9ydGFudDsKKyAgICBmb3JtIHsKKyAgICAgIC5idXR0b24geworICAgICAgICB3aWR0aDogMTUwcHg7CisgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICAgICAgdGV4dC1zaGFkb3c6IG5vbmU7CisgICAgICAgIG1hcmdpbi10b3A6IDIwcHg7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgICAgICB9CisKKyAgICAgIHRhYmxlIHsKKyAgICAgICAgdHIgeworICAgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICAgIC5sYWJlbCB7CisgICAgICAgICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47CisgICAgICAgICAgICB3aWR0aDogMjUlOworICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4OworICAgICAgICAgIH0KKyAgICAgICAgICBpbnB1dCB7CisgICAgICAgICAgICB3aWR0aDogMTAwJTsKKyAgICAgICAgICB9CisgICAgICAgICAgLmJ1dHRvbnRleHQsCisgICAgICAgICAgW3R5cGU9InN1Ym1pdCJdIHsKKyAgICAgICAgICAgIHdpZHRoOiAxNTBweDsKKyAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAgICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgICAgICAgICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICAgICAgICAgIHRleHQtc2hhZG93OiBub25lOworICAgICAgICAgIH0KKyAgICAgICAgICBbbmFtZT0iR0VUX1BBU1NXT1JEX0hJTlQiXSB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICAgICAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKKyAgICAgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICAgIH0KKyAgICAgICAgICBbbmFtZT0iRU1BSUxfUEFTU1dPUkQiXSB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZm9udC1jb2xvci1mb3ItZGFyazsKKyAgICAgICAgICAgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgICAgICAgICAgIGJvcmRlcjogbm9uZTsKKyAgICAgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICAgIH0KKyAgICAgICAgICB0ZCB7CisgICAgICAgICAgICBwYWRkaW5nOiA1cHg7CisgICAgICAgICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47CisgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7CisgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgYSB7CisgICAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLW1haW47CisgICAgfQorICB9Cit9CisKKy5sb2dpbi1zY3JlZW5sZXQgLnNjcmVlbmxldC10aXRsZS1iYXIgeworICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKy8qIEVuZCBMb2dpbiBzY3JlZW5sZXQgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgQmVnaW4gU2NyZWVubGV0IHN0eWxlICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisuc2NyZWVubGV0LXRpdGxlLWJhciB7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZSA7CisgIGNvbG9yOiBAZGFyay1jb2xvci10aGVtZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXk7CisgIGhlaWdodDogMSU7IC8qIElFIGZpeCAqLworICBtaW4taGVpZ2h0OiAxLjVlbTsKKyAgcGFkZGluZzowLjhlbSAwLjJlbTsKK30KKworLnNjcmVlbmxldCB7CisgIGJvcmRlci1yYWRpdXM6IDVweDsKKyAgYm9yZGVyOiBzb2xpZCAxcHggQGdyZXk7CisgIGhlaWdodDogYXV0byAhaW1wb3J0YW50OworICBtYXJnaW4tYm90dG9tOiAxZW07CisgIG92ZXJmbG93OiBhdXRvOworfQorCisuc2NyZWVubGV0LWJvZHkgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOworICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsKKyAgaGVpZ2h0OiAxJTsKKyAgcGFkZGluZzogMC40ZW07Cit9CisKKy5zY3JlZW5sZXQtYm9keSBkaXYgeworICBtYXJnaW46IDAuOGVtIDAuMWVtCit9CisKKy8qIFNwZWNpYWwgU2NyZWVubGV0IHN0eWxlIGZvciBsb2NhbGUgYW5kIHRpbWV6b25lIHdpbmRvdyAqLworLmxpc3RzLnNjcmVlbmxldCB7CisgIG1hcmdpbi1sZWZ0OiAyNSU7CisgIG1hcmdpbi1yaWdodDogMjUlOworICBtYXJnaW4tdG9wOiAxZW07Cit9CisKKy5saXN0cy5zY3JlZW5sZXQgLmJhc2ljLXRhYmxlIHRyIHRkIHsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCisubGlzdHMuc2NyZWVubGV0IC5iYXNpYy10YWJsZSB0ciB0ZCBhIHsKKyAgZGlzcGxheTogYmxvY2s7Cit9CisKKy8qICAgICAgQWx0ZXJuYXRlIHRhYmxlIGhlYWRlciBzdHlsZSAgICAgICovCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCwKKy5iYXNpYy10YWJsZSAuaGVhZGVyLXJvdy0yIHRkIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGdyZXlkYXJrOworICBib3JkZXItYm90dG9tOiAwOworICBib3JkZXItbGVmdDogMC4xZW0gc29saWQgI2FhYTsKKyAgYm9yZGVyLXJpZ2h0OiAwLjFlbSBzb2xpZCAjODg4OworICBjb2xvcjogI2ZmZmZmZjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy8qIE5vIHBhZGRpbmcgc2NyZWVubGV0IGRlY29yYXRvciAqLworLm5vLXBhZGRpbmcgeworICBwYWRkaW5nOiAwOworICBib3JkZXI6IG5vbmU7Cit9CisKKy5uby1wYWRkaW5nIC5oMSwKKy5uby1wYWRkaW5nIC5oMiwKKy5uby1wYWRkaW5nIC5oMywKKy5uby1wYWRkaW5nciBoMSwKKy5uby1wYWRkaW5nIGgyLAorLm5vLXBhZGRpbmcgaDMgeworICBwYWRkaW5nOiAwLjdlbTsKK30KKworLnNjcmVlbmxldC10aXRsZS1iYXIgdWwgYTpob3ZlciB7CisgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZSAhaW1wb3J0YW50OworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIEVuZCBTY3JlZW5sZXQgc3R5bGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIFRhYmxlIFN0eWxlcyAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy5iYXNpYy10YWJsZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CisgIGNvbG9yOiAjMDAwMDAwOworICBtYXJnaW4tYm90dG9tOiAxZW07CisgIHdpZHRoOiAxMDAlOworfQorCitmb3JtIHRhYmxlLAorZm9ybSAuYmFzaWMtdGFibGUsCisuc2NyZWVubGV0LWJvZHkgLmJhc2ljLXRhYmxlIHsKKyAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CisgIG1hcmdpbi1ib3R0b206IDA7Cit9CisKKy5iYXNpYy10YWJsZSB0ciB0ZCB7CisgIC8qIFN0eWxlIGZvciBhbGwgY2VsbHMgKi8KKyAgcGFkZGluZzogMC44ZW0gMC4xZW07CisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKKy5iYXNpYy10YWJsZSB0ciAuYWxpZ24tYm90dG9tIHsKKyAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKK30KKworLmJhc2ljLXRhYmxlIHRyIC5hbGlnbi10b3AgeworICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCisuYmFzaWMtdGFibGUgdHIgLmxhYmVsLAorLmJhc2ljLXRhYmxlIHRyIC5ncm91cC1sYWJlbCB7CisgIC8qIGZpZWxkIGxhYmVscyBmb3IgZm9ybXMgKi8KKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIHRleHQtYWxpZ246IHJpZ2h0OworICBwYWRkaW5nLXJpZ2h0OiAxLjVlbTsKKyAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgd2lkdGg6IDElOworfQorCisuYmFzaWMtdGFibGUgdHIgLmdyb3VwLWxhYmVsIHsKKyAgLyogImhlYWRlciIgZm9yIGZpZWxkIGxhYmVsIGdyb3VwcyAqLworICBmb250LXNpemU6IDEuMmVtOworICBwYWRkaW5nOiAyZW0gMS41ZW0gMCAwOworfQorCisuYmFzaWMtdGFibGUgdHIgdGgsCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3cgeworICBmb250LXdlaWdodDogYm9sZDsKKyAgdGV4dC1hbGlnbjogbGVmdDsKK30KKworLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93IHRkIHsKKyAgYm9yZGVyLWJvdHRvbTogMC4xZW0gc29saWQgIzAwMDAwMDsKK30KKworLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93IHRkIGEgeworICBjb2xvcjogIzAwMDAwMDsKK30KKworLmJhc2ljLXRhYmxlIC5hbHRlcm5hdGUtcm93IHsKKyAgLyogQWx0ZXJuYXRpbmcgcm93IHN0eWxlICovCisgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7Cit9CisKKy5iYXNpYy10YWJsZSAuc2VsZWN0ZWQgeworICBiYWNrZ3JvdW5kOiAjRkZGQ0NGOworfQorCisuYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3dTZWxlY3RlZCB7CisgIGJhY2tncm91bmQ6ICNGRkY1NUY7Cit9CisKKy5iYXNpYy10YWJsZSAuVmFsaWRhdGUgeworICAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLworICBiYWNrZ3JvdW5kOiAjQTBENUY3OworfQorCisuYmFzaWMtdGFibGUgLmFsdGVybmF0ZS1yb3dWYWxpZGF0ZSB7CisgIC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovCisgIGJhY2tncm91bmQ6ICM3MkE4RjI7Cit9CisKKy5iYXNpYy10YWJsZSAuV2FybiB7CisgIC8qU3R5bGUgdXNlIGJ5IGFsdC1yb3ctc3R5bGUgb24gbGlzdCovCisgIGJhY2tncm91bmQ6ICNmNTVDNUM7Cit9CisKKy5iYXNpYy10YWJsZSAuYWx0ZXJuYXRlLXJvd1dhcm4geworICAvKlN0eWxlIHVzZSBieSBhbHQtcm93LXN0eWxlIG9uIGxpc3QqLworICBiYWNrZ3JvdW5kOiAjRkM3NDU1OworfQorCisuYmFzaWMtdGFibGUgdHIgLmJ1dHRvbi1jb2wgeworICAvKiBidXR0b24gY29sdW1uIHN0eWxlIC0gZm9yIHRoZSBzbWFsbAorICBjb2xsZWN0aW9uIG9mIGJ1dHRvbnMgdXNlZCBpbiBsaXN0cyAqLworICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworICBwYWRkaW5nOiAwLjNlbTsKK30KKy5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBhLAorLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGJ1dHRvbiwKKy5iYXNpYy10YWJsZSB0ciAuYnV0dG9uLWNvbCBpbnB1dFt0eXBlPSJyZXNldCJdLAorLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGlucHV0W3R5cGU9InN1Ym1pdCJdLAorLmJhc2ljLXRhYmxlIHRyIC5idXR0b24tY29sIGlucHV0W3R5cGU9ImJ1dHRvbiJdIHsKKyAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOworICAtbW96LWJvcmRlci1yYWRpdXM6IDFlbTsKKyAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxZW07CisgIGJvcmRlci1yYWRpdXM6IDJweDsKKyAgYm9yZGVyOiAwLjFlbSBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICBjdXJzb3I6IHBvaW50ZXI7CisgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgZGlzcGxheTppbmxpbmUtYmxvY2s7CisgIGZvbnQtc2l6ZTogMC45ZW07CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBvdXRsaW5lOiAwOworICBvdmVyZmxvdzogdmlzaWJsZTsKKyAgcGFkZGluZzogMC4xZW0gMC41ZW0gMC4yZW0gMC41ZW07CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgd2lkdGg6IGF1dG87CisKKyAgJjpob3ZlciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgY29sb3I6IEB3aGl0ZTsKKyAgfQorfQorCisuYmFzaWMtdGFibGUgLmNvbGxhcHNlZCB7CisgIHZpc2liaWxpdHk6IGNvbGxhcHNlOworfQorCisvKiAgICAgIFNvcnQgZmllbGQgc3R5bGUgICAgICAqLworLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGggLnNvcnQtb3JkZXItYXNjLAorLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGQgLnNvcnQtb3JkZXItYXNjeworICBiYWNrZ3JvdW5kOiB1cmwoL2ltYWdlcy9hcnJvdy1nci11cC5wbmcpIG5vLXJlcGVhdCByaWdodDsKKyAgcGFkZGluZy1sZWZ0OiAwLjVlbTsKKyAgcGFkZGluZy1yaWdodDogMjBweDsgLyogU2V0dGluZyBtdXN0IGJlIGluIHB4ICovCit9CisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0aCAuc29ydC1vcmRlci1kZXNjLAorLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGQgLnNvcnQtb3JkZXItZGVzY3sKKyAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYXJyb3ctZ3ItZHcucG5nKSBuby1yZXBlYXQgcmlnaHQ7CisgIHBhZGRpbmctbGVmdDogMC41ZW07CisgIHBhZGRpbmctcmlnaHQ6IDIwcHg7IC8qIFNldHRpbmcgbXVzdCBiZSBpbiBweCAqLworfQorLmJhc2ljLXRhYmxlIC5oZWFkZXItcm93LTIgdGggLnNvcnQtb3JkZXIsCisuYmFzaWMtdGFibGUgLmhlYWRlci1yb3ctMiB0ZCAuc29ydC1vcmRlcnsKKyAgYmFja2dyb3VuZDogdXJsKC9pbWFnZXMvYXJyb3ctZ3IucG5nKSBuby1yZXBlYXQgcmlnaHQ7CisgIHBhZGRpbmctbGVmdDogMC41ZW07CisgIHBhZGRpbmctcmlnaHQ6IDIwcHg7IC8qIFNldHRpbmcgbXVzdCBiZSBpbiBweCAqLworICBjb2xvcjojZmZmCit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIEJlZ2luIE1lc3NhZ2UgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLmNvdW50LW1lc3NhZ2UgeworICBkaXNwbGF5OiBmbGV4OworICBhbGlnbi1pdGVtczogY2VudGVyOworICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgbWluLWhlaWdodDoyMHB4OworICBtaW4td2lkdGg6IDIwcHg7CisgIG1heC1oZWlnaHQ6MjBweDsKKyAgbWF4LXdpZHRoOiAyMHB4OworICBiYWNrZ3JvdW5kOiBAd2hpdGU7CisgIGZvbnQtc2l6ZToxMnB4OworICBmb250LXdlaWdodDogYm9sZDsKKyAgYm9yZGVyLXJhZGl1czogNTAlOworfQorLmluZm8tbWVzc2FnZS10aXRsZSB7CisgIG1pbi13aWR0aDoxNTBweDsKKyAgbWFyZ2luOiA1cHg7CisgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsKKyAgZm9udC1zaXplOiAxNnB4OworICBmb250LXdlaWdodDogYm9sZDsKK30KKy5tZXNzYWdlLWxpc3QgeworICBwb3NpdGlvbjpyZWxhdGl2ZTsKKyAgbWFyZ2luLXRvcDogMTBweDsKKyAgYm94LXNoYWRvdzogMXB4IDNweCA1cHggQGdyZXlkYXJrOworICBib3JkZXItcmFkaXVzOiAwIDVweCA1cHggMDsKKyAgdHJhbnNpdGlvbjogaGVpZ2h0IDJzOworfQorLm1lc3NhZ2UtbGlzdC1tYWluIHsKKyAgcGFkZGluZzogNXB4IDE1cHggNXB4IDE1cHg7Cit9CisubWVzc2FnZS1saXN0LWFsZXJ0IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLWFsZXJ0OworICBib3JkZXItbGVmdCA6IHNvbGlkIDVweCBAY29sb3ItYWxlcnQtZGFyazsKKyAgLmNvdW50LW1lc3NhZ2UgeworICAgIGNvbG9yOiBAY29sb3ItYWxlcnQtZGFyazsKKyAgfQorfQorLm1lc3NhZ2UtbGlzdC1zdWNjZXNzIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLXN1Y2Nlc3M7CisgIGJvcmRlci1sZWZ0OiBzb2xpZCA1cHggQGNvbG9yLXN1Y2Nlc3MtZGFyazsKKyAgLmNvdW50LW1lc3NhZ2UgeworICAgIGNvbG9yOiBAY29sb3Itc3VjY2Vzcy1kYXJrOworICB9Cit9CisubWVzc2FnZS1saXN0LXRhYmxlLWNvbnRhaW5lciB7CisgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTsKKyAgYm9yZGVyLXJhZGl1czogNXB4OworICBvdmVyZmxvdzogaGlkZGVuOworICBoZWlnaHQ6IDA7Cit9CisuaW5mby1tZXNzYWdlLXN1Y2Nlc3MgeworICBkaXNwbGF5OiBub25lOworfQorLmluZm8tbWVzc2FnZS1hbGVydCB7CisgIGRpc3BsYXk6IG5vbmU7Cit9Cit0YWJsZS5tc2ctbGlzdCB7CisgIHdpZHRoOiAxMDAlOworICBmb250LXNpemU6IDE2cHg7CisgIGZvbnQtZmFtaWx5OiAiUXVpY2tzYW5kIiwgQXJpYWwsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJpZjsKKyAgcGFkZGluZzogMDsKKyAgdGhlYWQgeworICAgIGhlaWdodDogMTAwJTsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JleTsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgICB0cnsKKyAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IEBibGFjazsKKyAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IEBncmV5OworICAgICAgbGluZS1oZWlnaHQ6IDMwcHg7CisgICAgfQorICB9CisgIHRib2R5IHsKKyAgICB0ciB7CisgICAgICBsaW5lLWhlaWdodDogMjVweDsKKyAgICB9CisgICAgdHIubXNnLXJvdy1zdWNjZXNzIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yLXN1Y2Nlc3M7CisgICAgfQorICAgIHRyLm1zZy1yb3ctYWxlcnQgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3ItYWxlcnQ7CisgICAgfQorICB9CisgIHRkIHsKKyAgICBwYWRkaW5nLWxlZnQ6IDVweDsKKyAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgRW5kICBNZXNzYWdlIEluZm8gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICBQYWdpbmF0ZSBTdHlsZSAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLnBhZ2luYXRlLWJhci1ucmQgeworICBkaXNwbGF5OiBmbGV4OworICBmbGV4LWRpcmVjdGlvbjogcm93OworICBhbGlnbi1pdGVtczogY2VudGVyOworICBmb250LXNpemU6IDE1cHg7CisgIGJhY2tncm91bmQtY29sb3I6IEBncmV5OworICBwYWRkaW5nLWxlZnQ6IDEwcHg7CisgIHBhZGRpbmctdG9wOiAzcHg7CisgIHBhZGRpbmctYm90dG9tOiAzcHg7CisgIGJveC1zaGFkb3c6IDAgMnB4IDVweCBAc2hhZG93LWNvbG9yOworCisgIHVsLnBhZ2luYXRlLXBnLWxpc3QgeworICAgIGRpc3BsYXk6IGZsZXg7CisgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7CisgICAgY29sb3I6IEBtYWluLWNvbG9yLXRoZW1lOworICAgIG1hcmdpbi1yaWdodDogMTBweDsKKyAgICBib3JkZXItcmFkaXVzOiA4cHg7CisgICAgYm9yZGVyOiBzb2xpZCAxcHggQGJveC1ib3JkZXItY29sb3I7CisgICAgaGVpZ2h0OiAxOHB4OworICAgIGxpIHsKKyAgICAgIGRpc3BsYXk6IGZsZXg7CisgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICAgIG1pbi13aWR0aDogMTdweDsKKyAgICAgIGJvcmRlci1yaWdodDogc29saWQgMXB4IEBib3gtYm9yZGVyLWNvbG9yOworICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CisgICAgICBwYWRkaW5nLXJpZ2h0OiAycHg7CisgICAgICBoZWlnaHQ6MTAwJTsKKyAgICAgIGEgeworICAgICAgICBkaXNwbGF5OiBmbGV4OworICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKKyAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAgICAgICAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICAgICAgICBjb2xvcjogQGRhcmstY29sb3ItdGhlbWU7CisgICAgICAgIGhlaWdodDogMTAwJTsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICB9CisgICAgICAucGFnaW5hdGUtZGlzYWJsZSB7CisKKyAgICAgIH0KKyAgICB9CisgICAgbGkuc2VsZWN0ZWQgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG1haW4tY29sb3ItdGhlbWU7CisgICAgICBhIHsKKyAgICAgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworICAgICAgfQorICAgIH0KKyAgICBsaTpmaXJzdC1jaGlsZCwgbGk6bGFzdC1jaGlsZCB7CisgICAgICB3aWR0aDogMjBweDsKKyAgICB9CisgICAgbGk6Zmlyc3QtY2hpbGQgeworICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogM3B4OworICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4OworICAgIH0KKyAgICBsaTpsYXN0LWNoaWxkIHsKKyAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKKyAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7CisgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OworICAgIH0KKyAgfQorCit9CitzZWxlY3QucGFnaW5hdGUtc2VsZWN0IHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBiYWNrZ3JvdW5kOiBAd2hpdGU7CisgIGZvbnQtc2l6ZTogMTZweDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGJvcmRlcjogMXB4IHNvbGlkIEBib3gtYm9yZGVyLWNvbG9yOworICBvcHRpb24geworICAgIGRpc3BsYXk6IGZsZXg7CisgICAganVzdGlmeS1zZWxmOiBjZW50ZXI7CisgICAgZm9udC1zaXplOiAxNHB4OworICB9Cit9CisKKy5wYWdpbmF0ZS1zZWxlY3QtbGFiZWwgeworICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogMTZweDsKKyAgcGFkZGluZy1sZWZ0OiAxNXB4OworICBwYWRkaW5nLXJpZ2h0OiAxNXB4OworfQorCisucGFnaW5hdGUtaW5mb3JtYXRpb24geworICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogMTZweDsKKyAgcGFkZGluZy1sZWZ0OiAxNXB4OworICBwYWRkaW5nLXJpZ2h0OiAxNXB4OworfQorCit1bC5wYWdpbmF0ZS1wZy1saXN0IGxpOmhvdmVyeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgYSB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgfQorfQorCisvKiBFbmQgb2YgUGFnaW5hdGUgU3R5bGUgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgTGlzdCBOYXZpZ2F0aW9uIFN0eWxlICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLm5hdi1wYWdlciB7CisgIGJhY2tncm91bmQtY29sb3I6IEBncmV5ZGFyazsKKyAgY29sb3I6IEB3aGl0ZTsKKyAgZm9udC1mYW1pbHk6ICJRdWlja3NhbmQiLCBBcmlhbCwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDlweDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGxpbmUtaGVpZ2h0OiAzLjVlbTsKKyAgaGVpZ2h0OiAzLjVlbTsKKyAgbWFyZ2luOiAwLjVlbSAwIDAuNWVtIDA7CisgIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwOworfQorCisubmF2LXBhZ2VyIHVsIHsKKyAgZGlzcGxheTogaW5saW5lOyAvKiBJRSBGaXggKi8KK30KKworLm5hdi1wYWdlciB1bCBsaSB7CisgIGZsb2F0OmxlZnQ7CisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKKy5uYXYtcGFnZXIgdWwgbGkgYSB7CisgIGRpc3BsYXk6IGJsb2NrOworfQorCisubmF2LXBhZ2VyIHVsIGEgeworICBjb2xvcjogQHdoaXRlOworICBwYWRkaW5nOiAwIDFlbSAwIDFlbTsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisubmF2LXBhZ2VyIHVsIGE6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgY29sb3I6IEBmb250LWNvbG9yLWZvci1tYWluOworfQorCisubmF2LXBhZ2VyIHVsIC5uYXYtcGFnZXNpemUsCisubmF2LXBhZ2VyIHVsIC5uYXYtcGFnZS1zZWxlY3QsCisubmF2LXBhZ2VyIHVsIC5uYXYtZGlzcGxheWluZyB7CisgIHBhZGRpbmc6IDAgMWVtIDAgMWVtOworfQorCisubmF2LXBhZ2VyIHVsIC5uYXYtZmlyc3QtZGlzYWJsZWQsCisubmF2LXBhZ2VyIHVsIC5uYXYtcHJldmlvdXMtZGlzYWJsZWQsCisubmF2LXBhZ2VyIHVsIC5uYXYtbmV4dC1kaXNhYmxlZCwKKy5uYXYtcGFnZXIgdWwgLm5hdi1sYXN0LWRpc2FibGVkIHsKKyAgcGFkZGluZzogMCAxZW0gMCAxZW07Cit9CisKKy5uYXYtcGFnZXIgdWwgLm5hdi1maXJzdC1kaXNhYmxlZDpob3ZlciwKKy5uYXYtcGFnZXIgdWwgLm5hdi1wcmV2aW91cy1kaXNhYmxlZDpob3ZlciwKKy5uYXYtcGFnZXIgdWwgLm5hdi1uZXh0LWRpc2FibGVkOmhvdmVyLAorLm5hdi1wYWdlciB1bCAubmF2LWxhc3QtZGlzYWJsZWQ6aG92ZXIgeworICBjdXJzb3I6IG5vdC1hbGxvd2VkOworfQorCisKKy5uYXYtcGFnZXIgdWwgLm5hdi1kaXNwbGF5aW5nIHsKKyAgYm9yZGVyLXJpZ2h0OiBub25lOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICBNdWx0aS1Db2x1bW4gU3R5bGVzICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2NvbHVtbi1jb250YWluZXIgeworICBtYXJnaW46IGF1dG87CisgIHBhZGRpbmc6IDFlbTsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICBtaW4td2lkdGg6IEBtaW4tY29udGFpbmVyLXdpZHRoOworfQorCisjY29sdW1uLWNvbnRhaW5lciBoMSwKKyNjb2x1bW4tY29udGFpbmVyIC5oMSwKKyNjb2x1bW4tY29udGFpbmVyIGgyLAorI2NvbHVtbi1jb250YWluZXIgLmgyIHsKKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIGgxLAorI2NvbHVtbi1jb250YWluZXIgLmgxIHsKKyAgY29sb3I6ICM1NTc5OTY7Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5sZWZ0IHsKKyAgZmxvYXQ6IGxlZnQ7CisgIC8qIGFsdDogcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyAqLworICB3aWR0aDogMjJlbTsKKyAgbWFyZ2luLXJpZ2h0OiAxZW07Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5sZWZ0LWxhcmdlciB7CisgIGZsb2F0OiBsZWZ0OworICAvKiBhbHQ6IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwcHg7IGxlZnQ6IDBweDsgKi8KKyAgd2lkdGg6IDI1ZW07CisgIG1hcmdpbi1yaWdodDogMWVtOworfQorCisubGVmdGhhbGYgeworICBmbG9hdDogbGVmdDsKKyAgaGVpZ2h0OiAxJTsKKyAgbGVmdDogMDsKKyAgbWFyZ2luOiAwJSAxJSAxJSAwJTsKKyAgd2lkdGg6IDQ5JTsKK30KKworLnJpZ2h0aGFsZiB7CisgIGZsb2F0OiByaWdodDsKKyAgaGVpZ2h0OiAxJTsKKyAgbWFyZ2luOiAwIDAgMSUgMSU7CisgIHJpZ2h0OiAwOworICB3aWR0aDogNDklOworfQorCisjY29sdW1uLWNvbnRhaW5lciAucmlnaHQgeworICBmbG9hdDogcmlnaHQ7CisgIG1hcmdpbi1sZWZ0OiAxZW07CisgIHdpZHRoOiAyMmVtOworfQorCisjY29sdW1uLWNvbnRhaW5lciAubGVmdG9ubHkgeworICBtYXJnaW4tbGVmdDogMjNlbTsKKyAgd2lkdGg6IGF1dG87Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5sZWZ0b25seS1sYXJnZXIgeworICBtYXJnaW4tbGVmdDogMjZlbTsKKyAgd2lkdGg6IGF1dG87Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5yaWdodG9ubHkgeworICBtYXJnaW4tcmlnaHQ6IDIzZW07CisgIHdpZHRoOiBhdXRvOworfQorCisjY29sdW1uLWNvbnRhaW5lciAuY2VudGVyIHsKKyAgbWFyZ2luLWxlZnQ6IDIzZW07CisgIG1hcmdpbi1yaWdodDogMjNlbTsKKyAgd2lkdGg6IGF1dG87Cit9CisKKyNjb2x1bW4tY29udGFpbmVyIC5ub2NvbHVtbnMgeworICB3aWR0aDogYXV0bzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBCdXR0b24gU3R5bGUgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisuYnV0dG9uLWJhciBsaS5idXR0b250ZXh0IGEsCithLmJ1dHRvbnRleHQsCithLmJ1dHRvbnRleHRiaWcsCisuc21hbGxTdWJtaXQsCisuc21hbGxTdWJtaXQ6aG92ZXIsCisubWVkaXVtU3VibWl0LAorLmxhcmdlU3VibWl0LAorLmxvZ2luQnV0dG9uLAorLmJ1dHRvbi1zdHlsZS0xIGEsCisuYnV0dG9uLXN0eWxlLTEgdWwgYSwKKy5idXR0b24tc3R5bGUtMiB1bCBhLAorLmJ1dHRvbi1zdHlsZS0yIGEsCisuYnV0dG9uLAorYnV0dG9uLAoraW5wdXRbdHlwZT0icmVzZXQiXSwKK2lucHV0W3R5cGU9InN1Ym1pdCJdLAoraW5wdXRbdHlwZT0iYnV0dG9uIl0geworICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CisgIC1tb3otYm9yZGVyLXJhZGl1czogMS4xZW07CisgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMS4xZW07CisgIGJvcmRlci1yYWRpdXM6IDJweDsKKyAgYm9yZGVyOiAwLjFlbSBzb2xpZCBAbWFpbi1jb2xvci10aGVtZTsKKyAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlOworICBjdXJzb3I6IHBvaW50ZXI7CisgIGNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgZGlzcGxheTppbmxpbmUtYmxvY2s7CisgIGZvbnQtc2l6ZTogMWVtOworICBmb250LXdlaWdodDogYm9sZDsKKyAgb3V0bGluZTogMDsKKyAgb3ZlcmZsb3c6IHZpc2libGU7CisgIHBhZGRpbmc6IDAuNGVtIDFlbSAwLjRlbTsKKyAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CisgIC8qdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyovCisgIHdpZHRoOiBhdXRvOworCisgIC8qIElFNyAqLworICAqcGFkZGluZy10b3A6IDAuMmVtOworICAqcGFkZGluZy1ib3R0b206IDA7CisgICY6aG92ZXIgeworICAgIGNvbG9yOiBAZm9udC1jb2xvci1mb3ItbWFpbjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbWFpbi1jb2xvci10aGVtZTsKKyAgfQorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgRm9vdGVyIFN0eWxlICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2Zvb3RlciB7CisgIGJhY2tncm91bmQ6IEBkYXJrLWNvbG9yLXRoZW1lOworICBib3JkZXItdG9wOiAwLjFlbSBpbnNldCAjMDAwOworICBwYWRkaW5nOiAwLjVlbSAwIDAuNWVtIDAuNWVtOworCisgIGhlaWdodDogQGZvb3Rlci1oZWlnaHQ7CisgIHBvc2l0aW9uOiBmaXhlZDsKKyAgYm90dG9tOiAwOworICB3aWR0aDogMTAwJTsKKyAgZGlzcGxheTogZmxleDsKKyAgZmxleC1kaXJlY3Rpb246IHJvdzsKKyAgYWxpZ24taXRlbXM6IGNlbnRlcjsKKyAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOworICBmb250LWZhbWlseTogIlF1aWNrc2FuZCIsIEFyaWFsLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWYgIWltcG9ydGFudDsKKyAgei1pbmRleDogMTA7CisKKyAgc3BhbiB7CisgICAgY29sb3I6IEBmb250LWNvbG9yLWZvci1kYXJrOworICAgIHBhZGRpbmc6IDEwcHg7CisgIH0KKworICBhIHsKKyAgICBjb2xvcjogQGZvbnQtY29sb3ItZm9yLWRhcms7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgfQorfQorCisjZm9vdGVyIGE6Zm9jdXMgeworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworI2Zvb3Rlci1vZmZzZXQgeworICBoZWlnaHQ6IEBmb290ZXItaGVpZ2h0ICsgMTBweDsKKyAgd2lkdGg6IDEwMCU7Cit9CmRpZmYgLS1naXQgYS90b29scy9zZWN1cml0eS9kZXBlbmRlbmN5LWNoZWNrL1JFQURNRS5tZCBiL3Rvb2xzL3NlY3VyaXR5L2RlcGVuZGVuY3ktY2hlY2svUkVBRE1FLm1kCmluZGV4IGY5Y2E2MzAuLjJjMzdkOTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3NlY3VyaXR5L2RlcGVuZGVuY3ktY2hlY2svUkVBRE1FLm1kCisrKyBiL3Rvb2xzL3NlY3VyaXR5L2RlcGVuZGVuY3ktY2hlY2svUkVBRE1FLm1kCkBAIC0xLDI0ICsxLDI0IEBACi1EZXBlbmRlbmN5LUNoZWNrIENvbW1hbmQgTGluZQ0KLT09PT09PT09PT09PT09PT0NCi1EZXBlbmRlbmN5LUNoZWNrIENvbW1hbmQgTGluZSBjYW4gYmUgdXNlZCB0byBjaGVjayBwcm9qZWN0IGRlcGVuZGVuY2llcyBmb3IgcHVibGlzaGVkIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gVGhlIGNoZWNrcw0KLXBlcmZvcm1lZCBhcmUgYSAiYmVzdCBlZmZvcnQiIGFuZCBhcyBzdWNoLCB0aGVyZSBjb3VsZCBiZSBmYWxzZSBwb3NpdGl2ZXMgYXMgd2VsbCBhcyBmYWxzZSBuZWdhdGl2ZXMuIEhvd2V2ZXIsDQotdnVsbmVyYWJpbGl0aWVzIGluIDNyZCBwYXJ0eSBjb21wb25lbnRzIGlzIGEgd2VsbC1rbm93biBwcm9ibGVtIGFuZCBpcyBjdXJyZW50bHkgZG9jdW1lbnRlZCBpbiB0aGUgMjAxMyBPV0FTUA0KLVRvcCAxMCBhcyBbQTkgLSBVc2luZyBDb21wb25lbnRzIHdpdGggS25vd24gVnVsbmVyYWJpbGl0aWVzXShodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1RvcF8xMF8yMDEzLUE5LVVzaW5nX0NvbXBvbmVudHNfd2l0aF9Lbm93bl9WdWxuZXJhYmlsaXRpZXMpLg0KLQ0KLURvY3VtZW50YXRpb24gYW5kIGxpbmtzIHRvIHByb2R1Y3Rpb24gYmluYXJ5IHJlbGVhc2VzIGNhbiBiZSBmb3VuZCBvbiB0aGUgW2dpdGh1YiBwYWdlc10oaHR0cDovL2plcmVteWxvbmcuZ2l0aHViLmlvL0RlcGVuZGVuY3lDaGVjay9kZXBlbmRlbmN5LWNoZWNrLWNsaS9pbnN0YWxsYXRpb24uaHRtbCkuDQotDQotTWFpbGluZyBMaXN0DQotLS0tLS0tLS0tLS0tDQotDQotU3Vic2NyaWJlOiBbZGVwZW5kZW5jeS1jaGVjaytzdWJzY3JpYmVAZ29vZ2xlZ3JvdXBzLmNvbV0obWFpbHRvOmRlcGVuZGVuY3ktY2hlY2src3Vic2NyaWJlQGdvb2dsZWdyb3Vwcy5jb20pDQotDQotUG9zdDogW2RlcGVuZGVuY3ktY2hlY2tAZ29vZ2xlZ3JvdXBzLmNvbV0obWFpbHRvOmRlcGVuZGVuY3ktY2hlY2tAZ29vZ2xlZ3JvdXBzLmNvbSkNCi0NCi1Db3B5cmlnaHQgJiBMaWNlbnNlDQotLS0tLS0tLS0tLS0tDQotDQotRGVwZW5kZW5jeS1DaGVjayBpcyBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBKZXJlbXkgTG9uZy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0NCi1QZXJtaXNzaW9uIHRvIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIGlzIGdyYW50ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UuIFNlZSB0aGUgW0xJQ0VOU0UudHh0XShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vamVyZW15bG9uZy9EZXBlbmRlbmN5Q2hlY2svbWFzdGVyL0xJQ0VOU0UudHh0KSBmaWxlIGZvciB0aGUgZnVsbCBsaWNlbnNlLg0KLQ0KLURlcGVuZGVuY3ktQ2hlY2sgQ29tbWFuZCBMaW5lIG1ha2VzIHVzZSBvZiBvdGhlciBvcGVuIHNvdXJjZSBsaWJyYXJpZXMuIFBsZWFzZSBzZWUgdGhlIFtOT1RJQ0UudHh0XShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vamVyZW15bG9uZy9EZXBlbmRlbmN5Q2hlY2svbWFzdGVyL2RlcGVuZGVuY3ktY2hlY2stY2xpL05PVElDRS50eHQpIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uDQorRGVwZW5kZW5jeS1DaGVjayBDb21tYW5kIExpbmUKKz09PT09PT09PT09PT09PT0KK0RlcGVuZGVuY3ktQ2hlY2sgQ29tbWFuZCBMaW5lIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHByb2plY3QgZGVwZW5kZW5jaWVzIGZvciBwdWJsaXNoZWQgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLiBUaGUgY2hlY2tzCitwZXJmb3JtZWQgYXJlIGEgImJlc3QgZWZmb3J0IiBhbmQgYXMgc3VjaCwgdGhlcmUgY291bGQgYmUgZmFsc2UgcG9zaXRpdmVzIGFzIHdlbGwgYXMgZmFsc2UgbmVnYXRpdmVzLiBIb3dldmVyLAordnVsbmVyYWJpbGl0aWVzIGluIDNyZCBwYXJ0eSBjb21wb25lbnRzIGlzIGEgd2VsbC1rbm93biBwcm9ibGVtIGFuZCBpcyBjdXJyZW50bHkgZG9jdW1lbnRlZCBpbiB0aGUgMjAxMyBPV0FTUAorVG9wIDEwIGFzIFtBOSAtIFVzaW5nIENvbXBvbmVudHMgd2l0aCBLbm93biBWdWxuZXJhYmlsaXRpZXNdKGh0dHBzOi8vd3d3Lm93YXNwLm9yZy9pbmRleC5waHAvVG9wXzEwXzIwMTMtQTktVXNpbmdfQ29tcG9uZW50c193aXRoX0tub3duX1Z1bG5lcmFiaWxpdGllcykuCisKK0RvY3VtZW50YXRpb24gYW5kIGxpbmtzIHRvIHByb2R1Y3Rpb24gYmluYXJ5IHJlbGVhc2VzIGNhbiBiZSBmb3VuZCBvbiB0aGUgW2dpdGh1YiBwYWdlc10oaHR0cDovL2plcmVteWxvbmcuZ2l0aHViLmlvL0RlcGVuZGVuY3lDaGVjay9kZXBlbmRlbmN5LWNoZWNrLWNsaS9pbnN0YWxsYXRpb24uaHRtbCkuCisKK01haWxpbmcgTGlzdAorLS0tLS0tLS0tLS0tCisKK1N1YnNjcmliZTogW2RlcGVuZGVuY3ktY2hlY2src3Vic2NyaWJlQGdvb2dsZWdyb3Vwcy5jb21dKG1haWx0bzpkZXBlbmRlbmN5LWNoZWNrK3N1YnNjcmliZUBnb29nbGVncm91cHMuY29tKQorCitQb3N0OiBbZGVwZW5kZW5jeS1jaGVja0Bnb29nbGVncm91cHMuY29tXShtYWlsdG86ZGVwZW5kZW5jeS1jaGVja0Bnb29nbGVncm91cHMuY29tKQorCitDb3B5cmlnaHQgJiBMaWNlbnNlCistLS0tLS0tLS0tLS0KKworRGVwZW5kZW5jeS1DaGVjayBpcyBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBKZXJlbXkgTG9uZy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworUGVybWlzc2lvbiB0byBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSBpcyBncmFudGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlLiBTZWUgdGhlIFtMSUNFTlNFLnR4dF0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2plcmVteWxvbmcvRGVwZW5kZW5jeUNoZWNrL21hc3Rlci9MSUNFTlNFLnR4dCkgZmlsZSBmb3IgdGhlIGZ1bGwgbGljZW5zZS4KKworRGVwZW5kZW5jeS1DaGVjayBDb21tYW5kIExpbmUgbWFrZXMgdXNlIG9mIG90aGVyIG9wZW4gc291cmNlIGxpYnJhcmllcy4gUGxlYXNlIHNlZSB0aGUgW05PVElDRS50eHRdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qZXJlbXlsb25nL0RlcGVuZGVuY3lDaGVjay9tYXN0ZXIvZGVwZW5kZW5jeS1jaGVjay1jbGkvTk9USUNFLnR4dCkgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4K